@lucern/graph-primitives 1.0.28 → 1.0.30

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 (319) hide show
  1. package/dist/{beliefDecay-DZ6tkLYq.d.ts → beliefDecay-BmkEk5OJ.d.ts} +3 -3
  2. package/dist/beliefDecay.d.ts +1 -1
  3. package/dist/beliefDecay.js +448 -314
  4. package/dist/beliefDecay.js.map +1 -1
  5. package/dist/{beliefEvidenceLinks-CWOXxxJg.d.ts → beliefEvidenceLinks-BzfjON_6.d.ts} +13 -13
  6. package/dist/beliefEvidenceLinks.d.ts +1 -1
  7. package/dist/beliefEvidenceLinks.js +843 -624
  8. package/dist/beliefEvidenceLinks.js.map +1 -1
  9. package/dist/beliefEvidenceLinks.operational.d.ts +7 -5
  10. package/dist/beliefEvidenceLinks.operational.js +91 -18
  11. package/dist/beliefEvidenceLinks.operational.js.map +1 -1
  12. package/dist/beliefLifecycle.js.map +1 -1
  13. package/dist/confidencePropagationDispatch.d.ts +28 -27
  14. package/dist/confidencePropagationDispatch.js +157 -99
  15. package/dist/confidencePropagationDispatch.js.map +1 -1
  16. package/dist/{contradictions-51VLsESq.d.ts → contradictions-BATPuZTL.d.ts} +10 -10
  17. package/dist/contradictions.d.ts +1 -1
  18. package/dist/contradictions.js +398 -228
  19. package/dist/contradictions.js.map +1 -1
  20. package/dist/convex.d.ts +65 -30
  21. package/dist/convex.js +7 -3
  22. package/dist/convex.js.map +1 -1
  23. package/dist/debug.js.map +1 -1
  24. package/dist/edgeValidation.js +293 -85
  25. package/dist/edgeValidation.js.map +1 -1
  26. package/dist/edges/contains.d.ts +1 -1
  27. package/dist/edges/contains.js.map +1 -1
  28. package/dist/edges/contradicts.d.ts +1 -1
  29. package/dist/edges/contradicts.js.map +1 -1
  30. package/dist/edges/{dependsOn.d.ts → depends-on.d.ts} +1 -1
  31. package/dist/edges/{dependsOn.js → depends-on.js} +4 -4
  32. package/dist/edges/depends-on.js.map +1 -0
  33. package/dist/edges/{derivedFrom.d.ts → derived-from.d.ts} +1 -1
  34. package/dist/edges/{derivedFrom.js → derived-from.js} +3 -3
  35. package/dist/edges/derived-from.js.map +1 -0
  36. package/dist/edges/elaborates.d.ts +1 -1
  37. package/dist/edges/elaborates.js.map +1 -1
  38. package/dist/edges/index.d.ts +7 -3
  39. package/dist/edges/index.js +7 -4
  40. package/dist/edges/index.js.map +1 -1
  41. package/dist/edges/informs.d.ts +1 -1
  42. package/dist/edges/informs.js.map +1 -1
  43. package/dist/edges/{propagationTypes.d.ts → propagation-types.d.ts} +14 -14
  44. package/dist/edges/{propagationTypes.js → propagation-types.js} +3 -3
  45. package/dist/edges/propagation-types.js.map +1 -0
  46. package/dist/edges/refutes.d.ts +1 -1
  47. package/dist/edges/refutes.js.map +1 -1
  48. package/dist/edges/supports.d.ts +1 -1
  49. package/dist/edges/supports.js.map +1 -1
  50. package/dist/edges/tests.d.ts +1 -1
  51. package/dist/edges/tests.js.map +1 -1
  52. package/dist/edges/utils.d.ts +1 -1
  53. package/dist/edges/utils.js.map +1 -1
  54. package/dist/embeddingTrigger.d.ts +14 -6
  55. package/dist/embeddingTrigger.js +11 -14
  56. package/dist/embeddingTrigger.js.map +1 -1
  57. package/dist/{entityBridge-DMaKooYn.d.ts → entityBridge-BhVDM3pc.d.ts} +5 -5
  58. package/dist/entityBridge.d.ts +1 -1
  59. package/dist/entityBridge.js +602 -225
  60. package/dist/entityBridge.js.map +1 -1
  61. package/dist/entityCanonicalMatch.d.ts +14 -12
  62. package/dist/entityCanonicalMatch.js.map +1 -1
  63. package/dist/{entityLifecycle-CvgSK5FV.d.ts → entityLifecycle-BsfCz9pS.d.ts} +5 -9
  64. package/dist/entityLifecycle.d.ts +1 -1
  65. package/dist/entityLifecycle.js +857 -515
  66. package/dist/entityLifecycle.js.map +1 -1
  67. package/dist/{entityValidation-KLZ_Xl2D.d.ts → entityValidation-B1yNEHJx.d.ts} +7 -6
  68. package/dist/entityValidation.d.ts +3 -1
  69. package/dist/entityValidation.js +60 -8
  70. package/dist/entityValidation.js.map +1 -1
  71. package/dist/{epistemicAnswers-C5ib4z6_.d.ts → epistemicAnswers-f47YMu9U.d.ts} +6 -6
  72. package/dist/epistemicAnswers.d.ts +1 -1
  73. package/dist/epistemicAnswers.js +587 -545
  74. package/dist/epistemicAnswers.js.map +1 -1
  75. package/dist/epistemicBeliefs.admin.d.ts +8 -8
  76. package/dist/epistemicBeliefs.admin.js +366 -203
  77. package/dist/epistemicBeliefs.admin.js.map +1 -1
  78. package/dist/epistemicBeliefs.backfills.d.ts +8 -8
  79. package/dist/epistemicBeliefs.backfills.js +655 -308
  80. package/dist/epistemicBeliefs.backfills.js.map +1 -1
  81. package/dist/epistemicBeliefs.confidence.d.ts +19 -14
  82. package/dist/epistemicBeliefs.confidence.js +634 -423
  83. package/dist/epistemicBeliefs.confidence.js.map +1 -1
  84. package/dist/epistemicBeliefs.core.d.ts +6 -6
  85. package/dist/epistemicBeliefs.core.js +719 -411
  86. package/dist/epistemicBeliefs.core.js.map +1 -1
  87. package/dist/epistemicBeliefs.d.ts +11 -8
  88. package/dist/epistemicBeliefs.forkEvidence.d.ts +2 -0
  89. package/dist/epistemicBeliefs.forkEvidence.js +8 -28
  90. package/dist/epistemicBeliefs.forkEvidence.js.map +1 -1
  91. package/dist/epistemicBeliefs.helpers.d.ts +69 -74
  92. package/dist/epistemicBeliefs.helpers.js +359 -248
  93. package/dist/epistemicBeliefs.helpers.js.map +1 -1
  94. package/dist/epistemicBeliefs.internal.d.ts +5 -5
  95. package/dist/epistemicBeliefs.internal.js +1246 -1044
  96. package/dist/epistemicBeliefs.internal.js.map +1 -1
  97. package/dist/epistemicBeliefs.js +4922 -3608
  98. package/dist/epistemicBeliefs.js.map +1 -1
  99. package/dist/epistemicBeliefs.lifecycle.d.ts +5 -5
  100. package/dist/epistemicBeliefs.lifecycle.js +1137 -818
  101. package/dist/epistemicBeliefs.lifecycle.js.map +1 -1
  102. package/dist/epistemicBeliefs.links.d.ts +7 -7
  103. package/dist/epistemicBeliefs.links.js +408 -307
  104. package/dist/epistemicBeliefs.links.js.map +1 -1
  105. package/dist/epistemicBeliefs.queries.d.ts +4 -4
  106. package/dist/epistemicBeliefs.queries.js +175 -20
  107. package/dist/epistemicBeliefs.queries.js.map +1 -1
  108. package/dist/epistemicBeliefs.topicAnchor.d.ts +6 -4
  109. package/dist/epistemicBeliefs.topicAnchor.js +12 -5
  110. package/dist/epistemicBeliefs.topicAnchor.js.map +1 -1
  111. package/dist/epistemicContracts.d.ts +28 -3
  112. package/dist/epistemicContracts.evaluators.d.ts +2 -0
  113. package/dist/epistemicContracts.evaluators.js +1063 -613
  114. package/dist/epistemicContracts.evaluators.js.map +1 -1
  115. package/dist/epistemicContracts.handlers.d.ts +15 -32
  116. package/dist/epistemicContracts.handlers.js +2086 -1644
  117. package/dist/epistemicContracts.handlers.js.map +1 -1
  118. package/dist/epistemicContracts.js +1131 -672
  119. package/dist/epistemicContracts.js.map +1 -1
  120. package/dist/epistemicContracts.metrics.d.ts +2 -0
  121. package/dist/epistemicContracts.metrics.js +375 -158
  122. package/dist/epistemicContracts.metrics.js.map +1 -1
  123. package/dist/epistemicContracts.types.d.ts +87 -81
  124. package/dist/epistemicEdgeCreation.d.ts +2 -0
  125. package/dist/epistemicEdgeCreation.js +87 -16
  126. package/dist/epistemicEdgeCreation.js.map +1 -1
  127. package/dist/{epistemicEdges-BF-cn4i3.d.ts → epistemicEdges-BGBh0QSP.d.ts} +4 -7
  128. package/dist/epistemicEdges.d.ts +6 -5
  129. package/dist/epistemicEdges.handlers.d.ts +3 -3
  130. package/dist/epistemicEdges.handlers.js +129 -24
  131. package/dist/epistemicEdges.handlers.js.map +1 -1
  132. package/dist/epistemicEdges.helpers.d.ts +6 -4
  133. package/dist/epistemicEdges.helpers.js +37 -2
  134. package/dist/epistemicEdges.helpers.js.map +1 -1
  135. package/dist/epistemicEdges.js +1969 -1205
  136. package/dist/epistemicEdges.js.map +1 -1
  137. package/dist/epistemicEdges.mutations.d.ts +7 -7
  138. package/dist/epistemicEdges.mutations.js +960 -583
  139. package/dist/epistemicEdges.mutations.js.map +1 -1
  140. package/dist/epistemicEdges.queries.d.ts +16 -16
  141. package/dist/epistemicEdges.queries.js +639 -367
  142. package/dist/epistemicEdges.queries.js.map +1 -1
  143. package/dist/epistemicEdges.types.d.ts +10 -8
  144. package/dist/epistemicEvidence.d.ts +4 -1
  145. package/dist/epistemicEvidence.js +937 -536
  146. package/dist/epistemicEvidence.js.map +1 -1
  147. package/dist/epistemicEvidenceHelpers.d.ts +26 -10
  148. package/dist/epistemicEvidenceHelpers.js +239 -200
  149. package/dist/epistemicEvidenceHelpers.js.map +1 -1
  150. package/dist/epistemicEvidenceMutations.d.ts +8 -8
  151. package/dist/epistemicEvidenceMutations.js +844 -696
  152. package/dist/epistemicEvidenceMutations.js.map +1 -1
  153. package/dist/epistemicEvidenceQueries.d.ts +8 -8
  154. package/dist/epistemicEvidenceQueries.js +514 -238
  155. package/dist/epistemicEvidenceQueries.js.map +1 -1
  156. package/dist/epistemicHelpers.d.ts +4 -2
  157. package/dist/epistemicHelpers.js +308 -134
  158. package/dist/epistemicHelpers.js.map +1 -1
  159. package/dist/epistemicInsert.d.ts +16 -4
  160. package/dist/epistemicInsert.js +6 -3
  161. package/dist/epistemicInsert.js.map +1 -1
  162. package/dist/epistemicLayerRules.d.ts +10 -8
  163. package/dist/epistemicLayerRules.js +1 -5
  164. package/dist/epistemicLayerRules.js.map +1 -1
  165. package/dist/{epistemicLinking-CfE00tHJ.d.ts → epistemicLinking-CsCDv2cN.d.ts} +3 -3
  166. package/dist/epistemicLinking.d.ts +1 -1
  167. package/dist/epistemicLinking.js +177 -100
  168. package/dist/epistemicLinking.js.map +1 -1
  169. package/dist/epistemicNodeCreation.d.ts +2 -0
  170. package/dist/epistemicNodeCreation.js +203 -40
  171. package/dist/epistemicNodeCreation.js.map +1 -1
  172. package/dist/{epistemicNodes-BCQxpYx_.d.ts → epistemicNodes-CokAgBHg.d.ts} +3 -3
  173. package/dist/epistemicNodes.d.ts +3 -3
  174. package/dist/epistemicNodes.helpers.d.ts +24 -15
  175. package/dist/epistemicNodes.helpers.js.map +1 -1
  176. package/dist/epistemicNodes.internal.d.ts +6 -6
  177. package/dist/epistemicNodes.internal.js +389 -319
  178. package/dist/epistemicNodes.internal.js.map +1 -1
  179. package/dist/epistemicNodes.js +704 -508
  180. package/dist/epistemicNodes.js.map +1 -1
  181. package/dist/epistemicNodes.mutations.d.ts +6 -6
  182. package/dist/epistemicNodes.mutations.js +564 -467
  183. package/dist/epistemicNodes.mutations.js.map +1 -1
  184. package/dist/epistemicNodes.queries.d.ts +8 -8
  185. package/dist/epistemicNodes.queries.js +311 -314
  186. package/dist/epistemicNodes.queries.js.map +1 -1
  187. package/dist/epistemicNodes.validators.d.ts +2 -2
  188. package/dist/epistemicNodes.validators.js.map +1 -1
  189. package/dist/epistemicQuestions.conviction.d.ts +8 -8
  190. package/dist/epistemicQuestions.conviction.js +665 -484
  191. package/dist/epistemicQuestions.conviction.js.map +1 -1
  192. package/dist/epistemicQuestions.create.d.ts +4 -4
  193. package/dist/epistemicQuestions.create.js +640 -612
  194. package/dist/epistemicQuestions.create.js.map +1 -1
  195. package/dist/epistemicQuestions.d.ts +8 -5
  196. package/dist/epistemicQuestions.evidence.d.ts +2 -2
  197. package/dist/epistemicQuestions.evidence.js +475 -383
  198. package/dist/epistemicQuestions.evidence.js.map +1 -1
  199. package/dist/epistemicQuestions.helpers.d.ts +125 -24
  200. package/dist/epistemicQuestions.helpers.js +240 -209
  201. package/dist/epistemicQuestions.helpers.js.map +1 -1
  202. package/dist/epistemicQuestions.js +3474 -2823
  203. package/dist/epistemicQuestions.js.map +1 -1
  204. package/dist/epistemicQuestions.lifecycle.d.ts +2 -2
  205. package/dist/epistemicQuestions.lifecycle.js +607 -546
  206. package/dist/epistemicQuestions.lifecycle.js.map +1 -1
  207. package/dist/epistemicQuestions.queries.d.ts +12 -7
  208. package/dist/epistemicQuestions.queries.js +305 -244
  209. package/dist/epistemicQuestions.queries.js.map +1 -1
  210. package/dist/epistemicQuestions.sprint.d.ts +2 -2
  211. package/dist/epistemicQuestions.sprint.js +600 -394
  212. package/dist/epistemicQuestions.sprint.js.map +1 -1
  213. package/dist/epistemicQuestions.tail.d.ts +6 -6
  214. package/dist/epistemicQuestions.tail.js +572 -433
  215. package/dist/epistemicQuestions.tail.js.map +1 -1
  216. package/dist/{epistemicSources-dlKj58Jp.d.ts → epistemicSources-DQtaEkWs.d.ts} +4 -4
  217. package/dist/epistemicSources.d.ts +1 -1
  218. package/dist/epistemicSources.js +352 -312
  219. package/dist/epistemicSources.js.map +1 -1
  220. package/dist/evaluators/index.d.ts +8 -6
  221. package/dist/evaluators/index.js +399 -167
  222. package/dist/evaluators/index.js.map +1 -1
  223. package/dist/evaluators/lint-checker-evaluator.d.ts +16 -0
  224. package/dist/evaluators/{lintCheckerEvaluator.js → lint-checker-evaluator.js} +10 -5
  225. package/dist/evaluators/lint-checker-evaluator.js.map +1 -0
  226. package/dist/evaluators/{sentryCheckerEvaluator.d.ts → sentry-checker-evaluator.d.ts} +7 -2
  227. package/dist/evaluators/{sentryCheckerEvaluator.js → sentry-checker-evaluator.js} +3 -3
  228. package/dist/evaluators/sentry-checker-evaluator.js.map +1 -0
  229. package/dist/evaluators/shared.d.ts +2 -2
  230. package/dist/evaluators/shared.js +3 -1
  231. package/dist/evaluators/shared.js.map +1 -1
  232. package/dist/evaluators/{testRunnerEvaluator.d.ts → test-runner-evaluator.d.ts} +6 -1
  233. package/dist/evaluators/{testRunnerEvaluator.js → test-runner-evaluator.js} +6 -4
  234. package/dist/evaluators/test-runner-evaluator.js.map +1 -0
  235. package/dist/evaluators/tsc-checker-evaluator.d.ts +16 -0
  236. package/dist/evaluators/{tscCheckerEvaluator.js → tsc-checker-evaluator.js} +10 -5
  237. package/dist/evaluators/tsc-checker-evaluator.js.map +1 -0
  238. package/dist/graphTypes.js +6 -2
  239. package/dist/graphTypes.js.map +1 -1
  240. package/dist/helpers.d.ts +2 -0
  241. package/dist/helpers.js +313 -93
  242. package/dist/helpers.js.map +1 -1
  243. package/dist/{index-C-Kyd7hD.d.ts → index-DZxyC9Pb.d.ts} +7 -6
  244. package/dist/index.d.ts +87 -83
  245. package/dist/index.js +15677 -10594
  246. package/dist/index.js.map +1 -1
  247. package/dist/invariantEnforcement.d.ts +3 -3
  248. package/dist/invariantEnforcement.js.map +1 -1
  249. package/dist/logicalRoleInference.d.ts +2 -0
  250. package/dist/logicalRoleInference.js +1 -1
  251. package/dist/logicalRoleInference.js.map +1 -1
  252. package/dist/matcherFeedbackUtils.d.ts +2 -2
  253. package/dist/matcherFeedbackUtils.js.map +1 -1
  254. package/dist/{ontology-matching-C6rrz2VP.d.ts → ontology-matching-C-mYFrir.d.ts} +16 -16
  255. package/dist/ontology-matching.d.ts +1 -1
  256. package/dist/{ontologyApproval-CFYmqKmk.d.ts → ontologyApproval-BVt0feJi.d.ts} +10 -10
  257. package/dist/ontologyApproval.d.ts +1 -1
  258. package/dist/ontologyApproval.js +7 -1
  259. package/dist/ontologyApproval.js.map +1 -1
  260. package/dist/ontologyDefinitions.d.ts +14 -24
  261. package/dist/ontologyDefinitions.js +269 -34
  262. package/dist/ontologyDefinitions.js.map +1 -1
  263. package/dist/ontologyHelpers.d.ts +13 -13
  264. package/dist/ontologyHelpers.js.map +1 -1
  265. package/dist/{ontologyRegistry-B67rPJ16.d.ts → ontologyRegistry-CljS-ENv.d.ts} +2 -2
  266. package/dist/ontologyRegistry.d.ts +1 -1
  267. package/dist/ontologyRegistry.js +34 -6
  268. package/dist/ontologyRegistry.js.map +1 -1
  269. package/dist/{projectionReconciliation-jww2fBI0.d.ts → projectionReconciliation-DnrSgHSQ.d.ts} +4 -4
  270. package/dist/projectionReconciliation.d.ts +1 -1
  271. package/dist/projectionReconciliation.js +57 -10
  272. package/dist/projectionReconciliation.js.map +1 -1
  273. package/dist/{projectionStaleness-CmdbpjVK.d.ts → projectionStaleness-C8ImQ2zP.d.ts} +17 -17
  274. package/dist/projectionStaleness.d.ts +1 -1
  275. package/dist/projectionStaleness.js +8 -2
  276. package/dist/projectionStaleness.js.map +1 -1
  277. package/dist/proof-attestation.json +1 -1
  278. package/dist/{questionEvidenceLinks-DFlyPpAj.d.ts → questionEvidenceLinks-_nPRa-LY.d.ts} +10 -10
  279. package/dist/questionEvidenceLinks.d.ts +1 -1
  280. package/dist/questionEvidenceLinks.js +564 -347
  281. package/dist/questionEvidenceLinks.js.map +1 -1
  282. package/dist/{resolverTypes-CC8Ea2E2.d.ts → resolverTypes-BOXPxLET.d.ts} +8 -7
  283. package/dist/resolverTypes.d.ts +4 -2
  284. package/dist/{resolvers-Br1a6eLV.d.ts → resolvers-B1TIBmRO.d.ts} +3 -1
  285. package/dist/resolvers.d.ts +5 -3
  286. package/dist/resolvers.js +121 -77
  287. package/dist/resolvers.js.map +1 -1
  288. package/dist/scopeResolverCompat.d.ts +10 -7
  289. package/dist/scopeResolverCompat.js +106 -123
  290. package/dist/scopeResolverCompat.js.map +1 -1
  291. package/dist/{text-matching-DNg4M5Wd.d.ts → text-matching-DzFooju6.d.ts} +7 -7
  292. package/dist/text-matching.d.ts +1 -1
  293. package/dist/topicOntologyResolver.d.ts +22 -21
  294. package/dist/topicOntologyResolver.js +54 -32
  295. package/dist/topicOntologyResolver.js.map +1 -1
  296. package/dist/topicProjectOverlay.d.ts +30 -20
  297. package/dist/topicProjectOverlay.js +120 -76
  298. package/dist/topicProjectOverlay.js.map +1 -1
  299. package/dist/{topicScope-7zhyeGl7.d.ts → topicScope-DJVa0mLa.d.ts} +22 -7
  300. package/dist/topicScope.d.ts +3 -1
  301. package/dist/topicScope.js +104 -119
  302. package/dist/topicScope.js.map +1 -1
  303. package/dist/workflowBridge.d.ts +26 -15
  304. package/dist/workflowBridge.js +140 -144
  305. package/dist/workflowBridge.js.map +1 -1
  306. package/dist/workspaceIsolation.d.ts +14 -12
  307. package/dist/workspaceIsolation.js +108 -122
  308. package/dist/workspaceIsolation.js.map +1 -1
  309. package/package.json +4 -4
  310. package/dist/edges/dependsOn.js.map +0 -1
  311. package/dist/edges/derivedFrom.js.map +0 -1
  312. package/dist/edges/propagationTypes.js.map +0 -1
  313. package/dist/evaluators/lintCheckerEvaluator.d.ts +0 -11
  314. package/dist/evaluators/lintCheckerEvaluator.js.map +0 -1
  315. package/dist/evaluators/sentryCheckerEvaluator.js.map +0 -1
  316. package/dist/evaluators/testRunnerEvaluator.js.map +0 -1
  317. package/dist/evaluators/tscCheckerEvaluator.d.ts +0 -11
  318. package/dist/evaluators/tscCheckerEvaluator.js.map +0 -1
  319. package/dist/{epistemicQuestions-bwHd2FWE.d.ts → epistemicQuestions-Do1fhYm5.d.ts} +4 -4
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/convex.ts","../src/graphTypes.ts","../src/edgeValidation.ts","../src/topicScope.ts","../src/entityBridge.ts"],"names":["v"],"mappings":"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","file":"entityBridge.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\n// TODO(FR.11-structural): `api`/`internal`/`components` are `anyApi as any`\n// because this module source tree is bundled into the kernel host at deploy time\n// and has NO top-level Convex `_generated/` directory to import a typed surface\n// from. Every `api.*` / `internal.*` / string-literal cross-component ref in this\n// module (topicScope.ts, topicProjectOverlay.ts, questionEvidenceLinks.ts,\n// beliefEvidenceLinks*.ts, epistemicQuestions.helpers.ts) inherits `any` from\n// here. The fix is structural — generate a per-module typed surface or a shared\n// typed function-reference manifest (template: the typed `components.controlPlane`\n// in modules/control-plane/src/component/convex.ts and the\n// `KERNEL_API_REF_MANIFEST` pattern in packages/server-core/src/kernelApi.ts) —\n// owned by the FR.11 closing/synthesis pass, not a mechanical swap.\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;\ntype IndexRangeBuilder = {\n field(fieldName: string): string;\n eq(fieldName: string, value: unknown): IndexRangeBuilder;\n gt(fieldName: string, value: unknown): IndexRangeBuilder;\n gte(fieldName: string, value: unknown): IndexRangeBuilder;\n lt(fieldName: string, value: unknown): IndexRangeBuilder;\n lte(fieldName: string, value: unknown): IndexRangeBuilder;\n};\ntype FilterBuilder = {\n eq(left: unknown, right: unknown): unknown;\n neq(left: unknown, right: unknown): unknown;\n gt(left: unknown, right: unknown): unknown;\n gte(left: unknown, right: unknown): unknown;\n lt(left: unknown, right: unknown): unknown;\n lte(left: unknown, right: unknown): unknown;\n and(...clauses: unknown[]): unknown;\n or(...clauses: unknown[]): unknown;\n field(fieldName: string): unknown;\n};\ntype QueryInitializer<TableName extends TableNames> = {\n withIndex(\n indexName: string,\n range?: (q: any) => unknown\n ): QueryInitializer<TableName>;\n filter(predicate: (q: any) => unknown): QueryInitializer<TableName>;\n order(direction: \"asc\" | \"desc\"): QueryInitializer<TableName>;\n collect(): Promise<Doc<TableName>[]>;\n take(limit: number): Promise<Doc<TableName>[]>;\n first(): Promise<Doc<TableName> | null>;\n unique(): Promise<Doc<TableName> | null>;\n};\nexport type DatabaseReader = {\n get<TableName extends TableNames>(\n id: Id<TableName>\n ): Promise<Doc<TableName> | null>;\n query<TableName extends TableNames>(\n tableName: TableName\n ): QueryInitializer<TableName>;\n normalizeId?<TableName extends TableNames>(\n tableName: TableName,\n id: string\n ): Id<TableName> | null;\n};\nexport type DatabaseWriter = DatabaseReader & {\n insert<TableName extends TableNames>(\n tableName: TableName,\n value: Record<string, unknown>\n ): Promise<Id<TableName>>;\n patch<TableName extends TableNames>(\n id: Id<TableName>,\n value: Record<string, unknown>\n ): Promise<void>;\n replace<TableName extends TableNames>(\n id: Id<TableName>,\n value: Record<string, unknown>\n ): Promise<void>;\n delete<TableName extends TableNames>(id: Id<TableName>): Promise<void>;\n};\ntype Scheduler = {\n runAfter(delayMs: number, functionReference: unknown, args?: unknown): Promise<void>;\n};\ntype AuthReader = {\n getUserIdentity(): Promise<unknown>;\n};\ntype RuntimeInvoker = {\n runQuery(functionReference: unknown, args?: unknown): Promise<any>;\n runMutation(functionReference: unknown, args?: unknown): Promise<any>;\n runAction(functionReference: unknown, args?: unknown): Promise<any>;\n};\nexport type QueryCtx = RuntimeInvoker & {\n auth: AuthReader;\n db: DatabaseReader;\n scheduler: Scheduler;\n};\nexport type MutationCtx = RuntimeInvoker & {\n auth: AuthReader;\n db: DatabaseWriter;\n scheduler: Scheduler;\n};\nexport type ActionCtx = RuntimeInvoker & {\n auth: AuthReader;\n scheduler: Scheduler;\n};\n\ntype ConvexFunctionBuilder<Ctx> = <\n Definition extends { handler?: (ctx: Ctx, args: any) => any },\n>(\n definition: Definition\n) => any;\n\nexport const action = actionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const httpAction =\n httpActionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const internalAction =\n internalActionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const internalMutation =\n internalMutationGeneric as unknown as ConvexFunctionBuilder<MutationCtx>;\nexport const internalQuery =\n internalQueryGeneric as unknown as ConvexFunctionBuilder<QueryCtx>;\nexport const mutation =\n mutationGeneric as unknown as ConvexFunctionBuilder<MutationCtx>;\nexport const query = queryGeneric as unknown as ConvexFunctionBuilder<QueryCtx>;\n","/**\n * Graph Type Registry for Convex\n *\n * This file mirrors the canonical type registry at lib/ontology/types.ts\n * but is compatible with Convex's bundling requirements.\n *\n * IMPORTANT: Keep this file in sync with lib/ontology/types.ts\n * The frontend uses lib/ontology/types.ts, Convex uses this file.\n *\n * @see /docs/architecture/UNIFIED_GRAPH_ARCHITECTURE.md\n */\n\n// =============================================================================\n// EPISTEMIC LAYERS\n// =============================================================================\n\nexport type EpistemicLayer =\n | \"L4\"\n | \"L3\"\n | \"L2\"\n | \"L1\"\n | \"ontological\"\n | \"organizational\";\n\n// =============================================================================\n// NODE TYPE TO LABEL MAPPING\n// =============================================================================\n\nexport const NODE_TYPE_TO_LABEL: Record<string, string> = {\n // L4: Audit Targets\n decision: \"Decision\",\n\n // L3: Traversal Anchors\n belief: \"Belief\",\n question: \"Question\",\n theme: \"Theme\",\n deal: \"Deal\",\n topic: \"Topic\",\n\n // L2: Compression Boundary\n claim: \"Claim\",\n evidence: \"Evidence\",\n synthesis: \"Synthesis\",\n answer: \"Answer\",\n\n // L1: Terminal Leaves\n atomic_fact: \"AtomicFact\",\n excerpt: \"Excerpt\",\n source: \"Source\",\n\n // Ontological (Neo4j is SOT)\n company: \"Company\",\n person: \"Person\",\n investor: \"Investor\",\n function: \"Function\",\n value_chain: \"ValueChain\",\n};\n\n// =============================================================================\n// EDGE TYPE TO NEO4J RELATIONSHIP MAPPING\n// =============================================================================\n\n/**\n * Epistemic Kernel v2: 6 canonical edge types + ontological edges.\n *\n * Weight and metadata carry nuance that previously required 67 separate type strings.\n * See: docs/architecture/epistemic-kernel-v2.md\n */\nexport const EDGE_TYPE_TO_REL: Record<string, string> = {\n // === THE SIX CANONICAL EPISTEMIC EDGE TYPES ===\n supports: \"SUPPORTS\", // L3↔L3: belief bears on belief (weight -1 to +1)\n informs: \"INFORMS\", // L2→L3: evidence bears on belief\n depends_on: \"DEPENDS_ON\", // L3→L3, Q→Q: structural gate\n derived_from: \"DERIVED_FROM\", // Any→Any: provenance chain (fork, synthesis, extraction, answer)\n contains: \"CONTAINS\", // Any→Any: hierarchy, scoping, membership\n tests: \"TESTS\", // Q→L3: question interrogates belief\n\n // === L4 DECISION EDGES (derived_from with derivationType=decision) ===\n // Kept as separate Neo4j relationship types for backward compat with L4 queries.\n // New code should use derived_from + metadata.\n based_on_belief: \"BASED_ON_BELIEF\",\n based_on_question: \"BASED_ON_QUESTION\",\n blocked_by_contradiction: \"BLOCKED_BY_CONTRADICTION\",\n informed_by_theme: \"INFORMED_BY_THEME\",\n\n // === ONTOLOGICAL EDGES (tenant-extensible, managed by ontology system) ===\n works_at: \"WORKS_AT\",\n invested_in: \"INVESTED_IN\",\n competes_with: \"COMPETES_WITH\",\n participates_in: \"PARTICIPATES_IN\",\n founded_by: \"FOUNDED_BY\",\n evaluates: \"EVALUATES\",\n performs: \"PERFORMS\",\n function_in: \"FUNCTION_IN\",\n impacts: \"IMPACTS\",\n raised_from: \"RAISED_FROM\",\n mentioned_in: \"MENTIONED_IN\",\n perspective_on: \"PERSPECTIVE_ON\",\n about_entity: \"ABOUT_ENTITY\",\n entity_referenced_in: \"ENTITY_REFERENCED_IN\",\n};\n\n// =============================================================================\n// HELPER FUNCTIONS\n// =============================================================================\n\n/**\n * Get the epistemic layer for a node type\n */\nexport function getNodeLayer(nodeType: string): EpistemicLayer {\n const L4_TYPES = [\"decision\"];\n const L3_TYPES = [\"belief\", \"question\", \"theme\", \"deal\"];\n const L2_TYPES = [\"claim\", \"evidence\", \"synthesis\", \"answer\"];\n const L1_TYPES = [\"atomic_fact\", \"excerpt\", \"source\"];\n const ONTOLOGICAL_TYPES = [\n \"company\",\n \"person\",\n \"investor\",\n \"function\",\n \"value_chain\",\n ];\n const ORGANIZATIONAL_TYPES = [\"topic\"];\n\n if (L4_TYPES.includes(nodeType)) {\n return \"L4\";\n }\n if (L3_TYPES.includes(nodeType)) {\n return \"L3\";\n }\n if (L2_TYPES.includes(nodeType)) {\n return \"L2\";\n }\n if (L1_TYPES.includes(nodeType)) {\n return \"L1\";\n }\n if (ONTOLOGICAL_TYPES.includes(nodeType)) {\n return \"ontological\";\n }\n if (ORGANIZATIONAL_TYPES.includes(nodeType)) {\n return \"organizational\";\n }\n\n // Unknown types default to L2\n console.warn(`[GraphTypes] Unknown nodeType \"${nodeType}\", defaulting to L2`);\n return \"L2\";\n}\n\n/**\n * Get the Neo4j label for a node type\n */\nexport function getNeo4jLabel(nodeType: string): string {\n return (\n NODE_TYPE_TO_LABEL[nodeType] ||\n nodeType.charAt(0).toUpperCase() + nodeType.slice(1)\n );\n}\n\n/**\n * Get the Neo4j relationship type for an edge type\n */\nexport function getNeo4jRelType(edgeType: string): string {\n return EDGE_TYPE_TO_REL[edgeType] || edgeType.toUpperCase();\n}\n\n/**\n * The 6 canonical epistemic edge types (Kernel v2).\n * Anything not in this set or the ontological/L4 sets is deprecated.\n */\nconst CANONICAL_EPISTEMIC_TYPES = new Set([\n \"supports\",\n \"informs\",\n \"depends_on\",\n \"derived_from\",\n \"contains\",\n \"tests\",\n]);\n\n/**\n * Check if an edge type is deprecated.\n *\n * Kernel v2: only the 6 canonical epistemic types, L4 decision types,\n * and ontological types are active. All legacy types (67 old types) are deprecated.\n */\nexport function isDeprecatedEdgeType(edgeType: string): boolean {\n // Canonical epistemic types are NOT deprecated\n if (CANONICAL_EPISTEMIC_TYPES.has(edgeType)) return false;\n // Types in the EDGE_TYPE_TO_REL map (ontological + L4) are NOT deprecated\n if (edgeType in EDGE_TYPE_TO_REL) return false;\n // Everything else is a legacy type\n return true;\n}\n","/**\n * edgeValidation module implementation.\n */\n\nimport { type EpistemicLayer, isDeprecatedEdgeType } from \"./graphTypes\";\n\nexport { isDeprecatedEdgeType };\nexport type { EpistemicLayer };\n\nfunction getLayerDepth(layer: EpistemicLayer): number {\n switch (layer) {\n case \"L4\":\n return 4;\n case \"L3\":\n return 3;\n case \"L2\":\n return 2;\n case \"L1\":\n return 1;\n case \"ontological\":\n return 0;\n default:\n return -1;\n }\n}\n\nfunction isValidLayerConnection(\n fromLayer: EpistemicLayer,\n toLayer: EpistemicLayer\n): boolean {\n if (fromLayer === toLayer) {\n return true;\n }\n\n // Ontological ↔ ontological (entity-entity edges)\n if (fromLayer === \"ontological\" && toLayer === \"ontological\") {\n return true;\n }\n\n // Ontological ↔ epistemic bridge (OE-B: entity-belief/evidence/source connections)\n if (\n fromLayer === \"ontological\" &&\n (toLayer === \"L3\" || toLayer === \"L2\" || toLayer === \"L1\")\n ) {\n return true;\n }\n if (\n (fromLayer === \"L3\" || fromLayer === \"L2\" || fromLayer === \"L1\") &&\n toLayer === \"ontological\"\n ) {\n return true;\n }\n\n // Epistemic layer transitions\n if (fromLayer === \"L2\" && toLayer === \"L1\") {\n return true;\n }\n if (fromLayer === \"L2\" && toLayer === \"L3\") {\n return true;\n }\n if (fromLayer === \"L3\" && toLayer === \"L2\") {\n return true;\n }\n if (fromLayer === \"L3\" && toLayer === \"L4\") {\n return true;\n }\n if (fromLayer === \"L4\" && toLayer === \"L3\") {\n return true;\n }\n\n // Organizational connections\n if (fromLayer === \"L3\" && toLayer === \"organizational\") {\n return true;\n }\n if (fromLayer === \"organizational\" && toLayer === \"L3\") {\n return true;\n }\n\n const fromDepth = getLayerDepth(fromLayer);\n const toDepth = getLayerDepth(toLayer);\n if (Math.abs(fromDepth - toDepth) > 1) {\n return false;\n }\n return true;\n}\n\nexport type TraversalMode =\n | \"anchor_down\"\n | \"anchor_up\"\n | \"same_layer\"\n | \"decision_trace\";\n\nexport function shouldContinueTraversal(\n currentLayer: EpistemicLayer,\n targetLayer: EpistemicLayer,\n options: {\n mode: TraversalMode;\n minLayer?: number;\n maxLayer?: number;\n }\n): boolean {\n const currentDepth = getLayerDepth(currentLayer);\n const targetDepth = getLayerDepth(targetLayer);\n\n if (options.minLayer !== undefined && targetDepth < options.minLayer) {\n return false;\n }\n if (options.maxLayer !== undefined && targetDepth > options.maxLayer) {\n return false;\n }\n\n switch (options.mode) {\n case \"anchor_down\":\n return targetDepth <= currentDepth;\n case \"anchor_up\":\n return targetDepth >= currentDepth;\n case \"same_layer\":\n return targetDepth === currentDepth;\n case \"decision_trace\":\n return currentDepth === 4\n ? targetDepth === 3\n : targetDepth === currentDepth;\n default:\n return true;\n }\n}\n\nexport function getDefaultMinLayer(mode: TraversalMode): number {\n switch (mode) {\n case \"anchor_down\":\n return 1;\n case \"anchor_up\":\n return 2;\n case \"same_layer\":\n return 1;\n case \"decision_trace\":\n return 3;\n default:\n return 1;\n }\n}\n\nexport const EDGE_LAYER_RULES: Record<\n string,\n { from: EpistemicLayer[]; to: EpistemicLayer[]; description: string }\n> = {\n // === 6 Canonical Epistemic Types ===\n supports: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Belief bears on Belief (weight: +1 supports, -1 contradicts)\",\n },\n informs: {\n from: [\"L2\"],\n to: [\"L3\"],\n description: \"Evidence -> Belief (L2 -> L3)\",\n },\n depends_on: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Belief B requires Belief A (structural gate)\",\n },\n derived_from: {\n from: [\"L2\", \"L3\", \"L4\"],\n to: [\"L1\", \"L2\", \"L3\"],\n description: \"A was produced from B (provenance chain)\",\n },\n contains: {\n from: [\"L3\", \"L4\", \"ontological\"],\n to: [\"L2\", \"L3\", \"ontological\"],\n description: \"A scopes/aggregates B (hierarchy)\",\n },\n tests: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Question -> Belief (L3 -> L3)\",\n },\n\n // === Structural / Lifecycle ===\n supersedes: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"NewNode -> OldNode (fork lineage)\",\n },\n responds_to: {\n from: [\"L2\", \"L3\"],\n to: [\"L3\"],\n description: \"Answer -> Question (L2/L3 -> L3)\",\n },\n belongs_to: {\n from: [\"L2\", \"L3\", \"ontological\"],\n to: [\"L3\"],\n description: \"Membership (migrating to contains)\",\n },\n relates_to_thesis: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Belief -> Theme (L3 -> L3)\",\n },\n\n // === Ontological (entity-entity or entity-epistemic bridge) ===\n works_at: {\n from: [\"ontological\"],\n to: [\"ontological\"],\n description: \"Person -> Company\",\n },\n invested_in: {\n from: [\"ontological\"],\n to: [\"ontological\"],\n description: \"Investor -> Company\",\n },\n competes_with: {\n from: [\"ontological\"],\n to: [\"ontological\"],\n description: \"Company -> Company\",\n },\n participates_in: {\n from: [\"ontological\"],\n to: [\"ontological\"],\n description: \"Company -> ValueChain\",\n },\n founded_by: {\n from: [\"ontological\"],\n to: [\"ontological\"],\n description: \"Company -> Person\",\n },\n evaluates: {\n from: [\"ontological\"],\n to: [\"ontological\"],\n description: \"Deal -> Company\",\n },\n performs: {\n from: [\"ontological\"],\n to: [\"ontological\"],\n description: \"Company -> Function\",\n },\n function_in: {\n from: [\"ontological\"],\n to: [\"ontological\"],\n description: \"Function -> ValueChain\",\n },\n impacts: {\n from: [\"ontological\", \"L3\"],\n to: [\"ontological\"],\n description: \"Theme/Entity -> ValueChain\",\n },\n raised_from: {\n from: [\"ontological\"],\n to: [\"ontological\"],\n description: \"Company -> Investor\",\n },\n mentioned_in: {\n from: [\"ontological\"],\n to: [\"L1\", \"L2\"],\n description: \"Entity -> Source/Evidence\",\n },\n perspective_on: {\n from: [\"ontological\"],\n to: [\"L3\"],\n description: \"Person -> Belief/Theme\",\n },\n plays_theme: {\n from: [\"ontological\"],\n to: [\"L3\"],\n description: \"Deal -> Theme\",\n },\n\n // C2-RR.4 — storage migration alias + the remaining 55 reachable edge types.\n // Mirrors the kernel rule table\n // (packages/reasoning-kernel/src/adapters/lib/edgeValidation.ts) so this\n // graph-primitives write path admits the same public edge vocabulary. See the\n // kernel file for the per-group rationale.\n extracted_from: {\n from: [\"L2\", \"L3\", \"L4\"],\n to: [\"L1\", \"L2\", \"L3\"],\n description:\n \"Legacy storage migration alias for derived_from; public writes use derived_from\",\n },\n qualifies: { from: [\"L2\", \"L3\"], to: [\"L3\"], description: \"Evidence/Belief qualifies a Belief\" },\n contradicts: { from: [\"L2\", \"L3\"], to: [\"L3\"], description: \"Evidence/Belief contradicts a Belief\" },\n reinforces: { from: [\"L2\", \"L3\"], to: [\"L3\"], description: \"Evidence/Belief reinforces a Belief\" },\n corroborates: { from: [\"L2\", \"L3\"], to: [\"L3\"], description: \"Independent evidence/belief corroborates a Belief\" },\n strengthened_by: { from: [\"L3\"], to: [\"L2\", \"L3\"], description: \"Belief is strengthened by Evidence/Belief\" },\n weakened_by: { from: [\"L3\"], to: [\"L2\", \"L3\"], description: \"Belief is weakened by Evidence/Belief\" },\n validated_by: { from: [\"L3\"], to: [\"L2\", \"L3\"], description: \"Belief is validated by Evidence/Belief\" },\n falsified_by: { from: [\"L3\"], to: [\"L2\", \"L3\"], description: \"Belief is falsified by Evidence/Belief\" },\n amplifies: { from: [\"L3\"], to: [\"L3\"], description: \"Belief amplifies another Belief\" },\n precondition_for: { from: [\"L3\"], to: [\"L3\"], description: \"Belief is a precondition for another Belief\" },\n prerequisite_for: { from: [\"L3\"], to: [\"L3\"], description: \"Belief is a prerequisite for another Belief\" },\n required_for: { from: [\"L3\"], to: [\"L3\"], description: \"Belief is required for another Belief\" },\n in_tension_with: { from: [\"L3\"], to: [\"L3\"], description: \"Belief is in tension with another Belief\" },\n mutually_exclusive: { from: [\"L3\"], to: [\"L3\"], description: \"Beliefs cannot both hold\" },\n exclusive_with: { from: [\"L3\"], to: [\"L3\"], description: \"Belief is exclusive with another Belief\" },\n alternative_to: { from: [\"L3\"], to: [\"L3\"], description: \"Belief is an alternative to another Belief\" },\n subsumes: { from: [\"L3\"], to: [\"L3\"], description: \"Belief subsumes a narrower Belief\" },\n extends: { from: [\"L3\"], to: [\"L3\"], description: \"Belief extends another Belief\" },\n refines: { from: [\"L3\"], to: [\"L3\"], description: \"Belief refines another Belief\" },\n implements: { from: [\"L3\"], to: [\"L3\"], description: \"Belief implements an abstract Belief\" },\n violates: { from: [\"L3\"], to: [\"L3\"], description: \"Belief violates a constraint Belief\" },\n assumes: { from: [\"L3\"], to: [\"L3\"], description: \"Belief assumes another Belief\" },\n would_predict: { from: [\"L3\"], to: [\"L3\"], description: \"Belief would predict another Belief\" },\n analogous_to: { from: [\"L3\"], to: [\"L3\"], description: \"Belief is analogous to another Belief\" },\n independent_of: { from: [\"L3\"], to: [\"L3\"], description: \"Belief is independent of another Belief\" },\n correlates_with: { from: [\"L3\"], to: [\"L3\"], description: \"Belief correlates with another Belief\" },\n co_changes_with: { from: [\"L3\"], to: [\"L3\"], description: \"Belief co-changes with another Belief\" },\n counterfactual_of: { from: [\"L3\"], to: [\"L3\"], description: \"Belief is a counterfactual of another Belief\" },\n parallel_to: { from: [\"L3\"], to: [\"L3\"], description: \"Belief runs parallel to another Belief\" },\n cascade_from: { from: [\"L3\"], to: [\"L3\"], description: \"Cascade from an upstream Belief\" },\n cascade_to: { from: [\"L3\"], to: [\"L3\"], description: \"Cascade to a downstream Belief\" },\n collapses_if: { from: [\"L3\"], to: [\"L3\"], description: \"Belief collapses if another fails\" },\n branches_from: { from: [\"L3\"], to: [\"L3\"], description: \"Belief branches from an ancestor Belief\" },\n same_as: { from: [\"L2\", \"L3\", \"ontological\"], to: [\"L2\", \"L3\", \"ontological\"], description: \"Two nodes are the same entity\" },\n answers: { from: [\"L2\", \"L3\"], to: [\"L3\"], description: \"Answer/Belief answers a Question\" },\n partially_answers: { from: [\"L2\", \"L3\"], to: [\"L3\"], description: \"Answer/Belief partially answers a Question\" },\n explores: { from: [\"L3\"], to: [\"L3\"], description: \"Question explores a Belief/Theme\" },\n informed_by_theme: { from: [\"L3\"], to: [\"L3\"], description: \"Belief is informed by a Theme\" },\n same_theme_as: { from: [\"L3\"], to: [\"L3\"], description: \"Two Beliefs share a Theme\" },\n based_on: { from: [\"L4\"], to: [\"L3\"], description: \"Decision is based on a Belief/Question\" },\n based_on_belief: { from: [\"L4\"], to: [\"L3\"], description: \"Decision is based on a Belief\" },\n based_on_question: { from: [\"L4\"], to: [\"L3\"], description: \"Decision is based on a Question\" },\n blocked_by_contradiction: { from: [\"L4\"], to: [\"L3\"], description: \"Decision is blocked by a Contradiction\" },\n parent_of: { from: [\"L3\", \"L4\", \"ontological\", \"organizational\"], to: [\"L2\", \"L3\", \"ontological\", \"organizational\"], description: \"A is the parent of B\" },\n child_of: { from: [\"L2\", \"L3\", \"ontological\", \"organizational\"], to: [\"L3\", \"L4\", \"ontological\", \"organizational\"], description: \"A is the child of B\" },\n scoped_by: { from: [\"L2\", \"L3\"], to: [\"L3\", \"organizational\"], description: \"Object is scoped by a Topic/Theme\" },\n cites: { from: [\"L2\", \"L3\"], to: [\"L1\", \"L2\"], description: \"Evidence/Belief cites a Source/Excerpt\" },\n summarizes: { from: [\"L2\", \"L3\"], to: [\"L1\", \"L2\"], description: \"Synthesis/Evidence summarizes a Source/Evidence\" },\n same_source_as: { from: [\"L1\", \"L2\"], to: [\"L1\", \"L2\"], description: \"Two nodes derive from the same Source\" },\n migrating_from: { from: [\"L2\", \"L3\", \"L4\"], to: [\"L1\", \"L2\", \"L3\"], description: \"Migration lineage: from an ancestor\" },\n migrating_to: { from: [\"L1\", \"L2\", \"L3\"], to: [\"L2\", \"L3\", \"L4\"], description: \"Migration lineage: to a successor\" },\n about_entity: { from: [\"L2\", \"L3\"], to: [\"ontological\"], description: \"Belief/Evidence is about an Entity\" },\n entity_referenced_in: { from: [\"ontological\"], to: [\"L1\", \"L2\"], description: \"Entity is referenced in a Source/Evidence\" },\n related_to: { from: [\"L2\", \"L3\", \"ontological\", \"organizational\"], to: [\"L2\", \"L3\", \"ontological\", \"organizational\"], description: \"Lateral adjacency; no confidence pressure\" },\n blocks: { from: [\"L3\", \"L4\"], to: [\"L3\", \"L4\"], description: \"A blocks B (structural gate)\" },\n};\n\nexport function validateEdgeLayers(\n edgeType: string,\n fromLayer: EpistemicLayer,\n toLayer: EpistemicLayer\n): { valid: boolean; reason?: string } {\n const rules = EDGE_LAYER_RULES[edgeType];\n\n if (!rules) {\n console.warn(\n `[EdgeValidation] Unknown edge type: ${edgeType}, allowing by default`\n );\n return { valid: true };\n }\n\n if (edgeType === \"supersedes\") {\n if (fromLayer !== toLayer) {\n return {\n valid: false,\n reason: `${edgeType} edges must be between nodes of the same layer. Got ${fromLayer} -> ${toLayer}`,\n };\n }\n return { valid: true };\n }\n\n if (!rules.from.includes(fromLayer)) {\n return {\n valid: false,\n reason: `Edge type '${edgeType}' does not allow source layer ${fromLayer}. Allowed: ${rules.from.join(\", \")}`,\n };\n }\n\n if (!rules.to.includes(toLayer)) {\n return {\n valid: false,\n reason: `Edge type '${edgeType}' does not allow target layer ${toLayer}. Allowed: ${rules.to.join(\", \")}`,\n };\n }\n\n if (!isValidLayerConnection(fromLayer, toLayer)) {\n return {\n valid: false,\n reason: `Layer transition ${fromLayer} -> ${toLayer} is not permitted`,\n };\n }\n\n return { valid: true };\n}\n\n","/** Topic-scope resolution helpers for graph-primitive operations. */\nimport { v } from \"convex/values\";\nimport { api as appApi } from \"./convex\";\nimport type { Id } from \"./convex\";\nimport { debugGraphPrimitiveFallback } from \"./debug\";\n\nconst LEGACY_SCOPE_FIELD = \"graphScope\" + \"ProjectId\";\n\ntype TopicDoc = Record<string, unknown> & {\n _id: Id<\"topics\">;\n globalId?: string;\n name?: string;\n depth?: number;\n createdAt?: number;\n parentTopicId?: Id<\"topics\">;\n tenantId?: string;\n workspaceId?: string;\n metadata?: Record<string, unknown>;\n};\n\nexport type TopicProjectScope = {\n topicId: Id<\"topics\">;\n projectId?: string;\n tenantId?: string;\n workspaceId?: string;\n source:\n | \"topic\"\n | \"project_mapped_topic\"\n | \"topic_inferred\"\n | \"topic_node\";\n};\n\n/**\n * RR.5 (legacy topics-table retirement) — graph-primitives mirror of the\n * kernel's epistemicNodes-first topic-scope fallback. Kept in lockstep with\n * `packages/reasoning-kernel/src/adapters/lib/topicScope.ts`\n * (`tests/unit/convex/topic-scope-fallbacks.test.ts` asserts parity).\n *\n * Resolves a topic that exists only as `epistemicNodes(nodeType=\"topic\")` —\n * the write-of-record — when no legacy `topics` row backs the ref, returning the\n * node's `topicId` self-key so scoped beliefs/evidence/questions stay reachable.\n * See the kernel module for the full silent-empty-result rationale.\n */\ntype TopicNodeScopeDoc = {\n _id: string | Id<\"epistemicNodes\">;\n globalId?: string;\n nodeType?: string;\n topicId?: string;\n metadata?: Record<string, unknown>;\n};\n\nasync function resolveTopicNodeScopeOrNull(\n ctx: any,\n ref: string,\n): Promise<TopicProjectScope | null> {\n if (!ctx?.db || typeof ctx.db.query !== \"function\") {\n return null;\n }\n\n let node: TopicNodeScopeDoc | null = null;\n\n // 1. The ref IS the topic node's UUIDv7 globalId.\n try {\n const byGlobalId = (await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_globalId\", (q: any) => q.eq(\"globalId\", ref))\n .first()) as TopicNodeScopeDoc | null;\n if (byGlobalId && byGlobalId.nodeType === \"topic\") {\n node = byGlobalId;\n }\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] topic-node scope lookup by globalId failed\",\n { error, ref },\n );\n }\n\n if (!node) {\n return null;\n }\n\n const scopeKey =\n normalizeScopeValue(node.topicId) ?? normalizeScopeValue(node.globalId);\n if (!scopeKey) {\n return null;\n }\n\n return {\n topicId: scopeKey as Id<\"topics\">,\n projectId: asMappedProjectId(node as unknown as TopicDoc),\n source: \"topic_node\",\n };\n}\n\ntype MaterializedTopicNodeDoc = {\n _id: string | Id<\"epistemicNodes\">;\n metadata?: Record<string, unknown>;\n};\n\nfunction asMappedProjectId(\n topic: TopicDoc | null | undefined,\n): string | undefined {\n if (!topic) {\n return;\n }\n const directLegacyProjectId = normalizeScopeValue(topic[LEGACY_SCOPE_FIELD]);\n if (directLegacyProjectId) {\n return directLegacyProjectId;\n }\n const metadata = (topic.metadata || {}) as Record<string, unknown>;\n const candidate =\n (metadata[LEGACY_SCOPE_FIELD] as string | undefined) ||\n (metadata.legacyProjectId as string | undefined) ||\n (metadata.projectId as string | undefined) ||\n (metadata.scopeProjectId as string | undefined);\n return candidate ? (candidate as string) : undefined;\n}\n\nfunction normalizeScopeValue(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return;\n }\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction pickPrimaryTopic(candidates: TopicDoc[]): TopicDoc | undefined {\n return [...candidates].sort((a, b) => {\n const depthA = a.depth ?? 9999;\n const depthB = b.depth ?? 9999;\n if (depthA !== depthB) {\n return depthA - depthB;\n }\n const createdA = a.createdAt ?? Number.MAX_SAFE_INTEGER;\n const createdB = b.createdAt ?? Number.MAX_SAFE_INTEGER;\n if (createdA !== createdB) {\n return createdA - createdB;\n }\n return String(a.name || \"\").localeCompare(String(b.name || \"\"));\n })[0];\n}\n\nasync function findTopicsByScopeAlias(\n ctx: any,\n scopeId: string,\n): Promise<TopicDoc[]> {\n try {\n return (await ctx.db\n .query(\"topics\")\n .withIndex(\"by_graph_scope_project\", (q: any) =>\n q.eq(LEGACY_SCOPE_FIELD, scopeId),\n )\n .collect()) as TopicDoc[];\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to resolve scope alias via index\",\n {\n error,\n scopeId,\n },\n );\n // Older Lucern dev deployments can lag index backfills while still carrying\n // the underlying topics table. Scan and filter so scope resolution keeps\n // working during the rollout.\n const topics = (await ctx.db.query(\"topics\").collect()) as TopicDoc[];\n return topics.filter((topic) => {\n const normalizedGlobalId = normalizeScopeValue(topic.globalId);\n const mappedProjectId = asMappedProjectId(topic);\n return (\n String(topic._id) === scopeId ||\n normalizedGlobalId === scopeId ||\n mappedProjectId === scopeId\n );\n });\n }\n}\n\nasync function tryResolveHostTopicById(\n ctx: any,\n topicId: string,\n): Promise<TopicDoc | null> {\n if (typeof ctx.runQuery !== \"function\") {\n return null;\n }\n try {\n return ((await ctx.runQuery(appApi.topics.get as any, {\n id: topicId,\n })) ?? null) as TopicDoc | null;\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to resolve topic by host query\",\n {\n error,\n topicId,\n },\n );\n return null;\n }\n}\n\nasync function tryResolveHostTopicByLegacyScope(\n ctx: any,\n legacyScopeId: string,\n): Promise<TopicDoc | null> {\n if (typeof ctx.runQuery !== \"function\") {\n return null;\n }\n try {\n return ((await ctx.runQuery(appApi.topics.getByLegacyScopeId as any, {\n projectId: legacyScopeId,\n })) ?? null) as TopicDoc | null;\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to resolve topic by legacy scope\",\n {\n error,\n legacyScopeId,\n },\n );\n return null;\n }\n}\n\nexport function readMaterializedTopicTableId(\n topicNode: MaterializedTopicNodeDoc | null | undefined,\n): string | undefined {\n if (!topicNode) {\n return;\n }\n\n const metadata = (topicNode.metadata || {}) as Record<string, unknown>;\n const topicTableId =\n (metadata.topicTableId as string | undefined) ||\n (metadata.topicId as string | undefined);\n\n return typeof topicTableId === \"string\" && topicTableId.trim().length > 0\n ? topicTableId.trim()\n : undefined;\n}\n\n/**\n * Walk the topic parent chain to find inherited workspaceId and tenantId.\n * Mirrors the pattern used by resolveTopicOntology for ontologyId inheritance.\n * Max depth: 10 (defensive limit against pathological nesting).\n */\nasync function resolveInheritedWorkspaceScope(\n ctx: any,\n topic: TopicDoc,\n): Promise<{ tenantId?: string; workspaceId?: string }> {\n const MAX_DEPTH = 10;\n let tenantId = normalizeScopeValue(topic.tenantId);\n let workspaceId = normalizeScopeValue(topic.workspaceId);\n\n if (tenantId && workspaceId) {\n return { tenantId, workspaceId };\n }\n\n let current: TopicDoc | null = topic;\n for (let i = 0; i < MAX_DEPTH && current?.parentTopicId; i++) {\n current = (await ctx.db.get(current.parentTopicId)) as TopicDoc | null;\n if (!current) break;\n\n if (!tenantId) {\n tenantId = normalizeScopeValue(current.tenantId);\n }\n if (!workspaceId) {\n workspaceId = normalizeScopeValue(current.workspaceId);\n }\n if (tenantId && workspaceId) break;\n }\n\n return { tenantId, workspaceId };\n}\n\nexport async function resolveTopicProjectScope(\n ctx: any,\n args: { topicId?: Id<\"topics\"> | string; projectId?: string },\n): Promise<TopicProjectScope> {\n if (args.topicId) {\n // Try direct lookup, fall back to the legacy mapped-project bridge\n let topic: TopicDoc | null = null;\n try {\n topic = (await ctx.db.get(\n args.topicId as Id<\"topics\">,\n )) as TopicDoc | null;\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to load topic by direct id\",\n {\n error,\n topicId: args.topicId,\n },\n );\n // Not a valid topics table ID\n }\n if (!topic) {\n topic = await tryResolveHostTopicById(ctx, String(args.topicId));\n }\n if (!topic) {\n // Try as legacy projectId / globalId via the mapped-project bridge.\n topic =\n pickPrimaryTopic(\n await findTopicsByScopeAlias(ctx, String(args.topicId)),\n ) ?? null;\n }\n if (!topic) {\n // RR.5: no legacy topics row — resolve the canonical topic node store\n // before throwing (silent-empty-result fix).\n const nodeScope = await resolveTopicNodeScopeOrNull(\n ctx,\n String(args.topicId),\n );\n if (nodeScope) {\n return nodeScope;\n }\n throw new Error(`Topic not found: ${String(args.topicId)}`);\n }\n const inherited = await resolveInheritedWorkspaceScope(ctx, topic);\n const mapped = asMappedProjectId(topic);\n if (mapped) {\n return {\n topicId: topic._id,\n projectId: mapped,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"topic\",\n };\n }\n return {\n topicId: topic._id,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"topic\",\n };\n }\n\n if (args.projectId) {\n let directTopic: TopicDoc | null = null;\n try {\n directTopic = (await ctx.db.get(\n args.projectId as Id<\"topics\">,\n )) as TopicDoc | null;\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to load direct project topic\",\n {\n error,\n projectId: args.projectId,\n },\n );\n // Not a valid topics table ID, continue to legacy graph-scope lookup.\n }\n\n if (directTopic) {\n const inherited = await resolveInheritedWorkspaceScope(ctx, directTopic);\n const mapped = asMappedProjectId(directTopic);\n return {\n topicId: directTopic._id,\n projectId: mapped ?? args.projectId,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"topic_inferred\",\n };\n }\n\n directTopic = await tryResolveHostTopicByLegacyScope(ctx, args.projectId);\n if (directTopic) {\n const inherited = await resolveInheritedWorkspaceScope(ctx, directTopic);\n const mapped = asMappedProjectId(directTopic);\n return {\n topicId: directTopic._id,\n projectId: mapped ?? args.projectId,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"topic_inferred\",\n };\n }\n\n const topics = await findTopicsByScopeAlias(ctx, args.projectId);\n const primary = pickPrimaryTopic(topics);\n if (primary) {\n const inherited = await resolveInheritedWorkspaceScope(ctx, primary);\n return {\n topicId: primary._id,\n projectId: args.projectId,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"project_mapped_topic\",\n };\n }\n // RR.5: try the canonical topic node store before failing.\n const nodeScope = await resolveTopicNodeScopeOrNull(\n ctx,\n String(args.projectId),\n );\n if (nodeScope) {\n return {\n ...nodeScope,\n projectId: nodeScope.projectId ?? String(args.projectId),\n };\n }\n\n throw new Error(\n `Legacy project scope ${String(args.projectId)} has no mapped topic.`,\n );\n }\n\n throw new Error(\n \"Missing scope: provide topicId (preferred) or legacy projectId alias.\",\n );\n}\n\n/** Shared scope args for graph-primitive functions. topicId is canonical; projectId is a legacy alias. */\nexport const optionalScopeArgs = {\n projectId: v.optional(v.string()),\n topicId: v.optional(v.string()),\n} as const;\n","/**\n * Entity↔Belief Bridge (OE-B)\n *\n * Query and mutation helpers for traversing entity↔belief connections\n * via the epistemic edge graph. Entities (ontological layer) connect to\n * beliefs/questions/themes (L3) and evidence (L2) through typed bridge edges.\n *\n * Bridge edge types:\n * - contains: Belief/Question/Theme → Entity (L3 → ontological), also Entity → Evidence (ontological → L2)\n * - evaluates: Deal → Company (L3 → ontological)\n * - perspective_on: Person → Belief/Theme (ontological → L3)\n * - impacts: Theme → ValueChain (L3 → ontological)\n * - mentioned_in: Entity → Source (ontological → L1)\n *\n * @module graph-primitives/entityBridge\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 } from \"./convex\";\nimport type { MutationCtx } from \"./convex\";\nimport { internal, mutation, query } from \"./convex\";\nimport { validateEdgeLayers } from \"./edgeValidation\";\nimport { getNodeLayer } from \"./graphTypes\";\nimport { readMaterializedTopicTableId } from \"./topicScope\";\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\n/** Edge types that bridge ontological ↔ epistemic layers */\nconst ENTITY_BRIDGE_EDGE_TYPES = [\n \"contains\",\n \"evaluates\",\n \"perspective_on\",\n \"impacts\",\n \"mentioned_in\",\n] as const;\n\n/** Edge types that connect ontological ↔ ontological */\nconst _ONTOLOGICAL_EDGE_TYPES = [\n \"works_at\",\n \"participates_in\",\n \"performs\",\n \"function_in\",\n \"invested_in\",\n \"raised_from\",\n \"founded_by\",\n \"competes_with\",\n \"contains\",\n \"derived_from\",\n] as const;\n\ntype BridgeNode = {\n _id: Id<\"epistemicNodes\">;\n globalId: string;\n nodeType: string;\n title?: string;\n canonicalText?: string;\n metadata?: Record<string, unknown>;\n status?: string;\n epistemicLayer?: string;\n projectId?: string;\n topicId?: string;\n};\n\ntype BridgeEdge = {\n edgeType: string;\n fromNodeId?: Id<\"epistemicNodes\">;\n toNodeId?: Id<\"epistemicNodes\">;\n weight?: number;\n context?: string;\n};\n\ntype IndexQuery = {\n eq(field: string, value: unknown): IndexQuery;\n};\n\n// =============================================================================\n// QUERIES\n// =============================================================================\n\n/**\n * Get all beliefs/questions/themes connected to an entity.\n * Traverses both directions:\n * - about_entity edges (L3 → entity): returns the L3 source nodes\n * - perspective_on edges (entity → L3): returns the L3 target nodes\n * - evaluates edges (L3 → entity): returns the L3 source nodes\n */\nexport const getBeliefsForEntity = query({\n args: {\n entityNodeId: v.id(\"epistemicNodes\"),\n edgeTypes: v.optional(v.array(v.string())),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const entity = await ctx.db.get(args.entityNodeId);\n if (!entity || entity.epistemicLayer !== \"ontological\") {\n return { beliefs: [], entity: null };\n }\n\n const filterTypes = args.edgeTypes || [\n \"contains\",\n \"evaluates\",\n \"perspective_on\",\n \"impacts\",\n ];\n\n // Edges TO this entity (contains, evaluates, impacts)\n const inboundEdges = (await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_to\", (q: IndexQuery) => q.eq(\"toNodeId\", args.entityNodeId))\n .collect()) as BridgeEdge[];\n\n // Edges FROM this entity (perspective_on)\n const outboundEdges = (await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from\", (q: IndexQuery) => q.eq(\"fromNodeId\", args.entityNodeId))\n .collect()) as BridgeEdge[];\n\n const beliefNodeIds = new Set<string>();\n const edgeMap: Record<\n string,\n { edgeType: string; weight?: number; context?: string }\n > = {};\n\n for (const edge of inboundEdges) {\n if (!filterTypes.includes(edge.edgeType as string) || !edge.fromNodeId) {\n continue;\n }\n const id = String(edge.fromNodeId);\n beliefNodeIds.add(id);\n edgeMap[id] = {\n edgeType: edge.edgeType,\n weight: edge.weight ?? undefined,\n context: edge.context ?? undefined,\n };\n }\n\n for (const edge of outboundEdges) {\n const et = edge.edgeType as string;\n if (\n !filterTypes.includes(et) ||\n !edge.toNodeId ||\n et === \"mentioned_in\"\n ) {\n continue;\n }\n const id = String(edge.toNodeId);\n beliefNodeIds.add(id);\n edgeMap[id] = {\n edgeType: edge.edgeType,\n weight: edge.weight ?? undefined,\n context: edge.context ?? undefined,\n };\n }\n\n // Hydrate belief nodes\n const beliefs = await Promise.all(\n [...beliefNodeIds].map(async (nodeId) => {\n const node = await ctx.db.get(nodeId as Id<\"epistemicNodes\">);\n if (!node || node.status !== \"active\") {\n return null;\n }\n return {\n ...node,\n _edge: edgeMap[nodeId],\n };\n })\n );\n\n return {\n beliefs: beliefs.filter(Boolean),\n entity: {\n _id: entity._id,\n globalId: entity.globalId,\n nodeType: entity.nodeType,\n title: entity.title,\n metadata: entity.metadata,\n },\n };\n },\n});\n\n/**\n * Get all entities connected to a belief/question/theme.\n * Traverses both directions:\n * - about_entity edges (belief → entity): returns the entity target nodes\n * - perspective_on edges (entity → belief): returns the entity source nodes\n * - evaluates edges (deal → entity): returns the entity target nodes\n */\nexport const getEntitiesForBelief = query({\n args: {\n beliefNodeId: v.id(\"epistemicNodes\"),\n edgeTypes: v.optional(v.array(v.string())),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const belief = await ctx.db.get(args.beliefNodeId);\n if (!belief) {\n return { entities: [], belief: null };\n }\n\n const filterTypes = args.edgeTypes || [\n \"contains\",\n \"evaluates\",\n \"perspective_on\",\n \"impacts\",\n ];\n\n // Edges FROM this belief (contains, evaluates, impacts)\n const outboundEdges = (await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from\", (q: IndexQuery) => q.eq(\"fromNodeId\", args.beliefNodeId))\n .collect()) as BridgeEdge[];\n\n // Edges TO this belief (perspective_on)\n const inboundEdges = (await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_to\", (q: IndexQuery) => q.eq(\"toNodeId\", args.beliefNodeId))\n .collect()) as BridgeEdge[];\n\n const entityNodeIds = new Set<string>();\n const edgeMap: Record<\n string,\n { edgeType: string; weight?: number; context?: string }\n > = {};\n\n for (const edge of outboundEdges) {\n if (!filterTypes.includes(edge.edgeType as string) || !edge.toNodeId) {\n continue;\n }\n const id = String(edge.toNodeId);\n entityNodeIds.add(id);\n edgeMap[id] = {\n edgeType: edge.edgeType,\n weight: edge.weight ?? undefined,\n context: edge.context ?? undefined,\n };\n }\n\n for (const edge of inboundEdges) {\n if (!filterTypes.includes(edge.edgeType as string) || !edge.fromNodeId) {\n continue;\n }\n const id = String(edge.fromNodeId);\n entityNodeIds.add(id);\n edgeMap[id] = {\n edgeType: edge.edgeType,\n weight: edge.weight ?? undefined,\n context: edge.context ?? undefined,\n };\n }\n\n // Hydrate entity nodes (filter to ontological only)\n const entities = await Promise.all(\n [...entityNodeIds].map(async (nodeId) => {\n const node = await ctx.db.get(nodeId as Id<\"epistemicNodes\">);\n if (\n !node ||\n node.status !== \"active\" ||\n node.epistemicLayer !== \"ontological\"\n ) {\n return null;\n }\n return {\n ...node,\n _edge: edgeMap[nodeId],\n };\n })\n );\n\n return {\n entities: entities.filter(Boolean),\n belief: {\n _id: belief._id,\n globalId: belief.globalId,\n nodeType: belief.nodeType,\n title: belief.title,\n canonicalText: belief.canonicalText,\n },\n };\n },\n});\n\n/**\n * Get the topic scope for an entity by traversing its belief connections.\n * Entities don't have direct topic scope — they inherit it through their\n * connected beliefs/themes. This enables topic-based entity discovery.\n */\nexport const getEntityTopicScope = query({\n args: {\n entityNodeId: v.id(\"epistemicNodes\"),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const entity = await ctx.db.get(args.entityNodeId);\n if (!entity || entity.epistemicLayer !== \"ontological\") {\n return { topics: [], projectIds: [] };\n }\n\n // Get all L3 nodes connected via bridge edges\n const inboundEdges = (await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_to\", (q: IndexQuery) => q.eq(\"toNodeId\", args.entityNodeId))\n .collect()) as BridgeEdge[];\n\n const outboundEdges = (await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from\", (q: IndexQuery) => q.eq(\"fromNodeId\", args.entityNodeId))\n .collect()) as BridgeEdge[];\n\n const connectedNodeIds = new Set<string>();\n\n for (const edge of inboundEdges) {\n if (\n ENTITY_BRIDGE_EDGE_TYPES.includes(\n edge.edgeType as (typeof ENTITY_BRIDGE_EDGE_TYPES)[number]\n ) &&\n edge.fromNodeId\n ) {\n connectedNodeIds.add(String(edge.fromNodeId));\n }\n }\n for (const edge of outboundEdges) {\n if (\n ENTITY_BRIDGE_EDGE_TYPES.includes(\n edge.edgeType as (typeof ENTITY_BRIDGE_EDGE_TYPES)[number]\n ) &&\n edge.toNodeId\n ) {\n connectedNodeIds.add(String(edge.toNodeId));\n }\n }\n\n // Collect unique projectIds and topicIds from connected nodes\n const projectIds = new Set<string>();\n const topicIds = new Set<string>();\n\n for (const nodeId of connectedNodeIds) {\n const node = await ctx.db.get(nodeId as Id<\"epistemicNodes\">);\n if (!node || node.status !== \"active\") {\n continue;\n }\n if (node.projectId) {\n projectIds.add(String(node.projectId));\n }\n if (node.topicId) {\n topicIds.add(String(node.topicId));\n }\n }\n\n // Also check contains edges from connected beliefs to topics\n for (const nodeId of connectedNodeIds) {\n const scopeEdges = (await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from\", (q: IndexQuery) =>\n q.eq(\"fromNodeId\", nodeId as Id<\"epistemicNodes\">)\n )\n .collect()) as BridgeEdge[];\n\n for (const edge of scopeEdges) {\n if (edge.edgeType === \"contains\" && edge.toNodeId) {\n const scopedTopicNode = await ctx.db.get(\n edge.toNodeId as Id<\"epistemicNodes\">\n );\n const canonicalTopicId = readMaterializedTopicTableId(\n scopedTopicNode as {\n _id: Id<\"epistemicNodes\">;\n metadata?: Record<string, unknown>;\n } | null\n );\n if (canonicalTopicId) {\n topicIds.add(canonicalTopicId);\n }\n }\n }\n }\n\n return {\n topics: [...topicIds],\n projectIds: [...projectIds],\n connectedNodeCount: connectedNodeIds.size,\n };\n },\n});\n\n/**\n * Get evidence nodes that reference an entity.\n * Uses entity_referenced_in edges (ontological → L2).\n */\nexport const getEvidenceForEntity = query({\n args: {\n entityNodeId: v.id(\"epistemicNodes\"),\n limit: v.optional(v.number()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const entity = await ctx.db.get(args.entityNodeId);\n if (!entity || entity.epistemicLayer !== \"ontological\") {\n return [];\n }\n\n const effectiveLimit = args.limit ?? 50;\n\n // contains: Entity → Evidence (outbound from entity)\n const outboundEdges = (await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from\", (q: IndexQuery) =>\n q.eq(\"fromNodeId\", args.entityNodeId)\n )\n .collect()) as BridgeEdge[];\n\n const evidenceEdges = outboundEdges.filter((e) => {\n const et = e.edgeType as string;\n return et === \"contains\" || et === \"mentioned_in\";\n });\n\n const results = await Promise.all(\n evidenceEdges.slice(0, effectiveLimit).map(async (edge) => {\n if (!edge.toNodeId) {\n return null;\n }\n const node = await ctx.db.get(edge.toNodeId);\n if (!node || node.status !== \"active\") {\n return null;\n }\n return {\n ...node,\n _edge: {\n edgeType: edge.edgeType,\n weight: edge.weight,\n context: edge.context,\n },\n };\n })\n );\n\n return results.filter(Boolean);\n },\n});\n\n// =============================================================================\n// MUTATIONS\n// =============================================================================\n\n/**\n * Link an entity to a belief/question/theme via about_entity edge.\n * Creates the edge through the Neo4j dual-write path.\n */\nexport const linkEntityToBelief = mutation({\n args: {\n entityNodeId: v.id(\"epistemicNodes\"),\n beliefNodeId: v.id(\"epistemicNodes\"),\n edgeType: v.optional(v.string()),\n weight: v.optional(v.number()),\n context: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx: MutationCtx, args) => {\n const userId = await getCurrentUserId(ctx);\n if (!userId) {\n throw new Error(\"Authentication required to create entity-belief links.\");\n }\n\n const entity = await ctx.db.get(args.entityNodeId);\n if (!entity || entity.epistemicLayer !== \"ontological\") {\n throw new Error(\"Source node must be an ontological entity.\");\n }\n\n const belief = await ctx.db.get(args.beliefNodeId);\n if (!belief) {\n throw new Error(\"Target belief/question/theme node not found.\");\n }\n if (!entity.globalId) {\n throw new Error(\"Source entity is missing a globalId.\");\n }\n if (!belief.globalId) {\n throw new Error(\n \"Target belief/question/theme node is missing a globalId.\"\n );\n }\n\n const effectiveEdgeType = args.edgeType || \"contains\";\n\n // Validate edge direction based on type\n const fromLayer = getNodeLayer(entity.nodeType);\n const toLayer = getNodeLayer(belief.nodeType);\n\n let fromNodeId: Id<\"epistemicNodes\">;\n let toNodeId: Id<\"epistemicNodes\">;\n let fromGlobalId: string;\n let toGlobalId: string;\n let fromNodeType: string;\n let toNodeType: string;\n let edgeFromLayer: string;\n let edgeToLayer: string;\n\n if (effectiveEdgeType === \"contains\" && entity.epistemicLayer === \"ontological\") {\n // contains: L3 → ontological (belief is source, entity is target)\n fromNodeId = args.beliefNodeId;\n toNodeId = args.entityNodeId;\n fromGlobalId = belief.globalId;\n toGlobalId = entity.globalId;\n fromNodeType = belief.nodeType;\n toNodeType = entity.nodeType;\n edgeFromLayer = getNodeLayer(belief.nodeType);\n edgeToLayer = \"ontological\";\n } else if (\n effectiveEdgeType === \"mentioned_in\" ||\n effectiveEdgeType === \"perspective_on\"\n ) {\n // These go ontological → epistemic\n fromNodeId = args.entityNodeId;\n toNodeId = args.beliefNodeId;\n fromGlobalId = entity.globalId;\n toGlobalId = belief.globalId;\n fromNodeType = entity.nodeType;\n toNodeType = belief.nodeType;\n edgeFromLayer = \"ontological\";\n edgeToLayer = getNodeLayer(belief.nodeType);\n } else {\n // For other edge types, use validation to determine direction\n const validation = validateEdgeLayers(\n effectiveEdgeType,\n fromLayer,\n toLayer\n );\n if (validation.valid) {\n fromNodeId = args.entityNodeId;\n toNodeId = args.beliefNodeId;\n fromGlobalId = entity.globalId;\n toGlobalId = belief.globalId;\n fromNodeType = entity.nodeType;\n toNodeType = belief.nodeType;\n edgeFromLayer = fromLayer;\n edgeToLayer = toLayer;\n } else {\n // Try reversed direction\n const reversed = validateEdgeLayers(\n effectiveEdgeType,\n toLayer,\n fromLayer\n );\n if (!reversed.valid) {\n throw new Error(\n `Edge type '${effectiveEdgeType}' is not valid between ${entity.nodeType} (${fromLayer}) and ${belief.nodeType} (${toLayer}): ${validation.reason}`\n );\n }\n // Reversed direction is valid\n fromNodeId = args.beliefNodeId;\n toNodeId = args.entityNodeId;\n fromGlobalId = belief.globalId;\n toGlobalId = entity.globalId;\n fromNodeType = belief.nodeType;\n toNodeType = entity.nodeType;\n edgeFromLayer = toLayer;\n edgeToLayer = fromLayer;\n }\n }\n\n // Check for duplicate edge\n const existing = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from_to\", (q) =>\n q.eq(\"fromNodeId\", fromNodeId).eq(\"toNodeId\", toNodeId)\n )\n .first();\n\n if (existing && existing.edgeType === effectiveEdgeType) {\n return { edgeId: existing._id, existed: true };\n }\n\n // Create via Neo4j dual-write path\n const globalId = `edge-${effectiveEdgeType}-${fromNodeId}-${toNodeId}-${Date.now()}`;\n\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.createEdge, {\n globalId,\n fromGlobalId,\n toGlobalId,\n edgeType: effectiveEdgeType,\n weight: args.weight ?? 1.0,\n context: args.context || `Entity-belief bridge: ${effectiveEdgeType}`,\n topicId:\n belief.projectId || entity.projectId\n ? String(belief.projectId || entity.projectId)\n : undefined,\n createdBy: userId,\n fromNodeType,\n toNodeType,\n fromLayer: edgeFromLayer,\n toLayer: edgeToLayer,\n });\n\n return { globalId, edgeType: effectiveEdgeType, existed: false };\n },\n});\n"]}
1
+ {"version":3,"sources":["../src/convex.ts","../src/graphTypes.ts","../src/edgeValidation.ts","../src/topicScope.ts","../src/entityBridge.ts"],"names":["v"],"mappings":"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","file":"entityBridge.js","sourcesContent":["import type { Doc as AccessControlDoc } from \"@lucern/access-control/convex\";\nimport {\n type UnsafeConvexAnyApi,\n unsafeConvexAnyApi,\n} from \"@lucern/contracts/convex/unsafeAnyApi\";\nimport {\n actionGeneric,\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\n// TODO(FR.11-structural): `api`/`internal`/`components` are `anyApi as any`\n// because this module source tree is bundled into the kernel host at deploy time\n// and has NO top-level Convex `_generated/` directory to import a typed surface\n// from. Every `api.*` / `internal.*` / string-literal cross-component ref in this\n// module (topicScope.ts, topicProjectOverlay.ts, questionEvidenceLinks.ts,\n// beliefEvidenceLinks*.ts, epistemicQuestions.helpers.ts) inherits `any` from\n// here. The fix is structural — generate a per-module typed surface or a shared\n// typed function-reference manifest (template: the typed `components.controlPlane`\n// in modules/control-plane/src/component/convex.ts and the\n// `KERNEL_API_REF_MANIFEST` pattern in packages/server-core/src/kernelApi.ts) —\n// owned by the FR.11 closing/synthesis pass, not a mechanical swap.\nconst unsafeApi = unsafeConvexAnyApi(\n \"graph-primitives top-level module bundle lacks a committed Convex _generated/api surface\"\n);\nexport const api = unsafeApi;\nexport const components =\n componentsGeneric() as unknown as UntypedFunctionReferenceSurface;\nexport const internal = unsafeApi;\n\ntype UntypedFunctionReferenceSurface = UnsafeConvexAnyApi;\ntype BoundaryValue = UntypedFunctionReferenceSurface[string];\n\nexport type TableNames = string;\nexport type Id<TableName extends TableNames = string> = GenericId<TableName>;\nexport type Doc<TableName extends TableNames = string> =\n AccessControlDoc<TableName>;\nexport type DataModel = Record<TableNames, unknown>;\ninterface IndexRangeBuilder {\n eq(fieldName: string, value: unknown): IndexRangeBuilder;\n field(fieldName: string): string;\n gt(fieldName: string, value: unknown): IndexRangeBuilder;\n gte(fieldName: string, value: unknown): IndexRangeBuilder;\n lt(fieldName: string, value: unknown): IndexRangeBuilder;\n lte(fieldName: string, value: unknown): IndexRangeBuilder;\n}\ninterface FilterBuilder {\n and(...clauses: unknown[]): FilterBuilder;\n eq(left: unknown, right: unknown): FilterBuilder;\n field(fieldName: string): string;\n gt(left: unknown, right: unknown): FilterBuilder;\n gte(left: unknown, right: unknown): FilterBuilder;\n lt(left: unknown, right: unknown): FilterBuilder;\n lte(left: unknown, right: unknown): FilterBuilder;\n neq(left: unknown, right: unknown): FilterBuilder;\n or(...clauses: unknown[]): FilterBuilder;\n [operator: string]: unknown;\n}\ninterface QueryInitializer<TableName extends TableNames> {\n collect(): Promise<Doc<TableName>[]>;\n filter(predicate: (q: FilterBuilder) => unknown): QueryInitializer<TableName>;\n first(): Promise<Doc<TableName> | null>;\n order(direction: \"asc\" | \"desc\"): QueryInitializer<TableName>;\n take(limit: number): Promise<Doc<TableName>[]>;\n unique(): Promise<Doc<TableName> | null>;\n withIndex(\n indexName: string,\n range?: (q: IndexRangeBuilder) => unknown\n ): QueryInitializer<TableName>;\n withSearchIndex(\n indexName: string,\n search?: (q: IndexRangeBuilder) => unknown\n ): QueryInitializer<TableName>;\n}\nexport interface DatabaseReader {\n get<TableName extends TableNames>(\n id: unknown\n ): Promise<Doc<TableName> | null>;\n normalizeId?<TableName extends TableNames>(\n tableName: TableName,\n id: string\n ): Id<TableName> | null;\n query<TableName extends TableNames>(\n tableName: TableName\n ): QueryInitializer<TableName>;\n}\nexport type DatabaseWriter = DatabaseReader & {\n insert<TableName extends TableNames>(\n tableName: TableName,\n value: Record<string, unknown>\n ): Promise<Id<TableName>>;\n patch<TableName extends TableNames>(\n id: Id<TableName>,\n value: Record<string, unknown>\n ): Promise<void>;\n replace<TableName extends TableNames>(\n id: Id<TableName>,\n value: Record<string, unknown>\n ): Promise<void>;\n delete<TableName extends TableNames>(id: Id<TableName>): Promise<void>;\n};\ninterface Scheduler {\n runAfter(\n delayMs: number,\n functionReference: unknown,\n args?: unknown\n ): Promise<void>;\n}\ninterface AuthReader {\n getUserIdentity(): Promise<{\n readonly subject: string;\n readonly [claimName: string]: unknown;\n } | null>;\n}\ninterface RuntimeInvoker {\n runAction<Result = unknown>(\n functionReference: unknown,\n args?: unknown\n ): Promise<Result>;\n runMutation<Result = unknown>(\n functionReference: unknown,\n args?: unknown\n ): Promise<Result>;\n runQuery<Result = unknown>(\n functionReference: unknown,\n args?: unknown\n ): Promise<Result>;\n}\nexport type QueryCtx = RuntimeInvoker & {\n auth: AuthReader;\n db: DatabaseReader;\n scheduler: Scheduler;\n};\nexport type MutationCtx = RuntimeInvoker & {\n auth: AuthReader;\n db: DatabaseWriter;\n scheduler: Scheduler;\n};\nexport type ActionCtx = RuntimeInvoker & {\n auth: AuthReader;\n scheduler: Scheduler;\n};\n\ntype ConvexFunctionBuilder<Ctx> = <\n Args = BoundaryValue,\n Result = BoundaryValue,\n>(definition: {\n args?: unknown;\n handler: (ctx: Ctx, args: Args) => Result;\n returns?: unknown;\n}) => unknown;\n\ntype OptionalHandlerConvexFunctionBuilder<Ctx> = <\n Args = BoundaryValue,\n Result = BoundaryValue,\n>(definition: {\n args?: unknown;\n handler?: (ctx: Ctx, args: Args) => Result;\n returns?: unknown;\n}) => unknown;\n\nexport const action =\n actionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const httpAction =\n httpActionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const internalAction =\n internalActionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const internalMutation =\n internalMutationGeneric as unknown as OptionalHandlerConvexFunctionBuilder<MutationCtx>;\nexport const internalQuery =\n internalQueryGeneric as unknown as OptionalHandlerConvexFunctionBuilder<QueryCtx>;\nexport const mutation =\n mutationGeneric as unknown as ConvexFunctionBuilder<MutationCtx>;\nexport const query = queryGeneric as unknown as ConvexFunctionBuilder<QueryCtx>;\n","// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\n/**\n * Graph Type Registry for Convex\n *\n * This file mirrors the canonical type registry at lib/ontology/types.ts\n * but is compatible with Convex's bundling requirements.\n *\n * IMPORTANT: Keep this file in sync with lib/ontology/types.ts\n * The frontend uses lib/ontology/types.ts, Convex uses this file.\n *\n * @see /docs/architecture/UNIFIED_GRAPH_ARCHITECTURE.md\n */\n\n// =============================================================================\n// EPISTEMIC LAYERS\n// =============================================================================\n\nexport type EpistemicLayer =\n | \"L4\"\n | \"L3\"\n | \"L2\"\n | \"L1\"\n | \"ontological\"\n | \"organizational\";\n\n// =============================================================================\n// NODE TYPE TO LABEL MAPPING\n// =============================================================================\n\nexport const NODE_TYPE_TO_LABEL: Record<string, string> = {\n // L4: Audit Targets\n decision: \"Decision\",\n\n // L3: Traversal Anchors\n belief: \"Belief\",\n question: \"Question\",\n theme: \"Theme\",\n deal: \"Deal\",\n topic: \"Topic\",\n\n // L2: Compression Boundary\n claim: \"Claim\",\n evidence: \"Evidence\",\n synthesis: \"Synthesis\",\n answer: \"Answer\",\n\n // L1: Terminal Leaves\n atomic_fact: \"AtomicFact\",\n excerpt: \"Excerpt\",\n source: \"Source\",\n\n // Ontological (Neo4j is SOT)\n company: \"Company\",\n person: \"Person\",\n investor: \"Investor\",\n function: \"Function\",\n value_chain: \"ValueChain\",\n};\n\n// =============================================================================\n// EDGE TYPE TO NEO4J RELATIONSHIP MAPPING\n// =============================================================================\n\n/**\n * Epistemic Kernel v2: 6 canonical edge types + ontological edges.\n *\n * Weight and metadata carry nuance that previously required 67 separate type strings.\n * See: docs/architecture/epistemic-kernel-v2.md\n */\nexport const EDGE_TYPE_TO_REL: Record<string, string> = {\n // === THE SIX CANONICAL EPISTEMIC EDGE TYPES ===\n supports: \"SUPPORTS\", // L3↔L3: belief bears on belief (weight -1 to +1)\n informs: \"INFORMS\", // L2→L3: evidence bears on belief\n depends_on: \"DEPENDS_ON\", // L3→L3, Q→Q: structural gate\n derived_from: \"DERIVED_FROM\", // Any→Any: provenance chain (fork, synthesis, extraction, answer)\n contains: \"CONTAINS\", // Any→Any: hierarchy, scoping, membership\n tests: \"TESTS\", // Q→L3: question interrogates belief\n\n // === L4 DECISION EDGES (derived_from with derivationType=decision) ===\n // Kept as separate Neo4j relationship types for backward compat with L4 queries.\n // New code should use derived_from + metadata.\n based_on_belief: \"BASED_ON_BELIEF\",\n based_on_question: \"BASED_ON_QUESTION\",\n blocked_by_contradiction: \"BLOCKED_BY_CONTRADICTION\",\n informed_by_theme: \"INFORMED_BY_THEME\",\n\n // === ONTOLOGICAL EDGES (tenant-extensible, managed by ontology system) ===\n works_at: \"WORKS_AT\",\n invested_in: \"INVESTED_IN\",\n competes_with: \"COMPETES_WITH\",\n participates_in: \"PARTICIPATES_IN\",\n founded_by: \"FOUNDED_BY\",\n evaluates: \"EVALUATES\",\n performs: \"PERFORMS\",\n function_in: \"FUNCTION_IN\",\n impacts: \"IMPACTS\",\n raised_from: \"RAISED_FROM\",\n mentioned_in: \"MENTIONED_IN\",\n perspective_on: \"PERSPECTIVE_ON\",\n about_entity: \"ABOUT_ENTITY\",\n entity_referenced_in: \"ENTITY_REFERENCED_IN\",\n};\n\n// =============================================================================\n// HELPER FUNCTIONS\n// =============================================================================\n\n/**\n * Get the epistemic layer for a node type\n */\nexport function getNodeLayer(nodeType: string): EpistemicLayer {\n const L4_TYPES = [\"decision\"];\n const L3_TYPES = [\"belief\", \"question\", \"theme\", \"deal\"];\n const L2_TYPES = [\"claim\", \"evidence\", \"synthesis\", \"answer\"];\n const L1_TYPES = [\"atomic_fact\", \"excerpt\", \"source\"];\n const ONTOLOGICAL_TYPES = [\n \"company\",\n \"person\",\n \"investor\",\n \"function\",\n \"value_chain\",\n ];\n const ORGANIZATIONAL_TYPES = [\"topic\"];\n\n if (L4_TYPES.includes(nodeType)) {\n return \"L4\";\n }\n if (L3_TYPES.includes(nodeType)) {\n return \"L3\";\n }\n if (L2_TYPES.includes(nodeType)) {\n return \"L2\";\n }\n if (L1_TYPES.includes(nodeType)) {\n return \"L1\";\n }\n if (ONTOLOGICAL_TYPES.includes(nodeType)) {\n return \"ontological\";\n }\n if (ORGANIZATIONAL_TYPES.includes(nodeType)) {\n return \"organizational\";\n }\n\n // Unknown types default to L2\n console.warn(`[GraphTypes] Unknown nodeType \"${nodeType}\", defaulting to L2`);\n return \"L2\";\n}\n\n/**\n * Get the Neo4j label for a node type\n */\nexport function getNeo4jLabel(nodeType: string): string {\n return (\n NODE_TYPE_TO_LABEL[nodeType] ||\n nodeType.charAt(0).toUpperCase() + nodeType.slice(1)\n );\n}\n\n/**\n * Get the Neo4j relationship type for an edge type\n */\nexport function getNeo4jRelType(edgeType: string): string {\n return EDGE_TYPE_TO_REL[edgeType] || edgeType.toUpperCase();\n}\n\n/**\n * The 6 canonical epistemic edge types (Kernel v2).\n * Anything not in this set or the ontological/L4 sets is deprecated.\n */\nconst CANONICAL_EPISTEMIC_TYPES = new Set([\n \"supports\",\n \"informs\",\n \"depends_on\",\n \"derived_from\",\n \"contains\",\n \"tests\",\n]);\n\n/**\n * Check if an edge type is deprecated.\n *\n * Kernel v2: only the 6 canonical epistemic types, L4 decision types,\n * and ontological types are active. All legacy types (67 old types) are deprecated.\n */\nexport function isDeprecatedEdgeType(edgeType: string): boolean {\n // Canonical epistemic types are NOT deprecated\n if (CANONICAL_EPISTEMIC_TYPES.has(edgeType)) {\n return false;\n }\n // Types in the EDGE_TYPE_TO_REL map (ontological + L4) are NOT deprecated\n if (edgeType in EDGE_TYPE_TO_REL) {\n return false;\n }\n // Everything else is a legacy type\n return true;\n}\n","/**\n * edgeValidation module implementation.\n */\n\n// biome-ignore-all lint/style/useFilenamingConvention: Public package path is part of a stable ABI; renaming requires an export-map migration.\n\nimport type { EpistemicLayer } from \"./graphTypes\";\n\nexport type { EpistemicLayer } from \"./graphTypes\";\n// biome-ignore lint/performance/noBarrelFile: Public compatibility module.\nexport { isDeprecatedEdgeType } from \"./graphTypes\";\n\nconst VALID_LAYER_CONNECTIONS: Record<\n EpistemicLayer,\n ReadonlySet<EpistemicLayer>\n> = {\n ontological: new Set([\"ontological\", \"L1\", \"L2\", \"L3\"]),\n L1: new Set([\"L1\", \"L2\"]),\n L2: new Set([\"L1\", \"L2\", \"L3\", \"ontological\"]),\n L3: new Set([\"L2\", \"L3\", \"L4\", \"ontological\", \"organizational\"]),\n L4: new Set([\"L3\", \"L4\"]),\n organizational: new Set([\"organizational\", \"L3\"]),\n};\n\nfunction getLayerDepth(layer: EpistemicLayer): number {\n switch (layer) {\n case \"L4\":\n return 4;\n case \"L3\":\n return 3;\n case \"L2\":\n return 2;\n case \"L1\":\n return 1;\n case \"ontological\":\n return 0;\n default:\n return -1;\n }\n}\n\nfunction isValidLayerConnection(\n fromLayer: EpistemicLayer,\n toLayer: EpistemicLayer\n): boolean {\n if (!VALID_LAYER_CONNECTIONS[fromLayer].has(toLayer)) {\n return false;\n }\n\n if (fromLayer === \"ontological\" || toLayer === \"ontological\") {\n return true;\n }\n\n if (fromLayer === \"organizational\" || toLayer === \"organizational\") {\n return true;\n }\n\n const fromDepth = getLayerDepth(fromLayer);\n const toDepth = getLayerDepth(toLayer);\n if (Math.abs(fromDepth - toDepth) > 1) {\n return false;\n }\n return true;\n}\n\nexport type TraversalMode =\n | \"anchor_down\"\n | \"anchor_up\"\n | \"same_layer\"\n | \"decision_trace\";\n\nexport function shouldContinueTraversal(\n currentLayer: EpistemicLayer,\n targetLayer: EpistemicLayer,\n options: {\n mode: TraversalMode;\n minLayer?: number;\n maxLayer?: number;\n }\n): boolean {\n const currentDepth = getLayerDepth(currentLayer);\n const targetDepth = getLayerDepth(targetLayer);\n\n if (options.minLayer !== undefined && targetDepth < options.minLayer) {\n return false;\n }\n if (options.maxLayer !== undefined && targetDepth > options.maxLayer) {\n return false;\n }\n\n switch (options.mode) {\n case \"anchor_down\":\n return targetDepth <= currentDepth;\n case \"anchor_up\":\n return targetDepth >= currentDepth;\n case \"same_layer\":\n return targetDepth === currentDepth;\n case \"decision_trace\":\n return currentDepth === 4\n ? targetDepth === 3\n : targetDepth === currentDepth;\n default:\n return true;\n }\n}\n\nexport function getDefaultMinLayer(mode: TraversalMode): number {\n switch (mode) {\n case \"anchor_down\":\n return 1;\n case \"anchor_up\":\n return 2;\n case \"same_layer\":\n return 1;\n case \"decision_trace\":\n return 3;\n default:\n return 1;\n }\n}\n\nexport const EDGE_LAYER_RULES: Record<\n string,\n { from: EpistemicLayer[]; to: EpistemicLayer[]; description: string }\n> = {\n // === 6 Canonical Epistemic Types ===\n supports: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Belief bears on Belief (weight: +1 supports, -1 contradicts)\",\n },\n informs: {\n from: [\"L2\"],\n to: [\"L3\"],\n description: \"Evidence -> Belief (L2 -> L3)\",\n },\n depends_on: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Belief B requires Belief A (structural gate)\",\n },\n derived_from: {\n from: [\"L2\", \"L3\", \"L4\"],\n to: [\"L1\", \"L2\", \"L3\"],\n description: \"A was produced from B (provenance chain)\",\n },\n contains: {\n from: [\"L3\", \"L4\", \"ontological\"],\n to: [\"L2\", \"L3\", \"ontological\"],\n description: \"A scopes/aggregates B (hierarchy)\",\n },\n tests: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Question -> Belief (L3 -> L3)\",\n },\n\n // === Structural / Lifecycle ===\n supersedes: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"NewNode -> OldNode (fork lineage)\",\n },\n responds_to: {\n from: [\"L2\", \"L3\"],\n to: [\"L3\"],\n description: \"Answer -> Question (L2/L3 -> L3)\",\n },\n belongs_to: {\n from: [\"L2\", \"L3\", \"ontological\"],\n to: [\"L3\"],\n description: \"Membership (migrating to contains)\",\n },\n relates_to_thesis: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Belief -> Theme (L3 -> L3)\",\n },\n\n // === Ontological (entity-entity or entity-epistemic bridge) ===\n works_at: {\n from: [\"ontological\"],\n to: [\"ontological\"],\n description: \"Person -> Company\",\n },\n invested_in: {\n from: [\"ontological\"],\n to: [\"ontological\"],\n description: \"Investor -> Company\",\n },\n competes_with: {\n from: [\"ontological\"],\n to: [\"ontological\"],\n description: \"Company -> Company\",\n },\n participates_in: {\n from: [\"ontological\"],\n to: [\"ontological\"],\n description: \"Company -> ValueChain\",\n },\n founded_by: {\n from: [\"ontological\"],\n to: [\"ontological\"],\n description: \"Company -> Person\",\n },\n evaluates: {\n from: [\"ontological\"],\n to: [\"ontological\"],\n description: \"Deal -> Company\",\n },\n performs: {\n from: [\"ontological\"],\n to: [\"ontological\"],\n description: \"Company -> Function\",\n },\n function_in: {\n from: [\"ontological\"],\n to: [\"ontological\"],\n description: \"Function -> ValueChain\",\n },\n impacts: {\n from: [\"ontological\", \"L3\"],\n to: [\"ontological\"],\n description: \"Theme/Entity -> ValueChain\",\n },\n raised_from: {\n from: [\"ontological\"],\n to: [\"ontological\"],\n description: \"Company -> Investor\",\n },\n mentioned_in: {\n from: [\"ontological\"],\n to: [\"L1\", \"L2\"],\n description: \"Entity -> Source/Evidence\",\n },\n perspective_on: {\n from: [\"ontological\"],\n to: [\"L3\"],\n description: \"Person -> Belief/Theme\",\n },\n plays_theme: {\n from: [\"ontological\"],\n to: [\"L3\"],\n description: \"Deal -> Theme\",\n },\n\n // C2-RR.4 — storage migration alias + the remaining 55 reachable edge types.\n // Mirrors the kernel rule table\n // (packages/reasoning-kernel/src/adapters/lib/edgeValidation.ts) so this\n // graph-primitives write path admits the same public edge vocabulary. See the\n // kernel file for the per-group rationale.\n extracted_from: {\n from: [\"L2\", \"L3\", \"L4\"],\n to: [\"L1\", \"L2\", \"L3\"],\n description:\n \"Legacy storage migration alias for derived_from; public writes use derived_from\",\n },\n qualifies: {\n from: [\"L2\", \"L3\"],\n to: [\"L3\"],\n description: \"Evidence/Belief qualifies a Belief\",\n },\n contradicts: {\n from: [\"L2\", \"L3\"],\n to: [\"L3\"],\n description: \"Evidence/Belief contradicts a Belief\",\n },\n reinforces: {\n from: [\"L2\", \"L3\"],\n to: [\"L3\"],\n description: \"Evidence/Belief reinforces a Belief\",\n },\n corroborates: {\n from: [\"L2\", \"L3\"],\n to: [\"L3\"],\n description: \"Independent evidence/belief corroborates a Belief\",\n },\n strengthened_by: {\n from: [\"L3\"],\n to: [\"L2\", \"L3\"],\n description: \"Belief is strengthened by Evidence/Belief\",\n },\n weakened_by: {\n from: [\"L3\"],\n to: [\"L2\", \"L3\"],\n description: \"Belief is weakened by Evidence/Belief\",\n },\n validated_by: {\n from: [\"L3\"],\n to: [\"L2\", \"L3\"],\n description: \"Belief is validated by Evidence/Belief\",\n },\n falsified_by: {\n from: [\"L3\"],\n to: [\"L2\", \"L3\"],\n description: \"Belief is falsified by Evidence/Belief\",\n },\n amplifies: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Belief amplifies another Belief\",\n },\n precondition_for: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Belief is a precondition for another Belief\",\n },\n prerequisite_for: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Belief is a prerequisite for another Belief\",\n },\n required_for: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Belief is required for another Belief\",\n },\n in_tension_with: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Belief is in tension with another Belief\",\n },\n mutually_exclusive: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Beliefs cannot both hold\",\n },\n exclusive_with: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Belief is exclusive with another Belief\",\n },\n alternative_to: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Belief is an alternative to another Belief\",\n },\n subsumes: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Belief subsumes a narrower Belief\",\n },\n extends: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Belief extends another Belief\",\n },\n refines: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Belief refines another Belief\",\n },\n implements: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Belief implements an abstract Belief\",\n },\n violates: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Belief violates a constraint Belief\",\n },\n assumes: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Belief assumes another Belief\",\n },\n would_predict: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Belief would predict another Belief\",\n },\n analogous_to: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Belief is analogous to another Belief\",\n },\n independent_of: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Belief is independent of another Belief\",\n },\n correlates_with: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Belief correlates with another Belief\",\n },\n co_changes_with: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Belief co-changes with another Belief\",\n },\n counterfactual_of: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Belief is a counterfactual of another Belief\",\n },\n parallel_to: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Belief runs parallel to another Belief\",\n },\n cascade_from: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Cascade from an upstream Belief\",\n },\n cascade_to: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Cascade to a downstream Belief\",\n },\n collapses_if: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Belief collapses if another fails\",\n },\n branches_from: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Belief branches from an ancestor Belief\",\n },\n same_as: {\n from: [\"L2\", \"L3\", \"ontological\"],\n to: [\"L2\", \"L3\", \"ontological\"],\n description: \"Two nodes are the same entity\",\n },\n answers: {\n from: [\"L2\", \"L3\"],\n to: [\"L3\"],\n description: \"Answer/Belief answers a Question\",\n },\n partially_answers: {\n from: [\"L2\", \"L3\"],\n to: [\"L3\"],\n description: \"Answer/Belief partially answers a Question\",\n },\n explores: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Question explores a Belief/Theme\",\n },\n informed_by_theme: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Belief is informed by a Theme\",\n },\n same_theme_as: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Two Beliefs share a Theme\",\n },\n based_on: {\n from: [\"L4\"],\n to: [\"L3\"],\n description: \"Decision is based on a Belief/Question\",\n },\n based_on_belief: {\n from: [\"L4\"],\n to: [\"L3\"],\n description: \"Decision is based on a Belief\",\n },\n based_on_question: {\n from: [\"L4\"],\n to: [\"L3\"],\n description: \"Decision is based on a Question\",\n },\n blocked_by_contradiction: {\n from: [\"L4\"],\n to: [\"L3\"],\n description: \"Decision is blocked by a Contradiction\",\n },\n parent_of: {\n from: [\"L3\", \"L4\", \"ontological\", \"organizational\"],\n to: [\"L2\", \"L3\", \"ontological\", \"organizational\"],\n description: \"A is the parent of B\",\n },\n child_of: {\n from: [\"L2\", \"L3\", \"ontological\", \"organizational\"],\n to: [\"L3\", \"L4\", \"ontological\", \"organizational\"],\n description: \"A is the child of B\",\n },\n scoped_by: {\n from: [\"L2\", \"L3\"],\n to: [\"L3\", \"organizational\"],\n description: \"Object is scoped by a Topic/Theme\",\n },\n cites: {\n from: [\"L2\", \"L3\"],\n to: [\"L1\", \"L2\"],\n description: \"Evidence/Belief cites a Source/Excerpt\",\n },\n summarizes: {\n from: [\"L2\", \"L3\"],\n to: [\"L1\", \"L2\"],\n description: \"Synthesis/Evidence summarizes a Source/Evidence\",\n },\n same_source_as: {\n from: [\"L1\", \"L2\"],\n to: [\"L1\", \"L2\"],\n description: \"Two nodes derive from the same Source\",\n },\n migrating_from: {\n from: [\"L2\", \"L3\", \"L4\"],\n to: [\"L1\", \"L2\", \"L3\"],\n description: \"Migration lineage: from an ancestor\",\n },\n migrating_to: {\n from: [\"L1\", \"L2\", \"L3\"],\n to: [\"L2\", \"L3\", \"L4\"],\n description: \"Migration lineage: to a successor\",\n },\n about_entity: {\n from: [\"L2\", \"L3\"],\n to: [\"ontological\"],\n description: \"Belief/Evidence is about an Entity\",\n },\n entity_referenced_in: {\n from: [\"ontological\"],\n to: [\"L1\", \"L2\"],\n description: \"Entity is referenced in a Source/Evidence\",\n },\n related_to: {\n from: [\"L2\", \"L3\", \"ontological\", \"organizational\"],\n to: [\"L2\", \"L3\", \"ontological\", \"organizational\"],\n description: \"Lateral adjacency; no confidence pressure\",\n },\n blocks: {\n from: [\"L3\", \"L4\"],\n to: [\"L3\", \"L4\"],\n description: \"A blocks B (structural gate)\",\n },\n};\n\nexport function validateEdgeLayers(\n edgeType: string,\n fromLayer: EpistemicLayer,\n toLayer: EpistemicLayer\n): { valid: boolean; reason?: string } {\n const rules = EDGE_LAYER_RULES[edgeType];\n\n if (!rules) {\n console.warn(\n `[EdgeValidation] Unknown edge type: ${edgeType}, allowing by default`\n );\n return { valid: true };\n }\n\n if (edgeType === \"supersedes\") {\n if (fromLayer !== toLayer) {\n return {\n valid: false,\n reason: `${edgeType} edges must be between nodes of the same layer. Got ${fromLayer} -> ${toLayer}`,\n };\n }\n return { valid: true };\n }\n\n if (!rules.from.includes(fromLayer)) {\n return {\n valid: false,\n reason: `Edge type '${edgeType}' does not allow source layer ${fromLayer}. Allowed: ${rules.from.join(\", \")}`,\n };\n }\n\n if (!rules.to.includes(toLayer)) {\n return {\n valid: false,\n reason: `Edge type '${edgeType}' does not allow target layer ${toLayer}. Allowed: ${rules.to.join(\", \")}`,\n };\n }\n\n if (!isValidLayerConnection(fromLayer, toLayer)) {\n return {\n valid: false,\n reason: `Layer transition ${fromLayer} -> ${toLayer} is not permitted`,\n };\n }\n\n return { valid: true };\n}\n","// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\n/** Topic-scope resolution helpers for graph-primitive operations. */\nimport { v } from \"convex/values\";\nimport type { Id } from \"./convex\";\nimport { api as appApi } from \"./convex\";\nimport { debugGraphPrimitiveFallback } from \"./debug\";\n\nconst LEGACY_SCOPE_FIELD = \"graphScopeProjectId\";\n\ntype UnknownRecord = Record<string, unknown>;\n\ninterface TopicScopeContext {\n db: {\n get(id: string): Promise<unknown>;\n query(tableName: string): TopicScopeQuery;\n };\n runQuery?: <TResult>(fnRef: unknown, args: unknown) => Promise<TResult>;\n}\n\ninterface TopicScopeQuery {\n collect(): Promise<unknown[]>;\n first(): Promise<unknown | null>;\n withIndex(\n indexName: string,\n range?: (q: TopicScopeIndexRangeBuilder) => unknown\n ): TopicScopeQuery;\n}\n\ninterface TopicScopeIndexRangeBuilder {\n eq(field: string, value: unknown): TopicScopeIndexRangeBuilder;\n}\n\ntype TopicDoc = Record<string, unknown> & {\n _id: Id<\"topics\">;\n globalId?: string;\n name?: string;\n depth?: number;\n createdAt?: number;\n parentTopicId?: Id<\"topics\">;\n tenantId?: string;\n workspaceId?: string;\n metadata?: Record<string, unknown>;\n};\n\nexport interface TopicProjectScope {\n projectId?: string;\n source: \"topic\" | \"project_mapped_topic\" | \"topic_inferred\" | \"topic_node\";\n tenantId?: string;\n topicId: Id<\"topics\">;\n workspaceId?: string;\n}\n\n/**\n * RR.5 (legacy topics-table retirement) — graph-primitives mirror of the\n * kernel's epistemicNodes-first topic-scope fallback. Kept in lockstep with\n * `packages/reasoning-kernel/src/adapters/lib/topicScope.ts`\n * (`tests/unit/convex/topic-scope-fallbacks.test.ts` asserts parity).\n *\n * Resolves a topic that exists only as `epistemicNodes(nodeType=\"topic\")` —\n * the write-of-record — when no legacy `topics` row backs the ref, returning the\n * node's `topicId` self-key so scoped beliefs/evidence/questions stay reachable.\n * See the kernel module for the full silent-empty-result rationale.\n */\ninterface TopicNodeScopeDoc {\n _id: string | Id<\"epistemicNodes\">;\n globalId?: string;\n metadata?: UnknownRecord;\n nodeType?: string;\n topicId?: string;\n}\n\nasync function resolveTopicNodeScopeOrNull(\n ctx: TopicScopeContext,\n ref: string\n): Promise<TopicProjectScope | null> {\n if (!ctx?.db || typeof ctx.db.query !== \"function\") {\n return null;\n }\n\n let node: TopicNodeScopeDoc | null = null;\n\n // 1. The ref IS the topic node's UUIDv7 globalId.\n try {\n const byGlobalId = (await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_globalId\", (q) => q.eq(\"globalId\", ref))\n .first()) as TopicNodeScopeDoc | null;\n if (byGlobalId && byGlobalId.nodeType === \"topic\") {\n node = byGlobalId;\n }\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] topic-node scope lookup by globalId failed\",\n { error, ref }\n );\n }\n\n if (!node) {\n return null;\n }\n\n const scopeKey =\n normalizeScopeValue(node.topicId) ?? normalizeScopeValue(node.globalId);\n if (!scopeKey) {\n return null;\n }\n\n return {\n topicId: scopeKey as Id<\"topics\">,\n projectId: asMappedProjectId(node),\n source: \"topic_node\",\n };\n}\n\ninterface MaterializedTopicNodeDoc {\n _id: string | Id<\"epistemicNodes\">;\n metadata?: Record<string, unknown>;\n}\n\nfunction asMappedProjectId(\n topic: Pick<TopicDoc, \"metadata\"> | TopicNodeScopeDoc | null | undefined\n): string | undefined {\n if (!topic) {\n return;\n }\n const directLegacyProjectId = normalizeScopeValue(\n (topic as UnknownRecord)[LEGACY_SCOPE_FIELD]\n );\n if (directLegacyProjectId) {\n return directLegacyProjectId;\n }\n const metadata = topic.metadata || {};\n const candidate =\n (metadata as UnknownRecord)[LEGACY_SCOPE_FIELD] ||\n (metadata as UnknownRecord).legacyProjectId ||\n (metadata as UnknownRecord).projectId ||\n (metadata as UnknownRecord).scopeProjectId;\n return typeof candidate === \"string\"\n ? normalizeScopeValue(candidate)\n : undefined;\n}\n\nfunction normalizeScopeValue(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return;\n }\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction pickPrimaryTopic(candidates: TopicDoc[]): TopicDoc | undefined {\n return [...candidates].sort((a, b) => {\n const depthA = a.depth ?? 9999;\n const depthB = b.depth ?? 9999;\n if (depthA !== depthB) {\n return depthA - depthB;\n }\n const createdA = a.createdAt ?? Number.MAX_SAFE_INTEGER;\n const createdB = b.createdAt ?? Number.MAX_SAFE_INTEGER;\n if (createdA !== createdB) {\n return createdA - createdB;\n }\n return String(a.name || \"\").localeCompare(String(b.name || \"\"));\n })[0];\n}\n\nasync function findTopicsByScopeAlias(\n ctx: TopicScopeContext,\n scopeId: string\n): Promise<TopicDoc[]> {\n const query = ctx.db.query(\"topics\") as TopicScopeQuery;\n try {\n return (await query\n .withIndex(\"by_graph_scope_project\", (q) =>\n q.eq(LEGACY_SCOPE_FIELD, scopeId)\n )\n .collect()) as TopicDoc[];\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to resolve scope alias via index\",\n {\n error,\n scopeId,\n }\n );\n // Older Lucern dev deployments can lag index backfills while still carrying\n // the underlying topics table. Scan and filter so scope resolution keeps\n // working during the rollout.\n const topics = (await query.collect()) as TopicDoc[];\n return topics.filter((topic) => {\n const normalizedGlobalId = normalizeScopeValue(topic.globalId);\n const mappedProjectId = asMappedProjectId(topic);\n return (\n String(topic._id) === scopeId ||\n normalizedGlobalId === scopeId ||\n mappedProjectId === scopeId\n );\n });\n }\n}\n\nasync function tryResolveHostTopicById(\n ctx: TopicScopeContext,\n topicId: string\n): Promise<TopicDoc | null> {\n if (typeof ctx.runQuery !== \"function\") {\n return null;\n }\n try {\n return ((await ctx.runQuery(appApi.topics.get, {\n id: topicId,\n })) ?? null) as TopicDoc | null;\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to resolve topic by host query\",\n {\n error,\n topicId,\n }\n );\n return null;\n }\n}\n\nasync function tryResolveHostTopicByLegacyScope(\n ctx: TopicScopeContext,\n legacyScopeId: string\n): Promise<TopicDoc | null> {\n if (typeof ctx.runQuery !== \"function\") {\n return null;\n }\n try {\n return ((await ctx.runQuery(appApi.topics.getByLegacyScopeId, {\n projectId: legacyScopeId,\n })) ?? null) as TopicDoc | null;\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to resolve topic by legacy scope\",\n {\n error,\n legacyScopeId,\n }\n );\n return null;\n }\n}\n\nexport function readMaterializedTopicTableId(\n topicNode: MaterializedTopicNodeDoc | null | undefined\n): string | undefined {\n if (!topicNode) {\n return;\n }\n\n const metadata = (topicNode.metadata || {}) as Record<string, unknown>;\n const topicTableId =\n (metadata.topicTableId as string | undefined) ||\n (metadata.topicId as string | undefined);\n\n return typeof topicTableId === \"string\" && topicTableId.trim().length > 0\n ? topicTableId.trim()\n : undefined;\n}\n\n/**\n * Walk the topic parent chain to find inherited workspaceId and tenantId.\n * Mirrors the pattern used by resolveTopicOntology for ontologyId inheritance.\n * Max depth: 10 (defensive limit against pathological nesting).\n */\nasync function resolveInheritedWorkspaceScope(\n ctx: TopicScopeContext,\n topic: TopicDoc\n): Promise<{ tenantId?: string; workspaceId?: string }> {\n const MAX_DEPTH = 10;\n let tenantId = normalizeScopeValue(topic.tenantId);\n let workspaceId = normalizeScopeValue(topic.workspaceId);\n\n if (tenantId && workspaceId) {\n return { tenantId, workspaceId };\n }\n\n let current: TopicDoc | null = topic;\n for (let i = 0; i < MAX_DEPTH && current?.parentTopicId; i++) {\n current = (await ctx.db.get(current.parentTopicId)) as TopicDoc | null;\n if (!current) {\n break;\n }\n\n if (!tenantId) {\n tenantId = normalizeScopeValue(current.tenantId);\n }\n if (!workspaceId) {\n workspaceId = normalizeScopeValue(current.workspaceId);\n }\n if (tenantId && workspaceId) {\n break;\n }\n }\n\n return { tenantId, workspaceId };\n}\n\nexport async function resolveTopicProjectScope(\n ctx: TopicScopeContext,\n args: { topicId?: Id<\"topics\"> | string; projectId?: string }\n): Promise<TopicProjectScope> {\n if (args.topicId) {\n return await resolveScopeFromTopicId(ctx, args.topicId);\n }\n\n if (args.projectId) {\n return await resolveScopeFromLegacyProjectId(ctx, args.projectId);\n }\n\n throw new Error(\n \"Missing scope: provide topicId (preferred) or legacy projectId alias.\"\n );\n}\n\nasync function resolveScopeFromTopicId(\n ctx: TopicScopeContext,\n topicId: Id<\"topics\"> | string\n): Promise<TopicProjectScope> {\n const topic = await resolveTopicDocFromTopicId(ctx, topicId);\n if (topic) {\n return await buildTopicScope(ctx, topic, \"topic\");\n }\n\n const nodeScope = await resolveTopicNodeScopeOrNull(ctx, String(topicId));\n if (nodeScope) {\n return nodeScope;\n }\n throw new Error(`Topic not found: ${String(topicId)}`);\n}\n\nasync function resolveTopicDocFromTopicId(\n ctx: TopicScopeContext,\n topicId: Id<\"topics\"> | string\n): Promise<TopicDoc | null> {\n const direct = await tryReadTopicDoc(ctx, topicId, {\n failureLog: \"[topicScope] Failed to load topic by direct id\",\n idLogKey: \"topicId\",\n });\n if (direct) {\n return direct;\n }\n\n const hostTopic = await tryResolveHostTopicById(ctx, String(topicId));\n if (hostTopic) {\n return hostTopic;\n }\n\n return (\n pickPrimaryTopic(await findTopicsByScopeAlias(ctx, String(topicId))) ?? null\n );\n}\n\nasync function resolveScopeFromLegacyProjectId(\n ctx: TopicScopeContext,\n legacyProjectId: string\n): Promise<TopicProjectScope> {\n const directTopic = await resolveDirectLegacyProjectTopic(\n ctx,\n legacyProjectId\n );\n if (directTopic) {\n return await buildTopicScope(ctx, directTopic, \"topic_inferred\", {\n fallbackProjectId: legacyProjectId,\n });\n }\n\n const primary = pickPrimaryTopic(\n await findTopicsByScopeAlias(ctx, legacyProjectId)\n );\n if (primary) {\n return await buildTopicScope(ctx, primary, \"project_mapped_topic\", {\n fallbackProjectId: legacyProjectId,\n });\n }\n\n const nodeScope = await resolveTopicNodeScopeOrNull(ctx, legacyProjectId);\n if (nodeScope) {\n return {\n ...nodeScope,\n projectId: nodeScope.projectId ?? legacyProjectId,\n };\n }\n\n throw new Error(\n `Legacy project scope ${legacyProjectId} has no mapped topic.`\n );\n}\n\nasync function resolveDirectLegacyProjectTopic(\n ctx: TopicScopeContext,\n legacyProjectId: string\n): Promise<TopicDoc | null> {\n const directTopic = await tryReadTopicDoc(ctx, legacyProjectId, {\n failureLog: \"[topicScope] Failed to load direct project topic\",\n idLogKey: \"projectId\",\n });\n return directTopic ?? tryResolveHostTopicByLegacyScope(ctx, legacyProjectId);\n}\n\nasync function tryReadTopicDoc(\n ctx: TopicScopeContext,\n id: Id<\"topics\"> | string,\n log: { failureLog: string; idLogKey: \"projectId\" | \"topicId\" }\n): Promise<TopicDoc | null> {\n try {\n return (await ctx.db.get(id)) as TopicDoc | null;\n } catch (error) {\n debugGraphPrimitiveFallback(log.failureLog, {\n error,\n [log.idLogKey]: id,\n });\n return null;\n }\n}\n\nasync function buildTopicScope(\n ctx: TopicScopeContext,\n topic: TopicDoc,\n source: TopicProjectScope[\"source\"],\n options: { fallbackProjectId?: string } = {}\n): Promise<TopicProjectScope> {\n const inherited = await resolveInheritedWorkspaceScope(ctx, topic);\n const mapped = asMappedProjectId(topic);\n return {\n topicId: topic._id,\n ...(mapped || options.fallbackProjectId\n ? { projectId: mapped ?? options.fallbackProjectId }\n : {}),\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source,\n };\n}\n\n/** Shared scope args for graph-primitive functions. topicId is canonical; projectId is a legacy alias. */\nexport const optionalScopeArgs = {\n projectId: v.optional(v.string()),\n topicId: v.optional(v.string()),\n} as const;\n","// biome-ignore-all lint/style/useFilenamingConvention: Public ABI surface; rename requires a cross-package migration update.\n/**\n * Entity↔Belief Bridge (OE-B)\n *\n * Query and mutation helpers for traversing entity↔belief connections\n * via the epistemic edge graph. Entities (ontological layer) connect to\n * beliefs/questions/themes (L3) and evidence (L2) through typed bridge edges.\n *\n * Bridge edge types:\n * - contains: Belief/Question/Theme → Entity (L3 → ontological), also Entity → Evidence (ontological → L2)\n * - evaluates: Deal → Company (L3 → ontological)\n * - perspective_on: Person → Belief/Theme (ontological → L3)\n * - impacts: Theme → ValueChain (L3 → ontological)\n * - mentioned_in: Entity → Source (ontological → L1)\n *\n * @module graph-primitives/entityBridge\n */\n\nimport { getCurrentUserId } from \"@lucern/access-control/auth\";\nimport { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\nimport { v } from \"convex/values\";\nimport type { Id, MutationCtx, QueryCtx } from \"./convex\";\nimport { internal, mutation, query } from \"./convex\";\nimport { validateEdgeLayers } from \"./edgeValidation\";\nimport { getNodeLayer } from \"./graphTypes\";\nimport { readMaterializedTopicTableId } from \"./topicScope\";\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\n/** Edge types that bridge ontological ↔ epistemic layers */\nconst ENTITY_BRIDGE_EDGE_TYPES = [\n \"contains\",\n \"evaluates\",\n \"perspective_on\",\n \"impacts\",\n \"mentioned_in\",\n] as const;\n\n/** Edge types that connect ontological ↔ ontological */\nconst _ONTOLOGICAL_EDGE_TYPES = [\n \"works_at\",\n \"participates_in\",\n \"performs\",\n \"function_in\",\n \"invested_in\",\n \"raised_from\",\n \"founded_by\",\n \"competes_with\",\n \"contains\",\n \"derived_from\",\n] as const;\n\ninterface BridgeEdge {\n context?: string;\n edgeType: string;\n fromNodeId?: Id<\"epistemicNodes\">;\n toNodeId?: Id<\"epistemicNodes\">;\n weight?: number;\n}\n\ninterface IndexQuery {\n eq(field: string, value: unknown): IndexQuery;\n}\n\nconst ENTITY_BRIDGE_EDGE_TYPE_SET = new Set<string>(ENTITY_BRIDGE_EDGE_TYPES);\n\ninterface TopicScopeNode {\n _id: Id<\"epistemicNodes\">;\n metadata?: Record<string, unknown>;\n projectId?: string;\n status?: string;\n topicId?: string;\n}\n\ninterface BridgeNode extends TopicScopeNode {\n canonicalText?: string;\n epistemicLayer?: string;\n globalId?: string;\n nodeType?: string;\n title?: string;\n [fieldName: string]: unknown;\n}\n\ninterface EntityBeliefEdgeDirection {\n edgeFromLayer: string;\n edgeToLayer: string;\n fromGlobalId: string;\n fromNodeId: Id<\"epistemicNodes\">;\n fromNodeType: string;\n toGlobalId: string;\n toNodeId: Id<\"epistemicNodes\">;\n toNodeType: string;\n}\n\ninterface GetBeliefsForEntityArgs {\n edgeTypes?: string[];\n entityNodeId: Id<\"epistemicNodes\">;\n}\n\ninterface GetEntitiesForBeliefArgs {\n beliefNodeId: Id<\"epistemicNodes\">;\n edgeTypes?: string[];\n}\n\ninterface GetEntityTopicScopeArgs {\n entityNodeId: Id<\"epistemicNodes\">;\n}\n\ninterface GetEvidenceForEntityArgs {\n entityNodeId: Id<\"epistemicNodes\">;\n limit?: number;\n}\n\ninterface LinkEntityToBeliefArgs {\n beliefNodeId: Id<\"epistemicNodes\">;\n context?: string;\n edgeType?: string;\n entityNodeId: Id<\"epistemicNodes\">;\n weight?: number;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction readConvexId<TableName extends string>(\n value: unknown\n): Id<TableName> | undefined {\n return typeof value === \"string\" && value.trim().length > 0\n ? (value as Id<TableName>)\n : undefined;\n}\n\nfunction readOptionalNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value)\n ? value\n : undefined;\n}\n\nfunction readOptionalString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim().length > 0\n ? value\n : undefined;\n}\n\nfunction readRecord(value: unknown): Record<string, unknown> | undefined {\n return isRecord(value) ? value : undefined;\n}\n\nfunction readBridgeEdge(value: unknown): BridgeEdge | null {\n if (!isRecord(value)) {\n return null;\n }\n\n const edgeType = readOptionalString(value.edgeType);\n if (!edgeType) {\n return null;\n }\n\n const edge: BridgeEdge = { edgeType };\n const context = readOptionalString(value.context);\n const fromNodeId = readConvexId<\"epistemicNodes\">(value.fromNodeId);\n const toNodeId = readConvexId<\"epistemicNodes\">(value.toNodeId);\n const weight = readOptionalNumber(value.weight);\n\n if (context !== undefined) {\n edge.context = context;\n }\n if (fromNodeId !== undefined) {\n edge.fromNodeId = fromNodeId;\n }\n if (toNodeId !== undefined) {\n edge.toNodeId = toNodeId;\n }\n if (weight !== undefined) {\n edge.weight = weight;\n }\n\n return edge;\n}\n\nfunction readBridgeNode(value: unknown): BridgeNode | null {\n if (!isRecord(value)) {\n return null;\n }\n\n const id = readConvexId<\"epistemicNodes\">(value._id);\n if (!id) {\n return null;\n }\n\n const node: BridgeNode = { ...value, _id: id };\n const canonicalText = readOptionalString(value.canonicalText);\n const epistemicLayer = readOptionalString(value.epistemicLayer);\n const globalId = readOptionalString(value.globalId);\n const metadata = readRecord(value.metadata);\n const nodeType = readOptionalString(value.nodeType);\n const projectId = readOptionalString(value.projectId);\n const status = readOptionalString(value.status);\n const title = readOptionalString(value.title);\n const topicId = readOptionalString(value.topicId);\n\n if (canonicalText !== undefined) {\n node.canonicalText = canonicalText;\n }\n if (epistemicLayer !== undefined) {\n node.epistemicLayer = epistemicLayer;\n }\n if (globalId !== undefined) {\n node.globalId = globalId;\n }\n if (metadata !== undefined) {\n node.metadata = metadata;\n }\n if (nodeType !== undefined) {\n node.nodeType = nodeType;\n }\n if (projectId !== undefined) {\n node.projectId = projectId;\n }\n if (status !== undefined) {\n node.status = status;\n }\n if (title !== undefined) {\n node.title = title;\n }\n if (topicId !== undefined) {\n node.topicId = topicId;\n }\n\n return node;\n}\n\nfunction readRowList<T>(\n values: readonly unknown[],\n reader: (value: unknown) => T | null\n): T[] {\n return values.flatMap((value) => {\n const row = reader(value);\n return row ? [row] : [];\n });\n}\n\nfunction readTopicScopeNode(value: unknown): TopicScopeNode | null {\n return readBridgeNode(value);\n}\n\nfunction isEntityScopeBridgeEdge(edgeType: string | undefined): boolean {\n if (!edgeType) {\n return false;\n }\n return ENTITY_BRIDGE_EDGE_TYPE_SET.has(edgeType);\n}\n\nasync function queryEdgesByTarget(\n ctx: QueryCtx,\n nodeId: Id<\"epistemicNodes\">\n): Promise<BridgeEdge[]> {\n return readRowList(\n await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_to\", (q: IndexQuery) => q.eq(\"toNodeId\", nodeId))\n .collect(),\n readBridgeEdge\n );\n}\n\nasync function queryEdgesBySource(\n ctx: QueryCtx,\n nodeId: Id<\"epistemicNodes\">\n): Promise<BridgeEdge[]> {\n return readRowList(\n await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from\", (q: IndexQuery) => q.eq(\"fromNodeId\", nodeId))\n .collect(),\n readBridgeEdge\n );\n}\n\nasync function readNodeById(\n ctx: QueryCtx,\n nodeId: Id<\"epistemicNodes\">\n): Promise<BridgeNode | null> {\n return readBridgeNode(await ctx.db.get(nodeId));\n}\n\nasync function readNodeByIdForMutation(\n ctx: MutationCtx,\n nodeId: Id<\"epistemicNodes\">\n): Promise<BridgeNode | null> {\n return readBridgeNode(await ctx.db.get(nodeId));\n}\n\nfunction collectConnectedEntityNodeIds(\n connectedNodeIds: Set<string>,\n edges: BridgeEdge[],\n mapFromInbound: boolean\n) {\n for (const edge of edges) {\n if (!isEntityScopeBridgeEdge(edge.edgeType)) {\n continue;\n }\n const nextId = mapFromInbound ? edge.fromNodeId : edge.toNodeId;\n if (!nextId) {\n continue;\n }\n connectedNodeIds.add(String(nextId));\n }\n}\n\nasync function collectEntityTopicContextIds(\n ctx: QueryCtx,\n connectedNodeIds: Set<string>\n): Promise<{ projectIds: Set<string>; topicIds: Set<string> }> {\n const topicIds = new Set<string>();\n const projectIds = new Set<string>();\n\n for (const nodeId of connectedNodeIds) {\n const node = readTopicScopeNode(\n await ctx.db.get(nodeId as Id<\"epistemicNodes\">)\n );\n if (node?.status !== \"active\") {\n continue;\n }\n if (node.projectId) {\n projectIds.add(String(node.projectId));\n }\n if (node.topicId) {\n topicIds.add(String(node.topicId));\n }\n }\n\n return { topicIds, projectIds };\n}\n\nasync function collectScopedTopicIdsFromConnectedNodes(\n ctx: QueryCtx,\n connectedNodeIds: Set<string>\n): Promise<string[]> {\n const scopedTopicIds = await Promise.all(\n [...connectedNodeIds].map(async (nodeId) => {\n const scopeEdges = await queryEdgesBySource(\n ctx,\n nodeId as Id<\"epistemicNodes\">\n );\n const mappedTopicIds = scopeEdges.map(async (edge) => {\n if (edge.edgeType !== \"contains\" || !edge.toNodeId) {\n return;\n }\n const scopedTopicNode = readTopicScopeNode(\n await ctx.db.get(edge.toNodeId)\n );\n const canonicalTopicId = readMaterializedTopicTableId(scopedTopicNode);\n if (!canonicalTopicId) {\n return;\n }\n return String(canonicalTopicId);\n });\n return Promise.all(mappedTopicIds);\n })\n );\n\n return scopedTopicIds\n .flat()\n .filter((topicId): topicId is string => Boolean(topicId));\n}\n\nfunction buildEntityBeliefEdgeDirection(\n args: {\n edgeType?: string;\n entityNodeId: Id<\"epistemicNodes\">;\n beliefNodeId: Id<\"epistemicNodes\">;\n },\n entity: { nodeType: string; globalId: string; epistemicLayer: string },\n belief: { nodeType: string; globalId: string }\n): EntityBeliefEdgeDirection {\n const { edgeType, entityNodeId, beliefNodeId } = args;\n const effectiveEdgeType = edgeType || \"contains\";\n const entityLayer = getNodeLayer(entity.nodeType);\n const beliefLayer = getNodeLayer(belief.nodeType);\n\n if (\n effectiveEdgeType === \"contains\" &&\n entity.epistemicLayer === \"ontological\"\n ) {\n return {\n fromNodeId: beliefNodeId,\n toNodeId: entityNodeId,\n fromGlobalId: belief.globalId,\n toGlobalId: entity.globalId,\n fromNodeType: belief.nodeType,\n toNodeType: entity.nodeType,\n edgeFromLayer: beliefLayer,\n edgeToLayer: \"ontological\",\n };\n }\n\n if (\n effectiveEdgeType === \"mentioned_in\" ||\n effectiveEdgeType === \"perspective_on\"\n ) {\n return {\n fromNodeId: entityNodeId,\n toNodeId: beliefNodeId,\n fromGlobalId: entity.globalId,\n toGlobalId: belief.globalId,\n fromNodeType: entity.nodeType,\n toNodeType: belief.nodeType,\n edgeFromLayer: \"ontological\",\n edgeToLayer: beliefLayer,\n };\n }\n\n const directValidation = validateEdgeLayers(\n effectiveEdgeType,\n entityLayer,\n beliefLayer\n );\n if (directValidation.valid) {\n return {\n fromNodeId: entityNodeId,\n toNodeId: beliefNodeId,\n fromGlobalId: entity.globalId,\n toGlobalId: belief.globalId,\n fromNodeType: entity.nodeType,\n toNodeType: belief.nodeType,\n edgeFromLayer: entityLayer,\n edgeToLayer: beliefLayer,\n };\n }\n\n const reversedValidation = validateEdgeLayers(\n effectiveEdgeType,\n beliefLayer,\n entityLayer\n );\n if (!reversedValidation.valid) {\n throw new Error(\n `Edge type '${effectiveEdgeType}' is not valid between ${entity.nodeType} (${entityLayer}) and ${belief.nodeType} (${beliefLayer}): ${directValidation.reason}`\n );\n }\n\n return {\n fromNodeId: beliefNodeId,\n toNodeId: entityNodeId,\n fromGlobalId: belief.globalId,\n toGlobalId: entity.globalId,\n fromNodeType: belief.nodeType,\n toNodeType: entity.nodeType,\n edgeFromLayer: beliefLayer,\n edgeToLayer: entityLayer,\n };\n}\n\n// =============================================================================\n// QUERIES\n// =============================================================================\n\n/**\n * Get all beliefs/questions/themes connected to an entity.\n * Traverses both directions:\n * - about_entity edges (L3 → entity): returns the L3 source nodes\n * - perspective_on edges (entity → L3): returns the L3 target nodes\n * - evaluates edges (L3 → entity): returns the L3 source nodes\n */\nexport const getBeliefsForEntity = query({\n args: {\n entityNodeId: v.id(\"epistemicNodes\"),\n edgeTypes: v.optional(v.array(v.string())),\n },\n returns: permissiveReturn,\n handler: async (ctx: QueryCtx, args: GetBeliefsForEntityArgs) => {\n const entity = await readNodeById(ctx, args.entityNodeId);\n if (entity?.epistemicLayer !== \"ontological\") {\n return { beliefs: [], entity: null };\n }\n\n const filterTypes = args.edgeTypes || [\n \"contains\",\n \"evaluates\",\n \"perspective_on\",\n \"impacts\",\n ];\n\n // Edges TO this entity (contains, evaluates, impacts)\n const inboundEdges = await queryEdgesByTarget(ctx, args.entityNodeId);\n\n // Edges FROM this entity (perspective_on)\n const outboundEdges = await queryEdgesBySource(ctx, args.entityNodeId);\n\n const beliefNodeIds = new Set<string>();\n const edgeMap: Record<\n string,\n { edgeType: string; weight?: number; context?: string }\n > = {};\n\n for (const edge of inboundEdges) {\n if (!(filterTypes.includes(edge.edgeType) && edge.fromNodeId)) {\n continue;\n }\n const id = String(edge.fromNodeId);\n beliefNodeIds.add(id);\n edgeMap[id] = {\n edgeType: edge.edgeType,\n weight: edge.weight ?? undefined,\n context: edge.context ?? undefined,\n };\n }\n\n for (const edge of outboundEdges) {\n const et = edge.edgeType;\n if (\n !(filterTypes.includes(et) && edge.toNodeId) ||\n et === \"mentioned_in\"\n ) {\n continue;\n }\n const id = String(edge.toNodeId);\n beliefNodeIds.add(id);\n edgeMap[id] = {\n edgeType: edge.edgeType,\n weight: edge.weight ?? undefined,\n context: edge.context ?? undefined,\n };\n }\n\n // Hydrate belief nodes\n const beliefs = await Promise.all(\n [...beliefNodeIds].map(async (nodeId) => {\n const node = await readNodeById(ctx, nodeId as Id<\"epistemicNodes\">);\n if (node?.status !== \"active\") {\n return null;\n }\n return {\n ...node,\n _edge: edgeMap[nodeId],\n };\n })\n );\n\n return {\n beliefs: beliefs.filter(Boolean),\n entity: {\n _id: entity._id,\n globalId: entity.globalId,\n nodeType: entity.nodeType,\n title: entity.title,\n metadata: entity.metadata,\n },\n };\n },\n});\n\n/**\n * Get all entities connected to a belief/question/theme.\n * Traverses both directions:\n * - about_entity edges (belief → entity): returns the entity target nodes\n * - perspective_on edges (entity → belief): returns the entity source nodes\n * - evaluates edges (deal → entity): returns the entity target nodes\n */\nexport const getEntitiesForBelief = query({\n args: {\n beliefNodeId: v.id(\"epistemicNodes\"),\n edgeTypes: v.optional(v.array(v.string())),\n },\n returns: permissiveReturn,\n handler: async (ctx: QueryCtx, args: GetEntitiesForBeliefArgs) => {\n const belief = await readNodeById(ctx, args.beliefNodeId);\n if (!belief) {\n return { entities: [], belief: null };\n }\n\n const filterTypes = args.edgeTypes || [\n \"contains\",\n \"evaluates\",\n \"perspective_on\",\n \"impacts\",\n ];\n\n // Edges FROM this belief (contains, evaluates, impacts)\n const outboundEdges = await queryEdgesBySource(ctx, args.beliefNodeId);\n\n // Edges TO this belief (perspective_on)\n const inboundEdges = await queryEdgesByTarget(ctx, args.beliefNodeId);\n\n const entityNodeIds = new Set<string>();\n const edgeMap: Record<\n string,\n { edgeType: string; weight?: number; context?: string }\n > = {};\n\n for (const edge of outboundEdges) {\n if (!(filterTypes.includes(edge.edgeType) && edge.toNodeId)) {\n continue;\n }\n const id = String(edge.toNodeId);\n entityNodeIds.add(id);\n edgeMap[id] = {\n edgeType: edge.edgeType,\n weight: edge.weight ?? undefined,\n context: edge.context ?? undefined,\n };\n }\n\n for (const edge of inboundEdges) {\n if (!(filterTypes.includes(edge.edgeType) && edge.fromNodeId)) {\n continue;\n }\n const id = String(edge.fromNodeId);\n entityNodeIds.add(id);\n edgeMap[id] = {\n edgeType: edge.edgeType,\n weight: edge.weight ?? undefined,\n context: edge.context ?? undefined,\n };\n }\n\n // Hydrate entity nodes (filter to ontological only)\n const entities = await Promise.all(\n [...entityNodeIds].map(async (nodeId) => {\n const node = await readNodeById(ctx, nodeId as Id<\"epistemicNodes\">);\n if (\n node?.status !== \"active\" ||\n node.epistemicLayer !== \"ontological\"\n ) {\n return null;\n }\n return {\n ...node,\n _edge: edgeMap[nodeId],\n };\n })\n );\n\n return {\n entities: entities.filter(Boolean),\n belief: {\n _id: belief._id,\n globalId: belief.globalId,\n nodeType: belief.nodeType,\n title: belief.title,\n canonicalText: belief.canonicalText,\n },\n };\n },\n});\n\n/**\n * Get the topic scope for an entity by traversing its belief connections.\n * Entities don't have direct topic scope — they inherit it through their\n * connected beliefs/themes. This enables topic-based entity discovery.\n */\nexport const getEntityTopicScope = query({\n args: {\n entityNodeId: v.id(\"epistemicNodes\"),\n },\n returns: permissiveReturn,\n handler: async (ctx: QueryCtx, args: GetEntityTopicScopeArgs) => {\n const entity = await readNodeById(ctx, args.entityNodeId);\n if (entity?.epistemicLayer !== \"ontological\") {\n return { topics: [], projectIds: [] };\n }\n\n const [inboundEdges, outboundEdges] = await Promise.all([\n queryEdgesByTarget(ctx, args.entityNodeId),\n queryEdgesBySource(ctx, args.entityNodeId),\n ]);\n\n const connectedNodeIds = new Set<string>();\n collectConnectedEntityNodeIds(connectedNodeIds, inboundEdges, true);\n collectConnectedEntityNodeIds(connectedNodeIds, outboundEdges, false);\n\n const { topicIds, projectIds } = await collectEntityTopicContextIds(\n ctx,\n connectedNodeIds\n );\n const inferredTopicIds = await collectScopedTopicIdsFromConnectedNodes(\n ctx,\n connectedNodeIds\n );\n for (const topicId of inferredTopicIds) {\n topicIds.add(topicId);\n }\n\n return {\n topics: [...topicIds],\n projectIds: [...projectIds],\n connectedNodeCount: connectedNodeIds.size,\n };\n },\n});\n\n/**\n * Get evidence nodes that reference an entity.\n * Uses entity_referenced_in edges (ontological → L2).\n */\nexport const getEvidenceForEntity = query({\n args: {\n entityNodeId: v.id(\"epistemicNodes\"),\n limit: v.optional(v.number()),\n },\n returns: permissiveReturn,\n handler: async (ctx: QueryCtx, args: GetEvidenceForEntityArgs) => {\n const entity = await readNodeById(ctx, args.entityNodeId);\n if (entity?.epistemicLayer !== \"ontological\") {\n return [];\n }\n\n const effectiveLimit = args.limit ?? 50;\n\n // contains: Entity → Evidence (outbound from entity)\n const outboundEdges = await queryEdgesBySource(ctx, args.entityNodeId);\n\n const evidenceEdges = outboundEdges.filter((e) => {\n const et = e.edgeType;\n return et === \"contains\" || et === \"mentioned_in\";\n });\n\n const results = await Promise.all(\n evidenceEdges.slice(0, effectiveLimit).map(async (edge) => {\n if (!edge.toNodeId) {\n return null;\n }\n const node = await readNodeById(ctx, edge.toNodeId);\n if (node?.status !== \"active\") {\n return null;\n }\n return {\n ...node,\n _edge: {\n edgeType: edge.edgeType,\n weight: edge.weight,\n context: edge.context,\n },\n };\n })\n );\n\n return results.filter(Boolean);\n },\n});\n\n// =============================================================================\n// MUTATIONS\n// =============================================================================\n\n/**\n * Link an entity to a belief/question/theme via about_entity edge.\n * Creates the edge through the Neo4j dual-write path.\n */\nexport const linkEntityToBelief = mutation({\n args: {\n entityNodeId: v.id(\"epistemicNodes\"),\n beliefNodeId: v.id(\"epistemicNodes\"),\n edgeType: v.optional(v.string()),\n weight: v.optional(v.number()),\n context: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx: MutationCtx, args: LinkEntityToBeliefArgs) => {\n const userId = await getCurrentUserId(ctx);\n if (!userId) {\n throw new Error(\"Authentication required to create entity-belief links.\");\n }\n\n const entity = await readNodeByIdForMutation(ctx, args.entityNodeId);\n if (entity?.epistemicLayer !== \"ontological\") {\n throw new Error(\"Source node must be an ontological entity.\");\n }\n\n const belief = await readNodeByIdForMutation(ctx, args.beliefNodeId);\n if (!belief) {\n throw new Error(\"Target belief/question/theme node not found.\");\n }\n if (!entity.globalId) {\n throw new Error(\"Source entity is missing a globalId.\");\n }\n if (!belief.globalId) {\n throw new Error(\n \"Target belief/question/theme node is missing a globalId.\"\n );\n }\n if (!entity.nodeType) {\n throw new Error(\"Source entity is missing a nodeType.\");\n }\n if (!belief.nodeType) {\n throw new Error(\n \"Target belief/question/theme node is missing a nodeType.\"\n );\n }\n\n const edgeDirection = buildEntityBeliefEdgeDirection(\n args,\n {\n nodeType: entity.nodeType,\n globalId: entity.globalId,\n epistemicLayer: entity.epistemicLayer,\n },\n {\n nodeType: belief.nodeType,\n globalId: belief.globalId,\n }\n );\n\n const { fromNodeId, toNodeId, fromGlobalId, toGlobalId } = edgeDirection;\n const { fromNodeType, toNodeType, edgeFromLayer, edgeToLayer } =\n edgeDirection;\n\n const effectiveEdgeType = args.edgeType || \"contains\";\n\n // Check for duplicate edge\n const existing = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from_to\", (q) =>\n q.eq(\"fromNodeId\", fromNodeId).eq(\"toNodeId\", toNodeId)\n )\n .first();\n\n if (existing && existing.edgeType === effectiveEdgeType) {\n return { edgeId: existing._id, existed: true };\n }\n\n // Create via Neo4j dual-write path\n const globalId = `edge-${effectiveEdgeType}-${fromNodeId}-${toNodeId}-${Date.now()}`;\n\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.createEdge, {\n globalId,\n fromGlobalId,\n toGlobalId,\n edgeType: effectiveEdgeType,\n weight: args.weight ?? 1.0,\n context: args.context || `Entity-belief bridge: ${effectiveEdgeType}`,\n topicId:\n belief.projectId || entity.projectId\n ? String(belief.projectId || entity.projectId)\n : undefined,\n createdBy: userId,\n fromNodeType,\n toNodeType,\n fromLayer: edgeFromLayer,\n toLayer: edgeToLayer,\n });\n\n return { globalId, edgeType: effectiveEdgeType, existed: false };\n },\n});\n"]}
@@ -1,4 +1,6 @@
1
1
  import { Id } from './convex.js';
