@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,17 +1,21 @@
|
|
|
1
|
-
import { v } from 'convex/values';
|
|
2
|
-
import { normalizeTupleContradictionPolicy, confidenceFromSL, readOpinionFromRecord, mkOpinion } from '@lucern/confidence';
|
|
3
1
|
import { checkScopeAccess } from '@lucern/access-control/access';
|
|
2
|
+
import { normalizeTupleContradictionPolicy, readOpinionFromRecord, mkOpinion, confidenceFromSL } from '@lucern/confidence';
|
|
4
3
|
import { permissiveReturn } from '@lucern/contracts/schema-helpers/validators';
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
4
|
+
import { v } from 'convex/values';
|
|
5
|
+
import { unsafeConvexAnyApi } from '@lucern/contracts/convex/unsafeAnyApi';
|
|
6
|
+
import { componentsGeneric, queryGeneric, internalMutationGeneric, mutationGeneric } from 'convex/server';
|
|
7
7
|
import '@lucern/access-control/audience';
|
|
8
8
|
import '@lucern/access-control/auth';
|
|
9
|
+
import { throwStructuredMutationError } from '@lucern/access-control/structuredMutationError';
|
|
9
10
|
import '@lucern/contracts/schema-helpers/spine/tables/epistemicNodes';
|
|
10
11
|
|
|
11
12
|
// src/epistemicBeliefs.backfills.ts
|
|
12
|
-
var
|
|
13
|
+
var unsafeApi = unsafeConvexAnyApi(
|
|
14
|
+
"graph-primitives top-level module bundle lacks a committed Convex _generated/api surface"
|
|
15
|
+
);
|
|
16
|
+
var api = unsafeApi;
|
|
13
17
|
componentsGeneric();
|
|
14
|
-
var internal =
|
|
18
|
+
var internal = unsafeApi;
|
|
15
19
|
var internalMutation = internalMutationGeneric;
|
|
16
20
|
var mutation = mutationGeneric;
|
|
17
21
|
var query = queryGeneric;
|
|
@@ -172,13 +176,15 @@ function asMappedProjectId(topic) {
|
|
|
172
176
|
if (!topic) {
|
|
173
177
|
return;
|
|
174
178
|
}
|
|
175
|
-
const directLegacyProjectId = normalizeScopeValue(
|
|
179
|
+
const directLegacyProjectId = normalizeScopeValue(
|
|
180
|
+
topic[LEGACY_SCOPE_FIELD]
|
|
181
|
+
);
|
|
176
182
|
if (directLegacyProjectId) {
|
|
177
183
|
return directLegacyProjectId;
|
|
178
184
|
}
|
|
179
185
|
const metadata = topic.metadata || {};
|
|
180
186
|
const candidate = metadata[LEGACY_SCOPE_FIELD] || metadata.legacyProjectId || metadata.projectId || metadata.scopeProjectId;
|
|
181
|
-
return candidate ? candidate : void 0;
|
|
187
|
+
return typeof candidate === "string" ? normalizeScopeValue(candidate) : void 0;
|
|
182
188
|
}
|
|
183
189
|
function normalizeScopeValue(value) {
|
|
184
190
|
if (typeof value !== "string") {
|
|
@@ -203,8 +209,9 @@ function pickPrimaryTopic(candidates) {
|
|
|
203
209
|
})[0];
|
|
204
210
|
}
|
|
205
211
|
async function findTopicsByScopeAlias(ctx, scopeId) {
|
|
212
|
+
const query2 = ctx.db.query("topics");
|
|
206
213
|
try {
|
|
207
|
-
return await
|
|
214
|
+
return await query2.withIndex(
|
|
208
215
|
"by_graph_scope_project",
|
|
209
216
|
(q) => q.eq(LEGACY_SCOPE_FIELD, scopeId)
|
|
210
217
|
).collect();
|
|
@@ -216,7 +223,7 @@ async function findTopicsByScopeAlias(ctx, scopeId) {
|
|
|
216
223
|
scopeId
|
|
217
224
|
}
|
|
218
225
|
);
|
|
219
|
-
const topics = await
|
|
226
|
+
const topics = await query2.collect();
|
|
220
227
|
return topics.filter((topic) => {
|
|
221
228
|
const normalizedGlobalId = normalizeScopeValue(topic.globalId);
|
|
222
229
|
const mappedProjectId = asMappedProjectId(topic);
|
|
@@ -224,20 +231,20 @@ async function findTopicsByScopeAlias(ctx, scopeId) {
|
|
|
224
231
|
});
|
|
225
232
|
}
|
|
226
233
|
}
|
|
227
|
-
async function tryResolveHostTopicById(ctx,
|
|
234
|
+
async function tryResolveHostTopicById(ctx, topicId2) {
|
|
228
235
|
if (typeof ctx.runQuery !== "function") {
|
|
229
236
|
return null;
|
|
230
237
|
}
|
|
231
238
|
try {
|
|
232
239
|
return await ctx.runQuery(api.topics.get, {
|
|
233
|
-
id:
|
|
240
|
+
id: topicId2
|
|
234
241
|
}) ?? null;
|
|
235
242
|
} catch (error) {
|
|
236
243
|
debugGraphPrimitiveFallback(
|
|
237
244
|
"[topicScope] Failed to resolve topic by host query",
|
|
238
245
|
{
|
|
239
246
|
error,
|
|
240
|
-
topicId
|
|
247
|
+
topicId: topicId2
|
|
241
248
|
}
|
|
242
249
|
);
|
|
243
250
|
return null;
|
|
@@ -272,137 +279,115 @@ async function resolveInheritedWorkspaceScope(ctx, topic) {
|
|
|
272
279
|
let current = topic;
|
|
273
280
|
for (let i = 0; i < MAX_DEPTH && current?.parentTopicId; i++) {
|
|
274
281
|
current = await ctx.db.get(current.parentTopicId);
|
|
275
|
-
if (!current)
|
|
282
|
+
if (!current) {
|
|
283
|
+
break;
|
|
284
|
+
}
|
|
276
285
|
if (!tenantId) {
|
|
277
286
|
tenantId = normalizeScopeValue(current.tenantId);
|
|
278
287
|
}
|
|
279
288
|
if (!workspaceId) {
|
|
280
289
|
workspaceId = normalizeScopeValue(current.workspaceId);
|
|
281
290
|
}
|
|
282
|
-
if (tenantId && workspaceId)
|
|
291
|
+
if (tenantId && workspaceId) {
|
|
292
|
+
break;
|
|
293
|
+
}
|
|
283
294
|
}
|
|
284
295
|
return { tenantId, workspaceId };
|
|
285
296
|
}
|
|
286
297
|
async function resolveTopicProjectScope(ctx, args) {
|
|
287
298
|
if (args.topicId) {
|
|
288
|
-
|
|
289
|
-
try {
|
|
290
|
-
topic = await ctx.db.get(
|
|
291
|
-
args.topicId
|
|
292
|
-
);
|
|
293
|
-
} catch (error) {
|
|
294
|
-
debugGraphPrimitiveFallback(
|
|
295
|
-
"[topicScope] Failed to load topic by direct id",
|
|
296
|
-
{
|
|
297
|
-
error,
|
|
298
|
-
topicId: args.topicId
|
|
299
|
-
}
|
|
300
|
-
);
|
|
301
|
-
}
|
|
302
|
-
if (!topic) {
|
|
303
|
-
topic = await tryResolveHostTopicById(ctx, String(args.topicId));
|
|
304
|
-
}
|
|
305
|
-
if (!topic) {
|
|
306
|
-
topic = pickPrimaryTopic(
|
|
307
|
-
await findTopicsByScopeAlias(ctx, String(args.topicId))
|
|
308
|
-
) ?? null;
|
|
309
|
-
}
|
|
310
|
-
if (!topic) {
|
|
311
|
-
const nodeScope = await resolveTopicNodeScopeOrNull(
|
|
312
|
-
ctx,
|
|
313
|
-
String(args.topicId)
|
|
314
|
-
);
|
|
315
|
-
if (nodeScope) {
|
|
316
|
-
return nodeScope;
|
|
317
|
-
}
|
|
318
|
-
throw new Error(`Topic not found: ${String(args.topicId)}`);
|
|
319
|
-
}
|
|
320
|
-
const inherited = await resolveInheritedWorkspaceScope(ctx, topic);
|
|
321
|
-
const mapped = asMappedProjectId(topic);
|
|
322
|
-
if (mapped) {
|
|
323
|
-
return {
|
|
324
|
-
topicId: topic._id,
|
|
325
|
-
projectId: mapped,
|
|
326
|
-
tenantId: inherited.tenantId,
|
|
327
|
-
workspaceId: inherited.workspaceId,
|
|
328
|
-
source: "topic"
|
|
329
|
-
};
|
|
330
|
-
}
|
|
331
|
-
return {
|
|
332
|
-
topicId: topic._id,
|
|
333
|
-
tenantId: inherited.tenantId,
|
|
334
|
-
workspaceId: inherited.workspaceId,
|
|
335
|
-
source: "topic"
|
|
336
|
-
};
|
|
299
|
+
return await resolveScopeFromTopicId(ctx, args.topicId);
|
|
337
300
|
}
|
|
338
301
|
if (args.projectId) {
|
|
339
|
-
|
|
340
|
-
try {
|
|
341
|
-
directTopic = await ctx.db.get(
|
|
342
|
-
args.projectId
|
|
343
|
-
);
|
|
344
|
-
} catch (error) {
|
|
345
|
-
debugGraphPrimitiveFallback(
|
|
346
|
-
"[topicScope] Failed to load direct project topic",
|
|
347
|
-
{
|
|
348
|
-
error,
|
|
349
|
-
projectId: args.projectId
|
|
350
|
-
}
|
|
351
|
-
);
|
|
352
|
-
}
|
|
353
|
-
if (directTopic) {
|
|
354
|
-
const inherited = await resolveInheritedWorkspaceScope(ctx, directTopic);
|
|
355
|
-
const mapped = asMappedProjectId(directTopic);
|
|
356
|
-
return {
|
|
357
|
-
topicId: directTopic._id,
|
|
358
|
-
projectId: mapped ?? args.projectId,
|
|
359
|
-
tenantId: inherited.tenantId,
|
|
360
|
-
workspaceId: inherited.workspaceId,
|
|
361
|
-
source: "topic_inferred"
|
|
362
|
-
};
|
|
363
|
-
}
|
|
364
|
-
directTopic = await tryResolveHostTopicByLegacyScope(ctx, args.projectId);
|
|
365
|
-
if (directTopic) {
|
|
366
|
-
const inherited = await resolveInheritedWorkspaceScope(ctx, directTopic);
|
|
367
|
-
const mapped = asMappedProjectId(directTopic);
|
|
368
|
-
return {
|
|
369
|
-
topicId: directTopic._id,
|
|
370
|
-
projectId: mapped ?? args.projectId,
|
|
371
|
-
tenantId: inherited.tenantId,
|
|
372
|
-
workspaceId: inherited.workspaceId,
|
|
373
|
-
source: "topic_inferred"
|
|
374
|
-
};
|
|
375
|
-
}
|
|
376
|
-
const topics = await findTopicsByScopeAlias(ctx, args.projectId);
|
|
377
|
-
const primary = pickPrimaryTopic(topics);
|
|
378
|
-
if (primary) {
|
|
379
|
-
const inherited = await resolveInheritedWorkspaceScope(ctx, primary);
|
|
380
|
-
return {
|
|
381
|
-
topicId: primary._id,
|
|
382
|
-
projectId: args.projectId,
|
|
383
|
-
tenantId: inherited.tenantId,
|
|
384
|
-
workspaceId: inherited.workspaceId,
|
|
385
|
-
source: "project_mapped_topic"
|
|
386
|
-
};
|
|
387
|
-
}
|
|
388
|
-
const nodeScope = await resolveTopicNodeScopeOrNull(
|
|
389
|
-
ctx,
|
|
390
|
-
String(args.projectId)
|
|
391
|
-
);
|
|
392
|
-
if (nodeScope) {
|
|
393
|
-
return {
|
|
394
|
-
...nodeScope,
|
|
395
|
-
projectId: nodeScope.projectId ?? String(args.projectId)
|
|
396
|
-
};
|
|
397
|
-
}
|
|
398
|
-
throw new Error(
|
|
399
|
-
`Legacy project scope ${String(args.projectId)} has no mapped topic.`
|
|
400
|
-
);
|
|
302
|
+
return await resolveScopeFromLegacyProjectId(ctx, args.projectId);
|
|
401
303
|
}
|
|
402
304
|
throw new Error(
|
|
403
305
|
"Missing scope: provide topicId (preferred) or legacy projectId alias."
|
|
404
306
|
);
|
|
405
307
|
}
|
|
308
|
+
async function resolveScopeFromTopicId(ctx, topicId2) {
|
|
309
|
+
const topic = await resolveTopicDocFromTopicId(ctx, topicId2);
|
|
310
|
+
if (topic) {
|
|
311
|
+
return await buildTopicScope(ctx, topic, "topic");
|
|
312
|
+
}
|
|
313
|
+
const nodeScope = await resolveTopicNodeScopeOrNull(ctx, String(topicId2));
|
|
314
|
+
if (nodeScope) {
|
|
315
|
+
return nodeScope;
|
|
316
|
+
}
|
|
317
|
+
throw new Error(`Topic not found: ${String(topicId2)}`);
|
|
318
|
+
}
|
|
319
|
+
async function resolveTopicDocFromTopicId(ctx, topicId2) {
|
|
320
|
+
const direct = await tryReadTopicDoc(ctx, topicId2, {
|
|
321
|
+
failureLog: "[topicScope] Failed to load topic by direct id",
|
|
322
|
+
idLogKey: "topicId"
|
|
323
|
+
});
|
|
324
|
+
if (direct) {
|
|
325
|
+
return direct;
|
|
326
|
+
}
|
|
327
|
+
const hostTopic = await tryResolveHostTopicById(ctx, String(topicId2));
|
|
328
|
+
if (hostTopic) {
|
|
329
|
+
return hostTopic;
|
|
330
|
+
}
|
|
331
|
+
return pickPrimaryTopic(await findTopicsByScopeAlias(ctx, String(topicId2))) ?? null;
|
|
332
|
+
}
|
|
333
|
+
async function resolveScopeFromLegacyProjectId(ctx, legacyProjectId) {
|
|
334
|
+
const directTopic = await resolveDirectLegacyProjectTopic(
|
|
335
|
+
ctx,
|
|
336
|
+
legacyProjectId
|
|
337
|
+
);
|
|
338
|
+
if (directTopic) {
|
|
339
|
+
return await buildTopicScope(ctx, directTopic, "topic_inferred", {
|
|
340
|
+
fallbackProjectId: legacyProjectId
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
const primary = pickPrimaryTopic(
|
|
344
|
+
await findTopicsByScopeAlias(ctx, legacyProjectId)
|
|
345
|
+
);
|
|
346
|
+
if (primary) {
|
|
347
|
+
return await buildTopicScope(ctx, primary, "project_mapped_topic", {
|
|
348
|
+
fallbackProjectId: legacyProjectId
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
const nodeScope = await resolveTopicNodeScopeOrNull(ctx, legacyProjectId);
|
|
352
|
+
if (nodeScope) {
|
|
353
|
+
return {
|
|
354
|
+
...nodeScope,
|
|
355
|
+
projectId: nodeScope.projectId ?? legacyProjectId
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
throw new Error(
|
|
359
|
+
`Legacy project scope ${legacyProjectId} has no mapped topic.`
|
|
360
|
+
);
|
|
361
|
+
}
|
|
362
|
+
async function resolveDirectLegacyProjectTopic(ctx, legacyProjectId) {
|
|
363
|
+
const directTopic = await tryReadTopicDoc(ctx, legacyProjectId, {
|
|
364
|
+
failureLog: "[topicScope] Failed to load direct project topic",
|
|
365
|
+
idLogKey: "projectId"
|
|
366
|
+
});
|
|
367
|
+
return directTopic ?? tryResolveHostTopicByLegacyScope(ctx, legacyProjectId);
|
|
368
|
+
}
|
|
369
|
+
async function tryReadTopicDoc(ctx, id, log) {
|
|
370
|
+
try {
|
|
371
|
+
return await ctx.db.get(id);
|
|
372
|
+
} catch (error) {
|
|
373
|
+
debugGraphPrimitiveFallback(log.failureLog, {
|
|
374
|
+
error,
|
|
375
|
+
[log.idLogKey]: id
|
|
376
|
+
});
|
|
377
|
+
return null;
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
async function buildTopicScope(ctx, topic, source, options = {}) {
|
|
381
|
+
const inherited = await resolveInheritedWorkspaceScope(ctx, topic);
|
|
382
|
+
const mapped = asMappedProjectId(topic);
|
|
383
|
+
return {
|
|
384
|
+
topicId: topic._id,
|
|
385
|
+
...mapped || options.fallbackProjectId ? { projectId: mapped ?? options.fallbackProjectId } : {},
|
|
386
|
+
tenantId: inherited.tenantId,
|
|
387
|
+
workspaceId: inherited.workspaceId,
|
|
388
|
+
source
|
|
389
|
+
};
|
|
390
|
+
}
|
|
406
391
|
var optionalScopeArgs = {
|
|
407
392
|
projectId: v.optional(v.string()),
|
|
408
393
|
topicId: v.optional(v.string())
|
|
@@ -437,8 +422,6 @@ function nodeMatchesWorkspaceReasoningScope(node, scope) {
|
|
|
437
422
|
}
|
|
438
423
|
return scopeWorkspaceId === nodeWorkspaceId;
|
|
439
424
|
}
|
|
440
|
-
|
|
441
|
-
// src/epistemicBeliefs.helpers.ts
|
|
442
425
|
v.id("epistemicNodes");
|
|
443
426
|
var optionalBeliefScopeArgs = optionalScopeArgs;
|
|
444
427
|
({
|
|
@@ -447,6 +430,117 @@ var optionalBeliefScopeArgs = optionalScopeArgs;
|
|
|
447
430
|
function readFiniteNumber(value) {
|
|
448
431
|
return typeof value === "number" && Number.isFinite(value) ? value : void 0;
|
|
449
432
|
}
|
|
433
|
+
function isRecord(value) {
|
|
434
|
+
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
435
|
+
}
|
|
436
|
+
function readOptionalString(value) {
|
|
437
|
+
return typeof value === "string" && value.trim().length > 0 ? value : void 0;
|
|
438
|
+
}
|
|
439
|
+
function readStringArray(value) {
|
|
440
|
+
if (!Array.isArray(value)) {
|
|
441
|
+
return;
|
|
442
|
+
}
|
|
443
|
+
const strings = value.filter(
|
|
444
|
+
(item) => typeof item === "string" && item.length > 0
|
|
445
|
+
);
|
|
446
|
+
return strings.length === value.length ? strings : void 0;
|
|
447
|
+
}
|
|
448
|
+
function readRecord(value) {
|
|
449
|
+
return isRecord(value) ? value : void 0;
|
|
450
|
+
}
|
|
451
|
+
function readBeliefNodeView(value) {
|
|
452
|
+
if (!isRecord(value)) {
|
|
453
|
+
return null;
|
|
454
|
+
}
|
|
455
|
+
const id = readOptionalString(value._id);
|
|
456
|
+
const nodeType = readOptionalString(value.nodeType);
|
|
457
|
+
if (!(id && nodeType === "belief")) {
|
|
458
|
+
return null;
|
|
459
|
+
}
|
|
460
|
+
const node = {
|
|
461
|
+
_id: id,
|
|
462
|
+
nodeType
|
|
463
|
+
};
|
|
464
|
+
const creationTime = readFiniteNumber(value._creationTime);
|
|
465
|
+
if (creationTime !== void 0) {
|
|
466
|
+
node._creationTime = creationTime;
|
|
467
|
+
}
|
|
468
|
+
const metadata = readRecord(value.metadata);
|
|
469
|
+
if (metadata !== void 0) {
|
|
470
|
+
node.metadata = metadata;
|
|
471
|
+
}
|
|
472
|
+
const opinionA = readFiniteNumber(value.opinion_a);
|
|
473
|
+
if (opinionA !== void 0) {
|
|
474
|
+
node.opinion_a = opinionA;
|
|
475
|
+
}
|
|
476
|
+
const opinionB = readFiniteNumber(value.opinion_b);
|
|
477
|
+
if (opinionB !== void 0) {
|
|
478
|
+
node.opinion_b = opinionB;
|
|
479
|
+
}
|
|
480
|
+
const opinionD = readFiniteNumber(value.opinion_d);
|
|
481
|
+
if (opinionD !== void 0) {
|
|
482
|
+
node.opinion_d = opinionD;
|
|
483
|
+
}
|
|
484
|
+
const opinionU = readFiniteNumber(value.opinion_u);
|
|
485
|
+
if (opinionU !== void 0) {
|
|
486
|
+
node.opinion_u = opinionU;
|
|
487
|
+
}
|
|
488
|
+
const tupleContradicted = typeof value.tupleContradicted === "boolean" ? value.tupleContradicted : void 0;
|
|
489
|
+
if (tupleContradicted !== void 0) {
|
|
490
|
+
node.tupleContradicted = tupleContradicted;
|
|
491
|
+
}
|
|
492
|
+
const stringFields = {
|
|
493
|
+
anonymizationClass: value.anonymizationClass,
|
|
494
|
+
audienceLabel: value.audienceLabel,
|
|
495
|
+
canonicalText: value.canonicalText,
|
|
496
|
+
createdBy: value.createdBy,
|
|
497
|
+
epistemicLayer: value.epistemicLayer,
|
|
498
|
+
exportClass: value.exportClass,
|
|
499
|
+
globalId: value.globalId,
|
|
500
|
+
projectId: value.projectId,
|
|
501
|
+
publicationStatus: value.publicationStatus,
|
|
502
|
+
sensitivityTier: value.sensitivityTier,
|
|
503
|
+
status: value.status,
|
|
504
|
+
tenantId: value.tenantId,
|
|
505
|
+
topicId: value.topicId,
|
|
506
|
+
userId: value.userId,
|
|
507
|
+
workspaceId: value.workspaceId
|
|
508
|
+
};
|
|
509
|
+
for (const [field, fieldValue] of Object.entries(stringFields)) {
|
|
510
|
+
const normalized = readOptionalString(fieldValue);
|
|
511
|
+
if (normalized !== void 0) {
|
|
512
|
+
node[field] = normalized;
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
const createdAt = readFiniteNumber(value.createdAt);
|
|
516
|
+
if (createdAt !== void 0) {
|
|
517
|
+
node.createdAt = createdAt;
|
|
518
|
+
}
|
|
519
|
+
const updatedAt = readFiniteNumber(value.updatedAt);
|
|
520
|
+
if (updatedAt !== void 0) {
|
|
521
|
+
node.updatedAt = updatedAt;
|
|
522
|
+
}
|
|
523
|
+
if (value.beliefStatus !== void 0) {
|
|
524
|
+
node.beliefStatus = value.beliefStatus;
|
|
525
|
+
}
|
|
526
|
+
if (value.confidence !== void 0) {
|
|
527
|
+
node.confidence = value.confidence;
|
|
528
|
+
}
|
|
529
|
+
if (value.predictionMeta !== void 0) {
|
|
530
|
+
node.predictionMeta = value.predictionMeta;
|
|
531
|
+
}
|
|
532
|
+
const policyTags = readStringArray(value.policyTags);
|
|
533
|
+
if (policyTags !== void 0) {
|
|
534
|
+
node.policyTags = policyTags;
|
|
535
|
+
}
|
|
536
|
+
return node;
|
|
537
|
+
}
|
|
538
|
+
function readBeliefNodeViews(values) {
|
|
539
|
+
return values.flatMap((value) => {
|
|
540
|
+
const node = readBeliefNodeView(value);
|
|
541
|
+
return node ? [node] : [];
|
|
542
|
+
});
|
|
543
|
+
}
|
|
450
544
|
function clamp01(value) {
|
|
451
545
|
return Math.max(0, Math.min(1, value));
|
|
452
546
|
}
|
|
@@ -513,7 +607,7 @@ function deriveSyntheticBackfillOpinion(source) {
|
|
|
513
607
|
return mkOpinion(confidence, 1 - confidence, 0, 0.5);
|
|
514
608
|
}
|
|
515
609
|
async function resolveBeliefScopeOrNull(ctx, args) {
|
|
516
|
-
if (!args.projectId
|
|
610
|
+
if (!(args.projectId || args.topicId)) {
|
|
517
611
|
return null;
|
|
518
612
|
}
|
|
519
613
|
try {
|
|
@@ -538,7 +632,8 @@ async function getBeliefNodesForScope(ctx, scope, args) {
|
|
|
538
632
|
"by_topic_type",
|
|
539
633
|
(q) => q.eq("topicId", scope.topicId).eq("nodeType", "belief")
|
|
540
634
|
);
|
|
541
|
-
const
|
|
635
|
+
const rows = await baseQuery.collect();
|
|
636
|
+
const nodes = readBeliefNodeViews(rows);
|
|
542
637
|
const scopedNodes = nodes.filter(
|
|
543
638
|
(node) => nodeMatchesWorkspaceReasoningScope(node, scope)
|
|
544
639
|
);
|
|
@@ -556,6 +651,340 @@ function resolveBeliefStatus(node, metadata) {
|
|
|
556
651
|
}
|
|
557
652
|
|
|
558
653
|
// src/epistemicBeliefs.backfills.ts
|
|
654
|
+
function epistemicNodeId(value) {
|
|
655
|
+
return value;
|
|
656
|
+
}
|
|
657
|
+
function topicId(value) {
|
|
658
|
+
return value;
|
|
659
|
+
}
|
|
660
|
+
function isRecord2(value) {
|
|
661
|
+
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
662
|
+
}
|
|
663
|
+
function readConvexId(value) {
|
|
664
|
+
return typeof value === "string" && value.trim().length > 0 ? value : void 0;
|
|
665
|
+
}
|
|
666
|
+
function readOptionalNumber(value) {
|
|
667
|
+
return readFiniteNumber(value);
|
|
668
|
+
}
|
|
669
|
+
function readOptionalString2(value) {
|
|
670
|
+
return typeof value === "string" && value.trim().length > 0 ? value : void 0;
|
|
671
|
+
}
|
|
672
|
+
function readRecord2(value) {
|
|
673
|
+
if (value === null) {
|
|
674
|
+
return null;
|
|
675
|
+
}
|
|
676
|
+
return isRecord2(value) ? value : void 0;
|
|
677
|
+
}
|
|
678
|
+
function readEpistemicNodeBackfillRow(value) {
|
|
679
|
+
if (!isRecord2(value)) {
|
|
680
|
+
return null;
|
|
681
|
+
}
|
|
682
|
+
const id = readConvexId(value._id);
|
|
683
|
+
if (!id) {
|
|
684
|
+
return null;
|
|
685
|
+
}
|
|
686
|
+
const row = { ...value, _id: id };
|
|
687
|
+
const canonicalText = readOptionalString2(value.canonicalText);
|
|
688
|
+
const createdAt = readOptionalNumber(value.createdAt);
|
|
689
|
+
const confidence = readOptionalNumber(value.confidence);
|
|
690
|
+
const globalId = readOptionalString2(value.globalId);
|
|
691
|
+
const metadata = readRecord2(value.metadata);
|
|
692
|
+
const nodeType = readOptionalString2(value.nodeType);
|
|
693
|
+
const projectId = readOptionalString2(value.projectId);
|
|
694
|
+
const status = readOptionalString2(value.status);
|
|
695
|
+
const title = readOptionalString2(value.title);
|
|
696
|
+
const topicIdValue = readOptionalString2(value.topicId);
|
|
697
|
+
const updatedAt = readOptionalNumber(value.updatedAt);
|
|
698
|
+
if (canonicalText !== void 0) {
|
|
699
|
+
row.canonicalText = canonicalText;
|
|
700
|
+
}
|
|
701
|
+
if (createdAt !== void 0) {
|
|
702
|
+
row.createdAt = createdAt;
|
|
703
|
+
}
|
|
704
|
+
if (confidence !== void 0) {
|
|
705
|
+
row.confidence = confidence;
|
|
706
|
+
}
|
|
707
|
+
if (globalId !== void 0) {
|
|
708
|
+
row.globalId = globalId;
|
|
709
|
+
}
|
|
710
|
+
if (metadata !== void 0) {
|
|
711
|
+
row.metadata = metadata;
|
|
712
|
+
}
|
|
713
|
+
if (nodeType !== void 0) {
|
|
714
|
+
row.nodeType = nodeType;
|
|
715
|
+
}
|
|
716
|
+
if (projectId !== void 0) {
|
|
717
|
+
row.projectId = projectId;
|
|
718
|
+
}
|
|
719
|
+
if (status !== void 0) {
|
|
720
|
+
row.status = status;
|
|
721
|
+
}
|
|
722
|
+
if (title !== void 0) {
|
|
723
|
+
row.title = title;
|
|
724
|
+
}
|
|
725
|
+
if (topicIdValue !== void 0) {
|
|
726
|
+
row.topicId = topicIdValue;
|
|
727
|
+
}
|
|
728
|
+
if (updatedAt !== void 0) {
|
|
729
|
+
row.updatedAt = updatedAt;
|
|
730
|
+
}
|
|
731
|
+
return row;
|
|
732
|
+
}
|
|
733
|
+
function readBeliefConfidenceBackfillRow(value) {
|
|
734
|
+
if (!isRecord2(value)) {
|
|
735
|
+
return null;
|
|
736
|
+
}
|
|
737
|
+
const id = readConvexId(value._id);
|
|
738
|
+
const assessedAt = readOptionalNumber(value.assessedAt);
|
|
739
|
+
const assessedBy = readOptionalString2(value.assessedBy);
|
|
740
|
+
const beliefId = readOptionalString2(value.beliefId);
|
|
741
|
+
const confidence = readOptionalNumber(value.confidence);
|
|
742
|
+
const trigger = readOptionalString2(value.trigger);
|
|
743
|
+
if (!(id && assessedAt !== void 0 && assessedBy && beliefId && trigger)) {
|
|
744
|
+
return null;
|
|
745
|
+
}
|
|
746
|
+
const row = {
|
|
747
|
+
...value,
|
|
748
|
+
_id: id,
|
|
749
|
+
assessedAt,
|
|
750
|
+
assessedBy,
|
|
751
|
+
beliefId,
|
|
752
|
+
confidence: confidence ?? 0.5,
|
|
753
|
+
trigger
|
|
754
|
+
};
|
|
755
|
+
const baseRate = readOptionalNumber(value.baseRate);
|
|
756
|
+
const belief = readOptionalNumber(value.belief);
|
|
757
|
+
const certainty = readOptionalNumber(value.certainty);
|
|
758
|
+
const disbelief = readOptionalNumber(value.disbelief);
|
|
759
|
+
const uncertainty = readOptionalNumber(value.uncertainty);
|
|
760
|
+
const valence = readOptionalNumber(value.valence);
|
|
761
|
+
if (baseRate !== void 0) {
|
|
762
|
+
row.baseRate = baseRate;
|
|
763
|
+
}
|
|
764
|
+
if (belief !== void 0) {
|
|
765
|
+
row.belief = belief;
|
|
766
|
+
}
|
|
767
|
+
if (certainty !== void 0) {
|
|
768
|
+
row.certainty = certainty;
|
|
769
|
+
}
|
|
770
|
+
if (disbelief !== void 0) {
|
|
771
|
+
row.disbelief = disbelief;
|
|
772
|
+
}
|
|
773
|
+
if (uncertainty !== void 0) {
|
|
774
|
+
row.uncertainty = uncertainty;
|
|
775
|
+
}
|
|
776
|
+
if (valence !== void 0) {
|
|
777
|
+
row.valence = valence;
|
|
778
|
+
}
|
|
779
|
+
return row;
|
|
780
|
+
}
|
|
781
|
+
function readEpistemicEdgeBackfillRow(value) {
|
|
782
|
+
if (!isRecord2(value)) {
|
|
783
|
+
return null;
|
|
784
|
+
}
|
|
785
|
+
const id = readConvexId(value._id);
|
|
786
|
+
if (!id) {
|
|
787
|
+
return null;
|
|
788
|
+
}
|
|
789
|
+
const row = { ...value, _id: id };
|
|
790
|
+
const fromNodeId = readOptionalString2(value.fromNodeId);
|
|
791
|
+
const globalId = readOptionalString2(value.globalId);
|
|
792
|
+
const toNodeId = readOptionalString2(value.toNodeId);
|
|
793
|
+
if (fromNodeId !== void 0) {
|
|
794
|
+
row.fromNodeId = fromNodeId;
|
|
795
|
+
}
|
|
796
|
+
if (globalId !== void 0) {
|
|
797
|
+
row.globalId = globalId;
|
|
798
|
+
}
|
|
799
|
+
if (toNodeId !== void 0) {
|
|
800
|
+
row.toNodeId = toNodeId;
|
|
801
|
+
}
|
|
802
|
+
return row;
|
|
803
|
+
}
|
|
804
|
+
function readRowList(values, reader) {
|
|
805
|
+
return values.flatMap((value) => {
|
|
806
|
+
const row = reader(value);
|
|
807
|
+
return row ? [row] : [];
|
|
808
|
+
});
|
|
809
|
+
}
|
|
810
|
+
function hasLegacyOpinionSnapshot(node) {
|
|
811
|
+
return readFiniteNumber(node.opinion_b) !== void 0 || readFiniteNumber(node.opinion_d) !== void 0 || readFiniteNumber(node.opinion_u) !== void 0 || readFiniteNumber(node.opinion_a) !== void 0 || readFiniteNumber(node.confidence) !== void 0;
|
|
812
|
+
}
|
|
813
|
+
function buildSubjectiveOpinionPatch(node, defaultBaseRate) {
|
|
814
|
+
return {
|
|
815
|
+
belief: readFiniteNumber(node.opinion_b) ?? 0,
|
|
816
|
+
disbelief: readFiniteNumber(node.opinion_d) ?? 0,
|
|
817
|
+
uncertainty: readFiniteNumber(node.opinion_u) ?? 1,
|
|
818
|
+
baseRate: readFiniteNumber(node.opinion_a) ?? defaultBaseRate
|
|
819
|
+
};
|
|
820
|
+
}
|
|
821
|
+
function needsSubjectiveOpinionPatch(node) {
|
|
822
|
+
return readFiniteNumber(node.opinion_b) === void 0 || readFiniteNumber(node.opinion_d) === void 0 || readFiniteNumber(node.opinion_u) === void 0 || readFiniteNumber(node.opinion_a) === void 0;
|
|
823
|
+
}
|
|
824
|
+
function buildSubjectiveOpinionNodePatch(opinion) {
|
|
825
|
+
return {
|
|
826
|
+
opinion_b: opinion.belief,
|
|
827
|
+
opinion_d: opinion.disbelief,
|
|
828
|
+
opinion_u: opinion.uncertainty,
|
|
829
|
+
opinion_a: opinion.baseRate,
|
|
830
|
+
updatedAt: Date.now()
|
|
831
|
+
};
|
|
832
|
+
}
|
|
833
|
+
function buildBaseRateHistoryPatch(row, defaultBaseRate) {
|
|
834
|
+
const belief = readFiniteNumber(row.belief) ?? 0;
|
|
835
|
+
const disbelief = readFiniteNumber(row.disbelief) ?? 0;
|
|
836
|
+
const uncertainty = readFiniteNumber(row.uncertainty) ?? 1;
|
|
837
|
+
return {
|
|
838
|
+
baseRate: defaultBaseRate,
|
|
839
|
+
confidence: confidenceFromSL(
|
|
840
|
+
belief,
|
|
841
|
+
disbelief,
|
|
842
|
+
uncertainty,
|
|
843
|
+
defaultBaseRate
|
|
844
|
+
)
|
|
845
|
+
};
|
|
846
|
+
}
|
|
847
|
+
function buildMandatoryPriorAuditRow(args) {
|
|
848
|
+
return {
|
|
849
|
+
entityType: "belief",
|
|
850
|
+
entityId: args.beliefId,
|
|
851
|
+
changeType: "updated",
|
|
852
|
+
changedAt: Date.now(),
|
|
853
|
+
changedBy: "system:lkc-2-prior-backfill",
|
|
854
|
+
isAgent: false,
|
|
855
|
+
previousState: null,
|
|
856
|
+
newState: {
|
|
857
|
+
baseRateBackfilled: true,
|
|
858
|
+
baseRate: args.defaultBaseRate,
|
|
859
|
+
patchedNodeOpinion: args.needsNodePatch,
|
|
860
|
+
patchedHistoryRows: args.rowsMissingBaseRate,
|
|
861
|
+
insertedInitialOpinion: args.insertedInitialRow
|
|
862
|
+
},
|
|
863
|
+
projectId: args.node.projectId,
|
|
864
|
+
topicId: args.node.topicId
|
|
865
|
+
};
|
|
866
|
+
}
|
|
867
|
+
async function backfillMandatoryPriorNode(ctx, args) {
|
|
868
|
+
const beliefId = String(args.node._id);
|
|
869
|
+
const patchedOpinion = buildSubjectiveOpinionPatch(
|
|
870
|
+
args.node,
|
|
871
|
+
args.defaultBaseRate
|
|
872
|
+
);
|
|
873
|
+
const needsNodePatch = needsSubjectiveOpinionPatch(args.node);
|
|
874
|
+
const rowsMissingBaseRate = args.history.filter(
|
|
875
|
+
(row) => readFiniteNumber(row.baseRate) === void 0
|
|
876
|
+
);
|
|
877
|
+
const needsInitialRow = args.history.length === 0;
|
|
878
|
+
if (!needsNodePatch && rowsMissingBaseRate.length === 0 && !needsInitialRow) {
|
|
879
|
+
return {
|
|
880
|
+
auditEntries: 0,
|
|
881
|
+
insertedInitialRows: 0,
|
|
882
|
+
patchedHistoryRows: 0,
|
|
883
|
+
patchedNodes: 0,
|
|
884
|
+
touched: false
|
|
885
|
+
};
|
|
886
|
+
}
|
|
887
|
+
if (needsNodePatch) {
|
|
888
|
+
await ctx.db.patch(
|
|
889
|
+
args.node._id,
|
|
890
|
+
buildSubjectiveOpinionNodePatch(patchedOpinion)
|
|
891
|
+
);
|
|
892
|
+
}
|
|
893
|
+
for (const row of rowsMissingBaseRate) {
|
|
894
|
+
await ctx.db.patch(
|
|
895
|
+
row._id,
|
|
896
|
+
buildBaseRateHistoryPatch(row, args.defaultBaseRate)
|
|
897
|
+
);
|
|
898
|
+
}
|
|
899
|
+
if (needsInitialRow) {
|
|
900
|
+
await ctx.db.insert(
|
|
901
|
+
"beliefConfidence",
|
|
902
|
+
buildBeliefConfidenceRow({
|
|
903
|
+
beliefId: args.node._id,
|
|
904
|
+
belief: patchedOpinion.belief,
|
|
905
|
+
disbelief: patchedOpinion.disbelief,
|
|
906
|
+
uncertainty: patchedOpinion.uncertainty,
|
|
907
|
+
baseRate: patchedOpinion.baseRate,
|
|
908
|
+
trigger: "initial",
|
|
909
|
+
rationale: "LKC-2 backfill: inserted missing initial vacuous opinion with neutral prior.",
|
|
910
|
+
assessedAt: readFiniteNumber(args.node.createdAt) ?? readFiniteNumber(args.node.updatedAt) ?? Date.now(),
|
|
911
|
+
assessedBy: "system:lkc-2-prior-backfill",
|
|
912
|
+
slOperator: "prior_seed"
|
|
913
|
+
})
|
|
914
|
+
);
|
|
915
|
+
}
|
|
916
|
+
await ctx.db.insert(
|
|
917
|
+
"epistemicAudit",
|
|
918
|
+
buildMandatoryPriorAuditRow({
|
|
919
|
+
beliefId,
|
|
920
|
+
defaultBaseRate: args.defaultBaseRate,
|
|
921
|
+
insertedInitialRow: needsInitialRow,
|
|
922
|
+
needsNodePatch,
|
|
923
|
+
node: args.node,
|
|
924
|
+
rowsMissingBaseRate: rowsMissingBaseRate.length
|
|
925
|
+
})
|
|
926
|
+
);
|
|
927
|
+
return {
|
|
928
|
+
auditEntries: 1,
|
|
929
|
+
insertedInitialRows: needsInitialRow ? 1 : 0,
|
|
930
|
+
patchedHistoryRows: rowsMissingBaseRate.length,
|
|
931
|
+
patchedNodes: needsNodePatch ? 1 : 0,
|
|
932
|
+
touched: true
|
|
933
|
+
};
|
|
934
|
+
}
|
|
935
|
+
async function collectConnectedNodeIds(ctx, beliefId) {
|
|
936
|
+
const [rawOutbound, rawInbound] = await Promise.all([
|
|
937
|
+
ctx.db.query("epistemicEdges").withIndex("by_from", (q) => q.eq("fromNodeId", beliefId)).collect(),
|
|
938
|
+
ctx.db.query("epistemicEdges").withIndex("by_to", (q) => q.eq("toNodeId", beliefId)).collect()
|
|
939
|
+
]);
|
|
940
|
+
const outbound = readRowList(rawOutbound, readEpistemicEdgeBackfillRow);
|
|
941
|
+
const inbound = readRowList(rawInbound, readEpistemicEdgeBackfillRow);
|
|
942
|
+
const connectedNodeIds = /* @__PURE__ */ new Set();
|
|
943
|
+
for (const edge of outbound) {
|
|
944
|
+
if (edge.toNodeId) {
|
|
945
|
+
connectedNodeIds.add(String(edge.toNodeId));
|
|
946
|
+
}
|
|
947
|
+
}
|
|
948
|
+
for (const edge of inbound) {
|
|
949
|
+
if (edge.fromNodeId) {
|
|
950
|
+
connectedNodeIds.add(String(edge.fromNodeId));
|
|
951
|
+
}
|
|
952
|
+
}
|
|
953
|
+
return connectedNodeIds;
|
|
954
|
+
}
|
|
955
|
+
async function reassignConnectedBeliefNeighbors(ctx, args) {
|
|
956
|
+
let connectedReassigned = 0;
|
|
957
|
+
for (const connectedId of args.connectedNodeIds) {
|
|
958
|
+
if (args.movedBeliefIds.has(connectedId) || args.alreadyReassigned.has(connectedId)) {
|
|
959
|
+
continue;
|
|
960
|
+
}
|
|
961
|
+
try {
|
|
962
|
+
const connectedNode = readEpistemicNodeBackfillRow(
|
|
963
|
+
await ctx.db.get(epistemicNodeId(connectedId))
|
|
964
|
+
);
|
|
965
|
+
if (connectedNode?.status !== "active") {
|
|
966
|
+
continue;
|
|
967
|
+
}
|
|
968
|
+
if (connectedNode.topicId && String(connectedNode.topicId) !== String(args.targetTopicId)) {
|
|
969
|
+
await ctx.db.patch(epistemicNodeId(connectedId), {
|
|
970
|
+
topicId: args.targetTopicId,
|
|
971
|
+
updatedAt: args.now
|
|
972
|
+
});
|
|
973
|
+
args.alreadyReassigned.add(connectedId);
|
|
974
|
+
connectedReassigned++;
|
|
975
|
+
}
|
|
976
|
+
} catch (error) {
|
|
977
|
+
debugGraphPrimitiveFallback(
|
|
978
|
+
"[epistemicBeliefs] Failed to reassign connected node",
|
|
979
|
+
{
|
|
980
|
+
error,
|
|
981
|
+
connectedId
|
|
982
|
+
}
|
|
983
|
+
);
|
|
984
|
+
}
|
|
985
|
+
}
|
|
986
|
+
return connectedReassigned;
|
|
987
|
+
}
|
|
559
988
|
var getRecentConfidenceChanges = query({
|
|
560
989
|
args: {
|
|
561
990
|
...optionalBeliefScopeArgs,
|
|
@@ -571,27 +1000,33 @@ var getRecentConfidenceChanges = query({
|
|
|
571
1000
|
return [];
|
|
572
1001
|
}
|
|
573
1002
|
const scopeId = scope.topicId ? String(scope.topicId) : scope.projectId;
|
|
574
|
-
if (!scopeId
|
|
1003
|
+
if (!(scopeId && await checkScopeAccess(ctx, scopeId, args.userId))) {
|
|
575
1004
|
return [];
|
|
576
1005
|
}
|
|
577
|
-
const projectBeliefs =
|
|
1006
|
+
const projectBeliefs = readRowList(
|
|
1007
|
+
await getBeliefNodesForScope(ctx, scope),
|
|
1008
|
+
readEpistemicNodeBackfillRow
|
|
1009
|
+
);
|
|
578
1010
|
if (projectBeliefs.length === 0) {
|
|
579
1011
|
return [];
|
|
580
1012
|
}
|
|
581
1013
|
const beliefMap = /* @__PURE__ */ new Map();
|
|
582
1014
|
for (const belief of projectBeliefs) {
|
|
583
1015
|
const info = {
|
|
584
|
-
id: belief._id,
|
|
1016
|
+
id: String(belief._id),
|
|
585
1017
|
title: belief.canonicalText || belief.title || "Untitled belief",
|
|
586
1018
|
currentConfidence: belief.confidence ?? 0.5
|
|
587
1019
|
};
|
|
588
|
-
beliefMap.set(belief._id, info);
|
|
1020
|
+
beliefMap.set(String(belief._id), info);
|
|
589
1021
|
}
|
|
590
|
-
const recentConfidence =
|
|
1022
|
+
const recentConfidence = readRowList(
|
|
1023
|
+
await ctx.db.query("beliefConfidence").order("desc").filter((q) => q.gt(q.field("assessedAt"), sevenDaysAgo)).take(200),
|
|
1024
|
+
readBeliefConfidenceBackfillRow
|
|
1025
|
+
);
|
|
591
1026
|
const changes = [];
|
|
592
1027
|
const seenBeliefs = /* @__PURE__ */ new Set();
|
|
593
1028
|
for (const entry of recentConfidence) {
|
|
594
|
-
const beliefInfo = beliefMap.get(entry.beliefId);
|
|
1029
|
+
const beliefInfo = beliefMap.get(String(entry.beliefId));
|
|
595
1030
|
if (!beliefInfo) {
|
|
596
1031
|
continue;
|
|
597
1032
|
}
|
|
@@ -599,7 +1034,10 @@ var getRecentConfidenceChanges = query({
|
|
|
599
1034
|
continue;
|
|
600
1035
|
}
|
|
601
1036
|
seenBeliefs.add(beliefInfo.id);
|
|
602
|
-
const previousEntries =
|
|
1037
|
+
const previousEntries = readRowList(
|
|
1038
|
+
await ctx.db.query("beliefConfidence").withIndex("by_beliefId", (q) => q.eq("beliefId", entry.beliefId)).order("desc").filter((q) => q.lt(q.field("assessedAt"), entry.assessedAt)).take(1),
|
|
1039
|
+
readBeliefConfidenceBackfillRow
|
|
1040
|
+
);
|
|
603
1041
|
const previousConfidence = previousEntries[0]?.confidence ?? 0.5;
|
|
604
1042
|
const delta = entry.confidence - previousConfidence;
|
|
605
1043
|
if (Math.abs(delta) < 0.05) {
|
|
@@ -627,10 +1065,14 @@ var backfillSyntheticOpinionHistory = internalMutation({
|
|
|
627
1065
|
returns: permissiveReturn,
|
|
628
1066
|
handler: async (ctx, args) => {
|
|
629
1067
|
const limit = Math.max(1, Math.min(args.limit ?? 100, 100));
|
|
630
|
-
const
|
|
631
|
-
ctx.db.query("epistemicNodes").withIndex("by_nodeType", (q) => q.eq("nodeType", "belief")).collect(),
|
|
632
|
-
|
|
633
|
-
|
|
1068
|
+
const beliefNodes = readRowList(
|
|
1069
|
+
await ctx.db.query("epistemicNodes").withIndex("by_nodeType", (q) => q.eq("nodeType", "belief")).collect(),
|
|
1070
|
+
readEpistemicNodeBackfillRow
|
|
1071
|
+
);
|
|
1072
|
+
const existingHistory = readRowList(
|
|
1073
|
+
await ctx.db.query("beliefConfidence").collect(),
|
|
1074
|
+
readBeliefConfidenceBackfillRow
|
|
1075
|
+
);
|
|
634
1076
|
const beliefsWithHistory = new Set(
|
|
635
1077
|
existingHistory.map((entry) => String(entry.beliefId))
|
|
636
1078
|
);
|
|
@@ -641,8 +1083,7 @@ var backfillSyntheticOpinionHistory = internalMutation({
|
|
|
641
1083
|
if (inserted >= limit) {
|
|
642
1084
|
break;
|
|
643
1085
|
}
|
|
644
|
-
|
|
645
|
-
if (!hasOpinionSnapshot) {
|
|
1086
|
+
if (!hasLegacyOpinionSnapshot(node)) {
|
|
646
1087
|
skippedNoOpinion++;
|
|
647
1088
|
continue;
|
|
648
1089
|
}
|
|
@@ -650,9 +1091,7 @@ var backfillSyntheticOpinionHistory = internalMutation({
|
|
|
650
1091
|
skippedHasHistory++;
|
|
651
1092
|
continue;
|
|
652
1093
|
}
|
|
653
|
-
const opinion = deriveSyntheticBackfillOpinion(
|
|
654
|
-
node
|
|
655
|
-
);
|
|
1094
|
+
const opinion = deriveSyntheticBackfillOpinion(node);
|
|
656
1095
|
await ctx.db.insert(
|
|
657
1096
|
"beliefConfidence",
|
|
658
1097
|
buildBeliefConfidenceRow({
|
|
@@ -671,10 +1110,9 @@ var backfillSyntheticOpinionHistory = internalMutation({
|
|
|
671
1110
|
beliefsWithHistory.add(String(node._id));
|
|
672
1111
|
inserted++;
|
|
673
1112
|
}
|
|
674
|
-
const remainingCandidates = beliefNodes.filter(
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
}).length;
|
|
1113
|
+
const remainingCandidates = beliefNodes.filter(
|
|
1114
|
+
(node) => hasLegacyOpinionSnapshot(node) && !beliefsWithHistory.has(String(node._id))
|
|
1115
|
+
).length;
|
|
678
1116
|
return {
|
|
679
1117
|
scanned: beliefNodes.length,
|
|
680
1118
|
inserted,
|
|
@@ -697,10 +1135,14 @@ var backfillMandatoryPriors = internalMutation({
|
|
|
697
1135
|
args.defaultBaseRate ?? 0.5,
|
|
698
1136
|
"defaultBaseRate"
|
|
699
1137
|
);
|
|
700
|
-
const
|
|
701
|
-
ctx.db.query("epistemicNodes").withIndex("by_nodeType", (q) => q.eq("nodeType", "belief")).collect(),
|
|
702
|
-
|
|
703
|
-
|
|
1138
|
+
const beliefNodes = readRowList(
|
|
1139
|
+
await ctx.db.query("epistemicNodes").withIndex("by_nodeType", (q) => q.eq("nodeType", "belief")).collect(),
|
|
1140
|
+
readEpistemicNodeBackfillRow
|
|
1141
|
+
);
|
|
1142
|
+
const historyRows = readRowList(
|
|
1143
|
+
await ctx.db.query("beliefConfidence").collect(),
|
|
1144
|
+
readBeliefConfidenceBackfillRow
|
|
1145
|
+
);
|
|
704
1146
|
const historyByBeliefId = /* @__PURE__ */ new Map();
|
|
705
1147
|
for (const row of historyRows) {
|
|
706
1148
|
const beliefId = String(row.beliefId);
|
|
@@ -719,82 +1161,18 @@ var backfillMandatoryPriors = internalMutation({
|
|
|
719
1161
|
}
|
|
720
1162
|
const beliefId = String(node._id);
|
|
721
1163
|
const history = historyByBeliefId.get(beliefId) ?? [];
|
|
722
|
-
const
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
const needsNodePatch = readFiniteNumber(node.opinion_b) === void 0 || readFiniteNumber(node.opinion_d) === void 0 || readFiniteNumber(node.opinion_u) === void 0 || readFiniteNumber(node.opinion_a) === void 0;
|
|
729
|
-
const rowsMissingBaseRate = history.filter(
|
|
730
|
-
(row) => readFiniteNumber(row.baseRate) === void 0
|
|
731
|
-
);
|
|
732
|
-
const needsInitialRow = history.length === 0;
|
|
733
|
-
if (!needsNodePatch && rowsMissingBaseRate.length === 0 && !needsInitialRow) {
|
|
1164
|
+
const result = await backfillMandatoryPriorNode(ctx, {
|
|
1165
|
+
defaultBaseRate,
|
|
1166
|
+
history,
|
|
1167
|
+
node
|
|
1168
|
+
});
|
|
1169
|
+
if (!result.touched) {
|
|
734
1170
|
continue;
|
|
735
1171
|
}
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
opinion_u: patchedOpinion.uncertainty,
|
|
741
|
-
opinion_a: patchedOpinion.baseRate,
|
|
742
|
-
updatedAt: Date.now()
|
|
743
|
-
});
|
|
744
|
-
patchedNodes++;
|
|
745
|
-
}
|
|
746
|
-
for (const row of rowsMissingBaseRate) {
|
|
747
|
-
const belief = readFiniteNumber(row.belief) ?? 0;
|
|
748
|
-
const disbelief = readFiniteNumber(row.disbelief) ?? 0;
|
|
749
|
-
const uncertainty = readFiniteNumber(row.uncertainty) ?? 1;
|
|
750
|
-
await ctx.db.patch(row._id, {
|
|
751
|
-
baseRate: defaultBaseRate,
|
|
752
|
-
confidence: confidenceFromSL(
|
|
753
|
-
belief,
|
|
754
|
-
disbelief,
|
|
755
|
-
uncertainty,
|
|
756
|
-
defaultBaseRate
|
|
757
|
-
)
|
|
758
|
-
});
|
|
759
|
-
patchedHistoryRows++;
|
|
760
|
-
}
|
|
761
|
-
if (needsInitialRow) {
|
|
762
|
-
await ctx.db.insert(
|
|
763
|
-
"beliefConfidence",
|
|
764
|
-
buildBeliefConfidenceRow({
|
|
765
|
-
beliefId: node._id,
|
|
766
|
-
belief: patchedOpinion.belief,
|
|
767
|
-
disbelief: patchedOpinion.disbelief,
|
|
768
|
-
uncertainty: patchedOpinion.uncertainty,
|
|
769
|
-
baseRate: patchedOpinion.baseRate,
|
|
770
|
-
trigger: "initial",
|
|
771
|
-
rationale: "LKC-2 backfill: inserted missing initial vacuous opinion with neutral prior.",
|
|
772
|
-
assessedAt: readFiniteNumber(node.createdAt) ?? readFiniteNumber(node.updatedAt) ?? Date.now(),
|
|
773
|
-
assessedBy: "system:lkc-2-prior-backfill",
|
|
774
|
-
slOperator: "prior_seed"
|
|
775
|
-
})
|
|
776
|
-
);
|
|
777
|
-
insertedInitialRows++;
|
|
778
|
-
}
|
|
779
|
-
await ctx.db.insert("epistemicAudit", {
|
|
780
|
-
entityType: "belief",
|
|
781
|
-
entityId: beliefId,
|
|
782
|
-
changeType: "updated",
|
|
783
|
-
changedAt: Date.now(),
|
|
784
|
-
changedBy: "system:lkc-2-prior-backfill",
|
|
785
|
-
isAgent: false,
|
|
786
|
-
previousState: null,
|
|
787
|
-
newState: {
|
|
788
|
-
baseRateBackfilled: true,
|
|
789
|
-
baseRate: defaultBaseRate,
|
|
790
|
-
patchedNodeOpinion: needsNodePatch,
|
|
791
|
-
patchedHistoryRows: rowsMissingBaseRate.length,
|
|
792
|
-
insertedInitialOpinion: needsInitialRow
|
|
793
|
-
},
|
|
794
|
-
projectId: node.projectId,
|
|
795
|
-
topicId: typeof node.topicId === "string" ? node.topicId : void 0
|
|
796
|
-
});
|
|
797
|
-
auditEntries++;
|
|
1172
|
+
patchedNodes += result.patchedNodes;
|
|
1173
|
+
patchedHistoryRows += result.patchedHistoryRows;
|
|
1174
|
+
insertedInitialRows += result.insertedInitialRows;
|
|
1175
|
+
auditEntries += result.auditEntries;
|
|
798
1176
|
touched++;
|
|
799
1177
|
}
|
|
800
1178
|
return {
|
|
@@ -814,7 +1192,10 @@ var backfillTwoAxisConfidence = internalMutation({
|
|
|
814
1192
|
returns: permissiveReturn,
|
|
815
1193
|
handler: async (ctx, args) => {
|
|
816
1194
|
const dryRun = args.dryRun ?? false;
|
|
817
|
-
const allConfRecords =
|
|
1195
|
+
const allConfRecords = readRowList(
|
|
1196
|
+
await ctx.db.query("beliefConfidence").collect(),
|
|
1197
|
+
readBeliefConfidenceBackfillRow
|
|
1198
|
+
);
|
|
818
1199
|
let confUpdated = 0;
|
|
819
1200
|
let confSkipped = 0;
|
|
820
1201
|
for (const record of allConfRecords) {
|
|
@@ -830,11 +1211,14 @@ var backfillTwoAxisConfidence = internalMutation({
|
|
|
830
1211
|
}
|
|
831
1212
|
confUpdated++;
|
|
832
1213
|
}
|
|
833
|
-
const allBeliefNodes =
|
|
1214
|
+
const allBeliefNodes = readRowList(
|
|
1215
|
+
await ctx.db.query("epistemicNodes").filter((q) => q.eq(q.field("nodeType"), "belief")).collect(),
|
|
1216
|
+
readEpistemicNodeBackfillRow
|
|
1217
|
+
);
|
|
834
1218
|
let nodesUpdated = 0;
|
|
835
1219
|
let nodesSkipped = 0;
|
|
836
1220
|
for (const node of allBeliefNodes) {
|
|
837
|
-
const meta = node.metadata
|
|
1221
|
+
const meta = node.metadata ?? {};
|
|
838
1222
|
if (meta.valence !== void 0 && meta.certainty !== void 0) {
|
|
839
1223
|
nodesSkipped++;
|
|
840
1224
|
continue;
|
|
@@ -872,19 +1256,29 @@ var backfillScoredBeliefEdges = internalMutation({
|
|
|
872
1256
|
returns: permissiveReturn,
|
|
873
1257
|
handler: async (ctx, args) => {
|
|
874
1258
|
const dryRun = args.dryRun ?? false;
|
|
875
|
-
const
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
1259
|
+
const scopeTopicId = args.topicId ?? args.projectId;
|
|
1260
|
+
if (!scopeTopicId) {
|
|
1261
|
+
return {
|
|
1262
|
+
dryRun,
|
|
1263
|
+
scoredBeliefs: 0,
|
|
1264
|
+
themeNodes: 0,
|
|
1265
|
+
edgesCreated: 0,
|
|
1266
|
+
edgesSkipped: 0
|
|
1267
|
+
};
|
|
1268
|
+
}
|
|
1269
|
+
const allBeliefs = readRowList(
|
|
1270
|
+
await ctx.db.query("epistemicNodes").withIndex("by_topic", (q) => q.eq("topicId", scopeTopicId)).filter((q) => q.eq(q.field("nodeType"), "belief")).collect(),
|
|
1271
|
+
readEpistemicNodeBackfillRow
|
|
1272
|
+
);
|
|
879
1273
|
const scoredBeliefs = allBeliefs.filter((belief) => {
|
|
880
|
-
const metadata = belief.metadata
|
|
1274
|
+
const metadata = belief.metadata ?? {};
|
|
881
1275
|
const lifecycle = resolveBeliefStatus(belief, metadata);
|
|
882
1276
|
return lifecycle === "active" || lifecycle === "resolved_true";
|
|
883
1277
|
});
|
|
884
|
-
const themeNodes =
|
|
885
|
-
"by_topic",
|
|
886
|
-
|
|
887
|
-
)
|
|
1278
|
+
const themeNodes = readRowList(
|
|
1279
|
+
await ctx.db.query("epistemicNodes").withIndex("by_topic", (q) => q.eq("topicId", scopeTopicId)).filter((q) => q.eq(q.field("nodeType"), "theme")).collect(),
|
|
1280
|
+
readEpistemicNodeBackfillRow
|
|
1281
|
+
);
|
|
888
1282
|
let created = 0;
|
|
889
1283
|
let skipped = 0;
|
|
890
1284
|
for (const belief of scoredBeliefs) {
|
|
@@ -910,7 +1304,7 @@ var backfillScoredBeliefEdges = internalMutation({
|
|
|
910
1304
|
edgeType: "relates_to_thesis",
|
|
911
1305
|
weight: belief.confidence ?? 0.5,
|
|
912
1306
|
createdBy: "backfill:scored_belief_theme",
|
|
913
|
-
topicId: String(
|
|
1307
|
+
topicId: String(scopeTopicId),
|
|
914
1308
|
fromNodeType: "belief",
|
|
915
1309
|
toNodeType: "theme",
|
|
916
1310
|
fromLayer: "L3",
|
|
@@ -935,16 +1329,14 @@ var backfillBeliefSprintIds = internalMutation({
|
|
|
935
1329
|
dryRun: v.optional(v.boolean())
|
|
936
1330
|
},
|
|
937
1331
|
returns: permissiveReturn,
|
|
938
|
-
handler: async (_ctx, _args) => {
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
};
|
|
947
|
-
}
|
|
1332
|
+
handler: async (_ctx, _args) => ({
|
|
1333
|
+
dryRun: true,
|
|
1334
|
+
message: "backfillBeliefSprintIds removed \u2014 sprints are D-tier legacy. Use worktrees.",
|
|
1335
|
+
sprintsScanned: 0,
|
|
1336
|
+
beliefsWithSprints: 0,
|
|
1337
|
+
updated: 0,
|
|
1338
|
+
skipped: 0
|
|
1339
|
+
})
|
|
948
1340
|
});
|
|
949
1341
|
var getBeliefClusterPositions = query({
|
|
950
1342
|
args: {
|
|
@@ -954,7 +1346,7 @@ var getBeliefClusterPositions = query({
|
|
|
954
1346
|
returns: permissiveReturn,
|
|
955
1347
|
handler: async (ctx, args) => {
|
|
956
1348
|
const scope = await resolveBeliefScopeOrNull(ctx, args);
|
|
957
|
-
if (!scope
|
|
1349
|
+
if (!scope?.projectId) {
|
|
958
1350
|
return {
|
|
959
1351
|
positions: {},
|
|
960
1352
|
hasClusters: false,
|
|
@@ -1002,7 +1394,7 @@ var reassignBeliefsTopic = mutation({
|
|
|
1002
1394
|
},
|
|
1003
1395
|
returns: permissiveReturn,
|
|
1004
1396
|
handler: async (ctx, args) => {
|
|
1005
|
-
const targetTopic = await ctx.db.get(args.targetTopicId);
|
|
1397
|
+
const targetTopic = await ctx.db.get(topicId(args.targetTopicId));
|
|
1006
1398
|
if (!targetTopic) {
|
|
1007
1399
|
throw new Error(`Target topic not found: ${args.targetTopicId}`);
|
|
1008
1400
|
}
|
|
@@ -1011,8 +1403,8 @@ var reassignBeliefsTopic = mutation({
|
|
|
1011
1403
|
const now = Date.now();
|
|
1012
1404
|
const movedBeliefIds = /* @__PURE__ */ new Set();
|
|
1013
1405
|
for (const beliefNodeId of args.beliefNodeIds) {
|
|
1014
|
-
const node = await ctx.db.get(beliefNodeId);
|
|
1015
|
-
if (
|
|
1406
|
+
const node = readEpistemicNodeBackfillRow(await ctx.db.get(beliefNodeId));
|
|
1407
|
+
if (node?.nodeType !== "belief") {
|
|
1016
1408
|
skipped++;
|
|
1017
1409
|
continue;
|
|
1018
1410
|
}
|
|
@@ -1026,40 +1418,14 @@ var reassignBeliefsTopic = mutation({
|
|
|
1026
1418
|
let connectedReassigned = 0;
|
|
1027
1419
|
const alreadyReassigned = /* @__PURE__ */ new Set();
|
|
1028
1420
|
for (const beliefId of movedBeliefIds) {
|
|
1029
|
-
const
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
}
|
|
1038
|
-
for (const connectedId of connectedNodeIds) {
|
|
1039
|
-
if (movedBeliefIds.has(connectedId) || alreadyReassigned.has(connectedId)) {
|
|
1040
|
-
continue;
|
|
1041
|
-
}
|
|
1042
|
-
try {
|
|
1043
|
-
const connectedNode = await ctx.db.get(connectedId);
|
|
1044
|
-
if (!connectedNode || connectedNode.status !== "active") continue;
|
|
1045
|
-
if (connectedNode.topicId && String(connectedNode.topicId) !== String(args.targetTopicId)) {
|
|
1046
|
-
await ctx.db.patch(connectedId, {
|
|
1047
|
-
topicId: args.targetTopicId,
|
|
1048
|
-
updatedAt: now
|
|
1049
|
-
});
|
|
1050
|
-
alreadyReassigned.add(connectedId);
|
|
1051
|
-
connectedReassigned++;
|
|
1052
|
-
}
|
|
1053
|
-
} catch (error) {
|
|
1054
|
-
debugGraphPrimitiveFallback(
|
|
1055
|
-
"[epistemicBeliefs] Failed to reassign connected node",
|
|
1056
|
-
{
|
|
1057
|
-
error,
|
|
1058
|
-
connectedId
|
|
1059
|
-
}
|
|
1060
|
-
);
|
|
1061
|
-
}
|
|
1062
|
-
}
|
|
1421
|
+
const connectedNodeIds = await collectConnectedNodeIds(ctx, beliefId);
|
|
1422
|
+
connectedReassigned += await reassignConnectedBeliefNeighbors(ctx, {
|
|
1423
|
+
alreadyReassigned,
|
|
1424
|
+
connectedNodeIds,
|
|
1425
|
+
movedBeliefIds,
|
|
1426
|
+
now,
|
|
1427
|
+
targetTopicId: args.targetTopicId
|
|
1428
|
+
});
|
|
1063
1429
|
}
|
|
1064
1430
|
return { reassigned, skipped, connectedReassigned };
|
|
1065
1431
|
}
|