@lucern/graph-primitives 1.0.29 → 1.0.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{beliefDecay-DZ6tkLYq.d.ts → beliefDecay-BmkEk5OJ.d.ts} +3 -3
- package/dist/beliefDecay.d.ts +1 -1
- package/dist/beliefDecay.js +448 -314
- package/dist/beliefDecay.js.map +1 -1
- package/dist/{beliefEvidenceLinks-CWOXxxJg.d.ts → beliefEvidenceLinks-BzfjON_6.d.ts} +13 -13
- package/dist/beliefEvidenceLinks.d.ts +1 -1
- package/dist/beliefEvidenceLinks.js +843 -624
- package/dist/beliefEvidenceLinks.js.map +1 -1
- package/dist/beliefEvidenceLinks.operational.d.ts +7 -5
- package/dist/beliefEvidenceLinks.operational.js +91 -18
- package/dist/beliefEvidenceLinks.operational.js.map +1 -1
- package/dist/beliefLifecycle.js.map +1 -1
- package/dist/confidencePropagationDispatch.d.ts +28 -27
- package/dist/confidencePropagationDispatch.js +157 -99
- package/dist/confidencePropagationDispatch.js.map +1 -1
- package/dist/{contradictions-51VLsESq.d.ts → contradictions-BATPuZTL.d.ts} +10 -10
- package/dist/contradictions.d.ts +1 -1
- package/dist/contradictions.js +395 -225
- package/dist/contradictions.js.map +1 -1
- package/dist/convex.d.ts +65 -30
- package/dist/convex.js +7 -3
- package/dist/convex.js.map +1 -1
- package/dist/debug.js.map +1 -1
- package/dist/edgeValidation.js +293 -85
- package/dist/edgeValidation.js.map +1 -1
- package/dist/edges/contains.d.ts +1 -1
- package/dist/edges/contains.js.map +1 -1
- package/dist/edges/contradicts.d.ts +1 -1
- package/dist/edges/contradicts.js.map +1 -1
- package/dist/edges/{dependsOn.d.ts → depends-on.d.ts} +1 -1
- package/dist/edges/{dependsOn.js → depends-on.js} +4 -4
- package/dist/edges/depends-on.js.map +1 -0
- package/dist/edges/{derivedFrom.d.ts → derived-from.d.ts} +1 -1
- package/dist/edges/{derivedFrom.js → derived-from.js} +3 -3
- package/dist/edges/derived-from.js.map +1 -0
- package/dist/edges/elaborates.d.ts +1 -1
- package/dist/edges/elaborates.js.map +1 -1
- package/dist/edges/index.d.ts +7 -3
- package/dist/edges/index.js +7 -4
- package/dist/edges/index.js.map +1 -1
- package/dist/edges/informs.d.ts +1 -1
- package/dist/edges/informs.js.map +1 -1
- package/dist/edges/{propagationTypes.d.ts → propagation-types.d.ts} +14 -14
- package/dist/edges/{propagationTypes.js → propagation-types.js} +3 -3
- package/dist/edges/propagation-types.js.map +1 -0
- package/dist/edges/refutes.d.ts +1 -1
- package/dist/edges/refutes.js.map +1 -1
- package/dist/edges/supports.d.ts +1 -1
- package/dist/edges/supports.js.map +1 -1
- package/dist/edges/tests.d.ts +1 -1
- package/dist/edges/tests.js.map +1 -1
- package/dist/edges/utils.d.ts +1 -1
- package/dist/edges/utils.js.map +1 -1
- package/dist/embeddingTrigger.d.ts +14 -6
- package/dist/embeddingTrigger.js +11 -14
- package/dist/embeddingTrigger.js.map +1 -1
- package/dist/{entityBridge-DMaKooYn.d.ts → entityBridge-BhVDM3pc.d.ts} +5 -5
- package/dist/entityBridge.d.ts +1 -1
- package/dist/entityBridge.js +602 -225
- package/dist/entityBridge.js.map +1 -1
- package/dist/entityCanonicalMatch.d.ts +14 -12
- package/dist/entityCanonicalMatch.js.map +1 -1
- package/dist/{entityLifecycle-CvgSK5FV.d.ts → entityLifecycle-BsfCz9pS.d.ts} +5 -9
- package/dist/entityLifecycle.d.ts +1 -1
- package/dist/entityLifecycle.js +854 -480
- package/dist/entityLifecycle.js.map +1 -1
- package/dist/{entityValidation-KLZ_Xl2D.d.ts → entityValidation-B1yNEHJx.d.ts} +7 -6
- package/dist/entityValidation.d.ts +3 -1
- package/dist/entityValidation.js +60 -8
- package/dist/entityValidation.js.map +1 -1
- package/dist/{epistemicAnswers-C5ib4z6_.d.ts → epistemicAnswers-f47YMu9U.d.ts} +6 -6
- package/dist/epistemicAnswers.d.ts +1 -1
- package/dist/epistemicAnswers.js +587 -545
- package/dist/epistemicAnswers.js.map +1 -1
- package/dist/epistemicBeliefs.admin.d.ts +8 -8
- package/dist/epistemicBeliefs.admin.js +365 -166
- package/dist/epistemicBeliefs.admin.js.map +1 -1
- package/dist/epistemicBeliefs.backfills.d.ts +8 -8
- package/dist/epistemicBeliefs.backfills.js +655 -289
- package/dist/epistemicBeliefs.backfills.js.map +1 -1
- package/dist/epistemicBeliefs.confidence.d.ts +19 -15
- package/dist/epistemicBeliefs.confidence.js +633 -386
- package/dist/epistemicBeliefs.confidence.js.map +1 -1
- package/dist/epistemicBeliefs.core.d.ts +6 -6
- package/dist/epistemicBeliefs.core.js +717 -371
- package/dist/epistemicBeliefs.core.js.map +1 -1
- package/dist/epistemicBeliefs.d.ts +11 -9
- package/dist/epistemicBeliefs.forkEvidence.d.ts +2 -0
- package/dist/epistemicBeliefs.forkEvidence.js +8 -8
- package/dist/epistemicBeliefs.forkEvidence.js.map +1 -1
- package/dist/epistemicBeliefs.helpers.d.ts +68 -49
- package/dist/epistemicBeliefs.helpers.js +358 -211
- package/dist/epistemicBeliefs.helpers.js.map +1 -1
- package/dist/epistemicBeliefs.internal.d.ts +5 -5
- package/dist/epistemicBeliefs.internal.js +1248 -1026
- package/dist/epistemicBeliefs.internal.js.map +1 -1
- package/dist/epistemicBeliefs.js +4942 -3590
- package/dist/epistemicBeliefs.js.map +1 -1
- package/dist/epistemicBeliefs.lifecycle.d.ts +5 -5
- package/dist/epistemicBeliefs.lifecycle.js +1138 -781
- package/dist/epistemicBeliefs.lifecycle.js.map +1 -1
- package/dist/epistemicBeliefs.links.d.ts +7 -7
- package/dist/epistemicBeliefs.links.js +404 -267
- package/dist/epistemicBeliefs.links.js.map +1 -1
- package/dist/epistemicBeliefs.queries.d.ts +4 -4
- package/dist/epistemicBeliefs.queries.js +175 -20
- package/dist/epistemicBeliefs.queries.js.map +1 -1
- package/dist/epistemicBeliefs.topicAnchor.d.ts +6 -4
- package/dist/epistemicBeliefs.topicAnchor.js +12 -5
- package/dist/epistemicBeliefs.topicAnchor.js.map +1 -1
- package/dist/epistemicContracts.d.ts +28 -3
- package/dist/epistemicContracts.evaluators.d.ts +2 -0
- package/dist/epistemicContracts.evaluators.js +1062 -576
- package/dist/epistemicContracts.evaluators.js.map +1 -1
- package/dist/epistemicContracts.handlers.d.ts +15 -32
- package/dist/epistemicContracts.handlers.js +1829 -1351
- package/dist/epistemicContracts.handlers.js.map +1 -1
- package/dist/epistemicContracts.js +1131 -636
- package/dist/epistemicContracts.js.map +1 -1
- package/dist/epistemicContracts.metrics.d.ts +2 -0
- package/dist/epistemicContracts.metrics.js +375 -158
- package/dist/epistemicContracts.metrics.js.map +1 -1
- package/dist/epistemicContracts.types.d.ts +87 -81
- package/dist/epistemicEdgeCreation.d.ts +2 -0
- package/dist/epistemicEdgeCreation.js +87 -16
- package/dist/epistemicEdgeCreation.js.map +1 -1
- package/dist/{epistemicEdges-BF-cn4i3.d.ts → epistemicEdges-BGBh0QSP.d.ts} +4 -7
- package/dist/epistemicEdges.d.ts +6 -5
- package/dist/epistemicEdges.handlers.d.ts +3 -3
- package/dist/epistemicEdges.handlers.js +129 -24
- package/dist/epistemicEdges.handlers.js.map +1 -1
- package/dist/epistemicEdges.helpers.d.ts +6 -4
- package/dist/epistemicEdges.helpers.js +37 -2
- package/dist/epistemicEdges.helpers.js.map +1 -1
- package/dist/epistemicEdges.js +1966 -1202
- package/dist/epistemicEdges.js.map +1 -1
- package/dist/epistemicEdges.mutations.d.ts +7 -7
- package/dist/epistemicEdges.mutations.js +956 -579
- package/dist/epistemicEdges.mutations.js.map +1 -1
- package/dist/epistemicEdges.queries.d.ts +16 -16
- package/dist/epistemicEdges.queries.js +639 -367
- package/dist/epistemicEdges.queries.js.map +1 -1
- package/dist/epistemicEdges.types.d.ts +10 -8
- package/dist/epistemicEvidence.d.ts +4 -1
- package/dist/epistemicEvidence.js +933 -532
- package/dist/epistemicEvidence.js.map +1 -1
- package/dist/epistemicEvidenceHelpers.d.ts +26 -10
- package/dist/epistemicEvidenceHelpers.js +239 -200
- package/dist/epistemicEvidenceHelpers.js.map +1 -1
- package/dist/epistemicEvidenceMutations.d.ts +8 -8
- package/dist/epistemicEvidenceMutations.js +840 -692
- package/dist/epistemicEvidenceMutations.js.map +1 -1
- package/dist/epistemicEvidenceQueries.d.ts +8 -8
- package/dist/epistemicEvidenceQueries.js +514 -238
- package/dist/epistemicEvidenceQueries.js.map +1 -1
- package/dist/epistemicHelpers.d.ts +4 -2
- package/dist/epistemicHelpers.js +308 -134
- package/dist/epistemicHelpers.js.map +1 -1
- package/dist/epistemicInsert.d.ts +16 -4
- package/dist/epistemicInsert.js +6 -3
- package/dist/epistemicInsert.js.map +1 -1
- package/dist/epistemicLayerRules.d.ts +10 -8
- package/dist/epistemicLayerRules.js +1 -5
- package/dist/epistemicLayerRules.js.map +1 -1
- package/dist/{epistemicLinking-CfE00tHJ.d.ts → epistemicLinking-CsCDv2cN.d.ts} +3 -3
- package/dist/epistemicLinking.d.ts +1 -1
- package/dist/epistemicLinking.js +177 -100
- package/dist/epistemicLinking.js.map +1 -1
- package/dist/epistemicNodeCreation.d.ts +2 -0
- package/dist/epistemicNodeCreation.js +203 -40
- package/dist/epistemicNodeCreation.js.map +1 -1
- package/dist/{epistemicNodes-BCQxpYx_.d.ts → epistemicNodes-CokAgBHg.d.ts} +3 -3
- package/dist/epistemicNodes.d.ts +3 -3
- package/dist/epistemicNodes.helpers.d.ts +24 -15
- package/dist/epistemicNodes.helpers.js.map +1 -1
- package/dist/epistemicNodes.internal.d.ts +6 -6
- package/dist/epistemicNodes.internal.js +389 -319
- package/dist/epistemicNodes.internal.js.map +1 -1
- package/dist/epistemicNodes.js +700 -504
- package/dist/epistemicNodes.js.map +1 -1
- package/dist/epistemicNodes.mutations.d.ts +6 -6
- package/dist/epistemicNodes.mutations.js +560 -463
- package/dist/epistemicNodes.mutations.js.map +1 -1
- package/dist/epistemicNodes.queries.d.ts +8 -8
- package/dist/epistemicNodes.queries.js +311 -314
- package/dist/epistemicNodes.queries.js.map +1 -1
- package/dist/epistemicNodes.validators.d.ts +2 -2
- package/dist/epistemicNodes.validators.js.map +1 -1
- package/dist/epistemicQuestions.conviction.d.ts +8 -8
- package/dist/epistemicQuestions.conviction.js +665 -484
- package/dist/epistemicQuestions.conviction.js.map +1 -1
- package/dist/epistemicQuestions.create.d.ts +4 -4
- package/dist/epistemicQuestions.create.js +640 -612
- package/dist/epistemicQuestions.create.js.map +1 -1
- package/dist/epistemicQuestions.d.ts +8 -5
- package/dist/epistemicQuestions.evidence.d.ts +2 -2
- package/dist/epistemicQuestions.evidence.js +475 -383
- package/dist/epistemicQuestions.evidence.js.map +1 -1
- package/dist/epistemicQuestions.helpers.d.ts +125 -24
- package/dist/epistemicQuestions.helpers.js +240 -209
- package/dist/epistemicQuestions.helpers.js.map +1 -1
- package/dist/epistemicQuestions.js +3474 -2823
- package/dist/epistemicQuestions.js.map +1 -1
- package/dist/epistemicQuestions.lifecycle.d.ts +2 -2
- package/dist/epistemicQuestions.lifecycle.js +607 -546
- package/dist/epistemicQuestions.lifecycle.js.map +1 -1
- package/dist/epistemicQuestions.queries.d.ts +12 -7
- package/dist/epistemicQuestions.queries.js +305 -244
- package/dist/epistemicQuestions.queries.js.map +1 -1
- package/dist/epistemicQuestions.sprint.d.ts +2 -2
- package/dist/epistemicQuestions.sprint.js +600 -394
- package/dist/epistemicQuestions.sprint.js.map +1 -1
- package/dist/epistemicQuestions.tail.d.ts +6 -6
- package/dist/epistemicQuestions.tail.js +572 -433
- package/dist/epistemicQuestions.tail.js.map +1 -1
- package/dist/{epistemicSources-dlKj58Jp.d.ts → epistemicSources-DQtaEkWs.d.ts} +4 -4
- package/dist/epistemicSources.d.ts +1 -1
- package/dist/epistemicSources.js +351 -311
- package/dist/epistemicSources.js.map +1 -1
- package/dist/evaluators/index.d.ts +8 -6
- package/dist/evaluators/index.js +399 -167
- package/dist/evaluators/index.js.map +1 -1
- package/dist/evaluators/lint-checker-evaluator.d.ts +16 -0
- package/dist/evaluators/{lintCheckerEvaluator.js → lint-checker-evaluator.js} +10 -5
- package/dist/evaluators/lint-checker-evaluator.js.map +1 -0
- package/dist/evaluators/{sentryCheckerEvaluator.d.ts → sentry-checker-evaluator.d.ts} +7 -2
- package/dist/evaluators/{sentryCheckerEvaluator.js → sentry-checker-evaluator.js} +3 -3
- package/dist/evaluators/sentry-checker-evaluator.js.map +1 -0
- package/dist/evaluators/shared.d.ts +2 -2
- package/dist/evaluators/shared.js +3 -1
- package/dist/evaluators/shared.js.map +1 -1
- package/dist/evaluators/{testRunnerEvaluator.d.ts → test-runner-evaluator.d.ts} +6 -1
- package/dist/evaluators/{testRunnerEvaluator.js → test-runner-evaluator.js} +6 -4
- package/dist/evaluators/test-runner-evaluator.js.map +1 -0
- package/dist/evaluators/tsc-checker-evaluator.d.ts +16 -0
- package/dist/evaluators/{tscCheckerEvaluator.js → tsc-checker-evaluator.js} +10 -5
- package/dist/evaluators/tsc-checker-evaluator.js.map +1 -0
- package/dist/graphTypes.js +6 -2
- package/dist/graphTypes.js.map +1 -1
- package/dist/helpers.d.ts +2 -0
- package/dist/helpers.js +313 -93
- package/dist/helpers.js.map +1 -1
- package/dist/{index-C-Kyd7hD.d.ts → index-DZxyC9Pb.d.ts} +7 -6
- package/dist/index.d.ts +86 -83
- package/dist/index.js +16914 -11760
- package/dist/index.js.map +1 -1
- package/dist/invariantEnforcement.d.ts +3 -3
- package/dist/invariantEnforcement.js.map +1 -1
- package/dist/logicalRoleInference.d.ts +2 -0
- package/dist/logicalRoleInference.js +1 -1
- package/dist/logicalRoleInference.js.map +1 -1
- package/dist/matcherFeedbackUtils.d.ts +2 -2
- package/dist/matcherFeedbackUtils.js.map +1 -1
- package/dist/{ontology-matching-C6rrz2VP.d.ts → ontology-matching-C-mYFrir.d.ts} +16 -16
- package/dist/ontology-matching.d.ts +1 -1
- package/dist/{ontologyApproval-CFYmqKmk.d.ts → ontologyApproval-BVt0feJi.d.ts} +10 -10
- package/dist/ontologyApproval.d.ts +1 -1
- package/dist/ontologyApproval.js +7 -1
- package/dist/ontologyApproval.js.map +1 -1
- package/dist/ontologyDefinitions.d.ts +14 -24
- package/dist/ontologyDefinitions.js +269 -34
- package/dist/ontologyDefinitions.js.map +1 -1
- package/dist/ontologyHelpers.d.ts +13 -13
- package/dist/ontologyHelpers.js.map +1 -1
- package/dist/{ontologyRegistry-B67rPJ16.d.ts → ontologyRegistry-CljS-ENv.d.ts} +2 -2
- package/dist/ontologyRegistry.d.ts +1 -1
- package/dist/ontologyRegistry.js +34 -6
- package/dist/ontologyRegistry.js.map +1 -1
- package/dist/{projectionReconciliation-jww2fBI0.d.ts → projectionReconciliation-DnrSgHSQ.d.ts} +4 -4
- package/dist/projectionReconciliation.d.ts +1 -1
- package/dist/projectionReconciliation.js +57 -10
- package/dist/projectionReconciliation.js.map +1 -1
- package/dist/{projectionStaleness-CmdbpjVK.d.ts → projectionStaleness-C8ImQ2zP.d.ts} +17 -17
- package/dist/projectionStaleness.d.ts +1 -1
- package/dist/projectionStaleness.js +8 -2
- package/dist/projectionStaleness.js.map +1 -1
- package/dist/proof-attestation.json +1 -1
- package/dist/{questionEvidenceLinks-DFlyPpAj.d.ts → questionEvidenceLinks-_nPRa-LY.d.ts} +10 -10
- package/dist/questionEvidenceLinks.d.ts +1 -1
- package/dist/questionEvidenceLinks.js +564 -347
- package/dist/questionEvidenceLinks.js.map +1 -1
- package/dist/{resolverTypes-CC8Ea2E2.d.ts → resolverTypes-BOXPxLET.d.ts} +8 -7
- package/dist/resolverTypes.d.ts +4 -2
- package/dist/{resolvers-Br1a6eLV.d.ts → resolvers-B1TIBmRO.d.ts} +3 -1
- package/dist/resolvers.d.ts +5 -3
- package/dist/resolvers.js +121 -77
- package/dist/resolvers.js.map +1 -1
- package/dist/scopeResolverCompat.d.ts +10 -7
- package/dist/scopeResolverCompat.js +106 -123
- package/dist/scopeResolverCompat.js.map +1 -1
- package/dist/{text-matching-DNg4M5Wd.d.ts → text-matching-DzFooju6.d.ts} +7 -7
- package/dist/text-matching.d.ts +1 -1
- package/dist/topicOntologyResolver.d.ts +22 -21
- package/dist/topicOntologyResolver.js +54 -32
- package/dist/topicOntologyResolver.js.map +1 -1
- package/dist/topicProjectOverlay.d.ts +30 -20
- package/dist/topicProjectOverlay.js +120 -76
- package/dist/topicProjectOverlay.js.map +1 -1
- package/dist/{topicScope-7zhyeGl7.d.ts → topicScope-DJVa0mLa.d.ts} +22 -7
- package/dist/topicScope.d.ts +3 -1
- package/dist/topicScope.js +104 -119
- package/dist/topicScope.js.map +1 -1
- package/dist/workflowBridge.d.ts +26 -15
- package/dist/workflowBridge.js +140 -144
- package/dist/workflowBridge.js.map +1 -1
- package/dist/workspaceIsolation.d.ts +14 -12
- package/dist/workspaceIsolation.js +108 -122
- package/dist/workspaceIsolation.js.map +1 -1
- package/package.json +4 -4
- package/dist/edges/dependsOn.js.map +0 -1
- package/dist/edges/derivedFrom.js.map +0 -1
- package/dist/edges/propagationTypes.js.map +0 -1
- package/dist/evaluators/lintCheckerEvaluator.d.ts +0 -11
- package/dist/evaluators/lintCheckerEvaluator.js.map +0 -1
- package/dist/evaluators/sentryCheckerEvaluator.js.map +0 -1
- package/dist/evaluators/testRunnerEvaluator.js.map +0 -1
- package/dist/evaluators/tscCheckerEvaluator.d.ts +0 -11
- package/dist/evaluators/tscCheckerEvaluator.js.map +0 -1
- package/dist/{epistemicQuestions-bwHd2FWE.d.ts → epistemicQuestions-Do1fhYm5.d.ts} +4 -4
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { normalizeAudienceKey, classFromAudienceKey } from '@lucern/access-control/audience';
|
|
2
|
+
import { getCurrentUserId } from '@lucern/access-control/auth';
|
|
2
3
|
import { throwStructuredMutationError } from '@lucern/access-control/structuredMutationError';
|
|
3
4
|
export { throwStructuredMutationError } from '@lucern/access-control/structuredMutationError';
|
|
4
5
|
import { normalizeTupleContradictionPolicy, confidenceFromSL, readOpinionFromRecord, mkOpinion } from '@lucern/confidence';
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { componentsGeneric
|
|
6
|
+
import { v } from 'convex/values';
|
|
7
|
+
import { unsafeConvexAnyApi } from '@lucern/contracts/convex/unsafeAnyApi';
|
|
8
|
+
import { componentsGeneric } from 'convex/server';
|
|
8
9
|
import '@lucern/contracts/schema-helpers/spine/tables/epistemicNodes';
|
|
9
10
|
|
|
10
11
|
// src/epistemicBeliefs.helpers.ts
|
|
@@ -119,9 +120,12 @@ function resolveBeliefLifecycleStatus(opts) {
|
|
|
119
120
|
function isPreValidationBeliefStatus(status) {
|
|
120
121
|
return status === "assumption" || status === "hypothesis";
|
|
121
122
|
}
|
|
122
|
-
var
|
|
123
|
+
var unsafeApi = unsafeConvexAnyApi(
|
|
124
|
+
"graph-primitives top-level module bundle lacks a committed Convex _generated/api surface"
|
|
125
|
+
);
|
|
126
|
+
var api = unsafeApi;
|
|
123
127
|
componentsGeneric();
|
|
124
|
-
var internal =
|
|
128
|
+
var internal = unsafeApi;
|
|
125
129
|
|
|
126
130
|
// src/debug.ts
|
|
127
131
|
function isGraphPrimitiveDebugEnabled() {
|
|
@@ -153,6 +157,10 @@ function readStringArray(value) {
|
|
|
153
157
|
function readMetadata(topic) {
|
|
154
158
|
return topic.metadata && typeof topic.metadata === "object" ? topic.metadata : {};
|
|
155
159
|
}
|
|
160
|
+
function omitMetadataKey(metadata, key) {
|
|
161
|
+
const { [key]: _omitted, ...rest } = metadata;
|
|
162
|
+
return rest;
|
|
163
|
+
}
|
|
156
164
|
function readLegacyProjectId(value) {
|
|
157
165
|
if (!value) {
|
|
158
166
|
return;
|
|
@@ -233,9 +241,12 @@ async function resolveTopicDoc(ctx, scopeId) {
|
|
|
233
241
|
);
|
|
234
242
|
}
|
|
235
243
|
try {
|
|
236
|
-
const topic = await ctx.runQuery(
|
|
237
|
-
|
|
238
|
-
|
|
244
|
+
const topic = await ctx.runQuery(
|
|
245
|
+
api.topics.getByLegacyScopeId,
|
|
246
|
+
{
|
|
247
|
+
projectId: String(scopeId)
|
|
248
|
+
}
|
|
249
|
+
);
|
|
239
250
|
if (topic?.name !== void 0 && topic?.type !== void 0) {
|
|
240
251
|
return topic;
|
|
241
252
|
}
|
|
@@ -255,8 +266,18 @@ function materializeTopicProjectOverlay(topic, idMode = "legacy") {
|
|
|
255
266
|
const outwardId = idMode === "topic" ? topicId : storageProjectId;
|
|
256
267
|
const visibility = coerceVisibility(topic.visibility) || coerceVisibility(metadata.visibility) || "private";
|
|
257
268
|
const status = coerceStatus(topic.status) || coerceStatus(metadata.status) || "active";
|
|
258
|
-
|
|
259
|
-
|
|
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
|
+
}
|
|
260
281
|
return {
|
|
261
282
|
...metadata,
|
|
262
283
|
_id: outwardId,
|
|
@@ -325,90 +346,113 @@ async function patchTopicProjectOverlay(ctx, scopeId, value) {
|
|
|
325
346
|
if (!topic) {
|
|
326
347
|
return null;
|
|
327
348
|
}
|
|
328
|
-
const
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
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
|
+
}
|
|
332
364
|
};
|
|
333
365
|
for (const [key, rawValue] of Object.entries(value)) {
|
|
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
|
-
|
|
386
|
-
|
|
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;
|
|
426
|
+
}
|
|
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;
|
|
387
433
|
}
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
434
|
+
plan.nextMetadata[key] = rawValue;
|
|
435
|
+
}
|
|
436
|
+
async function applyTopicProjectOverlayPatch(ctx, topic, plan) {
|
|
391
437
|
if (typeof ctx.runMutation === "function") {
|
|
392
438
|
try {
|
|
393
|
-
await ctx.runMutation(api.topics.update, topicUpdateArgs);
|
|
439
|
+
await ctx.runMutation(api.topics.update, plan.topicUpdateArgs);
|
|
394
440
|
} catch (error) {
|
|
395
|
-
if (!
|
|
441
|
+
if (!canPatchTopicViaLocalDb(ctx, error)) {
|
|
396
442
|
throw error;
|
|
397
443
|
}
|
|
398
|
-
await ctx.db.patch(
|
|
444
|
+
await ctx.db.patch(topic._id, plan.patch);
|
|
399
445
|
}
|
|
400
446
|
} else if (ctx?.db && typeof ctx.db.patch === "function") {
|
|
401
|
-
await ctx.db.patch(
|
|
447
|
+
await ctx.db.patch(topic._id, plan.patch);
|
|
402
448
|
} else {
|
|
403
449
|
throw new Error(
|
|
404
450
|
"Cannot patch topic without component adapter (ctx.runMutation unavailable)"
|
|
405
451
|
);
|
|
406
452
|
}
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
metadata: nextMetadata
|
|
411
|
-
});
|
|
453
|
+
}
|
|
454
|
+
function canPatchTopicViaLocalDb(ctx, error) {
|
|
455
|
+
return isMissingLucernChildComponentError(error) && Boolean(ctx?.db) && typeof ctx.db?.patch === "function";
|
|
412
456
|
}
|
|
413
457
|
|
|
414
458
|
// src/resolvers.ts
|
|
@@ -436,7 +480,7 @@ async function patchProjectWithTolerance(ctx, projectId, value) {
|
|
|
436
480
|
try {
|
|
437
481
|
await patchTopicProjectOverlay(ctx, projectId, value);
|
|
438
482
|
} catch (error) {
|
|
439
|
-
if (!isAdvisoryTopicPatch(value)
|
|
483
|
+
if (!(isAdvisoryTopicPatch(value) && isMissingLucernChildComponentError2(error))) {
|
|
440
484
|
throw error;
|
|
441
485
|
}
|
|
442
486
|
console.warn(
|
|
@@ -503,13 +547,15 @@ function asMappedProjectId(topic) {
|
|
|
503
547
|
if (!topic) {
|
|
504
548
|
return;
|
|
505
549
|
}
|
|
506
|
-
const directLegacyProjectId = normalizeScopeValue(
|
|
550
|
+
const directLegacyProjectId = normalizeScopeValue(
|
|
551
|
+
topic[LEGACY_SCOPE_FIELD2]
|
|
552
|
+
);
|
|
507
553
|
if (directLegacyProjectId) {
|
|
508
554
|
return directLegacyProjectId;
|
|
509
555
|
}
|
|
510
556
|
const metadata = topic.metadata || {};
|
|
511
557
|
const candidate = metadata[LEGACY_SCOPE_FIELD2] || metadata.legacyProjectId || metadata.projectId || metadata.scopeProjectId;
|
|
512
|
-
return candidate ? candidate : void 0;
|
|
558
|
+
return typeof candidate === "string" ? normalizeScopeValue(candidate) : void 0;
|
|
513
559
|
}
|
|
514
560
|
function normalizeScopeValue(value) {
|
|
515
561
|
if (typeof value !== "string") {
|
|
@@ -534,8 +580,9 @@ function pickPrimaryTopic(candidates) {
|
|
|
534
580
|
})[0];
|
|
535
581
|
}
|
|
536
582
|
async function findTopicsByScopeAlias(ctx, scopeId) {
|
|
583
|
+
const query = ctx.db.query("topics");
|
|
537
584
|
try {
|
|
538
|
-
return await
|
|
585
|
+
return await query.withIndex(
|
|
539
586
|
"by_graph_scope_project",
|
|
540
587
|
(q) => q.eq(LEGACY_SCOPE_FIELD2, scopeId)
|
|
541
588
|
).collect();
|
|
@@ -547,7 +594,7 @@ async function findTopicsByScopeAlias(ctx, scopeId) {
|
|
|
547
594
|
scopeId
|
|
548
595
|
}
|
|
549
596
|
);
|
|
550
|
-
const topics = await
|
|
597
|
+
const topics = await query.collect();
|
|
551
598
|
return topics.filter((topic) => {
|
|
552
599
|
const normalizedGlobalId = normalizeScopeValue(topic.globalId);
|
|
553
600
|
const mappedProjectId = asMappedProjectId(topic);
|
|
@@ -603,137 +650,115 @@ async function resolveInheritedWorkspaceScope(ctx, topic) {
|
|
|
603
650
|
let current = topic;
|
|
604
651
|
for (let i = 0; i < MAX_DEPTH && current?.parentTopicId; i++) {
|
|
605
652
|
current = await ctx.db.get(current.parentTopicId);
|
|
606
|
-
if (!current)
|
|
653
|
+
if (!current) {
|
|
654
|
+
break;
|
|
655
|
+
}
|
|
607
656
|
if (!tenantId) {
|
|
608
657
|
tenantId = normalizeScopeValue(current.tenantId);
|
|
609
658
|
}
|
|
610
659
|
if (!workspaceId) {
|
|
611
660
|
workspaceId = normalizeScopeValue(current.workspaceId);
|
|
612
661
|
}
|
|
613
|
-
if (tenantId && workspaceId)
|
|
662
|
+
if (tenantId && workspaceId) {
|
|
663
|
+
break;
|
|
664
|
+
}
|
|
614
665
|
}
|
|
615
666
|
return { tenantId, workspaceId };
|
|
616
667
|
}
|
|
617
668
|
async function resolveTopicProjectScope(ctx, args) {
|
|
618
669
|
if (args.topicId) {
|
|
619
|
-
|
|
620
|
-
try {
|
|
621
|
-
topic = await ctx.db.get(
|
|
622
|
-
args.topicId
|
|
623
|
-
);
|
|
624
|
-
} catch (error) {
|
|
625
|
-
debugGraphPrimitiveFallback(
|
|
626
|
-
"[topicScope] Failed to load topic by direct id",
|
|
627
|
-
{
|
|
628
|
-
error,
|
|
629
|
-
topicId: args.topicId
|
|
630
|
-
}
|
|
631
|
-
);
|
|
632
|
-
}
|
|
633
|
-
if (!topic) {
|
|
634
|
-
topic = await tryResolveHostTopicById(ctx, String(args.topicId));
|
|
635
|
-
}
|
|
636
|
-
if (!topic) {
|
|
637
|
-
topic = pickPrimaryTopic(
|
|
638
|
-
await findTopicsByScopeAlias(ctx, String(args.topicId))
|
|
639
|
-
) ?? null;
|
|
640
|
-
}
|
|
641
|
-
if (!topic) {
|
|
642
|
-
const nodeScope = await resolveTopicNodeScopeOrNull(
|
|
643
|
-
ctx,
|
|
644
|
-
String(args.topicId)
|
|
645
|
-
);
|
|
646
|
-
if (nodeScope) {
|
|
647
|
-
return nodeScope;
|
|
648
|
-
}
|
|
649
|
-
throw new Error(`Topic not found: ${String(args.topicId)}`);
|
|
650
|
-
}
|
|
651
|
-
const inherited = await resolveInheritedWorkspaceScope(ctx, topic);
|
|
652
|
-
const mapped = asMappedProjectId(topic);
|
|
653
|
-
if (mapped) {
|
|
654
|
-
return {
|
|
655
|
-
topicId: topic._id,
|
|
656
|
-
projectId: mapped,
|
|
657
|
-
tenantId: inherited.tenantId,
|
|
658
|
-
workspaceId: inherited.workspaceId,
|
|
659
|
-
source: "topic"
|
|
660
|
-
};
|
|
661
|
-
}
|
|
662
|
-
return {
|
|
663
|
-
topicId: topic._id,
|
|
664
|
-
tenantId: inherited.tenantId,
|
|
665
|
-
workspaceId: inherited.workspaceId,
|
|
666
|
-
source: "topic"
|
|
667
|
-
};
|
|
670
|
+
return await resolveScopeFromTopicId(ctx, args.topicId);
|
|
668
671
|
}
|
|
669
672
|
if (args.projectId) {
|
|
670
|
-
|
|
671
|
-
try {
|
|
672
|
-
directTopic = await ctx.db.get(
|
|
673
|
-
args.projectId
|
|
674
|
-
);
|
|
675
|
-
} catch (error) {
|
|
676
|
-
debugGraphPrimitiveFallback(
|
|
677
|
-
"[topicScope] Failed to load direct project topic",
|
|
678
|
-
{
|
|
679
|
-
error,
|
|
680
|
-
projectId: args.projectId
|
|
681
|
-
}
|
|
682
|
-
);
|
|
683
|
-
}
|
|
684
|
-
if (directTopic) {
|
|
685
|
-
const inherited = await resolveInheritedWorkspaceScope(ctx, directTopic);
|
|
686
|
-
const mapped = asMappedProjectId(directTopic);
|
|
687
|
-
return {
|
|
688
|
-
topicId: directTopic._id,
|
|
689
|
-
projectId: mapped ?? args.projectId,
|
|
690
|
-
tenantId: inherited.tenantId,
|
|
691
|
-
workspaceId: inherited.workspaceId,
|
|
692
|
-
source: "topic_inferred"
|
|
693
|
-
};
|
|
694
|
-
}
|
|
695
|
-
directTopic = await tryResolveHostTopicByLegacyScope(ctx, args.projectId);
|
|
696
|
-
if (directTopic) {
|
|
697
|
-
const inherited = await resolveInheritedWorkspaceScope(ctx, directTopic);
|
|
698
|
-
const mapped = asMappedProjectId(directTopic);
|
|
699
|
-
return {
|
|
700
|
-
topicId: directTopic._id,
|
|
701
|
-
projectId: mapped ?? args.projectId,
|
|
702
|
-
tenantId: inherited.tenantId,
|
|
703
|
-
workspaceId: inherited.workspaceId,
|
|
704
|
-
source: "topic_inferred"
|
|
705
|
-
};
|
|
706
|
-
}
|
|
707
|
-
const topics = await findTopicsByScopeAlias(ctx, args.projectId);
|
|
708
|
-
const primary = pickPrimaryTopic(topics);
|
|
709
|
-
if (primary) {
|
|
710
|
-
const inherited = await resolveInheritedWorkspaceScope(ctx, primary);
|
|
711
|
-
return {
|
|
712
|
-
topicId: primary._id,
|
|
713
|
-
projectId: args.projectId,
|
|
714
|
-
tenantId: inherited.tenantId,
|
|
715
|
-
workspaceId: inherited.workspaceId,
|
|
716
|
-
source: "project_mapped_topic"
|
|
717
|
-
};
|
|
718
|
-
}
|
|
719
|
-
const nodeScope = await resolveTopicNodeScopeOrNull(
|
|
720
|
-
ctx,
|
|
721
|
-
String(args.projectId)
|
|
722
|
-
);
|
|
723
|
-
if (nodeScope) {
|
|
724
|
-
return {
|
|
725
|
-
...nodeScope,
|
|
726
|
-
projectId: nodeScope.projectId ?? String(args.projectId)
|
|
727
|
-
};
|
|
728
|
-
}
|
|
729
|
-
throw new Error(
|
|
730
|
-
`Legacy project scope ${String(args.projectId)} has no mapped topic.`
|
|
731
|
-
);
|
|
673
|
+
return await resolveScopeFromLegacyProjectId(ctx, args.projectId);
|
|
732
674
|
}
|
|
733
675
|
throw new Error(
|
|
734
676
|
"Missing scope: provide topicId (preferred) or legacy projectId alias."
|
|
735
677
|
);
|
|
736
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
|
+
}
|
|
737
762
|
var optionalScopeArgs = {
|
|
738
763
|
projectId: v.optional(v.string()),
|
|
739
764
|
topicId: v.optional(v.string())
|
|
@@ -768,8 +793,6 @@ function nodeMatchesWorkspaceReasoningScope(node, scope) {
|
|
|
768
793
|
}
|
|
769
794
|
return scopeWorkspaceId === nodeWorkspaceId;
|
|
770
795
|
}
|
|
771
|
-
|
|
772
|
-
// src/epistemicBeliefs.helpers.ts
|
|
773
796
|
var insightIdUnion = v.id("epistemicNodes");
|
|
774
797
|
var DEFAULT_PROJECT_BELIEF_LIMIT = 250;
|
|
775
798
|
var MAX_PROJECT_BELIEF_LIMIT = 1e3;
|
|
@@ -781,6 +804,117 @@ var DEFAULT_CONFIDENCE_POLICY = {
|
|
|
781
804
|
function readFiniteNumber(value) {
|
|
782
805
|
return typeof value === "number" && Number.isFinite(value) ? value : void 0;
|
|
783
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
|
+
}
|
|
784
918
|
function clamp01(value) {
|
|
785
919
|
return Math.max(0, Math.min(1, value));
|
|
786
920
|
}
|
|
@@ -942,7 +1076,7 @@ function normalizePillar(pillar) {
|
|
|
942
1076
|
async function markBeliefGraphDirty(ctx, scope) {
|
|
943
1077
|
const projectId = typeof scope.projectId === "string" && scope.projectId.trim().length > 0 ? scope.projectId : void 0;
|
|
944
1078
|
const topicId = typeof scope.topicId === "string" && scope.topicId.trim().length > 0 ? scope.topicId : void 0;
|
|
945
|
-
if (!projectId
|
|
1079
|
+
if (!(projectId || topicId)) {
|
|
946
1080
|
return;
|
|
947
1081
|
}
|
|
948
1082
|
if (projectId) {
|
|
@@ -959,16 +1093,22 @@ async function markBeliefGraphDirty(ctx, scope) {
|
|
|
959
1093
|
{ topicId }
|
|
960
1094
|
);
|
|
961
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
|
+
}
|
|
962
1102
|
await resolveGraphPrimitivesAppResolvers().patchProject(
|
|
963
1103
|
ctx,
|
|
964
|
-
|
|
1104
|
+
activityScopeId,
|
|
965
1105
|
{
|
|
966
1106
|
lastActivityAt: Date.now()
|
|
967
1107
|
}
|
|
968
1108
|
);
|
|
969
1109
|
}
|
|
970
1110
|
async function resolveBeliefScopeOrNull(ctx, args) {
|
|
971
|
-
if (!args.projectId
|
|
1111
|
+
if (!(args.projectId || args.topicId)) {
|
|
972
1112
|
return null;
|
|
973
1113
|
}
|
|
974
1114
|
try {
|
|
@@ -993,14 +1133,17 @@ async function getBeliefNodesForScope(ctx, scope, args) {
|
|
|
993
1133
|
"by_topic_type",
|
|
994
1134
|
(q) => q.eq("topicId", scope.topicId).eq("nodeType", "belief")
|
|
995
1135
|
);
|
|
996
|
-
const
|
|
1136
|
+
const rows = typeof args?.scanLimit === "number" ? await baseQuery.order("desc").take(args.scanLimit) : await baseQuery.collect();
|
|
1137
|
+
const nodes = readBeliefNodeViews(rows);
|
|
997
1138
|
const scopedNodes = nodes.filter(
|
|
998
1139
|
(node) => nodeMatchesWorkspaceReasoningScope(node, scope)
|
|
999
1140
|
);
|
|
1000
1141
|
if (!args?.status) {
|
|
1001
1142
|
return scopedNodes;
|
|
1002
1143
|
}
|
|
1003
|
-
return scopedNodes.filter(
|
|
1144
|
+
return scopedNodes.filter(
|
|
1145
|
+
(node) => node.status === args.status
|
|
1146
|
+
);
|
|
1004
1147
|
}
|
|
1005
1148
|
function createBeliefAudienceResolver(registryRows) {
|
|
1006
1149
|
const audienceClassByKey = new Map(
|
|
@@ -1020,9 +1163,7 @@ function createBeliefAudienceResolver(registryRows) {
|
|
|
1020
1163
|
function flattenBeliefNode(node) {
|
|
1021
1164
|
const meta = node.metadata || {};
|
|
1022
1165
|
const worktreeId = resolveBeliefWorktreeId(meta);
|
|
1023
|
-
const tupleContradicted = readTupleContradictedFlag(
|
|
1024
|
-
node.tupleContradicted
|
|
1025
|
-
) ?? readTupleContradictedFlag(meta.tupleContradicted) ?? false;
|
|
1166
|
+
const tupleContradicted = readTupleContradictedFlag(node.tupleContradicted) ?? readTupleContradictedFlag(meta.tupleContradicted) ?? false;
|
|
1026
1167
|
return {
|
|
1027
1168
|
_id: node._id,
|
|
1028
1169
|
_epistemicNodeId: node._id,
|
|
@@ -1068,7 +1209,10 @@ function resolveBeliefStatus(node, metadata) {
|
|
|
1068
1209
|
});
|
|
1069
1210
|
}
|
|
1070
1211
|
async function hasCompletedWorktreeForBelief(ctx, beliefNodeId) {
|
|
1071
|
-
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();
|
|
1072
1216
|
for (const membership of clusterMembership) {
|
|
1073
1217
|
const worktree = await ctx.db.get(membership.worktreeId);
|
|
1074
1218
|
if (worktree?.status === "completed" || worktree?.status === "merged") {
|
|
@@ -1079,7 +1223,10 @@ async function hasCompletedWorktreeForBelief(ctx, beliefNodeId) {
|
|
|
1079
1223
|
}
|
|
1080
1224
|
async function getActiveConfidencePolicy(ctx) {
|
|
1081
1225
|
try {
|
|
1082
|
-
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();
|
|
1083
1230
|
return {
|
|
1084
1231
|
scoringMode: activeConfig?.confidencePolicy === "always" ? "always" : DEFAULT_CONFIDENCE_POLICY.scoringMode,
|
|
1085
1232
|
tupleContradiction: normalizeTupleContradictionPolicy(
|
|
@@ -1112,6 +1259,6 @@ async function requireAuthenticatedUserId(ctx) {
|
|
|
1112
1259
|
return userId;
|
|
1113
1260
|
}
|
|
1114
1261
|
|
|
1115
|
-
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, resolveBeliefScopeOrNull, resolveBeliefStatus, resolveBeliefWorktreeId };
|
|
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 };
|
|
1116
1263
|
//# sourceMappingURL=epistemicBeliefs.helpers.js.map
|
|
1117
1264
|
//# sourceMappingURL=epistemicBeliefs.helpers.js.map
|