@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
@@ -342,6 +342,9 @@ function materializeTopicProjectOverlay(topic, idMode = "legacy") {
342
342
  type: mapProjectType(topic, metadata),
343
343
  description: readNonEmptyString(topic.description),
344
344
  ownerId: readNonEmptyString(metadata.ownerId) || readNonEmptyString(topic.createdBy) || "system",
345
+ // FR.7 creator-grant: surface the principal-shaped owner field (column-first,
346
+ // metadata fallback for legacy rows that recorded it in metadata).
347
+ ownerPrincipalId: readNonEmptyString(topic.ownerPrincipalId) || readNonEmptyString(metadata.ownerPrincipalId),
345
348
  sharedWith: readStringArray(metadata.sharedWith),
346
349
  visibility,
347
350
  tenantId: readNonEmptyString(topic.tenantId) || readNonEmptyString(metadata.tenantId),
@@ -536,6 +539,35 @@ function resolveGraphPrimitivesAppResolvers(_ctx) {
536
539
  };
537
540
  }
538
541
  var LEGACY_SCOPE_FIELD2 = "graphScopeProjectId";
542
+ async function resolveTopicNodeScopeOrNull(ctx, ref) {
543
+ if (!ctx?.db || typeof ctx.db.query !== "function") {
544
+ return null;
545
+ }
546
+ let node = null;
547
+ try {
548
+ const byGlobalId = await ctx.db.query("epistemicNodes").withIndex("by_globalId", (q) => q.eq("globalId", ref)).first();
549
+ if (byGlobalId && byGlobalId.nodeType === "topic") {
550
+ node = byGlobalId;
551
+ }
552
+ } catch (error) {
553
+ debugGraphPrimitiveFallback(
554
+ "[topicScope] topic-node scope lookup by globalId failed",
555
+ { error, ref }
556
+ );
557
+ }
558
+ if (!node) {
559
+ return null;
560
+ }
561
+ const scopeKey = normalizeScopeValue(node.topicId) ?? normalizeScopeValue(node.globalId);
562
+ if (!scopeKey) {
563
+ return null;
564
+ }
565
+ return {
566
+ topicId: scopeKey,
567
+ projectId: asMappedProjectId(node),
568
+ source: "topic_node"
569
+ };
570
+ }
539
571
  function asMappedProjectId(topic) {
540
572
  if (!topic) {
541
573
  return;
@@ -676,6 +708,13 @@ async function resolveTopicProjectScope(ctx, args) {
676
708
  ) ?? null;
677
709
  }
678
710
  if (!topic) {
711
+ const nodeScope = await resolveTopicNodeScopeOrNull(
712
+ ctx,
713
+ String(args.topicId)
714
+ );
715
+ if (nodeScope) {
716
+ return nodeScope;
717
+ }
679
718
  throw new Error(`Topic not found: ${String(args.topicId)}`);
680
719
  }
681
720
  const inherited = await resolveInheritedWorkspaceScope(ctx, topic);
@@ -746,6 +785,16 @@ async function resolveTopicProjectScope(ctx, args) {
746
785
  source: "project_mapped_topic"
747
786
  };
748
787
  }
788
+ const nodeScope = await resolveTopicNodeScopeOrNull(
789
+ ctx,
790
+ String(args.projectId)
791
+ );
792
+ if (nodeScope) {
793
+ return {
794
+ ...nodeScope,
795
+ projectId: nodeScope.projectId ?? String(args.projectId)
796
+ };
797
+ }
749
798
  throw new Error(
750
799
  `Legacy project scope ${String(args.projectId)} has no mapped topic.`
751
800
  );
