@lucern/graph-sync 0.3.0-alpha.9 → 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.
- package/CHANGELOG.md +12 -0
- package/README.md +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +571 -568
- package/dist/index.js.map +1 -1
- package/dist/neo4jEdgeAPI.js +1 -2
- package/dist/neo4jEdgeAPI.js.map +1 -1
- package/dist/{neo4jQueries-eF7YNiqS.d.ts → neo4jQueries-j3LrFKpY.d.ts} +118 -114
- package/dist/neo4jQueries.d.ts +1 -1
- package/dist/neo4jQueries.js +565 -564
- package/dist/neo4jQueries.js.map +1 -1
- package/dist/neo4jSync.js +1 -2
- package/dist/neo4jSync.js.map +1 -1
- package/dist/neo4jSyncHelpers.js +1 -2
- package/dist/neo4jSyncHelpers.js.map +1 -1
- package/package.json +3 -3
package/dist/neo4jEdgeAPI.js
CHANGED
|
@@ -2,10 +2,9 @@
|
|
|
2
2
|
import { v } from 'convex/values';
|
|
3
3
|
import { permissiveReturn } from '@lucern/contracts/schema-helpers/validators';
|
|
4
4
|
import { getNeo4jRelType } from '@lucern/graph-primitives/graphTypes';
|
|
5
|
-
import {
|
|
5
|
+
import { anyApi, internalActionGeneric } from 'convex/server';
|
|
6
6
|
import neo4j from 'neo4j-driver';
|
|
7
7
|
|
|
8
|
-
componentsGeneric();
|
|
9
8
|
var internal = anyApi;
|
|
10
9
|
var internalAction = internalActionGeneric;
|
|
11
10
|
var driver = null;
|
package/dist/neo4jEdgeAPI.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/convex.ts","../src/neo4jDriver.ts","../src/neo4jEdgeAPI.ts"],"names":["v"],"mappings":";;;;;;AAc0B,iBAAA;AACnB,IAAM,QAAA,GAAW,MAAA;AAoBjB,IAAM,cAAA,GACX,qBAAA;ACkFF,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;AAexC,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;AAgNO,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;;;AC1fO,IAAM,qBAAA,GAAwB;AAAA,EACnC,UAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,cAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,mBAAA;AAAA,EACA,cAAA;AAAA,EACA,SAAA;AAAA,EACA,gBAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF;AAIO,SAAS,eAAe,QAAA,EAA2B;AACxD,EAAA,OAAO,qBAAA,CAAsB,SAAS,QAA6B,CAAA;AACrE;AAEA,SAAS,kBAAkB,QAAA,EAA0B;AACnD,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,IAAA,EAAK,CAAE,WAAA,EAAY;AAC/C,EAAA,IAAI,CAAC,eAAA,CAAgB,IAAA,CAAK,UAAU,CAAA,EAAG;AACrC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oCAAA,EAAuC,QAAQ,CAAA,CAAE,CAAA;AAAA,EACnE;AACA,EAAA,OAAO,UAAA;AACT;AAEA,SAAS,wBAAwB,QAAA,EAA0B;AACzD,EAAA,MAAM,OAAA,GAAU,gBAAgB,QAAQ,CAAA;AACxC,EAAA,IAAI,CAAC,eAAA,CAAgB,IAAA,CAAK,OAAO,CAAA,EAAG;AAClC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4CAAA,EAA+C,OAAO,CAAA,CAAE,CAAA;AAAA,EAC1E;AACA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,kBAAA,CACP,QACA,GAAA,EACoB;AACpB,EAAA,MAAM,KAAA,GAAQ,SAAS,GAAG,CAAA;AAC1B,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,IAAA,GAAO,MAAA,GAAS,CAAA,GACtD,KAAA,CAAM,IAAA,EAAK,GACX,MAAA;AACN;AAEA,SAAS,kBAAA,CACP,QACA,GAAA,EACoB;AACpB,EAAA,MAAM,KAAA,GAAQ,SAAS,GAAG,CAAA;AAC1B,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,QAAA,CAAS,KAAK,IACrD,KAAA,GACA,MAAA;AACN;AAEA,SAAS,gBACP,QAAA,EACoB;AACpB,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAA,CAAO,QAAQ,QAAQ,CAAA,CAC3B,IAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,MAAA,CAAO,KAAK,CAAC,CAAA,CAAE,CAAA,CAC/C,MAAM,CAAA,EAAG,CAAC,CAAA,CACV,IAAA,CAAK,KAAK,CAAA;AACf;AAEA,eAAe,kBAAA,CACb,KACA,IAAA,EAqBe;AACf,EAAA,MAAM,GAAA,CAAI,WAAA,CAAY,QAAA,CAAS,cAAA,CAAe,oBAAoB,IAAI,CAAA;AACxE;AAEA,eAAe,cAAA,CACb,KACA,IAAA,EACe;AACf,EAAA,MAAM,GAAA,CAAI,WAAA,CAAY,QAAA,CAAS,gBAAA,CAAiB,aAAA,EAAe;AAAA,IAC7D,UAAA,EAAY,MAAA;AAAA,IACZ,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,OAAO,IAAA,CAAK;AAAA,GACb,CAAA;AACH;AAEO,IAAM,aAAa,cAAA,CAAe;AAAA,EACvC,IAAA,EAAM;AAAA,IACJ,QAAA,EAAU,EAAE,MAAA,EAAO;AAAA,IACnB,YAAA,EAAc,EAAE,MAAA,EAAO;AAAA,IACvB,UAAA,EAAY,EAAE,MAAA,EAAO;AAAA,IACrB,QAAA,EAAU,EAAE,MAAA,EAAO;AAAA,IACnB,MAAA,EAAQ,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAA;AAAA,IAC7B,UAAA,EAAY,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAA;AAAA,IACjC,OAAA,EAAS,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAA;AAAA,IAC9B,cAAA,EAAgB,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAA;AAAA,IACrC,QAAA,EAAU,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,KAAK,CAAA;AAAA,IAC5B,SAAA,EAAW,EAAE,MAAA,EAAO;AAAA,IACpB,OAAA,EAAS,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAA;AAAA,IAC9B,QAAA,EAAU,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAA;AAAA,IAC/B,WAAA,EAAa,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAA;AAAA,IAClC,SAAA,EAAW,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAA;AAAA,IAChC,OAAA,EAAS,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAA;AAAA,IAC9B,YAAA,EAAc,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAA;AAAA,IACnC,UAAA,EAAY,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAA;AAAA,IACjC,eAAA,EAAiB,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAA;AAAA,IACtC,WAAA,EAAa,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAA;AAAA,IAClC,aAAA,EAAe,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAA;AAAA,IACpC,SAAA,EAAW,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAA;AAAA,IAChC,UAAA,EAAY,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ;AAAA,GACnC;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,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,IAAA,CAAK,QAAQ,CAAA;AAChD,IAAA,MAAM,OAAA,GAAU,wBAAwB,QAAQ,CAAA;AAChD,IAAA,MAAM,QAAA,GACJ,KAAK,QAAA,IAAY,OAAO,KAAK,QAAA,KAAa,QAAA,GACrC,KAAK,QAAA,GACN,MAAA;AACN,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,UAAA,GAAa;AAAA,MACjB,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,QAAA;AAAA,MACA,MAAA,EAAQ,KAAK,MAAA,IAAU,CAAA;AAAA,MACvB,YACE,IAAA,CAAK,UAAA,IAAc,kBAAA,CAAmB,QAAA,EAAU,YAAY,CAAA,IAAK,CAAA;AAAA,MACnE,OAAA,EAAS,IAAA,CAAK,OAAA,IAAW,eAAA,CAAgB,QAAQ,CAAA,IAAK,EAAA;AAAA,MACtD,cAAA,EAAgB,KAAK,cAAA,IAAkB,EAAA;AAAA,MACvC,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,SAAA,EAAW,GAAA;AAAA,MACX,SAAA,EAAW,GAAA;AAAA,MACX,SAAS,IAAA,CAAK,OAAA,IAAW,kBAAA,CAAmB,QAAA,EAAU,SAAS,CAAA,IAAK,EAAA;AAAA,MACpE,UAAU,IAAA,CAAK,QAAA,IAAY,kBAAA,CAAmB,QAAA,EAAU,UAAU,CAAA,IAAK,EAAA;AAAA,MACvE,aACE,IAAA,CAAK,WAAA,IAAe,kBAAA,CAAmB,QAAA,EAAU,aAAa,CAAA,IAAK,EAAA;AAAA,MACrE,SAAA,EAAW,KAAK,SAAA,IAAa,EAAA;AAAA,MAC7B,OAAA,EAAS,KAAK,OAAA,IAAW,EAAA;AAAA,MACzB,YAAA,EAAc,KAAK,YAAA,IAAgB,EAAA;AAAA,MACnC,UAAA,EAAY,KAAK,UAAA,IAAc,EAAA;AAAA,MAC/B,eAAA,EAAiB,KAAK,eAAA,IAAmB,EAAA;AAAA,MACzC,WAAA,EAAa,KAAK,WAAA,IAAe,EAAA;AAAA,MACjC,aAAA,EAAe,KAAK,aAAA,IAAiB,YAAA;AAAA,MACrC,SAAA,EAAW,KAAK,SAAA,IAAa,GAAA;AAAA,MAC7B,UAAA,EAAY,KAAK,UAAA,IAAc;AAAA,KACjC;AAEA,IAAA,MAAM,SAAS,MAAM,mBAAA;AAAA,MACnB;AAAA;AAAA;AAAA,sBAAA,EAGkB,OAAO,CAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAAA,MAIzB;AAAA,QACE,cAAc,IAAA,CAAK,YAAA;AAAA,QACnB,YAAY,IAAA,CAAK,UAAA;AAAA,QACjB,UAAU,IAAA,CAAK,QAAA;AAAA,QACf;AAAA;AACF,KACF;AAEA,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,MAAM,eAAe,GAAA,EAAK;AAAA,QACxB,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,SAAA,EAAW,QAAA;AAAA,QACX,OAAO,CAAA,qDAAA,EAAwD,IAAA,CAAK,YAAY,CAAA,MAAA,EAAS,KAAK,UAAU,CAAA,CAAA;AAAA,OACzG,CAAA;AAED,MAAA,IAAI,cAAA,CAAe,QAAQ,CAAA,EAAG;AAC5B,QAAA,IAAI;AACF,UAAA,MAAM,mBAAmB,GAAA,EAAK;AAAA,YAC5B,UAAU,IAAA,CAAK,QAAA;AAAA,YACf,cAAc,IAAA,CAAK,YAAA;AAAA,YACnB,YAAY,IAAA,CAAK,UAAA;AAAA,YACjB,QAAA;AAAA,YACA,QAAQ,IAAA,CAAK,MAAA;AAAA,YACb,YAAY,IAAA,CAAK,UAAA;AAAA,YACjB,SAAS,IAAA,CAAK,OAAA;AAAA,YACd,gBAAgB,IAAA,CAAK,cAAA;AAAA,YACrB,WAAW,IAAA,CAAK,SAAA;AAAA,YAChB,SAAS,IAAA,CAAK,OAAA;AAAA,YACd,WAAW,IAAA,CAAK,SAAA;AAAA,YAChB,SAAS,IAAA,CAAK,OAAA;AAAA,YACd,cAAc,IAAA,CAAK,YAAA;AAAA,YACnB,YAAY,IAAA,CAAK,UAAA;AAAA,YACjB,iBAAiB,IAAA,CAAK,eAAA;AAAA,YACtB,aAAa,IAAA,CAAK,WAAA;AAAA,YAClB,eAAe,IAAA,CAAK,aAAA;AAAA,YACpB,WAAW,IAAA,CAAK,SAAA;AAAA,YAChB,YAAY,IAAA,CAAK;AAAA,WAClB,CAAA;AAAA,QACH,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,QAAA;AAAA,QACA,cAAA,EAAgB,IAAA;AAAA,QAChB,MAAA,EAAQ;AAAA,OACV;AAAA,IACF;AAEA,IAAA,IAAI,cAAA,CAAe,QAAQ,CAAA,EAAG;AAC5B,MAAA,IAAI;AACF,QAAA,MAAM,mBAAmB,GAAA,EAAK;AAAA,UAC5B,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,cAAc,IAAA,CAAK,YAAA;AAAA,UACnB,YAAY,IAAA,CAAK,UAAA;AAAA,UACjB,QAAA;AAAA,UACA,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,YAAY,IAAA,CAAK,UAAA;AAAA,UACjB,SAAS,IAAA,CAAK,OAAA;AAAA,UACd,gBAAgB,IAAA,CAAK,cAAA;AAAA,UACrB,WAAW,IAAA,CAAK,SAAA;AAAA,UAChB,SAAS,IAAA,CAAK,OAAA;AAAA,UACd,WAAW,IAAA,CAAK,SAAA;AAAA,UAChB,SAAS,IAAA,CAAK,OAAA;AAAA,UACd,cAAc,IAAA,CAAK,YAAA;AAAA,UACnB,YAAY,IAAA,CAAK,UAAA;AAAA,UACjB,iBAAiB,IAAA,CAAK,eAAA;AAAA,UACtB,aAAa,IAAA,CAAK,WAAA;AAAA,UAClB,eAAe,IAAA,CAAK,aAAA;AAAA,UACpB,WAAW,IAAA,CAAK,SAAA;AAAA,UAChB,YAAY,IAAA,CAAK;AAAA,SAClB,CAAA;AAAA,MACH,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,eAAe,GAAA,EAAK;AAAA,UACxB,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,SAAA,EAAW,QAAA;AAAA,UACX,OAAO,CAAA,sBAAA,EACL,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,eAC3C,CAAA;AAAA,SACD,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,QAAA;AAAA,MACA,WAAA,EAAa,eAAe,QAAQ;AAAA,KACtC;AAAA,EACF;AACF,CAAC;AAEM,IAAM,aAAa,cAAA,CAAe;AAAA,EACvC,IAAA,EAAM;AAAA,IACJ,QAAA,EAAU,EAAE,MAAA;AAAO,GACrB;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,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAAA,IACzD;AAEA,IAAA,MAAM,mBAAA;AAAA,MACJ;AAAA;AAAA;AAAA,MAAA,CAAA;AAAA,MAIA,EAAE,QAAA,EAAU,IAAA,CAAK,QAAA;AAAS,KAC5B;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,CAAI,WAAA,CAAY,QAAA,CAAS,cAAA,CAAe,oBAAA,EAAsB;AAAA,QAClE,UAAU,IAAA,CAAK;AAAA,OAChB,CAAA;AAAA,IACH,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,EACzB;AACF,CAAC;AAEM,IAAM,aAAa,cAAA,CAAe;AAAA,EACvC,IAAA,EAAM;AAAA,IACJ,QAAA,EAAU,EAAE,MAAA,EAAO;AAAA,IACnB,MAAA,EAAQ,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAA;AAAA,IAC7B,UAAA,EAAY,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAA;AAAA,IACjC,OAAA,EAAS,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAA;AAAA,IAC9B,cAAA,EAAgB,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ;AAAA,GACvC;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,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAAA,IACzD;AAEA,IAAA,MAAM,OAAA,GAAmC,EAAE,SAAA,EAAW,IAAA,CAAK,KAAI,EAAE;AACjE,IAAA,IAAI,IAAA,CAAK,MAAA,KAAW,MAAA,EAAW,OAAA,CAAQ,SAAS,IAAA,CAAK,MAAA;AACrD,IAAA,IAAI,IAAA,CAAK,UAAA,KAAe,MAAA,EAAW,OAAA,CAAQ,aAAa,IAAA,CAAK,UAAA;AAC7D,IAAA,IAAI,IAAA,CAAK,OAAA,KAAY,MAAA,EAAW,OAAA,CAAQ,UAAU,IAAA,CAAK,OAAA;AACvD,IAAA,IAAI,IAAA,CAAK,mBAAmB,MAAA,EAAW;AACrC,MAAA,OAAA,CAAQ,iBAAiB,IAAA,CAAK,cAAA;AAAA,IAChC;AAEA,IAAA,MAAM,SAAS,MAAM,mBAAA;AAAA,MAInB;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAAA,MAKA,EAAE,QAAA,EAAU,IAAA,CAAK,QAAA,EAAU,OAAA;AAAQ,KACrC;AAEA,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,gBAAA,EAAiB;AAAA,IACnD;AAEA,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,CAAC,CAAA,EAAG,QAAA;AAC5B,IAAA,IAAI,QAAA,IAAY,cAAA,CAAe,QAAQ,CAAA,EAAG;AACxC,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,CAAI,WAAA,CAAY,QAAA,CAAS,cAAA,CAAe,kBAAA,EAAoB;AAAA,UAChE,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,YAAY,IAAA,CAAK,UAAA;AAAA,UACjB,SAAS,IAAA,CAAK,OAAA;AAAA,UACd,gBAAgB,IAAA,CAAK;AAAA,SACtB,CAAA;AAAA,MACH,CAAA,CAAA,MAAQ;AACN,QAAA,MAAM,eAAe,GAAA,EAAK;AAAA,UACxB,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,SAAA,EAAW,QAAA;AAAA,UACX,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,QAAA,EAAU,KAAK,QAAA,EAAS;AAAA,EAClD;AACF,CAAC;AAEM,IAAM,UAAU,cAAA,CAAe;AAAA,EACpC,IAAA,EAAM;AAAA,IACJ,QAAA,EAAU,EAAE,MAAA;AAAO,GACrB;AAAA,EACA,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,OAAO,IAAA,EAAM,IAAA,KAAS;AAC7B,IAAA,MAAM,WAAW,iBAAA,EAAkB;AACnC,IAAA,IAAI,CAAC,SAAS,UAAA,EAAY;AACxB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,SAAS,MAAM,SAAA;AAAA,MAOnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAAA,MASA,EAAE,QAAA,EAAU,IAAA,CAAK,QAAA;AAAS,KAC5B;AAEA,IAAA,OAAO,MAAA,CAAO,CAAC,CAAA,IAAK,IAAA;AAAA,EACtB;AACF,CAAC;AAEM,IAAM,4BAA4B,cAAA,CAAe;AAAA,EACtD,IAAA,EAAM;AAAA,IACJ,QAAA,EAAU,EAAE,MAAA;AAAO,GACrB;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,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,uCAAA,EAAwC;AAAA,IAC1E;AAEA,IAAA,MAAM,SAAS,MAAM,SAAA;AAAA,MAMnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAAA,MAQA,EAAE,QAAA,EAAU,IAAA,CAAK,QAAA;AAAS,KAC5B;AAEA,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,CAAA,0CAAA,EAA6C,IAAA,CAAK,QAAQ,CAAA;AAAA,OACnE;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,OAAO,CAAC,CAAA;AACrB,IAAA,IAAI,CAAC,cAAA,CAAe,IAAA,CAAK,QAAQ,CAAA,EAAG;AAClC,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,OAAA,EAAS,IAAA;AAAA,QACT,MAAA,EAAQ,yBAAA;AAAA,QACR,UAAU,IAAA,CAAK;AAAA,OACjB;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,UAAA,IAAc,EAAC;AAClC,IAAA,MAAM,mBAAmB,GAAA,EAAK;AAAA,MAC5B,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,cAAc,IAAA,CAAK,YAAA;AAAA,MACnB,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,MAAA,EAAQ,kBAAA,CAAmB,KAAA,EAAO,QAAQ,CAAA;AAAA,MAC1C,UAAA,EAAY,kBAAA,CAAmB,KAAA,EAAO,YAAY,CAAA;AAAA,MAClD,OAAA,EAAS,kBAAA,CAAmB,KAAA,EAAO,SAAS,CAAA;AAAA,MAC5C,cAAA,EAAgB,kBAAA,CAAmB,KAAA,EAAO,gBAAgB,CAAA;AAAA,MAC1D,SAAA,EACE,kBAAA,CAAmB,KAAA,EAAO,WAAW,CAAA,IAAK,wBAAA;AAAA,MAC5C,OAAA,EAAS,kBAAA,CAAmB,KAAA,EAAO,SAAS,CAAA;AAAA,MAC5C,SAAA,EAAW,kBAAA,CAAmB,KAAA,EAAO,WAAW,CAAA;AAAA,MAChD,OAAA,EAAS,kBAAA,CAAmB,KAAA,EAAO,SAAS,CAAA;AAAA,MAC5C,YAAA,EAAc,kBAAA,CAAmB,KAAA,EAAO,cAAc,CAAA;AAAA,MACtD,UAAA,EAAY,kBAAA,CAAmB,KAAA,EAAO,YAAY,CAAA;AAAA,MAClD,eAAA,EAAiB,kBAAA,CAAmB,KAAA,EAAO,iBAAiB,CAAA;AAAA,MAC5D,WAAA,EAAa,kBAAA,CAAmB,KAAA,EAAO,aAAa,CAAA;AAAA,MACpD,aAAA,EAAe,kBAAA,CAAmB,KAAA,EAAO,eAAe,CAAA;AAAA,MACxD,SAAA,EAAW,kBAAA,CAAmB,KAAA,EAAO,WAAW,CAAA;AAAA,MAChD,UAAA,EAAY,kBAAA,CAAmB,KAAA,EAAO,YAAY;AAAA,KACnD,CAAA;AAED,IAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,UAAU,IAAA,CAAK,QAAA,EAAU,WAAW,IAAA,EAAK;AAAA,EACnE;AACF,CAAC","file":"neo4jEdgeAPI.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","\"use node\";\n\n/**\n * Neo4j edge API host actions.\n *\n * The reasoning kernel schedules these actions through the tenant Convex host\n * when optional graph mirroring is installed. Neo4j remains authoritative for\n * traversal topology; Convex mirrors selected edge types for realtime reads.\n */\n\nimport { v } from \"convex/values\";\nimport { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\nimport { getNeo4jRelType } from \"@lucern/graph-primitives/graphTypes\";\nimport { internal, internalAction } from \"./convex\";\nimport {\n getConnectionInfo,\n runCypher,\n runWriteTransaction,\n} from \"./neo4jDriver\";\n\nexport const DUAL_WRITE_EDGE_TYPES = [\n \"supports\",\n \"informs\",\n \"tests\",\n \"depends_on\",\n \"derived_from\",\n \"contains\",\n \"supersedes\",\n \"extracted_from\",\n \"responds_to\",\n \"based_on\",\n \"answers\",\n \"belongs_to\",\n \"relates_to_thesis\",\n \"corroborates\",\n \"extends\",\n \"same_source_as\",\n \"same_theme_as\",\n \"plays_theme\",\n \"impacts\",\n \"evaluates\",\n \"mentioned_in\",\n \"perspective_on\",\n] as const;\n\nexport type DualWriteEdgeType = (typeof DUAL_WRITE_EDGE_TYPES)[number];\n\nexport function needsDualWrite(edgeType: string): boolean {\n return DUAL_WRITE_EDGE_TYPES.includes(edgeType as DualWriteEdgeType);\n}\n\nfunction normalizeEdgeType(edgeType: string): string {\n const normalized = edgeType.trim().toLowerCase();\n if (!/^[a-z0-9_]+$/u.test(normalized)) {\n throw new Error(`[Neo4j Edge API] Invalid edge type: ${edgeType}`);\n }\n return normalized;\n}\n\nfunction resolveRelationshipType(edgeType: string): string {\n const relType = getNeo4jRelType(edgeType);\n if (!/^[A-Z0-9_]+$/u.test(relType)) {\n throw new Error(`[Neo4j Edge API] Invalid relationship type: ${relType}`);\n }\n return relType;\n}\n\nfunction readStringProperty(\n source: Record<string, unknown> | undefined,\n key: string\n): string | undefined {\n const value = source?.[key];\n return typeof value === \"string\" && value.trim().length > 0\n ? value.trim()\n : undefined;\n}\n\nfunction readNumberProperty(\n source: Record<string, unknown> | undefined,\n key: string\n): number | undefined {\n const value = source?.[key];\n return typeof value === \"number\" && Number.isFinite(value)\n ? value\n : undefined;\n}\n\nfunction metadataSummary(\n metadata: Record<string, unknown> | undefined\n): string | undefined {\n if (!metadata) {\n return undefined;\n }\n\n return Object.entries(metadata)\n .map(([key, value]) => `${key}=${String(value)}`)\n .slice(0, 8)\n .join(\" | \");\n}\n\nasync function mirrorEdgeToConvex(\n ctx: any,\n args: {\n globalId: string;\n fromGlobalId: string;\n toGlobalId: string;\n edgeType: string;\n weight?: number;\n confidence?: number;\n context?: string;\n derivationType?: string;\n createdBy: string;\n topicId?: string;\n fromLayer?: string;\n toLayer?: string;\n fromNodeType?: string;\n toNodeType?: string;\n reasoningMethod?: string;\n logicalRole?: string;\n temporalClass?: string;\n validFrom?: number;\n validUntil?: number;\n }\n): Promise<void> {\n await ctx.runMutation(internal.epistemicEdges.mirrorEdgeToConvex, args);\n}\n\nasync function queueEdgeRetry(\n ctx: any,\n args: { globalId: string; operation: \"upsert\" | \"delete\"; error: string }\n): Promise<void> {\n await ctx.runMutation(internal.neo4jSyncHelpers.queueForRetry, {\n entityType: \"edge\",\n entityId: args.globalId,\n operation: args.operation,\n error: args.error,\n });\n}\n\nexport const createEdge = internalAction({\n args: {\n globalId: v.string(),\n fromGlobalId: v.string(),\n toGlobalId: v.string(),\n edgeType: v.string(),\n weight: v.optional(v.number()),\n confidence: v.optional(v.number()),\n context: v.optional(v.string()),\n derivationType: v.optional(v.string()),\n metadata: v.optional(v.any()),\n createdBy: v.string(),\n topicId: v.optional(v.string()),\n tenantId: v.optional(v.string()),\n workspaceId: v.optional(v.string()),\n fromLayer: v.optional(v.string()),\n toLayer: v.optional(v.string()),\n fromNodeType: v.optional(v.string()),\n toNodeType: v.optional(v.string()),\n reasoningMethod: v.optional(v.string()),\n logicalRole: v.optional(v.string()),\n temporalClass: v.optional(v.string()),\n validFrom: v.optional(v.number()),\n validUntil: v.optional(v.number()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const connInfo = getConnectionInfo();\n if (!connInfo.configured) {\n throw new Error(\n \"[Neo4j Edge API] Neo4j not configured. Set NEO4J_URI, NEO4J_USER, NEO4J_PASSWORD\"\n );\n }\n\n const edgeType = normalizeEdgeType(args.edgeType);\n const relType = resolveRelationshipType(edgeType);\n const metadata =\n args.metadata && typeof args.metadata === \"object\"\n ? (args.metadata as Record<string, unknown>)\n : undefined;\n const now = Date.now();\n const properties = {\n globalId: args.globalId,\n edgeType,\n weight: args.weight ?? 1,\n confidence:\n args.confidence ?? readNumberProperty(metadata, \"confidence\") ?? 1,\n context: args.context ?? metadataSummary(metadata) ?? \"\",\n derivationType: args.derivationType ?? \"\",\n createdBy: args.createdBy,\n createdAt: now,\n updatedAt: now,\n topicId: args.topicId ?? readStringProperty(metadata, \"topicId\") ?? \"\",\n tenantId: args.tenantId ?? readStringProperty(metadata, \"tenantId\") ?? \"\",\n workspaceId:\n args.workspaceId ?? readStringProperty(metadata, \"workspaceId\") ?? \"\",\n fromLayer: args.fromLayer ?? \"\",\n toLayer: args.toLayer ?? \"\",\n fromNodeType: args.fromNodeType ?? \"\",\n toNodeType: args.toNodeType ?? \"\",\n reasoningMethod: args.reasoningMethod ?? \"\",\n logicalRole: args.logicalRole ?? \"\",\n temporalClass: args.temporalClass ?? \"structural\",\n validFrom: args.validFrom ?? now,\n validUntil: args.validUntil ?? null,\n };\n\n const result = await runWriteTransaction<{ globalId: string }>(\n `\n MATCH (from {globalId: $fromGlobalId})\n MATCH (to {globalId: $toGlobalId})\n MERGE (from)-[r:${relType} {globalId: $globalId}]->(to)\n SET r += $properties\n RETURN r.globalId as globalId\n `,\n {\n fromGlobalId: args.fromGlobalId,\n toGlobalId: args.toGlobalId,\n globalId: args.globalId,\n properties,\n }\n );\n\n if (result.length === 0) {\n await queueEdgeRetry(ctx, {\n globalId: args.globalId,\n operation: \"upsert\",\n error: `Source or target node not yet synced to Neo4j (from: ${args.fromGlobalId}, to: ${args.toGlobalId})`,\n });\n\n if (needsDualWrite(edgeType)) {\n try {\n await mirrorEdgeToConvex(ctx, {\n globalId: args.globalId,\n fromGlobalId: args.fromGlobalId,\n toGlobalId: args.toGlobalId,\n edgeType,\n weight: args.weight,\n confidence: args.confidence,\n context: args.context,\n derivationType: args.derivationType,\n createdBy: args.createdBy,\n topicId: args.topicId,\n fromLayer: args.fromLayer,\n toLayer: args.toLayer,\n fromNodeType: args.fromNodeType,\n toNodeType: args.toNodeType,\n reasoningMethod: args.reasoningMethod,\n logicalRole: args.logicalRole,\n temporalClass: args.temporalClass,\n validFrom: args.validFrom,\n validUntil: args.validUntil,\n });\n } catch {\n // Retry was already queued for the Neo4j write; avoid hiding it.\n }\n }\n\n return {\n success: false,\n globalId: args.globalId,\n edgeType,\n queuedForRetry: true,\n reason: \"nodes_not_synced\",\n };\n }\n\n if (needsDualWrite(edgeType)) {\n try {\n await mirrorEdgeToConvex(ctx, {\n globalId: args.globalId,\n fromGlobalId: args.fromGlobalId,\n toGlobalId: args.toGlobalId,\n edgeType,\n weight: args.weight,\n confidence: args.confidence,\n context: args.context,\n derivationType: args.derivationType,\n createdBy: args.createdBy,\n topicId: args.topicId,\n fromLayer: args.fromLayer,\n toLayer: args.toLayer,\n fromNodeType: args.fromNodeType,\n toNodeType: args.toNodeType,\n reasoningMethod: args.reasoningMethod,\n logicalRole: args.logicalRole,\n temporalClass: args.temporalClass,\n validFrom: args.validFrom,\n validUntil: args.validUntil,\n });\n } catch (error) {\n await queueEdgeRetry(ctx, {\n globalId: args.globalId,\n operation: \"upsert\",\n error: `Convex mirror failed: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`,\n });\n }\n }\n\n return {\n success: true,\n globalId: args.globalId,\n edgeType,\n dualWritten: needsDualWrite(edgeType),\n };\n },\n});\n\nexport const deleteEdge = internalAction({\n args: {\n globalId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const connInfo = getConnectionInfo();\n if (!connInfo.configured) {\n throw new Error(\"[Neo4j Edge API] Neo4j not configured\");\n }\n\n await runWriteTransaction(\n `\n MATCH ()-[r {globalId: $globalId}]->()\n DELETE r\n `,\n { globalId: args.globalId }\n );\n\n try {\n await ctx.runMutation(internal.epistemicEdges.deleteEdgeFromConvex, {\n globalId: args.globalId,\n });\n } catch {\n // The mirror may not exist for non-dual-write edge types.\n }\n\n return { success: true };\n },\n});\n\nexport const updateEdge = internalAction({\n args: {\n globalId: v.string(),\n weight: v.optional(v.number()),\n confidence: v.optional(v.number()),\n context: v.optional(v.string()),\n derivationType: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const connInfo = getConnectionInfo();\n if (!connInfo.configured) {\n throw new Error(\"[Neo4j Edge API] Neo4j not configured\");\n }\n\n const updates: Record<string, unknown> = { updatedAt: Date.now() };\n if (args.weight !== undefined) updates.weight = args.weight;\n if (args.confidence !== undefined) updates.confidence = args.confidence;\n if (args.context !== undefined) updates.context = args.context;\n if (args.derivationType !== undefined) {\n updates.derivationType = args.derivationType;\n }\n\n const result = await runWriteTransaction<{\n updated: boolean;\n edgeType: string;\n }>(\n `\n MATCH ()-[r {globalId: $globalId}]->()\n SET r += $updates\n RETURN true as updated, r.edgeType as edgeType\n `,\n { globalId: args.globalId, updates }\n );\n\n if (result.length === 0) {\n return { success: false, error: \"Edge not found\" };\n }\n\n const edgeType = result[0]?.edgeType;\n if (edgeType && needsDualWrite(edgeType)) {\n try {\n await ctx.runMutation(internal.epistemicEdges.updateEdgeInConvex, {\n globalId: args.globalId,\n weight: args.weight,\n confidence: args.confidence,\n context: args.context,\n derivationType: args.derivationType,\n });\n } catch {\n await queueEdgeRetry(ctx, {\n globalId: args.globalId,\n operation: \"upsert\",\n error: \"Convex mirror update failed\",\n });\n }\n }\n\n return { success: true, globalId: args.globalId };\n },\n});\n\nexport const getEdge = internalAction({\n args: {\n globalId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (_ctx, args) => {\n const connInfo = getConnectionInfo();\n if (!connInfo.configured) {\n return null;\n }\n\n const result = await runCypher<{\n globalId: string;\n edgeType: string;\n fromGlobalId: string;\n toGlobalId: string;\n properties: Record<string, unknown>;\n }>(\n `\n MATCH (from)-[r {globalId: $globalId}]->(to)\n RETURN r.globalId as globalId,\n r.edgeType as edgeType,\n from.globalId as fromGlobalId,\n to.globalId as toGlobalId,\n properties(r) as properties\n LIMIT 1\n `,\n { globalId: args.globalId }\n );\n\n return result[0] ?? null;\n },\n});\n\nexport const retryProjectionByGlobalId = internalAction({\n args: {\n globalId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const connInfo = getConnectionInfo();\n if (!connInfo.configured) {\n return { success: false, error: \"[Neo4j Edge API] Neo4j not configured\" };\n }\n\n const result = await runCypher<{\n edgeType: string;\n fromGlobalId: string;\n toGlobalId: string;\n properties: Record<string, unknown>;\n }>(\n `\n MATCH (from)-[r {globalId: $globalId}]->(to)\n RETURN r.edgeType as edgeType,\n from.globalId as fromGlobalId,\n to.globalId as toGlobalId,\n properties(r) as properties\n LIMIT 1\n `,\n { globalId: args.globalId }\n );\n\n if (result.length === 0) {\n return {\n success: false,\n error: `[Neo4j Edge API] Edge not found in Neo4j: ${args.globalId}`,\n };\n }\n\n const edge = result[0]!;\n if (!needsDualWrite(edge.edgeType)) {\n return {\n success: true,\n skipped: true,\n reason: \"edge_type_not_projected\",\n edgeType: edge.edgeType,\n };\n }\n\n const props = edge.properties || {};\n await mirrorEdgeToConvex(ctx, {\n globalId: args.globalId,\n fromGlobalId: edge.fromGlobalId,\n toGlobalId: edge.toGlobalId,\n edgeType: edge.edgeType,\n weight: readNumberProperty(props, \"weight\"),\n confidence: readNumberProperty(props, \"confidence\"),\n context: readStringProperty(props, \"context\"),\n derivationType: readStringProperty(props, \"derivationType\"),\n createdBy:\n readStringProperty(props, \"createdBy\") ?? \"neo4j_projection_retry\",\n topicId: readStringProperty(props, \"topicId\"),\n fromLayer: readStringProperty(props, \"fromLayer\"),\n toLayer: readStringProperty(props, \"toLayer\"),\n fromNodeType: readStringProperty(props, \"fromNodeType\"),\n toNodeType: readStringProperty(props, \"toNodeType\"),\n reasoningMethod: readStringProperty(props, \"reasoningMethod\"),\n logicalRole: readStringProperty(props, \"logicalRole\"),\n temporalClass: readStringProperty(props, \"temporalClass\"),\n validFrom: readNumberProperty(props, \"validFrom\"),\n validUntil: readNumberProperty(props, \"validUntil\"),\n });\n\n return { success: true, globalId: args.globalId, projected: true };\n },\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/convex.ts","../src/neo4jDriver.ts","../src/neo4jEdgeAPI.ts"],"names":["v"],"mappings":"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","file":"neo4jEdgeAPI.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","\"use node\";\n\n/**\n * Neo4j edge API host actions.\n *\n * The reasoning kernel schedules these actions through the tenant Convex host\n * when optional graph mirroring is installed. Neo4j remains authoritative for\n * traversal topology; Convex mirrors selected edge types for realtime reads.\n */\n\nimport { v } from \"convex/values\";\nimport { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\nimport { getNeo4jRelType } from \"@lucern/graph-primitives/graphTypes\";\nimport { internal, internalAction } from \"./convex\";\nimport {\n getConnectionInfo,\n runCypher,\n runWriteTransaction,\n} from \"./neo4jDriver\";\n\nexport const DUAL_WRITE_EDGE_TYPES = [\n \"supports\",\n \"informs\",\n \"tests\",\n \"depends_on\",\n \"derived_from\",\n \"contains\",\n \"supersedes\",\n \"extracted_from\",\n \"responds_to\",\n \"based_on\",\n \"answers\",\n \"belongs_to\",\n \"relates_to_thesis\",\n \"corroborates\",\n \"extends\",\n \"same_source_as\",\n \"same_theme_as\",\n \"plays_theme\",\n \"impacts\",\n \"evaluates\",\n \"mentioned_in\",\n \"perspective_on\",\n] as const;\n\nexport type DualWriteEdgeType = (typeof DUAL_WRITE_EDGE_TYPES)[number];\n\nexport function needsDualWrite(edgeType: string): boolean {\n return DUAL_WRITE_EDGE_TYPES.includes(edgeType as DualWriteEdgeType);\n}\n\nfunction normalizeEdgeType(edgeType: string): string {\n const normalized = edgeType.trim().toLowerCase();\n if (!/^[a-z0-9_]+$/u.test(normalized)) {\n throw new Error(`[Neo4j Edge API] Invalid edge type: ${edgeType}`);\n }\n return normalized;\n}\n\nfunction resolveRelationshipType(edgeType: string): string {\n const relType = getNeo4jRelType(edgeType);\n if (!/^[A-Z0-9_]+$/u.test(relType)) {\n throw new Error(`[Neo4j Edge API] Invalid relationship type: ${relType}`);\n }\n return relType;\n}\n\nfunction readStringProperty(\n source: Record<string, unknown> | undefined,\n key: string\n): string | undefined {\n const value = source?.[key];\n return typeof value === \"string\" && value.trim().length > 0\n ? value.trim()\n : undefined;\n}\n\nfunction readNumberProperty(\n source: Record<string, unknown> | undefined,\n key: string\n): number | undefined {\n const value = source?.[key];\n return typeof value === \"number\" && Number.isFinite(value)\n ? value\n : undefined;\n}\n\nfunction metadataSummary(\n metadata: Record<string, unknown> | undefined\n): string | undefined {\n if (!metadata) {\n return undefined;\n }\n\n return Object.entries(metadata)\n .map(([key, value]) => `${key}=${String(value)}`)\n .slice(0, 8)\n .join(\" | \");\n}\n\nasync function mirrorEdgeToConvex(\n ctx: any,\n args: {\n globalId: string;\n fromGlobalId: string;\n toGlobalId: string;\n edgeType: string;\n weight?: number;\n confidence?: number;\n context?: string;\n derivationType?: string;\n createdBy: string;\n topicId?: string;\n fromLayer?: string;\n toLayer?: string;\n fromNodeType?: string;\n toNodeType?: string;\n reasoningMethod?: string;\n logicalRole?: string;\n temporalClass?: string;\n validFrom?: number;\n validUntil?: number;\n }\n): Promise<void> {\n await ctx.runMutation(internal.epistemicEdges.mirrorEdgeToConvex, args);\n}\n\nasync function queueEdgeRetry(\n ctx: any,\n args: { globalId: string; operation: \"upsert\" | \"delete\"; error: string }\n): Promise<void> {\n await ctx.runMutation(internal.neo4jSyncHelpers.queueForRetry, {\n entityType: \"edge\",\n entityId: args.globalId,\n operation: args.operation,\n error: args.error,\n });\n}\n\nexport const createEdge = internalAction({\n args: {\n globalId: v.string(),\n fromGlobalId: v.string(),\n toGlobalId: v.string(),\n edgeType: v.string(),\n weight: v.optional(v.number()),\n confidence: v.optional(v.number()),\n context: v.optional(v.string()),\n derivationType: v.optional(v.string()),\n metadata: v.optional(v.any()),\n createdBy: v.string(),\n topicId: v.optional(v.string()),\n tenantId: v.optional(v.string()),\n workspaceId: v.optional(v.string()),\n fromLayer: v.optional(v.string()),\n toLayer: v.optional(v.string()),\n fromNodeType: v.optional(v.string()),\n toNodeType: v.optional(v.string()),\n reasoningMethod: v.optional(v.string()),\n logicalRole: v.optional(v.string()),\n temporalClass: v.optional(v.string()),\n validFrom: v.optional(v.number()),\n validUntil: v.optional(v.number()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const connInfo = getConnectionInfo();\n if (!connInfo.configured) {\n throw new Error(\n \"[Neo4j Edge API] Neo4j not configured. Set NEO4J_URI, NEO4J_USER, NEO4J_PASSWORD\"\n );\n }\n\n const edgeType = normalizeEdgeType(args.edgeType);\n const relType = resolveRelationshipType(edgeType);\n const metadata =\n args.metadata && typeof args.metadata === \"object\"\n ? (args.metadata as Record<string, unknown>)\n : undefined;\n const now = Date.now();\n const properties = {\n globalId: args.globalId,\n edgeType,\n weight: args.weight ?? 1,\n confidence:\n args.confidence ?? readNumberProperty(metadata, \"confidence\") ?? 1,\n context: args.context ?? metadataSummary(metadata) ?? \"\",\n derivationType: args.derivationType ?? \"\",\n createdBy: args.createdBy,\n createdAt: now,\n updatedAt: now,\n topicId: args.topicId ?? readStringProperty(metadata, \"topicId\") ?? \"\",\n tenantId: args.tenantId ?? readStringProperty(metadata, \"tenantId\") ?? \"\",\n workspaceId:\n args.workspaceId ?? readStringProperty(metadata, \"workspaceId\") ?? \"\",\n fromLayer: args.fromLayer ?? \"\",\n toLayer: args.toLayer ?? \"\",\n fromNodeType: args.fromNodeType ?? \"\",\n toNodeType: args.toNodeType ?? \"\",\n reasoningMethod: args.reasoningMethod ?? \"\",\n logicalRole: args.logicalRole ?? \"\",\n temporalClass: args.temporalClass ?? \"structural\",\n validFrom: args.validFrom ?? now,\n validUntil: args.validUntil ?? null,\n };\n\n const result = await runWriteTransaction<{ globalId: string }>(\n `\n MATCH (from {globalId: $fromGlobalId})\n MATCH (to {globalId: $toGlobalId})\n MERGE (from)-[r:${relType} {globalId: $globalId}]->(to)\n SET r += $properties\n RETURN r.globalId as globalId\n `,\n {\n fromGlobalId: args.fromGlobalId,\n toGlobalId: args.toGlobalId,\n globalId: args.globalId,\n properties,\n }\n );\n\n if (result.length === 0) {\n await queueEdgeRetry(ctx, {\n globalId: args.globalId,\n operation: \"upsert\",\n error: `Source or target node not yet synced to Neo4j (from: ${args.fromGlobalId}, to: ${args.toGlobalId})`,\n });\n\n if (needsDualWrite(edgeType)) {\n try {\n await mirrorEdgeToConvex(ctx, {\n globalId: args.globalId,\n fromGlobalId: args.fromGlobalId,\n toGlobalId: args.toGlobalId,\n edgeType,\n weight: args.weight,\n confidence: args.confidence,\n context: args.context,\n derivationType: args.derivationType,\n createdBy: args.createdBy,\n topicId: args.topicId,\n fromLayer: args.fromLayer,\n toLayer: args.toLayer,\n fromNodeType: args.fromNodeType,\n toNodeType: args.toNodeType,\n reasoningMethod: args.reasoningMethod,\n logicalRole: args.logicalRole,\n temporalClass: args.temporalClass,\n validFrom: args.validFrom,\n validUntil: args.validUntil,\n });\n } catch {\n // Retry was already queued for the Neo4j write; avoid hiding it.\n }\n }\n\n return {\n success: false,\n globalId: args.globalId,\n edgeType,\n queuedForRetry: true,\n reason: \"nodes_not_synced\",\n };\n }\n\n if (needsDualWrite(edgeType)) {\n try {\n await mirrorEdgeToConvex(ctx, {\n globalId: args.globalId,\n fromGlobalId: args.fromGlobalId,\n toGlobalId: args.toGlobalId,\n edgeType,\n weight: args.weight,\n confidence: args.confidence,\n context: args.context,\n derivationType: args.derivationType,\n createdBy: args.createdBy,\n topicId: args.topicId,\n fromLayer: args.fromLayer,\n toLayer: args.toLayer,\n fromNodeType: args.fromNodeType,\n toNodeType: args.toNodeType,\n reasoningMethod: args.reasoningMethod,\n logicalRole: args.logicalRole,\n temporalClass: args.temporalClass,\n validFrom: args.validFrom,\n validUntil: args.validUntil,\n });\n } catch (error) {\n await queueEdgeRetry(ctx, {\n globalId: args.globalId,\n operation: \"upsert\",\n error: `Convex mirror failed: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`,\n });\n }\n }\n\n return {\n success: true,\n globalId: args.globalId,\n edgeType,\n dualWritten: needsDualWrite(edgeType),\n };\n },\n});\n\nexport const deleteEdge = internalAction({\n args: {\n globalId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const connInfo = getConnectionInfo();\n if (!connInfo.configured) {\n throw new Error(\"[Neo4j Edge API] Neo4j not configured\");\n }\n\n await runWriteTransaction(\n `\n MATCH ()-[r {globalId: $globalId}]->()\n DELETE r\n `,\n { globalId: args.globalId }\n );\n\n try {\n await ctx.runMutation(internal.epistemicEdges.deleteEdgeFromConvex, {\n globalId: args.globalId,\n });\n } catch {\n // The mirror may not exist for non-dual-write edge types.\n }\n\n return { success: true };\n },\n});\n\nexport const updateEdge = internalAction({\n args: {\n globalId: v.string(),\n weight: v.optional(v.number()),\n confidence: v.optional(v.number()),\n context: v.optional(v.string()),\n derivationType: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const connInfo = getConnectionInfo();\n if (!connInfo.configured) {\n throw new Error(\"[Neo4j Edge API] Neo4j not configured\");\n }\n\n const updates: Record<string, unknown> = { updatedAt: Date.now() };\n if (args.weight !== undefined) updates.weight = args.weight;\n if (args.confidence !== undefined) updates.confidence = args.confidence;\n if (args.context !== undefined) updates.context = args.context;\n if (args.derivationType !== undefined) {\n updates.derivationType = args.derivationType;\n }\n\n const result = await runWriteTransaction<{\n updated: boolean;\n edgeType: string;\n }>(\n `\n MATCH ()-[r {globalId: $globalId}]->()\n SET r += $updates\n RETURN true as updated, r.edgeType as edgeType\n `,\n { globalId: args.globalId, updates }\n );\n\n if (result.length === 0) {\n return { success: false, error: \"Edge not found\" };\n }\n\n const edgeType = result[0]?.edgeType;\n if (edgeType && needsDualWrite(edgeType)) {\n try {\n await ctx.runMutation(internal.epistemicEdges.updateEdgeInConvex, {\n globalId: args.globalId,\n weight: args.weight,\n confidence: args.confidence,\n context: args.context,\n derivationType: args.derivationType,\n });\n } catch {\n await queueEdgeRetry(ctx, {\n globalId: args.globalId,\n operation: \"upsert\",\n error: \"Convex mirror update failed\",\n });\n }\n }\n\n return { success: true, globalId: args.globalId };\n },\n});\n\nexport const getEdge = internalAction({\n args: {\n globalId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (_ctx, args) => {\n const connInfo = getConnectionInfo();\n if (!connInfo.configured) {\n return null;\n }\n\n const result = await runCypher<{\n globalId: string;\n edgeType: string;\n fromGlobalId: string;\n toGlobalId: string;\n properties: Record<string, unknown>;\n }>(\n `\n MATCH (from)-[r {globalId: $globalId}]->(to)\n RETURN r.globalId as globalId,\n r.edgeType as edgeType,\n from.globalId as fromGlobalId,\n to.globalId as toGlobalId,\n properties(r) as properties\n LIMIT 1\n `,\n { globalId: args.globalId }\n );\n\n return result[0] ?? null;\n },\n});\n\nexport const retryProjectionByGlobalId = internalAction({\n args: {\n globalId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const connInfo = getConnectionInfo();\n if (!connInfo.configured) {\n return { success: false, error: \"[Neo4j Edge API] Neo4j not configured\" };\n }\n\n const result = await runCypher<{\n edgeType: string;\n fromGlobalId: string;\n toGlobalId: string;\n properties: Record<string, unknown>;\n }>(\n `\n MATCH (from)-[r {globalId: $globalId}]->(to)\n RETURN r.edgeType as edgeType,\n from.globalId as fromGlobalId,\n to.globalId as toGlobalId,\n properties(r) as properties\n LIMIT 1\n `,\n { globalId: args.globalId }\n );\n\n if (result.length === 0) {\n return {\n success: false,\n error: `[Neo4j Edge API] Edge not found in Neo4j: ${args.globalId}`,\n };\n }\n\n const edge = result[0]!;\n if (!needsDualWrite(edge.edgeType)) {\n return {\n success: true,\n skipped: true,\n reason: \"edge_type_not_projected\",\n edgeType: edge.edgeType,\n };\n }\n\n const props = edge.properties || {};\n await mirrorEdgeToConvex(ctx, {\n globalId: args.globalId,\n fromGlobalId: edge.fromGlobalId,\n toGlobalId: edge.toGlobalId,\n edgeType: edge.edgeType,\n weight: readNumberProperty(props, \"weight\"),\n confidence: readNumberProperty(props, \"confidence\"),\n context: readStringProperty(props, \"context\"),\n derivationType: readStringProperty(props, \"derivationType\"),\n createdBy:\n readStringProperty(props, \"createdBy\") ?? \"neo4j_projection_retry\",\n topicId: readStringProperty(props, \"topicId\"),\n fromLayer: readStringProperty(props, \"fromLayer\"),\n toLayer: readStringProperty(props, \"toLayer\"),\n fromNodeType: readStringProperty(props, \"fromNodeType\"),\n toNodeType: readStringProperty(props, \"toNodeType\"),\n reasoningMethod: readStringProperty(props, \"reasoningMethod\"),\n logicalRole: readStringProperty(props, \"logicalRole\"),\n temporalClass: readStringProperty(props, \"temporalClass\"),\n validFrom: readNumberProperty(props, \"validFrom\"),\n validUntil: readNumberProperty(props, \"validUntil\"),\n });\n\n return { success: true, globalId: args.globalId, projected: true };\n },\n});\n"]}
|
|
@@ -1,119 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Neo4j Graph Queries
|
|
3
|
-
*
|
|
4
|
-
* Convex actions that execute graph queries against Neo4j.
|
|
5
|
-
* These provide graph intelligence that's hard/impossible in Convex alone:
|
|
6
|
-
* - Multi-hop traversals
|
|
7
|
-
* - Path finding
|
|
8
|
-
* - Cross-theme patterns
|
|
9
|
-
* - Contradiction detection
|
|
10
|
-
*
|
|
11
|
-
* Architecture:
|
|
12
|
-
* - Convex action calls a tenant-owned query proxy route
|
|
13
|
-
* - Query proxy executes a predefined Cypher query
|
|
14
|
-
* - Results return to the Convex caller
|
|
15
|
-
*/
|
|
16
|
-
/**
|
|
17
|
-
* Get the full lineage of a node (what it was derived/extracted from)
|
|
18
|
-
* Uses Neo4j for efficient multi-hop traversal up to 10 levels deep
|
|
19
|
-
*/
|
|
20
|
-
declare const getNodeLineageGraph: any;
|
|
21
|
-
/**
|
|
22
|
-
* Get nodes connected to a given node within N hops
|
|
23
|
-
* Much more powerful than Convex's single-hop queries
|
|
24
|
-
*/
|
|
25
|
-
declare const getConnectedNodesGraph: any;
|
|
26
|
-
/**
|
|
27
|
-
* Get all beliefs that belong to a theme
|
|
28
|
-
*/
|
|
29
|
-
declare const getThemeBeliefsGraph: any;
|
|
30
|
-
/**
|
|
31
|
-
* Get evidence that supports a belief (through question chain OR direct link)
|
|
32
|
-
*/
|
|
33
|
-
declare const getBeliefEvidenceGraph: any;
|
|
34
|
-
/**
|
|
35
|
-
* Find beliefs that appear in multiple themes (cross-cutting insights)
|
|
36
|
-
*/
|
|
37
|
-
declare const getCrossThemeBeliefs: any;
|
|
38
|
-
/**
|
|
39
|
-
* Find potential contradictions in the knowledge graph
|
|
40
|
-
* Evidence that tests conflicting beliefs
|
|
41
|
-
*/
|
|
42
|
-
declare const findPotentialContradictions: any;
|
|
43
|
-
/**
|
|
44
|
-
* Get the full subgraph for a theme (all connected beliefs, questions, evidence)
|
|
45
|
-
*/
|
|
46
|
-
declare const getThemeSubgraph: any;
|
|
47
|
-
/**
|
|
48
|
-
* Find the path from evidence to a belief (how does this evidence support this belief?)
|
|
49
|
-
*/
|
|
50
|
-
declare const getEvidenceToBeliefPath: any;
|
|
51
|
-
/**
|
|
52
|
-
* Get stats for a theme (counts of beliefs, questions, evidence)
|
|
53
|
-
*/
|
|
54
|
-
declare const getThemeStats: any;
|
|
55
|
-
/**
|
|
56
|
-
* Get candidate theme-to-valuechain mappings
|
|
57
|
-
* Returns all themes and value chains for manual or AI-assisted matching
|
|
58
|
-
*/
|
|
59
|
-
declare const getThemeValueChainCandidates: any;
|
|
60
|
-
/**
|
|
61
|
-
* Find themes that impact a specific company
|
|
62
|
-
*/
|
|
63
|
-
declare const getThemesImpactingCompany: any;
|
|
64
|
-
/**
|
|
65
|
-
* Find companies related to a theme
|
|
66
|
-
*/
|
|
67
|
-
declare const getCompaniesByTheme: any;
|
|
68
|
-
/**
|
|
69
|
-
* Find questions about a value chain
|
|
70
|
-
*/
|
|
71
|
-
declare const getQuestionsByValueChain: any;
|
|
72
|
-
/**
|
|
73
|
-
* Find questions about a theme
|
|
74
|
-
*/
|
|
75
|
-
declare const getQuestionsByTheme: any;
|
|
76
|
-
/**
|
|
77
|
-
* Find people/contacts related to a theme
|
|
78
|
-
*/
|
|
79
|
-
declare const getPeopleByTheme: any;
|
|
80
|
-
/**
|
|
81
|
-
* Find people at a specific company
|
|
82
|
-
*/
|
|
83
|
-
declare const getPeopleByCompany: any;
|
|
84
|
-
/**
|
|
85
|
-
* Find value chains for a theme
|
|
86
|
-
*/
|
|
87
|
-
declare const getValueChainsByTheme: any;
|
|
88
|
-
/**
|
|
89
|
-
* Find functions in a value chain
|
|
90
|
-
*/
|
|
91
|
-
declare const getFunctionsByValueChain: any;
|
|
92
|
-
/**
|
|
93
|
-
* Find beliefs about a company
|
|
2
|
+
* Neo4j Graph Queries - advanced query surfaces.
|
|
94
3
|
*/
|
|
95
|
-
declare const getBeliefsByCompany: any;
|
|
96
|
-
/**
|
|
97
|
-
* Find evidence about a company
|
|
98
|
-
*/
|
|
99
|
-
declare const getEvidenceByCompany: any;
|
|
100
|
-
/**
|
|
101
|
-
* Search all nodes by text
|
|
102
|
-
*/
|
|
103
|
-
declare const searchAllNodes: any;
|
|
104
|
-
/**
|
|
105
|
-
* Get all relationships from a node
|
|
106
|
-
*/
|
|
107
|
-
declare const getNodeRelationships: any;
|
|
108
|
-
/**
|
|
109
|
-
* Get graph statistics (node counts by type)
|
|
110
|
-
*/
|
|
111
|
-
declare const getGraphStats: any;
|
|
112
|
-
/**
|
|
113
|
-
* Flexible graph query - routes to appropriate query based on intent
|
|
114
|
-
* This is the main entry point for natural language graph queries
|
|
115
|
-
*/
|
|
116
|
-
declare const queryGraph: any;
|
|
117
4
|
/**
|
|
118
5
|
* Get high-priority questions (critical/high) that test beliefs
|
|
119
6
|
*/
|
|
@@ -237,6 +124,123 @@ declare const getSemanticBridges: any;
|
|
|
237
124
|
*/
|
|
238
125
|
declare const graphAwareSearch: any;
|
|
239
126
|
|
|
127
|
+
/**
|
|
128
|
+
* Neo4j Graph Queries
|
|
129
|
+
*
|
|
130
|
+
* Convex actions that execute graph queries against Neo4j.
|
|
131
|
+
* These provide graph intelligence that's hard/impossible in Convex alone:
|
|
132
|
+
* - Multi-hop traversals
|
|
133
|
+
* - Path finding
|
|
134
|
+
* - Cross-theme patterns
|
|
135
|
+
* - Contradiction detection
|
|
136
|
+
*
|
|
137
|
+
* Architecture:
|
|
138
|
+
* - Convex action calls a tenant-owned query proxy route
|
|
139
|
+
* - Query proxy executes a predefined Cypher query
|
|
140
|
+
* - Results return to the Convex caller
|
|
141
|
+
*/
|
|
142
|
+
/**
|
|
143
|
+
* Get the full lineage of a node (what it was derived/extracted from)
|
|
144
|
+
* Uses Neo4j for efficient multi-hop traversal up to 10 levels deep
|
|
145
|
+
*/
|
|
146
|
+
declare const getNodeLineageGraph: any;
|
|
147
|
+
/**
|
|
148
|
+
* Get nodes connected to a given node within N hops
|
|
149
|
+
* Much more powerful than Convex's single-hop queries
|
|
150
|
+
*/
|
|
151
|
+
declare const getConnectedNodesGraph: any;
|
|
152
|
+
/**
|
|
153
|
+
* Get all beliefs that belong to a theme
|
|
154
|
+
*/
|
|
155
|
+
declare const getThemeBeliefsGraph: any;
|
|
156
|
+
/**
|
|
157
|
+
* Get evidence that supports a belief (through question chain OR direct link)
|
|
158
|
+
*/
|
|
159
|
+
declare const getBeliefEvidenceGraph: any;
|
|
160
|
+
/**
|
|
161
|
+
* Find beliefs that appear in multiple themes (cross-cutting insights)
|
|
162
|
+
*/
|
|
163
|
+
declare const getCrossThemeBeliefs: any;
|
|
164
|
+
/**
|
|
165
|
+
* Find potential contradictions in the knowledge graph
|
|
166
|
+
* Evidence that tests conflicting beliefs
|
|
167
|
+
*/
|
|
168
|
+
declare const findPotentialContradictions: any;
|
|
169
|
+
/**
|
|
170
|
+
* Get the full subgraph for a theme (all connected beliefs, questions, evidence)
|
|
171
|
+
*/
|
|
172
|
+
declare const getThemeSubgraph: any;
|
|
173
|
+
/**
|
|
174
|
+
* Find the path from evidence to a belief (how does this evidence support this belief?)
|
|
175
|
+
*/
|
|
176
|
+
declare const getEvidenceToBeliefPath: any;
|
|
177
|
+
/**
|
|
178
|
+
* Get stats for a theme (counts of beliefs, questions, evidence)
|
|
179
|
+
*/
|
|
180
|
+
declare const getThemeStats: any;
|
|
181
|
+
/**
|
|
182
|
+
* Get candidate theme-to-valuechain mappings
|
|
183
|
+
* Returns all themes and value chains for manual or AI-assisted matching
|
|
184
|
+
*/
|
|
185
|
+
declare const getThemeValueChainCandidates: any;
|
|
186
|
+
/**
|
|
187
|
+
* Find themes that impact a specific company
|
|
188
|
+
*/
|
|
189
|
+
declare const getThemesImpactingCompany: any;
|
|
190
|
+
/**
|
|
191
|
+
* Find companies related to a theme
|
|
192
|
+
*/
|
|
193
|
+
declare const getCompaniesByTheme: any;
|
|
194
|
+
/**
|
|
195
|
+
* Find questions about a value chain
|
|
196
|
+
*/
|
|
197
|
+
declare const getQuestionsByValueChain: any;
|
|
198
|
+
/**
|
|
199
|
+
* Find questions about a theme
|
|
200
|
+
*/
|
|
201
|
+
declare const getQuestionsByTheme: any;
|
|
202
|
+
/**
|
|
203
|
+
* Find people/contacts related to a theme
|
|
204
|
+
*/
|
|
205
|
+
declare const getPeopleByTheme: any;
|
|
206
|
+
/**
|
|
207
|
+
* Find people at a specific company
|
|
208
|
+
*/
|
|
209
|
+
declare const getPeopleByCompany: any;
|
|
210
|
+
/**
|
|
211
|
+
* Find value chains for a theme
|
|
212
|
+
*/
|
|
213
|
+
declare const getValueChainsByTheme: any;
|
|
214
|
+
/**
|
|
215
|
+
* Find functions in a value chain
|
|
216
|
+
*/
|
|
217
|
+
declare const getFunctionsByValueChain: any;
|
|
218
|
+
/**
|
|
219
|
+
* Find beliefs about a company
|
|
220
|
+
*/
|
|
221
|
+
declare const getBeliefsByCompany: any;
|
|
222
|
+
/**
|
|
223
|
+
* Find evidence about a company
|
|
224
|
+
*/
|
|
225
|
+
declare const getEvidenceByCompany: any;
|
|
226
|
+
/**
|
|
227
|
+
* Search all nodes by text
|
|
228
|
+
*/
|
|
229
|
+
declare const searchAllNodes: any;
|
|
230
|
+
/**
|
|
231
|
+
* Get all relationships from a node
|
|
232
|
+
*/
|
|
233
|
+
declare const getNodeRelationships: any;
|
|
234
|
+
/**
|
|
235
|
+
* Get graph statistics (node counts by type)
|
|
236
|
+
*/
|
|
237
|
+
declare const getGraphStats: any;
|
|
238
|
+
/**
|
|
239
|
+
* Flexible graph query - routes to appropriate query based on intent
|
|
240
|
+
* This is the main entry point for natural language graph queries
|
|
241
|
+
*/
|
|
242
|
+
declare const queryGraph: any;
|
|
243
|
+
|
|
240
244
|
declare const neo4jQueries_findPotentialContradictions: typeof findPotentialContradictions;
|
|
241
245
|
declare const neo4jQueries_getAnchoringBiasDetection: typeof getAnchoringBiasDetection;
|
|
242
246
|
declare const neo4jQueries_getBeliefEvidenceGraph: typeof getBeliefEvidenceGraph;
|
package/dist/neo4jQueries.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { f as findPotentialContradictions, g as getAnchoringBiasDetection, a as getBeliefEvidenceGraph, b as getBeliefHalfLife, c as getBeliefsByCompany, d as getBeliefsByEpistemicStatus, e as getCausalChains, h as getChallengedBeliefs, i as getCompaniesByTheme, j as getConfirmationBiasScore, k as getConnectedNodesGraph, l as getContradictionTensionMap, m as getCrossThemeBeliefs, o as getEvidenceByCompany, p as getEvidenceByMethodology, q as getEvidenceToBeliefPath, r as getFalsificationQuestions, s as getFunctionsByValueChain, t as getGraphStats, u as getHighPriorityQuestions, v as getKnowledgeFrontier, w as getMeetingPrepBrief, x as getMinimumFalsificationSet, y as getMissingQuestionDetection, z as getNecessaryEvidence, A as getNodeLineageGraph, B as getNodeRelationships, C as getNonConsensusBeliefs, D as getPeopleByCompany, E as getPeopleByTheme, F as getPortfolioConviction, G as getPredictions, H as getProprietaryEvidence, I as getProprietarySignals, J as getQuestionsByTheme, K as getQuestionsByValueChain, L as getReasoningDepthScore, M as getSemanticBridges, N as getSemanticOrphans, O as getSoftContradictions, P as getSourceConcentrationRisk, Q as getStaleThemes, R as getSurpriseDetection, S as getThemeBeliefsGraph, T as getThemeStats, U as getThemeSubgraph, V as getThemeValueChainCandidates, W as getThemesImpactingCompany, X as getValueChainsByTheme, Y as graphAwareSearch, Z as queryGraph, _ as searchAllNodes, $ as semanticSearch } from './neo4jQueries-
|
|
1
|
+
export { f as findPotentialContradictions, g as getAnchoringBiasDetection, a as getBeliefEvidenceGraph, b as getBeliefHalfLife, c as getBeliefsByCompany, d as getBeliefsByEpistemicStatus, e as getCausalChains, h as getChallengedBeliefs, i as getCompaniesByTheme, j as getConfirmationBiasScore, k as getConnectedNodesGraph, l as getContradictionTensionMap, m as getCrossThemeBeliefs, o as getEvidenceByCompany, p as getEvidenceByMethodology, q as getEvidenceToBeliefPath, r as getFalsificationQuestions, s as getFunctionsByValueChain, t as getGraphStats, u as getHighPriorityQuestions, v as getKnowledgeFrontier, w as getMeetingPrepBrief, x as getMinimumFalsificationSet, y as getMissingQuestionDetection, z as getNecessaryEvidence, A as getNodeLineageGraph, B as getNodeRelationships, C as getNonConsensusBeliefs, D as getPeopleByCompany, E as getPeopleByTheme, F as getPortfolioConviction, G as getPredictions, H as getProprietaryEvidence, I as getProprietarySignals, J as getQuestionsByTheme, K as getQuestionsByValueChain, L as getReasoningDepthScore, M as getSemanticBridges, N as getSemanticOrphans, O as getSoftContradictions, P as getSourceConcentrationRisk, Q as getStaleThemes, R as getSurpriseDetection, S as getThemeBeliefsGraph, T as getThemeStats, U as getThemeSubgraph, V as getThemeValueChainCandidates, W as getThemesImpactingCompany, X as getValueChainsByTheme, Y as graphAwareSearch, Z as queryGraph, _ as searchAllNodes, $ as semanticSearch } from './neo4jQueries-j3LrFKpY.js';
|