@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,13 +1,17 @@
1
- import { v } from 'convex/values';
2
- import { componentsGeneric, anyApi, internalMutationGeneric, internalQueryGeneric } from 'convex/server';
3
1
  import { permissiveReturn } from '@lucern/contracts/schema-helpers/validators';
4
- import { assertUuidV7Identity } from '@lucern/contracts/ids';
2
+ import { v } from 'convex/values';
3
+ import { unsafeConvexAnyApi } from '@lucern/contracts/convex/unsafeAnyApi';
4
+ import { componentsGeneric, internalMutationGeneric, internalQueryGeneric } from 'convex/server';
5
5
  import '@lucern/contracts';
6
+ import { assertUuidV7Identity } from '@lucern/contracts/ids';
6
7
 
7
8
  // src/epistemicNodes.internal.ts
8
- var api = anyApi;
9
+ var unsafeApi = unsafeConvexAnyApi(
10
+ "graph-primitives top-level module bundle lacks a committed Convex _generated/api surface"
11
+ );
12
+ var api = unsafeApi;
9
13
  componentsGeneric();
10
- var internal = anyApi;
14
+ var internal = unsafeApi;
11
15
  var internalMutation = internalMutationGeneric;
12
16
  var internalQuery = internalQueryGeneric;
13
17
 
@@ -22,6 +26,200 @@ function debugGraphPrimitiveFallback(message, context) {
22
26
  }
23
27
  console.debug(message, context ?? {});
24
28
  }
