@lucern/graph-primitives 1.0.30 → 1.0.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/dist/beliefEvidenceLinks.js.map +1 -1
  2. package/dist/beliefEvidenceLinks.operational.js.map +1 -1
  3. package/dist/contradictions.js +5 -5
  4. package/dist/contradictions.js.map +1 -1
  5. package/dist/entityLifecycle.js.map +1 -1
  6. package/dist/epistemicAnswers.js +1 -1
  7. package/dist/epistemicAnswers.js.map +1 -1
  8. package/dist/epistemicBeliefs.admin.js +2 -2
  9. package/dist/epistemicBeliefs.admin.js.map +1 -1
  10. package/dist/epistemicBeliefs.backfills.js +3 -3
  11. package/dist/epistemicBeliefs.backfills.js.map +1 -1
  12. package/dist/epistemicBeliefs.confidence.js +1 -4
  13. package/dist/epistemicBeliefs.confidence.js.map +1 -1
  14. package/dist/epistemicBeliefs.core.js +20 -30
  15. package/dist/epistemicBeliefs.core.js.map +1 -1
  16. package/dist/epistemicBeliefs.forkEvidence.js.map +1 -1
  17. package/dist/epistemicBeliefs.helpers.js +1 -1
  18. package/dist/epistemicBeliefs.helpers.js.map +1 -1
  19. package/dist/epistemicBeliefs.internal.js +15 -25
  20. package/dist/epistemicBeliefs.internal.js.map +1 -1
  21. package/dist/epistemicBeliefs.js +27 -40
  22. package/dist/epistemicBeliefs.js.map +1 -1
  23. package/dist/epistemicBeliefs.lifecycle.js +1 -4
  24. package/dist/epistemicBeliefs.lifecycle.js.map +1 -1
  25. package/dist/epistemicBeliefs.links.js +1 -1
  26. package/dist/epistemicBeliefs.links.js.map +1 -1
  27. package/dist/epistemicBeliefs.queries.js.map +1 -1
  28. package/dist/epistemicBeliefs.topicAnchor.js +12 -22
  29. package/dist/epistemicBeliefs.topicAnchor.js.map +1 -1
  30. package/dist/epistemicContracts.evaluators.js +1 -4
  31. package/dist/epistemicContracts.evaluators.js.map +1 -1
  32. package/dist/epistemicContracts.handlers.js +1 -4
  33. package/dist/epistemicContracts.handlers.js.map +1 -1
  34. package/dist/epistemicContracts.js +1 -4
  35. package/dist/epistemicContracts.js.map +1 -1
  36. package/dist/epistemicEdgeCreation.js.map +1 -1
  37. package/dist/epistemicEdges.handlers.js.map +1 -1
  38. package/dist/epistemicEdges.js +6 -7
  39. package/dist/epistemicEdges.js.map +1 -1
  40. package/dist/epistemicEdges.mutations.js +3 -4
  41. package/dist/epistemicEdges.mutations.js.map +1 -1
  42. package/dist/epistemicEdges.queries.js +3 -3
  43. package/dist/epistemicEdges.queries.js.map +1 -1
  44. package/dist/epistemicEvidence.js +10 -10
  45. package/dist/epistemicEvidence.js.map +1 -1
  46. package/dist/epistemicEvidenceHelpers.js +1 -1
  47. package/dist/epistemicEvidenceHelpers.js.map +1 -1
  48. package/dist/epistemicEvidenceMutations.js +5 -5
  49. package/dist/epistemicEvidenceMutations.js.map +1 -1
  50. package/dist/epistemicEvidenceQueries.js +6 -6
  51. package/dist/epistemicEvidenceQueries.js.map +1 -1
  52. package/dist/epistemicHelpers.js +4 -4
  53. package/dist/epistemicHelpers.js.map +1 -1
  54. package/dist/epistemicInsert.js.map +1 -1
  55. package/dist/epistemicLayerRules.js +2 -2
  56. package/dist/epistemicLayerRules.js.map +1 -1
  57. package/dist/epistemicLinking.js.map +1 -1
  58. package/dist/epistemicNodeCreation.js +2 -2
  59. package/dist/epistemicNodeCreation.js.map +1 -1
  60. package/dist/epistemicNodes.internal.js +2 -3
  61. package/dist/epistemicNodes.internal.js.map +1 -1
  62. package/dist/epistemicNodes.js +10 -12
  63. package/dist/epistemicNodes.js.map +1 -1
  64. package/dist/epistemicNodes.mutations.js +3 -4
  65. package/dist/epistemicNodes.mutations.js.map +1 -1
  66. package/dist/epistemicNodes.queries.js +5 -5
  67. package/dist/epistemicNodes.queries.js.map +1 -1
  68. package/dist/epistemicQuestions.conviction.js +5 -5
  69. package/dist/epistemicQuestions.conviction.js.map +1 -1
  70. package/dist/epistemicQuestions.create.js +7 -7
  71. package/dist/epistemicQuestions.create.js.map +1 -1
  72. package/dist/epistemicQuestions.evidence.js +2 -2
  73. package/dist/epistemicQuestions.evidence.js.map +1 -1
  74. package/dist/epistemicQuestions.helpers.js +7 -4
  75. package/dist/epistemicQuestions.helpers.js.map +1 -1
  76. package/dist/epistemicQuestions.js +16 -13
  77. package/dist/epistemicQuestions.js.map +1 -1
  78. package/dist/epistemicQuestions.lifecycle.js.map +1 -1
  79. package/dist/epistemicQuestions.queries.js +2 -2
  80. package/dist/epistemicQuestions.queries.js.map +1 -1
  81. package/dist/epistemicQuestions.sprint.js +6 -3
  82. package/dist/epistemicQuestions.sprint.js.map +1 -1
  83. package/dist/epistemicQuestions.tail.js +2 -2
  84. package/dist/epistemicQuestions.tail.js.map +1 -1
  85. package/dist/epistemicSources.js.map +1 -1
  86. package/dist/index.js +79 -92
  87. package/dist/index.js.map +1 -1
  88. package/dist/proof-attestation.json +1 -1
  89. package/package.json +4 -4
