@lucern/graph-primitives 1.0.21 → 1.0.23

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 (127) hide show
  1. package/dist/beliefDecay.js +46 -0
  2. package/dist/beliefDecay.js.map +1 -1
  3. package/dist/beliefEvidenceLinks.js +87 -5
  4. package/dist/beliefEvidenceLinks.js.map +1 -1
  5. package/dist/beliefEvidenceLinks.operational.js +41 -5
  6. package/dist/beliefEvidenceLinks.operational.js.map +1 -1
  7. package/dist/contradictions.js +46 -0
  8. package/dist/contradictions.js.map +1 -1
  9. package/dist/edgeValidation.js +66 -1
  10. package/dist/edgeValidation.js.map +1 -1
  11. package/dist/entityBridge.js +66 -1
  12. package/dist/entityBridge.js.map +1 -1
  13. package/dist/entityLifecycle.js +90 -5
  14. package/dist/entityLifecycle.js.map +1 -1
  15. package/dist/epistemicAnswers.js +64 -11
  16. package/dist/epistemicAnswers.js.map +1 -1
  17. package/dist/epistemicBeliefs.admin.js +46 -0
  18. package/dist/epistemicBeliefs.admin.js.map +1 -1
  19. package/dist/epistemicBeliefs.backfills.js +46 -0
  20. package/dist/epistemicBeliefs.backfills.js.map +1 -1
  21. package/dist/epistemicBeliefs.confidence.d.ts +1 -1
  22. package/dist/epistemicBeliefs.confidence.js +53 -6
  23. package/dist/epistemicBeliefs.confidence.js.map +1 -1
  24. package/dist/epistemicBeliefs.core.js +91 -11
  25. package/dist/epistemicBeliefs.core.js.map +1 -1
  26. package/dist/epistemicBeliefs.d.ts +1 -1
  27. package/dist/epistemicBeliefs.forkEvidence.js.map +1 -1
  28. package/dist/epistemicBeliefs.helpers.d.ts +2 -2
  29. package/dist/epistemicBeliefs.helpers.js +46 -0
  30. package/dist/epistemicBeliefs.helpers.js.map +1 -1
  31. package/dist/epistemicBeliefs.internal.js +90 -10
  32. package/dist/epistemicBeliefs.internal.js.map +1 -1
  33. package/dist/epistemicBeliefs.js +103 -22
  34. package/dist/epistemicBeliefs.js.map +1 -1
  35. package/dist/epistemicBeliefs.lifecycle.js +53 -6
  36. package/dist/epistemicBeliefs.lifecycle.js.map +1 -1
  37. package/dist/epistemicBeliefs.links.js +85 -4
  38. package/dist/epistemicBeliefs.links.js.map +1 -1
  39. package/dist/epistemicBeliefs.topicAnchor.js +39 -8
  40. package/dist/epistemicBeliefs.topicAnchor.js.map +1 -1
  41. package/dist/epistemicContracts.evaluators.js +53 -6
  42. package/dist/epistemicContracts.evaluators.js.map +1 -1
  43. package/dist/epistemicContracts.handlers.js +54 -10
  44. package/dist/epistemicContracts.handlers.js.map +1 -1
  45. package/dist/epistemicContracts.js +54 -10
  46. package/dist/epistemicContracts.js.map +1 -1
  47. package/dist/epistemicEdges.d.ts +1 -1
  48. package/dist/epistemicEdges.handlers.js +48 -3
  49. package/dist/epistemicEdges.handlers.js.map +1 -1
  50. package/dist/epistemicEdges.helpers.d.ts +3 -3
  51. package/dist/epistemicEdges.js +162 -4
  52. package/dist/epistemicEdges.js.map +1 -1
  53. package/dist/epistemicEdges.mutations.js +112 -1
  54. package/dist/epistemicEdges.mutations.js.map +1 -1
  55. package/dist/epistemicEdges.queries.js +46 -0
  56. package/dist/epistemicEdges.queries.js.map +1 -1
  57. package/dist/epistemicEdges.types.d.ts +1 -1
  58. package/dist/epistemicEvidence.d.ts +1 -1
  59. package/dist/epistemicEvidence.js +168 -14
  60. package/dist/epistemicEvidence.js.map +1 -1
  61. package/dist/epistemicEvidenceHelpers.d.ts +1 -1
  62. package/dist/epistemicEvidenceHelpers.js +46 -0
  63. package/dist/epistemicEvidenceHelpers.js.map +1 -1
  64. package/dist/epistemicEvidenceMutations.js +168 -14
  65. package/dist/epistemicEvidenceMutations.js.map +1 -1
  66. package/dist/epistemicEvidenceQueries.js +46 -0
  67. package/dist/epistemicEvidenceQueries.js.map +1 -1
  68. package/dist/epistemicHelpers.js +11 -6
  69. package/dist/epistemicHelpers.js.map +1 -1
  70. package/dist/epistemicInsert.d.ts +8 -0
  71. package/dist/epistemicInsert.js +45 -0
  72. package/dist/epistemicInsert.js.map +1 -0
  73. package/dist/epistemicNodeCreation.js +11 -6
  74. package/dist/epistemicNodeCreation.js.map +1 -1
  75. package/dist/epistemicNodes.helpers.d.ts +1 -1
  76. package/dist/epistemicNodes.internal.js +53 -1
  77. package/dist/epistemicNodes.internal.js.map +1 -1
  78. package/dist/epistemicNodes.js +56 -4
  79. package/dist/epistemicNodes.js.map +1 -1
  80. package/dist/epistemicNodes.mutations.js +55 -3
  81. package/dist/epistemicNodes.mutations.js.map +1 -1
  82. package/dist/epistemicNodes.queries.js +46 -0
  83. package/dist/epistemicNodes.queries.js.map +1 -1
  84. package/dist/epistemicNodes.validators.d.ts +1 -1
  85. package/dist/epistemicQuestions.conviction.js +46 -0
  86. package/dist/epistemicQuestions.conviction.js.map +1 -1
  87. package/dist/epistemicQuestions.create.js +58 -7
  88. package/dist/epistemicQuestions.create.js.map +1 -1
  89. package/dist/epistemicQuestions.d.ts +1 -1
  90. package/dist/epistemicQuestions.evidence.js +53 -2
  91. package/dist/epistemicQuestions.evidence.js.map +1 -1
  92. package/dist/epistemicQuestions.helpers.d.ts +1 -1
  93. package/dist/epistemicQuestions.helpers.js +46 -0
  94. package/dist/epistemicQuestions.helpers.js.map +1 -1
  95. package/dist/epistemicQuestions.js +60 -9
  96. package/dist/epistemicQuestions.js.map +1 -1
  97. package/dist/epistemicQuestions.lifecycle.js +46 -0
  98. package/dist/epistemicQuestions.lifecycle.js.map +1 -1
  99. package/dist/epistemicQuestions.queries.js +46 -0
  100. package/dist/epistemicQuestions.queries.js.map +1 -1
  101. package/dist/epistemicQuestions.sprint.js +46 -0
  102. package/dist/epistemicQuestions.sprint.js.map +1 -1
  103. package/dist/epistemicQuestions.tail.js +53 -2
  104. package/dist/epistemicQuestions.tail.js.map +1 -1
  105. package/dist/epistemicSources.js +53 -2
  106. package/dist/epistemicSources.js.map +1 -1
  107. package/dist/helpers.js +66 -1
  108. package/dist/helpers.js.map +1 -1
  109. package/dist/index.d.ts +1 -1
  110. package/dist/index.js +304 -76
  111. package/dist/index.js.map +1 -1
  112. package/dist/proof-attestation.json +1 -1
  113. package/dist/questionEvidenceLinks.js +46 -0
  114. package/dist/questionEvidenceLinks.js.map +1 -1
  115. package/dist/scopeResolverCompat.d.ts +1 -1
  116. package/dist/scopeResolverCompat.js +46 -0
  117. package/dist/scopeResolverCompat.js.map +1 -1
  118. package/dist/{topicScope-By_zp4tt.d.ts → topicScope-7zhyeGl7.d.ts} +1 -1
  119. package/dist/topicScope.d.ts +1 -1
  120. package/dist/topicScope.js +46 -0
  121. package/dist/topicScope.js.map +1 -1
  122. package/dist/workflowBridge.js +46 -0
  123. package/dist/workflowBridge.js.map +1 -1
  124. package/dist/workspaceIsolation.d.ts +1 -1
  125. package/dist/workspaceIsolation.js +46 -0
  126. package/dist/workspaceIsolation.js.map +1 -1
  127. package/package.json +4 -4
