@lucern/graph-primitives 1.0.16 → 1.0.18
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/entityLifecycle.js +1 -12
- package/dist/entityLifecycle.js.map +1 -1
- package/dist/epistemicAnswers.js +1 -12
- package/dist/epistemicAnswers.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 +946 -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 +175 -51
- package/dist/epistemicBeliefs.internal.js.map +1 -1
- package/dist/epistemicBeliefs.js +437 -84
- 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 +47 -13
- 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 +72 -54
- package/dist/epistemicContracts.handlers.js.map +1 -1
- package/dist/epistemicContracts.js +72 -54
- 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/epistemicEdgeCreation.js +1 -12
- package/dist/epistemicEdgeCreation.js.map +1 -1
- package/dist/epistemicEdges.helpers.d.ts +1 -1
- package/dist/epistemicEvidence.js +173 -93
- package/dist/epistemicEvidence.js.map +1 -1
- package/dist/epistemicEvidenceMutations.js +173 -93
- package/dist/epistemicEvidenceMutations.js.map +1 -1
- package/dist/epistemicHelpers.js +1 -12
- package/dist/epistemicHelpers.js.map +1 -1
- package/dist/epistemicNodeCreation.js +1 -10
- package/dist/epistemicNodeCreation.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/epistemicQuestions.create.js +1 -12
- package/dist/epistemicQuestions.create.js.map +1 -1
- package/dist/epistemicQuestions.evidence.js +1 -12
- package/dist/epistemicQuestions.evidence.js.map +1 -1
- package/dist/epistemicQuestions.js +1 -12
- package/dist/epistemicQuestions.js.map +1 -1
- package/dist/epistemicQuestions.tail.js +1 -12
- package/dist/epistemicQuestions.tail.js.map +1 -1
- package/dist/epistemicSources.js +1 -12
- package/dist/epistemicSources.js.map +1 -1
- package/dist/evaluators/index.js +1 -1
- package/dist/evaluators/index.js.map +1 -1
- package/dist/globalId-4y9SPpC_.d.ts +10 -0
- package/dist/globalId.d.ts +1 -1
- package/dist/globalId.js +1 -13
- package/dist/globalId.js.map +1 -1
- package/dist/helpers.js +1 -12
- package/dist/helpers.js.map +1 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.js +771 -247
- 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
- package/dist/globalId-DKh9d_uD.d.ts +0 -20
|
@@ -6,6 +6,7 @@ import { getCurrentUserId } from '@lucern/access-control/auth';
|
|
|
6
6
|
import { componentsGeneric, internalMutationGeneric, anyApi, queryGeneric, mutationGeneric } from 'convex/server';
|
|
7
7
|
import '@lucern/contracts/schema-helpers/spine/tables/epistemicNodes';
|
|
8
8
|
import { permissiveReturn } from '@lucern/contracts/schema-helpers/validators';
|
|
9
|
+
import { generateGlobalId } from '@lucern/contracts/ids';
|
|
9
10
|
|
|
10
11
|
// src/epistemicBeliefs.helpers.ts
|
|
11
12
|
|
|
@@ -13,18 +14,32 @@ import { permissiveReturn } from '@lucern/contracts/schema-helpers/validators';
|
|
|
13
14
|
var BELIEF_STATUS_VALUES = [
|
|
14
15
|
"assumption",
|
|
15
16
|
"hypothesis",
|
|
16
|
-
"
|
|
17
|
-
"
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
"confirmed",
|
|
21
|
-
"disconfirmed",
|
|
22
|
-
"partial",
|
|
23
|
-
"expired"
|
|
17
|
+
"active",
|
|
18
|
+
"superseded",
|
|
19
|
+
"resolved_true",
|
|
20
|
+
"resolved_false"
|
|
24
21
|
];
|
|
25
22
|
function isBeliefLifecycleStatus(value) {
|
|
26
23
|
return typeof value === "string" && BELIEF_STATUS_VALUES.includes(value);
|
|
27
24
|
}
|
|
25
|
+
function normalizeLegacyBeliefStatus(value) {
|
|
26
|
+
if (isBeliefLifecycleStatus(value)) {
|
|
27
|
+
return value;
|
|
28
|
+
}
|
|
29
|
+
if (value === "belief" || value === "established" || value === "emerging") {
|
|
30
|
+
return "active";
|
|
31
|
+
}
|
|
32
|
+
if (value === "fact" || value === "confirmed") {
|
|
33
|
+
return "resolved_true";
|
|
34
|
+
}
|
|
35
|
+
if (value === "disconfirmed" || value === "expired") {
|
|
36
|
+
return "resolved_false";
|
|
37
|
+
}
|
|
38
|
+
if (value === "deprecated") {
|
|
39
|
+
return "superseded";
|
|
40
|
+
}
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
28
43
|
function normalizeBeliefConfidence(confidence) {
|
|
29
44
|
if (typeof confidence !== "number" || !Number.isFinite(confidence)) {
|
|
30
45
|
return null;
|
|
@@ -44,47 +59,61 @@ function isResolvedByConfidence(confidence) {
|
|
|
44
59
|
}
|
|
45
60
|
return normalized <= 0 || normalized >= 1;
|
|
46
61
|
}
|
|
47
|
-
function
|
|
62
|
+
function getPredictionMetaFromMetadata(metadata) {
|
|
63
|
+
return metadata?.predictionMeta;
|
|
64
|
+
}
|
|
65
|
+
function resolvedPredictionStatus(predictionMeta) {
|
|
48
66
|
if (!predictionMeta || typeof predictionMeta !== "object") {
|
|
49
|
-
return
|
|
67
|
+
return null;
|
|
50
68
|
}
|
|
51
69
|
const outcome = predictionMeta.outcome;
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
70
|
+
if (outcome === "confirmed") {
|
|
71
|
+
return "resolved_true";
|
|
72
|
+
}
|
|
73
|
+
if (outcome === "disconfirmed" || outcome === "expired") {
|
|
74
|
+
return "resolved_false";
|
|
75
|
+
}
|
|
76
|
+
return null;
|
|
56
77
|
}
|
|
57
|
-
function
|
|
78
|
+
function shouldTreatBeliefAsResolved(opts) {
|
|
58
79
|
if (isResolvedByConfidence(opts.confidence)) {
|
|
59
|
-
|
|
80
|
+
const normalized = normalizeBeliefConfidence(opts.confidence);
|
|
81
|
+
return normalized === 0 ? "resolved_false" : "resolved_true";
|
|
60
82
|
}
|
|
61
|
-
|
|
62
|
-
|
|
83
|
+
const directPredictionStatus = resolvedPredictionStatus(opts.predictionMeta);
|
|
84
|
+
if (directPredictionStatus) {
|
|
85
|
+
return directPredictionStatus;
|
|
63
86
|
}
|
|
64
|
-
|
|
65
|
-
|
|
87
|
+
const metadataPredictionStatus = resolvedPredictionStatus(
|
|
88
|
+
getPredictionMetaFromMetadata(opts.metadata)
|
|
89
|
+
);
|
|
90
|
+
if (metadataPredictionStatus) {
|
|
91
|
+
return metadataPredictionStatus;
|
|
66
92
|
}
|
|
67
|
-
return
|
|
93
|
+
return null;
|
|
68
94
|
}
|
|
69
95
|
function resolveBeliefLifecycleStatus(opts) {
|
|
70
|
-
|
|
71
|
-
|
|
96
|
+
const resolvedStatus = shouldTreatBeliefAsResolved(opts);
|
|
97
|
+
if (resolvedStatus) {
|
|
98
|
+
return resolvedStatus;
|
|
72
99
|
}
|
|
73
100
|
const direct = opts.beliefStatus;
|
|
74
|
-
|
|
101
|
+
const normalizedDirect = normalizeLegacyBeliefStatus(direct);
|
|
102
|
+
if (normalizedDirect) {
|
|
75
103
|
const normalized = normalizeBeliefConfidence(opts.confidence);
|
|
76
|
-
if (normalized !== null && isPreValidationBeliefStatus(
|
|
77
|
-
return "
|
|
104
|
+
if (normalized !== null && isPreValidationBeliefStatus(normalizedDirect)) {
|
|
105
|
+
return "active";
|
|
78
106
|
}
|
|
79
|
-
return
|
|
107
|
+
return normalizedDirect;
|
|
80
108
|
}
|
|
81
109
|
const metaStatus = opts.metadata?.beliefStatus;
|
|
82
|
-
|
|
110
|
+
const normalizedMetaStatus = normalizeLegacyBeliefStatus(metaStatus);
|
|
111
|
+
if (normalizedMetaStatus) {
|
|
83
112
|
const normalized = normalizeBeliefConfidence(opts.confidence);
|
|
84
|
-
if (normalized !== null && isPreValidationBeliefStatus(
|
|
85
|
-
return "
|
|
113
|
+
if (normalized !== null && isPreValidationBeliefStatus(normalizedMetaStatus)) {
|
|
114
|
+
return "active";
|
|
86
115
|
}
|
|
87
|
-
return
|
|
116
|
+
return normalizedMetaStatus;
|
|
88
117
|
}
|
|
89
118
|
return "assumption";
|
|
90
119
|
}
|
|
@@ -92,13 +121,14 @@ function isPreValidationBeliefStatus(status) {
|
|
|
92
121
|
return status === "assumption" || status === "hypothesis";
|
|
93
122
|
}
|
|
94
123
|
function promoteBeliefStatusAfterScoring(status, opts) {
|
|
95
|
-
|
|
96
|
-
|
|
124
|
+
const resolvedStatus = shouldTreatBeliefAsResolved({ ...opts });
|
|
125
|
+
if (resolvedStatus) {
|
|
126
|
+
return resolvedStatus;
|
|
97
127
|
}
|
|
98
128
|
if (isPreValidationBeliefStatus(status)) {
|
|
99
|
-
return "
|
|
129
|
+
return "active";
|
|
100
130
|
}
|
|
101
|
-
return status
|
|
131
|
+
return status;
|
|
102
132
|
}
|
|
103
133
|
var api = anyApi;
|
|
104
134
|
componentsGeneric();
|
|
@@ -455,7 +485,7 @@ function buildBeliefConfidenceRow(args) {
|
|
|
455
485
|
disbelief: args.disbelief,
|
|
456
486
|
uncertainty: args.uncertainty,
|
|
457
487
|
baseRate: args.baseRate,
|
|
458
|
-
slOperator: args.slOperator ?? "
|
|
488
|
+
slOperator: args.slOperator ?? "prior_seed",
|
|
459
489
|
trigger: args.trigger,
|
|
460
490
|
...args.rationale ? { rationale: args.rationale } : {},
|
|
461
491
|
assessedBy: args.assessedBy,
|
|
@@ -982,17 +1012,17 @@ async function applyBeliefConfidenceChange(ctx, args) {
|
|
|
982
1012
|
status: 404,
|
|
983
1013
|
code: "NOT_FOUND",
|
|
984
1014
|
invariantCode: "belief.exists",
|
|
985
|
-
suggestion: "Verify nodeId points to an existing node before
|
|
1015
|
+
suggestion: "Verify nodeId points to an existing node before appending SL scoring.",
|
|
986
1016
|
details: { nodeId: args.nodeId }
|
|
987
1017
|
});
|
|
988
1018
|
}
|
|
989
1019
|
if (node.nodeType !== "belief") {
|
|
990
1020
|
throwStructuredMutationError({
|
|
991
|
-
message: `
|
|
1021
|
+
message: `appendSlScoring only applies to belief nodes. Received nodeType "${node.nodeType}". Entity nodes (company, person, investor, etc.) do not have confidence \u2014 use entityLifecycle.updateEntityAttributes for mutable entity data.`,
|
|
992
1022
|
status: 400,
|
|
993
1023
|
code: "INVALID_ARGUMENT",
|
|
994
1024
|
invariantCode: "entity.no_confidence",
|
|
995
|
-
suggestion: "Use entityLifecycle.updateEntityAttributes for entity mutations.
|
|
1025
|
+
suggestion: "Use entityLifecycle.updateEntityAttributes for entity mutations. appendSlScoring is for belief nodes only.",
|
|
996
1026
|
details: { nodeId: args.nodeId, nodeType: node.nodeType }
|
|
997
1027
|
});
|
|
998
1028
|
}
|
|
@@ -1002,7 +1032,7 @@ async function applyBeliefConfidenceChange(ctx, args) {
|
|
|
1002
1032
|
status: 400,
|
|
1003
1033
|
code: "MISSING_SCOPE",
|
|
1004
1034
|
invariantCode: "belief.project_required",
|
|
1005
|
-
suggestion: "Belief must have a projectId
|
|
1035
|
+
suggestion: "Belief must have a projectId before SL scoring can be appended.",
|
|
1006
1036
|
details: { nodeId: args.nodeId }
|
|
1007
1037
|
});
|
|
1008
1038
|
}
|
|
@@ -1025,7 +1055,7 @@ async function applyBeliefConfidenceChange(ctx, args) {
|
|
|
1025
1055
|
status: 409,
|
|
1026
1056
|
code: "CONFLICT",
|
|
1027
1057
|
invariantCode: "belief.confidence_append_only",
|
|
1028
|
-
suggestion: "Complete a worktree linked to this belief before recording
|
|
1058
|
+
suggestion: "Complete a worktree linked to this belief before recording SL scoring.",
|
|
1029
1059
|
details: { nodeId: args.nodeId }
|
|
1030
1060
|
});
|
|
1031
1061
|
}
|
|
@@ -1280,18 +1310,6 @@ internalMutation({
|
|
|
1280
1310
|
}
|
|
1281
1311
|
});
|
|
1282
1312
|
|
|
1283
|
-
// src/globalId.ts
|
|
1284
|
-
function generateGlobalId() {
|
|
1285
|
-
const bytes = new Uint8Array(16);
|
|
1286
|
-
crypto.getRandomValues(bytes);
|
|
1287
|
-
bytes[6] = bytes[6] & 15 | 64;
|
|
1288
|
-
bytes[8] = bytes[8] & 63 | 128;
|
|
1289
|
-
const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join(
|
|
1290
|
-
""
|
|
1291
|
-
);
|
|
1292
|
-
return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
|
|
1293
|
-
}
|
|
1294
|
-
|
|
1295
1313
|
// src/epistemicContracts.metrics.ts
|
|
1296
1314
|
var ACTIVE_CONTRADICTION_STATUSES = /* @__PURE__ */ new Set([
|
|
1297
1315
|
"unresolved",
|
|
@@ -1490,7 +1508,7 @@ async function evaluateBuiltInEvidentialContract(args) {
|
|
|
1490
1508
|
observedValue: snapshot.value,
|
|
1491
1509
|
operator: config.operator,
|
|
1492
1510
|
threshold: config.threshold,
|
|
1493
|
-
action: config.action ?? "
|
|
1511
|
+
action: config.action ?? "append_sl_scoring",
|
|
1494
1512
|
actionParams: config.actionParams
|
|
1495
1513
|
}
|
|
1496
1514
|
};
|