@lucern/graph-primitives 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -12
- package/dist/beliefDecay.js +24 -17
- package/dist/beliefDecay.js.map +1 -1
- package/dist/beliefEvidenceLinks.js +32 -8
- package/dist/beliefEvidenceLinks.js.map +1 -1
- package/dist/confidencePropagationDispatch.js.map +1 -1
- package/dist/contradictions.js +32 -9
- package/dist/contradictions.js.map +1 -1
- package/dist/convex.d.ts +55 -12
- package/dist/convex.js.map +1 -1
- package/dist/edgeValidation.d.ts +25 -2
- package/dist/edges/index.d.ts +9 -2
- package/dist/edges/index.js.map +1 -1
- package/dist/edges/propagationTypes.d.ts +2 -3
- package/dist/edges/propagationTypes.js.map +1 -1
- package/dist/entityBridge.js +10 -3
- package/dist/entityBridge.js.map +1 -1
- package/dist/entityLifecycle.js +15 -3
- package/dist/entityLifecycle.js.map +1 -1
- package/dist/epistemicAnswers.js.map +1 -1
- package/dist/epistemicBeliefs.admin.d.ts +36 -0
- package/dist/epistemicBeliefs.admin.js +745 -0
- package/dist/epistemicBeliefs.admin.js.map +1 -0
- package/dist/epistemicBeliefs.backfills.d.ts +62 -0
- package/dist/epistemicBeliefs.backfills.js +1004 -0
- package/dist/epistemicBeliefs.backfills.js.map +1 -0
- package/dist/epistemicBeliefs.confidence.d.ts +45 -0
- package/dist/epistemicBeliefs.confidence.js +1285 -0
- package/dist/epistemicBeliefs.confidence.js.map +1 -0
- package/dist/epistemicBeliefs.core.d.ts +35 -0
- package/dist/epistemicBeliefs.core.js +1508 -0
- package/dist/epistemicBeliefs.core.js.map +1 -0
- package/dist/epistemicBeliefs.d.ts +12 -3
- package/dist/epistemicBeliefs.helpers.d.ts +168 -0
- package/dist/epistemicBeliefs.helpers.js +1060 -0
- package/dist/epistemicBeliefs.helpers.js.map +1 -0
- package/dist/epistemicBeliefs.internal.d.ts +30 -0
- package/dist/epistemicBeliefs.internal.js +1329 -0
- package/dist/epistemicBeliefs.internal.js.map +1 -0
- package/dist/epistemicBeliefs.js +1196 -1184
- package/dist/epistemicBeliefs.js.map +1 -1
- package/dist/epistemicBeliefs.lifecycle.d.ts +19 -0
- package/dist/epistemicBeliefs.lifecycle.js +1608 -0
- package/dist/epistemicBeliefs.lifecycle.js.map +1 -0
- package/dist/epistemicBeliefs.links.d.ts +30 -0
- package/dist/epistemicBeliefs.links.js +761 -0
- package/dist/epistemicBeliefs.links.js.map +1 -0
- package/dist/epistemicBeliefs.queries.d.ts +16 -0
- package/dist/epistemicBeliefs.queries.js +90 -0
- package/dist/epistemicBeliefs.queries.js.map +1 -0
- package/dist/epistemicContractHelpers.d.ts +1 -1
- package/dist/epistemicContractHelpers.js +1 -1
- package/dist/epistemicContracts.d.ts +5 -76
- package/dist/epistemicContracts.evaluators.d.ts +36 -0
- package/dist/epistemicContracts.evaluators.js +2506 -0
- package/dist/epistemicContracts.evaluators.js.map +1 -0
- package/dist/epistemicContracts.handlers.d.ts +40 -0
- package/dist/epistemicContracts.handlers.js +3029 -0
- package/dist/epistemicContracts.handlers.js.map +1 -0
- package/dist/epistemicContracts.js +2006 -5281
- package/dist/epistemicContracts.js.map +1 -1
- package/dist/epistemicContracts.metrics.d.ts +26 -0
- package/dist/epistemicContracts.metrics.js +427 -0
- package/dist/epistemicContracts.metrics.js.map +1 -0
- package/dist/epistemicContracts.types.d.ts +159 -0
- package/dist/epistemicContracts.types.js +3 -0
- package/dist/epistemicContracts.types.js.map +1 -0
- package/dist/epistemicEdgeCreation.d.ts +73 -0
- package/dist/epistemicEdgeCreation.js +450 -0
- package/dist/epistemicEdgeCreation.js.map +1 -0
- package/dist/epistemicEdges-BF-cn4i3.d.ts +43 -0
- package/dist/epistemicEdges.d.ts +8 -1
- package/dist/epistemicEdges.handlers.d.ts +20 -0
- package/dist/epistemicEdges.handlers.js +289 -0
- package/dist/epistemicEdges.handlers.js.map +1 -0
- package/dist/epistemicEdges.helpers.d.ts +27 -0
- package/dist/epistemicEdges.helpers.js +162 -0
- package/dist/epistemicEdges.helpers.js.map +1 -0
- package/dist/epistemicEdges.js +797 -875
- package/dist/epistemicEdges.js.map +1 -1
- package/dist/epistemicEdges.mutations.d.ts +39 -0
- package/dist/epistemicEdges.mutations.js +1365 -0
- package/dist/epistemicEdges.mutations.js.map +1 -0
- package/dist/epistemicEdges.queries.d.ts +95 -0
- package/dist/epistemicEdges.queries.js +851 -0
- package/dist/epistemicEdges.queries.js.map +1 -0
- package/dist/epistemicEdges.types.d.ts +32 -0
- package/dist/epistemicEdges.types.js +3 -0
- package/dist/epistemicEdges.types.js.map +1 -0
- package/dist/epistemicEvidence-DvfchNt7.d.ts +46 -0
- package/dist/epistemicEvidence.d.ts +5 -2
- package/dist/epistemicEvidence.js +801 -807
- package/dist/epistemicEvidence.js.map +1 -1
- package/dist/epistemicEvidenceHelpers.d.ts +71 -0
- package/dist/epistemicEvidenceHelpers.js +769 -0
- package/dist/epistemicEvidenceHelpers.js.map +1 -0
- package/dist/epistemicEvidenceMutations.d.ts +10 -0
- package/dist/epistemicEvidenceMutations.js +1421 -0
- package/dist/epistemicEvidenceMutations.js.map +1 -0
- package/dist/epistemicEvidenceQueries.d.ts +10 -0
- package/dist/epistemicEvidenceQueries.js +1049 -0
- package/dist/epistemicEvidenceQueries.js.map +1 -0
- package/dist/epistemicHelpers.d.ts +4 -2
- package/dist/epistemicHelpers.js +132 -127
- package/dist/epistemicHelpers.js.map +1 -1
- package/dist/epistemicLayerRules.d.ts +138 -0
- package/dist/epistemicLayerRules.js +481 -0
- package/dist/epistemicLayerRules.js.map +1 -0
- package/dist/epistemicLinking.js +1 -1
- package/dist/epistemicLinking.js.map +1 -1
- package/dist/epistemicNodeCreation.d.ts +101 -0
- package/dist/epistemicNodeCreation.js +709 -0
- package/dist/epistemicNodeCreation.js.map +1 -0
- package/dist/epistemicNodes-BCQxpYx_.d.ts +54 -0
- package/dist/epistemicNodes.d.ts +5 -1
- package/dist/epistemicNodes.helpers.d.ts +51 -0
- package/dist/epistemicNodes.helpers.js +73 -0
- package/dist/epistemicNodes.helpers.js.map +1 -0
- package/dist/epistemicNodes.internal.d.ts +34 -0
- package/dist/epistemicNodes.internal.js +658 -0
- package/dist/epistemicNodes.internal.js.map +1 -0
- package/dist/epistemicNodes.js +698 -693
- package/dist/epistemicNodes.js.map +1 -1
- package/dist/epistemicNodes.mutations.d.ts +34 -0
- package/dist/epistemicNodes.mutations.js +1153 -0
- package/dist/epistemicNodes.mutations.js.map +1 -0
- package/dist/epistemicNodes.queries.d.ts +36 -0
- package/dist/epistemicNodes.queries.js +619 -0
- package/dist/epistemicNodes.queries.js.map +1 -0
- package/dist/epistemicNodes.validators.d.ts +23 -0
- package/dist/epistemicNodes.validators.js +105 -0
- package/dist/epistemicNodes.validators.js.map +1 -0
- package/dist/epistemicQuestions-bwHd2FWE.d.ts +68 -0
- package/dist/epistemicQuestions.conviction.d.ts +52 -0
- package/dist/epistemicQuestions.conviction.js +1389 -0
- package/dist/epistemicQuestions.conviction.js.map +1 -0
- package/dist/epistemicQuestions.create.d.ts +29 -0
- package/dist/epistemicQuestions.create.js +1300 -0
- package/dist/epistemicQuestions.create.js.map +1 -0
- package/dist/epistemicQuestions.d.ts +10 -2
- package/dist/epistemicQuestions.evidence.d.ts +22 -0
- package/dist/epistemicQuestions.evidence.js +929 -0
- package/dist/epistemicQuestions.evidence.js.map +1 -0
- package/dist/epistemicQuestions.helpers.d.ts +69 -0
- package/dist/epistemicQuestions.helpers.js +824 -0
- package/dist/epistemicQuestions.helpers.js.map +1 -0
- package/dist/epistemicQuestions.js +2435 -2430
- package/dist/epistemicQuestions.js.map +1 -1
- package/dist/epistemicQuestions.lifecycle.d.ts +24 -0
- package/dist/epistemicQuestions.lifecycle.js +838 -0
- package/dist/epistemicQuestions.lifecycle.js.map +1 -0
- package/dist/epistemicQuestions.queries.d.ts +41 -0
- package/dist/epistemicQuestions.queries.js +1013 -0
- package/dist/epistemicQuestions.queries.js.map +1 -0
- package/dist/epistemicQuestions.sprint.d.ts +22 -0
- package/dist/epistemicQuestions.sprint.js +757 -0
- package/dist/epistemicQuestions.sprint.js.map +1 -0
- package/dist/epistemicQuestions.tail.d.ts +42 -0
- package/dist/epistemicQuestions.tail.js +1345 -0
- package/dist/epistemicQuestions.tail.js.map +1 -0
- package/dist/epistemicSources.js +6 -2
- package/dist/epistemicSources.js.map +1 -1
- package/dist/evaluators/index.d.ts +2 -2
- package/dist/evaluators/index.js +45 -5320
- package/dist/evaluators/index.js.map +1 -1
- package/dist/evaluators/lintCheckerEvaluator.d.ts +1 -1
- package/dist/evaluators/sentryCheckerEvaluator.d.ts +1 -1
- package/dist/evaluators/testRunnerEvaluator.d.ts +1 -1
- package/dist/evaluators/tscCheckerEvaluator.d.ts +1 -1
- package/dist/{graphTypes-CpgIuCdo.d.ts → graphTypes-B8VaIjnl.d.ts} +1 -1
- package/dist/graphTypes.d.ts +1 -1
- package/dist/{helpers-BYHIk5vU.d.ts → helpers-DNYfg6mo.d.ts} +2 -3
- package/dist/helpers.d.ts +2 -2
- package/dist/helpers.js.map +1 -1
- package/dist/{index-Dq-7R-gi.d.ts → index-C-Kyd7hD.d.ts} +1 -1
- package/dist/index.d.ts +160 -14
- package/dist/index.js +12291 -13001
- package/dist/index.js.map +1 -1
- package/dist/logicalRoleInference.js.map +1 -1
- package/dist/ontologyApproval.js +1 -1
- package/dist/ontologyApproval.js.map +1 -1
- package/dist/ontologyDefinitions.js +25 -7
- package/dist/ontologyDefinitions.js.map +1 -1
- package/dist/ontologyRegistry.js.map +1 -1
- package/dist/projectionReconciliation.js.map +1 -1
- package/dist/questionEvidenceLinks.js +28 -7
- package/dist/questionEvidenceLinks.js.map +1 -1
- package/dist/resolvers.js.map +1 -1
- package/dist/scopeResolverCompat.js.map +1 -1
- package/dist/topicProjectOverlay.js.map +1 -1
- package/dist/topicScope.js.map +1 -1
- package/dist/workflowBridge.js.map +1 -1
- package/dist/workspaceIsolation.js.map +1 -1
- package/package.json +4 -5
- package/dist/edgeValidation-CeI0wc0r.d.ts +0 -35
- package/dist/epistemicBeliefs-DzKjZAeC.d.ts +0 -377
- package/dist/epistemicEdges-CvlKnEyy.d.ts +0 -191
- package/dist/epistemicEvidence-xw6UUrwh.d.ts +0 -128
- package/dist/epistemicHelpers-DevrYgPN.d.ts +0 -329
- package/dist/epistemicNodes-DjSUfvyD.d.ts +0 -167
- package/dist/epistemicQuestions-B_nUclrH.d.ts +0 -214
- package/dist/index-Dct1T70K.d.ts +0 -25
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/convex.ts","../src/globalId.ts","../src/logicalRoleInference.ts","../src/debug.ts","../src/topicScope.ts","../src/epistemicBeliefs.helpers.ts","../src/epistemicBeliefs.links.ts"],"names":["v"],"mappings":"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","file":"epistemicBeliefs.links.js","sourcesContent":["import {\n actionGeneric,\n anyApi,\n componentsGeneric,\n httpActionGeneric,\n internalActionGeneric,\n internalMutationGeneric,\n internalQueryGeneric,\n mutationGeneric,\n queryGeneric,\n} from \"convex/server\";\nimport type { GenericId } from \"convex/values\";\n\nexport const api = anyApi as any;\nexport const components = componentsGeneric() as any;\nexport const internal = anyApi as any;\n\nexport type TableNames = string;\nexport type Id<TableName extends TableNames = string> = GenericId<TableName>;\nexport type Doc<TableName extends TableNames = string> = any;\nexport type DataModel = any;\ntype IndexRangeBuilder = {\n field(fieldName: string): string;\n eq(fieldName: string, value: unknown): IndexRangeBuilder;\n gt(fieldName: string, value: unknown): IndexRangeBuilder;\n gte(fieldName: string, value: unknown): IndexRangeBuilder;\n lt(fieldName: string, value: unknown): IndexRangeBuilder;\n lte(fieldName: string, value: unknown): IndexRangeBuilder;\n};\ntype FilterBuilder = {\n eq(left: unknown, right: unknown): unknown;\n neq(left: unknown, right: unknown): unknown;\n gt(left: unknown, right: unknown): unknown;\n gte(left: unknown, right: unknown): unknown;\n lt(left: unknown, right: unknown): unknown;\n lte(left: unknown, right: unknown): unknown;\n and(...clauses: unknown[]): unknown;\n or(...clauses: unknown[]): unknown;\n field(fieldName: string): unknown;\n};\ntype QueryInitializer<TableName extends TableNames> = {\n withIndex(\n indexName: string,\n range?: (q: any) => unknown\n ): QueryInitializer<TableName>;\n filter(predicate: (q: any) => unknown): QueryInitializer<TableName>;\n order(direction: \"asc\" | \"desc\"): QueryInitializer<TableName>;\n collect(): Promise<Doc<TableName>[]>;\n take(limit: number): Promise<Doc<TableName>[]>;\n first(): Promise<Doc<TableName> | null>;\n unique(): Promise<Doc<TableName> | null>;\n};\nexport type DatabaseReader = {\n get<TableName extends TableNames>(\n id: Id<TableName>\n ): Promise<Doc<TableName> | null>;\n query<TableName extends TableNames>(\n tableName: TableName\n ): QueryInitializer<TableName>;\n normalizeId?<TableName extends TableNames>(\n tableName: TableName,\n id: string\n ): Id<TableName> | null;\n};\nexport type DatabaseWriter = DatabaseReader & {\n insert<TableName extends TableNames>(\n tableName: TableName,\n value: Record<string, unknown>\n ): Promise<Id<TableName>>;\n patch<TableName extends TableNames>(\n id: Id<TableName>,\n value: Record<string, unknown>\n ): Promise<void>;\n replace<TableName extends TableNames>(\n id: Id<TableName>,\n value: Record<string, unknown>\n ): Promise<void>;\n delete<TableName extends TableNames>(id: Id<TableName>): Promise<void>;\n};\ntype Scheduler = {\n runAfter(delayMs: number, functionReference: unknown, args?: unknown): Promise<void>;\n};\ntype AuthReader = {\n getUserIdentity(): Promise<unknown>;\n};\ntype RuntimeInvoker = {\n runQuery(functionReference: unknown, args?: unknown): Promise<any>;\n runMutation(functionReference: unknown, args?: unknown): Promise<any>;\n runAction(functionReference: unknown, args?: unknown): Promise<any>;\n};\nexport type QueryCtx = RuntimeInvoker & {\n auth: AuthReader;\n db: DatabaseReader;\n scheduler: Scheduler;\n};\nexport type MutationCtx = RuntimeInvoker & {\n auth: AuthReader;\n db: DatabaseWriter;\n scheduler: Scheduler;\n};\nexport type ActionCtx = RuntimeInvoker & {\n auth: AuthReader;\n scheduler: Scheduler;\n};\n\ntype ConvexFunctionBuilder<Ctx> = <\n Definition extends { handler?: (ctx: Ctx, args: any) => any },\n>(\n definition: Definition\n) => any;\n\nexport const action = actionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const httpAction =\n httpActionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const internalAction =\n internalActionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const internalMutation =\n internalMutationGeneric as unknown as ConvexFunctionBuilder<MutationCtx>;\nexport const internalQuery =\n internalQueryGeneric as unknown as ConvexFunctionBuilder<QueryCtx>;\nexport const mutation =\n mutationGeneric as unknown as ConvexFunctionBuilder<MutationCtx>;\nexport const query = queryGeneric as unknown as ConvexFunctionBuilder<QueryCtx>;\n","/**\n * Shared UUID v4 generator for global IDs.\n *\n * Uses crypto.getRandomValues() for collision-safe generation.\n * Replaces the Math.random()-based UUID pattern that was duplicated\n * across 7+ files.\n *\n * @module convex/lib/globalId\n */\n\n/**\n * Generate a UUID v4 global ID using crypto-safe random bytes.\n */\nexport function generateGlobalId(): string {\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\n // Set version (4) and variant (RFC 4122)\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\")).join(\n \"\"\n );\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n","/**\n * logicalRoleInference module implementation.\n */\n\nimport type { Id, MutationCtx, QueryCtx } from \"./convex\";\n\ntype LogicalRole =\n | \"necessary\"\n | \"sufficient\"\n | \"necessary_sufficient\"\n | \"contributory\"\n | \"corroborative\";\n\nconst PILLAR_IMPORTANCE: Record<string, number> = {\n market: 1,\n competition: 2,\n product: 3,\n team: 4,\n financials: 5,\n timing: 6,\n other: 10,\n};\n\ntype GraphCtx = QueryCtx | MutationCtx;\n\ntype IndexQueryBuilder = {\n eq(field: string, value: unknown): IndexQueryBuilder;\n};\n\ntype EpistemicEdgeRecord = {\n fromNodeId?: string;\n toNodeId?: string;\n};\n\nexport async function computeLogicalRole(\n ctx: GraphCtx,\n evidenceId: Id<\"epistemicNodes\">,\n beliefId: Id<\"epistemicNodes\">\n): Promise<LogicalRole> {\n const belief = await ctx.db.get(beliefId);\n if (!belief || belief.nodeType !== \"belief\") {\n return \"contributory\";\n }\n\n const beliefMetadata = belief.metadata as Record<string, unknown> | undefined;\n const pillar = (beliefMetadata?.pillar as string) || \"other\";\n const pillarRank = PILLAR_IMPORTANCE[pillar] ?? 10;\n\n const isSynthesized = await checkIfSynthesizedHypothesis(ctx, beliefId);\n const testingQuestions = await getTestingQuestionsForBelief(ctx, beliefId);\n const answeredQuestions = await getQuestionsAnsweredByEvidence(\n ctx,\n evidenceId\n );\n const directlyTests = testingQuestions.filter((questionId) =>\n answeredQuestions.includes(questionId)\n );\n\n if (directlyTests.length === 0) {\n return \"contributory\";\n }\n\n if (isSynthesized && pillarRank <= 2) {\n return directlyTests.length > 1 ? \"necessary_sufficient\" : \"necessary\";\n }\n\n if (isSynthesized) {\n return \"necessary\";\n }\n\n return directlyTests.length > 1 ? \"necessary\" : \"contributory\";\n}\n\nasync function checkIfSynthesizedHypothesis(\n ctx: GraphCtx,\n beliefId: Id<\"epistemicNodes\">\n): Promise<boolean> {\n const belief = await ctx.db.get(beliefId);\n if (!belief) {\n return false;\n }\n\n const metadata = belief.metadata as Record<string, unknown> | undefined;\n return (\n metadata?.isSynthesized === true ||\n metadata?.beliefStatus === \"hypothesis\"\n );\n}\n\nasync function getTestingQuestionsForBelief(\n ctx: GraphCtx,\n beliefId: Id<\"epistemicNodes\">\n): Promise<string[]> {\n const testEdges = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_to_type\", (q: IndexQueryBuilder) =>\n q.eq(\"toNodeId\", beliefId).eq(\"edgeType\", \"tests\")\n )\n .collect() as EpistemicEdgeRecord[];\n\n return testEdges\n .map((edge: EpistemicEdgeRecord) => edge.fromNodeId as string)\n .filter((id): id is string => id !== undefined);\n}\n\nasync function getQuestionsAnsweredByEvidence(\n ctx: GraphCtx,\n evidenceId: Id<\"epistemicNodes\">\n): Promise<string[]> {\n const answerEdges = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from_type\", (q: IndexQueryBuilder) =>\n q.eq(\"fromNodeId\", evidenceId).eq(\"edgeType\", \"derived_from\")\n )\n .collect() as EpistemicEdgeRecord[];\n\n return answerEdges\n .map((edge: EpistemicEdgeRecord) => edge.toNodeId as string)\n .filter((id): id is string => id !== undefined);\n}\n","type GraphPrimitiveDebugEnvironment = {\n process?: {\n env?: Record<string, string | undefined>;\n };\n};\n\nfunction isGraphPrimitiveDebugEnabled(): boolean {\n const env = (globalThis as GraphPrimitiveDebugEnvironment).process?.env;\n return (\n env?.LUCERN_COMPAT_FALLBACK_DEBUG === \"1\" ||\n env?.LUCERN_GRAPH_DEBUG === \"1\"\n );\n}\n\nexport function formatGraphPrimitiveError(error: unknown): string {\n if (error instanceof Error) {\n return `${error.name}: ${error.message}`;\n }\n if (typeof error === \"string\") {\n return error;\n }\n if (error === null) {\n return \"null\";\n }\n if (error === undefined) {\n return \"undefined\";\n }\n try {\n return JSON.stringify(error);\n } catch {\n return Object.prototype.toString.call(error);\n }\n}\n\nexport function debugGraphPrimitiveFallback(\n message: string,\n context?: Record<string, unknown>\n): void {\n if (!isGraphPrimitiveDebugEnabled()) {\n return;\n }\n console.debug(message, context ?? {});\n}\n","/** Topic-scope resolution helpers for graph-primitive operations. */\nimport { v } from \"convex/values\";\nimport { api as appApi } from \"./convex\";\nimport type { Id } from \"./convex\";\nimport { debugGraphPrimitiveFallback } from \"./debug\";\n\nconst LEGACY_SCOPE_FIELD = \"graphScope\" + \"ProjectId\";\n\ntype TopicDoc = Record<string, unknown> & {\n _id: Id<\"topics\">;\n globalId?: string;\n name?: string;\n depth?: number;\n createdAt?: number;\n parentTopicId?: Id<\"topics\">;\n tenantId?: string;\n workspaceId?: string;\n metadata?: Record<string, unknown>;\n};\n\nexport type TopicProjectScope = {\n topicId: Id<\"topics\">;\n projectId?: string;\n tenantId?: string;\n workspaceId?: string;\n source: \"topic\" | \"project_mapped_topic\" | \"topic_inferred\";\n};\n\ntype MaterializedTopicNodeDoc = {\n _id: string | Id<\"epistemicNodes\">;\n metadata?: Record<string, unknown>;\n};\n\nfunction asMappedProjectId(\n topic: TopicDoc | null | undefined,\n): string | undefined {\n if (!topic) {\n return;\n }\n const directLegacyProjectId = normalizeScopeValue(topic[LEGACY_SCOPE_FIELD]);\n if (directLegacyProjectId) {\n return directLegacyProjectId;\n }\n const metadata = (topic.metadata || {}) as Record<string, unknown>;\n const candidate =\n (metadata[LEGACY_SCOPE_FIELD] as string | undefined) ||\n (metadata.legacyProjectId as string | undefined) ||\n (metadata.projectId as string | undefined) ||\n (metadata.scopeProjectId as string | undefined);\n return candidate ? (candidate as string) : undefined;\n}\n\nfunction normalizeScopeValue(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return;\n }\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction pickPrimaryTopic(candidates: TopicDoc[]): TopicDoc | undefined {\n return [...candidates].sort((a, b) => {\n const depthA = a.depth ?? 9999;\n const depthB = b.depth ?? 9999;\n if (depthA !== depthB) {\n return depthA - depthB;\n }\n const createdA = a.createdAt ?? Number.MAX_SAFE_INTEGER;\n const createdB = b.createdAt ?? Number.MAX_SAFE_INTEGER;\n if (createdA !== createdB) {\n return createdA - createdB;\n }\n return String(a.name || \"\").localeCompare(String(b.name || \"\"));\n })[0];\n}\n\nasync function findTopicsByScopeAlias(\n ctx: any,\n scopeId: string,\n): Promise<TopicDoc[]> {\n try {\n return (await ctx.db\n .query(\"topics\")\n .withIndex(\"by_graph_scope_project\", (q: any) =>\n q.eq(LEGACY_SCOPE_FIELD, scopeId),\n )\n .collect()) as TopicDoc[];\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to resolve scope alias via index\",\n {\n error,\n scopeId,\n },\n );\n // Older Lucern dev deployments can lag index backfills while still carrying\n // the underlying topics table. Scan and filter so scope resolution keeps\n // working during the rollout.\n const topics = (await ctx.db.query(\"topics\").collect()) as TopicDoc[];\n return topics.filter((topic) => {\n const normalizedGlobalId = normalizeScopeValue(topic.globalId);\n const mappedProjectId = asMappedProjectId(topic);\n return (\n String(topic._id) === scopeId ||\n normalizedGlobalId === scopeId ||\n mappedProjectId === scopeId\n );\n });\n }\n}\n\nasync function tryResolveHostTopicById(\n ctx: any,\n topicId: string,\n): Promise<TopicDoc | null> {\n if (typeof ctx.runQuery !== \"function\") {\n return null;\n }\n try {\n return ((await ctx.runQuery(appApi.topics.get as any, {\n id: topicId,\n })) ?? null) as TopicDoc | null;\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to resolve topic by host query\",\n {\n error,\n topicId,\n },\n );\n return null;\n }\n}\n\nasync function tryResolveHostTopicByLegacyScope(\n ctx: any,\n legacyScopeId: string,\n): Promise<TopicDoc | null> {\n if (typeof ctx.runQuery !== \"function\") {\n return null;\n }\n try {\n return ((await ctx.runQuery(appApi.topics.getByLegacyScopeId as any, {\n projectId: legacyScopeId,\n })) ?? null) as TopicDoc | null;\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to resolve topic by legacy scope\",\n {\n error,\n legacyScopeId,\n },\n );\n return null;\n }\n}\n\nexport function readMaterializedTopicTableId(\n topicNode: MaterializedTopicNodeDoc | null | undefined,\n): string | undefined {\n if (!topicNode) {\n return;\n }\n\n const metadata = (topicNode.metadata || {}) as Record<string, unknown>;\n const topicTableId =\n (metadata.topicTableId as string | undefined) ||\n (metadata.topicId as string | undefined);\n\n return typeof topicTableId === \"string\" && topicTableId.trim().length > 0\n ? topicTableId.trim()\n : undefined;\n}\n\n/**\n * Walk the topic parent chain to find inherited workspaceId and tenantId.\n * Mirrors the pattern used by resolveTopicOntology for ontologyId inheritance.\n * Max depth: 10 (defensive limit against pathological nesting).\n */\nasync function resolveInheritedWorkspaceScope(\n ctx: any,\n topic: TopicDoc,\n): Promise<{ tenantId?: string; workspaceId?: string }> {\n const MAX_DEPTH = 10;\n let tenantId = normalizeScopeValue(topic.tenantId);\n let workspaceId = normalizeScopeValue(topic.workspaceId);\n\n if (tenantId && workspaceId) {\n return { tenantId, workspaceId };\n }\n\n let current: TopicDoc | null = topic;\n for (let i = 0; i < MAX_DEPTH && current?.parentTopicId; i++) {\n current = (await ctx.db.get(current.parentTopicId)) as TopicDoc | null;\n if (!current) break;\n\n if (!tenantId) {\n tenantId = normalizeScopeValue(current.tenantId);\n }\n if (!workspaceId) {\n workspaceId = normalizeScopeValue(current.workspaceId);\n }\n if (tenantId && workspaceId) break;\n }\n\n return { tenantId, workspaceId };\n}\n\nexport async function resolveTopicProjectScope(\n ctx: any,\n args: { topicId?: Id<\"topics\"> | string; projectId?: string },\n): Promise<TopicProjectScope> {\n if (args.topicId) {\n // Try direct lookup, fall back to the legacy mapped-project bridge\n let topic: TopicDoc | null = null;\n try {\n topic = (await ctx.db.get(\n args.topicId as Id<\"topics\">,\n )) as TopicDoc | null;\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to load topic by direct id\",\n {\n error,\n topicId: args.topicId,\n },\n );\n // Not a valid topics table ID\n }\n if (!topic) {\n topic = await tryResolveHostTopicById(ctx, String(args.topicId));\n }\n if (!topic) {\n // Try as legacy projectId / globalId via the mapped-project bridge.\n topic =\n pickPrimaryTopic(\n await findTopicsByScopeAlias(ctx, String(args.topicId)),\n ) ?? null;\n }\n if (!topic) {\n throw new Error(`Topic not found: ${String(args.topicId)}`);\n }\n const inherited = await resolveInheritedWorkspaceScope(ctx, topic);\n const mapped = asMappedProjectId(topic);\n if (mapped) {\n return {\n topicId: topic._id,\n projectId: mapped,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"topic\",\n };\n }\n return {\n topicId: topic._id,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"topic\",\n };\n }\n\n if (args.projectId) {\n let directTopic: TopicDoc | null = null;\n try {\n directTopic = (await ctx.db.get(\n args.projectId as Id<\"topics\">,\n )) as TopicDoc | null;\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[topicScope] Failed to load direct project topic\",\n {\n error,\n projectId: args.projectId,\n },\n );\n // Not a valid topics table ID, continue to legacy graph-scope lookup.\n }\n\n if (directTopic) {\n const inherited = await resolveInheritedWorkspaceScope(ctx, directTopic);\n const mapped = asMappedProjectId(directTopic);\n return {\n topicId: directTopic._id,\n projectId: mapped ?? args.projectId,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"topic_inferred\",\n };\n }\n\n directTopic = await tryResolveHostTopicByLegacyScope(ctx, args.projectId);\n if (directTopic) {\n const inherited = await resolveInheritedWorkspaceScope(ctx, directTopic);\n const mapped = asMappedProjectId(directTopic);\n return {\n topicId: directTopic._id,\n projectId: mapped ?? args.projectId,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"topic_inferred\",\n };\n }\n\n const topics = await findTopicsByScopeAlias(ctx, args.projectId);\n const primary = pickPrimaryTopic(topics);\n if (primary) {\n const inherited = await resolveInheritedWorkspaceScope(ctx, primary);\n return {\n topicId: primary._id,\n projectId: args.projectId,\n tenantId: inherited.tenantId,\n workspaceId: inherited.workspaceId,\n source: \"project_mapped_topic\",\n };\n }\n throw new Error(\n `Legacy project scope ${String(args.projectId)} has no mapped topic.`,\n );\n }\n\n throw new Error(\n \"Missing scope: provide topicId (preferred) or legacy projectId alias.\",\n );\n}\n\n/** Shared scope args for graph-primitive functions. topicId is canonical; projectId is a legacy alias. */\nexport const optionalScopeArgs = {\n projectId: v.optional(v.string()),\n topicId: v.optional(v.string()),\n} as const;\n","/**\n * Epistemic Beliefs API\n *\n * Clean API for managing beliefs in the epistemic spine (epistemicNodes).\n * This is the NEW API that replaces beliefs.ts.\n *\n * Key differences from beliefs.ts:\n * - Writes ONLY to epistemicNodes (no dual-write)\n * - Uses epistemicNodes IDs directly (no runtime ID translation fallback)\n * - Syncs to Neo4j after mutations\n * - Follows Lucern invariants strictly\n *\n * @see /docs/epistemic-invariants/00-epistemic-invariants.md\n */\n\nimport { v } from \"convex/values\";\nimport {\n detectTupleContradiction,\n evaluateTupleContradictionTransition,\n confidenceFromSL,\n mkOpinion,\n normalizeTupleContradictionPolicy,\n readOpinionFromRecord,\n type ConfidencePolicyConfig,\n type Opinion,\n type SLOpinion,\n type SLOperator,\n} from \"@lucern/confidence\";\nimport {\n checkProjectAccess,\n checkScopeAccess,\n} from \"@lucern/access-control/access\";\nimport {\n canAudienceClassAccess,\n classFromAudienceKey,\n normalizeAudienceKey,\n} from \"@lucern/access-control/audience\";\nimport { listAudienceRegistryRows } from \"@lucern/access-control/audienceRegistry\";\nimport { getCurrentUserId } from \"@lucern/access-control/auth\";\nimport { assertSchemaEnumValue } from \"@lucern/contracts/schema-helpers/enumValidation\";\nimport { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\nimport {\n type BeliefLifecycleStatus,\n isPreValidationBeliefStatus,\n promoteBeliefStatusAfterScoring,\n resolveBeliefLifecycleStatus,\n} from \"./beliefLifecycle\";\nimport type { Doc, Id, MutationCtx, QueryCtx } from \"./convex\";\nimport {\n internal,\n internalMutation,\n internalQuery,\n mutation,\n query,\n} from \"./convex\";\nimport { collectConfidencePropagationDispatches } from \"./confidencePropagationDispatch\";\nimport { debugGraphPrimitiveFallback } from \"./debug\";\nimport {\n createInheritedContractRecord,\n type VerificationConfidenceTrigger,\n} from \"./epistemicContractHelpers\";\nimport { scheduleEmbeddingGeneration } from \"./embeddingTrigger\";\nimport { generateGlobalId } from \"./globalId\";\nimport { computeLogicalRole } from \"./logicalRoleInference\";\nimport { resolveGraphPrimitivesAppResolvers } from \"./resolvers\";\nimport { optionalScopeArgs, resolveTopicProjectScope } from \"./topicScope\";\nimport {\n assertTenantPackWorkspaceMutationAllowed,\n assertWorkspaceScopedEpistemicNodeScope,\n nodeMatchesWorkspaceReasoningScope,\n resolveNodeScopeForWorkspaceIsolation,\n resolveRuntimePackMutationContext,\n} from \"./workspaceIsolation\";\n\n// All IDs now use epistemicNodes exclusively\nexport const insightIdUnion = v.id(\"epistemicNodes\");\nconst DEFAULT_PROJECT_BELIEF_LIMIT = 250;\nexport const MAX_PROJECT_BELIEF_LIMIT = 1000;\nexport const optionalBeliefScopeArgs = optionalScopeArgs;\n\ntype StructuredMutationError = Error & {\n status: number;\n code: string;\n invariantCode?: string;\n suggestion?: string;\n details?: unknown;\n};\n\ntype BeliefScopeArgs = {\n projectId?: string | null;\n topicId?: string | null;\n};\n\ntype EpistemicNodeOpinionDoc = Doc<\"epistemicNodes\"> & {\n opinion_a?: number;\n opinion_b?: number;\n opinion_d?: number;\n opinion_u?: number;\n tupleContradicted?: boolean;\n userId?: string;\n metadata?: Record<string, unknown> | null;\n};\n\ntype EpistemicIndexQuery = {\n eq(field: string, value: unknown): EpistemicIndexQuery;\n gt(field: string, value: unknown): EpistemicIndexQuery;\n lt(field: string, value: unknown): EpistemicIndexQuery;\n field(field: string): string;\n};\n\ntype EpistemicQueryChain<T> = {\n withIndex(\n _name: string,\n callback: (q: EpistemicIndexQuery) => EpistemicIndexQuery,\n ): EpistemicQueryChain<T>;\n order(direction: \"asc\" | \"desc\"): EpistemicQueryChain<T>;\n filter(\n callback: (q: EpistemicIndexQuery) => EpistemicIndexQuery,\n ): EpistemicQueryChain<T>;\n first(): Promise<T | null>;\n collect(): Promise<T[]>;\n take(limit: number): Promise<T[]>;\n};\n\ntype EpistemicBeliefCtx = QueryCtx & {\n db: {\n query<T = unknown>(_table: string): EpistemicQueryChain<T>;\n get<T = unknown>(id: Id<string>): Promise<T | null>;\n };\n scheduler: {\n runAfter(\n _delayMs: number,\n _handler: unknown,\n _args: unknown,\n ): Promise<unknown>;\n };\n};\n\ntype AudienceClass = \"internal\" | \"restricted_external\" | \"public\";\n\nconst DEFAULT_CONFIDENCE_POLICY: ConfidencePolicyConfig = {\n scoringMode: \"after_worktree\",\n tupleContradiction: normalizeTupleContradictionPolicy(),\n};\n\nexport type BeliefConfidenceTrigger =\n | \"initial\"\n | \"evidence_added\"\n | \"evidence_removed\"\n | \"contradiction_detected\"\n | \"contradiction_resolved\"\n | \"manual\"\n | \"decay\"\n | \"agent_assessment\"\n | \"worktree_outcome\"\n | \"worktree_completed\"\n // SL-specific triggers\n | \"fusion\"\n | \"discount\"\n | \"deduction\"\n | \"backfill_synthetic\"\n | VerificationConfidenceTrigger;\n\nexport function throwStructuredMutationError(args: {\n message: string;\n status: number;\n code: string;\n invariantCode?: string;\n suggestion?: string;\n details?: unknown;\n}): never {\n const error = new Error(args.message) as StructuredMutationError;\n error.status = args.status;\n error.code = args.code;\n error.invariantCode = args.invariantCode;\n error.suggestion = args.suggestion;\n error.details = args.details;\n throw error;\n}\n\nexport function readFiniteNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value)\n ? value\n : undefined;\n}\n\nfunction clamp01(value: number): number {\n return Math.max(0, Math.min(1, value));\n}\n\nexport function assertBaseRateInRange(baseRate: number, field = \"baseRate\"): number {\n if (baseRate < 0 || baseRate > 1) {\n throwStructuredMutationError({\n message: `${field} must be within [0, 1].`,\n status: 400,\n code: \"INVALID_ARGUMENT\",\n invariantCode: \"request.valid_shape\",\n suggestion: `Clamp ${field} into the inclusive [0, 1] interval.`,\n details: { field, baseRate },\n });\n }\n return baseRate;\n}\n\nexport function buildBeliefConfidenceRow(args: {\n beliefId: Id<\"epistemicNodes\">;\n belief: number;\n disbelief: number;\n uncertainty: number;\n baseRate: number;\n trigger: BeliefConfidenceTrigger;\n rationale?: string;\n assessedBy: string;\n assessedAt: number;\n slOperator?: SLOperator;\n triggeringEvidenceId?: Id<\"epistemicNodes\">;\n triggeringContradictionId?: Id<\"contradictions\">;\n triggeringWorktreeId?: string;\n}) {\n return {\n beliefId: args.beliefId,\n confidence: confidenceFromSL(\n args.belief,\n args.disbelief,\n args.uncertainty,\n args.baseRate,\n ),\n belief: args.belief,\n disbelief: args.disbelief,\n uncertainty: args.uncertainty,\n baseRate: args.baseRate,\n slOperator: args.slOperator ?? (\"manual_assessment\" as const),\n trigger: args.trigger,\n ...(args.rationale ? { rationale: args.rationale } : {}),\n assessedBy: args.assessedBy,\n assessedAt: args.assessedAt,\n ...(args.triggeringEvidenceId\n ? {\n triggeringEvidenceId: args.triggeringEvidenceId,\n triggeringEvidenceIds: [String(args.triggeringEvidenceId)],\n }\n : {}),\n ...(args.triggeringContradictionId\n ? {\n triggeringContradictionId: args.triggeringContradictionId,\n }\n : {}),\n ...(args.triggeringWorktreeId\n ? { triggeringWorktreeId: args.triggeringWorktreeId }\n : {}),\n };\n}\n\ntype BeliefStatusResult =\n | { success: true }\n | { success: false; message: \"Evidence node not found\" };\n\nexport function buildBeliefStatusSuccessResult(): BeliefStatusResult {\n return { success: true };\n}\n\nexport function buildBeliefEvidenceNotFoundResult(): BeliefStatusResult {\n const result = {} as Extract<BeliefStatusResult, { success: false }>;\n result.success = false;\n result.message = \"Evidence node not found\";\n return result;\n}\n\nexport function deriveSyntheticBackfillOpinion(\n source: Record<string, unknown>,\n): SLOpinion {\n const belief =\n readFiniteNumber(source.opinion_b) ?? readFiniteNumber(source.belief);\n const disbelief =\n readFiniteNumber(source.opinion_d) ?? readFiniteNumber(source.disbelief);\n const uncertainty =\n readFiniteNumber(source.opinion_u) ?? readFiniteNumber(source.uncertainty);\n const baseRate =\n readFiniteNumber(source.opinion_a) ?? readFiniteNumber(source.baseRate);\n\n if (\n belief !== undefined ||\n disbelief !== undefined ||\n uncertainty !== undefined ||\n baseRate !== undefined\n ) {\n try {\n return readOpinionFromRecord(source);\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[epistemicBeliefs] Failed to decode legacy belief opinion\",\n {\n error,\n },\n );\n return mkOpinion(0, 0, 1, 0.5);\n }\n }\n\n const confidence = clamp01(readFiniteNumber(source.confidence) ?? 0);\n return mkOpinion(confidence, 1 - confidence, 0, 0.5);\n}\n\nexport function clampBeliefLimit(\n limit: number | undefined,\n fallback = DEFAULT_PROJECT_BELIEF_LIMIT,\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_PROJECT_BELIEF_LIMIT),\n );\n}\n\nexport function readTupleContradictedFlag(value: unknown): boolean | undefined {\n return typeof value === \"boolean\" ? value : undefined;\n}\n\nexport function readBeliefOpinionSnapshot(\n node: Doc<\"epistemicNodes\">,\n metadata: Record<string, unknown>,\n): SLOpinion {\n try {\n return readOpinionFromRecord({\n ...metadata,\n opinion_b: (node as any).opinion_b,\n opinion_d: (node as any).opinion_d,\n opinion_u: (node as any).opinion_u,\n opinion_a: (node as any).opinion_a,\n });\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[epistemicBeliefs] Failed to read belief opinion snapshot\",\n {\n error,\n beliefId: node._id,\n },\n );\n return mkOpinion(0, 0, 1, 0.5);\n }\n}\n\nexport function deriveTupleContradictionSeverity(\n node: Doc<\"epistemicNodes\">,\n): \"critical\" | \"significant\" | \"minor\" {\n const metadata = (node.metadata || {}) as Record<string, unknown>;\n const criticality =\n typeof metadata.criticality === \"string\" ? metadata.criticality : undefined;\n\n if (criticality === \"blocking\") {\n return \"critical\";\n }\n if (criticality === \"supporting\") {\n return \"minor\";\n }\n return \"significant\";\n}\n\nexport function formatTupleContradictionDescription(args: {\n opinion: Opinion;\n policy: ConfidencePolicyConfig[\"tupleContradiction\"];\n}): string {\n return `Tuple-space contradiction detected: b=${args.opinion.b.toFixed(2)} > ${args.policy.beliefThreshold.toFixed(2)} and d=${args.opinion.d.toFixed(2)} > ${args.policy.disbeliefThreshold.toFixed(2)}.`;\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\nexport function generateContentHash(text: string): string {\n const content = `belief:${text.trim().toLowerCase().replace(/\\s+/g, \" \")}`;\n let hash = 5381;\n for (let i = 0; i < content.length; i++) {\n hash = (hash << 5) + hash + content.charCodeAt(i);\n hash &= hash;\n }\n return Math.abs(hash).toString(16).padStart(8, \"0\");\n}\n\nexport function resolveBeliefWorktreeId(\n metadata: Record<string, unknown> | undefined,\n): string | undefined {\n const worktreeId = metadata?.worktreeId;\n if (typeof worktreeId === \"string\" && worktreeId.trim().length > 0) {\n return worktreeId;\n }\n\n const sprintId = metadata?.sprintId;\n return typeof sprintId === \"string\" && sprintId.trim().length > 0\n ? sprintId\n : undefined;\n}\n\n// Map pillar names to valid pillar literals\ntype ValidPillar =\n | \"market\"\n | \"competition\"\n | \"product\"\n | \"team\"\n | \"financials\"\n | \"regulatory\"\n | \"timing\"\n | \"customer\"\n | \"technology\"\n | \"distribution\"\n | \"deal\"\n | \"risks\"\n | \"other\";\n\nexport function normalizePillar(pillar?: string): ValidPillar {\n if (!pillar) {\n return \"other\";\n }\n const lower = pillar.toLowerCase();\n const validPillars: ValidPillar[] = [\n \"market\",\n \"competition\",\n \"product\",\n \"team\",\n \"financials\",\n \"regulatory\",\n \"timing\",\n \"customer\",\n \"technology\",\n \"distribution\",\n \"deal\",\n \"risks\",\n ];\n return (validPillars.find((p) => lower.includes(p)) ||\n \"other\") as ValidPillar;\n}\n\nexport async function markBeliefGraphDirty(\n ctx: EpistemicBeliefCtx,\n scope: { projectId?: string | null; topicId?: string | null },\n): Promise<void> {\n const projectId =\n typeof scope.projectId === \"string\" && scope.projectId.trim().length > 0\n ? scope.projectId\n : undefined;\n const topicId =\n typeof scope.topicId === \"string\" && scope.topicId.trim().length > 0\n ? scope.topicId\n : undefined;\n\n if (!projectId && !topicId) {\n return;\n }\n\n if (projectId) {\n await ctx.scheduler.runAfter(\n 0,\n internal.graphAnalysisCache.markCacheStaleInternal,\n { projectId },\n );\n }\n if (topicId) {\n await ctx.scheduler.runAfter(\n 0,\n internal.graphAnalysisCache.markCacheStaleByTopic,\n { topicId },\n );\n }\n\n await resolveGraphPrimitivesAppResolvers(ctx).patchProject(\n ctx,\n topicId ?? projectId!,\n {\n lastActivityAt: Date.now(),\n },\n );\n}\n\nexport async function resolveBeliefScopeOrNull(\n ctx: QueryCtx,\n args: BeliefScopeArgs,\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 \"[epistemicBeliefs] Failed to resolve belief scope\",\n {\n error,\n projectId: args.projectId,\n topicId: args.topicId,\n },\n );\n return null;\n }\n}\n\nexport async function getBeliefNodesForScope(\n ctx: EpistemicBeliefCtx,\n scope: Awaited<ReturnType<typeof resolveTopicProjectScope>>,\n args?: { scanLimit?: number; status?: string },\n) {\n const baseQuery = ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_topic_type\", (q: any) =>\n q.eq(\"topicId\", scope.topicId).eq(\"nodeType\", \"belief\"),\n );\n const nodes: EpistemicNodeOpinionDoc[] =\n typeof args?.scanLimit === \"number\"\n ? (await baseQuery.order(\"desc\").take(args.scanLimit)) as EpistemicNodeOpinionDoc[]\n : (await baseQuery.collect()) as EpistemicNodeOpinionDoc[];\n const scopedNodes = nodes.filter((node: Doc<\"epistemicNodes\">) =>\n nodeMatchesWorkspaceReasoningScope(node, scope),\n );\n\n if (!args?.status) {\n return scopedNodes;\n }\n\n return scopedNodes.filter((node: EpistemicNodeOpinionDoc) => node.status === args.status);\n}\n\nexport function createBeliefAudienceResolver(\n registryRows: Array<{\n audienceKey?: string | null;\n audienceClass: AudienceClass;\n }>,\n) {\n const audienceClassByKey = new Map<string, AudienceClass>(\n registryRows.map((row) => [\n normalizeAudienceKey(row.audienceKey),\n row.audienceClass,\n ]),\n );\n\n return (\n audienceKey: string | undefined | null,\n fallback: AudienceClass,\n ): AudienceClass => {\n const key = normalizeAudienceKey(audienceKey);\n if (!key) {\n return fallback;\n }\n return (\n audienceClassByKey.get(key) ??\n (classFromAudienceKey(key, fallback) as AudienceClass)\n );\n };\n}\n\nexport function flattenBeliefNode(node: Doc<\"epistemicNodes\">) {\n const meta = (node.metadata || {}) as Record<string, unknown>;\n const worktreeId = resolveBeliefWorktreeId(meta);\n const tupleContradicted =\n readTupleContradictedFlag(\n (node as EpistemicNodeOpinionDoc).tupleContradicted,\n ) ??\n readTupleContradictedFlag(meta.tupleContradicted) ??\n false;\n\n return {\n _id: node._id,\n _epistemicNodeId: node._id,\n _creationTime: node._creationTime,\n belief: node.canonicalText,\n formulation: node.canonicalText,\n projectId: node.projectId,\n topicId: node.topicId,\n userId: (node as EpistemicNodeOpinionDoc).userId || node.createdBy || \"\",\n confidence: (meta.confidence as \"high\" | \"medium\" | \"low\") || \"untested\",\n status: node.status,\n beliefStatus: resolveBeliefStatus(node, meta),\n topic: (meta.topic as string) || (meta.pillar as string) || \"other\",\n pillar: (meta.pillar as string) || (meta.topic as string) || \"\",\n category: (meta.category as string) || \"\",\n subcategory: (meta.subcategory as string) || \"\",\n categoryIcon: (meta.categoryIcon as string) || \"\",\n supportingEvidence: (meta.supportingEvidenceIds as string[]) || [],\n contradictingEvidence: (meta.contradictingEvidenceIds as string[]) || [],\n testingQuestions: (meta.testingQuestionIds as string[]) || [],\n linkedInsights: (meta.linkedInsightIds as string[]) || [],\n createdAt: node.createdAt,\n updatedAt: node.updatedAt || node.createdAt,\n tupleContradicted,\n sprintId: (meta.sprintId as string) || undefined,\n worktreeId,\n sourceBeliefIds: (meta.sourceBeliefIds as string[]) || undefined,\n criticality:\n (meta.criticality as\n | \"critical\"\n | \"supporting\"\n | \"nice_to_have\"\n | \"unanalyzed\"\n | \"blocking\"\n | \"important\") || \"unanalyzed\",\n rationale: (meta.rationale as string) || \"\",\n audienceLabel: node.audienceLabel,\n policyTags: node.policyTags,\n sensitivityTier: node.sensitivityTier,\n exportClass: node.exportClass,\n anonymizationClass: node.anonymizationClass,\n };\n}\n\nexport function resolveBeliefStatus(\n node: {\n beliefStatus?: unknown;\n confidence?: unknown;\n predictionMeta?: unknown;\n },\n metadata: Record<string, unknown>,\n): BeliefLifecycleStatus {\n return resolveBeliefLifecycleStatus({\n beliefStatus: node.beliefStatus,\n confidence: node.confidence,\n predictionMeta: node.predictionMeta,\n metadata,\n });\n}\n\nexport async function hasCompletedWorktreeForBelief(\n ctx: EpistemicBeliefCtx,\n beliefNodeId: Id<\"epistemicNodes\">,\n): Promise<boolean> {\n // Check if the belief is linked to a completed worktree via worktreeBeliefCluster\n const clusterMembership = await ctx.db\n .query(\"worktreeBeliefCluster\")\n .withIndex(\"by_belief\", (q: any) => q.eq(\"beliefId\", beliefNodeId))\n .collect();\n for (const membership of clusterMembership) {\n const worktree = await ctx.db.get(membership.worktreeId);\n if (worktree?.status === \"completed\" || worktree?.status === \"merged\") {\n return true;\n }\n }\n return false;\n}\n\nexport async function getActiveConfidencePolicy(\n ctx: EpistemicBeliefCtx,\n): Promise<ConfidencePolicyConfig> {\n try {\n const activeConfig = await ctx.db\n .query(\"logicSprintScoring\")\n .withIndex(\"by_active\", (q: any) => q.eq(\"isActive\", true))\n .first();\n\n return {\n scoringMode:\n activeConfig?.confidencePolicy === \"always\"\n ? \"always\"\n : DEFAULT_CONFIDENCE_POLICY.scoringMode,\n tupleContradiction: normalizeTupleContradictionPolicy(\n activeConfig?.tupleContradictionPolicy as\n | Partial<ConfidencePolicyConfig[\"tupleContradiction\"]>\n | undefined,\n ),\n };\n } catch (error) {\n debugGraphPrimitiveFallback(\n \"[epistemicBeliefs] Failed to load active confidence policy\",\n {\n error,\n },\n );\n // K-tier/component environments do not carry logicSprintScoring.\n return DEFAULT_CONFIDENCE_POLICY;\n }\n}\n\nexport async function requireAuthenticatedUserId(ctx: {\n auth: { getUserIdentity: () => Promise<unknown> };\n}): Promise<string> {\n const userId = await getCurrentUserId(\n ctx as Parameters<typeof getCurrentUserId>[0],\n );\n if (!userId) {\n throwStructuredMutationError({\n message: \"Authentication required.\",\n status: 401,\n code: \"AUTHENTICATION_REQUIRED\",\n invariantCode: \"auth.required\",\n suggestion:\n \"Provide a valid bearer token before invoking belief mutations.\",\n });\n }\n return userId;\n}\n\nexport async function requireProjectWriteAccess(\n ctx: { db: unknown },\n projectId: string,\n userId: string,\n): Promise<void> {\n const hasAccess = await checkProjectAccess(\n ctx as Parameters<typeof checkProjectAccess>[0],\n projectId,\n userId,\n );\n if (!hasAccess) {\n throwStructuredMutationError({\n message: \"Project access required.\",\n status: 403,\n code: \"FORBIDDEN\",\n invariantCode: \"policy.scope_required\",\n suggestion: \"Request write access for the project and retry.\",\n details: { projectId, userId },\n });\n }\n}\n","/** Split belief linking and evidence wiring out of epistemicBeliefs.ts. */\n\nimport { v } from \"convex/values\";\nimport {\n detectTupleContradiction,\n evaluateTupleContradictionTransition,\n confidenceFromSL,\n mkOpinion,\n normalizeTupleContradictionPolicy,\n readOpinionFromRecord,\n type ConfidencePolicyConfig,\n type Opinion,\n type SLOpinion,\n type SLOperator,\n} from \"@lucern/confidence\";\nimport {\n checkProjectAccess,\n checkScopeAccess,\n} from \"@lucern/access-control/access\";\nimport {\n canAudienceClassAccess,\n classFromAudienceKey,\n normalizeAudienceKey,\n} from \"@lucern/access-control/audience\";\nimport { listAudienceRegistryRows } from \"@lucern/access-control/audienceRegistry\";\nimport { getCurrentUserId } from \"@lucern/access-control/auth\";\nimport { assertSchemaEnumValue } from \"@lucern/contracts/schema-helpers/enumValidation\";\nimport { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\nimport {\n type BeliefLifecycleStatus,\n isPreValidationBeliefStatus,\n promoteBeliefStatusAfterScoring,\n resolveBeliefLifecycleStatus,\n} from \"./beliefLifecycle\";\nimport type { Doc, Id, MutationCtx } from \"./convex\";\nimport {\n internal,\n internalMutation,\n internalQuery,\n mutation,\n query,\n} from \"./convex\";\nimport { collectConfidencePropagationDispatches } from \"./confidencePropagationDispatch\";\nimport { debugGraphPrimitiveFallback } from \"./debug\";\nimport {\n createInheritedContractRecord,\n type VerificationConfidenceTrigger,\n} from \"./epistemicContractHelpers\";\nimport { scheduleEmbeddingGeneration } from \"./embeddingTrigger\";\nimport { generateGlobalId } from \"./globalId\";\nimport { computeLogicalRole } from \"./logicalRoleInference\";\nimport { resolveGraphPrimitivesAppResolvers } from \"./resolvers\";\nimport { optionalScopeArgs, resolveTopicProjectScope } from \"./topicScope\";\nimport {\n assertTenantPackWorkspaceMutationAllowed,\n assertWorkspaceScopedEpistemicNodeScope,\n nodeMatchesWorkspaceReasoningScope,\n resolveNodeScopeForWorkspaceIsolation,\n resolveRuntimePackMutationContext,\n} from \"./workspaceIsolation\";\nimport {\n buildBeliefEvidenceNotFoundResult,\n buildBeliefStatusSuccessResult,\n getBeliefNodesForScope,\n insightIdUnion,\n optionalBeliefScopeArgs,\n resolveBeliefScopeOrNull,\n requireAuthenticatedUserId,\n requireProjectWriteAccess,\n} from \"./epistemicBeliefs.helpers\";\n\nexport const updatePillar = mutation({\n args: {\n nodeId: v.id(\"epistemicNodes\"),\n pillar: v.union(\n v.literal(\"market\"),\n v.literal(\"competition\"),\n v.literal(\"product\"),\n v.literal(\"team\"),\n v.literal(\"financials\"),\n v.literal(\"regulatory\"),\n v.literal(\"timing\"),\n v.literal(\"customer\"),\n v.literal(\"technology\"),\n v.literal(\"distribution\"),\n v.literal(\"deal\"),\n v.literal(\"risks\"),\n v.literal(\"other\"),\n ),\n userId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const authenticatedUserId = await requireAuthenticatedUserId(ctx);\n const now = Date.now();\n\n const existingNode = await ctx.db.get(args.nodeId);\n if (!existingNode || existingNode.nodeType !== \"belief\") {\n throw new Error(\"Belief not found\");\n }\n if (!existingNode.projectId) {\n throw new Error(\"Belief has no project scope\");\n }\n await requireProjectWriteAccess(\n ctx,\n existingNode.projectId,\n authenticatedUserId,\n );\n\n // Update the epistemicNode (canonical source of truth)\n let previousPillar: unknown = null;\n const metadata = (existingNode.metadata as Record<string, unknown>) || {};\n previousPillar = metadata.pillar;\n\n await ctx.db.patch(args.nodeId, {\n metadata: {\n ...metadata,\n pillar: args.pillar,\n topic: args.pillar,\n },\n updatedAt: now,\n });\n\n // Schedule Neo4j sync\n await ctx.scheduler.runAfter(0, internal.neo4jSync.syncNodeToNeo4j, {\n nodeId: args.nodeId,\n operation: \"upsert\",\n });\n\n // Audit log - Lucern Invariant #14: no silent state transitions\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"belief\",\n entityId: args.nodeId as string,\n changeType: \"pillar_changed\",\n projectId: existingNode.projectId,\n changedBy: authenticatedUserId,\n changedAt: now,\n isAgent: false,\n previousState: { pillar: previousPillar },\n newState: { pillar: args.pillar },\n });\n\n return {\n nodeId: args.nodeId,\n previousPillar,\n newPillar: args.pillar,\n };\n },\n});\n\n// =============================================================================\n// COUNT BY STATUS\n// =============================================================================\n\n/**\n * Get counts of beliefs by status for a project.\n */\nexport const getCountByStatus = query({\n args: {\n ...optionalBeliefScopeArgs,\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const scope = await resolveBeliefScopeOrNull(ctx, args);\n if (!scope) {\n return { active: 0, superseded: 0, archived: 0, total: 0 };\n }\n\n const nodes = await ctx.db\n .query(\"epistemicNodes\")\n .withIndex(\"by_topic_type\", (q: any) =>\n q.eq(\"topicId\", scope.topicId).eq(\"nodeType\", \"belief\"),\n )\n .collect();\n\n const counts = {\n active: 0,\n superseded: 0,\n archived: 0,\n total: nodes.length,\n };\n\n for (const node of nodes) {\n if (node.status === \"active\") {\n counts.active++;\n } else if (node.status === \"superseded\") {\n counts.superseded++;\n } else if (node.status === \"archived\") {\n counts.archived++;\n }\n }\n\n return counts;\n },\n});\n\n// =============================================================================\n// LINK BELIEFS (Direct epistemicNodes → epistemicNodes)\n// =============================================================================\n\n/**\n * Create an edge between two beliefs in the epistemic spine.\n * This works with epistemicNodes IDs directly (no legacy lookup needed).\n */\nexport const linkBeliefs = mutation({\n args: {\n fromNodeId: v.id(\"epistemicNodes\"),\n toNodeId: v.id(\"epistemicNodes\"),\n edgeType: v.union(\n // Basic belief relationships\n v.literal(\"supersedes\"),\n v.literal(\"depends_on\"),\n v.literal(\"supports\"),\n v.literal(\"contains\"),\n v.literal(\"informs\"),\n v.literal(\"derived_from\"),\n v.literal(\"tests\"),\n ),\n weight: v.optional(v.number()), // -1 to 1\n context: v.optional(v.string()),\n userId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const authenticatedUserId = await requireAuthenticatedUserId(ctx);\n const fromNode = await ctx.db.get(args.fromNodeId);\n const toNode = await ctx.db.get(args.toNodeId);\n\n if (!fromNode || !toNode) {\n throw new Error(\"One or both belief nodes not found\");\n }\n\n if (fromNode.nodeType !== \"belief\" || toNode.nodeType !== \"belief\") {\n throw new Error(\"Both nodes must be beliefs\");\n }\n if (fromNode.projectId !== toNode.projectId) {\n throw new Error(\"Cannot link beliefs across different projects\");\n }\n if (!fromNode.projectId) {\n throw new Error(\"Belief has no project scope\");\n }\n await requireProjectWriteAccess(\n ctx,\n fromNode.projectId,\n authenticatedUserId,\n );\n\n const now = Date.now();\n\n // Create edge directly in Neo4j (MERGE handles duplicates)\n const edgeGlobalId = generateGlobalId();\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.createEdge, {\n globalId: edgeGlobalId,\n fromGlobalId: fromNode.globalId,\n toGlobalId: toNode.globalId,\n edgeType: args.edgeType,\n weight: args.weight ?? 1.0,\n context: args.context,\n createdBy: authenticatedUserId,\n topicId: fromNode.projectId ? String(fromNode.projectId) : undefined,\n fromNodeType: \"belief\",\n toNodeType: \"belief\",\n });\n\n // Log to epistemic audit\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"edge\",\n entityId: edgeGlobalId as unknown as Id<\"epistemicNodes\">,\n changeType: \"created\",\n previousState: null,\n newState: {\n fromNodeId: args.fromNodeId,\n toNodeId: args.toNodeId,\n edgeType: args.edgeType,\n },\n changedBy: authenticatedUserId,\n isAgent: false,\n changedAt: now,\n projectId: fromNode.projectId,\n });\n\n return { edgeGlobalId, created: true };\n },\n});\n\n// =============================================================================\n// LINK EVIDENCE (Insight) to Belief\n// =============================================================================\n\n/**\n * Link an insight (evidence) to a belief.\n * Creates an edge from evidence → belief with appropriate type.\n */\nexport const linkEvidence = mutation({\n args: {\n beliefNodeId: v.id(\"epistemicNodes\"),\n insightId: insightIdUnion,\n type: v.union(v.literal(\"supporting\"), v.literal(\"contradicting\")),\n rationale: v.optional(v.string()),\n userId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const authenticatedUserId = await requireAuthenticatedUserId(ctx);\n const _now = Date.now();\n\n // Verify the belief exists\n const belief = await ctx.db.get(args.beliefNodeId);\n if (!belief || belief.nodeType !== \"belief\") {\n throw new Error(\"Belief not found\");\n }\n if (!belief.projectId) {\n throw new Error(\"Belief has no project scope\");\n }\n await requireProjectWriteAccess(ctx, belief.projectId, authenticatedUserId);\n\n // Verify the insight exists\n const insight = await ctx.db.get(args.insightId);\n if (!insight || insight.nodeType !== \"evidence\") {\n throw new Error(\"Insight not found\");\n }\n if (\n \"projectId\" in insight &&\n insight.projectId &&\n insight.projectId !== belief.projectId\n ) {\n throw new Error(\"Insight belongs to a different project\");\n }\n\n const evidenceNodeId = insight._id;\n const evidenceGlobalId = insight.globalId;\n\n // Determine edge type based on supporting/contradicting\n const edgeType = \"informs\"; // Both use informs, weight determines support/contradict\n const weight = args.type === \"supporting\" ? 1.0 : -1.0;\n\n // Compute logicalRole from graph structure\n const logicalRole = evidenceNodeId\n ? await computeLogicalRole(ctx, evidenceNodeId, args.beliefNodeId)\n : \"contributory\";\n\n // Create the edge directly in Neo4j (MERGE handles duplicates)\n const edgeGlobalId = generateGlobalId();\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.createEdge, {\n globalId: edgeGlobalId,\n fromGlobalId: evidenceGlobalId,\n toGlobalId: belief.globalId,\n edgeType,\n weight,\n context: args.rationale || `${args.type} evidence`,\n createdBy: authenticatedUserId,\n topicId: belief.projectId ? String(belief.projectId) : undefined,\n fromNodeType: \"evidence\",\n toNodeType: \"belief\",\n fromLayer: \"L2\",\n toLayer: \"L3\",\n // Classification fields\n logicalRole,\n temporalClass: \"structural\", // Default - most evidence is long-lived\n });\n\n return { edgeGlobalId, evidenceNodeId, created: true };\n },\n});\n\n// =============================================================================\n// UNLINK EVIDENCE from Belief\n// =============================================================================\n\n/**\n * Remove the link between an insight and a belief.\n */\nexport const unlinkEvidence = mutation({\n args: {\n beliefNodeId: v.id(\"epistemicNodes\"),\n insightId: v.id(\"epistemicNodes\"),\n userId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const authenticatedUserId = await requireAuthenticatedUserId(ctx);\n const now = Date.now();\n\n const evidenceNode = await ctx.db.get(args.insightId);\n if (!evidenceNode || evidenceNode.nodeType !== \"evidence\") {\n return buildBeliefEvidenceNotFoundResult();\n }\n if (!evidenceNode.projectId) {\n throw new Error(\"Evidence has no project scope\");\n }\n await requireProjectWriteAccess(\n ctx,\n evidenceNode.projectId,\n authenticatedUserId,\n );\n const beliefNode = await ctx.db.get(args.beliefNodeId);\n if (!beliefNode || beliefNode.nodeType !== \"belief\") {\n throw new Error(\"Belief not found\");\n }\n if (beliefNode.projectId !== evidenceNode.projectId) {\n throw new Error(\"Belief and evidence belong to different projects\");\n }\n\n // Find and delete the edge\n const edge = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from_to\", (q) =>\n q.eq(\"fromNodeId\", evidenceNode._id).eq(\"toNodeId\", args.beliefNodeId),\n )\n .first();\n\n if (edge) {\n await ctx.scheduler.runAfter(0, internal.neo4jEdgeAPI.deleteEdge, {\n globalId: edge.globalId,\n });\n await ctx.db.delete(edge._id);\n\n // Log to audit\n await ctx.db.insert(\"epistemicAudit\", {\n entityType: \"edge\",\n entityId: edge.globalId,\n changeType: \"edge_removed\",\n changedAt: now,\n changedBy: authenticatedUserId,\n isAgent: false,\n previousState: {\n fromNodeId: evidenceNode._id,\n toNodeId: args.beliefNodeId,\n },\n newState: null,\n projectId: evidenceNode.projectId,\n });\n }\n\n return buildBeliefStatusSuccessResult();\n },\n});\n\n// =============================================================================\n// GET BELIEF WITH EVIDENCE\n// =============================================================================\n\n/**\n * Get a belief along with all its linked evidence.\n */\nexport const getWithEvidence = query({\n args: {\n nodeId: v.id(\"epistemicNodes\"),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const belief = await ctx.db.get(args.nodeId);\n if (!belief || belief.nodeType !== \"belief\") {\n return null;\n }\n\n // Get all edges pointing TO this belief from evidence nodes\n const incomingEdges = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_to_type\", (q) =>\n q.eq(\"toNodeId\", args.nodeId).eq(\"edgeType\", \"informs\"),\n )\n .collect();\n\n // Get the evidence nodes\n const evidenceNodeIds = incomingEdges\n .filter((e) => e.fromNodeType === \"evidence\")\n .map((e) => e.fromNodeId);\n\n const evidenceNodes = await Promise.all(\n evidenceNodeIds.map((id) => ctx.db.get(id)),\n );\n\n // Categorize by supporting vs contradicting (based on weight)\n const supporting: typeof evidenceNodes = [];\n const contradicting: typeof evidenceNodes = [];\n\n for (let i = 0; i < evidenceNodes.length; i++) {\n const node = evidenceNodes[i];\n const edge = incomingEdges[i];\n if (node) {\n if ((edge.weight || 0) >= 0) {\n supporting.push(node);\n } else {\n contradicting.push(node);\n }\n }\n }\n\n return {\n belief,\n evidence: {\n supporting,\n contradicting,\n total: supporting.length + contradicting.length,\n },\n };\n },\n});\n\n// =============================================================================\n// GET RELATIONSHIPS\n// =============================================================================\n\n/**\n * Get all relationships (edges) for a belief.\n */\nexport const getRelationships = query({\n args: {\n nodeId: v.id(\"epistemicNodes\"),\n direction: v.optional(\n v.union(v.literal(\"in\"), v.literal(\"out\"), v.literal(\"both\")),\n ),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const direction = args.direction || \"both\";\n const results: {\n incoming: Array<{ edge: unknown; node: unknown }>;\n outgoing: Array<{ edge: unknown; node: unknown }>;\n } = {\n incoming: [],\n outgoing: [],\n };\n\n if (direction === \"in\" || direction === \"both\") {\n // Get edges pointing TO this node\n const inEdges = await ctx.db\n .query(\"epistemicEdges\")\n .filter((q) => q.eq(q.field(\"toNodeId\"), args.nodeId))\n .collect();\n\n for (const edge of inEdges) {\n const sourceNode = await ctx.db.get(edge.fromNodeId);\n results.incoming.push({ edge, node: sourceNode });\n }\n }\n\n if (direction === \"out\" || direction === \"both\") {\n // Get edges pointing FROM this node\n const outEdges = await ctx.db\n .query(\"epistemicEdges\")\n .filter((q) => q.eq(q.field(\"fromNodeId\"), args.nodeId))\n .collect();\n\n for (const edge of outEdges) {\n const targetNode = edge.toNodeId\n ? await ctx.db.get(edge.toNodeId)\n : null;\n results.outgoing.push({ edge, node: targetNode });\n }\n }\n\n return results;\n },\n});\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** Split read-only belief queries out of epistemicBeliefs.ts. */
|
|
2
|
+
declare const getConfidenceHistory: any;
|
|
3
|
+
/**
|
|
4
|
+
* Get the lineage of a belief (all forks and parents).
|
|
5
|
+
*/
|
|
6
|
+
declare const getLineage: any;
|
|
7
|
+
/**
|
|
8
|
+
* Get multiple beliefs by their IDs.
|
|
9
|
+
*/
|
|
10
|
+
declare const getByIds: any;
|
|
11
|
+
/**
|
|
12
|
+
* Get all beliefs associated with a worktree via worktreeBeliefCluster.
|
|
13
|
+
*/
|
|
14
|
+
declare const getByWorktree: any;
|
|
15
|
+
|
|
16
|
+
export { getByIds, getByWorktree, getConfidenceHistory, getLineage };
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { v } from 'convex/values';
|
|
2
|
+
import { permissiveReturn } from '@lucern/contracts/schema-helpers/validators';
|
|
3
|
+
import { componentsGeneric, queryGeneric } from 'convex/server';
|
|
4
|
+
|
|
5
|
+
// src/epistemicBeliefs.queries.ts
|
|
6
|
+
componentsGeneric();
|
|
7
|
+
var query = queryGeneric;
|
|
8
|
+
|
|
9
|
+
// src/epistemicBeliefs.queries.ts
|
|
10
|
+
var getConfidenceHistory = query({
|
|
11
|
+
args: {
|
|
12
|
+
nodeId: v.id("epistemicNodes")
|
|
13
|
+
},
|
|
14
|
+
returns: permissiveReturn,
|
|
15
|
+
handler: async (ctx, args) => {
|
|
16
|
+
const node = await ctx.db.get(args.nodeId);
|
|
17
|
+
if (!node || node.nodeType !== "belief") {
|
|
18
|
+
return [];
|
|
19
|
+
}
|
|
20
|
+
return await ctx.db.query("beliefConfidence").withIndex("by_beliefId_time", (q) => q.eq("beliefId", args.nodeId)).order("asc").collect();
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
var getLineage = query({
|
|
24
|
+
args: {
|
|
25
|
+
nodeId: v.id("epistemicNodes")
|
|
26
|
+
},
|
|
27
|
+
returns: permissiveReturn,
|
|
28
|
+
handler: async (ctx, args) => {
|
|
29
|
+
const lineage = [];
|
|
30
|
+
let currentId = args.nodeId;
|
|
31
|
+
while (currentId) {
|
|
32
|
+
const node = await ctx.db.get(currentId);
|
|
33
|
+
if (!node || node.nodeType !== "belief") {
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
const metadata = node.metadata;
|
|
37
|
+
lineage.push({
|
|
38
|
+
nodeId: node._id,
|
|
39
|
+
formulation: node.canonicalText,
|
|
40
|
+
forkReason: metadata?.forkReason,
|
|
41
|
+
createdAt: node.createdAt
|
|
42
|
+
});
|
|
43
|
+
const edges = await ctx.db.query("epistemicEdges").withIndex(
|
|
44
|
+
"by_from_type",
|
|
45
|
+
(q) => q.eq("fromNodeId", currentId).eq("edgeType", "supersedes")
|
|
46
|
+
).collect();
|
|
47
|
+
if (edges.length > 0) {
|
|
48
|
+
currentId = edges[0].toNodeId ?? null;
|
|
49
|
+
} else {
|
|
50
|
+
currentId = metadata?.forkedFrom;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return lineage;
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
var getByIds = query({
|
|
57
|
+
args: {
|
|
58
|
+
nodeIds: v.array(v.id("epistemicNodes"))
|
|
59
|
+
},
|
|
60
|
+
returns: permissiveReturn,
|
|
61
|
+
handler: async (ctx, args) => {
|
|
62
|
+
const beliefs = await Promise.all(
|
|
63
|
+
args.nodeIds.map((id) => ctx.db.get(id))
|
|
64
|
+
);
|
|
65
|
+
return beliefs.filter((b) => b !== null && b.nodeType === "belief");
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
var getByWorktree = query({
|
|
69
|
+
args: {
|
|
70
|
+
worktreeId: v.string()
|
|
71
|
+
},
|
|
72
|
+
returns: permissiveReturn,
|
|
73
|
+
handler: async (ctx, args) => {
|
|
74
|
+
const worktree = await ctx.db.get(args.worktreeId);
|
|
75
|
+
if (!worktree) {
|
|
76
|
+
return [];
|
|
77
|
+
}
|
|
78
|
+
const clusterLinks = await ctx.db.query("worktreeBeliefCluster").withIndex("by_worktree", (q) => q.eq("worktreeId", args.worktreeId)).collect();
|
|
79
|
+
const beliefs = [];
|
|
80
|
+
for (const link of clusterLinks) {
|
|
81
|
+
const node = await ctx.db.get(link.beliefId);
|
|
82
|
+
if (node) beliefs.push(node);
|
|
83
|
+
}
|
|
84
|
+
return beliefs;
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
export { getByIds, getByWorktree, getConfidenceHistory, getLineage };
|
|
89
|
+
//# sourceMappingURL=epistemicBeliefs.queries.js.map
|
|
90
|
+
//# sourceMappingURL=epistemicBeliefs.queries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/convex.ts","../src/epistemicBeliefs.queries.ts"],"names":[],"mappings":"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","file":"epistemicBeliefs.queries.js","sourcesContent":["import {\n actionGeneric,\n anyApi,\n componentsGeneric,\n httpActionGeneric,\n internalActionGeneric,\n internalMutationGeneric,\n internalQueryGeneric,\n mutationGeneric,\n queryGeneric,\n} from \"convex/server\";\nimport type { GenericId } from \"convex/values\";\n\nexport const api = anyApi as any;\nexport const components = componentsGeneric() as any;\nexport const internal = anyApi as any;\n\nexport type TableNames = string;\nexport type Id<TableName extends TableNames = string> = GenericId<TableName>;\nexport type Doc<TableName extends TableNames = string> = any;\nexport type DataModel = any;\ntype IndexRangeBuilder = {\n field(fieldName: string): string;\n eq(fieldName: string, value: unknown): IndexRangeBuilder;\n gt(fieldName: string, value: unknown): IndexRangeBuilder;\n gte(fieldName: string, value: unknown): IndexRangeBuilder;\n lt(fieldName: string, value: unknown): IndexRangeBuilder;\n lte(fieldName: string, value: unknown): IndexRangeBuilder;\n};\ntype FilterBuilder = {\n eq(left: unknown, right: unknown): unknown;\n neq(left: unknown, right: unknown): unknown;\n gt(left: unknown, right: unknown): unknown;\n gte(left: unknown, right: unknown): unknown;\n lt(left: unknown, right: unknown): unknown;\n lte(left: unknown, right: unknown): unknown;\n and(...clauses: unknown[]): unknown;\n or(...clauses: unknown[]): unknown;\n field(fieldName: string): unknown;\n};\ntype QueryInitializer<TableName extends TableNames> = {\n withIndex(\n indexName: string,\n range?: (q: any) => unknown\n ): QueryInitializer<TableName>;\n filter(predicate: (q: any) => unknown): QueryInitializer<TableName>;\n order(direction: \"asc\" | \"desc\"): QueryInitializer<TableName>;\n collect(): Promise<Doc<TableName>[]>;\n take(limit: number): Promise<Doc<TableName>[]>;\n first(): Promise<Doc<TableName> | null>;\n unique(): Promise<Doc<TableName> | null>;\n};\nexport type DatabaseReader = {\n get<TableName extends TableNames>(\n id: Id<TableName>\n ): Promise<Doc<TableName> | null>;\n query<TableName extends TableNames>(\n tableName: TableName\n ): QueryInitializer<TableName>;\n normalizeId?<TableName extends TableNames>(\n tableName: TableName,\n id: string\n ): Id<TableName> | null;\n};\nexport type DatabaseWriter = DatabaseReader & {\n insert<TableName extends TableNames>(\n tableName: TableName,\n value: Record<string, unknown>\n ): Promise<Id<TableName>>;\n patch<TableName extends TableNames>(\n id: Id<TableName>,\n value: Record<string, unknown>\n ): Promise<void>;\n replace<TableName extends TableNames>(\n id: Id<TableName>,\n value: Record<string, unknown>\n ): Promise<void>;\n delete<TableName extends TableNames>(id: Id<TableName>): Promise<void>;\n};\ntype Scheduler = {\n runAfter(delayMs: number, functionReference: unknown, args?: unknown): Promise<void>;\n};\ntype AuthReader = {\n getUserIdentity(): Promise<unknown>;\n};\ntype RuntimeInvoker = {\n runQuery(functionReference: unknown, args?: unknown): Promise<any>;\n runMutation(functionReference: unknown, args?: unknown): Promise<any>;\n runAction(functionReference: unknown, args?: unknown): Promise<any>;\n};\nexport type QueryCtx = RuntimeInvoker & {\n auth: AuthReader;\n db: DatabaseReader;\n scheduler: Scheduler;\n};\nexport type MutationCtx = RuntimeInvoker & {\n auth: AuthReader;\n db: DatabaseWriter;\n scheduler: Scheduler;\n};\nexport type ActionCtx = RuntimeInvoker & {\n auth: AuthReader;\n scheduler: Scheduler;\n};\n\ntype ConvexFunctionBuilder<Ctx> = <\n Definition extends { handler?: (ctx: Ctx, args: any) => any },\n>(\n definition: Definition\n) => any;\n\nexport const action = actionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const httpAction =\n httpActionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const internalAction =\n internalActionGeneric as unknown as ConvexFunctionBuilder<ActionCtx>;\nexport const internalMutation =\n internalMutationGeneric as unknown as ConvexFunctionBuilder<MutationCtx>;\nexport const internalQuery =\n internalQueryGeneric as unknown as ConvexFunctionBuilder<QueryCtx>;\nexport const mutation =\n mutationGeneric as unknown as ConvexFunctionBuilder<MutationCtx>;\nexport const query = queryGeneric as unknown as ConvexFunctionBuilder<QueryCtx>;\n","/** Split read-only belief queries out of epistemicBeliefs.ts. */\n\nimport { v } from \"convex/values\";\nimport {\n detectTupleContradiction,\n evaluateTupleContradictionTransition,\n confidenceFromSL,\n mkOpinion,\n normalizeTupleContradictionPolicy,\n readOpinionFromRecord,\n type ConfidencePolicyConfig,\n type Opinion,\n type SLOpinion,\n type SLOperator,\n} from \"@lucern/confidence\";\nimport {\n checkProjectAccess,\n checkScopeAccess,\n} from \"@lucern/access-control/access\";\nimport {\n canAudienceClassAccess,\n classFromAudienceKey,\n normalizeAudienceKey,\n} from \"@lucern/access-control/audience\";\nimport { listAudienceRegistryRows } from \"@lucern/access-control/audienceRegistry\";\nimport { getCurrentUserId } from \"@lucern/access-control/auth\";\nimport { assertSchemaEnumValue } from \"@lucern/contracts/schema-helpers/enumValidation\";\nimport { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\nimport {\n type BeliefLifecycleStatus,\n isPreValidationBeliefStatus,\n promoteBeliefStatusAfterScoring,\n resolveBeliefLifecycleStatus,\n} from \"./beliefLifecycle\";\nimport type { Doc, Id, MutationCtx } from \"./convex\";\nimport {\n internal,\n internalMutation,\n internalQuery,\n mutation,\n query,\n} from \"./convex\";\nimport { collectConfidencePropagationDispatches } from \"./confidencePropagationDispatch\";\nimport { debugGraphPrimitiveFallback } from \"./debug\";\nimport {\n createInheritedContractRecord,\n type VerificationConfidenceTrigger,\n} from \"./epistemicContractHelpers\";\nimport { scheduleEmbeddingGeneration } from \"./embeddingTrigger\";\nimport { generateGlobalId } from \"./globalId\";\nimport { computeLogicalRole } from \"./logicalRoleInference\";\nimport { resolveGraphPrimitivesAppResolvers } from \"./resolvers\";\nimport { optionalScopeArgs, resolveTopicProjectScope } from \"./topicScope\";\nimport {\n assertTenantPackWorkspaceMutationAllowed,\n assertWorkspaceScopedEpistemicNodeScope,\n nodeMatchesWorkspaceReasoningScope,\n resolveNodeScopeForWorkspaceIsolation,\n resolveRuntimePackMutationContext,\n} from \"./workspaceIsolation\";\nimport {\n clampBeliefLimit,\n flattenBeliefNode,\n getBeliefNodesForScope,\n resolveBeliefScopeOrNull,\n} from \"./epistemicBeliefs.helpers\";\n\nexport const getConfidenceHistory = query({\n args: {\n nodeId: v.id(\"epistemicNodes\"),\n },\n returns: permissiveReturn,\n handler: async (ctx: any, args: any) => {\n const node = await ctx.db.get(args.nodeId);\n if (!node || node.nodeType !== \"belief\") {\n return [];\n }\n\n return await ctx.db\n .query(\"beliefConfidence\")\n .withIndex(\"by_beliefId_time\", (q: any) => q.eq(\"beliefId\", args.nodeId))\n .order(\"asc\")\n .collect();\n },\n});\n\n// =============================================================================\n// GET BELIEF LINEAGE\n// =============================================================================\n\n/**\n * Get the lineage of a belief (all forks and parents).\n */\nexport const getLineage = query({\n args: {\n nodeId: v.id(\"epistemicNodes\"),\n },\n returns: permissiveReturn,\n handler: async (ctx: any, args: any) => {\n const lineage: Array<{\n nodeId: Id<\"epistemicNodes\">;\n formulation: string;\n forkReason?: string;\n createdAt: number;\n }> = [];\n\n let currentId: Id<\"epistemicNodes\"> | null = args.nodeId;\n\n while (currentId) {\n const node = await ctx.db.get(currentId);\n if (!node || node.nodeType !== \"belief\") {\n break;\n }\n\n const metadata = node.metadata as Record<string, unknown> | undefined;\n\n lineage.push({\n nodeId: node._id,\n formulation: node.canonicalText,\n forkReason: metadata?.forkReason as string | undefined,\n createdAt: node.createdAt,\n });\n\n // Find parent via supersedes edge\n const edges = await ctx.db\n .query(\"epistemicEdges\")\n .withIndex(\"by_from_type\", (q: any) =>\n q.eq(\"fromNodeId\", currentId!).eq(\"edgeType\", \"supersedes\"),\n )\n .collect();\n\n if (edges.length > 0) {\n currentId = edges[0].toNodeId ?? null;\n } else {\n // Check metadata for forkedFrom (backfilled beliefs)\n currentId = metadata?.forkedFrom as Id<\"epistemicNodes\"> | null;\n }\n }\n\n return lineage;\n },\n});\n\n// =============================================================================\n// GET BELIEFS BY IDS\n// =============================================================================\n\n/**\n * Get multiple beliefs by their IDs.\n */\nexport const getByIds = query({\n args: {\n nodeIds: v.array(v.id(\"epistemicNodes\")),\n },\n returns: permissiveReturn,\n handler: async (ctx: any, args: any) => {\n const beliefs = await Promise.all(\n (args.nodeIds as any[]).map((id: any) => ctx.db.get(id)),\n );\n return beliefs.filter((b: any) => b !== null && b.nodeType === \"belief\");\n },\n});\n\n// =============================================================================\n// GET BY SPRINT\n// =============================================================================\n\n/**\n * Get all beliefs associated with a worktree via worktreeBeliefCluster.\n */\nexport const getByWorktree = query({\n args: {\n worktreeId: v.string(),\n },\n returns: permissiveReturn,\n handler: async (ctx: any, args: any) => {\n const worktree = await ctx.db.get(args.worktreeId as Id<\"worktrees\">);\n if (!worktree) {\n return [];\n }\n\n const clusterLinks = await ctx.db\n .query(\"worktreeBeliefCluster\")\n .withIndex(\"by_worktree\", (q: any) => q.eq(\"worktreeId\", args.worktreeId))\n .collect();\n\n const beliefs: Array<Doc<\"epistemicNodes\">> = [];\n for (const link of clusterLinks) {\n const node = await ctx.db.get(link.beliefId);\n if (node) beliefs.push(node);\n }\n return beliefs;\n },\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { BUILT_IN_EVIDENTIAL_ALIASES, BUILT_IN_EVIDENTIAL_EVALUATOR, BUILT_IN_MARKET_INDEX_COMPARATOR, BUILT_IN_METRIC_CHECKER, BUILT_IN_REFERENCE_CHECK_COUNTER, BUILT_IN_TEMPORAL_DEADLINE, ContractConfirmedRule, ContractDisconfirmedRule, ContractExpiredRule, ContractModulationPlan, ContractPartialRule, EpistemicContractCompositeOperator, EpistemicContractCondition, EpistemicContractConditionType, EpistemicContractDirection, EpistemicContractEvaluationResult, EpistemicContractLineageSource, EpistemicContractModulation, EpistemicContractRecord, EpistemicContractSchedule, EpistemicContractStatus, EvidentialAction, EvidentialEvaluatorConfig, EvidentialMetric, EvidentialMetricSnapshot, EvidentialOperator, MarketIndexComparatorConfig, MetricCheckerEvaluatorConfig, ReferenceCheckCounterConfig, TemporalDeadlineEvaluatorConfig, VerificationConfidenceTrigger, buildComparisonRationale, buildEvidentialRationale, compareMetricValue, createInheritedContractRecord, deriveContractModulationPlan, deriveContractStatus, deriveVerificationTrigger, getEvaluatorInputRecord,
|
|
1
|
+
export { BUILT_IN_EVIDENTIAL_ALIASES, BUILT_IN_EVIDENTIAL_EVALUATOR, BUILT_IN_MARKET_INDEX_COMPARATOR, BUILT_IN_METRIC_CHECKER, BUILT_IN_REFERENCE_CHECK_COUNTER, BUILT_IN_TEMPORAL_DEADLINE, ContractConfirmedRule, ContractDisconfirmedRule, ContractExpiredRule, ContractModulationPlan, ContractPartialRule, EpistemicContractCompositeOperator, EpistemicContractCondition, EpistemicContractConditionType, EpistemicContractDirection, EpistemicContractEvaluationResult, EpistemicContractLineageSource, EpistemicContractModulation, EpistemicContractRecord, EpistemicContractSchedule, EpistemicContractStatus, EvidentialAction, EvidentialEvaluatorConfig, EvidentialMetric, EvidentialMetricSnapshot, EvidentialOperator, MarketIndexComparatorConfig, MetricCheckerEvaluatorConfig, ReferenceCheckCounterConfig, TemporalDeadlineEvaluatorConfig, VerificationConfidenceTrigger, buildComparisonRationale, buildEvidentialRationale, compareMetricValue, createInheritedContractRecord, deriveContractModulationPlan, deriveContractStatus, deriveVerificationTrigger, getEvaluatorInputRecord, parseEvidentialEvaluatorConfig, parseMarketIndexComparatorConfig, parseMetricCheckerConfig, parseReferenceCheckCounterConfig, parseTemporalDeadlineConfig, pickFiniteNumber, resolveComparisonResult } from '@lucern/confidence';
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { BUILT_IN_EVIDENTIAL_ALIASES, BUILT_IN_EVIDENTIAL_EVALUATOR, BUILT_IN_MARKET_INDEX_COMPARATOR, BUILT_IN_METRIC_CHECKER, BUILT_IN_REFERENCE_CHECK_COUNTER, BUILT_IN_TEMPORAL_DEADLINE, buildComparisonRationale, buildEvidentialRationale, compareMetricValue, createInheritedContractRecord, deriveContractModulationPlan, deriveContractStatus, deriveVerificationTrigger, getEvaluatorInputRecord,
|
|
1
|
+
export { BUILT_IN_EVIDENTIAL_ALIASES, BUILT_IN_EVIDENTIAL_EVALUATOR, BUILT_IN_MARKET_INDEX_COMPARATOR, BUILT_IN_METRIC_CHECKER, BUILT_IN_REFERENCE_CHECK_COUNTER, BUILT_IN_TEMPORAL_DEADLINE, buildComparisonRationale, buildEvidentialRationale, compareMetricValue, createInheritedContractRecord, deriveContractModulationPlan, deriveContractStatus, deriveVerificationTrigger, getEvaluatorInputRecord, parseEvidentialEvaluatorConfig, parseMarketIndexComparatorConfig, parseMetricCheckerConfig, parseReferenceCheckCounterConfig, parseTemporalDeadlineConfig, pickFiniteNumber, resolveComparisonResult } from '@lucern/confidence';
|
|
2
2
|
//# sourceMappingURL=epistemicContractHelpers.js.map
|
|
3
3
|
//# sourceMappingURL=epistemicContractHelpers.js.map
|
|
@@ -1,77 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
export { clearEpistemicEvaluators, getRegisteredEpistemicEvaluators, registerEpistemicEvaluator } from './epistemicContracts.evaluators.js';
|
|
2
|
+
export { createEpistemicContract, evaluateContract, evaluateContractsForTrigger, evaluateContradictionStatus, evaluateDependentBeliefCount, evaluateEdgeFreshness, evaluateEngineeringContracts, evaluateEvidenceCount, getContractCoverage, getContractStatus, inheritContractsForFork, processContractEvaluationOverflow } from './epistemicContracts.handlers.js';
|
|
3
|
+
export { EpistemicEvaluator, EpistemicEvaluatorContext, EpistemicEvaluatorResult } from './epistemicContracts.types.js';
|
|
4
|
+
import './convex.js';
|
|
3
5
|
import 'convex/values';
|
|
4
|
-
|
|
5
|
-
type BeliefNodeDoc = {
|
|
6
|
-
_id: Id<"epistemicNodes">;
|
|
7
|
-
nodeType: "belief";
|
|
8
|
-
canonicalText: string;
|
|
9
|
-
projectId?: string;
|
|
10
|
-
topicId?: Id<"topics"> | string;
|
|
11
|
-
confidence?: number;
|
|
12
|
-
status?: string;
|
|
13
|
-
[key: string]: unknown;
|
|
14
|
-
};
|
|
15
|
-
type ContractDoc = EpistemicContractRecord<Id<"epistemicNodes">, Id<"topics"> | string | undefined> & {
|
|
16
|
-
_id: string;
|
|
17
|
-
_creationTime: number;
|
|
18
|
-
};
|
|
19
|
-
type EpistemicEvaluatorResult = {
|
|
20
|
-
result: EpistemicContractEvaluationResult;
|
|
21
|
-
confidence?: number;
|
|
22
|
-
data?: unknown;
|
|
23
|
-
rationale: string;
|
|
24
|
-
};
|
|
25
|
-
type EpistemicEvaluatorContext = {
|
|
26
|
-
belief: BeliefNodeDoc;
|
|
27
|
-
contract: ContractDoc;
|
|
28
|
-
ctx: MutationCtx;
|
|
29
|
-
now: number;
|
|
30
|
-
resultData?: unknown;
|
|
31
|
-
trigger: string;
|
|
32
|
-
inputData?: unknown;
|
|
33
|
-
};
|
|
34
|
-
type EpistemicEvaluator = {
|
|
35
|
-
name: string;
|
|
36
|
-
evaluate(args: EpistemicEvaluatorContext): Promise<EpistemicEvaluatorResult> | EpistemicEvaluatorResult;
|
|
37
|
-
};
|
|
38
|
-
declare function clearEpistemicEvaluators(): void;
|
|
39
|
-
declare function registerEpistemicEvaluator(evaluator: EpistemicEvaluator): void;
|
|
40
|
-
declare function getRegisteredEpistemicEvaluators(): string[];
|
|
41
|
-
declare const evaluateEvidenceCount: any;
|
|
42
|
-
declare const evaluateContradictionStatus: any;
|
|
43
|
-
declare const evaluateEdgeFreshness: any;
|
|
44
|
-
declare const evaluateDependentBeliefCount: any;
|
|
45
|
-
declare const createEpistemicContract: any;
|
|
46
|
-
declare const evaluateContract: any;
|
|
47
|
-
declare const evaluateEngineeringContracts: any;
|
|
48
|
-
declare const evaluateContractsForTrigger: any;
|
|
49
|
-
declare const processContractEvaluationOverflow: any;
|
|
50
|
-
declare const getContractStatus: any;
|
|
51
|
-
declare const getContractCoverage: any;
|
|
52
|
-
declare function inheritContractsForFork<TBeliefId = string, TTopicId = string | undefined>(contracts: Array<{
|
|
53
|
-
status: string;
|
|
54
|
-
beliefNodeId: any;
|
|
55
|
-
contractId: string;
|
|
56
|
-
title: string;
|
|
57
|
-
description?: string;
|
|
58
|
-
conditionType: any;
|
|
59
|
-
direction: any;
|
|
60
|
-
condition: any;
|
|
61
|
-
deadline?: number;
|
|
62
|
-
compositeOf?: string[];
|
|
63
|
-
compositeOperator?: any;
|
|
64
|
-
modulation: any;
|
|
65
|
-
evaluationSchedule: any;
|
|
66
|
-
periodicIntervalMs?: number;
|
|
67
|
-
createdAt: number;
|
|
68
|
-
createdBy: string;
|
|
69
|
-
updatedAt: number;
|
|
70
|
-
}>, args: {
|
|
71
|
-
beliefNodeId: TBeliefId;
|
|
72
|
-
topicId?: TTopicId;
|
|
73
|
-
createdBy: string;
|
|
74
|
-
now: number;
|
|
75
|
-
}): EpistemicContractRecord<TBeliefId, TTopicId>[];
|
|
76
|
-
|
|
77
|
-
export { type EpistemicEvaluator, type EpistemicEvaluatorContext, type EpistemicEvaluatorResult, clearEpistemicEvaluators, createEpistemicContract, evaluateContract, evaluateContractsForTrigger, evaluateContradictionStatus, evaluateDependentBeliefCount, evaluateEdgeFreshness, evaluateEngineeringContracts, evaluateEvidenceCount, getContractCoverage, getContractStatus, getRegisteredEpistemicEvaluators, inheritContractsForFork, processContractEvaluationOverflow, registerEpistemicEvaluator };
|
|
6
|
+
import '@lucern/confidence';
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { MutationCtx, Id } from './convex.js';
|
|
2
|
+
import { BeliefNodeDoc, TriggerBatchResult, ContractDoc, ContractEvaluationExecution, EpistemicEvaluator } from './epistemicContracts.types.js';
|
|
3
|
+
import 'convex/values';
|
|
4
|
+
import '@lucern/confidence';
|
|
5
|
+
|
|
6
|
+
/** Evaluator registry and contract execution logic for epistemic contracts. */
|
|
7
|
+
|
|
8
|
+
declare function clearEpistemicEvaluators(): void;
|
|
9
|
+
declare function registerEpistemicEvaluator(evaluator: EpistemicEvaluator): void;
|
|
10
|
+
declare function getRegisteredEpistemicEvaluators(): string[];
|
|
11
|
+
declare function executeContractEvaluation(args: {
|
|
12
|
+
ctx: MutationCtx;
|
|
13
|
+
belief: BeliefNodeDoc;
|
|
14
|
+
contract: ContractDoc;
|
|
15
|
+
now: number;
|
|
16
|
+
trigger: string;
|
|
17
|
+
inputData?: unknown;
|
|
18
|
+
authenticatedUserId: string;
|
|
19
|
+
currentConfidence?: number;
|
|
20
|
+
resultData?: unknown;
|
|
21
|
+
}): Promise<ContractEvaluationExecution>;
|
|
22
|
+
declare function evaluateContractsForTriggerBatch(args: {
|
|
23
|
+
ctx: MutationCtx;
|
|
24
|
+
belief: BeliefNodeDoc;
|
|
25
|
+
trigger: string;
|
|
26
|
+
inputData?: unknown;
|
|
27
|
+
authenticatedUserId: string;
|
|
28
|
+
contractIds?: string[];
|
|
29
|
+
maxBatchSize?: number;
|
|
30
|
+
}): Promise<TriggerBatchResult>;
|
|
31
|
+
declare function loadContractsForBelief(args: {
|
|
32
|
+
ctx: MutationCtx;
|
|
33
|
+
beliefNodeId: Id<"epistemicNodes">;
|
|
34
|
+
}): Promise<ContractDoc[]>;
|
|
35
|
+
|
|
36
|
+
export { clearEpistemicEvaluators, evaluateContractsForTriggerBatch, executeContractEvaluation, getRegisteredEpistemicEvaluators, loadContractsForBelief, registerEpistemicEvaluator };
|