@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 { checkProjectAccess } from '@lucern/access-control/access';
3
3
  import { getCurrentUserId } from '@lucern/access-control/auth';
4
4
  import { permissiveReturn } from '@lucern/contracts/schema-helpers/validators';
@@ -568,6 +568,35 @@ function debugGraphPrimitiveFallback(message, context) {
568
568
  console.debug(message, context ?? {});
569
569
  }
570
570
  var LEGACY_SCOPE_FIELD = "graphScopeProjectId";
571
+ async function resolveTopicNodeScopeOrNull(ctx, ref) {
572
+ if (!ctx?.db || typeof ctx.db.query !== "function") {
573
+ return null;
574
+ }
575
+ let node = null;
576
+ try {
577
+ const byGlobalId = await ctx.db.query("epistemicNodes").withIndex("by_globalId", (q) => q.eq("globalId", ref)).first();
578
+ if (byGlobalId && byGlobalId.nodeType === "topic") {
579
+ node = byGlobalId;
580
+ }
581
+ } catch (error) {
582
+ debugGraphPrimitiveFallback(
583
+ "[topicScope] topic-node scope lookup by globalId failed",
584
+ { error, ref }
585
+ );
586
+ }
587
+ if (!node) {
588
+ return null;
589
+ }
590
+ const scopeKey = normalizeScopeValue(node.topicId) ?? normalizeScopeValue(node.globalId);
591
+ if (!scopeKey) {
592
+ return null;
593
+ }
594
+ return {
595
+ topicId: scopeKey,
596
+ projectId: asMappedProjectId(node),
597
+ source: "topic_node"
598
+ };
599
+ }
571
600
  function asMappedProjectId(topic) {
572
601
  if (!topic) {
573
602
  return;
@@ -708,6 +737,13 @@ async function resolveTopicProjectScope(ctx, args) {
708
737
  ) ?? null;
709
738
  }
710
739
  if (!topic) {
740
+ const nodeScope = await resolveTopicNodeScopeOrNull(
741
+ ctx,
742
+ String(args.topicId)
743
+ );
744
+ if (nodeScope) {
745
+ return nodeScope;
746
+ }
711
747
  throw new Error(`Topic not found: ${String(args.topicId)}`);
712
748
  }
713
749
  const inherited = await resolveInheritedWorkspaceScope(ctx, topic);
@@ -778,6 +814,16 @@ async function resolveTopicProjectScope(ctx, args) {
778
814
  source: "project_mapped_topic"
779
815
  };
780
816
  }
817
+ const nodeScope = await resolveTopicNodeScopeOrNull(
818
+ ctx,
819
+ String(args.projectId)
820
+ );
821
+ if (nodeScope) {
822
+ return {
823
+ ...nodeScope,
824
+ projectId: nodeScope.projectId ?? String(args.projectId)
825
+ };
826
+ }
781
827
  throw new Error(
782
828
  `Legacy project scope ${String(args.projectId)} has no mapped topic.`
783
829
  );
@@ -883,7 +929,18 @@ var DEFAULT_CONFIDENCE_POLICY = {
883
929
  tupleContradiction: normalizeTupleContradictionPolicy()
884
930
  };
885
931
  function throwStructuredMutationError(args) {
886
- const error = new Error(args.message);
932
+ const data = {
933
+ structuredMutationError: true,
934
+ message: args.message,
935
+ status: args.status,
936
+ code: args.code,
937
+ invariantCode: args.invariantCode,
938
+ suggestion: args.suggestion,
939
+ details: args.details
940
+ };
941
+ const error = new ConvexError(
942
+ data
943
+ );
887
944
  error.status = args.status;
888
945
  error.code = args.code;
889
946
  error.invariantCode = args.invariantCode;
@@ -1001,12 +1058,12 @@ async function requireProjectWriteAccess(ctx, projectId, userId) {
1001
1058
  );
1002
1059
  if (!hasAccess) {
1003
1060
  throwStructuredMutationError({
1004
- message: "Project access required.",
1061
+ message: `Project write access denied for topic ${projectId}.`,
1005
1062
  status: 403,
1006
- code: "FORBIDDEN",
1063
+ code: "PROJECT_ACCESS_DENIED",
1007
1064
  invariantCode: "policy.scope_required",
1008
- suggestion: "Request write access for the project and retry.",
1009
- details: { projectId, userId }
1065
+ 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.",
1066
+ details: { topicId: projectId, principalId: userId }
1010
1067
  });
1011
1068
  }
1012
1069
  }
@@ -1662,14 +1719,14 @@ async function applyBeliefConfidenceChange(ctx, args) {
1662
1719
  beliefConfidenceId
1663
1720
  };
1664
1721
  }
1665
- function propagationTriggerForEdge(edgeType, weight) {
1722
+ function propagationPressureLabel(edgeType, weight) {
1666
1723
  if (edgeType === "contradicts" || edgeType === "refutes") {
1667
- return "contradiction_detected";
1724
+ return "contradictory";
1668
1725
  }
1669
1726
  if ((edgeType === "supports" || edgeType === "informs") && weight < 0) {
1670
- return "contradiction_detected";
1727
+ return "contradictory";
1671
1728
  }
1672
- return "evidence_added";
1729
+ return "supportive";
1673
1730
  }
1674
1731
  internalMutation({
1675
1732
  args: {
@@ -1706,14 +1763,15 @@ internalMutation({
1706
1763
  getNode: async (nodeId) => await ctx.db.get(nodeId)
1707
1764
  });
1708
1765
  for (const dispatch of dispatches) {
1766
+ const pressureLabel = propagationPressureLabel(dispatch.edgeType, dispatch.weight);
1709
1767
  await applyBeliefConfidenceChange(ctx, {
1710
1768
  nodeId: dispatch.targetNodeId,
1711
1769
  belief: dispatch.opinion.b,
1712
1770
  disbelief: dispatch.opinion.d,
1713
1771
  uncertainty: dispatch.opinion.u,
1714
1772
  baseRate: dispatch.opinion.a,
1715
- trigger: propagationTriggerForEdge(dispatch.edgeType, dispatch.weight),
1716
- rationale: `SL propagation via ${dispatch.edgeType} edge: ${dispatch.rationale}`,
1773
+ trigger: "propagation",
1774
+ rationale: `SL propagation via ${dispatch.edgeType} edge (pressure: ${pressureLabel}): ${dispatch.rationale}`,
1717
1775
  authenticatedUserId: args.userId,
1718
1776
  slOperator: dispatch.operator
1719
1777
  });
@@ -2735,10 +2793,7 @@ var createEpistemicContract = mutation({
2735
2793
  createdBy: userId,
2736
2794
  updatedAt: now
2737
2795
  };
2738
- const insertedId = await ctx.db.insert(
2739
- "epistemicContracts",
2740
- contractDoc
2741
- );
2796
+ const insertedId = await ctx.db.insert("epistemicContracts", contractDoc);
2742
2797
  return {
2743
2798
  contractId,
2744
2799
  id: insertedId,