@lucern/graph-primitives 1.0.29 → 1.0.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{beliefDecay-DZ6tkLYq.d.ts → beliefDecay-BmkEk5OJ.d.ts} +3 -3
- package/dist/beliefDecay.d.ts +1 -1
- package/dist/beliefDecay.js +448 -314
- package/dist/beliefDecay.js.map +1 -1
- package/dist/{beliefEvidenceLinks-CWOXxxJg.d.ts → beliefEvidenceLinks-BzfjON_6.d.ts} +13 -13
- package/dist/beliefEvidenceLinks.d.ts +1 -1
- package/dist/beliefEvidenceLinks.js +843 -624
- package/dist/beliefEvidenceLinks.js.map +1 -1
- package/dist/beliefEvidenceLinks.operational.d.ts +7 -5
- package/dist/beliefEvidenceLinks.operational.js +91 -18
- package/dist/beliefEvidenceLinks.operational.js.map +1 -1
- package/dist/beliefLifecycle.js.map +1 -1
- package/dist/confidencePropagationDispatch.d.ts +28 -27
- package/dist/confidencePropagationDispatch.js +157 -99
- package/dist/confidencePropagationDispatch.js.map +1 -1
- package/dist/{contradictions-51VLsESq.d.ts → contradictions-BATPuZTL.d.ts} +10 -10
- package/dist/contradictions.d.ts +1 -1
- package/dist/contradictions.js +395 -225
- package/dist/contradictions.js.map +1 -1
- package/dist/convex.d.ts +65 -30
- package/dist/convex.js +7 -3
- package/dist/convex.js.map +1 -1
- package/dist/debug.js.map +1 -1
- package/dist/edgeValidation.js +293 -85
- package/dist/edgeValidation.js.map +1 -1
- package/dist/edges/contains.d.ts +1 -1
- package/dist/edges/contains.js.map +1 -1
- package/dist/edges/contradicts.d.ts +1 -1
- package/dist/edges/contradicts.js.map +1 -1
- package/dist/edges/{dependsOn.d.ts → depends-on.d.ts} +1 -1
- package/dist/edges/{dependsOn.js → depends-on.js} +4 -4
- package/dist/edges/depends-on.js.map +1 -0
- package/dist/edges/{derivedFrom.d.ts → derived-from.d.ts} +1 -1
- package/dist/edges/{derivedFrom.js → derived-from.js} +3 -3
- package/dist/edges/derived-from.js.map +1 -0
- package/dist/edges/elaborates.d.ts +1 -1
- package/dist/edges/elaborates.js.map +1 -1
- package/dist/edges/index.d.ts +7 -3
- package/dist/edges/index.js +7 -4
- package/dist/edges/index.js.map +1 -1
- package/dist/edges/informs.d.ts +1 -1
- package/dist/edges/informs.js.map +1 -1
- package/dist/edges/{propagationTypes.d.ts → propagation-types.d.ts} +14 -14
- package/dist/edges/{propagationTypes.js → propagation-types.js} +3 -3
- package/dist/edges/propagation-types.js.map +1 -0
- package/dist/edges/refutes.d.ts +1 -1
- package/dist/edges/refutes.js.map +1 -1
- package/dist/edges/supports.d.ts +1 -1
- package/dist/edges/supports.js.map +1 -1
- package/dist/edges/tests.d.ts +1 -1
- package/dist/edges/tests.js.map +1 -1
- package/dist/edges/utils.d.ts +1 -1
- package/dist/edges/utils.js.map +1 -1
- package/dist/embeddingTrigger.d.ts +14 -6
- package/dist/embeddingTrigger.js +11 -14
- package/dist/embeddingTrigger.js.map +1 -1
- package/dist/{entityBridge-DMaKooYn.d.ts → entityBridge-BhVDM3pc.d.ts} +5 -5
- package/dist/entityBridge.d.ts +1 -1
- package/dist/entityBridge.js +602 -225
- package/dist/entityBridge.js.map +1 -1
- package/dist/entityCanonicalMatch.d.ts +14 -12
- package/dist/entityCanonicalMatch.js.map +1 -1
- package/dist/{entityLifecycle-CvgSK5FV.d.ts → entityLifecycle-BsfCz9pS.d.ts} +5 -9
- package/dist/entityLifecycle.d.ts +1 -1
- package/dist/entityLifecycle.js +854 -480
- package/dist/entityLifecycle.js.map +1 -1
- package/dist/{entityValidation-KLZ_Xl2D.d.ts → entityValidation-B1yNEHJx.d.ts} +7 -6
- package/dist/entityValidation.d.ts +3 -1
- package/dist/entityValidation.js +60 -8
- package/dist/entityValidation.js.map +1 -1
- package/dist/{epistemicAnswers-C5ib4z6_.d.ts → epistemicAnswers-f47YMu9U.d.ts} +6 -6
- package/dist/epistemicAnswers.d.ts +1 -1
- package/dist/epistemicAnswers.js +587 -545
- package/dist/epistemicAnswers.js.map +1 -1
- package/dist/epistemicBeliefs.admin.d.ts +8 -8
- package/dist/epistemicBeliefs.admin.js +365 -166
- package/dist/epistemicBeliefs.admin.js.map +1 -1
- package/dist/epistemicBeliefs.backfills.d.ts +8 -8
- package/dist/epistemicBeliefs.backfills.js +655 -289
- package/dist/epistemicBeliefs.backfills.js.map +1 -1
- package/dist/epistemicBeliefs.confidence.d.ts +19 -15
- package/dist/epistemicBeliefs.confidence.js +633 -386
- package/dist/epistemicBeliefs.confidence.js.map +1 -1
- package/dist/epistemicBeliefs.core.d.ts +6 -6
- package/dist/epistemicBeliefs.core.js +717 -371
- package/dist/epistemicBeliefs.core.js.map +1 -1
- package/dist/epistemicBeliefs.d.ts +11 -9
- package/dist/epistemicBeliefs.forkEvidence.d.ts +2 -0
- package/dist/epistemicBeliefs.forkEvidence.js +8 -8
- package/dist/epistemicBeliefs.forkEvidence.js.map +1 -1
- package/dist/epistemicBeliefs.helpers.d.ts +68 -49
- package/dist/epistemicBeliefs.helpers.js +358 -211
- package/dist/epistemicBeliefs.helpers.js.map +1 -1
- package/dist/epistemicBeliefs.internal.d.ts +5 -5
- package/dist/epistemicBeliefs.internal.js +1248 -1026
- package/dist/epistemicBeliefs.internal.js.map +1 -1
- package/dist/epistemicBeliefs.js +4942 -3590
- package/dist/epistemicBeliefs.js.map +1 -1
- package/dist/epistemicBeliefs.lifecycle.d.ts +5 -5
- package/dist/epistemicBeliefs.lifecycle.js +1138 -781
- package/dist/epistemicBeliefs.lifecycle.js.map +1 -1
- package/dist/epistemicBeliefs.links.d.ts +7 -7
- package/dist/epistemicBeliefs.links.js +404 -267
- package/dist/epistemicBeliefs.links.js.map +1 -1
- package/dist/epistemicBeliefs.queries.d.ts +4 -4
- package/dist/epistemicBeliefs.queries.js +175 -20
- package/dist/epistemicBeliefs.queries.js.map +1 -1
- package/dist/epistemicBeliefs.topicAnchor.d.ts +6 -4
- package/dist/epistemicBeliefs.topicAnchor.js +12 -5
- package/dist/epistemicBeliefs.topicAnchor.js.map +1 -1
- package/dist/epistemicContracts.d.ts +28 -3
- package/dist/epistemicContracts.evaluators.d.ts +2 -0
- package/dist/epistemicContracts.evaluators.js +1062 -576
- package/dist/epistemicContracts.evaluators.js.map +1 -1
- package/dist/epistemicContracts.handlers.d.ts +15 -32
- package/dist/epistemicContracts.handlers.js +1829 -1351
- package/dist/epistemicContracts.handlers.js.map +1 -1
- package/dist/epistemicContracts.js +1131 -636
- package/dist/epistemicContracts.js.map +1 -1
- package/dist/epistemicContracts.metrics.d.ts +2 -0
- package/dist/epistemicContracts.metrics.js +375 -158
- package/dist/epistemicContracts.metrics.js.map +1 -1
- package/dist/epistemicContracts.types.d.ts +87 -81
- package/dist/epistemicEdgeCreation.d.ts +2 -0
- package/dist/epistemicEdgeCreation.js +87 -16
- package/dist/epistemicEdgeCreation.js.map +1 -1
- package/dist/{epistemicEdges-BF-cn4i3.d.ts → epistemicEdges-BGBh0QSP.d.ts} +4 -7
- package/dist/epistemicEdges.d.ts +6 -5
- package/dist/epistemicEdges.handlers.d.ts +3 -3
- package/dist/epistemicEdges.handlers.js +129 -24
- package/dist/epistemicEdges.handlers.js.map +1 -1
- package/dist/epistemicEdges.helpers.d.ts +6 -4
- package/dist/epistemicEdges.helpers.js +37 -2
- package/dist/epistemicEdges.helpers.js.map +1 -1
- package/dist/epistemicEdges.js +1966 -1202
- package/dist/epistemicEdges.js.map +1 -1
- package/dist/epistemicEdges.mutations.d.ts +7 -7
- package/dist/epistemicEdges.mutations.js +956 -579
- package/dist/epistemicEdges.mutations.js.map +1 -1
- package/dist/epistemicEdges.queries.d.ts +16 -16
- package/dist/epistemicEdges.queries.js +639 -367
- package/dist/epistemicEdges.queries.js.map +1 -1
- package/dist/epistemicEdges.types.d.ts +10 -8
- package/dist/epistemicEvidence.d.ts +4 -1
- package/dist/epistemicEvidence.js +933 -532
- package/dist/epistemicEvidence.js.map +1 -1
- package/dist/epistemicEvidenceHelpers.d.ts +26 -10
- package/dist/epistemicEvidenceHelpers.js +239 -200
- package/dist/epistemicEvidenceHelpers.js.map +1 -1
- package/dist/epistemicEvidenceMutations.d.ts +8 -8
- package/dist/epistemicEvidenceMutations.js +840 -692
- package/dist/epistemicEvidenceMutations.js.map +1 -1
- package/dist/epistemicEvidenceQueries.d.ts +8 -8
- package/dist/epistemicEvidenceQueries.js +514 -238
- package/dist/epistemicEvidenceQueries.js.map +1 -1
- package/dist/epistemicHelpers.d.ts +4 -2
- package/dist/epistemicHelpers.js +308 -134
- package/dist/epistemicHelpers.js.map +1 -1
- package/dist/epistemicInsert.d.ts +16 -4
- package/dist/epistemicInsert.js +6 -3
- package/dist/epistemicInsert.js.map +1 -1
- package/dist/epistemicLayerRules.d.ts +10 -8
- package/dist/epistemicLayerRules.js +1 -5
- package/dist/epistemicLayerRules.js.map +1 -1
- package/dist/{epistemicLinking-CfE00tHJ.d.ts → epistemicLinking-CsCDv2cN.d.ts} +3 -3
- package/dist/epistemicLinking.d.ts +1 -1
- package/dist/epistemicLinking.js +177 -100
- package/dist/epistemicLinking.js.map +1 -1
- package/dist/epistemicNodeCreation.d.ts +2 -0
- package/dist/epistemicNodeCreation.js +203 -40
- package/dist/epistemicNodeCreation.js.map +1 -1
- package/dist/{epistemicNodes-BCQxpYx_.d.ts → epistemicNodes-CokAgBHg.d.ts} +3 -3
- package/dist/epistemicNodes.d.ts +3 -3
- package/dist/epistemicNodes.helpers.d.ts +24 -15
- package/dist/epistemicNodes.helpers.js.map +1 -1
- package/dist/epistemicNodes.internal.d.ts +6 -6
- package/dist/epistemicNodes.internal.js +389 -319
- package/dist/epistemicNodes.internal.js.map +1 -1
- package/dist/epistemicNodes.js +700 -504
- package/dist/epistemicNodes.js.map +1 -1
- package/dist/epistemicNodes.mutations.d.ts +6 -6
- package/dist/epistemicNodes.mutations.js +560 -463
- package/dist/epistemicNodes.mutations.js.map +1 -1
- package/dist/epistemicNodes.queries.d.ts +8 -8
- package/dist/epistemicNodes.queries.js +311 -314
- package/dist/epistemicNodes.queries.js.map +1 -1
- package/dist/epistemicNodes.validators.d.ts +2 -2
- package/dist/epistemicNodes.validators.js.map +1 -1
- package/dist/epistemicQuestions.conviction.d.ts +8 -8
- package/dist/epistemicQuestions.conviction.js +665 -484
- package/dist/epistemicQuestions.conviction.js.map +1 -1
- package/dist/epistemicQuestions.create.d.ts +4 -4
- package/dist/epistemicQuestions.create.js +640 -612
- package/dist/epistemicQuestions.create.js.map +1 -1
- package/dist/epistemicQuestions.d.ts +8 -5
- package/dist/epistemicQuestions.evidence.d.ts +2 -2
- package/dist/epistemicQuestions.evidence.js +475 -383
- package/dist/epistemicQuestions.evidence.js.map +1 -1
- package/dist/epistemicQuestions.helpers.d.ts +125 -24
- package/dist/epistemicQuestions.helpers.js +240 -209
- package/dist/epistemicQuestions.helpers.js.map +1 -1
- package/dist/epistemicQuestions.js +3474 -2823
- package/dist/epistemicQuestions.js.map +1 -1
- package/dist/epistemicQuestions.lifecycle.d.ts +2 -2
- package/dist/epistemicQuestions.lifecycle.js +607 -546
- package/dist/epistemicQuestions.lifecycle.js.map +1 -1
- package/dist/epistemicQuestions.queries.d.ts +12 -7
- package/dist/epistemicQuestions.queries.js +305 -244
- package/dist/epistemicQuestions.queries.js.map +1 -1
- package/dist/epistemicQuestions.sprint.d.ts +2 -2
- package/dist/epistemicQuestions.sprint.js +600 -394
- package/dist/epistemicQuestions.sprint.js.map +1 -1
- package/dist/epistemicQuestions.tail.d.ts +6 -6
- package/dist/epistemicQuestions.tail.js +572 -433
- package/dist/epistemicQuestions.tail.js.map +1 -1
- package/dist/{epistemicSources-dlKj58Jp.d.ts → epistemicSources-DQtaEkWs.d.ts} +4 -4
- package/dist/epistemicSources.d.ts +1 -1
- package/dist/epistemicSources.js +351 -311
- package/dist/epistemicSources.js.map +1 -1
- package/dist/evaluators/index.d.ts +8 -6
- package/dist/evaluators/index.js +399 -167
- package/dist/evaluators/index.js.map +1 -1
- package/dist/evaluators/lint-checker-evaluator.d.ts +16 -0
- package/dist/evaluators/{lintCheckerEvaluator.js → lint-checker-evaluator.js} +10 -5
- package/dist/evaluators/lint-checker-evaluator.js.map +1 -0
- package/dist/evaluators/{sentryCheckerEvaluator.d.ts → sentry-checker-evaluator.d.ts} +7 -2
- package/dist/evaluators/{sentryCheckerEvaluator.js → sentry-checker-evaluator.js} +3 -3
- package/dist/evaluators/sentry-checker-evaluator.js.map +1 -0
- package/dist/evaluators/shared.d.ts +2 -2
- package/dist/evaluators/shared.js +3 -1
- package/dist/evaluators/shared.js.map +1 -1
- package/dist/evaluators/{testRunnerEvaluator.d.ts → test-runner-evaluator.d.ts} +6 -1
- package/dist/evaluators/{testRunnerEvaluator.js → test-runner-evaluator.js} +6 -4
- package/dist/evaluators/test-runner-evaluator.js.map +1 -0
- package/dist/evaluators/tsc-checker-evaluator.d.ts +16 -0
- package/dist/evaluators/{tscCheckerEvaluator.js → tsc-checker-evaluator.js} +10 -5
- package/dist/evaluators/tsc-checker-evaluator.js.map +1 -0
- package/dist/graphTypes.js +6 -2
- package/dist/graphTypes.js.map +1 -1
- package/dist/helpers.d.ts +2 -0
- package/dist/helpers.js +313 -93
- package/dist/helpers.js.map +1 -1
- package/dist/{index-C-Kyd7hD.d.ts → index-DZxyC9Pb.d.ts} +7 -6
- package/dist/index.d.ts +86 -83
- package/dist/index.js +16914 -11760
- package/dist/index.js.map +1 -1
- package/dist/invariantEnforcement.d.ts +3 -3
- package/dist/invariantEnforcement.js.map +1 -1
- package/dist/logicalRoleInference.d.ts +2 -0
- package/dist/logicalRoleInference.js +1 -1
- package/dist/logicalRoleInference.js.map +1 -1
- package/dist/matcherFeedbackUtils.d.ts +2 -2
- package/dist/matcherFeedbackUtils.js.map +1 -1
- package/dist/{ontology-matching-C6rrz2VP.d.ts → ontology-matching-C-mYFrir.d.ts} +16 -16
- package/dist/ontology-matching.d.ts +1 -1
- package/dist/{ontologyApproval-CFYmqKmk.d.ts → ontologyApproval-BVt0feJi.d.ts} +10 -10
- package/dist/ontologyApproval.d.ts +1 -1
- package/dist/ontologyApproval.js +7 -1
- package/dist/ontologyApproval.js.map +1 -1
- package/dist/ontologyDefinitions.d.ts +14 -24
- package/dist/ontologyDefinitions.js +269 -34
- package/dist/ontologyDefinitions.js.map +1 -1
- package/dist/ontologyHelpers.d.ts +13 -13
- package/dist/ontologyHelpers.js.map +1 -1
- package/dist/{ontologyRegistry-B67rPJ16.d.ts → ontologyRegistry-CljS-ENv.d.ts} +2 -2
- package/dist/ontologyRegistry.d.ts +1 -1
- package/dist/ontologyRegistry.js +34 -6
- package/dist/ontologyRegistry.js.map +1 -1
- package/dist/{projectionReconciliation-jww2fBI0.d.ts → projectionReconciliation-DnrSgHSQ.d.ts} +4 -4
- package/dist/projectionReconciliation.d.ts +1 -1
- package/dist/projectionReconciliation.js +57 -10
- package/dist/projectionReconciliation.js.map +1 -1
- package/dist/{projectionStaleness-CmdbpjVK.d.ts → projectionStaleness-C8ImQ2zP.d.ts} +17 -17
- package/dist/projectionStaleness.d.ts +1 -1
- package/dist/projectionStaleness.js +8 -2
- package/dist/projectionStaleness.js.map +1 -1
- package/dist/proof-attestation.json +1 -1
- package/dist/{questionEvidenceLinks-DFlyPpAj.d.ts → questionEvidenceLinks-_nPRa-LY.d.ts} +10 -10
- package/dist/questionEvidenceLinks.d.ts +1 -1
- package/dist/questionEvidenceLinks.js +564 -347
- package/dist/questionEvidenceLinks.js.map +1 -1
- package/dist/{resolverTypes-CC8Ea2E2.d.ts → resolverTypes-BOXPxLET.d.ts} +8 -7
- package/dist/resolverTypes.d.ts +4 -2
- package/dist/{resolvers-Br1a6eLV.d.ts → resolvers-B1TIBmRO.d.ts} +3 -1
- package/dist/resolvers.d.ts +5 -3
- package/dist/resolvers.js +121 -77
- package/dist/resolvers.js.map +1 -1
- package/dist/scopeResolverCompat.d.ts +10 -7
- package/dist/scopeResolverCompat.js +106 -123
- package/dist/scopeResolverCompat.js.map +1 -1
- package/dist/{text-matching-DNg4M5Wd.d.ts → text-matching-DzFooju6.d.ts} +7 -7
- package/dist/text-matching.d.ts +1 -1
- package/dist/topicOntologyResolver.d.ts +22 -21
- package/dist/topicOntologyResolver.js +54 -32
- package/dist/topicOntologyResolver.js.map +1 -1
- package/dist/topicProjectOverlay.d.ts +30 -20
- package/dist/topicProjectOverlay.js +120 -76
- package/dist/topicProjectOverlay.js.map +1 -1
- package/dist/{topicScope-7zhyeGl7.d.ts → topicScope-DJVa0mLa.d.ts} +22 -7
- package/dist/topicScope.d.ts +3 -1
- package/dist/topicScope.js +104 -119
- package/dist/topicScope.js.map +1 -1
- package/dist/workflowBridge.d.ts +26 -15
- package/dist/workflowBridge.js +140 -144
- package/dist/workflowBridge.js.map +1 -1
- package/dist/workspaceIsolation.d.ts +14 -12
- package/dist/workspaceIsolation.js +108 -122
- package/dist/workspaceIsolation.js.map +1 -1
- package/package.json +4 -4
- package/dist/edges/dependsOn.js.map +0 -1
- package/dist/edges/derivedFrom.js.map +0 -1
- package/dist/edges/propagationTypes.js.map +0 -1
- package/dist/evaluators/lintCheckerEvaluator.d.ts +0 -11
- package/dist/evaluators/lintCheckerEvaluator.js.map +0 -1
- package/dist/evaluators/sentryCheckerEvaluator.js.map +0 -1
- package/dist/evaluators/testRunnerEvaluator.js.map +0 -1
- package/dist/evaluators/tscCheckerEvaluator.d.ts +0 -11
- package/dist/evaluators/tscCheckerEvaluator.js.map +0 -1
- package/dist/{epistemicQuestions-bwHd2FWE.d.ts → epistemicQuestions-Do1fhYm5.d.ts} +4 -4
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
|
|
1
|
+
interface BeliefNodeLike {
|
|
2
2
|
_id?: string;
|
|
3
|
-
nodeType?: unknown;
|
|
4
3
|
confidence?: unknown;
|
|
5
4
|
metadata?: unknown;
|
|
5
|
+
nodeType?: unknown;
|
|
6
6
|
predictionMeta?: unknown;
|
|
7
|
-
}
|
|
7
|
+
}
|
|
8
8
|
declare function isBeliefNode(node: BeliefNodeLike | null | undefined): boolean;
|
|
9
9
|
declare function isOntologicalNode(node: BeliefNodeLike | null | undefined): boolean;
|
|
10
10
|
declare function isScoredBeliefNode(node: BeliefNodeLike): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/beliefLifecycle.ts","../src/invariantEnforcement.ts"],"names":[],"mappings":"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","file":"invariantEnforcement.js","sourcesContent":["/**\n * Belief lifecycle helpers shared across Convex modules.\n *\n * Canonical lifecycle:\n * assumption -> hypothesis -> active -> resolved_true/resolved_false\n * \\-> superseded\n */\n\nexport type BeliefLifecycleStatus =\n | \"assumption\"\n | \"hypothesis\"\n | \"active\"\n | \"superseded\"\n | \"resolved_true\"\n | \"resolved_false\";\n\ntype PredictionOutcome =\n | \"pending\"\n | \"confirmed\"\n | \"disconfirmed\"\n | \"partial\"\n | \"expired\";\n\nconst BELIEF_STATUS_VALUES: readonly BeliefLifecycleStatus[] = [\n \"assumption\",\n \"hypothesis\",\n \"active\",\n \"superseded\",\n \"resolved_true\",\n \"resolved_false\",\n];\n\nconst RESOLVED_PREDICTION_OUTCOMES: readonly PredictionOutcome[] = [\n \"confirmed\",\n \"disconfirmed\",\n \"partial\",\n \"expired\",\n];\n\nexport function isBeliefLifecycleStatus(\n value: unknown\n): value is BeliefLifecycleStatus {\n return (\n typeof value === \"string\" &&\n BELIEF_STATUS_VALUES.includes(value as BeliefLifecycleStatus)\n );\n}\n\nfunction normalizeLegacyBeliefStatus(\n value: unknown\n): BeliefLifecycleStatus | null {\n if (isBeliefLifecycleStatus(value)) {\n return value;\n }\n if (value === \"belief\" || value === \"established\" || value === \"emerging\") {\n return \"active\";\n }\n if (value === \"fact\" || value === \"confirmed\") {\n return \"resolved_true\";\n }\n if (value === \"disconfirmed\" || value === \"expired\") {\n return \"resolved_false\";\n }\n if (value === \"deprecated\") {\n return \"superseded\";\n }\n return null;\n}\n\nfunction normalizeBeliefConfidence(confidence: unknown): number | null {\n if (typeof confidence !== \"number\" || !Number.isFinite(confidence)) {\n return null;\n }\n if (confidence >= 0 && confidence <= 1) {\n return confidence;\n }\n // Backward compatibility with historical percentage-scale confidence (0-100).\n if (confidence > 1 && confidence <= 100) {\n return confidence / 100;\n }\n return null;\n}\n\nexport function isResolvedByConfidence(confidence: unknown): boolean {\n const normalized = normalizeBeliefConfidence(confidence);\n if (normalized === null) {\n return false;\n }\n return normalized <= 0 || normalized >= 1;\n}\n\nexport function hasResolvedPredictionOutcome(predictionMeta: unknown): boolean {\n if (!predictionMeta || typeof predictionMeta !== \"object\") {\n return false;\n }\n const outcome = (predictionMeta as { outcome?: unknown }).outcome;\n return (\n typeof outcome === \"string\" &&\n RESOLVED_PREDICTION_OUTCOMES.includes(outcome as PredictionOutcome)\n );\n}\n\nfunction getPredictionMetaFromMetadata(\n metadata: Record<string, unknown> | undefined\n): unknown {\n return metadata?.predictionMeta;\n}\n\nexport function shouldTreatBeliefAsFact(opts: {\n confidence?: unknown;\n predictionMeta?: unknown;\n metadata?: Record<string, unknown>;\n}): boolean {\n if (isResolvedByConfidence(opts.confidence)) {\n return true;\n }\n if (hasResolvedPredictionOutcome(opts.predictionMeta)) {\n return true;\n }\n if (\n hasResolvedPredictionOutcome(getPredictionMetaFromMetadata(opts.metadata))\n ) {\n return true;\n }\n return false;\n}\n\nfunction resolvedPredictionStatus(\n predictionMeta: unknown\n): BeliefLifecycleStatus | null {\n if (!predictionMeta || typeof predictionMeta !== \"object\") {\n return null;\n }\n const outcome = (predictionMeta as { outcome?: unknown }).outcome;\n if (outcome === \"confirmed\") {\n return \"resolved_true\";\n }\n if (outcome === \"disconfirmed\" || outcome === \"expired\") {\n return \"resolved_false\";\n }\n return null;\n}\n\nfunction shouldTreatBeliefAsResolved(opts: {\n confidence?: unknown;\n predictionMeta?: unknown;\n metadata?: Record<string, unknown>;\n}): BeliefLifecycleStatus | null {\n if (isResolvedByConfidence(opts.confidence)) {\n const normalized = normalizeBeliefConfidence(opts.confidence);\n return normalized === 0 ? \"resolved_false\" : \"resolved_true\";\n }\n const directPredictionStatus = resolvedPredictionStatus(opts.predictionMeta);\n if (directPredictionStatus) {\n return directPredictionStatus;\n }\n const metadataPredictionStatus = resolvedPredictionStatus(\n getPredictionMetaFromMetadata(opts.metadata)\n );\n if (metadataPredictionStatus) {\n return metadataPredictionStatus;\n }\n return null;\n}\n\nexport function resolveBeliefLifecycleStatus(opts: {\n beliefStatus?: unknown;\n confidence?: unknown;\n predictionMeta?: unknown;\n metadata?: Record<string, unknown>;\n}): BeliefLifecycleStatus {\n const resolvedStatus = shouldTreatBeliefAsResolved(opts);\n if (resolvedStatus) {\n return resolvedStatus;\n }\n\n const direct = opts.beliefStatus;\n const normalizedDirect = normalizeLegacyBeliefStatus(direct);\n if (normalizedDirect) {\n // If the belief has been scored (has numeric credence) but stored status\n // is still pre-validation, promote to active. Evidence, not user intent,\n // makes a hypothesis active.\n const normalized = normalizeBeliefConfidence(opts.confidence);\n if (\n normalized !== null &&\n isPreValidationBeliefStatus(normalizedDirect)\n ) {\n return \"active\";\n }\n return normalizedDirect;\n }\n\n const metaStatus = opts.metadata?.beliefStatus;\n const normalizedMetaStatus = normalizeLegacyBeliefStatus(metaStatus);\n if (normalizedMetaStatus) {\n const normalized = normalizeBeliefConfidence(opts.confidence);\n if (\n normalized !== null &&\n isPreValidationBeliefStatus(normalizedMetaStatus)\n ) {\n return \"active\";\n }\n return normalizedMetaStatus;\n }\n\n return \"assumption\";\n}\n\nexport function isPreValidationBeliefStatus(\n status: BeliefLifecycleStatus\n): boolean {\n return status === \"assumption\" || status === \"hypothesis\";\n}\n\nexport function isPropagationEligibleBeliefStatus(\n status: BeliefLifecycleStatus\n): boolean {\n return status === \"active\" || status === \"resolved_true\";\n}\n\nexport function promoteBeliefStatusAfterScoring(\n status: BeliefLifecycleStatus,\n opts?: {\n confidence?: unknown;\n predictionMeta?: unknown;\n metadata?: Record<string, unknown>;\n }\n): BeliefLifecycleStatus {\n const resolvedStatus = shouldTreatBeliefAsResolved({ ...opts });\n if (resolvedStatus) {\n return resolvedStatus;\n }\n if (isPreValidationBeliefStatus(status)) {\n return \"active\";\n }\n return status;\n}\n\nexport function promoteBeliefStatusAfterEvidence(\n status: BeliefLifecycleStatus\n): BeliefLifecycleStatus {\n return isPreValidationBeliefStatus(status) ? \"active\" : status;\n}\n","/** Invariant error helpers that protect belief lifecycle mutations. */\nimport { hasResolvedPredictionOutcome } from \"./beliefLifecycle\";\n\ntype StructuredInvariantError = Error & {\n status: number;\n code: string;\n invariantCode?: string;\n suggestion?: string;\n details?: unknown;\n};\n\ntype BeliefNodeLike = {\n _id?: string;\n nodeType?: unknown;\n confidence?: unknown;\n metadata?: unknown;\n predictionMeta?: unknown;\n};\n\ntype InvariantArgs = {\n message: string;\n invariantCode:\n | \"belief.formulation_immutable_after_scoring\"\n | \"belief.confidence_append_only\"\n | \"belief.status_transition_requires_belief_api\"\n | \"belief.lineage_requires_fork_belief\"\n | \"belief.hard_delete_forbidden\"\n | \"entity.create_requires_entity_lifecycle\"\n | \"entity.update_requires_entity_lifecycle\"\n | \"entity.archive_requires_entity_lifecycle\"\n | \"entity.supersede_requires_entity_lifecycle\";\n suggestion: string;\n status?: number;\n code?: string;\n details?: unknown;\n};\n\nconst FORBIDDEN_GENERIC_BELIEF_METADATA_KEYS = new Set([\n \"beliefStatus\",\n \"epistemicStatus\",\n \"forkedBy\",\n \"forkedFrom\",\n \"forkReason\",\n \"forkTimestamp\",\n \"status\",\n \"supersededBy\",\n \"supersedes\",\n]);\n\nconst ONTOLOGICAL_NODE_TYPES = new Set([\n \"company\",\n \"person\",\n \"investor\",\n \"function\",\n \"value_chain\",\n]);\n\nfunction throwInvariantError(args: InvariantArgs): never {\n const error = new Error(args.message) as StructuredInvariantError;\n error.status = args.status ?? 409;\n error.code = args.code ?? \"INVARIANT_VIOLATION\";\n error.invariantCode = args.invariantCode;\n error.suggestion = args.suggestion;\n error.details = args.details;\n throw error;\n}\n\nexport function isBeliefNode(node: BeliefNodeLike | null | undefined): boolean {\n return node?.nodeType === \"belief\";\n}\n\nexport function isOntologicalNode(\n node: BeliefNodeLike | null | undefined\n): boolean {\n return (\n typeof node?.nodeType === \"string\" && ONTOLOGICAL_NODE_TYPES.has(node.nodeType)\n );\n}\n\nexport function isScoredBeliefNode(node: BeliefNodeLike): boolean {\n if (!isBeliefNode(node)) {\n return false;\n }\n\n const metadata =\n node.metadata && typeof node.metadata === \"object\"\n ? (node.metadata as Record<string, unknown>)\n : undefined;\n\n const numericConfidence =\n typeof node.confidence === \"number\" && Number.isFinite(node.confidence);\n if (numericConfidence) {\n return true;\n }\n\n return (\n hasResolvedPredictionOutcome(node.predictionMeta) ||\n hasResolvedPredictionOutcome(metadata?.predictionMeta)\n );\n}\n\nfunction getForbiddenMetadataKeys(metadata: unknown): string[] {\n if (!metadata || typeof metadata !== \"object\" || Array.isArray(metadata)) {\n return [];\n }\n\n return Object.keys(metadata).filter((key) =>\n FORBIDDEN_GENERIC_BELIEF_METADATA_KEYS.has(key)\n );\n}\n\nexport function assertBeliefNodeGenericUpdateAllowed(args: {\n node: BeliefNodeLike;\n updates: Record<string, unknown>;\n mutationName: string;\n}): void {\n if (!isBeliefNode(args.node)) {\n return;\n }\n\n if (Object.hasOwn(args.updates, \"confidence\")) {\n throwInvariantError({\n message:\n \"Belief confidence is append-only. Generic node updates cannot set confidence directly.\",\n invariantCode: \"belief.confidence_append_only\",\n suggestion:\n \"Use epistemicBeliefs.appendSlScoring() so the beliefConfidence ledger and audit trail are updated together.\",\n details: { mutationName: args.mutationName, nodeId: args.node._id },\n });\n }\n\n if (Object.hasOwn(args.updates, \"status\")) {\n throwInvariantError({\n message:\n \"Belief status transitions must use the dedicated belief lifecycle APIs.\",\n invariantCode: \"belief.status_transition_requires_belief_api\",\n suggestion:\n \"Use epistemicBeliefs.updateStatus() or epistemicBeliefs.archive() so status transitions emit the correct audit event.\",\n details: { mutationName: args.mutationName, nodeId: args.node._id },\n });\n }\n\n const forbiddenMetadataKeys = getForbiddenMetadataKeys(args.updates.metadata);\n if (forbiddenMetadataKeys.length > 0) {\n throwInvariantError({\n message:\n \"Belief lineage and lifecycle metadata cannot be rewritten through generic node updates.\",\n invariantCode: \"belief.lineage_requires_fork_belief\",\n suggestion:\n \"Use epistemicBeliefs.forkBelief() for lineage changes and dedicated belief lifecycle mutations for status changes.\",\n details: {\n mutationName: args.mutationName,\n nodeId: args.node._id,\n forbiddenMetadataKeys,\n },\n });\n }\n\n if (\n isScoredBeliefNode(args.node) &&\n (Object.hasOwn(args.updates, \"canonicalText\") ||\n Object.hasOwn(args.updates, \"contentHash\"))\n ) {\n throwInvariantError({\n message:\n \"Cannot refine a scored belief in place. Scored formulations are immutable.\",\n invariantCode: \"belief.formulation_immutable_after_scoring\",\n suggestion:\n \"Use epistemicBeliefs.forkBelief() to evolve the formulation while preserving lineage.\",\n details: { mutationName: args.mutationName, nodeId: args.node._id },\n });\n }\n}\n\nexport function assertBeliefNodeArchiveAllowed(args: {\n node: BeliefNodeLike;\n mutationName: string;\n}): void {\n if (!isBeliefNode(args.node)) {\n return;\n }\n\n throwInvariantError({\n message:\n \"Belief archiving must go through the dedicated belief lifecycle API.\",\n invariantCode: \"belief.status_transition_requires_belief_api\",\n suggestion:\n \"Use epistemicBeliefs.archive() so the belief lifecycle audit trail stays consistent.\",\n details: { mutationName: args.mutationName, nodeId: args.node._id },\n });\n}\n\nexport function assertBeliefNodeVerifyAllowed(args: {\n node: BeliefNodeLike;\n confidence: number | undefined;\n mutationName: string;\n}): void {\n if (!isBeliefNode(args.node) || args.confidence === undefined) {\n return;\n }\n\n throwInvariantError({\n message:\n \"Belief verification cannot set confidence directly. Confidence changes must stay append-only.\",\n invariantCode: \"belief.confidence_append_only\",\n suggestion:\n \"Call epistemicBeliefs.appendSlScoring() after verification so the confidence history is preserved.\",\n details: { mutationName: args.mutationName, nodeId: args.node._id },\n });\n}\n\nexport function assertBeliefNodeSupersedeAllowed(args: {\n node: BeliefNodeLike;\n mutationName: string;\n}): void {\n if (!isBeliefNode(args.node)) {\n return;\n }\n\n throwInvariantError({\n message:\n \"Belief lineage changes must use forkBelief(), not the generic supersede path.\",\n invariantCode: \"belief.lineage_requires_fork_belief\",\n suggestion:\n \"Use epistemicBeliefs.forkBelief() so the child belief, supersedes edge, and audit trail are created together.\",\n details: { mutationName: args.mutationName, nodeId: args.node._id },\n });\n}\n\nexport function assertBeliefNodeHardDeleteAllowed(args: {\n node: BeliefNodeLike;\n allowBeliefHardDelete: boolean;\n reason: string;\n mutationName: string;\n}): void {\n if (!isBeliefNode(args.node)) {\n return;\n }\n\n if (!args.allowBeliefHardDelete) {\n throwInvariantError({\n message:\n \"Belief hard delete is forbidden by default. Beliefs must retain lineage and audit history.\",\n invariantCode: \"belief.hard_delete_forbidden\",\n suggestion:\n \"Use epistemicBeliefs.archive() or epistemicBeliefs.forkBelief() instead. Only migration repair flows may opt into hard delete explicitly.\",\n details: { mutationName: args.mutationName, nodeId: args.node._id },\n });\n }\n\n if (!args.reason.trim().toLowerCase().startsWith(\"migration:\")) {\n throwInvariantError({\n message:\n \"Belief hard delete bypasses require a migration-scoped rationale.\",\n invariantCode: \"belief.hard_delete_forbidden\",\n suggestion:\n 'Retry with allowBeliefHardDelete: true and a reason starting with \"migration:\" only for one-off data repair flows.',\n details: {\n mutationName: args.mutationName,\n nodeId: args.node._id,\n reason: args.reason,\n },\n });\n }\n}\n\nexport function assertOntologicalNodeGenericCreateAllowed(args: {\n nodeType: string;\n mutationName: string;\n}): void {\n if (!ONTOLOGICAL_NODE_TYPES.has(args.nodeType)) {\n return;\n }\n\n throwInvariantError({\n message:\n \"Ontological entities must be created through the dedicated entity lifecycle API.\",\n invariantCode: \"entity.create_requires_entity_lifecycle\",\n suggestion:\n \"Use entityLifecycle.createEntity() so tenant-global canonical scope and deduplication are enforced.\",\n details: {\n mutationName: args.mutationName,\n nodeType: args.nodeType,\n },\n });\n}\n\nexport function assertOntologicalNodeGenericUpdateAllowed(args: {\n node: BeliefNodeLike;\n mutationName: string;\n}): void {\n if (!isOntologicalNode(args.node)) {\n return;\n }\n\n throwInvariantError({\n message:\n \"Ontological entities must be updated through the dedicated entity lifecycle API.\",\n invariantCode: \"entity.update_requires_entity_lifecycle\",\n suggestion:\n \"Use entityLifecycle.updateEntityAttributes() so canonical entity mutations stay type-safe and audited.\",\n details: {\n mutationName: args.mutationName,\n nodeId: args.node._id,\n nodeType: args.node.nodeType,\n },\n });\n}\n\nexport function assertOntologicalNodeArchiveAllowed(args: {\n node: BeliefNodeLike;\n mutationName: string;\n}): void {\n if (!isOntologicalNode(args.node)) {\n return;\n }\n\n throwInvariantError({\n message:\n \"Ontological entities must be archived through the dedicated entity lifecycle API.\",\n invariantCode: \"entity.archive_requires_entity_lifecycle\",\n suggestion:\n \"Use entityLifecycle.archiveEntity() so entity archival emits the correct audit trail and review hooks.\",\n details: {\n mutationName: args.mutationName,\n nodeId: args.node._id,\n nodeType: args.node.nodeType,\n },\n });\n}\n\nexport function assertOntologicalNodeSupersedeAllowed(args: {\n node: BeliefNodeLike;\n mutationName: string;\n}): void {\n if (!isOntologicalNode(args.node)) {\n return;\n }\n\n throwInvariantError({\n message:\n \"Ontological entities do not use the generic supersede path.\",\n invariantCode: \"entity.supersede_requires_entity_lifecycle\",\n suggestion:\n \"Use entityLifecycle.updateEntityAttributes() to edit an entity in place or entityLifecycle.mergeEntities() to collapse duplicates.\",\n details: {\n mutationName: args.mutationName,\n nodeId: args.node._id,\n nodeType: args.node.nodeType,\n },\n });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/beliefLifecycle.ts","../src/invariantEnforcement.ts"],"names":[],"mappings":"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","file":"invariantEnforcement.js","sourcesContent":["// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\n/**\n * Belief lifecycle helpers shared across Convex modules.\n *\n * Canonical lifecycle:\n * assumption -> hypothesis -> active -> resolved_true/resolved_false\n * \\-> superseded\n */\n\nexport type BeliefLifecycleStatus =\n | \"assumption\"\n | \"hypothesis\"\n | \"active\"\n | \"superseded\"\n | \"resolved_true\"\n | \"resolved_false\";\n\ntype PredictionOutcome =\n | \"pending\"\n | \"confirmed\"\n | \"disconfirmed\"\n | \"partial\"\n | \"expired\";\n\nconst BELIEF_STATUS_VALUES: readonly BeliefLifecycleStatus[] = [\n \"assumption\",\n \"hypothesis\",\n \"active\",\n \"superseded\",\n \"resolved_true\",\n \"resolved_false\",\n];\n\nconst RESOLVED_PREDICTION_OUTCOMES: readonly PredictionOutcome[] = [\n \"confirmed\",\n \"disconfirmed\",\n \"partial\",\n \"expired\",\n];\n\nexport function isBeliefLifecycleStatus(\n value: unknown\n): value is BeliefLifecycleStatus {\n return (\n typeof value === \"string\" &&\n BELIEF_STATUS_VALUES.includes(value as BeliefLifecycleStatus)\n );\n}\n\nfunction normalizeLegacyBeliefStatus(\n value: unknown\n): BeliefLifecycleStatus | null {\n if (isBeliefLifecycleStatus(value)) {\n return value;\n }\n if (value === \"belief\" || value === \"established\" || value === \"emerging\") {\n return \"active\";\n }\n if (value === \"fact\" || value === \"confirmed\") {\n return \"resolved_true\";\n }\n if (value === \"disconfirmed\" || value === \"expired\") {\n return \"resolved_false\";\n }\n if (value === \"deprecated\") {\n return \"superseded\";\n }\n return null;\n}\n\nfunction normalizeBeliefConfidence(confidence: unknown): number | null {\n if (typeof confidence !== \"number\" || !Number.isFinite(confidence)) {\n return null;\n }\n if (confidence >= 0 && confidence <= 1) {\n return confidence;\n }\n // Backward compatibility with historical percentage-scale confidence (0-100).\n if (confidence > 1 && confidence <= 100) {\n return confidence / 100;\n }\n return null;\n}\n\nexport function isResolvedByConfidence(confidence: unknown): boolean {\n const normalized = normalizeBeliefConfidence(confidence);\n if (normalized === null) {\n return false;\n }\n return normalized <= 0 || normalized >= 1;\n}\n\nexport function hasResolvedPredictionOutcome(predictionMeta: unknown): boolean {\n if (!predictionMeta || typeof predictionMeta !== \"object\") {\n return false;\n }\n const outcome = (predictionMeta as { outcome?: unknown }).outcome;\n return (\n typeof outcome === \"string\" &&\n RESOLVED_PREDICTION_OUTCOMES.includes(outcome as PredictionOutcome)\n );\n}\n\nfunction getPredictionMetaFromMetadata(\n metadata: Record<string, unknown> | undefined\n): unknown {\n return metadata?.predictionMeta;\n}\n\nexport function shouldTreatBeliefAsFact(opts: {\n confidence?: unknown;\n predictionMeta?: unknown;\n metadata?: Record<string, unknown>;\n}): boolean {\n if (isResolvedByConfidence(opts.confidence)) {\n return true;\n }\n if (hasResolvedPredictionOutcome(opts.predictionMeta)) {\n return true;\n }\n if (\n hasResolvedPredictionOutcome(getPredictionMetaFromMetadata(opts.metadata))\n ) {\n return true;\n }\n return false;\n}\n\nfunction resolvedPredictionStatus(\n predictionMeta: unknown\n): BeliefLifecycleStatus | null {\n if (!predictionMeta || typeof predictionMeta !== \"object\") {\n return null;\n }\n const outcome = (predictionMeta as { outcome?: unknown }).outcome;\n if (outcome === \"confirmed\") {\n return \"resolved_true\";\n }\n if (outcome === \"disconfirmed\" || outcome === \"expired\") {\n return \"resolved_false\";\n }\n return null;\n}\n\nfunction shouldTreatBeliefAsResolved(opts: {\n confidence?: unknown;\n predictionMeta?: unknown;\n metadata?: Record<string, unknown>;\n}): BeliefLifecycleStatus | null {\n if (isResolvedByConfidence(opts.confidence)) {\n const normalized = normalizeBeliefConfidence(opts.confidence);\n return normalized === 0 ? \"resolved_false\" : \"resolved_true\";\n }\n const directPredictionStatus = resolvedPredictionStatus(opts.predictionMeta);\n if (directPredictionStatus) {\n return directPredictionStatus;\n }\n const metadataPredictionStatus = resolvedPredictionStatus(\n getPredictionMetaFromMetadata(opts.metadata)\n );\n if (metadataPredictionStatus) {\n return metadataPredictionStatus;\n }\n return null;\n}\n\nexport function resolveBeliefLifecycleStatus(opts: {\n beliefStatus?: unknown;\n confidence?: unknown;\n predictionMeta?: unknown;\n metadata?: Record<string, unknown>;\n}): BeliefLifecycleStatus {\n const resolvedStatus = shouldTreatBeliefAsResolved(opts);\n if (resolvedStatus) {\n return resolvedStatus;\n }\n\n const direct = opts.beliefStatus;\n const normalizedDirect = normalizeLegacyBeliefStatus(direct);\n if (normalizedDirect) {\n // If the belief has been scored (has numeric credence) but stored status\n // is still pre-validation, promote to active. Evidence, not user intent,\n // makes a hypothesis active.\n const normalized = normalizeBeliefConfidence(opts.confidence);\n if (normalized !== null && isPreValidationBeliefStatus(normalizedDirect)) {\n return \"active\";\n }\n return normalizedDirect;\n }\n\n const metaStatus = opts.metadata?.beliefStatus;\n const normalizedMetaStatus = normalizeLegacyBeliefStatus(metaStatus);\n if (normalizedMetaStatus) {\n const normalized = normalizeBeliefConfidence(opts.confidence);\n if (\n normalized !== null &&\n isPreValidationBeliefStatus(normalizedMetaStatus)\n ) {\n return \"active\";\n }\n return normalizedMetaStatus;\n }\n\n return \"assumption\";\n}\n\nexport function isPreValidationBeliefStatus(\n status: BeliefLifecycleStatus\n): boolean {\n return status === \"assumption\" || status === \"hypothesis\";\n}\n\nexport function isPropagationEligibleBeliefStatus(\n status: BeliefLifecycleStatus\n): boolean {\n return status === \"active\" || status === \"resolved_true\";\n}\n\nexport function promoteBeliefStatusAfterScoring(\n status: BeliefLifecycleStatus,\n opts?: {\n confidence?: unknown;\n predictionMeta?: unknown;\n metadata?: Record<string, unknown>;\n }\n): BeliefLifecycleStatus {\n const resolvedStatus = shouldTreatBeliefAsResolved({ ...opts });\n if (resolvedStatus) {\n return resolvedStatus;\n }\n if (isPreValidationBeliefStatus(status)) {\n return \"active\";\n }\n return status;\n}\n\nexport function promoteBeliefStatusAfterEvidence(\n status: BeliefLifecycleStatus\n): BeliefLifecycleStatus {\n return isPreValidationBeliefStatus(status) ? \"active\" : status;\n}\n","// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\n/** Invariant error helpers that protect belief lifecycle mutations. */\nimport { hasResolvedPredictionOutcome } from \"./beliefLifecycle\";\n\ntype StructuredInvariantError = Error & {\n status: number;\n code: string;\n invariantCode?: string;\n suggestion?: string;\n details?: unknown;\n};\n\ninterface BeliefNodeLike {\n _id?: string;\n confidence?: unknown;\n metadata?: unknown;\n nodeType?: unknown;\n predictionMeta?: unknown;\n}\n\ninterface InvariantArgs {\n code?: string;\n details?: unknown;\n invariantCode:\n | \"belief.formulation_immutable_after_scoring\"\n | \"belief.confidence_append_only\"\n | \"belief.status_transition_requires_belief_api\"\n | \"belief.lineage_requires_fork_belief\"\n | \"belief.hard_delete_forbidden\"\n | \"entity.create_requires_entity_lifecycle\"\n | \"entity.update_requires_entity_lifecycle\"\n | \"entity.archive_requires_entity_lifecycle\"\n | \"entity.supersede_requires_entity_lifecycle\";\n message: string;\n status?: number;\n suggestion: string;\n}\n\nconst FORBIDDEN_GENERIC_BELIEF_METADATA_KEYS = new Set([\n \"beliefStatus\",\n \"epistemicStatus\",\n \"forkedBy\",\n \"forkedFrom\",\n \"forkReason\",\n \"forkTimestamp\",\n \"status\",\n \"supersededBy\",\n \"supersedes\",\n]);\n\nconst ONTOLOGICAL_NODE_TYPES = new Set([\n \"company\",\n \"person\",\n \"investor\",\n \"function\",\n \"value_chain\",\n]);\n\nfunction throwInvariantError(args: InvariantArgs): never {\n const error = new Error(args.message) as StructuredInvariantError;\n error.status = args.status ?? 409;\n error.code = args.code ?? \"INVARIANT_VIOLATION\";\n error.invariantCode = args.invariantCode;\n error.suggestion = args.suggestion;\n error.details = args.details;\n throw error;\n}\n\nexport function isBeliefNode(node: BeliefNodeLike | null | undefined): boolean {\n return node?.nodeType === \"belief\";\n}\n\nexport function isOntologicalNode(\n node: BeliefNodeLike | null | undefined\n): boolean {\n return (\n typeof node?.nodeType === \"string\" &&\n ONTOLOGICAL_NODE_TYPES.has(node.nodeType)\n );\n}\n\nexport function isScoredBeliefNode(node: BeliefNodeLike): boolean {\n if (!isBeliefNode(node)) {\n return false;\n }\n\n const metadata =\n node.metadata && typeof node.metadata === \"object\"\n ? (node.metadata as Record<string, unknown>)\n : undefined;\n\n const numericConfidence =\n typeof node.confidence === \"number\" && Number.isFinite(node.confidence);\n if (numericConfidence) {\n return true;\n }\n\n return (\n hasResolvedPredictionOutcome(node.predictionMeta) ||\n hasResolvedPredictionOutcome(metadata?.predictionMeta)\n );\n}\n\nfunction getForbiddenMetadataKeys(metadata: unknown): string[] {\n if (!metadata || typeof metadata !== \"object\" || Array.isArray(metadata)) {\n return [];\n }\n\n return Object.keys(metadata).filter((key) =>\n FORBIDDEN_GENERIC_BELIEF_METADATA_KEYS.has(key)\n );\n}\n\nexport function assertBeliefNodeGenericUpdateAllowed(args: {\n node: BeliefNodeLike;\n updates: Record<string, unknown>;\n mutationName: string;\n}): void {\n if (!isBeliefNode(args.node)) {\n return;\n }\n\n if (Object.hasOwn(args.updates, \"confidence\")) {\n throwInvariantError({\n message:\n \"Belief confidence is append-only. Generic node updates cannot set confidence directly.\",\n invariantCode: \"belief.confidence_append_only\",\n suggestion:\n \"Use epistemicBeliefs.appendSlScoring() so the beliefConfidence ledger and audit trail are updated together.\",\n details: { mutationName: args.mutationName, nodeId: args.node._id },\n });\n }\n\n if (Object.hasOwn(args.updates, \"status\")) {\n throwInvariantError({\n message:\n \"Belief status transitions must use the dedicated belief lifecycle APIs.\",\n invariantCode: \"belief.status_transition_requires_belief_api\",\n suggestion:\n \"Use epistemicBeliefs.updateStatus() or epistemicBeliefs.archive() so status transitions emit the correct audit event.\",\n details: { mutationName: args.mutationName, nodeId: args.node._id },\n });\n }\n\n const forbiddenMetadataKeys = getForbiddenMetadataKeys(args.updates.metadata);\n if (forbiddenMetadataKeys.length > 0) {\n throwInvariantError({\n message:\n \"Belief lineage and lifecycle metadata cannot be rewritten through generic node updates.\",\n invariantCode: \"belief.lineage_requires_fork_belief\",\n suggestion:\n \"Use epistemicBeliefs.forkBelief() for lineage changes and dedicated belief lifecycle mutations for status changes.\",\n details: {\n mutationName: args.mutationName,\n nodeId: args.node._id,\n forbiddenMetadataKeys,\n },\n });\n }\n\n if (\n isScoredBeliefNode(args.node) &&\n (Object.hasOwn(args.updates, \"canonicalText\") ||\n Object.hasOwn(args.updates, \"contentHash\"))\n ) {\n throwInvariantError({\n message:\n \"Cannot refine a scored belief in place. Scored formulations are immutable.\",\n invariantCode: \"belief.formulation_immutable_after_scoring\",\n suggestion:\n \"Use epistemicBeliefs.forkBelief() to evolve the formulation while preserving lineage.\",\n details: { mutationName: args.mutationName, nodeId: args.node._id },\n });\n }\n}\n\nexport function assertBeliefNodeArchiveAllowed(args: {\n node: BeliefNodeLike;\n mutationName: string;\n}): void {\n if (!isBeliefNode(args.node)) {\n return;\n }\n\n throwInvariantError({\n message:\n \"Belief archiving must go through the dedicated belief lifecycle API.\",\n invariantCode: \"belief.status_transition_requires_belief_api\",\n suggestion:\n \"Use epistemicBeliefs.archive() so the belief lifecycle audit trail stays consistent.\",\n details: { mutationName: args.mutationName, nodeId: args.node._id },\n });\n}\n\nexport function assertBeliefNodeVerifyAllowed(args: {\n node: BeliefNodeLike;\n confidence: number | undefined;\n mutationName: string;\n}): void {\n if (!isBeliefNode(args.node) || args.confidence === undefined) {\n return;\n }\n\n throwInvariantError({\n message:\n \"Belief verification cannot set confidence directly. Confidence changes must stay append-only.\",\n invariantCode: \"belief.confidence_append_only\",\n suggestion:\n \"Call epistemicBeliefs.appendSlScoring() after verification so the confidence history is preserved.\",\n details: { mutationName: args.mutationName, nodeId: args.node._id },\n });\n}\n\nexport function assertBeliefNodeSupersedeAllowed(args: {\n node: BeliefNodeLike;\n mutationName: string;\n}): void {\n if (!isBeliefNode(args.node)) {\n return;\n }\n\n throwInvariantError({\n message:\n \"Belief lineage changes must use forkBelief(), not the generic supersede path.\",\n invariantCode: \"belief.lineage_requires_fork_belief\",\n suggestion:\n \"Use epistemicBeliefs.forkBelief() so the child belief, supersedes edge, and audit trail are created together.\",\n details: { mutationName: args.mutationName, nodeId: args.node._id },\n });\n}\n\nexport function assertBeliefNodeHardDeleteAllowed(args: {\n node: BeliefNodeLike;\n allowBeliefHardDelete: boolean;\n reason: string;\n mutationName: string;\n}): void {\n if (!isBeliefNode(args.node)) {\n return;\n }\n\n if (!args.allowBeliefHardDelete) {\n throwInvariantError({\n message:\n \"Belief hard delete is forbidden by default. Beliefs must retain lineage and audit history.\",\n invariantCode: \"belief.hard_delete_forbidden\",\n suggestion:\n \"Use epistemicBeliefs.archive() or epistemicBeliefs.forkBelief() instead. Only migration repair flows may opt into hard delete explicitly.\",\n details: { mutationName: args.mutationName, nodeId: args.node._id },\n });\n }\n\n if (!args.reason.trim().toLowerCase().startsWith(\"migration:\")) {\n throwInvariantError({\n message:\n \"Belief hard delete bypasses require a migration-scoped rationale.\",\n invariantCode: \"belief.hard_delete_forbidden\",\n suggestion:\n 'Retry with allowBeliefHardDelete: true and a reason starting with \"migration:\" only for one-off data repair flows.',\n details: {\n mutationName: args.mutationName,\n nodeId: args.node._id,\n reason: args.reason,\n },\n });\n }\n}\n\nexport function assertOntologicalNodeGenericCreateAllowed(args: {\n nodeType: string;\n mutationName: string;\n}): void {\n if (!ONTOLOGICAL_NODE_TYPES.has(args.nodeType)) {\n return;\n }\n\n throwInvariantError({\n message:\n \"Ontological entities must be created through the dedicated entity lifecycle API.\",\n invariantCode: \"entity.create_requires_entity_lifecycle\",\n suggestion:\n \"Use entityLifecycle.createEntity() so tenant-global canonical scope and deduplication are enforced.\",\n details: {\n mutationName: args.mutationName,\n nodeType: args.nodeType,\n },\n });\n}\n\nexport function assertOntologicalNodeGenericUpdateAllowed(args: {\n node: BeliefNodeLike;\n mutationName: string;\n}): void {\n if (!isOntologicalNode(args.node)) {\n return;\n }\n\n throwInvariantError({\n message:\n \"Ontological entities must be updated through the dedicated entity lifecycle API.\",\n invariantCode: \"entity.update_requires_entity_lifecycle\",\n suggestion:\n \"Use entityLifecycle.updateEntityAttributes() so canonical entity mutations stay type-safe and audited.\",\n details: {\n mutationName: args.mutationName,\n nodeId: args.node._id,\n nodeType: args.node.nodeType,\n },\n });\n}\n\nexport function assertOntologicalNodeArchiveAllowed(args: {\n node: BeliefNodeLike;\n mutationName: string;\n}): void {\n if (!isOntologicalNode(args.node)) {\n return;\n }\n\n throwInvariantError({\n message:\n \"Ontological entities must be archived through the dedicated entity lifecycle API.\",\n invariantCode: \"entity.archive_requires_entity_lifecycle\",\n suggestion:\n \"Use entityLifecycle.archiveEntity() so entity archival emits the correct audit trail and review hooks.\",\n details: {\n mutationName: args.mutationName,\n nodeId: args.node._id,\n nodeType: args.node.nodeType,\n },\n });\n}\n\nexport function assertOntologicalNodeSupersedeAllowed(args: {\n node: BeliefNodeLike;\n mutationName: string;\n}): void {\n if (!isOntologicalNode(args.node)) {\n return;\n }\n\n throwInvariantError({\n message: \"Ontological entities do not use the generic supersede path.\",\n invariantCode: \"entity.supersede_requires_entity_lifecycle\",\n suggestion:\n \"Use entityLifecycle.updateEntityAttributes() to edit an entity in place or entityLifecycle.mergeEntities() to collapse duplicates.\",\n details: {\n mutationName: args.mutationName,\n nodeId: args.node._id,\n nodeType: args.node.nodeType,\n },\n });\n}\n"]}
|
|
@@ -10,7 +10,7 @@ var PILLAR_IMPORTANCE = {
|
|
|
10
10
|
};
|
|
11
11
|
async function computeLogicalRole(ctx, evidenceId, beliefId) {
|
|
12
12
|
const belief = await ctx.db.get(beliefId);
|
|
13
|
-
if (
|
|
13
|
+
if (belief?.nodeType !== "belief") {
|
|
14
14
|
return "contributory";
|
|
15
15
|
}
|
|
16
16
|
const beliefMetadata = belief.metadata;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/logicalRoleInference.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"sources":["../src/logicalRoleInference.ts"],"names":[],"mappings":"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","file":"logicalRoleInference.js","sourcesContent":["// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\n/**\n * logicalRoleInference module implementation.\n */\n\nimport type { Id, MutationCtx, QueryCtx } from \"./convex\";\n\ntype LogicalRole =\n | \"necessary\"\n | \"sufficient\"\n | \"necessary_sufficient\"\n | \"contributory\"\n | \"corroborative\";\n\nconst PILLAR_IMPORTANCE: Record<string, number> = {\n market: 1,\n competition: 2,\n product: 3,\n team: 4,\n financials: 5,\n timing: 6,\n other: 10,\n};\n\ntype GraphCtx = QueryCtx | MutationCtx;\n\ninterface IndexQueryBuilder {\n eq(field: string, value: unknown): IndexQueryBuilder;\n}\n\ninterface EpistemicEdgeRecord {\n fromNodeId?: string;\n toNodeId?: string;\n}\n\nexport async function computeLogicalRole(\n ctx: GraphCtx,\n evidenceId: Id<\"epistemicNodes\">,\n beliefId: Id<\"epistemicNodes\">\n): Promise<LogicalRole> {\n const belief = await ctx.db.get(beliefId);\n if (belief?.nodeType !== \"belief\") {\n return \"contributory\";\n }\n\n const beliefMetadata = belief.metadata as Record<string, unknown> | undefined;\n const pillar = (beliefMetadata?.pillar as string) || \"other\";\n const pillarRank = PILLAR_IMPORTANCE[pillar] ?? 10;\n\n const isSynthesized = await checkIfSynthesizedHypothesis(ctx, beliefId);\n const testingQuestions = await getTestingQuestionsForBelief(ctx, beliefId);\n const answeredQuestions = await getQuestionsAnsweredByEvidence(\n ctx,\n evidenceId\n );\n const directlyTests = testingQuestions.filter((questionId) =>\n answeredQuestions.includes(questionId)\n );\n\n if (directlyTests.length === 0) {\n return \"contributory\";\n }\n\n if (isSynthesized && pillarRank <= 2) {\n return directlyTests.length > 1 ? \"necessary_sufficient\" : \"necessary\";\n }\n\n if (isSynthesized) {\n return \"necessary\";\n }\n\n return directlyTests.length > 1 ? \"necessary\" : \"contributory\";\n}\n\nasync function checkIfSynthesizedHypothesis(\n ctx: GraphCtx,\n beliefId: Id<\"epistemicNodes\">\n): Promise<boolean> {\n const belief = await ctx.db.get(beliefId);\n if (!belief) {\n return false;\n }\n\n const metadata = belief.metadata as Record<string, unknown> | undefined;\n return (\n metadata?.isSynthesized === true || metadata?.beliefStatus === \"hypothesis\"\n );\n}\n\nasync function getTestingQuestionsForBelief(\n ctx: GraphCtx,\n beliefId: Id<\"epistemicNodes\">\n): Promise<string[]> {\n const testEdges = (await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_to_type\", (q: IndexQueryBuilder) =>\n q.eq(\"toNodeId\", beliefId).eq(\"edgeType\", \"tests\")\n )\n .collect()) as EpistemicEdgeRecord[];\n\n return testEdges\n .map((edge: EpistemicEdgeRecord) => edge.fromNodeId as string)\n .filter((id): id is string => id !== undefined);\n}\n\nasync function getQuestionsAnsweredByEvidence(\n ctx: GraphCtx,\n evidenceId: Id<\"epistemicNodes\">\n): Promise<string[]> {\n const answerEdges = (await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from_type\", (q: IndexQueryBuilder) =>\n q.eq(\"fromNodeId\", evidenceId).eq(\"edgeType\", \"derived_from\")\n )\n .collect()) as EpistemicEdgeRecord[];\n\n return answerEdges\n .map((edge: EpistemicEdgeRecord) => edge.toNodeId as string)\n .filter((id): id is string => id !== undefined);\n}\n"]}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/** Matcher feedback helper types shared by graph-primitive review flows. */
|
|
2
2
|
type LinkSuggestionStatus = "suggested" | "approved" | "dismissed";
|
|
3
3
|
type MatcherReviewStatus = "pending" | "accepted" | "rejected" | "auto_accepted" | "superseded";
|
|
4
|
-
|
|
4
|
+
interface MatcherFeedbackSummaryRow {
|
|
5
5
|
matcherKey?: string | null;
|
|
6
6
|
reviewStatus: MatcherReviewStatus;
|
|
7
7
|
rewardScore?: number | null;
|
|
8
8
|
surface?: string | null;
|
|
9
|
-
}
|
|
9
|
+
}
|
|
10
10
|
declare function isOperationalLinkStatus(status?: LinkSuggestionStatus | null): boolean;
|
|
11
11
|
declare function mergeLinkSuggestionStatus(existing?: LinkSuggestionStatus | null, requested?: LinkSuggestionStatus | null): LinkSuggestionStatus | undefined;
|
|
12
12
|
declare function resolveReviewedLinkStatus(requested: "approved" | "dismissed"): LinkSuggestionStatus;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/matcherFeedbackUtils.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"sources":["../src/matcherFeedbackUtils.ts"],"names":[],"mappings":"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","file":"matcherFeedbackUtils.js","sourcesContent":["// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\n/** Matcher feedback helper types shared by graph-primitive review flows. */\nexport type LinkSuggestionStatus = \"suggested\" | \"approved\" | \"dismissed\";\n\nexport type MatcherReviewStatus =\n | \"pending\"\n | \"accepted\"\n | \"rejected\"\n | \"auto_accepted\"\n | \"superseded\";\n\ninterface MatcherFeedbackSummaryRow {\n matcherKey?: string | null;\n reviewStatus: MatcherReviewStatus;\n rewardScore?: number | null;\n surface?: string | null;\n}\n\nexport function isOperationalLinkStatus(\n status?: LinkSuggestionStatus | null\n): boolean {\n return status !== \"suggested\" && status !== \"dismissed\";\n}\n\nexport function mergeLinkSuggestionStatus(\n existing?: LinkSuggestionStatus | null,\n requested?: LinkSuggestionStatus | null\n): LinkSuggestionStatus | undefined {\n if (requested === undefined || requested === null) {\n return existing ?? undefined;\n }\n\n if (\n existing &&\n isOperationalLinkStatus(existing) &&\n !isOperationalLinkStatus(requested)\n ) {\n return existing;\n }\n\n return requested;\n}\n\nexport function resolveReviewedLinkStatus(\n requested: \"approved\" | \"dismissed\"\n): LinkSuggestionStatus {\n return requested;\n}\n\nexport function deriveMatcherReviewStatus(input: {\n explicitReviewStatus?: MatcherReviewStatus | null;\n linkStatus?: LinkSuggestionStatus | null;\n autoAccepted?: boolean;\n}): MatcherReviewStatus {\n if (input.explicitReviewStatus) {\n return input.explicitReviewStatus;\n }\n\n if (input.autoAccepted) {\n return \"auto_accepted\";\n }\n\n if (input.linkStatus === \"suggested\") {\n return \"pending\";\n }\n\n if (input.linkStatus === \"dismissed\") {\n return \"rejected\";\n }\n\n return \"accepted\";\n}\n\nexport function deriveMatcherRewardScore(\n reviewStatus: MatcherReviewStatus\n): number {\n switch (reviewStatus) {\n case \"accepted\":\n case \"auto_accepted\":\n return 1;\n case \"rejected\":\n return -1;\n default:\n return 0;\n }\n}\n\nexport function summarizeMatcherFeedback(rows: MatcherFeedbackSummaryRow[]) {\n const totals = {\n total: rows.length,\n pending: 0,\n accepted: 0,\n autoAccepted: 0,\n rejected: 0,\n superseded: 0,\n };\n\n const surfaces = new Set<string>();\n const matcherKeys = new Set<string>();\n let rewardSum = 0;\n\n for (const row of rows) {\n if (row.surface) {\n surfaces.add(row.surface);\n }\n if (row.matcherKey) {\n matcherKeys.add(row.matcherKey);\n }\n\n switch (row.reviewStatus) {\n case \"pending\":\n totals.pending += 1;\n break;\n case \"accepted\":\n totals.accepted += 1;\n break;\n case \"auto_accepted\":\n totals.autoAccepted += 1;\n break;\n case \"rejected\":\n totals.rejected += 1;\n break;\n case \"superseded\":\n totals.superseded += 1;\n break;\n default:\n break;\n }\n\n rewardSum += row.rewardScore ?? deriveMatcherRewardScore(row.reviewStatus);\n }\n\n const decided = totals.accepted + totals.autoAccepted + totals.rejected;\n const positive = totals.accepted + totals.autoAccepted;\n\n return {\n ...totals,\n decided,\n acceptanceRate: decided > 0 ? positive / decided : 0,\n averageReward: rows.length > 0 ? rewardSum / rows.length : 0,\n uniqueSurfaces: surfaces.size,\n uniqueMatchers: matcherKeys.size,\n };\n}\n"]}
|
|
@@ -1,37 +1,37 @@
|
|
|
1
1
|
import { rankEntityConnections, rankEntityTypeMatches, scoreEntityConnection, scoreEntityTypeMatch } from '@lucern/contracts/v1/ontologies/v1';
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
value: string;
|
|
5
|
-
label: string;
|
|
3
|
+
interface OntologyEntityType {
|
|
6
4
|
description?: string;
|
|
5
|
+
label: string;
|
|
7
6
|
subtypes?: Array<{
|
|
8
7
|
value: string;
|
|
9
8
|
label: string;
|
|
10
9
|
description?: string;
|
|
11
10
|
}>;
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
value: string;
|
|
12
|
+
}
|
|
13
|
+
interface EntityTypeMatch {
|
|
14
14
|
entityType: string;
|
|
15
15
|
label: string;
|
|
16
|
-
score: number;
|
|
17
16
|
reason: string;
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
entityType: string;
|
|
22
|
-
title: string;
|
|
17
|
+
score: number;
|
|
18
|
+
}
|
|
19
|
+
interface EntityMatchCandidate {
|
|
23
20
|
canonicalText: string;
|
|
24
21
|
connectedBeliefCount: number;
|
|
25
22
|
connectedEvidenceCount: number;
|
|
26
|
-
};
|
|
27
|
-
type EntityConnectionMatch = {
|
|
28
|
-
entityNodeId: string;
|
|
29
23
|
entityType: string;
|
|
24
|
+
nodeId: string;
|
|
30
25
|
title: string;
|
|
26
|
+
}
|
|
27
|
+
interface EntityConnectionMatch {
|
|
28
|
+
entityNodeId: string;
|
|
29
|
+
entityType: string;
|
|
30
|
+
reason: string;
|
|
31
31
|
score: number;
|
|
32
32
|
suggestedEdgeType: string;
|
|
33
|
-
|
|
34
|
-
}
|
|
33
|
+
title: string;
|
|
34
|
+
}
|
|
35
35
|
|
|
36
36
|
type ontologyMatching_EntityConnectionMatch = EntityConnectionMatch;
|
|
37
37
|
type ontologyMatching_EntityMatchCandidate = EntityMatchCandidate;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export { rankEntityConnections, rankEntityTypeMatches, scoreEntityConnection, scoreEntityTypeMatch } from '@lucern/contracts/v1/ontologies/v1';
|
|
2
|
-
export { E as EntityConnectionMatch, a as EntityMatchCandidate, b as EntityTypeMatch, O as OntologyEntityType } from './ontology-matching-
|
|
2
|
+
export { E as EntityConnectionMatch, a as EntityMatchCandidate, b as EntityTypeMatch, O as OntologyEntityType } from './ontology-matching-C-mYFrir.js';
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
declare const getPendingForProject:
|
|
2
|
-
declare const getPendingForNode:
|
|
3
|
-
declare const getThemeOntologyMatches:
|
|
4
|
-
declare const createPendingLink:
|
|
5
|
-
declare const approve:
|
|
6
|
-
declare const reject:
|
|
7
|
-
declare const bulkApprove:
|
|
8
|
-
declare const bulkApproveHighConfidence:
|
|
9
|
-
declare const createNeo4jEdge:
|
|
10
|
-
declare const batchCreatePendingLinks:
|
|
1
|
+
declare const getPendingForProject: unknown;
|
|
2
|
+
declare const getPendingForNode: unknown;
|
|
3
|
+
declare const getThemeOntologyMatches: unknown;
|
|
4
|
+
declare const createPendingLink: unknown;
|
|
5
|
+
declare const approve: unknown;
|
|
6
|
+
declare const reject: unknown;
|
|
7
|
+
declare const bulkApprove: unknown;
|
|
8
|
+
declare const bulkApproveHighConfidence: unknown;
|
|
9
|
+
declare const createNeo4jEdge: unknown;
|
|
10
|
+
declare const batchCreatePendingLinks: unknown;
|
|
11
11
|
|
|
12
12
|
declare const ontologyApproval_approve: typeof approve;
|
|
13
13
|
declare const ontologyApproval_batchCreatePendingLinks: typeof batchCreatePendingLinks;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { a as approve, b as batchCreatePendingLinks, c as bulkApprove, d as bulkApproveHighConfidence, e as createNeo4jEdge, f as createPendingLink, g as getPendingForNode, h as getPendingForProject, i as getThemeOntologyMatches, r as reject } from './ontologyApproval-
|
|
1
|
+
export { a as approve, b as batchCreatePendingLinks, c as bulkApprove, d as bulkApproveHighConfidence, e as createNeo4jEdge, f as createPendingLink, g as getPendingForNode, h as getPendingForProject, i as getThemeOntologyMatches, r as reject } from './ontologyApproval-BVt0feJi.js';
|
package/dist/ontologyApproval.js
CHANGED
|
@@ -1,12 +1,18 @@
|
|
|
1
|
+
import { permissiveReturn } from '@lucern/contracts/schema-helpers/validators';
|
|
1
2
|
import { v } from 'convex/values';
|
|
3
|
+
import { unsafeConvexAnyApi } from '@lucern/contracts/convex/unsafeAnyApi';
|
|
2
4
|
import { componentsGeneric, queryGeneric, mutationGeneric, internalMutationGeneric } from 'convex/server';
|
|
3
|
-
import { permissiveReturn } from '@lucern/contracts/schema-helpers/validators';
|
|
4
5
|
|
|
5
6
|
// src/ontologyApproval.ts
|
|
7
|
+
unsafeConvexAnyApi(
|
|
8
|
+
"graph-primitives top-level module bundle lacks a committed Convex _generated/api surface"
|
|
9
|
+
);
|
|
6
10
|
componentsGeneric();
|
|
7
11
|
var internalMutation = internalMutationGeneric;
|
|
8
12
|
var mutation = mutationGeneric;
|
|
9
13
|
var query = queryGeneric;
|
|
14
|
+
|
|
15
|
+
// src/ontologyApproval.ts
|
|
10
16
|
var getPendingForProject = query({
|
|
11
17
|
args: v.any(),
|
|
12
18
|
returns: permissiveReturn,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/convex.ts","../src/ontologyApproval.ts"],"names":[],"mappings":";;;;;AAyB0B,iBAAA;AAsGnB,IAAM,gBAAA,GACX,uBAAA;AAGK,IAAM,QAAA,GACX,eAAA;AACK,IAAM,KAAA,GAAQ,YAAA;AC9Hd,IAAM,uBAAuB,KAAA,CAAM;AAAA,EACxC,IAAA,EAAM,EAAE,GAAA,EAAI;AAAA,EACZ,OAAA,EAAS,gBAAA;AAAA,EACT,SAAS,aAAa,EAAE,OAAO,CAAA,EAAG,QAAA,EAAU,EAAC,EAAE;AACjD,CAAC;AAEM,IAAM,oBAAoB,KAAA,CAAM;AAAA,EACrC,IAAA,EAAM,EAAE,GAAA,EAAI;AAAA,EACZ,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,YAAY;AACvB,CAAC;AAEM,IAAM,0BAA0B,KAAA,CAAM;AAAA,EAC3C,IAAA,EAAM,EAAE,GAAA,EAAI;AAAA,EACZ,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,YAAY;AACvB,CAAC;AAEM,IAAM,oBAAoB,QAAA,CAAS;AAAA,EACxC,IAAA,EAAM,EAAE,GAAA,EAAI;AAAA,EACZ,OAAA,EAAS,gBAAA;AAAA,EACT,SAAS,YAAY;AACvB,CAAC;AAEM,IAAM,UAAU,QAAA,CAAS;AAAA,EAC9B,IAAA,EAAM,EAAE,GAAA,EAAI;AAAA,EACZ,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,aAAa,EAAE,OAAA,EAAS,IAAA,EAAK;AACxC,CAAC;AAEM,IAAM,SAAS,QAAA,CAAS;AAAA,EAC7B,IAAA,EAAM,EAAE,GAAA,EAAI;AAAA,EACZ,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,aAAa,EAAE,OAAA,EAAS,IAAA,EAAK;AACxC,CAAC;AAEM,IAAM,cAAc,QAAA,CAAS;AAAA,EAClC,IAAA,EAAM,EAAE,GAAA,EAAI;AAAA,EACZ,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,OAAO,IAAA,EAAmB,IAAA,MAAmC;AAAA,IACpE,QAAA,EAAU,CAAA;AAAA,IACV,KAAA,EAAO,MAAM,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,GAC7B,IAAA,CAAK,QAAQ,MAAA,GACb;AAAA,GACN;AACF,CAAC;AAEM,IAAM,4BAA4B,QAAA,CAAS;AAAA,EAChD,IAAA,EAAM,EAAE,GAAA,EAAI;AAAA,EACZ,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,aAAa,EAAE,QAAA,EAAU,CAAA,EAAE;AACtC,CAAC;AAEM,IAAM,kBAAkB,gBAAA,CAAiB;AAAA,EAC9C,IAAA,EAAM,EAAE,GAAA,EAAI;AAAA,EACZ,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,aAAa,EAAE,OAAA,EAAS,IAAA,EAAK;AACxC,CAAC;AAEM,IAAM,0BAA0B,gBAAA,CAAiB;AAAA,EACtD,IAAA,EAAM,EAAE,GAAA,EAAI;AAAA,EACZ,OAAA,EAAS,gBAAA;AAAA,EACT,SAAS,aAAa,EAAE,OAAA,EAAS,CAAA,EAAG,cAAc,CAAA,EAAE;AACtD,CAAC","file":"ontologyApproval.js","sourcesContent":["import {\n actionGeneric,\n anyApi,\n componentsGeneric,\n httpActionGeneric,\n internalActionGeneric,\n internalMutationGeneric,\n internalQueryGeneric,\n mutationGeneric,\n queryGeneric,\n} from \"convex/server\";\nimport type { GenericId } from \"convex/values\";\n\n// TODO(FR.11-structural): `api`/`internal`/`components` are `anyApi as any`\n// because this module source tree is bundled into the kernel host at deploy time\n// and has NO top-level Convex `_generated/` directory to import a typed surface\n// from. Every `api.*` / `internal.*` / string-literal cross-component ref in this\n// module (topicScope.ts, topicProjectOverlay.ts, questionEvidenceLinks.ts,\n// beliefEvidenceLinks*.ts, epistemicQuestions.helpers.ts) inherits `any` from\n// here. The fix is structural — generate a per-module typed surface or a shared\n// typed function-reference manifest (template: the typed `components.controlPlane`\n// in modules/control-plane/src/component/convex.ts and the\n// `KERNEL_API_REF_MANIFEST` pattern in packages/server-core/src/kernelApi.ts) —\n// owned by the FR.11 closing/synthesis pass, not a mechanical swap.\nexport const api = anyApi as any;\nexport const components = componentsGeneric() as any;\nexport const internal = anyApi as any;\n\nexport type TableNames = string;\nexport type Id<TableName extends TableNames = string> = GenericId<TableName>;\nexport type Doc<TableName extends TableNames = string> = any;\nexport type DataModel = any;\ntype IndexRangeBuilder = {\n field(fieldName: string): string;\n eq(fieldName: string, value: unknown): IndexRangeBuilder;\n gt(fieldName: string, value: unknown): IndexRangeBuilder;\n gte(fieldName: string, value: unknown): IndexRangeBuilder;\n lt(fieldName: string, value: unknown): IndexRangeBuilder;\n lte(fieldName: string, value: unknown): IndexRangeBuilder;\n};\ntype FilterBuilder = {\n eq(left: unknown, right: unknown): unknown;\n neq(left: unknown, right: unknown): unknown;\n gt(left: unknown, right: unknown): unknown;\n gte(left: unknown, right: unknown): unknown;\n lt(left: unknown, right: unknown): unknown;\n lte(left: unknown, right: unknown): unknown;\n and(...clauses: unknown[]): unknown;\n or(...clauses: unknown[]): unknown;\n field(fieldName: string): unknown;\n};\ntype QueryInitializer<TableName extends TableNames> = {\n withIndex(\n indexName: string,\n range?: (q: any) => unknown\n ): QueryInitializer<TableName>;\n filter(predicate: (q: any) => unknown): QueryInitializer<TableName>;\n order(direction: \"asc\" | \"desc\"): QueryInitializer<TableName>;\n collect(): Promise<Doc<TableName>[]>;\n take(limit: number): Promise<Doc<TableName>[]>;\n first(): Promise<Doc<TableName> | null>;\n unique(): Promise<Doc<TableName> | null>;\n};\nexport type DatabaseReader = {\n get<TableName extends TableNames>(\n id: Id<TableName>\n ): Promise<Doc<TableName> | null>;\n query<TableName extends TableNames>(\n tableName: TableName\n ): QueryInitializer<TableName>;\n normalizeId?<TableName extends TableNames>(\n tableName: TableName,\n id: string\n ): Id<TableName> | null;\n};\nexport type DatabaseWriter = DatabaseReader & {\n insert<TableName extends TableNames>(\n tableName: TableName,\n value: Record<string, unknown>\n ): Promise<Id<TableName>>;\n patch<TableName extends TableNames>(\n id: Id<TableName>,\n value: Record<string, unknown>\n ): Promise<void>;\n replace<TableName extends TableNames>(\n id: Id<TableName>,\n value: Record<string, unknown>\n ): Promise<void>;\n delete<TableName extends TableNames>(id: Id<TableName>): Promise<void>;\n};\ntype Scheduler = {\n runAfter(delayMs: number, functionReference: unknown, args?: unknown): Promise<void>;\n};\ntype AuthReader = {\n getUserIdentity(): Promise<unknown>;\n};\ntype RuntimeInvoker = {\n runQuery(functionReference: unknown, args?: unknown): Promise<any>;\n runMutation(functionReference: unknown, args?: unknown): Promise<any>;\n runAction(functionReference: unknown, args?: unknown): Promise<any>;\n};\nexport type QueryCtx = RuntimeInvoker & {\n auth: AuthReader;\n db: DatabaseReader;\n scheduler: Scheduler;\n};\nexport type MutationCtx = RuntimeInvoker & {\n auth: AuthReader;\n db: DatabaseWriter;\n scheduler: Scheduler;\n};\nexport type ActionCtx = RuntimeInvoker & {\n auth: AuthReader;\n scheduler: Scheduler;\n};\n\ntype ConvexFunctionBuilder<Ctx> = <\n Definition extends { handler?: (ctx: Ctx, args: any) => any },\n>(\n definition: Definition\n) => any;\n\nexport const action = actionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const httpAction =\n httpActionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const internalAction =\n internalActionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const internalMutation =\n internalMutationGeneric as unknown as ConvexFunctionBuilder<MutationCtx>;\nexport const internalQuery =\n internalQueryGeneric as unknown as ConvexFunctionBuilder<QueryCtx>;\nexport const mutation =\n mutationGeneric as unknown as ConvexFunctionBuilder<MutationCtx>;\nexport const query = queryGeneric as unknown as ConvexFunctionBuilder<QueryCtx>;\n","// DORMANT: Ontology approval UI stubbed in EK-16.1c. Re-enable when approval workflow ships.\n\nimport { v } from \"convex/values\";\nimport { internalMutation, mutation, query } from \"./convex\";\nimport type { MutationCtx } from \"./convex\";\nimport { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\n\nexport const getPendingForProject = query({\n args: v.any(),\n returns: permissiveReturn,\n handler: async () => ({ total: 0, bySource: [] }),\n});\n\nexport const getPendingForNode = query({\n args: v.any(),\n returns: permissiveReturn,\n handler: async () => [],\n});\n\nexport const getThemeOntologyMatches = query({\n args: v.any(),\n returns: permissiveReturn,\n handler: async () => [],\n});\n\nexport const createPendingLink = mutation({\n args: v.any(),\n returns: permissiveReturn,\n handler: async () => null,\n});\n\nexport const approve = mutation({\n args: v.any(),\n returns: permissiveReturn,\n handler: async () => ({ success: true }),\n});\n\nexport const reject = mutation({\n args: v.any(),\n returns: permissiveReturn,\n handler: async () => ({ success: true }),\n});\n\nexport const bulkApprove = mutation({\n args: v.any(),\n returns: permissiveReturn,\n handler: async (_ctx: MutationCtx, args: { linkIds?: unknown[] }) => ({\n approved: 0,\n total: Array.isArray(args.linkIds)\n ? args.linkIds.length\n : 0,\n }),\n});\n\nexport const bulkApproveHighConfidence = mutation({\n args: v.any(),\n returns: permissiveReturn,\n handler: async () => ({ approved: 0 }),\n});\n\nexport const createNeo4jEdge = internalMutation({\n args: v.any(),\n returns: permissiveReturn,\n handler: async () => ({ success: true }),\n});\n\nexport const batchCreatePendingLinks = internalMutation({\n args: v.any(),\n returns: permissiveReturn,\n handler: async () => ({ created: 0, autoApproved: 0 }),\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/convex.ts","../src/ontologyApproval.ts"],"names":[],"mappings":";;;;;;AA4BkB,kBAAA;AAAA,EAChB;AACF;AAGE,iBAAA;AA4IK,IAAM,gBAAA,GACX,uBAAA;AAGK,IAAM,QAAA,GACX,eAAA;AACK,IAAM,KAAA,GAAQ,YAAA;;;AC3Kd,IAAM,uBAAuB,KAAA,CAAM;AAAA,EACxC,IAAA,EAAM,EAAE,GAAA,EAAI;AAAA,EACZ,OAAA,EAAS,gBAAA;AAAA,EACT,SAAS,aAAa,EAAE,OAAO,CAAA,EAAG,QAAA,EAAU,EAAC,EAAE;AACjD,CAAC;AAEM,IAAM,oBAAoB,KAAA,CAAM;AAAA,EACrC,IAAA,EAAM,EAAE,GAAA,EAAI;AAAA,EACZ,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,YAAY;AACvB,CAAC;AAEM,IAAM,0BAA0B,KAAA,CAAM;AAAA,EAC3C,IAAA,EAAM,EAAE,GAAA,EAAI;AAAA,EACZ,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,YAAY;AACvB,CAAC;AAEM,IAAM,oBAAoB,QAAA,CAAS;AAAA,EACxC,IAAA,EAAM,EAAE,GAAA,EAAI;AAAA,EACZ,OAAA,EAAS,gBAAA;AAAA,EACT,SAAS,YAAY;AACvB,CAAC;AAEM,IAAM,UAAU,QAAA,CAAS;AAAA,EAC9B,IAAA,EAAM,EAAE,GAAA,EAAI;AAAA,EACZ,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,aAAa,EAAE,OAAA,EAAS,IAAA,EAAK;AACxC,CAAC;AAEM,IAAM,SAAS,QAAA,CAAS;AAAA,EAC7B,IAAA,EAAM,EAAE,GAAA,EAAI;AAAA,EACZ,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,aAAa,EAAE,OAAA,EAAS,IAAA,EAAK;AACxC,CAAC;AAEM,IAAM,cAAc,QAAA,CAAS;AAAA,EAClC,IAAA,EAAM,EAAE,GAAA,EAAI;AAAA,EACZ,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,OAAO,IAAA,EAAmB,IAAA,MAAmC;AAAA,IACpE,QAAA,EAAU,CAAA;AAAA,IACV,KAAA,EAAO,MAAM,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,GAAI,IAAA,CAAK,QAAQ,MAAA,GAAS;AAAA,GAC7D;AACF,CAAC;AAEM,IAAM,4BAA4B,QAAA,CAAS;AAAA,EAChD,IAAA,EAAM,EAAE,GAAA,EAAI;AAAA,EACZ,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,aAAa,EAAE,QAAA,EAAU,CAAA,EAAE;AACtC,CAAC;AAEM,IAAM,kBAAkB,gBAAA,CAAiB;AAAA,EAC9C,IAAA,EAAM,EAAE,GAAA,EAAI;AAAA,EACZ,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,aAAa,EAAE,OAAA,EAAS,IAAA,EAAK;AACxC,CAAC;AAEM,IAAM,0BAA0B,gBAAA,CAAiB;AAAA,EACtD,IAAA,EAAM,EAAE,GAAA,EAAI;AAAA,EACZ,OAAA,EAAS,gBAAA;AAAA,EACT,SAAS,aAAa,EAAE,OAAA,EAAS,CAAA,EAAG,cAAc,CAAA,EAAE;AACtD,CAAC","file":"ontologyApproval.js","sourcesContent":["import type { Doc as AccessControlDoc } from \"@lucern/access-control/convex\";\nimport {\n type UnsafeConvexAnyApi,\n unsafeConvexAnyApi,\n} from \"@lucern/contracts/convex/unsafeAnyApi\";\nimport {\n actionGeneric,\n componentsGeneric,\n httpActionGeneric,\n internalActionGeneric,\n internalMutationGeneric,\n internalQueryGeneric,\n mutationGeneric,\n queryGeneric,\n} from \"convex/server\";\nimport type { GenericId } from \"convex/values\";\n\n// TODO(FR.11-structural): `api`/`internal`/`components` are `anyApi as any`\n// because this module source tree is bundled into the kernel host at deploy time\n// and has NO top-level Convex `_generated/` directory to import a typed surface\n// from. Every `api.*` / `internal.*` / string-literal cross-component ref in this\n// module (topicScope.ts, topicProjectOverlay.ts, questionEvidenceLinks.ts,\n// beliefEvidenceLinks*.ts, epistemicQuestions.helpers.ts) inherits `any` from\n// here. The fix is structural — generate a per-module typed surface or a shared\n// typed function-reference manifest (template: the typed `components.controlPlane`\n// in modules/control-plane/src/component/convex.ts and the\n// `KERNEL_API_REF_MANIFEST` pattern in packages/server-core/src/kernelApi.ts) —\n// owned by the FR.11 closing/synthesis pass, not a mechanical swap.\nconst unsafeApi = unsafeConvexAnyApi(\n \"graph-primitives top-level module bundle lacks a committed Convex _generated/api surface\"\n);\nexport const api = unsafeApi;\nexport const components =\n componentsGeneric() as unknown as UntypedFunctionReferenceSurface;\nexport const internal = unsafeApi;\n\ntype UntypedFunctionReferenceSurface = UnsafeConvexAnyApi;\ntype BoundaryValue = UntypedFunctionReferenceSurface[string];\n\nexport type TableNames = string;\nexport type Id<TableName extends TableNames = string> = GenericId<TableName>;\nexport type Doc<TableName extends TableNames = string> =\n AccessControlDoc<TableName>;\nexport type DataModel = Record<TableNames, unknown>;\ninterface IndexRangeBuilder {\n eq(fieldName: string, value: unknown): IndexRangeBuilder;\n field(fieldName: string): string;\n gt(fieldName: string, value: unknown): IndexRangeBuilder;\n gte(fieldName: string, value: unknown): IndexRangeBuilder;\n lt(fieldName: string, value: unknown): IndexRangeBuilder;\n lte(fieldName: string, value: unknown): IndexRangeBuilder;\n}\ninterface FilterBuilder {\n and(...clauses: unknown[]): FilterBuilder;\n eq(left: unknown, right: unknown): FilterBuilder;\n field(fieldName: string): string;\n gt(left: unknown, right: unknown): FilterBuilder;\n gte(left: unknown, right: unknown): FilterBuilder;\n lt(left: unknown, right: unknown): FilterBuilder;\n lte(left: unknown, right: unknown): FilterBuilder;\n neq(left: unknown, right: unknown): FilterBuilder;\n or(...clauses: unknown[]): FilterBuilder;\n [operator: string]: unknown;\n}\ninterface QueryInitializer<TableName extends TableNames> {\n collect(): Promise<Doc<TableName>[]>;\n filter(predicate: (q: FilterBuilder) => unknown): QueryInitializer<TableName>;\n first(): Promise<Doc<TableName> | null>;\n order(direction: \"asc\" | \"desc\"): QueryInitializer<TableName>;\n take(limit: number): Promise<Doc<TableName>[]>;\n unique(): Promise<Doc<TableName> | null>;\n withIndex(\n indexName: string,\n range?: (q: IndexRangeBuilder) => unknown\n ): QueryInitializer<TableName>;\n withSearchIndex(\n indexName: string,\n search?: (q: IndexRangeBuilder) => unknown\n ): QueryInitializer<TableName>;\n}\nexport interface DatabaseReader {\n get<TableName extends TableNames>(\n id: unknown\n ): Promise<Doc<TableName> | null>;\n normalizeId?<TableName extends TableNames>(\n tableName: TableName,\n id: string\n ): Id<TableName> | null;\n query<TableName extends TableNames>(\n tableName: TableName\n ): QueryInitializer<TableName>;\n}\nexport type DatabaseWriter = DatabaseReader & {\n insert<TableName extends TableNames>(\n tableName: TableName,\n value: Record<string, unknown>\n ): Promise<Id<TableName>>;\n patch<TableName extends TableNames>(\n id: Id<TableName>,\n value: Record<string, unknown>\n ): Promise<void>;\n replace<TableName extends TableNames>(\n id: Id<TableName>,\n value: Record<string, unknown>\n ): Promise<void>;\n delete<TableName extends TableNames>(id: Id<TableName>): Promise<void>;\n};\ninterface Scheduler {\n runAfter(\n delayMs: number,\n functionReference: unknown,\n args?: unknown\n ): Promise<void>;\n}\ninterface AuthReader {\n getUserIdentity(): Promise<{\n readonly subject: string;\n readonly [claimName: string]: unknown;\n } | null>;\n}\ninterface RuntimeInvoker {\n runAction<Result = unknown>(\n functionReference: unknown,\n args?: unknown\n ): Promise<Result>;\n runMutation<Result = unknown>(\n functionReference: unknown,\n args?: unknown\n ): Promise<Result>;\n runQuery<Result = unknown>(\n functionReference: unknown,\n args?: unknown\n ): Promise<Result>;\n}\nexport type QueryCtx = RuntimeInvoker & {\n auth: AuthReader;\n db: DatabaseReader;\n scheduler: Scheduler;\n};\nexport type MutationCtx = RuntimeInvoker & {\n auth: AuthReader;\n db: DatabaseWriter;\n scheduler: Scheduler;\n};\nexport type ActionCtx = RuntimeInvoker & {\n auth: AuthReader;\n scheduler: Scheduler;\n};\n\ntype ConvexFunctionBuilder<Ctx> = <\n Args = BoundaryValue,\n Result = BoundaryValue,\n>(definition: {\n args?: unknown;\n handler: (ctx: Ctx, args: Args) => Result;\n returns?: unknown;\n}) => unknown;\n\ntype OptionalHandlerConvexFunctionBuilder<Ctx> = <\n Args = BoundaryValue,\n Result = BoundaryValue,\n>(definition: {\n args?: unknown;\n handler?: (ctx: Ctx, args: Args) => Result;\n returns?: unknown;\n}) => unknown;\n\nexport const action =\n actionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const httpAction =\n httpActionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const internalAction =\n internalActionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const internalMutation =\n internalMutationGeneric as unknown as OptionalHandlerConvexFunctionBuilder<MutationCtx>;\nexport const internalQuery =\n internalQueryGeneric as unknown as OptionalHandlerConvexFunctionBuilder<QueryCtx>;\nexport const mutation =\n mutationGeneric as unknown as ConvexFunctionBuilder<MutationCtx>;\nexport const query = queryGeneric as unknown as ConvexFunctionBuilder<QueryCtx>;\n","// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\n// DORMANT: Ontology approval UI stubbed in EK-16.1c. Re-enable when approval workflow ships.\n\nimport { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\nimport { v } from \"convex/values\";\nimport type { MutationCtx } from \"./convex\";\nimport { internalMutation, mutation, query } from \"./convex\";\n\nexport const getPendingForProject = query({\n args: v.any(),\n returns: permissiveReturn,\n handler: async () => ({ total: 0, bySource: [] }),\n});\n\nexport const getPendingForNode = query({\n args: v.any(),\n returns: permissiveReturn,\n handler: async () => [],\n});\n\nexport const getThemeOntologyMatches = query({\n args: v.any(),\n returns: permissiveReturn,\n handler: async () => [],\n});\n\nexport const createPendingLink = mutation({\n args: v.any(),\n returns: permissiveReturn,\n handler: async () => null,\n});\n\nexport const approve = mutation({\n args: v.any(),\n returns: permissiveReturn,\n handler: async () => ({ success: true }),\n});\n\nexport const reject = mutation({\n args: v.any(),\n returns: permissiveReturn,\n handler: async () => ({ success: true }),\n});\n\nexport const bulkApprove = mutation({\n args: v.any(),\n returns: permissiveReturn,\n handler: async (_ctx: MutationCtx, args: { linkIds?: unknown[] }) => ({\n approved: 0,\n total: Array.isArray(args.linkIds) ? args.linkIds.length : 0,\n }),\n});\n\nexport const bulkApproveHighConfidence = mutation({\n args: v.any(),\n returns: permissiveReturn,\n handler: async () => ({ approved: 0 }),\n});\n\nexport const createNeo4jEdge = internalMutation({\n args: v.any(),\n returns: permissiveReturn,\n handler: async () => ({ success: true }),\n});\n\nexport const batchCreatePendingLinks = internalMutation({\n args: v.any(),\n returns: permissiveReturn,\n handler: async () => ({ created: 0, autoApproved: 0 }),\n});\n"]}
|
|
@@ -1,72 +1,62 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Ontology Definition Mutations & Queries
|
|
3
|
-
*
|
|
4
|
-
* CRUD operations for first-class ontology definition objects.
|
|
5
|
-
* Follows the packDefinitions + packVersions two-table pattern from Master Control.
|
|
6
|
-
*
|
|
7
|
-
* Pure helper functions live in ontologyHelpers.ts for unit testing.
|
|
8
|
-
*
|
|
9
|
-
* @module graph-primitives/ontologyDefinitions
|
|
10
|
-
*/
|
|
11
1
|
/**
|
|
12
2
|
* Get an ontology definition by ID.
|
|
13
3
|
*/
|
|
14
|
-
declare const getOntologyDefinition:
|
|
4
|
+
declare const getOntologyDefinition: unknown;
|
|
15
5
|
/**
|
|
16
6
|
* Get an ontology definition by ontologyKey (optionally scoped by tenant).
|
|
17
7
|
*/
|
|
18
|
-
declare const getOntologyDefinitionByKey:
|
|
8
|
+
declare const getOntologyDefinitionByKey: unknown;
|
|
19
9
|
/**
|
|
20
10
|
* List ontology definitions with optional filters.
|
|
21
11
|
*/
|
|
22
|
-
declare const listOntologyDefinitions:
|
|
12
|
+
declare const listOntologyDefinitions: unknown;
|
|
23
13
|
/**
|
|
24
14
|
* Get a specific version by ontologyId + version string.
|
|
25
15
|
*/
|
|
26
|
-
declare const getOntologyVersion:
|
|
16
|
+
declare const getOntologyVersion: unknown;
|
|
27
17
|
/**
|
|
28
18
|
* List versions for an ontology, optionally filtered by status.
|
|
29
19
|
*/
|
|
30
|
-
declare const listOntologyVersions:
|
|
20
|
+
declare const listOntologyVersions: unknown;
|
|
31
21
|
/**
|
|
32
22
|
* Get the latest published version for an ontology.
|
|
33
23
|
*/
|
|
34
|
-
declare const getPublishedVersion:
|
|
24
|
+
declare const getPublishedVersion: unknown;
|
|
35
25
|
/**
|
|
36
26
|
* Resolve the effective ontology by composing parent chain.
|
|
37
27
|
* Walks parentOntologyId chain (max depth 3) and merges additively.
|
|
38
28
|
*/
|
|
39
|
-
declare const resolveEffectiveOntology:
|
|
29
|
+
declare const resolveEffectiveOntology: unknown;
|
|
40
30
|
/**
|
|
41
31
|
* Create a new ontology definition.
|
|
42
32
|
*/
|
|
43
|
-
declare const createOntologyDefinition:
|
|
33
|
+
declare const createOntologyDefinition: unknown;
|
|
44
34
|
/**
|
|
45
35
|
* Update an ontology definition (name, description, status).
|
|
46
36
|
* Only allowed while draft or active.
|
|
47
37
|
*/
|
|
48
|
-
declare const updateOntologyDefinition:
|
|
38
|
+
declare const updateOntologyDefinition: unknown;
|
|
49
39
|
/**
|
|
50
40
|
* Archive an ontology definition.
|
|
51
41
|
*/
|
|
52
|
-
declare const archiveOntologyDefinition:
|
|
42
|
+
declare const archiveOntologyDefinition: unknown;
|
|
53
43
|
/**
|
|
54
44
|
* Create a new version snapshot for an ontology.
|
|
55
45
|
*/
|
|
56
|
-
declare const createOntologyVersion:
|
|
46
|
+
declare const createOntologyVersion: unknown;
|
|
57
47
|
/**
|
|
58
48
|
* Update a draft version (entityTypes, edgeTypes, releaseNotes).
|
|
59
49
|
* Only allowed while version is in "draft" status.
|
|
60
50
|
*/
|
|
61
|
-
declare const updateDraftVersion:
|
|
51
|
+
declare const updateDraftVersion: unknown;
|
|
62
52
|
/**
|
|
63
53
|
* Publish a version — freezes it (status → "published").
|
|
64
54
|
* If the parent definition is "draft", promotes it to "active".
|
|
65
55
|
*/
|
|
66
|
-
declare const publishOntologyVersion:
|
|
56
|
+
declare const publishOntologyVersion: unknown;
|
|
67
57
|
/**
|
|
68
58
|
* Deprecate a published version.
|
|
69
59
|
*/
|
|
70
|
-
declare const deprecateOntologyVersion:
|
|
60
|
+
declare const deprecateOntologyVersion: unknown;
|
|
71
61
|
|
|
72
62
|
export { archiveOntologyDefinition, createOntologyDefinition, createOntologyVersion, deprecateOntologyVersion, getOntologyDefinition, getOntologyDefinitionByKey, getOntologyVersion, getPublishedVersion, listOntologyDefinitions, listOntologyVersions, publishOntologyVersion, resolveEffectiveOntology, updateDraftVersion, updateOntologyDefinition };
|