@lucern/graph-primitives 1.0.29 → 1.0.31

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,10 +1,14 @@
1
+ import { unsafeConvexAnyApi } from '@lucern/contracts/convex/unsafeAnyApi';
2
+ import { componentsGeneric } from 'convex/server';
1
3
  import { generateGlobalId, assertUuidV7Identity } from '@lucern/contracts/ids';
2
- import { componentsGeneric, anyApi } from 'convex/server';
3
4
  import '@lucern/contracts';
4
5
 
5
- // src/globalId.ts
6
+ // src/convex.ts
7
+ var unsafeApi = unsafeConvexAnyApi(
8
+ "graph-primitives top-level module bundle lacks a committed Convex _generated/api surface"
9
+ );
6
10
  componentsGeneric();
7
- var internal = anyApi;
11
+ var internal = unsafeApi;
8
12
 
9
13
  // src/epistemicLayerRules.ts
10
14
  function getNodeLayer(nodeType) {
@@ -336,15 +340,73 @@ function validateEdgeLayers(edgeType, fromLayer, toLayer) {
336
340
  }
337
341
 
338
342
  // src/epistemicEdgeCreation.ts
343
+ var EPISTEMIC_LAYERS = /* @__PURE__ */ new Set([
344
+ "L4",
345
+ "L3",
346
+ "L2",
347
+ "L1",
348
+ "ontological",
349
+ "organizational"
350
+ ]);
351
+ function readOptionalString(value) {
352
+ return typeof value === "string" && value.trim().length > 0 ? value : void 0;
353
+ }
354
+ function readConvexId(value) {
355
+ const normalized = readOptionalString(value);
356
+ return normalized;
357
+ }
358
+ function readEpistemicLayer(value) {
359
+ const layer = readOptionalString(value);
360
+ return layer && EPISTEMIC_LAYERS.has(layer) ? layer : void 0;
361
+ }
362
+ function readRecord(value) {
363
+ return value && typeof value === "object" && !Array.isArray(value) ? value : void 0;
364
+ }
365
+ function readEdgeNodeRow(value) {
366
+ const record = readRecord(value);
367
+ if (!record) {
368
+ return null;
369
+ }
370
+ const id = readConvexId(record._id);
371
+ const globalId = readOptionalString(record.globalId);
372
+ const nodeType = readOptionalString(record.nodeType);
373
+ if (!(id && globalId && nodeType)) {
374
+ return null;
375
+ }
376
+ const node = { _id: id, globalId, nodeType };
377
+ const epistemicLayer = readEpistemicLayer(record.epistemicLayer);
378
+ if (epistemicLayer !== void 0) {
379
+ node.epistemicLayer = epistemicLayer;
380
+ }
381
+ const metadata = readRecord(record.metadata);
382
+ if (metadata !== void 0) {
383
+ node.metadata = metadata;
384
+ }
385
+ const projectId = readOptionalString(record.projectId);
386
+ if (projectId !== void 0) {
387
+ node.projectId = projectId;
388
+ }
389
+ return node;
390
+ }
391
+ function requireEdgeNodeRow(value, context) {
392
+ const node = readEdgeNodeRow(value);
393
+ if (!node) {
394
+ throw new Error(`${context} requires a canonical epistemic node row.`);
395
+ }
396
+ return node;
397
+ }
339
398
  async function createEpistemicEdge(ctx, params) {
340
399
  const globalId = generateGlobalId();
341
- const fromNode = await ctx.db.get(params.fromNodeId);
342
- const toNode = await ctx.db.get(params.toNodeId);
343
- if (!fromNode || !toNode) {
344
- throw new Error("One or both nodes not found");
345
- }
346
- const fromLayer = fromNode.epistemicLayer || getNodeLayer(fromNode.nodeType);
347
- const toLayer = toNode.epistemicLayer || getNodeLayer(toNode.nodeType);
400
+ const fromNode = requireEdgeNodeRow(
401
+ await ctx.db.get(params.fromNodeId),
402
+ "Create epistemic edge source"
403
+ );
404
+ const toNode = requireEdgeNodeRow(
405
+ await ctx.db.get(params.toNodeId),
406
+ "Create epistemic edge target"
407
+ );
408
+ const fromLayer = fromNode.epistemicLayer ?? getNodeLayer(fromNode.nodeType);
409
+ const toLayer = toNode.epistemicLayer ?? getNodeLayer(toNode.nodeType);
348
410
  if (!params.skipLayerValidation) {
349
411
  const validation = validateEdgeLayers(params.edgeType, fromLayer, toLayer);
350
412
  if (!validation.valid) {
@@ -370,7 +432,7 @@ async function createEpistemicEdge(ctx, params) {
370
432
  });
371
433
  return globalId;
372
434
  }
373
- async function insertEpistemicNode(ctx, doc) {
435
+ function insertEpistemicNode(ctx, doc) {
374
436
  assertUuidV7Identity("epistemicNodes", doc.globalId);
375
437
  return ctx.db.insert("epistemicNodes", doc);
376
438
  }
@@ -380,8 +442,11 @@ function generateContentHash(nodeType, text) {
380
442
  const content = `${nodeType}:${normalizeText(text)}`;
381
443
  let hash = 5381;
382
444
  for (let i = 0; i < content.length; i++) {
383
- hash = (hash << 5) + hash + content.charCodeAt(i);
384
- hash &= hash;
445
+ const nextHash = hash * 33 + content.charCodeAt(i);
446
+ hash = nextHash - Math.floor(nextHash / 4294967296) * 4294967296;
447
+ if (hash >= 2147483648) {
448
+ hash -= 4294967296;
449
+ }
385
450
  }
386
451
  const hashHex = Math.abs(hash).toString(16).padStart(8, "0");
387
452
  const lengthHex = content.length.toString(16).padStart(4, "0");
@@ -391,6 +456,71 @@ function generateContentHash(nodeType, text) {
391
456
  function normalizeText(text) {
392
457
  return text.trim().toLowerCase().replace(/\s+/g, " ");
393
458
  }
459
+ function readOptionalString2(value) {
460
+ return typeof value === "string" && value.trim().length > 0 ? value : void 0;
461
+ }
462
+ function readOptionalBoolean(value) {
463
+ return typeof value === "boolean" ? value : void 0;
464
+ }
465
+ function readRecord2(value) {
466
+ return value && typeof value === "object" && !Array.isArray(value) ? value : null;
467
+ }
468
+ function readConvexId2(value) {
469
+ const normalized = readOptionalString2(value);
470
+ return normalized ? normalized : null;
471
+ }
472
+ function readExistingEpistemicNodeRow(value) {
473
+ const record = readRecord2(value);
474
+ if (!record) {
475
+ return null;
476
+ }
477
+ const id = readConvexId2(record._id);
478
+ if (!id) {
479
+ return null;
480
+ }
481
+ const node = { _id: id };
482
+ const metadata = readRecord2(record.metadata);
483
+ if (metadata) {
484
+ node.metadata = metadata;
485
+ }
486
+ const projectId = readOptionalString2(record.projectId);
487
+ if (projectId !== void 0) {
488
+ node.projectId = projectId;
489
+ }
490
+ const status = readOptionalString2(record.status);
491
+ if (status !== void 0) {
492
+ node.status = status;
493
+ }
494
+ return node;
495
+ }
496
+ function readSourceArtifactRow(value) {
497
+ const record = readRecord2(value);
498
+ if (!record) {
499
+ return null;
500
+ }
501
+ const artifact = {};
502
+ const content = readOptionalString2(record.content);
503
+ if (content !== void 0) {
504
+ artifact.content = content;
505
+ }
506
+ const metadata = readRecord2(record.metadata);
507
+ if (metadata) {
508
+ artifact.metadata = metadata;
509
+ }
510
+ const projectId = readOptionalString2(record.projectId);
511
+ if (projectId !== void 0) {
512
+ artifact.projectId = projectId;
513
+ }
514
+ const stage = readOptionalString2(record.stage);
515
+ if (stage !== void 0) {
516
+ artifact.stage = stage;
517
+ }
518
+ const topicId = readOptionalString2(record.topicId);
519
+ if (topicId !== void 0) {
520
+ artifact.topicId = topicId;
521
+ }
522
+ return artifact;
523
+ }
394
524
  function mapInsightSourceType(sourceType) {
395
525
  switch (sourceType) {
396
526
  case "verified":
@@ -413,16 +543,38 @@ function mapVerificationStatus(status) {
413
543
  return "unverified";
414
544
  }
415
545
  }
546
+ function inferInsightConfidence(verificationStatus) {
547
+ if (verificationStatus === "manually_verified") {
548
+ return 0.9;
549
+ }
550
+ if (verificationStatus === "deep_verified") {
551
+ return 0.7;
552
+ }
553
+ if (verificationStatus === "pre_screened") {
554
+ return 0.5;
555
+ }
556
+ return 0.3;
557
+ }
558
+ function mapQuestionSourceType(source) {
559
+ if (source === "manual") {
560
+ return "human";
561
+ }
562
+ if (source === "ai_suggested") {
563
+ return "ai_generated";
564
+ }
565
+ return "ai_extracted";
566
+ }
416
567
  async function createEpistemicNodeForInsight(ctx, _insightId, insight) {
417
568
  const now = Date.now();
418
569
  const globalId = generateGlobalId();
419
570
  const contentHash = generateContentHash("evidence", insight.text);
420
571
  const existing = await ctx.db.query("epistemicNodes").withIndex("by_contentHash", (q) => q.eq("contentHash", contentHash)).first();
421
- if (existing && existing.status === "active") {
422
- await ctx.db.patch(existing._id, {
572
+ const existingInsightNode = readExistingEpistemicNodeRow(existing);
573
+ if (existingInsightNode?.status === "active") {
574
+ await ctx.db.patch(existingInsightNode._id, {
423
575
  updatedAt: now
424
576
  });
425
- return existing._id;
577
+ return existingInsightNode._id;
426
578
  }
427
579
  const nodeId = await insertEpistemicNode(ctx, {
428
580
  globalId,
@@ -458,7 +610,7 @@ async function createEpistemicNodeForInsight(ctx, _insightId, insight) {
458
610
  },
459
611
  sourceType: mapInsightSourceType(insight.sourceType),
460
612
  aiProvider: insight.aiProvider,
461
- confidence: insight.verificationStatus === "manually_verified" ? 0.9 : insight.verificationStatus === "deep_verified" ? 0.7 : insight.verificationStatus === "pre_screened" ? 0.5 : 0.3,
613
+ confidence: inferInsightConfidence(insight.verificationStatus),
462
614
  verificationStatus: mapVerificationStatus(insight.verificationStatus),
463
615
  status: "active",
464
616
  topicId: insight.projectId,
@@ -490,15 +642,16 @@ async function createEpistemicNodeForBelief(ctx, beliefId, belief) {
490
642
  const globalId = generateGlobalId();
491
643
  const contentHash = generateContentHash("belief", belief.belief);
492
644
  const existing = await ctx.db.query("epistemicNodes").withIndex("by_contentHash", (q) => q.eq("contentHash", contentHash)).first();
493
- if (existing && existing.status === "active") {
494
- await ctx.db.patch(existing._id, {
645
+ const existingBeliefNode = readExistingEpistemicNodeRow(existing);
646
+ if (existingBeliefNode?.status === "active") {
647
+ await ctx.db.patch(existingBeliefNode._id, {
495
648
  metadata: {
496
- ...existing.metadata || {},
649
+ ...existingBeliefNode.metadata ?? {},
497
650
  sourceBeliefId: beliefId
498
651
  },
499
652
  updatedAt: now
500
653
  });
501
- return existing._id;
654
+ return existingBeliefNode._id;
502
655
  }
503
656
  const nodeId = await insertEpistemicNode(ctx, {
504
657
  globalId,
@@ -541,13 +694,14 @@ async function createEpistemicNodeForQuestion(ctx, _questionId, question) {
541
694
  const globalId = generateGlobalId();
542
695
  const contentHash = generateContentHash("question", question.question);
543
696
  const existing = await ctx.db.query("epistemicNodes").withIndex("by_contentHash", (q) => q.eq("contentHash", contentHash)).first();
544
- if (existing && existing.status === "active") {
545
- await ctx.db.patch(existing._id, {
697
+ const existingQuestionNode = readExistingEpistemicNodeRow(existing);
698
+ if (existingQuestionNode?.status === "active") {
699
+ await ctx.db.patch(existingQuestionNode._id, {
546
700
  updatedAt: now
547
701
  });
548
- return existing._id;
702
+ return existingQuestionNode._id;
549
703
  }
550
- const sourceType = question.source === "manual" ? "human" : question.source === "ai_suggested" ? "ai_generated" : "ai_extracted";
704
+ const sourceType = mapQuestionSourceType(question.source);
551
705
  const nodeId = await insertEpistemicNode(ctx, {
552
706
  globalId,
553
707
  nodeType: "question",
@@ -588,8 +742,9 @@ async function createEpistemicNodeForArtifact(ctx, artifactId, artifact) {
588
742
  artifact.title + artifact.content.slice(0, 500)
589
743
  );
590
744
  const existing2 = await ctx.db.query("epistemicNodes").withIndex("by_contentHash", (q) => q.eq("contentHash", contentHash2)).first();
591
- if (existing2 && existing2.status === "active") {
592
- return existing2._id;
745
+ const existingSynthesisNode = readExistingEpistemicNodeRow(existing2);
746
+ if (existingSynthesisNode?.status === "active") {
747
+ return existingSynthesisNode._id;
593
748
  }
594
749
  throw new Error("SKIP_SYNTHESIS_NODE_CREATION");
595
750
  }
@@ -598,15 +753,16 @@ async function createEpistemicNodeForArtifact(ctx, artifactId, artifact) {
598
753
  artifact.title + artifact.content.slice(0, 500)
599
754
  );
600
755
  const existing = await ctx.db.query("epistemicNodes").withIndex("by_contentHash", (q) => q.eq("contentHash", contentHash)).first();
601
- if (existing && existing.status === "active") {
602
- await ctx.db.patch(existing._id, {
756
+ const existingArtifactNode = readExistingEpistemicNodeRow(existing);
757
+ if (existingArtifactNode?.status === "active") {
758
+ await ctx.db.patch(existingArtifactNode._id, {
603
759
  metadata: {
604
- ...existing.metadata || {},
760
+ ...existingArtifactNode.metadata ?? {},
605
761
  legacyArtifactId: artifactId
606
762
  },
607
763
  updatedAt: now
608
764
  });
609
- return existing._id;
765
+ return existingArtifactNode._id;
610
766
  }
611
767
  const epistemicLayer = "L1";
612
768
  const nodeId = await insertEpistemicNode(ctx, {
@@ -635,21 +791,28 @@ async function createEpistemicNodeForArtifact(ctx, artifactId, artifact) {
635
791
  return nodeId;
636
792
  }
637
793
  async function findOrCreateSourceNode(ctx, artifactId, createdBy, scopeProjectId) {
638
- const artifact = await ctx.db.get(artifactId);
794
+ const artifact = readSourceArtifactRow(await ctx.db.get(artifactId));
639
795
  const effectiveProjectId = scopeProjectId || artifact?.projectId;
640
796
  const effectiveTopicId = artifact?.topicId;
641
797
  let existingNodes;
642
798
  if (effectiveTopicId) {
643
- existingNodes = await ctx.db.query("epistemicNodes").withIndex("by_topic", (q) => q.eq("topicId", effectiveTopicId)).collect();
799
+ const collectedNodes = await ctx.db.query("epistemicNodes").withIndex("by_topic", (q) => q.eq("topicId", effectiveTopicId)).collect();
800
+ existingNodes = collectedNodes.flatMap((node) => {
801
+ const row = readExistingEpistemicNodeRow(node);
802
+ return row ? [row] : [];
803
+ });
644
804
  } else {
645
- existingNodes = await ctx.db.query("epistemicNodes").withIndex("by_nodeType", (q) => q.eq("nodeType", "source")).collect();
805
+ const collectedNodes = await ctx.db.query("epistemicNodes").withIndex("by_nodeType", (q) => q.eq("nodeType", "source")).collect();
806
+ existingNodes = collectedNodes.flatMap((node) => {
807
+ const row = readExistingEpistemicNodeRow(node);
808
+ return row ? [row] : [];
809
+ });
646
810
  }
647
811
  const existing = existingNodes.find((n) => {
648
812
  if (effectiveProjectId && n.projectId && n.projectId !== effectiveProjectId) {
649
813
  return false;
650
814
  }
651
- const metadata = n.metadata;
652
- return metadata?.legacyArtifactId === artifactId;
815
+ return n.metadata?.legacyArtifactId === artifactId;
653
816
  });
654
817
  if (existing) {
655
818
  return existing._id;
@@ -659,18 +822,18 @@ async function findOrCreateSourceNode(ctx, artifactId, createdBy, scopeProjectId
659
822
  }
660
823
  const now = Date.now();
661
824
  const globalId = generateGlobalId();
662
- const artifactType = artifact.metadata?.type || "";
663
- const isDeepResearch = artifact.metadata?.isDeepResearch;
825
+ const artifactType = readOptionalString2(artifact.metadata?.type) ?? "";
826
+ const isDeepResearch = readOptionalBoolean(artifact.metadata?.isDeepResearch) ?? false;
664
827
  let nodeType = "source";
665
828
  if (isDeepResearch || artifactType.includes("deep") || artifactType.includes("research")) {
666
829
  nodeType = "synthesis";
667
830
  } else if (artifactType.includes("primer")) {
668
831
  nodeType = "synthesis";
669
832
  }
670
- const title = artifact.metadata?.title || artifact.metadata?.theme || "Untitled";
833
+ const title = readOptionalString2(artifact.metadata?.title) || readOptionalString2(artifact.metadata?.theme) || "Untitled";
671
834
  const contentHash = generateContentHash(
672
835
  nodeType,
673
- title + (artifact.content?.slice(0, 500) || "")
836
+ title + (artifact.content?.slice(0, 500) ?? "")
674
837
  );
675
838
  const epistemicLayer = nodeType === "synthesis" ? "L2" : "L1";
676
839
  const nodeId = await insertEpistemicNode(ctx, {