@lucern/graph-primitives 0.3.0-alpha.6 → 0.3.0-alpha.8

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 (123) hide show
  1. package/dist/{beliefDecay-Q_26RTc-.d.ts → beliefDecay-DZ6tkLYq.d.ts} +1 -1
  2. package/dist/beliefDecay.d.ts +1 -1
  3. package/dist/beliefDecay.js +158 -47
  4. package/dist/beliefDecay.js.map +1 -1
  5. package/dist/{beliefEvidenceLinks-42FlR48t.d.ts → beliefEvidenceLinks-CWOXxxJg.d.ts} +1 -1
  6. package/dist/beliefEvidenceLinks.d.ts +1 -1
  7. package/dist/beliefEvidenceLinks.js +141 -45
  8. package/dist/beliefEvidenceLinks.js.map +1 -1
  9. package/dist/{beliefLifecycle-C-AehZgF.d.ts → beliefLifecycle-y8WLXqQj.d.ts} +1 -1
  10. package/dist/beliefLifecycle.d.ts +1 -1
  11. package/dist/confidencePropagationDispatch.d.ts +1 -1
  12. package/dist/confidencePropagationDispatch.js +1 -3
  13. package/dist/confidencePropagationDispatch.js.map +1 -1
  14. package/dist/{contradictions-Hdwl7zid.d.ts → contradictions-51VLsESq.d.ts} +1 -1
  15. package/dist/contradictions.d.ts +1 -1
  16. package/dist/contradictions.js +67 -8
  17. package/dist/contradictions.js.map +1 -1
  18. package/dist/debug.d.ts +4 -0
  19. package/dist/debug.js +34 -0
  20. package/dist/debug.js.map +1 -0
  21. package/dist/edges/contradicts.js.map +1 -1
  22. package/dist/edges/dependsOn.js.map +1 -1
  23. package/dist/edges/elaborates.js.map +1 -1
  24. package/dist/edges/index.js +1 -3
  25. package/dist/edges/index.js.map +1 -1
  26. package/dist/edges/informs.js +1 -3
  27. package/dist/edges/informs.js.map +1 -1
  28. package/dist/edges/refutes.js +1 -3
  29. package/dist/edges/refutes.js.map +1 -1
  30. package/dist/edges/supports.js.map +1 -1
  31. package/dist/edges/utils.d.ts +3 -3
  32. package/dist/edges/utils.js +2 -4
  33. package/dist/edges/utils.js.map +1 -1
  34. package/dist/embeddingTrigger.js +21 -1
  35. package/dist/embeddingTrigger.js.map +1 -1
  36. package/dist/entityBridge.js +1 -1
  37. package/dist/entityBridge.js.map +1 -1
  38. package/dist/{entityLifecycle-BkhRJ-XI.d.ts → entityLifecycle-CvgSK5FV.d.ts} +1 -1
  39. package/dist/entityLifecycle.d.ts +1 -1
  40. package/dist/entityLifecycle.js +134 -47
  41. package/dist/entityLifecycle.js.map +1 -1
  42. package/dist/{epistemicAnswers-DSP1slZ9.d.ts → epistemicAnswers-C5ib4z6_.d.ts} +1 -1
  43. package/dist/epistemicAnswers.d.ts +1 -1
  44. package/dist/epistemicAnswers.js +67 -8
  45. package/dist/epistemicAnswers.js.map +1 -1
  46. package/dist/{epistemicBeliefs-DtFVTp-k.d.ts → epistemicBeliefs-DzKjZAeC.d.ts} +3 -3
  47. package/dist/epistemicBeliefs.d.ts +2 -2
  48. package/dist/epistemicBeliefs.js +289 -114
  49. package/dist/epistemicBeliefs.js.map +1 -1
  50. package/dist/epistemicContracts.d.ts +1 -1
  51. package/dist/epistemicContracts.js +297 -115
  52. package/dist/epistemicContracts.js.map +1 -1
  53. package/dist/{epistemicEdges-DcA8ErUG.d.ts → epistemicEdges-CvlKnEyy.d.ts} +1 -1
  54. package/dist/epistemicEdges.d.ts +1 -1
  55. package/dist/epistemicEdges.js +192 -60
  56. package/dist/epistemicEdges.js.map +1 -1
  57. package/dist/{epistemicEvidence-Bo638XDP.d.ts → epistemicEvidence-xw6UUrwh.d.ts} +1 -1
  58. package/dist/epistemicEvidence.d.ts +1 -1
  59. package/dist/epistemicEvidence.js +163 -49
  60. package/dist/epistemicEvidence.js.map +1 -1
  61. package/dist/{epistemicHelpers-Bd9xbaib.d.ts → epistemicHelpers-DevrYgPN.d.ts} +1 -1
  62. package/dist/epistemicHelpers.d.ts +1 -1
  63. package/dist/{epistemicLinking-CyeLOIzN.d.ts → epistemicLinking-CfE00tHJ.d.ts} +1 -1
  64. package/dist/epistemicLinking.d.ts +1 -1
  65. package/dist/epistemicLinking.js +1 -1
  66. package/dist/{epistemicNodes-BpD6Koud.d.ts → epistemicNodes-DjSUfvyD.d.ts} +1 -1
  67. package/dist/epistemicNodes.d.ts +1 -1
  68. package/dist/epistemicNodes.js +163 -33
  69. package/dist/epistemicNodes.js.map +1 -1
  70. package/dist/{epistemicQuestions-CmEeY6zQ.d.ts → epistemicQuestions-B_nUclrH.d.ts} +1 -1
  71. package/dist/epistemicQuestions.d.ts +1 -1
  72. package/dist/epistemicQuestions.js +311 -62
  73. package/dist/epistemicQuestions.js.map +1 -1
  74. package/dist/{epistemicSources-ZazxHOK1.d.ts → epistemicSources-dlKj58Jp.d.ts} +1 -1
  75. package/dist/epistemicSources.d.ts +1 -1
  76. package/dist/epistemicSources.js +65 -8
  77. package/dist/epistemicSources.js.map +1 -1
  78. package/dist/evaluators/index.js +297 -115
  79. package/dist/evaluators/index.js.map +1 -1
  80. package/dist/evaluators/lintCheckerEvaluator.js.map +1 -1
  81. package/dist/evaluators/sentryCheckerEvaluator.js.map +1 -1
  82. package/dist/evaluators/shared.js +20 -1
  83. package/dist/evaluators/shared.js.map +1 -1
  84. package/dist/evaluators/testRunnerEvaluator.js +20 -1
  85. package/dist/evaluators/testRunnerEvaluator.js.map +1 -1
  86. package/dist/evaluators/tscCheckerEvaluator.js.map +1 -1
  87. package/dist/index.d.ts +20 -20
  88. package/dist/index.js +729 -206
  89. package/dist/index.js.map +1 -1
  90. package/dist/{ontology-matching-Buhu23ss.d.ts → ontology-matching-C6rrz2VP.d.ts} +1 -1
  91. package/dist/ontology-matching.d.ts +1 -1
  92. package/dist/{ontologyApproval-Ba0Jjk1k.d.ts → ontologyApproval-CFYmqKmk.d.ts} +1 -1
  93. package/dist/ontologyApproval.d.ts +1 -1
  94. package/dist/ontologyDefinitions.js +4 -3
  95. package/dist/ontologyDefinitions.js.map +1 -1
  96. package/dist/ontologyHelpers.d.ts +1 -1
  97. package/dist/ontologyHelpers.js +4 -3
  98. package/dist/ontologyHelpers.js.map +1 -1
  99. package/dist/{projectionReconciliation-CxrXYGaB.d.ts → projectionReconciliation-jww2fBI0.d.ts} +1 -1
  100. package/dist/projectionReconciliation.d.ts +1 -1
  101. package/dist/projectionReconciliation.js +14 -20
  102. package/dist/projectionReconciliation.js.map +1 -1
  103. package/dist/{projectionStaleness-CAdpIsaW.d.ts → projectionStaleness-CmdbpjVK.d.ts} +1 -1
  104. package/dist/projectionStaleness.d.ts +1 -1
  105. package/dist/{questionEvidenceLinks-BdQD0TkM.d.ts → questionEvidenceLinks-DFlyPpAj.d.ts} +1 -1
  106. package/dist/questionEvidenceLinks.d.ts +1 -1
  107. package/dist/questionEvidenceLinks.js +144 -45
  108. package/dist/questionEvidenceLinks.js.map +1 -1
  109. package/dist/resolvers.js +86 -37
  110. package/dist/resolvers.js.map +1 -1
  111. package/dist/scopeResolverCompat.js +64 -7
  112. package/dist/scopeResolverCompat.js.map +1 -1
  113. package/dist/{text-matching-CMn2WnVD.d.ts → text-matching-DNg4M5Wd.d.ts} +1 -1
  114. package/dist/text-matching.d.ts +1 -1
  115. package/dist/topicProjectOverlay.js +56 -13
  116. package/dist/topicProjectOverlay.js.map +1 -1
  117. package/dist/topicScope.js +55 -6
  118. package/dist/topicScope.js.map +1 -1
  119. package/dist/workflowBridge.js +55 -6
  120. package/dist/workflowBridge.js.map +1 -1
  121. package/dist/workspaceIsolation.js +55 -6
  122. package/dist/workspaceIsolation.js.map +1 -1
  123. package/package.json +5 -5
