@lucern/graph-primitives 1.0.22 → 1.0.24

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 (136) hide show
  1. package/dist/beliefDecay.js +49 -0
  2. package/dist/beliefDecay.js.map +1 -1
  3. package/dist/beliefEvidenceLinks.js +99 -5
  4. package/dist/beliefEvidenceLinks.js.map +1 -1
  5. package/dist/beliefEvidenceLinks.operational.js +50 -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/entityCanonicalMatch.d.ts +40 -0
  14. package/dist/entityCanonicalMatch.js +33 -0
  15. package/dist/entityCanonicalMatch.js.map +1 -0
  16. package/dist/entityLifecycle.js +149 -39
  17. package/dist/entityLifecycle.js.map +1 -1
  18. package/dist/epistemicAnswers.js +64 -11
  19. package/dist/epistemicAnswers.js.map +1 -1
  20. package/dist/epistemicBeliefs.admin.js +63 -6
  21. package/dist/epistemicBeliefs.admin.js.map +1 -1
  22. package/dist/epistemicBeliefs.backfills.js +59 -2
  23. package/dist/epistemicBeliefs.backfills.js.map +1 -1
  24. package/dist/epistemicBeliefs.confidence.d.ts +1 -1
  25. package/dist/epistemicBeliefs.confidence.js +70 -12
  26. package/dist/epistemicBeliefs.confidence.js.map +1 -1
  27. package/dist/epistemicBeliefs.core.js +120 -17
  28. package/dist/epistemicBeliefs.core.js.map +1 -1
  29. package/dist/epistemicBeliefs.d.ts +1 -1
  30. package/dist/epistemicBeliefs.forkEvidence.js +13 -2
  31. package/dist/epistemicBeliefs.forkEvidence.js.map +1 -1
  32. package/dist/epistemicBeliefs.helpers.d.ts +18 -3
  33. package/dist/epistemicBeliefs.helpers.js +66 -6
  34. package/dist/epistemicBeliefs.helpers.js.map +1 -1
  35. package/dist/epistemicBeliefs.internal.js +115 -12
  36. package/dist/epistemicBeliefs.internal.js.map +1 -1
  37. package/dist/epistemicBeliefs.js +132 -28
  38. package/dist/epistemicBeliefs.js.map +1 -1
  39. package/dist/epistemicBeliefs.lifecycle.js +70 -12
  40. package/dist/epistemicBeliefs.lifecycle.js.map +1 -1
  41. package/dist/epistemicBeliefs.links.js +111 -10
  42. package/dist/epistemicBeliefs.links.js.map +1 -1
  43. package/dist/epistemicBeliefs.topicAnchor.js +48 -8
  44. package/dist/epistemicBeliefs.topicAnchor.js.map +1 -1
  45. package/dist/epistemicContracts.evaluators.js +70 -12
  46. package/dist/epistemicContracts.evaluators.js.map +1 -1
  47. package/dist/epistemicContracts.handlers.js +71 -16
  48. package/dist/epistemicContracts.handlers.js.map +1 -1
  49. package/dist/epistemicContracts.js +71 -16
  50. package/dist/epistemicContracts.js.map +1 -1
  51. package/dist/epistemicEdges.d.ts +1 -1
  52. package/dist/epistemicEdges.handlers.js +57 -3
  53. package/dist/epistemicEdges.handlers.js.map +1 -1
  54. package/dist/epistemicEdges.helpers.d.ts +2 -2
  55. package/dist/epistemicEdges.js +174 -4
  56. package/dist/epistemicEdges.js.map +1 -1
  57. package/dist/epistemicEdges.mutations.js +115 -1
  58. package/dist/epistemicEdges.mutations.js.map +1 -1
  59. package/dist/epistemicEdges.queries.js +46 -0
  60. package/dist/epistemicEdges.queries.js.map +1 -1
  61. package/dist/epistemicEdges.types.d.ts +1 -1
  62. package/dist/epistemicEvidence.d.ts +1 -1
  63. package/dist/epistemicEvidence.js +180 -14
  64. package/dist/epistemicEvidence.js.map +1 -1
  65. package/dist/epistemicEvidenceHelpers.d.ts +1 -1
  66. package/dist/epistemicEvidenceHelpers.js +49 -0
  67. package/dist/epistemicEvidenceHelpers.js.map +1 -1
  68. package/dist/epistemicEvidenceMutations.js +180 -14
  69. package/dist/epistemicEvidenceMutations.js.map +1 -1
  70. package/dist/epistemicEvidenceQueries.js +49 -0
  71. package/dist/epistemicEvidenceQueries.js.map +1 -1
  72. package/dist/epistemicHelpers.js +11 -6
  73. package/dist/epistemicHelpers.js.map +1 -1
  74. package/dist/epistemicInsert.d.ts +8 -0
  75. package/dist/epistemicInsert.js +54 -0
  76. package/dist/epistemicInsert.js.map +1 -0
  77. package/dist/epistemicNodeCreation.js +11 -6
  78. package/dist/epistemicNodeCreation.js.map +1 -1
  79. package/dist/epistemicNodes.helpers.d.ts +1 -1
  80. package/dist/epistemicNodes.internal.js +53 -1
  81. package/dist/epistemicNodes.internal.js.map +1 -1
  82. package/dist/epistemicNodes.js +56 -4
  83. package/dist/epistemicNodes.js.map +1 -1
  84. package/dist/epistemicNodes.mutations.js +55 -3
  85. package/dist/epistemicNodes.mutations.js.map +1 -1
  86. package/dist/epistemicNodes.queries.js +46 -0
  87. package/dist/epistemicNodes.queries.js.map +1 -1
  88. package/dist/epistemicNodes.validators.d.ts +1 -1
  89. package/dist/epistemicQuestions.conviction.js +49 -0
  90. package/dist/epistemicQuestions.conviction.js.map +1 -1
  91. package/dist/epistemicQuestions.create.js +61 -7
  92. package/dist/epistemicQuestions.create.js.map +1 -1
  93. package/dist/epistemicQuestions.d.ts +1 -1
  94. package/dist/epistemicQuestions.evidence.js +56 -2
  95. package/dist/epistemicQuestions.evidence.js.map +1 -1
  96. package/dist/epistemicQuestions.helpers.d.ts +1 -1
  97. package/dist/epistemicQuestions.helpers.js +49 -0
  98. package/dist/epistemicQuestions.helpers.js.map +1 -1
  99. package/dist/epistemicQuestions.js +63 -9
  100. package/dist/epistemicQuestions.js.map +1 -1
  101. package/dist/epistemicQuestions.lifecycle.js +49 -0
  102. package/dist/epistemicQuestions.lifecycle.js.map +1 -1
  103. package/dist/epistemicQuestions.queries.js +49 -0
  104. package/dist/epistemicQuestions.queries.js.map +1 -1
  105. package/dist/epistemicQuestions.sprint.js +46 -0
  106. package/dist/epistemicQuestions.sprint.js.map +1 -1
  107. package/dist/epistemicQuestions.tail.js +56 -2
  108. package/dist/epistemicQuestions.tail.js.map +1 -1
  109. package/dist/epistemicSources.js +53 -2
  110. package/dist/epistemicSources.js.map +1 -1
  111. package/dist/helpers.js +66 -1
  112. package/dist/helpers.js.map +1 -1
  113. package/dist/index.d.ts +1 -1
  114. package/dist/index.js +379 -115
  115. package/dist/index.js.map +1 -1
  116. package/dist/proof-attestation.json +1 -1
  117. package/dist/questionEvidenceLinks.js +49 -0
  118. package/dist/questionEvidenceLinks.js.map +1 -1
  119. package/dist/resolvers.js +3 -0
  120. package/dist/resolvers.js.map +1 -1
  121. package/dist/scopeResolverCompat.d.ts +1 -1
  122. package/dist/scopeResolverCompat.js +46 -0
  123. package/dist/scopeResolverCompat.js.map +1 -1
  124. package/dist/topicProjectOverlay.d.ts +4 -0
  125. package/dist/topicProjectOverlay.js +3 -0
  126. package/dist/topicProjectOverlay.js.map +1 -1
  127. package/dist/{topicScope-By_zp4tt.d.ts → topicScope-7zhyeGl7.d.ts} +1 -1
  128. package/dist/topicScope.d.ts +1 -1
  129. package/dist/topicScope.js +46 -0
  130. package/dist/topicScope.js.map +1 -1
  131. package/dist/workflowBridge.js +46 -0
  132. package/dist/workflowBridge.js.map +1 -1
  133. package/dist/workspaceIsolation.d.ts +1 -1
  134. package/dist/workspaceIsolation.js +46 -0
  135. package/dist/workspaceIsolation.js.map +1 -1
  136. package/package.json +4 -4
