@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 { normalizeTupleContradictionPolicy, mkOpinion, conditionalDeduction, project, dampedDependencyCascade, hasProjectedOpinionChanged, confidenceFromSL, detectTupleContradiction, evaluateTupleContradictionTransition, deriveContractModulationPlan, deriveContractStatus, trustDiscount, applyNegativeSupport, cumulativeFusion, applyNegativeEvidence, readOpinionFromRecord, parseEvidentialEvaluatorConfig, compareMetricValue, buildEvidentialRationale, parseMetricCheckerConfig, getEvaluatorInputRecord, pickFiniteNumber, resolveComparisonResult, buildComparisonRationale, parseReferenceCheckCounterConfig, parseTemporalDeadlineConfig, parseMarketIndexComparatorConfig, createInheritedContractRecord } from '@lucern/confidence';
3
3
  import { checkProjectAccess } from '@lucern/access-control/access';
4
4
  import '@lucern/access-control/audience';
@@ -149,6 +149,35 @@ function debugGraphPrimitiveFallback(message, context) {
149
149
  console.debug(message, context ?? {});
150
150
  }
151
151
  var LEGACY_SCOPE_FIELD = "graphScopeProjectId";
152
+ async function resolveTopicNodeScopeOrNull(ctx, ref) {
153
+ if (!ctx?.db || typeof ctx.db.query !== "function") {
154
+ return null;
155
+ }
156
+ let node = null;
157
+ try {
158
+ const byGlobalId = await ctx.db.query("epistemicNodes").withIndex("by_globalId", (q) => q.eq("globalId", ref)).first();
159
+ if (byGlobalId && byGlobalId.nodeType === "topic") {
160
+ node = byGlobalId;
161
+ }
162
+ } catch (error) {
163
+ debugGraphPrimitiveFallback(
164
+ "[topicScope] topic-node scope lookup by globalId failed",
165
+ { error, ref }
166
+ );
167
+ }
168
+ if (!node) {
169
+ return null;
170
+ }
171
+ const scopeKey = normalizeScopeValue(node.topicId) ?? normalizeScopeValue(node.globalId);
172
+ if (!scopeKey) {
173
+ return null;
174
+ }
175
+ return {
176
+ topicId: scopeKey,
177
+ projectId: asMappedProjectId(node),
178
+ source: "topic_node"
179
+ };
180
+ }
152
181
  function asMappedProjectId(topic) {
153
182
  if (!topic) {
154
183
  return;
@@ -289,6 +318,13 @@ async function resolveTopicProjectScope(ctx, args) {
289
318
  ) ?? null;
290
319
  }
291
320
  if (!topic) {
321
+ const nodeScope = await resolveTopicNodeScopeOrNull(
322
+ ctx,
323
+ String(args.topicId)
324
+ );
325
+ if (nodeScope) {
326
+ return nodeScope;
327
+ }
292
328
  throw new Error(`Topic not found: ${String(args.topicId)}`);
293
329
  }
294
330
  const inherited = await resolveInheritedWorkspaceScope(ctx, topic);
@@ -359,6 +395,16 @@ async function resolveTopicProjectScope(ctx, args) {
359
395
  source: "project_mapped_topic"
360
396
  };
361
397
  }
398
+ const nodeScope = await resolveTopicNodeScopeOrNull(
399
+ ctx,
400
+ String(args.projectId)
401
+ );
402
+ if (nodeScope) {
403
+ return {
404
+ ...nodeScope,
405
+ projectId: nodeScope.projectId ?? String(args.projectId)
406
+ };
407
+ }
362
408
  throw new Error(
363
409
  `Legacy project scope ${String(args.projectId)} has no mapped topic.`
364
410
  );
@@ -464,7 +510,18 @@ var DEFAULT_CONFIDENCE_POLICY = {
464
510
  tupleContradiction: normalizeTupleContradictionPolicy()
465
511
  };
466
512
  function throwStructuredMutationError(args) {
467
- const error = new Error(args.message);
513
+ const data = {
514
+ structuredMutationError: true,
515
+ message: args.message,
516
+ status: args.status,
517
+ code: args.code,
518
+ invariantCode: args.invariantCode,
519
+ suggestion: args.suggestion,
520
+ details: args.details
521
+ };
522
+ const error = new ConvexError(
523
+ data
524
+ );
468
525
  error.status = args.status;
469
526
  error.code = args.code;
470
527
  error.invariantCode = args.invariantCode;
@@ -582,12 +639,12 @@ async function requireProjectWriteAccess(ctx, projectId, userId) {
582
639
  );
583
640
  if (!hasAccess) {
584
641
  throwStructuredMutationError({
585
- message: "Project access required.",
642
+ message: `Project write access denied for topic ${projectId}.`,
586
643
  status: 403,
587
- code: "FORBIDDEN",
644
+ code: "PROJECT_ACCESS_DENIED",
588
645
  invariantCode: "policy.scope_required",
589
- suggestion: "Request write access for the project and retry.",
590
- details: { projectId, userId }
646
+ 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.",
647
+ details: { topicId: projectId, principalId: userId }
591
648
  });
592
649
  }
593
650
  }
@@ -1243,14 +1300,14 @@ async function applyBeliefConfidenceChange(ctx, args) {
1243
1300
  beliefConfidenceId
1244
1301
  };
1245
1302
  }
1246
- function propagationTriggerForEdge(edgeType, weight) {
1303
+ function propagationPressureLabel(edgeType, weight) {
1247
1304
  if (edgeType === "contradicts" || edgeType === "refutes") {
1248
- return "contradiction_detected";
1305
+ return "contradictory";
1249
1306
  }
1250
1307
  if ((edgeType === "supports" || edgeType === "informs") && weight < 0) {
1251
- return "contradiction_detected";
1308
+ return "contradictory";
1252
1309
  }
1253
- return "evidence_added";
1310
+ return "supportive";
1254
1311
  }
1255
1312
  internalMutation({
1256
1313
  args: {
@@ -1287,14 +1344,15 @@ internalMutation({
1287
1344
  getNode: async (nodeId) => await ctx.db.get(nodeId)
1288
1345
  });
1289
1346
  for (const dispatch of dispatches) {
1347
+ const pressureLabel = propagationPressureLabel(dispatch.edgeType, dispatch.weight);
1290
1348
  await applyBeliefConfidenceChange(ctx, {
1291
1349
  nodeId: dispatch.targetNodeId,
1292
1350
  belief: dispatch.opinion.b,
1293
1351
  disbelief: dispatch.opinion.d,
1294
1352
  uncertainty: dispatch.opinion.u,
1295
1353
  baseRate: dispatch.opinion.a,
1296
- trigger: propagationTriggerForEdge(dispatch.edgeType, dispatch.weight),
1297
- rationale: `SL propagation via ${dispatch.edgeType} edge: ${dispatch.rationale}`,
1354
+ trigger: "propagation",
1355
+ rationale: `SL propagation via ${dispatch.edgeType} edge (pressure: ${pressureLabel}): ${dispatch.rationale}`,
1298
1356
  authenticatedUserId: args.userId,
1299
1357
  slOperator: dispatch.operator
1300
1358
  });
@@ -2745,10 +2803,7 @@ var createEpistemicContract = mutation({
2745
2803
  createdBy: userId,
2746
2804
  updatedAt: now
2747
2805
  };
2748
- const insertedId = await ctx.db.insert(
2749
- "epistemicContracts",
2750
- contractDoc
2751
- );
2806
+ const insertedId = await ctx.db.insert("epistemicContracts", contractDoc);
2752
2807
  return {
2753
2808
  contractId,
2754
2809
  id: insertedId,