2
+ import '@lucern/access-control/convex';
3
+ import '@lucern/contracts/convex/unsafeAnyApi';
2
4
  import 'convex/values';
3
5
 
4
6
  /**
@@ -9,25 +11,25 @@ import 'convex/values';
9
11
  * pure code motion, no logic delta.
10
12
  */
11
13
 
12
- type CanonicalEntityRecord = {
14
+ interface CanonicalEntityRecord {
13
15
  _id: Id<"epistemicNodes">;
14
- title?: string;
15
16
  canonicalText?: string;
16
- status?: string;
17
- nodeType?: string;
18
- epistemicLayer?: string;
19
- tenantId?: string;
20
- workspaceId?: string;
21
17
  contentHash?: string;
22
- projectId?: string;
18
+ domain?: string;
19
+ epistemicLayer?: string;
20
+ externalIds?: Record<string, unknown>;
23
21
  globalId?: string;
22
+ metadata?: Record<string, unknown>;
23
+ nodeType?: string;
24
+ projectId?: string;
25
+ status?: string;
24
26
  subtype?: string;
25
- domain?: string;
26
27
  tags?: string[];
28
+ tenantId?: string;
29
+ title?: string;
27
30
  verificationStatus?: string;
28
- externalIds?: Record<string, unknown>;
29
- metadata?: Record<string, unknown>;
30
- };
31
+ workspaceId?: string;
32
+ }
31
33
  declare function normalizeCanonicalEntityText(value: string): string;
