@lucern/graph-primitives 1.0.15 → 1.0.17
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.
- package/dist/beliefEvidenceLinks.js +144 -99
- package/dist/beliefEvidenceLinks.js.map +1 -1
- package/dist/beliefEvidenceLinks.operational.d.ts +29 -0
- package/dist/beliefEvidenceLinks.operational.js +157 -0
- package/dist/beliefEvidenceLinks.operational.js.map +1 -0
- package/dist/{beliefLifecycle-y8WLXqQj.d.ts → beliefLifecycle-CXwdDw5e.d.ts} +7 -4
- package/dist/beliefLifecycle.d.ts +1 -1
- package/dist/beliefLifecycle.js +75 -18
- package/dist/beliefLifecycle.js.map +1 -1
- package/dist/epistemicBeliefs.admin.js.map +1 -1
- package/dist/epistemicBeliefs.backfills.d.ts +1 -1
- package/dist/epistemicBeliefs.backfills.js +63 -35
- package/dist/epistemicBeliefs.backfills.js.map +1 -1
- package/dist/epistemicBeliefs.confidence.d.ts +1 -1
- package/dist/epistemicBeliefs.confidence.js +70 -41
- package/dist/epistemicBeliefs.confidence.js.map +1 -1
- package/dist/epistemicBeliefs.core.js +957 -566
- package/dist/epistemicBeliefs.core.js.map +1 -1
- package/dist/epistemicBeliefs.d.ts +2 -2
- package/dist/epistemicBeliefs.forkEvidence.d.ts +18 -0
- package/dist/epistemicBeliefs.forkEvidence.js +121 -0
- package/dist/epistemicBeliefs.forkEvidence.js.map +1 -0
- package/dist/epistemicBeliefs.helpers.d.ts +2 -2
- package/dist/epistemicBeliefs.helpers.js +60 -32
- package/dist/epistemicBeliefs.helpers.js.map +1 -1
- package/dist/epistemicBeliefs.internal.js +174 -39
- package/dist/epistemicBeliefs.internal.js.map +1 -1
- package/dist/epistemicBeliefs.js +436 -72
- package/dist/epistemicBeliefs.js.map +1 -1
- package/dist/epistemicBeliefs.lifecycle.d.ts +2 -2
- package/dist/epistemicBeliefs.lifecycle.js +75 -47
- package/dist/epistemicBeliefs.lifecycle.js.map +1 -1
- package/dist/epistemicBeliefs.links.js +46 -1
- package/dist/epistemicBeliefs.links.js.map +1 -1
- package/dist/epistemicBeliefs.topicAnchor.d.ts +29 -0
- package/dist/epistemicBeliefs.topicAnchor.js +105 -0
- package/dist/epistemicBeliefs.topicAnchor.js.map +1 -0
- package/dist/epistemicContracts.evaluators.js +71 -42
- package/dist/epistemicContracts.evaluators.js.map +1 -1
- package/dist/epistemicContracts.handlers.js +71 -42
- package/dist/epistemicContracts.handlers.js.map +1 -1
- package/dist/epistemicContracts.js +71 -42
- package/dist/epistemicContracts.js.map +1 -1
- package/dist/epistemicContracts.metrics.js +1 -1
- package/dist/epistemicContracts.metrics.js.map +1 -1
- package/dist/epistemicContracts.types.d.ts +1 -1
- package/dist/epistemicEdges.helpers.d.ts +1 -1
- package/dist/epistemicEvidence.js +172 -81
- package/dist/epistemicEvidence.js.map +1 -1
- package/dist/epistemicEvidenceMutations.js +172 -81
- package/dist/epistemicEvidenceMutations.js.map +1 -1
- package/dist/epistemicNodes.internal.js.map +1 -1
- package/dist/epistemicNodes.js +2 -2
- package/dist/epistemicNodes.js.map +1 -1
- package/dist/epistemicNodes.mutations.js +2 -2
- package/dist/epistemicNodes.mutations.js.map +1 -1
- package/dist/evaluators/index.js +1 -1
- package/dist/evaluators/index.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +767 -236
- package/dist/index.js.map +1 -1
- package/dist/invariantEnforcement.js +2 -2
- package/dist/invariantEnforcement.js.map +1 -1
- package/dist/proof-attestation.json +3 -3
- package/package.json +4 -4
|
@@ -264,6 +264,102 @@ var optionalScopeArgs = {
|
|
|
264
264
|
projectId: v.optional(v.string()),
|
|
265
265
|
topicId: v.optional(v.string())
|
|
266
266
|
};
|
|
267
|
+
|
|
268
|
+
// src/epistemicBeliefs.topicAnchor.ts
|
|
269
|
+
function cleanString(value) {
|
|
270
|
+
return typeof value === "string" && value.trim().length > 0 ? value.trim() : void 0;
|
|
271
|
+
}
|
|
272
|
+
function topicNodeCandidates(topicRef) {
|
|
273
|
+
const normalized = topicRef.trim();
|
|
274
|
+
if (!normalized) {
|
|
275
|
+
return [];
|
|
276
|
+
}
|
|
277
|
+
const candidates = [normalized];
|
|
278
|
+
if (normalized.startsWith("top_")) {
|
|
279
|
+
candidates.push(normalized.slice(4));
|
|
280
|
+
}
|
|
281
|
+
return [...new Set(candidates)];
|
|
282
|
+
}
|
|
283
|
+
function readTopicNodeRef(args) {
|
|
284
|
+
return cleanString(args.topicGlobalId) ?? cleanString(args.topicNodeId) ?? cleanString(args.topicId);
|
|
285
|
+
}
|
|
286
|
+
async function resolveRequiredTopicAnchor(ctx, topicRef) {
|
|
287
|
+
for (const candidate of topicNodeCandidates(topicRef)) {
|
|
288
|
+
try {
|
|
289
|
+
const direct = await ctx.db.get(candidate);
|
|
290
|
+
if (direct?.nodeType === "topic" && cleanString(direct.globalId)) {
|
|
291
|
+
return direct;
|
|
292
|
+
}
|
|
293
|
+
} catch (_) {
|
|
294
|
+
}
|
|
295
|
+
const byGlobalId = await ctx.db.query("epistemicNodes").withIndex("by_globalId", (q) => q.eq("globalId", candidate)).first();
|
|
296
|
+
if (byGlobalId?.nodeType === "topic" && cleanString(byGlobalId.globalId)) {
|
|
297
|
+
return byGlobalId;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
throw new Error(
|
|
301
|
+
"Belief creation requires topicGlobalId or topicNodeId for a topic node in epistemicNodes. Legacy topics-table IDs are not valid belief anchors."
|
|
302
|
+
);
|
|
303
|
+
}
|
|
304
|
+
function scopeFromTopicAnchor(topicNode) {
|
|
305
|
+
return {
|
|
306
|
+
topicId: topicNode.globalId,
|
|
307
|
+
projectId: cleanString(topicNode.projectId),
|
|
308
|
+
tenantId: cleanString(topicNode.tenantId),
|
|
309
|
+
workspaceId: cleanString(topicNode.workspaceId),
|
|
310
|
+
source: "topic"
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
async function createRequiredBeliefTopicEdge(ctx, args) {
|
|
314
|
+
const topicGlobalId = args.topicNode.globalId;
|
|
315
|
+
const edgeGlobalId = `edge:${args.beliefGlobalId}:${topicGlobalId}:scoped_by`;
|
|
316
|
+
const now = Date.now();
|
|
317
|
+
const existing = await ctx.db.query("epistemicEdges").withIndex("by_globalId", (q) => q.eq("globalId", edgeGlobalId)).first();
|
|
318
|
+
if (!existing) {
|
|
319
|
+
await ctx.db.insert("epistemicEdges", {
|
|
320
|
+
globalId: edgeGlobalId,
|
|
321
|
+
fromNodeId: String(args.beliefNodeId),
|
|
322
|
+
toNodeId: String(args.topicNode._id),
|
|
323
|
+
sourceGlobalId: args.beliefGlobalId,
|
|
324
|
+
targetGlobalId: topicGlobalId,
|
|
325
|
+
edgeType: "scoped_by",
|
|
326
|
+
weight: 1,
|
|
327
|
+
confidence: 1,
|
|
328
|
+
context: "Belief creation topic anchor invariant.",
|
|
329
|
+
reasoningMethod: "implicit",
|
|
330
|
+
derivationType: "topic_scope_invariant",
|
|
331
|
+
metadata: { invariant: "belief.topic_edge_required" },
|
|
332
|
+
createdBy: args.createdBy,
|
|
333
|
+
createdAt: now,
|
|
334
|
+
updatedAt: now,
|
|
335
|
+
projectId: cleanString(args.topicNode.projectId),
|
|
336
|
+
topicId: topicGlobalId,
|
|
337
|
+
tenantId: cleanString(args.topicNode.tenantId),
|
|
338
|
+
workspaceId: cleanString(args.topicNode.workspaceId),
|
|
339
|
+
fromNodeType: "belief",
|
|
340
|
+
toNodeType: "topic",
|
|
341
|
+
fromLayer: "L3",
|
|
342
|
+
toLayer: args.topicNode.epistemicLayer ?? "ontological"
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.createEdge, {
|
|
346
|
+
globalId: edgeGlobalId,
|
|
347
|
+
fromGlobalId: args.beliefGlobalId,
|
|
348
|
+
toGlobalId: topicGlobalId,
|
|
349
|
+
edgeType: "scoped_by",
|
|
350
|
+
weight: 1,
|
|
351
|
+
confidence: 1,
|
|
352
|
+
context: "Belief creation topic anchor invariant.",
|
|
353
|
+
projectId: cleanString(args.topicNode.projectId),
|
|
354
|
+
topicId: topicGlobalId,
|
|
355
|
+
createdBy: args.createdBy,
|
|
356
|
+
fromNodeType: "belief",
|
|
357
|
+
toNodeType: "topic",
|
|
358
|
+
fromLayer: "L3",
|
|
359
|
+
toLayer: args.topicNode.epistemicLayer ?? "ontological",
|
|
360
|
+
metadata: { invariant: "belief.topic_edge_required" }
|
|
361
|
+
});
|
|
362
|
+
}
|
|
267
363
|
function normalizeScopeValue2(value) {
|
|
268
364
|
if (typeof value !== "string") {
|
|
269
365
|
return;
|
|
@@ -362,18 +458,32 @@ function assertTenantPackWorkspaceMutationAllowed(args) {
|
|
|
362
458
|
var BELIEF_STATUS_VALUES = [
|
|
363
459
|
"assumption",
|
|
364
460
|
"hypothesis",
|
|
365
|
-
"
|
|
366
|
-
"
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
"confirmed",
|
|
370
|
-
"disconfirmed",
|
|
371
|
-
"partial",
|
|
372
|
-
"expired"
|
|
461
|
+
"active",
|
|
462
|
+
"superseded",
|
|
463
|
+
"resolved_true",
|
|
464
|
+
"resolved_false"
|
|
373
465
|
];
|
|
374
466
|
function isBeliefLifecycleStatus(value) {
|
|
375
467
|
return typeof value === "string" && BELIEF_STATUS_VALUES.includes(value);
|
|
376
468
|
}
|
|
469
|
+
function normalizeLegacyBeliefStatus(value) {
|
|
470
|
+
if (isBeliefLifecycleStatus(value)) {
|
|
471
|
+
return value;
|
|
472
|
+
}
|
|
473
|
+
if (value === "belief" || value === "established" || value === "emerging") {
|
|
474
|
+
return "active";
|
|
475
|
+
}
|
|
476
|
+
if (value === "fact" || value === "confirmed") {
|
|
477
|
+
return "resolved_true";
|
|
478
|
+
}
|
|
479
|
+
if (value === "disconfirmed" || value === "expired") {
|
|
480
|
+
return "resolved_false";
|
|
481
|
+
}
|
|
482
|
+
if (value === "deprecated") {
|
|
483
|
+
return "superseded";
|
|
484
|
+
}
|
|
485
|
+
return null;
|
|
486
|
+
}
|
|
377
487
|
function normalizeBeliefConfidence(confidence) {
|
|
378
488
|
if (typeof confidence !== "number" || !Number.isFinite(confidence)) {
|
|
379
489
|
return null;
|
|
@@ -393,47 +503,61 @@ function isResolvedByConfidence(confidence) {
|
|
|
393
503
|
}
|
|
394
504
|
return normalized <= 0 || normalized >= 1;
|
|
395
505
|
}
|
|
396
|
-
function
|
|
506
|
+
function getPredictionMetaFromMetadata(metadata) {
|
|
507
|
+
return metadata?.predictionMeta;
|
|
508
|
+
}
|
|
509
|
+
function resolvedPredictionStatus(predictionMeta) {
|
|
397
510
|
if (!predictionMeta || typeof predictionMeta !== "object") {
|
|
398
|
-
return
|
|
511
|
+
return null;
|
|
399
512
|
}
|
|
400
513
|
const outcome = predictionMeta.outcome;
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
514
|
+
if (outcome === "confirmed") {
|
|
515
|
+
return "resolved_true";
|
|
516
|
+
}
|
|
517
|
+
if (outcome === "disconfirmed" || outcome === "expired") {
|
|
518
|
+
return "resolved_false";
|
|
519
|
+
}
|
|
520
|
+
return null;
|
|
405
521
|
}
|
|
406
|
-
function
|
|
522
|
+
function shouldTreatBeliefAsResolved(opts) {
|
|
407
523
|
if (isResolvedByConfidence(opts.confidence)) {
|
|
408
|
-
|
|
524
|
+
const normalized = normalizeBeliefConfidence(opts.confidence);
|
|
525
|
+
return normalized === 0 ? "resolved_false" : "resolved_true";
|
|
409
526
|
}
|
|
410
|
-
|
|
411
|
-
|
|
527
|
+
const directPredictionStatus = resolvedPredictionStatus(opts.predictionMeta);
|
|
528
|
+
if (directPredictionStatus) {
|
|
529
|
+
return directPredictionStatus;
|
|
412
530
|
}
|
|
413
|
-
|
|
414
|
-
|
|
531
|
+
const metadataPredictionStatus = resolvedPredictionStatus(
|
|
532
|
+
getPredictionMetaFromMetadata(opts.metadata)
|
|
533
|
+
);
|
|
534
|
+
if (metadataPredictionStatus) {
|
|
535
|
+
return metadataPredictionStatus;
|
|
415
536
|
}
|
|
416
|
-
return
|
|
537
|
+
return null;
|
|
417
538
|
}
|
|
418
539
|
function resolveBeliefLifecycleStatus(opts) {
|
|
419
|
-
|
|
420
|
-
|
|
540
|
+
const resolvedStatus = shouldTreatBeliefAsResolved(opts);
|
|
541
|
+
if (resolvedStatus) {
|
|
542
|
+
return resolvedStatus;
|
|
421
543
|
}
|
|
422
544
|
const direct = opts.beliefStatus;
|
|
423
|
-
|
|
545
|
+
const normalizedDirect = normalizeLegacyBeliefStatus(direct);
|
|
546
|
+
if (normalizedDirect) {
|
|
424
547
|
const normalized = normalizeBeliefConfidence(opts.confidence);
|
|
425
|
-
if (normalized !== null && isPreValidationBeliefStatus(
|
|
426
|
-
return "
|
|
548
|
+
if (normalized !== null && isPreValidationBeliefStatus(normalizedDirect)) {
|
|
549
|
+
return "active";
|
|
427
550
|
}
|
|
428
|
-
return
|
|
551
|
+
return normalizedDirect;
|
|
429
552
|
}
|
|
430
553
|
const metaStatus = opts.metadata?.beliefStatus;
|
|
431
|
-
|
|
554
|
+
const normalizedMetaStatus = normalizeLegacyBeliefStatus(metaStatus);
|
|
555
|
+
if (normalizedMetaStatus) {
|
|
432
556
|
const normalized = normalizeBeliefConfidence(opts.confidence);
|
|
433
|
-
if (normalized !== null && isPreValidationBeliefStatus(
|
|
434
|
-
return "
|
|
557
|
+
if (normalized !== null && isPreValidationBeliefStatus(normalizedMetaStatus)) {
|
|
558
|
+
return "active";
|
|
435
559
|
}
|
|
436
|
-
return
|
|
560
|
+
return normalizedMetaStatus;
|
|
437
561
|
}
|
|
438
562
|
return "assumption";
|
|
439
563
|
}
|
|
@@ -811,7 +935,7 @@ function buildBeliefConfidenceRow(args) {
|
|
|
811
935
|
disbelief: args.disbelief,
|
|
812
936
|
uncertainty: args.uncertainty,
|
|
813
937
|
baseRate: args.baseRate,
|
|
814
|
-
slOperator: args.slOperator ?? "
|
|
938
|
+
slOperator: args.slOperator ?? "prior_seed",
|
|
815
939
|
trigger: args.trigger,
|
|
816
940
|
...args.rationale ? { rationale: args.rationale } : {},
|
|
817
941
|
assessedBy: args.assessedBy,
|
|
@@ -1131,6 +1255,8 @@ var internalGetById = internalQuery({
|
|
|
1131
1255
|
var internalCreate = internalMutation({
|
|
1132
1256
|
args: {
|
|
1133
1257
|
...optionalBeliefScopeArgs,
|
|
1258
|
+
topicNodeId: v.optional(v.string()),
|
|
1259
|
+
topicGlobalId: v.optional(v.string()),
|
|
1134
1260
|
formulation: v.string(),
|
|
1135
1261
|
baseRate: v.optional(v.number()),
|
|
1136
1262
|
confidence: v.optional(
|
|
@@ -1169,10 +1295,14 @@ var internalCreate = internalMutation({
|
|
|
1169
1295
|
handler: async (ctx, args) => {
|
|
1170
1296
|
const now = Date.now();
|
|
1171
1297
|
const baseRate = assertBaseRateInRange(args.baseRate ?? 0.5);
|
|
1172
|
-
const
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1298
|
+
const topicRef = readTopicNodeRef(args);
|
|
1299
|
+
if (!topicRef) {
|
|
1300
|
+
throw new Error(
|
|
1301
|
+
"Belief creation requires topicGlobalId or topicNodeId for a topic node in epistemicNodes."
|
|
1302
|
+
);
|
|
1303
|
+
}
|
|
1304
|
+
const topicNode = await resolveRequiredTopicAnchor(ctx, topicRef);
|
|
1305
|
+
const scope = scopeFromTopicAnchor(topicNode);
|
|
1176
1306
|
assertWorkspaceScopedEpistemicNodeScope({
|
|
1177
1307
|
scope,
|
|
1178
1308
|
nodeType: "belief",
|
|
@@ -1188,11 +1318,10 @@ var internalCreate = internalMutation({
|
|
|
1188
1318
|
},
|
|
1189
1319
|
mutationName: "epistemicBeliefs.internalCreate"
|
|
1190
1320
|
});
|
|
1191
|
-
const topic = await ctx.db.get(scope.topicId);
|
|
1192
1321
|
const normalizedBeliefType = await assertSchemaEnumValue(ctx, {
|
|
1193
1322
|
category: "belief_type",
|
|
1194
1323
|
value: args.beliefType,
|
|
1195
|
-
tenantId:
|
|
1324
|
+
tenantId: scope.tenantId,
|
|
1196
1325
|
context: "epistemicBeliefs.internalCreate"
|
|
1197
1326
|
});
|
|
1198
1327
|
const globalId = generateGlobalId();
|
|
@@ -1256,9 +1385,15 @@ var internalCreate = internalMutation({
|
|
|
1256
1385
|
rationale: "LKC-2 mandatory prior: seeded vacuous opinion at belief creation.",
|
|
1257
1386
|
assessedBy: args.userId,
|
|
1258
1387
|
assessedAt: now,
|
|
1259
|
-
slOperator: "
|
|
1388
|
+
slOperator: "prior_seed"
|
|
1260
1389
|
})
|
|
1261
1390
|
);
|
|
1391
|
+
await createRequiredBeliefTopicEdge(ctx, {
|
|
1392
|
+
beliefNodeId: nodeId,
|
|
1393
|
+
beliefGlobalId: globalId,
|
|
1394
|
+
topicNode,
|
|
1395
|
+
createdBy: args.userId
|
|
1396
|
+
});
|
|
1262
1397
|
await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {
|
|
1263
1398
|
nodeId,
|
|
1264
1399
|
operation: "upsert"
|