@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
@@ -4,7 +4,8 @@ import { listAudienceRegistryRows } from '@lucern/access-control/audienceRegistr
4
4
  import { assertSchemaEnumValue } from '@lucern/contracts/schema-helpers/enumValidation';
5
5
  import { permissiveReturn } from '@lucern/contracts/schema-helpers/validators';
6
6
  import { componentsGeneric, anyApi, internalQueryGeneric, internalMutationGeneric } from 'convex/server';
7
- import { generateGlobalId, generateUuidV7 } from '@lucern/contracts/ids';
7
+ import { generateGlobalId, assertUuidV7Identity, generateUuidV7, assertStorageEdgeVocabulary, assertCanonicalEdgeEndpoint } from '@lucern/contracts/ids';
8
+ import { assertEdgePolicyAllowed, edgePolicyManifest } from '@lucern/contracts';
8
9
  import { isNodeType, getLayerForNodeType } from '@lucern/contracts/schema-helpers/spine/tables/epistemicNodes';
9
10
  import { normalizeTupleContradictionPolicy, confidenceFromSL } from '@lucern/confidence';
10
11
  import '@lucern/access-control/access';
@@ -31,6 +32,35 @@ function debugGraphPrimitiveFallback(message, context) {
31
32
 
32
33
  // src/topicScope.ts
33
34
  var LEGACY_SCOPE_FIELD = "graphScopeProjectId";
35
+ async function resolveTopicNodeScopeOrNull(ctx, ref) {
36
+ if (!ctx?.db || typeof ctx.db.query !== "function") {
37
+ return null;
38
+ }
39
+ let node = null;
40
+ try {
41
+ const byGlobalId = await ctx.db.query("epistemicNodes").withIndex("by_globalId", (q) => q.eq("globalId", ref)).first();
42
+ if (byGlobalId && byGlobalId.nodeType === "topic") {
43
+ node = byGlobalId;
44
+ }
45
+ } catch (error) {
46
+ debugGraphPrimitiveFallback(
47
+ "[topicScope] topic-node scope lookup by globalId failed",
48
+ { error, ref }
49
+ );
50
+ }
51
+ if (!node) {
52
+ return null;
53
+ }
54
+ const scopeKey = normalizeScopeValue(node.topicId) ?? normalizeScopeValue(node.globalId);
55
+ if (!scopeKey) {
56
+ return null;
57
+ }
58
+ return {
59
+ topicId: scopeKey,
60
+ projectId: asMappedProjectId(node),
61
+ source: "topic_node"
62
+ };
63
+ }
34
64
  function asMappedProjectId(topic) {
35
65
  if (!topic) {
36
66
  return;
@@ -171,6 +201,13 @@ async function resolveTopicProjectScope(ctx, args) {
171
201
  ) ?? null;
172
202
  }
173
203
  if (!topic) {
204
+ const nodeScope = await resolveTopicNodeScopeOrNull(
205
+ ctx,
206
+ String(args.topicId)
207
+ );
208
+ if (nodeScope) {
209
+ return nodeScope;
210
+ }
174
211
  throw new Error(`Topic not found: ${String(args.topicId)}`);
175
212
  }
176
213
  const inherited = await resolveInheritedWorkspaceScope(ctx, topic);
@@ -241,6 +278,16 @@ async function resolveTopicProjectScope(ctx, args) {
241
278
  source: "project_mapped_topic"
242
279
  };
243
280
  }
281
+ const nodeScope = await resolveTopicNodeScopeOrNull(
282
+ ctx,
283
+ String(args.projectId)
284
+ );
285
+ if (nodeScope) {
286
+ return {
287
+ ...nodeScope,
288
+ projectId: nodeScope.projectId ?? String(args.projectId)
289
+ };
290
+ }
244
291
  throw new Error(
245
292
  `Legacy project scope ${String(args.projectId)} has no mapped topic.`
246
293
  );
@@ -253,6 +300,43 @@ var optionalScopeArgs = {
253
300
  projectId: v.optional(v.string()),
254
301
  topicId: v.optional(v.string())
255
302
  };
303
+ async function insertEpistemicNode(ctx, doc) {
304
+ assertUuidV7Identity("epistemicNodes", doc.globalId);
305
+ return ctx.db.insert("epistemicNodes", doc);
306
+ }
307
+ async function insertEpistemicEdge(ctx, doc) {
308
+ assertUuidV7Identity("epistemicEdges", doc.globalId);
309
+ assertStorageEdgeVocabulary(doc.edgeType);
310
+ if (!doc.fromNodeId || typeof doc.fromNodeId !== "string") {
311
+ throw new Error(
312
+ "edge_endpoint_missing: epistemicEdges insert requires a non-empty fromNodeId"
313
+ );
314
+ }
315
+ if (!doc.toNodeId || typeof doc.toNodeId !== "string") {
316
+ throw new Error(
317
+ "edge_endpoint_missing: epistemicEdges insert requires a non-empty toNodeId"
318
+ );
319
+ }
320
+ assertCanonicalEdgeEndpoint("fromNodeId", doc.fromNodeId);
321
+ assertCanonicalEdgeEndpoint("toNodeId", doc.toNodeId);
322
+ if (doc.fromNodeType && doc.toNodeType && doc.edgeType !== "extracted_from") {
323
+ assertEdgePolicyAllowed(
324
+ edgePolicyManifest,
325
+ doc.edgeType,
326
+ {
327
+ kind: "epistemic_node",
328
+ nodeId: doc.fromNodeId,
329
+ nodeType: doc.fromNodeType
330
+ },
331
+ {
332
+ kind: "epistemic_node",
333
+ nodeId: doc.toNodeId,
334
+ nodeType: doc.toNodeType
335
+ }
336
+ );
337
+ }
338
+ return ctx.db.insert("epistemicEdges", doc);
339
+ }
256
340
 
257
341
  // src/epistemicBeliefs.topicAnchor.ts
258
342
  function cleanString(value) {
@@ -304,18 +388,15 @@ async function createRequiredBeliefTopicEdge(ctx, args) {
304
388
  const now = Date.now();
305
389
  const existingEdges = await ctx.db.query("epistemicEdges").withIndex(
306
390
  "by_from_to",
307
- (q) => q.eq("fromNodeId", String(args.beliefNodeId)).eq(
308
- "toNodeId",
309
- String(args.topicNode._id)
310
- )
391
+ (q) => q.eq("fromNodeId", args.beliefGlobalId).eq("toNodeId", topicGlobalId)
311
392
  ).collect();
312
393
  const existing = existingEdges.find((edge) => edge.edgeType === "belongs_to");
313
394
  const edgeGlobalId = cleanString(existing?.globalId) ?? generateUuidV7();
314
395
  if (!existing) {
315
- await ctx.db.insert("epistemicEdges", {
396
+ await insertEpistemicEdge(ctx, {
316
397
  globalId: edgeGlobalId,
317
- fromNodeId: String(args.beliefNodeId),
318
- toNodeId: String(args.topicNode._id),
398
+ fromNodeId: args.beliefGlobalId,
399
+ toNodeId: topicGlobalId,
319
400
  sourceGlobalId: args.beliefGlobalId,
320
401
  targetGlobalId: topicGlobalId,
321
402
  edgeType: "belongs_to",
@@ -1339,7 +1420,7 @@ var internalCreate = internalMutation({
1339
1420
  opinion_u: 1,
1340
1421
  opinion_a: baseRate
1341
1422
  };
1342
- const nodeId = await ctx.db.insert("epistemicNodes", {
1423
+ const nodeId = await insertEpistemicNode(ctx, {
1343
1424
  globalId,
1344
1425
  topicId: scope.topicId,
1345
1426
  projectId: scope.projectId,
@@ -1395,7 +1476,6 @@ var internalCreate = internalMutation({
1395
1476
  })
1396
1477
  );
1397
1478
  await createRequiredBeliefTopicEdge(ctx, {
1398
- beliefNodeId: nodeId,
1399
1479
  beliefGlobalId: globalId,
1400
1480
  topicNode,
1401
1481
  createdBy: args.userId