@@ -1,7 +1,7 @@
1
1
  import { v } from 'convex/values';
2
2
  import { checkProjectAccess } from '@lucern/access-control/access';
3
3
  import { permissiveReturn } from '@lucern/contracts/schema-helpers/validators';
4
- import { componentsGeneric, mutationGeneric, queryGeneric, anyApi } from 'convex/server';
4
+ import { componentsGeneric, mutationGeneric, anyApi, queryGeneric } from 'convex/server';
5
5
 
6
6
  // src/questionEvidenceLinks.ts
7
7
  var api = anyApi;
@@ -10,6 +10,18 @@ var internal = anyApi;
10
10
  var mutation = mutationGeneric;
11
11
  var query = queryGeneric;
12
12
 
13
+ // src/debug.ts
14
+ function isGraphPrimitiveDebugEnabled() {
15
+ const env = globalThis.process?.env;
16
+ return env?.LUCERN_COMPAT_FALLBACK_DEBUG === "1" || env?.LUCERN_GRAPH_DEBUG === "1";
17
+ }
18
+ function debugGraphPrimitiveFallback(message, context) {
19
+ if (!isGraphPrimitiveDebugEnabled()) {
20
+ return;
21
+ }
22
+ console.debug(message, context ?? {});
23
+ }
24
+
13
25
  // src/matcherFeedbackUtils.ts
