@lucern/graph-primitives 1.0.29 → 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 +395 -225
  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 +854 -480
  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 +365 -166
  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 -289
  80. package/dist/epistemicBeliefs.backfills.js.map +1 -1
  81. package/dist/epistemicBeliefs.confidence.d.ts +19 -15
  82. package/dist/epistemicBeliefs.confidence.js +633 -386
  83. package/dist/epistemicBeliefs.confidence.js.map +1 -1
  84. package/dist/epistemicBeliefs.core.d.ts +6 -6
  85. package/dist/epistemicBeliefs.core.js +717 -371
  86. package/dist/epistemicBeliefs.core.js.map +1 -1
  87. package/dist/epistemicBeliefs.d.ts +11 -9
  88. package/dist/epistemicBeliefs.forkEvidence.d.ts +2 -0
  89. package/dist/epistemicBeliefs.forkEvidence.js +8 -8
  90. package/dist/epistemicBeliefs.forkEvidence.js.map +1 -1
  91. package/dist/epistemicBeliefs.helpers.d.ts +68 -49
  92. package/dist/epistemicBeliefs.helpers.js +358 -211
  93. package/dist/epistemicBeliefs.helpers.js.map +1 -1
  94. package/dist/epistemicBeliefs.internal.d.ts +5 -5
  95. package/dist/epistemicBeliefs.internal.js +1248 -1026
  96. package/dist/epistemicBeliefs.internal.js.map +1 -1
  97. package/dist/epistemicBeliefs.js +4942 -3590
  98. package/dist/epistemicBeliefs.js.map +1 -1
  99. package/dist/epistemicBeliefs.lifecycle.d.ts +5 -5
  100. package/dist/epistemicBeliefs.lifecycle.js +1138 -781
  101. package/dist/epistemicBeliefs.lifecycle.js.map +1 -1
  102. package/dist/epistemicBeliefs.links.d.ts +7 -7
  103. package/dist/epistemicBeliefs.links.js +404 -267
  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 +1062 -576
  114. package/dist/epistemicContracts.evaluators.js.map +1 -1
  115. package/dist/epistemicContracts.handlers.d.ts +15 -32
  116. package/dist/epistemicContracts.handlers.js +1829 -1351
  117. package/dist/epistemicContracts.handlers.js.map +1 -1
  118. package/dist/epistemicContracts.js +1131 -636
  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 +1966 -1202
  136. package/dist/epistemicEdges.js.map +1 -1
  137. package/dist/epistemicEdges.mutations.d.ts +7 -7
  138. package/dist/epistemicEdges.mutations.js +956 -579
  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 +933 -532
  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 +840 -692
  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 +700 -504
  180. package/dist/epistemicNodes.js.map +1 -1
  181. package/dist/epistemicNodes.mutations.d.ts +6 -6
  182. package/dist/epistemicNodes.mutations.js +560 -463
  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 +351 -311
  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 +86 -83
  245. package/dist/index.js +16914 -11760
  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,17 +1,21 @@
1
- import { v } from 'convex/values';
2
- import { normalizeTupleContradictionPolicy, confidenceFromSL, readOpinionFromRecord, mkOpinion } from '@lucern/confidence';
3
1
  import { checkScopeAccess } from '@lucern/access-control/access';
2
+ import { normalizeTupleContradictionPolicy, readOpinionFromRecord, mkOpinion, confidenceFromSL } from '@lucern/confidence';
4
3
  import { permissiveReturn } from '@lucern/contracts/schema-helpers/validators';
5
- import { componentsGeneric, anyApi, queryGeneric, internalMutationGeneric, mutationGeneric } from 'convex/server';
6
- import { throwStructuredMutationError } from '@lucern/access-control/structuredMutationError';
4
+ import { v } from 'convex/values';
5
+ import { unsafeConvexAnyApi } from '@lucern/contracts/convex/unsafeAnyApi';
6
+ import { componentsGeneric, queryGeneric, internalMutationGeneric, mutationGeneric } from 'convex/server';
7
7
  import '@lucern/access-control/audience';
8
8
  import '@lucern/access-control/auth';
9
+ import { throwStructuredMutationError } from '@lucern/access-control/structuredMutationError';
9
10
  import '@lucern/contracts/schema-helpers/spine/tables/epistemicNodes';
10
11
 
11
12
  // src/epistemicBeliefs.backfills.ts
12
- var api = anyApi;
13
+ var unsafeApi = unsafeConvexAnyApi(
14
+ "graph-primitives top-level module bundle lacks a committed Convex _generated/api surface"
15
+ );
16
+ var api = unsafeApi;
13
17
  componentsGeneric();
14
- var internal = anyApi;
18
+ var internal = unsafeApi;
15
19
  var internalMutation = internalMutationGeneric;
16
20
  var mutation = mutationGeneric;
17
21
  var query = queryGeneric;
@@ -172,13 +176,15 @@ function asMappedProjectId(topic) {
172
176
  if (!topic) {
173
177
  return;
174
178
  }
175
- const directLegacyProjectId = normalizeScopeValue(topic[LEGACY_SCOPE_FIELD]);
179
+ const directLegacyProjectId = normalizeScopeValue(
180
+ topic[LEGACY_SCOPE_FIELD]
181
+ );
176
182
  if (directLegacyProjectId) {
177
183
  return directLegacyProjectId;
178
184
  }
179
185
  const metadata = topic.metadata || {};
180
186
  const candidate = metadata[LEGACY_SCOPE_FIELD] || metadata.legacyProjectId || metadata.projectId || metadata.scopeProjectId;
181
- return candidate ? candidate : void 0;
187
+ return typeof candidate === "string" ? normalizeScopeValue(candidate) : void 0;
182
188
  }
183
189
  function normalizeScopeValue(value) {
184
190
  if (typeof value !== "string") {
@@ -203,8 +209,9 @@ function pickPrimaryTopic(candidates) {
203
209
  })[0];
204
210
  }