@@ -935,7 +984,72 @@ var EDGE_LAYER_RULES = {
935
984
  from: ["ontological"],
936
985
  to: ["L3"],
937
986
  description: "Deal -> Theme"
938
- }
987
+ },
988
+ // C2-RR.4 — storage migration alias + the remaining 55 reachable edge types.
989
+ // Mirrors the kernel rule table
990
+ // (packages/reasoning-kernel/src/adapters/lib/edgeValidation.ts) so this
991
+ // graph-primitives write path admits the same public edge vocabulary. See the
992
+ // kernel file for the per-group rationale.
993
+ extracted_from: {
994
+ from: ["L2", "L3", "L4"],
995
+ to: ["L1", "L2", "L3"],
996
+ description: "Legacy storage migration alias for derived_from; public writes use derived_from"
997
+ },
998
+ qualifies: { from: ["L2", "L3"], to: ["L3"], description: "Evidence/Belief qualifies a Belief" },
999
+ contradicts: { from: ["L2", "L3"], to: ["L3"], description: "Evidence/Belief contradicts a Belief" },
1000
+ reinforces: { from: ["L2", "L3"], to: ["L3"], description: "Evidence/Belief reinforces a Belief" },
1001
+ corroborates: { from: ["L2", "L3"], to: ["L3"], description: "Independent evidence/belief corroborates a Belief" },
1002
+ strengthened_by: { from: ["L3"], to: ["L2", "L3"], description: "Belief is strengthened by Evidence/Belief" },
1003
+ weakened_by: { from: ["L3"], to: ["L2", "L3"], description: "Belief is weakened by Evidence/Belief" },
1004
+ validated_by: { from: ["L3"], to: ["L2", "L3"], description: "Belief is validated by Evidence/Belief" },
1005
+ falsified_by: { from: ["L3"], to: ["L2", "L3"], description: "Belief is falsified by Evidence/Belief" },
1006
+ amplifies: { from: ["L3"], to: ["L3"], description: "Belief amplifies another Belief" },
1007
+ precondition_for: { from: ["L3"], to: ["L3"], description: "Belief is a precondition for another Belief" },
1008
+ prerequisite_for: { from: ["L3"], to: ["L3"], description: "Belief is a prerequisite for another Belief" },
1009
+ required_for: { from: ["L3"], to: ["L3"], description: "Belief is required for another Belief" },
1010
+ in_tension_with: { from: ["L3"], to: ["L3"], description: "Belief is in tension with another Belief" },
1011
+ mutually_exclusive: { from: ["L3"], to: ["L3"], description: "Beliefs cannot both hold" },
1012
+ exclusive_with: { from: ["L3"], to: ["L3"], description: "Belief is exclusive with another Belief" },
1013
+ alternative_to: { from: ["L3"], to: ["L3"], description: "Belief is an alternative to another Belief" },
1014
+ subsumes: { from: ["L3"], to: ["L3"], description: "Belief subsumes a narrower Belief" },
1015
+ extends: { from: ["L3"], to: ["L3"], description: "Belief extends another Belief" },
1016
+ refines: { from: ["L3"], to: ["L3"], description: "Belief refines another Belief" },
1017
+ implements: { from: ["L3"], to: ["L3"], description: "Belief implements an abstract Belief" },
1018
+ violates: { from: ["L3"], to: ["L3"], description: "Belief violates a constraint Belief" },
1019
+ assumes: { from: ["L3"], to: ["L3"], description: "Belief assumes another Belief" },
1020
+ would_predict: { from: ["L3"], to: ["L3"], description: "Belief would predict another Belief" },
1021
+ analogous_to: { from: ["L3"], to: ["L3"], description: "Belief is analogous to another Belief" },
1022
+ independent_of: { from: ["L3"], to: ["L3"], description: "Belief is independent of another Belief" },
1023
+ correlates_with: { from: ["L3"], to: ["L3"], description: "Belief correlates with another Belief" },
1024
+ co_changes_with: { from: ["L3"], to: ["L3"], description: "Belief co-changes with another Belief" },
1025
+ counterfactual_of: { from: ["L3"], to: ["L3"], description: "Belief is a counterfactual of another Belief" },
1026
+ parallel_to: { from: ["L3"], to: ["L3"], description: "Belief runs parallel to another Belief" },
1027
+ cascade_from: { from: ["L3"], to: ["L3"], description: "Cascade from an upstream Belief" },
1028
+ cascade_to: { from: ["L3"], to: ["L3"], description: "Cascade to a downstream Belief" },
1029
+ collapses_if: { from: ["L3"], to: ["L3"], description: "Belief collapses if another fails" },
1030
+ branches_from: { from: ["L3"], to: ["L3"], description: "Belief branches from an ancestor Belief" },
1031
+ same_as: { from: ["L2", "L3", "ontological"], to: ["L2", "L3", "ontological"], description: "Two nodes are the same entity" },
1032
+ answers: { from: ["L2", "L3"], to: ["L3"], description: "Answer/Belief answers a Question" },
1033
+ partially_answers: { from: ["L2", "L3"], to: ["L3"], description: "Answer/Belief partially answers a Question" },
1034
+ explores: { from: ["L3"], to: ["L3"], description: "Question explores a Belief/Theme" },
1035
+ informed_by_theme: { from: ["L3"], to: ["L3"], description: "Belief is informed by a Theme" },
1036
+ same_theme_as: { from: ["L3"], to: ["L3"], description: "Two Beliefs share a Theme" },
1037
+ based_on: { from: ["L4"], to: ["L3"], description: "Decision is based on a Belief/Question" },
1038
+ based_on_belief: { from: ["L4"], to: ["L3"], description: "Decision is based on a Belief" },
1039
+ based_on_question: { from: ["L4"], to: ["L3"], description: "Decision is based on a Question" },
1040
+ blocked_by_contradiction: { from: ["L4"], to: ["L3"], description: "Decision is blocked by a Contradiction" },
1041
+ parent_of: { from: ["L3", "L4", "ontological", "organizational"], to: ["L2", "L3", "ontological", "organizational"], description: "A is the parent of B" },
1042
+ child_of: { from: ["L2", "L3", "ontological", "organizational"], to: ["L3", "L4", "ontological", "organizational"], description: "A is the child of B" },
1043
+ scoped_by: { from: ["L2", "L3"], to: ["L3", "organizational"], description: "Object is scoped by a Topic/Theme" },
1044
+ cites: { from: ["L2", "L3"], to: ["L1", "L2"], description: "Evidence/Belief cites a Source/Excerpt" },
1045
+ summarizes: { from: ["L2", "L3"], to: ["L1", "L2"], description: "Synthesis/Evidence summarizes a Source/Evidence" },
1046
+ same_source_as: { from: ["L1", "L2"], to: ["L1", "L2"], description: "Two nodes derive from the same Source" },
1047
+ migrating_from: { from: ["L2", "L3", "L4"], to: ["L1", "L2", "L3"], description: "Migration lineage: from an ancestor" },
1048
+ migrating_to: { from: ["L1", "L2", "L3"], to: ["L2", "L3", "L4"], description: "Migration lineage: to a successor" },
1049
+ about_entity: { from: ["L2", "L3"], to: ["ontological"], description: "Belief/Evidence is about an Entity" },
1050
+ entity_referenced_in: { from: ["ontological"], to: ["L1", "L2"], description: "Entity is referenced in a Source/Evidence" },
1051
+ related_to: { from: ["L2", "L3", "ontological", "organizational"], to: ["L2", "L3", "ontological", "organizational"], description: "Lateral adjacency; no confidence pressure" },
1052
+ blocks: { from: ["L3", "L4"], to: ["L3", "L4"], description: "A blocks B (structural gate)" }
939
1053
  };
940
1054
  function validateEdgeLayers(edgeType, fromLayer, toLayer) {
941
1055
  const rules = EDGE_LAYER_RULES[edgeType];