@lucern/graph-primitives 1.0.36 → 1.0.38
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.js +0 -2
- package/dist/beliefEvidenceLinks.js +2 -3
- package/dist/beliefEvidenceLinks.operational.js +2 -3
- package/dist/beliefLifecycle.js +0 -2
- package/dist/confidencePropagationDispatch.js +0 -2
- package/dist/contradictions.js +0 -2
- package/dist/convex.js +0 -2
- package/dist/debug.js +0 -2
- package/dist/edgeValidation.js +0 -2
- package/dist/edges/contains.js +0 -2
- package/dist/edges/contradicts.js +0 -2
- package/dist/edges/depends-on.js +0 -2
- package/dist/edges/derived-from.js +0 -2
- package/dist/edges/elaborates.js +0 -2
- package/dist/edges/index.js +0 -2
- package/dist/edges/informs.js +0 -2
- package/dist/edges/propagation-types.js +0 -2
- package/dist/edges/refutes.js +0 -2
- package/dist/edges/supports.js +0 -2
- package/dist/edges/tests.js +0 -2
- package/dist/edges/utils.js +0 -2
- package/dist/embeddingTrigger.js +0 -2
- package/dist/entityBridge.js +0 -2
- package/dist/entityCanonicalMatch.js +0 -2
- package/dist/entityLifecycle.js +2 -3
- package/dist/entityValidation.js +0 -2
- package/dist/epistemicAnswers.js +2 -3
- package/dist/epistemicBeliefs.admin.js +0 -2
- package/dist/epistemicBeliefs.backfills.js +0 -2
- package/dist/epistemicBeliefs.confidence.js +0 -2
- package/dist/epistemicBeliefs.core.js +2 -3
- package/dist/epistemicBeliefs.forkEvidence.js +0 -2
- package/dist/epistemicBeliefs.helpers.js +0 -2
- package/dist/epistemicBeliefs.internal.js +2 -3
- package/dist/epistemicBeliefs.js +2 -3
- package/dist/epistemicBeliefs.lifecycle.js +0 -2
- package/dist/epistemicBeliefs.links.js +2 -3
- package/dist/epistemicBeliefs.queries.js +0 -2
- package/dist/epistemicBeliefs.topicAnchor.js +2 -3
- package/dist/epistemicContractHelpers.js +0 -2
- package/dist/epistemicContracts.evaluators.js +0 -2
- package/dist/epistemicContracts.handlers.js +0 -2
- package/dist/epistemicContracts.js +0 -2
- package/dist/epistemicContracts.metrics.js +0 -2
- package/dist/epistemicContracts.types.js +0 -2
- package/dist/epistemicEdgeCreation.js +0 -2
- package/dist/epistemicEdges.handlers.js +3 -3
- package/dist/epistemicEdges.helpers.js +0 -2
- package/dist/epistemicEdges.js +3 -3
- package/dist/epistemicEdges.mutations.js +0 -2
- package/dist/epistemicEdges.queries.js +0 -2
- package/dist/epistemicEdges.types.js +0 -2
- package/dist/epistemicEvidence.js +3 -3
- package/dist/epistemicEvidenceHelpers.js +0 -2
- package/dist/epistemicEvidenceMutations.js +3 -3
- package/dist/epistemicEvidenceQueries.js +0 -2
- package/dist/epistemicHelpers.js +2 -3
- package/dist/epistemicInsert.js +2 -3
- package/dist/epistemicLayerRules.js +0 -2
- package/dist/epistemicLinking.js +0 -2
- package/dist/epistemicNodeCreation.js +2 -3
- package/dist/epistemicNodes.helpers.js +0 -2
- package/dist/epistemicNodes.internal.js +2 -3
- package/dist/epistemicNodes.js +2 -3
- package/dist/epistemicNodes.mutations.js +2 -3
- package/dist/epistemicNodes.queries.js +0 -2
- package/dist/epistemicNodes.validators.js +0 -2
- package/dist/epistemicQuestions.conviction.js +0 -2
- package/dist/epistemicQuestions.create.js +2 -3
- package/dist/epistemicQuestions.evidence.js +2 -3
- package/dist/epistemicQuestions.helpers.js +0 -2
- package/dist/epistemicQuestions.js +2 -3
- package/dist/epistemicQuestions.lifecycle.js +0 -2
- package/dist/epistemicQuestions.queries.js +0 -2
- package/dist/epistemicQuestions.sprint.js +0 -2
- package/dist/epistemicQuestions.tail.js +2 -3
- package/dist/epistemicSources.js +2 -3
- package/dist/evaluators/index.js +0 -2
- package/dist/evaluators/lint-checker-evaluator.js +0 -2
- package/dist/evaluators/sentry-checker-evaluator.js +0 -2
- package/dist/evaluators/shared.js +0 -2
- package/dist/evaluators/test-runner-evaluator.js +0 -2
- package/dist/evaluators/tsc-checker-evaluator.js +0 -2
- package/dist/globalId.js +0 -2
- package/dist/graphTypes.js +0 -2
- package/dist/helpers.js +0 -2
- package/dist/index.js +4 -3
- package/dist/invariantEnforcement.js +0 -2
- package/dist/logicalRoleInference.js +0 -2
- package/dist/matcherFeedbackUtils.js +0 -2
- package/dist/ontology-matching.js +0 -2
- package/dist/ontologyApproval.js +0 -2
- package/dist/ontologyDefinitions.js +0 -2
- package/dist/ontologyHelpers.js +0 -2
- package/dist/ontologyRegistry.js +0 -2
- package/dist/projectionReconciliation.js +0 -2
- package/dist/projectionStaleness.js +0 -2
- package/dist/proof-attestation.json +1 -1
- package/dist/questionEvidenceLinks.js +0 -2
- package/dist/resolverTypes.js +0 -2
- package/dist/resolvers.js +0 -2
- package/dist/scopeResolverCompat.js +0 -2
- package/dist/text-matching.js +0 -2
- package/dist/topicOntologyResolver.js +0 -2
- package/dist/topicProjectOverlay.js +0 -2
- package/dist/topicScope.js +0 -2
- package/dist/workflowBridge.js +0 -2
- package/dist/workspaceIsolation.js +0 -2
- package/package.json +4 -4
- package/dist/beliefDecay.js.map +0 -1
- package/dist/beliefEvidenceLinks.js.map +0 -1
- package/dist/beliefEvidenceLinks.operational.js.map +0 -1
- package/dist/beliefLifecycle.js.map +0 -1
- package/dist/confidencePropagationDispatch.js.map +0 -1
- package/dist/contradictions.js.map +0 -1
- package/dist/convex.js.map +0 -1
- package/dist/debug.js.map +0 -1
- package/dist/edgeValidation.js.map +0 -1
- package/dist/edges/contains.js.map +0 -1
- package/dist/edges/contradicts.js.map +0 -1
- package/dist/edges/depends-on.js.map +0 -1
- package/dist/edges/derived-from.js.map +0 -1
- package/dist/edges/elaborates.js.map +0 -1
- package/dist/edges/index.js.map +0 -1
- package/dist/edges/informs.js.map +0 -1
- package/dist/edges/propagation-types.js.map +0 -1
- package/dist/edges/refutes.js.map +0 -1
- package/dist/edges/supports.js.map +0 -1
- package/dist/edges/tests.js.map +0 -1
- package/dist/edges/utils.js.map +0 -1
- package/dist/embeddingTrigger.js.map +0 -1
- package/dist/entityBridge.js.map +0 -1
- package/dist/entityCanonicalMatch.js.map +0 -1
- package/dist/entityLifecycle.js.map +0 -1
- package/dist/entityValidation.js.map +0 -1
- package/dist/epistemicAnswers.js.map +0 -1
- package/dist/epistemicBeliefs.admin.js.map +0 -1
- package/dist/epistemicBeliefs.backfills.js.map +0 -1
- package/dist/epistemicBeliefs.confidence.js.map +0 -1
- package/dist/epistemicBeliefs.core.js.map +0 -1
- package/dist/epistemicBeliefs.forkEvidence.js.map +0 -1
- package/dist/epistemicBeliefs.helpers.js.map +0 -1
- package/dist/epistemicBeliefs.internal.js.map +0 -1
- package/dist/epistemicBeliefs.js.map +0 -1
- package/dist/epistemicBeliefs.lifecycle.js.map +0 -1
- package/dist/epistemicBeliefs.links.js.map +0 -1
- package/dist/epistemicBeliefs.queries.js.map +0 -1
- package/dist/epistemicBeliefs.topicAnchor.js.map +0 -1
- package/dist/epistemicContractHelpers.js.map +0 -1
- package/dist/epistemicContracts.evaluators.js.map +0 -1
- package/dist/epistemicContracts.handlers.js.map +0 -1
- package/dist/epistemicContracts.js.map +0 -1
- package/dist/epistemicContracts.metrics.js.map +0 -1
- package/dist/epistemicContracts.types.js.map +0 -1
- package/dist/epistemicEdgeCreation.js.map +0 -1
- package/dist/epistemicEdges.handlers.js.map +0 -1
- package/dist/epistemicEdges.helpers.js.map +0 -1
- package/dist/epistemicEdges.js.map +0 -1
- package/dist/epistemicEdges.mutations.js.map +0 -1
- package/dist/epistemicEdges.queries.js.map +0 -1
- package/dist/epistemicEdges.types.js.map +0 -1
- package/dist/epistemicEvidence.js.map +0 -1
- package/dist/epistemicEvidenceHelpers.js.map +0 -1
- package/dist/epistemicEvidenceMutations.js.map +0 -1
- package/dist/epistemicEvidenceQueries.js.map +0 -1
- package/dist/epistemicHelpers.js.map +0 -1
- package/dist/epistemicInsert.js.map +0 -1
- package/dist/epistemicLayerRules.js.map +0 -1
- package/dist/epistemicLinking.js.map +0 -1
- package/dist/epistemicNodeCreation.js.map +0 -1
- package/dist/epistemicNodes.helpers.js.map +0 -1
- package/dist/epistemicNodes.internal.js.map +0 -1
- package/dist/epistemicNodes.js.map +0 -1
- package/dist/epistemicNodes.mutations.js.map +0 -1
- package/dist/epistemicNodes.queries.js.map +0 -1
- package/dist/epistemicNodes.validators.js.map +0 -1
- package/dist/epistemicQuestions.conviction.js.map +0 -1
- package/dist/epistemicQuestions.create.js.map +0 -1
- package/dist/epistemicQuestions.evidence.js.map +0 -1
- package/dist/epistemicQuestions.helpers.js.map +0 -1
- package/dist/epistemicQuestions.js.map +0 -1
- package/dist/epistemicQuestions.lifecycle.js.map +0 -1
- package/dist/epistemicQuestions.queries.js.map +0 -1
- package/dist/epistemicQuestions.sprint.js.map +0 -1
- package/dist/epistemicQuestions.tail.js.map +0 -1
- package/dist/epistemicSources.js.map +0 -1
- package/dist/evaluators/index.js.map +0 -1
- package/dist/evaluators/lint-checker-evaluator.js.map +0 -1
- package/dist/evaluators/sentry-checker-evaluator.js.map +0 -1
- package/dist/evaluators/shared.js.map +0 -1
- package/dist/evaluators/test-runner-evaluator.js.map +0 -1
- package/dist/evaluators/tsc-checker-evaluator.js.map +0 -1
- package/dist/globalId.js.map +0 -1
- package/dist/graphTypes.js.map +0 -1
- package/dist/helpers.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/invariantEnforcement.js.map +0 -1
- package/dist/logicalRoleInference.js.map +0 -1
- package/dist/matcherFeedbackUtils.js.map +0 -1
- package/dist/ontology-matching.js.map +0 -1
- package/dist/ontologyApproval.js.map +0 -1
- package/dist/ontologyDefinitions.js.map +0 -1
- package/dist/ontologyHelpers.js.map +0 -1
- package/dist/ontologyRegistry.js.map +0 -1
- package/dist/projectionReconciliation.js.map +0 -1
- package/dist/projectionStaleness.js.map +0 -1
- package/dist/questionEvidenceLinks.js.map +0 -1
- package/dist/resolverTypes.js.map +0 -1
- package/dist/resolvers.js.map +0 -1
- package/dist/scopeResolverCompat.js.map +0 -1
- package/dist/text-matching.js.map +0 -1
- package/dist/topicOntologyResolver.js.map +0 -1
- package/dist/topicProjectOverlay.js.map +0 -1
- package/dist/topicScope.js.map +0 -1
- package/dist/workflowBridge.js.map +0 -1
- package/dist/workspaceIsolation.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/beliefLifecycle.ts","../src/invariantEnforcement.ts"],"names":[],"mappings":"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","file":"invariantEnforcement.js","sourcesContent":["// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\n/**\n * Belief lifecycle helpers shared across Convex modules.\n *\n * Canonical lifecycle:\n * assumption -> hypothesis -> active -> resolved_true/resolved_false\n * \\-> superseded\n */\n\nexport type BeliefLifecycleStatus =\n | \"assumption\"\n | \"hypothesis\"\n | \"active\"\n | \"superseded\"\n | \"resolved_true\"\n | \"resolved_false\";\n\ntype PredictionOutcome =\n | \"pending\"\n | \"confirmed\"\n | \"disconfirmed\"\n | \"partial\"\n | \"expired\";\n\nconst BELIEF_STATUS_VALUES: readonly BeliefLifecycleStatus[] = [\n \"assumption\",\n \"hypothesis\",\n \"active\",\n \"superseded\",\n \"resolved_true\",\n \"resolved_false\",\n];\n\nconst RESOLVED_PREDICTION_OUTCOMES: readonly PredictionOutcome[] = [\n \"confirmed\",\n \"disconfirmed\",\n \"partial\",\n \"expired\",\n];\n\nexport function isBeliefLifecycleStatus(\n value: unknown\n): value is BeliefLifecycleStatus {\n return (\n typeof value === \"string\" &&\n BELIEF_STATUS_VALUES.includes(value as BeliefLifecycleStatus)\n );\n}\n\nfunction normalizeLegacyBeliefStatus(\n value: unknown\n): BeliefLifecycleStatus | null {\n if (isBeliefLifecycleStatus(value)) {\n return value;\n }\n if (value === \"belief\" || value === \"established\" || value === \"emerging\") {\n return \"active\";\n }\n if (value === \"fact\" || value === \"confirmed\") {\n return \"resolved_true\";\n }\n if (value === \"disconfirmed\" || value === \"expired\") {\n return \"resolved_false\";\n }\n if (value === \"deprecated\") {\n return \"superseded\";\n }\n return null;\n}\n\nfunction normalizeBeliefConfidence(confidence: unknown): number | null {\n if (typeof confidence !== \"number\" || !Number.isFinite(confidence)) {\n return null;\n }\n if (confidence >= 0 && confidence <= 1) {\n return confidence;\n }\n // Backward compatibility with historical percentage-scale confidence (0-100).\n if (confidence > 1 && confidence <= 100) {\n return confidence / 100;\n }\n return null;\n}\n\nexport function isResolvedByConfidence(confidence: unknown): boolean {\n const normalized = normalizeBeliefConfidence(confidence);\n if (normalized === null) {\n return false;\n }\n return normalized <= 0 || normalized >= 1;\n}\n\nexport function hasResolvedPredictionOutcome(predictionMeta: unknown): boolean {\n if (!predictionMeta || typeof predictionMeta !== \"object\") {\n return false;\n }\n const outcome = (predictionMeta as { outcome?: unknown }).outcome;\n return (\n typeof outcome === \"string\" &&\n RESOLVED_PREDICTION_OUTCOMES.includes(outcome as PredictionOutcome)\n );\n}\n\nfunction getPredictionMetaFromMetadata(\n metadata: Record<string, unknown> | undefined\n): unknown {\n return metadata?.predictionMeta;\n}\n\nexport function shouldTreatBeliefAsFact(opts: {\n confidence?: unknown;\n predictionMeta?: unknown;\n metadata?: Record<string, unknown>;\n}): boolean {\n if (isResolvedByConfidence(opts.confidence)) {\n return true;\n }\n if (hasResolvedPredictionOutcome(opts.predictionMeta)) {\n return true;\n }\n if (\n hasResolvedPredictionOutcome(getPredictionMetaFromMetadata(opts.metadata))\n ) {\n return true;\n }\n return false;\n}\n\nfunction resolvedPredictionStatus(\n predictionMeta: unknown\n): BeliefLifecycleStatus | null {\n if (!predictionMeta || typeof predictionMeta !== \"object\") {\n return null;\n }\n const outcome = (predictionMeta as { outcome?: unknown }).outcome;\n if (outcome === \"confirmed\") {\n return \"resolved_true\";\n }\n if (outcome === \"disconfirmed\" || outcome === \"expired\") {\n return \"resolved_false\";\n }\n return null;\n}\n\nfunction shouldTreatBeliefAsResolved(opts: {\n confidence?: unknown;\n predictionMeta?: unknown;\n metadata?: Record<string, unknown>;\n}): BeliefLifecycleStatus | null {\n if (isResolvedByConfidence(opts.confidence)) {\n const normalized = normalizeBeliefConfidence(opts.confidence);\n return normalized === 0 ? \"resolved_false\" : \"resolved_true\";\n }\n const directPredictionStatus = resolvedPredictionStatus(opts.predictionMeta);\n if (directPredictionStatus) {\n return directPredictionStatus;\n }\n const metadataPredictionStatus = resolvedPredictionStatus(\n getPredictionMetaFromMetadata(opts.metadata)\n );\n if (metadataPredictionStatus) {\n return metadataPredictionStatus;\n }\n return null;\n}\n\nexport function resolveBeliefLifecycleStatus(opts: {\n beliefStatus?: unknown;\n confidence?: unknown;\n predictionMeta?: unknown;\n metadata?: Record<string, unknown>;\n}): BeliefLifecycleStatus {\n const resolvedStatus = shouldTreatBeliefAsResolved(opts);\n if (resolvedStatus) {\n return resolvedStatus;\n }\n\n const direct = opts.beliefStatus;\n const normalizedDirect = normalizeLegacyBeliefStatus(direct);\n if (normalizedDirect) {\n // If the belief has been scored (has numeric credence) but stored status\n // is still pre-validation, promote to active. Evidence, not user intent,\n // makes a hypothesis active.\n const normalized = normalizeBeliefConfidence(opts.confidence);\n if (normalized !== null && isPreValidationBeliefStatus(normalizedDirect)) {\n return \"active\";\n }\n return normalizedDirect;\n }\n\n const metaStatus = opts.metadata?.beliefStatus;\n const normalizedMetaStatus = normalizeLegacyBeliefStatus(metaStatus);\n if (normalizedMetaStatus) {\n const normalized = normalizeBeliefConfidence(opts.confidence);\n if (\n normalized !== null &&\n isPreValidationBeliefStatus(normalizedMetaStatus)\n ) {\n return \"active\";\n }\n return normalizedMetaStatus;\n }\n\n return \"assumption\";\n}\n\nexport function isPreValidationBeliefStatus(\n status: BeliefLifecycleStatus\n): boolean {\n return status === \"assumption\" || status === \"hypothesis\";\n}\n\nexport function isPropagationEligibleBeliefStatus(\n status: BeliefLifecycleStatus\n): boolean {\n return status === \"active\" || status === \"resolved_true\";\n}\n\nexport function promoteBeliefStatusAfterScoring(\n status: BeliefLifecycleStatus,\n opts?: {\n confidence?: unknown;\n predictionMeta?: unknown;\n metadata?: Record<string, unknown>;\n }\n): BeliefLifecycleStatus {\n const resolvedStatus = shouldTreatBeliefAsResolved({ ...opts });\n if (resolvedStatus) {\n return resolvedStatus;\n }\n if (isPreValidationBeliefStatus(status)) {\n return \"active\";\n }\n return status;\n}\n\nexport function promoteBeliefStatusAfterEvidence(\n status: BeliefLifecycleStatus\n): BeliefLifecycleStatus {\n return isPreValidationBeliefStatus(status) ? \"active\" : status;\n}\n","// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\n/** Invariant error helpers that protect belief lifecycle mutations. */\nimport { hasResolvedPredictionOutcome } from \"./beliefLifecycle\";\n\ntype StructuredInvariantError = Error & {\n status: number;\n code: string;\n invariantCode?: string;\n suggestion?: string;\n details?: unknown;\n};\n\ninterface BeliefNodeLike {\n _id?: string;\n confidence?: unknown;\n metadata?: unknown;\n nodeType?: unknown;\n predictionMeta?: unknown;\n}\n\ninterface InvariantArgs {\n code?: string;\n details?: unknown;\n invariantCode:\n | \"belief.formulation_immutable_after_scoring\"\n | \"belief.confidence_append_only\"\n | \"belief.status_transition_requires_belief_api\"\n | \"belief.lineage_requires_fork_belief\"\n | \"belief.hard_delete_forbidden\"\n | \"entity.create_requires_entity_lifecycle\"\n | \"entity.update_requires_entity_lifecycle\"\n | \"entity.archive_requires_entity_lifecycle\"\n | \"entity.supersede_requires_entity_lifecycle\";\n message: string;\n status?: number;\n suggestion: string;\n}\n\nconst FORBIDDEN_GENERIC_BELIEF_METADATA_KEYS = new Set([\n \"beliefStatus\",\n \"epistemicStatus\",\n \"forkedBy\",\n \"forkedFrom\",\n \"forkReason\",\n \"forkTimestamp\",\n \"status\",\n \"supersededBy\",\n \"supersedes\",\n]);\n\nconst ONTOLOGICAL_NODE_TYPES = new Set([\n \"company\",\n \"person\",\n \"investor\",\n \"function\",\n \"value_chain\",\n]);\n\nfunction throwInvariantError(args: InvariantArgs): never {\n const error = new Error(args.message) as StructuredInvariantError;\n error.status = args.status ?? 409;\n error.code = args.code ?? \"INVARIANT_VIOLATION\";\n error.invariantCode = args.invariantCode;\n error.suggestion = args.suggestion;\n error.details = args.details;\n throw error;\n}\n\nexport function isBeliefNode(node: BeliefNodeLike | null | undefined): boolean {\n return node?.nodeType === \"belief\";\n}\n\nexport function isOntologicalNode(\n node: BeliefNodeLike | null | undefined\n): boolean {\n return (\n typeof node?.nodeType === \"string\" &&\n ONTOLOGICAL_NODE_TYPES.has(node.nodeType)\n );\n}\n\nexport function isScoredBeliefNode(node: BeliefNodeLike): boolean {\n if (!isBeliefNode(node)) {\n return false;\n }\n\n const metadata =\n node.metadata && typeof node.metadata === \"object\"\n ? (node.metadata as Record<string, unknown>)\n : undefined;\n\n const numericConfidence =\n typeof node.confidence === \"number\" && Number.isFinite(node.confidence);\n if (numericConfidence) {\n return true;\n }\n\n return (\n hasResolvedPredictionOutcome(node.predictionMeta) ||\n hasResolvedPredictionOutcome(metadata?.predictionMeta)\n );\n}\n\nfunction getForbiddenMetadataKeys(metadata: unknown): string[] {\n if (!metadata || typeof metadata !== \"object\" || Array.isArray(metadata)) {\n return [];\n }\n\n return Object.keys(metadata).filter((key) =>\n FORBIDDEN_GENERIC_BELIEF_METADATA_KEYS.has(key)\n );\n}\n\nexport function assertBeliefNodeGenericUpdateAllowed(args: {\n node: BeliefNodeLike;\n updates: Record<string, unknown>;\n mutationName: string;\n}): void {\n if (!isBeliefNode(args.node)) {\n return;\n }\n\n if (Object.hasOwn(args.updates, \"confidence\")) {\n throwInvariantError({\n message:\n \"Belief confidence is append-only. Generic node updates cannot set confidence directly.\",\n invariantCode: \"belief.confidence_append_only\",\n suggestion:\n \"Use epistemicBeliefs.appendSlScoring() so the beliefConfidence ledger and audit trail are updated together.\",\n details: { mutationName: args.mutationName, nodeId: args.node._id },\n });\n }\n\n if (Object.hasOwn(args.updates, \"status\")) {\n throwInvariantError({\n message:\n \"Belief status transitions must use the dedicated belief lifecycle APIs.\",\n invariantCode: \"belief.status_transition_requires_belief_api\",\n suggestion:\n \"Use epistemicBeliefs.updateStatus() or epistemicBeliefs.archive() so status transitions emit the correct audit event.\",\n details: { mutationName: args.mutationName, nodeId: args.node._id },\n });\n }\n\n const forbiddenMetadataKeys = getForbiddenMetadataKeys(args.updates.metadata);\n if (forbiddenMetadataKeys.length > 0) {\n throwInvariantError({\n message:\n \"Belief lineage and lifecycle metadata cannot be rewritten through generic node updates.\",\n invariantCode: \"belief.lineage_requires_fork_belief\",\n suggestion:\n \"Use epistemicBeliefs.forkBelief() for lineage changes and dedicated belief lifecycle mutations for status changes.\",\n details: {\n mutationName: args.mutationName,\n nodeId: args.node._id,\n forbiddenMetadataKeys,\n },\n });\n }\n\n if (\n isScoredBeliefNode(args.node) &&\n (Object.hasOwn(args.updates, \"canonicalText\") ||\n Object.hasOwn(args.updates, \"contentHash\"))\n ) {\n throwInvariantError({\n message:\n \"Cannot refine a scored belief in place. Scored formulations are immutable.\",\n invariantCode: \"belief.formulation_immutable_after_scoring\",\n suggestion:\n \"Use epistemicBeliefs.forkBelief() to evolve the formulation while preserving lineage.\",\n details: { mutationName: args.mutationName, nodeId: args.node._id },\n });\n }\n}\n\nexport function assertBeliefNodeArchiveAllowed(args: {\n node: BeliefNodeLike;\n mutationName: string;\n}): void {\n if (!isBeliefNode(args.node)) {\n return;\n }\n\n throwInvariantError({\n message:\n \"Belief archiving must go through the dedicated belief lifecycle API.\",\n invariantCode: \"belief.status_transition_requires_belief_api\",\n suggestion:\n \"Use epistemicBeliefs.archive() so the belief lifecycle audit trail stays consistent.\",\n details: { mutationName: args.mutationName, nodeId: args.node._id },\n });\n}\n\nexport function assertBeliefNodeVerifyAllowed(args: {\n node: BeliefNodeLike;\n confidence: number | undefined;\n mutationName: string;\n}): void {\n if (!isBeliefNode(args.node) || args.confidence === undefined) {\n return;\n }\n\n throwInvariantError({\n message:\n \"Belief verification cannot set confidence directly. Confidence changes must stay append-only.\",\n invariantCode: \"belief.confidence_append_only\",\n suggestion:\n \"Call epistemicBeliefs.appendSlScoring() after verification so the confidence history is preserved.\",\n details: { mutationName: args.mutationName, nodeId: args.node._id },\n });\n}\n\nexport function assertBeliefNodeSupersedeAllowed(args: {\n node: BeliefNodeLike;\n mutationName: string;\n}): void {\n if (!isBeliefNode(args.node)) {\n return;\n }\n\n throwInvariantError({\n message:\n \"Belief lineage changes must use forkBelief(), not the generic supersede path.\",\n invariantCode: \"belief.lineage_requires_fork_belief\",\n suggestion:\n \"Use epistemicBeliefs.forkBelief() so the child belief, supersedes edge, and audit trail are created together.\",\n details: { mutationName: args.mutationName, nodeId: args.node._id },\n });\n}\n\nexport function assertBeliefNodeHardDeleteAllowed(args: {\n node: BeliefNodeLike;\n allowBeliefHardDelete: boolean;\n reason: string;\n mutationName: string;\n}): void {\n if (!isBeliefNode(args.node)) {\n return;\n }\n\n if (!args.allowBeliefHardDelete) {\n throwInvariantError({\n message:\n \"Belief hard delete is forbidden by default. Beliefs must retain lineage and audit history.\",\n invariantCode: \"belief.hard_delete_forbidden\",\n suggestion:\n \"Use epistemicBeliefs.archive() or epistemicBeliefs.forkBelief() instead. Only migration repair flows may opt into hard delete explicitly.\",\n details: { mutationName: args.mutationName, nodeId: args.node._id },\n });\n }\n\n if (!args.reason.trim().toLowerCase().startsWith(\"migration:\")) {\n throwInvariantError({\n message:\n \"Belief hard delete bypasses require a migration-scoped rationale.\",\n invariantCode: \"belief.hard_delete_forbidden\",\n suggestion:\n 'Retry with allowBeliefHardDelete: true and a reason starting with \"migration:\" only for one-off data repair flows.',\n details: {\n mutationName: args.mutationName,\n nodeId: args.node._id,\n reason: args.reason,\n },\n });\n }\n}\n\nexport function assertOntologicalNodeGenericCreateAllowed(args: {\n nodeType: string;\n mutationName: string;\n}): void {\n if (!ONTOLOGICAL_NODE_TYPES.has(args.nodeType)) {\n return;\n }\n\n throwInvariantError({\n message:\n \"Ontological entities must be created through the dedicated entity lifecycle API.\",\n invariantCode: \"entity.create_requires_entity_lifecycle\",\n suggestion:\n \"Use entityLifecycle.createEntity() so tenant-global canonical scope and deduplication are enforced.\",\n details: {\n mutationName: args.mutationName,\n nodeType: args.nodeType,\n },\n });\n}\n\nexport function assertOntologicalNodeGenericUpdateAllowed(args: {\n node: BeliefNodeLike;\n mutationName: string;\n}): void {\n if (!isOntologicalNode(args.node)) {\n return;\n }\n\n throwInvariantError({\n message:\n \"Ontological entities must be updated through the dedicated entity lifecycle API.\",\n invariantCode: \"entity.update_requires_entity_lifecycle\",\n suggestion:\n \"Use entityLifecycle.updateEntityAttributes() so canonical entity mutations stay type-safe and audited.\",\n details: {\n mutationName: args.mutationName,\n nodeId: args.node._id,\n nodeType: args.node.nodeType,\n },\n });\n}\n\nexport function assertOntologicalNodeArchiveAllowed(args: {\n node: BeliefNodeLike;\n mutationName: string;\n}): void {\n if (!isOntologicalNode(args.node)) {\n return;\n }\n\n throwInvariantError({\n message:\n \"Ontological entities must be archived through the dedicated entity lifecycle API.\",\n invariantCode: \"entity.archive_requires_entity_lifecycle\",\n suggestion:\n \"Use entityLifecycle.archiveEntity() so entity archival emits the correct audit trail and review hooks.\",\n details: {\n mutationName: args.mutationName,\n nodeId: args.node._id,\n nodeType: args.node.nodeType,\n },\n });\n}\n\nexport function assertOntologicalNodeSupersedeAllowed(args: {\n node: BeliefNodeLike;\n mutationName: string;\n}): void {\n if (!isOntologicalNode(args.node)) {\n return;\n }\n\n throwInvariantError({\n message: \"Ontological entities do not use the generic supersede path.\",\n invariantCode: \"entity.supersede_requires_entity_lifecycle\",\n suggestion:\n \"Use entityLifecycle.updateEntityAttributes() to edit an entity in place or entityLifecycle.mergeEntities() to collapse duplicates.\",\n details: {\n mutationName: args.mutationName,\n nodeId: args.node._id,\n nodeType: args.node.nodeType,\n },\n });\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/logicalRoleInference.ts"],"names":[],"mappings":"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","file":"logicalRoleInference.js","sourcesContent":["// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\n/**\n * logicalRoleInference module implementation.\n */\n\nimport type { Id, MutationCtx, QueryCtx } from \"./convex\";\n\ntype LogicalRole =\n | \"necessary\"\n | \"sufficient\"\n | \"necessary_sufficient\"\n | \"contributory\"\n | \"corroborative\";\n\nconst PILLAR_IMPORTANCE: Record<string, number> = {\n market: 1,\n competition: 2,\n product: 3,\n team: 4,\n financials: 5,\n timing: 6,\n other: 10,\n};\n\ntype GraphCtx = QueryCtx | MutationCtx;\n\ninterface IndexQueryBuilder {\n eq(field: string, value: unknown): IndexQueryBuilder;\n}\n\ninterface EpistemicEdgeRecord {\n fromNodeId?: string;\n toNodeId?: string;\n}\n\nexport async function computeLogicalRole(\n ctx: GraphCtx,\n evidenceId: Id<\"epistemicNodes\">,\n beliefId: Id<\"epistemicNodes\">\n): Promise<LogicalRole> {\n const belief = await ctx.db.get(beliefId);\n if (belief?.nodeType !== \"belief\") {\n return \"contributory\";\n }\n\n const beliefMetadata = belief.metadata as Record<string, unknown> | undefined;\n const pillar = (beliefMetadata?.pillar as string) || \"other\";\n const pillarRank = PILLAR_IMPORTANCE[pillar] ?? 10;\n\n const isSynthesized = await checkIfSynthesizedHypothesis(ctx, beliefId);\n const testingQuestions = await getTestingQuestionsForBelief(ctx, beliefId);\n const answeredQuestions = await getQuestionsAnsweredByEvidence(\n ctx,\n evidenceId\n );\n const directlyTests = testingQuestions.filter((questionId) =>\n answeredQuestions.includes(questionId)\n );\n\n if (directlyTests.length === 0) {\n return \"contributory\";\n }\n\n if (isSynthesized && pillarRank <= 2) {\n return directlyTests.length > 1 ? \"necessary_sufficient\" : \"necessary\";\n }\n\n if (isSynthesized) {\n return \"necessary\";\n }\n\n return directlyTests.length > 1 ? \"necessary\" : \"contributory\";\n}\n\nasync function checkIfSynthesizedHypothesis(\n ctx: GraphCtx,\n beliefId: Id<\"epistemicNodes\">\n): Promise<boolean> {\n const belief = await ctx.db.get(beliefId);\n if (!belief) {\n return false;\n }\n\n const metadata = belief.metadata as Record<string, unknown> | undefined;\n return (\n metadata?.isSynthesized === true || metadata?.beliefStatus === \"hypothesis\"\n );\n}\n\nasync function getTestingQuestionsForBelief(\n ctx: GraphCtx,\n beliefId: Id<\"epistemicNodes\">\n): Promise<string[]> {\n const testEdges = (await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_to_type\", (q: IndexQueryBuilder) =>\n q.eq(\"toNodeId\", beliefId).eq(\"edgeType\", \"tests\")\n )\n .collect()) as EpistemicEdgeRecord[];\n\n return testEdges\n .map((edge: EpistemicEdgeRecord) => edge.fromNodeId as string)\n .filter((id): id is string => id !== undefined);\n}\n\nasync function getQuestionsAnsweredByEvidence(\n ctx: GraphCtx,\n evidenceId: Id<\"epistemicNodes\">\n): Promise<string[]> {\n const answerEdges = (await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from_type\", (q: IndexQueryBuilder) =>\n q.eq(\"fromNodeId\", evidenceId).eq(\"edgeType\", \"derived_from\")\n )\n .collect()) as EpistemicEdgeRecord[];\n\n return answerEdges\n .map((edge: EpistemicEdgeRecord) => edge.toNodeId as string)\n .filter((id): id is string => id !== undefined);\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/matcherFeedbackUtils.ts"],"names":[],"mappings":"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","file":"matcherFeedbackUtils.js","sourcesContent":["// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\n/** Matcher feedback helper types shared by graph-primitive review flows. */\nexport type LinkSuggestionStatus = \"suggested\" | \"approved\" | \"dismissed\";\n\nexport type MatcherReviewStatus =\n | \"pending\"\n | \"accepted\"\n | \"rejected\"\n | \"auto_accepted\"\n | \"superseded\";\n\ninterface MatcherFeedbackSummaryRow {\n matcherKey?: string | null;\n reviewStatus: MatcherReviewStatus;\n rewardScore?: number | null;\n surface?: string | null;\n}\n\nexport function isOperationalLinkStatus(\n status?: LinkSuggestionStatus | null\n): boolean {\n return status !== \"suggested\" && status !== \"dismissed\";\n}\n\nexport function mergeLinkSuggestionStatus(\n existing?: LinkSuggestionStatus | null,\n requested?: LinkSuggestionStatus | null\n): LinkSuggestionStatus | undefined {\n if (requested === undefined || requested === null) {\n return existing ?? undefined;\n }\n\n if (\n existing &&\n isOperationalLinkStatus(existing) &&\n !isOperationalLinkStatus(requested)\n ) {\n return existing;\n }\n\n return requested;\n}\n\nexport function resolveReviewedLinkStatus(\n requested: \"approved\" | \"dismissed\"\n): LinkSuggestionStatus {\n return requested;\n}\n\nexport function deriveMatcherReviewStatus(input: {\n explicitReviewStatus?: MatcherReviewStatus | null;\n linkStatus?: LinkSuggestionStatus | null;\n autoAccepted?: boolean;\n}): MatcherReviewStatus {\n if (input.explicitReviewStatus) {\n return input.explicitReviewStatus;\n }\n\n if (input.autoAccepted) {\n return \"auto_accepted\";\n }\n\n if (input.linkStatus === \"suggested\") {\n return \"pending\";\n }\n\n if (input.linkStatus === \"dismissed\") {\n return \"rejected\";\n }\n\n return \"accepted\";\n}\n\nexport function deriveMatcherRewardScore(\n reviewStatus: MatcherReviewStatus\n): number {\n switch (reviewStatus) {\n case \"accepted\":\n case \"auto_accepted\":\n return 1;\n case \"rejected\":\n return -1;\n default:\n return 0;\n }\n}\n\nexport function summarizeMatcherFeedback(rows: MatcherFeedbackSummaryRow[]) {\n const totals = {\n total: rows.length,\n pending: 0,\n accepted: 0,\n autoAccepted: 0,\n rejected: 0,\n superseded: 0,\n };\n\n const surfaces = new Set<string>();\n const matcherKeys = new Set<string>();\n let rewardSum = 0;\n\n for (const row of rows) {\n if (row.surface) {\n surfaces.add(row.surface);\n }\n if (row.matcherKey) {\n matcherKeys.add(row.matcherKey);\n }\n\n switch (row.reviewStatus) {\n case \"pending\":\n totals.pending += 1;\n break;\n case \"accepted\":\n totals.accepted += 1;\n break;\n case \"auto_accepted\":\n totals.autoAccepted += 1;\n break;\n case \"rejected\":\n totals.rejected += 1;\n break;\n case \"superseded\":\n totals.superseded += 1;\n break;\n default:\n break;\n }\n\n rewardSum += row.rewardScore ?? deriveMatcherRewardScore(row.reviewStatus);\n }\n\n const decided = totals.accepted + totals.autoAccepted + totals.rejected;\n const positive = totals.accepted + totals.autoAccepted;\n\n return {\n ...totals,\n decided,\n acceptanceRate: decided > 0 ? positive / decided : 0,\n averageReward: rows.length > 0 ? rewardSum / rows.length : 0,\n uniqueSurfaces: surfaces.size,\n uniqueMatchers: matcherKeys.size,\n };\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"ontology-matching.js","sourcesContent":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/convex.ts","../src/ontologyApproval.ts"],"names":[],"mappings":";;;;;;AA4BkB,kBAAA;AAAA,EAChB;AACF;AAGE,iBAAA;AA4IK,IAAM,gBAAA,GACX,uBAAA;AAGK,IAAM,QAAA,GACX,eAAA;AACK,IAAM,KAAA,GAAQ,YAAA;;;AC3Kd,IAAM,uBAAuB,KAAA,CAAM;AAAA,EACxC,IAAA,EAAM,EAAE,GAAA,EAAI;AAAA,EACZ,OAAA,EAAS,gBAAA;AAAA,EACT,SAAS,aAAa,EAAE,OAAO,CAAA,EAAG,QAAA,EAAU,EAAC,EAAE;AACjD,CAAC;AAEM,IAAM,oBAAoB,KAAA,CAAM;AAAA,EACrC,IAAA,EAAM,EAAE,GAAA,EAAI;AAAA,EACZ,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,YAAY;AACvB,CAAC;AAEM,IAAM,0BAA0B,KAAA,CAAM;AAAA,EAC3C,IAAA,EAAM,EAAE,GAAA,EAAI;AAAA,EACZ,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,YAAY;AACvB,CAAC;AAEM,IAAM,oBAAoB,QAAA,CAAS;AAAA,EACxC,IAAA,EAAM,EAAE,GAAA,EAAI;AAAA,EACZ,OAAA,EAAS,gBAAA;AAAA,EACT,SAAS,YAAY;AACvB,CAAC;AAEM,IAAM,UAAU,QAAA,CAAS;AAAA,EAC9B,IAAA,EAAM,EAAE,GAAA,EAAI;AAAA,EACZ,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,aAAa,EAAE,OAAA,EAAS,IAAA,EAAK;AACxC,CAAC;AAEM,IAAM,SAAS,QAAA,CAAS;AAAA,EAC7B,IAAA,EAAM,EAAE,GAAA,EAAI;AAAA,EACZ,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,aAAa,EAAE,OAAA,EAAS,IAAA,EAAK;AACxC,CAAC;AAEM,IAAM,cAAc,QAAA,CAAS;AAAA,EAClC,IAAA,EAAM,EAAE,GAAA,EAAI;AAAA,EACZ,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,OAAO,IAAA,EAAmB,IAAA,MAAmC;AAAA,IACpE,QAAA,EAAU,CAAA;AAAA,IACV,KAAA,EAAO,MAAM,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,GAAI,IAAA,CAAK,QAAQ,MAAA,GAAS;AAAA,GAC7D;AACF,CAAC;AAEM,IAAM,4BAA4B,QAAA,CAAS;AAAA,EAChD,IAAA,EAAM,EAAE,GAAA,EAAI;AAAA,EACZ,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,aAAa,EAAE,QAAA,EAAU,CAAA,EAAE;AACtC,CAAC;AAEM,IAAM,kBAAkB,gBAAA,CAAiB;AAAA,EAC9C,IAAA,EAAM,EAAE,GAAA,EAAI;AAAA,EACZ,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,aAAa,EAAE,OAAA,EAAS,IAAA,EAAK;AACxC,CAAC;AAEM,IAAM,0BAA0B,gBAAA,CAAiB;AAAA,EACtD,IAAA,EAAM,EAAE,GAAA,EAAI;AAAA,EACZ,OAAA,EAAS,gBAAA;AAAA,EACT,SAAS,aAAa,EAAE,OAAA,EAAS,CAAA,EAAG,cAAc,CAAA,EAAE;AACtD,CAAC","file":"ontologyApproval.js","sourcesContent":["import type { Doc as AccessControlDoc } from \"@lucern/access-control/convex\";\nimport {\n type UnsafeConvexAnyApi,\n unsafeConvexAnyApi,\n} from \"@lucern/contracts/convex/unsafeAnyApi\";\nimport {\n actionGeneric,\n componentsGeneric,\n httpActionGeneric,\n internalActionGeneric,\n internalMutationGeneric,\n internalQueryGeneric,\n mutationGeneric,\n queryGeneric,\n} from \"convex/server\";\nimport type { GenericId } from \"convex/values\";\n\n// TODO(FR.11-structural): `api`/`internal`/`components` are `anyApi as any`\n// because this module source tree is bundled into the kernel host at deploy time\n// and has NO top-level Convex `_generated/` directory to import a typed surface\n// from. Every `api.*` / `internal.*` / string-literal cross-component ref in this\n// module (topicScope.ts, topicProjectOverlay.ts, questionEvidenceLinks.ts,\n// beliefEvidenceLinks*.ts, epistemicQuestions.helpers.ts) inherits `any` from\n// here. The fix is structural — generate a per-module typed surface or a shared\n// typed function-reference manifest (template: the typed `components.controlPlane`\n// in modules/control-plane/src/component/convex.ts and the\n// `KERNEL_API_REF_MANIFEST` pattern in packages/server-core/src/kernelApi.ts) —\n// owned by the FR.11 closing/synthesis pass, not a mechanical swap.\nconst unsafeApi = unsafeConvexAnyApi(\n \"graph-primitives top-level module bundle lacks a committed Convex _generated/api surface\"\n);\nexport const api = unsafeApi;\nexport const components =\n componentsGeneric() as unknown as UntypedFunctionReferenceSurface;\nexport const internal = unsafeApi;\n\ntype UntypedFunctionReferenceSurface = UnsafeConvexAnyApi;\ntype BoundaryValue = UntypedFunctionReferenceSurface[string];\n\nexport type TableNames = string;\nexport type Id<TableName extends TableNames = string> = GenericId<TableName>;\nexport type Doc<TableName extends TableNames = string> =\n AccessControlDoc<TableName>;\nexport type DataModel = Record<TableNames, unknown>;\ninterface IndexRangeBuilder {\n eq(fieldName: string, value: unknown): IndexRangeBuilder;\n field(fieldName: string): string;\n gt(fieldName: string, value: unknown): IndexRangeBuilder;\n gte(fieldName: string, value: unknown): IndexRangeBuilder;\n lt(fieldName: string, value: unknown): IndexRangeBuilder;\n lte(fieldName: string, value: unknown): IndexRangeBuilder;\n}\ninterface FilterBuilder {\n and(...clauses: unknown[]): FilterBuilder;\n eq(left: unknown, right: unknown): FilterBuilder;\n field(fieldName: string): string;\n gt(left: unknown, right: unknown): FilterBuilder;\n gte(left: unknown, right: unknown): FilterBuilder;\n lt(left: unknown, right: unknown): FilterBuilder;\n lte(left: unknown, right: unknown): FilterBuilder;\n neq(left: unknown, right: unknown): FilterBuilder;\n or(...clauses: unknown[]): FilterBuilder;\n [operator: string]: unknown;\n}\ninterface QueryInitializer<TableName extends TableNames> {\n collect(): Promise<Doc<TableName>[]>;\n filter(predicate: (q: FilterBuilder) => unknown): QueryInitializer<TableName>;\n first(): Promise<Doc<TableName> | null>;\n order(direction: \"asc\" | \"desc\"): QueryInitializer<TableName>;\n take(limit: number): Promise<Doc<TableName>[]>;\n unique(): Promise<Doc<TableName> | null>;\n withIndex(\n indexName: string,\n range?: (q: IndexRangeBuilder) => unknown\n ): QueryInitializer<TableName>;\n withSearchIndex(\n indexName: string,\n search?: (q: IndexRangeBuilder) => unknown\n ): QueryInitializer<TableName>;\n}\nexport interface DatabaseReader {\n get<TableName extends TableNames>(\n id: unknown\n ): Promise<Doc<TableName> | null>;\n normalizeId?<TableName extends TableNames>(\n tableName: TableName,\n id: string\n ): Id<TableName> | null;\n query<TableName extends TableNames>(\n tableName: TableName\n ): QueryInitializer<TableName>;\n}\nexport type DatabaseWriter = DatabaseReader & {\n insert<TableName extends TableNames>(\n tableName: TableName,\n value: Record<string, unknown>\n ): Promise<Id<TableName>>;\n patch<TableName extends TableNames>(\n id: Id<TableName>,\n value: Record<string, unknown>\n ): Promise<void>;\n replace<TableName extends TableNames>(\n id: Id<TableName>,\n value: Record<string, unknown>\n ): Promise<void>;\n delete<TableName extends TableNames>(id: Id<TableName>): Promise<void>;\n};\ninterface Scheduler {\n runAfter(\n delayMs: number,\n functionReference: unknown,\n args?: unknown\n ): Promise<void>;\n}\ninterface AuthReader {\n getUserIdentity(): Promise<{\n readonly subject: string;\n readonly [claimName: string]: unknown;\n } | null>;\n}\ninterface RuntimeInvoker {\n runAction<Result = unknown>(\n functionReference: unknown,\n args?: unknown\n ): Promise<Result>;\n runMutation<Result = unknown>(\n functionReference: unknown,\n args?: unknown\n ): Promise<Result>;\n runQuery<Result = unknown>(\n functionReference: unknown,\n args?: unknown\n ): Promise<Result>;\n}\nexport type QueryCtx = RuntimeInvoker & {\n auth: AuthReader;\n db: DatabaseReader;\n scheduler: Scheduler;\n};\nexport type MutationCtx = RuntimeInvoker & {\n auth: AuthReader;\n db: DatabaseWriter;\n scheduler: Scheduler;\n};\nexport type ActionCtx = RuntimeInvoker & {\n auth: AuthReader;\n scheduler: Scheduler;\n};\n\ntype ConvexFunctionBuilder<Ctx> = <\n Args = BoundaryValue,\n Result = BoundaryValue,\n>(definition: {\n args?: unknown;\n handler: (ctx: Ctx, args: Args) => Result;\n returns?: unknown;\n}) => unknown;\n\ntype OptionalHandlerConvexFunctionBuilder<Ctx> = <\n Args = BoundaryValue,\n Result = BoundaryValue,\n>(definition: {\n args?: unknown;\n handler?: (ctx: Ctx, args: Args) => Result;\n returns?: unknown;\n}) => unknown;\n\nexport const action =\n actionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const httpAction =\n httpActionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const internalAction =\n internalActionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const internalMutation =\n internalMutationGeneric as unknown as OptionalHandlerConvexFunctionBuilder<MutationCtx>;\nexport const internalQuery =\n internalQueryGeneric as unknown as OptionalHandlerConvexFunctionBuilder<QueryCtx>;\nexport const mutation =\n mutationGeneric as unknown as ConvexFunctionBuilder<MutationCtx>;\nexport const query = queryGeneric as unknown as ConvexFunctionBuilder<QueryCtx>;\n","// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\n// DORMANT: Ontology approval UI stubbed in EK-16.1c. Re-enable when approval workflow ships.\n\nimport { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\nimport { v } from \"convex/values\";\nimport type { MutationCtx } from \"./convex\";\nimport { internalMutation, mutation, query } from \"./convex\";\n\nexport const getPendingForProject = query({\n args: v.any(),\n returns: permissiveReturn,\n handler: async () => ({ total: 0, bySource: [] }),\n});\n\nexport const getPendingForNode = query({\n args: v.any(),\n returns: permissiveReturn,\n handler: async () => [],\n});\n\nexport const getThemeOntologyMatches = query({\n args: v.any(),\n returns: permissiveReturn,\n handler: async () => [],\n});\n\nexport const createPendingLink = mutation({\n args: v.any(),\n returns: permissiveReturn,\n handler: async () => null,\n});\n\nexport const approve = mutation({\n args: v.any(),\n returns: permissiveReturn,\n handler: async () => ({ success: true }),\n});\n\nexport const reject = mutation({\n args: v.any(),\n returns: permissiveReturn,\n handler: async () => ({ success: true }),\n});\n\nexport const bulkApprove = mutation({\n args: v.any(),\n returns: permissiveReturn,\n handler: async (_ctx: MutationCtx, args: { linkIds?: unknown[] }) => ({\n approved: 0,\n total: Array.isArray(args.linkIds) ? args.linkIds.length : 0,\n }),\n});\n\nexport const bulkApproveHighConfidence = mutation({\n args: v.any(),\n returns: permissiveReturn,\n handler: async () => ({ approved: 0 }),\n});\n\nexport const createNeo4jEdge = internalMutation({\n args: v.any(),\n returns: permissiveReturn,\n handler: async () => ({ success: true }),\n});\n\nexport const batchCreatePendingLinks = internalMutation({\n args: v.any(),\n returns: permissiveReturn,\n handler: async () => ({ created: 0, autoApproved: 0 }),\n});\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
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"]}
|
|
@@ -1 +0,0 @@
|
|
|
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"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/convex.ts","../src/ontologyRegistry.ts"],"names":[],"mappings":"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","file":"ontologyRegistry.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 Registry\n *\n * Seeds schemaEnumConfig with platform-default entity types, subtypes,\n * and entity edge types. Provides tenant extension API.\n *\n * Categories:\n * - entity_type: Company, Person, Investor, Function, ValueChain\n * - entity_subtype: company/private, investor/vc, etc.\n * - entity_edge_type: works_at, invested_in, etc.\n *\n * @module graph-primitives/ontologyRegistry\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 } from \"./convex\";\nimport { internalMutation, mutation } from \"./convex\";\n\n// =============================================================================\n// PLATFORM-DEFAULT ENTITY TYPES\n// =============================================================================\n\ninterface FieldSchema {\n required: boolean;\n type: \"string\" | \"number\" | \"boolean\";\n}\n\ninterface EntityTypeDefinition {\n description: string;\n label: string;\n schema: Record<string, FieldSchema>;\n value: string;\n}\n\nconst PLATFORM_ENTITY_TYPES: EntityTypeDefinition[] = [\n {\n value: \"company\",\n label: \"Company\",\n description: \"A business entity — startup, portfolio company, or corporate\",\n schema: {\n name: { type: \"string\", required: true },\n sector: { type: \"string\", required: false },\n founded_year: { type: \"number\", required: false },\n website: { type: \"string\", required: false },\n domain: { type: \"string\", required: false },\n },\n },\n {\n value: \"person\",\n label: \"Person\",\n description: \"An individual — founder, executive, or contact\",\n schema: {\n name: { type: \"string\", required: true },\n role: { type: \"string\", required: false },\n affiliation: { type: \"string\", required: false },\n linkedin: { type: \"string\", required: false },\n },\n },\n {\n value: \"investor\",\n label: \"Investor\",\n description: \"An investment entity — fund, GP, or angel\",\n schema: {\n name: { type: \"string\", required: true },\n fund_name: { type: \"string\", required: false },\n investment_focus: { type: \"string\", required: false },\n aum: { type: \"number\", required: false },\n },\n },\n {\n value: \"function\",\n label: \"Function\",\n description: \"A business function in a value chain\",\n schema: {\n name: { type: \"string\", required: true },\n description: { type: \"string\", required: false },\n },\n },\n {\n value: \"value_chain\",\n label: \"Value Chain\",\n description: \"A value chain or industry vertical\",\n schema: {\n name: { type: \"string\", required: true },\n description: { type: \"string\", required: false },\n },\n },\n];\n\n// =============================================================================\n// PLATFORM-DEFAULT ENTITY SUBTYPES\n// =============================================================================\n\ninterface SubtypeDefinition {\n label: string;\n parentType: string;\n value: string;\n}\n\nconst PLATFORM_ENTITY_SUBTYPES: SubtypeDefinition[] = [\n // Company subtypes\n { value: \"company/private\", label: \"Private Company\", parentType: \"company\" },\n { value: \"company/corporate\", label: \"Corporate\", parentType: \"company\" },\n {\n value: \"company/portfolio\",\n label: \"Portfolio Company\",\n parentType: \"company\",\n },\n // Investor subtypes\n { value: \"investor/vc\", label: \"Venture Capital\", parentType: \"investor\" },\n { value: \"investor/lp\", label: \"Limited Partner\", parentType: \"investor\" },\n { value: \"investor/cvc\", label: \"Corporate VC\", parentType: \"investor\" },\n { value: \"investor/pe\", label: \"Private Equity\", parentType: \"investor\" },\n {\n value: \"investor/family_office\",\n label: \"Family Office\",\n parentType: \"investor\",\n },\n { value: \"investor/angel\", label: \"Angel Investor\", parentType: \"investor\" },\n];\n\n// =============================================================================\n// PLATFORM-DEFAULT ENTITY EDGE TYPES\n// =============================================================================\n\ninterface EntityEdgeTypeDefinition {\n description: string;\n label: string;\n value: string;\n}\ninterface IndexRangeBuilder {\n eq(fieldName: string, value: unknown): IndexRangeBuilder;\n}\ninterface EnumConfigRow {\n _id: Id<\"schemaEnumConfig\">;\n value: string;\n}\ninterface RegisterEntityTypeArgs {\n description?: string;\n domainNamespace?: string;\n label: string;\n schema: unknown;\n tenantId: string;\n value: string;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction readEnumConfigRow(value: unknown, context: string): EnumConfigRow {\n if (!isRecord(value)) {\n throw new Error(`${context} must be an object.`);\n }\n if (typeof value._id !== \"string\" || typeof value.value !== \"string\") {\n throw new Error(`${context} has invalid or missing _id/value.`);\n }\n return {\n _id: value._id as Id<\"schemaEnumConfig\">,\n value: value.value,\n };\n}\n\nfunction readEnumConfigRows(values: unknown[]): EnumConfigRow[] {\n return values.map((value, index) =>\n readEnumConfigRow(value, `schemaEnumConfig[${index}]`)\n );\n}\n\nconst PLATFORM_ENTITY_EDGE_TYPES: EntityEdgeTypeDefinition[] = [\n {\n value: \"works_at\",\n label: \"Works At\",\n description: \"Person → Company/Investor employment\",\n },\n {\n value: \"performs\",\n label: \"Performs\",\n description: \"Company → Function capability\",\n },\n {\n value: \"invested_in\",\n label: \"Invested In\",\n description: \"Investor → Company investment\",\n },\n {\n value: \"founded_by\",\n label: \"Founded By\",\n description: \"Company → Person founding\",\n },\n {\n value: \"participates_in\",\n label: \"Participates In\",\n description: \"Company → ValueChain participation\",\n },\n {\n value: \"function_in\",\n label: \"Function In\",\n description: \"Function → ValueChain membership\",\n },\n {\n value: \"impacts\",\n label: \"Impacts\",\n description: \"Theme → ValueChain impact\",\n },\n {\n value: \"mentioned_in\",\n label: \"Mentioned In\",\n description: \"Entity → Source reference\",\n },\n {\n value: \"competes_with\",\n label: \"Competes With\",\n description: \"Company → Company competition\",\n },\n {\n value: \"depends_on\",\n label: \"Depends On\",\n description: \"Entity → Entity dependency\",\n },\n {\n value: \"contains\",\n label: \"Contains\",\n description:\n \"Containment: ValueChain → Function, Belief/Question/Theme → Entity, Entity → Evidence\",\n },\n {\n value: \"raised_from\",\n label: \"Raised From\",\n description: \"Company → Investor fundraising\",\n },\n {\n value: \"derived_from\",\n label: \"Derived From\",\n description: \"Entity → Entity deduplication merge link (replaces same_as)\",\n },\n];\n\n// =============================================================================\n// SEED MUTATION (idempotent)\n// =============================================================================\n\nasync function upsertEnumEntry(\n ctx: MutationCtx,\n entry: {\n category: string;\n value: string;\n label: string;\n description?: string;\n tier: \"platform\" | \"tenant\";\n metadata?: Record<string, unknown>;\n sortOrder?: number;\n }\n): Promise<{ inserted: boolean }> {\n const existing = await ctx.db\n .query(\"schemaEnumConfig\")\n .withIndex(\"by_category_value\", (q: IndexRangeBuilder) =>\n q.eq(\"category\", entry.category).eq(\"value\", entry.value)\n )\n .first();\n\n if (existing) {\n return { inserted: false };\n }\n\n const now = Date.now();\n await ctx.db.insert(\"schemaEnumConfig\", {\n category: entry.category,\n value: entry.value,\n label: entry.label,\n description: entry.description,\n tier: entry.tier,\n metadata: entry.metadata,\n sortOrder: entry.sortOrder,\n status: \"active\" as const,\n createdAt: now,\n updatedAt: now,\n });\n\n return { inserted: true };\n}\n\n/**\n * Seed the ontology registry with platform-default entity types.\n * Idempotent — safe to call multiple times.\n */\nexport const seedOntologyRegistry = internalMutation({\n args: {},\n returns: permissiveReturn,\n handler: async (ctx: MutationCtx) => {\n let inserted = 0;\n let skipped = 0;\n\n // Seed entity types\n for (let i = 0; i < PLATFORM_ENTITY_TYPES.length; i++) {\n const entityType = PLATFORM_ENTITY_TYPES[i];\n const result = await upsertEnumEntry(ctx, {\n category: \"entity_type\",\n value: entityType.value,\n label: entityType.label,\n description: entityType.description,\n tier: \"platform\",\n metadata: { schema: entityType.schema },\n sortOrder: i + 1,\n });\n if (result.inserted) {\n inserted++;\n } else {\n skipped++;\n }\n }\n\n // Seed entity subtypes\n for (let i = 0; i < PLATFORM_ENTITY_SUBTYPES.length; i++) {\n const subtype = PLATFORM_ENTITY_SUBTYPES[i];\n const result = await upsertEnumEntry(ctx, {\n category: \"entity_subtype\",\n value: subtype.value,\n label: subtype.label,\n tier: \"platform\",\n metadata: { parentType: subtype.parentType },\n sortOrder: i + 1,\n });\n if (result.inserted) {\n inserted++;\n } else {\n skipped++;\n }\n }\n\n // Seed entity edge types\n for (let i = 0; i < PLATFORM_ENTITY_EDGE_TYPES.length; i++) {\n const edgeType = PLATFORM_ENTITY_EDGE_TYPES[i];\n const result = await upsertEnumEntry(ctx, {\n category: \"entity_edge_type\",\n value: edgeType.value,\n label: edgeType.label,\n description: edgeType.description,\n tier: \"platform\",\n sortOrder: i + 1,\n });\n if (result.inserted) {\n inserted++;\n } else {\n skipped++;\n }\n }\n\n return { inserted, skipped, total: inserted + skipped };\n },\n});\n\n// =============================================================================\n// TENANT EXTENSION API\n// =============================================================================\n\n/**\n * Register a new entity type for a tenant.\n * Creates a schemaEnumConfig entry with tier='tenant'.\n */\nexport const registerEntityType = mutation({\n args: {\n tenantId: v.string(),\n value: v.string(),\n label: v.string(),\n description: v.optional(v.string()),\n schema: v.any(), // Record<string, { type, required }>\n domainNamespace: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx: MutationCtx, args: RegisterEntityTypeArgs) => {\n // Auth guard — tenant mutations require authenticated user\n const userId = await getCurrentUserId(ctx);\n if (!userId) {\n throw new Error(\"Authentication required to register entity types.\");\n }\n\n // Check for existing entry with same value\n const existing = readEnumConfigRows(\n await ctx.db\n .query(\"schemaEnumConfig\")\n .withIndex(\"by_tenant_category\", (q: IndexRangeBuilder) =>\n q.eq(\"tenantId\", args.tenantId).eq(\"category\", \"entity_type\")\n )\n .collect()\n );\n\n const duplicate = existing.find(\n (e: EnumConfigRow) => e.value === args.value\n );\n if (duplicate) {\n throw new Error(\n `Entity type \"${args.value}\" already registered for tenant ${args.tenantId}`\n );\n }\n\n const now = Date.now();\n const id = await ctx.db.insert(\"schemaEnumConfig\", {\n tenantId: args.tenantId,\n category: \"entity_type\",\n value: args.value,\n label: args.label,\n description: args.description,\n tier: \"tenant\" as const,\n domainNamespace: args.domainNamespace,\n metadata: { schema: args.schema },\n status: \"active\" as const,\n createdAt: now,\n updatedAt: now,\n });\n\n return { id, value: args.value };\n },\n});\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/convex.ts","../src/projectionStaleness.ts","../src/projectionReconciliation.ts"],"names":[],"mappings":"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","file":"projectionReconciliation.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 * projectionStaleness module implementation.\n */\n\nexport type ProjectionEndpointClass =\n | \"analytics\"\n | \"traversal\"\n | \"entity_read\"\n | \"non_graph\";\n\nexport type ProjectionFallbackMode =\n | \"fail_with_503\"\n | \"degrade_to_convex_depth_limited\"\n | \"fallback_to_convex_entity_read\"\n | \"none\";\n\nexport interface ProjectionStalenessPolicy {\n endpointClass: ProjectionEndpointClass;\n fallbackMode: ProjectionFallbackMode;\n nonOverridable: true;\n thresholdMs: number;\n}\n\nexport interface ProjectionStalenessInput {\n endpointClass: ProjectionEndpointClass;\n lastSuccessfulSyncAt?: number;\n nowMs?: number;\n queueBacklogAgeMs: number;\n queueFailedCount: number;\n queuePendingCount: number;\n}\n\nexport interface ProjectionStalenessEnvelope {\n endpointClass: ProjectionEndpointClass;\n evaluatedAt: number;\n fallbackMode: ProjectionFallbackMode;\n isStale: boolean;\n lastSuccessfulSyncAgeMs?: number;\n lastSuccessfulSyncAt?: number;\n queueFailedCount: number;\n queuePendingCount: number;\n reasonCode:\n | \"PROJECTION_HEALTHY\"\n | \"PROJECTION_STALE\"\n | \"PROJECTION_STALE_WITH_FAILED_RETRIES\";\n stalenessMs: number;\n thresholdMs: number;\n}\n\nexport const PROJECTION_STALENESS_POLICIES: Record<\n ProjectionEndpointClass,\n ProjectionStalenessPolicy\n> = {\n analytics: {\n endpointClass: \"analytics\",\n thresholdMs: 30_000,\n fallbackMode: \"fail_with_503\",\n nonOverridable: true,\n },\n traversal: {\n endpointClass: \"traversal\",\n thresholdMs: 60_000,\n fallbackMode: \"degrade_to_convex_depth_limited\",\n nonOverridable: true,\n },\n entity_read: {\n endpointClass: \"entity_read\",\n thresholdMs: 5 * 60_000,\n fallbackMode: \"fallback_to_convex_entity_read\",\n nonOverridable: true,\n },\n non_graph: {\n endpointClass: \"non_graph\",\n thresholdMs: Number.POSITIVE_INFINITY,\n fallbackMode: \"none\",\n nonOverridable: true,\n },\n};\n\nexport function getProjectionStalenessPolicy(\n endpointClass: ProjectionEndpointClass\n): ProjectionStalenessPolicy {\n return PROJECTION_STALENESS_POLICIES[endpointClass];\n}\n\nexport function evaluateProjectionStaleness(\n input: ProjectionStalenessInput\n): ProjectionStalenessEnvelope {\n const policy = getProjectionStalenessPolicy(input.endpointClass);\n const evaluatedAt = input.nowMs ?? Date.now();\n const stalenessMs = Math.max(0, input.queueBacklogAgeMs);\n const isStale = stalenessMs > policy.thresholdMs;\n const lastSuccessfulSyncAgeMs =\n input.lastSuccessfulSyncAt === undefined\n ? undefined\n : Math.max(0, evaluatedAt - input.lastSuccessfulSyncAt);\n\n return {\n endpointClass: input.endpointClass,\n stalenessMs,\n thresholdMs: policy.thresholdMs,\n isStale,\n fallbackMode: policy.fallbackMode,\n queuePendingCount: input.queuePendingCount,\n queueFailedCount: input.queueFailedCount,\n evaluatedAt,\n lastSuccessfulSyncAt: input.lastSuccessfulSyncAt,\n lastSuccessfulSyncAgeMs,\n reasonCode: projectionStalenessReasonCode(isStale, input.queueFailedCount),\n };\n}\n\nfunction projectionStalenessReasonCode(\n isStale: boolean,\n queueFailedCount: number\n): ProjectionStalenessEnvelope[\"reasonCode\"] {\n if (!isStale) {\n return \"PROJECTION_HEALTHY\";\n }\n return queueFailedCount > 0\n ? \"PROJECTION_STALE_WITH_FAILED_RETRIES\"\n : \"PROJECTION_STALE\";\n}\n\nexport function shouldFailClosedForProjection(\n envelope: ProjectionStalenessEnvelope\n): boolean {\n return envelope.isStale && envelope.fallbackMode === \"fail_with_503\";\n}\n","// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\n/**\n * Projection Reconciliation Runtime\n *\n * Phase 2 (WT-C) runtime hooks for Convex-authoritative / Neo4j-projected\n * reconciliation health and endpoint-class staleness evaluation.\n */\n\nimport { getCurrentUserId } from \"@lucern/access-control/auth\";\nimport { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\nimport { v } from \"convex/values\";\nimport type { ActionCtx, QueryCtx } from \"./convex\";\nimport { internal, internalAction, internalQuery, query } from \"./convex\";\nimport {\n evaluateProjectionStaleness,\n type ProjectionEndpointClass,\n} from \"./projectionStaleness\";\n\ntype QueueStatus = \"pending\" | \"in_progress\" | \"failed\" | \"succeeded\";\n\ninterface QueueRow {\n createdAt: number;\n status: QueueStatus;\n updatedAt: number;\n}\n\ninterface IndexQueryBuilder {\n eq(field: string, value: unknown): IndexQueryBuilder;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction readQueueStatus(value: unknown, context: string): QueueStatus {\n if (\n value !== \"pending\" &&\n value !== \"in_progress\" &&\n value !== \"failed\" &&\n value !== \"succeeded\"\n ) {\n throw new Error(`${context} has invalid or missing status.`);\n }\n return value;\n}\n\nfunction readFiniteNumber(\n row: Record<string, unknown>,\n field: \"createdAt\" | \"updatedAt\",\n context: string\n): number {\n const value = row[field];\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new Error(`${context} has invalid or missing ${field}.`);\n }\n return value;\n}\n\nfunction readQueueRow(value: unknown, context: string): QueueRow {\n if (!isRecord(value)) {\n throw new Error(`${context} must be an object.`);\n }\n return {\n createdAt: readFiniteNumber(value, \"createdAt\", context),\n status: readQueueStatus(value.status, context),\n updatedAt: readFiniteNumber(value, \"updatedAt\", context),\n };\n}\n\nfunction readQueueRows(values: unknown[], context: string): QueueRow[] {\n return values.map((value, index) =>\n readQueueRow(value, `${context}[${index}]`)\n );\n}\n\nasync function getQueueRowsByStatus(\n ctx: QueryCtx,\n status: QueueStatus\n): Promise<QueueRow[]> {\n return readQueueRows(\n await ctx.db\n .query(\"neo4jSyncQueue\")\n .withIndex(\"by_status\", (q: IndexQueryBuilder) => q.eq(\"status\", status))\n .collect(),\n `neo4jSyncQueue.${status}`\n );\n}\n\nfunction maxTimestamp(\n rows: QueueRow[],\n field: \"createdAt\" | \"updatedAt\"\n): number | undefined {\n let maxValue: number | undefined;\n for (const row of rows) {\n const value = row[field];\n if (!Number.isFinite(value)) {\n continue;\n }\n if (maxValue === undefined || value > maxValue) {\n maxValue = value;\n }\n }\n return maxValue;\n}\n\nfunction minTimestamp(\n rows: QueueRow[],\n field: \"createdAt\" | \"updatedAt\"\n): number | undefined {\n let minValue: number | undefined;\n for (const row of rows) {\n const value = row[field];\n if (!Number.isFinite(value)) {\n continue;\n }\n if (minValue === undefined || value < minValue) {\n minValue = value;\n }\n }\n return minValue;\n}\n\nasync function getQueueSnapshot(ctx: QueryCtx) {\n const [pendingRows, inProgressRows, failedRows, succeededRows] =\n await Promise.all([\n getQueueRowsByStatus(ctx, \"pending\"),\n getQueueRowsByStatus(ctx, \"in_progress\"),\n getQueueRowsByStatus(ctx, \"failed\"),\n getQueueRowsByStatus(ctx, \"succeeded\"),\n ]);\n\n const now = Date.now();\n const backlogOldestCreatedAt = minTimestamp(\n [...pendingRows, ...inProgressRows],\n \"createdAt\"\n );\n const queueBacklogAgeMs =\n backlogOldestCreatedAt === undefined\n ? 0\n : Math.max(0, now - backlogOldestCreatedAt);\n const lastSuccessfulSyncAt = maxTimestamp(succeededRows, \"updatedAt\");\n\n return {\n now,\n queuePendingCount: pendingRows.length,\n queueInProgressCount: inProgressRows.length,\n queueFailedCount: failedRows.length,\n queueSucceededCount: succeededRows.length,\n queueBacklogAgeMs,\n backlogOldestCreatedAt,\n lastSuccessfulSyncAt,\n };\n}\n\nfunction buildEndpointAssessments(\n snapshot: Awaited<ReturnType<typeof getQueueSnapshot>>\n) {\n const analytics = evaluateProjectionStaleness({\n endpointClass: \"analytics\",\n queueBacklogAgeMs: snapshot.queueBacklogAgeMs,\n queuePendingCount:\n snapshot.queuePendingCount + snapshot.queueInProgressCount,\n queueFailedCount: snapshot.queueFailedCount,\n nowMs: snapshot.now,\n lastSuccessfulSyncAt: snapshot.lastSuccessfulSyncAt,\n });\n const traversal = evaluateProjectionStaleness({\n endpointClass: \"traversal\",\n queueBacklogAgeMs: snapshot.queueBacklogAgeMs,\n queuePendingCount:\n snapshot.queuePendingCount + snapshot.queueInProgressCount,\n queueFailedCount: snapshot.queueFailedCount,\n nowMs: snapshot.now,\n lastSuccessfulSyncAt: snapshot.lastSuccessfulSyncAt,\n });\n const entityRead = evaluateProjectionStaleness({\n endpointClass: \"entity_read\",\n queueBacklogAgeMs: snapshot.queueBacklogAgeMs,\n queuePendingCount:\n snapshot.queuePendingCount + snapshot.queueInProgressCount,\n queueFailedCount: snapshot.queueFailedCount,\n nowMs: snapshot.now,\n lastSuccessfulSyncAt: snapshot.lastSuccessfulSyncAt,\n });\n const nonGraph = evaluateProjectionStaleness({\n endpointClass: \"non_graph\",\n queueBacklogAgeMs: snapshot.queueBacklogAgeMs,\n queuePendingCount:\n snapshot.queuePendingCount + snapshot.queueInProgressCount,\n queueFailedCount: snapshot.queueFailedCount,\n nowMs: snapshot.now,\n lastSuccessfulSyncAt: snapshot.lastSuccessfulSyncAt,\n });\n\n return {\n analytics,\n traversal,\n entityRead,\n nonGraph,\n };\n}\n\nfunction buildProjectionReconciliationStatus(\n snapshot: Awaited<ReturnType<typeof getQueueSnapshot>>\n) {\n return {\n ...snapshot,\n endpointAssessments: buildEndpointAssessments(snapshot),\n generatedAt: snapshot.now,\n };\n}\n\nfunction assertAuthenticated(clerkId: string | null): string {\n if (!clerkId) {\n throw new Error(\"Authentication required\");\n }\n return clerkId;\n}\n\nexport const getProjectionReconciliationStatusInternal = internalQuery({\n args: {},\n returns: permissiveReturn,\n handler: async (ctx: QueryCtx) => {\n const snapshot = await getQueueSnapshot(ctx);\n return buildProjectionReconciliationStatus(snapshot);\n },\n});\n\nexport const getProjectionReconciliationStatus = query({\n args: {},\n returns: permissiveReturn,\n handler: async (ctx: QueryCtx) => {\n assertAuthenticated(await getCurrentUserId(ctx));\n const snapshot = await getQueueSnapshot(ctx);\n return buildProjectionReconciliationStatus(snapshot);\n },\n});\n\nexport const assessProjectionStaleness = query({\n args: {\n endpointClass: v.union(\n v.literal(\"analytics\"),\n v.literal(\"traversal\"),\n v.literal(\"entity_read\"),\n v.literal(\"non_graph\")\n ),\n },\n returns: permissiveReturn,\n handler: async (\n ctx: QueryCtx,\n args: { endpointClass: ProjectionEndpointClass }\n ) => {\n assertAuthenticated(await getCurrentUserId(ctx));\n const snapshot = await getQueueSnapshot(ctx);\n const endpointClass = args.endpointClass as ProjectionEndpointClass;\n\n return {\n endpointClass,\n assessment: evaluateProjectionStaleness({\n endpointClass,\n queueBacklogAgeMs: snapshot.queueBacklogAgeMs,\n queuePendingCount:\n snapshot.queuePendingCount + snapshot.queueInProgressCount,\n queueFailedCount: snapshot.queueFailedCount,\n nowMs: snapshot.now,\n lastSuccessfulSyncAt: snapshot.lastSuccessfulSyncAt,\n }),\n snapshot,\n };\n },\n});\n\nexport const runProjectionRepairCycle = internalAction({\n args: {\n limit: v.optional(v.number()),\n },\n returns: permissiveReturn,\n handler: async (ctx: ActionCtx, args: { limit?: number }) => {\n const processed = await ctx.runAction(\n internal.neo4jSync.processRetryQueue,\n {\n limit: args.limit ?? 25,\n }\n );\n const status = await ctx.runQuery(\n internal.projectionReconciliation\n .getProjectionReconciliationStatusInternal,\n {}\n );\n\n return {\n processed,\n status,\n runAt: Date.now(),\n };\n },\n});\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/projectionStaleness.ts"],"names":[],"mappings":";AAkDO,IAAM,6BAAA,GAGT;AAAA,EACF,SAAA,EAAW;AAAA,IACT,aAAA,EAAe,WAAA;AAAA,IACf,WAAA,EAAa,GAAA;AAAA,IACb,YAAA,EAAc,eAAA;AAAA,IACd,cAAA,EAAgB;AAAA,GAClB;AAAA,EACA,SAAA,EAAW;AAAA,IACT,aAAA,EAAe,WAAA;AAAA,IACf,WAAA,EAAa,GAAA;AAAA,IACb,YAAA,EAAc,iCAAA;AAAA,IACd,cAAA,EAAgB;AAAA,GAClB;AAAA,EACA,WAAA,EAAa;AAAA,IACX,aAAA,EAAe,aAAA;AAAA,IACf,aAAa,CAAA,GAAI,GAAA;AAAA,IACjB,YAAA,EAAc,gCAAA;AAAA,IACd,cAAA,EAAgB;AAAA,GAClB;AAAA,EACA,SAAA,EAAW;AAAA,IACT,aAAA,EAAe,WAAA;AAAA,IACf,aAAa,MAAA,CAAO,iBAAA;AAAA,IACpB,YAAA,EAAc,MAAA;AAAA,IACd,cAAA,EAAgB;AAAA;AAEpB;AAEO,SAAS,6BACd,aAAA,EAC2B;AAC3B,EAAA,OAAO,8BAA8B,aAAa,CAAA;AACpD;AAEO,SAAS,4BACd,KAAA,EAC6B;AAC7B,EAAA,MAAM,MAAA,GAAS,4BAAA,CAA6B,KAAA,CAAM,aAAa,CAAA;AAC/D,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,KAAA,IAAS,IAAA,CAAK,GAAA,EAAI;AAC5C,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAM,iBAAiB,CAAA;AACvD,EAAA,MAAM,OAAA,GAAU,cAAc,MAAA,CAAO,WAAA;AACrC,EAAA,MAAM,uBAAA,GACJ,KAAA,CAAM,oBAAA,KAAyB,MAAA,GAC3B,MAAA,GACA,KAAK,GAAA,CAAI,CAAA,EAAG,WAAA,GAAc,KAAA,CAAM,oBAAoB,CAAA;AAE1D,EAAA,OAAO;AAAA,IACL,eAAe,KAAA,CAAM,aAAA;AAAA,IACrB,WAAA;AAAA,IACA,aAAa,MAAA,CAAO,WAAA;AAAA,IACpB,OAAA;AAAA,IACA,cAAc,MAAA,CAAO,YAAA;AAAA,IACrB,mBAAmB,KAAA,CAAM,iBAAA;AAAA,IACzB,kBAAkB,KAAA,CAAM,gBAAA;AAAA,IACxB,WAAA;AAAA,IACA,sBAAsB,KAAA,CAAM,oBAAA;AAAA,IAC5B,uBAAA;AAAA,IACA,UAAA,EAAY,6BAAA,CAA8B,OAAA,EAAS,KAAA,CAAM,gBAAgB;AAAA,GAC3E;AACF;AAEA,SAAS,6BAAA,CACP,SACA,gBAAA,EAC2C;AAC3C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,oBAAA;AAAA,EACT;AACA,EAAA,OAAO,gBAAA,GAAmB,IACtB,sCAAA,GACA,kBAAA;AACN;AAEO,SAAS,8BACd,QAAA,EACS;AACT,EAAA,OAAO,QAAA,CAAS,OAAA,IAAW,QAAA,CAAS,YAAA,KAAiB,eAAA;AACvD","file":"projectionStaleness.js","sourcesContent":["// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\n/**\n * projectionStaleness module implementation.\n */\n\nexport type ProjectionEndpointClass =\n | \"analytics\"\n | \"traversal\"\n | \"entity_read\"\n | \"non_graph\";\n\nexport type ProjectionFallbackMode =\n | \"fail_with_503\"\n | \"degrade_to_convex_depth_limited\"\n | \"fallback_to_convex_entity_read\"\n | \"none\";\n\nexport interface ProjectionStalenessPolicy {\n endpointClass: ProjectionEndpointClass;\n fallbackMode: ProjectionFallbackMode;\n nonOverridable: true;\n thresholdMs: number;\n}\n\nexport interface ProjectionStalenessInput {\n endpointClass: ProjectionEndpointClass;\n lastSuccessfulSyncAt?: number;\n nowMs?: number;\n queueBacklogAgeMs: number;\n queueFailedCount: number;\n queuePendingCount: number;\n}\n\nexport interface ProjectionStalenessEnvelope {\n endpointClass: ProjectionEndpointClass;\n evaluatedAt: number;\n fallbackMode: ProjectionFallbackMode;\n isStale: boolean;\n lastSuccessfulSyncAgeMs?: number;\n lastSuccessfulSyncAt?: number;\n queueFailedCount: number;\n queuePendingCount: number;\n reasonCode:\n | \"PROJECTION_HEALTHY\"\n | \"PROJECTION_STALE\"\n | \"PROJECTION_STALE_WITH_FAILED_RETRIES\";\n stalenessMs: number;\n thresholdMs: number;\n}\n\nexport const PROJECTION_STALENESS_POLICIES: Record<\n ProjectionEndpointClass,\n ProjectionStalenessPolicy\n> = {\n analytics: {\n endpointClass: \"analytics\",\n thresholdMs: 30_000,\n fallbackMode: \"fail_with_503\",\n nonOverridable: true,\n },\n traversal: {\n endpointClass: \"traversal\",\n thresholdMs: 60_000,\n fallbackMode: \"degrade_to_convex_depth_limited\",\n nonOverridable: true,\n },\n entity_read: {\n endpointClass: \"entity_read\",\n thresholdMs: 5 * 60_000,\n fallbackMode: \"fallback_to_convex_entity_read\",\n nonOverridable: true,\n },\n non_graph: {\n endpointClass: \"non_graph\",\n thresholdMs: Number.POSITIVE_INFINITY,\n fallbackMode: \"none\",\n nonOverridable: true,\n },\n};\n\nexport function getProjectionStalenessPolicy(\n endpointClass: ProjectionEndpointClass\n): ProjectionStalenessPolicy {\n return PROJECTION_STALENESS_POLICIES[endpointClass];\n}\n\nexport function evaluateProjectionStaleness(\n input: ProjectionStalenessInput\n): ProjectionStalenessEnvelope {\n const policy = getProjectionStalenessPolicy(input.endpointClass);\n const evaluatedAt = input.nowMs ?? Date.now();\n const stalenessMs = Math.max(0, input.queueBacklogAgeMs);\n const isStale = stalenessMs > policy.thresholdMs;\n const lastSuccessfulSyncAgeMs =\n input.lastSuccessfulSyncAt === undefined\n ? undefined\n : Math.max(0, evaluatedAt - input.lastSuccessfulSyncAt);\n\n return {\n endpointClass: input.endpointClass,\n stalenessMs,\n thresholdMs: policy.thresholdMs,\n isStale,\n fallbackMode: policy.fallbackMode,\n queuePendingCount: input.queuePendingCount,\n queueFailedCount: input.queueFailedCount,\n evaluatedAt,\n lastSuccessfulSyncAt: input.lastSuccessfulSyncAt,\n lastSuccessfulSyncAgeMs,\n reasonCode: projectionStalenessReasonCode(isStale, input.queueFailedCount),\n };\n}\n\nfunction projectionStalenessReasonCode(\n isStale: boolean,\n queueFailedCount: number\n): ProjectionStalenessEnvelope[\"reasonCode\"] {\n if (!isStale) {\n return \"PROJECTION_HEALTHY\";\n }\n return queueFailedCount > 0\n ? \"PROJECTION_STALE_WITH_FAILED_RETRIES\"\n : \"PROJECTION_STALE\";\n}\n\nexport function shouldFailClosedForProjection(\n envelope: ProjectionStalenessEnvelope\n): boolean {\n return envelope.isStale && envelope.fallbackMode === \"fail_with_503\";\n}\n"]}
|