@lucern/graph-primitives 1.0.31 → 1.0.33

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 (93) hide show
  1. package/dist/beliefEvidenceLinks.js.map +1 -1
  2. package/dist/beliefEvidenceLinks.operational.js.map +1 -1
  3. package/dist/contradictions.js +5 -5
  4. package/dist/contradictions.js.map +1 -1
  5. package/dist/entityBridge.js +2 -1
  6. package/dist/entityBridge.js.map +1 -1
  7. package/dist/entityLifecycle.js.map +1 -1
  8. package/dist/epistemicAnswers.js +1 -1
  9. package/dist/epistemicAnswers.js.map +1 -1
  10. package/dist/epistemicBeliefs.admin.js +2 -2
  11. package/dist/epistemicBeliefs.admin.js.map +1 -1
  12. package/dist/epistemicBeliefs.backfills.js +9 -5
  13. package/dist/epistemicBeliefs.backfills.js.map +1 -1
  14. package/dist/epistemicBeliefs.confidence.js +3 -5
  15. package/dist/epistemicBeliefs.confidence.js.map +1 -1
  16. package/dist/epistemicBeliefs.core.js +20 -30
  17. package/dist/epistemicBeliefs.core.js.map +1 -1
  18. package/dist/epistemicBeliefs.forkEvidence.js.map +1 -1
  19. package/dist/epistemicBeliefs.helpers.js +1 -1
  20. package/dist/epistemicBeliefs.helpers.js.map +1 -1
  21. package/dist/epistemicBeliefs.internal.js +15 -25
  22. package/dist/epistemicBeliefs.internal.js.map +1 -1
  23. package/dist/epistemicBeliefs.js +33 -43
  24. package/dist/epistemicBeliefs.js.map +1 -1
  25. package/dist/epistemicBeliefs.lifecycle.js +3 -5
  26. package/dist/epistemicBeliefs.lifecycle.js.map +1 -1
  27. package/dist/epistemicBeliefs.links.js +1 -1
  28. package/dist/epistemicBeliefs.links.js.map +1 -1
  29. package/dist/epistemicBeliefs.queries.js.map +1 -1
  30. package/dist/epistemicBeliefs.topicAnchor.js +12 -22
  31. package/dist/epistemicBeliefs.topicAnchor.js.map +1 -1
  32. package/dist/epistemicContracts.evaluators.js +3 -5
  33. package/dist/epistemicContracts.evaluators.js.map +1 -1
  34. package/dist/epistemicContracts.handlers.js +3 -6
  35. package/dist/epistemicContracts.handlers.js.map +1 -1
  36. package/dist/epistemicContracts.js +3 -6
  37. package/dist/epistemicContracts.js.map +1 -1
  38. package/dist/epistemicEdgeCreation.js.map +1 -1
  39. package/dist/epistemicEdges.handlers.js.map +1 -1
  40. package/dist/epistemicEdges.js +6 -7
  41. package/dist/epistemicEdges.js.map +1 -1
  42. package/dist/epistemicEdges.mutations.js +3 -4
  43. package/dist/epistemicEdges.mutations.js.map +1 -1
  44. package/dist/epistemicEdges.queries.js +3 -3
  45. package/dist/epistemicEdges.queries.js.map +1 -1
  46. package/dist/epistemicEvidence.js +10 -10
  47. package/dist/epistemicEvidence.js.map +1 -1
  48. package/dist/epistemicEvidenceHelpers.js +1 -1
  49. package/dist/epistemicEvidenceHelpers.js.map +1 -1
  50. package/dist/epistemicEvidenceMutations.js +5 -5
  51. package/dist/epistemicEvidenceMutations.js.map +1 -1
  52. package/dist/epistemicEvidenceQueries.js +6 -6
  53. package/dist/epistemicEvidenceQueries.js.map +1 -1
  54. package/dist/epistemicHelpers.js +4 -4
  55. package/dist/epistemicHelpers.js.map +1 -1
  56. package/dist/epistemicInsert.js.map +1 -1
  57. package/dist/epistemicLayerRules.js +2 -2
  58. package/dist/epistemicLayerRules.js.map +1 -1
  59. package/dist/epistemicLinking.js.map +1 -1
  60. package/dist/epistemicNodeCreation.js +2 -2
  61. package/dist/epistemicNodeCreation.js.map +1 -1
  62. package/dist/epistemicNodes.internal.js +2 -3
  63. package/dist/epistemicNodes.internal.js.map +1 -1
  64. package/dist/epistemicNodes.js +10 -12
  65. package/dist/epistemicNodes.js.map +1 -1
  66. package/dist/epistemicNodes.mutations.js +3 -4
  67. package/dist/epistemicNodes.mutations.js.map +1 -1
  68. package/dist/epistemicNodes.queries.js +5 -5
  69. package/dist/epistemicNodes.queries.js.map +1 -1
  70. package/dist/epistemicQuestions.conviction.js +5 -5
  71. package/dist/epistemicQuestions.conviction.js.map +1 -1
  72. package/dist/epistemicQuestions.create.js +7 -7
  73. package/dist/epistemicQuestions.create.js.map +1 -1
  74. package/dist/epistemicQuestions.evidence.js +2 -2
  75. package/dist/epistemicQuestions.evidence.js.map +1 -1
  76. package/dist/epistemicQuestions.helpers.js +7 -4
  77. package/dist/epistemicQuestions.helpers.js.map +1 -1
  78. package/dist/epistemicQuestions.js +16 -13
  79. package/dist/epistemicQuestions.js.map +1 -1
  80. package/dist/epistemicQuestions.lifecycle.js.map +1 -1
  81. package/dist/epistemicQuestions.queries.js +2 -2
  82. package/dist/epistemicQuestions.queries.js.map +1 -1
  83. package/dist/epistemicQuestions.sprint.js +6 -3
  84. package/dist/epistemicQuestions.sprint.js.map +1 -1
  85. package/dist/epistemicQuestions.tail.js +2 -2
  86. package/dist/epistemicQuestions.tail.js.map +1 -1
  87. package/dist/epistemicSources.js.map +1 -1
  88. package/dist/index.js +88 -98
  89. package/dist/index.js.map +1 -1
  90. package/dist/proof-attestation.json +1 -1
  91. package/dist/questionEvidenceLinks.js +3 -2
  92. package/dist/questionEvidenceLinks.js.map +1 -1
  93. package/package.json +4 -4