@@ -429,7 +429,7 @@ function getNextAnswerVersion(activeAnswers) {
429
429
  async function supersedeActiveAnswers(ctx, activeAnswers, now, clearSupersededByBeforeInsert) {
430
430
  for (const activeAnswer of activeAnswers) {
431
431
  const metadata = {
432
- ...activeAnswer.metadata ?? {},
432
+ ...activeAnswer.metadata,
433
433
  isLatest: false
434
434
  };
435
435
  await ctx.db.patch(activeAnswer._id, {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/convex.ts","../src/epistemicInsert.ts","../src/debug.ts","../src/topicScope.ts","../src/scopeResolverCompat.ts","../src/epistemicAnswers.ts"],"names":["query","normalizeScopeValue","v"],"mappings":"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","file":"epistemicAnswers.js","sourcesContent":["import type { Doc as AccessControlDoc } from \"@lucern/access-control/convex\";\nimport {\n type UnsafeConvexAnyApi,\n unsafeConvexAnyApi,\n} from \"@lucern/contracts/convex/unsafeAnyApi\";\nimport {\n actionGeneric,\n componentsGeneric,\n httpActionGeneric,\n internalActionGeneric,\n internalMutationGeneric,\n internalQueryGeneric,\n mutationGeneric,\n queryGeneric,\n} from \"convex/server\";\nimport type { GenericId } from \"convex/values\";\n\n// TODO(FR.11-structural): `api`/`internal`/`components` are `anyApi as any`\n// because this module source tree is bundled into the kernel host at deploy time\n// and has NO top-level Convex `_generated/` directory to import a typed surface\n// from. Every `api.*` / `internal.*` / string-literal cross-component ref in this\n// module (topicScope.ts, topicProjectOverlay.ts, questionEvidenceLinks.ts,\n// beliefEvidenceLinks*.ts, epistemicQuestions.helpers.ts) inherits `any` from\n// here. The fix is structural — generate a per-module typed surface or a shared\n// typed function-reference manifest (template: the typed `components.controlPlane`\n// in modules/control-plane/src/component/convex.ts and the\n// `KERNEL_API_REF_MANIFEST` pattern in packages/server-core/src/kernelApi.ts) —\n// owned by the FR.11 closing/synthesis pass, not a mechanical swap.\nconst unsafeApi = unsafeConvexAnyApi(\n \"graph-primitives top-level module bundle lacks a committed Convex _generated/api surface\"\n);\nexport const api = unsafeApi;\nexport const components =\n componentsGeneric() as unknown as UntypedFunctionReferenceSurface;\nexport const internal = unsafeApi;\n\ntype UntypedFunctionReferenceSurface = UnsafeConvexAnyApi;\ntype BoundaryValue = UntypedFunctionReferenceSurface[string];\n\nexport type TableNames = string;\nexport type Id<TableName extends TableNames = string> = GenericId<TableName>;\nexport type Doc<TableName extends TableNames = string> =\n AccessControlDoc<TableName>;\nexport type DataModel = Record<TableNames, unknown>;\ninterface IndexRangeBuilder {\n eq(fieldName: string, value: unknown): IndexRangeBuilder;\n field(fieldName: string): string;\n gt(fieldName: string, value: unknown): IndexRangeBuilder;\n gte(fieldName: string, value: unknown): IndexRangeBuilder;\n lt(fieldName: string, value: unknown): IndexRangeBuilder;\n lte(fieldName: string, value: unknown): IndexRangeBuilder;\n}\ninterface FilterBuilder {\n and(...clauses: unknown[]): FilterBuilder;\n eq(left: unknown, right: unknown): FilterBuilder;\n field(fieldName: string): string;\n gt(left: unknown, right: unknown): FilterBuilder;\n gte(left: unknown, right: unknown): FilterBuilder;\n lt(left: unknown, right: unknown): FilterBuilder;\n lte(left: unknown, right: unknown): FilterBuilder;\n neq(left: unknown, right: unknown): FilterBuilder;\n or(...clauses: unknown[]): FilterBuilder;\n [operator: string]: unknown;\n}\ninterface QueryInitializer<TableName extends TableNames> {\n collect(): Promise<Doc<TableName>[]>;\n filter(predicate: (q: FilterBuilder) => unknown): QueryInitializer<TableName>;\n first(): Promise<Doc<TableName> | null>;\n order(direction: \"asc\" | \"desc\"): QueryInitializer<TableName>;\n take(limit: number): Promise<Doc<TableName>[]>;\n unique(): Promise<Doc<TableName> | null>;\n withIndex(\n indexName: string,\n range?: (q: IndexRangeBuilder) => unknown\n ): QueryInitializer<TableName>;\n withSearchIndex(\n indexName: string,\n search?: (q: IndexRangeBuilder) => unknown\n ): QueryInitializer<TableName>;\n}\nexport interface DatabaseReader {\n get<TableName extends TableNames>(\n id: unknown\n ): Promise<Doc<TableName> | null>;\n normalizeId?<TableName extends TableNames>(\n tableName: TableName,\n id: string\n ): Id<TableName> | null;\n query<TableName extends TableNames>(\n tableName: TableName\n ): QueryInitializer<TableName>;\n}\nexport type DatabaseWriter = DatabaseReader & {\n insert<TableName extends TableNames>(\n tableName: TableName,\n value: Record<string, unknown>\n ): Promise<Id<TableName>>;\n patch<TableName extends TableNames>(\n id: Id<TableName>,\n value: Record<string, unknown>\n ): Promise<void>;\n replace<TableName extends TableNames>(\n id: Id<TableName>,\n value: Record<string, unknown>\n ): Promise<void>;\n delete<TableName extends TableNames>(id: Id<TableName>): Promise<void>;\n};\ninterface Scheduler {\n runAfter(\n delayMs: number,\n functionReference: unknown,\n args?: unknown\n ): Promise<void>;\n}\ninterface AuthReader {\n getUserIdentity(): Promise<{\n readonly subject: string;\n readonly [claimName: string]: unknown;\n } | null>;\n}\ninterface RuntimeInvoker {\n runAction<Result = unknown>(\n functionReference: unknown,\n args?: unknown\n ): Promise<Result>;\n runMutation<Result = unknown>(\n functionReference: unknown,\n args?: unknown\n ): Promise<Result>;\n runQuery<Result = unknown>(\n functionReference: unknown,\n args?: unknown\n ): Promise<Result>;\n}\nexport type QueryCtx = RuntimeInvoker & {\n auth: AuthReader;\n db: DatabaseReader;\n scheduler: Scheduler;\n};\nexport type MutationCtx = RuntimeInvoker & {\n auth: AuthReader;\n db: DatabaseWriter;\n scheduler: Scheduler;\n};\nexport type ActionCtx = RuntimeInvoker & {\n auth: AuthReader;\n scheduler: Scheduler;\n};\n\ntype ConvexFunctionBuilder<Ctx> = <\n Args = BoundaryValue,\n Result = BoundaryValue,\n>(definition: {\n args?: unknown;\n handler: (ctx: Ctx, args: Args) => Result;\n returns?: unknown;\n}) => unknown;\n\ntype OptionalHandlerConvexFunctionBuilder<Ctx> = <\n Args = BoundaryValue,\n Result = BoundaryValue,\n>(definition: {\n args?: unknown;\n handler?: (ctx: Ctx, args: Args) => Result;\n returns?: unknown;\n}) => unknown;\n\nexport const action =\n actionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const httpAction =\n httpActionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const internalAction =\n internalActionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const internalMutation =\n internalMutationGeneric as unknown as OptionalHandlerConvexFunctionBuilder<MutationCtx>;\nexport const internalQuery =\n internalQueryGeneric as unknown as OptionalHandlerConvexFunctionBuilder<QueryCtx>;\nexport const mutation =\n mutationGeneric as unknown as ConvexFunctionBuilder<MutationCtx>;\nexport const query = queryGeneric as unknown as ConvexFunctionBuilder<QueryCtx>;\n","// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\nimport {\n assertEdgePolicyAllowed,\n type EpistemicNodeType,\n edgePolicyManifest,\n} from \"@lucern/contracts\";\nimport {\n assertStorageEdgeVocabulary,\n assertUuidShapedEdgeEndpoint,\n assertUuidV7Identity,\n} from \"@lucern/contracts/ids\";\nimport type { Id, MutationCtx } from \"./convex\";\n\ninterface GlobalIdIndexQuery {\n eq(field: \"globalId\", value: string): GlobalIdIndexQuery;\n}\n\ninterface EpistemicNodeInsertDoc extends Record<string, unknown> {\n globalId: string;\n}\n\ninterface EpistemicEdgeInsertDoc extends Record<string, unknown> {\n edgeType: string;\n fromNodeId: string;\n fromNodeType?: string;\n globalId: string;\n toNodeId: string;\n toNodeType?: string;\n}\n\nexport function insertEpistemicNode(\n ctx: MutationCtx,\n doc: EpistemicNodeInsertDoc\n): Promise<Id<\"epistemicNodes\">> {\n assertUuidV7Identity(\"epistemicNodes\", doc.globalId);\n return ctx.db.insert(\"epistemicNodes\", doc);\n}\n\n/**\n * C2-RR.4b — REFERENTIAL edge-endpoint canonicality (amends RR.4's FORMAT guard).\n *\n * Proves an endpoint is the `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: GlobalIdIndexQuery) =>\n q.eq(\"globalId\", endpoint)\n )\n .first();\n if (!node) {\n throw new Error(\n `edge_endpoint_not_canonical: epistemicEdges insert requires ${endpointRole} to be the globalId of an existing epistemicNodes row, received ${endpoint} (no node with that globalId)`\n );\n }\n}\n\nexport async function insertEpistemicEdge(\n ctx: MutationCtx,\n doc: EpistemicEdgeInsertDoc\n): Promise<Id<\"epistemicEdges\">> {\n assertUuidV7Identity(\"epistemicEdges\", doc.globalId);\n\n // R1.1a — STORAGE-VOCABULARY MEMBERSHIP\n assertStorageEdgeVocabulary(doc.edgeType);\n\n // R1.1b — ENDPOINT PRESENCE\n if (!doc.fromNodeId || typeof doc.fromNodeId !== \"string\") {\n throw new Error(\n \"edge_endpoint_missing: epistemicEdges insert requires a non-empty fromNodeId\"\n );\n }\n if (!doc.toNodeId || typeof doc.toNodeId !== \"string\") {\n throw new Error(\n \"edge_endpoint_missing: epistemicEdges insert requires a non-empty toNodeId\"\n );\n }\n\n // C2-RR.4b Defect E (REFERENTIAL) — ENDPOINT CANONICAL IDENTITY. Edge\n // endpoints must each be the globalId of an EXISTING epistemicNodes row,\n // never a Convex doc id, a legacy topic id, or a fabricated/unknown uuid.\n // This refuses 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","interface GraphPrimitiveDebugEnvironment {\n process?: {\n env?: Record<string, string | undefined>;\n };\n}\n\nfunction isGraphPrimitiveDebugEnabled(): boolean {\n const env = (globalThis as GraphPrimitiveDebugEnvironment).process?.env;\n return (\n env?.LUCERN_COMPAT_FALLBACK_DEBUG === \"1\" || env?.LUCERN_GRAPH_DEBUG === \"1\"\n );\n}\n\nexport function formatGraphPrimitiveError(error: unknown): string {\n if (error instanceof Error) {\n return `${error.name}: ${error.message}`;\n }\n if (typeof error === \"string\") {\n return error;\n }\n if (error === null) {\n return \"null\";\n }\n if (error === undefined) {\n return \"undefined\";\n }\n try {\n return JSON.stringify(error);\n } catch {\n return Object.prototype.toString.call(error);\n }\n}\n\nexport function debugGraphPrimitiveFallback(\n message: string,\n context?: Record<string, unknown>\n): void {\n if (!isGraphPrimitiveDebugEnabled()) {\n return;\n }\n console.debug(message, context ?? {});\n}\n","// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\n/** Topic-scope resolution helpers for graph-primitive operations. */\nimport { v } from \"convex/values\";\nimport type { Id } from \"./convex\";\nimport { api as appApi } from \"./convex\";\nimport { debugGraphPrimitiveFallback } from \"./debug\";\n\nconst LEGACY_SCOPE_FIELD = \"graphScopeProjectId\";\n\ntype UnknownRecord = Record<string, unknown>;\n\ninterface TopicScopeContext {\n db: {\n get(id: string): Promise<unknown>;\n query(tableName: string): TopicScopeQuery;\n };\n runQuery?: <TResult>(fnRef: unknown, args: unknown) => Promise<TResult>;\n}\n\ninterface TopicScopeQuery {\n collect(): Promise<unknown[]>;\n first(): Promise<unknown | null>;\n withIndex(\n indexName: string,\n range?: (q: TopicScopeIndexRangeBuilder) => unknown\n ): TopicScopeQuery;\n}\n\ninterface TopicScopeIndexRangeBuilder {\n eq(field: string, value: unknown): TopicScopeIndexRangeBuilder;\n}\n\ntype TopicDoc = Record<string, unknown> & {\n _id: Id<\"topics\">;\n globalId?: string;\n name?: string;\n depth?: number;\n createdAt?: number;\n parentTopicId?: Id<\"topics\">;\n tenantId?: string;\n workspaceId?: string;\n metadata?: Record<string, unknown>;\n};\n\nexport interface TopicProjectScope {\n projectId?: string;\n source: \"topic\" | \"project_mapped_topic\" | \"topic_inferred\" | \"topic_node\";\n tenantId?: string;\n topicId: Id<\"topics\">;\n workspaceId?: string;\n}\n\n/**\n * RR.5 (legacy topics-table retirement) — graph-primitives mirror of the\n * kernel's epistemicNodes-first topic-scope fallback. Kept in lockstep with\n * `packages/reasoning-kernel/src/adapters/lib/topicScope.ts`\n * (`tests/unit/convex/topic-scope-fallbacks.test.ts` asserts parity).\n *\n * Resolves a topic that exists only as `epistemicNodes(nodeType=\"topic\")` —\n * the write-of-record — when no legacy `topics` row backs the ref, returning the\n * node's `topicId` self-key so scoped beliefs/evidence/questions stay reachable.\n * See the kernel module for the full silent-empty-result rationale.\n */\ninterface TopicNodeScopeDoc {\n _id: string | Id<\"epistemicNodes\">;\n globalId?: string;\n metadata?: UnknownRecord;\n nodeType?: string;\n topicId?: string;\n}\n\nasync function resolveTopicNodeScopeOrNull(\n ctx: TopicScopeContext,\n ref: string\n): Promise<TopicProjectScope | null> {\n if (!ctx?.db || typeof ctx.db.query !== \"function\") {\n return null;\n }\n\n let node: TopicNodeScopeDoc | null = null;\n\n // 1. The ref IS the topic node's UUIDv7 globalId.\n try {\n const byGlobalId = (await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_globalId\", (q) => q.eq(\"globalId\", ref))\n .first()) as TopicNodeScopeDoc | null;\n if (byGlobalId && byGlobalId.nodeType === \"topic\") {\n node = byGlobalId;\n }\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] topic-node scope lookup by globalId failed\",\n { error, ref }\n );\n }\n\n if (!node) {\n return null;\n }\n\n const scopeKey =\n normalizeScopeValue(node.topicId) ?? normalizeScopeValue(node.globalId);\n if (!scopeKey) {\n return null;\n }\n\n return {\n topicId: scopeKey as Id<\"topics\">,\n projectId: asMappedProjectId(node),\n source: \"topic_node\",\n };\n}\n\ninterface MaterializedTopicNodeDoc {\n _id: string | Id<\"epistemicNodes\">;\n metadata?: Record<string, unknown>;\n}\n\nfunction asMappedProjectId(\n topic: Pick<TopicDoc, \"metadata\"> | TopicNodeScopeDoc | null | undefined\n): string | undefined {\n if (!topic) {\n return;\n }\n const directLegacyProjectId = normalizeScopeValue(\n (topic as UnknownRecord)[LEGACY_SCOPE_FIELD]\n );\n if (directLegacyProjectId) {\n return directLegacyProjectId;\n }\n const metadata = topic.metadata || {};\n const candidate =\n (metadata as UnknownRecord)[LEGACY_SCOPE_FIELD] ||\n (metadata as UnknownRecord).legacyProjectId ||\n (metadata as UnknownRecord).projectId ||\n (metadata as UnknownRecord).scopeProjectId;\n return typeof candidate === \"string\"\n ? normalizeScopeValue(candidate)\n : undefined;\n}\n\nfunction normalizeScopeValue(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return;\n }\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction pickPrimaryTopic(candidates: TopicDoc[]): TopicDoc | undefined {\n return [...candidates].sort((a, b) => {\n const depthA = a.depth ?? 9999;\n const depthB = b.depth ?? 9999;\n if (depthA !== depthB) {\n return depthA - depthB;\n }\n const createdA = a.createdAt ?? Number.MAX_SAFE_INTEGER;\n const createdB = b.createdAt ?? Number.MAX_SAFE_INTEGER;\n if (createdA !== createdB) {\n return createdA - createdB;\n }\n return String(a.name || \"\").localeCompare(String(b.name || \"\"));\n })[0];\n}\n\nasync function findTopicsByScopeAlias(\n ctx: TopicScopeContext,\n scopeId: string\n): Promise<TopicDoc[]> {\n const query = ctx.db.query(\"topics\") as TopicScopeQuery;\n try {\n return (await query\n .withIndex(\"by_graph_scope_project\", (q) =>\n q.eq(LEGACY_SCOPE_FIELD, scopeId)\n )\n .collect()) as TopicDoc[];\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to resolve scope alias via index\",\n {\n error,\n scopeId,\n }\n );\n // Older Lucern dev deployments can lag index backfills while still carrying\n // the underlying topics table. Scan and filter so scope resolution keeps\n // working during the rollout.\n const topics = (await query.collect()) as TopicDoc[];\n return topics.filter((topic) => {\n const normalizedGlobalId = normalizeScopeValue(topic.globalId);\n const mappedProjectId = asMappedProjectId(topic);\n return (\n String(topic._id) === scopeId ||\n normalizedGlobalId === scopeId ||\n mappedProjectId === scopeId\n );\n });\n }\n}\n\nasync function tryResolveHostTopicById(\n ctx: TopicScopeContext,\n topicId: string\n): Promise<TopicDoc | null> {\n if (typeof ctx.runQuery !== \"function\") {\n return null;\n }\n try {\n return ((await ctx.runQuery(appApi.topics.get, {\n id: topicId,\n })) ?? null) as TopicDoc | null;\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to resolve topic by host query\",\n {\n error,\n topicId,\n }\n );\n return null;\n }\n}\n\nasync function tryResolveHostTopicByLegacyScope(\n ctx: TopicScopeContext,\n legacyScopeId: string\n): Promise<TopicDoc | null> {\n if (typeof ctx.runQuery !== \"function\") {\n return null;\n }\n try {\n return ((await ctx.runQuery(appApi.topics.getByLegacyScopeId, {\n projectId: legacyScopeId,\n })) ?? null) as TopicDoc | null;\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to resolve topic by legacy scope\",\n {\n error,\n legacyScopeId,\n }\n );\n return null;\n }\n}\n\nexport function readMaterializedTopicTableId(\n topicNode: MaterializedTopicNodeDoc | null | undefined\n): string | undefined {\n if (!topicNode) {\n return;\n }\n\n const metadata = (topicNode.metadata || {}) as Record<string, unknown>;\n const topicTableId =\n (metadata.topicTableId as string | undefined) ||\n (metadata.topicId as string | undefined);\n\n return typeof topicTableId === \"string\" && topicTableId.trim().length > 0\n ? topicTableId.trim()\n : undefined;\n}\n\n/**\n * Walk the topic parent chain to find inherited workspaceId and tenantId.\n * Mirrors the pattern used by resolveTopicOntology for ontologyId inheritance.\n * Max depth: 10 (defensive limit against pathological nesting).\n */\nasync function resolveInheritedWorkspaceScope(\n ctx: TopicScopeContext,\n topic: TopicDoc\n): Promise<{ tenantId?: string; workspaceId?: string }> {\n const MAX_DEPTH = 10;\n let tenantId = normalizeScopeValue(topic.tenantId);\n let workspaceId = normalizeScopeValue(topic.workspaceId);\n\n if (tenantId && workspaceId) {\n return { tenantId, workspaceId };\n }\n\n let current: TopicDoc | null = topic;\n for (let i = 0; i < MAX_DEPTH && current?.parentTopicId; i++) {\n current = (await ctx.db.get(current.parentTopicId)) as TopicDoc | null;\n if (!current) {\n break;\n }\n\n if (!tenantId) {\n tenantId = normalizeScopeValue(current.tenantId);\n }\n if (!workspaceId) {\n workspaceId = normalizeScopeValue(current.workspaceId);\n }\n if (tenantId && workspaceId) {\n break;\n }\n }\n\n return { tenantId, workspaceId };\n}\n\nexport async function resolveTopicProjectScope(\n ctx: TopicScopeContext,\n args: { topicId?: Id<\"topics\"> | string; projectId?: string }\n): Promise<TopicProjectScope> {\n if (args.topicId) {\n return await resolveScopeFromTopicId(ctx, args.topicId);\n }\n\n if (args.projectId) {\n return await resolveScopeFromLegacyProjectId(ctx, args.projectId);\n }\n\n throw new Error(\n \"Missing scope: provide topicId (preferred) or legacy projectId alias.\"\n );\n}\n\nasync function resolveScopeFromTopicId(\n ctx: TopicScopeContext,\n topicId: Id<\"topics\"> | string\n): Promise<TopicProjectScope> {\n const topic = await resolveTopicDocFromTopicId(ctx, topicId);\n if (topic) {\n return await buildTopicScope(ctx, topic, \"topic\");\n }\n\n const nodeScope = await resolveTopicNodeScopeOrNull(ctx, String(topicId));\n if (nodeScope) {\n return nodeScope;\n }\n throw new Error(`Topic not found: ${String(topicId)}`);\n}\n\nasync function resolveTopicDocFromTopicId(\n ctx: TopicScopeContext,\n topicId: Id<\"topics\"> | string\n): Promise<TopicDoc | null> {\n const direct = await tryReadTopicDoc(ctx, topicId, {\n failureLog: \"[topicScope] Failed to load topic by direct id\",\n idLogKey: \"topicId\",\n });\n if (direct) {\n return direct;\n }\n\n const hostTopic = await tryResolveHostTopicById(ctx, String(topicId));\n if (hostTopic) {\n return hostTopic;\n }\n\n return (\n pickPrimaryTopic(await findTopicsByScopeAlias(ctx, String(topicId))) ?? null\n );\n}\n\nasync function resolveScopeFromLegacyProjectId(\n ctx: TopicScopeContext,\n legacyProjectId: string\n): Promise<TopicProjectScope> {\n const directTopic = await resolveDirectLegacyProjectTopic(\n ctx,\n legacyProjectId\n );\n if (directTopic) {\n return await buildTopicScope(ctx, directTopic, \"topic_inferred\", {\n fallbackProjectId: legacyProjectId,\n });\n }\n\n const primary = pickPrimaryTopic(\n await findTopicsByScopeAlias(ctx, legacyProjectId)\n );\n if (primary) {\n return await buildTopicScope(ctx, primary, \"project_mapped_topic\", {\n fallbackProjectId: legacyProjectId,\n });\n }\n\n const nodeScope = await resolveTopicNodeScopeOrNull(ctx, legacyProjectId);\n if (nodeScope) {\n return {\n ...nodeScope,\n projectId: nodeScope.projectId ?? legacyProjectId,\n };\n }\n\n throw new Error(\n `Legacy project scope ${legacyProjectId} has no mapped topic.`\n );\n}\n\nasync function resolveDirectLegacyProjectTopic(\n ctx: TopicScopeContext,\n legacyProjectId: string\n): Promise<TopicDoc | null> {\n const directTopic = await tryReadTopicDoc(ctx, legacyProjectId, {\n failureLog: \"[topicScope] Failed to load direct project topic\",\n idLogKey: \"projectId\",\n });\n return directTopic ?? tryResolveHostTopicByLegacyScope(ctx, legacyProjectId);\n}\n\nasync function tryReadTopicDoc(\n ctx: TopicScopeContext,\n id: Id<\"topics\"> | string,\n log: { failureLog: string; idLogKey: \"projectId\" | \"topicId\" }\n): Promise<TopicDoc | null> {\n try {\n return (await ctx.db.get(id)) as TopicDoc | null;\n } catch (error) {\n debugGraphPrimitiveFallback(log.failureLog, {\n error,\n [log.idLogKey]: id,\n });\n return null;\n }\n}\n\nasync function buildTopicScope(\n ctx: TopicScopeContext,\n topic: TopicDoc,\n source: TopicProjectScope[\"source\"],\n options: { fallbackProjectId?: string } = {}\n): Promise<TopicProjectScope> {\n const inherited = await resolveInheritedWorkspaceScope(ctx, topic);\n const mapped = asMappedProjectId(topic);\n return {\n topicId: topic._id,\n ...(mapped || options.fallbackProjectId\n ? { projectId: mapped ?? options.fallbackProjectId }\n : {}),\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source,\n };\n}\n\n/** Shared scope args for graph-primitive functions. topicId is canonical; projectId is a legacy alias. */\nexport const optionalScopeArgs = {\n projectId: v.optional(v.string()),\n topicId: v.optional(v.string()),\n} as const;\n","// biome-ignore-all lint/style/useFilenamingConvention: Public ABI surface; rename requires a cross-package migration update.\nimport { debugGraphPrimitiveFallback } from \"./debug\";\nimport { optionalScopeArgs, resolveTopicProjectScope } from \"./topicScope\";\n\ntype TopicScopeResolverContext = Parameters<typeof resolveTopicProjectScope>[0];\n\nexport const scopeArgs = optionalScopeArgs;\n\nexport type ResolvedScope = Awaited<\n ReturnType<typeof resolveTopicProjectScope>\n>;\nexport interface SoftResolvedScope {\n projectId?: string;\n source?: ResolvedScope[\"source\"];\n tenantId?: string;\n topicId?: string;\n workspaceId?: string;\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\nexport async function resolveScope(\n ctx: TopicScopeResolverContext,\n args: { topicId?: string | null; projectId?: string | null }\n): Promise<ResolvedScope | null> {\n const topicId = normalizeScopeValue(args.topicId);\n const projectId = normalizeScopeValue(args.projectId);\n if (!(topicId || projectId)) {\n return null;\n }\n\n try {\n return await resolveTopicProjectScope(ctx, {\n topicId,\n projectId,\n });\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[scopeResolverCompat] Failed to resolve scope\",\n {\n error,\n topicId,\n projectId,\n }\n );\n return null;\n }\n}\n\nexport async function resolveScopeSoft(\n ctx: TopicScopeResolverContext,\n args: { topicId?: string | null; projectId?: string | null }\n): Promise<SoftResolvedScope> {\n const resolved = await resolveScope(ctx, args);\n if (resolved) {\n const topicId = normalizeScopeValue(resolved.topicId);\n return {\n ...(topicId ? { topicId } : {}),\n ...(resolved.projectId ? { projectId: resolved.projectId } : {}),\n ...(resolved.tenantId ? { tenantId: resolved.tenantId } : {}),\n ...(resolved.workspaceId ? { workspaceId: resolved.workspaceId } : {}),\n ...(resolved.source ? { source: resolved.source } : {}),\n };\n }\n\n const topicId = normalizeScopeValue(args.topicId);\n const projectId = normalizeScopeValue(args.projectId);\n return {\n ...(topicId ? { topicId } : {}),\n ...(projectId ? { projectId } : {}),\n };\n}\n","/**\n * Epistemic Answers API\n *\n * Answers are first-class L2 nodes in the epistemic spine.\n * Every answer is an immutable snapshot — new answers create new nodes,\n * old ones get `superseded`. This gives full version history and lets\n * answers have their own edges in the knowledge graph.\n *\n * Edge: Answer —responds_to→ Question\n * Edge: Answer —based_on→ Evidence (for each supporting evidence)\n * Edge: NewAnswer —supersedes→ OldAnswer (for versioning)\n *\n * @see /docs/epistemic-invariants/00-epistemic-invariants.md\n */\n// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\n\nimport { checkScopeAccess } from \"@lucern/access-control/access\";\nimport { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\nimport { v } from \"convex/values\";\nimport type { Id, MutationCtx, QueryCtx } from \"./convex\";\nimport { api, internal, internalMutation, mutation, query } from \"./convex\";\nimport { insertEpistemicNode } from \"./epistemicInsert.js\";\nimport { generateGlobalId } from \"./globalId\";\nimport { resolveScope, scopeArgs } from \"./scopeResolverCompat\";\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\ninterface AnswerNodeRow {\n _id: Id<\"epistemicNodes\">;\n canonicalText?: string;\n createdAt?: number;\n createdBy?: string;\n globalId: string;\n metadata?: Record<string, unknown>;\n nodeType?: string;\n projectId?: string;\n status?: string;\n supersededBy?: Id<\"epistemicNodes\">;\n topicId?: Id<\"topics\">;\n}\n\ninterface IndexQuery {\n eq(field: string, value: unknown): IndexQuery;\n}\n\ninterface FilterQuery {\n eq(left: unknown, right: unknown): unknown;\n field(name: string): unknown;\n or(...conditions: unknown[]): unknown;\n}\n\ninterface AnswerEdgeRow {\n fromNodeId: Id<\"epistemicNodes\">;\n}\n\ntype AnswerConfidence =\n | \"definitive\"\n | \"moderate\"\n | \"speculative\"\n | \"strong\"\n | \"weak\";\n\ninterface AnswerScopeArgs {\n projectId?: string;\n topicId?: string;\n}\n\ninterface CreateAnswerArgs extends AnswerScopeArgs {\n answerSource?: string;\n answerText: string;\n confidence?: AnswerConfidence;\n evidenceNodeIds?: Id<\"epistemicNodes\">[];\n questionNodeId: Id<\"epistemicNodes\">;\n sprintId?: string;\n userId: string;\n}\n\ninterface CreateInternalAnswerArgs extends AnswerScopeArgs {\n answerSource?: string;\n answerText: string;\n backfilledFromQuestionId?: string;\n confidence?: string;\n evidenceNodeIds?: Id<\"epistemicNodes\">[];\n questionNodeId: Id<\"epistemicNodes\">;\n sprintId?: string;\n userId: string;\n}\n\ninterface QuestionAnswerQueryArgs {\n includeSuperseded?: boolean;\n questionNodeId: Id<\"epistemicNodes\">;\n}\n\ninterface QuestionOnlyQueryArgs {\n questionNodeId: Id<\"epistemicNodes\">;\n}\n\ninterface BackfillAnswerNodesArgs extends AnswerScopeArgs {\n dryRun?: boolean;\n userId: string;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction readConvexId<TableName extends string>(\n value: unknown\n): Id<TableName> | undefined {\n return typeof value === \"string\" && value.trim().length > 0\n ? (value as Id<TableName>)\n : undefined;\n}\n\nfunction readOptionalNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value)\n ? value\n : undefined;\n}\n\nfunction readOptionalString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim().length > 0\n ? value\n : undefined;\n}\n\nfunction readRecord(value: unknown): Record<string, unknown> | undefined {\n return isRecord(value) ? value : undefined;\n}\n\nfunction readAnswerNodeRow(value: unknown): AnswerNodeRow | null {\n if (!isRecord(value)) {\n return null;\n }\n\n const id = readConvexId<\"epistemicNodes\">(value._id);\n const globalId = readOptionalString(value.globalId);\n if (!(id && globalId)) {\n return null;\n }\n\n const row: AnswerNodeRow = { _id: id, globalId };\n const canonicalText = readOptionalString(value.canonicalText);\n const createdAt = readOptionalNumber(value.createdAt);\n const createdBy = readOptionalString(value.createdBy);\n const metadata = readRecord(value.metadata);\n const nodeType = readOptionalString(value.nodeType);\n const projectId = readOptionalString(value.projectId);\n const status = readOptionalString(value.status);\n const supersededBy = readConvexId<\"epistemicNodes\">(value.supersededBy);\n const topicId = readConvexId<\"topics\">(value.topicId);\n\n if (canonicalText !== undefined) {\n row.canonicalText = canonicalText;\n }\n if (createdAt !== undefined) {\n row.createdAt = createdAt;\n }\n if (createdBy !== undefined) {\n row.createdBy = createdBy;\n }\n if (metadata !== undefined) {\n row.metadata = metadata;\n }\n if (nodeType !== undefined) {\n row.nodeType = nodeType;\n }\n if (projectId !== undefined) {\n row.projectId = projectId;\n }\n if (status !== undefined) {\n row.status = status;\n }\n if (supersededBy !== undefined) {\n row.supersededBy = supersededBy;\n }\n if (topicId !== undefined) {\n row.topicId = topicId;\n }\n\n return row;\n}\n\nfunction readAnswerEdgeRow(value: unknown): AnswerEdgeRow | null {\n if (!isRecord(value)) {\n return null;\n }\n\n const fromNodeId = readConvexId<\"epistemicNodes\">(value.fromNodeId);\n return fromNodeId ? { fromNodeId } : null;\n}\n\nfunction readRowList<T>(\n values: readonly unknown[],\n reader: (value: unknown) => T | null\n): T[] {\n return values.flatMap((value) => {\n const row = reader(value);\n return row ? [row] : [];\n });\n}\n\nfunction generateContentHash(text: string): string {\n const content = `answer:${text.trim().toLowerCase().replace(/\\s+/g, \" \").slice(0, 500)}`;\n let hash = 5381;\n for (let i = 0; i < content.length; i++) {\n // biome-ignore lint/suspicious/noBitwiseOperators: Preserve deterministic legacy hash used for persisted answer metadata compatibility.\n hash = (hash << 5) + hash + content.charCodeAt(i);\n // biome-ignore lint/suspicious/noBitwiseOperators: Preserve deterministic legacy hash used for persisted answer metadata compatibility.\n hash &= hash;\n }\n return Math.abs(hash).toString(16).padStart(8, \"0\");\n}\n\ninterface AnswerCreateMutationArgs {\n answerSource: string | undefined;\n answerText: string;\n backfilledFromQuestionId?: string;\n clearSupersededByBeforeInsert?: boolean;\n confidence: string | undefined;\n edgeTopicId: string;\n evidenceNodeIds: Id<\"epistemicNodes\">[] | undefined;\n questionNode: AnswerNodeRow;\n questionNodeId: Id<\"epistemicNodes\">;\n sprintId: string | undefined;\n topicId: string;\n userId: string;\n}\n\nasync function getActiveAnswersForQuestion(\n ctx: MutationCtx,\n questionNode: AnswerNodeRow,\n topicId: string,\n questionNodeId: Id<\"epistemicNodes\">\n): Promise<AnswerNodeRow[]> {\n const answers = readRowList(\n await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_topic_type\", (q: IndexQuery) =>\n q\n .eq(\"topicId\", questionNode.topicId ?? topicId)\n .eq(\"nodeType\", \"answer\")\n )\n .collect(),\n readAnswerNodeRow\n );\n\n return answers.filter((answerNode) => {\n const answerMeta = answerNode.metadata ?? {};\n return (\n answerMeta.questionNodeId === questionNodeId &&\n answerMeta.isLatest === true &&\n answerNode.status === \"active\"\n );\n });\n}\n\nfunction getNextAnswerVersion(activeAnswers: AnswerNodeRow[]): number {\n if (activeAnswers.length === 0) {\n return 1;\n }\n\n return (\n Math.max(\n ...activeAnswers.map((answerNode) => {\n const answerMeta = answerNode.metadata ?? {};\n return readOptionalNumber(answerMeta.versionNumber) ?? 0;\n })\n ) + 1\n );\n}\n\nasync function supersedeActiveAnswers(\n ctx: MutationCtx,\n activeAnswers: AnswerNodeRow[],\n now: number,\n clearSupersededByBeforeInsert: boolean\n): Promise<void> {\n for (const activeAnswer of activeAnswers) {\n const metadata = {\n ...(activeAnswer.metadata ?? {}),\n isLatest: false,\n };\n\n await ctx.db.patch(activeAnswer._id, {\n status: \"superseded\",\n updatedAt: now,\n metadata,\n ...(clearSupersededByBeforeInsert\n ? {\n supersededBy: undefined,\n }\n : {}),\n });\n }\n}\n\nasync function collectEvidenceGlobalIds(\n ctx: MutationCtx,\n evidenceNodeIds: Id<\"epistemicNodes\">[] | undefined\n): Promise<string[]> {\n const evidenceGlobalIds: string[] = [];\n if (!evidenceNodeIds) {\n return evidenceGlobalIds;\n }\n\n for (const evidenceNodeId of evidenceNodeIds) {\n const evidenceNode = readAnswerNodeRow(await ctx.db.get(evidenceNodeId));\n if (evidenceNode) {\n evidenceGlobalIds.push(evidenceNode.globalId);\n }\n }\n return evidenceGlobalIds;\n}\n\nfunction resolveAnswerSource(\n answerSource: string | undefined\n): \"human\" | \"ai_generated\" {\n return answerSource === \"human\" ? \"human\" : \"ai_generated\";\n}\n\nfunction insertAnswerNodeRecord(\n ctx: MutationCtx,\n args: {\n questionNode: AnswerNodeRow;\n topicId: string;\n answerText: string;\n contentHash: string;\n versionNumber: number;\n evidenceGlobalIds: string[];\n globalId: string;\n now: number;\n args: Pick<\n AnswerCreateMutationArgs,\n \"answerSource\" | \"sprintId\" | \"userId\" | \"backfilledFromQuestionId\"\n >;\n }\n): Promise<Id<\"epistemicNodes\">> {\n return insertEpistemicNode(ctx, {\n globalId: args.globalId,\n projectId: args.topicId,\n topicId: args.questionNode.topicId,\n nodeType: \"answer\",\n epistemicLayer: \"L2\",\n canonicalText: args.answerText,\n contentHash: args.contentHash,\n status: \"active\",\n sourceType: resolveAnswerSource(args.args.answerSource),\n createdBy: args.args.userId,\n createdAt: args.now,\n updatedAt: args.now,\n metadata: {\n questionGlobalId: args.questionNode.globalId,\n questionNodeId: String(args.questionNode._id),\n versionNumber: args.versionNumber,\n isLatest: true,\n evidenceGlobalIds: args.evidenceGlobalIds,\n evidenceCount: args.evidenceGlobalIds.length,\n answeredBy: args.args.userId,\n answerSource: args.args.answerSource || \"human\",\n sprintId: args.args.sprintId,\n ...(args.args.backfilledFromQuestionId\n ? {\n backfilledFromQuestionId: args.args.backfilledFromQuestionId,\n }\n : {}),\n },\n });\n}\n\nasync function setAnswerSupersession(\n ctx: MutationCtx,\n activeAnswers: AnswerNodeRow[],\n newNodeId: Id<\"epistemicNodes\">\n): Promise<void> {\n for (const activeAnswer of activeAnswers) {\n await ctx.db.patch(activeAnswer._id, {\n supersededBy: newNodeId,\n });\n }\n}\n\nasync function scheduleAnswerSyncJobs(\n ctx: MutationCtx,\n args: {\n nodeId: Id<\"epistemicNodes\">;\n topicId: string;\n answerText: string;\n questionNode: AnswerNodeRow;\n userId: string;\n }\n): Promise<void> {\n await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId: args.nodeId,\n operation: \"upsert\",\n });\n\n await ctx.scheduler.runAfter(\n 0,\n api.embeddingActions.generateEpistemicNodeEmbedding,\n {\n nodeId: args.nodeId,\n projectId: args.topicId,\n topicId: args.questionNode.topicId\n ? String(args.questionNode.topicId)\n : undefined,\n createdBy: args.userId,\n nodeType: \"answer\",\n text: args.answerText.slice(0, 20_000),\n }\n );\n\n await ctx.scheduler.runAfter(\n 0,\n internal.sprints.embedProjectThemeCollectiveInternal,\n {\n projectId: args.topicId,\n userId: args.userId,\n }\n );\n}\n\nasync function scheduleAnswerGraphEdges(\n ctx: MutationCtx,\n args: {\n questionNode: AnswerNodeRow;\n questionNodeId: Id<\"epistemicNodes\">;\n userId: string;\n evidenceNodeIds: Id<\"epistemicNodes\">[] | undefined;\n activeAnswers: AnswerNodeRow[];\n answerGlobalId: string;\n edgeTopicId: string;\n }\n): Promise<void> {\n // Responds-to edge.\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.createEdge, {\n globalId: generateGlobalId(),\n fromGlobalId: args.answerGlobalId,\n toGlobalId: args.questionNode.globalId,\n edgeType: \"responds_to\",\n weight: 1.0,\n createdBy: args.userId,\n topicId: args.edgeTopicId,\n fromNodeType: \"answer\",\n toNodeType: \"question\",\n fromLayer: \"L2\",\n toLayer: \"L3\",\n });\n\n // Supersedes edges.\n for (const activeAnswer of args.activeAnswers) {\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.createEdge, {\n globalId: generateGlobalId(),\n fromGlobalId: args.answerGlobalId,\n toGlobalId: activeAnswer.globalId,\n edgeType: \"supersedes\",\n createdBy: args.userId,\n topicId: args.edgeTopicId,\n fromNodeType: \"answer\",\n toNodeType: \"answer\",\n fromLayer: \"L2\",\n toLayer: \"L2\",\n });\n }\n\n // Evidence edges.\n if (args.evidenceNodeIds) {\n for (const evidenceNodeId of args.evidenceNodeIds) {\n const evidenceNode = readAnswerNodeRow(await ctx.db.get(evidenceNodeId));\n if (evidenceNode) {\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.createEdge, {\n globalId: generateGlobalId(),\n fromGlobalId: args.answerGlobalId,\n toGlobalId: evidenceNode.globalId,\n edgeType: \"derived_from\",\n createdBy: args.userId,\n topicId: args.edgeTopicId,\n fromNodeType: \"answer\",\n toNodeType: \"evidence\",\n fromLayer: \"L2\",\n toLayer: \"L2\",\n });\n }\n }\n }\n\n // Re-edge from question evidence nodes.\n const evidenceEdges = readRowList(\n await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_to_type\", (q: IndexQuery) =>\n q.eq(\"toNodeId\", args.questionNodeId).eq(\"edgeType\", \"derived_from\")\n )\n .collect(),\n readAnswerEdgeRow\n );\n\n for (const evidenceEdge of evidenceEdges) {\n const evidenceNode = readAnswerNodeRow(\n await ctx.db.get(evidenceEdge.fromNodeId)\n );\n if (!evidenceNode) {\n continue;\n }\n\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.createEdge, {\n globalId: generateGlobalId(),\n fromGlobalId: evidenceNode.globalId,\n toGlobalId: args.answerGlobalId,\n edgeType: \"derived_from\",\n createdBy: args.userId,\n topicId: args.edgeTopicId,\n fromNodeType: \"evidence\",\n toNodeType: \"answer\",\n fromLayer: \"L2\",\n toLayer: \"L2\",\n });\n }\n}\n\nasync function createAnswerMutationResult(\n ctx: MutationCtx,\n args: AnswerCreateMutationArgs\n): Promise<{\n nodeId: Id<\"epistemicNodes\">;\n globalId: string;\n versionNumber: number;\n}> {\n const now = Date.now();\n const answerText = args.answerText;\n const globalId = generateGlobalId();\n const contentHash = generateContentHash(answerText);\n const activeAnswers = await getActiveAnswersForQuestion(\n ctx,\n args.questionNode,\n args.topicId,\n args.questionNodeId\n );\n const versionNumber = getNextAnswerVersion(activeAnswers);\n\n await supersedeActiveAnswers(\n ctx,\n activeAnswers,\n now,\n !!args.clearSupersededByBeforeInsert\n );\n\n const evidenceGlobalIds = await collectEvidenceGlobalIds(\n ctx,\n args.evidenceNodeIds\n );\n\n const nodeId = await insertAnswerNodeRecord(ctx, {\n questionNode: args.questionNode,\n topicId: args.topicId,\n answerText,\n contentHash,\n versionNumber,\n evidenceGlobalIds,\n globalId,\n now,\n args: {\n answerSource: args.answerSource,\n sprintId: args.sprintId,\n userId: args.userId,\n backfilledFromQuestionId: args.backfilledFromQuestionId,\n },\n });\n\n await setAnswerSupersession(ctx, activeAnswers, nodeId);\n\n await scheduleAnswerSyncJobs(ctx, {\n nodeId,\n topicId: args.topicId,\n questionNode: args.questionNode,\n userId: args.userId,\n answerText,\n });\n\n await scheduleAnswerGraphEdges(ctx, {\n questionNode: args.questionNode,\n questionNodeId: args.questionNodeId,\n userId: args.userId,\n evidenceNodeIds: args.evidenceNodeIds,\n activeAnswers,\n answerGlobalId: globalId,\n edgeTopicId: args.edgeTopicId,\n });\n\n const answerQuality = args.confidence || \"moderate\";\n await ctx.db.patch(args.questionNodeId, {\n answerQuality,\n updatedAt: now,\n });\n\n const auditState = args.backfilledFromQuestionId\n ? {\n answerText: answerText.slice(0, 200),\n versionNumber,\n questionNodeId: String(args.questionNodeId),\n backfilled: true,\n }\n : {\n answerText: answerText.slice(0, 200),\n versionNumber,\n questionNodeId: String(args.questionNodeId),\n confidence: answerQuality,\n };\n\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"answer\",\n entityId: nodeId,\n changeType: \"created\",\n changedAt: now,\n changedBy: args.userId,\n isAgent: false,\n projectId: args.topicId,\n newState: auditState,\n });\n\n return { nodeId, globalId, versionNumber };\n}\n\n// =============================================================================\n// CREATE\n// =============================================================================\n\n/**\n * Create a new answer node for a question.\n *\n * 1. Validates the question exists\n * 2. Determines version number\n * 3. Supersedes previous active answer (if any)\n * 4. Creates the answer node\n * 5. Creates responds_to edge (Answer → Question)\n * 6. Creates supersedes edge (NewAnswer → OldAnswer) if versioning\n * 7. Creates based_on edges (Answer → Evidence) for each evidence node\n * 8. Updates question's answerQuality field\n * 9. Logs to epistemicAudit\n */\nexport const create = mutation({\n args: {\n ...scopeArgs,\n questionNodeId: v.id(\"epistemicNodes\"),\n answerText: v.string(),\n confidence: v.optional(\n v.union(\n v.literal(\"definitive\"),\n v.literal(\"strong\"),\n v.literal(\"moderate\"),\n v.literal(\"weak\"),\n v.literal(\"speculative\")\n )\n ),\n evidenceNodeIds: v.optional(v.array(v.id(\"epistemicNodes\"))),\n answerSource: v.optional(v.string()),\n sprintId: v.optional(v.string()),\n userId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx: MutationCtx, args: CreateAnswerArgs) => {\n const scope = await resolveScope(ctx, args);\n const topicId = scope?.topicId ? String(scope.topicId) : args.topicId || \"\";\n await checkScopeAccess(ctx, topicId, args.userId);\n\n // 1. Validate question exists\n const questionNode = readAnswerNodeRow(\n await ctx.db.get(args.questionNodeId)\n );\n if (questionNode?.nodeType !== \"question\") {\n throw new Error(\"Question node not found or not a question type\");\n }\n\n return createAnswerMutationResult(ctx, {\n questionNode,\n questionNodeId: args.questionNodeId,\n answerText: args.answerText,\n confidence: args.confidence,\n evidenceNodeIds: args.evidenceNodeIds,\n answerSource: args.answerSource,\n sprintId: args.sprintId,\n userId: args.userId,\n topicId,\n edgeTopicId: String(args.topicId ?? \"\"),\n clearSupersededByBeforeInsert: true,\n });\n },\n});\n\n// =============================================================================\n// CREATE INTERNAL (for scheduler / other modules)\n// =============================================================================\n\n/**\n * Internal mutation for creating answer nodes.\n * Called from epistemicQuestions.updateStatus when status === \"answered\".\n */\nexport const createInternal = internalMutation({\n args: {\n ...scopeArgs,\n questionNodeId: v.id(\"epistemicNodes\"),\n answerText: v.string(),\n confidence: v.optional(v.string()),\n evidenceNodeIds: v.optional(v.array(v.id(\"epistemicNodes\"))),\n answerSource: v.optional(v.string()),\n sprintId: v.optional(v.string()),\n userId: v.string(),\n backfilledFromQuestionId: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx: MutationCtx, args: CreateInternalAnswerArgs) => {\n const scope = await resolveScope(ctx, args);\n const topicId = scope?.topicId ? String(scope.topicId) : args.topicId || \"\";\n\n // Validate question exists\n const questionNode = readAnswerNodeRow(\n await ctx.db.get(args.questionNodeId)\n );\n if (questionNode?.nodeType !== \"question\") {\n throw new Error(\"Question node not found or not a question type\");\n }\n return createAnswerMutationResult(ctx, {\n questionNode,\n questionNodeId: args.questionNodeId,\n answerText: args.answerText,\n confidence: args.confidence,\n evidenceNodeIds: args.evidenceNodeIds,\n answerSource: args.answerSource,\n sprintId: args.sprintId,\n userId: args.userId,\n topicId,\n edgeTopicId: String(args.topicId ?? \"\"),\n backfilledFromQuestionId: args.backfilledFromQuestionId,\n });\n },\n});\n\n// =============================================================================\n// QUERIES\n// =============================================================================\n\n/**\n * Get all answers for a question, optionally including superseded.\n */\nexport const getByQuestion = query({\n args: {\n questionNodeId: v.id(\"epistemicNodes\"),\n includeSuperseded: v.optional(v.boolean()),\n },\n returns: permissiveReturn,\n handler: async (ctx: QueryCtx, args: QuestionAnswerQueryArgs) => {\n const questionNode = readAnswerNodeRow(\n await ctx.db.get(args.questionNodeId)\n );\n if (questionNode?.nodeType !== \"question\") {\n return [];\n }\n\n const topicId = questionNode.topicId;\n if (!topicId) {\n return [];\n }\n const answers = readRowList(\n await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_topic_type\", (q: IndexQuery) =>\n q.eq(\"topicId\", topicId).eq(\"nodeType\", \"answer\")\n )\n .collect(),\n readAnswerNodeRow\n );\n\n // Filter to answers for this question\n const questionIdStr = String(args.questionNodeId);\n const filtered = answers.filter((a) => {\n const meta = a.metadata ?? {};\n return meta.questionNodeId === questionIdStr;\n });\n\n if (!args.includeSuperseded) {\n return filtered.filter((a) => a.status === \"active\");\n }\n\n // Sort by version number (newest first)\n filtered.sort((a, b) => {\n const metaA = a.metadata ?? {};\n const metaB = b.metadata ?? {};\n return (\n (readOptionalNumber(metaB.versionNumber) ?? 0) -\n (readOptionalNumber(metaA.versionNumber) ?? 0)\n );\n });\n\n return filtered;\n },\n});\n\n/**\n * Get the single active (latest) answer for a question.\n */\nexport const getLatestForQuestion = query({\n args: {\n questionNodeId: v.id(\"epistemicNodes\"),\n },\n returns: permissiveReturn,\n handler: async (ctx: QueryCtx, args: QuestionOnlyQueryArgs) => {\n const questionNode = readAnswerNodeRow(\n await ctx.db.get(args.questionNodeId)\n );\n if (questionNode?.nodeType !== \"question\") {\n return null;\n }\n\n // Filter status === \"active\" at DB level to reduce JS-side work.\n // metadata.questionNodeId filtering must stay in JS (no index on metadata fields).\n const topicId = questionNode.topicId;\n if (!topicId) {\n return null;\n }\n const answers = readRowList(\n await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_topic_type\", (q: IndexQuery) =>\n q.eq(\"topicId\", topicId).eq(\"nodeType\", \"answer\")\n )\n .filter((q: FilterQuery) => q.eq(q.field(\"status\"), \"active\"))\n .collect(),\n readAnswerNodeRow\n );\n\n const questionIdStr = String(args.questionNodeId);\n const latest = answers.find((a) => {\n const meta = a.metadata ?? {};\n return meta.questionNodeId === questionIdStr && meta.isLatest === true;\n });\n\n return latest || null;\n },\n});\n\n/**\n * Get full version history for answers to a question.\n * Returns answers ordered by version number (newest first).\n */\nexport const getVersionHistory = query({\n args: {\n questionNodeId: v.id(\"epistemicNodes\"),\n },\n returns: permissiveReturn,\n handler: async (ctx: QueryCtx, args: QuestionOnlyQueryArgs) => {\n const questionNode = readAnswerNodeRow(\n await ctx.db.get(args.questionNodeId)\n );\n if (questionNode?.nodeType !== \"question\") {\n return [];\n }\n\n // Filter status at DB level; metadata.questionNodeId must filter in JS (no index on metadata).\n const topicId = questionNode.topicId;\n if (!topicId) {\n return [];\n }\n const answers = readRowList(\n await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_topic_type\", (q: IndexQuery) =>\n q.eq(\"topicId\", topicId).eq(\"nodeType\", \"answer\")\n )\n .filter((q: FilterQuery) =>\n q.or(\n q.eq(q.field(\"status\"), \"active\"),\n q.eq(q.field(\"status\"), \"superseded\")\n )\n )\n .collect(),\n readAnswerNodeRow\n );\n\n const questionIdStr = String(args.questionNodeId);\n const history = answers\n .filter((a) => {\n const meta = a.metadata ?? {};\n return meta.questionNodeId === questionIdStr;\n })\n .map((a) => {\n const meta = a.metadata ?? {};\n return {\n _id: a._id,\n globalId: a.globalId,\n answerText: a.canonicalText,\n versionNumber: readOptionalNumber(meta.versionNumber) ?? 1,\n isLatest: meta.isLatest === true,\n status: a.status,\n answeredBy: readOptionalString(meta.answeredBy) ?? a.createdBy,\n answerSource: readOptionalString(meta.answerSource),\n evidenceCount: readOptionalNumber(meta.evidenceCount) ?? 0,\n createdAt: a.createdAt,\n supersededBy: a.supersededBy,\n };\n })\n .sort((a, b) => b.versionNumber - a.versionNumber);\n\n return history;\n },\n});\n\n// =============================================================================\n// BACKFILL: Create answer nodes for questions that have answer text but no node\n// =============================================================================\n\n/**\n * Backfill answer nodes for questions that have answer text in metadata\n * but never had an answer node created (due to the QuestionAnswerEditor bug\n * where saveAnswer passed wrong params to updateStatus).\n *\n * Run once via Convex dashboard:\n * internal.epistemicAnswers.backfillAnswerNodes({ projectId, userId })\n */\nexport const backfillAnswerNodes = internalMutation({\n args: {\n ...scopeArgs,\n userId: v.string(),\n dryRun: v.optional(v.boolean()),\n },\n returns: permissiveReturn,\n handler: async (ctx: MutationCtx, args: BackfillAnswerNodesArgs) => {\n const scope = await resolveScope(ctx, args);\n const topicId = scope?.topicId ? String(scope.topicId) : args.topicId;\n const dryRun = args.dryRun ?? false;\n if (!topicId) {\n return {\n questionsWithAnswers: 0,\n alreadyHaveNodes: 0,\n needsBackfill: 0,\n backfilled: 0,\n };\n }\n\n // 1. Find all question nodes with answer text in metadata (TC-C: prefer topic)\n const questions = readRowList(\n await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_topic_type\", (q: IndexQuery) =>\n q.eq(\"topicId\", topicId).eq(\"nodeType\", \"question\")\n )\n .collect(),\n readAnswerNodeRow\n );\n\n const questionsWithAnswers = questions.filter((q) => {\n const meta = q.metadata ?? {};\n const answer = readOptionalString(meta.answer);\n return answer && answer.trim().length > 0;\n });\n\n // 2. Find all existing answer nodes (TC-C: use topic index since projectId is now topicId)\n const existingAnswers = readRowList(\n await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_topic_type\", (q: IndexQuery) =>\n q.eq(\"topicId\", topicId).eq(\"nodeType\", \"answer\")\n )\n .collect(),\n readAnswerNodeRow\n );\n\n // Build set of question IDs that already have answer nodes\n const questionIdsWithAnswerNodes = new Set(\n existingAnswers.map((a) => {\n const meta = a.metadata ?? {};\n return readOptionalString(meta.questionNodeId);\n })\n );\n\n // 3. Filter to questions that need backfill\n const needsBackfill = questionsWithAnswers.filter(\n (q) => !questionIdsWithAnswerNodes.has(String(q._id))\n );\n\n console.log(\n `[backfillAnswerNodes] Found ${questionsWithAnswers.length} questions with answers, ` +\n `${questionIdsWithAnswerNodes.size} already have answer nodes, ` +\n `${needsBackfill.length} need backfill. dryRun=${dryRun}`\n );\n\n if (dryRun) {\n return {\n questionsWithAnswers: questionsWithAnswers.length,\n alreadyHaveNodes: questionIdsWithAnswerNodes.size,\n needsBackfill: needsBackfill.length,\n questions: needsBackfill.map((q) => ({\n id: q._id,\n globalId: q.globalId,\n text: q.canonicalText?.slice(0, 80),\n answer: readOptionalString(q.metadata?.answer)?.slice(0, 80),\n })),\n };\n }\n\n // 4. Create answer nodes for each\n let created = 0;\n for (const question of needsBackfill) {\n const meta = question.metadata ?? {};\n const answerText = readOptionalString(meta.answer);\n if (!answerText) {\n continue;\n }\n const answeredBy = readOptionalString(meta.answeredBy);\n\n await ctx.scheduler.runAfter(\n 0,\n internal.epistemicAnswers.createInternal,\n {\n topicId: String(topicId), // TC-C: migrated from projectId\n questionNodeId: question._id,\n answerText,\n answerSource: answeredBy ? \"human\" : \"ai_generated\",\n userId: answeredBy ?? args.userId,\n backfilledFromQuestionId: String(question._id),\n }\n );\n created++;\n }\n\n return {\n questionsWithAnswers: questionsWithAnswers.length,\n alreadyHaveNodes: questionIdsWithAnswerNodes.size,\n backfilled: created,\n };\n },\n});\n"]}
1
+ {"version":3,"sources":["../src/convex.ts","../src/epistemicInsert.ts","../src/debug.ts","../src/topicScope.ts","../src/scopeResolverCompat.ts","../src/epistemicAnswers.ts"],"names":["query","normalizeScopeValue","v"],"mappings":"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","file":"epistemicAnswers.js","sourcesContent":["import type { Doc as AccessControlDoc } from \"@lucern/access-control/convex\";\nimport {\n type UnsafeConvexAnyApi,\n unsafeConvexAnyApi,\n} from \"@lucern/contracts/convex/unsafeAnyApi\";\nimport {\n actionGeneric,\n componentsGeneric,\n httpActionGeneric,\n internalActionGeneric,\n internalMutationGeneric,\n internalQueryGeneric,\n mutationGeneric,\n queryGeneric,\n} from \"convex/server\";\nimport type { GenericId } from \"convex/values\";\n\n// TODO(FR.11-structural): `api`/`internal`/`components` are `anyApi as any`\n// because this module source tree is bundled into the kernel host at deploy time\n// and has NO top-level Convex `_generated/` directory to import a typed surface\n// from. Every `api.*` / `internal.*` / string-literal cross-component ref in this\n// module (topicScope.ts, topicProjectOverlay.ts, questionEvidenceLinks.ts,\n// beliefEvidenceLinks*.ts, epistemicQuestions.helpers.ts) inherits `any` from\n// here. The fix is structural — generate a per-module typed surface or a shared\n// typed function-reference manifest (template: the typed `components.controlPlane`\n// in modules/control-plane/src/component/convex.ts and the\n// `KERNEL_API_REF_MANIFEST` pattern in packages/server-core/src/kernelApi.ts) —\n// owned by the FR.11 closing/synthesis pass, not a mechanical swap.\nconst unsafeApi = unsafeConvexAnyApi(\n \"graph-primitives top-level module bundle lacks a committed Convex _generated/api surface\"\n);\nexport const api = unsafeApi;\nexport const components =\n componentsGeneric() as unknown as UntypedFunctionReferenceSurface;\nexport const internal = unsafeApi;\n\ntype UntypedFunctionReferenceSurface = UnsafeConvexAnyApi;\ntype BoundaryValue = UntypedFunctionReferenceSurface[string];\n\nexport type TableNames = string;\nexport type Id<TableName extends TableNames = string> = GenericId<TableName>;\nexport type Doc<TableName extends TableNames = string> =\n AccessControlDoc<TableName>;\nexport type DataModel = Record<TableNames, unknown>;\ninterface IndexRangeBuilder {\n eq(fieldName: string, value: unknown): IndexRangeBuilder;\n field(fieldName: string): string;\n gt(fieldName: string, value: unknown): IndexRangeBuilder;\n gte(fieldName: string, value: unknown): IndexRangeBuilder;\n lt(fieldName: string, value: unknown): IndexRangeBuilder;\n lte(fieldName: string, value: unknown): IndexRangeBuilder;\n}\ninterface FilterBuilder {\n and(...clauses: unknown[]): FilterBuilder;\n eq(left: unknown, right: unknown): FilterBuilder;\n field(fieldName: string): string;\n gt(left: unknown, right: unknown): FilterBuilder;\n gte(left: unknown, right: unknown): FilterBuilder;\n lt(left: unknown, right: unknown): FilterBuilder;\n lte(left: unknown, right: unknown): FilterBuilder;\n neq(left: unknown, right: unknown): FilterBuilder;\n or(...clauses: unknown[]): FilterBuilder;\n [operator: string]: unknown;\n}\ninterface QueryInitializer<TableName extends TableNames> {\n collect(): Promise<Doc<TableName>[]>;\n filter(predicate: (q: FilterBuilder) => unknown): QueryInitializer<TableName>;\n first(): Promise<Doc<TableName> | null>;\n order(direction: \"asc\" | \"desc\"): QueryInitializer<TableName>;\n take(limit: number): Promise<Doc<TableName>[]>;\n unique(): Promise<Doc<TableName> | null>;\n withIndex(\n indexName: string,\n range?: (q: IndexRangeBuilder) => unknown\n ): QueryInitializer<TableName>;\n withSearchIndex(\n indexName: string,\n search?: (q: IndexRangeBuilder) => unknown\n ): QueryInitializer<TableName>;\n}\nexport interface DatabaseReader {\n get<TableName extends TableNames>(\n id: unknown\n ): Promise<Doc<TableName> | null>;\n normalizeId?<TableName extends TableNames>(\n tableName: TableName,\n id: string\n ): Id<TableName> | null;\n query<TableName extends TableNames>(\n tableName: TableName\n ): QueryInitializer<TableName>;\n}\nexport type DatabaseWriter = DatabaseReader & {\n insert<TableName extends TableNames>(\n tableName: TableName,\n value: Record<string, unknown>\n ): Promise<Id<TableName>>;\n patch<TableName extends TableNames>(\n id: Id<TableName>,\n value: Record<string, unknown>\n ): Promise<void>;\n replace<TableName extends TableNames>(\n id: Id<TableName>,\n value: Record<string, unknown>\n ): Promise<void>;\n delete<TableName extends TableNames>(id: Id<TableName>): Promise<void>;\n};\ninterface Scheduler {\n runAfter(\n delayMs: number,\n functionReference: unknown,\n args?: unknown\n ): Promise<void>;\n}\ninterface AuthReader {\n getUserIdentity(): Promise<{\n readonly subject: string;\n readonly [claimName: string]: unknown;\n } | null>;\n}\ninterface RuntimeInvoker {\n runAction<Result = unknown>(\n functionReference: unknown,\n args?: unknown\n ): Promise<Result>;\n runMutation<Result = unknown>(\n functionReference: unknown,\n args?: unknown\n ): Promise<Result>;\n runQuery<Result = unknown>(\n functionReference: unknown,\n args?: unknown\n ): Promise<Result>;\n}\nexport type QueryCtx = RuntimeInvoker & {\n auth: AuthReader;\n db: DatabaseReader;\n scheduler: Scheduler;\n};\nexport type MutationCtx = RuntimeInvoker & {\n auth: AuthReader;\n db: DatabaseWriter;\n scheduler: Scheduler;\n};\nexport type ActionCtx = RuntimeInvoker & {\n auth: AuthReader;\n scheduler: Scheduler;\n};\n\ntype ConvexFunctionBuilder<Ctx> = <\n Args = BoundaryValue,\n Result = BoundaryValue,\n>(definition: {\n args?: unknown;\n handler: (ctx: Ctx, args: Args) => Result;\n returns?: unknown;\n}) => unknown;\n\ntype OptionalHandlerConvexFunctionBuilder<Ctx> = <\n Args = BoundaryValue,\n Result = BoundaryValue,\n>(definition: {\n args?: unknown;\n handler?: (ctx: Ctx, args: Args) => Result;\n returns?: unknown;\n}) => unknown;\n\nexport const action =\n actionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const httpAction =\n httpActionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const internalAction =\n internalActionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const internalMutation =\n internalMutationGeneric as unknown as OptionalHandlerConvexFunctionBuilder<MutationCtx>;\nexport const internalQuery =\n internalQueryGeneric as unknown as OptionalHandlerConvexFunctionBuilder<QueryCtx>;\nexport const mutation =\n mutationGeneric as unknown as ConvexFunctionBuilder<MutationCtx>;\nexport const query = queryGeneric as unknown as ConvexFunctionBuilder<QueryCtx>;\n","// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\nimport {\n assertEdgePolicyAllowed,\n type EpistemicNodeType,\n edgePolicyManifest,\n} from \"@lucern/contracts\";\nimport {\n assertStorageEdgeVocabulary,\n assertUuidShapedEdgeEndpoint,\n assertUuidV7Identity,\n} from \"@lucern/contracts/ids\";\nimport type { Id, MutationCtx } from \"./convex\";\n\ninterface GlobalIdIndexQuery {\n eq(field: \"globalId\", value: string): GlobalIdIndexQuery;\n}\n\ninterface EpistemicNodeInsertDoc extends Record<string, unknown> {\n globalId: string;\n}\n\ninterface EpistemicEdgeInsertDoc extends Record<string, unknown> {\n edgeType: string;\n fromNodeId: string;\n fromNodeType?: string;\n globalId: string;\n toNodeId: string;\n toNodeType?: string;\n}\n\nexport function insertEpistemicNode(\n ctx: MutationCtx,\n doc: EpistemicNodeInsertDoc\n): Promise<Id<\"epistemicNodes\">> {\n assertUuidV7Identity(\"epistemicNodes\", doc.globalId);\n return ctx.db.insert(\"epistemicNodes\", doc);\n}\n\n/**\n * C2-RR.4b — REFERENTIAL edge-endpoint canonicality (amends RR.4's FORMAT guard).\n *\n * Proves an endpoint is the UUIDv7 `globalId` of an EXISTING\n * `epistemicNodes` row. Refuses doc ids, fabricated/unknown endpoints, and\n * legacy UUIDv4 `globalId`s; those must be reminted through the identity\n * backfill ledger before participating in new edge writes.\n */\nasync function assertExistingNodeEndpoint(\n ctx: MutationCtx,\n endpointRole: \"fromNodeId\" | \"toNodeId\",\n endpoint: string\n): Promise<void> {\n assertUuidShapedEdgeEndpoint(endpointRole, endpoint);\n const node = await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_globalId\", (q: GlobalIdIndexQuery) =>\n q.eq(\"globalId\", endpoint)\n )\n .first();\n if (!node) {\n throw new Error(\n `edge_endpoint_not_canonical: epistemicEdges insert requires ${endpointRole} to be the globalId of an existing epistemicNodes row, received ${endpoint} (no node with that globalId)`\n );\n }\n}\n\nexport async function insertEpistemicEdge(\n ctx: MutationCtx,\n doc: EpistemicEdgeInsertDoc\n): Promise<Id<\"epistemicEdges\">> {\n assertUuidV7Identity(\"epistemicEdges\", doc.globalId);\n\n // R1.1a — STORAGE-VOCABULARY MEMBERSHIP\n assertStorageEdgeVocabulary(doc.edgeType);\n\n // R1.1b — ENDPOINT PRESENCE\n if (!doc.fromNodeId || typeof doc.fromNodeId !== \"string\") {\n throw new Error(\n \"edge_endpoint_missing: epistemicEdges insert requires a non-empty fromNodeId\"\n );\n }\n if (!doc.toNodeId || typeof doc.toNodeId !== \"string\") {\n throw new Error(\n \"edge_endpoint_missing: epistemicEdges insert requires a non-empty toNodeId\"\n );\n }\n\n // C2-RR.4b Defect E (REFERENTIAL) — ENDPOINT CANONICAL IDENTITY. Edge\n // endpoints must each be the globalId of an EXISTING epistemicNodes row,\n // never a Convex doc id, a legacy topic id, or a fabricated/unknown uuid.\n // This refuses mixed _id/globalId endpoint writes at the floor and keeps\n // legacy UUIDv4 graph rows inside the explicit remint/backfill lane.\n await assertExistingNodeEndpoint(ctx, \"fromNodeId\", doc.fromNodeId);\n await assertExistingNodeEndpoint(ctx, \"toNodeId\", doc.toNodeId);\n\n // R1.1c — FULL POLICY ASSERT (when nodeTypes are present and edgeType is in public manifest)\n if (doc.fromNodeType && doc.toNodeType && doc.edgeType !== \"extracted_from\") {\n assertEdgePolicyAllowed(\n edgePolicyManifest,\n doc.edgeType,\n {\n kind: \"epistemic_node\",\n nodeId: doc.fromNodeId,\n nodeType: doc.fromNodeType as EpistemicNodeType,\n },\n {\n kind: \"epistemic_node\",\n nodeId: doc.toNodeId,\n nodeType: doc.toNodeType as EpistemicNodeType,\n }\n );\n }\n\n return ctx.db.insert(\"epistemicEdges\", doc);\n}\n","interface GraphPrimitiveDebugEnvironment {\n process?: {\n env?: Record<string, string | undefined>;\n };\n}\n\nfunction isGraphPrimitiveDebugEnabled(): boolean {\n const env = (globalThis as GraphPrimitiveDebugEnvironment).process?.env;\n return (\n env?.LUCERN_COMPAT_FALLBACK_DEBUG === \"1\" || env?.LUCERN_GRAPH_DEBUG === \"1\"\n );\n}\n\nexport function formatGraphPrimitiveError(error: unknown): string {\n if (error instanceof Error) {\n return `${error.name}: ${error.message}`;\n }\n if (typeof error === \"string\") {\n return error;\n }\n if (error === null) {\n return \"null\";\n }\n if (error === undefined) {\n return \"undefined\";\n }\n try {\n return JSON.stringify(error);\n } catch {\n return Object.prototype.toString.call(error);\n }\n}\n\nexport function debugGraphPrimitiveFallback(\n message: string,\n context?: Record<string, unknown>\n): void {\n if (!isGraphPrimitiveDebugEnabled()) {\n return;\n }\n console.debug(message, context ?? {});\n}\n","// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\n/** Topic-scope resolution helpers for graph-primitive operations. */\nimport { v } from \"convex/values\";\nimport type { Id } from \"./convex\";\nimport { api as appApi } from \"./convex\";\nimport { debugGraphPrimitiveFallback } from \"./debug\";\n\nconst LEGACY_SCOPE_FIELD = \"graphScopeProjectId\";\n\ntype UnknownRecord = Record<string, unknown>;\n\ninterface TopicScopeContext {\n db: {\n get(id: string): Promise<unknown>;\n query(tableName: string): TopicScopeQuery;\n };\n runQuery?: <TResult>(fnRef: unknown, args: unknown) => Promise<TResult>;\n}\n\ninterface TopicScopeQuery {\n collect(): Promise<unknown[]>;\n first(): Promise<unknown | null>;\n withIndex(\n indexName: string,\n range?: (q: TopicScopeIndexRangeBuilder) => unknown\n ): TopicScopeQuery;\n}\n\ninterface TopicScopeIndexRangeBuilder {\n eq(field: string, value: unknown): TopicScopeIndexRangeBuilder;\n}\n\ntype TopicDoc = Record<string, unknown> & {\n _id: Id<\"topics\">;\n globalId?: string;\n name?: string;\n depth?: number;\n createdAt?: number;\n parentTopicId?: Id<\"topics\">;\n tenantId?: string;\n workspaceId?: string;\n metadata?: Record<string, unknown>;\n};\n\nexport interface TopicProjectScope {\n projectId?: string;\n source: \"topic\" | \"project_mapped_topic\" | \"topic_inferred\" | \"topic_node\";\n tenantId?: string;\n topicId: Id<\"topics\">;\n workspaceId?: string;\n}\n\n/**\n * RR.5 (legacy topics-table retirement) — graph-primitives mirror of the\n * kernel's epistemicNodes-first topic-scope fallback. Kept in lockstep with\n * `packages/reasoning-kernel/src/adapters/lib/topicScope.ts`\n * (`tests/unit/convex/topic-scope-fallbacks.test.ts` asserts parity).\n *\n * Resolves a topic that exists only as `epistemicNodes(nodeType=\"topic\")` —\n * the write-of-record — when no legacy `topics` row backs the ref, returning the\n * node's `topicId` self-key so scoped beliefs/evidence/questions stay reachable.\n * See the kernel module for the full silent-empty-result rationale.\n */\ninterface TopicNodeScopeDoc {\n _id: string | Id<\"epistemicNodes\">;\n globalId?: string;\n metadata?: UnknownRecord;\n nodeType?: string;\n topicId?: string;\n}\n\nasync function resolveTopicNodeScopeOrNull(\n ctx: TopicScopeContext,\n ref: string\n): Promise<TopicProjectScope | null> {\n if (!ctx?.db || typeof ctx.db.query !== \"function\") {\n return null;\n }\n\n let node: TopicNodeScopeDoc | null = null;\n\n // 1. The ref IS the topic node's UUIDv7 globalId.\n try {\n const byGlobalId = (await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_globalId\", (q) => q.eq(\"globalId\", ref))\n .first()) as TopicNodeScopeDoc | null;\n if (byGlobalId && byGlobalId.nodeType === \"topic\") {\n node = byGlobalId;\n }\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] topic-node scope lookup by globalId failed\",\n { error, ref }\n );\n }\n\n if (!node) {\n return null;\n }\n\n const scopeKey =\n normalizeScopeValue(node.topicId) ?? normalizeScopeValue(node.globalId);\n if (!scopeKey) {\n return null;\n }\n\n return {\n topicId: scopeKey as Id<\"topics\">,\n projectId: asMappedProjectId(node),\n source: \"topic_node\",\n };\n}\n\ninterface MaterializedTopicNodeDoc {\n _id: string | Id<\"epistemicNodes\">;\n metadata?: Record<string, unknown>;\n}\n\nfunction asMappedProjectId(\n topic: Pick<TopicDoc, \"metadata\"> | TopicNodeScopeDoc | null | undefined\n): string | undefined {\n if (!topic) {\n return;\n }\n const directLegacyProjectId = normalizeScopeValue(\n (topic as UnknownRecord)[LEGACY_SCOPE_FIELD]\n );\n if (directLegacyProjectId) {\n return directLegacyProjectId;\n }\n const metadata = topic.metadata || {};\n const candidate =\n (metadata as UnknownRecord)[LEGACY_SCOPE_FIELD] ||\n (metadata as UnknownRecord).legacyProjectId ||\n (metadata as UnknownRecord).projectId ||\n (metadata as UnknownRecord).scopeProjectId;\n return typeof candidate === \"string\"\n ? normalizeScopeValue(candidate)\n : undefined;\n}\n\nfunction normalizeScopeValue(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return;\n }\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction pickPrimaryTopic(candidates: TopicDoc[]): TopicDoc | undefined {\n return [...candidates].sort((a, b) => {\n const depthA = a.depth ?? 9999;\n const depthB = b.depth ?? 9999;\n if (depthA !== depthB) {\n return depthA - depthB;\n }\n const createdA = a.createdAt ?? Number.MAX_SAFE_INTEGER;\n const createdB = b.createdAt ?? Number.MAX_SAFE_INTEGER;\n if (createdA !== createdB) {\n return createdA - createdB;\n }\n return String(a.name || \"\").localeCompare(String(b.name || \"\"));\n })[0];\n}\n\nasync function findTopicsByScopeAlias(\n ctx: TopicScopeContext,\n scopeId: string\n): Promise<TopicDoc[]> {\n const query = ctx.db.query(\"topics\") as TopicScopeQuery;\n try {\n return (await query\n .withIndex(\"by_graph_scope_project\", (q) =>\n q.eq(LEGACY_SCOPE_FIELD, scopeId)\n )\n .collect()) as TopicDoc[];\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to resolve scope alias via index\",\n {\n error,\n scopeId,\n }\n );\n // Older Lucern dev deployments can lag index backfills while still carrying\n // the underlying topics table. Scan and filter so scope resolution keeps\n // working during the rollout.\n const topics = (await query.collect()) as TopicDoc[];\n return topics.filter((topic) => {\n const normalizedGlobalId = normalizeScopeValue(topic.globalId);\n const mappedProjectId = asMappedProjectId(topic);\n return (\n String(topic._id) === scopeId ||\n normalizedGlobalId === scopeId ||\n mappedProjectId === scopeId\n );\n });\n }\n}\n\nasync function tryResolveHostTopicById(\n ctx: TopicScopeContext,\n topicId: string\n): Promise<TopicDoc | null> {\n if (typeof ctx.runQuery !== \"function\") {\n return null;\n }\n try {\n return ((await ctx.runQuery(appApi.topics.get, {\n id: topicId,\n })) ?? null) as TopicDoc | null;\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to resolve topic by host query\",\n {\n error,\n topicId,\n }\n );\n return null;\n }\n}\n\nasync function tryResolveHostTopicByLegacyScope(\n ctx: TopicScopeContext,\n legacyScopeId: string\n): Promise<TopicDoc | null> {\n if (typeof ctx.runQuery !== \"function\") {\n return null;\n }\n try {\n return ((await ctx.runQuery(appApi.topics.getByLegacyScopeId, {\n projectId: legacyScopeId,\n })) ?? null) as TopicDoc | null;\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to resolve topic by legacy scope\",\n {\n error,\n legacyScopeId,\n }\n );\n return null;\n }\n}\n\nexport function readMaterializedTopicTableId(\n topicNode: MaterializedTopicNodeDoc | null | undefined\n): string | undefined {\n if (!topicNode) {\n return;\n }\n\n const metadata = (topicNode.metadata || {}) as Record<string, unknown>;\n const topicTableId =\n (metadata.topicTableId as string | undefined) ||\n (metadata.topicId as string | undefined);\n\n return typeof topicTableId === \"string\" && topicTableId.trim().length > 0\n ? topicTableId.trim()\n : undefined;\n}\n\n/**\n * Walk the topic parent chain to find inherited workspaceId and tenantId.\n * Mirrors the pattern used by resolveTopicOntology for ontologyId inheritance.\n * Max depth: 10 (defensive limit against pathological nesting).\n */\nasync function resolveInheritedWorkspaceScope(\n ctx: TopicScopeContext,\n topic: TopicDoc\n): Promise<{ tenantId?: string; workspaceId?: string }> {\n const MAX_DEPTH = 10;\n let tenantId = normalizeScopeValue(topic.tenantId);\n let workspaceId = normalizeScopeValue(topic.workspaceId);\n\n if (tenantId && workspaceId) {\n return { tenantId, workspaceId };\n }\n\n let current: TopicDoc | null = topic;\n for (let i = 0; i < MAX_DEPTH && current?.parentTopicId; i++) {\n current = (await ctx.db.get(current.parentTopicId)) as TopicDoc | null;\n if (!current) {\n break;\n }\n\n if (!tenantId) {\n tenantId = normalizeScopeValue(current.tenantId);\n }\n if (!workspaceId) {\n workspaceId = normalizeScopeValue(current.workspaceId);\n }\n if (tenantId && workspaceId) {\n break;\n }\n }\n\n return { tenantId, workspaceId };\n}\n\nexport async function resolveTopicProjectScope(\n ctx: TopicScopeContext,\n args: { topicId?: Id<\"topics\"> | string; projectId?: string }\n): Promise<TopicProjectScope> {\n if (args.topicId) {\n return await resolveScopeFromTopicId(ctx, args.topicId);\n }\n\n if (args.projectId) {\n return await resolveScopeFromLegacyProjectId(ctx, args.projectId);\n }\n\n throw new Error(\n \"Missing scope: provide topicId (preferred) or legacy projectId alias.\"\n );\n}\n\nasync function resolveScopeFromTopicId(\n ctx: TopicScopeContext,\n topicId: Id<\"topics\"> | string\n): Promise<TopicProjectScope> {\n const topic = await resolveTopicDocFromTopicId(ctx, topicId);\n if (topic) {\n return await buildTopicScope(ctx, topic, \"topic\");\n }\n\n const nodeScope = await resolveTopicNodeScopeOrNull(ctx, String(topicId));\n if (nodeScope) {\n return nodeScope;\n }\n throw new Error(`Topic not found: ${String(topicId)}`);\n}\n\nasync function resolveTopicDocFromTopicId(\n ctx: TopicScopeContext,\n topicId: Id<\"topics\"> | string\n): Promise<TopicDoc | null> {\n const direct = await tryReadTopicDoc(ctx, topicId, {\n failureLog: \"[topicScope] Failed to load topic by direct id\",\n idLogKey: \"topicId\",\n });\n if (direct) {\n return direct;\n }\n\n const hostTopic = await tryResolveHostTopicById(ctx, String(topicId));\n if (hostTopic) {\n return hostTopic;\n }\n\n return (\n pickPrimaryTopic(await findTopicsByScopeAlias(ctx, String(topicId))) ?? null\n );\n}\n\nasync function resolveScopeFromLegacyProjectId(\n ctx: TopicScopeContext,\n legacyProjectId: string\n): Promise<TopicProjectScope> {\n const directTopic = await resolveDirectLegacyProjectTopic(\n ctx,\n legacyProjectId\n );\n if (directTopic) {\n return await buildTopicScope(ctx, directTopic, \"topic_inferred\", {\n fallbackProjectId: legacyProjectId,\n });\n }\n\n const primary = pickPrimaryTopic(\n await findTopicsByScopeAlias(ctx, legacyProjectId)\n );\n if (primary) {\n return await buildTopicScope(ctx, primary, \"project_mapped_topic\", {\n fallbackProjectId: legacyProjectId,\n });\n }\n\n const nodeScope = await resolveTopicNodeScopeOrNull(ctx, legacyProjectId);\n if (nodeScope) {\n return {\n ...nodeScope,\n projectId: nodeScope.projectId ?? legacyProjectId,\n };\n }\n\n throw new Error(\n `Legacy project scope ${legacyProjectId} has no mapped topic.`\n );\n}\n\nasync function resolveDirectLegacyProjectTopic(\n ctx: TopicScopeContext,\n legacyProjectId: string\n): Promise<TopicDoc | null> {\n const directTopic = await tryReadTopicDoc(ctx, legacyProjectId, {\n failureLog: \"[topicScope] Failed to load direct project topic\",\n idLogKey: \"projectId\",\n });\n return directTopic ?? tryResolveHostTopicByLegacyScope(ctx, legacyProjectId);\n}\n\nasync function tryReadTopicDoc(\n ctx: TopicScopeContext,\n id: Id<\"topics\"> | string,\n log: { failureLog: string; idLogKey: \"projectId\" | \"topicId\" }\n): Promise<TopicDoc | null> {\n try {\n return (await ctx.db.get(id)) as TopicDoc | null;\n } catch (error) {\n debugGraphPrimitiveFallback(log.failureLog, {\n error,\n [log.idLogKey]: id,\n });\n return null;\n }\n}\n\nasync function buildTopicScope(\n ctx: TopicScopeContext,\n topic: TopicDoc,\n source: TopicProjectScope[\"source\"],\n options: { fallbackProjectId?: string } = {}\n): Promise<TopicProjectScope> {\n const inherited = await resolveInheritedWorkspaceScope(ctx, topic);\n const mapped = asMappedProjectId(topic);\n return {\n topicId: topic._id,\n ...(mapped || options.fallbackProjectId\n ? { projectId: mapped ?? options.fallbackProjectId }\n : {}),\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source,\n };\n}\n\n/** Shared scope args for graph-primitive functions. topicId is canonical; projectId is a legacy alias. */\nexport const optionalScopeArgs = {\n projectId: v.optional(v.string()),\n topicId: v.optional(v.string()),\n} as const;\n","// biome-ignore-all lint/style/useFilenamingConvention: Public ABI surface; rename requires a cross-package migration update.\nimport { debugGraphPrimitiveFallback } from \"./debug\";\nimport { optionalScopeArgs, resolveTopicProjectScope } from \"./topicScope\";\n\ntype TopicScopeResolverContext = Parameters<typeof resolveTopicProjectScope>[0];\n\nexport const scopeArgs = optionalScopeArgs;\n\nexport type ResolvedScope = Awaited<\n ReturnType<typeof resolveTopicProjectScope>\n>;\nexport interface SoftResolvedScope {\n projectId?: string;\n source?: ResolvedScope[\"source\"];\n tenantId?: string;\n topicId?: string;\n workspaceId?: string;\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\nexport async function resolveScope(\n ctx: TopicScopeResolverContext,\n args: { topicId?: string | null; projectId?: string | null }\n): Promise<ResolvedScope | null> {\n const topicId = normalizeScopeValue(args.topicId);\n const projectId = normalizeScopeValue(args.projectId);\n if (!(topicId || projectId)) {\n return null;\n }\n\n try {\n return await resolveTopicProjectScope(ctx, {\n topicId,\n projectId,\n });\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[scopeResolverCompat] Failed to resolve scope\",\n {\n error,\n topicId,\n projectId,\n }\n );\n return null;\n }\n}\n\nexport async function resolveScopeSoft(\n ctx: TopicScopeResolverContext,\n args: { topicId?: string | null; projectId?: string | null }\n): Promise<SoftResolvedScope> {\n const resolved = await resolveScope(ctx, args);\n if (resolved) {\n const topicId = normalizeScopeValue(resolved.topicId);\n return {\n ...(topicId ? { topicId } : {}),\n ...(resolved.projectId ? { projectId: resolved.projectId } : {}),\n ...(resolved.tenantId ? { tenantId: resolved.tenantId } : {}),\n ...(resolved.workspaceId ? { workspaceId: resolved.workspaceId } : {}),\n ...(resolved.source ? { source: resolved.source } : {}),\n };\n }\n\n const topicId = normalizeScopeValue(args.topicId);\n const projectId = normalizeScopeValue(args.projectId);\n return {\n ...(topicId ? { topicId } : {}),\n ...(projectId ? { projectId } : {}),\n };\n}\n","/**\n * Epistemic Answers API\n *\n * Answers are first-class L2 nodes in the epistemic spine.\n * Every answer is an immutable snapshot — new answers create new nodes,\n * old ones get `superseded`. This gives full version history and lets\n * answers have their own edges in the knowledge graph.\n *\n * Edge: Answer —responds_to→ Question\n * Edge: Answer —based_on→ Evidence (for each supporting evidence)\n * Edge: NewAnswer —supersedes→ OldAnswer (for versioning)\n *\n * @see /docs/epistemic-invariants/00-epistemic-invariants.md\n */\n// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\n\nimport { checkScopeAccess } from \"@lucern/access-control/access\";\nimport { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\nimport { v } from \"convex/values\";\nimport type { Id, MutationCtx, QueryCtx } from \"./convex\";\nimport { api, internal, internalMutation, mutation, query } from \"./convex\";\nimport { insertEpistemicNode } from \"./epistemicInsert.js\";\nimport { generateGlobalId } from \"./globalId\";\nimport { resolveScope, scopeArgs } from \"./scopeResolverCompat\";\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\ninterface AnswerNodeRow {\n _id: Id<\"epistemicNodes\">;\n canonicalText?: string;\n createdAt?: number;\n createdBy?: string;\n globalId: string;\n metadata?: Record<string, unknown>;\n nodeType?: string;\n projectId?: string;\n status?: string;\n supersededBy?: Id<\"epistemicNodes\">;\n topicId?: Id<\"topics\">;\n}\n\ninterface IndexQuery {\n eq(field: string, value: unknown): IndexQuery;\n}\n\ninterface FilterQuery {\n eq(left: unknown, right: unknown): unknown;\n field(name: string): unknown;\n or(...conditions: unknown[]): unknown;\n}\n\ninterface AnswerEdgeRow {\n fromNodeId: Id<\"epistemicNodes\">;\n}\n\ntype AnswerConfidence =\n | \"definitive\"\n | \"moderate\"\n | \"speculative\"\n | \"strong\"\n | \"weak\";\n\ninterface AnswerScopeArgs {\n projectId?: string;\n topicId?: string;\n}\n\ninterface CreateAnswerArgs extends AnswerScopeArgs {\n answerSource?: string;\n answerText: string;\n confidence?: AnswerConfidence;\n evidenceNodeIds?: Id<\"epistemicNodes\">[];\n questionNodeId: Id<\"epistemicNodes\">;\n sprintId?: string;\n userId: string;\n}\n\ninterface CreateInternalAnswerArgs extends AnswerScopeArgs {\n answerSource?: string;\n answerText: string;\n backfilledFromQuestionId?: string;\n confidence?: string;\n evidenceNodeIds?: Id<\"epistemicNodes\">[];\n questionNodeId: Id<\"epistemicNodes\">;\n sprintId?: string;\n userId: string;\n}\n\ninterface QuestionAnswerQueryArgs {\n includeSuperseded?: boolean;\n questionNodeId: Id<\"epistemicNodes\">;\n}\n\ninterface QuestionOnlyQueryArgs {\n questionNodeId: Id<\"epistemicNodes\">;\n}\n\ninterface BackfillAnswerNodesArgs extends AnswerScopeArgs {\n dryRun?: boolean;\n userId: string;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction readConvexId<TableName extends string>(\n value: unknown\n): Id<TableName> | undefined {\n return typeof value === \"string\" && value.trim().length > 0\n ? (value as Id<TableName>)\n : undefined;\n}\n\nfunction readOptionalNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value)\n ? value\n : undefined;\n}\n\nfunction readOptionalString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim().length > 0\n ? value\n : undefined;\n}\n\nfunction readRecord(value: unknown): Record<string, unknown> | undefined {\n return isRecord(value) ? value : undefined;\n}\n\nfunction readAnswerNodeRow(value: unknown): AnswerNodeRow | null {\n if (!isRecord(value)) {\n return null;\n }\n\n const id = readConvexId<\"epistemicNodes\">(value._id);\n const globalId = readOptionalString(value.globalId);\n if (!(id && globalId)) {\n return null;\n }\n\n const row: AnswerNodeRow = { _id: id, globalId };\n const canonicalText = readOptionalString(value.canonicalText);\n const createdAt = readOptionalNumber(value.createdAt);\n const createdBy = readOptionalString(value.createdBy);\n const metadata = readRecord(value.metadata);\n const nodeType = readOptionalString(value.nodeType);\n const projectId = readOptionalString(value.projectId);\n const status = readOptionalString(value.status);\n const supersededBy = readConvexId<\"epistemicNodes\">(value.supersededBy);\n const topicId = readConvexId<\"topics\">(value.topicId);\n\n if (canonicalText !== undefined) {\n row.canonicalText = canonicalText;\n }\n if (createdAt !== undefined) {\n row.createdAt = createdAt;\n }\n if (createdBy !== undefined) {\n row.createdBy = createdBy;\n }\n if (metadata !== undefined) {\n row.metadata = metadata;\n }\n if (nodeType !== undefined) {\n row.nodeType = nodeType;\n }\n if (projectId !== undefined) {\n row.projectId = projectId;\n }\n if (status !== undefined) {\n row.status = status;\n }\n if (supersededBy !== undefined) {\n row.supersededBy = supersededBy;\n }\n if (topicId !== undefined) {\n row.topicId = topicId;\n }\n\n return row;\n}\n\nfunction readAnswerEdgeRow(value: unknown): AnswerEdgeRow | null {\n if (!isRecord(value)) {\n return null;\n }\n\n const fromNodeId = readConvexId<\"epistemicNodes\">(value.fromNodeId);\n return fromNodeId ? { fromNodeId } : null;\n}\n\nfunction readRowList<T>(\n values: readonly unknown[],\n reader: (value: unknown) => T | null\n): T[] {\n return values.flatMap((value) => {\n const row = reader(value);\n return row ? [row] : [];\n });\n}\n\nfunction generateContentHash(text: string): string {\n const content = `answer:${text.trim().toLowerCase().replace(/\\s+/g, \" \").slice(0, 500)}`;\n let hash = 5381;\n for (let i = 0; i < content.length; i++) {\n // biome-ignore lint/suspicious/noBitwiseOperators: Preserve deterministic legacy hash used for persisted answer metadata compatibility.\n hash = (hash << 5) + hash + content.charCodeAt(i);\n // biome-ignore lint/suspicious/noBitwiseOperators: Preserve deterministic legacy hash used for persisted answer metadata compatibility.\n hash &= hash;\n }\n return Math.abs(hash).toString(16).padStart(8, \"0\");\n}\n\ninterface AnswerCreateMutationArgs {\n answerSource: string | undefined;\n answerText: string;\n backfilledFromQuestionId?: string;\n clearSupersededByBeforeInsert?: boolean;\n confidence: string | undefined;\n edgeTopicId: string;\n evidenceNodeIds: Id<\"epistemicNodes\">[] | undefined;\n questionNode: AnswerNodeRow;\n questionNodeId: Id<\"epistemicNodes\">;\n sprintId: string | undefined;\n topicId: string;\n userId: string;\n}\n\nasync function getActiveAnswersForQuestion(\n ctx: MutationCtx,\n questionNode: AnswerNodeRow,\n topicId: string,\n questionNodeId: Id<\"epistemicNodes\">\n): Promise<AnswerNodeRow[]> {\n const answers = readRowList(\n await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_topic_type\", (q: IndexQuery) =>\n q\n .eq(\"topicId\", questionNode.topicId ?? topicId)\n .eq(\"nodeType\", \"answer\")\n )\n .collect(),\n readAnswerNodeRow\n );\n\n return answers.filter((answerNode) => {\n const answerMeta = answerNode.metadata ?? {};\n return (\n answerMeta.questionNodeId === questionNodeId &&\n answerMeta.isLatest === true &&\n answerNode.status === \"active\"\n );\n });\n}\n\nfunction getNextAnswerVersion(activeAnswers: AnswerNodeRow[]): number {\n if (activeAnswers.length === 0) {\n return 1;\n }\n\n return (\n Math.max(\n ...activeAnswers.map((answerNode) => {\n const answerMeta = answerNode.metadata ?? {};\n return readOptionalNumber(answerMeta.versionNumber) ?? 0;\n })\n ) + 1\n );\n}\n\nasync function supersedeActiveAnswers(\n ctx: MutationCtx,\n activeAnswers: AnswerNodeRow[],\n now: number,\n clearSupersededByBeforeInsert: boolean\n): Promise<void> {\n for (const activeAnswer of activeAnswers) {\n const metadata = {\n ...activeAnswer.metadata,\n isLatest: false,\n };\n\n await ctx.db.patch(activeAnswer._id, {\n status: \"superseded\",\n updatedAt: now,\n metadata,\n ...(clearSupersededByBeforeInsert\n ? {\n supersededBy: undefined,\n }\n : {}),\n });\n }\n}\n\nasync function collectEvidenceGlobalIds(\n ctx: MutationCtx,\n evidenceNodeIds: Id<\"epistemicNodes\">[] | undefined\n): Promise<string[]> {\n const evidenceGlobalIds: string[] = [];\n if (!evidenceNodeIds) {\n return evidenceGlobalIds;\n }\n\n for (const evidenceNodeId of evidenceNodeIds) {\n const evidenceNode = readAnswerNodeRow(await ctx.db.get(evidenceNodeId));\n if (evidenceNode) {\n evidenceGlobalIds.push(evidenceNode.globalId);\n }\n }\n return evidenceGlobalIds;\n}\n\nfunction resolveAnswerSource(\n answerSource: string | undefined\n): \"human\" | \"ai_generated\" {\n return answerSource === \"human\" ? \"human\" : \"ai_generated\";\n}\n\nfunction insertAnswerNodeRecord(\n ctx: MutationCtx,\n args: {\n questionNode: AnswerNodeRow;\n topicId: string;\n answerText: string;\n contentHash: string;\n versionNumber: number;\n evidenceGlobalIds: string[];\n globalId: string;\n now: number;\n args: Pick<\n AnswerCreateMutationArgs,\n \"answerSource\" | \"sprintId\" | \"userId\" | \"backfilledFromQuestionId\"\n >;\n }\n): Promise<Id<\"epistemicNodes\">> {\n return insertEpistemicNode(ctx, {\n globalId: args.globalId,\n projectId: args.topicId,\n topicId: args.questionNode.topicId,\n nodeType: \"answer\",\n epistemicLayer: \"L2\",\n canonicalText: args.answerText,\n contentHash: args.contentHash,\n status: \"active\",\n sourceType: resolveAnswerSource(args.args.answerSource),\n createdBy: args.args.userId,\n createdAt: args.now,\n updatedAt: args.now,\n metadata: {\n questionGlobalId: args.questionNode.globalId,\n questionNodeId: String(args.questionNode._id),\n versionNumber: args.versionNumber,\n isLatest: true,\n evidenceGlobalIds: args.evidenceGlobalIds,\n evidenceCount: args.evidenceGlobalIds.length,\n answeredBy: args.args.userId,\n answerSource: args.args.answerSource || \"human\",\n sprintId: args.args.sprintId,\n ...(args.args.backfilledFromQuestionId\n ? {\n backfilledFromQuestionId: args.args.backfilledFromQuestionId,\n }\n : {}),\n },\n });\n}\n\nasync function setAnswerSupersession(\n ctx: MutationCtx,\n activeAnswers: AnswerNodeRow[],\n newNodeId: Id<\"epistemicNodes\">\n): Promise<void> {\n for (const activeAnswer of activeAnswers) {\n await ctx.db.patch(activeAnswer._id, {\n supersededBy: newNodeId,\n });\n }\n}\n\nasync function scheduleAnswerSyncJobs(\n ctx: MutationCtx,\n args: {\n nodeId: Id<\"epistemicNodes\">;\n topicId: string;\n answerText: string;\n questionNode: AnswerNodeRow;\n userId: string;\n }\n): Promise<void> {\n await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId: args.nodeId,\n operation: \"upsert\",\n });\n\n await ctx.scheduler.runAfter(\n 0,\n api.embeddingActions.generateEpistemicNodeEmbedding,\n {\n nodeId: args.nodeId,\n projectId: args.topicId,\n topicId: args.questionNode.topicId\n ? String(args.questionNode.topicId)\n : undefined,\n createdBy: args.userId,\n nodeType: \"answer\",\n text: args.answerText.slice(0, 20_000),\n }\n );\n\n await ctx.scheduler.runAfter(\n 0,\n internal.sprints.embedProjectThemeCollectiveInternal,\n {\n projectId: args.topicId,\n userId: args.userId,\n }\n );\n}\n\nasync function scheduleAnswerGraphEdges(\n ctx: MutationCtx,\n args: {\n questionNode: AnswerNodeRow;\n questionNodeId: Id<\"epistemicNodes\">;\n userId: string;\n evidenceNodeIds: Id<\"epistemicNodes\">[] | undefined;\n activeAnswers: AnswerNodeRow[];\n answerGlobalId: string;\n edgeTopicId: string;\n }\n): Promise<void> {\n // Responds-to edge.\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.createEdge, {\n globalId: generateGlobalId(),\n fromGlobalId: args.answerGlobalId,\n toGlobalId: args.questionNode.globalId,\n edgeType: \"responds_to\",\n weight: 1.0,\n createdBy: args.userId,\n topicId: args.edgeTopicId,\n fromNodeType: \"answer\",\n toNodeType: \"question\",\n fromLayer: \"L2\",\n toLayer: \"L3\",\n });\n\n // Supersedes edges.\n for (const activeAnswer of args.activeAnswers) {\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.createEdge, {\n globalId: generateGlobalId(),\n fromGlobalId: args.answerGlobalId,\n toGlobalId: activeAnswer.globalId,\n edgeType: \"supersedes\",\n createdBy: args.userId,\n topicId: args.edgeTopicId,\n fromNodeType: \"answer\",\n toNodeType: \"answer\",\n fromLayer: \"L2\",\n toLayer: \"L2\",\n });\n }\n\n // Evidence edges.\n if (args.evidenceNodeIds) {\n for (const evidenceNodeId of args.evidenceNodeIds) {\n const evidenceNode = readAnswerNodeRow(await ctx.db.get(evidenceNodeId));\n if (evidenceNode) {\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.createEdge, {\n globalId: generateGlobalId(),\n fromGlobalId: args.answerGlobalId,\n toGlobalId: evidenceNode.globalId,\n edgeType: \"derived_from\",\n createdBy: args.userId,\n topicId: args.edgeTopicId,\n fromNodeType: \"answer\",\n toNodeType: \"evidence\",\n fromLayer: \"L2\",\n toLayer: \"L2\",\n });\n }\n }\n }\n\n // Re-edge from question evidence nodes.\n const evidenceEdges = readRowList(\n await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_to_type\", (q: IndexQuery) =>\n q.eq(\"toNodeId\", args.questionNodeId).eq(\"edgeType\", \"derived_from\")\n )\n .collect(),\n readAnswerEdgeRow\n );\n\n for (const evidenceEdge of evidenceEdges) {\n const evidenceNode = readAnswerNodeRow(\n await ctx.db.get(evidenceEdge.fromNodeId)\n );\n if (!evidenceNode) {\n continue;\n }\n\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.createEdge, {\n globalId: generateGlobalId(),\n fromGlobalId: evidenceNode.globalId,\n toGlobalId: args.answerGlobalId,\n edgeType: \"derived_from\",\n createdBy: args.userId,\n topicId: args.edgeTopicId,\n fromNodeType: \"evidence\",\n toNodeType: \"answer\",\n fromLayer: \"L2\",\n toLayer: \"L2\",\n });\n }\n}\n\nasync function createAnswerMutationResult(\n ctx: MutationCtx,\n args: AnswerCreateMutationArgs\n): Promise<{\n nodeId: Id<\"epistemicNodes\">;\n globalId: string;\n versionNumber: number;\n}> {\n const now = Date.now();\n const answerText = args.answerText;\n const globalId = generateGlobalId();\n const contentHash = generateContentHash(answerText);\n const activeAnswers = await getActiveAnswersForQuestion(\n ctx,\n args.questionNode,\n args.topicId,\n args.questionNodeId\n );\n const versionNumber = getNextAnswerVersion(activeAnswers);\n\n await supersedeActiveAnswers(\n ctx,\n activeAnswers,\n now,\n !!args.clearSupersededByBeforeInsert\n );\n\n const evidenceGlobalIds = await collectEvidenceGlobalIds(\n ctx,\n args.evidenceNodeIds\n );\n\n const nodeId = await insertAnswerNodeRecord(ctx, {\n questionNode: args.questionNode,\n topicId: args.topicId,\n answerText,\n contentHash,\n versionNumber,\n evidenceGlobalIds,\n globalId,\n now,\n args: {\n answerSource: args.answerSource,\n sprintId: args.sprintId,\n userId: args.userId,\n backfilledFromQuestionId: args.backfilledFromQuestionId,\n },\n });\n\n await setAnswerSupersession(ctx, activeAnswers, nodeId);\n\n await scheduleAnswerSyncJobs(ctx, {\n nodeId,\n topicId: args.topicId,\n questionNode: args.questionNode,\n userId: args.userId,\n answerText,\n });\n\n await scheduleAnswerGraphEdges(ctx, {\n questionNode: args.questionNode,\n questionNodeId: args.questionNodeId,\n userId: args.userId,\n evidenceNodeIds: args.evidenceNodeIds,\n activeAnswers,\n answerGlobalId: globalId,\n edgeTopicId: args.edgeTopicId,\n });\n\n const answerQuality = args.confidence || \"moderate\";\n await ctx.db.patch(args.questionNodeId, {\n answerQuality,\n updatedAt: now,\n });\n\n const auditState = args.backfilledFromQuestionId\n ? {\n answerText: answerText.slice(0, 200),\n versionNumber,\n questionNodeId: String(args.questionNodeId),\n backfilled: true,\n }\n : {\n answerText: answerText.slice(0, 200),\n versionNumber,\n questionNodeId: String(args.questionNodeId),\n confidence: answerQuality,\n };\n\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"answer\",\n entityId: nodeId,\n changeType: \"created\",\n changedAt: now,\n changedBy: args.userId,\n isAgent: false,\n projectId: args.topicId,\n newState: auditState,\n });\n\n return { nodeId, globalId, versionNumber };\n}\n\n// =============================================================================\n// CREATE\n// =============================================================================\n\n/**\n * Create a new answer node for a question.\n *\n * 1. Validates the question exists\n * 2. Determines version number\n * 3. Supersedes previous active answer (if any)\n * 4. Creates the answer node\n * 5. Creates responds_to edge (Answer → Question)\n * 6. Creates supersedes edge (NewAnswer → OldAnswer) if versioning\n * 7. Creates based_on edges (Answer → Evidence) for each evidence node\n * 8. Updates question's answerQuality field\n * 9. Logs to epistemicAudit\n */\nexport const create = mutation({\n args: {\n ...scopeArgs,\n questionNodeId: v.id(\"epistemicNodes\"),\n answerText: v.string(),\n confidence: v.optional(\n v.union(\n v.literal(\"definitive\"),\n v.literal(\"strong\"),\n v.literal(\"moderate\"),\n v.literal(\"weak\"),\n v.literal(\"speculative\")\n )\n ),\n evidenceNodeIds: v.optional(v.array(v.id(\"epistemicNodes\"))),\n answerSource: v.optional(v.string()),\n sprintId: v.optional(v.string()),\n userId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx: MutationCtx, args: CreateAnswerArgs) => {\n const scope = await resolveScope(ctx, args);\n const topicId = scope?.topicId ? String(scope.topicId) : args.topicId || \"\";\n await checkScopeAccess(ctx, topicId, args.userId);\n\n // 1. Validate question exists\n const questionNode = readAnswerNodeRow(\n await ctx.db.get(args.questionNodeId)\n );\n if (questionNode?.nodeType !== \"question\") {\n throw new Error(\"Question node not found or not a question type\");\n }\n\n return createAnswerMutationResult(ctx, {\n questionNode,\n questionNodeId: args.questionNodeId,\n answerText: args.answerText,\n confidence: args.confidence,\n evidenceNodeIds: args.evidenceNodeIds,\n answerSource: args.answerSource,\n sprintId: args.sprintId,\n userId: args.userId,\n topicId,\n edgeTopicId: String(args.topicId ?? \"\"),\n clearSupersededByBeforeInsert: true,\n });\n },\n});\n\n// =============================================================================\n// CREATE INTERNAL (for scheduler / other modules)\n// =============================================================================\n\n/**\n * Internal mutation for creating answer nodes.\n * Called from epistemicQuestions.updateStatus when status === \"answered\".\n */\nexport const createInternal = internalMutation({\n args: {\n ...scopeArgs,\n questionNodeId: v.id(\"epistemicNodes\"),\n answerText: v.string(),\n confidence: v.optional(v.string()),\n evidenceNodeIds: v.optional(v.array(v.id(\"epistemicNodes\"))),\n answerSource: v.optional(v.string()),\n sprintId: v.optional(v.string()),\n userId: v.string(),\n backfilledFromQuestionId: v.optional(v.string()),\n },\n returns: permissiveReturn,\n handler: async (ctx: MutationCtx, args: CreateInternalAnswerArgs) => {\n const scope = await resolveScope(ctx, args);\n const topicId = scope?.topicId ? String(scope.topicId) : args.topicId || \"\";\n\n // Validate question exists\n const questionNode = readAnswerNodeRow(\n await ctx.db.get(args.questionNodeId)\n );\n if (questionNode?.nodeType !== \"question\") {\n throw new Error(\"Question node not found or not a question type\");\n }\n return createAnswerMutationResult(ctx, {\n questionNode,\n questionNodeId: args.questionNodeId,\n answerText: args.answerText,\n confidence: args.confidence,\n evidenceNodeIds: args.evidenceNodeIds,\n answerSource: args.answerSource,\n sprintId: args.sprintId,\n userId: args.userId,\n topicId,\n edgeTopicId: String(args.topicId ?? \"\"),\n backfilledFromQuestionId: args.backfilledFromQuestionId,\n });\n },\n});\n\n// =============================================================================\n// QUERIES\n// =============================================================================\n\n/**\n * Get all answers for a question, optionally including superseded.\n */\nexport const getByQuestion = query({\n args: {\n questionNodeId: v.id(\"epistemicNodes\"),\n includeSuperseded: v.optional(v.boolean()),\n },\n returns: permissiveReturn,\n handler: async (ctx: QueryCtx, args: QuestionAnswerQueryArgs) => {\n const questionNode = readAnswerNodeRow(\n await ctx.db.get(args.questionNodeId)\n );\n if (questionNode?.nodeType !== \"question\") {\n return [];\n }\n\n const topicId = questionNode.topicId;\n if (!topicId) {\n return [];\n }\n const answers = readRowList(\n await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_topic_type\", (q: IndexQuery) =>\n q.eq(\"topicId\", topicId).eq(\"nodeType\", \"answer\")\n )\n .collect(),\n readAnswerNodeRow\n );\n\n // Filter to answers for this question\n const questionIdStr = String(args.questionNodeId);\n const filtered = answers.filter((a) => {\n const meta = a.metadata ?? {};\n return meta.questionNodeId === questionIdStr;\n });\n\n if (!args.includeSuperseded) {\n return filtered.filter((a) => a.status === \"active\");\n }\n\n // Sort by version number (newest first)\n filtered.sort((a, b) => {\n const metaA = a.metadata ?? {};\n const metaB = b.metadata ?? {};\n return (\n (readOptionalNumber(metaB.versionNumber) ?? 0) -\n (readOptionalNumber(metaA.versionNumber) ?? 0)\n );\n });\n\n return filtered;\n },\n});\n\n/**\n * Get the single active (latest) answer for a question.\n */\nexport const getLatestForQuestion = query({\n args: {\n questionNodeId: v.id(\"epistemicNodes\"),\n },\n returns: permissiveReturn,\n handler: async (ctx: QueryCtx, args: QuestionOnlyQueryArgs) => {\n const questionNode = readAnswerNodeRow(\n await ctx.db.get(args.questionNodeId)\n );\n if (questionNode?.nodeType !== \"question\") {\n return null;\n }\n\n // Filter status === \"active\" at DB level to reduce JS-side work.\n // metadata.questionNodeId filtering must stay in JS (no index on metadata fields).\n const topicId = questionNode.topicId;\n if (!topicId) {\n return null;\n }\n const answers = readRowList(\n await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_topic_type\", (q: IndexQuery) =>\n q.eq(\"topicId\", topicId).eq(\"nodeType\", \"answer\")\n )\n .filter((q: FilterQuery) => q.eq(q.field(\"status\"), \"active\"))\n .collect(),\n readAnswerNodeRow\n );\n\n const questionIdStr = String(args.questionNodeId);\n const latest = answers.find((a) => {\n const meta = a.metadata ?? {};\n return meta.questionNodeId === questionIdStr && meta.isLatest === true;\n });\n\n return latest || null;\n },\n});\n\n/**\n * Get full version history for answers to a question.\n * Returns answers ordered by version number (newest first).\n */\nexport const getVersionHistory = query({\n args: {\n questionNodeId: v.id(\"epistemicNodes\"),\n },\n returns: permissiveReturn,\n handler: async (ctx: QueryCtx, args: QuestionOnlyQueryArgs) => {\n const questionNode = readAnswerNodeRow(\n await ctx.db.get(args.questionNodeId)\n );\n if (questionNode?.nodeType !== \"question\") {\n return [];\n }\n\n // Filter status at DB level; metadata.questionNodeId must filter in JS (no index on metadata).\n const topicId = questionNode.topicId;\n if (!topicId) {\n return [];\n }\n const answers = readRowList(\n await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_topic_type\", (q: IndexQuery) =>\n q.eq(\"topicId\", topicId).eq(\"nodeType\", \"answer\")\n )\n .filter((q: FilterQuery) =>\n q.or(\n q.eq(q.field(\"status\"), \"active\"),\n q.eq(q.field(\"status\"), \"superseded\")\n )\n )\n .collect(),\n readAnswerNodeRow\n );\n\n const questionIdStr = String(args.questionNodeId);\n const history = answers\n .filter((a) => {\n const meta = a.metadata ?? {};\n return meta.questionNodeId === questionIdStr;\n })\n .map((a) => {\n const meta = a.metadata ?? {};\n return {\n _id: a._id,\n globalId: a.globalId,\n answerText: a.canonicalText,\n versionNumber: readOptionalNumber(meta.versionNumber) ?? 1,\n isLatest: meta.isLatest === true,\n status: a.status,\n answeredBy: readOptionalString(meta.answeredBy) ?? a.createdBy,\n answerSource: readOptionalString(meta.answerSource),\n evidenceCount: readOptionalNumber(meta.evidenceCount) ?? 0,\n createdAt: a.createdAt,\n supersededBy: a.supersededBy,\n };\n })\n .sort((a, b) => b.versionNumber - a.versionNumber);\n\n return history;\n },\n});\n\n// =============================================================================\n// BACKFILL: Create answer nodes for questions that have answer text but no node\n// =============================================================================\n\n/**\n * Backfill answer nodes for questions that have answer text in metadata\n * but never had an answer node created (due to the QuestionAnswerEditor bug\n * where saveAnswer passed wrong params to updateStatus).\n *\n * Run once via Convex dashboard:\n * internal.epistemicAnswers.backfillAnswerNodes({ projectId, userId })\n */\nexport const backfillAnswerNodes = internalMutation({\n args: {\n ...scopeArgs,\n userId: v.string(),\n dryRun: v.optional(v.boolean()),\n },\n returns: permissiveReturn,\n handler: async (ctx: MutationCtx, args: BackfillAnswerNodesArgs) => {\n const scope = await resolveScope(ctx, args);\n const topicId = scope?.topicId ? String(scope.topicId) : args.topicId;\n const dryRun = args.dryRun ?? false;\n if (!topicId) {\n return {\n questionsWithAnswers: 0,\n alreadyHaveNodes: 0,\n needsBackfill: 0,\n backfilled: 0,\n };\n }\n\n // 1. Find all question nodes with answer text in metadata (TC-C: prefer topic)\n const questions = readRowList(\n await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_topic_type\", (q: IndexQuery) =>\n q.eq(\"topicId\", topicId).eq(\"nodeType\", \"question\")\n )\n .collect(),\n readAnswerNodeRow\n );\n\n const questionsWithAnswers = questions.filter((q) => {\n const meta = q.metadata ?? {};\n const answer = readOptionalString(meta.answer);\n return answer && answer.trim().length > 0;\n });\n\n // 2. Find all existing answer nodes (TC-C: use topic index since projectId is now topicId)\n const existingAnswers = readRowList(\n await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_topic_type\", (q: IndexQuery) =>\n q.eq(\"topicId\", topicId).eq(\"nodeType\", \"answer\")\n )\n .collect(),\n readAnswerNodeRow\n );\n\n // Build set of question IDs that already have answer nodes\n const questionIdsWithAnswerNodes = new Set(\n existingAnswers.map((a) => {\n const meta = a.metadata ?? {};\n return readOptionalString(meta.questionNodeId);\n })\n );\n\n // 3. Filter to questions that need backfill\n const needsBackfill = questionsWithAnswers.filter(\n (q) => !questionIdsWithAnswerNodes.has(String(q._id))\n );\n\n console.log(\n `[backfillAnswerNodes] Found ${questionsWithAnswers.length} questions with answers, ` +\n `${questionIdsWithAnswerNodes.size} already have answer nodes, ` +\n `${needsBackfill.length} need backfill. dryRun=${dryRun}`\n );\n\n if (dryRun) {\n return {\n questionsWithAnswers: questionsWithAnswers.length,\n alreadyHaveNodes: questionIdsWithAnswerNodes.size,\n needsBackfill: needsBackfill.length,\n questions: needsBackfill.map((q) => ({\n id: q._id,\n globalId: q.globalId,\n text: q.canonicalText?.slice(0, 80),\n answer: readOptionalString(q.metadata?.answer)?.slice(0, 80),\n })),\n };\n }\n\n // 4. Create answer nodes for each\n let created = 0;\n for (const question of needsBackfill) {\n const meta = question.metadata ?? {};\n const answerText = readOptionalString(meta.answer);\n if (!answerText) {\n continue;\n }\n const answeredBy = readOptionalString(meta.answeredBy);\n\n await ctx.scheduler.runAfter(\n 0,\n internal.epistemicAnswers.createInternal,\n {\n topicId: String(topicId), // TC-C: migrated from projectId\n questionNodeId: question._id,\n answerText,\n answerSource: answeredBy ? \"human\" : \"ai_generated\",\n userId: answeredBy ?? args.userId,\n backfilledFromQuestionId: String(question._id),\n }\n );\n created++;\n }\n\n return {\n questionsWithAnswers: questionsWithAnswers.length,\n alreadyHaveNodes: questionIdsWithAnswerNodes.size,\n backfilled: created,\n };\n },\n});\n"]}
@@ -444,7 +444,7 @@ function clampBeliefLimit(limit, fallback = DEFAULT_PROJECT_BELIEF_LIMIT) {
444
444
  );
445
445
  }
446
446
  async function resolveBeliefScopeOrNull(ctx, args) {
447
- if (!(args.projectId || args.topicId)) {
447
+ if (!args.topicId) {
448
448
  return null;
449
449
  }
450
450
  try {
@@ -876,7 +876,7 @@ var getByPillar = query({
876
876
  },
877
877
  returns: permissiveReturn,
878
878
  handler: async (ctx, args) => {
879
- if (!(args.projectId || args.topicId)) {
879
+ if (!args.topicId) {
880
880
  return [];
881
881
  }
882
882
  let scope;