@@ -7,7 +7,8 @@ import { componentsGeneric, anyApi, internalMutationGeneric, mutationGeneric, qu
7
7
  import { isNodeType, getLayerForNodeType } from '@lucern/contracts/schema-helpers/spine/tables/epistemicNodes';
8
8
  import { permissiveReturn } from '@lucern/contracts/schema-helpers/validators';
9
9
  import { assertSchemaEnumValue } from '@lucern/contracts/schema-helpers/enumValidation';
10
- import { generateGlobalId, generateUuidV7 } from '@lucern/contracts/ids';
10
+ import { generateGlobalId, assertUuidV7Identity, generateUuidV7, assertStorageEdgeVocabulary, assertCanonicalEdgeEndpoint } from '@lucern/contracts/ids';
11
+ import { assertEdgePolicyAllowed, edgePolicyManifest } from '@lucern/contracts';
11
12
  import { listAudienceRegistryRows } from '@lucern/access-control/audienceRegistry';
12
13
 
13
14
  // src/epistemicBeliefs.helpers.ts
@@ -479,6 +480,35 @@ function resolveGraphPrimitivesAppResolvers(_ctx) {
479
480
  };
480
481
  }
481
482
  var LEGACY_SCOPE_FIELD2 = "graphScopeProjectId";
