@lucern/graph-sync 1.0.0 → 1.0.1

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/convex.ts","../src/neo4jDriver.ts","../src/neo4jSync.ts"],"names":["v"],"mappings":";;;;;;AAc0B,iBAAA;AACnB,IAAM,QAAA,GAAW,MAAA;AAoBjB,IAAM,cAAA,GACX,qBAAA;ACXF,IAAM,iBAAA,uBAAwB,GAAA,CAAI;AAAA;AAAA,EAEhC,YAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA;AAAA,EAEA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,IAAM,wBAAA,uBAA+B,GAAA,CAAI;AAAA;AAAA,EAEvC,gBAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,mBAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA;AAAA,EAEA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,cAAA;AAAA,EACA,gBAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,iBAAA;AAAA,EACA,aAAA;AAAA,EACA,gBAAA;AAAA,EACA,UAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,kBAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,SAAA;AAAA,EACA,gBAAA;AAAA,EACA,eAAA;AAAA;AAAA,EAEA,WAAA;AAAA,EACA,gBAAA;AAAA,EACA,UAAA;AAAA,EACA,iBAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,iBAAA;AAAA,EACA,mBAAA;AAAA,EACA,0BAAA;AAAA,EACA;AACF,CAAC,CAAA;AAEM,SAAS,cAAc,KAAA,EAAqB;AACjD,EAAA,IAAI,CAAC,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA,EAAG;AACjC,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,qCAAA,EAAwC,KAAK,CAAA,kBAAA,EAAqB,KAAA,CAAM,KAAK,iBAAiB,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,KAC5G;AAAA,EACF;AACF;AAEO,SAAS,gBAAgB,OAAA,EAAuB;AACrD,EAAA,IAAI,CAAC,wBAAA,CAAyB,GAAA,CAAI,OAAO,CAAA,EAAG;AAC1C,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,4CAAA,EAA+C,OAAO,CAAA,kBAAA,EAAqB,KAAA,CAAM,KAAK,wBAAwB,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,KAC5H;AAAA,EACF;AACF;AAMA,IAAI,MAAA,GAAwB,IAAA;AAE5B,SAAS,SAAA,GAAoB;AAC3B,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,CAAI,SAAA;AACxB,IAAA,MAAM,IAAA,GAAO,QAAQ,GAAA,CAAI,UAAA;AACzB,IAAA,MAAM,QAAA,GAAW,QAAQ,GAAA,CAAI,cAAA;AAE7B,IAAA,IAAI,CAAC,GAAA,IAAO,CAAC,IAAA,IAAQ,CAAC,QAAA,EAAU;AAC9B,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAA,GAAS,KAAA,CAAM,OAAO,GAAA,EAAK,KAAA,CAAM,KAAK,KAAA,CAAM,IAAA,EAAM,QAAQ,CAAA,EAAG;AAAA;AAAA,MAE3D,qBAAA,EAAuB,EAAA;AAAA,MACvB,4BAAA,EAA8B,GAAA;AAAA;AAAA,MAE9B,OAAA,EAAS;AAAA,QACP,KAAA,EAAO,MAAA;AAAA,QACP,MAAA,EAAQ,CAAC,KAAA,EAAO,OAAA,KAAY,OAAA,CAAQ,IAAI,CAAA,OAAA,EAAU,KAAK,CAAA,EAAA,EAAK,OAAO,CAAA,CAAE;AAAA;AACvE,KACD,CAAA;AAAA,EACH;AACA,EAAA,OAAO,MAAA;AACT;AAUO,IAAM,wBAAA,GAA2B,GAAA;AAKjC,IAAM,wBAAA,GAA2B,GAAA;AAUxC,SAAS,cACP,MAAA,EACyB;AACzB,EAAA,MAAM,SAAkC,EAAC;AACzC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,MAAA,CAAO,SAAA,CAAU,KAAK,CAAA,EAAG;AAExD,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA,CAAM,GAAA,CAAI,KAAK,CAAA;AAAA,IAC/B,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC/B,MAAA,MAAA,CAAO,GAAG,IAAI,KAAA,CAAM,GAAA;AAAA,QAAI,CAACA,EAAAA,KACvB,OAAOA,EAAAA,KAAM,QAAA,IAAY,MAAA,CAAO,SAAA,CAAUA,EAAC,CAAA,GAAI,KAAA,CAAM,GAAA,CAAIA,EAAC,CAAA,GAAIA;AAAA,OAChE;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AAAA,IAChB;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AASA,eAAsB,UACpB,KAAA,EACA,MAAA,GAAkC,EAAC,EACnC,YAAoB,wBAAA,EACN;AACd,EAAA,MAAM,cAAc,SAAA,EAAU;AAC9B,EAAA,MAAM,OAAA,GAAU,YAAY,OAAA,EAAQ;AAEpC,EAAA,IAAI;AACF,IAAA,MAAM,WAAA,GAAc,cAAc,MAAM,CAAA;AACxC,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,GAAA,CAAI,OAAO,WAAA,EAAa;AAAA,MACnD,OAAA,EAAS,KAAA,CAAM,GAAA,CAAI,SAAS;AAAA,KAC7B,CAAA;AACD,IAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW;AACpC,MAAA,MAAM,MAA+B,EAAC;AACtC,MAAA,KAAA,MAAW,GAAA,IAAO,OAAO,IAAA,EAAM;AAC7B,QAAA,MAAM,KAAA,GAAQ,OAAO,GAAG,CAAA;AACxB,QAAA,GAAA,CAAI,KAAK,CAAA,GAAI,iBAAA,CAAkB,MAAA,CAAO,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,MAClD;AACA,MAAA,OAAO,GAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA,SAAE;AACA,IAAA,MAAM,QAAQ,KAAA,EAAM;AAAA,EACtB;AACF;AASA,eAAsB,oBACpB,KAAA,EACA,MAAA,GAAkC,EAAC,EACnC,YAAoB,wBAAA,EACN;AACd,EAAA,MAAM,cAAc,SAAA,EAAU;AAC9B,EAAA,MAAM,OAAA,GAAU,YAAY,OAAA,EAAQ;AAEpC,EAAA,IAAI;AACF,IAAA,MAAM,WAAA,GAAc,cAAc,MAAM,CAAA;AACxC,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,YAAA;AAAA,MAC3B,OAAO,EAAA,KAAO;AACZ,QAAA,OAAO,MAAM,EAAA,CAAG,GAAA,CAAI,KAAA,EAAO,WAAW,CAAA;AAAA,MACxC,CAAA;AAAA,MACA,EAAE,SAAS,SAAA;AAAU,KACvB;AACA,IAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW;AACpC,MAAA,MAAM,MAA+B,EAAC;AACtC,MAAA,KAAA,MAAW,GAAA,IAAO,OAAO,IAAA,EAAM;AAC7B,QAAA,MAAM,KAAA,GAAQ,OAAO,GAAG,CAAA;AACxB,QAAA,GAAA,CAAI,KAAK,CAAA,GAAI,iBAAA,CAAkB,MAAA,CAAO,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,MAClD;AACA,MAAA,OAAO,GAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA,SAAE;AACA,IAAA,MAAM,QAAQ,KAAA,EAAM;AAAA,EACtB;AACF;AAQA,eAAsB,mBAAA,CACpB,OAAA,EACA,SAAA,GAAoB,wBAAA,EACL;AACf,EAAA,MAAM,cAAc,SAAA,EAAU;AAC9B,EAAA,MAAM,OAAA,GAAU,YAAY,OAAA,EAAQ;AAEpC,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,CAAQ,YAAA;AAAA,MACZ,OAAO,EAAA,KAAO;AACZ,QAAA,KAAA,MAAW,EAAE,KAAA,EAAO,MAAA,EAAO,IAAK,OAAA,EAAS;AACvC,UAAA,MAAM,EAAA,CAAG,GAAA,CAAI,KAAA,EAAO,MAAM,CAAA;AAAA,QAC5B;AAAA,MACF,CAAA;AAAA,MACA,EAAE,SAAS,SAAA;AAAU,KACvB;AAAA,EACF,CAAA,SAAE;AACA,IAAA,MAAM,QAAQ,KAAA,EAAM;AAAA,EACtB;AACF;AASA,eAAsB,UAAA,CACpB,KAAA,EACA,QAAA,EACA,UAAA,EACe;AACf,EAAA,aAAA,CAAc,KAAK,CAAA;AACnB,EAAA,MAAM,mBAAA;AAAA,IACJ;AAAA,aAAA,EACW,KAAK,CAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,IAIhB,EAAE,UAAU,UAAA;AAAW,GACzB;AACF;AAKA,eAAsB,WAAW,QAAA,EAAiC;AAChE,EAAA,MAAM,mBAAA;AAAA,IACJ;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,IAIA,EAAE,QAAA;AAAS,GACb;AACF;AAKA,eAAsB,gBAAA,CACpB,OACA,KAAA,EACe;AACf,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA;AAAA,EACF;AAEA,EAAA,aAAA,CAAc,KAAK,CAAA;AACnB,EAAA,MAAM,mBAAA;AAAA,IACJ;AAAA;AAAA,aAAA,EAEW,KAAK,CAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,IAIhB,EAAE,KAAA;AAAM,GACV;AACF;AASA,eAAsB,WACpB,OAAA,EACA,QAAA,EACA,cACA,UAAA,EACA,UAAA,GAAsC,EAAC,EACxB;AACf,EAAA,eAAA,CAAgB,OAAO,CAAA;AACvB,EAAA,MAAM,mBAAA;AAAA,IACJ;AAAA;AAAA;AAAA,oBAAA,EAGkB,OAAO,CAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,IAIzB,EAAE,QAAA,EAAU,YAAA,EAAc,UAAA,EAAY,UAAA;AAAW,GACnD;AACF;AAKA,eAAsB,WAAW,QAAA,EAAiC;AAChE,EAAA,MAAM,mBAAA;AAAA,IACJ;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,IAIA,EAAE,QAAA;AAAS,GACb;AACF;AAKA,eAAsB,iBACpB,KAAA,EAOe;AACf,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,MAAA,uBAAa,GAAA,EAA0B;AAC7C,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,WAAW,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,OAAO,KAAK,EAAC;AAC9C,IAAA,QAAA,CAAS,KAAK,IAAI,CAAA;AAClB,IAAA,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,OAAA,EAAS,QAAQ,CAAA;AAAA,EACnC;AAEA,EAAA,MAAM,UAAqE,EAAC;AAC5E,EAAA,KAAA,MAAW,CAAC,OAAA,EAAS,SAAS,CAAA,IAAK,MAAA,EAAQ;AACzC,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,MACX,KAAA,EAAO;AAAA;AAAA;AAAA;AAAA,wBAAA,EAIa,OAAO,CAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAAA,MAI3B,MAAA,EAAQ;AAAA,QACN,KAAA,EAAO,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,UAC3B,UAAU,CAAA,CAAE,QAAA;AAAA,UACZ,cAAc,CAAA,CAAE,YAAA;AAAA,UAChB,YAAY,CAAA,CAAE,UAAA;AAAA,UACd,UAAA,EAAY,CAAA,CAAE,UAAA,IAAc;AAAC,SAC/B,CAAE;AAAA;AACJ,KACD,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,oBAAoB,OAAO,CAAA;AACnC;AASA,eAAsB,WAAA,GAInB;AACD,EAAA,IAAI;AACF,IAAA,MAAM,SAAS,MAAM,SAAA;AAAA,MACnB;AAAA,KACF;AACA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,SAAA,EAAW,MAAA,CAAO,CAAC,CAAA,EAAG,KAAA,IAAS;AAAA,KACjC;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,KAClD;AAAA,EACF;AACF;AAKO,SAAS,iBAAA,GAId;AACA,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,QAAQ,GAAA,CAAI,SAAA;AAAA,IACjB,IAAA,EAAM,QAAQ,GAAA,CAAI,UAAA;AAAA,IAClB,UAAA,EAAY,OAAA;AAAA,MACV,QAAQ,GAAA,CAAI,SAAA,IACV,QAAQ,GAAA,CAAI,UAAA,IACZ,QAAQ,GAAA,CAAI;AAAA;AAChB,GACF;AACF;AASA,SAAS,kBAAkB,KAAA,EAAyB;AAClD,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AACzC,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA,EAAG;AACtB,IAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA;AAAA,EACrC;AAGA,EAAA,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAA,IAAK,KAAA,CAAM,UAAA,CAAW,KAAK,CAAA,IAAK,KAAA,CAAM,MAAA,CAAO,KAAK,CAAA,EAAG;AACzE,IAAA,OAAO,MAAM,QAAA,EAAS;AAAA,EACxB;AAGA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,KAAA,CAAM,IAAI,iBAAiB,CAAA;AAAA,EACpC;AAGA,EAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,gBAAgB,KAAA,EAAO;AAC/D,IAAA,MAAM,OAAA,GAAU,KAAA;AAChB,IAAA,MAAM,SAAkC,EAAC;AACzC,IAAA,KAAA,MAAW,CAAC,GAAGA,EAAC,CAAA,IAAK,OAAO,OAAA,CAAQ,OAAA,CAAQ,UAAU,CAAA,EAAG;AACvD,MAAA,MAAA,CAAO,CAAC,CAAA,GAAI,iBAAA,CAAkBA,EAAC,CAAA;AAAA,IACjC;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAM,SAAkC,EAAC;AACzC,IAAA,KAAA,MAAW,CAAC,CAAA,EAAGA,EAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAgC,CAAA,EAAG;AACrE,MAAA,MAAA,CAAO,CAAC,CAAA,GAAI,iBAAA,CAAkBA,EAAC,CAAA;AAAA,IACjC;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA;AACT;;;AC5cA,SAAS,iBAAA,CACP,UAAA,EACA,SAAA,EACA,MAAA,EAMY;AACZ,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA,SAAA;AAAA,IACA,GAAG;AAAA,GACL;AACF;AAEA,SAAS,gBAAA,CACP,UAAA,EACA,SAAA,EACA,MAAA,EAIY;AACZ,EAAA,OAAO,iBAAA,CAAkB,YAAY,SAAA,EAAW;AAAA,IAC9C,OAAA,EAAS,IAAA;AAAA,IACT,GAAG;AAAA,GACJ,CAAA;AACH;AAEA,SAAS,gBAAA,CACP,UAAA,EACA,SAAA,EACA,KAAA,EACA,MAAA,EAIY;AACZ,EAAA,OAAO,iBAAA,CAAkB,YAAY,SAAA,EAAW;AAAA,IAC9C,OAAA,EAAS,KAAA;AAAA,IACT,KAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAUA,SAAS,oBACP,IAAA,EAqByB;AACzB,EAAA,MAAM,QAAA,GAAY,IAAA,CAAK,QAAA,IAAY,EAAC;AACpC,EAAA,MAAM,MAAA,GAAU,QAAA,CAAS,MAAA,IAAU,QAAA,CAAS,KAAA,IAAS,EAAA;AACrD,EAAA,MAAM,KAAA,GAAS,QAAA,CAAS,KAAA,IAAS,QAAA,CAAS,WAAA,IAAe,EAAA;AACzD,EAAA,MAAM,WAAA,GAAe,SAAS,WAAA,IAAe,EAAA;AAC7C,EAAA,MAAM,eAAA,GAAmB,QAAA,CAAS,eAAA,IAAmB,EAAC;AAGtD,EAAA,MAAM,eAAA,GAAmB,KAAK,eAAA,IAA8B,EAAA;AAC5D,EAAA,MAAM,WAAA,GAAe,KAAK,WAAA,IAA0B,EAAA;AACpD,EAAA,MAAM,oBAAA,GAAwB,KAAK,oBAAA,IAAmC,EAAA;AACtE,EAAA,MAAM,YAAA,GAAgB,KAAK,YAAA,IAA2B,EAAA;AACtD,EAAA,MAAM,gBAAA,GAAoB,KAAK,gBAAA,IAA+B,EAAA;AAC9D,EAAA,MAAM,aAAA,GAAiB,KAAK,aAAA,IAA4B,EAAA;AACxD,EAAA,MAAM,aAAA,GAAiB,KAAK,aAAA,IAA4B,EAAA;AACxD,EAAA,MAAM,iBAAiB,IAAA,CAAK,cAAA;AAI5B,EAAA,OAAO;AAAA,IACL,UAAU,IAAA,CAAK,GAAA;AAAA,IACf,aAAA,EAAe,KAAK,aAAA,IAAiB,EAAA;AAAA,IACrC,KAAA,EAAO,KAAK,KAAA,IAAS,EAAA;AAAA,IACrB,MAAA,EAAQ,KAAK,MAAA,IAAU,QAAA;AAAA,IACvB,OAAA,EAAS,KAAK,OAAA,IAAW,EAAA;AAAA,IACzB,MAAA,EAAQ,KAAK,MAAA,IAAU,EAAA;AAAA,IACvB,UAAA,EAAY,KAAK,UAAA,IAAc,CAAA;AAAA,IAC/B,kBAAA,EAAoB,KAAK,kBAAA,IAAsB,YAAA;AAAA,IAC/C,UAAA,EAAY,KAAK,UAAA,IAAc,SAAA;AAAA,IAC/B,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,SAAA,EAAW,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,GAAA,EAAI;AAAA,IACtC,SAAA,EAAW,KAAK,SAAA,IAAa,EAAA;AAAA,IAC7B,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,cAAA,EAAgB,KAAK,cAAA,IAAkB,EAAA;AAAA;AAAA,IAEvC,SAAA,EAAW,KAAK,SAAA,IAAa,EAAA;AAAA,IAC7B,QAAA,EAAU,KAAK,QAAA,IAAY,EAAA;AAAA,IAC3B,WAAA,EAAa,KAAK,WAAA,IAAe,EAAA;AAAA,IACjC,MAAA;AAAA,IACA,KAAA;AAAA,IACA,WAAA;AAAA,IACA,sBAAsB,eAAA,CAAgB,MAAA;AAAA;AAAA,IAEtC,eAAA;AAAA,IACA,WAAA;AAAA,IACA,oBAAA;AAAA,IACA,YAAA;AAAA,IACA,gBAAA;AAAA,IACA,aAAA;AAAA,IACA,aAAA;AAAA,IACA,YAAA,EAAc,cAAA,EAAgB,YAAA,GAAe,MAAA,GAAS,OAAA;AAAA,IACtD,YAAY,cAAA,EAAgB,UAAA,GACxB,MAAA,CAAO,cAAA,CAAe,UAAU,CAAA,GAChC;AAAA,GACN;AACF;AAMA,SAAS,oBACP,IAAA,EAkByB;AACzB,EAAA,OAAO;AAAA,IACL,UAAU,IAAA,CAAK,GAAA;AAAA,IACf,MAAA,EAAQ,KAAK,MAAA,IAAU,CAAA;AAAA,IACvB,UAAA,EAAY,KAAK,UAAA,IAAc,CAAA;AAAA,IAC/B,OAAA,EAAS,KAAK,OAAA,IAAW,EAAA;AAAA,IACzB,cAAA,EAAgB,KAAK,cAAA,IAAkB,EAAA;AAAA,IACvC,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,SAAA,EAAW,KAAK,SAAA,IAAa,EAAA;AAAA,IAC7B,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,SAAA,EAAW,KAAK,SAAA,IAAa,EAAA;AAAA,IAC7B,OAAA,EAAS,KAAK,OAAA,IAAW,EAAA;AAAA,IACzB,SAAA,EAAW,KAAK,SAAA,IAAa,EAAA;AAAA,IAC7B,QAAA,EAAU,KAAK,QAAA,IAAY,EAAA;AAAA,IAC3B,WAAA,EAAa,KAAK,WAAA,IAAe,EAAA;AAAA;AAAA,IAEjC,eAAA,EAAiB,KAAK,eAAA,IAAmB,EAAA;AAAA,IACzC,WAAA,EAAa,KAAK,WAAA,IAAe,EAAA;AAAA,IACjC,aAAA,EAAe,KAAK,aAAA,IAAiB;AAAA,GACvC;AACF;AAMO,IAAM,kBAAkB,cAAA,CAAe;AAAA,EAC5C,IAAA,EAAM;AAAA,IACJ,MAAA,EAAQ,CAAA,CAAE,EAAA,CAAG,gBAAgB,CAAA;AAAA,IAC7B,SAAA,EAAW,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,OAAA,CAAQ,QAAQ,CAAA,EAAG,CAAA,CAAE,OAAA,CAAQ,QAAQ,CAAC;AAAA,GAC7D;AAAA,EACA,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,OAAO,GAAA,EAAK,IAAA,KAAS;AAC5B,IAAA,MAAM,WAAW,iBAAA,EAAkB;AACnC,IAAA,IAAI,CAAC,SAAS,UAAA,EAAY;AACxB,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN;AAAA,OACF;AACA,MAAA,OAAO,gBAAA,CAAiB,MAAA,EAAQ,IAAA,CAAK,SAAA,EAAW,qBAAA,EAAuB;AAAA,QACrE,aAAA,EAAe;AAAA,OAChB,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,OAAO,MAAM,GAAA,CAAI,QAAA,CAAS,QAAA,CAAS,iBAAiB,cAAA,EAAgB;AAAA,MACxE,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAED,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,IAAI,IAAA,CAAK,cAAc,QAAA,EAAU;AAC/B,QAAA,OAAO,gBAAA,CAAiB,MAAA,EAAQ,IAAA,CAAK,SAAA,EAAW,gBAAA,EAAkB;AAAA,UAChE,aAAA,EAAe;AAAA,SAChB,CAAA;AAAA,MACH;AACA,MAAA,OAAA,CAAQ,IAAI,kDAAkD,CAAA;AAC9D,MAAA,OAAO,gBAAA,CAAiB,MAAA,EAAQ,IAAA,CAAK,SAAA,EAAW;AAAA,QAC9C,OAAA,EAAS,IAAA;AAAA,QACT,aAAA,EAAe;AAAA,OAChB,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,IAAA,CAAK,QAAQ,CAAA,IAAK,MAAA;AAEnD,IAAA,IAAI;AACF,MAAA,IAAI,IAAA,CAAK,cAAc,QAAA,EAAU;AAC/B,QAAA,MAAM,UAAA,CAAW,KAAK,QAAQ,CAAA;AAC9B,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,0BAAA,EAA6B,IAAA,CAAK,QAAQ,CAAA,CAAE,CAAA;AAAA,MAC1D,CAAA,MAAO;AACL,QAAA,MAAM,KAAA,GAAQ,oBAAoB,IAAW,CAAA;AAG7C,QAAA,MAAM,SAAA,GAAY,MAAM,GAAA,CAAI,QAAA;AAAA,UAC1B,SAAS,gBAAA,CAAiB,mBAAA;AAAA,UAC1B,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAA;AAAO,SACxB;AACA,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,KAAA,CAAM,SAAA,GAAY,SAAA;AAAA,QACpB;AAEA,QAAA,MAAM,UAAA,CAAW,KAAA,EAAO,IAAA,CAAK,QAAA,EAAU,KAAK,CAAA;AAC5C,QAAA,OAAA,CAAQ,GAAA;AAAA,UACN,CAAA,2BAAA,EAA8B,IAAA,CAAK,QAAQ,CAAA,IAAA,EAAO,KAAK,CAAA,gBAAA,EAClC,IAAA,CAAK,SAAS,CAAA,CAAA,IAChC,SAAA,GAAY,CAAA,OAAA,EAAU,SAAA,CAAU,MAAM,CAAA,eAAA,CAAA,GAAoB,EAAA;AAAA,SAC/D;AAAA,MACF;AAEA,MAAA,MAAM,GAAA,CAAI,WAAA,CAAY,QAAA,CAAS,gBAAA,CAAiB,YAAA,EAAc;AAAA,QAC5D,WACE,IAAA,CAAK,SAAA,KAAc,QAAA,GACf,cAAA,GACA,OACE,cAAA,GACA,cAAA;AAAA,QACR,UAAU,IAAA,CAAK,MAAA;AAAA,QACf,YAAY,IAAA,CAAK,QAAA;AAAA,QACjB,MAAA,EAAQ;AAAA,OACT,CAAA;AAED,MAAA,OAAO,gBAAA,CAAiB,MAAA,EAAQ,IAAA,CAAK,SAAS,CAAA;AAAA,IAChD,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,QAAA,GAAW,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AAC1D,MAAA,OAAA,CAAQ,KAAA,CAAM,iCAAiC,QAAQ,CAAA;AAEvD,MAAA,MAAM,GAAA,CAAI,WAAA,CAAY,QAAA,CAAS,gBAAA,CAAiB,YAAA,EAAc;AAAA,QAC5D,SAAA,EACE,IAAA,CAAK,SAAA,KAAc,QAAA,GAAW,cAAA,GAAiB,cAAA;AAAA,QACjD,UAAU,IAAA,CAAK,MAAA;AAAA,QACf,YAAY,IAAA,CAAK,QAAA;AAAA,QACjB,MAAA,EAAQ,QAAA;AAAA,QACR,KAAA,EAAO;AAAA,OACR,CAAA;AAED,MAAA,MAAM,GAAA,CAAI,WAAA,CAAY,QAAA,CAAS,gBAAA,CAAiB,aAAA,EAAe;AAAA,QAC7D,UAAA,EAAY,MAAA;AAAA,QACZ,UAAU,IAAA,CAAK,MAAA;AAAA,QACf,WAAW,IAAA,CAAK,SAAA;AAAA,QAChB,KAAA,EAAO;AAAA,OACR,CAAA;AAED,MAAA,OAAO,gBAAA,CAAiB,MAAA,EAAQ,IAAA,CAAK,SAAA,EAAW,QAAQ,CAAA;AAAA,IAC1D;AAAA,EACF;AACF,CAAC;AAMM,IAAM,kBAAkB,cAAA,CAAe;AAAA,EAC5C,IAAA,EAAM;AAAA,IACJ,MAAA,EAAQ,CAAA,CAAE,EAAA,CAAG,gBAAgB,CAAA;AAAA,IAC7B,SAAA,EAAW,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,OAAA,CAAQ,QAAQ,CAAA,EAAG,CAAA,CAAE,OAAA,CAAQ,QAAQ,CAAC;AAAA,GAC7D;AAAA,EACA,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,OAAO,GAAA,EAAK,IAAA,KAAS;AAC5B,IAAA,MAAM,WAAW,iBAAA,EAAkB;AACnC,IAAA,IAAI,CAAC,SAAS,UAAA,EAAY;AACxB,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN;AAAA,OACF;AACA,MAAA,OAAO,gBAAA,CAAiB,MAAA,EAAQ,IAAA,CAAK,SAAA,EAAW,qBAAA,EAAuB;AAAA,QACrE,aAAA,EAAe;AAAA,OAChB,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,OAAO,MAAM,GAAA,CAAI,QAAA,CAAS,QAAA,CAAS,iBAAiB,cAAA,EAAgB;AAAA,MACxE,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAED,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,IAAI,IAAA,CAAK,cAAc,QAAA,EAAU;AAC/B,QAAA,OAAO,gBAAA,CAAiB,MAAA,EAAQ,IAAA,CAAK,SAAA,EAAW,gBAAA,EAAkB;AAAA,UAChE,aAAA,EAAe;AAAA,SAChB,CAAA;AAAA,MACH;AACA,MAAA,OAAA,CAAQ,IAAI,kDAAkD,CAAA;AAC9D,MAAA,OAAO,gBAAA,CAAiB,MAAA,EAAQ,IAAA,CAAK,SAAA,EAAW;AAAA,QAC9C,OAAA,EAAS,IAAA;AAAA,QACT,aAAA,EAAe;AAAA,OAChB,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,IAAgB,CAAC,KAAK,UAAA,EAAY;AAC1C,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN;AAAA,OACF;AACA,MAAA,OAAO,gBAAA;AAAA,QACL,MAAA;AAAA,QACA,IAAA,CAAK,SAAA;AAAA,QACL,uCAAA;AAAA,QACA;AAAA,UACA,aAAA,EAAe;AAAA;AACf,OACF;AAAA,IACF;AAEA,IAAA,MAAM,UACJ,gBAAA,CAAiB,IAAA,CAAK,QAAQ,CAAA,IAAK,IAAA,CAAK,SAAS,WAAA,EAAY;AAE/D,IAAA,IAAI;AACF,MAAA,IAAI,IAAA,CAAK,cAAc,QAAA,EAAU;AAC/B,QAAA,MAAM,UAAA,CAAW,KAAK,QAAQ,CAAA;AAC9B,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,0BAAA,EAA6B,IAAA,CAAK,QAAQ,CAAA,CAAE,CAAA;AAAA,MAC1D,CAAA,MAAO;AACL,QAAA,MAAM,UAAA;AAAA,UACJ,OAAA;AAAA,UACA,IAAA,CAAK,QAAA;AAAA,UACL,IAAA,CAAK,YAAA;AAAA,UACL,IAAA,CAAK,UAAA;AAAA,UACL;AAAA,YACE,UAAU,IAAA,CAAK,MAAA;AAAA,YACf,MAAA,EAAQ,KAAK,MAAA,IAAU,CAAA;AAAA,YACvB,UAAA,EAAY,KAAK,UAAA,IAAc,CAAA;AAAA,YAC/B,OAAA,EAAS,KAAK,OAAA,IAAW,EAAA;AAAA,YACzB,cAAA,EAAgB,KAAK,cAAA,IAAkB,EAAA;AAAA,YACvC,WAAW,IAAA,CAAK,SAAA;AAAA,YAChB,SAAA,EAAW,KAAK,SAAA,IAAa,EAAA;AAAA,YAC7B,UAAU,IAAA,CAAK,QAAA;AAAA,YACf,SAAA,EAAW,KAAK,SAAA,IAAa,EAAA;AAAA,YAC7B,OAAA,EAAS,KAAK,OAAA,IAAW,EAAA;AAAA;AAAA,YAEzB,eAAA,EAAiB,KAAK,eAAA,IAAmB,EAAA;AAAA,YACzC,WAAA,EAAa,KAAK,WAAA,IAAe,EAAA;AAAA,YACjC,aAAA,EAAe,KAAK,aAAA,IAAiB;AAAA;AACvC,SACF;AACA,QAAA,OAAA,CAAQ,GAAA;AAAA,UACN,CAAA,2BAAA,EAA8B,IAAA,CAAK,QAAQ,CAAA,IAAA,EAAO,OAAO,CAAA;AAAA,SAC3D;AAAA,MACF;AAEA,MAAA,MAAM,GAAA,CAAI,WAAA,CAAY,QAAA,CAAS,gBAAA,CAAiB,YAAA,EAAc;AAAA,QAC5D,SAAA,EACE,IAAA,CAAK,SAAA,KAAc,QAAA,GAAW,cAAA,GAAiB,cAAA;AAAA,QACjD,UAAU,IAAA,CAAK,MAAA;AAAA,QACf,YAAY,IAAA,CAAK,QAAA;AAAA,QACjB,MAAA,EAAQ;AAAA,OACT,CAAA;AAED,MAAA,OAAO,gBAAA,CAAiB,MAAA,EAAQ,IAAA,CAAK,SAAS,CAAA;AAAA,IAChD,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,QAAA,GAAW,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AAC1D,MAAA,OAAA,CAAQ,KAAA,CAAM,iCAAiC,QAAQ,CAAA;AAEvD,MAAA,MAAM,GAAA,CAAI,WAAA,CAAY,QAAA,CAAS,gBAAA,CAAiB,YAAA,EAAc;AAAA,QAC5D,SAAA,EACE,IAAA,CAAK,SAAA,KAAc,QAAA,GAAW,cAAA,GAAiB,cAAA;AAAA,QACjD,UAAU,IAAA,CAAK,MAAA;AAAA,QACf,YAAY,IAAA,CAAK,QAAA;AAAA,QACjB,MAAA,EAAQ,QAAA;AAAA,QACR,KAAA,EAAO;AAAA,OACR,CAAA;AAED,MAAA,MAAM,GAAA,CAAI,WAAA,CAAY,QAAA,CAAS,gBAAA,CAAiB,aAAA,EAAe;AAAA,QAC7D,UAAA,EAAY,MAAA;AAAA,QACZ,UAAU,IAAA,CAAK,MAAA;AAAA,QACf,WAAW,IAAA,CAAK,SAAA;AAAA,QAChB,KAAA,EAAO;AAAA,OACR,CAAA;AAED,MAAA,OAAO,gBAAA,CAAiB,MAAA,EAAQ,IAAA,CAAK,SAAA,EAAW,QAAQ,CAAA;AAAA,IAC1D;AAAA,EACF;AACF,CAAC;AAMM,IAAM,sBAAsB,cAAA,CAAe;AAAA,EAChD,IAAA,EAAM;AAAA,IACJ,SAAA,EAAW,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAA;AAAA,IAChC,MAAA,EAAQ,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ;AAAA,GAC/B;AAAA,EACA,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,OAAO,GAAA,EAAK,IAAA,KAAS;AAC5B,IAAA,MAAM,SAAA,GAAY,KAAK,SAAA,IAAa,GAAA;AAEpC,IAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,QAAA;AAAA,MACvB,SAAS,gBAAA,CAAiB,mBAAA;AAAA,MAC1B;AAAA,QACE,KAAA,EAAO,SAAA;AAAA,QACP,QAAQ,IAAA,CAAK;AAAA;AACf,KACF;AAEA,IAAA,IAAI,MAAA,CAAO,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAC7B,MAAA,OAAO,EAAE,MAAA,EAAQ,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,SAAS,KAAA,EAAM;AAAA,IAChD;AAEA,IAAA,MAAM,YAAA,uBAAmB,GAAA,EAGvB;AAEF,IAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,KAAA,EAAO;AAC/B,MAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,IAAA,CAAK,QAAQ,CAAA,IAAK,MAAA;AACnD,MAAA,IAAI,CAAC,YAAA,CAAa,GAAA,CAAI,KAAK,CAAA,EAAG;AAC5B,QAAA,YAAA,CAAa,GAAA,CAAI,KAAA,EAAO,EAAE,CAAA;AAAA,MAC5B;AACA,MAAA,YAAA,CAAa,GAAA,CAAI,KAAK,CAAA,EAAG,IAAA,CAAK;AAAA,QAC5B,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,UAAA,EAAY,oBAAoB,IAAW;AAAA,OAC5C,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,IAAI,MAAA,GAAS,CAAA;AAEb,IAAA,KAAA,MAAW,CAAC,KAAA,EAAO,KAAK,CAAA,IAAK,YAAA,EAAc;AACzC,MAAA,IAAI;AACF,QAAA,MAAM,gBAAA,CAAiB,OAAO,KAAK,CAAA;AACnC,QAAA,MAAA,IAAU,KAAA,CAAM,MAAA;AAChB,QAAA,OAAA,CAAQ,GAAA;AAAA,UACN,CAAA,4BAAA,EAA+B,KAAA,CAAM,MAAM,CAAA,CAAA,EAAI,KAAK,CAAA,MAAA;AAAA,SACtD;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,qCAAA,EAAwC,KAAK,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AACrE,QAAA,MAAA,IAAU,KAAA,CAAM,MAAA;AAAA,MAClB;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,YAAY,MAAA,CAAO;AAAA,KACrB;AAAA,EACF;AACF,CAAC;AAEM,IAAM,sBAAsB,cAAA,CAAe;AAAA,EAChD,IAAA,EAAM;AAAA,IACJ,SAAA,EAAW,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAA;AAAA,IAChC,MAAA,EAAQ,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ;AAAA,GAC/B;AAAA,EACA,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,OAAO,GAAA,EAAK,IAAA,KAAS;AAC5B,IAAA,MAAM,SAAA,GAAY,KAAK,SAAA,IAAa,GAAA;AAEpC,IAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,QAAA;AAAA,MACvB,SAAS,gBAAA,CAAiB,mBAAA;AAAA,MAC1B;AAAA,QACE,KAAA,EAAO,SAAA;AAAA,QACP,QAAQ,IAAA,CAAK;AAAA;AACf,KACF;AAEA,IAAA,IAAI,MAAA,CAAO,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAC7B,MAAA,OAAO,EAAE,MAAA,EAAQ,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,SAAS,KAAA,EAAM;AAAA,IAChD;AAEA,IAAA,MAAM,cAMD,EAAC;AAEN,IAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,KAAA,EAAO;AAC/B,MAAA,IAAI,CAAC,IAAA,CAAK,YAAA,IAAgB,CAAC,KAAK,UAAA,EAAY;AAC1C,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,CAAA,2BAAA,EAA8B,KAAK,QAAQ,CAAA,oBAAA;AAAA,SAC7C;AACA,QAAA;AAAA,MACF;AACA,MAAA,MAAM,UACJ,gBAAA,CAAiB,IAAA,CAAK,QAAQ,CAAA,IAAK,IAAA,CAAK,SAAS,WAAA,EAAY;AAC/D,MAAA,WAAA,CAAY,IAAA,CAAK;AAAA,QACf,OAAA;AAAA,QACA,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,cAAc,IAAA,CAAK,YAAA;AAAA,QACnB,YAAY,IAAA,CAAK,UAAA;AAAA,QACjB,UAAA,EAAY,oBAAoB,IAAW;AAAA,OAC5C,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,IAAI,MAAA,GAAS,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,MAAM,iBAAiB,WAAW,CAAA;AAClC,MAAA,MAAA,GAAS,WAAA,CAAY,MAAA;AACrB,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,4BAAA,EAA+B,MAAM,CAAA,MAAA,CAAQ,CAAA;AAAA,IAC3D,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,0CAA0C,KAAK,CAAA;AAC7D,MAAA,MAAA,GAAS,WAAA,CAAY,MAAA;AAAA,IACvB;AAEA,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,YAAY,MAAA,CAAO;AAAA,KACrB;AAAA,EACF;AACF,CAAC;AAMM,IAAM,qBAAqB,cAAA,CAAe;AAAA,EAC/C,IAAA,EAAM;AAAA,IACJ,SAAA,EAAW,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ;AAAA,GAClC;AAAA,EACA,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,OAAO,GAAA,EAAK,IAAA,KAAS;AAC5B,IAAA,MAAM,SAAA,GAAY,KAAK,SAAA,IAAa,GAAA;AACpC,IAAA,IAAI,UAAA,GAAa,CAAA;AACjB,IAAA,IAAI,UAAA,GAAa,CAAA;AACjB,IAAA,IAAI,WAAA,GAAc,CAAA;AAElB,IAAA,OAAA,CAAQ,IAAI,wCAAwC,CAAA;AAGpD,IAAA,IAAI,UAAA;AACJ,IAAA,GAAG;AACD,MAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,SAAA;AAAA,QACvB,SAAS,SAAA,CAAU,mBAAA;AAAA,QACnB;AAAA,UACE,SAAA;AAAA,UACA,MAAA,EAAQ;AAAA;AACV,OACF;AACA,MAAA,UAAA,IAAc,MAAA,CAAO,MAAA;AACrB,MAAA,WAAA,IAAe,MAAA,CAAO,MAAA;AACtB,MAAA,UAAA,GAAa,MAAA,CAAO,OAAA,GAAU,MAAA,CAAO,UAAA,GAAa,MAAA;AAClD,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN,CAAA,6BAAA,EAAgC,UAAU,CAAA,SAAA,EAAY,WAAW,CAAA,OAAA;AAAA,OACnE;AAAA,IACF,CAAA,QAAS,UAAA;AAET,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,6BAAA,EAAgC,UAAU,CAAA,OAAA,CAAS,CAAA;AAG/D,IAAA,IAAI,UAAA;AACJ,IAAA,GAAG;AACD,MAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,SAAA;AAAA,QACvB,SAAS,SAAA,CAAU,mBAAA;AAAA,QACnB;AAAA,UACE,SAAA;AAAA,UACA,MAAA,EAAQ;AAAA;AACV,OACF;AACA,MAAA,UAAA,IAAc,MAAA,CAAO,MAAA;AACrB,MAAA,WAAA,IAAe,MAAA,CAAO,MAAA;AACtB,MAAA,UAAA,GAAa,MAAA,CAAO,OAAA,GAAU,MAAA,CAAO,UAAA,GAAa,MAAA;AAClD,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN,CAAA,6BAAA,EAAgC,UAAU,CAAA,SAAA,EAAY,WAAW,CAAA,OAAA;AAAA,OACnE;AAAA,IACF,CAAA,QAAS,UAAA;AAET,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,gCAAA,EAAmC,UAAU,CAAA,QAAA,EAAW,UAAU,WAAW,WAAW,CAAA,OAAA;AAAA,KAC1F;AAEA,IAAA,OAAO;AAAA,MACL,UAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF,CAAC;AAMM,IAAM,oBAAoB,cAAA,CAAe;AAAA,EAC9C,IAAA,EAAM;AAAA,IACJ,KAAA,EAAO,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ;AAAA,GAC9B;AAAA,EACA,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,OAAO,GAAA,EAAK,IAAA,KAAS;AAC5B,IAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,IAAS,EAAA;AAE5B,IAAA,MAAM,YAAA,GAAe,MAAM,GAAA,CAAI,QAAA;AAAA,MAC7B,SAAS,gBAAA,CAAiB,iBAAA;AAAA,MAC1B,EAAE,KAAA;AAAM,KACV;AAEA,IAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAC7B,MAAA,OAAO,EAAE,SAAA,EAAW,CAAA,EAAG,SAAA,EAAW,CAAA,EAAG,QAAQ,CAAA,EAAE;AAAA,IACjD;AAEA,IAAA,IAAI,SAAA,GAAY,CAAA;AAChB,IAAA,IAAI,MAAA,GAAS,CAAA;AAEb,IAAA,KAAA,MAAW,QAAQ,YAAA,EAAc;AAC/B,MAAA,MAAM,GAAA,CAAI,WAAA,CAAY,QAAA,CAAS,gBAAA,CAAiB,iBAAA,EAAmB;AAAA,QACjE,SAAS,IAAA,CAAK,GAAA;AAAA,QACd,MAAA,EAAQ;AAAA,OACT,CAAA;AAED,MAAA,IAAI,MAAA;AAEJ,MAAA,IAAI,IAAA,CAAK,eAAe,MAAA,EAAQ;AAC9B,QAAA,MAAA,GAAS,MAAM,GAAA,CAAI,SAAA,CAAU,QAAA,CAAS,UAAU,eAAA,EAAiB;AAAA,UAC/D,QAAQ,IAAA,CAAK,QAAA;AAAA,UACb,WAAW,IAAA,CAAK;AAAA,SACjB,CAAA;AAAA,MACH,CAAA,MAAO;AACL,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,QAAA;AAAA,UACzB,SAAS,gBAAA,CAAiB,sBAAA;AAAA,UAC1B;AAAA,YACE,UAAU,IAAA,CAAK;AAAA;AACjB,SACF;AAEA,QAAA,IACE,QAAA,CAAS,IAAA,KAAS,WAAA,IAClB,QAAA,CAAS,SAAS,qBAAA,EAClB;AACA,UAAA,MAAA,GAAS,MAAM,GAAA,CAAI,SAAA,CAAU,QAAA,CAAS,UAAU,eAAA,EAAiB;AAAA,YAC/D,QAAQ,QAAA,CAAS,MAAA;AAAA,YACjB,WAAW,IAAA,CAAK;AAAA,WACjB,CAAA;AAAA,QACH,CAAA,MAAO;AAEL,UAAA,MAAA,GAAS,MAAM,GAAA,CAAI,SAAA;AAAA,YACjB,SAAS,YAAA,CAAa,yBAAA;AAAA,YACtB;AAAA,cACE,UAAU,QAAA,CAAS;AAAA;AACrB,WACF;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,MAAM,GAAA,CAAI,WAAA,CAAY,QAAA,CAAS,gBAAA,CAAiB,iBAAA,EAAmB;AAAA,UACjE,SAAS,IAAA,CAAK,GAAA;AAAA,UACd,MAAA,EAAQ;AAAA,SACT,CAAA;AACD,QAAA,SAAA,EAAA;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAM,OAAA,GAAU,MAAM,GAAA,CAAI,WAAA;AAAA,UACxB,SAAS,gBAAA,CAAiB,iBAAA;AAAA,UAC1B;AAAA,YACE,SAAS,IAAA,CAAK,GAAA;AAAA,YACd,KAAA,EAAO,OAAO,KAAA,IAAS;AAAA;AACzB,SACF;AACA,QAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,UAAA,MAAA,EAAA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,SAAA,EAAW,YAAA,CAAa,MAAA,EAAQ,WAAW,MAAA,EAAO;AAAA,EAC7D;AACF,CAAC;AAYM,IAAM,uBAAuB,cAAA,CAAe;AAAA,EACjD,IAAA,EAAM;AAAA,IACJ,MAAA,EAAQ,CAAA,CAAE,EAAA,CAAG,gBAAgB;AAAA,GAC/B;AAAA,EACA,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,OAAO,GAAA,EAAK,IAAA,KAAS;AAC5B,IAAA,MAAM,WAAW,iBAAA,EAAkB;AACnC,IAAA,IAAI,CAAC,SAAS,UAAA,EAAY;AACxB,MAAA,OAAO,gBAAA,CAAiB,WAAA,EAAa,MAAA,EAAQ,qBAAA,EAAuB;AAAA,QAClE,aAAA,EAAe;AAAA,OAChB,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,OAAO,MAAM,GAAA,CAAI,QAAA,CAAS,QAAA,CAAS,iBAAiB,cAAA,EAAgB;AAAA,MACxE,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AACD,IAAA,IAAI,CAAC,MAAM,QAAA,EAAU;AACnB,MAAA,OAAO,gBAAA,CAAiB,WAAA,EAAa,MAAA,EAAQ,gBAAA,EAAkB;AAAA,QAC7D,aAAA,EAAe;AAAA,OAChB,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,SAAA,GAAY,MAAM,GAAA,CAAI,QAAA;AAAA,MAC1B,SAAS,gBAAA,CAAiB,mBAAA;AAAA,MAC1B,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAA;AAAO,KACxB;AACA,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,OAAO,gBAAA,CAAiB,WAAA,EAAa,MAAA,EAAQ,qBAAA,EAAuB;AAAA,QAClE,aAAA,EAAe;AAAA,OAChB,CAAA;AAAA,IACH;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,mBAAA;AAAA,QACJ,8DAAA;AAAA,QACA,EAAE,QAAA,EAAU,IAAA,CAAK,QAAA,EAAU,SAAA;AAAU,OACvC;AACA,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN,CAAA,oBAAA,EAAuB,SAAA,CAAU,MAAM,CAAA,wBAAA,EAA2B,KAAK,QAAQ,CAAA;AAAA,OACjF;AACA,MAAA,OAAO,gBAAA,CAAiB,aAAa,MAAM,CAAA;AAAA,IAC7C,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,QAAA,GAAW,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AAC1D,MAAA,OAAA,CAAQ,KAAA,CAAM,sCAAsC,QAAQ,CAAA;AAC5D,MAAA,OAAO,gBAAA,CAAiB,WAAA,EAAa,MAAA,EAAQ,QAAQ,CAAA;AAAA,IACvD;AAAA,EACF;AACF,CAAC;AAMM,IAAM,mBAAmB,cAAA,CAAe;AAAA,EAC7C,MAAM,EAAC;AAAA,EACP,OAAA,EAAS,gBAAA;AAAA,EACT,SAAS,YAAY;AACnB,IAAA,MAAM,WAAW,iBAAA,EAAkB;AACnC,IAAA,IAAI,CAAC,SAAS,UAAA,EAAY;AACxB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,sBAAA;AAAA,QACP,KAAK,QAAA,CAAS;AAAA,OAChB;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,WAAA,EAAY;AACjC,IAAA,OAAO;AAAA,MACL,GAAG,MAAA;AAAA,MACH,KAAK,QAAA,CAAS;AAAA,KAChB;AAAA,EACF;AACF,CAAC;AAUM,IAAM,iBAAiB,cAAA,CAAe;AAAA,EAC3C,IAAA,EAAM;AAAA,IACJ,SAAA,EAAW,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAA;AAAA,IAChC,QAAA,EAAU,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAA;AAAA,IAC/B,MAAA,EAAQ,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ;AAAA,GAC/B;AAAA,EACA,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,OAAO,GAAA,EAAK,IAAA,KAAS;AAC5B,IAAA,MAAM,SAAA,GAAY,KAAK,SAAA,IAAa,EAAA;AAGpC,IAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,QAAA;AAAA,MACvB,SAAS,gBAAA,CAAiB,oBAAA;AAAA,MAC1B;AAAA,QACE,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,KAAA,EAAO,SAAA;AAAA,QACP,QAAQ,IAAA,CAAK;AAAA;AACf,KACF;AAEA,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,IAAI,MAAA,GAAS,CAAA;AAEb,IAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,KAAA,EAAO;AAC/B,MAAA,IAAI;AACF,QAAA,MAAM,UAAA,GAAa,MAAM,GAAA,CAAI,SAAA;AAAA,UAC3B,SAAS,SAAA,CAAU,eAAA;AAAA,UACnB;AAAA,YACE,QAAQ,IAAA,CAAK,GAAA;AAAA,YACb,SAAA,EAAW;AAAA;AACb,SACF;AACA,QAAA,IAAI,WAAW,OAAA,EAAS;AACtB,UAAA,MAAA,EAAA;AAAA,QACF,CAAA,MAAO;AACL,UAAA,MAAA,EAAA;AAAA,QACF;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,mCAAA,EAAsC,IAAA,CAAK,GAAG,KAAK,KAAK,CAAA;AACtE,QAAA,MAAA,EAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,MAAA;AAAA,MACA,KAAA,EAAO,OAAO,KAAA,CAAM,MAAA;AAAA,MACpB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,YAAY,MAAA,CAAO;AAAA,KACrB;AAAA,EACF;AACF,CAAC;AAMM,IAAM,iBAAiB,cAAA,CAAe;AAAA,EAC3C,IAAA,EAAM;AAAA,IACJ,SAAA,EAAW,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAA;AAAA,IAChC,MAAA,EAAQ,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ;AAAA,GAC/B;AAAA,EACA,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,OAAO,GAAA,EAAK,IAAA,KAAS;AAC5B,IAAA,MAAM,SAAA,GAAY,KAAK,SAAA,IAAa,EAAA;AAGpC,IAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,QAAA;AAAA,MACvB,SAAS,gBAAA,CAAiB,oBAAA;AAAA,MAC1B;AAAA,QACE,KAAA,EAAO,SAAA;AAAA,QACP,QAAQ,IAAA,CAAK;AAAA;AACf,KACF;AAEA,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,IAAI,MAAA,GAAS,CAAA;AAEb,IAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,KAAA,EAAO;AAC/B,MAAA,IAAI;AACF,QAAA,MAAM,UAAA,GAAa,MAAM,GAAA,CAAI,SAAA;AAAA,UAC3B,SAAS,SAAA,CAAU,eAAA;AAAA,UACnB;AAAA,YACE,QAAQ,IAAA,CAAK,GAAA;AAAA,YACb,SAAA,EAAW;AAAA;AACb,SACF;AACA,QAAA,IAAI,WAAW,OAAA,EAAS;AACtB,UAAA,MAAA,EAAA;AAAA,QACF,CAAA,MAAO;AACL,UAAA,MAAA,EAAA;AAAA,QACF;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,mCAAA,EAAsC,IAAA,CAAK,GAAG,KAAK,KAAK,CAAA;AACtE,QAAA,MAAA,EAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,MAAA;AAAA,MACA,KAAA,EAAO,OAAO,KAAA,CAAM,MAAA;AAAA,MACpB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,YAAY,MAAA,CAAO;AAAA,KACrB;AAAA,EACF;AACF,CAAC","file":"neo4jSync.js","sourcesContent":["import {\n actionGeneric,\n anyApi,\n componentsGeneric,\n httpActionGeneric,\n internalActionGeneric,\n internalMutationGeneric,\n internalQueryGeneric,\n mutationGeneric,\n queryGeneric,\n} from \"convex/server\";\nimport type { GenericId } from \"convex/values\";\n\nexport const api = anyApi as any;\nexport const components = componentsGeneric() as any;\nexport const internal = anyApi as any;\n\nexport type TableNames = string;\nexport type Id<TableName extends TableNames = string> = GenericId<TableName>;\nexport type Doc<TableName extends TableNames = string> = any;\nexport type DataModel = any;\nexport type ActionCtx = any;\nexport type DatabaseReader = any;\nexport type DatabaseWriter = any;\nexport type MutationCtx = any;\nexport type QueryCtx = any;\n\ntype ConvexFunctionBuilder = <Definition extends {\n handler?: (...args: any[]) => any;\n}>(\n definition: Definition\n) => any;\n\nexport const action = actionGeneric as unknown as ConvexFunctionBuilder;\nexport const httpAction = httpActionGeneric as unknown as ConvexFunctionBuilder;\nexport const internalAction =\n internalActionGeneric as unknown as ConvexFunctionBuilder;\nexport const internalMutation =\n internalMutationGeneric as unknown as ConvexFunctionBuilder;\nexport const internalQuery =\n internalQueryGeneric as unknown as ConvexFunctionBuilder;\nexport const mutation = mutationGeneric as unknown as ConvexFunctionBuilder;\nexport const query = queryGeneric as unknown as ConvexFunctionBuilder;\n","/**\n * neo4jDriver module implementation.\n */\n\n\"use node\";\n/**\n * Direct Neo4j Driver for Convex\n *\n * Uses the \"use node\" directive to enable Node.js runtime, allowing\n * direct use of the neo4j-driver package instead of HTTP proxies.\n *\n * Environment Variables (set per deployment via `npx convex env set`):\n * - NEO4J_URI: neo4j+s://xxx.databases.neo4j.io\n * - NEO4J_USER: neo4j\n * - NEO4J_PASSWORD: your-password\n *\n * @see /docs/architecture/UNIFIED_GRAPH_ARCHITECTURE.md\n */\n\nimport neo4j, { type Driver } from \"neo4j-driver\";\n\n// =============================================================================\n// VALID LABELS AND RELATIONSHIP TYPES (Security: Prevent Cypher Injection)\n// =============================================================================\n\nconst VALID_NODE_LABELS = new Set([\n // Ontological\n \"ValueChain\",\n \"Function\",\n \"FinSector\",\n \"Company\",\n \"Person\",\n \"Investor\",\n // Epistemic\n \"Theme\",\n \"Belief\",\n \"Question\",\n \"Evidence\",\n \"Source\",\n \"Decision\",\n \"Sprint\",\n \"Claim\",\n \"Synthesis\",\n \"Answer\",\n]);\n\nconst VALID_RELATIONSHIP_TYPES = new Set([\n // Cross-layer edges\n \"EXTRACTED_FROM\",\n \"ANSWERS\",\n \"RESPONDS_TO\",\n \"INFORMS\",\n \"QUALIFIES\",\n \"TESTS\",\n \"EXPLORES\",\n \"BASED_ON\",\n \"RELATES_TO_THESIS\",\n \"BELONGS_TO\",\n \"PLAYS_THEME\",\n // Same-layer edges\n \"SUPERSEDES\",\n \"SAME_AS\",\n \"DEPENDS_ON\",\n \"REINFORCES\",\n \"PARENT_OF\",\n \"CHILD_OF\",\n \"FALSIFIED_BY\",\n \"EXCLUSIVE_WITH\",\n \"COLLAPSES_IF\",\n \"CASCADE_FROM\",\n \"STRENGTHENED_BY\",\n \"WEAKENED_BY\",\n \"ALTERNATIVE_TO\",\n \"SUBSUMES\",\n \"VALIDATED_BY\",\n \"REQUIRED_FOR\",\n \"PREREQUISITE_FOR\",\n \"PARALLEL_TO\",\n \"CORROBORATES\",\n \"EXTENDS\",\n \"SAME_SOURCE_AS\",\n \"SAME_THEME_AS\",\n // Ontological\n \"EVALUATES\",\n \"PERSPECTIVE_ON\",\n \"WORKS_AT\",\n \"PARTICIPATES_IN\",\n \"PERFORMS\",\n \"FUNCTION_IN\",\n \"IMPACTS\",\n \"INVESTED_IN\",\n \"RAISED_FROM\",\n \"BASED_ON_BELIEF\",\n \"BASED_ON_QUESTION\",\n \"BLOCKED_BY_CONTRADICTION\",\n \"INFORMED_BY_THEME\",\n]);\n\nexport function validateLabel(label: string): void {\n if (!VALID_NODE_LABELS.has(label)) {\n throw new Error(\n `[Neo4j Security] Invalid node label: ${label}. Must be one of: ${Array.from(VALID_NODE_LABELS).join(\", \")}`\n );\n }\n}\n\nexport function validateRelType(relType: string): void {\n if (!VALID_RELATIONSHIP_TYPES.has(relType)) {\n throw new Error(\n `[Neo4j Security] Invalid relationship type: ${relType}. Must be one of: ${Array.from(VALID_RELATIONSHIP_TYPES).join(\", \")}`\n );\n }\n}\n\n// =============================================================================\n// DRIVER SINGLETON\n// =============================================================================\n\nlet driver: Driver | null = null;\n\nfunction getDriver(): Driver {\n if (!driver) {\n const uri = process.env.NEO4J_URI;\n const user = process.env.NEO4J_USER;\n const password = process.env.NEO4J_PASSWORD;\n\n if (!uri || !user || !password) {\n throw new Error(\n \"[Neo4j Driver] Missing credentials. Set NEO4J_URI, NEO4J_USER, NEO4J_PASSWORD via `npx convex env set`\"\n );\n }\n\n driver = neo4j.driver(uri, neo4j.auth.basic(user, password), {\n // Connection pool settings\n maxConnectionPoolSize: 50,\n connectionAcquisitionTimeout: 30_000,\n // Logging\n logging: {\n level: \"warn\",\n logger: (level, message) => console.log(`[Neo4j ${level}] ${message}`),\n },\n });\n }\n return driver;\n}\n\n// =============================================================================\n// QUERY CONFIGURATION\n// =============================================================================\n\n/**\n * Default query timeout in milliseconds.\n * Prevents expensive graph traversals from hanging indefinitely.\n */\nexport const DEFAULT_QUERY_TIMEOUT_MS = 30_000; // 30 seconds\n\n/**\n * Timeout for complex graph queries (cascade simulation, lineage traversal)\n */\nexport const COMPLEX_QUERY_TIMEOUT_MS = 60_000; // 60 seconds\n\n// =============================================================================\n// QUERY EXECUTION\n// =============================================================================\n\n/**\n * Convert JavaScript values to Neo4j-compatible types\n * Neo4j requires explicit integers, not floats\n */\nfunction toNeo4jParams(\n params: Record<string, unknown>\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(params)) {\n if (typeof value === \"number\" && Number.isInteger(value)) {\n // Convert JavaScript integers to Neo4j integers\n result[key] = neo4j.int(value);\n } else if (Array.isArray(value)) {\n result[key] = value.map((v) =>\n typeof v === \"number\" && Number.isInteger(v) ? neo4j.int(v) : v\n );\n } else {\n result[key] = value;\n }\n }\n return result;\n}\n\n/**\n * Execute a Cypher query and return results as typed objects\n *\n * @param query - Cypher query string\n * @param params - Query parameters\n * @param timeoutMs - Query timeout in milliseconds (default: 30s)\n */\nexport async function runCypher<T = Record<string, unknown>>(\n query: string,\n params: Record<string, unknown> = {},\n timeoutMs: number = DEFAULT_QUERY_TIMEOUT_MS\n): Promise<T[]> {\n const neo4jDriver = getDriver();\n const session = neo4jDriver.session();\n\n try {\n const neo4jParams = toNeo4jParams(params);\n const result = await session.run(query, neo4jParams, {\n timeout: neo4j.int(timeoutMs),\n });\n return result.records.map((record) => {\n const obj: Record<string, unknown> = {};\n for (const key of record.keys) {\n const field = String(key);\n obj[field] = convertNeo4jValue(record.get(field));\n }\n return obj as T;\n });\n } finally {\n await session.close();\n }\n}\n\n/**\n * Execute a write transaction (for mutations)\n *\n * @param query - Cypher query string\n * @param params - Query parameters\n * @param timeoutMs - Transaction timeout in milliseconds (default: 30s)\n */\nexport async function runWriteTransaction<T = Record<string, unknown>>(\n query: string,\n params: Record<string, unknown> = {},\n timeoutMs: number = DEFAULT_QUERY_TIMEOUT_MS\n): Promise<T[]> {\n const neo4jDriver = getDriver();\n const session = neo4jDriver.session();\n\n try {\n const neo4jParams = toNeo4jParams(params);\n const result = await session.executeWrite(\n async (tx) => {\n return await tx.run(query, neo4jParams);\n },\n { timeout: timeoutMs }\n );\n return result.records.map((record) => {\n const obj: Record<string, unknown> = {};\n for (const key of record.keys) {\n const field = String(key);\n obj[field] = convertNeo4jValue(record.get(field));\n }\n return obj as T;\n });\n } finally {\n await session.close();\n }\n}\n\n/**\n * Execute multiple queries in a single transaction\n *\n * @param queries - Array of queries with parameters\n * @param timeoutMs - Transaction timeout in milliseconds (default: 60s for batch)\n */\nexport async function runBatchTransaction(\n queries: Array<{ query: string; params: Record<string, unknown> }>,\n timeoutMs: number = COMPLEX_QUERY_TIMEOUT_MS\n): Promise<void> {\n const neo4jDriver = getDriver();\n const session = neo4jDriver.session();\n\n try {\n await session.executeWrite(\n async (tx) => {\n for (const { query, params } of queries) {\n await tx.run(query, params);\n }\n },\n { timeout: timeoutMs }\n );\n } finally {\n await session.close();\n }\n}\n\n// =============================================================================\n// NODE OPERATIONS\n// =============================================================================\n\n/**\n * Upsert a node by globalId\n */\nexport async function upsertNode(\n label: string,\n globalId: string,\n properties: Record<string, unknown>\n): Promise<void> {\n validateLabel(label); // Security: prevent Cypher injection\n await runWriteTransaction(\n `\n MERGE (n:${label} {globalId: $globalId})\n SET n += $properties\n SET n.updatedAt = timestamp()\n `,\n { globalId, properties }\n );\n}\n\n/**\n * Delete a node by globalId\n */\nexport async function deleteNode(globalId: string): Promise<void> {\n await runWriteTransaction(\n `\n MATCH (n {globalId: $globalId})\n DETACH DELETE n\n `,\n { globalId }\n );\n}\n\n/**\n * Batch upsert nodes\n */\nexport async function batchUpsertNodes(\n label: string,\n nodes: Array<{ globalId: string; properties: Record<string, unknown> }>\n): Promise<void> {\n if (nodes.length === 0) {\n return;\n }\n\n validateLabel(label); // Security: prevent Cypher injection\n await runWriteTransaction(\n `\n UNWIND $nodes as node\n MERGE (n:${label} {globalId: node.globalId})\n SET n += node.properties\n SET n.updatedAt = timestamp()\n `,\n { nodes }\n );\n}\n\n// =============================================================================\n// EDGE OPERATIONS\n// =============================================================================\n\n/**\n * Upsert an edge by globalId\n */\nexport async function upsertEdge(\n relType: string,\n globalId: string,\n fromGlobalId: string,\n toGlobalId: string,\n properties: Record<string, unknown> = {}\n): Promise<void> {\n validateRelType(relType); // Security: prevent Cypher injection\n await runWriteTransaction(\n `\n MATCH (from {globalId: $fromGlobalId})\n MATCH (to {globalId: $toGlobalId})\n MERGE (from)-[r:${relType} {globalId: $globalId}]->(to)\n SET r += $properties\n SET r.updatedAt = timestamp()\n `,\n { globalId, fromGlobalId, toGlobalId, properties }\n );\n}\n\n/**\n * Delete an edge by globalId\n */\nexport async function deleteEdge(globalId: string): Promise<void> {\n await runWriteTransaction(\n `\n MATCH ()-[r {globalId: $globalId}]->()\n DELETE r\n `,\n { globalId }\n );\n}\n\n/**\n * Batch upsert edges\n */\nexport async function batchUpsertEdges(\n edges: Array<{\n relType: string;\n globalId: string;\n fromGlobalId: string;\n toGlobalId: string;\n properties?: Record<string, unknown>;\n }>\n): Promise<void> {\n if (edges.length === 0) {\n return;\n }\n\n // Group by relationship type for efficient batching\n const byType = new Map<string, typeof edges>();\n for (const edge of edges) {\n const existing = byType.get(edge.relType) || [];\n existing.push(edge);\n byType.set(edge.relType, existing);\n }\n\n const queries: Array<{ query: string; params: Record<string, unknown> }> = [];\n for (const [relType, typeEdges] of byType) {\n queries.push({\n query: `\n UNWIND $edges as edge\n MATCH (from {globalId: edge.fromGlobalId})\n MATCH (to {globalId: edge.toGlobalId})\n MERGE (from)-[r:${relType} {globalId: edge.globalId}]->(to)\n SET r += edge.properties\n SET r.updatedAt = timestamp()\n `,\n params: {\n edges: typeEdges.map((e) => ({\n globalId: e.globalId,\n fromGlobalId: e.fromGlobalId,\n toGlobalId: e.toGlobalId,\n properties: e.properties || {},\n })),\n },\n });\n }\n\n await runBatchTransaction(queries);\n}\n\n// =============================================================================\n// HEALTH CHECK\n// =============================================================================\n\n/**\n * Check if Neo4j connection is healthy\n */\nexport async function healthCheck(): Promise<{\n healthy: boolean;\n nodeCount?: number;\n error?: string;\n}> {\n try {\n const result = await runCypher<{ count: number }>(\n \"MATCH (n) RETURN count(n) as count LIMIT 1\"\n );\n return {\n healthy: true,\n nodeCount: result[0]?.count || 0,\n };\n } catch (error) {\n return {\n healthy: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n}\n\n/**\n * Get connection info (for debugging)\n */\nexport function getConnectionInfo(): {\n uri: string | undefined;\n user: string | undefined;\n configured: boolean;\n} {\n return {\n uri: process.env.NEO4J_URI,\n user: process.env.NEO4J_USER,\n configured: Boolean(\n process.env.NEO4J_URI &&\n process.env.NEO4J_USER &&\n process.env.NEO4J_PASSWORD\n ),\n };\n}\n\n// =============================================================================\n// VALUE CONVERSION\n// =============================================================================\n\n/**\n * Convert Neo4j types to plain JavaScript\n */\nfunction convertNeo4jValue(value: unknown): unknown {\n if (value === null || value === undefined) {\n return null;\n }\n\n // Handle Neo4j Integer\n if (neo4j.isInt(value)) {\n return neo4j.integer.toNumber(value);\n }\n\n // Handle Neo4j Date/Time types\n if (neo4j.isDate(value) || neo4j.isDateTime(value) || neo4j.isTime(value)) {\n return value.toString();\n }\n\n // Handle arrays\n if (Array.isArray(value)) {\n return value.map(convertNeo4jValue);\n }\n\n // Handle Node objects\n if (value && typeof value === \"object\" && \"properties\" in value) {\n const nodeObj = value as { properties: Record<string, unknown> };\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(nodeObj.properties)) {\n result[k] = convertNeo4jValue(v);\n }\n return result;\n }\n\n // Handle plain objects\n if (typeof value === \"object\") {\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n result[k] = convertNeo4jValue(v);\n }\n return result;\n }\n\n return value;\n}\n\n// =============================================================================\n// CLEANUP\n// =============================================================================\n\n/**\n * Close the driver connection (for graceful shutdown)\n */\nexport async function closeDriver(): Promise<void> {\n if (driver) {\n await driver.close();\n driver = null;\n }\n}\n","/**\n * neo4jSync module implementation.\n */\n\n\"use node\";\n/**\n * Neo4j Sync - Node & Edge Mirroring\n *\n * Canonical split (ADR P2-D11):\n * - Convex is canonical for node state and lifecycle.\n * - Neo4j is canonical for edge topology and graph traversal/analytics.\n *\n * This module projects node/lifecycle state from Convex -> Neo4j and provides\n * batch sync for both nodes and edges.\n * Uses DIRECT neo4j-driver (no HTTP proxy) enabled by \"use node\" directive.\n *\n * Environment Variables (set per deployment via `npx convex env set`):\n * - NEO4J_URI: neo4j+s://xxx.databases.neo4j.io\n * - NEO4J_USER: neo4j\n * - NEO4J_PASSWORD: your-password\n *\n * NOTE: This file only contains actions because \"use node\" requires it.\n * Queries and mutations are in neo4jSyncHelpers.ts\n *\n * Reconciliation SLO targets (ADR §3.2):\n * - Node sync latency (Convex -> Neo4j): P95 < 5s\n * - Edge mirror latency (Neo4j -> Convex): P95 < 2s\n * - Retry queue depth: < 100 sustained entries\n * - Drift detection: weekly full reconcile + spot-check property parity\n *\n * @see /docs/architecture/UNIFIED_GRAPH_ARCHITECTURE.md\n */\n\nimport { v } from \"convex/values\";\n// Import from Convex-compatible type registry\nimport {\n EDGE_TYPE_TO_REL,\n NODE_TYPE_TO_LABEL,\n} from \"@lucern/graph-primitives/graphTypes\";\nimport { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\nimport type { Id } from \"./convex\";\nimport { internal, internalAction } from \"./convex\";\n// Import direct Neo4j driver functions\nimport {\n batchUpsertEdges,\n batchUpsertNodes,\n deleteEdge,\n deleteNode,\n getConnectionInfo,\n healthCheck,\n runWriteTransaction,\n upsertEdge,\n upsertNode,\n} from \"./neo4jDriver\";\n\ntype SyncEntityType = \"node\" | \"edge\" | \"embedding\";\ntype SyncOperation = \"upsert\" | \"delete\" | \"sync\";\ntype SyncResult = Readonly<{\n entityType: SyncEntityType;\n operation: SyncOperation;\n success: boolean;\n error?: string;\n skipped?: boolean;\n skippedReason?: string;\n}>;\n\nfunction buildSyncResponse(\n entityType: SyncEntityType,\n operation: SyncOperation,\n fields: {\n success: boolean;\n error?: string;\n skipped?: boolean;\n skippedReason?: string;\n }\n): SyncResult {\n return {\n entityType,\n operation,\n ...fields,\n };\n}\n\nfunction buildSyncSuccess(\n entityType: SyncEntityType,\n operation: SyncOperation,\n fields?: {\n skipped?: boolean;\n skippedReason?: string;\n }\n): SyncResult {\n return buildSyncResponse(entityType, operation, {\n success: true,\n ...fields,\n });\n}\n\nfunction buildSyncFailure(\n entityType: SyncEntityType,\n operation: SyncOperation,\n error: string,\n fields?: {\n skipped?: boolean;\n skippedReason?: string;\n }\n): SyncResult {\n return buildSyncResponse(entityType, operation, {\n success: false,\n error,\n ...fields,\n });\n}\n\n// =============================================================================\n// SHARED PROPERTY BUILDERS\n// =============================================================================\n\n/**\n * Build the full Neo4j property set for a node.\n * Used by both single sync and batch sync to ensure parity.\n */\nfunction buildNodeProperties(\n node: Record<string, unknown> & {\n _id: string;\n canonicalText?: string;\n title?: string;\n status?: string;\n subtype?: string;\n domain?: string;\n confidence?: number;\n verificationStatus?: string;\n sourceType?: string;\n createdAt?: number;\n updatedAt?: number;\n createdBy?: string;\n nodeType: string;\n epistemicLayer?: string;\n projectId?: string;\n tenantId?: string;\n workspaceId?: string;\n metadata?: Record<string, unknown>;\n globalId: string;\n }\n): Record<string, unknown> {\n const metadata = (node.metadata || {}) as Record<string, unknown>;\n const pillar = (metadata.pillar || metadata.topic || \"\") as string;\n const stage = (metadata.stage || metadata.beliefStage || \"\") as string;\n const criticality = (metadata.criticality || \"\") as string;\n const synthesizedFrom = (metadata.synthesizedFrom || []) as string[];\n\n // Classification fields (top-level, from Logic Machine)\n const epistemicStatus = (node.epistemicStatus as string) || \"\";\n const methodology = (node.methodology as string) || \"\";\n const informationAsymmetry = (node.informationAsymmetry as string) || \"\";\n const questionType = (node.questionType as string) || \"\";\n const questionPriority = (node.questionPriority as string) || \"\";\n const answerQuality = (node.answerQuality as string) || \"\";\n const reversibility = (node.reversibility as string) || \"\";\n const predictionMeta = node.predictionMeta as\n | Record<string, unknown>\n | undefined;\n\n return {\n convexId: node._id,\n canonicalText: node.canonicalText || \"\",\n title: node.title || \"\",\n status: node.status || \"active\",\n subtype: node.subtype || \"\",\n domain: node.domain || \"\",\n confidence: node.confidence || 0,\n verificationStatus: node.verificationStatus || \"unverified\",\n sourceType: node.sourceType || \"unknown\",\n createdAt: node.createdAt,\n updatedAt: node.updatedAt || Date.now(),\n createdBy: node.createdBy || \"\",\n nodeType: node.nodeType,\n epistemicLayer: node.epistemicLayer || \"\",\n // Project and metadata fields\n projectId: node.projectId || \"\",\n tenantId: node.tenantId || \"\",\n workspaceId: node.workspaceId || \"\",\n pillar,\n stage,\n criticality,\n synthesizedFromCount: synthesizedFrom.length,\n // Classification fields (Logic Machine)\n epistemicStatus,\n methodology,\n informationAsymmetry,\n questionType,\n questionPriority,\n answerQuality,\n reversibility,\n isPrediction: predictionMeta?.isPrediction ? \"true\" : \"false\",\n expectedBy: predictionMeta?.expectedBy\n ? String(predictionMeta.expectedBy)\n : \"\",\n };\n}\n\n/**\n * Build the full Neo4j property set for an edge.\n * Used by both single sync and batch sync to ensure parity.\n */\nfunction buildEdgeProperties(\n edge: Record<string, unknown> & {\n _id: string;\n weight?: number;\n confidence?: number;\n context?: string;\n derivationType?: string;\n createdAt?: number;\n createdBy?: string;\n edgeType: string;\n fromLayer?: string;\n toLayer?: string;\n reasoningMethod?: string;\n logicalRole?: string;\n temporalClass?: string;\n projectId?: string;\n tenantId?: string;\n workspaceId?: string;\n }\n): Record<string, unknown> {\n return {\n convexId: edge._id,\n weight: edge.weight || 1,\n confidence: edge.confidence || 0,\n context: edge.context || \"\",\n derivationType: edge.derivationType || \"\",\n createdAt: edge.createdAt,\n createdBy: edge.createdBy || \"\",\n edgeType: edge.edgeType,\n fromLayer: edge.fromLayer || \"\",\n toLayer: edge.toLayer || \"\",\n projectId: edge.projectId || \"\",\n tenantId: edge.tenantId || \"\",\n workspaceId: edge.workspaceId || \"\",\n // Classification fields (Logic Machine)\n reasoningMethod: edge.reasoningMethod || \"\",\n logicalRole: edge.logicalRole || \"\",\n temporalClass: edge.temporalClass || \"\",\n };\n}\n\n// =============================================================================\n// NODE SYNC (DIRECT DRIVER)\n// =============================================================================\n\nexport const syncNodeToNeo4j = internalAction({\n args: {\n nodeId: v.id(\"epistemicNodes\"),\n operation: v.union(v.literal(\"upsert\"), v.literal(\"delete\")),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const connInfo = getConnectionInfo();\n if (!connInfo.configured) {\n console.warn(\n \"[Neo4j Sync] Missing Neo4j credentials, skipping sync. Set via `npx convex env set`\"\n );\n return buildSyncFailure(\"node\", args.operation, \"Missing credentials\", {\n skippedReason: \"credentials_missing\",\n });\n }\n\n const node = await ctx.runQuery(internal.neo4jSyncHelpers.getNodeForSync, {\n nodeId: args.nodeId,\n });\n\n if (!node) {\n if (args.operation === \"upsert\") {\n return buildSyncFailure(\"node\", args.operation, \"Node not found\", {\n skippedReason: \"source_node_missing\",\n });\n }\n console.log(\"[Neo4j Sync] Node not found for delete, skipping\");\n return buildSyncSuccess(\"node\", args.operation, {\n skipped: true,\n skippedReason: \"source_node_missing\",\n });\n }\n\n const label = NODE_TYPE_TO_LABEL[node.nodeType] || \"Node\";\n\n try {\n if (args.operation === \"delete\") {\n await deleteNode(node.globalId);\n console.log(`[Neo4j Sync] Deleted node ${node.globalId}`);\n } else {\n const props = buildNodeProperties(node as any);\n\n // Include embedding vector if available (for Neo4j vector indexes)\n const embedding = await ctx.runQuery(\n internal.neo4jSyncHelpers.getEmbeddingForSync,\n { nodeId: args.nodeId }\n );\n if (embedding) {\n props.embedding = embedding;\n }\n\n await upsertNode(label, node.globalId, props);\n console.log(\n `[Neo4j Sync] Upserted node ${node.globalId} as ${label}` +\n ` with projectId=${node.projectId}` +\n (embedding ? ` (with ${embedding.length}-dim embedding)` : \"\")\n );\n }\n\n await ctx.runMutation(internal.neo4jSyncHelpers.logSyncEvent, {\n eventType:\n args.operation === \"delete\"\n ? \"node_deleted\"\n : node\n ? \"node_updated\"\n : \"node_created\",\n entityId: args.nodeId,\n entityType: node.nodeType,\n status: \"success\",\n });\n\n return buildSyncSuccess(\"node\", args.operation);\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : \"Unknown error\";\n console.error(\"[Neo4j Sync] Node sync error:\", errorMsg);\n\n await ctx.runMutation(internal.neo4jSyncHelpers.logSyncEvent, {\n eventType:\n args.operation === \"delete\" ? \"node_deleted\" : \"node_updated\",\n entityId: args.nodeId,\n entityType: node.nodeType,\n status: \"failed\",\n error: errorMsg,\n });\n\n await ctx.runMutation(internal.neo4jSyncHelpers.queueForRetry, {\n entityType: \"node\",\n entityId: args.nodeId,\n operation: args.operation,\n error: errorMsg,\n });\n\n return buildSyncFailure(\"node\", args.operation, errorMsg);\n }\n },\n});\n\n// =============================================================================\n// EDGE SYNC (DIRECT DRIVER)\n// =============================================================================\n\nexport const syncEdgeToNeo4j = internalAction({\n args: {\n edgeId: v.id(\"epistemicEdges\"),\n operation: v.union(v.literal(\"upsert\"), v.literal(\"delete\")),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const connInfo = getConnectionInfo();\n if (!connInfo.configured) {\n console.warn(\n \"[Neo4j Sync] Missing Neo4j credentials, skipping sync. Set via `npx convex env set`\"\n );\n return buildSyncFailure(\"edge\", args.operation, \"Missing credentials\", {\n skippedReason: \"credentials_missing\",\n });\n }\n\n const edge = await ctx.runQuery(internal.neo4jSyncHelpers.getEdgeForSync, {\n edgeId: args.edgeId,\n });\n\n if (!edge) {\n if (args.operation === \"upsert\") {\n return buildSyncFailure(\"edge\", args.operation, \"Edge not found\", {\n skippedReason: \"source_edge_missing\",\n });\n }\n console.log(\"[Neo4j Sync] Edge not found for delete, skipping\");\n return buildSyncSuccess(\"edge\", args.operation, {\n skipped: true,\n skippedReason: \"source_edge_missing\",\n });\n }\n\n if (!edge.fromGlobalId || !edge.toGlobalId) {\n console.warn(\n \"[Neo4j Sync] Edge missing fromGlobalId or toGlobalId, skipping\"\n );\n return buildSyncFailure(\n \"edge\",\n args.operation,\n \"Edge missing connected node globalIds\",\n {\n skippedReason: \"edge_endpoint_missing\",\n }\n );\n }\n\n const relType =\n EDGE_TYPE_TO_REL[edge.edgeType] || edge.edgeType.toUpperCase();\n\n try {\n if (args.operation === \"delete\") {\n await deleteEdge(edge.globalId);\n console.log(`[Neo4j Sync] Deleted edge ${edge.globalId}`);\n } else {\n await upsertEdge(\n relType,\n edge.globalId,\n edge.fromGlobalId,\n edge.toGlobalId,\n {\n convexId: args.edgeId,\n weight: edge.weight || 1,\n confidence: edge.confidence || 0,\n context: edge.context || \"\",\n derivationType: edge.derivationType || \"\",\n createdAt: edge.createdAt,\n createdBy: edge.createdBy || \"\",\n edgeType: edge.edgeType,\n fromLayer: edge.fromLayer || \"\",\n toLayer: edge.toLayer || \"\",\n // Classification fields (Logic Machine)\n reasoningMethod: edge.reasoningMethod || \"\",\n logicalRole: edge.logicalRole || \"\",\n temporalClass: edge.temporalClass || \"\",\n }\n );\n console.log(\n `[Neo4j Sync] Upserted edge ${edge.globalId} as ${relType}`\n );\n }\n\n await ctx.runMutation(internal.neo4jSyncHelpers.logSyncEvent, {\n eventType:\n args.operation === \"delete\" ? \"edge_deleted\" : \"edge_created\",\n entityId: args.edgeId,\n entityType: edge.edgeType,\n status: \"success\",\n });\n\n return buildSyncSuccess(\"edge\", args.operation);\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : \"Unknown error\";\n console.error(\"[Neo4j Sync] Edge sync error:\", errorMsg);\n\n await ctx.runMutation(internal.neo4jSyncHelpers.logSyncEvent, {\n eventType:\n args.operation === \"delete\" ? \"edge_deleted\" : \"edge_created\",\n entityId: args.edgeId,\n entityType: edge.edgeType,\n status: \"failed\",\n error: errorMsg,\n });\n\n await ctx.runMutation(internal.neo4jSyncHelpers.queueForRetry, {\n entityType: \"edge\",\n entityId: args.edgeId,\n operation: args.operation,\n error: errorMsg,\n });\n\n return buildSyncFailure(\"edge\", args.operation, errorMsg);\n }\n },\n});\n\n// =============================================================================\n// BATCH SYNC (for backfill)\n// =============================================================================\n\nexport const syncAllNodesToNeo4j = internalAction({\n args: {\n batchSize: v.optional(v.number()),\n cursor: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const batchSize = args.batchSize ?? 100;\n\n const result = await ctx.runQuery(\n internal.neo4jSyncHelpers.getNodeBatchForSync,\n {\n limit: batchSize,\n cursor: args.cursor,\n }\n );\n\n if (result.nodes.length === 0) {\n return { synced: 0, failed: 0, hasMore: false };\n }\n\n const nodesByLabel = new Map<\n string,\n Array<{ globalId: string; properties: Record<string, unknown> }>\n >();\n\n for (const node of result.nodes) {\n const label = NODE_TYPE_TO_LABEL[node.nodeType] || \"Node\";\n if (!nodesByLabel.has(label)) {\n nodesByLabel.set(label, []);\n }\n nodesByLabel.get(label)?.push({\n globalId: node.globalId,\n properties: buildNodeProperties(node as any),\n });\n }\n\n let synced = 0;\n let failed = 0;\n\n for (const [label, nodes] of nodesByLabel) {\n try {\n await batchUpsertNodes(label, nodes);\n synced += nodes.length;\n console.log(\n `[Neo4j Sync] Batch upserted ${nodes.length} ${label} nodes`\n );\n } catch (error) {\n console.error(`[Neo4j Sync] Batch upsert failed for ${label}:`, error);\n failed += nodes.length;\n }\n }\n\n return {\n synced,\n failed,\n hasMore: result.hasMore,\n nextCursor: result.nextCursor,\n };\n },\n});\n\nexport const syncAllEdgesToNeo4j = internalAction({\n args: {\n batchSize: v.optional(v.number()),\n cursor: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const batchSize = args.batchSize ?? 100;\n\n const result = await ctx.runQuery(\n internal.neo4jSyncHelpers.getEdgeBatchForSync,\n {\n limit: batchSize,\n cursor: args.cursor,\n }\n );\n\n if (result.edges.length === 0) {\n return { synced: 0, failed: 0, hasMore: false };\n }\n\n const edgesToSync: Array<{\n relType: string;\n globalId: string;\n fromGlobalId: string;\n toGlobalId: string;\n properties: Record<string, unknown>;\n }> = [];\n\n for (const edge of result.edges) {\n if (!edge.fromGlobalId || !edge.toGlobalId) {\n console.warn(\n `[Neo4j Sync] Skipping edge ${edge.globalId} - missing globalIds`\n );\n continue;\n }\n const relType =\n EDGE_TYPE_TO_REL[edge.edgeType] || edge.edgeType.toUpperCase();\n edgesToSync.push({\n relType,\n globalId: edge.globalId,\n fromGlobalId: edge.fromGlobalId,\n toGlobalId: edge.toGlobalId,\n properties: buildEdgeProperties(edge as any),\n });\n }\n\n let synced = 0;\n let failed = 0;\n\n try {\n await batchUpsertEdges(edgesToSync);\n synced = edgesToSync.length;\n console.log(`[Neo4j Sync] Batch upserted ${synced} edges`);\n } catch (error) {\n console.error(\"[Neo4j Sync] Batch edge upsert failed:\", error);\n failed = edgesToSync.length;\n }\n\n return {\n synced,\n failed,\n hasMore: result.hasMore,\n nextCursor: result.nextCursor,\n };\n },\n});\n\n// =============================================================================\n// FULL BACKFILL\n// =============================================================================\n\nexport const backfillAllToNeo4j = internalAction({\n args: {\n batchSize: v.optional(v.number()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const batchSize = args.batchSize ?? 100;\n let totalNodes = 0;\n let totalEdges = 0;\n let totalFailed = 0;\n\n console.log(\"[Neo4j Sync] Starting full backfill...\");\n\n // Sync all nodes first\n let nodeCursor: string | undefined;\n do {\n const result = await ctx.runAction(\n internal.neo4jSync.syncAllNodesToNeo4j,\n {\n batchSize,\n cursor: nodeCursor,\n }\n );\n totalNodes += result.synced;\n totalFailed += result.failed;\n nodeCursor = result.hasMore ? result.nextCursor : undefined;\n console.log(\n `[Neo4j Sync] Nodes progress: ${totalNodes} synced, ${totalFailed} failed`\n );\n } while (nodeCursor);\n\n console.log(`[Neo4j Sync] Finished nodes: ${totalNodes} synced`);\n\n // Then sync all edges\n let edgeCursor: string | undefined;\n do {\n const result = await ctx.runAction(\n internal.neo4jSync.syncAllEdgesToNeo4j,\n {\n batchSize,\n cursor: edgeCursor,\n }\n );\n totalEdges += result.synced;\n totalFailed += result.failed;\n edgeCursor = result.hasMore ? result.nextCursor : undefined;\n console.log(\n `[Neo4j Sync] Edges progress: ${totalEdges} synced, ${totalFailed} failed`\n );\n } while (edgeCursor);\n\n console.log(\n `[Neo4j Sync] Backfill complete: ${totalNodes} nodes, ${totalEdges} edges, ${totalFailed} failed`\n );\n\n return {\n totalNodes,\n totalEdges,\n totalFailed,\n };\n },\n});\n\n// =============================================================================\n// RETRY QUEUE PROCESSING\n// =============================================================================\n\nexport const processRetryQueue = internalAction({\n args: {\n limit: v.optional(v.number()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const limit = args.limit ?? 10;\n\n const pendingItems = await ctx.runQuery(\n internal.neo4jSyncHelpers.getPendingRetries,\n { limit }\n );\n\n if (pendingItems.length === 0) {\n return { processed: 0, succeeded: 0, failed: 0 };\n }\n\n let succeeded = 0;\n let failed = 0;\n\n for (const item of pendingItems) {\n await ctx.runMutation(internal.neo4jSyncHelpers.updateQueueStatus, {\n queueId: item._id,\n status: \"in_progress\",\n });\n\n let result: Pick<SyncResult, \"success\" | \"error\">;\n\n if (item.entityType === \"node\") {\n result = await ctx.runAction(internal.neo4jSync.syncNodeToNeo4j, {\n nodeId: item.entityId as Id<\"epistemicNodes\">,\n operation: item.operation,\n });\n } else {\n const resolved = await ctx.runQuery(\n internal.neo4jSyncHelpers.resolveEdgeRetryTarget,\n {\n entityId: item.entityId,\n }\n );\n\n if (\n resolved.mode === \"convex_id\" ||\n resolved.mode === \"global_id_in_convex\"\n ) {\n result = await ctx.runAction(internal.neo4jSync.syncEdgeToNeo4j, {\n edgeId: resolved.edgeId as Id<\"epistemicEdges\">,\n operation: item.operation,\n });\n } else {\n // Edge exists in Neo4j but not in Convex projection; retry mirror by globalId.\n result = await ctx.runAction(\n internal.neo4jEdgeAPI.retryProjectionByGlobalId,\n {\n globalId: resolved.edgeGlobalId,\n }\n );\n }\n }\n\n if (result.success) {\n await ctx.runMutation(internal.neo4jSyncHelpers.updateQueueStatus, {\n queueId: item._id,\n status: \"succeeded\",\n });\n succeeded++;\n } else {\n const updated = await ctx.runMutation(\n internal.neo4jSyncHelpers.incrementAttempts,\n {\n queueId: item._id,\n error: result.error || \"Unknown error\",\n }\n );\n if (updated.failed) {\n failed++;\n }\n }\n }\n\n return { processed: pendingItems.length, succeeded, failed };\n },\n});\n\n// =============================================================================\n// EMBEDDING SYNC (triggered after embedding generation)\n// =============================================================================\n\n/**\n * Sync an embedding vector to an existing Neo4j node.\n * Called after saveEpistemicNodeEmbedding completes, ensuring the\n * embedding reaches Neo4j even if the initial node sync ran before\n * the embedding was generated.\n */\nexport const syncEmbeddingToNeo4j = internalAction({\n args: {\n nodeId: v.id(\"epistemicNodes\"),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const connInfo = getConnectionInfo();\n if (!connInfo.configured) {\n return buildSyncFailure(\"embedding\", \"sync\", \"Missing credentials\", {\n skippedReason: \"credentials_missing\",\n });\n }\n\n const node = await ctx.runQuery(internal.neo4jSyncHelpers.getNodeForSync, {\n nodeId: args.nodeId,\n });\n if (!node?.globalId) {\n return buildSyncFailure(\"embedding\", \"sync\", \"Node not found\", {\n skippedReason: \"source_node_missing\",\n });\n }\n\n const embedding = await ctx.runQuery(\n internal.neo4jSyncHelpers.getEmbeddingForSync,\n { nodeId: args.nodeId }\n );\n if (!embedding) {\n return buildSyncFailure(\"embedding\", \"sync\", \"Embedding not found\", {\n skippedReason: \"embedding_missing\",\n });\n }\n\n try {\n await runWriteTransaction(\n \"MATCH (n {globalId: $globalId}) SET n.embedding = $embedding\",\n { globalId: node.globalId, embedding }\n );\n console.log(\n `[Neo4j Sync] Synced ${embedding.length}-dim embedding for node ${node.globalId}`\n );\n return buildSyncSuccess(\"embedding\", \"sync\");\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : \"Unknown error\";\n console.error(\"[Neo4j Sync] Embedding sync error:\", errorMsg);\n return buildSyncFailure(\"embedding\", \"sync\", errorMsg);\n }\n },\n});\n\n// =============================================================================\n// HEALTH CHECK\n// =============================================================================\n\nexport const checkNeo4jHealth = internalAction({\n args: {},\n returns: permissiveReturn,\n handler: async () => {\n const connInfo = getConnectionInfo();\n if (!connInfo.configured) {\n return {\n healthy: false,\n error: \"Neo4j not configured\",\n uri: connInfo.uri,\n };\n }\n\n const health = await healthCheck();\n return {\n ...health,\n uri: connInfo.uri,\n };\n },\n});\n\n// =============================================================================\n// RE-SYNC ALL NODES (to update with new properties like projectId, pillar)\n// =============================================================================\n\n/**\n * Re-sync all epistemic nodes to Neo4j with updated properties (paginated)\n * Use after adding new fields to the sync\n */\nexport const resyncAllNodes = internalAction({\n args: {\n batchSize: v.optional(v.number()),\n nodeType: v.optional(v.string()),\n cursor: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const batchSize = args.batchSize ?? 50;\n\n // Get nodes with cursor\n const result = await ctx.runQuery(\n internal.neo4jSyncHelpers.getAllNodesForResync,\n {\n nodeType: args.nodeType,\n limit: batchSize,\n cursor: args.cursor,\n }\n );\n\n let synced = 0;\n let failed = 0;\n\n for (const node of result.nodes) {\n try {\n const syncResult = await ctx.runAction(\n internal.neo4jSync.syncNodeToNeo4j,\n {\n nodeId: node._id,\n operation: \"upsert\",\n }\n );\n if (syncResult.success) {\n synced++;\n } else {\n failed++;\n }\n } catch (error) {\n console.error(`[Neo4j Resync] Failed to sync node ${node._id}:`, error);\n failed++;\n }\n }\n\n return {\n synced,\n failed,\n total: result.nodes.length,\n hasMore: result.hasMore,\n nextCursor: result.nextCursor,\n };\n },\n});\n\n/**\n * Re-sync all epistemic edges to Neo4j with updated properties (paginated)\n * Use after adding new fields to the sync (e.g., classification fields)\n */\nexport const resyncAllEdges = internalAction({\n args: {\n batchSize: v.optional(v.number()),\n cursor: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const batchSize = args.batchSize ?? 50;\n\n // Get edges with cursor\n const result = await ctx.runQuery(\n internal.neo4jSyncHelpers.getAllEdgesForResync,\n {\n limit: batchSize,\n cursor: args.cursor,\n }\n );\n\n let synced = 0;\n let failed = 0;\n\n for (const edge of result.edges) {\n try {\n const syncResult = await ctx.runAction(\n internal.neo4jSync.syncEdgeToNeo4j,\n {\n edgeId: edge._id,\n operation: \"upsert\",\n }\n );\n if (syncResult.success) {\n synced++;\n } else {\n failed++;\n }\n } catch (error) {\n console.error(`[Neo4j Resync] Failed to sync edge ${edge._id}:`, error);\n failed++;\n }\n }\n\n return {\n synced,\n failed,\n total: result.edges.length,\n hasMore: result.hasMore,\n nextCursor: result.nextCursor,\n };\n },\n});\n"]}
1
+ {"version":3,"sources":["../src/convex.ts","../src/neo4jDriver.ts","../src/neo4jSync.ts"],"names":["v"],"mappings":"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","file":"neo4jSync.js","sourcesContent":["import {\n actionGeneric,\n anyApi,\n internalActionGeneric,\n internalMutationGeneric,\n internalQueryGeneric,\n} from \"convex/server\";\nimport type { GenericId } from \"convex/values\";\n\nexport const internal = anyApi as any;\n\ntype TableNames = string;\nexport type Id<TableName extends TableNames = string> = GenericId<TableName>;\ntype ConvexFunctionBuilder = <Definition extends {\n handler?: (...args: any[]) => any;\n}>(\n definition: Definition\n) => any;\n\nexport const action = actionGeneric as unknown as ConvexFunctionBuilder;\nexport const internalAction =\n internalActionGeneric as unknown as ConvexFunctionBuilder;\nexport const internalMutation =\n internalMutationGeneric as unknown as ConvexFunctionBuilder;\nexport const internalQuery =\n internalQueryGeneric as unknown as ConvexFunctionBuilder;\n","/**\n * neo4jDriver module implementation.\n */\n\n\"use node\";\n/**\n * Direct Neo4j Driver for Convex\n *\n * Uses the \"use node\" directive to enable Node.js runtime, allowing\n * direct use of the neo4j-driver package instead of HTTP proxies.\n *\n * Environment Variables (set per deployment via `npx convex env set`):\n * - NEO4J_URI: neo4j+s://xxx.databases.neo4j.io\n * - NEO4J_USER: neo4j\n * - NEO4J_PASSWORD: your-password\n *\n * @see /docs/architecture/UNIFIED_GRAPH_ARCHITECTURE.md\n */\n\nimport neo4j, { type Driver } from \"neo4j-driver\";\n\n// =============================================================================\n// VALID LABELS AND RELATIONSHIP TYPES (Security: Prevent Cypher Injection)\n// =============================================================================\n\nconst VALID_NODE_LABELS = new Set([\n // Ontological\n \"ValueChain\",\n \"Function\",\n \"FinSector\",\n \"Company\",\n \"Person\",\n \"Investor\",\n // Epistemic\n \"Theme\",\n \"Belief\",\n \"Question\",\n \"Evidence\",\n \"Source\",\n \"Decision\",\n \"Sprint\",\n \"Claim\",\n \"Synthesis\",\n \"Answer\",\n]);\n\nconst VALID_RELATIONSHIP_TYPES = new Set([\n // Cross-layer edges\n \"EXTRACTED_FROM\",\n \"ANSWERS\",\n \"RESPONDS_TO\",\n \"INFORMS\",\n \"QUALIFIES\",\n \"TESTS\",\n \"EXPLORES\",\n \"BASED_ON\",\n \"RELATES_TO_THESIS\",\n \"BELONGS_TO\",\n \"PLAYS_THEME\",\n // Same-layer edges\n \"SUPERSEDES\",\n \"SAME_AS\",\n \"DEPENDS_ON\",\n \"REINFORCES\",\n \"PARENT_OF\",\n \"CHILD_OF\",\n \"FALSIFIED_BY\",\n \"EXCLUSIVE_WITH\",\n \"COLLAPSES_IF\",\n \"CASCADE_FROM\",\n \"STRENGTHENED_BY\",\n \"WEAKENED_BY\",\n \"ALTERNATIVE_TO\",\n \"SUBSUMES\",\n \"VALIDATED_BY\",\n \"REQUIRED_FOR\",\n \"PREREQUISITE_FOR\",\n \"PARALLEL_TO\",\n \"CORROBORATES\",\n \"EXTENDS\",\n \"SAME_SOURCE_AS\",\n \"SAME_THEME_AS\",\n // Ontological\n \"EVALUATES\",\n \"PERSPECTIVE_ON\",\n \"WORKS_AT\",\n \"PARTICIPATES_IN\",\n \"PERFORMS\",\n \"FUNCTION_IN\",\n \"IMPACTS\",\n \"INVESTED_IN\",\n \"RAISED_FROM\",\n \"BASED_ON_BELIEF\",\n \"BASED_ON_QUESTION\",\n \"BLOCKED_BY_CONTRADICTION\",\n \"INFORMED_BY_THEME\",\n]);\n\nexport function validateLabel(label: string): void {\n if (!VALID_NODE_LABELS.has(label)) {\n throw new Error(\n `[Neo4j Security] Invalid node label: ${label}. Must be one of: ${Array.from(VALID_NODE_LABELS).join(\", \")}`\n );\n }\n}\n\nexport function validateRelType(relType: string): void {\n if (!VALID_RELATIONSHIP_TYPES.has(relType)) {\n throw new Error(\n `[Neo4j Security] Invalid relationship type: ${relType}. Must be one of: ${Array.from(VALID_RELATIONSHIP_TYPES).join(\", \")}`\n );\n }\n}\n\n// =============================================================================\n// DRIVER SINGLETON\n// =============================================================================\n\nlet driver: Driver | null = null;\n\nfunction getDriver(): Driver {\n if (!driver) {\n const uri = process.env.NEO4J_URI;\n const user = process.env.NEO4J_USER;\n const password = process.env.NEO4J_PASSWORD;\n\n if (!uri || !user || !password) {\n throw new Error(\n \"[Neo4j Driver] Missing credentials. Set NEO4J_URI, NEO4J_USER, NEO4J_PASSWORD via `npx convex env set`\"\n );\n }\n\n driver = neo4j.driver(uri, neo4j.auth.basic(user, password), {\n // Connection pool settings\n maxConnectionPoolSize: 50,\n connectionAcquisitionTimeout: 30_000,\n // Logging\n logging: {\n level: \"warn\",\n logger: (level, message) => console.log(`[Neo4j ${level}] ${message}`),\n },\n });\n }\n return driver;\n}\n\n// =============================================================================\n// QUERY CONFIGURATION\n// =============================================================================\n\n/**\n * Default query timeout in milliseconds.\n * Prevents expensive graph traversals from hanging indefinitely.\n */\nexport const DEFAULT_QUERY_TIMEOUT_MS = 30_000; // 30 seconds\n\n/**\n * Timeout for complex graph queries (cascade simulation, lineage traversal)\n */\nexport const COMPLEX_QUERY_TIMEOUT_MS = 60_000; // 60 seconds\n\n// =============================================================================\n// QUERY EXECUTION\n// =============================================================================\n\n/**\n * Convert JavaScript values to Neo4j-compatible types\n * Neo4j requires explicit integers, not floats\n */\nfunction toNeo4jParams(\n params: Record<string, unknown>\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(params)) {\n if (typeof value === \"number\" && Number.isInteger(value)) {\n // Convert JavaScript integers to Neo4j integers\n result[key] = neo4j.int(value);\n } else if (Array.isArray(value)) {\n result[key] = value.map((v) =>\n typeof v === \"number\" && Number.isInteger(v) ? neo4j.int(v) : v\n );\n } else {\n result[key] = value;\n }\n }\n return result;\n}\n\n/**\n * Execute a Cypher query and return results as typed objects\n *\n * @param query - Cypher query string\n * @param params - Query parameters\n * @param timeoutMs - Query timeout in milliseconds (default: 30s)\n */\nexport async function runCypher<T = Record<string, unknown>>(\n query: string,\n params: Record<string, unknown> = {},\n timeoutMs: number = DEFAULT_QUERY_TIMEOUT_MS\n): Promise<T[]> {\n const neo4jDriver = getDriver();\n const session = neo4jDriver.session();\n\n try {\n const neo4jParams = toNeo4jParams(params);\n const result = await session.run(query, neo4jParams, {\n timeout: neo4j.int(timeoutMs),\n });\n return result.records.map((record) => {\n const obj: Record<string, unknown> = {};\n for (const key of record.keys) {\n const field = String(key);\n obj[field] = convertNeo4jValue(record.get(field));\n }\n return obj as T;\n });\n } finally {\n await session.close();\n }\n}\n\n/**\n * Execute a write transaction (for mutations)\n *\n * @param query - Cypher query string\n * @param params - Query parameters\n * @param timeoutMs - Transaction timeout in milliseconds (default: 30s)\n */\nexport async function runWriteTransaction<T = Record<string, unknown>>(\n query: string,\n params: Record<string, unknown> = {},\n timeoutMs: number = DEFAULT_QUERY_TIMEOUT_MS\n): Promise<T[]> {\n const neo4jDriver = getDriver();\n const session = neo4jDriver.session();\n\n try {\n const neo4jParams = toNeo4jParams(params);\n const result = await session.executeWrite(\n async (tx) => {\n return await tx.run(query, neo4jParams);\n },\n { timeout: timeoutMs }\n );\n return result.records.map((record) => {\n const obj: Record<string, unknown> = {};\n for (const key of record.keys) {\n const field = String(key);\n obj[field] = convertNeo4jValue(record.get(field));\n }\n return obj as T;\n });\n } finally {\n await session.close();\n }\n}\n\n/**\n * Execute multiple queries in a single transaction\n *\n * @param queries - Array of queries with parameters\n * @param timeoutMs - Transaction timeout in milliseconds (default: 60s for batch)\n */\nexport async function runBatchTransaction(\n queries: Array<{ query: string; params: Record<string, unknown> }>,\n timeoutMs: number = COMPLEX_QUERY_TIMEOUT_MS\n): Promise<void> {\n const neo4jDriver = getDriver();\n const session = neo4jDriver.session();\n\n try {\n await session.executeWrite(\n async (tx) => {\n for (const { query, params } of queries) {\n await tx.run(query, params);\n }\n },\n { timeout: timeoutMs }\n );\n } finally {\n await session.close();\n }\n}\n\n// =============================================================================\n// NODE OPERATIONS\n// =============================================================================\n\n/**\n * Upsert a node by globalId\n */\nexport async function upsertNode(\n label: string,\n globalId: string,\n properties: Record<string, unknown>\n): Promise<void> {\n validateLabel(label); // Security: prevent Cypher injection\n await runWriteTransaction(\n `\n MERGE (n:${label} {globalId: $globalId})\n SET n += $properties\n SET n.updatedAt = timestamp()\n `,\n { globalId, properties }\n );\n}\n\n/**\n * Delete a node by globalId\n */\nexport async function deleteNode(globalId: string): Promise<void> {\n await runWriteTransaction(\n `\n MATCH (n {globalId: $globalId})\n DETACH DELETE n\n `,\n { globalId }\n );\n}\n\n/**\n * Batch upsert nodes\n */\nexport async function batchUpsertNodes(\n label: string,\n nodes: Array<{ globalId: string; properties: Record<string, unknown> }>\n): Promise<void> {\n if (nodes.length === 0) {\n return;\n }\n\n validateLabel(label); // Security: prevent Cypher injection\n await runWriteTransaction(\n `\n UNWIND $nodes as node\n MERGE (n:${label} {globalId: node.globalId})\n SET n += node.properties\n SET n.updatedAt = timestamp()\n `,\n { nodes }\n );\n}\n\n// =============================================================================\n// EDGE OPERATIONS\n// =============================================================================\n\n/**\n * Upsert an edge by globalId\n */\nexport async function upsertEdge(\n relType: string,\n globalId: string,\n fromGlobalId: string,\n toGlobalId: string,\n properties: Record<string, unknown> = {}\n): Promise<void> {\n validateRelType(relType); // Security: prevent Cypher injection\n await runWriteTransaction(\n `\n MATCH (from {globalId: $fromGlobalId})\n MATCH (to {globalId: $toGlobalId})\n MERGE (from)-[r:${relType} {globalId: $globalId}]->(to)\n SET r += $properties\n SET r.updatedAt = timestamp()\n `,\n { globalId, fromGlobalId, toGlobalId, properties }\n );\n}\n\n/**\n * Delete an edge by globalId\n */\nexport async function deleteEdge(globalId: string): Promise<void> {\n await runWriteTransaction(\n `\n MATCH ()-[r {globalId: $globalId}]->()\n DELETE r\n `,\n { globalId }\n );\n}\n\n/**\n * Batch upsert edges\n */\nexport async function batchUpsertEdges(\n edges: Array<{\n relType: string;\n globalId: string;\n fromGlobalId: string;\n toGlobalId: string;\n properties?: Record<string, unknown>;\n }>\n): Promise<void> {\n if (edges.length === 0) {\n return;\n }\n\n // Group by relationship type for efficient batching\n const byType = new Map<string, typeof edges>();\n for (const edge of edges) {\n const existing = byType.get(edge.relType) || [];\n existing.push(edge);\n byType.set(edge.relType, existing);\n }\n\n const queries: Array<{ query: string; params: Record<string, unknown> }> = [];\n for (const [relType, typeEdges] of byType) {\n queries.push({\n query: `\n UNWIND $edges as edge\n MATCH (from {globalId: edge.fromGlobalId})\n MATCH (to {globalId: edge.toGlobalId})\n MERGE (from)-[r:${relType} {globalId: edge.globalId}]->(to)\n SET r += edge.properties\n SET r.updatedAt = timestamp()\n `,\n params: {\n edges: typeEdges.map((e) => ({\n globalId: e.globalId,\n fromGlobalId: e.fromGlobalId,\n toGlobalId: e.toGlobalId,\n properties: e.properties || {},\n })),\n },\n });\n }\n\n await runBatchTransaction(queries);\n}\n\n// =============================================================================\n// HEALTH CHECK\n// =============================================================================\n\n/**\n * Check if Neo4j connection is healthy\n */\nexport async function healthCheck(): Promise<{\n healthy: boolean;\n nodeCount?: number;\n error?: string;\n}> {\n try {\n const result = await runCypher<{ count: number }>(\n \"MATCH (n) RETURN count(n) as count LIMIT 1\"\n );\n return {\n healthy: true,\n nodeCount: result[0]?.count || 0,\n };\n } catch (error) {\n return {\n healthy: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n}\n\n/**\n * Get connection info (for debugging)\n */\nexport function getConnectionInfo(): {\n uri: string | undefined;\n user: string | undefined;\n configured: boolean;\n} {\n return {\n uri: process.env.NEO4J_URI,\n user: process.env.NEO4J_USER,\n configured: Boolean(\n process.env.NEO4J_URI &&\n process.env.NEO4J_USER &&\n process.env.NEO4J_PASSWORD\n ),\n };\n}\n\n// =============================================================================\n// VALUE CONVERSION\n// =============================================================================\n\n/**\n * Convert Neo4j types to plain JavaScript\n */\nfunction convertNeo4jValue(value: unknown): unknown {\n if (value === null || value === undefined) {\n return null;\n }\n\n // Handle Neo4j Integer\n if (neo4j.isInt(value)) {\n return neo4j.integer.toNumber(value);\n }\n\n // Handle Neo4j Date/Time types\n if (neo4j.isDate(value) || neo4j.isDateTime(value) || neo4j.isTime(value)) {\n return value.toString();\n }\n\n // Handle arrays\n if (Array.isArray(value)) {\n return value.map(convertNeo4jValue);\n }\n\n // Handle Node objects\n if (value && typeof value === \"object\" && \"properties\" in value) {\n const nodeObj = value as { properties: Record<string, unknown> };\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(nodeObj.properties)) {\n result[k] = convertNeo4jValue(v);\n }\n return result;\n }\n\n // Handle plain objects\n if (typeof value === \"object\") {\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n result[k] = convertNeo4jValue(v);\n }\n return result;\n }\n\n return value;\n}\n\n// =============================================================================\n// CLEANUP\n// =============================================================================\n\n/**\n * Close the driver connection (for graceful shutdown)\n */\nexport async function closeDriver(): Promise<void> {\n if (driver) {\n await driver.close();\n driver = null;\n }\n}\n","/**\n * neo4jSync module implementation.\n */\n\n\"use node\";\n/**\n * Neo4j Sync - Node & Edge Mirroring\n *\n * Canonical split (ADR P2-D11):\n * - Convex is canonical for node state and lifecycle.\n * - Neo4j is canonical for edge topology and graph traversal/analytics.\n *\n * This module projects node/lifecycle state from Convex -> Neo4j and provides\n * batch sync for both nodes and edges.\n * Uses DIRECT neo4j-driver (no HTTP proxy) enabled by \"use node\" directive.\n *\n * Environment Variables (set per deployment via `npx convex env set`):\n * - NEO4J_URI: neo4j+s://xxx.databases.neo4j.io\n * - NEO4J_USER: neo4j\n * - NEO4J_PASSWORD: your-password\n *\n * NOTE: This file only contains actions because \"use node\" requires it.\n * Queries and mutations are in neo4jSyncHelpers.ts\n *\n * Reconciliation SLO targets (ADR §3.2):\n * - Node sync latency (Convex -> Neo4j): P95 < 5s\n * - Edge mirror latency (Neo4j -> Convex): P95 < 2s\n * - Retry queue depth: < 100 sustained entries\n * - Drift detection: weekly full reconcile + spot-check property parity\n *\n * @see /docs/architecture/UNIFIED_GRAPH_ARCHITECTURE.md\n */\n\nimport { v } from \"convex/values\";\n// Import from Convex-compatible type registry\nimport {\n EDGE_TYPE_TO_REL,\n NODE_TYPE_TO_LABEL,\n} from \"@lucern/graph-primitives/graphTypes\";\nimport { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\nimport type { Id } from \"./convex\";\nimport { internal, internalAction } from \"./convex\";\n// Import direct Neo4j driver functions\nimport {\n batchUpsertEdges,\n batchUpsertNodes,\n deleteEdge,\n deleteNode,\n getConnectionInfo,\n healthCheck,\n runWriteTransaction,\n upsertEdge,\n upsertNode,\n} from \"./neo4jDriver\";\n\ntype SyncEntityType = \"node\" | \"edge\" | \"embedding\";\ntype SyncOperation = \"upsert\" | \"delete\" | \"sync\";\ntype SyncResult = Readonly<{\n entityType: SyncEntityType;\n operation: SyncOperation;\n success: boolean;\n error?: string;\n skipped?: boolean;\n skippedReason?: string;\n}>;\n\nfunction buildSyncResponse(\n entityType: SyncEntityType,\n operation: SyncOperation,\n fields: {\n success: boolean;\n error?: string;\n skipped?: boolean;\n skippedReason?: string;\n }\n): SyncResult {\n return {\n entityType,\n operation,\n ...fields,\n };\n}\n\nfunction buildSyncSuccess(\n entityType: SyncEntityType,\n operation: SyncOperation,\n fields?: {\n skipped?: boolean;\n skippedReason?: string;\n }\n): SyncResult {\n return buildSyncResponse(entityType, operation, {\n success: true,\n ...fields,\n });\n}\n\nfunction buildSyncFailure(\n entityType: SyncEntityType,\n operation: SyncOperation,\n error: string,\n fields?: {\n skipped?: boolean;\n skippedReason?: string;\n }\n): SyncResult {\n return buildSyncResponse(entityType, operation, {\n success: false,\n error,\n ...fields,\n });\n}\n\n// =============================================================================\n// SHARED PROPERTY BUILDERS\n// =============================================================================\n\n/**\n * Build the full Neo4j property set for a node.\n * Used by both single sync and batch sync to ensure parity.\n */\nfunction buildNodeProperties(\n node: Record<string, unknown> & {\n _id: string;\n canonicalText?: string;\n title?: string;\n status?: string;\n subtype?: string;\n domain?: string;\n confidence?: number;\n verificationStatus?: string;\n sourceType?: string;\n createdAt?: number;\n updatedAt?: number;\n createdBy?: string;\n nodeType: string;\n epistemicLayer?: string;\n projectId?: string;\n tenantId?: string;\n workspaceId?: string;\n metadata?: Record<string, unknown>;\n globalId: string;\n }\n): Record<string, unknown> {\n const metadata = (node.metadata || {}) as Record<string, unknown>;\n const pillar = (metadata.pillar || metadata.topic || \"\") as string;\n const stage = (metadata.stage || metadata.beliefStage || \"\") as string;\n const criticality = (metadata.criticality || \"\") as string;\n const synthesizedFrom = (metadata.synthesizedFrom || []) as string[];\n\n // Classification fields (top-level, from Logic Machine)\n const epistemicStatus = (node.epistemicStatus as string) || \"\";\n const methodology = (node.methodology as string) || \"\";\n const informationAsymmetry = (node.informationAsymmetry as string) || \"\";\n const questionType = (node.questionType as string) || \"\";\n const questionPriority = (node.questionPriority as string) || \"\";\n const answerQuality = (node.answerQuality as string) || \"\";\n const reversibility = (node.reversibility as string) || \"\";\n const predictionMeta = node.predictionMeta as\n | Record<string, unknown>\n | undefined;\n\n return {\n convexId: node._id,\n canonicalText: node.canonicalText || \"\",\n title: node.title || \"\",\n status: node.status || \"active\",\n subtype: node.subtype || \"\",\n domain: node.domain || \"\",\n confidence: node.confidence || 0,\n verificationStatus: node.verificationStatus || \"unverified\",\n sourceType: node.sourceType || \"unknown\",\n createdAt: node.createdAt,\n updatedAt: node.updatedAt || Date.now(),\n createdBy: node.createdBy || \"\",\n nodeType: node.nodeType,\n epistemicLayer: node.epistemicLayer || \"\",\n // Project and metadata fields\n projectId: node.projectId || \"\",\n tenantId: node.tenantId || \"\",\n workspaceId: node.workspaceId || \"\",\n pillar,\n stage,\n criticality,\n synthesizedFromCount: synthesizedFrom.length,\n // Classification fields (Logic Machine)\n epistemicStatus,\n methodology,\n informationAsymmetry,\n questionType,\n questionPriority,\n answerQuality,\n reversibility,\n isPrediction: predictionMeta?.isPrediction ? \"true\" : \"false\",\n expectedBy: predictionMeta?.expectedBy\n ? String(predictionMeta.expectedBy)\n : \"\",\n };\n}\n\n/**\n * Build the full Neo4j property set for an edge.\n * Used by both single sync and batch sync to ensure parity.\n */\nfunction buildEdgeProperties(\n edge: Record<string, unknown> & {\n _id: string;\n weight?: number;\n confidence?: number;\n context?: string;\n derivationType?: string;\n createdAt?: number;\n createdBy?: string;\n edgeType: string;\n fromLayer?: string;\n toLayer?: string;\n reasoningMethod?: string;\n logicalRole?: string;\n temporalClass?: string;\n projectId?: string;\n tenantId?: string;\n workspaceId?: string;\n }\n): Record<string, unknown> {\n return {\n convexId: edge._id,\n weight: edge.weight || 1,\n confidence: edge.confidence || 0,\n context: edge.context || \"\",\n derivationType: edge.derivationType || \"\",\n createdAt: edge.createdAt,\n createdBy: edge.createdBy || \"\",\n edgeType: edge.edgeType,\n fromLayer: edge.fromLayer || \"\",\n toLayer: edge.toLayer || \"\",\n projectId: edge.projectId || \"\",\n tenantId: edge.tenantId || \"\",\n workspaceId: edge.workspaceId || \"\",\n // Classification fields (Logic Machine)\n reasoningMethod: edge.reasoningMethod || \"\",\n logicalRole: edge.logicalRole || \"\",\n temporalClass: edge.temporalClass || \"\",\n };\n}\n\n// =============================================================================\n// NODE SYNC (DIRECT DRIVER)\n// =============================================================================\n\nexport const syncNodeToNeo4j = internalAction({\n args: {\n nodeId: v.id(\"epistemicNodes\"),\n operation: v.union(v.literal(\"upsert\"), v.literal(\"delete\")),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const connInfo = getConnectionInfo();\n if (!connInfo.configured) {\n console.warn(\n \"[Neo4j Sync] Missing Neo4j credentials, skipping sync. Set via `npx convex env set`\"\n );\n return buildSyncFailure(\"node\", args.operation, \"Missing credentials\", {\n skippedReason: \"credentials_missing\",\n });\n }\n\n const node = await ctx.runQuery(internal.neo4jSyncHelpers.getNodeForSync, {\n nodeId: args.nodeId,\n });\n\n if (!node) {\n if (args.operation === \"upsert\") {\n return buildSyncFailure(\"node\", args.operation, \"Node not found\", {\n skippedReason: \"source_node_missing\",\n });\n }\n console.log(\"[Neo4j Sync] Node not found for delete, skipping\");\n return buildSyncSuccess(\"node\", args.operation, {\n skipped: true,\n skippedReason: \"source_node_missing\",\n });\n }\n\n const label = NODE_TYPE_TO_LABEL[node.nodeType] || \"Node\";\n\n try {\n if (args.operation === \"delete\") {\n await deleteNode(node.globalId);\n console.log(`[Neo4j Sync] Deleted node ${node.globalId}`);\n } else {\n const props = buildNodeProperties(node as any);\n\n // Include embedding vector if available (for Neo4j vector indexes)\n const embedding = await ctx.runQuery(\n internal.neo4jSyncHelpers.getEmbeddingForSync,\n { nodeId: args.nodeId }\n );\n if (embedding) {\n props.embedding = embedding;\n }\n\n await upsertNode(label, node.globalId, props);\n console.log(\n `[Neo4j Sync] Upserted node ${node.globalId} as ${label}` +\n ` with projectId=${node.projectId}` +\n (embedding ? ` (with ${embedding.length}-dim embedding)` : \"\")\n );\n }\n\n await ctx.runMutation(internal.neo4jSyncHelpers.logSyncEvent, {\n eventType:\n args.operation === \"delete\"\n ? \"node_deleted\"\n : node\n ? \"node_updated\"\n : \"node_created\",\n entityId: args.nodeId,\n entityType: node.nodeType,\n status: \"success\",\n });\n\n return buildSyncSuccess(\"node\", args.operation);\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : \"Unknown error\";\n console.error(\"[Neo4j Sync] Node sync error:\", errorMsg);\n\n await ctx.runMutation(internal.neo4jSyncHelpers.logSyncEvent, {\n eventType:\n args.operation === \"delete\" ? \"node_deleted\" : \"node_updated\",\n entityId: args.nodeId,\n entityType: node.nodeType,\n status: \"failed\",\n error: errorMsg,\n });\n\n await ctx.runMutation(internal.neo4jSyncHelpers.queueForRetry, {\n entityType: \"node\",\n entityId: args.nodeId,\n operation: args.operation,\n error: errorMsg,\n });\n\n return buildSyncFailure(\"node\", args.operation, errorMsg);\n }\n },\n});\n\n// =============================================================================\n// EDGE SYNC (DIRECT DRIVER)\n// =============================================================================\n\nexport const syncEdgeToNeo4j = internalAction({\n args: {\n edgeId: v.id(\"epistemicEdges\"),\n operation: v.union(v.literal(\"upsert\"), v.literal(\"delete\")),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const connInfo = getConnectionInfo();\n if (!connInfo.configured) {\n console.warn(\n \"[Neo4j Sync] Missing Neo4j credentials, skipping sync. Set via `npx convex env set`\"\n );\n return buildSyncFailure(\"edge\", args.operation, \"Missing credentials\", {\n skippedReason: \"credentials_missing\",\n });\n }\n\n const edge = await ctx.runQuery(internal.neo4jSyncHelpers.getEdgeForSync, {\n edgeId: args.edgeId,\n });\n\n if (!edge) {\n if (args.operation === \"upsert\") {\n return buildSyncFailure(\"edge\", args.operation, \"Edge not found\", {\n skippedReason: \"source_edge_missing\",\n });\n }\n console.log(\"[Neo4j Sync] Edge not found for delete, skipping\");\n return buildSyncSuccess(\"edge\", args.operation, {\n skipped: true,\n skippedReason: \"source_edge_missing\",\n });\n }\n\n if (!edge.fromGlobalId || !edge.toGlobalId) {\n console.warn(\n \"[Neo4j Sync] Edge missing fromGlobalId or toGlobalId, skipping\"\n );\n return buildSyncFailure(\n \"edge\",\n args.operation,\n \"Edge missing connected node globalIds\",\n {\n skippedReason: \"edge_endpoint_missing\",\n }\n );\n }\n\n const relType =\n EDGE_TYPE_TO_REL[edge.edgeType] || edge.edgeType.toUpperCase();\n\n try {\n if (args.operation === \"delete\") {\n await deleteEdge(edge.globalId);\n console.log(`[Neo4j Sync] Deleted edge ${edge.globalId}`);\n } else {\n await upsertEdge(\n relType,\n edge.globalId,\n edge.fromGlobalId,\n edge.toGlobalId,\n {\n convexId: args.edgeId,\n weight: edge.weight || 1,\n confidence: edge.confidence || 0,\n context: edge.context || \"\",\n derivationType: edge.derivationType || \"\",\n createdAt: edge.createdAt,\n createdBy: edge.createdBy || \"\",\n edgeType: edge.edgeType,\n fromLayer: edge.fromLayer || \"\",\n toLayer: edge.toLayer || \"\",\n // Classification fields (Logic Machine)\n reasoningMethod: edge.reasoningMethod || \"\",\n logicalRole: edge.logicalRole || \"\",\n temporalClass: edge.temporalClass || \"\",\n }\n );\n console.log(\n `[Neo4j Sync] Upserted edge ${edge.globalId} as ${relType}`\n );\n }\n\n await ctx.runMutation(internal.neo4jSyncHelpers.logSyncEvent, {\n eventType:\n args.operation === \"delete\" ? \"edge_deleted\" : \"edge_created\",\n entityId: args.edgeId,\n entityType: edge.edgeType,\n status: \"success\",\n });\n\n return buildSyncSuccess(\"edge\", args.operation);\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : \"Unknown error\";\n console.error(\"[Neo4j Sync] Edge sync error:\", errorMsg);\n\n await ctx.runMutation(internal.neo4jSyncHelpers.logSyncEvent, {\n eventType:\n args.operation === \"delete\" ? \"edge_deleted\" : \"edge_created\",\n entityId: args.edgeId,\n entityType: edge.edgeType,\n status: \"failed\",\n error: errorMsg,\n });\n\n await ctx.runMutation(internal.neo4jSyncHelpers.queueForRetry, {\n entityType: \"edge\",\n entityId: args.edgeId,\n operation: args.operation,\n error: errorMsg,\n });\n\n return buildSyncFailure(\"edge\", args.operation, errorMsg);\n }\n },\n});\n\n// =============================================================================\n// BATCH SYNC (for backfill)\n// =============================================================================\n\nexport const syncAllNodesToNeo4j = internalAction({\n args: {\n batchSize: v.optional(v.number()),\n cursor: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const batchSize = args.batchSize ?? 100;\n\n const result = await ctx.runQuery(\n internal.neo4jSyncHelpers.getNodeBatchForSync,\n {\n limit: batchSize,\n cursor: args.cursor,\n }\n );\n\n if (result.nodes.length === 0) {\n return { synced: 0, failed: 0, hasMore: false };\n }\n\n const nodesByLabel = new Map<\n string,\n Array<{ globalId: string; properties: Record<string, unknown> }>\n >();\n\n for (const node of result.nodes) {\n const label = NODE_TYPE_TO_LABEL[node.nodeType] || \"Node\";\n if (!nodesByLabel.has(label)) {\n nodesByLabel.set(label, []);\n }\n nodesByLabel.get(label)?.push({\n globalId: node.globalId,\n properties: buildNodeProperties(node as any),\n });\n }\n\n let synced = 0;\n let failed = 0;\n\n for (const [label, nodes] of nodesByLabel) {\n try {\n await batchUpsertNodes(label, nodes);\n synced += nodes.length;\n console.log(\n `[Neo4j Sync] Batch upserted ${nodes.length} ${label} nodes`\n );\n } catch (error) {\n console.error(`[Neo4j Sync] Batch upsert failed for ${label}:`, error);\n failed += nodes.length;\n }\n }\n\n return {\n synced,\n failed,\n hasMore: result.hasMore,\n nextCursor: result.nextCursor,\n };\n },\n});\n\nexport const syncAllEdgesToNeo4j = internalAction({\n args: {\n batchSize: v.optional(v.number()),\n cursor: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const batchSize = args.batchSize ?? 100;\n\n const result = await ctx.runQuery(\n internal.neo4jSyncHelpers.getEdgeBatchForSync,\n {\n limit: batchSize,\n cursor: args.cursor,\n }\n );\n\n if (result.edges.length === 0) {\n return { synced: 0, failed: 0, hasMore: false };\n }\n\n const edgesToSync: Array<{\n relType: string;\n globalId: string;\n fromGlobalId: string;\n toGlobalId: string;\n properties: Record<string, unknown>;\n }> = [];\n\n for (const edge of result.edges) {\n if (!edge.fromGlobalId || !edge.toGlobalId) {\n console.warn(\n `[Neo4j Sync] Skipping edge ${edge.globalId} - missing globalIds`\n );\n continue;\n }\n const relType =\n EDGE_TYPE_TO_REL[edge.edgeType] || edge.edgeType.toUpperCase();\n edgesToSync.push({\n relType,\n globalId: edge.globalId,\n fromGlobalId: edge.fromGlobalId,\n toGlobalId: edge.toGlobalId,\n properties: buildEdgeProperties(edge as any),\n });\n }\n\n let synced = 0;\n let failed = 0;\n\n try {\n await batchUpsertEdges(edgesToSync);\n synced = edgesToSync.length;\n console.log(`[Neo4j Sync] Batch upserted ${synced} edges`);\n } catch (error) {\n console.error(\"[Neo4j Sync] Batch edge upsert failed:\", error);\n failed = edgesToSync.length;\n }\n\n return {\n synced,\n failed,\n hasMore: result.hasMore,\n nextCursor: result.nextCursor,\n };\n },\n});\n\n// =============================================================================\n// FULL BACKFILL\n// =============================================================================\n\nexport const backfillAllToNeo4j = internalAction({\n args: {\n batchSize: v.optional(v.number()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const batchSize = args.batchSize ?? 100;\n let totalNodes = 0;\n let totalEdges = 0;\n let totalFailed = 0;\n\n console.log(\"[Neo4j Sync] Starting full backfill...\");\n\n // Sync all nodes first\n let nodeCursor: string | undefined;\n do {\n const result = await ctx.runAction(\n internal.neo4jSync.syncAllNodesToNeo4j,\n {\n batchSize,\n cursor: nodeCursor,\n }\n );\n totalNodes += result.synced;\n totalFailed += result.failed;\n nodeCursor = result.hasMore ? result.nextCursor : undefined;\n console.log(\n `[Neo4j Sync] Nodes progress: ${totalNodes} synced, ${totalFailed} failed`\n );\n } while (nodeCursor);\n\n console.log(`[Neo4j Sync] Finished nodes: ${totalNodes} synced`);\n\n // Then sync all edges\n let edgeCursor: string | undefined;\n do {\n const result = await ctx.runAction(\n internal.neo4jSync.syncAllEdgesToNeo4j,\n {\n batchSize,\n cursor: edgeCursor,\n }\n );\n totalEdges += result.synced;\n totalFailed += result.failed;\n edgeCursor = result.hasMore ? result.nextCursor : undefined;\n console.log(\n `[Neo4j Sync] Edges progress: ${totalEdges} synced, ${totalFailed} failed`\n );\n } while (edgeCursor);\n\n console.log(\n `[Neo4j Sync] Backfill complete: ${totalNodes} nodes, ${totalEdges} edges, ${totalFailed} failed`\n );\n\n return {\n totalNodes,\n totalEdges,\n totalFailed,\n };\n },\n});\n\n// =============================================================================\n// RETRY QUEUE PROCESSING\n// =============================================================================\n\nexport const processRetryQueue = internalAction({\n args: {\n limit: v.optional(v.number()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const limit = args.limit ?? 10;\n\n const pendingItems = await ctx.runQuery(\n internal.neo4jSyncHelpers.getPendingRetries,\n { limit }\n );\n\n if (pendingItems.length === 0) {\n return { processed: 0, succeeded: 0, failed: 0 };\n }\n\n let succeeded = 0;\n let failed = 0;\n\n for (const item of pendingItems) {\n await ctx.runMutation(internal.neo4jSyncHelpers.updateQueueStatus, {\n queueId: item._id,\n status: \"in_progress\",\n });\n\n let result: Pick<SyncResult, \"success\" | \"error\">;\n\n if (item.entityType === \"node\") {\n result = await ctx.runAction(internal.neo4jSync.syncNodeToNeo4j, {\n nodeId: item.entityId as Id<\"epistemicNodes\">,\n operation: item.operation,\n });\n } else {\n const resolved = await ctx.runQuery(\n internal.neo4jSyncHelpers.resolveEdgeRetryTarget,\n {\n entityId: item.entityId,\n }\n );\n\n if (\n resolved.mode === \"convex_id\" ||\n resolved.mode === \"global_id_in_convex\"\n ) {\n result = await ctx.runAction(internal.neo4jSync.syncEdgeToNeo4j, {\n edgeId: resolved.edgeId as Id<\"epistemicEdges\">,\n operation: item.operation,\n });\n } else {\n // Edge exists in Neo4j but not in Convex projection; retry mirror by globalId.\n result = await ctx.runAction(\n internal.neo4jEdgeAPI.retryProjectionByGlobalId,\n {\n globalId: resolved.edgeGlobalId,\n }\n );\n }\n }\n\n if (result.success) {\n await ctx.runMutation(internal.neo4jSyncHelpers.updateQueueStatus, {\n queueId: item._id,\n status: \"succeeded\",\n });\n succeeded++;\n } else {\n const updated = await ctx.runMutation(\n internal.neo4jSyncHelpers.incrementAttempts,\n {\n queueId: item._id,\n error: result.error || \"Unknown error\",\n }\n );\n if (updated.failed) {\n failed++;\n }\n }\n }\n\n return { processed: pendingItems.length, succeeded, failed };\n },\n});\n\n// =============================================================================\n// EMBEDDING SYNC (triggered after embedding generation)\n// =============================================================================\n\n/**\n * Sync an embedding vector to an existing Neo4j node.\n * Called after saveEpistemicNodeEmbedding completes, ensuring the\n * embedding reaches Neo4j even if the initial node sync ran before\n * the embedding was generated.\n */\nexport const syncEmbeddingToNeo4j = internalAction({\n args: {\n nodeId: v.id(\"epistemicNodes\"),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const connInfo = getConnectionInfo();\n if (!connInfo.configured) {\n return buildSyncFailure(\"embedding\", \"sync\", \"Missing credentials\", {\n skippedReason: \"credentials_missing\",\n });\n }\n\n const node = await ctx.runQuery(internal.neo4jSyncHelpers.getNodeForSync, {\n nodeId: args.nodeId,\n });\n if (!node?.globalId) {\n return buildSyncFailure(\"embedding\", \"sync\", \"Node not found\", {\n skippedReason: \"source_node_missing\",\n });\n }\n\n const embedding = await ctx.runQuery(\n internal.neo4jSyncHelpers.getEmbeddingForSync,\n { nodeId: args.nodeId }\n );\n if (!embedding) {\n return buildSyncFailure(\"embedding\", \"sync\", \"Embedding not found\", {\n skippedReason: \"embedding_missing\",\n });\n }\n\n try {\n await runWriteTransaction(\n \"MATCH (n {globalId: $globalId}) SET n.embedding = $embedding\",\n { globalId: node.globalId, embedding }\n );\n console.log(\n `[Neo4j Sync] Synced ${embedding.length}-dim embedding for node ${node.globalId}`\n );\n return buildSyncSuccess(\"embedding\", \"sync\");\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : \"Unknown error\";\n console.error(\"[Neo4j Sync] Embedding sync error:\", errorMsg);\n return buildSyncFailure(\"embedding\", \"sync\", errorMsg);\n }\n },\n});\n\n// =============================================================================\n// HEALTH CHECK\n// =============================================================================\n\nexport const checkNeo4jHealth = internalAction({\n args: {},\n returns: permissiveReturn,\n handler: async () => {\n const connInfo = getConnectionInfo();\n if (!connInfo.configured) {\n return {\n healthy: false,\n error: \"Neo4j not configured\",\n uri: connInfo.uri,\n };\n }\n\n const health = await healthCheck();\n return {\n ...health,\n uri: connInfo.uri,\n };\n },\n});\n\n// =============================================================================\n// RE-SYNC ALL NODES (to update with new properties like projectId, pillar)\n// =============================================================================\n\n/**\n * Re-sync all epistemic nodes to Neo4j with updated properties (paginated)\n * Use after adding new fields to the sync\n */\nexport const resyncAllNodes = internalAction({\n args: {\n batchSize: v.optional(v.number()),\n nodeType: v.optional(v.string()),\n cursor: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const batchSize = args.batchSize ?? 50;\n\n // Get nodes with cursor\n const result = await ctx.runQuery(\n internal.neo4jSyncHelpers.getAllNodesForResync,\n {\n nodeType: args.nodeType,\n limit: batchSize,\n cursor: args.cursor,\n }\n );\n\n let synced = 0;\n let failed = 0;\n\n for (const node of result.nodes) {\n try {\n const syncResult = await ctx.runAction(\n internal.neo4jSync.syncNodeToNeo4j,\n {\n nodeId: node._id,\n operation: \"upsert\",\n }\n );\n if (syncResult.success) {\n synced++;\n } else {\n failed++;\n }\n } catch (error) {\n console.error(`[Neo4j Resync] Failed to sync node ${node._id}:`, error);\n failed++;\n }\n }\n\n return {\n synced,\n failed,\n total: result.nodes.length,\n hasMore: result.hasMore,\n nextCursor: result.nextCursor,\n };\n },\n});\n\n/**\n * Re-sync all epistemic edges to Neo4j with updated properties (paginated)\n * Use after adding new fields to the sync (e.g., classification fields)\n */\nexport const resyncAllEdges = internalAction({\n args: {\n batchSize: v.optional(v.number()),\n cursor: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const batchSize = args.batchSize ?? 50;\n\n // Get edges with cursor\n const result = await ctx.runQuery(\n internal.neo4jSyncHelpers.getAllEdgesForResync,\n {\n limit: batchSize,\n cursor: args.cursor,\n }\n );\n\n let synced = 0;\n let failed = 0;\n\n for (const edge of result.edges) {\n try {\n const syncResult = await ctx.runAction(\n internal.neo4jSync.syncEdgeToNeo4j,\n {\n edgeId: edge._id,\n operation: \"upsert\",\n }\n );\n if (syncResult.success) {\n synced++;\n } else {\n failed++;\n }\n } catch (error) {\n console.error(`[Neo4j Resync] Failed to sync edge ${edge._id}:`, error);\n failed++;\n }\n }\n\n return {\n synced,\n failed,\n total: result.edges.length,\n hasMore: result.hasMore,\n nextCursor: result.nextCursor,\n };\n },\n});\n"]}
@@ -1,9 +1,8 @@
1
1
  import { v } from 'convex/values';
