@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
@@ -1,4 +1,4 @@
1
- import { v } from 'convex/values';
1
+ import { v, ConvexError } from 'convex/values';
2
2
  import { permissiveReturn } from '@lucern/contracts/schema-helpers/validators';
3
3
  import { componentsGeneric, anyApi, internalMutationGeneric, mutationGeneric } from 'convex/server';
4
4
  import '@lucern/contracts/schema-helpers/spine/tables/epistemicNodes';
@@ -28,6 +28,35 @@ function debugGraphPrimitiveFallback(message, context) {
28
28
 
29
29
  // src/topicScope.ts
30
30
  var LEGACY_SCOPE_FIELD = "graphScopeProjectId";
31
+ async function resolveTopicNodeScopeOrNull(ctx, ref) {
32
+ if (!ctx?.db || typeof ctx.db.query !== "function") {
33
+ return null;
34
+ }
35
+ let node = null;
36
+ try {
37
+ const byGlobalId = await ctx.db.query("epistemicNodes").withIndex("by_globalId", (q) => q.eq("globalId", ref)).first();
38
+ if (byGlobalId && byGlobalId.nodeType === "topic") {
39
+ node = byGlobalId;
40
+ }
41
+ } catch (error) {
42
+ debugGraphPrimitiveFallback(
43
+ "[topicScope] topic-node scope lookup by globalId failed",
44
+ { error, ref }
45
+ );
46
+ }
47
+ if (!node) {
48
+ return null;
49
+ }
50
+ const scopeKey = normalizeScopeValue(node.topicId) ?? normalizeScopeValue(node.globalId);
51
+ if (!scopeKey) {
52
+ return null;
53
+ }
54
+ return {
55
+ topicId: scopeKey,
56
+ projectId: asMappedProjectId(node),
57
+ source: "topic_node"
58
+ };
59
+ }
31
60
  function asMappedProjectId(topic) {
32
61
  if (!topic) {
33
62
  return;
@@ -168,6 +197,13 @@ async function resolveTopicProjectScope(ctx, args) {
168
197
  ) ?? null;
169
198
  }
170
199
  if (!topic) {
200
+ const nodeScope = await resolveTopicNodeScopeOrNull(
201
+ ctx,
202
+ String(args.topicId)
203
+ );
204
+ if (nodeScope) {
205
+ return nodeScope;
206
+ }
171
207
  throw new Error(`Topic not found: ${String(args.topicId)}`);
172
208
  }
173
209
  const inherited = await resolveInheritedWorkspaceScope(ctx, topic);
@@ -238,6 +274,16 @@ async function resolveTopicProjectScope(ctx, args) {
238
274
  source: "project_mapped_topic"
239
275
  };
240
276
  }
277
+ const nodeScope = await resolveTopicNodeScopeOrNull(
278
+ ctx,
279
+ String(args.projectId)
280
+ );
281
+ if (nodeScope) {
282
+ return {
283
+ ...nodeScope,
284
+ projectId: nodeScope.projectId ?? String(args.projectId)
285
+ };
286
+ }
241
287
  throw new Error(
242
288
  `Legacy project scope ${String(args.projectId)} has no mapped topic.`
243
289
  );
@@ -916,7 +962,18 @@ var DEFAULT_CONFIDENCE_POLICY = {
916
962
  tupleContradiction: normalizeTupleContradictionPolicy()
917
963
  };
918
964
  function throwStructuredMutationError(args) {
919
- const error = new Error(args.message);
965
+ const data = {
966
+ structuredMutationError: true,
967
+ message: args.message,
968
+ status: args.status,
969
+ code: args.code,
970
+ invariantCode: args.invariantCode,
971
+ suggestion: args.suggestion,
972
+ details: args.details
973
+ };
974
+ const error = new ConvexError(
975
+ data
976
+ );
920
977
  error.status = args.status;
921
978
  error.code = args.code;
922
979
  error.invariantCode = args.invariantCode;
@@ -1049,12 +1106,12 @@ async function requireProjectWriteAccess(ctx, projectId, userId) {
1049
1106
  );
1050
1107
  if (!hasAccess) {
1051
1108
  throwStructuredMutationError({
1052
- message: "Project access required.",
1109
+ message: `Project write access denied for topic ${projectId}.`,
1053
1110
  status: 403,
1054
- code: "FORBIDDEN",
1111
+ code: "PROJECT_ACCESS_DENIED",
1055
1112
  invariantCode: "policy.scope_required",
1056
- suggestion: "Request write access for the project and retry.",
1057
- details: { projectId, userId }
1113
+ suggestion: "The acting principal lacks project-write access to this topic. Request a topic grant (or, if the principal created this topic, run the creator-grant backfill) and retry.",
1114
+ details: { topicId: projectId, principalId: userId }
1058
1115
  });
1059
1116
  }
1060
1117
  }
@@ -1300,14 +1357,14 @@ async function applyBeliefConfidenceChange(ctx, args) {
1300
1357
  beliefConfidenceId
1301
1358
  };
1302
1359
  }
1303
- function propagationTriggerForEdge(edgeType, weight) {
1360
+ function propagationPressureLabel(edgeType, weight) {
1304
1361
  if (edgeType === "contradicts" || edgeType === "refutes") {
1305
- return "contradiction_detected";
1362
+ return "contradictory";
1306
1363
  }
1307
1364
  if ((edgeType === "supports" || edgeType === "informs") && weight < 0) {
1308
- return "contradiction_detected";
1365
+ return "contradictory";
1309
1366
  }
1310
- return "evidence_added";
1367
+ return "supportive";
1311
1368
  }
1312
1369
  internalMutation({
1313
1370
  args: {
@@ -1344,14 +1401,15 @@ internalMutation({
1344
1401
  getNode: async (nodeId) => await ctx.db.get(nodeId)
1345
1402
  });
1346
1403
  for (const dispatch of dispatches) {
1404
+ const pressureLabel = propagationPressureLabel(dispatch.edgeType, dispatch.weight);
1347
1405
  await applyBeliefConfidenceChange(ctx, {
1348
1406
  nodeId: dispatch.targetNodeId,
1349
1407
  belief: dispatch.opinion.b,
1350
1408
  disbelief: dispatch.opinion.d,
1351
1409
  uncertainty: dispatch.opinion.u,
1352
1410
  baseRate: dispatch.opinion.a,
1353
- trigger: propagationTriggerForEdge(dispatch.edgeType, dispatch.weight),
1354
- rationale: `SL propagation via ${dispatch.edgeType} edge: ${dispatch.rationale}`,
1411
+ trigger: "propagation",
1412
+ rationale: `SL propagation via ${dispatch.edgeType} edge (pressure: ${pressureLabel}): ${dispatch.rationale}`,
1355
1413
  authenticatedUserId: args.userId,
1356
1414
  slOperator: dispatch.operator
1357
1415
  });