483
+ async function resolveTopicNodeScopeOrNull(ctx, ref) {
484
+ if (!ctx?.db || typeof ctx.db.query !== "function") {
485
+ return null;
486
+ }
487
+ let node = null;
488
+ try {
489
+ const byGlobalId = await ctx.db.query("epistemicNodes").withIndex("by_globalId", (q) => q.eq("globalId", ref)).first();
490
+ if (byGlobalId && byGlobalId.nodeType === "topic") {
491
+ node = byGlobalId;
492
+ }
493
+ } catch (error) {
494
+ debugGraphPrimitiveFallback(
495
+ "[topicScope] topic-node scope lookup by globalId failed",
496
+ { error, ref }
497
+ );
498
+ }
499
+ if (!node) {
500
+ return null;
501
+ }
502
+ const scopeKey = normalizeScopeValue(node.topicId) ?? normalizeScopeValue(node.globalId);
503
+ if (!scopeKey) {
504
+ return null;
505
+ }
506
+ return {
507
+ topicId: scopeKey,
508
+ projectId: asMappedProjectId(node),
509
+ source: "topic_node"
510
+ };
511
+ }
482
512
  function asMappedProjectId(topic) {
483
513
  if (!topic) {
484
514
  return;
@@ -619,6 +649,13 @@ async function resolveTopicProjectScope(ctx, args) {
619
649
  ) ?? null;
620
650
  }
621
651
  if (!topic) {
652
+ const nodeScope = await resolveTopicNodeScopeOrNull(
653
+ ctx,
654
+ String(args.topicId)
655
+ );
656
+ if (nodeScope) {
657
+ return nodeScope;
658
+ }
622
659
  throw new Error(`Topic not found: ${String(args.topicId)}`);
623
660
  }
624
661
  const inherited = await resolveInheritedWorkspaceScope(ctx, topic);
@@ -689,6 +726,16 @@ async function resolveTopicProjectScope(ctx, args) {
689
726
  source: "project_mapped_topic"
690
727
  };
691
728
  }
729
+ const nodeScope = await resolveTopicNodeScopeOrNull(
730
+ ctx,
731
+ String(args.projectId)
732
+ );
733
+ if (nodeScope) {
734
+ return {
735
+ ...nodeScope,
736
+ projectId: nodeScope.projectId ?? String(args.projectId)
737
+ };
738
+ }
692
739
  throw new Error(
693
740
  `Legacy project scope ${String(args.projectId)} has no mapped topic.`
694
741
  );
@@ -1870,14 +1917,14 @@ async function applyBeliefConfidenceChange(ctx, args) {
1870
1917
  beliefConfidenceId
1871
1918
  };
1872
1919
  }
