@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,9 +1,16 @@
1
- import { v } from 'convex/values';
2
1
  import { checkScopeAccess } from '@lucern/access-control/access';
3
2
  import { permissiveReturn } from '@lucern/contracts/schema-helpers/validators';
4
- import { componentsGeneric, queryGeneric, anyApi } from 'convex/server';
3
+ import { v } from 'convex/values';
4
+ import { unsafeConvexAnyApi } from '@lucern/contracts/convex/unsafeAnyApi';
5
+ import { componentsGeneric, queryGeneric } from 'convex/server';
5
6
 
6
7
  // src/epistemicEdges.queries.ts
8
+ var unsafeApi = unsafeConvexAnyApi(
9
+ "graph-primitives top-level module bundle lacks a committed Convex _generated/api surface"
10
+ );
11
+ var api = unsafeApi;
12
+ componentsGeneric();
13
+ var query = queryGeneric;
7
14
 
8
15
  // src/debug.ts
9
16
  function isGraphPrimitiveDebugEnabled() {
@@ -16,9 +23,127 @@ function debugGraphPrimitiveFallback(message, context) {
16
23
  }
17
24
  console.debug(message, context ?? {});
18
25
  }
19
- var api = anyApi;
20
- componentsGeneric();
21
- var query = queryGeneric;
26
+
27
+ // src/graphTypes.ts
28
+ function getNodeLayer(nodeType) {
29
+ const L4_TYPES = ["decision"];
30
+ const L3_TYPES = ["belief", "question", "theme", "deal"];
31
+ const L2_TYPES = ["claim", "evidence", "synthesis", "answer"];
32
+ const L1_TYPES = ["atomic_fact", "excerpt", "source"];
33
+ const ONTOLOGICAL_TYPES = [
34
+ "company",
35
+ "person",
36
+ "investor",
37
+ "function",
38
+ "value_chain"
39
+ ];
40
+ const ORGANIZATIONAL_TYPES = ["topic"];
41
+ if (L4_TYPES.includes(nodeType)) {
42
+ return "L4";
43
+ }
44
+ if (L3_TYPES.includes(nodeType)) {
45
+ return "L3";
46
+ }
47
+ if (L2_TYPES.includes(nodeType)) {
48
+ return "L2";
49
+ }
50
+ if (L1_TYPES.includes(nodeType)) {
51
+ return "L1";
52
+ }
53
+ if (ONTOLOGICAL_TYPES.includes(nodeType)) {
54
+ return "ontological";
55
+ }
56
+ if (ORGANIZATIONAL_TYPES.includes(nodeType)) {
57
+ return "organizational";
58
+ }
59
+ console.warn(`[GraphTypes] Unknown nodeType "${nodeType}", defaulting to L2`);
60
+ return "L2";
61
+ }
62
+
63
+ // src/edgeValidation.ts
64
+ function getLayerDepth(layer) {
65
+ switch (layer) {
66
+ case "L4":
67
+ return 4;
68
+ case "L3":
69
+ return 3;
70
+ case "L2":
71
+ return 2;
72
+ case "L1":
73
+ return 1;
74
+ case "ontological":
75
+ return 0;
76
+ default:
77
+ return -1;
78
+ }
79
+ }
80
+ function shouldContinueTraversal(currentLayer, targetLayer, options) {
81
+ const currentDepth = getLayerDepth(currentLayer);
82
+ const targetDepth = getLayerDepth(targetLayer);
83
+ if (options.minLayer !== void 0 && targetDepth < options.minLayer) {
84
+ return false;
85
+ }
86
+ if (options.maxLayer !== void 0 && targetDepth > options.maxLayer) {
87
+ return false;
88
+ }
89
+ switch (options.mode) {
90
+ case "anchor_down":
91
+ return targetDepth <= currentDepth;
92
+ case "anchor_up":
93
+ return targetDepth >= currentDepth;
94
+ case "same_layer":
95
+ return targetDepth === currentDepth;
96
+ case "decision_trace":
97
+ return currentDepth === 4 ? targetDepth === 3 : targetDepth === currentDepth;
98
+ default:
99
+ return true;
100
+ }
101
+ }
102
+ function getDefaultMinLayer(mode) {
103
+ switch (mode) {
104
+ case "anchor_down":
105
+ return 1;
106
+ case "anchor_up":
107
+ return 2;
108
+ case "same_layer":
109
+ return 1;
110
+ case "decision_trace":
111
+ return 3;
112
+ default:
113
+ return 1;
114
+ }
115
+ }
116
+ function readOptionalString(value) {
117
+ return typeof value === "string" && value.trim().length > 0 ? value : void 0;
118
+ }
119
+ function readConvexId(value) {
120
+ const normalized = readOptionalString(value);
121
+ return normalized;
122
+ }
123
+ function readRecord(value) {
124
+ return value && typeof value === "object" && !Array.isArray(value) ? value : null;
125
+ }
126
+ function readWorkspaceScopedEdge(value) {
127
+ const record = readRecord(value);
128
+ if (!record) {
129
+ return null;
130
+ }
131
+ const id = readConvexId(record._id);
132
+ const edgeType = readOptionalString(record.edgeType);
133
+ if (!(id && edgeType)) {
134
+ return null;
135
+ }
136
+ const edge = { _id: id, edgeType };
137
+ const projectId = readOptionalString(record.projectId);
138
+ if (projectId !== void 0) {
139
+ edge.projectId = projectId;
140
+ }
141
+ const topicId = readOptionalString(record.topicId);
142
+ if (topicId !== void 0) {
143
+ edge.topicId = topicId;
144
+ }
145
+ return edge;
146
+ }
22
147
  v.union(
23
148
  v.literal("L4"),
24
149
  v.literal("L3"),
@@ -113,7 +238,7 @@ var edgeTypeValidator = v.union(
113
238
  v.literal("competes_with")
114
239
  );
115
240
  function edgeMatchesWorkspaceReasoningScope(edge, scope) {
116
- return scope.topicId !== void 0 && edge.topicId === scope.topicId || scope.projectId !== void 0 && edge.projectId === scope.projectId;
241
+ return scope.topicId !== void 0 && edge.topicId === String(scope.topicId) || scope.projectId !== void 0 && (edge.projectId === scope.projectId || edge.topicId === scope.projectId);
117
242
  }
118
243
  async function collectScopedEdges(ctx, scope, scanLimit) {
119
244
  const queries = [];
@@ -136,7 +261,11 @@ async function collectScopedEdges(ctx, scope, scanLimit) {
136
261
  const seen = /* @__PURE__ */ new Set();
137
262
  const deduped = [];
138
263
  const flattened = (await Promise.all(queries)).flat();
139
- for (const edge of flattened) {
264
+ for (const value of flattened) {
265
+ const edge = readWorkspaceScopedEdge(value);
266
+ if (!edge) {
267
+ continue;
268
+ }
140
269
  const key = String(edge._id);
141
270
  if (seen.has(key)) {
142
271
  continue;
@@ -146,96 +275,6 @@ async function collectScopedEdges(ctx, scope, scanLimit) {
146
275
  }
147
276
  return deduped;
148
277
  }
149
-
150
- // src/graphTypes.ts
151
- function getNodeLayer(nodeType) {
152
- const L4_TYPES = ["decision"];
153
- const L3_TYPES = ["belief", "question", "theme", "deal"];
154
- const L2_TYPES = ["claim", "evidence", "synthesis", "answer"];
155
- const L1_TYPES = ["atomic_fact", "excerpt", "source"];
156
- const ONTOLOGICAL_TYPES = [
157
- "company",
158
- "person",
159
- "investor",
160
- "function",
161
- "value_chain"
162
- ];
163
- const ORGANIZATIONAL_TYPES = ["topic"];
164
- if (L4_TYPES.includes(nodeType)) {
165
- return "L4";
166
- }
167
- if (L3_TYPES.includes(nodeType)) {
168
- return "L3";
169
- }
170
- if (L2_TYPES.includes(nodeType)) {
171
- return "L2";
172
- }
173
- if (L1_TYPES.includes(nodeType)) {
174
- return "L1";
175
- }
176
- if (ONTOLOGICAL_TYPES.includes(nodeType)) {
177
- return "ontological";
178
- }
179
- if (ORGANIZATIONAL_TYPES.includes(nodeType)) {
180
- return "organizational";
181
- }
182
- console.warn(`[GraphTypes] Unknown nodeType "${nodeType}", defaulting to L2`);
183
- return "L2";
184
- }
185
-
186
- // src/edgeValidation.ts
187
- function getLayerDepth(layer) {
188
- switch (layer) {
189
- case "L4":
190
- return 4;
191
- case "L3":
192
- return 3;
193
- case "L2":
194
- return 2;
195
- case "L1":
196
- return 1;
197
- case "ontological":
198
- return 0;
199
- default:
200
- return -1;
201
- }
202
- }
203
- function shouldContinueTraversal(currentLayer, targetLayer, options) {
204
- const currentDepth = getLayerDepth(currentLayer);
205
- const targetDepth = getLayerDepth(targetLayer);
206
- if (options.minLayer !== void 0 && targetDepth < options.minLayer) {
207
- return false;
208
- }
209
- if (options.maxLayer !== void 0 && targetDepth > options.maxLayer) {
210
- return false;
211
- }
212
- switch (options.mode) {
213
- case "anchor_down":
214
- return targetDepth <= currentDepth;
215
- case "anchor_up":
216
- return targetDepth >= currentDepth;
217
- case "same_layer":
218
- return targetDepth === currentDepth;
219
- case "decision_trace":
220
- return currentDepth === 4 ? targetDepth === 3 : targetDepth === currentDepth;
221
- default:
222
- return true;
223
- }
224
- }
225
- function getDefaultMinLayer(mode) {
226
- switch (mode) {
227
- case "anchor_down":
228
- return 1;
229
- case "anchor_up":
230
- return 2;
231
- case "same_layer":
232
- return 1;
233
- case "decision_trace":
234
- return 3;
235
- default:
236
- return 1;
237
- }
238
- }
239
278
  var LEGACY_SCOPE_FIELD = "graphScopeProjectId";
240
279
  async function resolveTopicNodeScopeOrNull(ctx, ref) {
241
280
  if (!ctx?.db || typeof ctx.db.query !== "function") {
@@ -270,13 +309,15 @@ function asMappedProjectId(topic) {
270
309
  if (!topic) {
271
310
  return;
272
311
  }
273
- const directLegacyProjectId = normalizeScopeValue(topic[LEGACY_SCOPE_FIELD]);
312
+ const directLegacyProjectId = normalizeScopeValue(
313
+ topic[LEGACY_SCOPE_FIELD]
314
+ );
274
315
  if (directLegacyProjectId) {
275
316
  return directLegacyProjectId;
276
317
  }
277
318
  const metadata = topic.metadata || {};
278
319
  const candidate = metadata[LEGACY_SCOPE_FIELD] || metadata.legacyProjectId || metadata.projectId || metadata.scopeProjectId;
279
- return candidate ? candidate : void 0;
320
+ return typeof candidate === "string" ? normalizeScopeValue(candidate) : void 0;
280
321
  }
281
322
  function normalizeScopeValue(value) {
282
323
  if (typeof value !== "string") {
@@ -301,8 +342,9 @@ function pickPrimaryTopic(candidates) {
301
342
  })[0];
302
343
  }
303
344
  async function findTopicsByScopeAlias(ctx, scopeId) {
345
+ const query2 = ctx.db.query("topics");
304
346
  try {
305
- return await ctx.db.query("topics").withIndex(
347
+ return await query2.withIndex(
306
348
  "by_graph_scope_project",
307
349
  (q) => q.eq(LEGACY_SCOPE_FIELD, scopeId)
308
350
  ).collect();
@@ -314,7 +356,7 @@ async function findTopicsByScopeAlias(ctx, scopeId) {
314
356
  scopeId
315
357
  }
316
358
  );
317
- const topics = await ctx.db.query("topics").collect();
359
+ const topics = await query2.collect();
318
360
  return topics.filter((topic) => {
319
361
  const normalizedGlobalId = normalizeScopeValue(topic.globalId);
320
362
  const mappedProjectId = asMappedProjectId(topic);
@@ -370,156 +412,455 @@ async function resolveInheritedWorkspaceScope(ctx, topic) {
370
412
  let current = topic;
371
413
  for (let i = 0; i < MAX_DEPTH && current?.parentTopicId; i++) {
372
414
  current = await ctx.db.get(current.parentTopicId);
373
- if (!current) break;
415
+ if (!current) {
416
+ break;
417
+ }
374
418
  if (!tenantId) {
375
419
  tenantId = normalizeScopeValue(current.tenantId);
376
420
  }
377
421
  if (!workspaceId) {
378
422
  workspaceId = normalizeScopeValue(current.workspaceId);
379
423
  }
380
- if (tenantId && workspaceId) break;
424
+ if (tenantId && workspaceId) {
425
+ break;
426
+ }
381
427
  }
382
428
  return { tenantId, workspaceId };
383
429
  }
384
430
  async function resolveTopicProjectScope(ctx, args) {
385
431
  if (args.topicId) {
386
- let topic = null;
387
- try {
388
- topic = await ctx.db.get(
389
- args.topicId
390
- );
391
- } catch (error) {
392
- debugGraphPrimitiveFallback(
393
- "[topicScope] Failed to load topic by direct id",
394
- {
395
- error,
396
- topicId: args.topicId
397
- }
398
- );
399
- }
400
- if (!topic) {
401
- topic = await tryResolveHostTopicById(ctx, String(args.topicId));
402
- }
403
- if (!topic) {
404
- topic = pickPrimaryTopic(
405
- await findTopicsByScopeAlias(ctx, String(args.topicId))
406
- ) ?? null;
407
- }
408
- if (!topic) {
409
- const nodeScope = await resolveTopicNodeScopeOrNull(
410
- ctx,
411
- String(args.topicId)
412
- );
413
- if (nodeScope) {
414
- return nodeScope;
415
- }
416
- throw new Error(`Topic not found: ${String(args.topicId)}`);
417
- }
418
- const inherited = await resolveInheritedWorkspaceScope(ctx, topic);
419
- const mapped = asMappedProjectId(topic);
420
- if (mapped) {
421
- return {
422
- topicId: topic._id,
423
- projectId: mapped,
424
- tenantId: inherited.tenantId,
425
- workspaceId: inherited.workspaceId,
426
- source: "topic"
427
- };
428
- }
432
+ return await resolveScopeFromTopicId(ctx, args.topicId);
433
+ }
434
+ if (args.projectId) {
435
+ return await resolveScopeFromLegacyProjectId(ctx, args.projectId);
436
+ }
437
+ throw new Error(
438
+ "Missing scope: provide topicId (preferred) or legacy projectId alias."
439
+ );
440
+ }
441
+ async function resolveScopeFromTopicId(ctx, topicId) {
442
+ const topic = await resolveTopicDocFromTopicId(ctx, topicId);
443
+ if (topic) {
444
+ return await buildTopicScope(ctx, topic, "topic");
445
+ }
446
+ const nodeScope = await resolveTopicNodeScopeOrNull(ctx, String(topicId));
447
+ if (nodeScope) {
448
+ return nodeScope;
449
+ }
450
+ throw new Error(`Topic not found: ${String(topicId)}`);
451
+ }
452
+ async function resolveTopicDocFromTopicId(ctx, topicId) {
453
+ const direct = await tryReadTopicDoc(ctx, topicId, {
454
+ failureLog: "[topicScope] Failed to load topic by direct id",
455
+ idLogKey: "topicId"
456
+ });
457
+ if (direct) {
458
+ return direct;
459
+ }
460
+ const hostTopic = await tryResolveHostTopicById(ctx, String(topicId));
461
+ if (hostTopic) {
462
+ return hostTopic;
463
+ }
464
+ return pickPrimaryTopic(await findTopicsByScopeAlias(ctx, String(topicId))) ?? null;
465
+ }
466
+ async function resolveScopeFromLegacyProjectId(ctx, legacyProjectId) {
467
+ const directTopic = await resolveDirectLegacyProjectTopic(
468
+ ctx,
469
+ legacyProjectId
470
+ );
471
+ if (directTopic) {
472
+ return await buildTopicScope(ctx, directTopic, "topic_inferred", {
473
+ fallbackProjectId: legacyProjectId
474
+ });
475
+ }
476
+ const primary = pickPrimaryTopic(
477
+ await findTopicsByScopeAlias(ctx, legacyProjectId)
478
+ );
479
+ if (primary) {
480
+ return await buildTopicScope(ctx, primary, "project_mapped_topic", {
481
+ fallbackProjectId: legacyProjectId
482
+ });
483
+ }
484
+ const nodeScope = await resolveTopicNodeScopeOrNull(ctx, legacyProjectId);
485
+ if (nodeScope) {
429
486
  return {
430
- topicId: topic._id,
431
- tenantId: inherited.tenantId,
432
- workspaceId: inherited.workspaceId,
433
- source: "topic"
487
+ ...nodeScope,
488
+ projectId: nodeScope.projectId ?? legacyProjectId
434
489
  };
435
490
  }
436
- if (args.projectId) {
437
- let directTopic = null;
491
+ throw new Error(
492
+ `Legacy project scope ${legacyProjectId} has no mapped topic.`
493
+ );
494
+ }
495
+ async function resolveDirectLegacyProjectTopic(ctx, legacyProjectId) {
496
+ const directTopic = await tryReadTopicDoc(ctx, legacyProjectId, {
497
+ failureLog: "[topicScope] Failed to load direct project topic",
498
+ idLogKey: "projectId"
499
+ });
500
+ return directTopic ?? tryResolveHostTopicByLegacyScope(ctx, legacyProjectId);
501
+ }
502
+ async function tryReadTopicDoc(ctx, id, log) {
503
+ try {
504
+ return await ctx.db.get(id);
505
+ } catch (error) {
506
+ debugGraphPrimitiveFallback(log.failureLog, {
507
+ error,
508
+ [log.idLogKey]: id
509
+ });
510
+ return null;
511
+ }
512
+ }
513
+ async function buildTopicScope(ctx, topic, source, options = {}) {
514
+ const inherited = await resolveInheritedWorkspaceScope(ctx, topic);
515
+ const mapped = asMappedProjectId(topic);
516
+ return {
517
+ topicId: topic._id,
518
+ ...mapped || options.fallbackProjectId ? { projectId: mapped ?? options.fallbackProjectId } : {},
519
+ tenantId: inherited.tenantId,
520
+ workspaceId: inherited.workspaceId,
521
+ source
522
+ };
523
+ }
524
+ var optionalScopeArgs = {
525
+ projectId: v.optional(v.string()),
526
+ topicId: v.optional(v.string())
527
+ };
528
+
529
+ // src/epistemicEdges.queries.ts
530
+ var DERIVED_FROM_EDGE_TYPE = "derived_from";
531
+ var EPISTEMIC_LAYERS = /* @__PURE__ */ new Set([
532
+ "L4",
533
+ "L3",
534
+ "L2",
535
+ "L1",
536
+ "ontological",
537
+ "organizational"
538
+ ]);
539
+ function readOptionalString2(value) {
540
+ return typeof value === "string" && value.trim().length > 0 ? value : void 0;
541
+ }
542
+ function readOptionalNumber(value) {
543
+ return typeof value === "number" && Number.isFinite(value) ? value : void 0;
544
+ }
545
+ function readConvexId2(value) {
546
+ const normalized = readOptionalString2(value);
547
+ return normalized;
548
+ }
549
+ function readRecord2(value) {
550
+ return value && typeof value === "object" && !Array.isArray(value) ? value : null;
551
+ }
552
+ function readEpistemicLayer(value) {
553
+ const layer = readOptionalString2(value);
554
+ return layer && EPISTEMIC_LAYERS.has(layer) ? layer : void 0;
555
+ }
556
+ function readEdgeNodeRow(value) {
557
+ const record = readRecord2(value);
558
+ if (!record) {
559
+ return null;
560
+ }
561
+ const id = readConvexId2(record._id);
562
+ const nodeType = readOptionalString2(record.nodeType);
563
+ if (!(id && nodeType)) {
564
+ return null;
565
+ }
566
+ const node = { ...record, _id: id, nodeType };
567
+ const globalId = readOptionalString2(record.globalId);
568
+ if (globalId !== void 0) {
569
+ node.globalId = globalId;
570
+ }
571
+ const epistemicLayer = readEpistemicLayer(record.epistemicLayer);
572
+ if (epistemicLayer !== void 0) {
573
+ node.epistemicLayer = epistemicLayer;
574
+ }
575
+ return node;
576
+ }
577
+ function readEdgeRow(value) {
578
+ const record = readRecord2(value);
579
+ if (!record) {
580
+ return null;
581
+ }
582
+ const id = readConvexId2(record._id);
583
+ const edgeType = readOptionalString2(record.edgeType);
584
+ if (!(id && edgeType)) {
585
+ return null;
586
+ }
587
+ const edge = { ...record, _id: id, edgeType };
588
+ const globalId = readOptionalString2(record.globalId);
589
+ if (globalId !== void 0) {
590
+ edge.globalId = globalId;
591
+ }
592
+ const fromNodeId = readOptionalString2(record.fromNodeId);
593
+ if (fromNodeId !== void 0) {
594
+ edge.fromNodeId = fromNodeId;
595
+ }
596
+ const toNodeId = readOptionalString2(record.toNodeId);
597
+ if (toNodeId !== void 0) {
598
+ edge.toNodeId = toNodeId;
599
+ }
600
+ const sourceGlobalId = readOptionalString2(record.sourceGlobalId);
601
+ if (sourceGlobalId !== void 0) {
602
+ edge.sourceGlobalId = sourceGlobalId;
603
+ }
604
+ const targetGlobalId = readOptionalString2(record.targetGlobalId);
605
+ if (targetGlobalId !== void 0) {
606
+ edge.targetGlobalId = targetGlobalId;
607
+ }
608
+ const fromGlobalId = readOptionalString2(record.fromGlobalId);
609
+ if (fromGlobalId !== void 0) {
610
+ edge.fromGlobalId = fromGlobalId;
611
+ }
612
+ const toGlobalId = readOptionalString2(record.toGlobalId);
613
+ if (toGlobalId !== void 0) {
614
+ edge.toGlobalId = toGlobalId;
615
+ }
616
+ const toLayer = readEpistemicLayer(record.toLayer);
617
+ if (toLayer !== void 0) {
618
+ edge.toLayer = toLayer;
619
+ }
620
+ const weight = readOptionalNumber(record.weight);
621
+ if (weight !== void 0) {
622
+ edge.weight = weight;
623
+ }
624
+ return edge;
625
+ }
626
+ function readEdgeRows(values) {
627
+ return values.flatMap((value) => {
628
+ const edge = readEdgeRow(value);
629
+ return edge ? [edge] : [];
630
+ });
631
+ }
632
+ function dedupeEdges(edges) {
633
+ const seen = /* @__PURE__ */ new Set();
634
+ const deduped = [];
635
+ for (const edge of edges) {
636
+ const key = String(edge._id);
637
+ if (seen.has(key)) {
638
+ continue;
639
+ }
640
+ seen.add(key);
641
+ deduped.push(edge);
642
+ }
643
+ return deduped;
644
+ }
645
+ function filterEdgesByType(edges, edgeType) {
646
+ return edgeType ? edges.filter((edge) => edge.edgeType === edgeType) : [...edges];
647
+ }
648
+ function nodeEndpointRefs(node) {
649
+ const refs = /* @__PURE__ */ new Set([String(node._id)]);
650
+ if (node.globalId) {
651
+ refs.add(node.globalId);
652
+ }
653
+ return [...refs];
654
+ }
655
+ function edgeSourceRefs(edge) {
656
+ return [edge.fromNodeId, edge.sourceGlobalId, edge.fromGlobalId].flatMap(
657
+ (value) => value ? [value] : []
658
+ );
659
+ }
660
+ function edgeTargetRefs(edge) {
661
+ return [edge.toNodeId, edge.targetGlobalId, edge.toGlobalId].flatMap(
662
+ (value) => value ? [value] : []
663
+ );
664
+ }
665
+ function primaryEdgeSourceRef(edge) {
666
+ return edge.sourceGlobalId ?? edge.fromGlobalId ?? edge.fromNodeId;
667
+ }
668
+ function primaryEdgeTargetRef(edge) {
669
+ return edge.targetGlobalId ?? edge.toGlobalId ?? edge.toNodeId;
670
+ }
671
+ function hasVisitedNode(node, visited) {
672
+ return nodeEndpointRefs(node).some((ref) => visited.has(ref));
673
+ }
674
+ function markVisitedNode(node, visited) {
675
+ for (const ref of nodeEndpointRefs(node)) {
676
+ visited.add(ref);
677
+ }
678
+ }
679
+ async function resolveNodeRefSoft(ctx, nodeRef) {
680
+ const normalizedId = ctx.db.normalizeId?.("epistemicNodes", nodeRef) ?? readConvexId2(nodeRef);
681
+ if (normalizedId) {
438
682
  try {
439
- directTopic = await ctx.db.get(
440
- args.projectId
441
- );
683
+ const direct = readEdgeNodeRow(await ctx.db.get(normalizedId));
684
+ if (direct) {
685
+ return direct;
686
+ }
442
687
  } catch (error) {
443
688
  debugGraphPrimitiveFallback(
444
- "[topicScope] Failed to load direct project topic",
445
- {
446
- error,
447
- projectId: args.projectId
448
- }
689
+ "[epistemicEdges] Direct node-ref lookup failed",
690
+ { error, nodeRef }
449
691
  );
450
692
  }
451
- if (directTopic) {
452
- const inherited = await resolveInheritedWorkspaceScope(ctx, directTopic);
453
- const mapped = asMappedProjectId(directTopic);
454
- return {
455
- topicId: directTopic._id,
456
- projectId: mapped ?? args.projectId,
457
- tenantId: inherited.tenantId,
458
- workspaceId: inherited.workspaceId,
459
- source: "topic_inferred"
460
- };
461
- }
462
- directTopic = await tryResolveHostTopicByLegacyScope(ctx, args.projectId);
463
- if (directTopic) {
464
- const inherited = await resolveInheritedWorkspaceScope(ctx, directTopic);
465
- const mapped = asMappedProjectId(directTopic);
466
- return {
467
- topicId: directTopic._id,
468
- projectId: mapped ?? args.projectId,
469
- tenantId: inherited.tenantId,
470
- workspaceId: inherited.workspaceId,
471
- source: "topic_inferred"
472
- };
473
- }
474
- const topics = await findTopicsByScopeAlias(ctx, args.projectId);
475
- const primary = pickPrimaryTopic(topics);
476
- if (primary) {
477
- const inherited = await resolveInheritedWorkspaceScope(ctx, primary);
478
- return {
479
- topicId: primary._id,
480
- projectId: args.projectId,
481
- tenantId: inherited.tenantId,
482
- workspaceId: inherited.workspaceId,
483
- source: "project_mapped_topic"
484
- };
693
+ }
694
+ return readEdgeNodeRow(
695
+ await ctx.db.query("epistemicNodes").withIndex("by_globalId", (q) => q.eq("globalId", nodeRef)).first()
696
+ );
697
+ }
698
+ async function collectNodeReferenceIds(ctx, nodeRef) {
699
+ const refs = /* @__PURE__ */ new Set([nodeRef]);
700
+ const node = await resolveNodeRefSoft(ctx, nodeRef);
701
+ if (node) {
702
+ for (const ref of nodeEndpointRefs(node)) {
703
+ refs.add(ref);
485
704
  }
486
- const nodeScope = await resolveTopicNodeScopeOrNull(
487
- ctx,
488
- String(args.projectId)
705
+ }
706
+ return [...refs];
707
+ }
708
+ async function collectEdgesFromRefs(ctx, refs, edgeType) {
709
+ const reads = [];
710
+ for (const ref of refs) {
711
+ reads.push(
712
+ edgeType ? ctx.db.query("epistemicEdges").withIndex(
713
+ "by_from_type",
714
+ (q) => q.eq("fromNodeId", ref).eq("edgeType", edgeType)
715
+ ).collect() : ctx.db.query("epistemicEdges").withIndex("by_from", (q) => q.eq("fromNodeId", ref)).collect(),
716
+ ctx.db.query("epistemicEdges").withIndex("by_source_global_id", (q) => q.eq("sourceGlobalId", ref)).collect()
717
+ );
718
+ }
719
+ const edges = readEdgeRows((await Promise.all(reads)).flat());
720
+ return dedupeEdges(filterEdgesByType(edges, edgeType));
721
+ }
722
+ async function collectEdgesToRefs(ctx, refs, edgeType) {
723
+ const reads = [];
724
+ for (const ref of refs) {
725
+ reads.push(
726
+ edgeType ? ctx.db.query("epistemicEdges").withIndex(
727
+ "by_to_type",
728
+ (q) => q.eq("toNodeId", ref).eq("edgeType", edgeType)
729
+ ).collect() : ctx.db.query("epistemicEdges").withIndex("by_to", (q) => q.eq("toNodeId", ref)).collect(),
730
+ ctx.db.query("epistemicEdges").withIndex("by_target_global_id", (q) => q.eq("targetGlobalId", ref)).collect()
489
731
  );
490
- if (nodeScope) {
491
- return {
492
- ...nodeScope,
493
- projectId: nodeScope.projectId ?? String(args.projectId)
494
- };
732
+ }
733
+ const edges = readEdgeRows((await Promise.all(reads)).flat());
734
+ return dedupeEdges(filterEdgesByType(edges, edgeType));
735
+ }
736
+ async function collectEdgesFromNodeRef(ctx, nodeRef, edgeType) {
737
+ return collectEdgesFromRefs(
738
+ ctx,
739
+ await collectNodeReferenceIds(ctx, nodeRef),
740
+ edgeType
741
+ );
742
+ }
743
+ async function collectEdgesToNodeRef(ctx, nodeRef, edgeType) {
744
+ return collectEdgesToRefs(
745
+ ctx,
746
+ await collectNodeReferenceIds(ctx, nodeRef),
747
+ edgeType
748
+ );
749
+ }
750
+ async function collectEdgesBetweenRefs(ctx, fromRefs, toRefs) {
751
+ const reads = [];
752
+ for (const fromRef of fromRefs) {
753
+ for (const toRef of toRefs) {
754
+ reads.push(
755
+ ctx.db.query("epistemicEdges").withIndex(
756
+ "by_from_to",
757
+ (q) => q.eq("fromNodeId", fromRef).eq("toNodeId", toRef)
758
+ ).collect()
759
+ );
495
760
  }
496
- throw new Error(
497
- `Legacy project scope ${String(args.projectId)} has no mapped topic.`
761
+ reads.push(
762
+ ctx.db.query("epistemicEdges").withIndex(
763
+ "by_source_global_id",
764
+ (q) => q.eq("sourceGlobalId", fromRef)
765
+ ).collect()
498
766
  );
499
767
  }
500
- throw new Error(
501
- "Missing scope: provide topicId (preferred) or legacy projectId alias."
768
+ for (const toRef of toRefs) {
769
+ reads.push(
770
+ ctx.db.query("epistemicEdges").withIndex("by_target_global_id", (q) => q.eq("targetGlobalId", toRef)).collect()
771
+ );
772
+ }
773
+ const fromRefSet = new Set(fromRefs);
774
+ const toRefSet = new Set(toRefs);
775
+ const edges = readEdgeRows((await Promise.all(reads)).flat()).filter(
776
+ (edge) => edgeSourceRefs(edge).some((ref) => fromRefSet.has(ref)) && edgeTargetRefs(edge).some((ref) => toRefSet.has(ref))
502
777
  );
778
+ return dedupeEdges(edges);
779
+ }
780
+ async function collectEdgesBetweenNodeRefs(ctx, fromNodeRef, toNodeRef) {
781
+ const [fromRefs, toRefs] = await Promise.all([
782
+ collectNodeReferenceIds(ctx, fromNodeRef),
783
+ collectNodeReferenceIds(ctx, toNodeRef)
784
+ ]);
785
+ return collectEdgesBetweenRefs(ctx, fromRefs, toRefs);
786
+ }
787
+ function buildLineageTraversalConfig(args) {
788
+ const mode = args.mode ?? "anchor_down";
789
+ return {
790
+ maxDepth: args.maxDepth ?? 10,
791
+ mode,
792
+ minLayer: args.minLayer ?? getDefaultMinLayer(mode),
793
+ maxLayer: args.maxLayer ?? 4
794
+ };
795
+ }
796
+ function buildLineageQueueSeed(node) {
797
+ return {
798
+ node,
799
+ depth: 0,
800
+ currentLayer: node.epistemicLayer ?? getNodeLayer(node.nodeType)
801
+ };
802
+ }
803
+ function shouldSkipLineageNode(item, state, visited) {
804
+ if (item.depth >= state.maxDepth) {
805
+ return true;
806
+ }
807
+ return hasVisitedNode(item.node, visited);
808
+ }
809
+ function resolveLineageTargetLayer(edge, targetNode) {
810
+ return edge.toLayer ?? targetNode.epistemicLayer ?? getNodeLayer(targetNode.nodeType);
811
+ }
812
+ function collectDerivedFromEdges(ctx, node) {
813
+ return collectEdgesFromRefs(
814
+ ctx,
815
+ nodeEndpointRefs(node),
816
+ DERIVED_FROM_EDGE_TYPE
817
+ );
818
+ }
819
+ function shouldAdvanceLineage(currentLayer, targetLayer, state) {
820
+ return shouldContinueTraversal(currentLayer, targetLayer, {
821
+ mode: state.mode,
822
+ minLayer: state.minLayer,
823
+ maxLayer: state.maxLayer
824
+ });
825
+ }
826
+ async function appendLineageEdges(ctx, current, state, lineage, queue, visited) {
827
+ const lineageEdges = await collectDerivedFromEdges(ctx, current.node);
828
+ for (const edge of lineageEdges) {
829
+ const targetRef = primaryEdgeTargetRef(edge);
830
+ if (!targetRef) {
831
+ continue;
832
+ }
833
+ const targetNode = await resolveNodeRefSoft(ctx, targetRef);
834
+ if (!targetNode || hasVisitedNode(targetNode, visited)) {
835
+ continue;
836
+ }
837
+ const targetLayer = resolveLineageTargetLayer(edge, targetNode);
838
+ if (!shouldAdvanceLineage(current.currentLayer, targetLayer, state)) {
839
+ continue;
840
+ }
841
+ const nextDepth = current.depth + 1;
842
+ lineage.push({
843
+ node: targetNode,
844
+ depth: nextDepth,
845
+ edgeType: edge.edgeType,
846
+ layer: targetLayer
847
+ });
848
+ queue.push({
849
+ node: targetNode,
850
+ depth: nextDepth,
851
+ currentLayer: targetLayer
852
+ });
853
+ }
503
854
  }
504
- var optionalScopeArgs = {
505
- projectId: v.optional(v.string()),
506
- topicId: v.optional(v.string())
507
- };
508
-
509
- // src/epistemicEdges.queries.ts
510
855
  var get = query({
511
856
  args: { edgeId: v.id("epistemicEdges") },
512
857
  returns: permissiveReturn,
513
- handler: async (ctx, args) => {
514
- return await ctx.db.get(args.edgeId);
515
- }
858
+ handler: async (ctx, args) => await ctx.db.get(args.edgeId)
516
859
  });
517
860
  var getByGlobalId = query({
518
861
  args: { globalId: v.string() },
519
862
  returns: permissiveReturn,
520
- handler: async (ctx, args) => {
521
- return await ctx.db.query("epistemicEdges").withIndex("by_globalId", (q) => q.eq("globalId", args.globalId)).first();
522
- }
863
+ handler: async (ctx, args) => await ctx.db.query("epistemicEdges").withIndex("by_globalId", (q) => q.eq("globalId", args.globalId)).first()
523
864
  });
524
865
  var getFromNode = query({
525
866
  args: {
@@ -527,16 +868,7 @@ var getFromNode = query({
527
868
  edgeType: v.optional(edgeTypeValidator)
528
869
  },
529
870
  returns: permissiveReturn,
530
- handler: async (ctx, args) => {
531
- const { edgeType } = args;
532
- if (edgeType) {
533
- return await ctx.db.query("epistemicEdges").withIndex(
534
- "by_from_type",
535
- (q) => q.eq("fromNodeId", args.fromNodeId).eq("edgeType", edgeType)
536
- ).collect();
537
- }
538
- return await ctx.db.query("epistemicEdges").withIndex("by_from", (q) => q.eq("fromNodeId", args.fromNodeId)).collect();
539
- }
871
+ handler: async (ctx, args) => await collectEdgesFromNodeRef(ctx, String(args.fromNodeId), args.edgeType)
540
872
  });
541
873
  var getToNode = query({
542
874
  args: {
@@ -544,16 +876,7 @@ var getToNode = query({
544
876
  edgeType: v.optional(edgeTypeValidator)
545
877
  },
546
878
  returns: permissiveReturn,
547
- handler: async (ctx, args) => {
548
- const { edgeType } = args;
549
- if (edgeType) {
550
- return await ctx.db.query("epistemicEdges").withIndex(
551
- "by_to_type",
552
- (q) => q.eq("toNodeId", args.toNodeId).eq("edgeType", edgeType)
553
- ).collect();
554
- }
555
- return await ctx.db.query("epistemicEdges").withIndex("by_to", (q) => q.eq("toNodeId", args.toNodeId)).collect();
556
- }
879
+ handler: async (ctx, args) => await collectEdgesToNodeRef(ctx, String(args.toNodeId), args.edgeType)
557
880
  });
558
881
  var getBySourceNode = query({
559
882
  args: {
@@ -561,27 +884,7 @@ var getBySourceNode = query({
561
884
  edgeType: v.optional(v.string())
562
885
  },
563
886
  returns: permissiveReturn,
564
- handler: async (ctx, args) => {
565
- const isConvexId = args.sourceNodeId.length === 32 || args.sourceNodeId.includes("epistemicNodes");
566
- if (isConvexId) {
567
- const query2 = args.edgeType ? ctx.db.query("epistemicEdges").withIndex(
568
- "by_from_type",
569
- (q) => q.eq("fromNodeId", args.sourceNodeId).eq("edgeType", args.edgeType)
570
- ) : ctx.db.query("epistemicEdges").withIndex(
571
- "by_from",
572
- (q) => q.eq("fromNodeId", args.sourceNodeId)
573
- );
574
- return await query2.collect();
575
- }
576
- const byGlobalId = await ctx.db.query("epistemicEdges").withIndex(
577
- "by_source_global_id",
578
- (q) => q.eq("sourceGlobalId", args.sourceNodeId)
579
- ).collect();
580
- if (args.edgeType) {
581
- return byGlobalId.filter((edge) => edge.edgeType === args.edgeType);
582
- }
583
- return byGlobalId;
584
- }
887
+ handler: async (ctx, args) => await collectEdgesFromNodeRef(ctx, args.sourceNodeId, args.edgeType)
585
888
  });
586
889
  var getByTargetNode = query({
587
890
  args: {
@@ -589,27 +892,7 @@ var getByTargetNode = query({
589
892
  edgeType: v.optional(v.string())
590
893
  },
591
894
  returns: permissiveReturn,
592
- handler: async (ctx, args) => {
593
- const isConvexId = args.targetNodeId.length === 32 || args.targetNodeId.includes("epistemicNodes");
594
- if (isConvexId) {
595
- const query2 = args.edgeType ? ctx.db.query("epistemicEdges").withIndex(
596
- "by_to_type",
597
- (q) => q.eq("toNodeId", args.targetNodeId).eq("edgeType", args.edgeType)
598
- ) : ctx.db.query("epistemicEdges").withIndex(
599
- "by_to",
600
- (q) => q.eq("toNodeId", args.targetNodeId)
601
- );
602
- return await query2.collect();
603
- }
604
- const byGlobalId = await ctx.db.query("epistemicEdges").withIndex(
605
- "by_target_global_id",
606
- (q) => q.eq("targetGlobalId", args.targetNodeId)
607
- ).collect();
608
- if (args.edgeType) {
609
- return byGlobalId.filter((edge) => edge.edgeType === args.edgeType);
610
- }
611
- return byGlobalId;
612
- }
895
+ handler: async (ctx, args) => await collectEdgesToNodeRef(ctx, args.targetNodeId, args.edgeType)
613
896
  });
614
897
  var getBetween = query({
615
898
  args: {
@@ -618,16 +901,14 @@ var getBetween = query({
618
901
  edgeType: v.optional(edgeTypeValidator)
619
902
  },
620
903
  returns: permissiveReturn,
621
- handler: async (ctx, args) => {
622
- const edges = await ctx.db.query("epistemicEdges").withIndex(
623
- "by_from_to",
624
- (q) => q.eq("fromNodeId", args.fromNodeId).eq("toNodeId", args.toNodeId)
625
- ).collect();
626
- if (args.edgeType) {
627
- return edges.filter((e) => e.edgeType === args.edgeType);
628
- }
629
- return edges;
630
- }
904
+ handler: async (ctx, args) => filterEdgesByType(
905
+ await collectEdgesBetweenNodeRefs(
906
+ ctx,
907
+ String(args.fromNodeId),
908
+ String(args.toNodeId)
909
+ ),
910
+ args.edgeType
911
+ )
631
912
  });
632
913
  var getByNodes = query({
633
914
  args: {
@@ -635,12 +916,11 @@ var getByNodes = query({
635
916
  toNodeId: v.id("epistemicNodes")
636
917
  },
637
918
  returns: permissiveReturn,
638
- handler: async (ctx, args) => {
639
- return await ctx.db.query("epistemicEdges").withIndex(
640
- "by_from_to",
641
- (q) => q.eq("fromNodeId", args.fromNodeId).eq("toNodeId", args.toNodeId)
642
- ).first();
643
- }
919
+ handler: async (ctx, args) => (await collectEdgesBetweenNodeRefs(
920
+ ctx,
921
+ String(args.fromNodeId),
922
+ String(args.toNodeId)
923
+ ))[0] ?? null
644
924
  });
645
925
  var getByProjectAndType = query({
646
926
  args: {
@@ -649,7 +929,7 @@ var getByProjectAndType = query({
649
929
  },
650
930
  returns: permissiveReturn,
651
931
  handler: async (ctx, args) => {
652
- if (!args.projectId && !args.topicId) {
932
+ if (!(args.projectId || args.topicId)) {
653
933
  return [];
654
934
  }
655
935
  let scope;
@@ -683,7 +963,7 @@ var getByProject = query({
683
963
  },
684
964
  returns: permissiveReturn,
685
965
  handler: async (ctx, args) => {
686
- if (!args.projectId && !args.topicId) {
966
+ if (!(args.projectId || args.topicId)) {
687
967
  return [];
688
968
  }
689
969
  let scope;
@@ -741,10 +1021,11 @@ var findContradictions = query({
741
1021
  },
742
1022
  returns: permissiveReturn,
743
1023
  handler: async (ctx, args) => {
744
- const edges = await ctx.db.query("epistemicEdges").withIndex(
745
- "by_to_type",
746
- (q) => q.eq("toNodeId", args.nodeId).eq("edgeType", "informs")
747
- ).collect();
1024
+ const edges = await collectEdgesToNodeRef(
1025
+ ctx,
1026
+ String(args.nodeId),
1027
+ "informs"
1028
+ );
748
1029
  return edges.filter((e) => (e.weight ?? 0) < 0);
749
1030
  }
750
1031
  });
@@ -754,10 +1035,11 @@ var findSupport = query({
754
1035
  },
755
1036
  returns: permissiveReturn,
756
1037
  handler: async (ctx, args) => {
757
- const edges = await ctx.db.query("epistemicEdges").withIndex(
758
- "by_to_type",
759
- (q) => q.eq("toNodeId", args.nodeId).eq("edgeType", "informs")
760
- ).collect();
1038
+ const edges = await collectEdgesToNodeRef(
1039
+ ctx,
1040
+ String(args.nodeId),
1041
+ "informs"
1042
+ );
761
1043
  return edges.filter((e) => (e.weight ?? 0) >= 0);
762
1044
  }
763
1045
  });
@@ -780,59 +1062,29 @@ var getLineage = query({
780
1062
  },
781
1063
  returns: permissiveReturn,
782
1064
  handler: async (ctx, args) => {
783
- const maxDepth = args.maxDepth ?? 10;
784
- const mode = args.mode ?? "anchor_down";
785
- const minLayer = args.minLayer ?? getDefaultMinLayer(mode);
786
- const maxLayer = args.maxLayer ?? 4;
1065
+ const traversalState = buildLineageTraversalConfig(args);
787
1066
  const lineage = [];
1067
+ const queue = [];
788
1068
  const visited = /* @__PURE__ */ new Set();
789
- const startNode = await ctx.db.get(args.nodeId);
1069
+ const startNode = readEdgeNodeRow(await ctx.db.get(args.nodeId));
790
1070
  if (!startNode) {
791
1071
  return lineage;
792
1072
  }
793
- const startLayer = startNode.epistemicLayer || getNodeLayer(startNode.nodeType);
794
- const queue = [{ nodeId: args.nodeId, depth: 0, currentLayer: startLayer }];
1073
+ queue.push(buildLineageQueueSeed(startNode));
795
1074
  while (queue.length > 0) {
796
1075
  const current = queue.shift();
797
- if (!current || current.depth >= maxDepth) {
798
- continue;
799
- }
800
- const nodeIdStr = current.nodeId.toString();
801
- if (visited.has(nodeIdStr)) {
1076
+ if (!current || shouldSkipLineageNode(current, traversalState, visited)) {
802
1077
  continue;
803
1078
  }
804
- visited.add(nodeIdStr);
805
- const edges = await ctx.db.query("epistemicEdges").withIndex("by_from", (q) => q.eq("fromNodeId", current.nodeId)).collect();
806
- const lineageEdges = edges.filter((e) => e.edgeType === "derived_from");
807
- for (const edge of lineageEdges) {
808
- if (!edge.toNodeId) {
809
- continue;
810
- }
811
- const targetNode = await ctx.db.get(edge.toNodeId);
812
- if (!targetNode || visited.has(edge.toNodeId.toString())) {
813
- continue;
814
- }
815
- const targetLayer = edge.toLayer || targetNode.epistemicLayer || getNodeLayer(targetNode.nodeType);
816
- const shouldContinue = shouldContinueTraversal(
817
- current.currentLayer,
818
- targetLayer,
819
- { mode, minLayer, maxLayer }
820
- );
821
- if (!shouldContinue) {
822
- continue;
823
- }
824
- lineage.push({
825
- node: targetNode,
826
- depth: current.depth + 1,
827
- edgeType: edge.edgeType,
828
- layer: targetLayer
829
- });
830
- queue.push({
831
- nodeId: edge.toNodeId,
832
- depth: current.depth + 1,
833
- currentLayer: targetLayer
834
- });
835
- }
1079
+ markVisitedNode(current.node, visited);
1080
+ await appendLineageEdges(
1081
+ ctx,
1082
+ current,
1083
+ traversalState,
1084
+ lineage,
1085
+ queue,
1086
+ visited
1087
+ );
836
1088
  }
837
1089
  return lineage;
838
1090
  }
@@ -843,25 +1095,34 @@ var getEvidenceForBelief = query({
843
1095
  },
844
1096
  returns: permissiveReturn,
845
1097
  handler: async (ctx, args) => {
846
- const informsEdges = await ctx.db.query("epistemicEdges").withIndex(
847
- "by_to_type",
848
- (q) => q.eq("toNodeId", args.beliefNodeId).eq("edgeType", "informs")
849
- ).collect();
1098
+ const informsEdges = await collectEdgesToNodeRef(
1099
+ ctx,
1100
+ String(args.beliefNodeId),
1101
+ "informs"
1102
+ );
850
1103
  const supportEdges = informsEdges.filter((e) => (e.weight ?? 0) >= 0);
851
1104
  const contradictEdges = informsEdges.filter((e) => (e.weight ?? 0) < 0);
852
1105
  const supportingEvidence = await Promise.all(
853
- supportEdges.map(async (edge) => ({
854
- edge,
855
- node: await ctx.db.get(edge.fromNodeId)
856
- }))
1106
+ supportEdges.map(async (edge) => {
1107
+ const sourceRef = primaryEdgeSourceRef(edge);
1108
+ return {
1109
+ edge,
1110
+ node: sourceRef ? await resolveNodeRefSoft(ctx, sourceRef) : null
1111
+ };
1112
+ })
857
1113
  );
858
1114
  const contradictingEvidence = await Promise.all(
859
- contradictEdges.map(async (edge) => ({
860
- edge,
861
- node: await ctx.db.get(edge.fromNodeId)
862
- }))
1115
+ contradictEdges.map(async (edge) => {
1116
+ const sourceRef = primaryEdgeSourceRef(edge);
1117
+ return {
1118
+ edge,
1119
+ node: sourceRef ? await resolveNodeRefSoft(ctx, sourceRef) : null
1120
+ };
1121
+ })
1122
+ );
1123
+ const filteredSupporting = supportingEvidence.filter(
1124
+ (e) => e.node !== null
863
1125
  );
864
- const filteredSupporting = supportingEvidence.filter((e) => e.node !== null);
865
1126
  const filteredContradicting = contradictingEvidence.filter(
866
1127
  (e) => e.node !== null
867
1128
  );
@@ -882,11 +1143,22 @@ var getClusterEdges = query({
882
1143
  if (args.beliefIds.length === 0) {
883
1144
  return [];
884
1145
  }
885
- const beliefIdSet = new Set(args.beliefIds);
886
- const allEdges = await ctx.db.query("epistemicEdges").collect();
1146
+ const beliefIdSet = /* @__PURE__ */ new Set();
1147
+ for (const beliefId of args.beliefIds) {
1148
+ for (const ref of await collectNodeReferenceIds(ctx, beliefId)) {
1149
+ beliefIdSet.add(ref);
1150
+ }
1151
+ }
1152
+ const allEdges = readEdgeRows(
1153
+ await ctx.db.query("epistemicEdges").collect()
1154
+ );
887
1155
  return allEdges.filter((edge) => {
888
- const fromInCluster = beliefIdSet.has(String(edge.fromNodeId)) || edge.sourceGlobalId && beliefIdSet.has(edge.sourceGlobalId);
889
- const toInCluster = beliefIdSet.has(String(edge.toNodeId)) || edge.targetGlobalId && beliefIdSet.has(edge.targetGlobalId);
1156
+ const fromInCluster = edgeSourceRefs(edge).some(
1157
+ (ref) => beliefIdSet.has(ref)
1158
+ );
1159
+ const toInCluster = edgeTargetRefs(edge).some(
1160
+ (ref) => beliefIdSet.has(ref)
1161
+ );
890
1162
  return fromInCluster && toInCluster;
891
1163
  });
892
1164
  }