@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
package/dist/entityBridge.js
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
|
-
import { v } from 'convex/values';
|
|
2
1
|
import { getCurrentUserId } from '@lucern/access-control/auth';
|
|
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, mutationGeneric } from 'convex/server';
|
|
5
6
|
|
|
6
7
|
// src/entityBridge.ts
|
|
8
|
+
var unsafeApi = unsafeConvexAnyApi(
|
|
9
|
+
"graph-primitives top-level module bundle lacks a committed Convex _generated/api surface"
|
|
10
|
+
);
|
|
7
11
|
componentsGeneric();
|
|
8
|
-
var internal =
|
|
12
|
+
var internal = unsafeApi;
|
|
9
13
|
var mutation = mutationGeneric;
|
|
10
14
|
var query = queryGeneric;
|
|
11
15
|
|
|
@@ -46,6 +50,14 @@ function getNodeLayer(nodeType) {
|
|
|
46
50
|
}
|
|
47
51
|
|
|
48
52
|
// src/edgeValidation.ts
|
|
53
|
+
var VALID_LAYER_CONNECTIONS = {
|
|
54
|
+
ontological: /* @__PURE__ */ new Set(["ontological", "L1", "L2", "L3"]),
|
|
55
|
+
L1: /* @__PURE__ */ new Set(["L1", "L2"]),
|
|
56
|
+
L2: /* @__PURE__ */ new Set(["L1", "L2", "L3", "ontological"]),
|
|
57
|
+
L3: /* @__PURE__ */ new Set(["L2", "L3", "L4", "ontological", "organizational"]),
|
|
58
|
+
L4: /* @__PURE__ */ new Set(["L3", "L4"]),
|
|
59
|
+
organizational: /* @__PURE__ */ new Set(["organizational", "L3"])
|
|
60
|
+
};
|
|
49
61
|
function getLayerDepth(layer) {
|
|
50
62
|
switch (layer) {
|
|
51
63
|
case "L4":
|
|
@@ -63,37 +75,13 @@ function getLayerDepth(layer) {
|
|
|
63
75
|
}
|
|
64
76
|
}
|
|
65
77
|
function isValidLayerConnection(fromLayer, toLayer) {
|
|
66
|
-
if (fromLayer
|
|
67
|
-
return
|
|
68
|
-
}
|
|
69
|
-
if (fromLayer === "ontological" && toLayer === "ontological") {
|
|
70
|
-
return true;
|
|
71
|
-
}
|
|
72
|
-
if (fromLayer === "ontological" && (toLayer === "L3" || toLayer === "L2" || toLayer === "L1")) {
|
|
73
|
-
return true;
|
|
74
|
-
}
|
|
75
|
-
if ((fromLayer === "L3" || fromLayer === "L2" || fromLayer === "L1") && toLayer === "ontological") {
|
|
76
|
-
return true;
|
|
77
|
-
}
|
|
78
|
-
if (fromLayer === "L2" && toLayer === "L1") {
|
|
79
|
-
return true;
|
|
80
|
-
}
|
|
81
|
-
if (fromLayer === "L2" && toLayer === "L3") {
|
|
82
|
-
return true;
|
|
83
|
-
}
|
|
84
|
-
if (fromLayer === "L3" && toLayer === "L2") {
|
|
85
|
-
return true;
|
|
86
|
-
}
|
|
87
|
-
if (fromLayer === "L3" && toLayer === "L4") {
|
|
88
|
-
return true;
|
|
89
|
-
}
|
|
90
|
-
if (fromLayer === "L4" && toLayer === "L3") {
|
|
91
|
-
return true;
|
|
78
|
+
if (!VALID_LAYER_CONNECTIONS[fromLayer].has(toLayer)) {
|
|
79
|
+
return false;
|
|
92
80
|
}
|
|
93
|
-
if (fromLayer === "
|
|
81
|
+
if (fromLayer === "ontological" || toLayer === "ontological") {
|
|
94
82
|
return true;
|
|
95
83
|
}
|
|
96
|
-
if (fromLayer === "organizational"
|
|
84
|
+
if (fromLayer === "organizational" || toLayer === "organizational") {
|
|
97
85
|
return true;
|
|
98
86
|
}
|
|
99
87
|
const fromDepth = getLayerDepth(fromLayer);
|
|
@@ -232,61 +220,281 @@ var EDGE_LAYER_RULES = {
|
|
|
232
220
|
to: ["L1", "L2", "L3"],
|
|
233
221
|
description: "Legacy storage migration alias for derived_from; public writes use derived_from"
|
|
234
222
|
},
|
|
235
|
-
qualifies: {
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
223
|
+
qualifies: {
|
|
224
|
+
from: ["L2", "L3"],
|
|
225
|
+
to: ["L3"],
|
|
226
|
+
description: "Evidence/Belief qualifies a Belief"
|
|
227
|
+
},
|
|
228
|
+
contradicts: {
|
|
229
|
+
from: ["L2", "L3"],
|
|
230
|
+
to: ["L3"],
|
|
231
|
+
description: "Evidence/Belief contradicts a Belief"
|
|
232
|
+
},
|
|
233
|
+
reinforces: {
|
|
234
|
+
from: ["L2", "L3"],
|
|
235
|
+
to: ["L3"],
|
|
236
|
+
description: "Evidence/Belief reinforces a Belief"
|
|
237
|
+
},
|
|
238
|
+
corroborates: {
|
|
239
|
+
from: ["L2", "L3"],
|
|
240
|
+
to: ["L3"],
|
|
241
|
+
description: "Independent evidence/belief corroborates a Belief"
|
|
242
|
+
},
|
|
243
|
+
strengthened_by: {
|
|
244
|
+
from: ["L3"],
|
|
245
|
+
to: ["L2", "L3"],
|
|
246
|
+
description: "Belief is strengthened by Evidence/Belief"
|
|
247
|
+
},
|
|
248
|
+
weakened_by: {
|
|
249
|
+
from: ["L3"],
|
|
250
|
+
to: ["L2", "L3"],
|
|
251
|
+
description: "Belief is weakened by Evidence/Belief"
|
|
252
|
+
},
|
|
253
|
+
validated_by: {
|
|
254
|
+
from: ["L3"],
|
|
255
|
+
to: ["L2", "L3"],
|
|
256
|
+
description: "Belief is validated by Evidence/Belief"
|
|
257
|
+
},
|
|
258
|
+
falsified_by: {
|
|
259
|
+
from: ["L3"],
|
|
260
|
+
to: ["L2", "L3"],
|
|
261
|
+
description: "Belief is falsified by Evidence/Belief"
|
|
262
|
+
},
|
|
263
|
+
amplifies: {
|
|
264
|
+
from: ["L3"],
|
|
265
|
+
to: ["L3"],
|
|
266
|
+
description: "Belief amplifies another Belief"
|
|
267
|
+
},
|
|
268
|
+
precondition_for: {
|
|
269
|
+
from: ["L3"],
|
|
270
|
+
to: ["L3"],
|
|
271
|
+
description: "Belief is a precondition for another Belief"
|
|
272
|
+
},
|
|
273
|
+
prerequisite_for: {
|
|
274
|
+
from: ["L3"],
|
|
275
|
+
to: ["L3"],
|
|
276
|
+
description: "Belief is a prerequisite for another Belief"
|
|
277
|
+
},
|
|
278
|
+
required_for: {
|
|
279
|
+
from: ["L3"],
|
|
280
|
+
to: ["L3"],
|
|
281
|
+
description: "Belief is required for another Belief"
|
|
282
|
+
},
|
|
283
|
+
in_tension_with: {
|
|
284
|
+
from: ["L3"],
|
|
285
|
+
to: ["L3"],
|
|
286
|
+
description: "Belief is in tension with another Belief"
|
|
287
|
+
},
|
|
288
|
+
mutually_exclusive: {
|
|
289
|
+
from: ["L3"],
|
|
290
|
+
to: ["L3"],
|
|
291
|
+
description: "Beliefs cannot both hold"
|
|
292
|
+
},
|
|
293
|
+
exclusive_with: {
|
|
294
|
+
from: ["L3"],
|
|
295
|
+
to: ["L3"],
|
|
296
|
+
description: "Belief is exclusive with another Belief"
|
|
297
|
+
},
|
|
298
|
+
alternative_to: {
|
|
299
|
+
from: ["L3"],
|
|
300
|
+
to: ["L3"],
|
|
301
|
+
description: "Belief is an alternative to another Belief"
|
|
302
|
+
},
|
|
303
|
+
subsumes: {
|
|
304
|
+
from: ["L3"],
|
|
305
|
+
to: ["L3"],
|
|
306
|
+
description: "Belief subsumes a narrower Belief"
|
|
307
|
+
},
|
|
308
|
+
extends: {
|
|
309
|
+
from: ["L3"],
|
|
310
|
+
to: ["L3"],
|
|
311
|
+
description: "Belief extends another Belief"
|
|
312
|
+
},
|
|
313
|
+
refines: {
|
|
314
|
+
from: ["L3"],
|
|
315
|
+
to: ["L3"],
|
|
316
|
+
description: "Belief refines another Belief"
|
|
317
|
+
},
|
|
318
|
+
implements: {
|
|
319
|
+
from: ["L3"],
|
|
320
|
+
to: ["L3"],
|
|
321
|
+
description: "Belief implements an abstract Belief"
|
|
322
|
+
},
|
|
323
|
+
violates: {
|
|
324
|
+
from: ["L3"],
|
|
325
|
+
to: ["L3"],
|
|
326
|
+
description: "Belief violates a constraint Belief"
|
|
327
|
+
},
|
|
328
|
+
assumes: {
|
|
329
|
+
from: ["L3"],
|
|
330
|
+
to: ["L3"],
|
|
331
|
+
description: "Belief assumes another Belief"
|
|
332
|
+
},
|
|
333
|
+
would_predict: {
|
|
334
|
+
from: ["L3"],
|
|
335
|
+
to: ["L3"],
|
|
336
|
+
description: "Belief would predict another Belief"
|
|
337
|
+
},
|
|
338
|
+
analogous_to: {
|
|
339
|
+
from: ["L3"],
|
|
340
|
+
to: ["L3"],
|
|
341
|
+
description: "Belief is analogous to another Belief"
|
|
342
|
+
},
|
|
343
|
+
independent_of: {
|
|
344
|
+
from: ["L3"],
|
|
345
|
+
to: ["L3"],
|
|
346
|
+
description: "Belief is independent of another Belief"
|
|
347
|
+
},
|
|
348
|
+
correlates_with: {
|
|
349
|
+
from: ["L3"],
|
|
350
|
+
to: ["L3"],
|
|
351
|
+
description: "Belief correlates with another Belief"
|
|
352
|
+
},
|
|
353
|
+
co_changes_with: {
|
|
354
|
+
from: ["L3"],
|
|
355
|
+
to: ["L3"],
|
|
356
|
+
description: "Belief co-changes with another Belief"
|
|
357
|
+
},
|
|
358
|
+
counterfactual_of: {
|
|
359
|
+
from: ["L3"],
|
|
360
|
+
to: ["L3"],
|
|
361
|
+
description: "Belief is a counterfactual of another Belief"
|
|
362
|
+
},
|
|
363
|
+
parallel_to: {
|
|
364
|
+
from: ["L3"],
|
|
365
|
+
to: ["L3"],
|
|
366
|
+
description: "Belief runs parallel to another Belief"
|
|
367
|
+
},
|
|
368
|
+
cascade_from: {
|
|
369
|
+
from: ["L3"],
|
|
370
|
+
to: ["L3"],
|
|
371
|
+
description: "Cascade from an upstream Belief"
|
|
372
|
+
},
|
|
373
|
+
cascade_to: {
|
|
374
|
+
from: ["L3"],
|
|
375
|
+
to: ["L3"],
|
|
376
|
+
description: "Cascade to a downstream Belief"
|
|
377
|
+
},
|
|
378
|
+
collapses_if: {
|
|
379
|
+
from: ["L3"],
|
|
380
|
+
to: ["L3"],
|
|
381
|
+
description: "Belief collapses if another fails"
|
|
382
|
+
},
|
|
383
|
+
branches_from: {
|
|
384
|
+
from: ["L3"],
|
|
385
|
+
to: ["L3"],
|
|
386
|
+
description: "Belief branches from an ancestor Belief"
|
|
387
|
+
},
|
|
388
|
+
same_as: {
|
|
389
|
+
from: ["L2", "L3", "ontological"],
|
|
390
|
+
to: ["L2", "L3", "ontological"],
|
|
391
|
+
description: "Two nodes are the same entity"
|
|
392
|
+
},
|
|
393
|
+
answers: {
|
|
394
|
+
from: ["L2", "L3"],
|
|
395
|
+
to: ["L3"],
|
|
396
|
+
description: "Answer/Belief answers a Question"
|
|
397
|
+
},
|
|
398
|
+
partially_answers: {
|
|
399
|
+
from: ["L2", "L3"],
|
|
400
|
+
to: ["L3"],
|
|
401
|
+
description: "Answer/Belief partially answers a Question"
|
|
402
|
+
},
|
|
403
|
+
explores: {
|
|
404
|
+
from: ["L3"],
|
|
405
|
+
to: ["L3"],
|
|
406
|
+
description: "Question explores a Belief/Theme"
|
|
407
|
+
},
|
|
408
|
+
informed_by_theme: {
|
|
409
|
+
from: ["L3"],
|
|
410
|
+
to: ["L3"],
|
|
411
|
+
description: "Belief is informed by a Theme"
|
|
412
|
+
},
|
|
413
|
+
same_theme_as: {
|
|
414
|
+
from: ["L3"],
|
|
415
|
+
to: ["L3"],
|
|
416
|
+
description: "Two Beliefs share a Theme"
|
|
417
|
+
},
|
|
418
|
+
based_on: {
|
|
419
|
+
from: ["L4"],
|
|
420
|
+
to: ["L3"],
|
|
421
|
+
description: "Decision is based on a Belief/Question"
|
|
422
|
+
},
|
|
423
|
+
based_on_belief: {
|
|
424
|
+
from: ["L4"],
|
|
425
|
+
to: ["L3"],
|
|
426
|
+
description: "Decision is based on a Belief"
|
|
427
|
+
},
|
|
428
|
+
based_on_question: {
|
|
429
|
+
from: ["L4"],
|
|
430
|
+
to: ["L3"],
|
|
431
|
+
description: "Decision is based on a Question"
|
|
432
|
+
},
|
|
433
|
+
blocked_by_contradiction: {
|
|
434
|
+
from: ["L4"],
|
|
435
|
+
to: ["L3"],
|
|
436
|
+
description: "Decision is blocked by a Contradiction"
|
|
437
|
+
},
|
|
438
|
+
parent_of: {
|
|
439
|
+
from: ["L3", "L4", "ontological", "organizational"],
|
|
440
|
+
to: ["L2", "L3", "ontological", "organizational"],
|
|
441
|
+
description: "A is the parent of B"
|
|
442
|
+
},
|
|
443
|
+
child_of: {
|
|
444
|
+
from: ["L2", "L3", "ontological", "organizational"],
|
|
445
|
+
to: ["L3", "L4", "ontological", "organizational"],
|
|
446
|
+
description: "A is the child of B"
|
|
447
|
+
},
|
|
448
|
+
scoped_by: {
|
|
449
|
+
from: ["L2", "L3"],
|
|
450
|
+
to: ["L3", "organizational"],
|
|
451
|
+
description: "Object is scoped by a Topic/Theme"
|
|
452
|
+
},
|
|
453
|
+
cites: {
|
|
454
|
+
from: ["L2", "L3"],
|
|
455
|
+
to: ["L1", "L2"],
|
|
456
|
+
description: "Evidence/Belief cites a Source/Excerpt"
|
|
457
|
+
},
|
|
458
|
+
summarizes: {
|
|
459
|
+
from: ["L2", "L3"],
|
|
460
|
+
to: ["L1", "L2"],
|
|
461
|
+
description: "Synthesis/Evidence summarizes a Source/Evidence"
|
|
462
|
+
},
|
|
463
|
+
same_source_as: {
|
|
464
|
+
from: ["L1", "L2"],
|
|
465
|
+
to: ["L1", "L2"],
|
|
466
|
+
description: "Two nodes derive from the same Source"
|
|
467
|
+
},
|
|
468
|
+
migrating_from: {
|
|
469
|
+
from: ["L2", "L3", "L4"],
|
|
470
|
+
to: ["L1", "L2", "L3"],
|
|
471
|
+
description: "Migration lineage: from an ancestor"
|
|
472
|
+
},
|
|
473
|
+
migrating_to: {
|
|
474
|
+
from: ["L1", "L2", "L3"],
|
|
475
|
+
to: ["L2", "L3", "L4"],
|
|
476
|
+
description: "Migration lineage: to a successor"
|
|
477
|
+
},
|
|
478
|
+
about_entity: {
|
|
479
|
+
from: ["L2", "L3"],
|
|
480
|
+
to: ["ontological"],
|
|
481
|
+
description: "Belief/Evidence is about an Entity"
|
|
482
|
+
},
|
|
483
|
+
entity_referenced_in: {
|
|
484
|
+
from: ["ontological"],
|
|
485
|
+
to: ["L1", "L2"],
|
|
486
|
+
description: "Entity is referenced in a Source/Evidence"
|
|
487
|
+
},
|
|
488
|
+
related_to: {
|
|
489
|
+
from: ["L2", "L3", "ontological", "organizational"],
|
|
490
|
+
to: ["L2", "L3", "ontological", "organizational"],
|
|
491
|
+
description: "Lateral adjacency; no confidence pressure"
|
|
492
|
+
},
|
|
493
|
+
blocks: {
|
|
494
|
+
from: ["L3", "L4"],
|
|
495
|
+
to: ["L3", "L4"],
|
|
496
|
+
description: "A blocks B (structural gate)"
|
|
497
|
+
}
|
|
290
498
|
};
|
|
291
499
|
function validateEdgeLayers(edgeType, fromLayer, toLayer) {
|
|
292
500
|
const rules = EDGE_LAYER_RULES[edgeType];
|
|
@@ -346,6 +554,252 @@ var ENTITY_BRIDGE_EDGE_TYPES = [
|
|
|
346
554
|
"impacts",
|
|
347
555
|
"mentioned_in"
|
|
348
556
|
];
|
|
557
|
+
var ENTITY_BRIDGE_EDGE_TYPE_SET = new Set(ENTITY_BRIDGE_EDGE_TYPES);
|
|
558
|
+
function isRecord(value) {
|
|
559
|
+
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
560
|
+
}
|
|
561
|
+
function readConvexId(value) {
|
|
562
|
+
return typeof value === "string" && value.trim().length > 0 ? value : void 0;
|
|
563
|
+
}
|
|
564
|
+
function readOptionalNumber(value) {
|
|
565
|
+
return typeof value === "number" && Number.isFinite(value) ? value : void 0;
|
|
566
|
+
}
|
|
567
|
+
function readOptionalString(value) {
|
|
568
|
+
return typeof value === "string" && value.trim().length > 0 ? value : void 0;
|
|
569
|
+
}
|
|
570
|
+
function readRecord(value) {
|
|
571
|
+
return isRecord(value) ? value : void 0;
|
|
572
|
+
}
|
|
573
|
+
function readBridgeEdge(value) {
|
|
574
|
+
if (!isRecord(value)) {
|
|
575
|
+
return null;
|
|
576
|
+
}
|
|
577
|
+
const edgeType = readOptionalString(value.edgeType);
|
|
578
|
+
if (!edgeType) {
|
|
579
|
+
return null;
|
|
580
|
+
}
|
|
581
|
+
const edge = { edgeType };
|
|
582
|
+
const context = readOptionalString(value.context);
|
|
583
|
+
const fromNodeId = readConvexId(value.fromNodeId);
|
|
584
|
+
const toNodeId = readConvexId(value.toNodeId);
|
|
585
|
+
const weight = readOptionalNumber(value.weight);
|
|
586
|
+
if (context !== void 0) {
|
|
587
|
+
edge.context = context;
|
|
588
|
+
}
|
|
589
|
+
if (fromNodeId !== void 0) {
|
|
590
|
+
edge.fromNodeId = fromNodeId;
|
|
591
|
+
}
|
|
592
|
+
if (toNodeId !== void 0) {
|
|
593
|
+
edge.toNodeId = toNodeId;
|
|
594
|
+
}
|
|
595
|
+
if (weight !== void 0) {
|
|
596
|
+
edge.weight = weight;
|
|
597
|
+
}
|
|
598
|
+
return edge;
|
|
599
|
+
}
|
|
600
|
+
function readBridgeNode(value) {
|
|
601
|
+
if (!isRecord(value)) {
|
|
602
|
+
return null;
|
|
603
|
+
}
|
|
604
|
+
const id = readConvexId(value._id);
|
|
605
|
+
if (!id) {
|
|
606
|
+
return null;
|
|
607
|
+
}
|
|
608
|
+
const node = { ...value, _id: id };
|
|
609
|
+
const canonicalText = readOptionalString(value.canonicalText);
|
|
610
|
+
const epistemicLayer = readOptionalString(value.epistemicLayer);
|
|
611
|
+
const globalId = readOptionalString(value.globalId);
|
|
612
|
+
const metadata = readRecord(value.metadata);
|
|
613
|
+
const nodeType = readOptionalString(value.nodeType);
|
|
614
|
+
const projectId = readOptionalString(value.projectId);
|
|
615
|
+
const status = readOptionalString(value.status);
|
|
616
|
+
const title = readOptionalString(value.title);
|
|
617
|
+
const topicId = readOptionalString(value.topicId);
|
|
618
|
+
if (canonicalText !== void 0) {
|
|
619
|
+
node.canonicalText = canonicalText;
|
|
620
|
+
}
|
|
621
|
+
if (epistemicLayer !== void 0) {
|
|
622
|
+
node.epistemicLayer = epistemicLayer;
|
|
623
|
+
}
|
|
624
|
+
if (globalId !== void 0) {
|
|
625
|
+
node.globalId = globalId;
|
|
626
|
+
}
|
|
627
|
+
if (metadata !== void 0) {
|
|
628
|
+
node.metadata = metadata;
|
|
629
|
+
}
|
|
630
|
+
if (nodeType !== void 0) {
|
|
631
|
+
node.nodeType = nodeType;
|
|
632
|
+
}
|
|
633
|
+
if (projectId !== void 0) {
|
|
634
|
+
node.projectId = projectId;
|
|
635
|
+
}
|
|
636
|
+
if (status !== void 0) {
|
|
637
|
+
node.status = status;
|
|
638
|
+
}
|
|
639
|
+
if (title !== void 0) {
|
|
640
|
+
node.title = title;
|
|
641
|
+
}
|
|
642
|
+
if (topicId !== void 0) {
|
|
643
|
+
node.topicId = topicId;
|
|
644
|
+
}
|
|
645
|
+
return node;
|
|
646
|
+
}
|
|
647
|
+
function readRowList(values, reader) {
|
|
648
|
+
return values.flatMap((value) => {
|
|
649
|
+
const row = reader(value);
|
|
650
|
+
return row ? [row] : [];
|
|
651
|
+
});
|
|
652
|
+
}
|
|
653
|
+
function readTopicScopeNode(value) {
|
|
654
|
+
return readBridgeNode(value);
|
|
655
|
+
}
|
|
656
|
+
function isEntityScopeBridgeEdge(edgeType) {
|
|
657
|
+
if (!edgeType) {
|
|
658
|
+
return false;
|
|
659
|
+
}
|
|
660
|
+
return ENTITY_BRIDGE_EDGE_TYPE_SET.has(edgeType);
|
|
661
|
+
}
|
|
662
|
+
async function queryEdgesByTarget(ctx, nodeId) {
|
|
663
|
+
return readRowList(
|
|
664
|
+
await ctx.db.query("epistemicEdges").withIndex("by_to", (q) => q.eq("toNodeId", nodeId)).collect(),
|
|
665
|
+
readBridgeEdge
|
|
666
|
+
);
|
|
667
|
+
}
|
|
668
|
+
async function queryEdgesBySource(ctx, nodeId) {
|
|
669
|
+
return readRowList(
|
|
670
|
+
await ctx.db.query("epistemicEdges").withIndex("by_from", (q) => q.eq("fromNodeId", nodeId)).collect(),
|
|
671
|
+
readBridgeEdge
|
|
672
|
+
);
|
|
673
|
+
}
|
|
674
|
+
async function readNodeById(ctx, nodeId) {
|
|
675
|
+
return readBridgeNode(await ctx.db.get(nodeId));
|
|
676
|
+
}
|
|
677
|
+
async function readNodeByIdForMutation(ctx, nodeId) {
|
|
678
|
+
return readBridgeNode(await ctx.db.get(nodeId));
|
|
679
|
+
}
|
|
680
|
+
function collectConnectedEntityNodeIds(connectedNodeIds, edges, mapFromInbound) {
|
|
681
|
+
for (const edge of edges) {
|
|
682
|
+
if (!isEntityScopeBridgeEdge(edge.edgeType)) {
|
|
683
|
+
continue;
|
|
684
|
+
}
|
|
685
|
+
const nextId = mapFromInbound ? edge.fromNodeId : edge.toNodeId;
|
|
686
|
+
if (!nextId) {
|
|
687
|
+
continue;
|
|
688
|
+
}
|
|
689
|
+
connectedNodeIds.add(String(nextId));
|
|
690
|
+
}
|
|
691
|
+
}
|
|
692
|
+
async function collectEntityTopicContextIds(ctx, connectedNodeIds) {
|
|
693
|
+
const topicIds = /* @__PURE__ */ new Set();
|
|
694
|
+
const projectIds = /* @__PURE__ */ new Set();
|
|
695
|
+
for (const nodeId of connectedNodeIds) {
|
|
696
|
+
const node = readTopicScopeNode(
|
|
697
|
+
await ctx.db.get(nodeId)
|
|
698
|
+
);
|
|
699
|
+
if (node?.status !== "active") {
|
|
700
|
+
continue;
|
|
701
|
+
}
|
|
702
|
+
if (node.projectId) {
|
|
703
|
+
projectIds.add(String(node.projectId));
|
|
704
|
+
}
|
|
705
|
+
if (node.topicId) {
|
|
706
|
+
topicIds.add(String(node.topicId));
|
|
707
|
+
}
|
|
708
|
+
}
|
|
709
|
+
return { topicIds, projectIds };
|
|
710
|
+
}
|
|
711
|
+
async function collectScopedTopicIdsFromConnectedNodes(ctx, connectedNodeIds) {
|
|
712
|
+
const scopedTopicIds = await Promise.all(
|
|
713
|
+
[...connectedNodeIds].map(async (nodeId) => {
|
|
714
|
+
const scopeEdges = await queryEdgesBySource(
|
|
715
|
+
ctx,
|
|
716
|
+
nodeId
|
|
717
|
+
);
|
|
718
|
+
const mappedTopicIds = scopeEdges.map(async (edge) => {
|
|
719
|
+
if (edge.edgeType !== "contains" || !edge.toNodeId) {
|
|
720
|
+
return;
|
|
721
|
+
}
|
|
722
|
+
const scopedTopicNode = readTopicScopeNode(
|
|
723
|
+
await ctx.db.get(edge.toNodeId)
|
|
724
|
+
);
|
|
725
|
+
const canonicalTopicId = readMaterializedTopicTableId(scopedTopicNode);
|
|
726
|
+
if (!canonicalTopicId) {
|
|
727
|
+
return;
|
|
728
|
+
}
|
|
729
|
+
return String(canonicalTopicId);
|
|
730
|
+
});
|
|
731
|
+
return Promise.all(mappedTopicIds);
|
|
732
|
+
})
|
|
733
|
+
);
|
|
734
|
+
return scopedTopicIds.flat().filter((topicId) => Boolean(topicId));
|
|
735
|
+
}
|
|
736
|
+
function buildEntityBeliefEdgeDirection(args, entity, belief) {
|
|
737
|
+
const { edgeType, entityNodeId, beliefNodeId } = args;
|
|
738
|
+
const effectiveEdgeType = edgeType || "contains";
|
|
739
|
+
const entityLayer = getNodeLayer(entity.nodeType);
|
|
740
|
+
const beliefLayer = getNodeLayer(belief.nodeType);
|
|
741
|
+
if (effectiveEdgeType === "contains" && entity.epistemicLayer === "ontological") {
|
|
742
|
+
return {
|
|
743
|
+
fromNodeId: beliefNodeId,
|
|
744
|
+
toNodeId: entityNodeId,
|
|
745
|
+
fromGlobalId: belief.globalId,
|
|
746
|
+
toGlobalId: entity.globalId,
|
|
747
|
+
fromNodeType: belief.nodeType,
|
|
748
|
+
toNodeType: entity.nodeType,
|
|
749
|
+
edgeFromLayer: beliefLayer,
|
|
750
|
+
edgeToLayer: "ontological"
|
|
751
|
+
};
|
|
752
|
+
}
|
|
753
|
+
if (effectiveEdgeType === "mentioned_in" || effectiveEdgeType === "perspective_on") {
|
|
754
|
+
return {
|
|
755
|
+
fromNodeId: entityNodeId,
|
|
756
|
+
toNodeId: beliefNodeId,
|
|
757
|
+
fromGlobalId: entity.globalId,
|
|
758
|
+
toGlobalId: belief.globalId,
|
|
759
|
+
fromNodeType: entity.nodeType,
|
|
760
|
+
toNodeType: belief.nodeType,
|
|
761
|
+
edgeFromLayer: "ontological",
|
|
762
|
+
edgeToLayer: beliefLayer
|
|
763
|
+
};
|
|
764
|
+
}
|
|
765
|
+
const directValidation = validateEdgeLayers(
|
|
766
|
+
effectiveEdgeType,
|
|
767
|
+
entityLayer,
|
|
768
|
+
beliefLayer
|
|
769
|
+
);
|
|
770
|
+
if (directValidation.valid) {
|
|
771
|
+
return {
|
|
772
|
+
fromNodeId: entityNodeId,
|
|
773
|
+
toNodeId: beliefNodeId,
|
|
774
|
+
fromGlobalId: entity.globalId,
|
|
775
|
+
toGlobalId: belief.globalId,
|
|
776
|
+
fromNodeType: entity.nodeType,
|
|
777
|
+
toNodeType: belief.nodeType,
|
|
778
|
+
edgeFromLayer: entityLayer,
|
|
779
|
+
edgeToLayer: beliefLayer
|
|
780
|
+
};
|
|
781
|
+
}
|
|
782
|
+
const reversedValidation = validateEdgeLayers(
|
|
783
|
+
effectiveEdgeType,
|
|
784
|
+
beliefLayer,
|
|
785
|
+
entityLayer
|
|
786
|
+
);
|
|
787
|
+
if (!reversedValidation.valid) {
|
|
788
|
+
throw new Error(
|
|
789
|
+
`Edge type '${effectiveEdgeType}' is not valid between ${entity.nodeType} (${entityLayer}) and ${belief.nodeType} (${beliefLayer}): ${directValidation.reason}`
|
|
790
|
+
);
|
|
791
|
+
}
|
|
792
|
+
return {
|
|
793
|
+
fromNodeId: beliefNodeId,
|
|
794
|
+
toNodeId: entityNodeId,
|
|
795
|
+
fromGlobalId: belief.globalId,
|
|
796
|
+
toGlobalId: entity.globalId,
|
|
797
|
+
fromNodeType: belief.nodeType,
|
|
798
|
+
toNodeType: entity.nodeType,
|
|
799
|
+
edgeFromLayer: beliefLayer,
|
|
800
|
+
edgeToLayer: entityLayer
|
|
801
|
+
};
|
|
802
|
+
}
|
|
349
803
|
var getBeliefsForEntity = query({
|
|
350
804
|
args: {
|
|
351
805
|
entityNodeId: v.id("epistemicNodes"),
|
|
@@ -353,8 +807,8 @@ var getBeliefsForEntity = query({
|
|
|
353
807
|
},
|
|
354
808
|
returns: permissiveReturn,
|
|
355
809
|
handler: async (ctx, args) => {
|
|
356
|
-
const entity = await ctx
|
|
357
|
-
if (
|
|
810
|
+
const entity = await readNodeById(ctx, args.entityNodeId);
|
|
811
|
+
if (entity?.epistemicLayer !== "ontological") {
|
|
358
812
|
return { beliefs: [], entity: null };
|
|
359
813
|
}
|
|
360
814
|
const filterTypes = args.edgeTypes || [
|
|
@@ -363,12 +817,12 @@ var getBeliefsForEntity = query({
|
|
|
363
817
|
"perspective_on",
|
|
364
818
|
"impacts"
|
|
365
819
|
];
|
|
366
|
-
const inboundEdges = await ctx
|
|
367
|
-
const outboundEdges = await ctx
|
|
820
|
+
const inboundEdges = await queryEdgesByTarget(ctx, args.entityNodeId);
|
|
821
|
+
const outboundEdges = await queryEdgesBySource(ctx, args.entityNodeId);
|
|
368
822
|
const beliefNodeIds = /* @__PURE__ */ new Set();
|
|
369
823
|
const edgeMap = {};
|
|
370
824
|
for (const edge of inboundEdges) {
|
|
371
|
-
if (!filterTypes.includes(edge.edgeType)
|
|
825
|
+
if (!(filterTypes.includes(edge.edgeType) && edge.fromNodeId)) {
|
|
372
826
|
continue;
|
|
373
827
|
}
|
|
374
828
|
const id = String(edge.fromNodeId);
|
|
@@ -381,7 +835,7 @@ var getBeliefsForEntity = query({
|
|
|
381
835
|
}
|
|
382
836
|
for (const edge of outboundEdges) {
|
|
383
837
|
const et = edge.edgeType;
|
|
384
|
-
if (!filterTypes.includes(et)
|
|
838
|
+
if (!(filterTypes.includes(et) && edge.toNodeId) || et === "mentioned_in") {
|
|
385
839
|
continue;
|
|
386
840
|
}
|
|
387
841
|
const id = String(edge.toNodeId);
|
|
@@ -394,8 +848,8 @@ var getBeliefsForEntity = query({
|
|
|
394
848
|
}
|
|
395
849
|
const beliefs = await Promise.all(
|
|
396
850
|
[...beliefNodeIds].map(async (nodeId) => {
|
|
397
|
-
const node = await ctx
|
|
398
|
-
if (
|
|
851
|
+
const node = await readNodeById(ctx, nodeId);
|
|
852
|
+
if (node?.status !== "active") {
|
|
399
853
|
return null;
|
|
400
854
|
}
|
|
401
855
|
return {
|
|
@@ -423,7 +877,7 @@ var getEntitiesForBelief = query({
|
|
|
423
877
|
},
|
|
424
878
|
returns: permissiveReturn,
|
|
425
879
|
handler: async (ctx, args) => {
|
|
426
|
-
const belief = await ctx
|
|
880
|
+
const belief = await readNodeById(ctx, args.beliefNodeId);
|
|
427
881
|
if (!belief) {
|
|
428
882
|
return { entities: [], belief: null };
|
|
429
883
|
}
|
|
@@ -433,12 +887,12 @@ var getEntitiesForBelief = query({
|
|
|
433
887
|
"perspective_on",
|
|
434
888
|
"impacts"
|
|
435
889
|
];
|
|
436
|
-
const outboundEdges = await ctx
|
|
437
|
-
const inboundEdges = await ctx
|
|
890
|
+
const outboundEdges = await queryEdgesBySource(ctx, args.beliefNodeId);
|
|
891
|
+
const inboundEdges = await queryEdgesByTarget(ctx, args.beliefNodeId);
|
|
438
892
|
const entityNodeIds = /* @__PURE__ */ new Set();
|
|
439
893
|
const edgeMap = {};
|
|
440
894
|
for (const edge of outboundEdges) {
|
|
441
|
-
if (!filterTypes.includes(edge.edgeType)
|
|
895
|
+
if (!(filterTypes.includes(edge.edgeType) && edge.toNodeId)) {
|
|
442
896
|
continue;
|
|
443
897
|
}
|
|
444
898
|
const id = String(edge.toNodeId);
|
|
@@ -450,7 +904,7 @@ var getEntitiesForBelief = query({
|
|
|
450
904
|
};
|
|
451
905
|
}
|
|
452
906
|
for (const edge of inboundEdges) {
|
|
453
|
-
if (!filterTypes.includes(edge.edgeType)
|
|
907
|
+
if (!(filterTypes.includes(edge.edgeType) && edge.fromNodeId)) {
|
|
454
908
|
continue;
|
|
455
909
|
}
|
|
456
910
|
const id = String(edge.fromNodeId);
|
|
@@ -463,8 +917,8 @@ var getEntitiesForBelief = query({
|
|
|
463
917
|
}
|
|
464
918
|
const entities = await Promise.all(
|
|
465
919
|
[...entityNodeIds].map(async (nodeId) => {
|
|
466
|
-
const node = await ctx
|
|
467
|
-
if (
|
|
920
|
+
const node = await readNodeById(ctx, nodeId);
|
|
921
|
+
if (node?.status !== "active" || node.epistemicLayer !== "ontological") {
|
|
468
922
|
return null;
|
|
469
923
|
}
|
|
470
924
|
return {
|
|
@@ -491,59 +945,27 @@ var getEntityTopicScope = query({
|
|
|
491
945
|
},
|
|
492
946
|
returns: permissiveReturn,
|
|
493
947
|
handler: async (ctx, args) => {
|
|
494
|
-
const entity = await ctx
|
|
495
|
-
if (
|
|
948
|
+
const entity = await readNodeById(ctx, args.entityNodeId);
|
|
949
|
+
if (entity?.epistemicLayer !== "ontological") {
|
|
496
950
|
return { topics: [], projectIds: [] };
|
|
497
951
|
}
|
|
498
|
-
const inboundEdges = await
|
|
499
|
-
|
|
952
|
+
const [inboundEdges, outboundEdges] = await Promise.all([
|
|
953
|
+
queryEdgesByTarget(ctx, args.entityNodeId),
|
|
954
|
+
queryEdgesBySource(ctx, args.entityNodeId)
|
|
955
|
+
]);
|
|
500
956
|
const connectedNodeIds = /* @__PURE__ */ new Set();
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
}
|
|
514
|
-
}
|
|
515
|
-
const projectIds = /* @__PURE__ */ new Set();
|
|
516
|
-
const topicIds = /* @__PURE__ */ new Set();
|
|
517
|
-
for (const nodeId of connectedNodeIds) {
|
|
518
|
-
const node = await ctx.db.get(nodeId);
|
|
519
|
-
if (!node || node.status !== "active") {
|
|
520
|
-
continue;
|
|
521
|
-
}
|
|
522
|
-
if (node.projectId) {
|
|
523
|
-
projectIds.add(String(node.projectId));
|
|
524
|
-
}
|
|
525
|
-
if (node.topicId) {
|
|
526
|
-
topicIds.add(String(node.topicId));
|
|
527
|
-
}
|
|
528
|
-
}
|
|
529
|
-
for (const nodeId of connectedNodeIds) {
|
|
530
|
-
const scopeEdges = await ctx.db.query("epistemicEdges").withIndex(
|
|
531
|
-
"by_from",
|
|
532
|
-
(q) => q.eq("fromNodeId", nodeId)
|
|
533
|
-
).collect();
|
|
534
|
-
for (const edge of scopeEdges) {
|
|
535
|
-
if (edge.edgeType === "contains" && edge.toNodeId) {
|
|
536
|
-
const scopedTopicNode = await ctx.db.get(
|
|
537
|
-
edge.toNodeId
|
|
538
|
-
);
|
|
539
|
-
const canonicalTopicId = readMaterializedTopicTableId(
|
|
540
|
-
scopedTopicNode
|
|
541
|
-
);
|
|
542
|
-
if (canonicalTopicId) {
|
|
543
|
-
topicIds.add(canonicalTopicId);
|
|
544
|
-
}
|
|
545
|
-
}
|
|
546
|
-
}
|
|
957
|
+
collectConnectedEntityNodeIds(connectedNodeIds, inboundEdges, true);
|
|
958
|
+
collectConnectedEntityNodeIds(connectedNodeIds, outboundEdges, false);
|
|
959
|
+
const { topicIds, projectIds } = await collectEntityTopicContextIds(
|
|
960
|
+
ctx,
|
|
961
|
+
connectedNodeIds
|
|
962
|
+
);
|
|
963
|
+
const inferredTopicIds = await collectScopedTopicIdsFromConnectedNodes(
|
|
964
|
+
ctx,
|
|
965
|
+
connectedNodeIds
|
|
966
|
+
);
|
|
967
|
+
for (const topicId of inferredTopicIds) {
|
|
968
|
+
topicIds.add(topicId);
|
|
547
969
|
}
|
|
548
970
|
return {
|
|
549
971
|
topics: [...topicIds],
|
|
@@ -559,15 +981,12 @@ var getEvidenceForEntity = query({
|
|
|
559
981
|
},
|
|
560
982
|
returns: permissiveReturn,
|
|
561
983
|
handler: async (ctx, args) => {
|
|
562
|
-
const entity = await ctx
|
|
563
|
-
if (
|
|
984
|
+
const entity = await readNodeById(ctx, args.entityNodeId);
|
|
985
|
+
if (entity?.epistemicLayer !== "ontological") {
|
|
564
986
|
return [];
|
|
565
987
|
}
|
|
566
988
|
const effectiveLimit = args.limit ?? 50;
|
|
567
|
-
const outboundEdges = await ctx.
|
|
568
|
-
"by_from",
|
|
569
|
-
(q) => q.eq("fromNodeId", args.entityNodeId)
|
|
570
|
-
).collect();
|
|
989
|
+
const outboundEdges = await queryEdgesBySource(ctx, args.entityNodeId);
|
|
571
990
|
const evidenceEdges = outboundEdges.filter((e) => {
|
|
572
991
|
const et = e.edgeType;
|
|
573
992
|
return et === "contains" || et === "mentioned_in";
|
|
@@ -577,8 +996,8 @@ var getEvidenceForEntity = query({
|
|
|
577
996
|
if (!edge.toNodeId) {
|
|
578
997
|
return null;
|
|
579
998
|
}
|
|
580
|
-
const node = await ctx
|
|
581
|
-
if (
|
|
999
|
+
const node = await readNodeById(ctx, edge.toNodeId);
|
|
1000
|
+
if (node?.status !== "active") {
|
|
582
1001
|
return null;
|
|
583
1002
|
}
|
|
584
1003
|
return {
|
|
@@ -608,11 +1027,11 @@ var linkEntityToBelief = mutation({
|
|
|
608
1027
|
if (!userId) {
|
|
609
1028
|
throw new Error("Authentication required to create entity-belief links.");
|
|
610
1029
|
}
|
|
611
|
-
const entity = await ctx
|
|
612
|
-
if (
|
|
1030
|
+
const entity = await readNodeByIdForMutation(ctx, args.entityNodeId);
|
|
1031
|
+
if (entity?.epistemicLayer !== "ontological") {
|
|
613
1032
|
throw new Error("Source node must be an ontological entity.");
|
|
614
1033
|
}
|
|
615
|
-
const belief = await ctx
|
|
1034
|
+
const belief = await readNodeByIdForMutation(ctx, args.beliefNodeId);
|
|
616
1035
|
if (!belief) {
|
|
617
1036
|
throw new Error("Target belief/question/theme node not found.");
|
|
618
1037
|
}
|
|
@@ -624,71 +1043,29 @@ var linkEntityToBelief = mutation({
|
|
|
624
1043
|
"Target belief/question/theme node is missing a globalId."
|
|
625
1044
|
);
|
|
626
1045
|
}
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
let toGlobalId;
|
|
634
|
-
let fromNodeType;
|
|
635
|
-
let toNodeType;
|
|
636
|
-
let edgeFromLayer;
|
|
637
|
-
let edgeToLayer;
|
|
638
|
-
if (effectiveEdgeType === "contains" && entity.epistemicLayer === "ontological") {
|
|
639
|
-
fromNodeId = args.beliefNodeId;
|
|
640
|
-
toNodeId = args.entityNodeId;
|
|
641
|
-
fromGlobalId = belief.globalId;
|
|
642
|
-
toGlobalId = entity.globalId;
|
|
643
|
-
fromNodeType = belief.nodeType;
|
|
644
|
-
toNodeType = entity.nodeType;
|
|
645
|
-
edgeFromLayer = getNodeLayer(belief.nodeType);
|
|
646
|
-
edgeToLayer = "ontological";
|
|
647
|
-
} else if (effectiveEdgeType === "mentioned_in" || effectiveEdgeType === "perspective_on") {
|
|
648
|
-
fromNodeId = args.entityNodeId;
|
|
649
|
-
toNodeId = args.beliefNodeId;
|
|
650
|
-
fromGlobalId = entity.globalId;
|
|
651
|
-
toGlobalId = belief.globalId;
|
|
652
|
-
fromNodeType = entity.nodeType;
|
|
653
|
-
toNodeType = belief.nodeType;
|
|
654
|
-
edgeFromLayer = "ontological";
|
|
655
|
-
edgeToLayer = getNodeLayer(belief.nodeType);
|
|
656
|
-
} else {
|
|
657
|
-
const validation = validateEdgeLayers(
|
|
658
|
-
effectiveEdgeType,
|
|
659
|
-
fromLayer,
|
|
660
|
-
toLayer
|
|
1046
|
+
if (!entity.nodeType) {
|
|
1047
|
+
throw new Error("Source entity is missing a nodeType.");
|
|
1048
|
+
}
|
|
1049
|
+
if (!belief.nodeType) {
|
|
1050
|
+
throw new Error(
|
|
1051
|
+
"Target belief/question/theme node is missing a nodeType."
|
|
661
1052
|
);
|
|
662
|
-
if (validation.valid) {
|
|
663
|
-
fromNodeId = args.entityNodeId;
|
|
664
|
-
toNodeId = args.beliefNodeId;
|
|
665
|
-
fromGlobalId = entity.globalId;
|
|
666
|
-
toGlobalId = belief.globalId;
|
|
667
|
-
fromNodeType = entity.nodeType;
|
|
668
|
-
toNodeType = belief.nodeType;
|
|
669
|
-
edgeFromLayer = fromLayer;
|
|
670
|
-
edgeToLayer = toLayer;
|
|
671
|
-
} else {
|
|
672
|
-
const reversed = validateEdgeLayers(
|
|
673
|
-
effectiveEdgeType,
|
|
674
|
-
toLayer,
|
|
675
|
-
fromLayer
|
|
676
|
-
);
|
|
677
|
-
if (!reversed.valid) {
|
|
678
|
-
throw new Error(
|
|
679
|
-
`Edge type '${effectiveEdgeType}' is not valid between ${entity.nodeType} (${fromLayer}) and ${belief.nodeType} (${toLayer}): ${validation.reason}`
|
|
680
|
-
);
|
|
681
|
-
}
|
|
682
|
-
fromNodeId = args.beliefNodeId;
|
|
683
|
-
toNodeId = args.entityNodeId;
|
|
684
|
-
fromGlobalId = belief.globalId;
|
|
685
|
-
toGlobalId = entity.globalId;
|
|
686
|
-
fromNodeType = belief.nodeType;
|
|
687
|
-
toNodeType = entity.nodeType;
|
|
688
|
-
edgeFromLayer = toLayer;
|
|
689
|
-
edgeToLayer = fromLayer;
|
|
690
|
-
}
|
|
691
1053
|
}
|
|
1054
|
+
const edgeDirection = buildEntityBeliefEdgeDirection(
|
|
1055
|
+
args,
|
|
1056
|
+
{
|
|
1057
|
+
nodeType: entity.nodeType,
|
|
1058
|
+
globalId: entity.globalId,
|
|
1059
|
+
epistemicLayer: entity.epistemicLayer
|
|
1060
|
+
},
|
|
1061
|
+
{
|
|
1062
|
+
nodeType: belief.nodeType,
|
|
1063
|
+
globalId: belief.globalId
|
|
1064
|
+
}
|
|
1065
|
+
);
|
|
1066
|
+
const { fromNodeId, toNodeId, fromGlobalId, toGlobalId } = edgeDirection;
|
|
1067
|
+
const { fromNodeType, toNodeType, edgeFromLayer, edgeToLayer } = edgeDirection;
|
|
1068
|
+
const effectiveEdgeType = args.edgeType || "contains";
|
|
692
1069
|
const existing = await ctx.db.query("epistemicEdges").withIndex(
|
|
693
1070
|
"by_from_to",
|
|
694
1071
|
(q) => q.eq("fromNodeId", fromNodeId).eq("toNodeId", toNodeId)
|