@lucern/graph-primitives 0.3.0-alpha.5 → 0.3.0-alpha.7

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.
Files changed (123) hide show
  1. package/dist/{beliefDecay-Q_26RTc-.d.ts → beliefDecay-DZ6tkLYq.d.ts} +1 -1
  2. package/dist/beliefDecay.d.ts +1 -1
  3. package/dist/beliefDecay.js +158 -47
  4. package/dist/beliefDecay.js.map +1 -1
  5. package/dist/{beliefEvidenceLinks-42FlR48t.d.ts → beliefEvidenceLinks-CWOXxxJg.d.ts} +1 -1
  6. package/dist/beliefEvidenceLinks.d.ts +1 -1
  7. package/dist/beliefEvidenceLinks.js +141 -45
  8. package/dist/beliefEvidenceLinks.js.map +1 -1
  9. package/dist/{beliefLifecycle-C-AehZgF.d.ts → beliefLifecycle-y8WLXqQj.d.ts} +1 -1
  10. package/dist/beliefLifecycle.d.ts +1 -1
  11. package/dist/confidencePropagationDispatch.d.ts +1 -1
  12. package/dist/confidencePropagationDispatch.js +1 -3
  13. package/dist/confidencePropagationDispatch.js.map +1 -1
  14. package/dist/{contradictions-Hdwl7zid.d.ts → contradictions-51VLsESq.d.ts} +1 -1
  15. package/dist/contradictions.d.ts +1 -1
  16. package/dist/contradictions.js +67 -8
  17. package/dist/contradictions.js.map +1 -1
  18. package/dist/debug.d.ts +4 -0
  19. package/dist/debug.js +34 -0
  20. package/dist/debug.js.map +1 -0
  21. package/dist/edges/contradicts.js.map +1 -1
  22. package/dist/edges/dependsOn.js.map +1 -1
  23. package/dist/edges/elaborates.js.map +1 -1
  24. package/dist/edges/index.js +1 -3
  25. package/dist/edges/index.js.map +1 -1
  26. package/dist/edges/informs.js +1 -3
  27. package/dist/edges/informs.js.map +1 -1
  28. package/dist/edges/refutes.js +1 -3
  29. package/dist/edges/refutes.js.map +1 -1
  30. package/dist/edges/supports.js.map +1 -1
  31. package/dist/edges/utils.d.ts +3 -3
  32. package/dist/edges/utils.js +2 -4
  33. package/dist/edges/utils.js.map +1 -1
  34. package/dist/embeddingTrigger.js +21 -1
  35. package/dist/embeddingTrigger.js.map +1 -1
  36. package/dist/entityBridge.js +1 -1
  37. package/dist/entityBridge.js.map +1 -1
  38. package/dist/{entityLifecycle-BkhRJ-XI.d.ts → entityLifecycle-CvgSK5FV.d.ts} +1 -1
  39. package/dist/entityLifecycle.d.ts +1 -1
  40. package/dist/entityLifecycle.js +134 -47
  41. package/dist/entityLifecycle.js.map +1 -1
  42. package/dist/{epistemicAnswers-DSP1slZ9.d.ts → epistemicAnswers-C5ib4z6_.d.ts} +1 -1
  43. package/dist/epistemicAnswers.d.ts +1 -1
  44. package/dist/epistemicAnswers.js +67 -8
  45. package/dist/epistemicAnswers.js.map +1 -1
  46. package/dist/{epistemicBeliefs-DtFVTp-k.d.ts → epistemicBeliefs-DzKjZAeC.d.ts} +3 -3
  47. package/dist/epistemicBeliefs.d.ts +2 -2
  48. package/dist/epistemicBeliefs.js +289 -114
  49. package/dist/epistemicBeliefs.js.map +1 -1
  50. package/dist/epistemicContracts.d.ts +1 -1
  51. package/dist/epistemicContracts.js +297 -115
  52. package/dist/epistemicContracts.js.map +1 -1
  53. package/dist/{epistemicEdges-DQKNJ04T.d.ts → epistemicEdges-CvlKnEyy.d.ts} +3 -3
  54. package/dist/epistemicEdges.d.ts +1 -1
  55. package/dist/epistemicEdges.js +192 -60
  56. package/dist/epistemicEdges.js.map +1 -1
  57. package/dist/{epistemicEvidence-Bo638XDP.d.ts → epistemicEvidence-xw6UUrwh.d.ts} +1 -1
  58. package/dist/epistemicEvidence.d.ts +1 -1
  59. package/dist/epistemicEvidence.js +163 -49
  60. package/dist/epistemicEvidence.js.map +1 -1
  61. package/dist/{epistemicHelpers-Bd9xbaib.d.ts → epistemicHelpers-DevrYgPN.d.ts} +1 -1
  62. package/dist/epistemicHelpers.d.ts +1 -1
  63. package/dist/{epistemicLinking-CyeLOIzN.d.ts → epistemicLinking-CfE00tHJ.d.ts} +1 -1
  64. package/dist/epistemicLinking.d.ts +1 -1
  65. package/dist/epistemicLinking.js +1 -1
  66. package/dist/{epistemicNodes-o5pqdCZQ.d.ts → epistemicNodes-DjSUfvyD.d.ts} +2 -2
  67. package/dist/epistemicNodes.d.ts +1 -1
  68. package/dist/epistemicNodes.js +163 -33
  69. package/dist/epistemicNodes.js.map +1 -1
  70. package/dist/{epistemicQuestions-CmEeY6zQ.d.ts → epistemicQuestions-B_nUclrH.d.ts} +1 -1
  71. package/dist/epistemicQuestions.d.ts +1 -1
  72. package/dist/epistemicQuestions.js +311 -62
  73. package/dist/epistemicQuestions.js.map +1 -1
  74. package/dist/{epistemicSources-ZazxHOK1.d.ts → epistemicSources-dlKj58Jp.d.ts} +1 -1
  75. package/dist/epistemicSources.d.ts +1 -1
  76. package/dist/epistemicSources.js +65 -8
  77. package/dist/epistemicSources.js.map +1 -1
  78. package/dist/evaluators/index.js +297 -115
  79. package/dist/evaluators/index.js.map +1 -1
  80. package/dist/evaluators/lintCheckerEvaluator.js.map +1 -1
  81. package/dist/evaluators/sentryCheckerEvaluator.js.map +1 -1
  82. package/dist/evaluators/shared.js +20 -1
  83. package/dist/evaluators/shared.js.map +1 -1
  84. package/dist/evaluators/testRunnerEvaluator.js +20 -1
  85. package/dist/evaluators/testRunnerEvaluator.js.map +1 -1
  86. package/dist/evaluators/tscCheckerEvaluator.js.map +1 -1
  87. package/dist/index.d.ts +20 -20
  88. package/dist/index.js +729 -206
  89. package/dist/index.js.map +1 -1
  90. package/dist/{ontology-matching-Buhu23ss.d.ts → ontology-matching-C6rrz2VP.d.ts} +1 -1
  91. package/dist/ontology-matching.d.ts +1 -1
  92. package/dist/{ontologyApproval-Ba0Jjk1k.d.ts → ontologyApproval-CFYmqKmk.d.ts} +1 -1
  93. package/dist/ontologyApproval.d.ts +1 -1
  94. package/dist/ontologyDefinitions.js +4 -3
  95. package/dist/ontologyDefinitions.js.map +1 -1
  96. package/dist/ontologyHelpers.d.ts +1 -1
  97. package/dist/ontologyHelpers.js +4 -3
  98. package/dist/ontologyHelpers.js.map +1 -1
  99. package/dist/{projectionReconciliation-CxrXYGaB.d.ts → projectionReconciliation-jww2fBI0.d.ts} +1 -1
  100. package/dist/projectionReconciliation.d.ts +1 -1
  101. package/dist/projectionReconciliation.js +14 -20
  102. package/dist/projectionReconciliation.js.map +1 -1
  103. package/dist/{projectionStaleness-CAdpIsaW.d.ts → projectionStaleness-CmdbpjVK.d.ts} +1 -1
  104. package/dist/projectionStaleness.d.ts +1 -1
  105. package/dist/{questionEvidenceLinks-BdQD0TkM.d.ts → questionEvidenceLinks-DFlyPpAj.d.ts} +1 -1
  106. package/dist/questionEvidenceLinks.d.ts +1 -1
  107. package/dist/questionEvidenceLinks.js +144 -45
  108. package/dist/questionEvidenceLinks.js.map +1 -1
  109. package/dist/resolvers.js +86 -37
  110. package/dist/resolvers.js.map +1 -1
  111. package/dist/scopeResolverCompat.js +64 -7
  112. package/dist/scopeResolverCompat.js.map +1 -1
  113. package/dist/{text-matching-CMn2WnVD.d.ts → text-matching-DNg4M5Wd.d.ts} +1 -1
  114. package/dist/text-matching.d.ts +1 -1
  115. package/dist/topicProjectOverlay.js +56 -13
  116. package/dist/topicProjectOverlay.js.map +1 -1
  117. package/dist/topicScope.js +55 -6
  118. package/dist/topicScope.js.map +1 -1
  119. package/dist/workflowBridge.js +55 -6
  120. package/dist/workflowBridge.js.map +1 -1
  121. package/dist/workspaceIsolation.js +55 -6
  122. package/dist/workspaceIsolation.js.map +1 -1
  123. package/package.json +5 -5
@@ -45,4 +45,4 @@ declare namespace ontologyMatching {
45
45
  export { type ontologyMatching_EntityConnectionMatch as EntityConnectionMatch, type ontologyMatching_EntityMatchCandidate as EntityMatchCandidate, type ontologyMatching_EntityTypeMatch as EntityTypeMatch, type ontologyMatching_OntologyEntityType as OntologyEntityType, ontologyMatching_rankEntityConnections as rankEntityConnections, ontologyMatching_rankEntityTypeMatches as rankEntityTypeMatches, ontologyMatching_scoreEntityConnection as scoreEntityConnection, ontologyMatching_scoreEntityTypeMatch as scoreEntityTypeMatch };
46
46
  }
47
47
 
48
- export { type EntityTypeMatch as E, type OntologyEntityType as O, type EntityMatchCandidate as a, type EntityConnectionMatch as b, ontologyMatching as o };
48
+ export { type EntityConnectionMatch as E, type OntologyEntityType as O, type EntityMatchCandidate as a, type EntityTypeMatch as b, ontologyMatching as o };
@@ -1,2 +1,2 @@
1
1
  export { rankEntityConnections, rankEntityTypeMatches, scoreEntityConnection, scoreEntityTypeMatch } from '@lucern/contracts/v1/ontologies/v1';
2
- export { b as EntityConnectionMatch, a as EntityMatchCandidate, E as EntityTypeMatch, O as OntologyEntityType } from './ontology-matching-Buhu23ss.js';
2
+ export { E as EntityConnectionMatch, a as EntityMatchCandidate, b as EntityTypeMatch, O as OntologyEntityType } from './ontology-matching-C6rrz2VP.js';
@@ -23,4 +23,4 @@ declare namespace ontologyApproval {
23
23
  export { ontologyApproval_approve as approve, ontologyApproval_batchCreatePendingLinks as batchCreatePendingLinks, ontologyApproval_bulkApprove as bulkApprove, ontologyApproval_bulkApproveHighConfidence as bulkApproveHighConfidence, ontologyApproval_createNeo4jEdge as createNeo4jEdge, ontologyApproval_createPendingLink as createPendingLink, ontologyApproval_getPendingForNode as getPendingForNode, ontologyApproval_getPendingForProject as getPendingForProject, ontologyApproval_getThemeOntologyMatches as getThemeOntologyMatches, ontologyApproval_reject as reject };
24
24
  }
25
25
 
26
- export { getPendingForNode as a, getThemeOntologyMatches as b, createPendingLink as c, approve as d, bulkApprove as e, bulkApproveHighConfidence as f, getPendingForProject as g, createNeo4jEdge as h, batchCreatePendingLinks as i, ontologyApproval as o, reject as r };
26
+ export { approve as a, batchCreatePendingLinks as b, bulkApprove as c, bulkApproveHighConfidence as d, createNeo4jEdge as e, createPendingLink as f, getPendingForNode as g, getPendingForProject as h, getThemeOntologyMatches as i, ontologyApproval as o, reject as r };
@@ -1 +1 @@
1
- export { d as approve, i as batchCreatePendingLinks, e as bulkApprove, f as bulkApproveHighConfidence, h as createNeo4jEdge, c as createPendingLink, a as getPendingForNode, g as getPendingForProject, b as getThemeOntologyMatches, r as reject } from './ontologyApproval-Ba0Jjk1k.js';
1
+ export { a as approve, b as batchCreatePendingLinks, c as bulkApprove, d as bulkApproveHighConfidence, e as createNeo4jEdge, f as createPendingLink, g as getPendingForNode, h as getPendingForProject, i as getThemeOntologyMatches, r as reject } from './ontologyApproval-CFYmqKmk.js';
@@ -10,6 +10,7 @@ var query = queryGeneric;
10
10
 
11
11
  // src/ontologyHelpers.ts
12
12
  var ONTOLOGY_KEY_REGEX = /^[a-z][a-z0-9-]*[a-z0-9]$/;
