@lucern/graph-primitives 1.0.24 → 1.0.26
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 +5 -0
- package/dist/beliefDecay.js.map +1 -1
- package/dist/beliefEvidenceLinks.js +5 -0
- package/dist/beliefEvidenceLinks.js.map +1 -1
- package/dist/entityLifecycle.js +5 -0
- package/dist/entityLifecycle.js.map +1 -1
- package/dist/epistemicBeliefs.core.js +5 -0
- package/dist/epistemicBeliefs.core.js.map +1 -1
- package/dist/epistemicBeliefs.helpers.js +5 -0
- package/dist/epistemicBeliefs.helpers.js.map +1 -1
- package/dist/epistemicBeliefs.internal.js +5 -0
- package/dist/epistemicBeliefs.internal.js.map +1 -1
- package/dist/epistemicBeliefs.js +5 -0
- package/dist/epistemicBeliefs.js.map +1 -1
- package/dist/epistemicEdges.js +5 -0
- package/dist/epistemicEdges.js.map +1 -1
- package/dist/epistemicEdges.mutations.js +5 -0
- package/dist/epistemicEdges.mutations.js.map +1 -1
- package/dist/epistemicEvidence.js +5 -0
- package/dist/epistemicEvidence.js.map +1 -1
- package/dist/epistemicEvidenceHelpers.js +5 -0
- package/dist/epistemicEvidenceHelpers.js.map +1 -1
- package/dist/epistemicEvidenceMutations.js +5 -0
- package/dist/epistemicEvidenceMutations.js.map +1 -1
- package/dist/epistemicEvidenceQueries.js +5 -0
- package/dist/epistemicEvidenceQueries.js.map +1 -1
- package/dist/epistemicQuestions.conviction.js +5 -0
- package/dist/epistemicQuestions.conviction.js.map +1 -1
- package/dist/epistemicQuestions.create.js +5 -0
- package/dist/epistemicQuestions.create.js.map +1 -1
- package/dist/epistemicQuestions.evidence.js +5 -0
- package/dist/epistemicQuestions.evidence.js.map +1 -1
- package/dist/epistemicQuestions.helpers.js +5 -0
- package/dist/epistemicQuestions.helpers.js.map +1 -1
- package/dist/epistemicQuestions.js +5 -0
- package/dist/epistemicQuestions.js.map +1 -1
- package/dist/epistemicQuestions.lifecycle.js +5 -0
- package/dist/epistemicQuestions.lifecycle.js.map +1 -1
- package/dist/epistemicQuestions.queries.js +5 -0
- package/dist/epistemicQuestions.queries.js.map +1 -1
- package/dist/epistemicQuestions.tail.js +5 -0
- package/dist/epistemicQuestions.tail.js.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/proof-attestation.json +1 -1
- package/dist/questionEvidenceLinks.js +5 -0
- package/dist/questionEvidenceLinks.js.map +1 -1
- package/dist/resolvers.js +5 -0
- package/dist/resolvers.js.map +1 -1
- package/dist/topicProjectOverlay.js +5 -0
- package/dist/topicProjectOverlay.js.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/convex.ts","../src/entityValidation.ts","../src/entityCanonicalMatch.ts","../src/topicOntologyResolver.ts","../src/debug.ts","../src/topicProjectOverlay.ts","../src/resolvers.ts","../src/topicScope.ts","../src/epistemicInsert.ts","../src/entityLifecycle.ts"],"names":["v","isMissingLucernChildComponentError","getErrorMessage","LEGACY_SCOPE_FIELD"],"mappings":"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","file":"entityLifecycle.js","sourcesContent":["import {\n actionGeneric,\n anyApi,\n componentsGeneric,\n httpActionGeneric,\n internalActionGeneric,\n internalMutationGeneric,\n internalQueryGeneric,\n mutationGeneric,\n queryGeneric,\n} from \"convex/server\";\nimport type { GenericId } from \"convex/values\";\n\nexport const api = anyApi as any;\nexport const components = componentsGeneric() as any;\nexport const internal = anyApi as any;\n\nexport type TableNames = string;\nexport type Id<TableName extends TableNames = string> = GenericId<TableName>;\nexport type Doc<TableName extends TableNames = string> = any;\nexport type DataModel = any;\ntype IndexRangeBuilder = {\n field(fieldName: string): string;\n eq(fieldName: string, value: unknown): IndexRangeBuilder;\n gt(fieldName: string, value: unknown): IndexRangeBuilder;\n gte(fieldName: string, value: unknown): IndexRangeBuilder;\n lt(fieldName: string, value: unknown): IndexRangeBuilder;\n lte(fieldName: string, value: unknown): IndexRangeBuilder;\n};\ntype FilterBuilder = {\n eq(left: unknown, right: unknown): unknown;\n neq(left: unknown, right: unknown): unknown;\n gt(left: unknown, right: unknown): unknown;\n gte(left: unknown, right: unknown): unknown;\n lt(left: unknown, right: unknown): unknown;\n lte(left: unknown, right: unknown): unknown;\n and(...clauses: unknown[]): unknown;\n or(...clauses: unknown[]): unknown;\n field(fieldName: string): unknown;\n};\ntype QueryInitializer<TableName extends TableNames> = {\n withIndex(\n indexName: string,\n range?: (q: any) => unknown\n ): QueryInitializer<TableName>;\n filter(predicate: (q: any) => unknown): QueryInitializer<TableName>;\n order(direction: \"asc\" | \"desc\"): QueryInitializer<TableName>;\n collect(): Promise<Doc<TableName>[]>;\n take(limit: number): Promise<Doc<TableName>[]>;\n first(): Promise<Doc<TableName> | null>;\n unique(): Promise<Doc<TableName> | null>;\n};\nexport type DatabaseReader = {\n get<TableName extends TableNames>(\n id: Id<TableName>\n ): Promise<Doc<TableName> | null>;\n query<TableName extends TableNames>(\n tableName: TableName\n ): QueryInitializer<TableName>;\n normalizeId?<TableName extends TableNames>(\n tableName: TableName,\n id: string\n ): Id<TableName> | null;\n};\nexport type DatabaseWriter = DatabaseReader & {\n insert<TableName extends TableNames>(\n tableName: TableName,\n value: Record<string, unknown>\n ): Promise<Id<TableName>>;\n patch<TableName extends TableNames>(\n id: Id<TableName>,\n value: Record<string, unknown>\n ): Promise<void>;\n replace<TableName extends TableNames>(\n id: Id<TableName>,\n value: Record<string, unknown>\n ): Promise<void>;\n delete<TableName extends TableNames>(id: Id<TableName>): Promise<void>;\n};\ntype Scheduler = {\n runAfter(delayMs: number, functionReference: unknown, args?: unknown): Promise<void>;\n};\ntype AuthReader = {\n getUserIdentity(): Promise<unknown>;\n};\ntype RuntimeInvoker = {\n runQuery(functionReference: unknown, args?: unknown): Promise<any>;\n runMutation(functionReference: unknown, args?: unknown): Promise<any>;\n runAction(functionReference: unknown, args?: unknown): Promise<any>;\n};\nexport type QueryCtx = RuntimeInvoker & {\n auth: AuthReader;\n db: DatabaseReader;\n scheduler: Scheduler;\n};\nexport type MutationCtx = RuntimeInvoker & {\n auth: AuthReader;\n db: DatabaseWriter;\n scheduler: Scheduler;\n};\nexport type ActionCtx = RuntimeInvoker & {\n auth: AuthReader;\n scheduler: Scheduler;\n};\n\ntype ConvexFunctionBuilder<Ctx> = <\n Definition extends { handler?: (ctx: Ctx, args: any) => any },\n>(\n definition: Definition\n) => any;\n\nexport const action = actionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const httpAction =\n httpActionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const internalAction =\n internalActionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const internalMutation =\n internalMutationGeneric as unknown as ConvexFunctionBuilder<MutationCtx>;\nexport const internalQuery =\n internalQueryGeneric as unknown as ConvexFunctionBuilder<QueryCtx>;\nexport const mutation =\n mutationGeneric as unknown as ConvexFunctionBuilder<MutationCtx>;\nexport const query = queryGeneric as unknown as ConvexFunctionBuilder<QueryCtx>;\n","/**\n * Entity Metadata Validation\n *\n * Validates entity metadata against registered schemas in schemaEnumConfig.\n * Strict on create (must pass), lenient on read (existing data tolerance).\n *\n * @module graph-primitives/entityValidation\n */\n\nimport type { MutationCtx, QueryCtx } from \"./convex\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\ntype FieldSchema = {\n type: \"string\" | \"number\" | \"boolean\";\n required: boolean;\n};\n\ntype EntitySchema = Record<string, FieldSchema>;\n\ntype ValidationResult = {\n valid: boolean;\n errors: string[];\n};\n\n// =============================================================================\n// SCHEMA LOOKUP\n// =============================================================================\n\n/**\n * Fetch the registered metadata schema for an entity type.\n * Returns null if no schema is registered.\n */\nexport async function getEntityTypeSchema(\n ctx: QueryCtx | MutationCtx,\n nodeType: string,\n tenantId?: string\n): Promise<EntitySchema | null> {\n // Try tenant-specific first, then platform default\n if (tenantId) {\n const tenantEntry = await (ctx.db as any)\n .query(\"schemaEnumConfig\")\n .withIndex(\"by_tenant_category\", (q: any) =>\n q.eq(\"tenantId\", tenantId).eq(\"category\", \"entity_type\")\n )\n .collect();\n\n const tenantMatch = tenantEntry.find(\n (e: any) => e.value === nodeType && e.status === \"active\"\n );\n if (tenantMatch?.metadata?.schema) {\n return tenantMatch.metadata.schema as EntitySchema;\n }\n }\n\n // Fall back to platform default\n const platformEntry = await (ctx.db as any)\n .query(\"schemaEnumConfig\")\n .withIndex(\"by_category_value\", (q: any) =>\n q.eq(\"category\", \"entity_type\").eq(\"value\", nodeType)\n )\n .first();\n\n if (platformEntry?.metadata?.schema && platformEntry.status === \"active\") {\n return platformEntry.metadata.schema as EntitySchema;\n }\n\n return null;\n}\n\n// =============================================================================\n// VALIDATION\n// =============================================================================\n\n/**\n * Validate entity metadata against the registered schema.\n *\n * Policy: strict on create (unregistered types fail), lenient on read.\n *\n * @param ctx - Convex query/mutation context\n * @param nodeType - The entity nodeType (e.g., \"company\", \"person\")\n * @param metadata - The metadata object to validate\n * @param tenantId - Optional tenant ID for tenant-specific schemas\n * @returns ValidationResult with errors if invalid\n */\nexport async function validateEntityMetadata(\n ctx: QueryCtx | MutationCtx,\n nodeType: string,\n metadata: Record<string, unknown> | undefined | null,\n tenantId?: string\n): Promise<ValidationResult> {\n const errors: string[] = [];\n\n const schema = await getEntityTypeSchema(ctx, nodeType, tenantId);\n\n if (!schema) {\n return {\n valid: false,\n errors: [\n `No registered schema for entity type \"${nodeType}\". Register it in schemaEnumConfig (category=\"entity_type\") before creating entities of this type.`,\n ],\n };\n }\n\n const meta = metadata || {};\n\n // Check required fields\n for (const [fieldName, fieldDef] of Object.entries(schema)) {\n if (fieldDef.required) {\n const value = meta[fieldName];\n if (value === undefined || value === null || value === \"\") {\n errors.push(`Required field \"${fieldName}\" is missing or empty`);\n }\n }\n }\n\n // Check field types for provided fields\n for (const [fieldName, value] of Object.entries(meta)) {\n const fieldDef = schema[fieldName];\n if (!fieldDef) {\n // Extra fields are allowed (loose metadata tolerance)\n continue;\n }\n\n if (value === undefined || value === null) {\n // null/undefined are allowed for optional fields (already caught above for required)\n continue;\n }\n\n const actualType = typeof value;\n if (actualType !== fieldDef.type) {\n errors.push(\n `Field \"${fieldName}\" expected type \"${fieldDef.type}\" but got \"${actualType}\"`\n );\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\n/**\n * Check if a nodeType is a registered entity type (platform or tenant).\n */\nexport async function isRegisteredEntityType(\n ctx: QueryCtx | MutationCtx,\n nodeType: string,\n tenantId?: string\n): Promise<boolean> {\n const schema = await getEntityTypeSchema(ctx, nodeType, tenantId);\n return schema !== null;\n}\n","/**\n * Canonical-entity match helpers — pure text-normalization, title-derivation,\n * and record-matching predicates behind the canonical-entity dedup/lookup path\n * in entityLifecycle.ts. Extracted from entityLifecycle.ts (the mutations/queries\n * registration stays there) so the module stays under the long-file hard gate;\n * pure code motion, no logic delta.\n */\nimport type { Id } from \"./convex\";\n\nexport type CanonicalEntityRecord = {\n _id: Id<\"epistemicNodes\">;\n title?: string;\n canonicalText?: string;\n status?: string;\n nodeType?: string;\n epistemicLayer?: string;\n tenantId?: string;\n workspaceId?: string;\n contentHash?: string;\n projectId?: string;\n globalId?: string;\n subtype?: string;\n domain?: string;\n tags?: string[];\n verificationStatus?: string;\n externalIds?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n};\n\nexport function normalizeCanonicalEntityText(value: string): string {\n return value.trim().toLowerCase().replace(/\\s+/g, \" \");\n}\n\nexport function buildEntityTitle(canonicalText: string): string {\n return canonicalText.slice(0, 100) + (canonicalText.length > 100 ? \"...\" : \"\");\n}\n\nexport function matchesCanonicalEntityRecord(\n node: CanonicalEntityRecord,\n args: {\n nodeType?: string;\n tenantId?: string;\n contentHash?: string;\n includeArchived?: boolean;\n }\n): boolean {\n if (node.epistemicLayer !== \"ontological\") {\n return false;\n }\n if (node.workspaceId !== undefined) {\n return false;\n }\n if (args.nodeType && node.nodeType !== args.nodeType) {\n return false;\n }\n if (args.contentHash && node.contentHash !== args.contentHash) {\n return false;\n }\n const rowTenantId =\n typeof node.tenantId === \"string\" && node.tenantId.trim().length > 0\n ? node.tenantId.trim()\n : undefined;\n if (rowTenantId !== args.tenantId) {\n return false;\n }\n if (args.includeArchived) {\n return node.status !== \"deleted\";\n }\n return node.status === \"active\";\n}\n","/**\n * Topic Ontology Resolution — Hybrid Inheritance\n *\n * Resolves the effective ontology for a topic by walking the parent chain.\n *\n * Strategy:\n * - If the topic has an ontologyId, return its ontology definition.\n * - Otherwise, walk up the parent chain until an ancestor with an ontologyId is found.\n * - Returns null if no ancestor in the chain has an ontology binding.\n *\n * This is a helper function callable from within Convex mutation/query handlers.\n * For the public query API, see topics.resolveTopicOntology.\n *\n * @module graph-primitives/topicOntologyResolver\n */\n\nimport type { Id } from \"./convex\";\n\n// Minimal topic shape needed for resolution (avoids importing full generated types)\ntype TopicDoc = {\n _id: Id<\"topics\">;\n name: string;\n depth: number;\n ontologyId?: Id<\"ontologyDefinitions\">;\n parentTopicId?: Id<\"topics\">;\n};\n\ntype OntologyDef = {\n _id: Id<\"ontologyDefinitions\">;\n ontologyKey: string;\n name: string;\n tier: \"platform\" | \"pack\" | \"tenant\";\n status: \"draft\" | \"active\" | \"deprecated\" | \"archived\";\n};\n\ntype OntologyVer = {\n _id: Id<\"ontologyVersions\">;\n ontologyId: Id<\"ontologyDefinitions\">;\n version: string;\n status: \"draft\" | \"published\" | \"deprecated\";\n entityTypes: Array<{ value: string; label: string; description?: string }>;\n edgeTypes: Array<{ value: string; label: string; description?: string }>;\n publishedAt?: number;\n};\n\nexport type ResolvedTopicOntology = {\n ontologyId: Id<\"ontologyDefinitions\">;\n ontologyKey: string;\n ontologyName: string;\n tier: string;\n source: \"direct\" | \"inherited\";\n sourceTopicId: Id<\"topics\">;\n /** Valid entity type values from the latest published version */\n validEntityTypes: string[];\n /** Valid edge type values from the latest published version */\n validEdgeTypes: string[];\n /** The published version, if any */\n publishedVersion: OntologyVer | null;\n};\n\nconst MAX_RESOLUTION_DEPTH = 10;\n\n/**\n * Resolve the effective ontology for a topic.\n *\n * @param ctx - Convex mutation/query context with db access\n * @param topicId - The topic to resolve the ontology for\n * @returns The resolved ontology or null if none is bound in the ancestor chain\n */\nexport async function resolveTopicOntologyInternal(\n ctx: { db: any },\n topicId: Id<\"topics\">\n): Promise<ResolvedTopicOntology | null> {\n let current = (await ctx.db.get(topicId)) as TopicDoc | null;\n if (!current) {\n return null;\n }\n\n const startTopicId = topicId;\n\n for (let i = 0; i < MAX_RESOLUTION_DEPTH && current; i++) {\n if (current.ontologyId) {\n const ontologyDef = (await ctx.db.get(\n current.ontologyId\n )) as OntologyDef | null;\n if (!ontologyDef || ontologyDef.status === \"archived\") {\n // Ontology was archived or deleted — continue walking up\n if (current.parentTopicId) {\n current = (await ctx.db.get(\n current.parentTopicId\n )) as TopicDoc | null;\n continue;\n }\n return null;\n }\n\n // Fetch the latest published version for this ontology\n const versions = (await ctx.db\n .query(\"ontologyVersions\")\n .withIndex(\"by_ontologyId\", (q: any) =>\n q.eq(\"ontologyId\", current?.ontologyId!)\n )\n .collect()) as OntologyVer[];\n\n const published = versions\n .filter((v) => v.status === \"published\")\n .sort((a, b) => (b.publishedAt ?? 0) - (a.publishedAt ?? 0));\n\n const latestPublished = published[0] ?? null;\n\n return {\n ontologyId: ontologyDef._id,\n ontologyKey: ontologyDef.ontologyKey,\n ontologyName: ontologyDef.name,\n tier: ontologyDef.tier,\n source: current._id === startTopicId ? \"direct\" : \"inherited\",\n sourceTopicId: current._id,\n validEntityTypes: latestPublished\n ? latestPublished.entityTypes.map((et) => et.value)\n : [],\n validEdgeTypes: latestPublished\n ? latestPublished.edgeTypes.map((et) => et.value)\n : [],\n publishedVersion: latestPublished,\n };\n }\n\n // No ontologyId on this topic — walk up\n if (!current.parentTopicId) {\n break;\n }\n current = (await ctx.db.get(current.parentTopicId)) as TopicDoc | null;\n }\n\n return null;\n}\n\n/**\n * Validate that a nodeType is allowed by the resolved ontology for a topic.\n *\n * Returns { valid: true } if:\n * - The topic has no bound ontology (no constraint)\n * - The nodeType is in the ontology's published entity types\n *\n * Returns { valid: false, error } if:\n * - The topic has a bound ontology and the nodeType is not in its entity types\n */\nexport async function validateEntityTypeForTopic(\n ctx: { db: any },\n topicId: Id<\"topics\">,\n nodeType: string\n): Promise<{ valid: true } | { valid: false; error: string }> {\n const resolved = await resolveTopicOntologyInternal(ctx, topicId);\n\n // No ontology bound — all entity types are allowed\n if (!resolved) {\n return { valid: true };\n }\n\n // No published version — ontology exists but has no content yet, allow all\n if (resolved.validEntityTypes.length === 0) {\n return { valid: true };\n }\n\n // Check if nodeType is in the ontology's entity types\n if (resolved.validEntityTypes.includes(nodeType)) {\n return { valid: true };\n }\n\n return {\n valid: false,\n error: `Entity type \"${nodeType}\" is not defined in the ontology \"${resolved.ontologyKey}\" (${resolved.ontologyName}). Valid entity types: ${resolved.validEntityTypes.join(\", \")}. Source: ${resolved.source} from topic ${resolved.sourceTopicId}.`,\n };\n}\n","type GraphPrimitiveDebugEnvironment = {\n process?: {\n env?: Record<string, string | undefined>;\n };\n};\n\nfunction isGraphPrimitiveDebugEnabled(): boolean {\n const env = (globalThis as GraphPrimitiveDebugEnvironment).process?.env;\n return (\n env?.LUCERN_COMPAT_FALLBACK_DEBUG === \"1\" ||\n env?.LUCERN_GRAPH_DEBUG === \"1\"\n );\n}\n\nexport function formatGraphPrimitiveError(error: unknown): string {\n if (error instanceof Error) {\n return `${error.name}: ${error.message}`;\n }\n if (typeof error === \"string\") {\n return error;\n }\n if (error === null) {\n return \"null\";\n }\n if (error === undefined) {\n return \"undefined\";\n }\n try {\n return JSON.stringify(error);\n } catch {\n return Object.prototype.toString.call(error);\n }\n}\n\nexport function debugGraphPrimitiveFallback(\n message: string,\n context?: Record<string, unknown>\n): void {\n if (!isGraphPrimitiveDebugEnabled()) {\n return;\n }\n console.debug(message, context ?? {});\n}\n","import { api } from \"./convex\";\nimport { debugGraphPrimitiveFallback } from \"./debug\";\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 = \"critical\" | \"major\" | \"minor\" | \"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 /** FR.7 creator-grant: the exact acting principal recorded as owner-principal. */\n ownerPrincipalId?: string;\n createdAt?: number;\n updatedAt?: number;\n metadata?: Record<string, unknown>;\n};\n\nexport type TopicProjectOverlay = Record<string, unknown> & {\n _id: string;\n projectId: string;\n topicId: string;\n storageProjectId: string;\n legacyProjectId?: string;\n name: string;\n type: string;\n description?: string;\n ownerId: string;\n /** FR.7 creator-grant: principal-shaped owner; distinct from clerkId-shaped ownerId. */\n ownerPrincipalId?: string;\n sharedWith: string[];\n visibility: \"private\" | \"team\" | \"firm\" | \"external\" | \"public\";\n tenantId?: string;\n workspaceId?: string;\n status: \"active\" | \"archived\" | \"watching\";\n tags: string[];\n chatCount: number;\n artifactCount: number;\n lastActivityAt: number;\n thesis?: LegacyProjectThesis;\n wedgeHypothesis?: string;\n founderArchetype?: string;\n investmentCriteria?: string[];\n sprintPhase?:\n | \"pre_sprint\"\n | \"readiness_check\"\n | \"thesis_crystallization\"\n | \"sprint_planning\"\n | \"active_sprint\"\n | \"theme_assembly\"\n | \"evolution\";\n currentSprintIndex?: number;\n thesisPillarConfig?: LegacyThesisPillarConfig;\n beliefArchitecture?: LegacyBeliefArchitecture;\n ontologyClassification?: LegacyOntologyClassification;\n _creationTime: number;\n createdAt: number;\n updatedAt: number;\n};\n\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 = getErrorMessage(error);\n return (\n message.includes(\n 'Child component ComponentName(Identifier(\"lucern\")) not found',\n ) ||\n (message.includes(\"Child component\") &&\n message.includes(\"lucern\") &&\n message.includes(\"not found\"))\n );\n}\n\nfunction getErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"message\" in error &&\n typeof (error as { message?: unknown }).message === \"string\"\n ) {\n return (error as { message: string }).message;\n }\n return \"unknown error\";\n}\n\nasync function resolveTopicDoc(\n ctx: 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(\n scopeId as any,\n )) as TopicDocLike | null;\n if (directTopic) {\n return directTopic;\n }\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicProjectOverlay] Failed to resolve topic by direct ID\",\n {\n error,\n scopeId,\n },\n );\n // Not a direct topics-table id.\n }\n }\n\n if (typeof ctx.runQuery !== \"function\") {\n return null;\n }\n\n try {\n const topic = await ctx.runQuery(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 (error) {\n debugGraphPrimitiveFallback(\n \"[topicProjectOverlay] Failed to resolve topic by ID query\",\n {\n error,\n scopeId,\n },\n );\n // Fall through to legacy-scope lookup.\n }\n\n try {\n const topic = await ctx.runQuery(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 (error) {\n debugGraphPrimitiveFallback(\n \"[topicProjectOverlay] Failed to resolve topic by legacy scope ID\",\n { error, scopeId },\n );\n // Best-effort compat lookup only.\n }\n\n return null;\n}\n\nexport function materializeTopicProjectOverlay(\n topic: TopicDocLike,\n idMode: OverlayIdMode = \"legacy\",\n): TopicProjectOverlay {\n const metadata = readMetadata(topic);\n const topicId = String(topic._id);\n const legacyProjectId =\n readLegacyProjectId(topic) ||\n readLegacyProjectId(metadata) ||\n readNonEmptyString(metadata.legacyProjectId);\n const storageProjectId = legacyProjectId || topicId;\n const outwardId = idMode === \"topic\" ? topicId : storageProjectId;\n const visibility =\n coerceVisibility(topic.visibility) ||\n coerceVisibility(metadata.visibility) ||\n \"private\";\n const status =\n coerceStatus(topic.status) || coerceStatus(metadata.status) || \"active\";\n 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 // FR.7 creator-grant: surface the principal-shaped owner field (column-first,\n // metadata fallback for legacy rows that recorded it in metadata).\n ownerPrincipalId:\n readNonEmptyString(topic.ownerPrincipalId) ||\n readNonEmptyString(metadata.ownerPrincipalId),\n sharedWith: readStringArray(metadata.sharedWith),\n visibility,\n tenantId:\n readNonEmptyString(topic.tenantId) ||\n readNonEmptyString(metadata.tenantId),\n workspaceId:\n readNonEmptyString(topic.workspaceId) ||\n readNonEmptyString(metadata.workspaceId),\n status,\n tags: readStringArray(metadata.tags),\n chatCount:\n typeof metadata.chatCount === \"number\"\n ? (metadata.chatCount as number)\n : 0,\n artifactCount:\n typeof metadata.artifactCount === \"number\"\n ? (metadata.artifactCount as number)\n : 0,\n lastActivityAt:\n typeof metadata.lastActivityAt === \"number\"\n ? (metadata.lastActivityAt as number)\n : updatedAt,\n _creationTime:\n typeof topic._creationTime === \"number\" ? topic._creationTime : createdAt,\n createdAt,\n updatedAt,\n };\n}\n\nexport async function resolveTopicProjectOverlay(\n ctx: 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 (error) {\n debugGraphPrimitiveFallback(\n \"[topicProjectOverlay] Failed to read topics table; falling back to API\",\n { error },\n );\n allTopics = [];\n }\n }\n\n if (allTopics.length === 0 && typeof ctx.runQuery === \"function\") {\n allTopics =\n (((await ctx.runQuery(api.topics.list as any, {})) ??\n []) as TopicDocLike[]) || [];\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 ...topic,\n ...patch,\n metadata: nextMetadata,\n } as TopicDocLike);\n}\n\nexport function matchesTopicProjectOverlayAccess(\n accessibleProjectIds: Set<string>,\n project: {\n topicId: string;\n legacyProjectId?: string;\n storageProjectId?: string;\n },\n): boolean {\n return (\n accessibleProjectIds.has(project.storageProjectId || project.topicId) ||\n accessibleProjectIds.has(project.topicId) ||\n (typeof project.legacyProjectId === \"string\" &&\n accessibleProjectIds.has(project.legacyProjectId))\n );\n}\n","/** Data-source resolver wiring for the graph-primitives module. */\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 = getErrorMessage(error);\n return (\n message.includes(\n 'Child component ComponentName(Identifier(\"lucern\")) not found',\n ) ||\n (message.includes(\"Child component\") &&\n message.includes(\"lucern\") &&\n message.includes(\"not found\"))\n );\n}\n\nfunction getErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"message\" in error &&\n typeof (error as { message?: unknown }).message === \"string\"\n ) {\n return (error as { message: string }).message;\n }\n return \"unknown error\";\n}\n\nfunction isAdvisoryTopicPatch(value: Record<string, unknown>): boolean {\n const advisoryKeys = new Set([\"lastActivityAt\", \"updatedAt\"]);\n const keys = Object.keys(value);\n return keys.length > 0 && keys.every((key) => advisoryKeys.has(key));\n}\n\nasync function patchProjectWithTolerance(\n ctx: GraphPrimitivesAppResolverContext,\n projectId: string,\n value: Record<string, unknown>,\n): Promise<void> {\n try {\n await patchTopicProjectOverlay(ctx, projectId, value);\n } catch (error) {\n if (\n !isAdvisoryTopicPatch(value) ||\n !isMissingLucernChildComponentError(error)\n ) {\n throw error;\n }\n\n console.warn(\n \"[lucern graph-primitives] Non-fatal advisory topic patch failure\",\n {\n projectId,\n keys: Object.keys(value),\n error: getErrorMessage(error),\n },\n );\n }\n}\n\nfunction defaultResolvers(): GraphPrimitivesAppResolvers {\n return {\n getProject: (ctx, projectId) =>\n resolveTopicProjectOverlay(ctx, projectId, {\n idMode: \"legacy\",\n projectLikeOnly: false,\n }),\n patchProject: (ctx, projectId, value) =>\n patchProjectWithTolerance(ctx, projectId, value),\n listTopics: (ctx) =>\n listTopicProjectOverlays(ctx, {\n idMode: \"legacy\",\n }),\n getFinalArtifact: (ctx, artifactId) => ctx.db.get(artifactId),\n };\n}\n\nlet resolverOverrides: Partial<GraphPrimitivesAppResolvers> = {};\n\nexport function configureGraphPrimitivesAppResolvers(\n overrides: Partial<GraphPrimitivesAppResolvers>,\n): void {\n resolverOverrides = {\n ...resolverOverrides,\n ...overrides,\n };\n}\n\nexport function resetGraphPrimitivesAppResolvers(): void {\n resolverOverrides = {};\n}\n\nexport function resolveGraphPrimitivesAppResolvers(\n _ctx: GraphPrimitivesAppResolverContext,\n): GraphPrimitivesAppResolvers {\n return {\n ...defaultResolvers(),\n ...resolverOverrides,\n };\n}\n","/** Topic-scope resolution helpers for graph-primitive operations. */\nimport { v } from \"convex/values\";\nimport { api as appApi } from \"./convex\";\nimport type { Id } from \"./convex\";\nimport { debugGraphPrimitiveFallback } from \"./debug\";\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:\n | \"topic\"\n | \"project_mapped_topic\"\n | \"topic_inferred\"\n | \"topic_node\";\n};\n\n/**\n * RR.5 (legacy topics-table retirement) — graph-primitives mirror of the\n * kernel's epistemicNodes-first topic-scope fallback. Kept in lockstep with\n * `packages/reasoning-kernel/src/adapters/lib/topicScope.ts`\n * (`tests/unit/convex/topic-scope-fallbacks.test.ts` asserts parity).\n *\n * Resolves a topic that exists only as `epistemicNodes(nodeType=\"topic\")` —\n * the write-of-record — when no legacy `topics` row backs the ref, returning the\n * node's `topicId` self-key so scoped beliefs/evidence/questions stay reachable.\n * See the kernel module for the full silent-empty-result rationale.\n */\ntype TopicNodeScopeDoc = {\n _id: string | Id<\"epistemicNodes\">;\n globalId?: string;\n nodeType?: string;\n topicId?: string;\n metadata?: Record<string, unknown>;\n};\n\nasync function resolveTopicNodeScopeOrNull(\n ctx: any,\n ref: string,\n): Promise<TopicProjectScope | null> {\n if (!ctx?.db || typeof ctx.db.query !== \"function\") {\n return null;\n }\n\n let node: TopicNodeScopeDoc | null = null;\n\n // 1. The ref IS the topic node's UUIDv7 globalId.\n try {\n const byGlobalId = (await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_globalId\", (q: any) => q.eq(\"globalId\", ref))\n .first()) as TopicNodeScopeDoc | null;\n if (byGlobalId && byGlobalId.nodeType === \"topic\") {\n node = byGlobalId;\n }\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] topic-node scope lookup by globalId failed\",\n { error, ref },\n );\n }\n\n if (!node) {\n return null;\n }\n\n const scopeKey =\n normalizeScopeValue(node.topicId) ?? normalizeScopeValue(node.globalId);\n if (!scopeKey) {\n return null;\n }\n\n return {\n topicId: scopeKey as Id<\"topics\">,\n projectId: asMappedProjectId(node as unknown as TopicDoc),\n source: \"topic_node\",\n };\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(\n ctx: any,\n scopeId: string,\n): 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 (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to resolve scope alias via index\",\n {\n error,\n scopeId,\n },\n );\n // Older Lucern dev deployments can lag index backfills while still carrying\n // the underlying topics table. Scan and filter so scope resolution keeps\n // working during the rollout.\n const topics = (await 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 (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to resolve topic by host query\",\n {\n error,\n topicId,\n },\n );\n return null;\n }\n}\n\nasync function tryResolveHostTopicByLegacyScope(\n ctx: 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 (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to resolve topic by legacy scope\",\n {\n error,\n legacyScopeId,\n },\n );\n return null;\n }\n}\n\nexport function readMaterializedTopicTableId(\n topicNode: MaterializedTopicNodeDoc | null | undefined,\n): string | undefined {\n if (!topicNode) {\n return;\n }\n\n const metadata = (topicNode.metadata || {}) as Record<string, unknown>;\n const topicTableId =\n (metadata.topicTableId as string | undefined) ||\n (metadata.topicId as string | undefined);\n\n return typeof topicTableId === \"string\" && topicTableId.trim().length > 0\n ? topicTableId.trim()\n : undefined;\n}\n\n/**\n * Walk the topic parent chain to find inherited workspaceId and tenantId.\n * Mirrors the pattern used by resolveTopicOntology for ontologyId inheritance.\n * Max depth: 10 (defensive limit against pathological nesting).\n */\nasync function resolveInheritedWorkspaceScope(\n ctx: 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(\n args.topicId as Id<\"topics\">,\n )) as TopicDoc | null;\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to load topic by direct id\",\n {\n error,\n topicId: args.topicId,\n },\n );\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 // RR.5: no legacy topics row — resolve the canonical topic node store\n // before throwing (silent-empty-result fix).\n const nodeScope = await resolveTopicNodeScopeOrNull(\n ctx,\n String(args.topicId),\n );\n if (nodeScope) {\n return nodeScope;\n }\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 (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to load direct project topic\",\n {\n error,\n projectId: args.projectId,\n },\n );\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 // RR.5: try the canonical topic node store before failing.\n const nodeScope = await resolveTopicNodeScopeOrNull(\n ctx,\n String(args.projectId),\n );\n if (nodeScope) {\n return {\n ...nodeScope,\n projectId: nodeScope.projectId ?? String(args.projectId),\n };\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","import type { WithoutSystemFields } from \"convex/server\";\nimport {\n assertUuidV7Identity,\n assertStorageEdgeVocabulary,\n assertUuidShapedEdgeEndpoint,\n} from \"@lucern/contracts/ids\";\nimport {\n assertEdgePolicyAllowed,\n edgePolicyManifest,\n type EpistemicNodeType,\n} from \"@lucern/contracts\";\nimport type { Doc, Id, MutationCtx } from \"./convex\";\n\nexport async function insertEpistemicNode(\n ctx: MutationCtx,\n doc: WithoutSystemFields<Doc<\"epistemicNodes\">>,\n): Promise<Id<\"epistemicNodes\">> {\n assertUuidV7Identity(\"epistemicNodes\", doc.globalId);\n return ctx.db.insert(\"epistemicNodes\", doc);\n}\n\n/**\n * C2-RR.4b — REFERENTIAL edge-endpoint canonicality (amends RR.4's FORMAT guard).\n *\n * Proves an endpoint is the `globalId` of an EXISTING `epistemicNodes` row, not\n * that it has a v7 shape. Refuses doc-ids and fabricated/unknown endpoints while\n * keeping legacy v4-`globalId` nodes (the established prod corpus) linkable.\n * SHAPE pre-filter accepts both v4 and v7; the indexed `by_globalId` lookup is\n * the referential authority (no full scan). v7-format stays enforced only at new\n * identity minting (`assertUuidV7Identity`). See c2-rr4b-endpoint-referential.\n */\nasync function assertExistingNodeEndpoint(\n ctx: MutationCtx,\n endpointRole: \"fromNodeId\" | \"toNodeId\",\n endpoint: string,\n): Promise<void> {\n assertUuidShapedEdgeEndpoint(endpointRole, endpoint);\n const node = await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_globalId\", (q: any) => q.eq(\"globalId\", endpoint))\n .first();\n if (!node) {\n throw new Error(\n `edge_endpoint_not_canonical: epistemicEdges insert requires ${endpointRole} to be the globalId of an existing epistemicNodes row, received ${endpoint} (no node with that globalId)`,\n );\n }\n}\n\nexport async function insertEpistemicEdge(\n ctx: MutationCtx,\n doc: WithoutSystemFields<Doc<\"epistemicEdges\">>,\n): Promise<Id<\"epistemicEdges\">> {\n assertUuidV7Identity(\"epistemicEdges\", doc.globalId);\n\n // R1.1a — STORAGE-VOCABULARY MEMBERSHIP\n assertStorageEdgeVocabulary(doc.edgeType);\n\n // R1.1b — ENDPOINT PRESENCE\n if (!doc.fromNodeId || typeof doc.fromNodeId !== \"string\") {\n throw new Error(\n \"edge_endpoint_missing: epistemicEdges insert requires a non-empty fromNodeId\"\n );\n }\n if (!doc.toNodeId || typeof doc.toNodeId !== \"string\") {\n throw new Error(\n \"edge_endpoint_missing: epistemicEdges insert requires a non-empty toNodeId\"\n );\n }\n\n // C2-RR.4b Defect E (REFERENTIAL) — ENDPOINT CANONICAL IDENTITY. Edge\n // endpoints must each be the globalId of an EXISTING epistemicNodes row,\n // never a Convex doc id, a legacy topic id, or a fabricated/unknown uuid.\n // This refuses the mixed _id/globalId endpoint writes at the floor while\n // keeping legacy v4-globalId nodes linkable (RR.4b prod-incident cure).\n await assertExistingNodeEndpoint(ctx, \"fromNodeId\", doc.fromNodeId);\n await assertExistingNodeEndpoint(ctx, \"toNodeId\", doc.toNodeId);\n\n // R1.1c — FULL POLICY ASSERT (when nodeTypes are present and edgeType is in public manifest)\n if (doc.fromNodeType && doc.toNodeType && doc.edgeType !== \"extracted_from\") {\n assertEdgePolicyAllowed(\n edgePolicyManifest,\n doc.edgeType,\n {\n kind: \"epistemic_node\",\n nodeId: doc.fromNodeId,\n nodeType: doc.fromNodeType as EpistemicNodeType,\n },\n {\n kind: \"epistemic_node\",\n nodeId: doc.toNodeId,\n nodeType: doc.toNodeType as EpistemicNodeType,\n }\n );\n }\n\n return ctx.db.insert(\"epistemicEdges\", doc);\n}\n","/**\n * Entity Lifecycle Mutations\n *\n * Entity-specific CRUD for ontological nodes (company, person, investor, etc.).\n * Entities are L0 reality infrastructure, NOT epistemic primitives.\n *\n * Key differences from belief mutations:\n * - No confidence field manipulation\n * - No beliefStatus/beliefType fields\n * - Metadata IS mutable (patch directly)\n * - No worktree/sprint gating\n * - Merge operation (beliefs don't merge)\n *\n * Invariant #14: No silent state transitions — all changes logged to epistemicAudit.\n *\n * @module graph-primitives/entityLifecycle\n */\n\nimport { v } from \"convex/values\";\nimport { ConvexError } from \"convex/values\";\nimport { checkProjectAccess } from \"@lucern/access-control/access\";\nimport { getCurrentUserId } from \"@lucern/access-control/auth\";\nimport { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\nimport { internal, mutation, query } from \"./convex\";\nimport type { Id, MutationCtx, QueryCtx } from \"./convex\";\nimport { validateEntityMetadata } from \"./entityValidation\";\nimport { generateGlobalId } from \"./globalId\";\nimport {\n buildEntityTitle,\n matchesCanonicalEntityRecord,\n normalizeCanonicalEntityText,\n type CanonicalEntityRecord,\n} from \"./entityCanonicalMatch\";\nimport { validateEntityTypeForTopic } from \"./topicOntologyResolver\";\nimport { resolveGraphPrimitivesAppResolvers } from \"./resolvers\";\nimport { optionalScopeArgs, resolveTopicProjectScope } from \"./topicScope\";\nimport { insertEpistemicNode, insertEpistemicEdge } from \"./epistemicInsert.js\";\n\n// =============================================================================\n// AUTH HELPERS (same pattern as epistemicBeliefs.ts)\n// =============================================================================\n\ntype StructuredMutationError = Error & {\n status: number;\n code: string;\n invariantCode?: string;\n suggestion?: string;\n details?: unknown;\n};\n\ntype StructuredMutationErrorData = {\n structuredMutationError: true;\n message: string;\n status: number;\n code: string;\n invariantCode?: string;\n suggestion?: string;\n details?: unknown;\n};\n\nfunction throwStructuredMutationError(args: {\n message: string;\n status: number;\n code: string;\n invariantCode?: string;\n suggestion?: string;\n details?: unknown;\n}): never {\n // FR.7 (parity with kernel beliefs.shared.ts): ConvexError carries the\n // structured payload across the Convex boundary so the gateway emits the real\n // status/code rather than a retryable 500. Props retained for in-process tests.\n const data: StructuredMutationErrorData = {\n structuredMutationError: true,\n message: args.message,\n status: args.status,\n code: args.code,\n invariantCode: args.invariantCode,\n suggestion: args.suggestion,\n details: args.details,\n };\n const error = new ConvexError(\n data as unknown as string,\n ) as unknown as ConvexError<string> & Partial<StructuredMutationError>;\n error.status = args.status;\n error.code = args.code;\n error.invariantCode = args.invariantCode;\n error.suggestion = args.suggestion;\n error.details = args.details;\n throw error;\n}\n\nasync function requireAuthenticatedUserId(ctx: {\n auth: { getUserIdentity: () => Promise<unknown> };\n}): Promise<string> {\n const userId = await getCurrentUserId(ctx);\n if (!userId) {\n throwStructuredMutationError({\n message: \"Authentication required.\",\n status: 401,\n code: \"AUTHENTICATION_REQUIRED\",\n invariantCode: \"auth.required\",\n suggestion:\n \"Provide a valid bearer token before invoking entity mutations.\",\n });\n }\n return userId;\n}\n\nasync function requireProjectWriteAccess(\n ctx: QueryCtx | MutationCtx,\n projectId: string,\n userId: string\n): Promise<void> {\n const hasAccess = await checkProjectAccess(ctx, projectId, userId);\n if (!hasAccess) {\n // FR.7: structured, non-retryable 403 naming ONLY the targeted topic and\n // the caller's own principal (no cross-tenant leakage; security condition e).\n throwStructuredMutationError({\n message: `Project write access denied for topic ${projectId}.`,\n status: 403,\n code: \"PROJECT_ACCESS_DENIED\",\n invariantCode: \"policy.scope_required\",\n suggestion:\n \"The acting principal lacks project-write access to this topic. Request a topic grant (or, if the principal created this topic, run the creator-grant backfill) and retry.\",\n details: { topicId: projectId, principalId: userId },\n });\n }\n}\n\n// =============================================================================\n// CONTENT HASHING\n// =============================================================================\n\nfunction generateContentHash(nodeType: string, text: string): string {\n const content = `${nodeType}:${text.trim().toLowerCase().replace(/\\s+/g, \" \")}`;\n let hash = 5381;\n for (let i = 0; i < content.length; i++) {\n hash = (hash << 5) + hash + content.charCodeAt(i);\n hash &= hash;\n }\n return Math.abs(hash).toString(16).padStart(8, \"0\");\n}\n\n// Ontological node types that are entities\nexport const ONTOLOGICAL_NODE_TYPES = [\n \"company\",\n \"person\",\n \"investor\",\n \"function\",\n \"value_chain\",\n] as const;\nconst ONTOLOGICAL_NODE_TYPE_SET = new Set<string>(ONTOLOGICAL_NODE_TYPES);\n\nexport type OntologicalNodeType = (typeof ONTOLOGICAL_NODE_TYPES)[number];\n\nexport const isOntologicalNodeType = ONTOLOGICAL_NODE_TYPE_SET.has.bind(\n ONTOLOGICAL_NODE_TYPE_SET\n) as (nodeType: string) => nodeType is OntologicalNodeType;\n\ntype ScopeTopicDoc = { _id: string; tenantId?: string; workspaceId?: string };\ntype ScopeProjectDoc = { _id: string; tenantId?: string; workspaceId?: string };\ntype CanonicalEntityScope = Awaited<ReturnType<typeof resolveTopicProjectScope>> & {\n tenantId?: string;\n topic: ScopeTopicDoc | null;\n project: ScopeProjectDoc | null;\n};\ntype IndexQuery = { eq(field: string, value: unknown): IndexQuery };\n\nasync function resolveCanonicalEntityScope(\n ctx: QueryCtx | MutationCtx,\n args: { topicId?: string; projectId?: string }\n): Promise<CanonicalEntityScope> {\n const scope = await resolveTopicProjectScope(ctx, args);\n const topic = scope.topicId\n ? (((await ctx.db.get(scope.topicId)) as ScopeTopicDoc | null) ?? null)\n : null;\n const project =\n scope.projectId !== undefined\n ? ((((await resolveGraphPrimitivesAppResolvers(ctx).getProject(\n ctx,\n scope.projectId\n )) as ScopeProjectDoc | null) ?? null))\n : null;\n\n const tenantId =\n typeof topic?.tenantId === \"string\" && topic.tenantId.trim().length > 0\n ? topic.tenantId.trim()\n : typeof project?.tenantId === \"string\" &&\n project.tenantId.trim().length > 0\n ? project.tenantId.trim()\n : undefined;\n\n return {\n ...scope,\n tenantId,\n topic,\n project,\n };\n}\n\nasync function findExistingCanonicalEntity(\n ctx: QueryCtx | MutationCtx,\n args: {\n nodeType: OntologicalNodeType;\n canonicalText: string;\n tenantId?: string;\n }\n) {\n const contentHash = generateContentHash(args.nodeType, args.canonicalText);\n const candidates = await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_contentHash\", (q: IndexQuery) =>\n q.eq(\"contentHash\", contentHash)\n )\n .collect();\n\n return (\n candidates.find((node) =>\n matchesCanonicalEntityRecord(node, {\n nodeType: args.nodeType,\n tenantId: args.tenantId,\n contentHash,\n })\n ) ?? null\n );\n}\n\nasync function listCanonicalEntitiesForScope(\n ctx: QueryCtx | MutationCtx,\n args: {\n tenantId?: string;\n nodeType?: string;\n searchTerm?: string;\n includeArchived?: boolean;\n limit: number;\n }\n) {\n const baseRows =\n args.tenantId !== undefined\n ? await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_tenantId\", (q: IndexQuery) =>\n q.eq(\"tenantId\", args.tenantId)\n )\n .collect()\n : args.nodeType\n ? await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_nodeType\", (q: IndexQuery) =>\n q.eq(\"nodeType\", args.nodeType)\n )\n .collect()\n : await ctx.db.query(\"epistemicNodes\").collect();\n\n const normalizedSearch =\n typeof args.searchTerm === \"string\" && args.searchTerm.trim().length > 0\n ? normalizeCanonicalEntityText(args.searchTerm)\n : undefined;\n\n return baseRows\n .filter((node) =>\n matchesCanonicalEntityRecord(node, {\n nodeType: args.nodeType,\n tenantId: args.tenantId,\n includeArchived: args.includeArchived,\n })\n )\n .filter((node) => {\n if (!normalizedSearch) {\n return true;\n }\n const text =\n typeof node.canonicalText === \"string\" ? node.canonicalText : \"\";\n return normalizeCanonicalEntityText(text).includes(normalizedSearch);\n })\n .sort((a, b) =>\n String(a.title ?? a.canonicalText ?? \"\").localeCompare(\n String(b.title ?? b.canonicalText ?? \"\")\n )\n )\n .slice(0, args.limit);\n}\n\nconst entityVerificationStatusValidator = v.union(\n v.literal(\"unverified\"),\n v.literal(\"human_verified\"),\n v.literal(\"ai_verified\"),\n v.literal(\"contradicted\"),\n v.literal(\"outdated\")\n);\n\n// =============================================================================\n// CANONICAL ENTITY QUERIES\n// =============================================================================\n\n/**\n * List canonical tenant-global entities visible from a topic/project scope.\n * Canonical entities are tenant-scoped and intentionally workspace-global.\n */\nexport const listCanonicalEntities = query({\n args: {\n topicId: v.optional(v.string()),\n scopeProjectId: v.optional(v.string()),\n nodeType: v.optional(v.string()),\n searchTerm: v.optional(v.string()),\n includeArchived: v.optional(v.boolean()),\n limit: v.optional(v.number()),\n },\n returns: permissiveReturn,\n handler: async (ctx: QueryCtx, args) => {\n const scope = await resolveCanonicalEntityScope(ctx, {\n topicId: args.topicId,\n projectId: args.scopeProjectId,\n });\n\n const limit = Math.max(1, Math.min(Math.floor(args.limit ?? 100), 500));\n return listCanonicalEntitiesForScope(ctx, {\n tenantId: scope.tenantId,\n nodeType: args.nodeType,\n searchTerm: args.searchTerm,\n includeArchived: args.includeArchived,\n limit,\n });\n },\n});\n\n// =============================================================================\n// CREATE ENTITY\n// =============================================================================\n\n/**\n * Create a new ontological entity in epistemicNodes.\n *\n * Unlike beliefs, entities:\n * - Have epistemicLayer = 'ontological'\n * - Have no confidence or beliefStatus\n * - Are mutable (metadata can be patched)\n * - Require metadata validation against registered schema\n */\nexport const createEntity = mutation({\n args: {\n nodeType: v.string(), // \"company\", \"person\", \"investor\", \"function\", \"value_chain\"\n canonicalText: v.string(), // Display name (e.g., \"Anthropic\", \"Dario Amodei\")\n metadata: v.optional(v.any()), // Type-specific attributes validated against schema\n subtype: v.optional(v.string()), // e.g., \"company/private\", \"investor/vc\"\n ...optionalScopeArgs,\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const authenticatedUserId = await requireAuthenticatedUserId(ctx);\n const now = Date.now();\n const canonicalText = args.canonicalText.trim();\n\n if (!canonicalText) {\n throwStructuredMutationError({\n message: \"canonicalText is required.\",\n status: 400,\n code: \"INVALID_REQUEST\",\n invariantCode: \"entity.type_check\",\n });\n }\n\n // Validate nodeType is ontological\n if (!isOntologicalNodeType(args.nodeType)) {\n throwStructuredMutationError({\n message: `\"${args.nodeType}\" is not an ontological entity type. Use epistemicBeliefs.create for epistemic nodes.`,\n status: 400,\n code: \"INVALID_NODE_TYPE\",\n invariantCode: \"entity.type_check\",\n suggestion: `Valid entity types: ${ONTOLOGICAL_NODE_TYPES.join(\", \")}`,\n });\n }\n\n // Resolve topic/project scope\n const scope = await resolveCanonicalEntityScope(ctx, {\n topicId: args.topicId,\n projectId: args.projectId,\n });\n if (scope.projectId) {\n await requireProjectWriteAccess(\n ctx,\n scope.projectId,\n authenticatedUserId\n );\n }\n\n // Validate nodeType against the resolved ontology for the topic scope.\n // If the topic (or its ancestor) binds to an ontology with a published version,\n // the entity's nodeType must be in that ontology's entity type vocabulary.\n if (scope.topicId) {\n const ontologyValidation = await validateEntityTypeForTopic(\n ctx,\n scope.topicId,\n args.nodeType\n );\n if (!ontologyValidation.valid) {\n throwStructuredMutationError({\n message: `Ontology validation failed: ${ontologyValidation.error}`,\n status: 400,\n code: \"ONTOLOGY_VALIDATION_ERROR\",\n invariantCode: \"entity.ontology_type_check\",\n suggestion:\n \"Use a nodeType that is defined in the ontology bound to this topic, or update the ontology to include this entity type.\",\n details: { nodeType: args.nodeType, topicId: scope.topicId },\n });\n }\n }\n\n // Validate metadata against registered schema\n const metadata = (args.metadata as Record<string, unknown>) || {};\n const validation = await validateEntityMetadata(\n ctx,\n args.nodeType,\n metadata,\n scope.tenantId\n );\n if (!validation.valid) {\n throwStructuredMutationError({\n message: `Entity metadata validation failed: ${validation.errors.join(\"; \")}`,\n status: 400,\n code: \"VALIDATION_ERROR\",\n invariantCode: \"entity.metadata_schema\",\n suggestion:\n \"Check the registered schema for this entity type in schemaEnumConfig.\",\n details: { errors: validation.errors },\n });\n }\n\n const existing = await findExistingCanonicalEntity(ctx, {\n nodeType: args.nodeType,\n canonicalText,\n tenantId: scope.tenantId,\n });\n if (existing) {\n return {\n nodeId: existing._id,\n globalId: existing.globalId,\n isDuplicate: true,\n };\n }\n\n // Create the entity node\n const entityGlobalId = generateGlobalId();\n const nodeId = await insertEpistemicNode(ctx, {\n globalId: entityGlobalId,\n nodeType: args.nodeType,\n epistemicLayer: \"ontological\",\n subtype: args.subtype,\n canonicalText,\n contentHash: generateContentHash(args.nodeType, canonicalText),\n title: buildEntityTitle(canonicalText),\n metadata: {\n ...metadata,\n ...(args.subtype ? { subtype: args.subtype } : {}),\n status: \"active\",\n },\n tenantId: scope.tenantId,\n sourceType: \"human\",\n verificationStatus: \"unverified\",\n status: \"active\",\n projectId: scope.projectId,\n createdBy: authenticatedUserId,\n createdAt: now,\n updatedAt: now,\n });\n\n // Schedule Neo4j sync\n await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId,\n operation: \"upsert\",\n });\n\n // Log to epistemic audit (Invariant #14)\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"entity\",\n entityId: nodeId,\n changeType: \"created\",\n changedAt: now,\n changedBy: authenticatedUserId,\n isAgent: false,\n previousState: null,\n newState: {\n canonicalText,\n nodeType: args.nodeType,\n tenantId: scope.tenantId,\n workspaceId: null,\n },\n projectId: scope.projectId,\n });\n\n return { nodeId, globalId: entityGlobalId, isDuplicate: false };\n },\n});\n\n// =============================================================================\n// UPDATE ENTITY ATTRIBUTES\n// =============================================================================\n\n/**\n * Patch entity metadata. Entities ARE mutable (unlike scored beliefs).\n * Logs before/after diff to epistemicAudit.\n */\nexport const updateEntityAttributes = mutation({\n args: {\n nodeId: v.id(\"epistemicNodes\"),\n canonicalText: v.optional(v.string()),\n title: v.optional(v.string()),\n metadata: v.optional(v.any()), // Partial metadata to merge\n subtype: v.optional(v.string()),\n domain: v.optional(v.string()),\n tags: v.optional(v.array(v.string())),\n verificationStatus: v.optional(entityVerificationStatusValidator),\n externalIds: v.optional(\n v.object({\n crunchbase: v.optional(v.string()),\n linkedin: v.optional(v.string()),\n pitchbook: v.optional(v.string()),\n twitter: v.optional(v.string()),\n website: v.optional(v.string()),\n })\n ),\n },\n returns: permissiveReturn,\n handler: async (ctx: MutationCtx, args) => {\n const authenticatedUserId = await requireAuthenticatedUserId(ctx);\n const now = Date.now();\n\n const node = await ctx.db.get(args.nodeId);\n if (!node) {\n throwStructuredMutationError({\n message: \"Entity not found.\",\n status: 404,\n code: \"NOT_FOUND\",\n details: { nodeId: args.nodeId },\n });\n }\n\n // Verify this is an ontological node\n if (!isOntologicalNodeType(node.nodeType)) {\n throwStructuredMutationError({\n message: `Node \"${args.nodeId}\" is a ${node.nodeType}, not an entity. Use belief/question APIs for epistemic nodes.`,\n status: 400,\n code: \"LIFECYCLE_VIOLATION\",\n invariantCode: \"entity.type_check\",\n suggestion:\n \"Only ontological entities can be updated via updateEntityAttributes.\",\n });\n }\n\n const scopeProjectId =\n typeof node.projectId === \"string\" && node.projectId.trim().length > 0\n ? node.projectId\n : undefined;\n if (scopeProjectId) {\n await requireProjectWriteAccess(ctx, scopeProjectId, authenticatedUserId);\n }\n\n // Merge new metadata with existing\n const existingMetadata = (node.metadata as Record<string, unknown>) || {};\n const newMetadataFields =\n args.metadata !== undefined\n ? ((args.metadata as Record<string, unknown>) || {})\n : {};\n const mergedMetadata = { ...existingMetadata, ...newMetadataFields };\n if (args.subtype !== undefined) {\n mergedMetadata.subtype = args.subtype;\n }\n\n if (args.canonicalText !== undefined && args.canonicalText.trim().length === 0) {\n throwStructuredMutationError({\n message: \"canonicalText cannot be empty.\",\n status: 400,\n code: \"INVALID_REQUEST\",\n invariantCode: \"entity.update_requires_entity_lifecycle\",\n });\n }\n\n const nextCanonicalText =\n typeof args.canonicalText === \"string\" && args.canonicalText.trim().length > 0\n ? args.canonicalText.trim()\n : node.canonicalText;\n\n if (args.canonicalText !== undefined) {\n const duplicate = await findExistingCanonicalEntity(ctx, {\n nodeType: node.nodeType,\n canonicalText: nextCanonicalText,\n tenantId: typeof node.tenantId === \"string\" ? node.tenantId : undefined,\n });\n if (duplicate && String(duplicate._id) !== String(args.nodeId)) {\n throwStructuredMutationError({\n message:\n \"A canonical entity with this name already exists in the tenant scope.\",\n status: 409,\n code: \"CONFLICT\",\n invariantCode: \"entity.canonical_text_unique_per_tenant\",\n suggestion:\n \"Merge the duplicate entity instead of renaming this node onto an existing canonical record.\",\n details: {\n nodeId: args.nodeId,\n duplicateNodeId: duplicate._id,\n canonicalText: nextCanonicalText,\n },\n });\n }\n }\n\n // Validate merged metadata against schema\n const validation = await validateEntityMetadata(\n ctx,\n node.nodeType,\n mergedMetadata,\n typeof node.tenantId === \"string\" ? node.tenantId : undefined\n );\n if (!validation.valid) {\n throwStructuredMutationError({\n message: `Entity metadata validation failed: ${validation.errors.join(\"; \")}`,\n status: 400,\n code: \"VALIDATION_ERROR\",\n invariantCode: \"entity.metadata_schema\",\n details: { errors: validation.errors },\n });\n }\n\n const updates: Record<string, unknown> = {\n metadata: mergedMetadata,\n updatedAt: now,\n };\n\n if (args.canonicalText !== undefined) {\n updates.canonicalText = nextCanonicalText;\n updates.contentHash = generateContentHash(node.nodeType, nextCanonicalText);\n updates.title =\n args.title !== undefined ? args.title : buildEntityTitle(nextCanonicalText);\n } else if (args.title !== undefined) {\n updates.title = args.title;\n }\n\n if (args.subtype !== undefined) {\n updates.subtype = args.subtype;\n }\n if (args.domain !== undefined) {\n updates.domain = args.domain;\n }\n if (args.tags !== undefined) {\n updates.tags = args.tags;\n }\n if (args.verificationStatus !== undefined) {\n updates.verificationStatus = args.verificationStatus;\n }\n if (args.externalIds !== undefined) {\n updates.externalIds = args.externalIds;\n }\n\n // Patch the node\n await ctx.db.patch(args.nodeId, updates);\n\n // Schedule Neo4j sync\n await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId: args.nodeId,\n operation: \"upsert\",\n });\n\n // Log to epistemic audit with before/after diff (Invariant #14)\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"entity\",\n entityId: args.nodeId,\n changeType: \"entity_attributes_updated\",\n changedAt: now,\n changedBy: authenticatedUserId,\n isAgent: false,\n previousState: {\n canonicalText: node.canonicalText,\n title: node.title,\n subtype: node.subtype,\n domain: node.domain,\n tags: node.tags,\n verificationStatus: node.verificationStatus,\n externalIds: node.externalIds,\n metadata: existingMetadata,\n },\n newState: updates,\n projectId: scopeProjectId,\n });\n\n return { nodeId: args.nodeId, updated: true };\n },\n});\n\n// =============================================================================\n// MERGE ENTITIES\n// =============================================================================\n\n/**\n * Merge a duplicate entity into a canonical one.\n * Non-destructive: duplicate is preserved with status='superseded' and lineage.\n *\n * Steps:\n * 1. Create same_as edge between them\n * 2. Re-point all edges from duplicate → canonical\n * 3. Set duplicate status to 'superseded', supersededBy = canonical\n */\nexport const mergeEntities = mutation({\n args: {\n canonicalNodeId: v.id(\"epistemicNodes\"),\n duplicateNodeId: v.id(\"epistemicNodes\"),\n },\n returns: permissiveReturn,\n handler: async (ctx: MutationCtx, args) => {\n const authenticatedUserId = await requireAuthenticatedUserId(ctx);\n const now = Date.now();\n\n const canonical = await ctx.db.get(args.canonicalNodeId);\n const duplicate = await ctx.db.get(args.duplicateNodeId);\n\n if (!canonical || !duplicate) {\n throwStructuredMutationError({\n message: \"One or both entity nodes not found.\",\n status: 404,\n code: \"NOT_FOUND\",\n details: {\n canonicalNodeId: args.canonicalNodeId,\n duplicateNodeId: args.duplicateNodeId,\n },\n });\n }\n\n if (\n !isOntologicalNodeType(canonical.nodeType) ||\n !isOntologicalNodeType(duplicate.nodeType)\n ) {\n throwStructuredMutationError({\n message: \"Both nodes must be ontological entities to merge.\",\n status: 400,\n code: \"LIFECYCLE_VIOLATION\",\n invariantCode: \"entity.type_check\",\n });\n }\n\n if (args.canonicalNodeId === args.duplicateNodeId) {\n throwStructuredMutationError({\n message: \"Cannot merge an entity with itself.\",\n status: 400,\n code: \"SELF_MERGE\",\n invariantCode: \"entity.no_self_merge\",\n suggestion: \"Provide two different entity IDs to merge.\",\n details: { canonicalNodeId: args.canonicalNodeId },\n });\n }\n\n if (canonical.nodeType !== duplicate.nodeType) {\n throwStructuredMutationError({\n message: `Cannot merge different entity types: ${canonical.nodeType} vs ${duplicate.nodeType}.`,\n status: 400,\n code: \"TYPE_MISMATCH\",\n });\n }\n\n if (canonical.projectId) {\n await requireProjectWriteAccess(\n ctx,\n canonical.projectId as string,\n authenticatedUserId\n );\n }\n\n // 1. Create derived_from edge (canonical replacement for same_as)\n const edgeGlobalId = generateGlobalId();\n await insertEpistemicEdge(ctx, {\n globalId: edgeGlobalId,\n // C2-RR.4 Defect E — canonical UUIDv7 endpoints, not Convex doc ids.\n fromNodeId: duplicate.globalId,\n toNodeId: canonical.globalId,\n sourceGlobalId: duplicate.globalId,\n targetGlobalId: canonical.globalId,\n edgeType: \"derived_from\",\n weight: 1.0,\n context: `Entity merge: ${duplicate.canonicalText} → ${canonical.canonicalText}`,\n createdBy: authenticatedUserId,\n createdAt: now,\n updatedAt: now,\n });\n\n // 2. Re-point all edges from duplicate → canonical\n // Edges where duplicate is the source\n const outgoingEdges = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from\", (q: IndexQuery) =>\n q.eq(\"fromNodeId\", args.duplicateNodeId)\n )\n .collect();\n\n for (const edge of outgoingEdges) {\n if (edge.toNodeId === args.canonicalNodeId) {\n continue; // Skip derived_from merge edge\n }\n await ctx.db.patch(edge._id, {\n fromNodeId: args.canonicalNodeId,\n sourceGlobalId: canonical.globalId,\n updatedAt: now,\n });\n }\n\n // Edges where duplicate is the target\n const incomingEdges = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_to\", (q: IndexQuery) =>\n q.eq(\"toNodeId\", args.duplicateNodeId)\n )\n .collect();\n\n for (const edge of incomingEdges) {\n if (edge.fromNodeId === args.canonicalNodeId) {\n continue; // Skip derived_from merge edge\n }\n await ctx.db.patch(edge._id, {\n toNodeId: args.canonicalNodeId,\n targetGlobalId: canonical.globalId,\n updatedAt: now,\n });\n }\n\n // 3. Set duplicate status to 'superseded'\n const duplicateMetadata =\n (duplicate.metadata as Record<string, unknown>) || {};\n await ctx.db.patch(args.duplicateNodeId, {\n status: \"superseded\",\n metadata: {\n ...duplicateMetadata,\n status: \"superseded\",\n supersededBy: args.canonicalNodeId,\n mergedAt: now,\n mergedBy: authenticatedUserId,\n },\n updatedAt: now,\n });\n\n // Schedule Neo4j sync for both nodes\n await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId: args.canonicalNodeId,\n operation: \"upsert\",\n });\n await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId: args.duplicateNodeId,\n operation: \"upsert\",\n });\n\n // Log to epistemic audit (Invariant #14)\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"entity\",\n entityId: args.canonicalNodeId,\n changeType: \"entity_merged\",\n changedAt: now,\n changedBy: authenticatedUserId,\n isAgent: false,\n rationale: `Entity merge: absorbed ${args.duplicateNodeId} (${duplicate.canonicalText}). ${outgoingEdges.length + incomingEdges.length} edges re-pointed.`,\n previousState: null,\n newState: {\n nodeType: canonical.nodeType,\n canonicalText: canonical.canonicalText,\n },\n projectId: canonical.projectId,\n });\n\n // Count only edges that were actually re-pointed (exclude skipped same_as)\n const outgoingRepointed = outgoingEdges.filter(\n (e) => e.toNodeId !== args.canonicalNodeId\n ).length;\n const incomingRepointed = incomingEdges.filter(\n (e) => e.fromNodeId !== args.canonicalNodeId\n ).length;\n\n // OE-E: Reactive hook — schedule belief review for the canonical entity.\n // After merge, beliefs previously connected to the duplicate now point to\n // the canonical entity. Review whether those beliefs still hold.\n await ctx.scheduler.runAfter(\n 0,\n internal.lucernMcp.triggerEntityChangeReview,\n {\n entityNodeId: args.canonicalNodeId,\n changeDescription: `Merged with duplicate \"${duplicate.canonicalText}\". ${outgoingRepointed + incomingRepointed} edges re-pointed.`,\n userId: authenticatedUserId,\n }\n );\n\n return {\n canonicalNodeId: args.canonicalNodeId,\n duplicateNodeId: args.duplicateNodeId,\n edgesRepointed: outgoingRepointed + incomingRepointed,\n };\n },\n});\n\n// =============================================================================\n// ARCHIVE ENTITY\n// =============================================================================\n\n/**\n * Archive an entity. Sets status to 'archived'.\n * Non-destructive: entity preserved with full lineage.\n */\nexport const archiveEntity = mutation({\n args: {\n nodeId: v.id(\"epistemicNodes\"),\n },\n returns: permissiveReturn,\n handler: async (ctx: MutationCtx, args) => {\n const authenticatedUserId = await requireAuthenticatedUserId(ctx);\n const now = Date.now();\n\n const node = await ctx.db.get(args.nodeId);\n if (!node) {\n throwStructuredMutationError({\n message: \"Entity not found.\",\n status: 404,\n code: \"NOT_FOUND\",\n details: { nodeId: args.nodeId },\n });\n }\n\n if (!isOntologicalNodeType(node.nodeType)) {\n throwStructuredMutationError({\n message: `Node \"${args.nodeId}\" is a ${node.nodeType}, not an entity. Use belief archive APIs for epistemic nodes.`,\n status: 400,\n code: \"LIFECYCLE_VIOLATION\",\n invariantCode: \"entity.type_check\",\n });\n }\n\n if (node.projectId) {\n await requireProjectWriteAccess(\n ctx,\n node.projectId as string,\n authenticatedUserId\n );\n }\n\n await ctx.db.patch(args.nodeId, {\n status: \"archived\",\n updatedAt: now,\n });\n\n // Schedule Neo4j sync\n await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId: args.nodeId,\n operation: \"upsert\",\n });\n\n // Log to epistemic audit (Invariant #14)\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"entity\",\n entityId: args.nodeId,\n changeType: \"entity_archived\",\n changedAt: now,\n changedBy: authenticatedUserId,\n isAgent: false,\n previousState: { status: node.status },\n newState: { status: \"archived\" },\n projectId: node.projectId,\n });\n\n // OE-E: Reactive hook — schedule belief review for archived entity.\n // Beliefs that referenced this entity may need reassessment.\n await ctx.scheduler.runAfter(\n 0,\n internal.lucernMcp.triggerEntityChangeReview,\n {\n entityNodeId: args.nodeId,\n changeDescription: `Entity \"${node.canonicalText}\" was archived.`,\n userId: authenticatedUserId,\n }\n );\n\n return { nodeId: args.nodeId, archived: true };\n },\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/convex.ts","../src/entityValidation.ts","../src/entityCanonicalMatch.ts","../src/topicOntologyResolver.ts","../src/debug.ts","../src/topicProjectOverlay.ts","../src/resolvers.ts","../src/topicScope.ts","../src/epistemicInsert.ts","../src/entityLifecycle.ts"],"names":["v","isMissingLucernChildComponentError","getErrorMessage","LEGACY_SCOPE_FIELD"],"mappings":"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","file":"entityLifecycle.js","sourcesContent":["import {\n actionGeneric,\n anyApi,\n componentsGeneric,\n httpActionGeneric,\n internalActionGeneric,\n internalMutationGeneric,\n internalQueryGeneric,\n mutationGeneric,\n queryGeneric,\n} from \"convex/server\";\nimport type { GenericId } from \"convex/values\";\n\nexport const api = anyApi as any;\nexport const components = componentsGeneric() as any;\nexport const internal = anyApi as any;\n\nexport type TableNames = string;\nexport type Id<TableName extends TableNames = string> = GenericId<TableName>;\nexport type Doc<TableName extends TableNames = string> = any;\nexport type DataModel = any;\ntype IndexRangeBuilder = {\n field(fieldName: string): string;\n eq(fieldName: string, value: unknown): IndexRangeBuilder;\n gt(fieldName: string, value: unknown): IndexRangeBuilder;\n gte(fieldName: string, value: unknown): IndexRangeBuilder;\n lt(fieldName: string, value: unknown): IndexRangeBuilder;\n lte(fieldName: string, value: unknown): IndexRangeBuilder;\n};\ntype FilterBuilder = {\n eq(left: unknown, right: unknown): unknown;\n neq(left: unknown, right: unknown): unknown;\n gt(left: unknown, right: unknown): unknown;\n gte(left: unknown, right: unknown): unknown;\n lt(left: unknown, right: unknown): unknown;\n lte(left: unknown, right: unknown): unknown;\n and(...clauses: unknown[]): unknown;\n or(...clauses: unknown[]): unknown;\n field(fieldName: string): unknown;\n};\ntype QueryInitializer<TableName extends TableNames> = {\n withIndex(\n indexName: string,\n range?: (q: any) => unknown\n ): QueryInitializer<TableName>;\n filter(predicate: (q: any) => unknown): QueryInitializer<TableName>;\n order(direction: \"asc\" | \"desc\"): QueryInitializer<TableName>;\n collect(): Promise<Doc<TableName>[]>;\n take(limit: number): Promise<Doc<TableName>[]>;\n first(): Promise<Doc<TableName> | null>;\n unique(): Promise<Doc<TableName> | null>;\n};\nexport type DatabaseReader = {\n get<TableName extends TableNames>(\n id: Id<TableName>\n ): Promise<Doc<TableName> | null>;\n query<TableName extends TableNames>(\n tableName: TableName\n ): QueryInitializer<TableName>;\n normalizeId?<TableName extends TableNames>(\n tableName: TableName,\n id: string\n ): Id<TableName> | null;\n};\nexport type DatabaseWriter = DatabaseReader & {\n insert<TableName extends TableNames>(\n tableName: TableName,\n value: Record<string, unknown>\n ): Promise<Id<TableName>>;\n patch<TableName extends TableNames>(\n id: Id<TableName>,\n value: Record<string, unknown>\n ): Promise<void>;\n replace<TableName extends TableNames>(\n id: Id<TableName>,\n value: Record<string, unknown>\n ): Promise<void>;\n delete<TableName extends TableNames>(id: Id<TableName>): Promise<void>;\n};\ntype Scheduler = {\n runAfter(delayMs: number, functionReference: unknown, args?: unknown): Promise<void>;\n};\ntype AuthReader = {\n getUserIdentity(): Promise<unknown>;\n};\ntype RuntimeInvoker = {\n runQuery(functionReference: unknown, args?: unknown): Promise<any>;\n runMutation(functionReference: unknown, args?: unknown): Promise<any>;\n runAction(functionReference: unknown, args?: unknown): Promise<any>;\n};\nexport type QueryCtx = RuntimeInvoker & {\n auth: AuthReader;\n db: DatabaseReader;\n scheduler: Scheduler;\n};\nexport type MutationCtx = RuntimeInvoker & {\n auth: AuthReader;\n db: DatabaseWriter;\n scheduler: Scheduler;\n};\nexport type ActionCtx = RuntimeInvoker & {\n auth: AuthReader;\n scheduler: Scheduler;\n};\n\ntype ConvexFunctionBuilder<Ctx> = <\n Definition extends { handler?: (ctx: Ctx, args: any) => any },\n>(\n definition: Definition\n) => any;\n\nexport const action = actionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const httpAction =\n httpActionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const internalAction =\n internalActionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const internalMutation =\n internalMutationGeneric as unknown as ConvexFunctionBuilder<MutationCtx>;\nexport const internalQuery =\n internalQueryGeneric as unknown as ConvexFunctionBuilder<QueryCtx>;\nexport const mutation =\n mutationGeneric as unknown as ConvexFunctionBuilder<MutationCtx>;\nexport const query = queryGeneric as unknown as ConvexFunctionBuilder<QueryCtx>;\n","/**\n * Entity Metadata Validation\n *\n * Validates entity metadata against registered schemas in schemaEnumConfig.\n * Strict on create (must pass), lenient on read (existing data tolerance).\n *\n * @module graph-primitives/entityValidation\n */\n\nimport type { MutationCtx, QueryCtx } from \"./convex\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\ntype FieldSchema = {\n type: \"string\" | \"number\" | \"boolean\";\n required: boolean;\n};\n\ntype EntitySchema = Record<string, FieldSchema>;\n\ntype ValidationResult = {\n valid: boolean;\n errors: string[];\n};\n\n// =============================================================================\n// SCHEMA LOOKUP\n// =============================================================================\n\n/**\n * Fetch the registered metadata schema for an entity type.\n * Returns null if no schema is registered.\n */\nexport async function getEntityTypeSchema(\n ctx: QueryCtx | MutationCtx,\n nodeType: string,\n tenantId?: string\n): Promise<EntitySchema | null> {\n // Try tenant-specific first, then platform default\n if (tenantId) {\n const tenantEntry = await (ctx.db as any)\n .query(\"schemaEnumConfig\")\n .withIndex(\"by_tenant_category\", (q: any) =>\n q.eq(\"tenantId\", tenantId).eq(\"category\", \"entity_type\")\n )\n .collect();\n\n const tenantMatch = tenantEntry.find(\n (e: any) => e.value === nodeType && e.status === \"active\"\n );\n if (tenantMatch?.metadata?.schema) {\n return tenantMatch.metadata.schema as EntitySchema;\n }\n }\n\n // Fall back to platform default\n const platformEntry = await (ctx.db as any)\n .query(\"schemaEnumConfig\")\n .withIndex(\"by_category_value\", (q: any) =>\n q.eq(\"category\", \"entity_type\").eq(\"value\", nodeType)\n )\n .first();\n\n if (platformEntry?.metadata?.schema && platformEntry.status === \"active\") {\n return platformEntry.metadata.schema as EntitySchema;\n }\n\n return null;\n}\n\n// =============================================================================\n// VALIDATION\n// =============================================================================\n\n/**\n * Validate entity metadata against the registered schema.\n *\n * Policy: strict on create (unregistered types fail), lenient on read.\n *\n * @param ctx - Convex query/mutation context\n * @param nodeType - The entity nodeType (e.g., \"company\", \"person\")\n * @param metadata - The metadata object to validate\n * @param tenantId - Optional tenant ID for tenant-specific schemas\n * @returns ValidationResult with errors if invalid\n */\nexport async function validateEntityMetadata(\n ctx: QueryCtx | MutationCtx,\n nodeType: string,\n metadata: Record<string, unknown> | undefined | null,\n tenantId?: string\n): Promise<ValidationResult> {\n const errors: string[] = [];\n\n const schema = await getEntityTypeSchema(ctx, nodeType, tenantId);\n\n if (!schema) {\n return {\n valid: false,\n errors: [\n `No registered schema for entity type \"${nodeType}\". Register it in schemaEnumConfig (category=\"entity_type\") before creating entities of this type.`,\n ],\n };\n }\n\n const meta = metadata || {};\n\n // Check required fields\n for (const [fieldName, fieldDef] of Object.entries(schema)) {\n if (fieldDef.required) {\n const value = meta[fieldName];\n if (value === undefined || value === null || value === \"\") {\n errors.push(`Required field \"${fieldName}\" is missing or empty`);\n }\n }\n }\n\n // Check field types for provided fields\n for (const [fieldName, value] of Object.entries(meta)) {\n const fieldDef = schema[fieldName];\n if (!fieldDef) {\n // Extra fields are allowed (loose metadata tolerance)\n continue;\n }\n\n if (value === undefined || value === null) {\n // null/undefined are allowed for optional fields (already caught above for required)\n continue;\n }\n\n const actualType = typeof value;\n if (actualType !== fieldDef.type) {\n errors.push(\n `Field \"${fieldName}\" expected type \"${fieldDef.type}\" but got \"${actualType}\"`\n );\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\n/**\n * Check if a nodeType is a registered entity type (platform or tenant).\n */\nexport async function isRegisteredEntityType(\n ctx: QueryCtx | MutationCtx,\n nodeType: string,\n tenantId?: string\n): Promise<boolean> {\n const schema = await getEntityTypeSchema(ctx, nodeType, tenantId);\n return schema !== null;\n}\n","/**\n * Canonical-entity match helpers — pure text-normalization, title-derivation,\n * and record-matching predicates behind the canonical-entity dedup/lookup path\n * in entityLifecycle.ts. Extracted from entityLifecycle.ts (the mutations/queries\n * registration stays there) so the module stays under the long-file hard gate;\n * pure code motion, no logic delta.\n */\nimport type { Id } from \"./convex\";\n\nexport type CanonicalEntityRecord = {\n _id: Id<\"epistemicNodes\">;\n title?: string;\n canonicalText?: string;\n status?: string;\n nodeType?: string;\n epistemicLayer?: string;\n tenantId?: string;\n workspaceId?: string;\n contentHash?: string;\n projectId?: string;\n globalId?: string;\n subtype?: string;\n domain?: string;\n tags?: string[];\n verificationStatus?: string;\n externalIds?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n};\n\nexport function normalizeCanonicalEntityText(value: string): string {\n return value.trim().toLowerCase().replace(/\\s+/g, \" \");\n}\n\nexport function buildEntityTitle(canonicalText: string): string {\n return canonicalText.slice(0, 100) + (canonicalText.length > 100 ? \"...\" : \"\");\n}\n\nexport function matchesCanonicalEntityRecord(\n node: CanonicalEntityRecord,\n args: {\n nodeType?: string;\n tenantId?: string;\n contentHash?: string;\n includeArchived?: boolean;\n }\n): boolean {\n if (node.epistemicLayer !== \"ontological\") {\n return false;\n }\n if (node.workspaceId !== undefined) {\n return false;\n }\n if (args.nodeType && node.nodeType !== args.nodeType) {\n return false;\n }\n if (args.contentHash && node.contentHash !== args.contentHash) {\n return false;\n }\n const rowTenantId =\n typeof node.tenantId === \"string\" && node.tenantId.trim().length > 0\n ? node.tenantId.trim()\n : undefined;\n if (rowTenantId !== args.tenantId) {\n return false;\n }\n if (args.includeArchived) {\n return node.status !== \"deleted\";\n }\n return node.status === \"active\";\n}\n","/**\n * Topic Ontology Resolution — Hybrid Inheritance\n *\n * Resolves the effective ontology for a topic by walking the parent chain.\n *\n * Strategy:\n * - If the topic has an ontologyId, return its ontology definition.\n * - Otherwise, walk up the parent chain until an ancestor with an ontologyId is found.\n * - Returns null if no ancestor in the chain has an ontology binding.\n *\n * This is a helper function callable from within Convex mutation/query handlers.\n * For the public query API, see topics.resolveTopicOntology.\n *\n * @module graph-primitives/topicOntologyResolver\n */\n\nimport type { Id } from \"./convex\";\n\n// Minimal topic shape needed for resolution (avoids importing full generated types)\ntype TopicDoc = {\n _id: Id<\"topics\">;\n name: string;\n depth: number;\n ontologyId?: Id<\"ontologyDefinitions\">;\n parentTopicId?: Id<\"topics\">;\n};\n\ntype OntologyDef = {\n _id: Id<\"ontologyDefinitions\">;\n ontologyKey: string;\n name: string;\n tier: \"platform\" | \"pack\" | \"tenant\";\n status: \"draft\" | \"active\" | \"deprecated\" | \"archived\";\n};\n\ntype OntologyVer = {\n _id: Id<\"ontologyVersions\">;\n ontologyId: Id<\"ontologyDefinitions\">;\n version: string;\n status: \"draft\" | \"published\" | \"deprecated\";\n entityTypes: Array<{ value: string; label: string; description?: string }>;\n edgeTypes: Array<{ value: string; label: string; description?: string }>;\n publishedAt?: number;\n};\n\nexport type ResolvedTopicOntology = {\n ontologyId: Id<\"ontologyDefinitions\">;\n ontologyKey: string;\n ontologyName: string;\n tier: string;\n source: \"direct\" | \"inherited\";\n sourceTopicId: Id<\"topics\">;\n /** Valid entity type values from the latest published version */\n validEntityTypes: string[];\n /** Valid edge type values from the latest published version */\n validEdgeTypes: string[];\n /** The published version, if any */\n publishedVersion: OntologyVer | null;\n};\n\nconst MAX_RESOLUTION_DEPTH = 10;\n\n/**\n * Resolve the effective ontology for a topic.\n *\n * @param ctx - Convex mutation/query context with db access\n * @param topicId - The topic to resolve the ontology for\n * @returns The resolved ontology or null if none is bound in the ancestor chain\n */\nexport async function resolveTopicOntologyInternal(\n ctx: { db: any },\n topicId: Id<\"topics\">\n): Promise<ResolvedTopicOntology | null> {\n let current = (await ctx.db.get(topicId)) as TopicDoc | null;\n if (!current) {\n return null;\n }\n\n const startTopicId = topicId;\n\n for (let i = 0; i < MAX_RESOLUTION_DEPTH && current; i++) {\n if (current.ontologyId) {\n const ontologyDef = (await ctx.db.get(\n current.ontologyId\n )) as OntologyDef | null;\n if (!ontologyDef || ontologyDef.status === \"archived\") {\n // Ontology was archived or deleted — continue walking up\n if (current.parentTopicId) {\n current = (await ctx.db.get(\n current.parentTopicId\n )) as TopicDoc | null;\n continue;\n }\n return null;\n }\n\n // Fetch the latest published version for this ontology\n const versions = (await ctx.db\n .query(\"ontologyVersions\")\n .withIndex(\"by_ontologyId\", (q: any) =>\n q.eq(\"ontologyId\", current?.ontologyId!)\n )\n .collect()) as OntologyVer[];\n\n const published = versions\n .filter((v) => v.status === \"published\")\n .sort((a, b) => (b.publishedAt ?? 0) - (a.publishedAt ?? 0));\n\n const latestPublished = published[0] ?? null;\n\n return {\n ontologyId: ontologyDef._id,\n ontologyKey: ontologyDef.ontologyKey,\n ontologyName: ontologyDef.name,\n tier: ontologyDef.tier,\n source: current._id === startTopicId ? \"direct\" : \"inherited\",\n sourceTopicId: current._id,\n validEntityTypes: latestPublished\n ? latestPublished.entityTypes.map((et) => et.value)\n : [],\n validEdgeTypes: latestPublished\n ? latestPublished.edgeTypes.map((et) => et.value)\n : [],\n publishedVersion: latestPublished,\n };\n }\n\n // No ontologyId on this topic — walk up\n if (!current.parentTopicId) {\n break;\n }\n current = (await ctx.db.get(current.parentTopicId)) as TopicDoc | null;\n }\n\n return null;\n}\n\n/**\n * Validate that a nodeType is allowed by the resolved ontology for a topic.\n *\n * Returns { valid: true } if:\n * - The topic has no bound ontology (no constraint)\n * - The nodeType is in the ontology's published entity types\n *\n * Returns { valid: false, error } if:\n * - The topic has a bound ontology and the nodeType is not in its entity types\n */\nexport async function validateEntityTypeForTopic(\n ctx: { db: any },\n topicId: Id<\"topics\">,\n nodeType: string\n): Promise<{ valid: true } | { valid: false; error: string }> {\n const resolved = await resolveTopicOntologyInternal(ctx, topicId);\n\n // No ontology bound — all entity types are allowed\n if (!resolved) {\n return { valid: true };\n }\n\n // No published version — ontology exists but has no content yet, allow all\n if (resolved.validEntityTypes.length === 0) {\n return { valid: true };\n }\n\n // Check if nodeType is in the ontology's entity types\n if (resolved.validEntityTypes.includes(nodeType)) {\n return { valid: true };\n }\n\n return {\n valid: false,\n error: `Entity type \"${nodeType}\" is not defined in the ontology \"${resolved.ontologyKey}\" (${resolved.ontologyName}). Valid entity types: ${resolved.validEntityTypes.join(\", \")}. Source: ${resolved.source} from topic ${resolved.sourceTopicId}.`,\n };\n}\n","type GraphPrimitiveDebugEnvironment = {\n process?: {\n env?: Record<string, string | undefined>;\n };\n};\n\nfunction isGraphPrimitiveDebugEnabled(): boolean {\n const env = (globalThis as GraphPrimitiveDebugEnvironment).process?.env;\n return (\n env?.LUCERN_COMPAT_FALLBACK_DEBUG === \"1\" ||\n env?.LUCERN_GRAPH_DEBUG === \"1\"\n );\n}\n\nexport function formatGraphPrimitiveError(error: unknown): string {\n if (error instanceof Error) {\n return `${error.name}: ${error.message}`;\n }\n if (typeof error === \"string\") {\n return error;\n }\n if (error === null) {\n return \"null\";\n }\n if (error === undefined) {\n return \"undefined\";\n }\n try {\n return JSON.stringify(error);\n } catch {\n return Object.prototype.toString.call(error);\n }\n}\n\nexport function debugGraphPrimitiveFallback(\n message: string,\n context?: Record<string, unknown>\n): void {\n if (!isGraphPrimitiveDebugEnabled()) {\n return;\n }\n console.debug(message, context ?? {});\n}\n","import { api } from \"./convex\";\nimport { debugGraphPrimitiveFallback } from \"./debug\";\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 = \"critical\" | \"major\" | \"minor\" | \"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 /** FR.7 creator-grant: the exact acting principal recorded as owner-principal. */\n ownerPrincipalId?: string;\n createdAt?: number;\n updatedAt?: number;\n metadata?: Record<string, unknown>;\n};\n\nexport type TopicProjectOverlay = Record<string, unknown> & {\n _id: string;\n projectId: string;\n topicId: string;\n storageProjectId: string;\n legacyProjectId?: string;\n name: string;\n type: string;\n description?: string;\n ownerId: string;\n /** FR.7 creator-grant: principal-shaped owner; distinct from clerkId-shaped ownerId. */\n ownerPrincipalId?: string;\n sharedWith: string[];\n visibility: \"private\" | \"team\" | \"firm\" | \"external\" | \"public\";\n tenantId?: string;\n workspaceId?: string;\n status: \"active\" | \"archived\" | \"watching\";\n tags: string[];\n chatCount: number;\n artifactCount: number;\n lastActivityAt: number;\n thesis?: LegacyProjectThesis;\n wedgeHypothesis?: string;\n founderArchetype?: string;\n investmentCriteria?: string[];\n sprintPhase?:\n | \"pre_sprint\"\n | \"readiness_check\"\n | \"thesis_crystallization\"\n | \"sprint_planning\"\n | \"active_sprint\"\n | \"theme_assembly\"\n | \"evolution\";\n currentSprintIndex?: number;\n thesisPillarConfig?: LegacyThesisPillarConfig;\n beliefArchitecture?: LegacyBeliefArchitecture;\n ontologyClassification?: LegacyOntologyClassification;\n _creationTime: number;\n createdAt: number;\n updatedAt: number;\n};\n\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 = getErrorMessage(error);\n return (\n message.includes(\n 'Child component ComponentName(Identifier(\"lucern\")) not found',\n ) ||\n (message.includes(\"Child component\") &&\n message.includes(\"lucern\") &&\n message.includes(\"not found\"))\n );\n}\n\nfunction getErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"message\" in error &&\n typeof (error as { message?: unknown }).message === \"string\"\n ) {\n return (error as { message: string }).message;\n }\n return \"unknown error\";\n}\n\nasync function resolveTopicDoc(\n ctx: 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(\n scopeId as any,\n )) as TopicDocLike | null;\n if (directTopic) {\n return directTopic;\n }\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicProjectOverlay] Failed to resolve topic by direct ID\",\n {\n error,\n scopeId,\n },\n );\n // Not a direct topics-table id.\n }\n }\n\n if (typeof ctx.runQuery !== \"function\") {\n return null;\n }\n\n try {\n const topic = await ctx.runQuery(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 (error) {\n debugGraphPrimitiveFallback(\n \"[topicProjectOverlay] Failed to resolve topic by ID query\",\n {\n error,\n scopeId,\n },\n );\n // Fall through to legacy-scope lookup.\n }\n\n try {\n const topic = await ctx.runQuery(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 (error) {\n debugGraphPrimitiveFallback(\n \"[topicProjectOverlay] Failed to resolve topic by legacy scope ID\",\n { error, scopeId },\n );\n // Best-effort compat lookup only.\n }\n\n return null;\n}\n\nexport function materializeTopicProjectOverlay(\n topic: TopicDocLike,\n idMode: OverlayIdMode = \"legacy\",\n): TopicProjectOverlay {\n const metadata = readMetadata(topic);\n const topicId = String(topic._id);\n const legacyProjectId =\n readLegacyProjectId(topic) ||\n readLegacyProjectId(metadata) ||\n readNonEmptyString(metadata.legacyProjectId);\n const storageProjectId = legacyProjectId || topicId;\n const outwardId = idMode === \"topic\" ? topicId : storageProjectId;\n const visibility =\n coerceVisibility(topic.visibility) ||\n coerceVisibility(metadata.visibility) ||\n \"private\";\n const status =\n coerceStatus(topic.status) || coerceStatus(metadata.status) || \"active\";\n 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 // FR.7 creator-grant: surface the principal-shaped owner field (column-first,\n // metadata fallback for legacy rows that recorded it in metadata).\n ownerPrincipalId:\n readNonEmptyString(topic.ownerPrincipalId) ||\n readNonEmptyString(metadata.ownerPrincipalId),\n // RR.1 carrier: preserve the nested metadata carrier so the kernel's\n // `checkProjectAccessDetailed` metadata-PRIMARY read\n // (`project.metadata?.ownerPrincipalId`) resolves the grant. The `...metadata`\n // spread above only flattens keys; it does not leave a nested `metadata`.\n metadata,\n sharedWith: readStringArray(metadata.sharedWith),\n visibility,\n tenantId:\n readNonEmptyString(topic.tenantId) ||\n readNonEmptyString(metadata.tenantId),\n workspaceId:\n readNonEmptyString(topic.workspaceId) ||\n readNonEmptyString(metadata.workspaceId),\n status,\n tags: readStringArray(metadata.tags),\n chatCount:\n typeof metadata.chatCount === \"number\"\n ? (metadata.chatCount as number)\n : 0,\n artifactCount:\n typeof metadata.artifactCount === \"number\"\n ? (metadata.artifactCount as number)\n : 0,\n lastActivityAt:\n typeof metadata.lastActivityAt === \"number\"\n ? (metadata.lastActivityAt as number)\n : updatedAt,\n _creationTime:\n typeof topic._creationTime === \"number\" ? topic._creationTime : createdAt,\n createdAt,\n updatedAt,\n };\n}\n\nexport async function resolveTopicProjectOverlay(\n ctx: 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 (error) {\n debugGraphPrimitiveFallback(\n \"[topicProjectOverlay] Failed to read topics table; falling back to API\",\n { error },\n );\n allTopics = [];\n }\n }\n\n if (allTopics.length === 0 && typeof ctx.runQuery === \"function\") {\n allTopics =\n (((await ctx.runQuery(api.topics.list as any, {})) ??\n []) as TopicDocLike[]) || [];\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 ...topic,\n ...patch,\n metadata: nextMetadata,\n } as TopicDocLike);\n}\n\nexport function matchesTopicProjectOverlayAccess(\n accessibleProjectIds: Set<string>,\n project: {\n topicId: string;\n legacyProjectId?: string;\n storageProjectId?: string;\n },\n): boolean {\n return (\n accessibleProjectIds.has(project.storageProjectId || project.topicId) ||\n accessibleProjectIds.has(project.topicId) ||\n (typeof project.legacyProjectId === \"string\" &&\n accessibleProjectIds.has(project.legacyProjectId))\n );\n}\n","/** Data-source resolver wiring for the graph-primitives module. */\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 = getErrorMessage(error);\n return (\n message.includes(\n 'Child component ComponentName(Identifier(\"lucern\")) not found',\n ) ||\n (message.includes(\"Child component\") &&\n message.includes(\"lucern\") &&\n message.includes(\"not found\"))\n );\n}\n\nfunction getErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"message\" in error &&\n typeof (error as { message?: unknown }).message === \"string\"\n ) {\n return (error as { message: string }).message;\n }\n return \"unknown error\";\n}\n\nfunction isAdvisoryTopicPatch(value: Record<string, unknown>): boolean {\n const advisoryKeys = new Set([\"lastActivityAt\", \"updatedAt\"]);\n const keys = Object.keys(value);\n return keys.length > 0 && keys.every((key) => advisoryKeys.has(key));\n}\n\nasync function patchProjectWithTolerance(\n ctx: GraphPrimitivesAppResolverContext,\n projectId: string,\n value: Record<string, unknown>,\n): Promise<void> {\n try {\n await patchTopicProjectOverlay(ctx, projectId, value);\n } catch (error) {\n if (\n !isAdvisoryTopicPatch(value) ||\n !isMissingLucernChildComponentError(error)\n ) {\n throw error;\n }\n\n console.warn(\n \"[lucern graph-primitives] Non-fatal advisory topic patch failure\",\n {\n projectId,\n keys: Object.keys(value),\n error: getErrorMessage(error),\n },\n );\n }\n}\n\nfunction defaultResolvers(): GraphPrimitivesAppResolvers {\n return {\n getProject: (ctx, projectId) =>\n resolveTopicProjectOverlay(ctx, projectId, {\n idMode: \"legacy\",\n projectLikeOnly: false,\n }),\n patchProject: (ctx, projectId, value) =>\n patchProjectWithTolerance(ctx, projectId, value),\n listTopics: (ctx) =>\n listTopicProjectOverlays(ctx, {\n idMode: \"legacy\",\n }),\n getFinalArtifact: (ctx, artifactId) => ctx.db.get(artifactId),\n };\n}\n\nlet resolverOverrides: Partial<GraphPrimitivesAppResolvers> = {};\n\nexport function configureGraphPrimitivesAppResolvers(\n overrides: Partial<GraphPrimitivesAppResolvers>,\n): void {\n resolverOverrides = {\n ...resolverOverrides,\n ...overrides,\n };\n}\n\nexport function resetGraphPrimitivesAppResolvers(): void {\n resolverOverrides = {};\n}\n\nexport function resolveGraphPrimitivesAppResolvers(\n _ctx: GraphPrimitivesAppResolverContext,\n): GraphPrimitivesAppResolvers {\n return {\n ...defaultResolvers(),\n ...resolverOverrides,\n };\n}\n","/** Topic-scope resolution helpers for graph-primitive operations. */\nimport { v } from \"convex/values\";\nimport { api as appApi } from \"./convex\";\nimport type { Id } from \"./convex\";\nimport { debugGraphPrimitiveFallback } from \"./debug\";\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:\n | \"topic\"\n | \"project_mapped_topic\"\n | \"topic_inferred\"\n | \"topic_node\";\n};\n\n/**\n * RR.5 (legacy topics-table retirement) — graph-primitives mirror of the\n * kernel's epistemicNodes-first topic-scope fallback. Kept in lockstep with\n * `packages/reasoning-kernel/src/adapters/lib/topicScope.ts`\n * (`tests/unit/convex/topic-scope-fallbacks.test.ts` asserts parity).\n *\n * Resolves a topic that exists only as `epistemicNodes(nodeType=\"topic\")` —\n * the write-of-record — when no legacy `topics` row backs the ref, returning the\n * node's `topicId` self-key so scoped beliefs/evidence/questions stay reachable.\n * See the kernel module for the full silent-empty-result rationale.\n */\ntype TopicNodeScopeDoc = {\n _id: string | Id<\"epistemicNodes\">;\n globalId?: string;\n nodeType?: string;\n topicId?: string;\n metadata?: Record<string, unknown>;\n};\n\nasync function resolveTopicNodeScopeOrNull(\n ctx: any,\n ref: string,\n): Promise<TopicProjectScope | null> {\n if (!ctx?.db || typeof ctx.db.query !== \"function\") {\n return null;\n }\n\n let node: TopicNodeScopeDoc | null = null;\n\n // 1. The ref IS the topic node's UUIDv7 globalId.\n try {\n const byGlobalId = (await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_globalId\", (q: any) => q.eq(\"globalId\", ref))\n .first()) as TopicNodeScopeDoc | null;\n if (byGlobalId && byGlobalId.nodeType === \"topic\") {\n node = byGlobalId;\n }\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] topic-node scope lookup by globalId failed\",\n { error, ref },\n );\n }\n\n if (!node) {\n return null;\n }\n\n const scopeKey =\n normalizeScopeValue(node.topicId) ?? normalizeScopeValue(node.globalId);\n if (!scopeKey) {\n return null;\n }\n\n return {\n topicId: scopeKey as Id<\"topics\">,\n projectId: asMappedProjectId(node as unknown as TopicDoc),\n source: \"topic_node\",\n };\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(\n ctx: any,\n scopeId: string,\n): 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 (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to resolve scope alias via index\",\n {\n error,\n scopeId,\n },\n );\n // Older Lucern dev deployments can lag index backfills while still carrying\n // the underlying topics table. Scan and filter so scope resolution keeps\n // working during the rollout.\n const topics = (await 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 (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to resolve topic by host query\",\n {\n error,\n topicId,\n },\n );\n return null;\n }\n}\n\nasync function tryResolveHostTopicByLegacyScope(\n ctx: 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 (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to resolve topic by legacy scope\",\n {\n error,\n legacyScopeId,\n },\n );\n return null;\n }\n}\n\nexport function readMaterializedTopicTableId(\n topicNode: MaterializedTopicNodeDoc | null | undefined,\n): string | undefined {\n if (!topicNode) {\n return;\n }\n\n const metadata = (topicNode.metadata || {}) as Record<string, unknown>;\n const topicTableId =\n (metadata.topicTableId as string | undefined) ||\n (metadata.topicId as string | undefined);\n\n return typeof topicTableId === \"string\" && topicTableId.trim().length > 0\n ? topicTableId.trim()\n : undefined;\n}\n\n/**\n * Walk the topic parent chain to find inherited workspaceId and tenantId.\n * Mirrors the pattern used by resolveTopicOntology for ontologyId inheritance.\n * Max depth: 10 (defensive limit against pathological nesting).\n */\nasync function resolveInheritedWorkspaceScope(\n ctx: 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(\n args.topicId as Id<\"topics\">,\n )) as TopicDoc | null;\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to load topic by direct id\",\n {\n error,\n topicId: args.topicId,\n },\n );\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 // RR.5: no legacy topics row — resolve the canonical topic node store\n // before throwing (silent-empty-result fix).\n const nodeScope = await resolveTopicNodeScopeOrNull(\n ctx,\n String(args.topicId),\n );\n if (nodeScope) {\n return nodeScope;\n }\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 (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to load direct project topic\",\n {\n error,\n projectId: args.projectId,\n },\n );\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 // RR.5: try the canonical topic node store before failing.\n const nodeScope = await resolveTopicNodeScopeOrNull(\n ctx,\n String(args.projectId),\n );\n if (nodeScope) {\n return {\n ...nodeScope,\n projectId: nodeScope.projectId ?? String(args.projectId),\n };\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","import type { WithoutSystemFields } from \"convex/server\";\nimport {\n assertUuidV7Identity,\n assertStorageEdgeVocabulary,\n assertUuidShapedEdgeEndpoint,\n} from \"@lucern/contracts/ids\";\nimport {\n assertEdgePolicyAllowed,\n edgePolicyManifest,\n type EpistemicNodeType,\n} from \"@lucern/contracts\";\nimport type { Doc, Id, MutationCtx } from \"./convex\";\n\nexport async function insertEpistemicNode(\n ctx: MutationCtx,\n doc: WithoutSystemFields<Doc<\"epistemicNodes\">>,\n): Promise<Id<\"epistemicNodes\">> {\n assertUuidV7Identity(\"epistemicNodes\", doc.globalId);\n return ctx.db.insert(\"epistemicNodes\", doc);\n}\n\n/**\n * C2-RR.4b — REFERENTIAL edge-endpoint canonicality (amends RR.4's FORMAT guard).\n *\n * Proves an endpoint is the `globalId` of an EXISTING `epistemicNodes` row, not\n * that it has a v7 shape. Refuses doc-ids and fabricated/unknown endpoints while\n * keeping legacy v4-`globalId` nodes (the established prod corpus) linkable.\n * SHAPE pre-filter accepts both v4 and v7; the indexed `by_globalId` lookup is\n * the referential authority (no full scan). v7-format stays enforced only at new\n * identity minting (`assertUuidV7Identity`). See c2-rr4b-endpoint-referential.\n */\nasync function assertExistingNodeEndpoint(\n ctx: MutationCtx,\n endpointRole: \"fromNodeId\" | \"toNodeId\",\n endpoint: string,\n): Promise<void> {\n assertUuidShapedEdgeEndpoint(endpointRole, endpoint);\n const node = await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_globalId\", (q: any) => q.eq(\"globalId\", endpoint))\n .first();\n if (!node) {\n throw new Error(\n `edge_endpoint_not_canonical: epistemicEdges insert requires ${endpointRole} to be the globalId of an existing epistemicNodes row, received ${endpoint} (no node with that globalId)`,\n );\n }\n}\n\nexport async function insertEpistemicEdge(\n ctx: MutationCtx,\n doc: WithoutSystemFields<Doc<\"epistemicEdges\">>,\n): Promise<Id<\"epistemicEdges\">> {\n assertUuidV7Identity(\"epistemicEdges\", doc.globalId);\n\n // R1.1a — STORAGE-VOCABULARY MEMBERSHIP\n assertStorageEdgeVocabulary(doc.edgeType);\n\n // R1.1b — ENDPOINT PRESENCE\n if (!doc.fromNodeId || typeof doc.fromNodeId !== \"string\") {\n throw new Error(\n \"edge_endpoint_missing: epistemicEdges insert requires a non-empty fromNodeId\"\n );\n }\n if (!doc.toNodeId || typeof doc.toNodeId !== \"string\") {\n throw new Error(\n \"edge_endpoint_missing: epistemicEdges insert requires a non-empty toNodeId\"\n );\n }\n\n // C2-RR.4b Defect E (REFERENTIAL) — ENDPOINT CANONICAL IDENTITY. Edge\n // endpoints must each be the globalId of an EXISTING epistemicNodes row,\n // never a Convex doc id, a legacy topic id, or a fabricated/unknown uuid.\n // This refuses the mixed _id/globalId endpoint writes at the floor while\n // keeping legacy v4-globalId nodes linkable (RR.4b prod-incident cure).\n await assertExistingNodeEndpoint(ctx, \"fromNodeId\", doc.fromNodeId);\n await assertExistingNodeEndpoint(ctx, \"toNodeId\", doc.toNodeId);\n\n // R1.1c — FULL POLICY ASSERT (when nodeTypes are present and edgeType is in public manifest)\n if (doc.fromNodeType && doc.toNodeType && doc.edgeType !== \"extracted_from\") {\n assertEdgePolicyAllowed(\n edgePolicyManifest,\n doc.edgeType,\n {\n kind: \"epistemic_node\",\n nodeId: doc.fromNodeId,\n nodeType: doc.fromNodeType as EpistemicNodeType,\n },\n {\n kind: \"epistemic_node\",\n nodeId: doc.toNodeId,\n nodeType: doc.toNodeType as EpistemicNodeType,\n }\n );\n }\n\n return ctx.db.insert(\"epistemicEdges\", doc);\n}\n","/**\n * Entity Lifecycle Mutations\n *\n * Entity-specific CRUD for ontological nodes (company, person, investor, etc.).\n * Entities are L0 reality infrastructure, NOT epistemic primitives.\n *\n * Key differences from belief mutations:\n * - No confidence field manipulation\n * - No beliefStatus/beliefType fields\n * - Metadata IS mutable (patch directly)\n * - No worktree/sprint gating\n * - Merge operation (beliefs don't merge)\n *\n * Invariant #14: No silent state transitions — all changes logged to epistemicAudit.\n *\n * @module graph-primitives/entityLifecycle\n */\n\nimport { v } from \"convex/values\";\nimport { ConvexError } from \"convex/values\";\nimport { checkProjectAccess } from \"@lucern/access-control/access\";\nimport { getCurrentUserId } from \"@lucern/access-control/auth\";\nimport { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\nimport { internal, mutation, query } from \"./convex\";\nimport type { Id, MutationCtx, QueryCtx } from \"./convex\";\nimport { validateEntityMetadata } from \"./entityValidation\";\nimport { generateGlobalId } from \"./globalId\";\nimport {\n buildEntityTitle,\n matchesCanonicalEntityRecord,\n normalizeCanonicalEntityText,\n type CanonicalEntityRecord,\n} from \"./entityCanonicalMatch\";\nimport { validateEntityTypeForTopic } from \"./topicOntologyResolver\";\nimport { resolveGraphPrimitivesAppResolvers } from \"./resolvers\";\nimport { optionalScopeArgs, resolveTopicProjectScope } from \"./topicScope\";\nimport { insertEpistemicNode, insertEpistemicEdge } from \"./epistemicInsert.js\";\n\n// =============================================================================\n// AUTH HELPERS (same pattern as epistemicBeliefs.ts)\n// =============================================================================\n\ntype StructuredMutationError = Error & {\n status: number;\n code: string;\n invariantCode?: string;\n suggestion?: string;\n details?: unknown;\n};\n\ntype StructuredMutationErrorData = {\n structuredMutationError: true;\n message: string;\n status: number;\n code: string;\n invariantCode?: string;\n suggestion?: string;\n details?: unknown;\n};\n\nfunction throwStructuredMutationError(args: {\n message: string;\n status: number;\n code: string;\n invariantCode?: string;\n suggestion?: string;\n details?: unknown;\n}): never {\n // FR.7 (parity with kernel beliefs.shared.ts): ConvexError carries the\n // structured payload across the Convex boundary so the gateway emits the real\n // status/code rather than a retryable 500. Props retained for in-process tests.\n const data: StructuredMutationErrorData = {\n structuredMutationError: true,\n message: args.message,\n status: args.status,\n code: args.code,\n invariantCode: args.invariantCode,\n suggestion: args.suggestion,\n details: args.details,\n };\n const error = new ConvexError(\n data as unknown as string,\n ) as unknown as ConvexError<string> & Partial<StructuredMutationError>;\n error.status = args.status;\n error.code = args.code;\n error.invariantCode = args.invariantCode;\n error.suggestion = args.suggestion;\n error.details = args.details;\n throw error;\n}\n\nasync function requireAuthenticatedUserId(ctx: {\n auth: { getUserIdentity: () => Promise<unknown> };\n}): Promise<string> {\n const userId = await getCurrentUserId(ctx);\n if (!userId) {\n throwStructuredMutationError({\n message: \"Authentication required.\",\n status: 401,\n code: \"AUTHENTICATION_REQUIRED\",\n invariantCode: \"auth.required\",\n suggestion:\n \"Provide a valid bearer token before invoking entity mutations.\",\n });\n }\n return userId;\n}\n\nasync function requireProjectWriteAccess(\n ctx: QueryCtx | MutationCtx,\n projectId: string,\n userId: string\n): Promise<void> {\n const hasAccess = await checkProjectAccess(ctx, projectId, userId);\n if (!hasAccess) {\n // FR.7: structured, non-retryable 403 naming ONLY the targeted topic and\n // the caller's own principal (no cross-tenant leakage; security condition e).\n throwStructuredMutationError({\n message: `Project write access denied for topic ${projectId}.`,\n status: 403,\n code: \"PROJECT_ACCESS_DENIED\",\n invariantCode: \"policy.scope_required\",\n suggestion:\n \"The acting principal lacks project-write access to this topic. Request a topic grant (or, if the principal created this topic, run the creator-grant backfill) and retry.\",\n details: { topicId: projectId, principalId: userId },\n });\n }\n}\n\n// =============================================================================\n// CONTENT HASHING\n// =============================================================================\n\nfunction generateContentHash(nodeType: string, text: string): string {\n const content = `${nodeType}:${text.trim().toLowerCase().replace(/\\s+/g, \" \")}`;\n let hash = 5381;\n for (let i = 0; i < content.length; i++) {\n hash = (hash << 5) + hash + content.charCodeAt(i);\n hash &= hash;\n }\n return Math.abs(hash).toString(16).padStart(8, \"0\");\n}\n\n// Ontological node types that are entities\nexport const ONTOLOGICAL_NODE_TYPES = [\n \"company\",\n \"person\",\n \"investor\",\n \"function\",\n \"value_chain\",\n] as const;\nconst ONTOLOGICAL_NODE_TYPE_SET = new Set<string>(ONTOLOGICAL_NODE_TYPES);\n\nexport type OntologicalNodeType = (typeof ONTOLOGICAL_NODE_TYPES)[number];\n\nexport const isOntologicalNodeType = ONTOLOGICAL_NODE_TYPE_SET.has.bind(\n ONTOLOGICAL_NODE_TYPE_SET\n) as (nodeType: string) => nodeType is OntologicalNodeType;\n\ntype ScopeTopicDoc = { _id: string; tenantId?: string; workspaceId?: string };\ntype ScopeProjectDoc = { _id: string; tenantId?: string; workspaceId?: string };\ntype CanonicalEntityScope = Awaited<ReturnType<typeof resolveTopicProjectScope>> & {\n tenantId?: string;\n topic: ScopeTopicDoc | null;\n project: ScopeProjectDoc | null;\n};\ntype IndexQuery = { eq(field: string, value: unknown): IndexQuery };\n\nasync function resolveCanonicalEntityScope(\n ctx: QueryCtx | MutationCtx,\n args: { topicId?: string; projectId?: string }\n): Promise<CanonicalEntityScope> {\n const scope = await resolveTopicProjectScope(ctx, args);\n const topic = scope.topicId\n ? (((await ctx.db.get(scope.topicId)) as ScopeTopicDoc | null) ?? null)\n : null;\n const project =\n scope.projectId !== undefined\n ? ((((await resolveGraphPrimitivesAppResolvers(ctx).getProject(\n ctx,\n scope.projectId\n )) as ScopeProjectDoc | null) ?? null))\n : null;\n\n const tenantId =\n typeof topic?.tenantId === \"string\" && topic.tenantId.trim().length > 0\n ? topic.tenantId.trim()\n : typeof project?.tenantId === \"string\" &&\n project.tenantId.trim().length > 0\n ? project.tenantId.trim()\n : undefined;\n\n return {\n ...scope,\n tenantId,\n topic,\n project,\n };\n}\n\nasync function findExistingCanonicalEntity(\n ctx: QueryCtx | MutationCtx,\n args: {\n nodeType: OntologicalNodeType;\n canonicalText: string;\n tenantId?: string;\n }\n) {\n const contentHash = generateContentHash(args.nodeType, args.canonicalText);\n const candidates = await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_contentHash\", (q: IndexQuery) =>\n q.eq(\"contentHash\", contentHash)\n )\n .collect();\n\n return (\n candidates.find((node) =>\n matchesCanonicalEntityRecord(node, {\n nodeType: args.nodeType,\n tenantId: args.tenantId,\n contentHash,\n })\n ) ?? null\n );\n}\n\nasync function listCanonicalEntitiesForScope(\n ctx: QueryCtx | MutationCtx,\n args: {\n tenantId?: string;\n nodeType?: string;\n searchTerm?: string;\n includeArchived?: boolean;\n limit: number;\n }\n) {\n const baseRows =\n args.tenantId !== undefined\n ? await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_tenantId\", (q: IndexQuery) =>\n q.eq(\"tenantId\", args.tenantId)\n )\n .collect()\n : args.nodeType\n ? await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_nodeType\", (q: IndexQuery) =>\n q.eq(\"nodeType\", args.nodeType)\n )\n .collect()\n : await ctx.db.query(\"epistemicNodes\").collect();\n\n const normalizedSearch =\n typeof args.searchTerm === \"string\" && args.searchTerm.trim().length > 0\n ? normalizeCanonicalEntityText(args.searchTerm)\n : undefined;\n\n return baseRows\n .filter((node) =>\n matchesCanonicalEntityRecord(node, {\n nodeType: args.nodeType,\n tenantId: args.tenantId,\n includeArchived: args.includeArchived,\n })\n )\n .filter((node) => {\n if (!normalizedSearch) {\n return true;\n }\n const text =\n typeof node.canonicalText === \"string\" ? node.canonicalText : \"\";\n return normalizeCanonicalEntityText(text).includes(normalizedSearch);\n })\n .sort((a, b) =>\n String(a.title ?? a.canonicalText ?? \"\").localeCompare(\n String(b.title ?? b.canonicalText ?? \"\")\n )\n )\n .slice(0, args.limit);\n}\n\nconst entityVerificationStatusValidator = v.union(\n v.literal(\"unverified\"),\n v.literal(\"human_verified\"),\n v.literal(\"ai_verified\"),\n v.literal(\"contradicted\"),\n v.literal(\"outdated\")\n);\n\n// =============================================================================\n// CANONICAL ENTITY QUERIES\n// =============================================================================\n\n/**\n * List canonical tenant-global entities visible from a topic/project scope.\n * Canonical entities are tenant-scoped and intentionally workspace-global.\n */\nexport const listCanonicalEntities = query({\n args: {\n topicId: v.optional(v.string()),\n scopeProjectId: v.optional(v.string()),\n nodeType: v.optional(v.string()),\n searchTerm: v.optional(v.string()),\n includeArchived: v.optional(v.boolean()),\n limit: v.optional(v.number()),\n },\n returns: permissiveReturn,\n handler: async (ctx: QueryCtx, args) => {\n const scope = await resolveCanonicalEntityScope(ctx, {\n topicId: args.topicId,\n projectId: args.scopeProjectId,\n });\n\n const limit = Math.max(1, Math.min(Math.floor(args.limit ?? 100), 500));\n return listCanonicalEntitiesForScope(ctx, {\n tenantId: scope.tenantId,\n nodeType: args.nodeType,\n searchTerm: args.searchTerm,\n includeArchived: args.includeArchived,\n limit,\n });\n },\n});\n\n// =============================================================================\n// CREATE ENTITY\n// =============================================================================\n\n/**\n * Create a new ontological entity in epistemicNodes.\n *\n * Unlike beliefs, entities:\n * - Have epistemicLayer = 'ontological'\n * - Have no confidence or beliefStatus\n * - Are mutable (metadata can be patched)\n * - Require metadata validation against registered schema\n */\nexport const createEntity = mutation({\n args: {\n nodeType: v.string(), // \"company\", \"person\", \"investor\", \"function\", \"value_chain\"\n canonicalText: v.string(), // Display name (e.g., \"Anthropic\", \"Dario Amodei\")\n metadata: v.optional(v.any()), // Type-specific attributes validated against schema\n subtype: v.optional(v.string()), // e.g., \"company/private\", \"investor/vc\"\n ...optionalScopeArgs,\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const authenticatedUserId = await requireAuthenticatedUserId(ctx);\n const now = Date.now();\n const canonicalText = args.canonicalText.trim();\n\n if (!canonicalText) {\n throwStructuredMutationError({\n message: \"canonicalText is required.\",\n status: 400,\n code: \"INVALID_REQUEST\",\n invariantCode: \"entity.type_check\",\n });\n }\n\n // Validate nodeType is ontological\n if (!isOntologicalNodeType(args.nodeType)) {\n throwStructuredMutationError({\n message: `\"${args.nodeType}\" is not an ontological entity type. Use epistemicBeliefs.create for epistemic nodes.`,\n status: 400,\n code: \"INVALID_NODE_TYPE\",\n invariantCode: \"entity.type_check\",\n suggestion: `Valid entity types: ${ONTOLOGICAL_NODE_TYPES.join(\", \")}`,\n });\n }\n\n // Resolve topic/project scope\n const scope = await resolveCanonicalEntityScope(ctx, {\n topicId: args.topicId,\n projectId: args.projectId,\n });\n if (scope.projectId) {\n await requireProjectWriteAccess(\n ctx,\n scope.projectId,\n authenticatedUserId\n );\n }\n\n // Validate nodeType against the resolved ontology for the topic scope.\n // If the topic (or its ancestor) binds to an ontology with a published version,\n // the entity's nodeType must be in that ontology's entity type vocabulary.\n if (scope.topicId) {\n const ontologyValidation = await validateEntityTypeForTopic(\n ctx,\n scope.topicId,\n args.nodeType\n );\n if (!ontologyValidation.valid) {\n throwStructuredMutationError({\n message: `Ontology validation failed: ${ontologyValidation.error}`,\n status: 400,\n code: \"ONTOLOGY_VALIDATION_ERROR\",\n invariantCode: \"entity.ontology_type_check\",\n suggestion:\n \"Use a nodeType that is defined in the ontology bound to this topic, or update the ontology to include this entity type.\",\n details: { nodeType: args.nodeType, topicId: scope.topicId },\n });\n }\n }\n\n // Validate metadata against registered schema\n const metadata = (args.metadata as Record<string, unknown>) || {};\n const validation = await validateEntityMetadata(\n ctx,\n args.nodeType,\n metadata,\n scope.tenantId\n );\n if (!validation.valid) {\n throwStructuredMutationError({\n message: `Entity metadata validation failed: ${validation.errors.join(\"; \")}`,\n status: 400,\n code: \"VALIDATION_ERROR\",\n invariantCode: \"entity.metadata_schema\",\n suggestion:\n \"Check the registered schema for this entity type in schemaEnumConfig.\",\n details: { errors: validation.errors },\n });\n }\n\n const existing = await findExistingCanonicalEntity(ctx, {\n nodeType: args.nodeType,\n canonicalText,\n tenantId: scope.tenantId,\n });\n if (existing) {\n return {\n nodeId: existing._id,\n globalId: existing.globalId,\n isDuplicate: true,\n };\n }\n\n // Create the entity node\n const entityGlobalId = generateGlobalId();\n const nodeId = await insertEpistemicNode(ctx, {\n globalId: entityGlobalId,\n nodeType: args.nodeType,\n epistemicLayer: \"ontological\",\n subtype: args.subtype,\n canonicalText,\n contentHash: generateContentHash(args.nodeType, canonicalText),\n title: buildEntityTitle(canonicalText),\n metadata: {\n ...metadata,\n ...(args.subtype ? { subtype: args.subtype } : {}),\n status: \"active\",\n },\n tenantId: scope.tenantId,\n sourceType: \"human\",\n verificationStatus: \"unverified\",\n status: \"active\",\n projectId: scope.projectId,\n createdBy: authenticatedUserId,\n createdAt: now,\n updatedAt: now,\n });\n\n // Schedule Neo4j sync\n await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId,\n operation: \"upsert\",\n });\n\n // Log to epistemic audit (Invariant #14)\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"entity\",\n entityId: nodeId,\n changeType: \"created\",\n changedAt: now,\n changedBy: authenticatedUserId,\n isAgent: false,\n previousState: null,\n newState: {\n canonicalText,\n nodeType: args.nodeType,\n tenantId: scope.tenantId,\n workspaceId: null,\n },\n projectId: scope.projectId,\n });\n\n return { nodeId, globalId: entityGlobalId, isDuplicate: false };\n },\n});\n\n// =============================================================================\n// UPDATE ENTITY ATTRIBUTES\n// =============================================================================\n\n/**\n * Patch entity metadata. Entities ARE mutable (unlike scored beliefs).\n * Logs before/after diff to epistemicAudit.\n */\nexport const updateEntityAttributes = mutation({\n args: {\n nodeId: v.id(\"epistemicNodes\"),\n canonicalText: v.optional(v.string()),\n title: v.optional(v.string()),\n metadata: v.optional(v.any()), // Partial metadata to merge\n subtype: v.optional(v.string()),\n domain: v.optional(v.string()),\n tags: v.optional(v.array(v.string())),\n verificationStatus: v.optional(entityVerificationStatusValidator),\n externalIds: v.optional(\n v.object({\n crunchbase: v.optional(v.string()),\n linkedin: v.optional(v.string()),\n pitchbook: v.optional(v.string()),\n twitter: v.optional(v.string()),\n website: v.optional(v.string()),\n })\n ),\n },\n returns: permissiveReturn,\n handler: async (ctx: MutationCtx, args) => {\n const authenticatedUserId = await requireAuthenticatedUserId(ctx);\n const now = Date.now();\n\n const node = await ctx.db.get(args.nodeId);\n if (!node) {\n throwStructuredMutationError({\n message: \"Entity not found.\",\n status: 404,\n code: \"NOT_FOUND\",\n details: { nodeId: args.nodeId },\n });\n }\n\n // Verify this is an ontological node\n if (!isOntologicalNodeType(node.nodeType)) {\n throwStructuredMutationError({\n message: `Node \"${args.nodeId}\" is a ${node.nodeType}, not an entity. Use belief/question APIs for epistemic nodes.`,\n status: 400,\n code: \"LIFECYCLE_VIOLATION\",\n invariantCode: \"entity.type_check\",\n suggestion:\n \"Only ontological entities can be updated via updateEntityAttributes.\",\n });\n }\n\n const scopeProjectId =\n typeof node.projectId === \"string\" && node.projectId.trim().length > 0\n ? node.projectId\n : undefined;\n if (scopeProjectId) {\n await requireProjectWriteAccess(ctx, scopeProjectId, authenticatedUserId);\n }\n\n // Merge new metadata with existing\n const existingMetadata = (node.metadata as Record<string, unknown>) || {};\n const newMetadataFields =\n args.metadata !== undefined\n ? ((args.metadata as Record<string, unknown>) || {})\n : {};\n const mergedMetadata = { ...existingMetadata, ...newMetadataFields };\n if (args.subtype !== undefined) {\n mergedMetadata.subtype = args.subtype;\n }\n\n if (args.canonicalText !== undefined && args.canonicalText.trim().length === 0) {\n throwStructuredMutationError({\n message: \"canonicalText cannot be empty.\",\n status: 400,\n code: \"INVALID_REQUEST\",\n invariantCode: \"entity.update_requires_entity_lifecycle\",\n });\n }\n\n const nextCanonicalText =\n typeof args.canonicalText === \"string\" && args.canonicalText.trim().length > 0\n ? args.canonicalText.trim()\n : node.canonicalText;\n\n if (args.canonicalText !== undefined) {\n const duplicate = await findExistingCanonicalEntity(ctx, {\n nodeType: node.nodeType,\n canonicalText: nextCanonicalText,\n tenantId: typeof node.tenantId === \"string\" ? node.tenantId : undefined,\n });\n if (duplicate && String(duplicate._id) !== String(args.nodeId)) {\n throwStructuredMutationError({\n message:\n \"A canonical entity with this name already exists in the tenant scope.\",\n status: 409,\n code: \"CONFLICT\",\n invariantCode: \"entity.canonical_text_unique_per_tenant\",\n suggestion:\n \"Merge the duplicate entity instead of renaming this node onto an existing canonical record.\",\n details: {\n nodeId: args.nodeId,\n duplicateNodeId: duplicate._id,\n canonicalText: nextCanonicalText,\n },\n });\n }\n }\n\n // Validate merged metadata against schema\n const validation = await validateEntityMetadata(\n ctx,\n node.nodeType,\n mergedMetadata,\n typeof node.tenantId === \"string\" ? node.tenantId : undefined\n );\n if (!validation.valid) {\n throwStructuredMutationError({\n message: `Entity metadata validation failed: ${validation.errors.join(\"; \")}`,\n status: 400,\n code: \"VALIDATION_ERROR\",\n invariantCode: \"entity.metadata_schema\",\n details: { errors: validation.errors },\n });\n }\n\n const updates: Record<string, unknown> = {\n metadata: mergedMetadata,\n updatedAt: now,\n };\n\n if (args.canonicalText !== undefined) {\n updates.canonicalText = nextCanonicalText;\n updates.contentHash = generateContentHash(node.nodeType, nextCanonicalText);\n updates.title =\n args.title !== undefined ? args.title : buildEntityTitle(nextCanonicalText);\n } else if (args.title !== undefined) {\n updates.title = args.title;\n }\n\n if (args.subtype !== undefined) {\n updates.subtype = args.subtype;\n }\n if (args.domain !== undefined) {\n updates.domain = args.domain;\n }\n if (args.tags !== undefined) {\n updates.tags = args.tags;\n }\n if (args.verificationStatus !== undefined) {\n updates.verificationStatus = args.verificationStatus;\n }\n if (args.externalIds !== undefined) {\n updates.externalIds = args.externalIds;\n }\n\n // Patch the node\n await ctx.db.patch(args.nodeId, updates);\n\n // Schedule Neo4j sync\n await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId: args.nodeId,\n operation: \"upsert\",\n });\n\n // Log to epistemic audit with before/after diff (Invariant #14)\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"entity\",\n entityId: args.nodeId,\n changeType: \"entity_attributes_updated\",\n changedAt: now,\n changedBy: authenticatedUserId,\n isAgent: false,\n previousState: {\n canonicalText: node.canonicalText,\n title: node.title,\n subtype: node.subtype,\n domain: node.domain,\n tags: node.tags,\n verificationStatus: node.verificationStatus,\n externalIds: node.externalIds,\n metadata: existingMetadata,\n },\n newState: updates,\n projectId: scopeProjectId,\n });\n\n return { nodeId: args.nodeId, updated: true };\n },\n});\n\n// =============================================================================\n// MERGE ENTITIES\n// =============================================================================\n\n/**\n * Merge a duplicate entity into a canonical one.\n * Non-destructive: duplicate is preserved with status='superseded' and lineage.\n *\n * Steps:\n * 1. Create same_as edge between them\n * 2. Re-point all edges from duplicate → canonical\n * 3. Set duplicate status to 'superseded', supersededBy = canonical\n */\nexport const mergeEntities = mutation({\n args: {\n canonicalNodeId: v.id(\"epistemicNodes\"),\n duplicateNodeId: v.id(\"epistemicNodes\"),\n },\n returns: permissiveReturn,\n handler: async (ctx: MutationCtx, args) => {\n const authenticatedUserId = await requireAuthenticatedUserId(ctx);\n const now = Date.now();\n\n const canonical = await ctx.db.get(args.canonicalNodeId);\n const duplicate = await ctx.db.get(args.duplicateNodeId);\n\n if (!canonical || !duplicate) {\n throwStructuredMutationError({\n message: \"One or both entity nodes not found.\",\n status: 404,\n code: \"NOT_FOUND\",\n details: {\n canonicalNodeId: args.canonicalNodeId,\n duplicateNodeId: args.duplicateNodeId,\n },\n });\n }\n\n if (\n !isOntologicalNodeType(canonical.nodeType) ||\n !isOntologicalNodeType(duplicate.nodeType)\n ) {\n throwStructuredMutationError({\n message: \"Both nodes must be ontological entities to merge.\",\n status: 400,\n code: \"LIFECYCLE_VIOLATION\",\n invariantCode: \"entity.type_check\",\n });\n }\n\n if (args.canonicalNodeId === args.duplicateNodeId) {\n throwStructuredMutationError({\n message: \"Cannot merge an entity with itself.\",\n status: 400,\n code: \"SELF_MERGE\",\n invariantCode: \"entity.no_self_merge\",\n suggestion: \"Provide two different entity IDs to merge.\",\n details: { canonicalNodeId: args.canonicalNodeId },\n });\n }\n\n if (canonical.nodeType !== duplicate.nodeType) {\n throwStructuredMutationError({\n message: `Cannot merge different entity types: ${canonical.nodeType} vs ${duplicate.nodeType}.`,\n status: 400,\n code: \"TYPE_MISMATCH\",\n });\n }\n\n if (canonical.projectId) {\n await requireProjectWriteAccess(\n ctx,\n canonical.projectId as string,\n authenticatedUserId\n );\n }\n\n // 1. Create derived_from edge (canonical replacement for same_as)\n const edgeGlobalId = generateGlobalId();\n await insertEpistemicEdge(ctx, {\n globalId: edgeGlobalId,\n // C2-RR.4 Defect E — canonical UUIDv7 endpoints, not Convex doc ids.\n fromNodeId: duplicate.globalId,\n toNodeId: canonical.globalId,\n sourceGlobalId: duplicate.globalId,\n targetGlobalId: canonical.globalId,\n edgeType: \"derived_from\",\n weight: 1.0,\n context: `Entity merge: ${duplicate.canonicalText} → ${canonical.canonicalText}`,\n createdBy: authenticatedUserId,\n createdAt: now,\n updatedAt: now,\n });\n\n // 2. Re-point all edges from duplicate → canonical\n // Edges where duplicate is the source\n const outgoingEdges = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from\", (q: IndexQuery) =>\n q.eq(\"fromNodeId\", args.duplicateNodeId)\n )\n .collect();\n\n for (const edge of outgoingEdges) {\n if (edge.toNodeId === args.canonicalNodeId) {\n continue; // Skip derived_from merge edge\n }\n await ctx.db.patch(edge._id, {\n fromNodeId: args.canonicalNodeId,\n sourceGlobalId: canonical.globalId,\n updatedAt: now,\n });\n }\n\n // Edges where duplicate is the target\n const incomingEdges = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_to\", (q: IndexQuery) =>\n q.eq(\"toNodeId\", args.duplicateNodeId)\n )\n .collect();\n\n for (const edge of incomingEdges) {\n if (edge.fromNodeId === args.canonicalNodeId) {\n continue; // Skip derived_from merge edge\n }\n await ctx.db.patch(edge._id, {\n toNodeId: args.canonicalNodeId,\n targetGlobalId: canonical.globalId,\n updatedAt: now,\n });\n }\n\n // 3. Set duplicate status to 'superseded'\n const duplicateMetadata =\n (duplicate.metadata as Record<string, unknown>) || {};\n await ctx.db.patch(args.duplicateNodeId, {\n status: \"superseded\",\n metadata: {\n ...duplicateMetadata,\n status: \"superseded\",\n supersededBy: args.canonicalNodeId,\n mergedAt: now,\n mergedBy: authenticatedUserId,\n },\n updatedAt: now,\n });\n\n // Schedule Neo4j sync for both nodes\n await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId: args.canonicalNodeId,\n operation: \"upsert\",\n });\n await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId: args.duplicateNodeId,\n operation: \"upsert\",\n });\n\n // Log to epistemic audit (Invariant #14)\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"entity\",\n entityId: args.canonicalNodeId,\n changeType: \"entity_merged\",\n changedAt: now,\n changedBy: authenticatedUserId,\n isAgent: false,\n rationale: `Entity merge: absorbed ${args.duplicateNodeId} (${duplicate.canonicalText}). ${outgoingEdges.length + incomingEdges.length} edges re-pointed.`,\n previousState: null,\n newState: {\n nodeType: canonical.nodeType,\n canonicalText: canonical.canonicalText,\n },\n projectId: canonical.projectId,\n });\n\n // Count only edges that were actually re-pointed (exclude skipped same_as)\n const outgoingRepointed = outgoingEdges.filter(\n (e) => e.toNodeId !== args.canonicalNodeId\n ).length;\n const incomingRepointed = incomingEdges.filter(\n (e) => e.fromNodeId !== args.canonicalNodeId\n ).length;\n\n // OE-E: Reactive hook — schedule belief review for the canonical entity.\n // After merge, beliefs previously connected to the duplicate now point to\n // the canonical entity. Review whether those beliefs still hold.\n await ctx.scheduler.runAfter(\n 0,\n internal.lucernMcp.triggerEntityChangeReview,\n {\n entityNodeId: args.canonicalNodeId,\n changeDescription: `Merged with duplicate \"${duplicate.canonicalText}\". ${outgoingRepointed + incomingRepointed} edges re-pointed.`,\n userId: authenticatedUserId,\n }\n );\n\n return {\n canonicalNodeId: args.canonicalNodeId,\n duplicateNodeId: args.duplicateNodeId,\n edgesRepointed: outgoingRepointed + incomingRepointed,\n };\n },\n});\n\n// =============================================================================\n// ARCHIVE ENTITY\n// =============================================================================\n\n/**\n * Archive an entity. Sets status to 'archived'.\n * Non-destructive: entity preserved with full lineage.\n */\nexport const archiveEntity = mutation({\n args: {\n nodeId: v.id(\"epistemicNodes\"),\n },\n returns: permissiveReturn,\n handler: async (ctx: MutationCtx, args) => {\n const authenticatedUserId = await requireAuthenticatedUserId(ctx);\n const now = Date.now();\n\n const node = await ctx.db.get(args.nodeId);\n if (!node) {\n throwStructuredMutationError({\n message: \"Entity not found.\",\n status: 404,\n code: \"NOT_FOUND\",\n details: { nodeId: args.nodeId },\n });\n }\n\n if (!isOntologicalNodeType(node.nodeType)) {\n throwStructuredMutationError({\n message: `Node \"${args.nodeId}\" is a ${node.nodeType}, not an entity. Use belief archive APIs for epistemic nodes.`,\n status: 400,\n code: \"LIFECYCLE_VIOLATION\",\n invariantCode: \"entity.type_check\",\n });\n }\n\n if (node.projectId) {\n await requireProjectWriteAccess(\n ctx,\n node.projectId as string,\n authenticatedUserId\n );\n }\n\n await ctx.db.patch(args.nodeId, {\n status: \"archived\",\n updatedAt: now,\n });\n\n // Schedule Neo4j sync\n await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId: args.nodeId,\n operation: \"upsert\",\n });\n\n // Log to epistemic audit (Invariant #14)\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"entity\",\n entityId: args.nodeId,\n changeType: \"entity_archived\",\n changedAt: now,\n changedBy: authenticatedUserId,\n isAgent: false,\n previousState: { status: node.status },\n newState: { status: \"archived\" },\n projectId: node.projectId,\n });\n\n // OE-E: Reactive hook — schedule belief review for archived entity.\n // Beliefs that referenced this entity may need reassessment.\n await ctx.scheduler.runAfter(\n 0,\n internal.lucernMcp.triggerEntityChangeReview,\n {\n entityNodeId: args.nodeId,\n changeDescription: `Entity \"${node.canonicalText}\" was archived.`,\n userId: authenticatedUserId,\n }\n );\n\n return { nodeId: args.nodeId, archived: true };\n },\n});\n"]}
|