29
+ function insertEpistemicNode(ctx, doc) {
30
+ assertUuidV7Identity("epistemicNodes", doc.globalId);
31
+ return ctx.db.insert("epistemicNodes", doc);
32
+ }
33
+
34
+ // src/epistemicNodes.helpers.ts
35
+ function buildNodeStatusSuccessResult() {
36
+ return { success: true };
37
+ }
38
+ function buildNodeNotFoundResult() {
39
+ const result = {};
40
+ result.success = false;
41
+ result.error = "Node not found";
42
+ return result;
43
+ }
44
+ function buildNodeDeletedResult(deletedEdgeCount) {
45
+ return {
46
+ success: true,
47
+ deletedEdgeCount
48
+ };
49
+ }
50
+ v.union(
51
+ v.literal("L4"),
52
+ v.literal("L3"),
53
+ v.literal("L2"),
54
+ v.literal("L1"),
55
+ v.literal("ontological"),
56
+ v.literal("organizational")
57
+ );
58
+ v.union(v.literal("decision"));
59
+ v.union(
60
+ v.literal("belief"),
61
+ v.literal("question"),
62
+ v.literal("theme"),
63
+ v.literal("deal")
64
+ );
65
+ v.union(
66
+ v.literal("claim"),
67
+ v.literal("evidence"),
68
+ v.literal("synthesis")
69
+ );
70
+ v.union(
71
+ v.literal("atomic_fact"),
72
+ v.literal("excerpt"),
73
+ v.literal("source")
74
+ );
75
+ v.union(
76
+ // L4: Audit targets
77
+ v.literal("decision"),
78
+ // L3: Traversal anchors
79
+ v.literal("belief"),
80
+ v.literal("question"),
81
+ v.literal("theme"),
82
+ v.literal("deal"),
83
+ // L2: Compression boundary
84
+ v.literal("claim"),
85
+ v.literal("evidence"),
86
+ v.literal("synthesis"),
87
+ v.literal("answer"),
88
+ // L1: Terminal leaves
89
+ v.literal("atomic_fact"),
90
+ v.literal("excerpt"),
91
+ v.literal("source")
92
+ );
93
+ v.union(
94
+ v.literal("company"),
95
+ v.literal("person"),
96
+ v.literal("investor"),
97
+ v.literal("function"),
98
+ v.literal("value_chain")
99
+ );
100
+ v.union(v.literal("topic"));
101
+ var nodeTypeValidator = v.union(
102
+ // L4: Audit targets
103
+ v.literal("decision"),
104
+ // L3: Traversal anchors
105
+ v.literal("belief"),
106
+ v.literal("question"),
107
+ v.literal("theme"),
108
+ v.literal("deal"),
109
+ // L2: Compression boundary
110
+ v.literal("claim"),
111
+ v.literal("evidence"),
112
+ v.literal("synthesis"),
113
+ v.literal("answer"),
114
+ // L1: Terminal leaves
115
+ v.literal("atomic_fact"),
116
+ v.literal("excerpt"),
117
+ v.literal("source"),
118
+ // Ontological
119
+ v.literal("company"),
120
+ v.literal("person"),
121
+ v.literal("investor"),
122
+ v.literal("function"),
123
+ v.literal("value_chain"),
124
+ // Organizational
125
+ v.literal("topic")
126
+ );
127
+ var sourceTypeValidator = v.union(
128
+ v.literal("human"),
129
+ v.literal("ai_extracted"),
130
+ v.literal("ai_generated"),
131
+ v.literal("imported"),
132
+ v.literal("system")
133
+ // System-generated (migrations, classifiers)
134
+ );
135
+ v.union(
136
+ v.literal("active"),
137
+ v.literal("superseded"),
138
+ v.literal("archived"),
139
+ v.literal("deleted")
140
+ );
141
+ var verificationStatusValidator = v.union(
142
+ v.literal("unverified"),
143
+ v.literal("human_verified"),
144
+ v.literal("ai_verified"),
145
+ v.literal("contradicted"),
146
+ v.literal("outdated")
147
+ );
148
+
149
+ // src/graphTypes.ts
150
+ function getNodeLayer(nodeType) {
151
+ const L4_TYPES = ["decision"];
152
+ const L3_TYPES = ["belief", "question", "theme", "deal"];
153
+ const L2_TYPES = ["claim", "evidence", "synthesis", "answer"];
154
+ const L1_TYPES = ["atomic_fact", "excerpt", "source"];
155
+ const ONTOLOGICAL_TYPES = [
156
+ "company",
157
+ "person",
158
+ "investor",
159
+ "function",
160
+ "value_chain"
161
+ ];
162
+ const ORGANIZATIONAL_TYPES = ["topic"];
163
+ if (L4_TYPES.includes(nodeType)) {
164
+ return "L4";
165
+ }
166
+ if (L3_TYPES.includes(nodeType)) {
167
+ return "L3";
168
+ }
169
+ if (L2_TYPES.includes(nodeType)) {
170
+ return "L2";
171
+ }
172
+ if (L1_TYPES.includes(nodeType)) {
173
+ return "L1";
174
+ }
175
+ if (ONTOLOGICAL_TYPES.includes(nodeType)) {
176
+ return "ontological";
177
+ }
178
+ if (ORGANIZATIONAL_TYPES.includes(nodeType)) {
179
+ return "organizational";
180
+ }
181
+ console.warn(`[GraphTypes] Unknown nodeType "${nodeType}", defaulting to L2`);
182
+ return "L2";
183
+ }
184
+
185
+ // src/invariantEnforcement.ts
186
+ function throwInvariantError(args) {
187
+ const error = new Error(args.message);
188
+ error.status = args.status ?? 409;
189
+ error.code = args.code ?? "INVARIANT_VIOLATION";
190
+ error.invariantCode = args.invariantCode;
191
+ error.suggestion = args.suggestion;
192
+ error.details = args.details;
193
+ throw error;
194
+ }
195
+ function isBeliefNode(node) {
196
+ return node?.nodeType === "belief";
197
+ }
198
+ function assertBeliefNodeHardDeleteAllowed(args) {
199
+ if (!isBeliefNode(args.node)) {
200
+ return;
201
+ }
202
+ if (!args.allowBeliefHardDelete) {
203
+ throwInvariantError({
204
+ message: "Belief hard delete is forbidden by default. Beliefs must retain lineage and audit history.",
205
+ invariantCode: "belief.hard_delete_forbidden",
206
+ suggestion: "Use epistemicBeliefs.archive() or epistemicBeliefs.forkBelief() instead. Only migration repair flows may opt into hard delete explicitly.",
207
+ details: { mutationName: args.mutationName, nodeId: args.node._id }
208
+ });
209
+ }
210
+ if (!args.reason.trim().toLowerCase().startsWith("migration:")) {
211
+ throwInvariantError({
212
+ message: "Belief hard delete bypasses require a migration-scoped rationale.",
213
+ invariantCode: "belief.hard_delete_forbidden",
214
+ suggestion: 'Retry with allowBeliefHardDelete: true and a reason starting with "migration:" only for one-off data repair flows.',
215
+ details: {
216
+ mutationName: args.mutationName,
217
+ nodeId: args.node._id,
218
+ reason: args.reason
219
+ }
220
+ });
221
+ }
222
+ }
25
223
  var LEGACY_SCOPE_FIELD = "graphScopeProjectId";