2
2
  import { permissiveReturn } from '@lucern/contracts/schema-helpers/validators';
3
- import { componentsGeneric, internalMutationGeneric, internalQueryGeneric } from 'convex/server';
3
+ import { internalMutationGeneric, internalQueryGeneric } from 'convex/server';
4
4
 
5
5
  // src/neo4jSyncHelpers.ts
6
- componentsGeneric();
7
6
  var internalMutation = internalMutationGeneric;
8
7
  var internalQuery = internalQueryGeneric;
9
8
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/convex.ts","../src/neo4jSyncHelpers.ts"],"names":["result"],"mappings":"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","file":"neo4jSyncHelpers.js","sourcesContent":["import {\n actionGeneric,\n anyApi,\n componentsGeneric,\n httpActionGeneric,\n internalActionGeneric,\n internalMutationGeneric,\n internalQueryGeneric,\n mutationGeneric,\n queryGeneric,\n} from \"convex/server\";\nimport type { GenericId } from \"convex/values\";\n\nexport const api = anyApi as any;\nexport const components = componentsGeneric() as any;\nexport const internal = anyApi as any;\n\nexport type TableNames = string;\nexport type Id<TableName extends TableNames = string> = GenericId<TableName>;\nexport type Doc<TableName extends TableNames = string> = any;\nexport type DataModel = any;\nexport type ActionCtx = any;\nexport type DatabaseReader = any;\nexport type DatabaseWriter = any;\nexport type MutationCtx = any;\nexport type QueryCtx = any;\n\ntype ConvexFunctionBuilder = <Definition extends {\n handler?: (...args: any[]) => any;\n}>(\n definition: Definition\n) => any;\n\nexport const action = actionGeneric as unknown as ConvexFunctionBuilder;\nexport const httpAction = httpActionGeneric as unknown as ConvexFunctionBuilder;\nexport const internalAction =\n internalActionGeneric as unknown as ConvexFunctionBuilder;\nexport const internalMutation =\n internalMutationGeneric as unknown as ConvexFunctionBuilder;\nexport const internalQuery =\n internalQueryGeneric as unknown as ConvexFunctionBuilder;\nexport const mutation = mutationGeneric as unknown as ConvexFunctionBuilder;\nexport const query = queryGeneric as unknown as ConvexFunctionBuilder;\n","/**\n * Neo4j Sync Helpers - Queries and Mutations\n *\n * These are Convex queries and mutations that support the Neo4j sync process.\n * Separated from neo4jSync.ts because that file uses \"use node\" directive\n * which only supports actions.\n */\n\nimport { v } from \"convex/values\";\nimport { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\nimport { internalMutation, internalQuery } from \"./convex\";\n\nfunction logRetryTargetFallback(context: string, error: unknown): void {\n const env = (globalThis as {\n process?: { env?: Record<string, string | undefined> };\n }).process?.env;\n if (env?.LUCERN_GRAPH_SYNC_DEBUG !== \"1\") {\n return;\n }\n\n console.debug(\"[graph-sync][neo4jSyncHelpers]\", context, error);\n}\n\n// =============================================================================\n// SYNC LOG (for debugging)\n// =============================================================================\n\nexport const logSyncEvent = internalMutation({\n args: {\n eventType: v.union(\n v.literal(\"node_created\"),\n v.literal(\"node_updated\"),\n v.literal(\"node_deleted\"),\n v.literal(\"edge_created\"),\n v.literal(\"edge_deleted\")\n ),\n entityId: v.string(),\n entityType: v.string(),\n status: v.union(\n v.literal(\"pending\"),\n v.literal(\"success\"),\n v.literal(\"failed\")\n ),\n error: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (_ctx, args) => {\n console.log(\n `[Neo4j Sync] ${args.eventType} ${args.entityType}:${args.entityId} - ${args.status}`,\n args.error || \"\"\n );\n },\n});\n\n// =============================================================================\n// NODE/EDGE QUERIES\n// =============================================================================\n\nexport const getNodeForSync = internalQuery({\n args: { nodeId: v.id(\"epistemicNodes\") },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n return await ctx.db.get(args.nodeId);\n },\n});\n\n/**\n * Get the embedding vector for a node, if it exists.\n * Used by neo4jSync to include embeddings in node upserts.\n */\nexport const getEmbeddingForSync = internalQuery({\n args: { nodeId: v.id(\"epistemicNodes\") },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const record = await ctx.db\n .query(\"epistemicNodeEmbeddings\")\n .withIndex(\"by_nodeId\", (q: any) => q.eq(\"nodeId\", args.nodeId))\n .first();\n return record?.embedding ?? null;\n },\n});\n\n/**\n * Get all nodes for re-sync with optional type filter (paginated)\n */\nexport const getAllNodesForResync = internalQuery({\n args: {\n nodeType: v.optional(v.string()),\n limit: v.optional(v.number()),\n cursor: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const limit = args.limit ?? 100;\n\n const paginationOpts = {\n numItems: limit,\n cursor: args.cursor ?? null,\n };\n\n if (args.nodeType) {\n const result = await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_nodeType\", (q: any) =>\n q.eq(\"nodeType\", args.nodeType as any)\n )\n .paginate(paginationOpts);\n return {\n nodes: result.page,\n hasMore: !result.isDone,\n nextCursor: result.continueCursor,\n };\n }\n\n const result = await ctx.db\n .query(\"epistemicNodes\")\n .order(\"asc\")\n .paginate(paginationOpts);\n\n return {\n nodes: result.page,\n hasMore: !result.isDone,\n nextCursor: result.continueCursor,\n };\n },\n});\n\nexport const getEdgeForSync = internalQuery({\n args: { edgeId: v.id(\"epistemicEdges\") },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const edge = await ctx.db.get(args.edgeId);\n if (!edge) {\n return null;\n }\n\n const fromNode = edge.fromNodeId ? await ctx.db.get(edge.fromNodeId) : null;\n const toNode = edge.toNodeId ? await ctx.db.get(edge.toNodeId) : null;\n\n return {\n ...edge,\n // Cross-graph edges may not have toNodeId/fromNodeId in Convex mirror.\n // Fall back to denormalized global IDs when node lookup is unavailable.\n fromGlobalId: (fromNode as any)?.globalId || edge.sourceGlobalId,\n toGlobalId: (toNode as any)?.globalId || edge.targetGlobalId,\n };\n },\n});\n\n/**\n * Get all edges for re-sync (paginated)\n */\nexport const getAllEdgesForResync = internalQuery({\n args: {\n limit: v.optional(v.number()),\n cursor: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const limit = args.limit ?? 100;\n\n const paginationOpts = {\n numItems: limit,\n cursor: args.cursor ?? null,\n };\n\n const result = await ctx.db\n .query(\"epistemicEdges\")\n .order(\"asc\")\n .paginate(paginationOpts);\n\n return {\n edges: result.page,\n hasMore: !result.isDone,\n nextCursor: result.continueCursor,\n };\n },\n});\n\nexport const getNodeBatchForSync = internalQuery({\n args: {\n limit: v.number(),\n cursor: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const paginationOpts = {\n numItems: args.limit,\n cursor: args.cursor ?? null,\n };\n\n const result = await ctx.db\n .query(\"epistemicNodes\")\n .order(\"asc\")\n .paginate(paginationOpts);\n\n return {\n nodes: result.page,\n hasMore: !result.isDone,\n nextCursor: result.continueCursor,\n };\n },\n});\n\nexport const getEdgeBatchForSync = internalQuery({\n args: {\n limit: v.number(),\n cursor: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const paginationOpts = {\n numItems: args.limit,\n cursor: args.cursor ?? null,\n };\n\n const result = await ctx.db\n .query(\"epistemicEdges\")\n .order(\"asc\")\n .paginate(paginationOpts);\n\n // Enrich edges with globalIds\n const enrichedEdges = await Promise.all(\n result.page.map(async (edge: any) => {\n const fromNode = await ctx.db.get(edge.fromNodeId);\n const toNode = edge.toNodeId ? await ctx.db.get(edge.toNodeId) : null;\n return {\n ...edge,\n fromGlobalId: fromNode?.globalId || edge.sourceGlobalId,\n toGlobalId: toNode?.globalId || edge.targetGlobalId,\n };\n })\n );\n\n return {\n edges: enrichedEdges,\n hasMore: !result.isDone,\n nextCursor: result.continueCursor,\n };\n },\n});\n\n/**\n * Resolve retry queue entityId for edge operations.\n *\n * Queue entries can contain either:\n * - Convex edge document IDs (legacy sync retries)\n * - Edge globalIds (projection retries from Neo4j-first writes)\n */\nexport const resolveEdgeRetryTarget = internalQuery({\n args: {\n entityId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n // First, attempt direct Convex edge ID lookup.\n try {\n const byId = await ctx.db.get(args.entityId as any);\n if (byId && \"edgeType\" in byId && \"fromNodeId\" in byId) {\n return {\n mode: \"convex_id\" as const,\n edgeId: byId._id,\n edgeGlobalId: byId.globalId,\n };\n }\n } catch (error) {\n logRetryTargetFallback(\n `direct edge lookup fallback for entityId=${args.entityId}`,\n error\n );\n }\n\n // Then attempt lookup by edge globalId.\n const byGlobalId = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_globalId\", (q: any) => q.eq(\"globalId\", args.entityId))\n .first();\n\n if (byGlobalId) {\n return {\n mode: \"global_id_in_convex\" as const,\n edgeId: byGlobalId._id,\n edgeGlobalId: byGlobalId.globalId,\n };\n }\n\n // Neo4j-only edge (projection may have failed and never mirrored).\n return {\n mode: \"global_id_only\" as const,\n edgeGlobalId: args.entityId,\n };\n },\n});\n\n// =============================================================================\n// RETRY QUEUE MUTATIONS\n// =============================================================================\n\nexport const queueForRetry = internalMutation({\n args: {\n entityType: v.union(v.literal(\"node\"), v.literal(\"edge\")),\n entityId: v.string(),\n operation: v.union(v.literal(\"upsert\"), v.literal(\"delete\")),\n error: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const now = Date.now();\n\n const existing = await ctx.db\n .query(\"neo4jSyncQueue\")\n .withIndex(\"by_entity\", (q: any) =>\n q.eq(\"entityType\", args.entityType).eq(\"entityId\", args.entityId)\n )\n .first();\n\n if (existing) {\n const attempts = existing.attempts ?? 0;\n const maxAttempts = existing.maxAttempts ?? 5;\n await ctx.db.patch(existing._id, {\n attempts: attempts + 1,\n maxAttempts,\n lastAttemptAt: now,\n lastError: args.error,\n status:\n attempts + 1 >= maxAttempts ? \"failed\" : \"pending\",\n updatedAt: now,\n });\n return { queued: true, updated: true, queueId: existing._id };\n }\n\n const queueId = await ctx.db.insert(\"neo4jSyncQueue\", {\n entityType: args.entityType,\n entityId: args.entityId,\n operation: args.operation,\n attempts: 1,\n maxAttempts: 5,\n lastAttemptAt: now,\n lastError: args.error,\n status: \"pending\",\n createdAt: now,\n updatedAt: now,\n });\n\n return { queued: true, updated: false, queueId };\n },\n});\n\nexport const getPendingRetries = internalQuery({\n args: {\n limit: v.number(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n return await ctx.db\n .query(\"neo4jSyncQueue\")\n .withIndex(\"by_status\", (q: any) => q.eq(\"status\", \"pending\"))\n .take(args.limit);\n },\n});\n\nexport const updateQueueStatus = internalMutation({\n args: {\n queueId: v.id(\"neo4jSyncQueue\"),\n status: v.union(\n v.literal(\"pending\"),\n v.literal(\"in_progress\"),\n v.literal(\"failed\"),\n v.literal(\"succeeded\")\n ),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n await ctx.db.patch(args.queueId, {\n status: args.status,\n updatedAt: Date.now(),\n });\n },\n});\n\nexport const incrementAttempts = internalMutation({\n args: {\n queueId: v.id(\"neo4jSyncQueue\"),\n error: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const item = await ctx.db.get(args.queueId);\n if (!item) {\n return { failed: false };\n }\n\n const attempts = item.attempts ?? 0;\n const maxAttempts = item.maxAttempts ?? 5;\n const newAttempts = attempts + 1;\n const isFailed = newAttempts >= maxAttempts;\n\n await ctx.db.patch(args.queueId, {\n attempts: newAttempts,\n maxAttempts,\n lastAttemptAt: Date.now(),\n lastError: args.error,\n status: isFailed ? \"failed\" : \"pending\",\n updatedAt: Date.now(),\n });\n\n return { failed: isFailed };\n },\n});\n\n// =============================================================================\n// HEALTH CHECK QUERY\n// =============================================================================\n\nexport const checkSyncHealth = internalQuery({\n args: {},\n returns: permissiveReturn,\n handler: async (ctx) => {\n const now = Date.now();\n const oneHourAgo = now - 60 * 60 * 1000;\n\n const recentNodes = await ctx.db\n .query(\"epistemicNodes\")\n .filter((q: any) => q.gte(q.field(\"updatedAt\"), oneHourAgo))\n .collect();\n\n const recentEdges = await ctx.db\n .query(\"epistemicEdges\")\n .filter((q: any) => q.gte(q.field(\"createdAt\"), oneHourAgo))\n .collect();\n\n const pendingRetries = await ctx.db\n .query(\"neo4jSyncQueue\")\n .withIndex(\"by_status\", (q: any) => q.eq(\"status\", \"pending\"))\n .collect();\n\n const failedRetries = await ctx.db\n .query(\"neo4jSyncQueue\")\n .withIndex(\"by_status\", (q: any) => q.eq(\"status\", \"failed\"))\n .collect();\n\n return {\n recentNodesUpdated: recentNodes.length,\n recentEdgesUpdated: recentEdges.length,\n pendingRetries: pendingRetries.length,\n failedRetries: failedRetries.length,\n healthStatus:\n failedRetries.length > 10\n ? \"unhealthy\"\n : pendingRetries.length > 50\n ? \"degraded\"\n : \"healthy\",\n checkedAt: now,\n };\n },\n});\n"]}
1
+ {"version":3,"sources":["../src/convex.ts","../src/neo4jSyncHelpers.ts"],"names":["result"],"mappings":"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","file":"neo4jSyncHelpers.js","sourcesContent":["import {\n actionGeneric,\n anyApi,\n internalActionGeneric,\n internalMutationGeneric,\n internalQueryGeneric,\n} from \"convex/server\";\nimport type { GenericId } from \"convex/values\";\n\nexport const internal = anyApi as any;\n\ntype TableNames = string;\nexport type Id<TableName extends TableNames = string> = GenericId<TableName>;\ntype ConvexFunctionBuilder = <Definition extends {\n handler?: (...args: any[]) => any;\n}>(\n definition: Definition\n) => any;\n\nexport const action = actionGeneric as unknown as ConvexFunctionBuilder;\nexport const internalAction =\n internalActionGeneric as unknown as ConvexFunctionBuilder;\nexport const internalMutation =\n internalMutationGeneric as unknown as ConvexFunctionBuilder;\nexport const internalQuery =\n internalQueryGeneric as unknown as ConvexFunctionBuilder;\n","/**\n * Neo4j Sync Helpers - Queries and Mutations\n *\n * These are Convex queries and mutations that support the Neo4j sync process.\n * Separated from neo4jSync.ts because that file uses \"use node\" directive\n * which only supports actions.\n */\n\nimport { v } from \"convex/values\";\nimport { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\nimport { internalMutation, internalQuery } from \"./convex\";\n\nfunction logRetryTargetFallback(context: string, error: unknown): void {\n const env = (globalThis as {\n process?: { env?: Record<string, string | undefined> };\n }).process?.env;\n if (env?.LUCERN_GRAPH_SYNC_DEBUG !== \"1\") {\n return;\n }\n\n console.debug(\"[graph-sync][neo4jSyncHelpers]\", context, error);\n}\n\n// =============================================================================\n// SYNC LOG (for debugging)\n// =============================================================================\n\nexport const logSyncEvent = internalMutation({\n args: {\n eventType: v.union(\n v.literal(\"node_created\"),\n v.literal(\"node_updated\"),\n v.literal(\"node_deleted\"),\n v.literal(\"edge_created\"),\n v.literal(\"edge_deleted\")\n ),\n entityId: v.string(),\n entityType: v.string(),\n status: v.union(\n v.literal(\"pending\"),\n v.literal(\"success\"),\n v.literal(\"failed\")\n ),\n error: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (_ctx, args) => {\n console.log(\n `[Neo4j Sync] ${args.eventType} ${args.entityType}:${args.entityId} - ${args.status}`,\n args.error || \"\"\n );\n },\n});\n\n// =============================================================================\n// NODE/EDGE QUERIES\n// =============================================================================\n\nexport const getNodeForSync = internalQuery({\n args: { nodeId: v.id(\"epistemicNodes\") },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n return await ctx.db.get(args.nodeId);\n },\n});\n\n/**\n * Get the embedding vector for a node, if it exists.\n * Used by neo4jSync to include embeddings in node upserts.\n */\nexport const getEmbeddingForSync = internalQuery({\n args: { nodeId: v.id(\"epistemicNodes\") },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const record = await ctx.db\n .query(\"epistemicNodeEmbeddings\")\n .withIndex(\"by_nodeId\", (q: any) => q.eq(\"nodeId\", args.nodeId))\n .first();\n return record?.embedding ?? null;\n },\n});\n\n/**\n * Get all nodes for re-sync with optional type filter (paginated)\n */\nexport const getAllNodesForResync = internalQuery({\n args: {\n nodeType: v.optional(v.string()),\n limit: v.optional(v.number()),\n cursor: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const limit = args.limit ?? 100;\n\n const paginationOpts = {\n numItems: limit,\n cursor: args.cursor ?? null,\n };\n\n if (args.nodeType) {\n const result = await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_nodeType\", (q: any) =>\n q.eq(\"nodeType\", args.nodeType as any)\n )\n .paginate(paginationOpts);\n return {\n nodes: result.page,\n hasMore: !result.isDone,\n nextCursor: result.continueCursor,\n };\n }\n\n const result = await ctx.db\n .query(\"epistemicNodes\")\n .order(\"asc\")\n .paginate(paginationOpts);\n\n return {\n nodes: result.page,\n hasMore: !result.isDone,\n nextCursor: result.continueCursor,\n };\n },\n});\n\nexport const getEdgeForSync = internalQuery({\n args: { edgeId: v.id(\"epistemicEdges\") },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const edge = await ctx.db.get(args.edgeId);\n if (!edge) {\n return null;\n }\n\n const fromNode = edge.fromNodeId ? await ctx.db.get(edge.fromNodeId) : null;\n const toNode = edge.toNodeId ? await ctx.db.get(edge.toNodeId) : null;\n\n return {\n ...edge,\n // Cross-graph edges may not have toNodeId/fromNodeId in Convex mirror.\n // Fall back to denormalized global IDs when node lookup is unavailable.\n fromGlobalId: (fromNode as any)?.globalId || edge.sourceGlobalId,\n toGlobalId: (toNode as any)?.globalId || edge.targetGlobalId,\n };\n },\n});\n\n/**\n * Get all edges for re-sync (paginated)\n */\nexport const getAllEdgesForResync = internalQuery({\n args: {\n limit: v.optional(v.number()),\n cursor: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const limit = args.limit ?? 100;\n\n const paginationOpts = {\n numItems: limit,\n cursor: args.cursor ?? null,\n };\n\n const result = await ctx.db\n .query(\"epistemicEdges\")\n .order(\"asc\")\n .paginate(paginationOpts);\n\n return {\n edges: result.page,\n hasMore: !result.isDone,\n nextCursor: result.continueCursor,\n };\n },\n});\n\nexport const getNodeBatchForSync = internalQuery({\n args: {\n limit: v.number(),\n cursor: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const paginationOpts = {\n numItems: args.limit,\n cursor: args.cursor ?? null,\n };\n\n const result = await ctx.db\n .query(\"epistemicNodes\")\n .order(\"asc\")\n .paginate(paginationOpts);\n\n return {\n nodes: result.page,\n hasMore: !result.isDone,\n nextCursor: result.continueCursor,\n };\n },\n});\n\nexport const getEdgeBatchForSync = internalQuery({\n args: {\n limit: v.number(),\n cursor: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const paginationOpts = {\n numItems: args.limit,\n cursor: args.cursor ?? null,\n };\n\n const result = await ctx.db\n .query(\"epistemicEdges\")\n .order(\"asc\")\n .paginate(paginationOpts);\n\n // Enrich edges with globalIds\n const enrichedEdges = await Promise.all(\n result.page.map(async (edge: any) => {\n const fromNode = await ctx.db.get(edge.fromNodeId);\n const toNode = edge.toNodeId ? await ctx.db.get(edge.toNodeId) : null;\n return {\n ...edge,\n fromGlobalId: fromNode?.globalId || edge.sourceGlobalId,\n toGlobalId: toNode?.globalId || edge.targetGlobalId,\n };\n })\n );\n\n return {\n edges: enrichedEdges,\n hasMore: !result.isDone,\n nextCursor: result.continueCursor,\n };\n },\n});\n\n/**\n * Resolve retry queue entityId for edge operations.\n *\n * Queue entries can contain either:\n * - Convex edge document IDs (legacy sync retries)\n * - Edge globalIds (projection retries from Neo4j-first writes)\n */\nexport const resolveEdgeRetryTarget = internalQuery({\n args: {\n entityId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n // First, attempt direct Convex edge ID lookup.\n try {\n const byId = await ctx.db.get(args.entityId as any);\n if (byId && \"edgeType\" in byId && \"fromNodeId\" in byId) {\n return {\n mode: \"convex_id\" as const,\n edgeId: byId._id,\n edgeGlobalId: byId.globalId,\n };\n }\n } catch (error) {\n logRetryTargetFallback(\n `direct edge lookup fallback for entityId=${args.entityId}`,\n error\n );\n }\n\n // Then attempt lookup by edge globalId.\n const byGlobalId = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_globalId\", (q: any) => q.eq(\"globalId\", args.entityId))\n .first();\n\n if (byGlobalId) {\n return {\n mode: \"global_id_in_convex\" as const,\n edgeId: byGlobalId._id,\n edgeGlobalId: byGlobalId.globalId,\n };\n }\n\n // Neo4j-only edge (projection may have failed and never mirrored).\n return {\n mode: \"global_id_only\" as const,\n edgeGlobalId: args.entityId,\n };\n },\n});\n\n// =============================================================================\n// RETRY QUEUE MUTATIONS\n// =============================================================================\n\nexport const queueForRetry = internalMutation({\n args: {\n entityType: v.union(v.literal(\"node\"), v.literal(\"edge\")),\n entityId: v.string(),\n operation: v.union(v.literal(\"upsert\"), v.literal(\"delete\")),\n error: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const now = Date.now();\n\n const existing = await ctx.db\n .query(\"neo4jSyncQueue\")\n .withIndex(\"by_entity\", (q: any) =>\n q.eq(\"entityType\", args.entityType).eq(\"entityId\", args.entityId)\n )\n .first();\n\n if (existing) {\n const attempts = existing.attempts ?? 0;\n const maxAttempts = existing.maxAttempts ?? 5;\n await ctx.db.patch(existing._id, {\n attempts: attempts + 1,\n maxAttempts,\n lastAttemptAt: now,\n lastError: args.error,\n status:\n attempts + 1 >= maxAttempts ? \"failed\" : \"pending\",\n updatedAt: now,\n });\n return { queued: true, updated: true, queueId: existing._id };\n }\n\n const queueId = await ctx.db.insert(\"neo4jSyncQueue\", {\n entityType: args.entityType,\n entityId: args.entityId,\n operation: args.operation,\n attempts: 1,\n maxAttempts: 5,\n lastAttemptAt: now,\n lastError: args.error,\n status: \"pending\",\n createdAt: now,\n updatedAt: now,\n });\n\n return { queued: true, updated: false, queueId };\n },\n});\n\nexport const getPendingRetries = internalQuery({\n args: {\n limit: v.number(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n return await ctx.db\n .query(\"neo4jSyncQueue\")\n .withIndex(\"by_status\", (q: any) => q.eq(\"status\", \"pending\"))\n .take(args.limit);\n },\n});\n\nexport const updateQueueStatus = internalMutation({\n args: {\n queueId: v.id(\"neo4jSyncQueue\"),\n status: v.union(\n v.literal(\"pending\"),\n v.literal(\"in_progress\"),\n v.literal(\"failed\"),\n v.literal(\"succeeded\")\n ),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n await ctx.db.patch(args.queueId, {\n status: args.status,\n updatedAt: Date.now(),\n });\n },\n});\n\nexport const incrementAttempts = internalMutation({\n args: {\n queueId: v.id(\"neo4jSyncQueue\"),\n error: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const item = await ctx.db.get(args.queueId);\n if (!item) {\n return { failed: false };\n }\n\n const attempts = item.attempts ?? 0;\n const maxAttempts = item.maxAttempts ?? 5;\n const newAttempts = attempts + 1;\n const isFailed = newAttempts >= maxAttempts;\n\n await ctx.db.patch(args.queueId, {\n attempts: newAttempts,\n maxAttempts,\n lastAttemptAt: Date.now(),\n lastError: args.error,\n status: isFailed ? \"failed\" : \"pending\",\n updatedAt: Date.now(),\n });\n\n return { failed: isFailed };\n },\n});\n\n// =============================================================================\n// HEALTH CHECK QUERY\n// =============================================================================\n\nexport const checkSyncHealth = internalQuery({\n args: {},\n returns: permissiveReturn,\n handler: async (ctx) => {\n const now = Date.now();\n const oneHourAgo = now - 60 * 60 * 1000;\n\n const recentNodes = await ctx.db\n .query(\"epistemicNodes\")\n .filter((q: any) => q.gte(q.field(\"updatedAt\"), oneHourAgo))\n .collect();\n\n const recentEdges = await ctx.db\n .query(\"epistemicEdges\")\n .filter((q: any) => q.gte(q.field(\"createdAt\"), oneHourAgo))\n .collect();\n\n const pendingRetries = await ctx.db\n .query(\"neo4jSyncQueue\")\n .withIndex(\"by_status\", (q: any) => q.eq(\"status\", \"pending\"))\n .collect();\n\n const failedRetries = await ctx.db\n .query(\"neo4jSyncQueue\")\n .withIndex(\"by_status\", (q: any) => q.eq(\"status\", \"failed\"))\n .collect();\n\n return {\n recentNodesUpdated: recentNodes.length,\n recentEdgesUpdated: recentEdges.length,\n pendingRetries: pendingRetries.length,\n failedRetries: failedRetries.length,\n healthStatus:\n failedRetries.length > 10\n ? \"unhealthy\"\n : pendingRetries.length > 50\n ? \"degraded\"\n : \"healthy\",\n checkedAt: now,\n };\n },\n});\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lucern/graph-sync",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -50,8 +50,8 @@
50
50
  "typecheck": "tsc --noEmit"
51
51
  },
52
52
  "dependencies": {
53
- "@lucern/contracts": "1.0.0",
54
- "@lucern/graph-primitives": "1.0.0",
53
+ "@lucern/contracts": "1.0.1",
54
+ "@lucern/graph-primitives": "1.0.1",
55
55
  "convex": "^1.17.0",
56
56
  "neo4j-driver": "^5.28.1"
57
57
  },