@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,11 +1,15 @@
1
- import { v } from 'convex/values';
2
1
  import { getCurrentUserId } from '@lucern/access-control/auth';
3
2
  import { permissiveReturn } from '@lucern/contracts/schema-helpers/validators';
4
- import { componentsGeneric, anyApi, queryGeneric, mutationGeneric } from 'convex/server';
3
+ import { v } from 'convex/values';
4
+ import { unsafeConvexAnyApi } from '@lucern/contracts/convex/unsafeAnyApi';
5
+ import { componentsGeneric, queryGeneric, mutationGeneric } from 'convex/server';
5
6
 
6
7
  // src/entityBridge.ts
8
+ var unsafeApi = unsafeConvexAnyApi(
9
+ "graph-primitives top-level module bundle lacks a committed Convex _generated/api surface"
10
+ );
7
11
  componentsGeneric();
8
- var internal = anyApi;
12
+ var internal = unsafeApi;
9
13
  var mutation = mutationGeneric;
10
14
  var query = queryGeneric;
11
15
 
@@ -46,6 +50,14 @@ function getNodeLayer(nodeType) {
46
50
  }
47
51
 
48
52
  // src/edgeValidation.ts
53
+ var VALID_LAYER_CONNECTIONS = {
54
+ ontological: /* @__PURE__ */ new Set(["ontological", "L1", "L2", "L3"]),
55
+ L1: /* @__PURE__ */ new Set(["L1", "L2"]),
56
+ L2: /* @__PURE__ */ new Set(["L1", "L2", "L3", "ontological"]),
57
+ L3: /* @__PURE__ */ new Set(["L2", "L3", "L4", "ontological", "organizational"]),
58
+ L4: /* @__PURE__ */ new Set(["L3", "L4"]),
59
+ organizational: /* @__PURE__ */ new Set(["organizational", "L3"])
60
+ };
49
61
  function getLayerDepth(layer) {
50
62
  switch (layer) {
51
63
  case "L4":
@@ -63,37 +75,13 @@ function getLayerDepth(layer) {
63
75
  }
64
76
  }
65
77
  function isValidLayerConnection(fromLayer, toLayer) {
66
- if (fromLayer === toLayer) {
67
- return true;
68
- }
69
- if (fromLayer === "ontological" && toLayer === "ontological") {
70
- return true;
71
- }
72
- if (fromLayer === "ontological" && (toLayer === "L3" || toLayer === "L2" || toLayer === "L1")) {
73
- return true;
74
- }
75
- if ((fromLayer === "L3" || fromLayer === "L2" || fromLayer === "L1") && toLayer === "ontological") {
76
- return true;
77
- }
78
- if (fromLayer === "L2" && toLayer === "L1") {
79
- return true;
80
- }
81
- if (fromLayer === "L2" && toLayer === "L3") {
82
- return true;
83
- }
84
- if (fromLayer === "L3" && toLayer === "L2") {
85
- return true;
86
- }
87
- if (fromLayer === "L3" && toLayer === "L4") {
88
- return true;
89
- }
90
- if (fromLayer === "L4" && toLayer === "L3") {
91
- return true;
78
+ if (!VALID_LAYER_CONNECTIONS[fromLayer].has(toLayer)) {
79
+ return false;
92
80
  }
93
- if (fromLayer === "L3" && toLayer === "organizational") {
81
+ if (fromLayer === "ontological" || toLayer === "ontological") {
94
82
  return true;
95
83
  }
96
- if (fromLayer === "organizational" && toLayer === "L3") {
84
+ if (fromLayer === "organizational" || toLayer === "organizational") {
97
85
  return true;
98
86
  }
99
87
  const fromDepth = getLayerDepth(fromLayer);
@@ -232,61 +220,281 @@ var EDGE_LAYER_RULES = {
232
220
  to: ["L1", "L2", "L3"],
233
221
  description: "Legacy storage migration alias for derived_from; public writes use derived_from"
234
222
  },
235
- qualifies: { from: ["L2", "L3"], to: ["L3"], description: "Evidence/Belief qualifies a Belief" },
236
- contradicts: { from: ["L2", "L3"], to: ["L3"], description: "Evidence/Belief contradicts a Belief" },
237
- reinforces: { from: ["L2", "L3"], to: ["L3"], description: "Evidence/Belief reinforces a Belief" },
238
- corroborates: { from: ["L2", "L3"], to: ["L3"], description: "Independent evidence/belief corroborates a Belief" },
239
- strengthened_by: { from: ["L3"], to: ["L2", "L3"], description: "Belief is strengthened by Evidence/Belief" },
240
- weakened_by: { from: ["L3"], to: ["L2", "L3"], description: "Belief is weakened by Evidence/Belief" },
241
- validated_by: { from: ["L3"], to: ["L2", "L3"], description: "Belief is validated by Evidence/Belief" },
242
- falsified_by: { from: ["L3"], to: ["L2", "L3"], description: "Belief is falsified by Evidence/Belief" },
243
- amplifies: { from: ["L3"], to: ["L3"], description: "Belief amplifies another Belief" },
244
- precondition_for: { from: ["L3"], to: ["L3"], description: "Belief is a precondition for another Belief" },
245
- prerequisite_for: { from: ["L3"], to: ["L3"], description: "Belief is a prerequisite for another Belief" },
246
- required_for: { from: ["L3"], to: ["L3"], description: "Belief is required for another Belief" },
247
- in_tension_with: { from: ["L3"], to: ["L3"], description: "Belief is in tension with another Belief" },
248
- mutually_exclusive: { from: ["L3"], to: ["L3"], description: "Beliefs cannot both hold" },
249
- exclusive_with: { from: ["L3"], to: ["L3"], description: "Belief is exclusive with another Belief" },
250
- alternative_to: { from: ["L3"], to: ["L3"], description: "Belief is an alternative to another Belief" },
251
- subsumes: { from: ["L3"], to: ["L3"], description: "Belief subsumes a narrower Belief" },
252
- extends: { from: ["L3"], to: ["L3"], description: "Belief extends another Belief" },
253
- refines: { from: ["L3"], to: ["L3"], description: "Belief refines another Belief" },
254
- implements: { from: ["L3"], to: ["L3"], description: "Belief implements an abstract Belief" },
255
- violates: { from: ["L3"], to: ["L3"], description: "Belief violates a constraint Belief" },
256
- assumes: { from: ["L3"], to: ["L3"], description: "Belief assumes another Belief" },
257
- would_predict: { from: ["L3"], to: ["L3"], description: "Belief would predict another Belief" },
258
- analogous_to: { from: ["L3"], to: ["L3"], description: "Belief is analogous to another Belief" },
259
- independent_of: { from: ["L3"], to: ["L3"], description: "Belief is independent of another Belief" },
260
- correlates_with: { from: ["L3"], to: ["L3"], description: "Belief correlates with another Belief" },
261
- co_changes_with: { from: ["L3"], to: ["L3"], description: "Belief co-changes with another Belief" },
262
- counterfactual_of: { from: ["L3"], to: ["L3"], description: "Belief is a counterfactual of another Belief" },
263
- parallel_to: { from: ["L3"], to: ["L3"], description: "Belief runs parallel to another Belief" },
264
- cascade_from: { from: ["L3"], to: ["L3"], description: "Cascade from an upstream Belief" },
265
- cascade_to: { from: ["L3"], to: ["L3"], description: "Cascade to a downstream Belief" },
266
- collapses_if: { from: ["L3"], to: ["L3"], description: "Belief collapses if another fails" },
267
- branches_from: { from: ["L3"], to: ["L3"], description: "Belief branches from an ancestor Belief" },
268
- same_as: { from: ["L2", "L3", "ontological"], to: ["L2", "L3", "ontological"], description: "Two nodes are the same entity" },
269
- answers: { from: ["L2", "L3"], to: ["L3"], description: "Answer/Belief answers a Question" },
270
- partially_answers: { from: ["L2", "L3"], to: ["L3"], description: "Answer/Belief partially answers a Question" },
271
- explores: { from: ["L3"], to: ["L3"], description: "Question explores a Belief/Theme" },
272
- informed_by_theme: { from: ["L3"], to: ["L3"], description: "Belief is informed by a Theme" },
273
- same_theme_as: { from: ["L3"], to: ["L3"], description: "Two Beliefs share a Theme" },
274
- based_on: { from: ["L4"], to: ["L3"], description: "Decision is based on a Belief/Question" },
275
- based_on_belief: { from: ["L4"], to: ["L3"], description: "Decision is based on a Belief" },
276
- based_on_question: { from: ["L4"], to: ["L3"], description: "Decision is based on a Question" },
277
- blocked_by_contradiction: { from: ["L4"], to: ["L3"], description: "Decision is blocked by a Contradiction" },
278
- parent_of: { from: ["L3", "L4", "ontological", "organizational"], to: ["L2", "L3", "ontological", "organizational"], description: "A is the parent of B" },
279
- child_of: { from: ["L2", "L3", "ontological", "organizational"], to: ["L3", "L4", "ontological", "organizational"], description: "A is the child of B" },
280
- scoped_by: { from: ["L2", "L3"], to: ["L3", "organizational"], description: "Object is scoped by a Topic/Theme" },
281
- cites: { from: ["L2", "L3"], to: ["L1", "L2"], description: "Evidence/Belief cites a Source/Excerpt" },
282
- summarizes: { from: ["L2", "L3"], to: ["L1", "L2"], description: "Synthesis/Evidence summarizes a Source/Evidence" },
283
- same_source_as: { from: ["L1", "L2"], to: ["L1", "L2"], description: "Two nodes derive from the same Source" },
284
- migrating_from: { from: ["L2", "L3", "L4"], to: ["L1", "L2", "L3"], description: "Migration lineage: from an ancestor" },
285
- migrating_to: { from: ["L1", "L2", "L3"], to: ["L2", "L3", "L4"], description: "Migration lineage: to a successor" },
286
- about_entity: { from: ["L2", "L3"], to: ["ontological"], description: "Belief/Evidence is about an Entity" },
287
- entity_referenced_in: { from: ["ontological"], to: ["L1", "L2"], description: "Entity is referenced in a Source/Evidence" },
288
- related_to: { from: ["L2", "L3", "ontological", "organizational"], to: ["L2", "L3", "ontological", "organizational"], description: "Lateral adjacency; no confidence pressure" },
289
- blocks: { from: ["L3", "L4"], to: ["L3", "L4"], description: "A blocks B (structural gate)" }
223
+ qualifies: {
224
+ from: ["L2", "L3"],
225
+ to: ["L3"],
226
+ description: "Evidence/Belief qualifies a Belief"
227
+ },
228
+ contradicts: {
229
+ from: ["L2", "L3"],
230
+ to: ["L3"],
231
+ description: "Evidence/Belief contradicts a Belief"
232
+ },
233
+ reinforces: {
234
+ from: ["L2", "L3"],
235
+ to: ["L3"],
236
+ description: "Evidence/Belief reinforces a Belief"
237
+ },
238
+ corroborates: {
239
+ from: ["L2", "L3"],
240
+ to: ["L3"],
241
+ description: "Independent evidence/belief corroborates a Belief"
242
+ },
243
+ strengthened_by: {
244
+ from: ["L3"],
245
+ to: ["L2", "L3"],
246
+ description: "Belief is strengthened by Evidence/Belief"
247
+ },
248
+ weakened_by: {
249
+ from: ["L3"],
250
+ to: ["L2", "L3"],
251
+ description: "Belief is weakened by Evidence/Belief"
252
+ },
253
+ validated_by: {
254
+ from: ["L3"],
255
+ to: ["L2", "L3"],
256
+ description: "Belief is validated by Evidence/Belief"
257
+ },
258
+ falsified_by: {
259
+ from: ["L3"],
260
+ to: ["L2", "L3"],
261
+ description: "Belief is falsified by Evidence/Belief"
262
+ },
263
+ amplifies: {
264
+ from: ["L3"],
265
+ to: ["L3"],
266
+ description: "Belief amplifies another Belief"
267
+ },
268
+ precondition_for: {
269
+ from: ["L3"],
270
+ to: ["L3"],
271
+ description: "Belief is a precondition for another Belief"
272
+ },
273
+ prerequisite_for: {
274
+ from: ["L3"],
275
+ to: ["L3"],
276
+ description: "Belief is a prerequisite for another Belief"
277
+ },
278
+ required_for: {
279
+ from: ["L3"],
280
+ to: ["L3"],
281
+ description: "Belief is required for another Belief"
282
+ },
283
+ in_tension_with: {
284
+ from: ["L3"],
285
+ to: ["L3"],
286
+ description: "Belief is in tension with another Belief"
287
+ },
288
+ mutually_exclusive: {
289
+ from: ["L3"],
290
+ to: ["L3"],
291
+ description: "Beliefs cannot both hold"
292
+ },
293
+ exclusive_with: {
294
+ from: ["L3"],
295
+ to: ["L3"],
296
+ description: "Belief is exclusive with another Belief"
297
+ },
298
+ alternative_to: {
299
+ from: ["L3"],
300
+ to: ["L3"],
301
+ description: "Belief is an alternative to another Belief"
302
+ },
303
+ subsumes: {
304
+ from: ["L3"],
305
+ to: ["L3"],
306
+ description: "Belief subsumes a narrower Belief"
307
+ },
308
+ extends: {
309
+ from: ["L3"],
310
+ to: ["L3"],
311
+ description: "Belief extends another Belief"
312
+ },
313
+ refines: {
314
+ from: ["L3"],
315
+ to: ["L3"],
316
+ description: "Belief refines another Belief"
317
+ },
318
+ implements: {
319
+ from: ["L3"],
320
+ to: ["L3"],
321
+ description: "Belief implements an abstract Belief"
322
+ },
323
+ violates: {
324
+ from: ["L3"],
325
+ to: ["L3"],
326
+ description: "Belief violates a constraint Belief"
327
+ },
328
+ assumes: {
329
+ from: ["L3"],
330
+ to: ["L3"],
331
+ description: "Belief assumes another Belief"
332
+ },
333
+ would_predict: {
334
+ from: ["L3"],
335
+ to: ["L3"],
336
+ description: "Belief would predict another Belief"
337
+ },
338
+ analogous_to: {
339
+ from: ["L3"],
340
+ to: ["L3"],
341
+ description: "Belief is analogous to another Belief"
342
+ },
343
+ independent_of: {
344
+ from: ["L3"],
345
+ to: ["L3"],
346
+ description: "Belief is independent of another Belief"
347
+ },
348
+ correlates_with: {
349
+ from: ["L3"],
350
+ to: ["L3"],
351
+ description: "Belief correlates with another Belief"
352
+ },
353
+ co_changes_with: {
354
+ from: ["L3"],
355
+ to: ["L3"],
356
+ description: "Belief co-changes with another Belief"
357
+ },
358
+ counterfactual_of: {
359
+ from: ["L3"],
360
+ to: ["L3"],
361
+ description: "Belief is a counterfactual of another Belief"
362
+ },
363
+ parallel_to: {
364
+ from: ["L3"],
365
+ to: ["L3"],
366
+ description: "Belief runs parallel to another Belief"
367
+ },
368
+ cascade_from: {
369
+ from: ["L3"],
370
+ to: ["L3"],
371
+ description: "Cascade from an upstream Belief"
372
+ },
373
+ cascade_to: {
374
+ from: ["L3"],
375
+ to: ["L3"],
376
+ description: "Cascade to a downstream Belief"
377
+ },
378
+ collapses_if: {
379
+ from: ["L3"],
380
+ to: ["L3"],
381
+ description: "Belief collapses if another fails"
382
+ },
383
+ branches_from: {
384
+ from: ["L3"],
385
+ to: ["L3"],
386
+ description: "Belief branches from an ancestor Belief"
387
+ },
388
+ same_as: {
389
+ from: ["L2", "L3", "ontological"],
390
+ to: ["L2", "L3", "ontological"],
391
+ description: "Two nodes are the same entity"
392
+ },
393
+ answers: {
394
+ from: ["L2", "L3"],
395
+ to: ["L3"],
396
+ description: "Answer/Belief answers a Question"
397
+ },
398
+ partially_answers: {
399
+ from: ["L2", "L3"],
400
+ to: ["L3"],
401
+ description: "Answer/Belief partially answers a Question"
402
+ },
403
+ explores: {
404
+ from: ["L3"],
405
+ to: ["L3"],
406
+ description: "Question explores a Belief/Theme"
407
+ },
408
+ informed_by_theme: {
409
+ from: ["L3"],
410
+ to: ["L3"],
411
+ description: "Belief is informed by a Theme"
412
+ },
413
+ same_theme_as: {
414
+ from: ["L3"],
415
+ to: ["L3"],
416
+ description: "Two Beliefs share a Theme"
417
+ },
418
+ based_on: {
419
+ from: ["L4"],
420
+ to: ["L3"],
421
+ description: "Decision is based on a Belief/Question"
422
+ },
423
+ based_on_belief: {
424
+ from: ["L4"],
425
+ to: ["L3"],
426
+ description: "Decision is based on a Belief"
427
+ },
428
+ based_on_question: {
429
+ from: ["L4"],
430
+ to: ["L3"],
431
+ description: "Decision is based on a Question"
432
+ },
433
+ blocked_by_contradiction: {
434
+ from: ["L4"],
435
+ to: ["L3"],
436
+ description: "Decision is blocked by a Contradiction"
437
+ },
438
+ parent_of: {
439
+ from: ["L3", "L4", "ontological", "organizational"],
440
+ to: ["L2", "L3", "ontological", "organizational"],
441
+ description: "A is the parent of B"
442
+ },
443
+ child_of: {
444
+ from: ["L2", "L3", "ontological", "organizational"],
445
+ to: ["L3", "L4", "ontological", "organizational"],
446
+ description: "A is the child of B"
447
+ },
448
+ scoped_by: {
449
+ from: ["L2", "L3"],
450
+ to: ["L3", "organizational"],
451
+ description: "Object is scoped by a Topic/Theme"
452
+ },
453
+ cites: {
454
+ from: ["L2", "L3"],
455
+ to: ["L1", "L2"],
456
+ description: "Evidence/Belief cites a Source/Excerpt"
457
+ },
458
+ summarizes: {
459
+ from: ["L2", "L3"],
460
+ to: ["L1", "L2"],
461
+ description: "Synthesis/Evidence summarizes a Source/Evidence"
462
+ },
463
+ same_source_as: {
464
+ from: ["L1", "L2"],
465
+ to: ["L1", "L2"],
466
+ description: "Two nodes derive from the same Source"
467
+ },
468
+ migrating_from: {
469
+ from: ["L2", "L3", "L4"],
470
+ to: ["L1", "L2", "L3"],
471
+ description: "Migration lineage: from an ancestor"
472
+ },
473
+ migrating_to: {
474
+ from: ["L1", "L2", "L3"],
475
+ to: ["L2", "L3", "L4"],
476
+ description: "Migration lineage: to a successor"
477
+ },
478
+ about_entity: {
479
+ from: ["L2", "L3"],
480
+ to: ["ontological"],
481
+ description: "Belief/Evidence is about an Entity"
482
+ },
483
+ entity_referenced_in: {
484
+ from: ["ontological"],
485
+ to: ["L1", "L2"],
486
+ description: "Entity is referenced in a Source/Evidence"
487
+ },
488
+ related_to: {
489
+ from: ["L2", "L3", "ontological", "organizational"],
490
+ to: ["L2", "L3", "ontological", "organizational"],
491
+ description: "Lateral adjacency; no confidence pressure"
492
+ },
493
+ blocks: {
494
+ from: ["L3", "L4"],
495
+ to: ["L3", "L4"],
496
+ description: "A blocks B (structural gate)"
497
+ }
290
498
  };
291
499
  function validateEdgeLayers(edgeType, fromLayer, toLayer) {
292
500
  const rules = EDGE_LAYER_RULES[edgeType];
@@ -346,6 +554,252 @@ var ENTITY_BRIDGE_EDGE_TYPES = [
346
554
  "impacts",
347
555
  "mentioned_in"
348
556
  ];
557
+ var ENTITY_BRIDGE_EDGE_TYPE_SET = new Set(ENTITY_BRIDGE_EDGE_TYPES);
558
+ function isRecord(value) {
559
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
560
+ }
561
+ function readConvexId(value) {
562
+ return typeof value === "string" && value.trim().length > 0 ? value : void 0;
563
+ }
564
+ function readOptionalNumber(value) {
565
+ return typeof value === "number" && Number.isFinite(value) ? value : void 0;
566
+ }
567
+ function readOptionalString(value) {
568
+ return typeof value === "string" && value.trim().length > 0 ? value : void 0;
569
+ }
570
+ function readRecord(value) {
571
+ return isRecord(value) ? value : void 0;
572
+ }
573
+ function readBridgeEdge(value) {
574
+ if (!isRecord(value)) {
575
+ return null;
576
+ }
577
+ const edgeType = readOptionalString(value.edgeType);
578
+ if (!edgeType) {
579
+ return null;
580
+ }
581
+ const edge = { edgeType };
582
+ const context = readOptionalString(value.context);
583
+ const fromNodeId = readConvexId(value.fromNodeId);
584
+ const toNodeId = readConvexId(value.toNodeId);
585
+ const weight = readOptionalNumber(value.weight);
586
+ if (context !== void 0) {
587
+ edge.context = context;
588
+ }
589
+ if (fromNodeId !== void 0) {
590
+ edge.fromNodeId = fromNodeId;
591
+ }
592
+ if (toNodeId !== void 0) {
593
+ edge.toNodeId = toNodeId;
594
+ }
595
+ if (weight !== void 0) {
596
+ edge.weight = weight;
597
+ }
598
+ return edge;
599
+ }
600
+ function readBridgeNode(value) {
601
+ if (!isRecord(value)) {
602
+ return null;
603
+ }
604
+ const id = readConvexId(value._id);
605
+ if (!id) {
606
+ return null;
607
+ }
608
+ const node = { ...value, _id: id };
609
+ const canonicalText = readOptionalString(value.canonicalText);
610
+ const epistemicLayer = readOptionalString(value.epistemicLayer);
611
+ const globalId = readOptionalString(value.globalId);
612
+ const metadata = readRecord(value.metadata);
613
+ const nodeType = readOptionalString(value.nodeType);
614
+ const projectId = readOptionalString(value.projectId);
615
+ const status = readOptionalString(value.status);
616
+ const title = readOptionalString(value.title);
617
+ const topicId = readOptionalString(value.topicId);
618
+ if (canonicalText !== void 0) {
619
+ node.canonicalText = canonicalText;
620
+ }
621
+ if (epistemicLayer !== void 0) {
622
+ node.epistemicLayer = epistemicLayer;
623
+ }
624
+ if (globalId !== void 0) {
625
+ node.globalId = globalId;
626
+ }
627
+ if (metadata !== void 0) {
628
+ node.metadata = metadata;
629
+ }
630
+ if (nodeType !== void 0) {
631
+ node.nodeType = nodeType;
632
+ }
633
+ if (projectId !== void 0) {
634
+ node.projectId = projectId;
635
+ }
636
+ if (status !== void 0) {
637
+ node.status = status;
638
+ }
639
+ if (title !== void 0) {
640
+ node.title = title;
641
+ }
642
+ if (topicId !== void 0) {
643
+ node.topicId = topicId;
644
+ }
645
+ return node;
646
+ }
647
+ function readRowList(values, reader) {
648
+ return values.flatMap((value) => {
649
+ const row = reader(value);
650
+ return row ? [row] : [];
651
+ });
652
+ }
653
+ function readTopicScopeNode(value) {
654
+ return readBridgeNode(value);
655
+ }
656
+ function isEntityScopeBridgeEdge(edgeType) {
657
+ if (!edgeType) {
658
+ return false;
659
+ }
660
+ return ENTITY_BRIDGE_EDGE_TYPE_SET.has(edgeType);
661
+ }
662
+ async function queryEdgesByTarget(ctx, nodeId) {
663
+ return readRowList(
664
+ await ctx.db.query("epistemicEdges").withIndex("by_to", (q) => q.eq("toNodeId", nodeId)).collect(),
665
+ readBridgeEdge
666
+ );
667
+ }
668
+ async function queryEdgesBySource(ctx, nodeId) {
669
+ return readRowList(
670
+ await ctx.db.query("epistemicEdges").withIndex("by_from", (q) => q.eq("fromNodeId", nodeId)).collect(),
671
+ readBridgeEdge
672
+ );
673
+ }
674
+ async function readNodeById(ctx, nodeId) {
675
+ return readBridgeNode(await ctx.db.get(nodeId));
676
+ }
677
+ async function readNodeByIdForMutation(ctx, nodeId) {
678
+ return readBridgeNode(await ctx.db.get(nodeId));
679
+ }
680
+ function collectConnectedEntityNodeIds(connectedNodeIds, edges, mapFromInbound) {
681
+ for (const edge of edges) {
682
+ if (!isEntityScopeBridgeEdge(edge.edgeType)) {
683
+ continue;
684
+ }
685
+ const nextId = mapFromInbound ? edge.fromNodeId : edge.toNodeId;
686
+ if (!nextId) {
687
+ continue;
688
+ }
689
+ connectedNodeIds.add(String(nextId));
690
+ }
691
+ }
692
+ async function collectEntityTopicContextIds(ctx, connectedNodeIds) {
693
+ const topicIds = /* @__PURE__ */ new Set();
694
+ const projectIds = /* @__PURE__ */ new Set();
695
+ for (const nodeId of connectedNodeIds) {
696
+ const node = readTopicScopeNode(
697
+ await ctx.db.get(nodeId)
698
+ );
699
+ if (node?.status !== "active") {
700
+ continue;
701
+ }
702
+ if (node.projectId) {
703
+ projectIds.add(String(node.projectId));
704
+ }
705
+ if (node.topicId) {
706
+ topicIds.add(String(node.topicId));
707
+ }
708
+ }
709
+ return { topicIds, projectIds };
710
+ }
711
+ async function collectScopedTopicIdsFromConnectedNodes(ctx, connectedNodeIds) {
712
+ const scopedTopicIds = await Promise.all(
713
+ [...connectedNodeIds].map(async (nodeId) => {
714
+ const scopeEdges = await queryEdgesBySource(
715
+ ctx,
716
+ nodeId
717
+ );
718
+ const mappedTopicIds = scopeEdges.map(async (edge) => {
719
+ if (edge.edgeType !== "contains" || !edge.toNodeId) {
720
+ return;
721
+ }
722
+ const scopedTopicNode = readTopicScopeNode(
723
+ await ctx.db.get(edge.toNodeId)
724
+ );
725
+ const canonicalTopicId = readMaterializedTopicTableId(scopedTopicNode);
726
+ if (!canonicalTopicId) {
727
+ return;
728
+ }
729
+ return String(canonicalTopicId);
730
+ });
731
+ return Promise.all(mappedTopicIds);
732
+ })
733
+ );
734
+ return scopedTopicIds.flat().filter((topicId) => Boolean(topicId));
735
+ }
736
+ function buildEntityBeliefEdgeDirection(args, entity, belief) {
737
+ const { edgeType, entityNodeId, beliefNodeId } = args;
738
+ const effectiveEdgeType = edgeType || "contains";
739
+ const entityLayer = getNodeLayer(entity.nodeType);
740
+ const beliefLayer = getNodeLayer(belief.nodeType);
741
+ if (effectiveEdgeType === "contains" && entity.epistemicLayer === "ontological") {
742
+ return {
743
+ fromNodeId: beliefNodeId,
744
+ toNodeId: entityNodeId,
745
+ fromGlobalId: belief.globalId,
746
+ toGlobalId: entity.globalId,
747
+ fromNodeType: belief.nodeType,
748
+ toNodeType: entity.nodeType,
749
+ edgeFromLayer: beliefLayer,
750
+ edgeToLayer: "ontological"
751
+ };
752
+ }
753
+ if (effectiveEdgeType === "mentioned_in" || effectiveEdgeType === "perspective_on") {
754
+ return {
755
+ fromNodeId: entityNodeId,
756
+ toNodeId: beliefNodeId,
757
+ fromGlobalId: entity.globalId,
758
+ toGlobalId: belief.globalId,
759
+ fromNodeType: entity.nodeType,
760
+ toNodeType: belief.nodeType,
761
+ edgeFromLayer: "ontological",
762
+ edgeToLayer: beliefLayer
763
+ };
764
+ }
765
+ const directValidation = validateEdgeLayers(
766
+ effectiveEdgeType,
767
+ entityLayer,
768
+ beliefLayer
769
+ );
770
+ if (directValidation.valid) {
771
+ return {
772
+ fromNodeId: entityNodeId,
773
+ toNodeId: beliefNodeId,
774
+ fromGlobalId: entity.globalId,
775
+ toGlobalId: belief.globalId,
776
+ fromNodeType: entity.nodeType,
777
+ toNodeType: belief.nodeType,
778
+ edgeFromLayer: entityLayer,
779
+ edgeToLayer: beliefLayer
780
+ };
781
+ }
782
+ const reversedValidation = validateEdgeLayers(
783
+ effectiveEdgeType,
784
+ beliefLayer,
785
+ entityLayer
786
+ );
787
+ if (!reversedValidation.valid) {
788
+ throw new Error(
789
+ `Edge type '${effectiveEdgeType}' is not valid between ${entity.nodeType} (${entityLayer}) and ${belief.nodeType} (${beliefLayer}): ${directValidation.reason}`
790
+ );
791
+ }
792
+ return {
793
+ fromNodeId: beliefNodeId,
794
+ toNodeId: entityNodeId,
795
+ fromGlobalId: belief.globalId,
796
+ toGlobalId: entity.globalId,
797
+ fromNodeType: belief.nodeType,
798
+ toNodeType: entity.nodeType,
799
+ edgeFromLayer: beliefLayer,
800
+ edgeToLayer: entityLayer
801
+ };
802
+ }
349
803
  var getBeliefsForEntity = query({
350
804
  args: {
351
805
  entityNodeId: v.id("epistemicNodes"),
@@ -353,8 +807,8 @@ var getBeliefsForEntity = query({
353
807
  },
354
808
  returns: permissiveReturn,
355
809
  handler: async (ctx, args) => {
356
- const entity = await ctx.db.get(args.entityNodeId);
357
- if (!entity || entity.epistemicLayer !== "ontological") {
810
+ const entity = await readNodeById(ctx, args.entityNodeId);
811
+ if (entity?.epistemicLayer !== "ontological") {
358
812
  return { beliefs: [], entity: null };
359
813
  }
360
814
  const filterTypes = args.edgeTypes || [
@@ -363,12 +817,12 @@ var getBeliefsForEntity = query({
363
817
  "perspective_on",
364
818
  "impacts"
365
819
  ];
366
- const inboundEdges = await ctx.db.query("epistemicEdges").withIndex("by_to", (q) => q.eq("toNodeId", args.entityNodeId)).collect();
367
- const outboundEdges = await ctx.db.query("epistemicEdges").withIndex("by_from", (q) => q.eq("fromNodeId", args.entityNodeId)).collect();
820
+ const inboundEdges = await queryEdgesByTarget(ctx, args.entityNodeId);
821
+ const outboundEdges = await queryEdgesBySource(ctx, args.entityNodeId);
368
822
  const beliefNodeIds = /* @__PURE__ */ new Set();
369
823
  const edgeMap = {};
370
824
  for (const edge of inboundEdges) {
371
- if (!filterTypes.includes(edge.edgeType) || !edge.fromNodeId) {
825
+ if (!(filterTypes.includes(edge.edgeType) && edge.fromNodeId)) {
372
826
  continue;
373
827
  }
374
828
  const id = String(edge.fromNodeId);
@@ -381,7 +835,7 @@ var getBeliefsForEntity = query({
381
835
  }
382
836
  for (const edge of outboundEdges) {
383
837
  const et = edge.edgeType;
384
- if (!filterTypes.includes(et) || !edge.toNodeId || et === "mentioned_in") {
838
+ if (!(filterTypes.includes(et) && edge.toNodeId) || et === "mentioned_in") {
385
839
  continue;
386
840
  }
387
841
  const id = String(edge.toNodeId);
@@ -394,8 +848,8 @@ var getBeliefsForEntity = query({
394
848
  }
395
849
  const beliefs = await Promise.all(
396
850
  [...beliefNodeIds].map(async (nodeId) => {
397
- const node = await ctx.db.get(nodeId);
398
- if (!node || node.status !== "active") {
851
+ const node = await readNodeById(ctx, nodeId);
852
+ if (node?.status !== "active") {
399
853
  return null;
400
854
  }
401
855
  return {
@@ -423,7 +877,7 @@ var getEntitiesForBelief = query({
423
877
  },
424
878
  returns: permissiveReturn,
425
879
  handler: async (ctx, args) => {
426
- const belief = await ctx.db.get(args.beliefNodeId);
880
+ const belief = await readNodeById(ctx, args.beliefNodeId);
427
881
  if (!belief) {
428
882
  return { entities: [], belief: null };
429
883
  }
@@ -433,12 +887,12 @@ var getEntitiesForBelief = query({
433
887
  "perspective_on",
434
888
  "impacts"
435
889
  ];
436
- const outboundEdges = await ctx.db.query("epistemicEdges").withIndex("by_from", (q) => q.eq("fromNodeId", args.beliefNodeId)).collect();
437
- const inboundEdges = await ctx.db.query("epistemicEdges").withIndex("by_to", (q) => q.eq("toNodeId", args.beliefNodeId)).collect();
890
+ const outboundEdges = await queryEdgesBySource(ctx, args.beliefNodeId);
891
+ const inboundEdges = await queryEdgesByTarget(ctx, args.beliefNodeId);
438
892
  const entityNodeIds = /* @__PURE__ */ new Set();
439
893
  const edgeMap = {};
440
894
  for (const edge of outboundEdges) {
441
- if (!filterTypes.includes(edge.edgeType) || !edge.toNodeId) {
895
+ if (!(filterTypes.includes(edge.edgeType) && edge.toNodeId)) {
442
896
  continue;
443
897
  }
444
898
  const id = String(edge.toNodeId);
@@ -450,7 +904,7 @@ var getEntitiesForBelief = query({
450
904
  };
451
905
  }
452
906
  for (const edge of inboundEdges) {
453
- if (!filterTypes.includes(edge.edgeType) || !edge.fromNodeId) {
907
+ if (!(filterTypes.includes(edge.edgeType) && edge.fromNodeId)) {
454
908
  continue;
455
909
  }
456
910
  const id = String(edge.fromNodeId);
@@ -463,8 +917,8 @@ var getEntitiesForBelief = query({
463
917
  }
464
918
  const entities = await Promise.all(
465
919
  [...entityNodeIds].map(async (nodeId) => {
466
- const node = await ctx.db.get(nodeId);
467
- if (!node || node.status !== "active" || node.epistemicLayer !== "ontological") {
920
+ const node = await readNodeById(ctx, nodeId);
921
+ if (node?.status !== "active" || node.epistemicLayer !== "ontological") {
468
922
  return null;
469
923
  }
470
924
  return {
@@ -491,59 +945,27 @@ var getEntityTopicScope = query({
491
945
  },
492
946
  returns: permissiveReturn,
493
947
  handler: async (ctx, args) => {
494
- const entity = await ctx.db.get(args.entityNodeId);
495
- if (!entity || entity.epistemicLayer !== "ontological") {
948
+ const entity = await readNodeById(ctx, args.entityNodeId);
949
+ if (entity?.epistemicLayer !== "ontological") {
496
950
  return { topics: [], projectIds: [] };
497
951
  }
498
- const inboundEdges = await ctx.db.query("epistemicEdges").withIndex("by_to", (q) => q.eq("toNodeId", args.entityNodeId)).collect();
499
- const outboundEdges = await ctx.db.query("epistemicEdges").withIndex("by_from", (q) => q.eq("fromNodeId", args.entityNodeId)).collect();
952
+ const [inboundEdges, outboundEdges] = await Promise.all([
953
+ queryEdgesByTarget(ctx, args.entityNodeId),
954
+ queryEdgesBySource(ctx, args.entityNodeId)
955
+ ]);
500
956
  const connectedNodeIds = /* @__PURE__ */ new Set();
501
- for (const edge of inboundEdges) {
502
- if (ENTITY_BRIDGE_EDGE_TYPES.includes(
503
- edge.edgeType
504
- ) && edge.fromNodeId) {
505
- connectedNodeIds.add(String(edge.fromNodeId));
506
- }
507
- }
508
- for (const edge of outboundEdges) {
509
- if (ENTITY_BRIDGE_EDGE_TYPES.includes(
510
- edge.edgeType
511
- ) && edge.toNodeId) {
512
- connectedNodeIds.add(String(edge.toNodeId));
513
- }
514
- }
515
- const projectIds = /* @__PURE__ */ new Set();
516
- const topicIds = /* @__PURE__ */ new Set();
517
- for (const nodeId of connectedNodeIds) {
518
- const node = await ctx.db.get(nodeId);
519
- if (!node || node.status !== "active") {
520
- continue;
521
- }
522
- if (node.projectId) {
523
- projectIds.add(String(node.projectId));
524
- }
525
- if (node.topicId) {
526
- topicIds.add(String(node.topicId));
527
- }
528
- }
529
- for (const nodeId of connectedNodeIds) {
530
- const scopeEdges = await ctx.db.query("epistemicEdges").withIndex(
531
- "by_from",
532
- (q) => q.eq("fromNodeId", nodeId)
533
- ).collect();
534
- for (const edge of scopeEdges) {
535
- if (edge.edgeType === "contains" && edge.toNodeId) {
536
- const scopedTopicNode = await ctx.db.get(
537
- edge.toNodeId
538
- );
539
- const canonicalTopicId = readMaterializedTopicTableId(
540
- scopedTopicNode
541
- );
542
- if (canonicalTopicId) {
543
- topicIds.add(canonicalTopicId);
544
- }
545
- }
546
- }
957
+ collectConnectedEntityNodeIds(connectedNodeIds, inboundEdges, true);
958
+ collectConnectedEntityNodeIds(connectedNodeIds, outboundEdges, false);
959
+ const { topicIds, projectIds } = await collectEntityTopicContextIds(
960
+ ctx,
961
+ connectedNodeIds
962
+ );
963
+ const inferredTopicIds = await collectScopedTopicIdsFromConnectedNodes(
964
+ ctx,
965
+ connectedNodeIds
966
+ );
967
+ for (const topicId of inferredTopicIds) {
968
+ topicIds.add(topicId);
547
969
  }
548
970
  return {
549
971
  topics: [...topicIds],
@@ -559,15 +981,12 @@ var getEvidenceForEntity = query({
559
981
  },
560
982
  returns: permissiveReturn,
561
983
  handler: async (ctx, args) => {
562
- const entity = await ctx.db.get(args.entityNodeId);
563
- if (!entity || entity.epistemicLayer !== "ontological") {
984
+ const entity = await readNodeById(ctx, args.entityNodeId);
985
+ if (entity?.epistemicLayer !== "ontological") {
564
986
  return [];
565
987
  }
566
988
  const effectiveLimit = args.limit ?? 50;
567
- const outboundEdges = await ctx.db.query("epistemicEdges").withIndex(
568
- "by_from",
569
- (q) => q.eq("fromNodeId", args.entityNodeId)
570
- ).collect();
989
+ const outboundEdges = await queryEdgesBySource(ctx, args.entityNodeId);
571
990
  const evidenceEdges = outboundEdges.filter((e) => {
572
991
  const et = e.edgeType;
573
992
  return et === "contains" || et === "mentioned_in";
@@ -577,8 +996,8 @@ var getEvidenceForEntity = query({
577
996
  if (!edge.toNodeId) {
578
997
  return null;
579
998
  }
580
- const node = await ctx.db.get(edge.toNodeId);
581
- if (!node || node.status !== "active") {
999
+ const node = await readNodeById(ctx, edge.toNodeId);
1000
+ if (node?.status !== "active") {
582
1001
  return null;
583
1002
  }
584
1003
  return {
@@ -608,11 +1027,11 @@ var linkEntityToBelief = mutation({
608
1027
  if (!userId) {
609
1028
  throw new Error("Authentication required to create entity-belief links.");
610
1029
  }
611
- const entity = await ctx.db.get(args.entityNodeId);
612
- if (!entity || entity.epistemicLayer !== "ontological") {
1030
+ const entity = await readNodeByIdForMutation(ctx, args.entityNodeId);
1031
+ if (entity?.epistemicLayer !== "ontological") {
613
1032
  throw new Error("Source node must be an ontological entity.");
614
1033
  }
615
- const belief = await ctx.db.get(args.beliefNodeId);
1034
+ const belief = await readNodeByIdForMutation(ctx, args.beliefNodeId);
616
1035
  if (!belief) {
617
1036
  throw new Error("Target belief/question/theme node not found.");
618
1037
  }
@@ -624,71 +1043,29 @@ var linkEntityToBelief = mutation({
624
1043
  "Target belief/question/theme node is missing a globalId."
625
1044
  );
626
1045
  }
627
- const effectiveEdgeType = args.edgeType || "contains";
628
- const fromLayer = getNodeLayer(entity.nodeType);
629
- const toLayer = getNodeLayer(belief.nodeType);
630
- let fromNodeId;
631
- let toNodeId;
632
- let fromGlobalId;
633
- let toGlobalId;
634
- let fromNodeType;
635
- let toNodeType;
636
- let edgeFromLayer;
637
- let edgeToLayer;
638
- if (effectiveEdgeType === "contains" && entity.epistemicLayer === "ontological") {
639
- fromNodeId = args.beliefNodeId;
640
- toNodeId = args.entityNodeId;
641
- fromGlobalId = belief.globalId;
642
- toGlobalId = entity.globalId;
643
- fromNodeType = belief.nodeType;
644
- toNodeType = entity.nodeType;
645
- edgeFromLayer = getNodeLayer(belief.nodeType);
646
- edgeToLayer = "ontological";
647
- } else if (effectiveEdgeType === "mentioned_in" || effectiveEdgeType === "perspective_on") {
648
- fromNodeId = args.entityNodeId;
649
- toNodeId = args.beliefNodeId;
650
- fromGlobalId = entity.globalId;
651
- toGlobalId = belief.globalId;
652
- fromNodeType = entity.nodeType;
653
- toNodeType = belief.nodeType;
654
- edgeFromLayer = "ontological";
655
- edgeToLayer = getNodeLayer(belief.nodeType);
656
- } else {
657
- const validation = validateEdgeLayers(
658
- effectiveEdgeType,
659
- fromLayer,
660
- toLayer
1046
+ if (!entity.nodeType) {
1047
+ throw new Error("Source entity is missing a nodeType.");
1048
+ }
1049
+ if (!belief.nodeType) {
1050
+ throw new Error(
1051
+ "Target belief/question/theme node is missing a nodeType."
661
1052
  );
662
- if (validation.valid) {
663
- fromNodeId = args.entityNodeId;
664
- toNodeId = args.beliefNodeId;
665
- fromGlobalId = entity.globalId;
666
- toGlobalId = belief.globalId;
667
- fromNodeType = entity.nodeType;
668
- toNodeType = belief.nodeType;
669
- edgeFromLayer = fromLayer;
670
- edgeToLayer = toLayer;
671
- } else {
672
- const reversed = validateEdgeLayers(
673
- effectiveEdgeType,
674
- toLayer,
675
- fromLayer
676
- );
677
- if (!reversed.valid) {
678
- throw new Error(
679
- `Edge type '${effectiveEdgeType}' is not valid between ${entity.nodeType} (${fromLayer}) and ${belief.nodeType} (${toLayer}): ${validation.reason}`
680
- );
681
- }
682
- fromNodeId = args.beliefNodeId;
683
- toNodeId = args.entityNodeId;
684
- fromGlobalId = belief.globalId;
685
- toGlobalId = entity.globalId;
686
- fromNodeType = belief.nodeType;
687
- toNodeType = entity.nodeType;
688
- edgeFromLayer = toLayer;
689
- edgeToLayer = fromLayer;
690
- }
691
1053
  }
1054
+ const edgeDirection = buildEntityBeliefEdgeDirection(
1055
+ args,
1056
+ {
1057
+ nodeType: entity.nodeType,
1058
+ globalId: entity.globalId,
1059
+ epistemicLayer: entity.epistemicLayer
1060
+ },
1061
+ {
1062
+ nodeType: belief.nodeType,
1063
+ globalId: belief.globalId
1064
+ }
1065
+ );
1066
+ const { fromNodeId, toNodeId, fromGlobalId, toGlobalId } = edgeDirection;
1067
+ const { fromNodeType, toNodeType, edgeFromLayer, edgeToLayer } = edgeDirection;
1068
+ const effectiveEdgeType = args.edgeType || "contains";
692
1069
  const existing = await ctx.db.query("epistemicEdges").withIndex(
693
1070
  "by_from_to",
694
1071
  (q) => q.eq("fromNodeId", fromNodeId).eq("toNodeId", toNodeId)