@lucern/graph-primitives 1.0.28 → 1.0.30
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 +398 -228
- 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 +857 -515
- 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 +366 -203
- package/dist/epistemicBeliefs.admin.js.map +1 -1
- package/dist/epistemicBeliefs.backfills.d.ts +8 -8
- package/dist/epistemicBeliefs.backfills.js +655 -308
- package/dist/epistemicBeliefs.backfills.js.map +1 -1
- package/dist/epistemicBeliefs.confidence.d.ts +19 -14
- package/dist/epistemicBeliefs.confidence.js +634 -423
- package/dist/epistemicBeliefs.confidence.js.map +1 -1
- package/dist/epistemicBeliefs.core.d.ts +6 -6
- package/dist/epistemicBeliefs.core.js +719 -411
- package/dist/epistemicBeliefs.core.js.map +1 -1
- package/dist/epistemicBeliefs.d.ts +11 -8
- package/dist/epistemicBeliefs.forkEvidence.d.ts +2 -0
- package/dist/epistemicBeliefs.forkEvidence.js +8 -28
- package/dist/epistemicBeliefs.forkEvidence.js.map +1 -1
- package/dist/epistemicBeliefs.helpers.d.ts +69 -74
- package/dist/epistemicBeliefs.helpers.js +359 -248
- package/dist/epistemicBeliefs.helpers.js.map +1 -1
- package/dist/epistemicBeliefs.internal.d.ts +5 -5
- package/dist/epistemicBeliefs.internal.js +1246 -1044
- package/dist/epistemicBeliefs.internal.js.map +1 -1
- package/dist/epistemicBeliefs.js +4922 -3608
- package/dist/epistemicBeliefs.js.map +1 -1
- package/dist/epistemicBeliefs.lifecycle.d.ts +5 -5
- package/dist/epistemicBeliefs.lifecycle.js +1137 -818
- package/dist/epistemicBeliefs.lifecycle.js.map +1 -1
- package/dist/epistemicBeliefs.links.d.ts +7 -7
- package/dist/epistemicBeliefs.links.js +408 -307
- 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 +1063 -613
- package/dist/epistemicContracts.evaluators.js.map +1 -1
- package/dist/epistemicContracts.handlers.d.ts +15 -32
- package/dist/epistemicContracts.handlers.js +2086 -1644
- package/dist/epistemicContracts.handlers.js.map +1 -1
- package/dist/epistemicContracts.js +1131 -672
- 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 +1969 -1205
- package/dist/epistemicEdges.js.map +1 -1
- package/dist/epistemicEdges.mutations.d.ts +7 -7
- package/dist/epistemicEdges.mutations.js +960 -583
- 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 +937 -536
- 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 +844 -696
- 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 +704 -508
- package/dist/epistemicNodes.js.map +1 -1
- package/dist/epistemicNodes.mutations.d.ts +6 -6
- package/dist/epistemicNodes.mutations.js +564 -467
- 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 +352 -312
- 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 +87 -83
- package/dist/index.js +15677 -10594
- 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,9 +1,16 @@
|
|
|
1
|
-
import { v } from 'convex/values';
|
|
2
1
|
import { checkScopeAccess } from '@lucern/access-control/access';
|
|
3
2
|
import { permissiveReturn } from '@lucern/contracts/schema-helpers/validators';
|
|
4
|
-
import {
|
|
3
|
+
import { v } from 'convex/values';
|
|
4
|
+
import { unsafeConvexAnyApi } from '@lucern/contracts/convex/unsafeAnyApi';
|
|
5
|
+
import { componentsGeneric, queryGeneric } from 'convex/server';
|
|
5
6
|
|
|
6
7
|
// src/epistemicEdges.queries.ts
|
|
8
|
+
var unsafeApi = unsafeConvexAnyApi(
|
|
9
|
+
"graph-primitives top-level module bundle lacks a committed Convex _generated/api surface"
|
|
10
|
+
);
|
|
11
|
+
var api = unsafeApi;
|
|
12
|
+
componentsGeneric();
|
|
13
|
+
var query = queryGeneric;
|
|
7
14
|
|
|
8
15
|
// src/debug.ts
|
|
9
16
|
function isGraphPrimitiveDebugEnabled() {
|
|
@@ -16,9 +23,127 @@ function debugGraphPrimitiveFallback(message, context) {
|
|
|
16
23
|
}
|
|
17
24
|
console.debug(message, context ?? {});
|
|
18
25
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
26
|
+
|
|
27
|
+
// src/graphTypes.ts
|
|
28
|
+
function getNodeLayer(nodeType) {
|
|
29
|
+
const L4_TYPES = ["decision"];
|
|
30
|
+
const L3_TYPES = ["belief", "question", "theme", "deal"];
|
|
31
|
+
const L2_TYPES = ["claim", "evidence", "synthesis", "answer"];
|
|
32
|
+
const L1_TYPES = ["atomic_fact", "excerpt", "source"];
|
|
33
|
+
const ONTOLOGICAL_TYPES = [
|
|
34
|
+
"company",
|
|
35
|
+
"person",
|
|
36
|
+
"investor",
|
|
37
|
+
"function",
|
|
38
|
+
"value_chain"
|
|
39
|
+
];
|
|
40
|
+
const ORGANIZATIONAL_TYPES = ["topic"];
|
|
41
|
+
if (L4_TYPES.includes(nodeType)) {
|
|
42
|
+
return "L4";
|
|
43
|
+
}
|
|
44
|
+
if (L3_TYPES.includes(nodeType)) {
|
|
45
|
+
return "L3";
|
|
46
|
+
}
|
|
47
|
+
if (L2_TYPES.includes(nodeType)) {
|
|
48
|
+
return "L2";
|
|
49
|
+
}
|
|
50
|
+
if (L1_TYPES.includes(nodeType)) {
|
|
51
|
+
return "L1";
|
|
52
|
+
}
|
|
53
|
+
if (ONTOLOGICAL_TYPES.includes(nodeType)) {
|
|
54
|
+
return "ontological";
|
|
55
|
+
}
|
|
56
|
+
if (ORGANIZATIONAL_TYPES.includes(nodeType)) {
|
|
57
|
+
return "organizational";
|
|
58
|
+
}
|
|
59
|
+
console.warn(`[GraphTypes] Unknown nodeType "${nodeType}", defaulting to L2`);
|
|
60
|
+
return "L2";
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// src/edgeValidation.ts
|
|
64
|
+
function getLayerDepth(layer) {
|
|
65
|
+
switch (layer) {
|
|
66
|
+
case "L4":
|
|
67
|
+
return 4;
|
|
68
|
+
case "L3":
|
|
69
|
+
return 3;
|
|
70
|
+
case "L2":
|
|
71
|
+
return 2;
|
|
72
|
+
case "L1":
|
|
73
|
+
return 1;
|
|
74
|
+
case "ontological":
|
|
75
|
+
return 0;
|
|
76
|
+
default:
|
|
77
|
+
return -1;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
function shouldContinueTraversal(currentLayer, targetLayer, options) {
|
|
81
|
+
const currentDepth = getLayerDepth(currentLayer);
|
|
82
|
+
const targetDepth = getLayerDepth(targetLayer);
|
|
83
|
+
if (options.minLayer !== void 0 && targetDepth < options.minLayer) {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
if (options.maxLayer !== void 0 && targetDepth > options.maxLayer) {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
switch (options.mode) {
|
|
90
|
+
case "anchor_down":
|
|
91
|
+
return targetDepth <= currentDepth;
|
|
92
|
+
case "anchor_up":
|
|
93
|
+
return targetDepth >= currentDepth;
|
|
94
|
+
case "same_layer":
|
|
95
|
+
return targetDepth === currentDepth;
|
|
96
|
+
case "decision_trace":
|
|
97
|
+
return currentDepth === 4 ? targetDepth === 3 : targetDepth === currentDepth;
|
|
98
|
+
default:
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function getDefaultMinLayer(mode) {
|
|
103
|
+
switch (mode) {
|
|
104
|
+
case "anchor_down":
|
|
105
|
+
return 1;
|
|
106
|
+
case "anchor_up":
|
|
107
|
+
return 2;
|
|
108
|
+
case "same_layer":
|
|
109
|
+
return 1;
|
|
110
|
+
case "decision_trace":
|
|
111
|
+
return 3;
|
|
112
|
+
default:
|
|
113
|
+
return 1;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
function readOptionalString(value) {
|
|
117
|
+
return typeof value === "string" && value.trim().length > 0 ? value : void 0;
|
|
118
|
+
}
|
|
119
|
+
function readConvexId(value) {
|
|
120
|
+
const normalized = readOptionalString(value);
|
|
121
|
+
return normalized;
|
|
122
|
+
}
|
|
123
|
+
function readRecord(value) {
|
|
124
|
+
return value && typeof value === "object" && !Array.isArray(value) ? value : null;
|
|
125
|
+
}
|
|
126
|
+
function readWorkspaceScopedEdge(value) {
|
|
127
|
+
const record = readRecord(value);
|
|
128
|
+
if (!record) {
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
const id = readConvexId(record._id);
|
|
132
|
+
const edgeType = readOptionalString(record.edgeType);
|
|
133
|
+
if (!(id && edgeType)) {
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
const edge = { _id: id, edgeType };
|
|
137
|
+
const projectId = readOptionalString(record.projectId);
|
|
138
|
+
if (projectId !== void 0) {
|
|
139
|
+
edge.projectId = projectId;
|
|
140
|
+
}
|
|
141
|
+
const topicId = readOptionalString(record.topicId);
|
|
142
|
+
if (topicId !== void 0) {
|
|
143
|
+
edge.topicId = topicId;
|
|
144
|
+
}
|
|
145
|
+
return edge;
|
|
146
|
+
}
|
|
22
147
|
v.union(
|
|
23
148
|
v.literal("L4"),
|
|
24
149
|
v.literal("L3"),
|
|
@@ -113,7 +238,7 @@ var edgeTypeValidator = v.union(
|
|
|
113
238
|
v.literal("competes_with")
|
|
114
239
|
);
|
|
115
240
|
function edgeMatchesWorkspaceReasoningScope(edge, scope) {
|
|
116
|
-
return scope.topicId !== void 0 && edge.topicId === scope.topicId || scope.projectId !== void 0 && edge.projectId === scope.projectId;
|
|
241
|
+
return scope.topicId !== void 0 && edge.topicId === String(scope.topicId) || scope.projectId !== void 0 && (edge.projectId === scope.projectId || edge.topicId === scope.projectId);
|
|
117
242
|
}
|
|
118
243
|
async function collectScopedEdges(ctx, scope, scanLimit) {
|
|
119
244
|
const queries = [];
|
|
@@ -136,7 +261,11 @@ async function collectScopedEdges(ctx, scope, scanLimit) {
|
|
|
136
261
|
const seen = /* @__PURE__ */ new Set();
|
|
137
262
|
const deduped = [];
|
|
138
263
|
const flattened = (await Promise.all(queries)).flat();
|
|
139
|
-
for (const
|
|
264
|
+
for (const value of flattened) {
|
|
265
|
+
const edge = readWorkspaceScopedEdge(value);
|
|
266
|
+
if (!edge) {
|
|
267
|
+
continue;
|
|
268
|
+
}
|
|
140
269
|
const key = String(edge._id);
|
|
141
270
|
if (seen.has(key)) {
|
|
142
271
|
continue;
|
|
@@ -146,96 +275,6 @@ async function collectScopedEdges(ctx, scope, scanLimit) {
|
|
|
146
275
|
}
|
|
147
276
|
return deduped;
|
|
148
277
|
}
|
|
149
|
-
|
|
150
|
-
// src/graphTypes.ts
|
|
151
|
-
function getNodeLayer(nodeType) {
|
|
152
|
-
const L4_TYPES = ["decision"];
|
|
153
|
-
const L3_TYPES = ["belief", "question", "theme", "deal"];
|
|
154
|
-
const L2_TYPES = ["claim", "evidence", "synthesis", "answer"];
|
|
155
|
-
const L1_TYPES = ["atomic_fact", "excerpt", "source"];
|
|
156
|
-
const ONTOLOGICAL_TYPES = [
|
|
157
|
-
"company",
|
|
158
|
-
"person",
|
|
159
|
-
"investor",
|
|
160
|
-
"function",
|
|
161
|
-
"value_chain"
|
|
162
|
-
];
|
|
163
|
-
const ORGANIZATIONAL_TYPES = ["topic"];
|
|
164
|
-
if (L4_TYPES.includes(nodeType)) {
|
|
165
|
-
return "L4";
|
|
166
|
-
}
|
|
167
|
-
if (L3_TYPES.includes(nodeType)) {
|
|
168
|
-
return "L3";
|
|
169
|
-
}
|
|
170
|
-
if (L2_TYPES.includes(nodeType)) {
|
|
171
|
-
return "L2";
|
|
172
|
-
}
|
|
173
|
-
if (L1_TYPES.includes(nodeType)) {
|
|
174
|
-
return "L1";
|
|
175
|
-
}
|
|
176
|
-
if (ONTOLOGICAL_TYPES.includes(nodeType)) {
|
|
177
|
-
return "ontological";
|
|
178
|
-
}
|
|
179
|
-
if (ORGANIZATIONAL_TYPES.includes(nodeType)) {
|
|
180
|
-
return "organizational";
|
|
181
|
-
}
|
|
182
|
-
console.warn(`[GraphTypes] Unknown nodeType "${nodeType}", defaulting to L2`);
|
|
183
|
-
return "L2";
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
// src/edgeValidation.ts
|
|
187
|
-
function getLayerDepth(layer) {
|
|
188
|
-
switch (layer) {
|
|
189
|
-
case "L4":
|
|
190
|
-
return 4;
|
|
191
|
-
case "L3":
|
|
192
|
-
return 3;
|
|
193
|
-
case "L2":
|
|
194
|
-
return 2;
|
|
195
|
-
case "L1":
|
|
196
|
-
return 1;
|
|
197
|
-
case "ontological":
|
|
198
|
-
return 0;
|
|
199
|
-
default:
|
|
200
|
-
return -1;
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
function shouldContinueTraversal(currentLayer, targetLayer, options) {
|
|
204
|
-
const currentDepth = getLayerDepth(currentLayer);
|
|
205
|
-
const targetDepth = getLayerDepth(targetLayer);
|
|
206
|
-
if (options.minLayer !== void 0 && targetDepth < options.minLayer) {
|
|
207
|
-
return false;
|
|
208
|
-
}
|
|
209
|
-
if (options.maxLayer !== void 0 && targetDepth > options.maxLayer) {
|
|
210
|
-
return false;
|
|
211
|
-
}
|
|
212
|
-
switch (options.mode) {
|
|
213
|
-
case "anchor_down":
|
|
214
|
-
return targetDepth <= currentDepth;
|
|
215
|
-
case "anchor_up":
|
|
216
|
-
return targetDepth >= currentDepth;
|
|
217
|
-
case "same_layer":
|
|
218
|
-
return targetDepth === currentDepth;
|
|
219
|
-
case "decision_trace":
|
|
220
|
-
return currentDepth === 4 ? targetDepth === 3 : targetDepth === currentDepth;
|
|
221
|
-
default:
|
|
222
|
-
return true;
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
function getDefaultMinLayer(mode) {
|
|
226
|
-
switch (mode) {
|
|
227
|
-
case "anchor_down":
|
|
228
|
-
return 1;
|
|
229
|
-
case "anchor_up":
|
|
230
|
-
return 2;
|
|
231
|
-
case "same_layer":
|
|
232
|
-
return 1;
|
|
233
|
-
case "decision_trace":
|
|
234
|
-
return 3;
|
|
235
|
-
default:
|
|
236
|
-
return 1;
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
278
|
var LEGACY_SCOPE_FIELD = "graphScopeProjectId";
|
|
240
279
|
async function resolveTopicNodeScopeOrNull(ctx, ref) {
|
|
241
280
|
if (!ctx?.db || typeof ctx.db.query !== "function") {
|
|
@@ -270,13 +309,15 @@ function asMappedProjectId(topic) {
|
|
|
270
309
|
if (!topic) {
|
|
271
310
|
return;
|
|
272
311
|
}
|
|
273
|
-
const directLegacyProjectId = normalizeScopeValue(
|
|
312
|
+
const directLegacyProjectId = normalizeScopeValue(
|
|
313
|
+
topic[LEGACY_SCOPE_FIELD]
|
|
314
|
+
);
|
|
274
315
|
if (directLegacyProjectId) {
|
|
275
316
|
return directLegacyProjectId;
|
|
276
317
|
}
|
|
277
318
|
const metadata = topic.metadata || {};
|
|
278
319
|
const candidate = metadata[LEGACY_SCOPE_FIELD] || metadata.legacyProjectId || metadata.projectId || metadata.scopeProjectId;
|
|
279
|
-
return candidate ? candidate : void 0;
|
|
320
|
+
return typeof candidate === "string" ? normalizeScopeValue(candidate) : void 0;
|
|
280
321
|
}
|
|
281
322
|
function normalizeScopeValue(value) {
|
|
282
323
|
if (typeof value !== "string") {
|
|
@@ -301,8 +342,9 @@ function pickPrimaryTopic(candidates) {
|
|
|
301
342
|
})[0];
|
|
302
343
|
}
|
|
303
344
|
async function findTopicsByScopeAlias(ctx, scopeId) {
|
|
345
|
+
const query2 = ctx.db.query("topics");
|
|
304
346
|
try {
|
|
305
|
-
return await
|
|
347
|
+
return await query2.withIndex(
|
|
306
348
|
"by_graph_scope_project",
|
|
307
349
|
(q) => q.eq(LEGACY_SCOPE_FIELD, scopeId)
|
|
308
350
|
).collect();
|
|
@@ -314,7 +356,7 @@ async function findTopicsByScopeAlias(ctx, scopeId) {
|
|
|
314
356
|
scopeId
|
|
315
357
|
}
|
|
316
358
|
);
|
|
317
|
-
const topics = await
|
|
359
|
+
const topics = await query2.collect();
|
|
318
360
|
return topics.filter((topic) => {
|
|
319
361
|
const normalizedGlobalId = normalizeScopeValue(topic.globalId);
|
|
320
362
|
const mappedProjectId = asMappedProjectId(topic);
|
|
@@ -370,156 +412,455 @@ async function resolveInheritedWorkspaceScope(ctx, topic) {
|
|
|
370
412
|
let current = topic;
|
|
371
413
|
for (let i = 0; i < MAX_DEPTH && current?.parentTopicId; i++) {
|
|
372
414
|
current = await ctx.db.get(current.parentTopicId);
|
|
373
|
-
if (!current)
|
|
415
|
+
if (!current) {
|
|
416
|
+
break;
|
|
417
|
+
}
|
|
374
418
|
if (!tenantId) {
|
|
375
419
|
tenantId = normalizeScopeValue(current.tenantId);
|
|
376
420
|
}
|
|
377
421
|
if (!workspaceId) {
|
|
378
422
|
workspaceId = normalizeScopeValue(current.workspaceId);
|
|
379
423
|
}
|
|
380
|
-
if (tenantId && workspaceId)
|
|
424
|
+
if (tenantId && workspaceId) {
|
|
425
|
+
break;
|
|
426
|
+
}
|
|
381
427
|
}
|
|
382
428
|
return { tenantId, workspaceId };
|
|
383
429
|
}
|
|
384
430
|
async function resolveTopicProjectScope(ctx, args) {
|
|
385
431
|
if (args.topicId) {
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
}
|
|
432
|
+
return await resolveScopeFromTopicId(ctx, args.topicId);
|
|
433
|
+
}
|
|
434
|
+
if (args.projectId) {
|
|
435
|
+
return await resolveScopeFromLegacyProjectId(ctx, args.projectId);
|
|
436
|
+
}
|
|
437
|
+
throw new Error(
|
|
438
|
+
"Missing scope: provide topicId (preferred) or legacy projectId alias."
|
|
439
|
+
);
|
|
440
|
+
}
|
|
441
|
+
async function resolveScopeFromTopicId(ctx, topicId) {
|
|
442
|
+
const topic = await resolveTopicDocFromTopicId(ctx, topicId);
|
|
443
|
+
if (topic) {
|
|
444
|
+
return await buildTopicScope(ctx, topic, "topic");
|
|
445
|
+
}
|
|
446
|
+
const nodeScope = await resolveTopicNodeScopeOrNull(ctx, String(topicId));
|
|
447
|
+
if (nodeScope) {
|
|
448
|
+
return nodeScope;
|
|
449
|
+
}
|
|
450
|
+
throw new Error(`Topic not found: ${String(topicId)}`);
|
|
451
|
+
}
|
|
452
|
+
async function resolveTopicDocFromTopicId(ctx, topicId) {
|
|
453
|
+
const direct = await tryReadTopicDoc(ctx, topicId, {
|
|
454
|
+
failureLog: "[topicScope] Failed to load topic by direct id",
|
|
455
|
+
idLogKey: "topicId"
|
|
456
|
+
});
|
|
457
|
+
if (direct) {
|
|
458
|
+
return direct;
|
|
459
|
+
}
|
|
460
|
+
const hostTopic = await tryResolveHostTopicById(ctx, String(topicId));
|
|
461
|
+
if (hostTopic) {
|
|
462
|
+
return hostTopic;
|
|
463
|
+
}
|
|
464
|
+
return pickPrimaryTopic(await findTopicsByScopeAlias(ctx, String(topicId))) ?? null;
|
|
465
|
+
}
|
|
466
|
+
async function resolveScopeFromLegacyProjectId(ctx, legacyProjectId) {
|
|
467
|
+
const directTopic = await resolveDirectLegacyProjectTopic(
|
|
468
|
+
ctx,
|
|
469
|
+
legacyProjectId
|
|
470
|
+
);
|
|
471
|
+
if (directTopic) {
|
|
472
|
+
return await buildTopicScope(ctx, directTopic, "topic_inferred", {
|
|
473
|
+
fallbackProjectId: legacyProjectId
|
|
474
|
+
});
|
|
475
|
+
}
|
|
476
|
+
const primary = pickPrimaryTopic(
|
|
477
|
+
await findTopicsByScopeAlias(ctx, legacyProjectId)
|
|
478
|
+
);
|
|
479
|
+
if (primary) {
|
|
480
|
+
return await buildTopicScope(ctx, primary, "project_mapped_topic", {
|
|
481
|
+
fallbackProjectId: legacyProjectId
|
|
482
|
+
});
|
|
483
|
+
}
|
|
484
|
+
const nodeScope = await resolveTopicNodeScopeOrNull(ctx, legacyProjectId);
|
|
485
|
+
if (nodeScope) {
|
|
429
486
|
return {
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
workspaceId: inherited.workspaceId,
|
|
433
|
-
source: "topic"
|
|
487
|
+
...nodeScope,
|
|
488
|
+
projectId: nodeScope.projectId ?? legacyProjectId
|
|
434
489
|
};
|
|
435
490
|
}
|
|
436
|
-
|
|
437
|
-
|
|
491
|
+
throw new Error(
|
|
492
|
+
`Legacy project scope ${legacyProjectId} has no mapped topic.`
|
|
493
|
+
);
|
|
494
|
+
}
|
|
495
|
+
async function resolveDirectLegacyProjectTopic(ctx, legacyProjectId) {
|
|
496
|
+
const directTopic = await tryReadTopicDoc(ctx, legacyProjectId, {
|
|
497
|
+
failureLog: "[topicScope] Failed to load direct project topic",
|
|
498
|
+
idLogKey: "projectId"
|
|
499
|
+
});
|
|
500
|
+
return directTopic ?? tryResolveHostTopicByLegacyScope(ctx, legacyProjectId);
|
|
501
|
+
}
|
|
502
|
+
async function tryReadTopicDoc(ctx, id, log) {
|
|
503
|
+
try {
|
|
504
|
+
return await ctx.db.get(id);
|
|
505
|
+
} catch (error) {
|
|
506
|
+
debugGraphPrimitiveFallback(log.failureLog, {
|
|
507
|
+
error,
|
|
508
|
+
[log.idLogKey]: id
|
|
509
|
+
});
|
|
510
|
+
return null;
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
async function buildTopicScope(ctx, topic, source, options = {}) {
|
|
514
|
+
const inherited = await resolveInheritedWorkspaceScope(ctx, topic);
|
|
515
|
+
const mapped = asMappedProjectId(topic);
|
|
516
|
+
return {
|
|
517
|
+
topicId: topic._id,
|
|
518
|
+
...mapped || options.fallbackProjectId ? { projectId: mapped ?? options.fallbackProjectId } : {},
|
|
519
|
+
tenantId: inherited.tenantId,
|
|
520
|
+
workspaceId: inherited.workspaceId,
|
|
521
|
+
source
|
|
522
|
+
};
|
|
523
|
+
}
|
|
524
|
+
var optionalScopeArgs = {
|
|
525
|
+
projectId: v.optional(v.string()),
|
|
526
|
+
topicId: v.optional(v.string())
|
|
527
|
+
};
|
|
528
|
+
|
|
529
|
+
// src/epistemicEdges.queries.ts
|
|
530
|
+
var DERIVED_FROM_EDGE_TYPE = "derived_from";
|
|
531
|
+
var EPISTEMIC_LAYERS = /* @__PURE__ */ new Set([
|
|
532
|
+
"L4",
|
|
533
|
+
"L3",
|
|
534
|
+
"L2",
|
|
535
|
+
"L1",
|
|
536
|
+
"ontological",
|
|
537
|
+
"organizational"
|
|
538
|
+
]);
|
|
539
|
+
function readOptionalString2(value) {
|
|
540
|
+
return typeof value === "string" && value.trim().length > 0 ? value : void 0;
|
|
541
|
+
}
|
|
542
|
+
function readOptionalNumber(value) {
|
|
543
|
+
return typeof value === "number" && Number.isFinite(value) ? value : void 0;
|
|
544
|
+
}
|
|
545
|
+
function readConvexId2(value) {
|
|
546
|
+
const normalized = readOptionalString2(value);
|
|
547
|
+
return normalized;
|
|
548
|
+
}
|
|
549
|
+
function readRecord2(value) {
|
|
550
|
+
return value && typeof value === "object" && !Array.isArray(value) ? value : null;
|
|
551
|
+
}
|
|
552
|
+
function readEpistemicLayer(value) {
|
|
553
|
+
const layer = readOptionalString2(value);
|
|
554
|
+
return layer && EPISTEMIC_LAYERS.has(layer) ? layer : void 0;
|
|
555
|
+
}
|
|
556
|
+
function readEdgeNodeRow(value) {
|
|
557
|
+
const record = readRecord2(value);
|
|
558
|
+
if (!record) {
|
|
559
|
+
return null;
|
|
560
|
+
}
|
|
561
|
+
const id = readConvexId2(record._id);
|
|
562
|
+
const nodeType = readOptionalString2(record.nodeType);
|
|
563
|
+
if (!(id && nodeType)) {
|
|
564
|
+
return null;
|
|
565
|
+
}
|
|
566
|
+
const node = { ...record, _id: id, nodeType };
|
|
567
|
+
const globalId = readOptionalString2(record.globalId);
|
|
568
|
+
if (globalId !== void 0) {
|
|
569
|
+
node.globalId = globalId;
|
|
570
|
+
}
|
|
571
|
+
const epistemicLayer = readEpistemicLayer(record.epistemicLayer);
|
|
572
|
+
if (epistemicLayer !== void 0) {
|
|
573
|
+
node.epistemicLayer = epistemicLayer;
|
|
574
|
+
}
|
|
575
|
+
return node;
|
|
576
|
+
}
|
|
577
|
+
function readEdgeRow(value) {
|
|
578
|
+
const record = readRecord2(value);
|
|
579
|
+
if (!record) {
|
|
580
|
+
return null;
|
|
581
|
+
}
|
|
582
|
+
const id = readConvexId2(record._id);
|
|
583
|
+
const edgeType = readOptionalString2(record.edgeType);
|
|
584
|
+
if (!(id && edgeType)) {
|
|
585
|
+
return null;
|
|
586
|
+
}
|
|
587
|
+
const edge = { ...record, _id: id, edgeType };
|
|
588
|
+
const globalId = readOptionalString2(record.globalId);
|
|
589
|
+
if (globalId !== void 0) {
|
|
590
|
+
edge.globalId = globalId;
|
|
591
|
+
}
|
|
592
|
+
const fromNodeId = readOptionalString2(record.fromNodeId);
|
|
593
|
+
if (fromNodeId !== void 0) {
|
|
594
|
+
edge.fromNodeId = fromNodeId;
|
|
595
|
+
}
|
|
596
|
+
const toNodeId = readOptionalString2(record.toNodeId);
|
|
597
|
+
if (toNodeId !== void 0) {
|
|
598
|
+
edge.toNodeId = toNodeId;
|
|
599
|
+
}
|
|
600
|
+
const sourceGlobalId = readOptionalString2(record.sourceGlobalId);
|
|
601
|
+
if (sourceGlobalId !== void 0) {
|
|
602
|
+
edge.sourceGlobalId = sourceGlobalId;
|
|
603
|
+
}
|
|
604
|
+
const targetGlobalId = readOptionalString2(record.targetGlobalId);
|
|
605
|
+
if (targetGlobalId !== void 0) {
|
|
606
|
+
edge.targetGlobalId = targetGlobalId;
|
|
607
|
+
}
|
|
608
|
+
const fromGlobalId = readOptionalString2(record.fromGlobalId);
|
|
609
|
+
if (fromGlobalId !== void 0) {
|
|
610
|
+
edge.fromGlobalId = fromGlobalId;
|
|
611
|
+
}
|
|
612
|
+
const toGlobalId = readOptionalString2(record.toGlobalId);
|
|
613
|
+
if (toGlobalId !== void 0) {
|
|
614
|
+
edge.toGlobalId = toGlobalId;
|
|
615
|
+
}
|
|
616
|
+
const toLayer = readEpistemicLayer(record.toLayer);
|
|
617
|
+
if (toLayer !== void 0) {
|
|
618
|
+
edge.toLayer = toLayer;
|
|
619
|
+
}
|
|
620
|
+
const weight = readOptionalNumber(record.weight);
|
|
621
|
+
if (weight !== void 0) {
|
|
622
|
+
edge.weight = weight;
|
|
623
|
+
}
|
|
624
|
+
return edge;
|
|
625
|
+
}
|
|
626
|
+
function readEdgeRows(values) {
|
|
627
|
+
return values.flatMap((value) => {
|
|
628
|
+
const edge = readEdgeRow(value);
|
|
629
|
+
return edge ? [edge] : [];
|
|
630
|
+
});
|
|
631
|
+
}
|
|
632
|
+
function dedupeEdges(edges) {
|
|
633
|
+
const seen = /* @__PURE__ */ new Set();
|
|
634
|
+
const deduped = [];
|
|
635
|
+
for (const edge of edges) {
|
|
636
|
+
const key = String(edge._id);
|
|
637
|
+
if (seen.has(key)) {
|
|
638
|
+
continue;
|
|
639
|
+
}
|
|
640
|
+
seen.add(key);
|
|
641
|
+
deduped.push(edge);
|
|
642
|
+
}
|
|
643
|
+
return deduped;
|
|
644
|
+
}
|
|
645
|
+
function filterEdgesByType(edges, edgeType) {
|
|
646
|
+
return edgeType ? edges.filter((edge) => edge.edgeType === edgeType) : [...edges];
|
|
647
|
+
}
|
|
648
|
+
function nodeEndpointRefs(node) {
|
|
649
|
+
const refs = /* @__PURE__ */ new Set([String(node._id)]);
|
|
650
|
+
if (node.globalId) {
|
|
651
|
+
refs.add(node.globalId);
|
|
652
|
+
}
|
|
653
|
+
return [...refs];
|
|
654
|
+
}
|
|
655
|
+
function edgeSourceRefs(edge) {
|
|
656
|
+
return [edge.fromNodeId, edge.sourceGlobalId, edge.fromGlobalId].flatMap(
|
|
657
|
+
(value) => value ? [value] : []
|
|
658
|
+
);
|
|
659
|
+
}
|
|
660
|
+
function edgeTargetRefs(edge) {
|
|
661
|
+
return [edge.toNodeId, edge.targetGlobalId, edge.toGlobalId].flatMap(
|
|
662
|
+
(value) => value ? [value] : []
|
|
663
|
+
);
|
|
664
|
+
}
|
|
665
|
+
function primaryEdgeSourceRef(edge) {
|
|
666
|
+
return edge.sourceGlobalId ?? edge.fromGlobalId ?? edge.fromNodeId;
|
|
667
|
+
}
|
|
668
|
+
function primaryEdgeTargetRef(edge) {
|
|
669
|
+
return edge.targetGlobalId ?? edge.toGlobalId ?? edge.toNodeId;
|
|
670
|
+
}
|
|
671
|
+
function hasVisitedNode(node, visited) {
|
|
672
|
+
return nodeEndpointRefs(node).some((ref) => visited.has(ref));
|
|
673
|
+
}
|
|
674
|
+
function markVisitedNode(node, visited) {
|
|
675
|
+
for (const ref of nodeEndpointRefs(node)) {
|
|
676
|
+
visited.add(ref);
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
async function resolveNodeRefSoft(ctx, nodeRef) {
|
|
680
|
+
const normalizedId = ctx.db.normalizeId?.("epistemicNodes", nodeRef) ?? readConvexId2(nodeRef);
|
|
681
|
+
if (normalizedId) {
|
|
438
682
|
try {
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
683
|
+
const direct = readEdgeNodeRow(await ctx.db.get(normalizedId));
|
|
684
|
+
if (direct) {
|
|
685
|
+
return direct;
|
|
686
|
+
}
|
|
442
687
|
} catch (error) {
|
|
443
688
|
debugGraphPrimitiveFallback(
|
|
444
|
-
"[
|
|
445
|
-
{
|
|
446
|
-
error,
|
|
447
|
-
projectId: args.projectId
|
|
448
|
-
}
|
|
689
|
+
"[epistemicEdges] Direct node-ref lookup failed",
|
|
690
|
+
{ error, nodeRef }
|
|
449
691
|
);
|
|
450
692
|
}
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
directTopic = await tryResolveHostTopicByLegacyScope(ctx, args.projectId);
|
|
463
|
-
if (directTopic) {
|
|
464
|
-
const inherited = await resolveInheritedWorkspaceScope(ctx, directTopic);
|
|
465
|
-
const mapped = asMappedProjectId(directTopic);
|
|
466
|
-
return {
|
|
467
|
-
topicId: directTopic._id,
|
|
468
|
-
projectId: mapped ?? args.projectId,
|
|
469
|
-
tenantId: inherited.tenantId,
|
|
470
|
-
workspaceId: inherited.workspaceId,
|
|
471
|
-
source: "topic_inferred"
|
|
472
|
-
};
|
|
473
|
-
}
|
|
474
|
-
const topics = await findTopicsByScopeAlias(ctx, args.projectId);
|
|
475
|
-
const primary = pickPrimaryTopic(topics);
|
|
476
|
-
if (primary) {
|
|
477
|
-
const inherited = await resolveInheritedWorkspaceScope(ctx, primary);
|
|
478
|
-
return {
|
|
479
|
-
topicId: primary._id,
|
|
480
|
-
projectId: args.projectId,
|
|
481
|
-
tenantId: inherited.tenantId,
|
|
482
|
-
workspaceId: inherited.workspaceId,
|
|
483
|
-
source: "project_mapped_topic"
|
|
484
|
-
};
|
|
693
|
+
}
|
|
694
|
+
return readEdgeNodeRow(
|
|
695
|
+
await ctx.db.query("epistemicNodes").withIndex("by_globalId", (q) => q.eq("globalId", nodeRef)).first()
|
|
696
|
+
);
|
|
697
|
+
}
|
|
698
|
+
async function collectNodeReferenceIds(ctx, nodeRef) {
|
|
699
|
+
const refs = /* @__PURE__ */ new Set([nodeRef]);
|
|
700
|
+
const node = await resolveNodeRefSoft(ctx, nodeRef);
|
|
701
|
+
if (node) {
|
|
702
|
+
for (const ref of nodeEndpointRefs(node)) {
|
|
703
|
+
refs.add(ref);
|
|
485
704
|
}
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
705
|
+
}
|
|
706
|
+
return [...refs];
|
|
707
|
+
}
|
|
708
|
+
async function collectEdgesFromRefs(ctx, refs, edgeType) {
|
|
709
|
+
const reads = [];
|
|
710
|
+
for (const ref of refs) {
|
|
711
|
+
reads.push(
|
|
712
|
+
edgeType ? ctx.db.query("epistemicEdges").withIndex(
|
|
713
|
+
"by_from_type",
|
|
714
|
+
(q) => q.eq("fromNodeId", ref).eq("edgeType", edgeType)
|
|
715
|
+
).collect() : ctx.db.query("epistemicEdges").withIndex("by_from", (q) => q.eq("fromNodeId", ref)).collect(),
|
|
716
|
+
ctx.db.query("epistemicEdges").withIndex("by_source_global_id", (q) => q.eq("sourceGlobalId", ref)).collect()
|
|
717
|
+
);
|
|
718
|
+
}
|
|
719
|
+
const edges = readEdgeRows((await Promise.all(reads)).flat());
|
|
720
|
+
return dedupeEdges(filterEdgesByType(edges, edgeType));
|
|
721
|
+
}
|
|
722
|
+
async function collectEdgesToRefs(ctx, refs, edgeType) {
|
|
723
|
+
const reads = [];
|
|
724
|
+
for (const ref of refs) {
|
|
725
|
+
reads.push(
|
|
726
|
+
edgeType ? ctx.db.query("epistemicEdges").withIndex(
|
|
727
|
+
"by_to_type",
|
|
728
|
+
(q) => q.eq("toNodeId", ref).eq("edgeType", edgeType)
|
|
729
|
+
).collect() : ctx.db.query("epistemicEdges").withIndex("by_to", (q) => q.eq("toNodeId", ref)).collect(),
|
|
730
|
+
ctx.db.query("epistemicEdges").withIndex("by_target_global_id", (q) => q.eq("targetGlobalId", ref)).collect()
|
|
489
731
|
);
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
732
|
+
}
|
|
733
|
+
const edges = readEdgeRows((await Promise.all(reads)).flat());
|
|
734
|
+
return dedupeEdges(filterEdgesByType(edges, edgeType));
|
|
735
|
+
}
|
|
736
|
+
async function collectEdgesFromNodeRef(ctx, nodeRef, edgeType) {
|
|
737
|
+
return collectEdgesFromRefs(
|
|
738
|
+
ctx,
|
|
739
|
+
await collectNodeReferenceIds(ctx, nodeRef),
|
|
740
|
+
edgeType
|
|
741
|
+
);
|
|
742
|
+
}
|
|
743
|
+
async function collectEdgesToNodeRef(ctx, nodeRef, edgeType) {
|
|
744
|
+
return collectEdgesToRefs(
|
|
745
|
+
ctx,
|
|
746
|
+
await collectNodeReferenceIds(ctx, nodeRef),
|
|
747
|
+
edgeType
|
|
748
|
+
);
|
|
749
|
+
}
|
|
750
|
+
async function collectEdgesBetweenRefs(ctx, fromRefs, toRefs) {
|
|
751
|
+
const reads = [];
|
|
752
|
+
for (const fromRef of fromRefs) {
|
|
753
|
+
for (const toRef of toRefs) {
|
|
754
|
+
reads.push(
|
|
755
|
+
ctx.db.query("epistemicEdges").withIndex(
|
|
756
|
+
"by_from_to",
|
|
757
|
+
(q) => q.eq("fromNodeId", fromRef).eq("toNodeId", toRef)
|
|
758
|
+
).collect()
|
|
759
|
+
);
|
|
495
760
|
}
|
|
496
|
-
|
|
497
|
-
|
|
761
|
+
reads.push(
|
|
762
|
+
ctx.db.query("epistemicEdges").withIndex(
|
|
763
|
+
"by_source_global_id",
|
|
764
|
+
(q) => q.eq("sourceGlobalId", fromRef)
|
|
765
|
+
).collect()
|
|
498
766
|
);
|
|
499
767
|
}
|
|
500
|
-
|
|
501
|
-
|
|
768
|
+
for (const toRef of toRefs) {
|
|
769
|
+
reads.push(
|
|
770
|
+
ctx.db.query("epistemicEdges").withIndex("by_target_global_id", (q) => q.eq("targetGlobalId", toRef)).collect()
|
|
771
|
+
);
|
|
772
|
+
}
|
|
773
|
+
const fromRefSet = new Set(fromRefs);
|
|
774
|
+
const toRefSet = new Set(toRefs);
|
|
775
|
+
const edges = readEdgeRows((await Promise.all(reads)).flat()).filter(
|
|
776
|
+
(edge) => edgeSourceRefs(edge).some((ref) => fromRefSet.has(ref)) && edgeTargetRefs(edge).some((ref) => toRefSet.has(ref))
|
|
502
777
|
);
|
|
778
|
+
return dedupeEdges(edges);
|
|
779
|
+
}
|
|
780
|
+
async function collectEdgesBetweenNodeRefs(ctx, fromNodeRef, toNodeRef) {
|
|
781
|
+
const [fromRefs, toRefs] = await Promise.all([
|
|
782
|
+
collectNodeReferenceIds(ctx, fromNodeRef),
|
|
783
|
+
collectNodeReferenceIds(ctx, toNodeRef)
|
|
784
|
+
]);
|
|
785
|
+
return collectEdgesBetweenRefs(ctx, fromRefs, toRefs);
|
|
786
|
+
}
|
|
787
|
+
function buildLineageTraversalConfig(args) {
|
|
788
|
+
const mode = args.mode ?? "anchor_down";
|
|
789
|
+
return {
|
|
790
|
+
maxDepth: args.maxDepth ?? 10,
|
|
791
|
+
mode,
|
|
792
|
+
minLayer: args.minLayer ?? getDefaultMinLayer(mode),
|
|
793
|
+
maxLayer: args.maxLayer ?? 4
|
|
794
|
+
};
|
|
795
|
+
}
|
|
796
|
+
function buildLineageQueueSeed(node) {
|
|
797
|
+
return {
|
|
798
|
+
node,
|
|
799
|
+
depth: 0,
|
|
800
|
+
currentLayer: node.epistemicLayer ?? getNodeLayer(node.nodeType)
|
|
801
|
+
};
|
|
802
|
+
}
|
|
803
|
+
function shouldSkipLineageNode(item, state, visited) {
|
|
804
|
+
if (item.depth >= state.maxDepth) {
|
|
805
|
+
return true;
|
|
806
|
+
}
|
|
807
|
+
return hasVisitedNode(item.node, visited);
|
|
808
|
+
}
|
|
809
|
+
function resolveLineageTargetLayer(edge, targetNode) {
|
|
810
|
+
return edge.toLayer ?? targetNode.epistemicLayer ?? getNodeLayer(targetNode.nodeType);
|
|
811
|
+
}
|
|
812
|
+
function collectDerivedFromEdges(ctx, node) {
|
|
813
|
+
return collectEdgesFromRefs(
|
|
814
|
+
ctx,
|
|
815
|
+
nodeEndpointRefs(node),
|
|
816
|
+
DERIVED_FROM_EDGE_TYPE
|
|
817
|
+
);
|
|
818
|
+
}
|
|
819
|
+
function shouldAdvanceLineage(currentLayer, targetLayer, state) {
|
|
820
|
+
return shouldContinueTraversal(currentLayer, targetLayer, {
|
|
821
|
+
mode: state.mode,
|
|
822
|
+
minLayer: state.minLayer,
|
|
823
|
+
maxLayer: state.maxLayer
|
|
824
|
+
});
|
|
825
|
+
}
|
|
826
|
+
async function appendLineageEdges(ctx, current, state, lineage, queue, visited) {
|
|
827
|
+
const lineageEdges = await collectDerivedFromEdges(ctx, current.node);
|
|
828
|
+
for (const edge of lineageEdges) {
|
|
829
|
+
const targetRef = primaryEdgeTargetRef(edge);
|
|
830
|
+
if (!targetRef) {
|
|
831
|
+
continue;
|
|
832
|
+
}
|
|
833
|
+
const targetNode = await resolveNodeRefSoft(ctx, targetRef);
|
|
834
|
+
if (!targetNode || hasVisitedNode(targetNode, visited)) {
|
|
835
|
+
continue;
|
|
836
|
+
}
|
|
837
|
+
const targetLayer = resolveLineageTargetLayer(edge, targetNode);
|
|
838
|
+
if (!shouldAdvanceLineage(current.currentLayer, targetLayer, state)) {
|
|
839
|
+
continue;
|
|
840
|
+
}
|
|
841
|
+
const nextDepth = current.depth + 1;
|
|
842
|
+
lineage.push({
|
|
843
|
+
node: targetNode,
|
|
844
|
+
depth: nextDepth,
|
|
845
|
+
edgeType: edge.edgeType,
|
|
846
|
+
layer: targetLayer
|
|
847
|
+
});
|
|
848
|
+
queue.push({
|
|
849
|
+
node: targetNode,
|
|
850
|
+
depth: nextDepth,
|
|
851
|
+
currentLayer: targetLayer
|
|
852
|
+
});
|
|
853
|
+
}
|
|
503
854
|
}
|
|
504
|
-
var optionalScopeArgs = {
|
|
505
|
-
projectId: v.optional(v.string()),
|
|
506
|
-
topicId: v.optional(v.string())
|
|
507
|
-
};
|
|
508
|
-
|
|
509
|
-
// src/epistemicEdges.queries.ts
|
|
510
855
|
var get = query({
|
|
511
856
|
args: { edgeId: v.id("epistemicEdges") },
|
|
512
857
|
returns: permissiveReturn,
|
|
513
|
-
handler: async (ctx, args) =>
|
|
514
|
-
return await ctx.db.get(args.edgeId);
|
|
515
|
-
}
|
|
858
|
+
handler: async (ctx, args) => await ctx.db.get(args.edgeId)
|
|
516
859
|
});
|
|
517
860
|
var getByGlobalId = query({
|
|
518
861
|
args: { globalId: v.string() },
|
|
519
862
|
returns: permissiveReturn,
|
|
520
|
-
handler: async (ctx, args) =>
|
|
521
|
-
return await ctx.db.query("epistemicEdges").withIndex("by_globalId", (q) => q.eq("globalId", args.globalId)).first();
|
|
522
|
-
}
|
|
863
|
+
handler: async (ctx, args) => await ctx.db.query("epistemicEdges").withIndex("by_globalId", (q) => q.eq("globalId", args.globalId)).first()
|
|
523
864
|
});
|
|
524
865
|
var getFromNode = query({
|
|
525
866
|
args: {
|
|
@@ -527,16 +868,7 @@ var getFromNode = query({
|
|
|
527
868
|
edgeType: v.optional(edgeTypeValidator)
|
|
528
869
|
},
|
|
529
870
|
returns: permissiveReturn,
|
|
530
|
-
handler: async (ctx, args) =>
|
|
531
|
-
const { edgeType } = args;
|
|
532
|
-
if (edgeType) {
|
|
533
|
-
return await ctx.db.query("epistemicEdges").withIndex(
|
|
534
|
-
"by_from_type",
|
|
535
|
-
(q) => q.eq("fromNodeId", args.fromNodeId).eq("edgeType", edgeType)
|
|
536
|
-
).collect();
|
|
537
|
-
}
|
|
538
|
-
return await ctx.db.query("epistemicEdges").withIndex("by_from", (q) => q.eq("fromNodeId", args.fromNodeId)).collect();
|
|
539
|
-
}
|
|
871
|
+
handler: async (ctx, args) => await collectEdgesFromNodeRef(ctx, String(args.fromNodeId), args.edgeType)
|
|
540
872
|
});
|
|
541
873
|
var getToNode = query({
|
|
542
874
|
args: {
|
|
@@ -544,16 +876,7 @@ var getToNode = query({
|
|
|
544
876
|
edgeType: v.optional(edgeTypeValidator)
|
|
545
877
|
},
|
|
546
878
|
returns: permissiveReturn,
|
|
547
|
-
handler: async (ctx, args) =>
|
|
548
|
-
const { edgeType } = args;
|
|
549
|
-
if (edgeType) {
|
|
550
|
-
return await ctx.db.query("epistemicEdges").withIndex(
|
|
551
|
-
"by_to_type",
|
|
552
|
-
(q) => q.eq("toNodeId", args.toNodeId).eq("edgeType", edgeType)
|
|
553
|
-
).collect();
|
|
554
|
-
}
|
|
555
|
-
return await ctx.db.query("epistemicEdges").withIndex("by_to", (q) => q.eq("toNodeId", args.toNodeId)).collect();
|
|
556
|
-
}
|
|
879
|
+
handler: async (ctx, args) => await collectEdgesToNodeRef(ctx, String(args.toNodeId), args.edgeType)
|
|
557
880
|
});
|
|
558
881
|
var getBySourceNode = query({
|
|
559
882
|
args: {
|
|
@@ -561,27 +884,7 @@ var getBySourceNode = query({
|
|
|
561
884
|
edgeType: v.optional(v.string())
|
|
562
885
|
},
|
|
563
886
|
returns: permissiveReturn,
|
|
564
|
-
handler: async (ctx, args) =>
|
|
565
|
-
const isConvexId = args.sourceNodeId.length === 32 || args.sourceNodeId.includes("epistemicNodes");
|
|
566
|
-
if (isConvexId) {
|
|
567
|
-
const query2 = args.edgeType ? ctx.db.query("epistemicEdges").withIndex(
|
|
568
|
-
"by_from_type",
|
|
569
|
-
(q) => q.eq("fromNodeId", args.sourceNodeId).eq("edgeType", args.edgeType)
|
|
570
|
-
) : ctx.db.query("epistemicEdges").withIndex(
|
|
571
|
-
"by_from",
|
|
572
|
-
(q) => q.eq("fromNodeId", args.sourceNodeId)
|
|
573
|
-
);
|
|
574
|
-
return await query2.collect();
|
|
575
|
-
}
|
|
576
|
-
const byGlobalId = await ctx.db.query("epistemicEdges").withIndex(
|
|
577
|
-
"by_source_global_id",
|
|
578
|
-
(q) => q.eq("sourceGlobalId", args.sourceNodeId)
|
|
579
|
-
).collect();
|
|
580
|
-
if (args.edgeType) {
|
|
581
|
-
return byGlobalId.filter((edge) => edge.edgeType === args.edgeType);
|
|
582
|
-
}
|
|
583
|
-
return byGlobalId;
|
|
584
|
-
}
|
|
887
|
+
handler: async (ctx, args) => await collectEdgesFromNodeRef(ctx, args.sourceNodeId, args.edgeType)
|
|
585
888
|
});
|
|
586
889
|
var getByTargetNode = query({
|
|
587
890
|
args: {
|
|
@@ -589,27 +892,7 @@ var getByTargetNode = query({
|
|
|
589
892
|
edgeType: v.optional(v.string())
|
|
590
893
|
},
|
|
591
894
|
returns: permissiveReturn,
|
|
592
|
-
handler: async (ctx, args) =>
|
|
593
|
-
const isConvexId = args.targetNodeId.length === 32 || args.targetNodeId.includes("epistemicNodes");
|
|
594
|
-
if (isConvexId) {
|
|
595
|
-
const query2 = args.edgeType ? ctx.db.query("epistemicEdges").withIndex(
|
|
596
|
-
"by_to_type",
|
|
597
|
-
(q) => q.eq("toNodeId", args.targetNodeId).eq("edgeType", args.edgeType)
|
|
598
|
-
) : ctx.db.query("epistemicEdges").withIndex(
|
|
599
|
-
"by_to",
|
|
600
|
-
(q) => q.eq("toNodeId", args.targetNodeId)
|
|
601
|
-
);
|
|
602
|
-
return await query2.collect();
|
|
603
|
-
}
|
|
604
|
-
const byGlobalId = await ctx.db.query("epistemicEdges").withIndex(
|
|
605
|
-
"by_target_global_id",
|
|
606
|
-
(q) => q.eq("targetGlobalId", args.targetNodeId)
|
|
607
|
-
).collect();
|
|
608
|
-
if (args.edgeType) {
|
|
609
|
-
return byGlobalId.filter((edge) => edge.edgeType === args.edgeType);
|
|
610
|
-
}
|
|
611
|
-
return byGlobalId;
|
|
612
|
-
}
|
|
895
|
+
handler: async (ctx, args) => await collectEdgesToNodeRef(ctx, args.targetNodeId, args.edgeType)
|
|
613
896
|
});
|
|
614
897
|
var getBetween = query({
|
|
615
898
|
args: {
|
|
@@ -618,16 +901,14 @@ var getBetween = query({
|
|
|
618
901
|
edgeType: v.optional(edgeTypeValidator)
|
|
619
902
|
},
|
|
620
903
|
returns: permissiveReturn,
|
|
621
|
-
handler: async (ctx, args) =>
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
(
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
return edges;
|
|
630
|
-
}
|
|
904
|
+
handler: async (ctx, args) => filterEdgesByType(
|
|
905
|
+
await collectEdgesBetweenNodeRefs(
|
|
906
|
+
ctx,
|
|
907
|
+
String(args.fromNodeId),
|
|
908
|
+
String(args.toNodeId)
|
|
909
|
+
),
|
|
910
|
+
args.edgeType
|
|
911
|
+
)
|
|
631
912
|
});
|
|
632
913
|
var getByNodes = query({
|
|
633
914
|
args: {
|
|
@@ -635,12 +916,11 @@ var getByNodes = query({
|
|
|
635
916
|
toNodeId: v.id("epistemicNodes")
|
|
636
917
|
},
|
|
637
918
|
returns: permissiveReturn,
|
|
638
|
-
handler: async (ctx, args) =>
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
}
|
|
919
|
+
handler: async (ctx, args) => (await collectEdgesBetweenNodeRefs(
|
|
920
|
+
ctx,
|
|
921
|
+
String(args.fromNodeId),
|
|
922
|
+
String(args.toNodeId)
|
|
923
|
+
))[0] ?? null
|
|
644
924
|
});
|
|
645
925
|
var getByProjectAndType = query({
|
|
646
926
|
args: {
|
|
@@ -649,7 +929,7 @@ var getByProjectAndType = query({
|
|
|
649
929
|
},
|
|
650
930
|
returns: permissiveReturn,
|
|
651
931
|
handler: async (ctx, args) => {
|
|
652
|
-
if (!args.projectId
|
|
932
|
+
if (!(args.projectId || args.topicId)) {
|
|
653
933
|
return [];
|
|
654
934
|
}
|
|
655
935
|
let scope;
|
|
@@ -683,7 +963,7 @@ var getByProject = query({
|
|
|
683
963
|
},
|
|
684
964
|
returns: permissiveReturn,
|
|
685
965
|
handler: async (ctx, args) => {
|
|
686
|
-
if (!args.projectId
|
|
966
|
+
if (!(args.projectId || args.topicId)) {
|
|
687
967
|
return [];
|
|
688
968
|
}
|
|
689
969
|
let scope;
|
|
@@ -741,10 +1021,11 @@ var findContradictions = query({
|
|
|
741
1021
|
},
|
|
742
1022
|
returns: permissiveReturn,
|
|
743
1023
|
handler: async (ctx, args) => {
|
|
744
|
-
const edges = await
|
|
745
|
-
|
|
746
|
-
(
|
|
747
|
-
|
|
1024
|
+
const edges = await collectEdgesToNodeRef(
|
|
1025
|
+
ctx,
|
|
1026
|
+
String(args.nodeId),
|
|
1027
|
+
"informs"
|
|
1028
|
+
);
|
|
748
1029
|
return edges.filter((e) => (e.weight ?? 0) < 0);
|
|
749
1030
|
}
|
|
750
1031
|
});
|
|
@@ -754,10 +1035,11 @@ var findSupport = query({
|
|
|
754
1035
|
},
|
|
755
1036
|
returns: permissiveReturn,
|
|
756
1037
|
handler: async (ctx, args) => {
|
|
757
|
-
const edges = await
|
|
758
|
-
|
|
759
|
-
(
|
|
760
|
-
|
|
1038
|
+
const edges = await collectEdgesToNodeRef(
|
|
1039
|
+
ctx,
|
|
1040
|
+
String(args.nodeId),
|
|
1041
|
+
"informs"
|
|
1042
|
+
);
|
|
761
1043
|
return edges.filter((e) => (e.weight ?? 0) >= 0);
|
|
762
1044
|
}
|
|
763
1045
|
});
|
|
@@ -780,59 +1062,29 @@ var getLineage = query({
|
|
|
780
1062
|
},
|
|
781
1063
|
returns: permissiveReturn,
|
|
782
1064
|
handler: async (ctx, args) => {
|
|
783
|
-
const
|
|
784
|
-
const mode = args.mode ?? "anchor_down";
|
|
785
|
-
const minLayer = args.minLayer ?? getDefaultMinLayer(mode);
|
|
786
|
-
const maxLayer = args.maxLayer ?? 4;
|
|
1065
|
+
const traversalState = buildLineageTraversalConfig(args);
|
|
787
1066
|
const lineage = [];
|
|
1067
|
+
const queue = [];
|
|
788
1068
|
const visited = /* @__PURE__ */ new Set();
|
|
789
|
-
const startNode = await ctx.db.get(args.nodeId);
|
|
1069
|
+
const startNode = readEdgeNodeRow(await ctx.db.get(args.nodeId));
|
|
790
1070
|
if (!startNode) {
|
|
791
1071
|
return lineage;
|
|
792
1072
|
}
|
|
793
|
-
|
|
794
|
-
const queue = [{ nodeId: args.nodeId, depth: 0, currentLayer: startLayer }];
|
|
1073
|
+
queue.push(buildLineageQueueSeed(startNode));
|
|
795
1074
|
while (queue.length > 0) {
|
|
796
1075
|
const current = queue.shift();
|
|
797
|
-
if (!current || current
|
|
798
|
-
continue;
|
|
799
|
-
}
|
|
800
|
-
const nodeIdStr = current.nodeId.toString();
|
|
801
|
-
if (visited.has(nodeIdStr)) {
|
|
1076
|
+
if (!current || shouldSkipLineageNode(current, traversalState, visited)) {
|
|
802
1077
|
continue;
|
|
803
1078
|
}
|
|
804
|
-
visited
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
continue;
|
|
814
|
-
}
|
|
815
|
-
const targetLayer = edge.toLayer || targetNode.epistemicLayer || getNodeLayer(targetNode.nodeType);
|
|
816
|
-
const shouldContinue = shouldContinueTraversal(
|
|
817
|
-
current.currentLayer,
|
|
818
|
-
targetLayer,
|
|
819
|
-
{ mode, minLayer, maxLayer }
|
|
820
|
-
);
|
|
821
|
-
if (!shouldContinue) {
|
|
822
|
-
continue;
|
|
823
|
-
}
|
|
824
|
-
lineage.push({
|
|
825
|
-
node: targetNode,
|
|
826
|
-
depth: current.depth + 1,
|
|
827
|
-
edgeType: edge.edgeType,
|
|
828
|
-
layer: targetLayer
|
|
829
|
-
});
|
|
830
|
-
queue.push({
|
|
831
|
-
nodeId: edge.toNodeId,
|
|
832
|
-
depth: current.depth + 1,
|
|
833
|
-
currentLayer: targetLayer
|
|
834
|
-
});
|
|
835
|
-
}
|
|
1079
|
+
markVisitedNode(current.node, visited);
|
|
1080
|
+
await appendLineageEdges(
|
|
1081
|
+
ctx,
|
|
1082
|
+
current,
|
|
1083
|
+
traversalState,
|
|
1084
|
+
lineage,
|
|
1085
|
+
queue,
|
|
1086
|
+
visited
|
|
1087
|
+
);
|
|
836
1088
|
}
|
|
837
1089
|
return lineage;
|
|
838
1090
|
}
|
|
@@ -843,25 +1095,34 @@ var getEvidenceForBelief = query({
|
|
|
843
1095
|
},
|
|
844
1096
|
returns: permissiveReturn,
|
|
845
1097
|
handler: async (ctx, args) => {
|
|
846
|
-
const informsEdges = await
|
|
847
|
-
|
|
848
|
-
(
|
|
849
|
-
|
|
1098
|
+
const informsEdges = await collectEdgesToNodeRef(
|
|
1099
|
+
ctx,
|
|
1100
|
+
String(args.beliefNodeId),
|
|
1101
|
+
"informs"
|
|
1102
|
+
);
|
|
850
1103
|
const supportEdges = informsEdges.filter((e) => (e.weight ?? 0) >= 0);
|
|
851
1104
|
const contradictEdges = informsEdges.filter((e) => (e.weight ?? 0) < 0);
|
|
852
1105
|
const supportingEvidence = await Promise.all(
|
|
853
|
-
supportEdges.map(async (edge) =>
|
|
854
|
-
edge
|
|
855
|
-
|
|
856
|
-
|
|
1106
|
+
supportEdges.map(async (edge) => {
|
|
1107
|
+
const sourceRef = primaryEdgeSourceRef(edge);
|
|
1108
|
+
return {
|
|
1109
|
+
edge,
|
|
1110
|
+
node: sourceRef ? await resolveNodeRefSoft(ctx, sourceRef) : null
|
|
1111
|
+
};
|
|
1112
|
+
})
|
|
857
1113
|
);
|
|
858
1114
|
const contradictingEvidence = await Promise.all(
|
|
859
|
-
contradictEdges.map(async (edge) =>
|
|
860
|
-
edge
|
|
861
|
-
|
|
862
|
-
|
|
1115
|
+
contradictEdges.map(async (edge) => {
|
|
1116
|
+
const sourceRef = primaryEdgeSourceRef(edge);
|
|
1117
|
+
return {
|
|
1118
|
+
edge,
|
|
1119
|
+
node: sourceRef ? await resolveNodeRefSoft(ctx, sourceRef) : null
|
|
1120
|
+
};
|
|
1121
|
+
})
|
|
1122
|
+
);
|
|
1123
|
+
const filteredSupporting = supportingEvidence.filter(
|
|
1124
|
+
(e) => e.node !== null
|
|
863
1125
|
);
|
|
864
|
-
const filteredSupporting = supportingEvidence.filter((e) => e.node !== null);
|
|
865
1126
|
const filteredContradicting = contradictingEvidence.filter(
|
|
866
1127
|
(e) => e.node !== null
|
|
867
1128
|
);
|
|
@@ -882,11 +1143,22 @@ var getClusterEdges = query({
|
|
|
882
1143
|
if (args.beliefIds.length === 0) {
|
|
883
1144
|
return [];
|
|
884
1145
|
}
|
|
885
|
-
const beliefIdSet = new Set(
|
|
886
|
-
const
|
|
1146
|
+
const beliefIdSet = /* @__PURE__ */ new Set();
|
|
1147
|
+
for (const beliefId of args.beliefIds) {
|
|
1148
|
+
for (const ref of await collectNodeReferenceIds(ctx, beliefId)) {
|
|
1149
|
+
beliefIdSet.add(ref);
|
|
1150
|
+
}
|
|
1151
|
+
}
|
|
1152
|
+
const allEdges = readEdgeRows(
|
|
1153
|
+
await ctx.db.query("epistemicEdges").collect()
|
|
1154
|
+
);
|
|
887
1155
|
return allEdges.filter((edge) => {
|
|
888
|
-
const fromInCluster =
|
|
889
|
-
|
|
1156
|
+
const fromInCluster = edgeSourceRefs(edge).some(
|
|
1157
|
+
(ref) => beliefIdSet.has(ref)
|
|
1158
|
+
);
|
|
1159
|
+
const toInCluster = edgeTargetRefs(edge).some(
|
|
1160
|
+
(ref) => beliefIdSet.has(ref)
|
|
1161
|
+
);
|
|
890
1162
|
return fromInCluster && toInCluster;
|
|
891
1163
|
});
|
|
892
1164
|
}
|