@@ -2,8 +2,9 @@ import { v } from 'convex/values';
2
2
  import { checkProjectAccess, checkScopeAccess } from '@lucern/access-control/access';
3
3
  import { permissiveReturn } from '@lucern/contracts/schema-helpers/validators';
4
4
  import { componentsGeneric, anyApi, mutationGeneric, internalMutationGeneric } from 'convex/server';
5
- import { generateGlobalId } from '@lucern/contracts/ids';
5
+ import { generateGlobalId, assertUuidV7Identity } from '@lucern/contracts/ids';
6
6
  import { isNodeType, getLayerForNodeType } from '@lucern/contracts/schema-helpers/spine/tables/epistemicNodes';
7
+ import '@lucern/contracts';
7
8
 
8
9
  // src/epistemicQuestions.create.ts
9
10
  var api = anyApi;
@@ -53,6 +54,35 @@ async function scheduleEmbeddingGeneration(args) {
53
54
  }
54
55
  }
55
56
  var LEGACY_SCOPE_FIELD = "graphScopeProjectId";
57
+ async function resolveTopicNodeScopeOrNull(ctx, ref) {
58
+ if (!ctx?.db || typeof ctx.db.query !== "function") {
59
+ return null;
60
+ }
61
+ let node = null;
62
+ try {
63
+ const byGlobalId = await ctx.db.query("epistemicNodes").withIndex("by_globalId", (q) => q.eq("globalId", ref)).first();
64
+ if (byGlobalId && byGlobalId.nodeType === "topic") {
65
+ node = byGlobalId;
66
+ }
67
+ } catch (error) {
68
+ debugGraphPrimitiveFallback(
69
+ "[topicScope] topic-node scope lookup by globalId failed",
70
+ { error, ref }
71
+ );
72
+ }
73
+ if (!node) {
74
+ return null;
75
+ }
76
+ const scopeKey = normalizeScopeValue(node.topicId) ?? normalizeScopeValue(node.globalId);
77
+ if (!scopeKey) {
78
+ return null;
79
+ }
80
+ return {
81
+ topicId: scopeKey,
82
+ projectId: asMappedProjectId(node),
83
+ source: "topic_node"
84
+ };
85
+ }
56
86
  function asMappedProjectId(topic) {
57
87
  if (!topic) {
58
88
  return;
@@ -193,6 +223,13 @@ async function resolveTopicProjectScope(ctx, args) {
193
223
  ) ?? null;
194
224
  }
195
225
  if (!topic) {
226
+ const nodeScope = await resolveTopicNodeScopeOrNull(
227
+ ctx,
228
+ String(args.topicId)
229
+ );
230
+ if (nodeScope) {
231
+ return nodeScope;
232
+ }
196
233
  throw new Error(`Topic not found: ${String(args.topicId)}`);
197
234
  }
198
235
  const inherited = await resolveInheritedWorkspaceScope(ctx, topic);
@@ -263,6 +300,16 @@ async function resolveTopicProjectScope(ctx, args) {
263
300
  source: "project_mapped_topic"
264
301
  };
265
302
  }
