@lucern/graph-primitives 1.0.37 → 1.0.39

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.
Files changed (216) hide show
  1. package/dist/beliefDecay.js +0 -2
  2. package/dist/beliefEvidenceLinks.js +2 -3
  3. package/dist/beliefEvidenceLinks.operational.js +2 -3
  4. package/dist/beliefLifecycle.js +0 -2
  5. package/dist/confidencePropagationDispatch.js +0 -2
  6. package/dist/contradictions.js +0 -2
  7. package/dist/convex.js +0 -2
  8. package/dist/debug.js +0 -2
  9. package/dist/edgeValidation.js +0 -2
  10. package/dist/edges/contains.js +0 -2
  11. package/dist/edges/contradicts.js +0 -2
  12. package/dist/edges/depends-on.js +0 -2
  13. package/dist/edges/derived-from.js +0 -2
  14. package/dist/edges/elaborates.js +0 -2
  15. package/dist/edges/index.js +0 -2
  16. package/dist/edges/informs.js +0 -2
  17. package/dist/edges/propagation-types.js +0 -2
  18. package/dist/edges/refutes.js +0 -2
  19. package/dist/edges/supports.js +0 -2
  20. package/dist/edges/tests.js +0 -2
  21. package/dist/edges/utils.js +0 -2
  22. package/dist/embeddingTrigger.js +0 -2
  23. package/dist/entityBridge.js +0 -2
  24. package/dist/entityCanonicalMatch.js +0 -2
  25. package/dist/entityLifecycle.js +2 -3
  26. package/dist/entityValidation.js +0 -2
  27. package/dist/epistemicAnswers.js +2 -3
  28. package/dist/epistemicBeliefs.admin.js +0 -2
  29. package/dist/epistemicBeliefs.backfills.js +0 -2
  30. package/dist/epistemicBeliefs.confidence.js +0 -2
  31. package/dist/epistemicBeliefs.core.js +2 -3
  32. package/dist/epistemicBeliefs.forkEvidence.js +0 -2
  33. package/dist/epistemicBeliefs.helpers.js +0 -2
  34. package/dist/epistemicBeliefs.internal.js +2 -3
  35. package/dist/epistemicBeliefs.js +2 -3
  36. package/dist/epistemicBeliefs.lifecycle.js +0 -2
  37. package/dist/epistemicBeliefs.links.js +2 -3
  38. package/dist/epistemicBeliefs.queries.js +0 -2
  39. package/dist/epistemicBeliefs.topicAnchor.js +2 -3
  40. package/dist/epistemicContractHelpers.js +0 -2
  41. package/dist/epistemicContracts.evaluators.js +0 -2
  42. package/dist/epistemicContracts.handlers.js +0 -2
  43. package/dist/epistemicContracts.js +0 -2
  44. package/dist/epistemicContracts.metrics.js +0 -2
  45. package/dist/epistemicContracts.types.js +0 -2
  46. package/dist/epistemicEdgeCreation.js +0 -2
  47. package/dist/epistemicEdges.handlers.js +3 -3
  48. package/dist/epistemicEdges.helpers.js +0 -2
  49. package/dist/epistemicEdges.js +3 -3
  50. package/dist/epistemicEdges.mutations.js +0 -2
  51. package/dist/epistemicEdges.queries.js +0 -2
  52. package/dist/epistemicEdges.types.js +0 -2
  53. package/dist/epistemicEvidence.js +3 -3
  54. package/dist/epistemicEvidenceHelpers.js +0 -2
  55. package/dist/epistemicEvidenceMutations.js +3 -3
  56. package/dist/epistemicEvidenceQueries.js +0 -2
  57. package/dist/epistemicHelpers.js +2 -3
  58. package/dist/epistemicInsert.js +2 -3
  59. package/dist/epistemicLayerRules.js +0 -2
  60. package/dist/epistemicLinking.js +0 -2
  61. package/dist/epistemicNodeCreation.js +2 -3
  62. package/dist/epistemicNodes.helpers.js +0 -2
  63. package/dist/epistemicNodes.internal.js +2 -3
  64. package/dist/epistemicNodes.js +2 -3
  65. package/dist/epistemicNodes.mutations.js +2 -3
  66. package/dist/epistemicNodes.queries.js +0 -2
  67. package/dist/epistemicNodes.validators.js +0 -2
  68. package/dist/epistemicQuestions.conviction.js +0 -2
  69. package/dist/epistemicQuestions.create.js +2 -3
  70. package/dist/epistemicQuestions.evidence.js +2 -3
  71. package/dist/epistemicQuestions.helpers.js +0 -2
  72. package/dist/epistemicQuestions.js +2 -3
  73. package/dist/epistemicQuestions.lifecycle.js +0 -2
  74. package/dist/epistemicQuestions.queries.js +0 -2
  75. package/dist/epistemicQuestions.sprint.js +0 -2
  76. package/dist/epistemicQuestions.tail.js +2 -3
  77. package/dist/epistemicSources.js +2 -3
  78. package/dist/evaluators/index.js +0 -2
  79. package/dist/evaluators/lint-checker-evaluator.js +0 -2
  80. package/dist/evaluators/sentry-checker-evaluator.js +0 -2
  81. package/dist/evaluators/shared.js +0 -2
  82. package/dist/evaluators/test-runner-evaluator.js +0 -2
  83. package/dist/evaluators/tsc-checker-evaluator.js +0 -2
  84. package/dist/globalId.js +0 -2
  85. package/dist/graphTypes.js +0 -2
  86. package/dist/helpers.js +0 -2
  87. package/dist/index.js +4 -3
  88. package/dist/invariantEnforcement.js +0 -2
  89. package/dist/logicalRoleInference.js +0 -2
  90. package/dist/matcherFeedbackUtils.js +0 -2
  91. package/dist/ontology-matching.js +0 -2
  92. package/dist/ontologyApproval.js +0 -2
  93. package/dist/ontologyDefinitions.js +0 -2
  94. package/dist/ontologyHelpers.js +0 -2
  95. package/dist/ontologyRegistry.js +0 -2
  96. package/dist/projectionReconciliation.js +0 -2
  97. package/dist/projectionStaleness.js +0 -2
  98. package/dist/proof-attestation.json +1 -1
  99. package/dist/questionEvidenceLinks.js +0 -2
  100. package/dist/resolverTypes.js +0 -2
  101. package/dist/resolvers.js +0 -2
  102. package/dist/scopeResolverCompat.js +0 -2
  103. package/dist/text-matching.js +0 -2
  104. package/dist/topicOntologyResolver.js +0 -2
  105. package/dist/topicProjectOverlay.js +0 -2
  106. package/dist/topicScope.js +0 -2
  107. package/dist/workflowBridge.js +0 -2
  108. package/dist/workspaceIsolation.js +0 -2
  109. package/package.json +4 -4
  110. package/dist/beliefDecay.js.map +0 -1
  111. package/dist/beliefEvidenceLinks.js.map +0 -1
  112. package/dist/beliefEvidenceLinks.operational.js.map +0 -1
  113. package/dist/beliefLifecycle.js.map +0 -1
  114. package/dist/confidencePropagationDispatch.js.map +0 -1
  115. package/dist/contradictions.js.map +0 -1
  116. package/dist/convex.js.map +0 -1
  117. package/dist/debug.js.map +0 -1
  118. package/dist/edgeValidation.js.map +0 -1
  119. package/dist/edges/contains.js.map +0 -1
  120. package/dist/edges/contradicts.js.map +0 -1
  121. package/dist/edges/depends-on.js.map +0 -1
  122. package/dist/edges/derived-from.js.map +0 -1
  123. package/dist/edges/elaborates.js.map +0 -1
  124. package/dist/edges/index.js.map +0 -1
  125. package/dist/edges/informs.js.map +0 -1
  126. package/dist/edges/propagation-types.js.map +0 -1
  127. package/dist/edges/refutes.js.map +0 -1
  128. package/dist/edges/supports.js.map +0 -1
  129. package/dist/edges/tests.js.map +0 -1
  130. package/dist/edges/utils.js.map +0 -1
  131. package/dist/embeddingTrigger.js.map +0 -1
  132. package/dist/entityBridge.js.map +0 -1
  133. package/dist/entityCanonicalMatch.js.map +0 -1
  134. package/dist/entityLifecycle.js.map +0 -1
  135. package/dist/entityValidation.js.map +0 -1
  136. package/dist/epistemicAnswers.js.map +0 -1
  137. package/dist/epistemicBeliefs.admin.js.map +0 -1
  138. package/dist/epistemicBeliefs.backfills.js.map +0 -1
  139. package/dist/epistemicBeliefs.confidence.js.map +0 -1
  140. package/dist/epistemicBeliefs.core.js.map +0 -1
  141. package/dist/epistemicBeliefs.forkEvidence.js.map +0 -1
  142. package/dist/epistemicBeliefs.helpers.js.map +0 -1
  143. package/dist/epistemicBeliefs.internal.js.map +0 -1
  144. package/dist/epistemicBeliefs.js.map +0 -1
  145. package/dist/epistemicBeliefs.lifecycle.js.map +0 -1
  146. package/dist/epistemicBeliefs.links.js.map +0 -1
  147. package/dist/epistemicBeliefs.queries.js.map +0 -1
  148. package/dist/epistemicBeliefs.topicAnchor.js.map +0 -1
  149. package/dist/epistemicContractHelpers.js.map +0 -1
  150. package/dist/epistemicContracts.evaluators.js.map +0 -1
  151. package/dist/epistemicContracts.handlers.js.map +0 -1
  152. package/dist/epistemicContracts.js.map +0 -1
  153. package/dist/epistemicContracts.metrics.js.map +0 -1
  154. package/dist/epistemicContracts.types.js.map +0 -1
  155. package/dist/epistemicEdgeCreation.js.map +0 -1
  156. package/dist/epistemicEdges.handlers.js.map +0 -1
  157. package/dist/epistemicEdges.helpers.js.map +0 -1
  158. package/dist/epistemicEdges.js.map +0 -1
  159. package/dist/epistemicEdges.mutations.js.map +0 -1
  160. package/dist/epistemicEdges.queries.js.map +0 -1
  161. package/dist/epistemicEdges.types.js.map +0 -1
  162. package/dist/epistemicEvidence.js.map +0 -1
  163. package/dist/epistemicEvidenceHelpers.js.map +0 -1
  164. package/dist/epistemicEvidenceMutations.js.map +0 -1
  165. package/dist/epistemicEvidenceQueries.js.map +0 -1
  166. package/dist/epistemicHelpers.js.map +0 -1
  167. package/dist/epistemicInsert.js.map +0 -1
  168. package/dist/epistemicLayerRules.js.map +0 -1
  169. package/dist/epistemicLinking.js.map +0 -1
  170. package/dist/epistemicNodeCreation.js.map +0 -1
  171. package/dist/epistemicNodes.helpers.js.map +0 -1
  172. package/dist/epistemicNodes.internal.js.map +0 -1
  173. package/dist/epistemicNodes.js.map +0 -1
  174. package/dist/epistemicNodes.mutations.js.map +0 -1
  175. package/dist/epistemicNodes.queries.js.map +0 -1
  176. package/dist/epistemicNodes.validators.js.map +0 -1
  177. package/dist/epistemicQuestions.conviction.js.map +0 -1
  178. package/dist/epistemicQuestions.create.js.map +0 -1
  179. package/dist/epistemicQuestions.evidence.js.map +0 -1
  180. package/dist/epistemicQuestions.helpers.js.map +0 -1
  181. package/dist/epistemicQuestions.js.map +0 -1
  182. package/dist/epistemicQuestions.lifecycle.js.map +0 -1
  183. package/dist/epistemicQuestions.queries.js.map +0 -1
  184. package/dist/epistemicQuestions.sprint.js.map +0 -1
  185. package/dist/epistemicQuestions.tail.js.map +0 -1
  186. package/dist/epistemicSources.js.map +0 -1
  187. package/dist/evaluators/index.js.map +0 -1
  188. package/dist/evaluators/lint-checker-evaluator.js.map +0 -1
  189. package/dist/evaluators/sentry-checker-evaluator.js.map +0 -1
  190. package/dist/evaluators/shared.js.map +0 -1
  191. package/dist/evaluators/test-runner-evaluator.js.map +0 -1
  192. package/dist/evaluators/tsc-checker-evaluator.js.map +0 -1
  193. package/dist/globalId.js.map +0 -1
  194. package/dist/graphTypes.js.map +0 -1
  195. package/dist/helpers.js.map +0 -1
  196. package/dist/index.js.map +0 -1
  197. package/dist/invariantEnforcement.js.map +0 -1
  198. package/dist/logicalRoleInference.js.map +0 -1
  199. package/dist/matcherFeedbackUtils.js.map +0 -1
  200. package/dist/ontology-matching.js.map +0 -1
  201. package/dist/ontologyApproval.js.map +0 -1
  202. package/dist/ontologyDefinitions.js.map +0 -1
  203. package/dist/ontologyHelpers.js.map +0 -1
  204. package/dist/ontologyRegistry.js.map +0 -1
  205. package/dist/projectionReconciliation.js.map +0 -1
  206. package/dist/projectionStaleness.js.map +0 -1
  207. package/dist/questionEvidenceLinks.js.map +0 -1
  208. package/dist/resolverTypes.js.map +0 -1
  209. package/dist/resolvers.js.map +0 -1
  210. package/dist/scopeResolverCompat.js.map +0 -1
  211. package/dist/text-matching.js.map +0 -1
  212. package/dist/topicOntologyResolver.js.map +0 -1
  213. package/dist/topicProjectOverlay.js.map +0 -1
  214. package/dist/topicScope.js.map +0 -1
  215. package/dist/workflowBridge.js.map +0 -1
  216. package/dist/workspaceIsolation.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/convex.ts","../src/entityCanonicalMatch.ts","../src/entityValidation.ts","../src/epistemicInsert.ts","../src/debug.ts","../src/topicProjectOverlay.ts","../src/resolvers.ts","../src/topicOntologyResolver.ts","../src/topicScope.ts","../src/entityLifecycle.ts"],"names":["isMissingLucernChildComponentError","getErrorMessage","LEGACY_SCOPE_FIELD","query","readStringArray","v"],"mappings":"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","file":"entityLifecycle.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 * Canonical-entity match helpers — pure text-normalization, title-derivation,\n * and record-matching predicates behind the canonical-entity dedup/lookup path\n * in entityLifecycle.ts. Extracted from entityLifecycle.ts (the mutations/queries\n * registration stays there) so the module stays under the long-file hard gate;\n * pure code motion, no logic delta.\n */\nimport type { Id } from \"./convex\";\n\nexport interface CanonicalEntityRecord {\n _id: Id<\"epistemicNodes\">;\n canonicalText?: string;\n contentHash?: string;\n domain?: string;\n epistemicLayer?: string;\n externalIds?: Record<string, unknown>;\n globalId?: string;\n metadata?: Record<string, unknown>;\n nodeType?: string;\n projectId?: string;\n status?: string;\n subtype?: string;\n tags?: string[];\n tenantId?: string;\n title?: string;\n verificationStatus?: string;\n workspaceId?: string;\n}\n\nexport function normalizeCanonicalEntityText(value: string): string {\n return value.trim().toLowerCase().replace(/\\s+/g, \" \");\n}\n\nexport function buildEntityTitle(canonicalText: string): string {\n return (\n canonicalText.slice(0, 100) + (canonicalText.length > 100 ? \"...\" : \"\")\n );\n}\n\nexport function matchesCanonicalEntityRecord(\n node: CanonicalEntityRecord,\n args: {\n nodeType?: string;\n tenantId?: string;\n contentHash?: string;\n includeArchived?: boolean;\n }\n): boolean {\n if (node.epistemicLayer !== \"ontological\") {\n return false;\n }\n if (node.workspaceId !== undefined) {\n return false;\n }\n if (args.nodeType && node.nodeType !== args.nodeType) {\n return false;\n }\n if (args.contentHash && node.contentHash !== args.contentHash) {\n return false;\n }\n const rowTenantId =\n typeof node.tenantId === \"string\" && node.tenantId.trim().length > 0\n ? node.tenantId.trim()\n : undefined;\n if (rowTenantId !== args.tenantId) {\n return false;\n }\n if (args.includeArchived) {\n return node.status !== \"deleted\";\n }\n return node.status === \"active\";\n}\n","// biome-ignore-all lint/style/useFilenamingConvention: Public ABI surface; rename requires a cross-package migration update.\n/**\n * Entity Metadata Validation\n *\n * Validates entity metadata against registered schemas in schemaEnumConfig.\n * Strict on create (must pass), lenient on read (existing data tolerance).\n *\n * @module graph-primitives/entityValidation\n */\n\nimport type { MutationCtx, QueryCtx } from \"./convex\";\n\ninterface UnknownRecord {\n [key: string]: unknown;\n}\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\ntype EntitySchemaConfigFieldType = \"string\" | \"number\" | \"boolean\";\n\ninterface EntitySchemaConfigEntry {\n required: boolean;\n type: EntitySchemaConfigFieldType;\n}\n\ninterface FieldSchema {\n required: boolean;\n type: EntitySchemaConfigFieldType;\n}\n\ntype EntitySchema = Record<string, FieldSchema>;\n\ninterface SchemaEnumConfigRow {\n metadata?: UnknownRecord;\n status?: string;\n value?: string;\n}\n\nfunction isObjectLike(value: unknown): value is UnknownRecord {\n return value !== null && typeof value === \"object\";\n}\n\nfunction isEntitySchemaConfigField(\n value: unknown\n): value is EntitySchemaConfigEntry {\n if (!isObjectLike(value)) {\n return false;\n }\n const required = value.required;\n const type = value.type;\n return (\n typeof required === \"boolean\" &&\n (type === \"string\" || type === \"number\" || type === \"boolean\")\n );\n}\n\nfunction readEntitySchema(value: unknown): EntitySchema {\n if (!isObjectLike(value)) {\n return {};\n }\n const schema: EntitySchema = {};\n for (const [fieldName, fieldValue] of Object.entries(value)) {\n if (!isEntitySchemaConfigField(fieldValue)) {\n continue;\n }\n schema[fieldName] = fieldValue;\n }\n return schema;\n}\n\nfunction readSchemaEnumConfigRow(row: unknown): SchemaEnumConfigRow | null {\n if (!isObjectLike(row)) {\n return null;\n }\n\n const value = row.value;\n if (typeof value !== \"string\") {\n return null;\n }\n\n return {\n value,\n status: typeof row.status === \"string\" ? row.status : undefined,\n metadata: isObjectLike(row.metadata) ? row.metadata : undefined,\n };\n}\n\nfunction readEntitySchemaFromConfig(row: unknown): EntitySchema | null {\n const parsed = readSchemaEnumConfigRow(row);\n if (parsed?.status !== \"active\" || !parsed?.metadata) {\n return null;\n }\n\n const schema = parsed.metadata.schema;\n if (!schema) {\n return null;\n }\n\n return readEntitySchema(schema);\n}\n\ninterface ValidationResult {\n errors: string[];\n valid: boolean;\n}\n\n// =============================================================================\n// SCHEMA LOOKUP\n// =============================================================================\n\n/**\n * Fetch the registered metadata schema for an entity type.\n * Returns null if no schema is registered.\n */\nexport async function getEntityTypeSchema(\n ctx: QueryCtx | MutationCtx,\n nodeType: string,\n tenantId?: string\n): Promise<EntitySchema | null> {\n // Try tenant-specific first, then platform default\n if (tenantId) {\n const tenantEntries = await ctx.db\n .query(\"schemaEnumConfig\")\n .withIndex(\"by_tenant_category\", (q) =>\n q.eq(\"tenantId\", tenantId).eq(\"category\", \"entity_type\")\n )\n .collect();\n\n const tenantMatch = tenantEntries.find((entry) => {\n const parsed = readSchemaEnumConfigRow(entry);\n return (\n parsed !== null &&\n parsed.value === nodeType &&\n parsed.status === \"active\"\n );\n });\n const tenantSchema = readEntitySchemaFromConfig(tenantMatch);\n if (tenantSchema !== null) {\n return tenantSchema;\n }\n }\n\n // Fall back to platform default\n const platformEntry = await ctx.db\n .query(\"schemaEnumConfig\")\n .withIndex(\"by_category_value\", (q) =>\n q.eq(\"category\", \"entity_type\").eq(\"value\", nodeType)\n )\n .first();\n\n const platformSchema = readEntitySchemaFromConfig(platformEntry);\n if (platformSchema !== null) {\n return platformSchema;\n }\n\n return null;\n}\n\n// =============================================================================\n// VALIDATION\n// =============================================================================\n\n/**\n * Validate entity metadata against the registered schema.\n *\n * Policy: strict on create (unregistered types fail), lenient on read.\n *\n * @param ctx - Convex query/mutation context\n * @param nodeType - The entity nodeType (e.g., \"company\", \"person\")\n * @param metadata - The metadata object to validate\n * @param tenantId - Optional tenant ID for tenant-specific schemas\n * @returns ValidationResult with errors if invalid\n */\nexport async function validateEntityMetadata(\n ctx: QueryCtx | MutationCtx,\n nodeType: string,\n metadata: Record<string, unknown> | undefined | null,\n tenantId?: string\n): Promise<ValidationResult> {\n const errors: string[] = [];\n\n const schema = await getEntityTypeSchema(ctx, nodeType, tenantId);\n\n if (!schema) {\n return {\n valid: false,\n errors: [\n `No registered schema for entity type \"${nodeType}\". Register it in schemaEnumConfig (category=\"entity_type\") before creating entities of this type.`,\n ],\n };\n }\n\n const meta = metadata || {};\n\n // Check required fields\n for (const [fieldName, fieldDef] of Object.entries(schema)) {\n if (fieldDef.required) {\n const value = meta[fieldName];\n if (value === undefined || value === null || value === \"\") {\n errors.push(`Required field \"${fieldName}\" is missing or empty`);\n }\n }\n }\n\n // Check field types for provided fields\n for (const [fieldName, value] of Object.entries(meta)) {\n const fieldDef = schema[fieldName];\n if (!fieldDef) {\n // Extra fields are allowed (loose metadata tolerance)\n continue;\n }\n\n if (value === undefined || value === null) {\n // null/undefined are allowed for optional fields (already caught above for required)\n continue;\n }\n\n const actualType = typeof value;\n if (actualType !== fieldDef.type) {\n errors.push(\n `Field \"${fieldName}\" expected type \"${fieldDef.type}\" but got \"${actualType}\"`\n );\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\n/**\n * Check if a nodeType is a registered entity type (platform or tenant).\n */\nexport async function isRegisteredEntityType(\n ctx: QueryCtx | MutationCtx,\n nodeType: string,\n tenantId?: string\n): Promise<boolean> {\n const schema = await getEntityTypeSchema(ctx, nodeType, tenantId);\n return schema !== null;\n}\n","// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\nimport {\n assertEdgePolicyAllowed,\n type EpistemicNodeType,\n edgePolicyManifest,\n} from \"@lucern/contracts\";\nimport {\n assertStorageEdgeVocabulary,\n assertUuidShapedEdgeEndpoint,\n assertUuidV7Identity,\n} from \"@lucern/contracts/ids\";\nimport type { Id, MutationCtx } from \"./convex\";\n\ninterface GlobalIdIndexQuery {\n eq(field: \"globalId\", value: string): GlobalIdIndexQuery;\n}\n\ninterface EpistemicNodeInsertDoc extends Record<string, unknown> {\n globalId: string;\n}\n\ninterface EpistemicEdgeInsertDoc extends Record<string, unknown> {\n edgeType: string;\n fromNodeId: string;\n fromNodeType?: string;\n globalId: string;\n toNodeId: string;\n toNodeType?: string;\n}\n\nexport function insertEpistemicNode(\n ctx: MutationCtx,\n doc: EpistemicNodeInsertDoc\n): Promise<Id<\"epistemicNodes\">> {\n assertUuidV7Identity(\"epistemicNodes\", doc.globalId);\n return ctx.db.insert(\"epistemicNodes\", doc);\n}\n\n/**\n * C2-RR.4b — REFERENTIAL edge-endpoint canonicality (amends RR.4's FORMAT guard).\n *\n * Proves an endpoint is the UUIDv7 `globalId` of an EXISTING\n * `epistemicNodes` row. Refuses doc ids, fabricated/unknown endpoints, and\n * legacy UUIDv4 `globalId`s; those must be reminted through the identity\n * backfill ledger before participating in new edge writes.\n */\nasync function assertExistingNodeEndpoint(\n ctx: MutationCtx,\n endpointRole: \"fromNodeId\" | \"toNodeId\",\n endpoint: string\n): Promise<void> {\n assertUuidShapedEdgeEndpoint(endpointRole, endpoint);\n const node = await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_globalId\", (q: GlobalIdIndexQuery) =>\n q.eq(\"globalId\", endpoint)\n )\n .first();\n if (!node) {\n throw new Error(\n `edge_endpoint_not_canonical: epistemicEdges insert requires ${endpointRole} to be the globalId of an existing epistemicNodes row, received ${endpoint} (no node with that globalId)`\n );\n }\n}\n\nexport async function insertEpistemicEdge(\n ctx: MutationCtx,\n doc: EpistemicEdgeInsertDoc\n): Promise<Id<\"epistemicEdges\">> {\n assertUuidV7Identity(\"epistemicEdges\", doc.globalId);\n\n // R1.1a — STORAGE-VOCABULARY MEMBERSHIP\n assertStorageEdgeVocabulary(doc.edgeType);\n\n // R1.1b — ENDPOINT PRESENCE\n if (!doc.fromNodeId || typeof doc.fromNodeId !== \"string\") {\n throw new Error(\n \"edge_endpoint_missing: epistemicEdges insert requires a non-empty fromNodeId\"\n );\n }\n if (!doc.toNodeId || typeof doc.toNodeId !== \"string\") {\n throw new Error(\n \"edge_endpoint_missing: epistemicEdges insert requires a non-empty toNodeId\"\n );\n }\n\n // C2-RR.4b Defect E (REFERENTIAL) — ENDPOINT CANONICAL IDENTITY. Edge\n // endpoints must each be the globalId of an EXISTING epistemicNodes row,\n // never a Convex doc id, a legacy topic id, or a fabricated/unknown uuid.\n // This refuses mixed _id/globalId endpoint writes at the floor and keeps\n // legacy UUIDv4 graph rows inside the explicit remint/backfill lane.\n await assertExistingNodeEndpoint(ctx, \"fromNodeId\", doc.fromNodeId);\n await assertExistingNodeEndpoint(ctx, \"toNodeId\", doc.toNodeId);\n\n // R1.1c — FULL POLICY ASSERT (when nodeTypes are present and edgeType is in public manifest)\n if (doc.fromNodeType && doc.toNodeType && doc.edgeType !== \"extracted_from\") {\n assertEdgePolicyAllowed(\n edgePolicyManifest,\n doc.edgeType,\n {\n kind: \"epistemic_node\",\n nodeId: doc.fromNodeId,\n nodeType: doc.fromNodeType as EpistemicNodeType,\n },\n {\n kind: \"epistemic_node\",\n nodeId: doc.toNodeId,\n nodeType: doc.toNodeType as EpistemicNodeType,\n }\n );\n }\n\n return ctx.db.insert(\"epistemicEdges\", doc);\n}\n","interface GraphPrimitiveDebugEnvironment {\n process?: {\n env?: Record<string, string | undefined>;\n };\n}\n\nfunction isGraphPrimitiveDebugEnabled(): boolean {\n const env = (globalThis as GraphPrimitiveDebugEnvironment).process?.env;\n return (\n env?.LUCERN_COMPAT_FALLBACK_DEBUG === \"1\" || env?.LUCERN_GRAPH_DEBUG === \"1\"\n );\n}\n\nexport function formatGraphPrimitiveError(error: unknown): string {\n if (error instanceof Error) {\n return `${error.name}: ${error.message}`;\n }\n if (typeof error === \"string\") {\n return error;\n }\n if (error === null) {\n return \"null\";\n }\n if (error === undefined) {\n return \"undefined\";\n }\n try {\n return JSON.stringify(error);\n } catch {\n return Object.prototype.toString.call(error);\n }\n}\n\nexport function debugGraphPrimitiveFallback(\n message: string,\n context?: Record<string, unknown>\n): void {\n if (!isGraphPrimitiveDebugEnabled()) {\n return;\n }\n console.debug(message, context ?? {});\n}\n","// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\nimport type {\n DatabaseReader,\n DatabaseWriter,\n Id,\n MutationCtx,\n QueryCtx,\n} from \"./convex\";\nimport { api } from \"./convex\";\nimport { debugGraphPrimitiveFallback } from \"./debug\";\n\ntype OverlayIdMode = \"legacy\" | \"topic\";\nconst LEGACY_SCOPE_FIELD = \"graphScopeProjectId\";\n\ninterface LegacyProjectThesis {\n confidence: number;\n lastUpdated: number;\n statement: string;\n}\n\ntype LegacyPillarImportance = \"critical\" | \"major\" | \"minor\" | \"not_applicable\";\n\ninterface LegacyThesisPillarConfig {\n aiSuggestion?: {\n suggestedAt: number;\n reasoning: string;\n };\n configuredAt?: number;\n configuredBy?: string;\n pillarImportance?: Record<string, LegacyPillarImportance | undefined>;\n}\n\ninterface LegacyBeliefArchitecture {\n lastCalculated: number;\n overallMaturity: number;\n pillarScores: Record<string, unknown>[];\n}\n\ninterface LegacyOntologyClassification {\n classifiedAt: number;\n functions: Record<string, unknown>[];\n overallConfidence: number;\n valueChains: Record<string, unknown>[];\n}\n\ntype TopicDocLike = Record<string, unknown> & {\n _id: string;\n _creationTime?: number;\n globalId?: string;\n name?: string;\n description?: string;\n type?: string;\n tenantId?: string;\n workspaceId?: string;\n status?: string;\n visibility?: string;\n createdBy?: string;\n /** FR.7 creator-grant: the exact acting principal recorded as owner-principal. */\n ownerPrincipalId?: string;\n createdAt?: number;\n updatedAt?: number;\n metadata?: Record<string, unknown>;\n};\n\nexport type TopicProjectOverlay = Record<string, unknown> & {\n _id: string;\n projectId: string;\n topicId: string;\n storageProjectId: string;\n legacyProjectId?: string;\n name: string;\n type: string;\n description?: string;\n ownerId: string;\n /** FR.7 creator-grant: principal-shaped owner; distinct from clerkId-shaped ownerId. */\n ownerPrincipalId?: string;\n sharedWith: string[];\n visibility: \"private\" | \"team\" | \"firm\" | \"external\" | \"public\";\n tenantId?: string;\n workspaceId?: string;\n status: \"active\" | \"archived\" | \"watching\";\n tags: string[];\n chatCount: number;\n artifactCount: number;\n lastActivityAt: number;\n thesis?: LegacyProjectThesis;\n wedgeHypothesis?: string;\n founderArchetype?: string;\n investmentCriteria?: string[];\n sprintPhase?:\n | \"pre_sprint\"\n | \"readiness_check\"\n | \"thesis_crystallization\"\n | \"sprint_planning\"\n | \"active_sprint\"\n | \"theme_assembly\"\n | \"evolution\";\n currentSprintIndex?: number;\n thesisPillarConfig?: LegacyThesisPillarConfig;\n beliefArchitecture?: LegacyBeliefArchitecture;\n ontologyClassification?: LegacyOntologyClassification;\n _creationTime: number;\n createdAt: number;\n updatedAt: number;\n};\n\ninterface OverlayContext {\n db?: Pick<DatabaseReader, \"get\" | \"query\"> &\n Partial<Pick<DatabaseWriter, \"patch\">>;\n runMutation?: MutationCtx[\"runMutation\"];\n runQuery?: QueryCtx[\"runQuery\"];\n}\n\ninterface TopicPatchPlan {\n nextMetadata: Record<string, unknown>;\n patch: Record<string, unknown>;\n topicUpdateArgs: Record<string, unknown> & { id: string };\n}\n\nfunction readNonEmptyString(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return;\n }\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction readStringArray(value: unknown): string[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value\n .map((entry) => readNonEmptyString(entry))\n .filter((entry): entry is string => Boolean(entry));\n}\n\nfunction readMetadata(topic: TopicDocLike): Record<string, unknown> {\n return topic.metadata && typeof topic.metadata === \"object\"\n ? topic.metadata\n : {};\n}\n\nfunction omitMetadataKey(\n metadata: Record<string, unknown>,\n key: string\n): Record<string, unknown> {\n const { [key]: _omitted, ...rest } = metadata;\n return rest;\n}\n\nfunction readLegacyProjectId(\n value: Record<string, unknown> | null | undefined\n): string | undefined {\n if (!value) {\n return;\n }\n return readNonEmptyString(value[LEGACY_SCOPE_FIELD]);\n}\n\nfunction coerceVisibility(\n value: unknown\n): TopicProjectOverlay[\"visibility\"] | undefined {\n return value === \"private\" ||\n value === \"team\" ||\n value === \"firm\" ||\n value === \"external\" ||\n value === \"public\"\n ? value\n : undefined;\n}\n\nfunction coerceStatus(\n value: unknown\n): TopicProjectOverlay[\"status\"] | undefined {\n return value === \"active\" || value === \"archived\" || value === \"watching\"\n ? value\n : undefined;\n}\n\nfunction mapProjectType(\n topic: TopicDocLike,\n metadata: Record<string, unknown>\n): string {\n const explicit = readNonEmptyString(metadata.projectType);\n if (explicit) {\n return explicit;\n }\n if (topic.type === \"theme\") {\n return \"thematic\";\n }\n return readNonEmptyString(topic.type) || \"general\";\n}\n\nfunction isProjectLikeTopic(topic: TopicDocLike): boolean {\n const metadata = readMetadata(topic);\n return (\n topic.type === \"theme\" ||\n topic.type === \"thematic\" ||\n topic.type === \"deal\" ||\n topic.type === \"monitoring\" ||\n readLegacyProjectId(topic) !== undefined ||\n readNonEmptyString(metadata.projectType) !== undefined\n );\n}\n\nfunction isMissingLucernChildComponentError(error: unknown): boolean {\n const message = getErrorMessage(error);\n return (\n message.includes(\n 'Child component ComponentName(Identifier(\"lucern\")) not found'\n ) ||\n (message.includes(\"Child component\") &&\n message.includes(\"lucern\") &&\n message.includes(\"not found\"))\n );\n}\n\nfunction getErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"message\" in error &&\n typeof (error as { message?: unknown }).message === \"string\"\n ) {\n return (error as { message: string }).message;\n }\n return \"unknown error\";\n}\n\nasync function resolveTopicDoc(\n ctx: OverlayContext,\n scopeId: string\n): Promise<TopicDocLike | null> {\n if (ctx?.db && typeof ctx.db.get === \"function\") {\n try {\n const directTopic = (await ctx.db.get(\n scopeId as Id<\"topics\">\n )) as TopicDocLike | null;\n if (directTopic) {\n return directTopic;\n }\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicProjectOverlay] Failed to resolve topic by direct ID\",\n {\n error,\n scopeId,\n }\n );\n // Not a direct topics-table id.\n }\n }\n\n if (typeof ctx.runQuery !== \"function\") {\n return null;\n }\n\n try {\n const topic = await ctx.runQuery<TopicDocLike | null>(api.topics.get, {\n id: String(scopeId),\n });\n if (topic?.name !== undefined && topic?.type !== undefined) {\n return topic as TopicDocLike;\n }\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicProjectOverlay] Failed to resolve topic by ID query\",\n {\n error,\n scopeId,\n }\n );\n // Fall through to legacy-scope lookup.\n }\n\n try {\n const topic = await ctx.runQuery<TopicDocLike | null>(\n api.topics.getByLegacyScopeId,\n {\n projectId: String(scopeId),\n }\n );\n if (topic?.name !== undefined && topic?.type !== undefined) {\n return topic as TopicDocLike;\n }\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicProjectOverlay] Failed to resolve topic by legacy scope ID\",\n { error, scopeId }\n );\n // Best-effort compat lookup only.\n }\n\n return null;\n}\n\nexport function materializeTopicProjectOverlay(\n topic: TopicDocLike,\n idMode: OverlayIdMode = \"legacy\"\n): TopicProjectOverlay {\n const metadata = readMetadata(topic);\n const topicId = String(topic._id);\n const legacyProjectId =\n readLegacyProjectId(topic) ||\n readLegacyProjectId(metadata) ||\n readNonEmptyString(metadata.legacyProjectId);\n const storageProjectId = legacyProjectId || topicId;\n const outwardId = idMode === \"topic\" ? topicId : storageProjectId;\n const visibility =\n coerceVisibility(topic.visibility) ||\n coerceVisibility(metadata.visibility) ||\n \"private\";\n const status =\n coerceStatus(topic.status) || coerceStatus(metadata.status) || \"active\";\n let createdAt = 0;\n if (typeof topic.createdAt === \"number\") {\n createdAt = topic.createdAt;\n } else if (typeof topic._creationTime === \"number\") {\n createdAt = topic._creationTime;\n }\n let updatedAt = createdAt;\n if (typeof topic.updatedAt === \"number\") {\n updatedAt = topic.updatedAt;\n } else if (typeof metadata.updatedAt === \"number\") {\n updatedAt = metadata.updatedAt;\n }\n\n return {\n ...metadata,\n _id: outwardId,\n projectId: outwardId,\n topicId,\n storageProjectId,\n legacyProjectId,\n name: readNonEmptyString(topic.name) || \"Untitled Theme\",\n type: mapProjectType(topic, metadata),\n description: readNonEmptyString(topic.description),\n ownerId:\n readNonEmptyString(metadata.ownerId) ||\n readNonEmptyString(topic.createdBy) ||\n \"system\",\n // FR.7 creator-grant: surface the principal-shaped owner field (column-first,\n // metadata fallback for legacy rows that recorded it in metadata).\n ownerPrincipalId:\n readNonEmptyString(topic.ownerPrincipalId) ||\n readNonEmptyString(metadata.ownerPrincipalId),\n // RR.1 carrier: preserve the nested metadata carrier so the kernel's\n // `checkProjectAccessDetailed` metadata-PRIMARY read\n // (`project.metadata?.ownerPrincipalId`) resolves the grant. The `...metadata`\n // spread above only flattens keys; it does not leave a nested `metadata`.\n metadata,\n sharedWith: readStringArray(metadata.sharedWith),\n visibility,\n tenantId:\n readNonEmptyString(topic.tenantId) ||\n readNonEmptyString(metadata.tenantId),\n workspaceId:\n readNonEmptyString(topic.workspaceId) ||\n readNonEmptyString(metadata.workspaceId),\n status,\n tags: readStringArray(metadata.tags),\n chatCount:\n typeof metadata.chatCount === \"number\"\n ? (metadata.chatCount as number)\n : 0,\n artifactCount:\n typeof metadata.artifactCount === \"number\"\n ? (metadata.artifactCount as number)\n : 0,\n lastActivityAt:\n typeof metadata.lastActivityAt === \"number\"\n ? (metadata.lastActivityAt as number)\n : updatedAt,\n _creationTime:\n typeof topic._creationTime === \"number\" ? topic._creationTime : createdAt,\n createdAt,\n updatedAt,\n };\n}\n\nexport async function resolveTopicProjectOverlay(\n ctx: OverlayContext,\n scopeId: string,\n options: {\n idMode?: OverlayIdMode;\n projectLikeOnly?: boolean;\n } = {}\n): Promise<TopicProjectOverlay | null> {\n const topic = await resolveTopicDoc(ctx, scopeId);\n if (!topic) {\n return null;\n }\n if (options.projectLikeOnly !== false && !isProjectLikeTopic(topic)) {\n return null;\n }\n return materializeTopicProjectOverlay(topic, options.idMode);\n}\n\nexport async function listTopicProjectOverlays(\n ctx: OverlayContext,\n options: {\n idMode?: OverlayIdMode;\n projectLikeOnly?: boolean;\n } = {}\n): Promise<TopicProjectOverlay[]> {\n let allTopics: TopicDocLike[] = [];\n\n if (ctx?.db?.query && typeof ctx.db.query === \"function\") {\n try {\n allTopics = (await ctx.db.query(\"topics\").collect()) as TopicDocLike[];\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicProjectOverlay] Failed to read topics table; falling back to API\",\n { error }\n );\n allTopics = [];\n }\n }\n\n if (allTopics.length === 0 && typeof ctx.runQuery === \"function\") {\n allTopics =\n (((await ctx.runQuery(api.topics.list, {})) ?? []) as TopicDocLike[]) ||\n [];\n }\n\n return allTopics\n .filter(\n (topic) => options.projectLikeOnly === false || isProjectLikeTopic(topic)\n )\n .map((topic) => materializeTopicProjectOverlay(topic, options.idMode));\n}\n\nexport async function patchTopicProjectOverlay(\n ctx: OverlayContext,\n scopeId: string,\n value: Record<string, unknown>\n): Promise<TopicProjectOverlay | null> {\n const topic = await resolveTopicDoc(ctx, scopeId);\n if (!topic) {\n return null;\n }\n\n const plan = buildTopicProjectOverlayPatchPlan(topic, value);\n await applyTopicProjectOverlayPatch(ctx, topic, plan);\n\n return materializeTopicProjectOverlay({\n ...topic,\n ...plan.patch,\n metadata: plan.nextMetadata,\n } as TopicDocLike);\n}\n\nfunction buildTopicProjectOverlayPatchPlan(\n topic: TopicDocLike,\n value: Record<string, unknown>\n): TopicPatchPlan {\n const plan: TopicPatchPlan = {\n nextMetadata: { ...readMetadata(topic) },\n patch: {},\n topicUpdateArgs: {\n id: String(topic._id),\n },\n };\n for (const [key, rawValue] of Object.entries(value)) {\n applyTopicProjectOverlayPatchEntry(plan, key, rawValue);\n }\n\n plan.patch.updatedAt = Date.now();\n plan.patch.metadata = plan.nextMetadata;\n plan.topicUpdateArgs.metadata = plan.nextMetadata;\n\n return plan;\n}\n\nfunction applyTopicProjectOverlayPatchEntry(\n plan: TopicPatchPlan,\n key: string,\n rawValue: unknown\n) {\n switch (key) {\n case \"_id\":\n case \"projectId\":\n case \"topicId\":\n case \"legacyProjectId\":\n case \"storageProjectId\":\n case \"updatedAt\":\n case \"createdAt\":\n return;\n case \"name\":\n case \"description\":\n plan.patch[key] = rawValue;\n plan.topicUpdateArgs[key] = rawValue;\n return;\n case \"tenantId\":\n case \"workspaceId\":\n case \"ownerId\":\n throw new Error(\n `patchTopicProjectOverlay cannot mutate ${key} via component-owned topics`\n );\n case \"status\":\n applyTopicStatusPatch(plan, rawValue);\n return;\n case \"visibility\":\n applyTopicVisibilityPatch(plan, rawValue);\n return;\n case \"type\":\n applyTopicProjectTypePatch(plan, rawValue);\n return;\n default:\n applyTopicMetadataPatch(plan, key, rawValue);\n }\n}\n\nfunction applyTopicStatusPatch(plan: TopicPatchPlan, rawValue: unknown) {\n const status = coerceStatus(rawValue);\n if (status) {\n plan.patch.status = status;\n plan.topicUpdateArgs.status = status;\n }\n}\n\nfunction applyTopicVisibilityPatch(plan: TopicPatchPlan, rawValue: unknown) {\n const visibility = coerceVisibility(rawValue);\n if (visibility) {\n plan.patch.visibility = visibility;\n plan.topicUpdateArgs.visibility = visibility;\n }\n}\n\nfunction applyTopicProjectTypePatch(plan: TopicPatchPlan, rawValue: unknown) {\n const projectType = readNonEmptyString(rawValue);\n if (projectType) {\n plan.nextMetadata.projectType = projectType;\n return;\n }\n plan.nextMetadata = omitMetadataKey(plan.nextMetadata, \"projectType\");\n}\n\nfunction applyTopicMetadataPatch(\n plan: TopicPatchPlan,\n key: string,\n rawValue: unknown\n) {\n if (rawValue === undefined) {\n plan.nextMetadata = omitMetadataKey(plan.nextMetadata, key);\n return;\n }\n plan.nextMetadata[key] = rawValue;\n}\n\nasync function applyTopicProjectOverlayPatch(\n ctx: OverlayContext,\n topic: TopicDocLike,\n plan: TopicPatchPlan\n): Promise<void> {\n if (typeof ctx.runMutation === \"function\") {\n try {\n await ctx.runMutation(api.topics.update, plan.topicUpdateArgs);\n } catch (error) {\n if (!canPatchTopicViaLocalDb(ctx, error)) {\n throw error;\n }\n await ctx.db.patch(topic._id as Id<\"topics\">, plan.patch);\n }\n } else if (ctx?.db && typeof ctx.db.patch === \"function\") {\n await ctx.db.patch(topic._id as Id<\"topics\">, plan.patch);\n } else {\n throw new Error(\n \"Cannot patch topic without component adapter (ctx.runMutation unavailable)\"\n );\n }\n}\n\nfunction canPatchTopicViaLocalDb(\n ctx: OverlayContext,\n error: unknown\n): ctx is {\n db: Pick<DatabaseReader, \"get\" | \"query\"> & Pick<DatabaseWriter, \"patch\">;\n} {\n return (\n isMissingLucernChildComponentError(error) &&\n Boolean(ctx?.db) &&\n typeof ctx.db?.patch === \"function\"\n );\n}\n\nexport function matchesTopicProjectOverlayAccess(\n accessibleProjectIds: Set<string>,\n project: {\n topicId: string;\n legacyProjectId?: string;\n storageProjectId?: string;\n }\n): boolean {\n return (\n accessibleProjectIds.has(project.storageProjectId || project.topicId) ||\n accessibleProjectIds.has(project.topicId) ||\n (typeof project.legacyProjectId === \"string\" &&\n accessibleProjectIds.has(project.legacyProjectId))\n );\n}\n","/** Data-source resolver wiring for the graph-primitives module. */\n\nimport type {\n GraphPrimitivesAppResolverContext,\n GraphPrimitivesAppResolvers,\n} from \"./resolverTypes\";\nimport {\n listTopicProjectOverlays,\n patchTopicProjectOverlay,\n resolveTopicProjectOverlay,\n} from \"./topicProjectOverlay\";\n\nfunction isMissingLucernChildComponentError(error: unknown): boolean {\n const message = getErrorMessage(error);\n return (\n message.includes(\n 'Child component ComponentName(Identifier(\"lucern\")) not found'\n ) ||\n (message.includes(\"Child component\") &&\n message.includes(\"lucern\") &&\n message.includes(\"not found\"))\n );\n}\n\nfunction getErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"message\" in error &&\n typeof (error as { message?: unknown }).message === \"string\"\n ) {\n return (error as { message: string }).message;\n }\n return \"unknown error\";\n}\n\nfunction isAdvisoryTopicPatch(value: Record<string, unknown>): boolean {\n const advisoryKeys = new Set([\"lastActivityAt\", \"updatedAt\"]);\n const keys = Object.keys(value);\n return keys.length > 0 && keys.every((key) => advisoryKeys.has(key));\n}\n\nasync function patchProjectWithTolerance(\n ctx: GraphPrimitivesAppResolverContext,\n projectId: string,\n value: Record<string, unknown>\n): Promise<void> {\n try {\n await patchTopicProjectOverlay(ctx, projectId, value);\n } catch (error) {\n if (\n !(\n isAdvisoryTopicPatch(value) && isMissingLucernChildComponentError(error)\n )\n ) {\n throw error;\n }\n\n console.warn(\n \"[lucern graph-primitives] Non-fatal advisory topic patch failure\",\n {\n projectId,\n keys: Object.keys(value),\n error: getErrorMessage(error),\n }\n );\n }\n}\n\nfunction defaultResolvers(): GraphPrimitivesAppResolvers {\n return {\n getProject: (ctx, projectId) =>\n resolveTopicProjectOverlay(ctx, projectId, {\n idMode: \"legacy\",\n projectLikeOnly: false,\n }),\n patchProject: (ctx, projectId, value) =>\n patchProjectWithTolerance(ctx, projectId, value),\n listTopics: (ctx) =>\n listTopicProjectOverlays(ctx, {\n idMode: \"legacy\",\n }),\n getFinalArtifact: (ctx, artifactId) => ctx.db.get(artifactId),\n };\n}\n\nlet resolverOverrides: Partial<GraphPrimitivesAppResolvers> = {};\n\nexport function configureGraphPrimitivesAppResolvers(\n overrides: Partial<GraphPrimitivesAppResolvers>\n): void {\n resolverOverrides = {\n ...resolverOverrides,\n ...overrides,\n };\n}\n\nexport function resetGraphPrimitivesAppResolvers(): void {\n resolverOverrides = {};\n}\n\nexport function resolveGraphPrimitivesAppResolvers(\n _ctx: GraphPrimitivesAppResolverContext\n): GraphPrimitivesAppResolvers {\n return {\n ...defaultResolvers(),\n ...resolverOverrides,\n };\n}\n","// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\n/**\n * Topic Ontology Resolution — Hybrid Inheritance\n *\n * Resolves the effective ontology for a topic by walking the parent chain.\n *\n * Strategy:\n * - If the topic has an ontologyId, return its ontology definition.\n * - Otherwise, walk up the parent chain until an ancestor with an ontologyId is found.\n * - Returns null if no ancestor in the chain has an ontology binding.\n *\n * This is a helper function callable from within Convex mutation/query handlers.\n * For the public query API, see topics.resolveTopicOntology.\n *\n * @module graph-primitives/topicOntologyResolver\n */\n\nimport type { DatabaseReader, Id } from \"./convex\";\n\n// Minimal topic shape needed for resolution (avoids importing full generated types)\ninterface TopicDoc {\n _id: Id<\"topics\">;\n depth: number;\n name: string;\n ontologyId?: Id<\"ontologyDefinitions\">;\n parentTopicId?: Id<\"topics\">;\n}\n\ninterface OntologyDef {\n _id: Id<\"ontologyDefinitions\">;\n name: string;\n ontologyKey: string;\n status: \"draft\" | \"active\" | \"deprecated\" | \"archived\";\n tier: \"platform\" | \"pack\" | \"tenant\";\n}\n\ninterface OntologyVer {\n _id: Id<\"ontologyVersions\">;\n edgeTypes: Array<{ value: string; label: string; description?: string }>;\n entityTypes: Array<{ value: string; label: string; description?: string }>;\n ontologyId: Id<\"ontologyDefinitions\">;\n publishedAt?: number;\n status: \"draft\" | \"published\" | \"deprecated\";\n version: string;\n}\n\nexport interface ResolvedTopicOntology {\n ontologyId: Id<\"ontologyDefinitions\">;\n ontologyKey: string;\n ontologyName: string;\n /** The published version, if any */\n publishedVersion: OntologyVer | null;\n source: \"direct\" | \"inherited\";\n sourceTopicId: Id<\"topics\">;\n tier: string;\n /** Valid edge type values from the latest published version */\n validEdgeTypes: string[];\n /** Valid entity type values from the latest published version */\n validEntityTypes: string[];\n}\n\nconst MAX_RESOLUTION_DEPTH = 10;\n\ninterface TopicOntologyCtx {\n db: DatabaseReader;\n}\n\nasync function loadTopic(\n ctx: TopicOntologyCtx,\n topicId: Id<\"topics\">\n): Promise<TopicDoc | null> {\n return (await ctx.db.get(topicId)) as unknown as TopicDoc | null;\n}\n\nasync function loadOntologyDefinition(\n ctx: TopicOntologyCtx,\n ontologyId: Id<\"ontologyDefinitions\">\n): Promise<OntologyDef | null> {\n return (await ctx.db.get(ontologyId)) as unknown as OntologyDef | null;\n}\n\nasync function loadPublishedOntologyVersions(\n ctx: TopicOntologyCtx,\n ontologyId: Id<\"ontologyDefinitions\">\n): Promise<OntologyVer[]> {\n const versions = (await ctx.db\n .query(\"ontologyVersions\")\n .withIndex(\"by_ontologyId\", (q) => q.eq(\"ontologyId\", ontologyId))\n .collect()) as unknown as OntologyVer[];\n\n return versions\n .filter((version) => version.status === \"published\")\n .sort((a, b) => (b.publishedAt ?? 0) - (a.publishedAt ?? 0));\n}\n\nfunction resolvedTopicOntology(args: {\n latestPublished: OntologyVer | null;\n ontologyDef: OntologyDef;\n source: \"direct\" | \"inherited\";\n sourceTopicId: Id<\"topics\">;\n}): ResolvedTopicOntology {\n return {\n ontologyId: args.ontologyDef._id,\n ontologyKey: args.ontologyDef.ontologyKey,\n ontologyName: args.ontologyDef.name,\n publishedVersion: args.latestPublished,\n source: args.source,\n sourceTopicId: args.sourceTopicId,\n tier: args.ontologyDef.tier,\n validEdgeTypes:\n args.latestPublished?.edgeTypes.map((edgeType) => edgeType.value) ?? [],\n validEntityTypes:\n args.latestPublished?.entityTypes.map((entityType) => entityType.value) ??\n [],\n };\n}\n\nasync function resolveCurrentTopicOntology(args: {\n ctx: TopicOntologyCtx;\n current: TopicDoc;\n startTopicId: Id<\"topics\">;\n}): Promise<ResolvedTopicOntology | \"continue\" | null> {\n if (!args.current.ontologyId) {\n return \"continue\";\n }\n\n const ontologyDef = await loadOntologyDefinition(\n args.ctx,\n args.current.ontologyId\n );\n if (!ontologyDef || ontologyDef.status === \"archived\") {\n return args.current.parentTopicId ? \"continue\" : null;\n }\n\n const published = await loadPublishedOntologyVersions(\n args.ctx,\n args.current.ontologyId\n );\n\n return resolvedTopicOntology({\n latestPublished: published[0] ?? null,\n ontologyDef,\n source: args.current._id === args.startTopicId ? \"direct\" : \"inherited\",\n sourceTopicId: args.current._id,\n });\n}\n\n/**\n * Resolve the effective ontology for a topic.\n *\n * @param ctx - Convex mutation/query context with db access\n * @param topicId - The topic to resolve the ontology for\n * @returns The resolved ontology or null if none is bound in the ancestor chain\n */\nexport async function resolveTopicOntologyInternal(\n ctx: TopicOntologyCtx,\n topicId: Id<\"topics\">\n): Promise<ResolvedTopicOntology | null> {\n let current = await loadTopic(ctx, topicId);\n if (!current) {\n return null;\n }\n\n const startTopicId = topicId;\n\n for (let i = 0; i < MAX_RESOLUTION_DEPTH && current; i++) {\n const resolved = await resolveCurrentTopicOntology({\n ctx,\n current,\n startTopicId,\n });\n if (resolved !== \"continue\") {\n return resolved;\n }\n\n // No ontologyId on this topic — walk up\n if (!current.parentTopicId) {\n break;\n }\n current = await loadTopic(ctx, current.parentTopicId);\n }\n\n return null;\n}\n\n/**\n * Validate that a nodeType is allowed by the resolved ontology for a topic.\n *\n * Returns { valid: true } if:\n * - The topic has no bound ontology (no constraint)\n * - The nodeType is in the ontology's published entity types\n *\n * Returns { valid: false, error } if:\n * - The topic has a bound ontology and the nodeType is not in its entity types\n */\nexport async function validateEntityTypeForTopic(\n ctx: TopicOntologyCtx,\n topicId: Id<\"topics\">,\n nodeType: string\n): Promise<{ valid: true } | { valid: false; error: string }> {\n const resolved = await resolveTopicOntologyInternal(ctx, topicId);\n\n // No ontology bound — all entity types are allowed\n if (!resolved) {\n return { valid: true };\n }\n\n // No published version — ontology exists but has no content yet, allow all\n if (resolved.validEntityTypes.length === 0) {\n return { valid: true };\n }\n\n // Check if nodeType is in the ontology's entity types\n if (resolved.validEntityTypes.includes(nodeType)) {\n return { valid: true };\n }\n\n return {\n valid: false,\n error: `Entity type \"${nodeType}\" is not defined in the ontology \"${resolved.ontologyKey}\" (${resolved.ontologyName}). Valid entity types: ${resolved.validEntityTypes.join(\", \")}. Source: ${resolved.source} from topic ${resolved.sourceTopicId}.`,\n };\n}\n","// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\n/** Topic-scope resolution helpers for graph-primitive operations. */\nimport { v } from \"convex/values\";\nimport type { Id } from \"./convex\";\nimport { api as appApi } from \"./convex\";\nimport { debugGraphPrimitiveFallback } from \"./debug\";\n\nconst LEGACY_SCOPE_FIELD = \"graphScopeProjectId\";\n\ntype UnknownRecord = Record<string, unknown>;\n\ninterface TopicScopeContext {\n db: {\n get(id: string): Promise<unknown>;\n query(tableName: string): TopicScopeQuery;\n };\n runQuery?: <TResult>(fnRef: unknown, args: unknown) => Promise<TResult>;\n}\n\ninterface TopicScopeQuery {\n collect(): Promise<unknown[]>;\n first(): Promise<unknown | null>;\n withIndex(\n indexName: string,\n range?: (q: TopicScopeIndexRangeBuilder) => unknown\n ): TopicScopeQuery;\n}\n\ninterface TopicScopeIndexRangeBuilder {\n eq(field: string, value: unknown): TopicScopeIndexRangeBuilder;\n}\n\ntype TopicDoc = Record<string, unknown> & {\n _id: Id<\"topics\">;\n globalId?: string;\n name?: string;\n depth?: number;\n createdAt?: number;\n parentTopicId?: Id<\"topics\">;\n tenantId?: string;\n workspaceId?: string;\n metadata?: Record<string, unknown>;\n};\n\nexport interface TopicProjectScope {\n projectId?: string;\n source: \"topic\" | \"project_mapped_topic\" | \"topic_inferred\" | \"topic_node\";\n tenantId?: string;\n topicId: Id<\"topics\">;\n workspaceId?: string;\n}\n\n/**\n * RR.5 (legacy topics-table retirement) — graph-primitives mirror of the\n * kernel's epistemicNodes-first topic-scope fallback. Kept in lockstep with\n * `packages/reasoning-kernel/src/adapters/lib/topicScope.ts`\n * (`tests/unit/convex/topic-scope-fallbacks.test.ts` asserts parity).\n *\n * Resolves a topic that exists only as `epistemicNodes(nodeType=\"topic\")` —\n * the write-of-record — when no legacy `topics` row backs the ref, returning the\n * node's `topicId` self-key so scoped beliefs/evidence/questions stay reachable.\n * See the kernel module for the full silent-empty-result rationale.\n */\ninterface TopicNodeScopeDoc {\n _id: string | Id<\"epistemicNodes\">;\n globalId?: string;\n metadata?: UnknownRecord;\n nodeType?: string;\n topicId?: string;\n}\n\nasync function resolveTopicNodeScopeOrNull(\n ctx: TopicScopeContext,\n ref: string\n): Promise<TopicProjectScope | null> {\n if (!ctx?.db || typeof ctx.db.query !== \"function\") {\n return null;\n }\n\n let node: TopicNodeScopeDoc | null = null;\n\n // 1. The ref IS the topic node's UUIDv7 globalId.\n try {\n const byGlobalId = (await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_globalId\", (q) => q.eq(\"globalId\", ref))\n .first()) as TopicNodeScopeDoc | null;\n if (byGlobalId && byGlobalId.nodeType === \"topic\") {\n node = byGlobalId;\n }\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] topic-node scope lookup by globalId failed\",\n { error, ref }\n );\n }\n\n if (!node) {\n return null;\n }\n\n const scopeKey =\n normalizeScopeValue(node.topicId) ?? normalizeScopeValue(node.globalId);\n if (!scopeKey) {\n return null;\n }\n\n return {\n topicId: scopeKey as Id<\"topics\">,\n projectId: asMappedProjectId(node),\n source: \"topic_node\",\n };\n}\n\ninterface MaterializedTopicNodeDoc {\n _id: string | Id<\"epistemicNodes\">;\n metadata?: Record<string, unknown>;\n}\n\nfunction asMappedProjectId(\n topic: Pick<TopicDoc, \"metadata\"> | TopicNodeScopeDoc | null | undefined\n): string | undefined {\n if (!topic) {\n return;\n }\n const directLegacyProjectId = normalizeScopeValue(\n (topic as UnknownRecord)[LEGACY_SCOPE_FIELD]\n );\n if (directLegacyProjectId) {\n return directLegacyProjectId;\n }\n const metadata = topic.metadata || {};\n const candidate =\n (metadata as UnknownRecord)[LEGACY_SCOPE_FIELD] ||\n (metadata as UnknownRecord).legacyProjectId ||\n (metadata as UnknownRecord).projectId ||\n (metadata as UnknownRecord).scopeProjectId;\n return typeof candidate === \"string\"\n ? normalizeScopeValue(candidate)\n : undefined;\n}\n\nfunction normalizeScopeValue(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return;\n }\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction pickPrimaryTopic(candidates: TopicDoc[]): TopicDoc | undefined {\n return [...candidates].sort((a, b) => {\n const depthA = a.depth ?? 9999;\n const depthB = b.depth ?? 9999;\n if (depthA !== depthB) {\n return depthA - depthB;\n }\n const createdA = a.createdAt ?? Number.MAX_SAFE_INTEGER;\n const createdB = b.createdAt ?? Number.MAX_SAFE_INTEGER;\n if (createdA !== createdB) {\n return createdA - createdB;\n }\n return String(a.name || \"\").localeCompare(String(b.name || \"\"));\n })[0];\n}\n\nasync function findTopicsByScopeAlias(\n ctx: TopicScopeContext,\n scopeId: string\n): Promise<TopicDoc[]> {\n const query = ctx.db.query(\"topics\") as TopicScopeQuery;\n try {\n return (await query\n .withIndex(\"by_graph_scope_project\", (q) =>\n q.eq(LEGACY_SCOPE_FIELD, scopeId)\n )\n .collect()) as TopicDoc[];\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to resolve scope alias via index\",\n {\n error,\n scopeId,\n }\n );\n // Older Lucern dev deployments can lag index backfills while still carrying\n // the underlying topics table. Scan and filter so scope resolution keeps\n // working during the rollout.\n const topics = (await query.collect()) as TopicDoc[];\n return topics.filter((topic) => {\n const normalizedGlobalId = normalizeScopeValue(topic.globalId);\n const mappedProjectId = asMappedProjectId(topic);\n return (\n String(topic._id) === scopeId ||\n normalizedGlobalId === scopeId ||\n mappedProjectId === scopeId\n );\n });\n }\n}\n\nasync function tryResolveHostTopicById(\n ctx: TopicScopeContext,\n topicId: string\n): Promise<TopicDoc | null> {\n if (typeof ctx.runQuery !== \"function\") {\n return null;\n }\n try {\n return ((await ctx.runQuery(appApi.topics.get, {\n id: topicId,\n })) ?? null) as TopicDoc | null;\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to resolve topic by host query\",\n {\n error,\n topicId,\n }\n );\n return null;\n }\n}\n\nasync function tryResolveHostTopicByLegacyScope(\n ctx: TopicScopeContext,\n legacyScopeId: string\n): Promise<TopicDoc | null> {\n if (typeof ctx.runQuery !== \"function\") {\n return null;\n }\n try {\n return ((await ctx.runQuery(appApi.topics.getByLegacyScopeId, {\n projectId: legacyScopeId,\n })) ?? null) as TopicDoc | null;\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to resolve topic by legacy scope\",\n {\n error,\n legacyScopeId,\n }\n );\n return null;\n }\n}\n\nexport function readMaterializedTopicTableId(\n topicNode: MaterializedTopicNodeDoc | null | undefined\n): string | undefined {\n if (!topicNode) {\n return;\n }\n\n const metadata = (topicNode.metadata || {}) as Record<string, unknown>;\n const topicTableId =\n (metadata.topicTableId as string | undefined) ||\n (metadata.topicId as string | undefined);\n\n return typeof topicTableId === \"string\" && topicTableId.trim().length > 0\n ? topicTableId.trim()\n : undefined;\n}\n\n/**\n * Walk the topic parent chain to find inherited workspaceId and tenantId.\n * Mirrors the pattern used by resolveTopicOntology for ontologyId inheritance.\n * Max depth: 10 (defensive limit against pathological nesting).\n */\nasync function resolveInheritedWorkspaceScope(\n ctx: TopicScopeContext,\n topic: TopicDoc\n): Promise<{ tenantId?: string; workspaceId?: string }> {\n const MAX_DEPTH = 10;\n let tenantId = normalizeScopeValue(topic.tenantId);\n let workspaceId = normalizeScopeValue(topic.workspaceId);\n\n if (tenantId && workspaceId) {\n return { tenantId, workspaceId };\n }\n\n let current: TopicDoc | null = topic;\n for (let i = 0; i < MAX_DEPTH && current?.parentTopicId; i++) {\n current = (await ctx.db.get(current.parentTopicId)) as TopicDoc | null;\n if (!current) {\n break;\n }\n\n if (!tenantId) {\n tenantId = normalizeScopeValue(current.tenantId);\n }\n if (!workspaceId) {\n workspaceId = normalizeScopeValue(current.workspaceId);\n }\n if (tenantId && workspaceId) {\n break;\n }\n }\n\n return { tenantId, workspaceId };\n}\n\nexport async function resolveTopicProjectScope(\n ctx: TopicScopeContext,\n args: { topicId?: Id<\"topics\"> | string; projectId?: string }\n): Promise<TopicProjectScope> {\n if (args.topicId) {\n return await resolveScopeFromTopicId(ctx, args.topicId);\n }\n\n if (args.projectId) {\n return await resolveScopeFromLegacyProjectId(ctx, args.projectId);\n }\n\n throw new Error(\n \"Missing scope: provide topicId (preferred) or legacy projectId alias.\"\n );\n}\n\nasync function resolveScopeFromTopicId(\n ctx: TopicScopeContext,\n topicId: Id<\"topics\"> | string\n): Promise<TopicProjectScope> {\n const topic = await resolveTopicDocFromTopicId(ctx, topicId);\n if (topic) {\n return await buildTopicScope(ctx, topic, \"topic\");\n }\n\n const nodeScope = await resolveTopicNodeScopeOrNull(ctx, String(topicId));\n if (nodeScope) {\n return nodeScope;\n }\n throw new Error(`Topic not found: ${String(topicId)}`);\n}\n\nasync function resolveTopicDocFromTopicId(\n ctx: TopicScopeContext,\n topicId: Id<\"topics\"> | string\n): Promise<TopicDoc | null> {\n const direct = await tryReadTopicDoc(ctx, topicId, {\n failureLog: \"[topicScope] Failed to load topic by direct id\",\n idLogKey: \"topicId\",\n });\n if (direct) {\n return direct;\n }\n\n const hostTopic = await tryResolveHostTopicById(ctx, String(topicId));\n if (hostTopic) {\n return hostTopic;\n }\n\n return (\n pickPrimaryTopic(await findTopicsByScopeAlias(ctx, String(topicId))) ?? null\n );\n}\n\nasync function resolveScopeFromLegacyProjectId(\n ctx: TopicScopeContext,\n legacyProjectId: string\n): Promise<TopicProjectScope> {\n const directTopic = await resolveDirectLegacyProjectTopic(\n ctx,\n legacyProjectId\n );\n if (directTopic) {\n return await buildTopicScope(ctx, directTopic, \"topic_inferred\", {\n fallbackProjectId: legacyProjectId,\n });\n }\n\n const primary = pickPrimaryTopic(\n await findTopicsByScopeAlias(ctx, legacyProjectId)\n );\n if (primary) {\n return await buildTopicScope(ctx, primary, \"project_mapped_topic\", {\n fallbackProjectId: legacyProjectId,\n });\n }\n\n const nodeScope = await resolveTopicNodeScopeOrNull(ctx, legacyProjectId);\n if (nodeScope) {\n return {\n ...nodeScope,\n projectId: nodeScope.projectId ?? legacyProjectId,\n };\n }\n\n throw new Error(\n `Legacy project scope ${legacyProjectId} has no mapped topic.`\n );\n}\n\nasync function resolveDirectLegacyProjectTopic(\n ctx: TopicScopeContext,\n legacyProjectId: string\n): Promise<TopicDoc | null> {\n const directTopic = await tryReadTopicDoc(ctx, legacyProjectId, {\n failureLog: \"[topicScope] Failed to load direct project topic\",\n idLogKey: \"projectId\",\n });\n return directTopic ?? tryResolveHostTopicByLegacyScope(ctx, legacyProjectId);\n}\n\nasync function tryReadTopicDoc(\n ctx: TopicScopeContext,\n id: Id<\"topics\"> | string,\n log: { failureLog: string; idLogKey: \"projectId\" | \"topicId\" }\n): Promise<TopicDoc | null> {\n try {\n return (await ctx.db.get(id)) as TopicDoc | null;\n } catch (error) {\n debugGraphPrimitiveFallback(log.failureLog, {\n error,\n [log.idLogKey]: id,\n });\n return null;\n }\n}\n\nasync function buildTopicScope(\n ctx: TopicScopeContext,\n topic: TopicDoc,\n source: TopicProjectScope[\"source\"],\n options: { fallbackProjectId?: string } = {}\n): Promise<TopicProjectScope> {\n const inherited = await resolveInheritedWorkspaceScope(ctx, topic);\n const mapped = asMappedProjectId(topic);\n return {\n topicId: topic._id,\n ...(mapped || options.fallbackProjectId\n ? { projectId: mapped ?? options.fallbackProjectId }\n : {}),\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source,\n };\n}\n\n/** Shared scope args for graph-primitive functions. topicId is canonical; projectId is a legacy alias. */\nexport const optionalScopeArgs = {\n projectId: v.optional(v.string()),\n topicId: v.optional(v.string()),\n} as const;\n","// biome-ignore-all lint/style/useFilenamingConvention: Published wildcard export for @lucern/graph-primitives/entityLifecycle requires this public filename to remain stable.\n/**\n * Entity Lifecycle Mutations\n *\n * Entity-specific CRUD for ontological nodes (company, person, investor, etc.).\n * Entities are L0 reality infrastructure, NOT epistemic primitives.\n *\n * Key differences from belief mutations:\n * - No confidence field manipulation\n * - No beliefStatus/beliefType fields\n * - Metadata IS mutable (patch directly)\n * - No worktree/sprint gating\n * - Merge operation (beliefs don't merge)\n *\n * Invariant #14: No silent state transitions — all changes logged to epistemicAudit.\n *\n * @module graph-primitives/entityLifecycle\n */\n\nimport { requireScopeWriteAccess } from \"@lucern/access-control/access\";\nimport { getCurrentUserId } from \"@lucern/access-control/auth\";\nimport { throwStructuredMutationError } from \"@lucern/access-control/structuredMutationError\";\nimport { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\nimport { v } from \"convex/values\";\nimport type { Id, MutationCtx, QueryCtx } from \"./convex\";\nimport { internal, mutation, query } from \"./convex\";\nimport {\n buildEntityTitle,\n type CanonicalEntityRecord,\n matchesCanonicalEntityRecord,\n normalizeCanonicalEntityText,\n} from \"./entityCanonicalMatch\";\nimport { validateEntityMetadata } from \"./entityValidation\";\nimport { insertEpistemicEdge, insertEpistemicNode } from \"./epistemicInsert.js\";\nimport { generateGlobalId } from \"./globalId\";\nimport { resolveGraphPrimitivesAppResolvers } from \"./resolvers\";\nimport { validateEntityTypeForTopic } from \"./topicOntologyResolver\";\nimport { optionalScopeArgs, resolveTopicProjectScope } from \"./topicScope\";\n\n// =============================================================================\n// AUTH HELPERS (same pattern as epistemicBeliefs.ts)\n// =============================================================================\n//\n// CQ.11: `throwStructuredMutationError` is the single shared copy imported from\n// `@lucern/access-control/structuredMutationError` (the same home the shared\n// access gate throws from); the former local copy was deleted.\n\nasync function requireAuthenticatedUserId(ctx: MutationCtx): Promise<string> {\n const userId = await getCurrentUserId(ctx);\n if (!userId) {\n throwStructuredMutationError({\n message: \"Authentication required.\",\n status: 401,\n code: \"AUTHENTICATION_REQUIRED\",\n invariantCode: \"auth.required\",\n suggestion:\n \"Provide a valid bearer token before invoking entity mutations.\",\n });\n }\n return userId;\n}\n\n// =============================================================================\n// CONTENT HASHING\n// =============================================================================\n\nfunction generateContentHash(nodeType: string, text: string): string {\n const content = `${nodeType}:${text.trim().toLowerCase().replace(/\\s+/g, \" \")}`;\n let hash = 5381;\n for (let i = 0; i < content.length; i++) {\n // biome-ignore lint/suspicious/noBitwiseOperators: Preserve deterministic djb2 hash semantics for legacy entity IDs.\n hash = (hash << 5) + hash + content.charCodeAt(i);\n // biome-ignore lint/suspicious/noBitwiseOperators: Preserve deterministic djb2 hash semantics for legacy entity IDs.\n hash &= hash;\n }\n return Math.abs(hash).toString(16).padStart(8, \"0\");\n}\n\n// Ontological node types that are entities\nexport const ONTOLOGICAL_NODE_TYPES = [\n \"company\",\n \"person\",\n \"investor\",\n \"function\",\n \"value_chain\",\n] as const;\nconst ONTOLOGICAL_NODE_TYPE_SET = new Set<string>(ONTOLOGICAL_NODE_TYPES);\n\nexport type OntologicalNodeType = (typeof ONTOLOGICAL_NODE_TYPES)[number];\n\nexport const isOntologicalNodeType = ONTOLOGICAL_NODE_TYPE_SET.has.bind(\n ONTOLOGICAL_NODE_TYPE_SET\n) as (nodeType: string) => nodeType is OntologicalNodeType;\n\ninterface ScopeTopicDoc {\n _id: Id<\"topics\">;\n tenantId?: string;\n workspaceId?: string;\n}\ninterface ScopeProjectDoc {\n _id: Id<\"projects\"> | string;\n tenantId?: string;\n workspaceId?: string;\n}\ntype CanonicalEntityScope = Awaited<\n ReturnType<typeof resolveTopicProjectScope>\n> & {\n tenantId?: string;\n topic: ScopeTopicDoc | null;\n project: ScopeProjectDoc | null;\n};\ninterface IndexQuery {\n eq(field: string, value: unknown): IndexQuery;\n}\n\ntype EntityVerificationStatus =\n | \"ai_verified\"\n | \"contradicted\"\n | \"human_verified\"\n | \"outdated\"\n | \"unverified\";\n\ninterface ListCanonicalEntitiesArgs {\n includeArchived?: boolean;\n limit?: number;\n nodeType?: string;\n scopeProjectId?: string;\n searchTerm?: string;\n topicId?: string;\n}\n\ninterface CreateEntityArgs {\n canonicalText: string;\n metadata?: unknown;\n nodeType: string;\n projectId?: string;\n subtype?: string;\n topicId?: string;\n}\n\ninterface MergeEntitiesArgs {\n canonicalNodeId: Id<\"epistemicNodes\">;\n duplicateNodeId: Id<\"epistemicNodes\">;\n}\n\ninterface ArchiveEntityArgs {\n nodeId: Id<\"epistemicNodes\">;\n}\n\ninterface EntityEdgeRecord {\n _id: Id<\"epistemicEdges\">;\n fromNodeId?: Id<\"epistemicNodes\">;\n toNodeId?: Id<\"epistemicNodes\">;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction readConvexId<TableName extends string>(\n value: unknown\n): Id<TableName> | undefined {\n return typeof value === \"string\" && value.trim().length > 0\n ? (value as Id<TableName>)\n : undefined;\n}\n\nfunction readOptionalString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim().length > 0\n ? value\n : undefined;\n}\n\nfunction readRecord(value: unknown): Record<string, unknown> | undefined {\n return isRecord(value) ? value : undefined;\n}\n\nfunction readStringArray(value: unknown): string[] | undefined {\n return Array.isArray(value)\n ? value.filter((entry): entry is string => typeof entry === \"string\")\n : undefined;\n}\n\nfunction readEntityUpdateMetadata(\n value: unknown\n): EntityUpdateMetadata | undefined {\n if (!isRecord(value)) {\n return;\n }\n\n const metadata: EntityUpdateMetadata = {};\n const crunchbase = readOptionalString(value.crunchbase);\n const linkedin = readOptionalString(value.linkedin);\n const pitchbook = readOptionalString(value.pitchbook);\n const twitter = readOptionalString(value.twitter);\n const website = readOptionalString(value.website);\n\n if (crunchbase !== undefined) {\n metadata.crunchbase = crunchbase;\n }\n if (linkedin !== undefined) {\n metadata.linkedin = linkedin;\n }\n if (pitchbook !== undefined) {\n metadata.pitchbook = pitchbook;\n }\n if (twitter !== undefined) {\n metadata.twitter = twitter;\n }\n if (website !== undefined) {\n metadata.website = website;\n }\n\n return metadata;\n}\n\nfunction readCanonicalEntityRecord(\n value: unknown\n): CanonicalEntityRecord | null {\n if (!isRecord(value)) {\n return null;\n }\n\n const id = readConvexId<\"epistemicNodes\">(value._id);\n if (!id) {\n return null;\n }\n\n const record: CanonicalEntityRecord = { _id: id };\n const canonicalText = readOptionalString(value.canonicalText);\n const contentHash = readOptionalString(value.contentHash);\n const domain = readOptionalString(value.domain);\n const epistemicLayer = readOptionalString(value.epistemicLayer);\n const externalIds = readRecord(value.externalIds);\n const globalId = readOptionalString(value.globalId);\n const metadata = readRecord(value.metadata);\n const nodeType = readOptionalString(value.nodeType);\n const projectId = readOptionalString(value.projectId);\n const status = readOptionalString(value.status);\n const subtype = readOptionalString(value.subtype);\n const tags = readStringArray(value.tags);\n const tenantId = readOptionalString(value.tenantId);\n const title = readOptionalString(value.title);\n const verificationStatus = readOptionalString(value.verificationStatus);\n const workspaceId = readOptionalString(value.workspaceId);\n\n if (canonicalText !== undefined) {\n record.canonicalText = canonicalText;\n }\n if (contentHash !== undefined) {\n record.contentHash = contentHash;\n }\n if (domain !== undefined) {\n record.domain = domain;\n }\n if (epistemicLayer !== undefined) {\n record.epistemicLayer = epistemicLayer;\n }\n if (externalIds !== undefined) {\n record.externalIds = externalIds;\n }\n if (globalId !== undefined) {\n record.globalId = globalId;\n }\n if (metadata !== undefined) {\n record.metadata = metadata;\n }\n if (nodeType !== undefined) {\n record.nodeType = nodeType;\n }\n if (projectId !== undefined) {\n record.projectId = projectId;\n }\n if (status !== undefined) {\n record.status = status;\n }\n if (subtype !== undefined) {\n record.subtype = subtype;\n }\n if (tags !== undefined) {\n record.tags = tags;\n }\n if (tenantId !== undefined) {\n record.tenantId = tenantId;\n }\n if (title !== undefined) {\n record.title = title;\n }\n if (verificationStatus !== undefined) {\n record.verificationStatus = verificationStatus;\n }\n if (workspaceId !== undefined) {\n record.workspaceId = workspaceId;\n }\n\n return record;\n}\n\nfunction readEntityEdgeRecord(value: unknown): EntityEdgeRecord | null {\n if (!isRecord(value)) {\n return null;\n }\n\n const id = readConvexId<\"epistemicEdges\">(value._id);\n if (!id) {\n return null;\n }\n\n const edge: EntityEdgeRecord = { _id: id };\n const fromNodeId = readConvexId<\"epistemicNodes\">(value.fromNodeId);\n const toNodeId = readConvexId<\"epistemicNodes\">(value.toNodeId);\n\n if (fromNodeId !== undefined) {\n edge.fromNodeId = fromNodeId;\n }\n if (toNodeId !== undefined) {\n edge.toNodeId = toNodeId;\n }\n\n return edge;\n}\n\nfunction readRowList<T>(\n values: readonly unknown[],\n reader: (value: unknown) => T | null\n): T[] {\n return values.flatMap((value) => {\n const row = reader(value);\n return row ? [row] : [];\n });\n}\n\nfunction readScopeTopicDoc(value: unknown): ScopeTopicDoc | null {\n if (!isRecord(value)) {\n return null;\n }\n\n const id = readConvexId<\"topics\">(value._id);\n if (!id) {\n return null;\n }\n\n const topic: ScopeTopicDoc = { _id: id };\n const tenantId = readOptionalString(value.tenantId);\n const workspaceId = readOptionalString(value.workspaceId);\n if (tenantId !== undefined) {\n topic.tenantId = tenantId;\n }\n if (workspaceId !== undefined) {\n topic.workspaceId = workspaceId;\n }\n return topic;\n}\n\nfunction readScopeProjectDoc(value: unknown): ScopeProjectDoc | null {\n if (!isRecord(value)) {\n return null;\n }\n\n const id = readOptionalString(value._id);\n if (!id) {\n return null;\n }\n\n const project: ScopeProjectDoc = { _id: id };\n const tenantId = readOptionalString(value.tenantId);\n const workspaceId = readOptionalString(value.workspaceId);\n if (tenantId !== undefined) {\n project.tenantId = tenantId;\n }\n if (workspaceId !== undefined) {\n project.workspaceId = workspaceId;\n }\n return project;\n}\n\nfunction readEntityUpdateNode(value: unknown): EntityUpdateNodeShape | null {\n const node = readCanonicalEntityRecord(value);\n const nodeType = node?.nodeType;\n if (!(node?.canonicalText && nodeType && isOntologicalNodeType(nodeType))) {\n return null;\n }\n\n return {\n _id: node._id,\n canonicalText: node.canonicalText,\n domain: node.domain,\n externalIds: readEntityUpdateMetadata(node.externalIds),\n globalId: node.globalId,\n metadata: node.metadata,\n nodeType,\n projectId: node.projectId,\n status: node.status,\n subtype: node.subtype,\n tags: node.tags,\n tenantId: node.tenantId,\n title: node.title,\n verificationStatus: node.verificationStatus,\n };\n}\n\nasync function resolveCanonicalEntityScope(\n ctx: QueryCtx | MutationCtx,\n args: { topicId?: string; projectId?: string }\n): Promise<CanonicalEntityScope> {\n const scope = await resolveTopicProjectScope(ctx, args);\n const topic = scope.topicId\n ? readScopeTopicDoc(await ctx.db.get(scope.topicId))\n : null;\n const project =\n scope.projectId === undefined\n ? null\n : readScopeProjectDoc(\n await resolveGraphPrimitivesAppResolvers(ctx).getProject(\n ctx,\n scope.projectId\n )\n );\n\n let tenantId: string | undefined;\n if (typeof topic?.tenantId === \"string\") {\n const trimmedTopicTenantId = topic.tenantId.trim();\n tenantId =\n trimmedTopicTenantId.length > 0 ? trimmedTopicTenantId : undefined;\n }\n if (tenantId === undefined && typeof project?.tenantId === \"string\") {\n const trimmedProjectTenantId = project.tenantId.trim();\n tenantId =\n trimmedProjectTenantId.length > 0 ? trimmedProjectTenantId : undefined;\n }\n\n return {\n ...scope,\n tenantId,\n topic,\n project,\n };\n}\n\nasync function findExistingCanonicalEntity(\n ctx: QueryCtx | MutationCtx,\n args: {\n nodeType: OntologicalNodeType;\n canonicalText: string;\n tenantId?: string;\n }\n) {\n const contentHash = generateContentHash(args.nodeType, args.canonicalText);\n const candidates = readRowList(\n await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_contentHash\", (q: IndexQuery) =>\n q.eq(\"contentHash\", contentHash)\n )\n .collect(),\n readCanonicalEntityRecord\n );\n\n return (\n candidates.find((node) =>\n matchesCanonicalEntityRecord(node, {\n nodeType: args.nodeType,\n tenantId: args.tenantId,\n contentHash,\n })\n ) ?? null\n );\n}\n\nasync function listCanonicalEntitiesForScope(\n ctx: QueryCtx | MutationCtx,\n args: {\n tenantId?: string;\n nodeType?: string;\n searchTerm?: string;\n includeArchived?: boolean;\n limit: number;\n }\n) {\n let baseRows = readRowList(\n await ctx.db.query(\"epistemicNodes\").collect(),\n readCanonicalEntityRecord\n );\n if (args.tenantId === undefined) {\n if (args.nodeType !== undefined) {\n baseRows = readRowList(\n await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_nodeType\", (q: IndexQuery) =>\n q.eq(\"nodeType\", args.nodeType)\n )\n .collect(),\n readCanonicalEntityRecord\n );\n }\n } else {\n baseRows = readRowList(\n await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_tenantId\", (q: IndexQuery) =>\n q.eq(\"tenantId\", args.tenantId)\n )\n .collect(),\n readCanonicalEntityRecord\n );\n }\n\n const normalizedSearch =\n typeof args.searchTerm === \"string\" && args.searchTerm.trim().length > 0\n ? normalizeCanonicalEntityText(args.searchTerm)\n : undefined;\n\n return baseRows\n .filter((node) =>\n matchesCanonicalEntityRecord(node, {\n nodeType: args.nodeType,\n tenantId: args.tenantId,\n includeArchived: args.includeArchived,\n })\n )\n .filter((node) => {\n if (!normalizedSearch) {\n return true;\n }\n const text =\n typeof node.canonicalText === \"string\" ? node.canonicalText : \"\";\n return normalizeCanonicalEntityText(text).includes(normalizedSearch);\n })\n .sort((a, b) =>\n String(a.title ?? a.canonicalText ?? \"\").localeCompare(\n String(b.title ?? b.canonicalText ?? \"\")\n )\n )\n .slice(0, args.limit);\n}\n\nconst entityVerificationStatusValidator = v.union(\n v.literal(\"unverified\"),\n v.literal(\"human_verified\"),\n v.literal(\"ai_verified\"),\n v.literal(\"contradicted\"),\n v.literal(\"outdated\")\n);\n\n// =============================================================================\n// CANONICAL ENTITY QUERIES\n// =============================================================================\n\n/**\n * List canonical tenant-global entities visible from a topic/project scope.\n * Canonical entities are tenant-scoped and intentionally workspace-global.\n */\nexport const listCanonicalEntities = query({\n args: {\n topicId: v.optional(v.string()),\n scopeProjectId: v.optional(v.string()),\n nodeType: v.optional(v.string()),\n searchTerm: v.optional(v.string()),\n includeArchived: v.optional(v.boolean()),\n limit: v.optional(v.number()),\n },\n returns: permissiveReturn,\n handler: async (ctx: QueryCtx, args: ListCanonicalEntitiesArgs) => {\n const scope = await resolveCanonicalEntityScope(ctx, {\n topicId: args.topicId,\n projectId: args.scopeProjectId,\n });\n\n const limit = Math.max(1, Math.min(Math.floor(args.limit ?? 100), 500));\n return listCanonicalEntitiesForScope(ctx, {\n tenantId: scope.tenantId,\n nodeType: args.nodeType,\n searchTerm: args.searchTerm,\n includeArchived: args.includeArchived,\n limit,\n });\n },\n});\n\n// =============================================================================\n// CREATE ENTITY\n// =============================================================================\n\n/**\n * Create a new ontological entity in epistemicNodes.\n *\n * Unlike beliefs, entities:\n * - Have epistemicLayer = 'ontological'\n * - Have no confidence or beliefStatus\n * - Are mutable (metadata can be patched)\n * - Require metadata validation against registered schema\n */\nexport const createEntity = mutation({\n args: {\n nodeType: v.string(), // \"company\", \"person\", \"investor\", \"function\", \"value_chain\"\n canonicalText: v.string(), // Display name (e.g., \"Anthropic\", \"Dario Amodei\")\n metadata: v.optional(v.any()), // Type-specific attributes validated against schema\n subtype: v.optional(v.string()), // e.g., \"company/private\", \"investor/vc\"\n ...optionalScopeArgs,\n },\n returns: permissiveReturn,\n handler: async (ctx: MutationCtx, args: CreateEntityArgs) => {\n const authenticatedUserId = await requireAuthenticatedUserId(ctx);\n const now = Date.now();\n const canonicalText = args.canonicalText.trim();\n\n if (!canonicalText) {\n throwStructuredMutationError({\n message: \"canonicalText is required.\",\n status: 400,\n code: \"INVALID_REQUEST\",\n invariantCode: \"entity.type_check\",\n });\n }\n\n // Validate nodeType is ontological\n if (!isOntologicalNodeType(args.nodeType)) {\n throwStructuredMutationError({\n message: `\"${args.nodeType}\" is not an ontological entity type. Use epistemicBeliefs.create for epistemic nodes.`,\n status: 400,\n code: \"INVALID_NODE_TYPE\",\n invariantCode: \"entity.type_check\",\n suggestion: `Valid entity types: ${ONTOLOGICAL_NODE_TYPES.join(\", \")}`,\n });\n }\n\n // Resolve topic/project scope\n const scope = await resolveCanonicalEntityScope(ctx, {\n topicId: args.topicId,\n projectId: args.projectId,\n });\n if (scope.projectId) {\n await requireScopeWriteAccess(ctx, scope.projectId, authenticatedUserId);\n }\n\n // Validate nodeType against the resolved ontology for the topic scope.\n // If the topic (or its ancestor) binds to an ontology with a published version,\n // the entity's nodeType must be in that ontology's entity type vocabulary.\n if (scope.topicId) {\n const ontologyValidation = await validateEntityTypeForTopic(\n ctx,\n scope.topicId,\n args.nodeType\n );\n if (!ontologyValidation.valid) {\n throwStructuredMutationError({\n message: `Ontology validation failed: ${ontologyValidation.error}`,\n status: 400,\n code: \"ONTOLOGY_VALIDATION_ERROR\",\n invariantCode: \"entity.ontology_type_check\",\n suggestion:\n \"Use a nodeType that is defined in the ontology bound to this topic, or update the ontology to include this entity type.\",\n details: { nodeType: args.nodeType, topicId: scope.topicId },\n });\n }\n }\n\n // Validate metadata against registered schema\n const metadata = readRecord(args.metadata) ?? {};\n const validation = await validateEntityMetadata(\n ctx,\n args.nodeType,\n metadata,\n scope.tenantId\n );\n if (!validation.valid) {\n throwStructuredMutationError({\n message: `Entity metadata validation failed: ${validation.errors.join(\"; \")}`,\n status: 400,\n code: \"VALIDATION_ERROR\",\n invariantCode: \"entity.metadata_schema\",\n suggestion:\n \"Check the registered schema for this entity type in schemaEnumConfig.\",\n details: { errors: validation.errors },\n });\n }\n\n const existing = await findExistingCanonicalEntity(ctx, {\n nodeType: args.nodeType,\n canonicalText,\n tenantId: scope.tenantId,\n });\n if (existing) {\n return {\n nodeId: existing._id,\n globalId: existing.globalId,\n isDuplicate: true,\n };\n }\n\n // Create the entity node\n const entityGlobalId = generateGlobalId();\n const nodeId = await insertEpistemicNode(ctx, {\n globalId: entityGlobalId,\n nodeType: args.nodeType,\n epistemicLayer: \"ontological\",\n subtype: args.subtype,\n canonicalText,\n contentHash: generateContentHash(args.nodeType, canonicalText),\n title: buildEntityTitle(canonicalText),\n metadata: {\n ...metadata,\n ...(args.subtype ? { subtype: args.subtype } : {}),\n status: \"active\",\n },\n tenantId: scope.tenantId,\n sourceType: \"human\",\n verificationStatus: \"unverified\",\n status: \"active\",\n projectId: scope.projectId,\n createdBy: authenticatedUserId,\n createdAt: now,\n updatedAt: now,\n });\n\n // Schedule Neo4j sync\n await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId,\n operation: \"upsert\",\n });\n\n // Log to epistemic audit (Invariant #14)\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"entity\",\n entityId: nodeId,\n changeType: \"created\",\n changedAt: now,\n changedBy: authenticatedUserId,\n isAgent: false,\n previousState: null,\n newState: {\n canonicalText,\n nodeType: args.nodeType,\n tenantId: scope.tenantId,\n workspaceId: null,\n },\n projectId: scope.projectId,\n });\n\n return { nodeId, globalId: entityGlobalId, isDuplicate: false };\n },\n});\n\n// =============================================================================\n// UPDATE ENTITY ATTRIBUTES\n// =============================================================================\n\n/**\n * Patch entity metadata. Entities ARE mutable (unlike scored beliefs).\n * Logs before/after diff to epistemicAudit.\n */\n\ninterface EntityUpdateMetadata {\n crunchbase?: string;\n linkedin?: string;\n pitchbook?: string;\n twitter?: string;\n website?: string;\n}\n\ninterface EntityUpdateNodeShape {\n _id: Id<\"epistemicNodes\">;\n canonicalText: string;\n domain?: string | undefined;\n externalIds?: EntityUpdateMetadata | undefined;\n globalId?: string | undefined;\n metadata?: Record<string, unknown> | undefined;\n nodeType: OntologicalNodeType;\n projectId?: string | undefined;\n status?: string | undefined;\n subtype?: string | undefined;\n tags?: string[] | undefined;\n tenantId?: string | undefined;\n title?: string | undefined;\n verificationStatus?: string | undefined;\n}\n\ninterface EntityAttributeUpdatePlan {\n existingMetadata: Record<string, unknown>;\n mergedMetadata: Record<string, unknown>;\n nextCanonicalText: string;\n}\n\ninterface EntityAttributeUpdateArgs {\n canonicalText?: string;\n domain?: string;\n externalIds?: EntityUpdateMetadata;\n metadata?: Record<string, unknown>;\n subtype?: string;\n tags?: string[];\n title?: string;\n verificationStatus?: string;\n}\n\ninterface UpdateEntityAttributesArgs extends EntityAttributeUpdateArgs {\n nodeId: Id<\"epistemicNodes\">;\n verificationStatus?: EntityVerificationStatus;\n}\n\nfunction normalizeEntityMetadataPatch(\n metadata: Record<string, unknown> | null | undefined\n): Record<string, unknown> {\n return metadata === null || metadata === undefined ? {} : metadata;\n}\n\nfunction resolveScopeProjectId(\n node: EntityUpdateNodeShape\n): string | undefined {\n return typeof node.projectId === \"string\" && node.projectId.trim().length > 0\n ? node.projectId\n : undefined;\n}\n\nfunction prepareEntityAttributePlan(\n node: EntityUpdateNodeShape,\n args: EntityAttributeUpdateArgs\n): EntityAttributeUpdatePlan {\n const existingMetadata = node.metadata ?? {};\n const mergedMetadata = {\n ...existingMetadata,\n ...normalizeEntityMetadataPatch(args.metadata),\n };\n\n if (args.subtype !== undefined) {\n mergedMetadata.subtype = args.subtype;\n }\n\n const nextCanonicalText =\n args.canonicalText === undefined\n ? node.canonicalText\n : args.canonicalText.trim();\n\n if (nextCanonicalText.length === 0) {\n throwStructuredMutationError({\n message: \"canonicalText cannot be empty.\",\n status: 400,\n code: \"INVALID_REQUEST\",\n invariantCode: \"entity.update_requires_entity_lifecycle\",\n });\n }\n\n return {\n nextCanonicalText,\n existingMetadata,\n mergedMetadata,\n };\n}\n\nasync function loadEntityForUpdate(\n ctx: MutationCtx,\n nodeId: Id<\"epistemicNodes\">\n): Promise<EntityUpdateNodeShape> {\n const node = readEntityUpdateNode(await ctx.db.get(nodeId));\n if (!node) {\n throwStructuredMutationError({\n message: \"Entity not found.\",\n status: 404,\n code: \"NOT_FOUND\",\n details: { nodeId },\n });\n }\n\n return node;\n}\n\nasync function assertCanonicalEntityUnique(\n ctx: MutationCtx,\n node: EntityUpdateNodeShape,\n nodeId: Id<\"epistemicNodes\">,\n canonicalText: string\n): Promise<void> {\n const duplicate = await findExistingCanonicalEntity(ctx, {\n nodeType: node.nodeType,\n canonicalText,\n tenantId: typeof node.tenantId === \"string\" ? node.tenantId : undefined,\n });\n if (duplicate && String(duplicate._id) !== String(nodeId)) {\n throwStructuredMutationError({\n message:\n \"A canonical entity with this name already exists in the tenant scope.\",\n status: 409,\n code: \"CONFLICT\",\n invariantCode: \"entity.canonical_text_unique_per_tenant\",\n suggestion:\n \"Merge the duplicate entity instead of renaming this node onto an existing canonical record.\",\n details: {\n nodeId,\n duplicateNodeId: duplicate._id,\n canonicalText,\n },\n });\n }\n}\n\nfunction buildEntityAttributeUpdates(\n node: EntityUpdateNodeShape,\n args: EntityAttributeUpdateArgs,\n plan: EntityAttributeUpdatePlan\n): Record<string, unknown> {\n const updates: Record<string, unknown> = {\n metadata: plan.mergedMetadata,\n };\n\n if (args.canonicalText !== undefined) {\n updates.canonicalText = plan.nextCanonicalText;\n updates.contentHash = generateContentHash(\n node.nodeType,\n plan.nextCanonicalText\n );\n updates.title =\n args.title === undefined\n ? buildEntityTitle(plan.nextCanonicalText)\n : args.title;\n } else if (args.title !== undefined) {\n updates.title = args.title;\n }\n\n if (args.subtype !== undefined) {\n updates.subtype = args.subtype;\n }\n if (args.domain !== undefined) {\n updates.domain = args.domain;\n }\n if (args.tags !== undefined) {\n updates.tags = args.tags;\n }\n if (args.verificationStatus !== undefined) {\n updates.verificationStatus = args.verificationStatus;\n }\n if (args.externalIds !== undefined) {\n updates.externalIds = args.externalIds;\n }\n\n return updates;\n}\n\nexport const updateEntityAttributes = mutation({\n args: {\n nodeId: v.id(\"epistemicNodes\"),\n canonicalText: v.optional(v.string()),\n title: v.optional(v.string()),\n metadata: v.optional(v.any()), // Partial metadata to merge\n subtype: v.optional(v.string()),\n domain: v.optional(v.string()),\n tags: v.optional(v.array(v.string())),\n verificationStatus: v.optional(entityVerificationStatusValidator),\n externalIds: v.optional(\n v.object({\n crunchbase: v.optional(v.string()),\n linkedin: v.optional(v.string()),\n pitchbook: v.optional(v.string()),\n twitter: v.optional(v.string()),\n website: v.optional(v.string()),\n })\n ),\n },\n returns: permissiveReturn,\n handler: async (ctx: MutationCtx, args: UpdateEntityAttributesArgs) => {\n const authenticatedUserId = await requireAuthenticatedUserId(ctx);\n const now = Date.now();\n\n // Phase 1: load the ontological target and enforce scope write access.\n const node = await loadEntityForUpdate(ctx, args.nodeId);\n\n const scopeProjectId = resolveScopeProjectId(node);\n if (scopeProjectId !== undefined) {\n await requireScopeWriteAccess(ctx, scopeProjectId, authenticatedUserId);\n }\n\n // Phase 2: normalize request input and merge metadata safely.\n const plan = prepareEntityAttributePlan(node, {\n canonicalText: args.canonicalText,\n metadata: args.metadata,\n subtype: args.subtype,\n domain: args.domain,\n title: args.title,\n tags: args.tags,\n verificationStatus: args.verificationStatus,\n externalIds: args.externalIds,\n });\n\n // Phase 3: enforce canonical-name uniqueness when renaming.\n if (args.canonicalText !== undefined) {\n await assertCanonicalEntityUnique(\n ctx,\n node,\n args.nodeId,\n plan.nextCanonicalText\n );\n }\n\n // Validate merged metadata against schema\n const validation = await validateEntityMetadata(\n ctx,\n node.nodeType,\n plan.mergedMetadata,\n typeof node.tenantId === \"string\" ? node.tenantId : undefined\n );\n if (!validation.valid) {\n throwStructuredMutationError({\n message: `Entity metadata validation failed: ${validation.errors.join(\"; \")}`,\n status: 400,\n code: \"VALIDATION_ERROR\",\n invariantCode: \"entity.metadata_schema\",\n details: { errors: validation.errors },\n });\n }\n\n const updates = {\n ...buildEntityAttributeUpdates(\n node,\n {\n canonicalText: args.canonicalText,\n title: args.title,\n metadata: args.metadata,\n subtype: args.subtype,\n domain: args.domain,\n tags: args.tags,\n verificationStatus: args.verificationStatus,\n externalIds: args.externalIds,\n },\n plan\n ),\n updatedAt: now,\n };\n\n // Patch the node\n await ctx.db.patch(args.nodeId, updates);\n\n // Schedule Neo4j sync\n await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId: args.nodeId,\n operation: \"upsert\",\n });\n\n // Log to epistemic audit with before/after diff (Invariant #14)\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"entity\",\n entityId: args.nodeId,\n changeType: \"entity_attributes_updated\",\n changedAt: now,\n changedBy: authenticatedUserId,\n isAgent: false,\n previousState: {\n canonicalText: node.canonicalText,\n title: node.title,\n subtype: node.subtype,\n domain: node.domain,\n tags: node.tags,\n verificationStatus: node.verificationStatus,\n externalIds: node.externalIds,\n metadata: plan.existingMetadata,\n },\n newState: updates,\n projectId: scopeProjectId,\n });\n\n return { nodeId: args.nodeId, updated: true };\n },\n});\n\n// =============================================================================\n// MERGE ENTITIES\n// =============================================================================\n\n/**\n * Merge a duplicate entity into a canonical one.\n * Non-destructive: duplicate is preserved with status='superseded' and lineage.\n *\n * Steps:\n * 1. Create same_as edge between them\n * 2. Re-point all edges from duplicate → canonical\n * 3. Set duplicate status to 'superseded', supersededBy = canonical\n */\nexport const mergeEntities = mutation({\n args: {\n canonicalNodeId: v.id(\"epistemicNodes\"),\n duplicateNodeId: v.id(\"epistemicNodes\"),\n },\n returns: permissiveReturn,\n handler: async (ctx: MutationCtx, args: MergeEntitiesArgs) => {\n const authenticatedUserId = await requireAuthenticatedUserId(ctx);\n const now = Date.now();\n\n const canonical = readEntityUpdateNode(\n await ctx.db.get(args.canonicalNodeId)\n );\n const duplicate = readEntityUpdateNode(\n await ctx.db.get(args.duplicateNodeId)\n );\n\n if (!(canonical && duplicate)) {\n throwStructuredMutationError({\n message: \"One or both entity nodes not found.\",\n status: 404,\n code: \"NOT_FOUND\",\n details: {\n canonicalNodeId: args.canonicalNodeId,\n duplicateNodeId: args.duplicateNodeId,\n },\n });\n }\n\n if (args.canonicalNodeId === args.duplicateNodeId) {\n throwStructuredMutationError({\n message: \"Cannot merge an entity with itself.\",\n status: 400,\n code: \"SELF_MERGE\",\n invariantCode: \"entity.no_self_merge\",\n suggestion: \"Provide two different entity IDs to merge.\",\n details: { canonicalNodeId: args.canonicalNodeId },\n });\n }\n\n if (!(canonical.globalId && duplicate.globalId)) {\n throwStructuredMutationError({\n message: \"Both entity nodes must have globalId values to merge.\",\n status: 400,\n code: \"LIFECYCLE_VIOLATION\",\n invariantCode: \"entity.global_id_required\",\n details: {\n canonicalNodeId: args.canonicalNodeId,\n duplicateNodeId: args.duplicateNodeId,\n },\n });\n }\n\n if (canonical.nodeType !== duplicate.nodeType) {\n throwStructuredMutationError({\n message: `Cannot merge different entity types: ${canonical.nodeType} vs ${duplicate.nodeType}.`,\n status: 400,\n code: \"TYPE_MISMATCH\",\n });\n }\n\n if (canonical.projectId) {\n await requireScopeWriteAccess(\n ctx,\n canonical.projectId,\n authenticatedUserId\n );\n }\n\n // 1. Create derived_from edge (canonical replacement for same_as)\n const edgeGlobalId = generateGlobalId();\n await insertEpistemicEdge(ctx, {\n globalId: edgeGlobalId,\n // C2-RR.4 Defect E — canonical UUIDv7 endpoints, not Convex doc ids.\n fromNodeId: duplicate.globalId,\n toNodeId: canonical.globalId,\n sourceGlobalId: duplicate.globalId,\n targetGlobalId: canonical.globalId,\n edgeType: \"derived_from\",\n weight: 1.0,\n context: `Entity merge: ${duplicate.canonicalText} → ${canonical.canonicalText}`,\n createdBy: authenticatedUserId,\n createdAt: now,\n updatedAt: now,\n });\n\n // 2. Re-point all edges from duplicate → canonical\n // Edges where duplicate is the source\n const outgoingEdges = readRowList(\n await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from\", (q: IndexQuery) =>\n q.eq(\"fromNodeId\", args.duplicateNodeId)\n )\n .collect(),\n readEntityEdgeRecord\n );\n\n for (const edge of outgoingEdges) {\n if (edge.toNodeId === args.canonicalNodeId) {\n continue; // Skip derived_from merge edge\n }\n await ctx.db.patch(edge._id, {\n fromNodeId: args.canonicalNodeId,\n sourceGlobalId: canonical.globalId,\n updatedAt: now,\n });\n }\n\n // Edges where duplicate is the target\n const incomingEdges = readRowList(\n await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_to\", (q: IndexQuery) =>\n q.eq(\"toNodeId\", args.duplicateNodeId)\n )\n .collect(),\n readEntityEdgeRecord\n );\n\n for (const edge of incomingEdges) {\n if (edge.fromNodeId === args.canonicalNodeId) {\n continue; // Skip derived_from merge edge\n }\n await ctx.db.patch(edge._id, {\n toNodeId: args.canonicalNodeId,\n targetGlobalId: canonical.globalId,\n updatedAt: now,\n });\n }\n\n // 3. Set duplicate status to 'superseded'\n const duplicateMetadata = duplicate.metadata ?? {};\n await ctx.db.patch(args.duplicateNodeId, {\n status: \"superseded\",\n metadata: {\n ...duplicateMetadata,\n status: \"superseded\",\n supersededBy: args.canonicalNodeId,\n mergedAt: now,\n mergedBy: authenticatedUserId,\n },\n updatedAt: now,\n });\n\n // Schedule Neo4j sync for both nodes\n await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId: args.canonicalNodeId,\n operation: \"upsert\",\n });\n await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId: args.duplicateNodeId,\n operation: \"upsert\",\n });\n\n // Log to epistemic audit (Invariant #14)\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"entity\",\n entityId: args.canonicalNodeId,\n changeType: \"entity_merged\",\n changedAt: now,\n changedBy: authenticatedUserId,\n isAgent: false,\n rationale: `Entity merge: absorbed ${args.duplicateNodeId} (${duplicate.canonicalText}). ${outgoingEdges.length + incomingEdges.length} edges re-pointed.`,\n previousState: null,\n newState: {\n nodeType: canonical.nodeType,\n canonicalText: canonical.canonicalText,\n },\n projectId: canonical.projectId,\n });\n\n // Count only edges that were actually re-pointed (exclude skipped same_as)\n const outgoingRepointed = outgoingEdges.filter(\n (e) => e.toNodeId !== args.canonicalNodeId\n ).length;\n const incomingRepointed = incomingEdges.filter(\n (e) => e.fromNodeId !== args.canonicalNodeId\n ).length;\n\n // OE-E: Reactive hook — schedule belief review for the canonical entity.\n // After merge, beliefs previously connected to the duplicate now point to\n // the canonical entity. Review whether those beliefs still hold.\n await ctx.scheduler.runAfter(\n 0,\n internal.lucernMcp.triggerEntityChangeReview,\n {\n entityNodeId: args.canonicalNodeId,\n changeDescription: `Merged with duplicate \"${duplicate.canonicalText}\". ${outgoingRepointed + incomingRepointed} edges re-pointed.`,\n userId: authenticatedUserId,\n }\n );\n\n return {\n canonicalNodeId: args.canonicalNodeId,\n duplicateNodeId: args.duplicateNodeId,\n edgesRepointed: outgoingRepointed + incomingRepointed,\n };\n },\n});\n\n// =============================================================================\n// ARCHIVE ENTITY\n// =============================================================================\n\n/**\n * Archive an entity. Sets status to 'archived'.\n * Non-destructive: entity preserved with full lineage.\n */\nexport const archiveEntity = mutation({\n args: {\n nodeId: v.id(\"epistemicNodes\"),\n },\n returns: permissiveReturn,\n handler: async (ctx: MutationCtx, args: ArchiveEntityArgs) => {\n const authenticatedUserId = await requireAuthenticatedUserId(ctx);\n const now = Date.now();\n\n const node = await loadEntityForUpdate(ctx, args.nodeId);\n\n if (node.projectId) {\n await requireScopeWriteAccess(ctx, node.projectId, authenticatedUserId);\n }\n\n await ctx.db.patch(args.nodeId, {\n status: \"archived\",\n updatedAt: now,\n });\n\n // Schedule Neo4j sync\n await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId: args.nodeId,\n operation: \"upsert\",\n });\n\n // Log to epistemic audit (Invariant #14)\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"entity\",\n entityId: args.nodeId,\n changeType: \"entity_archived\",\n changedAt: now,\n changedBy: authenticatedUserId,\n isAgent: false,\n previousState: { status: node.status },\n newState: { status: \"archived\" },\n projectId: node.projectId,\n });\n\n // OE-E: Reactive hook — schedule belief review for archived entity.\n // Beliefs that referenced this entity may need reassessment.\n await ctx.scheduler.runAfter(\n 0,\n internal.lucernMcp.triggerEntityChangeReview,\n {\n entityNodeId: args.nodeId,\n changeDescription: `Entity \"${node.canonicalText}\" was archived.`,\n userId: authenticatedUserId,\n }\n );\n\n return { nodeId: args.nodeId, archived: true };\n },\n});\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/entityValidation.ts"],"names":[],"mappings":"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","file":"entityValidation.js","sourcesContent":["// biome-ignore-all lint/style/useFilenamingConvention: Public ABI surface; rename requires a cross-package migration update.\n/**\n * Entity Metadata Validation\n *\n * Validates entity metadata against registered schemas in schemaEnumConfig.\n * Strict on create (must pass), lenient on read (existing data tolerance).\n *\n * @module graph-primitives/entityValidation\n */\n\nimport type { MutationCtx, QueryCtx } from \"./convex\";\n\ninterface UnknownRecord {\n [key: string]: unknown;\n}\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\ntype EntitySchemaConfigFieldType = \"string\" | \"number\" | \"boolean\";\n\ninterface EntitySchemaConfigEntry {\n required: boolean;\n type: EntitySchemaConfigFieldType;\n}\n\ninterface FieldSchema {\n required: boolean;\n type: EntitySchemaConfigFieldType;\n}\n\ntype EntitySchema = Record<string, FieldSchema>;\n\ninterface SchemaEnumConfigRow {\n metadata?: UnknownRecord;\n status?: string;\n value?: string;\n}\n\nfunction isObjectLike(value: unknown): value is UnknownRecord {\n return value !== null && typeof value === \"object\";\n}\n\nfunction isEntitySchemaConfigField(\n value: unknown\n): value is EntitySchemaConfigEntry {\n if (!isObjectLike(value)) {\n return false;\n }\n const required = value.required;\n const type = value.type;\n return (\n typeof required === \"boolean\" &&\n (type === \"string\" || type === \"number\" || type === \"boolean\")\n );\n}\n\nfunction readEntitySchema(value: unknown): EntitySchema {\n if (!isObjectLike(value)) {\n return {};\n }\n const schema: EntitySchema = {};\n for (const [fieldName, fieldValue] of Object.entries(value)) {\n if (!isEntitySchemaConfigField(fieldValue)) {\n continue;\n }\n schema[fieldName] = fieldValue;\n }\n return schema;\n}\n\nfunction readSchemaEnumConfigRow(row: unknown): SchemaEnumConfigRow | null {\n if (!isObjectLike(row)) {\n return null;\n }\n\n const value = row.value;\n if (typeof value !== \"string\") {\n return null;\n }\n\n return {\n value,\n status: typeof row.status === \"string\" ? row.status : undefined,\n metadata: isObjectLike(row.metadata) ? row.metadata : undefined,\n };\n}\n\nfunction readEntitySchemaFromConfig(row: unknown): EntitySchema | null {\n const parsed = readSchemaEnumConfigRow(row);\n if (parsed?.status !== \"active\" || !parsed?.metadata) {\n return null;\n }\n\n const schema = parsed.metadata.schema;\n if (!schema) {\n return null;\n }\n\n return readEntitySchema(schema);\n}\n\ninterface ValidationResult {\n errors: string[];\n valid: boolean;\n}\n\n// =============================================================================\n// SCHEMA LOOKUP\n// =============================================================================\n\n/**\n * Fetch the registered metadata schema for an entity type.\n * Returns null if no schema is registered.\n */\nexport async function getEntityTypeSchema(\n ctx: QueryCtx | MutationCtx,\n nodeType: string,\n tenantId?: string\n): Promise<EntitySchema | null> {\n // Try tenant-specific first, then platform default\n if (tenantId) {\n const tenantEntries = await ctx.db\n .query(\"schemaEnumConfig\")\n .withIndex(\"by_tenant_category\", (q) =>\n q.eq(\"tenantId\", tenantId).eq(\"category\", \"entity_type\")\n )\n .collect();\n\n const tenantMatch = tenantEntries.find((entry) => {\n const parsed = readSchemaEnumConfigRow(entry);\n return (\n parsed !== null &&\n parsed.value === nodeType &&\n parsed.status === \"active\"\n );\n });\n const tenantSchema = readEntitySchemaFromConfig(tenantMatch);\n if (tenantSchema !== null) {\n return tenantSchema;\n }\n }\n\n // Fall back to platform default\n const platformEntry = await ctx.db\n .query(\"schemaEnumConfig\")\n .withIndex(\"by_category_value\", (q) =>\n q.eq(\"category\", \"entity_type\").eq(\"value\", nodeType)\n )\n .first();\n\n const platformSchema = readEntitySchemaFromConfig(platformEntry);\n if (platformSchema !== null) {\n return platformSchema;\n }\n\n return null;\n}\n\n// =============================================================================\n// VALIDATION\n// =============================================================================\n\n/**\n * Validate entity metadata against the registered schema.\n *\n * Policy: strict on create (unregistered types fail), lenient on read.\n *\n * @param ctx - Convex query/mutation context\n * @param nodeType - The entity nodeType (e.g., \"company\", \"person\")\n * @param metadata - The metadata object to validate\n * @param tenantId - Optional tenant ID for tenant-specific schemas\n * @returns ValidationResult with errors if invalid\n */\nexport async function validateEntityMetadata(\n ctx: QueryCtx | MutationCtx,\n nodeType: string,\n metadata: Record<string, unknown> | undefined | null,\n tenantId?: string\n): Promise<ValidationResult> {\n const errors: string[] = [];\n\n const schema = await getEntityTypeSchema(ctx, nodeType, tenantId);\n\n if (!schema) {\n return {\n valid: false,\n errors: [\n `No registered schema for entity type \"${nodeType}\". Register it in schemaEnumConfig (category=\"entity_type\") before creating entities of this type.`,\n ],\n };\n }\n\n const meta = metadata || {};\n\n // Check required fields\n for (const [fieldName, fieldDef] of Object.entries(schema)) {\n if (fieldDef.required) {\n const value = meta[fieldName];\n if (value === undefined || value === null || value === \"\") {\n errors.push(`Required field \"${fieldName}\" is missing or empty`);\n }\n }\n }\n\n // Check field types for provided fields\n for (const [fieldName, value] of Object.entries(meta)) {\n const fieldDef = schema[fieldName];\n if (!fieldDef) {\n // Extra fields are allowed (loose metadata tolerance)\n continue;\n }\n\n if (value === undefined || value === null) {\n // null/undefined are allowed for optional fields (already caught above for required)\n continue;\n }\n\n const actualType = typeof value;\n if (actualType !== fieldDef.type) {\n errors.push(\n `Field \"${fieldName}\" expected type \"${fieldDef.type}\" but got \"${actualType}\"`\n );\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\n/**\n * Check if a nodeType is a registered entity type (platform or tenant).\n */\nexport async function isRegisteredEntityType(\n ctx: QueryCtx | MutationCtx,\n nodeType: string,\n tenantId?: string\n): Promise<boolean> {\n const schema = await getEntityTypeSchema(ctx, nodeType, tenantId);\n return schema !== null;\n}\n"]}