@lucern/graph-primitives 1.0.23 → 1.0.25
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 +3 -0
- package/dist/beliefDecay.js.map +1 -1
- package/dist/beliefEvidenceLinks.js +15 -3
- package/dist/beliefEvidenceLinks.js.map +1 -1
- package/dist/beliefEvidenceLinks.operational.js +12 -3
- package/dist/beliefEvidenceLinks.operational.js.map +1 -1
- package/dist/entityCanonicalMatch.d.ts +40 -0
- package/dist/entityCanonicalMatch.js +33 -0
- package/dist/entityCanonicalMatch.js.map +1 -0
- package/dist/entityLifecycle.js +62 -37
- package/dist/entityLifecycle.js.map +1 -1
- package/dist/epistemicAnswers.js.map +1 -1
- package/dist/epistemicBeliefs.admin.js +17 -6
- package/dist/epistemicBeliefs.admin.js.map +1 -1
- package/dist/epistemicBeliefs.backfills.js +13 -2
- package/dist/epistemicBeliefs.backfills.js.map +1 -1
- package/dist/epistemicBeliefs.confidence.js +17 -6
- package/dist/epistemicBeliefs.confidence.js.map +1 -1
- package/dist/epistemicBeliefs.core.js +32 -9
- package/dist/epistemicBeliefs.core.js.map +1 -1
- package/dist/epistemicBeliefs.forkEvidence.js +13 -2
- package/dist/epistemicBeliefs.forkEvidence.js.map +1 -1
- package/dist/epistemicBeliefs.helpers.d.ts +16 -1
- package/dist/epistemicBeliefs.helpers.js +20 -6
- package/dist/epistemicBeliefs.helpers.js.map +1 -1
- package/dist/epistemicBeliefs.internal.js +28 -5
- package/dist/epistemicBeliefs.internal.js.map +1 -1
- package/dist/epistemicBeliefs.js +32 -9
- package/dist/epistemicBeliefs.js.map +1 -1
- package/dist/epistemicBeliefs.lifecycle.js +17 -6
- package/dist/epistemicBeliefs.lifecycle.js.map +1 -1
- package/dist/epistemicBeliefs.links.js +29 -9
- package/dist/epistemicBeliefs.links.js.map +1 -1
- package/dist/epistemicBeliefs.topicAnchor.js +12 -3
- package/dist/epistemicBeliefs.topicAnchor.js.map +1 -1
- package/dist/epistemicContracts.evaluators.js +17 -6
- package/dist/epistemicContracts.evaluators.js.map +1 -1
- package/dist/epistemicContracts.handlers.js +17 -6
- package/dist/epistemicContracts.handlers.js.map +1 -1
- package/dist/epistemicContracts.js +17 -6
- package/dist/epistemicContracts.js.map +1 -1
- package/dist/epistemicEdges.handlers.js +12 -3
- package/dist/epistemicEdges.handlers.js.map +1 -1
- package/dist/epistemicEdges.helpers.d.ts +2 -2
- package/dist/epistemicEdges.js +15 -3
- package/dist/epistemicEdges.js.map +1 -1
- package/dist/epistemicEdges.mutations.js +3 -0
- package/dist/epistemicEdges.mutations.js.map +1 -1
- package/dist/epistemicEvidence.js +15 -3
- package/dist/epistemicEvidence.js.map +1 -1
- package/dist/epistemicEvidenceHelpers.js +3 -0
- package/dist/epistemicEvidenceHelpers.js.map +1 -1
- package/dist/epistemicEvidenceMutations.js +15 -3
- package/dist/epistemicEvidenceMutations.js.map +1 -1
- package/dist/epistemicEvidenceQueries.js +3 -0
- package/dist/epistemicEvidenceQueries.js.map +1 -1
- package/dist/epistemicHelpers.js.map +1 -1
- package/dist/epistemicInsert.js +12 -3
- package/dist/epistemicInsert.js.map +1 -1
- package/dist/epistemicNodeCreation.js.map +1 -1
- package/dist/epistemicNodes.internal.js.map +1 -1
- package/dist/epistemicNodes.js.map +1 -1
- package/dist/epistemicNodes.mutations.js.map +1 -1
- package/dist/epistemicNodes.validators.d.ts +2 -2
- package/dist/epistemicQuestions.conviction.js +3 -0
- package/dist/epistemicQuestions.conviction.js.map +1 -1
- package/dist/epistemicQuestions.create.js +3 -0
- package/dist/epistemicQuestions.create.js.map +1 -1
- package/dist/epistemicQuestions.evidence.js +3 -0
- package/dist/epistemicQuestions.evidence.js.map +1 -1
- package/dist/epistemicQuestions.helpers.js +3 -0
- package/dist/epistemicQuestions.helpers.js.map +1 -1
- package/dist/epistemicQuestions.js +3 -0
- package/dist/epistemicQuestions.js.map +1 -1
- package/dist/epistemicQuestions.lifecycle.js +3 -0
- package/dist/epistemicQuestions.lifecycle.js.map +1 -1
- package/dist/epistemicQuestions.queries.js +3 -0
- package/dist/epistemicQuestions.queries.js.map +1 -1
- package/dist/epistemicQuestions.tail.js +3 -0
- package/dist/epistemicQuestions.tail.js.map +1 -1
- package/dist/epistemicSources.js.map +1 -1
- package/dist/index.js +78 -42
- package/dist/index.js.map +1 -1
- package/dist/proof-attestation.json +1 -1
- package/dist/questionEvidenceLinks.js +3 -0
- package/dist/questionEvidenceLinks.js.map +1 -1
- package/dist/resolvers.js +3 -0
- package/dist/resolvers.js.map +1 -1
- package/dist/topicProjectOverlay.d.ts +4 -0
- package/dist/topicProjectOverlay.js +3 -0
- package/dist/topicProjectOverlay.js.map +1 -1
- package/package.json +4 -4
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { v } from 'convex/values';
|
|
1
|
+
import { v, ConvexError } from 'convex/values';
|
|
2
2
|
import { checkScopeAccess, checkProjectAccess } from '@lucern/access-control/access';
|
|
3
3
|
import { assertSchemaEnumValue } from '@lucern/contracts/schema-helpers/enumValidation';
|
|
4
4
|
import { permissiveReturn } from '@lucern/contracts/schema-helpers/validators';
|
|
@@ -7,7 +7,7 @@ import { normalizeTupleContradictionPolicy, createInheritedContractRecord, confi
|
|
|
7
7
|
import '@lucern/access-control/audience';
|
|
8
8
|
import { getCurrentUserId } from '@lucern/access-control/auth';
|
|
9
9
|
import { isNodeType, getLayerForNodeType } from '@lucern/contracts/schema-helpers/spine/tables/epistemicNodes';
|
|
10
|
-
import { generateGlobalId, assertUuidV7Identity, generateUuidV7, assertStorageEdgeVocabulary,
|
|
10
|
+
import { generateGlobalId, assertUuidV7Identity, generateUuidV7, assertStorageEdgeVocabulary, assertUuidShapedEdgeEndpoint } from '@lucern/contracts/ids';
|
|
11
11
|
import { assertEdgePolicyAllowed, edgePolicyManifest } from '@lucern/contracts';
|
|
12
12
|
|
|
13
13
|
// src/epistemicBeliefs.core.ts
|
|
@@ -273,6 +273,9 @@ function materializeTopicProjectOverlay(topic, idMode = "legacy") {
|
|
|
273
273
|
type: mapProjectType(topic, metadata),
|
|
274
274
|
description: readNonEmptyString(topic.description),
|
|
275
275
|
ownerId: readNonEmptyString(metadata.ownerId) || readNonEmptyString(topic.createdBy) || "system",
|
|
276
|
+
// FR.7 creator-grant: surface the principal-shaped owner field (column-first,
|
|
277
|
+
// metadata fallback for legacy rows that recorded it in metadata).
|
|
278
|
+
ownerPrincipalId: readNonEmptyString(topic.ownerPrincipalId) || readNonEmptyString(metadata.ownerPrincipalId),
|
|
276
279
|
sharedWith: readStringArray(metadata.sharedWith),
|
|
277
280
|
visibility,
|
|
278
281
|
tenantId: readNonEmptyString(topic.tenantId) || readNonEmptyString(metadata.tenantId),
|
|
@@ -806,7 +809,18 @@ var DEFAULT_CONFIDENCE_POLICY = {
|
|
|
806
809
|
tupleContradiction: normalizeTupleContradictionPolicy()
|
|
807
810
|
};
|
|
808
811
|
function throwStructuredMutationError(args) {
|
|
809
|
-
const
|
|
812
|
+
const data = {
|
|
813
|
+
structuredMutationError: true,
|
|
814
|
+
message: args.message,
|
|
815
|
+
status: args.status,
|
|
816
|
+
code: args.code,
|
|
817
|
+
invariantCode: args.invariantCode,
|
|
818
|
+
suggestion: args.suggestion,
|
|
819
|
+
details: args.details
|
|
820
|
+
};
|
|
821
|
+
const error = new ConvexError(
|
|
822
|
+
data
|
|
823
|
+
);
|
|
810
824
|
error.status = args.status;
|
|
811
825
|
error.code = args.code;
|
|
812
826
|
error.invariantCode = args.invariantCode;
|
|
@@ -964,12 +978,12 @@ async function requireProjectWriteAccess(ctx, projectId, userId) {
|
|
|
964
978
|
);
|
|
965
979
|
if (!hasAccess) {
|
|
966
980
|
throwStructuredMutationError({
|
|
967
|
-
message:
|
|
981
|
+
message: `Project write access denied for topic ${projectId}.`,
|
|
968
982
|
status: 403,
|
|
969
|
-
code: "
|
|
983
|
+
code: "PROJECT_ACCESS_DENIED",
|
|
970
984
|
invariantCode: "policy.scope_required",
|
|
971
|
-
suggestion: "
|
|
972
|
-
details: { projectId, userId }
|
|
985
|
+
suggestion: "The acting principal lacks project-write access to this topic. Request a topic grant (or, if the principal created this topic, run the creator-grant backfill) and retry.",
|
|
986
|
+
details: { topicId: projectId, principalId: userId }
|
|
973
987
|
});
|
|
974
988
|
}
|
|
975
989
|
}
|
|
@@ -1074,6 +1088,15 @@ async function insertEpistemicNode(ctx, doc) {
|
|
|
1074
1088
|
assertUuidV7Identity("epistemicNodes", doc.globalId);
|
|
1075
1089
|
return ctx.db.insert("epistemicNodes", doc);
|
|
1076
1090
|
}
|
|
1091
|
+
async function assertExistingNodeEndpoint(ctx, endpointRole, endpoint) {
|
|
1092
|
+
assertUuidShapedEdgeEndpoint(endpointRole, endpoint);
|
|
1093
|
+
const node = await ctx.db.query("epistemicNodes").withIndex("by_globalId", (q) => q.eq("globalId", endpoint)).first();
|
|
1094
|
+
if (!node) {
|
|
1095
|
+
throw new Error(
|
|
1096
|
+
`edge_endpoint_not_canonical: epistemicEdges insert requires ${endpointRole} to be the globalId of an existing epistemicNodes row, received ${endpoint} (no node with that globalId)`
|
|
1097
|
+
);
|
|
1098
|
+
}
|
|
1099
|
+
}
|
|
1077
1100
|
async function insertEpistemicEdge(ctx, doc) {
|
|
1078
1101
|
assertUuidV7Identity("epistemicEdges", doc.globalId);
|
|
1079
1102
|
assertStorageEdgeVocabulary(doc.edgeType);
|
|
@@ -1087,8 +1110,8 @@ async function insertEpistemicEdge(ctx, doc) {
|
|
|
1087
1110
|
"edge_endpoint_missing: epistemicEdges insert requires a non-empty toNodeId"
|
|
1088
1111
|
);
|
|
1089
1112
|
}
|
|
1090
|
-
|
|
1091
|
-
|
|
1113
|
+
await assertExistingNodeEndpoint(ctx, "fromNodeId", doc.fromNodeId);
|
|
1114
|
+
await assertExistingNodeEndpoint(ctx, "toNodeId", doc.toNodeId);
|
|
1092
1115
|
if (doc.fromNodeType && doc.toNodeType && doc.edgeType !== "extracted_from") {
|
|
1093
1116
|
assertEdgePolicyAllowed(
|
|
1094
1117
|
edgePolicyManifest,
|