@lucern/graph-primitives 0.3.0-alpha.0 → 0.3.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/beliefDecay.js +37 -1104
- package/dist/beliefDecay.js.map +1 -1
- package/dist/beliefEvidenceLinks.js +53 -834
- package/dist/beliefEvidenceLinks.js.map +1 -1
- package/dist/confidencePropagationDispatch.d.ts +3 -3
- package/dist/confidencePropagationDispatch.js +30 -308
- package/dist/confidencePropagationDispatch.js.map +1 -1
- package/dist/contradictions.js +5 -797
- package/dist/contradictions.js.map +1 -1
- package/dist/edges/contradicts.js +1 -122
- package/dist/edges/contradicts.js.map +1 -1
- package/dist/edges/dependsOn.js +14 -172
- package/dist/edges/dependsOn.js.map +1 -1
- package/dist/edges/elaborates.js +1 -49
- package/dist/edges/elaborates.js.map +1 -1
- package/dist/edges/index.js +14 -277
- package/dist/edges/index.js.map +1 -1
- package/dist/edges/informs.js +1 -62
- package/dist/edges/informs.js.map +1 -1
- package/dist/edges/propagationTypes.d.ts +2 -2
- package/dist/edges/propagationTypes.js.map +1 -1
- package/dist/edges/refutes.js +1 -62
- package/dist/edges/refutes.js.map +1 -1
- package/dist/edges/supports.js +1 -122
- package/dist/edges/supports.js.map +1 -1
- package/dist/edges/utils.d.ts +6 -6
- package/dist/edges/utils.js +1 -130
- package/dist/edges/utils.js.map +1 -1
- package/dist/entityBridge.js +2 -17
- package/dist/entityBridge.js.map +1 -1
- package/dist/entityLifecycle.js +62 -848
- package/dist/entityLifecycle.js.map +1 -1
- package/dist/epistemicAnswers.js +6 -802
- package/dist/epistemicAnswers.js.map +1 -1
- package/dist/epistemicBeliefs.js +125 -1594
- package/dist/epistemicBeliefs.js.map +1 -1
- package/dist/epistemicContractHelpers.js +1 -318
- package/dist/epistemicContractHelpers.js.map +1 -1
- package/dist/epistemicContracts.js +129 -1874
- package/dist/epistemicContracts.js.map +1 -1
- package/dist/epistemicEdges.js +60 -863
- package/dist/epistemicEdges.js.map +1 -1
- package/dist/epistemicEvidence.js +69 -1041
- package/dist/epistemicEvidence.js.map +1 -1
- package/dist/epistemicLinking.js +2 -785
- package/dist/epistemicLinking.js.map +1 -1
- package/dist/epistemicNodes.js +9 -866
- package/dist/epistemicNodes.js.map +1 -1
- package/dist/epistemicQuestions.js +66 -1071
- package/dist/epistemicQuestions.js.map +1 -1
- package/dist/epistemicSources.js +23 -880
- package/dist/epistemicSources.js.map +1 -1
- package/dist/evaluators/index.js +129 -1874
- package/dist/evaluators/index.js.map +1 -1
- package/dist/index.js +182 -2744
- package/dist/index.js.map +1 -1
- package/dist/ontology-matching.js +1 -344
- package/dist/ontology-matching.js.map +1 -1
- package/dist/ontologyApproval.js +1 -13
- package/dist/ontologyApproval.js.map +1 -1
- package/dist/ontologyDefinitions.js +2 -17
- package/dist/ontologyDefinitions.js.map +1 -1
- package/dist/ontologyRegistry.js +2 -17
- package/dist/ontologyRegistry.js.map +1 -1
- package/dist/projectionReconciliation.js +2 -17
- package/dist/projectionReconciliation.js.map +1 -1
- package/dist/questionEvidenceLinks.js +60 -841
- package/dist/questionEvidenceLinks.js.map +1 -1
- package/dist/text-matching.js +1 -244
- package/dist/text-matching.js.map +1 -1
- package/dist/workflowBridge.d.ts +27 -0
- package/dist/workflowBridge.js +303 -0
- package/dist/workflowBridge.js.map +1 -0
- package/dist/workspaceIsolation.js +2 -52
- package/dist/workspaceIsolation.js.map +1 -1
- package/package.json +6 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../access-control/src/convex.ts","../../access-control/src/topicProjectOverlay.ts","../../access-control/src/projectGrantsBridge.ts","../../access-control/src/resolvers.ts","../../access-control/src/principalContext.ts","../../access-control/src/access.ts","../../access-control/src/auth.ts","../../../packages/contracts/src/schema-helpers/validators.ts","../src/convex.ts","../src/entityValidation.ts","../src/globalId.ts","../src/topicOntologyResolver.ts","../src/topicProjectOverlay.ts","../src/resolvers.ts","../src/topicScope.ts","../src/entityLifecycle.ts"],"names":["resolvedUser","user","api","anyApi","componentsGeneric","mutationGeneric","queryGeneric","v","LEGACY_SCOPE_FIELD","readNonEmptyString","readStringArray","readMetadata","readLegacyProjectId","coerceVisibility","coerceStatus","mapProjectType","isProjectLikeTopic","resolveTopicDoc","materializeTopicProjectOverlay","resolveTopicProjectOverlay","listTopicProjectOverlays","isMissingLucernChildComponentError","defaultResolvers","resolverOverrides"],"mappings":"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","file":"entityLifecycle.js","sourcesContent":["import {\n actionGeneric,\n anyApi,\n componentsGeneric,\n httpActionGeneric,\n internalActionGeneric,\n internalMutationGeneric,\n internalQueryGeneric,\n mutationGeneric,\n queryGeneric,\n} from \"convex/server\";\nimport type { GenericId } from \"convex/values\";\n\nexport const api = anyApi as any;\nexport const components = componentsGeneric() as any;\nexport const internal = anyApi as any;\n\nexport type TableNames = string;\nexport type Id<TableName extends TableNames = string> = GenericId<TableName>;\nexport type Doc<TableName extends TableNames = string> = any;\nexport type DataModel = any;\nexport type ActionCtx = any;\nexport type DatabaseReader = any;\nexport type DatabaseWriter = any;\nexport type MutationCtx = any;\nexport type QueryCtx = any;\n\nexport const action = actionGeneric as any;\nexport const httpAction = httpActionGeneric as any;\nexport const internalAction = internalActionGeneric as any;\nexport const internalMutation = internalMutationGeneric as any;\nexport const internalQuery = internalQueryGeneric as any;\nexport const mutation = mutationGeneric as any;\nexport const query = queryGeneric as any;\n","import { api } from \"./convex\";\n\ntype OverlayIdMode = \"legacy\" | \"topic\";\nconst LEGACY_SCOPE_FIELD = \"graphScope\" + \"ProjectId\";\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 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 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 _creationTime: number;\n createdAt: number;\n updatedAt: number;\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 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\nasync function resolveTopicDoc(\n ctx: any,\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(scopeId as any)) as TopicDocLike | null;\n if (directTopic) {\n return directTopic;\n }\n } catch {\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(api.topics.get as any, {\n id: String(scopeId),\n });\n if (topic?.name !== undefined && topic?.type !== undefined) {\n return topic as TopicDocLike;\n }\n } catch {\n // Fall through to legacy-scope lookup.\n }\n\n try {\n const topic = await ctx.runQuery(api.topics.getByLegacyScopeId as any, {\n projectId: String(scopeId),\n });\n if (topic?.name !== undefined && topic?.type !== undefined) {\n return topic as TopicDocLike;\n }\n } catch {\n // Best-effort compat lookup only.\n }\n\n return null;\n}\n\nfunction 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 const createdAt =\n typeof topic.createdAt === \"number\"\n ? topic.createdAt\n : typeof topic._creationTime === \"number\"\n ? topic._creationTime\n : 0;\n const updatedAt =\n typeof topic.updatedAt === \"number\"\n ? topic.updatedAt\n : typeof metadata.updatedAt === \"number\"\n ? (metadata.updatedAt as number)\n : createdAt;\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 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\" ? (metadata.chatCount as number) : 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: any,\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: any,\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 {\n allTopics = [];\n }\n }\n\n if (allTopics.length === 0 && typeof ctx.runQuery === \"function\") {\n allTopics =\n (((await ctx.runQuery(api.topics.list as any, {})) ?? []) 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","import type { Id } from \"./convex\";\nimport { resolveTopicProjectOverlay } from \"./topicProjectOverlay.js\";\n\nconst PROJECT_GRANT_STATUSES = [\"active\", \"revoked\", \"expired\"] as const;\n\ntype ProjectGrantStatus = (typeof PROJECT_GRANT_STATUSES)[number];\n\ntype ProjectGrantRow = Record<string, unknown> & {\n _id: Id<\"projectGrants\">;\n topicId?: string;\n projectId?: string;\n principalId?: string;\n groupId?: string;\n status?: ProjectGrantStatus;\n};\n\ntype ProjectGrantWrite = Record<string, unknown> & {\n topicId?: string;\n projectId?: string;\n};\n\nfunction normalizeString(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nasync function resolveGrantScopeIds(\n ctx: any,\n args: {\n topicId?: unknown;\n projectId?: unknown;\n }\n): Promise<{ topicId?: string; projectId?: string }> {\n const topicId = normalizeString(args.topicId);\n const projectId = normalizeString(args.projectId);\n\n for (const scopeId of [topicId, projectId]) {\n if (!scopeId) {\n continue;\n }\n\n try {\n const overlay = await resolveTopicProjectOverlay(ctx, scopeId, {\n idMode: \"legacy\",\n projectLikeOnly: false,\n });\n if (overlay) {\n return {\n topicId: normalizeString(overlay.topicId) ?? topicId,\n projectId:\n normalizeString(overlay.projectId) ?? projectId ?? scopeId,\n };\n }\n } catch {\n // Fall back to the raw ids when the topic overlay bridge is unavailable.\n }\n }\n\n return { topicId, projectId };\n}\n\nasync function normalizeProjectGrantRow(\n ctx: any,\n row: ProjectGrantRow\n): Promise<ProjectGrantRow> {\n const scope = await resolveGrantScopeIds(ctx, {\n topicId: row.topicId,\n projectId: row.projectId,\n });\n\n return {\n ...row,\n ...(scope.topicId ? { topicId: scope.topicId } : {}),\n ...(scope.projectId ?? scope.topicId\n ? { projectId: scope.projectId ?? scope.topicId }\n : {}),\n };\n}\n\nasync function normalizeProjectGrantRows(\n ctx: any,\n rows: ProjectGrantRow[]\n): Promise<ProjectGrantRow[]> {\n return await Promise.all(rows.map((row) => normalizeProjectGrantRow(ctx, row)));\n}\n\nasync function listProjectGrantsByPrincipal(\n ctx: any,\n principalId: string\n): Promise<ProjectGrantRow[]> {\n const rows = await Promise.all(\n PROJECT_GRANT_STATUSES.map((status) =>\n ctx.db\n .query(\"projectGrants\")\n .withIndex(\"by_principal_status\", (q: any) =>\n q.eq(\"principalId\", principalId).eq(\"status\", status)\n )\n .collect()\n )\n );\n return await normalizeProjectGrantRows(ctx, rows.flat() as ProjectGrantRow[]);\n}\n\nasync function listProjectGrantsByGroup(\n ctx: any,\n groupId: string\n): Promise<ProjectGrantRow[]> {\n const rows = await Promise.all(\n PROJECT_GRANT_STATUSES.map((status) =>\n ctx.db\n .query(\"projectGrants\")\n .withIndex(\"by_group_status\", (q: any) =>\n q.eq(\"groupId\", groupId).eq(\"status\", status)\n )\n .collect()\n )\n );\n return await normalizeProjectGrantRows(ctx, rows.flat() as ProjectGrantRow[]);\n}\n\nfunction buildScopeMatchers(\n inputScopeId: string,\n resolved: { topicId?: string; projectId?: string }\n): Set<string> {\n return new Set(\n [inputScopeId, resolved.topicId, resolved.projectId]\n .map((value) => normalizeString(value))\n .filter((value): value is string => Boolean(value))\n );\n}\n\nfunction matchesResolvedScope(\n row: ProjectGrantRow,\n scopeIds: Set<string>\n): boolean {\n const rowTopicId = normalizeString(row.topicId);\n const rowProjectId = normalizeString(row.projectId);\n return (\n (rowTopicId !== undefined && scopeIds.has(rowTopicId)) ||\n (rowProjectId !== undefined && scopeIds.has(rowProjectId))\n );\n}\n\nexport async function bridgeListProjectGrants(ctx: any): Promise<any[]> {\n const rows = (await ctx.db.query(\"projectGrants\").collect()) as ProjectGrantRow[];\n return await normalizeProjectGrantRows(ctx, rows);\n}\n\nexport async function bridgeListProjectGrantsByTopicId(\n ctx: any,\n topicId: string\n): Promise<any[]> {\n const resolved = await resolveGrantScopeIds(ctx, { topicId });\n const rows = await bridgeListProjectGrants(ctx);\n const scopeIds = buildScopeMatchers(topicId, resolved);\n return rows.filter((row) => matchesResolvedScope(row as ProjectGrantRow, scopeIds));\n}\n\nexport async function bridgeListProjectGrantsByTopicAndPrincipal(\n ctx: any,\n topicId: string,\n principalId: string\n): Promise<any[]> {\n const resolved = await resolveGrantScopeIds(ctx, { topicId });\n const scopeIds = buildScopeMatchers(topicId, resolved);\n const rows = await listProjectGrantsByPrincipal(ctx, principalId);\n return rows.filter((row) => matchesResolvedScope(row, scopeIds));\n}\n\nexport async function bridgeListProjectGrantsByTopicAndGroup(\n ctx: any,\n topicId: string,\n groupId: string\n): Promise<any[]> {\n const resolved = await resolveGrantScopeIds(ctx, { topicId });\n const scopeIds = buildScopeMatchers(topicId, resolved);\n const rows = await listProjectGrantsByGroup(ctx, groupId);\n return rows.filter((row) => matchesResolvedScope(row, scopeIds));\n}\n\nexport async function bridgeListProjectGrantsByPrincipalStatus(\n ctx: any,\n principalId: string,\n status: ProjectGrantStatus\n): Promise<any[]> {\n const rows = await listProjectGrantsByPrincipal(ctx, principalId);\n return rows.filter((row) => row.status === status);\n}\n\nexport async function bridgeListProjectGrantsByGroupStatus(\n ctx: any,\n groupId: string,\n status: ProjectGrantStatus\n): Promise<any[]> {\n const rows = await listProjectGrantsByGroup(ctx, groupId);\n return rows.filter((row) => row.status === status);\n}\n\nexport async function bridgeInsertProjectGrant(\n ctx: any,\n value: ProjectGrantWrite\n): Promise<Id<\"projectGrants\">> {\n const resolved = await resolveGrantScopeIds(ctx, value);\n return await ctx.db.insert(\"projectGrants\", {\n ...value,\n ...(resolved.topicId ? { topicId: resolved.topicId } : {}),\n ...(resolved.projectId ?? resolved.topicId\n ? { projectId: resolved.projectId ?? resolved.topicId }\n : {}),\n });\n}\n\nexport async function bridgePatchProjectGrant(\n ctx: any,\n projectGrantId: string,\n value: ProjectGrantWrite\n): Promise<void> {\n const resolved = await resolveGrantScopeIds(ctx, value);\n await ctx.db.patch(projectGrantId, {\n ...value,\n ...(resolved.topicId ? { topicId: resolved.topicId } : {}),\n ...(resolved.projectId ?? resolved.topicId\n ? { projectId: resolved.projectId ?? resolved.topicId }\n : {}),\n });\n}\n","/** Data-source resolver wiring for topic-scoped access control. */\nimport { api as appApi } from \"./convex\";\nimport {\n bridgeInsertProjectGrant,\n bridgeListProjectGrantsByGroupStatus,\n bridgeListProjectGrantsByPrincipalStatus,\n bridgeListProjectGrantsByTopicAndGroup,\n bridgeListProjectGrantsByTopicAndPrincipal,\n} from \"./projectGrantsBridge.js\";\nimport {\n listTopicProjectOverlays,\n resolveTopicProjectOverlay,\n} from \"./topicProjectOverlay.js\";\nimport type {\n AccessControlAppResolverContext,\n AccessControlAppResolvers,\n} from \"./resolverTypes\";\n\nasync function findUserByClerkId(\n ctx: AccessControlAppResolverContext,\n clerkId: string\n): Promise<Record<string, unknown> | null> {\n const normalizedClerkId = clerkId.trim();\n if (!normalizedClerkId) {\n return null;\n }\n\n if (typeof ctx.runQuery === \"function\") {\n try {\n const bridgedUser = await ctx.runQuery(appApi.users.getUserByClerkId as any, {\n clerkId: normalizedClerkId,\n });\n if (bridgedUser) {\n return bridgedUser as Record<string, unknown>;\n }\n } catch {\n // Some dev deployments still carry the users table without the legacy\n // by_clerkId index. Fall through to a direct table scan instead of failing\n // the MCP request path closed on index drift alone.\n }\n }\n\n try {\n const users = await ctx.db.query(\"users\").collect();\n return (\n users.find((user) => String((user as { clerkId?: unknown }).clerkId ?? \"\") === normalizedClerkId) ??\n null\n ) as Record<string, unknown> | null;\n } catch {\n return null;\n }\n}\n\nasync function findUserByPrincipalId(\n ctx: AccessControlAppResolverContext,\n principalId: string\n): Promise<Record<string, unknown> | null> {\n const normalizedPrincipalId = principalId.trim();\n if (!normalizedPrincipalId) {\n return null;\n }\n\n try {\n const users = await ctx.db.query(\"users\").collect();\n return (\n users.find(\n (user) =>\n String((user as { defaultPrincipalId?: unknown }).defaultPrincipalId ?? \"\") ===\n normalizedPrincipalId\n ) ?? null\n ) as Record<string, unknown> | null;\n } catch {\n return null;\n }\n}\n\nasync function findAgentByPrincipalId(\n ctx: AccessControlAppResolverContext,\n principalId: string\n): Promise<Record<string, unknown> | null> {\n const normalizedPrincipalId = principalId.trim();\n if (!normalizedPrincipalId) {\n return null;\n }\n\n if (typeof ctx.runQuery === \"function\") {\n try {\n const bridgedAgent = await ctx.runQuery(\n (appApi as any).agents.getAgentByPrincipalId,\n {\n principalId: normalizedPrincipalId,\n }\n );\n if (bridgedAgent) {\n return bridgedAgent as Record<string, unknown>;\n }\n } catch {\n // Fall through to direct scan for local index drift in dev deployments.\n }\n }\n\n try {\n const agents = await ctx.db.query(\"agents\").collect();\n return (\n agents.find(\n (agent) =>\n String((agent as { principalId?: unknown }).principalId ?? \"\") ===\n normalizedPrincipalId\n ) ?? null\n ) as Record<string, unknown> | null;\n } catch {\n return null;\n }\n}\n\nfunction defaultResolvers(): AccessControlAppResolvers {\n return {\n async getProject(ctx, topicId) {\n return await resolveTopicProjectOverlay(ctx, topicId, {\n idMode: \"legacy\",\n projectLikeOnly: false,\n });\n },\n async listTopics(ctx) {\n return await listTopicProjectOverlays(ctx, { idMode: \"legacy\" });\n },\n async listTopicsByOwner(ctx, ownerId) {\n const topics = await listTopicProjectOverlays(ctx, { idMode: \"legacy\" });\n return topics.filter((topic) => topic.ownerId === ownerId);\n },\n async listTopicsByVisibility(ctx, visibility) {\n const topics = await listTopicProjectOverlays(ctx, { idMode: \"legacy\" });\n return topics.filter((topic) => topic.visibility === visibility);\n },\n async listProjectGrantsByProjectAndPrincipal(ctx, topicId, principalId) {\n return await bridgeListProjectGrantsByTopicAndPrincipal(\n ctx,\n topicId,\n principalId\n );\n },\n async listProjectGrantsByProjectAndGroup(ctx, topicId, groupId) {\n return await bridgeListProjectGrantsByTopicAndGroup(ctx, topicId, groupId);\n },\n async listProjectGrantsByPrincipalStatus(ctx, principalId, status) {\n return await bridgeListProjectGrantsByPrincipalStatus(\n ctx,\n principalId,\n status\n );\n },\n async listProjectGrantsByGroupStatus(ctx, groupId, status) {\n return await bridgeListProjectGrantsByGroupStatus(ctx, groupId, status);\n },\n async insertProjectGrant(ctx, value) {\n return (await bridgeInsertProjectGrant(ctx, value)) as any;\n },\n async getAgentByPrincipalId(ctx, principalId) {\n return await findAgentByPrincipalId(ctx, principalId);\n },\n async getUserByClerkId(ctx, clerkId) {\n return await findUserByClerkId(ctx, clerkId);\n },\n async getUserByPrincipalId(ctx, principalId) {\n return await findUserByPrincipalId(ctx, principalId);\n },\n };\n}\n\nlet resolverOverrides: Partial<AccessControlAppResolvers> = {};\n\nexport function configureAccessControlAppResolvers(\n overrides: Partial<AccessControlAppResolvers>\n): void {\n resolverOverrides = {\n ...resolverOverrides,\n ...overrides,\n };\n}\n\nexport function resetAccessControlAppResolvers(): void {\n resolverOverrides = {};\n}\n\nexport function resolveAccessControlAppResolvers(\n _ctx: AccessControlAppResolverContext\n): AccessControlAppResolvers {\n return {\n ...defaultResolvers(),\n ...resolverOverrides,\n };\n}\n","/**\n * Principal Context Resolver\n *\n * Derives principal context from the local `users` table only.\n * Governance tables (platformPrincipals, platformMemberships,\n * platformGroupMemberships) have been migrated to Master Control\n * and no longer exist in the tenant deployment.\n */\n\nimport type { MutationCtx, QueryCtx } from \"./convex\";\nimport { resolveAccessControlAppResolvers } from \"./resolvers\";\n\ntype DbCtx = QueryCtx | MutationCtx;\n\nexport type PlatformRole =\n | \"platform_admin\"\n | \"tenant_admin\"\n | \"workspace_admin\"\n | \"editor\"\n | \"viewer\"\n | \"auditor\"\n | \"service_agent\";\n\ntype ResolvedPrincipalType = \"user\" | \"group\" | \"service\" | \"external_viewer\";\n\nexport type ResolvedPrincipalContext = {\n principalId: string;\n principalType: ResolvedPrincipalType;\n clerkId: string;\n tenantId: string | null;\n workspaceId: string | null;\n roles: PlatformRole[];\n groupIds: string[];\n isPlatformAdmin: boolean;\n isTenantAdmin: boolean;\n isWorkspaceAdmin: boolean;\n isSystemFallback: boolean;\n};\n\ntype ResolvedUserRecord = {\n mcRole?: unknown;\n defaultTenantId?: unknown;\n defaultWorkspaceId?: unknown;\n defaultPrincipalId?: unknown;\n principalGroupIds?: unknown;\n};\n\ntype ResolvedAgentRecord = {\n principalId?: unknown;\n tenantId?: unknown;\n workspaceId?: unknown;\n roles?: unknown;\n groupIds?: unknown;\n};\n\ntype CanonicalResolvedUser = {\n mcRole: PlatformRole;\n defaultTenantId: string;\n defaultWorkspaceId: string;\n defaultPrincipalId: string;\n};\n\nfunction requireCanonicalResolvedUser(\n user: Record<string, unknown> | null,\n clerkId: string\n): CanonicalResolvedUser {\n const resolved = user as ResolvedUserRecord | null;\n if (!resolved) {\n throw new Error(\n `[AccessControl] Canonical user identity required for ${clerkId}. Sync users.upsertUser before user-bound access checks.`\n );\n }\n\n const { mcRole, defaultTenantId, defaultWorkspaceId, defaultPrincipalId } = resolved;\n if (\n mcRole !== \"platform_admin\" &&\n mcRole !== \"tenant_admin\" &&\n mcRole !== \"workspace_admin\" &&\n mcRole !== \"editor\" &&\n mcRole !== \"viewer\" &&\n mcRole !== \"auditor\" &&\n mcRole !== \"service_agent\"\n ) {\n throw new Error(\n `[AccessControl] Canonical MC role required for ${clerkId}. Re-sync Master Control identity before user-bound access checks.`\n );\n }\n\n if (typeof defaultTenantId !== \"string\" || defaultTenantId.trim().length === 0) {\n throw new Error(\n `[AccessControl] Canonical home tenant required for ${clerkId}. Re-sync Master Control identity before user-bound access checks.`\n );\n }\n\n if (\n typeof defaultWorkspaceId !== \"string\" ||\n defaultWorkspaceId.trim().length === 0\n ) {\n throw new Error(\n `[AccessControl] Canonical home workspace required for ${clerkId}. Re-sync Master Control identity before user-bound access checks.`\n );\n }\n\n if (\n typeof defaultPrincipalId !== \"string\" ||\n defaultPrincipalId.trim().length === 0\n ) {\n throw new Error(\n `[AccessControl] Canonical federated principal required for ${clerkId}. Re-sync Master Control identity before user-bound access checks.`\n );\n }\n\n return {\n mcRole,\n defaultTenantId: defaultTenantId.trim(),\n defaultWorkspaceId: defaultWorkspaceId.trim(),\n defaultPrincipalId: defaultPrincipalId.trim(),\n };\n}\n\nfunction isPrincipalIdInput(value: string): boolean {\n return (\n value.startsWith(\"user:\") ||\n value.startsWith(\"group:\") ||\n value.startsWith(\"service:\") ||\n value.startsWith(\"agent:\") ||\n value.startsWith(\"external_viewer:\")\n );\n}\n\nasync function resolveCanonicalUserRecord(\n ctx: DbCtx,\n actorId: string\n): Promise<{\n resolvedUser: Record<string, unknown> | null;\n clerkId: string;\n contextClerkId: string;\n}> {\n const normalizedActorId = actorId.trim();\n const clerkId =\n isPrincipalIdInput(normalizedActorId) && normalizedActorId.startsWith(\"user:\")\n ? normalizedActorId.slice(\"user:\".length)\n : normalizedActorId;\n const resolvers = resolveAccessControlAppResolvers(ctx);\n const resolvedByClerkId = await resolvers.getUserByClerkId(ctx, clerkId);\n\n if (resolvedByClerkId) {\n return {\n resolvedUser: resolvedByClerkId as Record<string, unknown>,\n clerkId,\n contextClerkId: clerkId,\n };\n }\n\n const resolvedByPrincipalId = await resolvers.getUserByPrincipalId(\n ctx,\n normalizedActorId\n );\n return {\n resolvedUser: (resolvedByPrincipalId as Record<string, unknown> | null) ?? null,\n clerkId,\n contextClerkId:\n normalizedActorId.startsWith(\"user:\") && clerkId.length > 0\n ? clerkId\n : normalizedActorId,\n };\n}\n\nfunction uniqRoles(roles: string[]): PlatformRole[] {\n const roleSet = new Set<PlatformRole>();\n for (const role of roles) {\n if (\n role === \"platform_admin\" ||\n role === \"tenant_admin\" ||\n role === \"workspace_admin\" ||\n role === \"editor\" ||\n role === \"viewer\" ||\n role === \"auditor\" ||\n role === \"service_agent\"\n ) {\n roleSet.add(role);\n }\n }\n return [...roleSet];\n}\n\nfunction normalizeGroupIds(value: unknown): string[] {\n if (!Array.isArray(value)) {\n return [];\n }\n\n return [...new Set(\n value\n .filter((entry): entry is string => typeof entry === \"string\")\n .map((entry) => entry.trim())\n .filter(Boolean)\n )];\n}\n\nfunction requireServiceAgentUser(\n user: Record<string, unknown> | null,\n actorId: string\n): CanonicalResolvedUser {\n const canonicalUser = requireCanonicalResolvedUser(user, actorId);\n if (canonicalUser.mcRole !== \"service_agent\") {\n throw new Error(\n `[AccessControl] Canonical service_agent identity required for ${actorId}. Sync users.upsertUser before agent-bound access checks.`\n );\n }\n return canonicalUser;\n}\n\nfunction requireCanonicalResolvedAgent(\n agent: Record<string, unknown> | null,\n actorId: string\n): {\n principalId: string;\n tenantId: string;\n workspaceId: string;\n roles: PlatformRole[];\n groupIds: string[];\n} {\n const resolved = agent as ResolvedAgentRecord | null;\n if (!resolved) {\n throw new Error(\n `[AccessControl] Agent \"${actorId}\" not found in agents or users table.`\n );\n }\n\n if (typeof resolved.principalId !== \"string\" || resolved.principalId.trim().length === 0) {\n throw new Error(\n `[AccessControl] Canonical agent principalId required for ${actorId}.`\n );\n }\n\n if (typeof resolved.tenantId !== \"string\" || resolved.tenantId.trim().length === 0) {\n throw new Error(\n `[AccessControl] Canonical home tenant required for ${actorId}.`\n );\n }\n\n if (\n typeof resolved.workspaceId !== \"string\" ||\n resolved.workspaceId.trim().length === 0\n ) {\n throw new Error(\n `[AccessControl] Canonical home workspace required for ${actorId}.`\n );\n }\n\n return {\n principalId: resolved.principalId.trim(),\n tenantId: resolved.tenantId.trim(),\n workspaceId: resolved.workspaceId.trim(),\n roles:\n uniqRoles(Array.isArray(resolved.roles) ? (resolved.roles as string[]) : []) ??\n [\"service_agent\"],\n groupIds: normalizeGroupIds(resolved.groupIds),\n };\n}\n\nfunction _pickHomeMembership(\n memberships: Array<{\n tenantId: string;\n workspaceId?: string;\n role: PlatformRole;\n }>\n) {\n const rolePriority: Record<PlatformRole, number> = {\n platform_admin: 7,\n tenant_admin: 6,\n workspace_admin: 5,\n editor: 4,\n auditor: 3,\n viewer: 2,\n service_agent: 1,\n };\n\n const sorted = [...memberships].sort(\n (a, b) => rolePriority[b.role] - rolePriority[a.role]\n );\n\n return sorted[0] ?? null;\n}\n\n/**\n * Resolve principal context from the local `users` table.\n *\n * Governance tables (platformPrincipals, platformMemberships,\n * platformGroupMemberships) have been migrated to Master Control.\n * This function now derives all context from the `users` table\n * via the app resolver layer.\n */\nexport async function resolvePrincipalContext(\n ctx: DbCtx,\n actorId: string\n): Promise<ResolvedPrincipalContext> {\n if (actorId.startsWith(\"agent:\")) {\n const resolvers = resolveAccessControlAppResolvers(ctx);\n const resolvedAgent = await resolvers.getAgentByPrincipalId(ctx, actorId);\n\n if (resolvedAgent) {\n const agent = requireCanonicalResolvedAgent(\n resolvedAgent as Record<string, unknown> | null,\n actorId\n );\n return {\n principalId: agent.principalId,\n principalType: \"service\",\n clerkId: actorId,\n tenantId: agent.tenantId,\n workspaceId: agent.workspaceId,\n roles: agent.roles.length > 0 ? agent.roles : [\"service_agent\"],\n groupIds: agent.groupIds,\n isPlatformAdmin: false,\n isTenantAdmin: false,\n isWorkspaceAdmin: false,\n isSystemFallback: false,\n };\n }\n\n const resolvedUser = (await resolvers.getUserByClerkId(\n ctx,\n actorId\n )) as ResolvedUserRecord | null;\n if (!resolvedUser) {\n throw new Error(\n `[AccessControl] Agent \"${actorId}\" not found in agents or users table.`\n );\n }\n const user = requireServiceAgentUser(\n resolvedUser as Record<string, unknown> | null,\n actorId\n );\n console.warn(\n `[AccessControl] Deprecated legacy service-agent fallback for ${actorId}; migrate this principal into identity.agents.`\n );\n\n return {\n principalId: user.defaultPrincipalId,\n principalType: \"service\",\n clerkId: actorId,\n tenantId: user.defaultTenantId,\n workspaceId: user.defaultWorkspaceId,\n roles: [\"service_agent\"],\n groupIds: normalizeGroupIds(resolvedUser?.principalGroupIds),\n isPlatformAdmin: false,\n isTenantAdmin: false,\n isWorkspaceAdmin: false,\n isSystemFallback: false,\n };\n }\n\n const {\n resolvedUser,\n contextClerkId,\n } = await resolveCanonicalUserRecord(ctx, actorId);\n const user = requireCanonicalResolvedUser(\n resolvedUser as Record<string, unknown> | null,\n contextClerkId\n );\n if (!user.defaultPrincipalId) {\n throw new Error(\n `[AccessControl] Canonical federated principal required for ${contextClerkId}. Re-sync Master Control identity before user-bound access checks.`\n );\n }\n\n if (user.mcRole === \"service_agent\") {\n return {\n principalId: user.defaultPrincipalId,\n principalType: \"service\",\n clerkId: contextClerkId,\n tenantId: user.defaultTenantId,\n workspaceId: user.defaultWorkspaceId,\n roles: [\"service_agent\"],\n groupIds: normalizeGroupIds(resolvedUser?.principalGroupIds),\n isPlatformAdmin: false,\n isTenantAdmin: false,\n isWorkspaceAdmin: false,\n isSystemFallback: false,\n };\n }\n\n const principalId = user.defaultPrincipalId;\n\n const effectiveRole = user.mcRole;\n\n const roles: PlatformRole[] = effectiveRole === \"platform_admin\"\n ? [\"platform_admin\", \"tenant_admin\"]\n : effectiveRole === \"tenant_admin\"\n ? [\"tenant_admin\"]\n : [effectiveRole];\n\n const tenantId = user.defaultTenantId;\n const workspaceId = user.defaultWorkspaceId;\n\n const isPlatformAdmin = effectiveRole === \"platform_admin\";\n\n return {\n principalId,\n principalType: \"user\",\n clerkId: contextClerkId,\n tenantId,\n workspaceId,\n roles: uniqRoles(roles),\n groupIds: normalizeGroupIds(resolvedUser?.principalGroupIds),\n isPlatformAdmin,\n isTenantAdmin: isPlatformAdmin || effectiveRole === \"tenant_admin\",\n isWorkspaceAdmin: isPlatformAdmin || effectiveRole === \"tenant_admin\" || effectiveRole === \"workspace_admin\",\n isSystemFallback: false,\n };\n}\n\n/**\n * Ensure a user principal context exists.\n *\n * Governance bootstrap (creating platformPrincipals, memberships, etc.)\n * has moved to Master Control. This tenant-side stub resolves the\n * existing context from the local `users` table without creating\n * any governance records.\n */\nexport async function ensureUserPrincipalContext(\n ctx: MutationCtx,\n args: {\n clerkId: string;\n email?: string;\n name?: string;\n isAdmin?: boolean;\n actorPrincipalId?: string;\n }\n): Promise<ResolvedPrincipalContext> {\n return resolvePrincipalContext(ctx, args.clerkId);\n}\n","/**\n * Centralized Access Control for Convex\n *\n * This module provides consistent authorization patterns across all Convex\n * mutations and queries. Access checks are principal-context driven and honor\n * tenant ringfencing, explicit topic grants, and broad visibility semantics.\n *\n * Access Rules:\n * - Platform admins have access to all topics\n * - Topic owners have full access to their topics\n * - Explicit topic grants (principal/group) provide access across visibility modes\n * - Legacy `sharedWith` remains a compatibility bridge during migration\n * - `firm` visibility is tenant-scoped and blocked for principals marked external\n * - `public` visibility is available to any authenticated user\n * - Resources without a topic are accessible only to their creator\n */\n\nimport type { MutationCtx, QueryCtx } from \"./convex\";\nimport {\n resolvePrincipalContext,\n type ResolvedPrincipalContext,\n} from \"./principalContext\";\nimport { resolveAccessControlAppResolvers } from \"./resolvers\";\n\ntype DbCtx = QueryCtx | MutationCtx;\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type TopicRecord = {\n _id: string;\n ownerId: string;\n sharedWith: string[];\n visibility: \"private\" | \"team\" | \"firm\" | \"external\" | \"public\";\n tenantId?: string;\n workspaceId?: string;\n};\n\n/** @deprecated Use TopicRecord inside access-control. */\nexport type Project = {\n _id: string;\n ownerId: string;\n sharedWith: string[];\n visibility: \"private\" | \"team\" | \"firm\" | \"external\" | \"public\";\n tenantId?: string;\n workspaceId?: string;\n};\n\nexport type ResourceWithTopic = {\n topicId?: string;\n /** @deprecated Use topicId inside access-control. */\n projectId?: string;\n userId?: string;\n createdBy?: string;\n};\n\n/** @deprecated Use ResourceWithTopic inside access-control. */\nexport type ResourceWithProject = ResourceWithTopic;\n\nexport type AccessCheckResult = {\n hasAccess: boolean;\n isAdmin: boolean;\n isOwner: boolean;\n isShared: boolean;\n hasGrant: boolean;\n isFirmVisible: boolean;\n isExternalVisible: boolean;\n isPublicVisible: boolean;\n isTenantScopeMatch: boolean;\n isWorkspaceScopeMatch: boolean;\n isPrincipalExternal: boolean;\n};\n\nfunction isTopicInPrincipalTenant(\n topic: { tenantId?: string },\n principalTenantId: string | null\n): boolean {\n if (!topic.tenantId) {\n return false;\n }\n if (!principalTenantId) {\n return false;\n }\n return String(topic.tenantId) === String(principalTenantId);\n}\n\nfunction isTopicInPrincipalWorkspace(\n topic: { workspaceId?: string },\n principalWorkspaceId: string | null\n): boolean {\n if (!topic.workspaceId) {\n return false;\n }\n if (!principalWorkspaceId) {\n return false;\n }\n return String(topic.workspaceId) === String(principalWorkspaceId);\n}\n\nfunction isLegacyUnscopedTopic(topic: {\n tenantId?: string;\n workspaceId?: string;\n}): boolean {\n return !topic.tenantId || !topic.workspaceId;\n}\n\nexport function isGrantScopeAlignedToTopic(\n topic: {\n tenantId?: string;\n workspaceId?: string;\n },\n grant: {\n tenantId?: string;\n workspaceId?: string;\n }\n): boolean {\n if (\n topic.tenantId &&\n grant.tenantId &&\n String(topic.tenantId) !== String(grant.tenantId)\n ) {\n return false;\n }\n if (\n topic.workspaceId &&\n grant.workspaceId &&\n String(topic.workspaceId) !== String(grant.workspaceId)\n ) {\n return false;\n }\n return true;\n}\n\n/** @deprecated Use isGrantScopeAlignedToTopic. */\nexport const isGrantScopeAlignedToProject = isGrantScopeAlignedToTopic;\n\nexport function isGroupScopeAlignedToTopic(\n topic: {\n tenantId?: string;\n workspaceId?: string;\n },\n group: {\n tenantId?: string;\n workspaceId?: string;\n }\n): boolean {\n if (\n topic.tenantId &&\n group.tenantId &&\n String(topic.tenantId) !== String(group.tenantId)\n ) {\n return false;\n }\n if (\n topic.workspaceId &&\n group.workspaceId &&\n String(topic.workspaceId) !== String(group.workspaceId)\n ) {\n return false;\n }\n return true;\n}\n\n/** @deprecated Use isGroupScopeAlignedToTopic. */\nexport const isGroupScopeAlignedToProject = isGroupScopeAlignedToTopic;\n\nexport function isGrantSourceAllowedForVisibility(\n visibility: \"private\" | \"team\" | \"firm\" | \"external\" | \"public\",\n source: string | undefined\n): boolean {\n if (source !== \"external_share\") {\n return true;\n }\n return visibility === \"external\" || visibility === \"public\";\n}\n\nfunction isGrantActive(grant: {\n status: \"active\" | \"revoked\" | \"expired\";\n expiresAt?: number;\n}): boolean {\n if (grant.status !== \"active\") {\n return false;\n }\n if (grant.expiresAt !== undefined && grant.expiresAt <= Date.now()) {\n return false;\n }\n return true;\n}\n\nasync function hasPrincipalGrant(\n ctx: DbCtx,\n args: {\n topic: TopicRecord;\n principalId: string;\n principalIsExternal: boolean;\n }\n): Promise<boolean> {\n const grants = await resolveAccessControlAppResolvers(\n ctx\n ).listProjectGrantsByProjectAndPrincipal(\n ctx,\n args.topic._id,\n args.principalId\n );\n\n if (\n grants.some(\n (grant) =>\n isGrantActive(grant as any) &&\n isGrantScopeAlignedToTopic(args.topic, grant) &&\n isGrantSourceAllowedForVisibility(\n args.topic.visibility,\n grant.source\n ) &&\n (!args.principalIsExternal ||\n args.topic.visibility === \"public\" ||\n grant.source === \"external_share\")\n )\n ) {\n return true;\n }\n\n return false;\n}\n\nasync function hasGroupGrant(\n ctx: DbCtx,\n args: {\n topic: TopicRecord;\n groupIds: string[];\n }\n): Promise<boolean> {\n // Group-based grant checks require MC group resolution.\n // With groupIds=[] from tenant-local principal context, this is a no-op.\n // Future: call MC to resolve group grants for cross-tenant scenarios.\n if (args.groupIds.length === 0) {\n return false;\n }\n\n for (const groupId of args.groupIds) {\n const grants = await resolveAccessControlAppResolvers(\n ctx\n ).listProjectGrantsByProjectAndGroup(ctx, args.topic._id, groupId);\n\n if (\n grants.some(\n (grant) =>\n isGrantActive(grant as any) &&\n isGrantScopeAlignedToTopic(args.topic, grant) &&\n isGrantSourceAllowedForVisibility(\n args.topic.visibility,\n grant.source\n )\n )\n ) {\n return true;\n }\n }\n return false;\n}\n\nfunction isExternalPrincipal(\n _ctx: DbCtx,\n _args: {\n groupIds: string[];\n topicTenantId?: string;\n topicWorkspaceId?: string;\n }\n): boolean {\n // External principal detection requires MC group resolution.\n // With groupIds=[] from tenant-local principal context, always false.\n // Future: call MC to check external group membership.\n return false;\n}\n\n// =============================================================================\n// ADMIN CHECK\n// =============================================================================\n\n/**\n * Check if a user has admin-tier access.\n *\n * Identity bridge: prefers mcRole (synced from Master Control),\n * falls back to legacy isAdmin boolean during migration.\n */\nexport async function isAdmin(ctx: DbCtx, userId: string): Promise<boolean> {\n const user = await resolveAccessControlAppResolvers(ctx).getUserByClerkId(\n ctx,\n userId\n );\n if (!user) return false;\n\n // Identity bridge: mcRole preferred, isAdmin fallback\n if (user.mcRole) {\n return user.mcRole === \"platform_admin\" || user.mcRole === \"tenant_admin\";\n }\n return user.isAdmin === true;\n}\n\n// =============================================================================\n// TOPIC ACCESS\n// =============================================================================\n\n/**\n * Check if a user has access to a topic scope.\n *\n * Returns detailed access info including why access was granted.\n */\n/**\n * STACK_MC_AUTH_BYPASS: All authenticated Stack MC users get full access\n * until RBAC and topic-native grant matching are production-ready.\n * When RBAC is complete, remove this constant and the early-return below.\n */\nconst STACK_MC_AUTH_BYPASS = true;\n\nasync function evaluateTopicAccessDetailed(\n ctx: DbCtx,\n args: {\n topicId: string;\n legacyUserId: string;\n principalContext: ResolvedPrincipalContext;\n }\n): Promise<AccessCheckResult> {\n // Single bypass: authenticated users get full access until RBAC is ready\n if (STACK_MC_AUTH_BYPASS && args.legacyUserId) {\n return {\n hasAccess: true,\n isAdmin: false,\n isOwner: false,\n isShared: false,\n hasGrant: true,\n isFirmVisible: true,\n isExternalVisible: false,\n isPublicVisible: false,\n isTenantScopeMatch: true,\n isWorkspaceScopeMatch: true,\n isPrincipalExternal: false,\n };\n }\n\n const topic = await resolveAccessControlAppResolvers(ctx).getProject(\n ctx,\n args.topicId\n );\n if (!topic) {\n return {\n hasAccess: false,\n isAdmin: false,\n isOwner: false,\n isShared: false,\n hasGrant: false,\n isFirmVisible: false,\n isExternalVisible: false,\n isPublicVisible: false,\n isTenantScopeMatch: false,\n isWorkspaceScopeMatch: false,\n isPrincipalExternal: false,\n };\n }\n\n const { principalContext, legacyUserId } = args;\n const userIsAdmin = principalContext.isPlatformAdmin;\n const isOwner = topic.ownerId === legacyUserId;\n const isShared = (topic.sharedWith ?? []).includes(legacyUserId);\n const principalIsExternal = await isExternalPrincipal(ctx, {\n groupIds: principalContext.groupIds,\n topicTenantId: topic.tenantId,\n topicWorkspaceId: topic.workspaceId,\n });\n\n const hasPrincipalGrantResult = await hasPrincipalGrant(ctx, {\n topic,\n principalId: principalContext.principalId,\n principalIsExternal,\n });\n const hasGroupGrantResult = await hasGroupGrant(ctx, {\n topic,\n groupIds: principalContext.groupIds,\n });\n\n const hasGrant = isShared || hasPrincipalGrantResult || hasGroupGrantResult;\n const legacyUnscoped = isLegacyUnscopedTopic(topic);\n const tenantScopeMatch = isTopicInPrincipalTenant(\n topic,\n principalContext.tenantId\n );\n const workspaceScopeMatch = isTopicInPrincipalWorkspace(\n topic,\n principalContext.workspaceId\n );\n\n const isPublicVisible = topic.visibility === \"public\";\n const isFirmVisible =\n topic.visibility === \"firm\" &&\n !legacyUnscoped &&\n tenantScopeMatch &&\n workspaceScopeMatch &&\n !principalIsExternal;\n const hasScopedGrant =\n hasGrant && (legacyUnscoped || (tenantScopeMatch && workspaceScopeMatch));\n const isExternalVisible = topic.visibility === \"external\" && hasScopedGrant;\n\n const hasAccess =\n userIsAdmin ||\n isOwner ||\n hasScopedGrant ||\n isPublicVisible ||\n isFirmVisible;\n\n return {\n hasAccess,\n isAdmin: userIsAdmin,\n isOwner,\n isShared,\n hasGrant,\n isFirmVisible,\n isExternalVisible,\n isPublicVisible,\n isTenantScopeMatch: tenantScopeMatch,\n isWorkspaceScopeMatch: workspaceScopeMatch,\n isPrincipalExternal: principalIsExternal,\n };\n}\n\nexport async function checkTopicAccessDetailedWithPrincipalContext(\n ctx: DbCtx,\n topicId: string,\n principalContext: ResolvedPrincipalContext\n): Promise<AccessCheckResult> {\n return evaluateTopicAccessDetailed(ctx, {\n topicId,\n legacyUserId: principalContext.clerkId,\n principalContext,\n });\n}\n\nexport async function checkTopicAccessDetailed(\n ctx: DbCtx,\n topicId: string,\n userId: string\n): Promise<AccessCheckResult> {\n const principalContext = await resolvePrincipalContext(ctx, userId);\n return evaluateTopicAccessDetailed(ctx, {\n topicId,\n legacyUserId: userId,\n principalContext,\n });\n}\n\n/**\n * Check if a user has access to a topic scope (simple boolean).\n */\nexport async function checkTopicAccess(\n ctx: DbCtx,\n topicId: string,\n userId: string\n): Promise<boolean> {\n const result = await checkTopicAccessDetailed(ctx, topicId, userId);\n return result.hasAccess;\n}\n\nexport async function checkTopicAccessWithPrincipalContext(\n ctx: DbCtx,\n topicId: string,\n principalContext: ResolvedPrincipalContext\n): Promise<boolean> {\n const result = await checkTopicAccessDetailedWithPrincipalContext(\n ctx,\n topicId,\n principalContext\n );\n return result.hasAccess;\n}\n\n/**\n * Check if a user has access to a scope (topic or legacy project compatibility id).\n *\n * TC-C: topic-canonical access bridge. Tries to resolve the scopeId as a\n * topic first (from the topics table). If found, allows access for any\n * authenticated user (topic-level ACL will be added in TC-D).\n * Falls back to legacy project-based access checks for compatibility.\n */\nexport async function checkScopeAccess(\n ctx: DbCtx,\n scopeId: string,\n userId: string\n): Promise<boolean> {\n // Try as topic first — topics table uses string IDs\n try {\n const topic = await (ctx.db as any).get(scopeId);\n if (\n topic &&\n (topic as any).name !== undefined &&\n (topic as any).type !== undefined\n ) {\n // Valid topic — allow access for any authenticated user.\n // Full topic-level ACL (visibility, tenant ringfencing) deferred to TC-D.\n return true;\n }\n } catch {\n // Not a valid document ID for this deployment, try the legacy project scope.\n }\n\n // Fall back to the legacy project-based access check.\n try {\n return await checkTopicAccess(ctx, scopeId as string, userId);\n } catch {\n // Neither topic nor legacy project scope resolved — deny access.\n return false;\n }\n}\n\n/**\n * Require access to a topic scope, throws if not authorized.\n */\nexport async function requireTopicAccess(\n ctx: DbCtx,\n topicId: string,\n userId: string\n): Promise<void> {\n const hasAccess = await checkTopicAccess(ctx, topicId, userId);\n if (!hasAccess) {\n throw new Error(\n \"Access denied: You don't have permission to access this topic\"\n );\n }\n}\n\n/**\n * Get a topic record with access check.\n *\n * Returns the topic record if the user has access, null otherwise.\n */\nexport async function getTopicWithAccess(\n ctx: DbCtx,\n topicId: string,\n userId: string\n): Promise<TopicRecord | null> {\n const topic = await resolveAccessControlAppResolvers(ctx).getProject(\n ctx,\n topicId\n );\n if (!topic) {\n return null;\n }\n\n const hasAccess = await checkTopicAccess(ctx, topicId, userId);\n if (!hasAccess) {\n return null;\n }\n\n return topic as TopicRecord;\n}\n\n/** @deprecated Use checkTopicAccessDetailed. */\nexport const checkProjectAccessDetailed = checkTopicAccessDetailed;\n\n/** @deprecated Use checkTopicAccess. */\nexport const checkProjectAccess = checkTopicAccess;\n\n/** @deprecated Use requireTopicAccess. */\nexport const requireProjectAccess = requireTopicAccess;\n\n/** @deprecated Use getTopicWithAccess. */\nexport const getProjectWithAccess = getTopicWithAccess;\n\n// =============================================================================\n// RESOURCE ACCESS (for items with optional topic compatibility ids)\n// =============================================================================\n\n/**\n * Check if a user can access a resource that may or may not belong to a topic.\n */\nexport function checkResourceAccess(\n ctx: DbCtx,\n resource: ResourceWithTopic,\n userId: string\n): boolean | Promise<boolean> {\n const topicId = resource.topicId ?? resource.projectId;\n if (topicId) {\n return checkTopicAccess(ctx, topicId, userId);\n }\n\n // No topic - only creator can access.\n const creatorId = resource.userId ?? resource.createdBy;\n return creatorId === userId;\n}\n\n/**\n * Require access to a resource, throws if not authorized.\n */\nexport async function requireResourceAccess(\n ctx: DbCtx,\n resource: ResourceWithTopic,\n userId: string\n): Promise<void> {\n const hasAccess = await checkResourceAccess(ctx, resource, userId);\n if (!hasAccess) {\n throw new Error(\n \"Access denied: You don't have permission to access this resource\"\n );\n }\n}\n\n// =============================================================================\n// CONVENIENCE HELPERS\n// =============================================================================\n\n/**\n * Check if user can modify a resource (stricter than read access).\n *\n * For now, same as checkResourceAccess. In the future, this could be\n * extended to support read-only sharing.\n */\nexport function checkModifyAccess(\n ctx: DbCtx,\n resource: ResourceWithTopic,\n userId: string\n): boolean | Promise<boolean> {\n return checkResourceAccess(ctx, resource, userId);\n}\n\n/**\n * Check if user is the creator of a resource.\n */\nexport function isCreator(\n resource: { userId?: string; createdBy?: string },\n userId: string\n): boolean {\n const creatorId = resource.userId ?? resource.createdBy;\n return creatorId === userId;\n}\n\n/**\n * Build the accessible topic ID set for list-style queries.\n */\nexport async function getAccessibleTopicIds(\n ctx: DbCtx,\n userId: string\n): Promise<Set<string>> {\n const principalContext = await resolvePrincipalContext(ctx, userId);\n\n if (principalContext.isPlatformAdmin) {\n // Admins can access all topics.\n const allTopics =\n await resolveAccessControlAppResolvers(ctx).listTopics(ctx);\n return new Set(allTopics.map((topic) => topic._id));\n }\n\n const topicIds = new Set<string>();\n\n // Owned topics.\n const ownedTopics = await resolveAccessControlAppResolvers(\n ctx\n ).listTopicsByOwner(ctx, userId);\n for (const topic of ownedTopics) {\n topicIds.add(topic._id);\n }\n\n // Public topics.\n const publicTopics = await resolveAccessControlAppResolvers(\n ctx\n ).listTopicsByVisibility(ctx, \"public\");\n for (const topic of publicTopics) {\n topicIds.add(topic._id);\n }\n\n // Firm topics (tenant ringfenced, and hidden from principals in external groups).\n const principalIsExternal = await isExternalPrincipal(ctx, {\n groupIds: principalContext.groupIds,\n topicTenantId: principalContext.tenantId ?? undefined,\n topicWorkspaceId: principalContext.workspaceId ?? undefined,\n });\n if (!principalIsExternal) {\n const firmTopics = await resolveAccessControlAppResolvers(\n ctx\n ).listTopicsByVisibility(ctx, \"firm\");\n\n for (const topic of firmTopics) {\n if (\n isTopicInPrincipalTenant(topic, principalContext.tenantId) &&\n isTopicInPrincipalWorkspace(topic, principalContext.workspaceId)\n ) {\n topicIds.add(topic._id);\n }\n }\n }\n\n // Explicit principal grants\n const directGrants = await resolveAccessControlAppResolvers(\n ctx\n ).listProjectGrantsByPrincipalStatus(\n ctx,\n principalContext.principalId,\n \"active\"\n );\n\n for (const grant of directGrants) {\n if (!isGrantActive(grant as any)) {\n continue;\n }\n const topic = await resolveAccessControlAppResolvers(ctx).getProject(\n ctx,\n grant.projectId\n );\n if (!topic) {\n continue;\n }\n if (!isLegacyUnscopedTopic(topic)) {\n if (!isTopicInPrincipalTenant(topic, principalContext.tenantId)) {\n continue;\n }\n if (\n !isTopicInPrincipalWorkspace(topic, principalContext.workspaceId)\n ) {\n continue;\n }\n }\n if (!isGrantScopeAlignedToTopic(topic, grant)) {\n continue;\n }\n if (\n !isGrantSourceAllowedForVisibility(topic.visibility, grant.source)\n ) {\n continue;\n }\n if (\n principalIsExternal &&\n topic.visibility !== \"public\" &&\n grant.source !== \"external_share\"\n ) {\n continue;\n }\n topicIds.add(grant.projectId);\n }\n\n // Group grants — skipped in tenant-local context (groups live in MC).\n // principalContext.groupIds is [] when resolved locally.\n\n // Legacy shared-with list compatibility while grant backfill is in progress.\n const allTopics =\n await resolveAccessControlAppResolvers(ctx).listTopics(ctx);\n for (const topic of allTopics) {\n if (\n (topic.sharedWith ?? []).includes(userId) &&\n (isLegacyUnscopedTopic(topic) ||\n (isTopicInPrincipalTenant(topic, principalContext.tenantId) &&\n isTopicInPrincipalWorkspace(topic, principalContext.workspaceId)))\n ) {\n topicIds.add(topic._id);\n }\n }\n\n return topicIds;\n}\n\n/** @deprecated Use getAccessibleTopicIds. */\nexport const getAccessibleProjectIds = getAccessibleTopicIds;\n","/**\n * auth module implementation.\n */\n\nimport type { ActionCtx, MutationCtx, QueryCtx } from \"./convex\";\n\ntype AnyCtx = QueryCtx | MutationCtx | ActionCtx;\n\n/**\n * Get the current user's identity from Clerk.\n */\nexport async function getCurrentUser(ctx: AnyCtx) {\n const identity = await ctx.auth.getUserIdentity();\n return identity;\n}\n\n/**\n * Get the current user ID (Clerk subject).\n */\nexport async function getCurrentUserId(ctx: AnyCtx): Promise<string | null> {\n const identity = await ctx.auth.getUserIdentity();\n return identity?.subject ?? null;\n}\n","import { v } from \"convex/values\";\n\nexport const permissiveReturn = v.optional(v.any());\nexport const looseJsonObject = v.record(v.string(), v.any());\nexport const looseJsonArray = v.array(v.any());\nexport const looseJsonValue = v.union(\n v.string(),\n v.number(),\n v.boolean(),\n v.null(),\n looseJsonObject,\n looseJsonArray\n);\n","import {\n actionGeneric,\n anyApi,\n componentsGeneric,\n httpActionGeneric,\n internalActionGeneric,\n internalMutationGeneric,\n internalQueryGeneric,\n mutationGeneric,\n queryGeneric,\n} from \"convex/server\";\nimport type { GenericId } from \"convex/values\";\n\nexport const api = anyApi as any;\nexport const components = componentsGeneric() as any;\nexport const internal = anyApi as any;\n\nexport type TableNames = string;\nexport type Id<TableName extends TableNames = string> = GenericId<TableName>;\nexport type Doc<TableName extends TableNames = string> = any;\nexport type DataModel = any;\nexport type ActionCtx = any;\nexport type DatabaseReader = any;\nexport type DatabaseWriter = any;\nexport type MutationCtx = any;\nexport type QueryCtx = any;\n\nexport const action = actionGeneric as any;\nexport const httpAction = httpActionGeneric as any;\nexport const internalAction = internalActionGeneric as any;\nexport const internalMutation = internalMutationGeneric as any;\nexport const internalQuery = internalQueryGeneric as any;\nexport const mutation = mutationGeneric as any;\nexport const query = queryGeneric as any;\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\n// =============================================================================\n// TYPES\n// =============================================================================\n\ntype FieldSchema = {\n type: \"string\" | \"number\" | \"boolean\";\n required: boolean;\n};\n\ntype EntitySchema = Record<string, FieldSchema>;\n\ntype ValidationResult = {\n valid: boolean;\n errors: string[];\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 tenantEntry = await (ctx.db as any)\n .query(\"schemaEnumConfig\")\n .withIndex(\"by_tenant_category\", (q: any) =>\n q.eq(\"tenantId\", tenantId).eq(\"category\", \"entity_type\")\n )\n .collect();\n\n const tenantMatch = tenantEntry.find(\n (e: any) => e.value === nodeType && e.status === \"active\"\n );\n if (tenantMatch?.metadata?.schema) {\n return tenantMatch.metadata.schema as EntitySchema;\n }\n }\n\n // Fall back to platform default\n const platformEntry = await (ctx.db as any)\n .query(\"schemaEnumConfig\")\n .withIndex(\"by_category_value\", (q: any) =>\n q.eq(\"category\", \"entity_type\").eq(\"value\", nodeType)\n )\n .first();\n\n if (platformEntry?.metadata?.schema && platformEntry.status === \"active\") {\n return platformEntry.metadata.schema as EntitySchema;\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","/**\n * Shared UUID v4 generator for global IDs.\n *\n * Uses crypto.getRandomValues() for collision-safe generation.\n * Replaces the Math.random()-based UUID pattern that was duplicated\n * across 7+ files.\n *\n * @module convex/lib/globalId\n */\n\n/**\n * Generate a UUID v4 global ID using crypto-safe random bytes.\n */\nexport function generateGlobalId(): string {\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\n // Set version (4) and variant (RFC 4122)\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\")).join(\n \"\"\n );\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\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 { Id } from \"./convex\";\n\n// Minimal topic shape needed for resolution (avoids importing full generated types)\ntype TopicDoc = {\n _id: Id<\"topics\">;\n name: string;\n depth: number;\n ontologyId?: Id<\"ontologyDefinitions\">;\n parentTopicId?: Id<\"topics\">;\n};\n\ntype OntologyDef = {\n _id: Id<\"ontologyDefinitions\">;\n ontologyKey: string;\n name: string;\n tier: \"platform\" | \"pack\" | \"tenant\";\n status: \"draft\" | \"active\" | \"deprecated\" | \"archived\";\n};\n\ntype OntologyVer = {\n _id: Id<\"ontologyVersions\">;\n ontologyId: Id<\"ontologyDefinitions\">;\n version: string;\n status: \"draft\" | \"published\" | \"deprecated\";\n entityTypes: Array<{ value: string; label: string; description?: string }>;\n edgeTypes: Array<{ value: string; label: string; description?: string }>;\n publishedAt?: number;\n};\n\nexport type ResolvedTopicOntology = {\n ontologyId: Id<\"ontologyDefinitions\">;\n ontologyKey: string;\n ontologyName: string;\n tier: string;\n source: \"direct\" | \"inherited\";\n sourceTopicId: Id<\"topics\">;\n /** Valid entity type values from the latest published version */\n validEntityTypes: string[];\n /** Valid edge type values from the latest published version */\n validEdgeTypes: string[];\n /** The published version, if any */\n publishedVersion: OntologyVer | null;\n};\n\nconst MAX_RESOLUTION_DEPTH = 10;\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: { db: any },\n topicId: Id<\"topics\">\n): Promise<ResolvedTopicOntology | null> {\n let current = (await ctx.db.get(topicId)) as TopicDoc | null;\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 if (current.ontologyId) {\n const ontologyDef = (await ctx.db.get(\n current.ontologyId\n )) as OntologyDef | null;\n if (!ontologyDef || ontologyDef.status === \"archived\") {\n // Ontology was archived or deleted — continue walking up\n if (current.parentTopicId) {\n current = (await ctx.db.get(\n current.parentTopicId\n )) as TopicDoc | null;\n continue;\n }\n return null;\n }\n\n // Fetch the latest published version for this ontology\n const versions = (await ctx.db\n .query(\"ontologyVersions\")\n .withIndex(\"by_ontologyId\", (q: any) =>\n q.eq(\"ontologyId\", current?.ontologyId!)\n )\n .collect()) as OntologyVer[];\n\n const published = versions\n .filter((v) => v.status === \"published\")\n .sort((a, b) => (b.publishedAt ?? 0) - (a.publishedAt ?? 0));\n\n const latestPublished = published[0] ?? null;\n\n return {\n ontologyId: ontologyDef._id,\n ontologyKey: ontologyDef.ontologyKey,\n ontologyName: ontologyDef.name,\n tier: ontologyDef.tier,\n source: current._id === startTopicId ? \"direct\" : \"inherited\",\n sourceTopicId: current._id,\n validEntityTypes: latestPublished\n ? latestPublished.entityTypes.map((et) => et.value)\n : [],\n validEdgeTypes: latestPublished\n ? latestPublished.edgeTypes.map((et) => et.value)\n : [],\n publishedVersion: latestPublished,\n };\n }\n\n // No ontologyId on this topic — walk up\n if (!current.parentTopicId) {\n break;\n }\n current = (await ctx.db.get(current.parentTopicId)) as TopicDoc | null;\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: { db: any },\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","import { api } from \"./convex\";\n\ntype OverlayIdMode = \"legacy\" | \"topic\";\nconst LEGACY_SCOPE_FIELD = \"graphScope\" + \"ProjectId\";\n\ntype LegacyProjectThesis = {\n statement: string;\n confidence: number;\n lastUpdated: number;\n};\n\ntype LegacyPillarImportance =\n | \"critical\"\n | \"major\"\n | \"minor\"\n | \"not_applicable\";\n\ntype LegacyThesisPillarConfig = {\n pillarImportance?: Record<string, LegacyPillarImportance | undefined>;\n configuredAt?: number;\n configuredBy?: string;\n aiSuggestion?: {\n suggestedAt: number;\n reasoning: string;\n };\n};\n\ntype LegacyBeliefArchitecture = {\n overallMaturity: number;\n pillarScores: Array<Record<string, unknown>>;\n lastCalculated: number;\n};\n\ntype LegacyOntologyClassification = {\n valueChains: Array<Record<string, unknown>>;\n functions: Array<Record<string, unknown>>;\n overallConfidence: number;\n classifiedAt: number;\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 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 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\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 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 = error instanceof Error ? error.message : String(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\nasync function resolveTopicDoc(\n ctx: any,\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(scopeId as any)) as TopicDocLike | null;\n if (directTopic) {\n return directTopic;\n }\n } catch {\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(api.topics.get as any, {\n id: String(scopeId),\n });\n if (topic?.name !== undefined && topic?.type !== undefined) {\n return topic as TopicDocLike;\n }\n } catch {\n // Fall through to legacy-scope lookup.\n }\n\n try {\n const topic = await ctx.runQuery(api.topics.getByLegacyScopeId as any, {\n projectId: String(scopeId),\n });\n if (topic?.name !== undefined && topic?.type !== undefined) {\n return topic as TopicDocLike;\n }\n } catch {\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 const createdAt =\n typeof topic.createdAt === \"number\"\n ? topic.createdAt\n : typeof topic._creationTime === \"number\"\n ? topic._creationTime\n : 0;\n const updatedAt =\n typeof topic.updatedAt === \"number\"\n ? topic.updatedAt\n : typeof metadata.updatedAt === \"number\"\n ? (metadata.updatedAt as number)\n : createdAt;\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 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\" ? (metadata.chatCount as number) : 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: any,\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: any,\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 {\n allTopics = [];\n }\n }\n\n if (allTopics.length === 0 && typeof ctx.runQuery === \"function\") {\n allTopics =\n (((await ctx.runQuery(api.topics.list as any, {})) ?? []) 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: any,\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 nextMetadata = { ...readMetadata(topic) };\n const patch: Record<string, unknown> = {};\n const topicUpdateArgs: Record<string, unknown> = {\n id: String(topic._id),\n };\n\n for (const [key, rawValue] of Object.entries(value)) {\n switch (key) {\n case \"_id\":\n case \"projectId\":\n case \"topicId\":\n case \"legacyProjectId\":\n case \"storageProjectId\":\n break;\n case \"name\":\n case \"description\":\n patch[key] = rawValue;\n topicUpdateArgs[key] = rawValue;\n break;\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 const status = coerceStatus(rawValue);\n if (status) {\n patch.status = status;\n topicUpdateArgs.status = status;\n }\n break;\n }\n case \"visibility\": {\n const visibility = coerceVisibility(rawValue);\n if (visibility) {\n patch.visibility = visibility;\n topicUpdateArgs.visibility = visibility;\n }\n break;\n }\n case \"type\": {\n const projectType = readNonEmptyString(rawValue);\n if (projectType) {\n nextMetadata.projectType = projectType;\n } else {\n delete nextMetadata.projectType;\n }\n break;\n }\n case \"updatedAt\":\n case \"createdAt\":\n break;\n default:\n if (rawValue === undefined) {\n delete nextMetadata[key];\n } else {\n nextMetadata[key] = rawValue;\n }\n }\n }\n\n patch.updatedAt = Date.now();\n patch.metadata = nextMetadata;\n topicUpdateArgs.metadata = nextMetadata;\n\n if (typeof ctx.runMutation === \"function\") {\n try {\n await ctx.runMutation(api.topics.update as any, topicUpdateArgs);\n } catch (error) {\n if (\n !isMissingLucernChildComponentError(error) ||\n !ctx?.db ||\n typeof ctx.db.patch !== \"function\"\n ) {\n throw error;\n }\n await ctx.db.patch(String(topic._id) as any, patch);\n }\n } else if (ctx?.db && typeof ctx.db.patch === \"function\") {\n await ctx.db.patch(String(topic._id) as any, patch);\n } else {\n throw new Error(\n \"Cannot patch topic without component adapter (ctx.runMutation unavailable)\"\n );\n }\n\n return materializeTopicProjectOverlay(\n {\n ...topic,\n ...patch,\n metadata: nextMetadata,\n } as TopicDocLike\n );\n}\n\nexport function matchesTopicProjectOverlayAccess(\n accessibleProjectIds: Set<string>,\n project: { topicId: string; legacyProjectId?: string; storageProjectId?: string }\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. */\nimport {\n listTopicProjectOverlays,\n patchTopicProjectOverlay,\n resolveTopicProjectOverlay,\n} from \"./topicProjectOverlay\";\nimport type {\n GraphPrimitivesAppResolverContext,\n GraphPrimitivesAppResolvers,\n} from \"./resolverTypes\";\n\nfunction isMissingLucernChildComponentError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error);\n return (\n message.includes('Child component ComponentName(Identifier(\"lucern\")) not found') ||\n (message.includes(\"Child component\") &&\n message.includes(\"lucern\") &&\n message.includes(\"not found\"))\n );\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 !isAdvisoryTopicPatch(value) ||\n !isMissingLucernChildComponentError(error)\n ) {\n throw error;\n }\n\n console.warn(\"[lucern graph-primitives] Non-fatal advisory topic patch failure\", {\n projectId,\n keys: Object.keys(value),\n error: error instanceof Error ? error.message : error,\n });\n }\n}\n\nfunction defaultResolvers(): GraphPrimitivesAppResolvers {\n return {\n async getProject(ctx, projectId) {\n return await resolveTopicProjectOverlay(ctx, projectId, {\n idMode: \"legacy\",\n projectLikeOnly: false,\n });\n },\n async patchProject(ctx, projectId, value) {\n await patchProjectWithTolerance(ctx, projectId, value);\n },\n async listTopics(ctx) {\n return await listTopicProjectOverlays(ctx, {\n idMode: \"legacy\",\n });\n },\n async getFinalArtifact(ctx, artifactId) {\n return await ctx.db.get(artifactId);\n },\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","/** Topic-scope resolution helpers for graph-primitive operations. */\nimport { v } from \"convex/values\";\nimport { api as appApi } from \"./convex\";\nimport type { Id } from \"./convex\";\n\nconst LEGACY_SCOPE_FIELD = \"graphScope\" + \"ProjectId\";\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 type TopicProjectScope = {\n topicId: Id<\"topics\">;\n projectId?: string;\n tenantId?: string;\n workspaceId?: string;\n source: \"topic\" | \"project_mapped_topic\" | \"topic_inferred\";\n};\n\ntype MaterializedTopicNodeDoc = {\n _id: string | Id<\"epistemicNodes\">;\n metadata?: Record<string, unknown>;\n};\n\nfunction asMappedProjectId(\n topic: TopicDoc | null | undefined\n): string | undefined {\n if (!topic) {\n return;\n }\n const directLegacyProjectId = normalizeScopeValue(topic[LEGACY_SCOPE_FIELD]);\n if (directLegacyProjectId) {\n return directLegacyProjectId;\n }\n const metadata = (topic.metadata || {}) as Record<string, unknown>;\n const candidate =\n (metadata[LEGACY_SCOPE_FIELD] as string | undefined) ||\n (metadata.legacyProjectId as string | undefined) ||\n (metadata.projectId as string | undefined) ||\n (metadata.scopeProjectId as string | undefined);\n return candidate ? (candidate as string) : 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(ctx: any, scopeId: string): Promise<TopicDoc[]> {\n try {\n return (await ctx.db\n .query(\"topics\")\n .withIndex(\"by_graph_scope_project\", (q: any) =>\n q.eq(LEGACY_SCOPE_FIELD, scopeId)\n )\n .collect()) as TopicDoc[];\n } catch {\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 ctx.db.query(\"topics\").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: any,\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 as any, {\n id: topicId,\n })) ?? null) as TopicDoc | null;\n } catch {\n return null;\n }\n}\n\nasync function tryResolveHostTopicByLegacyScope(\n ctx: any,\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 as any, {\n projectId: legacyScopeId,\n })) ?? null) as TopicDoc | null;\n } catch {\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: any,\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) break;\n\n if (!tenantId) {\n tenantId = normalizeScopeValue(current.tenantId);\n }\n if (!workspaceId) {\n workspaceId = normalizeScopeValue(current.workspaceId);\n }\n if (tenantId && workspaceId) break;\n }\n\n return { tenantId, workspaceId };\n}\n\nexport async function resolveTopicProjectScope(\n ctx: any,\n args: { topicId?: Id<\"topics\"> | string; projectId?: string }\n): Promise<TopicProjectScope> {\n if (args.topicId) {\n // Try direct lookup, fall back to the legacy mapped-project bridge\n let topic: TopicDoc | null = null;\n try {\n topic = (await ctx.db.get(args.topicId as Id<\"topics\">)) as TopicDoc | null;\n } catch {\n // Not a valid topics table ID\n }\n if (!topic) {\n topic = await tryResolveHostTopicById(ctx, String(args.topicId));\n }\n if (!topic) {\n // Try as legacy projectId / globalId via the mapped-project bridge.\n topic =\n pickPrimaryTopic(\n await findTopicsByScopeAlias(ctx, String(args.topicId))\n ) ?? null;\n }\n if (!topic) {\n throw new Error(`Topic not found: ${String(args.topicId)}`);\n }\n const inherited = await resolveInheritedWorkspaceScope(ctx, topic);\n const mapped = asMappedProjectId(topic);\n if (mapped) {\n return {\n topicId: topic._id,\n projectId: mapped,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"topic\",\n };\n }\n return {\n topicId: topic._id,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"topic\",\n };\n }\n\n if (args.projectId) {\n let directTopic: TopicDoc | null = null;\n try {\n directTopic = (await ctx.db.get(\n args.projectId as Id<\"topics\">\n )) as TopicDoc | null;\n } catch {\n // Not a valid topics table ID, continue to legacy graph-scope lookup.\n }\n\n if (directTopic) {\n const inherited = await resolveInheritedWorkspaceScope(ctx, directTopic);\n const mapped = asMappedProjectId(directTopic);\n return {\n topicId: directTopic._id,\n projectId: mapped ?? args.projectId,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"topic_inferred\",\n };\n }\n\n directTopic = await tryResolveHostTopicByLegacyScope(ctx, args.projectId);\n if (directTopic) {\n const inherited = await resolveInheritedWorkspaceScope(ctx, directTopic);\n const mapped = asMappedProjectId(directTopic);\n return {\n topicId: directTopic._id,\n projectId: mapped ?? args.projectId,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"topic_inferred\",\n };\n }\n\n const topics = await findTopicsByScopeAlias(ctx, args.projectId);\n const primary = pickPrimaryTopic(topics);\n if (primary) {\n const inherited = await resolveInheritedWorkspaceScope(ctx, primary);\n return {\n topicId: primary._id,\n projectId: args.projectId,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"project_mapped_topic\",\n };\n }\n throw new Error(\n `Legacy project scope ${String(args.projectId)} has no mapped topic.`\n );\n }\n\n throw new Error(\n \"Missing scope: provide topicId (preferred) or legacy projectId alias.\"\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","/**\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 { v } from \"convex/values\";\nimport { checkProjectAccess } from \"@lucern/access-control/access\";\nimport { getCurrentUserId } from \"@lucern/access-control/auth\";\nimport { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\nimport { internal, mutation, query } from \"./convex\";\nimport { validateEntityMetadata } from \"./entityValidation\";\nimport { generateGlobalId } from \"./globalId\";\nimport { validateEntityTypeForTopic } from \"./topicOntologyResolver\";\nimport { resolveGraphPrimitivesAppResolvers } from \"./resolvers\";\nimport { optionalScopeArgs, resolveTopicProjectScope } from \"./topicScope\";\n\n// =============================================================================\n// AUTH HELPERS (same pattern as epistemicBeliefs.ts)\n// =============================================================================\n\ntype StructuredMutationError = Error & {\n status: number;\n code: string;\n invariantCode?: string;\n suggestion?: string;\n details?: unknown;\n};\n\nfunction throwStructuredMutationError(args: {\n message: string;\n status: number;\n code: string;\n invariantCode?: string;\n suggestion?: string;\n details?: unknown;\n}): never {\n const error = new Error(args.message) as StructuredMutationError;\n error.status = args.status;\n error.code = args.code;\n error.invariantCode = args.invariantCode;\n error.suggestion = args.suggestion;\n error.details = args.details;\n throw error;\n}\n\nasync function requireAuthenticatedUserId(ctx: {\n auth: { getUserIdentity: () => Promise<unknown> };\n}): Promise<string> {\n const userId = await getCurrentUserId(ctx as any);\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\nasync function requireProjectWriteAccess(\n ctx: { db: unknown },\n projectId: string,\n userId: string\n): Promise<void> {\n const hasAccess = await checkProjectAccess(ctx as any, projectId, userId);\n if (!hasAccess) {\n throwStructuredMutationError({\n message: \"Project access required.\",\n status: 403,\n code: \"FORBIDDEN\",\n invariantCode: \"policy.scope_required\",\n suggestion: \"Request write access for the project and retry.\",\n details: { projectId, userId },\n });\n }\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 hash = (hash << 5) + hash + content.charCodeAt(i);\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;\n\nexport type OntologicalNodeType = (typeof ONTOLOGICAL_NODE_TYPES)[number];\n\nexport function isOntologicalNodeType(\n nodeType: string\n): nodeType is OntologicalNodeType {\n return (ONTOLOGICAL_NODE_TYPES as readonly string[]).includes(nodeType);\n}\n\nfunction normalizeCanonicalEntityText(value: string): string {\n return value.trim().toLowerCase().replace(/\\s+/g, \" \");\n}\n\nfunction buildEntityTitle(canonicalText: string): string {\n return canonicalText.slice(0, 100) + (canonicalText.length > 100 ? \"...\" : \"\");\n}\n\ntype ScopeTopicDoc = {\n _id: string;\n tenantId?: string;\n workspaceId?: string;\n};\n\ntype ScopeProjectDoc = {\n _id: string;\n tenantId?: string;\n workspaceId?: string;\n};\n\ntype CanonicalEntityScope = Awaited<ReturnType<typeof resolveTopicProjectScope>> & {\n tenantId?: string;\n topic: ScopeTopicDoc | null;\n project: ScopeProjectDoc | null;\n};\n\nasync function resolveCanonicalEntityScope(\n ctx: { db: any },\n args: { topicId?: any; projectId?: string }\n): Promise<CanonicalEntityScope> {\n const scope = await resolveTopicProjectScope(ctx, args);\n const topic = scope.topicId\n ? (((await ctx.db.get(scope.topicId)) as ScopeTopicDoc | null) ?? null)\n : null;\n const project =\n scope.projectId !== undefined\n ? ((((await resolveGraphPrimitivesAppResolvers(ctx).getProject(\n ctx as any,\n scope.projectId as any\n )) as ScopeProjectDoc | null) ?? null))\n : null;\n\n const tenantId =\n typeof topic?.tenantId === \"string\" && topic.tenantId.trim().length > 0\n ? topic.tenantId.trim()\n : typeof project?.tenantId === \"string\" &&\n project.tenantId.trim().length > 0\n ? project.tenantId.trim()\n : undefined;\n\n return {\n ...scope,\n tenantId,\n topic,\n project,\n };\n}\n\nfunction matchesCanonicalEntityRecord(\n node: {\n status?: unknown;\n nodeType?: unknown;\n epistemicLayer?: unknown;\n tenantId?: unknown;\n workspaceId?: unknown;\n contentHash?: unknown;\n },\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\nasync function findExistingCanonicalEntity(\n ctx: { db: any },\n args: {\n nodeType: OntologicalNodeType;\n canonicalText: string;\n tenantId?: string;\n }\n) {\n const contentHash = generateContentHash(args.nodeType, args.canonicalText);\n const candidates = await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_contentHash\", (q: any) => q.eq(\"contentHash\", contentHash))\n .collect();\n\n return (\n candidates.find((node: any) =>\n matchesCanonicalEntityRecord(node, {\n nodeType: args.nodeType,\n tenantId: args.tenantId,\n contentHash,\n })\n ) ?? null\n );\n}\n\nasync function listCanonicalEntitiesForScope(\n ctx: { db: any },\n args: {\n tenantId?: string;\n nodeType?: string;\n searchTerm?: string;\n includeArchived?: boolean;\n limit: number;\n }\n) {\n const baseRows =\n args.tenantId !== undefined\n ? await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_tenantId\", (q: any) => q.eq(\"tenantId\", args.tenantId))\n .collect()\n : args.nodeType\n ? await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_nodeType\", (q: any) => q.eq(\"nodeType\", args.nodeType))\n .collect()\n : await ctx.db.query(\"epistemicNodes\").collect();\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: any) =>\n matchesCanonicalEntityRecord(node, {\n nodeType: args.nodeType,\n tenantId: args.tenantId,\n includeArchived: args.includeArchived,\n })\n )\n .filter((node: any) => {\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: any, b: any) =>\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, args) => {\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, args) => {\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 requireProjectWriteAccess(\n ctx,\n scope.projectId,\n authenticatedUserId\n );\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 = (args.metadata as Record<string, unknown>) || {};\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 ctx.db.insert(\"epistemicNodes\", {\n globalId: entityGlobalId,\n nodeType: args.nodeType as any,\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 */\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, args) => {\n const authenticatedUserId = await requireAuthenticatedUserId(ctx);\n const now = Date.now();\n\n const node = await ctx.db.get(args.nodeId);\n if (!node) {\n throwStructuredMutationError({\n message: \"Entity not found.\",\n status: 404,\n code: \"NOT_FOUND\",\n details: { nodeId: args.nodeId },\n });\n }\n\n // Verify this is an ontological node\n if (!isOntologicalNodeType(node.nodeType)) {\n throwStructuredMutationError({\n message: `Node \"${args.nodeId}\" is a ${node.nodeType}, not an entity. Use belief/question APIs for epistemic nodes.`,\n status: 400,\n code: \"LIFECYCLE_VIOLATION\",\n invariantCode: \"entity.type_check\",\n suggestion:\n \"Only ontological entities can be updated via updateEntityAttributes.\",\n });\n }\n\n const scopeProjectId =\n typeof node.projectId === \"string\" && node.projectId.trim().length > 0\n ? node.projectId\n : undefined;\n if (scopeProjectId) {\n await requireProjectWriteAccess(ctx, scopeProjectId, authenticatedUserId);\n }\n\n // Merge new metadata with existing\n const existingMetadata = (node.metadata as Record<string, unknown>) || {};\n const newMetadataFields =\n args.metadata !== undefined\n ? ((args.metadata as Record<string, unknown>) || {})\n : {};\n const mergedMetadata = { ...existingMetadata, ...newMetadataFields };\n if (args.subtype !== undefined) {\n mergedMetadata.subtype = args.subtype;\n }\n\n if (args.canonicalText !== undefined && args.canonicalText.trim().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 const nextCanonicalText =\n typeof args.canonicalText === \"string\" && args.canonicalText.trim().length > 0\n ? args.canonicalText.trim()\n : node.canonicalText;\n\n if (args.canonicalText !== undefined) {\n const duplicate = await findExistingCanonicalEntity(ctx, {\n nodeType: node.nodeType,\n canonicalText: nextCanonicalText,\n tenantId: typeof node.tenantId === \"string\" ? node.tenantId : undefined,\n });\n if (duplicate && String(duplicate._id) !== String(args.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: args.nodeId,\n duplicateNodeId: duplicate._id,\n canonicalText: nextCanonicalText,\n },\n });\n }\n }\n\n // Validate merged metadata against schema\n const validation = await validateEntityMetadata(\n ctx,\n node.nodeType,\n 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: Record<string, unknown> = {\n metadata: mergedMetadata,\n updatedAt: now,\n };\n\n if (args.canonicalText !== undefined) {\n updates.canonicalText = nextCanonicalText;\n updates.contentHash = generateContentHash(node.nodeType, nextCanonicalText);\n updates.title =\n args.title !== undefined ? args.title : buildEntityTitle(nextCanonicalText);\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 // 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: 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, args) => {\n const authenticatedUserId = await requireAuthenticatedUserId(ctx);\n const now = Date.now();\n\n const canonical = await ctx.db.get(args.canonicalNodeId);\n const duplicate = await ctx.db.get(args.duplicateNodeId);\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 (\n !isOntologicalNodeType(canonical.nodeType) ||\n !isOntologicalNodeType(duplicate.nodeType)\n ) {\n throwStructuredMutationError({\n message: \"Both nodes must be ontological entities to merge.\",\n status: 400,\n code: \"LIFECYCLE_VIOLATION\",\n invariantCode: \"entity.type_check\",\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.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 requireProjectWriteAccess(\n ctx,\n canonical.projectId as string,\n authenticatedUserId\n );\n }\n\n // 1. Create derived_from edge (canonical replacement for same_as)\n const edgeGlobalId = generateGlobalId();\n await ctx.db.insert(\"epistemicEdges\", {\n globalId: edgeGlobalId,\n fromNodeId: args.duplicateNodeId,\n toNodeId: args.canonicalNodeId,\n sourceGlobalId: duplicate.globalId,\n targetGlobalId: canonical.globalId,\n edgeType: \"derived_from\" as any,\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 = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from\", (q: any) =>\n q.eq(\"fromNodeId\", args.duplicateNodeId)\n )\n .collect();\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 = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_to\", (q: any) => q.eq(\"toNodeId\", args.duplicateNodeId))\n .collect();\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 =\n (duplicate.metadata as Record<string, unknown>) || {};\n await ctx.db.patch(args.duplicateNodeId, {\n status: \"superseded\" as any,\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, args) => {\n const authenticatedUserId = await requireAuthenticatedUserId(ctx);\n const now = Date.now();\n\n const node = await ctx.db.get(args.nodeId);\n if (!node) {\n throwStructuredMutationError({\n message: \"Entity not found.\",\n status: 404,\n code: \"NOT_FOUND\",\n details: { nodeId: args.nodeId },\n });\n }\n\n if (!isOntologicalNodeType(node.nodeType)) {\n throwStructuredMutationError({\n message: `Node \"${args.nodeId}\" is a ${node.nodeType}, not an entity. Use belief archive APIs for epistemic nodes.`,\n status: 400,\n code: \"LIFECYCLE_VIOLATION\",\n invariantCode: \"entity.type_check\",\n });\n }\n\n if (node.projectId) {\n await requireProjectWriteAccess(\n ctx,\n node.projectId as string,\n authenticatedUserId\n );\n }\n\n await ctx.db.patch(args.nodeId, {\n status: \"archived\" as any,\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
|
+
{"version":3,"sources":["../src/convex.ts","../src/entityValidation.ts","../src/globalId.ts","../src/topicOntologyResolver.ts","../src/topicProjectOverlay.ts","../src/resolvers.ts","../src/topicScope.ts","../src/entityLifecycle.ts"],"names":["v","isMissingLucernChildComponentError","LEGACY_SCOPE_FIELD"],"mappings":";;;;;;;AAaO,IAAM,GAAA,GAAM,MAAA;AACO,iBAAA;AACnB,IAAM,QAAA,GAAW,MAAA;AAiBjB,IAAM,QAAA,GAAW,eAAA;AACjB,IAAM,KAAA,GAAQ,YAAA;;;ACErB,eAAsB,mBAAA,CACpB,GAAA,EACA,QAAA,EACA,QAAA,EAC8B;AAE9B,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAM,cAAc,MAAO,GAAA,CAAI,EAAA,CAC5B,KAAA,CAAM,kBAAkB,CAAA,CACxB,SAAA;AAAA,MAAU,oBAAA;AAAA,MAAsB,CAAC,MAChC,CAAA,CAAE,EAAA,CAAG,YAAY,QAAQ,CAAA,CAAE,EAAA,CAAG,UAAA,EAAY,aAAa;AAAA,MAExD,OAAA,EAAQ;AAEX,IAAA,MAAM,cAAc,WAAA,CAAY,IAAA;AAAA,MAC9B,CAAC,CAAA,KAAW,CAAA,CAAE,KAAA,KAAU,QAAA,IAAY,EAAE,MAAA,KAAW;AAAA,KACnD;AACA,IAAA,IAAI,WAAA,EAAa,UAAU,MAAA,EAAQ;AACjC,MAAA,OAAO,YAAY,QAAA,CAAS,MAAA;AAAA,IAC9B;AAAA,EACF;AAGA,EAAA,MAAM,gBAAgB,MAAO,GAAA,CAAI,EAAA,CAC9B,KAAA,CAAM,kBAAkB,CAAA,CACxB,SAAA;AAAA,IAAU,mBAAA;AAAA,IAAqB,CAAC,MAC/B,CAAA,CAAE,EAAA,CAAG,YAAY,aAAa,CAAA,CAAE,EAAA,CAAG,OAAA,EAAS,QAAQ;AAAA,IAErD,KAAA,EAAM;AAET,EAAA,IAAI,aAAA,EAAe,QAAA,EAAU,MAAA,IAAU,aAAA,CAAc,WAAW,QAAA,EAAU;AACxE,IAAA,OAAO,cAAc,QAAA,CAAS,MAAA;AAAA,EAChC;AAEA,EAAA,OAAO,IAAA;AACT;AAiBA,eAAsB,sBAAA,CACpB,GAAA,EACA,QAAA,EACA,QAAA,EACA,QAAA,EAC2B;AAC3B,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,MAAM,MAAA,GAAS,MAAM,mBAAA,CAAoB,GAAA,EAAK,UAAU,QAAQ,CAAA;AAEhE,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,MAAA,EAAQ;AAAA,QACN,yCAAyC,QAAQ,CAAA,kGAAA;AAAA;AACnD,KACF;AAAA,EACF;AAEA,EAAA,MAAM,IAAA,GAAO,YAAY,EAAC;AAG1B,EAAA,KAAA,MAAW,CAAC,SAAA,EAAW,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AAC1D,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,MAAM,KAAA,GAAQ,KAAK,SAAS,CAAA;AAC5B,MAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,IAAQ,UAAU,EAAA,EAAI;AACzD,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,gBAAA,EAAmB,SAAS,CAAA,qBAAA,CAAuB,CAAA;AAAA,MACjE;AAAA,IACF;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,CAAC,SAAA,EAAW,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AACrD,IAAA,MAAM,QAAA,GAAW,OAAO,SAAS,CAAA;AACjC,IAAA,IAAI,CAAC,QAAA,EAAU;AAEb,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AAEzC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,aAAa,OAAO,KAAA;AAC1B,IAAA,IAAI,UAAA,KAAe,SAAS,IAAA,EAAM;AAChC,MAAA,MAAA,CAAO,IAAA;AAAA,QACL,UAAU,SAAS,CAAA,iBAAA,EAAoB,QAAA,CAAS,IAAI,cAAc,UAAU,CAAA,CAAA;AAAA,OAC9E;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,OAAO,MAAA,KAAW,CAAA;AAAA,IACzB;AAAA,GACF;AACF;;;AClIO,SAAS,gBAAA,GAA2B;AACzC,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,EAAE,CAAA;AAC/B,EAAA,MAAA,CAAO,gBAAgB,KAAK,CAAA;AAE5B,EAAA,KAAA,CAAM,CAAC,CAAA,GAAK,KAAA,CAAM,CAAC,IAAI,EAAA,GAAQ,EAAA;AAC/B,EAAA,KAAA,CAAM,CAAC,CAAA,GAAK,KAAA,CAAM,CAAC,IAAI,EAAA,GAAQ,GAAA;AAC/B,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA,CAAK,KAAA,EAAO,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,IAAA;AAAA,IACpE;AAAA,GACF;AACA,EAAA,OAAO,CAAA,EAAG,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,EAAE,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,EAAE,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,KAAA,CAAM,EAAE,CAAC,CAAA,CAAA;AAC1G;;;ACqCA,IAAM,oBAAA,GAAuB,EAAA;AAS7B,eAAsB,4BAAA,CACpB,KACA,OAAA,EACuC;AACvC,EAAA,IAAI,OAAA,GAAW,MAAM,GAAA,CAAI,EAAA,CAAG,IAAI,OAAO,CAAA;AACvC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,YAAA,GAAe,OAAA;AAErB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,oBAAA,IAAwB,SAAS,CAAA,EAAA,EAAK;AACxD,IAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,MAAA,MAAM,WAAA,GAAe,MAAM,GAAA,CAAI,EAAA,CAAG,GAAA;AAAA,QAChC,OAAA,CAAQ;AAAA,OACV;AACA,MAAA,IAAI,CAAC,WAAA,IAAe,WAAA,CAAY,MAAA,KAAW,UAAA,EAAY;AAErD,QAAA,IAAI,QAAQ,aAAA,EAAe;AACzB,UAAA,OAAA,GAAW,MAAM,IAAI,EAAA,CAAG,GAAA;AAAA,YACtB,OAAA,CAAQ;AAAA,WACV;AACA,UAAA;AAAA,QACF;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAGA,MAAA,MAAM,WAAY,MAAM,GAAA,CAAI,EAAA,CACzB,KAAA,CAAM,kBAAkB,CAAA,CACxB,SAAA;AAAA,QAAU,eAAA;AAAA,QAAiB,CAAC,CAAA,KAC3B,CAAA,CAAE,EAAA,CAAG,YAAA,EAAc,SAAS,UAAW;AAAA,QAExC,OAAA,EAAQ;AAEX,MAAA,MAAM,YAAY,QAAA,CACf,MAAA,CAAO,CAACA,EAAAA,KAAMA,EAAAA,CAAE,WAAW,WAAW,CAAA,CACtC,IAAA,CAAK,CAAC,GAAG,CAAA,KAAA,CAAO,CAAA,CAAE,eAAe,CAAA,KAAM,CAAA,CAAE,eAAe,CAAA,CAAE,CAAA;AAE7D,MAAA,MAAM,eAAA,GAAkB,SAAA,CAAU,CAAC,CAAA,IAAK,IAAA;AAExC,MAAA,OAAO;AAAA,QACL,YAAY,WAAA,CAAY,GAAA;AAAA,QACxB,aAAa,WAAA,CAAY,WAAA;AAAA,QACzB,cAAc,WAAA,CAAY,IAAA;AAAA,QAC1B,MAAM,WAAA,CAAY,IAAA;AAAA,QAClB,MAAA,EAAQ,OAAA,CAAQ,GAAA,KAAQ,YAAA,GAAe,QAAA,GAAW,WAAA;AAAA,QAClD,eAAe,OAAA,CAAQ,GAAA;AAAA,QACvB,gBAAA,EAAkB,eAAA,GACd,eAAA,CAAgB,WAAA,CAAY,GAAA,CAAI,CAAC,EAAA,KAAO,EAAA,CAAG,KAAK,CAAA,GAChD,EAAC;AAAA,QACL,cAAA,EAAgB,eAAA,GACZ,eAAA,CAAgB,SAAA,CAAU,GAAA,CAAI,CAAC,EAAA,KAAO,EAAA,CAAG,KAAK,CAAA,GAC9C,EAAC;AAAA,QACL,gBAAA,EAAkB;AAAA,OACpB;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,QAAQ,aAAA,EAAe;AAC1B,MAAA;AAAA,IACF;AACA,IAAA,OAAA,GAAW,MAAM,GAAA,CAAI,EAAA,CAAG,GAAA,CAAI,QAAQ,aAAa,CAAA;AAAA,EACnD;AAEA,EAAA,OAAO,IAAA;AACT;AAYA,eAAsB,0BAAA,CACpB,GAAA,EACA,OAAA,EACA,QAAA,EAC4D;AAC5D,EAAA,MAAM,QAAA,GAAW,MAAM,4BAAA,CAA6B,GAAA,EAAK,OAAO,CAAA;AAGhE,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AAAA,EACvB;AAGA,EAAA,IAAI,QAAA,CAAS,gBAAA,CAAiB,MAAA,KAAW,CAAA,EAAG;AAC1C,IAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AAAA,EACvB;AAGA,EAAA,IAAI,QAAA,CAAS,gBAAA,CAAiB,QAAA,CAAS,QAAQ,CAAA,EAAG;AAChD,IAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AAAA,EACvB;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,KAAA;AAAA,IACP,KAAA,EAAO,gBAAgB,QAAQ,CAAA,kCAAA,EAAqC,SAAS,WAAW,CAAA,GAAA,EAAM,SAAS,YAAY,CAAA,uBAAA,EAA0B,SAAS,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAC,CAAA,UAAA,EAAa,SAAS,MAAM,CAAA,YAAA,EAAe,SAAS,aAAa,CAAA,CAAA;AAAA,GACpP;AACF;;;AC1KA,IAAM,kBAAA,GAAqB,qBAAA;AA8F3B,SAAS,mBAAmB,KAAA,EAAoC;AAC9D,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA;AAAA,EACF;AACA,EAAA,MAAM,UAAA,GAAa,MAAM,IAAA,EAAK;AAC9B,EAAA,OAAO,UAAA,CAAW,MAAA,GAAS,CAAA,GAAI,UAAA,GAAa,MAAA;AAC9C;AAEA,SAAS,gBAAgB,KAAA,EAA0B;AACjD,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACzB,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,OAAO,KAAA,CACJ,GAAA,CAAI,CAAC,KAAA,KAAU,kBAAA,CAAmB,KAAK,CAAC,CAAA,CACxC,MAAA,CAAO,CAAC,KAAA,KAA2B,OAAA,CAAQ,KAAK,CAAC,CAAA;AACtD;AAEA,SAAS,aAAa,KAAA,EAA8C;AAClE,EAAA,OAAO,KAAA,CAAM,YAAY,OAAO,KAAA,CAAM,aAAa,QAAA,GAC/C,KAAA,CAAM,WACN,EAAC;AACP;AAEA,SAAS,oBACP,KAAA,EACoB;AACpB,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA;AAAA,EACF;AACA,EAAA,OAAO,kBAAA,CAAmB,KAAA,CAAM,kBAAkB,CAAC,CAAA;AACrD;AAEA,SAAS,iBACP,KAAA,EAC+C;AAC/C,EAAA,OAAO,KAAA,KAAU,SAAA,IACf,KAAA,KAAU,MAAA,IACV,KAAA,KAAU,UACV,KAAA,KAAU,UAAA,IACV,KAAA,KAAU,QAAA,GACR,KAAA,GACA,MAAA;AACN;AAEA,SAAS,aACP,KAAA,EAC2C;AAC3C,EAAA,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,UAAA,IAAc,KAAA,KAAU,aAC3D,KAAA,GACA,MAAA;AACN;AAEA,SAAS,cAAA,CACP,OACA,QAAA,EACQ;AACR,EAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,QAAA,CAAS,WAAW,CAAA;AACxD,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,OAAO,QAAA;AAAA,EACT;AACA,EAAA,IAAI,KAAA,CAAM,SAAS,OAAA,EAAS;AAC1B,IAAA,OAAO,UAAA;AAAA,EACT;AACA,EAAA,OAAO,kBAAA,CAAmB,KAAA,CAAM,IAAI,CAAA,IAAK,SAAA;AAC3C;AAEA,SAAS,mBAAmB,KAAA,EAA8B;AACxD,EAAA,MAAM,QAAA,GAAW,aAAa,KAAK,CAAA;AACnC,EAAA,OACE,MAAM,IAAA,KAAS,OAAA,IACf,MAAM,IAAA,KAAS,UAAA,IACf,MAAM,IAAA,KAAS,MAAA,IACf,MAAM,IAAA,KAAS,YAAA,IACf,oBAAoB,KAAK,CAAA,KAAM,UAC/B,kBAAA,CAAmB,QAAA,CAAS,WAAW,CAAA,KAAM,MAAA;AAEjD;AAEA,SAAS,mCAAmC,KAAA,EAAyB;AACnE,EAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,EAAA,OACE,OAAA,CAAQ,QAAA;AAAA,IACN;AAAA,GACF,IACC,OAAA,CAAQ,QAAA,CAAS,iBAAiB,CAAA,IACjC,OAAA,CAAQ,QAAA,CAAS,QAAQ,CAAA,IACzB,OAAA,CAAQ,QAAA,CAAS,WAAW,CAAA;AAElC;AAEA,eAAe,eAAA,CACb,KACA,OAAA,EAC8B;AAC9B,EAAA,IAAI,KAAK,EAAA,IAAM,OAAO,GAAA,CAAI,EAAA,CAAG,QAAQ,UAAA,EAAY;AAC/C,IAAA,IAAI;AACF,MAAA,MAAM,WAAA,GAAe,MAAM,GAAA,CAAI,EAAA,CAAG,IAAI,OAAc,CAAA;AACpD,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,OAAO,WAAA;AAAA,MACT;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,IAAI,OAAO,GAAA,CAAI,QAAA,KAAa,UAAA,EAAY;AACtC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,QAAQ,MAAM,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,OAAO,GAAA,EAAY;AAAA,MACtD,EAAA,EAAI,OAAO,OAAO;AAAA,KACnB,CAAA;AACD,IAAA,IAAI,KAAA,EAAO,IAAA,KAAS,KAAA,CAAA,IAAa,KAAA,EAAO,SAAS,KAAA,CAAA,EAAW;AAC1D,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,QAAQ,MAAM,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,OAAO,kBAAA,EAA2B;AAAA,MACrE,SAAA,EAAW,OAAO,OAAO;AAAA,KAC1B,CAAA;AACD,IAAA,IAAI,KAAA,EAAO,IAAA,KAAS,KAAA,CAAA,IAAa,KAAA,EAAO,SAAS,KAAA,CAAA,EAAW;AAC1D,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,8BAAA,CACd,KAAA,EACA,MAAA,GAAwB,QAAA,EACH;AACrB,EAAA,MAAM,QAAA,GAAW,aAAa,KAAK,CAAA;AACnC,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AAChC,EAAA,MAAM,eAAA,GACJ,oBAAoB,KAAK,CAAA,IACzB,oBAAoB,QAAQ,CAAA,IAC5B,kBAAA,CAAmB,QAAA,CAAS,eAAe,CAAA;AAC7C,EAAA,MAAM,mBAAmB,eAAA,IAAmB,OAAA;AAC5C,EAAA,MAAM,SAAA,GAAY,MAAA,KAAW,OAAA,GAAU,OAAA,GAAU,gBAAA;AACjD,EAAA,MAAM,UAAA,GACJ,iBAAiB,KAAA,CAAM,UAAU,KACjC,gBAAA,CAAiB,QAAA,CAAS,UAAU,CAAA,IACpC,SAAA;AACF,EAAA,MAAM,MAAA,GACJ,aAAa,KAAA,CAAM,MAAM,KAAK,YAAA,CAAa,QAAA,CAAS,MAAM,CAAA,IAAK,QAAA;AACjE,EAAA,MAAM,SAAA,GACJ,OAAO,KAAA,CAAM,SAAA,KAAc,QAAA,GACvB,KAAA,CAAM,SAAA,GACN,OAAO,KAAA,CAAM,aAAA,KAAkB,QAAA,GAC7B,KAAA,CAAM,aAAA,GACN,CAAA;AACR,EAAA,MAAM,SAAA,GACJ,OAAO,KAAA,CAAM,SAAA,KAAc,QAAA,GACvB,KAAA,CAAM,SAAA,GACN,OAAO,QAAA,CAAS,SAAA,KAAc,QAAA,GAC3B,QAAA,CAAS,SAAA,GACV,SAAA;AAER,EAAA,OAAO;AAAA,IACL,GAAG,QAAA;AAAA,IACH,GAAA,EAAK,SAAA;AAAA,IACL,SAAA,EAAW,SAAA;AAAA,IACX,OAAA;AAAA,IACA,gBAAA;AAAA,IACA,eAAA;AAAA,IACA,IAAA,EAAM,kBAAA,CAAmB,KAAA,CAAM,IAAI,CAAA,IAAK,gBAAA;AAAA,IACxC,IAAA,EAAM,cAAA,CAAe,KAAA,EAAO,QAAQ,CAAA;AAAA,IACpC,WAAA,EAAa,kBAAA,CAAmB,KAAA,CAAM,WAAW,CAAA;AAAA,IACjD,OAAA,EACE,mBAAmB,QAAA,CAAS,OAAO,KACnC,kBAAA,CAAmB,KAAA,CAAM,SAAS,CAAA,IAClC,QAAA;AAAA,IACF,UAAA,EAAY,eAAA,CAAgB,QAAA,CAAS,UAAU,CAAA;AAAA,IAC/C,UAAA;AAAA,IACA,UACE,kBAAA,CAAmB,KAAA,CAAM,QAAQ,CAAA,IACjC,kBAAA,CAAmB,SAAS,QAAQ,CAAA;AAAA,IACtC,aACE,kBAAA,CAAmB,KAAA,CAAM,WAAW,CAAA,IACpC,kBAAA,CAAmB,SAAS,WAAW,CAAA;AAAA,IACzC,MAAA;AAAA,IACA,IAAA,EAAM,eAAA,CAAgB,QAAA,CAAS,IAAI,CAAA;AAAA,IACnC,WACE,OAAO,QAAA,CAAS,SAAA,KAAc,QAAA,GAAY,SAAS,SAAA,GAAuB,CAAA;AAAA,IAC5E,eACE,OAAO,QAAA,CAAS,aAAA,KAAkB,QAAA,GAC7B,SAAS,aAAA,GACV,CAAA;AAAA,IACN,gBACE,OAAO,QAAA,CAAS,cAAA,KAAmB,QAAA,GAC9B,SAAS,cAAA,GACV,SAAA;AAAA,IACN,eACE,OAAO,KAAA,CAAM,aAAA,KAAkB,QAAA,GAAW,MAAM,aAAA,GAAgB,SAAA;AAAA,IAClE,SAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,eAAsB,0BAAA,CACpB,GAAA,EACA,OAAA,EACA,OAAA,GAGI,EAAC,EACgC;AACrC,EAAA,MAAM,KAAA,GAAQ,MAAM,eAAA,CAAgB,GAAA,EAAK,OAAO,CAAA;AAChD,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,QAAQ,eAAA,KAAoB,KAAA,IAAS,CAAC,kBAAA,CAAmB,KAAK,CAAA,EAAG;AACnE,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,8BAAA,CAA+B,KAAA,EAAO,OAAA,CAAQ,MAAM,CAAA;AAC7D;AAEA,eAAsB,wBAAA,CACpB,GAAA,EACA,OAAA,GAGI,EAAC,EAC2B;AAChC,EAAA,IAAI,YAA4B,EAAC;AAEjC,EAAA,IAAI,KAAK,EAAA,EAAI,KAAA,IAAS,OAAO,GAAA,CAAI,EAAA,CAAG,UAAU,UAAA,EAAY;AACxD,IAAA,IAAI;AACF,MAAA,SAAA,GAAa,MAAM,GAAA,CAAI,EAAA,CAAG,KAAA,CAAM,QAAQ,EAAE,OAAA,EAAQ;AAAA,IACpD,CAAA,CAAA,MAAQ;AACN,MAAA,SAAA,GAAY,EAAC;AAAA,IACf;AAAA,EACF;AAEA,EAAA,IAAI,UAAU,MAAA,KAAW,CAAA,IAAK,OAAO,GAAA,CAAI,aAAa,UAAA,EAAY;AAChE,IAAA,SAAA,GAAA,CACK,MAAM,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,MAAA,CAAO,IAAA,EAAa,EAAE,CAAA,IAAM,EAAC,KACvD,EAAC;AAAA,EACL;AAEA,EAAA,OAAO,SAAA,CACJ,MAAA;AAAA,IACC,CAAC,KAAA,KAAU,OAAA,CAAQ,eAAA,KAAoB,KAAA,IAAS,mBAAmB,KAAK;AAAA,GAC1E,CACC,IAAI,CAAC,KAAA,KAAU,+BAA+B,KAAA,EAAO,OAAA,CAAQ,MAAM,CAAC,CAAA;AACzE;AAEA,eAAsB,wBAAA,CACpB,GAAA,EACA,OAAA,EACA,KAAA,EACqC;AACrC,EAAA,MAAM,KAAA,GAAQ,MAAM,eAAA,CAAgB,GAAA,EAAK,OAAO,CAAA;AAChD,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,YAAA,GAAe,EAAE,GAAG,YAAA,CAAa,KAAK,CAAA,EAAE;AAC9C,EAAA,MAAM,QAAiC,EAAC;AACxC,EAAA,MAAM,eAAA,GAA2C;AAAA,IAC/C,EAAA,EAAI,MAAA,CAAO,KAAA,CAAM,GAAG;AAAA,GACtB;AAEA,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AACnD,IAAA,QAAQ,GAAA;AAAK,MACX,KAAK,KAAA;AAAA,MACL,KAAK,WAAA;AAAA,MACL,KAAK,SAAA;AAAA,MACL,KAAK,iBAAA;AAAA,MACL,KAAK,kBAAA;AACH,QAAA;AAAA,MACF,KAAK,MAAA;AAAA,MACL,KAAK,aAAA;AACH,QAAA,KAAA,CAAM,GAAG,CAAA,GAAI,QAAA;AACb,QAAA,eAAA,CAAgB,GAAG,CAAA,GAAI,QAAA;AACvB,QAAA;AAAA,MACF,KAAK,UAAA;AAAA,MACL,KAAK,aAAA;AAAA,MACL,KAAK,SAAA;AACH,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,0CAA0C,GAAG,CAAA,2BAAA;AAAA,SAC/C;AAAA,MACF,KAAK,QAAA,EAAU;AACb,QAAA,MAAM,MAAA,GAAS,aAAa,QAAQ,CAAA;AACpC,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,KAAA,CAAM,MAAA,GAAS,MAAA;AACf,UAAA,eAAA,CAAgB,MAAA,GAAS,MAAA;AAAA,QAC3B;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,YAAA,EAAc;AACjB,QAAA,MAAM,UAAA,GAAa,iBAAiB,QAAQ,CAAA;AAC5C,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,KAAA,CAAM,UAAA,GAAa,UAAA;AACnB,UAAA,eAAA,CAAgB,UAAA,GAAa,UAAA;AAAA,QAC/B;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,MAAA,EAAQ;AACX,QAAA,MAAM,WAAA,GAAc,mBAAmB,QAAQ,CAAA;AAC/C,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,YAAA,CAAa,WAAA,GAAc,WAAA;AAAA,QAC7B,CAAA,MAAO;AACL,UAAA,OAAO,YAAA,CAAa,WAAA;AAAA,QACtB;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,WAAA;AAAA,MACL,KAAK,WAAA;AACH,QAAA;AAAA,MACF;AACE,QAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,UAAA,OAAO,aAAa,GAAG,CAAA;AAAA,QACzB,CAAA,MAAO;AACL,UAAA,YAAA,CAAa,GAAG,CAAA,GAAI,QAAA;AAAA,QACtB;AAAA;AACJ,EACF;AAEA,EAAA,KAAA,CAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,EAAA,KAAA,CAAM,QAAA,GAAW,YAAA;AACjB,EAAA,eAAA,CAAgB,QAAA,GAAW,YAAA;AAE3B,EAAA,IAAI,OAAO,GAAA,CAAI,WAAA,KAAgB,UAAA,EAAY;AACzC,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,CAAI,WAAA,CAAY,GAAA,CAAI,MAAA,CAAO,QAAe,eAAe,CAAA;AAAA,IACjE,SAAS,KAAA,EAAO;AACd,MAAA,IACE,CAAC,kCAAA,CAAmC,KAAK,CAAA,IACzC,CAAC,GAAA,EAAK,EAAA,IACN,OAAO,GAAA,CAAI,EAAA,CAAG,KAAA,KAAU,UAAA,EACxB;AACA,QAAA,MAAM,KAAA;AAAA,MACR;AACA,MAAA,MAAM,IAAI,EAAA,CAAG,KAAA,CAAM,OAAO,KAAA,CAAM,GAAG,GAAU,KAAK,CAAA;AAAA,IACpD;AAAA,EACF,WAAW,GAAA,EAAK,EAAA,IAAM,OAAO,GAAA,CAAI,EAAA,CAAG,UAAU,UAAA,EAAY;AACxD,IAAA,MAAM,IAAI,EAAA,CAAG,KAAA,CAAM,OAAO,KAAA,CAAM,GAAG,GAAU,KAAK,CAAA;AAAA,EACpD,CAAA,MAAO;AACL,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAEA,EAAA,OAAO,8BAAA;AAAA,IACL;AAAA,MACE,GAAG,KAAA;AAAA,MACH,GAAG,KAAA;AAAA,MACH,QAAA,EAAU;AAAA;AACZ,GACF;AACF;;;AC5bA,SAASC,oCAAmC,KAAA,EAAyB;AACnE,EAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,EAAA,OACE,OAAA,CAAQ,QAAA,CAAS,+DAA+D,CAAA,IAC/E,QAAQ,QAAA,CAAS,iBAAiB,CAAA,IACjC,OAAA,CAAQ,QAAA,CAAS,QAAQ,CAAA,IACzB,OAAA,CAAQ,SAAS,WAAW,CAAA;AAElC;AAEA,SAAS,qBAAqB,KAAA,EAAyC;AACrE,EAAA,MAAM,+BAAe,IAAI,GAAA,CAAI,CAAC,gBAAA,EAAkB,WAAW,CAAC,CAAA;AAC5D,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AAC9B,EAAA,OAAO,IAAA,CAAK,MAAA,GAAS,CAAA,IAAK,IAAA,CAAK,KAAA,CAAM,CAAC,GAAA,KAAQ,YAAA,CAAa,GAAA,CAAI,GAAG,CAAC,CAAA;AACrE;AAEA,eAAe,yBAAA,CACb,GAAA,EACA,SAAA,EACA,KAAA,EACe;AACf,EAAA,IAAI;AACF,IAAA,MAAM,wBAAA,CAAyB,GAAA,EAAK,SAAA,EAAW,KAAK,CAAA;AAAA,EACtD,SAAS,KAAA,EAAO;AACd,IAAA,IACE,CAAC,oBAAA,CAAqB,KAAK,KAC3B,CAACA,mCAAAA,CAAmC,KAAK,CAAA,EACzC;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAEA,IAAA,OAAA,CAAQ,KAAK,kEAAA,EAAoE;AAAA,MAC/E,SAAA;AAAA,MACA,IAAA,EAAM,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AAAA,MACvB,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,KACjD,CAAA;AAAA,EACH;AACF;AAEA,SAAS,gBAAA,GAAgD;AACvD,EAAA,OAAO;AAAA,IACL,MAAM,UAAA,CAAW,GAAA,EAAK,SAAA,EAAW;AAC/B,MAAA,OAAO,MAAM,0BAAA,CAA2B,GAAA,EAAK,SAAA,EAAW;AAAA,QACtD,MAAA,EAAQ,QAAA;AAAA,QACR,eAAA,EAAiB;AAAA,OAClB,CAAA;AAAA,IACH,CAAA;AAAA,IACA,MAAM,YAAA,CAAa,GAAA,EAAK,SAAA,EAAW,KAAA,EAAO;AACxC,MAAA,MAAM,yBAAA,CAA0B,GAAA,EAAK,SAAA,EAAW,KAAK,CAAA;AAAA,IACvD,CAAA;AAAA,IACA,MAAM,WAAW,GAAA,EAAK;AACpB,MAAA,OAAO,MAAM,yBAAyB,GAAA,EAAK;AAAA,QACzC,MAAA,EAAQ;AAAA,OACT,CAAA;AAAA,IACH,CAAA;AAAA,IACA,MAAM,gBAAA,CAAiB,GAAA,EAAK,UAAA,EAAY;AACtC,MAAA,OAAO,MAAM,GAAA,CAAI,EAAA,CAAG,GAAA,CAAI,UAAU,CAAA;AAAA,IACpC;AAAA,GACF;AACF;AAEA,IAAI,oBAA0D,EAAC;AAexD,SAAS,mCACd,IAAA,EAC6B;AAC7B,EAAA,OAAO;AAAA,IACL,GAAG,gBAAA,EAAiB;AAAA,IACpB,GAAG;AAAA,GACL;AACF;ACzFA,IAAMC,mBAAAA,GAAqB,qBAAA;AA2B3B,SAAS,kBACP,KAAA,EACoB;AACpB,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA;AAAA,EACF;AACA,EAAA,MAAM,qBAAA,GAAwB,mBAAA,CAAoB,KAAA,CAAMA,mBAAkB,CAAC,CAAA;AAC3E,EAAA,IAAI,qBAAA,EAAuB;AACzB,IAAA,OAAO,qBAAA;AAAA,EACT;AACA,EAAA,MAAM,QAAA,GAAY,KAAA,CAAM,QAAA,IAAY,EAAC;AACrC,EAAA,MAAM,SAAA,GACH,SAASA,mBAAkB,CAAA,IAC3B,SAAS,eAAA,IACT,QAAA,CAAS,aACT,QAAA,CAAS,cAAA;AACZ,EAAA,OAAO,YAAa,SAAA,GAAuB,MAAA;AAC7C;AAEA,SAAS,oBAAoB,KAAA,EAAoC;AAC/D,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA;AAAA,EACF;AACA,EAAA,MAAM,UAAA,GAAa,MAAM,IAAA,EAAK;AAC9B,EAAA,OAAO,UAAA,CAAW,MAAA,GAAS,CAAA,GAAI,UAAA,GAAa,MAAA;AAC9C;AAEA,SAAS,iBAAiB,UAAA,EAA8C;AACtE,EAAA,OAAO,CAAC,GAAG,UAAU,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AACpC,IAAA,MAAM,MAAA,GAAS,EAAE,KAAA,IAAS,IAAA;AAC1B,IAAA,MAAM,MAAA,GAAS,EAAE,KAAA,IAAS,IAAA;AAC1B,IAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,MAAA,OAAO,MAAA,GAAS,MAAA;AAAA,IAClB;AACA,IAAA,MAAM,QAAA,GAAW,CAAA,CAAE,SAAA,IAAa,MAAA,CAAO,gBAAA;AACvC,IAAA,MAAM,QAAA,GAAW,CAAA,CAAE,SAAA,IAAa,MAAA,CAAO,gBAAA;AACvC,IAAA,IAAI,aAAa,QAAA,EAAU;AACzB,MAAA,OAAO,QAAA,GAAW,QAAA;AAAA,IACpB;AACA,IAAA,OAAO,MAAA,CAAO,CAAA,CAAE,IAAA,IAAQ,EAAE,CAAA,CAAE,cAAc,MAAA,CAAO,CAAA,CAAE,IAAA,IAAQ,EAAE,CAAC,CAAA;AAAA,EAChE,CAAC,EAAE,CAAC,CAAA;AACN;AAEA,eAAe,sBAAA,CAAuB,KAAU,OAAA,EAAsC;AACpF,EAAA,IAAI;AACF,IAAA,OAAQ,MAAM,GAAA,CAAI,EAAA,CACf,KAAA,CAAM,QAAQ,CAAA,CACd,SAAA;AAAA,MAAU,wBAAA;AAAA,MAA0B,CAAC,CAAA,KACpC,CAAA,CAAE,EAAA,CAAGA,qBAAoB,OAAO;AAAA,MAEjC,OAAA,EAAQ;AAAA,EACb,CAAA,CAAA,MAAQ;AAIN,IAAA,MAAM,SAAU,MAAM,GAAA,CAAI,GAAG,KAAA,CAAM,QAAQ,EAAE,OAAA,EAAQ;AACrD,IAAA,OAAO,MAAA,CAAO,MAAA,CAAO,CAAC,KAAA,KAAU;AAC9B,MAAA,MAAM,kBAAA,GAAqB,mBAAA,CAAoB,KAAA,CAAM,QAAQ,CAAA;AAC7D,MAAA,MAAM,eAAA,GAAkB,kBAAkB,KAAK,CAAA;AAC/C,MAAA,OACE,OAAO,KAAA,CAAM,GAAG,MAAM,OAAA,IACtB,kBAAA,KAAuB,WACvB,eAAA,KAAoB,OAAA;AAAA,IAExB,CAAC,CAAA;AAAA,EACH;AACF;AAEA,eAAe,uBAAA,CACb,KACA,OAAA,EAC0B;AAC1B,EAAA,IAAI,OAAO,GAAA,CAAI,QAAA,KAAa,UAAA,EAAY;AACtC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI;AACF,IAAA,OAAS,MAAM,GAAA,CAAI,QAAA,CAAS,GAAA,CAAO,OAAO,GAAA,EAAY;AAAA,MACpD,EAAA,EAAI;AAAA,KACL,CAAA,IAAM,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,eAAe,gCAAA,CACb,KACA,aAAA,EAC0B;AAC1B,EAAA,IAAI,OAAO,GAAA,CAAI,QAAA,KAAa,UAAA,EAAY;AACtC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI;AACF,IAAA,OAAS,MAAM,GAAA,CAAI,QAAA,CAAS,GAAA,CAAO,OAAO,kBAAA,EAA2B;AAAA,MACnE,SAAA,EAAW;AAAA,KACZ,CAAA,IAAM,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAwBA,eAAe,8BAAA,CACb,KACA,KAAA,EACsD;AACtD,EAAA,MAAM,SAAA,GAAY,EAAA;AAClB,EAAA,IAAI,QAAA,GAAW,mBAAA,CAAoB,KAAA,CAAM,QAAQ,CAAA;AACjD,EAAA,IAAI,WAAA,GAAc,mBAAA,CAAoB,KAAA,CAAM,WAAW,CAAA;AAEvD,EAAA,IAAI,YAAY,WAAA,EAAa;AAC3B,IAAA,OAAO,EAAE,UAAU,WAAA,EAAY;AAAA,EACjC;AAEA,EAAA,IAAI,OAAA,GAA2B,KAAA;AAC/B,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,SAAA,IAAa,OAAA,EAAS,eAAe,CAAA,EAAA,EAAK;AAC5D,IAAA,OAAA,GAAW,MAAM,GAAA,CAAI,EAAA,CAAG,GAAA,CAAI,QAAQ,aAAa,CAAA;AACjD,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,QAAA,GAAW,mBAAA,CAAoB,QAAQ,QAAQ,CAAA;AAAA,IACjD;AACA,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,WAAA,GAAc,mBAAA,CAAoB,QAAQ,WAAW,CAAA;AAAA,IACvD;AACA,IAAA,IAAI,YAAY,WAAA,EAAa;AAAA,EAC/B;AAEA,EAAA,OAAO,EAAE,UAAU,WAAA,EAAY;AACjC;AAEA,eAAsB,wBAAA,CACpB,KACA,IAAA,EAC4B;AAC5B,EAAA,IAAI,KAAK,OAAA,EAAS;AAEhB,IAAA,IAAI,KAAA,GAAyB,IAAA;AAC7B,IAAA,IAAI;AACF,MAAA,KAAA,GAAS,MAAM,GAAA,CAAI,EAAA,CAAG,GAAA,CAAI,KAAK,OAAuB,CAAA;AAAA,IACxD,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,KAAA,GAAQ,MAAM,uBAAA,CAAwB,GAAA,EAAK,MAAA,CAAO,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,IACjE;AACA,IAAA,IAAI,CAAC,KAAA,EAAO;AAEV,MAAA,KAAA,GACE,gBAAA;AAAA,QACE,MAAM,sBAAA,CAAuB,GAAA,EAAK,MAAA,CAAO,IAAA,CAAK,OAAO,CAAC;AAAA,OACxD,IAAK,IAAA;AAAA,IACT;AACA,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,OAAO,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,CAAA;AAAA,IAC5D;AACA,IAAA,MAAM,SAAA,GAAY,MAAM,8BAAA,CAA+B,GAAA,EAAK,KAAK,CAAA;AACjE,IAAA,MAAM,MAAA,GAAS,kBAAkB,KAAK,CAAA;AACtC,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAO;AAAA,QACL,SAAS,KAAA,CAAM,GAAA;AAAA,QACf,SAAA,EAAW,MAAA;AAAA,QACX,UAAU,SAAA,CAAU,QAAA;AAAA,QACpB,aAAa,SAAA,CAAU,WAAA;AAAA,QACvB,MAAA,EAAQ;AAAA,OACV;AAAA,IACF;AACA,IAAA,OAAO;AAAA,MACL,SAAS,KAAA,CAAM,GAAA;AAAA,MACf,UAAU,SAAA,CAAU,QAAA;AAAA,MACpB,aAAa,SAAA,CAAU,WAAA;AAAA,MACvB,MAAA,EAAQ;AAAA,KACV;AAAA,EACF;AAEA,EAAA,IAAI,KAAK,SAAA,EAAW;AAClB,IAAA,IAAI,WAAA,GAA+B,IAAA;AACnC,IAAA,IAAI;AACF,MAAA,WAAA,GAAe,MAAM,IAAI,EAAA,CAAG,GAAA;AAAA,QAC1B,IAAA,CAAK;AAAA,OACP;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,SAAA,GAAY,MAAM,8BAAA,CAA+B,GAAA,EAAK,WAAW,CAAA;AACvE,MAAA,MAAM,MAAA,GAAS,kBAAkB,WAAW,CAAA;AAC5C,MAAA,OAAO;AAAA,QACL,SAAS,WAAA,CAAY,GAAA;AAAA,QACrB,SAAA,EAAW,UAAU,IAAA,CAAK,SAAA;AAAA,QAC1B,UAAU,SAAA,CAAU,QAAA;AAAA,QACpB,aAAa,SAAA,CAAU,WAAA;AAAA,QACvB,MAAA,EAAQ;AAAA,OACV;AAAA,IACF;AAEA,IAAA,WAAA,GAAc,MAAM,gCAAA,CAAiC,GAAA,EAAK,IAAA,CAAK,SAAS,CAAA;AACxE,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,SAAA,GAAY,MAAM,8BAAA,CAA+B,GAAA,EAAK,WAAW,CAAA;AACvE,MAAA,MAAM,MAAA,GAAS,kBAAkB,WAAW,CAAA;AAC5C,MAAA,OAAO;AAAA,QACL,SAAS,WAAA,CAAY,GAAA;AAAA,QACrB,SAAA,EAAW,UAAU,IAAA,CAAK,SAAA;AAAA,QAC1B,UAAU,SAAA,CAAU,QAAA;AAAA,QACpB,aAAa,SAAA,CAAU,WAAA;AAAA,QACvB,MAAA,EAAQ;AAAA,OACV;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,sBAAA,CAAuB,GAAA,EAAK,KAAK,SAAS,CAAA;AAC/D,IAAA,MAAM,OAAA,GAAU,iBAAiB,MAAM,CAAA;AACvC,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,SAAA,GAAY,MAAM,8BAAA,CAA+B,GAAA,EAAK,OAAO,CAAA;AACnE,MAAA,OAAO;AAAA,QACL,SAAS,OAAA,CAAQ,GAAA;AAAA,QACjB,WAAW,IAAA,CAAK,SAAA;AAAA,QAChB,UAAU,SAAA,CAAU,QAAA;AAAA,QACpB,aAAa,SAAA,CAAU,WAAA;AAAA,QACvB,MAAA,EAAQ;AAAA,OACV;AAAA,IACF;AACA,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,qBAAA,EAAwB,MAAA,CAAO,IAAA,CAAK,SAAS,CAAC,CAAA,qBAAA;AAAA,KAChD;AAAA,EACF;AAEA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR;AAAA,GACF;AACF;AAGO,IAAM,iBAAA,GAAoB;AAAA,EAC/B,SAAA,EAAW,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAA;AAAA,EAChC,OAAA,EAAS,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ;AAChC,CAAA;;;ACvPA,SAAS,6BAA6B,IAAA,EAO5B;AACR,EAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA;AACpC,EAAA,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA;AACpB,EAAA,KAAA,CAAM,OAAO,IAAA,CAAK,IAAA;AAClB,EAAA,KAAA,CAAM,gBAAgB,IAAA,CAAK,aAAA;AAC3B,EAAA,KAAA,CAAM,aAAa,IAAA,CAAK,UAAA;AACxB,EAAA,KAAA,CAAM,UAAU,IAAA,CAAK,OAAA;AACrB,EAAA,MAAM,KAAA;AACR;AAEA,eAAe,2BAA2B,GAAA,EAEtB;AAClB,EAAA,MAAM,MAAA,GAAS,MAAM,gBAAA,CAAiB,GAAU,CAAA;AAChD,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,4BAAA,CAA6B;AAAA,MAC3B,OAAA,EAAS,0BAAA;AAAA,MACT,MAAA,EAAQ,GAAA;AAAA,MACR,IAAA,EAAM,yBAAA;AAAA,MACN,aAAA,EAAe,eAAA;AAAA,MACf,UAAA,EACE;AAAA,KACH,CAAA;AAAA,EACH;AACA,EAAA,OAAO,MAAA;AACT;AAEA,eAAe,yBAAA,CACb,GAAA,EACA,SAAA,EACA,MAAA,EACe;AACf,EAAA,MAAM,SAAA,GAAY,MAAM,kBAAA,CAAmB,GAAA,EAAY,WAAW,MAAM,CAAA;AACxE,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,4BAAA,CAA6B;AAAA,MAC3B,OAAA,EAAS,0BAAA;AAAA,MACT,MAAA,EAAQ,GAAA;AAAA,MACR,IAAA,EAAM,WAAA;AAAA,MACN,aAAA,EAAe,uBAAA;AAAA,MACf,UAAA,EAAY,iDAAA;AAAA,MACZ,OAAA,EAAS,EAAE,SAAA,EAAW,MAAA;AAAO,KAC9B,CAAA;AAAA,EACH;AACF;AAMA,SAAS,mBAAA,CAAoB,UAAkB,IAAA,EAAsB;AACnE,EAAA,MAAM,OAAA,GAAU,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,IAAA,CAAK,IAAA,EAAK,CAAE,WAAA,EAAY,CAAE,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAC,CAAA,CAAA;AAC7E,EAAA,IAAI,IAAA,GAAO,IAAA;AACX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,IAAA,IAAA,GAAA,CAAQ,IAAA,IAAQ,CAAA,IAAK,IAAA,GAAO,OAAA,CAAQ,WAAW,CAAC,CAAA;AAChD,IAAA,IAAA,IAAQ,IAAA;AAAA,EACV;AACA,EAAA,OAAO,IAAA,CAAK,IAAI,IAAI,CAAA,CAAE,SAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAA;AACpD;AAGO,IAAM,sBAAA,GAAyB;AAAA,EACpC,SAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF;AAIO,SAAS,sBACd,QAAA,EACiC;AACjC,EAAA,OAAQ,sBAAA,CAA6C,SAAS,QAAQ,CAAA;AACxE;AAEA,SAAS,6BAA6B,KAAA,EAAuB;AAC3D,EAAA,OAAO,MAAM,IAAA,EAAK,CAAE,aAAY,CAAE,OAAA,CAAQ,QAAQ,GAAG,CAAA;AACvD;AAEA,SAAS,iBAAiB,aAAA,EAA+B;AACvD,EAAA,OAAO,aAAA,CAAc,MAAM,CAAA,EAAG,GAAG,KAAK,aAAA,CAAc,MAAA,GAAS,MAAM,KAAA,GAAQ,EAAA,CAAA;AAC7E;AAoBA,eAAe,2BAAA,CACb,KACA,IAAA,EAC+B;AAC/B,EAAA,MAAM,KAAA,GAAQ,MAAM,wBAAA,CAAyB,GAAA,EAAK,IAAI,CAAA;AACtD,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,GACb,MAAM,GAAA,CAAI,GAAG,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,IAA+B,IAAA,GAChE,IAAA;AACJ,EAAA,MAAM,UACJ,KAAA,CAAM,SAAA,KAAc,SACZ,MAAM,kCAAA,CAAsC,CAAA,CAAE,UAAA;AAAA,IAC9C,GAAA;AAAA,IACA,KAAA,CAAM;AAAA,OACyB,IAAA,GACnC,IAAA;AAEN,EAAA,MAAM,QAAA,GACJ,OAAO,KAAA,EAAO,QAAA,KAAa,QAAA,IAAY,KAAA,CAAM,QAAA,CAAS,IAAA,EAAK,CAAE,MAAA,GAAS,CAAA,GAClE,KAAA,CAAM,QAAA,CAAS,IAAA,EAAK,GACpB,OAAO,OAAA,EAAS,QAAA,KAAa,QAAA,IAC3B,OAAA,CAAQ,QAAA,CAAS,IAAA,EAAK,CAAE,MAAA,GAAS,CAAA,GACjC,OAAA,CAAQ,QAAA,CAAS,IAAA,EAAK,GACtB,MAAA;AAER,EAAA,OAAO;AAAA,IACL,GAAG,KAAA;AAAA,IACH,QAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,4BAAA,CACP,MAQA,IAAA,EAMS;AACT,EAAA,IAAI,IAAA,CAAK,mBAAmB,aAAA,EAAe;AACzC,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,IAAA,CAAK,gBAAgB,MAAA,EAAW;AAClC,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,QAAA,KAAa,KAAK,QAAA,EAAU;AACpD,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,WAAA,KAAgB,KAAK,WAAA,EAAa;AAC7D,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,WAAA,GACJ,OAAO,IAAA,CAAK,QAAA,KAAa,YAAY,IAAA,CAAK,QAAA,CAAS,IAAA,EAAK,CAAE,MAAA,GAAS,CAAA,GAC/D,IAAA,CAAK,QAAA,CAAS,MAAK,GACnB,MAAA;AACN,EAAA,IAAI,WAAA,KAAgB,KAAK,QAAA,EAAU;AACjC,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,IAAA,OAAO,KAAK,MAAA,KAAW,SAAA;AAAA,EACzB;AACA,EAAA,OAAO,KAAK,MAAA,KAAW,QAAA;AACzB;AAEA,eAAe,2BAAA,CACb,KACA,IAAA,EAKA;AACA,EAAA,MAAM,WAAA,GAAc,mBAAA,CAAoB,IAAA,CAAK,QAAA,EAAU,KAAK,aAAa,CAAA;AACzE,EAAA,MAAM,aAAa,MAAM,GAAA,CAAI,EAAA,CAC1B,KAAA,CAAM,gBAAgB,CAAA,CACtB,SAAA,CAAU,gBAAA,EAAkB,CAAC,MAAW,CAAA,CAAE,EAAA,CAAG,eAAe,WAAW,CAAC,EACxE,OAAA,EAAQ;AAEX,EAAA,OACE,UAAA,CAAW,IAAA;AAAA,IAAK,CAAC,IAAA,KACf,4BAAA,CAA6B,IAAA,EAAM;AAAA,MACjC,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,UAAU,IAAA,CAAK,QAAA;AAAA,MACf;AAAA,KACD;AAAA,GACH,IAAK,IAAA;AAET;AAEA,eAAe,6BAAA,CACb,KACA,IAAA,EAOA;AACA,EAAA,MAAM,QAAA,GACJ,KAAK,QAAA,KAAa,MAAA,GACd,MAAM,GAAA,CAAI,EAAA,CACP,KAAA,CAAM,gBAAgB,CAAA,CACtB,SAAA,CAAU,eAAe,CAAC,CAAA,KAAW,CAAA,CAAE,EAAA,CAAG,UAAA,EAAY,IAAA,CAAK,QAAQ,CAAC,CAAA,CACpE,OAAA,EAAQ,GACX,IAAA,CAAK,QAAA,GACH,MAAM,GAAA,CAAI,EAAA,CACP,MAAM,gBAAgB,CAAA,CACtB,UAAU,aAAA,EAAe,CAAC,CAAA,KAAW,CAAA,CAAE,EAAA,CAAG,UAAA,EAAY,KAAK,QAAQ,CAAC,CAAA,CACpE,OAAA,EAAQ,GACX,MAAM,IAAI,EAAA,CAAG,KAAA,CAAM,gBAAgB,CAAA,CAAE,OAAA,EAAQ;AAErD,EAAA,MAAM,gBAAA,GACJ,OAAO,IAAA,CAAK,UAAA,KAAe,YAAY,IAAA,CAAK,UAAA,CAAW,IAAA,EAAK,CAAE,MAAA,GAAS,CAAA,GACnE,4BAAA,CAA6B,IAAA,CAAK,UAAU,CAAA,GAC5C,MAAA;AAEN,EAAA,OAAO,QAAA,CACJ,MAAA;AAAA,IAAO,CAAC,IAAA,KACP,4BAAA,CAA6B,IAAA,EAAM;AAAA,MACjC,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,iBAAiB,IAAA,CAAK;AAAA,KACvB;AAAA,GACH,CACC,MAAA,CAAO,CAAC,IAAA,KAAc;AACrB,IAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,OACJ,OAAO,IAAA,CAAK,aAAA,KAAkB,QAAA,GAAW,KAAK,aAAA,GAAgB,EAAA;AAChE,IAAA,OAAO,4BAAA,CAA6B,IAAI,CAAA,CAAE,QAAA,CAAS,gBAAgB,CAAA;AAAA,EACrE,CAAC,CAAA,CACA,IAAA;AAAA,IAAK,CAAC,GAAQ,CAAA,KACb,MAAA,CAAO,EAAE,KAAA,IAAS,CAAA,CAAE,aAAA,IAAiB,EAAE,CAAA,CAAE,aAAA;AAAA,MACvC,MAAA,CAAO,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,iBAAiB,EAAE;AAAA;AACzC,GACF,CACC,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA;AACxB;AAEA,IAAM,oCAAoCF,CAAAA,CAAE,KAAA;AAAA,EAC1CA,CAAAA,CAAE,QAAQ,YAAY,CAAA;AAAA,EACtBA,CAAAA,CAAE,QAAQ,gBAAgB,CAAA;AAAA,EAC1BA,CAAAA,CAAE,QAAQ,aAAa,CAAA;AAAA,EACvBA,CAAAA,CAAE,QAAQ,cAAc,CAAA;AAAA,EACxBA,CAAAA,CAAE,QAAQ,UAAU;AACtB,CAAA;AAUO,IAAM,wBAAwB,KAAA,CAAM;AAAA,EACzC,IAAA,EAAM;AAAA,IACJ,OAAA,EAASA,CAAAA,CAAE,QAAA,CAASA,CAAAA,CAAE,QAAQ,CAAA;AAAA,IAC9B,cAAA,EAAgBA,CAAAA,CAAE,QAAA,CAASA,CAAAA,CAAE,QAAQ,CAAA;AAAA,IACrC,QAAA,EAAUA,CAAAA,CAAE,QAAA,CAASA,CAAAA,CAAE,QAAQ,CAAA;AAAA,IAC/B,UAAA,EAAYA,CAAAA,CAAE,QAAA,CAASA,CAAAA,CAAE,QAAQ,CAAA;AAAA,IACjC,eAAA,EAAiBA,CAAAA,CAAE,QAAA,CAASA,CAAAA,CAAE,SAAS,CAAA;AAAA,IACvC,KAAA,EAAOA,CAAAA,CAAE,QAAA,CAASA,CAAAA,CAAE,QAAQ;AAAA,GAC9B;AAAA,EACA,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,OAAO,GAAA,EAAK,IAAA,KAAS;AAC5B,IAAA,MAAM,KAAA,GAAQ,MAAM,2BAAA,CAA4B,GAAA,EAAK;AAAA,MACnD,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,WAAW,IAAA,CAAK;AAAA,KACjB,CAAA;AAED,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,KAAA,IAAS,GAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AACtE,IAAA,OAAO,8BAA8B,GAAA,EAAK;AAAA,MACxC,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,iBAAiB,IAAA,CAAK,eAAA;AAAA,MACtB;AAAA,KACD,CAAA;AAAA,EACH;AACF,CAAC;AAeM,IAAM,eAAe,QAAA,CAAS;AAAA,EACnC,IAAA,EAAM;AAAA,IACJ,QAAA,EAAUA,EAAE,MAAA,EAAO;AAAA;AAAA,IACnB,aAAA,EAAeA,EAAE,MAAA,EAAO;AAAA;AAAA,IACxB,QAAA,EAAUA,CAAAA,CAAE,QAAA,CAASA,CAAAA,CAAE,KAAK,CAAA;AAAA;AAAA,IAC5B,OAAA,EAASA,CAAAA,CAAE,QAAA,CAASA,CAAAA,CAAE,QAAQ,CAAA;AAAA;AAAA,IAC9B,GAAG;AAAA,GACL;AAAA,EACA,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,OAAO,GAAA,EAAK,IAAA,KAAS;AAC5B,IAAA,MAAM,mBAAA,GAAsB,MAAM,0BAAA,CAA2B,GAAG,CAAA;AAChE,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,aAAA,CAAc,IAAA,EAAK;AAE9C,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,4BAAA,CAA6B;AAAA,QAC3B,OAAA,EAAS,4BAAA;AAAA,QACT,MAAA,EAAQ,GAAA;AAAA,QACR,IAAA,EAAM,iBAAA;AAAA,QACN,aAAA,EAAe;AAAA,OAChB,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,CAAC,qBAAA,CAAsB,IAAA,CAAK,QAAQ,CAAA,EAAG;AACzC,MAAA,4BAAA,CAA6B;AAAA,QAC3B,OAAA,EAAS,CAAA,CAAA,EAAI,IAAA,CAAK,QAAQ,CAAA,qFAAA,CAAA;AAAA,QAC1B,MAAA,EAAQ,GAAA;AAAA,QACR,IAAA,EAAM,mBAAA;AAAA,QACN,aAAA,EAAe,mBAAA;AAAA,QACf,UAAA,EAAY,CAAA,oBAAA,EAAuB,sBAAA,CAAuB,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,OACrE,CAAA;AAAA,IACH;AAGA,IAAA,MAAM,KAAA,GAAQ,MAAM,2BAAA,CAA4B,GAAA,EAAK;AAAA,MACnD,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,WAAW,IAAA,CAAK;AAAA,KACjB,CAAA;AACD,IAAA,IAAI,MAAM,SAAA,EAAW;AACnB,MAAA,MAAM,yBAAA;AAAA,QACJ,GAAA;AAAA,QACA,KAAA,CAAM,SAAA;AAAA,QACN;AAAA,OACF;AAAA,IACF;AAKA,IAAA,IAAI,MAAM,OAAA,EAAS;AACjB,MAAA,MAAM,qBAAqB,MAAM,0BAAA;AAAA,QAC/B,GAAA;AAAA,QACA,KAAA,CAAM,OAAA;AAAA,QACN,IAAA,CAAK;AAAA,OACP;AACA,MAAA,IAAI,CAAC,mBAAmB,KAAA,EAAO;AAC7B,QAAA,4BAAA,CAA6B;AAAA,UAC3B,OAAA,EAAS,CAAA,4BAAA,EAA+B,kBAAA,CAAmB,KAAK,CAAA,CAAA;AAAA,UAChE,MAAA,EAAQ,GAAA;AAAA,UACR,IAAA,EAAM,2BAAA;AAAA,UACN,aAAA,EAAe,4BAAA;AAAA,UACf,UAAA,EACE,yHAAA;AAAA,UACF,SAAS,EAAE,QAAA,EAAU,KAAK,QAAA,EAAU,OAAA,EAAS,MAAM,OAAA;AAAQ,SAC5D,CAAA;AAAA,MACH;AAAA,IACF;AAGA,IAAA,MAAM,QAAA,GAAY,IAAA,CAAK,QAAA,IAAwC,EAAC;AAChE,IAAA,MAAM,aAAa,MAAM,sBAAA;AAAA,MACvB,GAAA;AAAA,MACA,IAAA,CAAK,QAAA;AAAA,MACL,QAAA;AAAA,MACA,KAAA,CAAM;AAAA,KACR;AACA,IAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,MAAA,4BAAA,CAA6B;AAAA,QAC3B,SAAS,CAAA,mCAAA,EAAsC,UAAA,CAAW,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,QAC3E,MAAA,EAAQ,GAAA;AAAA,QACR,IAAA,EAAM,kBAAA;AAAA,QACN,aAAA,EAAe,wBAAA;AAAA,QACf,UAAA,EACE,uEAAA;AAAA,QACF,OAAA,EAAS,EAAE,MAAA,EAAQ,UAAA,CAAW,MAAA;AAAO,OACtC,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,2BAAA,CAA4B,GAAA,EAAK;AAAA,MACtD,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,aAAA;AAAA,MACA,UAAU,KAAA,CAAM;AAAA,KACjB,CAAA;AACD,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,OAAO;AAAA,QACL,QAAQ,QAAA,CAAS,GAAA;AAAA,QACjB,UAAU,QAAA,CAAS,QAAA;AAAA,QACnB,WAAA,EAAa;AAAA,OACf;AAAA,IACF;AAGA,IAAA,MAAM,iBAAiB,gBAAA,EAAiB;AACxC,IAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,EAAA,CAAG,OAAO,gBAAA,EAAkB;AAAA,MACnD,QAAA,EAAU,cAAA;AAAA,MACV,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,cAAA,EAAgB,aAAA;AAAA,MAChB,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,aAAA;AAAA,MACA,WAAA,EAAa,mBAAA,CAAoB,IAAA,CAAK,QAAA,EAAU,aAAa,CAAA;AAAA,MAC7D,KAAA,EAAO,iBAAiB,aAAa,CAAA;AAAA,MACrC,QAAA,EAAU;AAAA,QACR,GAAG,QAAA;AAAA,QACH,GAAI,KAAK,OAAA,GAAU,EAAE,SAAS,IAAA,CAAK,OAAA,KAAY,EAAC;AAAA,QAChD,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,UAAA,EAAY,OAAA;AAAA,MACZ,kBAAA,EAAoB,YAAA;AAAA,MACpB,MAAA,EAAQ,QAAA;AAAA,MACR,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,SAAA,EAAW,mBAAA;AAAA,MACX,SAAA,EAAW,GAAA;AAAA,MACX,SAAA,EAAW;AAAA,KACZ,CAAA;AAGD,IAAA,MAAM,IAAI,SAAA,CAAU,QAAA,CAAS,CAAA,EAAG,QAAA,CAAS,UAAU,eAAA,EAAiB;AAAA,MAClE,MAAA;AAAA,MACA,SAAA,EAAW;AAAA,KACZ,CAAA;AAGD,IAAA,MAAM,GAAA,CAAI,EAAA,CAAG,MAAA,CAAO,gBAAA,EAAkB;AAAA,MACpC,UAAA,EAAY,QAAA;AAAA,MACZ,QAAA,EAAU,MAAA;AAAA,MACV,UAAA,EAAY,SAAA;AAAA,MACZ,SAAA,EAAW,GAAA;AAAA,MACX,SAAA,EAAW,mBAAA;AAAA,MACX,OAAA,EAAS,KAAA;AAAA,MACT,aAAA,EAAe,IAAA;AAAA,MACf,QAAA,EAAU;AAAA,QACR,aAAA;AAAA,QACA,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,WAAA,EAAa;AAAA,OACf;AAAA,MACA,WAAW,KAAA,CAAM;AAAA,KAClB,CAAA;AAED,IAAA,OAAO,EAAE,MAAA,EAAQ,QAAA,EAAU,cAAA,EAAgB,aAAa,KAAA,EAAM;AAAA,EAChE;AACF,CAAC;AAUM,IAAM,yBAAyB,QAAA,CAAS;AAAA,EAC7C,IAAA,EAAM;AAAA,IACJ,MAAA,EAAQA,CAAAA,CAAE,EAAA,CAAG,gBAAgB,CAAA;AAAA,IAC7B,aAAA,EAAeA,CAAAA,CAAE,QAAA,CAASA,CAAAA,CAAE,QAAQ,CAAA;AAAA,IACpC,KAAA,EAAOA,CAAAA,CAAE,QAAA,CAASA,CAAAA,CAAE,QAAQ,CAAA;AAAA,IAC5B,QAAA,EAAUA,CAAAA,CAAE,QAAA,CAASA,CAAAA,CAAE,KAAK,CAAA;AAAA;AAAA,IAC5B,OAAA,EAASA,CAAAA,CAAE,QAAA,CAASA,CAAAA,CAAE,QAAQ,CAAA;AAAA,IAC9B,MAAA,EAAQA,CAAAA,CAAE,QAAA,CAASA,CAAAA,CAAE,QAAQ,CAAA;AAAA,IAC7B,IAAA,EAAMA,EAAE,QAAA,CAASA,CAAAA,CAAE,MAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAC,CAAA;AAAA,IACpC,kBAAA,EAAoBA,CAAAA,CAAE,QAAA,CAAS,iCAAiC,CAAA;AAAA,IAChE,aAAaA,CAAAA,CAAE,QAAA;AAAA,MACbA,EAAE,MAAA,CAAO;AAAA,QACP,UAAA,EAAYA,CAAAA,CAAE,QAAA,CAASA,CAAAA,CAAE,QAAQ,CAAA;AAAA,QACjC,QAAA,EAAUA,CAAAA,CAAE,QAAA,CAASA,CAAAA,CAAE,QAAQ,CAAA;AAAA,QAC/B,SAAA,EAAWA,CAAAA,CAAE,QAAA,CAASA,CAAAA,CAAE,QAAQ,CAAA;AAAA,QAChC,OAAA,EAASA,CAAAA,CAAE,QAAA,CAASA,CAAAA,CAAE,QAAQ,CAAA;AAAA,QAC9B,OAAA,EAASA,CAAAA,CAAE,QAAA,CAASA,CAAAA,CAAE,QAAQ;AAAA,OAC/B;AAAA;AACH,GACF;AAAA,EACA,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,OAAO,GAAA,EAAK,IAAA,KAAS;AAC5B,IAAA,MAAM,mBAAA,GAAsB,MAAM,0BAAA,CAA2B,GAAG,CAAA;AAChE,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,IAAA,MAAM,OAAO,MAAM,GAAA,CAAI,EAAA,CAAG,GAAA,CAAI,KAAK,MAAM,CAAA;AACzC,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,4BAAA,CAA6B;AAAA,QAC3B,OAAA,EAAS,mBAAA;AAAA,QACT,MAAA,EAAQ,GAAA;AAAA,QACR,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,EAAS,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAA;AAAO,OAChC,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,CAAC,qBAAA,CAAsB,IAAA,CAAK,QAAQ,CAAA,EAAG;AACzC,MAAA,4BAAA,CAA6B;AAAA,QAC3B,SAAS,CAAA,MAAA,EAAS,IAAA,CAAK,MAAM,CAAA,OAAA,EAAU,KAAK,QAAQ,CAAA,8DAAA,CAAA;AAAA,QACpD,MAAA,EAAQ,GAAA;AAAA,QACR,IAAA,EAAM,qBAAA;AAAA,QACN,aAAA,EAAe,mBAAA;AAAA,QACf,UAAA,EACE;AAAA,OACH,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,cAAA,GACJ,OAAO,IAAA,CAAK,SAAA,KAAc,QAAA,IAAY,IAAA,CAAK,SAAA,CAAU,IAAA,EAAK,CAAE,MAAA,GAAS,CAAA,GACjE,IAAA,CAAK,SAAA,GACL,MAAA;AACN,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,MAAM,yBAAA,CAA0B,GAAA,EAAK,cAAA,EAAgB,mBAAmB,CAAA;AAAA,IAC1E;AAGA,IAAA,MAAM,gBAAA,GAAoB,IAAA,CAAK,QAAA,IAAwC,EAAC;AACxE,IAAA,MAAM,iBAAA,GACJ,KAAK,QAAA,KAAa,MAAA,GACZ,KAAK,QAAA,IAAwC,KAC/C,EAAC;AACP,IAAA,MAAM,cAAA,GAAiB,EAAE,GAAG,gBAAA,EAAkB,GAAG,iBAAA,EAAkB;AACnE,IAAA,IAAI,IAAA,CAAK,YAAY,MAAA,EAAW;AAC9B,MAAA,cAAA,CAAe,UAAU,IAAA,CAAK,OAAA;AAAA,IAChC;AAEA,IAAA,IAAI,IAAA,CAAK,kBAAkB,MAAA,IAAa,IAAA,CAAK,cAAc,IAAA,EAAK,CAAE,WAAW,CAAA,EAAG;AAC9E,MAAA,4BAAA,CAA6B;AAAA,QAC3B,OAAA,EAAS,gCAAA;AAAA,QACT,MAAA,EAAQ,GAAA;AAAA,QACR,IAAA,EAAM,iBAAA;AAAA,QACN,aAAA,EAAe;AAAA,OAChB,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,iBAAA,GACJ,OAAO,IAAA,CAAK,aAAA,KAAkB,YAAY,IAAA,CAAK,aAAA,CAAc,IAAA,EAAK,CAAE,SAAS,CAAA,GACzE,IAAA,CAAK,aAAA,CAAc,IAAA,KACnB,IAAA,CAAK,aAAA;AAEX,IAAA,IAAI,IAAA,CAAK,kBAAkB,MAAA,EAAW;AACpC,MAAA,MAAM,SAAA,GAAY,MAAM,2BAAA,CAA4B,GAAA,EAAK;AAAA,QACvD,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,aAAA,EAAe,iBAAA;AAAA,QACf,UAAU,OAAO,IAAA,CAAK,QAAA,KAAa,QAAA,GAAW,KAAK,QAAA,GAAW;AAAA,OAC/D,CAAA;AACD,MAAA,IAAI,SAAA,IAAa,OAAO,SAAA,CAAU,GAAG,MAAM,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAG;AAC9D,QAAA,4BAAA,CAA6B;AAAA,UAC3B,OAAA,EACE,uEAAA;AAAA,UACF,MAAA,EAAQ,GAAA;AAAA,UACR,IAAA,EAAM,UAAA;AAAA,UACN,aAAA,EAAe,yCAAA;AAAA,UACf,UAAA,EACE,6FAAA;AAAA,UACF,OAAA,EAAS;AAAA,YACP,QAAQ,IAAA,CAAK,MAAA;AAAA,YACb,iBAAiB,SAAA,CAAU,GAAA;AAAA,YAC3B,aAAA,EAAe;AAAA;AACjB,SACD,CAAA;AAAA,MACH;AAAA,IACF;AAGA,IAAA,MAAM,aAAa,MAAM,sBAAA;AAAA,MACvB,GAAA;AAAA,MACA,IAAA,CAAK,QAAA;AAAA,MACL,cAAA;AAAA,MACA,OAAO,IAAA,CAAK,QAAA,KAAa,QAAA,GAAW,KAAK,QAAA,GAAW;AAAA,KACtD;AACA,IAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,MAAA,4BAAA,CAA6B;AAAA,QAC3B,SAAS,CAAA,mCAAA,EAAsC,UAAA,CAAW,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,QAC3E,MAAA,EAAQ,GAAA;AAAA,QACR,IAAA,EAAM,kBAAA;AAAA,QACN,aAAA,EAAe,wBAAA;AAAA,QACf,OAAA,EAAS,EAAE,MAAA,EAAQ,UAAA,CAAW,MAAA;AAAO,OACtC,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,OAAA,GAAmC;AAAA,MACvC,QAAA,EAAU,cAAA;AAAA,MACV,SAAA,EAAW;AAAA,KACb;AAEA,IAAA,IAAI,IAAA,CAAK,kBAAkB,MAAA,EAAW;AACpC,MAAA,OAAA,CAAQ,aAAA,GAAgB,iBAAA;AACxB,MAAA,OAAA,CAAQ,WAAA,GAAc,mBAAA,CAAoB,IAAA,CAAK,QAAA,EAAU,iBAAiB,CAAA;AAC1E,MAAA,OAAA,CAAQ,QACN,IAAA,CAAK,KAAA,KAAU,SAAY,IAAA,CAAK,KAAA,GAAQ,iBAAiB,iBAAiB,CAAA;AAAA,IAC9E,CAAA,MAAA,IAAW,IAAA,CAAK,KAAA,KAAU,MAAA,EAAW;AACnC,MAAA,OAAA,CAAQ,QAAQ,IAAA,CAAK,KAAA;AAAA,IACvB;AAEA,IAAA,IAAI,IAAA,CAAK,YAAY,MAAA,EAAW;AAC9B,MAAA,OAAA,CAAQ,UAAU,IAAA,CAAK,OAAA;AAAA,IACzB;AACA,IAAA,IAAI,IAAA,CAAK,WAAW,MAAA,EAAW;AAC7B,MAAA,OAAA,CAAQ,SAAS,IAAA,CAAK,MAAA;AAAA,IACxB;AACA,IAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAW;AAC3B,MAAA,OAAA,CAAQ,OAAO,IAAA,CAAK,IAAA;AAAA,IACtB;AACA,IAAA,IAAI,IAAA,CAAK,uBAAuB,MAAA,EAAW;AACzC,MAAA,OAAA,CAAQ,qBAAqB,IAAA,CAAK,kBAAA;AAAA,IACpC;AACA,IAAA,IAAI,IAAA,CAAK,gBAAgB,MAAA,EAAW;AAClC,MAAA,OAAA,CAAQ,cAAc,IAAA,CAAK,WAAA;AAAA,IAC7B;AAGA,IAAA,MAAM,GAAA,CAAI,EAAA,CAAG,KAAA,CAAM,IAAA,CAAK,QAAQ,OAAO,CAAA;AAGvC,IAAA,MAAM,IAAI,SAAA,CAAU,QAAA,CAAS,CAAA,EAAG,QAAA,CAAS,UAAU,eAAA,EAAiB;AAAA,MAClE,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,SAAA,EAAW;AAAA,KACZ,CAAA;AAGD,IAAA,MAAM,GAAA,CAAI,EAAA,CAAG,MAAA,CAAO,gBAAA,EAAkB;AAAA,MACpC,UAAA,EAAY,QAAA;AAAA,MACZ,UAAU,IAAA,CAAK,MAAA;AAAA,MACf,UAAA,EAAY,2BAAA;AAAA,MACZ,SAAA,EAAW,GAAA;AAAA,MACX,SAAA,EAAW,mBAAA;AAAA,MACX,OAAA,EAAS,KAAA;AAAA,MACT,aAAA,EAAe;AAAA,QACb,eAAe,IAAA,CAAK,aAAA;AAAA,QACpB,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,oBAAoB,IAAA,CAAK,kBAAA;AAAA,QACzB,aAAa,IAAA,CAAK,WAAA;AAAA,QAClB,QAAA,EAAU;AAAA,OACZ;AAAA,MACA,QAAA,EAAU,OAAA;AAAA,MACV,SAAA,EAAW;AAAA,KACZ,CAAA;AAED,IAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,SAAS,IAAA,EAAK;AAAA,EAC9C;AACF,CAAC;AAeM,IAAM,gBAAgB,QAAA,CAAS;AAAA,EACpC,IAAA,EAAM;AAAA,IACJ,eAAA,EAAiBA,CAAAA,CAAE,EAAA,CAAG,gBAAgB,CAAA;AAAA,IACtC,eAAA,EAAiBA,CAAAA,CAAE,EAAA,CAAG,gBAAgB;AAAA,GACxC;AAAA,EACA,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,OAAO,GAAA,EAAK,IAAA,KAAS;AAC5B,IAAA,MAAM,mBAAA,GAAsB,MAAM,0BAAA,CAA2B,GAAG,CAAA;AAChE,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,IAAA,MAAM,YAAY,MAAM,GAAA,CAAI,EAAA,CAAG,GAAA,CAAI,KAAK,eAAe,CAAA;AACvD,IAAA,MAAM,YAAY,MAAM,GAAA,CAAI,EAAA,CAAG,GAAA,CAAI,KAAK,eAAe,CAAA;AAEvD,IAAA,IAAI,CAAC,SAAA,IAAa,CAAC,SAAA,EAAW;AAC5B,MAAA,4BAAA,CAA6B;AAAA,QAC3B,OAAA,EAAS,qCAAA;AAAA,QACT,MAAA,EAAQ,GAAA;AAAA,QACR,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,EAAS;AAAA,UACP,iBAAiB,IAAA,CAAK,eAAA;AAAA,UACtB,iBAAiB,IAAA,CAAK;AAAA;AACxB,OACD,CAAA;AAAA,IACH;AAEA,IAAA,IACE,CAAC,sBAAsB,SAAA,CAAU,QAAQ,KACzC,CAAC,qBAAA,CAAsB,SAAA,CAAU,QAAQ,CAAA,EACzC;AACA,MAAA,4BAAA,CAA6B;AAAA,QAC3B,OAAA,EAAS,mDAAA;AAAA,QACT,MAAA,EAAQ,GAAA;AAAA,QACR,IAAA,EAAM,qBAAA;AAAA,QACN,aAAA,EAAe;AAAA,OAChB,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,IAAA,CAAK,eAAA,KAAoB,IAAA,CAAK,eAAA,EAAiB;AACjD,MAAA,4BAAA,CAA6B;AAAA,QAC3B,OAAA,EAAS,qCAAA;AAAA,QACT,MAAA,EAAQ,GAAA;AAAA,QACR,IAAA,EAAM,YAAA;AAAA,QACN,aAAA,EAAe,sBAAA;AAAA,QACf,UAAA,EAAY,4CAAA;AAAA,QACZ,OAAA,EAAS,EAAE,eAAA,EAAiB,IAAA,CAAK,eAAA;AAAgB,OAClD,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,SAAA,CAAU,QAAA,KAAa,SAAA,CAAU,QAAA,EAAU;AAC7C,MAAA,4BAAA,CAA6B;AAAA,QAC3B,SAAS,CAAA,qCAAA,EAAwC,SAAA,CAAU,QAAQ,CAAA,IAAA,EAAO,UAAU,QAAQ,CAAA,CAAA,CAAA;AAAA,QAC5F,MAAA,EAAQ,GAAA;AAAA,QACR,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,UAAU,SAAA,EAAW;AACvB,MAAA,MAAM,yBAAA;AAAA,QACJ,GAAA;AAAA,QACA,SAAA,CAAU,SAAA;AAAA,QACV;AAAA,OACF;AAAA,IACF;AAGA,IAAA,MAAM,eAAe,gBAAA,EAAiB;AACtC,IAAA,MAAM,GAAA,CAAI,EAAA,CAAG,MAAA,CAAO,gBAAA,EAAkB;AAAA,MACpC,QAAA,EAAU,YAAA;AAAA,MACV,YAAY,IAAA,CAAK,eAAA;AAAA,MACjB,UAAU,IAAA,CAAK,eAAA;AAAA,MACf,gBAAgB,SAAA,CAAU,QAAA;AAAA,MAC1B,gBAAgB,SAAA,CAAU,QAAA;AAAA,MAC1B,QAAA,EAAU,cAAA;AAAA,MACV,MAAA,EAAQ,CAAA;AAAA,MACR,SAAS,CAAA,cAAA,EAAiB,SAAA,CAAU,aAAa,CAAA,QAAA,EAAM,UAAU,aAAa,CAAA,CAAA;AAAA,MAC9E,SAAA,EAAW,mBAAA;AAAA,MACX,SAAA,EAAW,GAAA;AAAA,MACX,SAAA,EAAW;AAAA,KACZ,CAAA;AAID,IAAA,MAAM,gBAAgB,MAAM,GAAA,CAAI,EAAA,CAC7B,KAAA,CAAM,gBAAgB,CAAA,CACtB,SAAA;AAAA,MAAU,SAAA;AAAA,MAAW,CAAC,CAAA,KACrB,CAAA,CAAE,EAAA,CAAG,YAAA,EAAc,KAAK,eAAe;AAAA,MAExC,OAAA,EAAQ;AAEX,IAAA,KAAA,MAAW,QAAQ,aAAA,EAAe;AAChC,MAAA,IAAI,IAAA,CAAK,QAAA,KAAa,IAAA,CAAK,eAAA,EAAiB;AAC1C,QAAA;AAAA,MACF;AACA,MAAA,MAAM,GAAA,CAAI,EAAA,CAAG,KAAA,CAAM,IAAA,CAAK,GAAA,EAAK;AAAA,QAC3B,YAAY,IAAA,CAAK,eAAA;AAAA,QACjB,gBAAgB,SAAA,CAAU,QAAA;AAAA,QAC1B,SAAA,EAAW;AAAA,OACZ,CAAA;AAAA,IACH;AAGA,IAAA,MAAM,gBAAgB,MAAM,GAAA,CAAI,GAC7B,KAAA,CAAM,gBAAgB,EACtB,SAAA,CAAU,OAAA,EAAS,CAAC,CAAA,KAAW,EAAE,EAAA,CAAG,UAAA,EAAY,KAAK,eAAe,CAAC,EACrE,OAAA,EAAQ;AAEX,IAAA,KAAA,MAAW,QAAQ,aAAA,EAAe;AAChC,MAAA,IAAI,IAAA,CAAK,UAAA,KAAe,IAAA,CAAK,eAAA,EAAiB;AAC5C,QAAA;AAAA,MACF;AACA,MAAA,MAAM,GAAA,CAAI,EAAA,CAAG,KAAA,CAAM,IAAA,CAAK,GAAA,EAAK;AAAA,QAC3B,UAAU,IAAA,CAAK,eAAA;AAAA,QACf,gBAAgB,SAAA,CAAU,QAAA;AAAA,QAC1B,SAAA,EAAW;AAAA,OACZ,CAAA;AAAA,IACH;AAGA,IAAA,MAAM,iBAAA,GACH,SAAA,CAAU,QAAA,IAAwC,EAAC;AACtD,IAAA,MAAM,GAAA,CAAI,EAAA,CAAG,KAAA,CAAM,IAAA,CAAK,eAAA,EAAiB;AAAA,MACvC,MAAA,EAAQ,YAAA;AAAA,MACR,QAAA,EAAU;AAAA,QACR,GAAG,iBAAA;AAAA,QACH,MAAA,EAAQ,YAAA;AAAA,QACR,cAAc,IAAA,CAAK,eAAA;AAAA,QACnB,QAAA,EAAU,GAAA;AAAA,QACV,QAAA,EAAU;AAAA,OACZ;AAAA,MACA,SAAA,EAAW;AAAA,KACZ,CAAA;AAGD,IAAA,MAAM,IAAI,SAAA,CAAU,QAAA,CAAS,CAAA,EAAG,QAAA,CAAS,UAAU,eAAA,EAAiB;AAAA,MAClE,QAAQ,IAAA,CAAK,eAAA;AAAA,MACb,SAAA,EAAW;AAAA,KACZ,CAAA;AACD,IAAA,MAAM,IAAI,SAAA,CAAU,QAAA,CAAS,CAAA,EAAG,QAAA,CAAS,UAAU,eAAA,EAAiB;AAAA,MAClE,QAAQ,IAAA,CAAK,eAAA;AAAA,MACb,SAAA,EAAW;AAAA,KACZ,CAAA;AAGD,IAAA,MAAM,GAAA,CAAI,EAAA,CAAG,MAAA,CAAO,gBAAA,EAAkB;AAAA,MACpC,UAAA,EAAY,QAAA;AAAA,MACZ,UAAU,IAAA,CAAK,eAAA;AAAA,MACf,UAAA,EAAY,eAAA;AAAA,MACZ,SAAA,EAAW,GAAA;AAAA,MACX,SAAA,EAAW,mBAAA;AAAA,MACX,OAAA,EAAS,KAAA;AAAA,MACT,SAAA,EAAW,CAAA,uBAAA,EAA0B,IAAA,CAAK,eAAe,CAAA,EAAA,EAAK,SAAA,CAAU,aAAa,CAAA,GAAA,EAAM,aAAA,CAAc,MAAA,GAAS,aAAA,CAAc,MAAM,CAAA,kBAAA,CAAA;AAAA,MACtI,aAAA,EAAe,IAAA;AAAA,MACf,QAAA,EAAU;AAAA,QACR,UAAU,SAAA,CAAU,QAAA;AAAA,QACpB,eAAe,SAAA,CAAU;AAAA,OAC3B;AAAA,MACA,WAAW,SAAA,CAAU;AAAA,KACtB,CAAA;AAGD,IAAA,MAAM,oBAAoB,aAAA,CAAc,MAAA;AAAA,MACtC,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,KAAa,IAAA,CAAK;AAAA,KAC7B,CAAE,MAAA;AACF,IAAA,MAAM,oBAAoB,aAAA,CAAc,MAAA;AAAA,MACtC,CAAC,CAAA,KAAM,CAAA,CAAE,UAAA,KAAe,IAAA,CAAK;AAAA,KAC/B,CAAE,MAAA;AAKF,IAAA,MAAM,IAAI,SAAA,CAAU,QAAA;AAAA,MAClB,CAAA;AAAA,MACA,SAAS,SAAA,CAAU,yBAAA;AAAA,MACnB;AAAA,QACE,cAAc,IAAA,CAAK,eAAA;AAAA,QACnB,mBAAmB,CAAA,uBAAA,EAA0B,SAAA,CAAU,aAAa,CAAA,GAAA,EAAM,oBAAoB,iBAAiB,CAAA,kBAAA,CAAA;AAAA,QAC/G,MAAA,EAAQ;AAAA;AACV,KACF;AAEA,IAAA,OAAO;AAAA,MACL,iBAAiB,IAAA,CAAK,eAAA;AAAA,MACtB,iBAAiB,IAAA,CAAK,eAAA;AAAA,MACtB,gBAAgB,iBAAA,GAAoB;AAAA,KACtC;AAAA,EACF;AACF,CAAC;AAUM,IAAM,gBAAgB,QAAA,CAAS;AAAA,EACpC,IAAA,EAAM;AAAA,IACJ,MAAA,EAAQA,CAAAA,CAAE,EAAA,CAAG,gBAAgB;AAAA,GAC/B;AAAA,EACA,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,OAAO,GAAA,EAAK,IAAA,KAAS;AAC5B,IAAA,MAAM,mBAAA,GAAsB,MAAM,0BAAA,CAA2B,GAAG,CAAA;AAChE,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,IAAA,MAAM,OAAO,MAAM,GAAA,CAAI,EAAA,CAAG,GAAA,CAAI,KAAK,MAAM,CAAA;AACzC,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,4BAAA,CAA6B;AAAA,QAC3B,OAAA,EAAS,mBAAA;AAAA,QACT,MAAA,EAAQ,GAAA;AAAA,QACR,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,EAAS,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAA;AAAO,OAChC,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,CAAC,qBAAA,CAAsB,IAAA,CAAK,QAAQ,CAAA,EAAG;AACzC,MAAA,4BAAA,CAA6B;AAAA,QAC3B,SAAS,CAAA,MAAA,EAAS,IAAA,CAAK,MAAM,CAAA,OAAA,EAAU,KAAK,QAAQ,CAAA,6DAAA,CAAA;AAAA,QACpD,MAAA,EAAQ,GAAA;AAAA,QACR,IAAA,EAAM,qBAAA;AAAA,QACN,aAAA,EAAe;AAAA,OAChB,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,MAAM,yBAAA;AAAA,QACJ,GAAA;AAAA,QACA,IAAA,CAAK,SAAA;AAAA,QACL;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,CAAI,EAAA,CAAG,KAAA,CAAM,IAAA,CAAK,MAAA,EAAQ;AAAA,MAC9B,MAAA,EAAQ,UAAA;AAAA,MACR,SAAA,EAAW;AAAA,KACZ,CAAA;AAGD,IAAA,MAAM,IAAI,SAAA,CAAU,QAAA,CAAS,CAAA,EAAG,QAAA,CAAS,UAAU,eAAA,EAAiB;AAAA,MAClE,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,SAAA,EAAW;AAAA,KACZ,CAAA;AAGD,IAAA,MAAM,GAAA,CAAI,EAAA,CAAG,MAAA,CAAO,gBAAA,EAAkB;AAAA,MACpC,UAAA,EAAY,QAAA;AAAA,MACZ,UAAU,IAAA,CAAK,MAAA;AAAA,MACf,UAAA,EAAY,iBAAA;AAAA,MACZ,SAAA,EAAW,GAAA;AAAA,MACX,SAAA,EAAW,mBAAA;AAAA,MACX,OAAA,EAAS,KAAA;AAAA,MACT,aAAA,EAAe,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAO;AAAA,MACrC,QAAA,EAAU,EAAE,MAAA,EAAQ,UAAA,EAAW;AAAA,MAC/B,WAAW,IAAA,CAAK;AAAA,KACjB,CAAA;AAID,IAAA,MAAM,IAAI,SAAA,CAAU,QAAA;AAAA,MAClB,CAAA;AAAA,MACA,SAAS,SAAA,CAAU,yBAAA;AAAA,MACnB;AAAA,QACE,cAAc,IAAA,CAAK,MAAA;AAAA,QACnB,iBAAA,EAAmB,CAAA,QAAA,EAAW,IAAA,CAAK,aAAa,CAAA,eAAA,CAAA;AAAA,QAChD,MAAA,EAAQ;AAAA;AACV,KACF;AAEA,IAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,EAC/C;AACF,CAAC","file":"entityLifecycle.js","sourcesContent":["import {\n actionGeneric,\n anyApi,\n componentsGeneric,\n httpActionGeneric,\n internalActionGeneric,\n internalMutationGeneric,\n internalQueryGeneric,\n mutationGeneric,\n queryGeneric,\n} from \"convex/server\";\nimport type { GenericId } from \"convex/values\";\n\nexport const api = anyApi as any;\nexport const components = componentsGeneric() as any;\nexport const internal = anyApi as any;\n\nexport type TableNames = string;\nexport type Id<TableName extends TableNames = string> = GenericId<TableName>;\nexport type Doc<TableName extends TableNames = string> = any;\nexport type DataModel = any;\nexport type ActionCtx = any;\nexport type DatabaseReader = any;\nexport type DatabaseWriter = any;\nexport type MutationCtx = any;\nexport type QueryCtx = any;\n\nexport const action = actionGeneric as any;\nexport const httpAction = httpActionGeneric as any;\nexport const internalAction = internalActionGeneric as any;\nexport const internalMutation = internalMutationGeneric as any;\nexport const internalQuery = internalQueryGeneric as any;\nexport const mutation = mutationGeneric as any;\nexport const query = queryGeneric as any;\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\n// =============================================================================\n// TYPES\n// =============================================================================\n\ntype FieldSchema = {\n type: \"string\" | \"number\" | \"boolean\";\n required: boolean;\n};\n\ntype EntitySchema = Record<string, FieldSchema>;\n\ntype ValidationResult = {\n valid: boolean;\n errors: string[];\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 tenantEntry = await (ctx.db as any)\n .query(\"schemaEnumConfig\")\n .withIndex(\"by_tenant_category\", (q: any) =>\n q.eq(\"tenantId\", tenantId).eq(\"category\", \"entity_type\")\n )\n .collect();\n\n const tenantMatch = tenantEntry.find(\n (e: any) => e.value === nodeType && e.status === \"active\"\n );\n if (tenantMatch?.metadata?.schema) {\n return tenantMatch.metadata.schema as EntitySchema;\n }\n }\n\n // Fall back to platform default\n const platformEntry = await (ctx.db as any)\n .query(\"schemaEnumConfig\")\n .withIndex(\"by_category_value\", (q: any) =>\n q.eq(\"category\", \"entity_type\").eq(\"value\", nodeType)\n )\n .first();\n\n if (platformEntry?.metadata?.schema && platformEntry.status === \"active\") {\n return platformEntry.metadata.schema as EntitySchema;\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","/**\n * Shared UUID v4 generator for global IDs.\n *\n * Uses crypto.getRandomValues() for collision-safe generation.\n * Replaces the Math.random()-based UUID pattern that was duplicated\n * across 7+ files.\n *\n * @module convex/lib/globalId\n */\n\n/**\n * Generate a UUID v4 global ID using crypto-safe random bytes.\n */\nexport function generateGlobalId(): string {\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\n // Set version (4) and variant (RFC 4122)\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\")).join(\n \"\"\n );\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\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 { Id } from \"./convex\";\n\n// Minimal topic shape needed for resolution (avoids importing full generated types)\ntype TopicDoc = {\n _id: Id<\"topics\">;\n name: string;\n depth: number;\n ontologyId?: Id<\"ontologyDefinitions\">;\n parentTopicId?: Id<\"topics\">;\n};\n\ntype OntologyDef = {\n _id: Id<\"ontologyDefinitions\">;\n ontologyKey: string;\n name: string;\n tier: \"platform\" | \"pack\" | \"tenant\";\n status: \"draft\" | \"active\" | \"deprecated\" | \"archived\";\n};\n\ntype OntologyVer = {\n _id: Id<\"ontologyVersions\">;\n ontologyId: Id<\"ontologyDefinitions\">;\n version: string;\n status: \"draft\" | \"published\" | \"deprecated\";\n entityTypes: Array<{ value: string; label: string; description?: string }>;\n edgeTypes: Array<{ value: string; label: string; description?: string }>;\n publishedAt?: number;\n};\n\nexport type ResolvedTopicOntology = {\n ontologyId: Id<\"ontologyDefinitions\">;\n ontologyKey: string;\n ontologyName: string;\n tier: string;\n source: \"direct\" | \"inherited\";\n sourceTopicId: Id<\"topics\">;\n /** Valid entity type values from the latest published version */\n validEntityTypes: string[];\n /** Valid edge type values from the latest published version */\n validEdgeTypes: string[];\n /** The published version, if any */\n publishedVersion: OntologyVer | null;\n};\n\nconst MAX_RESOLUTION_DEPTH = 10;\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: { db: any },\n topicId: Id<\"topics\">\n): Promise<ResolvedTopicOntology | null> {\n let current = (await ctx.db.get(topicId)) as TopicDoc | null;\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 if (current.ontologyId) {\n const ontologyDef = (await ctx.db.get(\n current.ontologyId\n )) as OntologyDef | null;\n if (!ontologyDef || ontologyDef.status === \"archived\") {\n // Ontology was archived or deleted — continue walking up\n if (current.parentTopicId) {\n current = (await ctx.db.get(\n current.parentTopicId\n )) as TopicDoc | null;\n continue;\n }\n return null;\n }\n\n // Fetch the latest published version for this ontology\n const versions = (await ctx.db\n .query(\"ontologyVersions\")\n .withIndex(\"by_ontologyId\", (q: any) =>\n q.eq(\"ontologyId\", current?.ontologyId!)\n )\n .collect()) as OntologyVer[];\n\n const published = versions\n .filter((v) => v.status === \"published\")\n .sort((a, b) => (b.publishedAt ?? 0) - (a.publishedAt ?? 0));\n\n const latestPublished = published[0] ?? null;\n\n return {\n ontologyId: ontologyDef._id,\n ontologyKey: ontologyDef.ontologyKey,\n ontologyName: ontologyDef.name,\n tier: ontologyDef.tier,\n source: current._id === startTopicId ? \"direct\" : \"inherited\",\n sourceTopicId: current._id,\n validEntityTypes: latestPublished\n ? latestPublished.entityTypes.map((et) => et.value)\n : [],\n validEdgeTypes: latestPublished\n ? latestPublished.edgeTypes.map((et) => et.value)\n : [],\n publishedVersion: latestPublished,\n };\n }\n\n // No ontologyId on this topic — walk up\n if (!current.parentTopicId) {\n break;\n }\n current = (await ctx.db.get(current.parentTopicId)) as TopicDoc | null;\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: { db: any },\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","import { api } from \"./convex\";\n\ntype OverlayIdMode = \"legacy\" | \"topic\";\nconst LEGACY_SCOPE_FIELD = \"graphScope\" + \"ProjectId\";\n\ntype LegacyProjectThesis = {\n statement: string;\n confidence: number;\n lastUpdated: number;\n};\n\ntype LegacyPillarImportance =\n | \"critical\"\n | \"major\"\n | \"minor\"\n | \"not_applicable\";\n\ntype LegacyThesisPillarConfig = {\n pillarImportance?: Record<string, LegacyPillarImportance | undefined>;\n configuredAt?: number;\n configuredBy?: string;\n aiSuggestion?: {\n suggestedAt: number;\n reasoning: string;\n };\n};\n\ntype LegacyBeliefArchitecture = {\n overallMaturity: number;\n pillarScores: Array<Record<string, unknown>>;\n lastCalculated: number;\n};\n\ntype LegacyOntologyClassification = {\n valueChains: Array<Record<string, unknown>>;\n functions: Array<Record<string, unknown>>;\n overallConfidence: number;\n classifiedAt: number;\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 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 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\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 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 = error instanceof Error ? error.message : String(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\nasync function resolveTopicDoc(\n ctx: any,\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(scopeId as any)) as TopicDocLike | null;\n if (directTopic) {\n return directTopic;\n }\n } catch {\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(api.topics.get as any, {\n id: String(scopeId),\n });\n if (topic?.name !== undefined && topic?.type !== undefined) {\n return topic as TopicDocLike;\n }\n } catch {\n // Fall through to legacy-scope lookup.\n }\n\n try {\n const topic = await ctx.runQuery(api.topics.getByLegacyScopeId as any, {\n projectId: String(scopeId),\n });\n if (topic?.name !== undefined && topic?.type !== undefined) {\n return topic as TopicDocLike;\n }\n } catch {\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 const createdAt =\n typeof topic.createdAt === \"number\"\n ? topic.createdAt\n : typeof topic._creationTime === \"number\"\n ? topic._creationTime\n : 0;\n const updatedAt =\n typeof topic.updatedAt === \"number\"\n ? topic.updatedAt\n : typeof metadata.updatedAt === \"number\"\n ? (metadata.updatedAt as number)\n : createdAt;\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 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\" ? (metadata.chatCount as number) : 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: any,\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: any,\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 {\n allTopics = [];\n }\n }\n\n if (allTopics.length === 0 && typeof ctx.runQuery === \"function\") {\n allTopics =\n (((await ctx.runQuery(api.topics.list as any, {})) ?? []) 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: any,\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 nextMetadata = { ...readMetadata(topic) };\n const patch: Record<string, unknown> = {};\n const topicUpdateArgs: Record<string, unknown> = {\n id: String(topic._id),\n };\n\n for (const [key, rawValue] of Object.entries(value)) {\n switch (key) {\n case \"_id\":\n case \"projectId\":\n case \"topicId\":\n case \"legacyProjectId\":\n case \"storageProjectId\":\n break;\n case \"name\":\n case \"description\":\n patch[key] = rawValue;\n topicUpdateArgs[key] = rawValue;\n break;\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 const status = coerceStatus(rawValue);\n if (status) {\n patch.status = status;\n topicUpdateArgs.status = status;\n }\n break;\n }\n case \"visibility\": {\n const visibility = coerceVisibility(rawValue);\n if (visibility) {\n patch.visibility = visibility;\n topicUpdateArgs.visibility = visibility;\n }\n break;\n }\n case \"type\": {\n const projectType = readNonEmptyString(rawValue);\n if (projectType) {\n nextMetadata.projectType = projectType;\n } else {\n delete nextMetadata.projectType;\n }\n break;\n }\n case \"updatedAt\":\n case \"createdAt\":\n break;\n default:\n if (rawValue === undefined) {\n delete nextMetadata[key];\n } else {\n nextMetadata[key] = rawValue;\n }\n }\n }\n\n patch.updatedAt = Date.now();\n patch.metadata = nextMetadata;\n topicUpdateArgs.metadata = nextMetadata;\n\n if (typeof ctx.runMutation === \"function\") {\n try {\n await ctx.runMutation(api.topics.update as any, topicUpdateArgs);\n } catch (error) {\n if (\n !isMissingLucernChildComponentError(error) ||\n !ctx?.db ||\n typeof ctx.db.patch !== \"function\"\n ) {\n throw error;\n }\n await ctx.db.patch(String(topic._id) as any, patch);\n }\n } else if (ctx?.db && typeof ctx.db.patch === \"function\") {\n await ctx.db.patch(String(topic._id) as any, patch);\n } else {\n throw new Error(\n \"Cannot patch topic without component adapter (ctx.runMutation unavailable)\"\n );\n }\n\n return materializeTopicProjectOverlay(\n {\n ...topic,\n ...patch,\n metadata: nextMetadata,\n } as TopicDocLike\n );\n}\n\nexport function matchesTopicProjectOverlayAccess(\n accessibleProjectIds: Set<string>,\n project: { topicId: string; legacyProjectId?: string; storageProjectId?: string }\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. */\nimport {\n listTopicProjectOverlays,\n patchTopicProjectOverlay,\n resolveTopicProjectOverlay,\n} from \"./topicProjectOverlay\";\nimport type {\n GraphPrimitivesAppResolverContext,\n GraphPrimitivesAppResolvers,\n} from \"./resolverTypes\";\n\nfunction isMissingLucernChildComponentError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error);\n return (\n message.includes('Child component ComponentName(Identifier(\"lucern\")) not found') ||\n (message.includes(\"Child component\") &&\n message.includes(\"lucern\") &&\n message.includes(\"not found\"))\n );\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 !isAdvisoryTopicPatch(value) ||\n !isMissingLucernChildComponentError(error)\n ) {\n throw error;\n }\n\n console.warn(\"[lucern graph-primitives] Non-fatal advisory topic patch failure\", {\n projectId,\n keys: Object.keys(value),\n error: error instanceof Error ? error.message : error,\n });\n }\n}\n\nfunction defaultResolvers(): GraphPrimitivesAppResolvers {\n return {\n async getProject(ctx, projectId) {\n return await resolveTopicProjectOverlay(ctx, projectId, {\n idMode: \"legacy\",\n projectLikeOnly: false,\n });\n },\n async patchProject(ctx, projectId, value) {\n await patchProjectWithTolerance(ctx, projectId, value);\n },\n async listTopics(ctx) {\n return await listTopicProjectOverlays(ctx, {\n idMode: \"legacy\",\n });\n },\n async getFinalArtifact(ctx, artifactId) {\n return await ctx.db.get(artifactId);\n },\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","/** Topic-scope resolution helpers for graph-primitive operations. */\nimport { v } from \"convex/values\";\nimport { api as appApi } from \"./convex\";\nimport type { Id } from \"./convex\";\n\nconst LEGACY_SCOPE_FIELD = \"graphScope\" + \"ProjectId\";\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 type TopicProjectScope = {\n topicId: Id<\"topics\">;\n projectId?: string;\n tenantId?: string;\n workspaceId?: string;\n source: \"topic\" | \"project_mapped_topic\" | \"topic_inferred\";\n};\n\ntype MaterializedTopicNodeDoc = {\n _id: string | Id<\"epistemicNodes\">;\n metadata?: Record<string, unknown>;\n};\n\nfunction asMappedProjectId(\n topic: TopicDoc | null | undefined\n): string | undefined {\n if (!topic) {\n return;\n }\n const directLegacyProjectId = normalizeScopeValue(topic[LEGACY_SCOPE_FIELD]);\n if (directLegacyProjectId) {\n return directLegacyProjectId;\n }\n const metadata = (topic.metadata || {}) as Record<string, unknown>;\n const candidate =\n (metadata[LEGACY_SCOPE_FIELD] as string | undefined) ||\n (metadata.legacyProjectId as string | undefined) ||\n (metadata.projectId as string | undefined) ||\n (metadata.scopeProjectId as string | undefined);\n return candidate ? (candidate as string) : 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(ctx: any, scopeId: string): Promise<TopicDoc[]> {\n try {\n return (await ctx.db\n .query(\"topics\")\n .withIndex(\"by_graph_scope_project\", (q: any) =>\n q.eq(LEGACY_SCOPE_FIELD, scopeId)\n )\n .collect()) as TopicDoc[];\n } catch {\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 ctx.db.query(\"topics\").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: any,\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 as any, {\n id: topicId,\n })) ?? null) as TopicDoc | null;\n } catch {\n return null;\n }\n}\n\nasync function tryResolveHostTopicByLegacyScope(\n ctx: any,\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 as any, {\n projectId: legacyScopeId,\n })) ?? null) as TopicDoc | null;\n } catch {\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: any,\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) break;\n\n if (!tenantId) {\n tenantId = normalizeScopeValue(current.tenantId);\n }\n if (!workspaceId) {\n workspaceId = normalizeScopeValue(current.workspaceId);\n }\n if (tenantId && workspaceId) break;\n }\n\n return { tenantId, workspaceId };\n}\n\nexport async function resolveTopicProjectScope(\n ctx: any,\n args: { topicId?: Id<\"topics\"> | string; projectId?: string }\n): Promise<TopicProjectScope> {\n if (args.topicId) {\n // Try direct lookup, fall back to the legacy mapped-project bridge\n let topic: TopicDoc | null = null;\n try {\n topic = (await ctx.db.get(args.topicId as Id<\"topics\">)) as TopicDoc | null;\n } catch {\n // Not a valid topics table ID\n }\n if (!topic) {\n topic = await tryResolveHostTopicById(ctx, String(args.topicId));\n }\n if (!topic) {\n // Try as legacy projectId / globalId via the mapped-project bridge.\n topic =\n pickPrimaryTopic(\n await findTopicsByScopeAlias(ctx, String(args.topicId))\n ) ?? null;\n }\n if (!topic) {\n throw new Error(`Topic not found: ${String(args.topicId)}`);\n }\n const inherited = await resolveInheritedWorkspaceScope(ctx, topic);\n const mapped = asMappedProjectId(topic);\n if (mapped) {\n return {\n topicId: topic._id,\n projectId: mapped,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"topic\",\n };\n }\n return {\n topicId: topic._id,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"topic\",\n };\n }\n\n if (args.projectId) {\n let directTopic: TopicDoc | null = null;\n try {\n directTopic = (await ctx.db.get(\n args.projectId as Id<\"topics\">\n )) as TopicDoc | null;\n } catch {\n // Not a valid topics table ID, continue to legacy graph-scope lookup.\n }\n\n if (directTopic) {\n const inherited = await resolveInheritedWorkspaceScope(ctx, directTopic);\n const mapped = asMappedProjectId(directTopic);\n return {\n topicId: directTopic._id,\n projectId: mapped ?? args.projectId,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"topic_inferred\",\n };\n }\n\n directTopic = await tryResolveHostTopicByLegacyScope(ctx, args.projectId);\n if (directTopic) {\n const inherited = await resolveInheritedWorkspaceScope(ctx, directTopic);\n const mapped = asMappedProjectId(directTopic);\n return {\n topicId: directTopic._id,\n projectId: mapped ?? args.projectId,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"topic_inferred\",\n };\n }\n\n const topics = await findTopicsByScopeAlias(ctx, args.projectId);\n const primary = pickPrimaryTopic(topics);\n if (primary) {\n const inherited = await resolveInheritedWorkspaceScope(ctx, primary);\n return {\n topicId: primary._id,\n projectId: args.projectId,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"project_mapped_topic\",\n };\n }\n throw new Error(\n `Legacy project scope ${String(args.projectId)} has no mapped topic.`\n );\n }\n\n throw new Error(\n \"Missing scope: provide topicId (preferred) or legacy projectId alias.\"\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","/**\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 { v } from \"convex/values\";\nimport { checkProjectAccess } from \"@lucern/access-control/access\";\nimport { getCurrentUserId } from \"@lucern/access-control/auth\";\nimport { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\nimport { internal, mutation, query } from \"./convex\";\nimport { validateEntityMetadata } from \"./entityValidation\";\nimport { generateGlobalId } from \"./globalId\";\nimport { validateEntityTypeForTopic } from \"./topicOntologyResolver\";\nimport { resolveGraphPrimitivesAppResolvers } from \"./resolvers\";\nimport { optionalScopeArgs, resolveTopicProjectScope } from \"./topicScope\";\n\n// =============================================================================\n// AUTH HELPERS (same pattern as epistemicBeliefs.ts)\n// =============================================================================\n\ntype StructuredMutationError = Error & {\n status: number;\n code: string;\n invariantCode?: string;\n suggestion?: string;\n details?: unknown;\n};\n\nfunction throwStructuredMutationError(args: {\n message: string;\n status: number;\n code: string;\n invariantCode?: string;\n suggestion?: string;\n details?: unknown;\n}): never {\n const error = new Error(args.message) as StructuredMutationError;\n error.status = args.status;\n error.code = args.code;\n error.invariantCode = args.invariantCode;\n error.suggestion = args.suggestion;\n error.details = args.details;\n throw error;\n}\n\nasync function requireAuthenticatedUserId(ctx: {\n auth: { getUserIdentity: () => Promise<unknown> };\n}): Promise<string> {\n const userId = await getCurrentUserId(ctx as any);\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\nasync function requireProjectWriteAccess(\n ctx: { db: unknown },\n projectId: string,\n userId: string\n): Promise<void> {\n const hasAccess = await checkProjectAccess(ctx as any, projectId, userId);\n if (!hasAccess) {\n throwStructuredMutationError({\n message: \"Project access required.\",\n status: 403,\n code: \"FORBIDDEN\",\n invariantCode: \"policy.scope_required\",\n suggestion: \"Request write access for the project and retry.\",\n details: { projectId, userId },\n });\n }\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 hash = (hash << 5) + hash + content.charCodeAt(i);\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;\n\nexport type OntologicalNodeType = (typeof ONTOLOGICAL_NODE_TYPES)[number];\n\nexport function isOntologicalNodeType(\n nodeType: string\n): nodeType is OntologicalNodeType {\n return (ONTOLOGICAL_NODE_TYPES as readonly string[]).includes(nodeType);\n}\n\nfunction normalizeCanonicalEntityText(value: string): string {\n return value.trim().toLowerCase().replace(/\\s+/g, \" \");\n}\n\nfunction buildEntityTitle(canonicalText: string): string {\n return canonicalText.slice(0, 100) + (canonicalText.length > 100 ? \"...\" : \"\");\n}\n\ntype ScopeTopicDoc = {\n _id: string;\n tenantId?: string;\n workspaceId?: string;\n};\n\ntype ScopeProjectDoc = {\n _id: string;\n tenantId?: string;\n workspaceId?: string;\n};\n\ntype CanonicalEntityScope = Awaited<ReturnType<typeof resolveTopicProjectScope>> & {\n tenantId?: string;\n topic: ScopeTopicDoc | null;\n project: ScopeProjectDoc | null;\n};\n\nasync function resolveCanonicalEntityScope(\n ctx: { db: any },\n args: { topicId?: any; projectId?: string }\n): Promise<CanonicalEntityScope> {\n const scope = await resolveTopicProjectScope(ctx, args);\n const topic = scope.topicId\n ? (((await ctx.db.get(scope.topicId)) as ScopeTopicDoc | null) ?? null)\n : null;\n const project =\n scope.projectId !== undefined\n ? ((((await resolveGraphPrimitivesAppResolvers(ctx).getProject(\n ctx as any,\n scope.projectId as any\n )) as ScopeProjectDoc | null) ?? null))\n : null;\n\n const tenantId =\n typeof topic?.tenantId === \"string\" && topic.tenantId.trim().length > 0\n ? topic.tenantId.trim()\n : typeof project?.tenantId === \"string\" &&\n project.tenantId.trim().length > 0\n ? project.tenantId.trim()\n : undefined;\n\n return {\n ...scope,\n tenantId,\n topic,\n project,\n };\n}\n\nfunction matchesCanonicalEntityRecord(\n node: {\n status?: unknown;\n nodeType?: unknown;\n epistemicLayer?: unknown;\n tenantId?: unknown;\n workspaceId?: unknown;\n contentHash?: unknown;\n },\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\nasync function findExistingCanonicalEntity(\n ctx: { db: any },\n args: {\n nodeType: OntologicalNodeType;\n canonicalText: string;\n tenantId?: string;\n }\n) {\n const contentHash = generateContentHash(args.nodeType, args.canonicalText);\n const candidates = await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_contentHash\", (q: any) => q.eq(\"contentHash\", contentHash))\n .collect();\n\n return (\n candidates.find((node: any) =>\n matchesCanonicalEntityRecord(node, {\n nodeType: args.nodeType,\n tenantId: args.tenantId,\n contentHash,\n })\n ) ?? null\n );\n}\n\nasync function listCanonicalEntitiesForScope(\n ctx: { db: any },\n args: {\n tenantId?: string;\n nodeType?: string;\n searchTerm?: string;\n includeArchived?: boolean;\n limit: number;\n }\n) {\n const baseRows =\n args.tenantId !== undefined\n ? await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_tenantId\", (q: any) => q.eq(\"tenantId\", args.tenantId))\n .collect()\n : args.nodeType\n ? await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_nodeType\", (q: any) => q.eq(\"nodeType\", args.nodeType))\n .collect()\n : await ctx.db.query(\"epistemicNodes\").collect();\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: any) =>\n matchesCanonicalEntityRecord(node, {\n nodeType: args.nodeType,\n tenantId: args.tenantId,\n includeArchived: args.includeArchived,\n })\n )\n .filter((node: any) => {\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: any, b: any) =>\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, args) => {\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, args) => {\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 requireProjectWriteAccess(\n ctx,\n scope.projectId,\n authenticatedUserId\n );\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 = (args.metadata as Record<string, unknown>) || {};\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 ctx.db.insert(\"epistemicNodes\", {\n globalId: entityGlobalId,\n nodeType: args.nodeType as any,\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 */\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, args) => {\n const authenticatedUserId = await requireAuthenticatedUserId(ctx);\n const now = Date.now();\n\n const node = await ctx.db.get(args.nodeId);\n if (!node) {\n throwStructuredMutationError({\n message: \"Entity not found.\",\n status: 404,\n code: \"NOT_FOUND\",\n details: { nodeId: args.nodeId },\n });\n }\n\n // Verify this is an ontological node\n if (!isOntologicalNodeType(node.nodeType)) {\n throwStructuredMutationError({\n message: `Node \"${args.nodeId}\" is a ${node.nodeType}, not an entity. Use belief/question APIs for epistemic nodes.`,\n status: 400,\n code: \"LIFECYCLE_VIOLATION\",\n invariantCode: \"entity.type_check\",\n suggestion:\n \"Only ontological entities can be updated via updateEntityAttributes.\",\n });\n }\n\n const scopeProjectId =\n typeof node.projectId === \"string\" && node.projectId.trim().length > 0\n ? node.projectId\n : undefined;\n if (scopeProjectId) {\n await requireProjectWriteAccess(ctx, scopeProjectId, authenticatedUserId);\n }\n\n // Merge new metadata with existing\n const existingMetadata = (node.metadata as Record<string, unknown>) || {};\n const newMetadataFields =\n args.metadata !== undefined\n ? ((args.metadata as Record<string, unknown>) || {})\n : {};\n const mergedMetadata = { ...existingMetadata, ...newMetadataFields };\n if (args.subtype !== undefined) {\n mergedMetadata.subtype = args.subtype;\n }\n\n if (args.canonicalText !== undefined && args.canonicalText.trim().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 const nextCanonicalText =\n typeof args.canonicalText === \"string\" && args.canonicalText.trim().length > 0\n ? args.canonicalText.trim()\n : node.canonicalText;\n\n if (args.canonicalText !== undefined) {\n const duplicate = await findExistingCanonicalEntity(ctx, {\n nodeType: node.nodeType,\n canonicalText: nextCanonicalText,\n tenantId: typeof node.tenantId === \"string\" ? node.tenantId : undefined,\n });\n if (duplicate && String(duplicate._id) !== String(args.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: args.nodeId,\n duplicateNodeId: duplicate._id,\n canonicalText: nextCanonicalText,\n },\n });\n }\n }\n\n // Validate merged metadata against schema\n const validation = await validateEntityMetadata(\n ctx,\n node.nodeType,\n 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: Record<string, unknown> = {\n metadata: mergedMetadata,\n updatedAt: now,\n };\n\n if (args.canonicalText !== undefined) {\n updates.canonicalText = nextCanonicalText;\n updates.contentHash = generateContentHash(node.nodeType, nextCanonicalText);\n updates.title =\n args.title !== undefined ? args.title : buildEntityTitle(nextCanonicalText);\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 // 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: 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, args) => {\n const authenticatedUserId = await requireAuthenticatedUserId(ctx);\n const now = Date.now();\n\n const canonical = await ctx.db.get(args.canonicalNodeId);\n const duplicate = await ctx.db.get(args.duplicateNodeId);\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 (\n !isOntologicalNodeType(canonical.nodeType) ||\n !isOntologicalNodeType(duplicate.nodeType)\n ) {\n throwStructuredMutationError({\n message: \"Both nodes must be ontological entities to merge.\",\n status: 400,\n code: \"LIFECYCLE_VIOLATION\",\n invariantCode: \"entity.type_check\",\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.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 requireProjectWriteAccess(\n ctx,\n canonical.projectId as string,\n authenticatedUserId\n );\n }\n\n // 1. Create derived_from edge (canonical replacement for same_as)\n const edgeGlobalId = generateGlobalId();\n await ctx.db.insert(\"epistemicEdges\", {\n globalId: edgeGlobalId,\n fromNodeId: args.duplicateNodeId,\n toNodeId: args.canonicalNodeId,\n sourceGlobalId: duplicate.globalId,\n targetGlobalId: canonical.globalId,\n edgeType: \"derived_from\" as any,\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 = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from\", (q: any) =>\n q.eq(\"fromNodeId\", args.duplicateNodeId)\n )\n .collect();\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 = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_to\", (q: any) => q.eq(\"toNodeId\", args.duplicateNodeId))\n .collect();\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 =\n (duplicate.metadata as Record<string, unknown>) || {};\n await ctx.db.patch(args.duplicateNodeId, {\n status: \"superseded\" as any,\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, args) => {\n const authenticatedUserId = await requireAuthenticatedUserId(ctx);\n const now = Date.now();\n\n const node = await ctx.db.get(args.nodeId);\n if (!node) {\n throwStructuredMutationError({\n message: \"Entity not found.\",\n status: 404,\n code: \"NOT_FOUND\",\n details: { nodeId: args.nodeId },\n });\n }\n\n if (!isOntologicalNodeType(node.nodeType)) {\n throwStructuredMutationError({\n message: `Node \"${args.nodeId}\" is a ${node.nodeType}, not an entity. Use belief archive APIs for epistemic nodes.`,\n status: 400,\n code: \"LIFECYCLE_VIOLATION\",\n invariantCode: \"entity.type_check\",\n });\n }\n\n if (node.projectId) {\n await requireProjectWriteAccess(\n ctx,\n node.projectId as string,\n authenticatedUserId\n );\n }\n\n await ctx.db.patch(args.nodeId, {\n status: \"archived\" as any,\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"]}
|