@lucern/graph-primitives 1.0.22 → 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 { normalizeTupleContradictionPolicy, createInheritedContractRecord, confi
7
7
  import '@lucern/access-control/audience';
8
8
  import { getCurrentUserId } from '@lucern/access-control/auth';
9
9
  import { isNodeType, getLayerForNodeType } from '@lucern/contracts/schema-helpers/spine/tables/epistemicNodes';
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
 
12
13
  // src/epistemicBeliefs.core.ts
13
14
 
@@ -466,6 +467,35 @@ function resolveGraphPrimitivesAppResolvers(_ctx) {
466
467
  };
467
468
  }
468
469
  var LEGACY_SCOPE_FIELD2 = "graphScopeProjectId";
470
+ async function resolveTopicNodeScopeOrNull(ctx, ref) {
471
+ if (!ctx?.db || typeof ctx.db.query !== "function") {
472
+ return null;
473
+ }
474
+ let node = null;
475
+ try {
476
+ const byGlobalId = await ctx.db.query("epistemicNodes").withIndex("by_globalId", (q) => q.eq("globalId", ref)).first();
477
+ if (byGlobalId && byGlobalId.nodeType === "topic") {
478
+ node = byGlobalId;
479
+ }
480
+ } catch (error) {
481
+ debugGraphPrimitiveFallback(
482
+ "[topicScope] topic-node scope lookup by globalId failed",
483
+ { error, ref }
484
+ );
485
+ }
486
+ if (!node) {
487
+ return null;
488
+ }
489
+ const scopeKey = normalizeScopeValue(node.topicId) ?? normalizeScopeValue(node.globalId);
490
+ if (!scopeKey) {
491
+ return null;
492
+ }
493
+ return {
494
+ topicId: scopeKey,
495
+ projectId: asMappedProjectId(node),
496
+ source: "topic_node"
497
+ };
498
+ }
469
499
  function asMappedProjectId(topic) {
470
500
  if (!topic) {
471
501
  return;
@@ -606,6 +636,13 @@ async function resolveTopicProjectScope(ctx, args) {
606
636
  ) ?? null;
607
637
  }
608
638
  if (!topic) {
639
+ const nodeScope = await resolveTopicNodeScopeOrNull(
640
+ ctx,
641
+ String(args.topicId)
642
+ );
643
+ if (nodeScope) {
644
+ return nodeScope;
645
+ }
609
646
  throw new Error(`Topic not found: ${String(args.topicId)}`);
610
647
  }
611
648
  const inherited = await resolveInheritedWorkspaceScope(ctx, topic);
@@ -676,6 +713,16 @@ async function resolveTopicProjectScope(ctx, args) {
676
713
  source: "project_mapped_topic"
677
714
  };
678
715
  }
716
+ const nodeScope = await resolveTopicNodeScopeOrNull(
717
+ ctx,
718
+ String(args.projectId)
719
+ );
720
+ if (nodeScope) {
721
+ return {
722
+ ...nodeScope,
723
+ projectId: nodeScope.projectId ?? String(args.projectId)
724
+ };
725
+ }
679
726
  throw new Error(
680
727
  `Legacy project scope ${String(args.projectId)} has no mapped topic.`
681
728
  );
@@ -1023,6 +1070,43 @@ async function resolveForkTriggerEvidence(ctx, args) {
1023
1070
  }
1024
1071
  return { evidenceNodeId: args.triggeringEvidenceId, relation };
1025
1072
  }