@@ -8,9 +8,9 @@ import { getCurrentUserId } from '@lucern/access-control/auth';
8
8
  import { throwStructuredMutationError } from '@lucern/access-control/structuredMutationError';
9
9
  import { normalizeTupleContradictionPolicy, mkOpinion, createInheritedContractRecord, readOpinionFromRecord, confidenceFromSL, conditionalDeduction, project, dampedDependencyCascade, trustDiscount, applyNegativeSupport, cumulativeFusion, applyNegativeEvidence, detectTupleContradiction, evaluateTupleContradictionTransition, hasProjectedOpinionChanged } from '@lucern/confidence';
10
10
  import { isNodeType, getLayerForNodeType } from '@lucern/contracts/schema-helpers/spine/tables/epistemicNodes';
11
+ import { generateUuidV7, generateGlobalId, assertUuidV7Identity, assertStorageEdgeVocabulary, isUuidV7, assertUuidShapedEdgeEndpoint } from '@lucern/contracts/ids';
11
12
  import { assertSchemaEnumValue } from '@lucern/contracts/schema-helpers/enumValidation';
12
13
  import { assertEdgePolicyAllowed, edgePolicyManifest } from '@lucern/contracts';
13
- import { generateGlobalId, assertUuidV7Identity, generateUuidV7, assertStorageEdgeVocabulary, assertUuidShapedEdgeEndpoint } from '@lucern/contracts/ids';
14
14
  import { listAudienceRegistryRows } from '@lucern/access-control/audienceRegistry';