303
+ const nodeScope = await resolveTopicNodeScopeOrNull(
304
+ ctx,
305
+ String(args.projectId)
306
+ );
307
+ if (nodeScope) {
308
+ return {
309
+ ...nodeScope,
310
+ projectId: nodeScope.projectId ?? String(args.projectId)
311
+ };
312
+ }
266
313
  throw new Error(
267
314
  `Legacy project scope ${String(args.projectId)} has no mapped topic.`
268
315
  );
@@ -479,6 +526,9 @@ function materializeTopicProjectOverlay(topic, idMode = "legacy") {
479
526
  type: mapProjectType(topic, metadata),
480
527
  description: readNonEmptyString(topic.description),
481
528
  ownerId: readNonEmptyString(metadata.ownerId) || readNonEmptyString(topic.createdBy) || "system",
529
+ // FR.7 creator-grant: surface the principal-shaped owner field (column-first,
530
+ // metadata fallback for legacy rows that recorded it in metadata).
531
+ ownerPrincipalId: readNonEmptyString(topic.ownerPrincipalId) || readNonEmptyString(metadata.ownerPrincipalId),
482
532
  sharedWith: readStringArray(metadata.sharedWith),
483
533
  visibility,
484
534
  tenantId: readNonEmptyString(topic.tenantId) || readNonEmptyString(metadata.tenantId),
@@ -748,6 +798,10 @@ function buildLinkedWorktreeMetadata(linkedWorktreeId) {
748
798
  linkedWorktreeId
749
799
  } : {};
750
800
  }
