@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 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/convex.ts","../src/ontologyHelpers.ts","../src/ontologyDefinitions.ts"],"names":[],"mappings":"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","file":"ontologyDefinitions.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","/**\n * Ontology Definition Pure Helpers\n *\n * Pure functions for ontology key validation, version string validation,\n * layer merging, and soft edge constraint checking.\n *\n * Separated from ontologyDefinitions.ts to enable unit testing without\n * Convex runtime dependencies.\n *\n * @module graph-primitives/ontologyHelpers\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type EntityTypeEntry = {\n value: string;\n label: string;\n description?: string;\n schema?: unknown;\n subtypes?: Array<{ value: string; label: string; description?: string }>;\n};\n\nexport type EdgeTypeEntry = {\n value: string;\n label: string;\n description?: string;\n sourceTypes?: string[];\n targetTypes?: string[];\n constraintSeverity?: \"warn\" | \"info\";\n};\n\nexport type MergedOntology = {\n entityTypes: EntityTypeEntry[];\n edgeTypes: EdgeTypeEntry[];\n layers: string[]; // ontologyKeys in composition order\n};\n\nexport type EdgeConstraintResult = {\n valid: boolean;\n warnings: string[];\n};\n\n// =============================================================================\n// PURE HELPER FUNCTIONS\n// =============================================================================\n\nconst ONTOLOGY_KEY_REGEX = /^[a-z][a-z0-9-]*[a-z0-9]$/;\nconst VERSION_STRING_REGEX = /^\\d+\\.\\d+\\.\\d+$/;\n\n/**\n * Validate and normalize an ontology key.\n * Must be lowercase alphanumeric with hyphens, 2+ chars.\n */\nexport function validateOntologyKey(key: string): {\n valid: boolean;\n normalized: string;\n error?: string;\n} {\n const normalized = key.trim().toLowerCase();\n if (normalized.length < 2) {\n return {\n valid: false,\n normalized,\n error: \"Ontology key must be at least 2 characters.\",\n };\n }\n if (normalized.length > 64) {\n return {\n valid: false,\n normalized,\n error: \"Ontology key must be at most 64 characters.\",\n };\n }\n if (!ONTOLOGY_KEY_REGEX.test(normalized)) {\n return {\n valid: false,\n normalized,\n error:\n \"Ontology key must start with a letter, contain only lowercase letters, digits, and hyphens, and not end with a hyphen.\",\n };\n }\n return { valid: true, normalized };\n}\n\n/**\n * Validate a version string (basic semver-like format).\n * Accepts \"X.Y.Z\" where X, Y, Z are non-negative integers.\n */\nexport const validateVersionString = VERSION_STRING_REGEX.test.bind(\n VERSION_STRING_REGEX\n) as (version: string) => boolean;\n\n/**\n * Merge ontology layers additively. Child adds to parent; never removes.\n * Duplicate entity/edge values in child override parent entries.\n */\nexport function mergeOntologyLayers(\n parent: { entityTypes: EntityTypeEntry[]; edgeTypes: EdgeTypeEntry[] },\n child: { entityTypes: EntityTypeEntry[]; edgeTypes: EdgeTypeEntry[] },\n parentKey: string,\n childKey: string\n): MergedOntology {\n // Entity types: child overrides parent by value\n const entityMap = new Map<string, EntityTypeEntry>();\n for (const et of parent.entityTypes) {\n entityMap.set(et.value, et);\n }\n for (const et of child.entityTypes) {\n entityMap.set(et.value, et);\n }\n\n // Edge types: child overrides parent by value\n const edgeMap = new Map<string, EdgeTypeEntry>();\n for (const edge of parent.edgeTypes) {\n edgeMap.set(edge.value, edge);\n }\n for (const edge of child.edgeTypes) {\n edgeMap.set(edge.value, edge);\n }\n\n return {\n entityTypes: Array.from(entityMap.values()),\n edgeTypes: Array.from(edgeMap.values()),\n layers: [parentKey, childKey],\n };\n}\n\n/**\n * Validate an edge against soft constraints.\n * Returns warnings but never blocks (soft constraint model).\n */\nexport function validateEdgeConstraint(\n edge: { sourceType: string; targetType: string; edgeType: string },\n constraints: EdgeTypeEntry | undefined\n): EdgeConstraintResult {\n if (!constraints) {\n return { valid: true, warnings: [] };\n }\n\n const warnings: string[] = [];\n\n if (\n constraints.sourceTypes &&\n constraints.sourceTypes.length > 0 &&\n !constraints.sourceTypes.includes(edge.sourceType)\n ) {\n warnings.push(\n `Edge type \"${edge.edgeType}\" recommends source types [${constraints.sourceTypes.join(\", \")}] but got \"${edge.sourceType}\".`\n );\n }\n\n if (\n constraints.targetTypes &&\n constraints.targetTypes.length > 0 &&\n !constraints.targetTypes.includes(edge.targetType)\n ) {\n warnings.push(\n `Edge type \"${edge.edgeType}\" recommends target types [${constraints.targetTypes.join(\", \")}] but got \"${edge.targetType}\".`\n );\n }\n\n // Soft constraints: always valid, just warn\n return { valid: true, warnings };\n}\n\n/**\n * Resolve effective tier from definition tier and tenantId.\n */\nexport function resolveEffectiveTier(\n defTier: \"platform\" | \"pack\" | \"tenant\",\n tenantId?: string\n): \"platform\" | \"pack\" | \"tenant\" {\n if (!tenantId) {\n return \"platform\";\n }\n if (defTier === \"platform\") {\n return \"platform\";\n }\n return defTier;\n}\n","/**\n * Ontology Definition Mutations & Queries\n *\n * CRUD operations for first-class ontology definition objects.\n * Follows the packDefinitions + packVersions two-table pattern from Master Control.\n *\n * Pure helper functions live in ontologyHelpers.ts for unit testing.\n *\n * @module graph-primitives/ontologyDefinitions\n */\n\nimport { v } from \"convex/values\";\nimport { getCurrentUserId } from \"@lucern/access-control/auth\";\nimport { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\nimport type { Id, MutationCtx, QueryCtx } from \"./convex\";\nimport { mutation, query } from \"./convex\";\nimport type {\n EdgeTypeEntry,\n EntityTypeEntry,\n MergedOntology,\n} from \"./ontologyHelpers\";\nimport {\n mergeOntologyLayers,\n validateOntologyKey,\n validateVersionString,\n} from \"./ontologyHelpers\";\n\n// =============================================================================\n// AUTH HELPER\n// =============================================================================\n\nasync function requireAuth(ctx: MutationCtx): Promise<string> {\n const userId = await getCurrentUserId(ctx as any);\n if (!userId) {\n throw new Error(\"Authentication required.\");\n }\n return userId;\n}\n\nasync function _requireAuthQuery(ctx: QueryCtx): Promise<string> {\n const userId = await getCurrentUserId(ctx as any);\n if (!userId) {\n throw new Error(\"Authentication required.\");\n }\n return userId;\n}\n\n// =============================================================================\n// AUDIT HELPER\n// =============================================================================\n\ntype AuditEntityType = \"ontologyDefinition\" | \"ontologyVersion\";\ntype AuditChangeType =\n | \"created\"\n | \"updated\"\n | \"archived\"\n | \"published\"\n | \"deprecated\";\ntype IndexRangeBuilder = {\n eq(fieldName: string, value: unknown): IndexRangeBuilder;\n};\ntype OntologyDefinitionStatus =\n | \"draft\"\n | \"active\"\n | \"deprecated\"\n | \"archived\";\ntype OntologyVersionStatus = \"draft\" | \"published\" | \"deprecated\";\ntype OntologyDefinitionDoc = {\n _id: Id<\"ontologyDefinitions\">;\n ontologyKey: string;\n name?: string;\n description?: string;\n parentOntologyId?: Id<\"ontologyDefinitions\">;\n status: OntologyDefinitionStatus;\n};\ntype OntologyVersionDoc = {\n _id: Id<\"ontologyVersions\">;\n ontologyId: Id<\"ontologyDefinitions\">;\n ontologyKey: string;\n version: string;\n status: OntologyVersionStatus;\n publishedAt?: number;\n entityTypes: unknown;\n edgeTypes: unknown;\n};\ntype CreateOntologyVersionArgs = {\n ontologyId: Id<\"ontologyDefinitions\">;\n version: string;\n entityTypes: EntityTypeEntry[];\n edgeTypes: EdgeTypeEntry[];\n releaseNotes?: string;\n};\ntype UpdateDraftVersionArgs = {\n id: Id<\"ontologyVersions\">;\n entityTypes?: EntityTypeEntry[];\n edgeTypes?: EdgeTypeEntry[];\n releaseNotes?: string;\n};\ntype VersionStatusMutationArgs = {\n id: Id<\"ontologyVersions\">;\n ontologyId?: Id<\"ontologyDefinitions\">;\n};\n\nasync function logAudit(\n ctx: MutationCtx,\n args: {\n entityType: AuditEntityType;\n entityId: string;\n changeType: AuditChangeType;\n changedBy: string;\n previousState: unknown;\n newState: unknown;\n }\n) {\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: args.entityType,\n entityId: args.entityId,\n changeType: args.changeType,\n changedAt: Date.now(),\n changedBy: args.changedBy,\n isAgent: false,\n previousState: args.previousState ?? null,\n newState: args.newState ?? null,\n });\n}\n\n// =============================================================================\n// QUERIES\n// =============================================================================\n\n/**\n * Get an ontology definition by ID.\n */\nexport const getOntologyDefinition = query({\n args: { id: v.id(\"ontologyDefinitions\") },\n returns: permissiveReturn,\n handler: async (\n ctx: QueryCtx,\n args: { id: Id<\"ontologyDefinitions\"> }\n ) => {\n return await ctx.db.get(args.id);\n },\n});\n\n/**\n * Get an ontology definition by ontologyKey (optionally scoped by tenant).\n */\nexport const getOntologyDefinitionByKey = query({\n args: {\n ontologyKey: v.string(),\n tenantId: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (\n ctx: QueryCtx,\n args: { ontologyKey: string; tenantId?: string }\n ) => {\n if (args.tenantId) {\n return await ctx.db\n .query(\"ontologyDefinitions\")\n .withIndex(\"by_tenant_ontologyKey\", (q: IndexRangeBuilder) =>\n q.eq(\"tenantId\", args.tenantId).eq(\"ontologyKey\", args.ontologyKey)\n )\n .first();\n }\n // Platform default (tenantId = undefined)\n return await ctx.db\n .query(\"ontologyDefinitions\")\n .withIndex(\"by_tenant_ontologyKey\", (q: IndexRangeBuilder) =>\n q.eq(\"tenantId\", undefined).eq(\"ontologyKey\", args.ontologyKey)\n )\n .first();\n },\n});\n\n/**\n * List ontology definitions with optional filters.\n */\nexport const listOntologyDefinitions = query({\n args: {\n tenantId: v.optional(v.string()),\n tier: v.optional(\n v.union(v.literal(\"platform\"), v.literal(\"pack\"), v.literal(\"tenant\"))\n ),\n status: v.optional(\n v.union(\n v.literal(\"draft\"),\n v.literal(\"active\"),\n v.literal(\"deprecated\"),\n v.literal(\"archived\")\n )\n ),\n },\n returns: permissiveReturn,\n handler: async (\n ctx: QueryCtx,\n args: {\n tenantId?: string;\n tier?: \"platform\" | \"pack\" | \"tenant\";\n status?: OntologyDefinitionStatus;\n }\n ) => {\n if (args.tenantId && args.status) {\n const status = args.status;\n return await ctx.db\n .query(\"ontologyDefinitions\")\n .withIndex(\"by_tenant_status\", (q: IndexRangeBuilder) =>\n q.eq(\"tenantId\", args.tenantId).eq(\"status\", status)\n )\n .collect();\n }\n if (args.status) {\n const status = args.status;\n return await ctx.db\n .query(\"ontologyDefinitions\")\n .withIndex(\"by_status\", (q: IndexRangeBuilder) =>\n q.eq(\"status\", status)\n )\n .collect();\n }\n if (args.tier) {\n const tier = args.tier;\n return await ctx.db\n .query(\"ontologyDefinitions\")\n .withIndex(\"by_tier\", (q: IndexRangeBuilder) => q.eq(\"tier\", tier))\n .collect();\n }\n return await ctx.db.query(\"ontologyDefinitions\").collect();\n },\n});\n\n/**\n * Get a specific version by ontologyId + version string.\n */\nexport const getOntologyVersion = query({\n args: {\n ontologyKey: v.string(),\n version: v.string(),\n },\n returns: permissiveReturn,\n handler: async (\n ctx: QueryCtx,\n args: { ontologyKey: string; version: string }\n ) => {\n return await ctx.db\n .query(\"ontologyVersions\")\n .withIndex(\"by_ontologyKey_version\", (q: IndexRangeBuilder) =>\n q.eq(\"ontologyKey\", args.ontologyKey).eq(\"version\", args.version)\n )\n .first();\n },\n});\n\n/**\n * List versions for an ontology, optionally filtered by status.\n */\nexport const listOntologyVersions = query({\n args: {\n ontologyId: v.id(\"ontologyDefinitions\"),\n status: v.optional(\n v.union(\n v.literal(\"draft\"),\n v.literal(\"published\"),\n v.literal(\"deprecated\")\n )\n ),\n },\n returns: permissiveReturn,\n handler: async (\n ctx: QueryCtx,\n args: { ontologyId: Id<\"ontologyDefinitions\">; status?: OntologyVersionStatus }\n ) => {\n const all = (await ctx.db\n .query(\"ontologyVersions\")\n .withIndex(\"by_ontologyId\", (q: IndexRangeBuilder) =>\n q.eq(\"ontologyId\", args.ontologyId)\n )\n .collect()) as OntologyVersionDoc[];\n\n if (args.status) {\n return all.filter(\n (versionDoc: OntologyVersionDoc) => versionDoc.status === args.status\n );\n }\n return all;\n },\n});\n\n/**\n * Get the latest published version for an ontology.\n */\nexport const getPublishedVersion = query({\n args: { ontologyId: v.id(\"ontologyDefinitions\") },\n returns: permissiveReturn,\n handler: async (\n ctx: QueryCtx,\n args: { ontologyId: Id<\"ontologyDefinitions\"> }\n ) => {\n const published = (await ctx.db\n .query(\"ontologyVersions\")\n .withIndex(\"by_ontologyId\", (q: IndexRangeBuilder) =>\n q.eq(\"ontologyId\", args.ontologyId)\n )\n .collect()) as OntologyVersionDoc[];\n\n const publishedOnly = published.filter(\n (versionDoc: OntologyVersionDoc) => versionDoc.status === \"published\"\n );\n if (publishedOnly.length === 0) {\n return null;\n }\n\n // Return most recently published\n publishedOnly.sort(\n (a: OntologyVersionDoc, b: OntologyVersionDoc) =>\n (b.publishedAt ?? 0) - (a.publishedAt ?? 0)\n );\n return publishedOnly[0];\n },\n});\n\n/**\n * Resolve the effective ontology by composing parent chain.\n * Walks parentOntologyId chain (max depth 3) and merges additively.\n */\nexport const resolveEffectiveOntology = query({\n args: { ontologyId: v.id(\"ontologyDefinitions\") },\n returns: permissiveReturn,\n handler: async (\n ctx: QueryCtx,\n args: { ontologyId: Id<\"ontologyDefinitions\"> }\n ) => {\n const MAX_DEPTH = 3;\n type OntologyDef = {\n ontologyKey: string;\n parentOntologyId?: Id<\"ontologyDefinitions\">;\n };\n type OntologyVer = {\n status: string;\n publishedAt?: number;\n entityTypes: unknown;\n edgeTypes: unknown;\n };\n const chain: Array<{ def: OntologyDef; version: OntologyVer | null }> = [];\n\n // Walk parent chain\n let currentId: Id<\"ontologyDefinitions\"> | undefined = args.ontologyId;\n for (let depth = 0; depth < MAX_DEPTH && currentId; depth++) {\n const ontologyId = currentId;\n const def = await ctx.db.get(ontologyId);\n if (!def) {\n break;\n }\n const defTyped = def as unknown as OntologyDef & {\n _id: Id<\"ontologyDefinitions\">;\n };\n\n // Get latest published version\n const versions = (await ctx.db\n .query(\"ontologyVersions\")\n .withIndex(\"by_ontologyId\", (q: IndexRangeBuilder) =>\n q.eq(\"ontologyId\", ontologyId)\n )\n .collect()) as OntologyVer[];\n const published = versions\n .filter((ver: OntologyVer) => ver.status === \"published\")\n .sort(\n (a: OntologyVer, b: OntologyVer) =>\n ((b.publishedAt as number) ?? 0) - ((a.publishedAt as number) ?? 0)\n );\n\n chain.unshift({\n def: defTyped,\n version: (published[0] as OntologyVer) ?? null,\n });\n currentId = defTyped.parentOntologyId;\n }\n\n if (chain.length === 0) {\n return null;\n }\n\n // Merge layers from root (platform) to leaf (tenant)\n let merged: MergedOntology = {\n entityTypes: [],\n edgeTypes: [],\n layers: [],\n };\n\n for (const { def, version } of chain) {\n if (!version) {\n merged.layers.push(def.ontologyKey);\n continue;\n }\n const previousLayerKey = merged.layers.at(-1) ?? def.ontologyKey;\n merged = mergeOntologyLayers(\n merged,\n {\n entityTypes: version.entityTypes as EntityTypeEntry[],\n edgeTypes: version.edgeTypes as EdgeTypeEntry[],\n },\n previousLayerKey,\n def.ontologyKey\n );\n }\n\n return merged;\n },\n});\n\n// =============================================================================\n// MUTATIONS\n// =============================================================================\n\n/**\n * Create a new ontology definition.\n */\nexport const createOntologyDefinition = mutation({\n args: {\n ontologyKey: v.string(),\n name: v.string(),\n description: v.optional(v.string()),\n tenantId: v.optional(v.string()),\n tier: v.union(\n v.literal(\"platform\"),\n v.literal(\"pack\"),\n v.literal(\"tenant\")\n ),\n parentOntologyId: v.optional(v.id(\"ontologyDefinitions\")),\n },\n returns: permissiveReturn,\n handler: async (\n ctx: MutationCtx,\n args: {\n ontologyKey: string;\n name: string;\n description?: string;\n tenantId?: string;\n tier: \"platform\" | \"pack\" | \"tenant\";\n parentOntologyId?: Id<\"ontologyDefinitions\">;\n }\n ) => {\n const userId = await requireAuth(ctx);\n\n // Validate ontology key\n const keyResult = validateOntologyKey(args.ontologyKey);\n if (!keyResult.valid) {\n throw new Error(keyResult.error ?? \"Invalid ontology key\");\n }\n\n // Check uniqueness within tenant scope\n const existing = await ctx.db\n .query(\"ontologyDefinitions\")\n .withIndex(\"by_tenant_ontologyKey\", (q: IndexRangeBuilder) =>\n q.eq(\"tenantId\", args.tenantId).eq(\"ontologyKey\", keyResult.normalized)\n )\n .first();\n\n if (existing) {\n throw new Error(\n `Ontology \"${keyResult.normalized}\" already exists for tenant ${args.tenantId ?? \"(platform)\"}.`\n );\n }\n\n // Validate parent exists if specified\n if (args.parentOntologyId) {\n const parent = await ctx.db.get(args.parentOntologyId);\n if (!parent) {\n throw new Error(\"Parent ontology definition not found.\");\n }\n }\n\n const now = Date.now();\n const id = await ctx.db.insert(\"ontologyDefinitions\", {\n ontologyKey: keyResult.normalized,\n name: args.name,\n description: args.description,\n tenantId: args.tenantId,\n tier: args.tier,\n parentOntologyId: args.parentOntologyId,\n status: \"draft\",\n createdBy: userId,\n createdAt: now,\n updatedAt: now,\n });\n\n await logAudit(ctx, {\n entityType: \"ontologyDefinition\",\n entityId: id,\n changeType: \"created\",\n changedBy: userId,\n previousState: null,\n newState: {\n ontologyKey: keyResult.normalized,\n name: args.name,\n tier: args.tier,\n },\n });\n\n return { id, ontologyKey: keyResult.normalized };\n },\n});\n\n/**\n * Update an ontology definition (name, description, status).\n * Only allowed while draft or active.\n */\nexport const updateOntologyDefinition = mutation({\n args: {\n id: v.id(\"ontologyDefinitions\"),\n name: v.optional(v.string()),\n description: v.optional(v.string()),\n status: v.optional(\n v.union(v.literal(\"draft\"), v.literal(\"active\"), v.literal(\"deprecated\"))\n ),\n },\n returns: permissiveReturn,\n handler: async (\n ctx: MutationCtx,\n args: {\n id: Id<\"ontologyDefinitions\">;\n name?: string;\n description?: string;\n status?: Exclude<OntologyDefinitionStatus, \"archived\">;\n }\n ) => {\n const userId = await requireAuth(ctx);\n\n const def = (await ctx.db.get(args.id)) as OntologyDefinitionDoc | null;\n if (!def) {\n throw new Error(\"Ontology definition not found.\");\n }\n\n if (def.status === \"archived\") {\n throw new Error(\"Cannot update an archived ontology definition.\");\n }\n\n const previousState = {\n name: def.name,\n description: def.description,\n status: def.status,\n };\n\n const patch: Record<string, unknown> = { updatedAt: Date.now() };\n if (args.name !== undefined) {\n patch.name = args.name;\n }\n if (args.description !== undefined) {\n patch.description = args.description;\n }\n if (args.status !== undefined) {\n patch.status = args.status;\n }\n\n await ctx.db.patch(args.id, patch);\n\n await logAudit(ctx, {\n entityType: \"ontologyDefinition\",\n entityId: args.id,\n changeType: \"updated\",\n changedBy: userId,\n previousState,\n newState: patch,\n });\n\n return { success: true };\n },\n});\n\n/**\n * Archive an ontology definition.\n */\nexport const archiveOntologyDefinition = mutation({\n args: { id: v.id(\"ontologyDefinitions\") },\n returns: permissiveReturn,\n handler: async (\n ctx: MutationCtx,\n args: { id: Id<\"ontologyDefinitions\"> }\n ) => {\n const userId = await requireAuth(ctx);\n\n const def = (await ctx.db.get(args.id)) as OntologyDefinitionDoc | null;\n if (!def) {\n throw new Error(\"Ontology definition not found.\");\n }\n\n if (def.status === \"archived\") {\n return { success: true };\n }\n\n await ctx.db.patch(args.id, { status: \"archived\", updatedAt: Date.now() });\n\n await logAudit(ctx, {\n entityType: \"ontologyDefinition\",\n entityId: args.id,\n changeType: \"archived\",\n changedBy: userId,\n previousState: { status: def.status },\n newState: { status: \"archived\" },\n });\n\n return { success: true };\n },\n});\n\n/**\n * Create a new version snapshot for an ontology.\n */\nexport const createOntologyVersion = mutation({\n args: {\n ontologyId: v.id(\"ontologyDefinitions\"),\n version: v.string(),\n entityTypes: v.array(\n v.object({\n value: v.string(),\n label: v.string(),\n description: v.optional(v.string()),\n schema: v.optional(v.any()),\n subtypes: v.optional(\n v.array(\n v.object({\n value: v.string(),\n label: v.string(),\n description: v.optional(v.string()),\n })\n )\n ),\n })\n ),\n edgeTypes: v.array(\n v.object({\n value: v.string(),\n label: v.string(),\n description: v.optional(v.string()),\n sourceTypes: v.optional(v.array(v.string())),\n targetTypes: v.optional(v.array(v.string())),\n constraintSeverity: v.optional(\n v.union(v.literal(\"warn\"), v.literal(\"info\"))\n ),\n })\n ),\n releaseNotes: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx: MutationCtx, args: CreateOntologyVersionArgs) => {\n const userId = await requireAuth(ctx);\n\n // Validate version string\n if (!validateVersionString(args.version)) {\n throw new Error(\n `Invalid version string \"${args.version}\". Must be in X.Y.Z format.`\n );\n }\n\n // Validate parent definition exists\n const def = (await ctx.db.get(\n args.ontologyId\n )) as OntologyDefinitionDoc | null;\n if (!def) {\n throw new Error(\"Ontology definition not found.\");\n }\n\n if (def.status === \"archived\") {\n throw new Error(\"Cannot add versions to an archived ontology.\");\n }\n\n // Check version uniqueness\n const existing = await ctx.db\n .query(\"ontologyVersions\")\n .withIndex(\"by_ontologyKey_version\", (q: IndexRangeBuilder) =>\n q.eq(\"ontologyKey\", def.ontologyKey).eq(\"version\", args.version)\n )\n .first();\n\n if (existing) {\n throw new Error(\n `Version \"${args.version}\" already exists for ontology \"${def.ontologyKey}\".`\n );\n }\n\n const now = Date.now();\n const id = await ctx.db.insert(\"ontologyVersions\", {\n ontologyId: args.ontologyId,\n ontologyKey: def.ontologyKey,\n version: args.version,\n status: \"draft\",\n entityTypes: args.entityTypes,\n edgeTypes: args.edgeTypes,\n releaseNotes: args.releaseNotes,\n createdAt: now,\n });\n\n await logAudit(ctx, {\n entityType: \"ontologyVersion\",\n entityId: id,\n changeType: \"created\",\n changedBy: userId,\n previousState: null,\n newState: {\n ontologyKey: def.ontologyKey,\n version: args.version,\n entityTypeCount: args.entityTypes.length,\n edgeTypeCount: args.edgeTypes.length,\n },\n });\n\n return { id, version: args.version };\n },\n});\n\n/**\n * Update a draft version (entityTypes, edgeTypes, releaseNotes).\n * Only allowed while version is in \"draft\" status.\n */\nexport const updateDraftVersion = mutation({\n args: {\n id: v.id(\"ontologyVersions\"),\n entityTypes: v.optional(\n v.array(\n v.object({\n value: v.string(),\n label: v.string(),\n description: v.optional(v.string()),\n schema: v.optional(v.any()),\n subtypes: v.optional(\n v.array(\n v.object({\n value: v.string(),\n label: v.string(),\n description: v.optional(v.string()),\n })\n )\n ),\n })\n )\n ),\n edgeTypes: v.optional(\n v.array(\n v.object({\n value: v.string(),\n label: v.string(),\n description: v.optional(v.string()),\n sourceTypes: v.optional(v.array(v.string())),\n targetTypes: v.optional(v.array(v.string())),\n constraintSeverity: v.optional(\n v.union(v.literal(\"warn\"), v.literal(\"info\"))\n ),\n })\n )\n ),\n releaseNotes: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx: MutationCtx, args: UpdateDraftVersionArgs) => {\n const userId = await requireAuth(ctx);\n\n const ver = (await ctx.db.get(args.id)) as OntologyVersionDoc | null;\n if (!ver) {\n throw new Error(\"Ontology version not found.\");\n }\n\n if (ver.status !== \"draft\") {\n throw new Error(\n `Cannot update a ${ver.status} version. Only draft versions are editable.`\n );\n }\n\n const patch: Record<string, unknown> = {};\n if (args.entityTypes !== undefined) {\n patch.entityTypes = args.entityTypes;\n }\n if (args.edgeTypes !== undefined) {\n patch.edgeTypes = args.edgeTypes;\n }\n if (args.releaseNotes !== undefined) {\n patch.releaseNotes = args.releaseNotes;\n }\n\n await ctx.db.patch(args.id, patch);\n\n await logAudit(ctx, {\n entityType: \"ontologyVersion\",\n entityId: args.id,\n changeType: \"updated\",\n changedBy: userId,\n previousState: { status: ver.status },\n newState: patch,\n });\n\n return { success: true };\n },\n});\n\n/**\n * Publish a version — freezes it (status → \"published\").\n * If the parent definition is \"draft\", promotes it to \"active\".\n */\nexport const publishOntologyVersion = mutation({\n args: {\n id: v.id(\"ontologyVersions\"),\n ontologyId: v.optional(v.id(\"ontologyDefinitions\")),\n },\n returns: permissiveReturn,\n handler: async (ctx: MutationCtx, args: VersionStatusMutationArgs) => {\n const userId = await requireAuth(ctx);\n\n const ver = (await ctx.db.get(args.id)) as OntologyVersionDoc | null;\n if (!ver) {\n throw new Error(\"Ontology version not found.\");\n }\n\n // Verify ownership if ontologyId provided\n if (args.ontologyId && ver.ontologyId !== args.ontologyId) {\n throw new Error(\n \"Version does not belong to the specified ontology definition.\"\n );\n }\n\n if (ver.status !== \"draft\") {\n throw new Error(\n `Cannot publish a ${ver.status} version. Only draft versions can be published.`\n );\n }\n\n const now = Date.now();\n await ctx.db.patch(args.id, {\n status: \"published\",\n publishedBy: userId,\n publishedAt: now,\n });\n\n // Promote parent definition to \"active\" if still in \"draft\"\n const def = (await ctx.db.get(ver.ontologyId)) as\n | OntologyDefinitionDoc\n | null;\n if (def && def.status === \"draft\") {\n await ctx.db.patch(ver.ontologyId, {\n status: \"active\",\n updatedAt: now,\n });\n }\n\n await logAudit(ctx, {\n entityType: \"ontologyVersion\",\n entityId: args.id,\n changeType: \"published\",\n changedBy: userId,\n previousState: { status: \"draft\" },\n newState: { status: \"published\", publishedAt: now },\n });\n\n return { success: true, publishedAt: now };\n },\n});\n\n/**\n * Deprecate a published version.\n */\nexport const deprecateOntologyVersion = mutation({\n args: {\n id: v.id(\"ontologyVersions\"),\n ontologyId: v.optional(v.id(\"ontologyDefinitions\")),\n },\n returns: permissiveReturn,\n handler: async (ctx: MutationCtx, args: VersionStatusMutationArgs) => {\n const userId = await requireAuth(ctx);\n\n const ver = (await ctx.db.get(args.id)) as OntologyVersionDoc | null;\n if (!ver) {\n throw new Error(\"Ontology version not found.\");\n }\n\n // Verify ownership if ontologyId provided\n if (args.ontologyId && ver.ontologyId !== args.ontologyId) {\n throw new Error(\n \"Version does not belong to the specified ontology definition.\"\n );\n }\n\n if (ver.status === \"deprecated\") {\n return { success: true };\n }\n\n if (ver.status !== \"published\") {\n throw new Error(\n `Cannot deprecate a ${ver.status} version. Only published versions can be deprecated.`\n );\n }\n\n await ctx.db.patch(args.id, { status: \"deprecated\" });\n\n await logAudit(ctx, {\n entityType: \"ontologyVersion\",\n entityId: args.id,\n changeType: \"deprecated\",\n changedBy: userId,\n previousState: { status: \"published\" },\n newState: { status: \"deprecated\" },\n });\n\n return { success: true };\n },\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/convex.ts","../src/ontologyHelpers.ts","../src/ontologyDefinitions.ts"],"names":[],"mappings":"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","file":"ontologyDefinitions.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/**\n * Ontology Definition Pure Helpers\n *\n * Pure functions for ontology key validation, version string validation,\n * layer merging, and soft edge constraint checking.\n *\n * Separated from ontologyDefinitions.ts to enable unit testing without\n * Convex runtime dependencies.\n *\n * @module graph-primitives/ontologyHelpers\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface EntityTypeEntry {\n description?: string;\n label: string;\n schema?: unknown;\n subtypes?: Array<{ value: string; label: string; description?: string }>;\n value: string;\n}\n\nexport interface EdgeTypeEntry {\n constraintSeverity?: \"warn\" | \"info\";\n description?: string;\n label: string;\n sourceTypes?: string[];\n targetTypes?: string[];\n value: string;\n}\n\nexport interface MergedOntology {\n edgeTypes: EdgeTypeEntry[];\n entityTypes: EntityTypeEntry[];\n layers: string[]; // ontologyKeys in composition order\n}\n\nexport interface EdgeConstraintResult {\n valid: boolean;\n warnings: string[];\n}\n\n// =============================================================================\n// PURE HELPER FUNCTIONS\n// =============================================================================\n\nconst ONTOLOGY_KEY_REGEX = /^[a-z][a-z0-9-]*[a-z0-9]$/;\nconst VERSION_STRING_REGEX = /^\\d+\\.\\d+\\.\\d+$/;\n\n/**\n * Validate and normalize an ontology key.\n * Must be lowercase alphanumeric with hyphens, 2+ chars.\n */\nexport function validateOntologyKey(key: string): {\n valid: boolean;\n normalized: string;\n error?: string;\n} {\n const normalized = key.trim().toLowerCase();\n if (normalized.length < 2) {\n return {\n valid: false,\n normalized,\n error: \"Ontology key must be at least 2 characters.\",\n };\n }\n if (normalized.length > 64) {\n return {\n valid: false,\n normalized,\n error: \"Ontology key must be at most 64 characters.\",\n };\n }\n if (!ONTOLOGY_KEY_REGEX.test(normalized)) {\n return {\n valid: false,\n normalized,\n error:\n \"Ontology key must start with a letter, contain only lowercase letters, digits, and hyphens, and not end with a hyphen.\",\n };\n }\n return { valid: true, normalized };\n}\n\n/**\n * Validate a version string (basic semver-like format).\n * Accepts \"X.Y.Z\" where X, Y, Z are non-negative integers.\n */\nexport const validateVersionString = VERSION_STRING_REGEX.test.bind(\n VERSION_STRING_REGEX\n) as (version: string) => boolean;\n\n/**\n * Merge ontology layers additively. Child adds to parent; never removes.\n * Duplicate entity/edge values in child override parent entries.\n */\nexport function mergeOntologyLayers(\n parent: { entityTypes: EntityTypeEntry[]; edgeTypes: EdgeTypeEntry[] },\n child: { entityTypes: EntityTypeEntry[]; edgeTypes: EdgeTypeEntry[] },\n parentKey: string,\n childKey: string\n): MergedOntology {\n // Entity types: child overrides parent by value\n const entityMap = new Map<string, EntityTypeEntry>();\n for (const et of parent.entityTypes) {\n entityMap.set(et.value, et);\n }\n for (const et of child.entityTypes) {\n entityMap.set(et.value, et);\n }\n\n // Edge types: child overrides parent by value\n const edgeMap = new Map<string, EdgeTypeEntry>();\n for (const edge of parent.edgeTypes) {\n edgeMap.set(edge.value, edge);\n }\n for (const edge of child.edgeTypes) {\n edgeMap.set(edge.value, edge);\n }\n\n return {\n entityTypes: Array.from(entityMap.values()),\n edgeTypes: Array.from(edgeMap.values()),\n layers: [parentKey, childKey],\n };\n}\n\n/**\n * Validate an edge against soft constraints.\n * Returns warnings but never blocks (soft constraint model).\n */\nexport function validateEdgeConstraint(\n edge: { sourceType: string; targetType: string; edgeType: string },\n constraints: EdgeTypeEntry | undefined\n): EdgeConstraintResult {\n if (!constraints) {\n return { valid: true, warnings: [] };\n }\n\n const warnings: string[] = [];\n\n if (\n constraints.sourceTypes &&\n constraints.sourceTypes.length > 0 &&\n !constraints.sourceTypes.includes(edge.sourceType)\n ) {\n warnings.push(\n `Edge type \"${edge.edgeType}\" recommends source types [${constraints.sourceTypes.join(\", \")}] but got \"${edge.sourceType}\".`\n );\n }\n\n if (\n constraints.targetTypes &&\n constraints.targetTypes.length > 0 &&\n !constraints.targetTypes.includes(edge.targetType)\n ) {\n warnings.push(\n `Edge type \"${edge.edgeType}\" recommends target types [${constraints.targetTypes.join(\", \")}] but got \"${edge.targetType}\".`\n );\n }\n\n // Soft constraints: always valid, just warn\n return { valid: true, warnings };\n}\n\n/**\n * Resolve effective tier from definition tier and tenantId.\n */\nexport function resolveEffectiveTier(\n defTier: \"platform\" | \"pack\" | \"tenant\",\n tenantId?: string\n): \"platform\" | \"pack\" | \"tenant\" {\n if (!tenantId) {\n return \"platform\";\n }\n if (defTier === \"platform\") {\n return \"platform\";\n }\n return defTier;\n}\n","// biome-ignore-all lint/style/useFilenamingConvention: Public ABI filename consumed by existing import paths.\n\n/**\n * Ontology Definition Mutations & Queries\n *\n * CRUD operations for first-class ontology definition objects.\n * Follows the packDefinitions + packVersions two-table pattern from Master Control.\n *\n * Pure helper functions live in ontologyHelpers.ts for unit testing.\n *\n * @module graph-primitives/ontologyDefinitions\n */\n\nimport { getCurrentUserId } from \"@lucern/access-control/auth\";\nimport { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\nimport { v } from \"convex/values\";\nimport type { Id, MutationCtx, QueryCtx } from \"./convex\";\nimport { mutation, query } from \"./convex\";\nimport type {\n EdgeTypeEntry,\n EntityTypeEntry,\n MergedOntology,\n} from \"./ontologyHelpers\";\nimport {\n mergeOntologyLayers,\n validateOntologyKey,\n validateVersionString,\n} from \"./ontologyHelpers\";\n\n// =============================================================================\n// AUTH HELPER\n// =============================================================================\n\nasync function requireAuth(ctx: MutationCtx): Promise<string> {\n const userId = await getCurrentUserId(ctx);\n if (!userId) {\n throw new Error(\"Authentication required.\");\n }\n return userId;\n}\n\nasync function _requireAuthQuery(ctx: QueryCtx): Promise<string> {\n const userId = await getCurrentUserId(ctx);\n if (!userId) {\n throw new Error(\"Authentication required.\");\n }\n return userId;\n}\n\n// =============================================================================\n// AUDIT HELPER\n// =============================================================================\n\ntype AuditEntityType = \"ontologyDefinition\" | \"ontologyVersion\";\ntype AuditChangeType =\n | \"created\"\n | \"updated\"\n | \"archived\"\n | \"published\"\n | \"deprecated\";\ninterface IndexRangeBuilder {\n eq(fieldName: string, value: unknown): IndexRangeBuilder;\n}\ntype OntologyDefinitionStatus = \"draft\" | \"active\" | \"deprecated\" | \"archived\";\ntype OntologyVersionStatus = \"draft\" | \"published\" | \"deprecated\";\ninterface OntologyDefinitionDoc {\n _id: Id<\"ontologyDefinitions\">;\n createdAt: number;\n createdBy: string;\n description?: string;\n name: string;\n ontologyKey: string;\n parentOntologyId?: Id<\"ontologyDefinitions\">;\n status: OntologyDefinitionStatus;\n tenantId?: string;\n tier: \"platform\" | \"pack\" | \"tenant\";\n updatedAt: number;\n}\ninterface OntologyVersionDoc {\n _id: Id<\"ontologyVersions\">;\n createdAt: number;\n edgeTypes: EdgeTypeEntry[];\n entityTypes: EntityTypeEntry[];\n ontologyId: Id<\"ontologyDefinitions\">;\n ontologyKey: string;\n publishedAt?: number;\n publishedBy?: string;\n releaseNotes?: string;\n status: OntologyVersionStatus;\n version: string;\n}\ninterface CreateOntologyVersionArgs {\n edgeTypes: EdgeTypeEntry[];\n entityTypes: EntityTypeEntry[];\n ontologyId: Id<\"ontologyDefinitions\">;\n releaseNotes?: string;\n version: string;\n}\ninterface UpdateDraftVersionArgs {\n edgeTypes?: EdgeTypeEntry[];\n entityTypes?: EntityTypeEntry[];\n id: Id<\"ontologyVersions\">;\n releaseNotes?: string;\n}\ninterface VersionStatusMutationArgs {\n id: Id<\"ontologyVersions\">;\n ontologyId?: Id<\"ontologyDefinitions\">;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction rowFieldError(context: string, fieldName: string): Error {\n return new Error(`${context} has invalid or missing ${fieldName}.`);\n}\n\nfunction readRequiredString(\n row: Record<string, unknown>,\n fieldName: string,\n context: string\n): string {\n const value = row[fieldName];\n if (typeof value !== \"string\") {\n throw rowFieldError(context, fieldName);\n }\n return value;\n}\n\nfunction readOptionalString(\n row: Record<string, unknown>,\n fieldName: string,\n context: string\n): string | undefined {\n const value = row[fieldName];\n if (value === undefined) {\n return;\n }\n if (typeof value !== \"string\") {\n throw rowFieldError(context, fieldName);\n }\n return value;\n}\n\nfunction readRequiredNumber(\n row: Record<string, unknown>,\n fieldName: string,\n context: string\n): number {\n const value = row[fieldName];\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw rowFieldError(context, fieldName);\n }\n return value;\n}\n\nfunction readOptionalNumber(\n row: Record<string, unknown>,\n fieldName: string,\n context: string\n): number | undefined {\n const value = row[fieldName];\n if (value === undefined) {\n return;\n }\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw rowFieldError(context, fieldName);\n }\n return value;\n}\n\nfunction readRequiredId<TableName extends string>(\n row: Record<string, unknown>,\n fieldName: string,\n context: string\n): Id<TableName> {\n return readRequiredString(row, fieldName, context) as Id<TableName>;\n}\n\nfunction readOptionalId<TableName extends string>(\n row: Record<string, unknown>,\n fieldName: string,\n context: string\n): Id<TableName> | undefined {\n const value = readOptionalString(row, fieldName, context);\n return value as Id<TableName> | undefined;\n}\n\nfunction readStringArray(\n value: unknown,\n context: string\n): string[] | undefined {\n if (value === undefined) {\n return;\n }\n if (\n !(Array.isArray(value) && value.every((item) => typeof item === \"string\"))\n ) {\n throw new Error(`${context} must be an array of strings.`);\n }\n return value;\n}\n\nfunction readEntitySubtype(\n value: unknown,\n context: string\n): { description?: string; label: string; value: string } {\n if (!isRecord(value)) {\n throw new Error(`${context} must be an object.`);\n }\n const description = readOptionalString(value, \"description\", context);\n return {\n ...(description === undefined ? {} : { description }),\n label: readRequiredString(value, \"label\", context),\n value: readRequiredString(value, \"value\", context),\n };\n}\n\nfunction readEntityTypeEntry(value: unknown, context: string): EntityTypeEntry {\n if (!isRecord(value)) {\n throw new Error(`${context} must be an object.`);\n }\n const description = readOptionalString(value, \"description\", context);\n const subtypesValue = value.subtypes;\n let subtypes: EntityTypeEntry[\"subtypes\"];\n if (subtypesValue !== undefined) {\n if (!Array.isArray(subtypesValue)) {\n throw rowFieldError(context, \"subtypes\");\n }\n subtypes = subtypesValue.map((subtype, index) =>\n readEntitySubtype(subtype, `${context}.subtypes[${index}]`)\n );\n }\n\n return {\n ...(description === undefined ? {} : { description }),\n ...(value.schema === undefined ? {} : { schema: value.schema }),\n ...(subtypes === undefined ? {} : { subtypes }),\n label: readRequiredString(value, \"label\", context),\n value: readRequiredString(value, \"value\", context),\n };\n}\n\nfunction readEntityTypeEntries(\n value: unknown,\n context: string\n): EntityTypeEntry[] {\n if (!Array.isArray(value)) {\n throw rowFieldError(context, \"entityTypes\");\n }\n return value.map((entry, index) =>\n readEntityTypeEntry(entry, `${context}.entityTypes[${index}]`)\n );\n}\n\nfunction readEdgeTypeEntry(value: unknown, context: string): EdgeTypeEntry {\n if (!isRecord(value)) {\n throw new Error(`${context} must be an object.`);\n }\n const constraintSeverity = readOptionalString(\n value,\n \"constraintSeverity\",\n context\n );\n if (\n constraintSeverity !== undefined &&\n constraintSeverity !== \"warn\" &&\n constraintSeverity !== \"info\"\n ) {\n throw rowFieldError(context, \"constraintSeverity\");\n }\n const description = readOptionalString(value, \"description\", context);\n const sourceTypes = readStringArray(\n value.sourceTypes,\n `${context}.sourceTypes`\n );\n const targetTypes = readStringArray(\n value.targetTypes,\n `${context}.targetTypes`\n );\n\n return {\n ...(constraintSeverity === undefined ? {} : { constraintSeverity }),\n ...(description === undefined ? {} : { description }),\n ...(sourceTypes === undefined ? {} : { sourceTypes }),\n ...(targetTypes === undefined ? {} : { targetTypes }),\n label: readRequiredString(value, \"label\", context),\n value: readRequiredString(value, \"value\", context),\n };\n}\n\nfunction readEdgeTypeEntries(value: unknown, context: string): EdgeTypeEntry[] {\n if (!Array.isArray(value)) {\n throw rowFieldError(context, \"edgeTypes\");\n }\n return value.map((entry, index) =>\n readEdgeTypeEntry(entry, `${context}.edgeTypes[${index}]`)\n );\n}\n\nfunction readOntologyDefinitionStatus(\n value: unknown,\n context: string\n): OntologyDefinitionStatus {\n if (\n value !== \"draft\" &&\n value !== \"active\" &&\n value !== \"deprecated\" &&\n value !== \"archived\"\n ) {\n throw rowFieldError(context, \"status\");\n }\n return value;\n}\n\nfunction readOntologyDefinitionDoc(\n value: unknown,\n context = \"ontology definition row\"\n): OntologyDefinitionDoc | null {\n if (value === null) {\n return null;\n }\n if (!isRecord(value)) {\n throw new Error(`${context} must be an object.`);\n }\n return {\n _id: readRequiredId(value, \"_id\", context),\n createdAt: readRequiredNumber(value, \"createdAt\", context),\n createdBy: readRequiredString(value, \"createdBy\", context),\n description: readOptionalString(value, \"description\", context),\n name: readRequiredString(value, \"name\", context),\n ontologyKey: readRequiredString(value, \"ontologyKey\", context),\n parentOntologyId: readOptionalId(value, \"parentOntologyId\", context),\n status: readOntologyDefinitionStatus(value.status, context),\n tenantId: readOptionalString(value, \"tenantId\", context),\n tier: readOntologyTier(value.tier, context),\n updatedAt: readRequiredNumber(value, \"updatedAt\", context),\n };\n}\n\nfunction readOntologyTier(\n value: unknown,\n context: string\n): \"platform\" | \"pack\" | \"tenant\" {\n if (value !== \"platform\" && value !== \"pack\" && value !== \"tenant\") {\n throw rowFieldError(context, \"tier\");\n }\n return value;\n}\n\nfunction readOntologyVersionStatus(\n value: unknown,\n context: string\n): OntologyVersionStatus {\n if (value !== \"draft\" && value !== \"published\" && value !== \"deprecated\") {\n throw rowFieldError(context, \"status\");\n }\n return value;\n}\n\nfunction readOntologyVersionDoc(\n value: unknown,\n context = \"ontology version row\"\n): OntologyVersionDoc | null {\n if (value === null) {\n return null;\n }\n if (!isRecord(value)) {\n throw new Error(`${context} must be an object.`);\n }\n return {\n _id: readRequiredId(value, \"_id\", context),\n createdAt: readRequiredNumber(value, \"createdAt\", context),\n edgeTypes: readEdgeTypeEntries(value.edgeTypes, context),\n entityTypes: readEntityTypeEntries(value.entityTypes, context),\n ontologyId: readRequiredId(value, \"ontologyId\", context),\n ontologyKey: readRequiredString(value, \"ontologyKey\", context),\n publishedAt: readOptionalNumber(value, \"publishedAt\", context),\n publishedBy: readOptionalString(value, \"publishedBy\", context),\n releaseNotes: readOptionalString(value, \"releaseNotes\", context),\n status: readOntologyVersionStatus(value.status, context),\n version: readRequiredString(value, \"version\", context),\n };\n}\n\nfunction readOntologyVersionDocs(\n values: unknown[],\n context: string\n): OntologyVersionDoc[] {\n return values.map((value, index) => {\n const doc = readOntologyVersionDoc(value, `${context}[${index}]`);\n if (!doc) {\n throw new Error(`${context}[${index}] is unexpectedly null.`);\n }\n return doc;\n });\n}\n\nasync function logAudit(\n ctx: MutationCtx,\n args: {\n entityType: AuditEntityType;\n entityId: string;\n changeType: AuditChangeType;\n changedBy: string;\n previousState: unknown;\n newState: unknown;\n }\n) {\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: args.entityType,\n entityId: args.entityId,\n changeType: args.changeType,\n changedAt: Date.now(),\n changedBy: args.changedBy,\n isAgent: false,\n previousState: args.previousState ?? null,\n newState: args.newState ?? null,\n });\n}\n\n// =============================================================================\n// QUERIES\n// =============================================================================\n\n/**\n * Get an ontology definition by ID.\n */\nexport const getOntologyDefinition = query({\n args: { id: v.id(\"ontologyDefinitions\") },\n returns: permissiveReturn,\n handler: async (ctx: QueryCtx, args: { id: Id<\"ontologyDefinitions\"> }) =>\n await ctx.db.get(args.id),\n});\n\n/**\n * Get an ontology definition by ontologyKey (optionally scoped by tenant).\n */\nexport const getOntologyDefinitionByKey = query({\n args: {\n ontologyKey: v.string(),\n tenantId: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (\n ctx: QueryCtx,\n args: { ontologyKey: string; tenantId?: string }\n ) => {\n if (args.tenantId) {\n return await ctx.db\n .query(\"ontologyDefinitions\")\n .withIndex(\"by_tenant_ontologyKey\", (q: IndexRangeBuilder) =>\n q.eq(\"tenantId\", args.tenantId).eq(\"ontologyKey\", args.ontologyKey)\n )\n .first();\n }\n // Platform default (tenantId = undefined)\n return await ctx.db\n .query(\"ontologyDefinitions\")\n .withIndex(\"by_tenant_ontologyKey\", (q: IndexRangeBuilder) =>\n q.eq(\"tenantId\", undefined).eq(\"ontologyKey\", args.ontologyKey)\n )\n .first();\n },\n});\n\n/**\n * List ontology definitions with optional filters.\n */\nexport const listOntologyDefinitions = query({\n args: {\n tenantId: v.optional(v.string()),\n tier: v.optional(\n v.union(v.literal(\"platform\"), v.literal(\"pack\"), v.literal(\"tenant\"))\n ),\n status: v.optional(\n v.union(\n v.literal(\"draft\"),\n v.literal(\"active\"),\n v.literal(\"deprecated\"),\n v.literal(\"archived\")\n )\n ),\n },\n returns: permissiveReturn,\n handler: async (\n ctx: QueryCtx,\n args: {\n tenantId?: string;\n tier?: \"platform\" | \"pack\" | \"tenant\";\n status?: OntologyDefinitionStatus;\n }\n ) => {\n if (args.tenantId && args.status) {\n const status = args.status;\n return await ctx.db\n .query(\"ontologyDefinitions\")\n .withIndex(\"by_tenant_status\", (q: IndexRangeBuilder) =>\n q.eq(\"tenantId\", args.tenantId).eq(\"status\", status)\n )\n .collect();\n }\n if (args.status) {\n const status = args.status;\n return await ctx.db\n .query(\"ontologyDefinitions\")\n .withIndex(\"by_status\", (q: IndexRangeBuilder) =>\n q.eq(\"status\", status)\n )\n .collect();\n }\n if (args.tier) {\n const tier = args.tier;\n return await ctx.db\n .query(\"ontologyDefinitions\")\n .withIndex(\"by_tier\", (q: IndexRangeBuilder) => q.eq(\"tier\", tier))\n .collect();\n }\n return await ctx.db.query(\"ontologyDefinitions\").collect();\n },\n});\n\n/**\n * Get a specific version by ontologyId + version string.\n */\nexport const getOntologyVersion = query({\n args: {\n ontologyKey: v.string(),\n version: v.string(),\n },\n returns: permissiveReturn,\n handler: async (\n ctx: QueryCtx,\n args: { ontologyKey: string; version: string }\n ) =>\n await ctx.db\n .query(\"ontologyVersions\")\n .withIndex(\"by_ontologyKey_version\", (q: IndexRangeBuilder) =>\n q.eq(\"ontologyKey\", args.ontologyKey).eq(\"version\", args.version)\n )\n .first(),\n});\n\n/**\n * List versions for an ontology, optionally filtered by status.\n */\nexport const listOntologyVersions = query({\n args: {\n ontologyId: v.id(\"ontologyDefinitions\"),\n status: v.optional(\n v.union(\n v.literal(\"draft\"),\n v.literal(\"published\"),\n v.literal(\"deprecated\")\n )\n ),\n },\n returns: permissiveReturn,\n handler: async (\n ctx: QueryCtx,\n args: {\n ontologyId: Id<\"ontologyDefinitions\">;\n status?: OntologyVersionStatus;\n }\n ) => {\n const all = readOntologyVersionDocs(\n await ctx.db\n .query(\"ontologyVersions\")\n .withIndex(\"by_ontologyId\", (q: IndexRangeBuilder) =>\n q.eq(\"ontologyId\", args.ontologyId)\n )\n .collect(),\n \"listOntologyVersions.ontologyVersions\"\n );\n\n if (args.status) {\n return all.filter(\n (versionDoc: OntologyVersionDoc) => versionDoc.status === args.status\n );\n }\n return all;\n },\n});\n\n/**\n * Get the latest published version for an ontology.\n */\nexport const getPublishedVersion = query({\n args: { ontologyId: v.id(\"ontologyDefinitions\") },\n returns: permissiveReturn,\n handler: async (\n ctx: QueryCtx,\n args: { ontologyId: Id<\"ontologyDefinitions\"> }\n ) => {\n const published = readOntologyVersionDocs(\n await ctx.db\n .query(\"ontologyVersions\")\n .withIndex(\"by_ontologyId\", (q: IndexRangeBuilder) =>\n q.eq(\"ontologyId\", args.ontologyId)\n )\n .collect(),\n \"getPublishedVersion.ontologyVersions\"\n );\n\n const publishedOnly = published.filter(\n (versionDoc: OntologyVersionDoc) => versionDoc.status === \"published\"\n );\n if (publishedOnly.length === 0) {\n return null;\n }\n\n // Return most recently published\n publishedOnly.sort(\n (a: OntologyVersionDoc, b: OntologyVersionDoc) =>\n (b.publishedAt ?? 0) - (a.publishedAt ?? 0)\n );\n return publishedOnly[0];\n },\n});\n\n/**\n * Resolve the effective ontology by composing parent chain.\n * Walks parentOntologyId chain (max depth 3) and merges additively.\n */\nexport const resolveEffectiveOntology = query({\n args: { ontologyId: v.id(\"ontologyDefinitions\") },\n returns: permissiveReturn,\n handler: async (\n ctx: QueryCtx,\n args: { ontologyId: Id<\"ontologyDefinitions\"> }\n ) => {\n const MAX_DEPTH = 3;\n const chain: Array<{\n def: OntologyDefinitionDoc;\n version: OntologyVersionDoc | null;\n }> = [];\n\n // Walk parent chain\n let currentId: Id<\"ontologyDefinitions\"> | undefined = args.ontologyId;\n for (let depth = 0; depth < MAX_DEPTH && currentId; depth++) {\n const ontologyId = currentId;\n const def = readOntologyDefinitionDoc(\n await ctx.db.get(ontologyId),\n \"resolveEffectiveOntology.definition\"\n );\n if (!def) {\n break;\n }\n\n // Get latest published version\n const versions = readOntologyVersionDocs(\n await ctx.db\n .query(\"ontologyVersions\")\n .withIndex(\"by_ontologyId\", (q: IndexRangeBuilder) =>\n q.eq(\"ontologyId\", ontologyId)\n )\n .collect(),\n \"resolveEffectiveOntology.ontologyVersions\"\n );\n const published = versions\n .filter((ver: OntologyVersionDoc) => ver.status === \"published\")\n .sort(\n (a: OntologyVersionDoc, b: OntologyVersionDoc) =>\n (b.publishedAt ?? 0) - (a.publishedAt ?? 0)\n );\n\n chain.unshift({\n def,\n version: published[0] ?? null,\n });\n currentId = def.parentOntologyId;\n }\n\n if (chain.length === 0) {\n return null;\n }\n\n // Merge layers from root (platform) to leaf (tenant)\n let merged: MergedOntology = {\n entityTypes: [],\n edgeTypes: [],\n layers: [],\n };\n\n for (const { def, version } of chain) {\n if (!version) {\n merged.layers.push(def.ontologyKey);\n continue;\n }\n const previousLayerKey = merged.layers.at(-1) ?? def.ontologyKey;\n merged = mergeOntologyLayers(\n merged,\n {\n entityTypes: version.entityTypes,\n edgeTypes: version.edgeTypes,\n },\n previousLayerKey,\n def.ontologyKey\n );\n }\n\n return merged;\n },\n});\n\n// =============================================================================\n// MUTATIONS\n// =============================================================================\n\n/**\n * Create a new ontology definition.\n */\nexport const createOntologyDefinition = mutation({\n args: {\n ontologyKey: v.string(),\n name: v.string(),\n description: v.optional(v.string()),\n tenantId: v.optional(v.string()),\n tier: v.union(\n v.literal(\"platform\"),\n v.literal(\"pack\"),\n v.literal(\"tenant\")\n ),\n parentOntologyId: v.optional(v.id(\"ontologyDefinitions\")),\n },\n returns: permissiveReturn,\n handler: async (\n ctx: MutationCtx,\n args: {\n ontologyKey: string;\n name: string;\n description?: string;\n tenantId?: string;\n tier: \"platform\" | \"pack\" | \"tenant\";\n parentOntologyId?: Id<\"ontologyDefinitions\">;\n }\n ) => {\n const userId = await requireAuth(ctx);\n\n // Validate ontology key\n const keyResult = validateOntologyKey(args.ontologyKey);\n if (!keyResult.valid) {\n throw new Error(keyResult.error ?? \"Invalid ontology key\");\n }\n\n // Check uniqueness within tenant scope\n const existing = await ctx.db\n .query(\"ontologyDefinitions\")\n .withIndex(\"by_tenant_ontologyKey\", (q: IndexRangeBuilder) =>\n q.eq(\"tenantId\", args.tenantId).eq(\"ontologyKey\", keyResult.normalized)\n )\n .first();\n\n if (existing) {\n throw new Error(\n `Ontology \"${keyResult.normalized}\" already exists for tenant ${args.tenantId ?? \"(platform)\"}.`\n );\n }\n\n // Validate parent exists if specified\n if (args.parentOntologyId) {\n const parent = await ctx.db.get(args.parentOntologyId);\n if (!parent) {\n throw new Error(\"Parent ontology definition not found.\");\n }\n }\n\n const now = Date.now();\n const id = await ctx.db.insert(\"ontologyDefinitions\", {\n ontologyKey: keyResult.normalized,\n name: args.name,\n description: args.description,\n tenantId: args.tenantId,\n tier: args.tier,\n parentOntologyId: args.parentOntologyId,\n status: \"draft\",\n createdBy: userId,\n createdAt: now,\n updatedAt: now,\n });\n\n await logAudit(ctx, {\n entityType: \"ontologyDefinition\",\n entityId: id,\n changeType: \"created\",\n changedBy: userId,\n previousState: null,\n newState: {\n ontologyKey: keyResult.normalized,\n name: args.name,\n tier: args.tier,\n },\n });\n\n return { id, ontologyKey: keyResult.normalized };\n },\n});\n\n/**\n * Update an ontology definition (name, description, status).\n * Only allowed while draft or active.\n */\nexport const updateOntologyDefinition = mutation({\n args: {\n id: v.id(\"ontologyDefinitions\"),\n name: v.optional(v.string()),\n description: v.optional(v.string()),\n status: v.optional(\n v.union(v.literal(\"draft\"), v.literal(\"active\"), v.literal(\"deprecated\"))\n ),\n },\n returns: permissiveReturn,\n handler: async (\n ctx: MutationCtx,\n args: {\n id: Id<\"ontologyDefinitions\">;\n name?: string;\n description?: string;\n status?: Exclude<OntologyDefinitionStatus, \"archived\">;\n }\n ) => {\n const userId = await requireAuth(ctx);\n\n const def = readOntologyDefinitionDoc(\n await ctx.db.get(args.id),\n \"updateOntologyDefinition.definition\"\n );\n if (!def) {\n throw new Error(\"Ontology definition not found.\");\n }\n\n if (def.status === \"archived\") {\n throw new Error(\"Cannot update an archived ontology definition.\");\n }\n\n const previousState = {\n name: def.name,\n description: def.description,\n status: def.status,\n };\n\n const patch: Record<string, unknown> = { updatedAt: Date.now() };\n if (args.name !== undefined) {\n patch.name = args.name;\n }\n if (args.description !== undefined) {\n patch.description = args.description;\n }\n if (args.status !== undefined) {\n patch.status = args.status;\n }\n\n await ctx.db.patch(args.id, patch);\n\n await logAudit(ctx, {\n entityType: \"ontologyDefinition\",\n entityId: args.id,\n changeType: \"updated\",\n changedBy: userId,\n previousState,\n newState: patch,\n });\n\n return { success: true };\n },\n});\n\n/**\n * Archive an ontology definition.\n */\nexport const archiveOntologyDefinition = mutation({\n args: { id: v.id(\"ontologyDefinitions\") },\n returns: permissiveReturn,\n handler: async (\n ctx: MutationCtx,\n args: { id: Id<\"ontologyDefinitions\"> }\n ) => {\n const userId = await requireAuth(ctx);\n\n const def = readOntologyDefinitionDoc(\n await ctx.db.get(args.id),\n \"archiveOntologyDefinition.definition\"\n );\n if (!def) {\n throw new Error(\"Ontology definition not found.\");\n }\n\n if (def.status === \"archived\") {\n return { success: true };\n }\n\n await ctx.db.patch(args.id, { status: \"archived\", updatedAt: Date.now() });\n\n await logAudit(ctx, {\n entityType: \"ontologyDefinition\",\n entityId: args.id,\n changeType: \"archived\",\n changedBy: userId,\n previousState: { status: def.status },\n newState: { status: \"archived\" },\n });\n\n return { success: true };\n },\n});\n\n/**\n * Create a new version snapshot for an ontology.\n */\nexport const createOntologyVersion = mutation({\n args: {\n ontologyId: v.id(\"ontologyDefinitions\"),\n version: v.string(),\n entityTypes: v.array(\n v.object({\n value: v.string(),\n label: v.string(),\n description: v.optional(v.string()),\n schema: v.optional(v.any()),\n subtypes: v.optional(\n v.array(\n v.object({\n value: v.string(),\n label: v.string(),\n description: v.optional(v.string()),\n })\n )\n ),\n })\n ),\n edgeTypes: v.array(\n v.object({\n value: v.string(),\n label: v.string(),\n description: v.optional(v.string()),\n sourceTypes: v.optional(v.array(v.string())),\n targetTypes: v.optional(v.array(v.string())),\n constraintSeverity: v.optional(\n v.union(v.literal(\"warn\"), v.literal(\"info\"))\n ),\n })\n ),\n releaseNotes: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx: MutationCtx, args: CreateOntologyVersionArgs) => {\n const userId = await requireAuth(ctx);\n\n // Validate version string\n if (!validateVersionString(args.version)) {\n throw new Error(\n `Invalid version string \"${args.version}\". Must be in X.Y.Z format.`\n );\n }\n\n // Validate parent definition exists\n const def = readOntologyDefinitionDoc(\n await ctx.db.get(args.ontologyId),\n \"createOntologyVersion.definition\"\n );\n if (!def) {\n throw new Error(\"Ontology definition not found.\");\n }\n\n if (def.status === \"archived\") {\n throw new Error(\"Cannot add versions to an archived ontology.\");\n }\n\n // Check version uniqueness\n const existing = await ctx.db\n .query(\"ontologyVersions\")\n .withIndex(\"by_ontologyKey_version\", (q: IndexRangeBuilder) =>\n q.eq(\"ontologyKey\", def.ontologyKey).eq(\"version\", args.version)\n )\n .first();\n\n if (existing) {\n throw new Error(\n `Version \"${args.version}\" already exists for ontology \"${def.ontologyKey}\".`\n );\n }\n\n const now = Date.now();\n const id = await ctx.db.insert(\"ontologyVersions\", {\n ontologyId: args.ontologyId,\n ontologyKey: def.ontologyKey,\n version: args.version,\n status: \"draft\",\n entityTypes: args.entityTypes,\n edgeTypes: args.edgeTypes,\n releaseNotes: args.releaseNotes,\n createdAt: now,\n });\n\n await logAudit(ctx, {\n entityType: \"ontologyVersion\",\n entityId: id,\n changeType: \"created\",\n changedBy: userId,\n previousState: null,\n newState: {\n ontologyKey: def.ontologyKey,\n version: args.version,\n entityTypeCount: args.entityTypes.length,\n edgeTypeCount: args.edgeTypes.length,\n },\n });\n\n return { id, version: args.version };\n },\n});\n\n/**\n * Update a draft version (entityTypes, edgeTypes, releaseNotes).\n * Only allowed while version is in \"draft\" status.\n */\nexport const updateDraftVersion = mutation({\n args: {\n id: v.id(\"ontologyVersions\"),\n entityTypes: v.optional(\n v.array(\n v.object({\n value: v.string(),\n label: v.string(),\n description: v.optional(v.string()),\n schema: v.optional(v.any()),\n subtypes: v.optional(\n v.array(\n v.object({\n value: v.string(),\n label: v.string(),\n description: v.optional(v.string()),\n })\n )\n ),\n })\n )\n ),\n edgeTypes: v.optional(\n v.array(\n v.object({\n value: v.string(),\n label: v.string(),\n description: v.optional(v.string()),\n sourceTypes: v.optional(v.array(v.string())),\n targetTypes: v.optional(v.array(v.string())),\n constraintSeverity: v.optional(\n v.union(v.literal(\"warn\"), v.literal(\"info\"))\n ),\n })\n )\n ),\n releaseNotes: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx: MutationCtx, args: UpdateDraftVersionArgs) => {\n const userId = await requireAuth(ctx);\n\n const ver = readOntologyVersionDoc(\n await ctx.db.get(args.id),\n \"updateDraftVersion.version\"\n );\n if (!ver) {\n throw new Error(\"Ontology version not found.\");\n }\n\n if (ver.status !== \"draft\") {\n throw new Error(\n `Cannot update a ${ver.status} version. Only draft versions are editable.`\n );\n }\n\n const patch: Record<string, unknown> = {};\n if (args.entityTypes !== undefined) {\n patch.entityTypes = args.entityTypes;\n }\n if (args.edgeTypes !== undefined) {\n patch.edgeTypes = args.edgeTypes;\n }\n if (args.releaseNotes !== undefined) {\n patch.releaseNotes = args.releaseNotes;\n }\n\n await ctx.db.patch(args.id, patch);\n\n await logAudit(ctx, {\n entityType: \"ontologyVersion\",\n entityId: args.id,\n changeType: \"updated\",\n changedBy: userId,\n previousState: { status: ver.status },\n newState: patch,\n });\n\n return { success: true };\n },\n});\n\n/**\n * Publish a version — freezes it (status → \"published\").\n * If the parent definition is \"draft\", promotes it to \"active\".\n */\nexport const publishOntologyVersion = mutation({\n args: {\n id: v.id(\"ontologyVersions\"),\n ontologyId: v.optional(v.id(\"ontologyDefinitions\")),\n },\n returns: permissiveReturn,\n handler: async (ctx: MutationCtx, args: VersionStatusMutationArgs) => {\n const userId = await requireAuth(ctx);\n\n const ver = readOntologyVersionDoc(\n await ctx.db.get(args.id),\n \"publishOntologyVersion.version\"\n );\n if (!ver) {\n throw new Error(\"Ontology version not found.\");\n }\n\n // Verify ownership if ontologyId provided\n if (args.ontologyId && ver.ontologyId !== args.ontologyId) {\n throw new Error(\n \"Version does not belong to the specified ontology definition.\"\n );\n }\n\n if (ver.status !== \"draft\") {\n throw new Error(\n `Cannot publish a ${ver.status} version. Only draft versions can be published.`\n );\n }\n\n const now = Date.now();\n await ctx.db.patch(args.id, {\n status: \"published\",\n publishedBy: userId,\n publishedAt: now,\n });\n\n // Promote parent definition to \"active\" if still in \"draft\"\n const def = readOntologyDefinitionDoc(\n await ctx.db.get(ver.ontologyId),\n \"publishOntologyVersion.definition\"\n );\n if (def && def.status === \"draft\") {\n await ctx.db.patch(ver.ontologyId, {\n status: \"active\",\n updatedAt: now,\n });\n }\n\n await logAudit(ctx, {\n entityType: \"ontologyVersion\",\n entityId: args.id,\n changeType: \"published\",\n changedBy: userId,\n previousState: { status: \"draft\" },\n newState: { status: \"published\", publishedAt: now },\n });\n\n return { success: true, publishedAt: now };\n },\n});\n\n/**\n * Deprecate a published version.\n */\nexport const deprecateOntologyVersion = mutation({\n args: {\n id: v.id(\"ontologyVersions\"),\n ontologyId: v.optional(v.id(\"ontologyDefinitions\")),\n },\n returns: permissiveReturn,\n handler: async (ctx: MutationCtx, args: VersionStatusMutationArgs) => {\n const userId = await requireAuth(ctx);\n\n const ver = readOntologyVersionDoc(\n await ctx.db.get(args.id),\n \"deprecateOntologyVersion.version\"\n );\n if (!ver) {\n throw new Error(\"Ontology version not found.\");\n }\n\n // Verify ownership if ontologyId provided\n if (args.ontologyId && ver.ontologyId !== args.ontologyId) {\n throw new Error(\n \"Version does not belong to the specified ontology definition.\"\n );\n }\n\n if (ver.status === \"deprecated\") {\n return { success: true };\n }\n\n if (ver.status !== \"published\") {\n throw new Error(\n `Cannot deprecate a ${ver.status} version. Only published versions can be deprecated.`\n );\n }\n\n await ctx.db.patch(args.id, { status: \"deprecated\" });\n\n await logAudit(ctx, {\n entityType: \"ontologyVersion\",\n entityId: args.id,\n changeType: \"deprecated\",\n changedBy: userId,\n previousState: { status: \"published\" },\n newState: { status: \"deprecated\" },\n });\n\n return { success: true };\n },\n});\n"]}
|
|
@@ -9,34 +9,34 @@
|
|
|
9
9
|
*
|
|
10
10
|
* @module graph-primitives/ontologyHelpers
|
|
11
11
|
*/
|
|
12
|
-
|
|
13
|
-
value: string;
|
|
14
|
-
label: string;
|
|
12
|
+
interface EntityTypeEntry {
|
|
15
13
|
description?: string;
|
|
14
|
+
label: string;
|
|
16
15
|
schema?: unknown;
|
|
17
16
|
subtypes?: Array<{
|
|
18
17
|
value: string;
|
|
19
18
|
label: string;
|
|
20
19
|
description?: string;
|
|
21
20
|
}>;
|
|
22
|
-
};
|
|
23
|
-
type EdgeTypeEntry = {
|
|
24
21
|
value: string;
|
|
25
|
-
|
|
22
|
+
}
|
|
23
|
+
interface EdgeTypeEntry {
|
|
24
|
+
constraintSeverity?: "warn" | "info";
|
|
26
25
|
description?: string;
|
|
26
|
+
label: string;
|
|
27
27
|
sourceTypes?: string[];
|
|
28
28
|
targetTypes?: string[];
|
|
29
|
-
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
entityTypes: EntityTypeEntry[];
|
|
29
|
+
value: string;
|
|
30
|
+
}
|
|
31
|
+
interface MergedOntology {
|
|
33
32
|
edgeTypes: EdgeTypeEntry[];
|
|
33
|
+
entityTypes: EntityTypeEntry[];
|
|
34
34
|
layers: string[];
|
|
35
|
-
}
|
|
36
|
-
|
|
35
|
+
}
|
|
36
|
+
interface EdgeConstraintResult {
|
|
37
37
|
valid: boolean;
|
|
38
38
|
warnings: string[];
|
|
39
|
-
}
|
|
39
|
+
}
|
|
40
40
|
/**
|
|
41
41
|
* Validate and normalize an ontology key.
|
|
42
42
|
* Must be lowercase alphanumeric with hyphens, 2+ chars.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ontologyHelpers.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"sources":["../src/ontologyHelpers.ts"],"names":[],"mappings":"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","file":"ontologyHelpers.js","sourcesContent":["// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\n/**\n * Ontology Definition Pure Helpers\n *\n * Pure functions for ontology key validation, version string validation,\n * layer merging, and soft edge constraint checking.\n *\n * Separated from ontologyDefinitions.ts to enable unit testing without\n * Convex runtime dependencies.\n *\n * @module graph-primitives/ontologyHelpers\n */\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface EntityTypeEntry {\n description?: string;\n label: string;\n schema?: unknown;\n subtypes?: Array<{ value: string; label: string; description?: string }>;\n value: string;\n}\n\nexport interface EdgeTypeEntry {\n constraintSeverity?: \"warn\" | \"info\";\n description?: string;\n label: string;\n sourceTypes?: string[];\n targetTypes?: string[];\n value: string;\n}\n\nexport interface MergedOntology {\n edgeTypes: EdgeTypeEntry[];\n entityTypes: EntityTypeEntry[];\n layers: string[]; // ontologyKeys in composition order\n}\n\nexport interface EdgeConstraintResult {\n valid: boolean;\n warnings: string[];\n}\n\n// =============================================================================\n// PURE HELPER FUNCTIONS\n// =============================================================================\n\nconst ONTOLOGY_KEY_REGEX = /^[a-z][a-z0-9-]*[a-z0-9]$/;\nconst VERSION_STRING_REGEX = /^\\d+\\.\\d+\\.\\d+$/;\n\n/**\n * Validate and normalize an ontology key.\n * Must be lowercase alphanumeric with hyphens, 2+ chars.\n */\nexport function validateOntologyKey(key: string): {\n valid: boolean;\n normalized: string;\n error?: string;\n} {\n const normalized = key.trim().toLowerCase();\n if (normalized.length < 2) {\n return {\n valid: false,\n normalized,\n error: \"Ontology key must be at least 2 characters.\",\n };\n }\n if (normalized.length > 64) {\n return {\n valid: false,\n normalized,\n error: \"Ontology key must be at most 64 characters.\",\n };\n }\n if (!ONTOLOGY_KEY_REGEX.test(normalized)) {\n return {\n valid: false,\n normalized,\n error:\n \"Ontology key must start with a letter, contain only lowercase letters, digits, and hyphens, and not end with a hyphen.\",\n };\n }\n return { valid: true, normalized };\n}\n\n/**\n * Validate a version string (basic semver-like format).\n * Accepts \"X.Y.Z\" where X, Y, Z are non-negative integers.\n */\nexport const validateVersionString = VERSION_STRING_REGEX.test.bind(\n VERSION_STRING_REGEX\n) as (version: string) => boolean;\n\n/**\n * Merge ontology layers additively. Child adds to parent; never removes.\n * Duplicate entity/edge values in child override parent entries.\n */\nexport function mergeOntologyLayers(\n parent: { entityTypes: EntityTypeEntry[]; edgeTypes: EdgeTypeEntry[] },\n child: { entityTypes: EntityTypeEntry[]; edgeTypes: EdgeTypeEntry[] },\n parentKey: string,\n childKey: string\n): MergedOntology {\n // Entity types: child overrides parent by value\n const entityMap = new Map<string, EntityTypeEntry>();\n for (const et of parent.entityTypes) {\n entityMap.set(et.value, et);\n }\n for (const et of child.entityTypes) {\n entityMap.set(et.value, et);\n }\n\n // Edge types: child overrides parent by value\n const edgeMap = new Map<string, EdgeTypeEntry>();\n for (const edge of parent.edgeTypes) {\n edgeMap.set(edge.value, edge);\n }\n for (const edge of child.edgeTypes) {\n edgeMap.set(edge.value, edge);\n }\n\n return {\n entityTypes: Array.from(entityMap.values()),\n edgeTypes: Array.from(edgeMap.values()),\n layers: [parentKey, childKey],\n };\n}\n\n/**\n * Validate an edge against soft constraints.\n * Returns warnings but never blocks (soft constraint model).\n */\nexport function validateEdgeConstraint(\n edge: { sourceType: string; targetType: string; edgeType: string },\n constraints: EdgeTypeEntry | undefined\n): EdgeConstraintResult {\n if (!constraints) {\n return { valid: true, warnings: [] };\n }\n\n const warnings: string[] = [];\n\n if (\n constraints.sourceTypes &&\n constraints.sourceTypes.length > 0 &&\n !constraints.sourceTypes.includes(edge.sourceType)\n ) {\n warnings.push(\n `Edge type \"${edge.edgeType}\" recommends source types [${constraints.sourceTypes.join(\", \")}] but got \"${edge.sourceType}\".`\n );\n }\n\n if (\n constraints.targetTypes &&\n constraints.targetTypes.length > 0 &&\n !constraints.targetTypes.includes(edge.targetType)\n ) {\n warnings.push(\n `Edge type \"${edge.edgeType}\" recommends target types [${constraints.targetTypes.join(\", \")}] but got \"${edge.targetType}\".`\n );\n }\n\n // Soft constraints: always valid, just warn\n return { valid: true, warnings };\n}\n\n/**\n * Resolve effective tier from definition tier and tenantId.\n */\nexport function resolveEffectiveTier(\n defTier: \"platform\" | \"pack\" | \"tenant\",\n tenantId?: string\n): \"platform\" | \"pack\" | \"tenant\" {\n if (!tenantId) {\n return \"platform\";\n }\n if (defTier === \"platform\") {\n return \"platform\";\n }\n return defTier;\n}\n"]}
|
|
@@ -15,12 +15,12 @@
|
|
|
15
15
|
* Seed the ontology registry with platform-default entity types.
|
|
16
16
|
* Idempotent — safe to call multiple times.
|
|
17
17
|
*/
|
|
18
|
-
declare const seedOntologyRegistry:
|
|
18
|
+
declare const seedOntologyRegistry: unknown;
|
|
19
19
|
/**
|
|
20
20
|
* Register a new entity type for a tenant.
|
|
21
21
|
* Creates a schemaEnumConfig entry with tier='tenant'.
|
|
22
22
|
*/
|
|
23
|
-
declare const registerEntityType:
|
|
23
|
+
declare const registerEntityType: unknown;
|
|
24
24
|
|
|
25
25
|
declare const ontologyRegistry_registerEntityType: typeof registerEntityType;
|
|
26
26
|
declare const ontologyRegistry_seedOntologyRegistry: typeof seedOntologyRegistry;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { r as registerEntityType, s as seedOntologyRegistry } from './ontologyRegistry-
|
|
1
|
+
export { r as registerEntityType, s as seedOntologyRegistry } from './ontologyRegistry-CljS-ENv.js';
|
package/dist/ontologyRegistry.js
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
|
-
import { v } from 'convex/values';
|
|
2
1
|
import { getCurrentUserId } from '@lucern/access-control/auth';
|
|
3
2
|
import { permissiveReturn } from '@lucern/contracts/schema-helpers/validators';
|
|
3
|
+
import { v } from 'convex/values';
|
|
4
|
+
import { unsafeConvexAnyApi } from '@lucern/contracts/convex/unsafeAnyApi';
|
|
4
5
|
import { componentsGeneric, internalMutationGeneric, mutationGeneric } from 'convex/server';
|
|
5
6
|
|
|
6
7
|
// src/ontologyRegistry.ts
|
|
8
|
+
unsafeConvexAnyApi(
|
|
9
|
+
"graph-primitives top-level module bundle lacks a committed Convex _generated/api surface"
|
|
10
|
+
);
|
|
7
11
|
componentsGeneric();
|
|
8
12
|
var internalMutation = internalMutationGeneric;
|
|
9
13
|
var mutation = mutationGeneric;
|
|
@@ -84,6 +88,26 @@ var PLATFORM_ENTITY_SUBTYPES = [
|
|
|
84
88
|
},
|
|
85
89
|
{ value: "investor/angel", label: "Angel Investor", parentType: "investor" }
|
|
86
90
|
];
|
|
91
|
+
function isRecord(value) {
|
|
92
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
93
|
+
}
|
|
94
|
+
function readEnumConfigRow(value, context) {
|
|
95
|
+
if (!isRecord(value)) {
|
|
96
|
+
throw new Error(`${context} must be an object.`);
|
|
97
|
+
}
|
|
98
|
+
if (typeof value._id !== "string" || typeof value.value !== "string") {
|
|
99
|
+
throw new Error(`${context} has invalid or missing _id/value.`);
|
|
100
|
+
}
|
|
101
|
+
return {
|
|
102
|
+
_id: value._id,
|
|
103
|
+
value: value.value
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
function readEnumConfigRows(values) {
|
|
107
|
+
return values.map(
|
|
108
|
+
(value, index) => readEnumConfigRow(value, `schemaEnumConfig[${index}]`)
|
|
109
|
+
);
|
|
110
|
+
}
|
|
87
111
|
var PLATFORM_ENTITY_EDGE_TYPES = [
|
|
88
112
|
{
|
|
89
113
|
value: "works_at",
|
|
@@ -248,11 +272,15 @@ var registerEntityType = mutation({
|
|
|
248
272
|
if (!userId) {
|
|
249
273
|
throw new Error("Authentication required to register entity types.");
|
|
250
274
|
}
|
|
251
|
-
const existing =
|
|
252
|
-
"
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
275
|
+
const existing = readEnumConfigRows(
|
|
276
|
+
await ctx.db.query("schemaEnumConfig").withIndex(
|
|
277
|
+
"by_tenant_category",
|
|
278
|
+
(q) => q.eq("tenantId", args.tenantId).eq("category", "entity_type")
|
|
279
|
+
).collect()
|
|
280
|
+
);
|
|
281
|
+
const duplicate = existing.find(
|
|
282
|
+
(e) => e.value === args.value
|
|
283
|
+
);
|
|
256
284
|
if (duplicate) {
|
|
257
285
|
throw new Error(
|
|
258
286
|
`Entity type "${args.value}" already registered for tenant ${args.tenantId}`
|