@lucern/graph-primitives 1.0.22 → 1.0.23
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/beliefDecay.js +46 -0
- package/dist/beliefDecay.js.map +1 -1
- package/dist/beliefEvidenceLinks.js +87 -5
- package/dist/beliefEvidenceLinks.js.map +1 -1
- package/dist/beliefEvidenceLinks.operational.js +41 -5
- package/dist/beliefEvidenceLinks.operational.js.map +1 -1
- package/dist/contradictions.js +46 -0
- package/dist/contradictions.js.map +1 -1
- package/dist/edgeValidation.js +66 -1
- package/dist/edgeValidation.js.map +1 -1
- package/dist/entityBridge.js +66 -1
- package/dist/entityBridge.js.map +1 -1
- package/dist/entityLifecycle.js +90 -5
- package/dist/entityLifecycle.js.map +1 -1
- package/dist/epistemicAnswers.js +64 -11
- package/dist/epistemicAnswers.js.map +1 -1
- package/dist/epistemicBeliefs.admin.js +46 -0
- package/dist/epistemicBeliefs.admin.js.map +1 -1
- package/dist/epistemicBeliefs.backfills.js +46 -0
- package/dist/epistemicBeliefs.backfills.js.map +1 -1
- package/dist/epistemicBeliefs.confidence.d.ts +1 -1
- package/dist/epistemicBeliefs.confidence.js +53 -6
- package/dist/epistemicBeliefs.confidence.js.map +1 -1
- package/dist/epistemicBeliefs.core.js +91 -11
- package/dist/epistemicBeliefs.core.js.map +1 -1
- package/dist/epistemicBeliefs.d.ts +1 -1
- package/dist/epistemicBeliefs.forkEvidence.js.map +1 -1
- package/dist/epistemicBeliefs.helpers.d.ts +2 -2
- package/dist/epistemicBeliefs.helpers.js +46 -0
- package/dist/epistemicBeliefs.helpers.js.map +1 -1
- package/dist/epistemicBeliefs.internal.js +90 -10
- package/dist/epistemicBeliefs.internal.js.map +1 -1
- package/dist/epistemicBeliefs.js +103 -22
- package/dist/epistemicBeliefs.js.map +1 -1
- package/dist/epistemicBeliefs.lifecycle.js +53 -6
- package/dist/epistemicBeliefs.lifecycle.js.map +1 -1
- package/dist/epistemicBeliefs.links.js +85 -4
- package/dist/epistemicBeliefs.links.js.map +1 -1
- package/dist/epistemicBeliefs.topicAnchor.js +39 -8
- package/dist/epistemicBeliefs.topicAnchor.js.map +1 -1
- package/dist/epistemicContracts.evaluators.js +53 -6
- package/dist/epistemicContracts.evaluators.js.map +1 -1
- package/dist/epistemicContracts.handlers.js +54 -10
- package/dist/epistemicContracts.handlers.js.map +1 -1
- package/dist/epistemicContracts.js +54 -10
- package/dist/epistemicContracts.js.map +1 -1
- package/dist/epistemicEdges.d.ts +1 -1
- package/dist/epistemicEdges.handlers.js +48 -3
- package/dist/epistemicEdges.handlers.js.map +1 -1
- package/dist/epistemicEdges.helpers.d.ts +3 -3
- package/dist/epistemicEdges.js +162 -4
- package/dist/epistemicEdges.js.map +1 -1
- package/dist/epistemicEdges.mutations.js +112 -1
- package/dist/epistemicEdges.mutations.js.map +1 -1
- package/dist/epistemicEdges.queries.js +46 -0
- package/dist/epistemicEdges.queries.js.map +1 -1
- package/dist/epistemicEdges.types.d.ts +1 -1
- package/dist/epistemicEvidence.d.ts +1 -1
- package/dist/epistemicEvidence.js +168 -14
- package/dist/epistemicEvidence.js.map +1 -1
- package/dist/epistemicEvidenceHelpers.d.ts +1 -1
- package/dist/epistemicEvidenceHelpers.js +46 -0
- package/dist/epistemicEvidenceHelpers.js.map +1 -1
- package/dist/epistemicEvidenceMutations.js +168 -14
- package/dist/epistemicEvidenceMutations.js.map +1 -1
- package/dist/epistemicEvidenceQueries.js +46 -0
- package/dist/epistemicEvidenceQueries.js.map +1 -1
- package/dist/epistemicHelpers.js +11 -6
- package/dist/epistemicHelpers.js.map +1 -1
- package/dist/epistemicInsert.d.ts +8 -0
- package/dist/epistemicInsert.js +45 -0
- package/dist/epistemicInsert.js.map +1 -0
- package/dist/epistemicNodeCreation.js +11 -6
- package/dist/epistemicNodeCreation.js.map +1 -1
- package/dist/epistemicNodes.helpers.d.ts +1 -1
- package/dist/epistemicNodes.internal.js +53 -1
- package/dist/epistemicNodes.internal.js.map +1 -1
- package/dist/epistemicNodes.js +56 -4
- package/dist/epistemicNodes.js.map +1 -1
- package/dist/epistemicNodes.mutations.js +55 -3
- package/dist/epistemicNodes.mutations.js.map +1 -1
- package/dist/epistemicNodes.queries.js +46 -0
- package/dist/epistemicNodes.queries.js.map +1 -1
- package/dist/epistemicNodes.validators.d.ts +1 -1
- package/dist/epistemicQuestions.conviction.js +46 -0
- package/dist/epistemicQuestions.conviction.js.map +1 -1
- package/dist/epistemicQuestions.create.js +58 -7
- package/dist/epistemicQuestions.create.js.map +1 -1
- package/dist/epistemicQuestions.d.ts +1 -1
- package/dist/epistemicQuestions.evidence.js +53 -2
- package/dist/epistemicQuestions.evidence.js.map +1 -1
- package/dist/epistemicQuestions.helpers.d.ts +1 -1
- package/dist/epistemicQuestions.helpers.js +46 -0
- package/dist/epistemicQuestions.helpers.js.map +1 -1
- package/dist/epistemicQuestions.js +60 -9
- package/dist/epistemicQuestions.js.map +1 -1
- package/dist/epistemicQuestions.lifecycle.js +46 -0
- package/dist/epistemicQuestions.lifecycle.js.map +1 -1
- package/dist/epistemicQuestions.queries.js +46 -0
- package/dist/epistemicQuestions.queries.js.map +1 -1
- package/dist/epistemicQuestions.sprint.js +46 -0
- package/dist/epistemicQuestions.sprint.js.map +1 -1
- package/dist/epistemicQuestions.tail.js +53 -2
- package/dist/epistemicQuestions.tail.js.map +1 -1
- package/dist/epistemicSources.js +53 -2
- package/dist/epistemicSources.js.map +1 -1
- package/dist/helpers.js +66 -1
- package/dist/helpers.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +304 -76
- package/dist/index.js.map +1 -1
- package/dist/proof-attestation.json +1 -1
- package/dist/questionEvidenceLinks.js +46 -0
- package/dist/questionEvidenceLinks.js.map +1 -1
- package/dist/scopeResolverCompat.d.ts +1 -1
- package/dist/scopeResolverCompat.js +46 -0
- package/dist/scopeResolverCompat.js.map +1 -1
- package/dist/{topicScope-By_zp4tt.d.ts → topicScope-7zhyeGl7.d.ts} +1 -1
- package/dist/topicScope.d.ts +1 -1
- package/dist/topicScope.js +46 -0
- package/dist/topicScope.js.map +1 -1
- package/dist/workflowBridge.js +46 -0
- package/dist/workflowBridge.js.map +1 -1
- package/dist/workspaceIsolation.d.ts +1 -1
- package/dist/workspaceIsolation.js +46 -0
- package/dist/workspaceIsolation.js.map +1 -1
- package/package.json +4 -4
|
@@ -3,8 +3,9 @@ import { componentsGeneric, anyApi, mutationGeneric, internalMutationGeneric, qu
|
|
|
3
3
|
import { v } from 'convex/values';
|
|
4
4
|
import { requireProjectAccess, checkProjectAccess, checkScopeAccess } from '@lucern/access-control/access';
|
|
5
5
|
import { permissiveReturn } from '@lucern/contracts/schema-helpers/validators';
|
|
6
|
-
import { generateGlobalId } from '@lucern/contracts/ids';
|
|
6
|
+
import { generateGlobalId, assertUuidV7Identity, assertStorageEdgeVocabulary, assertCanonicalEdgeEndpoint } from '@lucern/contracts/ids';
|
|
7
7
|
import { isNodeType, getLayerForNodeType } from '@lucern/contracts/schema-helpers/spine/tables/epistemicNodes';
|
|
8
|
+
import { assertEdgePolicyAllowed, edgePolicyManifest } from '@lucern/contracts';
|
|
8
9
|
import { listAudienceRegistryRows } from '@lucern/access-control/audienceRegistry';
|
|
9
10
|
|
|
10
11
|
// src/epistemicEvidenceHelpers.ts
|
|
@@ -355,6 +356,35 @@ function resolveGraphPrimitivesAppResolvers(_ctx) {
|
|
|
355
356
|
};
|
|
356
357
|
}
|
|
357
358
|
var LEGACY_SCOPE_FIELD2 = "graphScopeProjectId";
|
|
359
|
+
async function resolveTopicNodeScopeOrNull(ctx, ref) {
|
|
360
|
+
if (!ctx?.db || typeof ctx.db.query !== "function") {
|
|
361
|
+
return null;
|
|
362
|
+
}
|
|
363
|
+
let node = null;
|
|
364
|
+
try {
|
|
365
|
+
const byGlobalId = await ctx.db.query("epistemicNodes").withIndex("by_globalId", (q) => q.eq("globalId", ref)).first();
|
|
366
|
+
if (byGlobalId && byGlobalId.nodeType === "topic") {
|
|
367
|
+
node = byGlobalId;
|
|
368
|
+
}
|
|
369
|
+
} catch (error) {
|
|
370
|
+
debugGraphPrimitiveFallback(
|
|
371
|
+
"[topicScope] topic-node scope lookup by globalId failed",
|
|
372
|
+
{ error, ref }
|
|
373
|
+
);
|
|
374
|
+
}
|
|
375
|
+
if (!node) {
|
|
376
|
+
return null;
|
|
377
|
+
}
|
|
378
|
+
const scopeKey = normalizeScopeValue(node.topicId) ?? normalizeScopeValue(node.globalId);
|
|
379
|
+
if (!scopeKey) {
|
|
380
|
+
return null;
|
|
381
|
+
}
|
|
382
|
+
return {
|
|
383
|
+
topicId: scopeKey,
|
|
384
|
+
projectId: asMappedProjectId(node),
|
|
385
|
+
source: "topic_node"
|
|
386
|
+
};
|
|
387
|
+
}
|
|
358
388
|
function asMappedProjectId(topic) {
|
|
359
389
|
if (!topic) {
|
|
360
390
|
return;
|
|
@@ -495,6 +525,13 @@ async function resolveTopicProjectScope(ctx, args) {
|
|
|
495
525
|
) ?? null;
|
|
496
526
|
}
|
|
497
527
|
if (!topic) {
|
|
528
|
+
const nodeScope = await resolveTopicNodeScopeOrNull(
|
|
529
|
+
ctx,
|
|
530
|
+
String(args.topicId)
|
|
531
|
+
);
|
|
532
|
+
if (nodeScope) {
|
|
533
|
+
return nodeScope;
|
|
534
|
+
}
|
|
498
535
|
throw new Error(`Topic not found: ${String(args.topicId)}`);
|
|
499
536
|
}
|
|
500
537
|
const inherited = await resolveInheritedWorkspaceScope(ctx, topic);
|
|
@@ -565,6 +602,16 @@ async function resolveTopicProjectScope(ctx, args) {
|
|
|
565
602
|
source: "project_mapped_topic"
|
|
566
603
|
};
|
|
567
604
|
}
|
|
605
|
+
const nodeScope = await resolveTopicNodeScopeOrNull(
|
|
606
|
+
ctx,
|
|
607
|
+
String(args.projectId)
|
|
608
|
+
);
|
|
609
|
+
if (nodeScope) {
|
|
610
|
+
return {
|
|
611
|
+
...nodeScope,
|
|
612
|
+
projectId: nodeScope.projectId ?? String(args.projectId)
|
|
613
|
+
};
|
|
614
|
+
}
|
|
568
615
|
throw new Error(
|
|
569
616
|
`Legacy project scope ${String(args.projectId)} has no mapped topic.`
|
|
570
617
|
);
|
|
@@ -894,6 +941,43 @@ function assertTenantPackWorkspaceMutationAllowed(args) {
|
|
|
894
941
|
}
|
|
895
942
|
});
|
|
896
943
|
}
|
|
944
|
+
async function insertEpistemicNode(ctx, doc) {
|
|
945
|
+
assertUuidV7Identity("epistemicNodes", doc.globalId);
|
|
946
|
+
return ctx.db.insert("epistemicNodes", doc);
|
|
947
|
+
}
|
|
948
|
+
async function insertEpistemicEdge(ctx, doc) {
|
|
949
|
+
assertUuidV7Identity("epistemicEdges", doc.globalId);
|
|
950
|
+
assertStorageEdgeVocabulary(doc.edgeType);
|
|
951
|
+
if (!doc.fromNodeId || typeof doc.fromNodeId !== "string") {
|
|
952
|
+
throw new Error(
|
|
953
|
+
"edge_endpoint_missing: epistemicEdges insert requires a non-empty fromNodeId"
|
|
954
|
+
);
|
|
955
|
+
}
|
|
956
|
+
if (!doc.toNodeId || typeof doc.toNodeId !== "string") {
|
|
957
|
+
throw new Error(
|
|
958
|
+
"edge_endpoint_missing: epistemicEdges insert requires a non-empty toNodeId"
|
|
959
|
+
);
|
|
960
|
+
}
|
|
961
|
+
assertCanonicalEdgeEndpoint("fromNodeId", doc.fromNodeId);
|
|
962
|
+
assertCanonicalEdgeEndpoint("toNodeId", doc.toNodeId);
|
|
963
|
+
if (doc.fromNodeType && doc.toNodeType && doc.edgeType !== "extracted_from") {
|
|
964
|
+
assertEdgePolicyAllowed(
|
|
965
|
+
edgePolicyManifest,
|
|
966
|
+
doc.edgeType,
|
|
967
|
+
{
|
|
968
|
+
kind: "epistemic_node",
|
|
969
|
+
nodeId: doc.fromNodeId,
|
|
970
|
+
nodeType: doc.fromNodeType
|
|
971
|
+
},
|
|
972
|
+
{
|
|
973
|
+
kind: "epistemic_node",
|
|
974
|
+
nodeId: doc.toNodeId,
|
|
975
|
+
nodeType: doc.toNodeType
|
|
976
|
+
}
|
|
977
|
+
);
|
|
978
|
+
}
|
|
979
|
+
return ctx.db.insert("epistemicEdges", doc);
|
|
980
|
+
}
|
|
897
981
|
|
|
898
982
|
// src/epistemicEvidenceMutations.ts
|
|
899
983
|
function assertSignedImpactScore(value, context) {
|
|
@@ -915,17 +999,17 @@ function normalizeEvidenceRelation(relation, weight, context) {
|
|
|
915
999
|
return weight < 0 ? "contradicts" : "supports";
|
|
916
1000
|
}
|
|
917
1001
|
async function createEvidenceBeliefEdge(ctx, args) {
|
|
918
|
-
const edgeGlobalId =
|
|
1002
|
+
const edgeGlobalId = generateGlobalId();
|
|
919
1003
|
const confidence = Math.abs(args.weight);
|
|
920
1004
|
const existingEdges = await ctx.db.query("epistemicEdges").withIndex(
|
|
921
1005
|
"by_from_to",
|
|
922
|
-
(q) => q.eq("fromNodeId", args.
|
|
1006
|
+
(q) => q.eq("fromNodeId", args.evidenceGlobalId).eq("toNodeId", args.beliefGlobalId)
|
|
923
1007
|
).collect();
|
|
924
1008
|
const existing = existingEdges.find((edge) => edge.edgeType === "informs");
|
|
925
1009
|
const edgeDoc = {
|
|
926
1010
|
globalId: edgeGlobalId,
|
|
927
|
-
fromNodeId: args.
|
|
928
|
-
toNodeId: args.
|
|
1011
|
+
fromNodeId: args.evidenceGlobalId,
|
|
1012
|
+
toNodeId: args.beliefGlobalId,
|
|
929
1013
|
sourceGlobalId: args.evidenceGlobalId,
|
|
930
1014
|
targetGlobalId: args.beliefGlobalId,
|
|
931
1015
|
edgeType: "informs",
|
|
@@ -957,7 +1041,7 @@ async function createEvidenceBeliefEdge(ctx, args) {
|
|
|
957
1041
|
createdAt: existing.createdAt ?? edgeDoc.createdAt
|
|
958
1042
|
});
|
|
959
1043
|
} else {
|
|
960
|
-
await ctx
|
|
1044
|
+
await insertEpistemicEdge(ctx, edgeDoc);
|
|
961
1045
|
}
|
|
962
1046
|
await ctx.scheduler.runAfter(5e3, internal.neo4jEdgeAPI.createEdge, {
|
|
963
1047
|
globalId: existing?.globalId ?? edgeGlobalId,
|
|
@@ -996,10 +1080,23 @@ var create = mutation({
|
|
|
996
1080
|
sourceQuestionId: v.optional(v.string()),
|
|
997
1081
|
userId: v.string(),
|
|
998
1082
|
rationale: v.string(),
|
|
999
|
-
//
|
|
1083
|
+
// RC.1 taxonomy fields — top-level projection (mirroring kernel evidenceCreate.ts)
|
|
1084
|
+
sourceRef: v.optional(v.string()),
|
|
1085
|
+
sourceQuality: v.optional(
|
|
1086
|
+
v.union(
|
|
1087
|
+
v.literal("primary"),
|
|
1088
|
+
v.literal("analyzed"),
|
|
1089
|
+
v.literal("secondary"),
|
|
1090
|
+
v.literal("tertiary"),
|
|
1091
|
+
v.literal("unknown")
|
|
1092
|
+
)
|
|
1093
|
+
),
|
|
1000
1094
|
methodology: v.optional(v.string()),
|
|
1001
1095
|
informationAsymmetry: v.optional(v.string()),
|
|
1002
1096
|
sourceDescription: v.optional(v.string()),
|
|
1097
|
+
// signedImpact is derived from weight; accepted as an explicit override for
|
|
1098
|
+
// callers that already have the signed value (kernel parity).
|
|
1099
|
+
signedImpact: v.optional(v.number()),
|
|
1003
1100
|
metadata: v.optional(v.any()),
|
|
1004
1101
|
// Required belief impact link.
|
|
1005
1102
|
linkedBeliefNodeId: v.id("epistemicNodes"),
|
|
@@ -1029,6 +1126,7 @@ var create = mutation({
|
|
|
1029
1126
|
const kind = normalizeKind(args.kind);
|
|
1030
1127
|
const sourceType = normalizeSourceType(args.sourceType);
|
|
1031
1128
|
const weight = assertSignedImpactScore(args.weight, "Evidence creation");
|
|
1129
|
+
const signedImpact = args.signedImpact !== void 0 ? assertSignedImpactScore(args.signedImpact, "Evidence creation signedImpact") : weight;
|
|
1032
1130
|
const evidenceRelation = normalizeEvidenceRelation(
|
|
1033
1131
|
args.evidenceRelation,
|
|
1034
1132
|
weight,
|
|
@@ -1039,7 +1137,7 @@ var create = mutation({
|
|
|
1039
1137
|
throw new Error("Evidence creation requires a linked belief node");
|
|
1040
1138
|
}
|
|
1041
1139
|
const additionalMetadata = args.metadata && typeof args.metadata === "object" ? args.metadata : {};
|
|
1042
|
-
const nodeId = await ctx
|
|
1140
|
+
const nodeId = await insertEpistemicNode(ctx, {
|
|
1043
1141
|
globalId,
|
|
1044
1142
|
topicId: scope.topicId,
|
|
1045
1143
|
projectId: scope.projectId,
|
|
@@ -1054,6 +1152,15 @@ var create = mutation({
|
|
|
1054
1152
|
status: "active",
|
|
1055
1153
|
epistemicLayer: "L2",
|
|
1056
1154
|
sourceType,
|
|
1155
|
+
// RC.1 taxonomy fields — top-level projection
|
|
1156
|
+
evidenceRelation,
|
|
1157
|
+
signedImpact,
|
|
1158
|
+
targetBeliefId: String(args.linkedBeliefNodeId),
|
|
1159
|
+
...typeof args.sourceRef === "string" && args.sourceRef.trim().length > 0 ? { sourceRef: args.sourceRef.trim() } : {},
|
|
1160
|
+
...typeof args.sourceQuality === "string" && args.sourceQuality.length > 0 ? { sourceQuality: args.sourceQuality } : {},
|
|
1161
|
+
...typeof args.methodology === "string" && args.methodology.length > 0 ? { methodology: args.methodology } : {},
|
|
1162
|
+
...typeof args.informationAsymmetry === "string" && args.informationAsymmetry.length > 0 ? { informationAsymmetry: args.informationAsymmetry } : {},
|
|
1163
|
+
...typeof args.sourceDescription === "string" && args.sourceDescription.trim().length > 0 ? { sourceDescription: args.sourceDescription.trim() } : {},
|
|
1057
1164
|
createdAt: now,
|
|
1058
1165
|
updatedAt: now,
|
|
1059
1166
|
createdBy: args.userId,
|
|
@@ -1089,7 +1196,6 @@ var create = mutation({
|
|
|
1089
1196
|
text: args.text
|
|
1090
1197
|
});
|
|
1091
1198
|
await createEvidenceBeliefEdge(ctx, {
|
|
1092
|
-
evidenceNodeId: nodeId,
|
|
1093
1199
|
evidenceGlobalId: globalId,
|
|
1094
1200
|
beliefNodeId: args.linkedBeliefNodeId,
|
|
1095
1201
|
beliefGlobalId: linkedBeliefNode.globalId,
|
|
@@ -1159,7 +1265,22 @@ var createAndLink = mutation({
|
|
|
1159
1265
|
beliefNodeId: v.id("epistemicNodes"),
|
|
1160
1266
|
relation: v.union(v.literal("supports"), v.literal("contradicts")),
|
|
1161
1267
|
weight: v.number(),
|
|
1162
|
-
confidence: v.optional(v.number())
|
|
1268
|
+
confidence: v.optional(v.number()),
|
|
1269
|
+
// RC.1 taxonomy fields — top-level projection (mirroring kernel evidenceCreate.ts)
|
|
1270
|
+
sourceRef: v.optional(v.string()),
|
|
1271
|
+
sourceQuality: v.optional(
|
|
1272
|
+
v.union(
|
|
1273
|
+
v.literal("primary"),
|
|
1274
|
+
v.literal("analyzed"),
|
|
1275
|
+
v.literal("secondary"),
|
|
1276
|
+
v.literal("tertiary"),
|
|
1277
|
+
v.literal("unknown")
|
|
1278
|
+
)
|
|
1279
|
+
),
|
|
1280
|
+
methodology: v.optional(v.string()),
|
|
1281
|
+
informationAsymmetry: v.optional(v.string()),
|
|
1282
|
+
sourceDescription: v.optional(v.string()),
|
|
1283
|
+
signedImpact: v.optional(v.number())
|
|
1163
1284
|
},
|
|
1164
1285
|
returns: permissiveReturn,
|
|
1165
1286
|
handler: async (ctx, args) => {
|
|
@@ -1174,6 +1295,7 @@ var createAndLink = mutation({
|
|
|
1174
1295
|
const kind = normalizeKind(args.kind);
|
|
1175
1296
|
const sourceType = normalizeSourceType(args.sourceType);
|
|
1176
1297
|
const weight = assertSignedImpactScore(args.weight, "Evidence createAndLink");
|
|
1298
|
+
const signedImpact = args.signedImpact !== void 0 ? assertSignedImpactScore(args.signedImpact, "Evidence createAndLink signedImpact") : weight;
|
|
1177
1299
|
const relation = normalizeEvidenceRelation(
|
|
1178
1300
|
args.relation,
|
|
1179
1301
|
weight,
|
|
@@ -1184,7 +1306,7 @@ var createAndLink = mutation({
|
|
|
1184
1306
|
if (!beliefNode || beliefNode.nodeType !== "belief") {
|
|
1185
1307
|
throw new Error("Belief node not found for edge creation");
|
|
1186
1308
|
}
|
|
1187
|
-
const nodeId = await ctx
|
|
1309
|
+
const nodeId = await insertEpistemicNode(ctx, {
|
|
1188
1310
|
globalId,
|
|
1189
1311
|
topicId: scope.topicId,
|
|
1190
1312
|
projectId: scope.projectId,
|
|
@@ -1196,6 +1318,15 @@ var createAndLink = mutation({
|
|
|
1196
1318
|
status: "active",
|
|
1197
1319
|
epistemicLayer: "L2",
|
|
1198
1320
|
sourceType,
|
|
1321
|
+
// RC.1 taxonomy fields — top-level projection
|
|
1322
|
+
evidenceRelation: relation,
|
|
1323
|
+
signedImpact,
|
|
1324
|
+
targetBeliefId: String(args.beliefNodeId),
|
|
1325
|
+
...typeof args.sourceRef === "string" && args.sourceRef.trim().length > 0 ? { sourceRef: args.sourceRef.trim() } : {},
|
|
1326
|
+
...typeof args.sourceQuality === "string" && args.sourceQuality.length > 0 ? { sourceQuality: args.sourceQuality } : {},
|
|
1327
|
+
...typeof args.methodology === "string" && args.methodology.length > 0 ? { methodology: args.methodology } : {},
|
|
1328
|
+
...typeof args.informationAsymmetry === "string" && args.informationAsymmetry.length > 0 ? { informationAsymmetry: args.informationAsymmetry } : {},
|
|
1329
|
+
...typeof args.sourceDescription === "string" && args.sourceDescription.trim().length > 0 ? { sourceDescription: args.sourceDescription.trim() } : {},
|
|
1199
1330
|
createdAt: now,
|
|
1200
1331
|
updatedAt: now,
|
|
1201
1332
|
createdBy: args.userId,
|
|
@@ -1214,7 +1345,6 @@ var createAndLink = mutation({
|
|
|
1214
1345
|
operation: "upsert"
|
|
1215
1346
|
});
|
|
1216
1347
|
const edgeGlobalId = await createEvidenceBeliefEdge(ctx, {
|
|
1217
|
-
evidenceNodeId: nodeId,
|
|
1218
1348
|
evidenceGlobalId: globalId,
|
|
1219
1349
|
beliefNodeId: args.beliefNodeId,
|
|
1220
1350
|
beliefGlobalId: beliefNode.globalId,
|
|
@@ -1287,6 +1417,21 @@ var internalCreate = internalMutation({
|
|
|
1287
1417
|
evidenceRelation: v.optional(v.string()),
|
|
1288
1418
|
weight: v.number(),
|
|
1289
1419
|
confidence: v.optional(v.number()),
|
|
1420
|
+
// RC.1 taxonomy fields — top-level projection (mirroring kernel evidenceCreate.ts)
|
|
1421
|
+
sourceRef: v.optional(v.string()),
|
|
1422
|
+
sourceQuality: v.optional(
|
|
1423
|
+
v.union(
|
|
1424
|
+
v.literal("primary"),
|
|
1425
|
+
v.literal("analyzed"),
|
|
1426
|
+
v.literal("secondary"),
|
|
1427
|
+
v.literal("tertiary"),
|
|
1428
|
+
v.literal("unknown")
|
|
1429
|
+
)
|
|
1430
|
+
),
|
|
1431
|
+
methodology: v.optional(v.string()),
|
|
1432
|
+
informationAsymmetry: v.optional(v.string()),
|
|
1433
|
+
sourceDescription: v.optional(v.string()),
|
|
1434
|
+
signedImpact: v.optional(v.number()),
|
|
1290
1435
|
metadata: v.optional(v.any()),
|
|
1291
1436
|
runtimeToolName: v.optional(v.string()),
|
|
1292
1437
|
runtimePackKey: v.optional(v.string()),
|
|
@@ -1321,6 +1466,7 @@ var internalCreate = internalMutation({
|
|
|
1321
1466
|
const kind = normalizeKind(args.kind);
|
|
1322
1467
|
const sourceType = normalizeSourceType(args.sourceType);
|
|
1323
1468
|
const weight = assertSignedImpactScore(args.weight, "Internal evidence creation");
|
|
1469
|
+
const signedImpact = args.signedImpact !== void 0 ? assertSignedImpactScore(args.signedImpact, "Internal evidence creation signedImpact") : weight;
|
|
1324
1470
|
const evidenceRelation = normalizeEvidenceRelation(
|
|
1325
1471
|
args.evidenceRelation,
|
|
1326
1472
|
weight,
|
|
@@ -1331,7 +1477,7 @@ var internalCreate = internalMutation({
|
|
|
1331
1477
|
throw new Error("Internal evidence creation requires a linked belief node");
|
|
1332
1478
|
}
|
|
1333
1479
|
const additionalMetadata = args.metadata && typeof args.metadata === "object" ? args.metadata : {};
|
|
1334
|
-
const nodeId = await ctx
|
|
1480
|
+
const nodeId = await insertEpistemicNode(ctx, {
|
|
1335
1481
|
globalId,
|
|
1336
1482
|
topicId: scope.topicId,
|
|
1337
1483
|
projectId: scope.projectId,
|
|
@@ -1346,6 +1492,15 @@ var internalCreate = internalMutation({
|
|
|
1346
1492
|
status: "active",
|
|
1347
1493
|
epistemicLayer: "L2",
|
|
1348
1494
|
sourceType,
|
|
1495
|
+
// RC.1 taxonomy fields — top-level projection
|
|
1496
|
+
evidenceRelation,
|
|
1497
|
+
signedImpact,
|
|
1498
|
+
targetBeliefId: String(args.linkedBeliefNodeId),
|
|
1499
|
+
...typeof args.sourceRef === "string" && args.sourceRef.trim().length > 0 ? { sourceRef: args.sourceRef.trim() } : {},
|
|
1500
|
+
...typeof args.sourceQuality === "string" && args.sourceQuality.length > 0 ? { sourceQuality: args.sourceQuality } : {},
|
|
1501
|
+
...typeof args.methodology === "string" && args.methodology.length > 0 ? { methodology: args.methodology } : {},
|
|
1502
|
+
...typeof args.informationAsymmetry === "string" && args.informationAsymmetry.length > 0 ? { informationAsymmetry: args.informationAsymmetry } : {},
|
|
1503
|
+
...typeof args.sourceDescription === "string" && args.sourceDescription.trim().length > 0 ? { sourceDescription: args.sourceDescription.trim() } : {},
|
|
1349
1504
|
createdAt: now,
|
|
1350
1505
|
updatedAt: now,
|
|
1351
1506
|
createdBy: args.userId,
|
|
@@ -1391,7 +1546,6 @@ var internalCreate = internalMutation({
|
|
|
1391
1546
|
operation: "upsert"
|
|
1392
1547
|
});
|
|
1393
1548
|
await createEvidenceBeliefEdge(ctx, {
|
|
1394
|
-
evidenceNodeId: nodeId,
|
|
1395
1549
|
evidenceGlobalId: globalId,
|
|
1396
1550
|
beliefNodeId: args.linkedBeliefNodeId,
|
|
1397
1551
|
beliefGlobalId: linkedBeliefNode.globalId,
|