@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,10 +1,14 @@
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/epistemicNodes.queries.ts
7
- var api = anyApi;
8
+ var unsafeApi = unsafeConvexAnyApi(
9
+ "graph-primitives top-level module bundle lacks a committed Convex _generated/api surface"
10
+ );
11
+ var api = unsafeApi;
8
12
  componentsGeneric();
9
13
  var query = queryGeneric;
10
14
 
@@ -19,6 +23,153 @@ function debugGraphPrimitiveFallback(message, context) {
19
23
  }
20
24
  console.debug(message, context ?? {});
21
25
  }
26
+
27
+ // src/epistemicNodes.helpers.ts
28
+ var DEFAULT_NODE_PAGE_SIZE = 250;
29
+ var MAX_NODE_PAGE_SIZE = 8e3;
30
+ function clampNodeLimit(limit, fallback = DEFAULT_NODE_PAGE_SIZE) {
31
+ if (!Number.isFinite(limit)) {
32
+ return fallback;
33
+ }
34
+ return Math.max(1, Math.min(Math.floor(limit), MAX_NODE_PAGE_SIZE));
35
+ }
36
+ function dedupeWorkspaceNodes(nodes) {
37
+ const seen = /* @__PURE__ */ new Set();
38
+ const deduped = [];
39
+ for (const node of nodes) {
40
+ const key = String(node._id);
41
+ if (seen.has(key)) {
42
+ continue;
43
+ }
44
+ seen.add(key);
45
+ deduped.push(node);
46
+ }
47
+ return deduped;
48
+ }
49
+ function nodeMatchesWorkspaceReasoningScope(node, scope) {
50
+ return scope.topicId !== void 0 && node.topicId === scope.topicId || scope.projectId !== void 0 && node.projectId === scope.projectId;
51
+ }
52
+ async function collectScopedNodes(ctx, scope, args) {
53
+ const queries = [];
54
+ if (scope.topicId) {
55
+ queries.push(
56
+ args.nodeType ? ctx.db.query("epistemicNodes").withIndex(
57
+ "by_topic_type",
58
+ (q) => q.eq("topicId", scope.topicId).eq("nodeType", args.nodeType)
59
+ ).order("desc").take(args.scanLimit) : ctx.db.query("epistemicNodes").withIndex("by_topic", (q) => q.eq("topicId", scope.topicId)).order("desc").take(args.scanLimit)
60
+ );
61
+ }
62
+ if (scope.projectId && !scope.topicId) {
63
+ queries.push(
64
+ args.nodeType ? ctx.db.query("epistemicNodes").withIndex(
65
+ "by_topic_type",
66
+ (q) => q.eq("topicId", scope.projectId).eq("nodeType", args.nodeType)
67
+ ).order("desc").take(args.scanLimit) : ctx.db.query("epistemicNodes").withIndex("by_topic", (q) => q.eq("topicId", scope.projectId)).order("desc").take(args.scanLimit)
68
+ );
69
+ }
70
+ const combined = dedupeWorkspaceNodes((await Promise.all(queries)).flat());
71
+ return combined.filter(
72
+ (node) => nodeMatchesWorkspaceReasoningScope(node, scope)
73
+ );
74
+ }
75
+ v.union(
76
+ v.literal("L4"),
77
+ v.literal("L3"),
78
+ v.literal("L2"),
79
+ v.literal("L1"),
80
+ v.literal("ontological"),
81
+ v.literal("organizational")
82
+ );
83
+ v.union(v.literal("decision"));
84
+ v.union(
85
+ v.literal("belief"),
86
+ v.literal("question"),
87
+ v.literal("theme"),
88
+ v.literal("deal")
89
+ );
90
+ v.union(
91
+ v.literal("claim"),
92
+ v.literal("evidence"),
93
+ v.literal("synthesis")
94
+ );
95
+ v.union(
96
+ v.literal("atomic_fact"),
97
+ v.literal("excerpt"),
98
+ v.literal("source")
99
+ );
100
+ v.union(
101
+ // L4: Audit targets
102
+ v.literal("decision"),
103
+ // L3: Traversal anchors
104
+ v.literal("belief"),
105
+ v.literal("question"),
106
+ v.literal("theme"),
107
+ v.literal("deal"),
108
+ // L2: Compression boundary
109
+ v.literal("claim"),
110
+ v.literal("evidence"),
111
+ v.literal("synthesis"),
112
+ v.literal("answer"),
113
+ // L1: Terminal leaves
114
+ v.literal("atomic_fact"),
115
+ v.literal("excerpt"),
116
+ v.literal("source")
117
+ );
118
+ v.union(
119
+ v.literal("company"),
120
+ v.literal("person"),
121
+ v.literal("investor"),
122
+ v.literal("function"),
123
+ v.literal("value_chain")
124
+ );
125
+ v.union(v.literal("topic"));
126
+ var nodeTypeValidator = v.union(
127
+ // L4: Audit targets
128
+ v.literal("decision"),
129
+ // L3: Traversal anchors
130
+ v.literal("belief"),
131
+ v.literal("question"),
132
+ v.literal("theme"),
133
+ v.literal("deal"),
134
+ // L2: Compression boundary
135
+ v.literal("claim"),
136
+ v.literal("evidence"),
137
+ v.literal("synthesis"),
138
+ v.literal("answer"),
139
+ // L1: Terminal leaves
140
+ v.literal("atomic_fact"),
141
+ v.literal("excerpt"),
142
+ v.literal("source"),
143
+ // Ontological
144
+ v.literal("company"),
145
+ v.literal("person"),
146
+ v.literal("investor"),
147
+ v.literal("function"),
148
+ v.literal("value_chain"),
149
+ // Organizational
150
+ v.literal("topic")
151
+ );
152
+ v.union(
153
+ v.literal("human"),
154
+ v.literal("ai_extracted"),
155
+ v.literal("ai_generated"),
156
+ v.literal("imported"),
157
+ v.literal("system")
158
+ // System-generated (migrations, classifiers)
159
+ );
160
+ var statusValidator = v.union(
161
+ v.literal("active"),
162
+ v.literal("superseded"),
163
+ v.literal("archived"),
164
+ v.literal("deleted")
165
+ );
166
+ v.union(
167
+ v.literal("unverified"),
168
+ v.literal("human_verified"),
169
+ v.literal("ai_verified"),
170
+ v.literal("contradicted"),
171
+ v.literal("outdated")
172
+ );
22
173
  var LEGACY_SCOPE_FIELD = "graphScopeProjectId";
