@lucern/graph-primitives 1.0.29 → 1.0.31
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-DZ6tkLYq.d.ts → beliefDecay-BmkEk5OJ.d.ts} +3 -3
- package/dist/beliefDecay.d.ts +1 -1
- package/dist/beliefDecay.js +448 -314
- package/dist/beliefDecay.js.map +1 -1
- package/dist/{beliefEvidenceLinks-CWOXxxJg.d.ts → beliefEvidenceLinks-BzfjON_6.d.ts} +13 -13
- package/dist/beliefEvidenceLinks.d.ts +1 -1
- package/dist/beliefEvidenceLinks.js +843 -624
- package/dist/beliefEvidenceLinks.js.map +1 -1
- package/dist/beliefEvidenceLinks.operational.d.ts +7 -5
- package/dist/beliefEvidenceLinks.operational.js +91 -18
- package/dist/beliefEvidenceLinks.operational.js.map +1 -1
- package/dist/beliefLifecycle.js.map +1 -1
- package/dist/confidencePropagationDispatch.d.ts +28 -27
- package/dist/confidencePropagationDispatch.js +157 -99
- package/dist/confidencePropagationDispatch.js.map +1 -1
- package/dist/{contradictions-51VLsESq.d.ts → contradictions-BATPuZTL.d.ts} +10 -10
- package/dist/contradictions.d.ts +1 -1
- package/dist/contradictions.js +395 -225
- package/dist/contradictions.js.map +1 -1
- package/dist/convex.d.ts +65 -30
- package/dist/convex.js +7 -3
- package/dist/convex.js.map +1 -1
- package/dist/debug.js.map +1 -1
- package/dist/edgeValidation.js +293 -85
- package/dist/edgeValidation.js.map +1 -1
- package/dist/edges/contains.d.ts +1 -1
- package/dist/edges/contains.js.map +1 -1
- package/dist/edges/contradicts.d.ts +1 -1
- package/dist/edges/contradicts.js.map +1 -1
- package/dist/edges/{dependsOn.d.ts → depends-on.d.ts} +1 -1
- package/dist/edges/{dependsOn.js → depends-on.js} +4 -4
- package/dist/edges/depends-on.js.map +1 -0
- package/dist/edges/{derivedFrom.d.ts → derived-from.d.ts} +1 -1
- package/dist/edges/{derivedFrom.js → derived-from.js} +3 -3
- package/dist/edges/derived-from.js.map +1 -0
- package/dist/edges/elaborates.d.ts +1 -1
- package/dist/edges/elaborates.js.map +1 -1
- package/dist/edges/index.d.ts +7 -3
- package/dist/edges/index.js +7 -4
- package/dist/edges/index.js.map +1 -1
- package/dist/edges/informs.d.ts +1 -1
- package/dist/edges/informs.js.map +1 -1
- package/dist/edges/{propagationTypes.d.ts → propagation-types.d.ts} +14 -14
- package/dist/edges/{propagationTypes.js → propagation-types.js} +3 -3
- package/dist/edges/propagation-types.js.map +1 -0
- package/dist/edges/refutes.d.ts +1 -1
- package/dist/edges/refutes.js.map +1 -1
- package/dist/edges/supports.d.ts +1 -1
- package/dist/edges/supports.js.map +1 -1
- package/dist/edges/tests.d.ts +1 -1
- package/dist/edges/tests.js.map +1 -1
- package/dist/edges/utils.d.ts +1 -1
- package/dist/edges/utils.js.map +1 -1
- package/dist/embeddingTrigger.d.ts +14 -6
- package/dist/embeddingTrigger.js +11 -14
- package/dist/embeddingTrigger.js.map +1 -1
- package/dist/{entityBridge-DMaKooYn.d.ts → entityBridge-BhVDM3pc.d.ts} +5 -5
- package/dist/entityBridge.d.ts +1 -1
- package/dist/entityBridge.js +602 -225
- package/dist/entityBridge.js.map +1 -1
- package/dist/entityCanonicalMatch.d.ts +14 -12
- package/dist/entityCanonicalMatch.js.map +1 -1
- package/dist/{entityLifecycle-CvgSK5FV.d.ts → entityLifecycle-BsfCz9pS.d.ts} +5 -9
- package/dist/entityLifecycle.d.ts +1 -1
- package/dist/entityLifecycle.js +854 -480
- package/dist/entityLifecycle.js.map +1 -1
- package/dist/{entityValidation-KLZ_Xl2D.d.ts → entityValidation-B1yNEHJx.d.ts} +7 -6
- package/dist/entityValidation.d.ts +3 -1
- package/dist/entityValidation.js +60 -8
- package/dist/entityValidation.js.map +1 -1
- package/dist/{epistemicAnswers-C5ib4z6_.d.ts → epistemicAnswers-f47YMu9U.d.ts} +6 -6
- package/dist/epistemicAnswers.d.ts +1 -1
- package/dist/epistemicAnswers.js +587 -545
- package/dist/epistemicAnswers.js.map +1 -1
- package/dist/epistemicBeliefs.admin.d.ts +8 -8
- package/dist/epistemicBeliefs.admin.js +365 -166
- package/dist/epistemicBeliefs.admin.js.map +1 -1
- package/dist/epistemicBeliefs.backfills.d.ts +8 -8
- package/dist/epistemicBeliefs.backfills.js +655 -289
- package/dist/epistemicBeliefs.backfills.js.map +1 -1
- package/dist/epistemicBeliefs.confidence.d.ts +19 -15
- package/dist/epistemicBeliefs.confidence.js +633 -386
- package/dist/epistemicBeliefs.confidence.js.map +1 -1
- package/dist/epistemicBeliefs.core.d.ts +6 -6
- package/dist/epistemicBeliefs.core.js +717 -371
- package/dist/epistemicBeliefs.core.js.map +1 -1
- package/dist/epistemicBeliefs.d.ts +11 -9
- package/dist/epistemicBeliefs.forkEvidence.d.ts +2 -0
- package/dist/epistemicBeliefs.forkEvidence.js +8 -8
- package/dist/epistemicBeliefs.forkEvidence.js.map +1 -1
- package/dist/epistemicBeliefs.helpers.d.ts +68 -49
- package/dist/epistemicBeliefs.helpers.js +358 -211
- package/dist/epistemicBeliefs.helpers.js.map +1 -1
- package/dist/epistemicBeliefs.internal.d.ts +5 -5
- package/dist/epistemicBeliefs.internal.js +1248 -1026
- package/dist/epistemicBeliefs.internal.js.map +1 -1
- package/dist/epistemicBeliefs.js +4942 -3590
- package/dist/epistemicBeliefs.js.map +1 -1
- package/dist/epistemicBeliefs.lifecycle.d.ts +5 -5
- package/dist/epistemicBeliefs.lifecycle.js +1138 -781
- package/dist/epistemicBeliefs.lifecycle.js.map +1 -1
- package/dist/epistemicBeliefs.links.d.ts +7 -7
- package/dist/epistemicBeliefs.links.js +404 -267
- package/dist/epistemicBeliefs.links.js.map +1 -1
- package/dist/epistemicBeliefs.queries.d.ts +4 -4
- package/dist/epistemicBeliefs.queries.js +175 -20
- package/dist/epistemicBeliefs.queries.js.map +1 -1
- package/dist/epistemicBeliefs.topicAnchor.d.ts +6 -4
- package/dist/epistemicBeliefs.topicAnchor.js +12 -5
- package/dist/epistemicBeliefs.topicAnchor.js.map +1 -1
- package/dist/epistemicContracts.d.ts +28 -3
- package/dist/epistemicContracts.evaluators.d.ts +2 -0
- package/dist/epistemicContracts.evaluators.js +1062 -576
- package/dist/epistemicContracts.evaluators.js.map +1 -1
- package/dist/epistemicContracts.handlers.d.ts +15 -32
- package/dist/epistemicContracts.handlers.js +1829 -1351
- package/dist/epistemicContracts.handlers.js.map +1 -1
- package/dist/epistemicContracts.js +1131 -636
- package/dist/epistemicContracts.js.map +1 -1
- package/dist/epistemicContracts.metrics.d.ts +2 -0
- package/dist/epistemicContracts.metrics.js +375 -158
- package/dist/epistemicContracts.metrics.js.map +1 -1
- package/dist/epistemicContracts.types.d.ts +87 -81
- package/dist/epistemicEdgeCreation.d.ts +2 -0
- package/dist/epistemicEdgeCreation.js +87 -16
- package/dist/epistemicEdgeCreation.js.map +1 -1
- package/dist/{epistemicEdges-BF-cn4i3.d.ts → epistemicEdges-BGBh0QSP.d.ts} +4 -7
- package/dist/epistemicEdges.d.ts +6 -5
- package/dist/epistemicEdges.handlers.d.ts +3 -3
- package/dist/epistemicEdges.handlers.js +129 -24
- package/dist/epistemicEdges.handlers.js.map +1 -1
- package/dist/epistemicEdges.helpers.d.ts +6 -4
- package/dist/epistemicEdges.helpers.js +37 -2
- package/dist/epistemicEdges.helpers.js.map +1 -1
- package/dist/epistemicEdges.js +1966 -1202
- package/dist/epistemicEdges.js.map +1 -1
- package/dist/epistemicEdges.mutations.d.ts +7 -7
- package/dist/epistemicEdges.mutations.js +956 -579
- package/dist/epistemicEdges.mutations.js.map +1 -1
- package/dist/epistemicEdges.queries.d.ts +16 -16
- package/dist/epistemicEdges.queries.js +639 -367
- package/dist/epistemicEdges.queries.js.map +1 -1
- package/dist/epistemicEdges.types.d.ts +10 -8
- package/dist/epistemicEvidence.d.ts +4 -1
- package/dist/epistemicEvidence.js +933 -532
- package/dist/epistemicEvidence.js.map +1 -1
- package/dist/epistemicEvidenceHelpers.d.ts +26 -10
- package/dist/epistemicEvidenceHelpers.js +239 -200
- package/dist/epistemicEvidenceHelpers.js.map +1 -1
- package/dist/epistemicEvidenceMutations.d.ts +8 -8
- package/dist/epistemicEvidenceMutations.js +840 -692
- package/dist/epistemicEvidenceMutations.js.map +1 -1
- package/dist/epistemicEvidenceQueries.d.ts +8 -8
- package/dist/epistemicEvidenceQueries.js +514 -238
- package/dist/epistemicEvidenceQueries.js.map +1 -1
- package/dist/epistemicHelpers.d.ts +4 -2
- package/dist/epistemicHelpers.js +308 -134
- package/dist/epistemicHelpers.js.map +1 -1
- package/dist/epistemicInsert.d.ts +16 -4
- package/dist/epistemicInsert.js +6 -3
- package/dist/epistemicInsert.js.map +1 -1
- package/dist/epistemicLayerRules.d.ts +10 -8
- package/dist/epistemicLayerRules.js +1 -5
- package/dist/epistemicLayerRules.js.map +1 -1
- package/dist/{epistemicLinking-CfE00tHJ.d.ts → epistemicLinking-CsCDv2cN.d.ts} +3 -3
- package/dist/epistemicLinking.d.ts +1 -1
- package/dist/epistemicLinking.js +177 -100
- package/dist/epistemicLinking.js.map +1 -1
- package/dist/epistemicNodeCreation.d.ts +2 -0
- package/dist/epistemicNodeCreation.js +203 -40
- package/dist/epistemicNodeCreation.js.map +1 -1
- package/dist/{epistemicNodes-BCQxpYx_.d.ts → epistemicNodes-CokAgBHg.d.ts} +3 -3
- package/dist/epistemicNodes.d.ts +3 -3
- package/dist/epistemicNodes.helpers.d.ts +24 -15
- package/dist/epistemicNodes.helpers.js.map +1 -1
- package/dist/epistemicNodes.internal.d.ts +6 -6
- package/dist/epistemicNodes.internal.js +389 -319
- package/dist/epistemicNodes.internal.js.map +1 -1
- package/dist/epistemicNodes.js +700 -504
- package/dist/epistemicNodes.js.map +1 -1
- package/dist/epistemicNodes.mutations.d.ts +6 -6
- package/dist/epistemicNodes.mutations.js +560 -463
- package/dist/epistemicNodes.mutations.js.map +1 -1
- package/dist/epistemicNodes.queries.d.ts +8 -8
- package/dist/epistemicNodes.queries.js +311 -314
- package/dist/epistemicNodes.queries.js.map +1 -1
- package/dist/epistemicNodes.validators.d.ts +2 -2
- package/dist/epistemicNodes.validators.js.map +1 -1
- package/dist/epistemicQuestions.conviction.d.ts +8 -8
- package/dist/epistemicQuestions.conviction.js +665 -484
- package/dist/epistemicQuestions.conviction.js.map +1 -1
- package/dist/epistemicQuestions.create.d.ts +4 -4
- package/dist/epistemicQuestions.create.js +640 -612
- package/dist/epistemicQuestions.create.js.map +1 -1
- package/dist/epistemicQuestions.d.ts +8 -5
- package/dist/epistemicQuestions.evidence.d.ts +2 -2
- package/dist/epistemicQuestions.evidence.js +475 -383
- package/dist/epistemicQuestions.evidence.js.map +1 -1
- package/dist/epistemicQuestions.helpers.d.ts +125 -24
- package/dist/epistemicQuestions.helpers.js +240 -209
- package/dist/epistemicQuestions.helpers.js.map +1 -1
- package/dist/epistemicQuestions.js +3474 -2823
- package/dist/epistemicQuestions.js.map +1 -1
- package/dist/epistemicQuestions.lifecycle.d.ts +2 -2
- package/dist/epistemicQuestions.lifecycle.js +607 -546
- package/dist/epistemicQuestions.lifecycle.js.map +1 -1
- package/dist/epistemicQuestions.queries.d.ts +12 -7
- package/dist/epistemicQuestions.queries.js +305 -244
- package/dist/epistemicQuestions.queries.js.map +1 -1
- package/dist/epistemicQuestions.sprint.d.ts +2 -2
- package/dist/epistemicQuestions.sprint.js +600 -394
- package/dist/epistemicQuestions.sprint.js.map +1 -1
- package/dist/epistemicQuestions.tail.d.ts +6 -6
- package/dist/epistemicQuestions.tail.js +572 -433
- package/dist/epistemicQuestions.tail.js.map +1 -1
- package/dist/{epistemicSources-dlKj58Jp.d.ts → epistemicSources-DQtaEkWs.d.ts} +4 -4
- package/dist/epistemicSources.d.ts +1 -1
- package/dist/epistemicSources.js +351 -311
- package/dist/epistemicSources.js.map +1 -1
- package/dist/evaluators/index.d.ts +8 -6
- package/dist/evaluators/index.js +399 -167
- package/dist/evaluators/index.js.map +1 -1
- package/dist/evaluators/lint-checker-evaluator.d.ts +16 -0
- package/dist/evaluators/{lintCheckerEvaluator.js → lint-checker-evaluator.js} +10 -5
- package/dist/evaluators/lint-checker-evaluator.js.map +1 -0
- package/dist/evaluators/{sentryCheckerEvaluator.d.ts → sentry-checker-evaluator.d.ts} +7 -2
- package/dist/evaluators/{sentryCheckerEvaluator.js → sentry-checker-evaluator.js} +3 -3
- package/dist/evaluators/sentry-checker-evaluator.js.map +1 -0
- package/dist/evaluators/shared.d.ts +2 -2
- package/dist/evaluators/shared.js +3 -1
- package/dist/evaluators/shared.js.map +1 -1
- package/dist/evaluators/{testRunnerEvaluator.d.ts → test-runner-evaluator.d.ts} +6 -1
- package/dist/evaluators/{testRunnerEvaluator.js → test-runner-evaluator.js} +6 -4
- package/dist/evaluators/test-runner-evaluator.js.map +1 -0
- package/dist/evaluators/tsc-checker-evaluator.d.ts +16 -0
- package/dist/evaluators/{tscCheckerEvaluator.js → tsc-checker-evaluator.js} +10 -5
- package/dist/evaluators/tsc-checker-evaluator.js.map +1 -0
- package/dist/graphTypes.js +6 -2
- package/dist/graphTypes.js.map +1 -1
- package/dist/helpers.d.ts +2 -0
- package/dist/helpers.js +313 -93
- package/dist/helpers.js.map +1 -1
- package/dist/{index-C-Kyd7hD.d.ts → index-DZxyC9Pb.d.ts} +7 -6
- package/dist/index.d.ts +86 -83
- package/dist/index.js +16914 -11760
- package/dist/index.js.map +1 -1
- package/dist/invariantEnforcement.d.ts +3 -3
- package/dist/invariantEnforcement.js.map +1 -1
- package/dist/logicalRoleInference.d.ts +2 -0
- package/dist/logicalRoleInference.js +1 -1
- package/dist/logicalRoleInference.js.map +1 -1
- package/dist/matcherFeedbackUtils.d.ts +2 -2
- package/dist/matcherFeedbackUtils.js.map +1 -1
- package/dist/{ontology-matching-C6rrz2VP.d.ts → ontology-matching-C-mYFrir.d.ts} +16 -16
- package/dist/ontology-matching.d.ts +1 -1
- package/dist/{ontologyApproval-CFYmqKmk.d.ts → ontologyApproval-BVt0feJi.d.ts} +10 -10
- package/dist/ontologyApproval.d.ts +1 -1
- package/dist/ontologyApproval.js +7 -1
- package/dist/ontologyApproval.js.map +1 -1
- package/dist/ontologyDefinitions.d.ts +14 -24
- package/dist/ontologyDefinitions.js +269 -34
- package/dist/ontologyDefinitions.js.map +1 -1
- package/dist/ontologyHelpers.d.ts +13 -13
- package/dist/ontologyHelpers.js.map +1 -1
- package/dist/{ontologyRegistry-B67rPJ16.d.ts → ontologyRegistry-CljS-ENv.d.ts} +2 -2
- package/dist/ontologyRegistry.d.ts +1 -1
- package/dist/ontologyRegistry.js +34 -6
- package/dist/ontologyRegistry.js.map +1 -1
- package/dist/{projectionReconciliation-jww2fBI0.d.ts → projectionReconciliation-DnrSgHSQ.d.ts} +4 -4
- package/dist/projectionReconciliation.d.ts +1 -1
- package/dist/projectionReconciliation.js +57 -10
- package/dist/projectionReconciliation.js.map +1 -1
- package/dist/{projectionStaleness-CmdbpjVK.d.ts → projectionStaleness-C8ImQ2zP.d.ts} +17 -17
- package/dist/projectionStaleness.d.ts +1 -1
- package/dist/projectionStaleness.js +8 -2
- package/dist/projectionStaleness.js.map +1 -1
- package/dist/proof-attestation.json +1 -1
- package/dist/{questionEvidenceLinks-DFlyPpAj.d.ts → questionEvidenceLinks-_nPRa-LY.d.ts} +10 -10
- package/dist/questionEvidenceLinks.d.ts +1 -1
- package/dist/questionEvidenceLinks.js +564 -347
- package/dist/questionEvidenceLinks.js.map +1 -1
- package/dist/{resolverTypes-CC8Ea2E2.d.ts → resolverTypes-BOXPxLET.d.ts} +8 -7
- package/dist/resolverTypes.d.ts +4 -2
- package/dist/{resolvers-Br1a6eLV.d.ts → resolvers-B1TIBmRO.d.ts} +3 -1
- package/dist/resolvers.d.ts +5 -3
- package/dist/resolvers.js +121 -77
- package/dist/resolvers.js.map +1 -1
- package/dist/scopeResolverCompat.d.ts +10 -7
- package/dist/scopeResolverCompat.js +106 -123
- package/dist/scopeResolverCompat.js.map +1 -1
- package/dist/{text-matching-DNg4M5Wd.d.ts → text-matching-DzFooju6.d.ts} +7 -7
- package/dist/text-matching.d.ts +1 -1
- package/dist/topicOntologyResolver.d.ts +22 -21
- package/dist/topicOntologyResolver.js +54 -32
- package/dist/topicOntologyResolver.js.map +1 -1
- package/dist/topicProjectOverlay.d.ts +30 -20
- package/dist/topicProjectOverlay.js +120 -76
- package/dist/topicProjectOverlay.js.map +1 -1
- package/dist/{topicScope-7zhyeGl7.d.ts → topicScope-DJVa0mLa.d.ts} +22 -7
- package/dist/topicScope.d.ts +3 -1
- package/dist/topicScope.js +104 -119
- package/dist/topicScope.js.map +1 -1
- package/dist/workflowBridge.d.ts +26 -15
- package/dist/workflowBridge.js +140 -144
- package/dist/workflowBridge.js.map +1 -1
- package/dist/workspaceIsolation.d.ts +14 -12
- package/dist/workspaceIsolation.js +108 -122
- package/dist/workspaceIsolation.js.map +1 -1
- package/package.json +4 -4
- package/dist/edges/dependsOn.js.map +0 -1
- package/dist/edges/derivedFrom.js.map +0 -1
- package/dist/edges/propagationTypes.js.map +0 -1
- package/dist/evaluators/lintCheckerEvaluator.d.ts +0 -11
- package/dist/evaluators/lintCheckerEvaluator.js.map +0 -1
- package/dist/evaluators/sentryCheckerEvaluator.js.map +0 -1
- package/dist/evaluators/testRunnerEvaluator.js.map +0 -1
- package/dist/evaluators/tscCheckerEvaluator.d.ts +0 -11
- package/dist/evaluators/tscCheckerEvaluator.js.map +0 -1
- package/dist/{epistemicQuestions-bwHd2FWE.d.ts → epistemicQuestions-Do1fhYm5.d.ts} +4 -4
|
@@ -1,13 +1,17 @@
|
|
|
1
|
-
import { v } from 'convex/values';
|
|
2
|
-
import { componentsGeneric, anyApi, internalMutationGeneric, internalQueryGeneric } from 'convex/server';
|
|
3
1
|
import { permissiveReturn } from '@lucern/contracts/schema-helpers/validators';
|
|
4
|
-
import {
|
|
2
|
+
import { v } from 'convex/values';
|
|
3
|
+
import { unsafeConvexAnyApi } from '@lucern/contracts/convex/unsafeAnyApi';
|
|
4
|
+
import { componentsGeneric, internalMutationGeneric, internalQueryGeneric } from 'convex/server';
|
|
5
5
|
import '@lucern/contracts';
|
|
6
|
+
import { assertUuidV7Identity } from '@lucern/contracts/ids';
|
|
6
7
|
|
|
7
8
|
// src/epistemicNodes.internal.ts
|
|
8
|
-
var
|
|
9
|
+
var unsafeApi = unsafeConvexAnyApi(
|
|
10
|
+
"graph-primitives top-level module bundle lacks a committed Convex _generated/api surface"
|
|
11
|
+
);
|
|
12
|
+
var api = unsafeApi;
|
|
9
13
|
componentsGeneric();
|
|
10
|
-
var internal =
|
|
14
|
+
var internal = unsafeApi;
|
|
11
15
|
var internalMutation = internalMutationGeneric;
|
|
12
16
|
var internalQuery = internalQueryGeneric;
|
|
13
17
|
|
|
@@ -22,6 +26,200 @@ function debugGraphPrimitiveFallback(message, context) {
|
|
|
22
26
|
}
|
|
23
27
|
console.debug(message, context ?? {});
|
|
24
28
|
}
|
|
29
|
+
function insertEpistemicNode(ctx, doc) {
|
|
30
|
+
assertUuidV7Identity("epistemicNodes", doc.globalId);
|
|
31
|
+
return ctx.db.insert("epistemicNodes", doc);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// src/epistemicNodes.helpers.ts
|
|
35
|
+
function buildNodeStatusSuccessResult() {
|
|
36
|
+
return { success: true };
|
|
37
|
+
}
|
|
38
|
+
function buildNodeNotFoundResult() {
|
|
39
|
+
const result = {};
|
|
40
|
+
result.success = false;
|
|
41
|
+
result.error = "Node not found";
|
|
42
|
+
return result;
|
|
43
|
+
}
|
|
44
|
+
function buildNodeDeletedResult(deletedEdgeCount) {
|
|
45
|
+
return {
|
|
46
|
+
success: true,
|
|
47
|
+
deletedEdgeCount
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
v.union(
|
|
51
|
+
v.literal("L4"),
|
|
52
|
+
v.literal("L3"),
|
|
53
|
+
v.literal("L2"),
|
|
54
|
+
v.literal("L1"),
|
|
55
|
+
v.literal("ontological"),
|
|
56
|
+
v.literal("organizational")
|
|
57
|
+
);
|
|
58
|
+
v.union(v.literal("decision"));
|
|
59
|
+
v.union(
|
|
60
|
+
v.literal("belief"),
|
|
61
|
+
v.literal("question"),
|
|
62
|
+
v.literal("theme"),
|
|
63
|
+
v.literal("deal")
|
|
64
|
+
);
|
|
65
|
+
v.union(
|
|
66
|
+
v.literal("claim"),
|
|
67
|
+
v.literal("evidence"),
|
|
68
|
+
v.literal("synthesis")
|
|
69
|
+
);
|
|
70
|
+
v.union(
|
|
71
|
+
v.literal("atomic_fact"),
|
|
72
|
+
v.literal("excerpt"),
|
|
73
|
+
v.literal("source")
|
|
74
|
+
);
|
|
75
|
+
v.union(
|
|
76
|
+
// L4: Audit targets
|
|
77
|
+
v.literal("decision"),
|
|
78
|
+
// L3: Traversal anchors
|
|
79
|
+
v.literal("belief"),
|
|
80
|
+
v.literal("question"),
|
|
81
|
+
v.literal("theme"),
|
|
82
|
+
v.literal("deal"),
|
|
83
|
+
// L2: Compression boundary
|
|
84
|
+
v.literal("claim"),
|
|
85
|
+
v.literal("evidence"),
|
|
86
|
+
v.literal("synthesis"),
|
|
87
|
+
v.literal("answer"),
|
|
88
|
+
// L1: Terminal leaves
|
|
89
|
+
v.literal("atomic_fact"),
|
|
90
|
+
v.literal("excerpt"),
|
|
91
|
+
v.literal("source")
|
|
92
|
+
);
|
|
93
|
+
v.union(
|
|
94
|
+
v.literal("company"),
|
|
95
|
+
v.literal("person"),
|
|
96
|
+
v.literal("investor"),
|
|
97
|
+
v.literal("function"),
|
|
98
|
+
v.literal("value_chain")
|
|
99
|
+
);
|
|
100
|
+
v.union(v.literal("topic"));
|
|
101
|
+
var nodeTypeValidator = v.union(
|
|
102
|
+
// L4: Audit targets
|
|
103
|
+
v.literal("decision"),
|
|
104
|
+
// L3: Traversal anchors
|
|
105
|
+
v.literal("belief"),
|
|
106
|
+
v.literal("question"),
|
|
107
|
+
v.literal("theme"),
|
|
108
|
+
v.literal("deal"),
|
|
109
|
+
// L2: Compression boundary
|
|
110
|
+
v.literal("claim"),
|
|
111
|
+
v.literal("evidence"),
|
|
112
|
+
v.literal("synthesis"),
|
|
113
|
+
v.literal("answer"),
|
|
114
|
+
// L1: Terminal leaves
|
|
115
|
+
v.literal("atomic_fact"),
|
|
116
|
+
v.literal("excerpt"),
|
|
117
|
+
v.literal("source"),
|
|
118
|
+
// Ontological
|
|
119
|
+
v.literal("company"),
|
|
120
|
+
v.literal("person"),
|
|
121
|
+
v.literal("investor"),
|
|
122
|
+
v.literal("function"),
|
|
123
|
+
v.literal("value_chain"),
|
|
124
|
+
// Organizational
|
|
125
|
+
v.literal("topic")
|
|
126
|
+
);
|
|
127
|
+
var sourceTypeValidator = v.union(
|
|
128
|
+
v.literal("human"),
|
|
129
|
+
v.literal("ai_extracted"),
|
|
130
|
+
v.literal("ai_generated"),
|
|
131
|
+
v.literal("imported"),
|
|
132
|
+
v.literal("system")
|
|
133
|
+
// System-generated (migrations, classifiers)
|
|
134
|
+
);
|
|
135
|
+
v.union(
|
|
136
|
+
v.literal("active"),
|
|
137
|
+
v.literal("superseded"),
|
|
138
|
+
v.literal("archived"),
|
|
139
|
+
v.literal("deleted")
|
|
140
|
+
);
|
|
141
|
+
var verificationStatusValidator = v.union(
|
|
142
|
+
v.literal("unverified"),
|
|
143
|
+
v.literal("human_verified"),
|
|
144
|
+
v.literal("ai_verified"),
|
|
145
|
+
v.literal("contradicted"),
|
|
146
|
+
v.literal("outdated")
|
|
147
|
+
);
|
|
148
|
+
|
|
149
|
+
// src/graphTypes.ts
|
|
150
|
+
function getNodeLayer(nodeType) {
|
|
151
|
+
const L4_TYPES = ["decision"];
|
|
152
|
+
const L3_TYPES = ["belief", "question", "theme", "deal"];
|
|
153
|
+
const L2_TYPES = ["claim", "evidence", "synthesis", "answer"];
|
|
154
|
+
const L1_TYPES = ["atomic_fact", "excerpt", "source"];
|
|
155
|
+
const ONTOLOGICAL_TYPES = [
|
|
156
|
+
"company",
|
|
157
|
+
"person",
|
|
158
|
+
"investor",
|
|
159
|
+
"function",
|
|
160
|
+
"value_chain"
|
|
161
|
+
];
|
|
162
|
+
const ORGANIZATIONAL_TYPES = ["topic"];
|
|
163
|
+
if (L4_TYPES.includes(nodeType)) {
|
|
164
|
+
return "L4";
|
|
165
|
+
}
|
|
166
|
+
if (L3_TYPES.includes(nodeType)) {
|
|
167
|
+
return "L3";
|
|
168
|
+
}
|
|
169
|
+
if (L2_TYPES.includes(nodeType)) {
|
|
170
|
+
return "L2";
|
|
171
|
+
}
|
|
172
|
+
if (L1_TYPES.includes(nodeType)) {
|
|
173
|
+
return "L1";
|
|
174
|
+
}
|
|
175
|
+
if (ONTOLOGICAL_TYPES.includes(nodeType)) {
|
|
176
|
+
return "ontological";
|
|
177
|
+
}
|
|
178
|
+
if (ORGANIZATIONAL_TYPES.includes(nodeType)) {
|
|
179
|
+
return "organizational";
|
|
180
|
+
}
|
|
181
|
+
console.warn(`[GraphTypes] Unknown nodeType "${nodeType}", defaulting to L2`);
|
|
182
|
+
return "L2";
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// src/invariantEnforcement.ts
|
|
186
|
+
function throwInvariantError(args) {
|
|
187
|
+
const error = new Error(args.message);
|
|
188
|
+
error.status = args.status ?? 409;
|
|
189
|
+
error.code = args.code ?? "INVARIANT_VIOLATION";
|
|
190
|
+
error.invariantCode = args.invariantCode;
|
|
191
|
+
error.suggestion = args.suggestion;
|
|
192
|
+
error.details = args.details;
|
|
193
|
+
throw error;
|
|
194
|
+
}
|
|
195
|
+
function isBeliefNode(node) {
|
|
196
|
+
return node?.nodeType === "belief";
|
|
197
|
+
}
|
|
198
|
+
function assertBeliefNodeHardDeleteAllowed(args) {
|
|
199
|
+
if (!isBeliefNode(args.node)) {
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
if (!args.allowBeliefHardDelete) {
|
|
203
|
+
throwInvariantError({
|
|
204
|
+
message: "Belief hard delete is forbidden by default. Beliefs must retain lineage and audit history.",
|
|
205
|
+
invariantCode: "belief.hard_delete_forbidden",
|
|
206
|
+
suggestion: "Use epistemicBeliefs.archive() or epistemicBeliefs.forkBelief() instead. Only migration repair flows may opt into hard delete explicitly.",
|
|
207
|
+
details: { mutationName: args.mutationName, nodeId: args.node._id }
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
if (!args.reason.trim().toLowerCase().startsWith("migration:")) {
|
|
211
|
+
throwInvariantError({
|
|
212
|
+
message: "Belief hard delete bypasses require a migration-scoped rationale.",
|
|
213
|
+
invariantCode: "belief.hard_delete_forbidden",
|
|
214
|
+
suggestion: 'Retry with allowBeliefHardDelete: true and a reason starting with "migration:" only for one-off data repair flows.',
|
|
215
|
+
details: {
|
|
216
|
+
mutationName: args.mutationName,
|
|
217
|
+
nodeId: args.node._id,
|
|
218
|
+
reason: args.reason
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
}
|
|
25
223
|
var LEGACY_SCOPE_FIELD = "graphScopeProjectId";
|
|
26
224
|
async function resolveTopicNodeScopeOrNull(ctx, ref) {
|
|
27
225
|
if (!ctx?.db || typeof ctx.db.query !== "function") {
|
|
@@ -56,13 +254,15 @@ function asMappedProjectId(topic) {
|
|
|
56
254
|
if (!topic) {
|
|
57
255
|
return;
|
|
58
256
|
}
|
|
59
|
-
const directLegacyProjectId = normalizeScopeValue(
|
|
257
|
+
const directLegacyProjectId = normalizeScopeValue(
|
|
258
|
+
topic[LEGACY_SCOPE_FIELD]
|
|
259
|
+
);
|
|
60
260
|
if (directLegacyProjectId) {
|
|
61
261
|
return directLegacyProjectId;
|
|
62
262
|
}
|
|
63
263
|
const metadata = topic.metadata || {};
|
|
64
264
|
const candidate = metadata[LEGACY_SCOPE_FIELD] || metadata.legacyProjectId || metadata.projectId || metadata.scopeProjectId;
|
|
65
|
-
return candidate ? candidate : void 0;
|
|
265
|
+
return typeof candidate === "string" ? normalizeScopeValue(candidate) : void 0;
|
|
66
266
|
}
|
|
67
267
|
function normalizeScopeValue(value) {
|
|
68
268
|
if (typeof value !== "string") {
|
|
@@ -87,8 +287,9 @@ function pickPrimaryTopic(candidates) {
|
|
|
87
287
|
})[0];
|
|
88
288
|
}
|
|
89
289
|
async function findTopicsByScopeAlias(ctx, scopeId) {
|
|
290
|
+
const query = ctx.db.query("topics");
|
|
90
291
|
try {
|
|
91
|
-
return await
|
|
292
|
+
return await query.withIndex(
|
|
92
293
|
"by_graph_scope_project",
|
|
93
294
|
(q) => q.eq(LEGACY_SCOPE_FIELD, scopeId)
|
|
94
295
|
).collect();
|
|
@@ -100,7 +301,7 @@ async function findTopicsByScopeAlias(ctx, scopeId) {
|
|
|
100
301
|
scopeId
|
|
101
302
|
}
|
|
102
303
|
);
|
|
103
|
-
const topics = await
|
|
304
|
+
const topics = await query.collect();
|
|
104
305
|
return topics.filter((topic) => {
|
|
105
306
|
const normalizedGlobalId = normalizeScopeValue(topic.globalId);
|
|
106
307
|
const mappedProjectId = asMappedProjectId(topic);
|
|
@@ -156,338 +357,196 @@ async function resolveInheritedWorkspaceScope(ctx, topic) {
|
|
|
156
357
|
let current = topic;
|
|
157
358
|
for (let i = 0; i < MAX_DEPTH && current?.parentTopicId; i++) {
|
|
158
359
|
current = await ctx.db.get(current.parentTopicId);
|
|
159
|
-
if (!current)
|
|
360
|
+
if (!current) {
|
|
361
|
+
break;
|
|
362
|
+
}
|
|
160
363
|
if (!tenantId) {
|
|
161
364
|
tenantId = normalizeScopeValue(current.tenantId);
|
|
162
365
|
}
|
|
163
366
|
if (!workspaceId) {
|
|
164
367
|
workspaceId = normalizeScopeValue(current.workspaceId);
|
|
165
368
|
}
|
|
166
|
-
if (tenantId && workspaceId)
|
|
369
|
+
if (tenantId && workspaceId) {
|
|
370
|
+
break;
|
|
371
|
+
}
|
|
167
372
|
}
|
|
168
373
|
return { tenantId, workspaceId };
|
|
169
374
|
}
|
|
170
375
|
async function resolveTopicProjectScope(ctx, args) {
|
|
171
376
|
if (args.topicId) {
|
|
172
|
-
|
|
173
|
-
try {
|
|
174
|
-
topic = await ctx.db.get(
|
|
175
|
-
args.topicId
|
|
176
|
-
);
|
|
177
|
-
} catch (error) {
|
|
178
|
-
debugGraphPrimitiveFallback(
|
|
179
|
-
"[topicScope] Failed to load topic by direct id",
|
|
180
|
-
{
|
|
181
|
-
error,
|
|
182
|
-
topicId: args.topicId
|
|
183
|
-
}
|
|
184
|
-
);
|
|
185
|
-
}
|
|
186
|
-
if (!topic) {
|
|
187
|
-
topic = await tryResolveHostTopicById(ctx, String(args.topicId));
|
|
188
|
-
}
|
|
189
|
-
if (!topic) {
|
|
190
|
-
topic = pickPrimaryTopic(
|
|
191
|
-
await findTopicsByScopeAlias(ctx, String(args.topicId))
|
|
192
|
-
) ?? null;
|
|
193
|
-
}
|
|
194
|
-
if (!topic) {
|
|
195
|
-
const nodeScope = await resolveTopicNodeScopeOrNull(
|
|
196
|
-
ctx,
|
|
197
|
-
String(args.topicId)
|
|
198
|
-
);
|
|
199
|
-
if (nodeScope) {
|
|
200
|
-
return nodeScope;
|
|
201
|
-
}
|
|
202
|
-
throw new Error(`Topic not found: ${String(args.topicId)}`);
|
|
203
|
-
}
|
|
204
|
-
const inherited = await resolveInheritedWorkspaceScope(ctx, topic);
|
|
205
|
-
const mapped = asMappedProjectId(topic);
|
|
206
|
-
if (mapped) {
|
|
207
|
-
return {
|
|
208
|
-
topicId: topic._id,
|
|
209
|
-
projectId: mapped,
|
|
210
|
-
tenantId: inherited.tenantId,
|
|
211
|
-
workspaceId: inherited.workspaceId,
|
|
212
|
-
source: "topic"
|
|
213
|
-
};
|
|
214
|
-
}
|
|
215
|
-
return {
|
|
216
|
-
topicId: topic._id,
|
|
217
|
-
tenantId: inherited.tenantId,
|
|
218
|
-
workspaceId: inherited.workspaceId,
|
|
219
|
-
source: "topic"
|
|
220
|
-
};
|
|
377
|
+
return await resolveScopeFromTopicId(ctx, args.topicId);
|
|
221
378
|
}
|
|
222
379
|
if (args.projectId) {
|
|
223
|
-
|
|
224
|
-
try {
|
|
225
|
-
directTopic = await ctx.db.get(
|
|
226
|
-
args.projectId
|
|
227
|
-
);
|
|
228
|
-
} catch (error) {
|
|
229
|
-
debugGraphPrimitiveFallback(
|
|
230
|
-
"[topicScope] Failed to load direct project topic",
|
|
231
|
-
{
|
|
232
|
-
error,
|
|
233
|
-
projectId: args.projectId
|
|
234
|
-
}
|
|
235
|
-
);
|
|
236
|
-
}
|
|
237
|
-
if (directTopic) {
|
|
238
|
-
const inherited = await resolveInheritedWorkspaceScope(ctx, directTopic);
|
|
239
|
-
const mapped = asMappedProjectId(directTopic);
|
|
240
|
-
return {
|
|
241
|
-
topicId: directTopic._id,
|
|
242
|
-
projectId: mapped ?? args.projectId,
|
|
243
|
-
tenantId: inherited.tenantId,
|
|
244
|
-
workspaceId: inherited.workspaceId,
|
|
245
|
-
source: "topic_inferred"
|
|
246
|
-
};
|
|
247
|
-
}
|
|
248
|
-
directTopic = await tryResolveHostTopicByLegacyScope(ctx, args.projectId);
|
|
249
|
-
if (directTopic) {
|
|
250
|
-
const inherited = await resolveInheritedWorkspaceScope(ctx, directTopic);
|
|
251
|
-
const mapped = asMappedProjectId(directTopic);
|
|
252
|
-
return {
|
|
253
|
-
topicId: directTopic._id,
|
|
254
|
-
projectId: mapped ?? args.projectId,
|
|
255
|
-
tenantId: inherited.tenantId,
|
|
256
|
-
workspaceId: inherited.workspaceId,
|
|
257
|
-
source: "topic_inferred"
|
|
258
|
-
};
|
|
259
|
-
}
|
|
260
|
-
const topics = await findTopicsByScopeAlias(ctx, args.projectId);
|
|
261
|
-
const primary = pickPrimaryTopic(topics);
|
|
262
|
-
if (primary) {
|
|
263
|
-
const inherited = await resolveInheritedWorkspaceScope(ctx, primary);
|
|
264
|
-
return {
|
|
265
|
-
topicId: primary._id,
|
|
266
|
-
projectId: args.projectId,
|
|
267
|
-
tenantId: inherited.tenantId,
|
|
268
|
-
workspaceId: inherited.workspaceId,
|
|
269
|
-
source: "project_mapped_topic"
|
|
270
|
-
};
|
|
271
|
-
}
|
|
272
|
-
const nodeScope = await resolveTopicNodeScopeOrNull(
|
|
273
|
-
ctx,
|
|
274
|
-
String(args.projectId)
|
|
275
|
-
);
|
|
276
|
-
if (nodeScope) {
|
|
277
|
-
return {
|
|
278
|
-
...nodeScope,
|
|
279
|
-
projectId: nodeScope.projectId ?? String(args.projectId)
|
|
280
|
-
};
|
|
281
|
-
}
|
|
282
|
-
throw new Error(
|
|
283
|
-
`Legacy project scope ${String(args.projectId)} has no mapped topic.`
|
|
284
|
-
);
|
|
380
|
+
return await resolveScopeFromLegacyProjectId(ctx, args.projectId);
|
|
285
381
|
}
|
|
286
382
|
throw new Error(
|
|
287
383
|
"Missing scope: provide topicId (preferred) or legacy projectId alias."
|
|
288
384
|
);
|
|
289
385
|
}
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
// src/graphTypes.ts
|
|
296
|
-
function getNodeLayer(nodeType) {
|
|
297
|
-
const L4_TYPES = ["decision"];
|
|
298
|
-
const L3_TYPES = ["belief", "question", "theme", "deal"];
|
|
299
|
-
const L2_TYPES = ["claim", "evidence", "synthesis", "answer"];
|
|
300
|
-
const L1_TYPES = ["atomic_fact", "excerpt", "source"];
|
|
301
|
-
const ONTOLOGICAL_TYPES = [
|
|
302
|
-
"company",
|
|
303
|
-
"person",
|
|
304
|
-
"investor",
|
|
305
|
-
"function",
|
|
306
|
-
"value_chain"
|
|
307
|
-
];
|
|
308
|
-
const ORGANIZATIONAL_TYPES = ["topic"];
|
|
309
|
-
if (L4_TYPES.includes(nodeType)) {
|
|
310
|
-
return "L4";
|
|
386
|
+
async function resolveScopeFromTopicId(ctx, topicId) {
|
|
387
|
+
const topic = await resolveTopicDocFromTopicId(ctx, topicId);
|
|
388
|
+
if (topic) {
|
|
389
|
+
return await buildTopicScope(ctx, topic, "topic");
|
|
311
390
|
}
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
if (L2_TYPES.includes(nodeType)) {
|
|
316
|
-
return "L2";
|
|
391
|
+
const nodeScope = await resolveTopicNodeScopeOrNull(ctx, String(topicId));
|
|
392
|
+
if (nodeScope) {
|
|
393
|
+
return nodeScope;
|
|
317
394
|
}
|
|
318
|
-
|
|
319
|
-
|
|
395
|
+
throw new Error(`Topic not found: ${String(topicId)}`);
|
|
396
|
+
}
|
|
397
|
+
async function resolveTopicDocFromTopicId(ctx, topicId) {
|
|
398
|
+
const direct = await tryReadTopicDoc(ctx, topicId, {
|
|
399
|
+
failureLog: "[topicScope] Failed to load topic by direct id",
|
|
400
|
+
idLogKey: "topicId"
|
|
401
|
+
});
|
|
402
|
+
if (direct) {
|
|
403
|
+
return direct;
|
|
404
|
+
}
|
|
405
|
+
const hostTopic = await tryResolveHostTopicById(ctx, String(topicId));
|
|
406
|
+
if (hostTopic) {
|
|
407
|
+
return hostTopic;
|
|
408
|
+
}
|
|
409
|
+
return pickPrimaryTopic(await findTopicsByScopeAlias(ctx, String(topicId))) ?? null;
|
|
410
|
+
}
|
|
411
|
+
async function resolveScopeFromLegacyProjectId(ctx, legacyProjectId) {
|
|
412
|
+
const directTopic = await resolveDirectLegacyProjectTopic(
|
|
413
|
+
ctx,
|
|
414
|
+
legacyProjectId
|
|
415
|
+
);
|
|
416
|
+
if (directTopic) {
|
|
417
|
+
return await buildTopicScope(ctx, directTopic, "topic_inferred", {
|
|
418
|
+
fallbackProjectId: legacyProjectId
|
|
419
|
+
});
|
|
320
420
|
}
|
|
321
|
-
|
|
322
|
-
|
|
421
|
+
const primary = pickPrimaryTopic(
|
|
422
|
+
await findTopicsByScopeAlias(ctx, legacyProjectId)
|
|
423
|
+
);
|
|
424
|
+
if (primary) {
|
|
425
|
+
return await buildTopicScope(ctx, primary, "project_mapped_topic", {
|
|
426
|
+
fallbackProjectId: legacyProjectId
|
|
427
|
+
});
|
|
323
428
|
}
|
|
324
|
-
|
|
325
|
-
|
|
429
|
+
const nodeScope = await resolveTopicNodeScopeOrNull(ctx, legacyProjectId);
|
|
430
|
+
if (nodeScope) {
|
|
431
|
+
return {
|
|
432
|
+
...nodeScope,
|
|
433
|
+
projectId: nodeScope.projectId ?? legacyProjectId
|
|
434
|
+
};
|
|
326
435
|
}
|
|
327
|
-
|
|
328
|
-
|
|
436
|
+
throw new Error(
|
|
437
|
+
`Legacy project scope ${legacyProjectId} has no mapped topic.`
|
|
438
|
+
);
|
|
329
439
|
}
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
440
|
+
async function resolveDirectLegacyProjectTopic(ctx, legacyProjectId) {
|
|
441
|
+
const directTopic = await tryReadTopicDoc(ctx, legacyProjectId, {
|
|
442
|
+
failureLog: "[topicScope] Failed to load direct project topic",
|
|
443
|
+
idLogKey: "projectId"
|
|
444
|
+
});
|
|
445
|
+
return directTopic ?? tryResolveHostTopicByLegacyScope(ctx, legacyProjectId);
|
|
334
446
|
}
|
|
335
|
-
function
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
447
|
+
async function tryReadTopicDoc(ctx, id, log) {
|
|
448
|
+
try {
|
|
449
|
+
return await ctx.db.get(id);
|
|
450
|
+
} catch (error) {
|
|
451
|
+
debugGraphPrimitiveFallback(log.failureLog, {
|
|
452
|
+
error,
|
|
453
|
+
[log.idLogKey]: id
|
|
454
|
+
});
|
|
455
|
+
return null;
|
|
456
|
+
}
|
|
340
457
|
}
|
|
341
|
-
function
|
|
458
|
+
async function buildTopicScope(ctx, topic, source, options = {}) {
|
|
459
|
+
const inherited = await resolveInheritedWorkspaceScope(ctx, topic);
|
|
460
|
+
const mapped = asMappedProjectId(topic);
|
|
342
461
|
return {
|
|
343
|
-
|
|
344
|
-
|
|
462
|
+
topicId: topic._id,
|
|
463
|
+
...mapped || options.fallbackProjectId ? { projectId: mapped ?? options.fallbackProjectId } : {},
|
|
464
|
+
tenantId: inherited.tenantId,
|
|
465
|
+
workspaceId: inherited.workspaceId,
|
|
466
|
+
source
|
|
345
467
|
};
|
|
346
468
|
}
|
|
347
|
-
|
|
348
|
-
v.
|
|
349
|
-
v.
|
|
350
|
-
|
|
351
|
-
v.literal("L1"),
|
|
352
|
-
v.literal("ontological"),
|
|
353
|
-
v.literal("organizational")
|
|
354
|
-
);
|
|
355
|
-
v.union(v.literal("decision"));
|
|
356
|
-
v.union(
|
|
357
|
-
v.literal("belief"),
|
|
358
|
-
v.literal("question"),
|
|
359
|
-
v.literal("theme"),
|
|
360
|
-
v.literal("deal")
|
|
361
|
-
);
|
|
362
|
-
v.union(
|
|
363
|
-
v.literal("claim"),
|
|
364
|
-
v.literal("evidence"),
|
|
365
|
-
v.literal("synthesis")
|
|
366
|
-
);
|
|
367
|
-
v.union(
|
|
368
|
-
v.literal("atomic_fact"),
|
|
369
|
-
v.literal("excerpt"),
|
|
370
|
-
v.literal("source")
|
|
371
|
-
);
|
|
372
|
-
v.union(
|
|
373
|
-
// L4: Audit targets
|
|
374
|
-
v.literal("decision"),
|
|
375
|
-
// L3: Traversal anchors
|
|
376
|
-
v.literal("belief"),
|
|
377
|
-
v.literal("question"),
|
|
378
|
-
v.literal("theme"),
|
|
379
|
-
v.literal("deal"),
|
|
380
|
-
// L2: Compression boundary
|
|
381
|
-
v.literal("claim"),
|
|
382
|
-
v.literal("evidence"),
|
|
383
|
-
v.literal("synthesis"),
|
|
384
|
-
v.literal("answer"),
|
|
385
|
-
// L1: Terminal leaves
|
|
386
|
-
v.literal("atomic_fact"),
|
|
387
|
-
v.literal("excerpt"),
|
|
388
|
-
v.literal("source")
|
|
389
|
-
);
|
|
390
|
-
v.union(
|
|
391
|
-
v.literal("company"),
|
|
392
|
-
v.literal("person"),
|
|
393
|
-
v.literal("investor"),
|
|
394
|
-
v.literal("function"),
|
|
395
|
-
v.literal("value_chain")
|
|
396
|
-
);
|
|
397
|
-
v.union(v.literal("topic"));
|
|
398
|
-
var nodeTypeValidator = v.union(
|
|
399
|
-
// L4: Audit targets
|
|
400
|
-
v.literal("decision"),
|
|
401
|
-
// L3: Traversal anchors
|
|
402
|
-
v.literal("belief"),
|
|
403
|
-
v.literal("question"),
|
|
404
|
-
v.literal("theme"),
|
|
405
|
-
v.literal("deal"),
|
|
406
|
-
// L2: Compression boundary
|
|
407
|
-
v.literal("claim"),
|
|
408
|
-
v.literal("evidence"),
|
|
409
|
-
v.literal("synthesis"),
|
|
410
|
-
v.literal("answer"),
|
|
411
|
-
// L1: Terminal leaves
|
|
412
|
-
v.literal("atomic_fact"),
|
|
413
|
-
v.literal("excerpt"),
|
|
414
|
-
v.literal("source"),
|
|
415
|
-
// Ontological
|
|
416
|
-
v.literal("company"),
|
|
417
|
-
v.literal("person"),
|
|
418
|
-
v.literal("investor"),
|
|
419
|
-
v.literal("function"),
|
|
420
|
-
v.literal("value_chain"),
|
|
421
|
-
// Organizational
|
|
422
|
-
v.literal("topic")
|
|
423
|
-
);
|
|
424
|
-
var sourceTypeValidator = v.union(
|
|
425
|
-
v.literal("human"),
|
|
426
|
-
v.literal("ai_extracted"),
|
|
427
|
-
v.literal("ai_generated"),
|
|
428
|
-
v.literal("imported"),
|
|
429
|
-
v.literal("system")
|
|
430
|
-
// System-generated (migrations, classifiers)
|
|
431
|
-
);
|
|
432
|
-
v.union(
|
|
433
|
-
v.literal("active"),
|
|
434
|
-
v.literal("superseded"),
|
|
435
|
-
v.literal("archived"),
|
|
436
|
-
v.literal("deleted")
|
|
437
|
-
);
|
|
438
|
-
var verificationStatusValidator = v.union(
|
|
439
|
-
v.literal("unverified"),
|
|
440
|
-
v.literal("human_verified"),
|
|
441
|
-
v.literal("ai_verified"),
|
|
442
|
-
v.literal("contradicted"),
|
|
443
|
-
v.literal("outdated")
|
|
444
|
-
);
|
|
469
|
+
var optionalScopeArgs = {
|
|
470
|
+
projectId: v.optional(v.string()),
|
|
471
|
+
topicId: v.optional(v.string())
|
|
472
|
+
};
|
|
445
473
|
|
|
446
|
-
// src/
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
474
|
+
// src/epistemicNodes.internal.ts
|
|
475
|
+
var optionalNodeScopeArgs = optionalScopeArgs;
|
|
476
|
+
var EPISTEMIC_LAYERS = /* @__PURE__ */ new Set([
|
|
477
|
+
"L4",
|
|
478
|
+
"L3",
|
|
479
|
+
"L2",
|
|
480
|
+
"L1",
|
|
481
|
+
"ontological",
|
|
482
|
+
"organizational"
|
|
483
|
+
]);
|
|
484
|
+
function readOptionalString(value) {
|
|
485
|
+
return typeof value === "string" && value.trim().length > 0 ? value : void 0;
|
|
455
486
|
}
|
|
456
|
-
function
|
|
457
|
-
|
|
487
|
+
function readConvexId(value) {
|
|
488
|
+
const normalized = readOptionalString(value);
|
|
489
|
+
return normalized ? normalized : null;
|
|
458
490
|
}
|
|
459
|
-
function
|
|
460
|
-
|
|
461
|
-
|
|
491
|
+
function readRecord(value) {
|
|
492
|
+
return value && typeof value === "object" && !Array.isArray(value) ? value : null;
|
|
493
|
+
}
|
|
494
|
+
function readEpistemicLayer(value) {
|
|
495
|
+
const layer = readOptionalString(value);
|
|
496
|
+
return layer && EPISTEMIC_LAYERS.has(layer) ? layer : void 0;
|
|
497
|
+
}
|
|
498
|
+
function resolveEpistemicLayer(args) {
|
|
499
|
+
return readEpistemicLayer(args.providedLayer) ?? getNodeLayer(args.nodeType);
|
|
500
|
+
}
|
|
501
|
+
function readInternalNodeRow(value) {
|
|
502
|
+
const record = readRecord(value);
|
|
503
|
+
if (!record) {
|
|
504
|
+
return null;
|
|
462
505
|
}
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
suggestion: "Use epistemicBeliefs.archive() or epistemicBeliefs.forkBelief() instead. Only migration repair flows may opt into hard delete explicitly.",
|
|
468
|
-
details: { mutationName: args.mutationName, nodeId: args.node._id }
|
|
469
|
-
});
|
|
506
|
+
const id = readConvexId(record._id);
|
|
507
|
+
const nodeType = readOptionalString(record.nodeType);
|
|
508
|
+
if (!(id && nodeType)) {
|
|
509
|
+
return null;
|
|
470
510
|
}
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
511
|
+
const node = { _id: id, nodeType };
|
|
512
|
+
const canonicalText = readOptionalString(record.canonicalText);
|
|
513
|
+
if (canonicalText !== void 0) {
|
|
514
|
+
node.canonicalText = canonicalText;
|
|
515
|
+
}
|
|
516
|
+
const globalId = readOptionalString(record.globalId);
|
|
517
|
+
if (globalId !== void 0) {
|
|
518
|
+
node.globalId = globalId;
|
|
519
|
+
}
|
|
520
|
+
const projectId = readOptionalString(record.projectId);
|
|
521
|
+
if (projectId !== void 0) {
|
|
522
|
+
node.projectId = projectId;
|
|
523
|
+
}
|
|
524
|
+
const status = readOptionalString(record.status);
|
|
525
|
+
if (status !== void 0) {
|
|
526
|
+
node.status = status;
|
|
527
|
+
}
|
|
528
|
+
const title = readOptionalString(record.title);
|
|
529
|
+
if (title !== void 0) {
|
|
530
|
+
node.title = title;
|
|
482
531
|
}
|
|
532
|
+
return node;
|
|
483
533
|
}
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
534
|
+
function readInternalEdgeRow(value) {
|
|
535
|
+
const record = readRecord(value);
|
|
536
|
+
if (!record) {
|
|
537
|
+
return null;
|
|
538
|
+
}
|
|
539
|
+
const id = readConvexId(record._id);
|
|
540
|
+
if (!id) {
|
|
541
|
+
return null;
|
|
542
|
+
}
|
|
543
|
+
const edge = { _id: id };
|
|
544
|
+
const globalId = readOptionalString(record.globalId);
|
|
545
|
+
if (globalId !== void 0) {
|
|
546
|
+
edge.globalId = globalId;
|
|
547
|
+
}
|
|
548
|
+
return edge;
|
|
487
549
|
}
|
|
488
|
-
|
|
489
|
-
// src/epistemicNodes.internal.ts
|
|
490
|
-
var optionalNodeScopeArgs = optionalScopeArgs;
|
|
491
550
|
var createInternal = internalMutation({
|
|
492
551
|
args: {
|
|
493
552
|
...optionalNodeScopeArgs,
|
|
@@ -547,11 +606,14 @@ var createInternal = internalMutation({
|
|
|
547
606
|
projectId: args.projectId
|
|
548
607
|
}
|
|
549
608
|
);
|
|
550
|
-
return
|
|
609
|
+
return;
|
|
551
610
|
}
|
|
552
611
|
})() : void 0;
|
|
553
612
|
const contentHash = args.contentHash || `${args.nodeType}:${args.canonicalText}`.slice(0, 64);
|
|
554
|
-
const epistemicLayer =
|
|
613
|
+
const epistemicLayer = resolveEpistemicLayer({
|
|
614
|
+
nodeType: args.nodeType,
|
|
615
|
+
providedLayer: args.epistemicLayer
|
|
616
|
+
});
|
|
555
617
|
const nodeId = await insertEpistemicNode(ctx, {
|
|
556
618
|
globalId: args.globalId,
|
|
557
619
|
nodeType: args.nodeType,
|
|
@@ -592,9 +654,7 @@ var getInternal = internalQuery({
|
|
|
592
654
|
nodeId: v.id("epistemicNodes")
|
|
593
655
|
},
|
|
594
656
|
returns: permissiveReturn,
|
|
595
|
-
handler: async (ctx, args) =>
|
|
596
|
-
return await ctx.db.get(args.nodeId);
|
|
597
|
-
}
|
|
657
|
+
handler: async (ctx, args) => await ctx.db.get(args.nodeId)
|
|
598
658
|
});
|
|
599
659
|
var updateSyncStatus = internalMutation({
|
|
600
660
|
args: {
|
|
@@ -663,7 +723,7 @@ var hardDelete = internalMutation({
|
|
|
663
723
|
},
|
|
664
724
|
returns: permissiveReturn,
|
|
665
725
|
handler: async (ctx, args) => {
|
|
666
|
-
const node = await ctx.db.get(args.nodeId);
|
|
726
|
+
const node = readInternalNodeRow(await ctx.db.get(args.nodeId));
|
|
667
727
|
if (!node) {
|
|
668
728
|
return buildNodeNotFoundResult();
|
|
669
729
|
}
|
|
@@ -675,7 +735,7 @@ var hardDelete = internalMutation({
|
|
|
675
735
|
});
|
|
676
736
|
await ctx.db.insert("epistemicAudit", {
|
|
677
737
|
entityType: "node",
|
|
678
|
-
entityId: args.nodeId,
|
|
738
|
+
entityId: String(args.nodeId),
|
|
679
739
|
changeType: "deleted",
|
|
680
740
|
projectId: node.projectId,
|
|
681
741
|
changedBy: "system:hard_delete",
|
|
@@ -683,21 +743,31 @@ var hardDelete = internalMutation({
|
|
|
683
743
|
isAgent: false,
|
|
684
744
|
previousState: {
|
|
685
745
|
nodeType: node.nodeType,
|
|
686
|
-
title: node.title
|
|
746
|
+
title: node.title ?? node.canonicalText?.slice(0, 100),
|
|
687
747
|
status: node.status
|
|
688
748
|
},
|
|
689
749
|
rationale: args.reason
|
|
690
750
|
});
|
|
691
|
-
const
|
|
692
|
-
|
|
751
|
+
const endpointRefs = [String(args.nodeId), node.globalId].filter(
|
|
752
|
+
(ref) => typeof ref === "string" && ref.length > 0
|
|
753
|
+
);
|
|
693
754
|
const uniqueEdges = /* @__PURE__ */ new Map();
|
|
694
|
-
for (const
|
|
695
|
-
|
|
755
|
+
for (const endpointRef of endpointRefs) {
|
|
756
|
+
const fromEdges = await ctx.db.query("epistemicEdges").withIndex("by_from", (q) => q.eq("fromNodeId", endpointRef)).collect();
|
|
757
|
+
const toEdges = await ctx.db.query("epistemicEdges").withIndex("by_to", (q) => q.eq("toNodeId", endpointRef)).collect();
|
|
758
|
+
for (const rawEdge of [...fromEdges, ...toEdges]) {
|
|
759
|
+
const edge = readInternalEdgeRow(rawEdge);
|
|
760
|
+
if (edge) {
|
|
761
|
+
uniqueEdges.set(edge.globalId ?? String(edge._id), edge);
|
|
762
|
+
}
|
|
763
|
+
}
|
|
696
764
|
}
|
|
697
765
|
for (const edge of uniqueEdges.values()) {
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
766
|
+
if (edge.globalId) {
|
|
767
|
+
await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.deleteEdge, {
|
|
768
|
+
globalId: edge.globalId
|
|
769
|
+
});
|
|
770
|
+
}
|
|
701
771
|
await ctx.db.delete(edge._id);
|
|
702
772
|
}
|
|
703
773
|
await ctx.db.delete(args.nodeId);
|