@lucern/graph-primitives 1.0.28 → 1.0.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{beliefDecay-DZ6tkLYq.d.ts → beliefDecay-BmkEk5OJ.d.ts} +3 -3
- package/dist/beliefDecay.d.ts +1 -1
- package/dist/beliefDecay.js +448 -314
- package/dist/beliefDecay.js.map +1 -1
- package/dist/{beliefEvidenceLinks-CWOXxxJg.d.ts → beliefEvidenceLinks-BzfjON_6.d.ts} +13 -13
- package/dist/beliefEvidenceLinks.d.ts +1 -1
- package/dist/beliefEvidenceLinks.js +843 -624
- package/dist/beliefEvidenceLinks.js.map +1 -1
- package/dist/beliefEvidenceLinks.operational.d.ts +7 -5
- package/dist/beliefEvidenceLinks.operational.js +91 -18
- package/dist/beliefEvidenceLinks.operational.js.map +1 -1
- package/dist/beliefLifecycle.js.map +1 -1
- package/dist/confidencePropagationDispatch.d.ts +28 -27
- package/dist/confidencePropagationDispatch.js +157 -99
- package/dist/confidencePropagationDispatch.js.map +1 -1
- package/dist/{contradictions-51VLsESq.d.ts → contradictions-BATPuZTL.d.ts} +10 -10
- package/dist/contradictions.d.ts +1 -1
- package/dist/contradictions.js +398 -228
- package/dist/contradictions.js.map +1 -1
- package/dist/convex.d.ts +65 -30
- package/dist/convex.js +7 -3
- package/dist/convex.js.map +1 -1
- package/dist/debug.js.map +1 -1
- package/dist/edgeValidation.js +293 -85
- package/dist/edgeValidation.js.map +1 -1
- package/dist/edges/contains.d.ts +1 -1
- package/dist/edges/contains.js.map +1 -1
- package/dist/edges/contradicts.d.ts +1 -1
- package/dist/edges/contradicts.js.map +1 -1
- package/dist/edges/{dependsOn.d.ts → depends-on.d.ts} +1 -1
- package/dist/edges/{dependsOn.js → depends-on.js} +4 -4
- package/dist/edges/depends-on.js.map +1 -0
- package/dist/edges/{derivedFrom.d.ts → derived-from.d.ts} +1 -1
- package/dist/edges/{derivedFrom.js → derived-from.js} +3 -3
- package/dist/edges/derived-from.js.map +1 -0
- package/dist/edges/elaborates.d.ts +1 -1
- package/dist/edges/elaborates.js.map +1 -1
- package/dist/edges/index.d.ts +7 -3
- package/dist/edges/index.js +7 -4
- package/dist/edges/index.js.map +1 -1
- package/dist/edges/informs.d.ts +1 -1
- package/dist/edges/informs.js.map +1 -1
- package/dist/edges/{propagationTypes.d.ts → propagation-types.d.ts} +14 -14
- package/dist/edges/{propagationTypes.js → propagation-types.js} +3 -3
- package/dist/edges/propagation-types.js.map +1 -0
- package/dist/edges/refutes.d.ts +1 -1
- package/dist/edges/refutes.js.map +1 -1
- package/dist/edges/supports.d.ts +1 -1
- package/dist/edges/supports.js.map +1 -1
- package/dist/edges/tests.d.ts +1 -1
- package/dist/edges/tests.js.map +1 -1
- package/dist/edges/utils.d.ts +1 -1
- package/dist/edges/utils.js.map +1 -1
- package/dist/embeddingTrigger.d.ts +14 -6
- package/dist/embeddingTrigger.js +11 -14
- package/dist/embeddingTrigger.js.map +1 -1
- package/dist/{entityBridge-DMaKooYn.d.ts → entityBridge-BhVDM3pc.d.ts} +5 -5
- package/dist/entityBridge.d.ts +1 -1
- package/dist/entityBridge.js +602 -225
- package/dist/entityBridge.js.map +1 -1
- package/dist/entityCanonicalMatch.d.ts +14 -12
- package/dist/entityCanonicalMatch.js.map +1 -1
- package/dist/{entityLifecycle-CvgSK5FV.d.ts → entityLifecycle-BsfCz9pS.d.ts} +5 -9
- package/dist/entityLifecycle.d.ts +1 -1
- package/dist/entityLifecycle.js +857 -515
- package/dist/entityLifecycle.js.map +1 -1
- package/dist/{entityValidation-KLZ_Xl2D.d.ts → entityValidation-B1yNEHJx.d.ts} +7 -6
- package/dist/entityValidation.d.ts +3 -1
- package/dist/entityValidation.js +60 -8
- package/dist/entityValidation.js.map +1 -1
- package/dist/{epistemicAnswers-C5ib4z6_.d.ts → epistemicAnswers-f47YMu9U.d.ts} +6 -6
- package/dist/epistemicAnswers.d.ts +1 -1
- package/dist/epistemicAnswers.js +587 -545
- package/dist/epistemicAnswers.js.map +1 -1
- package/dist/epistemicBeliefs.admin.d.ts +8 -8
- package/dist/epistemicBeliefs.admin.js +366 -203
- package/dist/epistemicBeliefs.admin.js.map +1 -1
- package/dist/epistemicBeliefs.backfills.d.ts +8 -8
- package/dist/epistemicBeliefs.backfills.js +655 -308
- package/dist/epistemicBeliefs.backfills.js.map +1 -1
- package/dist/epistemicBeliefs.confidence.d.ts +19 -14
- package/dist/epistemicBeliefs.confidence.js +634 -423
- package/dist/epistemicBeliefs.confidence.js.map +1 -1
- package/dist/epistemicBeliefs.core.d.ts +6 -6
- package/dist/epistemicBeliefs.core.js +719 -411
- package/dist/epistemicBeliefs.core.js.map +1 -1
- package/dist/epistemicBeliefs.d.ts +11 -8
- package/dist/epistemicBeliefs.forkEvidence.d.ts +2 -0
- package/dist/epistemicBeliefs.forkEvidence.js +8 -28
- package/dist/epistemicBeliefs.forkEvidence.js.map +1 -1
- package/dist/epistemicBeliefs.helpers.d.ts +69 -74
- package/dist/epistemicBeliefs.helpers.js +359 -248
- package/dist/epistemicBeliefs.helpers.js.map +1 -1
- package/dist/epistemicBeliefs.internal.d.ts +5 -5
- package/dist/epistemicBeliefs.internal.js +1246 -1044
- package/dist/epistemicBeliefs.internal.js.map +1 -1
- package/dist/epistemicBeliefs.js +4922 -3608
- package/dist/epistemicBeliefs.js.map +1 -1
- package/dist/epistemicBeliefs.lifecycle.d.ts +5 -5
- package/dist/epistemicBeliefs.lifecycle.js +1137 -818
- package/dist/epistemicBeliefs.lifecycle.js.map +1 -1
- package/dist/epistemicBeliefs.links.d.ts +7 -7
- package/dist/epistemicBeliefs.links.js +408 -307
- package/dist/epistemicBeliefs.links.js.map +1 -1
- package/dist/epistemicBeliefs.queries.d.ts +4 -4
- package/dist/epistemicBeliefs.queries.js +175 -20
- package/dist/epistemicBeliefs.queries.js.map +1 -1
- package/dist/epistemicBeliefs.topicAnchor.d.ts +6 -4
- package/dist/epistemicBeliefs.topicAnchor.js +12 -5
- package/dist/epistemicBeliefs.topicAnchor.js.map +1 -1
- package/dist/epistemicContracts.d.ts +28 -3
- package/dist/epistemicContracts.evaluators.d.ts +2 -0
- package/dist/epistemicContracts.evaluators.js +1063 -613
- package/dist/epistemicContracts.evaluators.js.map +1 -1
- package/dist/epistemicContracts.handlers.d.ts +15 -32
- package/dist/epistemicContracts.handlers.js +2086 -1644
- package/dist/epistemicContracts.handlers.js.map +1 -1
- package/dist/epistemicContracts.js +1131 -672
- package/dist/epistemicContracts.js.map +1 -1
- package/dist/epistemicContracts.metrics.d.ts +2 -0
- package/dist/epistemicContracts.metrics.js +375 -158
- package/dist/epistemicContracts.metrics.js.map +1 -1
- package/dist/epistemicContracts.types.d.ts +87 -81
- package/dist/epistemicEdgeCreation.d.ts +2 -0
- package/dist/epistemicEdgeCreation.js +87 -16
- package/dist/epistemicEdgeCreation.js.map +1 -1
- package/dist/{epistemicEdges-BF-cn4i3.d.ts → epistemicEdges-BGBh0QSP.d.ts} +4 -7
- package/dist/epistemicEdges.d.ts +6 -5
- package/dist/epistemicEdges.handlers.d.ts +3 -3
- package/dist/epistemicEdges.handlers.js +129 -24
- package/dist/epistemicEdges.handlers.js.map +1 -1
- package/dist/epistemicEdges.helpers.d.ts +6 -4
- package/dist/epistemicEdges.helpers.js +37 -2
- package/dist/epistemicEdges.helpers.js.map +1 -1
- package/dist/epistemicEdges.js +1969 -1205
- package/dist/epistemicEdges.js.map +1 -1
- package/dist/epistemicEdges.mutations.d.ts +7 -7
- package/dist/epistemicEdges.mutations.js +960 -583
- package/dist/epistemicEdges.mutations.js.map +1 -1
- package/dist/epistemicEdges.queries.d.ts +16 -16
- package/dist/epistemicEdges.queries.js +639 -367
- package/dist/epistemicEdges.queries.js.map +1 -1
- package/dist/epistemicEdges.types.d.ts +10 -8
- package/dist/epistemicEvidence.d.ts +4 -1
- package/dist/epistemicEvidence.js +937 -536
- package/dist/epistemicEvidence.js.map +1 -1
- package/dist/epistemicEvidenceHelpers.d.ts +26 -10
- package/dist/epistemicEvidenceHelpers.js +239 -200
- package/dist/epistemicEvidenceHelpers.js.map +1 -1
- package/dist/epistemicEvidenceMutations.d.ts +8 -8
- package/dist/epistemicEvidenceMutations.js +844 -696
- package/dist/epistemicEvidenceMutations.js.map +1 -1
- package/dist/epistemicEvidenceQueries.d.ts +8 -8
- package/dist/epistemicEvidenceQueries.js +514 -238
- package/dist/epistemicEvidenceQueries.js.map +1 -1
- package/dist/epistemicHelpers.d.ts +4 -2
- package/dist/epistemicHelpers.js +308 -134
- package/dist/epistemicHelpers.js.map +1 -1
- package/dist/epistemicInsert.d.ts +16 -4
- package/dist/epistemicInsert.js +6 -3
- package/dist/epistemicInsert.js.map +1 -1
- package/dist/epistemicLayerRules.d.ts +10 -8
- package/dist/epistemicLayerRules.js +1 -5
- package/dist/epistemicLayerRules.js.map +1 -1
- package/dist/{epistemicLinking-CfE00tHJ.d.ts → epistemicLinking-CsCDv2cN.d.ts} +3 -3
- package/dist/epistemicLinking.d.ts +1 -1
- package/dist/epistemicLinking.js +177 -100
- package/dist/epistemicLinking.js.map +1 -1
- package/dist/epistemicNodeCreation.d.ts +2 -0
- package/dist/epistemicNodeCreation.js +203 -40
- package/dist/epistemicNodeCreation.js.map +1 -1
- package/dist/{epistemicNodes-BCQxpYx_.d.ts → epistemicNodes-CokAgBHg.d.ts} +3 -3
- package/dist/epistemicNodes.d.ts +3 -3
- package/dist/epistemicNodes.helpers.d.ts +24 -15
- package/dist/epistemicNodes.helpers.js.map +1 -1
- package/dist/epistemicNodes.internal.d.ts +6 -6
- package/dist/epistemicNodes.internal.js +389 -319
- package/dist/epistemicNodes.internal.js.map +1 -1
- package/dist/epistemicNodes.js +704 -508
- package/dist/epistemicNodes.js.map +1 -1
- package/dist/epistemicNodes.mutations.d.ts +6 -6
- package/dist/epistemicNodes.mutations.js +564 -467
- package/dist/epistemicNodes.mutations.js.map +1 -1
- package/dist/epistemicNodes.queries.d.ts +8 -8
- package/dist/epistemicNodes.queries.js +311 -314
- package/dist/epistemicNodes.queries.js.map +1 -1
- package/dist/epistemicNodes.validators.d.ts +2 -2
- package/dist/epistemicNodes.validators.js.map +1 -1
- package/dist/epistemicQuestions.conviction.d.ts +8 -8
- package/dist/epistemicQuestions.conviction.js +665 -484
- package/dist/epistemicQuestions.conviction.js.map +1 -1
- package/dist/epistemicQuestions.create.d.ts +4 -4
- package/dist/epistemicQuestions.create.js +640 -612
- package/dist/epistemicQuestions.create.js.map +1 -1
- package/dist/epistemicQuestions.d.ts +8 -5
- package/dist/epistemicQuestions.evidence.d.ts +2 -2
- package/dist/epistemicQuestions.evidence.js +475 -383
- package/dist/epistemicQuestions.evidence.js.map +1 -1
- package/dist/epistemicQuestions.helpers.d.ts +125 -24
- package/dist/epistemicQuestions.helpers.js +240 -209
- package/dist/epistemicQuestions.helpers.js.map +1 -1
- package/dist/epistemicQuestions.js +3474 -2823
- package/dist/epistemicQuestions.js.map +1 -1
- package/dist/epistemicQuestions.lifecycle.d.ts +2 -2
- package/dist/epistemicQuestions.lifecycle.js +607 -546
- package/dist/epistemicQuestions.lifecycle.js.map +1 -1
- package/dist/epistemicQuestions.queries.d.ts +12 -7
- package/dist/epistemicQuestions.queries.js +305 -244
- package/dist/epistemicQuestions.queries.js.map +1 -1
- package/dist/epistemicQuestions.sprint.d.ts +2 -2
- package/dist/epistemicQuestions.sprint.js +600 -394
- package/dist/epistemicQuestions.sprint.js.map +1 -1
- package/dist/epistemicQuestions.tail.d.ts +6 -6
- package/dist/epistemicQuestions.tail.js +572 -433
- package/dist/epistemicQuestions.tail.js.map +1 -1
- package/dist/{epistemicSources-dlKj58Jp.d.ts → epistemicSources-DQtaEkWs.d.ts} +4 -4
- package/dist/epistemicSources.d.ts +1 -1
- package/dist/epistemicSources.js +352 -312
- package/dist/epistemicSources.js.map +1 -1
- package/dist/evaluators/index.d.ts +8 -6
- package/dist/evaluators/index.js +399 -167
- package/dist/evaluators/index.js.map +1 -1
- package/dist/evaluators/lint-checker-evaluator.d.ts +16 -0
- package/dist/evaluators/{lintCheckerEvaluator.js → lint-checker-evaluator.js} +10 -5
- package/dist/evaluators/lint-checker-evaluator.js.map +1 -0
- package/dist/evaluators/{sentryCheckerEvaluator.d.ts → sentry-checker-evaluator.d.ts} +7 -2
- package/dist/evaluators/{sentryCheckerEvaluator.js → sentry-checker-evaluator.js} +3 -3
- package/dist/evaluators/sentry-checker-evaluator.js.map +1 -0
- package/dist/evaluators/shared.d.ts +2 -2
- package/dist/evaluators/shared.js +3 -1
- package/dist/evaluators/shared.js.map +1 -1
- package/dist/evaluators/{testRunnerEvaluator.d.ts → test-runner-evaluator.d.ts} +6 -1
- package/dist/evaluators/{testRunnerEvaluator.js → test-runner-evaluator.js} +6 -4
- package/dist/evaluators/test-runner-evaluator.js.map +1 -0
- package/dist/evaluators/tsc-checker-evaluator.d.ts +16 -0
- package/dist/evaluators/{tscCheckerEvaluator.js → tsc-checker-evaluator.js} +10 -5
- package/dist/evaluators/tsc-checker-evaluator.js.map +1 -0
- package/dist/graphTypes.js +6 -2
- package/dist/graphTypes.js.map +1 -1
- package/dist/helpers.d.ts +2 -0
- package/dist/helpers.js +313 -93
- package/dist/helpers.js.map +1 -1
- package/dist/{index-C-Kyd7hD.d.ts → index-DZxyC9Pb.d.ts} +7 -6
- package/dist/index.d.ts +87 -83
- package/dist/index.js +15677 -10594
- package/dist/index.js.map +1 -1
- package/dist/invariantEnforcement.d.ts +3 -3
- package/dist/invariantEnforcement.js.map +1 -1
- package/dist/logicalRoleInference.d.ts +2 -0
- package/dist/logicalRoleInference.js +1 -1
- package/dist/logicalRoleInference.js.map +1 -1
- package/dist/matcherFeedbackUtils.d.ts +2 -2
- package/dist/matcherFeedbackUtils.js.map +1 -1
- package/dist/{ontology-matching-C6rrz2VP.d.ts → ontology-matching-C-mYFrir.d.ts} +16 -16
- package/dist/ontology-matching.d.ts +1 -1
- package/dist/{ontologyApproval-CFYmqKmk.d.ts → ontologyApproval-BVt0feJi.d.ts} +10 -10
- package/dist/ontologyApproval.d.ts +1 -1
- package/dist/ontologyApproval.js +7 -1
- package/dist/ontologyApproval.js.map +1 -1
- package/dist/ontologyDefinitions.d.ts +14 -24
- package/dist/ontologyDefinitions.js +269 -34
- package/dist/ontologyDefinitions.js.map +1 -1
- package/dist/ontologyHelpers.d.ts +13 -13
- package/dist/ontologyHelpers.js.map +1 -1
- package/dist/{ontologyRegistry-B67rPJ16.d.ts → ontologyRegistry-CljS-ENv.d.ts} +2 -2
- package/dist/ontologyRegistry.d.ts +1 -1
- package/dist/ontologyRegistry.js +34 -6
- package/dist/ontologyRegistry.js.map +1 -1
- package/dist/{projectionReconciliation-jww2fBI0.d.ts → projectionReconciliation-DnrSgHSQ.d.ts} +4 -4
- package/dist/projectionReconciliation.d.ts +1 -1
- package/dist/projectionReconciliation.js +57 -10
- package/dist/projectionReconciliation.js.map +1 -1
- package/dist/{projectionStaleness-CmdbpjVK.d.ts → projectionStaleness-C8ImQ2zP.d.ts} +17 -17
- package/dist/projectionStaleness.d.ts +1 -1
- package/dist/projectionStaleness.js +8 -2
- package/dist/projectionStaleness.js.map +1 -1
- package/dist/proof-attestation.json +1 -1
- package/dist/{questionEvidenceLinks-DFlyPpAj.d.ts → questionEvidenceLinks-_nPRa-LY.d.ts} +10 -10
- package/dist/questionEvidenceLinks.d.ts +1 -1
- package/dist/questionEvidenceLinks.js +564 -347
- package/dist/questionEvidenceLinks.js.map +1 -1
- package/dist/{resolverTypes-CC8Ea2E2.d.ts → resolverTypes-BOXPxLET.d.ts} +8 -7
- package/dist/resolverTypes.d.ts +4 -2
- package/dist/{resolvers-Br1a6eLV.d.ts → resolvers-B1TIBmRO.d.ts} +3 -1
- package/dist/resolvers.d.ts +5 -3
- package/dist/resolvers.js +121 -77
- package/dist/resolvers.js.map +1 -1
- package/dist/scopeResolverCompat.d.ts +10 -7
- package/dist/scopeResolverCompat.js +106 -123
- package/dist/scopeResolverCompat.js.map +1 -1
- package/dist/{text-matching-DNg4M5Wd.d.ts → text-matching-DzFooju6.d.ts} +7 -7
- package/dist/text-matching.d.ts +1 -1
- package/dist/topicOntologyResolver.d.ts +22 -21
- package/dist/topicOntologyResolver.js +54 -32
- package/dist/topicOntologyResolver.js.map +1 -1
- package/dist/topicProjectOverlay.d.ts +30 -20
- package/dist/topicProjectOverlay.js +120 -76
- package/dist/topicProjectOverlay.js.map +1 -1
- package/dist/{topicScope-7zhyeGl7.d.ts → topicScope-DJVa0mLa.d.ts} +22 -7
- package/dist/topicScope.d.ts +3 -1
- package/dist/topicScope.js +104 -119
- package/dist/topicScope.js.map +1 -1
- package/dist/workflowBridge.d.ts +26 -15
- package/dist/workflowBridge.js +140 -144
- package/dist/workflowBridge.js.map +1 -1
- package/dist/workspaceIsolation.d.ts +14 -12
- package/dist/workspaceIsolation.js +108 -122
- package/dist/workspaceIsolation.js.map +1 -1
- package/package.json +4 -4
- package/dist/edges/dependsOn.js.map +0 -1
- package/dist/edges/derivedFrom.js.map +0 -1
- package/dist/edges/propagationTypes.js.map +0 -1
- package/dist/evaluators/lintCheckerEvaluator.d.ts +0 -11
- package/dist/evaluators/lintCheckerEvaluator.js.map +0 -1
- package/dist/evaluators/sentryCheckerEvaluator.js.map +0 -1
- package/dist/evaluators/testRunnerEvaluator.js.map +0 -1
- package/dist/evaluators/tscCheckerEvaluator.d.ts +0 -11
- package/dist/evaluators/tscCheckerEvaluator.js.map +0 -1
- package/dist/{epistemicQuestions-bwHd2FWE.d.ts → epistemicQuestions-Do1fhYm5.d.ts} +4 -4
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import { v, ConvexError } from 'convex/values';
|
|
2
|
-
import { normalizeTupleContradictionPolicy, confidenceFromSL, readOpinionFromRecord, mkOpinion } from '@lucern/confidence';
|
|
3
|
-
import { checkProjectAccess } from '@lucern/access-control/access';
|
|
4
1
|
import { normalizeAudienceKey, classFromAudienceKey } from '@lucern/access-control/audience';
|
|
5
2
|
import { getCurrentUserId } from '@lucern/access-control/auth';
|
|
6
|
-
import {
|
|
3
|
+
import { throwStructuredMutationError } from '@lucern/access-control/structuredMutationError';
|
|
4
|
+
export { throwStructuredMutationError } from '@lucern/access-control/structuredMutationError';
|
|
5
|
+
import { normalizeTupleContradictionPolicy, confidenceFromSL, readOpinionFromRecord, mkOpinion } from '@lucern/confidence';
|
|
6
|
+
import { v } from 'convex/values';
|
|
7
|
+
import { unsafeConvexAnyApi } from '@lucern/contracts/convex/unsafeAnyApi';
|
|
8
|
+
import { componentsGeneric } from 'convex/server';
|
|
7
9
|
import '@lucern/contracts/schema-helpers/spine/tables/epistemicNodes';
|
|
8
10
|
|
|
9
11
|
// src/epistemicBeliefs.helpers.ts
|
|
@@ -118,9 +120,12 @@ function resolveBeliefLifecycleStatus(opts) {
|
|
|
118
120
|
function isPreValidationBeliefStatus(status) {
|
|
119
121
|
return status === "assumption" || status === "hypothesis";
|
|
120
122
|
}
|
|
121
|
-
var
|
|
123
|
+
var unsafeApi = unsafeConvexAnyApi(
|
|
124
|
+
"graph-primitives top-level module bundle lacks a committed Convex _generated/api surface"
|
|
125
|
+
);
|
|
126
|
+
var api = unsafeApi;
|
|
122
127
|
componentsGeneric();
|
|
123
|
-
var internal =
|
|
128
|
+
var internal = unsafeApi;
|
|
124
129
|
|
|
125
130
|
// src/debug.ts
|
|
126
131
|
function isGraphPrimitiveDebugEnabled() {
|
|
@@ -152,6 +157,10 @@ function readStringArray(value) {
|
|
|
152
157
|
function readMetadata(topic) {
|
|
153
158
|
return topic.metadata && typeof topic.metadata === "object" ? topic.metadata : {};
|
|
154
159
|
}
|
|
160
|
+
function omitMetadataKey(metadata, key) {
|
|
161
|
+
const { [key]: _omitted, ...rest } = metadata;
|
|
162
|
+
return rest;
|
|
163
|
+
}
|
|
155
164
|
function readLegacyProjectId(value) {
|
|
156
165
|
if (!value) {
|
|
157
166
|
return;
|
|
@@ -232,9 +241,12 @@ async function resolveTopicDoc(ctx, scopeId) {
|
|
|
232
241
|
);
|
|
233
242
|
}
|
|
234
243
|
try {
|
|
235
|
-
const topic = await ctx.runQuery(
|
|
236
|
-
|
|
237
|
-
|
|
244
|
+
const topic = await ctx.runQuery(
|
|
245
|
+
api.topics.getByLegacyScopeId,
|
|
246
|
+
{
|
|
247
|
+
projectId: String(scopeId)
|
|
248
|
+
}
|
|
249
|
+
);
|
|
238
250
|
if (topic?.name !== void 0 && topic?.type !== void 0) {
|
|
239
251
|
return topic;
|
|
240
252
|
}
|
|
@@ -254,8 +266,18 @@ function materializeTopicProjectOverlay(topic, idMode = "legacy") {
|
|
|
254
266
|
const outwardId = idMode === "topic" ? topicId : storageProjectId;
|
|
255
267
|
const visibility = coerceVisibility(topic.visibility) || coerceVisibility(metadata.visibility) || "private";
|
|
256
268
|
const status = coerceStatus(topic.status) || coerceStatus(metadata.status) || "active";
|
|
257
|
-
|
|
258
|
-
|
|
269
|
+
let createdAt = 0;
|
|
270
|
+
if (typeof topic.createdAt === "number") {
|
|
271
|
+
createdAt = topic.createdAt;
|
|
272
|
+
} else if (typeof topic._creationTime === "number") {
|
|
273
|
+
createdAt = topic._creationTime;
|
|
274
|
+
}
|
|
275
|
+
let updatedAt = createdAt;
|
|
276
|
+
if (typeof topic.updatedAt === "number") {
|
|
277
|
+
updatedAt = topic.updatedAt;
|
|
278
|
+
} else if (typeof metadata.updatedAt === "number") {
|
|
279
|
+
updatedAt = metadata.updatedAt;
|
|
280
|
+
}
|
|
259
281
|
return {
|
|
260
282
|
...metadata,
|
|
261
283
|
_id: outwardId,
|
|
@@ -324,90 +346,113 @@ async function patchTopicProjectOverlay(ctx, scopeId, value) {
|
|
|
324
346
|
if (!topic) {
|
|
325
347
|
return null;
|
|
326
348
|
}
|
|
327
|
-
const
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
349
|
+
const plan = buildTopicProjectOverlayPatchPlan(topic, value);
|
|
350
|
+
await applyTopicProjectOverlayPatch(ctx, topic, plan);
|
|
351
|
+
return materializeTopicProjectOverlay({
|
|
352
|
+
...topic,
|
|
353
|
+
...plan.patch,
|
|
354
|
+
metadata: plan.nextMetadata
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
function buildTopicProjectOverlayPatchPlan(topic, value) {
|
|
358
|
+
const plan = {
|
|
359
|
+
nextMetadata: { ...readMetadata(topic) },
|
|
360
|
+
patch: {},
|
|
361
|
+
topicUpdateArgs: {
|
|
362
|
+
id: String(topic._id)
|
|
363
|
+
}
|
|
331
364
|
};
|
|
332
365
|
for (const [key, rawValue] of Object.entries(value)) {
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
366
|
+
applyTopicProjectOverlayPatchEntry(plan, key, rawValue);
|
|
367
|
+
}
|
|
368
|
+
plan.patch.updatedAt = Date.now();
|
|
369
|
+
plan.patch.metadata = plan.nextMetadata;
|
|
370
|
+
plan.topicUpdateArgs.metadata = plan.nextMetadata;
|
|
371
|
+
return plan;
|
|
372
|
+
}
|
|
373
|
+
function applyTopicProjectOverlayPatchEntry(plan, key, rawValue) {
|
|
374
|
+
switch (key) {
|
|
375
|
+
case "_id":
|
|
376
|
+
case "projectId":
|
|
377
|
+
case "topicId":
|
|
378
|
+
case "legacyProjectId":
|
|
379
|
+
case "storageProjectId":
|
|
380
|
+
case "updatedAt":
|
|
381
|
+
case "createdAt":
|
|
382
|
+
return;
|
|
383
|
+
case "name":
|
|
384
|
+
case "description":
|
|
385
|
+
plan.patch[key] = rawValue;
|
|
386
|
+
plan.topicUpdateArgs[key] = rawValue;
|
|
387
|
+
return;
|
|
388
|
+
case "tenantId":
|
|
389
|
+
case "workspaceId":
|
|
390
|
+
case "ownerId":
|
|
391
|
+
throw new Error(
|
|
392
|
+
`patchTopicProjectOverlay cannot mutate ${key} via component-owned topics`
|
|
393
|
+
);
|
|
394
|
+
case "status":
|
|
395
|
+
applyTopicStatusPatch(plan, rawValue);
|
|
396
|
+
return;
|
|
397
|
+
case "visibility":
|
|
398
|
+
applyTopicVisibilityPatch(plan, rawValue);
|
|
399
|
+
return;
|
|
400
|
+
case "type":
|
|
401
|
+
applyTopicProjectTypePatch(plan, rawValue);
|
|
402
|
+
return;
|
|
403
|
+
default:
|
|
404
|
+
applyTopicMetadataPatch(plan, key, rawValue);
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
function applyTopicStatusPatch(plan, rawValue) {
|
|
408
|
+
const status = coerceStatus(rawValue);
|
|
409
|
+
if (status) {
|
|
410
|
+
plan.patch.status = status;
|
|
411
|
+
plan.topicUpdateArgs.status = status;
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
function applyTopicVisibilityPatch(plan, rawValue) {
|
|
415
|
+
const visibility = coerceVisibility(rawValue);
|
|
416
|
+
if (visibility) {
|
|
417
|
+
plan.patch.visibility = visibility;
|
|
418
|
+
plan.topicUpdateArgs.visibility = visibility;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
function applyTopicProjectTypePatch(plan, rawValue) {
|
|
422
|
+
const projectType = readNonEmptyString(rawValue);
|
|
423
|
+
if (projectType) {
|
|
424
|
+
plan.nextMetadata.projectType = projectType;
|
|
425
|
+
return;
|
|
386
426
|
}
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
427
|
+
plan.nextMetadata = omitMetadataKey(plan.nextMetadata, "projectType");
|
|
428
|
+
}
|
|
429
|
+
function applyTopicMetadataPatch(plan, key, rawValue) {
|
|
430
|
+
if (rawValue === void 0) {
|
|
431
|
+
plan.nextMetadata = omitMetadataKey(plan.nextMetadata, key);
|
|
432
|
+
return;
|
|
433
|
+
}
|
|
434
|
+
plan.nextMetadata[key] = rawValue;
|
|
435
|
+
}
|
|
436
|
+
async function applyTopicProjectOverlayPatch(ctx, topic, plan) {
|
|
390
437
|
if (typeof ctx.runMutation === "function") {
|
|
391
438
|
try {
|
|
392
|
-
await ctx.runMutation(api.topics.update, topicUpdateArgs);
|
|
439
|
+
await ctx.runMutation(api.topics.update, plan.topicUpdateArgs);
|
|
393
440
|
} catch (error) {
|
|
394
|
-
if (!
|
|
441
|
+
if (!canPatchTopicViaLocalDb(ctx, error)) {
|
|
395
442
|
throw error;
|
|
396
443
|
}
|
|
397
|
-
await ctx.db.patch(
|
|
444
|
+
await ctx.db.patch(topic._id, plan.patch);
|
|
398
445
|
}
|
|
399
446
|
} else if (ctx?.db && typeof ctx.db.patch === "function") {
|
|
400
|
-
await ctx.db.patch(
|
|
447
|
+
await ctx.db.patch(topic._id, plan.patch);
|
|
401
448
|
} else {
|
|
402
449
|
throw new Error(
|
|
403
450
|
"Cannot patch topic without component adapter (ctx.runMutation unavailable)"
|
|
404
451
|
);
|
|
405
452
|
}
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
metadata: nextMetadata
|
|
410
|
-
});
|
|
453
|
+
}
|
|
454
|
+
function canPatchTopicViaLocalDb(ctx, error) {
|
|
455
|
+
return isMissingLucernChildComponentError(error) && Boolean(ctx?.db) && typeof ctx.db?.patch === "function";
|
|
411
456
|
}
|
|
412
457
|
|
|
413
458
|
// src/resolvers.ts
|
|
@@ -435,7 +480,7 @@ async function patchProjectWithTolerance(ctx, projectId, value) {
|
|
|
435
480
|
try {
|
|
436
481
|
await patchTopicProjectOverlay(ctx, projectId, value);
|
|
437
482
|
} catch (error) {
|
|
438
|
-
if (!isAdvisoryTopicPatch(value)
|
|
483
|
+
if (!(isAdvisoryTopicPatch(value) && isMissingLucernChildComponentError2(error))) {
|
|
439
484
|
throw error;
|
|
440
485
|
}
|
|
441
486
|
console.warn(
|
|
@@ -502,13 +547,15 @@ function asMappedProjectId(topic) {
|
|
|
502
547
|
if (!topic) {
|
|
503
548
|
return;
|
|
504
549
|
}
|
|
505
|
-
const directLegacyProjectId = normalizeScopeValue(
|
|
550
|
+
const directLegacyProjectId = normalizeScopeValue(
|
|
551
|
+
topic[LEGACY_SCOPE_FIELD2]
|
|
552
|
+
);
|
|
506
553
|
if (directLegacyProjectId) {
|
|
507
554
|
return directLegacyProjectId;
|
|
508
555
|
}
|
|
509
556
|
const metadata = topic.metadata || {};
|
|
510
557
|
const candidate = metadata[LEGACY_SCOPE_FIELD2] || metadata.legacyProjectId || metadata.projectId || metadata.scopeProjectId;
|
|
511
|
-
return candidate ? candidate : void 0;
|
|
558
|
+
return typeof candidate === "string" ? normalizeScopeValue(candidate) : void 0;
|
|
512
559
|
}
|
|
513
560
|
function normalizeScopeValue(value) {
|
|
514
561
|
if (typeof value !== "string") {
|
|
@@ -533,8 +580,9 @@ function pickPrimaryTopic(candidates) {
|
|
|
533
580
|
})[0];
|
|
534
581
|
}
|
|
535
582
|
async function findTopicsByScopeAlias(ctx, scopeId) {
|
|
583
|
+
const query = ctx.db.query("topics");
|
|
536
584
|
try {
|
|
537
|
-
return await
|
|
585
|
+
return await query.withIndex(
|
|
538
586
|
"by_graph_scope_project",
|
|
539
587
|
(q) => q.eq(LEGACY_SCOPE_FIELD2, scopeId)
|
|
540
588
|
).collect();
|
|
@@ -546,7 +594,7 @@ async function findTopicsByScopeAlias(ctx, scopeId) {
|
|
|
546
594
|
scopeId
|
|
547
595
|
}
|
|
548
596
|
);
|
|
549
|
-
const topics = await
|
|
597
|
+
const topics = await query.collect();
|
|
550
598
|
return topics.filter((topic) => {
|
|
551
599
|
const normalizedGlobalId = normalizeScopeValue(topic.globalId);
|
|
552
600
|
const mappedProjectId = asMappedProjectId(topic);
|
|
@@ -602,137 +650,115 @@ async function resolveInheritedWorkspaceScope(ctx, topic) {
|
|
|
602
650
|
let current = topic;
|
|
603
651
|
for (let i = 0; i < MAX_DEPTH && current?.parentTopicId; i++) {
|
|
604
652
|
current = await ctx.db.get(current.parentTopicId);
|
|
605
|
-
if (!current)
|
|
653
|
+
if (!current) {
|
|
654
|
+
break;
|
|
655
|
+
}
|
|
606
656
|
if (!tenantId) {
|
|
607
657
|
tenantId = normalizeScopeValue(current.tenantId);
|
|
608
658
|
}
|
|
609
659
|
if (!workspaceId) {
|
|
610
660
|
workspaceId = normalizeScopeValue(current.workspaceId);
|
|
611
661
|
}
|
|
612
|
-
if (tenantId && workspaceId)
|
|
662
|
+
if (tenantId && workspaceId) {
|
|
663
|
+
break;
|
|
664
|
+
}
|
|
613
665
|
}
|
|
614
666
|
return { tenantId, workspaceId };
|
|
615
667
|
}
|
|
616
668
|
async function resolveTopicProjectScope(ctx, args) {
|
|
617
669
|
if (args.topicId) {
|
|
618
|
-
|
|
619
|
-
try {
|
|
620
|
-
topic = await ctx.db.get(
|
|
621
|
-
args.topicId
|
|
622
|
-
);
|
|
623
|
-
} catch (error) {
|
|
624
|
-
debugGraphPrimitiveFallback(
|
|
625
|
-
"[topicScope] Failed to load topic by direct id",
|
|
626
|
-
{
|
|
627
|
-
error,
|
|
628
|
-
topicId: args.topicId
|
|
629
|
-
}
|
|
630
|
-
);
|
|
631
|
-
}
|
|
632
|
-
if (!topic) {
|
|
633
|
-
topic = await tryResolveHostTopicById(ctx, String(args.topicId));
|
|
634
|
-
}
|
|
635
|
-
if (!topic) {
|
|
636
|
-
topic = pickPrimaryTopic(
|
|
637
|
-
await findTopicsByScopeAlias(ctx, String(args.topicId))
|
|
638
|
-
) ?? null;
|
|
639
|
-
}
|
|
640
|
-
if (!topic) {
|
|
641
|
-
const nodeScope = await resolveTopicNodeScopeOrNull(
|
|
642
|
-
ctx,
|
|
643
|
-
String(args.topicId)
|
|
644
|
-
);
|
|
645
|
-
if (nodeScope) {
|
|
646
|
-
return nodeScope;
|
|
647
|
-
}
|
|
648
|
-
throw new Error(`Topic not found: ${String(args.topicId)}`);
|
|
649
|
-
}
|
|
650
|
-
const inherited = await resolveInheritedWorkspaceScope(ctx, topic);
|
|
651
|
-
const mapped = asMappedProjectId(topic);
|
|
652
|
-
if (mapped) {
|
|
653
|
-
return {
|
|
654
|
-
topicId: topic._id,
|
|
655
|
-
projectId: mapped,
|
|
656
|
-
tenantId: inherited.tenantId,
|
|
657
|
-
workspaceId: inherited.workspaceId,
|
|
658
|
-
source: "topic"
|
|
659
|
-
};
|
|
660
|
-
}
|
|
661
|
-
return {
|
|
662
|
-
topicId: topic._id,
|
|
663
|
-
tenantId: inherited.tenantId,
|
|
664
|
-
workspaceId: inherited.workspaceId,
|
|
665
|
-
source: "topic"
|
|
666
|
-
};
|
|
670
|
+
return await resolveScopeFromTopicId(ctx, args.topicId);
|
|
667
671
|
}
|
|
668
672
|
if (args.projectId) {
|
|
669
|
-
|
|
670
|
-
try {
|
|
671
|
-
directTopic = await ctx.db.get(
|
|
672
|
-
args.projectId
|
|
673
|
-
);
|
|
674
|
-
} catch (error) {
|
|
675
|
-
debugGraphPrimitiveFallback(
|
|
676
|
-
"[topicScope] Failed to load direct project topic",
|
|
677
|
-
{
|
|
678
|
-
error,
|
|
679
|
-
projectId: args.projectId
|
|
680
|
-
}
|
|
681
|
-
);
|
|
682
|
-
}
|
|
683
|
-
if (directTopic) {
|
|
684
|
-
const inherited = await resolveInheritedWorkspaceScope(ctx, directTopic);
|
|
685
|
-
const mapped = asMappedProjectId(directTopic);
|
|
686
|
-
return {
|
|
687
|
-
topicId: directTopic._id,
|
|
688
|
-
projectId: mapped ?? args.projectId,
|
|
689
|
-
tenantId: inherited.tenantId,
|
|
690
|
-
workspaceId: inherited.workspaceId,
|
|
691
|
-
source: "topic_inferred"
|
|
692
|
-
};
|
|
693
|
-
}
|
|
694
|
-
directTopic = await tryResolveHostTopicByLegacyScope(ctx, args.projectId);
|
|
695
|
-
if (directTopic) {
|
|
696
|
-
const inherited = await resolveInheritedWorkspaceScope(ctx, directTopic);
|
|
697
|
-
const mapped = asMappedProjectId(directTopic);
|
|
698
|
-
return {
|
|
699
|
-
topicId: directTopic._id,
|
|
700
|
-
projectId: mapped ?? args.projectId,
|
|
701
|
-
tenantId: inherited.tenantId,
|
|
702
|
-
workspaceId: inherited.workspaceId,
|
|
703
|
-
source: "topic_inferred"
|
|
704
|
-
};
|
|
705
|
-
}
|
|
706
|
-
const topics = await findTopicsByScopeAlias(ctx, args.projectId);
|
|
707
|
-
const primary = pickPrimaryTopic(topics);
|
|
708
|
-
if (primary) {
|
|
709
|
-
const inherited = await resolveInheritedWorkspaceScope(ctx, primary);
|
|
710
|
-
return {
|
|
711
|
-
topicId: primary._id,
|
|
712
|
-
projectId: args.projectId,
|
|
713
|
-
tenantId: inherited.tenantId,
|
|
714
|
-
workspaceId: inherited.workspaceId,
|
|
715
|
-
source: "project_mapped_topic"
|
|
716
|
-
};
|
|
717
|
-
}
|
|
718
|
-
const nodeScope = await resolveTopicNodeScopeOrNull(
|
|
719
|
-
ctx,
|
|
720
|
-
String(args.projectId)
|
|
721
|
-
);
|
|
722
|
-
if (nodeScope) {
|
|
723
|
-
return {
|
|
724
|
-
...nodeScope,
|
|
725
|
-
projectId: nodeScope.projectId ?? String(args.projectId)
|
|
726
|
-
};
|
|
727
|
-
}
|
|
728
|
-
throw new Error(
|
|
729
|
-
`Legacy project scope ${String(args.projectId)} has no mapped topic.`
|
|
730
|
-
);
|
|
673
|
+
return await resolveScopeFromLegacyProjectId(ctx, args.projectId);
|
|
731
674
|
}
|
|
732
675
|
throw new Error(
|
|
733
676
|
"Missing scope: provide topicId (preferred) or legacy projectId alias."
|
|
734
677
|
);
|
|
735
678
|
}
|
|
679
|
+
async function resolveScopeFromTopicId(ctx, topicId) {
|
|
680
|
+
const topic = await resolveTopicDocFromTopicId(ctx, topicId);
|
|
681
|
+
if (topic) {
|
|
682
|
+
return await buildTopicScope(ctx, topic, "topic");
|
|
683
|
+
}
|
|
684
|
+
const nodeScope = await resolveTopicNodeScopeOrNull(ctx, String(topicId));
|
|
685
|
+
if (nodeScope) {
|
|
686
|
+
return nodeScope;
|
|
687
|
+
}
|
|
688
|
+
throw new Error(`Topic not found: ${String(topicId)}`);
|
|
689
|
+
}
|
|
690
|
+
async function resolveTopicDocFromTopicId(ctx, topicId) {
|
|
691
|
+
const direct = await tryReadTopicDoc(ctx, topicId, {
|
|
692
|
+
failureLog: "[topicScope] Failed to load topic by direct id",
|
|
693
|
+
idLogKey: "topicId"
|
|
694
|
+
});
|
|
695
|
+
if (direct) {
|
|
696
|
+
return direct;
|
|
697
|
+
}
|
|
698
|
+
const hostTopic = await tryResolveHostTopicById(ctx, String(topicId));
|
|
699
|
+
if (hostTopic) {
|
|
700
|
+
return hostTopic;
|
|
701
|
+
}
|
|
702
|
+
return pickPrimaryTopic(await findTopicsByScopeAlias(ctx, String(topicId))) ?? null;
|
|
703
|
+
}
|
|
704
|
+
async function resolveScopeFromLegacyProjectId(ctx, legacyProjectId) {
|
|
705
|
+
const directTopic = await resolveDirectLegacyProjectTopic(
|
|
706
|
+
ctx,
|
|
707
|
+
legacyProjectId
|
|
708
|
+
);
|
|
709
|
+
if (directTopic) {
|
|
710
|
+
return await buildTopicScope(ctx, directTopic, "topic_inferred", {
|
|
711
|
+
fallbackProjectId: legacyProjectId
|
|
712
|
+
});
|
|
713
|
+
}
|
|
714
|
+
const primary = pickPrimaryTopic(
|
|
715
|
+
await findTopicsByScopeAlias(ctx, legacyProjectId)
|
|
716
|
+
);
|
|
717
|
+
if (primary) {
|
|
718
|
+
return await buildTopicScope(ctx, primary, "project_mapped_topic", {
|
|
719
|
+
fallbackProjectId: legacyProjectId
|
|
720
|
+
});
|
|
721
|
+
}
|
|
722
|
+
const nodeScope = await resolveTopicNodeScopeOrNull(ctx, legacyProjectId);
|
|
723
|
+
if (nodeScope) {
|
|
724
|
+
return {
|
|
725
|
+
...nodeScope,
|
|
726
|
+
projectId: nodeScope.projectId ?? legacyProjectId
|
|
727
|
+
};
|
|
728
|
+
}
|
|
729
|
+
throw new Error(
|
|
730
|
+
`Legacy project scope ${legacyProjectId} has no mapped topic.`
|
|
731
|
+
);
|
|
732
|
+
}
|
|
733
|
+
async function resolveDirectLegacyProjectTopic(ctx, legacyProjectId) {
|
|
734
|
+
const directTopic = await tryReadTopicDoc(ctx, legacyProjectId, {
|
|
735
|
+
failureLog: "[topicScope] Failed to load direct project topic",
|
|
736
|
+
idLogKey: "projectId"
|
|
737
|
+
});
|
|
738
|
+
return directTopic ?? tryResolveHostTopicByLegacyScope(ctx, legacyProjectId);
|
|
739
|
+
}
|
|
740
|
+
async function tryReadTopicDoc(ctx, id, log) {
|
|
741
|
+
try {
|
|
742
|
+
return await ctx.db.get(id);
|
|
743
|
+
} catch (error) {
|
|
744
|
+
debugGraphPrimitiveFallback(log.failureLog, {
|
|
745
|
+
error,
|
|
746
|
+
[log.idLogKey]: id
|
|
747
|
+
});
|
|
748
|
+
return null;
|
|
749
|
+
}
|
|
750
|
+
}
|
|
751
|
+
async function buildTopicScope(ctx, topic, source, options = {}) {
|
|
752
|
+
const inherited = await resolveInheritedWorkspaceScope(ctx, topic);
|
|
753
|
+
const mapped = asMappedProjectId(topic);
|
|
754
|
+
return {
|
|
755
|
+
topicId: topic._id,
|
|
756
|
+
...mapped || options.fallbackProjectId ? { projectId: mapped ?? options.fallbackProjectId } : {},
|
|
757
|
+
tenantId: inherited.tenantId,
|
|
758
|
+
workspaceId: inherited.workspaceId,
|
|
759
|
+
source
|
|
760
|
+
};
|
|
761
|
+
}
|
|
736
762
|
var optionalScopeArgs = {
|
|
737
763
|
projectId: v.optional(v.string()),
|
|
738
764
|
topicId: v.optional(v.string())
|
|
@@ -767,8 +793,6 @@ function nodeMatchesWorkspaceReasoningScope(node, scope) {
|
|
|
767
793
|
}
|
|
768
794
|
return scopeWorkspaceId === nodeWorkspaceId;
|
|
769
795
|
}
|
|
770
|
-
|
|
771
|
-
// src/epistemicBeliefs.helpers.ts
|
|
772
796
|
var insightIdUnion = v.id("epistemicNodes");
|
|
773
797
|
var DEFAULT_PROJECT_BELIEF_LIMIT = 250;
|
|
774
798
|
var MAX_PROJECT_BELIEF_LIMIT = 1e3;
|
|
@@ -777,29 +801,120 @@ var DEFAULT_CONFIDENCE_POLICY = {
|
|
|
777
801
|
scoringMode: "after_worktree",
|
|
778
802
|
tupleContradiction: normalizeTupleContradictionPolicy()
|
|
779
803
|
};
|
|
780
|
-
function throwStructuredMutationError(args) {
|
|
781
|
-
const data = {
|
|
782
|
-
structuredMutationError: true,
|
|
783
|
-
message: args.message,
|
|
784
|
-
status: args.status,
|
|
785
|
-
code: args.code,
|
|
786
|
-
invariantCode: args.invariantCode,
|
|
787
|
-
suggestion: args.suggestion,
|
|
788
|
-
details: args.details
|
|
789
|
-
};
|
|
790
|
-
const error = new ConvexError(
|
|
791
|
-
data
|
|
792
|
-
);
|
|
793
|
-
error.status = args.status;
|
|
794
|
-
error.code = args.code;
|
|
795
|
-
error.invariantCode = args.invariantCode;
|
|
796
|
-
error.suggestion = args.suggestion;
|
|
797
|
-
error.details = args.details;
|
|
798
|
-
throw error;
|
|
799
|
-
}
|
|
800
804
|
function readFiniteNumber(value) {
|
|
801
805
|
return typeof value === "number" && Number.isFinite(value) ? value : void 0;
|
|
802
806
|
}
|
|
807
|
+
function isRecord(value) {
|
|
808
|
+
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
809
|
+
}
|
|
810
|
+
function readOptionalString(value) {
|
|
811
|
+
return typeof value === "string" && value.trim().length > 0 ? value : void 0;
|
|
812
|
+
}
|
|
813
|
+
function readStringArray2(value) {
|
|
814
|
+
if (!Array.isArray(value)) {
|
|
815
|
+
return;
|
|
816
|
+
}
|
|
817
|
+
const strings = value.filter(
|
|
818
|
+
(item) => typeof item === "string" && item.length > 0
|
|
819
|
+
);
|
|
820
|
+
return strings.length === value.length ? strings : void 0;
|
|
821
|
+
}
|
|
822
|
+
function readRecord(value) {
|
|
823
|
+
return isRecord(value) ? value : void 0;
|
|
824
|
+
}
|
|
825
|
+
function readBeliefNodeView(value) {
|
|
826
|
+
if (!isRecord(value)) {
|
|
827
|
+
return null;
|
|
828
|
+
}
|
|
829
|
+
const id = readOptionalString(value._id);
|
|
830
|
+
const nodeType = readOptionalString(value.nodeType);
|
|
831
|
+
if (!(id && nodeType === "belief")) {
|
|
832
|
+
return null;
|
|
833
|
+
}
|
|
834
|
+
const node = {
|
|
835
|
+
_id: id,
|
|
836
|
+
nodeType
|
|
837
|
+
};
|
|
838
|
+
const creationTime = readFiniteNumber(value._creationTime);
|
|
839
|
+
if (creationTime !== void 0) {
|
|
840
|
+
node._creationTime = creationTime;
|
|
841
|
+
}
|
|
842
|
+
const metadata = readRecord(value.metadata);
|
|
843
|
+
if (metadata !== void 0) {
|
|
844
|
+
node.metadata = metadata;
|
|
845
|
+
}
|
|
846
|
+
const opinionA = readFiniteNumber(value.opinion_a);
|
|
847
|
+
if (opinionA !== void 0) {
|
|
848
|
+
node.opinion_a = opinionA;
|
|
849
|
+
}
|
|
850
|
+
const opinionB = readFiniteNumber(value.opinion_b);
|
|
851
|
+
if (opinionB !== void 0) {
|
|
852
|
+
node.opinion_b = opinionB;
|
|
853
|
+
}
|
|
854
|
+
const opinionD = readFiniteNumber(value.opinion_d);
|
|
855
|
+
if (opinionD !== void 0) {
|
|
856
|
+
node.opinion_d = opinionD;
|
|
857
|
+
}
|
|
858
|
+
const opinionU = readFiniteNumber(value.opinion_u);
|
|
859
|
+
if (opinionU !== void 0) {
|
|
860
|
+
node.opinion_u = opinionU;
|
|
861
|
+
}
|
|
862
|
+
const tupleContradicted = typeof value.tupleContradicted === "boolean" ? value.tupleContradicted : void 0;
|
|
863
|
+
if (tupleContradicted !== void 0) {
|
|
864
|
+
node.tupleContradicted = tupleContradicted;
|
|
865
|
+
}
|
|
866
|
+
const stringFields = {
|
|
867
|
+
anonymizationClass: value.anonymizationClass,
|
|
868
|
+
audienceLabel: value.audienceLabel,
|
|
869
|
+
canonicalText: value.canonicalText,
|
|
870
|
+
createdBy: value.createdBy,
|
|
871
|
+
epistemicLayer: value.epistemicLayer,
|
|
872
|
+
exportClass: value.exportClass,
|
|
873
|
+
globalId: value.globalId,
|
|
874
|
+
projectId: value.projectId,
|
|
875
|
+
publicationStatus: value.publicationStatus,
|
|
876
|
+
sensitivityTier: value.sensitivityTier,
|
|
877
|
+
status: value.status,
|
|
878
|
+
tenantId: value.tenantId,
|
|
879
|
+
topicId: value.topicId,
|
|
880
|
+
userId: value.userId,
|
|
881
|
+
workspaceId: value.workspaceId
|
|
882
|
+
};
|
|
883
|
+
for (const [field, fieldValue] of Object.entries(stringFields)) {
|
|
884
|
+
const normalized = readOptionalString(fieldValue);
|
|
885
|
+
if (normalized !== void 0) {
|
|
886
|
+
node[field] = normalized;
|
|
887
|
+
}
|
|
888
|
+
}
|
|
889
|
+
const createdAt = readFiniteNumber(value.createdAt);
|
|
890
|
+
if (createdAt !== void 0) {
|
|
891
|
+
node.createdAt = createdAt;
|
|
892
|
+
}
|
|
893
|
+
const updatedAt = readFiniteNumber(value.updatedAt);
|
|
894
|
+
if (updatedAt !== void 0) {
|
|
895
|
+
node.updatedAt = updatedAt;
|
|
896
|
+
}
|
|
897
|
+
if (value.beliefStatus !== void 0) {
|
|
898
|
+
node.beliefStatus = value.beliefStatus;
|
|
899
|
+
}
|
|
900
|
+
if (value.confidence !== void 0) {
|
|
901
|
+
node.confidence = value.confidence;
|
|
902
|
+
}
|
|
903
|
+
if (value.predictionMeta !== void 0) {
|
|
904
|
+
node.predictionMeta = value.predictionMeta;
|
|
905
|
+
}
|
|
906
|
+
const policyTags = readStringArray2(value.policyTags);
|
|
907
|
+
if (policyTags !== void 0) {
|
|
908
|
+
node.policyTags = policyTags;
|
|
909
|
+
}
|
|
910
|
+
return node;
|
|
911
|
+
}
|
|
912
|
+
function readBeliefNodeViews(values) {
|
|
913
|
+
return values.flatMap((value) => {
|
|
914
|
+
const node = readBeliefNodeView(value);
|
|
915
|
+
return node ? [node] : [];
|
|
916
|
+
});
|
|
917
|
+
}
|
|
803
918
|
function clamp01(value) {
|
|
804
919
|
return Math.max(0, Math.min(1, value));
|
|
805
920
|
}
|
|
@@ -961,7 +1076,7 @@ function normalizePillar(pillar) {
|
|
|
961
1076
|
async function markBeliefGraphDirty(ctx, scope) {
|
|
962
1077
|
const projectId = typeof scope.projectId === "string" && scope.projectId.trim().length > 0 ? scope.projectId : void 0;
|
|
963
1078
|
const topicId = typeof scope.topicId === "string" && scope.topicId.trim().length > 0 ? scope.topicId : void 0;
|
|
964
|
-
if (!projectId
|
|
1079
|
+
if (!(projectId || topicId)) {
|
|
965
1080
|
return;
|
|
966
1081
|
}
|
|
967
1082
|
if (projectId) {
|
|
@@ -978,16 +1093,22 @@ async function markBeliefGraphDirty(ctx, scope) {
|
|
|
978
1093
|
{ topicId }
|
|
979
1094
|
);
|
|
980
1095
|
}
|
|
1096
|
+
const activityScopeId = topicId ?? projectId;
|
|
1097
|
+
if (!activityScopeId) {
|
|
1098
|
+
throw new Error(
|
|
1099
|
+
"Expected belief graph dirty scope to include a topic or project id."
|
|
1100
|
+
);
|
|
1101
|
+
}
|
|
981
1102
|
await resolveGraphPrimitivesAppResolvers().patchProject(
|
|
982
1103
|
ctx,
|
|
983
|
-
|
|
1104
|
+
activityScopeId,
|
|
984
1105
|
{
|
|
985
1106
|
lastActivityAt: Date.now()
|
|
986
1107
|
}
|
|
987
1108
|
);
|
|
988
1109
|
}
|
|
989
1110
|
async function resolveBeliefScopeOrNull(ctx, args) {
|
|
990
|
-
if (!args.projectId
|
|
1111
|
+
if (!(args.projectId || args.topicId)) {
|
|
991
1112
|
return null;
|
|
992
1113
|
}
|
|
993
1114
|
try {
|
|
@@ -1012,14 +1133,17 @@ async function getBeliefNodesForScope(ctx, scope, args) {
|
|
|
1012
1133
|
"by_topic_type",
|
|
1013
1134
|
(q) => q.eq("topicId", scope.topicId).eq("nodeType", "belief")
|
|
1014
1135
|
);
|
|
1015
|
-
const
|
|
1136
|
+
const rows = typeof args?.scanLimit === "number" ? await baseQuery.order("desc").take(args.scanLimit) : await baseQuery.collect();
|
|
1137
|
+
const nodes = readBeliefNodeViews(rows);
|
|
1016
1138
|
const scopedNodes = nodes.filter(
|
|
1017
1139
|
(node) => nodeMatchesWorkspaceReasoningScope(node, scope)
|
|
1018
1140
|
);
|
|
1019
1141
|
if (!args?.status) {
|
|
1020
1142
|
return scopedNodes;
|
|
1021
1143
|
}
|
|
1022
|
-
return scopedNodes.filter(
|
|
1144
|
+
return scopedNodes.filter(
|
|
1145
|
+
(node) => node.status === args.status
|
|
1146
|
+
);
|
|
1023
1147
|
}
|
|
1024
1148
|
function createBeliefAudienceResolver(registryRows) {
|
|
1025
1149
|
const audienceClassByKey = new Map(
|
|
@@ -1039,9 +1163,7 @@ function createBeliefAudienceResolver(registryRows) {
|
|
|
1039
1163
|
function flattenBeliefNode(node) {
|
|
1040
1164
|
const meta = node.metadata || {};
|
|
1041
1165
|
const worktreeId = resolveBeliefWorktreeId(meta);
|
|
1042
|
-
const tupleContradicted = readTupleContradictedFlag(
|
|
1043
|
-
node.tupleContradicted
|
|
1044
|
-
) ?? readTupleContradictedFlag(meta.tupleContradicted) ?? false;
|
|
1166
|
+
const tupleContradicted = readTupleContradictedFlag(node.tupleContradicted) ?? readTupleContradictedFlag(meta.tupleContradicted) ?? false;
|
|
1045
1167
|
return {
|
|
1046
1168
|
_id: node._id,
|
|
1047
1169
|
_epistemicNodeId: node._id,
|
|
@@ -1087,7 +1209,10 @@ function resolveBeliefStatus(node, metadata) {
|
|
|
1087
1209
|
});
|
|
1088
1210
|
}
|
|
1089
1211
|
async function hasCompletedWorktreeForBelief(ctx, beliefNodeId) {
|
|
1090
|
-
const clusterMembership = await ctx.db.query("worktreeBeliefCluster").withIndex(
|
|
1212
|
+
const clusterMembership = await ctx.db.query("worktreeBeliefCluster").withIndex(
|
|
1213
|
+
"by_belief",
|
|
1214
|
+
(q) => q.eq("beliefId", beliefNodeId)
|
|
1215
|
+
).collect();
|
|
1091
1216
|
for (const membership of clusterMembership) {
|
|
1092
1217
|
const worktree = await ctx.db.get(membership.worktreeId);
|
|
1093
1218
|
if (worktree?.status === "completed" || worktree?.status === "merged") {
|
|
@@ -1098,7 +1223,10 @@ async function hasCompletedWorktreeForBelief(ctx, beliefNodeId) {
|
|
|
1098
1223
|
}
|
|
1099
1224
|
async function getActiveConfidencePolicy(ctx) {
|
|
1100
1225
|
try {
|
|
1101
|
-
const activeConfig = await ctx.db.query("logicSprintScoring").withIndex(
|
|
1226
|
+
const activeConfig = await ctx.db.query("logicSprintScoring").withIndex(
|
|
1227
|
+
"by_active",
|
|
1228
|
+
(q) => q.eq("isActive", true)
|
|
1229
|
+
).first();
|
|
1102
1230
|
return {
|
|
1103
1231
|
scoringMode: activeConfig?.confidencePolicy === "always" ? "always" : DEFAULT_CONFIDENCE_POLICY.scoringMode,
|
|
1104
1232
|
tupleContradiction: normalizeTupleContradictionPolicy(
|
|
@@ -1130,24 +1258,7 @@ async function requireAuthenticatedUserId(ctx) {
|
|
|
1130
1258
|
}
|
|
1131
1259
|
return userId;
|
|
1132
1260
|
}
|
|
1133
|
-
async function requireProjectWriteAccess(ctx, projectId, userId) {
|
|
1134
|
-
const hasAccess = await checkProjectAccess(
|
|
1135
|
-
ctx,
|
|
1136
|
-
projectId,
|
|
1137
|
-
userId
|
|
1138
|
-
);
|
|
1139
|
-
if (!hasAccess) {
|
|
1140
|
-
throwStructuredMutationError({
|
|
1141
|
-
message: `Project write access denied for topic ${projectId}.`,
|
|
1142
|
-
status: 403,
|
|
1143
|
-
code: "PROJECT_ACCESS_DENIED",
|
|
1144
|
-
invariantCode: "policy.scope_required",
|
|
1145
|
-
suggestion: "The acting principal lacks project-write access to this topic. Request a topic grant (or, if the principal created this topic, run the creator-grant backfill) and retry.",
|
|
1146
|
-
details: { topicId: projectId, principalId: userId }
|
|
1147
|
-
});
|
|
1148
|
-
}
|
|
1149
|
-
}
|
|
1150
1261
|
|
|
1151
|
-
export { MAX_PROJECT_BELIEF_LIMIT, assertBaseRateInRange, buildBeliefConfidenceRow, buildBeliefEvidenceNotFoundResult, buildBeliefStatusSuccessResult, clampBeliefLimit, createBeliefAudienceResolver, deriveSyntheticBackfillOpinion, deriveTupleContradictionSeverity, flattenBeliefNode, formatTupleContradictionDescription, generateContentHash, getActiveConfidencePolicy, getBeliefNodesForScope, hasCompletedWorktreeForBelief, insightIdUnion, markBeliefGraphDirty, normalizePillar, optionalBeliefScopeArgs, readBeliefOpinionSnapshot, readFiniteNumber, readTupleContradictedFlag, requireAuthenticatedUserId,
|
|
1262
|
+
export { MAX_PROJECT_BELIEF_LIMIT, assertBaseRateInRange, buildBeliefConfidenceRow, buildBeliefEvidenceNotFoundResult, buildBeliefStatusSuccessResult, clampBeliefLimit, createBeliefAudienceResolver, deriveSyntheticBackfillOpinion, deriveTupleContradictionSeverity, flattenBeliefNode, formatTupleContradictionDescription, generateContentHash, getActiveConfidencePolicy, getBeliefNodesForScope, hasCompletedWorktreeForBelief, insightIdUnion, markBeliefGraphDirty, normalizePillar, optionalBeliefScopeArgs, readBeliefNodeView, readBeliefOpinionSnapshot, readFiniteNumber, readTupleContradictedFlag, requireAuthenticatedUserId, resolveBeliefScopeOrNull, resolveBeliefStatus, resolveBeliefWorktreeId };
|
|
1152
1263
|
//# sourceMappingURL=epistemicBeliefs.helpers.js.map
|
|
1153
1264
|
//# sourceMappingURL=epistemicBeliefs.helpers.js.map
|