23
174
  async function resolveTopicNodeScopeOrNull(ctx, ref) {
24
175
  if (!ctx?.db || typeof ctx.db.query !== "function") {
@@ -53,13 +204,15 @@ function asMappedProjectId(topic) {
53
204
  if (!topic) {
54
205
  return;
55
206
  }
56
- const directLegacyProjectId = normalizeScopeValue(topic[LEGACY_SCOPE_FIELD]);
207
+ const directLegacyProjectId = normalizeScopeValue(
208
+ topic[LEGACY_SCOPE_FIELD]
209
+ );
57
210
  if (directLegacyProjectId) {
58
211
  return directLegacyProjectId;
59
212
  }
60
213
  const metadata = topic.metadata || {};
61
214
  const candidate = metadata[LEGACY_SCOPE_FIELD] || metadata.legacyProjectId || metadata.projectId || metadata.scopeProjectId;
62
- return candidate ? candidate : void 0;
215
+ return typeof candidate === "string" ? normalizeScopeValue(candidate) : void 0;
63
216
  }
64
217
  function normalizeScopeValue(value) {
65
218
  if (typeof value !== "string") {
@@ -84,8 +237,9 @@ function pickPrimaryTopic(candidates) {
84
237
  })[0];
85
238
  }
86
239
  async function findTopicsByScopeAlias(ctx, scopeId) {
240
+ const query2 = ctx.db.query("topics");
87
241
  try {
88
- return await ctx.db.query("topics").withIndex(
242
+ return await query2.withIndex(
89
243
  "by_graph_scope_project",
90
244
  (q) => q.eq(LEGACY_SCOPE_FIELD, scopeId)
91
245
  ).collect();
@@ -97,7 +251,7 @@ async function findTopicsByScopeAlias(ctx, scopeId) {
97
251
  scopeId
98
252
  }
99
253
  );
100
- const topics = await ctx.db.query("topics").collect();
254
+ const topics = await query2.collect();
101
255
  return topics.filter((topic) => {
102
256
  const normalizedGlobalId = normalizeScopeValue(topic.globalId);
103
257
  const mappedProjectId = asMappedProjectId(topic);
@@ -153,311 +307,163 @@ async function resolveInheritedWorkspaceScope(ctx, topic) {
153
307
  let current = topic;
154
308
  for (let i = 0; i < MAX_DEPTH && current?.parentTopicId; i++) {
155
309
  current = await ctx.db.get(current.parentTopicId);
156
- if (!current) break;
310
+ if (!current) {
311
+ break;
312
+ }
157
313
  if (!tenantId) {
158
314
  tenantId = normalizeScopeValue(current.tenantId);
159
315
  }
160
316
  if (!workspaceId) {
161
317
  workspaceId = normalizeScopeValue(current.workspaceId);
162
318
  }
163
- if (tenantId && workspaceId) break;
319
+ if (tenantId && workspaceId) {
320
+ break;
321
+ }
164
322
  }
165
323
  return { tenantId, workspaceId };
166
324
  }
167
325
  async function resolveTopicProjectScope(ctx, args) {
168
326
  if (args.topicId) {
169
- let topic = null;
170
- try {
171
- topic = await ctx.db.get(
172
- args.topicId
173
- );
174
- } catch (error) {
175
- debugGraphPrimitiveFallback(
176
- "[topicScope] Failed to load topic by direct id",
177
- {
178
- error,
179
- topicId: args.topicId
180
- }
181
- );
182
- }
183
- if (!topic) {
184
- topic = await tryResolveHostTopicById(ctx, String(args.topicId));
185
- }
186
- if (!topic) {
187
- topic = pickPrimaryTopic(
188
- await findTopicsByScopeAlias(ctx, String(args.topicId))
189
- ) ?? null;
190
- }
191
- if (!topic) {
192
- const nodeScope = await resolveTopicNodeScopeOrNull(
193
- ctx,
194
- String(args.topicId)
195
- );
196
- if (nodeScope) {
197
- return nodeScope;
198
- }
199
- throw new Error(`Topic not found: ${String(args.topicId)}`);
200
- }
201
- const inherited = await resolveInheritedWorkspaceScope(ctx, topic);
202
- const mapped = asMappedProjectId(topic);
203
- if (mapped) {
204
- return {
205
- topicId: topic._id,
206
- projectId: mapped,
207
- tenantId: inherited.tenantId,
208
- workspaceId: inherited.workspaceId,
209
- source: "topic"
210
- };
211
- }
212
- return {
213
- topicId: topic._id,
214
- tenantId: inherited.tenantId,
215
- workspaceId: inherited.workspaceId,
216
- source: "topic"
217
- };
327
+ return await resolveScopeFromTopicId(ctx, args.topicId);
218
328
  }
219
329
  if (args.projectId) {
220
- let directTopic = null;
221
- try {
222
- directTopic = await ctx.db.get(
223
- args.projectId
224
- );
225
- } catch (error) {
226
- debugGraphPrimitiveFallback(
227
- "[topicScope] Failed to load direct project topic",
228
- {
229
- error,
230
- projectId: args.projectId
231
- }
232
- );
233
- }
234
- if (directTopic) {
235
- const inherited = await resolveInheritedWorkspaceScope(ctx, directTopic);
236
- const mapped = asMappedProjectId(directTopic);
237
- return {
238
- topicId: directTopic._id,
239
- projectId: mapped ?? args.projectId,
240
- tenantId: inherited.tenantId,
241
- workspaceId: inherited.workspaceId,
242
- source: "topic_inferred"
243
- };
244
- }
245
- directTopic = await tryResolveHostTopicByLegacyScope(ctx, args.projectId);
246
- if (directTopic) {
247
- const inherited = await resolveInheritedWorkspaceScope(ctx, directTopic);
248
- const mapped = asMappedProjectId(directTopic);
249
- return {
250
- topicId: directTopic._id,
251
- projectId: mapped ?? args.projectId,
252
- tenantId: inherited.tenantId,
253
- workspaceId: inherited.workspaceId,
254
- source: "topic_inferred"
255
- };
256
- }
257
- const topics = await findTopicsByScopeAlias(ctx, args.projectId);
258
- const primary = pickPrimaryTopic(topics);
259
- if (primary) {
260
- const inherited = await resolveInheritedWorkspaceScope(ctx, primary);
261
- return {
262
- topicId: primary._id,
263
- projectId: args.projectId,
264
- tenantId: inherited.tenantId,
265
- workspaceId: inherited.workspaceId,
266
- source: "project_mapped_topic"
267
- };
268
- }
269
- const nodeScope = await resolveTopicNodeScopeOrNull(
270
- ctx,
271
- String(args.projectId)
272
- );
273
- if (nodeScope) {
274
- return {
275
- ...nodeScope,
276
- projectId: nodeScope.projectId ?? String(args.projectId)
277
- };
278
- }
279
- throw new Error(
280
- `Legacy project scope ${String(args.projectId)} has no mapped topic.`
281
- );
330
+ return await resolveScopeFromLegacyProjectId(ctx, args.projectId);
282
331
  }
283
332
  throw new Error(
284
333
  "Missing scope: provide topicId (preferred) or legacy projectId alias."
285
334
  );
286
335
  }
287
- var optionalScopeArgs = {
288
- projectId: v.optional(v.string()),
289
- topicId: v.optional(v.string())
290
- };
291
-
292
- // src/epistemicNodes.helpers.ts
293
- var DEFAULT_NODE_PAGE_SIZE = 250;
294
- var MAX_NODE_PAGE_SIZE = 8e3;
295
- function clampNodeLimit(limit, fallback = DEFAULT_NODE_PAGE_SIZE) {
296
- if (!Number.isFinite(limit)) {
297
- return fallback;
336
+ async function resolveScopeFromTopicId(ctx, topicId) {
337
+ const topic = await resolveTopicDocFromTopicId(ctx, topicId);
338
+ if (topic) {
339
+ return await buildTopicScope(ctx, topic, "topic");
298
340
  }
299
- return Math.max(1, Math.min(Math.floor(limit), MAX_NODE_PAGE_SIZE));
300
- }
301
- function dedupeWorkspaceNodes(nodes) {
302
- const seen = /* @__PURE__ */ new Set();
303
- const deduped = [];
304
- for (const node of nodes) {
305
- const key = String(node._id);
306
- if (seen.has(key)) {
307
- continue;
308
- }
309
- seen.add(key);
310
- deduped.push(node);
341
+ const nodeScope = await resolveTopicNodeScopeOrNull(ctx, String(topicId));
342
+ if (nodeScope) {
343
+ return nodeScope;
311
344
  }
312
- return deduped;
345
+ throw new Error(`Topic not found: ${String(topicId)}`);
313
346
  }
314
- function nodeMatchesWorkspaceReasoningScope(node, scope) {
315
- return scope.topicId !== void 0 && node.topicId === scope.topicId || scope.projectId !== void 0 && node.projectId === scope.projectId;
347
+ async function resolveTopicDocFromTopicId(ctx, topicId) {
348
+ const direct = await tryReadTopicDoc(ctx, topicId, {
349
+ failureLog: "[topicScope] Failed to load topic by direct id",
350
+ idLogKey: "topicId"
351
+ });
352
+ if (direct) {
353
+ return direct;
354
+ }
355
+ const hostTopic = await tryResolveHostTopicById(ctx, String(topicId));
356
+ if (hostTopic) {
357
+ return hostTopic;
358
+ }
359
+ return pickPrimaryTopic(await findTopicsByScopeAlias(ctx, String(topicId))) ?? null;
316
360
  }
317
- async function collectScopedNodes(ctx, scope, args) {
318
- const queries = [];
319
- if (scope.topicId) {
320
- queries.push(
321
- args.nodeType ? ctx.db.query("epistemicNodes").withIndex(
322
- "by_topic_type",
323
- (q) => q.eq("topicId", scope.topicId).eq("nodeType", args.nodeType)
324
- ).order("desc").take(args.scanLimit) : ctx.db.query("epistemicNodes").withIndex("by_topic", (q) => q.eq("topicId", scope.topicId)).order("desc").take(args.scanLimit)
325
- );
361
+ async function resolveScopeFromLegacyProjectId(ctx, legacyProjectId) {
362
+ const directTopic = await resolveDirectLegacyProjectTopic(
363
+ ctx,
364
+ legacyProjectId
365
+ );
366
+ if (directTopic) {
367
+ return await buildTopicScope(ctx, directTopic, "topic_inferred", {
368
+ fallbackProjectId: legacyProjectId
369
+ });
326
370
  }
327
- if (scope.projectId && !scope.topicId) {
328
- queries.push(
329
- args.nodeType ? ctx.db.query("epistemicNodes").withIndex(
330
- "by_topic_type",
331
- (q) => q.eq("topicId", scope.projectId).eq("nodeType", args.nodeType)
332
- ).order("desc").take(args.scanLimit) : ctx.db.query("epistemicNodes").withIndex("by_topic", (q) => q.eq("topicId", scope.projectId)).order("desc").take(args.scanLimit)
333
- );
371
+ const primary = pickPrimaryTopic(
372
+ await findTopicsByScopeAlias(ctx, legacyProjectId)
373
+ );
374
+ if (primary) {
375
+ return await buildTopicScope(ctx, primary, "project_mapped_topic", {
376
+ fallbackProjectId: legacyProjectId
377
+ });
334
378
  }
335
- const combined = dedupeWorkspaceNodes((await Promise.all(queries)).flat());
336
- return combined.filter(
337
- (node) => nodeMatchesWorkspaceReasoningScope(node, scope)
379
+ const nodeScope = await resolveTopicNodeScopeOrNull(ctx, legacyProjectId);
380
+ if (nodeScope) {
381
+ return {
382
+ ...nodeScope,
383
+ projectId: nodeScope.projectId ?? legacyProjectId
384
+ };
385
+ }
386
+ throw new Error(
387
+ `Legacy project scope ${legacyProjectId} has no mapped topic.`
338
388
  );
339
389
  }
340
- v.union(
341
- v.literal("L4"),
342
- v.literal("L3"),
343
- v.literal("L2"),
344
- v.literal("L1"),
345
- v.literal("ontological"),
346
- v.literal("organizational")
347
- );
348
- v.union(v.literal("decision"));
349
- v.union(
350
- v.literal("belief"),
351
- v.literal("question"),
352
- v.literal("theme"),
353
- v.literal("deal")
354
- );
355
- v.union(
356
- v.literal("claim"),
357
- v.literal("evidence"),
358
- v.literal("synthesis")
359
- );
360
- v.union(
361
- v.literal("atomic_fact"),
362
- v.literal("excerpt"),
363
- v.literal("source")
364
- );
365
- v.union(
366
- // L4: Audit targets
367
- v.literal("decision"),
368
- // L3: Traversal anchors
369
- v.literal("belief"),
370
- v.literal("question"),
371
- v.literal("theme"),
372
- v.literal("deal"),
373
- // L2: Compression boundary
374
- v.literal("claim"),
375
- v.literal("evidence"),
376
- v.literal("synthesis"),
377
- v.literal("answer"),
378
- // L1: Terminal leaves
379
- v.literal("atomic_fact"),
380
- v.literal("excerpt"),
381
- v.literal("source")
382
- );
383
- v.union(
384
- v.literal("company"),
385
- v.literal("person"),
386
- v.literal("investor"),
387
- v.literal("function"),
388
- v.literal("value_chain")
389
- );
390
- v.union(v.literal("topic"));
391
- var nodeTypeValidator = v.union(
392
- // L4: Audit targets
393
- v.literal("decision"),
394
- // L3: Traversal anchors
395
- v.literal("belief"),
396
- v.literal("question"),
397
- v.literal("theme"),
398
- v.literal("deal"),
399
- // L2: Compression boundary
400
- v.literal("claim"),
401
- v.literal("evidence"),
402
- v.literal("synthesis"),
403
- v.literal("answer"),
404
- // L1: Terminal leaves
405
- v.literal("atomic_fact"),
406
- v.literal("excerpt"),
407
- v.literal("source"),
408
- // Ontological
409
- v.literal("company"),
410
- v.literal("person"),
411
- v.literal("investor"),
412
- v.literal("function"),
413
- v.literal("value_chain"),
414
- // Organizational
415
- v.literal("topic")
416
- );
417
- v.union(
418
- v.literal("human"),
419
- v.literal("ai_extracted"),
420
- v.literal("ai_generated"),
421
- v.literal("imported"),
422
- v.literal("system")
423
- // System-generated (migrations, classifiers)
424
- );
425
- var statusValidator = v.union(
426
- v.literal("active"),
427
- v.literal("superseded"),
428
- v.literal("archived"),
429
- v.literal("deleted")
430
- );
431
- v.union(
432
- v.literal("unverified"),
433
- v.literal("human_verified"),
434
- v.literal("ai_verified"),
435
- v.literal("contradicted"),
436
- v.literal("outdated")
437
- );
390
+ async function resolveDirectLegacyProjectTopic(ctx, legacyProjectId) {
391
+ const directTopic = await tryReadTopicDoc(ctx, legacyProjectId, {
392
+ failureLog: "[topicScope] Failed to load direct project topic",
393
+ idLogKey: "projectId"
394
+ });
395
+ return directTopic ?? tryResolveHostTopicByLegacyScope(ctx, legacyProjectId);
396
+ }
397
+ async function tryReadTopicDoc(ctx, id, log) {
398
+ try {
399
+ return await ctx.db.get(id);
400
+ } catch (error) {
401
+ debugGraphPrimitiveFallback(log.failureLog, {
402
+ error,
403
+ [log.idLogKey]: id
404
+ });
405
+ return null;
406
+ }
407
+ }
408
+ async function buildTopicScope(ctx, topic, source, options = {}) {
409
+ const inherited = await resolveInheritedWorkspaceScope(ctx, topic);
410
+ const mapped = asMappedProjectId(topic);
411
+ return {
412
+ topicId: topic._id,
413
+ ...mapped || options.fallbackProjectId ? { projectId: mapped ?? options.fallbackProjectId } : {},
414
+ tenantId: inherited.tenantId,
415
+ workspaceId: inherited.workspaceId,
416
+ source
417
+ };
418
+ }
419
+ var optionalScopeArgs = {
420
+ projectId: v.optional(v.string()),
421
+ topicId: v.optional(v.string())
422
+ };
438
423
 
439
424
  // src/epistemicNodes.queries.ts
440
425
  var optionalNodeScopeArgs = optionalScopeArgs;
426
+ function asEpistemicNodesQueryCtx(ctx) {
427
+ return ctx;
428
+ }
429
+ function isInScope(node, scope) {
430
+ return nodeMatchesWorkspaceReasoningScope(node, scope);
431
+ }
432
+ function isStatus(status) {
433
+ return (node) => node.status === status;
434
+ }
435
+ function isStatusInScope(status, scope) {
436
+ return (node) => isStatus(status)(node) && isInScope(node, scope);
437
+ }
438
+ function isNotDeletedInScope(scope) {
439
+ return (node) => node.status !== "deleted" && isInScope(node, scope);
440
+ }
441
+ function toLiteNode(node) {
442
+ return {
443
+ _id: node._id,
444
+ globalId: node.globalId,
445
+ nodeType: node.nodeType,
446
+ createdBy: node.createdBy,
447
+ topicId: node.topicId,
448
+ projectId: node.projectId,
449
+ status: node.status,
450
+ epistemicLayer: node.epistemicLayer
451
+ };
452
+ }
441
453
  var get = query({
442
454
  args: { nodeId: v.id("epistemicNodes") },
443
455
  returns: permissiveReturn,
444
- handler: async (ctx, args) => {
445
- return await ctx.db.get(args.nodeId);
446
- }
456
+ handler: async (ctx, args) => await asEpistemicNodesQueryCtx(ctx).db.get(args.nodeId)
447
457
  });
448
458
  var getByGlobalId = query({
449
459
  args: { globalId: v.string() },
450
460
  returns: permissiveReturn,
451
- handler: async (ctx, args) => {
452
- return await ctx.db.query("epistemicNodes").withIndex("by_globalId", (q) => q.eq("globalId", args.globalId)).first();
453
- }
461
+ handler: async (ctx, args) => await asEpistemicNodesQueryCtx(ctx).db.query("epistemicNodes").withIndex("by_globalId", (q) => q.eq("globalId", args.globalId)).first()
454
462
  });
455
463
  var getByContentHash = query({
456
464
  args: { contentHash: v.string() },
457
465
  returns: permissiveReturn,
458
- handler: async (ctx, args) => {
459
- return await ctx.db.query("epistemicNodes").withIndex("by_contentHash", (q) => q.eq("contentHash", args.contentHash)).collect();
460
- }
466
+ handler: async (ctx, args) => await asEpistemicNodesQueryCtx(ctx).db.query("epistemicNodes").withIndex("by_contentHash", (q) => q.eq("contentHash", args.contentHash)).collect()
461
467
  });
462
468
  var getByProjectAndType = query({
463
469
  args: {
@@ -468,12 +474,13 @@ var getByProjectAndType = query({
468
474
  },
469
475
  returns: permissiveReturn,
470
476
  handler: async (ctx, args) => {
471
- if (!args.projectId && !args.topicId) {
477
+ if (!(args.projectId || args.topicId)) {
472
478
  return [];
473
479
  }
480
+ const queryCtx = asEpistemicNodesQueryCtx(ctx);
474
481
  let scope;
475
482
  try {
476
- scope = await resolveTopicProjectScope(ctx, {
483
+ scope = await resolveTopicProjectScope(queryCtx, {
477
484
  projectId: args.projectId,
478
485
  topicId: args.topicId
479
486
  });
@@ -490,18 +497,14 @@ var getByProjectAndType = query({
490
497
  }
491
498
  const pageSize = clampNodeLimit(args.limit);
492
499
  const scanLimit = Math.min(pageSize * 3, MAX_NODE_PAGE_SIZE);
493
- const nodes = await collectScopedNodes(ctx, scope, {
500
+ const nodes = await collectScopedNodes(queryCtx, scope, {
494
501
  nodeType: args.nodeType,
495
502
  scanLimit
496
503
  });
497
504
  if (args.status) {
498
- return nodes.filter(
499
- (n) => n.status === args.status && nodeMatchesWorkspaceReasoningScope(n, scope)
500
- ).slice(0, pageSize);
505
+ return nodes.filter(isStatusInScope(args.status, scope)).slice(0, pageSize);
501
506
  }
502
- return nodes.filter(
503
- (n) => n.status === "active" && nodeMatchesWorkspaceReasoningScope(n, scope)
504
- ).slice(0, pageSize);
507
+ return nodes.filter(isStatusInScope("active", scope)).slice(0, pageSize);
505
508
  }
506
509
  });
507
510
  var getByProjectAndTypeLite = query({
@@ -513,12 +516,13 @@ var getByProjectAndTypeLite = query({
513
516
  },
514
517
  returns: permissiveReturn,
515
518
  handler: async (ctx, args) => {
516
- if (!args.projectId && !args.topicId) {
519
+ if (!(args.projectId || args.topicId)) {
517
520
  return [];
518
521
  }
522
+ const queryCtx = asEpistemicNodesQueryCtx(ctx);
519
523
  let scope;
520
524
  try {
521
- scope = await resolveTopicProjectScope(ctx, {
525
+ scope = await resolveTopicProjectScope(queryCtx, {
522
526
  projectId: args.projectId,
523
527
  topicId: args.topicId
524
528
  });
@@ -535,23 +539,14 @@ var getByProjectAndTypeLite = query({
535
539
  }
536
540
  const pageSize = clampNodeLimit(args.limit);
537
541
  const scanLimit = Math.min(pageSize * 3, MAX_NODE_PAGE_SIZE);
538
- const query2 = ctx.db.query("epistemicNodes").withIndex(
542
+ const nodeQuery = queryCtx.db.query("epistemicNodes").withIndex(
539
543
  "by_topic_type",
540
544
  (q) => q.eq("topicId", scope.topicId).eq("nodeType", args.nodeType)
541
545
  );
542
- const nodes = await query2.order("desc").take(scanLimit);
543
- const statusFiltered = args.status ? nodes.filter((n) => n.status === args.status) : nodes.filter((n) => n.status === "active");
546
+ const nodes = await nodeQuery.order("desc").take(scanLimit);
547
+ const statusFiltered = args.status ? nodes.filter(isStatus(args.status)) : nodes.filter(isStatus("active"));
544
548
  const capped = statusFiltered.slice(0, pageSize);
545
- return capped.map((n) => ({
546
- _id: n._id,
547
- globalId: n.globalId,
548
- nodeType: n.nodeType,
549
- createdBy: n.createdBy,
550
- topicId: n.topicId,
551
- projectId: n.projectId,
552
- status: n.status,
553
- epistemicLayer: n.epistemicLayer
554
- }));
549
+ return capped.map(toLiteNode);
555
550
  }
556
551
  });
557
552
  var getByProject = query({
@@ -563,23 +558,27 @@ var getByProject = query({
563
558
  },
564
559
  returns: permissiveReturn,
565
560
  handler: async (ctx, args) => {
566
- if (!args.projectId && !args.topicId) {
561
+ if (!(args.projectId || args.topicId)) {
567
562
  return [];
568
563
  }
564
+ const queryCtx = asEpistemicNodesQueryCtx(ctx);
569
565
  const pageSize = clampNodeLimit(args.limit);
570
566
  const scanLimit = Math.min(pageSize * 3, MAX_NODE_PAGE_SIZE);
571
567
  let scope;
572
568
  try {
573
- scope = await resolveTopicProjectScope(ctx, {
569
+ scope = await resolveTopicProjectScope(queryCtx, {
574
570
  projectId: args.projectId,
575
571
  topicId: args.topicId
576
572
  });
577
573
  } catch (error) {
578
- debugGraphPrimitiveFallback("[epistemicNodes] Failed to resolve list scope", {
579
- error,
580
- projectId: args.projectId,
581
- topicId: args.topicId
582
- });
574
+ debugGraphPrimitiveFallback(
575
+ "[epistemicNodes] Failed to resolve list scope",
576
+ {
577
+ error,
578
+ projectId: args.projectId,
579
+ topicId: args.topicId
580
+ }
581
+ );
583
582
  return [];
584
583
  }
585
584
  if (args.userId) {
@@ -592,15 +591,11 @@ var getByProject = query({
592
591
  return [];
593
592
  }
594
593
  }
595
- const nodes = await collectScopedNodes(ctx, scope, { scanLimit });
594
+ const nodes = await collectScopedNodes(queryCtx, scope, { scanLimit });
596
595
  if (args.includeArchived) {
597
- return nodes.filter(
598
- (n) => n.status !== "deleted" && nodeMatchesWorkspaceReasoningScope(n, scope)
599
- ).slice(0, pageSize);
596
+ return nodes.filter(isNotDeletedInScope(scope)).slice(0, pageSize);
600
597
  }
601
- return nodes.filter(
602
- (n) => n.status === "active" && nodeMatchesWorkspaceReasoningScope(n, scope)
603
- ).slice(0, pageSize);
598
+ return nodes.filter(isStatusInScope("active", scope)).slice(0, pageSize);
604
599
  }
605
600
  });
606
601
  var listAll = query({
@@ -609,10 +604,11 @@ var listAll = query({
609
604
  },
610
605
  returns: permissiveReturn,
611
606
  handler: async (ctx, args) => {
607
+ const queryCtx = asEpistemicNodesQueryCtx(ctx);
612
608
  const pageSize = clampNodeLimit(args.limit ?? 2e3);
613
609
  const scanLimit = Math.min(pageSize * 2, MAX_NODE_PAGE_SIZE * 2);
614
- const nodes = await ctx.db.query("epistemicNodes").order("desc").take(scanLimit);
615
- return nodes.filter((n) => n.status === "active").slice(0, pageSize);
610
+ const nodes = await queryCtx.db.query("epistemicNodes").order("desc").take(scanLimit);
611
+ return nodes.filter(isStatus("active")).slice(0, pageSize);
616
612
  }
617
613
  });
618
614
  var search = query({
@@ -624,11 +620,12 @@ var search = query({
624
620
  },
625
621
  returns: permissiveReturn,
626
622
  handler: async (ctx, args) => {
623
+ const queryCtx = asEpistemicNodesQueryCtx(ctx);
627
624
  const pageSize = clampNodeLimit(args.limit, 100);
628
625
  let scope;
629
626
  if (args.projectId || args.topicId) {
630
627
  try {
631
- scope = await resolveTopicProjectScope(ctx, {
628
+ scope = await resolveTopicProjectScope(queryCtx, {
632
629
  projectId: args.projectId,
633
630
  topicId: args.topicId
634
631
  });
@@ -644,7 +641,7 @@ var search = query({
644
641
  return [];
645
642
  }
646
643
  }
647
- const searchResults = ctx.db.query("epistemicNodes").withSearchIndex("search_canonicalText", (q) => {
644
+ const searchResults = queryCtx.db.query("epistemicNodes").withSearchIndex("search_canonicalText", (q) => {
648
645
  let search2 = q.search("canonicalText", args.searchQuery);
649
646
  if (scope?.topicId) {
650
647
  search2 = search2.eq("topicId", scope.topicId);