801
+ async function insertEpistemicNode(ctx, doc) {
802
+ assertUuidV7Identity("epistemicNodes", doc.globalId);
803
+ return ctx.db.insert("epistemicNodes", doc);
804
+ }
751
805
 
752
806
  // src/epistemicQuestions.create.ts
753
807
  var create = mutation({
@@ -821,7 +875,7 @@ var create = mutation({
821
875
  const globalId = generateGlobalId();
822
876
  const contentHash = generateContentHash(args.question);
823
877
  const category = normalizeCategory(args.category);
824
- const nodeId = await ctx.db.insert("epistemicNodes", {
878
+ const nodeId = await insertEpistemicNode(ctx, {
825
879
  globalId,
826
880
  topicId: scope.topicId,
827
881
  projectId: scope.projectId,
@@ -989,7 +1043,7 @@ var createBatch = mutation({
989
1043
  const globalId = generateGlobalId();
990
1044
  const contentHash = generateContentHash(q.question);
991
1045
  const category = normalizeCategory(q.category);
992
- const nodeId = await ctx.db.insert("epistemicNodes", {
1046
+ const nodeId = await insertEpistemicNode(ctx, {
993
1047
  globalId,
994
1048
  topicId: scope.topicId,
995
1049
  projectId: scope.projectId,
@@ -1041,7 +1095,7 @@ var createBatch = mutation({
1041
1095
  const beliefNode = await ctx.db.get(q.linkedBeliefNodeId);
1042
1096
  if (beliefNode) {
1043
1097
  await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.createEdge, {
1044
- globalId: crypto.randomUUID(),
1098
+ globalId: generateGlobalId(),
1045
1099
  fromGlobalId: beliefNode.globalId,
1046
1100
  toGlobalId: globalId,
1047
1101
  edgeType: "tests",
@@ -1105,7 +1159,7 @@ var internalCreate = internalMutation({
1105
1159
  const globalId = generateGlobalId();
1106
1160
  const contentHash = generateContentHash(args.question);
1107
1161
  const category = normalizeCategory(args.category);
1108
- const nodeId = await ctx.db.insert("epistemicNodes", {
1162
+ const nodeId = await insertEpistemicNode(ctx, {
1109
1163
  globalId,
1110
1164
  topicId: scope.topicId,
1111
1165
  projectId: scope.projectId,
@@ -1137,7 +1191,7 @@ var internalCreate = internalMutation({
1137
1191
  const beliefNode = await ctx.db.get(args.linkedBeliefNodeId);
1138
1192
  if (beliefNode) {
1139
1193
  await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.createEdge, {
1140
- globalId: crypto.randomUUID(),
1194
+ globalId: generateGlobalId(),
1141
1195
  fromGlobalId: beliefNode.globalId,
1142
1196
  toGlobalId: globalId,
1143
1197
  edgeType: "tests",
@@ -1208,7 +1262,7 @@ var addQuestion = mutation({
1208
1262
  const contentHash = generateContentHash(args.question);
1209
1263
  const category = normalizeCategory(args.category);
1210
1264
  const additionalMetadata = args.metadata && typeof args.metadata === "object" ? args.metadata : {};
1211
- const nodeId = await ctx.db.insert("epistemicNodes", {
1265
+ const nodeId = await insertEpistemicNode(ctx, {
1212
1266
  globalId,
1213
1267
  topicId: scope.topicId,
1214
1268
  projectId: scope.projectId,