32
34
  declare function buildEntityTitle(canonicalText: string): string;
33
35
  declare function matchesCanonicalEntityRecord(node: CanonicalEntityRecord, args: {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/entityCanonicalMatch.ts"],"names":[],"mappings":";AA6BO,SAAS,6BAA6B,KAAA,EAAuB;AAClE,EAAA,OAAO,MAAM,IAAA,EAAK,CAAE,aAAY,CAAE,OAAA,CAAQ,QAAQ,GAAG,CAAA;AACvD;AAEO,SAAS,iBAAiB,aAAA,EAA+B;AAC9D,EAAA,OAAO,aAAA,CAAc,MAAM,CAAA,EAAG,GAAG,KAAK,aAAA,CAAc,MAAA,GAAS,MAAM,KAAA,GAAQ,EAAA,CAAA;AAC7E;AAEO,SAAS,4BAAA,CACd,MACA,IAAA,EAMS;AACT,EAAA,IAAI,IAAA,CAAK,mBAAmB,aAAA,EAAe;AACzC,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,IAAA,CAAK,gBAAgB,MAAA,EAAW;AAClC,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,QAAA,KAAa,KAAK,QAAA,EAAU;AACpD,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,WAAA,KAAgB,KAAK,WAAA,EAAa;AAC7D,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,WAAA,GACJ,OAAO,IAAA,CAAK,QAAA,KAAa,YAAY,IAAA,CAAK,QAAA,CAAS,IAAA,EAAK,CAAE,MAAA,GAAS,CAAA,GAC/D,IAAA,CAAK,QAAA,CAAS,MAAK,GACnB,MAAA;AACN,EAAA,IAAI,WAAA,KAAgB,KAAK,QAAA,EAAU;AACjC,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,IAAA,OAAO,KAAK,MAAA,KAAW,SAAA;AAAA,EACzB;AACA,EAAA,OAAO,KAAK,MAAA,KAAW,QAAA;AACzB","file":"entityCanonicalMatch.js","sourcesContent":["/**\n * Canonical-entity match helpers — pure text-normalization, title-derivation,\n * and record-matching predicates behind the canonical-entity dedup/lookup path\n * in entityLifecycle.ts. Extracted from entityLifecycle.ts (the mutations/queries\n * registration stays there) so the module stays under the long-file hard gate;\n * pure code motion, no logic delta.\n */\nimport type { Id } from \"./convex\";\n\nexport type CanonicalEntityRecord = {\n _id: Id<\"epistemicNodes\">;\n title?: string;\n canonicalText?: string;\n status?: string;\n nodeType?: string;\n epistemicLayer?: string;\n tenantId?: string;\n workspaceId?: string;\n contentHash?: string;\n projectId?: string;\n globalId?: string;\n subtype?: string;\n domain?: string;\n tags?: string[];\n verificationStatus?: string;\n externalIds?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n};\n\nexport function normalizeCanonicalEntityText(value: string): string {\n return value.trim().toLowerCase().replace(/\\s+/g, \" \");\n}\n\nexport function buildEntityTitle(canonicalText: string): string {\n return canonicalText.slice(0, 100) + (canonicalText.length > 100 ? \"...\" : \"\");\n}\n\nexport function matchesCanonicalEntityRecord(\n node: CanonicalEntityRecord,\n args: {\n nodeType?: string;\n tenantId?: string;\n contentHash?: string;\n includeArchived?: boolean;\n }\n): boolean {\n if (node.epistemicLayer !== \"ontological\") {\n return false;\n }\n if (node.workspaceId !== undefined) {\n return false;\n }\n if (args.nodeType && node.nodeType !== args.nodeType) {\n return false;\n }\n if (args.contentHash && node.contentHash !== args.contentHash) {\n return false;\n }\n const rowTenantId =\n typeof node.tenantId === \"string\" && node.tenantId.trim().length > 0\n ? node.tenantId.trim()\n : undefined;\n if (rowTenantId !== args.tenantId) {\n return false;\n }\n if (args.includeArchived) {\n return node.status !== \"deleted\";\n }\n return node.status === \"active\";\n}\n"]}
