@lucern/graph-primitives 1.0.29 → 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 +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,10 +1,14 @@
|
|
|
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/epistemicNodes.queries.ts
|
|
7
|
-
var
|
|
8
|
+
var unsafeApi = unsafeConvexAnyApi(
|
|
9
|
+
"graph-primitives top-level module bundle lacks a committed Convex _generated/api surface"
|
|
10
|
+
);
|
|
11
|
+
var api = unsafeApi;
|
|
8
12
|
componentsGeneric();
|
|
9
13
|
var query = queryGeneric;
|
|
10
14
|
|
|
@@ -19,6 +23,153 @@ function debugGraphPrimitiveFallback(message, context) {
|
|
|
19
23
|
}
|
|
20
24
|
console.debug(message, context ?? {});
|
|
21
25
|
}
|
|
26
|
+
|
|
27
|
+
// src/epistemicNodes.helpers.ts
|
|
28
|
+
var DEFAULT_NODE_PAGE_SIZE = 250;
|
|
29
|
+
var MAX_NODE_PAGE_SIZE = 8e3;
|
|
30
|
+
function clampNodeLimit(limit, fallback = DEFAULT_NODE_PAGE_SIZE) {
|
|
31
|
+
if (!Number.isFinite(limit)) {
|
|
32
|
+
return fallback;
|
|
33
|
+
}
|
|
34
|
+
return Math.max(1, Math.min(Math.floor(limit), MAX_NODE_PAGE_SIZE));
|
|
35
|
+
}
|
|
36
|
+
function dedupeWorkspaceNodes(nodes) {
|
|
37
|
+
const seen = /* @__PURE__ */ new Set();
|
|
38
|
+
const deduped = [];
|
|
39
|
+
for (const node of nodes) {
|
|
40
|
+
const key = String(node._id);
|
|
41
|
+
if (seen.has(key)) {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
seen.add(key);
|
|
45
|
+
deduped.push(node);
|
|
46
|
+
}
|
|
47
|
+
return deduped;
|
|
48
|
+
}
|
|
49
|
+
function nodeMatchesWorkspaceReasoningScope(node, scope) {
|
|
50
|
+
return scope.topicId !== void 0 && node.topicId === scope.topicId || scope.projectId !== void 0 && node.projectId === scope.projectId;
|
|
51
|
+
}
|
|
52
|
+
async function collectScopedNodes(ctx, scope, args) {
|
|
53
|
+
const queries = [];
|
|
54
|
+
if (scope.topicId) {
|
|
55
|
+
queries.push(
|
|
56
|
+
args.nodeType ? ctx.db.query("epistemicNodes").withIndex(
|
|
57
|
+
"by_topic_type",
|
|
58
|
+
(q) => q.eq("topicId", scope.topicId).eq("nodeType", args.nodeType)
|
|
59
|
+
).order("desc").take(args.scanLimit) : ctx.db.query("epistemicNodes").withIndex("by_topic", (q) => q.eq("topicId", scope.topicId)).order("desc").take(args.scanLimit)
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
if (scope.projectId && !scope.topicId) {
|
|
63
|
+
queries.push(
|
|
64
|
+
args.nodeType ? ctx.db.query("epistemicNodes").withIndex(
|
|
65
|
+
"by_topic_type",
|
|
66
|
+
(q) => q.eq("topicId", scope.projectId).eq("nodeType", args.nodeType)
|
|
67
|
+
).order("desc").take(args.scanLimit) : ctx.db.query("epistemicNodes").withIndex("by_topic", (q) => q.eq("topicId", scope.projectId)).order("desc").take(args.scanLimit)
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
const combined = dedupeWorkspaceNodes((await Promise.all(queries)).flat());
|
|
71
|
+
return combined.filter(
|
|
72
|
+
(node) => nodeMatchesWorkspaceReasoningScope(node, scope)
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
v.union(
|
|
76
|
+
v.literal("L4"),
|
|
77
|
+
v.literal("L3"),
|
|
78
|
+
v.literal("L2"),
|
|
79
|
+
v.literal("L1"),
|
|
80
|
+
v.literal("ontological"),
|
|
81
|
+
v.literal("organizational")
|
|
82
|
+
);
|
|
83
|
+
v.union(v.literal("decision"));
|
|
84
|
+
v.union(
|
|
85
|
+
v.literal("belief"),
|
|
86
|
+
v.literal("question"),
|
|
87
|
+
v.literal("theme"),
|
|
88
|
+
v.literal("deal")
|
|
89
|
+
);
|
|
90
|
+
v.union(
|
|
91
|
+
v.literal("claim"),
|
|
92
|
+
v.literal("evidence"),
|
|
93
|
+
v.literal("synthesis")
|
|
94
|
+
);
|
|
95
|
+
v.union(
|
|
96
|
+
v.literal("atomic_fact"),
|
|
97
|
+
v.literal("excerpt"),
|
|
98
|
+
v.literal("source")
|
|
99
|
+
);
|
|
100
|
+
v.union(
|
|
101
|
+
// L4: Audit targets
|
|
102
|
+
v.literal("decision"),
|
|
103
|
+
// L3: Traversal anchors
|
|
104
|
+
v.literal("belief"),
|
|
105
|
+
v.literal("question"),
|
|
106
|
+
v.literal("theme"),
|
|
107
|
+
v.literal("deal"),
|
|
108
|
+
// L2: Compression boundary
|
|
109
|
+
v.literal("claim"),
|
|
110
|
+
v.literal("evidence"),
|
|
111
|
+
v.literal("synthesis"),
|
|
112
|
+
v.literal("answer"),
|
|
113
|
+
// L1: Terminal leaves
|
|
114
|
+
v.literal("atomic_fact"),
|
|
115
|
+
v.literal("excerpt"),
|
|
116
|
+
v.literal("source")
|
|
117
|
+
);
|
|
118
|
+
v.union(
|
|
119
|
+
v.literal("company"),
|
|
120
|
+
v.literal("person"),
|
|
121
|
+
v.literal("investor"),
|
|
122
|
+
v.literal("function"),
|
|
123
|
+
v.literal("value_chain")
|
|
124
|
+
);
|
|
125
|
+
v.union(v.literal("topic"));
|
|
126
|
+
var nodeTypeValidator = v.union(
|
|
127
|
+
// L4: Audit targets
|
|
128
|
+
v.literal("decision"),
|
|
129
|
+
// L3: Traversal anchors
|
|
130
|
+
v.literal("belief"),
|
|
131
|
+
v.literal("question"),
|
|
132
|
+
v.literal("theme"),
|
|
133
|
+
v.literal("deal"),
|
|
134
|
+
// L2: Compression boundary
|
|
135
|
+
v.literal("claim"),
|
|
136
|
+
v.literal("evidence"),
|
|
137
|
+
v.literal("synthesis"),
|
|
138
|
+
v.literal("answer"),
|
|
139
|
+
// L1: Terminal leaves
|
|
140
|
+
v.literal("atomic_fact"),
|
|
141
|
+
v.literal("excerpt"),
|
|
142
|
+
v.literal("source"),
|
|
143
|
+
// Ontological
|
|
144
|
+
v.literal("company"),
|
|
145
|
+
v.literal("person"),
|
|
146
|
+
v.literal("investor"),
|
|
147
|
+
v.literal("function"),
|
|
148
|
+
v.literal("value_chain"),
|
|
149
|
+
// Organizational
|
|
150
|
+
v.literal("topic")
|
|
151
|
+
);
|
|
152
|
+
v.union(
|
|
153
|
+
v.literal("human"),
|
|
154
|
+
v.literal("ai_extracted"),
|
|
155
|
+
v.literal("ai_generated"),
|
|
156
|
+
v.literal("imported"),
|
|
157
|
+
v.literal("system")
|
|
158
|
+
// System-generated (migrations, classifiers)
|
|
159
|
+
);
|
|
160
|
+
var statusValidator = v.union(
|
|
161
|
+
v.literal("active"),
|
|
162
|
+
v.literal("superseded"),
|
|
163
|
+
v.literal("archived"),
|
|
164
|
+
v.literal("deleted")
|
|
165
|
+
);
|
|
166
|
+
v.union(
|
|
167
|
+
v.literal("unverified"),
|
|
168
|
+
v.literal("human_verified"),
|
|
169
|
+
v.literal("ai_verified"),
|
|
170
|
+
v.literal("contradicted"),
|
|
171
|
+
v.literal("outdated")
|
|
172
|
+
);
|
|
22
173
|
var LEGACY_SCOPE_FIELD = "graphScopeProjectId";
|
|
23
174
|
async function resolveTopicNodeScopeOrNull(ctx, ref) {
|
|
24
175
|
if (!ctx?.db || typeof ctx.db.query !== "function") {
|
|
@@ -53,13 +204,15 @@ function asMappedProjectId(topic) {
|
|
|
53
204
|
if (!topic) {
|
|
54
205
|
return;
|
|
55
206
|
}
|
|
56
|
-
const directLegacyProjectId = normalizeScopeValue(
|
|
207
|
+
const directLegacyProjectId = normalizeScopeValue(
|
|
208
|
+
topic[LEGACY_SCOPE_FIELD]
|
|
209
|
+
);
|
|
57
210
|
if (directLegacyProjectId) {
|
|
58
211
|
return directLegacyProjectId;
|
|
59
212
|
}
|
|
60
213
|
const metadata = topic.metadata || {};
|
|
61
214
|
const candidate = metadata[LEGACY_SCOPE_FIELD] || metadata.legacyProjectId || metadata.projectId || metadata.scopeProjectId;
|
|
62
|
-
return candidate ? candidate : void 0;
|
|
215
|
+
return typeof candidate === "string" ? normalizeScopeValue(candidate) : void 0;
|
|
63
216
|
}
|
|
64
217
|
function normalizeScopeValue(value) {
|
|
65
218
|
if (typeof value !== "string") {
|
|
@@ -84,8 +237,9 @@ function pickPrimaryTopic(candidates) {
|
|
|
84
237
|
})[0];
|
|
85
238
|
}
|
|
86
239
|
async function findTopicsByScopeAlias(ctx, scopeId) {
|
|
240
|
+
const query2 = ctx.db.query("topics");
|
|
87
241
|
try {
|
|
88
|
-
return await
|
|
242
|
+
return await query2.withIndex(
|
|
89
243
|
"by_graph_scope_project",
|
|
90
244
|
(q) => q.eq(LEGACY_SCOPE_FIELD, scopeId)
|
|
91
245
|
).collect();
|
|
@@ -97,7 +251,7 @@ async function findTopicsByScopeAlias(ctx, scopeId) {
|
|
|
97
251
|
scopeId
|
|
98
252
|
}
|
|
99
253
|
);
|
|
100
|
-
const topics = await
|
|
254
|
+
const topics = await query2.collect();
|
|
101
255
|
return topics.filter((topic) => {
|
|
102
256
|
const normalizedGlobalId = normalizeScopeValue(topic.globalId);
|
|
103
257
|
const mappedProjectId = asMappedProjectId(topic);
|
|
@@ -153,311 +307,163 @@ async function resolveInheritedWorkspaceScope(ctx, topic) {
|
|
|
153
307
|
let current = topic;
|
|
154
308
|
for (let i = 0; i < MAX_DEPTH && current?.parentTopicId; i++) {
|
|
155
309
|
current = await ctx.db.get(current.parentTopicId);
|
|
156
|
-
if (!current)
|
|
310
|
+
if (!current) {
|
|
311
|
+
break;
|
|
312
|
+
}
|
|
157
313
|
if (!tenantId) {
|
|
158
314
|
tenantId = normalizeScopeValue(current.tenantId);
|
|
159
315
|
}
|
|
160
316
|
if (!workspaceId) {
|
|
161
317
|
workspaceId = normalizeScopeValue(current.workspaceId);
|
|
162
318
|
}
|
|
163
|
-
if (tenantId && workspaceId)
|
|
319
|
+
if (tenantId && workspaceId) {
|
|
320
|
+
break;
|
|
321
|
+
}
|
|
164
322
|
}
|
|
165
323
|
return { tenantId, workspaceId };
|
|
166
324
|
}
|
|
167
325
|
async function resolveTopicProjectScope(ctx, args) {
|
|
168
326
|
if (args.topicId) {
|
|
169
|
-
|
|
170
|
-
try {
|
|
171
|
-
topic = await ctx.db.get(
|
|
172
|
-
args.topicId
|
|
173
|
-
);
|
|
174
|
-
} catch (error) {
|
|
175
|
-
debugGraphPrimitiveFallback(
|
|
176
|
-
"[topicScope] Failed to load topic by direct id",
|
|
177
|
-
{
|
|
178
|
-
error,
|
|
179
|
-
topicId: args.topicId
|
|
180
|
-
}
|
|
181
|
-
);
|
|
182
|
-
}
|
|
183
|
-
if (!topic) {
|
|
184
|
-
topic = await tryResolveHostTopicById(ctx, String(args.topicId));
|
|
185
|
-
}
|
|
186
|
-
if (!topic) {
|
|
187
|
-
topic = pickPrimaryTopic(
|
|
188
|
-
await findTopicsByScopeAlias(ctx, String(args.topicId))
|
|
189
|
-
) ?? null;
|
|
190
|
-
}
|
|
191
|
-
if (!topic) {
|
|
192
|
-
const nodeScope = await resolveTopicNodeScopeOrNull(
|
|
193
|
-
ctx,
|
|
194
|
-
String(args.topicId)
|
|
195
|
-
);
|
|
196
|
-
if (nodeScope) {
|
|
197
|
-
return nodeScope;
|
|
198
|
-
}
|
|
199
|
-
throw new Error(`Topic not found: ${String(args.topicId)}`);
|
|
200
|
-
}
|
|
201
|
-
const inherited = await resolveInheritedWorkspaceScope(ctx, topic);
|
|
202
|
-
const mapped = asMappedProjectId(topic);
|
|
203
|
-
if (mapped) {
|
|
204
|
-
return {
|
|
205
|
-
topicId: topic._id,
|
|
206
|
-
projectId: mapped,
|
|
207
|
-
tenantId: inherited.tenantId,
|
|
208
|
-
workspaceId: inherited.workspaceId,
|
|
209
|
-
source: "topic"
|
|
210
|
-
};
|
|
211
|
-
}
|
|
212
|
-
return {
|
|
213
|
-
topicId: topic._id,
|
|
214
|
-
tenantId: inherited.tenantId,
|
|
215
|
-
workspaceId: inherited.workspaceId,
|
|
216
|
-
source: "topic"
|
|
217
|
-
};
|
|
327
|
+
return await resolveScopeFromTopicId(ctx, args.topicId);
|
|
218
328
|
}
|
|
219
329
|
if (args.projectId) {
|
|
220
|
-
|
|
221
|
-
try {
|
|
222
|
-
directTopic = await ctx.db.get(
|
|
223
|
-
args.projectId
|
|
224
|
-
);
|
|
225
|
-
} catch (error) {
|
|
226
|
-
debugGraphPrimitiveFallback(
|
|
227
|
-
"[topicScope] Failed to load direct project topic",
|
|
228
|
-
{
|
|
229
|
-
error,
|
|
230
|
-
projectId: args.projectId
|
|
231
|
-
}
|
|
232
|
-
);
|
|
233
|
-
}
|
|
234
|
-
if (directTopic) {
|
|
235
|
-
const inherited = await resolveInheritedWorkspaceScope(ctx, directTopic);
|
|
236
|
-
const mapped = asMappedProjectId(directTopic);
|
|
237
|
-
return {
|
|
238
|
-
topicId: directTopic._id,
|
|
239
|
-
projectId: mapped ?? args.projectId,
|
|
240
|
-
tenantId: inherited.tenantId,
|
|
241
|
-
workspaceId: inherited.workspaceId,
|
|
242
|
-
source: "topic_inferred"
|
|
243
|
-
};
|
|
244
|
-
}
|
|
245
|
-
directTopic = await tryResolveHostTopicByLegacyScope(ctx, args.projectId);
|
|
246
|
-
if (directTopic) {
|
|
247
|
-
const inherited = await resolveInheritedWorkspaceScope(ctx, directTopic);
|
|
248
|
-
const mapped = asMappedProjectId(directTopic);
|
|
249
|
-
return {
|
|
250
|
-
topicId: directTopic._id,
|
|
251
|
-
projectId: mapped ?? args.projectId,
|
|
252
|
-
tenantId: inherited.tenantId,
|
|
253
|
-
workspaceId: inherited.workspaceId,
|
|
254
|
-
source: "topic_inferred"
|
|
255
|
-
};
|
|
256
|
-
}
|
|
257
|
-
const topics = await findTopicsByScopeAlias(ctx, args.projectId);
|
|
258
|
-
const primary = pickPrimaryTopic(topics);
|
|
259
|
-
if (primary) {
|
|
260
|
-
const inherited = await resolveInheritedWorkspaceScope(ctx, primary);
|
|
261
|
-
return {
|
|
262
|
-
topicId: primary._id,
|
|
263
|
-
projectId: args.projectId,
|
|
264
|
-
tenantId: inherited.tenantId,
|
|
265
|
-
workspaceId: inherited.workspaceId,
|
|
266
|
-
source: "project_mapped_topic"
|
|
267
|
-
};
|
|
268
|
-
}
|
|
269
|
-
const nodeScope = await resolveTopicNodeScopeOrNull(
|
|
270
|
-
ctx,
|
|
271
|
-
String(args.projectId)
|
|
272
|
-
);
|
|
273
|
-
if (nodeScope) {
|
|
274
|
-
return {
|
|
275
|
-
...nodeScope,
|
|
276
|
-
projectId: nodeScope.projectId ?? String(args.projectId)
|
|
277
|
-
};
|
|
278
|
-
}
|
|
279
|
-
throw new Error(
|
|
280
|
-
`Legacy project scope ${String(args.projectId)} has no mapped topic.`
|
|
281
|
-
);
|
|
330
|
+
return await resolveScopeFromLegacyProjectId(ctx, args.projectId);
|
|
282
331
|
}
|
|
283
332
|
throw new Error(
|
|
284
333
|
"Missing scope: provide topicId (preferred) or legacy projectId alias."
|
|
285
334
|
);
|
|
286
335
|
}
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
// src/epistemicNodes.helpers.ts
|
|
293
|
-
var DEFAULT_NODE_PAGE_SIZE = 250;
|
|
294
|
-
var MAX_NODE_PAGE_SIZE = 8e3;
|
|
295
|
-
function clampNodeLimit(limit, fallback = DEFAULT_NODE_PAGE_SIZE) {
|
|
296
|
-
if (!Number.isFinite(limit)) {
|
|
297
|
-
return fallback;
|
|
336
|
+
async function resolveScopeFromTopicId(ctx, topicId) {
|
|
337
|
+
const topic = await resolveTopicDocFromTopicId(ctx, topicId);
|
|
338
|
+
if (topic) {
|
|
339
|
+
return await buildTopicScope(ctx, topic, "topic");
|
|
298
340
|
}
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
const seen = /* @__PURE__ */ new Set();
|
|
303
|
-
const deduped = [];
|
|
304
|
-
for (const node of nodes) {
|
|
305
|
-
const key = String(node._id);
|
|
306
|
-
if (seen.has(key)) {
|
|
307
|
-
continue;
|
|
308
|
-
}
|
|
309
|
-
seen.add(key);
|
|
310
|
-
deduped.push(node);
|
|
341
|
+
const nodeScope = await resolveTopicNodeScopeOrNull(ctx, String(topicId));
|
|
342
|
+
if (nodeScope) {
|
|
343
|
+
return nodeScope;
|
|
311
344
|
}
|
|
312
|
-
|
|
345
|
+
throw new Error(`Topic not found: ${String(topicId)}`);
|
|
313
346
|
}
|
|
314
|
-
function
|
|
315
|
-
|
|
347
|
+
async function resolveTopicDocFromTopicId(ctx, topicId) {
|
|
348
|
+
const direct = await tryReadTopicDoc(ctx, topicId, {
|
|
349
|
+
failureLog: "[topicScope] Failed to load topic by direct id",
|
|
350
|
+
idLogKey: "topicId"
|
|
351
|
+
});
|
|
352
|
+
if (direct) {
|
|
353
|
+
return direct;
|
|
354
|
+
}
|
|
355
|
+
const hostTopic = await tryResolveHostTopicById(ctx, String(topicId));
|
|
356
|
+
if (hostTopic) {
|
|
357
|
+
return hostTopic;
|
|
358
|
+
}
|
|
359
|
+
return pickPrimaryTopic(await findTopicsByScopeAlias(ctx, String(topicId))) ?? null;
|
|
316
360
|
}
|
|
317
|
-
async function
|
|
318
|
-
const
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
);
|
|
361
|
+
async function resolveScopeFromLegacyProjectId(ctx, legacyProjectId) {
|
|
362
|
+
const directTopic = await resolveDirectLegacyProjectTopic(
|
|
363
|
+
ctx,
|
|
364
|
+
legacyProjectId
|
|
365
|
+
);
|
|
366
|
+
if (directTopic) {
|
|
367
|
+
return await buildTopicScope(ctx, directTopic, "topic_inferred", {
|
|
368
|
+
fallbackProjectId: legacyProjectId
|
|
369
|
+
});
|
|
326
370
|
}
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
);
|
|
371
|
+
const primary = pickPrimaryTopic(
|
|
372
|
+
await findTopicsByScopeAlias(ctx, legacyProjectId)
|
|
373
|
+
);
|
|
374
|
+
if (primary) {
|
|
375
|
+
return await buildTopicScope(ctx, primary, "project_mapped_topic", {
|
|
376
|
+
fallbackProjectId: legacyProjectId
|
|
377
|
+
});
|
|
334
378
|
}
|
|
335
|
-
const
|
|
336
|
-
|
|
337
|
-
|
|
379
|
+
const nodeScope = await resolveTopicNodeScopeOrNull(ctx, legacyProjectId);
|
|
380
|
+
if (nodeScope) {
|
|
381
|
+
return {
|
|
382
|
+
...nodeScope,
|
|
383
|
+
projectId: nodeScope.projectId ?? legacyProjectId
|
|
384
|
+
};
|
|
385
|
+
}
|
|
386
|
+
throw new Error(
|
|
387
|
+
`Legacy project scope ${legacyProjectId} has no mapped topic.`
|
|
338
388
|
);
|
|
339
389
|
}
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
)
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
);
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
);
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
v.
|
|
371
|
-
v.
|
|
372
|
-
|
|
373
|
-
// L2: Compression boundary
|
|
374
|
-
v.literal("claim"),
|
|
375
|
-
v.literal("evidence"),
|
|
376
|
-
v.literal("synthesis"),
|
|
377
|
-
v.literal("answer"),
|
|
378
|
-
// L1: Terminal leaves
|
|
379
|
-
v.literal("atomic_fact"),
|
|
380
|
-
v.literal("excerpt"),
|
|
381
|
-
v.literal("source")
|
|
382
|
-
);
|
|
383
|
-
v.union(
|
|
384
|
-
v.literal("company"),
|
|
385
|
-
v.literal("person"),
|
|
386
|
-
v.literal("investor"),
|
|
387
|
-
v.literal("function"),
|
|
388
|
-
v.literal("value_chain")
|
|
389
|
-
);
|
|
390
|
-
v.union(v.literal("topic"));
|
|
391
|
-
var nodeTypeValidator = v.union(
|
|
392
|
-
// L4: Audit targets
|
|
393
|
-
v.literal("decision"),
|
|
394
|
-
// L3: Traversal anchors
|
|
395
|
-
v.literal("belief"),
|
|
396
|
-
v.literal("question"),
|
|
397
|
-
v.literal("theme"),
|
|
398
|
-
v.literal("deal"),
|
|
399
|
-
// L2: Compression boundary
|
|
400
|
-
v.literal("claim"),
|
|
401
|
-
v.literal("evidence"),
|
|
402
|
-
v.literal("synthesis"),
|
|
403
|
-
v.literal("answer"),
|
|
404
|
-
// L1: Terminal leaves
|
|
405
|
-
v.literal("atomic_fact"),
|
|
406
|
-
v.literal("excerpt"),
|
|
407
|
-
v.literal("source"),
|
|
408
|
-
// Ontological
|
|
409
|
-
v.literal("company"),
|
|
410
|
-
v.literal("person"),
|
|
411
|
-
v.literal("investor"),
|
|
412
|
-
v.literal("function"),
|
|
413
|
-
v.literal("value_chain"),
|
|
414
|
-
// Organizational
|
|
415
|
-
v.literal("topic")
|
|
416
|
-
);
|
|
417
|
-
v.union(
|
|
418
|
-
v.literal("human"),
|
|
419
|
-
v.literal("ai_extracted"),
|
|
420
|
-
v.literal("ai_generated"),
|
|
421
|
-
v.literal("imported"),
|
|
422
|
-
v.literal("system")
|
|
423
|
-
// System-generated (migrations, classifiers)
|
|
424
|
-
);
|
|
425
|
-
var statusValidator = v.union(
|
|
426
|
-
v.literal("active"),
|
|
427
|
-
v.literal("superseded"),
|
|
428
|
-
v.literal("archived"),
|
|
429
|
-
v.literal("deleted")
|
|
430
|
-
);
|
|
431
|
-
v.union(
|
|
432
|
-
v.literal("unverified"),
|
|
433
|
-
v.literal("human_verified"),
|
|
434
|
-
v.literal("ai_verified"),
|
|
435
|
-
v.literal("contradicted"),
|
|
436
|
-
v.literal("outdated")
|
|
437
|
-
);
|
|
390
|
+
async function resolveDirectLegacyProjectTopic(ctx, legacyProjectId) {
|
|
391
|
+
const directTopic = await tryReadTopicDoc(ctx, legacyProjectId, {
|
|
392
|
+
failureLog: "[topicScope] Failed to load direct project topic",
|
|
393
|
+
idLogKey: "projectId"
|
|
394
|
+
});
|
|
395
|
+
return directTopic ?? tryResolveHostTopicByLegacyScope(ctx, legacyProjectId);
|
|
396
|
+
}
|
|
397
|
+
async function tryReadTopicDoc(ctx, id, log) {
|
|
398
|
+
try {
|
|
399
|
+
return await ctx.db.get(id);
|
|
400
|
+
} catch (error) {
|
|
401
|
+
debugGraphPrimitiveFallback(log.failureLog, {
|
|
402
|
+
error,
|
|
403
|
+
[log.idLogKey]: id
|
|
404
|
+
});
|
|
405
|
+
return null;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
async function buildTopicScope(ctx, topic, source, options = {}) {
|
|
409
|
+
const inherited = await resolveInheritedWorkspaceScope(ctx, topic);
|
|
410
|
+
const mapped = asMappedProjectId(topic);
|
|
411
|
+
return {
|
|
412
|
+
topicId: topic._id,
|
|
413
|
+
...mapped || options.fallbackProjectId ? { projectId: mapped ?? options.fallbackProjectId } : {},
|
|
414
|
+
tenantId: inherited.tenantId,
|
|
415
|
+
workspaceId: inherited.workspaceId,
|
|
416
|
+
source
|
|
417
|
+
};
|
|
418
|
+
}
|
|
419
|
+
var optionalScopeArgs = {
|
|
420
|
+
projectId: v.optional(v.string()),
|
|
421
|
+
topicId: v.optional(v.string())
|
|
422
|
+
};
|
|
438
423
|
|
|
439
424
|
// src/epistemicNodes.queries.ts
|
|
440
425
|
var optionalNodeScopeArgs = optionalScopeArgs;
|
|
426
|
+
function asEpistemicNodesQueryCtx(ctx) {
|
|
427
|
+
return ctx;
|
|
428
|
+
}
|
|
429
|
+
function isInScope(node, scope) {
|
|
430
|
+
return nodeMatchesWorkspaceReasoningScope(node, scope);
|
|
431
|
+
}
|
|
432
|
+
function isStatus(status) {
|
|
433
|
+
return (node) => node.status === status;
|
|
434
|
+
}
|
|
435
|
+
function isStatusInScope(status, scope) {
|
|
436
|
+
return (node) => isStatus(status)(node) && isInScope(node, scope);
|
|
437
|
+
}
|
|
438
|
+
function isNotDeletedInScope(scope) {
|
|
439
|
+
return (node) => node.status !== "deleted" && isInScope(node, scope);
|
|
440
|
+
}
|
|
441
|
+
function toLiteNode(node) {
|
|
442
|
+
return {
|
|
443
|
+
_id: node._id,
|
|
444
|
+
globalId: node.globalId,
|
|
445
|
+
nodeType: node.nodeType,
|
|
446
|
+
createdBy: node.createdBy,
|
|
447
|
+
topicId: node.topicId,
|
|
448
|
+
projectId: node.projectId,
|
|
449
|
+
status: node.status,
|
|
450
|
+
epistemicLayer: node.epistemicLayer
|
|
451
|
+
};
|
|
452
|
+
}
|
|
441
453
|
var get = query({
|
|
442
454
|
args: { nodeId: v.id("epistemicNodes") },
|
|
443
455
|
returns: permissiveReturn,
|
|
444
|
-
handler: async (ctx, args) =>
|
|
445
|
-
return await ctx.db.get(args.nodeId);
|
|
446
|
-
}
|
|
456
|
+
handler: async (ctx, args) => await asEpistemicNodesQueryCtx(ctx).db.get(args.nodeId)
|
|
447
457
|
});
|
|
448
458
|
var getByGlobalId = query({
|
|
449
459
|
args: { globalId: v.string() },
|
|
450
460
|
returns: permissiveReturn,
|
|
451
|
-
handler: async (ctx, args) =>
|
|
452
|
-
return await ctx.db.query("epistemicNodes").withIndex("by_globalId", (q) => q.eq("globalId", args.globalId)).first();
|
|
453
|
-
}
|
|
461
|
+
handler: async (ctx, args) => await asEpistemicNodesQueryCtx(ctx).db.query("epistemicNodes").withIndex("by_globalId", (q) => q.eq("globalId", args.globalId)).first()
|
|
454
462
|
});
|
|
455
463
|
var getByContentHash = query({
|
|
456
464
|
args: { contentHash: v.string() },
|
|
457
465
|
returns: permissiveReturn,
|
|
458
|
-
handler: async (ctx, args) =>
|
|
459
|
-
return await ctx.db.query("epistemicNodes").withIndex("by_contentHash", (q) => q.eq("contentHash", args.contentHash)).collect();
|
|
460
|
-
}
|
|
466
|
+
handler: async (ctx, args) => await asEpistemicNodesQueryCtx(ctx).db.query("epistemicNodes").withIndex("by_contentHash", (q) => q.eq("contentHash", args.contentHash)).collect()
|
|
461
467
|
});
|
|
462
468
|
var getByProjectAndType = query({
|
|
463
469
|
args: {
|
|
@@ -468,12 +474,13 @@ var getByProjectAndType = query({
|
|
|
468
474
|
},
|
|
469
475
|
returns: permissiveReturn,
|
|
470
476
|
handler: async (ctx, args) => {
|
|
471
|
-
if (!args.projectId
|
|
477
|
+
if (!(args.projectId || args.topicId)) {
|
|
472
478
|
return [];
|
|
473
479
|
}
|
|
480
|
+
const queryCtx = asEpistemicNodesQueryCtx(ctx);
|
|
474
481
|
let scope;
|
|
475
482
|
try {
|
|
476
|
-
scope = await resolveTopicProjectScope(
|
|
483
|
+
scope = await resolveTopicProjectScope(queryCtx, {
|
|
477
484
|
projectId: args.projectId,
|
|
478
485
|
topicId: args.topicId
|
|
479
486
|
});
|
|
@@ -490,18 +497,14 @@ var getByProjectAndType = query({
|
|
|
490
497
|
}
|
|
491
498
|
const pageSize = clampNodeLimit(args.limit);
|
|
492
499
|
const scanLimit = Math.min(pageSize * 3, MAX_NODE_PAGE_SIZE);
|
|
493
|
-
const nodes = await collectScopedNodes(
|
|
500
|
+
const nodes = await collectScopedNodes(queryCtx, scope, {
|
|
494
501
|
nodeType: args.nodeType,
|
|
495
502
|
scanLimit
|
|
496
503
|
});
|
|
497
504
|
if (args.status) {
|
|
498
|
-
return nodes.filter(
|
|
499
|
-
(n) => n.status === args.status && nodeMatchesWorkspaceReasoningScope(n, scope)
|
|
500
|
-
).slice(0, pageSize);
|
|
505
|
+
return nodes.filter(isStatusInScope(args.status, scope)).slice(0, pageSize);
|
|
501
506
|
}
|
|
502
|
-
return nodes.filter(
|
|
503
|
-
(n) => n.status === "active" && nodeMatchesWorkspaceReasoningScope(n, scope)
|
|
504
|
-
).slice(0, pageSize);
|
|
507
|
+
return nodes.filter(isStatusInScope("active", scope)).slice(0, pageSize);
|
|
505
508
|
}
|
|
506
509
|
});
|
|
507
510
|
var getByProjectAndTypeLite = query({
|
|
@@ -513,12 +516,13 @@ var getByProjectAndTypeLite = query({
|
|
|
513
516
|
},
|
|
514
517
|
returns: permissiveReturn,
|
|
515
518
|
handler: async (ctx, args) => {
|
|
516
|
-
if (!args.projectId
|
|
519
|
+
if (!(args.projectId || args.topicId)) {
|
|
517
520
|
return [];
|
|
518
521
|
}
|
|
522
|
+
const queryCtx = asEpistemicNodesQueryCtx(ctx);
|
|
519
523
|
let scope;
|
|
520
524
|
try {
|
|
521
|
-
scope = await resolveTopicProjectScope(
|
|
525
|
+
scope = await resolveTopicProjectScope(queryCtx, {
|
|
522
526
|
projectId: args.projectId,
|
|
523
527
|
topicId: args.topicId
|
|
524
528
|
});
|
|
@@ -535,23 +539,14 @@ var getByProjectAndTypeLite = query({
|
|
|
535
539
|
}
|
|
536
540
|
const pageSize = clampNodeLimit(args.limit);
|
|
537
541
|
const scanLimit = Math.min(pageSize * 3, MAX_NODE_PAGE_SIZE);
|
|
538
|
-
const
|
|
542
|
+
const nodeQuery = queryCtx.db.query("epistemicNodes").withIndex(
|
|
539
543
|
"by_topic_type",
|
|
540
544
|
(q) => q.eq("topicId", scope.topicId).eq("nodeType", args.nodeType)
|
|
541
545
|
);
|
|
542
|
-
const nodes = await
|
|
543
|
-
const statusFiltered = args.status ? nodes.filter((
|
|
546
|
+
const nodes = await nodeQuery.order("desc").take(scanLimit);
|
|
547
|
+
const statusFiltered = args.status ? nodes.filter(isStatus(args.status)) : nodes.filter(isStatus("active"));
|
|
544
548
|
const capped = statusFiltered.slice(0, pageSize);
|
|
545
|
-
return capped.map(
|
|
546
|
-
_id: n._id,
|
|
547
|
-
globalId: n.globalId,
|
|
548
|
-
nodeType: n.nodeType,
|
|
549
|
-
createdBy: n.createdBy,
|
|
550
|
-
topicId: n.topicId,
|
|
551
|
-
projectId: n.projectId,
|
|
552
|
-
status: n.status,
|
|
553
|
-
epistemicLayer: n.epistemicLayer
|
|
554
|
-
}));
|
|
549
|
+
return capped.map(toLiteNode);
|
|
555
550
|
}
|
|
556
551
|
});
|
|
557
552
|
var getByProject = query({
|
|
@@ -563,23 +558,27 @@ var getByProject = query({
|
|
|
563
558
|
},
|
|
564
559
|
returns: permissiveReturn,
|
|
565
560
|
handler: async (ctx, args) => {
|
|
566
|
-
if (!args.projectId
|
|
561
|
+
if (!(args.projectId || args.topicId)) {
|
|
567
562
|
return [];
|
|
568
563
|
}
|
|
564
|
+
const queryCtx = asEpistemicNodesQueryCtx(ctx);
|
|
569
565
|
const pageSize = clampNodeLimit(args.limit);
|
|
570
566
|
const scanLimit = Math.min(pageSize * 3, MAX_NODE_PAGE_SIZE);
|
|
571
567
|
let scope;
|
|
572
568
|
try {
|
|
573
|
-
scope = await resolveTopicProjectScope(
|
|
569
|
+
scope = await resolveTopicProjectScope(queryCtx, {
|
|
574
570
|
projectId: args.projectId,
|
|
575
571
|
topicId: args.topicId
|
|
576
572
|
});
|
|
577
573
|
} catch (error) {
|
|
578
|
-
debugGraphPrimitiveFallback(
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
574
|
+
debugGraphPrimitiveFallback(
|
|
575
|
+
"[epistemicNodes] Failed to resolve list scope",
|
|
576
|
+
{
|
|
577
|
+
error,
|
|
578
|
+
projectId: args.projectId,
|
|
579
|
+
topicId: args.topicId
|
|
580
|
+
}
|
|
581
|
+
);
|
|
583
582
|
return [];
|
|
584
583
|
}
|
|
585
584
|
if (args.userId) {
|
|
@@ -592,15 +591,11 @@ var getByProject = query({
|
|
|
592
591
|
return [];
|
|
593
592
|
}
|
|
594
593
|
}
|
|
595
|
-
const nodes = await collectScopedNodes(
|
|
594
|
+
const nodes = await collectScopedNodes(queryCtx, scope, { scanLimit });
|
|
596
595
|
if (args.includeArchived) {
|
|
597
|
-
return nodes.filter(
|
|
598
|
-
(n) => n.status !== "deleted" && nodeMatchesWorkspaceReasoningScope(n, scope)
|
|
599
|
-
).slice(0, pageSize);
|
|
596
|
+
return nodes.filter(isNotDeletedInScope(scope)).slice(0, pageSize);
|
|
600
597
|
}
|
|
601
|
-
return nodes.filter(
|
|
602
|
-
(n) => n.status === "active" && nodeMatchesWorkspaceReasoningScope(n, scope)
|
|
603
|
-
).slice(0, pageSize);
|
|
598
|
+
return nodes.filter(isStatusInScope("active", scope)).slice(0, pageSize);
|
|
604
599
|
}
|
|
605
600
|
});
|
|
606
601
|
var listAll = query({
|
|
@@ -609,10 +604,11 @@ var listAll = query({
|
|
|
609
604
|
},
|
|
610
605
|
returns: permissiveReturn,
|
|
611
606
|
handler: async (ctx, args) => {
|
|
607
|
+
const queryCtx = asEpistemicNodesQueryCtx(ctx);
|
|
612
608
|
const pageSize = clampNodeLimit(args.limit ?? 2e3);
|
|
613
609
|
const scanLimit = Math.min(pageSize * 2, MAX_NODE_PAGE_SIZE * 2);
|
|
614
|
-
const nodes = await
|
|
615
|
-
return nodes.filter((
|
|
610
|
+
const nodes = await queryCtx.db.query("epistemicNodes").order("desc").take(scanLimit);
|
|
611
|
+
return nodes.filter(isStatus("active")).slice(0, pageSize);
|
|
616
612
|
}
|
|
617
613
|
});
|
|
618
614
|
var search = query({
|
|
@@ -624,11 +620,12 @@ var search = query({
|
|
|
624
620
|
},
|
|
625
621
|
returns: permissiveReturn,
|
|
626
622
|
handler: async (ctx, args) => {
|
|
623
|
+
const queryCtx = asEpistemicNodesQueryCtx(ctx);
|
|
627
624
|
const pageSize = clampNodeLimit(args.limit, 100);
|
|
628
625
|
let scope;
|
|
629
626
|
if (args.projectId || args.topicId) {
|
|
630
627
|
try {
|
|
631
|
-
scope = await resolveTopicProjectScope(
|
|
628
|
+
scope = await resolveTopicProjectScope(queryCtx, {
|
|
632
629
|
projectId: args.projectId,
|
|
633
630
|
topicId: args.topicId
|
|
634
631
|
});
|
|
@@ -644,7 +641,7 @@ var search = query({
|
|
|
644
641
|
return [];
|
|
645
642
|
}
|
|
646
643
|
}
|
|
647
|
-
const searchResults =
|
|
644
|
+
const searchResults = queryCtx.db.query("epistemicNodes").withSearchIndex("search_canonicalText", (q) => {
|
|
648
645
|
let search2 = q.search("canonicalText", args.searchQuery);
|
|
649
646
|
if (scope?.topicId) {
|
|
650
647
|
search2 = search2.eq("topicId", scope.topicId);
|