@lucern/graph-primitives 1.0.22 → 1.0.24
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 +49 -0
- package/dist/beliefDecay.js.map +1 -1
- package/dist/beliefEvidenceLinks.js +99 -5
- package/dist/beliefEvidenceLinks.js.map +1 -1
- package/dist/beliefEvidenceLinks.operational.js +50 -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/entityCanonicalMatch.d.ts +40 -0
- package/dist/entityCanonicalMatch.js +33 -0
- package/dist/entityCanonicalMatch.js.map +1 -0
- package/dist/entityLifecycle.js +149 -39
- 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 +63 -6
- package/dist/epistemicBeliefs.admin.js.map +1 -1
- package/dist/epistemicBeliefs.backfills.js +59 -2
- package/dist/epistemicBeliefs.backfills.js.map +1 -1
- package/dist/epistemicBeliefs.confidence.d.ts +1 -1
- package/dist/epistemicBeliefs.confidence.js +70 -12
- package/dist/epistemicBeliefs.confidence.js.map +1 -1
- package/dist/epistemicBeliefs.core.js +120 -17
- package/dist/epistemicBeliefs.core.js.map +1 -1
- package/dist/epistemicBeliefs.d.ts +1 -1
- package/dist/epistemicBeliefs.forkEvidence.js +13 -2
- package/dist/epistemicBeliefs.forkEvidence.js.map +1 -1
- package/dist/epistemicBeliefs.helpers.d.ts +18 -3
- package/dist/epistemicBeliefs.helpers.js +66 -6
- package/dist/epistemicBeliefs.helpers.js.map +1 -1
- package/dist/epistemicBeliefs.internal.js +115 -12
- package/dist/epistemicBeliefs.internal.js.map +1 -1
- package/dist/epistemicBeliefs.js +132 -28
- package/dist/epistemicBeliefs.js.map +1 -1
- package/dist/epistemicBeliefs.lifecycle.js +70 -12
- package/dist/epistemicBeliefs.lifecycle.js.map +1 -1
- package/dist/epistemicBeliefs.links.js +111 -10
- package/dist/epistemicBeliefs.links.js.map +1 -1
- package/dist/epistemicBeliefs.topicAnchor.js +48 -8
- package/dist/epistemicBeliefs.topicAnchor.js.map +1 -1
- package/dist/epistemicContracts.evaluators.js +70 -12
- package/dist/epistemicContracts.evaluators.js.map +1 -1
- package/dist/epistemicContracts.handlers.js +71 -16
- package/dist/epistemicContracts.handlers.js.map +1 -1
- package/dist/epistemicContracts.js +71 -16
- package/dist/epistemicContracts.js.map +1 -1
- package/dist/epistemicEdges.d.ts +1 -1
- package/dist/epistemicEdges.handlers.js +57 -3
- package/dist/epistemicEdges.handlers.js.map +1 -1
- package/dist/epistemicEdges.helpers.d.ts +2 -2
- package/dist/epistemicEdges.js +174 -4
- package/dist/epistemicEdges.js.map +1 -1
- package/dist/epistemicEdges.mutations.js +115 -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 +180 -14
- package/dist/epistemicEvidence.js.map +1 -1
- package/dist/epistemicEvidenceHelpers.d.ts +1 -1
- package/dist/epistemicEvidenceHelpers.js +49 -0
- package/dist/epistemicEvidenceHelpers.js.map +1 -1
- package/dist/epistemicEvidenceMutations.js +180 -14
- package/dist/epistemicEvidenceMutations.js.map +1 -1
- package/dist/epistemicEvidenceQueries.js +49 -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 +54 -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 +49 -0
- package/dist/epistemicQuestions.conviction.js.map +1 -1
- package/dist/epistemicQuestions.create.js +61 -7
- package/dist/epistemicQuestions.create.js.map +1 -1
- package/dist/epistemicQuestions.d.ts +1 -1
- package/dist/epistemicQuestions.evidence.js +56 -2
- package/dist/epistemicQuestions.evidence.js.map +1 -1
- package/dist/epistemicQuestions.helpers.d.ts +1 -1
- package/dist/epistemicQuestions.helpers.js +49 -0
- package/dist/epistemicQuestions.helpers.js.map +1 -1
- package/dist/epistemicQuestions.js +63 -9
- package/dist/epistemicQuestions.js.map +1 -1
- package/dist/epistemicQuestions.lifecycle.js +49 -0
- package/dist/epistemicQuestions.lifecycle.js.map +1 -1
- package/dist/epistemicQuestions.queries.js +49 -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 +56 -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 +379 -115
- package/dist/index.js.map +1 -1
- package/dist/proof-attestation.json +1 -1
- package/dist/questionEvidenceLinks.js +49 -0
- package/dist/questionEvidenceLinks.js.map +1 -1
- package/dist/resolvers.js +3 -0
- package/dist/resolvers.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/topicProjectOverlay.d.ts +4 -0
- package/dist/topicProjectOverlay.js +3 -0
- package/dist/topicProjectOverlay.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
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { v } from 'convex/values';
|
|
1
|
+
import { v, ConvexError } from 'convex/values';
|
|
2
2
|
import { checkProjectAccess } from '@lucern/access-control/access';
|
|
3
3
|
import { getCurrentUserId } from '@lucern/access-control/auth';
|
|
4
4
|
import { permissiveReturn } from '@lucern/contracts/schema-helpers/validators';
|
|
@@ -568,6 +568,35 @@ function debugGraphPrimitiveFallback(message, context) {
|
|
|
568
568
|
console.debug(message, context ?? {});
|
|
569
569
|
}
|
|
570
570
|
var LEGACY_SCOPE_FIELD = "graphScopeProjectId";
|
|
571
|
+
async function resolveTopicNodeScopeOrNull(ctx, ref) {
|
|
572
|
+
if (!ctx?.db || typeof ctx.db.query !== "function") {
|
|
573
|
+
return null;
|
|
574
|
+
}
|
|
575
|
+
let node = null;
|
|
576
|
+
try {
|
|
577
|
+
const byGlobalId = await ctx.db.query("epistemicNodes").withIndex("by_globalId", (q) => q.eq("globalId", ref)).first();
|
|
578
|
+
if (byGlobalId && byGlobalId.nodeType === "topic") {
|
|
579
|
+
node = byGlobalId;
|
|
580
|
+
}
|
|
581
|
+
} catch (error) {
|
|
582
|
+
debugGraphPrimitiveFallback(
|
|
583
|
+
"[topicScope] topic-node scope lookup by globalId failed",
|
|
584
|
+
{ error, ref }
|
|
585
|
+
);
|
|
586
|
+
}
|
|
587
|
+
if (!node) {
|
|
588
|
+
return null;
|
|
589
|
+
}
|
|
590
|
+
const scopeKey = normalizeScopeValue(node.topicId) ?? normalizeScopeValue(node.globalId);
|
|
591
|
+
if (!scopeKey) {
|
|
592
|
+
return null;
|
|
593
|
+
}
|
|
594
|
+
return {
|
|
595
|
+
topicId: scopeKey,
|
|
596
|
+
projectId: asMappedProjectId(node),
|
|
597
|
+
source: "topic_node"
|
|
598
|
+
};
|
|
599
|
+
}
|
|
571
600
|
function asMappedProjectId(topic) {
|
|
572
601
|
if (!topic) {
|
|
573
602
|
return;
|
|
@@ -708,6 +737,13 @@ async function resolveTopicProjectScope(ctx, args) {
|
|
|
708
737
|
) ?? null;
|
|
709
738
|
}
|
|
710
739
|
if (!topic) {
|
|
740
|
+
const nodeScope = await resolveTopicNodeScopeOrNull(
|
|
741
|
+
ctx,
|
|
742
|
+
String(args.topicId)
|
|
743
|
+
);
|
|
744
|
+
if (nodeScope) {
|
|
745
|
+
return nodeScope;
|
|
746
|
+
}
|
|
711
747
|
throw new Error(`Topic not found: ${String(args.topicId)}`);
|
|
712
748
|
}
|
|
713
749
|
const inherited = await resolveInheritedWorkspaceScope(ctx, topic);
|
|
@@ -778,6 +814,16 @@ async function resolveTopicProjectScope(ctx, args) {
|
|
|
778
814
|
source: "project_mapped_topic"
|
|
779
815
|
};
|
|
780
816
|
}
|
|
817
|
+
const nodeScope = await resolveTopicNodeScopeOrNull(
|
|
818
|
+
ctx,
|
|
819
|
+
String(args.projectId)
|
|
820
|
+
);
|
|
821
|
+
if (nodeScope) {
|
|
822
|
+
return {
|
|
823
|
+
...nodeScope,
|
|
824
|
+
projectId: nodeScope.projectId ?? String(args.projectId)
|
|
825
|
+
};
|
|
826
|
+
}
|
|
781
827
|
throw new Error(
|
|
782
828
|
`Legacy project scope ${String(args.projectId)} has no mapped topic.`
|
|
783
829
|
);
|
|
@@ -883,7 +929,18 @@ var DEFAULT_CONFIDENCE_POLICY = {
|
|
|
883
929
|
tupleContradiction: normalizeTupleContradictionPolicy()
|
|
884
930
|
};
|
|
885
931
|
function throwStructuredMutationError(args) {
|
|
886
|
-
const
|
|
932
|
+
const data = {
|
|
933
|
+
structuredMutationError: true,
|
|
934
|
+
message: args.message,
|
|
935
|
+
status: args.status,
|
|
936
|
+
code: args.code,
|
|
937
|
+
invariantCode: args.invariantCode,
|
|
938
|
+
suggestion: args.suggestion,
|
|
939
|
+
details: args.details
|
|
940
|
+
};
|
|
941
|
+
const error = new ConvexError(
|
|
942
|
+
data
|
|
943
|
+
);
|
|
887
944
|
error.status = args.status;
|
|
888
945
|
error.code = args.code;
|
|
889
946
|
error.invariantCode = args.invariantCode;
|
|
@@ -1001,12 +1058,12 @@ async function requireProjectWriteAccess(ctx, projectId, userId) {
|
|
|
1001
1058
|
);
|
|
1002
1059
|
if (!hasAccess) {
|
|
1003
1060
|
throwStructuredMutationError({
|
|
1004
|
-
message:
|
|
1061
|
+
message: `Project write access denied for topic ${projectId}.`,
|
|
1005
1062
|
status: 403,
|
|
1006
|
-
code: "
|
|
1063
|
+
code: "PROJECT_ACCESS_DENIED",
|
|
1007
1064
|
invariantCode: "policy.scope_required",
|
|
1008
|
-
suggestion: "
|
|
1009
|
-
details: { projectId, userId }
|
|
1065
|
+
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.",
|
|
1066
|
+
details: { topicId: projectId, principalId: userId }
|
|
1010
1067
|
});
|
|
1011
1068
|
}
|
|
1012
1069
|
}
|
|
@@ -1662,14 +1719,14 @@ async function applyBeliefConfidenceChange(ctx, args) {
|
|
|
1662
1719
|
beliefConfidenceId
|
|
1663
1720
|
};
|
|
1664
1721
|
}
|
|
1665
|
-
function
|
|
1722
|
+
function propagationPressureLabel(edgeType, weight) {
|
|
1666
1723
|
if (edgeType === "contradicts" || edgeType === "refutes") {
|
|
1667
|
-
return "
|
|
1724
|
+
return "contradictory";
|
|
1668
1725
|
}
|
|
1669
1726
|
if ((edgeType === "supports" || edgeType === "informs") && weight < 0) {
|
|
1670
|
-
return "
|
|
1727
|
+
return "contradictory";
|
|
1671
1728
|
}
|
|
1672
|
-
return "
|
|
1729
|
+
return "supportive";
|
|
1673
1730
|
}
|
|
1674
1731
|
internalMutation({
|
|
1675
1732
|
args: {
|
|
@@ -1706,14 +1763,15 @@ internalMutation({
|
|
|
1706
1763
|
getNode: async (nodeId) => await ctx.db.get(nodeId)
|
|
1707
1764
|
});
|
|
1708
1765
|
for (const dispatch of dispatches) {
|
|
1766
|
+
const pressureLabel = propagationPressureLabel(dispatch.edgeType, dispatch.weight);
|
|
1709
1767
|
await applyBeliefConfidenceChange(ctx, {
|
|
1710
1768
|
nodeId: dispatch.targetNodeId,
|
|
1711
1769
|
belief: dispatch.opinion.b,
|
|
1712
1770
|
disbelief: dispatch.opinion.d,
|
|
1713
1771
|
uncertainty: dispatch.opinion.u,
|
|
1714
1772
|
baseRate: dispatch.opinion.a,
|
|
1715
|
-
trigger:
|
|
1716
|
-
rationale: `SL propagation via ${dispatch.edgeType} edge: ${dispatch.rationale}`,
|
|
1773
|
+
trigger: "propagation",
|
|
1774
|
+
rationale: `SL propagation via ${dispatch.edgeType} edge (pressure: ${pressureLabel}): ${dispatch.rationale}`,
|
|
1717
1775
|
authenticatedUserId: args.userId,
|
|
1718
1776
|
slOperator: dispatch.operator
|
|
1719
1777
|
});
|
|
@@ -2735,10 +2793,7 @@ var createEpistemicContract = mutation({
|
|
|
2735
2793
|
createdBy: userId,
|
|
2736
2794
|
updatedAt: now
|
|
2737
2795
|
};
|
|
2738
|
-
const insertedId = await ctx.db.insert(
|
|
2739
|
-
"epistemicContracts",
|
|
2740
|
-
contractDoc
|
|
2741
|
-
);
|
|
2796
|
+
const insertedId = await ctx.db.insert("epistemicContracts", contractDoc);
|
|
2742
2797
|
return {
|
|
2743
2798
|
contractId,
|
|
2744
2799
|
id: insertedId,
|