@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,11 @@
1
- import { v, ConvexError } from 'convex/values';
2
- import { normalizeTupleContradictionPolicy, confidenceFromSL, readOpinionFromRecord, mkOpinion } from '@lucern/confidence';
3
- import { checkProjectAccess } from '@lucern/access-control/access';
4
1
  import { normalizeAudienceKey, classFromAudienceKey } from '@lucern/access-control/audience';
5
2
  import { getCurrentUserId } from '@lucern/access-control/auth';
6
- import { componentsGeneric, anyApi } from 'convex/server';
3
+ import { throwStructuredMutationError } from '@lucern/access-control/structuredMutationError';
4
+ export { throwStructuredMutationError } from '@lucern/access-control/structuredMutationError';
5
+ import { normalizeTupleContradictionPolicy, confidenceFromSL, readOpinionFromRecord, mkOpinion } from '@lucern/confidence';
6
+ import { v } from 'convex/values';
7
+ import { unsafeConvexAnyApi } from '@lucern/contracts/convex/unsafeAnyApi';
8
+ import { componentsGeneric } from 'convex/server';
7
9
  import '@lucern/contracts/schema-helpers/spine/tables/epistemicNodes';
8
10
 
9
11
  // src/epistemicBeliefs.helpers.ts
@@ -118,9 +120,12 @@ function resolveBeliefLifecycleStatus(opts) {
118
120
  function isPreValidationBeliefStatus(status) {
119
121
  return status === "assumption" || status === "hypothesis";
120
122
  }
121
- var api = anyApi;
123
+ var unsafeApi = unsafeConvexAnyApi(
124
+ "graph-primitives top-level module bundle lacks a committed Convex _generated/api surface"
125
+ );
126
+ var api = unsafeApi;
122
127
  componentsGeneric();
123
- var internal = anyApi;
128
+ var internal = unsafeApi;
124
129
 
125
130
  // src/debug.ts
126
131
  function isGraphPrimitiveDebugEnabled() {
@@ -152,6 +157,10 @@ function readStringArray(value) {
152
157
  function readMetadata(topic) {
153
158
  return topic.metadata && typeof topic.metadata === "object" ? topic.metadata : {};
154
159
  }
160
+ function omitMetadataKey(metadata, key) {
161
+ const { [key]: _omitted, ...rest } = metadata;
162
+ return rest;
163
+ }
155
164
  function readLegacyProjectId(value) {
156
165
  if (!value) {
157
166
  return;
@@ -232,9 +241,12 @@ async function resolveTopicDoc(ctx, scopeId) {
232
241
  );
233
242
  }
234
243
  try {
235
- const topic = await ctx.runQuery(api.topics.getByLegacyScopeId, {
236
- projectId: String(scopeId)
237
- });
244
+ const topic = await ctx.runQuery(
245
+ api.topics.getByLegacyScopeId,
246
+ {
247
+ projectId: String(scopeId)
248
+ }
249
+ );
238
250
  if (topic?.name !== void 0 && topic?.type !== void 0) {
239
251
  return topic;
240
252
  }
@@ -254,8 +266,18 @@ function materializeTopicProjectOverlay(topic, idMode = "legacy") {
254
266
  const outwardId = idMode === "topic" ? topicId : storageProjectId;
255
267
  const visibility = coerceVisibility(topic.visibility) || coerceVisibility(metadata.visibility) || "private";
256
268
  const status = coerceStatus(topic.status) || coerceStatus(metadata.status) || "active";
257
- const createdAt = typeof topic.createdAt === "number" ? topic.createdAt : typeof topic._creationTime === "number" ? topic._creationTime : 0;
258
- const updatedAt = typeof topic.updatedAt === "number" ? topic.updatedAt : typeof metadata.updatedAt === "number" ? metadata.updatedAt : createdAt;
269
+ let createdAt = 0;
270
+ if (typeof topic.createdAt === "number") {
271
+ createdAt = topic.createdAt;
272
+ } else if (typeof topic._creationTime === "number") {
273
+ createdAt = topic._creationTime;
274
+ }
275
+ let updatedAt = createdAt;
276
+ if (typeof topic.updatedAt === "number") {
277
+ updatedAt = topic.updatedAt;
278
+ } else if (typeof metadata.updatedAt === "number") {
279
+ updatedAt = metadata.updatedAt;
280
+ }
259
281
  return {
260
282
  ...metadata,
261
283
  _id: outwardId,
@@ -324,90 +346,113 @@ async function patchTopicProjectOverlay(ctx, scopeId, value) {
324
346
  if (!topic) {
325
347
  return null;
326
348
  }
327
- const nextMetadata = { ...readMetadata(topic) };
328
- const patch = {};
329
- const topicUpdateArgs = {
330
- id: String(topic._id)
349
+ const plan = buildTopicProjectOverlayPatchPlan(topic, value);
350
+ await applyTopicProjectOverlayPatch(ctx, topic, plan);
351
+ return materializeTopicProjectOverlay({
352
+ ...topic,
353
+ ...plan.patch,
354
+ metadata: plan.nextMetadata
355
+ });
356
+ }
357
+ function buildTopicProjectOverlayPatchPlan(topic, value) {
358
+ const plan = {
359
+ nextMetadata: { ...readMetadata(topic) },
360
+ patch: {},
361
+ topicUpdateArgs: {
362
+ id: String(topic._id)
363
+ }
331
364
  };
332
365
  for (const [key, rawValue] of Object.entries(value)) {
333
- switch (key) {
334
- case "_id":
335
- case "projectId":
336
- case "topicId":
337
- case "legacyProjectId":
338
- case "storageProjectId":
339
- break;
340
- case "name":
341
- case "description":
342
- patch[key] = rawValue;
343
- topicUpdateArgs[key] = rawValue;
344
- break;
345
- case "tenantId":
346
- case "workspaceId":
347
- case "ownerId":
348
- throw new Error(
349
- `patchTopicProjectOverlay cannot mutate ${key} via component-owned topics`
350
- );
351
- case "status": {
352
- const status = coerceStatus(rawValue);
353
- if (status) {
354
- patch.status = status;
355
- topicUpdateArgs.status = status;
356
- }
357
- break;
358
- }
359
- case "visibility": {
360
- const visibility = coerceVisibility(rawValue);
361
- if (visibility) {
362
- patch.visibility = visibility;
363
- topicUpdateArgs.visibility = visibility;
364
- }
365
- break;
366
- }
367
- case "type": {
368
- const projectType = readNonEmptyString(rawValue);
369
- if (projectType) {
370
- nextMetadata.projectType = projectType;
371
- } else {
372
- delete nextMetadata.projectType;
373
- }
374
- break;
375
- }
376
- case "updatedAt":
377
- case "createdAt":
378
- break;
379
- default:
380
- if (rawValue === void 0) {
381
- delete nextMetadata[key];
382
- } else {
383
- nextMetadata[key] = rawValue;
384
- }
385
- }
366
+ applyTopicProjectOverlayPatchEntry(plan, key, rawValue);
367
+ }
368
+ plan.patch.updatedAt = Date.now();
369
+ plan.patch.metadata = plan.nextMetadata;
370
+ plan.topicUpdateArgs.metadata = plan.nextMetadata;
371
+ return plan;
372
+ }
373
+ function applyTopicProjectOverlayPatchEntry(plan, key, rawValue) {
374
+ switch (key) {
375
+ case "_id":
376
+ case "projectId":
377
+ case "topicId":
378
+ case "legacyProjectId":
379
+ case "storageProjectId":
380
+ case "updatedAt":
381
+ case "createdAt":
382
+ return;
383
+ case "name":
384
+ case "description":
385
+ plan.patch[key] = rawValue;
386
+ plan.topicUpdateArgs[key] = rawValue;
387
+ return;
388
+ case "tenantId":
389
+ case "workspaceId":
390
+ case "ownerId":
391
+ throw new Error(
392
+ `patchTopicProjectOverlay cannot mutate ${key} via component-owned topics`
393
+ );
394
+ case "status":
395
+ applyTopicStatusPatch(plan, rawValue);
396
+ return;
397
+ case "visibility":
398
+ applyTopicVisibilityPatch(plan, rawValue);
399
+ return;
400
+ case "type":
401
+ applyTopicProjectTypePatch(plan, rawValue);
402
+ return;
403
+ default:
404
+ applyTopicMetadataPatch(plan, key, rawValue);
405
+ }
406
+ }
407
+ function applyTopicStatusPatch(plan, rawValue) {
408
+ const status = coerceStatus(rawValue);
409
+ if (status) {
410
+ plan.patch.status = status;
411
+ plan.topicUpdateArgs.status = status;
412
+ }
413
+ }
414
+ function applyTopicVisibilityPatch(plan, rawValue) {
415
+ const visibility = coerceVisibility(rawValue);
416
+ if (visibility) {
417
+ plan.patch.visibility = visibility;
418
+ plan.topicUpdateArgs.visibility = visibility;
419
+ }
420
+ }
421
+ function applyTopicProjectTypePatch(plan, rawValue) {
422
+ const projectType = readNonEmptyString(rawValue);
423
+ if (projectType) {
424
+ plan.nextMetadata.projectType = projectType;
425
+ return;
386
426
  }
387
- patch.updatedAt = Date.now();
388
- patch.metadata = nextMetadata;
389
- topicUpdateArgs.metadata = nextMetadata;
427
+ plan.nextMetadata = omitMetadataKey(plan.nextMetadata, "projectType");
428
+ }
429
+ function applyTopicMetadataPatch(plan, key, rawValue) {
430
+ if (rawValue === void 0) {
431
+ plan.nextMetadata = omitMetadataKey(plan.nextMetadata, key);
432
+ return;
433
+ }
434
+ plan.nextMetadata[key] = rawValue;
435
+ }
436
+ async function applyTopicProjectOverlayPatch(ctx, topic, plan) {
390
437
  if (typeof ctx.runMutation === "function") {
391
438
  try {
392
- await ctx.runMutation(api.topics.update, topicUpdateArgs);
439
+ await ctx.runMutation(api.topics.update, plan.topicUpdateArgs);
393
440
  } catch (error) {
394
- if (!isMissingLucernChildComponentError(error) || !ctx?.db || typeof ctx.db.patch !== "function") {
441
+ if (!canPatchTopicViaLocalDb(ctx, error)) {
395
442
  throw error;
396
443
  }
397
- await ctx.db.patch(String(topic._id), patch);
444
+ await ctx.db.patch(topic._id, plan.patch);
398
445
  }
399
446
  } else if (ctx?.db && typeof ctx.db.patch === "function") {
400
- await ctx.db.patch(String(topic._id), patch);
447
+ await ctx.db.patch(topic._id, plan.patch);
401
448
  } else {
402
449
  throw new Error(
403
450
  "Cannot patch topic without component adapter (ctx.runMutation unavailable)"
404
451
  );
405
452
  }
406
- return materializeTopicProjectOverlay({
407
- ...topic,
408
- ...patch,
409
- metadata: nextMetadata
410
- });
453
+ }
454
+ function canPatchTopicViaLocalDb(ctx, error) {
455
+ return isMissingLucernChildComponentError(error) && Boolean(ctx?.db) && typeof ctx.db?.patch === "function";
411
456
  }
412
457
 
413
458
  // src/resolvers.ts
@@ -435,7 +480,7 @@ async function patchProjectWithTolerance(ctx, projectId, value) {
435
480
  try {
436
481
  await patchTopicProjectOverlay(ctx, projectId, value);
437
482
  } catch (error) {
438
- if (!isAdvisoryTopicPatch(value) || !isMissingLucernChildComponentError2(error)) {
483
+ if (!(isAdvisoryTopicPatch(value) && isMissingLucernChildComponentError2(error))) {
439
484
  throw error;
440
485
  }
441
486
  console.warn(
@@ -502,13 +547,15 @@ function asMappedProjectId(topic) {
502
547
  if (!topic) {
503
548
  return;
504
549
  }
505
- const directLegacyProjectId = normalizeScopeValue(topic[LEGACY_SCOPE_FIELD2]);
550
+ const directLegacyProjectId = normalizeScopeValue(
551
+ topic[LEGACY_SCOPE_FIELD2]
552
+ );
506
553
  if (directLegacyProjectId) {
507
554
  return directLegacyProjectId;
508
555
  }
509
556
  const metadata = topic.metadata || {};
510
557
  const candidate = metadata[LEGACY_SCOPE_FIELD2] || metadata.legacyProjectId || metadata.projectId || metadata.scopeProjectId;
511
- return candidate ? candidate : void 0;
558
+ return typeof candidate === "string" ? normalizeScopeValue(candidate) : void 0;
512
559
  }
513
560
  function normalizeScopeValue(value) {
514
561
  if (typeof value !== "string") {
@@ -533,8 +580,9 @@ function pickPrimaryTopic(candidates) {
533
580
  })[0];
534
581
  }
535
582
  async function findTopicsByScopeAlias(ctx, scopeId) {
583
+ const query = ctx.db.query("topics");
536
584
  try {
537
- return await ctx.db.query("topics").withIndex(
585
+ return await query.withIndex(
538
586
  "by_graph_scope_project",
539
587
  (q) => q.eq(LEGACY_SCOPE_FIELD2, scopeId)
540
588
  ).collect();
@@ -546,7 +594,7 @@ async function findTopicsByScopeAlias(ctx, scopeId) {
546
594
  scopeId
547
595
  }
548
596
  );
549
- const topics = await ctx.db.query("topics").collect();
597
+ const topics = await query.collect();
550
598
  return topics.filter((topic) => {
551
599
  const normalizedGlobalId = normalizeScopeValue(topic.globalId);
552
600
  const mappedProjectId = asMappedProjectId(topic);
@@ -602,137 +650,115 @@ async function resolveInheritedWorkspaceScope(ctx, topic) {
602
650
  let current = topic;
603
651
  for (let i = 0; i < MAX_DEPTH && current?.parentTopicId; i++) {
604
652
  current = await ctx.db.get(current.parentTopicId);
605
- if (!current) break;
653
+ if (!current) {
654
+ break;
655
+ }
606
656
  if (!tenantId) {
607
657
  tenantId = normalizeScopeValue(current.tenantId);
608
658
  }
609
659
  if (!workspaceId) {
610
660
  workspaceId = normalizeScopeValue(current.workspaceId);
611
661
  }
612
- if (tenantId && workspaceId) break;
662
+ if (tenantId && workspaceId) {
663
+ break;
664
+ }
613
665
  }
614
666
  return { tenantId, workspaceId };
615
667
  }
616
668
  async function resolveTopicProjectScope(ctx, args) {
617
669
  if (args.topicId) {
618
- let topic = null;
619
- try {
620
- topic = await ctx.db.get(
621
- args.topicId
622
- );
623
- } catch (error) {
624
- debugGraphPrimitiveFallback(
625
- "[topicScope] Failed to load topic by direct id",
626
- {
627
- error,
628
- topicId: args.topicId
629
- }
630
- );
631
- }
632
- if (!topic) {
633
- topic = await tryResolveHostTopicById(ctx, String(args.topicId));
634
- }
635
- if (!topic) {
636
- topic = pickPrimaryTopic(
637
- await findTopicsByScopeAlias(ctx, String(args.topicId))
638
- ) ?? null;
639
- }
640
- if (!topic) {
641
- const nodeScope = await resolveTopicNodeScopeOrNull(
642
- ctx,
643
- String(args.topicId)
644
- );
645
- if (nodeScope) {
646
- return nodeScope;
647
- }
648
- throw new Error(`Topic not found: ${String(args.topicId)}`);
649
- }
650
- const inherited = await resolveInheritedWorkspaceScope(ctx, topic);
651
- const mapped = asMappedProjectId(topic);
652
- if (mapped) {
653
- return {
654
- topicId: topic._id,
655
- projectId: mapped,
656
- tenantId: inherited.tenantId,
657
- workspaceId: inherited.workspaceId,
658
- source: "topic"
659
- };
660
- }
661
- return {
662
- topicId: topic._id,
663
- tenantId: inherited.tenantId,
664
- workspaceId: inherited.workspaceId,
665
- source: "topic"
666
- };
670
+ return await resolveScopeFromTopicId(ctx, args.topicId);
667
671
  }
668
672
  if (args.projectId) {
669
- let directTopic = null;
670
- try {
671
- directTopic = await ctx.db.get(
672
- args.projectId
673
- );
674
- } catch (error) {
675
- debugGraphPrimitiveFallback(
676
- "[topicScope] Failed to load direct project topic",
677
- {
678
- error,
679
- projectId: args.projectId
680
- }
681
- );
682
- }
683
- if (directTopic) {
684
- const inherited = await resolveInheritedWorkspaceScope(ctx, directTopic);
685
- const mapped = asMappedProjectId(directTopic);
686
- return {
687
- topicId: directTopic._id,
688
- projectId: mapped ?? args.projectId,
689
- tenantId: inherited.tenantId,
690
- workspaceId: inherited.workspaceId,
691
- source: "topic_inferred"
692
- };
693
- }
694
- directTopic = await tryResolveHostTopicByLegacyScope(ctx, args.projectId);
695
- if (directTopic) {
696
- const inherited = await resolveInheritedWorkspaceScope(ctx, directTopic);
697
- const mapped = asMappedProjectId(directTopic);
698
- return {
699
- topicId: directTopic._id,
700
- projectId: mapped ?? args.projectId,
701
- tenantId: inherited.tenantId,
702
- workspaceId: inherited.workspaceId,
703
- source: "topic_inferred"
704
- };
705
- }
706
- const topics = await findTopicsByScopeAlias(ctx, args.projectId);
707
- const primary = pickPrimaryTopic(topics);
708
- if (primary) {
709
- const inherited = await resolveInheritedWorkspaceScope(ctx, primary);
710
- return {
711
- topicId: primary._id,
712
- projectId: args.projectId,
713
- tenantId: inherited.tenantId,
714
- workspaceId: inherited.workspaceId,
715
- source: "project_mapped_topic"
716
- };
717
- }
718
- const nodeScope = await resolveTopicNodeScopeOrNull(
719
- ctx,
720
- String(args.projectId)
721
- );
722
- if (nodeScope) {
723
- return {
724
- ...nodeScope,
725
- projectId: nodeScope.projectId ?? String(args.projectId)
726
- };
727
- }
728
- throw new Error(
729
- `Legacy project scope ${String(args.projectId)} has no mapped topic.`
730
- );
673
+ return await resolveScopeFromLegacyProjectId(ctx, args.projectId);
731
674
  }
732
675
  throw new Error(
733
676
  "Missing scope: provide topicId (preferred) or legacy projectId alias."
734
677
  );
735
678
  }
679
+ async function resolveScopeFromTopicId(ctx, topicId) {
680
+ const topic = await resolveTopicDocFromTopicId(ctx, topicId);
681
+ if (topic) {
682
+ return await buildTopicScope(ctx, topic, "topic");
683
+ }
684
+ const nodeScope = await resolveTopicNodeScopeOrNull(ctx, String(topicId));
685
+ if (nodeScope) {
686
+ return nodeScope;
687
+ }
688
+ throw new Error(`Topic not found: ${String(topicId)}`);
689
+ }
690
+ async function resolveTopicDocFromTopicId(ctx, topicId) {
691
+ const direct = await tryReadTopicDoc(ctx, topicId, {
692
+ failureLog: "[topicScope] Failed to load topic by direct id",
693
+ idLogKey: "topicId"
694
+ });
695
+ if (direct) {
696
+ return direct;
697
+ }
698
+ const hostTopic = await tryResolveHostTopicById(ctx, String(topicId));
699
+ if (hostTopic) {
700
+ return hostTopic;
701
+ }
702
+ return pickPrimaryTopic(await findTopicsByScopeAlias(ctx, String(topicId))) ?? null;
703
+ }
704
+ async function resolveScopeFromLegacyProjectId(ctx, legacyProjectId) {
705
+ const directTopic = await resolveDirectLegacyProjectTopic(
706
+ ctx,
707
+ legacyProjectId
708
+ );
709
+ if (directTopic) {
710
+ return await buildTopicScope(ctx, directTopic, "topic_inferred", {
711
+ fallbackProjectId: legacyProjectId
712
+ });
713
+ }
714
+ const primary = pickPrimaryTopic(
715
+ await findTopicsByScopeAlias(ctx, legacyProjectId)
716
+ );
717
+ if (primary) {
718
+ return await buildTopicScope(ctx, primary, "project_mapped_topic", {
719
+ fallbackProjectId: legacyProjectId
720
+ });
721
+ }
722
+ const nodeScope = await resolveTopicNodeScopeOrNull(ctx, legacyProjectId);
723
+ if (nodeScope) {
724
+ return {
725
+ ...nodeScope,
726
+ projectId: nodeScope.projectId ?? legacyProjectId
727
+ };
728
+ }
729
+ throw new Error(
730
+ `Legacy project scope ${legacyProjectId} has no mapped topic.`
731
+ );
732
+ }
733
+ async function resolveDirectLegacyProjectTopic(ctx, legacyProjectId) {
734
+ const directTopic = await tryReadTopicDoc(ctx, legacyProjectId, {
735
+ failureLog: "[topicScope] Failed to load direct project topic",
736
+ idLogKey: "projectId"
737
+ });
738
+ return directTopic ?? tryResolveHostTopicByLegacyScope(ctx, legacyProjectId);
739
+ }
740
+ async function tryReadTopicDoc(ctx, id, log) {
741
+ try {
742
+ return await ctx.db.get(id);
743
+ } catch (error) {
744
+ debugGraphPrimitiveFallback(log.failureLog, {
745
+ error,
746
+ [log.idLogKey]: id
747
+ });
748
+ return null;
749
+ }
750
+ }
751
+ async function buildTopicScope(ctx, topic, source, options = {}) {
752
+ const inherited = await resolveInheritedWorkspaceScope(ctx, topic);
753
+ const mapped = asMappedProjectId(topic);
754
+ return {
755
+ topicId: topic._id,
756
+ ...mapped || options.fallbackProjectId ? { projectId: mapped ?? options.fallbackProjectId } : {},
757
+ tenantId: inherited.tenantId,
758
+ workspaceId: inherited.workspaceId,
759
+ source
760
+ };
761
+ }
736
762
  var optionalScopeArgs = {
737
763
  projectId: v.optional(v.string()),
738
764
  topicId: v.optional(v.string())
@@ -767,8 +793,6 @@ function nodeMatchesWorkspaceReasoningScope(node, scope) {
767
793
  }
768
794
  return scopeWorkspaceId === nodeWorkspaceId;
769
795
  }
770
-
771
- // src/epistemicBeliefs.helpers.ts
772
796
  var insightIdUnion = v.id("epistemicNodes");
773
797
  var DEFAULT_PROJECT_BELIEF_LIMIT = 250;
774
798
  var MAX_PROJECT_BELIEF_LIMIT = 1e3;
@@ -777,29 +801,120 @@ var DEFAULT_CONFIDENCE_POLICY = {
777
801
  scoringMode: "after_worktree",
778
802
  tupleContradiction: normalizeTupleContradictionPolicy()
779
803
  };
780
- function throwStructuredMutationError(args) {
781
- const data = {
782
- structuredMutationError: true,
783
- message: args.message,
784
- status: args.status,
785
- code: args.code,
786
- invariantCode: args.invariantCode,
787
- suggestion: args.suggestion,
788
- details: args.details
789
- };
790
- const error = new ConvexError(
791
- data
792
- );
793
- error.status = args.status;
794
- error.code = args.code;
795
- error.invariantCode = args.invariantCode;
796
- error.suggestion = args.suggestion;
797
- error.details = args.details;
798
- throw error;
799
- }
800
804
  function readFiniteNumber(value) {
801
805
  return typeof value === "number" && Number.isFinite(value) ? value : void 0;
802
806
  }
807
+ function isRecord(value) {
808
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
809
+ }
810
+ function readOptionalString(value) {
811
+ return typeof value === "string" && value.trim().length > 0 ? value : void 0;
812
+ }
813
+ function readStringArray2(value) {
814
+ if (!Array.isArray(value)) {
815
+ return;
816
+ }
817
+ const strings = value.filter(
818
+ (item) => typeof item === "string" && item.length > 0
819
+ );
820
+ return strings.length === value.length ? strings : void 0;
821
+ }
822
+ function readRecord(value) {
823
+ return isRecord(value) ? value : void 0;
824
+ }
825
+ function readBeliefNodeView(value) {
826
+ if (!isRecord(value)) {
827
+ return null;
828
+ }
829
+ const id = readOptionalString(value._id);
830
+ const nodeType = readOptionalString(value.nodeType);
831
+ if (!(id && nodeType === "belief")) {
832
+ return null;
833
+ }
834
+ const node = {
835
+ _id: id,
836
+ nodeType
837
+ };
838
+ const creationTime = readFiniteNumber(value._creationTime);
839
+ if (creationTime !== void 0) {
840
+ node._creationTime = creationTime;
841
+ }
842
+ const metadata = readRecord(value.metadata);
843
+ if (metadata !== void 0) {
844
+ node.metadata = metadata;
845
+ }
846
+ const opinionA = readFiniteNumber(value.opinion_a);
847
+ if (opinionA !== void 0) {
848
+ node.opinion_a = opinionA;
849
+ }
850
+ const opinionB = readFiniteNumber(value.opinion_b);
851
+ if (opinionB !== void 0) {
852
+ node.opinion_b = opinionB;
853
+ }
854
+ const opinionD = readFiniteNumber(value.opinion_d);
855
+ if (opinionD !== void 0) {
856
+ node.opinion_d = opinionD;
857
+ }
858
+ const opinionU = readFiniteNumber(value.opinion_u);
859
+ if (opinionU !== void 0) {
860
+ node.opinion_u = opinionU;
861
+ }
862
+ const tupleContradicted = typeof value.tupleContradicted === "boolean" ? value.tupleContradicted : void 0;
863
+ if (tupleContradicted !== void 0) {
864
+ node.tupleContradicted = tupleContradicted;
865
+ }
866
+ const stringFields = {
867
+ anonymizationClass: value.anonymizationClass,
868
+ audienceLabel: value.audienceLabel,
869
+ canonicalText: value.canonicalText,
870
+ createdBy: value.createdBy,
871
+ epistemicLayer: value.epistemicLayer,
872
+ exportClass: value.exportClass,
873
+ globalId: value.globalId,
874
+ projectId: value.projectId,
875
+ publicationStatus: value.publicationStatus,
876
+ sensitivityTier: value.sensitivityTier,
877
+ status: value.status,
878
+ tenantId: value.tenantId,
879
+ topicId: value.topicId,
880
+ userId: value.userId,
881
+ workspaceId: value.workspaceId
882
+ };
883
+ for (const [field, fieldValue] of Object.entries(stringFields)) {
884
+ const normalized = readOptionalString(fieldValue);
885
+ if (normalized !== void 0) {
886
+ node[field] = normalized;
887
+ }
888
+ }
889
+ const createdAt = readFiniteNumber(value.createdAt);
890
+ if (createdAt !== void 0) {
891
+ node.createdAt = createdAt;
892
+ }
893
+ const updatedAt = readFiniteNumber(value.updatedAt);
894
+ if (updatedAt !== void 0) {
895
+ node.updatedAt = updatedAt;
896
+ }
897
+ if (value.beliefStatus !== void 0) {
898
+ node.beliefStatus = value.beliefStatus;
899
+ }
900
+ if (value.confidence !== void 0) {
901
+ node.confidence = value.confidence;
902
+ }
903
+ if (value.predictionMeta !== void 0) {
904
+ node.predictionMeta = value.predictionMeta;
905
+ }
906
+ const policyTags = readStringArray2(value.policyTags);
907
+ if (policyTags !== void 0) {
908
+ node.policyTags = policyTags;
909
+ }
910
+ return node;
911
+ }
912
+ function readBeliefNodeViews(values) {
913
+ return values.flatMap((value) => {
914
+ const node = readBeliefNodeView(value);
915
+ return node ? [node] : [];
916
+ });
917
+ }
803
918
  function clamp01(value) {
804
919
  return Math.max(0, Math.min(1, value));
805
920
  }
@@ -961,7 +1076,7 @@ function normalizePillar(pillar) {
961
1076
  async function markBeliefGraphDirty(ctx, scope) {
962
1077
  const projectId = typeof scope.projectId === "string" && scope.projectId.trim().length > 0 ? scope.projectId : void 0;
963
1078
  const topicId = typeof scope.topicId === "string" && scope.topicId.trim().length > 0 ? scope.topicId : void 0;
964
- if (!projectId && !topicId) {
1079
+ if (!(projectId || topicId)) {
965
1080
  return;
966
1081
  }
967
1082
  if (projectId) {
@@ -978,16 +1093,22 @@ async function markBeliefGraphDirty(ctx, scope) {
978
1093
  { topicId }
979
1094
  );
980
1095
  }
1096
+ const activityScopeId = topicId ?? projectId;
1097
+ if (!activityScopeId) {
1098
+ throw new Error(
1099
+ "Expected belief graph dirty scope to include a topic or project id."
1100
+ );
1101
+ }
981
1102
  await resolveGraphPrimitivesAppResolvers().patchProject(
982
1103
  ctx,
983
- topicId ?? projectId,
1104
+ activityScopeId,
984
1105
  {
985
1106
  lastActivityAt: Date.now()
986
1107
  }
987
1108
  );
988
1109
  }
989
1110
  async function resolveBeliefScopeOrNull(ctx, args) {
990
- if (!args.projectId && !args.topicId) {
1111
+ if (!(args.projectId || args.topicId)) {
991
1112
  return null;
992
1113
  }
993
1114
  try {
@@ -1012,14 +1133,17 @@ async function getBeliefNodesForScope(ctx, scope, args) {
1012
1133
  "by_topic_type",
1013
1134
  (q) => q.eq("topicId", scope.topicId).eq("nodeType", "belief")
1014
1135
  );
1015
- const nodes = typeof args?.scanLimit === "number" ? await baseQuery.order("desc").take(args.scanLimit) : await baseQuery.collect();
1136
+ const rows = typeof args?.scanLimit === "number" ? await baseQuery.order("desc").take(args.scanLimit) : await baseQuery.collect();
1137
+ const nodes = readBeliefNodeViews(rows);
1016
1138
  const scopedNodes = nodes.filter(
1017
1139
  (node) => nodeMatchesWorkspaceReasoningScope(node, scope)
1018
1140
  );
1019
1141
  if (!args?.status) {
1020
1142
  return scopedNodes;
1021
1143
  }
1022
- return scopedNodes.filter((node) => node.status === args.status);
1144
+ return scopedNodes.filter(
1145
+ (node) => node.status === args.status
1146
+ );
1023
1147
  }
1024
1148
  function createBeliefAudienceResolver(registryRows) {
1025
1149
  const audienceClassByKey = new Map(
@@ -1039,9 +1163,7 @@ function createBeliefAudienceResolver(registryRows) {
1039
1163
  function flattenBeliefNode(node) {
1040
1164
  const meta = node.metadata || {};
1041
1165
  const worktreeId = resolveBeliefWorktreeId(meta);
1042
- const tupleContradicted = readTupleContradictedFlag(
1043
- node.tupleContradicted
1044
- ) ?? readTupleContradictedFlag(meta.tupleContradicted) ?? false;
1166
+ const tupleContradicted = readTupleContradictedFlag(node.tupleContradicted) ?? readTupleContradictedFlag(meta.tupleContradicted) ?? false;
1045
1167
  return {
1046
1168
  _id: node._id,
1047
1169
  _epistemicNodeId: node._id,
@@ -1087,7 +1209,10 @@ function resolveBeliefStatus(node, metadata) {
1087
1209
  });
1088
1210
  }
1089
1211
  async function hasCompletedWorktreeForBelief(ctx, beliefNodeId) {
1090
- const clusterMembership = await ctx.db.query("worktreeBeliefCluster").withIndex("by_belief", (q) => q.eq("beliefId", beliefNodeId)).collect();
1212
+ const clusterMembership = await ctx.db.query("worktreeBeliefCluster").withIndex(
1213
+ "by_belief",
1214
+ (q) => q.eq("beliefId", beliefNodeId)
1215
+ ).collect();
1091
1216
  for (const membership of clusterMembership) {
1092
1217
  const worktree = await ctx.db.get(membership.worktreeId);
1093
1218
  if (worktree?.status === "completed" || worktree?.status === "merged") {
@@ -1098,7 +1223,10 @@ async function hasCompletedWorktreeForBelief(ctx, beliefNodeId) {
1098
1223
  }
1099
1224
  async function getActiveConfidencePolicy(ctx) {
1100
1225
  try {
1101
- const activeConfig = await ctx.db.query("logicSprintScoring").withIndex("by_active", (q) => q.eq("isActive", true)).first();
1226
+ const activeConfig = await ctx.db.query("logicSprintScoring").withIndex(
1227
+ "by_active",
1228
+ (q) => q.eq("isActive", true)
1229
+ ).first();
1102
1230
  return {
1103
1231
  scoringMode: activeConfig?.confidencePolicy === "always" ? "always" : DEFAULT_CONFIDENCE_POLICY.scoringMode,
1104
1232
  tupleContradiction: normalizeTupleContradictionPolicy(
@@ -1130,24 +1258,7 @@ async function requireAuthenticatedUserId(ctx) {
1130
1258
  }
1131
1259
  return userId;
1132
1260
  }
1133
- async function requireProjectWriteAccess(ctx, projectId, userId) {
1134
- const hasAccess = await checkProjectAccess(
1135
- ctx,
1136
- projectId,
1137
- userId
1138
- );
1139
- if (!hasAccess) {
1140
- throwStructuredMutationError({
1141
- message: `Project write access denied for topic ${projectId}.`,
1142
- status: 403,
1143
- code: "PROJECT_ACCESS_DENIED",
1144
- invariantCode: "policy.scope_required",
1145
- suggestion: "The acting principal lacks project-write access to this topic. Request a topic grant (or, if the principal created this topic, run the creator-grant backfill) and retry.",
1146
- details: { topicId: projectId, principalId: userId }
1147
- });
1148
- }
1149
- }
1150
1261
 
1151
- export { MAX_PROJECT_BELIEF_LIMIT, assertBaseRateInRange, buildBeliefConfidenceRow, buildBeliefEvidenceNotFoundResult, buildBeliefStatusSuccessResult, clampBeliefLimit, createBeliefAudienceResolver, deriveSyntheticBackfillOpinion, deriveTupleContradictionSeverity, flattenBeliefNode, formatTupleContradictionDescription, generateContentHash, getActiveConfidencePolicy, getBeliefNodesForScope, hasCompletedWorktreeForBelief, insightIdUnion, markBeliefGraphDirty, normalizePillar, optionalBeliefScopeArgs, readBeliefOpinionSnapshot, readFiniteNumber, readTupleContradictedFlag, requireAuthenticatedUserId, requireProjectWriteAccess, resolveBeliefScopeOrNull, resolveBeliefStatus, resolveBeliefWorktreeId, throwStructuredMutationError };
1262
+ export { MAX_PROJECT_BELIEF_LIMIT, assertBaseRateInRange, buildBeliefConfidenceRow, buildBeliefEvidenceNotFoundResult, buildBeliefStatusSuccessResult, clampBeliefLimit, createBeliefAudienceResolver, deriveSyntheticBackfillOpinion, deriveTupleContradictionSeverity, flattenBeliefNode, formatTupleContradictionDescription, generateContentHash, getActiveConfidencePolicy, getBeliefNodesForScope, hasCompletedWorktreeForBelief, insightIdUnion, markBeliefGraphDirty, normalizePillar, optionalBeliefScopeArgs, readBeliefNodeView, readBeliefOpinionSnapshot, readFiniteNumber, readTupleContradictedFlag, requireAuthenticatedUserId, resolveBeliefScopeOrNull, resolveBeliefStatus, resolveBeliefWorktreeId };
1152
1263
  //# sourceMappingURL=epistemicBeliefs.helpers.js.map
1153
1264
  //# sourceMappingURL=epistemicBeliefs.helpers.js.map