@lucern/graph-primitives 0.1.0-alpha.4 → 0.3.0-alpha.0
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 +199 -18
- package/dist/beliefDecay.js.map +1 -1
- package/dist/beliefEvidenceLinks.js.map +1 -1
- package/dist/confidencePropagationDispatch.js.map +1 -1
- package/dist/contradictions.js.map +1 -1
- package/dist/entityBridge.js.map +1 -1
- package/dist/entityLifecycle.js.map +1 -1
- package/dist/epistemicAnswers.js +21 -36
- package/dist/epistemicAnswers.js.map +1 -1
- package/dist/epistemicBeliefs.js +92 -651
- package/dist/epistemicBeliefs.js.map +1 -1
- package/dist/epistemicContracts.js +65 -624
- package/dist/epistemicContracts.js.map +1 -1
- package/dist/epistemicEdges.js.map +1 -1
- package/dist/epistemicEvidence.js +71 -630
- package/dist/epistemicEvidence.js.map +1 -1
- package/dist/epistemicHelpers.js +3 -2
- package/dist/epistemicHelpers.js.map +1 -1
- package/dist/epistemicLinking.js.map +1 -1
- package/dist/epistemicNodes.js +49 -585
- package/dist/epistemicNodes.js.map +1 -1
- package/dist/epistemicQuestions.js +46 -590
- package/dist/epistemicQuestions.js.map +1 -1
- package/dist/epistemicSources.js +29 -565
- package/dist/epistemicSources.js.map +1 -1
- package/dist/evaluators/index.js +65 -624
- package/dist/evaluators/index.js.map +1 -1
- package/dist/index.js +304 -905
- package/dist/index.js.map +1 -1
- package/dist/ontologyApproval.js.map +1 -1
- package/dist/ontologyDefinitions.js.map +1 -1
- package/dist/ontologyRegistry.js.map +1 -1
- package/dist/projectionReconciliation.js.map +1 -1
- package/dist/questionEvidenceLinks.js +188 -2
- package/dist/questionEvidenceLinks.js.map +1 -1
- package/dist/workspaceIsolation.js +30 -581
- package/dist/workspaceIsolation.js.map +1 -1
- package/package.json +5 -6
|
@@ -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","../../schema-management/src/validators.ts","../src/convex.ts","../src/graphTypes.ts","../src/edgeValidation.ts","../src/topicProjectOverlay.ts","../src/resolvers.ts","../src/topicScope.ts","../src/epistemicEdges.ts"],"names":["resolvedUser","user","api","anyApi","componentsGeneric","internalMutationGeneric","mutationGeneric","queryGeneric","LEGACY_SCOPE_FIELD","readNonEmptyString","readStringArray","readMetadata","readLegacyProjectId","coerceVisibility","coerceStatus","mapProjectType","isProjectLikeTopic","resolveTopicDoc","materializeTopicProjectOverlay","resolveTopicProjectOverlay","listTopicProjectOverlays","isMissingLucernChildComponentError","defaultResolvers","resolverOverrides","v","query"],"mappings":"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","file":"epistemicEdges.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 * validators module implementation.\n */\n\nimport { v } from \"convex/values\";\n\n/**\n * Permissive return validator used while contracts are tightened.\n */\nexport const permissiveReturn: any = v.optional(v.any());\n\n/**\n * Shallow JSON validators for dynamic payloads.\n */\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 * Graph Type Registry for Convex\n *\n * This file mirrors the canonical type registry at lib/ontology/types.ts\n * but is compatible with Convex's bundling requirements.\n *\n * IMPORTANT: Keep this file in sync with lib/ontology/types.ts\n * The frontend uses lib/ontology/types.ts, Convex uses this file.\n *\n * @see /docs/architecture/UNIFIED_GRAPH_ARCHITECTURE.md\n */\n\n// =============================================================================\n// EPISTEMIC LAYERS\n// =============================================================================\n\nexport type EpistemicLayer =\n | \"L4\"\n | \"L3\"\n | \"L2\"\n | \"L1\"\n | \"ontological\"\n | \"organizational\";\n\n// =============================================================================\n// NODE TYPE TO LABEL MAPPING\n// =============================================================================\n\nexport const NODE_TYPE_TO_LABEL: Record<string, string> = {\n // L4: Audit Targets\n decision: \"Decision\",\n\n // L3: Traversal Anchors\n belief: \"Belief\",\n question: \"Question\",\n theme: \"Theme\",\n deal: \"Deal\",\n topic: \"Topic\",\n\n // L2: Compression Boundary\n claim: \"Claim\",\n evidence: \"Evidence\",\n synthesis: \"Synthesis\",\n answer: \"Answer\",\n\n // L1: Terminal Leaves\n atomic_fact: \"AtomicFact\",\n excerpt: \"Excerpt\",\n source: \"Source\",\n\n // Ontological (Neo4j is SOT)\n company: \"Company\",\n person: \"Person\",\n investor: \"Investor\",\n function: \"Function\",\n value_chain: \"ValueChain\",\n};\n\n// =============================================================================\n// EDGE TYPE TO NEO4J RELATIONSHIP MAPPING\n// =============================================================================\n\n/**\n * Epistemic Kernel v2: 6 canonical edge types + ontological edges.\n *\n * Weight and metadata carry nuance that previously required 67 separate type strings.\n * See: docs/architecture/epistemic-kernel-v2.md\n */\nexport const EDGE_TYPE_TO_REL: Record<string, string> = {\n // === THE SIX CANONICAL EPISTEMIC EDGE TYPES ===\n supports: \"SUPPORTS\", // L3↔L3: belief bears on belief (weight -1 to +1)\n informs: \"INFORMS\", // L2→L3: evidence bears on belief\n depends_on: \"DEPENDS_ON\", // L3→L3, Q→Q: structural gate\n derived_from: \"DERIVED_FROM\", // Any→Any: provenance chain (fork, synthesis, extraction, answer)\n contains: \"CONTAINS\", // Any→Any: hierarchy, scoping, membership\n tests: \"TESTS\", // Q→L3: question interrogates belief\n\n // === L4 DECISION EDGES (derived_from with derivationType=decision) ===\n // Kept as separate Neo4j relationship types for backward compat with L4 queries.\n // New code should use derived_from + metadata.\n based_on_belief: \"BASED_ON_BELIEF\",\n based_on_question: \"BASED_ON_QUESTION\",\n blocked_by_contradiction: \"BLOCKED_BY_CONTRADICTION\",\n informed_by_theme: \"INFORMED_BY_THEME\",\n\n // === ONTOLOGICAL EDGES (tenant-extensible, managed by ontology system) ===\n works_at: \"WORKS_AT\",\n invested_in: \"INVESTED_IN\",\n competes_with: \"COMPETES_WITH\",\n participates_in: \"PARTICIPATES_IN\",\n founded_by: \"FOUNDED_BY\",\n evaluates: \"EVALUATES\",\n performs: \"PERFORMS\",\n function_in: \"FUNCTION_IN\",\n impacts: \"IMPACTS\",\n raised_from: \"RAISED_FROM\",\n mentioned_in: \"MENTIONED_IN\",\n perspective_on: \"PERSPECTIVE_ON\",\n about_entity: \"ABOUT_ENTITY\",\n entity_referenced_in: \"ENTITY_REFERENCED_IN\",\n};\n\n// =============================================================================\n// HELPER FUNCTIONS\n// =============================================================================\n\n/**\n * Get the epistemic layer for a node type\n */\nexport function getNodeLayer(nodeType: string): EpistemicLayer {\n const L4_TYPES = [\"decision\"];\n const L3_TYPES = [\"belief\", \"question\", \"theme\", \"deal\"];\n const L2_TYPES = [\"claim\", \"evidence\", \"synthesis\", \"answer\"];\n const L1_TYPES = [\"atomic_fact\", \"excerpt\", \"source\"];\n const ONTOLOGICAL_TYPES = [\n \"company\",\n \"person\",\n \"investor\",\n \"function\",\n \"value_chain\",\n ];\n const ORGANIZATIONAL_TYPES = [\"topic\"];\n\n if (L4_TYPES.includes(nodeType)) {\n return \"L4\";\n }\n if (L3_TYPES.includes(nodeType)) {\n return \"L3\";\n }\n if (L2_TYPES.includes(nodeType)) {\n return \"L2\";\n }\n if (L1_TYPES.includes(nodeType)) {\n return \"L1\";\n }\n if (ONTOLOGICAL_TYPES.includes(nodeType)) {\n return \"ontological\";\n }\n if (ORGANIZATIONAL_TYPES.includes(nodeType)) {\n return \"organizational\";\n }\n\n // Unknown types default to L2\n console.warn(`[GraphTypes] Unknown nodeType \"${nodeType}\", defaulting to L2`);\n return \"L2\";\n}\n\n/**\n * Get the Neo4j label for a node type\n */\nexport function getNeo4jLabel(nodeType: string): string {\n return (\n NODE_TYPE_TO_LABEL[nodeType] ||\n nodeType.charAt(0).toUpperCase() + nodeType.slice(1)\n );\n}\n\n/**\n * Get the Neo4j relationship type for an edge type\n */\nexport function getNeo4jRelType(edgeType: string): string {\n return EDGE_TYPE_TO_REL[edgeType] || edgeType.toUpperCase();\n}\n\n/**\n * The 6 canonical epistemic edge types (Kernel v2).\n * Anything not in this set or the ontological/L4 sets is deprecated.\n */\nconst CANONICAL_EPISTEMIC_TYPES = new Set([\n \"supports\",\n \"informs\",\n \"depends_on\",\n \"derived_from\",\n \"contains\",\n \"tests\",\n]);\n\n/**\n * Check if an edge type is deprecated.\n *\n * Kernel v2: only the 6 canonical epistemic types, L4 decision types,\n * and ontological types are active. All legacy types (67 old types) are deprecated.\n */\nexport function isDeprecatedEdgeType(edgeType: string): boolean {\n // Canonical epistemic types are NOT deprecated\n if (CANONICAL_EPISTEMIC_TYPES.has(edgeType)) return false;\n // Types in the EDGE_TYPE_TO_REL map (ontological + L4) are NOT deprecated\n if (edgeType in EDGE_TYPE_TO_REL) return false;\n // Everything else is a legacy type\n return true;\n}\n","/**\n * edgeValidation module implementation.\n */\n\nimport { type EpistemicLayer, isDeprecatedEdgeType } from \"./graphTypes\";\n\nexport { isDeprecatedEdgeType };\nexport type { EpistemicLayer };\n\nfunction getLayerDepth(layer: EpistemicLayer): number {\n switch (layer) {\n case \"L4\":\n return 4;\n case \"L3\":\n return 3;\n case \"L2\":\n return 2;\n case \"L1\":\n return 1;\n case \"ontological\":\n return 0;\n default:\n return -1;\n }\n}\n\nfunction isValidLayerConnection(\n fromLayer: EpistemicLayer,\n toLayer: EpistemicLayer\n): boolean {\n if (fromLayer === toLayer) {\n return true;\n }\n\n // Ontological ↔ ontological (entity-entity edges)\n if (fromLayer === \"ontological\" && toLayer === \"ontological\") {\n return true;\n }\n\n // Ontological ↔ epistemic bridge (OE-B: entity-belief/evidence/source connections)\n if (\n fromLayer === \"ontological\" &&\n (toLayer === \"L3\" || toLayer === \"L2\" || toLayer === \"L1\")\n ) {\n return true;\n }\n if (\n (fromLayer === \"L3\" || fromLayer === \"L2\" || fromLayer === \"L1\") &&\n toLayer === \"ontological\"\n ) {\n return true;\n }\n\n // Epistemic layer transitions\n if (fromLayer === \"L2\" && toLayer === \"L1\") {\n return true;\n }\n if (fromLayer === \"L2\" && toLayer === \"L3\") {\n return true;\n }\n if (fromLayer === \"L3\" && toLayer === \"L2\") {\n return true;\n }\n if (fromLayer === \"L3\" && toLayer === \"L4\") {\n return true;\n }\n if (fromLayer === \"L4\" && toLayer === \"L3\") {\n return true;\n }\n\n // Organizational connections\n if (fromLayer === \"L3\" && toLayer === \"organizational\") {\n return true;\n }\n if (fromLayer === \"organizational\" && toLayer === \"L3\") {\n return true;\n }\n\n const fromDepth = getLayerDepth(fromLayer);\n const toDepth = getLayerDepth(toLayer);\n if (Math.abs(fromDepth - toDepth) > 1) {\n return false;\n }\n return true;\n}\n\nexport type TraversalMode =\n | \"anchor_down\"\n | \"anchor_up\"\n | \"same_layer\"\n | \"decision_trace\";\n\nexport function shouldContinueTraversal(\n currentLayer: EpistemicLayer,\n targetLayer: EpistemicLayer,\n options: {\n mode: TraversalMode;\n minLayer?: number;\n maxLayer?: number;\n }\n): boolean {\n const currentDepth = getLayerDepth(currentLayer);\n const targetDepth = getLayerDepth(targetLayer);\n\n if (options.minLayer !== undefined && targetDepth < options.minLayer) {\n return false;\n }\n if (options.maxLayer !== undefined && targetDepth > options.maxLayer) {\n return false;\n }\n\n switch (options.mode) {\n case \"anchor_down\":\n return targetDepth <= currentDepth;\n case \"anchor_up\":\n return targetDepth >= currentDepth;\n case \"same_layer\":\n return targetDepth === currentDepth;\n case \"decision_trace\":\n return currentDepth === 4\n ? targetDepth === 3\n : targetDepth === currentDepth;\n default:\n return true;\n }\n}\n\nexport function getDefaultMinLayer(mode: TraversalMode): number {\n switch (mode) {\n case \"anchor_down\":\n return 1;\n case \"anchor_up\":\n return 2;\n case \"same_layer\":\n return 1;\n case \"decision_trace\":\n return 3;\n default:\n return 1;\n }\n}\n\nexport const EDGE_LAYER_RULES: Record<\n string,\n { from: EpistemicLayer[]; to: EpistemicLayer[]; description: string }\n> = {\n // === 6 Canonical Epistemic Types ===\n supports: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Belief bears on Belief (weight: +1 supports, -1 contradicts)\",\n },\n informs: {\n from: [\"L2\"],\n to: [\"L3\"],\n description: \"Evidence -> Belief (L2 -> L3)\",\n },\n depends_on: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Belief B requires Belief A (structural gate)\",\n },\n derived_from: {\n from: [\"L2\", \"L3\", \"L4\"],\n to: [\"L1\", \"L2\", \"L3\"],\n description: \"A was produced from B (provenance chain)\",\n },\n contains: {\n from: [\"L3\", \"L4\", \"ontological\"],\n to: [\"L2\", \"L3\", \"ontological\"],\n description: \"A scopes/aggregates B (hierarchy)\",\n },\n tests: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Question -> Belief (L3 -> L3)\",\n },\n\n // === Structural / Lifecycle ===\n supersedes: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"NewNode -> OldNode (fork lineage)\",\n },\n responds_to: {\n from: [\"L2\", \"L3\"],\n to: [\"L3\"],\n description: \"Answer -> Question (L2/L3 -> L3)\",\n },\n belongs_to: {\n from: [\"L2\", \"L3\", \"ontological\"],\n to: [\"L3\"],\n description: \"Membership (migrating to contains)\",\n },\n relates_to_thesis: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Belief -> Theme (L3 -> L3)\",\n },\n\n // === Ontological (entity-entity or entity-epistemic bridge) ===\n works_at: {\n from: [\"ontological\"],\n to: [\"ontological\"],\n description: \"Person -> Company\",\n },\n invested_in: {\n from: [\"ontological\"],\n to: [\"ontological\"],\n description: \"Investor -> Company\",\n },\n competes_with: {\n from: [\"ontological\"],\n to: [\"ontological\"],\n description: \"Company -> Company\",\n },\n participates_in: {\n from: [\"ontological\"],\n to: [\"ontological\"],\n description: \"Company -> ValueChain\",\n },\n founded_by: {\n from: [\"ontological\"],\n to: [\"ontological\"],\n description: \"Company -> Person\",\n },\n evaluates: {\n from: [\"ontological\"],\n to: [\"ontological\"],\n description: \"Deal -> Company\",\n },\n performs: {\n from: [\"ontological\"],\n to: [\"ontological\"],\n description: \"Company -> Function\",\n },\n function_in: {\n from: [\"ontological\"],\n to: [\"ontological\"],\n description: \"Function -> ValueChain\",\n },\n impacts: {\n from: [\"ontological\", \"L3\"],\n to: [\"ontological\"],\n description: \"Theme/Entity -> ValueChain\",\n },\n raised_from: {\n from: [\"ontological\"],\n to: [\"ontological\"],\n description: \"Company -> Investor\",\n },\n mentioned_in: {\n from: [\"ontological\"],\n to: [\"L1\", \"L2\"],\n description: \"Entity -> Source/Evidence\",\n },\n perspective_on: {\n from: [\"ontological\"],\n to: [\"L3\"],\n description: \"Person -> Belief/Theme\",\n },\n plays_theme: {\n from: [\"ontological\"],\n to: [\"L3\"],\n description: \"Deal -> Theme\",\n },\n};\n\nexport function validateEdgeLayers(\n edgeType: string,\n fromLayer: EpistemicLayer,\n toLayer: EpistemicLayer\n): { valid: boolean; reason?: string } {\n const rules = EDGE_LAYER_RULES[edgeType];\n\n if (!rules) {\n console.warn(\n `[EdgeValidation] Unknown edge type: ${edgeType}, allowing by default`\n );\n return { valid: true };\n }\n\n if (edgeType === \"supersedes\") {\n if (fromLayer !== toLayer) {\n return {\n valid: false,\n reason: `${edgeType} edges must be between nodes of the same layer. Got ${fromLayer} -> ${toLayer}`,\n };\n }\n return { valid: true };\n }\n\n if (!rules.from.includes(fromLayer)) {\n return {\n valid: false,\n reason: `Edge type '${edgeType}' does not allow source layer ${fromLayer}. Allowed: ${rules.from.join(\", \")}`,\n };\n }\n\n if (!rules.to.includes(toLayer)) {\n return {\n valid: false,\n reason: `Edge type '${edgeType}' does not allow target layer ${toLayer}. Allowed: ${rules.to.join(\", \")}`,\n };\n }\n\n if (!isValidLayerConnection(fromLayer, toLayer)) {\n return {\n valid: false,\n reason: `Layer transition ${fromLayer} -> ${toLayer} is not permitted`,\n };\n }\n\n return { valid: true };\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 * Epistemic Edges - CRUD operations for the knowledge graph relationships\n *\n * Every \"supports\", \"contradicts\", \"derived_from\" relationship in StackOS is an edge.\n * Edges connect epistemic nodes and carry metadata about the relationship.\n *\n * @see /docs/architecture/EPISTEMIC_SPINE.md\n */\n\nimport { v } from \"convex/values\";\nimport {\n checkProjectAccess,\n checkScopeAccess,\n requireProjectAccess,\n} from \"@lucern/access-control/access\";\nimport { permissiveReturn } from \"@lucern/schema-management/validators\";\nimport type { Id } from \"./convex\";\nimport { internal, internalMutation, mutation, query } from \"./convex\";\nimport {\n getDefaultMinLayer,\n shouldContinueTraversal,\n type TraversalMode,\n validateEdgeLayers,\n} from \"./edgeValidation\";\nimport { getNodeLayer, isDeprecatedEdgeType } from \"./graphTypes\";\nimport { resolveGraphPrimitivesAppResolvers } from \"./resolvers\";\nimport { optionalScopeArgs, resolveTopicProjectScope } from \"./topicScope\";\n\n// =============================================================================\n// TYPES (Phase 2A: Layer Architecture Compliant)\n// =============================================================================\n\n/**\n * Epistemic Layer Validator for edges\n */\nexport const epistemicLayerValidator = v.union(\n v.literal(\"L4\"),\n v.literal(\"L3\"),\n v.literal(\"L2\"),\n v.literal(\"L1\"),\n v.literal(\"ontological\"),\n v.literal(\"organizational\")\n);\n\nconst subjectiveOpinionValidator = v.object({\n b: v.number(),\n d: v.number(),\n u: v.number(),\n a: v.number(),\n});\n\nexport const edgeTypeValidator = v.union(\n // --- L4 Decision Edges (Phase 2A) ---\n v.literal(\"based_on_belief\"), // Decision → Belief (L4 → L3)\n v.literal(\"based_on_question\"), // Decision → Question (L4 → L3)\n v.literal(\"blocked_by_contradiction\"), // Decision → Contradiction (L4 → L3)\n v.literal(\"informed_by_theme\"), // Decision → Theme (L4 → L3)\n\n // --- Evidence Flow (L2 → L3, L2 → L1) ---\n v.literal(\"derived_from\"), // Evidence/Synthesis → Source/Question (provenance)\n v.literal(\"responds_to\"), // Answer → Question (L2 → L3)\n v.literal(\"informs\"), // Evidence → Belief (L2 → L3) - use weight: -1 to +1\n v.literal(\"tests\"), // Question → Belief (L3 → L3)\n v.literal(\"explores\"), // Question → Belief assumption (L3 → L3)\n v.literal(\"qualifies\"), // Evidence → Belief (L2 → L3)\n\n // --- Synthesis (L2 → L2, L2 → L1) ---\n // \"based_on\" removed — use \"derived_from\" instead\n\n // --- Theme Relationships (L3 → L3) ---\n v.literal(\"relates_to_thesis\"), // Belief → Theme (L3 → L3) - use weight: -1 to +1\n v.literal(\"belongs_to\"), // Any → Theme (? → L3)\n v.literal(\"plays_theme\"), // Deal → Theme (L3 → L3)\n v.literal(\"scoped_by\"), // Belief/Question → Topic (L3 → organizational)\n\n // --- Deal/Company ---\n v.literal(\"evaluates\"), // Deal → Company (L3 → ontological)\n\n // --- People (ontological → ontological, ontological → L3) ---\n v.literal(\"perspective_on\"), // Person → Belief/Theme\n v.literal(\"works_at\"), // Person → Company/Investor\n v.literal(\"mentioned_in\"), // Person/Company → Source (ontological → L1)\n v.literal(\"founded_by\"), // Company → Person (ontological → ontological)\n\n // --- Value Chain (ontological → ontological) ---\n v.literal(\"participates_in\"), // Company → ValueChain\n v.literal(\"performs\"), // Company → Function\n v.literal(\"function_in\"), // Function → ValueChain\n v.literal(\"impacts\"), // Theme → ValueChain (L3 → ontological)\n\n // --- Investment (ontological → ontological) ---\n v.literal(\"invested_in\"), // Investor → Company\n v.literal(\"raised_from\"), // Company → Investor\n\n // --- Lifecycle (same layer only) ---\n v.literal(\"supersedes\"), // NewNode → OldNode (same layer)\n v.literal(\"same_as\"), // Duplicate detection (same layer)\n\n // --- Same-Type Relationships: Belief ↔ Belief (L3 → L3) ---\n v.literal(\"depends_on\"), // Belief B requires Belief A to be true\n v.literal(\"supports\"), // Beliefs strengthen each other (weight > 0)\n v.literal(\"contains\"), // Parent contains child (hierarchical containment)\n\n // --- Belief Cluster Mapping (L3 → L3) - For Thesis Validation Sprints ---\n // These edge types capture the full range of belief-to-belief relationships\n // needed for cluster mapping, confidence propagation, and thesis testing.\n v.literal(\"counterfactual_of\"), // If A is TRUE, B FAILS (inverse dependency)\n v.literal(\"cascade_to\"), // If B fails, A also fails (downstream impact)\n v.literal(\"cascade_from\"), // Changes propagate from A to B (upstream dependency)\n v.literal(\"mutually_exclusive\"), // A and B cannot BOTH be true (zero-sum)\n v.literal(\"correlates_with\"), // A and B move together non-causally (observed pattern)\n v.literal(\"amplifies\"), // A strengthens B unidirectionally (one-way boost)\n v.literal(\"precondition_for\"), // A must validate before B can be tested (temporal)\n v.literal(\"in_tension_with\"), // A and B pull opposite directions (soft conflict)\n\n // --- Belief ↔ Belief: Epistemic Impact (Confidence Propagation) ---\n v.literal(\"falsified_by\"), // If B is validated, A becomes false\n v.literal(\"exclusive_with\"), // A XOR B (sum of confidences ≤ 1)\n v.literal(\"contradicts\"), // A directly contradicts B\n v.literal(\"collapses_if\"), // If A falls below threshold, B collapses\n v.literal(\"strengthened_by\"), // If A rises, B rises\n v.literal(\"weakened_by\"), // If A rises, B falls\n v.literal(\"alternative_to\"), // Competing explanations\n v.literal(\"subsumes\"), // A is more general, includes B\n v.literal(\"validated_by\"), // If B is true, A gains confidence\n v.literal(\"required_for\"), // A must be true for B to be meaningful\n v.literal(\"blocks\"), // A being unresolved blocks B\n\n // --- Same-Type Relationships: Question ↔ Question (L3 → L3) ---\n v.literal(\"prerequisite_for\"), // Question A must be answered first\n v.literal(\"parallel_to\"), // Same topic, different angles\n\n // --- Same-Type Relationships: Evidence ↔ Evidence (L2 → L2) ---\n v.literal(\"corroborates\"), // Independent support for same conclusion\n v.literal(\"extends\"), // Adds depth to other evidence\n v.literal(\"same_source_as\"), // Same document/study\n v.literal(\"same_theme_as\"), // Same topic/entity\n\n // --- NEW: Deep Epistemic Analysis Edges (Phase: Schema Upgrade) ---\n v.literal(\"assumes\"), // Hidden dependency discovered by AI (Belief B implicitly assumes A)\n v.literal(\"would_predict\"), // Pre-registered prediction for validation (If Belief true, expect Evidence)\n v.literal(\"analogous_to\"), // Explicit analogy with disanalogies (Belief A like Belief B because...)\n v.literal(\"independent_of\"), // True evidence independence marker (Evidence A independent of B)\n\n // --- Entity↔Belief Bridge (OE-B) ---\n // \"about_entity\" and \"entity_referenced_in\" removed — use \"contains\" instead\n v.literal(\"competes_with\") // Company → Company (ontological → ontological)\n);\n\n// =============================================================================\n// QUERIES\n// =============================================================================\n\n/**\n * Get a single edge by ID\n */\nexport const get = query({\n args: { edgeId: v.id(\"epistemicEdges\") },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n return await ctx.db.get(args.edgeId);\n },\n});\n\n/**\n * Get an edge by its global UUID\n */\nexport const getByGlobalId = query({\n args: { globalId: v.string() },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n return await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_globalId\", (q) => q.eq(\"globalId\", args.globalId))\n .first();\n },\n});\n\n/**\n * Get all edges FROM a specific node\n */\nexport const getFromNode = query({\n args: {\n fromNodeId: v.id(\"epistemicNodes\"),\n edgeType: v.optional(edgeTypeValidator),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const { edgeType } = args;\n if (edgeType) {\n return await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from_type\", (q) =>\n q.eq(\"fromNodeId\", args.fromNodeId).eq(\"edgeType\", edgeType as any)\n )\n .collect();\n }\n\n return await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from\", (q) => q.eq(\"fromNodeId\", args.fromNodeId))\n .collect();\n },\n});\n\n/**\n * Get all edges TO a specific node\n */\nexport const getToNode = query({\n args: {\n toNodeId: v.id(\"epistemicNodes\"),\n edgeType: v.optional(edgeTypeValidator),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const { edgeType } = args;\n if (edgeType) {\n return await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_to_type\", (q) =>\n q.eq(\"toNodeId\", args.toNodeId).eq(\"edgeType\", edgeType as any)\n )\n .collect();\n }\n\n return await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_to\", (q) => q.eq(\"toNodeId\", args.toNodeId))\n .collect();\n },\n});\n\n/**\n * Get edges pointing FROM a node (by any string ID - for backward compat)\n * This is a more flexible version of getFromNode that accepts any string ID\n *\n * Performance: Uses indexes where possible, falls back to globalId search only when needed\n */\nexport const getBySourceNode = query({\n args: {\n sourceNodeId: v.string(),\n edgeType: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n // First, try to use the indexed query if it's a valid epistemicNodes ID\n const isConvexId =\n args.sourceNodeId.length === 32 ||\n args.sourceNodeId.includes(\"epistemicNodes\");\n\n if (isConvexId) {\n // Use indexed query for Convex IDs\n const query = args.edgeType\n ? ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from_type\", (q) =>\n q\n .eq(\"fromNodeId\", args.sourceNodeId as Id<\"epistemicNodes\">)\n .eq(\"edgeType\", args.edgeType as any)\n )\n : ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from\", (q) =>\n q.eq(\"fromNodeId\", args.sourceNodeId as Id<\"epistemicNodes\">)\n );\n\n return await query.collect();\n }\n\n // For globalIds, use the sourceGlobalId index\n const byGlobalId = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_source_global_id\", (q) =>\n q.eq(\"sourceGlobalId\", args.sourceNodeId)\n )\n .collect();\n\n if (args.edgeType) {\n return byGlobalId.filter((edge) => edge.edgeType === args.edgeType);\n }\n return byGlobalId;\n },\n});\n\n/**\n * Get edges pointing TO a node (by any string ID - for backward compat)\n * This is a more flexible version of getToNode that accepts any string ID\n *\n * Performance: Uses indexes where possible, falls back to globalId search only when needed\n */\nexport const getByTargetNode = query({\n args: {\n targetNodeId: v.string(),\n edgeType: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n // First, try to use the indexed query if it's a valid epistemicNodes ID\n const isConvexId =\n args.targetNodeId.length === 32 ||\n args.targetNodeId.includes(\"epistemicNodes\");\n\n if (isConvexId) {\n // Use indexed query for Convex IDs\n const query = args.edgeType\n ? ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_to_type\", (q) =>\n q\n .eq(\"toNodeId\", args.targetNodeId as Id<\"epistemicNodes\">)\n .eq(\"edgeType\", args.edgeType as any)\n )\n : ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_to\", (q) =>\n q.eq(\"toNodeId\", args.targetNodeId as Id<\"epistemicNodes\">)\n );\n\n return await query.collect();\n }\n\n // For globalIds, use the targetGlobalId index\n const byGlobalId = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_target_global_id\", (q) =>\n q.eq(\"targetGlobalId\", args.targetNodeId)\n )\n .collect();\n\n if (args.edgeType) {\n return byGlobalId.filter((edge) => edge.edgeType === args.edgeType);\n }\n return byGlobalId;\n },\n});\n\n/**\n * Get edge between two specific nodes (returns array)\n */\nexport const getBetween = query({\n args: {\n fromNodeId: v.id(\"epistemicNodes\"),\n toNodeId: v.id(\"epistemicNodes\"),\n edgeType: v.optional(edgeTypeValidator),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const edges = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from_to\", (q) =>\n q.eq(\"fromNodeId\", args.fromNodeId).eq(\"toNodeId\", args.toNodeId)\n )\n .collect();\n\n if (args.edgeType) {\n return edges.filter((e) => e.edgeType === args.edgeType);\n }\n\n return edges;\n },\n});\n\n/**\n * Get first edge between two specific nodes (returns single edge or null)\n * Used by findEvidencePath for direct edge checking\n */\nexport const getByNodes = query({\n args: {\n fromNodeId: v.id(\"epistemicNodes\"),\n toNodeId: v.id(\"epistemicNodes\"),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n return await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from_to\", (q) =>\n q.eq(\"fromNodeId\", args.fromNodeId).eq(\"toNodeId\", args.toNodeId)\n )\n .first();\n },\n});\n\n/**\n * Get all edges of a specific type for a project\n */\nexport const getByProjectAndType = query({\n args: {\n ...optionalScopeArgs,\n edgeType: edgeTypeValidator,\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n if (!args.projectId && !args.topicId) {\n return [];\n }\n\n let scope: Awaited<ReturnType<typeof resolveTopicProjectScope>>;\n try {\n scope = await resolveTopicProjectScope(ctx, {\n projectId: args.projectId,\n topicId: args.topicId,\n });\n } catch {\n return [];\n }\n\n const projectEdges = await collectScopedEdges(ctx, scope, 5000);\n\n return projectEdges\n .filter(\n (e) =>\n e.edgeType === args.edgeType &&\n edgeMatchesWorkspaceReasoningScope(e, scope)\n )\n .slice(0, 5000);\n },\n});\n\n/**\n * Get all edges for a project\n */\nexport const getByProject = query({\n args: {\n ...optionalScopeArgs,\n userId: v.optional(v.string()),\n limit: v.optional(v.number()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n if (!args.projectId && !args.topicId) {\n return [];\n }\n\n let scope: Awaited<ReturnType<typeof resolveTopicProjectScope>>;\n try {\n scope = await resolveTopicProjectScope(ctx, {\n projectId: args.projectId,\n topicId: args.topicId,\n });\n } catch {\n return [];\n }\n\n // userId is optional — if not provided, skip access check (internal/dev callers)\n if (args.userId) {\n const hasAccess = await checkScopeAccess(\n ctx,\n String(scope.topicId ?? scope.projectId),\n args.userId\n );\n if (!hasAccess) {\n return [];\n }\n }\n const pageSize = Math.max(1, Math.min(Math.floor(args.limit ?? 500), 2000));\n\n const edges = await collectScopedEdges(ctx, scope, Math.min(pageSize * 3, 6000));\n return edges\n .filter((edge) => edgeMatchesWorkspaceReasoningScope(edge, scope))\n .slice(0, pageSize);\n },\n});\n\nexport const getByTopic = getByProject;\n\ntype WorkspaceEdgeScope = Awaited<ReturnType<typeof resolveTopicProjectScope>>;\ntype WorkspaceScopedEdge = {\n _id: Id<\"epistemicEdges\">;\n topicId?: Id<\"topics\">;\n projectId?: string;\n edgeType: string;\n};\n\nfunction dedupeWorkspaceEdges<T extends { _id: unknown }>(edges: T[]): T[] {\n const seen = new Set<string>();\n const deduped: T[] = [];\n\n for (const edge of edges) {\n const key = String(edge._id);\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n deduped.push(edge);\n }\n\n return deduped;\n}\n\nfunction edgeMatchesWorkspaceReasoningScope(\n edge: Pick<WorkspaceScopedEdge, \"topicId\" | \"projectId\">,\n scope: WorkspaceEdgeScope\n): boolean {\n return (\n (scope.topicId !== undefined && edge.topicId === scope.topicId) ||\n (scope.projectId !== undefined && edge.projectId === scope.projectId)\n );\n}\n\nasync function collectScopedEdges(\n ctx: Parameters<typeof checkScopeAccess>[0],\n scope: WorkspaceEdgeScope,\n scanLimit: number\n): Promise<WorkspaceScopedEdge[]> {\n const queries: Promise<WorkspaceScopedEdge[]>[] = [];\n\n if (scope.topicId) {\n queries.push(\n ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_topic\", (q: any) => q.eq(\"topicId\", scope.topicId))\n .order(\"desc\")\n .take(scanLimit) as Promise<WorkspaceScopedEdge[]>\n );\n }\n\n // Kernel v2: also check edges scoped to projectId (many edges still have\n // topicId=s97 scope while UI passes projectId=n97). Query both to catch all.\n if (scope.projectId) {\n queries.push(\n ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_topic\", (q: any) => q.eq(\"topicId\", scope.projectId))\n .order(\"desc\")\n .take(scanLimit) as Promise<WorkspaceScopedEdge[]>\n );\n }\n\n return dedupeWorkspaceEdges((await Promise.all(queries)).flat());\n}\n\n/**\n * List all edges (unscoped — for internal dev tools).\n * No project filtering, no access control.\n */\nexport const listAll = query({\n args: {\n limit: v.optional(v.number()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const pageSize = Math.max(\n 1,\n Math.min(Math.floor(args.limit ?? 5000), 10_000)\n );\n return await ctx.db.query(\"epistemicEdges\").order(\"desc\").take(pageSize);\n },\n});\n\n/**\n * Find contradictions: evidence that contradicts a belief (informs with weight < 0)\n * Note: Legacy 'contradicts' edges have been migrated to 'informs' with negative weight\n */\nexport const findContradictions = query({\n args: {\n nodeId: v.id(\"epistemicNodes\"),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const edges = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_to_type\", (q) =>\n q.eq(\"toNodeId\", args.nodeId).eq(\"edgeType\", \"informs\")\n )\n .collect();\n // Filter for negative weight (contradicting evidence)\n return edges.filter((e) => (e.weight ?? 0) < 0);\n },\n});\n\n/**\n * Find supporting evidence for a node (informs with weight >= 0)\n * Note: Legacy 'supports' edges have been migrated to 'informs' with positive weight\n */\nexport const findSupport = query({\n args: {\n nodeId: v.id(\"epistemicNodes\"),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const edges = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_to_type\", (q) =>\n q.eq(\"toNodeId\", args.nodeId).eq(\"edgeType\", \"informs\")\n )\n .collect();\n // Filter for non-negative weight (supporting evidence)\n return edges.filter((e) => (e.weight ?? 0) >= 0);\n },\n});\n\n// =============================================================================\n// MUTATIONS\n// =============================================================================\n\n/**\n * Create a new edge\n *\n * Phase 2C: Validates layer rules before creation and stores layer metadata\n */\nexport const create = mutation({\n args: {\n globalId: v.string(),\n fromNodeId: v.id(\"epistemicNodes\"),\n toNodeId: v.id(\"epistemicNodes\"),\n edgeType: edgeTypeValidator,\n weight: v.optional(v.number()),\n confidence: v.optional(v.number()),\n context: v.optional(v.string()),\n // NOTE: 'relation' field has been removed. Use 'weight' instead.\n derivationType: v.optional(v.string()), // For derived_from edges\n createdBy: v.string(),\n ...optionalScopeArgs,\n // Phase 2C: Allow skipping validation for migrations\n skipLayerValidation: v.optional(v.boolean()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n // Verify both nodes exist\n const fromNode = await ctx.db.get(args.fromNodeId);\n const toNode = await ctx.db.get(args.toNodeId);\n\n if (!fromNode || !toNode) {\n throw new Error(\"One or both nodes not found\");\n }\n\n const resolvedScope =\n args.topicId || args.projectId\n ? await resolveTopicProjectScope(ctx, {\n topicId: args.topicId,\n projectId: args.projectId,\n })\n : undefined;\n const resolvedProjectId = resolvedScope?.projectId ?? args.projectId;\n\n // Access control\n if (resolvedProjectId) {\n await requireProjectAccess(ctx, resolvedProjectId, args.createdBy);\n }\n\n // Phase 2C: Get layers (use stored or derive from nodeType)\n const fromLayer =\n fromNode.epistemicLayer || getNodeLayer(fromNode.nodeType);\n const toLayer = toNode.epistemicLayer || getNodeLayer(toNode.nodeType);\n\n // Phase 2C: Validate layer rules (unless explicitly skipped for migrations)\n if (!args.skipLayerValidation) {\n const validation = validateEdgeLayers(args.edgeType, fromLayer, toLayer);\n if (!validation.valid) {\n throw new Error(\n `[EdgeValidation] Invalid edge: ${validation.reason}. ` +\n `Attempted: ${args.edgeType} from ${fromNode.nodeType}(${fromLayer}) → ${toNode.nodeType}(${toLayer})`\n );\n }\n }\n\n // Phase 2C: Block removed edge types\n if (isDeprecatedEdgeType(args.edgeType)) {\n throw new Error(\n `FORBIDDEN: Edge type '${args.edgeType}' has been removed from StackOS schema.`\n );\n }\n\n // Check for duplicate edge\n const existing = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from_to\", (q) =>\n q.eq(\"fromNodeId\", args.fromNodeId).eq(\"toNodeId\", args.toNodeId)\n )\n .collect();\n\n const duplicateEdge = existing.find((e) => e.edgeType === args.edgeType);\n if (duplicateEdge) {\n // Return existing edge ID - caller can decide to update or error\n return { edgeId: duplicateEdge._id, isDuplicate: true };\n }\n\n // Phase 1 (Graph Architecture): Write to Neo4j directly - Neo4j is source of truth\n // The Convex epistemicEdges table is being deprecated in favor of Neo4j\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.createEdge, {\n globalId: args.globalId,\n fromGlobalId: fromNode.globalId,\n toGlobalId: toNode.globalId,\n edgeType: args.edgeType,\n weight: args.weight,\n confidence: args.confidence,\n context: args.context,\n derivationType: args.derivationType,\n createdBy: args.createdBy,\n topicId: resolvedProjectId ? String(resolvedProjectId) : undefined,\n fromNodeType: fromNode.nodeType,\n toNodeType: toNode.nodeType,\n fromLayer,\n toLayer,\n });\n\n // Audit log\n const auditProjectId = resolvedProjectId || fromNode.projectId;\n if (auditProjectId) {\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"edge\",\n entityId: args.globalId,\n changeType: \"edge_added\",\n changedAt: Date.now(),\n changedBy: args.createdBy,\n isAgent: false,\n newState: {\n edgeType: args.edgeType,\n fromNodeId: String(args.fromNodeId),\n toNodeId: String(args.toNodeId),\n weight: args.weight,\n },\n projectId: auditProjectId,\n });\n\n // Update project activity timestamp for delta-based cron gating\n await resolveGraphPrimitivesAppResolvers(ctx).patchProject(\n ctx,\n auditProjectId,\n {\n lastActivityAt: Date.now(),\n }\n );\n }\n\n // Return globalId since we no longer have a Convex edgeId\n return { edgeGlobalId: args.globalId, isDuplicate: false };\n },\n});\n\n/**\n * Update an edge's properties\n */\nexport const update = mutation({\n args: {\n edgeId: v.id(\"epistemicEdges\"),\n weight: v.optional(v.number()),\n confidence: v.optional(v.number()),\n context: v.optional(v.string()),\n // NOTE: 'relation' field has been removed. Use 'weight' instead.\n derivationType: v.optional(v.string()),\n userId: v.optional(v.string()),\n // EK-4: SL opinion metadata (Kernel v2 schema fields)\n constraint: v.optional(v.string()),\n propagation: v.optional(v.string()),\n blocking: v.optional(v.boolean()),\n implicit: v.optional(v.boolean()),\n conditionalA: v.optional(subjectiveOpinionValidator),\n conditionalNotA: v.optional(subjectiveOpinionValidator),\n containment: v.optional(v.string()),\n interrogation: v.optional(v.string()),\n reasoningMethod: v.optional(v.string()),\n analogyBasis: v.optional(v.string()),\n disanalogies: v.optional(v.array(v.string())),\n analogyStrength: v.optional(v.number()),\n causal: v.optional(v.boolean()),\n predictionFulfilled: v.optional(v.boolean()),\n predictionFulfilledAt: v.optional(v.number()),\n predictionFulfilledBy: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const { edgeId, userId, ...updates } = args;\n\n const edge = await ctx.db.get(edgeId);\n if (!edge) {\n throw new Error(\"Edge not found\");\n }\n\n // Access control\n if (edge.projectId && userId) {\n await requireProjectAccess(ctx, edge.projectId, userId);\n }\n\n // Remove undefined values\n const cleanUpdates: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(updates)) {\n if (value !== undefined) {\n cleanUpdates[key] = value;\n }\n }\n\n await ctx.db.patch(edgeId, cleanUpdates);\n\n // Audit log\n if (edge.projectId) {\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"edge\",\n entityId: edge.globalId,\n changeType: \"updated\",\n changedAt: Date.now(),\n changedBy: userId || edge.createdBy,\n isAgent: false,\n previousState: {\n weight: edge.weight,\n confidence: edge.confidence,\n context: edge.context,\n },\n newState: cleanUpdates,\n projectId: edge.projectId,\n });\n }\n\n return { success: true };\n },\n});\n\n/**\n * Delete an edge\n */\nexport const remove = mutation({\n args: {\n edgeId: v.id(\"epistemicEdges\"),\n userId: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const edge = await ctx.db.get(args.edgeId);\n if (!edge) {\n return { success: false, error: \"Edge not found\" };\n }\n\n // Access control\n if (edge.projectId && args.userId) {\n await requireProjectAccess(ctx, edge.projectId, args.userId);\n }\n\n // Audit log before deletion\n if (edge.projectId) {\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"edge\",\n entityId: edge.globalId,\n changeType: \"edge_removed\",\n changedAt: Date.now(),\n changedBy: args.userId || edge.createdBy,\n isAgent: false,\n previousState: {\n edgeType: edge.edgeType,\n fromNodeId: String(edge.fromNodeId),\n toNodeId: edge.toNodeId ? String(edge.toNodeId) : undefined,\n weight: edge.weight,\n },\n projectId: edge.projectId,\n });\n }\n\n // Update project activity timestamp for delta-based cron gating\n if (edge.projectId) {\n await resolveGraphPrimitivesAppResolvers(ctx).patchProject(\n ctx,\n edge.projectId,\n {\n lastActivityAt: Date.now(),\n }\n );\n }\n\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.deleteEdge, {\n globalId: edge.globalId,\n });\n await ctx.db.delete(args.edgeId);\n return { success: true };\n },\n});\n\n/**\n * Delete all edges between two nodes\n */\nexport const removeBetween = mutation({\n args: {\n fromNodeId: v.id(\"epistemicNodes\"),\n toNodeId: v.id(\"epistemicNodes\"),\n edgeType: v.optional(edgeTypeValidator),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const edges = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from_to\", (q) =>\n q.eq(\"fromNodeId\", args.fromNodeId).eq(\"toNodeId\", args.toNodeId)\n )\n .collect();\n\n let deleted = 0;\n for (const edge of edges) {\n if (!args.edgeType || edge.edgeType === args.edgeType) {\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.deleteEdge, {\n globalId: edge.globalId,\n });\n await ctx.db.delete(edge._id);\n deleted++;\n }\n }\n\n return { deleted };\n },\n});\n\n/**\n * Batch create edges (for migrations or bulk operations)\n *\n * Phase 2C: Validates layer rules and stores layer metadata\n */\nexport const batchCreate = mutation({\n args: {\n edges: v.array(\n v.object({\n globalId: v.string(),\n fromNodeId: v.id(\"epistemicNodes\"),\n toNodeId: v.id(\"epistemicNodes\"),\n edgeType: edgeTypeValidator,\n weight: v.optional(v.number()),\n confidence: v.optional(v.number()),\n context: v.optional(v.string()),\n // NOTE: 'relation' field has been removed. Use 'weight' instead.\n derivationType: v.optional(v.string()),\n createdBy: v.string(),\n ...optionalScopeArgs,\n })\n ),\n // Phase 2C: Allow skipping validation for migrations\n skipLayerValidation: v.optional(v.boolean()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const results: Array<{ globalId: string; edgeGlobalId: string }> = [];\n const errors: Array<{ globalId: string; error: string }> = [];\n\n for (const edge of args.edges) {\n // Get node types for denormalization\n const fromNode = await ctx.db.get(edge.fromNodeId);\n const toNode = await ctx.db.get(edge.toNodeId);\n\n if (!fromNode || !toNode) {\n errors.push({\n globalId: edge.globalId,\n error: \"One or both nodes not found\",\n });\n continue;\n }\n\n // Phase 2C: Get layers\n const fromLayer =\n fromNode.epistemicLayer || getNodeLayer(fromNode.nodeType);\n const toLayer = toNode.epistemicLayer || getNodeLayer(toNode.nodeType);\n\n // Phase 2C: Validate layer rules (unless explicitly skipped)\n if (!args.skipLayerValidation) {\n const validation = validateEdgeLayers(\n edge.edgeType,\n fromLayer,\n toLayer\n );\n if (!validation.valid) {\n errors.push({\n globalId: edge.globalId,\n error: validation.reason || \"Invalid layer combination\",\n });\n continue;\n }\n }\n\n // Phase 2C: Block removed edge types\n if (isDeprecatedEdgeType(edge.edgeType)) {\n errors.push({\n globalId: edge.globalId,\n error: `FORBIDDEN: Edge type '${edge.edgeType}' has been removed from StackOS schema.`,\n });\n continue;\n }\n\n // Phase 1 (Graph Architecture): Write to Neo4j directly - Neo4j is source of truth\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.createEdge, {\n globalId: edge.globalId,\n fromGlobalId: fromNode.globalId,\n toGlobalId: toNode.globalId,\n edgeType: edge.edgeType,\n weight: edge.weight,\n confidence: edge.confidence,\n context: edge.context,\n derivationType: edge.derivationType,\n createdBy: edge.createdBy,\n topicId: edge.projectId ? String(edge.projectId) : undefined,\n fromNodeType: fromNode.nodeType,\n toNodeType: toNode.nodeType,\n fromLayer,\n toLayer,\n });\n\n results.push({ globalId: edge.globalId, edgeGlobalId: edge.globalId });\n }\n\n // Update project activity timestamp for delta-based cron gating\n const projectIds = new Set<string>(\n args.edges.flatMap((edge) =>\n typeof edge.projectId === \"string\" ? [edge.projectId] : []\n )\n );\n for (const pid of projectIds) {\n if (pid) {\n await resolveGraphPrimitivesAppResolvers(ctx).patchProject(ctx, pid, {\n lastActivityAt: Date.now(),\n });\n }\n }\n\n return { created: results.length, results, errors };\n },\n});\n\n// =============================================================================\n// TRAVERSAL HELPERS\n// =============================================================================\n\n/**\n * Get the full lineage chain for a node (what it was derived from)\n * Traverses extracted_from and derived_from edges backwards to find sources.\n *\n * Phase 2D: Now supports layer-aware traversal with minLayer/maxLayer constraints\n *\n * Edge semantics:\n * - `Evidence -extracted_from-> Source` means Evidence was extracted from Source\n * - To find lineage, we query edges where current node is fromNodeId (the derived node)\n * and follow toNodeId to find the source/parent nodes\n */\nexport const getLineage = query({\n args: {\n nodeId: v.id(\"epistemicNodes\"),\n maxDepth: v.optional(v.number()),\n // Phase 2D: Layer-aware traversal options\n minLayer: v.optional(v.number()), // 1=L1, 2=L2, 3=L3, 4=L4\n maxLayer: v.optional(v.number()),\n mode: v.optional(\n v.union(\n v.literal(\"anchor_down\"),\n v.literal(\"anchor_up\"),\n v.literal(\"same_layer\"),\n v.literal(\"decision_trace\")\n )\n ),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const maxDepth = args.maxDepth ?? 10;\n const mode: TraversalMode = args.mode ?? \"anchor_down\";\n const minLayer = args.minLayer ?? getDefaultMinLayer(mode);\n const maxLayer = args.maxLayer ?? 4;\n\n const lineage: Array<{\n node: NonNullable<Awaited<ReturnType<typeof ctx.db.get>>>;\n depth: number;\n edgeType: string;\n layer: string; // Phase 2D: Include layer info\n }> = [];\n\n const visited = new Set<string>();\n\n // Get the starting node to check its layer\n const startNode = await ctx.db.get(args.nodeId);\n if (!startNode) {\n return lineage;\n }\n\n const startLayer =\n startNode.epistemicLayer || getNodeLayer(startNode.nodeType);\n\n const queue: Array<{\n nodeId: Id<\"epistemicNodes\">;\n depth: number;\n currentLayer: string;\n }> = [{ nodeId: args.nodeId, depth: 0, currentLayer: startLayer }];\n\n while (queue.length > 0) {\n const current = queue.shift();\n if (!current || current.depth >= maxDepth) {\n continue;\n }\n\n const nodeIdStr = current.nodeId.toString();\n if (visited.has(nodeIdStr)) {\n continue;\n }\n visited.add(nodeIdStr);\n\n // Find edges where this node is the \"from\" (derived/child node)\n // For edges like `Evidence -extracted_from-> Source`, we find Source as the parent\n const edges = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from\", (q) => q.eq(\"fromNodeId\", current.nodeId))\n .collect();\n\n // Filter to lineage-type edges (relationships that indicate provenance)\n const lineageEdges = edges.filter(\n (e) => e.edgeType === \"derived_from\"\n );\n\n for (const edge of lineageEdges) {\n if (!edge.toNodeId) {\n continue;\n }\n const targetNode = await ctx.db.get(edge.toNodeId);\n if (!targetNode || visited.has(edge.toNodeId.toString())) {\n continue;\n }\n\n const targetLayer =\n edge.toLayer ||\n (targetNode as any).epistemicLayer ||\n getNodeLayer((targetNode as any).nodeType);\n\n // Phase 2D: Check layer constraints before traversing\n const shouldContinue = shouldContinueTraversal(\n current.currentLayer as \"L1\" | \"L2\" | \"L3\" | \"L4\" | \"ontological\",\n targetLayer as \"L1\" | \"L2\" | \"L3\" | \"L4\" | \"ontological\",\n { mode, minLayer, maxLayer }\n );\n\n if (!shouldContinue) {\n continue; // Skip this edge due to layer constraints\n }\n\n lineage.push({\n node: targetNode,\n depth: current.depth + 1,\n edgeType: edge.edgeType,\n layer: targetLayer,\n });\n queue.push({\n nodeId: edge.toNodeId,\n depth: current.depth + 1,\n currentLayer: targetLayer,\n });\n }\n }\n\n return lineage;\n },\n});\n\n/**\n * Get all evidence supporting or contradicting a belief\n * Returns structured data for UI display\n * Note: Legacy 'supports'/'contradicts' edges have been migrated to 'informs' with weight\n */\nexport const getEvidenceForBelief = query({\n args: {\n beliefNodeId: v.id(\"epistemicNodes\"),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n // Get all informs edges to this belief\n const informsEdges = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_to_type\", (q) =>\n q.eq(\"toNodeId\", args.beliefNodeId).eq(\"edgeType\", \"informs\")\n )\n .collect();\n\n // Separate by weight\n const supportEdges = informsEdges.filter((e) => (e.weight ?? 0) >= 0);\n const contradictEdges = informsEdges.filter((e) => (e.weight ?? 0) < 0);\n\n // Fetch the actual evidence nodes\n const supportingEvidence = await Promise.all(\n supportEdges.map(async (edge) => ({\n edge,\n node: await ctx.db.get(edge.fromNodeId),\n }))\n );\n\n const contradictingEvidence = await Promise.all(\n contradictEdges.map(async (edge) => ({\n edge,\n node: await ctx.db.get(edge.fromNodeId),\n }))\n );\n\n // Filter out null nodes (deleted or missing references)\n const filteredSupporting = supportingEvidence.filter(\n (e) => e.node !== null\n );\n const filteredContradicting = contradictingEvidence.filter(\n (e) => e.node !== null\n );\n\n return {\n supporting: filteredSupporting,\n contradicting: filteredContradicting,\n supportCount: filteredSupporting.length,\n contradictCount: filteredContradicting.length,\n };\n },\n});\n\n/**\n * Cleanup deprecated edge types from the graph.\n *\n * These edge types were created by the old `createBeliefRelationship` tool\n * before we standardized on `createBeliefConditional` with the 9 proper types.\n *\n * Deprecated types: old generic edges superseded by canonical 6\n */\nexport const cleanupDeprecatedEdges = mutation({\n args: {\n ...optionalScopeArgs,\n dryRun: v.optional(v.boolean()), // If true, just reports what would be deleted\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const DEPRECATED_TYPES = [\n \"contradicts\", // Old generic contradict edge (use weight: -1 on informs)\n ];\n\n // Find all deprecated edges in the project (kernel v2: by_project removed)\n const scopeId = args.topicId || args.projectId;\n const allEdges = scopeId\n ? await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_topic\", (q: any) => q.eq(\"topicId\", scopeId))\n .collect()\n : [];\n\n const deprecatedEdges = allEdges.filter((edge) =>\n DEPRECATED_TYPES.includes(edge.edgeType)\n );\n\n if (args.dryRun) {\n return {\n dryRun: true,\n found: deprecatedEdges.length,\n edges: deprecatedEdges.map((e) => ({\n id: e._id,\n type: e.edgeType,\n from: e.fromNodeId,\n to: e.toNodeId,\n description:\n (e as any).context?.description || (e as any).description,\n })),\n message: `Would delete ${deprecatedEdges.length} deprecated edges`,\n };\n }\n\n // Actually delete them via Neo4j authority path\n for (const edge of deprecatedEdges) {\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.deleteEdge, {\n globalId: edge.globalId,\n });\n await ctx.db.delete(edge._id);\n }\n\n return {\n dryRun: false,\n deleted: deprecatedEdges.length,\n edges: deprecatedEdges.map((e) => ({\n id: e._id,\n type: e.edgeType,\n })),\n message: `Deleted ${deprecatedEdges.length} deprecated edges`,\n };\n },\n});\n\n/**\n * Delete specific edges by ID (for manual cleanup)\n */\nexport const deleteEdges = mutation({\n args: {\n edgeIds: v.array(v.id(\"epistemicEdges\")),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const deleted: string[] = [];\n const notFound: string[] = [];\n\n for (const edgeId of args.edgeIds) {\n const edge = await ctx.db.get(edgeId);\n if (edge) {\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.deleteEdge, {\n globalId: edge.globalId,\n });\n await ctx.db.delete(edgeId);\n deleted.push(edgeId);\n } else {\n notFound.push(edgeId);\n }\n }\n\n return {\n deleted: deleted.length,\n notFound: notFound.length,\n message: `Deleted ${deleted.length} edges, ${notFound.length} not found`,\n };\n },\n});\n\n/**\n * Get all edges between a set of belief IDs (for belief cluster visualization)\n * Returns edges where both source and target are in the provided belief IDs\n */\nexport const getClusterEdges = query({\n args: {\n beliefIds: v.array(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n if (args.beliefIds.length === 0) {\n return [];\n }\n\n const beliefIdSet = new Set(args.beliefIds);\n\n // Get all edges and filter to those within the cluster\n // This is a scan but necessary for flexible matching\n const allEdges = await ctx.db.query(\"epistemicEdges\").collect();\n\n return allEdges.filter((edge) => {\n // Check if both endpoints are in the belief cluster\n const fromInCluster =\n beliefIdSet.has(String(edge.fromNodeId)) ||\n (edge.sourceGlobalId && beliefIdSet.has(edge.sourceGlobalId));\n const toInCluster =\n beliefIdSet.has(String(edge.toNodeId)) ||\n (edge.targetGlobalId && beliefIdSet.has(edge.targetGlobalId));\n\n return fromInCluster && toInCluster;\n });\n },\n});\n\n// =============================================================================\n// INTERNAL MUTATIONS FOR NEO4J DUAL-WRITE\n// These are called from neo4jEdgeAPI.ts (Node.js runtime) to maintain Convex mirror\n// =============================================================================\n\n/**\n * Internal mutation to mirror a Neo4j edge to Convex for reactive UI.\n * Called by createEdge action for edge types that need reactive UI updates.\n *\n * This does NOT replace Neo4j as source of truth - it's a read-optimized mirror\n * for Convex reactive queries used by UI components.\n */\nexport const mirrorEdgeToConvex = internalMutation({\n args: {\n globalId: v.string(),\n fromGlobalId: v.string(),\n toGlobalId: v.string(),\n edgeType: v.string(),\n weight: v.optional(v.number()),\n confidence: v.optional(v.number()),\n context: v.optional(v.string()),\n derivationType: v.optional(v.string()),\n createdBy: v.string(),\n ...optionalScopeArgs,\n fromLayer: v.optional(v.string()),\n toLayer: v.optional(v.string()),\n fromNodeType: v.optional(v.string()),\n toNodeType: v.optional(v.string()),\n // === CLASSIFICATION FIELDS ===\n reasoningMethod: v.optional(v.string()),\n logicalRole: v.optional(v.string()),\n temporalClass: v.optional(v.string()),\n validFrom: v.optional(v.number()),\n validUntil: v.optional(v.number()),\n constraint: v.optional(v.string()),\n propagation: v.optional(v.string()),\n blocking: v.optional(v.boolean()),\n implicit: v.optional(v.boolean()),\n conditionalA: v.optional(subjectiveOpinionValidator),\n conditionalNotA: v.optional(subjectiveOpinionValidator),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n // Resolve source node globalId → Convex ID\n const fromNode = await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_globalId\", (q) => q.eq(\"globalId\", args.fromGlobalId))\n .first();\n\n if (!fromNode) {\n // Source node doesn't exist in Convex - skip mirror\n // This can happen for cross-graph edges (e.g., to Neo4j-only ontology nodes)\n console.log(\n `[Dual-Write] Skipping mirror - source node not in Convex: ${args.fromGlobalId}`\n );\n return { success: false, reason: \"source_not_in_convex\" };\n }\n\n // Resolve target node globalId → Convex ID (optional for cross-graph edges)\n const toNode = await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_globalId\", (q) => q.eq(\"globalId\", args.toGlobalId))\n .first();\n\n // Check if edge already exists (idempotency)\n const existing = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_globalId\", (q) => q.eq(\"globalId\", args.globalId))\n .first();\n\n if (existing) {\n console.log(`[Dual-Write] Edge already exists: ${args.globalId}`);\n return { success: true, edgeId: existing._id, existed: true };\n }\n\n // Insert edge into Convex\n const now = Date.now();\n const edgeId = await ctx.db.insert(\"epistemicEdges\", {\n globalId: args.globalId,\n fromNodeId: fromNode._id,\n toNodeId: toNode?._id, // Optional - may be undefined for cross-graph edges\n sourceGlobalId: args.fromGlobalId,\n targetGlobalId: args.toGlobalId,\n // Cast through any because EdgeType may include types not yet in\n // Convex _generated types (deployed schema lags source schema).\n edgeType: args.edgeType as any,\n weight: args.weight,\n confidence: args.confidence,\n context: args.context,\n derivationType: args.derivationType,\n constraint: args.constraint as\n | \"xor\"\n | \"alternative\"\n | \"counterfactual\"\n | undefined,\n propagation: args.propagation as \"threshold\" | \"continuous\" | undefined,\n blocking: args.blocking,\n implicit: args.implicit,\n conditionalA: args.conditionalA,\n conditionalNotA: args.conditionalNotA,\n createdBy: args.createdBy,\n createdAt: now,\n updatedAt: now,\n topicId: args.projectId as string | undefined,\n fromLayer: args.fromLayer as\n | \"L4\"\n | \"L3\"\n | \"L2\"\n | \"L1\"\n | \"ontological\"\n | undefined,\n toLayer: args.toLayer as\n | \"L4\"\n | \"L3\"\n | \"L2\"\n | \"L1\"\n | \"ontological\"\n | undefined,\n fromNodeType: args.fromNodeType,\n toNodeType: args.toNodeType,\n // Classification fields\n reasoningMethod: args.reasoningMethod as\n | \"deductive\"\n | \"causal\"\n | \"inductive\"\n | \"abductive\"\n | \"statistical\"\n | \"analogical\"\n | \"correlational\"\n | \"testimonial\"\n | \"implicit\"\n | \"pattern_match\"\n | undefined,\n logicalRole: args.logicalRole as\n | \"necessary\"\n | \"sufficient\"\n | \"necessary_sufficient\"\n | \"contributory\"\n | \"corroborative\"\n | undefined,\n temporalClass: args.temporalClass as\n | \"structural\"\n | \"cyclical\"\n | \"transient\"\n | \"point_in_time\"\n | undefined,\n validFrom: args.validFrom,\n validUntil: args.validUntil,\n });\n\n console.log(\n `[Dual-Write] Mirrored edge to Convex: ${args.globalId} (${args.edgeType})`\n );\n return { success: true, edgeId, existed: false };\n },\n});\n\n/**\n * Internal mutation to delete a mirrored edge from Convex.\n * Called by deleteEdge action to maintain Convex mirror consistency.\n */\nexport const deleteEdgeFromConvex = internalMutation({\n args: {\n globalId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const existing = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_globalId\", (q) => q.eq(\"globalId\", args.globalId))\n .first();\n\n if (!existing) {\n return { success: false, reason: \"not_found\" };\n }\n\n await ctx.db.delete(existing._id);\n console.log(`[Dual-Write] Deleted edge from Convex: ${args.globalId}`);\n return { success: true };\n },\n});\n\n/**\n * Internal mutation to update a mirrored edge in Convex.\n * Called by updateEdge action to maintain Convex mirror consistency.\n */\nexport const updateEdgeInConvex = internalMutation({\n args: {\n globalId: v.string(),\n weight: v.optional(v.number()),\n confidence: v.optional(v.number()),\n context: v.optional(v.string()),\n derivationType: v.optional(v.string()),\n constraint: v.optional(v.string()),\n propagation: v.optional(v.string()),\n blocking: v.optional(v.boolean()),\n implicit: v.optional(v.boolean()),\n conditionalA: v.optional(subjectiveOpinionValidator),\n conditionalNotA: v.optional(subjectiveOpinionValidator),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const existing = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_globalId\", (q) => q.eq(\"globalId\", args.globalId))\n .first();\n\n if (!existing) {\n return { success: false, reason: \"not_found\" };\n }\n\n const updates: Record<string, unknown> = {\n updatedAt: Date.now(),\n };\n\n if (args.weight !== undefined) {\n updates.weight = args.weight;\n }\n if (args.confidence !== undefined) {\n updates.confidence = args.confidence;\n }\n if (args.context !== undefined) {\n updates.context = args.context;\n }\n if (args.derivationType !== undefined) {\n updates.derivationType = args.derivationType;\n }\n if (args.constraint !== undefined) {\n updates.constraint = args.constraint;\n }\n if (args.propagation !== undefined) {\n updates.propagation = args.propagation;\n }\n if (args.blocking !== undefined) {\n updates.blocking = args.blocking;\n }\n if (args.implicit !== undefined) {\n updates.implicit = args.implicit;\n }\n if (args.conditionalA !== undefined) {\n updates.conditionalA = args.conditionalA;\n }\n if (args.conditionalNotA !== undefined) {\n updates.conditionalNotA = args.conditionalNotA;\n }\n\n await ctx.db.patch(existing._id, updates);\n console.log(`[Dual-Write] Updated edge in Convex: ${args.globalId}`);\n\n return { success: true };\n },\n});\n"]}
|
|
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","../../../packages/contracts/src/schema-helpers/validators.ts","../src/convex.ts","../src/graphTypes.ts","../src/edgeValidation.ts","../src/topicProjectOverlay.ts","../src/resolvers.ts","../src/topicScope.ts","../src/epistemicEdges.ts"],"names":["resolvedUser","user","api","anyApi","componentsGeneric","internalMutationGeneric","mutationGeneric","queryGeneric","LEGACY_SCOPE_FIELD","readNonEmptyString","readStringArray","readMetadata","readLegacyProjectId","coerceVisibility","coerceStatus","mapProjectType","isProjectLikeTopic","resolveTopicDoc","materializeTopicProjectOverlay","resolveTopicProjectOverlay","listTopicProjectOverlays","isMissingLucernChildComponentError","defaultResolvers","resolverOverrides","v","query"],"mappings":"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","file":"epistemicEdges.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","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 * Graph Type Registry for Convex\n *\n * This file mirrors the canonical type registry at lib/ontology/types.ts\n * but is compatible with Convex's bundling requirements.\n *\n * IMPORTANT: Keep this file in sync with lib/ontology/types.ts\n * The frontend uses lib/ontology/types.ts, Convex uses this file.\n *\n * @see /docs/architecture/UNIFIED_GRAPH_ARCHITECTURE.md\n */\n\n// =============================================================================\n// EPISTEMIC LAYERS\n// =============================================================================\n\nexport type EpistemicLayer =\n | \"L4\"\n | \"L3\"\n | \"L2\"\n | \"L1\"\n | \"ontological\"\n | \"organizational\";\n\n// =============================================================================\n// NODE TYPE TO LABEL MAPPING\n// =============================================================================\n\nexport const NODE_TYPE_TO_LABEL: Record<string, string> = {\n // L4: Audit Targets\n decision: \"Decision\",\n\n // L3: Traversal Anchors\n belief: \"Belief\",\n question: \"Question\",\n theme: \"Theme\",\n deal: \"Deal\",\n topic: \"Topic\",\n\n // L2: Compression Boundary\n claim: \"Claim\",\n evidence: \"Evidence\",\n synthesis: \"Synthesis\",\n answer: \"Answer\",\n\n // L1: Terminal Leaves\n atomic_fact: \"AtomicFact\",\n excerpt: \"Excerpt\",\n source: \"Source\",\n\n // Ontological (Neo4j is SOT)\n company: \"Company\",\n person: \"Person\",\n investor: \"Investor\",\n function: \"Function\",\n value_chain: \"ValueChain\",\n};\n\n// =============================================================================\n// EDGE TYPE TO NEO4J RELATIONSHIP MAPPING\n// =============================================================================\n\n/**\n * Epistemic Kernel v2: 6 canonical edge types + ontological edges.\n *\n * Weight and metadata carry nuance that previously required 67 separate type strings.\n * See: docs/architecture/epistemic-kernel-v2.md\n */\nexport const EDGE_TYPE_TO_REL: Record<string, string> = {\n // === THE SIX CANONICAL EPISTEMIC EDGE TYPES ===\n supports: \"SUPPORTS\", // L3↔L3: belief bears on belief (weight -1 to +1)\n informs: \"INFORMS\", // L2→L3: evidence bears on belief\n depends_on: \"DEPENDS_ON\", // L3→L3, Q→Q: structural gate\n derived_from: \"DERIVED_FROM\", // Any→Any: provenance chain (fork, synthesis, extraction, answer)\n contains: \"CONTAINS\", // Any→Any: hierarchy, scoping, membership\n tests: \"TESTS\", // Q→L3: question interrogates belief\n\n // === L4 DECISION EDGES (derived_from with derivationType=decision) ===\n // Kept as separate Neo4j relationship types for backward compat with L4 queries.\n // New code should use derived_from + metadata.\n based_on_belief: \"BASED_ON_BELIEF\",\n based_on_question: \"BASED_ON_QUESTION\",\n blocked_by_contradiction: \"BLOCKED_BY_CONTRADICTION\",\n informed_by_theme: \"INFORMED_BY_THEME\",\n\n // === ONTOLOGICAL EDGES (tenant-extensible, managed by ontology system) ===\n works_at: \"WORKS_AT\",\n invested_in: \"INVESTED_IN\",\n competes_with: \"COMPETES_WITH\",\n participates_in: \"PARTICIPATES_IN\",\n founded_by: \"FOUNDED_BY\",\n evaluates: \"EVALUATES\",\n performs: \"PERFORMS\",\n function_in: \"FUNCTION_IN\",\n impacts: \"IMPACTS\",\n raised_from: \"RAISED_FROM\",\n mentioned_in: \"MENTIONED_IN\",\n perspective_on: \"PERSPECTIVE_ON\",\n about_entity: \"ABOUT_ENTITY\",\n entity_referenced_in: \"ENTITY_REFERENCED_IN\",\n};\n\n// =============================================================================\n// HELPER FUNCTIONS\n// =============================================================================\n\n/**\n * Get the epistemic layer for a node type\n */\nexport function getNodeLayer(nodeType: string): EpistemicLayer {\n const L4_TYPES = [\"decision\"];\n const L3_TYPES = [\"belief\", \"question\", \"theme\", \"deal\"];\n const L2_TYPES = [\"claim\", \"evidence\", \"synthesis\", \"answer\"];\n const L1_TYPES = [\"atomic_fact\", \"excerpt\", \"source\"];\n const ONTOLOGICAL_TYPES = [\n \"company\",\n \"person\",\n \"investor\",\n \"function\",\n \"value_chain\",\n ];\n const ORGANIZATIONAL_TYPES = [\"topic\"];\n\n if (L4_TYPES.includes(nodeType)) {\n return \"L4\";\n }\n if (L3_TYPES.includes(nodeType)) {\n return \"L3\";\n }\n if (L2_TYPES.includes(nodeType)) {\n return \"L2\";\n }\n if (L1_TYPES.includes(nodeType)) {\n return \"L1\";\n }\n if (ONTOLOGICAL_TYPES.includes(nodeType)) {\n return \"ontological\";\n }\n if (ORGANIZATIONAL_TYPES.includes(nodeType)) {\n return \"organizational\";\n }\n\n // Unknown types default to L2\n console.warn(`[GraphTypes] Unknown nodeType \"${nodeType}\", defaulting to L2`);\n return \"L2\";\n}\n\n/**\n * Get the Neo4j label for a node type\n */\nexport function getNeo4jLabel(nodeType: string): string {\n return (\n NODE_TYPE_TO_LABEL[nodeType] ||\n nodeType.charAt(0).toUpperCase() + nodeType.slice(1)\n );\n}\n\n/**\n * Get the Neo4j relationship type for an edge type\n */\nexport function getNeo4jRelType(edgeType: string): string {\n return EDGE_TYPE_TO_REL[edgeType] || edgeType.toUpperCase();\n}\n\n/**\n * The 6 canonical epistemic edge types (Kernel v2).\n * Anything not in this set or the ontological/L4 sets is deprecated.\n */\nconst CANONICAL_EPISTEMIC_TYPES = new Set([\n \"supports\",\n \"informs\",\n \"depends_on\",\n \"derived_from\",\n \"contains\",\n \"tests\",\n]);\n\n/**\n * Check if an edge type is deprecated.\n *\n * Kernel v2: only the 6 canonical epistemic types, L4 decision types,\n * and ontological types are active. All legacy types (67 old types) are deprecated.\n */\nexport function isDeprecatedEdgeType(edgeType: string): boolean {\n // Canonical epistemic types are NOT deprecated\n if (CANONICAL_EPISTEMIC_TYPES.has(edgeType)) return false;\n // Types in the EDGE_TYPE_TO_REL map (ontological + L4) are NOT deprecated\n if (edgeType in EDGE_TYPE_TO_REL) return false;\n // Everything else is a legacy type\n return true;\n}\n","/**\n * edgeValidation module implementation.\n */\n\nimport { type EpistemicLayer, isDeprecatedEdgeType } from \"./graphTypes\";\n\nexport { isDeprecatedEdgeType };\nexport type { EpistemicLayer };\n\nfunction getLayerDepth(layer: EpistemicLayer): number {\n switch (layer) {\n case \"L4\":\n return 4;\n case \"L3\":\n return 3;\n case \"L2\":\n return 2;\n case \"L1\":\n return 1;\n case \"ontological\":\n return 0;\n default:\n return -1;\n }\n}\n\nfunction isValidLayerConnection(\n fromLayer: EpistemicLayer,\n toLayer: EpistemicLayer\n): boolean {\n if (fromLayer === toLayer) {\n return true;\n }\n\n // Ontological ↔ ontological (entity-entity edges)\n if (fromLayer === \"ontological\" && toLayer === \"ontological\") {\n return true;\n }\n\n // Ontological ↔ epistemic bridge (OE-B: entity-belief/evidence/source connections)\n if (\n fromLayer === \"ontological\" &&\n (toLayer === \"L3\" || toLayer === \"L2\" || toLayer === \"L1\")\n ) {\n return true;\n }\n if (\n (fromLayer === \"L3\" || fromLayer === \"L2\" || fromLayer === \"L1\") &&\n toLayer === \"ontological\"\n ) {\n return true;\n }\n\n // Epistemic layer transitions\n if (fromLayer === \"L2\" && toLayer === \"L1\") {\n return true;\n }\n if (fromLayer === \"L2\" && toLayer === \"L3\") {\n return true;\n }\n if (fromLayer === \"L3\" && toLayer === \"L2\") {\n return true;\n }\n if (fromLayer === \"L3\" && toLayer === \"L4\") {\n return true;\n }\n if (fromLayer === \"L4\" && toLayer === \"L3\") {\n return true;\n }\n\n // Organizational connections\n if (fromLayer === \"L3\" && toLayer === \"organizational\") {\n return true;\n }\n if (fromLayer === \"organizational\" && toLayer === \"L3\") {\n return true;\n }\n\n const fromDepth = getLayerDepth(fromLayer);\n const toDepth = getLayerDepth(toLayer);\n if (Math.abs(fromDepth - toDepth) > 1) {\n return false;\n }\n return true;\n}\n\nexport type TraversalMode =\n | \"anchor_down\"\n | \"anchor_up\"\n | \"same_layer\"\n | \"decision_trace\";\n\nexport function shouldContinueTraversal(\n currentLayer: EpistemicLayer,\n targetLayer: EpistemicLayer,\n options: {\n mode: TraversalMode;\n minLayer?: number;\n maxLayer?: number;\n }\n): boolean {\n const currentDepth = getLayerDepth(currentLayer);\n const targetDepth = getLayerDepth(targetLayer);\n\n if (options.minLayer !== undefined && targetDepth < options.minLayer) {\n return false;\n }\n if (options.maxLayer !== undefined && targetDepth > options.maxLayer) {\n return false;\n }\n\n switch (options.mode) {\n case \"anchor_down\":\n return targetDepth <= currentDepth;\n case \"anchor_up\":\n return targetDepth >= currentDepth;\n case \"same_layer\":\n return targetDepth === currentDepth;\n case \"decision_trace\":\n return currentDepth === 4\n ? targetDepth === 3\n : targetDepth === currentDepth;\n default:\n return true;\n }\n}\n\nexport function getDefaultMinLayer(mode: TraversalMode): number {\n switch (mode) {\n case \"anchor_down\":\n return 1;\n case \"anchor_up\":\n return 2;\n case \"same_layer\":\n return 1;\n case \"decision_trace\":\n return 3;\n default:\n return 1;\n }\n}\n\nexport const EDGE_LAYER_RULES: Record<\n string,\n { from: EpistemicLayer[]; to: EpistemicLayer[]; description: string }\n> = {\n // === 6 Canonical Epistemic Types ===\n supports: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Belief bears on Belief (weight: +1 supports, -1 contradicts)\",\n },\n informs: {\n from: [\"L2\"],\n to: [\"L3\"],\n description: \"Evidence -> Belief (L2 -> L3)\",\n },\n depends_on: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Belief B requires Belief A (structural gate)\",\n },\n derived_from: {\n from: [\"L2\", \"L3\", \"L4\"],\n to: [\"L1\", \"L2\", \"L3\"],\n description: \"A was produced from B (provenance chain)\",\n },\n contains: {\n from: [\"L3\", \"L4\", \"ontological\"],\n to: [\"L2\", \"L3\", \"ontological\"],\n description: \"A scopes/aggregates B (hierarchy)\",\n },\n tests: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Question -> Belief (L3 -> L3)\",\n },\n\n // === Structural / Lifecycle ===\n supersedes: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"NewNode -> OldNode (fork lineage)\",\n },\n responds_to: {\n from: [\"L2\", \"L3\"],\n to: [\"L3\"],\n description: \"Answer -> Question (L2/L3 -> L3)\",\n },\n belongs_to: {\n from: [\"L2\", \"L3\", \"ontological\"],\n to: [\"L3\"],\n description: \"Membership (migrating to contains)\",\n },\n relates_to_thesis: {\n from: [\"L3\"],\n to: [\"L3\"],\n description: \"Belief -> Theme (L3 -> L3)\",\n },\n\n // === Ontological (entity-entity or entity-epistemic bridge) ===\n works_at: {\n from: [\"ontological\"],\n to: [\"ontological\"],\n description: \"Person -> Company\",\n },\n invested_in: {\n from: [\"ontological\"],\n to: [\"ontological\"],\n description: \"Investor -> Company\",\n },\n competes_with: {\n from: [\"ontological\"],\n to: [\"ontological\"],\n description: \"Company -> Company\",\n },\n participates_in: {\n from: [\"ontological\"],\n to: [\"ontological\"],\n description: \"Company -> ValueChain\",\n },\n founded_by: {\n from: [\"ontological\"],\n to: [\"ontological\"],\n description: \"Company -> Person\",\n },\n evaluates: {\n from: [\"ontological\"],\n to: [\"ontological\"],\n description: \"Deal -> Company\",\n },\n performs: {\n from: [\"ontological\"],\n to: [\"ontological\"],\n description: \"Company -> Function\",\n },\n function_in: {\n from: [\"ontological\"],\n to: [\"ontological\"],\n description: \"Function -> ValueChain\",\n },\n impacts: {\n from: [\"ontological\", \"L3\"],\n to: [\"ontological\"],\n description: \"Theme/Entity -> ValueChain\",\n },\n raised_from: {\n from: [\"ontological\"],\n to: [\"ontological\"],\n description: \"Company -> Investor\",\n },\n mentioned_in: {\n from: [\"ontological\"],\n to: [\"L1\", \"L2\"],\n description: \"Entity -> Source/Evidence\",\n },\n perspective_on: {\n from: [\"ontological\"],\n to: [\"L3\"],\n description: \"Person -> Belief/Theme\",\n },\n plays_theme: {\n from: [\"ontological\"],\n to: [\"L3\"],\n description: \"Deal -> Theme\",\n },\n};\n\nexport function validateEdgeLayers(\n edgeType: string,\n fromLayer: EpistemicLayer,\n toLayer: EpistemicLayer\n): { valid: boolean; reason?: string } {\n const rules = EDGE_LAYER_RULES[edgeType];\n\n if (!rules) {\n console.warn(\n `[EdgeValidation] Unknown edge type: ${edgeType}, allowing by default`\n );\n return { valid: true };\n }\n\n if (edgeType === \"supersedes\") {\n if (fromLayer !== toLayer) {\n return {\n valid: false,\n reason: `${edgeType} edges must be between nodes of the same layer. Got ${fromLayer} -> ${toLayer}`,\n };\n }\n return { valid: true };\n }\n\n if (!rules.from.includes(fromLayer)) {\n return {\n valid: false,\n reason: `Edge type '${edgeType}' does not allow source layer ${fromLayer}. Allowed: ${rules.from.join(\", \")}`,\n };\n }\n\n if (!rules.to.includes(toLayer)) {\n return {\n valid: false,\n reason: `Edge type '${edgeType}' does not allow target layer ${toLayer}. Allowed: ${rules.to.join(\", \")}`,\n };\n }\n\n if (!isValidLayerConnection(fromLayer, toLayer)) {\n return {\n valid: false,\n reason: `Layer transition ${fromLayer} -> ${toLayer} is not permitted`,\n };\n }\n\n return { valid: true };\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 * Epistemic Edges - CRUD operations for the knowledge graph relationships\n *\n * Every \"supports\", \"contradicts\", \"derived_from\" relationship in StackOS is an edge.\n * Edges connect epistemic nodes and carry metadata about the relationship.\n *\n * @see /docs/architecture/EPISTEMIC_SPINE.md\n */\n\nimport { v } from \"convex/values\";\nimport {\n checkProjectAccess,\n checkScopeAccess,\n requireProjectAccess,\n} from \"@lucern/access-control/access\";\nimport { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\nimport type { Id } from \"./convex\";\nimport { internal, internalMutation, mutation, query } from \"./convex\";\nimport {\n getDefaultMinLayer,\n shouldContinueTraversal,\n type TraversalMode,\n validateEdgeLayers,\n} from \"./edgeValidation\";\nimport { getNodeLayer, isDeprecatedEdgeType } from \"./graphTypes\";\nimport { resolveGraphPrimitivesAppResolvers } from \"./resolvers\";\nimport { optionalScopeArgs, resolveTopicProjectScope } from \"./topicScope\";\n\n// =============================================================================\n// TYPES (Phase 2A: Layer Architecture Compliant)\n// =============================================================================\n\n/**\n * Epistemic Layer Validator for edges\n */\nexport const epistemicLayerValidator = v.union(\n v.literal(\"L4\"),\n v.literal(\"L3\"),\n v.literal(\"L2\"),\n v.literal(\"L1\"),\n v.literal(\"ontological\"),\n v.literal(\"organizational\")\n);\n\nconst subjectiveOpinionValidator = v.object({\n b: v.number(),\n d: v.number(),\n u: v.number(),\n a: v.number(),\n});\n\nexport const edgeTypeValidator = v.union(\n // --- L4 Decision Edges (Phase 2A) ---\n v.literal(\"based_on_belief\"), // Decision → Belief (L4 → L3)\n v.literal(\"based_on_question\"), // Decision → Question (L4 → L3)\n v.literal(\"blocked_by_contradiction\"), // Decision → Contradiction (L4 → L3)\n v.literal(\"informed_by_theme\"), // Decision → Theme (L4 → L3)\n\n // --- Evidence Flow (L2 → L3, L2 → L1) ---\n v.literal(\"derived_from\"), // Evidence/Synthesis → Source/Question (provenance)\n v.literal(\"responds_to\"), // Answer → Question (L2 → L3)\n v.literal(\"informs\"), // Evidence → Belief (L2 → L3) - use weight: -1 to +1\n v.literal(\"tests\"), // Question → Belief (L3 → L3)\n v.literal(\"explores\"), // Question → Belief assumption (L3 → L3)\n v.literal(\"qualifies\"), // Evidence → Belief (L2 → L3)\n\n // --- Synthesis (L2 → L2, L2 → L1) ---\n // \"based_on\" removed — use \"derived_from\" instead\n\n // --- Theme Relationships (L3 → L3) ---\n v.literal(\"relates_to_thesis\"), // Belief → Theme (L3 → L3) - use weight: -1 to +1\n v.literal(\"belongs_to\"), // Any → Theme (? → L3)\n v.literal(\"plays_theme\"), // Deal → Theme (L3 → L3)\n v.literal(\"scoped_by\"), // Belief/Question → Topic (L3 → organizational)\n\n // --- Deal/Company ---\n v.literal(\"evaluates\"), // Deal → Company (L3 → ontological)\n\n // --- People (ontological → ontological, ontological → L3) ---\n v.literal(\"perspective_on\"), // Person → Belief/Theme\n v.literal(\"works_at\"), // Person → Company/Investor\n v.literal(\"mentioned_in\"), // Person/Company → Source (ontological → L1)\n v.literal(\"founded_by\"), // Company → Person (ontological → ontological)\n\n // --- Value Chain (ontological → ontological) ---\n v.literal(\"participates_in\"), // Company → ValueChain\n v.literal(\"performs\"), // Company → Function\n v.literal(\"function_in\"), // Function → ValueChain\n v.literal(\"impacts\"), // Theme → ValueChain (L3 → ontological)\n\n // --- Investment (ontological → ontological) ---\n v.literal(\"invested_in\"), // Investor → Company\n v.literal(\"raised_from\"), // Company → Investor\n\n // --- Lifecycle (same layer only) ---\n v.literal(\"supersedes\"), // NewNode → OldNode (same layer)\n v.literal(\"same_as\"), // Duplicate detection (same layer)\n\n // --- Same-Type Relationships: Belief ↔ Belief (L3 → L3) ---\n v.literal(\"depends_on\"), // Belief B requires Belief A to be true\n v.literal(\"supports\"), // Beliefs strengthen each other (weight > 0)\n v.literal(\"contains\"), // Parent contains child (hierarchical containment)\n\n // --- Belief Cluster Mapping (L3 → L3) - For Thesis Validation Sprints ---\n // These edge types capture the full range of belief-to-belief relationships\n // needed for cluster mapping, confidence propagation, and thesis testing.\n v.literal(\"counterfactual_of\"), // If A is TRUE, B FAILS (inverse dependency)\n v.literal(\"cascade_to\"), // If B fails, A also fails (downstream impact)\n v.literal(\"cascade_from\"), // Changes propagate from A to B (upstream dependency)\n v.literal(\"mutually_exclusive\"), // A and B cannot BOTH be true (zero-sum)\n v.literal(\"correlates_with\"), // A and B move together non-causally (observed pattern)\n v.literal(\"amplifies\"), // A strengthens B unidirectionally (one-way boost)\n v.literal(\"precondition_for\"), // A must validate before B can be tested (temporal)\n v.literal(\"in_tension_with\"), // A and B pull opposite directions (soft conflict)\n\n // --- Belief ↔ Belief: Epistemic Impact (Confidence Propagation) ---\n v.literal(\"falsified_by\"), // If B is validated, A becomes false\n v.literal(\"exclusive_with\"), // A XOR B (sum of confidences ≤ 1)\n v.literal(\"contradicts\"), // A directly contradicts B\n v.literal(\"collapses_if\"), // If A falls below threshold, B collapses\n v.literal(\"strengthened_by\"), // If A rises, B rises\n v.literal(\"weakened_by\"), // If A rises, B falls\n v.literal(\"alternative_to\"), // Competing explanations\n v.literal(\"subsumes\"), // A is more general, includes B\n v.literal(\"validated_by\"), // If B is true, A gains confidence\n v.literal(\"required_for\"), // A must be true for B to be meaningful\n v.literal(\"blocks\"), // A being unresolved blocks B\n\n // --- Same-Type Relationships: Question ↔ Question (L3 → L3) ---\n v.literal(\"prerequisite_for\"), // Question A must be answered first\n v.literal(\"parallel_to\"), // Same topic, different angles\n\n // --- Same-Type Relationships: Evidence ↔ Evidence (L2 → L2) ---\n v.literal(\"corroborates\"), // Independent support for same conclusion\n v.literal(\"extends\"), // Adds depth to other evidence\n v.literal(\"same_source_as\"), // Same document/study\n v.literal(\"same_theme_as\"), // Same topic/entity\n\n // --- NEW: Deep Epistemic Analysis Edges (Phase: Schema Upgrade) ---\n v.literal(\"assumes\"), // Hidden dependency discovered by AI (Belief B implicitly assumes A)\n v.literal(\"would_predict\"), // Pre-registered prediction for validation (If Belief true, expect Evidence)\n v.literal(\"analogous_to\"), // Explicit analogy with disanalogies (Belief A like Belief B because...)\n v.literal(\"independent_of\"), // True evidence independence marker (Evidence A independent of B)\n\n // --- Entity↔Belief Bridge (OE-B) ---\n // \"about_entity\" and \"entity_referenced_in\" removed — use \"contains\" instead\n v.literal(\"competes_with\") // Company → Company (ontological → ontological)\n);\n\n// =============================================================================\n// QUERIES\n// =============================================================================\n\n/**\n * Get a single edge by ID\n */\nexport const get = query({\n args: { edgeId: v.id(\"epistemicEdges\") },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n return await ctx.db.get(args.edgeId);\n },\n});\n\n/**\n * Get an edge by its global UUID\n */\nexport const getByGlobalId = query({\n args: { globalId: v.string() },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n return await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_globalId\", (q) => q.eq(\"globalId\", args.globalId))\n .first();\n },\n});\n\n/**\n * Get all edges FROM a specific node\n */\nexport const getFromNode = query({\n args: {\n fromNodeId: v.id(\"epistemicNodes\"),\n edgeType: v.optional(edgeTypeValidator),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const { edgeType } = args;\n if (edgeType) {\n return await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from_type\", (q) =>\n q.eq(\"fromNodeId\", args.fromNodeId).eq(\"edgeType\", edgeType as any)\n )\n .collect();\n }\n\n return await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from\", (q) => q.eq(\"fromNodeId\", args.fromNodeId))\n .collect();\n },\n});\n\n/**\n * Get all edges TO a specific node\n */\nexport const getToNode = query({\n args: {\n toNodeId: v.id(\"epistemicNodes\"),\n edgeType: v.optional(edgeTypeValidator),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const { edgeType } = args;\n if (edgeType) {\n return await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_to_type\", (q) =>\n q.eq(\"toNodeId\", args.toNodeId).eq(\"edgeType\", edgeType as any)\n )\n .collect();\n }\n\n return await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_to\", (q) => q.eq(\"toNodeId\", args.toNodeId))\n .collect();\n },\n});\n\n/**\n * Get edges pointing FROM a node (by any string ID - for backward compat)\n * This is a more flexible version of getFromNode that accepts any string ID\n *\n * Performance: Uses indexes where possible, falls back to globalId search only when needed\n */\nexport const getBySourceNode = query({\n args: {\n sourceNodeId: v.string(),\n edgeType: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n // First, try to use the indexed query if it's a valid epistemicNodes ID\n const isConvexId =\n args.sourceNodeId.length === 32 ||\n args.sourceNodeId.includes(\"epistemicNodes\");\n\n if (isConvexId) {\n // Use indexed query for Convex IDs\n const query = args.edgeType\n ? ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from_type\", (q) =>\n q\n .eq(\"fromNodeId\", args.sourceNodeId as Id<\"epistemicNodes\">)\n .eq(\"edgeType\", args.edgeType as any)\n )\n : ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from\", (q) =>\n q.eq(\"fromNodeId\", args.sourceNodeId as Id<\"epistemicNodes\">)\n );\n\n return await query.collect();\n }\n\n // For globalIds, use the sourceGlobalId index\n const byGlobalId = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_source_global_id\", (q) =>\n q.eq(\"sourceGlobalId\", args.sourceNodeId)\n )\n .collect();\n\n if (args.edgeType) {\n return byGlobalId.filter((edge) => edge.edgeType === args.edgeType);\n }\n return byGlobalId;\n },\n});\n\n/**\n * Get edges pointing TO a node (by any string ID - for backward compat)\n * This is a more flexible version of getToNode that accepts any string ID\n *\n * Performance: Uses indexes where possible, falls back to globalId search only when needed\n */\nexport const getByTargetNode = query({\n args: {\n targetNodeId: v.string(),\n edgeType: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n // First, try to use the indexed query if it's a valid epistemicNodes ID\n const isConvexId =\n args.targetNodeId.length === 32 ||\n args.targetNodeId.includes(\"epistemicNodes\");\n\n if (isConvexId) {\n // Use indexed query for Convex IDs\n const query = args.edgeType\n ? ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_to_type\", (q) =>\n q\n .eq(\"toNodeId\", args.targetNodeId as Id<\"epistemicNodes\">)\n .eq(\"edgeType\", args.edgeType as any)\n )\n : ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_to\", (q) =>\n q.eq(\"toNodeId\", args.targetNodeId as Id<\"epistemicNodes\">)\n );\n\n return await query.collect();\n }\n\n // For globalIds, use the targetGlobalId index\n const byGlobalId = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_target_global_id\", (q) =>\n q.eq(\"targetGlobalId\", args.targetNodeId)\n )\n .collect();\n\n if (args.edgeType) {\n return byGlobalId.filter((edge) => edge.edgeType === args.edgeType);\n }\n return byGlobalId;\n },\n});\n\n/**\n * Get edge between two specific nodes (returns array)\n */\nexport const getBetween = query({\n args: {\n fromNodeId: v.id(\"epistemicNodes\"),\n toNodeId: v.id(\"epistemicNodes\"),\n edgeType: v.optional(edgeTypeValidator),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const edges = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from_to\", (q) =>\n q.eq(\"fromNodeId\", args.fromNodeId).eq(\"toNodeId\", args.toNodeId)\n )\n .collect();\n\n if (args.edgeType) {\n return edges.filter((e) => e.edgeType === args.edgeType);\n }\n\n return edges;\n },\n});\n\n/**\n * Get first edge between two specific nodes (returns single edge or null)\n * Used by findEvidencePath for direct edge checking\n */\nexport const getByNodes = query({\n args: {\n fromNodeId: v.id(\"epistemicNodes\"),\n toNodeId: v.id(\"epistemicNodes\"),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n return await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from_to\", (q) =>\n q.eq(\"fromNodeId\", args.fromNodeId).eq(\"toNodeId\", args.toNodeId)\n )\n .first();\n },\n});\n\n/**\n * Get all edges of a specific type for a project\n */\nexport const getByProjectAndType = query({\n args: {\n ...optionalScopeArgs,\n edgeType: edgeTypeValidator,\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n if (!args.projectId && !args.topicId) {\n return [];\n }\n\n let scope: Awaited<ReturnType<typeof resolveTopicProjectScope>>;\n try {\n scope = await resolveTopicProjectScope(ctx, {\n projectId: args.projectId,\n topicId: args.topicId,\n });\n } catch {\n return [];\n }\n\n const projectEdges = await collectScopedEdges(ctx, scope, 5000);\n\n return projectEdges\n .filter(\n (e) =>\n e.edgeType === args.edgeType &&\n edgeMatchesWorkspaceReasoningScope(e, scope)\n )\n .slice(0, 5000);\n },\n});\n\n/**\n * Get all edges for a project\n */\nexport const getByProject = query({\n args: {\n ...optionalScopeArgs,\n userId: v.optional(v.string()),\n limit: v.optional(v.number()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n if (!args.projectId && !args.topicId) {\n return [];\n }\n\n let scope: Awaited<ReturnType<typeof resolveTopicProjectScope>>;\n try {\n scope = await resolveTopicProjectScope(ctx, {\n projectId: args.projectId,\n topicId: args.topicId,\n });\n } catch {\n return [];\n }\n\n // userId is optional — if not provided, skip access check (internal/dev callers)\n if (args.userId) {\n const hasAccess = await checkScopeAccess(\n ctx,\n String(scope.topicId ?? scope.projectId),\n args.userId\n );\n if (!hasAccess) {\n return [];\n }\n }\n const pageSize = Math.max(1, Math.min(Math.floor(args.limit ?? 500), 2000));\n\n const edges = await collectScopedEdges(ctx, scope, Math.min(pageSize * 3, 6000));\n return edges\n .filter((edge) => edgeMatchesWorkspaceReasoningScope(edge, scope))\n .slice(0, pageSize);\n },\n});\n\nexport const getByTopic = getByProject;\n\ntype WorkspaceEdgeScope = Awaited<ReturnType<typeof resolveTopicProjectScope>>;\ntype WorkspaceScopedEdge = {\n _id: Id<\"epistemicEdges\">;\n topicId?: Id<\"topics\">;\n projectId?: string;\n edgeType: string;\n};\n\nfunction dedupeWorkspaceEdges<T extends { _id: unknown }>(edges: T[]): T[] {\n const seen = new Set<string>();\n const deduped: T[] = [];\n\n for (const edge of edges) {\n const key = String(edge._id);\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n deduped.push(edge);\n }\n\n return deduped;\n}\n\nfunction edgeMatchesWorkspaceReasoningScope(\n edge: Pick<WorkspaceScopedEdge, \"topicId\" | \"projectId\">,\n scope: WorkspaceEdgeScope\n): boolean {\n return (\n (scope.topicId !== undefined && edge.topicId === scope.topicId) ||\n (scope.projectId !== undefined && edge.projectId === scope.projectId)\n );\n}\n\nasync function collectScopedEdges(\n ctx: Parameters<typeof checkScopeAccess>[0],\n scope: WorkspaceEdgeScope,\n scanLimit: number\n): Promise<WorkspaceScopedEdge[]> {\n const queries: Promise<WorkspaceScopedEdge[]>[] = [];\n\n if (scope.topicId) {\n queries.push(\n ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_topic\", (q: any) => q.eq(\"topicId\", scope.topicId))\n .order(\"desc\")\n .take(scanLimit) as Promise<WorkspaceScopedEdge[]>\n );\n }\n\n // Kernel v2: also check edges scoped to projectId (many edges still have\n // topicId=s97 scope while UI passes projectId=n97). Query both to catch all.\n if (scope.projectId) {\n queries.push(\n ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_topic\", (q: any) => q.eq(\"topicId\", scope.projectId))\n .order(\"desc\")\n .take(scanLimit) as Promise<WorkspaceScopedEdge[]>\n );\n }\n\n return dedupeWorkspaceEdges((await Promise.all(queries)).flat());\n}\n\n/**\n * List all edges (unscoped — for internal dev tools).\n * No project filtering, no access control.\n */\nexport const listAll = query({\n args: {\n limit: v.optional(v.number()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const pageSize = Math.max(\n 1,\n Math.min(Math.floor(args.limit ?? 5000), 10_000)\n );\n return await ctx.db.query(\"epistemicEdges\").order(\"desc\").take(pageSize);\n },\n});\n\n/**\n * Find contradictions: evidence that contradicts a belief (informs with weight < 0)\n * Note: Legacy 'contradicts' edges have been migrated to 'informs' with negative weight\n */\nexport const findContradictions = query({\n args: {\n nodeId: v.id(\"epistemicNodes\"),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const edges = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_to_type\", (q) =>\n q.eq(\"toNodeId\", args.nodeId).eq(\"edgeType\", \"informs\")\n )\n .collect();\n // Filter for negative weight (contradicting evidence)\n return edges.filter((e) => (e.weight ?? 0) < 0);\n },\n});\n\n/**\n * Find supporting evidence for a node (informs with weight >= 0)\n * Note: Legacy 'supports' edges have been migrated to 'informs' with positive weight\n */\nexport const findSupport = query({\n args: {\n nodeId: v.id(\"epistemicNodes\"),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const edges = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_to_type\", (q) =>\n q.eq(\"toNodeId\", args.nodeId).eq(\"edgeType\", \"informs\")\n )\n .collect();\n // Filter for non-negative weight (supporting evidence)\n return edges.filter((e) => (e.weight ?? 0) >= 0);\n },\n});\n\n// =============================================================================\n// MUTATIONS\n// =============================================================================\n\n/**\n * Create a new edge\n *\n * Phase 2C: Validates layer rules before creation and stores layer metadata\n */\nexport const create = mutation({\n args: {\n globalId: v.string(),\n fromNodeId: v.id(\"epistemicNodes\"),\n toNodeId: v.id(\"epistemicNodes\"),\n edgeType: edgeTypeValidator,\n weight: v.optional(v.number()),\n confidence: v.optional(v.number()),\n context: v.optional(v.string()),\n // NOTE: 'relation' field has been removed. Use 'weight' instead.\n derivationType: v.optional(v.string()), // For derived_from edges\n createdBy: v.string(),\n ...optionalScopeArgs,\n // Phase 2C: Allow skipping validation for migrations\n skipLayerValidation: v.optional(v.boolean()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n // Verify both nodes exist\n const fromNode = await ctx.db.get(args.fromNodeId);\n const toNode = await ctx.db.get(args.toNodeId);\n\n if (!fromNode || !toNode) {\n throw new Error(\"One or both nodes not found\");\n }\n\n const resolvedScope =\n args.topicId || args.projectId\n ? await resolveTopicProjectScope(ctx, {\n topicId: args.topicId,\n projectId: args.projectId,\n })\n : undefined;\n const resolvedProjectId = resolvedScope?.projectId ?? args.projectId;\n\n // Access control\n if (resolvedProjectId) {\n await requireProjectAccess(ctx, resolvedProjectId, args.createdBy);\n }\n\n // Phase 2C: Get layers (use stored or derive from nodeType)\n const fromLayer =\n fromNode.epistemicLayer || getNodeLayer(fromNode.nodeType);\n const toLayer = toNode.epistemicLayer || getNodeLayer(toNode.nodeType);\n\n // Phase 2C: Validate layer rules (unless explicitly skipped for migrations)\n if (!args.skipLayerValidation) {\n const validation = validateEdgeLayers(args.edgeType, fromLayer, toLayer);\n if (!validation.valid) {\n throw new Error(\n `[EdgeValidation] Invalid edge: ${validation.reason}. ` +\n `Attempted: ${args.edgeType} from ${fromNode.nodeType}(${fromLayer}) → ${toNode.nodeType}(${toLayer})`\n );\n }\n }\n\n // Phase 2C: Block removed edge types\n if (isDeprecatedEdgeType(args.edgeType)) {\n throw new Error(\n `FORBIDDEN: Edge type '${args.edgeType}' has been removed from StackOS schema.`\n );\n }\n\n // Check for duplicate edge\n const existing = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from_to\", (q) =>\n q.eq(\"fromNodeId\", args.fromNodeId).eq(\"toNodeId\", args.toNodeId)\n )\n .collect();\n\n const duplicateEdge = existing.find((e) => e.edgeType === args.edgeType);\n if (duplicateEdge) {\n // Return existing edge ID - caller can decide to update or error\n return { edgeId: duplicateEdge._id, isDuplicate: true };\n }\n\n // Phase 1 (Graph Architecture): Write to Neo4j directly - Neo4j is source of truth\n // The Convex epistemicEdges table is being deprecated in favor of Neo4j\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.createEdge, {\n globalId: args.globalId,\n fromGlobalId: fromNode.globalId,\n toGlobalId: toNode.globalId,\n edgeType: args.edgeType,\n weight: args.weight,\n confidence: args.confidence,\n context: args.context,\n derivationType: args.derivationType,\n createdBy: args.createdBy,\n topicId: resolvedProjectId ? String(resolvedProjectId) : undefined,\n fromNodeType: fromNode.nodeType,\n toNodeType: toNode.nodeType,\n fromLayer,\n toLayer,\n });\n\n // Audit log\n const auditProjectId = resolvedProjectId || fromNode.projectId;\n if (auditProjectId) {\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"edge\",\n entityId: args.globalId,\n changeType: \"edge_added\",\n changedAt: Date.now(),\n changedBy: args.createdBy,\n isAgent: false,\n newState: {\n edgeType: args.edgeType,\n fromNodeId: String(args.fromNodeId),\n toNodeId: String(args.toNodeId),\n weight: args.weight,\n },\n projectId: auditProjectId,\n });\n\n // Update project activity timestamp for delta-based cron gating\n await resolveGraphPrimitivesAppResolvers(ctx).patchProject(\n ctx,\n auditProjectId,\n {\n lastActivityAt: Date.now(),\n }\n );\n }\n\n // Return globalId since we no longer have a Convex edgeId\n return { edgeGlobalId: args.globalId, isDuplicate: false };\n },\n});\n\n/**\n * Update an edge's properties\n */\nexport const update = mutation({\n args: {\n edgeId: v.id(\"epistemicEdges\"),\n weight: v.optional(v.number()),\n confidence: v.optional(v.number()),\n context: v.optional(v.string()),\n // NOTE: 'relation' field has been removed. Use 'weight' instead.\n derivationType: v.optional(v.string()),\n userId: v.optional(v.string()),\n // EK-4: SL opinion metadata (Kernel v2 schema fields)\n constraint: v.optional(v.string()),\n propagation: v.optional(v.string()),\n blocking: v.optional(v.boolean()),\n implicit: v.optional(v.boolean()),\n conditionalA: v.optional(subjectiveOpinionValidator),\n conditionalNotA: v.optional(subjectiveOpinionValidator),\n containment: v.optional(v.string()),\n interrogation: v.optional(v.string()),\n reasoningMethod: v.optional(v.string()),\n analogyBasis: v.optional(v.string()),\n disanalogies: v.optional(v.array(v.string())),\n analogyStrength: v.optional(v.number()),\n causal: v.optional(v.boolean()),\n predictionFulfilled: v.optional(v.boolean()),\n predictionFulfilledAt: v.optional(v.number()),\n predictionFulfilledBy: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const { edgeId, userId, ...updates } = args;\n\n const edge = await ctx.db.get(edgeId);\n if (!edge) {\n throw new Error(\"Edge not found\");\n }\n\n // Access control\n if (edge.projectId && userId) {\n await requireProjectAccess(ctx, edge.projectId, userId);\n }\n\n // Remove undefined values\n const cleanUpdates: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(updates)) {\n if (value !== undefined) {\n cleanUpdates[key] = value;\n }\n }\n\n await ctx.db.patch(edgeId, cleanUpdates);\n\n // Audit log\n if (edge.projectId) {\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"edge\",\n entityId: edge.globalId,\n changeType: \"updated\",\n changedAt: Date.now(),\n changedBy: userId || edge.createdBy,\n isAgent: false,\n previousState: {\n weight: edge.weight,\n confidence: edge.confidence,\n context: edge.context,\n },\n newState: cleanUpdates,\n projectId: edge.projectId,\n });\n }\n\n return { success: true };\n },\n});\n\n/**\n * Delete an edge\n */\nexport const remove = mutation({\n args: {\n edgeId: v.id(\"epistemicEdges\"),\n userId: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const edge = await ctx.db.get(args.edgeId);\n if (!edge) {\n return { success: false, error: \"Edge not found\" };\n }\n\n // Access control\n if (edge.projectId && args.userId) {\n await requireProjectAccess(ctx, edge.projectId, args.userId);\n }\n\n // Audit log before deletion\n if (edge.projectId) {\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"edge\",\n entityId: edge.globalId,\n changeType: \"edge_removed\",\n changedAt: Date.now(),\n changedBy: args.userId || edge.createdBy,\n isAgent: false,\n previousState: {\n edgeType: edge.edgeType,\n fromNodeId: String(edge.fromNodeId),\n toNodeId: edge.toNodeId ? String(edge.toNodeId) : undefined,\n weight: edge.weight,\n },\n projectId: edge.projectId,\n });\n }\n\n // Update project activity timestamp for delta-based cron gating\n if (edge.projectId) {\n await resolveGraphPrimitivesAppResolvers(ctx).patchProject(\n ctx,\n edge.projectId,\n {\n lastActivityAt: Date.now(),\n }\n );\n }\n\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.deleteEdge, {\n globalId: edge.globalId,\n });\n await ctx.db.delete(args.edgeId);\n return { success: true };\n },\n});\n\n/**\n * Delete all edges between two nodes\n */\nexport const removeBetween = mutation({\n args: {\n fromNodeId: v.id(\"epistemicNodes\"),\n toNodeId: v.id(\"epistemicNodes\"),\n edgeType: v.optional(edgeTypeValidator),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const edges = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from_to\", (q) =>\n q.eq(\"fromNodeId\", args.fromNodeId).eq(\"toNodeId\", args.toNodeId)\n )\n .collect();\n\n let deleted = 0;\n for (const edge of edges) {\n if (!args.edgeType || edge.edgeType === args.edgeType) {\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.deleteEdge, {\n globalId: edge.globalId,\n });\n await ctx.db.delete(edge._id);\n deleted++;\n }\n }\n\n return { deleted };\n },\n});\n\n/**\n * Batch create edges (for migrations or bulk operations)\n *\n * Phase 2C: Validates layer rules and stores layer metadata\n */\nexport const batchCreate = mutation({\n args: {\n edges: v.array(\n v.object({\n globalId: v.string(),\n fromNodeId: v.id(\"epistemicNodes\"),\n toNodeId: v.id(\"epistemicNodes\"),\n edgeType: edgeTypeValidator,\n weight: v.optional(v.number()),\n confidence: v.optional(v.number()),\n context: v.optional(v.string()),\n // NOTE: 'relation' field has been removed. Use 'weight' instead.\n derivationType: v.optional(v.string()),\n createdBy: v.string(),\n ...optionalScopeArgs,\n })\n ),\n // Phase 2C: Allow skipping validation for migrations\n skipLayerValidation: v.optional(v.boolean()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const results: Array<{ globalId: string; edgeGlobalId: string }> = [];\n const errors: Array<{ globalId: string; error: string }> = [];\n\n for (const edge of args.edges) {\n // Get node types for denormalization\n const fromNode = await ctx.db.get(edge.fromNodeId);\n const toNode = await ctx.db.get(edge.toNodeId);\n\n if (!fromNode || !toNode) {\n errors.push({\n globalId: edge.globalId,\n error: \"One or both nodes not found\",\n });\n continue;\n }\n\n // Phase 2C: Get layers\n const fromLayer =\n fromNode.epistemicLayer || getNodeLayer(fromNode.nodeType);\n const toLayer = toNode.epistemicLayer || getNodeLayer(toNode.nodeType);\n\n // Phase 2C: Validate layer rules (unless explicitly skipped)\n if (!args.skipLayerValidation) {\n const validation = validateEdgeLayers(\n edge.edgeType,\n fromLayer,\n toLayer\n );\n if (!validation.valid) {\n errors.push({\n globalId: edge.globalId,\n error: validation.reason || \"Invalid layer combination\",\n });\n continue;\n }\n }\n\n // Phase 2C: Block removed edge types\n if (isDeprecatedEdgeType(edge.edgeType)) {\n errors.push({\n globalId: edge.globalId,\n error: `FORBIDDEN: Edge type '${edge.edgeType}' has been removed from StackOS schema.`,\n });\n continue;\n }\n\n // Phase 1 (Graph Architecture): Write to Neo4j directly - Neo4j is source of truth\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.createEdge, {\n globalId: edge.globalId,\n fromGlobalId: fromNode.globalId,\n toGlobalId: toNode.globalId,\n edgeType: edge.edgeType,\n weight: edge.weight,\n confidence: edge.confidence,\n context: edge.context,\n derivationType: edge.derivationType,\n createdBy: edge.createdBy,\n topicId: edge.projectId ? String(edge.projectId) : undefined,\n fromNodeType: fromNode.nodeType,\n toNodeType: toNode.nodeType,\n fromLayer,\n toLayer,\n });\n\n results.push({ globalId: edge.globalId, edgeGlobalId: edge.globalId });\n }\n\n // Update project activity timestamp for delta-based cron gating\n const projectIds = new Set<string>(\n args.edges.flatMap((edge) =>\n typeof edge.projectId === \"string\" ? [edge.projectId] : []\n )\n );\n for (const pid of projectIds) {\n if (pid) {\n await resolveGraphPrimitivesAppResolvers(ctx).patchProject(ctx, pid, {\n lastActivityAt: Date.now(),\n });\n }\n }\n\n return { created: results.length, results, errors };\n },\n});\n\n// =============================================================================\n// TRAVERSAL HELPERS\n// =============================================================================\n\n/**\n * Get the full lineage chain for a node (what it was derived from)\n * Traverses extracted_from and derived_from edges backwards to find sources.\n *\n * Phase 2D: Now supports layer-aware traversal with minLayer/maxLayer constraints\n *\n * Edge semantics:\n * - `Evidence -extracted_from-> Source` means Evidence was extracted from Source\n * - To find lineage, we query edges where current node is fromNodeId (the derived node)\n * and follow toNodeId to find the source/parent nodes\n */\nexport const getLineage = query({\n args: {\n nodeId: v.id(\"epistemicNodes\"),\n maxDepth: v.optional(v.number()),\n // Phase 2D: Layer-aware traversal options\n minLayer: v.optional(v.number()), // 1=L1, 2=L2, 3=L3, 4=L4\n maxLayer: v.optional(v.number()),\n mode: v.optional(\n v.union(\n v.literal(\"anchor_down\"),\n v.literal(\"anchor_up\"),\n v.literal(\"same_layer\"),\n v.literal(\"decision_trace\")\n )\n ),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const maxDepth = args.maxDepth ?? 10;\n const mode: TraversalMode = args.mode ?? \"anchor_down\";\n const minLayer = args.minLayer ?? getDefaultMinLayer(mode);\n const maxLayer = args.maxLayer ?? 4;\n\n const lineage: Array<{\n node: NonNullable<Awaited<ReturnType<typeof ctx.db.get>>>;\n depth: number;\n edgeType: string;\n layer: string; // Phase 2D: Include layer info\n }> = [];\n\n const visited = new Set<string>();\n\n // Get the starting node to check its layer\n const startNode = await ctx.db.get(args.nodeId);\n if (!startNode) {\n return lineage;\n }\n\n const startLayer =\n startNode.epistemicLayer || getNodeLayer(startNode.nodeType);\n\n const queue: Array<{\n nodeId: Id<\"epistemicNodes\">;\n depth: number;\n currentLayer: string;\n }> = [{ nodeId: args.nodeId, depth: 0, currentLayer: startLayer }];\n\n while (queue.length > 0) {\n const current = queue.shift();\n if (!current || current.depth >= maxDepth) {\n continue;\n }\n\n const nodeIdStr = current.nodeId.toString();\n if (visited.has(nodeIdStr)) {\n continue;\n }\n visited.add(nodeIdStr);\n\n // Find edges where this node is the \"from\" (derived/child node)\n // For edges like `Evidence -extracted_from-> Source`, we find Source as the parent\n const edges = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from\", (q) => q.eq(\"fromNodeId\", current.nodeId))\n .collect();\n\n // Filter to lineage-type edges (relationships that indicate provenance)\n const lineageEdges = edges.filter(\n (e) => e.edgeType === \"derived_from\"\n );\n\n for (const edge of lineageEdges) {\n if (!edge.toNodeId) {\n continue;\n }\n const targetNode = await ctx.db.get(edge.toNodeId);\n if (!targetNode || visited.has(edge.toNodeId.toString())) {\n continue;\n }\n\n const targetLayer =\n edge.toLayer ||\n (targetNode as any).epistemicLayer ||\n getNodeLayer((targetNode as any).nodeType);\n\n // Phase 2D: Check layer constraints before traversing\n const shouldContinue = shouldContinueTraversal(\n current.currentLayer as \"L1\" | \"L2\" | \"L3\" | \"L4\" | \"ontological\",\n targetLayer as \"L1\" | \"L2\" | \"L3\" | \"L4\" | \"ontological\",\n { mode, minLayer, maxLayer }\n );\n\n if (!shouldContinue) {\n continue; // Skip this edge due to layer constraints\n }\n\n lineage.push({\n node: targetNode,\n depth: current.depth + 1,\n edgeType: edge.edgeType,\n layer: targetLayer,\n });\n queue.push({\n nodeId: edge.toNodeId,\n depth: current.depth + 1,\n currentLayer: targetLayer,\n });\n }\n }\n\n return lineage;\n },\n});\n\n/**\n * Get all evidence supporting or contradicting a belief\n * Returns structured data for UI display\n * Note: Legacy 'supports'/'contradicts' edges have been migrated to 'informs' with weight\n */\nexport const getEvidenceForBelief = query({\n args: {\n beliefNodeId: v.id(\"epistemicNodes\"),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n // Get all informs edges to this belief\n const informsEdges = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_to_type\", (q) =>\n q.eq(\"toNodeId\", args.beliefNodeId).eq(\"edgeType\", \"informs\")\n )\n .collect();\n\n // Separate by weight\n const supportEdges = informsEdges.filter((e) => (e.weight ?? 0) >= 0);\n const contradictEdges = informsEdges.filter((e) => (e.weight ?? 0) < 0);\n\n // Fetch the actual evidence nodes\n const supportingEvidence = await Promise.all(\n supportEdges.map(async (edge) => ({\n edge,\n node: await ctx.db.get(edge.fromNodeId),\n }))\n );\n\n const contradictingEvidence = await Promise.all(\n contradictEdges.map(async (edge) => ({\n edge,\n node: await ctx.db.get(edge.fromNodeId),\n }))\n );\n\n // Filter out null nodes (deleted or missing references)\n const filteredSupporting = supportingEvidence.filter(\n (e) => e.node !== null\n );\n const filteredContradicting = contradictingEvidence.filter(\n (e) => e.node !== null\n );\n\n return {\n supporting: filteredSupporting,\n contradicting: filteredContradicting,\n supportCount: filteredSupporting.length,\n contradictCount: filteredContradicting.length,\n };\n },\n});\n\n/**\n * Cleanup deprecated edge types from the graph.\n *\n * These edge types were created by the old `createBeliefRelationship` tool\n * before we standardized on `createBeliefConditional` with the 9 proper types.\n *\n * Deprecated types: old generic edges superseded by canonical 6\n */\nexport const cleanupDeprecatedEdges = mutation({\n args: {\n ...optionalScopeArgs,\n dryRun: v.optional(v.boolean()), // If true, just reports what would be deleted\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const DEPRECATED_TYPES = [\n \"contradicts\", // Old generic contradict edge (use weight: -1 on informs)\n ];\n\n // Find all deprecated edges in the project (kernel v2: by_project removed)\n const scopeId = args.topicId || args.projectId;\n const allEdges = scopeId\n ? await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_topic\", (q: any) => q.eq(\"topicId\", scopeId))\n .collect()\n : [];\n\n const deprecatedEdges = allEdges.filter((edge) =>\n DEPRECATED_TYPES.includes(edge.edgeType)\n );\n\n if (args.dryRun) {\n return {\n dryRun: true,\n found: deprecatedEdges.length,\n edges: deprecatedEdges.map((e) => ({\n id: e._id,\n type: e.edgeType,\n from: e.fromNodeId,\n to: e.toNodeId,\n description:\n (e as any).context?.description || (e as any).description,\n })),\n message: `Would delete ${deprecatedEdges.length} deprecated edges`,\n };\n }\n\n // Actually delete them via Neo4j authority path\n for (const edge of deprecatedEdges) {\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.deleteEdge, {\n globalId: edge.globalId,\n });\n await ctx.db.delete(edge._id);\n }\n\n return {\n dryRun: false,\n deleted: deprecatedEdges.length,\n edges: deprecatedEdges.map((e) => ({\n id: e._id,\n type: e.edgeType,\n })),\n message: `Deleted ${deprecatedEdges.length} deprecated edges`,\n };\n },\n});\n\n/**\n * Delete specific edges by ID (for manual cleanup)\n */\nexport const deleteEdges = mutation({\n args: {\n edgeIds: v.array(v.id(\"epistemicEdges\")),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const deleted: string[] = [];\n const notFound: string[] = [];\n\n for (const edgeId of args.edgeIds) {\n const edge = await ctx.db.get(edgeId);\n if (edge) {\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.deleteEdge, {\n globalId: edge.globalId,\n });\n await ctx.db.delete(edgeId);\n deleted.push(edgeId);\n } else {\n notFound.push(edgeId);\n }\n }\n\n return {\n deleted: deleted.length,\n notFound: notFound.length,\n message: `Deleted ${deleted.length} edges, ${notFound.length} not found`,\n };\n },\n});\n\n/**\n * Get all edges between a set of belief IDs (for belief cluster visualization)\n * Returns edges where both source and target are in the provided belief IDs\n */\nexport const getClusterEdges = query({\n args: {\n beliefIds: v.array(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n if (args.beliefIds.length === 0) {\n return [];\n }\n\n const beliefIdSet = new Set(args.beliefIds);\n\n // Get all edges and filter to those within the cluster\n // This is a scan but necessary for flexible matching\n const allEdges = await ctx.db.query(\"epistemicEdges\").collect();\n\n return allEdges.filter((edge) => {\n // Check if both endpoints are in the belief cluster\n const fromInCluster =\n beliefIdSet.has(String(edge.fromNodeId)) ||\n (edge.sourceGlobalId && beliefIdSet.has(edge.sourceGlobalId));\n const toInCluster =\n beliefIdSet.has(String(edge.toNodeId)) ||\n (edge.targetGlobalId && beliefIdSet.has(edge.targetGlobalId));\n\n return fromInCluster && toInCluster;\n });\n },\n});\n\n// =============================================================================\n// INTERNAL MUTATIONS FOR NEO4J DUAL-WRITE\n// These are called from neo4jEdgeAPI.ts (Node.js runtime) to maintain Convex mirror\n// =============================================================================\n\n/**\n * Internal mutation to mirror a Neo4j edge to Convex for reactive UI.\n * Called by createEdge action for edge types that need reactive UI updates.\n *\n * This does NOT replace Neo4j as source of truth - it's a read-optimized mirror\n * for Convex reactive queries used by UI components.\n */\nexport const mirrorEdgeToConvex = internalMutation({\n args: {\n globalId: v.string(),\n fromGlobalId: v.string(),\n toGlobalId: v.string(),\n edgeType: v.string(),\n weight: v.optional(v.number()),\n confidence: v.optional(v.number()),\n context: v.optional(v.string()),\n derivationType: v.optional(v.string()),\n createdBy: v.string(),\n ...optionalScopeArgs,\n fromLayer: v.optional(v.string()),\n toLayer: v.optional(v.string()),\n fromNodeType: v.optional(v.string()),\n toNodeType: v.optional(v.string()),\n // === CLASSIFICATION FIELDS ===\n reasoningMethod: v.optional(v.string()),\n logicalRole: v.optional(v.string()),\n temporalClass: v.optional(v.string()),\n validFrom: v.optional(v.number()),\n validUntil: v.optional(v.number()),\n constraint: v.optional(v.string()),\n propagation: v.optional(v.string()),\n blocking: v.optional(v.boolean()),\n implicit: v.optional(v.boolean()),\n conditionalA: v.optional(subjectiveOpinionValidator),\n conditionalNotA: v.optional(subjectiveOpinionValidator),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n // Resolve source node globalId → Convex ID\n const fromNode = await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_globalId\", (q) => q.eq(\"globalId\", args.fromGlobalId))\n .first();\n\n if (!fromNode) {\n // Source node doesn't exist in Convex - skip mirror\n // This can happen for cross-graph edges (e.g., to Neo4j-only ontology nodes)\n console.log(\n `[Dual-Write] Skipping mirror - source node not in Convex: ${args.fromGlobalId}`\n );\n return { success: false, reason: \"source_not_in_convex\" };\n }\n\n // Resolve target node globalId → Convex ID (optional for cross-graph edges)\n const toNode = await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_globalId\", (q) => q.eq(\"globalId\", args.toGlobalId))\n .first();\n\n // Check if edge already exists (idempotency)\n const existing = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_globalId\", (q) => q.eq(\"globalId\", args.globalId))\n .first();\n\n if (existing) {\n console.log(`[Dual-Write] Edge already exists: ${args.globalId}`);\n return { success: true, edgeId: existing._id, existed: true };\n }\n\n // Insert edge into Convex\n const now = Date.now();\n const edgeId = await ctx.db.insert(\"epistemicEdges\", {\n globalId: args.globalId,\n fromNodeId: fromNode._id,\n toNodeId: toNode?._id, // Optional - may be undefined for cross-graph edges\n sourceGlobalId: args.fromGlobalId,\n targetGlobalId: args.toGlobalId,\n // Cast through any because EdgeType may include types not yet in\n // Convex _generated types (deployed schema lags source schema).\n edgeType: args.edgeType as any,\n weight: args.weight,\n confidence: args.confidence,\n context: args.context,\n derivationType: args.derivationType,\n constraint: args.constraint as\n | \"xor\"\n | \"alternative\"\n | \"counterfactual\"\n | undefined,\n propagation: args.propagation as \"threshold\" | \"continuous\" | undefined,\n blocking: args.blocking,\n implicit: args.implicit,\n conditionalA: args.conditionalA,\n conditionalNotA: args.conditionalNotA,\n createdBy: args.createdBy,\n createdAt: now,\n updatedAt: now,\n topicId: args.projectId as string | undefined,\n fromLayer: args.fromLayer as\n | \"L4\"\n | \"L3\"\n | \"L2\"\n | \"L1\"\n | \"ontological\"\n | undefined,\n toLayer: args.toLayer as\n | \"L4\"\n | \"L3\"\n | \"L2\"\n | \"L1\"\n | \"ontological\"\n | undefined,\n fromNodeType: args.fromNodeType,\n toNodeType: args.toNodeType,\n // Classification fields\n reasoningMethod: args.reasoningMethod as\n | \"deductive\"\n | \"causal\"\n | \"inductive\"\n | \"abductive\"\n | \"statistical\"\n | \"analogical\"\n | \"correlational\"\n | \"testimonial\"\n | \"implicit\"\n | \"pattern_match\"\n | undefined,\n logicalRole: args.logicalRole as\n | \"necessary\"\n | \"sufficient\"\n | \"necessary_sufficient\"\n | \"contributory\"\n | \"corroborative\"\n | undefined,\n temporalClass: args.temporalClass as\n | \"structural\"\n | \"cyclical\"\n | \"transient\"\n | \"point_in_time\"\n | undefined,\n validFrom: args.validFrom,\n validUntil: args.validUntil,\n });\n\n console.log(\n `[Dual-Write] Mirrored edge to Convex: ${args.globalId} (${args.edgeType})`\n );\n return { success: true, edgeId, existed: false };\n },\n});\n\n/**\n * Internal mutation to delete a mirrored edge from Convex.\n * Called by deleteEdge action to maintain Convex mirror consistency.\n */\nexport const deleteEdgeFromConvex = internalMutation({\n args: {\n globalId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const existing = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_globalId\", (q) => q.eq(\"globalId\", args.globalId))\n .first();\n\n if (!existing) {\n return { success: false, reason: \"not_found\" };\n }\n\n await ctx.db.delete(existing._id);\n console.log(`[Dual-Write] Deleted edge from Convex: ${args.globalId}`);\n return { success: true };\n },\n});\n\n/**\n * Internal mutation to update a mirrored edge in Convex.\n * Called by updateEdge action to maintain Convex mirror consistency.\n */\nexport const updateEdgeInConvex = internalMutation({\n args: {\n globalId: v.string(),\n weight: v.optional(v.number()),\n confidence: v.optional(v.number()),\n context: v.optional(v.string()),\n derivationType: v.optional(v.string()),\n constraint: v.optional(v.string()),\n propagation: v.optional(v.string()),\n blocking: v.optional(v.boolean()),\n implicit: v.optional(v.boolean()),\n conditionalA: v.optional(subjectiveOpinionValidator),\n conditionalNotA: v.optional(subjectiveOpinionValidator),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const existing = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_globalId\", (q) => q.eq(\"globalId\", args.globalId))\n .first();\n\n if (!existing) {\n return { success: false, reason: \"not_found\" };\n }\n\n const updates: Record<string, unknown> = {\n updatedAt: Date.now(),\n };\n\n if (args.weight !== undefined) {\n updates.weight = args.weight;\n }\n if (args.confidence !== undefined) {\n updates.confidence = args.confidence;\n }\n if (args.context !== undefined) {\n updates.context = args.context;\n }\n if (args.derivationType !== undefined) {\n updates.derivationType = args.derivationType;\n }\n if (args.constraint !== undefined) {\n updates.constraint = args.constraint;\n }\n if (args.propagation !== undefined) {\n updates.propagation = args.propagation;\n }\n if (args.blocking !== undefined) {\n updates.blocking = args.blocking;\n }\n if (args.implicit !== undefined) {\n updates.implicit = args.implicit;\n }\n if (args.conditionalA !== undefined) {\n updates.conditionalA = args.conditionalA;\n }\n if (args.conditionalNotA !== undefined) {\n updates.conditionalNotA = args.conditionalNotA;\n }\n\n await ctx.db.patch(existing._id, updates);\n console.log(`[Dual-Write] Updated edge in Convex: ${args.globalId}`);\n\n return { success: true };\n },\n});\n"]}
|