1073
+ async function insertEpistemicNode(ctx, doc) {
1074
+ assertUuidV7Identity("epistemicNodes", doc.globalId);
1075
+ return ctx.db.insert("epistemicNodes", doc);
1076
+ }
1077
+ async function insertEpistemicEdge(ctx, doc) {
1078
+ assertUuidV7Identity("epistemicEdges", doc.globalId);
1079
+ assertStorageEdgeVocabulary(doc.edgeType);
1080
+ if (!doc.fromNodeId || typeof doc.fromNodeId !== "string") {
1081
+ throw new Error(
1082
+ "edge_endpoint_missing: epistemicEdges insert requires a non-empty fromNodeId"
1083
+ );
1084
+ }
1085
+ if (!doc.toNodeId || typeof doc.toNodeId !== "string") {
1086
+ throw new Error(
1087
+ "edge_endpoint_missing: epistemicEdges insert requires a non-empty toNodeId"
1088
+ );
1089
+ }
1090
+ assertCanonicalEdgeEndpoint("fromNodeId", doc.fromNodeId);
1091
+ assertCanonicalEdgeEndpoint("toNodeId", doc.toNodeId);
1092
+ if (doc.fromNodeType && doc.toNodeType && doc.edgeType !== "extracted_from") {
1093
+ assertEdgePolicyAllowed(
1094
+ edgePolicyManifest,
1095
+ doc.edgeType,
1096
+ {
1097
+ kind: "epistemic_node",
1098
+ nodeId: doc.fromNodeId,
1099
+ nodeType: doc.fromNodeType
1100
+ },
1101
+ {
1102
+ kind: "epistemic_node",
1103
+ nodeId: doc.toNodeId,
1104
+ nodeType: doc.toNodeType
1105
+ }
1106
+ );
1107
+ }
1108
+ return ctx.db.insert("epistemicEdges", doc);
1109
+ }
1026
1110
 
1027
1111
  // src/epistemicBeliefs.topicAnchor.ts
1028
1112
  function cleanString(value) {
@@ -1074,18 +1158,15 @@ async function createRequiredBeliefTopicEdge(ctx, args) {
1074
1158
  const now = Date.now();
1075
1159
  const existingEdges = await ctx.db.query("epistemicEdges").withIndex(
1076
1160
  "by_from_to",
1077
- (q) => q.eq("fromNodeId", String(args.beliefNodeId)).eq(
1078
- "toNodeId",
1079
- String(args.topicNode._id)
1080
- )
1161
+ (q) => q.eq("fromNodeId", args.beliefGlobalId).eq("toNodeId", topicGlobalId)
1081
1162
  ).collect();
1082
1163
  const existing = existingEdges.find((edge) => edge.edgeType === "belongs_to");
1083
1164
  const edgeGlobalId = cleanString(existing?.globalId) ?? generateUuidV7();
1084
1165
  if (!existing) {
1085
- await ctx.db.insert("epistemicEdges", {
1166
+ await insertEpistemicEdge(ctx, {
1086
1167
  globalId: edgeGlobalId,
1087
- fromNodeId: String(args.beliefNodeId),
1088
- toNodeId: String(args.topicNode._id),
1168
+ fromNodeId: args.beliefGlobalId,
1169
+ toNodeId: topicGlobalId,
1089
1170
  sourceGlobalId: args.beliefGlobalId,
1090
1171
  targetGlobalId: topicGlobalId,
1091
1172
  edgeType: "belongs_to",
@@ -1264,7 +1345,7 @@ var create = mutation({
1264
1345
  const pillar = normalizePillar(args.pillar);
1265
1346
  const additionalMeta = args.metadata || {};
1266
1347
  const beliefGlobalId = generateGlobalId();
1267
- const nodeId = await ctx.db.insert("epistemicNodes", {
1348
+ const nodeId = await insertEpistemicNode(ctx, {
1268
1349
  globalId: beliefGlobalId,
1269
1350
  nodeType: "belief",
1270
1351
  epistemicLayer: "L3",
@@ -1322,7 +1403,6 @@ var create = mutation({
1322
1403
  })
1323
1404
  );
1324
1405
  await createRequiredBeliefTopicEdge(ctx, {
1325
- beliefNodeId: nodeId,
1326
1406
  beliefGlobalId,
1327
1407
  topicNode,
1328
1408
  createdBy: authenticatedUserId
@@ -1737,7 +1817,7 @@ var forkBelief = mutation({
1737
1817
  });
1738
1818
  }
1739
1819
  const newBeliefGlobalId = generateGlobalId();
1740
- const newNodeId = await ctx.db.insert("epistemicNodes", {
1820
+ const newNodeId = await insertEpistemicNode(ctx, {
1741
1821
  globalId: newBeliefGlobalId,
1742
1822
  nodeType: "belief",
1743
1823
  epistemicLayer: "L3",