@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, trustDiscount, applyNegativeSupport, cumulativeFusion, applyNegativeEvidence, readOpinionFromRecord } from '@lucern/confidence';
3
3
  import { permissiveReturn } from '@lucern/contracts/schema-helpers/validators';
4
4
  import { componentsGeneric, internalMutationGeneric, anyApi } from 'convex/server';
@@ -431,6 +431,35 @@ function debugGraphPrimitiveFallback(message, context) {
431
431
 
432
432
  // src/topicScope.ts
433
433
  var LEGACY_SCOPE_FIELD = "graphScopeProjectId";
434
+ async function resolveTopicNodeScopeOrNull(ctx, ref) {
435
+ if (!ctx?.db || typeof ctx.db.query !== "function") {
436
+ return null;
437
+ }
438
+ let node = null;
439
+ try {
440
+ const byGlobalId = await ctx.db.query("epistemicNodes").withIndex("by_globalId", (q) => q.eq("globalId", ref)).first();
441
+ if (byGlobalId && byGlobalId.nodeType === "topic") {
442
+ node = byGlobalId;
443
+ }
444
+ } catch (error) {
445
+ debugGraphPrimitiveFallback(
446
+ "[topicScope] topic-node scope lookup by globalId failed",
447
+ { error, ref }
448
+ );
449
+ }
450
+ if (!node) {
451
+ return null;
452
+ }
453
+ const scopeKey = normalizeScopeValue(node.topicId) ?? normalizeScopeValue(node.globalId);
454
+ if (!scopeKey) {
455
+ return null;
456
+ }
457
+ return {
458
+ topicId: scopeKey,
459
+ projectId: asMappedProjectId(node),
460
+ source: "topic_node"
461
+ };
462
+ }
434
463
  function asMappedProjectId(topic) {
435
464
  if (!topic) {
436
465
  return;
@@ -571,6 +600,13 @@ async function resolveTopicProjectScope(ctx, args) {
571
600
  ) ?? null;
572
601
  }
573
602
  if (!topic) {
603
+ const nodeScope = await resolveTopicNodeScopeOrNull(
604
+ ctx,
605
+ String(args.topicId)
606
+ );
607
+ if (nodeScope) {
608
+ return nodeScope;
609
+ }
574
610
  throw new Error(`Topic not found: ${String(args.topicId)}`);
575
611
  }
576
612
  const inherited = await resolveInheritedWorkspaceScope(ctx, topic);
@@ -641,6 +677,16 @@ async function resolveTopicProjectScope(ctx, args) {
641
677
  source: "project_mapped_topic"
642
678
  };
643
679
  }
680
+ const nodeScope = await resolveTopicNodeScopeOrNull(
681
+ ctx,
682
+ String(args.projectId)
683
+ );
684
+ if (nodeScope) {
685
+ return {
686
+ ...nodeScope,
687
+ projectId: nodeScope.projectId ?? String(args.projectId)
688
+ };
689
+ }
644
690
  throw new Error(
645
691
  `Legacy project scope ${String(args.projectId)} has no mapped topic.`
646
692
  );
@@ -873,7 +919,18 @@ var DEFAULT_CONFIDENCE_POLICY = {
873
919
  tupleContradiction: normalizeTupleContradictionPolicy()
874
920
  };
875
921
  function throwStructuredMutationError(args) {
876
- const error = new Error(args.message);
922
+ const data = {
923
+ structuredMutationError: true,
924
+ message: args.message,
925
+ status: args.status,
926
+ code: args.code,
927
+ invariantCode: args.invariantCode,
928
+ suggestion: args.suggestion,
929
+ details: args.details
930
+ };
931
+ const error = new ConvexError(
932
+ data
933
+ );
877
934
  error.status = args.status;
878
935
  error.code = args.code;
879
936
  error.invariantCode = args.invariantCode;
@@ -991,12 +1048,12 @@ async function requireProjectWriteAccess(ctx, projectId, userId) {
991
1048
  );
992
1049
  if (!hasAccess) {
993
1050
  throwStructuredMutationError({
994
- message: "Project access required.",
1051
+ message: `Project write access denied for topic ${projectId}.`,
995
1052
  status: 403,
996
- code: "FORBIDDEN",
1053
+ code: "PROJECT_ACCESS_DENIED",
997
1054
  invariantCode: "policy.scope_required",
998
- suggestion: "Request write access for the project and retry.",
999
- details: { projectId, userId }
1055
+ 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.",
1056
+ details: { topicId: projectId, principalId: userId }
1000
1057
  });
1001
1058
  }
1002
1059
  }
@@ -1242,14 +1299,14 @@ async function applyBeliefConfidenceChange(ctx, args) {
1242
1299
  beliefConfidenceId
1243
1300
  };
1244
1301
  }
1245
- function propagationTriggerForEdge(edgeType, weight) {
1302
+ function propagationPressureLabel(edgeType, weight) {
1246
1303
  if (edgeType === "contradicts" || edgeType === "refutes") {
1247
- return "contradiction_detected";
1304
+ return "contradictory";
1248
1305
  }
1249
1306
  if ((edgeType === "supports" || edgeType === "informs") && weight < 0) {
1250
- return "contradiction_detected";
1307
+ return "contradictory";
1251
1308
  }
1252
- return "evidence_added";
1309
+ return "supportive";
1253
1310
  }
1254
1311
  var propagateConfidenceChange = internalMutation({
1255
1312
  args: {
@@ -1286,14 +1343,15 @@ var propagateConfidenceChange = internalMutation({
1286
1343
  getNode: async (nodeId) => await ctx.db.get(nodeId)
1287
1344
  });
1288
1345
  for (const dispatch of dispatches) {
1346
+ const pressureLabel = propagationPressureLabel(dispatch.edgeType, dispatch.weight);
1289
1347
  await applyBeliefConfidenceChange(ctx, {
1290
1348
  nodeId: dispatch.targetNodeId,
1291
1349
  belief: dispatch.opinion.b,
1292
1350
  disbelief: dispatch.opinion.d,
1293
1351
  uncertainty: dispatch.opinion.u,
1294
1352
  baseRate: dispatch.opinion.a,
1295
- trigger: propagationTriggerForEdge(dispatch.edgeType, dispatch.weight),
1296
- rationale: `SL propagation via ${dispatch.edgeType} edge: ${dispatch.rationale}`,
1353
+ trigger: "propagation",
1354
+ rationale: `SL propagation via ${dispatch.edgeType} edge (pressure: ${pressureLabel}): ${dispatch.rationale}`,
1297
1355
  authenticatedUserId: args.userId,
1298
1356
  slOperator: dispatch.operator
1299
1357
  });