@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
|
@@ -2,9 +2,10 @@ import { v } from 'convex/values';
|
|
|
2
2
|
import { requireProjectAccess, checkProjectAccess } from '@lucern/access-control/access';
|
|
3
3
|
import { permissiveReturn } from '@lucern/contracts/schema-helpers/validators';
|
|
4
4
|
import { componentsGeneric, anyApi, mutationGeneric, internalMutationGeneric } from 'convex/server';
|
|
5
|
-
import { generateGlobalId } from '@lucern/contracts/ids';
|
|
5
|
+
import { generateGlobalId, assertUuidV7Identity, assertStorageEdgeVocabulary, assertCanonicalEdgeEndpoint } from '@lucern/contracts/ids';
|
|
6
6
|
import { isNodeType, getLayerForNodeType } from '@lucern/contracts/schema-helpers/spine/tables/epistemicNodes';
|
|
7
7
|
import '@lucern/access-control/audience';
|
|
8
|
+
import { assertEdgePolicyAllowed, edgePolicyManifest } from '@lucern/contracts';
|
|
8
9
|
|
|
9
10
|
// src/epistemicEvidenceMutations.ts
|
|
10
11
|
var api = anyApi;
|
|
@@ -54,6 +55,35 @@ async function scheduleEmbeddingGeneration(args) {
|
|
|
54
55
|
}
|
|
55
56
|
}
|
|
56
57
|
var LEGACY_SCOPE_FIELD = "graphScopeProjectId";
|
|
58
|
+
async function resolveTopicNodeScopeOrNull(ctx, ref) {
|
|
59
|
+
if (!ctx?.db || typeof ctx.db.query !== "function") {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
let node = null;
|
|
63
|
+
try {
|
|
64
|
+
const byGlobalId = await ctx.db.query("epistemicNodes").withIndex("by_globalId", (q) => q.eq("globalId", ref)).first();
|
|
65
|
+
if (byGlobalId && byGlobalId.nodeType === "topic") {
|
|
66
|
+
node = byGlobalId;
|
|
67
|
+
}
|
|
68
|
+
} catch (error) {
|
|
69
|
+
debugGraphPrimitiveFallback(
|
|
70
|
+
"[topicScope] topic-node scope lookup by globalId failed",
|
|
71
|
+
{ error, ref }
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
if (!node) {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
const scopeKey = normalizeScopeValue(node.topicId) ?? normalizeScopeValue(node.globalId);
|
|
78
|
+
if (!scopeKey) {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
topicId: scopeKey,
|
|
83
|
+
projectId: asMappedProjectId(node),
|
|
84
|
+
source: "topic_node"
|
|
85
|
+
};
|
|
86
|
+
}
|
|
57
87
|
function asMappedProjectId(topic) {
|
|
58
88
|
if (!topic) {
|
|
59
89
|
return;
|
|
@@ -194,6 +224,13 @@ async function resolveTopicProjectScope(ctx, args) {
|
|
|
194
224
|
) ?? null;
|
|
195
225
|
}
|
|
196
226
|
if (!topic) {
|
|
227
|
+
const nodeScope = await resolveTopicNodeScopeOrNull(
|
|
228
|
+
ctx,
|
|
229
|
+
String(args.topicId)
|
|
230
|
+
);
|
|
231
|
+
if (nodeScope) {
|
|
232
|
+
return nodeScope;
|
|
233
|
+
}
|
|
197
234
|
throw new Error(`Topic not found: ${String(args.topicId)}`);
|
|
198
235
|
}
|
|
199
236
|
const inherited = await resolveInheritedWorkspaceScope(ctx, topic);
|
|
@@ -264,6 +301,16 @@ async function resolveTopicProjectScope(ctx, args) {
|
|
|
264
301
|
source: "project_mapped_topic"
|
|
265
302
|
};
|
|
266
303
|
}
|
|
304
|
+
const nodeScope = await resolveTopicNodeScopeOrNull(
|
|
305
|
+
ctx,
|
|
306
|
+
String(args.projectId)
|
|
307
|
+
);
|
|
308
|
+
if (nodeScope) {
|
|
309
|
+
return {
|
|
310
|
+
...nodeScope,
|
|
311
|
+
projectId: nodeScope.projectId ?? String(args.projectId)
|
|
312
|
+
};
|
|
313
|
+
}
|
|
267
314
|
throw new Error(
|
|
268
315
|
`Legacy project scope ${String(args.projectId)} has no mapped topic.`
|
|
269
316
|
);
|
|
@@ -760,6 +807,43 @@ async function resolveEvidenceScopeOrNull(ctx, args) {
|
|
|
760
807
|
return null;
|
|
761
808
|
}
|
|
762
809
|
}
|
|
810
|
+
async function insertEpistemicNode(ctx, doc) {
|
|
811
|
+
assertUuidV7Identity("epistemicNodes", doc.globalId);
|
|
812
|
+
return ctx.db.insert("epistemicNodes", doc);
|
|
813
|
+
}
|
|
814
|
+
async function insertEpistemicEdge(ctx, doc) {
|
|
815
|
+
assertUuidV7Identity("epistemicEdges", doc.globalId);
|
|
816
|
+
assertStorageEdgeVocabulary(doc.edgeType);
|
|
817
|
+
if (!doc.fromNodeId || typeof doc.fromNodeId !== "string") {
|
|
818
|
+
throw new Error(
|
|
819
|
+
"edge_endpoint_missing: epistemicEdges insert requires a non-empty fromNodeId"
|
|
820
|
+
);
|
|
821
|
+
}
|
|
822
|
+
if (!doc.toNodeId || typeof doc.toNodeId !== "string") {
|
|
823
|
+
throw new Error(
|
|
824
|
+
"edge_endpoint_missing: epistemicEdges insert requires a non-empty toNodeId"
|
|
825
|
+
);
|
|
826
|
+
}
|
|
827
|
+
assertCanonicalEdgeEndpoint("fromNodeId", doc.fromNodeId);
|
|
828
|
+
assertCanonicalEdgeEndpoint("toNodeId", doc.toNodeId);
|
|
829
|
+
if (doc.fromNodeType && doc.toNodeType && doc.edgeType !== "extracted_from") {
|
|
830
|
+
assertEdgePolicyAllowed(
|
|
831
|
+
edgePolicyManifest,
|
|
832
|
+
doc.edgeType,
|
|
833
|
+
{
|
|
834
|
+
kind: "epistemic_node",
|
|
835
|
+
nodeId: doc.fromNodeId,
|
|
836
|
+
nodeType: doc.fromNodeType
|
|
837
|
+
},
|
|
838
|
+
{
|
|
839
|
+
kind: "epistemic_node",
|
|
840
|
+
nodeId: doc.toNodeId,
|
|
841
|
+
nodeType: doc.toNodeType
|
|
842
|
+
}
|
|
843
|
+
);
|
|
844
|
+
}
|
|
845
|
+
return ctx.db.insert("epistemicEdges", doc);
|
|
846
|
+
}
|
|
763
847
|
|
|
764
848
|
// src/epistemicEvidenceMutations.ts
|
|
765
849
|
function assertSignedImpactScore(value, context) {
|
|
@@ -781,17 +865,17 @@ function normalizeEvidenceRelation(relation, weight, context) {
|
|
|
781
865
|
return weight < 0 ? "contradicts" : "supports";
|
|
782
866
|
}
|
|
783
867
|
async function createEvidenceBeliefEdge(ctx, args) {
|
|
784
|
-
const edgeGlobalId =
|
|
868
|
+
const edgeGlobalId = generateGlobalId();
|
|
785
869
|
const confidence = Math.abs(args.weight);
|
|
786
870
|
const existingEdges = await ctx.db.query("epistemicEdges").withIndex(
|
|
787
871
|
"by_from_to",
|
|
788
|
-
(q) => q.eq("fromNodeId", args.
|
|
872
|
+
(q) => q.eq("fromNodeId", args.evidenceGlobalId).eq("toNodeId", args.beliefGlobalId)
|
|
789
873
|
).collect();
|
|
790
874
|
const existing = existingEdges.find((edge) => edge.edgeType === "informs");
|
|
791
875
|
const edgeDoc = {
|
|
792
876
|
globalId: edgeGlobalId,
|
|
793
|
-
fromNodeId: args.
|
|
794
|
-
toNodeId: args.
|
|
877
|
+
fromNodeId: args.evidenceGlobalId,
|
|
878
|
+
toNodeId: args.beliefGlobalId,
|
|
795
879
|
sourceGlobalId: args.evidenceGlobalId,
|
|
796
880
|
targetGlobalId: args.beliefGlobalId,
|
|
797
881
|
edgeType: "informs",
|
|
@@ -823,7 +907,7 @@ async function createEvidenceBeliefEdge(ctx, args) {
|
|
|
823
907
|
createdAt: existing.createdAt ?? edgeDoc.createdAt
|
|
824
908
|
});
|
|
825
909
|
} else {
|
|
826
|
-
await ctx
|
|
910
|
+
await insertEpistemicEdge(ctx, edgeDoc);
|
|
827
911
|
}
|
|
828
912
|
await ctx.scheduler.runAfter(5e3, internal.neo4jEdgeAPI.createEdge, {
|
|
829
913
|
globalId: existing?.globalId ?? edgeGlobalId,
|
|
@@ -862,10 +946,23 @@ var create = mutation({
|
|
|
862
946
|
sourceQuestionId: v.optional(v.string()),
|
|
863
947
|
userId: v.string(),
|
|
864
948
|
rationale: v.string(),
|
|
865
|
-
//
|
|
949
|
+
// RC.1 taxonomy fields — top-level projection (mirroring kernel evidenceCreate.ts)
|
|
950
|
+
sourceRef: v.optional(v.string()),
|
|
951
|
+
sourceQuality: v.optional(
|
|
952
|
+
v.union(
|
|
953
|
+
v.literal("primary"),
|
|
954
|
+
v.literal("analyzed"),
|
|
955
|
+
v.literal("secondary"),
|
|
956
|
+
v.literal("tertiary"),
|
|
957
|
+
v.literal("unknown")
|
|
958
|
+
)
|
|
959
|
+
),
|
|
866
960
|
methodology: v.optional(v.string()),
|
|
867
961
|
informationAsymmetry: v.optional(v.string()),
|
|
868
962
|
sourceDescription: v.optional(v.string()),
|
|
963
|
+
// signedImpact is derived from weight; accepted as an explicit override for
|
|
964
|
+
// callers that already have the signed value (kernel parity).
|
|
965
|
+
signedImpact: v.optional(v.number()),
|
|
869
966
|
metadata: v.optional(v.any()),
|
|
870
967
|
// Required belief impact link.
|
|
871
968
|
linkedBeliefNodeId: v.id("epistemicNodes"),
|
|
@@ -895,6 +992,7 @@ var create = mutation({
|
|
|
895
992
|
const kind = normalizeKind(args.kind);
|
|
896
993
|
const sourceType = normalizeSourceType(args.sourceType);
|
|
897
994
|
const weight = assertSignedImpactScore(args.weight, "Evidence creation");
|
|
995
|
+
const signedImpact = args.signedImpact !== void 0 ? assertSignedImpactScore(args.signedImpact, "Evidence creation signedImpact") : weight;
|
|
898
996
|
const evidenceRelation = normalizeEvidenceRelation(
|
|
899
997
|
args.evidenceRelation,
|
|
900
998
|
weight,
|
|
@@ -905,7 +1003,7 @@ var create = mutation({
|
|
|
905
1003
|
throw new Error("Evidence creation requires a linked belief node");
|
|
906
1004
|
}
|
|
907
1005
|
const additionalMetadata = args.metadata && typeof args.metadata === "object" ? args.metadata : {};
|
|
908
|
-
const nodeId = await ctx
|
|
1006
|
+
const nodeId = await insertEpistemicNode(ctx, {
|
|
909
1007
|
globalId,
|
|
910
1008
|
topicId: scope.topicId,
|
|
911
1009
|
projectId: scope.projectId,
|
|
@@ -920,6 +1018,15 @@ var create = mutation({
|
|
|
920
1018
|
status: "active",
|
|
921
1019
|
epistemicLayer: "L2",
|
|
922
1020
|
sourceType,
|
|
1021
|
+
// RC.1 taxonomy fields — top-level projection
|
|
1022
|
+
evidenceRelation,
|
|
1023
|
+
signedImpact,
|
|
1024
|
+
targetBeliefId: String(args.linkedBeliefNodeId),
|
|
1025
|
+
...typeof args.sourceRef === "string" && args.sourceRef.trim().length > 0 ? { sourceRef: args.sourceRef.trim() } : {},
|
|
1026
|
+
...typeof args.sourceQuality === "string" && args.sourceQuality.length > 0 ? { sourceQuality: args.sourceQuality } : {},
|
|
1027
|
+
...typeof args.methodology === "string" && args.methodology.length > 0 ? { methodology: args.methodology } : {},
|
|
1028
|
+
...typeof args.informationAsymmetry === "string" && args.informationAsymmetry.length > 0 ? { informationAsymmetry: args.informationAsymmetry } : {},
|
|
1029
|
+
...typeof args.sourceDescription === "string" && args.sourceDescription.trim().length > 0 ? { sourceDescription: args.sourceDescription.trim() } : {},
|
|
923
1030
|
createdAt: now,
|
|
924
1031
|
updatedAt: now,
|
|
925
1032
|
createdBy: args.userId,
|
|
@@ -955,7 +1062,6 @@ var create = mutation({
|
|
|
955
1062
|
text: args.text
|
|
956
1063
|
});
|
|
957
1064
|
await createEvidenceBeliefEdge(ctx, {
|
|
958
|
-
evidenceNodeId: nodeId,
|
|
959
1065
|
evidenceGlobalId: globalId,
|
|
960
1066
|
beliefNodeId: args.linkedBeliefNodeId,
|
|
961
1067
|
beliefGlobalId: linkedBeliefNode.globalId,
|
|
@@ -1025,7 +1131,22 @@ var createAndLink = mutation({
|
|
|
1025
1131
|
beliefNodeId: v.id("epistemicNodes"),
|
|
1026
1132
|
relation: v.union(v.literal("supports"), v.literal("contradicts")),
|
|
1027
1133
|
weight: v.number(),
|
|
1028
|
-
confidence: v.optional(v.number())
|
|
1134
|
+
confidence: v.optional(v.number()),
|
|
1135
|
+
// RC.1 taxonomy fields — top-level projection (mirroring kernel evidenceCreate.ts)
|
|
1136
|
+
sourceRef: v.optional(v.string()),
|
|
1137
|
+
sourceQuality: v.optional(
|
|
1138
|
+
v.union(
|
|
1139
|
+
v.literal("primary"),
|
|
1140
|
+
v.literal("analyzed"),
|
|
1141
|
+
v.literal("secondary"),
|
|
1142
|
+
v.literal("tertiary"),
|
|
1143
|
+
v.literal("unknown")
|
|
1144
|
+
)
|
|
1145
|
+
),
|
|
1146
|
+
methodology: v.optional(v.string()),
|
|
1147
|
+
informationAsymmetry: v.optional(v.string()),
|
|
1148
|
+
sourceDescription: v.optional(v.string()),
|
|
1149
|
+
signedImpact: v.optional(v.number())
|
|
1029
1150
|
},
|
|
1030
1151
|
returns: permissiveReturn,
|
|
1031
1152
|
handler: async (ctx, args) => {
|
|
@@ -1040,6 +1161,7 @@ var createAndLink = mutation({
|
|
|
1040
1161
|
const kind = normalizeKind(args.kind);
|
|
1041
1162
|
const sourceType = normalizeSourceType(args.sourceType);
|
|
1042
1163
|
const weight = assertSignedImpactScore(args.weight, "Evidence createAndLink");
|
|
1164
|
+
const signedImpact = args.signedImpact !== void 0 ? assertSignedImpactScore(args.signedImpact, "Evidence createAndLink signedImpact") : weight;
|
|
1043
1165
|
const relation = normalizeEvidenceRelation(
|
|
1044
1166
|
args.relation,
|
|
1045
1167
|
weight,
|
|
@@ -1050,7 +1172,7 @@ var createAndLink = mutation({
|
|
|
1050
1172
|
if (!beliefNode || beliefNode.nodeType !== "belief") {
|
|
1051
1173
|
throw new Error("Belief node not found for edge creation");
|
|
1052
1174
|
}
|
|
1053
|
-
const nodeId = await ctx
|
|
1175
|
+
const nodeId = await insertEpistemicNode(ctx, {
|
|
1054
1176
|
globalId,
|
|
1055
1177
|
topicId: scope.topicId,
|
|
1056
1178
|
projectId: scope.projectId,
|
|
@@ -1062,6 +1184,15 @@ var createAndLink = mutation({
|
|
|
1062
1184
|
status: "active",
|
|
1063
1185
|
epistemicLayer: "L2",
|
|
1064
1186
|
sourceType,
|
|
1187
|
+
// RC.1 taxonomy fields — top-level projection
|
|
1188
|
+
evidenceRelation: relation,
|
|
1189
|
+
signedImpact,
|
|
1190
|
+
targetBeliefId: String(args.beliefNodeId),
|
|
1191
|
+
...typeof args.sourceRef === "string" && args.sourceRef.trim().length > 0 ? { sourceRef: args.sourceRef.trim() } : {},
|
|
1192
|
+
...typeof args.sourceQuality === "string" && args.sourceQuality.length > 0 ? { sourceQuality: args.sourceQuality } : {},
|
|
1193
|
+
...typeof args.methodology === "string" && args.methodology.length > 0 ? { methodology: args.methodology } : {},
|
|
1194
|
+
...typeof args.informationAsymmetry === "string" && args.informationAsymmetry.length > 0 ? { informationAsymmetry: args.informationAsymmetry } : {},
|
|
1195
|
+
...typeof args.sourceDescription === "string" && args.sourceDescription.trim().length > 0 ? { sourceDescription: args.sourceDescription.trim() } : {},
|
|
1065
1196
|
createdAt: now,
|
|
1066
1197
|
updatedAt: now,
|
|
1067
1198
|
createdBy: args.userId,
|
|
@@ -1080,7 +1211,6 @@ var createAndLink = mutation({
|
|
|
1080
1211
|
operation: "upsert"
|
|
1081
1212
|
});
|
|
1082
1213
|
const edgeGlobalId = await createEvidenceBeliefEdge(ctx, {
|
|
1083
|
-
evidenceNodeId: nodeId,
|
|
1084
1214
|
evidenceGlobalId: globalId,
|
|
1085
1215
|
beliefNodeId: args.beliefNodeId,
|
|
1086
1216
|
beliefGlobalId: beliefNode.globalId,
|
|
@@ -1153,6 +1283,21 @@ var internalCreate = internalMutation({
|
|
|
1153
1283
|
evidenceRelation: v.optional(v.string()),
|
|
1154
1284
|
weight: v.number(),
|
|
1155
1285
|
confidence: v.optional(v.number()),
|
|
1286
|
+
// RC.1 taxonomy fields — top-level projection (mirroring kernel evidenceCreate.ts)
|
|
1287
|
+
sourceRef: v.optional(v.string()),
|
|
1288
|
+
sourceQuality: v.optional(
|
|
1289
|
+
v.union(
|
|
1290
|
+
v.literal("primary"),
|
|
1291
|
+
v.literal("analyzed"),
|
|
1292
|
+
v.literal("secondary"),
|
|
1293
|
+
v.literal("tertiary"),
|
|
1294
|
+
v.literal("unknown")
|
|
1295
|
+
)
|
|
1296
|
+
),
|
|
1297
|
+
methodology: v.optional(v.string()),
|
|
1298
|
+
informationAsymmetry: v.optional(v.string()),
|
|
1299
|
+
sourceDescription: v.optional(v.string()),
|
|
1300
|
+
signedImpact: v.optional(v.number()),
|
|
1156
1301
|
metadata: v.optional(v.any()),
|
|
1157
1302
|
runtimeToolName: v.optional(v.string()),
|
|
1158
1303
|
runtimePackKey: v.optional(v.string()),
|
|
@@ -1187,6 +1332,7 @@ var internalCreate = internalMutation({
|
|
|
1187
1332
|
const kind = normalizeKind(args.kind);
|
|
1188
1333
|
const sourceType = normalizeSourceType(args.sourceType);
|
|
1189
1334
|
const weight = assertSignedImpactScore(args.weight, "Internal evidence creation");
|
|
1335
|
+
const signedImpact = args.signedImpact !== void 0 ? assertSignedImpactScore(args.signedImpact, "Internal evidence creation signedImpact") : weight;
|
|
1190
1336
|
const evidenceRelation = normalizeEvidenceRelation(
|
|
1191
1337
|
args.evidenceRelation,
|
|
1192
1338
|
weight,
|
|
@@ -1197,7 +1343,7 @@ var internalCreate = internalMutation({
|
|
|
1197
1343
|
throw new Error("Internal evidence creation requires a linked belief node");
|
|
1198
1344
|
}
|
|
1199
1345
|
const additionalMetadata = args.metadata && typeof args.metadata === "object" ? args.metadata : {};
|
|
1200
|
-
const nodeId = await ctx
|
|
1346
|
+
const nodeId = await insertEpistemicNode(ctx, {
|
|
1201
1347
|
globalId,
|
|
1202
1348
|
topicId: scope.topicId,
|
|
1203
1349
|
projectId: scope.projectId,
|
|
@@ -1212,6 +1358,15 @@ var internalCreate = internalMutation({
|
|
|
1212
1358
|
status: "active",
|
|
1213
1359
|
epistemicLayer: "L2",
|
|
1214
1360
|
sourceType,
|
|
1361
|
+
// RC.1 taxonomy fields — top-level projection
|
|
1362
|
+
evidenceRelation,
|
|
1363
|
+
signedImpact,
|
|
1364
|
+
targetBeliefId: String(args.linkedBeliefNodeId),
|
|
1365
|
+
...typeof args.sourceRef === "string" && args.sourceRef.trim().length > 0 ? { sourceRef: args.sourceRef.trim() } : {},
|
|
1366
|
+
...typeof args.sourceQuality === "string" && args.sourceQuality.length > 0 ? { sourceQuality: args.sourceQuality } : {},
|
|
1367
|
+
...typeof args.methodology === "string" && args.methodology.length > 0 ? { methodology: args.methodology } : {},
|
|
1368
|
+
...typeof args.informationAsymmetry === "string" && args.informationAsymmetry.length > 0 ? { informationAsymmetry: args.informationAsymmetry } : {},
|
|
1369
|
+
...typeof args.sourceDescription === "string" && args.sourceDescription.trim().length > 0 ? { sourceDescription: args.sourceDescription.trim() } : {},
|
|
1215
1370
|
createdAt: now,
|
|
1216
1371
|
updatedAt: now,
|
|
1217
1372
|
createdBy: args.userId,
|
|
@@ -1257,7 +1412,6 @@ var internalCreate = internalMutation({
|
|
|
1257
1412
|
operation: "upsert"
|
|
1258
1413
|
});
|
|
1259
1414
|
await createEvidenceBeliefEdge(ctx, {
|
|
1260
|
-
evidenceNodeId: nodeId,
|
|
1261
1415
|
evidenceGlobalId: globalId,
|
|
1262
1416
|
beliefNodeId: args.linkedBeliefNodeId,
|
|
1263
1417
|
beliefGlobalId: linkedBeliefNode.globalId,
|