13
+ var VERSION_STRING_REGEX = /^\d+\.\d+\.\d+$/;
13
14
  function validateOntologyKey(key) {
14
15
  const normalized = key.trim().toLowerCase();
15
16
  if (normalized.length < 2) {
@@ -35,9 +36,9 @@ function validateOntologyKey(key) {
35
36
  }
36
37
  return { valid: true, normalized };
37
38
  }
38
- function validateVersionString(version) {
39
- return /^\d+\.\d+\.\d+$/.test(version);
40
- }
39
+ var validateVersionString = VERSION_STRING_REGEX.test.bind(
40
+ VERSION_STRING_REGEX
41
+ );
41
42
  function mergeOntologyLayers(parent, child, parentKey, childKey) {
42
43
  const entityMap = /* @__PURE__ */ new Map();
43
44
  for (const et of parent.entityTypes) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/convex.ts","../src/ontologyHelpers.ts","../src/ontologyDefinitions.ts"],"names":[],"mappings":";;;;;;AAc0B,iBAAA;AAkBnB,IAAM,QAAA,GAAW,eAAA;AACjB,IAAM,KAAA,GAAQ,YAAA;;;ACerB,IAAM,kBAAA,GAAqB,2BAAA;AAMpB,SAAS,oBAAoB,GAAA,EAIlC;AACA,EAAA,MAAM,UAAA,GAAa,GAAA,CAAI,IAAA,EAAK,CAAE,WAAA,EAAY;AAC1C,EAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,UAAA;AAAA,MACA,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AACA,EAAA,IAAI,UAAA,CAAW,SAAS,EAAA,EAAI;AAC1B,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,UAAA;AAAA,MACA,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AACA,EAAA,IAAI,CAAC,kBAAA,CAAmB,IAAA,CAAK,UAAU,CAAA,EAAG;AACxC,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,UAAA;AAAA,MACA,KAAA,EACE;AAAA,KACJ;AAAA,EACF;AACA,EAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,UAAA,EAAW;AACnC;AAMO,SAAS,sBAAsB,OAAA,EAA0B;AAC9D,EAAA,OAAO,iBAAA,CAAkB,KAAK,OAAO,CAAA;AACvC;AAMO,SAAS,mBAAA,CACd,MAAA,EACA,KAAA,EACA,SAAA,EACA,QAAA,EACgB;AAEhB,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAA6B;AACnD,EAAA,KAAA,MAAW,EAAA,IAAM,OAAO,WAAA,EAAa;AACnC,IAAA,SAAA,CAAU,GAAA,CAAI,EAAA,CAAG,KAAA,EAAO,EAAE,CAAA;AAAA,EAC5B;AACA,EAAA,KAAA,MAAW,EAAA,IAAM,MAAM,WAAA,EAAa;AAClC,IAAA,SAAA,CAAU,GAAA,CAAI,EAAA,CAAG,KAAA,EAAO,EAAE,CAAA;AAAA,EAC5B;AAGA,EAAA,MAAM,OAAA,uBAAc,GAAA,EAA2B;AAC/C,EAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,SAAA,EAAW;AACnC,IAAA,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,KAAA,EAAO,IAAI,CAAA;AAAA,EAC9B;AACA,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,SAAA,EAAW;AAClC,IAAA,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,KAAA,EAAO,IAAI,CAAA;AAAA,EAC9B;AAEA,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA;AAAA,IAC1C,SAAA,EAAW,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AAAA,IACtC,MAAA,EAAQ,CAAC,SAAA,EAAW,QAAQ;AAAA,GAC9B;AACF;;;AC/FA,eAAe,YAAY,GAAA,EAAmC;AAC5D,EAAA,MAAM,MAAA,GAAS,MAAM,gBAAA,CAAiB,GAAU,CAAA;AAChD,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAAA,EAC5C;AACA,EAAA,OAAO,MAAA;AACT;AAsBA,eAAe,QAAA,CACb,KACA,IAAA,EAQA;AACA,EAAA,MAAM,GAAA,CAAI,EAAA,CAAG,MAAA,CAAO,gBAAA,EAAkB;AAAA,IACpC,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,IACpB,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,OAAA,EAAS,KAAA;AAAA,IACT,aAAA,EAAe,KAAK,aAAA,IAAiB,IAAA;AAAA,IACrC,QAAA,EAAU,KAAK,QAAA,IAAY;AAAA,GAC5B,CAAA;AACH;AASO,IAAM,wBAAwB,KAAA,CAAM;AAAA,EACzC,MAAM,EAAE,EAAA,EAAI,CAAA,CAAE,EAAA,CAAG,qBAAqB,CAAA,EAAE;AAAA,EACxC,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,OAAO,GAAA,EAAK,IAAA,KAAS;AAC5B,IAAA,OAAO,MAAM,GAAA,CAAI,EAAA,CAAG,GAAA,CAAI,KAAK,EAAE,CAAA;AAAA,EACjC;AACF,CAAC;AAKM,IAAM,6BAA6B,KAAA,CAAM;AAAA,EAC9C,IAAA,EAAM;AAAA,IACJ,WAAA,EAAa,EAAE,MAAA,EAAO;AAAA,IACtB,QAAA,EAAU,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ;AAAA,GACjC;AAAA,EACA,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,OAAO,GAAA,EAAK,IAAA,KAAS;AAC5B,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,OAAO,MAAM,GAAA,CAAI,EAAA,CACd,KAAA,CAAM,qBAAqB,CAAA,CAC3B,SAAA;AAAA,QAAU,uBAAA;AAAA,QAAyB,CAAC,CAAA,KACnC,CAAA,CAAE,EAAA,CAAG,UAAA,EAAY,IAAA,CAAK,QAAQ,CAAA,CAAE,EAAA,CAAG,aAAA,EAAe,IAAA,CAAK,WAAW;AAAA,QAEnE,KAAA,EAAM;AAAA,IACX;AAEA,IAAA,OAAO,MAAM,GAAA,CAAI,EAAA,CACd,KAAA,CAAM,qBAAqB,CAAA,CAC3B,SAAA;AAAA,MAAU,uBAAA;AAAA,MAAyB,CAAC,CAAA,KACnC,CAAA,CAAE,EAAA,CAAG,UAAA,EAAY,MAAS,CAAA,CAAE,EAAA,CAAG,aAAA,EAAe,IAAA,CAAK,WAAW;AAAA,MAE/D,KAAA,EAAM;AAAA,EACX;AACF,CAAC;AAKM,IAAM,0BAA0B,KAAA,CAAM;AAAA,EAC3C,IAAA,EAAM;AAAA,IACJ,QAAA,EAAU,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAA;AAAA,IAC/B,MAAM,CAAA,CAAE,QAAA;AAAA,MACN,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,OAAA,CAAQ,UAAU,CAAA,EAAG,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA,EAAG,CAAA,CAAE,OAAA,CAAQ,QAAQ,CAAC;AAAA,KACvE;AAAA,IACA,QAAQ,CAAA,CAAE,QAAA;AAAA,MACR,CAAA,CAAE,KAAA;AAAA,QACA,CAAA,CAAE,QAAQ,OAAO,CAAA;AAAA,QACjB,CAAA,CAAE,QAAQ,QAAQ,CAAA;AAAA,QAClB,CAAA,CAAE,QAAQ,YAAY,CAAA;AAAA,QACtB,CAAA,CAAE,QAAQ,UAAU;AAAA;AACtB;AACF,GACF;AAAA,EACA,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,OAAO,GAAA,EAAK,IAAA,KAAS;AAC5B,IAAA,IAAI,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,MAAA,EAAQ;AAChC,MAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,MAAA,OAAO,MAAM,GAAA,CAAI,EAAA,CACd,KAAA,CAAM,qBAAqB,CAAA,CAC3B,SAAA;AAAA,QAAU,kBAAA;AAAA,QAAoB,CAAC,CAAA,KAC9B,CAAA,CAAE,EAAA,CAAG,UAAA,EAAY,KAAK,QAAQ,CAAA,CAAE,EAAA,CAAG,QAAA,EAAU,MAAM;AAAA,QAEpD,OAAA,EAAQ;AAAA,IACb;AACA,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,MAAA,OAAO,MAAM,GAAA,CAAI,EAAA,CACd,KAAA,CAAM,qBAAqB,EAC3B,SAAA,CAAU,WAAA,EAAa,CAAC,CAAA,KAAM,EAAE,EAAA,CAAG,QAAA,EAAU,MAAM,CAAC,EACpD,OAAA,EAAQ;AAAA,IACb;AACA,IAAA,IAAI,KAAK,IAAA,EAAM;AACb,MAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,MAAA,OAAO,MAAM,GAAA,CAAI,EAAA,CACd,KAAA,CAAM,qBAAqB,EAC3B,SAAA,CAAU,SAAA,EAAW,CAAC,CAAA,KAAM,EAAE,EAAA,CAAG,MAAA,EAAQ,IAAI,CAAC,EAC9C,OAAA,EAAQ;AAAA,IACb;AACA,IAAA,OAAO,MAAM,GAAA,CAAI,EAAA,CAAG,KAAA,CAAM,qBAAqB,EAAE,OAAA,EAAQ;AAAA,EAC3D;AACF,CAAC;AAKM,IAAM,qBAAqB,KAAA,CAAM;AAAA,EACtC,IAAA,EAAM;AAAA,IACJ,WAAA,EAAa,EAAE,MAAA,EAAO;AAAA,IACtB,OAAA,EAAS,EAAE,MAAA;AAAO,GACpB;AAAA,EACA,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,OAAO,GAAA,EAAK,IAAA,KAAS;AAC5B,IAAA,OAAO,MAAM,GAAA,CAAI,EAAA,CACd,KAAA,CAAM,kBAAkB,CAAA,CACxB,SAAA;AAAA,MAAU,wBAAA;AAAA,MAA0B,CAAC,CAAA,KACpC,CAAA,CAAE,EAAA,CAAG,aAAA,EAAe,IAAA,CAAK,WAAW,CAAA,CAAE,EAAA,CAAG,SAAA,EAAW,IAAA,CAAK,OAAO;AAAA,MAEjE,KAAA,EAAM;AAAA,EACX;AACF,CAAC;AAKM,IAAM,uBAAuB,KAAA,CAAM;AAAA,EACxC,IAAA,EAAM;AAAA,IACJ,UAAA,EAAY,CAAA,CAAE,EAAA,CAAG,qBAAqB,CAAA;AAAA,IACtC,QAAQ,CAAA,CAAE,QAAA;AAAA,MACR,CAAA,CAAE,KAAA;AAAA,QACA,CAAA,CAAE,QAAQ,OAAO,CAAA;AAAA,QACjB,CAAA,CAAE,QAAQ,WAAW,CAAA;AAAA,QACrB,CAAA,CAAE,QAAQ,YAAY;AAAA;AACxB;AACF,GACF;AAAA,EACA,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,OAAO,GAAA,EAAK,IAAA,KAAS;AAC5B,IAAA,MAAM,MAAM,MAAM,GAAA,CAAI,GACnB,KAAA,CAAM,kBAAkB,EACxB,SAAA,CAAU,eAAA,EAAiB,CAAC,CAAA,KAAM,EAAE,EAAA,CAAG,YAAA,EAAc,KAAK,UAAU,CAAC,EACrE,OAAA,EAAQ;AAEX,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,OAAO,IAAI,MAAA,CAAO,CAAC,eAAe,UAAA,CAAW,MAAA,KAAW,KAAK,MAAM,CAAA;AAAA,IACrE;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AACF,CAAC;AAKM,IAAM,sBAAsB,KAAA,CAAM;AAAA,EACvC,MAAM,EAAE,UAAA,EAAY,CAAA,CAAE,EAAA,CAAG,qBAAqB,CAAA,EAAE;AAAA,EAChD,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,OAAO,GAAA,EAAK,IAAA,KAAS;AAC5B,IAAA,MAAM,YAAY,MAAM,GAAA,CAAI,GACzB,KAAA,CAAM,kBAAkB,EACxB,SAAA,CAAU,eAAA,EAAiB,CAAC,CAAA,KAAM,EAAE,EAAA,CAAG,YAAA,EAAc,KAAK,UAAU,CAAC,EACrE,OAAA,EAAQ;AAEX,IAAA,MAAM,gBAAgB,SAAA,CAAU,MAAA;AAAA,MAC9B,CAAC,UAAA,KAAe,UAAA,CAAW,MAAA,KAAW;AAAA,KACxC;AACA,IAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAC9B,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,aAAA,CAAc,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAA,CAAO,EAAE,WAAA,IAAe,CAAA,KAAM,CAAA,CAAE,WAAA,IAAe,CAAA,CAAE,CAAA;AACxE,IAAA,OAAO,cAAc,CAAC,CAAA;AAAA,EACxB;AACF,CAAC;AAMM,IAAM,2BAA2B,KAAA,CAAM;AAAA,EAC5C,MAAM,EAAE,UAAA,EAAY,CAAA,CAAE,EAAA,CAAG,qBAAqB,CAAA,EAAE;AAAA,EAChD,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,OAAO,GAAA,EAAK,IAAA,KAAS;AAC5B,IAAA,MAAM,SAAA,GAAY,CAAA;AAWlB,IAAA,MAAM,QAAkE,EAAC;AAGzE,IAAA,IAAI,YAAmD,IAAA,CAAK,UAAA;AAC5D,IAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,SAAA,IAAa,WAAW,KAAA,EAAA,EAAS;AAC3D,MAAA,MAAM,UAAA,GAAa,SAAA;AACnB,MAAA,MAAM,GAAA,GAAM,MAAM,GAAA,CAAI,EAAA,CAAG,IAAI,UAAU,CAAA;AACvC,MAAA,IAAI,CAAC,GAAA,EAAK;AACR,QAAA;AAAA,MACF;AACA,MAAA,MAAM,QAAA,GAAW,GAAA;AAKjB,MAAA,MAAM,WAAW,MAAM,GAAA,CAAI,EAAA,CACxB,KAAA,CAAM,kBAAkB,CAAA,CACxB,SAAA,CAAU,eAAA,EAAiB,CAAC,MAAM,CAAA,CAAE,EAAA,CAAG,cAAc,UAAU,CAAC,EAChE,OAAA,EAAQ;AACX,MAAA,MAAM,SAAA,GAAY,SACf,MAAA,CAAO,CAAC,QAAQ,GAAA,CAAI,MAAA,KAAW,WAAW,CAAA,CAC1C,IAAA;AAAA,QACC,CAAC,CAAA,EAAG,CAAA,KAAA,CACA,EAAE,WAAA,IAA0B,CAAA,KAAO,EAAE,WAAA,IAA0B,CAAA;AAAA,OACrE;AAEF,MAAA,KAAA,CAAM,OAAA,CAAQ;AAAA,QACZ,GAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAU,SAAA,CAAU,CAAC,CAAA,IAAqB;AAAA,OAC3C,CAAA;AACD,MAAA,SAAA,GAAY,QAAA,CAAS,gBAAA;AAAA,IACvB;AAEA,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IAAI,MAAA,GAAyB;AAAA,MAC3B,aAAa,EAAC;AAAA,MACd,WAAW,EAAC;AAAA,MACZ,QAAQ;AAAC,KACX;AAEA,IAAA,KAAA,MAAW,EAAE,GAAA,EAAK,OAAA,EAAQ,IAAK,KAAA,EAAO;AACpC,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,WAAW,CAAA;AAClC,QAAA;AAAA,MACF;AACA,MAAA,MAAM,mBAAmB,MAAA,CAAO,MAAA,CAAO,EAAA,CAAG,EAAE,KAAK,GAAA,CAAI,WAAA;AACrD,MAAA,MAAA,GAAS,mBAAA;AAAA,QACP,MAAA;AAAA,QACA;AAAA,UACE,aAAa,OAAA,CAAQ,WAAA;AAAA,UACrB,WAAW,OAAA,CAAQ;AAAA,SACrB;AAAA,QACA,gBAAA;AAAA,QACA,GAAA,CAAI;AAAA,OACN;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AACF,CAAC;AASM,IAAM,2BAA2B,QAAA,CAAS;AAAA,EAC/C,IAAA,EAAM;AAAA,IACJ,WAAA,EAAa,EAAE,MAAA,EAAO;AAAA,IACtB,IAAA,EAAM,EAAE,MAAA,EAAO;AAAA,IACf,WAAA,EAAa,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAA;AAAA,IAClC,QAAA,EAAU,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAA;AAAA,IAC/B,MAAM,CAAA,CAAE,KAAA;AAAA,MACN,CAAA,CAAE,QAAQ,UAAU,CAAA;AAAA,MACpB,CAAA,CAAE,QAAQ,MAAM,CAAA;AAAA,MAChB,CAAA,CAAE,QAAQ,QAAQ;AAAA,KACpB;AAAA,IACA,kBAAkB,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,EAAA,CAAG,qBAAqB,CAAC;AAAA,GAC1D;AAAA,EACA,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,OAAO,GAAA,EAAK,IAAA,KAAS;AAC5B,IAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,GAAG,CAAA;AAGpC,IAAA,MAAM,SAAA,GAAY,mBAAA,CAAoB,IAAA,CAAK,WAAW,CAAA;AACtD,IAAA,IAAI,CAAC,UAAU,KAAA,EAAO;AACpB,MAAA,MAAM,IAAI,KAAA,CAAM,SAAA,CAAU,KAAA,IAAS,sBAAsB,CAAA;AAAA,IAC3D;AAGA,IAAA,MAAM,WAAW,MAAM,GAAA,CAAI,EAAA,CACxB,KAAA,CAAM,qBAAqB,CAAA,CAC3B,SAAA;AAAA,MAAU,uBAAA;AAAA,MAAyB,CAAC,CAAA,KACnC,CAAA,CAAE,EAAA,CAAG,UAAA,EAAY,IAAA,CAAK,QAAQ,CAAA,CAAE,EAAA,CAAG,aAAA,EAAe,SAAA,CAAU,UAAU;AAAA,MAEvE,KAAA,EAAM;AAET,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,aAAa,SAAA,CAAU,UAAU,CAAA,4BAAA,EAA+B,IAAA,CAAK,YAAY,YAAY,CAAA,CAAA;AAAA,OAC/F;AAAA,IACF;AAGA,IAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,MAAA,MAAM,SAAS,MAAM,GAAA,CAAI,EAAA,CAAG,GAAA,CAAI,KAAK,gBAAgB,CAAA;AACrD,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAAA,MACzD;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,EAAA,GAAK,MAAM,GAAA,CAAI,EAAA,CAAG,OAAO,qBAAA,EAAuB;AAAA,MACpD,aAAa,SAAA,CAAU,UAAA;AAAA,MACvB,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,kBAAkB,IAAA,CAAK,gBAAA;AAAA,MACvB,MAAA,EAAQ,OAAA;AAAA,MACR,SAAA,EAAW,MAAA;AAAA,MACX,SAAA,EAAW,GAAA;AAAA,MACX,SAAA,EAAW;AAAA,KACZ,CAAA;AAED,IAAA,MAAM,SAAS,GAAA,EAAK;AAAA,MAClB,UAAA,EAAY,oBAAA;AAAA,MACZ,QAAA,EAAU,EAAA;AAAA,MACV,UAAA,EAAY,SAAA;AAAA,MACZ,SAAA,EAAW,MAAA;AAAA,MACX,aAAA,EAAe,IAAA;AAAA,MACf,QAAA,EAAU;AAAA,QACR,aAAa,SAAA,CAAU,UAAA;AAAA,QACvB,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,MAAM,IAAA,CAAK;AAAA;AACb,KACD,CAAA;AAED,IAAA,OAAO,EAAE,EAAA,EAAI,WAAA,EAAa,SAAA,CAAU,UAAA,EAAW;AAAA,EACjD;AACF,CAAC;AAMM,IAAM,2BAA2B,QAAA,CAAS;AAAA,EAC/C,IAAA,EAAM;AAAA,IACJ,EAAA,EAAI,CAAA,CAAE,EAAA,CAAG,qBAAqB,CAAA;AAAA,IAC9B,IAAA,EAAM,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAA;AAAA,IAC3B,WAAA,EAAa,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAA;AAAA,IAClC,QAAQ,CAAA,CAAE,QAAA;AAAA,MACR,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,OAAA,CAAQ,OAAO,CAAA,EAAG,CAAA,CAAE,OAAA,CAAQ,QAAQ,CAAA,EAAG,CAAA,CAAE,OAAA,CAAQ,YAAY,CAAC;AAAA;AAC1E,GACF;AAAA,EACA,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,OAAO,GAAA,EAAK,IAAA,KAAS;AAC5B,IAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,GAAG,CAAA;AAEpC,IAAA,MAAM,MAAM,MAAM,GAAA,CAAI,EAAA,CAAG,GAAA,CAAI,KAAK,EAAE,CAAA;AACpC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAAA,IAClD;AAEA,IAAA,IAAI,GAAA,CAAI,WAAW,UAAA,EAAY;AAC7B,MAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,IAClE;AAEA,IAAA,MAAM,aAAA,GAAgB;AAAA,MACpB,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,aAAa,GAAA,CAAI,WAAA;AAAA,MACjB,QAAQ,GAAA,CAAI;AAAA,KACd;AAEA,IAAA,MAAM,KAAA,GAAiC,EAAE,SAAA,EAAW,IAAA,CAAK,KAAI,EAAE;AAC/D,IAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAW;AAC3B,MAAA,KAAA,CAAM,OAAO,IAAA,CAAK,IAAA;AAAA,IACpB;AACA,IAAA,IAAI,IAAA,CAAK,gBAAgB,MAAA,EAAW;AAClC,MAAA,KAAA,CAAM,cAAc,IAAA,CAAK,WAAA;AAAA,IAC3B;AACA,IAAA,IAAI,IAAA,CAAK,WAAW,MAAA,EAAW;AAC7B,MAAA,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA;AAAA,IACtB;AAEA,IAAA,MAAM,GAAA,CAAI,EAAA,CAAG,KAAA,CAAM,IAAA,CAAK,IAAI,KAAK,CAAA;AAEjC,IAAA,MAAM,SAAS,GAAA,EAAK;AAAA,MAClB,UAAA,EAAY,oBAAA;AAAA,MACZ,UAAU,IAAA,CAAK,EAAA;AAAA,MACf,UAAA,EAAY,SAAA;AAAA,MACZ,SAAA,EAAW,MAAA;AAAA,MACX,aAAA;AAAA,MACA,QAAA,EAAU;AAAA,KACX,CAAA;AAED,IAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,EACzB;AACF,CAAC;AAKM,IAAM,4BAA4B,QAAA,CAAS;AAAA,EAChD,MAAM,EAAE,EAAA,EAAI,CAAA,CAAE,EAAA,CAAG,qBAAqB,CAAA,EAAE;AAAA,EACxC,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,OAAO,GAAA,EAAK,IAAA,KAAS;AAC5B,IAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,GAAG,CAAA;AAEpC,IAAA,MAAM,MAAM,MAAM,GAAA,CAAI,EAAA,CAAG,GAAA,CAAI,KAAK,EAAE,CAAA;AACpC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAAA,IAClD;AAEA,IAAA,IAAI,GAAA,CAAI,WAAW,UAAA,EAAY;AAC7B,MAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,IACzB;AAEA,IAAA,MAAM,GAAA,CAAI,EAAA,CAAG,KAAA,CAAM,IAAA,CAAK,EAAA,EAAI,EAAE,MAAA,EAAQ,UAAA,EAAY,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI,EAAG,CAAA;AAEzE,IAAA,MAAM,SAAS,GAAA,EAAK;AAAA,MAClB,UAAA,EAAY,oBAAA;AAAA,MACZ,UAAU,IAAA,CAAK,EAAA;AAAA,MACf,UAAA,EAAY,UAAA;AAAA,MACZ,SAAA,EAAW,MAAA;AAAA,MACX,aAAA,EAAe,EAAE,MAAA,EAAQ,GAAA,CAAI,MAAA,EAAO;AAAA,MACpC,QAAA,EAAU,EAAE,MAAA,EAAQ,UAAA;AAAW,KAChC,CAAA;AAED,IAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,EACzB;AACF,CAAC;AAKM,IAAM,wBAAwB,QAAA,CAAS;AAAA,EAC5C,IAAA,EAAM;AAAA,IACJ,UAAA,EAAY,CAAA,CAAE,EAAA,CAAG,qBAAqB,CAAA;AAAA,IACtC,OAAA,EAAS,EAAE,MAAA,EAAO;AAAA,IAClB,aAAa,CAAA,CAAE,KAAA;AAAA,MACb,EAAE,MAAA,CAAO;AAAA,QACP,KAAA,EAAO,EAAE,MAAA,EAAO;AAAA,QAChB,KAAA,EAAO,EAAE,MAAA,EAAO;AAAA,QAChB,WAAA,EAAa,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAA;AAAA,QAClC,MAAA,EAAQ,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,KAAK,CAAA;AAAA,QAC1B,UAAU,CAAA,CAAE,QAAA;AAAA,UACV,CAAA,CAAE,KAAA;AAAA,YACA,EAAE,MAAA,CAAO;AAAA,cACP,KAAA,EAAO,EAAE,MAAA,EAAO;AAAA,cAChB,KAAA,EAAO,EAAE,MAAA,EAAO;AAAA,cAChB,WAAA,EAAa,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ;AAAA,aACnC;AAAA;AACH;AACF,OACD;AAAA,KACH;AAAA,IACA,WAAW,CAAA,CAAE,KAAA;AAAA,MACX,EAAE,MAAA,CAAO;AAAA,QACP,KAAA,EAAO,EAAE,MAAA,EAAO;AAAA,QAChB,KAAA,EAAO,EAAE,MAAA,EAAO;AAAA,QAChB,WAAA,EAAa,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAA;AAAA,QAClC,WAAA,EAAa,EAAE,QAAA,CAAS,CAAA,CAAE,MAAM,CAAA,CAAE,MAAA,EAAQ,CAAC,CAAA;AAAA,QAC3C,WAAA,EAAa,EAAE,QAAA,CAAS,CAAA,CAAE,MAAM,CAAA,CAAE,MAAA,EAAQ,CAAC,CAAA;AAAA,QAC3C,oBAAoB,CAAA,CAAE,QAAA;AAAA,UACpB,CAAA,CAAE,MAAM,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA,EAAG,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAC;AAAA;AAC9C,OACD;AAAA,KACH;AAAA,IACA,YAAA,EAAc,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ;AAAA,GACrC;AAAA,EACA,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,OAAO,GAAA,EAAK,IAAA,KAAS;AAC5B,IAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,GAAG,CAAA;AAGpC,IAAA,IAAI,CAAC,qBAAA,CAAsB,IAAA,CAAK,OAAO,CAAA,EAAG;AACxC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,wBAAA,EAA2B,KAAK,OAAO,CAAA,2BAAA;AAAA,OACzC;AAAA,IACF;AAGA,IAAA,MAAM,MAAM,MAAM,GAAA,CAAI,EAAA,CAAG,GAAA,CAAI,KAAK,UAAU,CAAA;AAC5C,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAAA,IAClD;AAEA,IAAA,IAAI,GAAA,CAAI,WAAW,UAAA,EAAY;AAC7B,MAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,IAChE;AAGA,IAAA,MAAM,WAAW,MAAM,GAAA,CAAI,EAAA,CACxB,KAAA,CAAM,kBAAkB,CAAA,CACxB,SAAA;AAAA,MAAU,wBAAA;AAAA,MAA0B,CAAC,CAAA,KACpC,CAAA,CAAE,EAAA,CAAG,aAAA,EAAe,GAAA,CAAI,WAAW,CAAA,CAAE,EAAA,CAAG,SAAA,EAAW,IAAA,CAAK,OAAO;AAAA,MAEhE,KAAA,EAAM;AAET,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,SAAA,EAAY,IAAA,CAAK,OAAO,CAAA,+BAAA,EAAkC,IAAI,WAAW,CAAA,EAAA;AAAA,OAC3E;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,EAAA,GAAK,MAAM,GAAA,CAAI,EAAA,CAAG,OAAO,kBAAA,EAAoB;AAAA,MACjD,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,aAAa,GAAA,CAAI,WAAA;AAAA,MACjB,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,MAAA,EAAQ,OAAA;AAAA,MACR,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,cAAc,IAAA,CAAK,YAAA;AAAA,MACnB,SAAA,EAAW;AAAA,KACZ,CAAA;AAED,IAAA,MAAM,SAAS,GAAA,EAAK;AAAA,MAClB,UAAA,EAAY,iBAAA;AAAA,MACZ,QAAA,EAAU,EAAA;AAAA,MACV,UAAA,EAAY,SAAA;AAAA,MACZ,SAAA,EAAW,MAAA;AAAA,MACX,aAAA,EAAe,IAAA;AAAA,MACf,QAAA,EAAU;AAAA,QACR,aAAa,GAAA,CAAI,WAAA;AAAA,QACjB,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,eAAA,EAAiB,KAAK,WAAA,CAAY,MAAA;AAAA,QAClC,aAAA,EAAe,KAAK,SAAA,CAAU;AAAA;AAChC,KACD,CAAA;AAED,IAAA,OAAO,EAAE,EAAA,EAAI,OAAA,EAAS,IAAA,CAAK,OAAA,EAAQ;AAAA,EACrC;AACF,CAAC;AAMM,IAAM,qBAAqB,QAAA,CAAS;AAAA,EACzC,IAAA,EAAM;AAAA,IACJ,EAAA,EAAI,CAAA,CAAE,EAAA,CAAG,kBAAkB,CAAA;AAAA,IAC3B,aAAa,CAAA,CAAE,QAAA;AAAA,MACb,CAAA,CAAE,KAAA;AAAA,QACA,EAAE,MAAA,CAAO;AAAA,UACP,KAAA,EAAO,EAAE,MAAA,EAAO;AAAA,UAChB,KAAA,EAAO,EAAE,MAAA,EAAO;AAAA,UAChB,WAAA,EAAa,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAA;AAAA,UAClC,MAAA,EAAQ,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,KAAK,CAAA;AAAA,UAC1B,UAAU,CAAA,CAAE,QAAA;AAAA,YACV,CAAA,CAAE,KAAA;AAAA,cACA,EAAE,MAAA,CAAO;AAAA,gBACP,KAAA,EAAO,EAAE,MAAA,EAAO;AAAA,gBAChB,KAAA,EAAO,EAAE,MAAA,EAAO;AAAA,gBAChB,WAAA,EAAa,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ;AAAA,eACnC;AAAA;AACH;AACF,SACD;AAAA;AACH,KACF;AAAA,IACA,WAAW,CAAA,CAAE,QAAA;AAAA,MACX,CAAA,CAAE,KAAA;AAAA,QACA,EAAE,MAAA,CAAO;AAAA,UACP,KAAA,EAAO,EAAE,MAAA,EAAO;AAAA,UAChB,KAAA,EAAO,EAAE,MAAA,EAAO;AAAA,UAChB,WAAA,EAAa,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAA;AAAA,UAClC,WAAA,EAAa,EAAE,QAAA,CAAS,CAAA,CAAE,MAAM,CAAA,CAAE,MAAA,EAAQ,CAAC,CAAA;AAAA,UAC3C,WAAA,EAAa,EAAE,QAAA,CAAS,CAAA,CAAE,MAAM,CAAA,CAAE,MAAA,EAAQ,CAAC,CAAA;AAAA,UAC3C,oBAAoB,CAAA,CAAE,QAAA;AAAA,YACpB,CAAA,CAAE,MAAM,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA,EAAG,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAC;AAAA;AAC9C,SACD;AAAA;AACH,KACF;AAAA,IACA,YAAA,EAAc,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ;AAAA,GACrC;AAAA,EACA,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,OAAO,GAAA,EAAK,IAAA,KAAS;AAC5B,IAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,GAAG,CAAA;AAEpC,IAAA,MAAM,MAAM,MAAM,GAAA,CAAI,EAAA,CAAG,GAAA,CAAI,KAAK,EAAE,CAAA;AACpC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,IAC/C;AAEA,IAAA,IAAI,GAAA,CAAI,WAAW,OAAA,EAAS;AAC1B,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,gBAAA,EAAmB,IAAI,MAAM,CAAA,2CAAA;AAAA,OAC/B;AAAA,IACF;AAEA,IAAA,MAAM,QAAiC,EAAC;AACxC,IAAA,IAAI,IAAA,CAAK,gBAAgB,MAAA,EAAW;AAClC,MAAA,KAAA,CAAM,cAAc,IAAA,CAAK,WAAA;AAAA,IAC3B;AACA,IAAA,IAAI,IAAA,CAAK,cAAc,MAAA,EAAW;AAChC,MAAA,KAAA,CAAM,YAAY,IAAA,CAAK,SAAA;AAAA,IACzB;AACA,IAAA,IAAI,IAAA,CAAK,iBAAiB,MAAA,EAAW;AACnC,MAAA,KAAA,CAAM,eAAe,IAAA,CAAK,YAAA;AAAA,IAC5B;AAEA,IAAA,MAAM,GAAA,CAAI,EAAA,CAAG,KAAA,CAAM,IAAA,CAAK,IAAI,KAAK,CAAA;AAEjC,IAAA,MAAM,SAAS,GAAA,EAAK;AAAA,MAClB,UAAA,EAAY,iBAAA;AAAA,MACZ,UAAU,IAAA,CAAK,EAAA;AAAA,MACf,UAAA,EAAY,SAAA;AAAA,MACZ,SAAA,EAAW,MAAA;AAAA,MACX,aAAA,EAAe,EAAE,MAAA,EAAQ,GAAA,CAAI,MAAA,EAAO;AAAA,MACpC,QAAA,EAAU;AAAA,KACX,CAAA;AAED,IAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,EACzB;AACF,CAAC;AAMM,IAAM,yBAAyB,QAAA,CAAS;AAAA,EAC7C,IAAA,EAAM;AAAA,IACJ,EAAA,EAAI,CAAA,CAAE,EAAA,CAAG,kBAAkB,CAAA;AAAA,IAC3B,YAAY,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,EAAA,CAAG,qBAAqB,CAAC;AAAA,GACpD;AAAA,EACA,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,OAAO,GAAA,EAAK,IAAA,KAAS;AAC5B,IAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,GAAG,CAAA;AAEpC,IAAA,MAAM,MAAM,MAAM,GAAA,CAAI,EAAA,CAAG,GAAA,CAAI,KAAK,EAAE,CAAA;AACpC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,IAC/C;AAGA,IAAA,IAAI,IAAA,CAAK,UAAA,IAAc,GAAA,CAAI,UAAA,KAAe,KAAK,UAAA,EAAY;AACzD,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAI,GAAA,CAAI,WAAW,OAAA,EAAS;AAC1B,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,iBAAA,EAAoB,IAAI,MAAM,CAAA,+CAAA;AAAA,OAChC;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,GAAA,CAAI,EAAA,CAAG,KAAA,CAAM,IAAA,CAAK,EAAA,EAAI;AAAA,MAC1B,MAAA,EAAQ,WAAA;AAAA,MACR,WAAA,EAAa,MAAA;AAAA,MACb,WAAA,EAAa;AAAA,KACd,CAAA;AAGD,IAAA,MAAM,MAAM,MAAM,GAAA,CAAI,EAAA,CAAG,GAAA,CAAI,IAAI,UAAU,CAAA;AAC3C,IAAA,IAAI,GAAA,IAAO,GAAA,CAAI,MAAA,KAAW,OAAA,EAAS;AACjC,MAAA,MAAM,GAAA,CAAI,EAAA,CAAG,KAAA,CAAM,GAAA,CAAI,UAAA,EAAY;AAAA,QACjC,MAAA,EAAQ,QAAA;AAAA,QACR,SAAA,EAAW;AAAA,OACZ,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,SAAS,GAAA,EAAK;AAAA,MAClB,UAAA,EAAY,iBAAA;AAAA,MACZ,UAAU,IAAA,CAAK,EAAA;AAAA,MACf,UAAA,EAAY,WAAA;AAAA,MACZ,SAAA,EAAW,MAAA;AAAA,MACX,aAAA,EAAe,EAAE,MAAA,EAAQ,OAAA,EAAQ;AAAA,MACjC,QAAA,EAAU,EAAE,MAAA,EAAQ,WAAA,EAAa,aAAa,GAAA;AAAI,KACnD,CAAA;AAED,IAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,WAAA,EAAa,GAAA,EAAI;AAAA,EAC3C;AACF,CAAC;AAKM,IAAM,2BAA2B,QAAA,CAAS;AAAA,EAC/C,IAAA,EAAM;AAAA,IACJ,EAAA,EAAI,CAAA,CAAE,EAAA,CAAG,kBAAkB,CAAA;AAAA,IAC3B,YAAY,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,EAAA,CAAG,qBAAqB,CAAC;AAAA,GACpD;AAAA,EACA,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,OAAO,GAAA,EAAK,IAAA,KAAS;AAC5B,IAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,GAAG,CAAA;AAEpC,IAAA,MAAM,MAAM,MAAM,GAAA,CAAI,EAAA,CAAG,GAAA,CAAI,KAAK,EAAE,CAAA;AACpC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,IAC/C;AAGA,IAAA,IAAI,IAAA,CAAK,UAAA,IAAc,GAAA,CAAI,UAAA,KAAe,KAAK,UAAA,EAAY;AACzD,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAI,GAAA,CAAI,WAAW,YAAA,EAAc;AAC/B,MAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,IACzB;AAEA,IAAA,IAAI,GAAA,CAAI,WAAW,WAAA,EAAa;AAC9B,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,mBAAA,EAAsB,IAAI,MAAM,CAAA,oDAAA;AAAA,OAClC;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,CAAI,GAAG,KAAA,CAAM,IAAA,CAAK,IAAI,EAAE,MAAA,EAAQ,cAAc,CAAA;AAEpD,IAAA,MAAM,SAAS,GAAA,EAAK;AAAA,MAClB,UAAA,EAAY,iBAAA;AAAA,MACZ,UAAU,IAAA,CAAK,EAAA;AAAA,MACf,UAAA,EAAY,YAAA;AAAA,MACZ,SAAA,EAAW,MAAA;AAAA,MACX,aAAA,EAAe,EAAE,MAAA,EAAQ,WAAA,EAAY;AAAA,MACrC,QAAA,EAAU,EAAE,MAAA,EAAQ,YAAA;AAAa,KAClC,CAAA;AAED,IAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,EACzB;AACF,CAAC","file":"ontologyDefinitions.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\nexport const action = actionGeneric as any;\nexport const httpAction = httpActionGeneric as any;\nexport const internalAction = internalActionGeneric as any;\nexport const internalMutation = internalMutationGeneric as any;\nexport const internalQuery = internalQueryGeneric as any;\nexport const mutation = mutationGeneric as any;\nexport const query = queryGeneric as any;\n","/**\n * Ontology Definition Pure Helpers\n *\n * Pure functions for ontology key validation, version string validation,\n * layer merging, and soft edge constraint checking.\n *\n * Separated from ontologyDefinitions.ts to enable unit testing without\n * Convex runtime dependencies.\n *\n * @module graph-primitives/ontologyHelpers\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type EntityTypeEntry = {\n value: string;\n label: string;\n description?: string;\n schema?: unknown;\n subtypes?: Array<{ value: string; label: string; description?: string }>;\n};\n\nexport type EdgeTypeEntry = {\n value: string;\n label: string;\n description?: string;\n sourceTypes?: string[];\n targetTypes?: string[];\n constraintSeverity?: \"warn\" | \"info\";\n};\n\nexport type MergedOntology = {\n entityTypes: EntityTypeEntry[];\n edgeTypes: EdgeTypeEntry[];\n layers: string[]; // ontologyKeys in composition order\n};\n\nexport type EdgeConstraintResult = {\n valid: boolean;\n warnings: string[];\n};\n\n// =============================================================================\n// PURE HELPER FUNCTIONS\n// =============================================================================\n\nconst ONTOLOGY_KEY_REGEX = /^[a-z][a-z0-9-]*[a-z0-9]$/;\n\n/**\n * Validate and normalize an ontology key.\n * Must be lowercase alphanumeric with hyphens, 2+ chars.\n */\nexport function validateOntologyKey(key: string): {\n valid: boolean;\n normalized: string;\n error?: string;\n} {\n const normalized = key.trim().toLowerCase();\n if (normalized.length < 2) {\n return {\n valid: false,\n normalized,\n error: \"Ontology key must be at least 2 characters.\",\n };\n }\n if (normalized.length > 64) {\n return {\n valid: false,\n normalized,\n error: \"Ontology key must be at most 64 characters.\",\n };\n }\n if (!ONTOLOGY_KEY_REGEX.test(normalized)) {\n return {\n valid: false,\n normalized,\n error:\n \"Ontology key must start with a letter, contain only lowercase letters, digits, and hyphens, and not end with a hyphen.\",\n };\n }\n return { valid: true, normalized };\n}\n\n/**\n * Validate a version string (basic semver-like format).\n * Accepts \"X.Y.Z\" where X, Y, Z are non-negative integers.\n */\nexport function validateVersionString(version: string): boolean {\n return /^\\d+\\.\\d+\\.\\d+$/.test(version);\n}\n\n/**\n * Merge ontology layers additively. Child adds to parent; never removes.\n * Duplicate entity/edge values in child override parent entries.\n */\nexport function mergeOntologyLayers(\n parent: { entityTypes: EntityTypeEntry[]; edgeTypes: EdgeTypeEntry[] },\n child: { entityTypes: EntityTypeEntry[]; edgeTypes: EdgeTypeEntry[] },\n parentKey: string,\n childKey: string\n): MergedOntology {\n // Entity types: child overrides parent by value\n const entityMap = new Map<string, EntityTypeEntry>();\n for (const et of parent.entityTypes) {\n entityMap.set(et.value, et);\n }\n for (const et of child.entityTypes) {\n entityMap.set(et.value, et);\n }\n\n // Edge types: child overrides parent by value\n const edgeMap = new Map<string, EdgeTypeEntry>();\n for (const edge of parent.edgeTypes) {\n edgeMap.set(edge.value, edge);\n }\n for (const edge of child.edgeTypes) {\n edgeMap.set(edge.value, edge);\n }\n\n return {\n entityTypes: Array.from(entityMap.values()),\n edgeTypes: Array.from(edgeMap.values()),\n layers: [parentKey, childKey],\n };\n}\n\n/**\n * Validate an edge against soft constraints.\n * Returns warnings but never blocks (soft constraint model).\n */\nexport function validateEdgeConstraint(\n edge: { sourceType: string; targetType: string; edgeType: string },\n constraints: EdgeTypeEntry | undefined\n): EdgeConstraintResult {\n if (!constraints) {\n return { valid: true, warnings: [] };\n }\n\n const warnings: string[] = [];\n\n if (\n constraints.sourceTypes &&\n constraints.sourceTypes.length > 0 &&\n !constraints.sourceTypes.includes(edge.sourceType)\n ) {\n warnings.push(\n `Edge type \"${edge.edgeType}\" recommends source types [${constraints.sourceTypes.join(\", \")}] but got \"${edge.sourceType}\".`\n );\n }\n\n if (\n constraints.targetTypes &&\n constraints.targetTypes.length > 0 &&\n !constraints.targetTypes.includes(edge.targetType)\n ) {\n warnings.push(\n `Edge type \"${edge.edgeType}\" recommends target types [${constraints.targetTypes.join(\", \")}] but got \"${edge.targetType}\".`\n );\n }\n\n // Soft constraints: always valid, just warn\n return { valid: true, warnings };\n}\n\n/**\n * Resolve effective tier from definition tier and tenantId.\n */\nexport function resolveEffectiveTier(\n defTier: \"platform\" | \"pack\" | \"tenant\",\n tenantId?: string\n): \"platform\" | \"pack\" | \"tenant\" {\n if (!tenantId) {\n return \"platform\";\n }\n if (defTier === \"platform\") {\n return \"platform\";\n }\n return defTier;\n}\n","/**\n * Ontology Definition Mutations & Queries\n *\n * CRUD operations for first-class ontology definition objects.\n * Follows the packDefinitions + packVersions two-table pattern from Master Control.\n *\n * Pure helper functions live in ontologyHelpers.ts for unit testing.\n *\n * @module graph-primitives/ontologyDefinitions\n */\n\nimport { v } from \"convex/values\";\nimport { getCurrentUserId } from \"@lucern/access-control/auth\";\nimport { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\nimport type { Id, MutationCtx, QueryCtx } from \"./convex\";\nimport { mutation, query } from \"./convex\";\nimport type {\n EdgeTypeEntry,\n EntityTypeEntry,\n MergedOntology,\n} from \"./ontologyHelpers\";\nimport {\n mergeOntologyLayers,\n validateOntologyKey,\n validateVersionString,\n} from \"./ontologyHelpers\";\n\n// =============================================================================\n// AUTH HELPER\n// =============================================================================\n\nasync function requireAuth(ctx: MutationCtx): Promise<string> {\n const userId = await getCurrentUserId(ctx as any);\n if (!userId) {\n throw new Error(\"Authentication required.\");\n }\n return userId;\n}\n\nasync function _requireAuthQuery(ctx: QueryCtx): Promise<string> {\n const userId = await getCurrentUserId(ctx as any);\n if (!userId) {\n throw new Error(\"Authentication required.\");\n }\n return userId;\n}\n\n// =============================================================================\n// AUDIT HELPER\n// =============================================================================\n\ntype AuditEntityType = \"ontologyDefinition\" | \"ontologyVersion\";\ntype AuditChangeType =\n | \"created\"\n | \"updated\"\n | \"archived\"\n | \"published\"\n | \"deprecated\";\n\nasync function logAudit(\n ctx: MutationCtx,\n args: {\n entityType: AuditEntityType;\n entityId: string;\n changeType: AuditChangeType;\n changedBy: string;\n previousState: unknown;\n newState: unknown;\n }\n) {\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: args.entityType,\n entityId: args.entityId,\n changeType: args.changeType,\n changedAt: Date.now(),\n changedBy: args.changedBy,\n isAgent: false,\n previousState: args.previousState ?? null,\n newState: args.newState ?? null,\n });\n}\n\n// =============================================================================\n// QUERIES\n// =============================================================================\n\n/**\n * Get an ontology definition by ID.\n */\nexport const getOntologyDefinition = query({\n args: { id: v.id(\"ontologyDefinitions\") },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n return await ctx.db.get(args.id);\n },\n});\n\n/**\n * Get an ontology definition by ontologyKey (optionally scoped by tenant).\n */\nexport const getOntologyDefinitionByKey = query({\n args: {\n ontologyKey: v.string(),\n tenantId: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n if (args.tenantId) {\n return await ctx.db\n .query(\"ontologyDefinitions\")\n .withIndex(\"by_tenant_ontologyKey\", (q) =>\n q.eq(\"tenantId\", args.tenantId).eq(\"ontologyKey\", args.ontologyKey)\n )\n .first();\n }\n // Platform default (tenantId = undefined)\n return await ctx.db\n .query(\"ontologyDefinitions\")\n .withIndex(\"by_tenant_ontologyKey\", (q) =>\n q.eq(\"tenantId\", undefined).eq(\"ontologyKey\", args.ontologyKey)\n )\n .first();\n },\n});\n\n/**\n * List ontology definitions with optional filters.\n */\nexport const listOntologyDefinitions = query({\n args: {\n tenantId: v.optional(v.string()),\n tier: v.optional(\n v.union(v.literal(\"platform\"), v.literal(\"pack\"), v.literal(\"tenant\"))\n ),\n status: v.optional(\n v.union(\n v.literal(\"draft\"),\n v.literal(\"active\"),\n v.literal(\"deprecated\"),\n v.literal(\"archived\")\n )\n ),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n if (args.tenantId && args.status) {\n const status = args.status;\n return await ctx.db\n .query(\"ontologyDefinitions\")\n .withIndex(\"by_tenant_status\", (q) =>\n q.eq(\"tenantId\", args.tenantId).eq(\"status\", status)\n )\n .collect();\n }\n if (args.status) {\n const status = args.status;\n return await ctx.db\n .query(\"ontologyDefinitions\")\n .withIndex(\"by_status\", (q) => q.eq(\"status\", status))\n .collect();\n }\n if (args.tier) {\n const tier = args.tier;\n return await ctx.db\n .query(\"ontologyDefinitions\")\n .withIndex(\"by_tier\", (q) => q.eq(\"tier\", tier))\n .collect();\n }\n return await ctx.db.query(\"ontologyDefinitions\").collect();\n },\n});\n\n/**\n * Get a specific version by ontologyId + version string.\n */\nexport const getOntologyVersion = query({\n args: {\n ontologyKey: v.string(),\n version: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n return await ctx.db\n .query(\"ontologyVersions\")\n .withIndex(\"by_ontologyKey_version\", (q) =>\n q.eq(\"ontologyKey\", args.ontologyKey).eq(\"version\", args.version)\n )\n .first();\n },\n});\n\n/**\n * List versions for an ontology, optionally filtered by status.\n */\nexport const listOntologyVersions = query({\n args: {\n ontologyId: v.id(\"ontologyDefinitions\"),\n status: v.optional(\n v.union(\n v.literal(\"draft\"),\n v.literal(\"published\"),\n v.literal(\"deprecated\")\n )\n ),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const all = await ctx.db\n .query(\"ontologyVersions\")\n .withIndex(\"by_ontologyId\", (q) => q.eq(\"ontologyId\", args.ontologyId))\n .collect();\n\n if (args.status) {\n return all.filter((versionDoc) => versionDoc.status === args.status);\n }\n return all;\n },\n});\n\n/**\n * Get the latest published version for an ontology.\n */\nexport const getPublishedVersion = query({\n args: { ontologyId: v.id(\"ontologyDefinitions\") },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const published = await ctx.db\n .query(\"ontologyVersions\")\n .withIndex(\"by_ontologyId\", (q) => q.eq(\"ontologyId\", args.ontologyId))\n .collect();\n\n const publishedOnly = published.filter(\n (versionDoc) => versionDoc.status === \"published\"\n );\n if (publishedOnly.length === 0) {\n return null;\n }\n\n // Return most recently published\n publishedOnly.sort((a, b) => (b.publishedAt ?? 0) - (a.publishedAt ?? 0));\n return publishedOnly[0];\n },\n});\n\n/**\n * Resolve the effective ontology by composing parent chain.\n * Walks parentOntologyId chain (max depth 3) and merges additively.\n */\nexport const resolveEffectiveOntology = query({\n args: { ontologyId: v.id(\"ontologyDefinitions\") },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const MAX_DEPTH = 3;\n type OntologyDef = {\n ontologyKey: string;\n parentOntologyId?: Id<\"ontologyDefinitions\">;\n };\n type OntologyVer = {\n status: string;\n publishedAt?: number;\n entityTypes: unknown;\n edgeTypes: unknown;\n };\n const chain: Array<{ def: OntologyDef; version: OntologyVer | null }> = [];\n\n // Walk parent chain\n let currentId: Id<\"ontologyDefinitions\"> | undefined = args.ontologyId;\n for (let depth = 0; depth < MAX_DEPTH && currentId; depth++) {\n const ontologyId = currentId;\n const def = await ctx.db.get(ontologyId);\n if (!def) {\n break;\n }\n const defTyped = def as unknown as OntologyDef & {\n _id: Id<\"ontologyDefinitions\">;\n };\n\n // Get latest published version\n const versions = await ctx.db\n .query(\"ontologyVersions\")\n .withIndex(\"by_ontologyId\", (q) => q.eq(\"ontologyId\", ontologyId))\n .collect();\n const published = versions\n .filter((ver) => ver.status === \"published\")\n .sort(\n (a, b) =>\n ((b.publishedAt as number) ?? 0) - ((a.publishedAt as number) ?? 0)\n );\n\n chain.unshift({\n def: defTyped,\n version: (published[0] as OntologyVer) ?? null,\n });\n currentId = defTyped.parentOntologyId;\n }\n\n if (chain.length === 0) {\n return null;\n }\n\n // Merge layers from root (platform) to leaf (tenant)\n let merged: MergedOntology = {\n entityTypes: [],\n edgeTypes: [],\n layers: [],\n };\n\n for (const { def, version } of chain) {\n if (!version) {\n merged.layers.push(def.ontologyKey);\n continue;\n }\n const previousLayerKey = merged.layers.at(-1) ?? def.ontologyKey;\n merged = mergeOntologyLayers(\n merged,\n {\n entityTypes: version.entityTypes as EntityTypeEntry[],\n edgeTypes: version.edgeTypes as EdgeTypeEntry[],\n },\n previousLayerKey,\n def.ontologyKey\n );\n }\n\n return merged;\n },\n});\n\n// =============================================================================\n// MUTATIONS\n// =============================================================================\n\n/**\n * Create a new ontology definition.\n */\nexport const createOntologyDefinition = mutation({\n args: {\n ontologyKey: v.string(),\n name: v.string(),\n description: v.optional(v.string()),\n tenantId: v.optional(v.string()),\n tier: v.union(\n v.literal(\"platform\"),\n v.literal(\"pack\"),\n v.literal(\"tenant\")\n ),\n parentOntologyId: v.optional(v.id(\"ontologyDefinitions\")),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const userId = await requireAuth(ctx);\n\n // Validate ontology key\n const keyResult = validateOntologyKey(args.ontologyKey);\n if (!keyResult.valid) {\n throw new Error(keyResult.error ?? \"Invalid ontology key\");\n }\n\n // Check uniqueness within tenant scope\n const existing = await ctx.db\n .query(\"ontologyDefinitions\")\n .withIndex(\"by_tenant_ontologyKey\", (q) =>\n q.eq(\"tenantId\", args.tenantId).eq(\"ontologyKey\", keyResult.normalized)\n )\n .first();\n\n if (existing) {\n throw new Error(\n `Ontology \"${keyResult.normalized}\" already exists for tenant ${args.tenantId ?? \"(platform)\"}.`\n );\n }\n\n // Validate parent exists if specified\n if (args.parentOntologyId) {\n const parent = await ctx.db.get(args.parentOntologyId);\n if (!parent) {\n throw new Error(\"Parent ontology definition not found.\");\n }\n }\n\n const now = Date.now();\n const id = await ctx.db.insert(\"ontologyDefinitions\", {\n ontologyKey: keyResult.normalized,\n name: args.name,\n description: args.description,\n tenantId: args.tenantId,\n tier: args.tier,\n parentOntologyId: args.parentOntologyId,\n status: \"draft\",\n createdBy: userId,\n createdAt: now,\n updatedAt: now,\n });\n\n await logAudit(ctx, {\n entityType: \"ontologyDefinition\",\n entityId: id,\n changeType: \"created\",\n changedBy: userId,\n previousState: null,\n newState: {\n ontologyKey: keyResult.normalized,\n name: args.name,\n tier: args.tier,\n },\n });\n\n return { id, ontologyKey: keyResult.normalized };\n },\n});\n\n/**\n * Update an ontology definition (name, description, status).\n * Only allowed while draft or active.\n */\nexport const updateOntologyDefinition = mutation({\n args: {\n id: v.id(\"ontologyDefinitions\"),\n name: v.optional(v.string()),\n description: v.optional(v.string()),\n status: v.optional(\n v.union(v.literal(\"draft\"), v.literal(\"active\"), v.literal(\"deprecated\"))\n ),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const userId = await requireAuth(ctx);\n\n const def = await ctx.db.get(args.id);\n if (!def) {\n throw new Error(\"Ontology definition not found.\");\n }\n\n if (def.status === \"archived\") {\n throw new Error(\"Cannot update an archived ontology definition.\");\n }\n\n const previousState = {\n name: def.name,\n description: def.description,\n status: def.status,\n };\n\n const patch: Record<string, unknown> = { updatedAt: Date.now() };\n if (args.name !== undefined) {\n patch.name = args.name;\n }\n if (args.description !== undefined) {\n patch.description = args.description;\n }\n if (args.status !== undefined) {\n patch.status = args.status;\n }\n\n await ctx.db.patch(args.id, patch);\n\n await logAudit(ctx, {\n entityType: \"ontologyDefinition\",\n entityId: args.id,\n changeType: \"updated\",\n changedBy: userId,\n previousState,\n newState: patch,\n });\n\n return { success: true };\n },\n});\n\n/**\n * Archive an ontology definition.\n */\nexport const archiveOntologyDefinition = mutation({\n args: { id: v.id(\"ontologyDefinitions\") },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const userId = await requireAuth(ctx);\n\n const def = await ctx.db.get(args.id);\n if (!def) {\n throw new Error(\"Ontology definition not found.\");\n }\n\n if (def.status === \"archived\") {\n return { success: true };\n }\n\n await ctx.db.patch(args.id, { status: \"archived\", updatedAt: Date.now() });\n\n await logAudit(ctx, {\n entityType: \"ontologyDefinition\",\n entityId: args.id,\n changeType: \"archived\",\n changedBy: userId,\n previousState: { status: def.status },\n newState: { status: \"archived\" },\n });\n\n return { success: true };\n },\n});\n\n/**\n * Create a new version snapshot for an ontology.\n */\nexport const createOntologyVersion = mutation({\n args: {\n ontologyId: v.id(\"ontologyDefinitions\"),\n version: v.string(),\n entityTypes: v.array(\n v.object({\n value: v.string(),\n label: v.string(),\n description: v.optional(v.string()),\n schema: v.optional(v.any()),\n subtypes: v.optional(\n v.array(\n v.object({\n value: v.string(),\n label: v.string(),\n description: v.optional(v.string()),\n })\n )\n ),\n })\n ),\n edgeTypes: v.array(\n v.object({\n value: v.string(),\n label: v.string(),\n description: v.optional(v.string()),\n sourceTypes: v.optional(v.array(v.string())),\n targetTypes: v.optional(v.array(v.string())),\n constraintSeverity: v.optional(\n v.union(v.literal(\"warn\"), v.literal(\"info\"))\n ),\n })\n ),\n releaseNotes: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const userId = await requireAuth(ctx);\n\n // Validate version string\n if (!validateVersionString(args.version)) {\n throw new Error(\n `Invalid version string \"${args.version}\". Must be in X.Y.Z format.`\n );\n }\n\n // Validate parent definition exists\n const def = await ctx.db.get(args.ontologyId);\n if (!def) {\n throw new Error(\"Ontology definition not found.\");\n }\n\n if (def.status === \"archived\") {\n throw new Error(\"Cannot add versions to an archived ontology.\");\n }\n\n // Check version uniqueness\n const existing = await ctx.db\n .query(\"ontologyVersions\")\n .withIndex(\"by_ontologyKey_version\", (q) =>\n q.eq(\"ontologyKey\", def.ontologyKey).eq(\"version\", args.version)\n )\n .first();\n\n if (existing) {\n throw new Error(\n `Version \"${args.version}\" already exists for ontology \"${def.ontologyKey}\".`\n );\n }\n\n const now = Date.now();\n const id = await ctx.db.insert(\"ontologyVersions\", {\n ontologyId: args.ontologyId,\n ontologyKey: def.ontologyKey,\n version: args.version,\n status: \"draft\",\n entityTypes: args.entityTypes,\n edgeTypes: args.edgeTypes,\n releaseNotes: args.releaseNotes,\n createdAt: now,\n });\n\n await logAudit(ctx, {\n entityType: \"ontologyVersion\",\n entityId: id,\n changeType: \"created\",\n changedBy: userId,\n previousState: null,\n newState: {\n ontologyKey: def.ontologyKey,\n version: args.version,\n entityTypeCount: args.entityTypes.length,\n edgeTypeCount: args.edgeTypes.length,\n },\n });\n\n return { id, version: args.version };\n },\n});\n\n/**\n * Update a draft version (entityTypes, edgeTypes, releaseNotes).\n * Only allowed while version is in \"draft\" status.\n */\nexport const updateDraftVersion = mutation({\n args: {\n id: v.id(\"ontologyVersions\"),\n entityTypes: v.optional(\n v.array(\n v.object({\n value: v.string(),\n label: v.string(),\n description: v.optional(v.string()),\n schema: v.optional(v.any()),\n subtypes: v.optional(\n v.array(\n v.object({\n value: v.string(),\n label: v.string(),\n description: v.optional(v.string()),\n })\n )\n ),\n })\n )\n ),\n edgeTypes: v.optional(\n v.array(\n v.object({\n value: v.string(),\n label: v.string(),\n description: v.optional(v.string()),\n sourceTypes: v.optional(v.array(v.string())),\n targetTypes: v.optional(v.array(v.string())),\n constraintSeverity: v.optional(\n v.union(v.literal(\"warn\"), v.literal(\"info\"))\n ),\n })\n )\n ),\n releaseNotes: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const userId = await requireAuth(ctx);\n\n const ver = await ctx.db.get(args.id);\n if (!ver) {\n throw new Error(\"Ontology version not found.\");\n }\n\n if (ver.status !== \"draft\") {\n throw new Error(\n `Cannot update a ${ver.status} version. Only draft versions are editable.`\n );\n }\n\n const patch: Record<string, unknown> = {};\n if (args.entityTypes !== undefined) {\n patch.entityTypes = args.entityTypes;\n }\n if (args.edgeTypes !== undefined) {\n patch.edgeTypes = args.edgeTypes;\n }\n if (args.releaseNotes !== undefined) {\n patch.releaseNotes = args.releaseNotes;\n }\n\n await ctx.db.patch(args.id, patch);\n\n await logAudit(ctx, {\n entityType: \"ontologyVersion\",\n entityId: args.id,\n changeType: \"updated\",\n changedBy: userId,\n previousState: { status: ver.status },\n newState: patch,\n });\n\n return { success: true };\n },\n});\n\n/**\n * Publish a version — freezes it (status → \"published\").\n * If the parent definition is \"draft\", promotes it to \"active\".\n */\nexport const publishOntologyVersion = mutation({\n args: {\n id: v.id(\"ontologyVersions\"),\n ontologyId: v.optional(v.id(\"ontologyDefinitions\")),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const userId = await requireAuth(ctx);\n\n const ver = await ctx.db.get(args.id);\n if (!ver) {\n throw new Error(\"Ontology version not found.\");\n }\n\n // Verify ownership if ontologyId provided\n if (args.ontologyId && ver.ontologyId !== args.ontologyId) {\n throw new Error(\n \"Version does not belong to the specified ontology definition.\"\n );\n }\n\n if (ver.status !== \"draft\") {\n throw new Error(\n `Cannot publish a ${ver.status} version. Only draft versions can be published.`\n );\n }\n\n const now = Date.now();\n await ctx.db.patch(args.id, {\n status: \"published\",\n publishedBy: userId,\n publishedAt: now,\n });\n\n // Promote parent definition to \"active\" if still in \"draft\"\n const def = await ctx.db.get(ver.ontologyId);\n if (def && def.status === \"draft\") {\n await ctx.db.patch(ver.ontologyId, {\n status: \"active\",\n updatedAt: now,\n });\n }\n\n await logAudit(ctx, {\n entityType: \"ontologyVersion\",\n entityId: args.id,\n changeType: \"published\",\n changedBy: userId,\n previousState: { status: \"draft\" },\n newState: { status: \"published\", publishedAt: now },\n });\n\n return { success: true, publishedAt: now };\n },\n});\n\n/**\n * Deprecate a published version.\n */\nexport const deprecateOntologyVersion = mutation({\n args: {\n id: v.id(\"ontologyVersions\"),\n ontologyId: v.optional(v.id(\"ontologyDefinitions\")),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const userId = await requireAuth(ctx);\n\n const ver = await ctx.db.get(args.id);\n if (!ver) {\n throw new Error(\"Ontology version not found.\");\n }\n\n // Verify ownership if ontologyId provided\n if (args.ontologyId && ver.ontologyId !== args.ontologyId) {\n throw new Error(\n \"Version does not belong to the specified ontology definition.\"\n );\n }\n\n if (ver.status === \"deprecated\") {\n return { success: true };\n }\n\n if (ver.status !== \"published\") {\n throw new Error(\n `Cannot deprecate a ${ver.status} version. Only published versions can be deprecated.`\n );\n }\n\n await ctx.db.patch(args.id, { status: \"deprecated\" });\n\n await logAudit(ctx, {\n entityType: \"ontologyVersion\",\n entityId: args.id,\n changeType: \"deprecated\",\n changedBy: userId,\n previousState: { status: \"published\" },\n newState: { status: \"deprecated\" },\n });\n\n return { success: true };\n },\n});\n"]}
1
+ {"version":3,"sources":["../src/convex.ts","../src/ontologyHelpers.ts","../src/ontologyDefinitions.ts"],"names":[],"mappings":"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","file":"ontologyDefinitions.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\nexport const action = actionGeneric as any;\nexport const httpAction = httpActionGeneric as any;\nexport const internalAction = internalActionGeneric as any;\nexport const internalMutation = internalMutationGeneric as any;\nexport const internalQuery = internalQueryGeneric as any;\nexport const mutation = mutationGeneric as any;\nexport const query = queryGeneric as any;\n","/**\n * Ontology Definition Pure Helpers\n *\n * Pure functions for ontology key validation, version string validation,\n * layer merging, and soft edge constraint checking.\n *\n * Separated from ontologyDefinitions.ts to enable unit testing without\n * Convex runtime dependencies.\n *\n * @module graph-primitives/ontologyHelpers\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type EntityTypeEntry = {\n value: string;\n label: string;\n description?: string;\n schema?: unknown;\n subtypes?: Array<{ value: string; label: string; description?: string }>;\n};\n\nexport type EdgeTypeEntry = {\n value: string;\n label: string;\n description?: string;\n sourceTypes?: string[];\n targetTypes?: string[];\n constraintSeverity?: \"warn\" | \"info\";\n};\n\nexport type MergedOntology = {\n entityTypes: EntityTypeEntry[];\n edgeTypes: EdgeTypeEntry[];\n layers: string[]; // ontologyKeys in composition order\n};\n\nexport type EdgeConstraintResult = {\n valid: boolean;\n warnings: string[];\n};\n\n// =============================================================================\n// PURE HELPER FUNCTIONS\n// =============================================================================\n\nconst ONTOLOGY_KEY_REGEX = /^[a-z][a-z0-9-]*[a-z0-9]$/;\nconst VERSION_STRING_REGEX = /^\\d+\\.\\d+\\.\\d+$/;\n\n/**\n * Validate and normalize an ontology key.\n * Must be lowercase alphanumeric with hyphens, 2+ chars.\n */\nexport function validateOntologyKey(key: string): {\n valid: boolean;\n normalized: string;\n error?: string;\n} {\n const normalized = key.trim().toLowerCase();\n if (normalized.length < 2) {\n return {\n valid: false,\n normalized,\n error: \"Ontology key must be at least 2 characters.\",\n };\n }\n if (normalized.length > 64) {\n return {\n valid: false,\n normalized,\n error: \"Ontology key must be at most 64 characters.\",\n };\n }\n if (!ONTOLOGY_KEY_REGEX.test(normalized)) {\n return {\n valid: false,\n normalized,\n error:\n \"Ontology key must start with a letter, contain only lowercase letters, digits, and hyphens, and not end with a hyphen.\",\n };\n }\n return { valid: true, normalized };\n}\n\n/**\n * Validate a version string (basic semver-like format).\n * Accepts \"X.Y.Z\" where X, Y, Z are non-negative integers.\n */\nexport const validateVersionString = VERSION_STRING_REGEX.test.bind(\n VERSION_STRING_REGEX\n) as (version: string) => boolean;\n\n/**\n * Merge ontology layers additively. Child adds to parent; never removes.\n * Duplicate entity/edge values in child override parent entries.\n */\nexport function mergeOntologyLayers(\n parent: { entityTypes: EntityTypeEntry[]; edgeTypes: EdgeTypeEntry[] },\n child: { entityTypes: EntityTypeEntry[]; edgeTypes: EdgeTypeEntry[] },\n parentKey: string,\n childKey: string\n): MergedOntology {\n // Entity types: child overrides parent by value\n const entityMap = new Map<string, EntityTypeEntry>();\n for (const et of parent.entityTypes) {\n entityMap.set(et.value, et);\n }\n for (const et of child.entityTypes) {\n entityMap.set(et.value, et);\n }\n\n // Edge types: child overrides parent by value\n const edgeMap = new Map<string, EdgeTypeEntry>();\n for (const edge of parent.edgeTypes) {\n edgeMap.set(edge.value, edge);\n }\n for (const edge of child.edgeTypes) {\n edgeMap.set(edge.value, edge);\n }\n\n return {\n entityTypes: Array.from(entityMap.values()),\n edgeTypes: Array.from(edgeMap.values()),\n layers: [parentKey, childKey],\n };\n}\n\n/**\n * Validate an edge against soft constraints.\n * Returns warnings but never blocks (soft constraint model).\n */\nexport function validateEdgeConstraint(\n edge: { sourceType: string; targetType: string; edgeType: string },\n constraints: EdgeTypeEntry | undefined\n): EdgeConstraintResult {\n if (!constraints) {\n return { valid: true, warnings: [] };\n }\n\n const warnings: string[] = [];\n\n if (\n constraints.sourceTypes &&\n constraints.sourceTypes.length > 0 &&\n !constraints.sourceTypes.includes(edge.sourceType)\n ) {\n warnings.push(\n `Edge type \"${edge.edgeType}\" recommends source types [${constraints.sourceTypes.join(\", \")}] but got \"${edge.sourceType}\".`\n );\n }\n\n if (\n constraints.targetTypes &&\n constraints.targetTypes.length > 0 &&\n !constraints.targetTypes.includes(edge.targetType)\n ) {\n warnings.push(\n `Edge type \"${edge.edgeType}\" recommends target types [${constraints.targetTypes.join(\", \")}] but got \"${edge.targetType}\".`\n );\n }\n\n // Soft constraints: always valid, just warn\n return { valid: true, warnings };\n}\n\n/**\n * Resolve effective tier from definition tier and tenantId.\n */\nexport function resolveEffectiveTier(\n defTier: \"platform\" | \"pack\" | \"tenant\",\n tenantId?: string\n): \"platform\" | \"pack\" | \"tenant\" {\n if (!tenantId) {\n return \"platform\";\n }\n if (defTier === \"platform\") {\n return \"platform\";\n }\n return defTier;\n}\n","/**\n * Ontology Definition Mutations & Queries\n *\n * CRUD operations for first-class ontology definition objects.\n * Follows the packDefinitions + packVersions two-table pattern from Master Control.\n *\n * Pure helper functions live in ontologyHelpers.ts for unit testing.\n *\n * @module graph-primitives/ontologyDefinitions\n */\n\nimport { v } from \"convex/values\";\nimport { getCurrentUserId } from \"@lucern/access-control/auth\";\nimport { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\nimport type { Id, MutationCtx, QueryCtx } from \"./convex\";\nimport { mutation, query } from \"./convex\";\nimport type {\n EdgeTypeEntry,\n EntityTypeEntry,\n MergedOntology,\n} from \"./ontologyHelpers\";\nimport {\n mergeOntologyLayers,\n validateOntologyKey,\n validateVersionString,\n} from \"./ontologyHelpers\";\n\n// =============================================================================\n// AUTH HELPER\n// =============================================================================\n\nasync function requireAuth(ctx: MutationCtx): Promise<string> {\n const userId = await getCurrentUserId(ctx as any);\n if (!userId) {\n throw new Error(\"Authentication required.\");\n }\n return userId;\n}\n\nasync function _requireAuthQuery(ctx: QueryCtx): Promise<string> {\n const userId = await getCurrentUserId(ctx as any);\n if (!userId) {\n throw new Error(\"Authentication required.\");\n }\n return userId;\n}\n\n// =============================================================================\n// AUDIT HELPER\n// =============================================================================\n\ntype AuditEntityType = \"ontologyDefinition\" | \"ontologyVersion\";\ntype AuditChangeType =\n | \"created\"\n | \"updated\"\n | \"archived\"\n | \"published\"\n | \"deprecated\";\n\nasync function logAudit(\n ctx: MutationCtx,\n args: {\n entityType: AuditEntityType;\n entityId: string;\n changeType: AuditChangeType;\n changedBy: string;\n previousState: unknown;\n newState: unknown;\n }\n) {\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: args.entityType,\n entityId: args.entityId,\n changeType: args.changeType,\n changedAt: Date.now(),\n changedBy: args.changedBy,\n isAgent: false,\n previousState: args.previousState ?? null,\n newState: args.newState ?? null,\n });\n}\n\n// =============================================================================\n// QUERIES\n// =============================================================================\n\n/**\n * Get an ontology definition by ID.\n */\nexport const getOntologyDefinition = query({\n args: { id: v.id(\"ontologyDefinitions\") },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n return await ctx.db.get(args.id);\n },\n});\n\n/**\n * Get an ontology definition by ontologyKey (optionally scoped by tenant).\n */\nexport const getOntologyDefinitionByKey = query({\n args: {\n ontologyKey: v.string(),\n tenantId: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n if (args.tenantId) {\n return await ctx.db\n .query(\"ontologyDefinitions\")\n .withIndex(\"by_tenant_ontologyKey\", (q) =>\n q.eq(\"tenantId\", args.tenantId).eq(\"ontologyKey\", args.ontologyKey)\n )\n .first();\n }\n // Platform default (tenantId = undefined)\n return await ctx.db\n .query(\"ontologyDefinitions\")\n .withIndex(\"by_tenant_ontologyKey\", (q) =>\n q.eq(\"tenantId\", undefined).eq(\"ontologyKey\", args.ontologyKey)\n )\n .first();\n },\n});\n\n/**\n * List ontology definitions with optional filters.\n */\nexport const listOntologyDefinitions = query({\n args: {\n tenantId: v.optional(v.string()),\n tier: v.optional(\n v.union(v.literal(\"platform\"), v.literal(\"pack\"), v.literal(\"tenant\"))\n ),\n status: v.optional(\n v.union(\n v.literal(\"draft\"),\n v.literal(\"active\"),\n v.literal(\"deprecated\"),\n v.literal(\"archived\")\n )\n ),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n if (args.tenantId && args.status) {\n const status = args.status;\n return await ctx.db\n .query(\"ontologyDefinitions\")\n .withIndex(\"by_tenant_status\", (q) =>\n q.eq(\"tenantId\", args.tenantId).eq(\"status\", status)\n )\n .collect();\n }\n if (args.status) {\n const status = args.status;\n return await ctx.db\n .query(\"ontologyDefinitions\")\n .withIndex(\"by_status\", (q) => q.eq(\"status\", status))\n .collect();\n }\n if (args.tier) {\n const tier = args.tier;\n return await ctx.db\n .query(\"ontologyDefinitions\")\n .withIndex(\"by_tier\", (q) => q.eq(\"tier\", tier))\n .collect();\n }\n return await ctx.db.query(\"ontologyDefinitions\").collect();\n },\n});\n\n/**\n * Get a specific version by ontologyId + version string.\n */\nexport const getOntologyVersion = query({\n args: {\n ontologyKey: v.string(),\n version: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n return await ctx.db\n .query(\"ontologyVersions\")\n .withIndex(\"by_ontologyKey_version\", (q) =>\n q.eq(\"ontologyKey\", args.ontologyKey).eq(\"version\", args.version)\n )\n .first();\n },\n});\n\n/**\n * List versions for an ontology, optionally filtered by status.\n */\nexport const listOntologyVersions = query({\n args: {\n ontologyId: v.id(\"ontologyDefinitions\"),\n status: v.optional(\n v.union(\n v.literal(\"draft\"),\n v.literal(\"published\"),\n v.literal(\"deprecated\")\n )\n ),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const all = await ctx.db\n .query(\"ontologyVersions\")\n .withIndex(\"by_ontologyId\", (q) => q.eq(\"ontologyId\", args.ontologyId))\n .collect();\n\n if (args.status) {\n return all.filter((versionDoc) => versionDoc.status === args.status);\n }\n return all;\n },\n});\n\n/**\n * Get the latest published version for an ontology.\n */\nexport const getPublishedVersion = query({\n args: { ontologyId: v.id(\"ontologyDefinitions\") },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const published = await ctx.db\n .query(\"ontologyVersions\")\n .withIndex(\"by_ontologyId\", (q) => q.eq(\"ontologyId\", args.ontologyId))\n .collect();\n\n const publishedOnly = published.filter(\n (versionDoc) => versionDoc.status === \"published\"\n );\n if (publishedOnly.length === 0) {\n return null;\n }\n\n // Return most recently published\n publishedOnly.sort((a, b) => (b.publishedAt ?? 0) - (a.publishedAt ?? 0));\n return publishedOnly[0];\n },\n});\n\n/**\n * Resolve the effective ontology by composing parent chain.\n * Walks parentOntologyId chain (max depth 3) and merges additively.\n */\nexport const resolveEffectiveOntology = query({\n args: { ontologyId: v.id(\"ontologyDefinitions\") },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const MAX_DEPTH = 3;\n type OntologyDef = {\n ontologyKey: string;\n parentOntologyId?: Id<\"ontologyDefinitions\">;\n };\n type OntologyVer = {\n status: string;\n publishedAt?: number;\n entityTypes: unknown;\n edgeTypes: unknown;\n };\n const chain: Array<{ def: OntologyDef; version: OntologyVer | null }> = [];\n\n // Walk parent chain\n let currentId: Id<\"ontologyDefinitions\"> | undefined = args.ontologyId;\n for (let depth = 0; depth < MAX_DEPTH && currentId; depth++) {\n const ontologyId = currentId;\n const def = await ctx.db.get(ontologyId);\n if (!def) {\n break;\n }\n const defTyped = def as unknown as OntologyDef & {\n _id: Id<\"ontologyDefinitions\">;\n };\n\n // Get latest published version\n const versions = await ctx.db\n .query(\"ontologyVersions\")\n .withIndex(\"by_ontologyId\", (q) => q.eq(\"ontologyId\", ontologyId))\n .collect();\n const published = versions\n .filter((ver) => ver.status === \"published\")\n .sort(\n (a, b) =>\n ((b.publishedAt as number) ?? 0) - ((a.publishedAt as number) ?? 0)\n );\n\n chain.unshift({\n def: defTyped,\n version: (published[0] as OntologyVer) ?? null,\n });\n currentId = defTyped.parentOntologyId;\n }\n\n if (chain.length === 0) {\n return null;\n }\n\n // Merge layers from root (platform) to leaf (tenant)\n let merged: MergedOntology = {\n entityTypes: [],\n edgeTypes: [],\n layers: [],\n };\n\n for (const { def, version } of chain) {\n if (!version) {\n merged.layers.push(def.ontologyKey);\n continue;\n }\n const previousLayerKey = merged.layers.at(-1) ?? def.ontologyKey;\n merged = mergeOntologyLayers(\n merged,\n {\n entityTypes: version.entityTypes as EntityTypeEntry[],\n edgeTypes: version.edgeTypes as EdgeTypeEntry[],\n },\n previousLayerKey,\n def.ontologyKey\n );\n }\n\n return merged;\n },\n});\n\n// =============================================================================\n// MUTATIONS\n// =============================================================================\n\n/**\n * Create a new ontology definition.\n */\nexport const createOntologyDefinition = mutation({\n args: {\n ontologyKey: v.string(),\n name: v.string(),\n description: v.optional(v.string()),\n tenantId: v.optional(v.string()),\n tier: v.union(\n v.literal(\"platform\"),\n v.literal(\"pack\"),\n v.literal(\"tenant\")\n ),\n parentOntologyId: v.optional(v.id(\"ontologyDefinitions\")),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const userId = await requireAuth(ctx);\n\n // Validate ontology key\n const keyResult = validateOntologyKey(args.ontologyKey);\n if (!keyResult.valid) {\n throw new Error(keyResult.error ?? \"Invalid ontology key\");\n }\n\n // Check uniqueness within tenant scope\n const existing = await ctx.db\n .query(\"ontologyDefinitions\")\n .withIndex(\"by_tenant_ontologyKey\", (q) =>\n q.eq(\"tenantId\", args.tenantId).eq(\"ontologyKey\", keyResult.normalized)\n )\n .first();\n\n if (existing) {\n throw new Error(\n `Ontology \"${keyResult.normalized}\" already exists for tenant ${args.tenantId ?? \"(platform)\"}.`\n );\n }\n\n // Validate parent exists if specified\n if (args.parentOntologyId) {\n const parent = await ctx.db.get(args.parentOntologyId);\n if (!parent) {\n throw new Error(\"Parent ontology definition not found.\");\n }\n }\n\n const now = Date.now();\n const id = await ctx.db.insert(\"ontologyDefinitions\", {\n ontologyKey: keyResult.normalized,\n name: args.name,\n description: args.description,\n tenantId: args.tenantId,\n tier: args.tier,\n parentOntologyId: args.parentOntologyId,\n status: \"draft\",\n createdBy: userId,\n createdAt: now,\n updatedAt: now,\n });\n\n await logAudit(ctx, {\n entityType: \"ontologyDefinition\",\n entityId: id,\n changeType: \"created\",\n changedBy: userId,\n previousState: null,\n newState: {\n ontologyKey: keyResult.normalized,\n name: args.name,\n tier: args.tier,\n },\n });\n\n return { id, ontologyKey: keyResult.normalized };\n },\n});\n\n/**\n * Update an ontology definition (name, description, status).\n * Only allowed while draft or active.\n */\nexport const updateOntologyDefinition = mutation({\n args: {\n id: v.id(\"ontologyDefinitions\"),\n name: v.optional(v.string()),\n description: v.optional(v.string()),\n status: v.optional(\n v.union(v.literal(\"draft\"), v.literal(\"active\"), v.literal(\"deprecated\"))\n ),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const userId = await requireAuth(ctx);\n\n const def = await ctx.db.get(args.id);\n if (!def) {\n throw new Error(\"Ontology definition not found.\");\n }\n\n if (def.status === \"archived\") {\n throw new Error(\"Cannot update an archived ontology definition.\");\n }\n\n const previousState = {\n name: def.name,\n description: def.description,\n status: def.status,\n };\n\n const patch: Record<string, unknown> = { updatedAt: Date.now() };\n if (args.name !== undefined) {\n patch.name = args.name;\n }\n if (args.description !== undefined) {\n patch.description = args.description;\n }\n if (args.status !== undefined) {\n patch.status = args.status;\n }\n\n await ctx.db.patch(args.id, patch);\n\n await logAudit(ctx, {\n entityType: \"ontologyDefinition\",\n entityId: args.id,\n changeType: \"updated\",\n changedBy: userId,\n previousState,\n newState: patch,\n });\n\n return { success: true };\n },\n});\n\n/**\n * Archive an ontology definition.\n */\nexport const archiveOntologyDefinition = mutation({\n args: { id: v.id(\"ontologyDefinitions\") },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const userId = await requireAuth(ctx);\n\n const def = await ctx.db.get(args.id);\n if (!def) {\n throw new Error(\"Ontology definition not found.\");\n }\n\n if (def.status === \"archived\") {\n return { success: true };\n }\n\n await ctx.db.patch(args.id, { status: \"archived\", updatedAt: Date.now() });\n\n await logAudit(ctx, {\n entityType: \"ontologyDefinition\",\n entityId: args.id,\n changeType: \"archived\",\n changedBy: userId,\n previousState: { status: def.status },\n newState: { status: \"archived\" },\n });\n\n return { success: true };\n },\n});\n\n/**\n * Create a new version snapshot for an ontology.\n */\nexport const createOntologyVersion = mutation({\n args: {\n ontologyId: v.id(\"ontologyDefinitions\"),\n version: v.string(),\n entityTypes: v.array(\n v.object({\n value: v.string(),\n label: v.string(),\n description: v.optional(v.string()),\n schema: v.optional(v.any()),\n subtypes: v.optional(\n v.array(\n v.object({\n value: v.string(),\n label: v.string(),\n description: v.optional(v.string()),\n })\n )\n ),\n })\n ),\n edgeTypes: v.array(\n v.object({\n value: v.string(),\n label: v.string(),\n description: v.optional(v.string()),\n sourceTypes: v.optional(v.array(v.string())),\n targetTypes: v.optional(v.array(v.string())),\n constraintSeverity: v.optional(\n v.union(v.literal(\"warn\"), v.literal(\"info\"))\n ),\n })\n ),\n releaseNotes: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const userId = await requireAuth(ctx);\n\n // Validate version string\n if (!validateVersionString(args.version)) {\n throw new Error(\n `Invalid version string \"${args.version}\". Must be in X.Y.Z format.`\n );\n }\n\n // Validate parent definition exists\n const def = await ctx.db.get(args.ontologyId);\n if (!def) {\n throw new Error(\"Ontology definition not found.\");\n }\n\n if (def.status === \"archived\") {\n throw new Error(\"Cannot add versions to an archived ontology.\");\n }\n\n // Check version uniqueness\n const existing = await ctx.db\n .query(\"ontologyVersions\")\n .withIndex(\"by_ontologyKey_version\", (q) =>\n q.eq(\"ontologyKey\", def.ontologyKey).eq(\"version\", args.version)\n )\n .first();\n\n if (existing) {\n throw new Error(\n `Version \"${args.version}\" already exists for ontology \"${def.ontologyKey}\".`\n );\n }\n\n const now = Date.now();\n const id = await ctx.db.insert(\"ontologyVersions\", {\n ontologyId: args.ontologyId,\n ontologyKey: def.ontologyKey,\n version: args.version,\n status: \"draft\",\n entityTypes: args.entityTypes,\n edgeTypes: args.edgeTypes,\n releaseNotes: args.releaseNotes,\n createdAt: now,\n });\n\n await logAudit(ctx, {\n entityType: \"ontologyVersion\",\n entityId: id,\n changeType: \"created\",\n changedBy: userId,\n previousState: null,\n newState: {\n ontologyKey: def.ontologyKey,\n version: args.version,\n entityTypeCount: args.entityTypes.length,\n edgeTypeCount: args.edgeTypes.length,\n },\n });\n\n return { id, version: args.version };\n },\n});\n\n/**\n * Update a draft version (entityTypes, edgeTypes, releaseNotes).\n * Only allowed while version is in \"draft\" status.\n */\nexport const updateDraftVersion = mutation({\n args: {\n id: v.id(\"ontologyVersions\"),\n entityTypes: v.optional(\n v.array(\n v.object({\n value: v.string(),\n label: v.string(),\n description: v.optional(v.string()),\n schema: v.optional(v.any()),\n subtypes: v.optional(\n v.array(\n v.object({\n value: v.string(),\n label: v.string(),\n description: v.optional(v.string()),\n })\n )\n ),\n })\n )\n ),\n edgeTypes: v.optional(\n v.array(\n v.object({\n value: v.string(),\n label: v.string(),\n description: v.optional(v.string()),\n sourceTypes: v.optional(v.array(v.string())),\n targetTypes: v.optional(v.array(v.string())),\n constraintSeverity: v.optional(\n v.union(v.literal(\"warn\"), v.literal(\"info\"))\n ),\n })\n )\n ),\n releaseNotes: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const userId = await requireAuth(ctx);\n\n const ver = await ctx.db.get(args.id);\n if (!ver) {\n throw new Error(\"Ontology version not found.\");\n }\n\n if (ver.status !== \"draft\") {\n throw new Error(\n `Cannot update a ${ver.status} version. Only draft versions are editable.`\n );\n }\n\n const patch: Record<string, unknown> = {};\n if (args.entityTypes !== undefined) {\n patch.entityTypes = args.entityTypes;\n }\n if (args.edgeTypes !== undefined) {\n patch.edgeTypes = args.edgeTypes;\n }\n if (args.releaseNotes !== undefined) {\n patch.releaseNotes = args.releaseNotes;\n }\n\n await ctx.db.patch(args.id, patch);\n\n await logAudit(ctx, {\n entityType: \"ontologyVersion\",\n entityId: args.id,\n changeType: \"updated\",\n changedBy: userId,\n previousState: { status: ver.status },\n newState: patch,\n });\n\n return { success: true };\n },\n});\n\n/**\n * Publish a version — freezes it (status → \"published\").\n * If the parent definition is \"draft\", promotes it to \"active\".\n */\nexport const publishOntologyVersion = mutation({\n args: {\n id: v.id(\"ontologyVersions\"),\n ontologyId: v.optional(v.id(\"ontologyDefinitions\")),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const userId = await requireAuth(ctx);\n\n const ver = await ctx.db.get(args.id);\n if (!ver) {\n throw new Error(\"Ontology version not found.\");\n }\n\n // Verify ownership if ontologyId provided\n if (args.ontologyId && ver.ontologyId !== args.ontologyId) {\n throw new Error(\n \"Version does not belong to the specified ontology definition.\"\n );\n }\n\n if (ver.status !== \"draft\") {\n throw new Error(\n `Cannot publish a ${ver.status} version. Only draft versions can be published.`\n );\n }\n\n const now = Date.now();\n await ctx.db.patch(args.id, {\n status: \"published\",\n publishedBy: userId,\n publishedAt: now,\n });\n\n // Promote parent definition to \"active\" if still in \"draft\"\n const def = await ctx.db.get(ver.ontologyId);\n if (def && def.status === \"draft\") {\n await ctx.db.patch(ver.ontologyId, {\n status: \"active\",\n updatedAt: now,\n });\n }\n\n await logAudit(ctx, {\n entityType: \"ontologyVersion\",\n entityId: args.id,\n changeType: \"published\",\n changedBy: userId,\n previousState: { status: \"draft\" },\n newState: { status: \"published\", publishedAt: now },\n });\n\n return { success: true, publishedAt: now };\n },\n});\n\n/**\n * Deprecate a published version.\n */\nexport const deprecateOntologyVersion = mutation({\n args: {\n id: v.id(\"ontologyVersions\"),\n ontologyId: v.optional(v.id(\"ontologyDefinitions\")),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const userId = await requireAuth(ctx);\n\n const ver = await ctx.db.get(args.id);\n if (!ver) {\n throw new Error(\"Ontology version not found.\");\n }\n\n // Verify ownership if ontologyId provided\n if (args.ontologyId && ver.ontologyId !== args.ontologyId) {\n throw new Error(\n \"Version does not belong to the specified ontology definition.\"\n );\n }\n\n if (ver.status === \"deprecated\") {\n return { success: true };\n }\n\n if (ver.status !== \"published\") {\n throw new Error(\n `Cannot deprecate a ${ver.status} version. Only published versions can be deprecated.`\n );\n }\n\n await ctx.db.patch(args.id, { status: \"deprecated\" });\n\n await logAudit(ctx, {\n entityType: \"ontologyVersion\",\n entityId: args.id,\n changeType: \"deprecated\",\n changedBy: userId,\n previousState: { status: \"published\" },\n newState: { status: \"deprecated\" },\n });\n\n return { success: true };\n },\n});\n"]}
@@ -50,7 +50,7 @@ declare function validateOntologyKey(key: string): {
50
50
  * Validate a version string (basic semver-like format).
51
51
  * Accepts "X.Y.Z" where X, Y, Z are non-negative integers.
52
52
  */
53
- declare function validateVersionString(version: string): boolean;
53
+ declare const validateVersionString: (version: string) => boolean;
54
54
  /**
55
55
  * Merge ontology layers additively. Child adds to parent; never removes.
56
56
  * Duplicate entity/edge values in child override parent entries.
@@ -1,5 +1,6 @@
1
1
  // src/ontologyHelpers.ts
2
2
  var ONTOLOGY_KEY_REGEX = /^[a-z][a-z0-9-]*[a-z0-9]$/;
3
+ var VERSION_STRING_REGEX = /^\d+\.\d+\.\d+$/;
3
4
  function validateOntologyKey(key) {
4
5
  const normalized = key.trim().toLowerCase();
5
6
  if (normalized.length < 2) {
@@ -25,9 +26,9 @@ function validateOntologyKey(key) {
25
26
  }
26
27
  return { valid: true, normalized };
27
28
  }
28
- function validateVersionString(version) {
29
- return /^\d+\.\d+\.\d+$/.test(version);
30
- }
29
+ var validateVersionString = VERSION_STRING_REGEX.test.bind(
30
+ VERSION_STRING_REGEX
31
+ );
31
32
  function mergeOntologyLayers(parent, child, parentKey, childKey) {
32
33
  const entityMap = /* @__PURE__ */ new Map();
33
34
  for (const et of parent.entityTypes) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ontologyHelpers.ts"],"names":[],"mappings":";AAgDA,IAAM,kBAAA,GAAqB,2BAAA;AAMpB,SAAS,oBAAoB,GAAA,EAIlC;AACA,EAAA,MAAM,UAAA,GAAa,GAAA,CAAI,IAAA,EAAK,CAAE,WAAA,EAAY;AAC1C,EAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,UAAA;AAAA,MACA,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AACA,EAAA,IAAI,UAAA,CAAW,SAAS,EAAA,EAAI;AAC1B,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,UAAA;AAAA,MACA,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AACA,EAAA,IAAI,CAAC,kBAAA,CAAmB,IAAA,CAAK,UAAU,CAAA,EAAG;AACxC,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,UAAA;AAAA,MACA,KAAA,EACE;AAAA,KACJ;AAAA,EACF;AACA,EAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,UAAA,EAAW;AACnC;AAMO,SAAS,sBAAsB,OAAA,EAA0B;AAC9D,EAAA,OAAO,iBAAA,CAAkB,KAAK,OAAO,CAAA;AACvC;AAMO,SAAS,mBAAA,CACd,MAAA,EACA,KAAA,EACA,SAAA,EACA,QAAA,EACgB;AAEhB,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAA6B;AACnD,EAAA,KAAA,MAAW,EAAA,IAAM,OAAO,WAAA,EAAa;AACnC,IAAA,SAAA,CAAU,GAAA,CAAI,EAAA,CAAG,KAAA,EAAO,EAAE,CAAA;AAAA,EAC5B;AACA,EAAA,KAAA,MAAW,EAAA,IAAM,MAAM,WAAA,EAAa;AAClC,IAAA,SAAA,CAAU,GAAA,CAAI,EAAA,CAAG,KAAA,EAAO,EAAE,CAAA;AAAA,EAC5B;AAGA,EAAA,MAAM,OAAA,uBAAc,GAAA,EAA2B;AAC/C,EAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,SAAA,EAAW;AACnC,IAAA,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,KAAA,EAAO,IAAI,CAAA;AAAA,EAC9B;AACA,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,SAAA,EAAW;AAClC,IAAA,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,KAAA,EAAO,IAAI,CAAA;AAAA,EAC9B;AAEA,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA;AAAA,IAC1C,SAAA,EAAW,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AAAA,IACtC,MAAA,EAAQ,CAAC,SAAA,EAAW,QAAQ;AAAA,GAC9B;AACF;AAMO,SAAS,sBAAA,CACd,MACA,WAAA,EACsB;AACtB,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,QAAA,EAAU,EAAC,EAAE;AAAA,EACrC;AAEA,EAAA,MAAM,WAAqB,EAAC;AAE5B,EAAA,IACE,WAAA,CAAY,WAAA,IACZ,WAAA,CAAY,WAAA,CAAY,MAAA,GAAS,CAAA,IACjC,CAAC,WAAA,CAAY,WAAA,CAAY,QAAA,CAAS,IAAA,CAAK,UAAU,CAAA,EACjD;AACA,IAAA,QAAA,CAAS,IAAA;AAAA,MACP,CAAA,WAAA,EAAc,IAAA,CAAK,QAAQ,CAAA,2BAAA,EAA8B,WAAA,CAAY,WAAA,CAAY,IAAA,CAAK,IAAI,CAAC,CAAA,WAAA,EAAc,IAAA,CAAK,UAAU,CAAA,EAAA;AAAA,KAC1H;AAAA,EACF;AAEA,EAAA,IACE,WAAA,CAAY,WAAA,IACZ,WAAA,CAAY,WAAA,CAAY,MAAA,GAAS,CAAA,IACjC,CAAC,WAAA,CAAY,WAAA,CAAY,QAAA,CAAS,IAAA,CAAK,UAAU,CAAA,EACjD;AACA,IAAA,QAAA,CAAS,IAAA;AAAA,MACP,CAAA,WAAA,EAAc,IAAA,CAAK,QAAQ,CAAA,2BAAA,EAA8B,WAAA,CAAY,WAAA,CAAY,IAAA,CAAK,IAAI,CAAC,CAAA,WAAA,EAAc,IAAA,CAAK,UAAU,CAAA,EAAA;AAAA,KAC1H;AAAA,EACF;AAGA,EAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,QAAA,EAAS;AACjC;AAKO,SAAS,oBAAA,CACd,SACA,QAAA,EACgC;AAChC,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,UAAA;AAAA,EACT;AACA,EAAA,IAAI,YAAY,UAAA,EAAY;AAC1B,IAAA,OAAO,UAAA;AAAA,EACT;AACA,EAAA,OAAO,OAAA;AACT","file":"ontologyHelpers.js","sourcesContent":["/**\n * Ontology Definition Pure Helpers\n *\n * Pure functions for ontology key validation, version string validation,\n * layer merging, and soft edge constraint checking.\n *\n * Separated from ontologyDefinitions.ts to enable unit testing without\n * Convex runtime dependencies.\n *\n * @module graph-primitives/ontologyHelpers\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type EntityTypeEntry = {\n value: string;\n label: string;\n description?: string;\n schema?: unknown;\n subtypes?: Array<{ value: string; label: string; description?: string }>;\n};\n\nexport type EdgeTypeEntry = {\n value: string;\n label: string;\n description?: string;\n sourceTypes?: string[];\n targetTypes?: string[];\n constraintSeverity?: \"warn\" | \"info\";\n};\n\nexport type MergedOntology = {\n entityTypes: EntityTypeEntry[];\n edgeTypes: EdgeTypeEntry[];\n layers: string[]; // ontologyKeys in composition order\n};\n\nexport type EdgeConstraintResult = {\n valid: boolean;\n warnings: string[];\n};\n\n// =============================================================================\n// PURE HELPER FUNCTIONS\n// =============================================================================\n\nconst ONTOLOGY_KEY_REGEX = /^[a-z][a-z0-9-]*[a-z0-9]$/;\n\n/**\n * Validate and normalize an ontology key.\n * Must be lowercase alphanumeric with hyphens, 2+ chars.\n */\nexport function validateOntologyKey(key: string): {\n valid: boolean;\n normalized: string;\n error?: string;\n} {\n const normalized = key.trim().toLowerCase();\n if (normalized.length < 2) {\n return {\n valid: false,\n normalized,\n error: \"Ontology key must be at least 2 characters.\",\n };\n }\n if (normalized.length > 64) {\n return {\n valid: false,\n normalized,\n error: \"Ontology key must be at most 64 characters.\",\n };\n }\n if (!ONTOLOGY_KEY_REGEX.test(normalized)) {\n return {\n valid: false,\n normalized,\n error:\n \"Ontology key must start with a letter, contain only lowercase letters, digits, and hyphens, and not end with a hyphen.\",\n };\n }\n return { valid: true, normalized };\n}\n\n/**\n * Validate a version string (basic semver-like format).\n * Accepts \"X.Y.Z\" where X, Y, Z are non-negative integers.\n */\nexport function validateVersionString(version: string): boolean {\n return /^\\d+\\.\\d+\\.\\d+$/.test(version);\n}\n\n/**\n * Merge ontology layers additively. Child adds to parent; never removes.\n * Duplicate entity/edge values in child override parent entries.\n */\nexport function mergeOntologyLayers(\n parent: { entityTypes: EntityTypeEntry[]; edgeTypes: EdgeTypeEntry[] },\n child: { entityTypes: EntityTypeEntry[]; edgeTypes: EdgeTypeEntry[] },\n parentKey: string,\n childKey: string\n): MergedOntology {\n // Entity types: child overrides parent by value\n const entityMap = new Map<string, EntityTypeEntry>();\n for (const et of parent.entityTypes) {\n entityMap.set(et.value, et);\n }\n for (const et of child.entityTypes) {\n entityMap.set(et.value, et);\n }\n\n // Edge types: child overrides parent by value\n const edgeMap = new Map<string, EdgeTypeEntry>();\n for (const edge of parent.edgeTypes) {\n edgeMap.set(edge.value, edge);\n }\n for (const edge of child.edgeTypes) {\n edgeMap.set(edge.value, edge);\n }\n\n return {\n entityTypes: Array.from(entityMap.values()),\n edgeTypes: Array.from(edgeMap.values()),\n layers: [parentKey, childKey],\n };\n}\n\n/**\n * Validate an edge against soft constraints.\n * Returns warnings but never blocks (soft constraint model).\n */\nexport function validateEdgeConstraint(\n edge: { sourceType: string; targetType: string; edgeType: string },\n constraints: EdgeTypeEntry | undefined\n): EdgeConstraintResult {\n if (!constraints) {\n return { valid: true, warnings: [] };\n }\n\n const warnings: string[] = [];\n\n if (\n constraints.sourceTypes &&\n constraints.sourceTypes.length > 0 &&\n !constraints.sourceTypes.includes(edge.sourceType)\n ) {\n warnings.push(\n `Edge type \"${edge.edgeType}\" recommends source types [${constraints.sourceTypes.join(\", \")}] but got \"${edge.sourceType}\".`\n );\n }\n\n if (\n constraints.targetTypes &&\n constraints.targetTypes.length > 0 &&\n !constraints.targetTypes.includes(edge.targetType)\n ) {\n warnings.push(\n `Edge type \"${edge.edgeType}\" recommends target types [${constraints.targetTypes.join(\", \")}] but got \"${edge.targetType}\".`\n );\n }\n\n // Soft constraints: always valid, just warn\n return { valid: true, warnings };\n}\n\n/**\n * Resolve effective tier from definition tier and tenantId.\n */\nexport function resolveEffectiveTier(\n defTier: \"platform\" | \"pack\" | \"tenant\",\n tenantId?: string\n): \"platform\" | \"pack\" | \"tenant\" {\n if (!tenantId) {\n return \"platform\";\n }\n if (defTier === \"platform\") {\n return \"platform\";\n }\n return defTier;\n}\n"]}
1
+ {"version":3,"sources":["../src/ontologyHelpers.ts"],"names":[],"mappings":"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","file":"ontologyHelpers.js","sourcesContent":["/**\n * Ontology Definition Pure Helpers\n *\n * Pure functions for ontology key validation, version string validation,\n * layer merging, and soft edge constraint checking.\n *\n * Separated from ontologyDefinitions.ts to enable unit testing without\n * Convex runtime dependencies.\n *\n * @module graph-primitives/ontologyHelpers\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type EntityTypeEntry = {\n value: string;\n label: string;\n description?: string;\n schema?: unknown;\n subtypes?: Array<{ value: string; label: string; description?: string }>;\n};\n\nexport type EdgeTypeEntry = {\n value: string;\n label: string;\n description?: string;\n sourceTypes?: string[];\n targetTypes?: string[];\n constraintSeverity?: \"warn\" | \"info\";\n};\n\nexport type MergedOntology = {\n entityTypes: EntityTypeEntry[];\n edgeTypes: EdgeTypeEntry[];\n layers: string[]; // ontologyKeys in composition order\n};\n\nexport type EdgeConstraintResult = {\n valid: boolean;\n warnings: string[];\n};\n\n// =============================================================================\n// PURE HELPER FUNCTIONS\n// =============================================================================\n\nconst ONTOLOGY_KEY_REGEX = /^[a-z][a-z0-9-]*[a-z0-9]$/;\nconst VERSION_STRING_REGEX = /^\\d+\\.\\d+\\.\\d+$/;\n\n/**\n * Validate and normalize an ontology key.\n * Must be lowercase alphanumeric with hyphens, 2+ chars.\n */\nexport function validateOntologyKey(key: string): {\n valid: boolean;\n normalized: string;\n error?: string;\n} {\n const normalized = key.trim().toLowerCase();\n if (normalized.length < 2) {\n return {\n valid: false,\n normalized,\n error: \"Ontology key must be at least 2 characters.\",\n };\n }\n if (normalized.length > 64) {\n return {\n valid: false,\n normalized,\n error: \"Ontology key must be at most 64 characters.\",\n };\n }\n if (!ONTOLOGY_KEY_REGEX.test(normalized)) {\n return {\n valid: false,\n normalized,\n error:\n \"Ontology key must start with a letter, contain only lowercase letters, digits, and hyphens, and not end with a hyphen.\",\n };\n }\n return { valid: true, normalized };\n}\n\n/**\n * Validate a version string (basic semver-like format).\n * Accepts \"X.Y.Z\" where X, Y, Z are non-negative integers.\n */\nexport const validateVersionString = VERSION_STRING_REGEX.test.bind(\n VERSION_STRING_REGEX\n) as (version: string) => boolean;\n\n/**\n * Merge ontology layers additively. Child adds to parent; never removes.\n * Duplicate entity/edge values in child override parent entries.\n */\nexport function mergeOntologyLayers(\n parent: { entityTypes: EntityTypeEntry[]; edgeTypes: EdgeTypeEntry[] },\n child: { entityTypes: EntityTypeEntry[]; edgeTypes: EdgeTypeEntry[] },\n parentKey: string,\n childKey: string\n): MergedOntology {\n // Entity types: child overrides parent by value\n const entityMap = new Map<string, EntityTypeEntry>();\n for (const et of parent.entityTypes) {\n entityMap.set(et.value, et);\n }\n for (const et of child.entityTypes) {\n entityMap.set(et.value, et);\n }\n\n // Edge types: child overrides parent by value\n const edgeMap = new Map<string, EdgeTypeEntry>();\n for (const edge of parent.edgeTypes) {\n edgeMap.set(edge.value, edge);\n }\n for (const edge of child.edgeTypes) {\n edgeMap.set(edge.value, edge);\n }\n\n return {\n entityTypes: Array.from(entityMap.values()),\n edgeTypes: Array.from(edgeMap.values()),\n layers: [parentKey, childKey],\n };\n}\n\n/**\n * Validate an edge against soft constraints.\n * Returns warnings but never blocks (soft constraint model).\n */\nexport function validateEdgeConstraint(\n edge: { sourceType: string; targetType: string; edgeType: string },\n constraints: EdgeTypeEntry | undefined\n): EdgeConstraintResult {\n if (!constraints) {\n return { valid: true, warnings: [] };\n }\n\n const warnings: string[] = [];\n\n if (\n constraints.sourceTypes &&\n constraints.sourceTypes.length > 0 &&\n !constraints.sourceTypes.includes(edge.sourceType)\n ) {\n warnings.push(\n `Edge type \"${edge.edgeType}\" recommends source types [${constraints.sourceTypes.join(\", \")}] but got \"${edge.sourceType}\".`\n );\n }\n\n if (\n constraints.targetTypes &&\n constraints.targetTypes.length > 0 &&\n !constraints.targetTypes.includes(edge.targetType)\n ) {\n warnings.push(\n `Edge type \"${edge.edgeType}\" recommends target types [${constraints.targetTypes.join(\", \")}] but got \"${edge.targetType}\".`\n );\n }\n\n // Soft constraints: always valid, just warn\n return { valid: true, warnings };\n}\n\n/**\n * Resolve effective tier from definition tier and tenantId.\n */\nexport function resolveEffectiveTier(\n defTier: \"platform\" | \"pack\" | \"tenant\",\n tenantId?: string\n): \"platform\" | \"pack\" | \"tenant\" {\n if (!tenantId) {\n return \"platform\";\n }\n if (defTier === \"platform\") {\n return \"platform\";\n }\n return defTier;\n}\n"]}
@@ -17,4 +17,4 @@ declare namespace projectionReconciliation {
17
17
  export { projectionReconciliation_assessProjectionStaleness as assessProjectionStaleness, projectionReconciliation_getProjectionReconciliationStatus as getProjectionReconciliationStatus, projectionReconciliation_getProjectionReconciliationStatusInternal as getProjectionReconciliationStatusInternal, projectionReconciliation_runProjectionRepairCycle as runProjectionRepairCycle };
18
18
  }
19
19
 
20
- export { getProjectionReconciliationStatus as a, assessProjectionStaleness as b, getProjectionReconciliationStatusInternal as g, projectionReconciliation as p, runProjectionRepairCycle as r };
20
+ export { assessProjectionStaleness as a, getProjectionReconciliationStatusInternal as b, getProjectionReconciliationStatus as g, projectionReconciliation as p, runProjectionRepairCycle as r };
@@ -1 +1 @@
1
- export { b as assessProjectionStaleness, a as getProjectionReconciliationStatus, g as getProjectionReconciliationStatusInternal, r as runProjectionRepairCycle } from './projectionReconciliation-CxrXYGaB.js';
1
+ export { a as assessProjectionStaleness, g as getProjectionReconciliationStatus, b as getProjectionReconciliationStatusInternal, r as runProjectionRepairCycle } from './projectionReconciliation-jww2fBI0.js';
@@ -1,7 +1,7 @@
1
1
  import { v } from 'convex/values';
2
2
  import { getCurrentUserId } from '@lucern/access-control/auth';
3
3
  import { permissiveReturn } from '@lucern/contracts/schema-helpers/validators';
4
- import { componentsGeneric, internalQueryGeneric, queryGeneric, internalActionGeneric, anyApi } from 'convex/server';
4
+ import { componentsGeneric, anyApi, internalQueryGeneric, queryGeneric, internalActionGeneric } from 'convex/server';
5
5
 
6
6
  // src/projectionReconciliation.ts
7
7
  componentsGeneric();
@@ -62,9 +62,6 @@ function evaluateProjectionStaleness(input) {
62
62
  }
63
63
 
64
64
  // src/projectionReconciliation.ts
65
- async function collectQueueByStatus(ctx, status) {
66
- return await ctx.db.query("neo4jSyncQueue").withIndex("by_status", (q) => q.eq("status", status)).collect();
67
- }
68
65
  function maxTimestamp(rows, field) {
69
66
  let maxValue;
70
67
  for (const row of rows) {
@@ -93,10 +90,10 @@ function minTimestamp(rows, field) {
93
90
  }
94
91
  async function getQueueSnapshot(ctx) {
95
92
  const [pendingRows, inProgressRows, failedRows, succeededRows] = await Promise.all([
96
- collectQueueByStatus(ctx, "pending"),
97
- collectQueueByStatus(ctx, "in_progress"),
98
- collectQueueByStatus(ctx, "failed"),
99
- collectQueueByStatus(ctx, "succeeded")
93
+ ctx.db.query("neo4jSyncQueue").withIndex("by_status", (q) => q.eq("status", "pending")).collect(),
94
+ ctx.db.query("neo4jSyncQueue").withIndex("by_status", (q) => q.eq("status", "in_progress")).collect(),
95
+ ctx.db.query("neo4jSyncQueue").withIndex("by_status", (q) => q.eq("status", "failed")).collect(),
96
+ ctx.db.query("neo4jSyncQueue").withIndex("by_status", (q) => q.eq("status", "succeeded")).collect()
100
97
  ]);
101
98
  const now = Date.now();
102
99
  const backlogOldestCreatedAt = minTimestamp(
@@ -156,6 +153,13 @@ function buildEndpointAssessments(snapshot) {
156
153
  nonGraph
157
154
  };
158
155
  }
156
+ function buildProjectionReconciliationStatus(snapshot) {
157
+ return {
158
+ ...snapshot,
159
+ endpointAssessments: buildEndpointAssessments(snapshot),
160
+ generatedAt: snapshot.now
161
+ };
162
+ }
159
163
  function assertAuthenticated(clerkId) {
160
164
  if (!clerkId) {
161
165
  throw new Error("Authentication required");
@@ -167,12 +171,7 @@ var getProjectionReconciliationStatusInternal = internalQuery({
167
171
  returns: permissiveReturn,
168
172
  handler: async (ctx) => {
169
173
  const snapshot = await getQueueSnapshot(ctx);
170
- const assessments = buildEndpointAssessments(snapshot);
171
- return {
172
- ...snapshot,
173
- endpointAssessments: assessments,
174
- generatedAt: snapshot.now
175
- };
174
+ return buildProjectionReconciliationStatus(snapshot);
176
175
  }
177
176
  });
178
177
  var getProjectionReconciliationStatus = query({
@@ -181,12 +180,7 @@ var getProjectionReconciliationStatus = query({
181
180
  handler: async (ctx) => {
182
181
  assertAuthenticated(await getCurrentUserId(ctx));
183
182
  const snapshot = await getQueueSnapshot(ctx);
184
- const assessments = buildEndpointAssessments(snapshot);
185
- return {
186
- ...snapshot,
187
- endpointAssessments: assessments,
188
- generatedAt: snapshot.now
189
- };
183
+ return buildProjectionReconciliationStatus(snapshot);
190
184
  }
191
185
  });
192
186
  var assessProjectionStaleness = query({
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/convex.ts","../src/projectionStaleness.ts","../src/projectionReconciliation.ts"],"names":[],"mappings":"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","file":"projectionReconciliation.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\nexport const action = actionGeneric as any;\nexport const httpAction = httpActionGeneric as any;\nexport const internalAction = internalActionGeneric as any;\nexport const internalMutation = internalMutationGeneric as any;\nexport const internalQuery = internalQueryGeneric as any;\nexport const mutation = mutationGeneric as any;\nexport const query = queryGeneric as any;\n","/**\n * projectionStaleness module implementation.\n */\n\nexport type ProjectionEndpointClass =\n | \"analytics\"\n | \"traversal\"\n | \"entity_read\"\n | \"non_graph\";\n\nexport type ProjectionFallbackMode =\n | \"fail_with_503\"\n | \"degrade_to_convex_depth_limited\"\n | \"fallback_to_convex_entity_read\"\n | \"none\";\n\nexport type ProjectionStalenessPolicy = {\n endpointClass: ProjectionEndpointClass;\n thresholdMs: number;\n fallbackMode: ProjectionFallbackMode;\n nonOverridable: true;\n};\n\nexport type ProjectionStalenessInput = {\n endpointClass: ProjectionEndpointClass;\n queueBacklogAgeMs: number;\n queuePendingCount: number;\n queueFailedCount: number;\n nowMs?: number;\n lastSuccessfulSyncAt?: number;\n};\n\nexport type ProjectionStalenessEnvelope = {\n endpointClass: ProjectionEndpointClass;\n stalenessMs: number;\n thresholdMs: number;\n isStale: boolean;\n fallbackMode: ProjectionFallbackMode;\n queuePendingCount: number;\n queueFailedCount: number;\n evaluatedAt: number;\n lastSuccessfulSyncAt?: number;\n lastSuccessfulSyncAgeMs?: number;\n reasonCode:\n | \"PROJECTION_HEALTHY\"\n | \"PROJECTION_STALE\"\n | \"PROJECTION_STALE_WITH_FAILED_RETRIES\";\n};\n\nexport const PROJECTION_STALENESS_POLICIES: Record<\n ProjectionEndpointClass,\n ProjectionStalenessPolicy\n> = {\n analytics: {\n endpointClass: \"analytics\",\n thresholdMs: 30_000,\n fallbackMode: \"fail_with_503\",\n nonOverridable: true,\n },\n traversal: {\n endpointClass: \"traversal\",\n thresholdMs: 60_000,\n fallbackMode: \"degrade_to_convex_depth_limited\",\n nonOverridable: true,\n },\n entity_read: {\n endpointClass: \"entity_read\",\n thresholdMs: 5 * 60_000,\n fallbackMode: \"fallback_to_convex_entity_read\",\n nonOverridable: true,\n },\n non_graph: {\n endpointClass: \"non_graph\",\n thresholdMs: Number.POSITIVE_INFINITY,\n fallbackMode: \"none\",\n nonOverridable: true,\n },\n};\n\nexport function getProjectionStalenessPolicy(\n endpointClass: ProjectionEndpointClass\n): ProjectionStalenessPolicy {\n return PROJECTION_STALENESS_POLICIES[endpointClass];\n}\n\nexport function evaluateProjectionStaleness(\n input: ProjectionStalenessInput\n): ProjectionStalenessEnvelope {\n const policy = getProjectionStalenessPolicy(input.endpointClass);\n const evaluatedAt = input.nowMs ?? Date.now();\n const stalenessMs = Math.max(0, input.queueBacklogAgeMs);\n const isStale = stalenessMs > policy.thresholdMs;\n const lastSuccessfulSyncAgeMs =\n input.lastSuccessfulSyncAt !== undefined\n ? Math.max(0, evaluatedAt - input.lastSuccessfulSyncAt)\n : undefined;\n\n return {\n endpointClass: input.endpointClass,\n stalenessMs,\n thresholdMs: policy.thresholdMs,\n isStale,\n fallbackMode: policy.fallbackMode,\n queuePendingCount: input.queuePendingCount,\n queueFailedCount: input.queueFailedCount,\n evaluatedAt,\n lastSuccessfulSyncAt: input.lastSuccessfulSyncAt,\n lastSuccessfulSyncAgeMs,\n reasonCode: isStale\n ? input.queueFailedCount > 0\n ? \"PROJECTION_STALE_WITH_FAILED_RETRIES\"\n : \"PROJECTION_STALE\"\n : \"PROJECTION_HEALTHY\",\n };\n}\n\nexport function shouldFailClosedForProjection(\n envelope: ProjectionStalenessEnvelope\n): boolean {\n return envelope.isStale && envelope.fallbackMode === \"fail_with_503\";\n}\n","/**\n * Projection Reconciliation Runtime\n *\n * Phase 2 (WT-C) runtime hooks for Convex-authoritative / Neo4j-projected\n * reconciliation health and endpoint-class staleness evaluation.\n */\n\nimport { v } from \"convex/values\";\nimport { getCurrentUserId } from \"@lucern/access-control/auth\";\nimport { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\nimport { internal, internalAction, internalQuery, query } from \"./convex\";\nimport {\n evaluateProjectionStaleness,\n type ProjectionEndpointClass,\n} from \"./projectionStaleness\";\n\ntype QueueStatus = \"pending\" | \"in_progress\" | \"failed\" | \"succeeded\";\n\ntype QueueRow = {\n status: QueueStatus;\n createdAt: number;\n updatedAt: number;\n};\n\nasync function collectQueueByStatus(\n ctx: any,\n status: QueueStatus\n): Promise<QueueRow[]> {\n return await ctx.db\n .query(\"neo4jSyncQueue\")\n .withIndex(\"by_status\", (q: any) => q.eq(\"status\", status))\n .collect();\n}\n\nfunction maxTimestamp(\n rows: QueueRow[],\n field: \"createdAt\" | \"updatedAt\"\n): number | undefined {\n let maxValue: number | undefined;\n for (const row of rows) {\n const value = row[field];\n if (!Number.isFinite(value)) {\n continue;\n }\n if (maxValue === undefined || value > maxValue) {\n maxValue = value;\n }\n }\n return maxValue;\n}\n\nfunction minTimestamp(\n rows: QueueRow[],\n field: \"createdAt\" | \"updatedAt\"\n): number | undefined {\n let minValue: number | undefined;\n for (const row of rows) {\n const value = row[field];\n if (!Number.isFinite(value)) {\n continue;\n }\n if (minValue === undefined || value < minValue) {\n minValue = value;\n }\n }\n return minValue;\n}\n\nasync function getQueueSnapshot(ctx: any) {\n const [pendingRows, inProgressRows, failedRows, succeededRows] =\n await Promise.all([\n collectQueueByStatus(ctx, \"pending\"),\n collectQueueByStatus(ctx, \"in_progress\"),\n collectQueueByStatus(ctx, \"failed\"),\n collectQueueByStatus(ctx, \"succeeded\"),\n ]);\n\n const now = Date.now();\n const backlogOldestCreatedAt = minTimestamp(\n [...pendingRows, ...inProgressRows],\n \"createdAt\"\n );\n const queueBacklogAgeMs =\n backlogOldestCreatedAt !== undefined\n ? Math.max(0, now - backlogOldestCreatedAt)\n : 0;\n const lastSuccessfulSyncAt = maxTimestamp(succeededRows, \"updatedAt\");\n\n return {\n now,\n queuePendingCount: pendingRows.length,\n queueInProgressCount: inProgressRows.length,\n queueFailedCount: failedRows.length,\n queueSucceededCount: succeededRows.length,\n queueBacklogAgeMs,\n backlogOldestCreatedAt,\n lastSuccessfulSyncAt,\n };\n}\n\nfunction buildEndpointAssessments(\n snapshot: Awaited<ReturnType<typeof getQueueSnapshot>>\n) {\n const analytics = evaluateProjectionStaleness({\n endpointClass: \"analytics\",\n queueBacklogAgeMs: snapshot.queueBacklogAgeMs,\n queuePendingCount:\n snapshot.queuePendingCount + snapshot.queueInProgressCount,\n queueFailedCount: snapshot.queueFailedCount,\n nowMs: snapshot.now,\n lastSuccessfulSyncAt: snapshot.lastSuccessfulSyncAt,\n });\n const traversal = evaluateProjectionStaleness({\n endpointClass: \"traversal\",\n queueBacklogAgeMs: snapshot.queueBacklogAgeMs,\n queuePendingCount:\n snapshot.queuePendingCount + snapshot.queueInProgressCount,\n queueFailedCount: snapshot.queueFailedCount,\n nowMs: snapshot.now,\n lastSuccessfulSyncAt: snapshot.lastSuccessfulSyncAt,\n });\n const entityRead = evaluateProjectionStaleness({\n endpointClass: \"entity_read\",\n queueBacklogAgeMs: snapshot.queueBacklogAgeMs,\n queuePendingCount:\n snapshot.queuePendingCount + snapshot.queueInProgressCount,\n queueFailedCount: snapshot.queueFailedCount,\n nowMs: snapshot.now,\n lastSuccessfulSyncAt: snapshot.lastSuccessfulSyncAt,\n });\n const nonGraph = evaluateProjectionStaleness({\n endpointClass: \"non_graph\",\n queueBacklogAgeMs: snapshot.queueBacklogAgeMs,\n queuePendingCount:\n snapshot.queuePendingCount + snapshot.queueInProgressCount,\n queueFailedCount: snapshot.queueFailedCount,\n nowMs: snapshot.now,\n lastSuccessfulSyncAt: snapshot.lastSuccessfulSyncAt,\n });\n\n return {\n analytics,\n traversal,\n entityRead,\n nonGraph,\n };\n}\n\nfunction assertAuthenticated(clerkId: string | null): string {\n if (!clerkId) {\n throw new Error(\"Authentication required\");\n }\n return clerkId;\n}\n\nexport const getProjectionReconciliationStatusInternal = internalQuery({\n args: {},\n returns: permissiveReturn,\n handler: async (ctx) => {\n const snapshot = await getQueueSnapshot(ctx);\n const assessments = buildEndpointAssessments(snapshot);\n\n return {\n ...snapshot,\n endpointAssessments: assessments,\n generatedAt: snapshot.now,\n };\n },\n});\n\nexport const getProjectionReconciliationStatus = query({\n args: {},\n returns: permissiveReturn,\n handler: async (ctx) => {\n assertAuthenticated(await getCurrentUserId(ctx));\n const snapshot = await getQueueSnapshot(ctx);\n const assessments = buildEndpointAssessments(snapshot);\n\n return {\n ...snapshot,\n endpointAssessments: assessments,\n generatedAt: snapshot.now,\n };\n },\n});\n\nexport const assessProjectionStaleness = query({\n args: {\n endpointClass: v.union(\n v.literal(\"analytics\"),\n v.literal(\"traversal\"),\n v.literal(\"entity_read\"),\n v.literal(\"non_graph\")\n ),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n assertAuthenticated(await getCurrentUserId(ctx));\n const snapshot = await getQueueSnapshot(ctx);\n const endpointClass = args.endpointClass as ProjectionEndpointClass;\n\n return {\n endpointClass,\n assessment: evaluateProjectionStaleness({\n endpointClass,\n queueBacklogAgeMs: snapshot.queueBacklogAgeMs,\n queuePendingCount:\n snapshot.queuePendingCount + snapshot.queueInProgressCount,\n queueFailedCount: snapshot.queueFailedCount,\n nowMs: snapshot.now,\n lastSuccessfulSyncAt: snapshot.lastSuccessfulSyncAt,\n }),\n snapshot,\n };\n },\n});\n\nexport const runProjectionRepairCycle = internalAction({\n args: {\n limit: v.optional(v.number()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const processed = await ctx.runAction(\n internal.neo4jSync.processRetryQueue,\n {\n limit: args.limit ?? 25,\n }\n );\n const status = await ctx.runQuery(\n internal.projectionReconciliation\n .getProjectionReconciliationStatusInternal,\n {}\n );\n\n return {\n processed,\n status,\n runAt: Date.now(),\n };\n },\n});\n"]}
1
+ {"version":3,"sources":["../src/convex.ts","../src/projectionStaleness.ts","../src/projectionReconciliation.ts"],"names":[],"mappings":"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","file":"projectionReconciliation.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\nexport const action = actionGeneric as any;\nexport const httpAction = httpActionGeneric as any;\nexport const internalAction = internalActionGeneric as any;\nexport const internalMutation = internalMutationGeneric as any;\nexport const internalQuery = internalQueryGeneric as any;\nexport const mutation = mutationGeneric as any;\nexport const query = queryGeneric as any;\n","/**\n * projectionStaleness module implementation.\n */\n\nexport type ProjectionEndpointClass =\n | \"analytics\"\n | \"traversal\"\n | \"entity_read\"\n | \"non_graph\";\n\nexport type ProjectionFallbackMode =\n | \"fail_with_503\"\n | \"degrade_to_convex_depth_limited\"\n | \"fallback_to_convex_entity_read\"\n | \"none\";\n\nexport type ProjectionStalenessPolicy = {\n endpointClass: ProjectionEndpointClass;\n thresholdMs: number;\n fallbackMode: ProjectionFallbackMode;\n nonOverridable: true;\n};\n\nexport type ProjectionStalenessInput = {\n endpointClass: ProjectionEndpointClass;\n queueBacklogAgeMs: number;\n queuePendingCount: number;\n queueFailedCount: number;\n nowMs?: number;\n lastSuccessfulSyncAt?: number;\n};\n\nexport type ProjectionStalenessEnvelope = {\n endpointClass: ProjectionEndpointClass;\n stalenessMs: number;\n thresholdMs: number;\n isStale: boolean;\n fallbackMode: ProjectionFallbackMode;\n queuePendingCount: number;\n queueFailedCount: number;\n evaluatedAt: number;\n lastSuccessfulSyncAt?: number;\n lastSuccessfulSyncAgeMs?: number;\n reasonCode:\n | \"PROJECTION_HEALTHY\"\n | \"PROJECTION_STALE\"\n | \"PROJECTION_STALE_WITH_FAILED_RETRIES\";\n};\n\nexport const PROJECTION_STALENESS_POLICIES: Record<\n ProjectionEndpointClass,\n ProjectionStalenessPolicy\n> = {\n analytics: {\n endpointClass: \"analytics\",\n thresholdMs: 30_000,\n fallbackMode: \"fail_with_503\",\n nonOverridable: true,\n },\n traversal: {\n endpointClass: \"traversal\",\n thresholdMs: 60_000,\n fallbackMode: \"degrade_to_convex_depth_limited\",\n nonOverridable: true,\n },\n entity_read: {\n endpointClass: \"entity_read\",\n thresholdMs: 5 * 60_000,\n fallbackMode: \"fallback_to_convex_entity_read\",\n nonOverridable: true,\n },\n non_graph: {\n endpointClass: \"non_graph\",\n thresholdMs: Number.POSITIVE_INFINITY,\n fallbackMode: \"none\",\n nonOverridable: true,\n },\n};\n\nexport function getProjectionStalenessPolicy(\n endpointClass: ProjectionEndpointClass\n): ProjectionStalenessPolicy {\n return PROJECTION_STALENESS_POLICIES[endpointClass];\n}\n\nexport function evaluateProjectionStaleness(\n input: ProjectionStalenessInput\n): ProjectionStalenessEnvelope {\n const policy = getProjectionStalenessPolicy(input.endpointClass);\n const evaluatedAt = input.nowMs ?? Date.now();\n const stalenessMs = Math.max(0, input.queueBacklogAgeMs);\n const isStale = stalenessMs > policy.thresholdMs;\n const lastSuccessfulSyncAgeMs =\n input.lastSuccessfulSyncAt !== undefined\n ? Math.max(0, evaluatedAt - input.lastSuccessfulSyncAt)\n : undefined;\n\n return {\n endpointClass: input.endpointClass,\n stalenessMs,\n thresholdMs: policy.thresholdMs,\n isStale,\n fallbackMode: policy.fallbackMode,\n queuePendingCount: input.queuePendingCount,\n queueFailedCount: input.queueFailedCount,\n evaluatedAt,\n lastSuccessfulSyncAt: input.lastSuccessfulSyncAt,\n lastSuccessfulSyncAgeMs,\n reasonCode: isStale\n ? input.queueFailedCount > 0\n ? \"PROJECTION_STALE_WITH_FAILED_RETRIES\"\n : \"PROJECTION_STALE\"\n : \"PROJECTION_HEALTHY\",\n };\n}\n\nexport function shouldFailClosedForProjection(\n envelope: ProjectionStalenessEnvelope\n): boolean {\n return envelope.isStale && envelope.fallbackMode === \"fail_with_503\";\n}\n","/**\n * Projection Reconciliation Runtime\n *\n * Phase 2 (WT-C) runtime hooks for Convex-authoritative / Neo4j-projected\n * reconciliation health and endpoint-class staleness evaluation.\n */\n\nimport { v } from \"convex/values\";\nimport { getCurrentUserId } from \"@lucern/access-control/auth\";\nimport { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\nimport { internal, internalAction, internalQuery, query } from \"./convex\";\nimport {\n evaluateProjectionStaleness,\n type ProjectionEndpointClass,\n} from \"./projectionStaleness\";\n\ntype QueueStatus = \"pending\" | \"in_progress\" | \"failed\" | \"succeeded\";\n\ntype QueueRow = {\n status: QueueStatus;\n createdAt: number;\n updatedAt: number;\n};\n\nfunction maxTimestamp(\n rows: QueueRow[],\n field: \"createdAt\" | \"updatedAt\"\n): number | undefined {\n let maxValue: number | undefined;\n for (const row of rows) {\n const value = row[field];\n if (!Number.isFinite(value)) {\n continue;\n }\n if (maxValue === undefined || value > maxValue) {\n maxValue = value;\n }\n }\n return maxValue;\n}\n\nfunction minTimestamp(\n rows: QueueRow[],\n field: \"createdAt\" | \"updatedAt\"\n): number | undefined {\n let minValue: number | undefined;\n for (const row of rows) {\n const value = row[field];\n if (!Number.isFinite(value)) {\n continue;\n }\n if (minValue === undefined || value < minValue) {\n minValue = value;\n }\n }\n return minValue;\n}\n\nasync function getQueueSnapshot(ctx: any) {\n const [pendingRows, inProgressRows, failedRows, succeededRows] =\n await Promise.all([\n ctx.db\n .query(\"neo4jSyncQueue\")\n .withIndex(\"by_status\", (q: any) => q.eq(\"status\", \"pending\"))\n .collect() as Promise<QueueRow[]>,\n ctx.db\n .query(\"neo4jSyncQueue\")\n .withIndex(\"by_status\", (q: any) => q.eq(\"status\", \"in_progress\"))\n .collect() as Promise<QueueRow[]>,\n ctx.db\n .query(\"neo4jSyncQueue\")\n .withIndex(\"by_status\", (q: any) => q.eq(\"status\", \"failed\"))\n .collect() as Promise<QueueRow[]>,\n ctx.db\n .query(\"neo4jSyncQueue\")\n .withIndex(\"by_status\", (q: any) => q.eq(\"status\", \"succeeded\"))\n .collect() as Promise<QueueRow[]>,\n ]);\n\n const now = Date.now();\n const backlogOldestCreatedAt = minTimestamp(\n [...pendingRows, ...inProgressRows],\n \"createdAt\"\n );\n const queueBacklogAgeMs =\n backlogOldestCreatedAt !== undefined\n ? Math.max(0, now - backlogOldestCreatedAt)\n : 0;\n const lastSuccessfulSyncAt = maxTimestamp(succeededRows, \"updatedAt\");\n\n return {\n now,\n queuePendingCount: pendingRows.length,\n queueInProgressCount: inProgressRows.length,\n queueFailedCount: failedRows.length,\n queueSucceededCount: succeededRows.length,\n queueBacklogAgeMs,\n backlogOldestCreatedAt,\n lastSuccessfulSyncAt,\n };\n}\n\nfunction buildEndpointAssessments(\n snapshot: Awaited<ReturnType<typeof getQueueSnapshot>>\n) {\n const analytics = evaluateProjectionStaleness({\n endpointClass: \"analytics\",\n queueBacklogAgeMs: snapshot.queueBacklogAgeMs,\n queuePendingCount:\n snapshot.queuePendingCount + snapshot.queueInProgressCount,\n queueFailedCount: snapshot.queueFailedCount,\n nowMs: snapshot.now,\n lastSuccessfulSyncAt: snapshot.lastSuccessfulSyncAt,\n });\n const traversal = evaluateProjectionStaleness({\n endpointClass: \"traversal\",\n queueBacklogAgeMs: snapshot.queueBacklogAgeMs,\n queuePendingCount:\n snapshot.queuePendingCount + snapshot.queueInProgressCount,\n queueFailedCount: snapshot.queueFailedCount,\n nowMs: snapshot.now,\n lastSuccessfulSyncAt: snapshot.lastSuccessfulSyncAt,\n });\n const entityRead = evaluateProjectionStaleness({\n endpointClass: \"entity_read\",\n queueBacklogAgeMs: snapshot.queueBacklogAgeMs,\n queuePendingCount:\n snapshot.queuePendingCount + snapshot.queueInProgressCount,\n queueFailedCount: snapshot.queueFailedCount,\n nowMs: snapshot.now,\n lastSuccessfulSyncAt: snapshot.lastSuccessfulSyncAt,\n });\n const nonGraph = evaluateProjectionStaleness({\n endpointClass: \"non_graph\",\n queueBacklogAgeMs: snapshot.queueBacklogAgeMs,\n queuePendingCount:\n snapshot.queuePendingCount + snapshot.queueInProgressCount,\n queueFailedCount: snapshot.queueFailedCount,\n nowMs: snapshot.now,\n lastSuccessfulSyncAt: snapshot.lastSuccessfulSyncAt,\n });\n\n return {\n analytics,\n traversal,\n entityRead,\n nonGraph,\n };\n}\n\nfunction buildProjectionReconciliationStatus(\n snapshot: Awaited<ReturnType<typeof getQueueSnapshot>>\n) {\n return {\n ...snapshot,\n endpointAssessments: buildEndpointAssessments(snapshot),\n generatedAt: snapshot.now,\n };\n}\n\nfunction assertAuthenticated(clerkId: string | null): string {\n if (!clerkId) {\n throw new Error(\"Authentication required\");\n }\n return clerkId;\n}\n\nexport const getProjectionReconciliationStatusInternal = internalQuery({\n args: {},\n returns: permissiveReturn,\n handler: async (ctx) => {\n const snapshot = await getQueueSnapshot(ctx);\n return buildProjectionReconciliationStatus(snapshot);\n },\n});\n\nexport const getProjectionReconciliationStatus = query({\n args: {},\n returns: permissiveReturn,\n handler: async (ctx) => {\n assertAuthenticated(await getCurrentUserId(ctx));\n const snapshot = await getQueueSnapshot(ctx);\n return buildProjectionReconciliationStatus(snapshot);\n },\n});\n\nexport const assessProjectionStaleness = query({\n args: {\n endpointClass: v.union(\n v.literal(\"analytics\"),\n v.literal(\"traversal\"),\n v.literal(\"entity_read\"),\n v.literal(\"non_graph\")\n ),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n assertAuthenticated(await getCurrentUserId(ctx));\n const snapshot = await getQueueSnapshot(ctx);\n const endpointClass = args.endpointClass as ProjectionEndpointClass;\n\n return {\n endpointClass,\n assessment: evaluateProjectionStaleness({\n endpointClass,\n queueBacklogAgeMs: snapshot.queueBacklogAgeMs,\n queuePendingCount:\n snapshot.queuePendingCount + snapshot.queueInProgressCount,\n queueFailedCount: snapshot.queueFailedCount,\n nowMs: snapshot.now,\n lastSuccessfulSyncAt: snapshot.lastSuccessfulSyncAt,\n }),\n snapshot,\n };\n },\n});\n\nexport const runProjectionRepairCycle = internalAction({\n args: {\n limit: v.optional(v.number()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const processed = await ctx.runAction(\n internal.neo4jSync.processRetryQueue,\n {\n limit: args.limit ?? 25,\n }\n );\n const status = await ctx.runQuery(\n internal.projectionReconciliation\n .getProjectionReconciliationStatusInternal,\n {}\n );\n\n return {\n processed,\n status,\n runAt: Date.now(),\n };\n },\n});\n"]}
@@ -48,4 +48,4 @@ declare namespace projectionStaleness {
48
48
  export { projectionStaleness_PROJECTION_STALENESS_POLICIES as PROJECTION_STALENESS_POLICIES, type projectionStaleness_ProjectionEndpointClass as ProjectionEndpointClass, type projectionStaleness_ProjectionFallbackMode as ProjectionFallbackMode, type projectionStaleness_ProjectionStalenessEnvelope as ProjectionStalenessEnvelope, type projectionStaleness_ProjectionStalenessInput as ProjectionStalenessInput, type projectionStaleness_ProjectionStalenessPolicy as ProjectionStalenessPolicy, projectionStaleness_evaluateProjectionStaleness as evaluateProjectionStaleness, projectionStaleness_getProjectionStalenessPolicy as getProjectionStalenessPolicy, projectionStaleness_shouldFailClosedForProjection as shouldFailClosedForProjection };
49
49
  }
50
50
 
51
- export { type ProjectionEndpointClass as P, type ProjectionFallbackMode as a, type ProjectionStalenessPolicy as b, type ProjectionStalenessInput as c, type ProjectionStalenessEnvelope as d, PROJECTION_STALENESS_POLICIES as e, evaluateProjectionStaleness as f, getProjectionStalenessPolicy as g, projectionStaleness as p, shouldFailClosedForProjection as s };
51
+ export { PROJECTION_STALENESS_POLICIES as P, type ProjectionEndpointClass as a, type ProjectionFallbackMode as b, type ProjectionStalenessEnvelope as c, type ProjectionStalenessInput as d, type ProjectionStalenessPolicy as e, evaluateProjectionStaleness as f, getProjectionStalenessPolicy as g, projectionStaleness as p, shouldFailClosedForProjection as s };
@@ -1 +1 @@
1
- export { e as PROJECTION_STALENESS_POLICIES, P as ProjectionEndpointClass, a as ProjectionFallbackMode, d as ProjectionStalenessEnvelope, c as ProjectionStalenessInput, b as ProjectionStalenessPolicy, f as evaluateProjectionStaleness, g as getProjectionStalenessPolicy, s as shouldFailClosedForProjection } from './projectionStaleness-CAdpIsaW.js';
1
+ export { P as PROJECTION_STALENESS_POLICIES, a as ProjectionEndpointClass, b as ProjectionFallbackMode, c as ProjectionStalenessEnvelope, d as ProjectionStalenessInput, e as ProjectionStalenessPolicy, f as evaluateProjectionStaleness, g as getProjectionStalenessPolicy, s as shouldFailClosedForProjection } from './projectionStaleness-CmdbpjVK.js';
@@ -31,4 +31,4 @@ declare namespace questionEvidenceLinks {
31
31
  export { questionEvidenceLinks_create as create, questionEvidenceLinks_getByInsight as getByInsight, questionEvidenceLinks_getByProject as getByProject, questionEvidenceLinks_getByQuestion as getByQuestion, questionEvidenceLinks_getEvidenceWithDetails as getEvidenceWithDetails, questionEvidenceLinks_getLinkedQuestionsForInsight as getLinkedQuestionsForInsight, questionEvidenceLinks_getPendingSuggestions as getPendingSuggestions, questionEvidenceLinks_remove as remove, questionEvidenceLinks_reviewSuggestion as reviewSuggestion, questionEvidenceLinks_updateImpact as updateImpact };
32
32
  }
33
33
 
34
- export { remove as a, getPendingSuggestions as b, create as c, getByInsight as d, getEvidenceWithDetails as e, getByProject as f, getByQuestion as g, getLinkedQuestionsForInsight as h, questionEvidenceLinks as q, reviewSuggestion as r, updateImpact as u };
34
+ export { getByProject as a, getByQuestion as b, create as c, getEvidenceWithDetails as d, getLinkedQuestionsForInsight as e, getPendingSuggestions as f, getByInsight as g, reviewSuggestion as h, questionEvidenceLinks as q, remove as r, updateImpact as u };
@@ -1 +1 @@
1
- export { c as create, d as getByInsight, f as getByProject, g as getByQuestion, e as getEvidenceWithDetails, h as getLinkedQuestionsForInsight, b as getPendingSuggestions, a as remove, r as reviewSuggestion, u as updateImpact } from './questionEvidenceLinks-BdQD0TkM.js';
1
+ export { c as create, g as getByInsight, a as getByProject, b as getByQuestion, d as getEvidenceWithDetails, e as getLinkedQuestionsForInsight, f as getPendingSuggestions, r as remove, h as reviewSuggestion, u as updateImpact } from './questionEvidenceLinks-DFlyPpAj.js';