@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
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/convex.ts","../src/debug.ts","../src/topicScope.ts","../src/epistemicQuestions.helpers.ts","../src/workflowBridge.ts","../src/epistemicQuestions.sprint.ts"],"names":["query","value","v"],"mappings":"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","file":"epistemicQuestions.sprint.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","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.\n/**\n * Epistemic Questions API\n *\n * Clean API for managing questions in the epistemic spine (epistemicNodes).\n * This is the NEW API that replaces questions.ts for CREATE operations.\n *\n * Key differences from questions.ts:\n * - Writes ONLY to epistemicNodes (no dual-write)\n * - Uses epistemicNodes IDs directly (no legacyQuestionId lookups)\n * - Syncs to Neo4j after mutations\n * - Follows Lucern invariants strictly\n *\n * @see /docs/epistemic-invariants/00-epistemic-invariants.md\n */\n\nimport type { Doc, Id, MutationCtx, QueryCtx } from \"./convex\";\nimport {\n internal,\n internalMutation,\n internalQuery,\n mutation,\n query,\n} from \"./convex\";\nimport {\n debugGraphPrimitiveFallback,\n formatGraphPrimitiveError,\n} from \"./debug\";\nimport { resolveGraphPrimitivesAppResolvers } from \"./resolvers\";\nimport { resolveTopicProjectScope } from \"./topicScope\";\n\nexport interface EpistemicIndexBuilder {\n eq(field: string, value: unknown): EpistemicIndexBuilder;\n}\n\nexport interface EpistemicTableQuery<T> {\n collect(): Promise<T[]>;\n first(): Promise<T | null>;\n order(direction: \"asc\" | \"desc\"): EpistemicTableQuery<T>;\n take(limit: number): Promise<T[]>;\n withIndex(\n indexName: string,\n builder: (q: EpistemicIndexBuilder) => EpistemicIndexBuilder\n ): EpistemicTableQuery<T>;\n}\n\nexport interface EpistemicMutationSpec<ArgsSpec> {\n args: ArgsSpec;\n handler: (ctx: MutationCtx, args: ArgsSpec) => unknown | Promise<unknown>;\n returns?: unknown;\n}\n\nexport interface EpistemicQuerySpec<ArgsSpec> {\n args: ArgsSpec;\n handler: (ctx: QueryCtx, args: ArgsSpec) => unknown | Promise<unknown>;\n returns?: unknown;\n}\n\nexport interface EpistemicDbReader {\n get<TableName extends string>(\n id: Id<TableName>\n ): Promise<Doc<TableName> | null>;\n query<TableName extends string>(\n table: TableName\n ): EpistemicTableQuery<Doc<TableName>>;\n}\n\nexport const defineEpistemicMutation = mutation as unknown as <Args>(\n spec: EpistemicMutationSpec<Args>\n) => ReturnType<typeof mutation>;\n\nexport const defineEpistemicQuery = query as unknown as <Args>(\n spec: EpistemicQuerySpec<Args>\n) => ReturnType<typeof query>;\n\nexport const defineEpistemicInternalMutation = internalMutation as unknown as <\n Args,\n>(\n spec: EpistemicMutationSpec<Args>\n) => ReturnType<typeof internalMutation>;\n\nexport const defineEpistemicInternalQuery = internalQuery as unknown as <Args>(\n spec: EpistemicQuerySpec<Args>\n) => ReturnType<typeof internalQuery>;\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\nexport function generateContentHash(text: string): string {\n const content = `question:${text.trim().toLowerCase().replace(/\\s+/g, \" \")}`;\n let hash = 5381;\n const maxSigned32Bit = 2_147_483_647;\n const uint32Size = 4_294_967_296;\n for (let i = 0; i < content.length; i++) {\n hash = Math.imul(hash, 33) + content.charCodeAt(i);\n hash %= uint32Size;\n if (hash > maxSigned32Bit) {\n hash -= uint32Size;\n }\n }\n return Math.abs(hash).toString(16).padStart(8, \"0\");\n}\n\nexport function buildTestsEdgeGlobalId(\n fromGlobalId: string,\n toGlobalId: string\n): string {\n return `edge-${fromGlobalId}-tests-${toGlobalId}`;\n}\n\nexport async function markProjectGraphDirty(\n ctx: QueryCtx | MutationCtx,\n projectId: string | undefined | null,\n topicId?: string | undefined | null\n): Promise<void> {\n const markCacheStaleByTopic =\n internal.graphAnalysisCache.markCacheStaleByTopic;\n const normalizedProjectId =\n typeof projectId === \"string\" && projectId.trim().length > 0\n ? projectId\n : undefined;\n const normalizedTopicId =\n typeof topicId === \"string\" && topicId.trim().length > 0\n ? topicId\n : undefined;\n\n if (!(normalizedProjectId || normalizedTopicId)) {\n return;\n }\n\n if (normalizedProjectId) {\n await ctx.scheduler.runAfter(\n 0,\n internal.graphAnalysisCache.markCacheStaleInternal,\n {\n projectId: normalizedProjectId,\n }\n );\n }\n if (normalizedTopicId) {\n await ctx.scheduler.runAfter(0, markCacheStaleByTopic, {\n topicId: normalizedTopicId,\n });\n }\n const resolvedProjectId = normalizedTopicId ?? normalizedProjectId;\n if (!resolvedProjectId) {\n return;\n }\n await resolveGraphPrimitivesAppResolvers(ctx).patchProject(\n ctx,\n resolvedProjectId,\n {\n lastActivityAt: Date.now(),\n }\n );\n}\n\n// Valid question categories (pillars)\nexport type ValidCategory =\n | \"market\"\n | \"competition\"\n | \"product\"\n | \"team\"\n | \"financials\"\n | \"deal\"\n | \"risks\"\n | \"other\";\n\nexport function normalizeCategory(category?: string): ValidCategory {\n if (!category) {\n return \"other\";\n }\n const lower = category.toLowerCase();\n // Handle \"financial\" → \"financials\" mapping\n if (lower === \"financial\") {\n return \"financials\";\n }\n const validCategories: ValidCategory[] = [\n \"market\",\n \"competition\",\n \"product\",\n \"team\",\n \"financials\",\n \"deal\",\n \"risks\",\n ];\n return (validCategories.find((c) => lower.includes(c)) ||\n \"other\") as ValidCategory;\n}\n\nexport type QuestionNodeDoc = Doc<\"epistemicNodes\"> & {\n anonymizationClass?: string;\n audienceLabel?: string;\n canonicalText?: string;\n createdAt?: number;\n createdBy?: string;\n epistemicLayer?: string;\n exportClass?: string;\n metadata?: Record<string, unknown>;\n nodeType?: string;\n policyTags?: string[];\n projectId?: string;\n publicationStatus?: string;\n questionType?: string;\n sensitivityTier?: string;\n status?: string;\n tenantId?: string;\n topicId?: string;\n updatedAt?: number;\n workspaceId?: string;\n};\nconst DEFAULT_QUESTION_PAGE_SIZE = 250;\nexport const MAX_QUESTION_PAGE_SIZE = 1000;\nexport interface QuestionScopeArgs {\n projectId?: string | null;\n topicId?: string | null;\n}\nexport function clampQuestionLimit(\n limit: number | undefined,\n fallback = DEFAULT_QUESTION_PAGE_SIZE\n): number {\n if (!Number.isFinite(limit)) {\n return fallback;\n }\n return Math.max(\n 1,\n Math.min(Math.floor(limit as number), MAX_QUESTION_PAGE_SIZE)\n );\n}\n\nexport function dedupeQuestionNodes(\n nodes: QuestionNodeDoc[]\n): QuestionNodeDoc[] {\n const seen = new Set<string>();\n const deduped: QuestionNodeDoc[] = [];\n for (const node of nodes) {\n const id = String(node._id);\n if (seen.has(id)) {\n continue;\n }\n seen.add(id);\n deduped.push(node);\n }\n return deduped;\n}\n\nexport function normalizeQuestionTopicId(\n topicId: string | undefined | null\n): string | undefined {\n return typeof topicId === \"string\" && topicId.trim().length > 0\n ? topicId\n : undefined;\n}\n\nexport function resolveQuestionScopeId(scope: {\n projectId?: string | undefined;\n topicId?: string | undefined;\n}): string | undefined {\n return (\n normalizeQuestionTopicId(scope.topicId) ?? scope.projectId ?? undefined\n );\n}\n\nexport function logQuestionFallback(\n message: string,\n error: unknown,\n context?: Record<string, unknown>\n): void {\n debugGraphPrimitiveFallback(message, {\n error: formatGraphPrimitiveError(error),\n ...(context ?? {}),\n });\n}\n\nexport async function resolveQuestionScopeOrNull(\n ctx: QueryCtx | MutationCtx,\n args: QuestionScopeArgs\n) {\n if (!(args.projectId || args.topicId)) {\n return null;\n }\n\n try {\n return await resolveTopicProjectScope(ctx, {\n projectId: args.projectId ?? undefined,\n topicId: args.topicId ?? undefined,\n });\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[epistemicQuestions] Failed to resolve question scope\",\n {\n error: formatGraphPrimitiveError(error),\n projectId: args.projectId,\n topicId: args.topicId,\n }\n );\n return null;\n }\n}\n\nexport async function getQuestionNodesForScope(\n ctx: QueryCtx | MutationCtx,\n scope: Awaited<ReturnType<typeof resolveTopicProjectScope>>,\n args?: { scanLimit?: number }\n): Promise<QuestionNodeDoc[]> {\n const fetchNodes = (query: EpistemicTableQuery<QuestionNodeDoc>) =>\n typeof args?.scanLimit === \"number\"\n ? query.order(\"desc\").take(args.scanLimit)\n : query.collect();\n\n const topicNodes = await fetchNodes(\n ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_topic_type\", (q: EpistemicIndexBuilder) =>\n q.eq(\"topicId\", scope.topicId).eq(\"nodeType\", \"question\")\n )\n );\n\n return dedupeQuestionNodes(topicNodes).filter((node) =>\n questionMatchesScope(node, scope)\n );\n}\n\nexport async function getQuestionEdgesForScope(\n ctx: QueryCtx | MutationCtx,\n scope: Awaited<ReturnType<typeof resolveTopicProjectScope>>\n) {\n const query = ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_topic\", (q: EpistemicIndexBuilder) =>\n q.eq(\"topicId\", scope.topicId || scope.projectId)\n );\n\n return await query.collect();\n}\n\nexport function questionMatchesScope(\n node: Pick<QuestionNodeDoc, \"topicId\" | \"projectId\">,\n scope: Awaited<ReturnType<typeof resolveTopicProjectScope>>\n): boolean {\n return (\n (scope.topicId !== undefined && node.topicId === scope.topicId) ||\n (scope.projectId !== undefined && node.projectId === scope.projectId)\n );\n}\n\nexport function resolveLinkedWorktreeId(\n meta: Record<string, unknown>\n): string | null {\n const linkedWorktreeId = meta.linkedWorktreeId;\n return typeof linkedWorktreeId === \"string\" && linkedWorktreeId.trim()\n ? linkedWorktreeId\n : null;\n}\n\nexport function buildLinkedWorktreeMetadata(\n linkedWorktreeId: string | null | undefined\n): Record<string, string> {\n return linkedWorktreeId\n ? {\n linkedWorktreeId,\n }\n : {};\n}\n\nexport function questionMatchesWorkflowLink(\n meta: Record<string, unknown>,\n workflow: {\n worktreeId?: string | null;\n sprintId?: string | null;\n }\n): boolean {\n const linkedWorktreeId = resolveLinkedWorktreeId(meta);\n return Boolean(\n linkedWorktreeId &&\n (linkedWorktreeId === workflow.worktreeId ||\n linkedWorktreeId === workflow.sprintId)\n );\n}\n\nexport function flattenQuestionNode(n: QuestionNodeDoc) {\n const meta = (n.metadata || {}) as Record<string, unknown>;\n const linkedWorktreeId = resolveLinkedWorktreeId(meta);\n return {\n ...n,\n question: n.canonicalText || \"\",\n category: (meta.category as string) || \"other\",\n priority: (meta.priority as string) || \"medium\",\n status:\n (meta.questionStatus as string) || (meta.status as string) || \"open\",\n beliefId: meta.linkedBeliefNodeId || meta.beliefId || null,\n relatedBeliefIds: (meta.relatedBeliefIds as string[]) || [],\n relatedInsightIds: (meta.relatedInsightIds as string[]) || [],\n linkedWorktreeId,\n sprintIndex: (meta.sprintIndex as number) || undefined,\n linkedBeliefId: meta.linkedBeliefNodeId || null,\n testType: (meta.testType as string) || \"validates\",\n importance: (meta.importance as number) || 5,\n isKeyQuestion: Boolean(meta.isKeyQuestion),\n answer: (meta.answer as string) || null,\n convictionStage: (meta.convictionStage as string) || null,\n conviction: meta.conviction ?? null,\n source: (meta.source as string) || \"ai_suggested\",\n };\n}\n\nexport function flattenInternalQuestionNode(n: QuestionNodeDoc) {\n const meta = (n.metadata || {}) as Record<string, unknown>;\n const flattened = flattenQuestionNode(n);\n return {\n ...flattened,\n _epistemicNodeId: n._id,\n questionType:\n n.questionType || (meta.questionType as string) || flattened.testType,\n linkedBeliefIds: flattened.relatedBeliefIds,\n audienceLabel: n.audienceLabel,\n policyTags: n.policyTags,\n sensitivityTier: n.sensitivityTier,\n exportClass: n.exportClass,\n anonymizationClass: n.anonymizationClass,\n };\n}\n\nconst INACTIVE_NODE_STATUSES = new Set([\"archived\", \"superseded\", \"deleted\"]);\n\nconst INACTIVE_METADATA_STATUSES = new Set([\n \"archived\",\n \"superseded\",\n \"deleted\",\n]);\n\nfunction getQuestionStatusCandidates(node: QuestionNodeDoc): string[] {\n const meta = (node.metadata || {}) as Record<string, unknown>;\n return [meta.questionStatus, meta.status, node.status].filter(\n (value): value is string => typeof value === \"string\"\n );\n}\n\nexport function isActiveQuestionNode(node: QuestionNodeDoc): boolean {\n if (\n typeof node.status === \"string\" &&\n INACTIVE_NODE_STATUSES.has(node.status)\n ) {\n return false;\n }\n return !getQuestionStatusCandidates(node).some((status) =>\n INACTIVE_METADATA_STATUSES.has(status.toLowerCase())\n );\n}\n\nexport function matchesRequestedQuestionStatus(\n node: QuestionNodeDoc,\n requestedStatus: string\n): boolean {\n const normalizedStatus = requestedStatus.toLowerCase();\n return getQuestionStatusCandidates(node).some(\n (status) => status.toLowerCase() === normalizedStatus\n );\n}\n\n// =============================================================================\n// CREATE\n// =============================================================================\n\n/**\n * Create a new question in the epistemic spine.\n * Returns the epistemicNodes ID directly (not a questions ID).\n */\n","// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\nimport { resolveTopicProjectScope } from \"./topicScope\";\n\ntype UnknownRecord = Record<string, unknown>;\n\ninterface WorkflowBridgeQueryScope {\n eq(field: string, value: unknown): WorkflowBridgeQueryScope;\n}\n\ninterface WorkflowBridgeQuery<T> {\n collect(): Promise<T[]>;\n filter(\n predicate: (query: WorkflowBridgeQueryScope) => unknown\n ): WorkflowBridgeQuery<T>;\n first(): Promise<T | null>;\n order(direction: \"asc\" | \"desc\"): WorkflowBridgeQuery<T>;\n withIndex(\n indexName: string,\n range?: (q: WorkflowBridgeQueryScope) => unknown\n ): WorkflowBridgeQuery<T>;\n}\n\ninterface WorkflowBridgeContext {\n db: {\n get(id: string): Promise<unknown | null>;\n query(tableName: string): WorkflowBridgeQuery<unknown>;\n };\n}\n\nexport interface WorkflowLikeDoc {\n _id?: string;\n metadata?: Record<string, unknown>;\n projectId?: string;\n topicId?: string;\n [key: string]: unknown;\n}\n\nexport interface WorkflowBridgeResolution {\n inputId: string | null;\n projectId?: string;\n sprint: WorkflowLikeDoc | null;\n sprintId: string | null;\n topicId?: string;\n worktree: WorkflowLikeDoc | null;\n worktreeId: string | null;\n}\n\nexport function isLegacySprintDoc(doc: unknown): doc is WorkflowLikeDoc {\n if (!doc || typeof doc !== \"object\") {\n return false;\n }\n\n const metadata =\n typeof (doc as UnknownRecord).metadata === \"object\" &&\n (doc as UnknownRecord).metadata !== null\n ? ((doc as UnknownRecord).metadata as UnknownRecord)\n : undefined;\n\n if (metadata?.pairedSprintId) {\n return false;\n }\n\n return (\n \"sprintScope\" in doc ||\n \"targetPillar\" in doc ||\n \"pillarThesis\" in doc ||\n \"synthesisState\" in doc ||\n (\"projectId\" in doc && !(\"worktreeScope\" in doc))\n );\n}\n\nexport function isWorktreeDoc(doc: unknown): doc is WorkflowLikeDoc {\n if (!doc || typeof doc !== \"object\") {\n return false;\n }\n\n return (\n \"worktreeScope\" in doc ||\n \"targetBranch\" in doc ||\n \"campaign\" in doc ||\n \"executionBand\" in doc ||\n \"proofArtifacts\" in doc\n );\n}\n\nexport function getPairedSprintId(doc: WorkflowLikeDoc | null | undefined) {\n const pairedSprintId = doc?.metadata?.pairedSprintId;\n return typeof pairedSprintId === \"string\" && pairedSprintId.trim().length > 0\n ? pairedSprintId\n : null;\n}\n\nfunction getStringField(\n doc: WorkflowLikeDoc | null | undefined,\n field: \"topicId\" | \"projectId\"\n) {\n const value = doc?.[field];\n return typeof value === \"string\" && value.trim().length > 0\n ? value\n : undefined;\n}\n\nasync function findPairedWorktreeForSprint(\n ctx: WorkflowBridgeContext,\n sprint: WorkflowLikeDoc\n): Promise<WorkflowLikeDoc | null> {\n const sprintId =\n typeof sprint._id === \"string\" && sprint._id.length > 0 ? sprint._id : null;\n if (!sprintId || typeof ctx.db.query !== \"function\") {\n return null;\n }\n\n let topicId = getStringField(sprint, \"topicId\");\n if (!topicId) {\n try {\n const scope = await resolveTopicProjectScope(ctx, {\n topicId: getStringField(sprint, \"topicId\"),\n projectId: getStringField(sprint, \"projectId\"),\n });\n topicId = scope.topicId;\n } catch {\n topicId = undefined;\n }\n }\n\n if (!topicId) {\n return null;\n }\n\n const worktrees = await ctx.db\n .query(\"worktrees\")\n .withIndex(\"by_topicId\", (q) => q.eq(\"topicId\", topicId))\n .collect();\n\n return (\n worktrees.find(\n (worktree): worktree is WorkflowLikeDoc =>\n isWorktreeDoc(worktree) &&\n String(worktree.metadata?.pairedSprintId || \"\") === sprintId\n ) ?? null\n );\n}\n\nexport async function resolveWorkflowBridgeDoc(\n ctx: WorkflowBridgeContext,\n workflowId: string | null | undefined\n): Promise<WorkflowBridgeResolution> {\n const empty: WorkflowBridgeResolution = {\n inputId: workflowId ?? null,\n sprint: null,\n worktree: null,\n sprintId: null,\n worktreeId: null,\n };\n\n if (!workflowId) {\n return empty;\n }\n\n let doc: unknown;\n try {\n doc = await ctx.db.get(workflowId);\n } catch {\n return empty;\n }\n\n if (!doc || typeof doc !== \"object\") {\n return empty;\n }\n\n if (isLegacySprintDoc(doc)) {\n return await resolveLegacySprintBridge(ctx, empty, doc, workflowId);\n }\n\n return await resolveWorktreeBridge(ctx, empty, doc, workflowId);\n}\n\nasync function resolveLegacySprintBridge(\n ctx: WorkflowBridgeContext,\n empty: WorkflowBridgeResolution,\n sprint: WorkflowLikeDoc,\n workflowId: string\n): Promise<WorkflowBridgeResolution> {\n const worktree = await findPairedWorktreeForSprint(ctx, sprint);\n return {\n ...empty,\n sprint,\n worktree,\n sprintId: getDocumentIdOrFallback(sprint, workflowId),\n worktreeId: getDocumentIdOrFallback(worktree, null),\n topicId:\n getStringField(worktree, \"topicId\") ?? getStringField(sprint, \"topicId\"),\n projectId:\n getStringField(sprint, \"projectId\") ??\n getStringField(worktree, \"projectId\"),\n };\n}\n\nasync function resolveWorktreeBridge(\n ctx: WorkflowBridgeContext,\n empty: WorkflowBridgeResolution,\n doc: object,\n workflowId: string\n): Promise<WorkflowBridgeResolution> {\n const worktree = doc as WorkflowLikeDoc;\n const pairedSprintId = getPairedSprintId(worktree);\n const sprint = await readPairedSprint(ctx, pairedSprintId);\n\n return {\n ...empty,\n worktree,\n sprint,\n worktreeId: getDocumentIdOrFallback(worktree, workflowId),\n sprintId: getDocumentIdOrFallback(sprint, pairedSprintId),\n topicId:\n getStringField(worktree, \"topicId\") ?? getStringField(sprint, \"topicId\"),\n projectId:\n getStringField(sprint, \"projectId\") ??\n getStringField(worktree, \"projectId\"),\n };\n}\n\nasync function readPairedSprint(\n ctx: WorkflowBridgeContext,\n pairedSprintId: string | null\n): Promise<WorkflowLikeDoc | null> {\n if (!pairedSprintId) {\n return null;\n }\n try {\n const paired = await ctx.db.get(pairedSprintId);\n return isLegacySprintDoc(paired) ? paired : null;\n } catch {\n return null;\n }\n}\n\nfunction getDocumentIdOrFallback(\n doc: WorkflowLikeDoc | null | undefined,\n fallback: string | null\n): string | null {\n return typeof doc?._id === \"string\" && doc._id.length > 0\n ? doc._id\n : fallback;\n}\n","// biome-ignore-all lint/style/useFilenamingConvention: Public ABI surface; rename requires a cross-package migration update.\n/**\n * Epistemic Questions API\n *\n * Clean API for managing questions in the epistemic spine (epistemicNodes).\n * This is the NEW API that replaces questions.ts for CREATE operations.\n *\n * Key differences from questions.ts:\n * - Writes ONLY to epistemicNodes (no dual-write)\n * - Uses epistemicNodes IDs directly (no legacyQuestionId lookups)\n * - Syncs to Neo4j after mutations\n * - Follows Lucern invariants strictly\n *\n * @see /docs/epistemic-invariants/00-epistemic-invariants.md\n */\n\nimport { checkScopeAccess } from \"@lucern/access-control/access\";\nimport { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\nimport { v } from \"convex/values\";\nimport type { Id, QueryCtx } from \"./convex\";\nimport { query } from \"./convex\";\nimport {\n debugGraphPrimitiveFallback,\n formatGraphPrimitiveError,\n} from \"./debug\";\n// =============================================================================\n// HELPERS\nimport {\n getQuestionEdgesForScope,\n getQuestionNodesForScope,\n questionMatchesWorkflowLink,\n resolveLinkedWorktreeId,\n resolveQuestionScopeId,\n resolveQuestionScopeOrNull,\n} from \"./epistemicQuestions.helpers\";\nimport { resolveWorkflowBridgeDoc } from \"./workflowBridge\";\n\ntype UnknownRecord = Record<string, unknown>;\ninterface EdgeRef {\n fromNodeId?: string;\n toNodeId?: string;\n}\n\ninterface GetQuestionsForWorkflowArgs {\n sprintId?: string;\n userId: string;\n worktreeId?: string;\n}\n\ninterface QuestionNodeRow {\n _creationTime: number;\n _id: Id<\"epistemicNodes\">;\n canonicalText?: string;\n content?: string;\n createdAt?: number;\n createdBy?: string;\n metadata: UnknownRecord;\n nodeType?: string;\n projectId?: string;\n questionType?: string;\n sourceType?: string;\n status?: string;\n text?: string;\n title?: string;\n topicId?: string;\n updatedAt?: number;\n}\n\ninterface QuestionEvidenceLinkRow {\n _creationTime: number;\n _id: Id<\"questionEvidenceLinks\">;\n createdAt: number;\n createdBy: string;\n helpsAnswer: boolean;\n insightId: Id<\"epistemicNodes\">;\n questionId: Id<\"epistemicNodes\">;\n rationale: string;\n relevance: number;\n}\n\ninterface LinkedBeliefDetail {\n beliefId: string | Id<\"epistemicNodes\">;\n beliefText: string;\n isConditional: boolean;\n isHypothesis: boolean;\n isPrimaryTarget: boolean;\n isRaw: boolean;\n}\n\ninterface ClusterEnrichedQuestion {\n _creationTime: number;\n _id: Id<\"epistemicNodes\">;\n answer: string | null;\n beliefId: string | null;\n canonicalText?: string;\n category: string;\n conviction: number | null;\n convictionStage: string | null;\n isKeyQuestion: boolean;\n linkedBeliefs: (LinkedBeliefDetail | null)[];\n linkedWorktreeId: string | null;\n metadata: Record<string, unknown> | undefined;\n priority: string;\n projectId?: string;\n question?: string;\n questionType: string;\n relatedBeliefIds: string[];\n status: string;\n testLogic: string;\n testRationale: string | null;\n testType: string;\n topicId?: string | null;\n}\n\ninterface InConvictionQuestionEvidence {\n _id?: Id<\"questionEvidenceLinks\">;\n createdAt: number;\n createdBy: string;\n helpsAnswer: boolean;\n insightId: Id<\"epistemicNodes\">;\n insightSource: string;\n insightText: string;\n questionId: Id<\"epistemicNodes\">;\n rationale: string;\n relevance: number;\n}\n\ninterface InConvictionQuestion {\n _creationTime: number;\n _id: Id<\"epistemicNodes\">;\n answer: string | undefined;\n answerCompleteness: string | undefined;\n answerStatus: string | undefined;\n beliefId: string | null;\n canonicalText?: string;\n category: string;\n conviction: number | undefined;\n convictionAdvancedAt: number | undefined;\n convictionAdvancedBy: string | undefined;\n convictionRationale: string | undefined;\n convictionStage: string;\n convictionUpdatedAt: number | undefined;\n convictionUpdatedBy: string | undefined;\n createdAt?: number;\n createdBy?: string;\n evidence: InConvictionQuestionEvidence[];\n evidenceCount: number;\n importance: number | undefined;\n isKeyQuestion: boolean;\n linkedBeliefId: string | undefined;\n linkedWorktreeId: string | undefined;\n metadata?: Record<string, unknown> | null;\n priority: string;\n projectId?: string;\n question?: string;\n questionType: string;\n relatedBeliefIds: string[];\n status: string;\n testedBeliefs: (UnknownRecord | null)[];\n testType: string | undefined;\n updatedAt?: number;\n whatWeNeed: string | undefined;\n}\n\nfunction collectLinkedBeliefNodeIds(\n questionNodeId: Id<\"epistemicNodes\">,\n edges: EdgeRef[],\n currentMeta: UnknownRecord\n): string[] {\n const questionId = String(questionNodeId);\n const beliefNodeIds = new Set<string>();\n const primaryBeliefId = readOptionalString(currentMeta.linkedBeliefNodeId);\n if (primaryBeliefId) {\n beliefNodeIds.add(primaryBeliefId);\n }\n\n for (const edge of edges) {\n const fromNodeId = edge.fromNodeId ?? \"\";\n const toNodeId = edge.toNodeId ?? \"\";\n\n if (fromNodeId === questionId && toNodeId) {\n beliefNodeIds.add(toNodeId);\n }\n if (toNodeId === questionId && fromNodeId) {\n beliefNodeIds.add(fromNodeId);\n }\n }\n beliefNodeIds.delete(\"\");\n return Array.from(beliefNodeIds);\n}\n\nasync function collectClusterLinkedBeliefs(\n ctx: QueryCtx,\n linkedBeliefNodeIds: string[],\n clusterBeliefIds: Set<string>,\n hypothesisIds: Set<string>,\n rawBeliefIds: Set<string>\n): Promise<LinkedBeliefDetail[]> {\n const linkedBeliefs = await Promise.all(\n linkedBeliefNodeIds.map(async (beliefNodeId) => {\n const nodeId = readConvexId<\"epistemicNodes\">(beliefNodeId);\n const node = nodeId\n ? readQuestionNodeRow(await ctx.db.get(nodeId))\n : null;\n if (node?.nodeType !== \"belief\") {\n return null;\n }\n return {\n beliefId: node._id,\n beliefText: node.canonicalText ?? \"\",\n isHypothesis: hypothesisIds.has(beliefNodeId),\n isConditional:\n !(\n hypothesisIds.has(beliefNodeId) || rawBeliefIds.has(beliefNodeId)\n ) && clusterBeliefIds.has(beliefNodeId),\n isRaw: rawBeliefIds.has(beliefNodeId),\n isPrimaryTarget: hypothesisIds.has(beliefNodeId),\n };\n })\n );\n return linkedBeliefs.filter(\n (belief) => belief !== null\n ) as LinkedBeliefDetail[];\n}\n\nasync function enrichSprintClusterQuestion(\n ctx: QueryCtx,\n question: QuestionNodeRow,\n edges: EdgeRef[],\n hypothesisIds: Set<string>,\n rawBeliefIds: Set<string>,\n clusterBeliefIds: Set<string>\n): Promise<ClusterEnrichedQuestion> {\n const meta = question.metadata;\n const linkedBeliefNodeIds = collectLinkedBeliefNodeIds(\n question._id,\n edges,\n meta\n );\n const linkedBeliefs = await collectClusterLinkedBeliefs(\n ctx,\n linkedBeliefNodeIds,\n clusterBeliefIds,\n hypothesisIds,\n rawBeliefIds\n );\n\n const questionText = question.canonicalText;\n const payload: ClusterEnrichedQuestion = {\n _id: question._id,\n _creationTime: question._creationTime,\n questionType:\n question.questionType ??\n readOptionalString(meta.questionType) ??\n \"general\",\n category: readOptionalString(meta.category) ?? \"other\",\n priority: readOptionalString(meta.priority) ?? \"medium\",\n isKeyQuestion:\n typeof meta.isKeyQuestion === \"boolean\" ? meta.isKeyQuestion : false,\n testType: readOptionalString(meta.testType) ?? \"validates\",\n status: question.status ?? \"active\",\n testLogic: readOptionalString(meta.testType) ?? \"validates\",\n testRationale: readOptionalString(meta.rationale) ?? null,\n beliefId: readOptionalString(meta.linkedBeliefNodeId) ?? null,\n relatedBeliefIds: linkedBeliefNodeIds,\n // Conviction stage fields — needed by UI to show/hide action buttons\n convictionStage: readOptionalString(meta.convictionStage) ?? null,\n answer: readOptionalString(meta.answer) ?? null,\n conviction: readFiniteNumber(meta.conviction) ?? null,\n linkedWorktreeId: resolveLinkedWorktreeId(meta),\n linkedBeliefs,\n metadata: question.metadata,\n };\n if (question.projectId) {\n payload.projectId = question.projectId;\n }\n if (question.topicId) {\n payload.topicId = question.topicId;\n }\n if (questionText) {\n payload.canonicalText = questionText;\n payload.question = questionText; // legacy field name\n }\n return payload;\n}\n\nfunction collectSprintBeliefIds(\n sprintSynthesis: UnknownRecord,\n workflow: { worktree?: UnknownRecord | null; sprint?: UnknownRecord | null }\n): Set<string> {\n return new Set([\n ...toStringList(sprintSynthesis.synthesizedBeliefIds),\n ...(\n ((workflow.worktree?.targetBeliefIds as unknown[]) ||\n (workflow.sprint?.targetBeliefIds as unknown[]) ||\n []) as unknown[]\n ).map(String),\n ]);\n}\n\nfunction collectInConvictionQuestionBeliefIds(meta: UnknownRecord): string[] {\n const beliefIds = new Set<string>();\n const relatedIds = toStringList(meta.relatedBeliefIds);\n if (meta.linkedBeliefNodeId) {\n beliefIds.add(String(meta.linkedBeliefNodeId));\n }\n if (meta.linkedBeliefId) {\n beliefIds.add(String(meta.linkedBeliefId));\n }\n if (meta.beliefId) {\n beliefIds.add(String(meta.beliefId));\n }\n for (const beliefId of relatedIds) {\n beliefIds.add(String(beliefId));\n }\n return Array.from(beliefIds);\n}\n\nasync function collectQuestionEvidenceDetails(\n ctx: QueryCtx,\n q: QuestionNodeRow\n): Promise<InConvictionQuestionEvidence[]> {\n const evidenceLinks = await ctx.db\n .query(\"questionEvidenceLinks\")\n .withIndex(\"by_questionId\", (qb) => qb.eq(\"questionId\", q._id))\n .collect();\n\n const evidenceDetails: InConvictionQuestionEvidence[] = [];\n for (const rawLink of evidenceLinks) {\n const link = readQuestionEvidenceLinkRow(rawLink);\n if (!link) {\n continue;\n }\n const insight = readQuestionNodeRow(await ctx.db.get(link.insightId));\n evidenceDetails.push({\n ...link,\n insightText: getNodeText(insight),\n insightSource: getInsightSource(insight),\n });\n }\n return evidenceDetails;\n}\n\nasync function collectQuestionBeliefDetails(\n ctx: QueryCtx,\n beliefIds: string[]\n): Promise<UnknownRecord[]> {\n const beliefDetails = await Promise.all(\n beliefIds.map(async (beliefId) => {\n try {\n const nodeId = readConvexId<\"epistemicNodes\">(beliefId);\n const node = nodeId\n ? readQuestionNodeRow(await ctx.db.get(nodeId))\n : null;\n if (node && node.nodeType === \"belief\") {\n return {\n _id: node._id,\n belief: node.canonicalText ?? \"\",\n confidence: toRecord(node.metadata).confidence,\n pillar: readStringValue(toRecord(node.metadata), \"category\"),\n beliefType: node.status ?? \"active\",\n dependsOnCount: 0,\n cascadesToCount: 0,\n exclusiveWithCount: 0,\n };\n }\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[epistemicQuestions] Failed to hydrate linked belief\",\n {\n error: formatGraphPrimitiveError(error),\n beliefId,\n }\n );\n }\n return null;\n })\n );\n\n return beliefDetails.filter(Boolean) as UnknownRecord[];\n}\n\nfunction buildInConvictionQuestionPayload(\n question: QuestionNodeRow,\n meta: UnknownRecord,\n evidenceWithDetails: InConvictionQuestionEvidence[],\n testedBeliefs: UnknownRecord[]\n): InConvictionQuestion {\n const relatedBeliefIds = toStringList(meta.relatedBeliefIds);\n const convictionStage =\n readOptionalString(meta.convictionStage) ?? \"in_conviction\";\n const payload: InConvictionQuestion = {\n _id: question._id,\n _creationTime: question._creationTime,\n category: readOptionalString(meta.category) ?? \"other\",\n priority: readOptionalString(meta.priority) ?? \"medium\",\n status:\n readOptionalString(meta.questionStatus) ?? question.status ?? \"open\",\n questionType:\n question.questionType ??\n readOptionalString(meta.questionType) ??\n \"general\",\n testType: readOptionalString(meta.testType),\n importance: readFiniteNumber(meta.importance),\n isKeyQuestion:\n typeof meta.isKeyQuestion === \"boolean\" ? meta.isKeyQuestion : false,\n conviction: readFiniteNumber(meta.conviction),\n convictionStage,\n convictionRationale: readOptionalString(meta.convictionRationale),\n convictionAdvancedAt: readFiniteNumber(meta.convictionAdvancedAt),\n convictionAdvancedBy: readOptionalString(meta.convictionAdvancedBy),\n convictionUpdatedAt: readFiniteNumber(meta.convictionUpdatedAt),\n convictionUpdatedBy: readOptionalString(meta.convictionUpdatedBy),\n answer: readOptionalString(meta.answer),\n answerStatus: readOptionalString(meta.answerStatus),\n answerCompleteness: readOptionalString(meta.answerCompleteness),\n whatWeNeed: readOptionalString(meta.whatWeNeed),\n linkedWorktreeId: resolveLinkedWorktreeId(meta) || undefined,\n beliefId:\n readOptionalString(meta.linkedBeliefNodeId) ??\n readOptionalString(meta.beliefId) ??\n null,\n linkedBeliefId:\n readOptionalString(meta.linkedBeliefNodeId) ??\n readOptionalString(meta.linkedBeliefId),\n relatedBeliefIds,\n evidenceCount: evidenceWithDetails.length,\n evidence: evidenceWithDetails,\n testedBeliefs,\n metadata: question.metadata,\n };\n if (question.projectId) {\n payload.projectId = question.projectId;\n }\n if (question.canonicalText) {\n payload.question = question.canonicalText;\n payload.canonicalText = question.canonicalText;\n }\n if (question.createdAt !== undefined) {\n payload.createdAt = question.createdAt;\n }\n if (question.createdBy) {\n payload.createdBy = question.createdBy;\n }\n if (question.updatedAt !== undefined) {\n payload.updatedAt = question.updatedAt;\n }\n return payload;\n}\n\nfunction toRecord(value: unknown): UnknownRecord {\n if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\n return value as UnknownRecord;\n }\n return {};\n}\n\nfunction readOptionalString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim().length > 0\n ? value\n : undefined;\n}\n\nfunction readConvexId<TableName extends string>(\n value: unknown\n): Id<TableName> | null {\n const normalized = readOptionalString(value);\n return normalized ? (normalized as Id<TableName>) : null;\n}\n\nfunction readFiniteNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value)\n ? value\n : undefined;\n}\n\nfunction readStringValue(\n source: UnknownRecord,\n key: string\n): string | undefined {\n const value = source[key];\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction toStringList(value: unknown): string[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value\n .map((entry) => readOptionalString(entry))\n .filter((entry): entry is string => entry !== undefined);\n}\n\nfunction readQuestionNodeRow(value: unknown): QuestionNodeRow | null {\n const record = toRecord(value);\n const id = readConvexId<\"epistemicNodes\">(record._id);\n const creationTime = readFiniteNumber(record._creationTime);\n if (!(id && creationTime !== undefined)) {\n return null;\n }\n\n const row: QuestionNodeRow = {\n _id: id,\n _creationTime: creationTime,\n metadata: toRecord(record.metadata),\n };\n const optionalStrings: Array<keyof QuestionNodeRow> = [\n \"canonicalText\",\n \"content\",\n \"createdBy\",\n \"nodeType\",\n \"projectId\",\n \"questionType\",\n \"sourceType\",\n \"status\",\n \"text\",\n \"title\",\n \"topicId\",\n ];\n for (const key of optionalStrings) {\n const value = readOptionalString(record[key]);\n if (value !== undefined) {\n row[key] = value as never;\n }\n }\n const createdAt = readFiniteNumber(record.createdAt);\n if (createdAt !== undefined) {\n row.createdAt = createdAt;\n }\n const updatedAt = readFiniteNumber(record.updatedAt);\n if (updatedAt !== undefined) {\n row.updatedAt = updatedAt;\n }\n return row;\n}\n\nfunction readQuestionEvidenceLinkRow(\n value: unknown\n): QuestionEvidenceLinkRow | null {\n const record = toRecord(value);\n const id = readConvexId<\"questionEvidenceLinks\">(record._id);\n const questionId = readConvexId<\"epistemicNodes\">(record.questionId);\n const insightId = readConvexId<\"epistemicNodes\">(record.insightId);\n const creationTime = readFiniteNumber(record._creationTime);\n if (!(id && questionId && insightId && creationTime !== undefined)) {\n return null;\n }\n\n return {\n _id: id,\n _creationTime: creationTime,\n createdAt: readFiniteNumber(record.createdAt) ?? creationTime,\n createdBy: readOptionalString(record.createdBy) ?? \"unknown\",\n helpsAnswer:\n typeof record.helpsAnswer === \"boolean\" ? record.helpsAnswer : true,\n insightId,\n questionId,\n rationale: readOptionalString(record.rationale) ?? \"\",\n relevance: readFiniteNumber(record.relevance) ?? 0,\n };\n}\n\nfunction readEdgeRef(value: unknown): EdgeRef | null {\n const record = toRecord(value);\n const fromNodeId = readOptionalString(record.fromNodeId);\n const toNodeId = readOptionalString(record.toNodeId);\n if (!(fromNodeId || toNodeId)) {\n return null;\n }\n return { fromNodeId, toNodeId };\n}\n\nfunction getNodeText(insight: QuestionNodeRow | null): string {\n if (!insight) {\n return \"\";\n }\n\n const metadata = toRecord(insight.metadata);\n const canonicalText = insight.canonicalText;\n const legacyText = insight.text;\n const contentText = insight.content;\n const titleText = insight.title;\n const snippetText = metadata.snippet;\n\n if (typeof canonicalText === \"string\" && canonicalText.trim()) {\n return canonicalText.trim();\n }\n if (typeof legacyText === \"string\" && legacyText.trim()) {\n return legacyText.trim();\n }\n if (typeof contentText === \"string\" && contentText.trim()) {\n return contentText.trim();\n }\n if (typeof titleText === \"string\" && titleText.trim()) {\n return titleText.trim();\n }\n return typeof snippetText === \"string\" ? snippetText.trim() : \"\";\n}\n\nfunction getInsightSource(insight: QuestionNodeRow | null): string {\n if (!insight) {\n return \"unknown\";\n }\n\n const sourceType = insight.sourceType;\n return typeof sourceType === \"string\" && sourceType.trim().length > 0\n ? sourceType\n : \"unknown\";\n}\n\nexport const getForSprintCluster = query({\n args: {\n sprintId: v.optional(v.string()),\n worktreeId: v.optional(v.string()),\n userId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx: QueryCtx, args: GetQuestionsForWorkflowArgs) => {\n const docId = args.sprintId || args.worktreeId;\n if (!docId) {\n return [];\n }\n const workflow = await resolveWorkflowBridgeDoc(ctx, docId);\n const scopeDoc = workflow.worktree ?? workflow.sprint;\n if (!scopeDoc) {\n return [];\n }\n const scope = await resolveQuestionScopeOrNull(ctx, {\n projectId: workflow.projectId,\n topicId: workflow.topicId,\n });\n const scopeId = scope ? resolveQuestionScopeId(scope) : undefined;\n if (!(scope && scopeId)) {\n return [];\n }\n\n const hasAccess = await checkScopeAccess(ctx, scopeId, args.userId);\n if (!hasAccess) {\n return [];\n }\n\n // Get hypothesis and raw belief IDs from sprint synthesis state\n const synthesisState = toRecord(scopeDoc.synthesisState);\n const hypothesisIds = new Set(\n toStringList(synthesisState.synthesizedBeliefIds)\n );\n const rawBeliefIds = new Set(\n toStringList(synthesisState.originalBeliefIds)\n );\n\n // Cluster = hypotheses + conditionals (exclude raw beliefs)\n const clusterBeliefIds = new Set<string>(hypothesisIds);\n\n // Find conditionals via edges connected to hypotheses\n const edges = (await getQuestionEdgesForScope(ctx, scope))\n .map(readEdgeRef)\n .filter((edge): edge is EdgeRef => edge !== null);\n\n for (const edge of edges) {\n const fromStr = String(edge.fromNodeId || \"\");\n const toStr = String(edge.toNodeId || \"\");\n\n if (hypothesisIds.has(fromStr) && !rawBeliefIds.has(toStr)) {\n clusterBeliefIds.add(toStr);\n }\n if (hypothesisIds.has(toStr) && !rawBeliefIds.has(fromStr)) {\n clusterBeliefIds.add(fromStr);\n }\n }\n\n // Get all question-type epistemicNodes in the project\n const questionNodes = (await getQuestionNodesForScope(ctx, scope))\n .map(readQuestionNodeRow)\n .filter(\n (question): question is QuestionNodeRow =>\n question?.nodeType === \"question\"\n );\n\n // Include questions explicitly linked to the sprint via targetQuestionIds\n const sprintQuestionIds = new Set([\n ...toStringList(workflow.worktree?.targetQuestionIds as unknown),\n ...toStringList(workflow.sprint?.targetQuestionIds as unknown),\n ]);\n\n // Filter to questions linked to cluster beliefs OR explicitly in sprint\n const clusterQuestions = questionNodes.filter((q) => {\n // Always include questions explicitly added to this sprint\n if (sprintQuestionIds.has(String(q._id))) {\n return true;\n }\n // Include questions linked to cluster beliefs via metadata\n const meta = q.metadata;\n const linkedId = readOptionalString(meta.linkedBeliefNodeId);\n if (linkedId && clusterBeliefIds.has(linkedId)) {\n return true;\n }\n // Also check edges connecting this question to cluster beliefs\n return edges.some(\n (e) =>\n (String(e.fromNodeId) === String(q._id) &&\n clusterBeliefIds.has(e.toNodeId ?? \"\")) ||\n (String(e.toNodeId) === String(q._id) &&\n clusterBeliefIds.has(e.fromNodeId ?? \"\"))\n );\n });\n\n // Enrich with linked belief details\n const enrichedQuestions = await Promise.all(\n clusterQuestions.map((q) =>\n enrichSprintClusterQuestion(\n ctx,\n q,\n edges,\n hypothesisIds,\n rawBeliefIds,\n clusterBeliefIds\n )\n )\n );\n\n // Dedupe by question ID\n const seen = new Set<string>();\n return enrichedQuestions.filter((q) => {\n if (seen.has(String(q._id))) {\n return false;\n }\n seen.add(String(q._id));\n return true;\n });\n },\n});\n\n// =============================================================================\n// PORTED FROM questions.ts — 15 functions migrated to epistemicNodes\n// =============================================================================\n\n/**\n * 1. getInConviction - Get questions in conviction stage for a sprint\n * Ported from questions.ts lines 1008-1157\n */\nexport const getInConviction = query({\n args: {\n sprintId: v.optional(v.string()),\n worktreeId: v.optional(v.string()),\n userId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx: QueryCtx, args: GetQuestionsForWorkflowArgs) => {\n const docId = args.sprintId || args.worktreeId;\n if (!docId) {\n return [];\n }\n const workflow = await resolveWorkflowBridgeDoc(ctx, docId);\n const scopeDoc = workflow.worktree ?? workflow.sprint;\n if (!scopeDoc) {\n return [];\n }\n const scope = await resolveQuestionScopeOrNull(ctx, {\n projectId: workflow.projectId,\n topicId: workflow.topicId,\n });\n const scopeId = scope ? resolveQuestionScopeId(scope) : undefined;\n if (!(scope && scopeId)) {\n return [];\n }\n\n const hasAccess = await checkScopeAccess(ctx, scopeId, args.userId);\n if (!hasAccess) {\n return [];\n }\n\n const allQuestions = (await getQuestionNodesForScope(ctx, scope))\n .map(readQuestionNodeRow)\n .filter(\n (question): question is QuestionNodeRow =>\n question?.nodeType === \"question\"\n );\n\n // Filter to questions in conviction stages\n const convictionQuestions = allQuestions.filter((q) => {\n const meta = q.metadata;\n return (\n meta.convictionStage === \"in_conviction\" ||\n meta.convictionStage === \"scored\"\n );\n });\n\n // Get synthesized belief IDs from sprint\n const sprintSynthesis = toRecord(scopeDoc.synthesisState);\n const sprintBeliefIds = collectSprintBeliefIds(sprintSynthesis, workflow);\n\n // Filter to questions relevant to this sprint\n const sprintQuestions = convictionQuestions.filter((q) => {\n const meta = q.metadata;\n\n // Direct sprint link\n if (questionMatchesWorkflowLink(meta, workflow)) {\n return true;\n }\n\n // Linked to sprint beliefs via linkedBeliefNodeId\n if (\n meta.linkedBeliefNodeId &&\n sprintBeliefIds.has(String(meta.linkedBeliefNodeId))\n ) {\n return true;\n }\n if (\n meta.linkedBeliefId &&\n sprintBeliefIds.has(String(meta.linkedBeliefId))\n ) {\n return true;\n }\n if (meta.beliefId && sprintBeliefIds.has(String(meta.beliefId))) {\n return true;\n }\n\n // Linked via relatedBeliefIds\n const relatedIds = toStringList(meta.relatedBeliefIds);\n if (relatedIds.some((id) => sprintBeliefIds.has(String(id)))) {\n return true;\n }\n\n return false;\n });\n\n // Enrich with evidence and belief details\n const questionsWithDetails = await Promise.all(\n sprintQuestions.map(async (q) => {\n const meta = q.metadata;\n const [evidenceWithDetails, beliefIds] = await Promise.all([\n collectQuestionEvidenceDetails(ctx, q),\n Promise.resolve(collectInConvictionQuestionBeliefIds(meta)),\n ]);\n\n const beliefsWithDetails = await collectQuestionBeliefDetails(\n ctx,\n beliefIds\n );\n return buildInConvictionQuestionPayload(\n q,\n meta,\n evidenceWithDetails,\n beliefsWithDetails\n );\n })\n );\n\n // Sort: in_conviction first, then scored, then by importance\n return questionsWithDetails.sort((a, b) => {\n if (\n a.convictionStage === \"in_conviction\" &&\n b.convictionStage === \"scored\"\n ) {\n return -1;\n }\n if (\n a.convictionStage === \"scored\" &&\n b.convictionStage === \"in_conviction\"\n ) {\n return 1;\n }\n return (a.importance || 5) - (b.importance || 5);\n });\n },\n});\n\n/**\n * 2. advanceToConviction - Move a question to the conviction stage\n * Ported from questions.ts line 830\n */\n"]}
1
+ {"version":3,"sources":["../src/convex.ts","../src/debug.ts","../src/topicScope.ts","../src/epistemicQuestions.helpers.ts","../src/workflowBridge.ts","../src/epistemicQuestions.sprint.ts"],"names":["query","value","v"],"mappings":";;;;;;;AA4BA,IAAM,SAAA,GAAY,kBAAA;AAAA,EAChB;AACF,CAAA;AACO,IAAM,GAAA,GAAM,SAAA;AAEjB,iBAAA;AAkJK,IAAM,KAAA,GAAQ,YAAA;;;AC7KrB,SAAS,4BAAA,GAAwC;AAC/C,EAAA,MAAM,GAAA,GAAO,WAA8C,OAAA,EAAS,GAAA;AACpE,EAAA,OACE,GAAA,EAAK,4BAAA,KAAiC,GAAA,IAAO,GAAA,EAAK,kBAAA,KAAuB,GAAA;AAE7E;AAEO,SAAS,0BAA0B,KAAA,EAAwB;AAChE,EAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,IAAA,OAAO,CAAA,EAAG,KAAA,CAAM,IAAI,CAAA,EAAA,EAAK,MAAM,OAAO,CAAA,CAAA;AAAA,EACxC;AACA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,UAAU,IAAA,EAAM;AAClB,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,OAAO,WAAA;AAAA,EACT;AACA,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,EAC7B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA,CAAO,SAAA,CAAU,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AAAA,EAC7C;AACF;AAEO,SAAS,2BAAA,CACd,SACA,OAAA,EACM;AACN,EAAA,IAAI,CAAC,8BAA6B,EAAG;AACnC,IAAA;AAAA,EACF;AACA,EAAA,OAAA,CAAQ,KAAA,CAAM,OAAA,EAAS,OAAA,IAAW,EAAE,CAAA;AACtC;AClCA,IAAM,kBAAA,GAAqB,qBAAA;AAgE3B,eAAe,2BAAA,CACb,KACA,GAAA,EACmC;AACnC,EAAA,IAAI,CAAC,GAAA,EAAK,EAAA,IAAM,OAAO,GAAA,CAAI,EAAA,CAAG,UAAU,UAAA,EAAY;AAClD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,IAAA,GAAiC,IAAA;AAGrC,EAAA,IAAI;AACF,IAAA,MAAM,aAAc,MAAM,GAAA,CAAI,EAAA,CAC3B,KAAA,CAAM,gBAAgB,CAAA,CACtB,SAAA,CAAU,aAAA,EAAe,CAAC,MAAM,CAAA,CAAE,EAAA,CAAG,YAAY,GAAG,CAAC,EACrD,KAAA,EAAM;AACT,IAAA,IAAI,UAAA,IAAc,UAAA,CAAW,QAAA,KAAa,OAAA,EAAS;AACjD,MAAA,IAAA,GAAO,UAAA;AAAA,IACT;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,2BAAA;AAAA,MACE,yDAAA;AAAA,MACA,EAAE,OAAO,GAAA;AAAI,KACf;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,WACJ,mBAAA,CAAoB,IAAA,CAAK,OAAO,CAAA,IAAK,mBAAA,CAAoB,KAAK,QAAQ,CAAA;AACxE,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,QAAA;AAAA,IACT,SAAA,EAAW,kBAAkB,IAAI,CAAA;AAAA,IACjC,MAAA,EAAQ;AAAA,GACV;AACF;AAOA,SAAS,kBACP,KAAA,EACoB;AACpB,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA;AAAA,EACF;AACA,EAAA,MAAM,qBAAA,GAAwB,mBAAA;AAAA,IAC3B,MAAwB,kBAAkB;AAAA,GAC7C;AACA,EAAA,IAAI,qBAAA,EAAuB;AACzB,IAAA,OAAO,qBAAA;AAAA,EACT;AACA,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,QAAA,IAAY,EAAC;AACpC,EAAA,MAAM,SAAA,GACH,SAA2B,kBAAkB,CAAA,IAC7C,SAA2B,eAAA,IAC3B,QAAA,CAA2B,aAC3B,QAAA,CAA2B,cAAA;AAC9B,EAAA,OAAO,OAAO,SAAA,KAAc,QAAA,GACxB,mBAAA,CAAoB,SAAS,CAAA,GAC7B,MAAA;AACN;AAEA,SAAS,oBAAoB,KAAA,EAAoC;AAC/D,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA;AAAA,EACF;AACA,EAAA,MAAM,UAAA,GAAa,MAAM,IAAA,EAAK;AAC9B,EAAA,OAAO,UAAA,CAAW,MAAA,GAAS,CAAA,GAAI,UAAA,GAAa,MAAA;AAC9C;AAEA,SAAS,iBAAiB,UAAA,EAA8C;AACtE,EAAA,OAAO,CAAC,GAAG,UAAU,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AACpC,IAAA,MAAM,MAAA,GAAS,EAAE,KAAA,IAAS,IAAA;AAC1B,IAAA,MAAM,MAAA,GAAS,EAAE,KAAA,IAAS,IAAA;AAC1B,IAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,MAAA,OAAO,MAAA,GAAS,MAAA;AAAA,IAClB;AACA,IAAA,MAAM,QAAA,GAAW,CAAA,CAAE,SAAA,IAAa,MAAA,CAAO,gBAAA;AACvC,IAAA,MAAM,QAAA,GAAW,CAAA,CAAE,SAAA,IAAa,MAAA,CAAO,gBAAA;AACvC,IAAA,IAAI,aAAa,QAAA,EAAU;AACzB,MAAA,OAAO,QAAA,GAAW,QAAA;AAAA,IACpB;AACA,IAAA,OAAO,MAAA,CAAO,CAAA,CAAE,IAAA,IAAQ,EAAE,CAAA,CAAE,cAAc,MAAA,CAAO,CAAA,CAAE,IAAA,IAAQ,EAAE,CAAC,CAAA;AAAA,EAChE,CAAC,EAAE,CAAC,CAAA;AACN;AAEA,eAAe,sBAAA,CACb,KACA,OAAA,EACqB;AACrB,EAAA,MAAMA,MAAAA,GAAQ,GAAA,CAAI,EAAA,CAAG,KAAA,CAAM,QAAQ,CAAA;AACnC,EAAA,IAAI;AACF,IAAA,OAAQ,MAAMA,MAAAA,CACX,SAAA;AAAA,MAAU,wBAAA;AAAA,MAA0B,CAAC,CAAA,KACpC,CAAA,CAAE,EAAA,CAAG,oBAAoB,OAAO;AAAA,MAEjC,OAAA,EAAQ;AAAA,EACb,SAAS,KAAA,EAAO;AACd,IAAA,2BAAA;AAAA,MACE,sDAAA;AAAA,MACA;AAAA,QACE,KAAA;AAAA,QACA;AAAA;AACF,KACF;AAIA,IAAA,MAAM,MAAA,GAAU,MAAMA,MAAAA,CAAM,OAAA,EAAQ;AACpC,IAAA,OAAO,MAAA,CAAO,MAAA,CAAO,CAAC,KAAA,KAAU;AAC9B,MAAA,MAAM,kBAAA,GAAqB,mBAAA,CAAoB,KAAA,CAAM,QAAQ,CAAA;AAC7D,MAAA,MAAM,eAAA,GAAkB,kBAAkB,KAAK,CAAA;AAC/C,MAAA,OACE,OAAO,KAAA,CAAM,GAAG,MAAM,OAAA,IACtB,kBAAA,KAAuB,WACvB,eAAA,KAAoB,OAAA;AAAA,IAExB,CAAC,CAAA;AAAA,EACH;AACF;AAEA,eAAe,uBAAA,CACb,KACA,OAAA,EAC0B;AAC1B,EAAA,IAAI,OAAO,GAAA,CAAI,QAAA,KAAa,UAAA,EAAY;AACtC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI;AACF,IAAA,OAAS,MAAM,GAAA,CAAI,QAAA,CAAS,GAAA,CAAO,OAAO,GAAA,EAAK;AAAA,MAC7C,EAAA,EAAI;AAAA,KACL,CAAA,IAAM,IAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,2BAAA;AAAA,MACE,oDAAA;AAAA,MACA;AAAA,QACE,KAAA;AAAA,QACA;AAAA;AACF,KACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,eAAe,gCAAA,CACb,KACA,aAAA,EAC0B;AAC1B,EAAA,IAAI,OAAO,GAAA,CAAI,QAAA,KAAa,UAAA,EAAY;AACtC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI;AACF,IAAA,OAAS,MAAM,GAAA,CAAI,QAAA,CAAS,GAAA,CAAO,OAAO,kBAAA,EAAoB;AAAA,MAC5D,SAAA,EAAW;AAAA,KACZ,CAAA,IAAM,IAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,2BAAA;AAAA,MACE,sDAAA;AAAA,MACA;AAAA,QACE,KAAA;AAAA,QACA;AAAA;AACF,KACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAwBA,eAAe,8BAAA,CACb,KACA,KAAA,EACsD;AACtD,EAAA,MAAM,SAAA,GAAY,EAAA;AAClB,EAAA,IAAI,QAAA,GAAW,mBAAA,CAAoB,KAAA,CAAM,QAAQ,CAAA;AACjD,EAAA,IAAI,WAAA,GAAc,mBAAA,CAAoB,KAAA,CAAM,WAAW,CAAA;AAEvD,EAAA,IAAI,YAAY,WAAA,EAAa;AAC3B,IAAA,OAAO,EAAE,UAAU,WAAA,EAAY;AAAA,EACjC;AAEA,EAAA,IAAI,OAAA,GAA2B,KAAA;AAC/B,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,SAAA,IAAa,OAAA,EAAS,eAAe,CAAA,EAAA,EAAK;AAC5D,IAAA,OAAA,GAAW,MAAM,GAAA,CAAI,EAAA,CAAG,GAAA,CAAI,QAAQ,aAAa,CAAA;AACjD,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,QAAA,GAAW,mBAAA,CAAoB,QAAQ,QAAQ,CAAA;AAAA,IACjD;AACA,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,WAAA,GAAc,mBAAA,CAAoB,QAAQ,WAAW,CAAA;AAAA,IACvD;AACA,IAAA,IAAI,YAAY,WAAA,EAAa;AAC3B,MAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,UAAU,WAAA,EAAY;AACjC;AAEA,eAAsB,wBAAA,CACpB,KACA,IAAA,EAC4B;AAC5B,EAAA,IAAI,KAAK,OAAA,EAAS;AAChB,IAAA,OAAO,MAAM,uBAAA,CAAwB,GAAA,EAAK,IAAA,CAAK,OAAO,CAAA;AAAA,EACxD;AAEA,EAAA,IAAI,KAAK,SAAA,EAAW;AAClB,IAAA,OAAO,MAAM,+BAAA,CAAgC,GAAA,EAAK,IAAA,CAAK,SAAS,CAAA;AAAA,EAClE;AAEA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR;AAAA,GACF;AACF;AAEA,eAAe,uBAAA,CACb,KACA,OAAA,EAC4B;AAC5B,EAAA,MAAM,KAAA,GAAQ,MAAM,0BAAA,CAA2B,GAAA,EAAK,OAAO,CAAA;AAC3D,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,OAAO,MAAM,eAAA,CAAgB,GAAA,EAAK,KAAA,EAAO,OAAO,CAAA;AAAA,EAClD;AAEA,EAAA,MAAM,YAAY,MAAM,2BAAA,CAA4B,GAAA,EAAK,MAAA,CAAO,OAAO,CAAC,CAAA;AACxE,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,OAAO,SAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,MAAA,CAAO,OAAO,CAAC,CAAA,CAAE,CAAA;AACvD;AAEA,eAAe,0BAAA,CACb,KACA,OAAA,EAC0B;AAC1B,EAAA,MAAM,MAAA,GAAS,MAAM,eAAA,CAAgB,GAAA,EAAK,OAAA,EAAS;AAAA,IACjD,UAAA,EAAY,gDAAA;AAAA,IACZ,QAAA,EAAU;AAAA,GACX,CAAA;AACD,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,YAAY,MAAM,uBAAA,CAAwB,GAAA,EAAK,MAAA,CAAO,OAAO,CAAC,CAAA;AACpE,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,OAAO,SAAA;AAAA,EACT;AAEA,EAAA,OACE,gBAAA,CAAiB,MAAM,sBAAA,CAAuB,GAAA,EAAK,OAAO,OAAO,CAAC,CAAC,CAAA,IAAK,IAAA;AAE5E;AAEA,eAAe,+BAAA,CACb,KACA,eAAA,EAC4B;AAC5B,EAAA,MAAM,cAAc,MAAM,+BAAA;AAAA,IACxB,GAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,OAAO,MAAM,eAAA,CAAgB,GAAA,EAAK,WAAA,EAAa,gBAAA,EAAkB;AAAA,MAC/D,iBAAA,EAAmB;AAAA,KACpB,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,OAAA,GAAU,gBAAA;AAAA,IACd,MAAM,sBAAA,CAAuB,GAAA,EAAK,eAAe;AAAA,GACnD;AACA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAO,MAAM,eAAA,CAAgB,GAAA,EAAK,OAAA,EAAS,sBAAA,EAAwB;AAAA,MACjE,iBAAA,EAAmB;AAAA,KACpB,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,SAAA,GAAY,MAAM,2BAAA,CAA4B,GAAA,EAAK,eAAe,CAAA;AACxE,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,OAAO;AAAA,MACL,GAAG,SAAA;AAAA,MACH,SAAA,EAAW,UAAU,SAAA,IAAa;AAAA,KACpC;AAAA,EACF;AAEA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,wBAAwB,eAAe,CAAA,qBAAA;AAAA,GACzC;AACF;AAEA,eAAe,+BAAA,CACb,KACA,eAAA,EAC0B;AAC1B,EAAA,MAAM,WAAA,GAAc,MAAM,eAAA,CAAgB,GAAA,EAAK,eAAA,EAAiB;AAAA,IAC9D,UAAA,EAAY,kDAAA;AAAA,IACZ,QAAA,EAAU;AAAA,GACX,CAAA;AACD,EAAA,OAAO,WAAA,IAAe,gCAAA,CAAiC,GAAA,EAAK,eAAe,CAAA;AAC7E;AAEA,eAAe,eAAA,CACb,GAAA,EACA,EAAA,EACA,GAAA,EAC0B;AAC1B,EAAA,IAAI;AACF,IAAA,OAAQ,MAAM,GAAA,CAAI,EAAA,CAAG,GAAA,CAAI,EAAE,CAAA;AAAA,EAC7B,SAAS,KAAA,EAAO;AACd,IAAA,2BAAA,CAA4B,IAAI,UAAA,EAAY;AAAA,MAC1C,KAAA;AAAA,MACA,CAAC,GAAA,CAAI,QAAQ,GAAG;AAAA,KACjB,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,eAAe,gBACb,GAAA,EACA,KAAA,EACA,MAAA,EACA,OAAA,GAA0C,EAAC,EACf;AAC5B,EAAA,MAAM,SAAA,GAAY,MAAM,8BAAA,CAA+B,GAAA,EAAK,KAAK,CAAA;AACjE,EAAA,MAAM,MAAA,GAAS,kBAAkB,KAAK,CAAA;AACtC,EAAA,OAAO;AAAA,IACL,SAAS,KAAA,CAAM,GAAA;AAAA,IACf,GAAI,MAAA,IAAU,OAAA,CAAQ,iBAAA,GAClB,EAAE,WAAW,MAAA,IAAU,OAAA,CAAQ,iBAAA,EAAkB,GACjD,EAAC;AAAA,IACL,UAAU,SAAA,CAAU,QAAA;AAAA,IACpB,aAAa,SAAA,CAAU,WAAA;AAAA,IACvB;AAAA,GACF;AACF;CAGiC;AAAA,EAC/B,SAAA,EAAW,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAA;AAAA,EAChC,OAAA,EAAS,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAQ;AAChC;;;ACpNO,SAAS,oBACd,KAAA,EACmB;AACnB,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,MAAM,UAA6B,EAAC;AACpC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA;AAC1B,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,EAAG;AAChB,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,IAAI,EAAE,CAAA;AACX,IAAA,OAAA,CAAQ,KAAK,IAAI,CAAA;AAAA,EACnB;AACA,EAAA,OAAO,OAAA;AACT;AAEO,SAAS,yBACd,OAAA,EACoB;AACpB,EAAA,OAAO,OAAO,YAAY,QAAA,IAAY,OAAA,CAAQ,MAAK,CAAE,MAAA,GAAS,IAC1D,OAAA,GACA,MAAA;AACN;AAEO,SAAS,uBAAuB,KAAA,EAGhB;AACrB,EAAA,OAAO,wBAAA,CAAyB,MAAM,OAAO,CAAA;AAC/C;AAaA,eAAsB,0BAAA,CACpB,KACA,IAAA,EACA;AACA,EAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,yBAAyB,GAAA,EAAK;AAAA,MACzC,SAAA,EAAW,KAAK,SAAA,IAAa,KAAA,CAAA;AAAA,MAC7B,OAAA,EAAS,KAAK,OAAA,IAAW,KAAA;AAAA,KAC1B,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,2BAAA;AAAA,MACE,uDAAA;AAAA,MACA;AAAA,QACE,KAAA,EAAO,0BAA0B,KAAK,CAAA;AAAA,QACtC,WAAW,IAAA,CAAK,SAAA;AAAA,QAChB,SAAS,IAAA,CAAK;AAAA;AAChB,KACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,eAAsB,wBAAA,CACpB,GAAA,EACA,KAAA,EACA,IAAA,EAC4B;AAC5B,EAAA,MAAM,aAAa,CAACA,MAAAA,KAGdA,OAAM,OAAA,EAAQ;AAEpB,EAAA,MAAM,aAAa,MAAM,UAAA;AAAA,IACvB,GAAA,CAAI,EAAA,CACD,KAAA,CAAM,gBAAgB,CAAA,CACtB,SAAA;AAAA,MAAU,eAAA;AAAA,MAAiB,CAAC,CAAA,KAC3B,CAAA,CAAE,EAAA,CAAG,SAAA,EAAW,MAAM,OAAO,CAAA,CAAE,EAAA,CAAG,UAAA,EAAY,UAAU;AAAA;AAC1D,GACJ;AAEA,EAAA,OAAO,mBAAA,CAAoB,UAAU,CAAA,CAAE,MAAA;AAAA,IAAO,CAAC,IAAA,KAC7C,oBAAA,CAAqB,IAAA,EAAM,KAAK;AAAA,GAClC;AACF;AAEA,eAAsB,wBAAA,CACpB,KACA,KAAA,EACA;AACA,EAAA,IAAI,CAAC,MAAM,OAAA,EAAS;AAClB,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,MAAMA,MAAAA,GAAQ,GAAA,CAAI,EAAA,CACf,KAAA,CAAM,gBAAgB,CAAA,CACtB,SAAA;AAAA,IAAU,UAAA;AAAA,IAAY,CAAC,CAAA,KACtB,CAAA,CAAE,EAAA,CAAG,SAAA,EAAW,MAAM,OAAO;AAAA,GAC/B;AAEF,EAAA,OAAO,MAAMA,OAAM,OAAA,EAAQ;AAC7B;AAEO,SAAS,oBAAA,CACd,MACA,KAAA,EACS;AACT,EAAA,OACG,KAAA,CAAM,OAAA,KAAY,MAAA,IAAa,IAAA,CAAK,OAAA,KAAY,KAAA,CAAM,OAAA,IACtD,KAAA,CAAM,SAAA,KAAc,MAAA,IAAa,IAAA,CAAK,SAAA,KAAc,KAAA,CAAM,SAAA;AAE/D;AAEO,SAAS,wBACd,IAAA,EACe;AACf,EAAA,MAAM,mBAAmB,IAAA,CAAK,gBAAA;AAC9B,EAAA,OAAO,OAAO,gBAAA,KAAqB,QAAA,IAAY,gBAAA,CAAiB,IAAA,KAC5D,gBAAA,GACA,IAAA;AACN;AAYO,SAAS,2BAAA,CACd,MACA,QAAA,EAIS;AACT,EAAA,MAAM,gBAAA,GAAmB,wBAAwB,IAAI,CAAA;AACrD,EAAA,OAAO,OAAA;AAAA,IACL,gBAAA,KACG,gBAAA,KAAqB,QAAA,CAAS,UAAA,IAC7B,qBAAqB,QAAA,CAAS,QAAA;AAAA,GACpC;AACF;;;AC7UO,SAAS,kBAAkB,GAAA,EAAsC;AACtE,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,EAAU;AACnC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAA,GACJ,OAAQ,GAAA,CAAsB,QAAA,KAAa,YAC1C,GAAA,CAAsB,QAAA,KAAa,IAAA,GAC9B,GAAA,CAAsB,QAAA,GACxB,MAAA;AAEN,EAAA,IAAI,UAAU,cAAA,EAAgB;AAC5B,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OACE,aAAA,IAAiB,GAAA,IACjB,cAAA,IAAkB,GAAA,IAClB,cAAA,IAAkB,GAAA,IAClB,gBAAA,IAAoB,GAAA,IACnB,WAAA,IAAe,GAAA,IAAO,EAAE,eAAA,IAAmB,GAAA,CAAA;AAEhD;AAEO,SAAS,cAAc,GAAA,EAAsC;AAClE,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,EAAU;AACnC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OACE,eAAA,IAAmB,OACnB,cAAA,IAAkB,GAAA,IAClB,cAAc,GAAA,IACd,eAAA,IAAmB,OACnB,gBAAA,IAAoB,GAAA;AAExB;AAEO,SAAS,kBAAkB,GAAA,EAAyC;AACzE,EAAA,MAAM,cAAA,GAAiB,KAAK,QAAA,EAAU,cAAA;AACtC,EAAA,OAAO,OAAO,mBAAmB,QAAA,IAAY,cAAA,CAAe,MAAK,CAAE,MAAA,GAAS,IACxE,cAAA,GACA,IAAA;AACN;AAEA,SAAS,cAAA,CACP,KACA,KAAA,EACA;AACA,EAAA,MAAM,KAAA,GAAQ,MAAM,KAAK,CAAA;AACzB,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,CAAM,MAAK,CAAE,MAAA,GAAS,IACtD,KAAA,GACA,MAAA;AACN;AAEA,eAAe,2BAAA,CACb,KACA,MAAA,EACiC;AACjC,EAAA,MAAM,QAAA,GACJ,OAAO,MAAA,CAAO,GAAA,KAAQ,QAAA,IAAY,OAAO,GAAA,CAAI,MAAA,GAAS,CAAA,GAAI,MAAA,CAAO,GAAA,GAAM,IAAA;AACzE,EAAA,IAAI,CAAC,QAAA,IAAY,OAAO,GAAA,CAAI,EAAA,CAAG,UAAU,UAAA,EAAY;AACnD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAA,GAAU,cAAA,CAAe,MAAA,EAAQ,SAAS,CAAA;AAC9C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,MAAM,wBAAA,CAAyB,GAAA,EAAK;AAAA,QAChD,OAAA,EAAS,cAAA,CAAe,MAAA,EAAQ,SAAS,CAAA;AAAA,QACzC,SAAA,EAAW,cAAA,CAAe,MAAA,EAAQ,WAAW;AAAA,OAC9C,CAAA;AACD,MAAA,OAAA,GAAU,KAAA,CAAM,OAAA;AAAA,IAClB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAA,GAAU,MAAA;AAAA,IACZ;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,YAAY,MAAM,GAAA,CAAI,EAAA,CACzB,KAAA,CAAM,WAAW,CAAA,CACjB,SAAA,CAAU,YAAA,EAAc,CAAC,MAAM,CAAA,CAAE,EAAA,CAAG,WAAW,OAAO,CAAC,EACvD,OAAA,EAAQ;AAEX,EAAA,OACE,SAAA,CAAU,IAAA;AAAA,IACR,CAAC,QAAA,KACC,aAAA,CAAc,QAAQ,CAAA,IACtB,OAAO,QAAA,CAAS,QAAA,EAAU,cAAA,IAAkB,EAAE,CAAA,KAAM;AAAA,GACxD,IAAK,IAAA;AAET;AAEA,eAAsB,wBAAA,CACpB,KACA,UAAA,EACmC;AACnC,EAAA,MAAM,KAAA,GAAkC;AAAA,IACtC,SAAS,UAAA,IAAc,IAAA;AAAA,IACvB,MAAA,EAAQ,IAAA;AAAA,IACR,QAAA,EAAU,IAAA;AAAA,IACV,QAAA,EAAU,IAAA;AAAA,IACV,UAAA,EAAY;AAAA,GACd;AAEA,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,MAAM,GAAA,CAAI,EAAA,CAAG,GAAA,CAAI,UAAU,CAAA;AAAA,EACnC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,EAAU;AACnC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,iBAAA,CAAkB,GAAG,CAAA,EAAG;AAC1B,IAAA,OAAO,MAAM,yBAAA,CAA0B,GAAA,EAAK,KAAA,EAAO,KAAK,UAAU,CAAA;AAAA,EACpE;AAEA,EAAA,OAAO,MAAM,qBAAA,CAAsB,GAAA,EAAK,KAAA,EAAO,KAAK,UAAU,CAAA;AAChE;AAEA,eAAe,yBAAA,CACb,GAAA,EACA,KAAA,EACA,MAAA,EACA,UAAA,EACmC;AACnC,EAAA,MAAM,QAAA,GAAW,MAAM,2BAAA,CAA4B,GAAA,EAAK,MAAM,CAAA;AAC9D,EAAA,OAAO;AAAA,IACL,GAAG,KAAA;AAAA,IACH,MAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA,EAAU,uBAAA,CAAwB,MAAA,EAAQ,UAAU,CAAA;AAAA,IACpD,UAAA,EAAY,uBAAA,CAAwB,QAAA,EAAU,IAAI,CAAA;AAAA,IAClD,SACE,cAAA,CAAe,QAAA,EAAU,SAAS,CAAA,IAAK,cAAA,CAAe,QAAQ,SAAS,CAAA;AAAA,IACzE,WACE,cAAA,CAAe,MAAA,EAAQ,WAAW,CAAA,IAClC,cAAA,CAAe,UAAU,WAAW;AAAA,GACxC;AACF;AAEA,eAAe,qBAAA,CACb,GAAA,EACA,KAAA,EACA,GAAA,EACA,UAAA,EACmC;AACnC,EAAA,MAAM,QAAA,GAAW,GAAA;AACjB,EAAA,MAAM,cAAA,GAAiB,kBAAkB,QAAQ,CAAA;AACjD,EAAA,MAAM,MAAA,GAAS,MAAM,gBAAA,CAAiB,GAAA,EAAK,cAAc,CAAA;AAEzD,EAAA,OAAO;AAAA,IACL,GAAG,KAAA;AAAA,IACH,QAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAA,EAAY,uBAAA,CAAwB,QAAA,EAAU,UAAU,CAAA;AAAA,IACxD,QAAA,EAAU,uBAAA,CAAwB,MAAA,EAAQ,cAAc,CAAA;AAAA,IACxD,SACE,cAAA,CAAe,QAAA,EAAU,SAAS,CAAA,IAAK,cAAA,CAAe,QAAQ,SAAS,CAAA;AAAA,IACzE,WACE,cAAA,CAAe,MAAA,EAAQ,WAAW,CAAA,IAClC,cAAA,CAAe,UAAU,WAAW;AAAA,GACxC;AACF;AAEA,eAAe,gBAAA,CACb,KACA,cAAA,EACiC;AACjC,EAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,EAAA,CAAG,IAAI,cAAc,CAAA;AAC9C,IAAA,OAAO,iBAAA,CAAkB,MAAM,CAAA,GAAI,MAAA,GAAS,IAAA;AAAA,EAC9C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,uBAAA,CACP,KACA,QAAA,EACe;AACf,EAAA,OAAO,OAAO,KAAK,GAAA,KAAQ,QAAA,IAAY,IAAI,GAAA,CAAI,MAAA,GAAS,CAAA,GACpD,GAAA,CAAI,GAAA,GACJ,QAAA;AACN;;;AChFA,SAAS,0BAAA,CACP,cAAA,EACA,KAAA,EACA,WAAA,EACU;AACV,EAAA,MAAM,UAAA,GAAa,OAAO,cAAc,CAAA;AACxC,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAY;AACtC,EAAA,MAAM,eAAA,GAAkB,kBAAA,CAAmB,WAAA,CAAY,kBAAkB,CAAA;AACzE,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,aAAA,CAAc,IAAI,eAAe,CAAA;AAAA,EACnC;AAEA,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,UAAA,GAAa,KAAK,UAAA,IAAc,EAAA;AACtC,IAAA,MAAM,QAAA,GAAW,KAAK,QAAA,IAAY,EAAA;AAElC,IAAA,IAAI,UAAA,KAAe,cAAc,QAAA,EAAU;AACzC,MAAA,aAAA,CAAc,IAAI,QAAQ,CAAA;AAAA,IAC5B;AACA,IAAA,IAAI,QAAA,KAAa,cAAc,UAAA,EAAY;AACzC,MAAA,aAAA,CAAc,IAAI,UAAU,CAAA;AAAA,IAC9B;AAAA,EACF;AACA,EAAA,aAAA,CAAc,OAAO,EAAE,CAAA;AACvB,EAAA,OAAO,KAAA,CAAM,KAAK,aAAa,CAAA;AACjC;AAEA,eAAe,2BAAA,CACb,GAAA,EACA,mBAAA,EACA,gBAAA,EACA,eACA,YAAA,EAC+B;AAC/B,EAAA,MAAM,aAAA,GAAgB,MAAM,OAAA,CAAQ,GAAA;AAAA,IAClC,mBAAA,CAAoB,GAAA,CAAI,OAAO,YAAA,KAAiB;AAC9C,MAAA,MAAM,MAAA,GAAS,aAA+B,YAAY,CAAA;AAC1D,MAAA,MAAM,IAAA,GAAO,SACT,mBAAA,CAAoB,MAAM,IAAI,EAAA,CAAG,GAAA,CAAI,MAAM,CAAC,CAAA,GAC5C,IAAA;AACJ,MAAA,IAAI,IAAA,EAAM,aAAa,QAAA,EAAU;AAC/B,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,OAAO;AAAA,QACL,UAAU,IAAA,CAAK,GAAA;AAAA,QACf,UAAA,EAAY,KAAK,aAAA,IAAiB,EAAA;AAAA,QAClC,YAAA,EAAc,aAAA,CAAc,GAAA,CAAI,YAAY,CAAA;AAAA,QAC5C,aAAA,EACE,EACE,aAAA,CAAc,GAAA,CAAI,YAAY,CAAA,IAAK,YAAA,CAAa,GAAA,CAAI,YAAY,CAAA,CAAA,IAC7D,gBAAA,CAAiB,GAAA,CAAI,YAAY,CAAA;AAAA,QACxC,KAAA,EAAO,YAAA,CAAa,GAAA,CAAI,YAAY,CAAA;AAAA,QACpC,eAAA,EAAiB,aAAA,CAAc,GAAA,CAAI,YAAY;AAAA,OACjD;AAAA,IACF,CAAC;AAAA,GACH;AACA,EAAA,OAAO,aAAA,CAAc,MAAA;AAAA,IACnB,CAAC,WAAW,MAAA,KAAW;AAAA,GACzB;AACF;AAEA,eAAe,4BACb,GAAA,EACA,QAAA,EACA,KAAA,EACA,aAAA,EACA,cACA,gBAAA,EACkC;AAClC,EAAA,MAAM,OAAO,QAAA,CAAS,QAAA;AACtB,EAAA,MAAM,mBAAA,GAAsB,0BAAA;AAAA,IAC1B,QAAA,CAAS,GAAA;AAAA,IACT,KAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,gBAAgB,MAAM,2BAAA;AAAA,IAC1B,GAAA;AAAA,IACA,mBAAA;AAAA,IACA,gBAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,eAAe,QAAA,CAAS,aAAA;AAC9B,EAAA,MAAM,OAAA,GAAmC;AAAA,IACvC,KAAK,QAAA,CAAS,GAAA;AAAA,IACd,eAAe,QAAA,CAAS,aAAA;AAAA,IACxB,cACE,QAAA,CAAS,YAAA,IACT,kBAAA,CAAmB,IAAA,CAAK,YAAY,CAAA,IACpC,SAAA;AAAA,IACF,QAAA,EAAU,kBAAA,CAAmB,IAAA,CAAK,QAAQ,CAAA,IAAK,OAAA;AAAA,IAC/C,QAAA,EAAU,kBAAA,CAAmB,IAAA,CAAK,QAAQ,CAAA,IAAK,QAAA;AAAA,IAC/C,eACE,OAAO,IAAA,CAAK,aAAA,KAAkB,SAAA,GAAY,KAAK,aAAA,GAAgB,KAAA;AAAA,IACjE,QAAA,EAAU,kBAAA,CAAmB,IAAA,CAAK,QAAQ,CAAA,IAAK,WAAA;AAAA,IAC/C,MAAA,EAAQ,SAAS,MAAA,IAAU,QAAA;AAAA,IAC3B,SAAA,EAAW,kBAAA,CAAmB,IAAA,CAAK,QAAQ,CAAA,IAAK,WAAA;AAAA,IAChD,aAAA,EAAe,kBAAA,CAAmB,IAAA,CAAK,SAAS,CAAA,IAAK,IAAA;AAAA,IACrD,QAAA,EAAU,kBAAA,CAAmB,IAAA,CAAK,kBAAkB,CAAA,IAAK,IAAA;AAAA,IACzD,gBAAA,EAAkB,mBAAA;AAAA;AAAA,IAElB,eAAA,EAAiB,kBAAA,CAAmB,IAAA,CAAK,eAAe,CAAA,IAAK,IAAA;AAAA,IAC7D,MAAA,EAAQ,kBAAA,CAAmB,IAAA,CAAK,MAAM,CAAA,IAAK,IAAA;AAAA,IAC3C,UAAA,EAAY,gBAAA,CAAiB,IAAA,CAAK,UAAU,CAAA,IAAK,IAAA;AAAA,IACjD,gBAAA,EAAkB,wBAAwB,IAAI,CAAA;AAAA,IAC9C,aAAA;AAAA,IACA,UAAU,QAAA,CAAS;AAAA,GACrB;AACA,EAAA,IAAI,SAAS,SAAA,EAAW;AACtB,IAAA,OAAA,CAAQ,YAAY,QAAA,CAAS,SAAA;AAAA,EAC/B;AACA,EAAA,IAAI,SAAS,OAAA,EAAS;AACpB,IAAA,OAAA,CAAQ,UAAU,QAAA,CAAS,OAAA;AAAA,EAC7B;AACA,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,OAAA,CAAQ,aAAA,GAAgB,YAAA;AACxB,IAAA,OAAA,CAAQ,QAAA,GAAW,YAAA;AAAA,EACrB;AACA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,sBAAA,CACP,iBACA,QAAA,EACa;AACb,EAAA,2BAAW,GAAA,CAAI;AAAA,IACb,GAAG,YAAA,CAAa,eAAA,CAAgB,oBAAoB,CAAA;AAAA,IACpD,GAAA,CACI,QAAA,CAAS,QAAA,EAAU,eAAA,IAClB,QAAA,CAAS,QAAQ,eAAA,IAClB,EAAC,EACH,GAAA,CAAI,MAAM;AAAA,GACb,CAAA;AACH;AAEA,SAAS,qCAAqC,IAAA,EAA+B;AAC3E,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAY;AAClC,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,IAAA,CAAK,gBAAgB,CAAA;AACrD,EAAA,IAAI,KAAK,kBAAA,EAAoB;AAC3B,IAAA,SAAA,CAAU,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,kBAAkB,CAAC,CAAA;AAAA,EAC/C;AACA,EAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,IAAA,SAAA,CAAU,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,cAAc,CAAC,CAAA;AAAA,EAC3C;AACA,EAAA,IAAI,KAAK,QAAA,EAAU;AACjB,IAAA,SAAA,CAAU,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAC,CAAA;AAAA,EACrC;AACA,EAAA,KAAA,MAAW,YAAY,UAAA,EAAY;AACjC,IAAA,SAAA,CAAU,GAAA,CAAI,MAAA,CAAO,QAAQ,CAAC,CAAA;AAAA,EAChC;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,SAAS,CAAA;AAC7B;AAEA,eAAe,8BAAA,CACb,KACA,CAAA,EACyC;AACzC,EAAA,MAAM,gBAAgB,MAAM,GAAA,CAAI,GAC7B,KAAA,CAAM,uBAAuB,EAC7B,SAAA,CAAU,eAAA,EAAiB,CAAC,EAAA,KAAO,GAAG,EAAA,CAAG,YAAA,EAAc,EAAE,GAAG,CAAC,EAC7D,OAAA,EAAQ;AAEX,EAAA,MAAM,kBAAkD,EAAC;AACzD,EAAA,KAAA,MAAW,WAAW,aAAA,EAAe;AACnC,IAAA,MAAM,IAAA,GAAO,4BAA4B,OAAO,CAAA;AAChD,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA;AAAA,IACF;AACA,IAAA,MAAM,OAAA,GAAU,oBAAoB,MAAM,GAAA,CAAI,GAAG,GAAA,CAAI,IAAA,CAAK,SAAS,CAAC,CAAA;AACpE,IAAA,eAAA,CAAgB,IAAA,CAAK;AAAA,MACnB,GAAG,IAAA;AAAA,MACH,WAAA,EAAa,YAAY,OAAO,CAAA;AAAA,MAChC,aAAA,EAAe,iBAAiB,OAAO;AAAA,KACxC,CAAA;AAAA,EACH;AACA,EAAA,OAAO,eAAA;AACT;AAEA,eAAe,4BAAA,CACb,KACA,SAAA,EAC0B;AAC1B,EAAA,MAAM,aAAA,GAAgB,MAAM,OAAA,CAAQ,GAAA;AAAA,IAClC,SAAA,CAAU,GAAA,CAAI,OAAO,QAAA,KAAa;AAChC,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,aAA+B,QAAQ,CAAA;AACtD,QAAA,MAAM,IAAA,GAAO,SACT,mBAAA,CAAoB,MAAM,IAAI,EAAA,CAAG,GAAA,CAAI,MAAM,CAAC,CAAA,GAC5C,IAAA;AACJ,QAAA,IAAI,IAAA,IAAQ,IAAA,CAAK,QAAA,KAAa,QAAA,EAAU;AACtC,UAAA,OAAO;AAAA,YACL,KAAK,IAAA,CAAK,GAAA;AAAA,YACV,MAAA,EAAQ,KAAK,aAAA,IAAiB,EAAA;AAAA,YAC9B,UAAA,EAAY,QAAA,CAAS,IAAA,CAAK,QAAQ,CAAA,CAAE,UAAA;AAAA,YACpC,QAAQ,eAAA,CAAgB,QAAA,CAAS,IAAA,CAAK,QAAQ,GAAG,UAAU,CAAA;AAAA,YAC3D,UAAA,EAAY,KAAK,MAAA,IAAU,QAAA;AAAA,YAC3B,cAAA,EAAgB,CAAA;AAAA,YAChB,eAAA,EAAiB,CAAA;AAAA,YACjB,kBAAA,EAAoB;AAAA,WACtB;AAAA,QACF;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,2BAAA;AAAA,UACE,sDAAA;AAAA,UACA;AAAA,YACE,KAAA,EAAO,0BAA0B,KAAK,CAAA;AAAA,YACtC;AAAA;AACF,SACF;AAAA,MACF;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAC;AAAA,GACH;AAEA,EAAA,OAAO,aAAA,CAAc,OAAO,OAAO,CAAA;AACrC;AAEA,SAAS,gCAAA,CACP,QAAA,EACA,IAAA,EACA,mBAAA,EACA,aAAA,EACsB;AACtB,EAAA,MAAM,gBAAA,GAAmB,YAAA,CAAa,IAAA,CAAK,gBAAgB,CAAA;AAC3D,EAAA,MAAM,eAAA,GACJ,kBAAA,CAAmB,IAAA,CAAK,eAAe,CAAA,IAAK,eAAA;AAC9C,EAAA,MAAM,OAAA,GAAgC;AAAA,IACpC,KAAK,QAAA,CAAS,GAAA;AAAA,IACd,eAAe,QAAA,CAAS,aAAA;AAAA,IACxB,QAAA,EAAU,kBAAA,CAAmB,IAAA,CAAK,QAAQ,CAAA,IAAK,OAAA;AAAA,IAC/C,QAAA,EAAU,kBAAA,CAAmB,IAAA,CAAK,QAAQ,CAAA,IAAK,QAAA;AAAA,IAC/C,QACE,kBAAA,CAAmB,IAAA,CAAK,cAAc,CAAA,IAAK,SAAS,MAAA,IAAU,MAAA;AAAA,IAChE,cACE,QAAA,CAAS,YAAA,IACT,kBAAA,CAAmB,IAAA,CAAK,YAAY,CAAA,IACpC,SAAA;AAAA,IACF,QAAA,EAAU,kBAAA,CAAmB,IAAA,CAAK,QAAQ,CAAA;AAAA,IAC1C,UAAA,EAAY,gBAAA,CAAiB,IAAA,CAAK,UAAU,CAAA;AAAA,IAC5C,eACE,OAAO,IAAA,CAAK,aAAA,KAAkB,SAAA,GAAY,KAAK,aAAA,GAAgB,KAAA;AAAA,IACjE,UAAA,EAAY,gBAAA,CAAiB,IAAA,CAAK,UAAU,CAAA;AAAA,IAC5C,eAAA;AAAA,IACA,mBAAA,EAAqB,kBAAA,CAAmB,IAAA,CAAK,mBAAmB,CAAA;AAAA,IAChE,oBAAA,EAAsB,gBAAA,CAAiB,IAAA,CAAK,oBAAoB,CAAA;AAAA,IAChE,oBAAA,EAAsB,kBAAA,CAAmB,IAAA,CAAK,oBAAoB,CAAA;AAAA,IAClE,mBAAA,EAAqB,gBAAA,CAAiB,IAAA,CAAK,mBAAmB,CAAA;AAAA,IAC9D,mBAAA,EAAqB,kBAAA,CAAmB,IAAA,CAAK,mBAAmB,CAAA;AAAA,IAChE,MAAA,EAAQ,kBAAA,CAAmB,IAAA,CAAK,MAAM,CAAA;AAAA,IACtC,YAAA,EAAc,kBAAA,CAAmB,IAAA,CAAK,YAAY,CAAA;AAAA,IAClD,kBAAA,EAAoB,kBAAA,CAAmB,IAAA,CAAK,kBAAkB,CAAA;AAAA,IAC9D,UAAA,EAAY,kBAAA,CAAmB,IAAA,CAAK,UAAU,CAAA;AAAA,IAC9C,gBAAA,EAAkB,uBAAA,CAAwB,IAAI,CAAA,IAAK,MAAA;AAAA,IACnD,QAAA,EACE,mBAAmB,IAAA,CAAK,kBAAkB,KAC1C,kBAAA,CAAmB,IAAA,CAAK,QAAQ,CAAA,IAChC,IAAA;AAAA,IACF,gBACE,kBAAA,CAAmB,IAAA,CAAK,kBAAkB,CAAA,IAC1C,kBAAA,CAAmB,KAAK,cAAc,CAAA;AAAA,IACxC,gBAAA;AAAA,IACA,eAAe,mBAAA,CAAoB,MAAA;AAAA,IACnC,QAAA,EAAU,mBAAA;AAAA,IACV,aAAA;AAAA,IACA,UAAU,QAAA,CAAS;AAAA,GACrB;AACA,EAAA,IAAI,SAAS,SAAA,EAAW;AACtB,IAAA,OAAA,CAAQ,YAAY,QAAA,CAAS,SAAA;AAAA,EAC/B;AACA,EAAA,IAAI,SAAS,aAAA,EAAe;AAC1B,IAAA,OAAA,CAAQ,WAAW,QAAA,CAAS,aAAA;AAC5B,IAAA,OAAA,CAAQ,gBAAgB,QAAA,CAAS,aAAA;AAAA,EACnC;AACA,EAAA,IAAI,QAAA,CAAS,cAAc,MAAA,EAAW;AACpC,IAAA,OAAA,CAAQ,YAAY,QAAA,CAAS,SAAA;AAAA,EAC/B;AACA,EAAA,IAAI,SAAS,SAAA,EAAW;AACtB,IAAA,OAAA,CAAQ,YAAY,QAAA,CAAS,SAAA;AAAA,EAC/B;AACA,EAAA,IAAI,QAAA,CAAS,cAAc,MAAA,EAAW;AACpC,IAAA,OAAA,CAAQ,YAAY,QAAA,CAAS,SAAA;AAAA,EAC/B;AACA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,SAAS,KAAA,EAA+B;AAC/C,EAAA,IAAI,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxE,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,EAAC;AACV;AAEA,SAAS,mBAAmB,KAAA,EAAoC;AAC9D,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,CAAM,MAAK,CAAE,MAAA,GAAS,IACtD,KAAA,GACA,MAAA;AACN;AAEA,SAAS,aACP,KAAA,EACsB;AACtB,EAAA,MAAM,UAAA,GAAa,mBAAmB,KAAK,CAAA;AAC3C,EAAA,OAAO,aAAc,UAAA,GAA+B,IAAA;AACtD;AAEA,SAAS,iBAAiB,KAAA,EAAoC;AAC5D,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,QAAA,CAAS,KAAK,IACrD,KAAA,GACA,MAAA;AACN;AAEA,SAAS,eAAA,CACP,QACA,GAAA,EACoB;AACpB,EAAA,MAAM,KAAA,GAAQ,OAAO,GAAG,CAAA;AACxB,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,MAAA;AAC7C;AAEA,SAAS,aAAa,KAAA,EAA0B;AAC9C,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACzB,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,OAAO,KAAA,CACJ,GAAA,CAAI,CAAC,KAAA,KAAU,kBAAA,CAAmB,KAAK,CAAC,CAAA,CACxC,MAAA,CAAO,CAAC,KAAA,KAA2B,KAAA,KAAU,MAAS,CAAA;AAC3D;AAEA,SAAS,oBAAoB,KAAA,EAAwC;AACnE,EAAA,MAAM,MAAA,GAAS,SAAS,KAAK,CAAA;AAC7B,EAAA,MAAM,EAAA,GAAK,YAAA,CAA+B,MAAA,CAAO,GAAG,CAAA;AACpD,EAAA,MAAM,YAAA,GAAe,gBAAA,CAAiB,MAAA,CAAO,aAAa,CAAA;AAC1D,EAAA,IAAI,EAAE,EAAA,IAAM,YAAA,KAAiB,MAAA,CAAA,EAAY;AACvC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,GAAA,GAAuB;AAAA,IAC3B,GAAA,EAAK,EAAA;AAAA,IACL,aAAA,EAAe,YAAA;AAAA,IACf,QAAA,EAAU,QAAA,CAAS,MAAA,CAAO,QAAQ;AAAA,GACpC;AACA,EAAA,MAAM,eAAA,GAAgD;AAAA,IACpD,eAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAA;AAAA,IACA,YAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,KAAA,MAAW,OAAO,eAAA,EAAiB;AACjC,IAAA,MAAMC,MAAAA,GAAQ,kBAAA,CAAmB,MAAA,CAAO,GAAG,CAAC,CAAA;AAC5C,IAAA,IAAIA,WAAU,MAAA,EAAW;AACvB,MAAA,GAAA,CAAI,GAAG,CAAA,GAAIA,MAAAA;AAAA,IACb;AAAA,EACF;AACA,EAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,MAAA,CAAO,SAAS,CAAA;AACnD,EAAA,IAAI,cAAc,MAAA,EAAW;AAC3B,IAAA,GAAA,CAAI,SAAA,GAAY,SAAA;AAAA,EAClB;AACA,EAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,MAAA,CAAO,SAAS,CAAA;AACnD,EAAA,IAAI,cAAc,MAAA,EAAW;AAC3B,IAAA,GAAA,CAAI,SAAA,GAAY,SAAA;AAAA,EAClB;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,4BACP,KAAA,EACgC;AAChC,EAAA,MAAM,MAAA,GAAS,SAAS,KAAK,CAAA;AAC7B,EAAA,MAAM,EAAA,GAAK,YAAA,CAAsC,MAAA,CAAO,GAAG,CAAA;AAC3D,EAAA,MAAM,UAAA,GAAa,YAAA,CAA+B,MAAA,CAAO,UAAU,CAAA;AACnE,EAAA,MAAM,SAAA,GAAY,YAAA,CAA+B,MAAA,CAAO,SAAS,CAAA;AACjE,EAAA,MAAM,YAAA,GAAe,gBAAA,CAAiB,MAAA,CAAO,aAAa,CAAA;AAC1D,EAAA,IAAI,EAAE,EAAA,IAAM,UAAA,IAAc,SAAA,IAAa,iBAAiB,MAAA,CAAA,EAAY;AAClE,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,EAAA;AAAA,IACL,aAAA,EAAe,YAAA;AAAA,IACf,SAAA,EAAW,gBAAA,CAAiB,MAAA,CAAO,SAAS,CAAA,IAAK,YAAA;AAAA,IACjD,SAAA,EAAW,kBAAA,CAAmB,MAAA,CAAO,SAAS,CAAA,IAAK,SAAA;AAAA,IACnD,aACE,OAAO,MAAA,CAAO,WAAA,KAAgB,SAAA,GAAY,OAAO,WAAA,GAAc,IAAA;AAAA,IACjE,SAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA,EAAW,kBAAA,CAAmB,MAAA,CAAO,SAAS,CAAA,IAAK,EAAA;AAAA,IACnD,SAAA,EAAW,gBAAA,CAAiB,MAAA,CAAO,SAAS,CAAA,IAAK;AAAA,GACnD;AACF;AAEA,SAAS,YAAY,KAAA,EAAgC;AACnD,EAAA,MAAM,MAAA,GAAS,SAAS,KAAK,CAAA;AAC7B,EAAA,MAAM,UAAA,GAAa,kBAAA,CAAmB,MAAA,CAAO,UAAU,CAAA;AACvD,EAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,MAAA,CAAO,QAAQ,CAAA;AACnD,EAAA,IAAI,EAAE,cAAc,QAAA,CAAA,EAAW;AAC7B,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,EAAE,YAAY,QAAA,EAAS;AAChC;AAEA,SAAS,YAAY,OAAA,EAAyC;AAC5D,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA;AAC1C,EAAA,MAAM,gBAAgB,OAAA,CAAQ,aAAA;AAC9B,EAAA,MAAM,aAAa,OAAA,CAAQ,IAAA;AAC3B,EAAA,MAAM,cAAc,OAAA,CAAQ,OAAA;AAC5B,EAAA,MAAM,YAAY,OAAA,CAAQ,KAAA;AAC1B,EAAA,MAAM,cAAc,QAAA,CAAS,OAAA;AAE7B,EAAA,IAAI,OAAO,aAAA,KAAkB,QAAA,IAAY,aAAA,CAAc,MAAK,EAAG;AAC7D,IAAA,OAAO,cAAc,IAAA,EAAK;AAAA,EAC5B;AACA,EAAA,IAAI,OAAO,UAAA,KAAe,QAAA,IAAY,UAAA,CAAW,MAAK,EAAG;AACvD,IAAA,OAAO,WAAW,IAAA,EAAK;AAAA,EACzB;AACA,EAAA,IAAI,OAAO,WAAA,KAAgB,QAAA,IAAY,WAAA,CAAY,MAAK,EAAG;AACzD,IAAA,OAAO,YAAY,IAAA,EAAK;AAAA,EAC1B;AACA,EAAA,IAAI,OAAO,SAAA,KAAc,QAAA,IAAY,SAAA,CAAU,MAAK,EAAG;AACrD,IAAA,OAAO,UAAU,IAAA,EAAK;AAAA,EACxB;AACA,EAAA,OAAO,OAAO,WAAA,KAAgB,QAAA,GAAW,WAAA,CAAY,MAAK,GAAI,EAAA;AAChE;AAEA,SAAS,iBAAiB,OAAA,EAAyC;AACjE,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,SAAA;AAAA,EACT;AAEA,EAAA,MAAM,aAAa,OAAA,CAAQ,UAAA;AAC3B,EAAA,OAAO,OAAO,eAAe,QAAA,IAAY,UAAA,CAAW,MAAK,CAAE,MAAA,GAAS,IAChE,UAAA,GACA,SAAA;AACN;AAEO,IAAM,sBAAsB,KAAA,CAAM;AAAA,EACvC,IAAA,EAAM;AAAA,IACJ,QAAA,EAAUC,CAAAA,CAAE,QAAA,CAASA,CAAAA,CAAE,QAAQ,CAAA;AAAA,IAC/B,UAAA,EAAYA,CAAAA,CAAE,QAAA,CAASA,CAAAA,CAAE,QAAQ,CAAA;AAAA,IACjC,MAAA,EAAQA,EAAE,MAAA;AAAO,GACnB;AAAA,EACA,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,OAAO,GAAA,EAAe,IAAA,KAAsC;AACnE,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,UAAA;AACpC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAO,EAAC;AAAA,IACV;AACA,IAAA,MAAM,QAAA,GAAW,MAAM,wBAAA,CAAyB,GAAA,EAAK,KAAK,CAAA;AAC1D,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,QAAA,IAAY,QAAA,CAAS,MAAA;AAC/C,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,EAAC;AAAA,IACV;AACA,IAAA,MAAM,KAAA,GAAQ,MAAM,0BAAA,CAA2B,GAAA,EAAK;AAAA,MAClD,WAAW,QAAA,CAAS,SAAA;AAAA,MACpB,SAAS,QAAA,CAAS;AAAA,KACnB,CAAA;AACD,IAAA,MAAM,OAAA,GAAU,KAAA,GAAQ,sBAAA,CAAuB,KAAK,CAAA,GAAI,MAAA;AACxD,IAAA,IAAI,EAAE,SAAS,OAAA,CAAA,EAAU;AACvB,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,MAAM,YAAY,MAAM,gBAAA,CAAiB,GAAA,EAAK,OAAA,EAAS,KAAK,MAAM,CAAA;AAClE,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,OAAO,EAAC;AAAA,IACV;AAGA,IAAA,MAAM,cAAA,GAAiB,QAAA,CAAS,QAAA,CAAS,cAAc,CAAA;AACvD,IAAA,MAAM,gBAAgB,IAAI,GAAA;AAAA,MACxB,YAAA,CAAa,eAAe,oBAAoB;AAAA,KAClD;AACA,IAAA,MAAM,eAAe,IAAI,GAAA;AAAA,MACvB,YAAA,CAAa,eAAe,iBAAiB;AAAA,KAC/C;AAGA,IAAA,MAAM,gBAAA,GAAmB,IAAI,GAAA,CAAY,aAAa,CAAA;AAGtD,IAAA,MAAM,KAAA,GAAA,CAAS,MAAM,wBAAA,CAAyB,GAAA,EAAK,KAAK,CAAA,EACrD,GAAA,CAAI,WAAW,CAAA,CACf,MAAA,CAAO,CAAC,IAAA,KAA0B,SAAS,IAAI,CAAA;AAElD,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,UAAA,IAAc,EAAE,CAAA;AAC5C,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,QAAA,IAAY,EAAE,CAAA;AAExC,MAAA,IAAI,aAAA,CAAc,IAAI,OAAO,CAAA,IAAK,CAAC,YAAA,CAAa,GAAA,CAAI,KAAK,CAAA,EAAG;AAC1D,QAAA,gBAAA,CAAiB,IAAI,KAAK,CAAA;AAAA,MAC5B;AACA,MAAA,IAAI,aAAA,CAAc,IAAI,KAAK,CAAA,IAAK,CAAC,YAAA,CAAa,GAAA,CAAI,OAAO,CAAA,EAAG;AAC1D,QAAA,gBAAA,CAAiB,IAAI,OAAO,CAAA;AAAA,MAC9B;AAAA,IACF;AAGA,IAAA,MAAM,aAAA,GAAA,CAAiB,MAAM,wBAAA,CAAyB,GAAA,EAAK,KAAK,CAAA,EAC7D,GAAA,CAAI,mBAAmB,CAAA,CACvB,MAAA;AAAA,MACC,CAAC,QAAA,KACC,QAAA,EAAU,QAAA,KAAa;AAAA,KAC3B;AAGF,IAAA,MAAM,iBAAA,uBAAwB,GAAA,CAAI;AAAA,MAChC,GAAG,YAAA,CAAa,QAAA,CAAS,QAAA,EAAU,iBAA4B,CAAA;AAAA,MAC/D,GAAG,YAAA,CAAa,QAAA,CAAS,MAAA,EAAQ,iBAA4B;AAAA,KAC9D,CAAA;AAGD,IAAA,MAAM,gBAAA,GAAmB,aAAA,CAAc,MAAA,CAAO,CAAC,CAAA,KAAM;AAEnD,MAAA,IAAI,kBAAkB,GAAA,CAAI,MAAA,CAAO,CAAA,CAAE,GAAG,CAAC,CAAA,EAAG;AACxC,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,OAAO,CAAA,CAAE,QAAA;AACf,MAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,IAAA,CAAK,kBAAkB,CAAA;AAC3D,MAAA,IAAI,QAAA,IAAY,gBAAA,CAAiB,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC9C,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,OAAO,KAAA,CAAM,IAAA;AAAA,QACX,CAAC,CAAA,KACE,MAAA,CAAO,CAAA,CAAE,UAAU,CAAA,KAAM,MAAA,CAAO,CAAA,CAAE,GAAG,CAAA,IACpC,gBAAA,CAAiB,GAAA,CAAI,CAAA,CAAE,QAAA,IAAY,EAAE,CAAA,IACtC,MAAA,CAAO,CAAA,CAAE,QAAQ,CAAA,KAAM,MAAA,CAAO,CAAA,CAAE,GAAG,CAAA,IAClC,gBAAA,CAAiB,GAAA,CAAI,CAAA,CAAE,UAAA,IAAc,EAAE;AAAA,OAC7C;AAAA,IACF,CAAC,CAAA;AAGD,IAAA,MAAM,iBAAA,GAAoB,MAAM,OAAA,CAAQ,GAAA;AAAA,MACtC,gBAAA,CAAiB,GAAA;AAAA,QAAI,CAAC,CAAA,KACpB,2BAAA;AAAA,UACE,GAAA;AAAA,UACA,CAAA;AAAA,UACA,KAAA;AAAA,UACA,aAAA;AAAA,UACA,YAAA;AAAA,UACA;AAAA;AACF;AACF,KACF;AAGA,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,IAAA,OAAO,iBAAA,CAAkB,MAAA,CAAO,CAAC,CAAA,KAAM;AACrC,MAAA,IAAI,KAAK,GAAA,CAAI,MAAA,CAAO,CAAA,CAAE,GAAG,CAAC,CAAA,EAAG;AAC3B,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,CAAA,CAAE,GAAG,CAAC,CAAA;AACtB,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH;AACF,CAAC;AAUM,IAAM,kBAAkB,KAAA,CAAM;AAAA,EACnC,IAAA,EAAM;AAAA,IACJ,QAAA,EAAUA,CAAAA,CAAE,QAAA,CAASA,CAAAA,CAAE,QAAQ,CAAA;AAAA,IAC/B,UAAA,EAAYA,CAAAA,CAAE,QAAA,CAASA,CAAAA,CAAE,QAAQ,CAAA;AAAA,IACjC,MAAA,EAAQA,EAAE,MAAA;AAAO,GACnB;AAAA,EACA,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,OAAO,GAAA,EAAe,IAAA,KAAsC;AACnE,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,UAAA;AACpC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAO,EAAC;AAAA,IACV;AACA,IAAA,MAAM,QAAA,GAAW,MAAM,wBAAA,CAAyB,GAAA,EAAK,KAAK,CAAA;AAC1D,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,QAAA,IAAY,QAAA,CAAS,MAAA;AAC/C,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,EAAC;AAAA,IACV;AACA,IAAA,MAAM,KAAA,GAAQ,MAAM,0BAAA,CAA2B,GAAA,EAAK;AAAA,MAClD,WAAW,QAAA,CAAS,SAAA;AAAA,MACpB,SAAS,QAAA,CAAS;AAAA,KACnB,CAAA;AACD,IAAA,MAAM,OAAA,GAAU,KAAA,GAAQ,sBAAA,CAAuB,KAAK,CAAA,GAAI,MAAA;AACxD,IAAA,IAAI,EAAE,SAAS,OAAA,CAAA,EAAU;AACvB,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,MAAM,YAAY,MAAM,gBAAA,CAAiB,GAAA,EAAK,OAAA,EAAS,KAAK,MAAM,CAAA;AAClE,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,MAAM,YAAA,GAAA,CAAgB,MAAM,wBAAA,CAAyB,GAAA,EAAK,KAAK,CAAA,EAC5D,GAAA,CAAI,mBAAmB,CAAA,CACvB,MAAA;AAAA,MACC,CAAC,QAAA,KACC,QAAA,EAAU,QAAA,KAAa;AAAA,KAC3B;AAGF,IAAA,MAAM,mBAAA,GAAsB,YAAA,CAAa,MAAA,CAAO,CAAC,CAAA,KAAM;AACrD,MAAA,MAAM,OAAO,CAAA,CAAE,QAAA;AACf,MAAA,OACE,IAAA,CAAK,eAAA,KAAoB,eAAA,IACzB,IAAA,CAAK,eAAA,KAAoB,QAAA;AAAA,IAE7B,CAAC,CAAA;AAGD,IAAA,MAAM,eAAA,GAAkB,QAAA,CAAS,QAAA,CAAS,cAAc,CAAA;AACxD,IAAA,MAAM,eAAA,GAAkB,sBAAA,CAAuB,eAAA,EAAiB,QAAQ,CAAA;AAGxE,IAAA,MAAM,eAAA,GAAkB,mBAAA,CAAoB,MAAA,CAAO,CAAC,CAAA,KAAM;AACxD,MAAA,MAAM,OAAO,CAAA,CAAE,QAAA;AAGf,MAAA,IAAI,2BAAA,CAA4B,IAAA,EAAM,QAAQ,CAAA,EAAG;AAC/C,QAAA,OAAO,IAAA;AAAA,MACT;AAGA,MAAA,IACE,IAAA,CAAK,sBACL,eAAA,CAAgB,GAAA,CAAI,OAAO,IAAA,CAAK,kBAAkB,CAAC,CAAA,EACnD;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,IACE,IAAA,CAAK,kBACL,eAAA,CAAgB,GAAA,CAAI,OAAO,IAAA,CAAK,cAAc,CAAC,CAAA,EAC/C;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,IAAI,IAAA,CAAK,YAAY,eAAA,CAAgB,GAAA,CAAI,OAAO,IAAA,CAAK,QAAQ,CAAC,CAAA,EAAG;AAC/D,QAAA,OAAO,IAAA;AAAA,MACT;AAGA,MAAA,MAAM,UAAA,GAAa,YAAA,CAAa,IAAA,CAAK,gBAAgB,CAAA;AACrD,MAAA,IAAI,UAAA,CAAW,IAAA,CAAK,CAAC,EAAA,KAAO,eAAA,CAAgB,IAAI,MAAA,CAAO,EAAE,CAAC,CAAC,CAAA,EAAG;AAC5D,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,OAAO,KAAA;AAAA,IACT,CAAC,CAAA;AAGD,IAAA,MAAM,oBAAA,GAAuB,MAAM,OAAA,CAAQ,GAAA;AAAA,MACzC,eAAA,CAAgB,GAAA,CAAI,OAAO,CAAA,KAAM;AAC/B,QAAA,MAAM,OAAO,CAAA,CAAE,QAAA;AACf,QAAA,MAAM,CAAC,mBAAA,EAAqB,SAAS,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,UACzD,8BAAA,CAA+B,KAAK,CAAC,CAAA;AAAA,UACrC,OAAA,CAAQ,OAAA,CAAQ,oCAAA,CAAqC,IAAI,CAAC;AAAA,SAC3D,CAAA;AAED,QAAA,MAAM,qBAAqB,MAAM,4BAAA;AAAA,UAC/B,GAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,OAAO,gCAAA;AAAA,UACL,CAAA;AAAA,UACA,IAAA;AAAA,UACA,mBAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF,CAAC;AAAA,KACH;AAGA,IAAA,OAAO,oBAAA,CAAqB,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACzC,MAAA,IACE,CAAA,CAAE,eAAA,KAAoB,eAAA,IACtB,CAAA,CAAE,oBAAoB,QAAA,EACtB;AACA,QAAA,OAAO,EAAA;AAAA,MACT;AACA,MAAA,IACE,CAAA,CAAE,eAAA,KAAoB,QAAA,IACtB,CAAA,CAAE,oBAAoB,eAAA,EACtB;AACA,QAAA,OAAO,CAAA;AAAA,MACT;AACA,MAAA,OAAA,CAAQ,CAAA,CAAE,UAAA,IAAc,CAAA,KAAM,CAAA,CAAE,UAAA,IAAc,CAAA,CAAA;AAAA,IAChD,CAAC,CAAA;AAAA,EACH;AACF,CAAC","file":"epistemicQuestions.sprint.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","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.\n/**\n * Epistemic Questions API\n *\n * Clean API for managing questions in the epistemic spine (epistemicNodes).\n * This is the NEW API that replaces questions.ts for CREATE operations.\n *\n * Key differences from questions.ts:\n * - Writes ONLY to epistemicNodes (no dual-write)\n * - Uses epistemicNodes IDs directly (no legacyQuestionId lookups)\n * - Syncs to Neo4j after mutations\n * - Follows Lucern invariants strictly\n *\n * @see /docs/epistemic-invariants/00-epistemic-invariants.md\n */\n\nimport type { Doc, Id, MutationCtx, QueryCtx } from \"./convex\";\nimport {\n internal,\n internalMutation,\n internalQuery,\n mutation,\n query,\n} from \"./convex\";\nimport {\n debugGraphPrimitiveFallback,\n formatGraphPrimitiveError,\n} from \"./debug\";\nimport { resolveGraphPrimitivesAppResolvers } from \"./resolvers\";\nimport { resolveTopicProjectScope } from \"./topicScope\";\n\nexport interface EpistemicIndexBuilder {\n eq(field: string, value: unknown): EpistemicIndexBuilder;\n}\n\nexport interface EpistemicTableQuery<T> {\n collect(): Promise<T[]>;\n first(): Promise<T | null>;\n order(direction: \"asc\" | \"desc\"): EpistemicTableQuery<T>;\n take(limit: number): Promise<T[]>;\n withIndex(\n indexName: string,\n builder: (q: EpistemicIndexBuilder) => EpistemicIndexBuilder\n ): EpistemicTableQuery<T>;\n}\n\nexport interface EpistemicMutationSpec<ArgsSpec> {\n args: ArgsSpec;\n handler: (ctx: MutationCtx, args: ArgsSpec) => unknown | Promise<unknown>;\n returns?: unknown;\n}\n\nexport interface EpistemicQuerySpec<ArgsSpec> {\n args: ArgsSpec;\n handler: (ctx: QueryCtx, args: ArgsSpec) => unknown | Promise<unknown>;\n returns?: unknown;\n}\n\nexport interface EpistemicDbReader {\n get<TableName extends string>(\n id: Id<TableName>\n ): Promise<Doc<TableName> | null>;\n query<TableName extends string>(\n table: TableName\n ): EpistemicTableQuery<Doc<TableName>>;\n}\n\nexport const defineEpistemicMutation = mutation as unknown as <Args>(\n spec: EpistemicMutationSpec<Args>\n) => ReturnType<typeof mutation>;\n\nexport const defineEpistemicQuery = query as unknown as <Args>(\n spec: EpistemicQuerySpec<Args>\n) => ReturnType<typeof query>;\n\nexport const defineEpistemicInternalMutation = internalMutation as unknown as <\n Args,\n>(\n spec: EpistemicMutationSpec<Args>\n) => ReturnType<typeof internalMutation>;\n\nexport const defineEpistemicInternalQuery = internalQuery as unknown as <Args>(\n spec: EpistemicQuerySpec<Args>\n) => ReturnType<typeof internalQuery>;\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\nexport function generateContentHash(text: string): string {\n const content = `question:${text.trim().toLowerCase().replace(/\\s+/g, \" \")}`;\n let hash = 5381;\n const maxSigned32Bit = 2_147_483_647;\n const uint32Size = 4_294_967_296;\n for (let i = 0; i < content.length; i++) {\n hash = Math.imul(hash, 33) + content.charCodeAt(i);\n hash %= uint32Size;\n if (hash > maxSigned32Bit) {\n hash -= uint32Size;\n }\n }\n return Math.abs(hash).toString(16).padStart(8, \"0\");\n}\n\nexport function buildTestsEdgeGlobalId(\n fromGlobalId: string,\n toGlobalId: string\n): string {\n return `edge-${fromGlobalId}-tests-${toGlobalId}`;\n}\n\nexport async function markProjectGraphDirty(\n ctx: QueryCtx | MutationCtx,\n projectId: string | undefined | null,\n topicId?: string | undefined | null\n): Promise<void> {\n const markCacheStaleByTopic =\n internal.graphAnalysisCache.markCacheStaleByTopic;\n const normalizedProjectId =\n typeof projectId === \"string\" && projectId.trim().length > 0\n ? projectId\n : undefined;\n const normalizedTopicId =\n typeof topicId === \"string\" && topicId.trim().length > 0\n ? topicId\n : undefined;\n\n if (!(normalizedProjectId || normalizedTopicId)) {\n return;\n }\n\n if (normalizedProjectId) {\n await ctx.scheduler.runAfter(\n 0,\n internal.graphAnalysisCache.markCacheStaleInternal,\n {\n projectId: normalizedProjectId,\n }\n );\n }\n if (normalizedTopicId) {\n await ctx.scheduler.runAfter(0, markCacheStaleByTopic, {\n topicId: normalizedTopicId,\n });\n }\n const resolvedProjectId = normalizedTopicId ?? normalizedProjectId;\n if (!resolvedProjectId) {\n return;\n }\n await resolveGraphPrimitivesAppResolvers(ctx).patchProject(\n ctx,\n resolvedProjectId,\n {\n lastActivityAt: Date.now(),\n }\n );\n}\n\n// Valid question categories (pillars)\nexport type ValidCategory =\n | \"market\"\n | \"competition\"\n | \"product\"\n | \"team\"\n | \"financials\"\n | \"deal\"\n | \"risks\"\n | \"other\";\n\nexport function normalizeCategory(category?: string): ValidCategory {\n if (!category) {\n return \"other\";\n }\n const lower = category.toLowerCase();\n // Handle \"financial\" → \"financials\" mapping\n if (lower === \"financial\") {\n return \"financials\";\n }\n const validCategories: ValidCategory[] = [\n \"market\",\n \"competition\",\n \"product\",\n \"team\",\n \"financials\",\n \"deal\",\n \"risks\",\n ];\n return (validCategories.find((c) => lower.includes(c)) ||\n \"other\") as ValidCategory;\n}\n\nexport type QuestionNodeDoc = Doc<\"epistemicNodes\"> & {\n anonymizationClass?: string;\n audienceLabel?: string;\n canonicalText?: string;\n createdAt?: number;\n createdBy?: string;\n epistemicLayer?: string;\n exportClass?: string;\n metadata?: Record<string, unknown>;\n nodeType?: string;\n policyTags?: string[];\n projectId?: string;\n publicationStatus?: string;\n questionType?: string;\n sensitivityTier?: string;\n status?: string;\n tenantId?: string;\n topicId?: string;\n updatedAt?: number;\n workspaceId?: string;\n};\nconst DEFAULT_QUESTION_PAGE_SIZE = 250;\nexport const MAX_QUESTION_PAGE_SIZE = 1000;\nexport interface QuestionScopeArgs {\n projectId?: string | null;\n topicId?: string | null;\n}\nexport function clampQuestionLimit(\n limit: number | undefined,\n fallback = DEFAULT_QUESTION_PAGE_SIZE\n): number {\n if (!Number.isFinite(limit)) {\n return fallback;\n }\n return Math.max(\n 1,\n Math.min(Math.floor(limit as number), MAX_QUESTION_PAGE_SIZE)\n );\n}\n\nexport function dedupeQuestionNodes(\n nodes: QuestionNodeDoc[]\n): QuestionNodeDoc[] {\n const seen = new Set<string>();\n const deduped: QuestionNodeDoc[] = [];\n for (const node of nodes) {\n const id = String(node._id);\n if (seen.has(id)) {\n continue;\n }\n seen.add(id);\n deduped.push(node);\n }\n return deduped;\n}\n\nexport function normalizeQuestionTopicId(\n topicId: string | undefined | null\n): string | undefined {\n return typeof topicId === \"string\" && topicId.trim().length > 0\n ? topicId\n : undefined;\n}\n\nexport function resolveQuestionScopeId(scope: {\n projectId?: string | undefined;\n topicId?: string | undefined;\n}): string | undefined {\n return normalizeQuestionTopicId(scope.topicId);\n}\n\nexport function logQuestionFallback(\n message: string,\n error: unknown,\n context?: Record<string, unknown>\n): void {\n debugGraphPrimitiveFallback(message, {\n error: formatGraphPrimitiveError(error),\n ...context,\n });\n}\n\nexport async function resolveQuestionScopeOrNull(\n ctx: QueryCtx | MutationCtx,\n args: QuestionScopeArgs\n) {\n if (!args.topicId) {\n return null;\n }\n\n try {\n return await resolveTopicProjectScope(ctx, {\n projectId: args.projectId ?? undefined,\n topicId: args.topicId ?? undefined,\n });\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[epistemicQuestions] Failed to resolve question scope\",\n {\n error: formatGraphPrimitiveError(error),\n projectId: args.projectId,\n topicId: args.topicId,\n }\n );\n return null;\n }\n}\n\nexport async function getQuestionNodesForScope(\n ctx: QueryCtx | MutationCtx,\n scope: Awaited<ReturnType<typeof resolveTopicProjectScope>>,\n args?: { scanLimit?: number }\n): Promise<QuestionNodeDoc[]> {\n const fetchNodes = (query: EpistemicTableQuery<QuestionNodeDoc>) =>\n typeof args?.scanLimit === \"number\"\n ? query.order(\"desc\").take(args.scanLimit)\n : query.collect();\n\n const topicNodes = await fetchNodes(\n ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_topic_type\", (q: EpistemicIndexBuilder) =>\n q.eq(\"topicId\", scope.topicId).eq(\"nodeType\", \"question\")\n )\n );\n\n return dedupeQuestionNodes(topicNodes).filter((node) =>\n questionMatchesScope(node, scope)\n );\n}\n\nexport async function getQuestionEdgesForScope(\n ctx: QueryCtx | MutationCtx,\n scope: Awaited<ReturnType<typeof resolveTopicProjectScope>>\n) {\n if (!scope.topicId) {\n return [];\n }\n const query = ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_topic\", (q: EpistemicIndexBuilder) =>\n q.eq(\"topicId\", scope.topicId)\n );\n\n return await query.collect();\n}\n\nexport function questionMatchesScope(\n node: Pick<QuestionNodeDoc, \"topicId\" | \"projectId\">,\n scope: Awaited<ReturnType<typeof resolveTopicProjectScope>>\n): boolean {\n return (\n (scope.topicId !== undefined && node.topicId === scope.topicId) ||\n (scope.projectId !== undefined && node.projectId === scope.projectId)\n );\n}\n\nexport function resolveLinkedWorktreeId(\n meta: Record<string, unknown>\n): string | null {\n const linkedWorktreeId = meta.linkedWorktreeId;\n return typeof linkedWorktreeId === \"string\" && linkedWorktreeId.trim()\n ? linkedWorktreeId\n : null;\n}\n\nexport function buildLinkedWorktreeMetadata(\n linkedWorktreeId: string | null | undefined\n): Record<string, string> {\n return linkedWorktreeId\n ? {\n linkedWorktreeId,\n }\n : {};\n}\n\nexport function questionMatchesWorkflowLink(\n meta: Record<string, unknown>,\n workflow: {\n worktreeId?: string | null;\n sprintId?: string | null;\n }\n): boolean {\n const linkedWorktreeId = resolveLinkedWorktreeId(meta);\n return Boolean(\n linkedWorktreeId &&\n (linkedWorktreeId === workflow.worktreeId ||\n linkedWorktreeId === workflow.sprintId)\n );\n}\n\nexport function flattenQuestionNode(n: QuestionNodeDoc) {\n const meta = (n.metadata || {}) as Record<string, unknown>;\n const linkedWorktreeId = resolveLinkedWorktreeId(meta);\n return {\n ...n,\n question: n.canonicalText || \"\",\n category: (meta.category as string) || \"other\",\n priority: (meta.priority as string) || \"medium\",\n status:\n (meta.questionStatus as string) || (meta.status as string) || \"open\",\n beliefId: meta.linkedBeliefNodeId || meta.beliefId || null,\n relatedBeliefIds: (meta.relatedBeliefIds as string[]) || [],\n relatedInsightIds: (meta.relatedInsightIds as string[]) || [],\n linkedWorktreeId,\n sprintIndex: (meta.sprintIndex as number) || undefined,\n linkedBeliefId: meta.linkedBeliefNodeId || null,\n testType: (meta.testType as string) || \"validates\",\n importance: (meta.importance as number) || 5,\n isKeyQuestion: Boolean(meta.isKeyQuestion),\n answer: (meta.answer as string) || null,\n convictionStage: (meta.convictionStage as string) || null,\n conviction: meta.conviction ?? null,\n source: (meta.source as string) || \"ai_suggested\",\n };\n}\n\nexport function flattenInternalQuestionNode(n: QuestionNodeDoc) {\n const meta = (n.metadata || {}) as Record<string, unknown>;\n const flattened = flattenQuestionNode(n);\n return {\n ...flattened,\n _epistemicNodeId: n._id,\n questionType:\n n.questionType || (meta.questionType as string) || flattened.testType,\n linkedBeliefIds: flattened.relatedBeliefIds,\n audienceLabel: n.audienceLabel,\n policyTags: n.policyTags,\n sensitivityTier: n.sensitivityTier,\n exportClass: n.exportClass,\n anonymizationClass: n.anonymizationClass,\n };\n}\n\nconst INACTIVE_NODE_STATUSES = new Set([\"archived\", \"superseded\", \"deleted\"]);\n\nconst INACTIVE_METADATA_STATUSES = new Set([\n \"archived\",\n \"superseded\",\n \"deleted\",\n]);\n\nfunction getQuestionStatusCandidates(node: QuestionNodeDoc): string[] {\n const meta = (node.metadata || {}) as Record<string, unknown>;\n return [meta.questionStatus, meta.status, node.status].filter(\n (value): value is string => typeof value === \"string\"\n );\n}\n\nexport function isActiveQuestionNode(node: QuestionNodeDoc): boolean {\n if (\n typeof node.status === \"string\" &&\n INACTIVE_NODE_STATUSES.has(node.status)\n ) {\n return false;\n }\n return !getQuestionStatusCandidates(node).some((status) =>\n INACTIVE_METADATA_STATUSES.has(status.toLowerCase())\n );\n}\n\nexport function matchesRequestedQuestionStatus(\n node: QuestionNodeDoc,\n requestedStatus: string\n): boolean {\n const normalizedStatus = requestedStatus.toLowerCase();\n return getQuestionStatusCandidates(node).some(\n (status) => status.toLowerCase() === normalizedStatus\n );\n}\n\n// =============================================================================\n// CREATE\n// =============================================================================\n\n/**\n * Create a new question in the epistemic spine.\n * Returns the epistemicNodes ID directly (not a questions ID).\n */\n","// biome-ignore-all lint/style/useFilenamingConvention: Public graph-primitives wildcard-export path; rename requires an export-map migration.\nimport { resolveTopicProjectScope } from \"./topicScope\";\n\ntype UnknownRecord = Record<string, unknown>;\n\ninterface WorkflowBridgeQueryScope {\n eq(field: string, value: unknown): WorkflowBridgeQueryScope;\n}\n\ninterface WorkflowBridgeQuery<T> {\n collect(): Promise<T[]>;\n filter(\n predicate: (query: WorkflowBridgeQueryScope) => unknown\n ): WorkflowBridgeQuery<T>;\n first(): Promise<T | null>;\n order(direction: \"asc\" | \"desc\"): WorkflowBridgeQuery<T>;\n withIndex(\n indexName: string,\n range?: (q: WorkflowBridgeQueryScope) => unknown\n ): WorkflowBridgeQuery<T>;\n}\n\ninterface WorkflowBridgeContext {\n db: {\n get(id: string): Promise<unknown | null>;\n query(tableName: string): WorkflowBridgeQuery<unknown>;\n };\n}\n\nexport interface WorkflowLikeDoc {\n _id?: string;\n metadata?: Record<string, unknown>;\n projectId?: string;\n topicId?: string;\n [key: string]: unknown;\n}\n\nexport interface WorkflowBridgeResolution {\n inputId: string | null;\n projectId?: string;\n sprint: WorkflowLikeDoc | null;\n sprintId: string | null;\n topicId?: string;\n worktree: WorkflowLikeDoc | null;\n worktreeId: string | null;\n}\n\nexport function isLegacySprintDoc(doc: unknown): doc is WorkflowLikeDoc {\n if (!doc || typeof doc !== \"object\") {\n return false;\n }\n\n const metadata =\n typeof (doc as UnknownRecord).metadata === \"object\" &&\n (doc as UnknownRecord).metadata !== null\n ? ((doc as UnknownRecord).metadata as UnknownRecord)\n : undefined;\n\n if (metadata?.pairedSprintId) {\n return false;\n }\n\n return (\n \"sprintScope\" in doc ||\n \"targetPillar\" in doc ||\n \"pillarThesis\" in doc ||\n \"synthesisState\" in doc ||\n (\"projectId\" in doc && !(\"worktreeScope\" in doc))\n );\n}\n\nexport function isWorktreeDoc(doc: unknown): doc is WorkflowLikeDoc {\n if (!doc || typeof doc !== \"object\") {\n return false;\n }\n\n return (\n \"worktreeScope\" in doc ||\n \"targetBranch\" in doc ||\n \"campaign\" in doc ||\n \"executionBand\" in doc ||\n \"proofArtifacts\" in doc\n );\n}\n\nexport function getPairedSprintId(doc: WorkflowLikeDoc | null | undefined) {\n const pairedSprintId = doc?.metadata?.pairedSprintId;\n return typeof pairedSprintId === \"string\" && pairedSprintId.trim().length > 0\n ? pairedSprintId\n : null;\n}\n\nfunction getStringField(\n doc: WorkflowLikeDoc | null | undefined,\n field: \"topicId\" | \"projectId\"\n) {\n const value = doc?.[field];\n return typeof value === \"string\" && value.trim().length > 0\n ? value\n : undefined;\n}\n\nasync function findPairedWorktreeForSprint(\n ctx: WorkflowBridgeContext,\n sprint: WorkflowLikeDoc\n): Promise<WorkflowLikeDoc | null> {\n const sprintId =\n typeof sprint._id === \"string\" && sprint._id.length > 0 ? sprint._id : null;\n if (!sprintId || typeof ctx.db.query !== \"function\") {\n return null;\n }\n\n let topicId = getStringField(sprint, \"topicId\");\n if (!topicId) {\n try {\n const scope = await resolveTopicProjectScope(ctx, {\n topicId: getStringField(sprint, \"topicId\"),\n projectId: getStringField(sprint, \"projectId\"),\n });\n topicId = scope.topicId;\n } catch {\n topicId = undefined;\n }\n }\n\n if (!topicId) {\n return null;\n }\n\n const worktrees = await ctx.db\n .query(\"worktrees\")\n .withIndex(\"by_topicId\", (q) => q.eq(\"topicId\", topicId))\n .collect();\n\n return (\n worktrees.find(\n (worktree): worktree is WorkflowLikeDoc =>\n isWorktreeDoc(worktree) &&\n String(worktree.metadata?.pairedSprintId || \"\") === sprintId\n ) ?? null\n );\n}\n\nexport async function resolveWorkflowBridgeDoc(\n ctx: WorkflowBridgeContext,\n workflowId: string | null | undefined\n): Promise<WorkflowBridgeResolution> {\n const empty: WorkflowBridgeResolution = {\n inputId: workflowId ?? null,\n sprint: null,\n worktree: null,\n sprintId: null,\n worktreeId: null,\n };\n\n if (!workflowId) {\n return empty;\n }\n\n let doc: unknown;\n try {\n doc = await ctx.db.get(workflowId);\n } catch {\n return empty;\n }\n\n if (!doc || typeof doc !== \"object\") {\n return empty;\n }\n\n if (isLegacySprintDoc(doc)) {\n return await resolveLegacySprintBridge(ctx, empty, doc, workflowId);\n }\n\n return await resolveWorktreeBridge(ctx, empty, doc, workflowId);\n}\n\nasync function resolveLegacySprintBridge(\n ctx: WorkflowBridgeContext,\n empty: WorkflowBridgeResolution,\n sprint: WorkflowLikeDoc,\n workflowId: string\n): Promise<WorkflowBridgeResolution> {\n const worktree = await findPairedWorktreeForSprint(ctx, sprint);\n return {\n ...empty,\n sprint,\n worktree,\n sprintId: getDocumentIdOrFallback(sprint, workflowId),\n worktreeId: getDocumentIdOrFallback(worktree, null),\n topicId:\n getStringField(worktree, \"topicId\") ?? getStringField(sprint, \"topicId\"),\n projectId:\n getStringField(sprint, \"projectId\") ??\n getStringField(worktree, \"projectId\"),\n };\n}\n\nasync function resolveWorktreeBridge(\n ctx: WorkflowBridgeContext,\n empty: WorkflowBridgeResolution,\n doc: object,\n workflowId: string\n): Promise<WorkflowBridgeResolution> {\n const worktree = doc as WorkflowLikeDoc;\n const pairedSprintId = getPairedSprintId(worktree);\n const sprint = await readPairedSprint(ctx, pairedSprintId);\n\n return {\n ...empty,\n worktree,\n sprint,\n worktreeId: getDocumentIdOrFallback(worktree, workflowId),\n sprintId: getDocumentIdOrFallback(sprint, pairedSprintId),\n topicId:\n getStringField(worktree, \"topicId\") ?? getStringField(sprint, \"topicId\"),\n projectId:\n getStringField(sprint, \"projectId\") ??\n getStringField(worktree, \"projectId\"),\n };\n}\n\nasync function readPairedSprint(\n ctx: WorkflowBridgeContext,\n pairedSprintId: string | null\n): Promise<WorkflowLikeDoc | null> {\n if (!pairedSprintId) {\n return null;\n }\n try {\n const paired = await ctx.db.get(pairedSprintId);\n return isLegacySprintDoc(paired) ? paired : null;\n } catch {\n return null;\n }\n}\n\nfunction getDocumentIdOrFallback(\n doc: WorkflowLikeDoc | null | undefined,\n fallback: string | null\n): string | null {\n return typeof doc?._id === \"string\" && doc._id.length > 0\n ? doc._id\n : fallback;\n}\n","// biome-ignore-all lint/style/useFilenamingConvention: Public ABI surface; rename requires a cross-package migration update.\n/**\n * Epistemic Questions API\n *\n * Clean API for managing questions in the epistemic spine (epistemicNodes).\n * This is the NEW API that replaces questions.ts for CREATE operations.\n *\n * Key differences from questions.ts:\n * - Writes ONLY to epistemicNodes (no dual-write)\n * - Uses epistemicNodes IDs directly (no legacyQuestionId lookups)\n * - Syncs to Neo4j after mutations\n * - Follows Lucern invariants strictly\n *\n * @see /docs/epistemic-invariants/00-epistemic-invariants.md\n */\n\nimport { checkScopeAccess } from \"@lucern/access-control/access\";\nimport { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\nimport { v } from \"convex/values\";\nimport type { Id, QueryCtx } from \"./convex\";\nimport { query } from \"./convex\";\nimport {\n debugGraphPrimitiveFallback,\n formatGraphPrimitiveError,\n} from \"./debug\";\n// =============================================================================\n// HELPERS\nimport {\n getQuestionEdgesForScope,\n getQuestionNodesForScope,\n questionMatchesWorkflowLink,\n resolveLinkedWorktreeId,\n resolveQuestionScopeId,\n resolveQuestionScopeOrNull,\n} from \"./epistemicQuestions.helpers\";\nimport { resolveWorkflowBridgeDoc } from \"./workflowBridge\";\n\ntype UnknownRecord = Record<string, unknown>;\ninterface EdgeRef {\n fromNodeId?: string;\n toNodeId?: string;\n}\n\ninterface GetQuestionsForWorkflowArgs {\n sprintId?: string;\n userId: string;\n worktreeId?: string;\n}\n\ninterface QuestionNodeRow {\n _creationTime: number;\n _id: Id<\"epistemicNodes\">;\n canonicalText?: string;\n content?: string;\n createdAt?: number;\n createdBy?: string;\n metadata: UnknownRecord;\n nodeType?: string;\n projectId?: string;\n questionType?: string;\n sourceType?: string;\n status?: string;\n text?: string;\n title?: string;\n topicId?: string;\n updatedAt?: number;\n}\n\ninterface QuestionEvidenceLinkRow {\n _creationTime: number;\n _id: Id<\"questionEvidenceLinks\">;\n createdAt: number;\n createdBy: string;\n helpsAnswer: boolean;\n insightId: Id<\"epistemicNodes\">;\n questionId: Id<\"epistemicNodes\">;\n rationale: string;\n relevance: number;\n}\n\ninterface LinkedBeliefDetail {\n beliefId: string | Id<\"epistemicNodes\">;\n beliefText: string;\n isConditional: boolean;\n isHypothesis: boolean;\n isPrimaryTarget: boolean;\n isRaw: boolean;\n}\n\ninterface ClusterEnrichedQuestion {\n _creationTime: number;\n _id: Id<\"epistemicNodes\">;\n answer: string | null;\n beliefId: string | null;\n canonicalText?: string;\n category: string;\n conviction: number | null;\n convictionStage: string | null;\n isKeyQuestion: boolean;\n linkedBeliefs: (LinkedBeliefDetail | null)[];\n linkedWorktreeId: string | null;\n metadata: Record<string, unknown> | undefined;\n priority: string;\n projectId?: string;\n question?: string;\n questionType: string;\n relatedBeliefIds: string[];\n status: string;\n testLogic: string;\n testRationale: string | null;\n testType: string;\n topicId?: string | null;\n}\n\ninterface InConvictionQuestionEvidence {\n _id?: Id<\"questionEvidenceLinks\">;\n createdAt: number;\n createdBy: string;\n helpsAnswer: boolean;\n insightId: Id<\"epistemicNodes\">;\n insightSource: string;\n insightText: string;\n questionId: Id<\"epistemicNodes\">;\n rationale: string;\n relevance: number;\n}\n\ninterface InConvictionQuestion {\n _creationTime: number;\n _id: Id<\"epistemicNodes\">;\n answer: string | undefined;\n answerCompleteness: string | undefined;\n answerStatus: string | undefined;\n beliefId: string | null;\n canonicalText?: string;\n category: string;\n conviction: number | undefined;\n convictionAdvancedAt: number | undefined;\n convictionAdvancedBy: string | undefined;\n convictionRationale: string | undefined;\n convictionStage: string;\n convictionUpdatedAt: number | undefined;\n convictionUpdatedBy: string | undefined;\n createdAt?: number;\n createdBy?: string;\n evidence: InConvictionQuestionEvidence[];\n evidenceCount: number;\n importance: number | undefined;\n isKeyQuestion: boolean;\n linkedBeliefId: string | undefined;\n linkedWorktreeId: string | undefined;\n metadata?: Record<string, unknown> | null;\n priority: string;\n projectId?: string;\n question?: string;\n questionType: string;\n relatedBeliefIds: string[];\n status: string;\n testedBeliefs: (UnknownRecord | null)[];\n testType: string | undefined;\n updatedAt?: number;\n whatWeNeed: string | undefined;\n}\n\nfunction collectLinkedBeliefNodeIds(\n questionNodeId: Id<\"epistemicNodes\">,\n edges: EdgeRef[],\n currentMeta: UnknownRecord\n): string[] {\n const questionId = String(questionNodeId);\n const beliefNodeIds = new Set<string>();\n const primaryBeliefId = readOptionalString(currentMeta.linkedBeliefNodeId);\n if (primaryBeliefId) {\n beliefNodeIds.add(primaryBeliefId);\n }\n\n for (const edge of edges) {\n const fromNodeId = edge.fromNodeId ?? \"\";\n const toNodeId = edge.toNodeId ?? \"\";\n\n if (fromNodeId === questionId && toNodeId) {\n beliefNodeIds.add(toNodeId);\n }\n if (toNodeId === questionId && fromNodeId) {\n beliefNodeIds.add(fromNodeId);\n }\n }\n beliefNodeIds.delete(\"\");\n return Array.from(beliefNodeIds);\n}\n\nasync function collectClusterLinkedBeliefs(\n ctx: QueryCtx,\n linkedBeliefNodeIds: string[],\n clusterBeliefIds: Set<string>,\n hypothesisIds: Set<string>,\n rawBeliefIds: Set<string>\n): Promise<LinkedBeliefDetail[]> {\n const linkedBeliefs = await Promise.all(\n linkedBeliefNodeIds.map(async (beliefNodeId) => {\n const nodeId = readConvexId<\"epistemicNodes\">(beliefNodeId);\n const node = nodeId\n ? readQuestionNodeRow(await ctx.db.get(nodeId))\n : null;\n if (node?.nodeType !== \"belief\") {\n return null;\n }\n return {\n beliefId: node._id,\n beliefText: node.canonicalText ?? \"\",\n isHypothesis: hypothesisIds.has(beliefNodeId),\n isConditional:\n !(\n hypothesisIds.has(beliefNodeId) || rawBeliefIds.has(beliefNodeId)\n ) && clusterBeliefIds.has(beliefNodeId),\n isRaw: rawBeliefIds.has(beliefNodeId),\n isPrimaryTarget: hypothesisIds.has(beliefNodeId),\n };\n })\n );\n return linkedBeliefs.filter(\n (belief) => belief !== null\n ) as LinkedBeliefDetail[];\n}\n\nasync function enrichSprintClusterQuestion(\n ctx: QueryCtx,\n question: QuestionNodeRow,\n edges: EdgeRef[],\n hypothesisIds: Set<string>,\n rawBeliefIds: Set<string>,\n clusterBeliefIds: Set<string>\n): Promise<ClusterEnrichedQuestion> {\n const meta = question.metadata;\n const linkedBeliefNodeIds = collectLinkedBeliefNodeIds(\n question._id,\n edges,\n meta\n );\n const linkedBeliefs = await collectClusterLinkedBeliefs(\n ctx,\n linkedBeliefNodeIds,\n clusterBeliefIds,\n hypothesisIds,\n rawBeliefIds\n );\n\n const questionText = question.canonicalText;\n const payload: ClusterEnrichedQuestion = {\n _id: question._id,\n _creationTime: question._creationTime,\n questionType:\n question.questionType ??\n readOptionalString(meta.questionType) ??\n \"general\",\n category: readOptionalString(meta.category) ?? \"other\",\n priority: readOptionalString(meta.priority) ?? \"medium\",\n isKeyQuestion:\n typeof meta.isKeyQuestion === \"boolean\" ? meta.isKeyQuestion : false,\n testType: readOptionalString(meta.testType) ?? \"validates\",\n status: question.status ?? \"active\",\n testLogic: readOptionalString(meta.testType) ?? \"validates\",\n testRationale: readOptionalString(meta.rationale) ?? null,\n beliefId: readOptionalString(meta.linkedBeliefNodeId) ?? null,\n relatedBeliefIds: linkedBeliefNodeIds,\n // Conviction stage fields — needed by UI to show/hide action buttons\n convictionStage: readOptionalString(meta.convictionStage) ?? null,\n answer: readOptionalString(meta.answer) ?? null,\n conviction: readFiniteNumber(meta.conviction) ?? null,\n linkedWorktreeId: resolveLinkedWorktreeId(meta),\n linkedBeliefs,\n metadata: question.metadata,\n };\n if (question.projectId) {\n payload.projectId = question.projectId;\n }\n if (question.topicId) {\n payload.topicId = question.topicId;\n }\n if (questionText) {\n payload.canonicalText = questionText;\n payload.question = questionText; // legacy field name\n }\n return payload;\n}\n\nfunction collectSprintBeliefIds(\n sprintSynthesis: UnknownRecord,\n workflow: { worktree?: UnknownRecord | null; sprint?: UnknownRecord | null }\n): Set<string> {\n return new Set([\n ...toStringList(sprintSynthesis.synthesizedBeliefIds),\n ...(\n ((workflow.worktree?.targetBeliefIds as unknown[]) ||\n (workflow.sprint?.targetBeliefIds as unknown[]) ||\n []) as unknown[]\n ).map(String),\n ]);\n}\n\nfunction collectInConvictionQuestionBeliefIds(meta: UnknownRecord): string[] {\n const beliefIds = new Set<string>();\n const relatedIds = toStringList(meta.relatedBeliefIds);\n if (meta.linkedBeliefNodeId) {\n beliefIds.add(String(meta.linkedBeliefNodeId));\n }\n if (meta.linkedBeliefId) {\n beliefIds.add(String(meta.linkedBeliefId));\n }\n if (meta.beliefId) {\n beliefIds.add(String(meta.beliefId));\n }\n for (const beliefId of relatedIds) {\n beliefIds.add(String(beliefId));\n }\n return Array.from(beliefIds);\n}\n\nasync function collectQuestionEvidenceDetails(\n ctx: QueryCtx,\n q: QuestionNodeRow\n): Promise<InConvictionQuestionEvidence[]> {\n const evidenceLinks = await ctx.db\n .query(\"questionEvidenceLinks\")\n .withIndex(\"by_questionId\", (qb) => qb.eq(\"questionId\", q._id))\n .collect();\n\n const evidenceDetails: InConvictionQuestionEvidence[] = [];\n for (const rawLink of evidenceLinks) {\n const link = readQuestionEvidenceLinkRow(rawLink);\n if (!link) {\n continue;\n }\n const insight = readQuestionNodeRow(await ctx.db.get(link.insightId));\n evidenceDetails.push({\n ...link,\n insightText: getNodeText(insight),\n insightSource: getInsightSource(insight),\n });\n }\n return evidenceDetails;\n}\n\nasync function collectQuestionBeliefDetails(\n ctx: QueryCtx,\n beliefIds: string[]\n): Promise<UnknownRecord[]> {\n const beliefDetails = await Promise.all(\n beliefIds.map(async (beliefId) => {\n try {\n const nodeId = readConvexId<\"epistemicNodes\">(beliefId);\n const node = nodeId\n ? readQuestionNodeRow(await ctx.db.get(nodeId))\n : null;\n if (node && node.nodeType === \"belief\") {\n return {\n _id: node._id,\n belief: node.canonicalText ?? \"\",\n confidence: toRecord(node.metadata).confidence,\n pillar: readStringValue(toRecord(node.metadata), \"category\"),\n beliefType: node.status ?? \"active\",\n dependsOnCount: 0,\n cascadesToCount: 0,\n exclusiveWithCount: 0,\n };\n }\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[epistemicQuestions] Failed to hydrate linked belief\",\n {\n error: formatGraphPrimitiveError(error),\n beliefId,\n }\n );\n }\n return null;\n })\n );\n\n return beliefDetails.filter(Boolean) as UnknownRecord[];\n}\n\nfunction buildInConvictionQuestionPayload(\n question: QuestionNodeRow,\n meta: UnknownRecord,\n evidenceWithDetails: InConvictionQuestionEvidence[],\n testedBeliefs: UnknownRecord[]\n): InConvictionQuestion {\n const relatedBeliefIds = toStringList(meta.relatedBeliefIds);\n const convictionStage =\n readOptionalString(meta.convictionStage) ?? \"in_conviction\";\n const payload: InConvictionQuestion = {\n _id: question._id,\n _creationTime: question._creationTime,\n category: readOptionalString(meta.category) ?? \"other\",\n priority: readOptionalString(meta.priority) ?? \"medium\",\n status:\n readOptionalString(meta.questionStatus) ?? question.status ?? \"open\",\n questionType:\n question.questionType ??\n readOptionalString(meta.questionType) ??\n \"general\",\n testType: readOptionalString(meta.testType),\n importance: readFiniteNumber(meta.importance),\n isKeyQuestion:\n typeof meta.isKeyQuestion === \"boolean\" ? meta.isKeyQuestion : false,\n conviction: readFiniteNumber(meta.conviction),\n convictionStage,\n convictionRationale: readOptionalString(meta.convictionRationale),\n convictionAdvancedAt: readFiniteNumber(meta.convictionAdvancedAt),\n convictionAdvancedBy: readOptionalString(meta.convictionAdvancedBy),\n convictionUpdatedAt: readFiniteNumber(meta.convictionUpdatedAt),\n convictionUpdatedBy: readOptionalString(meta.convictionUpdatedBy),\n answer: readOptionalString(meta.answer),\n answerStatus: readOptionalString(meta.answerStatus),\n answerCompleteness: readOptionalString(meta.answerCompleteness),\n whatWeNeed: readOptionalString(meta.whatWeNeed),\n linkedWorktreeId: resolveLinkedWorktreeId(meta) || undefined,\n beliefId:\n readOptionalString(meta.linkedBeliefNodeId) ??\n readOptionalString(meta.beliefId) ??\n null,\n linkedBeliefId:\n readOptionalString(meta.linkedBeliefNodeId) ??\n readOptionalString(meta.linkedBeliefId),\n relatedBeliefIds,\n evidenceCount: evidenceWithDetails.length,\n evidence: evidenceWithDetails,\n testedBeliefs,\n metadata: question.metadata,\n };\n if (question.projectId) {\n payload.projectId = question.projectId;\n }\n if (question.canonicalText) {\n payload.question = question.canonicalText;\n payload.canonicalText = question.canonicalText;\n }\n if (question.createdAt !== undefined) {\n payload.createdAt = question.createdAt;\n }\n if (question.createdBy) {\n payload.createdBy = question.createdBy;\n }\n if (question.updatedAt !== undefined) {\n payload.updatedAt = question.updatedAt;\n }\n return payload;\n}\n\nfunction toRecord(value: unknown): UnknownRecord {\n if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\n return value as UnknownRecord;\n }\n return {};\n}\n\nfunction readOptionalString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim().length > 0\n ? value\n : undefined;\n}\n\nfunction readConvexId<TableName extends string>(\n value: unknown\n): Id<TableName> | null {\n const normalized = readOptionalString(value);\n return normalized ? (normalized as Id<TableName>) : null;\n}\n\nfunction readFiniteNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value)\n ? value\n : undefined;\n}\n\nfunction readStringValue(\n source: UnknownRecord,\n key: string\n): string | undefined {\n const value = source[key];\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction toStringList(value: unknown): string[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value\n .map((entry) => readOptionalString(entry))\n .filter((entry): entry is string => entry !== undefined);\n}\n\nfunction readQuestionNodeRow(value: unknown): QuestionNodeRow | null {\n const record = toRecord(value);\n const id = readConvexId<\"epistemicNodes\">(record._id);\n const creationTime = readFiniteNumber(record._creationTime);\n if (!(id && creationTime !== undefined)) {\n return null;\n }\n\n const row: QuestionNodeRow = {\n _id: id,\n _creationTime: creationTime,\n metadata: toRecord(record.metadata),\n };\n const optionalStrings: Array<keyof QuestionNodeRow> = [\n \"canonicalText\",\n \"content\",\n \"createdBy\",\n \"nodeType\",\n \"projectId\",\n \"questionType\",\n \"sourceType\",\n \"status\",\n \"text\",\n \"title\",\n \"topicId\",\n ];\n for (const key of optionalStrings) {\n const value = readOptionalString(record[key]);\n if (value !== undefined) {\n row[key] = value as never;\n }\n }\n const createdAt = readFiniteNumber(record.createdAt);\n if (createdAt !== undefined) {\n row.createdAt = createdAt;\n }\n const updatedAt = readFiniteNumber(record.updatedAt);\n if (updatedAt !== undefined) {\n row.updatedAt = updatedAt;\n }\n return row;\n}\n\nfunction readQuestionEvidenceLinkRow(\n value: unknown\n): QuestionEvidenceLinkRow | null {\n const record = toRecord(value);\n const id = readConvexId<\"questionEvidenceLinks\">(record._id);\n const questionId = readConvexId<\"epistemicNodes\">(record.questionId);\n const insightId = readConvexId<\"epistemicNodes\">(record.insightId);\n const creationTime = readFiniteNumber(record._creationTime);\n if (!(id && questionId && insightId && creationTime !== undefined)) {\n return null;\n }\n\n return {\n _id: id,\n _creationTime: creationTime,\n createdAt: readFiniteNumber(record.createdAt) ?? creationTime,\n createdBy: readOptionalString(record.createdBy) ?? \"unknown\",\n helpsAnswer:\n typeof record.helpsAnswer === \"boolean\" ? record.helpsAnswer : true,\n insightId,\n questionId,\n rationale: readOptionalString(record.rationale) ?? \"\",\n relevance: readFiniteNumber(record.relevance) ?? 0,\n };\n}\n\nfunction readEdgeRef(value: unknown): EdgeRef | null {\n const record = toRecord(value);\n const fromNodeId = readOptionalString(record.fromNodeId);\n const toNodeId = readOptionalString(record.toNodeId);\n if (!(fromNodeId || toNodeId)) {\n return null;\n }\n return { fromNodeId, toNodeId };\n}\n\nfunction getNodeText(insight: QuestionNodeRow | null): string {\n if (!insight) {\n return \"\";\n }\n\n const metadata = toRecord(insight.metadata);\n const canonicalText = insight.canonicalText;\n const legacyText = insight.text;\n const contentText = insight.content;\n const titleText = insight.title;\n const snippetText = metadata.snippet;\n\n if (typeof canonicalText === \"string\" && canonicalText.trim()) {\n return canonicalText.trim();\n }\n if (typeof legacyText === \"string\" && legacyText.trim()) {\n return legacyText.trim();\n }\n if (typeof contentText === \"string\" && contentText.trim()) {\n return contentText.trim();\n }\n if (typeof titleText === \"string\" && titleText.trim()) {\n return titleText.trim();\n }\n return typeof snippetText === \"string\" ? snippetText.trim() : \"\";\n}\n\nfunction getInsightSource(insight: QuestionNodeRow | null): string {\n if (!insight) {\n return \"unknown\";\n }\n\n const sourceType = insight.sourceType;\n return typeof sourceType === \"string\" && sourceType.trim().length > 0\n ? sourceType\n : \"unknown\";\n}\n\nexport const getForSprintCluster = query({\n args: {\n sprintId: v.optional(v.string()),\n worktreeId: v.optional(v.string()),\n userId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx: QueryCtx, args: GetQuestionsForWorkflowArgs) => {\n const docId = args.sprintId || args.worktreeId;\n if (!docId) {\n return [];\n }\n const workflow = await resolveWorkflowBridgeDoc(ctx, docId);\n const scopeDoc = workflow.worktree ?? workflow.sprint;\n if (!scopeDoc) {\n return [];\n }\n const scope = await resolveQuestionScopeOrNull(ctx, {\n projectId: workflow.projectId,\n topicId: workflow.topicId,\n });\n const scopeId = scope ? resolveQuestionScopeId(scope) : undefined;\n if (!(scope && scopeId)) {\n return [];\n }\n\n const hasAccess = await checkScopeAccess(ctx, scopeId, args.userId);\n if (!hasAccess) {\n return [];\n }\n\n // Get hypothesis and raw belief IDs from sprint synthesis state\n const synthesisState = toRecord(scopeDoc.synthesisState);\n const hypothesisIds = new Set(\n toStringList(synthesisState.synthesizedBeliefIds)\n );\n const rawBeliefIds = new Set(\n toStringList(synthesisState.originalBeliefIds)\n );\n\n // Cluster = hypotheses + conditionals (exclude raw beliefs)\n const clusterBeliefIds = new Set<string>(hypothesisIds);\n\n // Find conditionals via edges connected to hypotheses\n const edges = (await getQuestionEdgesForScope(ctx, scope))\n .map(readEdgeRef)\n .filter((edge): edge is EdgeRef => edge !== null);\n\n for (const edge of edges) {\n const fromStr = String(edge.fromNodeId || \"\");\n const toStr = String(edge.toNodeId || \"\");\n\n if (hypothesisIds.has(fromStr) && !rawBeliefIds.has(toStr)) {\n clusterBeliefIds.add(toStr);\n }\n if (hypothesisIds.has(toStr) && !rawBeliefIds.has(fromStr)) {\n clusterBeliefIds.add(fromStr);\n }\n }\n\n // Get all question-type epistemicNodes in the project\n const questionNodes = (await getQuestionNodesForScope(ctx, scope))\n .map(readQuestionNodeRow)\n .filter(\n (question): question is QuestionNodeRow =>\n question?.nodeType === \"question\"\n );\n\n // Include questions explicitly linked to the sprint via targetQuestionIds\n const sprintQuestionIds = new Set([\n ...toStringList(workflow.worktree?.targetQuestionIds as unknown),\n ...toStringList(workflow.sprint?.targetQuestionIds as unknown),\n ]);\n\n // Filter to questions linked to cluster beliefs OR explicitly in sprint\n const clusterQuestions = questionNodes.filter((q) => {\n // Always include questions explicitly added to this sprint\n if (sprintQuestionIds.has(String(q._id))) {\n return true;\n }\n // Include questions linked to cluster beliefs via metadata\n const meta = q.metadata;\n const linkedId = readOptionalString(meta.linkedBeliefNodeId);\n if (linkedId && clusterBeliefIds.has(linkedId)) {\n return true;\n }\n // Also check edges connecting this question to cluster beliefs\n return edges.some(\n (e) =>\n (String(e.fromNodeId) === String(q._id) &&\n clusterBeliefIds.has(e.toNodeId ?? \"\")) ||\n (String(e.toNodeId) === String(q._id) &&\n clusterBeliefIds.has(e.fromNodeId ?? \"\"))\n );\n });\n\n // Enrich with linked belief details\n const enrichedQuestions = await Promise.all(\n clusterQuestions.map((q) =>\n enrichSprintClusterQuestion(\n ctx,\n q,\n edges,\n hypothesisIds,\n rawBeliefIds,\n clusterBeliefIds\n )\n )\n );\n\n // Dedupe by question ID\n const seen = new Set<string>();\n return enrichedQuestions.filter((q) => {\n if (seen.has(String(q._id))) {\n return false;\n }\n seen.add(String(q._id));\n return true;\n });\n },\n});\n\n// =============================================================================\n// PORTED FROM questions.ts — 15 functions migrated to epistemicNodes\n// =============================================================================\n\n/**\n * 1. getInConviction - Get questions in conviction stage for a sprint\n * Ported from questions.ts lines 1008-1157\n */\nexport const getInConviction = query({\n args: {\n sprintId: v.optional(v.string()),\n worktreeId: v.optional(v.string()),\n userId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx: QueryCtx, args: GetQuestionsForWorkflowArgs) => {\n const docId = args.sprintId || args.worktreeId;\n if (!docId) {\n return [];\n }\n const workflow = await resolveWorkflowBridgeDoc(ctx, docId);\n const scopeDoc = workflow.worktree ?? workflow.sprint;\n if (!scopeDoc) {\n return [];\n }\n const scope = await resolveQuestionScopeOrNull(ctx, {\n projectId: workflow.projectId,\n topicId: workflow.topicId,\n });\n const scopeId = scope ? resolveQuestionScopeId(scope) : undefined;\n if (!(scope && scopeId)) {\n return [];\n }\n\n const hasAccess = await checkScopeAccess(ctx, scopeId, args.userId);\n if (!hasAccess) {\n return [];\n }\n\n const allQuestions = (await getQuestionNodesForScope(ctx, scope))\n .map(readQuestionNodeRow)\n .filter(\n (question): question is QuestionNodeRow =>\n question?.nodeType === \"question\"\n );\n\n // Filter to questions in conviction stages\n const convictionQuestions = allQuestions.filter((q) => {\n const meta = q.metadata;\n return (\n meta.convictionStage === \"in_conviction\" ||\n meta.convictionStage === \"scored\"\n );\n });\n\n // Get synthesized belief IDs from sprint\n const sprintSynthesis = toRecord(scopeDoc.synthesisState);\n const sprintBeliefIds = collectSprintBeliefIds(sprintSynthesis, workflow);\n\n // Filter to questions relevant to this sprint\n const sprintQuestions = convictionQuestions.filter((q) => {\n const meta = q.metadata;\n\n // Direct sprint link\n if (questionMatchesWorkflowLink(meta, workflow)) {\n return true;\n }\n\n // Linked to sprint beliefs via linkedBeliefNodeId\n if (\n meta.linkedBeliefNodeId &&\n sprintBeliefIds.has(String(meta.linkedBeliefNodeId))\n ) {\n return true;\n }\n if (\n meta.linkedBeliefId &&\n sprintBeliefIds.has(String(meta.linkedBeliefId))\n ) {\n return true;\n }\n if (meta.beliefId && sprintBeliefIds.has(String(meta.beliefId))) {\n return true;\n }\n\n // Linked via relatedBeliefIds\n const relatedIds = toStringList(meta.relatedBeliefIds);\n if (relatedIds.some((id) => sprintBeliefIds.has(String(id)))) {\n return true;\n }\n\n return false;\n });\n\n // Enrich with evidence and belief details\n const questionsWithDetails = await Promise.all(\n sprintQuestions.map(async (q) => {\n const meta = q.metadata;\n const [evidenceWithDetails, beliefIds] = await Promise.all([\n collectQuestionEvidenceDetails(ctx, q),\n Promise.resolve(collectInConvictionQuestionBeliefIds(meta)),\n ]);\n\n const beliefsWithDetails = await collectQuestionBeliefDetails(\n ctx,\n beliefIds\n );\n return buildInConvictionQuestionPayload(\n q,\n meta,\n evidenceWithDetails,\n beliefsWithDetails\n );\n })\n );\n\n // Sort: in_conviction first, then scored, then by importance\n return questionsWithDetails.sort((a, b) => {\n if (\n a.convictionStage === \"in_conviction\" &&\n b.convictionStage === \"scored\"\n ) {\n return -1;\n }\n if (\n a.convictionStage === \"scored\" &&\n b.convictionStage === \"in_conviction\"\n ) {\n return 1;\n }\n return (a.importance || 5) - (b.importance || 5);\n });\n },\n});\n\n/**\n * 2. advanceToConviction - Move a question to the conviction stage\n * Ported from questions.ts line 830\n */\n"]}
@@ -742,10 +742,10 @@ function normalizeQuestionTopicId(topicId) {
742
742
  return typeof topicId === "string" && topicId.trim().length > 0 ? topicId : void 0;
743
743
  }
744
744
  function resolveQuestionScopeId(scope) {
745
- return normalizeQuestionTopicId(scope.topicId) ?? scope.projectId ?? void 0;
745
+ return normalizeQuestionTopicId(scope.topicId);
746
746
  }
747
747
  async function resolveQuestionScopeOrNull(ctx, args) {
748
- if (!(args.projectId || args.topicId)) {
748
+ if (!args.topicId) {
749
749
  return null;
750
750
  }
751
751
  try {