26
224
  async function resolveTopicNodeScopeOrNull(ctx, ref) {
27
225
  if (!ctx?.db || typeof ctx.db.query !== "function") {
@@ -56,13 +254,15 @@ function asMappedProjectId(topic) {
56
254
  if (!topic) {
57
255
  return;
58
256
  }
59
- const directLegacyProjectId = normalizeScopeValue(topic[LEGACY_SCOPE_FIELD]);
257
+ const directLegacyProjectId = normalizeScopeValue(
258
+ topic[LEGACY_SCOPE_FIELD]
259
+ );
60
260
  if (directLegacyProjectId) {
61
261
  return directLegacyProjectId;
62
262
  }
63
263
  const metadata = topic.metadata || {};
64
264
  const candidate = metadata[LEGACY_SCOPE_FIELD] || metadata.legacyProjectId || metadata.projectId || metadata.scopeProjectId;
65
- return candidate ? candidate : void 0;
265
+ return typeof candidate === "string" ? normalizeScopeValue(candidate) : void 0;
66
266
  }
67
267
  function normalizeScopeValue(value) {
68
268
  if (typeof value !== "string") {
@@ -87,8 +287,9 @@ function pickPrimaryTopic(candidates) {
87
287
  })[0];
88
288
  }
89
289
  async function findTopicsByScopeAlias(ctx, scopeId) {
290
+ const query = ctx.db.query("topics");
90
291
  try {
91
- return await ctx.db.query("topics").withIndex(
292
+ return await query.withIndex(
92
293
  "by_graph_scope_project",
93
294
  (q) => q.eq(LEGACY_SCOPE_FIELD, scopeId)
94
295
  ).collect();
@@ -100,7 +301,7 @@ async function findTopicsByScopeAlias(ctx, scopeId) {
100
301
  scopeId
101
302
  }
102
303
  );
103
- const topics = await ctx.db.query("topics").collect();
304
+ const topics = await query.collect();
104
305
  return topics.filter((topic) => {
105
306
  const normalizedGlobalId = normalizeScopeValue(topic.globalId);
106
307
  const mappedProjectId = asMappedProjectId(topic);
@@ -156,338 +357,196 @@ async function resolveInheritedWorkspaceScope(ctx, topic) {
156
357
  let current = topic;
157
358
  for (let i = 0; i < MAX_DEPTH && current?.parentTopicId; i++) {
158
359
  current = await ctx.db.get(current.parentTopicId);
159
- if (!current) break;
360
+ if (!current) {
361
+ break;
362
+ }
160
363
  if (!tenantId) {
161
364
  tenantId = normalizeScopeValue(current.tenantId);
162
365
  }
163
366
  if (!workspaceId) {
164
367
  workspaceId = normalizeScopeValue(current.workspaceId);
165
368
  }
166
- if (tenantId && workspaceId) break;
369
+ if (tenantId && workspaceId) {
370
+ break;
371
+ }
167
372
  }
168
373
  return { tenantId, workspaceId };
169
374
  }
170
375
  async function resolveTopicProjectScope(ctx, args) {
171
376
  if (args.topicId) {
172
- let topic = null;
173
- try {
174
- topic = await ctx.db.get(
175
- args.topicId
176
- );
177
- } catch (error) {
178
- debugGraphPrimitiveFallback(
179
- "[topicScope] Failed to load topic by direct id",
180
- {
181
- error,
182
- topicId: args.topicId
183
- }
184
- );
185
- }
186
- if (!topic) {
187
- topic = await tryResolveHostTopicById(ctx, String(args.topicId));
188
- }
189
- if (!topic) {
190
- topic = pickPrimaryTopic(
191
- await findTopicsByScopeAlias(ctx, String(args.topicId))
192
- ) ?? null;
193
- }
194
- if (!topic) {
195
- const nodeScope = await resolveTopicNodeScopeOrNull(
196
- ctx,
197
- String(args.topicId)
198
- );
199
- if (nodeScope) {
200
- return nodeScope;
201
- }
202
- throw new Error(`Topic not found: ${String(args.topicId)}`);
203
- }
204
- const inherited = await resolveInheritedWorkspaceScope(ctx, topic);
205
- const mapped = asMappedProjectId(topic);
206
- if (mapped) {
207
- return {
208
- topicId: topic._id,
209
- projectId: mapped,
210
- tenantId: inherited.tenantId,
211
- workspaceId: inherited.workspaceId,
212
- source: "topic"
213
- };
214
- }
215
- return {
216
- topicId: topic._id,
217
- tenantId: inherited.tenantId,
218
- workspaceId: inherited.workspaceId,
219
- source: "topic"
220
- };
377
+ return await resolveScopeFromTopicId(ctx, args.topicId);
221
378
  }
222
379
  if (args.projectId) {
223
- let directTopic = null;
224
- try {
225
- directTopic = await ctx.db.get(
226
- args.projectId
227
- );
228
- } catch (error) {
229
- debugGraphPrimitiveFallback(
230
- "[topicScope] Failed to load direct project topic",
231
- {
232
- error,
233
- projectId: args.projectId
234
- }
235
- );
236
- }
237
- if (directTopic) {
238
- const inherited = await resolveInheritedWorkspaceScope(ctx, directTopic);
239
- const mapped = asMappedProjectId(directTopic);
240
- return {
241
- topicId: directTopic._id,
242
- projectId: mapped ?? args.projectId,
243
- tenantId: inherited.tenantId,
244
- workspaceId: inherited.workspaceId,
245
- source: "topic_inferred"
246
- };
247
- }
248
- directTopic = await tryResolveHostTopicByLegacyScope(ctx, args.projectId);
249
- if (directTopic) {
250
- const inherited = await resolveInheritedWorkspaceScope(ctx, directTopic);
251
- const mapped = asMappedProjectId(directTopic);
252
- return {
253
- topicId: directTopic._id,
254
- projectId: mapped ?? args.projectId,
255
- tenantId: inherited.tenantId,
256
- workspaceId: inherited.workspaceId,
257
- source: "topic_inferred"
258
- };
259
- }
260
- const topics = await findTopicsByScopeAlias(ctx, args.projectId);
261
- const primary = pickPrimaryTopic(topics);
262
- if (primary) {
263
- const inherited = await resolveInheritedWorkspaceScope(ctx, primary);
264
- return {
265
- topicId: primary._id,
266
- projectId: args.projectId,
267
- tenantId: inherited.tenantId,
268
- workspaceId: inherited.workspaceId,
269
- source: "project_mapped_topic"
270
- };
271
- }
272
- const nodeScope = await resolveTopicNodeScopeOrNull(
273
- ctx,
274
- String(args.projectId)
275
- );
276
- if (nodeScope) {
277
- return {
278
- ...nodeScope,
279
- projectId: nodeScope.projectId ?? String(args.projectId)
280
- };
281
- }
282
- throw new Error(
283
- `Legacy project scope ${String(args.projectId)} has no mapped topic.`
284
- );
380
+ return await resolveScopeFromLegacyProjectId(ctx, args.projectId);
285
381
  }
286
382
  throw new Error(
287
383
  "Missing scope: provide topicId (preferred) or legacy projectId alias."
288
384
  );
289
385
  }
290
- var optionalScopeArgs = {
291
- projectId: v.optional(v.string()),
292
- topicId: v.optional(v.string())
293
- };
294
-
295
- // src/graphTypes.ts
296
- function getNodeLayer(nodeType) {
297
- const L4_TYPES = ["decision"];
298
- const L3_TYPES = ["belief", "question", "theme", "deal"];
299
- const L2_TYPES = ["claim", "evidence", "synthesis", "answer"];
300
- const L1_TYPES = ["atomic_fact", "excerpt", "source"];
301
- const ONTOLOGICAL_TYPES = [
302
- "company",
303
- "person",
304
- "investor",
305
- "function",
306
- "value_chain"
307
- ];
308
- const ORGANIZATIONAL_TYPES = ["topic"];
309
- if (L4_TYPES.includes(nodeType)) {
310
- return "L4";
386
+ async function resolveScopeFromTopicId(ctx, topicId) {
387
+ const topic = await resolveTopicDocFromTopicId(ctx, topicId);
388
+ if (topic) {
389
+ return await buildTopicScope(ctx, topic, "topic");
311
390
  }
312
- if (L3_TYPES.includes(nodeType)) {
313
- return "L3";
314
- }
315
- if (L2_TYPES.includes(nodeType)) {
316
- return "L2";
391
+ const nodeScope = await resolveTopicNodeScopeOrNull(ctx, String(topicId));
392
+ if (nodeScope) {
393
+ return nodeScope;
317
394
  }
318
- if (L1_TYPES.includes(nodeType)) {
319
- return "L1";
395
+ throw new Error(`Topic not found: ${String(topicId)}`);
396
+ }
397
+ async function resolveTopicDocFromTopicId(ctx, topicId) {
398
+ const direct = await tryReadTopicDoc(ctx, topicId, {
399
+ failureLog: "[topicScope] Failed to load topic by direct id",
400
+ idLogKey: "topicId"
401
+ });
402
+ if (direct) {
403
+ return direct;
404
+ }
405
+ const hostTopic = await tryResolveHostTopicById(ctx, String(topicId));
406
+ if (hostTopic) {
407
+ return hostTopic;
408
+ }
409
+ return pickPrimaryTopic(await findTopicsByScopeAlias(ctx, String(topicId))) ?? null;
410
+ }
411
+ async function resolveScopeFromLegacyProjectId(ctx, legacyProjectId) {
412
+ const directTopic = await resolveDirectLegacyProjectTopic(
413
+ ctx,
414
+ legacyProjectId
415
+ );
416
+ if (directTopic) {
417
+ return await buildTopicScope(ctx, directTopic, "topic_inferred", {
418
+ fallbackProjectId: legacyProjectId
419
+ });
320
420
  }
321
- if (ONTOLOGICAL_TYPES.includes(nodeType)) {
322
- return "ontological";
421
+ const primary = pickPrimaryTopic(
422
+ await findTopicsByScopeAlias(ctx, legacyProjectId)
423
+ );
424
+ if (primary) {
425
+ return await buildTopicScope(ctx, primary, "project_mapped_topic", {
426
+ fallbackProjectId: legacyProjectId
427
+ });
323
428
  }
324
- if (ORGANIZATIONAL_TYPES.includes(nodeType)) {
325
- return "organizational";
429
+ const nodeScope = await resolveTopicNodeScopeOrNull(ctx, legacyProjectId);
430
+ if (nodeScope) {
431
+ return {
432
+ ...nodeScope,
433
+ projectId: nodeScope.projectId ?? legacyProjectId
434
+ };
326
435
  }
327
- console.warn(`[GraphTypes] Unknown nodeType "${nodeType}", defaulting to L2`);
328
- return "L2";
436
+ throw new Error(
437
+ `Legacy project scope ${legacyProjectId} has no mapped topic.`
438
+ );
329
439
  }
330
-
331
- // src/epistemicNodes.helpers.ts
332
- function buildNodeStatusSuccessResult() {
333
- return { success: true };
440
+ async function resolveDirectLegacyProjectTopic(ctx, legacyProjectId) {
441
+ const directTopic = await tryReadTopicDoc(ctx, legacyProjectId, {
442
+ failureLog: "[topicScope] Failed to load direct project topic",
443
+ idLogKey: "projectId"
444
+ });
445
+ return directTopic ?? tryResolveHostTopicByLegacyScope(ctx, legacyProjectId);
334
446
  }
335
- function buildNodeNotFoundResult() {
336
- const result = {};
337
- result.success = false;
338
- result.error = "Node not found";
339
- return result;
447
+ async function tryReadTopicDoc(ctx, id, log) {
448
+ try {
449
+ return await ctx.db.get(id);
450
+ } catch (error) {
451
+ debugGraphPrimitiveFallback(log.failureLog, {
452
+ error,
453
+ [log.idLogKey]: id
454
+ });
455
+ return null;
456
+ }
340
457
  }
341
- function buildNodeDeletedResult(deletedEdgeCount) {
458
+ async function buildTopicScope(ctx, topic, source, options = {}) {
459
+ const inherited = await resolveInheritedWorkspaceScope(ctx, topic);
460
+ const mapped = asMappedProjectId(topic);
342
461
  return {
343
- success: true,
344
- deletedEdgeCount
462
+ topicId: topic._id,
463
+ ...mapped || options.fallbackProjectId ? { projectId: mapped ?? options.fallbackProjectId } : {},
464
+ tenantId: inherited.tenantId,
465
+ workspaceId: inherited.workspaceId,
466
+ source
345
467
  };
346
468
  }
347
- v.union(
348
- v.literal("L4"),
349
- v.literal("L3"),
350
- v.literal("L2"),
351
- v.literal("L1"),
352
- v.literal("ontological"),
353
- v.literal("organizational")
354
- );
355
- v.union(v.literal("decision"));
356
- v.union(
357
- v.literal("belief"),
358
- v.literal("question"),
359
- v.literal("theme"),
360
- v.literal("deal")
361
- );
362
- v.union(
363
- v.literal("claim"),
364
- v.literal("evidence"),
365
- v.literal("synthesis")
366
- );
367
- v.union(
368
- v.literal("atomic_fact"),
369
- v.literal("excerpt"),
370
- v.literal("source")
371
- );
372
- v.union(
373
- // L4: Audit targets
374
- v.literal("decision"),
375
- // L3: Traversal anchors
376
- v.literal("belief"),
377
- v.literal("question"),
378
- v.literal("theme"),
379
- v.literal("deal"),
380
- // L2: Compression boundary
381
- v.literal("claim"),
382
- v.literal("evidence"),
383
- v.literal("synthesis"),
384
- v.literal("answer"),
385
- // L1: Terminal leaves
386
- v.literal("atomic_fact"),
387
- v.literal("excerpt"),
388
- v.literal("source")
389
- );
390
- v.union(
391
- v.literal("company"),
392
- v.literal("person"),
393
- v.literal("investor"),
394
- v.literal("function"),
395
- v.literal("value_chain")
396
- );
397
- v.union(v.literal("topic"));
398
- var nodeTypeValidator = v.union(
399
- // L4: Audit targets
400
- v.literal("decision"),
401
- // L3: Traversal anchors
402
- v.literal("belief"),
403
- v.literal("question"),
404
- v.literal("theme"),
405
- v.literal("deal"),
406
- // L2: Compression boundary
407
- v.literal("claim"),
408
- v.literal("evidence"),
409
- v.literal("synthesis"),
410
- v.literal("answer"),
411
- // L1: Terminal leaves
412
- v.literal("atomic_fact"),
413
- v.literal("excerpt"),
414
- v.literal("source"),
415
- // Ontological
416
- v.literal("company"),
417
- v.literal("person"),
418
- v.literal("investor"),
419
- v.literal("function"),
420
- v.literal("value_chain"),
421
- // Organizational
422
- v.literal("topic")
423
- );
424
- var sourceTypeValidator = v.union(
425
- v.literal("human"),
426
- v.literal("ai_extracted"),
427
- v.literal("ai_generated"),
428
- v.literal("imported"),
429
- v.literal("system")
430
- // System-generated (migrations, classifiers)
431
- );
432
- v.union(
433
- v.literal("active"),
434
- v.literal("superseded"),
435
- v.literal("archived"),
436
- v.literal("deleted")
437
- );
438
- var verificationStatusValidator = v.union(
439
- v.literal("unverified"),
440
- v.literal("human_verified"),
441
- v.literal("ai_verified"),
442
- v.literal("contradicted"),
443
- v.literal("outdated")
444
- );
469
+ var optionalScopeArgs = {
470
+ projectId: v.optional(v.string()),
471
+ topicId: v.optional(v.string())
472
+ };
445
473
 
446
- // src/invariantEnforcement.ts
447
- function throwInvariantError(args) {
448
- const error = new Error(args.message);
449
- error.status = args.status ?? 409;
450
- error.code = args.code ?? "INVARIANT_VIOLATION";
451
- error.invariantCode = args.invariantCode;
452
- error.suggestion = args.suggestion;
453
- error.details = args.details;
454
- throw error;
474
+ // src/epistemicNodes.internal.ts
475
+ var optionalNodeScopeArgs = optionalScopeArgs;
476
+ var EPISTEMIC_LAYERS = /* @__PURE__ */ new Set([
477
+ "L4",
478
+ "L3",
479
+ "L2",
480
+ "L1",
481
+ "ontological",
482
+ "organizational"
483
+ ]);
484
+ function readOptionalString(value) {
485
+ return typeof value === "string" && value.trim().length > 0 ? value : void 0;
455
486
  }
456
- function isBeliefNode(node) {
457
- return node?.nodeType === "belief";
487
+ function readConvexId(value) {
488
+ const normalized = readOptionalString(value);
489
+ return normalized ? normalized : null;
458
490
  }
459
- function assertBeliefNodeHardDeleteAllowed(args) {
460
- if (!isBeliefNode(args.node)) {
461
- return;
491
+ function readRecord(value) {
492
+ return value && typeof value === "object" && !Array.isArray(value) ? value : null;
493
+ }
494
+ function readEpistemicLayer(value) {
495
+ const layer = readOptionalString(value);
496
+ return layer && EPISTEMIC_LAYERS.has(layer) ? layer : void 0;
497
+ }
498
+ function resolveEpistemicLayer(args) {
499
+ return readEpistemicLayer(args.providedLayer) ?? getNodeLayer(args.nodeType);
500
+ }
501
+ function readInternalNodeRow(value) {
502
+ const record = readRecord(value);
503
+ if (!record) {
504
+ return null;
462
505
  }
463
- if (!args.allowBeliefHardDelete) {
464
- throwInvariantError({
465
- message: "Belief hard delete is forbidden by default. Beliefs must retain lineage and audit history.",
466
- invariantCode: "belief.hard_delete_forbidden",
467
- suggestion: "Use epistemicBeliefs.archive() or epistemicBeliefs.forkBelief() instead. Only migration repair flows may opt into hard delete explicitly.",
468
- details: { mutationName: args.mutationName, nodeId: args.node._id }
469
- });
506
+ const id = readConvexId(record._id);
507
+ const nodeType = readOptionalString(record.nodeType);
508
+ if (!(id && nodeType)) {
509
+ return null;
470
510
  }
471
- if (!args.reason.trim().toLowerCase().startsWith("migration:")) {
472
- throwInvariantError({
473
- message: "Belief hard delete bypasses require a migration-scoped rationale.",
474
- invariantCode: "belief.hard_delete_forbidden",
475
- suggestion: 'Retry with allowBeliefHardDelete: true and a reason starting with "migration:" only for one-off data repair flows.',
476
- details: {
477
- mutationName: args.mutationName,
478
- nodeId: args.node._id,
479
- reason: args.reason
480
- }
481
- });
511
+ const node = { _id: id, nodeType };
512
+ const canonicalText = readOptionalString(record.canonicalText);
513
+ if (canonicalText !== void 0) {
514
+ node.canonicalText = canonicalText;
515
+ }
516
+ const globalId = readOptionalString(record.globalId);
517
+ if (globalId !== void 0) {
518
+ node.globalId = globalId;
519
+ }
520
+ const projectId = readOptionalString(record.projectId);
521
+ if (projectId !== void 0) {
522
+ node.projectId = projectId;
523
+ }
524
+ const status = readOptionalString(record.status);
525
+ if (status !== void 0) {
526
+ node.status = status;
527
+ }
528
+ const title = readOptionalString(record.title);
529
+ if (title !== void 0) {
530
+ node.title = title;
482
531
  }
532
+ return node;
483
533
  }
484
- async function insertEpistemicNode(ctx, doc) {
485
- assertUuidV7Identity("epistemicNodes", doc.globalId);
486
- return ctx.db.insert("epistemicNodes", doc);
534
+ function readInternalEdgeRow(value) {
535
+ const record = readRecord(value);
536
+ if (!record) {
537
+ return null;
538
+ }
539
+ const id = readConvexId(record._id);
540
+ if (!id) {
541
+ return null;
542
+ }
543
+ const edge = { _id: id };
544
+ const globalId = readOptionalString(record.globalId);
545
+ if (globalId !== void 0) {
546
+ edge.globalId = globalId;
547
+ }
548
+ return edge;
487
549
  }
488
-
489
- // src/epistemicNodes.internal.ts
490
- var optionalNodeScopeArgs = optionalScopeArgs;
491
550
  var createInternal = internalMutation({
492
551
  args: {
493
552
  ...optionalNodeScopeArgs,
@@ -547,11 +606,14 @@ var createInternal = internalMutation({
547
606
  projectId: args.projectId
548
607
  }
549
608
  );
550
- return void 0;
609
+ return;
551
610
  }
552
611
  })() : void 0;
553
612
  const contentHash = args.contentHash || `${args.nodeType}:${args.canonicalText}`.slice(0, 64);
554
- const epistemicLayer = args.epistemicLayer || getNodeLayer(args.nodeType);
613
+ const epistemicLayer = resolveEpistemicLayer({
614
+ nodeType: args.nodeType,
615
+ providedLayer: args.epistemicLayer
616
+ });
555
617
  const nodeId = await insertEpistemicNode(ctx, {
556
618
  globalId: args.globalId,
557
619
  nodeType: args.nodeType,
@@ -592,9 +654,7 @@ var getInternal = internalQuery({
592
654
  nodeId: v.id("epistemicNodes")
593
655
  },
594
656
  returns: permissiveReturn,
595
- handler: async (ctx, args) => {
596
- return await ctx.db.get(args.nodeId);
597
- }
657
+ handler: async (ctx, args) => await ctx.db.get(args.nodeId)
598
658
  });
599
659
  var updateSyncStatus = internalMutation({
600
660
  args: {
@@ -663,7 +723,7 @@ var hardDelete = internalMutation({
663
723
  },
664
724
  returns: permissiveReturn,
665
725
  handler: async (ctx, args) => {
666
- const node = await ctx.db.get(args.nodeId);
726
+ const node = readInternalNodeRow(await ctx.db.get(args.nodeId));
667
727
  if (!node) {
668
728
  return buildNodeNotFoundResult();
669
729
  }
@@ -675,7 +735,7 @@ var hardDelete = internalMutation({
675
735
  });
676
736
  await ctx.db.insert("epistemicAudit", {
677
737
  entityType: "node",
678
- entityId: args.nodeId,
738
+ entityId: String(args.nodeId),
679
739
  changeType: "deleted",
680
740
  projectId: node.projectId,
681
741
  changedBy: "system:hard_delete",
@@ -683,21 +743,31 @@ var hardDelete = internalMutation({
683
743
  isAgent: false,
684
744
  previousState: {
685
745
  nodeType: node.nodeType,
686
- title: node.title || node.canonicalText?.slice(0, 100),
746
+ title: node.title ?? node.canonicalText?.slice(0, 100),
687
747
  status: node.status
688
748
  },
689
749
  rationale: args.reason
690
750
  });
691
- const fromEdges = await ctx.db.query("epistemicEdges").withIndex("by_from", (q) => q.eq("fromNodeId", args.nodeId)).collect();
692
- const toEdges = await ctx.db.query("epistemicEdges").withIndex("by_to", (q) => q.eq("toNodeId", args.nodeId)).collect();
751
+ const endpointRefs = [String(args.nodeId), node.globalId].filter(
752
+ (ref) => typeof ref === "string" && ref.length > 0
753
+ );
693
754
  const uniqueEdges = /* @__PURE__ */ new Map();
694
- for (const edge of [...fromEdges, ...toEdges]) {
695
- uniqueEdges.set(edge.globalId, edge);
755
+ for (const endpointRef of endpointRefs) {
756
+ const fromEdges = await ctx.db.query("epistemicEdges").withIndex("by_from", (q) => q.eq("fromNodeId", endpointRef)).collect();
757
+ const toEdges = await ctx.db.query("epistemicEdges").withIndex("by_to", (q) => q.eq("toNodeId", endpointRef)).collect();
758
+ for (const rawEdge of [...fromEdges, ...toEdges]) {
759
+ const edge = readInternalEdgeRow(rawEdge);
760
+ if (edge) {
761
+ uniqueEdges.set(edge.globalId ?? String(edge._id), edge);
762
+ }
763
+ }
696
764
  }
697
765
  for (const edge of uniqueEdges.values()) {
698
- await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.deleteEdge, {
699
- globalId: edge.globalId
700
- });
766
+ if (edge.globalId) {
767
+ await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.deleteEdge, {
768
+ globalId: edge.globalId
769
+ });
770
+ }
701
771
  await ctx.db.delete(edge._id);
702
772
  }
703
773
  await ctx.db.delete(args.nodeId);