1
+ {"version":3,"sources":["../src/entityCanonicalMatch.ts"],"names":[],"mappings":";AA8BO,SAAS,6BAA6B,KAAA,EAAuB;AAClE,EAAA,OAAO,MAAM,IAAA,EAAK,CAAE,aAAY,CAAE,OAAA,CAAQ,QAAQ,GAAG,CAAA;AACvD;AAEO,SAAS,iBAAiB,aAAA,EAA+B;AAC9D,EAAA,OACE,aAAA,CAAc,MAAM,CAAA,EAAG,GAAG,KAAK,aAAA,CAAc,MAAA,GAAS,MAAM,KAAA,GAAQ,EAAA,CAAA;AAExE;AAEO,SAAS,4BAAA,CACd,MACA,IAAA,EAMS;AACT,EAAA,IAAI,IAAA,CAAK,mBAAmB,aAAA,EAAe;AACzC,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,IAAA,CAAK,gBAAgB,MAAA,EAAW;AAClC,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,QAAA,KAAa,KAAK,QAAA,EAAU;AACpD,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,WAAA,KAAgB,KAAK,WAAA,EAAa;AAC7D,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,WAAA,GACJ,OAAO,IAAA,CAAK,QAAA,KAAa,YAAY,IAAA,CAAK,QAAA,CAAS,IAAA,EAAK,CAAE,MAAA,GAAS,CAAA,GAC/D,IAAA,CAAK,QAAA,CAAS,MAAK,GACnB,MAAA;AACN,EAAA,IAAI,WAAA,KAAgB,KAAK,QAAA,EAAU;AACjC,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,IAAA,OAAO,KAAK,MAAA,KAAW,SAAA;AAAA,EACzB;AACA,EAAA,OAAO,KAAK,MAAA,KAAW,QAAA;AACzB","file":"entityCanonicalMatch.js","sourcesContent":["// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\n/**\n * Canonical-entity match helpers — pure text-normalization, title-derivation,\n * and record-matching predicates behind the canonical-entity dedup/lookup path\n * in entityLifecycle.ts. Extracted from entityLifecycle.ts (the mutations/queries\n * registration stays there) so the module stays under the long-file hard gate;\n * pure code motion, no logic delta.\n */\nimport type { Id } from \"./convex\";\n\nexport interface CanonicalEntityRecord {\n _id: Id<\"epistemicNodes\">;\n canonicalText?: string;\n contentHash?: string;\n domain?: string;\n epistemicLayer?: string;\n externalIds?: Record<string, unknown>;\n globalId?: string;\n metadata?: Record<string, unknown>;\n nodeType?: string;\n projectId?: string;\n status?: string;\n subtype?: string;\n tags?: string[];\n tenantId?: string;\n title?: string;\n verificationStatus?: string;\n workspaceId?: string;\n}\n\nexport function normalizeCanonicalEntityText(value: string): string {\n return value.trim().toLowerCase().replace(/\\s+/g, \" \");\n}\n\nexport function buildEntityTitle(canonicalText: string): string {\n return (\n canonicalText.slice(0, 100) + (canonicalText.length > 100 ? \"...\" : \"\")\n );\n}\n\nexport function matchesCanonicalEntityRecord(\n node: CanonicalEntityRecord,\n args: {\n nodeType?: string;\n tenantId?: string;\n contentHash?: string;\n includeArchived?: boolean;\n }\n): boolean {\n if (node.epistemicLayer !== \"ontological\") {\n return false;\n }\n if (node.workspaceId !== undefined) {\n return false;\n }\n if (args.nodeType && node.nodeType !== args.nodeType) {\n return false;\n }\n if (args.contentHash && node.contentHash !== args.contentHash) {\n return false;\n }\n const rowTenantId =\n typeof node.tenantId === \"string\" && node.tenantId.trim().length > 0\n ? node.tenantId.trim()\n : undefined;\n if (rowTenantId !== args.tenantId) {\n return false;\n }\n if (args.includeArchived) {\n return node.status !== \"deleted\";\n }\n return node.status === \"active\";\n}\n"]}
@@ -22,7 +22,7 @@ declare const isOntologicalNodeType: (nodeType: string) => nodeType is Ontologic
22
22
  * List canonical tenant-global entities visible from a topic/project scope.
