@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
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import {
|
|
2
|
+
validateImportTurn
|
|
3
|
+
} from "./chunk-PU44GBL4.js";
|
|
4
|
+
|
|
5
|
+
// src/bulk-import/registry.ts
|
|
6
|
+
var adapters = /* @__PURE__ */ new Map();
|
|
7
|
+
function registerBulkImportSource(adapter) {
|
|
8
|
+
if (!adapter || typeof adapter !== "object") {
|
|
9
|
+
throw new Error("bulk-import adapter must be an object");
|
|
10
|
+
}
|
|
11
|
+
if (!adapter.name || typeof adapter.name !== "string" || adapter.name.trim().length === 0) {
|
|
12
|
+
throw new Error("bulk-import adapter name must be a non-empty string");
|
|
13
|
+
}
|
|
14
|
+
if (typeof adapter.parse !== "function") {
|
|
15
|
+
throw new Error(
|
|
16
|
+
`bulk-import adapter '${adapter.name}' must have a parse function`
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
const key = adapter.name.trim();
|
|
20
|
+
if (adapters.has(key)) {
|
|
21
|
+
throw new Error(
|
|
22
|
+
`bulk-import source adapter '${key}' is already registered`
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
const normalized = adapter.name === key ? adapter : { ...adapter, name: key };
|
|
26
|
+
adapters.set(key, normalized);
|
|
27
|
+
}
|
|
28
|
+
function getBulkImportSource(name) {
|
|
29
|
+
if (typeof name !== "string") return void 0;
|
|
30
|
+
const key = name.trim();
|
|
31
|
+
if (key.length === 0) return void 0;
|
|
32
|
+
return adapters.get(key);
|
|
33
|
+
}
|
|
34
|
+
function listBulkImportSources() {
|
|
35
|
+
return [...adapters.keys()];
|
|
36
|
+
}
|
|
37
|
+
function clearBulkImportSources() {
|
|
38
|
+
adapters.clear();
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// src/bulk-import/pipeline.ts
|
|
42
|
+
var DEFAULT_BATCH_SIZE = 20;
|
|
43
|
+
var MIN_BATCH_SIZE = 1;
|
|
44
|
+
var MAX_BATCH_SIZE = 1e3;
|
|
45
|
+
function validateBatchSize(value) {
|
|
46
|
+
if (value === void 0) return DEFAULT_BATCH_SIZE;
|
|
47
|
+
if (typeof value !== "number" || !Number.isFinite(value)) {
|
|
48
|
+
throw new Error(
|
|
49
|
+
`batchSize must be a finite number, received ${String(value)}`
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
if (!Number.isInteger(value)) {
|
|
53
|
+
throw new Error(
|
|
54
|
+
`batchSize must be an integer, received ${value}`
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
if (value < MIN_BATCH_SIZE || value > MAX_BATCH_SIZE) {
|
|
58
|
+
throw new Error(
|
|
59
|
+
`batchSize must be between ${MIN_BATCH_SIZE} and ${MAX_BATCH_SIZE}, received ${value}`
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
return value;
|
|
63
|
+
}
|
|
64
|
+
function resolveBulkImportContext(options) {
|
|
65
|
+
if (options.dedup !== void 0 && typeof options.dedup !== "boolean") {
|
|
66
|
+
throw new Error(
|
|
67
|
+
`dedup must be a boolean when provided, received ${String(options.dedup)}`
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
if (options.trustLevel !== void 0 && options.trustLevel !== "import") {
|
|
71
|
+
throw new Error(
|
|
72
|
+
`trustLevel must be 'import' when provided, received ${String(options.trustLevel)}`
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
if (options.namespace !== void 0) {
|
|
76
|
+
if (typeof options.namespace !== "string" || options.namespace.trim().length === 0) {
|
|
77
|
+
throw new Error(
|
|
78
|
+
`namespace must be a non-empty string when provided, received ${String(options.namespace)}`
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
dedup: options.dedup !== false,
|
|
84
|
+
trustLevel: options.trustLevel ?? "import",
|
|
85
|
+
...options.namespace !== void 0 ? { namespace: options.namespace } : {}
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
function formatBatchTranscript(turns) {
|
|
89
|
+
return turns.map((t) => {
|
|
90
|
+
const prefix = t.participantName ?? t.participantId ?? t.role;
|
|
91
|
+
return `[${t.timestamp}] ${prefix}: ${t.content}`;
|
|
92
|
+
}).join("\n");
|
|
93
|
+
}
|
|
94
|
+
async function runBulkImportPipeline(source, options = {}, processBatch) {
|
|
95
|
+
const batchSize = validateBatchSize(options.batchSize);
|
|
96
|
+
const dryRun = options.dryRun === true;
|
|
97
|
+
const batchContext = resolveBulkImportContext(options);
|
|
98
|
+
const result = {
|
|
99
|
+
memoriesCreated: 0,
|
|
100
|
+
duplicatesSkipped: 0,
|
|
101
|
+
entitiesCreated: 0,
|
|
102
|
+
turnsProcessed: 0,
|
|
103
|
+
batchesProcessed: 0,
|
|
104
|
+
errors: []
|
|
105
|
+
};
|
|
106
|
+
const turns = source.turns;
|
|
107
|
+
if (!turns || turns.length === 0) {
|
|
108
|
+
return result;
|
|
109
|
+
}
|
|
110
|
+
const validTurns = [];
|
|
111
|
+
for (let i = 0; i < turns.length; i += 1) {
|
|
112
|
+
const issues = validateImportTurn(turns[i], i);
|
|
113
|
+
if (issues.length > 0) {
|
|
114
|
+
const error = {
|
|
115
|
+
batchIndex: -1,
|
|
116
|
+
message: issues.map((iss) => iss.message).join("; ")
|
|
117
|
+
};
|
|
118
|
+
result.errors.push(error);
|
|
119
|
+
} else {
|
|
120
|
+
validTurns.push(turns[i]);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (dryRun) {
|
|
124
|
+
result.turnsProcessed = validTurns.length;
|
|
125
|
+
result.batchesProcessed = validTurns.length > 0 ? Math.ceil(validTurns.length / batchSize) : 0;
|
|
126
|
+
return result;
|
|
127
|
+
}
|
|
128
|
+
let batchIndex = 0;
|
|
129
|
+
for (let i = 0; i < validTurns.length; i += batchSize) {
|
|
130
|
+
const batch = validTurns.slice(i, i + batchSize);
|
|
131
|
+
try {
|
|
132
|
+
const batchResult = await processBatch(batch, batchContext);
|
|
133
|
+
result.memoriesCreated += batchResult.memoriesCreated;
|
|
134
|
+
result.duplicatesSkipped += batchResult.duplicatesSkipped;
|
|
135
|
+
if (typeof batchResult.entitiesCreated === "number") {
|
|
136
|
+
result.entitiesCreated += batchResult.entitiesCreated;
|
|
137
|
+
}
|
|
138
|
+
} catch (err) {
|
|
139
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
140
|
+
result.errors.push({ batchIndex, message });
|
|
141
|
+
}
|
|
142
|
+
result.turnsProcessed += batch.length;
|
|
143
|
+
result.batchesProcessed += 1;
|
|
144
|
+
batchIndex += 1;
|
|
145
|
+
}
|
|
146
|
+
return result;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export {
|
|
150
|
+
registerBulkImportSource,
|
|
151
|
+
getBulkImportSource,
|
|
152
|
+
listBulkImportSources,
|
|
153
|
+
clearBulkImportSources,
|
|
154
|
+
validateBatchSize,
|
|
155
|
+
resolveBulkImportContext,
|
|
156
|
+
formatBatchTranscript,
|
|
157
|
+
runBulkImportPipeline
|
|
158
|
+
};
|
|
159
|
+
//# sourceMappingURL=chunk-H2NCNXMS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/bulk-import/registry.ts","../src/bulk-import/pipeline.ts"],"sourcesContent":["// ---------------------------------------------------------------------------\n// Bulk-import source adapter registry\n// ---------------------------------------------------------------------------\n\nimport type { BulkImportSourceAdapter } from \"./types.js\";\n\nconst adapters = new Map<string, BulkImportSourceAdapter>();\n\n/**\n * Register a source adapter. Rejects duplicate names and empty names.\n */\nexport function registerBulkImportSource(\n adapter: BulkImportSourceAdapter,\n): void {\n if (!adapter || typeof adapter !== \"object\") {\n throw new Error(\"bulk-import adapter must be an object\");\n }\n if (\n !adapter.name ||\n typeof adapter.name !== \"string\" ||\n adapter.name.trim().length === 0\n ) {\n throw new Error(\"bulk-import adapter name must be a non-empty string\");\n }\n if (typeof adapter.parse !== \"function\") {\n throw new Error(\n `bulk-import adapter '${adapter.name}' must have a parse function`,\n );\n }\n const key = adapter.name.trim();\n if (adapters.has(key)) {\n throw new Error(\n `bulk-import source adapter '${key}' is already registered`,\n );\n }\n // Store adapter with trimmed name so `adapter.name` stays consistent with\n // the registry key returned by `listBulkImportSources()`.\n const normalized: BulkImportSourceAdapter =\n adapter.name === key ? adapter : { ...adapter, name: key };\n adapters.set(key, normalized);\n}\n\n/**\n * Retrieve a registered adapter by name.\n *\n * Names are trimmed on write (see `registerBulkImportSource`), so we\n * also trim on read to avoid the asymmetric-lookup footgun where a\n * whitespace-padded lookup would never find a registered adapter.\n * Non-string or empty-after-trim inputs return undefined.\n */\nexport function getBulkImportSource(\n name: string,\n): BulkImportSourceAdapter | undefined {\n if (typeof name !== \"string\") return undefined;\n const key = name.trim();\n if (key.length === 0) return undefined;\n return adapters.get(key);\n}\n\n/**\n * List all registered adapter names.\n */\nexport function listBulkImportSources(): string[] {\n return [...adapters.keys()];\n}\n\n/**\n * Clear all registered adapters (for testing).\n */\nexport function clearBulkImportSources(): void {\n adapters.clear();\n}\n","// ---------------------------------------------------------------------------\n// Bulk-import batch processing pipeline\n// ---------------------------------------------------------------------------\n\nimport {\n validateImportTurn,\n type BulkImportError,\n type BulkImportOptions,\n type BulkImportResult,\n type BulkImportSource,\n type ImportTurn,\n} from \"./types.js\";\n\nconst DEFAULT_BATCH_SIZE = 20;\nconst MIN_BATCH_SIZE = 1;\nconst MAX_BATCH_SIZE = 1000;\n\nexport interface ProcessBatchResult {\n memoriesCreated: number;\n duplicatesSkipped: number;\n /**\n * Number of entities created by the batch. Optional so Phase-1 stubs that\n * only count memories can omit it; when absent it is treated as 0.\n */\n entitiesCreated?: number;\n}\n\nexport interface ProcessBatchContext {\n dedup: boolean;\n trustLevel: \"import\";\n namespace?: string;\n}\n\nexport type ProcessBatchFn = (\n turns: ImportTurn[],\n context: ProcessBatchContext,\n) => Promise<ProcessBatchResult>;\n\nexport function validateBatchSize(value: number | undefined): number {\n if (value === undefined) return DEFAULT_BATCH_SIZE;\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new Error(\n `batchSize must be a finite number, received ${String(value)}`,\n );\n }\n if (!Number.isInteger(value)) {\n throw new Error(\n `batchSize must be an integer, received ${value}`,\n );\n }\n if (value < MIN_BATCH_SIZE || value > MAX_BATCH_SIZE) {\n throw new Error(\n `batchSize must be between ${MIN_BATCH_SIZE} and ${MAX_BATCH_SIZE}, received ${value}`,\n );\n }\n return value;\n}\n\nexport function resolveBulkImportContext(\n options: BulkImportOptions,\n): ProcessBatchContext {\n if (options.dedup !== undefined && typeof options.dedup !== \"boolean\") {\n throw new Error(\n `dedup must be a boolean when provided, received ${String(options.dedup)}`,\n );\n }\n if (options.trustLevel !== undefined && options.trustLevel !== \"import\") {\n throw new Error(\n `trustLevel must be 'import' when provided, received ${String(options.trustLevel)}`,\n );\n }\n if (options.namespace !== undefined) {\n if (typeof options.namespace !== \"string\" || options.namespace.trim().length === 0) {\n throw new Error(\n `namespace must be a non-empty string when provided, received ${String(options.namespace)}`,\n );\n }\n }\n\n return {\n dedup: options.dedup !== false,\n trustLevel: options.trustLevel ?? \"import\",\n ...(options.namespace !== undefined\n ? { namespace: options.namespace }\n : {}),\n };\n}\n\n/**\n * Format a batch of turns into a conversation transcript string.\n */\nexport function formatBatchTranscript(turns: ImportTurn[]): string {\n return turns\n .map((t) => {\n const prefix =\n t.participantName ?? t.participantId ?? t.role;\n return `[${t.timestamp}] ${prefix}: ${t.content}`;\n })\n .join(\"\\n\");\n}\n\n/**\n * Run the bulk-import pipeline over a parsed source.\n *\n * Splits turns into batches and delegates each to `processBatch`.\n * In dryRun mode, validates and counts without calling `processBatch`.\n */\nexport async function runBulkImportPipeline(\n source: BulkImportSource,\n options: BulkImportOptions = {},\n processBatch: ProcessBatchFn,\n): Promise<BulkImportResult> {\n const batchSize = validateBatchSize(options.batchSize);\n const dryRun = options.dryRun === true;\n const batchContext = resolveBulkImportContext(options);\n\n const result: BulkImportResult = {\n memoriesCreated: 0,\n duplicatesSkipped: 0,\n entitiesCreated: 0,\n turnsProcessed: 0,\n batchesProcessed: 0,\n errors: [],\n };\n\n const turns = source.turns;\n\n if (!turns || turns.length === 0) {\n return result;\n }\n\n // Validate all turns upfront; collect validation errors\n const validTurns: ImportTurn[] = [];\n for (let i = 0; i < turns.length; i += 1) {\n const issues = validateImportTurn(turns[i], i);\n if (issues.length > 0) {\n const error: BulkImportError = {\n batchIndex: -1,\n message: issues.map((iss) => iss.message).join(\"; \"),\n };\n result.errors.push(error);\n } else {\n validTurns.push(turns[i]);\n }\n }\n\n if (dryRun) {\n result.turnsProcessed = validTurns.length;\n result.batchesProcessed =\n validTurns.length > 0\n ? Math.ceil(validTurns.length / batchSize)\n : 0;\n return result;\n }\n\n // Process in batches\n let batchIndex = 0;\n for (let i = 0; i < validTurns.length; i += batchSize) {\n const batch = validTurns.slice(i, i + batchSize);\n try {\n const batchResult = await processBatch(batch, batchContext);\n result.memoriesCreated += batchResult.memoriesCreated;\n result.duplicatesSkipped += batchResult.duplicatesSkipped;\n if (typeof batchResult.entitiesCreated === \"number\") {\n result.entitiesCreated += batchResult.entitiesCreated;\n }\n } catch (err: unknown) {\n const message =\n err instanceof Error ? err.message : String(err);\n result.errors.push({ batchIndex, message });\n }\n result.turnsProcessed += batch.length;\n result.batchesProcessed += 1;\n batchIndex += 1;\n }\n\n return result;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -39,7 +39,13 @@ function isDisagreementPrompt(text) {
|
|
|
39
39
|
}
|
|
40
40
|
function scanSignals(text, customPatterns = []) {
|
|
41
41
|
const matched = [];
|
|
42
|
-
const customRegexes =
|
|
42
|
+
const customRegexes = [];
|
|
43
|
+
for (const pattern of customPatterns) {
|
|
44
|
+
try {
|
|
45
|
+
customRegexes.push(new RegExp(pattern, "i"));
|
|
46
|
+
} catch {
|
|
47
|
+
}
|
|
48
|
+
}
|
|
43
49
|
for (const rx of customRegexes) {
|
|
44
50
|
if (rx.test(text)) {
|
|
45
51
|
matched.push(`custom:${rx.source}`);
|
|
@@ -72,4 +78,4 @@ export {
|
|
|
72
78
|
isDisagreementPrompt,
|
|
73
79
|
scanSignals
|
|
74
80
|
};
|
|
75
|
-
//# sourceMappingURL=chunk-
|
|
81
|
+
//# sourceMappingURL=chunk-H3FZVNRN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/signal.ts"],"sourcesContent":["import type { SignalLevel, SignalScanResult } from \"./types.js\";\n\nconst BUILTIN_HIGH_PATTERNS: RegExp[] = [\n /\\bactually,?\\s+(i|my|we)\\b/i,\n /\\bno,?\\s+(i|my|we|that'?s)\\s+(not|wrong|incorrect)\\b/i,\n /\\bthat'?s\\s+not\\s+right\\b/i,\n /\\bwhy\\s+did\\s+you\\s+say\\s+that\\b/i,\n /\\bi\\s+(?:always|never|prefer|hate|love|want|need)\\b/i,\n /\\bdon'?t\\s+(?:use|do|call|say|make)\\b/i,\n /\\bplease\\s+(?:always|never|remember|note)\\b/i,\n /\\bcorrection:?\\b/i,\n /\\bimportant:?\\s+/i,\n /\\bfyi:?\\b/i,\n /\\bfor\\s+(?:the\\s+)?record\\b/i,\n /\\bmy\\s+(?:name|email|company|role|title|preference)\\s+is\\b/i,\n /\\bi\\s+(?:work|live|am)\\s+(?:at|in|from|a)\\b/i,\n /\\bwe\\s+(?:decided|agreed|chose|picked)\\b/i,\n /\\bthe\\s+decision\\s+(?:is|was)\\b/i,\n /\\bgoing\\s+forward\\b/i,\n /\\bfrom\\s+now\\s+on\\b/i,\n];\n\nconst MEDIUM_PATTERNS: RegExp[] = [\n /\\bi\\s+(?:think|believe|feel)\\b/i,\n /\\busually\\b/i,\n /\\btypically\\b/i,\n /\\bi\\s+(?:like|dislike)\\b/i,\n /\\bmy\\s+(?:team|project|stack|setup)\\b/i,\n];\n\nconst DISAGREEMENT_PATTERNS: RegExp[] = [\n /\\bthat'?s\\s+not\\s+right\\b/i,\n /\\bwhy\\s+did\\s+you\\s+say\\s+that\\b/i,\n /\\bthat'?s\\s+wrong\\b/i,\n /\\bnot\\s+correct\\b/i,\n];\n\nexport function isDisagreementPrompt(text: string): boolean {\n for (const rx of DISAGREEMENT_PATTERNS) {\n if (rx.test(text)) return true;\n }\n return false;\n}\n\nexport function scanSignals(\n text: string,\n customPatterns: string[] = [],\n): SignalScanResult {\n const matched: string[] = [];\n\n const customRegexes: RegExp[] = [];\n for (const pattern of customPatterns) {\n try {\n customRegexes.push(new RegExp(pattern, \"i\"));\n } catch {\n // Invalid custom patterns should not make the scan path fail closed.\n }\n }\n\n for (const rx of customRegexes) {\n if (rx.test(text)) {\n matched.push(`custom:${rx.source}`);\n }\n }\n\n for (const rx of BUILTIN_HIGH_PATTERNS) {\n if (rx.test(text)) {\n matched.push(`high:${rx.source}`);\n }\n }\n\n if (matched.length > 0) {\n return { level: \"high\", patterns: matched };\n }\n\n const mediumMatched: string[] = [];\n for (const rx of MEDIUM_PATTERNS) {\n if (rx.test(text)) {\n mediumMatched.push(`medium:${rx.source}`);\n }\n }\n\n if (mediumMatched.length >= 2) {\n return { level: \"medium\", patterns: mediumMatched };\n }\n if (mediumMatched.length === 1) {\n return { level: \"low\", patterns: mediumMatched };\n }\n\n return { level: \"none\", patterns: [] };\n}\n"],"mappings":";AAEA,IAAM,wBAAkC;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,kBAA4B;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,wBAAkC;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,qBAAqB,MAAuB;AAC1D,aAAW,MAAM,uBAAuB;AACtC,QAAI,GAAG,KAAK,IAAI,EAAG,QAAO;AAAA,EAC5B;AACA,SAAO;AACT;AAEO,SAAS,YACd,MACA,iBAA2B,CAAC,GACV;AAClB,QAAM,UAAoB,CAAC;AAE3B,QAAM,gBAA0B,CAAC;AACjC,aAAW,WAAW,gBAAgB;AACpC,QAAI;AACF,oBAAc,KAAK,IAAI,OAAO,SAAS,GAAG,CAAC;AAAA,IAC7C,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,aAAW,MAAM,eAAe;AAC9B,QAAI,GAAG,KAAK,IAAI,GAAG;AACjB,cAAQ,KAAK,UAAU,GAAG,MAAM,EAAE;AAAA,IACpC;AAAA,EACF;AAEA,aAAW,MAAM,uBAAuB;AACtC,QAAI,GAAG,KAAK,IAAI,GAAG;AACjB,cAAQ,KAAK,QAAQ,GAAG,MAAM,EAAE;AAAA,IAClC;AAAA,EACF;AAEA,MAAI,QAAQ,SAAS,GAAG;AACtB,WAAO,EAAE,OAAO,QAAQ,UAAU,QAAQ;AAAA,EAC5C;AAEA,QAAM,gBAA0B,CAAC;AACjC,aAAW,MAAM,iBAAiB;AAChC,QAAI,GAAG,KAAK,IAAI,GAAG;AACjB,oBAAc,KAAK,UAAU,GAAG,MAAM,EAAE;AAAA,IAC1C;AAAA,EACF;AAEA,MAAI,cAAc,UAAU,GAAG;AAC7B,WAAO,EAAE,OAAO,UAAU,UAAU,cAAc;AAAA,EACpD;AACA,MAAI,cAAc,WAAW,GAAG;AAC9B,WAAO,EAAE,OAAO,OAAO,UAAU,cAAc;AAAA,EACjD;AAEA,SAAO,EAAE,OAAO,QAAQ,UAAU,CAAC,EAAE;AACvC;","names":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
parseConflictPolicy,
|
|
3
3
|
validateManifestRecords
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-G4IAEX6D.js";
|
|
5
5
|
import {
|
|
6
6
|
ExportManifestV1Schema
|
|
7
7
|
} from "./chunk-WEHSQBFR.js";
|
|
@@ -11,12 +11,13 @@ import {
|
|
|
11
11
|
prepareSafeArchiveRoot,
|
|
12
12
|
readJsonFile,
|
|
13
13
|
resolveSafeArchiveTarget,
|
|
14
|
-
toPosixRelPath
|
|
15
|
-
|
|
14
|
+
toPosixRelPath,
|
|
15
|
+
writeSafeArchiveTarget
|
|
16
|
+
} from "./chunk-GCGJW34D.js";
|
|
16
17
|
|
|
17
18
|
// src/transfer/import-md.ts
|
|
18
19
|
import path from "path";
|
|
19
|
-
import {
|
|
20
|
+
import { readFile } from "fs/promises";
|
|
20
21
|
async function importMarkdownBundle(opts) {
|
|
21
22
|
const conflict = parseConflictPolicy(opts.conflict, "importMarkdownBundle");
|
|
22
23
|
const fromAbs = path.resolve(opts.fromDir);
|
|
@@ -60,12 +61,11 @@ async function importMarkdownBundle(opts) {
|
|
|
60
61
|
}
|
|
61
62
|
}
|
|
62
63
|
}
|
|
63
|
-
writes.push({
|
|
64
|
+
writes.push({ relPath: relPosix, content });
|
|
64
65
|
}
|
|
65
66
|
if (opts.dryRun) return { written: 0, skipped };
|
|
66
67
|
for (const w of writes) {
|
|
67
|
-
await
|
|
68
|
-
await writeFile(w.abs, w.content);
|
|
68
|
+
await writeSafeArchiveTarget(targetRoot, w.relPath, w.content);
|
|
69
69
|
}
|
|
70
70
|
return { written: writes.length, skipped };
|
|
71
71
|
}
|
|
@@ -73,4 +73,4 @@ async function importMarkdownBundle(opts) {
|
|
|
73
73
|
export {
|
|
74
74
|
importMarkdownBundle
|
|
75
75
|
};
|
|
76
|
-
//# sourceMappingURL=chunk-
|
|
76
|
+
//# sourceMappingURL=chunk-HDDRVXX4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/transfer/import-md.ts"],"sourcesContent":["import path from \"node:path\";\nimport { readFile } from \"node:fs/promises\";\nimport {\n fileExists,\n listFilesRecursive,\n prepareSafeArchiveRoot,\n readJsonFile,\n resolveSafeArchiveTarget,\n toPosixRelPath,\n writeSafeArchiveTarget,\n} from \"./fs-utils.js\";\nimport { parseConflictPolicy, type ConflictPolicy } from \"./conflict-policy.js\";\nimport { validateManifestRecords } from \"./integrity.js\";\nimport { ExportManifestV1Schema } from \"./types.js\";\n\nexport type { ConflictPolicy };\n\nexport interface ImportMdOptions {\n targetMemoryDir: string;\n fromDir: string;\n conflict?: ConflictPolicy;\n dryRun?: boolean;\n}\n\nexport async function importMarkdownBundle(opts: ImportMdOptions): Promise<{ written: number; skipped: number }> {\n const conflict = parseConflictPolicy(opts.conflict, \"importMarkdownBundle\");\n const fromAbs = path.resolve(opts.fromDir);\n const targetAbs = path.resolve(opts.targetMemoryDir);\n const targetRoot = await prepareSafeArchiveRoot(\n targetAbs,\n \"importMarkdownBundle\",\n \"targetMemoryDir\",\n );\n const manifest = ExportManifestV1Schema.parse(\n await readJsonFile(path.join(fromAbs, \"manifest.json\")),\n );\n\n const filesAbs = await listFilesRecursive(fromAbs);\n const records: Array<{ path: string; content: Uint8Array }> = [];\n for (const abs of filesAbs) {\n const relPosix = toPosixRelPath(abs, fromAbs);\n if (relPosix === \"manifest.json\") continue;\n records.push({ path: relPosix, content: await readFile(abs) });\n }\n validateManifestRecords(manifest, records, \"importMarkdownBundle\");\n\n const writes: Array<{ relPath: string; content: Uint8Array }> = [];\n let skipped = 0;\n\n for (const record of records) {\n const relPosix = record.path;\n const dstAbs = await resolveSafeArchiveTarget(targetRoot, relPosix);\n const content = record.content;\n\n const exists = await fileExists(dstAbs);\n if (exists) {\n if (conflict === \"skip\") {\n skipped += 1;\n continue;\n }\n if (conflict === \"dedupe\") {\n try {\n const existing = await readFile(dstAbs);\n if (Buffer.compare(existing, Buffer.from(content)) === 0) {\n skipped += 1;\n continue;\n }\n } catch {\n // fall through to overwrite\n }\n }\n }\n\n writes.push({ relPath: relPosix, content });\n }\n\n if (opts.dryRun) return { written: 0, skipped };\n\n for (const w of writes) {\n await writeSafeArchiveTarget(targetRoot, w.relPath, w.content);\n }\n\n return { written: writes.length, skipped };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA,OAAO,UAAU;AACjB,SAAS,gBAAgB;AAuBzB,eAAsB,qBAAqB,MAAsE;AAC/G,QAAM,WAAW,oBAAoB,KAAK,UAAU,sBAAsB;AAC1E,QAAM,UAAU,KAAK,QAAQ,KAAK,OAAO;AACzC,QAAM,YAAY,KAAK,QAAQ,KAAK,eAAe;AACnD,QAAM,aAAa,MAAM;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,WAAW,uBAAuB;AAAA,IACtC,MAAM,aAAa,KAAK,KAAK,SAAS,eAAe,CAAC;AAAA,EACxD;AAEA,QAAM,WAAW,MAAM,mBAAmB,OAAO;AACjD,QAAM,UAAwD,CAAC;AAC/D,aAAW,OAAO,UAAU;AAC1B,UAAM,WAAW,eAAe,KAAK,OAAO;AAC5C,QAAI,aAAa,gBAAiB;AAClC,YAAQ,KAAK,EAAE,MAAM,UAAU,SAAS,MAAM,SAAS,GAAG,EAAE,CAAC;AAAA,EAC/D;AACA,0BAAwB,UAAU,SAAS,sBAAsB;AAEjE,QAAM,SAA0D,CAAC;AACjE,MAAI,UAAU;AAEd,aAAW,UAAU,SAAS;AAC5B,UAAM,WAAW,OAAO;AACxB,UAAM,SAAS,MAAM,yBAAyB,YAAY,QAAQ;AAClE,UAAM,UAAU,OAAO;AAEvB,UAAM,SAAS,MAAM,WAAW,MAAM;AACtC,QAAI,QAAQ;AACV,UAAI,aAAa,QAAQ;AACvB,mBAAW;AACX;AAAA,MACF;AACA,UAAI,aAAa,UAAU;AACzB,YAAI;AACF,gBAAM,WAAW,MAAM,SAAS,MAAM;AACtC,cAAI,OAAO,QAAQ,UAAU,OAAO,KAAK,OAAO,CAAC,MAAM,GAAG;AACxD,uBAAW;AACX;AAAA,UACF;AAAA,QACF,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAEA,WAAO,KAAK,EAAE,SAAS,UAAU,QAAQ,CAAC;AAAA,EAC5C;AAEA,MAAI,KAAK,OAAQ,QAAO,EAAE,SAAS,GAAG,QAAQ;AAE9C,aAAW,KAAK,QAAQ;AACtB,UAAM,uBAAuB,YAAY,EAAE,SAAS,EAAE,OAAO;AAAA,EAC/D;AAEA,SAAO,EAAE,SAAS,OAAO,QAAQ,QAAQ;AAC3C;","names":[]}
|
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
|
|
5
5
|
// src/conversation-index/indexer.ts
|
|
6
6
|
import { lstat, mkdir, writeFile } from "fs/promises";
|
|
7
|
+
import { createHash } from "crypto";
|
|
7
8
|
import path from "path";
|
|
8
9
|
var MAX_PATH_COMPONENT_LENGTH = 200;
|
|
9
10
|
function sanitizePathComponent(value, fallback, opts = {}) {
|
|
@@ -16,19 +17,28 @@ function sanitizePathComponent(value, fallback, opts = {}) {
|
|
|
16
17
|
return sanitized;
|
|
17
18
|
}
|
|
18
19
|
function sanitizeSessionKey(sessionKey) {
|
|
19
|
-
|
|
20
|
+
const raw = typeof sessionKey === "string" && sessionKey.trim().length > 0 ? sessionKey.trim() : "";
|
|
21
|
+
const safe = sanitizePathComponent(raw, "unknown-session", { lowercase: true });
|
|
22
|
+
if (!raw) return safe;
|
|
23
|
+
const suffix = `-${createHash("sha256").update(raw).digest("hex").slice(0, 12)}`;
|
|
24
|
+
return `${safe.slice(0, MAX_PATH_COMPONENT_LENGTH - suffix.length)}${suffix}`;
|
|
20
25
|
}
|
|
21
26
|
function sanitizeChunkId(id) {
|
|
22
27
|
return sanitizePathComponent(id, "chunk");
|
|
23
28
|
}
|
|
24
29
|
function datePathComponent(startTs) {
|
|
25
|
-
|
|
30
|
+
const match = typeof startTs === "string" ? /^(\d{4})-(\d{2})-(\d{2})T/.exec(startTs) : null;
|
|
31
|
+
if (!match) {
|
|
26
32
|
throw new Error("invalid conversation chunk start timestamp");
|
|
27
33
|
}
|
|
28
34
|
const date = new Date(startTs);
|
|
29
35
|
if (!Number.isFinite(date.getTime())) {
|
|
30
36
|
throw new Error("invalid conversation chunk start timestamp");
|
|
31
37
|
}
|
|
38
|
+
const [, year, month, day] = match;
|
|
39
|
+
if (date.getUTCFullYear() !== Number(year) || date.getUTCMonth() + 1 !== Number(month) || date.getUTCDate() !== Number(day)) {
|
|
40
|
+
throw new Error("invalid conversation chunk start timestamp");
|
|
41
|
+
}
|
|
32
42
|
return date.toISOString().slice(0, 10);
|
|
33
43
|
}
|
|
34
44
|
function resolveInsideRoot(rootDir, candidate) {
|
|
@@ -114,12 +124,12 @@ endTs: ${c.endTs}
|
|
|
114
124
|
}
|
|
115
125
|
return written;
|
|
116
126
|
}
|
|
117
|
-
async function upsertConversationChunksFailOpen(adapter, chunks) {
|
|
127
|
+
async function upsertConversationChunksFailOpen(adapter, chunks, options = {}) {
|
|
118
128
|
if (!adapter) {
|
|
119
129
|
return { upserted: 0, skipped: true, reason: "adapter-unavailable" };
|
|
120
130
|
}
|
|
121
131
|
try {
|
|
122
|
-
const upserted = await adapter.upsertChunks(chunks);
|
|
132
|
+
const upserted = await adapter.upsertChunks(chunks, options);
|
|
123
133
|
return { upserted, skipped: false };
|
|
124
134
|
} catch (err) {
|
|
125
135
|
log.debug(`conversation index FAISS upsert failed (fail-open): ${err}`);
|
|
@@ -145,4 +155,4 @@ export {
|
|
|
145
155
|
upsertConversationChunksFailOpen,
|
|
146
156
|
rebuildConversationChunksFailOpen
|
|
147
157
|
};
|
|
148
|
-
//# sourceMappingURL=chunk-
|
|
158
|
+
//# sourceMappingURL=chunk-HENLZHIT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/conversation-index/indexer.ts"],"sourcesContent":["import { lstat, mkdir, writeFile } from \"node:fs/promises\";\nimport type { Stats } from \"node:fs\";\nimport { createHash } from \"node:crypto\";\nimport path from \"node:path\";\nimport { log } from \"../logger.js\";\nimport type { FaissConversationIndexAdapter } from \"./faiss-adapter.js\";\nimport type { ConversationChunk } from \"./chunker.js\";\n\nconst MAX_PATH_COMPONENT_LENGTH = 200;\n\nfunction sanitizePathComponent(\n value: string,\n fallback: string,\n opts: { lowercase?: boolean } = {},\n): string {\n const raw = typeof value === \"string\" && value.trim().length > 0\n ? value.trim()\n : fallback;\n const normalized = opts.lowercase ? raw.toLowerCase() : raw;\n const sanitized = normalized\n .replace(/[^a-zA-Z0-9._-]+/g, \"_\")\n .slice(0, MAX_PATH_COMPONENT_LENGTH);\n if (!sanitized || sanitized === \".\" || sanitized === \"..\") {\n return fallback;\n }\n return sanitized;\n}\n\nexport function sanitizeSessionKey(sessionKey: string): string {\n const raw = typeof sessionKey === \"string\" && sessionKey.trim().length > 0\n ? sessionKey.trim()\n : \"\";\n const safe = sanitizePathComponent(raw, \"unknown-session\", { lowercase: true });\n if (!raw) return safe;\n const suffix = `-${createHash(\"sha256\").update(raw).digest(\"hex\").slice(0, 12)}`;\n return `${safe.slice(0, MAX_PATH_COMPONENT_LENGTH - suffix.length)}${suffix}`;\n}\n\nfunction sanitizeChunkId(id: string): string {\n return sanitizePathComponent(id, \"chunk\");\n}\n\nfunction datePathComponent(startTs: string): string {\n const match = typeof startTs === \"string\"\n ? /^(\\d{4})-(\\d{2})-(\\d{2})T/.exec(startTs)\n : null;\n if (!match) {\n throw new Error(\"invalid conversation chunk start timestamp\");\n }\n const date = new Date(startTs);\n if (!Number.isFinite(date.getTime())) {\n throw new Error(\"invalid conversation chunk start timestamp\");\n }\n const [, year, month, day] = match;\n if (\n date.getUTCFullYear() !== Number(year) ||\n date.getUTCMonth() + 1 !== Number(month) ||\n date.getUTCDate() !== Number(day)\n ) {\n throw new Error(\"invalid conversation chunk start timestamp\");\n }\n return date.toISOString().slice(0, 10);\n}\n\nfunction resolveInsideRoot(rootDir: string, candidate: string): string {\n const root = path.resolve(rootDir);\n const resolved = path.resolve(candidate);\n const rel = path.relative(root, resolved);\n if (\n rel === \"\" ||\n (rel !== \"..\" && !rel.startsWith(`..${path.sep}`) && !path.isAbsolute(rel))\n ) {\n return resolved;\n }\n throw new Error(\"conversation chunk path escapes index root\");\n}\n\nasync function lstatIfExists(candidate: string): Promise<Stats | undefined> {\n try {\n return await lstat(candidate);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return undefined;\n throw err;\n }\n}\n\nasync function rejectSymlinkIfExists(candidate: string): Promise<void> {\n const stat = await lstatIfExists(candidate);\n if (stat?.isSymbolicLink()) {\n throw new Error(\"conversation chunk path contains symlink\");\n }\n}\n\nasync function rejectExistingSymlinksInPath(baseDir: string, candidate: string): Promise<void> {\n const base = path.resolve(baseDir);\n const resolved = path.resolve(candidate);\n\n let current = base;\n while (current !== path.dirname(current)) {\n const stat = await lstatIfExists(current);\n if (stat) {\n if (stat.isSymbolicLink()) {\n throw new Error(\"conversation chunk path contains symlink\");\n }\n break;\n }\n current = path.dirname(current);\n }\n\n const relative = path.relative(base, resolved);\n if (relative === \"\") return;\n\n current = base;\n for (const part of relative.split(path.sep)) {\n current = path.join(current, part);\n const stat = await lstatIfExists(current);\n if (!stat) return;\n if (stat.isSymbolicLink()) {\n throw new Error(\"conversation chunk path contains symlink\");\n }\n }\n}\n\nasync function rejectExistingSymlinkAncestors(\n rootDir: string,\n candidate: string,\n): Promise<void> {\n const root = path.resolve(rootDir);\n const resolved = resolveInsideRoot(root, candidate);\n await rejectExistingSymlinksInPath(root, resolved);\n}\n\nexport async function writeConversationChunks(\n rootDir: string,\n chunks: ConversationChunk[],\n): Promise<string[]> {\n const written: string[] = [];\n const root = path.resolve(rootDir);\n await rejectExistingSymlinksInPath(root, root);\n await mkdir(root, { recursive: true });\n await rejectExistingSymlinksInPath(root, root);\n\n for (const c of chunks) {\n const safe = sanitizeSessionKey(c.sessionKey);\n const date = datePathComponent(c.startTs);\n const dir = resolveInsideRoot(root, path.join(root, safe, date));\n await rejectExistingSymlinkAncestors(root, dir);\n await mkdir(dir, { recursive: true });\n await rejectExistingSymlinkAncestors(root, dir);\n const fp = resolveInsideRoot(root, path.join(dir, `${sanitizeChunkId(c.id)}.md`));\n await rejectExistingSymlinkAncestors(root, path.dirname(fp));\n await rejectSymlinkIfExists(fp);\n const content =\n `---\\n` +\n `kind: conversation_chunk\\n` +\n `sessionKey: ${c.sessionKey}\\n` +\n `startTs: ${c.startTs}\\n` +\n `endTs: ${c.endTs}\\n` +\n `---\\n\\n` +\n c.text +\n \"\\n\";\n await writeFile(fp, content, \"utf-8\");\n written.push(fp);\n }\n return written;\n}\n\nexport interface ConversationChunkUpsertResult {\n upserted: number;\n skipped: boolean;\n reason?: \"adapter-unavailable\" | \"adapter-error\";\n}\n\nexport interface ConversationChunkRebuildResult {\n rebuilt: number;\n skipped: boolean;\n reason?: \"adapter-unavailable\" | \"adapter-error\";\n}\n\nexport async function upsertConversationChunksFailOpen(\n adapter: FaissConversationIndexAdapter | undefined,\n chunks: ConversationChunk[],\n options: { retentionCutoffMs?: number } = {},\n): Promise<ConversationChunkUpsertResult> {\n if (!adapter) {\n return { upserted: 0, skipped: true, reason: \"adapter-unavailable\" };\n }\n try {\n const upserted = await adapter.upsertChunks(chunks, options);\n return { upserted, skipped: false };\n } catch (err) {\n log.debug(`conversation index FAISS upsert failed (fail-open): ${err}`);\n return { upserted: 0, skipped: true, reason: \"adapter-error\" };\n }\n}\n\nexport async function rebuildConversationChunksFailOpen(\n adapter: FaissConversationIndexAdapter | undefined,\n chunks: ConversationChunk[],\n): Promise<ConversationChunkRebuildResult> {\n if (!adapter) {\n return { rebuilt: 0, skipped: true, reason: \"adapter-unavailable\" };\n }\n try {\n const rebuilt = await adapter.rebuildChunks(chunks);\n return { rebuilt, skipped: false };\n } catch (err) {\n log.debug(`conversation index FAISS rebuild failed (fail-open): ${err}`);\n return { rebuilt: 0, skipped: true, reason: \"adapter-error\" };\n }\n}\n"],"mappings":";;;;;AAAA,SAAS,OAAO,OAAO,iBAAiB;AAExC,SAAS,kBAAkB;AAC3B,OAAO,UAAU;AAKjB,IAAM,4BAA4B;AAElC,SAAS,sBACP,OACA,UACA,OAAgC,CAAC,GACzB;AACR,QAAM,MAAM,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS,IAC3D,MAAM,KAAK,IACX;AACJ,QAAM,aAAa,KAAK,YAAY,IAAI,YAAY,IAAI;AACxD,QAAM,YAAY,WACf,QAAQ,qBAAqB,GAAG,EAChC,MAAM,GAAG,yBAAyB;AACrC,MAAI,CAAC,aAAa,cAAc,OAAO,cAAc,MAAM;AACzD,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,SAAS,mBAAmB,YAA4B;AAC7D,QAAM,MAAM,OAAO,eAAe,YAAY,WAAW,KAAK,EAAE,SAAS,IACrE,WAAW,KAAK,IAChB;AACJ,QAAM,OAAO,sBAAsB,KAAK,mBAAmB,EAAE,WAAW,KAAK,CAAC;AAC9E,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,SAAS,IAAI,WAAW,QAAQ,EAAE,OAAO,GAAG,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE,CAAC;AAC9E,SAAO,GAAG,KAAK,MAAM,GAAG,4BAA4B,OAAO,MAAM,CAAC,GAAG,MAAM;AAC7E;AAEA,SAAS,gBAAgB,IAAoB;AAC3C,SAAO,sBAAsB,IAAI,OAAO;AAC1C;AAEA,SAAS,kBAAkB,SAAyB;AAClD,QAAM,QAAQ,OAAO,YAAY,WAC7B,4BAA4B,KAAK,OAAO,IACxC;AACJ,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AACA,QAAM,OAAO,IAAI,KAAK,OAAO;AAC7B,MAAI,CAAC,OAAO,SAAS,KAAK,QAAQ,CAAC,GAAG;AACpC,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AACA,QAAM,CAAC,EAAE,MAAM,OAAO,GAAG,IAAI;AAC7B,MACE,KAAK,eAAe,MAAM,OAAO,IAAI,KACrC,KAAK,YAAY,IAAI,MAAM,OAAO,KAAK,KACvC,KAAK,WAAW,MAAM,OAAO,GAAG,GAChC;AACA,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AACA,SAAO,KAAK,YAAY,EAAE,MAAM,GAAG,EAAE;AACvC;AAEA,SAAS,kBAAkB,SAAiB,WAA2B;AACrE,QAAM,OAAO,KAAK,QAAQ,OAAO;AACjC,QAAM,WAAW,KAAK,QAAQ,SAAS;AACvC,QAAM,MAAM,KAAK,SAAS,MAAM,QAAQ;AACxC,MACE,QAAQ,MACP,QAAQ,QAAQ,CAAC,IAAI,WAAW,KAAK,KAAK,GAAG,EAAE,KAAK,CAAC,KAAK,WAAW,GAAG,GACzE;AACA,WAAO;AAAA,EACT;AACA,QAAM,IAAI,MAAM,4CAA4C;AAC9D;AAEA,eAAe,cAAc,WAA+C;AAC1E,MAAI;AACF,WAAO,MAAM,MAAM,SAAS;AAAA,EAC9B,SAAS,KAAK;AACZ,QAAK,IAA8B,SAAS,SAAU,QAAO;AAC7D,UAAM;AAAA,EACR;AACF;AAEA,eAAe,sBAAsB,WAAkC;AACrE,QAAM,OAAO,MAAM,cAAc,SAAS;AAC1C,MAAI,MAAM,eAAe,GAAG;AAC1B,UAAM,IAAI,MAAM,0CAA0C;AAAA,EAC5D;AACF;AAEA,eAAe,6BAA6B,SAAiB,WAAkC;AAC7F,QAAM,OAAO,KAAK,QAAQ,OAAO;AACjC,QAAM,WAAW,KAAK,QAAQ,SAAS;AAEvC,MAAI,UAAU;AACd,SAAO,YAAY,KAAK,QAAQ,OAAO,GAAG;AACxC,UAAM,OAAO,MAAM,cAAc,OAAO;AACxC,QAAI,MAAM;AACR,UAAI,KAAK,eAAe,GAAG;AACzB,cAAM,IAAI,MAAM,0CAA0C;AAAA,MAC5D;AACA;AAAA,IACF;AACA,cAAU,KAAK,QAAQ,OAAO;AAAA,EAChC;AAEA,QAAM,WAAW,KAAK,SAAS,MAAM,QAAQ;AAC7C,MAAI,aAAa,GAAI;AAErB,YAAU;AACV,aAAW,QAAQ,SAAS,MAAM,KAAK,GAAG,GAAG;AAC3C,cAAU,KAAK,KAAK,SAAS,IAAI;AACjC,UAAM,OAAO,MAAM,cAAc,OAAO;AACxC,QAAI,CAAC,KAAM;AACX,QAAI,KAAK,eAAe,GAAG;AACzB,YAAM,IAAI,MAAM,0CAA0C;AAAA,IAC5D;AAAA,EACF;AACF;AAEA,eAAe,+BACb,SACA,WACe;AACf,QAAM,OAAO,KAAK,QAAQ,OAAO;AACjC,QAAM,WAAW,kBAAkB,MAAM,SAAS;AAClD,QAAM,6BAA6B,MAAM,QAAQ;AACnD;AAEA,eAAsB,wBACpB,SACA,QACmB;AACnB,QAAM,UAAoB,CAAC;AAC3B,QAAM,OAAO,KAAK,QAAQ,OAAO;AACjC,QAAM,6BAA6B,MAAM,IAAI;AAC7C,QAAM,MAAM,MAAM,EAAE,WAAW,KAAK,CAAC;AACrC,QAAM,6BAA6B,MAAM,IAAI;AAE7C,aAAW,KAAK,QAAQ;AACtB,UAAM,OAAO,mBAAmB,EAAE,UAAU;AAC5C,UAAM,OAAO,kBAAkB,EAAE,OAAO;AACxC,UAAM,MAAM,kBAAkB,MAAM,KAAK,KAAK,MAAM,MAAM,IAAI,CAAC;AAC/D,UAAM,+BAA+B,MAAM,GAAG;AAC9C,UAAM,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AACpC,UAAM,+BAA+B,MAAM,GAAG;AAC9C,UAAM,KAAK,kBAAkB,MAAM,KAAK,KAAK,KAAK,GAAG,gBAAgB,EAAE,EAAE,CAAC,KAAK,CAAC;AAChF,UAAM,+BAA+B,MAAM,KAAK,QAAQ,EAAE,CAAC;AAC3D,UAAM,sBAAsB,EAAE;AAC9B,UAAM,UACJ;AAAA;AAAA,cAEe,EAAE,UAAU;AAAA,WACf,EAAE,OAAO;AAAA,SACX,EAAE,KAAK;AAAA;AAAA;AAAA,IAEjB,EAAE,OACF;AACF,UAAM,UAAU,IAAI,SAAS,OAAO;AACpC,YAAQ,KAAK,EAAE;AAAA,EACjB;AACA,SAAO;AACT;AAcA,eAAsB,iCACpB,SACA,QACA,UAA0C,CAAC,GACH;AACxC,MAAI,CAAC,SAAS;AACZ,WAAO,EAAE,UAAU,GAAG,SAAS,MAAM,QAAQ,sBAAsB;AAAA,EACrE;AACA,MAAI;AACF,UAAM,WAAW,MAAM,QAAQ,aAAa,QAAQ,OAAO;AAC3D,WAAO,EAAE,UAAU,SAAS,MAAM;AAAA,EACpC,SAAS,KAAK;AACZ,QAAI,MAAM,uDAAuD,GAAG,EAAE;AACtE,WAAO,EAAE,UAAU,GAAG,SAAS,MAAM,QAAQ,gBAAgB;AAAA,EAC/D;AACF;AAEA,eAAsB,kCACpB,SACA,QACyC;AACzC,MAAI,CAAC,SAAS;AACZ,WAAO,EAAE,SAAS,GAAG,SAAS,MAAM,QAAQ,sBAAsB;AAAA,EACpE;AACA,MAAI;AACF,UAAM,UAAU,MAAM,QAAQ,cAAc,MAAM;AAClD,WAAO,EAAE,SAAS,SAAS,MAAM;AAAA,EACnC,SAAS,KAAK;AACZ,QAAI,MAAM,wDAAwD,GAAG,EAAE;AACvE,WAAO,EAAE,SAAS,GAAG,SAAS,MAAM,QAAQ,gBAAgB;AAAA,EAC9D;AACF;","names":[]}
|
|
@@ -80,12 +80,7 @@ var WebSearchProvider = class {
|
|
|
80
80
|
async enrich(entity) {
|
|
81
81
|
if (!this.searchFn) return [];
|
|
82
82
|
const query = `${entity.name} ${entity.type}`;
|
|
83
|
-
|
|
84
|
-
try {
|
|
85
|
-
snippets = await this.searchFn(query);
|
|
86
|
-
} catch {
|
|
87
|
-
return [];
|
|
88
|
-
}
|
|
83
|
+
const snippets = await this.searchFn(query);
|
|
89
84
|
return snippets.filter((s) => typeof s === "string" && s.trim().length > 0).map((snippet) => ({
|
|
90
85
|
text: snippet.trim(),
|
|
91
86
|
source: this.id,
|
|
@@ -98,11 +93,12 @@ var WebSearchProvider = class {
|
|
|
98
93
|
};
|
|
99
94
|
|
|
100
95
|
// src/enrichment/pipeline.ts
|
|
101
|
-
|
|
96
|
+
var rateBuckets = /* @__PURE__ */ new Map();
|
|
97
|
+
function isRateLimited(provider, config) {
|
|
102
98
|
const providerCfg = config.providers.find((p) => p.id === provider.id);
|
|
103
99
|
if (!providerCfg?.rateLimit) return false;
|
|
104
100
|
const now = Date.now();
|
|
105
|
-
let bucket =
|
|
101
|
+
let bucket = rateBuckets.get(provider.id);
|
|
106
102
|
if (!bucket) {
|
|
107
103
|
bucket = {
|
|
108
104
|
minuteCount: 0,
|
|
@@ -110,7 +106,7 @@ function isRateLimited(provider, config, buckets) {
|
|
|
110
106
|
dayCount: 0,
|
|
111
107
|
dayReset: now + 864e5
|
|
112
108
|
};
|
|
113
|
-
|
|
109
|
+
rateBuckets.set(provider.id, bucket);
|
|
114
110
|
}
|
|
115
111
|
if (now >= bucket.minuteReset) {
|
|
116
112
|
bucket.minuteCount = 0;
|
|
@@ -123,8 +119,8 @@ function isRateLimited(provider, config, buckets) {
|
|
|
123
119
|
const { maxPerMinute, maxPerDay } = providerCfg.rateLimit;
|
|
124
120
|
return bucket.minuteCount >= maxPerMinute || bucket.dayCount >= maxPerDay;
|
|
125
121
|
}
|
|
126
|
-
function recordCall(providerId
|
|
127
|
-
const bucket =
|
|
122
|
+
function recordCall(providerId) {
|
|
123
|
+
const bucket = rateBuckets.get(providerId);
|
|
128
124
|
if (bucket) {
|
|
129
125
|
bucket.minuteCount += 1;
|
|
130
126
|
bucket.dayCount += 1;
|
|
@@ -133,11 +129,16 @@ function recordCall(providerId, buckets) {
|
|
|
133
129
|
async function runEnrichmentPipeline(entities, registry, config, log) {
|
|
134
130
|
if (!config.enabled) return [];
|
|
135
131
|
if (entities.length === 0) return [];
|
|
136
|
-
const rateBuckets = /* @__PURE__ */ new Map();
|
|
137
132
|
const results = [];
|
|
138
133
|
for (const entity of entities) {
|
|
139
134
|
const providers = registry.getForImportance(entity.importanceLevel, config);
|
|
135
|
+
const maxCandidates = config.maxCandidatesPerEntity;
|
|
136
|
+
const hasPositiveCandidateBudget = maxCandidates > 0;
|
|
137
|
+
let remainingCandidateBudget = hasPositiveCandidateBudget ? maxCandidates : Number.POSITIVE_INFINITY;
|
|
140
138
|
for (const provider of providers) {
|
|
139
|
+
if (hasPositiveCandidateBudget && remainingCandidateBudget <= 0) {
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
141
142
|
const start = Date.now();
|
|
142
143
|
let available;
|
|
143
144
|
try {
|
|
@@ -160,7 +161,7 @@ async function runEnrichmentPipeline(entities, registry, config, log) {
|
|
|
160
161
|
});
|
|
161
162
|
continue;
|
|
162
163
|
}
|
|
163
|
-
if (isRateLimited(provider, config
|
|
164
|
+
if (isRateLimited(provider, config)) {
|
|
164
165
|
log.debug?.(
|
|
165
166
|
`enrichment: skipping provider ${provider.id} for ${entity.name} \u2014 rate limited`
|
|
166
167
|
);
|
|
@@ -179,7 +180,7 @@ async function runEnrichmentPipeline(entities, registry, config, log) {
|
|
|
179
180
|
try {
|
|
180
181
|
candidates = await provider.enrich(entity);
|
|
181
182
|
} catch (err) {
|
|
182
|
-
recordCall(provider.id
|
|
183
|
+
recordCall(provider.id);
|
|
183
184
|
log.error?.(
|
|
184
185
|
`enrichment: provider ${provider.id} failed for ${entity.name}: ${err instanceof Error ? err.message : String(err)}`
|
|
185
186
|
);
|
|
@@ -194,16 +195,16 @@ async function runEnrichmentPipeline(entities, registry, config, log) {
|
|
|
194
195
|
});
|
|
195
196
|
continue;
|
|
196
197
|
}
|
|
197
|
-
recordCall(provider.id
|
|
198
|
+
recordCall(provider.id);
|
|
198
199
|
for (const candidate of candidates) {
|
|
199
200
|
candidate.source = provider.id;
|
|
200
201
|
}
|
|
201
|
-
const maxCandidates = config.maxCandidatesPerEntity;
|
|
202
202
|
let accepted;
|
|
203
203
|
if (maxCandidates === 0) {
|
|
204
204
|
accepted = [];
|
|
205
|
-
} else if (
|
|
206
|
-
accepted = candidates.slice(0,
|
|
205
|
+
} else if (hasPositiveCandidateBudget) {
|
|
206
|
+
accepted = candidates.slice(0, remainingCandidateBudget);
|
|
207
|
+
remainingCandidateBudget -= accepted.length;
|
|
207
208
|
} else {
|
|
208
209
|
accepted = candidates;
|
|
209
210
|
}
|
|
@@ -238,6 +239,10 @@ async function appendAuditEntry(auditDir, entry) {
|
|
|
238
239
|
async function readAuditLog(auditDir, since) {
|
|
239
240
|
const filePath = auditFilePath(auditDir);
|
|
240
241
|
if (!existsSync(filePath)) return [];
|
|
242
|
+
const sinceMs = since === void 0 ? void 0 : Date.parse(since);
|
|
243
|
+
if (since !== void 0 && !Number.isFinite(sinceMs)) {
|
|
244
|
+
throw new Error(`Invalid enrichment audit since timestamp: ${since}`);
|
|
245
|
+
}
|
|
241
246
|
const raw = await readFile(filePath, "utf-8");
|
|
242
247
|
const entries = [];
|
|
243
248
|
for (const line of raw.split("\n")) {
|
|
@@ -247,7 +252,10 @@ async function readAuditLog(auditDir, since) {
|
|
|
247
252
|
const parsed = JSON.parse(trimmed);
|
|
248
253
|
if (typeof parsed === "object" && parsed !== null && "timestamp" in parsed && "entityName" in parsed) {
|
|
249
254
|
const entry = parsed;
|
|
250
|
-
if (
|
|
255
|
+
if (typeof entry.timestamp !== "string") continue;
|
|
256
|
+
const entryMs = Date.parse(entry.timestamp);
|
|
257
|
+
if (!Number.isFinite(entryMs)) continue;
|
|
258
|
+
if (sinceMs !== void 0 && entryMs < sinceMs) continue;
|
|
251
259
|
entries.push(entry);
|
|
252
260
|
}
|
|
253
261
|
} catch {
|
|
@@ -264,4 +272,4 @@ export {
|
|
|
264
272
|
appendAuditEntry,
|
|
265
273
|
readAuditLog
|
|
266
274
|
};
|
|
267
|
-
//# sourceMappingURL=chunk-
|
|
275
|
+
//# sourceMappingURL=chunk-HINSGUA7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/enrichment/types.ts","../src/enrichment/provider-registry.ts","../src/enrichment/web-search-provider.ts","../src/enrichment/pipeline.ts","../src/enrichment/audit.ts"],"sourcesContent":["/**\n * Enrichment pipeline types (issue #365).\n *\n * Defines the provider interface, candidate shape, pipeline config,\n * and result types for the external enrichment subsystem.\n */\n\nimport type { ImportanceLevel, MemoryCategory } from \"../types.js\";\n\n// ---------------------------------------------------------------------------\n// Provider config & interface\n// ---------------------------------------------------------------------------\n\nexport type EnrichmentCostTier = \"free\" | \"cheap\" | \"expensive\";\n\nexport interface EnrichmentProviderConfig {\n id: string;\n enabled: boolean;\n costTier: EnrichmentCostTier;\n rateLimit?: { maxPerMinute: number; maxPerDay: number };\n}\n\nexport interface EnrichmentCandidate {\n text: string;\n source: string;\n sourceUrl?: string;\n confidence: number;\n category: MemoryCategory;\n tags?: string[];\n}\n\nexport interface EnrichmentProvider {\n readonly id: string;\n readonly costTier: EnrichmentCostTier;\n enrich(entity: EntityEnrichmentInput): Promise<EnrichmentCandidate[]>;\n isAvailable(): Promise<boolean>;\n}\n\n// ---------------------------------------------------------------------------\n// Entity enrichment input\n// ---------------------------------------------------------------------------\n\nexport interface EntityEnrichmentInput {\n name: string;\n type: string;\n knownFacts: string[];\n importanceLevel: ImportanceLevel;\n}\n\n// ---------------------------------------------------------------------------\n// Pipeline result\n// ---------------------------------------------------------------------------\n\nexport interface EnrichmentResult {\n entityName: string;\n provider: string;\n candidatesFound: number;\n candidatesAccepted: number;\n candidatesRejected: number;\n acceptedCandidates: EnrichmentCandidate[];\n elapsed: number;\n}\n\n// ---------------------------------------------------------------------------\n// Pipeline config\n// ---------------------------------------------------------------------------\n\nexport interface EnrichmentPipelineConfig {\n enabled: boolean;\n providers: EnrichmentProviderConfig[];\n importanceThresholds: {\n critical: string[];\n high: string[];\n normal: string[];\n low: string[];\n };\n maxCandidatesPerEntity: number;\n autoEnrichOnCreate: boolean;\n scheduleIntervalMs: number;\n}\n\n/**\n * Build a default (disabled) pipeline config. Every consumer that needs a\n * config object should call this rather than duplicating the defaults.\n */\nexport function defaultEnrichmentPipelineConfig(): EnrichmentPipelineConfig {\n return {\n enabled: false,\n providers: [],\n importanceThresholds: {\n critical: [],\n high: [],\n normal: [],\n low: [],\n },\n maxCandidatesPerEntity: 20,\n autoEnrichOnCreate: false,\n scheduleIntervalMs: 3_600_000,\n };\n}\n","/**\n * Enrichment provider registry (issue #365).\n *\n * Central registry for enrichment providers. Providers register themselves\n * at startup; the pipeline queries the registry to determine which providers\n * to run for a given importance tier.\n */\n\nimport type { ImportanceLevel } from \"../types.js\";\nimport type {\n EnrichmentPipelineConfig,\n EnrichmentProvider,\n} from \"./types.js\";\n\nexport class EnrichmentProviderRegistry {\n private readonly providers = new Map<string, EnrichmentProvider>();\n\n /** Register a provider. Overwrites any existing provider with the same id. */\n register(provider: EnrichmentProvider): void {\n this.providers.set(provider.id, provider);\n }\n\n /** Look up a single provider by id. */\n get(id: string): EnrichmentProvider | undefined {\n return this.providers.get(id);\n }\n\n /**\n * Return all registered providers whose id appears in the config's\n * `providers` list with `enabled: true`.\n */\n listEnabled(config: EnrichmentPipelineConfig): EnrichmentProvider[] {\n const enabledIds = new Set(\n config.providers\n .filter((p) => p.enabled)\n .map((p) => p.id),\n );\n const result: EnrichmentProvider[] = [];\n for (const [id, provider] of this.providers.entries()) {\n if (enabledIds.has(id)) {\n result.push(provider);\n }\n }\n return result;\n }\n\n /**\n * Return providers that should run for a given importance level.\n * Providers are resolved from `config.importanceThresholds[level]` and\n * filtered to only those that are both registered and enabled.\n */\n getForImportance(\n level: ImportanceLevel,\n config: EnrichmentPipelineConfig,\n ): EnrichmentProvider[] {\n // \"trivial\" entities never get enrichment providers\n if (level === \"trivial\") return [];\n\n const thresholds = config.importanceThresholds;\n const providerIds: string[] =\n level === \"critical\"\n ? thresholds.critical\n : level === \"high\"\n ? thresholds.high\n : level === \"normal\"\n ? thresholds.normal\n : thresholds.low;\n\n const enabledIds = new Set(\n config.providers\n .filter((p) => p.enabled)\n .map((p) => p.id),\n );\n\n const result: EnrichmentProvider[] = [];\n for (const id of providerIds) {\n if (!enabledIds.has(id)) continue;\n const provider = this.providers.get(id);\n if (provider) {\n result.push(provider);\n }\n }\n return result;\n }\n}\n","/**\n * Web search enrichment provider stub (issue #365).\n *\n * A basic provider backed by web search. Since this is opt-in and we do not\n * want to hard-code an API key, the provider accepts an optional `searchFn`\n * injection point. When no search function is configured it returns empty\n * results, making it safe to register unconditionally.\n */\n\nimport type {\n EnrichmentCandidate,\n EnrichmentCostTier,\n EnrichmentProvider,\n EntityEnrichmentInput,\n} from \"./types.js\";\n\nexport type WebSearchFn = (query: string) => Promise<string[]>;\n\nexport interface WebSearchProviderOptions {\n /**\n * Injected search function. Each returned string is treated as a raw\n * snippet. When `undefined` the provider returns empty results.\n */\n searchFn?: WebSearchFn;\n}\n\nexport class WebSearchProvider implements EnrichmentProvider {\n readonly id = \"web-search\";\n readonly costTier: EnrichmentCostTier = \"cheap\";\n\n private readonly searchFn: WebSearchFn | undefined;\n\n constructor(options: WebSearchProviderOptions = {}) {\n this.searchFn = options.searchFn;\n }\n\n async isAvailable(): Promise<boolean> {\n return this.searchFn !== undefined;\n }\n\n async enrich(entity: EntityEnrichmentInput): Promise<EnrichmentCandidate[]> {\n if (!this.searchFn) return [];\n\n const query = `${entity.name} ${entity.type}`;\n const snippets = await this.searchFn(query);\n\n return snippets\n .filter((s) => typeof s === \"string\" && s.trim().length > 0)\n .map((snippet) => ({\n text: snippet.trim(),\n source: this.id,\n sourceUrl: undefined,\n confidence: 0.5,\n category: \"fact\" as const,\n tags: [\"web-search\"],\n }));\n }\n}\n","/**\n * Enrichment pipeline orchestrator (issue #365).\n *\n * For each entity, determines the importance tier, resolves the providers\n * to run, executes them in sequence (respecting rate limits), tags\n * candidates, and caps at `maxCandidatesPerEntity`.\n *\n * Accepted candidates are returned in each `EnrichmentResult` via the\n * `acceptedCandidates` field so that callers can persist them.\n */\n\nimport type { LoggerBackend } from \"../logger.js\";\nimport type { EnrichmentProviderRegistry } from \"./provider-registry.js\";\nimport type {\n EnrichmentCandidate,\n EnrichmentPipelineConfig,\n EnrichmentProvider,\n EnrichmentResult,\n EntityEnrichmentInput,\n} from \"./types.js\";\n\n// ---------------------------------------------------------------------------\n// Rate-limit tracking\n// ---------------------------------------------------------------------------\n\ninterface RateLimitBucket {\n minuteCount: number;\n minuteReset: number;\n dayCount: number;\n dayReset: number;\n}\n\nconst rateBuckets = new Map<string, RateLimitBucket>();\n\nfunction isRateLimited(\n provider: EnrichmentProvider,\n config: EnrichmentPipelineConfig,\n): boolean {\n const providerCfg = config.providers.find((p) => p.id === provider.id);\n if (!providerCfg?.rateLimit) return false;\n\n const now = Date.now();\n let bucket = rateBuckets.get(provider.id);\n if (!bucket) {\n bucket = {\n minuteCount: 0,\n minuteReset: now + 60_000,\n dayCount: 0,\n dayReset: now + 86_400_000,\n };\n rateBuckets.set(provider.id, bucket);\n }\n\n // Reset windows if expired\n if (now >= bucket.minuteReset) {\n bucket.minuteCount = 0;\n bucket.minuteReset = now + 60_000;\n }\n if (now >= bucket.dayReset) {\n bucket.dayCount = 0;\n bucket.dayReset = now + 86_400_000;\n }\n\n const { maxPerMinute, maxPerDay } = providerCfg.rateLimit;\n return bucket.minuteCount >= maxPerMinute || bucket.dayCount >= maxPerDay;\n}\n\nfunction recordCall(\n providerId: string,\n): void {\n const bucket = rateBuckets.get(providerId);\n if (bucket) {\n bucket.minuteCount += 1;\n bucket.dayCount += 1;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Pipeline\n// ---------------------------------------------------------------------------\n\nexport async function runEnrichmentPipeline(\n entities: EntityEnrichmentInput[],\n registry: EnrichmentProviderRegistry,\n config: EnrichmentPipelineConfig,\n log: LoggerBackend,\n): Promise<EnrichmentResult[]> {\n if (!config.enabled) return [];\n if (entities.length === 0) return [];\n\n const results: EnrichmentResult[] = [];\n\n for (const entity of entities) {\n const providers = registry.getForImportance(entity.importanceLevel, config);\n const maxCandidates = config.maxCandidatesPerEntity;\n const hasPositiveCandidateBudget = maxCandidates > 0;\n let remainingCandidateBudget = hasPositiveCandidateBudget\n ? maxCandidates\n : Number.POSITIVE_INFINITY;\n\n for (const provider of providers) {\n if (hasPositiveCandidateBudget && remainingCandidateBudget <= 0) {\n break;\n }\n\n const start = Date.now();\n\n // Check availability\n let available: boolean;\n try {\n available = await provider.isAvailable();\n } catch {\n available = false;\n }\n\n if (!available) {\n log.debug?.(\n `enrichment: skipping provider ${provider.id} for ${entity.name} — unavailable`,\n );\n results.push({\n entityName: entity.name,\n provider: provider.id,\n candidatesFound: 0,\n candidatesAccepted: 0,\n candidatesRejected: 0,\n acceptedCandidates: [],\n elapsed: Date.now() - start,\n });\n continue;\n }\n\n // Check rate limit\n if (isRateLimited(provider, config)) {\n log.debug?.(\n `enrichment: skipping provider ${provider.id} for ${entity.name} — rate limited`,\n );\n results.push({\n entityName: entity.name,\n provider: provider.id,\n candidatesFound: 0,\n candidatesAccepted: 0,\n candidatesRejected: 0,\n acceptedCandidates: [],\n elapsed: Date.now() - start,\n });\n continue;\n }\n\n // Run provider.\n // Count every attempt toward rate-limit buckets — including failures —\n // because the provider may have consumed external quota before throwing\n // (PR #425 review finding 2).\n let candidates: EnrichmentCandidate[];\n try {\n candidates = await provider.enrich(entity);\n } catch (err) {\n recordCall(provider.id);\n log.error?.(\n `enrichment: provider ${provider.id} failed for ${entity.name}: ${err instanceof Error ? err.message : String(err)}`,\n );\n results.push({\n entityName: entity.name,\n provider: provider.id,\n candidatesFound: 0,\n candidatesAccepted: 0,\n candidatesRejected: 0,\n acceptedCandidates: [],\n elapsed: Date.now() - start,\n });\n continue;\n }\n recordCall(provider.id);\n\n // Tag each candidate with provider id\n for (const candidate of candidates) {\n candidate.source = provider.id;\n }\n\n // Cap at maxCandidatesPerEntity across all providers for this entity.\n // 0 means \"accept none\"; undefined/negative means \"no cap\".\n let accepted: EnrichmentCandidate[];\n if (maxCandidates === 0) {\n accepted = [];\n } else if (hasPositiveCandidateBudget) {\n accepted = candidates.slice(0, remainingCandidateBudget);\n remainingCandidateBudget -= accepted.length;\n } else {\n accepted = candidates;\n }\n const rejected = candidates.length - accepted.length;\n\n results.push({\n entityName: entity.name,\n provider: provider.id,\n candidatesFound: candidates.length,\n candidatesAccepted: accepted.length,\n candidatesRejected: rejected,\n acceptedCandidates: accepted,\n elapsed: Date.now() - start,\n });\n }\n }\n\n return results;\n}\n","/**\n * Enrichment audit trail (issue #365).\n *\n * Append-only JSONL log for every enrichment candidate that was evaluated.\n * Each entry records whether the candidate was accepted or rejected, the\n * provider that produced it, and an optional reason string.\n */\n\nimport { mkdir, readFile, appendFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface EnrichmentAuditEntry {\n timestamp: string;\n entityName: string;\n provider: string;\n candidateText: string;\n sourceUrl?: string;\n accepted: boolean;\n reason?: string;\n}\n\n// ---------------------------------------------------------------------------\n// File helpers\n// ---------------------------------------------------------------------------\n\nconst AUDIT_FILENAME = \"enrichment-audit.jsonl\";\n\nfunction auditFilePath(auditDir: string): string {\n return path.join(auditDir, AUDIT_FILENAME);\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Append a single audit entry to the JSONL log. Creates the audit directory\n * and file if they do not exist.\n */\nexport async function appendAuditEntry(\n auditDir: string,\n entry: EnrichmentAuditEntry,\n): Promise<void> {\n await mkdir(auditDir, { recursive: true });\n const line = JSON.stringify(entry) + \"\\n\";\n await appendFile(auditFilePath(auditDir), line, \"utf-8\");\n}\n\n/**\n * Read the audit log and return entries, optionally filtered to entries at\n * or after `since` (ISO 8601 timestamp, half-open interval).\n */\nexport async function readAuditLog(\n auditDir: string,\n since?: string,\n): Promise<EnrichmentAuditEntry[]> {\n const filePath = auditFilePath(auditDir);\n if (!existsSync(filePath)) return [];\n const sinceMs = since === undefined ? undefined : Date.parse(since);\n if (since !== undefined && !Number.isFinite(sinceMs)) {\n throw new Error(`Invalid enrichment audit since timestamp: ${since}`);\n }\n\n const raw = await readFile(filePath, \"utf-8\");\n const entries: EnrichmentAuditEntry[] = [];\n\n for (const line of raw.split(\"\\n\")) {\n const trimmed = line.trim();\n if (trimmed.length === 0) continue;\n try {\n const parsed: unknown = JSON.parse(trimmed);\n if (\n typeof parsed === \"object\" &&\n parsed !== null &&\n \"timestamp\" in parsed &&\n \"entityName\" in parsed\n ) {\n const entry = parsed as EnrichmentAuditEntry;\n if (typeof entry.timestamp !== \"string\") continue;\n const entryMs = Date.parse(entry.timestamp);\n if (!Number.isFinite(entryMs)) continue;\n if (sinceMs !== undefined && entryMs < sinceMs) continue;\n entries.push(entry);\n }\n } catch {\n // Skip malformed lines\n }\n }\n\n return entries;\n}\n"],"mappings":";AAqFO,SAAS,kCAA4D;AAC1E,SAAO;AAAA,IACL,SAAS;AAAA,IACT,WAAW,CAAC;AAAA,IACZ,sBAAsB;AAAA,MACpB,UAAU,CAAC;AAAA,MACX,MAAM,CAAC;AAAA,MACP,QAAQ,CAAC;AAAA,MACT,KAAK,CAAC;AAAA,IACR;AAAA,IACA,wBAAwB;AAAA,IACxB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,EACtB;AACF;;;ACrFO,IAAM,6BAAN,MAAiC;AAAA,EACrB,YAAY,oBAAI,IAAgC;AAAA;AAAA,EAGjE,SAAS,UAAoC;AAC3C,SAAK,UAAU,IAAI,SAAS,IAAI,QAAQ;AAAA,EAC1C;AAAA;AAAA,EAGA,IAAI,IAA4C;AAC9C,WAAO,KAAK,UAAU,IAAI,EAAE;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,QAAwD;AAClE,UAAM,aAAa,IAAI;AAAA,MACrB,OAAO,UACJ,OAAO,CAAC,MAAM,EAAE,OAAO,EACvB,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,IACpB;AACA,UAAM,SAA+B,CAAC;AACtC,eAAW,CAAC,IAAI,QAAQ,KAAK,KAAK,UAAU,QAAQ,GAAG;AACrD,UAAI,WAAW,IAAI,EAAE,GAAG;AACtB,eAAO,KAAK,QAAQ;AAAA,MACtB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,iBACE,OACA,QACsB;AAEtB,QAAI,UAAU,UAAW,QAAO,CAAC;AAEjC,UAAM,aAAa,OAAO;AAC1B,UAAM,cACJ,UAAU,aACN,WAAW,WACX,UAAU,SACR,WAAW,OACX,UAAU,WACR,WAAW,SACX,WAAW;AAErB,UAAM,aAAa,IAAI;AAAA,MACrB,OAAO,UACJ,OAAO,CAAC,MAAM,EAAE,OAAO,EACvB,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,IACpB;AAEA,UAAM,SAA+B,CAAC;AACtC,eAAW,MAAM,aAAa;AAC5B,UAAI,CAAC,WAAW,IAAI,EAAE,EAAG;AACzB,YAAM,WAAW,KAAK,UAAU,IAAI,EAAE;AACtC,UAAI,UAAU;AACZ,eAAO,KAAK,QAAQ;AAAA,MACtB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;;;AC1DO,IAAM,oBAAN,MAAsD;AAAA,EAClD,KAAK;AAAA,EACL,WAA+B;AAAA,EAEvB;AAAA,EAEjB,YAAY,UAAoC,CAAC,GAAG;AAClD,SAAK,WAAW,QAAQ;AAAA,EAC1B;AAAA,EAEA,MAAM,cAAgC;AACpC,WAAO,KAAK,aAAa;AAAA,EAC3B;AAAA,EAEA,MAAM,OAAO,QAA+D;AAC1E,QAAI,CAAC,KAAK,SAAU,QAAO,CAAC;AAE5B,UAAM,QAAQ,GAAG,OAAO,IAAI,IAAI,OAAO,IAAI;AAC3C,UAAM,WAAW,MAAM,KAAK,SAAS,KAAK;AAE1C,WAAO,SACJ,OAAO,CAAC,MAAM,OAAO,MAAM,YAAY,EAAE,KAAK,EAAE,SAAS,CAAC,EAC1D,IAAI,CAAC,aAAa;AAAA,MACjB,MAAM,QAAQ,KAAK;AAAA,MACnB,QAAQ,KAAK;AAAA,MACb,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,MAAM,CAAC,YAAY;AAAA,IACrB,EAAE;AAAA,EACN;AACF;;;ACzBA,IAAM,cAAc,oBAAI,IAA6B;AAErD,SAAS,cACP,UACA,QACS;AACT,QAAM,cAAc,OAAO,UAAU,KAAK,CAAC,MAAM,EAAE,OAAO,SAAS,EAAE;AACrE,MAAI,CAAC,aAAa,UAAW,QAAO;AAEpC,QAAM,MAAM,KAAK,IAAI;AACrB,MAAI,SAAS,YAAY,IAAI,SAAS,EAAE;AACxC,MAAI,CAAC,QAAQ;AACX,aAAS;AAAA,MACP,aAAa;AAAA,MACb,aAAa,MAAM;AAAA,MACnB,UAAU;AAAA,MACV,UAAU,MAAM;AAAA,IAClB;AACA,gBAAY,IAAI,SAAS,IAAI,MAAM;AAAA,EACrC;AAGA,MAAI,OAAO,OAAO,aAAa;AAC7B,WAAO,cAAc;AACrB,WAAO,cAAc,MAAM;AAAA,EAC7B;AACA,MAAI,OAAO,OAAO,UAAU;AAC1B,WAAO,WAAW;AAClB,WAAO,WAAW,MAAM;AAAA,EAC1B;AAEA,QAAM,EAAE,cAAc,UAAU,IAAI,YAAY;AAChD,SAAO,OAAO,eAAe,gBAAgB,OAAO,YAAY;AAClE;AAEA,SAAS,WACP,YACM;AACN,QAAM,SAAS,YAAY,IAAI,UAAU;AACzC,MAAI,QAAQ;AACV,WAAO,eAAe;AACtB,WAAO,YAAY;AAAA,EACrB;AACF;AAMA,eAAsB,sBACpB,UACA,UACA,QACA,KAC6B;AAC7B,MAAI,CAAC,OAAO,QAAS,QAAO,CAAC;AAC7B,MAAI,SAAS,WAAW,EAAG,QAAO,CAAC;AAEnC,QAAM,UAA8B,CAAC;AAErC,aAAW,UAAU,UAAU;AAC7B,UAAM,YAAY,SAAS,iBAAiB,OAAO,iBAAiB,MAAM;AAC1E,UAAM,gBAAgB,OAAO;AAC7B,UAAM,6BAA6B,gBAAgB;AACnD,QAAI,2BAA2B,6BAC3B,gBACA,OAAO;AAEX,eAAW,YAAY,WAAW;AAChC,UAAI,8BAA8B,4BAA4B,GAAG;AAC/D;AAAA,MACF;AAEA,YAAM,QAAQ,KAAK,IAAI;AAGvB,UAAI;AACJ,UAAI;AACF,oBAAY,MAAM,SAAS,YAAY;AAAA,MACzC,QAAQ;AACN,oBAAY;AAAA,MACd;AAEA,UAAI,CAAC,WAAW;AACd,YAAI;AAAA,UACF,iCAAiC,SAAS,EAAE,QAAQ,OAAO,IAAI;AAAA,QACjE;AACA,gBAAQ,KAAK;AAAA,UACX,YAAY,OAAO;AAAA,UACnB,UAAU,SAAS;AAAA,UACnB,iBAAiB;AAAA,UACjB,oBAAoB;AAAA,UACpB,oBAAoB;AAAA,UACpB,oBAAoB,CAAC;AAAA,UACrB,SAAS,KAAK,IAAI,IAAI;AAAA,QACxB,CAAC;AACD;AAAA,MACF;AAGA,UAAI,cAAc,UAAU,MAAM,GAAG;AACnC,YAAI;AAAA,UACF,iCAAiC,SAAS,EAAE,QAAQ,OAAO,IAAI;AAAA,QACjE;AACA,gBAAQ,KAAK;AAAA,UACX,YAAY,OAAO;AAAA,UACnB,UAAU,SAAS;AAAA,UACnB,iBAAiB;AAAA,UACjB,oBAAoB;AAAA,UACpB,oBAAoB;AAAA,UACpB,oBAAoB,CAAC;AAAA,UACrB,SAAS,KAAK,IAAI,IAAI;AAAA,QACxB,CAAC;AACD;AAAA,MACF;AAMA,UAAI;AACJ,UAAI;AACF,qBAAa,MAAM,SAAS,OAAO,MAAM;AAAA,MAC3C,SAAS,KAAK;AACZ,mBAAW,SAAS,EAAE;AACtB,YAAI;AAAA,UACF,wBAAwB,SAAS,EAAE,eAAe,OAAO,IAAI,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,QACpH;AACA,gBAAQ,KAAK;AAAA,UACX,YAAY,OAAO;AAAA,UACnB,UAAU,SAAS;AAAA,UACnB,iBAAiB;AAAA,UACjB,oBAAoB;AAAA,UACpB,oBAAoB;AAAA,UACpB,oBAAoB,CAAC;AAAA,UACrB,SAAS,KAAK,IAAI,IAAI;AAAA,QACxB,CAAC;AACD;AAAA,MACF;AACA,iBAAW,SAAS,EAAE;AAGtB,iBAAW,aAAa,YAAY;AAClC,kBAAU,SAAS,SAAS;AAAA,MAC9B;AAIA,UAAI;AACJ,UAAI,kBAAkB,GAAG;AACvB,mBAAW,CAAC;AAAA,MACd,WAAW,4BAA4B;AACrC,mBAAW,WAAW,MAAM,GAAG,wBAAwB;AACvD,oCAA4B,SAAS;AAAA,MACvC,OAAO;AACL,mBAAW;AAAA,MACb;AACA,YAAM,WAAW,WAAW,SAAS,SAAS;AAE9C,cAAQ,KAAK;AAAA,QACX,YAAY,OAAO;AAAA,QACnB,UAAU,SAAS;AAAA,QACnB,iBAAiB,WAAW;AAAA,QAC5B,oBAAoB,SAAS;AAAA,QAC7B,oBAAoB;AAAA,QACpB,oBAAoB;AAAA,QACpB,SAAS,KAAK,IAAI,IAAI;AAAA,MACxB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;;;ACpMA,SAAS,OAAO,UAAU,kBAAkB;AAC5C,SAAS,kBAAkB;AAC3B,OAAO,UAAU;AAoBjB,IAAM,iBAAiB;AAEvB,SAAS,cAAc,UAA0B;AAC/C,SAAO,KAAK,KAAK,UAAU,cAAc;AAC3C;AAUA,eAAsB,iBACpB,UACA,OACe;AACf,QAAM,MAAM,UAAU,EAAE,WAAW,KAAK,CAAC;AACzC,QAAM,OAAO,KAAK,UAAU,KAAK,IAAI;AACrC,QAAM,WAAW,cAAc,QAAQ,GAAG,MAAM,OAAO;AACzD;AAMA,eAAsB,aACpB,UACA,OACiC;AACjC,QAAM,WAAW,cAAc,QAAQ;AACvC,MAAI,CAAC,WAAW,QAAQ,EAAG,QAAO,CAAC;AACnC,QAAM,UAAU,UAAU,SAAY,SAAY,KAAK,MAAM,KAAK;AAClE,MAAI,UAAU,UAAa,CAAC,OAAO,SAAS,OAAO,GAAG;AACpD,UAAM,IAAI,MAAM,6CAA6C,KAAK,EAAE;AAAA,EACtE;AAEA,QAAM,MAAM,MAAM,SAAS,UAAU,OAAO;AAC5C,QAAM,UAAkC,CAAC;AAEzC,aAAW,QAAQ,IAAI,MAAM,IAAI,GAAG;AAClC,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,QAAQ,WAAW,EAAG;AAC1B,QAAI;AACF,YAAM,SAAkB,KAAK,MAAM,OAAO;AAC1C,UACE,OAAO,WAAW,YAClB,WAAW,QACX,eAAe,UACf,gBAAgB,QAChB;AACA,cAAM,QAAQ;AACd,YAAI,OAAO,MAAM,cAAc,SAAU;AACzC,cAAM,UAAU,KAAK,MAAM,MAAM,SAAS;AAC1C,YAAI,CAAC,OAAO,SAAS,OAAO,EAAG;AAC/B,YAAI,YAAY,UAAa,UAAU,QAAS;AAChD,gBAAQ,KAAK,KAAK;AAAA,MACpB;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
|
|
@@ -104,6 +104,19 @@ function pairPath(memoryDir, pairId) {
|
|
|
104
104
|
}
|
|
105
105
|
return path.join(reviewDir(memoryDir), `${pairId}.json`);
|
|
106
106
|
}
|
|
107
|
+
function isSafeReviewJsonFile(memoryDir, filePath) {
|
|
108
|
+
const root = path.resolve(reviewDir(memoryDir));
|
|
109
|
+
const resolved = path.resolve(filePath);
|
|
110
|
+
const relative = path.relative(root, resolved);
|
|
111
|
+
if (relative === "" || relative.startsWith("..") || path.isAbsolute(relative)) {
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
try {
|
|
115
|
+
return fs.lstatSync(resolved).isFile();
|
|
116
|
+
} catch {
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
107
120
|
function ensureDir(memoryDir) {
|
|
108
121
|
const dir = reviewDir(memoryDir);
|
|
109
122
|
if (!fs.existsSync(dir)) {
|
|
@@ -150,31 +163,32 @@ function writePair(memoryDir, pair, options = {}) {
|
|
|
150
163
|
if (isTerminalResolution(existing?.resolution)) {
|
|
151
164
|
return existing;
|
|
152
165
|
}
|
|
153
|
-
|
|
166
|
+
const contentChanged = Boolean(existing && suppliedMemoryHashesChanged(existing, pair));
|
|
167
|
+
if (existing?.resolution === "both-valid" && options.cooldownDays === void 0 && !contentChanged) {
|
|
154
168
|
return existing;
|
|
155
169
|
}
|
|
156
170
|
const existingDeferralExpired = Boolean(existing && isDeferred(existing) && !isDeferralActive(existing));
|
|
157
|
-
if (existing && isDeferralActive(existing)) {
|
|
171
|
+
if (existing && isDeferralActive(existing) && !contentChanged) {
|
|
158
172
|
return existing;
|
|
159
173
|
}
|
|
160
174
|
const existingDormantCooldownActive = Boolean(
|
|
161
175
|
existing && isDormantReviewedPair(existing) && options.cooldownDays !== void 0 && isCoolingDown(existing, options.cooldownDays)
|
|
162
176
|
);
|
|
163
177
|
const dormantContentChanged = Boolean(
|
|
164
|
-
existing && existingDormantCooldownActive &&
|
|
178
|
+
existing && existingDormantCooldownActive && contentChanged
|
|
165
179
|
);
|
|
166
180
|
const existingDormantExpired = Boolean(
|
|
167
181
|
existing && isDormantReviewedPair(existing) && options.cooldownDays !== void 0 && !existingDormantCooldownActive
|
|
168
182
|
);
|
|
169
|
-
if (existing && !existingDeferralExpired && (existingDormantCooldownActive && !dormantContentChanged || !existingDormantExpired && !
|
|
183
|
+
if (existing && !existingDeferralExpired && (existingDormantCooldownActive && !dormantContentChanged || !existingDormantExpired && !contentChanged && existing.confidence >= pair.confidence)) {
|
|
170
184
|
return existing;
|
|
171
185
|
}
|
|
172
186
|
const full = {
|
|
173
187
|
...pair,
|
|
174
188
|
pairId,
|
|
175
|
-
lastReviewedAt: existingDeferralExpired || existingDormantExpired ||
|
|
189
|
+
lastReviewedAt: existingDeferralExpired || existingDormantExpired || contentChanged ? pair.lastReviewedAt : existing?.lastReviewedAt ?? pair.lastReviewedAt,
|
|
176
190
|
resolution: void 0,
|
|
177
|
-
deferredUntil: existingDeferralExpired || existingDormantExpired ||
|
|
191
|
+
deferredUntil: existingDeferralExpired || existingDormantExpired || contentChanged ? void 0 : existing?.deferredUntil
|
|
178
192
|
};
|
|
179
193
|
const filePath = pairPath(memoryDir, pairId);
|
|
180
194
|
writePairFile(filePath, full);
|
|
@@ -194,6 +208,7 @@ function writePairs(memoryDir, pairs, options = {}) {
|
|
|
194
208
|
function readPair(memoryDir, pairId) {
|
|
195
209
|
const filePath = pairPath(memoryDir, pairId);
|
|
196
210
|
try {
|
|
211
|
+
if (!isSafeReviewJsonFile(memoryDir, filePath)) return null;
|
|
197
212
|
const raw = fs.readFileSync(filePath, "utf-8");
|
|
198
213
|
const parsed = JSON.parse(raw);
|
|
199
214
|
if (typeof parsed === "object" && parsed !== null && Array.isArray(parsed.memoryIds)) {
|
|
@@ -216,7 +231,9 @@ function listPairs(memoryDir, options) {
|
|
|
216
231
|
for (const entry of fs.readdirSync(dir)) {
|
|
217
232
|
if (!entry.endsWith(".json")) continue;
|
|
218
233
|
try {
|
|
219
|
-
const
|
|
234
|
+
const filePath = path.join(dir, entry);
|
|
235
|
+
if (!isSafeReviewJsonFile(memoryDir, filePath)) continue;
|
|
236
|
+
const raw = fs.readFileSync(filePath, "utf-8");
|
|
220
237
|
const pair = JSON.parse(raw);
|
|
221
238
|
if (typeof pair !== "object" || pair === null) continue;
|
|
222
239
|
if (!Array.isArray(pair.memoryIds)) continue;
|
|
@@ -250,6 +267,7 @@ function migrateUnscopedPairsToNamespace(memoryDir, namespace, options = {}) {
|
|
|
250
267
|
if (!entry.endsWith(".json")) continue;
|
|
251
268
|
const filePath = path.join(dir, entry);
|
|
252
269
|
try {
|
|
270
|
+
if (!isSafeReviewJsonFile(memoryDir, filePath)) continue;
|
|
253
271
|
const raw = fs.readFileSync(filePath, "utf-8");
|
|
254
272
|
const pair = JSON.parse(raw);
|
|
255
273
|
if (typeof pair !== "object" || pair === null) continue;
|
|
@@ -265,6 +283,10 @@ function migrateUnscopedPairsToNamespace(memoryDir, namespace, options = {}) {
|
|
|
265
283
|
writePairFile(targetPath, migratedPair);
|
|
266
284
|
fs.rmSync(filePath, { force: true });
|
|
267
285
|
} else {
|
|
286
|
+
if (!isSafeReviewJsonFile(memoryDir, targetPath)) {
|
|
287
|
+
hadMigrationFailure = true;
|
|
288
|
+
continue;
|
|
289
|
+
}
|
|
268
290
|
const existing = readPair(memoryDir, pairId);
|
|
269
291
|
writePairFile(targetPath, existing ? mergeMigratedPair(existing, migratedPair, options) : migratedPair);
|
|
270
292
|
fs.rmSync(filePath, { force: true });
|
|
@@ -358,4 +380,4 @@ export {
|
|
|
358
380
|
deferPair,
|
|
359
381
|
memoryHashesChanged
|
|
360
382
|
};
|
|
361
|
-
//# sourceMappingURL=chunk-
|
|
383
|
+
//# sourceMappingURL=chunk-HLAVGJ62.js.map
|