1873
- function propagationTriggerForEdge(edgeType, weight) {
1920
+ function propagationPressureLabel(edgeType, weight) {
1874
1921
  if (edgeType === "contradicts" || edgeType === "refutes") {
1875
- return "contradiction_detected";
1922
+ return "contradictory";
1876
1923
  }
1877
1924
  if ((edgeType === "supports" || edgeType === "informs") && weight < 0) {
1878
- return "contradiction_detected";
1925
+ return "contradictory";
1879
1926
  }
1880
- return "evidence_added";
1927
+ return "supportive";
1881
1928
  }
1882
1929
  var propagateConfidenceChange = internalMutation({
1883
1930
  args: {
@@ -1914,14 +1961,15 @@ var propagateConfidenceChange = internalMutation({
1914
1961
  getNode: async (nodeId) => await ctx.db.get(nodeId)
1915
1962
  });
1916
1963
  for (const dispatch of dispatches) {
1964
+ const pressureLabel = propagationPressureLabel(dispatch.edgeType, dispatch.weight);
1917
1965
  await applyBeliefConfidenceChange(ctx, {
1918
1966
  nodeId: dispatch.targetNodeId,
1919
1967
  belief: dispatch.opinion.b,
1920
1968
  disbelief: dispatch.opinion.d,
1921
1969
  uncertainty: dispatch.opinion.u,
1922
1970
  baseRate: dispatch.opinion.a,
1923
- trigger: propagationTriggerForEdge(dispatch.edgeType, dispatch.weight),
1924
- rationale: `SL propagation via ${dispatch.edgeType} edge: ${dispatch.rationale}`,
1971
+ trigger: "propagation",
1972
+ rationale: `SL propagation via ${dispatch.edgeType} edge (pressure: ${pressureLabel}): ${dispatch.rationale}`,
1925
1973
  authenticatedUserId: args.userId,
1926
1974
  slOperator: dispatch.operator
1927
1975
  });
@@ -2033,6 +2081,43 @@ async function resolveForkTriggerEvidence(ctx, args) {
2033
2081
  }
2034
2082
  return { evidenceNodeId: args.triggeringEvidenceId, relation };
2035
2083
  }
2084
+ async function insertEpistemicNode(ctx, doc) {
2085
+ assertUuidV7Identity("epistemicNodes", doc.globalId);
2086
+ return ctx.db.insert("epistemicNodes", doc);
2087
+ }
2088
+ async function insertEpistemicEdge(ctx, doc) {
2089
+ assertUuidV7Identity("epistemicEdges", doc.globalId);
2090
+ assertStorageEdgeVocabulary(doc.edgeType);
2091
+ if (!doc.fromNodeId || typeof doc.fromNodeId !== "string") {
2092
+ throw new Error(
2093
+ "edge_endpoint_missing: epistemicEdges insert requires a non-empty fromNodeId"
2094
+ );
2095
+ }
2096
+ if (!doc.toNodeId || typeof doc.toNodeId !== "string") {
2097
+ throw new Error(
2098
+ "edge_endpoint_missing: epistemicEdges insert requires a non-empty toNodeId"
2099
+ );
2100
+ }
2101
+ assertCanonicalEdgeEndpoint("fromNodeId", doc.fromNodeId);
2102
+ assertCanonicalEdgeEndpoint("toNodeId", doc.toNodeId);
2103
+ if (doc.fromNodeType && doc.toNodeType && doc.edgeType !== "extracted_from") {
2104
+ assertEdgePolicyAllowed(
2105
+ edgePolicyManifest,
2106
+ doc.edgeType,
2107
+ {
2108
+ kind: "epistemic_node",
2109
+ nodeId: doc.fromNodeId,
2110
+ nodeType: doc.fromNodeType
2111
+ },
2112
+ {
2113
+ kind: "epistemic_node",
2114
+ nodeId: doc.toNodeId,
2115
+ nodeType: doc.toNodeType
2116
+ }
2117
+ );
2118
+ }
2119
+ return ctx.db.insert("epistemicEdges", doc);
2120
+ }
2036
2121
 
2037
2122
  // src/epistemicBeliefs.topicAnchor.ts
2038
2123
  function cleanString(value) {
@@ -2084,18 +2169,15 @@ async function createRequiredBeliefTopicEdge(ctx, args) {
2084
2169
  const now = Date.now();
2085
2170
  const existingEdges = await ctx.db.query("epistemicEdges").withIndex(
2086
2171
  "by_from_to",
2087
- (q) => q.eq("fromNodeId", String(args.beliefNodeId)).eq(
2088
- "toNodeId",
2089
- String(args.topicNode._id)
2090
- )
2172
+ (q) => q.eq("fromNodeId", args.beliefGlobalId).eq("toNodeId", topicGlobalId)
2091
2173
  ).collect();
2092
2174
  const existing = existingEdges.find((edge) => edge.edgeType === "belongs_to");
2093
2175
  const edgeGlobalId = cleanString(existing?.globalId) ?? generateUuidV7();
2094
2176
  if (!existing) {
2095
- await ctx.db.insert("epistemicEdges", {
2177
+ await insertEpistemicEdge(ctx, {
2096
2178
  globalId: edgeGlobalId,
2097
- fromNodeId: String(args.beliefNodeId),
2098
- toNodeId: String(args.topicNode._id),
2179
+ fromNodeId: args.beliefGlobalId,
2180
+ toNodeId: topicGlobalId,
2099
2181
  sourceGlobalId: args.beliefGlobalId,
2100
2182
  targetGlobalId: topicGlobalId,
2101
2183
  edgeType: "belongs_to",
@@ -2274,7 +2356,7 @@ var create = mutation({
2274
2356
  const pillar = normalizePillar(args.pillar);
2275
2357
  const additionalMeta = args.metadata || {};
2276
2358
  const beliefGlobalId = generateGlobalId();
2277
- const nodeId = await ctx.db.insert("epistemicNodes", {
2359
+ const nodeId = await insertEpistemicNode(ctx, {
2278
2360
  globalId: beliefGlobalId,
2279
2361
  nodeType: "belief",
2280
2362
  epistemicLayer: "L3",
@@ -2332,7 +2414,6 @@ var create = mutation({
2332
2414
  })
2333
2415
  );
2334
2416
  await createRequiredBeliefTopicEdge(ctx, {
2335
- beliefNodeId: nodeId,
2336
2417
  beliefGlobalId,
2337
2418
  topicNode,
2338
2419
  createdBy: authenticatedUserId
@@ -2747,7 +2828,7 @@ var forkBelief = mutation({
2747
2828
  });
2748
2829
  }
2749
2830
  const newBeliefGlobalId = generateGlobalId();
2750
- const newNodeId = await ctx.db.insert("epistemicNodes", {
2831
+ const newNodeId = await insertEpistemicNode(ctx, {
2751
2832
  globalId: newBeliefGlobalId,
2752
2833
  nodeType: "belief",
2753
2834
  epistemicLayer: "L3",
@@ -3531,10 +3612,11 @@ var linkEvidence = mutation({
3531
3612
  const edgeType = "informs";
3532
3613
  const logicalRole = evidenceNodeId ? await computeLogicalRole(ctx, evidenceNodeId, args.beliefNodeId) : "contributory";
3533
3614
  const edgeGlobalId = generateGlobalId();
3534
- await ctx.db.insert("epistemicEdges", {
3615
+ await insertEpistemicEdge(ctx, {
3535
3616
  globalId: edgeGlobalId,
3536
- fromNodeId: evidenceNodeId,
3537
- toNodeId: args.beliefNodeId,
3617
+ // C2-RR.4 Defect E — canonical UUIDv7 endpoints, not Convex doc ids.
3618
+ fromNodeId: evidenceGlobalId,
3619
+ toNodeId: belief.globalId,
3538
3620
  sourceGlobalId: evidenceGlobalId,
3539
3621
  targetGlobalId: belief.globalId,
3540
3622
  edgeType,
@@ -4330,7 +4412,7 @@ var internalCreate = internalMutation({
4330
4412
  opinion_u: 1,
4331
4413
  opinion_a: baseRate
4332
4414
  };
4333
- const nodeId = await ctx.db.insert("epistemicNodes", {
4415
+ const nodeId = await insertEpistemicNode(ctx, {
4334
4416
  globalId,
4335
4417
  topicId: scope.topicId,
4336
4418
  projectId: scope.projectId,
@@ -4386,7 +4468,6 @@ var internalCreate = internalMutation({
4386
4468
  })
4387
4469
  );
4388
4470
  await createRequiredBeliefTopicEdge(ctx, {
4389
- beliefNodeId: nodeId,
4390
4471
  beliefGlobalId: globalId,
4391
4472
  topicNode,
4392
4473
  createdBy: args.userId