23
23
  * Canonical entities are tenant-scoped and intentionally workspace-global.
24
24
  */
25
- declare const listCanonicalEntities: any;
25
+ declare const listCanonicalEntities: unknown;
26
26
  /**
27
27
  * Create a new ontological entity in epistemicNodes.
28
28
  *
@@ -32,12 +32,8 @@ declare const listCanonicalEntities: any;
32
32
  * - Are mutable (metadata can be patched)
33
33
  * - Require metadata validation against registered schema
34
34
  */
35
- declare const createEntity: any;
36
- /**
37
- * Patch entity metadata. Entities ARE mutable (unlike scored beliefs).
38
- * Logs before/after diff to epistemicAudit.
39
- */
40
- declare const updateEntityAttributes: any;
35
+ declare const createEntity: unknown;
36
+ declare const updateEntityAttributes: unknown;
41
37
  /**
42
38
  * Merge a duplicate entity into a canonical one.
43
39
  * Non-destructive: duplicate is preserved with status='superseded' and lineage.
@@ -47,12 +43,12 @@ declare const updateEntityAttributes: any;
47
43
  * 2. Re-point all edges from duplicate → canonical
48
44
  * 3. Set duplicate status to 'superseded', supersededBy = canonical
49
45
  */
50
- declare const mergeEntities: any;
46
+ declare const mergeEntities: unknown;
51
47
  /**
52
48
  * Archive an entity. Sets status to 'archived'.
53
49
  * Non-destructive: entity preserved with full lineage.
54
50
  */
55
- declare const archiveEntity: any;
51
+ declare const archiveEntity: unknown;
56
52
 
57
53
  declare const entityLifecycle_ONTOLOGICAL_NODE_TYPES: typeof ONTOLOGICAL_NODE_TYPES;
58
54
  type entityLifecycle_OntologicalNodeType = OntologicalNodeType;
@@ -1 +1 @@
1
- export { O as ONTOLOGICAL_NODE_TYPES, a as OntologicalNodeType, b as archiveEntity, c as createEntity, i as isOntologicalNodeType, l as listCanonicalEntities, m as mergeEntities, u as updateEntityAttributes } from './entityLifecycle-CvgSK5FV.js';
1
+ export { O as ONTOLOGICAL_NODE_TYPES, a as OntologicalNodeType, b as archiveEntity, c as createEntity, i as isOntologicalNodeType, l as listCanonicalEntities, m as mergeEntities, u as updateEntityAttributes } from './entityLifecycle-BsfCz9pS.js';