14
26
  function isOperationalLinkStatus(status) {
15
27
  return status !== "suggested" && status !== "dismissed";
@@ -87,19 +99,37 @@ function isProjectLikeTopic(topic) {
87
99
  return topic.type === "theme" || topic.type === "thematic" || topic.type === "deal" || topic.type === "monitoring" || readLegacyProjectId(topic) !== void 0 || readNonEmptyString(metadata.projectType) !== void 0;
88
100
  }
89
101
  function isMissingLucernChildComponentError(error) {
90
- const message = error instanceof Error ? error.message : String(error);
102
+ const message = getErrorMessage(error);
91
103
  return message.includes(
92
104
  'Child component ComponentName(Identifier("lucern")) not found'
93
105
  ) || message.includes("Child component") && message.includes("lucern") && message.includes("not found");
94
106
  }
107
+ function getErrorMessage(error) {
108
+ if (error instanceof Error) {
109
+ return error.message;
110
+ }
111
+ if (typeof error === "object" && error !== null && "message" in error && typeof error.message === "string") {
112
+ return error.message;
113
+ }
114
+ return "unknown error";
115
+ }
95
116
  async function resolveTopicDoc(ctx, scopeId) {
96
117
  if (ctx?.db && typeof ctx.db.get === "function") {
97
118
  try {
98
- const directTopic = await ctx.db.get(scopeId);
119
+ const directTopic = await ctx.db.get(
120
+ scopeId
121
+ );
99
122
  if (directTopic) {
100
123
  return directTopic;
101
124
  }
102
- } catch {
125
+ } catch (error) {
126
+ debugGraphPrimitiveFallback(
127
+ "[topicProjectOverlay] Failed to resolve topic by direct ID",
128
+ {
129
+ error,
130
+ scopeId
131
+ }
132
+ );
103
133
  }
104
134
  }
105
135
  if (typeof ctx.runQuery !== "function") {
@@ -112,7 +142,14 @@ async function resolveTopicDoc(ctx, scopeId) {
112
142
  if (topic?.name !== void 0 && topic?.type !== void 0) {
113
143
  return topic;
114
144
  }
115
- } catch {
145
+ } catch (error) {
146
+ debugGraphPrimitiveFallback(
147
+ "[topicProjectOverlay] Failed to resolve topic by ID query",
148
+ {
149
+ error,
150
+ scopeId
151
+ }
152
+ );
116
153
  }
117
154
  try {
118
155
  const topic = await ctx.runQuery(api.topics.getByLegacyScopeId, {
@@ -121,7 +158,11 @@ async function resolveTopicDoc(ctx, scopeId) {
121
158
  if (topic?.name !== void 0 && topic?.type !== void 0) {
122
159
  return topic;
123
160
  }
124
- } catch {
161
+ } catch (error) {
162
+ debugGraphPrimitiveFallback(
163
+ "[topicProjectOverlay] Failed to resolve topic by legacy scope ID",
164
+ { error, scopeId }
165
+ );
125
166
  }
126
167
  return null;
127
168
  }
@@ -175,7 +216,11 @@ async function listTopicProjectOverlays(ctx, options = {}) {
175
216
  if (ctx?.db?.query && typeof ctx.db.query === "function") {
176
217
  try {
177
218
  allTopics = await ctx.db.query("topics").collect();
178
- } catch {
219
+ } catch (error) {
220
+ debugGraphPrimitiveFallback(
221
+ "[topicProjectOverlay] Failed to read topics table; falling back to API",
222
+ { error }
223
+ );
179
224
  allTopics = [];
180
225
  }
181
226
  }
@@ -270,19 +315,28 @@ async function patchTopicProjectOverlay(ctx, scopeId, value) {
270
315
  "Cannot patch topic without component adapter (ctx.runMutation unavailable)"
271
316
  );
272
317
  }
273
- return materializeTopicProjectOverlay(
274
- {
275
- ...topic,
276
- ...patch,
277
- metadata: nextMetadata
278
- }
279
- );
318
+ return materializeTopicProjectOverlay({
319
+ ...topic,
320
+ ...patch,
321
+ metadata: nextMetadata
322
+ });
280
323
  }
281
324
 
282
325
  // src/resolvers.ts
283
326
  function isMissingLucernChildComponentError2(error) {
284
- const message = error instanceof Error ? error.message : String(error);
285
- return message.includes('Child component ComponentName(Identifier("lucern")) not found') || message.includes("Child component") && message.includes("lucern") && message.includes("not found");
327
+ const message = getErrorMessage2(error);
328
+ return message.includes(
329
+ 'Child component ComponentName(Identifier("lucern")) not found'
330
+ ) || message.includes("Child component") && message.includes("lucern") && message.includes("not found");
331
+ }
332
+ function getErrorMessage2(error) {
333
+ if (error instanceof Error) {
334
+ return error.message;
335
+ }
336
+ if (typeof error === "object" && error !== null && "message" in error && typeof error.message === "string") {
337
+ return error.message;
338
+ }
339
+ return "unknown error";
286
340
  }
287
341
  function isAdvisoryTopicPatch(value) {
288
342
  const advisoryKeys = /* @__PURE__ */ new Set(["lastActivityAt", "updatedAt"]);
@@ -296,32 +350,27 @@ async function patchProjectWithTolerance(ctx, projectId, value) {
296
350
  if (!isAdvisoryTopicPatch(value) || !isMissingLucernChildComponentError2(error)) {
297
351
  throw error;
298
352
  }
299
- console.warn("[lucern graph-primitives] Non-fatal advisory topic patch failure", {
300
- projectId,
301
- keys: Object.keys(value),
302
- error: error instanceof Error ? error.message : error
303
- });
353
+ console.warn(
354
+ "[lucern graph-primitives] Non-fatal advisory topic patch failure",
355
+ {
356
+ projectId,
357
+ keys: Object.keys(value),
358
+ error: getErrorMessage2(error)
359
+ }
360
+ );
304
361
  }
305
362
  }
306
363
  function defaultResolvers() {
307
364
  return {
308
- async getProject(ctx, projectId) {
309
- return await resolveTopicProjectOverlay(ctx, projectId, {
310
- idMode: "legacy",
311
- projectLikeOnly: false
312
- });
313
- },
314
- async patchProject(ctx, projectId, value) {
315
- await patchProjectWithTolerance(ctx, projectId, value);
316
- },
317
- async listTopics(ctx) {
318
- return await listTopicProjectOverlays(ctx, {
319
- idMode: "legacy"
320
- });
321
- },
322
- async getFinalArtifact(ctx, artifactId) {
323
- return await ctx.db.get(artifactId);
324
- }
365
+ getProject: (ctx, projectId) => resolveTopicProjectOverlay(ctx, projectId, {
366
+ idMode: "legacy",
367
+ projectLikeOnly: false
368
+ }),
369
+ patchProject: (ctx, projectId, value) => patchProjectWithTolerance(ctx, projectId, value),
370
+ listTopics: (ctx) => listTopicProjectOverlays(ctx, {
371
+ idMode: "legacy"
372
+ }),
373
+ getFinalArtifact: (ctx, artifactId) => ctx.db.get(artifactId)
325
374
  };
326
375
  }
327
376
  var resolverOverrides = {};
@@ -372,7 +421,14 @@ async function findTopicsByScopeAlias(ctx, scopeId) {
372
421
  "by_graph_scope_project",
373
422
  (q) => q.eq(LEGACY_SCOPE_FIELD2, scopeId)
374
423
  ).collect();
375
- } catch {
424
+ } catch (error) {
425
+ debugGraphPrimitiveFallback(
426
+ "[topicScope] Failed to resolve scope alias via index",
427
+ {
428
+ error,
429
+ scopeId
430
+ }
431
+ );
376
432
  const topics = await ctx.db.query("topics").collect();
377
433
  return topics.filter((topic) => {
378
434
  const normalizedGlobalId = normalizeScopeValue(topic.globalId);
@@ -389,7 +445,14 @@ async function tryResolveHostTopicById(ctx, topicId) {
389
445
  return await ctx.runQuery(api.topics.get, {
390
446
  id: topicId
391
447
  }) ?? null;
392
- } catch {
448
+ } catch (error) {
449
+ debugGraphPrimitiveFallback(
450
+ "[topicScope] Failed to resolve topic by host query",
451
+ {
452
+ error,
453
+ topicId
454
+ }
455
+ );
393
456
  return null;
394
457
  }
395
458
  }
@@ -401,7 +464,14 @@ async function tryResolveHostTopicByLegacyScope(ctx, legacyScopeId) {
401
464
  return await ctx.runQuery(api.topics.getByLegacyScopeId, {
402
465
  projectId: legacyScopeId
403
466
  }) ?? null;
404
- } catch {
467
+ } catch (error) {
468
+ debugGraphPrimitiveFallback(
469
+ "[topicScope] Failed to resolve topic by legacy scope",
470
+ {
471
+ error,
472
+ legacyScopeId
473
+ }
474
+ );
405
475
  return null;
406
476
  }
407
477
  }
@@ -430,8 +500,17 @@ async function resolveTopicProjectScope(ctx, args) {
430
500
  if (args.topicId) {
431
501
  let topic = null;
432
502
  try {
433
- topic = await ctx.db.get(args.topicId);
434
- } catch {
503
+ topic = await ctx.db.get(
504
+ args.topicId
505
+ );
506
+ } catch (error) {
507
+ debugGraphPrimitiveFallback(
508
+ "[topicScope] Failed to load topic by direct id",
509
+ {
510
+ error,
511
+ topicId: args.topicId
512
+ }
513
+ );
435
514
  }
436
515
  if (!topic) {
437
516
  topic = await tryResolveHostTopicById(ctx, String(args.topicId));
@@ -468,7 +547,14 @@ async function resolveTopicProjectScope(ctx, args) {
468
547
  directTopic = await ctx.db.get(
469
548
  args.projectId
470
549
  );
471
- } catch {
550
+ } catch (error) {
551
+ debugGraphPrimitiveFallback(
552
+ "[topicScope] Failed to load direct project topic",
553
+ {
554
+ error,
555
+ projectId: args.projectId
556
+ }
557
+ );
472
558
  }
473
559
  if (directTopic) {
474
560
  const inherited = await resolveInheritedWorkspaceScope(ctx, directTopic);
@@ -1019,7 +1105,20 @@ var getByProject = query({
1019
1105
  if (!hasAccess) {
1020
1106
  return [];
1021
1107
  }
1022
- const scope = await resolveTopicProjectScope(ctx, args).catch(() => null);
1108
+ let scope;
1109
+ try {
1110
+ scope = await resolveTopicProjectScope(ctx, args);
1111
+ } catch (error) {
1112
+ debugGraphPrimitiveFallback(
1113
+ "[questionEvidenceLinks] Failed to resolve topic scope",
1114
+ {
1115
+ error,
1116
+ projectId: args.projectId,
1117
+ topicId: args.topicId
1118
+ }
1119
+ );
1120
+ scope = null;
1121
+ }
1023
1122
  if (!scope) {
1024
1123
  return [];
1025
1124
  }