205
211
  async function findTopicsByScopeAlias(ctx, scopeId) {
212
+ const query2 = ctx.db.query("topics");
206
213
  try {
207
- return await ctx.db.query("topics").withIndex(
214
+ return await query2.withIndex(
208
215
  "by_graph_scope_project",
209
216
  (q) => q.eq(LEGACY_SCOPE_FIELD, scopeId)
210
217
  ).collect();
@@ -216,7 +223,7 @@ async function findTopicsByScopeAlias(ctx, scopeId) {
216
223
  scopeId
217
224
  }
218
225
  );
219
- const topics = await ctx.db.query("topics").collect();
226
+ const topics = await query2.collect();
220
227
  return topics.filter((topic) => {
221
228
  const normalizedGlobalId = normalizeScopeValue(topic.globalId);
222
229
  const mappedProjectId = asMappedProjectId(topic);
@@ -224,20 +231,20 @@ async function findTopicsByScopeAlias(ctx, scopeId) {
224
231
  });
225
232
  }
226
233
  }
227
- async function tryResolveHostTopicById(ctx, topicId) {
234
+ async function tryResolveHostTopicById(ctx, topicId2) {
228
235
  if (typeof ctx.runQuery !== "function") {
229
236
  return null;
230
237
  }
231
238
  try {
232
239
  return await ctx.runQuery(api.topics.get, {
233
- id: topicId
240
+ id: topicId2
234
241
  }) ?? null;
235
242
  } catch (error) {
236
243
  debugGraphPrimitiveFallback(
237
244
  "[topicScope] Failed to resolve topic by host query",
238
245
  {
239
246
  error,
240
- topicId
247
+ topicId: topicId2
241
248
  }
242
249
  );
243
250
  return null;
@@ -272,137 +279,115 @@ async function resolveInheritedWorkspaceScope(ctx, topic) {
272
279
  let current = topic;
273
280
  for (let i = 0; i < MAX_DEPTH && current?.parentTopicId; i++) {
274
281
  current = await ctx.db.get(current.parentTopicId);
275
- if (!current) break;
282
+ if (!current) {
283
+ break;
284
+ }
276
285
  if (!tenantId) {
277
286
  tenantId = normalizeScopeValue(current.tenantId);
278
287
  }
279
288
  if (!workspaceId) {
280
289
  workspaceId = normalizeScopeValue(current.workspaceId);
281
290
  }
282
- if (tenantId && workspaceId) break;
291
+ if (tenantId && workspaceId) {
292
+ break;
293
+ }
283
294
  }
284
295
  return { tenantId, workspaceId };
285
296
  }
286
297
  async function resolveTopicProjectScope(ctx, args) {
287
298
  if (args.topicId) {
288
- let topic = null;
289
- try {
290
- topic = await ctx.db.get(
291
- args.topicId
292
- );
293
- } catch (error) {
294
- debugGraphPrimitiveFallback(
295
- "[topicScope] Failed to load topic by direct id",
296
- {
297
- error,
298
- topicId: args.topicId
299
- }
300
- );
301
- }
302
- if (!topic) {
303
- topic = await tryResolveHostTopicById(ctx, String(args.topicId));
304
- }
305
- if (!topic) {
306
- topic = pickPrimaryTopic(
307
- await findTopicsByScopeAlias(ctx, String(args.topicId))
308
- ) ?? null;
309
- }
310
- if (!topic) {
311
- const nodeScope = await resolveTopicNodeScopeOrNull(
312
- ctx,
313
- String(args.topicId)
314
- );
315
- if (nodeScope) {
316
- return nodeScope;
317
- }
318
- throw new Error(`Topic not found: ${String(args.topicId)}`);
319
- }
320
- const inherited = await resolveInheritedWorkspaceScope(ctx, topic);
321
- const mapped = asMappedProjectId(topic);
322
- if (mapped) {
323
- return {
324
- topicId: topic._id,
325
- projectId: mapped,
326
- tenantId: inherited.tenantId,
327
- workspaceId: inherited.workspaceId,
328
- source: "topic"
329
- };
330
- }
331
- return {
332
- topicId: topic._id,
333
- tenantId: inherited.tenantId,
334
- workspaceId: inherited.workspaceId,
335
- source: "topic"
336
- };
299
+ return await resolveScopeFromTopicId(ctx, args.topicId);
337
300
  }
338
301
  if (args.projectId) {
339
- let directTopic = null;
340
- try {
341
- directTopic = await ctx.db.get(
342
- args.projectId
343
- );
344
- } catch (error) {
345
- debugGraphPrimitiveFallback(
346
- "[topicScope] Failed to load direct project topic",
347
- {
348
- error,
349
- projectId: args.projectId
350
- }
351
- );
352
- }
353
- if (directTopic) {
354
- const inherited = await resolveInheritedWorkspaceScope(ctx, directTopic);
355
- const mapped = asMappedProjectId(directTopic);
356
- return {
357
- topicId: directTopic._id,
358
- projectId: mapped ?? args.projectId,
359
- tenantId: inherited.tenantId,
360
- workspaceId: inherited.workspaceId,
361
- source: "topic_inferred"
362
- };
363
- }
364
- directTopic = await tryResolveHostTopicByLegacyScope(ctx, args.projectId);
365
- if (directTopic) {
366
- const inherited = await resolveInheritedWorkspaceScope(ctx, directTopic);
367
- const mapped = asMappedProjectId(directTopic);
368
- return {
369
- topicId: directTopic._id,
370
- projectId: mapped ?? args.projectId,
371
- tenantId: inherited.tenantId,
372
- workspaceId: inherited.workspaceId,
373
- source: "topic_inferred"
374
- };
375
- }
376
- const topics = await findTopicsByScopeAlias(ctx, args.projectId);
377
- const primary = pickPrimaryTopic(topics);
378
- if (primary) {
379
- const inherited = await resolveInheritedWorkspaceScope(ctx, primary);
380
- return {
381
- topicId: primary._id,
382
- projectId: args.projectId,
383
- tenantId: inherited.tenantId,
384
- workspaceId: inherited.workspaceId,
385
- source: "project_mapped_topic"
386
- };
387
- }
388
- const nodeScope = await resolveTopicNodeScopeOrNull(
389
- ctx,
390
- String(args.projectId)
391
- );
392
- if (nodeScope) {
393
- return {
394
- ...nodeScope,
395
- projectId: nodeScope.projectId ?? String(args.projectId)
396
- };
397
- }
398
- throw new Error(
399
- `Legacy project scope ${String(args.projectId)} has no mapped topic.`
400
- );
302
+ return await resolveScopeFromLegacyProjectId(ctx, args.projectId);
401
303
  }
402
304
  throw new Error(
403
305
  "Missing scope: provide topicId (preferred) or legacy projectId alias."
404
306
  );
405
307
  }
308
+ async function resolveScopeFromTopicId(ctx, topicId2) {
309
+ const topic = await resolveTopicDocFromTopicId(ctx, topicId2);
310
+ if (topic) {
311
+ return await buildTopicScope(ctx, topic, "topic");
312
+ }
313
+ const nodeScope = await resolveTopicNodeScopeOrNull(ctx, String(topicId2));
314
+ if (nodeScope) {
315
+ return nodeScope;
316
+ }
317
+ throw new Error(`Topic not found: ${String(topicId2)}`);
318
+ }
319
+ async function resolveTopicDocFromTopicId(ctx, topicId2) {
320
+ const direct = await tryReadTopicDoc(ctx, topicId2, {
321
+ failureLog: "[topicScope] Failed to load topic by direct id",
322
+ idLogKey: "topicId"
323
+ });
324
+ if (direct) {
325
+ return direct;
326
+ }
327
+ const hostTopic = await tryResolveHostTopicById(ctx, String(topicId2));
328
+ if (hostTopic) {
329
+ return hostTopic;
330
+ }
331
+ return pickPrimaryTopic(await findTopicsByScopeAlias(ctx, String(topicId2))) ?? null;
332
+ }
333
+ async function resolveScopeFromLegacyProjectId(ctx, legacyProjectId) {
334
+ const directTopic = await resolveDirectLegacyProjectTopic(
335
+ ctx,
336
+ legacyProjectId
337
+ );
338
+ if (directTopic) {
339
+ return await buildTopicScope(ctx, directTopic, "topic_inferred", {
340
+ fallbackProjectId: legacyProjectId
341
+ });
342
+ }
343
+ const primary = pickPrimaryTopic(
344
+ await findTopicsByScopeAlias(ctx, legacyProjectId)
345
+ );
346
+ if (primary) {
347
+ return await buildTopicScope(ctx, primary, "project_mapped_topic", {
348
+ fallbackProjectId: legacyProjectId
349
+ });
350
+ }
351
+ const nodeScope = await resolveTopicNodeScopeOrNull(ctx, legacyProjectId);
352
+ if (nodeScope) {
353
+ return {
354
+ ...nodeScope,
355
+ projectId: nodeScope.projectId ?? legacyProjectId
356
+ };
357
+ }
358
+ throw new Error(
359
+ `Legacy project scope ${legacyProjectId} has no mapped topic.`
360
+ );
361
+ }
362
+ async function resolveDirectLegacyProjectTopic(ctx, legacyProjectId) {
363
+ const directTopic = await tryReadTopicDoc(ctx, legacyProjectId, {
364
+ failureLog: "[topicScope] Failed to load direct project topic",
365
+ idLogKey: "projectId"
366
+ });
367
+ return directTopic ?? tryResolveHostTopicByLegacyScope(ctx, legacyProjectId);
368
+ }
369
+ async function tryReadTopicDoc(ctx, id, log) {
370
+ try {
371
+ return await ctx.db.get(id);
372
+ } catch (error) {
373
+ debugGraphPrimitiveFallback(log.failureLog, {
374
+ error,
375
+ [log.idLogKey]: id
376
+ });
377
+ return null;
378
+ }
379
+ }
380
+ async function buildTopicScope(ctx, topic, source, options = {}) {
381
+ const inherited = await resolveInheritedWorkspaceScope(ctx, topic);
382
+ const mapped = asMappedProjectId(topic);
383
+ return {
384
+ topicId: topic._id,
385
+ ...mapped || options.fallbackProjectId ? { projectId: mapped ?? options.fallbackProjectId } : {},
386
+ tenantId: inherited.tenantId,
387
+ workspaceId: inherited.workspaceId,
388
+ source
389
+ };
390
+ }
406
391
  var optionalScopeArgs = {
407
392
  projectId: v.optional(v.string()),
408
393
  topicId: v.optional(v.string())
@@ -437,8 +422,6 @@ function nodeMatchesWorkspaceReasoningScope(node, scope) {
437
422
  }
438
423
  return scopeWorkspaceId === nodeWorkspaceId;
439
424
  }
440
-
441
- // src/epistemicBeliefs.helpers.ts
442
425
  v.id("epistemicNodes");
443
426
  var optionalBeliefScopeArgs = optionalScopeArgs;
444
427
  ({
@@ -447,6 +430,117 @@ var optionalBeliefScopeArgs = optionalScopeArgs;
447
430
  function readFiniteNumber(value) {
448
431
  return typeof value === "number" && Number.isFinite(value) ? value : void 0;
449
432
  }
433
+ function isRecord(value) {
434
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
435
+ }
436
+ function readOptionalString(value) {
437
+ return typeof value === "string" && value.trim().length > 0 ? value : void 0;
438
+ }
439
+ function readStringArray(value) {
440
+ if (!Array.isArray(value)) {
441
+ return;
442
+ }
443
+ const strings = value.filter(
444
+ (item) => typeof item === "string" && item.length > 0
445
+ );
446
+ return strings.length === value.length ? strings : void 0;
447
+ }
448
+ function readRecord(value) {
449
+ return isRecord(value) ? value : void 0;
450
+ }
451
+ function readBeliefNodeView(value) {
452
+ if (!isRecord(value)) {
453
+ return null;
454
+ }
455
+ const id = readOptionalString(value._id);
456
+ const nodeType = readOptionalString(value.nodeType);
457
+ if (!(id && nodeType === "belief")) {
458
+ return null;
459
+ }
460
+ const node = {
461
+ _id: id,
462
+ nodeType
463
+ };
464
+ const creationTime = readFiniteNumber(value._creationTime);
465
+ if (creationTime !== void 0) {
466
+ node._creationTime = creationTime;
467
+ }
468
+ const metadata = readRecord(value.metadata);
469
+ if (metadata !== void 0) {
470
+ node.metadata = metadata;
471
+ }
472
+ const opinionA = readFiniteNumber(value.opinion_a);
473
+ if (opinionA !== void 0) {
474
+ node.opinion_a = opinionA;
475
+ }
476
+ const opinionB = readFiniteNumber(value.opinion_b);
477
+ if (opinionB !== void 0) {
478
+ node.opinion_b = opinionB;
479
+ }
480
+ const opinionD = readFiniteNumber(value.opinion_d);
481
+ if (opinionD !== void 0) {
482
+ node.opinion_d = opinionD;
483
+ }
484
+ const opinionU = readFiniteNumber(value.opinion_u);
485
+ if (opinionU !== void 0) {
486
+ node.opinion_u = opinionU;
487
+ }
488
+ const tupleContradicted = typeof value.tupleContradicted === "boolean" ? value.tupleContradicted : void 0;
489
+ if (tupleContradicted !== void 0) {
490
+ node.tupleContradicted = tupleContradicted;
491
+ }
492
+ const stringFields = {
493
+ anonymizationClass: value.anonymizationClass,
494
+ audienceLabel: value.audienceLabel,
495
+ canonicalText: value.canonicalText,
496
+ createdBy: value.createdBy,
497
+ epistemicLayer: value.epistemicLayer,
498
+ exportClass: value.exportClass,
499
+ globalId: value.globalId,
500
+ projectId: value.projectId,
501
+ publicationStatus: value.publicationStatus,
502
+ sensitivityTier: value.sensitivityTier,
503
+ status: value.status,
504
+ tenantId: value.tenantId,
505
+ topicId: value.topicId,
506
+ userId: value.userId,
507
+ workspaceId: value.workspaceId
508
+ };
509
+ for (const [field, fieldValue] of Object.entries(stringFields)) {
510
+ const normalized = readOptionalString(fieldValue);
511
+ if (normalized !== void 0) {
512
+ node[field] = normalized;
513
+ }
514
+ }
515
+ const createdAt = readFiniteNumber(value.createdAt);
516
+ if (createdAt !== void 0) {
517
+ node.createdAt = createdAt;
518
+ }
519
+ const updatedAt = readFiniteNumber(value.updatedAt);
520
+ if (updatedAt !== void 0) {
521
+ node.updatedAt = updatedAt;
522
+ }
523
+ if (value.beliefStatus !== void 0) {
524
+ node.beliefStatus = value.beliefStatus;
525
+ }
526
+ if (value.confidence !== void 0) {
527
+ node.confidence = value.confidence;
528
+ }
529
+ if (value.predictionMeta !== void 0) {
530
+ node.predictionMeta = value.predictionMeta;
531
+ }
532
+ const policyTags = readStringArray(value.policyTags);
533
+ if (policyTags !== void 0) {
534
+ node.policyTags = policyTags;
535
+ }
536
+ return node;
537
+ }
538
+ function readBeliefNodeViews(values) {
539
+ return values.flatMap((value) => {
540
+ const node = readBeliefNodeView(value);
541
+ return node ? [node] : [];
542
+ });
543
+ }
450
544
  function clamp01(value) {
451
545
  return Math.max(0, Math.min(1, value));
452
546
  }
@@ -513,7 +607,7 @@ function deriveSyntheticBackfillOpinion(source) {
513
607
  return mkOpinion(confidence, 1 - confidence, 0, 0.5);
514
608
  }
515
609
  async function resolveBeliefScopeOrNull(ctx, args) {
516
- if (!args.projectId && !args.topicId) {
610
+ if (!(args.projectId || args.topicId)) {
517
611
  return null;
518
612
  }
519
613
  try {
@@ -538,7 +632,8 @@ async function getBeliefNodesForScope(ctx, scope, args) {
538
632
  "by_topic_type",
539
633
  (q) => q.eq("topicId", scope.topicId).eq("nodeType", "belief")
540
634
  );
541
- const nodes = await baseQuery.collect();
635
+ const rows = await baseQuery.collect();
636
+ const nodes = readBeliefNodeViews(rows);
542
637
  const scopedNodes = nodes.filter(
543
638
  (node) => nodeMatchesWorkspaceReasoningScope(node, scope)
544
639
  );
@@ -556,6 +651,340 @@ function resolveBeliefStatus(node, metadata) {
556
651
  }
557
652
 
558
653
  // src/epistemicBeliefs.backfills.ts
654
+ function epistemicNodeId(value) {
655
+ return value;
656
+ }
657
+ function topicId(value) {
658
+ return value;
659
+ }
660
+ function isRecord2(value) {
661
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
662
+ }
663
+ function readConvexId(value) {
664
+ return typeof value === "string" && value.trim().length > 0 ? value : void 0;
665
+ }
666
+ function readOptionalNumber(value) {
667
+ return readFiniteNumber(value);
668
+ }
669
+ function readOptionalString2(value) {
670
+ return typeof value === "string" && value.trim().length > 0 ? value : void 0;
671
+ }
672
+ function readRecord2(value) {
673
+ if (value === null) {
674
+ return null;
675
+ }
676
+ return isRecord2(value) ? value : void 0;
677
+ }
678
+ function readEpistemicNodeBackfillRow(value) {
679
+ if (!isRecord2(value)) {
680
+ return null;
681
+ }
682
+ const id = readConvexId(value._id);
683
+ if (!id) {
684
+ return null;
685
+ }
686
+ const row = { ...value, _id: id };
687
+ const canonicalText = readOptionalString2(value.canonicalText);
688
+ const createdAt = readOptionalNumber(value.createdAt);
689
+ const confidence = readOptionalNumber(value.confidence);
690
+ const globalId = readOptionalString2(value.globalId);
691
+ const metadata = readRecord2(value.metadata);
692
+ const nodeType = readOptionalString2(value.nodeType);
693
+ const projectId = readOptionalString2(value.projectId);
694
+ const status = readOptionalString2(value.status);
695
+ const title = readOptionalString2(value.title);
696
+ const topicIdValue = readOptionalString2(value.topicId);
697
+ const updatedAt = readOptionalNumber(value.updatedAt);
698
+ if (canonicalText !== void 0) {
699
+ row.canonicalText = canonicalText;
700
+ }
701
+ if (createdAt !== void 0) {
702
+ row.createdAt = createdAt;
703
+ }
704
+ if (confidence !== void 0) {
705
+ row.confidence = confidence;
706
+ }
707
+ if (globalId !== void 0) {
708
+ row.globalId = globalId;
709
+ }
710
+ if (metadata !== void 0) {
711
+ row.metadata = metadata;
712
+ }
713
+ if (nodeType !== void 0) {
714
+ row.nodeType = nodeType;
715
+ }
716
+ if (projectId !== void 0) {
717
+ row.projectId = projectId;
718
+ }
719
+ if (status !== void 0) {
720
+ row.status = status;
721
+ }
722
+ if (title !== void 0) {
723
+ row.title = title;
724
+ }
725
+ if (topicIdValue !== void 0) {
726
+ row.topicId = topicIdValue;
727
+ }
728
+ if (updatedAt !== void 0) {
729
+ row.updatedAt = updatedAt;
730
+ }
731
+ return row;
732
+ }
733
+ function readBeliefConfidenceBackfillRow(value) {
734
+ if (!isRecord2(value)) {
735
+ return null;
736
+ }
737
+ const id = readConvexId(value._id);
738
+ const assessedAt = readOptionalNumber(value.assessedAt);
739
+ const assessedBy = readOptionalString2(value.assessedBy);
740
+ const beliefId = readOptionalString2(value.beliefId);
741
+ const confidence = readOptionalNumber(value.confidence);
742
+ const trigger = readOptionalString2(value.trigger);
743
+ if (!(id && assessedAt !== void 0 && assessedBy && beliefId && trigger)) {
744
+ return null;
745
+ }
746
+ const row = {
747
+ ...value,
748
+ _id: id,
749
+ assessedAt,
750
+ assessedBy,
751
+ beliefId,
752
+ confidence: confidence ?? 0.5,
753
+ trigger
754
+ };
755
+ const baseRate = readOptionalNumber(value.baseRate);
756
+ const belief = readOptionalNumber(value.belief);
757
+ const certainty = readOptionalNumber(value.certainty);
758
+ const disbelief = readOptionalNumber(value.disbelief);
759
+ const uncertainty = readOptionalNumber(value.uncertainty);
760
+ const valence = readOptionalNumber(value.valence);
761
+ if (baseRate !== void 0) {
762
+ row.baseRate = baseRate;
763
+ }
764
+ if (belief !== void 0) {
765
+ row.belief = belief;
766
+ }
767
+ if (certainty !== void 0) {
768
+ row.certainty = certainty;
769
+ }
770
+ if (disbelief !== void 0) {
771
+ row.disbelief = disbelief;
772
+ }
773
+ if (uncertainty !== void 0) {
774
+ row.uncertainty = uncertainty;
775
+ }
776
+ if (valence !== void 0) {
777
+ row.valence = valence;
778
+ }
779
+ return row;
780
+ }
781
+ function readEpistemicEdgeBackfillRow(value) {
782
+ if (!isRecord2(value)) {
783
+ return null;
784
+ }
785
+ const id = readConvexId(value._id);
786
+ if (!id) {
787
+ return null;
788
+ }
789
+ const row = { ...value, _id: id };
790
+ const fromNodeId = readOptionalString2(value.fromNodeId);
791
+ const globalId = readOptionalString2(value.globalId);
792
+ const toNodeId = readOptionalString2(value.toNodeId);
793
+ if (fromNodeId !== void 0) {
794
+ row.fromNodeId = fromNodeId;
795
+ }
796
+ if (globalId !== void 0) {
797
+ row.globalId = globalId;
798
+ }
799
+ if (toNodeId !== void 0) {
800
+ row.toNodeId = toNodeId;
801
+ }
802
+ return row;
803
+ }
804
+ function readRowList(values, reader) {
805
+ return values.flatMap((value) => {
806
+ const row = reader(value);
807
+ return row ? [row] : [];
808
+ });
809
+ }
810
+ function hasLegacyOpinionSnapshot(node) {
811
+ return readFiniteNumber(node.opinion_b) !== void 0 || readFiniteNumber(node.opinion_d) !== void 0 || readFiniteNumber(node.opinion_u) !== void 0 || readFiniteNumber(node.opinion_a) !== void 0 || readFiniteNumber(node.confidence) !== void 0;
812
+ }
813
+ function buildSubjectiveOpinionPatch(node, defaultBaseRate) {
814
+ return {
815
+ belief: readFiniteNumber(node.opinion_b) ?? 0,
816
+ disbelief: readFiniteNumber(node.opinion_d) ?? 0,
817
+ uncertainty: readFiniteNumber(node.opinion_u) ?? 1,
818
+ baseRate: readFiniteNumber(node.opinion_a) ?? defaultBaseRate
819
+ };
820
+ }
821
+ function needsSubjectiveOpinionPatch(node) {
822
+ return readFiniteNumber(node.opinion_b) === void 0 || readFiniteNumber(node.opinion_d) === void 0 || readFiniteNumber(node.opinion_u) === void 0 || readFiniteNumber(node.opinion_a) === void 0;
823
+ }
824
+ function buildSubjectiveOpinionNodePatch(opinion) {
825
+ return {
826
+ opinion_b: opinion.belief,
827
+ opinion_d: opinion.disbelief,
828
+ opinion_u: opinion.uncertainty,
829
+ opinion_a: opinion.baseRate,
830
+ updatedAt: Date.now()
831
+ };
832
+ }
833
+ function buildBaseRateHistoryPatch(row, defaultBaseRate) {
834
+ const belief = readFiniteNumber(row.belief) ?? 0;
835
+ const disbelief = readFiniteNumber(row.disbelief) ?? 0;
836
+ const uncertainty = readFiniteNumber(row.uncertainty) ?? 1;
837
+ return {
838
+ baseRate: defaultBaseRate,
839
+ confidence: confidenceFromSL(
840
+ belief,
841
+ disbelief,
842
+ uncertainty,
843
+ defaultBaseRate
844
+ )
845
+ };
846
+ }
847
+ function buildMandatoryPriorAuditRow(args) {
848
+ return {
849
+ entityType: "belief",
850
+ entityId: args.beliefId,
851
+ changeType: "updated",
852
+ changedAt: Date.now(),
853
+ changedBy: "system:lkc-2-prior-backfill",
854
+ isAgent: false,
855
+ previousState: null,
856
+ newState: {
857
+ baseRateBackfilled: true,
858
+ baseRate: args.defaultBaseRate,
859
+ patchedNodeOpinion: args.needsNodePatch,
860
+ patchedHistoryRows: args.rowsMissingBaseRate,
861
+ insertedInitialOpinion: args.insertedInitialRow
862
+ },
863
+ projectId: args.node.projectId,
864
+ topicId: args.node.topicId
865
+ };
866
+ }
867
+ async function backfillMandatoryPriorNode(ctx, args) {
868
+ const beliefId = String(args.node._id);
869
+ const patchedOpinion = buildSubjectiveOpinionPatch(
870
+ args.node,
871
+ args.defaultBaseRate
872
+ );
873
+ const needsNodePatch = needsSubjectiveOpinionPatch(args.node);
874
+ const rowsMissingBaseRate = args.history.filter(
875
+ (row) => readFiniteNumber(row.baseRate) === void 0
876
+ );
877
+ const needsInitialRow = args.history.length === 0;
878
+ if (!needsNodePatch && rowsMissingBaseRate.length === 0 && !needsInitialRow) {
879
+ return {
880
+ auditEntries: 0,
881
+ insertedInitialRows: 0,
882
+ patchedHistoryRows: 0,
883
+ patchedNodes: 0,
884
+ touched: false
885
+ };
886
+ }
887
+ if (needsNodePatch) {
888
+ await ctx.db.patch(
889
+ args.node._id,
890
+ buildSubjectiveOpinionNodePatch(patchedOpinion)
891
+ );
892
+ }
893
+ for (const row of rowsMissingBaseRate) {
894
+ await ctx.db.patch(
895
+ row._id,
896
+ buildBaseRateHistoryPatch(row, args.defaultBaseRate)
897
+ );
898
+ }
899
+ if (needsInitialRow) {
900
+ await ctx.db.insert(
901
+ "beliefConfidence",
902
+ buildBeliefConfidenceRow({
903
+ beliefId: args.node._id,
904
+ belief: patchedOpinion.belief,
905
+ disbelief: patchedOpinion.disbelief,
906
+ uncertainty: patchedOpinion.uncertainty,
907
+ baseRate: patchedOpinion.baseRate,
908
+ trigger: "initial",
909
+ rationale: "LKC-2 backfill: inserted missing initial vacuous opinion with neutral prior.",
910
+ assessedAt: readFiniteNumber(args.node.createdAt) ?? readFiniteNumber(args.node.updatedAt) ?? Date.now(),
911
+ assessedBy: "system:lkc-2-prior-backfill",
912
+ slOperator: "prior_seed"
913
+ })
914
+ );
915
+ }
916
+ await ctx.db.insert(
917
+ "epistemicAudit",
918
+ buildMandatoryPriorAuditRow({
919
+ beliefId,
920
+ defaultBaseRate: args.defaultBaseRate,
921
+ insertedInitialRow: needsInitialRow,
922
+ needsNodePatch,
923
+ node: args.node,
924
+ rowsMissingBaseRate: rowsMissingBaseRate.length
925
+ })
926
+ );
927
+ return {
928
+ auditEntries: 1,
929
+ insertedInitialRows: needsInitialRow ? 1 : 0,
930
+ patchedHistoryRows: rowsMissingBaseRate.length,
931
+ patchedNodes: needsNodePatch ? 1 : 0,
932
+ touched: true
933
+ };
934
+ }
935
+ async function collectConnectedNodeIds(ctx, beliefId) {
936
+ const [rawOutbound, rawInbound] = await Promise.all([
937
+ ctx.db.query("epistemicEdges").withIndex("by_from", (q) => q.eq("fromNodeId", beliefId)).collect(),
938
+ ctx.db.query("epistemicEdges").withIndex("by_to", (q) => q.eq("toNodeId", beliefId)).collect()
939
+ ]);
940
+ const outbound = readRowList(rawOutbound, readEpistemicEdgeBackfillRow);
941
+ const inbound = readRowList(rawInbound, readEpistemicEdgeBackfillRow);
942
+ const connectedNodeIds = /* @__PURE__ */ new Set();
943
+ for (const edge of outbound) {
944
+ if (edge.toNodeId) {
945
+ connectedNodeIds.add(String(edge.toNodeId));
946
+ }
947
+ }
948
+ for (const edge of inbound) {
949
+ if (edge.fromNodeId) {
950
+ connectedNodeIds.add(String(edge.fromNodeId));
951
+ }
952
+ }
953
+ return connectedNodeIds;
954
+ }
955
+ async function reassignConnectedBeliefNeighbors(ctx, args) {
956
+ let connectedReassigned = 0;
957
+ for (const connectedId of args.connectedNodeIds) {
958
+ if (args.movedBeliefIds.has(connectedId) || args.alreadyReassigned.has(connectedId)) {
959
+ continue;
960
+ }
961
+ try {
962
+ const connectedNode = readEpistemicNodeBackfillRow(
963
+ await ctx.db.get(epistemicNodeId(connectedId))
964
+ );
965
+ if (connectedNode?.status !== "active") {
966
+ continue;
967
+ }
968
+ if (connectedNode.topicId && String(connectedNode.topicId) !== String(args.targetTopicId)) {
969
+ await ctx.db.patch(epistemicNodeId(connectedId), {
970
+ topicId: args.targetTopicId,
971
+ updatedAt: args.now
972
+ });
973
+ args.alreadyReassigned.add(connectedId);
974
+ connectedReassigned++;
975
+ }
976
+ } catch (error) {
977
+ debugGraphPrimitiveFallback(
978
+ "[epistemicBeliefs] Failed to reassign connected node",
979
+ {
980
+ error,
981
+ connectedId
982
+ }
983
+ );
984
+ }
985
+ }
986
+ return connectedReassigned;
987
+ }
559
988
  var getRecentConfidenceChanges = query({
560
989
  args: {
561
990
  ...optionalBeliefScopeArgs,
@@ -571,27 +1000,33 @@ var getRecentConfidenceChanges = query({
571
1000
  return [];
572
1001
  }
573
1002
  const scopeId = scope.topicId ? String(scope.topicId) : scope.projectId;
574
- if (!scopeId || !await checkScopeAccess(ctx, scopeId, args.userId)) {
1003
+ if (!(scopeId && await checkScopeAccess(ctx, scopeId, args.userId))) {
575
1004
  return [];
576
1005
  }
577
- const projectBeliefs = await getBeliefNodesForScope(ctx, scope);
1006
+ const projectBeliefs = readRowList(
1007
+ await getBeliefNodesForScope(ctx, scope),
1008
+ readEpistemicNodeBackfillRow
1009
+ );
578
1010
  if (projectBeliefs.length === 0) {
579
1011
  return [];
580
1012
  }
581
1013
  const beliefMap = /* @__PURE__ */ new Map();
582
1014
  for (const belief of projectBeliefs) {
583
1015
  const info = {
584
- id: belief._id,
1016
+ id: String(belief._id),
585
1017
  title: belief.canonicalText || belief.title || "Untitled belief",
586
1018
  currentConfidence: belief.confidence ?? 0.5
587
1019
  };
588
- beliefMap.set(belief._id, info);
1020
+ beliefMap.set(String(belief._id), info);
589
1021
  }
590
- const recentConfidence = await ctx.db.query("beliefConfidence").order("desc").filter((q) => q.gt(q.field("assessedAt"), sevenDaysAgo)).take(200);
1022
+ const recentConfidence = readRowList(
1023
+ await ctx.db.query("beliefConfidence").order("desc").filter((q) => q.gt(q.field("assessedAt"), sevenDaysAgo)).take(200),
1024
+ readBeliefConfidenceBackfillRow
1025
+ );
591
1026
  const changes = [];
592
1027
  const seenBeliefs = /* @__PURE__ */ new Set();
593
1028
  for (const entry of recentConfidence) {
594
- const beliefInfo = beliefMap.get(entry.beliefId);
1029
+ const beliefInfo = beliefMap.get(String(entry.beliefId));
595
1030
  if (!beliefInfo) {
596
1031
  continue;
597
1032
  }
@@ -599,7 +1034,10 @@ var getRecentConfidenceChanges = query({
599
1034
  continue;
600
1035
  }
601
1036
  seenBeliefs.add(beliefInfo.id);
602
- const previousEntries = await ctx.db.query("beliefConfidence").withIndex("by_beliefId", (q) => q.eq("beliefId", entry.beliefId)).order("desc").filter((q) => q.lt(q.field("assessedAt"), entry.assessedAt)).take(1);
1037
+ const previousEntries = readRowList(
1038
+ await ctx.db.query("beliefConfidence").withIndex("by_beliefId", (q) => q.eq("beliefId", entry.beliefId)).order("desc").filter((q) => q.lt(q.field("assessedAt"), entry.assessedAt)).take(1),
1039
+ readBeliefConfidenceBackfillRow
1040
+ );
603
1041
  const previousConfidence = previousEntries[0]?.confidence ?? 0.5;
604
1042
  const delta = entry.confidence - previousConfidence;
605
1043
  if (Math.abs(delta) < 0.05) {
@@ -627,10 +1065,14 @@ var backfillSyntheticOpinionHistory = internalMutation({
627
1065
  returns: permissiveReturn,
628
1066
  handler: async (ctx, args) => {
629
1067
  const limit = Math.max(1, Math.min(args.limit ?? 100, 100));
630
- const [beliefNodes, existingHistory] = await Promise.all([
631
- ctx.db.query("epistemicNodes").withIndex("by_nodeType", (q) => q.eq("nodeType", "belief")).collect(),
632
- ctx.db.query("beliefConfidence").collect()
633
- ]);
1068
+ const beliefNodes = readRowList(
1069
+ await ctx.db.query("epistemicNodes").withIndex("by_nodeType", (q) => q.eq("nodeType", "belief")).collect(),
1070
+ readEpistemicNodeBackfillRow
1071
+ );
1072
+ const existingHistory = readRowList(
1073
+ await ctx.db.query("beliefConfidence").collect(),
1074
+ readBeliefConfidenceBackfillRow
1075
+ );
634
1076
  const beliefsWithHistory = new Set(
635
1077
  existingHistory.map((entry) => String(entry.beliefId))
636
1078
  );
@@ -641,8 +1083,7 @@ var backfillSyntheticOpinionHistory = internalMutation({
641
1083
  if (inserted >= limit) {
642
1084
  break;
643
1085
  }
644
- const hasOpinionSnapshot = readFiniteNumber(node.opinion_b) !== void 0 || readFiniteNumber(node.opinion_d) !== void 0 || readFiniteNumber(node.opinion_u) !== void 0 || readFiniteNumber(node.opinion_a) !== void 0 || readFiniteNumber(node.confidence) !== void 0;
645
- if (!hasOpinionSnapshot) {
1086
+ if (!hasLegacyOpinionSnapshot(node)) {
646
1087
  skippedNoOpinion++;
647
1088
  continue;
648
1089
  }
@@ -650,9 +1091,7 @@ var backfillSyntheticOpinionHistory = internalMutation({
650
1091
  skippedHasHistory++;
651
1092
  continue;
652
1093
  }
653
- const opinion = deriveSyntheticBackfillOpinion(
654
- node
655
- );
1094
+ const opinion = deriveSyntheticBackfillOpinion(node);
656
1095
  await ctx.db.insert(
657
1096
  "beliefConfidence",
658
1097
  buildBeliefConfidenceRow({
@@ -671,10 +1110,9 @@ var backfillSyntheticOpinionHistory = internalMutation({
671
1110
  beliefsWithHistory.add(String(node._id));
672
1111
  inserted++;
673
1112
  }
674
- const remainingCandidates = beliefNodes.filter((node) => {
675
- const hasOpinionSnapshot = readFiniteNumber(node.opinion_b) !== void 0 || readFiniteNumber(node.opinion_d) !== void 0 || readFiniteNumber(node.opinion_u) !== void 0 || readFiniteNumber(node.opinion_a) !== void 0 || readFiniteNumber(node.confidence) !== void 0;
676
- return hasOpinionSnapshot && !beliefsWithHistory.has(String(node._id));
677
- }).length;
1113
+ const remainingCandidates = beliefNodes.filter(
1114
+ (node) => hasLegacyOpinionSnapshot(node) && !beliefsWithHistory.has(String(node._id))
1115
+ ).length;
678
1116
  return {
679
1117
  scanned: beliefNodes.length,
680
1118
  inserted,
@@ -697,10 +1135,14 @@ var backfillMandatoryPriors = internalMutation({
697
1135
  args.defaultBaseRate ?? 0.5,
698
1136
  "defaultBaseRate"
699
1137
  );
700
- const [beliefNodes, historyRows] = await Promise.all([
701
- ctx.db.query("epistemicNodes").withIndex("by_nodeType", (q) => q.eq("nodeType", "belief")).collect(),
702
- ctx.db.query("beliefConfidence").collect()
703
- ]);
1138
+ const beliefNodes = readRowList(
1139
+ await ctx.db.query("epistemicNodes").withIndex("by_nodeType", (q) => q.eq("nodeType", "belief")).collect(),
1140
+ readEpistemicNodeBackfillRow
1141
+ );
1142
+ const historyRows = readRowList(
1143
+ await ctx.db.query("beliefConfidence").collect(),
1144
+ readBeliefConfidenceBackfillRow
1145
+ );
704
1146
  const historyByBeliefId = /* @__PURE__ */ new Map();
705
1147
  for (const row of historyRows) {
706
1148
  const beliefId = String(row.beliefId);
@@ -719,82 +1161,18 @@ var backfillMandatoryPriors = internalMutation({
719
1161
  }
720
1162
  const beliefId = String(node._id);
721
1163
  const history = historyByBeliefId.get(beliefId) ?? [];
722
- const patchedOpinion = {
723
- belief: readFiniteNumber(node.opinion_b) ?? 0,
724
- disbelief: readFiniteNumber(node.opinion_d) ?? 0,
725
- uncertainty: readFiniteNumber(node.opinion_u) ?? 1,
726
- baseRate: readFiniteNumber(node.opinion_a) ?? defaultBaseRate
727
- };
728
- const needsNodePatch = readFiniteNumber(node.opinion_b) === void 0 || readFiniteNumber(node.opinion_d) === void 0 || readFiniteNumber(node.opinion_u) === void 0 || readFiniteNumber(node.opinion_a) === void 0;
729
- const rowsMissingBaseRate = history.filter(
730
- (row) => readFiniteNumber(row.baseRate) === void 0
731
- );
732
- const needsInitialRow = history.length === 0;
733
- if (!needsNodePatch && rowsMissingBaseRate.length === 0 && !needsInitialRow) {
1164
+ const result = await backfillMandatoryPriorNode(ctx, {
1165
+ defaultBaseRate,
1166
+ history,
1167
+ node
1168
+ });
1169
+ if (!result.touched) {
734
1170
  continue;
735
1171
  }
736
- if (needsNodePatch) {
737
- await ctx.db.patch(node._id, {
738
- opinion_b: patchedOpinion.belief,
739
- opinion_d: patchedOpinion.disbelief,
740
- opinion_u: patchedOpinion.uncertainty,
741
- opinion_a: patchedOpinion.baseRate,
742
- updatedAt: Date.now()
743
- });
744
- patchedNodes++;
745
- }
746
- for (const row of rowsMissingBaseRate) {
747
- const belief = readFiniteNumber(row.belief) ?? 0;
748
- const disbelief = readFiniteNumber(row.disbelief) ?? 0;
749
- const uncertainty = readFiniteNumber(row.uncertainty) ?? 1;
750
- await ctx.db.patch(row._id, {
751
- baseRate: defaultBaseRate,
752
- confidence: confidenceFromSL(
753
- belief,
754
- disbelief,
755
- uncertainty,
756
- defaultBaseRate
757
- )
758
- });
759
- patchedHistoryRows++;
760
- }
761
- if (needsInitialRow) {
762
- await ctx.db.insert(
763
- "beliefConfidence",
764
- buildBeliefConfidenceRow({
765
- beliefId: node._id,
766
- belief: patchedOpinion.belief,
767
- disbelief: patchedOpinion.disbelief,
768
- uncertainty: patchedOpinion.uncertainty,
769
- baseRate: patchedOpinion.baseRate,
770
- trigger: "initial",
771
- rationale: "LKC-2 backfill: inserted missing initial vacuous opinion with neutral prior.",
772
- assessedAt: readFiniteNumber(node.createdAt) ?? readFiniteNumber(node.updatedAt) ?? Date.now(),
773
- assessedBy: "system:lkc-2-prior-backfill",
774
- slOperator: "prior_seed"
775
- })
776
- );
777
- insertedInitialRows++;
778
- }
779
- await ctx.db.insert("epistemicAudit", {
780
- entityType: "belief",
781
- entityId: beliefId,
782
- changeType: "updated",
783
- changedAt: Date.now(),
784
- changedBy: "system:lkc-2-prior-backfill",
785
- isAgent: false,
786
- previousState: null,
787
- newState: {
788
- baseRateBackfilled: true,
789
- baseRate: defaultBaseRate,
790
- patchedNodeOpinion: needsNodePatch,
791
- patchedHistoryRows: rowsMissingBaseRate.length,
792
- insertedInitialOpinion: needsInitialRow
793
- },
794
- projectId: node.projectId,
795
- topicId: typeof node.topicId === "string" ? node.topicId : void 0
796
- });
797
- auditEntries++;
1172
+ patchedNodes += result.patchedNodes;
1173
+ patchedHistoryRows += result.patchedHistoryRows;
1174
+ insertedInitialRows += result.insertedInitialRows;
1175
+ auditEntries += result.auditEntries;
798
1176
  touched++;
799
1177
  }
800
1178
  return {
@@ -814,7 +1192,10 @@ var backfillTwoAxisConfidence = internalMutation({
814
1192
  returns: permissiveReturn,
815
1193
  handler: async (ctx, args) => {
816
1194
  const dryRun = args.dryRun ?? false;
817
- const allConfRecords = await ctx.db.query("beliefConfidence").collect();
1195
+ const allConfRecords = readRowList(
1196
+ await ctx.db.query("beliefConfidence").collect(),
1197
+ readBeliefConfidenceBackfillRow
1198
+ );
818
1199
  let confUpdated = 0;
819
1200
  let confSkipped = 0;
820
1201
  for (const record of allConfRecords) {
@@ -830,11 +1211,14 @@ var backfillTwoAxisConfidence = internalMutation({
830
1211
  }
831
1212
  confUpdated++;
832
1213
  }
833
- const allBeliefNodes = await ctx.db.query("epistemicNodes").filter((q) => q.eq(q.field("nodeType"), "belief")).collect();
1214
+ const allBeliefNodes = readRowList(
1215
+ await ctx.db.query("epistemicNodes").filter((q) => q.eq(q.field("nodeType"), "belief")).collect(),
1216
+ readEpistemicNodeBackfillRow
1217
+ );
834
1218
  let nodesUpdated = 0;
835
1219
  let nodesSkipped = 0;
836
1220
  for (const node of allBeliefNodes) {
837
- const meta = node.metadata || {};
1221
+ const meta = node.metadata ?? {};
838
1222
  if (meta.valence !== void 0 && meta.certainty !== void 0) {
839
1223
  nodesSkipped++;
840
1224
  continue;
@@ -872,19 +1256,29 @@ var backfillScoredBeliefEdges = internalMutation({
872
1256
  returns: permissiveReturn,
873
1257
  handler: async (ctx, args) => {
874
1258
  const dryRun = args.dryRun ?? false;
875
- const allBeliefs = await ctx.db.query("epistemicNodes").withIndex(
876
- "by_topic",
877
- (q) => q.eq("topicId", args.topicId || args.projectId)
878
- ).filter((q) => q.eq(q.field("nodeType"), "belief")).collect();
1259
+ const scopeTopicId = args.topicId ?? args.projectId;
1260
+ if (!scopeTopicId) {
1261
+ return {
1262
+ dryRun,
1263
+ scoredBeliefs: 0,
1264
+ themeNodes: 0,
1265
+ edgesCreated: 0,
1266
+ edgesSkipped: 0
1267
+ };
1268
+ }
1269
+ const allBeliefs = readRowList(
1270
+ await ctx.db.query("epistemicNodes").withIndex("by_topic", (q) => q.eq("topicId", scopeTopicId)).filter((q) => q.eq(q.field("nodeType"), "belief")).collect(),
1271
+ readEpistemicNodeBackfillRow
1272
+ );
879
1273
  const scoredBeliefs = allBeliefs.filter((belief) => {
880
- const metadata = belief.metadata || {};
1274
+ const metadata = belief.metadata ?? {};
881
1275
  const lifecycle = resolveBeliefStatus(belief, metadata);
882
1276
  return lifecycle === "active" || lifecycle === "resolved_true";
883
1277
  });
884
- const themeNodes = await ctx.db.query("epistemicNodes").withIndex(
885
- "by_topic",
886
- (q) => q.eq("topicId", args.topicId || args.projectId)
887
- ).filter((q) => q.eq(q.field("nodeType"), "theme")).collect();
1278
+ const themeNodes = readRowList(
1279
+ await ctx.db.query("epistemicNodes").withIndex("by_topic", (q) => q.eq("topicId", scopeTopicId)).filter((q) => q.eq(q.field("nodeType"), "theme")).collect(),
1280
+ readEpistemicNodeBackfillRow
1281
+ );
888
1282
  let created = 0;
889
1283
  let skipped = 0;
890
1284
  for (const belief of scoredBeliefs) {
@@ -910,7 +1304,7 @@ var backfillScoredBeliefEdges = internalMutation({
910
1304
  edgeType: "relates_to_thesis",
911
1305
  weight: belief.confidence ?? 0.5,
912
1306
  createdBy: "backfill:scored_belief_theme",
913
- topicId: String(args.projectId),
1307
+ topicId: String(scopeTopicId),
914
1308
  fromNodeType: "belief",
915
1309
  toNodeType: "theme",
916
1310
  fromLayer: "L3",
@@ -935,16 +1329,14 @@ var backfillBeliefSprintIds = internalMutation({
935
1329
  dryRun: v.optional(v.boolean())
936
1330
  },
937
1331
  returns: permissiveReturn,
938
- handler: async (_ctx, _args) => {
939
- return {
940
- dryRun: true,
941
- message: "backfillBeliefSprintIds removed \u2014 sprints are D-tier legacy. Use worktrees.",
942
- sprintsScanned: 0,
943
- beliefsWithSprints: 0,
944
- updated: 0,
945
- skipped: 0
946
- };
947
- }
1332
+ handler: async (_ctx, _args) => ({
1333
+ dryRun: true,
1334
+ message: "backfillBeliefSprintIds removed \u2014 sprints are D-tier legacy. Use worktrees.",
1335
+ sprintsScanned: 0,
1336
+ beliefsWithSprints: 0,
1337
+ updated: 0,
1338
+ skipped: 0
1339
+ })
948
1340
  });
949
1341
  var getBeliefClusterPositions = query({
950
1342
  args: {
@@ -954,7 +1346,7 @@ var getBeliefClusterPositions = query({
954
1346
  returns: permissiveReturn,
955
1347
  handler: async (ctx, args) => {
956
1348
  const scope = await resolveBeliefScopeOrNull(ctx, args);
957
- if (!scope || !scope.projectId) {
1349
+ if (!scope?.projectId) {
958
1350
  return {
959
1351
  positions: {},
960
1352
  hasClusters: false,
@@ -1002,7 +1394,7 @@ var reassignBeliefsTopic = mutation({
1002
1394
  },
1003
1395
  returns: permissiveReturn,
1004
1396
  handler: async (ctx, args) => {
1005
- const targetTopic = await ctx.db.get(args.targetTopicId);
1397
+ const targetTopic = await ctx.db.get(topicId(args.targetTopicId));
1006
1398
  if (!targetTopic) {
1007
1399
  throw new Error(`Target topic not found: ${args.targetTopicId}`);
1008
1400
  }
@@ -1011,8 +1403,8 @@ var reassignBeliefsTopic = mutation({
1011
1403
  const now = Date.now();
1012
1404
  const movedBeliefIds = /* @__PURE__ */ new Set();
1013
1405
  for (const beliefNodeId of args.beliefNodeIds) {
1014
- const node = await ctx.db.get(beliefNodeId);
1015
- if (!node || node.nodeType !== "belief") {
1406
+ const node = readEpistemicNodeBackfillRow(await ctx.db.get(beliefNodeId));
1407
+ if (node?.nodeType !== "belief") {
1016
1408
  skipped++;
1017
1409
  continue;
1018
1410
  }
@@ -1026,40 +1418,14 @@ var reassignBeliefsTopic = mutation({
1026
1418
  let connectedReassigned = 0;
1027
1419
  const alreadyReassigned = /* @__PURE__ */ new Set();
1028
1420
  for (const beliefId of movedBeliefIds) {
1029
- const outbound = await ctx.db.query("epistemicEdges").withIndex("by_from", (q) => q.eq("fromNodeId", beliefId)).collect();
1030
- const inbound = await ctx.db.query("epistemicEdges").withIndex("by_to", (q) => q.eq("toNodeId", beliefId)).collect();
1031
- const connectedNodeIds = /* @__PURE__ */ new Set();
1032
- for (const edge of outbound) {
1033
- if (edge.toNodeId) connectedNodeIds.add(String(edge.toNodeId));
1034
- }
1035
- for (const edge of inbound) {
1036
- if (edge.fromNodeId) connectedNodeIds.add(String(edge.fromNodeId));
1037
- }
1038
- for (const connectedId of connectedNodeIds) {
1039
- if (movedBeliefIds.has(connectedId) || alreadyReassigned.has(connectedId)) {
1040
- continue;
1041
- }
1042
- try {
1043
- const connectedNode = await ctx.db.get(connectedId);
1044
- if (!connectedNode || connectedNode.status !== "active") continue;
1045
- if (connectedNode.topicId && String(connectedNode.topicId) !== String(args.targetTopicId)) {
1046
- await ctx.db.patch(connectedId, {
1047
- topicId: args.targetTopicId,
1048
- updatedAt: now
1049
- });
1050
- alreadyReassigned.add(connectedId);
1051
- connectedReassigned++;
1052
- }
1053
- } catch (error) {
1054
- debugGraphPrimitiveFallback(
1055
- "[epistemicBeliefs] Failed to reassign connected node",
1056
- {
1057
- error,
1058
- connectedId
1059
- }
1060
- );
1061
- }
1062
- }
1421
+ const connectedNodeIds = await collectConnectedNodeIds(ctx, beliefId);
1422
+ connectedReassigned += await reassignConnectedBeliefNeighbors(ctx, {
1423
+ alreadyReassigned,
1424
+ connectedNodeIds,
1425
+ movedBeliefIds,
1426
+ now,
1427
+ targetTopicId: args.targetTopicId
1428
+ });
1063
1429
  }
1064
1430
  return { reassigned, skipped, connectedReassigned };
1065
1431
  }