15
15
 
16
16
  // src/epistemicBeliefs.admin.ts
@@ -1246,7 +1246,7 @@ async function markBeliefGraphDirty(ctx, scope) {
1246
1246
  );
1247
1247
  }
1248
1248
  async function resolveBeliefScopeOrNull(ctx, args) {
1249
- if (!(args.projectId || args.topicId)) {
1249
+ if (!args.topicId) {
1250
1250
  return null;
1251
1251
  }
1252
1252
  try {
@@ -1776,7 +1776,7 @@ var getByPillar = query({
1776
1776
  },
1777
1777
  returns: permissiveReturn,
1778
1778
  handler: async (ctx, args) => {
1779
- if (!(args.projectId || args.topicId)) {
1779
+ if (!args.topicId) {
1780
1780
  return [];
1781
1781
  }
1782
1782
  let scope;
@@ -2207,7 +2207,7 @@ var getRecentConfidenceChanges = query({
2207
2207
  if (!scope) {
2208
2208
  return [];
2209
2209
  }
2210
- const scopeId = scope.topicId ? String(scope.topicId) : scope.projectId;
2210
+ const scopeId = scope.topicId ? String(scope.topicId) : void 0;
2211
2211
  if (!(scopeId && await checkScopeAccess(ctx, scopeId, args.userId))) {
2212
2212
  return [];
2213
2213
  }
@@ -2464,7 +2464,7 @@ var backfillScoredBeliefEdges = internalMutation({
2464
2464
  returns: permissiveReturn,
2465
2465
  handler: async (ctx, args) => {
2466
2466
  const dryRun = args.dryRun ?? false;
2467
- const scopeTopicId = args.topicId ?? args.projectId;
2467
+ const scopeTopicId = args.topicId;
2468
2468
  if (!scopeTopicId) {
2469
2469
  return {
2470
2470
  dryRun,
@@ -2498,13 +2498,16 @@ var backfillScoredBeliefEdges = internalMutation({
2498
2498
  if (!theme.globalId) {
2499
2499
  continue;
2500
2500
  }
2501
- const edgeGlobalId = `edge-${belief.globalId}-relates_to_thesis-${theme.globalId}`;
2502
- const existing = await ctx.db.query("epistemicEdges").filter((q) => q.eq(q.field("globalId"), edgeGlobalId)).first();
2501
+ const existing = await ctx.db.query("epistemicEdges").withIndex(
2502
+ "by_from_to",
2503
+ (q) => q.eq("fromNodeId", belief.globalId).eq("toNodeId", theme.globalId)
2504
+ ).filter((q) => q.eq(q.field("edgeType"), "relates_to_thesis")).first();
2503
2505
  if (existing) {
2504
2506
  skipped++;
2505
2507
  continue;
2506
2508
  }
2507
2509
  if (!dryRun) {
2510
+ const edgeGlobalId = generateUuidV7();
2508
2511
  await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.createEdge, {
2509
2512
  globalId: edgeGlobalId,
2510
2513
  fromGlobalId: belief.globalId,
@@ -3425,16 +3428,13 @@ async function scheduleFirstScoringThemeEdges(ctx, args, node, state) {
3425
3428
  if (!state.isFirstScoring) {
3426
3429
  return;
3427
3430
  }
3428
- const themeNodes = await ctx.db.query("epistemicNodes").withIndex(
3429
- "by_topic",
3430
- (q) => q.eq("topicId", node.topicId || node.projectId)
3431
- ).filter((q) => q.eq(q.field("nodeType"), "theme")).collect();
3431
+ const themeNodes = await ctx.db.query("epistemicNodes").withIndex("by_topic", (q) => q.eq("topicId", node.topicId)).filter((q) => q.eq(q.field("nodeType"), "theme")).collect();
3432
3432
  for (const theme of themeNodes) {
3433
3433
  if (!(theme.globalId && node.globalId)) {
3434
3434
  continue;
3435
3435
  }
3436
3436
  await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.createEdge, {
3437
- globalId: `edge-${node.globalId}-relates_to_thesis-${theme.globalId}`,
3437
+ globalId: generateUuidV7(),
3438
3438
  fromGlobalId: node.globalId,
3439
3439
  toGlobalId: theme.globalId,
3440
3440
  edgeType: "relates_to_thesis",
@@ -3789,36 +3789,26 @@ async function insertEpistemicEdge(ctx, doc) {
3789
3789
  function cleanString(value) {
3790
3790
  return typeof value === "string" && value.trim().length > 0 ? value.trim() : void 0;
3791
3791
  }
3792
- function topicNodeCandidates(topicRef) {
3792
+ function requireTopicGlobalId(topicRef) {
3793
3793
  const normalized = topicRef.trim();
3794
- if (!normalized) {
3795
- return [];
3796
- }
3797
- const candidates = [normalized];
3798
- if (normalized.startsWith("top_")) {
3799
- candidates.push(normalized.slice(4));
3794
+ if (!(normalized && isUuidV7(normalized))) {
3795
+ throw new Error(
3796
+ "Belief creation topic anchors must be UUIDv7 epistemicNodes.globalId values."
3797
+ );
3800
3798
  }
3801
- return [...new Set(candidates)];
3799
+ return normalized;
3802
3800
  }
3803
3801
  function readTopicNodeRef(args) {
3804
3802
  return cleanString(args.topicGlobalId) ?? cleanString(args.topicNodeId) ?? cleanString(args.topicId);
3805
3803
  }
3806
3804
  async function resolveRequiredTopicAnchor(ctx, topicRef) {
3807
- for (const candidate of topicNodeCandidates(topicRef)) {
3808
- try {
3809
- const direct = await ctx.db.get(candidate);
3810
- if (direct?.nodeType === "topic" && cleanString(direct.globalId)) {
3811
- return direct;
3812
- }
3813
- } catch {
3814
- }
3815
- const byGlobalId = await ctx.db.query("epistemicNodes").withIndex("by_globalId", (q) => q.eq("globalId", candidate)).first();
3816
- if (byGlobalId?.nodeType === "topic" && cleanString(byGlobalId.globalId)) {
3817
- return byGlobalId;
3818
- }
3805
+ const topicGlobalId = requireTopicGlobalId(topicRef);
3806
+ const byGlobalId = await ctx.db.query("epistemicNodes").withIndex("by_globalId", (q) => q.eq("globalId", topicGlobalId)).first();
3807
+ if (byGlobalId?.nodeType === "topic" && cleanString(byGlobalId.globalId)) {
3808
+ return byGlobalId;
3819
3809
  }
3820
3810
  throw new Error(
3821
- "Belief creation requires topicGlobalId or topicNodeId for a topic node in epistemicNodes. Legacy topics-table IDs are not valid belief anchors."
3811
+ "Belief creation requires a UUIDv7 topicGlobalId for a topic node in epistemicNodes. Legacy topics-table IDs are not valid belief anchors."
3822
3812
  );
3823
3813
  }
3824
3814
  function scopeFromTopicAnchor(topicNode) {
@@ -4329,7 +4319,7 @@ var create = mutation({
4329
4319
  projectId: scope.projectId,
4330
4320
  topicId: String(scope.topicId)
4331
4321
  });
4332
- if (scope.projectId || scope.topicId) {
4322
+ if (scope.topicId) {
4333
4323
  await ctx.scheduler.runAfter(
4334
4324
  0,
4335
4325
  "embeddingActions:generateEpistemicNodeEmbedding",
@@ -4348,7 +4338,7 @@ Rationale: ${args.rationale}` : args.formulation
4348
4338
  }
4349
4339
  );
4350
4340
  }
4351
- if (scope.projectId || scope.topicId) {
4341
+ if (scope.topicId) {
4352
4342
  await ctx.scheduler.runAfter(
4353
4343
  2e3,
4354
4344
  // 2 second delay
@@ -4361,7 +4351,7 @@ Rationale: ${args.rationale}` : args.formulation
4361
4351
  }
4362
4352
  );
4363
4353
  }
4364
- if (pillar === "other" && (scope.projectId || scope.topicId)) {
4354
+ if (pillar === "other" && scope.topicId) {
4365
4355
  await ctx.scheduler.runAfter(
4366
4356
  2500,
4367
4357
  "beliefCategorization:autoCategorizeBelief",
@@ -4372,7 +4362,7 @@ Rationale: ${args.rationale}` : args.formulation
4372
4362
  }
4373
4363
  );
4374
4364
  }
4375
- if (scope.projectId || scope.topicId) {
4365
+ if (scope.topicId) {
4376
4366
  await ctx.scheduler.runAfter(
4377
4367
  3e3,
4378
4368
  // 3 second delay — after entity extraction
@@ -4640,7 +4630,7 @@ var getByProject = query({
4640
4630
  },
4641
4631
  returns: permissiveReturn,
4642
4632
  handler: async (ctx, args) => {
4643
- if (!(args.projectId || args.topicId)) {
4633
+ if (!args.topicId) {
4644
4634
  return [];
4645
4635
  }
4646
4636
  const pageSize = clampBeliefLimit(args.limit);
@@ -4663,7 +4653,7 @@ var getByProject = query({
4663
4653
  return [];
4664
4654
  }
4665
4655
  if (args.userId) {
4666
- const scopeId = scope.topicId ? String(scope.topicId) : scope.projectId;
4656
+ const scopeId = scope.topicId ? String(scope.topicId) : void 0;
4667
4657
  if (!scopeId) {
4668
4658
  return [];
4669
4659
  }
@@ -4820,7 +4810,7 @@ var forkBelief = mutation({
4820
4810
  supersededBy: newNodeId,
4821
4811
  updatedAt: now,
4822
4812
  metadata: {
4823
- ...metadata ?? {},
4813
+ ...metadata,
4824
4814
  status: "superseded",
4825
4815
  beliefStatus: "superseded",
4826
4816
  epistemicStatus: "superseded",
@@ -4900,7 +4890,7 @@ var forkBelief = mutation({
4900
4890
  projectId: parent.projectId,
4901
4891
  topicId: parent.topicId
4902
4892
  });
4903
- if (parent.projectId || parent.topicId) {
4893
+ if (parent.topicId) {
4904
4894
  const inheritedPillar = normalizePillar(
4905
4895
  String(metadata?.pillar || metadata?.topic || "")
4906
4896
  );
@@ -5306,7 +5296,7 @@ async function insertInternalBeliefAudit(ctx, args) {
5306
5296
  });
5307
5297
  }
5308
5298
  async function scheduleInternalBeliefEmbedding(ctx, args) {
5309
- if (!(args.scope.projectId || args.scope.topicId)) {
5299
+ if (!args.scope.topicId) {
5310
5300
  return;
5311
5301
  }
5312
5302
  await ctx.scheduler.runAfter(0, EMBEDDING_GENERATION_ACTION, {
@@ -5334,7 +5324,7 @@ function numericRequestedConfidence(confidence) {
5334
5324
  return 0.5;
5335
5325
  }
5336
5326
  async function scheduleInternalBeliefCategorization(ctx, args) {
5337
- if (normalizePillar(args.args.pillar || args.args.topic) !== "other" || !(args.scope.projectId || args.scope.topicId)) {
5327
+ if (normalizePillar(args.args.pillar || args.args.topic) !== "other" || !args.scope.topicId) {
5338
5328
  return;
5339
5329
  }
5340
5330
  await ctx.scheduler.runAfter(2500, BELIEF_CATEGORIZATION_ACTION, {