@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/convex.ts","../src/projectionStaleness.ts","../src/projectionReconciliation.ts"],"names":[],"mappings":"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","file":"projectionReconciliation.js","sourcesContent":["import {\n actionGeneric,\n anyApi,\n componentsGeneric,\n httpActionGeneric,\n internalActionGeneric,\n internalMutationGeneric,\n internalQueryGeneric,\n mutationGeneric,\n queryGeneric,\n} from \"convex/server\";\nimport type { GenericId } from \"convex/values\";\n\nexport const api = anyApi as any;\nexport const components = componentsGeneric() as any;\nexport const internal = anyApi as any;\n\nexport type TableNames = string;\nexport type Id<TableName extends TableNames = string> = GenericId<TableName>;\nexport type Doc<TableName extends TableNames = string> = any;\nexport type DataModel = any;\nexport type ActionCtx = any;\nexport type DatabaseReader = any;\nexport type DatabaseWriter = any;\nexport type MutationCtx = any;\nexport type QueryCtx = any;\n\nexport const action = actionGeneric as any;\nexport const httpAction = httpActionGeneric as any;\nexport const internalAction = internalActionGeneric as any;\nexport const internalMutation = internalMutationGeneric as any;\nexport const internalQuery = internalQueryGeneric as any;\nexport const mutation = mutationGeneric as any;\nexport const query = queryGeneric as any;\n","/**\n * projectionStaleness module implementation.\n */\n\nexport type ProjectionEndpointClass =\n | \"analytics\"\n | \"traversal\"\n | \"entity_read\"\n | \"non_graph\";\n\nexport type ProjectionFallbackMode =\n | \"fail_with_503\"\n | \"degrade_to_convex_depth_limited\"\n | \"fallback_to_convex_entity_read\"\n | \"none\";\n\nexport type ProjectionStalenessPolicy = {\n endpointClass: ProjectionEndpointClass;\n thresholdMs: number;\n fallbackMode: ProjectionFallbackMode;\n nonOverridable: true;\n};\n\nexport type ProjectionStalenessInput = {\n endpointClass: ProjectionEndpointClass;\n queueBacklogAgeMs: number;\n queuePendingCount: number;\n queueFailedCount: number;\n nowMs?: number;\n lastSuccessfulSyncAt?: number;\n};\n\nexport type ProjectionStalenessEnvelope = {\n endpointClass: ProjectionEndpointClass;\n stalenessMs: number;\n thresholdMs: number;\n isStale: boolean;\n fallbackMode: ProjectionFallbackMode;\n queuePendingCount: number;\n queueFailedCount: number;\n evaluatedAt: number;\n lastSuccessfulSyncAt?: number;\n lastSuccessfulSyncAgeMs?: number;\n reasonCode:\n | \"PROJECTION_HEALTHY\"\n | \"PROJECTION_STALE\"\n | \"PROJECTION_STALE_WITH_FAILED_RETRIES\";\n};\n\nexport const PROJECTION_STALENESS_POLICIES: Record<\n ProjectionEndpointClass,\n ProjectionStalenessPolicy\n> = {\n analytics: {\n endpointClass: \"analytics\",\n thresholdMs: 30_000,\n fallbackMode: \"fail_with_503\",\n nonOverridable: true,\n },\n traversal: {\n endpointClass: \"traversal\",\n thresholdMs: 60_000,\n fallbackMode: \"degrade_to_convex_depth_limited\",\n nonOverridable: true,\n },\n entity_read: {\n endpointClass: \"entity_read\",\n thresholdMs: 5 * 60_000,\n fallbackMode: \"fallback_to_convex_entity_read\",\n nonOverridable: true,\n },\n non_graph: {\n endpointClass: \"non_graph\",\n thresholdMs: Number.POSITIVE_INFINITY,\n fallbackMode: \"none\",\n nonOverridable: true,\n },\n};\n\nexport function getProjectionStalenessPolicy(\n endpointClass: ProjectionEndpointClass\n): ProjectionStalenessPolicy {\n return PROJECTION_STALENESS_POLICIES[endpointClass];\n}\n\nexport function evaluateProjectionStaleness(\n input: ProjectionStalenessInput\n): ProjectionStalenessEnvelope {\n const policy = getProjectionStalenessPolicy(input.endpointClass);\n const evaluatedAt = input.nowMs ?? Date.now();\n const stalenessMs = Math.max(0, input.queueBacklogAgeMs);\n const isStale = stalenessMs > policy.thresholdMs;\n const lastSuccessfulSyncAgeMs =\n input.lastSuccessfulSyncAt !== undefined\n ? Math.max(0, evaluatedAt - input.lastSuccessfulSyncAt)\n : undefined;\n\n return {\n endpointClass: input.endpointClass,\n stalenessMs,\n thresholdMs: policy.thresholdMs,\n isStale,\n fallbackMode: policy.fallbackMode,\n queuePendingCount: input.queuePendingCount,\n queueFailedCount: input.queueFailedCount,\n evaluatedAt,\n lastSuccessfulSyncAt: input.lastSuccessfulSyncAt,\n lastSuccessfulSyncAgeMs,\n reasonCode: isStale\n ? input.queueFailedCount > 0\n ? \"PROJECTION_STALE_WITH_FAILED_RETRIES\"\n : \"PROJECTION_STALE\"\n : \"PROJECTION_HEALTHY\",\n };\n}\n\nexport function shouldFailClosedForProjection(\n envelope: ProjectionStalenessEnvelope\n): boolean {\n return envelope.isStale && envelope.fallbackMode === \"fail_with_503\";\n}\n","/**\n * Projection Reconciliation Runtime\n *\n * Phase 2 (WT-C) runtime hooks for Convex-authoritative / Neo4j-projected\n * reconciliation health and endpoint-class staleness evaluation.\n */\n\nimport { v } from \"convex/values\";\nimport { getCurrentUserId } from \"@lucern/access-control/auth\";\nimport { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\nimport { internal, internalAction, internalQuery, query } from \"./convex\";\nimport {\n evaluateProjectionStaleness,\n type ProjectionEndpointClass,\n} from \"./projectionStaleness\";\n\ntype QueueStatus = \"pending\" | \"in_progress\" | \"failed\" | \"succeeded\";\n\ntype QueueRow = {\n status: QueueStatus;\n createdAt: number;\n updatedAt: number;\n};\n\nfunction maxTimestamp(\n rows: QueueRow[],\n field: \"createdAt\" | \"updatedAt\"\n): number | undefined {\n let maxValue: number | undefined;\n for (const row of rows) {\n const value = row[field];\n if (!Number.isFinite(value)) {\n continue;\n }\n if (maxValue === undefined || value > maxValue) {\n maxValue = value;\n }\n }\n return maxValue;\n}\n\nfunction minTimestamp(\n rows: QueueRow[],\n field: \"createdAt\" | \"updatedAt\"\n): number | undefined {\n let minValue: number | undefined;\n for (const row of rows) {\n const value = row[field];\n if (!Number.isFinite(value)) {\n continue;\n }\n if (minValue === undefined || value < minValue) {\n minValue = value;\n }\n }\n return minValue;\n}\n\nasync function getQueueSnapshot(ctx: any) {\n const [pendingRows, inProgressRows, failedRows, succeededRows] =\n await Promise.all([\n ctx.db\n .query(\"neo4jSyncQueue\")\n .withIndex(\"by_status\", (q: any) => q.eq(\"status\", \"pending\"))\n .collect() as Promise<QueueRow[]>,\n ctx.db\n .query(\"neo4jSyncQueue\")\n .withIndex(\"by_status\", (q: any) => q.eq(\"status\", \"in_progress\"))\n .collect() as Promise<QueueRow[]>,\n ctx.db\n .query(\"neo4jSyncQueue\")\n .withIndex(\"by_status\", (q: any) => q.eq(\"status\", \"failed\"))\n .collect() as Promise<QueueRow[]>,\n ctx.db\n .query(\"neo4jSyncQueue\")\n .withIndex(\"by_status\", (q: any) => q.eq(\"status\", \"succeeded\"))\n .collect() as Promise<QueueRow[]>,\n ]);\n\n const now = Date.now();\n const backlogOldestCreatedAt = minTimestamp(\n [...pendingRows, ...inProgressRows],\n \"createdAt\"\n );\n const queueBacklogAgeMs =\n backlogOldestCreatedAt !== undefined\n ? Math.max(0, now - backlogOldestCreatedAt)\n : 0;\n const lastSuccessfulSyncAt = maxTimestamp(succeededRows, \"updatedAt\");\n\n return {\n now,\n queuePendingCount: pendingRows.length,\n queueInProgressCount: inProgressRows.length,\n queueFailedCount: failedRows.length,\n queueSucceededCount: succeededRows.length,\n queueBacklogAgeMs,\n backlogOldestCreatedAt,\n lastSuccessfulSyncAt,\n };\n}\n\nfunction buildEndpointAssessments(\n snapshot: Awaited<ReturnType<typeof getQueueSnapshot>>\n) {\n const analytics = evaluateProjectionStaleness({\n endpointClass: \"analytics\",\n queueBacklogAgeMs: snapshot.queueBacklogAgeMs,\n queuePendingCount:\n snapshot.queuePendingCount + snapshot.queueInProgressCount,\n queueFailedCount: snapshot.queueFailedCount,\n nowMs: snapshot.now,\n lastSuccessfulSyncAt: snapshot.lastSuccessfulSyncAt,\n });\n const traversal = evaluateProjectionStaleness({\n endpointClass: \"traversal\",\n queueBacklogAgeMs: snapshot.queueBacklogAgeMs,\n queuePendingCount:\n snapshot.queuePendingCount + snapshot.queueInProgressCount,\n queueFailedCount: snapshot.queueFailedCount,\n nowMs: snapshot.now,\n lastSuccessfulSyncAt: snapshot.lastSuccessfulSyncAt,\n });\n const entityRead = evaluateProjectionStaleness({\n endpointClass: \"entity_read\",\n queueBacklogAgeMs: snapshot.queueBacklogAgeMs,\n queuePendingCount:\n snapshot.queuePendingCount + snapshot.queueInProgressCount,\n queueFailedCount: snapshot.queueFailedCount,\n nowMs: snapshot.now,\n lastSuccessfulSyncAt: snapshot.lastSuccessfulSyncAt,\n });\n const nonGraph = evaluateProjectionStaleness({\n endpointClass: \"non_graph\",\n queueBacklogAgeMs: snapshot.queueBacklogAgeMs,\n queuePendingCount:\n snapshot.queuePendingCount + snapshot.queueInProgressCount,\n queueFailedCount: snapshot.queueFailedCount,\n nowMs: snapshot.now,\n lastSuccessfulSyncAt: snapshot.lastSuccessfulSyncAt,\n });\n\n return {\n analytics,\n traversal,\n entityRead,\n nonGraph,\n };\n}\n\nfunction buildProjectionReconciliationStatus(\n snapshot: Awaited<ReturnType<typeof getQueueSnapshot>>\n) {\n return {\n ...snapshot,\n endpointAssessments: buildEndpointAssessments(snapshot),\n generatedAt: snapshot.now,\n };\n}\n\nfunction assertAuthenticated(clerkId: string | null): string {\n if (!clerkId) {\n throw new Error(\"Authentication required\");\n }\n return clerkId;\n}\n\nexport const getProjectionReconciliationStatusInternal = internalQuery({\n args: {},\n returns: permissiveReturn,\n handler: async (ctx) => {\n const snapshot = await getQueueSnapshot(ctx);\n return buildProjectionReconciliationStatus(snapshot);\n },\n});\n\nexport const getProjectionReconciliationStatus = query({\n args: {},\n returns: permissiveReturn,\n handler: async (ctx) => {\n assertAuthenticated(await getCurrentUserId(ctx));\n const snapshot = await getQueueSnapshot(ctx);\n return buildProjectionReconciliationStatus(snapshot);\n },\n});\n\nexport const assessProjectionStaleness = query({\n args: {\n endpointClass: v.union(\n v.literal(\"analytics\"),\n v.literal(\"traversal\"),\n v.literal(\"entity_read\"),\n v.literal(\"non_graph\")\n ),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n assertAuthenticated(await getCurrentUserId(ctx));\n const snapshot = await getQueueSnapshot(ctx);\n const endpointClass = args.endpointClass as ProjectionEndpointClass;\n\n return {\n endpointClass,\n assessment: evaluateProjectionStaleness({\n endpointClass,\n queueBacklogAgeMs: snapshot.queueBacklogAgeMs,\n queuePendingCount:\n snapshot.queuePendingCount + snapshot.queueInProgressCount,\n queueFailedCount: snapshot.queueFailedCount,\n nowMs: snapshot.now,\n lastSuccessfulSyncAt: snapshot.lastSuccessfulSyncAt,\n }),\n snapshot,\n };\n },\n});\n\nexport const runProjectionRepairCycle = internalAction({\n args: {\n limit: v.optional(v.number()),\n },\n returns: permissiveReturn,\n handler: async (ctx, args) => {\n const processed = await ctx.runAction(\n internal.neo4jSync.processRetryQueue,\n {\n limit: args.limit ?? 25,\n }\n );\n const status = await ctx.runQuery(\n internal.projectionReconciliation\n .getProjectionReconciliationStatusInternal,\n {}\n );\n\n return {\n processed,\n status,\n runAt: Date.now(),\n };\n },\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/convex.ts","../src/projectionStaleness.ts","../src/projectionReconciliation.ts"],"names":[],"mappings":"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","file":"projectionReconciliation.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 * projectionStaleness module implementation.\n */\n\nexport type ProjectionEndpointClass =\n | \"analytics\"\n | \"traversal\"\n | \"entity_read\"\n | \"non_graph\";\n\nexport type ProjectionFallbackMode =\n | \"fail_with_503\"\n | \"degrade_to_convex_depth_limited\"\n | \"fallback_to_convex_entity_read\"\n | \"none\";\n\nexport type ProjectionStalenessPolicy = {\n endpointClass: ProjectionEndpointClass;\n thresholdMs: number;\n fallbackMode: ProjectionFallbackMode;\n nonOverridable: true;\n};\n\nexport type ProjectionStalenessInput = {\n endpointClass: ProjectionEndpointClass;\n queueBacklogAgeMs: number;\n queuePendingCount: number;\n queueFailedCount: number;\n nowMs?: number;\n lastSuccessfulSyncAt?: number;\n};\n\nexport type ProjectionStalenessEnvelope = {\n endpointClass: ProjectionEndpointClass;\n stalenessMs: number;\n thresholdMs: number;\n isStale: boolean;\n fallbackMode: ProjectionFallbackMode;\n queuePendingCount: number;\n queueFailedCount: number;\n evaluatedAt: number;\n lastSuccessfulSyncAt?: number;\n lastSuccessfulSyncAgeMs?: number;\n reasonCode:\n | \"PROJECTION_HEALTHY\"\n | \"PROJECTION_STALE\"\n | \"PROJECTION_STALE_WITH_FAILED_RETRIES\";\n};\n\nexport const PROJECTION_STALENESS_POLICIES: Record<\n ProjectionEndpointClass,\n ProjectionStalenessPolicy\n> = {\n analytics: {\n endpointClass: \"analytics\",\n thresholdMs: 30_000,\n fallbackMode: \"fail_with_503\",\n nonOverridable: true,\n },\n traversal: {\n endpointClass: \"traversal\",\n thresholdMs: 60_000,\n fallbackMode: \"degrade_to_convex_depth_limited\",\n nonOverridable: true,\n },\n entity_read: {\n endpointClass: \"entity_read\",\n thresholdMs: 5 * 60_000,\n fallbackMode: \"fallback_to_convex_entity_read\",\n nonOverridable: true,\n },\n non_graph: {\n endpointClass: \"non_graph\",\n thresholdMs: Number.POSITIVE_INFINITY,\n fallbackMode: \"none\",\n nonOverridable: true,\n },\n};\n\nexport function getProjectionStalenessPolicy(\n endpointClass: ProjectionEndpointClass\n): ProjectionStalenessPolicy {\n return PROJECTION_STALENESS_POLICIES[endpointClass];\n}\n\nexport function evaluateProjectionStaleness(\n input: ProjectionStalenessInput\n): ProjectionStalenessEnvelope {\n const policy = getProjectionStalenessPolicy(input.endpointClass);\n const evaluatedAt = input.nowMs ?? Date.now();\n const stalenessMs = Math.max(0, input.queueBacklogAgeMs);\n const isStale = stalenessMs > policy.thresholdMs;\n const lastSuccessfulSyncAgeMs =\n input.lastSuccessfulSyncAt !== undefined\n ? Math.max(0, evaluatedAt - input.lastSuccessfulSyncAt)\n : undefined;\n\n return {\n endpointClass: input.endpointClass,\n stalenessMs,\n thresholdMs: policy.thresholdMs,\n isStale,\n fallbackMode: policy.fallbackMode,\n queuePendingCount: input.queuePendingCount,\n queueFailedCount: input.queueFailedCount,\n evaluatedAt,\n lastSuccessfulSyncAt: input.lastSuccessfulSyncAt,\n lastSuccessfulSyncAgeMs,\n reasonCode: isStale\n ? input.queueFailedCount > 0\n ? \"PROJECTION_STALE_WITH_FAILED_RETRIES\"\n : \"PROJECTION_STALE\"\n : \"PROJECTION_HEALTHY\",\n };\n}\n\nexport function shouldFailClosedForProjection(\n envelope: ProjectionStalenessEnvelope\n): boolean {\n return envelope.isStale && envelope.fallbackMode === \"fail_with_503\";\n}\n","/**\n * Projection Reconciliation Runtime\n *\n * Phase 2 (WT-C) runtime hooks for Convex-authoritative / Neo4j-projected\n * reconciliation health and endpoint-class staleness evaluation.\n */\n\nimport { v } from \"convex/values\";\nimport { getCurrentUserId } from \"@lucern/access-control/auth\";\nimport { permissiveReturn } from \"@lucern/contracts/schema-helpers/validators\";\nimport { internal, internalAction, internalQuery, query } from \"./convex\";\nimport type { ActionCtx, QueryCtx } from \"./convex\";\nimport {\n evaluateProjectionStaleness,\n type ProjectionEndpointClass,\n} from \"./projectionStaleness\";\ntype QueueStatus = \"pending\" | \"in_progress\" | \"failed\" | \"succeeded\";\n\ntype QueueRow = {\n status: QueueStatus;\n createdAt: number;\n updatedAt: number;\n};\n\ntype IndexQueryBuilder = {\n eq(field: string, value: unknown): IndexQueryBuilder;\n};\n\nfunction maxTimestamp(\n rows: QueueRow[],\n field: \"createdAt\" | \"updatedAt\"\n): number | undefined {\n let maxValue: number | undefined;\n for (const row of rows) {\n const value = row[field];\n if (!Number.isFinite(value)) {\n continue;\n }\n if (maxValue === undefined || value > maxValue) {\n maxValue = value;\n }\n }\n return maxValue;\n}\n\nfunction minTimestamp(\n rows: QueueRow[],\n field: \"createdAt\" | \"updatedAt\"\n): number | undefined {\n let minValue: number | undefined;\n for (const row of rows) {\n const value = row[field];\n if (!Number.isFinite(value)) {\n continue;\n }\n if (minValue === undefined || value < minValue) {\n minValue = value;\n }\n }\n return minValue;\n}\n\nasync function getQueueSnapshot(ctx: QueryCtx) {\n const [pendingRows, inProgressRows, failedRows, succeededRows] =\n await Promise.all([\n ctx.db\n .query(\"neo4jSyncQueue\")\n .withIndex(\"by_status\", (q: IndexQueryBuilder) => q.eq(\"status\", \"pending\"))\n .collect() as Promise<QueueRow[]>,\n ctx.db\n .query(\"neo4jSyncQueue\")\n .withIndex(\"by_status\", (q: IndexQueryBuilder) => q.eq(\"status\", \"in_progress\"))\n .collect() as Promise<QueueRow[]>,\n ctx.db\n .query(\"neo4jSyncQueue\")\n .withIndex(\"by_status\", (q: IndexQueryBuilder) => q.eq(\"status\", \"failed\"))\n .collect() as Promise<QueueRow[]>,\n ctx.db\n .query(\"neo4jSyncQueue\")\n .withIndex(\"by_status\", (q: IndexQueryBuilder) => q.eq(\"status\", \"succeeded\"))\n .collect() as Promise<QueueRow[]>,\n ]);\n\n const now = Date.now();\n const backlogOldestCreatedAt = minTimestamp(\n [...pendingRows, ...inProgressRows],\n \"createdAt\"\n );\n const queueBacklogAgeMs =\n backlogOldestCreatedAt !== undefined\n ? Math.max(0, now - backlogOldestCreatedAt)\n : 0;\n const lastSuccessfulSyncAt = maxTimestamp(succeededRows, \"updatedAt\");\n\n return {\n now,\n queuePendingCount: pendingRows.length,\n queueInProgressCount: inProgressRows.length,\n queueFailedCount: failedRows.length,\n queueSucceededCount: succeededRows.length,\n queueBacklogAgeMs,\n backlogOldestCreatedAt,\n lastSuccessfulSyncAt,\n };\n}\n\nfunction buildEndpointAssessments(\n snapshot: Awaited<ReturnType<typeof getQueueSnapshot>>\n) {\n const analytics = evaluateProjectionStaleness({\n endpointClass: \"analytics\",\n queueBacklogAgeMs: snapshot.queueBacklogAgeMs,\n queuePendingCount:\n snapshot.queuePendingCount + snapshot.queueInProgressCount,\n queueFailedCount: snapshot.queueFailedCount,\n nowMs: snapshot.now,\n lastSuccessfulSyncAt: snapshot.lastSuccessfulSyncAt,\n });\n const traversal = evaluateProjectionStaleness({\n endpointClass: \"traversal\",\n queueBacklogAgeMs: snapshot.queueBacklogAgeMs,\n queuePendingCount:\n snapshot.queuePendingCount + snapshot.queueInProgressCount,\n queueFailedCount: snapshot.queueFailedCount,\n nowMs: snapshot.now,\n lastSuccessfulSyncAt: snapshot.lastSuccessfulSyncAt,\n });\n const entityRead = evaluateProjectionStaleness({\n endpointClass: \"entity_read\",\n queueBacklogAgeMs: snapshot.queueBacklogAgeMs,\n queuePendingCount:\n snapshot.queuePendingCount + snapshot.queueInProgressCount,\n queueFailedCount: snapshot.queueFailedCount,\n nowMs: snapshot.now,\n lastSuccessfulSyncAt: snapshot.lastSuccessfulSyncAt,\n });\n const nonGraph = evaluateProjectionStaleness({\n endpointClass: \"non_graph\",\n queueBacklogAgeMs: snapshot.queueBacklogAgeMs,\n queuePendingCount:\n snapshot.queuePendingCount + snapshot.queueInProgressCount,\n queueFailedCount: snapshot.queueFailedCount,\n nowMs: snapshot.now,\n lastSuccessfulSyncAt: snapshot.lastSuccessfulSyncAt,\n });\n\n return {\n analytics,\n traversal,\n entityRead,\n nonGraph,\n };\n}\n\nfunction buildProjectionReconciliationStatus(\n snapshot: Awaited<ReturnType<typeof getQueueSnapshot>>\n) {\n return {\n ...snapshot,\n endpointAssessments: buildEndpointAssessments(snapshot),\n generatedAt: snapshot.now,\n };\n}\n\nfunction assertAuthenticated(clerkId: string | null): string {\n if (!clerkId) {\n throw new Error(\"Authentication required\");\n }\n return clerkId;\n}\n\nexport const getProjectionReconciliationStatusInternal = internalQuery({\n args: {},\n returns: permissiveReturn,\n handler: async (ctx: QueryCtx) => {\n const snapshot = await getQueueSnapshot(ctx);\n return buildProjectionReconciliationStatus(snapshot);\n },\n});\n\nexport const getProjectionReconciliationStatus = query({\n args: {},\n returns: permissiveReturn,\n handler: async (ctx: QueryCtx) => {\n assertAuthenticated(await getCurrentUserId(ctx));\n const snapshot = await getQueueSnapshot(ctx);\n return buildProjectionReconciliationStatus(snapshot);\n },\n});\n\nexport const assessProjectionStaleness = query({\n args: {\n endpointClass: v.union(\n v.literal(\"analytics\"),\n v.literal(\"traversal\"),\n v.literal(\"entity_read\"),\n v.literal(\"non_graph\")\n ),\n },\n returns: permissiveReturn,\n handler: async (\n ctx: QueryCtx,\n args: { endpointClass: ProjectionEndpointClass }\n ) => {\n assertAuthenticated(await getCurrentUserId(ctx));\n const snapshot = await getQueueSnapshot(ctx);\n const endpointClass = args.endpointClass as ProjectionEndpointClass;\n\n return {\n endpointClass,\n assessment: evaluateProjectionStaleness({\n endpointClass,\n queueBacklogAgeMs: snapshot.queueBacklogAgeMs,\n queuePendingCount:\n snapshot.queuePendingCount + snapshot.queueInProgressCount,\n queueFailedCount: snapshot.queueFailedCount,\n nowMs: snapshot.now,\n lastSuccessfulSyncAt: snapshot.lastSuccessfulSyncAt,\n }),\n snapshot,\n };\n },\n});\n\nexport const runProjectionRepairCycle = internalAction({\n args: {\n limit: v.optional(v.number()),\n },\n returns: permissiveReturn,\n handler: async (ctx: ActionCtx, args: { limit?: number }) => {\n const processed = await ctx.runAction(\n internal.neo4jSync.processRetryQueue,\n {\n limit: args.limit ?? 25,\n }\n );\n const status = await ctx.runQuery(\n internal.projectionReconciliation\n .getProjectionReconciliationStatusInternal,\n {}\n );\n\n return {\n processed,\n status,\n runAt: Date.now(),\n };\n },\n});\n"]}
|
|
@@ -787,7 +787,10 @@ var create = mutation({
|
|
|
787
787
|
if (!insight) {
|
|
788
788
|
throw new Error("Insight not found");
|
|
789
789
|
}
|
|
790
|
-
const existingLinks = await ctx.db.query("questionEvidenceLinks").withIndex(
|
|
790
|
+
const existingLinks = await ctx.db.query("questionEvidenceLinks").withIndex(
|
|
791
|
+
"by_questionId",
|
|
792
|
+
(q) => q.eq("questionId", args.questionId)
|
|
793
|
+
).collect();
|
|
791
794
|
const duplicate = existingLinks.find(
|
|
792
795
|
(link) => link.insightId === args.insightId
|
|
793
796
|
);
|
|
@@ -991,7 +994,10 @@ var getByQuestion = query({
|
|
|
991
994
|
},
|
|
992
995
|
returns: permissiveReturn,
|
|
993
996
|
handler: async (ctx, args) => {
|
|
994
|
-
const links = await ctx.db.query("questionEvidenceLinks").withIndex(
|
|
997
|
+
const links = await ctx.db.query("questionEvidenceLinks").withIndex(
|
|
998
|
+
"by_questionId",
|
|
999
|
+
(q) => q.eq("questionId", args.questionId)
|
|
1000
|
+
).collect();
|
|
995
1001
|
return links.filter(
|
|
996
1002
|
(link) => isOperationalLinkStatus(link.status)
|
|
997
1003
|
);
|
|
@@ -1003,7 +1009,10 @@ var getPendingSuggestions = query({
|
|
|
1003
1009
|
},
|
|
1004
1010
|
returns: permissiveReturn,
|
|
1005
1011
|
handler: async (ctx, args) => {
|
|
1006
|
-
const links = await ctx.db.query("questionEvidenceLinks").withIndex(
|
|
1012
|
+
const links = await ctx.db.query("questionEvidenceLinks").withIndex(
|
|
1013
|
+
"by_questionId",
|
|
1014
|
+
(q) => q.eq("questionId", args.questionId)
|
|
1015
|
+
).collect();
|
|
1007
1016
|
return links.filter((link) => link.status === "suggested");
|
|
1008
1017
|
}
|
|
1009
1018
|
});
|
|
@@ -1013,7 +1022,10 @@ var getByInsight = query({
|
|
|
1013
1022
|
},
|
|
1014
1023
|
returns: permissiveReturn,
|
|
1015
1024
|
handler: async (ctx, args) => {
|
|
1016
|
-
const links = await ctx.db.query("questionEvidenceLinks").withIndex(
|
|
1025
|
+
const links = await ctx.db.query("questionEvidenceLinks").withIndex(
|
|
1026
|
+
"by_insightId",
|
|
1027
|
+
(q) => q.eq("insightId", args.insightId)
|
|
1028
|
+
).collect();
|
|
1017
1029
|
return links.filter(
|
|
1018
1030
|
(link) => isOperationalLinkStatus(link.status)
|
|
1019
1031
|
);
|
|
@@ -1029,7 +1041,10 @@ var getEvidenceWithDetails = query({
|
|
|
1029
1041
|
if (!questionNode || questionNode.nodeType !== "question") {
|
|
1030
1042
|
return [];
|
|
1031
1043
|
}
|
|
1032
|
-
const links = await ctx.db.query("questionEvidenceLinks").withIndex(
|
|
1044
|
+
const links = await ctx.db.query("questionEvidenceLinks").withIndex(
|
|
1045
|
+
"by_questionId",
|
|
1046
|
+
(q) => q.eq("questionId", args.questionId)
|
|
1047
|
+
).collect();
|
|
1033
1048
|
const linksWithDetails = await Promise.all(
|
|
1034
1049
|
links.filter(
|
|
1035
1050
|
(link) => isOperationalLinkStatus(
|
|
@@ -1131,7 +1146,10 @@ var getByProject = query({
|
|
|
1131
1146
|
const questionIds = questions.slice(0, pageSize).map((q) => q._id);
|
|
1132
1147
|
const allLinks = await Promise.all(
|
|
1133
1148
|
questionIds.map(async (questionId) => {
|
|
1134
|
-
const links = await ctx.db.query("questionEvidenceLinks").withIndex(
|
|
1149
|
+
const links = await ctx.db.query("questionEvidenceLinks").withIndex(
|
|
1150
|
+
"by_questionId",
|
|
1151
|
+
(q) => q.eq("questionId", questionId)
|
|
1152
|
+
).collect();
|
|
1135
1153
|
return links.filter(
|
|
1136
1154
|
(link) => isOperationalLinkStatus(
|
|
1137
1155
|
link.status
|
|
@@ -1161,7 +1179,10 @@ var getLinkedQuestionsForInsight = query({
|
|
|
1161
1179
|
},
|
|
1162
1180
|
returns: permissiveReturn,
|
|
1163
1181
|
handler: async (ctx, args) => {
|
|
1164
|
-
const links = await ctx.db.query("questionEvidenceLinks").withIndex(
|
|
1182
|
+
const links = await ctx.db.query("questionEvidenceLinks").withIndex(
|
|
1183
|
+
"by_insightId",
|
|
1184
|
+
(q) => q.eq("insightId", args.insightId)
|
|
1185
|
+
).collect();
|
|
1165
1186
|
const linkedQuestions = await Promise.all(
|
|
1166
1187
|
links.filter(
|
|
1167
1188
|
(link) => isOperationalLinkStatus(
|