@absolutejs/absolute 0.19.0-beta.616 → 0.19.0-beta.617

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.
@@ -3,11 +3,11 @@
3
3
  "sources": ["../types/typeGuards.ts", "../src/ai/rag/quality.ts", "../src/ai/protocol.ts", "../src/ai/rag/grounding.ts"],
4
4
  "sourcesContent": [
5
5
  "import type { AIClientMessage, AIServerMessage } from './ai';\nimport type { HMRClientMessage } from './messages';\n\n/* Type guard for AI client messages */\nexport const isValidAIClientMessage = (\n\tdata: unknown\n): data is AIClientMessage => {\n\tif (!data || typeof data !== 'object') {\n\t\treturn false;\n\t}\n\n\tif (!('type' in data) || typeof data.type !== 'string') {\n\t\treturn false;\n\t}\n\n\tswitch (data.type) {\n\t\tcase 'message':\n\t\t\treturn 'content' in data && typeof data.content === 'string';\n\t\tcase 'cancel':\n\t\t\treturn (\n\t\t\t\t'conversationId' in data &&\n\t\t\t\ttypeof data.conversationId === 'string'\n\t\t\t);\n\t\tcase 'branch':\n\t\t\treturn (\n\t\t\t\t'messageId' in data &&\n\t\t\t\ttypeof data.messageId === 'string' &&\n\t\t\t\t'content' in data &&\n\t\t\t\ttypeof data.content === 'string' &&\n\t\t\t\t'conversationId' in data &&\n\t\t\t\ttypeof data.conversationId === 'string'\n\t\t\t);\n\t\tdefault:\n\t\t\treturn false;\n\t}\n};\n\n/* Type guard for AI server messages */\nexport const isValidAIServerMessage = (\n\tdata: unknown\n): data is AIServerMessage => {\n\tif (!data || typeof data !== 'object') {\n\t\treturn false;\n\t}\n\n\tif (!('type' in data) || typeof data.type !== 'string') {\n\t\treturn false;\n\t}\n\n\tswitch (data.type) {\n\t\tcase 'chunk':\n\t\t\treturn (\n\t\t\t\t'content' in data &&\n\t\t\t\ttypeof data.content === 'string' &&\n\t\t\t\t'messageId' in data &&\n\t\t\t\t'conversationId' in data\n\t\t\t);\n\t\tcase 'thinking':\n\t\t\treturn (\n\t\t\t\t'content' in data &&\n\t\t\t\ttypeof data.content === 'string' &&\n\t\t\t\t'messageId' in data &&\n\t\t\t\t'conversationId' in data\n\t\t\t);\n\t\tcase 'tool_status':\n\t\t\treturn (\n\t\t\t\t'name' in data &&\n\t\t\t\t'status' in data &&\n\t\t\t\t'messageId' in data &&\n\t\t\t\t'conversationId' in data\n\t\t\t);\n\t\tcase 'image':\n\t\t\treturn (\n\t\t\t\t'data' in data &&\n\t\t\t\ttypeof data.data === 'string' &&\n\t\t\t\t'format' in data &&\n\t\t\t\ttypeof data.format === 'string' &&\n\t\t\t\t'isPartial' in data &&\n\t\t\t\ttypeof data.isPartial === 'boolean' &&\n\t\t\t\t'messageId' in data &&\n\t\t\t\t'conversationId' in data\n\t\t\t);\n\t\tcase 'complete':\n\t\t\treturn 'messageId' in data && 'conversationId' in data;\n\t\tcase 'rag_retrieved':\n\t\t\treturn (\n\t\t\t\t'conversationId' in data &&\n\t\t\t\t'messageId' in data &&\n\t\t\t\t'sources' in data &&\n\t\t\t\tArray.isArray(data.sources)\n\t\t\t);\n\t\tcase 'error':\n\t\t\treturn 'message' in data && typeof data.message === 'string';\n\t\tdefault:\n\t\t\treturn false;\n\t}\n};\n\n/* Type guard for HMR client messages */\nexport const isValidHMRClientMessage = (\n\tdata: unknown\n): data is HMRClientMessage => {\n\tif (!data || typeof data !== 'object') {\n\t\treturn false;\n\t}\n\n\tif (!('type' in data) || typeof data.type !== 'string') {\n\t\treturn false;\n\t}\n\n\tswitch (data.type) {\n\t\tcase 'ping':\n\t\t\treturn true;\n\t\tcase 'ready':\n\t\t\treturn true;\n\t\tcase 'request-rebuild':\n\t\t\treturn true;\n\t\tcase 'hydration-error':\n\t\t\treturn true;\n\t\tcase 'hmr-timing':\n\t\t\treturn true;\n\t\tdefault:\n\t\t\treturn false;\n\t}\n};\n",
6
- "import { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { dirname } from 'node:path';\nimport type { Database } from 'bun:sqlite';\nimport type {\n\tRAGAnswerGroundingCaseDifficultyDiffEntry,\n\tRAGAnswerGroundingCaseDifficultyHistory,\n\tRAGAnswerGroundingCaseDifficultyHistoryStore,\n\tRAGAnswerGroundingCaseDifficultyRun,\n\tRAGAnswerGroundingCaseDifficultyRunDiff,\n\tRAGAnswerGroundingEvaluationCaseDiff,\n\tRAGAnswerGroundingEvaluationCase,\n\tRAGAnswerGroundingEvaluationCaseDifficultyEntry,\n\tRAGAnswerGroundingEvaluationCaseSnapshot,\n\tRAGAnswerGroundingEvaluationCaseResult,\n\tRAGAnswerGroundingEvaluationHistory,\n\tRAGAnswerGroundingEvaluationLeaderboardEntry,\n\tRAGAnswerGroundingEvaluationHistoryStore,\n\tRAGAnswerGroundingEvaluationInput,\n\tRAGAnswerGroundingEvaluationResponse,\n\tRAGAnswerGroundingEvaluationRun,\n\tRAGAnswerGroundingEvaluationRunDiff,\n\tRAGCollection,\n\tRAGEvaluationCase,\n\tRAGEvaluationCaseDiff,\n\tRAGEvaluationCaseTraceSnapshot,\n\tRAGEvaluationCaseResult,\n\tRAGEvaluationHistory,\n\tRAGEvaluationHistoryStore,\n\tRAGEvaluationInput,\n\tRAGEvaluationLeaderboardEntry,\n\tRAGEvaluationResponse,\n\tRAGEvaluationRunDiff,\n\tRAGLabelValueRow,\n\tRAGComparisonPresentation,\n\tRAGComparisonOverviewPresentation,\n\tRAGGroundingProviderPresentation,\n\tRAGGroundingProviderOverviewPresentation,\n\tRAGGroundingProviderCaseComparisonPresentation,\n\tRAGGroundingOverviewPresentation,\n\tRAGQualityOverviewPresentation,\n\tRAGEvaluationSuite,\n\tRAGEvaluationSuiteRun,\n\tRAGRetrievalTraceSummaryRun,\n\tRAGHybridRetrievalMode,\n\tRAGSourceBalanceStrategy,\n\tRAGRetrievalCandidate,\n\tRAGRetrievalComparison,\n\tRAGRetrievalBaselineGatePolicy,\n\tRAGRetrievalBaselineGatePolicyHistoryRecord,\n\tRAGRetrievalBaselineGatePolicyHistoryStore,\n\tRAGRetrievalComparisonDecisionSummary,\n\tRAGRetrievalComparisonGateResult,\n\tRAGRetrievalReleaseVerdict,\n\tRAGRetrievalComparisonHistoryStore,\n\tRAGRetrievalBaselineRecord,\n\tRAGRetrievalBaselineStore,\n\tRAGRetrievalLaneHandoffDecisionRecord,\n\tRAGRetrievalLaneHandoffDecisionStore,\n\tRAGRetrievalLaneHandoffIncidentHistoryRecord,\n\tRAGRetrievalLaneHandoffIncidentHistoryStore,\n\tRAGRetrievalLaneHandoffAutoCompletePolicyHistoryRecord,\n\tRAGRetrievalLaneHandoffAutoCompletePolicyHistoryStore,\n\tRAGRetrievalLaneHandoffIncidentRecord,\n\tRAGRetrievalLaneHandoffIncidentStore,\n\tRAGRetrievalIncidentRemediationDecisionRecord,\n\tRAGRetrievalIncidentRemediationDecisionStore,\n\tRAGRetrievalIncidentRemediationExecutionHistoryRecord,\n\tRAGRetrievalIncidentRemediationExecutionHistoryStore,\n\tRAGRetrievalReleaseDecisionRecord,\n\tRAGRetrievalReleaseLanePolicyHistoryRecord,\n\tRAGRetrievalReleaseLanePolicyHistoryStore,\n\tRAGRetrievalReleaseLaneEscalationPolicyHistoryRecord,\n\tRAGRetrievalReleaseLaneEscalationPolicyHistoryStore,\n\tRAGRetrievalReleaseDecisionStore,\n\tRAGRetrievalReleaseIncidentRecord,\n\tRAGRetrievalReleaseIncidentStore,\n\tRAGRetrievalComparisonRun,\n\tRAGRetrievalComparisonEntry,\n\tRAGRetrievalTrace,\n\tRAGRetrievalTraceComparisonSummary,\n\tRAGRetrievalTraceComparisonSummaryDiff,\n\tRAGRetrievalTraceStep,\n\tRAGRetrievalTraceStage,\n\tRAGTraceSummaryListTrend,\n\tRAGTraceSummaryTrendDirection,\n\tRAGTraceSummaryNumericDelta,\n\tRAGTraceSummaryStageTrend,\n\tRAGTraceSummaryStageCountsDelta,\n\tRAGRetrievalComparisonSummary,\n\tRAGRetrievalTraceHistoryWindow,\n\tRAGRerankerCandidate,\n\tRAGRerankerComparison,\n\tRAGRerankerComparisonEntry,\n\tRAGRerankerComparisonSummary,\n\tRAGRerankerProviderLike,\n\tRAGRetrievalTraceTrend,\n\tRAGSearchTraceDiff,\n\tRAGSearchTraceGroupHistory,\n\tRAGSearchTraceGroupHistoryEntry,\n\tRAGSearchTraceHistory,\n\tRAGSearchTracePruneInput,\n\tRAGSearchTracePruneHistoryStore,\n\tRAGSearchTracePruneRun,\n\tRAGSearchTracePrunePreview,\n\tRAGSearchTracePruneResult,\n\tRAGSearchTraceRecord,\n\tRAGSearchTraceResultSnapshot,\n\tRAGSearchTraceStats,\n\tRAGSearchTraceStore,\n\tRAGRemediationAction,\n\tRAGSource,\n\tRAGCollectionSearchParams\n} from '../../../types/ai';\nimport { generateId } from '../protocol';\nimport { buildRAGGroundedAnswer } from './grounding';\n\nconst DEFAULT_TOP_K = 6;\nconst DEFAULT_HISTORY_LIMIT = 20;\nconst DEFAULT_SEARCH_TRACE_TABLE_NAME = 'rag_search_traces';\ntype BunSQLiteModule = {\n\tDatabase: new (path?: string) => Database;\n};\n\ntype ImportMetaWithRequire = ImportMeta & {\n\trequire?: (specifier: string) => unknown;\n};\n\nconst loadBunSQLiteModule = (): BunSQLiteModule => {\n\tconst runtimeRequire = (import.meta as ImportMetaWithRequire).require;\n\tif (typeof runtimeRequire !== 'function') {\n\t\tthrow new Error(\n\t\t\t'SQLite trace storage requires Bun runtime support for import.meta.require.'\n\t\t);\n\t}\n\n\treturn runtimeRequire('bun:sqlite') as BunSQLiteModule;\n};\n\nconst normalizeStringArray = (value: unknown) => {\n\tif (!Array.isArray(value)) {\n\t\treturn [];\n\t}\n\n\treturn value\n\t\t.filter((candidate) => typeof candidate === 'string')\n\t\t.map((candidate) => candidate.trim())\n\t\t.filter((candidate) => candidate.length > 0);\n};\n\nconst normalizeLabelFilter = (value?: string) => {\n\tif (typeof value !== 'string') {\n\t\treturn undefined;\n\t}\n\n\tconst normalized = value.trim().toLowerCase();\n\treturn normalized.length > 0 ? normalized : undefined;\n};\n\nconst normalizeRetrievalBaselineRecords = (\n\trecords: RAGRetrievalBaselineRecord[]\n) => [...records].sort((left, right) => right.promotedAt - left.promotedAt);\n\nconst normalizeRetrievalReleaseDecisionRecords = (\n\trecords: RAGRetrievalReleaseDecisionRecord[]\n) => [...records].sort((left, right) => right.decidedAt - left.decidedAt);\n\nconst normalizeRetrievalLaneHandoffDecisionRecords = (\n\trecords: RAGRetrievalLaneHandoffDecisionRecord[]\n) => [...records].sort((left, right) => right.decidedAt - left.decidedAt);\n\nconst normalizeRetrievalReleaseIncidentRecords = (\n\trecords: RAGRetrievalReleaseIncidentRecord[]\n) => [...records].sort((left, right) => right.triggeredAt - left.triggeredAt);\n\nconst normalizeRetrievalIncidentRemediationDecisionRecords = (\n\trecords: RAGRetrievalIncidentRemediationDecisionRecord[]\n) => [...records].sort((left, right) => right.decidedAt - left.decidedAt);\n\nconst normalizeRetrievalIncidentRemediationExecutionHistoryRecords = (\n\trecords: RAGRetrievalIncidentRemediationExecutionHistoryRecord[]\n) => [...records].sort((left, right) => right.executedAt - left.executedAt);\n\nconst matchesWinner = (run: RAGRetrievalComparisonRun, winnerId?: string) => {\n\tif (!winnerId) {\n\t\treturn true;\n\t}\n\n\treturn (\n\t\trun.comparison.summary.bestByPassingRate === winnerId ||\n\t\trun.decisionSummary?.winnerByPassingRate === winnerId\n\t);\n};\n\nconst findRetrievalComparisonEntry = (\n\tcomparison: RAGRetrievalComparison,\n\tretrievalId?: string\n) => {\n\tif (!retrievalId) {\n\t\treturn undefined;\n\t}\n\n\treturn comparison.entries.find(\n\t\t(entry) => entry.retrievalId === retrievalId\n\t);\n};\n\nconst evaluateRetrievalComparisonGate = ({\n\tdelta,\n\tpolicy\n}: {\n\tdelta?: {\n\t\tpassingRateDelta: number;\n\t\taverageF1Delta: number;\n\t\telapsedMsDelta: number;\n\t};\n\tpolicy?: RAGRetrievalBaselineGatePolicy;\n}): RAGRetrievalComparisonGateResult | undefined => {\n\tif (!delta || !policy) {\n\t\treturn undefined;\n\t}\n\n\tconst reasons: string[] = [];\n\tif (\n\t\ttypeof policy.minPassingRateDelta === 'number' &&\n\t\tdelta.passingRateDelta < policy.minPassingRateDelta\n\t) {\n\t\treasons.push(\n\t\t\t`passing rate delta ${delta.passingRateDelta} is below ${policy.minPassingRateDelta}`\n\t\t);\n\t}\n\tif (\n\t\ttypeof policy.minAverageF1Delta === 'number' &&\n\t\tdelta.averageF1Delta < policy.minAverageF1Delta\n\t) {\n\t\treasons.push(\n\t\t\t`average F1 delta ${delta.averageF1Delta} is below ${policy.minAverageF1Delta}`\n\t\t);\n\t}\n\tif (\n\t\ttypeof policy.maxElapsedMsDelta === 'number' &&\n\t\tdelta.elapsedMsDelta > policy.maxElapsedMsDelta\n\t) {\n\t\treasons.push(\n\t\t\t`elapsed ms delta ${delta.elapsedMsDelta} exceeds ${policy.maxElapsedMsDelta}`\n\t\t);\n\t}\n\n\tif (reasons.length === 0) {\n\t\treturn {\n\t\t\tpolicy,\n\t\t\treasons: [],\n\t\t\tstatus: 'pass'\n\t\t};\n\t}\n\n\treturn {\n\t\tpolicy,\n\t\treasons,\n\t\tstatus: policy.severity === 'warn' ? 'warn' : 'fail'\n\t};\n};\n\nexport const buildRAGRetrievalReleaseVerdict = ({\n\tgroupKey,\n\tdecisionSummary\n}: {\n\tgroupKey?: string;\n\tdecisionSummary?: RAGRetrievalComparisonDecisionSummary;\n}): RAGRetrievalReleaseVerdict | undefined => {\n\tif (!decisionSummary) {\n\t\treturn undefined;\n\t}\n\n\tconst gate = decisionSummary.gate;\n\tconst delta = decisionSummary.delta;\n\tconst baselineRetrievalId = decisionSummary.baselineRetrievalId;\n\tconst candidateRetrievalId = decisionSummary.candidateRetrievalId;\n\n\tif (gate) {\n\t\tif (gate.status === 'pass') {\n\t\t\treturn {\n\t\t\t\tbaselineGroupKey: groupKey,\n\t\t\t\tbaselineRetrievalId,\n\t\t\t\tcandidateRetrievalId,\n\t\t\t\tdelta,\n\t\t\t\tgate,\n\t\t\t\tstatus: 'pass',\n\t\t\t\tsummary: 'Candidate passed the active baseline gate.'\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tbaselineGroupKey: groupKey,\n\t\t\tbaselineRetrievalId,\n\t\t\tcandidateRetrievalId,\n\t\t\tdelta,\n\t\t\tgate,\n\t\t\tstatus: gate.status,\n\t\t\tsummary:\n\t\t\t\tgate.status === 'warn'\n\t\t\t\t\t? 'Candidate triggered a baseline gate warning.'\n\t\t\t\t\t: 'Candidate failed the active baseline gate.'\n\t\t};\n\t}\n\n\tif (delta) {\n\t\treturn {\n\t\t\tbaselineGroupKey: groupKey,\n\t\t\tbaselineRetrievalId,\n\t\t\tcandidateRetrievalId,\n\t\t\tdelta,\n\t\t\tstatus:\n\t\t\t\tdelta.passingRateDelta < 0 || delta.averageF1Delta < 0\n\t\t\t\t\t? 'needs_review'\n\t\t\t\t\t: 'pass',\n\t\t\tsummary:\n\t\t\t\tdelta.passingRateDelta < 0 || delta.averageF1Delta < 0\n\t\t\t\t\t? 'Candidate should be reviewed before promotion.'\n\t\t\t\t\t: 'Candidate improved or matched the baseline.'\n\t\t};\n\t}\n\n\treturn {\n\t\tbaselineGroupKey: groupKey,\n\t\tbaselineRetrievalId,\n\t\tcandidateRetrievalId,\n\t\tstatus: 'needs_review',\n\t\tsummary: 'No explicit baseline verdict could be determined.'\n\t};\n};\n\nconst isObjectRecord = (value: unknown): value is Record<string, unknown> =>\n\tBoolean(value) && typeof value === 'object';\n\nconst parseJSONRecord = (value: string | null) => {\n\tif (value === null) {\n\t\treturn undefined;\n\t}\n\n\ttry {\n\t\tconst parsed = JSON.parse(value);\n\n\t\treturn isObjectRecord(parsed) ? parsed : undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n};\n\nconst parseJSONArray = <T>(value: string | null, fallback: T[]): T[] => {\n\tif (value === null) {\n\t\treturn fallback;\n\t}\n\n\ttry {\n\t\tconst parsed = JSON.parse(value);\n\n\t\treturn Array.isArray(parsed) ? (parsed as T[]) : fallback;\n\t} catch {\n\t\treturn fallback;\n\t}\n};\n\nconst normalizeExpectedIds = (input: string[]) =>\n\tArray.from(new Set(input.map((item) => item.trim()).filter(Boolean)));\n\nconst resolveEvaluationMode = (caseInput: {\n\texpectedChunkIds?: string[];\n\texpectedSources?: string[];\n\texpectedDocumentIds?: string[];\n}): 'chunkId' | 'source' | 'documentId' => {\n\tif (normalizeStringArray(caseInput.expectedChunkIds).length > 0) {\n\t\treturn 'chunkId';\n\t}\n\tif (normalizeStringArray(caseInput.expectedSources).length > 0) {\n\t\treturn 'source';\n\t}\n\n\treturn 'documentId';\n};\n\nconst getDocumentId = (source: RAGSource): string => {\n\tconst metadataDocumentId =\n\t\ttypeof source.metadata?.documentId === 'string'\n\t\t\t? source.metadata.documentId\n\t\t\t: undefined;\n\tif (metadataDocumentId) {\n\t\treturn metadataDocumentId;\n\t}\n\tif (source.source) {\n\t\treturn source.source;\n\t}\n\n\tconst [documentId] = source.chunkId.split(':');\n\n\treturn documentId ?? source.chunkId;\n};\n\nconst extractExpectedId = (\n\tsource: RAGSource,\n\tmode: 'chunkId' | 'source' | 'documentId'\n): string =>\n\tmode === 'chunkId'\n\t\t? source.chunkId\n\t\t: mode === 'source'\n\t\t\t? (source.source ?? source.title ?? source.chunkId)\n\t\t\t: getDocumentId(source);\n\nconst buildSources = (\n\tresults: Array<{\n\t\tchunkId: string;\n\t\tchunkText: string;\n\t\tscore: number;\n\t\ttitle?: string;\n\t\tsource?: string;\n\t\tmetadata?: Record<string, unknown>;\n\t}>\n) =>\n\tresults.map((result) => ({\n\t\tchunkId: result.chunkId,\n\t\tmetadata: result.metadata,\n\t\tscore: Number.isFinite(result.score) ? result.score : 0,\n\t\tsource: result.source,\n\t\ttext: result.chunkText,\n\t\ttitle: result.title\n\t}));\n\nconst buildAnswerGroundingStatus = ({\n\tcoverage,\n\texpectedCount,\n\tmatchedCount,\n\tunresolvedCitationCount,\n\tresolvedCitationCount\n}: {\n\tcoverage: RAGAnswerGroundingEvaluationCaseResult['coverage'];\n\texpectedCount: number;\n\tmatchedCount: number;\n\tunresolvedCitationCount: number;\n\tresolvedCitationCount: number;\n}): RAGAnswerGroundingEvaluationCaseResult['status'] => {\n\tif (expectedCount > 0) {\n\t\tif (\n\t\t\tmatchedCount === expectedCount &&\n\t\t\tunresolvedCitationCount === 0 &&\n\t\t\tcoverage !== 'ungrounded'\n\t\t) {\n\t\t\treturn 'pass';\n\t\t}\n\n\t\tif (matchedCount > 0 || resolvedCitationCount > 0) {\n\t\t\treturn 'partial';\n\t\t}\n\n\t\treturn 'fail';\n\t}\n\n\tif (coverage === 'grounded' && unresolvedCitationCount === 0) {\n\t\treturn 'pass';\n\t}\n\n\tif (resolvedCitationCount > 0 || coverage === 'partial') {\n\t\treturn 'partial';\n\t}\n\n\treturn 'fail';\n};\n\nexport const buildRAGEvaluationLeaderboard = (\n\truns: RAGEvaluationSuiteRun[]\n) => {\n\tconst sorted = [...runs].sort((left, right) => {\n\t\tif (right.response.passingRate !== left.response.passingRate) {\n\t\t\treturn right.response.passingRate - left.response.passingRate;\n\t\t}\n\t\tif (\n\t\t\tright.response.summary.averageF1 !== left.response.summary.averageF1\n\t\t) {\n\t\t\treturn (\n\t\t\t\tright.response.summary.averageF1 -\n\t\t\t\tleft.response.summary.averageF1\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\tleft.response.summary.averageLatencyMs -\n\t\t\tright.response.summary.averageLatencyMs\n\t\t);\n\t});\n\n\treturn sorted.map<RAGEvaluationLeaderboardEntry>((run, index) => ({\n\t\taverageF1: run.response.summary.averageF1,\n\t\taverageLatencyMs: run.response.summary.averageLatencyMs,\n\t\tlabel: run.label,\n\t\tpassingRate: run.response.passingRate,\n\t\trank: index + 1,\n\t\trunId: run.id,\n\t\tsuiteId: run.suiteId,\n\t\ttotalCases: run.response.totalCases\n\t}));\n};\n\nexport const buildRAGAnswerGroundingEvaluationLeaderboard = (\n\truns: RAGAnswerGroundingEvaluationRun[]\n) => {\n\tconst sorted = [...runs].sort((left, right) => {\n\t\tif (right.response.passingRate !== left.response.passingRate) {\n\t\t\treturn right.response.passingRate - left.response.passingRate;\n\t\t}\n\t\tif (\n\t\t\tright.response.summary.averageCitationF1 !==\n\t\t\tleft.response.summary.averageCitationF1\n\t\t) {\n\t\t\treturn (\n\t\t\t\tright.response.summary.averageCitationF1 -\n\t\t\t\tleft.response.summary.averageCitationF1\n\t\t\t);\n\t\t}\n\t\tif (\n\t\t\tright.response.summary.averageResolvedCitationRate !==\n\t\t\tleft.response.summary.averageResolvedCitationRate\n\t\t) {\n\t\t\treturn (\n\t\t\t\tright.response.summary.averageResolvedCitationRate -\n\t\t\t\tleft.response.summary.averageResolvedCitationRate\n\t\t\t);\n\t\t}\n\n\t\treturn left.elapsedMs - right.elapsedMs;\n\t});\n\n\treturn sorted.map<RAGAnswerGroundingEvaluationLeaderboardEntry>(\n\t\t(run, index) => ({\n\t\t\taverageCitationF1: run.response.summary.averageCitationF1,\n\t\t\taverageResolvedCitationRate:\n\t\t\t\trun.response.summary.averageResolvedCitationRate,\n\t\t\tlabel: run.label,\n\t\t\tpassingRate: run.response.passingRate,\n\t\t\trank: index + 1,\n\t\t\trunId: run.id,\n\t\t\tsuiteId: run.suiteId,\n\t\t\ttotalCases: run.response.totalCases\n\t\t})\n\t);\n};\n\nconst buildTraceStageCounts = (traces: RAGRetrievalTrace[]) => {\n\tconst counts: Partial<\n\t\tRecord<RAGRetrievalTrace['steps'][number]['stage'], number>\n\t> = {};\n\n\tfor (const trace of traces) {\n\t\tfor (const step of trace.steps) {\n\t\t\tcounts[step.stage] = (counts[step.stage] ?? 0) + 1;\n\t\t}\n\t}\n\n\treturn counts;\n};\n\nconst diffTraceStageCounts = ({\n\tcurrent,\n\tprevious\n}: {\n\tcurrent: Partial<\n\t\tRecord<RAGRetrievalTrace['steps'][number]['stage'], number>\n\t>;\n\tprevious: Partial<\n\t\tRecord<RAGRetrievalTrace['steps'][number]['stage'], number>\n\t>;\n}) => {\n\tconst next: Partial<\n\t\tRecord<RAGRetrievalTrace['steps'][number]['stage'], number>\n\t> = {};\n\tconst stages = new Set([\n\t\t...Object.keys(current),\n\t\t...Object.keys(previous)\n\t] as RAGRetrievalTrace['steps'][number]['stage'][]);\n\n\tfor (const stage of stages) {\n\t\tconst delta = (current[stage] ?? 0) - (previous[stage] ?? 0);\n\t\tif (delta !== 0) {\n\t\t\tnext[stage] = delta;\n\t\t}\n\t}\n\n\treturn next;\n};\n\nconst normalizeSummaryList = <T extends string>(values: T[]) =>\n\tArray.from(new Set(values)).sort();\n\nconst buildSummaryListDelta = <T extends string>(\n\tcurrent: T[],\n\tprevious: T[]\n) => {\n\tconst currentSet = new Set(current);\n\tconst previousSet = new Set(previous);\n\tconst added = current.filter((value) => !previousSet.has(value));\n\tconst removed = previous.filter((value) => !currentSet.has(value));\n\n\treturn {\n\t\tadded: normalizeSummaryList(Array.from(new Set(added))),\n\t\tcurrent: normalizeSummaryList(current),\n\t\tprevious: normalizeSummaryList(previous),\n\t\tremoved: normalizeSummaryList(Array.from(new Set(removed)))\n\t};\n};\n\nfunction summarizeListTurnover<T extends string>(params: {\n\tcurrent: T[];\n\tprevious: T[];\n\thistory: T[][];\n}): RAGTraceSummaryListTrend<T> {\n\tconst { current, previous, history } = params;\n\tconst currentSet = new Set(current);\n\tconst previousSet = new Set(previous);\n\tconst frequency: Record<string, number> = {};\n\n\tfor (const entry of history) {\n\t\tfor (const value of entry) {\n\t\t\tfrequency[value] = (frequency[value] ?? 0) + 1;\n\t\t}\n\t}\n\n\treturn {\n\t\tappeared: normalizeSummaryList(\n\t\t\tArray.from(\n\t\t\t\tnew Set(current.filter((value) => !previousSet.has(value)))\n\t\t\t)\n\t\t),\n\t\tcurrent: normalizeSummaryList(current),\n\t\tdisappeared: normalizeSummaryList(\n\t\t\tArray.from(\n\t\t\t\tnew Set(previous.filter((value) => !currentSet.has(value)))\n\t\t\t)\n\t\t),\n\t\tfrequency,\n\t\tprevious: normalizeSummaryList(previous),\n\t\tstable: normalizeSummaryList(\n\t\t\tArray.from(\n\t\t\t\tnew Set(current.filter((value) => previousSet.has(value)))\n\t\t\t)\n\t\t)\n\t};\n}\n\nconst diffTraceSummaryStageCounts = ({\n\tcurrent,\n\tprevious\n}: {\n\tcurrent: RAGRetrievalTraceComparisonSummary['stageCounts'];\n\tprevious: RAGRetrievalTraceComparisonSummary['stageCounts'];\n}) => {\n\tconst stages = new Set([\n\t\t...Object.keys(current),\n\t\t...Object.keys(previous)\n\t]) as Set<RAGRetrievalTraceStep['stage']>;\n\tconst next: Partial<\n\t\tRecord<RAGRetrievalTraceStage, RAGTraceSummaryStageCountsDelta>\n\t> = {};\n\n\tfor (const stage of stages) {\n\t\tconst currentCount = current[stage] ?? 0;\n\t\tconst previousCount = previous[stage] ?? 0;\n\t\tconst delta = currentCount - previousCount;\n\t\tif (delta !== 0 || currentCount !== 0 || previousCount !== 0) {\n\t\t\tnext[stage] = {\n\t\t\t\tcurrent: currentCount,\n\t\t\t\tdelta,\n\t\t\t\tprevious: previousCount\n\t\t\t};\n\t\t}\n\t}\n\n\treturn next;\n};\n\nconst roundTraceAverage = (value: number, total: number) =>\n\ttotal > 0 ? Number((value / total).toFixed(2)) : 0;\n\nconst buildTraceSummaryDirection = (\n\tdelta: number\n): RAGTraceSummaryTrendDirection =>\n\tdelta > 0 ? 'up' : delta < 0 ? 'down' : 'flat';\n\nconst buildTraceSummaryAggregate = ({\n\tsummaries\n}: {\n\tsummaries: RAGRetrievalTraceComparisonSummary[];\n}): {\n\taggregate: RAGTraceSummaryNumericDelta[];\n\tbestMetric: RAGTraceSummaryNumericDelta | undefined;\n\tworstMetric: RAGTraceSummaryNumericDelta | undefined;\n} => {\n\tif (summaries.length === 0) {\n\t\tconst aggregate: RAGTraceSummaryNumericDelta[] = [\n\t\t\t{\n\t\t\t\tcurrent: 0,\n\t\t\t\tdelta: 0,\n\t\t\t\tdirection: 'flat',\n\t\t\t\tmetric: 'totalCases',\n\t\t\t\tprevious: 0\n\t\t\t},\n\t\t\t{\n\t\t\t\tcurrent: 0,\n\t\t\t\tdelta: 0,\n\t\t\t\tdirection: 'flat',\n\t\t\t\tmetric: 'averageFinalCount',\n\t\t\t\tprevious: 0\n\t\t\t},\n\t\t\t{\n\t\t\t\tcurrent: 0,\n\t\t\t\tdelta: 0,\n\t\t\t\tdirection: 'flat',\n\t\t\t\tmetric: 'averageVectorCount',\n\t\t\t\tprevious: 0\n\t\t\t},\n\t\t\t{\n\t\t\t\tcurrent: 0,\n\t\t\t\tdelta: 0,\n\t\t\t\tdirection: 'flat',\n\t\t\t\tmetric: 'averageLexicalCount',\n\t\t\t\tprevious: 0\n\t\t\t},\n\t\t\t{\n\t\t\t\tcurrent: 0,\n\t\t\t\tdelta: 0,\n\t\t\t\tdirection: 'flat',\n\t\t\t\tmetric: 'averageCandidateTopK',\n\t\t\t\tprevious: 0\n\t\t\t},\n\t\t\t{\n\t\t\t\tcurrent: 0,\n\t\t\t\tdelta: 0,\n\t\t\t\tdirection: 'flat',\n\t\t\t\tmetric: 'averageLexicalTopK',\n\t\t\t\tprevious: 0\n\t\t\t},\n\t\t\t{\n\t\t\t\tcurrent: 0,\n\t\t\t\tdelta: 0,\n\t\t\t\tdirection: 'flat',\n\t\t\t\tmetric: 'vectorCases',\n\t\t\t\tprevious: 0\n\t\t\t},\n\t\t\t{\n\t\t\t\tcurrent: 0,\n\t\t\t\tdelta: 0,\n\t\t\t\tdirection: 'flat',\n\t\t\t\tmetric: 'lexicalCases',\n\t\t\t\tprevious: 0\n\t\t\t},\n\t\t\t{\n\t\t\t\tcurrent: 0,\n\t\t\t\tdelta: 0,\n\t\t\t\tdirection: 'flat',\n\t\t\t\tmetric: 'balancedCases',\n\t\t\t\tprevious: 0\n\t\t\t},\n\t\t\t{\n\t\t\t\tcurrent: 0,\n\t\t\t\tdelta: 0,\n\t\t\t\tdirection: 'flat',\n\t\t\t\tmetric: 'roundRobinCases',\n\t\t\t\tprevious: 0\n\t\t\t},\n\t\t\t{\n\t\t\t\tcurrent: 0,\n\t\t\t\tdelta: 0,\n\t\t\t\tdirection: 'flat',\n\t\t\t\tmetric: 'transformedCases',\n\t\t\t\tprevious: 0\n\t\t\t},\n\t\t\t{\n\t\t\t\tcurrent: 0,\n\t\t\t\tdelta: 0,\n\t\t\t\tdirection: 'flat',\n\t\t\t\tmetric: 'variantCases',\n\t\t\t\tprevious: 0\n\t\t\t}\n\t\t];\n\n\t\treturn {\n\t\t\taggregate,\n\t\t\tbestMetric: undefined,\n\t\t\tworstMetric: undefined\n\t\t};\n\t}\n\n\tconst latest = summaries[0]!;\n\tconst previous = summaries[summaries.length - 1]!;\n\tconst aggregate: RAGTraceSummaryNumericDelta[] = [\n\t\t{\n\t\t\tcurrent: latest.totalCases,\n\t\t\tdelta: latest.totalCases - previous.totalCases,\n\t\t\tdirection: buildTraceSummaryDirection(\n\t\t\t\tlatest.totalCases - previous.totalCases\n\t\t\t),\n\t\t\tmetric: 'totalCases',\n\t\t\tprevious: previous.totalCases\n\t\t},\n\t\t{\n\t\t\tcurrent: latest.averageFinalCount,\n\t\t\tdelta: latest.averageFinalCount - previous.averageFinalCount,\n\t\t\tdirection: buildTraceSummaryDirection(\n\t\t\t\tlatest.averageFinalCount - previous.averageFinalCount\n\t\t\t),\n\t\t\tmetric: 'averageFinalCount',\n\t\t\tprevious: previous.averageFinalCount\n\t\t},\n\t\t{\n\t\t\tcurrent: latest.averageVectorCount,\n\t\t\tdelta: latest.averageVectorCount - previous.averageVectorCount,\n\t\t\tdirection: buildTraceSummaryDirection(\n\t\t\t\tlatest.averageVectorCount - previous.averageVectorCount\n\t\t\t),\n\t\t\tmetric: 'averageVectorCount',\n\t\t\tprevious: previous.averageVectorCount\n\t\t},\n\t\t{\n\t\t\tcurrent: latest.averageLexicalCount,\n\t\t\tdelta: latest.averageLexicalCount - previous.averageLexicalCount,\n\t\t\tdirection: buildTraceSummaryDirection(\n\t\t\t\tlatest.averageLexicalCount - previous.averageLexicalCount\n\t\t\t),\n\t\t\tmetric: 'averageLexicalCount',\n\t\t\tprevious: previous.averageLexicalCount\n\t\t},\n\t\t{\n\t\t\tcurrent: latest.averageCandidateTopK,\n\t\t\tdelta: latest.averageCandidateTopK - previous.averageCandidateTopK,\n\t\t\tdirection: buildTraceSummaryDirection(\n\t\t\t\tlatest.averageCandidateTopK - previous.averageCandidateTopK\n\t\t\t),\n\t\t\tmetric: 'averageCandidateTopK',\n\t\t\tprevious: previous.averageCandidateTopK\n\t\t},\n\t\t{\n\t\t\tcurrent: latest.averageLexicalTopK,\n\t\t\tdelta: latest.averageLexicalTopK - previous.averageLexicalTopK,\n\t\t\tdirection: buildTraceSummaryDirection(\n\t\t\t\tlatest.averageLexicalTopK - previous.averageLexicalTopK\n\t\t\t),\n\t\t\tmetric: 'averageLexicalTopK',\n\t\t\tprevious: previous.averageLexicalTopK\n\t\t},\n\t\t{\n\t\t\tcurrent: latest.vectorCases,\n\t\t\tdelta: latest.vectorCases - previous.vectorCases,\n\t\t\tdirection: buildTraceSummaryDirection(\n\t\t\t\tlatest.vectorCases - previous.vectorCases\n\t\t\t),\n\t\t\tmetric: 'vectorCases',\n\t\t\tprevious: previous.vectorCases\n\t\t},\n\t\t{\n\t\t\tcurrent: latest.lexicalCases,\n\t\t\tdelta: latest.lexicalCases - previous.lexicalCases,\n\t\t\tdirection: buildTraceSummaryDirection(\n\t\t\t\tlatest.lexicalCases - previous.lexicalCases\n\t\t\t),\n\t\t\tmetric: 'lexicalCases',\n\t\t\tprevious: previous.lexicalCases\n\t\t},\n\t\t{\n\t\t\tcurrent: latest.balancedCases,\n\t\t\tdelta: latest.balancedCases - previous.balancedCases,\n\t\t\tdirection: buildTraceSummaryDirection(\n\t\t\t\tlatest.balancedCases - previous.balancedCases\n\t\t\t),\n\t\t\tmetric: 'balancedCases',\n\t\t\tprevious: previous.balancedCases\n\t\t},\n\t\t{\n\t\t\tcurrent: latest.roundRobinCases,\n\t\t\tdelta: latest.roundRobinCases - previous.roundRobinCases,\n\t\t\tdirection: buildTraceSummaryDirection(\n\t\t\t\tlatest.roundRobinCases - previous.roundRobinCases\n\t\t\t),\n\t\t\tmetric: 'roundRobinCases',\n\t\t\tprevious: previous.roundRobinCases\n\t\t},\n\t\t{\n\t\t\tcurrent: latest.transformedCases,\n\t\t\tdelta: latest.transformedCases - previous.transformedCases,\n\t\t\tdirection: buildTraceSummaryDirection(\n\t\t\t\tlatest.transformedCases - previous.transformedCases\n\t\t\t),\n\t\t\tmetric: 'transformedCases',\n\t\t\tprevious: previous.transformedCases\n\t\t},\n\t\t{\n\t\t\tcurrent: latest.variantCases,\n\t\t\tdelta: latest.variantCases - previous.variantCases,\n\t\t\tdirection: buildTraceSummaryDirection(\n\t\t\t\tlatest.variantCases - previous.variantCases\n\t\t\t),\n\t\t\tmetric: 'variantCases',\n\t\t\tprevious: previous.variantCases\n\t\t}\n\t];\n\tconst absoluteSorted = [...aggregate].sort(\n\t\t(left, right) =>\n\t\t\tMath.abs(right.delta) - Math.abs(left.delta) ||\n\t\t\tleft.metric.localeCompare(right.metric)\n\t);\n\n\treturn {\n\t\taggregate,\n\t\tbestMetric: absoluteSorted[0],\n\t\tworstMetric: absoluteSorted[absoluteSorted.length - 1]\n\t};\n};\n\nconst buildRAGRetrievalTraceStageChurn = ({\n\twindows\n}: {\n\twindows: RAGRetrievalTraceHistoryWindow[];\n}): RAGTraceSummaryStageTrend[] => {\n\tconst stages = new Set<RAGRetrievalTraceStep['stage']>();\n\tfor (const window of windows) {\n\t\tfor (const stage of Object.keys(window.current.stageCounts) as Array<\n\t\t\tRAGRetrievalTraceStep['stage']\n\t\t>) {\n\t\t\tstages.add(stage);\n\t\t}\n\t\tfor (const stage of Object.keys(window.previous.stageCounts) as Array<\n\t\t\tRAGRetrievalTraceStep['stage']\n\t\t>) {\n\t\t\tstages.add(stage);\n\t\t}\n\t}\n\n\treturn [...stages]\n\t\t.map((stage) => {\n\t\t\tlet netDelta = 0;\n\t\t\tlet totalChanges = 0;\n\t\t\tfor (const window of windows) {\n\t\t\t\tconst delta = window.delta?.stageCountsDelta[stage]?.delta ?? 0;\n\t\t\t\tnetDelta += delta;\n\t\t\t\ttotalChanges += Math.abs(delta);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tlatestDelta:\n\t\t\t\t\twindows[0]?.delta?.stageCountsDelta[stage]?.delta ?? 0,\n\t\t\t\tnetDelta,\n\t\t\t\tstage,\n\t\t\t\ttotalChanges\n\t\t\t};\n\t\t})\n\t\t.sort(\n\t\t\t(left, right) =>\n\t\t\t\tright.totalChanges - left.totalChanges ||\n\t\t\t\tleft.stage.localeCompare(right.stage)\n\t\t);\n};\n\nconst summarizeRetrievalTraces = (\n\ttraces: RAGRetrievalTrace[]\n): RAGRetrievalTraceComparisonSummary | undefined => {\n\tif (traces.length === 0) {\n\t\treturn undefined;\n\t}\n\n\tconst totalCases = traces.length;\n\tconst modeSet = new Set<RAGHybridRetrievalMode>();\n\tconst sourceBalanceStrategySet = new Set<RAGSourceBalanceStrategy>();\n\tlet vectorCases = 0;\n\tlet lexicalCases = 0;\n\tlet balancedCases = 0;\n\tlet roundRobinCases = 0;\n\tlet transformedCases = 0;\n\tlet variantCases = 0;\n\tlet finalCountSum = 0;\n\tlet vectorCountSum = 0;\n\tlet lexicalCountSum = 0;\n\tlet candidateTopKSum = 0;\n\tlet lexicalTopKSum = 0;\n\n\tfor (const trace of traces) {\n\t\tmodeSet.add(trace.mode);\n\t\tsourceBalanceStrategySet.add(trace.sourceBalanceStrategy ?? 'cap');\n\t\tif (trace.runVector) {\n\t\t\tvectorCases += 1;\n\t\t}\n\t\tif (trace.runLexical) {\n\t\t\tlexicalCases += 1;\n\t\t}\n\t\tif (typeof trace.maxResultsPerSource === 'number') {\n\t\t\tbalancedCases += 1;\n\t\t\tif (trace.sourceBalanceStrategy === 'round_robin') {\n\t\t\t\troundRobinCases += 1;\n\t\t\t}\n\t\t}\n\t\tif (trace.transformedQuery !== trace.query) {\n\t\t\ttransformedCases += 1;\n\t\t}\n\t\tif (trace.variantQueries.length > 0) {\n\t\t\tvariantCases += 1;\n\t\t}\n\t\tfinalCountSum += trace.resultCounts.final;\n\t\tvectorCountSum += trace.resultCounts.vector;\n\t\tlexicalCountSum += trace.resultCounts.lexical;\n\t\tcandidateTopKSum += trace.candidateTopK;\n\t\tlexicalTopKSum += trace.lexicalTopK;\n\t}\n\n\treturn {\n\t\taverageCandidateTopK: roundTraceAverage(candidateTopKSum, totalCases),\n\t\taverageFinalCount: roundTraceAverage(finalCountSum, totalCases),\n\t\taverageLexicalCount: roundTraceAverage(lexicalCountSum, totalCases),\n\t\taverageLexicalTopK: roundTraceAverage(lexicalTopKSum, totalCases),\n\t\tbalancedCases,\n\t\taverageVectorCount: roundTraceAverage(vectorCountSum, totalCases),\n\t\tlexicalCases,\n\t\tmodes: Array.from(modeSet),\n\t\troundRobinCases,\n\t\tsourceBalanceStrategies: Array.from(sourceBalanceStrategySet),\n\t\tstageCounts: buildTraceStageCounts(traces),\n\t\ttotalCases,\n\t\ttransformedCases,\n\t\tvariantCases,\n\t\tvectorCases\n\t};\n};\n\nconst evaluateRAGCollectionCases = async ({\n\tcollection,\n\tinput,\n\tdefaultTopK = DEFAULT_TOP_K,\n\trerank,\n\tincludeTrace = false\n}: {\n\tcollection: RAGCollection;\n\tinput: RAGEvaluationInput;\n\tdefaultTopK?: number;\n\trerank?: RAGRerankerProviderLike;\n\tincludeTrace?: boolean;\n}): Promise<\n\tArray<{\n\t\tcaseResult: RAGEvaluationCaseResult;\n\t\ttrace?: RAGRetrievalTrace;\n\t\tfilter?: Record<string, unknown>;\n\t\tretrieval?: RAGCollectionSearchParams['retrieval'];\n\t}>\n> => {\n\tif (input.dryRun) {\n\t\treturn executeDryRunRAGEvaluation(input, defaultTopK).map(\n\t\t\t(caseResult, caseIndex) => ({\n\t\t\t\tcaseResult,\n\t\t\t\tfilter:\n\t\t\t\t\ttypeof input.cases?.[caseIndex]?.filter === 'object'\n\t\t\t\t\t\t? input.cases[caseIndex]?.filter\n\t\t\t\t\t\t: input.filter,\n\t\t\t\tretrieval:\n\t\t\t\t\tinput.cases?.[caseIndex]?.retrieval ?? input.retrieval,\n\t\t\t\ttrace: undefined\n\t\t\t})\n\t\t);\n\t}\n\n\treturn Promise.all(\n\t\tinput.cases.map(async (caseInput, caseIndex) => {\n\t\t\tconst startedAt = Date.now();\n\t\t\tconst mode = resolveEvaluationMode(caseInput);\n\t\t\tconst query = caseInput.query.trim();\n\t\t\tconst expectedIds = normalizeExpectedIds(\n\t\t\t\tmode === 'chunkId'\n\t\t\t\t\t? (caseInput.expectedChunkIds ?? [])\n\t\t\t\t\t: mode === 'source'\n\t\t\t\t\t\t? (caseInput.expectedSources ?? [])\n\t\t\t\t\t\t: (caseInput.expectedDocumentIds ?? [])\n\t\t\t);\n\t\t\tconst topK =\n\t\t\t\ttypeof caseInput.topK === 'number'\n\t\t\t\t\t? caseInput.topK\n\t\t\t\t\t: typeof input.topK === 'number'\n\t\t\t\t\t\t? input.topK\n\t\t\t\t\t\t: defaultTopK;\n\t\t\tconst searchInput = {\n\t\t\t\tfilter: caseInput.corpusKey\n\t\t\t\t\t? {\n\t\t\t\t\t\t\t...((typeof caseInput.filter === 'object'\n\t\t\t\t\t\t\t\t? caseInput.filter\n\t\t\t\t\t\t\t\t: input.filter) ?? {}),\n\t\t\t\t\t\t\tcorpusKey: caseInput.corpusKey\n\t\t\t\t\t\t}\n\t\t\t\t\t: typeof caseInput.filter === 'object'\n\t\t\t\t\t\t? caseInput.filter\n\t\t\t\t\t\t: input.filter,\n\t\t\t\tmodel: caseInput.model ?? input.model,\n\t\t\t\tquery,\n\t\t\t\trerank,\n\t\t\t\tscoreThreshold:\n\t\t\t\t\ttypeof caseInput.scoreThreshold === 'number'\n\t\t\t\t\t\t? caseInput.scoreThreshold\n\t\t\t\t\t\t: input.scoreThreshold,\n\t\t\t\tretrieval: caseInput.retrieval ?? input.retrieval,\n\t\t\t\ttopK\n\t\t\t};\n\t\t\tconst searchOutcome = includeTrace\n\t\t\t\t? await collection.searchWithTrace(searchInput)\n\t\t\t\t: {\n\t\t\t\t\t\tresults: await collection.search(searchInput),\n\t\t\t\t\t\ttrace: undefined\n\t\t\t\t\t};\n\t\t\tconst sources = buildSources(searchOutcome.results);\n\t\t\tconst elapsedMs = Date.now() - startedAt;\n\t\t\tconst retrievedIds = normalizeExpectedIds(\n\t\t\t\tsources.map((source) => extractExpectedId(source, mode))\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tcaseResult: summarizeRAGEvaluationCase({\n\t\t\t\t\tcaseIndex,\n\t\t\t\t\tcaseInput: { ...caseInput, topK },\n\t\t\t\t\telapsedMs,\n\t\t\t\t\texpectedIds,\n\t\t\t\t\tmode,\n\t\t\t\t\tquery,\n\t\t\t\t\tretrievedIds\n\t\t\t\t}),\n\t\t\t\ttrace: searchOutcome.trace,\n\t\t\t\tfilter: searchInput.filter,\n\t\t\t\tretrieval: searchInput.retrieval\n\t\t\t};\n\t\t})\n\t);\n};\n\nexport const buildRAGAnswerGroundingCaseDifficultyLeaderboard = (\n\tentries: Array<{\n\t\tlabel: string;\n\t\tresponse: RAGAnswerGroundingEvaluationResponse;\n\t}>\n) => {\n\tconst grouped = new Map<\n\t\tstring,\n\t\t{\n\t\t\tcaseId: string;\n\t\t\tlabel?: string;\n\t\t\tquery?: string;\n\t\t\tpassCount: number;\n\t\t\tpartialCount: number;\n\t\t\tfailCount: number;\n\t\t\tgroundedCount: number;\n\t\t\ttotalEvaluations: number;\n\t\t\ttotalCitationF1: number;\n\t\t\ttotalResolvedCitationRate: number;\n\t\t}\n\t>();\n\n\tfor (const entry of entries) {\n\t\tfor (const result of entry.response.cases) {\n\t\t\tconst current = grouped.get(result.caseId) ?? {\n\t\t\t\tcaseId: result.caseId,\n\t\t\t\tfailCount: 0,\n\t\t\t\tgroundedCount: 0,\n\t\t\t\tlabel: result.label,\n\t\t\t\tpassCount: 0,\n\t\t\t\tpartialCount: 0,\n\t\t\t\tquery: result.query,\n\t\t\t\ttotalCitationF1: 0,\n\t\t\t\ttotalEvaluations: 0,\n\t\t\t\ttotalResolvedCitationRate: 0\n\t\t\t};\n\t\t\tcurrent.label ??= result.label;\n\t\t\tcurrent.query ??= result.query;\n\t\t\tcurrent.totalEvaluations += 1;\n\t\t\tcurrent.totalCitationF1 += result.citationF1;\n\t\t\tcurrent.totalResolvedCitationRate += result.resolvedCitationRate;\n\t\t\tif (result.status === 'pass') {\n\t\t\t\tcurrent.passCount += 1;\n\t\t\t} else if (result.status === 'partial') {\n\t\t\t\tcurrent.partialCount += 1;\n\t\t\t} else {\n\t\t\t\tcurrent.failCount += 1;\n\t\t\t}\n\t\t\tif (result.coverage === 'grounded') {\n\t\t\t\tcurrent.groundedCount += 1;\n\t\t\t}\n\t\t\tgrouped.set(result.caseId, current);\n\t\t}\n\t}\n\n\tconst ranked = Array.from(grouped.values()).sort((left, right) => {\n\t\tconst leftPassRate = left.passCount / left.totalEvaluations;\n\t\tconst rightPassRate = right.passCount / right.totalEvaluations;\n\t\tif (leftPassRate !== rightPassRate) {\n\t\t\treturn leftPassRate - rightPassRate;\n\t\t}\n\t\tconst leftCitationF1 = left.totalCitationF1 / left.totalEvaluations;\n\t\tconst rightCitationF1 = right.totalCitationF1 / right.totalEvaluations;\n\t\tif (leftCitationF1 !== rightCitationF1) {\n\t\t\treturn leftCitationF1 - rightCitationF1;\n\t\t}\n\t\tconst leftResolved =\n\t\t\tleft.totalResolvedCitationRate / left.totalEvaluations;\n\t\tconst rightResolved =\n\t\t\tright.totalResolvedCitationRate / right.totalEvaluations;\n\t\tif (leftResolved !== rightResolved) {\n\t\t\treturn leftResolved - rightResolved;\n\t\t}\n\n\t\treturn left.caseId.localeCompare(right.caseId);\n\t});\n\n\treturn ranked.map<RAGAnswerGroundingEvaluationCaseDifficultyEntry>(\n\t\t(entry, index) => ({\n\t\t\taverageCitationF1: entry.totalCitationF1 / entry.totalEvaluations,\n\t\t\taverageResolvedCitationRate:\n\t\t\t\tentry.totalResolvedCitationRate / entry.totalEvaluations,\n\t\t\tcaseId: entry.caseId,\n\t\t\tfailRate: (entry.failCount / entry.totalEvaluations) * 100,\n\t\t\tgroundedRate: (entry.groundedCount / entry.totalEvaluations) * 100,\n\t\t\tlabel: entry.label,\n\t\t\tpassRate: (entry.passCount / entry.totalEvaluations) * 100,\n\t\t\tpartialRate: (entry.partialCount / entry.totalEvaluations) * 100,\n\t\t\tquery: entry.query,\n\t\t\trank: index + 1,\n\t\t\ttotalEvaluations: entry.totalEvaluations\n\t\t})\n\t);\n};\n\nconst buildGroundingDifficultyDiffEntry = (\n\tcurrent: RAGAnswerGroundingEvaluationCaseDifficultyEntry,\n\tprevious?: RAGAnswerGroundingEvaluationCaseDifficultyEntry\n): RAGAnswerGroundingCaseDifficultyDiffEntry => ({\n\tcaseId: current.caseId,\n\tcurrentAverageCitationF1: current.averageCitationF1,\n\tcurrentFailRate: current.failRate,\n\tcurrentPassRate: current.passRate,\n\tcurrentRank: current.rank,\n\tlabel: current.label,\n\tpreviousAverageCitationF1: previous?.averageCitationF1,\n\tpreviousFailRate: previous?.failRate,\n\tpreviousPassRate: previous?.passRate,\n\tpreviousRank: previous?.rank,\n\tquery: current.query\n});\n\nconst buildRAGAnswerGroundingCaseDifficultyTrends = ({\n\truns\n}: {\n\truns: RAGAnswerGroundingCaseDifficultyRun[];\n}) => {\n\tconst movementCounts = new Map<\n\t\tstring,\n\t\t{\n\t\t\tlabel?: string;\n\t\t\tharder: number;\n\t\t\teasier: number;\n\t\t\tunchanged: number;\n\t\t}\n\t>();\n\n\tfor (let index = 0; index < runs.length - 1; index += 1) {\n\t\tconst current = runs[index];\n\t\tconst previous = runs[index + 1];\n\t\tif (!current || !previous) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst diff = buildRAGAnswerGroundingCaseDifficultyRunDiff({\n\t\t\tcurrent,\n\t\t\tprevious\n\t\t});\n\n\t\tfor (const entry of diff.harderCases) {\n\t\t\tconst currentCounts = movementCounts.get(entry.caseId) ?? {\n\t\t\t\teasier: 0,\n\t\t\t\tharder: 0,\n\t\t\t\tlabel: entry.label,\n\t\t\t\tunchanged: 0\n\t\t\t};\n\t\t\tcurrentCounts.harder += 1;\n\t\t\tcurrentCounts.label ??= entry.label;\n\t\t\tmovementCounts.set(entry.caseId, currentCounts);\n\t\t}\n\n\t\tfor (const entry of diff.easierCases) {\n\t\t\tconst currentCounts = movementCounts.get(entry.caseId) ?? {\n\t\t\t\teasier: 0,\n\t\t\t\tharder: 0,\n\t\t\t\tlabel: entry.label,\n\t\t\t\tunchanged: 0\n\t\t\t};\n\t\t\tcurrentCounts.easier += 1;\n\t\t\tcurrentCounts.label ??= entry.label;\n\t\t\tmovementCounts.set(entry.caseId, currentCounts);\n\t\t}\n\n\t\tfor (const entry of diff.unchangedCases) {\n\t\t\tconst currentCounts = movementCounts.get(entry.caseId) ?? {\n\t\t\t\teasier: 0,\n\t\t\t\tharder: 0,\n\t\t\t\tlabel: entry.label,\n\t\t\t\tunchanged: 0\n\t\t\t};\n\t\t\tcurrentCounts.unchanged += 1;\n\t\t\tcurrentCounts.label ??= entry.label;\n\t\t\tmovementCounts.set(entry.caseId, currentCounts);\n\t\t}\n\t}\n\n\tconst movementEntries = [...movementCounts.entries()];\n\tconst mostOftenHarderCaseIds = movementEntries\n\t\t.filter(([, counts]) => counts.harder > 0)\n\t\t.sort((left, right) => {\n\t\t\tif (right[1].harder !== left[1].harder) {\n\t\t\t\treturn right[1].harder - left[1].harder;\n\t\t\t}\n\t\t\treturn left[0].localeCompare(right[0]);\n\t\t})\n\t\t.map(([caseId]) => caseId);\n\tconst mostOftenEasierCaseIds = movementEntries\n\t\t.filter(([, counts]) => counts.easier > 0)\n\t\t.sort((left, right) => {\n\t\t\tif (right[1].easier !== left[1].easier) {\n\t\t\t\treturn right[1].easier - left[1].easier;\n\t\t\t}\n\t\t\treturn left[0].localeCompare(right[0]);\n\t\t})\n\t\t.map(([caseId]) => caseId);\n\n\treturn {\n\t\teasiestCaseIds:\n\t\t\truns[runs.length - 1]?.entries\n\t\t\t\t.map((entry) => entry.caseId)\n\t\t\t\t.reverse() ?? [],\n\t\thardestCaseIds: runs[0]?.entries.map((entry) => entry.caseId) ?? [],\n\t\tmostOftenEasierCaseIds,\n\t\tmostOftenHarderCaseIds,\n\t\tmovementCounts: Object.fromEntries(\n\t\t\tmovementEntries.map(([caseId, counts]) => [\n\t\t\t\tcaseId,\n\t\t\t\t{\n\t\t\t\t\teasier: counts.easier,\n\t\t\t\t\tharder: counts.harder,\n\t\t\t\t\tunchanged: counts.unchanged\n\t\t\t\t}\n\t\t\t])\n\t\t)\n\t};\n};\n\nexport const buildRAGAnswerGroundingCaseDifficultyRunDiff = ({\n\tcurrent,\n\tprevious\n}: {\n\tcurrent: RAGAnswerGroundingCaseDifficultyRun;\n\tprevious?: RAGAnswerGroundingCaseDifficultyRun;\n}): RAGAnswerGroundingCaseDifficultyRunDiff => {\n\tconst previousEntries = new Map(\n\t\t(previous?.entries ?? []).map((entry) => [entry.caseId, entry])\n\t);\n\tconst diffs = current.entries.map((entry) =>\n\t\tbuildGroundingDifficultyDiffEntry(\n\t\t\tentry,\n\t\t\tpreviousEntries.get(entry.caseId)\n\t\t)\n\t);\n\n\treturn {\n\t\tcurrentRunId: current.id,\n\t\teasierCases: diffs.filter((entry) => {\n\t\t\tconst previousRank = entry.previousRank ?? entry.currentRank;\n\t\t\treturn entry.currentRank > previousRank;\n\t\t}),\n\t\tharderCases: diffs.filter((entry) => {\n\t\t\tconst previousRank = entry.previousRank ?? Number.MAX_SAFE_INTEGER;\n\t\t\treturn entry.currentRank < previousRank;\n\t\t}),\n\t\tpreviousRunId: previous?.id,\n\t\tsuiteId: current.suiteId,\n\t\tunchangedCases: diffs.filter((entry) => {\n\t\t\tconst previousRank = entry.previousRank ?? entry.currentRank;\n\t\t\treturn entry.currentRank === previousRank;\n\t\t})\n\t};\n};\n\nconst toHistorySortOrder = (\n\tleft: RAGEvaluationSuiteRun,\n\tright: RAGEvaluationSuiteRun\n) => right.finishedAt - left.finishedAt;\n\nconst normalizeHistoryRuns = (runs: RAGEvaluationSuiteRun[]) =>\n\t[...runs].sort(toHistorySortOrder);\n\nconst normalizeRetrievalComparisonRuns = (runs: RAGRetrievalComparisonRun[]) =>\n\t[...runs].sort((left, right) => right.finishedAt - left.finishedAt);\n\nconst toTraceSummaryRunSortOrder = (\n\tleft: RAGRetrievalTraceSummaryRun,\n\tright: RAGRetrievalTraceSummaryRun\n) => right.finishedAt - left.finishedAt;\n\nconst normalizeTraceSummaryRuns = <TRun extends RAGRetrievalTraceSummaryRun>(\n\truns: TRun[]\n) => [...runs].sort(toTraceSummaryRunSortOrder);\n\nconst applyRAGSearchTracePrunePolicy = ({\n\tinput,\n\ttraces\n}: {\n\tinput?: RAGSearchTracePruneInput;\n\ttraces: RAGSearchTraceRecord[];\n}) => {\n\tconst sorted = normalizeTraceSummaryRuns(traces);\n\tconst matchesTag = (trace: RAGSearchTraceRecord) =>\n\t\t!input?.tag || (trace.tags ?? []).includes(input.tag);\n\tconst targeted = sorted.filter(matchesTag);\n\tconst untouched = sorted.filter((trace) => !matchesTag(trace));\n\tconst now = input?.now ?? Date.now();\n\tlet kept = [...targeted];\n\n\tif (\n\t\ttypeof input?.maxAgeMs === 'number' &&\n\t\tNumber.isFinite(input.maxAgeMs)\n\t) {\n\t\tconst cutoff = now - input.maxAgeMs;\n\t\tkept = kept.filter((trace) => trace.finishedAt >= cutoff);\n\t}\n\n\tif (\n\t\ttypeof input?.maxRecordsPerQuery === 'number' &&\n\t\tNumber.isFinite(input.maxRecordsPerQuery) &&\n\t\tinput.maxRecordsPerQuery >= 0\n\t) {\n\t\tconst remainingByQuery = new Map<string, number>();\n\t\tkept = kept.filter((trace) => {\n\t\t\tconst current = remainingByQuery.get(trace.query) ?? 0;\n\t\t\tif (current >= input.maxRecordsPerQuery!) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tremainingByQuery.set(trace.query, current + 1);\n\t\t\treturn true;\n\t\t});\n\t}\n\n\tif (\n\t\ttypeof input?.maxRecordsPerGroup === 'number' &&\n\t\tNumber.isFinite(input.maxRecordsPerGroup) &&\n\t\tinput.maxRecordsPerGroup >= 0\n\t) {\n\t\tconst remainingByGroup = new Map<string, number>();\n\t\tkept = kept.filter((trace) => {\n\t\t\tif (!trace.groupKey) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tconst current = remainingByGroup.get(trace.groupKey) ?? 0;\n\t\t\tif (current >= input.maxRecordsPerGroup!) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tremainingByGroup.set(trace.groupKey, current + 1);\n\t\t\treturn true;\n\t\t});\n\t}\n\n\tconst keptIds = new Set(kept.map((trace) => trace.id));\n\tconst removed = targeted.filter((trace) => !keptIds.has(trace.id));\n\tconst next = normalizeTraceSummaryRuns([...untouched, ...kept]);\n\n\treturn {\n\t\tkeptCount: next.length,\n\t\tnext,\n\t\tremoved,\n\t\tremovedCount: removed.length\n\t};\n};\n\nconst buildRAGSearchTraceStatsFromTraces = (\n\ttraces: RAGSearchTraceRecord[]\n): RAGSearchTraceStats => {\n\tconst queryKeys = new Set<string>();\n\tconst groupKeys = new Set<string>();\n\tconst tagCounts = new Map<string, number>();\n\tlet oldestFinishedAt: number | undefined;\n\tlet newestFinishedAt: number | undefined;\n\n\tfor (const trace of traces) {\n\t\tqueryKeys.add(trace.query);\n\t\tif (trace.groupKey) {\n\t\t\tgroupKeys.add(trace.groupKey);\n\t\t}\n\t\tfor (const tag of trace.tags ?? []) {\n\t\t\ttagCounts.set(tag, (tagCounts.get(tag) ?? 0) + 1);\n\t\t}\n\t\toldestFinishedAt =\n\t\t\ttypeof oldestFinishedAt === 'number'\n\t\t\t\t? Math.min(oldestFinishedAt, trace.finishedAt)\n\t\t\t\t: trace.finishedAt;\n\t\tnewestFinishedAt =\n\t\t\ttypeof newestFinishedAt === 'number'\n\t\t\t\t? Math.max(newestFinishedAt, trace.finishedAt)\n\t\t\t\t: trace.finishedAt;\n\t}\n\n\treturn {\n\t\tgroupCount: groupKeys.size,\n\t\tnewestFinishedAt,\n\t\toldestFinishedAt,\n\t\tqueryCount: queryKeys.size,\n\t\ttagCounts: Object.fromEntries(tagCounts.entries()),\n\t\ttotalTraces: traces.length\n\t};\n};\n\nconst normalizeTraceTags = (tags?: string[]) =>\n\tArray.from(\n\t\tnew Set((tags ?? []).map((tag) => tag.trim()).filter(Boolean))\n\t).sort((left, right) => left.localeCompare(right));\n\nconst toGroundingHistorySortOrder = (\n\tleft: RAGAnswerGroundingEvaluationRun,\n\tright: RAGAnswerGroundingEvaluationRun\n) => right.finishedAt - left.finishedAt;\n\nconst normalizeGroundingHistoryRuns = (\n\truns: RAGAnswerGroundingEvaluationRun[]\n) => [...runs].sort(toGroundingHistorySortOrder);\n\nconst toSearchTracePruneRunSortOrder = (\n\tleft: RAGSearchTracePruneRun,\n\tright: RAGSearchTracePruneRun\n) => right.finishedAt - left.finishedAt;\n\nconst normalizeSearchTracePruneRuns = (runs: RAGSearchTracePruneRun[]) =>\n\t[...runs].sort(toSearchTracePruneRunSortOrder);\n\nconst toGroundingDifficultyHistorySortOrder = (\n\tleft: RAGAnswerGroundingCaseDifficultyRun,\n\tright: RAGAnswerGroundingCaseDifficultyRun\n) => right.finishedAt - left.finishedAt;\n\nconst normalizeGroundingDifficultyHistoryRuns = (\n\truns: RAGAnswerGroundingCaseDifficultyRun[]\n) => [...runs].sort(toGroundingDifficultyHistorySortOrder);\n\nconst buildCaseDiff = (\n\tcurrentCase: RAGEvaluationCaseResult,\n\tpreviousCase?: RAGEvaluationCaseResult\n): RAGEvaluationCaseDiff => ({\n\tcaseId: currentCase.caseId,\n\tcurrentF1: currentCase.f1,\n\tcurrentMatchedIds: currentCase.matchedIds,\n\tcurrentMissingIds: currentCase.missingIds,\n\tcurrentStatus: currentCase.status,\n\tlabel: currentCase.label,\n\tpreviousF1: previousCase?.f1,\n\tpreviousMatchedIds: previousCase?.matchedIds ?? [],\n\tpreviousMissingIds: previousCase?.missingIds ?? [],\n\tpreviousStatus: previousCase?.status,\n\tquery: currentCase.query\n});\n\nconst buildGroundingCaseDiff = (\n\tcurrentCase: RAGAnswerGroundingEvaluationCaseResult,\n\tpreviousCase?: RAGAnswerGroundingEvaluationCaseResult\n): RAGAnswerGroundingEvaluationCaseDiff => ({\n\tanswerChanged:\n\t\ttypeof previousCase?.answer === 'string'\n\t\t\t? previousCase.answer !== currentCase.answer\n\t\t\t: true,\n\tcaseId: currentCase.caseId,\n\tcurrentCitationF1: currentCase.citationF1,\n\tcurrentCitedIds: currentCase.citedIds,\n\tcurrentCoverage: currentCase.coverage,\n\tcurrentExtraIds: currentCase.extraIds,\n\tcurrentMatchedIds: currentCase.matchedIds,\n\tcurrentMissingIds: currentCase.missingIds,\n\tcurrentReferenceCount: currentCase.referenceCount,\n\tcurrentResolvedCitationCount: currentCase.resolvedCitationCount,\n\tcurrentAnswer: currentCase.answer,\n\tcurrentStatus: currentCase.status,\n\tcurrentUngroundedReferenceNumbers:\n\t\tcurrentCase.groundedAnswer.ungroundedReferenceNumbers,\n\tcurrentUnresolvedCitationCount: currentCase.unresolvedCitationCount,\n\tlabel: currentCase.label,\n\tpreviousAnswer: previousCase?.answer,\n\tpreviousCitationF1: previousCase?.citationF1,\n\tpreviousCitedIds: previousCase?.citedIds ?? [],\n\tpreviousCoverage: previousCase?.coverage,\n\tpreviousExtraIds: previousCase?.extraIds ?? [],\n\tpreviousMatchedIds: previousCase?.matchedIds ?? [],\n\tpreviousMissingIds: previousCase?.missingIds ?? [],\n\tpreviousReferenceCount: previousCase?.referenceCount,\n\tpreviousResolvedCitationCount: previousCase?.resolvedCitationCount,\n\tpreviousStatus: previousCase?.status,\n\tpreviousUngroundedReferenceNumbers:\n\t\tpreviousCase?.groundedAnswer.ungroundedReferenceNumbers ?? [],\n\tpreviousUnresolvedCitationCount: previousCase?.unresolvedCitationCount,\n\tquery: currentCase.query\n});\n\nconst buildGroundingCaseSnapshots = ({\n\tcurrent,\n\tprevious\n}: {\n\tcurrent?: RAGAnswerGroundingEvaluationRun;\n\tprevious?: RAGAnswerGroundingEvaluationRun;\n}): RAGAnswerGroundingEvaluationCaseSnapshot[] => {\n\tif (!current) {\n\t\treturn [];\n\t}\n\n\tconst previousCases = new Map(\n\t\t(previous?.response.cases ?? []).map((entry) => [entry.caseId, entry])\n\t);\n\n\treturn current.response.cases.map((entry) => {\n\t\tconst previousCase = previousCases.get(entry.caseId);\n\t\treturn {\n\t\t\tanswer: entry.answer,\n\t\t\tanswerChange:\n\t\t\t\ttypeof previousCase?.answer === 'string'\n\t\t\t\t\t? previousCase.answer === entry.answer\n\t\t\t\t\t\t? 'unchanged'\n\t\t\t\t\t\t: 'changed'\n\t\t\t\t\t: 'new',\n\t\t\tcaseId: entry.caseId,\n\t\t\tcitationCount: entry.citationCount,\n\t\t\tcitationF1: entry.citationF1,\n\t\t\tcitedIds: entry.citedIds,\n\t\t\tcoverage: entry.coverage,\n\t\t\textraIds: entry.extraIds,\n\t\t\tlabel: entry.label,\n\t\t\tmatchedIds: entry.matchedIds,\n\t\t\tmissingIds: entry.missingIds,\n\t\t\tpreviousAnswer: previousCase?.answer,\n\t\t\tquery: entry.query,\n\t\t\treferenceCount: entry.referenceCount,\n\t\t\tresolvedCitationCount: entry.resolvedCitationCount,\n\t\t\tresolvedCitationRate: entry.resolvedCitationRate,\n\t\t\tstatus: entry.status,\n\t\t\tungroundedReferenceNumbers:\n\t\t\t\tentry.groundedAnswer.ungroundedReferenceNumbers,\n\t\t\tunresolvedCitationCount: entry.unresolvedCitationCount\n\t\t};\n\t});\n};\n\nconst areStageCountsEqual = (\n\tleft: Partial<Record<RAGRetrievalTraceStage, number>>,\n\tright: Partial<Record<RAGRetrievalTraceStage, number>>\n) => {\n\tconst keys = new Set([\n\t\t...Object.keys(left),\n\t\t...Object.keys(right)\n\t]) as Set<RAGRetrievalTraceStage>;\n\n\tfor (const key of keys) {\n\t\tif ((left[key] ?? 0) !== (right[key] ?? 0)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n};\n\nconst buildEvaluationCaseTraceSnapshot = ({\n\tcaseResult,\n\tfilter,\n\tretrieval,\n\tcurrentTrace,\n\tpreviousTrace\n}: {\n\tcaseResult: RAGEvaluationCaseResult;\n\tfilter?: Record<string, unknown>;\n\tretrieval?: RAGCollectionSearchParams['retrieval'];\n\tcurrentTrace?: RAGRetrievalTrace;\n\tpreviousTrace?: RAGEvaluationCaseTraceSnapshot;\n}): RAGEvaluationCaseTraceSnapshot => {\n\tconst stageCounts = currentTrace\n\t\t? buildTraceStageCounts([currentTrace])\n\t\t: {};\n\tconst previousStageCounts = previousTrace?.stageCounts ?? {};\n\tconst currentFilterSignature = JSON.stringify(filter ?? undefined);\n\tconst previousFilterSignature = JSON.stringify(\n\t\tpreviousTrace?.inputFilter ?? undefined\n\t);\n\tconst currentRetrievalSignature = JSON.stringify(retrieval ?? undefined);\n\tconst previousRetrievalSignature = JSON.stringify(\n\t\tpreviousTrace?.inputRetrieval ?? undefined\n\t);\n\tconst traceChange = !previousTrace\n\t\t? currentTrace\n\t\t\t? 'new'\n\t\t\t: 'unchanged'\n\t\t: previousTrace.traceMode !== currentTrace?.mode ||\n\t\t\t previousFilterSignature !== currentFilterSignature ||\n\t\t\t previousRetrievalSignature !== currentRetrievalSignature ||\n\t\t\t previousTrace.sourceBalanceStrategy !==\n\t\t\t\t\tcurrentTrace?.sourceBalanceStrategy ||\n\t\t\t previousTrace.transformedQuery !==\n\t\t\t\t\t(currentTrace?.transformedQuery || undefined) ||\n\t\t\t previousTrace.variantQueries.join('|') !==\n\t\t\t\t\t(currentTrace?.variantQueries ?? []).join('|') ||\n\t\t\t previousTrace.finalCount !==\n\t\t\t\t\t(currentTrace?.resultCounts.final ?? 0) ||\n\t\t\t previousTrace.vectorCount !==\n\t\t\t\t\t(currentTrace?.resultCounts.vector ?? 0) ||\n\t\t\t previousTrace.lexicalCount !==\n\t\t\t\t\t(currentTrace?.resultCounts.lexical ?? 0) ||\n\t\t\t previousTrace.candidateTopK !==\n\t\t\t\t\t(currentTrace?.candidateTopK ?? 0) ||\n\t\t\t previousTrace.lexicalTopK !== (currentTrace?.lexicalTopK ?? 0) ||\n\t\t\t !areStageCountsEqual(previousStageCounts, stageCounts)\n\t\t\t? 'changed'\n\t\t\t: 'unchanged';\n\n\treturn {\n\t\tcandidateTopK: currentTrace?.candidateTopK ?? 0,\n\t\tcaseId: caseResult.caseId,\n\t\tcorpusKey: caseResult.corpusKey,\n\t\tinputFilter: filter,\n\t\tfinalCount: currentTrace?.resultCounts.final ?? 0,\n\t\tlabel: caseResult.label,\n\t\tlexicalCount: currentTrace?.resultCounts.lexical ?? 0,\n\t\tlexicalTopK: currentTrace?.lexicalTopK ?? 0,\n\t\tinputRetrieval: retrieval,\n\t\tpreviousCandidateTopK: previousTrace?.candidateTopK,\n\t\tpreviousFinalCount: previousTrace?.finalCount,\n\t\tpreviousLexicalCount: previousTrace?.lexicalCount,\n\t\tpreviousLexicalTopK: previousTrace?.lexicalTopK,\n\t\tpreviousInputFilter: previousTrace?.inputFilter,\n\t\tpreviousInputRetrieval: previousTrace?.inputRetrieval,\n\t\tpreviousSourceBalanceStrategy: previousTrace?.sourceBalanceStrategy,\n\t\tpreviousStageCounts,\n\t\tpreviousTraceMode: previousTrace?.traceMode,\n\t\tpreviousTransformedQuery: previousTrace?.transformedQuery,\n\t\tpreviousVariantQueries: previousTrace?.variantQueries ?? [],\n\t\tpreviousVectorCount: previousTrace?.vectorCount,\n\t\tquery: caseResult.query,\n\t\tstageCounts,\n\t\tstatus: caseResult.status,\n\t\tsourceBalanceStrategy: currentTrace?.sourceBalanceStrategy,\n\t\ttraceChange,\n\t\ttraceMode: currentTrace?.mode,\n\t\ttransformedQuery: currentTrace?.transformedQuery || undefined,\n\t\tvariantQueries: currentTrace?.variantQueries ?? [],\n\t\tvectorCount: currentTrace?.resultCounts.vector ?? 0\n\t};\n};\n\nconst buildEvaluationCaseTraceSnapshotsFromEvaluated = (\n\tevaluated: Array<{\n\t\tcaseResult: RAGEvaluationCaseResult;\n\t\ttrace?: RAGRetrievalTrace;\n\t\tfilter?: Record<string, unknown>;\n\t\tretrieval?: RAGCollectionSearchParams['retrieval'];\n\t}>\n): RAGEvaluationCaseTraceSnapshot[] =>\n\tevaluated.map(({ caseResult, filter, retrieval, trace }) =>\n\t\tbuildEvaluationCaseTraceSnapshot({\n\t\t\tcaseResult,\n\t\t\tfilter,\n\t\t\tretrieval,\n\t\t\tcurrentTrace: trace\n\t\t})\n\t);\n\nconst buildEvaluationCaseTraceSnapshots = ({\n\tcurrent,\n\tprevious\n}: {\n\tcurrent?: RAGEvaluationSuiteRun;\n\tprevious?: RAGEvaluationSuiteRun;\n}): RAGEvaluationCaseTraceSnapshot[] => {\n\tif (!current) {\n\t\treturn [];\n\t}\n\n\tconst currentTraces = new Map(\n\t\t(current.caseTraceSnapshots ?? []).map((entry) => [entry.caseId, entry])\n\t);\n\tconst previousTraces = new Map(\n\t\t(previous?.caseTraceSnapshots ?? []).map((entry) => [\n\t\t\tentry.caseId,\n\t\t\tentry\n\t\t])\n\t);\n\n\treturn current.response.cases.map((caseResult) =>\n\t\tbuildEvaluationCaseTraceSnapshot({\n\t\t\tcaseResult,\n\t\t\tcurrentTrace: (() => {\n\t\t\t\tconst currentSnapshot = currentTraces.get(caseResult.caseId);\n\t\t\t\tif (!currentSnapshot) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tcandidateTopK: currentSnapshot.candidateTopK,\n\t\t\t\t\tlexicalTopK: currentSnapshot.lexicalTopK,\n\t\t\t\t\tmode: currentSnapshot.traceMode ?? 'vector',\n\t\t\t\t\tquery: caseResult.query,\n\t\t\t\t\tresultCounts: {\n\t\t\t\t\t\tfinal: currentSnapshot.finalCount,\n\t\t\t\t\t\tfused: currentSnapshot.finalCount,\n\t\t\t\t\t\tlexical: currentSnapshot.lexicalCount,\n\t\t\t\t\t\treranked: currentSnapshot.finalCount,\n\t\t\t\t\t\tvector: currentSnapshot.vectorCount\n\t\t\t\t\t},\n\t\t\t\t\trunLexical: currentSnapshot.lexicalCount > 0,\n\t\t\t\t\trunVector: currentSnapshot.vectorCount > 0,\n\t\t\t\t\tsourceBalanceStrategy:\n\t\t\t\t\t\tcurrentSnapshot.sourceBalanceStrategy ?? 'cap',\n\t\t\t\t\tsteps: [],\n\t\t\t\t\ttopK: caseResult.topK,\n\t\t\t\t\ttransformedQuery:\n\t\t\t\t\t\tcurrentSnapshot.transformedQuery ?? caseResult.query,\n\t\t\t\t\tvariantQueries: currentSnapshot.variantQueries\n\t\t\t\t} satisfies RAGRetrievalTrace;\n\t\t\t})(),\n\t\t\tpreviousTrace: previousTraces.get(caseResult.caseId)\n\t\t})\n\t);\n};\n\nconst getStatusRank = (status: RAGEvaluationCaseResult['status']) =>\n\tstatus === 'pass' ? 2 : status === 'partial' ? 1 : 0;\n\nexport const buildRAGEvaluationRunDiff = ({\n\tcurrent,\n\tprevious\n}: {\n\tcurrent: RAGEvaluationSuiteRun;\n\tprevious?: RAGEvaluationSuiteRun;\n}): RAGEvaluationRunDiff => {\n\tconst previousCases = new Map(\n\t\t(previous?.response.cases ?? []).map((entry) => [entry.caseId, entry])\n\t);\n\tconst diffs = current.response.cases.map((entry) =>\n\t\tbuildCaseDiff(entry, previousCases.get(entry.caseId))\n\t);\n\tconst regressedCases = diffs.filter(\n\t\t(entry) =>\n\t\t\tgetStatusRank(entry.currentStatus) <\n\t\t\tgetStatusRank(entry.previousStatus ?? 'fail')\n\t);\n\tconst improvedCases = diffs.filter(\n\t\t(entry) =>\n\t\t\tgetStatusRank(entry.currentStatus) >\n\t\t\tgetStatusRank(entry.previousStatus ?? 'fail')\n\t);\n\tconst unchangedCases = diffs.filter(\n\t\t(entry) =>\n\t\t\tgetStatusRank(entry.currentStatus) ===\n\t\t\tgetStatusRank(entry.previousStatus ?? 'fail')\n\t);\n\n\treturn {\n\t\tcurrentRunId: current.id,\n\t\timprovedCases,\n\t\tpreviousRunId: previous?.id,\n\t\tregressedCases,\n\t\tsuiteId: current.suiteId,\n\t\tsummaryDelta: {\n\t\t\taverageF1:\n\t\t\t\tcurrent.response.summary.averageF1 -\n\t\t\t\t(previous?.response.summary.averageF1 ?? 0),\n\t\t\taverageLatencyMs:\n\t\t\t\tcurrent.response.summary.averageLatencyMs -\n\t\t\t\t(previous?.response.summary.averageLatencyMs ?? 0),\n\t\t\tfailedCases:\n\t\t\t\tcurrent.response.summary.failedCases -\n\t\t\t\t(previous?.response.summary.failedCases ?? 0),\n\t\t\tpassedCases:\n\t\t\t\tcurrent.response.summary.passedCases -\n\t\t\t\t(previous?.response.summary.passedCases ?? 0),\n\t\t\tpassingRate:\n\t\t\t\tcurrent.response.passingRate -\n\t\t\t\t(previous?.response.passingRate ?? 0),\n\t\t\tpartialCases:\n\t\t\t\tcurrent.response.summary.partialCases -\n\t\t\t\t(previous?.response.summary.partialCases ?? 0)\n\t\t},\n\t\ttraceSummaryDelta:\n\t\t\tcurrent.traceSummary || previous?.traceSummary\n\t\t\t\t? {\n\t\t\t\t\t\taverageCandidateTopK:\n\t\t\t\t\t\t\t(current.traceSummary?.averageCandidateTopK ?? 0) -\n\t\t\t\t\t\t\t(previous?.traceSummary?.averageCandidateTopK ?? 0),\n\t\t\t\t\t\taverageFinalCount:\n\t\t\t\t\t\t\t(current.traceSummary?.averageFinalCount ?? 0) -\n\t\t\t\t\t\t\t(previous?.traceSummary?.averageFinalCount ?? 0),\n\t\t\t\t\t\taverageLexicalCount:\n\t\t\t\t\t\t\t(current.traceSummary?.averageLexicalCount ?? 0) -\n\t\t\t\t\t\t\t(previous?.traceSummary?.averageLexicalCount ?? 0),\n\t\t\t\t\t\taverageLexicalTopK:\n\t\t\t\t\t\t\t(current.traceSummary?.averageLexicalTopK ?? 0) -\n\t\t\t\t\t\t\t(previous?.traceSummary?.averageLexicalTopK ?? 0),\n\t\t\t\t\t\taverageVectorCount:\n\t\t\t\t\t\t\t(current.traceSummary?.averageVectorCount ?? 0) -\n\t\t\t\t\t\t\t(previous?.traceSummary?.averageVectorCount ?? 0),\n\t\t\t\t\t\tbalancedCases:\n\t\t\t\t\t\t\t(current.traceSummary?.balancedCases ?? 0) -\n\t\t\t\t\t\t\t(previous?.traceSummary?.balancedCases ?? 0),\n\t\t\t\t\t\tlexicalCases:\n\t\t\t\t\t\t\t(current.traceSummary?.lexicalCases ?? 0) -\n\t\t\t\t\t\t\t(previous?.traceSummary?.lexicalCases ?? 0),\n\t\t\t\t\t\tmodesChanged:\n\t\t\t\t\t\t\t(current.traceSummary?.modes ?? []).join('|') !==\n\t\t\t\t\t\t\t(previous?.traceSummary?.modes ?? []).join('|'),\n\t\t\t\t\t\troundRobinCases:\n\t\t\t\t\t\t\t(current.traceSummary?.roundRobinCases ?? 0) -\n\t\t\t\t\t\t\t(previous?.traceSummary?.roundRobinCases ?? 0),\n\t\t\t\t\t\tstageCounts: diffTraceStageCounts({\n\t\t\t\t\t\t\tcurrent: current.traceSummary?.stageCounts ?? {},\n\t\t\t\t\t\t\tprevious: previous?.traceSummary?.stageCounts ?? {}\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tsourceBalanceStrategiesChanged:\n\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\tcurrent.traceSummary?.sourceBalanceStrategies ??\n\t\t\t\t\t\t\t\t[]\n\t\t\t\t\t\t\t).join('|') !==\n\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\tprevious?.traceSummary\n\t\t\t\t\t\t\t\t\t?.sourceBalanceStrategies ?? []\n\t\t\t\t\t\t\t).join('|'),\n\t\t\t\t\t\ttransformedCases:\n\t\t\t\t\t\t\t(current.traceSummary?.transformedCases ?? 0) -\n\t\t\t\t\t\t\t(previous?.traceSummary?.transformedCases ?? 0),\n\t\t\t\t\t\tvariantCases:\n\t\t\t\t\t\t\t(current.traceSummary?.variantCases ?? 0) -\n\t\t\t\t\t\t\t(previous?.traceSummary?.variantCases ?? 0),\n\t\t\t\t\t\tvectorCases:\n\t\t\t\t\t\t\t(current.traceSummary?.vectorCases ?? 0) -\n\t\t\t\t\t\t\t(previous?.traceSummary?.vectorCases ?? 0)\n\t\t\t\t\t}\n\t\t\t\t: undefined,\n\t\tunchangedCases\n\t};\n};\n\nexport const buildRAGAnswerGroundingEvaluationRunDiff = ({\n\tcurrent,\n\tprevious\n}: {\n\tcurrent: RAGAnswerGroundingEvaluationRun;\n\tprevious?: RAGAnswerGroundingEvaluationRun;\n}): RAGAnswerGroundingEvaluationRunDiff => {\n\tconst previousCases = new Map(\n\t\t(previous?.response.cases ?? []).map((entry) => [entry.caseId, entry])\n\t);\n\tconst diffs = current.response.cases.map((entry) =>\n\t\tbuildGroundingCaseDiff(entry, previousCases.get(entry.caseId))\n\t);\n\tconst regressedCases = diffs.filter(\n\t\t(entry) =>\n\t\t\tgetStatusRank(entry.currentStatus) <\n\t\t\tgetStatusRank(entry.previousStatus ?? 'fail')\n\t);\n\tconst improvedCases = diffs.filter(\n\t\t(entry) =>\n\t\t\tgetStatusRank(entry.currentStatus) >\n\t\t\tgetStatusRank(entry.previousStatus ?? 'fail')\n\t);\n\tconst unchangedCases = diffs.filter(\n\t\t(entry) =>\n\t\t\tgetStatusRank(entry.currentStatus) ===\n\t\t\tgetStatusRank(entry.previousStatus ?? 'fail')\n\t);\n\n\treturn {\n\t\tcurrentRunId: current.id,\n\t\timprovedCases,\n\t\tpreviousRunId: previous?.id,\n\t\tregressedCases,\n\t\tsuiteId: current.suiteId,\n\t\tsummaryDelta: {\n\t\t\taverageCitationF1:\n\t\t\t\tcurrent.response.summary.averageCitationF1 -\n\t\t\t\t(previous?.response.summary.averageCitationF1 ?? 0),\n\t\t\taverageResolvedCitationRate:\n\t\t\t\tcurrent.response.summary.averageResolvedCitationRate -\n\t\t\t\t(previous?.response.summary.averageResolvedCitationRate ?? 0),\n\t\t\tfailedCases:\n\t\t\t\tcurrent.response.summary.failedCases -\n\t\t\t\t(previous?.response.summary.failedCases ?? 0),\n\t\t\tpassedCases:\n\t\t\t\tcurrent.response.summary.passedCases -\n\t\t\t\t(previous?.response.summary.passedCases ?? 0),\n\t\t\tpassingRate:\n\t\t\t\tcurrent.response.passingRate -\n\t\t\t\t(previous?.response.passingRate ?? 0),\n\t\t\tpartialCases:\n\t\t\t\tcurrent.response.summary.partialCases -\n\t\t\t\t(previous?.response.summary.partialCases ?? 0)\n\t\t},\n\t\tunchangedCases\n\t};\n};\n\nexport const createRAGFileEvaluationHistoryStore = (\n\tpath: string\n): RAGEvaluationHistoryStore => ({\n\tlistRuns: async ({ limit, suiteId } = {}) => {\n\t\tlet parsed: RAGEvaluationSuiteRun[] = [];\n\t\ttry {\n\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\tconst value = JSON.parse(content);\n\t\t\tparsed = Array.isArray(value) ? value : [];\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tconst filtered = parsed.filter(\n\t\t\t(entry) => !suiteId || entry.suiteId === suiteId\n\t\t);\n\t\tconst sorted = normalizeHistoryRuns(filtered);\n\t\treturn typeof limit === 'number' ? sorted.slice(0, limit) : sorted;\n\t},\n\tsaveRun: async (run) => {\n\t\tconst existing = await (async () => {\n\t\t\ttry {\n\t\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\t\tconst value = JSON.parse(content);\n\t\t\t\treturn Array.isArray(value) ? value : [];\n\t\t\t} catch (error) {\n\t\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\treturn [];\n\t\t\t}\n\t\t})();\n\t\tconst next = normalizeHistoryRuns([\n\t\t\trun,\n\t\t\t...existing.filter(\n\t\t\t\t(entry: RAGEvaluationSuiteRun) => entry.id !== run.id\n\t\t\t)\n\t\t]);\n\t\tawait mkdir(dirname(path), { recursive: true });\n\t\tawait writeFile(path, JSON.stringify(next, null, '\\t') + '\\n', 'utf8');\n\t}\n});\n\nexport const createRAGFileRetrievalComparisonHistoryStore = (\n\tpath: string\n): RAGRetrievalComparisonHistoryStore => ({\n\tlistRuns: async ({\n\t\tgroupKey,\n\t\tlabel,\n\t\tlimit,\n\t\tsuiteId,\n\t\ttag,\n\t\twinnerId\n\t} = {}) => {\n\t\tlet parsed: RAGRetrievalComparisonRun[] = [];\n\t\ttry {\n\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\tconst value = JSON.parse(content);\n\t\t\tparsed = Array.isArray(value) ? value : [];\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tconst normalizedLabel = normalizeLabelFilter(label);\n\t\tconst filtered = parsed.filter(\n\t\t\t(entry) =>\n\t\t\t\t(!suiteId || entry.suiteId === suiteId) &&\n\t\t\t\t(!groupKey || entry.groupKey === groupKey) &&\n\t\t\t\t(!tag || (entry.tags ?? []).includes(tag)) &&\n\t\t\t\t(!normalizedLabel ||\n\t\t\t\t\tentry.label.toLowerCase().includes(normalizedLabel) ||\n\t\t\t\t\tentry.suiteLabel.toLowerCase().includes(normalizedLabel)) &&\n\t\t\t\tmatchesWinner(entry, winnerId)\n\t\t);\n\t\tconst sorted = normalizeRetrievalComparisonRuns(filtered);\n\t\treturn typeof limit === 'number' ? sorted.slice(0, limit) : sorted;\n\t},\n\tsaveRun: async (run) => {\n\t\tconst existing = await (async () => {\n\t\t\ttry {\n\t\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\t\tconst value = JSON.parse(content);\n\t\t\t\treturn Array.isArray(value) ? value : [];\n\t\t\t} catch (error) {\n\t\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\treturn [];\n\t\t\t}\n\t\t})();\n\t\tconst next = normalizeRetrievalComparisonRuns([\n\t\t\trun,\n\t\t\t...existing.filter(\n\t\t\t\t(entry: RAGRetrievalComparisonRun) => entry.id !== run.id\n\t\t\t)\n\t\t]);\n\t\tawait mkdir(dirname(path), { recursive: true });\n\t\tawait writeFile(path, JSON.stringify(next, null, '\\t') + '\\n', 'utf8');\n\t}\n});\n\nexport const createRAGFileRetrievalBaselineStore = (\n\tpath: string\n): RAGRetrievalBaselineStore => {\n\tconst listBaselines: RAGRetrievalBaselineStore['listBaselines'] = async ({\n\t\tgroupKey,\n\t\tlimit,\n\t\ttag,\n\t\tstatus\n\t} = {}) => {\n\t\tlet parsed: RAGRetrievalBaselineRecord[] = [];\n\t\ttry {\n\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\tconst value = JSON.parse(content);\n\t\t\tparsed = Array.isArray(value) ? value : [];\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tconst filtered = parsed.filter(\n\t\t\t(entry) =>\n\t\t\t\t(!groupKey || entry.groupKey === groupKey) &&\n\t\t\t\t(!tag || (entry.tags ?? []).includes(tag)) &&\n\t\t\t\t(!status || entry.status === status)\n\t\t);\n\t\tconst sorted = normalizeRetrievalBaselineRecords(filtered);\n\t\treturn typeof limit === 'number' ? sorted.slice(0, limit) : sorted;\n\t};\n\n\treturn {\n\t\tgetBaseline: async (groupKey) => {\n\t\t\tconst baselines = await Promise.resolve(\n\t\t\t\tlistBaselines({ groupKey, limit: 1 })\n\t\t\t);\n\t\t\treturn baselines[0] ?? null;\n\t\t},\n\t\tlistBaselines,\n\t\tsaveBaseline: async (record) => {\n\t\t\tconst existing = await (async () => {\n\t\t\t\ttry {\n\t\t\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\t\t\tconst value = JSON.parse(content);\n\t\t\t\t\treturn Array.isArray(value) ? value : [];\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t}\n\t\t\t\t\treturn [];\n\t\t\t\t}\n\t\t\t})();\n\t\t\tconst currentVersion =\n\t\t\t\texisting\n\t\t\t\t\t.filter(\n\t\t\t\t\t\t(entry: RAGRetrievalBaselineRecord) =>\n\t\t\t\t\t\t\tentry.groupKey === record.groupKey\n\t\t\t\t\t)\n\t\t\t\t\t.reduce(\n\t\t\t\t\t\t(max, entry) => Math.max(max, entry.version ?? 0),\n\t\t\t\t\t\t0\n\t\t\t\t\t) ?? 0;\n\t\t\tconst next = normalizeRetrievalBaselineRecords([\n\t\t\t\t{\n\t\t\t\t\t...record,\n\t\t\t\t\tstatus: 'active',\n\t\t\t\t\tversion:\n\t\t\t\t\t\ttypeof record.version === 'number'\n\t\t\t\t\t\t\t? record.version\n\t\t\t\t\t\t\t: currentVersion + 1\n\t\t\t\t},\n\t\t\t\t...existing.map((entry: RAGRetrievalBaselineRecord) =>\n\t\t\t\t\tentry.groupKey === record.groupKey &&\n\t\t\t\t\t(entry.rolloutLabel ?? undefined) ===\n\t\t\t\t\t\t(record.rolloutLabel ?? undefined)\n\t\t\t\t\t\t? { ...entry, status: 'superseded' as const }\n\t\t\t\t\t\t: entry\n\t\t\t\t)\n\t\t\t]);\n\t\t\tawait mkdir(dirname(path), { recursive: true });\n\t\t\tawait writeFile(\n\t\t\t\tpath,\n\t\t\t\tJSON.stringify(next, null, '\\t') + '\\n',\n\t\t\t\t'utf8'\n\t\t\t);\n\t\t}\n\t};\n};\n\nexport const createRAGFileRetrievalReleaseDecisionStore = (\n\tpath: string\n): RAGRetrievalReleaseDecisionStore => ({\n\tlistDecisions: async ({ groupKey, kind, limit } = {}) => {\n\t\tlet parsed: RAGRetrievalReleaseDecisionRecord[] = [];\n\t\ttry {\n\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\tconst value = JSON.parse(content);\n\t\t\tparsed = Array.isArray(value) ? value : [];\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tconst filtered = parsed.filter(\n\t\t\t(entry) =>\n\t\t\t\t(!groupKey || entry.groupKey === groupKey) &&\n\t\t\t\t(!kind || entry.kind === kind)\n\t\t);\n\t\tconst sorted = normalizeRetrievalReleaseDecisionRecords(filtered);\n\t\treturn typeof limit === 'number' ? sorted.slice(0, limit) : sorted;\n\t},\n\tsaveDecision: async (record) => {\n\t\tconst existing = await (async () => {\n\t\t\ttry {\n\t\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\t\tconst value = JSON.parse(content);\n\t\t\t\treturn Array.isArray(value) ? value : [];\n\t\t\t} catch (error) {\n\t\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\treturn [];\n\t\t\t}\n\t\t})();\n\t\tconst next = normalizeRetrievalReleaseDecisionRecords([\n\t\t\trecord,\n\t\t\t...existing.filter(\n\t\t\t\t(entry: RAGRetrievalReleaseDecisionRecord) =>\n\t\t\t\t\tentry.id !== record.id\n\t\t\t)\n\t\t]);\n\t\tawait mkdir(dirname(path), { recursive: true });\n\t\tawait writeFile(path, JSON.stringify(next, null, '\\t') + '\\n', 'utf8');\n\t}\n});\n\nexport const createRAGFileRetrievalLaneHandoffDecisionStore = (\n\tpath: string\n): RAGRetrievalLaneHandoffDecisionStore => ({\n\tlistDecisions: async ({\n\t\tgroupKey,\n\t\tkind,\n\t\tlimit,\n\t\tsourceRolloutLabel,\n\t\ttargetRolloutLabel\n\t} = {}) => {\n\t\tlet parsed: RAGRetrievalLaneHandoffDecisionRecord[] = [];\n\t\ttry {\n\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\tconst value = JSON.parse(content);\n\t\t\tparsed = Array.isArray(value) ? value : [];\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tconst filtered = parsed.filter(\n\t\t\t(entry) =>\n\t\t\t\t(!groupKey || entry.groupKey === groupKey) &&\n\t\t\t\t(!kind || entry.kind === kind) &&\n\t\t\t\t(!sourceRolloutLabel ||\n\t\t\t\t\tentry.sourceRolloutLabel === sourceRolloutLabel) &&\n\t\t\t\t(!targetRolloutLabel ||\n\t\t\t\t\tentry.targetRolloutLabel === targetRolloutLabel)\n\t\t);\n\t\tconst sorted = normalizeRetrievalLaneHandoffDecisionRecords(filtered);\n\t\treturn typeof limit === 'number' ? sorted.slice(0, limit) : sorted;\n\t},\n\tsaveDecision: async (record) => {\n\t\tconst existing = await (async () => {\n\t\t\ttry {\n\t\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\t\tconst value = JSON.parse(content);\n\t\t\t\treturn Array.isArray(value) ? value : [];\n\t\t\t} catch (error) {\n\t\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\treturn [];\n\t\t\t}\n\t\t})();\n\t\tconst next = normalizeRetrievalLaneHandoffDecisionRecords([\n\t\t\trecord,\n\t\t\t...existing.filter(\n\t\t\t\t(entry: RAGRetrievalLaneHandoffDecisionRecord) =>\n\t\t\t\t\tentry.id !== record.id\n\t\t\t)\n\t\t]);\n\t\tawait mkdir(dirname(path), { recursive: true });\n\t\tawait writeFile(path, JSON.stringify(next, null, '\\t') + '\\n', 'utf8');\n\t}\n});\n\nexport const createRAGFileRetrievalReleaseIncidentStore = (\n\tpath: string\n): RAGRetrievalReleaseIncidentStore => ({\n\tlistIncidents: async ({\n\t\tgroupKey,\n\t\tlimit,\n\t\tseverity,\n\t\tstatus,\n\t\ttargetRolloutLabel\n\t} = {}) => {\n\t\tlet parsed: RAGRetrievalReleaseIncidentRecord[] = [];\n\t\ttry {\n\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\tconst value = JSON.parse(content);\n\t\t\tparsed = Array.isArray(value) ? value : [];\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tconst filtered = parsed.filter(\n\t\t\t(entry) =>\n\t\t\t\t(!groupKey || entry.groupKey === groupKey) &&\n\t\t\t\t(!targetRolloutLabel ||\n\t\t\t\t\tentry.targetRolloutLabel === targetRolloutLabel) &&\n\t\t\t\t(!severity || entry.severity === severity) &&\n\t\t\t\t(!status || entry.status === status)\n\t\t);\n\t\tconst sorted = normalizeRetrievalReleaseIncidentRecords(filtered);\n\t\treturn typeof limit === 'number' ? sorted.slice(0, limit) : sorted;\n\t},\n\tsaveIncident: async (record) => {\n\t\tconst existing = await (async () => {\n\t\t\ttry {\n\t\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\t\tconst value = JSON.parse(content);\n\t\t\t\treturn Array.isArray(value) ? value : [];\n\t\t\t} catch (error) {\n\t\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\treturn [];\n\t\t\t}\n\t\t})();\n\t\tconst next = normalizeRetrievalReleaseIncidentRecords([\n\t\t\trecord,\n\t\t\t...existing.filter(\n\t\t\t\t(entry: RAGRetrievalReleaseIncidentRecord) =>\n\t\t\t\t\tentry.id !== record.id\n\t\t\t)\n\t\t]);\n\t\tawait mkdir(dirname(path), { recursive: true });\n\t\tawait writeFile(path, JSON.stringify(next, null, '\\t') + '\\n', 'utf8');\n\t}\n});\n\nexport const createRAGFileRetrievalLaneHandoffIncidentStore = (\n\tpath: string\n): RAGRetrievalLaneHandoffIncidentStore => ({\n\tlistIncidents: async ({\n\t\tgroupKey,\n\t\tlimit,\n\t\tseverity,\n\t\tstatus,\n\t\ttargetRolloutLabel\n\t} = {}) => {\n\t\tlet parsed: RAGRetrievalLaneHandoffIncidentRecord[] = [];\n\t\ttry {\n\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\tconst value = JSON.parse(content);\n\t\t\tparsed = Array.isArray(value) ? value : [];\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tconst filtered = parsed.filter(\n\t\t\t(entry) =>\n\t\t\t\t(!groupKey || entry.groupKey === groupKey) &&\n\t\t\t\t(!targetRolloutLabel ||\n\t\t\t\t\tentry.targetRolloutLabel === targetRolloutLabel) &&\n\t\t\t\t(!severity || entry.severity === severity) &&\n\t\t\t\t(!status || entry.status === status)\n\t\t);\n\t\tconst sorted = normalizeRetrievalReleaseIncidentRecords(\n\t\t\tfiltered as RAGRetrievalReleaseIncidentRecord[]\n\t\t) as RAGRetrievalLaneHandoffIncidentRecord[];\n\t\treturn typeof limit === 'number' ? sorted.slice(0, limit) : sorted;\n\t},\n\tsaveIncident: async (record) => {\n\t\tconst existing = await (async () => {\n\t\t\ttry {\n\t\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\t\tconst value = JSON.parse(content);\n\t\t\t\treturn Array.isArray(value) ? value : [];\n\t\t\t} catch (error) {\n\t\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\treturn [];\n\t\t\t}\n\t\t})();\n\t\tconst next = normalizeRetrievalReleaseIncidentRecords([\n\t\t\trecord as RAGRetrievalReleaseIncidentRecord,\n\t\t\t...existing.filter(\n\t\t\t\t(entry: RAGRetrievalLaneHandoffIncidentRecord) =>\n\t\t\t\t\tentry.id !== record.id\n\t\t\t)\n\t\t]) as RAGRetrievalLaneHandoffIncidentRecord[];\n\t\tawait mkdir(dirname(path), { recursive: true });\n\t\tawait writeFile(path, JSON.stringify(next, null, '\\t') + '\\n', 'utf8');\n\t}\n});\n\nexport const createRAGFileRetrievalLaneHandoffIncidentHistoryStore = (\n\tpath: string\n): RAGRetrievalLaneHandoffIncidentHistoryStore => ({\n\tlistRecords: async ({\n\t\taction,\n\t\tgroupKey,\n\t\tincidentId,\n\t\tlimit,\n\t\ttargetRolloutLabel\n\t} = {}) => {\n\t\tlet parsed: RAGRetrievalLaneHandoffIncidentHistoryRecord[] = [];\n\t\ttry {\n\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\tconst value = JSON.parse(content);\n\t\t\tparsed = Array.isArray(value) ? value : [];\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tconst filtered = parsed\n\t\t\t.filter(\n\t\t\t\t(entry) =>\n\t\t\t\t\t(!action || entry.action === action) &&\n\t\t\t\t\t(!groupKey || entry.groupKey === groupKey) &&\n\t\t\t\t\t(!incidentId || entry.incidentId === incidentId) &&\n\t\t\t\t\t(!targetRolloutLabel ||\n\t\t\t\t\t\tentry.targetRolloutLabel === targetRolloutLabel)\n\t\t\t)\n\t\t\t.sort((left, right) => right.recordedAt - left.recordedAt);\n\t\treturn typeof limit === 'number' ? filtered.slice(0, limit) : filtered;\n\t},\n\tsaveRecord: async (record) => {\n\t\tconst existing = await (async () => {\n\t\t\ttry {\n\t\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\t\tconst value = JSON.parse(content);\n\t\t\t\treturn Array.isArray(value) ? value : [];\n\t\t\t} catch (error) {\n\t\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\treturn [];\n\t\t\t}\n\t\t})();\n\t\tconst next = [record, ...existing].sort(\n\t\t\t(\n\t\t\t\tleft: RAGRetrievalLaneHandoffIncidentHistoryRecord,\n\t\t\t\tright: RAGRetrievalLaneHandoffIncidentHistoryRecord\n\t\t\t) => right.recordedAt - left.recordedAt\n\t\t);\n\t\tawait mkdir(dirname(path), { recursive: true });\n\t\tawait writeFile(path, JSON.stringify(next, null, '\\t') + '\\n', 'utf8');\n\t}\n});\n\nexport const createRAGFileRetrievalIncidentRemediationDecisionStore = (\n\tpath: string\n): RAGRetrievalIncidentRemediationDecisionStore => ({\n\tlistRecords: async ({\n\t\tgroupKey,\n\t\tincidentId,\n\t\tlimit,\n\t\tremediationKind,\n\t\tstatus,\n\t\ttargetRolloutLabel\n\t} = {}) => {\n\t\tlet parsed: RAGRetrievalIncidentRemediationDecisionRecord[] = [];\n\t\ttry {\n\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\tconst value = JSON.parse(content);\n\t\t\tparsed = Array.isArray(value) ? value : [];\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t\tconst filtered = normalizeRetrievalIncidentRemediationDecisionRecords(\n\t\t\tparsed\n\t\t).filter(\n\t\t\t(entry) =>\n\t\t\t\t(!groupKey || entry.groupKey === groupKey) &&\n\t\t\t\t(!incidentId || entry.incidentId === incidentId) &&\n\t\t\t\t(!remediationKind ||\n\t\t\t\t\tentry.remediationKind === remediationKind) &&\n\t\t\t\t(!status || entry.status === status) &&\n\t\t\t\t(!targetRolloutLabel ||\n\t\t\t\t\tentry.targetRolloutLabel === targetRolloutLabel)\n\t\t);\n\t\treturn typeof limit === 'number' ? filtered.slice(0, limit) : filtered;\n\t},\n\tsaveRecord: async (record) => {\n\t\tconst existing = await (async () => {\n\t\t\ttry {\n\t\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\t\tconst value = JSON.parse(content);\n\t\t\t\treturn Array.isArray(value) ? value : [];\n\t\t\t} catch (error) {\n\t\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\treturn [];\n\t\t\t}\n\t\t})();\n\t\tconst next = normalizeRetrievalIncidentRemediationDecisionRecords([\n\t\t\trecord,\n\t\t\t...existing\n\t\t]);\n\t\tawait mkdir(dirname(path), { recursive: true });\n\t\tawait writeFile(path, JSON.stringify(next, null, '\\t') + '\\n', 'utf8');\n\t}\n});\n\nexport const createRAGFileRetrievalIncidentRemediationExecutionHistoryStore = (\n\tpath: string\n): RAGRetrievalIncidentRemediationExecutionHistoryStore => ({\n\tlistRecords: async ({\n\t\tactionKind,\n\t\tblockedByGuardrail,\n\t\tcode,\n\t\tgroupKey,\n\t\tidempotentReplay,\n\t\tincidentId,\n\t\tlimit,\n\t\ttargetRolloutLabel\n\t} = {}) => {\n\t\tlet parsed: RAGRetrievalIncidentRemediationExecutionHistoryRecord[] =\n\t\t\t[];\n\t\ttry {\n\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\tconst value = JSON.parse(content);\n\t\t\tparsed = Array.isArray(value) ? value : [];\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t\tconst filtered =\n\t\t\tnormalizeRetrievalIncidentRemediationExecutionHistoryRecords(\n\t\t\t\tparsed\n\t\t\t).filter(\n\t\t\t\t(entry) =>\n\t\t\t\t\t(!groupKey || entry.groupKey === groupKey) &&\n\t\t\t\t\t(!incidentId || entry.incidentId === incidentId) &&\n\t\t\t\t\t(!actionKind || entry.action.kind === actionKind) &&\n\t\t\t\t\t(!code || entry.code === code) &&\n\t\t\t\t\t(typeof blockedByGuardrail !== 'boolean' ||\n\t\t\t\t\t\tentry.blockedByGuardrail === blockedByGuardrail) &&\n\t\t\t\t\t(typeof idempotentReplay !== 'boolean' ||\n\t\t\t\t\t\tentry.idempotentReplay === idempotentReplay) &&\n\t\t\t\t\t(!targetRolloutLabel ||\n\t\t\t\t\t\tentry.targetRolloutLabel === targetRolloutLabel)\n\t\t\t);\n\t\treturn typeof limit === 'number' ? filtered.slice(0, limit) : filtered;\n\t},\n\tsaveRecord: async (record) => {\n\t\tconst existing = await (async () => {\n\t\t\ttry {\n\t\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\t\tconst value = JSON.parse(content);\n\t\t\t\treturn Array.isArray(value) ? value : [];\n\t\t\t} catch (error) {\n\t\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\treturn [];\n\t\t\t}\n\t\t})();\n\t\tconst next =\n\t\t\tnormalizeRetrievalIncidentRemediationExecutionHistoryRecords([\n\t\t\t\trecord,\n\t\t\t\t...existing\n\t\t\t]);\n\t\tawait mkdir(dirname(path), { recursive: true });\n\t\tawait writeFile(path, JSON.stringify(next, null, '\\t') + '\\n', 'utf8');\n\t}\n});\n\nexport const createRAGFileRetrievalLaneHandoffAutoCompletePolicyHistoryStore = (\n\tpath: string\n): RAGRetrievalLaneHandoffAutoCompletePolicyHistoryStore => ({\n\tlistRecords: async ({ groupKey, limit, targetRolloutLabel } = {}) => {\n\t\tlet parsed: RAGRetrievalLaneHandoffAutoCompletePolicyHistoryRecord[] =\n\t\t\t[];\n\t\ttry {\n\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\tconst value = JSON.parse(content);\n\t\t\tparsed = Array.isArray(value) ? value : [];\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t\tconst filtered = parsed\n\t\t\t.filter(\n\t\t\t\t(entry) =>\n\t\t\t\t\t(!groupKey || entry.groupKey === groupKey) &&\n\t\t\t\t\t(!targetRolloutLabel ||\n\t\t\t\t\t\tentry.targetRolloutLabel === targetRolloutLabel)\n\t\t\t)\n\t\t\t.sort((left, right) => right.recordedAt - left.recordedAt);\n\t\treturn typeof limit === 'number' ? filtered.slice(0, limit) : filtered;\n\t},\n\tsaveRecord: async (record) => {\n\t\tconst existing = await (async () => {\n\t\t\ttry {\n\t\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\t\tconst value = JSON.parse(content);\n\t\t\t\treturn Array.isArray(value) ? value : [];\n\t\t\t} catch (error) {\n\t\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\treturn [];\n\t\t\t}\n\t\t})();\n\t\tconst next = [record, ...existing].sort(\n\t\t\t(\n\t\t\t\tleft: RAGRetrievalLaneHandoffAutoCompletePolicyHistoryRecord,\n\t\t\t\tright: RAGRetrievalLaneHandoffAutoCompletePolicyHistoryRecord\n\t\t\t) => right.recordedAt - left.recordedAt\n\t\t);\n\t\tawait mkdir(dirname(path), { recursive: true });\n\t\tawait writeFile(path, JSON.stringify(next, null, '\\t') + '\\n', 'utf8');\n\t}\n});\n\nexport const createRAGFileRetrievalReleaseLanePolicyHistoryStore = (\n\tpath: string\n): RAGRetrievalReleaseLanePolicyHistoryStore => ({\n\tlistRecords: async ({ groupKey, limit, rolloutLabel, scope } = {}) => {\n\t\tlet parsed: RAGRetrievalReleaseLanePolicyHistoryRecord[] = [];\n\t\ttry {\n\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\tconst value = JSON.parse(content);\n\t\t\tparsed = Array.isArray(value) ? value : [];\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t\tconst filtered = parsed\n\t\t\t.filter(\n\t\t\t\t(entry) =>\n\t\t\t\t\t(!groupKey || entry.groupKey === groupKey) &&\n\t\t\t\t\t(!rolloutLabel || entry.rolloutLabel === rolloutLabel) &&\n\t\t\t\t\t(!scope || entry.scope === scope)\n\t\t\t)\n\t\t\t.sort((left, right) => right.recordedAt - left.recordedAt);\n\t\treturn typeof limit === 'number' ? filtered.slice(0, limit) : filtered;\n\t},\n\tsaveRecord: async (record) => {\n\t\tconst existing = await (async () => {\n\t\t\ttry {\n\t\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\t\tconst value = JSON.parse(content);\n\t\t\t\treturn Array.isArray(value) ? value : [];\n\t\t\t} catch (error) {\n\t\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\treturn [];\n\t\t\t}\n\t\t})();\n\t\tconst next = [record, ...existing].sort(\n\t\t\t(\n\t\t\t\tleft: RAGRetrievalReleaseLanePolicyHistoryRecord,\n\t\t\t\tright: RAGRetrievalReleaseLanePolicyHistoryRecord\n\t\t\t) => right.recordedAt - left.recordedAt\n\t\t);\n\t\tawait mkdir(dirname(path), { recursive: true });\n\t\tawait writeFile(path, JSON.stringify(next, null, '\\t') + '\\n', 'utf8');\n\t}\n});\n\nexport const createRAGFileRetrievalBaselineGatePolicyHistoryStore = (\n\tpath: string\n): RAGRetrievalBaselineGatePolicyHistoryStore => ({\n\tlistRecords: async ({ groupKey, limit, rolloutLabel, scope } = {}) => {\n\t\tlet parsed: RAGRetrievalBaselineGatePolicyHistoryRecord[] = [];\n\t\ttry {\n\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\tconst value = JSON.parse(content);\n\t\t\tparsed = Array.isArray(value) ? value : [];\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t\tconst filtered = parsed\n\t\t\t.filter(\n\t\t\t\t(entry) =>\n\t\t\t\t\t(!groupKey || entry.groupKey === groupKey) &&\n\t\t\t\t\t(!rolloutLabel || entry.rolloutLabel === rolloutLabel) &&\n\t\t\t\t\t(!scope || entry.scope === scope)\n\t\t\t)\n\t\t\t.sort((left, right) => right.recordedAt - left.recordedAt);\n\t\treturn typeof limit === 'number' ? filtered.slice(0, limit) : filtered;\n\t},\n\tsaveRecord: async (record) => {\n\t\tconst existing = await (async () => {\n\t\t\ttry {\n\t\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\t\tconst value = JSON.parse(content);\n\t\t\t\treturn Array.isArray(value) ? value : [];\n\t\t\t} catch (error) {\n\t\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\treturn [];\n\t\t\t}\n\t\t})();\n\t\tconst next = [record, ...existing].sort(\n\t\t\t(\n\t\t\t\tleft: RAGRetrievalBaselineGatePolicyHistoryRecord,\n\t\t\t\tright: RAGRetrievalBaselineGatePolicyHistoryRecord\n\t\t\t) => right.recordedAt - left.recordedAt\n\t\t);\n\t\tawait mkdir(dirname(path), { recursive: true });\n\t\tawait writeFile(path, JSON.stringify(next, null, '\\t') + '\\n', 'utf8');\n\t}\n});\n\nexport const createRAGFileRetrievalReleaseLaneEscalationPolicyHistoryStore = (\n\tpath: string\n): RAGRetrievalReleaseLaneEscalationPolicyHistoryStore => ({\n\tlistRecords: async ({ groupKey, limit, targetRolloutLabel } = {}) => {\n\t\tlet parsed: RAGRetrievalReleaseLaneEscalationPolicyHistoryRecord[] = [];\n\t\ttry {\n\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\tconst value = JSON.parse(content);\n\t\t\tparsed = Array.isArray(value) ? value : [];\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t\tconst filtered = parsed\n\t\t\t.filter(\n\t\t\t\t(entry) =>\n\t\t\t\t\t(!groupKey || entry.groupKey === groupKey) &&\n\t\t\t\t\t(!targetRolloutLabel ||\n\t\t\t\t\t\tentry.targetRolloutLabel === targetRolloutLabel)\n\t\t\t)\n\t\t\t.sort((left, right) => right.recordedAt - left.recordedAt);\n\t\treturn typeof limit === 'number' ? filtered.slice(0, limit) : filtered;\n\t},\n\tsaveRecord: async (record) => {\n\t\tconst existing = await (async () => {\n\t\t\ttry {\n\t\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\t\tconst value = JSON.parse(content);\n\t\t\t\treturn Array.isArray(value) ? value : [];\n\t\t\t} catch (error) {\n\t\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\treturn [];\n\t\t\t}\n\t\t})();\n\t\tconst next = [record, ...existing].sort(\n\t\t\t(\n\t\t\t\tleft: RAGRetrievalReleaseLaneEscalationPolicyHistoryRecord,\n\t\t\t\tright: RAGRetrievalReleaseLaneEscalationPolicyHistoryRecord\n\t\t\t) => right.recordedAt - left.recordedAt\n\t\t);\n\t\tawait mkdir(dirname(path), { recursive: true });\n\t\tawait writeFile(path, JSON.stringify(next, null, '\\t') + '\\n', 'utf8');\n\t}\n});\n\nexport const createRAGFileSearchTraceStore = (\n\tpath: string\n): RAGSearchTraceStore => ({\n\tasync listTraces(input) {\n\t\ttry {\n\t\t\tconst raw = await readFile(path, 'utf8');\n\t\t\tconst data = JSON.parse(raw) as {\n\t\t\t\ttraces?: RAGSearchTraceRecord[];\n\t\t\t};\n\t\t\tconst traces = Array.isArray(data.traces) ? data.traces : [];\n\t\t\tconst filtered = traces.filter((trace) => {\n\t\t\t\tif (input?.query && trace.query !== input.query) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif (input?.groupKey && trace.groupKey !== input.groupKey) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif (input?.tag && !(trace.tags ?? []).includes(input.tag)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t});\n\n\t\t\treturn normalizeTraceSummaryRuns(filtered).slice(\n\t\t\t\t0,\n\t\t\t\tinput?.limit ?? DEFAULT_HISTORY_LIMIT\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tif (\n\t\t\t\terror &&\n\t\t\t\ttypeof error === 'object' &&\n\t\t\t\t'code' in error &&\n\t\t\t\terror.code === 'ENOENT'\n\t\t\t) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\tthrow error;\n\t\t}\n\t},\n\tasync saveTrace(trace) {\n\t\tlet traces: RAGSearchTraceRecord[] = [];\n\t\ttry {\n\t\t\tconst raw = await readFile(path, 'utf8');\n\t\t\tconst data = JSON.parse(raw) as {\n\t\t\t\ttraces?: RAGSearchTraceRecord[];\n\t\t\t};\n\t\t\ttraces = Array.isArray(data.traces) ? data.traces : [];\n\t\t} catch (error) {\n\t\t\tif (\n\t\t\t\t!error ||\n\t\t\t\ttypeof error !== 'object' ||\n\t\t\t\t!('code' in error) ||\n\t\t\t\terror.code !== 'ENOENT'\n\t\t\t) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tconst nextTraces = normalizeTraceSummaryRuns([\n\t\t\ttrace,\n\t\t\t...traces.filter((entry) => entry.id !== trace.id)\n\t\t]);\n\t\tawait mkdir(dirname(path), { recursive: true });\n\t\tawait writeFile(\n\t\t\tpath,\n\t\t\tJSON.stringify(\n\t\t\t\t{\n\t\t\t\t\ttraces: nextTraces\n\t\t\t\t},\n\t\t\t\tnull,\n\t\t\t\t2\n\t\t\t)\n\t\t);\n\t},\n\tasync pruneTraces(input) {\n\t\tlet traces: RAGSearchTraceRecord[] = [];\n\t\ttry {\n\t\t\tconst raw = await readFile(path, 'utf8');\n\t\t\tconst data = JSON.parse(raw) as {\n\t\t\t\ttraces?: RAGSearchTraceRecord[];\n\t\t\t};\n\t\t\ttraces = Array.isArray(data.traces) ? data.traces : [];\n\t\t} catch (error) {\n\t\t\tif (\n\t\t\t\t!error ||\n\t\t\t\ttypeof error !== 'object' ||\n\t\t\t\t!('code' in error) ||\n\t\t\t\terror.code !== 'ENOENT'\n\t\t\t) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tconst pruned = applyRAGSearchTracePrunePolicy({\n\t\t\tinput,\n\t\t\ttraces\n\t\t});\n\t\tawait mkdir(dirname(path), { recursive: true });\n\t\tawait writeFile(\n\t\t\tpath,\n\t\t\tJSON.stringify(\n\t\t\t\t{\n\t\t\t\t\ttraces: pruned.next\n\t\t\t\t},\n\t\t\t\tnull,\n\t\t\t\t2\n\t\t\t)\n\t\t);\n\n\t\treturn {\n\t\t\tkeptCount: pruned.keptCount,\n\t\t\tremovedCount: pruned.removedCount\n\t\t};\n\t}\n});\n\nexport const createRAGFileSearchTracePruneHistoryStore = (\n\tpath: string\n): RAGSearchTracePruneHistoryStore => ({\n\tlistRuns: async (input) => {\n\t\tlet parsed: RAGSearchTracePruneRun[] = [];\n\t\ttry {\n\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\tconst value = JSON.parse(content);\n\t\t\tparsed = Array.isArray(value) ? value : [];\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tconst filtered = parsed.filter(\n\t\t\t(entry) => !input?.trigger || entry.trigger === input.trigger\n\t\t);\n\t\tconst sorted = normalizeSearchTracePruneRuns(filtered);\n\t\treturn typeof input?.limit === 'number'\n\t\t\t? sorted.slice(0, input.limit)\n\t\t\t: sorted;\n\t},\n\tsaveRun: async (run) => {\n\t\tconst existing = await (async () => {\n\t\t\ttry {\n\t\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\t\tconst value = JSON.parse(content);\n\t\t\t\treturn Array.isArray(value) ? value : [];\n\t\t\t} catch (error) {\n\t\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\treturn [];\n\t\t\t}\n\t\t})();\n\t\tconst next = normalizeSearchTracePruneRuns([\n\t\t\trun,\n\t\t\t...existing.filter(\n\t\t\t\t(entry: RAGSearchTracePruneRun) => entry.id !== run.id\n\t\t\t)\n\t\t]);\n\t\tawait mkdir(dirname(path), { recursive: true });\n\t\tawait writeFile(path, JSON.stringify(next, null, '\\t') + '\\n', 'utf8');\n\t}\n});\n\nexport type SQLiteRAGSearchTraceStoreOptions = {\n\tdb?: Database;\n\tpath?: string;\n\ttableName?: string;\n};\n\ntype SQLiteSearchTraceRow = {\n\tid: string;\n\tquery: string;\n\tlabel: string;\n\tgroup_key: string | null;\n\ttags_json: string | null;\n\tstarted_at: number;\n\tfinished_at: number;\n\telapsed_ms: number;\n\ttrace_json: string;\n\tsummary_json: string;\n\tresults_json: string;\n\tmetadata_json: string | null;\n};\n\nconst isSQLiteSearchTraceRow = (\n\tvalue: unknown\n): value is SQLiteSearchTraceRow =>\n\tisObjectRecord(value) &&\n\ttypeof value.id === 'string' &&\n\ttypeof value.query === 'string' &&\n\ttypeof value.label === 'string' &&\n\t(typeof value.group_key === 'string' || value.group_key === null) &&\n\t(typeof value.tags_json === 'string' || value.tags_json === null) &&\n\ttypeof value.started_at === 'number' &&\n\ttypeof value.finished_at === 'number' &&\n\ttypeof value.elapsed_ms === 'number' &&\n\ttypeof value.trace_json === 'string' &&\n\ttypeof value.summary_json === 'string' &&\n\ttypeof value.results_json === 'string' &&\n\t(typeof value.metadata_json === 'string' || value.metadata_json === null);\n\nconst assertSupportedIdentifier = (name: string) => {\n\tif (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name)) {\n\t\tthrow new Error(\n\t\t\t`Invalid SQLite search trace table name \"${name}\". Only alphanumeric and underscore names are allowed.`\n\t\t);\n\t}\n};\n\nconst mapSQLiteSearchTraceRow = (\n\trow: SQLiteSearchTraceRow\n): RAGSearchTraceRecord => ({\n\telapsedMs: row.elapsed_ms,\n\tfinishedAt: row.finished_at,\n\tgroupKey: row.group_key ?? undefined,\n\tid: row.id,\n\tlabel: row.label,\n\tmetadata: parseJSONRecord(row.metadata_json),\n\tquery: row.query,\n\tresults: parseJSONArray(row.results_json, []),\n\tstartedAt: row.started_at,\n\tsummary: JSON.parse(row.summary_json),\n\ttags: normalizeStringArray(parseJSONArray(row.tags_json, [])),\n\ttrace: JSON.parse(row.trace_json)\n});\n\nexport const createRAGSQLiteSearchTraceStore = (\n\toptions: SQLiteRAGSearchTraceStoreOptions\n): RAGSearchTraceStore => {\n\tconst tableName = options.tableName ?? DEFAULT_SEARCH_TRACE_TABLE_NAME;\n\tassertSupportedIdentifier(tableName);\n\n\tconst db =\n\t\toptions.db ??\n\t\tnew (loadBunSQLiteModule().Database)(options.path ?? ':memory:');\n\n\tdb.exec(`\n\t\tCREATE TABLE IF NOT EXISTS ${tableName} (\n\t\t\tid TEXT PRIMARY KEY,\n\t\t\tquery TEXT NOT NULL,\n\t\t\tlabel TEXT NOT NULL,\n\t\t\tgroup_key TEXT,\n\t\t\ttags_json TEXT,\n\t\t\tstarted_at INTEGER NOT NULL,\n\t\t\tfinished_at INTEGER NOT NULL,\n\t\t\telapsed_ms INTEGER NOT NULL,\n\t\t\ttrace_json TEXT NOT NULL,\n\t\t\tsummary_json TEXT NOT NULL,\n\t\t\tresults_json TEXT NOT NULL,\n\t\t\tmetadata_json TEXT\n\t\t)\n\t`);\n\tdb.exec(\n\t\t`CREATE INDEX IF NOT EXISTS ${tableName}_query_finished_at_idx ON ${tableName} (query, finished_at DESC)`\n\t);\n\tdb.exec(\n\t\t`CREATE INDEX IF NOT EXISTS ${tableName}_group_finished_at_idx ON ${tableName} (group_key, finished_at DESC)`\n\t);\n\tdb.exec(\n\t\t`CREATE INDEX IF NOT EXISTS ${tableName}_finished_at_idx ON ${tableName} (finished_at DESC)`\n\t);\n\n\tconst listBase = `\n\t\tSELECT\n\t\t\tid,\n\t\t\tquery,\n\t\t\tlabel,\n\t\t\tgroup_key,\n\t\t\ttags_json,\n\t\t\tstarted_at,\n\t\t\tfinished_at,\n\t\t\telapsed_ms,\n\t\t\ttrace_json,\n\t\t\tsummary_json,\n\t\t\tresults_json,\n\t\t\tmetadata_json\n\t\tFROM ${tableName}\n\t`;\n\tconst insert = db.prepare(`\n\t\tINSERT INTO ${tableName} (\n\t\t\tid,\n\t\t\tquery,\n\t\t\tlabel,\n\t\t\tgroup_key,\n\t\t\ttags_json,\n\t\t\tstarted_at,\n\t\t\tfinished_at,\n\t\t\telapsed_ms,\n\t\t\ttrace_json,\n\t\t\tsummary_json,\n\t\t\tresults_json,\n\t\t\tmetadata_json\n\t\t) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n\t\tON CONFLICT(id) DO UPDATE SET\n\t\t\tquery = excluded.query,\n\t\t\tlabel = excluded.label,\n\t\t\tgroup_key = excluded.group_key,\n\t\t\ttags_json = excluded.tags_json,\n\t\t\tstarted_at = excluded.started_at,\n\t\t\tfinished_at = excluded.finished_at,\n\t\t\telapsed_ms = excluded.elapsed_ms,\n\t\t\ttrace_json = excluded.trace_json,\n\t\t\tsummary_json = excluded.summary_json,\n\t\t\tresults_json = excluded.results_json,\n\t\t\tmetadata_json = excluded.metadata_json\n\t`);\n\tconst remove = db.prepare(`DELETE FROM ${tableName} WHERE id = ?`);\n\n\treturn {\n\t\tlistTraces(input) {\n\t\t\tconst where: string[] = [];\n\t\t\tconst params: Array<string | number> = [];\n\n\t\t\tif (input?.query) {\n\t\t\t\twhere.push('query = ?');\n\t\t\t\tparams.push(input.query);\n\t\t\t}\n\n\t\t\tif (input?.groupKey) {\n\t\t\t\twhere.push('group_key = ?');\n\t\t\t\tparams.push(input.groupKey);\n\t\t\t}\n\n\t\t\tconst sql =\n\t\t\t\t`${listBase}${where.length > 0 ? ` WHERE ${where.join(' AND ')}` : ''} ` +\n\t\t\t\t'ORDER BY finished_at DESC';\n\t\t\tconst rows = db.prepare(sql).all(...params);\n\t\t\tconst traces = Array.isArray(rows)\n\t\t\t\t? rows\n\t\t\t\t\t\t.filter(isSQLiteSearchTraceRow)\n\t\t\t\t\t\t.map(mapSQLiteSearchTraceRow)\n\t\t\t\t: [];\n\t\t\tconst filtered = input?.tag\n\t\t\t\t? traces.filter((trace) =>\n\t\t\t\t\t\t(trace.tags ?? []).includes(input.tag as string)\n\t\t\t\t\t)\n\t\t\t\t: traces;\n\n\t\t\treturn normalizeTraceSummaryRuns(filtered).slice(\n\t\t\t\t0,\n\t\t\t\tinput?.limit ?? DEFAULT_HISTORY_LIMIT\n\t\t\t);\n\t\t},\n\t\tsaveTrace(trace) {\n\t\t\tinsert.run(\n\t\t\t\ttrace.id,\n\t\t\t\ttrace.query,\n\t\t\t\ttrace.label,\n\t\t\t\ttrace.groupKey ?? null,\n\t\t\t\tJSON.stringify(trace.tags ?? []),\n\t\t\t\ttrace.startedAt,\n\t\t\t\ttrace.finishedAt,\n\t\t\t\ttrace.elapsedMs,\n\t\t\t\tJSON.stringify(trace.trace),\n\t\t\t\tJSON.stringify(trace.summary),\n\t\t\t\tJSON.stringify(trace.results),\n\t\t\t\ttrace.metadata === undefined\n\t\t\t\t\t? null\n\t\t\t\t\t: JSON.stringify(trace.metadata)\n\t\t\t);\n\t\t},\n\t\tpruneTraces(input) {\n\t\t\tconst rows = db\n\t\t\t\t.prepare(`${listBase} ORDER BY finished_at DESC`)\n\t\t\t\t.all();\n\t\t\tconst traces = Array.isArray(rows)\n\t\t\t\t? rows\n\t\t\t\t\t\t.filter(isSQLiteSearchTraceRow)\n\t\t\t\t\t\t.map(mapSQLiteSearchTraceRow)\n\t\t\t\t: [];\n\t\t\tconst pruned = applyRAGSearchTracePrunePolicy({\n\t\t\t\tinput,\n\t\t\t\ttraces\n\t\t\t});\n\n\t\t\tfor (const trace of pruned.removed) {\n\t\t\t\tremove.run(trace.id);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tkeptCount: pruned.keptCount,\n\t\t\t\tremovedCount: pruned.removedCount\n\t\t\t};\n\t\t}\n\t};\n};\n\nexport const createRAGFileAnswerGroundingEvaluationHistoryStore = (\n\tpath: string\n): RAGAnswerGroundingEvaluationHistoryStore => ({\n\tasync listRuns(input) {\n\t\ttry {\n\t\t\tconst raw = await readFile(path, 'utf8');\n\t\t\tconst data = JSON.parse(raw) as {\n\t\t\t\truns?: RAGAnswerGroundingEvaluationRun[];\n\t\t\t};\n\t\t\tconst runs = Array.isArray(data.runs) ? data.runs : [];\n\t\t\tconst filtered = input?.suiteId\n\t\t\t\t? runs.filter((run) => run.suiteId === input.suiteId)\n\t\t\t\t: runs;\n\n\t\t\treturn filtered\n\t\t\t\t.sort(toGroundingHistorySortOrder)\n\t\t\t\t.slice(0, input?.limit ?? DEFAULT_HISTORY_LIMIT);\n\t\t} catch (error) {\n\t\t\tif (\n\t\t\t\terror &&\n\t\t\t\ttypeof error === 'object' &&\n\t\t\t\t'code' in error &&\n\t\t\t\terror.code === 'ENOENT'\n\t\t\t) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\tthrow error;\n\t\t}\n\t},\n\tasync saveRun(run) {\n\t\tlet runs: RAGAnswerGroundingEvaluationRun[] = [];\n\t\ttry {\n\t\t\tconst raw = await readFile(path, 'utf8');\n\t\t\tconst data = JSON.parse(raw) as {\n\t\t\t\truns?: RAGAnswerGroundingEvaluationRun[];\n\t\t\t};\n\t\t\truns = Array.isArray(data.runs) ? data.runs : [];\n\t\t} catch (error) {\n\t\t\tif (\n\t\t\t\t!error ||\n\t\t\t\ttypeof error !== 'object' ||\n\t\t\t\t!('code' in error) ||\n\t\t\t\terror.code !== 'ENOENT'\n\t\t\t) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tconst nextRuns = normalizeGroundingHistoryRuns([\n\t\t\trun,\n\t\t\t...runs.filter((entry) => entry.id !== run.id)\n\t\t]);\n\t\tawait mkdir(dirname(path), { recursive: true });\n\t\tawait writeFile(\n\t\t\tpath,\n\t\t\tJSON.stringify(\n\t\t\t\t{\n\t\t\t\t\truns: nextRuns\n\t\t\t\t},\n\t\t\t\tnull,\n\t\t\t\t2\n\t\t\t)\n\t\t);\n\t}\n});\n\nexport const createRAGFileAnswerGroundingCaseDifficultyHistoryStore = (\n\tpath: string\n): RAGAnswerGroundingCaseDifficultyHistoryStore => ({\n\tasync listRuns(input) {\n\t\ttry {\n\t\t\tconst raw = await readFile(path, 'utf8');\n\t\t\tconst data = JSON.parse(raw) as {\n\t\t\t\truns?: RAGAnswerGroundingCaseDifficultyRun[];\n\t\t\t};\n\t\t\tconst runs = Array.isArray(data.runs) ? data.runs : [];\n\t\t\tconst filtered = input?.suiteId\n\t\t\t\t? runs.filter((run) => run.suiteId === input.suiteId)\n\t\t\t\t: runs;\n\n\t\t\treturn normalizeGroundingDifficultyHistoryRuns(filtered).slice(\n\t\t\t\t0,\n\t\t\t\tinput?.limit ?? DEFAULT_HISTORY_LIMIT\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tif (\n\t\t\t\terror &&\n\t\t\t\ttypeof error === 'object' &&\n\t\t\t\t'code' in error &&\n\t\t\t\terror.code === 'ENOENT'\n\t\t\t) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\tthrow error;\n\t\t}\n\t},\n\tasync saveRun(run) {\n\t\tlet runs: RAGAnswerGroundingCaseDifficultyRun[] = [];\n\t\ttry {\n\t\t\tconst raw = await readFile(path, 'utf8');\n\t\t\tconst data = JSON.parse(raw) as {\n\t\t\t\truns?: RAGAnswerGroundingCaseDifficultyRun[];\n\t\t\t};\n\t\t\truns = Array.isArray(data.runs) ? data.runs : [];\n\t\t} catch (error) {\n\t\t\tif (\n\t\t\t\t!error ||\n\t\t\t\ttypeof error !== 'object' ||\n\t\t\t\t!('code' in error) ||\n\t\t\t\terror.code !== 'ENOENT'\n\t\t\t) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tconst nextRuns = normalizeGroundingDifficultyHistoryRuns([\n\t\t\trun,\n\t\t\t...runs.filter((entry) => entry.id !== run.id)\n\t\t]);\n\t\tawait mkdir(dirname(path), { recursive: true });\n\t\tawait writeFile(\n\t\t\tpath,\n\t\t\tJSON.stringify(\n\t\t\t\t{\n\t\t\t\t\truns: nextRuns\n\t\t\t\t},\n\t\t\t\tnull,\n\t\t\t\t2\n\t\t\t)\n\t\t);\n\t}\n});\n\nexport const loadRAGEvaluationHistory = async ({\n\tstore,\n\tsuite,\n\tlimit = DEFAULT_HISTORY_LIMIT\n}: {\n\tstore: RAGEvaluationHistoryStore;\n\tsuite: RAGEvaluationSuite;\n\tlimit?: number;\n}): Promise<RAGEvaluationHistory> => {\n\tconst runs = normalizeHistoryRuns(\n\t\tawait Promise.resolve(store.listRuns({ limit, suiteId: suite.id }))\n\t);\n\tconst latestRun = runs[0];\n\tconst previousRun = runs[1];\n\n\treturn {\n\t\tcaseTraceSnapshots: buildEvaluationCaseTraceSnapshots({\n\t\t\tcurrent: latestRun,\n\t\t\tprevious: previousRun\n\t\t}),\n\t\tretrievalTraceTrend: buildRAGRetrievalTraceHistoryTrend({\n\t\t\truns\n\t\t}),\n\t\tdiff:\n\t\t\tlatestRun && previousRun\n\t\t\t\t? buildRAGEvaluationRunDiff({\n\t\t\t\t\t\tcurrent: latestRun,\n\t\t\t\t\t\tprevious: previousRun\n\t\t\t\t\t})\n\t\t\t\t: undefined,\n\t\tlatestRun,\n\t\tleaderboard: buildRAGEvaluationLeaderboard(runs),\n\t\tpreviousRun,\n\t\truns,\n\t\tsuiteId: suite.id,\n\t\tsuiteLabel: suite.label ?? suite.id\n\t};\n};\n\nexport const loadRAGSearchTraceHistory = async ({\n\tstore,\n\tquery,\n\tgroupKey,\n\ttag,\n\tlimit = DEFAULT_HISTORY_LIMIT\n}: {\n\tstore: RAGSearchTraceStore;\n\tquery?: string;\n\tgroupKey?: string;\n\ttag?: string;\n\tlimit?: number;\n}): Promise<RAGSearchTraceHistory> => {\n\tconst traces = normalizeTraceSummaryRuns(\n\t\tawait Promise.resolve(store.listTraces({ groupKey, limit, query, tag }))\n\t);\n\tconst latestTrace = traces[0];\n\tconst previousTrace = traces[1];\n\n\treturn {\n\t\tdiff:\n\t\t\tlatestTrace && previousTrace\n\t\t\t\t? buildRAGSearchTraceDiff({\n\t\t\t\t\t\tcurrent: latestTrace,\n\t\t\t\t\t\tprevious: previousTrace\n\t\t\t\t\t})\n\t\t\t\t: undefined,\n\t\tlatestTrace,\n\t\tpreviousTrace,\n\t\tgroupKey,\n\t\tquery,\n\t\ttag,\n\t\tretrievalTraceTrend: buildRAGRetrievalTraceHistoryTrend({\n\t\t\truns: traces.map((trace) => ({\n\t\t\t\tfinishedAt: trace.finishedAt,\n\t\t\t\tid: trace.id,\n\t\t\t\tlabel: trace.label,\n\t\t\t\ttraceSummary: trace.summary\n\t\t\t}))\n\t\t}),\n\t\ttraces\n\t};\n};\n\nexport const loadRAGSearchTraceGroupHistory = async ({\n\tstore,\n\ttag,\n\tlimit = DEFAULT_HISTORY_LIMIT\n}: {\n\tstore: RAGSearchTraceStore;\n\ttag?: string;\n\tlimit?: number;\n}): Promise<RAGSearchTraceGroupHistory> => {\n\tconst traces = normalizeTraceSummaryRuns(\n\t\tawait Promise.resolve(store.listTraces({ limit, tag }))\n\t);\n\tconst grouped = new Map<string, RAGSearchTraceRecord[]>();\n\n\tfor (const trace of traces) {\n\t\tconst groupKey = trace.groupKey ?? trace.query;\n\t\tconst existing = grouped.get(groupKey);\n\t\tif (existing) {\n\t\t\texisting.push(trace);\n\t\t\tcontinue;\n\t\t}\n\t\tgrouped.set(groupKey, [trace]);\n\t}\n\n\tconst groups = Array.from(grouped.entries())\n\t\t.map(([groupKey, entries]): RAGSearchTraceGroupHistoryEntry => {\n\t\t\tconst normalizedEntries = normalizeTraceSummaryRuns(entries);\n\t\t\tconst latestTrace = normalizedEntries[0];\n\t\t\tconst previousTrace = normalizedEntries[1];\n\n\t\t\treturn {\n\t\t\t\tdiff:\n\t\t\t\t\tlatestTrace && previousTrace\n\t\t\t\t\t\t? buildRAGSearchTraceDiff({\n\t\t\t\t\t\t\t\tcurrent: latestTrace,\n\t\t\t\t\t\t\t\tprevious: previousTrace\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: undefined,\n\t\t\t\tgroupKey,\n\t\t\t\tlatestTrace,\n\t\t\t\tpreviousTrace,\n\t\t\t\tretrievalTraceTrend: buildRAGRetrievalTraceHistoryTrend({\n\t\t\t\t\truns: normalizedEntries.map((trace) => ({\n\t\t\t\t\t\tfinishedAt: trace.finishedAt,\n\t\t\t\t\t\tid: trace.id,\n\t\t\t\t\t\tlabel: trace.label,\n\t\t\t\t\t\ttraceSummary: trace.summary\n\t\t\t\t\t}))\n\t\t\t\t}),\n\t\t\t\ttraceCount: normalizedEntries.length\n\t\t\t};\n\t\t})\n\t\t.sort((left, right) => {\n\t\t\tconst leftFinishedAt = left.latestTrace?.finishedAt ?? 0;\n\t\t\tconst rightFinishedAt = right.latestTrace?.finishedAt ?? 0;\n\t\t\treturn rightFinishedAt - leftFinishedAt;\n\t\t});\n\n\treturn {\n\t\tgroups,\n\t\ttag\n\t};\n};\n\nexport const summarizeRAGSearchTraceStore = async ({\n\tstore,\n\ttag\n}: {\n\tstore: RAGSearchTraceStore;\n\ttag?: string;\n}): Promise<RAGSearchTraceStats> => {\n\tconst traces = normalizeTraceSummaryRuns(\n\t\tawait Promise.resolve(store.listTraces({ tag }))\n\t);\n\n\treturn buildRAGSearchTraceStatsFromTraces(traces);\n};\n\nexport const previewRAGSearchTraceStorePrune = async ({\n\tstore,\n\tinput\n}: {\n\tstore: RAGSearchTraceStore;\n\tinput?: RAGSearchTracePruneInput;\n}): Promise<RAGSearchTracePrunePreview> => {\n\tconst traces = normalizeTraceSummaryRuns(\n\t\tawait Promise.resolve(store.listTraces({ tag: input?.tag }))\n\t);\n\tconst pruned = applyRAGSearchTracePrunePolicy({\n\t\tinput,\n\t\ttraces\n\t});\n\n\treturn {\n\t\tinput,\n\t\tresult: {\n\t\t\tkeptCount: pruned.keptCount,\n\t\t\tremovedCount: pruned.removedCount\n\t\t},\n\t\tstatsAfter: buildRAGSearchTraceStatsFromTraces(pruned.next),\n\t\tstatsBefore: buildRAGSearchTraceStatsFromTraces(traces)\n\t};\n};\n\nexport const loadRAGAnswerGroundingEvaluationHistory = async ({\n\tstore,\n\tsuite,\n\tlimit = DEFAULT_HISTORY_LIMIT\n}: {\n\tstore: RAGAnswerGroundingEvaluationHistoryStore;\n\tsuite: Pick<RAGEvaluationSuite, 'id' | 'label'>;\n\tlimit?: number;\n}): Promise<RAGAnswerGroundingEvaluationHistory> => {\n\tconst runs = normalizeGroundingHistoryRuns(\n\t\tawait Promise.resolve(\n\t\t\tstore.listRuns({\n\t\t\t\tlimit,\n\t\t\t\tsuiteId: suite.id\n\t\t\t})\n\t\t)\n\t);\n\tconst latestRun = runs[0];\n\tconst previousRun = runs[1];\n\n\treturn {\n\t\tcaseSnapshots: buildGroundingCaseSnapshots({\n\t\t\tcurrent: latestRun,\n\t\t\tprevious: previousRun\n\t\t}),\n\t\tdiff:\n\t\t\tlatestRun && previousRun\n\t\t\t\t? buildRAGAnswerGroundingEvaluationRunDiff({\n\t\t\t\t\t\tcurrent: latestRun,\n\t\t\t\t\t\tprevious: previousRun\n\t\t\t\t\t})\n\t\t\t\t: undefined,\n\t\tlatestRun,\n\t\tleaderboard: buildRAGAnswerGroundingEvaluationLeaderboard(runs),\n\t\tpreviousRun,\n\t\truns,\n\t\tsuiteId: suite.id,\n\t\tsuiteLabel: suite.label ?? suite.id\n\t};\n};\n\nexport const loadRAGAnswerGroundingCaseDifficultyHistory = async ({\n\tstore,\n\tsuite,\n\tlimit = DEFAULT_HISTORY_LIMIT\n}: {\n\tstore: RAGAnswerGroundingCaseDifficultyHistoryStore;\n\tsuite: Pick<RAGEvaluationSuite, 'id' | 'label'>;\n\tlimit?: number;\n}): Promise<RAGAnswerGroundingCaseDifficultyHistory> => {\n\tconst runs = normalizeGroundingDifficultyHistoryRuns(\n\t\tawait Promise.resolve(\n\t\t\tstore.listRuns({\n\t\t\t\tlimit,\n\t\t\t\tsuiteId: suite.id\n\t\t\t})\n\t\t)\n\t);\n\tconst latestRun = runs[0];\n\tconst previousRun = runs[1];\n\n\treturn {\n\t\tdiff:\n\t\t\tlatestRun && previousRun\n\t\t\t\t? buildRAGAnswerGroundingCaseDifficultyRunDiff({\n\t\t\t\t\t\tcurrent: latestRun,\n\t\t\t\t\t\tprevious: previousRun\n\t\t\t\t\t})\n\t\t\t\t: undefined,\n\t\tlatestRun,\n\t\tpreviousRun,\n\t\truns,\n\t\tsuiteId: suite.id,\n\t\tsuiteLabel: suite.label ?? suite.id,\n\t\ttrends: buildRAGAnswerGroundingCaseDifficultyTrends({ runs })\n\t};\n};\n\nexport const persistRAGEvaluationSuiteRun = async ({\n\tstore,\n\trun\n}: {\n\tstore: RAGEvaluationHistoryStore;\n\trun: RAGEvaluationSuiteRun;\n}) => {\n\tawait Promise.resolve(store.saveRun(run));\n\treturn run;\n};\n\nexport const persistRAGAnswerGroundingEvaluationRun = async ({\n\tstore,\n\trun\n}: {\n\tstore: RAGAnswerGroundingEvaluationHistoryStore;\n\trun: RAGAnswerGroundingEvaluationRun;\n}) => {\n\tawait Promise.resolve(store.saveRun(run));\n\treturn run;\n};\n\nexport const persistRAGAnswerGroundingCaseDifficultyRun = async ({\n\tstore,\n\trun\n}: {\n\tstore: RAGAnswerGroundingCaseDifficultyHistoryStore;\n\trun: RAGAnswerGroundingCaseDifficultyRun;\n}) => {\n\tawait Promise.resolve(store.saveRun(run));\n\treturn run;\n};\n\nexport const persistRAGSearchTraceRecord = async ({\n\tstore,\n\trecord\n}: {\n\tstore: RAGSearchTraceStore;\n\trecord: RAGSearchTraceRecord;\n}) => {\n\tawait Promise.resolve(store.saveTrace(record));\n\treturn record;\n};\n\nexport const pruneRAGSearchTraceStore = async ({\n\tstore,\n\tinput\n}: {\n\tstore: RAGSearchTraceStore;\n\tinput?: RAGSearchTracePruneInput;\n}): Promise<RAGSearchTracePruneResult> =>\n\tPromise.resolve(store.pruneTraces(input));\n\nexport const persistRAGSearchTracePruneRun = async ({\n\tstore,\n\trun\n}: {\n\tstore: RAGSearchTracePruneHistoryStore;\n\trun: RAGSearchTracePruneRun;\n}) => {\n\tawait Promise.resolve(store.saveRun(run));\n\treturn run;\n};\n\nexport const persistRAGRetrievalComparisonRun = async ({\n\tstore,\n\trun\n}: {\n\tstore: RAGRetrievalComparisonHistoryStore;\n\trun: RAGRetrievalComparisonRun;\n}) => {\n\tawait Promise.resolve(store.saveRun(run));\n\treturn run;\n};\n\nexport const buildRAGRetrievalComparisonDecisionSummary = ({\n\tcomparison,\n\tbaselineRetrievalId,\n\tcandidateRetrievalId,\n\tpolicy\n}: {\n\tcomparison: RAGRetrievalComparison;\n\tbaselineRetrievalId?: string;\n\tcandidateRetrievalId?: string;\n\tpolicy?: RAGRetrievalBaselineGatePolicy;\n}): RAGRetrievalComparisonDecisionSummary | undefined => {\n\tconst baselineEntry =\n\t\tfindRetrievalComparisonEntry(comparison, baselineRetrievalId) ??\n\t\tcomparison.entries[0];\n\tconst candidateEntry =\n\t\tfindRetrievalComparisonEntry(comparison, candidateRetrievalId) ??\n\t\tcomparison.entries.find(\n\t\t\t(entry) => entry.retrievalId !== baselineEntry?.retrievalId\n\t\t) ??\n\t\tcomparison.entries[1];\n\n\tif (!baselineEntry && !candidateEntry) {\n\t\treturn undefined;\n\t}\n\n\tconst delta =\n\t\tbaselineEntry && candidateEntry\n\t\t\t? {\n\t\t\t\t\taverageF1Delta:\n\t\t\t\t\t\tcandidateEntry.response.summary.averageF1 -\n\t\t\t\t\t\tbaselineEntry.response.summary.averageF1,\n\t\t\t\t\telapsedMsDelta:\n\t\t\t\t\t\tcandidateEntry.response.elapsedMs -\n\t\t\t\t\t\tbaselineEntry.response.elapsedMs,\n\t\t\t\t\tpassingRateDelta:\n\t\t\t\t\t\tcandidateEntry.response.passingRate -\n\t\t\t\t\t\tbaselineEntry.response.passingRate\n\t\t\t\t}\n\t\t\t: undefined;\n\n\treturn {\n\t\tbaseline: baselineEntry\n\t\t\t? {\n\t\t\t\t\taverageF1: baselineEntry.response.summary.averageF1,\n\t\t\t\t\telapsedMs: baselineEntry.response.elapsedMs,\n\t\t\t\t\tlabel: baselineEntry.label,\n\t\t\t\t\tpassingRate: baselineEntry.response.passingRate,\n\t\t\t\t\tretrievalId: baselineEntry.retrievalId\n\t\t\t\t}\n\t\t\t: undefined,\n\t\tbaselineRetrievalId: baselineEntry?.retrievalId,\n\t\tcandidate: candidateEntry\n\t\t\t? {\n\t\t\t\t\taverageF1: candidateEntry.response.summary.averageF1,\n\t\t\t\t\telapsedMs: candidateEntry.response.elapsedMs,\n\t\t\t\t\tlabel: candidateEntry.label,\n\t\t\t\t\tpassingRate: candidateEntry.response.passingRate,\n\t\t\t\t\tretrievalId: candidateEntry.retrievalId\n\t\t\t\t}\n\t\t\t: undefined,\n\t\tcandidateRetrievalId: candidateEntry?.retrievalId,\n\t\tdelta,\n\t\tfastest: comparison.summary.fastest,\n\t\tgate: evaluateRetrievalComparisonGate({ delta, policy }),\n\t\twinnerByAverageF1: comparison.summary.bestByAverageF1,\n\t\twinnerByPassingRate: comparison.summary.bestByPassingRate\n\t};\n};\n\nexport const loadRAGSearchTracePruneHistory = async ({\n\tstore,\n\tlimit,\n\ttrigger\n}: {\n\tstore: RAGSearchTracePruneHistoryStore;\n\tlimit?: number;\n\ttrigger?: RAGSearchTracePruneRun['trigger'];\n}) =>\n\tnormalizeSearchTracePruneRuns(\n\t\tawait Promise.resolve(store.listRuns({ limit, trigger }))\n\t);\n\nexport const loadRAGRetrievalComparisonHistory = async ({\n\tstore,\n\tlimit,\n\tsuiteId,\n\tlabel,\n\twinnerId,\n\tgroupKey,\n\ttag\n}: {\n\tstore: RAGRetrievalComparisonHistoryStore;\n\tlimit?: number;\n\tsuiteId?: string;\n\tlabel?: string;\n\twinnerId?: string;\n\tgroupKey?: string;\n\ttag?: string;\n}) =>\n\tnormalizeRetrievalComparisonRuns(\n\t\tawait Promise.resolve(\n\t\t\tstore.listRuns({ groupKey, label, limit, suiteId, tag, winnerId })\n\t\t)\n\t);\n\nexport const loadRAGRetrievalBaselines = async ({\n\tstore,\n\tgroupKey,\n\ttag,\n\tlimit,\n\tstatus\n}: {\n\tstore: RAGRetrievalBaselineStore;\n\tgroupKey?: string;\n\ttag?: string;\n\tlimit?: number;\n\tstatus?: RAGRetrievalBaselineRecord['status'];\n}) =>\n\tnormalizeRetrievalBaselineRecords(\n\t\tawait Promise.resolve(\n\t\t\tstore.listBaselines({ groupKey, limit, status, tag })\n\t\t)\n\t);\n\nexport const persistRAGRetrievalBaseline = async ({\n\tstore,\n\trecord\n}: {\n\tstore: RAGRetrievalBaselineStore;\n\trecord: RAGRetrievalBaselineRecord;\n}) => {\n\tawait Promise.resolve(store.saveBaseline(record));\n\treturn record;\n};\n\nexport const loadRAGRetrievalReleaseDecisions = async ({\n\tstore,\n\tgroupKey,\n\tlimit,\n\tkind\n}: {\n\tstore: RAGRetrievalReleaseDecisionStore;\n\tgroupKey?: string;\n\tlimit?: number;\n\tkind?: RAGRetrievalReleaseDecisionRecord['kind'];\n}) =>\n\tnormalizeRetrievalReleaseDecisionRecords(\n\t\tawait Promise.resolve(store.listDecisions({ groupKey, kind, limit }))\n\t);\n\nexport const loadRAGRetrievalLaneHandoffDecisions = async ({\n\tstore,\n\tgroupKey,\n\tlimit,\n\tkind,\n\tsourceRolloutLabel,\n\ttargetRolloutLabel\n}: {\n\tstore: RAGRetrievalLaneHandoffDecisionStore;\n\tgroupKey?: string;\n\tlimit?: number;\n\tkind?: RAGRetrievalLaneHandoffDecisionRecord['kind'];\n\tsourceRolloutLabel?: RAGRetrievalLaneHandoffDecisionRecord['sourceRolloutLabel'];\n\ttargetRolloutLabel?: RAGRetrievalLaneHandoffDecisionRecord['targetRolloutLabel'];\n}) =>\n\tnormalizeRetrievalLaneHandoffDecisionRecords(\n\t\tawait Promise.resolve(\n\t\t\tstore.listDecisions({\n\t\t\t\tgroupKey,\n\t\t\t\tkind,\n\t\t\t\tlimit,\n\t\t\t\tsourceRolloutLabel,\n\t\t\t\ttargetRolloutLabel\n\t\t\t})\n\t\t)\n\t);\n\nexport const loadRAGRetrievalReleaseIncidents = async ({\n\tstore,\n\tgroupKey,\n\tlimit,\n\ttargetRolloutLabel,\n\tstatus,\n\tseverity\n}: {\n\tstore: RAGRetrievalReleaseIncidentStore;\n\tgroupKey?: string;\n\tlimit?: number;\n\ttargetRolloutLabel?: RAGRetrievalReleaseIncidentRecord['targetRolloutLabel'];\n\tstatus?: RAGRetrievalReleaseIncidentRecord['status'];\n\tseverity?: RAGRetrievalReleaseIncidentRecord['severity'];\n}) =>\n\tnormalizeRetrievalReleaseIncidentRecords(\n\t\tawait Promise.resolve(\n\t\t\tstore.listIncidents({\n\t\t\t\tgroupKey,\n\t\t\t\tlimit,\n\t\t\t\tseverity,\n\t\t\t\tstatus,\n\t\t\t\ttargetRolloutLabel\n\t\t\t})\n\t\t)\n\t);\n\nexport const loadRAGRetrievalLaneHandoffIncidents = async ({\n\tstore,\n\tgroupKey,\n\tlimit,\n\ttargetRolloutLabel,\n\tstatus,\n\tseverity\n}: {\n\tstore: RAGRetrievalLaneHandoffIncidentStore;\n\tgroupKey?: string;\n\tlimit?: number;\n\ttargetRolloutLabel?: RAGRetrievalLaneHandoffIncidentRecord['targetRolloutLabel'];\n\tstatus?: RAGRetrievalLaneHandoffIncidentRecord['status'];\n\tseverity?: RAGRetrievalLaneHandoffIncidentRecord['severity'];\n}) =>\n\tnormalizeRetrievalReleaseIncidentRecords(\n\t\t(await Promise.resolve(\n\t\t\tstore.listIncidents({\n\t\t\t\tgroupKey,\n\t\t\t\tlimit,\n\t\t\t\tseverity,\n\t\t\t\tstatus,\n\t\t\t\ttargetRolloutLabel\n\t\t\t})\n\t\t)) as RAGRetrievalReleaseIncidentRecord[]\n\t) as RAGRetrievalLaneHandoffIncidentRecord[];\n\nexport const loadRAGRetrievalLaneHandoffIncidentHistory = async ({\n\tstore,\n\taction,\n\tgroupKey,\n\tincidentId,\n\tlimit,\n\ttargetRolloutLabel\n}: {\n\tstore: RAGRetrievalLaneHandoffIncidentHistoryStore;\n\taction?: RAGRetrievalLaneHandoffIncidentHistoryRecord['action'];\n\tgroupKey?: string;\n\tincidentId?: string;\n\tlimit?: number;\n\ttargetRolloutLabel?: RAGRetrievalLaneHandoffIncidentRecord['targetRolloutLabel'];\n}) =>\n\t(await Promise.resolve(\n\t\tstore.listRecords({\n\t\t\taction,\n\t\t\tgroupKey,\n\t\t\tincidentId,\n\t\t\tlimit,\n\t\t\ttargetRolloutLabel\n\t\t})\n\t)) as RAGRetrievalLaneHandoffIncidentHistoryRecord[];\n\nexport const loadRAGRetrievalIncidentRemediationDecisions = async ({\n\tstore,\n\tgroupKey,\n\tincidentId,\n\tlimit,\n\tremediationKind,\n\tstatus,\n\ttargetRolloutLabel\n}: {\n\tstore: RAGRetrievalIncidentRemediationDecisionStore;\n\tgroupKey?: string;\n\tincidentId?: string;\n\tlimit?: number;\n\tremediationKind?: RAGRetrievalIncidentRemediationDecisionRecord['remediationKind'];\n\tstatus?: RAGRetrievalIncidentRemediationDecisionRecord['status'];\n\ttargetRolloutLabel?: RAGRetrievalIncidentRemediationDecisionRecord['targetRolloutLabel'];\n}) =>\n\tnormalizeRetrievalIncidentRemediationDecisionRecords(\n\t\tawait Promise.resolve(\n\t\t\tstore.listRecords({\n\t\t\t\tgroupKey,\n\t\t\t\tincidentId,\n\t\t\t\tlimit,\n\t\t\t\tremediationKind,\n\t\t\t\tstatus,\n\t\t\t\ttargetRolloutLabel\n\t\t\t})\n\t\t)\n\t);\n\nexport const loadRAGRetrievalIncidentRemediationExecutionHistory = async ({\n\tstore,\n\tactionKind,\n\tblockedByGuardrail,\n\tcode,\n\tgroupKey,\n\tidempotentReplay,\n\tincidentId,\n\tlimit,\n\ttargetRolloutLabel\n}: {\n\tstore: RAGRetrievalIncidentRemediationExecutionHistoryStore;\n\tactionKind?: RAGRemediationAction['kind'];\n\tblockedByGuardrail?: boolean;\n\tcode?: RAGRetrievalIncidentRemediationExecutionHistoryRecord['code'];\n\tgroupKey?: string;\n\tidempotentReplay?: boolean;\n\tincidentId?: string;\n\tlimit?: number;\n\ttargetRolloutLabel?: RAGRetrievalIncidentRemediationExecutionHistoryRecord['targetRolloutLabel'];\n}) =>\n\tnormalizeRetrievalIncidentRemediationExecutionHistoryRecords(\n\t\tawait Promise.resolve(\n\t\t\tstore.listRecords({\n\t\t\t\tactionKind,\n\t\t\t\tblockedByGuardrail,\n\t\t\t\tcode,\n\t\t\t\tgroupKey,\n\t\t\t\tidempotentReplay,\n\t\t\t\tincidentId,\n\t\t\t\tlimit,\n\t\t\t\ttargetRolloutLabel\n\t\t\t})\n\t\t)\n\t);\n\nexport const loadRAGRetrievalLaneHandoffAutoCompletePolicyHistory = async ({\n\tstore,\n\tgroupKey,\n\tlimit,\n\ttargetRolloutLabel\n}: {\n\tstore: RAGRetrievalLaneHandoffAutoCompletePolicyHistoryStore;\n\tgroupKey?: string;\n\tlimit?: number;\n\ttargetRolloutLabel?: RAGRetrievalLaneHandoffAutoCompletePolicyHistoryRecord['targetRolloutLabel'];\n}) =>\n\t(await Promise.resolve(\n\t\tstore.listRecords({\n\t\t\tgroupKey,\n\t\t\tlimit,\n\t\t\ttargetRolloutLabel\n\t\t})\n\t)) as RAGRetrievalLaneHandoffAutoCompletePolicyHistoryRecord[];\n\nexport const loadRAGRetrievalReleaseLanePolicyHistory = async ({\n\tstore,\n\tgroupKey,\n\tlimit,\n\trolloutLabel,\n\tscope\n}: {\n\tstore: RAGRetrievalReleaseLanePolicyHistoryStore;\n\tgroupKey?: string;\n\tlimit?: number;\n\trolloutLabel?: RAGRetrievalReleaseLanePolicyHistoryRecord['rolloutLabel'];\n\tscope?: RAGRetrievalReleaseLanePolicyHistoryRecord['scope'];\n}) =>\n\t(await Promise.resolve(\n\t\tstore.listRecords({\n\t\t\tgroupKey,\n\t\t\tlimit,\n\t\t\trolloutLabel,\n\t\t\tscope\n\t\t})\n\t)) as RAGRetrievalReleaseLanePolicyHistoryRecord[];\n\nexport const loadRAGRetrievalBaselineGatePolicyHistory = async ({\n\tstore,\n\tgroupKey,\n\tlimit,\n\trolloutLabel,\n\tscope\n}: {\n\tstore: RAGRetrievalBaselineGatePolicyHistoryStore;\n\tgroupKey?: string;\n\tlimit?: number;\n\trolloutLabel?: RAGRetrievalBaselineGatePolicyHistoryRecord['rolloutLabel'];\n\tscope?: RAGRetrievalBaselineGatePolicyHistoryRecord['scope'];\n}) =>\n\t(await Promise.resolve(\n\t\tstore.listRecords({\n\t\t\tgroupKey,\n\t\t\tlimit,\n\t\t\trolloutLabel,\n\t\t\tscope\n\t\t})\n\t)) as RAGRetrievalBaselineGatePolicyHistoryRecord[];\n\nexport const loadRAGRetrievalReleaseLaneEscalationPolicyHistory = async ({\n\tstore,\n\tgroupKey,\n\tlimit,\n\ttargetRolloutLabel\n}: {\n\tstore: RAGRetrievalReleaseLaneEscalationPolicyHistoryStore;\n\tgroupKey?: string;\n\tlimit?: number;\n\ttargetRolloutLabel?: RAGRetrievalReleaseLaneEscalationPolicyHistoryRecord['targetRolloutLabel'];\n}) =>\n\t(await Promise.resolve(\n\t\tstore.listRecords({\n\t\t\tgroupKey,\n\t\t\tlimit,\n\t\t\ttargetRolloutLabel\n\t\t})\n\t)) as RAGRetrievalReleaseLaneEscalationPolicyHistoryRecord[];\n\nexport const persistRAGRetrievalReleaseDecision = async ({\n\tstore,\n\trecord\n}: {\n\tstore: RAGRetrievalReleaseDecisionStore;\n\trecord: RAGRetrievalReleaseDecisionRecord;\n}) => {\n\tawait Promise.resolve(store.saveDecision(record));\n\treturn record;\n};\n\nexport const persistRAGRetrievalLaneHandoffDecision = async ({\n\tstore,\n\trecord\n}: {\n\tstore: RAGRetrievalLaneHandoffDecisionStore;\n\trecord: RAGRetrievalLaneHandoffDecisionRecord;\n}) => {\n\tawait Promise.resolve(store.saveDecision(record));\n\treturn record;\n};\n\nexport const persistRAGRetrievalReleaseIncident = async ({\n\tstore,\n\trecord\n}: {\n\tstore: RAGRetrievalReleaseIncidentStore;\n\trecord: RAGRetrievalReleaseIncidentRecord;\n}) => {\n\tawait Promise.resolve(store.saveIncident(record));\n\treturn record;\n};\n\nexport const persistRAGRetrievalLaneHandoffIncident = async ({\n\tstore,\n\trecord\n}: {\n\tstore: RAGRetrievalLaneHandoffIncidentStore;\n\trecord: RAGRetrievalLaneHandoffIncidentRecord;\n}) => {\n\tawait Promise.resolve(store.saveIncident(record));\n\treturn record;\n};\n\nexport const persistRAGRetrievalIncidentRemediationDecision = async ({\n\tstore,\n\trecord\n}: {\n\tstore: RAGRetrievalIncidentRemediationDecisionStore;\n\trecord: RAGRetrievalIncidentRemediationDecisionRecord;\n}) => {\n\tawait Promise.resolve(store.saveRecord(record));\n\treturn record;\n};\n\nexport const persistRAGRetrievalIncidentRemediationExecutionHistory = async ({\n\tstore,\n\trecord\n}: {\n\tstore: RAGRetrievalIncidentRemediationExecutionHistoryStore;\n\trecord: RAGRetrievalIncidentRemediationExecutionHistoryRecord;\n}) => {\n\tawait Promise.resolve(store.saveRecord(record));\n\treturn record;\n};\n\nexport const persistRAGRetrievalLaneHandoffIncidentHistory = async ({\n\tstore,\n\trecord\n}: {\n\tstore: RAGRetrievalLaneHandoffIncidentHistoryStore;\n\trecord: RAGRetrievalLaneHandoffIncidentHistoryRecord;\n}) => {\n\tawait Promise.resolve(store.saveRecord(record));\n\treturn record;\n};\n\nexport const persistRAGRetrievalLaneHandoffAutoCompletePolicyHistory = async ({\n\tstore,\n\trecord\n}: {\n\tstore: RAGRetrievalLaneHandoffAutoCompletePolicyHistoryStore;\n\trecord: RAGRetrievalLaneHandoffAutoCompletePolicyHistoryRecord;\n}) => {\n\tawait Promise.resolve(store.saveRecord(record));\n\treturn record;\n};\n\nexport const persistRAGRetrievalReleaseLanePolicyHistory = async ({\n\tstore,\n\trecord\n}: {\n\tstore: RAGRetrievalReleaseLanePolicyHistoryStore;\n\trecord: RAGRetrievalReleaseLanePolicyHistoryRecord;\n}) => {\n\tawait Promise.resolve(store.saveRecord(record));\n\treturn record;\n};\n\nexport const persistRAGRetrievalBaselineGatePolicyHistory = async ({\n\tstore,\n\trecord\n}: {\n\tstore: RAGRetrievalBaselineGatePolicyHistoryStore;\n\trecord: RAGRetrievalBaselineGatePolicyHistoryRecord;\n}) => {\n\tawait Promise.resolve(store.saveRecord(record));\n\treturn record;\n};\n\nexport const persistRAGRetrievalReleaseLaneEscalationPolicyHistory = async ({\n\tstore,\n\trecord\n}: {\n\tstore: RAGRetrievalReleaseLaneEscalationPolicyHistoryStore;\n\trecord: RAGRetrievalReleaseLaneEscalationPolicyHistoryRecord;\n}) => {\n\tawait Promise.resolve(store.saveRecord(record));\n\treturn record;\n};\n\nexport const buildRAGEvaluationResponse = (\n\tcases: RAGEvaluationCaseResult[]\n): RAGEvaluationResponse => {\n\tconst totalCases = cases.length;\n\tconst corpusKeys = [\n\t\t...new Set(cases.flatMap((entry) => entry.corpusKey ?? []))\n\t];\n\tconst passedCases = cases.filter((entry) => entry.status === 'pass').length;\n\tconst partialCases = cases.filter(\n\t\t(entry) => entry.status === 'partial'\n\t).length;\n\tconst failedCases = cases.filter((entry) => entry.status === 'fail').length;\n\n\treturn {\n\t\tcases,\n\t\t...(corpusKeys.length > 0 ? { corpusKeys } : {}),\n\t\telapsedMs: cases.reduce((sum, result) => sum + result.elapsedMs, 0),\n\t\tok: true,\n\t\tpassingRate: totalCases > 0 ? (passedCases / totalCases) * 100 : 0,\n\t\tsummary: {\n\t\t\taverageF1:\n\t\t\t\tcases.reduce((sum, result) => sum + result.f1, 0) /\n\t\t\t\t(totalCases || 1),\n\t\t\taverageLatencyMs:\n\t\t\t\tcases.reduce((sum, result) => sum + result.elapsedMs, 0) /\n\t\t\t\t(totalCases || 1),\n\t\t\taveragePrecision:\n\t\t\t\tcases.reduce((sum, result) => sum + result.precision, 0) /\n\t\t\t\t(totalCases || 1),\n\t\t\taverageRecall:\n\t\t\t\tcases.reduce((sum, result) => sum + result.recall, 0) /\n\t\t\t\t(totalCases || 1),\n\t\t\tfailedCases,\n\t\t\tpartialCases,\n\t\t\tpassedCases,\n\t\t\ttotalCases\n\t\t},\n\t\ttotalCases\n\t};\n};\n\nexport const evaluateRAGAnswerGroundingCase = ({\n\tcaseIndex,\n\tcaseInput\n}: {\n\tcaseIndex: number;\n\tcaseInput: RAGAnswerGroundingEvaluationCase;\n}): RAGAnswerGroundingEvaluationCaseResult => {\n\tconst mode = resolveEvaluationMode(caseInput);\n\tconst expectedIds = normalizeExpectedIds(\n\t\tmode === 'chunkId'\n\t\t\t? (caseInput.expectedChunkIds ?? [])\n\t\t\t: mode === 'source'\n\t\t\t\t? (caseInput.expectedSources ?? [])\n\t\t\t\t: (caseInput.expectedDocumentIds ?? [])\n\t);\n\tconst groundedAnswer = buildRAGGroundedAnswer(\n\t\tcaseInput.answer,\n\t\tcaseInput.sources\n\t);\n\tconst citedReferences = groundedAnswer.parts.flatMap((part) =>\n\t\tpart.type === 'citation' ? part.references : []\n\t);\n\tconst citedIds = normalizeExpectedIds(\n\t\tcitedReferences.map((reference) => extractExpectedId(reference, mode))\n\t);\n\tconst expectedSet = new Set(expectedIds);\n\tconst citedSet = new Set(citedIds);\n\tconst matchedIds = normalizeExpectedIds(\n\t\t[...expectedSet].filter((id) => citedSet.has(id))\n\t);\n\tconst missingIds = normalizeExpectedIds(\n\t\t[...expectedSet].filter((id) => !citedSet.has(id))\n\t);\n\tconst extraIds = normalizeExpectedIds(\n\t\t[...citedSet].filter((id) => !expectedSet.has(id))\n\t);\n\tconst matchedCount = matchedIds.length;\n\tconst expectedCount = expectedIds.length;\n\tconst citedCount = citedIds.length;\n\tconst precision = citedCount > 0 ? matchedCount / citedCount : 0;\n\tconst recall = expectedCount > 0 ? matchedCount / expectedCount : 0;\n\tconst citationF1 =\n\t\tprecision + recall > 0\n\t\t\t? (2 * precision * recall) / (precision + recall)\n\t\t\t: 0;\n\tconst citationCount = groundedAnswer.parts.filter(\n\t\t(part) => part.type === 'citation'\n\t).length;\n\tconst unresolvedCitationCount = new Set(\n\t\tgroundedAnswer.ungroundedReferenceNumbers\n\t).size;\n\tconst resolvedCitationCount = citedReferences.length;\n\tconst resolvedCitationRate =\n\t\tcitationCount > 0\n\t\t\t? Math.min(1, resolvedCitationCount / citationCount)\n\t\t\t: 0;\n\n\treturn {\n\t\tanswer: caseInput.answer,\n\t\tcaseId: caseInput.id ?? `case-${caseIndex + 1}`,\n\t\tcitationCount,\n\t\tcitationF1,\n\t\tcitationPrecision: precision,\n\t\tcitationRecall: recall,\n\t\tcitedIds,\n\t\tcoverage: groundedAnswer.coverage,\n\t\texpectedCount,\n\t\texpectedIds,\n\t\textraIds,\n\t\tgroundedAnswer,\n\t\thasCitations: groundedAnswer.hasCitations,\n\t\tlabel: caseInput.label,\n\t\tmatchedCount,\n\t\tmatchedIds,\n\t\tmetadata: caseInput.metadata,\n\t\tmissingIds,\n\t\tmode,\n\t\tquery: caseInput.query,\n\t\treferenceCount: groundedAnswer.references.length,\n\t\tresolvedCitationCount,\n\t\tresolvedCitationRate,\n\t\tstatus: buildAnswerGroundingStatus({\n\t\t\tcoverage: groundedAnswer.coverage,\n\t\t\texpectedCount,\n\t\t\tmatchedCount,\n\t\t\tresolvedCitationCount,\n\t\t\tunresolvedCitationCount\n\t\t}),\n\t\tunresolvedCitationCount\n\t};\n};\n\nexport const buildRAGAnswerGroundingEvaluationResponse = (\n\tcases: RAGAnswerGroundingEvaluationCaseResult[]\n): RAGAnswerGroundingEvaluationResponse => {\n\tconst totalCases = cases.length;\n\tconst passedCases = cases.filter((entry) => entry.status === 'pass').length;\n\tconst partialCases = cases.filter(\n\t\t(entry) => entry.status === 'partial'\n\t).length;\n\tconst failedCases = cases.filter((entry) => entry.status === 'fail').length;\n\tconst groundedCases = cases.filter(\n\t\t(entry) => entry.coverage === 'grounded'\n\t).length;\n\tconst partiallyGroundedCases = cases.filter(\n\t\t(entry) => entry.coverage === 'partial'\n\t).length;\n\tconst ungroundedCases = cases.filter(\n\t\t(entry) => entry.coverage === 'ungrounded'\n\t).length;\n\n\treturn {\n\t\tcases,\n\t\tok: true,\n\t\tpassingRate: totalCases > 0 ? (passedCases / totalCases) * 100 : 0,\n\t\tsummary: {\n\t\t\taverageCitationF1:\n\t\t\t\tcases.reduce((sum, result) => sum + result.citationF1, 0) /\n\t\t\t\t(totalCases || 1),\n\t\t\taverageCitationPrecision:\n\t\t\t\tcases.reduce(\n\t\t\t\t\t(sum, result) => sum + result.citationPrecision,\n\t\t\t\t\t0\n\t\t\t\t) / (totalCases || 1),\n\t\t\taverageCitationRecall:\n\t\t\t\tcases.reduce((sum, result) => sum + result.citationRecall, 0) /\n\t\t\t\t(totalCases || 1),\n\t\t\taverageResolvedCitationRate:\n\t\t\t\tcases.reduce(\n\t\t\t\t\t(sum, result) => sum + result.resolvedCitationRate,\n\t\t\t\t\t0\n\t\t\t\t) / (totalCases || 1),\n\t\t\tfailedCases,\n\t\t\tgroundedCases,\n\t\t\tpartiallyGroundedCases,\n\t\t\tpassedCases,\n\t\t\tpartialCases,\n\t\t\ttotalCases,\n\t\t\tungroundedCases\n\t\t},\n\t\ttotalCases\n\t};\n};\n\nexport const evaluateRAGAnswerGrounding = (\n\tinput: RAGAnswerGroundingEvaluationInput\n): RAGAnswerGroundingEvaluationResponse =>\n\tbuildRAGAnswerGroundingEvaluationResponse(\n\t\tinput.cases.map((caseInput, caseIndex) =>\n\t\t\tevaluateRAGAnswerGroundingCase({ caseIndex, caseInput })\n\t\t)\n\t);\nexport const compareRAGRerankers = async ({\n\tcollection,\n\tsuite,\n\trerankers,\n\tdefaultTopK = DEFAULT_TOP_K\n}: {\n\tcollection: RAGCollection;\n\tsuite: RAGEvaluationSuite;\n\trerankers: RAGRerankerCandidate[];\n\tdefaultTopK?: number;\n}): Promise<RAGRerankerComparison> => {\n\tconst entries = await Promise.all(\n\t\trerankers.map(async (candidate) => {\n\t\t\tconst evaluated = await evaluateRAGCollectionCases({\n\t\t\t\tcollection,\n\t\t\t\tdefaultTopK,\n\t\t\t\tinput: suite.input,\n\t\t\t\tincludeTrace: true,\n\t\t\t\trerank: candidate.rerank\n\t\t\t});\n\t\t\tconst response = buildRAGEvaluationResponse(\n\t\t\t\tevaluated.map((entry) => entry.caseResult)\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tcaseTraceSnapshots:\n\t\t\t\t\tbuildEvaluationCaseTraceSnapshotsFromEvaluated(evaluated),\n\t\t\t\tlabel: candidate.label ?? candidate.id,\n\t\t\t\tproviderName:\n\t\t\t\t\ttypeof candidate.rerank === 'function'\n\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t: candidate.rerank?.providerName,\n\t\t\t\tresponse,\n\t\t\t\trerankerId: candidate.id,\n\t\t\t\ttraceSummary: summarizeRetrievalTraces(\n\t\t\t\t\tevaluated\n\t\t\t\t\t\t.map((entry) => entry.trace)\n\t\t\t\t\t\t.filter((trace): trace is RAGRetrievalTrace =>\n\t\t\t\t\t\t\tBoolean(trace)\n\t\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t} satisfies RAGRerankerComparisonEntry;\n\t\t})\n\t);\n\n\tconst leaderboard = buildRAGEvaluationLeaderboard(\n\t\tentries.map((entry) => ({\n\t\t\telapsedMs: entry.response.elapsedMs,\n\t\t\tfinishedAt: 0,\n\t\t\tid: entry.rerankerId,\n\t\t\tlabel: entry.label,\n\t\t\tresponse: entry.response,\n\t\t\tstartedAt: 0,\n\t\t\tsuiteId: suite.id,\n\t\t\ttraceSummary: entry.traceSummary\n\t\t}))\n\t);\n\n\treturn {\n\t\tentries,\n\t\tleaderboard,\n\t\tsummary: summarizeRAGRerankerComparison(entries),\n\t\tsuiteId: suite.id,\n\t\tsuiteLabel: suite.label ?? suite.id\n\t};\n};\nconst summarizeEvaluationResponseComparison = <\n\tTEntry extends {\n\t\tresponse: RAGEvaluationResponse;\n\t\t[key: string]: unknown;\n\t}\n>(\n\tentries: TEntry[],\n\tidKey: keyof TEntry\n) => {\n\tif (entries.length === 0) {\n\t\treturn {};\n\t}\n\n\tconst byPassingRate = [...entries].sort((left, right) => {\n\t\tif (right.response.passingRate !== left.response.passingRate) {\n\t\t\treturn right.response.passingRate - left.response.passingRate;\n\t\t}\n\t\tif (\n\t\t\tright.response.summary.averageF1 !== left.response.summary.averageF1\n\t\t) {\n\t\t\treturn (\n\t\t\t\tright.response.summary.averageF1 -\n\t\t\t\tleft.response.summary.averageF1\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\tleft.response.summary.averageLatencyMs -\n\t\t\tright.response.summary.averageLatencyMs\n\t\t);\n\t});\n\tconst byAverageF1 = [...entries].sort(\n\t\t(left, right) =>\n\t\t\tright.response.summary.averageF1 - left.response.summary.averageF1\n\t);\n\tconst byLatency = [...entries].sort(\n\t\t(left, right) =>\n\t\t\tleft.response.summary.averageLatencyMs -\n\t\t\tright.response.summary.averageLatencyMs\n\t);\n\tconst getId = (entry: TEntry) =>\n\t\ttypeof entry[idKey] === 'string' ? (entry[idKey] as string) : undefined;\n\n\treturn {\n\t\tbestByAverageF1: getId(byAverageF1[0] as TEntry),\n\t\tbestByPassingRate: getId(byPassingRate[0] as TEntry),\n\t\tfastest: getId(byLatency[0] as TEntry)\n\t};\n};\nconst resolveRetrievalMode = (\n\tcandidate: RAGRetrievalCandidate\n): RAGHybridRetrievalMode => {\n\tif (!candidate.retrieval) {\n\t\treturn 'vector';\n\t}\n\n\treturn typeof candidate.retrieval === 'string'\n\t\t? candidate.retrieval\n\t\t: (candidate.retrieval.mode ?? 'vector');\n};\nexport const compareRAGRetrievalStrategies = async ({\n\tcollection,\n\tsuite,\n\tretrievals,\n\tdefaultTopK = DEFAULT_TOP_K\n}: {\n\tcollection: RAGCollection;\n\tsuite: RAGEvaluationSuite;\n\tretrievals: RAGRetrievalCandidate[];\n\tdefaultTopK?: number;\n}): Promise<RAGRetrievalComparison> => {\n\tconst entries = await Promise.all(\n\t\tretrievals.map(async (candidate) => {\n\t\t\tconst tracedCollection = {\n\t\t\t\t...collection,\n\t\t\t\tsearch: (input) =>\n\t\t\t\t\tcollection.search({\n\t\t\t\t\t\t...input,\n\t\t\t\t\t\tqueryTransform:\n\t\t\t\t\t\t\tcandidate.queryTransform ?? input.queryTransform,\n\t\t\t\t\t\trerank: candidate.rerank ?? input.rerank,\n\t\t\t\t\t\tretrieval: candidate.retrieval ?? input.retrieval\n\t\t\t\t\t}),\n\t\t\t\tsearchWithTrace: (input) =>\n\t\t\t\t\tcollection.searchWithTrace({\n\t\t\t\t\t\t...input,\n\t\t\t\t\t\tqueryTransform:\n\t\t\t\t\t\t\tcandidate.queryTransform ?? input.queryTransform,\n\t\t\t\t\t\trerank: candidate.rerank ?? input.rerank,\n\t\t\t\t\t\tretrieval: candidate.retrieval ?? input.retrieval\n\t\t\t\t\t})\n\t\t\t} satisfies RAGCollection;\n\t\t\tconst evaluated = await evaluateRAGCollectionCases({\n\t\t\t\tcollection: {\n\t\t\t\t\t...tracedCollection\n\t\t\t\t},\n\t\t\t\tdefaultTopK,\n\t\t\t\tinput: suite.input,\n\t\t\t\tincludeTrace: true,\n\t\t\t\trerank: candidate.rerank\n\t\t\t});\n\t\t\tconst response = buildRAGEvaluationResponse(\n\t\t\t\tevaluated.map((entry) => entry.caseResult)\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tcaseTraceSnapshots:\n\t\t\t\t\tbuildEvaluationCaseTraceSnapshotsFromEvaluated(evaluated),\n\t\t\t\tlabel: candidate.label ?? candidate.id,\n\t\t\t\tresponse,\n\t\t\t\tretrievalId: candidate.id,\n\t\t\t\tretrievalMode: resolveRetrievalMode(candidate),\n\t\t\t\ttraceSummary: summarizeRetrievalTraces(\n\t\t\t\t\tevaluated\n\t\t\t\t\t\t.map((entry) => entry.trace)\n\t\t\t\t\t\t.filter((trace): trace is RAGRetrievalTrace =>\n\t\t\t\t\t\t\tBoolean(trace)\n\t\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t} satisfies RAGRetrievalComparisonEntry;\n\t\t})\n\t);\n\n\tconst leaderboard = buildRAGEvaluationLeaderboard(\n\t\tentries.map((entry) => ({\n\t\t\telapsedMs: entry.response.elapsedMs,\n\t\t\tfinishedAt: 0,\n\t\t\tid: entry.retrievalId,\n\t\t\tlabel: entry.label,\n\t\t\tresponse: entry.response,\n\t\t\tstartedAt: 0,\n\t\t\tsuiteId: suite.id,\n\t\t\ttraceSummary: entry.traceSummary\n\t\t}))\n\t);\n\n\treturn {\n\t\tcorpusKeys: [\n\t\t\t...new Set(\n\t\t\t\tentries.flatMap((entry) => entry.response.corpusKeys ?? [])\n\t\t\t)\n\t\t],\n\t\tentries,\n\t\tleaderboard,\n\t\tsummary: summarizeRAGRetrievalComparison(entries),\n\t\tsuiteId: suite.id,\n\t\tsuiteLabel: suite.label ?? suite.id\n\t};\n};\n\nexport const summarizeRAGRetrievalTraces = (\n\ttraces: RAGRetrievalTrace[]\n): RAGRetrievalTraceComparisonSummary | undefined =>\n\tsummarizeRetrievalTraces(traces);\n\nexport const compareRAGRetrievalTraceSummaries = (\n\tcurrent: RAGRetrievalTraceComparisonSummary,\n\tprevious: RAGRetrievalTraceComparisonSummary\n): RAGRetrievalTraceComparisonSummaryDiff => ({\n\taverageCandidateTopKDelta:\n\t\tcurrent.averageCandidateTopK - previous.averageCandidateTopK,\n\taverageFinalCountDelta:\n\t\tcurrent.averageFinalCount - previous.averageFinalCount,\n\taverageLexicalCountDelta:\n\t\tcurrent.averageLexicalCount - previous.averageLexicalCount,\n\taverageLexicalTopKDelta:\n\t\tcurrent.averageLexicalTopK - previous.averageLexicalTopK,\n\taverageVectorCountDelta:\n\t\tcurrent.averageVectorCount - previous.averageVectorCount,\n\tbalancedCasesDelta: current.balancedCases - previous.balancedCases,\n\tcurrent,\n\tlexicalCasesDelta: current.lexicalCases - previous.lexicalCases,\n\tmodeDelta: buildSummaryListDelta(current.modes, previous.modes),\n\tprevious,\n\troundRobinCasesDelta: current.roundRobinCases - previous.roundRobinCases,\n\tsourceBalanceStrategyDelta: buildSummaryListDelta(\n\t\tcurrent.sourceBalanceStrategies,\n\t\tprevious.sourceBalanceStrategies\n\t),\n\tstageCountsDelta: diffTraceSummaryStageCounts({\n\t\tcurrent: current.stageCounts,\n\t\tprevious: previous.stageCounts\n\t}),\n\ttotalCasesDelta: current.totalCases - previous.totalCases,\n\ttransformedCasesDelta: current.transformedCases - previous.transformedCases,\n\tvectorCasesDelta: current.vectorCases - previous.vectorCases,\n\tvariantCasesDelta: current.variantCases - previous.variantCases\n});\n\nconst buildSearchTraceResultSnapshots = (\n\tresults: Array<{\n\t\tchunkId: string;\n\t\tcorpusKey?: string;\n\t\tscore: number;\n\t\tsource?: string;\n\t\ttitle?: string;\n\t\tmetadata?: Record<string, unknown>;\n\t}>\n): RAGSearchTraceResultSnapshot[] =>\n\tresults.map((result) => ({\n\t\tchunkId: result.chunkId,\n\t\tcorpusKey:\n\t\t\tresult.corpusKey ??\n\t\t\t(typeof result.metadata?.corpusKey === 'string'\n\t\t\t\t? result.metadata.corpusKey\n\t\t\t\t: undefined),\n\t\tdocumentId:\n\t\t\ttypeof result.metadata?.documentId === 'string'\n\t\t\t\t? result.metadata.documentId\n\t\t\t\t: undefined,\n\t\tscore: result.score,\n\t\tsource: result.source,\n\t\ttitle: result.title\n\t}));\n\nexport const buildRAGSearchTraceRecord = (input: {\n\ttrace: RAGRetrievalTrace;\n\tresults?: Array<{\n\t\tchunkId: string;\n\t\tscore: number;\n\t\tsource?: string;\n\t\ttitle?: string;\n\t\tmetadata?: Record<string, unknown>;\n\t}>;\n\tid?: string;\n\tlabel?: string;\n\tgroupKey?: string;\n\ttags?: string[];\n\tstartedAt?: number;\n\tfinishedAt?: number;\n\telapsedMs?: number;\n\tmetadata?: Record<string, unknown>;\n}): RAGSearchTraceRecord => {\n\tconst startedAt = input.startedAt ?? Date.now();\n\tconst finishedAt = input.finishedAt ?? startedAt;\n\tconst elapsedMs = input.elapsedMs ?? Math.max(0, finishedAt - startedAt);\n\tconst summary =\n\t\tsummarizeRetrievalTraces([input.trace]) ??\n\t\tsummarizeRetrievalTraces([\n\t\t\t{\n\t\t\t\t...input.trace,\n\t\t\t\tsteps: [...input.trace.steps]\n\t\t\t}\n\t\t]);\n\n\tif (!summary) {\n\t\tthrow new Error('Failed to summarize retrieval trace');\n\t}\n\n\treturn {\n\t\telapsedMs,\n\t\tfinishedAt,\n\t\tgroupKey: input.groupKey,\n\t\tid: input.id ?? generateId(),\n\t\tlabel: input.label ?? input.trace.query,\n\t\tmetadata: input.metadata,\n\t\tquery: input.trace.query,\n\t\tresults: buildSearchTraceResultSnapshots(input.results ?? []),\n\t\tstartedAt,\n\t\tsummary,\n\t\ttags: normalizeTraceTags(input.tags),\n\t\ttrace: input.trace\n\t};\n};\n\nexport const buildRAGSearchTraceDiff = ({\n\tcurrent,\n\tprevious\n}: {\n\tcurrent: RAGSearchTraceRecord;\n\tprevious?: RAGSearchTraceRecord;\n}): RAGSearchTraceDiff => {\n\tconst currentChunkIds = current.results.map((entry) => entry.chunkId);\n\tconst previousChunkIds =\n\t\tprevious?.results.map((entry) => entry.chunkId) ?? [];\n\tconst previousSet = new Set(previousChunkIds);\n\tconst currentSet = new Set(currentChunkIds);\n\n\treturn {\n\t\taddedChunkIds: currentChunkIds.filter(\n\t\t\t(chunkId) => !previousSet.has(chunkId)\n\t\t),\n\t\tcurrentTraceId: current.id,\n\t\tpreviousTraceId: previous?.id,\n\t\tremovedChunkIds: previousChunkIds.filter(\n\t\t\t(chunkId) => !currentSet.has(chunkId)\n\t\t),\n\t\tretainedChunkIds: currentChunkIds.filter((chunkId) =>\n\t\t\tpreviousSet.has(chunkId)\n\t\t),\n\t\tsummaryDelta: previous?.summary\n\t\t\t? compareRAGRetrievalTraceSummaries(\n\t\t\t\t\tcurrent.summary,\n\t\t\t\t\tprevious.summary\n\t\t\t\t)\n\t\t\t: undefined,\n\t\ttopResultChanged:\n\t\t\t(current.results[0]?.chunkId ?? undefined) !==\n\t\t\t(previous?.results[0]?.chunkId ?? undefined)\n\t};\n};\n\nexport const buildRAGRetrievalTraceHistoryTrend = ({\n\truns\n}: {\n\truns: RAGRetrievalTraceSummaryRun[];\n}): RAGRetrievalTraceTrend => {\n\tconst sortedRuns = normalizeTraceSummaryRuns(runs);\n\tconst runsWithSummary = sortedRuns.filter(\n\t\t(run) => run.traceSummary && run.label\n\t);\n\tconst traceSummaries = runsWithSummary\n\t\t.map((run) => run.traceSummary)\n\t\t.filter((summary): summary is RAGRetrievalTraceComparisonSummary =>\n\t\t\tBoolean(summary)\n\t\t);\n\tconst summaryTrendWindows: RAGRetrievalTraceHistoryWindow[] = [];\n\n\tfor (let index = 0; index < runsWithSummary.length - 1; index += 1) {\n\t\tconst currentRun = runsWithSummary[index]!;\n\t\tconst previousRun = runsWithSummary[index + 1]!;\n\t\tif (!currentRun.traceSummary || !previousRun.traceSummary) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst current = currentRun.traceSummary;\n\t\tconst previous = previousRun.traceSummary;\n\t\tconst delta = compareRAGRetrievalTraceSummaries(current, previous);\n\t\tsummaryTrendWindows.push({\n\t\t\tcurrent,\n\t\t\tcurrentRunId: currentRun.id,\n\t\t\tcurrentRunLabel: currentRun.label,\n\t\t\tdelta,\n\t\t\tprevious,\n\t\t\tpreviousRunId: previousRun.id,\n\t\t\tpreviousRunLabel: previousRun.label\n\t\t});\n\t}\n\n\tconst latest = runsWithSummary[0]?.traceSummary;\n\tconst previous = runsWithSummary[1]?.traceSummary;\n\tconst latestToPrevious =\n\t\tlatest && previous\n\t\t\t? compareRAGRetrievalTraceSummaries(latest, previous)\n\t\t\t: undefined;\n\tconst listHistoryModes = traceSummaries.map((summary) => summary.modes);\n\tconst listHistorySourceStrategies = traceSummaries.map(\n\t\t(summary) => summary.sourceBalanceStrategies\n\t);\n\tconst modes = summarizeListTurnover<RAGHybridRetrievalMode>({\n\t\tcurrent: normalizeSummaryList(latest?.modes ?? []),\n\t\thistory: listHistoryModes,\n\t\tprevious: normalizeSummaryList(previous?.modes ?? [])\n\t});\n\tconst sourceBalanceStrategies =\n\t\tsummarizeListTurnover<RAGSourceBalanceStrategy>({\n\t\t\tcurrent: normalizeSummaryList(\n\t\t\t\tlatest?.sourceBalanceStrategies ?? []\n\t\t\t),\n\t\t\thistory: listHistorySourceStrategies,\n\t\t\tprevious: normalizeSummaryList(\n\t\t\t\tprevious?.sourceBalanceStrategies ?? []\n\t\t\t)\n\t\t});\n\tconst { aggregate, bestMetric, worstMetric } = buildTraceSummaryAggregate({\n\t\tsummaries: traceSummaries\n\t});\n\tconst stageChurn = buildRAGRetrievalTraceStageChurn({\n\t\twindows: summaryTrendWindows\n\t});\n\n\treturn {\n\t\taggregate,\n\t\tbestMetric,\n\t\tmodeTurnover: modes,\n\t\trunsWithTraceSummary: traceSummaries.length,\n\t\tsourceBalanceStrategyTurnover: sourceBalanceStrategies,\n\t\tstageChurn,\n\t\tsummaryTrendWindows,\n\t\tworstMetric,\n\t\tworstVolatileStage: stageChurn.find((entry) => entry.totalChanges > 0),\n\t\tlatestToPrevious\n\t};\n};\nexport const createRAGEvaluationSuite = (\n\tsuite: RAGEvaluationSuite\n): RAGEvaluationSuite => suite;\nexport const evaluateRAGCollection = async ({\n\tcollection,\n\tinput,\n\tdefaultTopK = DEFAULT_TOP_K,\n\trerank\n}: {\n\tcollection: RAGCollection;\n\tinput: RAGEvaluationInput;\n\tdefaultTopK?: number;\n\trerank?: RAGRerankerProviderLike;\n}) => {\n\tconst evaluated = await evaluateRAGCollectionCases({\n\t\tcollection,\n\t\tdefaultTopK,\n\t\tincludeTrace: false,\n\t\tinput,\n\t\trerank\n\t});\n\n\treturn buildRAGEvaluationResponse(\n\t\tevaluated.map((entry) => entry.caseResult)\n\t);\n};\nexport const executeDryRunRAGEvaluation = (\n\tinput: RAGEvaluationInput,\n\tdefaultTopK = DEFAULT_TOP_K\n): RAGEvaluationCaseResult[] =>\n\tinput.cases.map((caseInput, caseIndex) => {\n\t\tconst mode = resolveEvaluationMode(caseInput);\n\t\tconst expectedIds = normalizeExpectedIds(\n\t\t\tmode === 'chunkId'\n\t\t\t\t? (caseInput.expectedChunkIds ?? [])\n\t\t\t\t: mode === 'source'\n\t\t\t\t\t? (caseInput.expectedSources ?? [])\n\t\t\t\t\t: (caseInput.expectedDocumentIds ?? [])\n\t\t);\n\t\tconst effectiveTopK =\n\t\t\ttypeof caseInput.topK === 'number'\n\t\t\t\t? caseInput.topK\n\t\t\t\t: typeof input.topK === 'number'\n\t\t\t\t\t? input.topK\n\t\t\t\t\t: defaultTopK;\n\n\t\treturn {\n\t\t\tcaseId: caseInput.id ?? `case-${caseIndex + 1}`,\n\t\t\telapsedMs: 0,\n\t\t\texpectedCount: expectedIds.length,\n\t\t\texpectedIds,\n\t\t\tf1: 0,\n\t\t\tlabel: caseInput.label,\n\t\t\tmatchedCount: 0,\n\t\t\tmatchedIds: [],\n\t\t\tmissingIds: expectedIds,\n\t\t\tmode,\n\t\t\tprecision: 0,\n\t\t\tquery: caseInput.query,\n\t\t\trecall: 0,\n\t\t\tretrievedCount: 0,\n\t\t\tretrievedIds: [],\n\t\t\tstatus: expectedIds.length === 0 ? 'partial' : 'fail',\n\t\t\ttopK: effectiveTopK\n\t\t};\n\t});\nexport const runRAGEvaluationSuite = async ({\n\tsuite,\n\tevaluate,\n\toverrides,\n\tartifacts\n}: {\n\tsuite: RAGEvaluationSuite;\n\tevaluate: (input: RAGEvaluationInput) => Promise<RAGEvaluationResponse>;\n\toverrides?: Partial<RAGEvaluationInput>;\n\tartifacts?: Pick<\n\t\tRAGEvaluationSuiteRun,\n\t\t'traceSummary' | 'caseTraceSnapshots'\n\t>;\n}) => {\n\tconst startedAt = Date.now();\n\tconst response = await evaluate({\n\t\t...suite.input,\n\t\t...overrides,\n\t\tcases: overrides?.cases ?? suite.input.cases\n\t});\n\tconst finishedAt = Date.now();\n\n\treturn {\n\t\tcaseTraceSnapshots: artifacts?.caseTraceSnapshots,\n\t\telapsedMs: finishedAt - startedAt,\n\t\tfinishedAt,\n\t\tid: generateId(),\n\t\tlabel: suite.label ?? suite.id,\n\t\tmetadata: suite.metadata,\n\t\tresponse,\n\t\tstartedAt,\n\t\tsuiteId: suite.id,\n\t\ttraceSummary: artifacts?.traceSummary\n\t} satisfies RAGEvaluationSuiteRun;\n};\nexport const summarizeRAGEvaluationCase = ({\n\tcaseIndex,\n\tcaseInput,\n\tquery,\n\tmode,\n\tretrievedIds,\n\texpectedIds,\n\telapsedMs\n}: {\n\tcaseIndex: number;\n\tcaseInput: RAGEvaluationCase;\n\tmode: 'chunkId' | 'source' | 'documentId';\n\tquery: string;\n\tretrievedIds: string[];\n\texpectedIds: string[];\n\telapsedMs: number;\n}): RAGEvaluationCaseResult => {\n\tconst expectedSet = new Set(expectedIds);\n\tconst retrievedSet = new Set(retrievedIds);\n\tconst matchedIds = normalizeExpectedIds(\n\t\t[...expectedSet].filter((id) => retrievedSet.has(id))\n\t);\n\tconst missingIds = normalizeExpectedIds(\n\t\t[...expectedSet].filter((id) => !retrievedSet.has(id))\n\t);\n\tconst matchedCount = matchedIds.length;\n\tconst retrievedCount = retrievedIds.length;\n\tconst expectedCount = expectedIds.length;\n\tconst precision = retrievedCount > 0 ? matchedCount / retrievedCount : 0;\n\tconst recall = expectedCount > 0 ? matchedCount / expectedCount : 0;\n\tconst f1 =\n\t\tprecision + recall > 0\n\t\t\t? (2 * precision * recall) / (precision + recall)\n\t\t\t: 0;\n\tconst status: RAGEvaluationCaseResult['status'] =\n\t\texpectedCount === 0\n\t\t\t? 'partial'\n\t\t\t: matchedCount === expectedCount\n\t\t\t\t? 'pass'\n\t\t\t\t: matchedCount > 0\n\t\t\t\t\t? 'partial'\n\t\t\t\t\t: 'fail';\n\n\treturn {\n\t\tcaseId: caseInput.id ?? `case-${caseIndex + 1}`,\n\t\tcorpusKey: caseInput.corpusKey,\n\t\telapsedMs,\n\t\texpectedCount,\n\t\texpectedIds,\n\t\tf1,\n\t\tlabel: caseInput.label,\n\t\tmatchedCount,\n\t\tmatchedIds,\n\t\tmetadata: caseInput.metadata,\n\t\tmissingIds,\n\t\tmode,\n\t\tprecision,\n\t\tquery,\n\t\trecall,\n\t\tretrievedCount,\n\t\tretrievedIds,\n\t\tstatus,\n\t\ttopK:\n\t\t\ttypeof caseInput.topK === 'number' ? caseInput.topK : DEFAULT_TOP_K\n\t};\n};\nexport const summarizeRAGRerankerComparison = (\n\tentries: RAGRerankerComparisonEntry[]\n): RAGRerankerComparisonSummary => {\n\treturn summarizeEvaluationResponseComparison(\n\t\tentries,\n\t\t'rerankerId'\n\t) satisfies RAGRerankerComparisonSummary;\n};\nexport const summarizeRAGRetrievalComparison = (\n\tentries: RAGRetrievalComparisonEntry[]\n): RAGRetrievalComparisonSummary =>\n\tsummarizeEvaluationResponseComparison(\n\t\tentries,\n\t\t'retrievalId'\n\t) satisfies RAGRetrievalComparisonSummary;\n",
6
+ "import { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { dirname } from 'node:path';\nimport type { Database } from 'bun:sqlite';\nimport type {\n\tRAGAnswerGroundingCaseDifficultyDiffEntry,\n\tRAGAnswerGroundingCaseDifficultyHistory,\n\tRAGAnswerGroundingCaseDifficultyHistoryStore,\n\tRAGAnswerGroundingCaseDifficultyRun,\n\tRAGAnswerGroundingCaseDifficultyRunDiff,\n\tRAGAnswerGroundingEvaluationCaseDiff,\n\tRAGAnswerGroundingEvaluationCase,\n\tRAGAnswerGroundingEvaluationCaseDifficultyEntry,\n\tRAGAnswerGroundingEvaluationCaseSnapshot,\n\tRAGAnswerGroundingEvaluationCaseResult,\n\tRAGAnswerGroundingEvaluationHistory,\n\tRAGAnswerGroundingEvaluationLeaderboardEntry,\n\tRAGAnswerGroundingEvaluationHistoryStore,\n\tRAGAnswerGroundingEvaluationInput,\n\tRAGAnswerGroundingEvaluationResponse,\n\tRAGAnswerGroundingEvaluationRun,\n\tRAGAnswerGroundingEvaluationRunDiff,\n\tRAGCollection,\n\tRAGEvaluationCase,\n\tRAGEvaluationCaseDiff,\n\tRAGEvaluationCaseTraceSnapshot,\n\tRAGEvaluationCaseResult,\n\tRAGEvaluationHistory,\n\tRAGEvaluationHistoryStore,\n\tRAGEvaluationInput,\n\tRAGEvaluationLeaderboardEntry,\n\tRAGEvaluationResponse,\n\tRAGEvaluationRunDiff,\n\tRAGLabelValueRow,\n\tRAGComparisonPresentation,\n\tRAGComparisonOverviewPresentation,\n\tRAGGroundingProviderPresentation,\n\tRAGGroundingProviderOverviewPresentation,\n\tRAGGroundingProviderCaseComparisonPresentation,\n\tRAGGroundingOverviewPresentation,\n\tRAGQualityOverviewPresentation,\n\tRAGEvaluationSuite,\n\tRAGEvaluationSuiteRun,\n\tRAGRetrievalTraceSummaryRun,\n\tRAGHybridRetrievalMode,\n\tRAGSourceBalanceStrategy,\n\tRAGRetrievalCandidate,\n\tRAGRetrievalComparison,\n\tRAGRetrievalBaselineGatePolicy,\n\tRAGRetrievalBaselineGatePolicyHistoryRecord,\n\tRAGRetrievalBaselineGatePolicyHistoryStore,\n\tRAGRetrievalComparisonDecisionSummary,\n\tRAGRetrievalComparisonGateResult,\n\tRAGRetrievalReleaseVerdict,\n\tRAGRetrievalComparisonHistoryStore,\n\tRAGRetrievalBaselineRecord,\n\tRAGRetrievalBaselineStore,\n\tRAGRetrievalLaneHandoffDecisionRecord,\n\tRAGRetrievalLaneHandoffDecisionStore,\n\tRAGRetrievalLaneHandoffIncidentHistoryRecord,\n\tRAGRetrievalLaneHandoffIncidentHistoryStore,\n\tRAGRetrievalLaneHandoffAutoCompletePolicyHistoryRecord,\n\tRAGRetrievalLaneHandoffAutoCompletePolicyHistoryStore,\n\tRAGRetrievalLaneHandoffIncidentRecord,\n\tRAGRetrievalLaneHandoffIncidentStore,\n\tRAGRetrievalIncidentRemediationDecisionRecord,\n\tRAGRetrievalIncidentRemediationDecisionStore,\n\tRAGRetrievalIncidentRemediationExecutionHistoryRecord,\n\tRAGRetrievalIncidentRemediationExecutionHistoryStore,\n\tRAGRetrievalReleaseDecisionRecord,\n\tRAGRetrievalReleaseLanePolicyHistoryRecord,\n\tRAGRetrievalReleaseLanePolicyHistoryStore,\n\tRAGRetrievalReleaseLaneEscalationPolicyHistoryRecord,\n\tRAGRetrievalReleaseLaneEscalationPolicyHistoryStore,\n\tRAGRetrievalReleaseDecisionStore,\n\tRAGRetrievalReleaseIncidentRecord,\n\tRAGRetrievalReleaseIncidentStore,\n\tRAGRetrievalComparisonRun,\n\tRAGRetrievalComparisonEntry,\n\tRAGRetrievalTrace,\n\tRAGRetrievalTraceComparisonSummary,\n\tRAGRetrievalTraceComparisonSummaryDiff,\n\tRAGRetrievalTraceStep,\n\tRAGRetrievalTraceStage,\n\tRAGTraceSummaryListTrend,\n\tRAGTraceSummaryTrendDirection,\n\tRAGTraceSummaryNumericDelta,\n\tRAGTraceSummaryStageTrend,\n\tRAGTraceSummaryStageCountsDelta,\n\tRAGRetrievalComparisonSummary,\n\tRAGRetrievalTraceHistoryWindow,\n\tRAGRerankerCandidate,\n\tRAGRerankerComparison,\n\tRAGRerankerComparisonEntry,\n\tRAGRerankerComparisonSummary,\n\tRAGRerankerProviderLike,\n\tRAGRetrievalTraceTrend,\n\tRAGSearchTraceDiff,\n\tRAGSearchTraceGroupHistory,\n\tRAGSearchTraceGroupHistoryEntry,\n\tRAGSearchTraceHistory,\n\tRAGSearchTracePruneInput,\n\tRAGSearchTracePruneHistoryStore,\n\tRAGSearchTracePruneRun,\n\tRAGSearchTracePrunePreview,\n\tRAGSearchTracePruneResult,\n\tRAGSearchTraceRecord,\n\tRAGSearchTraceResultSnapshot,\n\tRAGSearchTraceStats,\n\tRAGSearchTraceStore,\n\tRAGRemediationAction,\n\tRAGSource,\n\tRAGCollectionSearchParams\n} from '../../../types/ai';\nimport { generateId } from '../protocol';\nimport { buildRAGGroundedAnswer } from './grounding';\n\nconst DEFAULT_TOP_K = 6;\nconst DEFAULT_HISTORY_LIMIT = 20;\nconst DEFAULT_SEARCH_TRACE_TABLE_NAME = 'rag_search_traces';\ntype BunSQLiteModule = {\n\tDatabase: new (path?: string) => Database;\n};\n\ntype ImportMetaWithRequire = ImportMeta & {\n\trequire?: (specifier: string) => unknown;\n};\n\nconst loadBunSQLiteModule = (): BunSQLiteModule => {\n\tconst runtimeRequire = (import.meta as ImportMetaWithRequire).require;\n\tif (typeof runtimeRequire !== 'function') {\n\t\tthrow new Error(\n\t\t\t'SQLite trace storage requires Bun runtime support for import.meta.require.'\n\t\t);\n\t}\n\n\treturn runtimeRequire('bun:sqlite') as BunSQLiteModule;\n};\n\nconst normalizeStringArray = (value: unknown) => {\n\tif (!Array.isArray(value)) {\n\t\treturn [];\n\t}\n\n\treturn value\n\t\t.filter((candidate) => typeof candidate === 'string')\n\t\t.map((candidate) => candidate.trim())\n\t\t.filter((candidate) => candidate.length > 0);\n};\n\nconst normalizeLabelFilter = (value?: string) => {\n\tif (typeof value !== 'string') {\n\t\treturn undefined;\n\t}\n\n\tconst normalized = value.trim().toLowerCase();\n\treturn normalized.length > 0 ? normalized : undefined;\n};\n\nconst normalizeRetrievalBaselineRecords = (\n\trecords: RAGRetrievalBaselineRecord[]\n) => [...records].sort((left, right) => right.promotedAt - left.promotedAt);\n\nconst normalizeRetrievalReleaseDecisionRecords = (\n\trecords: RAGRetrievalReleaseDecisionRecord[]\n) => [...records].sort((left, right) => right.decidedAt - left.decidedAt);\n\nconst normalizeRetrievalLaneHandoffDecisionRecords = (\n\trecords: RAGRetrievalLaneHandoffDecisionRecord[]\n) => [...records].sort((left, right) => right.decidedAt - left.decidedAt);\n\nconst normalizeRetrievalReleaseIncidentRecords = (\n\trecords: RAGRetrievalReleaseIncidentRecord[]\n) => [...records].sort((left, right) => right.triggeredAt - left.triggeredAt);\n\nconst normalizeRetrievalIncidentRemediationDecisionRecords = (\n\trecords: RAGRetrievalIncidentRemediationDecisionRecord[]\n) => [...records].sort((left, right) => right.decidedAt - left.decidedAt);\n\nconst normalizeRetrievalIncidentRemediationExecutionHistoryRecords = (\n\trecords: RAGRetrievalIncidentRemediationExecutionHistoryRecord[]\n) => [...records].sort((left, right) => right.executedAt - left.executedAt);\n\nconst matchesWinner = (run: RAGRetrievalComparisonRun, winnerId?: string) => {\n\tif (!winnerId) {\n\t\treturn true;\n\t}\n\n\treturn (\n\t\trun.comparison.summary.bestByPassingRate === winnerId ||\n\t\trun.decisionSummary?.winnerByPassingRate === winnerId\n\t);\n};\n\nconst findRetrievalComparisonEntry = (\n\tcomparison: RAGRetrievalComparison,\n\tretrievalId?: string\n) => {\n\tif (!retrievalId) {\n\t\treturn undefined;\n\t}\n\n\treturn comparison.entries.find(\n\t\t(entry) => entry.retrievalId === retrievalId\n\t);\n};\n\nconst evaluateRetrievalComparisonGate = ({\n\tdelta,\n\tpolicy\n}: {\n\tdelta?: {\n\t\tpassingRateDelta: number;\n\t\taverageF1Delta: number;\n\t\telapsedMsDelta: number;\n\t};\n\tpolicy?: RAGRetrievalBaselineGatePolicy;\n}): RAGRetrievalComparisonGateResult | undefined => {\n\tif (!delta || !policy) {\n\t\treturn undefined;\n\t}\n\n\tconst reasons: string[] = [];\n\tif (\n\t\ttypeof policy.minPassingRateDelta === 'number' &&\n\t\tdelta.passingRateDelta < policy.minPassingRateDelta\n\t) {\n\t\treasons.push(\n\t\t\t`passing rate delta ${delta.passingRateDelta} is below ${policy.minPassingRateDelta}`\n\t\t);\n\t}\n\tif (\n\t\ttypeof policy.minAverageF1Delta === 'number' &&\n\t\tdelta.averageF1Delta < policy.minAverageF1Delta\n\t) {\n\t\treasons.push(\n\t\t\t`average F1 delta ${delta.averageF1Delta} is below ${policy.minAverageF1Delta}`\n\t\t);\n\t}\n\tif (\n\t\ttypeof policy.maxElapsedMsDelta === 'number' &&\n\t\tdelta.elapsedMsDelta > policy.maxElapsedMsDelta\n\t) {\n\t\treasons.push(\n\t\t\t`elapsed ms delta ${delta.elapsedMsDelta} exceeds ${policy.maxElapsedMsDelta}`\n\t\t);\n\t}\n\n\tif (reasons.length === 0) {\n\t\treturn {\n\t\t\tpolicy,\n\t\t\treasons: [],\n\t\t\tstatus: 'pass'\n\t\t};\n\t}\n\n\treturn {\n\t\tpolicy,\n\t\treasons,\n\t\tstatus: policy.severity === 'warn' ? 'warn' : 'fail'\n\t};\n};\n\nexport const buildRAGRetrievalReleaseVerdict = ({\n\tgroupKey,\n\tdecisionSummary\n}: {\n\tgroupKey?: string;\n\tdecisionSummary?: RAGRetrievalComparisonDecisionSummary;\n}): RAGRetrievalReleaseVerdict | undefined => {\n\tif (!decisionSummary) {\n\t\treturn undefined;\n\t}\n\n\tconst gate = decisionSummary.gate;\n\tconst delta = decisionSummary.delta;\n\tconst baselineRetrievalId = decisionSummary.baselineRetrievalId;\n\tconst candidateRetrievalId = decisionSummary.candidateRetrievalId;\n\n\tif (gate) {\n\t\tif (gate.status === 'pass') {\n\t\t\treturn {\n\t\t\t\tbaselineGroupKey: groupKey,\n\t\t\t\tbaselineRetrievalId,\n\t\t\t\tcandidateRetrievalId,\n\t\t\t\tdelta,\n\t\t\t\tgate,\n\t\t\t\tstatus: 'pass',\n\t\t\t\tsummary: 'Candidate passed the active baseline gate.'\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tbaselineGroupKey: groupKey,\n\t\t\tbaselineRetrievalId,\n\t\t\tcandidateRetrievalId,\n\t\t\tdelta,\n\t\t\tgate,\n\t\t\tstatus: gate.status,\n\t\t\tsummary:\n\t\t\t\tgate.status === 'warn'\n\t\t\t\t\t? 'Candidate triggered a baseline gate warning.'\n\t\t\t\t\t: 'Candidate failed the active baseline gate.'\n\t\t};\n\t}\n\n\tif (delta) {\n\t\treturn {\n\t\t\tbaselineGroupKey: groupKey,\n\t\t\tbaselineRetrievalId,\n\t\t\tcandidateRetrievalId,\n\t\t\tdelta,\n\t\t\tstatus:\n\t\t\t\tdelta.passingRateDelta < 0 || delta.averageF1Delta < 0\n\t\t\t\t\t? 'needs_review'\n\t\t\t\t\t: 'pass',\n\t\t\tsummary:\n\t\t\t\tdelta.passingRateDelta < 0 || delta.averageF1Delta < 0\n\t\t\t\t\t? 'Candidate should be reviewed before promotion.'\n\t\t\t\t\t: 'Candidate improved or matched the baseline.'\n\t\t};\n\t}\n\n\treturn {\n\t\tbaselineGroupKey: groupKey,\n\t\tbaselineRetrievalId,\n\t\tcandidateRetrievalId,\n\t\tstatus: 'needs_review',\n\t\tsummary: 'No explicit baseline verdict could be determined.'\n\t};\n};\n\nconst isObjectRecord = (value: unknown): value is Record<string, unknown> =>\n\tBoolean(value) && typeof value === 'object';\n\nconst parseJSONRecord = (value: string | null) => {\n\tif (value === null) {\n\t\treturn undefined;\n\t}\n\n\ttry {\n\t\tconst parsed = JSON.parse(value);\n\n\t\treturn isObjectRecord(parsed) ? parsed : undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n};\n\nconst parseJSONArray = <T>(value: string | null, fallback: T[]): T[] => {\n\tif (value === null) {\n\t\treturn fallback;\n\t}\n\n\ttry {\n\t\tconst parsed = JSON.parse(value);\n\n\t\treturn Array.isArray(parsed) ? (parsed as T[]) : fallback;\n\t} catch {\n\t\treturn fallback;\n\t}\n};\n\nconst normalizeExpectedIds = (input: string[]) =>\n\tArray.from(new Set(input.map((item) => item.trim()).filter(Boolean)));\n\nconst resolveEvaluationMode = (caseInput: {\n\texpectedChunkIds?: string[];\n\texpectedSources?: string[];\n\texpectedDocumentIds?: string[];\n}): 'chunkId' | 'source' | 'documentId' => {\n\tif (normalizeStringArray(caseInput.expectedChunkIds).length > 0) {\n\t\treturn 'chunkId';\n\t}\n\tif (normalizeStringArray(caseInput.expectedSources).length > 0) {\n\t\treturn 'source';\n\t}\n\n\treturn 'documentId';\n};\n\nconst getDocumentId = (source: RAGSource): string => {\n\tconst metadataDocumentId =\n\t\ttypeof source.metadata?.documentId === 'string'\n\t\t\t? source.metadata.documentId\n\t\t\t: undefined;\n\tif (metadataDocumentId) {\n\t\treturn metadataDocumentId;\n\t}\n\tif (source.source) {\n\t\treturn source.source;\n\t}\n\n\tconst [documentId] = source.chunkId.split(':');\n\n\treturn documentId ?? source.chunkId;\n};\n\nconst extractExpectedId = (\n\tsource: RAGSource,\n\tmode: 'chunkId' | 'source' | 'documentId'\n): string =>\n\tmode === 'chunkId'\n\t\t? source.chunkId\n\t\t: mode === 'source'\n\t\t\t? (source.source ?? source.title ?? source.chunkId)\n\t\t\t: getDocumentId(source);\n\nconst buildSources = (\n\tresults: Array<{\n\t\tchunkId: string;\n\t\tchunkText: string;\n\t\tscore: number;\n\t\ttitle?: string;\n\t\tsource?: string;\n\t\tmetadata?: Record<string, unknown>;\n\t}>\n) =>\n\tresults.map((result) => ({\n\t\tchunkId: result.chunkId,\n\t\tmetadata: result.metadata,\n\t\tscore: Number.isFinite(result.score) ? result.score : 0,\n\t\tsource: result.source,\n\t\ttext: result.chunkText,\n\t\ttitle: result.title\n\t}));\n\nconst buildAnswerGroundingStatus = ({\n\tcoverage,\n\texpectedCount,\n\tmatchedCount,\n\tunresolvedCitationCount,\n\tresolvedCitationCount\n}: {\n\tcoverage: RAGAnswerGroundingEvaluationCaseResult['coverage'];\n\texpectedCount: number;\n\tmatchedCount: number;\n\tunresolvedCitationCount: number;\n\tresolvedCitationCount: number;\n}): RAGAnswerGroundingEvaluationCaseResult['status'] => {\n\tif (expectedCount > 0) {\n\t\tif (\n\t\t\tmatchedCount === expectedCount &&\n\t\t\tunresolvedCitationCount === 0 &&\n\t\t\tcoverage !== 'ungrounded'\n\t\t) {\n\t\t\treturn 'pass';\n\t\t}\n\n\t\tif (matchedCount > 0 || resolvedCitationCount > 0) {\n\t\t\treturn 'partial';\n\t\t}\n\n\t\treturn 'fail';\n\t}\n\n\tif (coverage === 'grounded' && unresolvedCitationCount === 0) {\n\t\treturn 'pass';\n\t}\n\n\tif (resolvedCitationCount > 0 || coverage === 'partial') {\n\t\treturn 'partial';\n\t}\n\n\treturn 'fail';\n};\n\nexport const buildRAGEvaluationLeaderboard = (\n\truns: RAGEvaluationSuiteRun[]\n) => {\n\tconst sorted = [...runs].sort((left, right) => {\n\t\tif (right.response.passingRate !== left.response.passingRate) {\n\t\t\treturn right.response.passingRate - left.response.passingRate;\n\t\t}\n\t\tif (\n\t\t\tright.response.summary.averageF1 !== left.response.summary.averageF1\n\t\t) {\n\t\t\treturn (\n\t\t\t\tright.response.summary.averageF1 -\n\t\t\t\tleft.response.summary.averageF1\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\tleft.response.summary.averageLatencyMs -\n\t\t\tright.response.summary.averageLatencyMs\n\t\t);\n\t});\n\n\treturn sorted.map<RAGEvaluationLeaderboardEntry>((run, index) => ({\n\t\taverageF1: run.response.summary.averageF1,\n\t\taverageLatencyMs: run.response.summary.averageLatencyMs,\n\t\tlabel: run.label,\n\t\tpassingRate: run.response.passingRate,\n\t\trank: index + 1,\n\t\trunId: run.id,\n\t\tsuiteId: run.suiteId,\n\t\ttotalCases: run.response.totalCases\n\t}));\n};\n\nexport const buildRAGAnswerGroundingEvaluationLeaderboard = (\n\truns: RAGAnswerGroundingEvaluationRun[]\n) => {\n\tconst sorted = [...runs].sort((left, right) => {\n\t\tif (right.response.passingRate !== left.response.passingRate) {\n\t\t\treturn right.response.passingRate - left.response.passingRate;\n\t\t}\n\t\tif (\n\t\t\tright.response.summary.averageCitationF1 !==\n\t\t\tleft.response.summary.averageCitationF1\n\t\t) {\n\t\t\treturn (\n\t\t\t\tright.response.summary.averageCitationF1 -\n\t\t\t\tleft.response.summary.averageCitationF1\n\t\t\t);\n\t\t}\n\t\tif (\n\t\t\tright.response.summary.averageResolvedCitationRate !==\n\t\t\tleft.response.summary.averageResolvedCitationRate\n\t\t) {\n\t\t\treturn (\n\t\t\t\tright.response.summary.averageResolvedCitationRate -\n\t\t\t\tleft.response.summary.averageResolvedCitationRate\n\t\t\t);\n\t\t}\n\n\t\treturn left.elapsedMs - right.elapsedMs;\n\t});\n\n\treturn sorted.map<RAGAnswerGroundingEvaluationLeaderboardEntry>(\n\t\t(run, index) => ({\n\t\t\taverageCitationF1: run.response.summary.averageCitationF1,\n\t\t\taverageResolvedCitationRate:\n\t\t\t\trun.response.summary.averageResolvedCitationRate,\n\t\t\tlabel: run.label,\n\t\t\tpassingRate: run.response.passingRate,\n\t\t\trank: index + 1,\n\t\t\trunId: run.id,\n\t\t\tsuiteId: run.suiteId,\n\t\t\ttotalCases: run.response.totalCases\n\t\t})\n\t);\n};\n\nconst buildTraceStageCounts = (traces: RAGRetrievalTrace[]) => {\n\tconst counts: Partial<\n\t\tRecord<RAGRetrievalTrace['steps'][number]['stage'], number>\n\t> = {};\n\n\tfor (const trace of traces) {\n\t\tfor (const step of trace.steps) {\n\t\t\tcounts[step.stage] = (counts[step.stage] ?? 0) + 1;\n\t\t}\n\t}\n\n\treturn counts;\n};\n\nconst diffTraceStageCounts = ({\n\tcurrent,\n\tprevious\n}: {\n\tcurrent: Partial<\n\t\tRecord<RAGRetrievalTrace['steps'][number]['stage'], number>\n\t>;\n\tprevious: Partial<\n\t\tRecord<RAGRetrievalTrace['steps'][number]['stage'], number>\n\t>;\n}) => {\n\tconst next: Partial<\n\t\tRecord<RAGRetrievalTrace['steps'][number]['stage'], number>\n\t> = {};\n\tconst stages = new Set([\n\t\t...Object.keys(current),\n\t\t...Object.keys(previous)\n\t] as RAGRetrievalTrace['steps'][number]['stage'][]);\n\n\tfor (const stage of stages) {\n\t\tconst delta = (current[stage] ?? 0) - (previous[stage] ?? 0);\n\t\tif (delta !== 0) {\n\t\t\tnext[stage] = delta;\n\t\t}\n\t}\n\n\treturn next;\n};\n\nconst normalizeSummaryList = <T extends string>(values: T[]) =>\n\tArray.from(new Set(values)).sort();\n\nconst buildSummaryListDelta = <T extends string>(\n\tcurrent: T[],\n\tprevious: T[]\n) => {\n\tconst currentSet = new Set(current);\n\tconst previousSet = new Set(previous);\n\tconst added = current.filter((value) => !previousSet.has(value));\n\tconst removed = previous.filter((value) => !currentSet.has(value));\n\n\treturn {\n\t\tadded: normalizeSummaryList(Array.from(new Set(added))),\n\t\tcurrent: normalizeSummaryList(current),\n\t\tprevious: normalizeSummaryList(previous),\n\t\tremoved: normalizeSummaryList(Array.from(new Set(removed)))\n\t};\n};\n\nfunction summarizeListTurnover<T extends string>(params: {\n\tcurrent: T[];\n\tprevious: T[];\n\thistory: T[][];\n}): RAGTraceSummaryListTrend<T> {\n\tconst { current, previous, history } = params;\n\tconst currentSet = new Set(current);\n\tconst previousSet = new Set(previous);\n\tconst frequency: Record<string, number> = {};\n\n\tfor (const entry of history) {\n\t\tfor (const value of entry) {\n\t\t\tfrequency[value] = (frequency[value] ?? 0) + 1;\n\t\t}\n\t}\n\n\treturn {\n\t\tappeared: normalizeSummaryList(\n\t\t\tArray.from(\n\t\t\t\tnew Set(current.filter((value) => !previousSet.has(value)))\n\t\t\t)\n\t\t),\n\t\tcurrent: normalizeSummaryList(current),\n\t\tdisappeared: normalizeSummaryList(\n\t\t\tArray.from(\n\t\t\t\tnew Set(previous.filter((value) => !currentSet.has(value)))\n\t\t\t)\n\t\t),\n\t\tfrequency,\n\t\tprevious: normalizeSummaryList(previous),\n\t\tstable: normalizeSummaryList(\n\t\t\tArray.from(\n\t\t\t\tnew Set(current.filter((value) => previousSet.has(value)))\n\t\t\t)\n\t\t)\n\t};\n}\n\nconst diffTraceSummaryStageCounts = ({\n\tcurrent,\n\tprevious\n}: {\n\tcurrent: RAGRetrievalTraceComparisonSummary['stageCounts'];\n\tprevious: RAGRetrievalTraceComparisonSummary['stageCounts'];\n}) => {\n\tconst stages = new Set([\n\t\t...Object.keys(current),\n\t\t...Object.keys(previous)\n\t]) as Set<RAGRetrievalTraceStep['stage']>;\n\tconst next: Partial<\n\t\tRecord<RAGRetrievalTraceStage, RAGTraceSummaryStageCountsDelta>\n\t> = {};\n\n\tfor (const stage of stages) {\n\t\tconst currentCount = current[stage] ?? 0;\n\t\tconst previousCount = previous[stage] ?? 0;\n\t\tconst delta = currentCount - previousCount;\n\t\tif (delta !== 0 || currentCount !== 0 || previousCount !== 0) {\n\t\t\tnext[stage] = {\n\t\t\t\tcurrent: currentCount,\n\t\t\t\tdelta,\n\t\t\t\tprevious: previousCount\n\t\t\t};\n\t\t}\n\t}\n\n\treturn next;\n};\n\nconst roundTraceAverage = (value: number, total: number) =>\n\ttotal > 0 ? Number((value / total).toFixed(2)) : 0;\n\nconst buildTraceSummaryDirection = (\n\tdelta: number\n): RAGTraceSummaryTrendDirection =>\n\tdelta > 0 ? 'up' : delta < 0 ? 'down' : 'flat';\n\nconst buildTraceSummaryAggregate = ({\n\tsummaries\n}: {\n\tsummaries: RAGRetrievalTraceComparisonSummary[];\n}): {\n\taggregate: RAGTraceSummaryNumericDelta[];\n\tbestMetric: RAGTraceSummaryNumericDelta | undefined;\n\tworstMetric: RAGTraceSummaryNumericDelta | undefined;\n} => {\n\tif (summaries.length === 0) {\n\t\tconst aggregate: RAGTraceSummaryNumericDelta[] = [\n\t\t\t{\n\t\t\t\tcurrent: 0,\n\t\t\t\tdelta: 0,\n\t\t\t\tdirection: 'flat',\n\t\t\t\tmetric: 'totalCases',\n\t\t\t\tprevious: 0\n\t\t\t},\n\t\t\t{\n\t\t\t\tcurrent: 0,\n\t\t\t\tdelta: 0,\n\t\t\t\tdirection: 'flat',\n\t\t\t\tmetric: 'averageFinalCount',\n\t\t\t\tprevious: 0\n\t\t\t},\n\t\t\t{\n\t\t\t\tcurrent: 0,\n\t\t\t\tdelta: 0,\n\t\t\t\tdirection: 'flat',\n\t\t\t\tmetric: 'averageVectorCount',\n\t\t\t\tprevious: 0\n\t\t\t},\n\t\t\t{\n\t\t\t\tcurrent: 0,\n\t\t\t\tdelta: 0,\n\t\t\t\tdirection: 'flat',\n\t\t\t\tmetric: 'averageLexicalCount',\n\t\t\t\tprevious: 0\n\t\t\t},\n\t\t\t{\n\t\t\t\tcurrent: 0,\n\t\t\t\tdelta: 0,\n\t\t\t\tdirection: 'flat',\n\t\t\t\tmetric: 'averageCandidateTopK',\n\t\t\t\tprevious: 0\n\t\t\t},\n\t\t\t{\n\t\t\t\tcurrent: 0,\n\t\t\t\tdelta: 0,\n\t\t\t\tdirection: 'flat',\n\t\t\t\tmetric: 'averageLexicalTopK',\n\t\t\t\tprevious: 0\n\t\t\t},\n\t\t\t{\n\t\t\t\tcurrent: 0,\n\t\t\t\tdelta: 0,\n\t\t\t\tdirection: 'flat',\n\t\t\t\tmetric: 'vectorCases',\n\t\t\t\tprevious: 0\n\t\t\t},\n\t\t\t{\n\t\t\t\tcurrent: 0,\n\t\t\t\tdelta: 0,\n\t\t\t\tdirection: 'flat',\n\t\t\t\tmetric: 'lexicalCases',\n\t\t\t\tprevious: 0\n\t\t\t},\n\t\t\t{\n\t\t\t\tcurrent: 0,\n\t\t\t\tdelta: 0,\n\t\t\t\tdirection: 'flat',\n\t\t\t\tmetric: 'balancedCases',\n\t\t\t\tprevious: 0\n\t\t\t},\n\t\t\t{\n\t\t\t\tcurrent: 0,\n\t\t\t\tdelta: 0,\n\t\t\t\tdirection: 'flat',\n\t\t\t\tmetric: 'roundRobinCases',\n\t\t\t\tprevious: 0\n\t\t\t},\n\t\t\t{\n\t\t\t\tcurrent: 0,\n\t\t\t\tdelta: 0,\n\t\t\t\tdirection: 'flat',\n\t\t\t\tmetric: 'transformedCases',\n\t\t\t\tprevious: 0\n\t\t\t},\n\t\t\t{\n\t\t\t\tcurrent: 0,\n\t\t\t\tdelta: 0,\n\t\t\t\tdirection: 'flat',\n\t\t\t\tmetric: 'variantCases',\n\t\t\t\tprevious: 0\n\t\t\t}\n\t\t];\n\n\t\treturn {\n\t\t\taggregate,\n\t\t\tbestMetric: undefined,\n\t\t\tworstMetric: undefined\n\t\t};\n\t}\n\n\tconst latest = summaries[0]!;\n\tconst previous = summaries[summaries.length - 1]!;\n\tconst aggregate: RAGTraceSummaryNumericDelta[] = [\n\t\t{\n\t\t\tcurrent: latest.totalCases,\n\t\t\tdelta: latest.totalCases - previous.totalCases,\n\t\t\tdirection: buildTraceSummaryDirection(\n\t\t\t\tlatest.totalCases - previous.totalCases\n\t\t\t),\n\t\t\tmetric: 'totalCases',\n\t\t\tprevious: previous.totalCases\n\t\t},\n\t\t{\n\t\t\tcurrent: latest.averageFinalCount,\n\t\t\tdelta: latest.averageFinalCount - previous.averageFinalCount,\n\t\t\tdirection: buildTraceSummaryDirection(\n\t\t\t\tlatest.averageFinalCount - previous.averageFinalCount\n\t\t\t),\n\t\t\tmetric: 'averageFinalCount',\n\t\t\tprevious: previous.averageFinalCount\n\t\t},\n\t\t{\n\t\t\tcurrent: latest.averageVectorCount,\n\t\t\tdelta: latest.averageVectorCount - previous.averageVectorCount,\n\t\t\tdirection: buildTraceSummaryDirection(\n\t\t\t\tlatest.averageVectorCount - previous.averageVectorCount\n\t\t\t),\n\t\t\tmetric: 'averageVectorCount',\n\t\t\tprevious: previous.averageVectorCount\n\t\t},\n\t\t{\n\t\t\tcurrent: latest.averageLexicalCount,\n\t\t\tdelta: latest.averageLexicalCount - previous.averageLexicalCount,\n\t\t\tdirection: buildTraceSummaryDirection(\n\t\t\t\tlatest.averageLexicalCount - previous.averageLexicalCount\n\t\t\t),\n\t\t\tmetric: 'averageLexicalCount',\n\t\t\tprevious: previous.averageLexicalCount\n\t\t},\n\t\t{\n\t\t\tcurrent: latest.averageCandidateTopK,\n\t\t\tdelta: latest.averageCandidateTopK - previous.averageCandidateTopK,\n\t\t\tdirection: buildTraceSummaryDirection(\n\t\t\t\tlatest.averageCandidateTopK - previous.averageCandidateTopK\n\t\t\t),\n\t\t\tmetric: 'averageCandidateTopK',\n\t\t\tprevious: previous.averageCandidateTopK\n\t\t},\n\t\t{\n\t\t\tcurrent: latest.averageLexicalTopK,\n\t\t\tdelta: latest.averageLexicalTopK - previous.averageLexicalTopK,\n\t\t\tdirection: buildTraceSummaryDirection(\n\t\t\t\tlatest.averageLexicalTopK - previous.averageLexicalTopK\n\t\t\t),\n\t\t\tmetric: 'averageLexicalTopK',\n\t\t\tprevious: previous.averageLexicalTopK\n\t\t},\n\t\t{\n\t\t\tcurrent: latest.vectorCases,\n\t\t\tdelta: latest.vectorCases - previous.vectorCases,\n\t\t\tdirection: buildTraceSummaryDirection(\n\t\t\t\tlatest.vectorCases - previous.vectorCases\n\t\t\t),\n\t\t\tmetric: 'vectorCases',\n\t\t\tprevious: previous.vectorCases\n\t\t},\n\t\t{\n\t\t\tcurrent: latest.lexicalCases,\n\t\t\tdelta: latest.lexicalCases - previous.lexicalCases,\n\t\t\tdirection: buildTraceSummaryDirection(\n\t\t\t\tlatest.lexicalCases - previous.lexicalCases\n\t\t\t),\n\t\t\tmetric: 'lexicalCases',\n\t\t\tprevious: previous.lexicalCases\n\t\t},\n\t\t{\n\t\t\tcurrent: latest.balancedCases,\n\t\t\tdelta: latest.balancedCases - previous.balancedCases,\n\t\t\tdirection: buildTraceSummaryDirection(\n\t\t\t\tlatest.balancedCases - previous.balancedCases\n\t\t\t),\n\t\t\tmetric: 'balancedCases',\n\t\t\tprevious: previous.balancedCases\n\t\t},\n\t\t{\n\t\t\tcurrent: latest.roundRobinCases,\n\t\t\tdelta: latest.roundRobinCases - previous.roundRobinCases,\n\t\t\tdirection: buildTraceSummaryDirection(\n\t\t\t\tlatest.roundRobinCases - previous.roundRobinCases\n\t\t\t),\n\t\t\tmetric: 'roundRobinCases',\n\t\t\tprevious: previous.roundRobinCases\n\t\t},\n\t\t{\n\t\t\tcurrent: latest.transformedCases,\n\t\t\tdelta: latest.transformedCases - previous.transformedCases,\n\t\t\tdirection: buildTraceSummaryDirection(\n\t\t\t\tlatest.transformedCases - previous.transformedCases\n\t\t\t),\n\t\t\tmetric: 'transformedCases',\n\t\t\tprevious: previous.transformedCases\n\t\t},\n\t\t{\n\t\t\tcurrent: latest.variantCases,\n\t\t\tdelta: latest.variantCases - previous.variantCases,\n\t\t\tdirection: buildTraceSummaryDirection(\n\t\t\t\tlatest.variantCases - previous.variantCases\n\t\t\t),\n\t\t\tmetric: 'variantCases',\n\t\t\tprevious: previous.variantCases\n\t\t}\n\t];\n\tconst absoluteSorted = [...aggregate].sort(\n\t\t(left, right) =>\n\t\t\tMath.abs(right.delta) - Math.abs(left.delta) ||\n\t\t\tleft.metric.localeCompare(right.metric)\n\t);\n\n\treturn {\n\t\taggregate,\n\t\tbestMetric: absoluteSorted[0],\n\t\tworstMetric: absoluteSorted[absoluteSorted.length - 1]\n\t};\n};\n\nconst buildRAGRetrievalTraceStageChurn = ({\n\twindows\n}: {\n\twindows: RAGRetrievalTraceHistoryWindow[];\n}): RAGTraceSummaryStageTrend[] => {\n\tconst stages = new Set<RAGRetrievalTraceStep['stage']>();\n\tfor (const window of windows) {\n\t\tfor (const stage of Object.keys(window.current.stageCounts) as Array<\n\t\t\tRAGRetrievalTraceStep['stage']\n\t\t>) {\n\t\t\tstages.add(stage);\n\t\t}\n\t\tfor (const stage of Object.keys(window.previous.stageCounts) as Array<\n\t\t\tRAGRetrievalTraceStep['stage']\n\t\t>) {\n\t\t\tstages.add(stage);\n\t\t}\n\t}\n\n\treturn [...stages]\n\t\t.map((stage) => {\n\t\t\tlet netDelta = 0;\n\t\t\tlet totalChanges = 0;\n\t\t\tfor (const window of windows) {\n\t\t\t\tconst delta = window.delta?.stageCountsDelta[stage]?.delta ?? 0;\n\t\t\t\tnetDelta += delta;\n\t\t\t\ttotalChanges += Math.abs(delta);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tlatestDelta:\n\t\t\t\t\twindows[0]?.delta?.stageCountsDelta[stage]?.delta ?? 0,\n\t\t\t\tnetDelta,\n\t\t\t\tstage,\n\t\t\t\ttotalChanges\n\t\t\t};\n\t\t})\n\t\t.sort(\n\t\t\t(left, right) =>\n\t\t\t\tright.totalChanges - left.totalChanges ||\n\t\t\t\tleft.stage.localeCompare(right.stage)\n\t\t);\n};\n\nconst summarizeRetrievalTraces = (\n\ttraces: RAGRetrievalTrace[]\n): RAGRetrievalTraceComparisonSummary | undefined => {\n\tif (traces.length === 0) {\n\t\treturn undefined;\n\t}\n\n\tconst totalCases = traces.length;\n\tconst modeSet = new Set<RAGHybridRetrievalMode>();\n\tconst sourceBalanceStrategySet = new Set<RAGSourceBalanceStrategy>();\n\tlet vectorCases = 0;\n\tlet lexicalCases = 0;\n\tlet balancedCases = 0;\n\tlet roundRobinCases = 0;\n\tlet transformedCases = 0;\n\tlet variantCases = 0;\n\tlet finalCountSum = 0;\n\tlet vectorCountSum = 0;\n\tlet lexicalCountSum = 0;\n\tlet candidateTopKSum = 0;\n\tlet lexicalTopKSum = 0;\n\n\tfor (const trace of traces) {\n\t\tmodeSet.add(trace.mode);\n\t\tsourceBalanceStrategySet.add(trace.sourceBalanceStrategy ?? 'cap');\n\t\tif (trace.runVector) {\n\t\t\tvectorCases += 1;\n\t\t}\n\t\tif (trace.runLexical) {\n\t\t\tlexicalCases += 1;\n\t\t}\n\t\tif (typeof trace.maxResultsPerSource === 'number') {\n\t\t\tbalancedCases += 1;\n\t\t\tif (trace.sourceBalanceStrategy === 'round_robin') {\n\t\t\t\troundRobinCases += 1;\n\t\t\t}\n\t\t}\n\t\tif (trace.transformedQuery !== trace.query) {\n\t\t\ttransformedCases += 1;\n\t\t}\n\t\tif (trace.variantQueries.length > 0) {\n\t\t\tvariantCases += 1;\n\t\t}\n\t\tfinalCountSum += trace.resultCounts.final;\n\t\tvectorCountSum += trace.resultCounts.vector;\n\t\tlexicalCountSum += trace.resultCounts.lexical;\n\t\tcandidateTopKSum += trace.candidateTopK;\n\t\tlexicalTopKSum += trace.lexicalTopK;\n\t}\n\n\treturn {\n\t\taverageCandidateTopK: roundTraceAverage(candidateTopKSum, totalCases),\n\t\taverageFinalCount: roundTraceAverage(finalCountSum, totalCases),\n\t\taverageLexicalCount: roundTraceAverage(lexicalCountSum, totalCases),\n\t\taverageLexicalTopK: roundTraceAverage(lexicalTopKSum, totalCases),\n\t\tbalancedCases,\n\t\taverageVectorCount: roundTraceAverage(vectorCountSum, totalCases),\n\t\tlexicalCases,\n\t\tmodes: Array.from(modeSet),\n\t\troundRobinCases,\n\t\tsourceBalanceStrategies: Array.from(sourceBalanceStrategySet),\n\t\tstageCounts: buildTraceStageCounts(traces),\n\t\ttotalCases,\n\t\ttransformedCases,\n\t\tvariantCases,\n\t\tvectorCases\n\t};\n};\n\nconst evaluateRAGCollectionCases = async ({\n\tcollection,\n\tinput,\n\tdefaultTopK = DEFAULT_TOP_K,\n\trerank,\n\tincludeTrace = false\n}: {\n\tcollection: RAGCollection;\n\tinput: RAGEvaluationInput;\n\tdefaultTopK?: number;\n\trerank?: RAGRerankerProviderLike;\n\tincludeTrace?: boolean;\n}): Promise<\n\tArray<{\n\t\tcaseResult: RAGEvaluationCaseResult;\n\t\ttrace?: RAGRetrievalTrace;\n\t\tfilter?: Record<string, unknown>;\n\t\tretrieval?: RAGCollectionSearchParams['retrieval'];\n\t}>\n> => {\n\tif (input.dryRun) {\n\t\treturn executeDryRunRAGEvaluation(input, defaultTopK).map(\n\t\t\t(caseResult, caseIndex) => ({\n\t\t\t\tcaseResult,\n\t\t\t\tfilter:\n\t\t\t\t\ttypeof input.cases?.[caseIndex]?.filter === 'object'\n\t\t\t\t\t\t? input.cases[caseIndex]?.filter\n\t\t\t\t\t\t: input.filter,\n\t\t\t\tretrieval:\n\t\t\t\t\tinput.cases?.[caseIndex]?.retrieval ?? input.retrieval,\n\t\t\t\ttrace: undefined\n\t\t\t})\n\t\t);\n\t}\n\n\treturn Promise.all(\n\t\tinput.cases.map(async (caseInput, caseIndex) => {\n\t\t\tconst startedAt = Date.now();\n\t\t\tconst mode = resolveEvaluationMode(caseInput);\n\t\t\tconst query = caseInput.query.trim();\n\t\t\tconst expectedIds = normalizeExpectedIds(\n\t\t\t\tmode === 'chunkId'\n\t\t\t\t\t? (caseInput.expectedChunkIds ?? [])\n\t\t\t\t\t: mode === 'source'\n\t\t\t\t\t\t? (caseInput.expectedSources ?? [])\n\t\t\t\t\t\t: (caseInput.expectedDocumentIds ?? [])\n\t\t\t);\n\t\t\tconst topK =\n\t\t\t\ttypeof caseInput.topK === 'number'\n\t\t\t\t\t? caseInput.topK\n\t\t\t\t\t: typeof input.topK === 'number'\n\t\t\t\t\t\t? input.topK\n\t\t\t\t\t\t: defaultTopK;\n\t\t\tconst searchInput = {\n\t\t\t\tfilter: caseInput.corpusKey\n\t\t\t\t\t? {\n\t\t\t\t\t\t\t...((typeof caseInput.filter === 'object'\n\t\t\t\t\t\t\t\t? caseInput.filter\n\t\t\t\t\t\t\t\t: input.filter) ?? {}),\n\t\t\t\t\t\t\tcorpusKey: caseInput.corpusKey\n\t\t\t\t\t\t}\n\t\t\t\t\t: typeof caseInput.filter === 'object'\n\t\t\t\t\t\t? caseInput.filter\n\t\t\t\t\t\t: input.filter,\n\t\t\t\tmodel: caseInput.model ?? input.model,\n\t\t\t\tquery,\n\t\t\t\trerank,\n\t\t\t\tscoreThreshold:\n\t\t\t\t\ttypeof caseInput.scoreThreshold === 'number'\n\t\t\t\t\t\t? caseInput.scoreThreshold\n\t\t\t\t\t\t: input.scoreThreshold,\n\t\t\t\tretrieval: caseInput.retrieval ?? input.retrieval,\n\t\t\t\ttopK\n\t\t\t};\n\t\t\tconst searchOutcome = includeTrace\n\t\t\t\t? await collection.searchWithTrace(searchInput)\n\t\t\t\t: {\n\t\t\t\t\t\tresults: await collection.search(searchInput),\n\t\t\t\t\t\ttrace: undefined\n\t\t\t\t\t};\n\t\t\tconst sources = buildSources(searchOutcome.results);\n\t\t\tconst elapsedMs = Date.now() - startedAt;\n\t\t\tconst retrievedIds = normalizeExpectedIds(\n\t\t\t\tsources.map((source) => extractExpectedId(source, mode))\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tcaseResult: summarizeRAGEvaluationCase({\n\t\t\t\t\tcaseIndex,\n\t\t\t\t\tcaseInput: { ...caseInput, topK },\n\t\t\t\t\telapsedMs,\n\t\t\t\t\texpectedIds,\n\t\t\t\t\tmode,\n\t\t\t\t\tquery,\n\t\t\t\t\tretrievedIds\n\t\t\t\t}),\n\t\t\t\ttrace: searchOutcome.trace,\n\t\t\t\tfilter: searchInput.filter,\n\t\t\t\tretrieval: searchInput.retrieval\n\t\t\t};\n\t\t})\n\t);\n};\n\nexport const buildRAGAnswerGroundingCaseDifficultyLeaderboard = (\n\tentries: Array<{\n\t\tlabel: string;\n\t\tresponse: RAGAnswerGroundingEvaluationResponse;\n\t}>\n) => {\n\tconst grouped = new Map<\n\t\tstring,\n\t\t{\n\t\t\tcaseId: string;\n\t\t\tlabel?: string;\n\t\t\tquery?: string;\n\t\t\tpassCount: number;\n\t\t\tpartialCount: number;\n\t\t\tfailCount: number;\n\t\t\tgroundedCount: number;\n\t\t\ttotalEvaluations: number;\n\t\t\ttotalCitationF1: number;\n\t\t\ttotalResolvedCitationRate: number;\n\t\t}\n\t>();\n\n\tfor (const entry of entries) {\n\t\tfor (const result of entry.response.cases) {\n\t\t\tconst current = grouped.get(result.caseId) ?? {\n\t\t\t\tcaseId: result.caseId,\n\t\t\t\tfailCount: 0,\n\t\t\t\tgroundedCount: 0,\n\t\t\t\tlabel: result.label,\n\t\t\t\tpassCount: 0,\n\t\t\t\tpartialCount: 0,\n\t\t\t\tquery: result.query,\n\t\t\t\ttotalCitationF1: 0,\n\t\t\t\ttotalEvaluations: 0,\n\t\t\t\ttotalResolvedCitationRate: 0\n\t\t\t};\n\t\t\tcurrent.label ??= result.label;\n\t\t\tcurrent.query ??= result.query;\n\t\t\tcurrent.totalEvaluations += 1;\n\t\t\tcurrent.totalCitationF1 += result.citationF1;\n\t\t\tcurrent.totalResolvedCitationRate += result.resolvedCitationRate;\n\t\t\tif (result.status === 'pass') {\n\t\t\t\tcurrent.passCount += 1;\n\t\t\t} else if (result.status === 'partial') {\n\t\t\t\tcurrent.partialCount += 1;\n\t\t\t} else {\n\t\t\t\tcurrent.failCount += 1;\n\t\t\t}\n\t\t\tif (result.coverage === 'grounded') {\n\t\t\t\tcurrent.groundedCount += 1;\n\t\t\t}\n\t\t\tgrouped.set(result.caseId, current);\n\t\t}\n\t}\n\n\tconst ranked = Array.from(grouped.values()).sort((left, right) => {\n\t\tconst leftPassRate = left.passCount / left.totalEvaluations;\n\t\tconst rightPassRate = right.passCount / right.totalEvaluations;\n\t\tif (leftPassRate !== rightPassRate) {\n\t\t\treturn leftPassRate - rightPassRate;\n\t\t}\n\t\tconst leftCitationF1 = left.totalCitationF1 / left.totalEvaluations;\n\t\tconst rightCitationF1 = right.totalCitationF1 / right.totalEvaluations;\n\t\tif (leftCitationF1 !== rightCitationF1) {\n\t\t\treturn leftCitationF1 - rightCitationF1;\n\t\t}\n\t\tconst leftResolved =\n\t\t\tleft.totalResolvedCitationRate / left.totalEvaluations;\n\t\tconst rightResolved =\n\t\t\tright.totalResolvedCitationRate / right.totalEvaluations;\n\t\tif (leftResolved !== rightResolved) {\n\t\t\treturn leftResolved - rightResolved;\n\t\t}\n\n\t\treturn left.caseId.localeCompare(right.caseId);\n\t});\n\n\treturn ranked.map<RAGAnswerGroundingEvaluationCaseDifficultyEntry>(\n\t\t(entry, index) => ({\n\t\t\taverageCitationF1: entry.totalCitationF1 / entry.totalEvaluations,\n\t\t\taverageResolvedCitationRate:\n\t\t\t\tentry.totalResolvedCitationRate / entry.totalEvaluations,\n\t\t\tcaseId: entry.caseId,\n\t\t\tfailRate: (entry.failCount / entry.totalEvaluations) * 100,\n\t\t\tgroundedRate: (entry.groundedCount / entry.totalEvaluations) * 100,\n\t\t\tlabel: entry.label,\n\t\t\tpassRate: (entry.passCount / entry.totalEvaluations) * 100,\n\t\t\tpartialRate: (entry.partialCount / entry.totalEvaluations) * 100,\n\t\t\tquery: entry.query,\n\t\t\trank: index + 1,\n\t\t\ttotalEvaluations: entry.totalEvaluations\n\t\t})\n\t);\n};\n\nconst buildGroundingDifficultyDiffEntry = (\n\tcurrent: RAGAnswerGroundingEvaluationCaseDifficultyEntry,\n\tprevious?: RAGAnswerGroundingEvaluationCaseDifficultyEntry\n): RAGAnswerGroundingCaseDifficultyDiffEntry => ({\n\tcaseId: current.caseId,\n\tcurrentAverageCitationF1: current.averageCitationF1,\n\tcurrentFailRate: current.failRate,\n\tcurrentPassRate: current.passRate,\n\tcurrentRank: current.rank,\n\tlabel: current.label,\n\tpreviousAverageCitationF1: previous?.averageCitationF1,\n\tpreviousFailRate: previous?.failRate,\n\tpreviousPassRate: previous?.passRate,\n\tpreviousRank: previous?.rank,\n\tquery: current.query\n});\n\nconst buildRAGAnswerGroundingCaseDifficultyTrends = ({\n\truns\n}: {\n\truns: RAGAnswerGroundingCaseDifficultyRun[];\n}) => {\n\tconst movementCounts = new Map<\n\t\tstring,\n\t\t{\n\t\t\tlabel?: string;\n\t\t\tharder: number;\n\t\t\teasier: number;\n\t\t\tunchanged: number;\n\t\t}\n\t>();\n\n\tfor (let index = 0; index < runs.length - 1; index += 1) {\n\t\tconst current = runs[index];\n\t\tconst previous = runs[index + 1];\n\t\tif (!current || !previous) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst diff = buildRAGAnswerGroundingCaseDifficultyRunDiff({\n\t\t\tcurrent,\n\t\t\tprevious\n\t\t});\n\n\t\tfor (const entry of diff.harderCases) {\n\t\t\tconst currentCounts = movementCounts.get(entry.caseId) ?? {\n\t\t\t\teasier: 0,\n\t\t\t\tharder: 0,\n\t\t\t\tlabel: entry.label,\n\t\t\t\tunchanged: 0\n\t\t\t};\n\t\t\tcurrentCounts.harder += 1;\n\t\t\tcurrentCounts.label ??= entry.label;\n\t\t\tmovementCounts.set(entry.caseId, currentCounts);\n\t\t}\n\n\t\tfor (const entry of diff.easierCases) {\n\t\t\tconst currentCounts = movementCounts.get(entry.caseId) ?? {\n\t\t\t\teasier: 0,\n\t\t\t\tharder: 0,\n\t\t\t\tlabel: entry.label,\n\t\t\t\tunchanged: 0\n\t\t\t};\n\t\t\tcurrentCounts.easier += 1;\n\t\t\tcurrentCounts.label ??= entry.label;\n\t\t\tmovementCounts.set(entry.caseId, currentCounts);\n\t\t}\n\n\t\tfor (const entry of diff.unchangedCases) {\n\t\t\tconst currentCounts = movementCounts.get(entry.caseId) ?? {\n\t\t\t\teasier: 0,\n\t\t\t\tharder: 0,\n\t\t\t\tlabel: entry.label,\n\t\t\t\tunchanged: 0\n\t\t\t};\n\t\t\tcurrentCounts.unchanged += 1;\n\t\t\tcurrentCounts.label ??= entry.label;\n\t\t\tmovementCounts.set(entry.caseId, currentCounts);\n\t\t}\n\t}\n\n\tconst movementEntries = [...movementCounts.entries()];\n\tconst mostOftenHarderCaseIds = movementEntries\n\t\t.filter(([, counts]) => counts.harder > 0)\n\t\t.sort((left, right) => {\n\t\t\tif (right[1].harder !== left[1].harder) {\n\t\t\t\treturn right[1].harder - left[1].harder;\n\t\t\t}\n\t\t\treturn left[0].localeCompare(right[0]);\n\t\t})\n\t\t.map(([caseId]) => caseId);\n\tconst mostOftenEasierCaseIds = movementEntries\n\t\t.filter(([, counts]) => counts.easier > 0)\n\t\t.sort((left, right) => {\n\t\t\tif (right[1].easier !== left[1].easier) {\n\t\t\t\treturn right[1].easier - left[1].easier;\n\t\t\t}\n\t\t\treturn left[0].localeCompare(right[0]);\n\t\t})\n\t\t.map(([caseId]) => caseId);\n\n\treturn {\n\t\teasiestCaseIds:\n\t\t\truns[runs.length - 1]?.entries\n\t\t\t\t.map((entry) => entry.caseId)\n\t\t\t\t.reverse() ?? [],\n\t\thardestCaseIds: runs[0]?.entries.map((entry) => entry.caseId) ?? [],\n\t\tmostOftenEasierCaseIds,\n\t\tmostOftenHarderCaseIds,\n\t\tmovementCounts: Object.fromEntries(\n\t\t\tmovementEntries.map(([caseId, counts]) => [\n\t\t\t\tcaseId,\n\t\t\t\t{\n\t\t\t\t\teasier: counts.easier,\n\t\t\t\t\tharder: counts.harder,\n\t\t\t\t\tunchanged: counts.unchanged\n\t\t\t\t}\n\t\t\t])\n\t\t)\n\t};\n};\n\nexport const buildRAGAnswerGroundingCaseDifficultyRunDiff = ({\n\tcurrent,\n\tprevious\n}: {\n\tcurrent: RAGAnswerGroundingCaseDifficultyRun;\n\tprevious?: RAGAnswerGroundingCaseDifficultyRun;\n}): RAGAnswerGroundingCaseDifficultyRunDiff => {\n\tconst previousEntries = new Map(\n\t\t(previous?.entries ?? []).map((entry) => [entry.caseId, entry])\n\t);\n\tconst diffs = current.entries.map((entry) =>\n\t\tbuildGroundingDifficultyDiffEntry(\n\t\t\tentry,\n\t\t\tpreviousEntries.get(entry.caseId)\n\t\t)\n\t);\n\n\treturn {\n\t\tcurrentRunId: current.id,\n\t\teasierCases: diffs.filter((entry) => {\n\t\t\tconst previousRank = entry.previousRank ?? entry.currentRank;\n\t\t\treturn entry.currentRank > previousRank;\n\t\t}),\n\t\tharderCases: diffs.filter((entry) => {\n\t\t\tconst previousRank = entry.previousRank ?? Number.MAX_SAFE_INTEGER;\n\t\t\treturn entry.currentRank < previousRank;\n\t\t}),\n\t\tpreviousRunId: previous?.id,\n\t\tsuiteId: current.suiteId,\n\t\tunchangedCases: diffs.filter((entry) => {\n\t\t\tconst previousRank = entry.previousRank ?? entry.currentRank;\n\t\t\treturn entry.currentRank === previousRank;\n\t\t})\n\t};\n};\n\nconst toHistorySortOrder = (\n\tleft: RAGEvaluationSuiteRun,\n\tright: RAGEvaluationSuiteRun\n) => right.finishedAt - left.finishedAt;\n\nconst normalizeHistoryRuns = (runs: RAGEvaluationSuiteRun[]) =>\n\t[...runs].sort(toHistorySortOrder);\n\nconst normalizeRetrievalComparisonRuns = (runs: RAGRetrievalComparisonRun[]) =>\n\t[...runs].sort((left, right) => right.finishedAt - left.finishedAt);\n\nconst toTraceSummaryRunSortOrder = (\n\tleft: RAGRetrievalTraceSummaryRun,\n\tright: RAGRetrievalTraceSummaryRun\n) => right.finishedAt - left.finishedAt;\n\nconst normalizeTraceSummaryRuns = <TRun extends RAGRetrievalTraceSummaryRun>(\n\truns: TRun[]\n) => [...runs].sort(toTraceSummaryRunSortOrder);\n\nconst applyRAGSearchTracePrunePolicy = ({\n\tinput,\n\ttraces\n}: {\n\tinput?: RAGSearchTracePruneInput;\n\ttraces: RAGSearchTraceRecord[];\n}) => {\n\tconst sorted = normalizeTraceSummaryRuns(traces);\n\tconst matchesTag = (trace: RAGSearchTraceRecord) =>\n\t\t!input?.tag || (trace.tags ?? []).includes(input.tag);\n\tconst targeted = sorted.filter(matchesTag);\n\tconst untouched = sorted.filter((trace) => !matchesTag(trace));\n\tconst now = input?.now ?? Date.now();\n\tlet kept = [...targeted];\n\n\tif (\n\t\ttypeof input?.maxAgeMs === 'number' &&\n\t\tNumber.isFinite(input.maxAgeMs)\n\t) {\n\t\tconst cutoff = now - input.maxAgeMs;\n\t\tkept = kept.filter((trace) => trace.finishedAt >= cutoff);\n\t}\n\n\tif (\n\t\ttypeof input?.maxRecordsPerQuery === 'number' &&\n\t\tNumber.isFinite(input.maxRecordsPerQuery) &&\n\t\tinput.maxRecordsPerQuery >= 0\n\t) {\n\t\tconst remainingByQuery = new Map<string, number>();\n\t\tkept = kept.filter((trace) => {\n\t\t\tconst current = remainingByQuery.get(trace.query) ?? 0;\n\t\t\tif (current >= input.maxRecordsPerQuery!) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tremainingByQuery.set(trace.query, current + 1);\n\t\t\treturn true;\n\t\t});\n\t}\n\n\tif (\n\t\ttypeof input?.maxRecordsPerGroup === 'number' &&\n\t\tNumber.isFinite(input.maxRecordsPerGroup) &&\n\t\tinput.maxRecordsPerGroup >= 0\n\t) {\n\t\tconst remainingByGroup = new Map<string, number>();\n\t\tkept = kept.filter((trace) => {\n\t\t\tif (!trace.groupKey) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tconst current = remainingByGroup.get(trace.groupKey) ?? 0;\n\t\t\tif (current >= input.maxRecordsPerGroup!) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tremainingByGroup.set(trace.groupKey, current + 1);\n\t\t\treturn true;\n\t\t});\n\t}\n\n\tconst keptIds = new Set(kept.map((trace) => trace.id));\n\tconst removed = targeted.filter((trace) => !keptIds.has(trace.id));\n\tconst next = normalizeTraceSummaryRuns([...untouched, ...kept]);\n\n\treturn {\n\t\tkeptCount: next.length,\n\t\tnext,\n\t\tremoved,\n\t\tremovedCount: removed.length\n\t};\n};\n\nconst buildRAGSearchTraceStatsFromTraces = (\n\ttraces: RAGSearchTraceRecord[]\n): RAGSearchTraceStats => {\n\tconst queryKeys = new Set<string>();\n\tconst groupKeys = new Set<string>();\n\tconst tagCounts = new Map<string, number>();\n\tlet oldestFinishedAt: number | undefined;\n\tlet newestFinishedAt: number | undefined;\n\n\tfor (const trace of traces) {\n\t\tqueryKeys.add(trace.query);\n\t\tif (trace.groupKey) {\n\t\t\tgroupKeys.add(trace.groupKey);\n\t\t}\n\t\tfor (const tag of trace.tags ?? []) {\n\t\t\ttagCounts.set(tag, (tagCounts.get(tag) ?? 0) + 1);\n\t\t}\n\t\toldestFinishedAt =\n\t\t\ttypeof oldestFinishedAt === 'number'\n\t\t\t\t? Math.min(oldestFinishedAt, trace.finishedAt)\n\t\t\t\t: trace.finishedAt;\n\t\tnewestFinishedAt =\n\t\t\ttypeof newestFinishedAt === 'number'\n\t\t\t\t? Math.max(newestFinishedAt, trace.finishedAt)\n\t\t\t\t: trace.finishedAt;\n\t}\n\n\treturn {\n\t\tgroupCount: groupKeys.size,\n\t\tnewestFinishedAt,\n\t\toldestFinishedAt,\n\t\tqueryCount: queryKeys.size,\n\t\ttagCounts: Object.fromEntries(tagCounts.entries()),\n\t\ttotalTraces: traces.length\n\t};\n};\n\nconst normalizeTraceTags = (tags?: string[]) =>\n\tArray.from(\n\t\tnew Set((tags ?? []).map((tag) => tag.trim()).filter(Boolean))\n\t).sort((left, right) => left.localeCompare(right));\n\nconst toGroundingHistorySortOrder = (\n\tleft: RAGAnswerGroundingEvaluationRun,\n\tright: RAGAnswerGroundingEvaluationRun\n) => right.finishedAt - left.finishedAt;\n\nconst normalizeGroundingHistoryRuns = (\n\truns: RAGAnswerGroundingEvaluationRun[]\n) => [...runs].sort(toGroundingHistorySortOrder);\n\nconst toSearchTracePruneRunSortOrder = (\n\tleft: RAGSearchTracePruneRun,\n\tright: RAGSearchTracePruneRun\n) => right.finishedAt - left.finishedAt;\n\nconst normalizeSearchTracePruneRuns = (runs: RAGSearchTracePruneRun[]) =>\n\t[...runs].sort(toSearchTracePruneRunSortOrder);\n\nconst toGroundingDifficultyHistorySortOrder = (\n\tleft: RAGAnswerGroundingCaseDifficultyRun,\n\tright: RAGAnswerGroundingCaseDifficultyRun\n) => right.finishedAt - left.finishedAt;\n\nconst normalizeGroundingDifficultyHistoryRuns = (\n\truns: RAGAnswerGroundingCaseDifficultyRun[]\n) => [...runs].sort(toGroundingDifficultyHistorySortOrder);\n\nconst buildCaseDiff = (\n\tcurrentCase: RAGEvaluationCaseResult,\n\tpreviousCase?: RAGEvaluationCaseResult\n): RAGEvaluationCaseDiff => ({\n\tcaseId: currentCase.caseId,\n\tcurrentF1: currentCase.f1,\n\tcurrentMatchedIds: currentCase.matchedIds,\n\tcurrentMissingIds: currentCase.missingIds,\n\tcurrentStatus: currentCase.status,\n\tlabel: currentCase.label,\n\tpreviousF1: previousCase?.f1,\n\tpreviousMatchedIds: previousCase?.matchedIds ?? [],\n\tpreviousMissingIds: previousCase?.missingIds ?? [],\n\tpreviousStatus: previousCase?.status,\n\tquery: currentCase.query\n});\n\nconst buildGroundingCaseDiff = (\n\tcurrentCase: RAGAnswerGroundingEvaluationCaseResult,\n\tpreviousCase?: RAGAnswerGroundingEvaluationCaseResult\n): RAGAnswerGroundingEvaluationCaseDiff => ({\n\tanswerChanged:\n\t\ttypeof previousCase?.answer === 'string'\n\t\t\t? previousCase.answer !== currentCase.answer\n\t\t\t: true,\n\tcaseId: currentCase.caseId,\n\tcurrentCitationF1: currentCase.citationF1,\n\tcurrentCitedIds: currentCase.citedIds,\n\tcurrentCoverage: currentCase.coverage,\n\tcurrentExtraIds: currentCase.extraIds,\n\tcurrentMatchedIds: currentCase.matchedIds,\n\tcurrentMissingIds: currentCase.missingIds,\n\tcurrentReferenceCount: currentCase.referenceCount,\n\tcurrentResolvedCitationCount: currentCase.resolvedCitationCount,\n\tcurrentAnswer: currentCase.answer,\n\tcurrentStatus: currentCase.status,\n\tcurrentUngroundedReferenceNumbers:\n\t\tcurrentCase.groundedAnswer.ungroundedReferenceNumbers,\n\tcurrentUnresolvedCitationCount: currentCase.unresolvedCitationCount,\n\tlabel: currentCase.label,\n\tpreviousAnswer: previousCase?.answer,\n\tpreviousCitationF1: previousCase?.citationF1,\n\tpreviousCitedIds: previousCase?.citedIds ?? [],\n\tpreviousCoverage: previousCase?.coverage,\n\tpreviousExtraIds: previousCase?.extraIds ?? [],\n\tpreviousMatchedIds: previousCase?.matchedIds ?? [],\n\tpreviousMissingIds: previousCase?.missingIds ?? [],\n\tpreviousReferenceCount: previousCase?.referenceCount,\n\tpreviousResolvedCitationCount: previousCase?.resolvedCitationCount,\n\tpreviousStatus: previousCase?.status,\n\tpreviousUngroundedReferenceNumbers:\n\t\tpreviousCase?.groundedAnswer.ungroundedReferenceNumbers ?? [],\n\tpreviousUnresolvedCitationCount: previousCase?.unresolvedCitationCount,\n\tquery: currentCase.query\n});\n\nconst buildGroundingCaseSnapshots = ({\n\tcurrent,\n\tprevious\n}: {\n\tcurrent?: RAGAnswerGroundingEvaluationRun;\n\tprevious?: RAGAnswerGroundingEvaluationRun;\n}): RAGAnswerGroundingEvaluationCaseSnapshot[] => {\n\tif (!current) {\n\t\treturn [];\n\t}\n\n\tconst previousCases = new Map(\n\t\t(previous?.response.cases ?? []).map((entry) => [entry.caseId, entry])\n\t);\n\n\treturn current.response.cases.map((entry) => {\n\t\tconst previousCase = previousCases.get(entry.caseId);\n\t\treturn {\n\t\t\tanswer: entry.answer,\n\t\t\tanswerChange:\n\t\t\t\ttypeof previousCase?.answer === 'string'\n\t\t\t\t\t? previousCase.answer === entry.answer\n\t\t\t\t\t\t? 'unchanged'\n\t\t\t\t\t\t: 'changed'\n\t\t\t\t\t: 'new',\n\t\t\tcaseId: entry.caseId,\n\t\t\tcitationCount: entry.citationCount,\n\t\t\tcitationF1: entry.citationF1,\n\t\t\tcitedIds: entry.citedIds,\n\t\t\tcoverage: entry.coverage,\n\t\t\textraIds: entry.extraIds,\n\t\t\tlabel: entry.label,\n\t\t\tmatchedIds: entry.matchedIds,\n\t\t\tmissingIds: entry.missingIds,\n\t\t\tpreviousAnswer: previousCase?.answer,\n\t\t\tquery: entry.query,\n\t\t\treferenceCount: entry.referenceCount,\n\t\t\tresolvedCitationCount: entry.resolvedCitationCount,\n\t\t\tresolvedCitationRate: entry.resolvedCitationRate,\n\t\t\tstatus: entry.status,\n\t\t\tungroundedReferenceNumbers:\n\t\t\t\tentry.groundedAnswer.ungroundedReferenceNumbers,\n\t\t\tunresolvedCitationCount: entry.unresolvedCitationCount\n\t\t};\n\t});\n};\n\nconst areStageCountsEqual = (\n\tleft: Partial<Record<RAGRetrievalTraceStage, number>>,\n\tright: Partial<Record<RAGRetrievalTraceStage, number>>\n) => {\n\tconst keys = new Set([\n\t\t...Object.keys(left),\n\t\t...Object.keys(right)\n\t]) as Set<RAGRetrievalTraceStage>;\n\n\tfor (const key of keys) {\n\t\tif ((left[key] ?? 0) !== (right[key] ?? 0)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n};\n\nconst buildEvaluationCaseTraceSnapshot = ({\n\tcaseResult,\n\tfilter,\n\tretrieval,\n\tcurrentTrace,\n\tpreviousTrace\n}: {\n\tcaseResult: RAGEvaluationCaseResult;\n\tfilter?: Record<string, unknown>;\n\tretrieval?: RAGCollectionSearchParams['retrieval'];\n\tcurrentTrace?: RAGRetrievalTrace;\n\tpreviousTrace?: RAGEvaluationCaseTraceSnapshot;\n}): RAGEvaluationCaseTraceSnapshot => {\n\tconst stageCounts = currentTrace\n\t\t? buildTraceStageCounts([currentTrace])\n\t\t: {};\n\tconst previousStageCounts = previousTrace?.stageCounts ?? {};\n\tconst currentFilterSignature = JSON.stringify(filter ?? undefined);\n\tconst previousFilterSignature = JSON.stringify(\n\t\tpreviousTrace?.inputFilter ?? undefined\n\t);\n\tconst currentRetrievalSignature = JSON.stringify(retrieval ?? undefined);\n\tconst previousRetrievalSignature = JSON.stringify(\n\t\tpreviousTrace?.inputRetrieval ?? undefined\n\t);\n\tconst traceChange = !previousTrace\n\t\t? currentTrace\n\t\t\t? 'new'\n\t\t\t: 'unchanged'\n\t\t: previousTrace.traceMode !== currentTrace?.mode ||\n\t\t\t previousFilterSignature !== currentFilterSignature ||\n\t\t\t previousRetrievalSignature !== currentRetrievalSignature ||\n\t\t\t previousTrace.sourceBalanceStrategy !==\n\t\t\t\t\tcurrentTrace?.sourceBalanceStrategy ||\n\t\t\t previousTrace.transformedQuery !==\n\t\t\t\t\t(currentTrace?.transformedQuery || undefined) ||\n\t\t\t previousTrace.variantQueries.join('|') !==\n\t\t\t\t\t(currentTrace?.variantQueries ?? []).join('|') ||\n\t\t\t previousTrace.finalCount !==\n\t\t\t\t\t(currentTrace?.resultCounts.final ?? 0) ||\n\t\t\t previousTrace.vectorCount !==\n\t\t\t\t\t(currentTrace?.resultCounts.vector ?? 0) ||\n\t\t\t previousTrace.lexicalCount !==\n\t\t\t\t\t(currentTrace?.resultCounts.lexical ?? 0) ||\n\t\t\t previousTrace.candidateTopK !==\n\t\t\t\t\t(currentTrace?.candidateTopK ?? 0) ||\n\t\t\t previousTrace.lexicalTopK !== (currentTrace?.lexicalTopK ?? 0) ||\n\t\t\t !areStageCountsEqual(previousStageCounts, stageCounts)\n\t\t\t? 'changed'\n\t\t\t: 'unchanged';\n\n\treturn {\n\t\tcandidateTopK: currentTrace?.candidateTopK ?? 0,\n\t\tcaseId: caseResult.caseId,\n\t\tcorpusKey: caseResult.corpusKey,\n\t\tinputFilter: filter,\n\t\tfinalCount: currentTrace?.resultCounts.final ?? 0,\n\t\tlabel: caseResult.label,\n\t\tlexicalCount: currentTrace?.resultCounts.lexical ?? 0,\n\t\tlexicalTopK: currentTrace?.lexicalTopK ?? 0,\n\t\tinputRetrieval: retrieval,\n\t\tpreviousCandidateTopK: previousTrace?.candidateTopK,\n\t\tpreviousFinalCount: previousTrace?.finalCount,\n\t\tpreviousLexicalCount: previousTrace?.lexicalCount,\n\t\tpreviousLexicalTopK: previousTrace?.lexicalTopK,\n\t\tpreviousInputFilter: previousTrace?.inputFilter,\n\t\tpreviousInputRetrieval: previousTrace?.inputRetrieval,\n\t\tpreviousSourceBalanceStrategy: previousTrace?.sourceBalanceStrategy,\n\t\tpreviousStageCounts,\n\t\tpreviousTraceMode: previousTrace?.traceMode,\n\t\tpreviousTransformedQuery: previousTrace?.transformedQuery,\n\t\tpreviousVariantQueries: previousTrace?.variantQueries ?? [],\n\t\tpreviousVectorCount: previousTrace?.vectorCount,\n\t\tquery: caseResult.query,\n\t\tstageCounts,\n\t\tstatus: caseResult.status,\n\t\tsourceBalanceStrategy: currentTrace?.sourceBalanceStrategy,\n\t\ttraceChange,\n\t\ttraceMode: currentTrace?.mode,\n\t\ttransformedQuery: currentTrace?.transformedQuery || undefined,\n\t\tvariantQueries: currentTrace?.variantQueries ?? [],\n\t\tvectorCount: currentTrace?.resultCounts.vector ?? 0\n\t};\n};\n\nconst buildEvaluationCaseTraceSnapshotsFromEvaluated = (\n\tevaluated: Array<{\n\t\tcaseResult: RAGEvaluationCaseResult;\n\t\ttrace?: RAGRetrievalTrace;\n\t\tfilter?: Record<string, unknown>;\n\t\tretrieval?: RAGCollectionSearchParams['retrieval'];\n\t}>\n): RAGEvaluationCaseTraceSnapshot[] =>\n\tevaluated.map(({ caseResult, filter, retrieval, trace }) =>\n\t\tbuildEvaluationCaseTraceSnapshot({\n\t\t\tcaseResult,\n\t\t\tfilter,\n\t\t\tretrieval,\n\t\t\tcurrentTrace: trace\n\t\t})\n\t);\n\nconst buildEvaluationCaseTraceSnapshots = ({\n\tcurrent,\n\tprevious\n}: {\n\tcurrent?: RAGEvaluationSuiteRun;\n\tprevious?: RAGEvaluationSuiteRun;\n}): RAGEvaluationCaseTraceSnapshot[] => {\n\tif (!current) {\n\t\treturn [];\n\t}\n\n\tconst currentTraces = new Map(\n\t\t(current.caseTraceSnapshots ?? []).map((entry) => [entry.caseId, entry])\n\t);\n\tconst previousTraces = new Map(\n\t\t(previous?.caseTraceSnapshots ?? []).map((entry) => [\n\t\t\tentry.caseId,\n\t\t\tentry\n\t\t])\n\t);\n\n\treturn current.response.cases.map((caseResult) =>\n\t\tbuildEvaluationCaseTraceSnapshot({\n\t\t\tcaseResult,\n\t\t\tcurrentTrace: (() => {\n\t\t\t\tconst currentSnapshot = currentTraces.get(caseResult.caseId);\n\t\t\t\tif (!currentSnapshot) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tcandidateTopK: currentSnapshot.candidateTopK,\n\t\t\t\t\tlexicalTopK: currentSnapshot.lexicalTopK,\n\t\t\t\t\tmode: currentSnapshot.traceMode ?? 'vector',\n\t\t\t\t\tquery: caseResult.query,\n\t\t\t\t\tresultCounts: {\n\t\t\t\t\t\tfinal: currentSnapshot.finalCount,\n\t\t\t\t\t\tfused: currentSnapshot.finalCount,\n\t\t\t\t\t\tlexical: currentSnapshot.lexicalCount,\n\t\t\t\t\t\treranked: currentSnapshot.finalCount,\n\t\t\t\t\t\tvector: currentSnapshot.vectorCount\n\t\t\t\t\t},\n\t\t\t\t\trunLexical: currentSnapshot.lexicalCount > 0,\n\t\t\t\t\trunVector: currentSnapshot.vectorCount > 0,\n\t\t\t\t\tsourceBalanceStrategy:\n\t\t\t\t\t\tcurrentSnapshot.sourceBalanceStrategy ?? 'cap',\n\t\t\t\t\tsteps: [],\n\t\t\t\t\ttopK: caseResult.topK,\n\t\t\t\t\ttransformedQuery:\n\t\t\t\t\t\tcurrentSnapshot.transformedQuery ?? caseResult.query,\n\t\t\t\t\tvariantQueries: currentSnapshot.variantQueries\n\t\t\t\t} satisfies RAGRetrievalTrace;\n\t\t\t})(),\n\t\t\tpreviousTrace: previousTraces.get(caseResult.caseId)\n\t\t})\n\t);\n};\n\nconst getStatusRank = (status: RAGEvaluationCaseResult['status']) =>\n\tstatus === 'pass' ? 2 : status === 'partial' ? 1 : 0;\n\nexport const buildRAGEvaluationRunDiff = ({\n\tcurrent,\n\tprevious\n}: {\n\tcurrent: RAGEvaluationSuiteRun;\n\tprevious?: RAGEvaluationSuiteRun;\n}): RAGEvaluationRunDiff => {\n\tconst previousCases = new Map(\n\t\t(previous?.response.cases ?? []).map((entry) => [entry.caseId, entry])\n\t);\n\tconst diffs = current.response.cases.map((entry) =>\n\t\tbuildCaseDiff(entry, previousCases.get(entry.caseId))\n\t);\n\tconst regressedCases = diffs.filter(\n\t\t(entry) =>\n\t\t\tgetStatusRank(entry.currentStatus) <\n\t\t\tgetStatusRank(entry.previousStatus ?? 'fail')\n\t);\n\tconst improvedCases = diffs.filter(\n\t\t(entry) =>\n\t\t\tgetStatusRank(entry.currentStatus) >\n\t\t\tgetStatusRank(entry.previousStatus ?? 'fail')\n\t);\n\tconst unchangedCases = diffs.filter(\n\t\t(entry) =>\n\t\t\tgetStatusRank(entry.currentStatus) ===\n\t\t\tgetStatusRank(entry.previousStatus ?? 'fail')\n\t);\n\n\treturn {\n\t\tcurrentRunId: current.id,\n\t\timprovedCases,\n\t\tpreviousRunId: previous?.id,\n\t\tregressedCases,\n\t\tsuiteId: current.suiteId,\n\t\tsummaryDelta: {\n\t\t\taverageF1:\n\t\t\t\tcurrent.response.summary.averageF1 -\n\t\t\t\t(previous?.response.summary.averageF1 ?? 0),\n\t\t\taverageLatencyMs:\n\t\t\t\tcurrent.response.summary.averageLatencyMs -\n\t\t\t\t(previous?.response.summary.averageLatencyMs ?? 0),\n\t\t\tfailedCases:\n\t\t\t\tcurrent.response.summary.failedCases -\n\t\t\t\t(previous?.response.summary.failedCases ?? 0),\n\t\t\tpassedCases:\n\t\t\t\tcurrent.response.summary.passedCases -\n\t\t\t\t(previous?.response.summary.passedCases ?? 0),\n\t\t\tpassingRate:\n\t\t\t\tcurrent.response.passingRate -\n\t\t\t\t(previous?.response.passingRate ?? 0),\n\t\t\tpartialCases:\n\t\t\t\tcurrent.response.summary.partialCases -\n\t\t\t\t(previous?.response.summary.partialCases ?? 0)\n\t\t},\n\t\ttraceSummaryDelta:\n\t\t\tcurrent.traceSummary || previous?.traceSummary\n\t\t\t\t? {\n\t\t\t\t\t\taverageCandidateTopK:\n\t\t\t\t\t\t\t(current.traceSummary?.averageCandidateTopK ?? 0) -\n\t\t\t\t\t\t\t(previous?.traceSummary?.averageCandidateTopK ?? 0),\n\t\t\t\t\t\taverageFinalCount:\n\t\t\t\t\t\t\t(current.traceSummary?.averageFinalCount ?? 0) -\n\t\t\t\t\t\t\t(previous?.traceSummary?.averageFinalCount ?? 0),\n\t\t\t\t\t\taverageLexicalCount:\n\t\t\t\t\t\t\t(current.traceSummary?.averageLexicalCount ?? 0) -\n\t\t\t\t\t\t\t(previous?.traceSummary?.averageLexicalCount ?? 0),\n\t\t\t\t\t\taverageLexicalTopK:\n\t\t\t\t\t\t\t(current.traceSummary?.averageLexicalTopK ?? 0) -\n\t\t\t\t\t\t\t(previous?.traceSummary?.averageLexicalTopK ?? 0),\n\t\t\t\t\t\taverageVectorCount:\n\t\t\t\t\t\t\t(current.traceSummary?.averageVectorCount ?? 0) -\n\t\t\t\t\t\t\t(previous?.traceSummary?.averageVectorCount ?? 0),\n\t\t\t\t\t\tbalancedCases:\n\t\t\t\t\t\t\t(current.traceSummary?.balancedCases ?? 0) -\n\t\t\t\t\t\t\t(previous?.traceSummary?.balancedCases ?? 0),\n\t\t\t\t\t\tlexicalCases:\n\t\t\t\t\t\t\t(current.traceSummary?.lexicalCases ?? 0) -\n\t\t\t\t\t\t\t(previous?.traceSummary?.lexicalCases ?? 0),\n\t\t\t\t\t\tmodesChanged:\n\t\t\t\t\t\t\t(current.traceSummary?.modes ?? []).join('|') !==\n\t\t\t\t\t\t\t(previous?.traceSummary?.modes ?? []).join('|'),\n\t\t\t\t\t\troundRobinCases:\n\t\t\t\t\t\t\t(current.traceSummary?.roundRobinCases ?? 0) -\n\t\t\t\t\t\t\t(previous?.traceSummary?.roundRobinCases ?? 0),\n\t\t\t\t\t\tstageCounts: diffTraceStageCounts({\n\t\t\t\t\t\t\tcurrent: current.traceSummary?.stageCounts ?? {},\n\t\t\t\t\t\t\tprevious: previous?.traceSummary?.stageCounts ?? {}\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tsourceBalanceStrategiesChanged:\n\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\tcurrent.traceSummary?.sourceBalanceStrategies ??\n\t\t\t\t\t\t\t\t[]\n\t\t\t\t\t\t\t).join('|') !==\n\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\tprevious?.traceSummary\n\t\t\t\t\t\t\t\t\t?.sourceBalanceStrategies ?? []\n\t\t\t\t\t\t\t).join('|'),\n\t\t\t\t\t\ttransformedCases:\n\t\t\t\t\t\t\t(current.traceSummary?.transformedCases ?? 0) -\n\t\t\t\t\t\t\t(previous?.traceSummary?.transformedCases ?? 0),\n\t\t\t\t\t\tvariantCases:\n\t\t\t\t\t\t\t(current.traceSummary?.variantCases ?? 0) -\n\t\t\t\t\t\t\t(previous?.traceSummary?.variantCases ?? 0),\n\t\t\t\t\t\tvectorCases:\n\t\t\t\t\t\t\t(current.traceSummary?.vectorCases ?? 0) -\n\t\t\t\t\t\t\t(previous?.traceSummary?.vectorCases ?? 0)\n\t\t\t\t\t}\n\t\t\t\t: undefined,\n\t\tunchangedCases\n\t};\n};\n\nexport const buildRAGAnswerGroundingEvaluationRunDiff = ({\n\tcurrent,\n\tprevious\n}: {\n\tcurrent: RAGAnswerGroundingEvaluationRun;\n\tprevious?: RAGAnswerGroundingEvaluationRun;\n}): RAGAnswerGroundingEvaluationRunDiff => {\n\tconst previousCases = new Map(\n\t\t(previous?.response.cases ?? []).map((entry) => [entry.caseId, entry])\n\t);\n\tconst diffs = current.response.cases.map((entry) =>\n\t\tbuildGroundingCaseDiff(entry, previousCases.get(entry.caseId))\n\t);\n\tconst regressedCases = diffs.filter(\n\t\t(entry) =>\n\t\t\tgetStatusRank(entry.currentStatus) <\n\t\t\tgetStatusRank(entry.previousStatus ?? 'fail')\n\t);\n\tconst improvedCases = diffs.filter(\n\t\t(entry) =>\n\t\t\tgetStatusRank(entry.currentStatus) >\n\t\t\tgetStatusRank(entry.previousStatus ?? 'fail')\n\t);\n\tconst unchangedCases = diffs.filter(\n\t\t(entry) =>\n\t\t\tgetStatusRank(entry.currentStatus) ===\n\t\t\tgetStatusRank(entry.previousStatus ?? 'fail')\n\t);\n\n\treturn {\n\t\tcurrentRunId: current.id,\n\t\timprovedCases,\n\t\tpreviousRunId: previous?.id,\n\t\tregressedCases,\n\t\tsuiteId: current.suiteId,\n\t\tsummaryDelta: {\n\t\t\taverageCitationF1:\n\t\t\t\tcurrent.response.summary.averageCitationF1 -\n\t\t\t\t(previous?.response.summary.averageCitationF1 ?? 0),\n\t\t\taverageResolvedCitationRate:\n\t\t\t\tcurrent.response.summary.averageResolvedCitationRate -\n\t\t\t\t(previous?.response.summary.averageResolvedCitationRate ?? 0),\n\t\t\tfailedCases:\n\t\t\t\tcurrent.response.summary.failedCases -\n\t\t\t\t(previous?.response.summary.failedCases ?? 0),\n\t\t\tpassedCases:\n\t\t\t\tcurrent.response.summary.passedCases -\n\t\t\t\t(previous?.response.summary.passedCases ?? 0),\n\t\t\tpassingRate:\n\t\t\t\tcurrent.response.passingRate -\n\t\t\t\t(previous?.response.passingRate ?? 0),\n\t\t\tpartialCases:\n\t\t\t\tcurrent.response.summary.partialCases -\n\t\t\t\t(previous?.response.summary.partialCases ?? 0)\n\t\t},\n\t\tunchangedCases\n\t};\n};\n\nexport const createRAGFileEvaluationHistoryStore = (\n\tpath: string\n): RAGEvaluationHistoryStore => ({\n\tlistRuns: async ({ limit, suiteId } = {}) => {\n\t\tlet parsed: RAGEvaluationSuiteRun[] = [];\n\t\ttry {\n\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\tconst value = JSON.parse(content);\n\t\t\tparsed = Array.isArray(value) ? value : [];\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tconst filtered = parsed.filter(\n\t\t\t(entry) => !suiteId || entry.suiteId === suiteId\n\t\t);\n\t\tconst sorted = normalizeHistoryRuns(filtered);\n\t\treturn typeof limit === 'number' ? sorted.slice(0, limit) : sorted;\n\t},\n\tsaveRun: async (run) => {\n\t\tconst existing = await (async () => {\n\t\t\ttry {\n\t\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\t\tconst value = JSON.parse(content);\n\t\t\t\treturn Array.isArray(value) ? value : [];\n\t\t\t} catch (error) {\n\t\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\treturn [];\n\t\t\t}\n\t\t})();\n\t\tconst next = normalizeHistoryRuns([\n\t\t\trun,\n\t\t\t...existing.filter(\n\t\t\t\t(entry: RAGEvaluationSuiteRun) => entry.id !== run.id\n\t\t\t)\n\t\t]);\n\t\tawait mkdir(dirname(path), { recursive: true });\n\t\tawait writeFile(path, JSON.stringify(next, null, '\\t') + '\\n', 'utf8');\n\t}\n});\n\nexport const createRAGFileRetrievalComparisonHistoryStore = (\n\tpath: string\n): RAGRetrievalComparisonHistoryStore => ({\n\tlistRuns: async ({\n\t\tgroupKey,\n\t\tlabel,\n\t\tlimit,\n\t\tsuiteId,\n\t\ttag,\n\t\twinnerId\n\t} = {}) => {\n\t\tlet parsed: RAGRetrievalComparisonRun[] = [];\n\t\ttry {\n\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\tconst value = JSON.parse(content);\n\t\t\tparsed = Array.isArray(value) ? value : [];\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tconst normalizedLabel = normalizeLabelFilter(label);\n\t\tconst filtered = parsed.filter(\n\t\t\t(entry) =>\n\t\t\t\t(!suiteId || entry.suiteId === suiteId) &&\n\t\t\t\t(!groupKey || entry.groupKey === groupKey) &&\n\t\t\t\t(!tag || (entry.tags ?? []).includes(tag)) &&\n\t\t\t\t(!normalizedLabel ||\n\t\t\t\t\tentry.label.toLowerCase().includes(normalizedLabel) ||\n\t\t\t\t\tentry.suiteLabel.toLowerCase().includes(normalizedLabel)) &&\n\t\t\t\tmatchesWinner(entry, winnerId)\n\t\t);\n\t\tconst sorted = normalizeRetrievalComparisonRuns(filtered);\n\t\treturn typeof limit === 'number' ? sorted.slice(0, limit) : sorted;\n\t},\n\tsaveRun: async (run) => {\n\t\tconst existing = await (async () => {\n\t\t\ttry {\n\t\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\t\tconst value = JSON.parse(content);\n\t\t\t\treturn Array.isArray(value) ? value : [];\n\t\t\t} catch (error) {\n\t\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\treturn [];\n\t\t\t}\n\t\t})();\n\t\tconst next = normalizeRetrievalComparisonRuns([\n\t\t\trun,\n\t\t\t...existing.filter(\n\t\t\t\t(entry: RAGRetrievalComparisonRun) => entry.id !== run.id\n\t\t\t)\n\t\t]);\n\t\tawait mkdir(dirname(path), { recursive: true });\n\t\tawait writeFile(path, JSON.stringify(next, null, '\\t') + '\\n', 'utf8');\n\t}\n});\n\nexport const createRAGFileRetrievalBaselineStore = (\n\tpath: string\n): RAGRetrievalBaselineStore => {\n\tconst listBaselines: RAGRetrievalBaselineStore['listBaselines'] = async ({\n\t\tgroupKey,\n\t\tlimit,\n\t\ttag,\n\t\tstatus\n\t} = {}) => {\n\t\tlet parsed: RAGRetrievalBaselineRecord[] = [];\n\t\ttry {\n\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\tconst value = JSON.parse(content);\n\t\t\tparsed = Array.isArray(value) ? value : [];\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tconst filtered = parsed.filter(\n\t\t\t(entry) =>\n\t\t\t\t(!groupKey || entry.groupKey === groupKey) &&\n\t\t\t\t(!tag || (entry.tags ?? []).includes(tag)) &&\n\t\t\t\t(!status || entry.status === status)\n\t\t);\n\t\tconst sorted = normalizeRetrievalBaselineRecords(filtered);\n\t\treturn typeof limit === 'number' ? sorted.slice(0, limit) : sorted;\n\t};\n\n\treturn {\n\t\tgetBaseline: async (groupKey) => {\n\t\t\tconst baselines = await Promise.resolve(\n\t\t\t\tlistBaselines({ groupKey, limit: 1 })\n\t\t\t);\n\t\t\treturn baselines[0] ?? null;\n\t\t},\n\t\tlistBaselines,\n\t\tsaveBaseline: async (record) => {\n\t\t\tconst existing = await (async () => {\n\t\t\t\ttry {\n\t\t\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\t\t\tconst value = JSON.parse(content);\n\t\t\t\t\treturn Array.isArray(value) ? value : [];\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t}\n\t\t\t\t\treturn [];\n\t\t\t\t}\n\t\t\t})();\n\t\t\tconst currentVersion =\n\t\t\t\texisting\n\t\t\t\t\t.filter(\n\t\t\t\t\t\t(entry: RAGRetrievalBaselineRecord) =>\n\t\t\t\t\t\t\tentry.groupKey === record.groupKey\n\t\t\t\t\t)\n\t\t\t\t\t.reduce(\n\t\t\t\t\t\t(max, entry) => Math.max(max, entry.version ?? 0),\n\t\t\t\t\t\t0\n\t\t\t\t\t) ?? 0;\n\t\t\tconst next = normalizeRetrievalBaselineRecords([\n\t\t\t\t{\n\t\t\t\t\t...record,\n\t\t\t\t\tstatus: 'active',\n\t\t\t\t\tversion:\n\t\t\t\t\t\ttypeof record.version === 'number'\n\t\t\t\t\t\t\t? record.version\n\t\t\t\t\t\t\t: currentVersion + 1\n\t\t\t\t},\n\t\t\t\t...existing.map((entry: RAGRetrievalBaselineRecord) =>\n\t\t\t\t\tentry.groupKey === record.groupKey &&\n\t\t\t\t\t(entry.rolloutLabel ?? undefined) ===\n\t\t\t\t\t\t(record.rolloutLabel ?? undefined)\n\t\t\t\t\t\t? { ...entry, status: 'superseded' as const }\n\t\t\t\t\t\t: entry\n\t\t\t\t)\n\t\t\t]);\n\t\t\tawait mkdir(dirname(path), { recursive: true });\n\t\t\tawait writeFile(\n\t\t\t\tpath,\n\t\t\t\tJSON.stringify(next, null, '\\t') + '\\n',\n\t\t\t\t'utf8'\n\t\t\t);\n\t\t}\n\t};\n};\n\nexport const createRAGFileRetrievalReleaseDecisionStore = (\n\tpath: string\n): RAGRetrievalReleaseDecisionStore => ({\n\tlistDecisions: async ({ groupKey, kind, limit } = {}) => {\n\t\tlet parsed: RAGRetrievalReleaseDecisionRecord[] = [];\n\t\ttry {\n\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\tconst value = JSON.parse(content);\n\t\t\tparsed = Array.isArray(value) ? value : [];\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tconst filtered = parsed.filter(\n\t\t\t(entry) =>\n\t\t\t\t(!groupKey || entry.groupKey === groupKey) &&\n\t\t\t\t(!kind || entry.kind === kind)\n\t\t);\n\t\tconst sorted = normalizeRetrievalReleaseDecisionRecords(filtered);\n\t\treturn typeof limit === 'number' ? sorted.slice(0, limit) : sorted;\n\t},\n\tsaveDecision: async (record) => {\n\t\tconst existing = await (async () => {\n\t\t\ttry {\n\t\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\t\tconst value = JSON.parse(content);\n\t\t\t\treturn Array.isArray(value) ? value : [];\n\t\t\t} catch (error) {\n\t\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\treturn [];\n\t\t\t}\n\t\t})();\n\t\tconst next = normalizeRetrievalReleaseDecisionRecords([\n\t\t\trecord,\n\t\t\t...existing.filter(\n\t\t\t\t(entry: RAGRetrievalReleaseDecisionRecord) =>\n\t\t\t\t\tentry.id !== record.id\n\t\t\t)\n\t\t]);\n\t\tawait mkdir(dirname(path), { recursive: true });\n\t\tawait writeFile(path, JSON.stringify(next, null, '\\t') + '\\n', 'utf8');\n\t}\n});\n\nexport const createRAGFileRetrievalLaneHandoffDecisionStore = (\n\tpath: string\n): RAGRetrievalLaneHandoffDecisionStore => ({\n\tlistDecisions: async ({\n\t\tgroupKey,\n\t\tkind,\n\t\tlimit,\n\t\tsourceRolloutLabel,\n\t\ttargetRolloutLabel\n\t} = {}) => {\n\t\tlet parsed: RAGRetrievalLaneHandoffDecisionRecord[] = [];\n\t\ttry {\n\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\tconst value = JSON.parse(content);\n\t\t\tparsed = Array.isArray(value) ? value : [];\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tconst filtered = parsed.filter(\n\t\t\t(entry) =>\n\t\t\t\t(!groupKey || entry.groupKey === groupKey) &&\n\t\t\t\t(!kind || entry.kind === kind) &&\n\t\t\t\t(!sourceRolloutLabel ||\n\t\t\t\t\tentry.sourceRolloutLabel === sourceRolloutLabel) &&\n\t\t\t\t(!targetRolloutLabel ||\n\t\t\t\t\tentry.targetRolloutLabel === targetRolloutLabel)\n\t\t);\n\t\tconst sorted = normalizeRetrievalLaneHandoffDecisionRecords(filtered);\n\t\treturn typeof limit === 'number' ? sorted.slice(0, limit) : sorted;\n\t},\n\tsaveDecision: async (record) => {\n\t\tconst existing = await (async () => {\n\t\t\ttry {\n\t\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\t\tconst value = JSON.parse(content);\n\t\t\t\treturn Array.isArray(value) ? value : [];\n\t\t\t} catch (error) {\n\t\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\treturn [];\n\t\t\t}\n\t\t})();\n\t\tconst next = normalizeRetrievalLaneHandoffDecisionRecords([\n\t\t\trecord,\n\t\t\t...existing.filter(\n\t\t\t\t(entry: RAGRetrievalLaneHandoffDecisionRecord) =>\n\t\t\t\t\tentry.id !== record.id\n\t\t\t)\n\t\t]);\n\t\tawait mkdir(dirname(path), { recursive: true });\n\t\tawait writeFile(path, JSON.stringify(next, null, '\\t') + '\\n', 'utf8');\n\t}\n});\n\nexport const createRAGFileRetrievalReleaseIncidentStore = (\n\tpath: string\n): RAGRetrievalReleaseIncidentStore => ({\n\tlistIncidents: async ({\n\t\tgroupKey,\n\t\tlimit,\n\t\tseverity,\n\t\tstatus,\n\t\ttargetRolloutLabel\n\t} = {}) => {\n\t\tlet parsed: RAGRetrievalReleaseIncidentRecord[] = [];\n\t\ttry {\n\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\tconst value = JSON.parse(content);\n\t\t\tparsed = Array.isArray(value) ? value : [];\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tconst filtered = parsed.filter(\n\t\t\t(entry) =>\n\t\t\t\t(!groupKey || entry.groupKey === groupKey) &&\n\t\t\t\t(!targetRolloutLabel ||\n\t\t\t\t\tentry.targetRolloutLabel === targetRolloutLabel) &&\n\t\t\t\t(!severity || entry.severity === severity) &&\n\t\t\t\t(!status || entry.status === status)\n\t\t);\n\t\tconst sorted = normalizeRetrievalReleaseIncidentRecords(filtered);\n\t\treturn typeof limit === 'number' ? sorted.slice(0, limit) : sorted;\n\t},\n\tsaveIncident: async (record) => {\n\t\tconst existing = await (async () => {\n\t\t\ttry {\n\t\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\t\tconst value = JSON.parse(content);\n\t\t\t\treturn Array.isArray(value) ? value : [];\n\t\t\t} catch (error) {\n\t\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\treturn [];\n\t\t\t}\n\t\t})();\n\t\tconst next = normalizeRetrievalReleaseIncidentRecords([\n\t\t\trecord,\n\t\t\t...existing.filter(\n\t\t\t\t(entry: RAGRetrievalReleaseIncidentRecord) =>\n\t\t\t\t\tentry.id !== record.id\n\t\t\t)\n\t\t]);\n\t\tawait mkdir(dirname(path), { recursive: true });\n\t\tawait writeFile(path, JSON.stringify(next, null, '\\t') + '\\n', 'utf8');\n\t}\n});\n\nexport const createRAGFileRetrievalLaneHandoffIncidentStore = (\n\tpath: string\n): RAGRetrievalLaneHandoffIncidentStore => ({\n\tlistIncidents: async ({\n\t\tgroupKey,\n\t\tlimit,\n\t\tseverity,\n\t\tstatus,\n\t\ttargetRolloutLabel\n\t} = {}) => {\n\t\tlet parsed: RAGRetrievalLaneHandoffIncidentRecord[] = [];\n\t\ttry {\n\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\tconst value = JSON.parse(content);\n\t\t\tparsed = Array.isArray(value) ? value : [];\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tconst filtered = parsed.filter(\n\t\t\t(entry) =>\n\t\t\t\t(!groupKey || entry.groupKey === groupKey) &&\n\t\t\t\t(!targetRolloutLabel ||\n\t\t\t\t\tentry.targetRolloutLabel === targetRolloutLabel) &&\n\t\t\t\t(!severity || entry.severity === severity) &&\n\t\t\t\t(!status || entry.status === status)\n\t\t);\n\t\tconst sorted = normalizeRetrievalReleaseIncidentRecords(\n\t\t\tfiltered as RAGRetrievalReleaseIncidentRecord[]\n\t\t) as RAGRetrievalLaneHandoffIncidentRecord[];\n\t\treturn typeof limit === 'number' ? sorted.slice(0, limit) : sorted;\n\t},\n\tsaveIncident: async (record) => {\n\t\tconst existing = await (async () => {\n\t\t\ttry {\n\t\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\t\tconst value = JSON.parse(content);\n\t\t\t\treturn Array.isArray(value) ? value : [];\n\t\t\t} catch (error) {\n\t\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\treturn [];\n\t\t\t}\n\t\t})();\n\t\tconst next = normalizeRetrievalReleaseIncidentRecords([\n\t\t\trecord as RAGRetrievalReleaseIncidentRecord,\n\t\t\t...existing.filter(\n\t\t\t\t(entry: RAGRetrievalLaneHandoffIncidentRecord) =>\n\t\t\t\t\tentry.id !== record.id\n\t\t\t)\n\t\t]) as RAGRetrievalLaneHandoffIncidentRecord[];\n\t\tawait mkdir(dirname(path), { recursive: true });\n\t\tawait writeFile(path, JSON.stringify(next, null, '\\t') + '\\n', 'utf8');\n\t}\n});\n\nexport const createRAGFileRetrievalLaneHandoffIncidentHistoryStore = (\n\tpath: string\n): RAGRetrievalLaneHandoffIncidentHistoryStore => ({\n\tlistRecords: async ({\n\t\taction,\n\t\tgroupKey,\n\t\tincidentId,\n\t\tlimit,\n\t\ttargetRolloutLabel\n\t} = {}) => {\n\t\tlet parsed: RAGRetrievalLaneHandoffIncidentHistoryRecord[] = [];\n\t\ttry {\n\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\tconst value = JSON.parse(content);\n\t\t\tparsed = Array.isArray(value) ? value : [];\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tconst filtered = parsed\n\t\t\t.filter(\n\t\t\t\t(entry) =>\n\t\t\t\t\t(!action || entry.action === action) &&\n\t\t\t\t\t(!groupKey || entry.groupKey === groupKey) &&\n\t\t\t\t\t(!incidentId || entry.incidentId === incidentId) &&\n\t\t\t\t\t(!targetRolloutLabel ||\n\t\t\t\t\t\tentry.targetRolloutLabel === targetRolloutLabel)\n\t\t\t)\n\t\t\t.sort((left, right) => right.recordedAt - left.recordedAt);\n\t\treturn typeof limit === 'number' ? filtered.slice(0, limit) : filtered;\n\t},\n\tsaveRecord: async (record) => {\n\t\tconst existing = await (async () => {\n\t\t\ttry {\n\t\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\t\tconst value = JSON.parse(content);\n\t\t\t\treturn Array.isArray(value) ? value : [];\n\t\t\t} catch (error) {\n\t\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\treturn [];\n\t\t\t}\n\t\t})();\n\t\tconst next = [record, ...existing].sort(\n\t\t\t(\n\t\t\t\tleft: RAGRetrievalLaneHandoffIncidentHistoryRecord,\n\t\t\t\tright: RAGRetrievalLaneHandoffIncidentHistoryRecord\n\t\t\t) => right.recordedAt - left.recordedAt\n\t\t);\n\t\tawait mkdir(dirname(path), { recursive: true });\n\t\tawait writeFile(path, JSON.stringify(next, null, '\\t') + '\\n', 'utf8');\n\t}\n});\n\nexport const createRAGFileRetrievalIncidentRemediationDecisionStore = (\n\tpath: string\n): RAGRetrievalIncidentRemediationDecisionStore => ({\n\tlistRecords: async ({\n\t\tgroupKey,\n\t\tincidentId,\n\t\tlimit,\n\t\tremediationKind,\n\t\tstatus,\n\t\ttargetRolloutLabel\n\t} = {}) => {\n\t\tlet parsed: RAGRetrievalIncidentRemediationDecisionRecord[] = [];\n\t\ttry {\n\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\tconst value = JSON.parse(content);\n\t\t\tparsed = Array.isArray(value) ? value : [];\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t\tconst filtered = normalizeRetrievalIncidentRemediationDecisionRecords(\n\t\t\tparsed\n\t\t).filter(\n\t\t\t(entry) =>\n\t\t\t\t(!groupKey || entry.groupKey === groupKey) &&\n\t\t\t\t(!incidentId || entry.incidentId === incidentId) &&\n\t\t\t\t(!remediationKind ||\n\t\t\t\t\tentry.remediationKind === remediationKind) &&\n\t\t\t\t(!status || entry.status === status) &&\n\t\t\t\t(!targetRolloutLabel ||\n\t\t\t\t\tentry.targetRolloutLabel === targetRolloutLabel)\n\t\t);\n\t\treturn typeof limit === 'number' ? filtered.slice(0, limit) : filtered;\n\t},\n\tsaveRecord: async (record) => {\n\t\tconst existing = await (async () => {\n\t\t\ttry {\n\t\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\t\tconst value = JSON.parse(content);\n\t\t\t\treturn Array.isArray(value) ? value : [];\n\t\t\t} catch (error) {\n\t\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\treturn [];\n\t\t\t}\n\t\t})();\n\t\tconst next = normalizeRetrievalIncidentRemediationDecisionRecords([\n\t\t\trecord,\n\t\t\t...existing\n\t\t]);\n\t\tawait mkdir(dirname(path), { recursive: true });\n\t\tawait writeFile(path, JSON.stringify(next, null, '\\t') + '\\n', 'utf8');\n\t}\n});\n\nexport const createRAGFileRetrievalIncidentRemediationExecutionHistoryStore = (\n\tpath: string\n): RAGRetrievalIncidentRemediationExecutionHistoryStore => ({\n\tlistRecords: async ({\n\t\tactionKind,\n\t\tblockedByGuardrail,\n\t\tcode,\n\t\tgroupKey,\n\t\tidempotentReplay,\n\t\tincidentId,\n\t\tlimit,\n\t\ttargetRolloutLabel\n\t} = {}) => {\n\t\tlet parsed: RAGRetrievalIncidentRemediationExecutionHistoryRecord[] =\n\t\t\t[];\n\t\ttry {\n\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\tconst value = JSON.parse(content);\n\t\t\tparsed = Array.isArray(value) ? value : [];\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t\tconst filtered =\n\t\t\tnormalizeRetrievalIncidentRemediationExecutionHistoryRecords(\n\t\t\t\tparsed\n\t\t\t).filter(\n\t\t\t\t(entry) =>\n\t\t\t\t\t(!groupKey || entry.groupKey === groupKey) &&\n\t\t\t\t\t(!incidentId || entry.incidentId === incidentId) &&\n\t\t\t\t\t(!actionKind || entry.action.kind === actionKind) &&\n\t\t\t\t\t(!code || entry.code === code) &&\n\t\t\t\t\t(typeof blockedByGuardrail !== 'boolean' ||\n\t\t\t\t\t\tentry.blockedByGuardrail === blockedByGuardrail) &&\n\t\t\t\t\t(typeof idempotentReplay !== 'boolean' ||\n\t\t\t\t\t\tentry.idempotentReplay === idempotentReplay) &&\n\t\t\t\t\t(!targetRolloutLabel ||\n\t\t\t\t\t\tentry.targetRolloutLabel === targetRolloutLabel)\n\t\t\t);\n\t\treturn typeof limit === 'number' ? filtered.slice(0, limit) : filtered;\n\t},\n\tsaveRecord: async (record) => {\n\t\tconst existing = await (async () => {\n\t\t\ttry {\n\t\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\t\tconst value = JSON.parse(content);\n\t\t\t\treturn Array.isArray(value) ? value : [];\n\t\t\t} catch (error) {\n\t\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\treturn [];\n\t\t\t}\n\t\t})();\n\t\tconst next =\n\t\t\tnormalizeRetrievalIncidentRemediationExecutionHistoryRecords([\n\t\t\t\trecord,\n\t\t\t\t...existing\n\t\t\t]);\n\t\tawait mkdir(dirname(path), { recursive: true });\n\t\tawait writeFile(path, JSON.stringify(next, null, '\\t') + '\\n', 'utf8');\n\t}\n});\n\nexport const createRAGFileRetrievalLaneHandoffAutoCompletePolicyHistoryStore = (\n\tpath: string\n): RAGRetrievalLaneHandoffAutoCompletePolicyHistoryStore => ({\n\tlistRecords: async ({ groupKey, limit, targetRolloutLabel } = {}) => {\n\t\tlet parsed: RAGRetrievalLaneHandoffAutoCompletePolicyHistoryRecord[] =\n\t\t\t[];\n\t\ttry {\n\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\tconst value = JSON.parse(content);\n\t\t\tparsed = Array.isArray(value) ? value : [];\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t\tconst filtered = parsed\n\t\t\t.filter(\n\t\t\t\t(entry) =>\n\t\t\t\t\t(!groupKey || entry.groupKey === groupKey) &&\n\t\t\t\t\t(!targetRolloutLabel ||\n\t\t\t\t\t\tentry.targetRolloutLabel === targetRolloutLabel)\n\t\t\t)\n\t\t\t.sort((left, right) => right.recordedAt - left.recordedAt);\n\t\treturn typeof limit === 'number' ? filtered.slice(0, limit) : filtered;\n\t},\n\tsaveRecord: async (record) => {\n\t\tconst existing = await (async () => {\n\t\t\ttry {\n\t\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\t\tconst value = JSON.parse(content);\n\t\t\t\treturn Array.isArray(value) ? value : [];\n\t\t\t} catch (error) {\n\t\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\treturn [];\n\t\t\t}\n\t\t})();\n\t\tconst next = [record, ...existing].sort(\n\t\t\t(\n\t\t\t\tleft: RAGRetrievalLaneHandoffAutoCompletePolicyHistoryRecord,\n\t\t\t\tright: RAGRetrievalLaneHandoffAutoCompletePolicyHistoryRecord\n\t\t\t) => right.recordedAt - left.recordedAt\n\t\t);\n\t\tawait mkdir(dirname(path), { recursive: true });\n\t\tawait writeFile(path, JSON.stringify(next, null, '\\t') + '\\n', 'utf8');\n\t}\n});\n\nexport const createRAGFileRetrievalReleaseLanePolicyHistoryStore = (\n\tpath: string\n): RAGRetrievalReleaseLanePolicyHistoryStore => ({\n\tlistRecords: async ({ groupKey, limit, rolloutLabel, scope } = {}) => {\n\t\tlet parsed: RAGRetrievalReleaseLanePolicyHistoryRecord[] = [];\n\t\ttry {\n\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\tconst value = JSON.parse(content);\n\t\t\tparsed = Array.isArray(value) ? value : [];\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t\tconst filtered = parsed\n\t\t\t.filter(\n\t\t\t\t(entry) =>\n\t\t\t\t\t(!groupKey || entry.groupKey === groupKey) &&\n\t\t\t\t\t(!rolloutLabel || entry.rolloutLabel === rolloutLabel) &&\n\t\t\t\t\t(!scope || entry.scope === scope)\n\t\t\t)\n\t\t\t.sort((left, right) => right.recordedAt - left.recordedAt);\n\t\treturn typeof limit === 'number' ? filtered.slice(0, limit) : filtered;\n\t},\n\tsaveRecord: async (record) => {\n\t\tconst existing = await (async () => {\n\t\t\ttry {\n\t\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\t\tconst value = JSON.parse(content);\n\t\t\t\treturn Array.isArray(value) ? value : [];\n\t\t\t} catch (error) {\n\t\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\treturn [];\n\t\t\t}\n\t\t})();\n\t\tconst next = [record, ...existing].sort(\n\t\t\t(\n\t\t\t\tleft: RAGRetrievalReleaseLanePolicyHistoryRecord,\n\t\t\t\tright: RAGRetrievalReleaseLanePolicyHistoryRecord\n\t\t\t) => right.recordedAt - left.recordedAt\n\t\t);\n\t\tawait mkdir(dirname(path), { recursive: true });\n\t\tawait writeFile(path, JSON.stringify(next, null, '\\t') + '\\n', 'utf8');\n\t}\n});\n\nexport const createRAGFileRetrievalBaselineGatePolicyHistoryStore = (\n\tpath: string\n): RAGRetrievalBaselineGatePolicyHistoryStore => ({\n\tlistRecords: async ({ groupKey, limit, rolloutLabel, scope } = {}) => {\n\t\tlet parsed: RAGRetrievalBaselineGatePolicyHistoryRecord[] = [];\n\t\ttry {\n\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\tconst value = JSON.parse(content);\n\t\t\tparsed = Array.isArray(value) ? value : [];\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t\tconst filtered = parsed\n\t\t\t.filter(\n\t\t\t\t(entry) =>\n\t\t\t\t\t(!groupKey || entry.groupKey === groupKey) &&\n\t\t\t\t\t(!rolloutLabel || entry.rolloutLabel === rolloutLabel) &&\n\t\t\t\t\t(!scope || entry.scope === scope)\n\t\t\t)\n\t\t\t.sort((left, right) => right.recordedAt - left.recordedAt);\n\t\treturn typeof limit === 'number' ? filtered.slice(0, limit) : filtered;\n\t},\n\tsaveRecord: async (record) => {\n\t\tconst existing = await (async () => {\n\t\t\ttry {\n\t\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\t\tconst value = JSON.parse(content);\n\t\t\t\treturn Array.isArray(value) ? value : [];\n\t\t\t} catch (error) {\n\t\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\treturn [];\n\t\t\t}\n\t\t})();\n\t\tconst next = [record, ...existing].sort(\n\t\t\t(\n\t\t\t\tleft: RAGRetrievalBaselineGatePolicyHistoryRecord,\n\t\t\t\tright: RAGRetrievalBaselineGatePolicyHistoryRecord\n\t\t\t) => right.recordedAt - left.recordedAt\n\t\t);\n\t\tawait mkdir(dirname(path), { recursive: true });\n\t\tawait writeFile(path, JSON.stringify(next, null, '\\t') + '\\n', 'utf8');\n\t}\n});\n\nexport const createRAGFileRetrievalReleaseLaneEscalationPolicyHistoryStore = (\n\tpath: string\n): RAGRetrievalReleaseLaneEscalationPolicyHistoryStore => ({\n\tlistRecords: async ({ groupKey, limit, targetRolloutLabel } = {}) => {\n\t\tlet parsed: RAGRetrievalReleaseLaneEscalationPolicyHistoryRecord[] = [];\n\t\ttry {\n\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\tconst value = JSON.parse(content);\n\t\t\tparsed = Array.isArray(value) ? value : [];\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t\tconst filtered = parsed\n\t\t\t.filter(\n\t\t\t\t(entry) =>\n\t\t\t\t\t(!groupKey || entry.groupKey === groupKey) &&\n\t\t\t\t\t(!targetRolloutLabel ||\n\t\t\t\t\t\tentry.targetRolloutLabel === targetRolloutLabel)\n\t\t\t)\n\t\t\t.sort((left, right) => right.recordedAt - left.recordedAt);\n\t\treturn typeof limit === 'number' ? filtered.slice(0, limit) : filtered;\n\t},\n\tsaveRecord: async (record) => {\n\t\tconst existing = await (async () => {\n\t\t\ttry {\n\t\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\t\tconst value = JSON.parse(content);\n\t\t\t\treturn Array.isArray(value) ? value : [];\n\t\t\t} catch (error) {\n\t\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\treturn [];\n\t\t\t}\n\t\t})();\n\t\tconst next = [record, ...existing].sort(\n\t\t\t(\n\t\t\t\tleft: RAGRetrievalReleaseLaneEscalationPolicyHistoryRecord,\n\t\t\t\tright: RAGRetrievalReleaseLaneEscalationPolicyHistoryRecord\n\t\t\t) => right.recordedAt - left.recordedAt\n\t\t);\n\t\tawait mkdir(dirname(path), { recursive: true });\n\t\tawait writeFile(path, JSON.stringify(next, null, '\\t') + '\\n', 'utf8');\n\t}\n});\n\nexport const createRAGFileSearchTraceStore = (\n\tpath: string\n): RAGSearchTraceStore => ({\n\tasync listTraces(input) {\n\t\ttry {\n\t\t\tconst raw = await readFile(path, 'utf8');\n\t\t\tconst data = JSON.parse(raw) as {\n\t\t\t\ttraces?: RAGSearchTraceRecord[];\n\t\t\t};\n\t\t\tconst traces = Array.isArray(data.traces) ? data.traces : [];\n\t\t\tconst filtered = traces.filter((trace) => {\n\t\t\t\tif (input?.query && trace.query !== input.query) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif (input?.groupKey && trace.groupKey !== input.groupKey) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif (input?.tag && !(trace.tags ?? []).includes(input.tag)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t});\n\n\t\t\treturn normalizeTraceSummaryRuns(filtered).slice(\n\t\t\t\t0,\n\t\t\t\tinput?.limit ?? DEFAULT_HISTORY_LIMIT\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tif (\n\t\t\t\terror &&\n\t\t\t\ttypeof error === 'object' &&\n\t\t\t\t'code' in error &&\n\t\t\t\terror.code === 'ENOENT'\n\t\t\t) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\tthrow error;\n\t\t}\n\t},\n\tasync saveTrace(trace) {\n\t\tlet traces: RAGSearchTraceRecord[] = [];\n\t\ttry {\n\t\t\tconst raw = await readFile(path, 'utf8');\n\t\t\tconst data = JSON.parse(raw) as {\n\t\t\t\ttraces?: RAGSearchTraceRecord[];\n\t\t\t};\n\t\t\ttraces = Array.isArray(data.traces) ? data.traces : [];\n\t\t} catch (error) {\n\t\t\tif (\n\t\t\t\t!error ||\n\t\t\t\ttypeof error !== 'object' ||\n\t\t\t\t!('code' in error) ||\n\t\t\t\terror.code !== 'ENOENT'\n\t\t\t) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tconst nextTraces = normalizeTraceSummaryRuns([\n\t\t\ttrace,\n\t\t\t...traces.filter((entry) => entry.id !== trace.id)\n\t\t]);\n\t\tawait mkdir(dirname(path), { recursive: true });\n\t\tawait writeFile(\n\t\t\tpath,\n\t\t\tJSON.stringify(\n\t\t\t\t{\n\t\t\t\t\ttraces: nextTraces\n\t\t\t\t},\n\t\t\t\tnull,\n\t\t\t\t2\n\t\t\t)\n\t\t);\n\t},\n\tasync pruneTraces(input) {\n\t\tlet traces: RAGSearchTraceRecord[] = [];\n\t\ttry {\n\t\t\tconst raw = await readFile(path, 'utf8');\n\t\t\tconst data = JSON.parse(raw) as {\n\t\t\t\ttraces?: RAGSearchTraceRecord[];\n\t\t\t};\n\t\t\ttraces = Array.isArray(data.traces) ? data.traces : [];\n\t\t} catch (error) {\n\t\t\tif (\n\t\t\t\t!error ||\n\t\t\t\ttypeof error !== 'object' ||\n\t\t\t\t!('code' in error) ||\n\t\t\t\terror.code !== 'ENOENT'\n\t\t\t) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tconst pruned = applyRAGSearchTracePrunePolicy({\n\t\t\tinput,\n\t\t\ttraces\n\t\t});\n\t\tawait mkdir(dirname(path), { recursive: true });\n\t\tawait writeFile(\n\t\t\tpath,\n\t\t\tJSON.stringify(\n\t\t\t\t{\n\t\t\t\t\ttraces: pruned.next\n\t\t\t\t},\n\t\t\t\tnull,\n\t\t\t\t2\n\t\t\t)\n\t\t);\n\n\t\treturn {\n\t\t\tkeptCount: pruned.keptCount,\n\t\t\tremovedCount: pruned.removedCount\n\t\t};\n\t}\n});\n\nexport const createRAGFileSearchTracePruneHistoryStore = (\n\tpath: string\n): RAGSearchTracePruneHistoryStore => ({\n\tlistRuns: async (input) => {\n\t\tlet parsed: RAGSearchTracePruneRun[] = [];\n\t\ttry {\n\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\tconst value = JSON.parse(content);\n\t\t\tparsed = Array.isArray(value) ? value : [];\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tconst filtered = parsed.filter(\n\t\t\t(entry) => !input?.trigger || entry.trigger === input.trigger\n\t\t);\n\t\tconst sorted = normalizeSearchTracePruneRuns(filtered);\n\t\treturn typeof input?.limit === 'number'\n\t\t\t? sorted.slice(0, input.limit)\n\t\t\t: sorted;\n\t},\n\tsaveRun: async (run) => {\n\t\tconst existing = await (async () => {\n\t\t\ttry {\n\t\t\t\tconst content = await readFile(path, 'utf8');\n\t\t\t\tconst value = JSON.parse(content);\n\t\t\t\treturn Array.isArray(value) ? value : [];\n\t\t\t} catch (error) {\n\t\t\t\tif ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\treturn [];\n\t\t\t}\n\t\t})();\n\t\tconst next = normalizeSearchTracePruneRuns([\n\t\t\trun,\n\t\t\t...existing.filter(\n\t\t\t\t(entry: RAGSearchTracePruneRun) => entry.id !== run.id\n\t\t\t)\n\t\t]);\n\t\tawait mkdir(dirname(path), { recursive: true });\n\t\tawait writeFile(path, JSON.stringify(next, null, '\\t') + '\\n', 'utf8');\n\t}\n});\n\nexport type SQLiteRAGSearchTraceStoreOptions = {\n\tdb?: Database;\n\tpath?: string;\n\ttableName?: string;\n};\n\ntype SQLiteSearchTraceRow = {\n\tid: string;\n\tquery: string;\n\tlabel: string;\n\tgroup_key: string | null;\n\ttags_json: string | null;\n\tstarted_at: number;\n\tfinished_at: number;\n\telapsed_ms: number;\n\ttrace_json: string;\n\tsummary_json: string;\n\tresults_json: string;\n\tmetadata_json: string | null;\n};\n\nconst isSQLiteSearchTraceRow = (\n\tvalue: unknown\n): value is SQLiteSearchTraceRow =>\n\tisObjectRecord(value) &&\n\ttypeof value.id === 'string' &&\n\ttypeof value.query === 'string' &&\n\ttypeof value.label === 'string' &&\n\t(typeof value.group_key === 'string' || value.group_key === null) &&\n\t(typeof value.tags_json === 'string' || value.tags_json === null) &&\n\ttypeof value.started_at === 'number' &&\n\ttypeof value.finished_at === 'number' &&\n\ttypeof value.elapsed_ms === 'number' &&\n\ttypeof value.trace_json === 'string' &&\n\ttypeof value.summary_json === 'string' &&\n\ttypeof value.results_json === 'string' &&\n\t(typeof value.metadata_json === 'string' || value.metadata_json === null);\n\nconst assertSupportedIdentifier = (name: string) => {\n\tif (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name)) {\n\t\tthrow new Error(\n\t\t\t`Invalid SQLite search trace table name \"${name}\". Only alphanumeric and underscore names are allowed.`\n\t\t);\n\t}\n};\n\nconst mapSQLiteSearchTraceRow = (\n\trow: SQLiteSearchTraceRow\n): RAGSearchTraceRecord => ({\n\telapsedMs: row.elapsed_ms,\n\tfinishedAt: row.finished_at,\n\tgroupKey: row.group_key ?? undefined,\n\tid: row.id,\n\tlabel: row.label,\n\tmetadata: parseJSONRecord(row.metadata_json),\n\tquery: row.query,\n\tresults: parseJSONArray(row.results_json, []),\n\tstartedAt: row.started_at,\n\tsummary: JSON.parse(row.summary_json),\n\ttags: normalizeStringArray(parseJSONArray(row.tags_json, [])),\n\ttrace: JSON.parse(row.trace_json)\n});\n\nexport const createRAGSQLiteSearchTraceStore = (\n\toptions: SQLiteRAGSearchTraceStoreOptions\n): RAGSearchTraceStore => {\n\tconst tableName = options.tableName ?? DEFAULT_SEARCH_TRACE_TABLE_NAME;\n\tassertSupportedIdentifier(tableName);\n\n\tconst db =\n\t\toptions.db ??\n\t\tnew (loadBunSQLiteModule().Database)(options.path ?? ':memory:');\n\n\tdb.exec(`\n\t\tCREATE TABLE IF NOT EXISTS ${tableName} (\n\t\t\tid TEXT PRIMARY KEY,\n\t\t\tquery TEXT NOT NULL,\n\t\t\tlabel TEXT NOT NULL,\n\t\t\tgroup_key TEXT,\n\t\t\ttags_json TEXT,\n\t\t\tstarted_at INTEGER NOT NULL,\n\t\t\tfinished_at INTEGER NOT NULL,\n\t\t\telapsed_ms INTEGER NOT NULL,\n\t\t\ttrace_json TEXT NOT NULL,\n\t\t\tsummary_json TEXT NOT NULL,\n\t\t\tresults_json TEXT NOT NULL,\n\t\t\tmetadata_json TEXT\n\t\t)\n\t`);\n\tdb.exec(\n\t\t`CREATE INDEX IF NOT EXISTS ${tableName}_query_finished_at_idx ON ${tableName} (query, finished_at DESC)`\n\t);\n\tdb.exec(\n\t\t`CREATE INDEX IF NOT EXISTS ${tableName}_group_finished_at_idx ON ${tableName} (group_key, finished_at DESC)`\n\t);\n\tdb.exec(\n\t\t`CREATE INDEX IF NOT EXISTS ${tableName}_finished_at_idx ON ${tableName} (finished_at DESC)`\n\t);\n\n\tconst listBase = `\n\t\tSELECT\n\t\t\tid,\n\t\t\tquery,\n\t\t\tlabel,\n\t\t\tgroup_key,\n\t\t\ttags_json,\n\t\t\tstarted_at,\n\t\t\tfinished_at,\n\t\t\telapsed_ms,\n\t\t\ttrace_json,\n\t\t\tsummary_json,\n\t\t\tresults_json,\n\t\t\tmetadata_json\n\t\tFROM ${tableName}\n\t`;\n\tconst insert = db.prepare(`\n\t\tINSERT INTO ${tableName} (\n\t\t\tid,\n\t\t\tquery,\n\t\t\tlabel,\n\t\t\tgroup_key,\n\t\t\ttags_json,\n\t\t\tstarted_at,\n\t\t\tfinished_at,\n\t\t\telapsed_ms,\n\t\t\ttrace_json,\n\t\t\tsummary_json,\n\t\t\tresults_json,\n\t\t\tmetadata_json\n\t\t) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n\t\tON CONFLICT(id) DO UPDATE SET\n\t\t\tquery = excluded.query,\n\t\t\tlabel = excluded.label,\n\t\t\tgroup_key = excluded.group_key,\n\t\t\ttags_json = excluded.tags_json,\n\t\t\tstarted_at = excluded.started_at,\n\t\t\tfinished_at = excluded.finished_at,\n\t\t\telapsed_ms = excluded.elapsed_ms,\n\t\t\ttrace_json = excluded.trace_json,\n\t\t\tsummary_json = excluded.summary_json,\n\t\t\tresults_json = excluded.results_json,\n\t\t\tmetadata_json = excluded.metadata_json\n\t`);\n\tconst remove = db.prepare(`DELETE FROM ${tableName} WHERE id = ?`);\n\n\treturn {\n\t\tlistTraces(input) {\n\t\t\tconst where: string[] = [];\n\t\t\tconst params: Array<string | number> = [];\n\n\t\t\tif (input?.query) {\n\t\t\t\twhere.push('query = ?');\n\t\t\t\tparams.push(input.query);\n\t\t\t}\n\n\t\t\tif (input?.groupKey) {\n\t\t\t\twhere.push('group_key = ?');\n\t\t\t\tparams.push(input.groupKey);\n\t\t\t}\n\n\t\t\tconst sql =\n\t\t\t\t`${listBase}${where.length > 0 ? ` WHERE ${where.join(' AND ')}` : ''} ` +\n\t\t\t\t'ORDER BY finished_at DESC';\n\t\t\tconst rows = db.prepare(sql).all(...params);\n\t\t\tconst traces = Array.isArray(rows)\n\t\t\t\t? rows\n\t\t\t\t\t\t.filter(isSQLiteSearchTraceRow)\n\t\t\t\t\t\t.map(mapSQLiteSearchTraceRow)\n\t\t\t\t: [];\n\t\t\tconst filtered = input?.tag\n\t\t\t\t? traces.filter((trace) =>\n\t\t\t\t\t\t(trace.tags ?? []).includes(input.tag as string)\n\t\t\t\t\t)\n\t\t\t\t: traces;\n\n\t\t\treturn normalizeTraceSummaryRuns(filtered).slice(\n\t\t\t\t0,\n\t\t\t\tinput?.limit ?? DEFAULT_HISTORY_LIMIT\n\t\t\t);\n\t\t},\n\t\tsaveTrace(trace) {\n\t\t\tinsert.run(\n\t\t\t\ttrace.id,\n\t\t\t\ttrace.query,\n\t\t\t\ttrace.label,\n\t\t\t\ttrace.groupKey ?? null,\n\t\t\t\tJSON.stringify(trace.tags ?? []),\n\t\t\t\ttrace.startedAt,\n\t\t\t\ttrace.finishedAt,\n\t\t\t\ttrace.elapsedMs,\n\t\t\t\tJSON.stringify(trace.trace),\n\t\t\t\tJSON.stringify(trace.summary),\n\t\t\t\tJSON.stringify(trace.results),\n\t\t\t\ttrace.metadata === undefined\n\t\t\t\t\t? null\n\t\t\t\t\t: JSON.stringify(trace.metadata)\n\t\t\t);\n\t\t},\n\t\tpruneTraces(input) {\n\t\t\tconst rows = db\n\t\t\t\t.prepare(`${listBase} ORDER BY finished_at DESC`)\n\t\t\t\t.all();\n\t\t\tconst traces = Array.isArray(rows)\n\t\t\t\t? rows\n\t\t\t\t\t\t.filter(isSQLiteSearchTraceRow)\n\t\t\t\t\t\t.map(mapSQLiteSearchTraceRow)\n\t\t\t\t: [];\n\t\t\tconst pruned = applyRAGSearchTracePrunePolicy({\n\t\t\t\tinput,\n\t\t\t\ttraces\n\t\t\t});\n\n\t\t\tfor (const trace of pruned.removed) {\n\t\t\t\tremove.run(trace.id);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tkeptCount: pruned.keptCount,\n\t\t\t\tremovedCount: pruned.removedCount\n\t\t\t};\n\t\t}\n\t};\n};\n\nexport const createRAGFileAnswerGroundingEvaluationHistoryStore = (\n\tpath: string\n): RAGAnswerGroundingEvaluationHistoryStore => ({\n\tasync listRuns(input) {\n\t\ttry {\n\t\t\tconst raw = await readFile(path, 'utf8');\n\t\t\tconst data = JSON.parse(raw) as {\n\t\t\t\truns?: RAGAnswerGroundingEvaluationRun[];\n\t\t\t};\n\t\t\tconst runs = Array.isArray(data.runs) ? data.runs : [];\n\t\t\tconst filtered = input?.suiteId\n\t\t\t\t? runs.filter((run) => run.suiteId === input.suiteId)\n\t\t\t\t: runs;\n\n\t\t\treturn filtered\n\t\t\t\t.sort(toGroundingHistorySortOrder)\n\t\t\t\t.slice(0, input?.limit ?? DEFAULT_HISTORY_LIMIT);\n\t\t} catch (error) {\n\t\t\tif (\n\t\t\t\terror &&\n\t\t\t\ttypeof error === 'object' &&\n\t\t\t\t'code' in error &&\n\t\t\t\terror.code === 'ENOENT'\n\t\t\t) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\tthrow error;\n\t\t}\n\t},\n\tasync saveRun(run) {\n\t\tlet runs: RAGAnswerGroundingEvaluationRun[] = [];\n\t\ttry {\n\t\t\tconst raw = await readFile(path, 'utf8');\n\t\t\tconst data = JSON.parse(raw) as {\n\t\t\t\truns?: RAGAnswerGroundingEvaluationRun[];\n\t\t\t};\n\t\t\truns = Array.isArray(data.runs) ? data.runs : [];\n\t\t} catch (error) {\n\t\t\tif (\n\t\t\t\t!error ||\n\t\t\t\ttypeof error !== 'object' ||\n\t\t\t\t!('code' in error) ||\n\t\t\t\terror.code !== 'ENOENT'\n\t\t\t) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tconst nextRuns = normalizeGroundingHistoryRuns([\n\t\t\trun,\n\t\t\t...runs.filter((entry) => entry.id !== run.id)\n\t\t]);\n\t\tawait mkdir(dirname(path), { recursive: true });\n\t\tawait writeFile(\n\t\t\tpath,\n\t\t\tJSON.stringify(\n\t\t\t\t{\n\t\t\t\t\truns: nextRuns\n\t\t\t\t},\n\t\t\t\tnull,\n\t\t\t\t2\n\t\t\t)\n\t\t);\n\t}\n});\n\nexport const createRAGFileAnswerGroundingCaseDifficultyHistoryStore = (\n\tpath: string\n): RAGAnswerGroundingCaseDifficultyHistoryStore => ({\n\tasync listRuns(input) {\n\t\ttry {\n\t\t\tconst raw = await readFile(path, 'utf8');\n\t\t\tconst data = JSON.parse(raw) as {\n\t\t\t\truns?: RAGAnswerGroundingCaseDifficultyRun[];\n\t\t\t};\n\t\t\tconst runs = Array.isArray(data.runs) ? data.runs : [];\n\t\t\tconst filtered = input?.suiteId\n\t\t\t\t? runs.filter((run) => run.suiteId === input.suiteId)\n\t\t\t\t: runs;\n\n\t\t\treturn normalizeGroundingDifficultyHistoryRuns(filtered).slice(\n\t\t\t\t0,\n\t\t\t\tinput?.limit ?? DEFAULT_HISTORY_LIMIT\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tif (\n\t\t\t\terror &&\n\t\t\t\ttypeof error === 'object' &&\n\t\t\t\t'code' in error &&\n\t\t\t\terror.code === 'ENOENT'\n\t\t\t) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\tthrow error;\n\t\t}\n\t},\n\tasync saveRun(run) {\n\t\tlet runs: RAGAnswerGroundingCaseDifficultyRun[] = [];\n\t\ttry {\n\t\t\tconst raw = await readFile(path, 'utf8');\n\t\t\tconst data = JSON.parse(raw) as {\n\t\t\t\truns?: RAGAnswerGroundingCaseDifficultyRun[];\n\t\t\t};\n\t\t\truns = Array.isArray(data.runs) ? data.runs : [];\n\t\t} catch (error) {\n\t\t\tif (\n\t\t\t\t!error ||\n\t\t\t\ttypeof error !== 'object' ||\n\t\t\t\t!('code' in error) ||\n\t\t\t\terror.code !== 'ENOENT'\n\t\t\t) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tconst nextRuns = normalizeGroundingDifficultyHistoryRuns([\n\t\t\trun,\n\t\t\t...runs.filter((entry) => entry.id !== run.id)\n\t\t]);\n\t\tawait mkdir(dirname(path), { recursive: true });\n\t\tawait writeFile(\n\t\t\tpath,\n\t\t\tJSON.stringify(\n\t\t\t\t{\n\t\t\t\t\truns: nextRuns\n\t\t\t\t},\n\t\t\t\tnull,\n\t\t\t\t2\n\t\t\t)\n\t\t);\n\t}\n});\n\nexport const loadRAGEvaluationHistory = async ({\n\tstore,\n\tsuite,\n\tlimit = DEFAULT_HISTORY_LIMIT\n}: {\n\tstore: RAGEvaluationHistoryStore;\n\tsuite: RAGEvaluationSuite;\n\tlimit?: number;\n}): Promise<RAGEvaluationHistory> => {\n\tconst runs = normalizeHistoryRuns(\n\t\tawait Promise.resolve(store.listRuns({ limit, suiteId: suite.id }))\n\t);\n\tconst latestRun = runs[0];\n\tconst previousRun = runs[1];\n\n\treturn {\n\t\tcaseTraceSnapshots: buildEvaluationCaseTraceSnapshots({\n\t\t\tcurrent: latestRun,\n\t\t\tprevious: previousRun\n\t\t}),\n\t\tretrievalTraceTrend: buildRAGRetrievalTraceHistoryTrend({\n\t\t\truns\n\t\t}),\n\t\tdiff:\n\t\t\tlatestRun && previousRun\n\t\t\t\t? buildRAGEvaluationRunDiff({\n\t\t\t\t\t\tcurrent: latestRun,\n\t\t\t\t\t\tprevious: previousRun\n\t\t\t\t\t})\n\t\t\t\t: undefined,\n\t\tlatestRun,\n\t\tleaderboard: buildRAGEvaluationLeaderboard(runs),\n\t\tpreviousRun,\n\t\truns,\n\t\tsuiteId: suite.id,\n\t\tsuiteLabel: suite.label ?? suite.id\n\t};\n};\n\nexport const loadRAGSearchTraceHistory = async ({\n\tstore,\n\tquery,\n\tgroupKey,\n\ttag,\n\tlimit = DEFAULT_HISTORY_LIMIT\n}: {\n\tstore: RAGSearchTraceStore;\n\tquery?: string;\n\tgroupKey?: string;\n\ttag?: string;\n\tlimit?: number;\n}): Promise<RAGSearchTraceHistory> => {\n\tconst traces = normalizeTraceSummaryRuns(\n\t\tawait Promise.resolve(store.listTraces({ groupKey, limit, query, tag }))\n\t);\n\tconst latestTrace = traces[0];\n\tconst previousTrace = traces[1];\n\n\treturn {\n\t\tdiff:\n\t\t\tlatestTrace && previousTrace\n\t\t\t\t? buildRAGSearchTraceDiff({\n\t\t\t\t\t\tcurrent: latestTrace,\n\t\t\t\t\t\tprevious: previousTrace\n\t\t\t\t\t})\n\t\t\t\t: undefined,\n\t\tlatestTrace,\n\t\tpreviousTrace,\n\t\tgroupKey,\n\t\tquery,\n\t\ttag,\n\t\tretrievalTraceTrend: buildRAGRetrievalTraceHistoryTrend({\n\t\t\truns: traces.map((trace) => ({\n\t\t\t\tfinishedAt: trace.finishedAt,\n\t\t\t\tid: trace.id,\n\t\t\t\tlabel: trace.label,\n\t\t\t\ttraceSummary: trace.summary\n\t\t\t}))\n\t\t}),\n\t\ttraces\n\t};\n};\n\nexport const loadRAGSearchTraceGroupHistory = async ({\n\tstore,\n\ttag,\n\tlimit = DEFAULT_HISTORY_LIMIT\n}: {\n\tstore: RAGSearchTraceStore;\n\ttag?: string;\n\tlimit?: number;\n}): Promise<RAGSearchTraceGroupHistory> => {\n\tconst traces = normalizeTraceSummaryRuns(\n\t\tawait Promise.resolve(store.listTraces({ limit, tag }))\n\t);\n\tconst grouped = new Map<string, RAGSearchTraceRecord[]>();\n\n\tfor (const trace of traces) {\n\t\tconst groupKey = trace.groupKey ?? trace.query;\n\t\tconst existing = grouped.get(groupKey);\n\t\tif (existing) {\n\t\t\texisting.push(trace);\n\t\t\tcontinue;\n\t\t}\n\t\tgrouped.set(groupKey, [trace]);\n\t}\n\n\tconst groups = Array.from(grouped.entries())\n\t\t.map(([groupKey, entries]): RAGSearchTraceGroupHistoryEntry => {\n\t\t\tconst normalizedEntries = normalizeTraceSummaryRuns(entries);\n\t\t\tconst latestTrace = normalizedEntries[0];\n\t\t\tconst previousTrace = normalizedEntries[1];\n\n\t\t\treturn {\n\t\t\t\tdiff:\n\t\t\t\t\tlatestTrace && previousTrace\n\t\t\t\t\t\t? buildRAGSearchTraceDiff({\n\t\t\t\t\t\t\t\tcurrent: latestTrace,\n\t\t\t\t\t\t\t\tprevious: previousTrace\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: undefined,\n\t\t\t\tgroupKey,\n\t\t\t\tlatestTrace,\n\t\t\t\tpreviousTrace,\n\t\t\t\tretrievalTraceTrend: buildRAGRetrievalTraceHistoryTrend({\n\t\t\t\t\truns: normalizedEntries.map((trace) => ({\n\t\t\t\t\t\tfinishedAt: trace.finishedAt,\n\t\t\t\t\t\tid: trace.id,\n\t\t\t\t\t\tlabel: trace.label,\n\t\t\t\t\t\ttraceSummary: trace.summary\n\t\t\t\t\t}))\n\t\t\t\t}),\n\t\t\t\ttraceCount: normalizedEntries.length\n\t\t\t};\n\t\t})\n\t\t.sort((left, right) => {\n\t\t\tconst leftFinishedAt = left.latestTrace?.finishedAt ?? 0;\n\t\t\tconst rightFinishedAt = right.latestTrace?.finishedAt ?? 0;\n\t\t\treturn rightFinishedAt - leftFinishedAt;\n\t\t});\n\n\treturn {\n\t\tgroups,\n\t\ttag\n\t};\n};\n\nexport const summarizeRAGSearchTraceStore = async ({\n\tstore,\n\ttag\n}: {\n\tstore: RAGSearchTraceStore;\n\ttag?: string;\n}): Promise<RAGSearchTraceStats> => {\n\tconst traces = normalizeTraceSummaryRuns(\n\t\tawait Promise.resolve(store.listTraces({ tag }))\n\t);\n\n\treturn buildRAGSearchTraceStatsFromTraces(traces);\n};\n\nexport const previewRAGSearchTraceStorePrune = async ({\n\tstore,\n\tinput\n}: {\n\tstore: RAGSearchTraceStore;\n\tinput?: RAGSearchTracePruneInput;\n}): Promise<RAGSearchTracePrunePreview> => {\n\tconst traces = normalizeTraceSummaryRuns(\n\t\tawait Promise.resolve(store.listTraces({ tag: input?.tag }))\n\t);\n\tconst pruned = applyRAGSearchTracePrunePolicy({\n\t\tinput,\n\t\ttraces\n\t});\n\n\treturn {\n\t\tinput,\n\t\tresult: {\n\t\t\tkeptCount: pruned.keptCount,\n\t\t\tremovedCount: pruned.removedCount\n\t\t},\n\t\tstatsAfter: buildRAGSearchTraceStatsFromTraces(pruned.next),\n\t\tstatsBefore: buildRAGSearchTraceStatsFromTraces(traces)\n\t};\n};\n\nexport const loadRAGAnswerGroundingEvaluationHistory = async ({\n\tstore,\n\tsuite,\n\tlimit = DEFAULT_HISTORY_LIMIT\n}: {\n\tstore: RAGAnswerGroundingEvaluationHistoryStore;\n\tsuite: Pick<RAGEvaluationSuite, 'id' | 'label'>;\n\tlimit?: number;\n}): Promise<RAGAnswerGroundingEvaluationHistory> => {\n\tconst runs = normalizeGroundingHistoryRuns(\n\t\tawait Promise.resolve(\n\t\t\tstore.listRuns({\n\t\t\t\tlimit,\n\t\t\t\tsuiteId: suite.id\n\t\t\t})\n\t\t)\n\t);\n\tconst latestRun = runs[0];\n\tconst previousRun = runs[1];\n\n\treturn {\n\t\tcaseSnapshots: buildGroundingCaseSnapshots({\n\t\t\tcurrent: latestRun,\n\t\t\tprevious: previousRun\n\t\t}),\n\t\tdiff:\n\t\t\tlatestRun && previousRun\n\t\t\t\t? buildRAGAnswerGroundingEvaluationRunDiff({\n\t\t\t\t\t\tcurrent: latestRun,\n\t\t\t\t\t\tprevious: previousRun\n\t\t\t\t\t})\n\t\t\t\t: undefined,\n\t\tlatestRun,\n\t\tleaderboard: buildRAGAnswerGroundingEvaluationLeaderboard(runs),\n\t\tpreviousRun,\n\t\truns,\n\t\tsuiteId: suite.id,\n\t\tsuiteLabel: suite.label ?? suite.id\n\t};\n};\n\nexport const loadRAGAnswerGroundingCaseDifficultyHistory = async ({\n\tstore,\n\tsuite,\n\tlimit = DEFAULT_HISTORY_LIMIT\n}: {\n\tstore: RAGAnswerGroundingCaseDifficultyHistoryStore;\n\tsuite: Pick<RAGEvaluationSuite, 'id' | 'label'>;\n\tlimit?: number;\n}): Promise<RAGAnswerGroundingCaseDifficultyHistory> => {\n\tconst runs = normalizeGroundingDifficultyHistoryRuns(\n\t\tawait Promise.resolve(\n\t\t\tstore.listRuns({\n\t\t\t\tlimit,\n\t\t\t\tsuiteId: suite.id\n\t\t\t})\n\t\t)\n\t);\n\tconst latestRun = runs[0];\n\tconst previousRun = runs[1];\n\n\treturn {\n\t\tdiff:\n\t\t\tlatestRun && previousRun\n\t\t\t\t? buildRAGAnswerGroundingCaseDifficultyRunDiff({\n\t\t\t\t\t\tcurrent: latestRun,\n\t\t\t\t\t\tprevious: previousRun\n\t\t\t\t\t})\n\t\t\t\t: undefined,\n\t\tlatestRun,\n\t\tpreviousRun,\n\t\truns,\n\t\tsuiteId: suite.id,\n\t\tsuiteLabel: suite.label ?? suite.id,\n\t\ttrends: buildRAGAnswerGroundingCaseDifficultyTrends({ runs })\n\t};\n};\n\nexport const persistRAGEvaluationSuiteRun = async ({\n\tstore,\n\trun\n}: {\n\tstore: RAGEvaluationHistoryStore;\n\trun: RAGEvaluationSuiteRun;\n}) => {\n\tawait Promise.resolve(store.saveRun(run));\n\treturn run;\n};\n\nexport const persistRAGAnswerGroundingEvaluationRun = async ({\n\tstore,\n\trun\n}: {\n\tstore: RAGAnswerGroundingEvaluationHistoryStore;\n\trun: RAGAnswerGroundingEvaluationRun;\n}) => {\n\tawait Promise.resolve(store.saveRun(run));\n\treturn run;\n};\n\nexport const persistRAGAnswerGroundingCaseDifficultyRun = async ({\n\tstore,\n\trun\n}: {\n\tstore: RAGAnswerGroundingCaseDifficultyHistoryStore;\n\trun: RAGAnswerGroundingCaseDifficultyRun;\n}) => {\n\tawait Promise.resolve(store.saveRun(run));\n\treturn run;\n};\n\nexport const persistRAGSearchTraceRecord = async ({\n\tstore,\n\trecord\n}: {\n\tstore: RAGSearchTraceStore;\n\trecord: RAGSearchTraceRecord;\n}) => {\n\tawait Promise.resolve(store.saveTrace(record));\n\treturn record;\n};\n\nexport const pruneRAGSearchTraceStore = async ({\n\tstore,\n\tinput\n}: {\n\tstore: RAGSearchTraceStore;\n\tinput?: RAGSearchTracePruneInput;\n}): Promise<RAGSearchTracePruneResult> =>\n\tPromise.resolve(store.pruneTraces(input));\n\nexport const persistRAGSearchTracePruneRun = async ({\n\tstore,\n\trun\n}: {\n\tstore: RAGSearchTracePruneHistoryStore;\n\trun: RAGSearchTracePruneRun;\n}) => {\n\tawait Promise.resolve(store.saveRun(run));\n\treturn run;\n};\n\nexport const persistRAGRetrievalComparisonRun = async ({\n\tstore,\n\trun\n}: {\n\tstore: RAGRetrievalComparisonHistoryStore;\n\trun: RAGRetrievalComparisonRun;\n}) => {\n\tawait Promise.resolve(store.saveRun(run));\n\treturn run;\n};\n\nexport const buildRAGRetrievalComparisonDecisionSummary = ({\n\tcomparison,\n\tbaselineRetrievalId,\n\tcandidateRetrievalId,\n\tpolicy\n}: {\n\tcomparison: RAGRetrievalComparison;\n\tbaselineRetrievalId?: string;\n\tcandidateRetrievalId?: string;\n\tpolicy?: RAGRetrievalBaselineGatePolicy;\n}): RAGRetrievalComparisonDecisionSummary | undefined => {\n\tconst baselineEntry =\n\t\tfindRetrievalComparisonEntry(comparison, baselineRetrievalId) ??\n\t\tcomparison.entries[0];\n\tconst candidateEntry =\n\t\tfindRetrievalComparisonEntry(comparison, candidateRetrievalId) ??\n\t\tcomparison.entries.find(\n\t\t\t(entry) => entry.retrievalId !== baselineEntry?.retrievalId\n\t\t) ??\n\t\tcomparison.entries[1];\n\n\tif (!baselineEntry && !candidateEntry) {\n\t\treturn undefined;\n\t}\n\n\tconst delta =\n\t\tbaselineEntry && candidateEntry\n\t\t\t? {\n\t\t\t\t\taverageF1Delta:\n\t\t\t\t\t\tcandidateEntry.response.summary.averageF1 -\n\t\t\t\t\t\tbaselineEntry.response.summary.averageF1,\n\t\t\t\t\telapsedMsDelta:\n\t\t\t\t\t\tcandidateEntry.response.elapsedMs -\n\t\t\t\t\t\tbaselineEntry.response.elapsedMs,\n\t\t\t\t\tpassingRateDelta:\n\t\t\t\t\t\tcandidateEntry.response.passingRate -\n\t\t\t\t\t\tbaselineEntry.response.passingRate\n\t\t\t\t}\n\t\t\t: undefined;\n\n\treturn {\n\t\tbaseline: baselineEntry\n\t\t\t? {\n\t\t\t\t\taverageF1: baselineEntry.response.summary.averageF1,\n\t\t\t\t\telapsedMs: baselineEntry.response.elapsedMs,\n\t\t\t\t\tlabel: baselineEntry.label,\n\t\t\t\t\tpassingRate: baselineEntry.response.passingRate,\n\t\t\t\t\tretrievalId: baselineEntry.retrievalId\n\t\t\t\t}\n\t\t\t: undefined,\n\t\tbaselineRetrievalId: baselineEntry?.retrievalId,\n\t\tcandidate: candidateEntry\n\t\t\t? {\n\t\t\t\t\taverageF1: candidateEntry.response.summary.averageF1,\n\t\t\t\t\telapsedMs: candidateEntry.response.elapsedMs,\n\t\t\t\t\tlabel: candidateEntry.label,\n\t\t\t\t\tpassingRate: candidateEntry.response.passingRate,\n\t\t\t\t\tretrievalId: candidateEntry.retrievalId\n\t\t\t\t}\n\t\t\t: undefined,\n\t\tcandidateRetrievalId: candidateEntry?.retrievalId,\n\t\tdelta,\n\t\tfastest: comparison.summary.fastest,\n\t\tgate: evaluateRetrievalComparisonGate({ delta, policy }),\n\t\twinnerByAverageF1: comparison.summary.bestByAverageF1,\n\t\twinnerByPassingRate: comparison.summary.bestByPassingRate\n\t};\n};\n\nexport const loadRAGSearchTracePruneHistory = async ({\n\tstore,\n\tlimit,\n\ttrigger\n}: {\n\tstore: RAGSearchTracePruneHistoryStore;\n\tlimit?: number;\n\ttrigger?: RAGSearchTracePruneRun['trigger'];\n}) =>\n\tnormalizeSearchTracePruneRuns(\n\t\tawait Promise.resolve(store.listRuns({ limit, trigger }))\n\t);\n\nexport const loadRAGRetrievalComparisonHistory = async ({\n\tstore,\n\tlimit,\n\tsuiteId,\n\tlabel,\n\twinnerId,\n\tcorpusGroupKey,\n\tgroupKey,\n\ttag\n}: {\n\tstore: RAGRetrievalComparisonHistoryStore;\n\tlimit?: number;\n\tsuiteId?: string;\n\tlabel?: string;\n\twinnerId?: string;\n\tcorpusGroupKey?: string;\n\tgroupKey?: string;\n\ttag?: string;\n}) =>\n\tnormalizeRetrievalComparisonRuns(\n\t\tawait Promise.resolve(\n\t\t\tstore.listRuns({\n\t\t\t\tcorpusGroupKey,\n\t\t\t\tgroupKey,\n\t\t\t\tlabel,\n\t\t\t\tlimit,\n\t\t\t\tsuiteId,\n\t\t\t\ttag,\n\t\t\t\twinnerId\n\t\t\t})\n\t\t)\n\t);\n\nexport const loadRAGRetrievalBaselines = async ({\n\tstore,\n\tcorpusGroupKey,\n\tgroupKey,\n\ttag,\n\tlimit,\n\tstatus\n}: {\n\tstore: RAGRetrievalBaselineStore;\n\tcorpusGroupKey?: string;\n\tgroupKey?: string;\n\ttag?: string;\n\tlimit?: number;\n\tstatus?: RAGRetrievalBaselineRecord['status'];\n}) =>\n\tnormalizeRetrievalBaselineRecords(\n\t\tawait Promise.resolve(\n\t\t\tstore.listBaselines({\n\t\t\t\tcorpusGroupKey,\n\t\t\t\tgroupKey,\n\t\t\t\tlimit,\n\t\t\t\tstatus,\n\t\t\t\ttag\n\t\t\t})\n\t\t)\n\t);\n\nexport const persistRAGRetrievalBaseline = async ({\n\tstore,\n\trecord\n}: {\n\tstore: RAGRetrievalBaselineStore;\n\trecord: RAGRetrievalBaselineRecord;\n}) => {\n\tawait Promise.resolve(store.saveBaseline(record));\n\treturn record;\n};\n\nexport const loadRAGRetrievalReleaseDecisions = async ({\n\tstore,\n\tcorpusGroupKey,\n\tgroupKey,\n\tlimit,\n\tkind\n}: {\n\tstore: RAGRetrievalReleaseDecisionStore;\n\tcorpusGroupKey?: string;\n\tgroupKey?: string;\n\tlimit?: number;\n\tkind?: RAGRetrievalReleaseDecisionRecord['kind'];\n}) =>\n\tnormalizeRetrievalReleaseDecisionRecords(\n\t\tawait Promise.resolve(\n\t\t\tstore.listDecisions({ corpusGroupKey, groupKey, kind, limit })\n\t\t)\n\t);\n\nexport const loadRAGRetrievalLaneHandoffDecisions = async ({\n\tstore,\n\tcorpusGroupKey,\n\tgroupKey,\n\tlimit,\n\tkind,\n\tsourceRolloutLabel,\n\ttargetRolloutLabel\n}: {\n\tstore: RAGRetrievalLaneHandoffDecisionStore;\n\tcorpusGroupKey?: string;\n\tgroupKey?: string;\n\tlimit?: number;\n\tkind?: RAGRetrievalLaneHandoffDecisionRecord['kind'];\n\tsourceRolloutLabel?: RAGRetrievalLaneHandoffDecisionRecord['sourceRolloutLabel'];\n\ttargetRolloutLabel?: RAGRetrievalLaneHandoffDecisionRecord['targetRolloutLabel'];\n}) =>\n\tnormalizeRetrievalLaneHandoffDecisionRecords(\n\t\tawait Promise.resolve(\n\t\t\tstore.listDecisions({\n\t\t\t\tcorpusGroupKey,\n\t\t\t\tgroupKey,\n\t\t\t\tkind,\n\t\t\t\tlimit,\n\t\t\t\tsourceRolloutLabel,\n\t\t\t\ttargetRolloutLabel\n\t\t\t})\n\t\t)\n\t);\n\nexport const loadRAGRetrievalReleaseIncidents = async ({\n\tstore,\n\tgroupKey,\n\tlimit,\n\ttargetRolloutLabel,\n\tstatus,\n\tseverity\n}: {\n\tstore: RAGRetrievalReleaseIncidentStore;\n\tgroupKey?: string;\n\tlimit?: number;\n\ttargetRolloutLabel?: RAGRetrievalReleaseIncidentRecord['targetRolloutLabel'];\n\tstatus?: RAGRetrievalReleaseIncidentRecord['status'];\n\tseverity?: RAGRetrievalReleaseIncidentRecord['severity'];\n}) =>\n\tnormalizeRetrievalReleaseIncidentRecords(\n\t\tawait Promise.resolve(\n\t\t\tstore.listIncidents({\n\t\t\t\tgroupKey,\n\t\t\t\tlimit,\n\t\t\t\tseverity,\n\t\t\t\tstatus,\n\t\t\t\ttargetRolloutLabel\n\t\t\t})\n\t\t)\n\t);\n\nexport const loadRAGRetrievalLaneHandoffIncidents = async ({\n\tstore,\n\tcorpusGroupKey,\n\tgroupKey,\n\tlimit,\n\ttargetRolloutLabel,\n\tstatus,\n\tseverity\n}: {\n\tstore: RAGRetrievalLaneHandoffIncidentStore;\n\tcorpusGroupKey?: string;\n\tgroupKey?: string;\n\tlimit?: number;\n\ttargetRolloutLabel?: RAGRetrievalLaneHandoffIncidentRecord['targetRolloutLabel'];\n\tstatus?: RAGRetrievalLaneHandoffIncidentRecord['status'];\n\tseverity?: RAGRetrievalLaneHandoffIncidentRecord['severity'];\n}) =>\n\tnormalizeRetrievalReleaseIncidentRecords(\n\t\t(await Promise.resolve(\n\t\t\tstore.listIncidents({\n\t\t\t\tcorpusGroupKey,\n\t\t\t\tgroupKey,\n\t\t\t\tlimit,\n\t\t\t\tseverity,\n\t\t\t\tstatus,\n\t\t\t\ttargetRolloutLabel\n\t\t\t})\n\t\t)) as RAGRetrievalReleaseIncidentRecord[]\n\t) as RAGRetrievalLaneHandoffIncidentRecord[];\n\nexport const loadRAGRetrievalLaneHandoffIncidentHistory = async ({\n\tstore,\n\tcorpusGroupKey,\n\taction,\n\tgroupKey,\n\tincidentId,\n\tlimit,\n\ttargetRolloutLabel\n}: {\n\tstore: RAGRetrievalLaneHandoffIncidentHistoryStore;\n\tcorpusGroupKey?: string;\n\taction?: RAGRetrievalLaneHandoffIncidentHistoryRecord['action'];\n\tgroupKey?: string;\n\tincidentId?: string;\n\tlimit?: number;\n\ttargetRolloutLabel?: RAGRetrievalLaneHandoffIncidentRecord['targetRolloutLabel'];\n}) =>\n\t(await Promise.resolve(\n\t\tstore.listRecords({\n\t\t\tcorpusGroupKey,\n\t\t\taction,\n\t\t\tgroupKey,\n\t\t\tincidentId,\n\t\t\tlimit,\n\t\t\ttargetRolloutLabel\n\t\t})\n\t)) as RAGRetrievalLaneHandoffIncidentHistoryRecord[];\n\nexport const loadRAGRetrievalIncidentRemediationDecisions = async ({\n\tstore,\n\tgroupKey,\n\tincidentId,\n\tlimit,\n\tremediationKind,\n\tstatus,\n\ttargetRolloutLabel\n}: {\n\tstore: RAGRetrievalIncidentRemediationDecisionStore;\n\tgroupKey?: string;\n\tincidentId?: string;\n\tlimit?: number;\n\tremediationKind?: RAGRetrievalIncidentRemediationDecisionRecord['remediationKind'];\n\tstatus?: RAGRetrievalIncidentRemediationDecisionRecord['status'];\n\ttargetRolloutLabel?: RAGRetrievalIncidentRemediationDecisionRecord['targetRolloutLabel'];\n}) =>\n\tnormalizeRetrievalIncidentRemediationDecisionRecords(\n\t\tawait Promise.resolve(\n\t\t\tstore.listRecords({\n\t\t\t\tgroupKey,\n\t\t\t\tincidentId,\n\t\t\t\tlimit,\n\t\t\t\tremediationKind,\n\t\t\t\tstatus,\n\t\t\t\ttargetRolloutLabel\n\t\t\t})\n\t\t)\n\t);\n\nexport const loadRAGRetrievalIncidentRemediationExecutionHistory = async ({\n\tstore,\n\tactionKind,\n\tblockedByGuardrail,\n\tcode,\n\tgroupKey,\n\tidempotentReplay,\n\tincidentId,\n\tlimit,\n\ttargetRolloutLabel\n}: {\n\tstore: RAGRetrievalIncidentRemediationExecutionHistoryStore;\n\tactionKind?: RAGRemediationAction['kind'];\n\tblockedByGuardrail?: boolean;\n\tcode?: RAGRetrievalIncidentRemediationExecutionHistoryRecord['code'];\n\tgroupKey?: string;\n\tidempotentReplay?: boolean;\n\tincidentId?: string;\n\tlimit?: number;\n\ttargetRolloutLabel?: RAGRetrievalIncidentRemediationExecutionHistoryRecord['targetRolloutLabel'];\n}) =>\n\tnormalizeRetrievalIncidentRemediationExecutionHistoryRecords(\n\t\tawait Promise.resolve(\n\t\t\tstore.listRecords({\n\t\t\t\tactionKind,\n\t\t\t\tblockedByGuardrail,\n\t\t\t\tcode,\n\t\t\t\tgroupKey,\n\t\t\t\tidempotentReplay,\n\t\t\t\tincidentId,\n\t\t\t\tlimit,\n\t\t\t\ttargetRolloutLabel\n\t\t\t})\n\t\t)\n\t);\n\nexport const loadRAGRetrievalLaneHandoffAutoCompletePolicyHistory = async ({\n\tstore,\n\tcorpusGroupKey,\n\tgroupKey,\n\tlimit,\n\ttargetRolloutLabel\n}: {\n\tstore: RAGRetrievalLaneHandoffAutoCompletePolicyHistoryStore;\n\tcorpusGroupKey?: string;\n\tgroupKey?: string;\n\tlimit?: number;\n\ttargetRolloutLabel?: RAGRetrievalLaneHandoffAutoCompletePolicyHistoryRecord['targetRolloutLabel'];\n}) =>\n\t(await Promise.resolve(\n\t\tstore.listRecords({\n\t\t\tcorpusGroupKey,\n\t\t\tgroupKey,\n\t\t\tlimit,\n\t\t\ttargetRolloutLabel\n\t\t})\n\t)) as RAGRetrievalLaneHandoffAutoCompletePolicyHistoryRecord[];\n\nexport const loadRAGRetrievalReleaseLanePolicyHistory = async ({\n\tstore,\n\tcorpusGroupKey,\n\tgroupKey,\n\tlimit,\n\trolloutLabel,\n\tscope\n}: {\n\tstore: RAGRetrievalReleaseLanePolicyHistoryStore;\n\tcorpusGroupKey?: string;\n\tgroupKey?: string;\n\tlimit?: number;\n\trolloutLabel?: RAGRetrievalReleaseLanePolicyHistoryRecord['rolloutLabel'];\n\tscope?: RAGRetrievalReleaseLanePolicyHistoryRecord['scope'];\n}) =>\n\t(await Promise.resolve(\n\t\tstore.listRecords({\n\t\t\tcorpusGroupKey,\n\t\t\tgroupKey,\n\t\t\tlimit,\n\t\t\trolloutLabel,\n\t\t\tscope\n\t\t})\n\t)) as RAGRetrievalReleaseLanePolicyHistoryRecord[];\n\nexport const loadRAGRetrievalBaselineGatePolicyHistory = async ({\n\tstore,\n\tcorpusGroupKey,\n\tgroupKey,\n\tlimit,\n\trolloutLabel,\n\tscope\n}: {\n\tstore: RAGRetrievalBaselineGatePolicyHistoryStore;\n\tcorpusGroupKey?: string;\n\tgroupKey?: string;\n\tlimit?: number;\n\trolloutLabel?: RAGRetrievalBaselineGatePolicyHistoryRecord['rolloutLabel'];\n\tscope?: RAGRetrievalBaselineGatePolicyHistoryRecord['scope'];\n}) =>\n\t(await Promise.resolve(\n\t\tstore.listRecords({\n\t\t\tcorpusGroupKey,\n\t\t\tgroupKey,\n\t\t\tlimit,\n\t\t\trolloutLabel,\n\t\t\tscope\n\t\t})\n\t)) as RAGRetrievalBaselineGatePolicyHistoryRecord[];\n\nexport const loadRAGRetrievalReleaseLaneEscalationPolicyHistory = async ({\n\tstore,\n\tcorpusGroupKey,\n\tgroupKey,\n\tlimit,\n\ttargetRolloutLabel\n}: {\n\tstore: RAGRetrievalReleaseLaneEscalationPolicyHistoryStore;\n\tcorpusGroupKey?: string;\n\tgroupKey?: string;\n\tlimit?: number;\n\ttargetRolloutLabel?: RAGRetrievalReleaseLaneEscalationPolicyHistoryRecord['targetRolloutLabel'];\n}) =>\n\t(await Promise.resolve(\n\t\tstore.listRecords({\n\t\t\tgroupKey,\n\t\t\tlimit,\n\t\t\ttargetRolloutLabel\n\t\t})\n\t)) as RAGRetrievalReleaseLaneEscalationPolicyHistoryRecord[];\n\nexport const persistRAGRetrievalReleaseDecision = async ({\n\tstore,\n\trecord\n}: {\n\tstore: RAGRetrievalReleaseDecisionStore;\n\trecord: RAGRetrievalReleaseDecisionRecord;\n}) => {\n\tawait Promise.resolve(store.saveDecision(record));\n\treturn record;\n};\n\nexport const persistRAGRetrievalLaneHandoffDecision = async ({\n\tstore,\n\trecord\n}: {\n\tstore: RAGRetrievalLaneHandoffDecisionStore;\n\trecord: RAGRetrievalLaneHandoffDecisionRecord;\n}) => {\n\tawait Promise.resolve(store.saveDecision(record));\n\treturn record;\n};\n\nexport const persistRAGRetrievalReleaseIncident = async ({\n\tstore,\n\trecord\n}: {\n\tstore: RAGRetrievalReleaseIncidentStore;\n\trecord: RAGRetrievalReleaseIncidentRecord;\n}) => {\n\tawait Promise.resolve(store.saveIncident(record));\n\treturn record;\n};\n\nexport const persistRAGRetrievalLaneHandoffIncident = async ({\n\tstore,\n\trecord\n}: {\n\tstore: RAGRetrievalLaneHandoffIncidentStore;\n\trecord: RAGRetrievalLaneHandoffIncidentRecord;\n}) => {\n\tawait Promise.resolve(store.saveIncident(record));\n\treturn record;\n};\n\nexport const persistRAGRetrievalIncidentRemediationDecision = async ({\n\tstore,\n\trecord\n}: {\n\tstore: RAGRetrievalIncidentRemediationDecisionStore;\n\trecord: RAGRetrievalIncidentRemediationDecisionRecord;\n}) => {\n\tawait Promise.resolve(store.saveRecord(record));\n\treturn record;\n};\n\nexport const persistRAGRetrievalIncidentRemediationExecutionHistory = async ({\n\tstore,\n\trecord\n}: {\n\tstore: RAGRetrievalIncidentRemediationExecutionHistoryStore;\n\trecord: RAGRetrievalIncidentRemediationExecutionHistoryRecord;\n}) => {\n\tawait Promise.resolve(store.saveRecord(record));\n\treturn record;\n};\n\nexport const persistRAGRetrievalLaneHandoffIncidentHistory = async ({\n\tstore,\n\trecord\n}: {\n\tstore: RAGRetrievalLaneHandoffIncidentHistoryStore;\n\trecord: RAGRetrievalLaneHandoffIncidentHistoryRecord;\n}) => {\n\tawait Promise.resolve(store.saveRecord(record));\n\treturn record;\n};\n\nexport const persistRAGRetrievalLaneHandoffAutoCompletePolicyHistory = async ({\n\tstore,\n\trecord\n}: {\n\tstore: RAGRetrievalLaneHandoffAutoCompletePolicyHistoryStore;\n\trecord: RAGRetrievalLaneHandoffAutoCompletePolicyHistoryRecord;\n}) => {\n\tawait Promise.resolve(store.saveRecord(record));\n\treturn record;\n};\n\nexport const persistRAGRetrievalReleaseLanePolicyHistory = async ({\n\tstore,\n\trecord\n}: {\n\tstore: RAGRetrievalReleaseLanePolicyHistoryStore;\n\trecord: RAGRetrievalReleaseLanePolicyHistoryRecord;\n}) => {\n\tawait Promise.resolve(store.saveRecord(record));\n\treturn record;\n};\n\nexport const persistRAGRetrievalBaselineGatePolicyHistory = async ({\n\tstore,\n\trecord\n}: {\n\tstore: RAGRetrievalBaselineGatePolicyHistoryStore;\n\trecord: RAGRetrievalBaselineGatePolicyHistoryRecord;\n}) => {\n\tawait Promise.resolve(store.saveRecord(record));\n\treturn record;\n};\n\nexport const persistRAGRetrievalReleaseLaneEscalationPolicyHistory = async ({\n\tstore,\n\trecord\n}: {\n\tstore: RAGRetrievalReleaseLaneEscalationPolicyHistoryStore;\n\trecord: RAGRetrievalReleaseLaneEscalationPolicyHistoryRecord;\n}) => {\n\tawait Promise.resolve(store.saveRecord(record));\n\treturn record;\n};\n\nexport const buildRAGEvaluationResponse = (\n\tcases: RAGEvaluationCaseResult[]\n): RAGEvaluationResponse => {\n\tconst totalCases = cases.length;\n\tconst corpusKeys = [\n\t\t...new Set(cases.flatMap((entry) => entry.corpusKey ?? []))\n\t];\n\tconst passedCases = cases.filter((entry) => entry.status === 'pass').length;\n\tconst partialCases = cases.filter(\n\t\t(entry) => entry.status === 'partial'\n\t).length;\n\tconst failedCases = cases.filter((entry) => entry.status === 'fail').length;\n\n\treturn {\n\t\tcases,\n\t\t...(corpusKeys.length > 0 ? { corpusKeys } : {}),\n\t\telapsedMs: cases.reduce((sum, result) => sum + result.elapsedMs, 0),\n\t\tok: true,\n\t\tpassingRate: totalCases > 0 ? (passedCases / totalCases) * 100 : 0,\n\t\tsummary: {\n\t\t\taverageF1:\n\t\t\t\tcases.reduce((sum, result) => sum + result.f1, 0) /\n\t\t\t\t(totalCases || 1),\n\t\t\taverageLatencyMs:\n\t\t\t\tcases.reduce((sum, result) => sum + result.elapsedMs, 0) /\n\t\t\t\t(totalCases || 1),\n\t\t\taveragePrecision:\n\t\t\t\tcases.reduce((sum, result) => sum + result.precision, 0) /\n\t\t\t\t(totalCases || 1),\n\t\t\taverageRecall:\n\t\t\t\tcases.reduce((sum, result) => sum + result.recall, 0) /\n\t\t\t\t(totalCases || 1),\n\t\t\tfailedCases,\n\t\t\tpartialCases,\n\t\t\tpassedCases,\n\t\t\ttotalCases\n\t\t},\n\t\ttotalCases\n\t};\n};\n\nexport const evaluateRAGAnswerGroundingCase = ({\n\tcaseIndex,\n\tcaseInput\n}: {\n\tcaseIndex: number;\n\tcaseInput: RAGAnswerGroundingEvaluationCase;\n}): RAGAnswerGroundingEvaluationCaseResult => {\n\tconst mode = resolveEvaluationMode(caseInput);\n\tconst expectedIds = normalizeExpectedIds(\n\t\tmode === 'chunkId'\n\t\t\t? (caseInput.expectedChunkIds ?? [])\n\t\t\t: mode === 'source'\n\t\t\t\t? (caseInput.expectedSources ?? [])\n\t\t\t\t: (caseInput.expectedDocumentIds ?? [])\n\t);\n\tconst groundedAnswer = buildRAGGroundedAnswer(\n\t\tcaseInput.answer,\n\t\tcaseInput.sources\n\t);\n\tconst citedReferences = groundedAnswer.parts.flatMap((part) =>\n\t\tpart.type === 'citation' ? part.references : []\n\t);\n\tconst citedIds = normalizeExpectedIds(\n\t\tcitedReferences.map((reference) => extractExpectedId(reference, mode))\n\t);\n\tconst expectedSet = new Set(expectedIds);\n\tconst citedSet = new Set(citedIds);\n\tconst matchedIds = normalizeExpectedIds(\n\t\t[...expectedSet].filter((id) => citedSet.has(id))\n\t);\n\tconst missingIds = normalizeExpectedIds(\n\t\t[...expectedSet].filter((id) => !citedSet.has(id))\n\t);\n\tconst extraIds = normalizeExpectedIds(\n\t\t[...citedSet].filter((id) => !expectedSet.has(id))\n\t);\n\tconst matchedCount = matchedIds.length;\n\tconst expectedCount = expectedIds.length;\n\tconst citedCount = citedIds.length;\n\tconst precision = citedCount > 0 ? matchedCount / citedCount : 0;\n\tconst recall = expectedCount > 0 ? matchedCount / expectedCount : 0;\n\tconst citationF1 =\n\t\tprecision + recall > 0\n\t\t\t? (2 * precision * recall) / (precision + recall)\n\t\t\t: 0;\n\tconst citationCount = groundedAnswer.parts.filter(\n\t\t(part) => part.type === 'citation'\n\t).length;\n\tconst unresolvedCitationCount = new Set(\n\t\tgroundedAnswer.ungroundedReferenceNumbers\n\t).size;\n\tconst resolvedCitationCount = citedReferences.length;\n\tconst resolvedCitationRate =\n\t\tcitationCount > 0\n\t\t\t? Math.min(1, resolvedCitationCount / citationCount)\n\t\t\t: 0;\n\n\treturn {\n\t\tanswer: caseInput.answer,\n\t\tcaseId: caseInput.id ?? `case-${caseIndex + 1}`,\n\t\tcitationCount,\n\t\tcitationF1,\n\t\tcitationPrecision: precision,\n\t\tcitationRecall: recall,\n\t\tcitedIds,\n\t\tcoverage: groundedAnswer.coverage,\n\t\texpectedCount,\n\t\texpectedIds,\n\t\textraIds,\n\t\tgroundedAnswer,\n\t\thasCitations: groundedAnswer.hasCitations,\n\t\tlabel: caseInput.label,\n\t\tmatchedCount,\n\t\tmatchedIds,\n\t\tmetadata: caseInput.metadata,\n\t\tmissingIds,\n\t\tmode,\n\t\tquery: caseInput.query,\n\t\treferenceCount: groundedAnswer.references.length,\n\t\tresolvedCitationCount,\n\t\tresolvedCitationRate,\n\t\tstatus: buildAnswerGroundingStatus({\n\t\t\tcoverage: groundedAnswer.coverage,\n\t\t\texpectedCount,\n\t\t\tmatchedCount,\n\t\t\tresolvedCitationCount,\n\t\t\tunresolvedCitationCount\n\t\t}),\n\t\tunresolvedCitationCount\n\t};\n};\n\nexport const buildRAGAnswerGroundingEvaluationResponse = (\n\tcases: RAGAnswerGroundingEvaluationCaseResult[]\n): RAGAnswerGroundingEvaluationResponse => {\n\tconst totalCases = cases.length;\n\tconst passedCases = cases.filter((entry) => entry.status === 'pass').length;\n\tconst partialCases = cases.filter(\n\t\t(entry) => entry.status === 'partial'\n\t).length;\n\tconst failedCases = cases.filter((entry) => entry.status === 'fail').length;\n\tconst groundedCases = cases.filter(\n\t\t(entry) => entry.coverage === 'grounded'\n\t).length;\n\tconst partiallyGroundedCases = cases.filter(\n\t\t(entry) => entry.coverage === 'partial'\n\t).length;\n\tconst ungroundedCases = cases.filter(\n\t\t(entry) => entry.coverage === 'ungrounded'\n\t).length;\n\n\treturn {\n\t\tcases,\n\t\tok: true,\n\t\tpassingRate: totalCases > 0 ? (passedCases / totalCases) * 100 : 0,\n\t\tsummary: {\n\t\t\taverageCitationF1:\n\t\t\t\tcases.reduce((sum, result) => sum + result.citationF1, 0) /\n\t\t\t\t(totalCases || 1),\n\t\t\taverageCitationPrecision:\n\t\t\t\tcases.reduce(\n\t\t\t\t\t(sum, result) => sum + result.citationPrecision,\n\t\t\t\t\t0\n\t\t\t\t) / (totalCases || 1),\n\t\t\taverageCitationRecall:\n\t\t\t\tcases.reduce((sum, result) => sum + result.citationRecall, 0) /\n\t\t\t\t(totalCases || 1),\n\t\t\taverageResolvedCitationRate:\n\t\t\t\tcases.reduce(\n\t\t\t\t\t(sum, result) => sum + result.resolvedCitationRate,\n\t\t\t\t\t0\n\t\t\t\t) / (totalCases || 1),\n\t\t\tfailedCases,\n\t\t\tgroundedCases,\n\t\t\tpartiallyGroundedCases,\n\t\t\tpassedCases,\n\t\t\tpartialCases,\n\t\t\ttotalCases,\n\t\t\tungroundedCases\n\t\t},\n\t\ttotalCases\n\t};\n};\n\nexport const evaluateRAGAnswerGrounding = (\n\tinput: RAGAnswerGroundingEvaluationInput\n): RAGAnswerGroundingEvaluationResponse =>\n\tbuildRAGAnswerGroundingEvaluationResponse(\n\t\tinput.cases.map((caseInput, caseIndex) =>\n\t\t\tevaluateRAGAnswerGroundingCase({ caseIndex, caseInput })\n\t\t)\n\t);\nexport const compareRAGRerankers = async ({\n\tcollection,\n\tsuite,\n\trerankers,\n\tdefaultTopK = DEFAULT_TOP_K\n}: {\n\tcollection: RAGCollection;\n\tsuite: RAGEvaluationSuite;\n\trerankers: RAGRerankerCandidate[];\n\tdefaultTopK?: number;\n}): Promise<RAGRerankerComparison> => {\n\tconst entries = await Promise.all(\n\t\trerankers.map(async (candidate) => {\n\t\t\tconst evaluated = await evaluateRAGCollectionCases({\n\t\t\t\tcollection,\n\t\t\t\tdefaultTopK,\n\t\t\t\tinput: suite.input,\n\t\t\t\tincludeTrace: true,\n\t\t\t\trerank: candidate.rerank\n\t\t\t});\n\t\t\tconst response = buildRAGEvaluationResponse(\n\t\t\t\tevaluated.map((entry) => entry.caseResult)\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tcaseTraceSnapshots:\n\t\t\t\t\tbuildEvaluationCaseTraceSnapshotsFromEvaluated(evaluated),\n\t\t\t\tlabel: candidate.label ?? candidate.id,\n\t\t\t\tproviderName:\n\t\t\t\t\ttypeof candidate.rerank === 'function'\n\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t: candidate.rerank?.providerName,\n\t\t\t\tresponse,\n\t\t\t\trerankerId: candidate.id,\n\t\t\t\ttraceSummary: summarizeRetrievalTraces(\n\t\t\t\t\tevaluated\n\t\t\t\t\t\t.map((entry) => entry.trace)\n\t\t\t\t\t\t.filter((trace): trace is RAGRetrievalTrace =>\n\t\t\t\t\t\t\tBoolean(trace)\n\t\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t} satisfies RAGRerankerComparisonEntry;\n\t\t})\n\t);\n\n\tconst leaderboard = buildRAGEvaluationLeaderboard(\n\t\tentries.map((entry) => ({\n\t\t\telapsedMs: entry.response.elapsedMs,\n\t\t\tfinishedAt: 0,\n\t\t\tid: entry.rerankerId,\n\t\t\tlabel: entry.label,\n\t\t\tresponse: entry.response,\n\t\t\tstartedAt: 0,\n\t\t\tsuiteId: suite.id,\n\t\t\ttraceSummary: entry.traceSummary\n\t\t}))\n\t);\n\n\treturn {\n\t\tentries,\n\t\tleaderboard,\n\t\tsummary: summarizeRAGRerankerComparison(entries),\n\t\tsuiteId: suite.id,\n\t\tsuiteLabel: suite.label ?? suite.id\n\t};\n};\nconst summarizeEvaluationResponseComparison = <\n\tTEntry extends {\n\t\tresponse: RAGEvaluationResponse;\n\t\t[key: string]: unknown;\n\t}\n>(\n\tentries: TEntry[],\n\tidKey: keyof TEntry\n) => {\n\tif (entries.length === 0) {\n\t\treturn {};\n\t}\n\n\tconst byPassingRate = [...entries].sort((left, right) => {\n\t\tif (right.response.passingRate !== left.response.passingRate) {\n\t\t\treturn right.response.passingRate - left.response.passingRate;\n\t\t}\n\t\tif (\n\t\t\tright.response.summary.averageF1 !== left.response.summary.averageF1\n\t\t) {\n\t\t\treturn (\n\t\t\t\tright.response.summary.averageF1 -\n\t\t\t\tleft.response.summary.averageF1\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\tleft.response.summary.averageLatencyMs -\n\t\t\tright.response.summary.averageLatencyMs\n\t\t);\n\t});\n\tconst byAverageF1 = [...entries].sort(\n\t\t(left, right) =>\n\t\t\tright.response.summary.averageF1 - left.response.summary.averageF1\n\t);\n\tconst byLatency = [...entries].sort(\n\t\t(left, right) =>\n\t\t\tleft.response.summary.averageLatencyMs -\n\t\t\tright.response.summary.averageLatencyMs\n\t);\n\tconst getId = (entry: TEntry) =>\n\t\ttypeof entry[idKey] === 'string' ? (entry[idKey] as string) : undefined;\n\n\treturn {\n\t\tbestByAverageF1: getId(byAverageF1[0] as TEntry),\n\t\tbestByPassingRate: getId(byPassingRate[0] as TEntry),\n\t\tfastest: getId(byLatency[0] as TEntry)\n\t};\n};\nconst resolveRetrievalMode = (\n\tcandidate: RAGRetrievalCandidate\n): RAGHybridRetrievalMode => {\n\tif (!candidate.retrieval) {\n\t\treturn 'vector';\n\t}\n\n\treturn typeof candidate.retrieval === 'string'\n\t\t? candidate.retrieval\n\t\t: (candidate.retrieval.mode ?? 'vector');\n};\nexport const compareRAGRetrievalStrategies = async ({\n\tcollection,\n\tsuite,\n\tretrievals,\n\tdefaultTopK = DEFAULT_TOP_K\n}: {\n\tcollection: RAGCollection;\n\tsuite: RAGEvaluationSuite;\n\tretrievals: RAGRetrievalCandidate[];\n\tdefaultTopK?: number;\n}): Promise<RAGRetrievalComparison> => {\n\tconst entries = await Promise.all(\n\t\tretrievals.map(async (candidate) => {\n\t\t\tconst tracedCollection = {\n\t\t\t\t...collection,\n\t\t\t\tsearch: (input) =>\n\t\t\t\t\tcollection.search({\n\t\t\t\t\t\t...input,\n\t\t\t\t\t\tqueryTransform:\n\t\t\t\t\t\t\tcandidate.queryTransform ?? input.queryTransform,\n\t\t\t\t\t\trerank: candidate.rerank ?? input.rerank,\n\t\t\t\t\t\tretrieval: candidate.retrieval ?? input.retrieval\n\t\t\t\t\t}),\n\t\t\t\tsearchWithTrace: (input) =>\n\t\t\t\t\tcollection.searchWithTrace({\n\t\t\t\t\t\t...input,\n\t\t\t\t\t\tqueryTransform:\n\t\t\t\t\t\t\tcandidate.queryTransform ?? input.queryTransform,\n\t\t\t\t\t\trerank: candidate.rerank ?? input.rerank,\n\t\t\t\t\t\tretrieval: candidate.retrieval ?? input.retrieval\n\t\t\t\t\t})\n\t\t\t} satisfies RAGCollection;\n\t\t\tconst evaluated = await evaluateRAGCollectionCases({\n\t\t\t\tcollection: {\n\t\t\t\t\t...tracedCollection\n\t\t\t\t},\n\t\t\t\tdefaultTopK,\n\t\t\t\tinput: suite.input,\n\t\t\t\tincludeTrace: true,\n\t\t\t\trerank: candidate.rerank\n\t\t\t});\n\t\t\tconst response = buildRAGEvaluationResponse(\n\t\t\t\tevaluated.map((entry) => entry.caseResult)\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tcaseTraceSnapshots:\n\t\t\t\t\tbuildEvaluationCaseTraceSnapshotsFromEvaluated(evaluated),\n\t\t\t\tlabel: candidate.label ?? candidate.id,\n\t\t\t\tresponse,\n\t\t\t\tretrievalId: candidate.id,\n\t\t\t\tretrievalMode: resolveRetrievalMode(candidate),\n\t\t\t\ttraceSummary: summarizeRetrievalTraces(\n\t\t\t\t\tevaluated\n\t\t\t\t\t\t.map((entry) => entry.trace)\n\t\t\t\t\t\t.filter((trace): trace is RAGRetrievalTrace =>\n\t\t\t\t\t\t\tBoolean(trace)\n\t\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t} satisfies RAGRetrievalComparisonEntry;\n\t\t})\n\t);\n\n\tconst leaderboard = buildRAGEvaluationLeaderboard(\n\t\tentries.map((entry) => ({\n\t\t\telapsedMs: entry.response.elapsedMs,\n\t\t\tfinishedAt: 0,\n\t\t\tid: entry.retrievalId,\n\t\t\tlabel: entry.label,\n\t\t\tresponse: entry.response,\n\t\t\tstartedAt: 0,\n\t\t\tsuiteId: suite.id,\n\t\t\ttraceSummary: entry.traceSummary\n\t\t}))\n\t);\n\n\treturn {\n\t\tcorpusKeys: [\n\t\t\t...new Set(\n\t\t\t\tentries.flatMap((entry) => entry.response.corpusKeys ?? [])\n\t\t\t)\n\t\t],\n\t\tentries,\n\t\tleaderboard,\n\t\tsummary: summarizeRAGRetrievalComparison(entries),\n\t\tsuiteId: suite.id,\n\t\tsuiteLabel: suite.label ?? suite.id\n\t};\n};\n\nexport const summarizeRAGRetrievalTraces = (\n\ttraces: RAGRetrievalTrace[]\n): RAGRetrievalTraceComparisonSummary | undefined =>\n\tsummarizeRetrievalTraces(traces);\n\nexport const compareRAGRetrievalTraceSummaries = (\n\tcurrent: RAGRetrievalTraceComparisonSummary,\n\tprevious: RAGRetrievalTraceComparisonSummary\n): RAGRetrievalTraceComparisonSummaryDiff => ({\n\taverageCandidateTopKDelta:\n\t\tcurrent.averageCandidateTopK - previous.averageCandidateTopK,\n\taverageFinalCountDelta:\n\t\tcurrent.averageFinalCount - previous.averageFinalCount,\n\taverageLexicalCountDelta:\n\t\tcurrent.averageLexicalCount - previous.averageLexicalCount,\n\taverageLexicalTopKDelta:\n\t\tcurrent.averageLexicalTopK - previous.averageLexicalTopK,\n\taverageVectorCountDelta:\n\t\tcurrent.averageVectorCount - previous.averageVectorCount,\n\tbalancedCasesDelta: current.balancedCases - previous.balancedCases,\n\tcurrent,\n\tlexicalCasesDelta: current.lexicalCases - previous.lexicalCases,\n\tmodeDelta: buildSummaryListDelta(current.modes, previous.modes),\n\tprevious,\n\troundRobinCasesDelta: current.roundRobinCases - previous.roundRobinCases,\n\tsourceBalanceStrategyDelta: buildSummaryListDelta(\n\t\tcurrent.sourceBalanceStrategies,\n\t\tprevious.sourceBalanceStrategies\n\t),\n\tstageCountsDelta: diffTraceSummaryStageCounts({\n\t\tcurrent: current.stageCounts,\n\t\tprevious: previous.stageCounts\n\t}),\n\ttotalCasesDelta: current.totalCases - previous.totalCases,\n\ttransformedCasesDelta: current.transformedCases - previous.transformedCases,\n\tvectorCasesDelta: current.vectorCases - previous.vectorCases,\n\tvariantCasesDelta: current.variantCases - previous.variantCases\n});\n\nconst buildSearchTraceResultSnapshots = (\n\tresults: Array<{\n\t\tchunkId: string;\n\t\tcorpusKey?: string;\n\t\tscore: number;\n\t\tsource?: string;\n\t\ttitle?: string;\n\t\tmetadata?: Record<string, unknown>;\n\t}>\n): RAGSearchTraceResultSnapshot[] =>\n\tresults.map((result) => ({\n\t\tchunkId: result.chunkId,\n\t\tcorpusKey:\n\t\t\tresult.corpusKey ??\n\t\t\t(typeof result.metadata?.corpusKey === 'string'\n\t\t\t\t? result.metadata.corpusKey\n\t\t\t\t: undefined),\n\t\tdocumentId:\n\t\t\ttypeof result.metadata?.documentId === 'string'\n\t\t\t\t? result.metadata.documentId\n\t\t\t\t: undefined,\n\t\tscore: result.score,\n\t\tsource: result.source,\n\t\ttitle: result.title\n\t}));\n\nexport const buildRAGSearchTraceRecord = (input: {\n\ttrace: RAGRetrievalTrace;\n\tresults?: Array<{\n\t\tchunkId: string;\n\t\tscore: number;\n\t\tsource?: string;\n\t\ttitle?: string;\n\t\tmetadata?: Record<string, unknown>;\n\t}>;\n\tid?: string;\n\tlabel?: string;\n\tgroupKey?: string;\n\ttags?: string[];\n\tstartedAt?: number;\n\tfinishedAt?: number;\n\telapsedMs?: number;\n\tmetadata?: Record<string, unknown>;\n}): RAGSearchTraceRecord => {\n\tconst startedAt = input.startedAt ?? Date.now();\n\tconst finishedAt = input.finishedAt ?? startedAt;\n\tconst elapsedMs = input.elapsedMs ?? Math.max(0, finishedAt - startedAt);\n\tconst summary =\n\t\tsummarizeRetrievalTraces([input.trace]) ??\n\t\tsummarizeRetrievalTraces([\n\t\t\t{\n\t\t\t\t...input.trace,\n\t\t\t\tsteps: [...input.trace.steps]\n\t\t\t}\n\t\t]);\n\n\tif (!summary) {\n\t\tthrow new Error('Failed to summarize retrieval trace');\n\t}\n\n\treturn {\n\t\telapsedMs,\n\t\tfinishedAt,\n\t\tgroupKey: input.groupKey,\n\t\tid: input.id ?? generateId(),\n\t\tlabel: input.label ?? input.trace.query,\n\t\tmetadata: input.metadata,\n\t\tquery: input.trace.query,\n\t\tresults: buildSearchTraceResultSnapshots(input.results ?? []),\n\t\tstartedAt,\n\t\tsummary,\n\t\ttags: normalizeTraceTags(input.tags),\n\t\ttrace: input.trace\n\t};\n};\n\nexport const buildRAGSearchTraceDiff = ({\n\tcurrent,\n\tprevious\n}: {\n\tcurrent: RAGSearchTraceRecord;\n\tprevious?: RAGSearchTraceRecord;\n}): RAGSearchTraceDiff => {\n\tconst currentChunkIds = current.results.map((entry) => entry.chunkId);\n\tconst previousChunkIds =\n\t\tprevious?.results.map((entry) => entry.chunkId) ?? [];\n\tconst previousSet = new Set(previousChunkIds);\n\tconst currentSet = new Set(currentChunkIds);\n\n\treturn {\n\t\taddedChunkIds: currentChunkIds.filter(\n\t\t\t(chunkId) => !previousSet.has(chunkId)\n\t\t),\n\t\tcurrentTraceId: current.id,\n\t\tpreviousTraceId: previous?.id,\n\t\tremovedChunkIds: previousChunkIds.filter(\n\t\t\t(chunkId) => !currentSet.has(chunkId)\n\t\t),\n\t\tretainedChunkIds: currentChunkIds.filter((chunkId) =>\n\t\t\tpreviousSet.has(chunkId)\n\t\t),\n\t\tsummaryDelta: previous?.summary\n\t\t\t? compareRAGRetrievalTraceSummaries(\n\t\t\t\t\tcurrent.summary,\n\t\t\t\t\tprevious.summary\n\t\t\t\t)\n\t\t\t: undefined,\n\t\ttopResultChanged:\n\t\t\t(current.results[0]?.chunkId ?? undefined) !==\n\t\t\t(previous?.results[0]?.chunkId ?? undefined)\n\t};\n};\n\nexport const buildRAGRetrievalTraceHistoryTrend = ({\n\truns\n}: {\n\truns: RAGRetrievalTraceSummaryRun[];\n}): RAGRetrievalTraceTrend => {\n\tconst sortedRuns = normalizeTraceSummaryRuns(runs);\n\tconst runsWithSummary = sortedRuns.filter(\n\t\t(run) => run.traceSummary && run.label\n\t);\n\tconst traceSummaries = runsWithSummary\n\t\t.map((run) => run.traceSummary)\n\t\t.filter((summary): summary is RAGRetrievalTraceComparisonSummary =>\n\t\t\tBoolean(summary)\n\t\t);\n\tconst summaryTrendWindows: RAGRetrievalTraceHistoryWindow[] = [];\n\n\tfor (let index = 0; index < runsWithSummary.length - 1; index += 1) {\n\t\tconst currentRun = runsWithSummary[index]!;\n\t\tconst previousRun = runsWithSummary[index + 1]!;\n\t\tif (!currentRun.traceSummary || !previousRun.traceSummary) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst current = currentRun.traceSummary;\n\t\tconst previous = previousRun.traceSummary;\n\t\tconst delta = compareRAGRetrievalTraceSummaries(current, previous);\n\t\tsummaryTrendWindows.push({\n\t\t\tcurrent,\n\t\t\tcurrentRunId: currentRun.id,\n\t\t\tcurrentRunLabel: currentRun.label,\n\t\t\tdelta,\n\t\t\tprevious,\n\t\t\tpreviousRunId: previousRun.id,\n\t\t\tpreviousRunLabel: previousRun.label\n\t\t});\n\t}\n\n\tconst latest = runsWithSummary[0]?.traceSummary;\n\tconst previous = runsWithSummary[1]?.traceSummary;\n\tconst latestToPrevious =\n\t\tlatest && previous\n\t\t\t? compareRAGRetrievalTraceSummaries(latest, previous)\n\t\t\t: undefined;\n\tconst listHistoryModes = traceSummaries.map((summary) => summary.modes);\n\tconst listHistorySourceStrategies = traceSummaries.map(\n\t\t(summary) => summary.sourceBalanceStrategies\n\t);\n\tconst modes = summarizeListTurnover<RAGHybridRetrievalMode>({\n\t\tcurrent: normalizeSummaryList(latest?.modes ?? []),\n\t\thistory: listHistoryModes,\n\t\tprevious: normalizeSummaryList(previous?.modes ?? [])\n\t});\n\tconst sourceBalanceStrategies =\n\t\tsummarizeListTurnover<RAGSourceBalanceStrategy>({\n\t\t\tcurrent: normalizeSummaryList(\n\t\t\t\tlatest?.sourceBalanceStrategies ?? []\n\t\t\t),\n\t\t\thistory: listHistorySourceStrategies,\n\t\t\tprevious: normalizeSummaryList(\n\t\t\t\tprevious?.sourceBalanceStrategies ?? []\n\t\t\t)\n\t\t});\n\tconst { aggregate, bestMetric, worstMetric } = buildTraceSummaryAggregate({\n\t\tsummaries: traceSummaries\n\t});\n\tconst stageChurn = buildRAGRetrievalTraceStageChurn({\n\t\twindows: summaryTrendWindows\n\t});\n\n\treturn {\n\t\taggregate,\n\t\tbestMetric,\n\t\tmodeTurnover: modes,\n\t\trunsWithTraceSummary: traceSummaries.length,\n\t\tsourceBalanceStrategyTurnover: sourceBalanceStrategies,\n\t\tstageChurn,\n\t\tsummaryTrendWindows,\n\t\tworstMetric,\n\t\tworstVolatileStage: stageChurn.find((entry) => entry.totalChanges > 0),\n\t\tlatestToPrevious\n\t};\n};\nexport const createRAGEvaluationSuite = (\n\tsuite: RAGEvaluationSuite\n): RAGEvaluationSuite => suite;\nexport const evaluateRAGCollection = async ({\n\tcollection,\n\tinput,\n\tdefaultTopK = DEFAULT_TOP_K,\n\trerank\n}: {\n\tcollection: RAGCollection;\n\tinput: RAGEvaluationInput;\n\tdefaultTopK?: number;\n\trerank?: RAGRerankerProviderLike;\n}) => {\n\tconst evaluated = await evaluateRAGCollectionCases({\n\t\tcollection,\n\t\tdefaultTopK,\n\t\tincludeTrace: false,\n\t\tinput,\n\t\trerank\n\t});\n\n\treturn buildRAGEvaluationResponse(\n\t\tevaluated.map((entry) => entry.caseResult)\n\t);\n};\nexport const executeDryRunRAGEvaluation = (\n\tinput: RAGEvaluationInput,\n\tdefaultTopK = DEFAULT_TOP_K\n): RAGEvaluationCaseResult[] =>\n\tinput.cases.map((caseInput, caseIndex) => {\n\t\tconst mode = resolveEvaluationMode(caseInput);\n\t\tconst expectedIds = normalizeExpectedIds(\n\t\t\tmode === 'chunkId'\n\t\t\t\t? (caseInput.expectedChunkIds ?? [])\n\t\t\t\t: mode === 'source'\n\t\t\t\t\t? (caseInput.expectedSources ?? [])\n\t\t\t\t\t: (caseInput.expectedDocumentIds ?? [])\n\t\t);\n\t\tconst effectiveTopK =\n\t\t\ttypeof caseInput.topK === 'number'\n\t\t\t\t? caseInput.topK\n\t\t\t\t: typeof input.topK === 'number'\n\t\t\t\t\t? input.topK\n\t\t\t\t\t: defaultTopK;\n\n\t\treturn {\n\t\t\tcaseId: caseInput.id ?? `case-${caseIndex + 1}`,\n\t\t\telapsedMs: 0,\n\t\t\texpectedCount: expectedIds.length,\n\t\t\texpectedIds,\n\t\t\tf1: 0,\n\t\t\tlabel: caseInput.label,\n\t\t\tmatchedCount: 0,\n\t\t\tmatchedIds: [],\n\t\t\tmissingIds: expectedIds,\n\t\t\tmode,\n\t\t\tprecision: 0,\n\t\t\tquery: caseInput.query,\n\t\t\trecall: 0,\n\t\t\tretrievedCount: 0,\n\t\t\tretrievedIds: [],\n\t\t\tstatus: expectedIds.length === 0 ? 'partial' : 'fail',\n\t\t\ttopK: effectiveTopK\n\t\t};\n\t});\nexport const runRAGEvaluationSuite = async ({\n\tsuite,\n\tevaluate,\n\toverrides,\n\tartifacts\n}: {\n\tsuite: RAGEvaluationSuite;\n\tevaluate: (input: RAGEvaluationInput) => Promise<RAGEvaluationResponse>;\n\toverrides?: Partial<RAGEvaluationInput>;\n\tartifacts?: Pick<\n\t\tRAGEvaluationSuiteRun,\n\t\t'traceSummary' | 'caseTraceSnapshots'\n\t>;\n}) => {\n\tconst startedAt = Date.now();\n\tconst response = await evaluate({\n\t\t...suite.input,\n\t\t...overrides,\n\t\tcases: overrides?.cases ?? suite.input.cases\n\t});\n\tconst finishedAt = Date.now();\n\n\treturn {\n\t\tcaseTraceSnapshots: artifacts?.caseTraceSnapshots,\n\t\telapsedMs: finishedAt - startedAt,\n\t\tfinishedAt,\n\t\tid: generateId(),\n\t\tlabel: suite.label ?? suite.id,\n\t\tmetadata: suite.metadata,\n\t\tresponse,\n\t\tstartedAt,\n\t\tsuiteId: suite.id,\n\t\ttraceSummary: artifacts?.traceSummary\n\t} satisfies RAGEvaluationSuiteRun;\n};\nexport const summarizeRAGEvaluationCase = ({\n\tcaseIndex,\n\tcaseInput,\n\tquery,\n\tmode,\n\tretrievedIds,\n\texpectedIds,\n\telapsedMs\n}: {\n\tcaseIndex: number;\n\tcaseInput: RAGEvaluationCase;\n\tmode: 'chunkId' | 'source' | 'documentId';\n\tquery: string;\n\tretrievedIds: string[];\n\texpectedIds: string[];\n\telapsedMs: number;\n}): RAGEvaluationCaseResult => {\n\tconst expectedSet = new Set(expectedIds);\n\tconst retrievedSet = new Set(retrievedIds);\n\tconst matchedIds = normalizeExpectedIds(\n\t\t[...expectedSet].filter((id) => retrievedSet.has(id))\n\t);\n\tconst missingIds = normalizeExpectedIds(\n\t\t[...expectedSet].filter((id) => !retrievedSet.has(id))\n\t);\n\tconst matchedCount = matchedIds.length;\n\tconst retrievedCount = retrievedIds.length;\n\tconst expectedCount = expectedIds.length;\n\tconst precision = retrievedCount > 0 ? matchedCount / retrievedCount : 0;\n\tconst recall = expectedCount > 0 ? matchedCount / expectedCount : 0;\n\tconst f1 =\n\t\tprecision + recall > 0\n\t\t\t? (2 * precision * recall) / (precision + recall)\n\t\t\t: 0;\n\tconst status: RAGEvaluationCaseResult['status'] =\n\t\texpectedCount === 0\n\t\t\t? 'partial'\n\t\t\t: matchedCount === expectedCount\n\t\t\t\t? 'pass'\n\t\t\t\t: matchedCount > 0\n\t\t\t\t\t? 'partial'\n\t\t\t\t\t: 'fail';\n\n\treturn {\n\t\tcaseId: caseInput.id ?? `case-${caseIndex + 1}`,\n\t\tcorpusKey: caseInput.corpusKey,\n\t\telapsedMs,\n\t\texpectedCount,\n\t\texpectedIds,\n\t\tf1,\n\t\tlabel: caseInput.label,\n\t\tmatchedCount,\n\t\tmatchedIds,\n\t\tmetadata: caseInput.metadata,\n\t\tmissingIds,\n\t\tmode,\n\t\tprecision,\n\t\tquery,\n\t\trecall,\n\t\tretrievedCount,\n\t\tretrievedIds,\n\t\tstatus,\n\t\ttopK:\n\t\t\ttypeof caseInput.topK === 'number' ? caseInput.topK : DEFAULT_TOP_K\n\t};\n};\nexport const summarizeRAGRerankerComparison = (\n\tentries: RAGRerankerComparisonEntry[]\n): RAGRerankerComparisonSummary => {\n\treturn summarizeEvaluationResponseComparison(\n\t\tentries,\n\t\t'rerankerId'\n\t) satisfies RAGRerankerComparisonSummary;\n};\nexport const summarizeRAGRetrievalComparison = (\n\tentries: RAGRetrievalComparisonEntry[]\n): RAGRetrievalComparisonSummary =>\n\tsummarizeEvaluationResponseComparison(\n\t\tentries,\n\t\t'retrievalId'\n\t) satisfies RAGRetrievalComparisonSummary;\n",
7
7
  "import type { AIServerMessage } from '../../types/ai';\nimport { isValidAIClientMessage } from '../../types/typeGuards';\n\nexport const generateId = () => crypto.randomUUID();\n\nexport const parseAIMessage = (raw: unknown) => {\n\tif (raw === null || raw === undefined) {\n\t\treturn null;\n\t}\n\n\tlet text: string;\n\n\tif (typeof raw === 'string') {\n\t\ttext = raw;\n\t} else if (raw instanceof ArrayBuffer) {\n\t\ttext = new TextDecoder().decode(raw);\n\t} else if (ArrayBuffer.isView(raw)) {\n\t\ttext = new TextDecoder().decode(raw);\n\t} else if (typeof raw === 'object') {\n\t\tif (isValidAIClientMessage(raw)) {\n\t\t\treturn raw;\n\t\t}\n\n\t\treturn null;\n\t} else {\n\t\treturn null;\n\t}\n\n\ttry {\n\t\tconst parsed: unknown = JSON.parse(text);\n\n\t\tif (isValidAIClientMessage(parsed)) {\n\t\t\treturn parsed;\n\t\t}\n\n\t\treturn null;\n\t} catch {\n\t\treturn null;\n\t}\n};\n\nexport const serializeAIMessage = (message: AIServerMessage) =>\n\tJSON.stringify(message);\n",
8
8
  "import type {\n\tRAGCitation,\n\tRAGCitationReferenceMap,\n\tRAGExcerptModeCounts,\n\tRAGGroundedAnswer,\n\tRAGGroundedAnswerCitationDetail,\n\tRAGGroundedAnswerSectionSummary,\n\tRAGGroundingReference,\n\tRAGSource\n} from '../../../types/ai';\n\nconst getContextString = (value: unknown) =>\n\ttypeof value === 'string' && value.trim().length > 0\n\t\t? value.trim()\n\t\t: undefined;\n\nconst getContextNumber = (value: unknown) =>\n\ttypeof value === 'number' && Number.isFinite(value) ? value : undefined;\n\nconst getAttachmentName = (source?: string, title?: string) => {\n\tconst sourceAttachment = source?.split('/').at(-1);\n\tif (sourceAttachment && sourceAttachment.includes('.')) {\n\t\treturn sourceAttachment;\n\t}\n\n\tconst titleAttachment = title?.split(' · ').at(-1);\n\tif (titleAttachment && titleAttachment.includes('.')) {\n\t\treturn titleAttachment;\n\t}\n\n\treturn undefined;\n};\n\nconst buildContextLabel = (metadata?: Record<string, unknown>) => {\n\tif (!metadata) {\n\t\treturn undefined;\n\t}\n\n\tconst emailKind = getContextString(metadata.emailKind);\n\tif (emailKind === 'attachment') {\n\t\treturn 'Attachment evidence';\n\t}\n\n\tif (emailKind === 'message') {\n\t\tconst from = getContextString(metadata.from);\n\t\treturn from ? `Message from ${from}` : 'Message evidence';\n\t}\n\n\tconst page =\n\t\tgetContextNumber(metadata.page) ??\n\t\tgetContextNumber(metadata.pageNumber) ??\n\t\t(typeof metadata.pageIndex === 'number'\n\t\t\t? metadata.pageIndex + 1\n\t\t\t: undefined);\n\tconst region =\n\t\tgetContextNumber(metadata.regionNumber) ??\n\t\t(typeof metadata.regionIndex === 'number'\n\t\t\t? metadata.regionIndex + 1\n\t\t\t: undefined);\n\tif (page && region) {\n\t\treturn `Page ${page} region ${region}`;\n\t}\n\tif (page) {\n\t\treturn `Page ${page}`;\n\t}\n\n\tconst sheet =\n\t\tgetContextString(metadata.sheetName) ??\n\t\t(Array.isArray(metadata.sheetNames)\n\t\t\t? getContextString(metadata.sheetNames[0])\n\t\t\t: undefined);\n\tif (sheet) {\n\t\treturn `Sheet ${sheet}`;\n\t}\n\n\tconst slide =\n\t\tgetContextNumber(metadata.slide) ??\n\t\tgetContextNumber(metadata.slideNumber) ??\n\t\t(typeof metadata.slideIndex === 'number'\n\t\t\t? metadata.slideIndex + 1\n\t\t\t: undefined);\n\tif (slide) {\n\t\treturn `Slide ${slide}`;\n\t}\n\n\tconst archiveEntry =\n\t\tgetContextString(metadata.archiveEntryPath) ??\n\t\tgetContextString(metadata.entryPath);\n\tif (archiveEntry) {\n\t\treturn `Archive entry ${archiveEntry}`;\n\t}\n\n\tconst threadTopic = getContextString(metadata.threadTopic);\n\tif (threadTopic) {\n\t\treturn `Thread ${threadTopic}`;\n\t}\n\n\tconst speaker = getContextString(metadata.speaker);\n\tif (speaker) {\n\t\treturn `Speaker ${speaker}`;\n\t}\n\n\tconst sectionPath = Array.isArray(metadata.sectionPath)\n\t\t? metadata.sectionPath\n\t\t\t\t.map((value) => getContextString(value))\n\t\t\t\t.filter((value): value is string => typeof value === 'string')\n\t\t: [];\n\tconst sectionTitle =\n\t\tgetContextString(metadata.sectionTitle) ?? sectionPath.at(-1);\n\tif (sectionTitle) {\n\t\treturn `Section ${sectionTitle}`;\n\t}\n\n\treturn undefined;\n};\n\nconst formatMediaTimestamp = (value: unknown) => {\n\tif (typeof value !== 'number' || !Number.isFinite(value) || value < 0) {\n\t\treturn undefined;\n\t}\n\n\tconst totalSeconds = Math.floor(value / 1000);\n\tconst minutes = Math.floor(totalSeconds / 60);\n\tconst seconds = totalSeconds % 60;\n\tconst milliseconds = Math.floor(value % 1000);\n\n\treturn `${String(minutes).padStart(2, '0')}:${String(seconds).padStart(\n\t\t2,\n\t\t'0'\n\t)}.${String(milliseconds).padStart(3, '0')}`;\n};\n\nconst buildLocatorLabel = (\n\tmetadata?: Record<string, unknown>,\n\tsource?: string,\n\ttitle?: string\n) => {\n\tif (!metadata) {\n\t\treturn undefined;\n\t}\n\n\tconst page =\n\t\tgetContextNumber(metadata.page) ??\n\t\tgetContextNumber(metadata.pageNumber) ??\n\t\t(typeof metadata.pageIndex === 'number'\n\t\t\t? metadata.pageIndex + 1\n\t\t\t: undefined);\n\tconst region =\n\t\tgetContextNumber(metadata.regionNumber) ??\n\t\t(typeof metadata.regionIndex === 'number'\n\t\t\t? metadata.regionIndex + 1\n\t\t\t: undefined);\n\tif (page && region) {\n\t\treturn `Page ${page} · Region ${region}`;\n\t}\n\tif (page) {\n\t\treturn `Page ${page}`;\n\t}\n\n\tconst sheet =\n\t\tgetContextString(metadata.sheetName) ??\n\t\t(Array.isArray(metadata.sheetNames)\n\t\t\t? getContextString(metadata.sheetNames[0])\n\t\t\t: undefined);\n\tif (sheet) {\n\t\treturn `Sheet ${sheet}`;\n\t}\n\n\tconst slide =\n\t\tgetContextNumber(metadata.slide) ??\n\t\tgetContextNumber(metadata.slideNumber) ??\n\t\t(typeof metadata.slideIndex === 'number'\n\t\t\t? metadata.slideIndex + 1\n\t\t\t: undefined);\n\tif (slide) {\n\t\treturn `Slide ${slide}`;\n\t}\n\n\tconst archiveEntry =\n\t\tgetContextString(metadata.archiveEntryPath) ??\n\t\tgetContextString(metadata.entryPath);\n\tif (archiveEntry) {\n\t\treturn `Archive entry ${archiveEntry}`;\n\t}\n\n\tconst emailKind = getContextString(metadata.emailKind);\n\tif (emailKind === 'attachment') {\n\t\tconst attachmentName =\n\t\t\tgetContextString(metadata.attachmentName) ??\n\t\t\tgetAttachmentName(source, title);\n\t\treturn attachmentName ? `Attachment ${attachmentName}` : 'Attachment';\n\t}\n\n\tconst mediaStart = formatMediaTimestamp(metadata.startMs);\n\tconst mediaEnd = formatMediaTimestamp(metadata.endMs);\n\tif (mediaStart && mediaEnd) {\n\t\treturn `Timestamp ${mediaStart} - ${mediaEnd}`;\n\t}\n\n\tif (mediaStart) {\n\t\treturn `Timestamp ${mediaStart}`;\n\t}\n\n\tconst sectionPath = Array.isArray(metadata.sectionPath)\n\t\t? metadata.sectionPath\n\t\t\t\t.map((value) => getContextString(value))\n\t\t\t\t.filter((value): value is string => typeof value === 'string')\n\t\t: [];\n\tif (sectionPath.length > 0) {\n\t\treturn `Section ${sectionPath.join(' > ')}`;\n\t}\n\n\treturn undefined;\n};\n\nconst formatTimestampLabel = (value: unknown) => {\n\tconst timestamp =\n\t\ttypeof value === 'number' && Number.isFinite(value)\n\t\t\t? value\n\t\t\t: typeof value === 'string'\n\t\t\t\t? Date.parse(value)\n\t\t\t\t: Number.NaN;\n\tif (!Number.isFinite(timestamp)) {\n\t\treturn undefined;\n\t}\n\n\treturn new Date(timestamp).toLocaleString('en-US', {\n\t\tdateStyle: 'medium',\n\t\ttimeStyle: 'short'\n\t});\n};\n\nconst buildProvenanceLabel = (metadata?: Record<string, unknown>) => {\n\tif (!metadata) {\n\t\treturn undefined;\n\t}\n\n\tconst threadTopic = getContextString(metadata.threadTopic);\n\tconst from = getContextString(metadata.from);\n\tconst sentAt =\n\t\tformatTimestampLabel(metadata.sentAt) ??\n\t\tformatTimestampLabel(metadata.receivedAt);\n\tconst speaker = getContextString(metadata.speaker);\n\tconst mediaKind = getContextString(metadata.mediaKind);\n\tconst transcriptSource = getContextString(metadata.transcriptSource);\n\tconst pdfTextMode = getContextString(metadata.pdfTextMode);\n\tconst ocrEngine = getContextString(metadata.ocrEngine);\n\tconst ocrConfidence =\n\t\tgetContextNumber(metadata.ocrRegionConfidence) ??\n\t\tgetContextNumber(metadata.ocrConfidence);\n\n\tconst labels = [\n\t\tpdfTextMode ? `PDF ${pdfTextMode}` : '',\n\t\tocrEngine ? `OCR ${ocrEngine}` : '',\n\t\ttypeof ocrConfidence === 'number'\n\t\t\t? `Confidence ${ocrConfidence.toFixed(2)}`\n\t\t\t: '',\n\t\tmediaKind ? `Media ${mediaKind}` : '',\n\t\ttranscriptSource ? `Transcript ${transcriptSource}` : '',\n\t\tthreadTopic ? `Thread ${threadTopic}` : '',\n\t\tspeaker ? `Speaker ${speaker}` : '',\n\t\tfrom ? `Sender ${from}` : '',\n\t\tsentAt ? `Sent ${sentAt}` : ''\n\t].filter((value) => value.length > 0);\n\n\treturn labels.length > 0 ? labels.join(' · ') : undefined;\n};\n\nconst buildSourceLabel = (source: RAGSource) =>\n\tsource.source ?? source.title ?? source.chunkId;\n\nconst buildExcerpt = (text: string, maxLength = 160) => {\n\tconst normalized = text.replaceAll(/\\s+/g, ' ').trim();\n\tif (normalized.length <= maxLength) {\n\t\treturn normalized;\n\t}\n\n\treturn `${normalized.slice(0, Math.max(0, maxLength - 1)).trimEnd()}…`;\n};\n\nconst selectPreferredExcerpt = (\n\texcerpts?: {\n\t\tchunkExcerpt?: string;\n\t\twindowExcerpt?: string;\n\t\tsectionExcerpt?: string;\n\t},\n\tsectionChunkCount?: number\n) => {\n\tif (!excerpts) {\n\t\treturn {\n\t\t\texcerpt: '',\n\t\t\tmode: 'chunk' as const,\n\t\t\treason: 'single_chunk' as const\n\t\t};\n\t}\n\n\tconst chunkExcerpt = excerpts.chunkExcerpt?.trim() ?? '';\n\tconst windowExcerpt = excerpts.windowExcerpt?.trim() ?? '';\n\tconst sectionExcerpt = excerpts.sectionExcerpt?.trim() ?? '';\n\tif (\n\t\tsectionChunkCount &&\n\t\tsectionChunkCount > 1 &&\n\t\tchunkExcerpt.length > 0 &&\n\t\tchunkExcerpt.length < 72\n\t) {\n\t\tif (sectionChunkCount <= 3 && sectionExcerpt) {\n\t\t\treturn {\n\t\t\t\texcerpt: sectionExcerpt,\n\t\t\t\tmode: 'section' as const,\n\t\t\t\treason: 'section_small_enough' as const\n\t\t\t};\n\t\t}\n\t\tif (windowExcerpt) {\n\t\t\treturn {\n\t\t\t\texcerpt: windowExcerpt,\n\t\t\t\tmode: 'window' as const,\n\t\t\t\treason: 'section_too_large_use_window' as const\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\texcerpt: chunkExcerpt,\n\t\t\tmode: 'chunk' as const,\n\t\t\treason: 'chunk_too_narrow' as const\n\t\t};\n\t}\n\n\treturn {\n\t\texcerpt: chunkExcerpt || windowExcerpt || sectionExcerpt,\n\t\tmode: 'chunk' as const,\n\t\treason:\n\t\t\t(sectionChunkCount ?? 0) > 1\n\t\t\t\t? ('chunk_too_narrow' as const)\n\t\t\t\t: ('single_chunk' as const)\n\t};\n};\n\nconst buildExcerptModeCounts = (\n\treferences: Array<\n\t\t| { excerptSelection?: { mode: 'chunk' | 'window' | 'section' } }\n\t\t| undefined\n\t>\n): RAGExcerptModeCounts =>\n\treferences.reduce<RAGExcerptModeCounts>(\n\t\t(counts, reference) => {\n\t\t\tif (reference?.excerptSelection) {\n\t\t\t\tcounts[reference.excerptSelection.mode] += 1;\n\t\t\t}\n\t\t\treturn counts;\n\t\t},\n\t\t{ chunk: 0, section: 0, window: 0 }\n\t);\n\nconst buildGroundingChunkExcerpts = (\n\tsources: RAGSource[],\n\tactiveChunkId?: string\n) => {\n\tif (sources.length === 0) {\n\t\treturn undefined;\n\t}\n\n\tconst activeSource =\n\t\t(activeChunkId\n\t\t\t? sources.find((source) => source.chunkId === activeChunkId)\n\t\t\t: undefined) ?? sources[0];\n\tif (!activeSource) {\n\t\treturn undefined;\n\t}\n\n\tconst chunkMap = new Map(sources.map((source) => [source.chunkId, source]));\n\tconst activeMetadata = activeSource.metadata ?? {};\n\tconst previousChunkId = getContextString(activeMetadata.previousChunkId);\n\tconst nextChunkId = getContextString(activeMetadata.nextChunkId);\n\tconst sectionChunkId = getContextString(activeMetadata.sectionChunkId);\n\tconst sectionSources = sectionChunkId\n\t\t? sources\n\t\t\t\t.filter(\n\t\t\t\t\t(source) =>\n\t\t\t\t\t\tgetContextString(source.metadata?.sectionChunkId) ===\n\t\t\t\t\t\tsectionChunkId\n\t\t\t\t)\n\t\t\t\t.sort((left, right) => {\n\t\t\t\t\tconst leftIndex =\n\t\t\t\t\t\tgetContextNumber(left.metadata?.sectionChunkIndex) ??\n\t\t\t\t\t\tNumber.MAX_SAFE_INTEGER;\n\t\t\t\t\tconst rightIndex =\n\t\t\t\t\t\tgetContextNumber(right.metadata?.sectionChunkIndex) ??\n\t\t\t\t\t\tNumber.MAX_SAFE_INTEGER;\n\t\t\t\t\tif (leftIndex !== rightIndex) {\n\t\t\t\t\t\treturn leftIndex - rightIndex;\n\t\t\t\t\t}\n\t\t\t\t\treturn left.chunkId.localeCompare(right.chunkId);\n\t\t\t\t})\n\t\t: [activeSource];\n\tconst collectText = (chunkIds: string[]) =>\n\t\tchunkIds\n\t\t\t.map((chunkId) => chunkMap.get(chunkId)?.text)\n\t\t\t.filter((text): text is string => typeof text === 'string')\n\t\t\t.join('\\n\\n');\n\tconst orderedWindowIds = [\n\t\tpreviousChunkId,\n\t\tactiveSource.chunkId,\n\t\tnextChunkId\n\t].filter(\n\t\t(chunkId, index, values): chunkId is string =>\n\t\t\tBoolean(chunkId) && values.indexOf(chunkId) === index\n\t);\n\n\treturn {\n\t\tchunkExcerpt: buildExcerpt(activeSource.text, 160),\n\t\tsectionExcerpt: buildExcerpt(\n\t\t\tsectionSources.map((source) => source.text).join('\\n\\n'),\n\t\t\t320\n\t\t),\n\t\twindowExcerpt: buildExcerpt(collectText(orderedWindowIds), 240)\n\t};\n};\n\nconst buildGroundingReferenceEvidenceLabel = (\n\treference: RAGGroundingReference\n) =>\n\t[reference.label, reference.locatorLabel, reference.contextLabel]\n\t\t.filter((value): value is string => Boolean(value && value.length > 0))\n\t\t.filter(\n\t\t\t(value, index, values) =>\n\t\t\t\tvalues.findIndex((entry) => entry === value) === index\n\t\t)\n\t\t.join(' · ');\n\nconst buildGroundingReferenceEvidenceSummary = (\n\treference: RAGGroundingReference\n) =>\n\t[\n\t\treference.source ?? reference.title ?? reference.chunkId,\n\t\treference.locatorLabel,\n\t\treference.contextLabel,\n\t\treference.provenanceLabel\n\t]\n\t\t.filter((value): value is string => Boolean(value && value.length > 0))\n\t\t.filter(\n\t\t\t(value, index, values) =>\n\t\t\t\tvalues.findIndex((entry) => entry === value) === index\n\t\t)\n\t\t.join(' · ');\n\nconst buildGroundingSectionKey = (reference: RAGGroundingReference) =>\n\treference.contextLabel ??\n\treference.locatorLabel ??\n\treference.label ??\n\treference.source ??\n\treference.chunkId;\n\nconst buildGroundingSectionSummaryLine = (reference: RAGGroundingReference) =>\n\t[\n\t\treference.source ?? reference.title ?? reference.chunkId,\n\t\treference.locatorLabel,\n\t\treference.contextLabel,\n\t\treference.provenanceLabel\n\t]\n\t\t.filter((value): value is string => Boolean(value && value.length > 0))\n\t\t.filter(\n\t\t\t(value, index, values) =>\n\t\t\t\tvalues.findIndex((entry) => entry === value) === index\n\t\t)\n\t\t.join(' · ');\n\nconst buildGroundedAnswerCitationDetail = (\n\treference: RAGGroundingReference\n): RAGGroundedAnswerCitationDetail => ({\n\tcontextLabel: reference.contextLabel,\n\tevidenceLabel: buildGroundingReferenceEvidenceLabel(reference),\n\tevidenceSummary: buildGroundingReferenceEvidenceSummary(reference),\n\texcerpt:\n\t\tselectPreferredExcerpt(\n\t\t\treference.excerpts,\n\t\t\tgetContextNumber(reference.metadata?.sectionChunkCount)\n\t\t).excerpt || reference.excerpt,\n\texcerpts: reference.excerpts,\n\texcerptSelection: reference.excerptSelection,\n\tlabel: reference.label,\n\tlocatorLabel: reference.locatorLabel,\n\tnumber: reference.number,\n\tprovenanceLabel: reference.provenanceLabel,\n\tsource: reference.source,\n\ttitle: reference.title\n});\n\nexport const buildRAGCitationReferenceMap = (\n\tcitations: RAGCitation[]\n): RAGCitationReferenceMap =>\n\tObject.fromEntries(\n\t\tcitations.map((citation, index) => [citation.chunkId, index + 1])\n\t);\n\nexport const buildRAGCitations = (sources: RAGSource[]) => {\n\tconst unique = new Map<string, RAGCitation>();\n\n\tfor (const source of sources) {\n\t\tconst key = source.chunkId;\n\t\tconst existing = unique.get(key);\n\t\tconst hasBetterExisting =\n\t\t\texisting !== undefined && existing.score >= source.score;\n\t\tif (hasBetterExisting) continue;\n\t\tconst excerpts = buildGroundingChunkExcerpts(sources, source.chunkId);\n\t\tconst excerptSelection = selectPreferredExcerpt(\n\t\t\texcerpts,\n\t\t\tgetContextNumber(source.metadata?.sectionChunkCount)\n\t\t);\n\n\t\tunique.set(key, {\n\t\t\tchunkId: source.chunkId,\n\t\t\tcontextLabel:\n\t\t\t\tsource.labels?.contextLabel ??\n\t\t\t\tbuildContextLabel(source.metadata),\n\t\t\texcerpt: excerptSelection.excerpt || buildExcerpt(source.text),\n\t\t\texcerpts,\n\t\t\texcerptSelection,\n\t\t\tkey,\n\t\t\tlabel: buildSourceLabel(source),\n\t\t\tlocatorLabel:\n\t\t\t\tsource.labels?.locatorLabel ??\n\t\t\t\tbuildLocatorLabel(source.metadata, source.source, source.title),\n\t\t\tmetadata: source.metadata,\n\t\t\tprovenanceLabel:\n\t\t\t\tsource.labels?.provenanceLabel ??\n\t\t\t\tbuildProvenanceLabel(source.metadata),\n\t\t\tscore: source.score,\n\t\t\tsource: source.source,\n\t\t\ttext: source.text,\n\t\t\ttitle: source.title\n\t\t});\n\t}\n\n\treturn [...unique.values()].sort((left, right) => {\n\t\tif (right.score !== left.score) {\n\t\t\treturn right.score - left.score;\n\t\t}\n\n\t\treturn left.label.localeCompare(right.label);\n\t});\n};\n\nexport const buildRAGGroundedAnswer = (\n\tcontent: string,\n\tsources: RAGSource[]\n): RAGGroundedAnswer => {\n\tconst references = buildRAGGroundingReferences(sources);\n\tconst sectionSummaries = buildRAGGroundedAnswerSectionSummaries(references);\n\tconst referenceMap = new Map(\n\t\treferences.map((reference) => [reference.number, reference])\n\t);\n\tconst parts: RAGGroundedAnswer['parts'] = [];\n\tconst ungroundedReferenceNumbers = new Set<number>();\n\tconst citationPattern = /\\[(\\d+(?:\\s*,\\s*\\d+)*)\\]/g;\n\tlet cursor = 0;\n\n\tfor (const match of content.matchAll(citationPattern)) {\n\t\tconst raw = match[0];\n\t\tconst numbers = (match[1] ?? '')\n\t\t\t.split(',')\n\t\t\t.map((value) => Number.parseInt(value.trim(), 10))\n\t\t\t.filter((value) => Number.isInteger(value) && value > 0);\n\t\tconst start = match.index ?? cursor;\n\t\tif (start > cursor) {\n\t\t\tparts.push({\n\t\t\t\ttext: content.slice(cursor, start),\n\t\t\t\ttype: 'text'\n\t\t\t});\n\t\t}\n\n\t\tconst resolvedReferences = numbers\n\t\t\t.map((number) => referenceMap.get(number))\n\t\t\t.filter((reference): reference is RAGGroundingReference =>\n\t\t\t\tBoolean(reference)\n\t\t\t);\n\t\tfor (const number of numbers) {\n\t\t\tif (!referenceMap.has(number)) {\n\t\t\t\tungroundedReferenceNumbers.add(number);\n\t\t\t}\n\t\t}\n\t\tconst unresolvedNumbers = numbers.filter(\n\t\t\t(number) => !referenceMap.has(number)\n\t\t);\n\n\t\tparts.push({\n\t\t\treferenceNumbers: numbers,\n\t\t\treferenceDetails: resolvedReferences.map(\n\t\t\t\tbuildGroundedAnswerCitationDetail\n\t\t\t),\n\t\t\treferences: resolvedReferences,\n\t\t\ttext: raw,\n\t\t\ttype: 'citation',\n\t\t\tunresolvedReferenceNumbers: unresolvedNumbers\n\t\t});\n\t\tcursor = start + raw.length;\n\t}\n\n\tif (cursor < content.length || parts.length === 0) {\n\t\tparts.push({\n\t\t\ttext: content.slice(cursor),\n\t\t\ttype: 'text'\n\t\t});\n\t}\n\n\tconst hasCitations = parts.some((part) => part.type === 'citation');\n\tconst coverage: RAGGroundedAnswer['coverage'] = !hasCitations\n\t\t? 'ungrounded'\n\t\t: ungroundedReferenceNumbers.size === 0\n\t\t\t? 'grounded'\n\t\t\t: references.length > 0\n\t\t\t\t? 'partial'\n\t\t\t\t: 'ungrounded';\n\n\treturn {\n\t\tcontent,\n\t\tcoverage,\n\t\texcerptModeCounts: buildExcerptModeCounts([\n\t\t\t...references,\n\t\t\t...sectionSummaries\n\t\t]),\n\t\thasCitations,\n\t\tparts,\n\t\treferences,\n\t\tsectionSummaries,\n\t\tungroundedReferenceNumbers: [...ungroundedReferenceNumbers].sort(\n\t\t\t(left, right) => left - right\n\t\t)\n\t};\n};\n\nexport const buildRAGGroundedAnswerSectionSummaries = (\n\treferences: RAGGroundingReference[]\n): RAGGroundedAnswerSectionSummary[] => {\n\tconst groups = new Map<string, RAGGroundedAnswerSectionSummary>();\n\n\tfor (const reference of references) {\n\t\tconst key = buildGroundingSectionKey(reference);\n\t\tconst existing = groups.get(key);\n\t\tif (!existing) {\n\t\t\tconst excerpts = reference.excerpts\n\t\t\t\t? {\n\t\t\t\t\t\tchunkExcerpt: reference.excerpts.chunkExcerpt,\n\t\t\t\t\t\tsectionExcerpt: reference.excerpts.sectionExcerpt,\n\t\t\t\t\t\twindowExcerpt: reference.excerpts.windowExcerpt\n\t\t\t\t\t}\n\t\t\t\t: undefined;\n\t\t\tgroups.set(key, {\n\t\t\t\tchunkIds: [reference.chunkId],\n\t\t\t\tcontextLabel: reference.contextLabel,\n\t\t\t\tcount: 1,\n\t\t\t\texcerpt:\n\t\t\t\t\tselectPreferredExcerpt(\n\t\t\t\t\t\texcerpts,\n\t\t\t\t\t\tgetContextNumber(reference.metadata?.sectionChunkCount)\n\t\t\t\t\t).excerpt ||\n\t\t\t\t\texcerpts?.sectionExcerpt ||\n\t\t\t\t\treference.excerpt,\n\t\t\t\texcerpts,\n\t\t\t\texcerptSelection: reference.excerptSelection,\n\t\t\t\tkey,\n\t\t\t\tlabel: key,\n\t\t\t\tlocatorLabel: reference.locatorLabel,\n\t\t\t\tprovenanceLabel: reference.provenanceLabel,\n\t\t\t\treferenceNumbers: [reference.number],\n\t\t\t\treferences: [reference],\n\t\t\t\tsummary:\n\t\t\t\t\tbuildGroundingSectionSummaryLine(reference) ||\n\t\t\t\t\treference.label ||\n\t\t\t\t\treference.chunkId\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\texisting.count += 1;\n\t\tif (!existing.chunkIds.includes(reference.chunkId)) {\n\t\t\texisting.chunkIds.push(reference.chunkId);\n\t\t}\n\t\tif (!existing.referenceNumbers.includes(reference.number)) {\n\t\t\texisting.referenceNumbers.push(reference.number);\n\t\t}\n\t\texisting.references.push(reference);\n\t\tif (!existing.contextLabel && reference.contextLabel) {\n\t\t\texisting.contextLabel = reference.contextLabel;\n\t\t}\n\t\tif (!existing.locatorLabel && reference.locatorLabel) {\n\t\t\texisting.locatorLabel = reference.locatorLabel;\n\t\t}\n\t\tif (!existing.provenanceLabel && reference.provenanceLabel) {\n\t\t\texisting.provenanceLabel = reference.provenanceLabel;\n\t\t}\n\t\tif (!existing.excerpts && reference.excerpts) {\n\t\t\texisting.excerpts = {\n\t\t\t\tchunkExcerpt: reference.excerpts.chunkExcerpt,\n\t\t\t\tsectionExcerpt: reference.excerpts.sectionExcerpt,\n\t\t\t\twindowExcerpt: reference.excerpts.windowExcerpt\n\t\t\t};\n\t\t\texisting.excerpt = reference.excerpts.sectionExcerpt;\n\t\t}\n\t\tif (!existing.excerptSelection && reference.excerptSelection) {\n\t\t\texisting.excerptSelection = reference.excerptSelection;\n\t\t}\n\t}\n\n\treturn [...groups.values()]\n\t\t.map((group) => ({\n\t\t\t...group,\n\t\t\treferenceNumbers: [...group.referenceNumbers].sort(\n\t\t\t\t(left, right) => left - right\n\t\t\t),\n\t\t\treferences: group.references\n\t\t\t\t.slice()\n\t\t\t\t.sort((left, right) => left.number - right.number)\n\t\t}))\n\t\t.sort((left, right) => {\n\t\t\tconst leftFirst =\n\t\t\t\tleft.referenceNumbers[0] ?? Number.POSITIVE_INFINITY;\n\t\t\tconst rightFirst =\n\t\t\t\tright.referenceNumbers[0] ?? Number.POSITIVE_INFINITY;\n\t\t\tif (leftFirst !== rightFirst) {\n\t\t\t\treturn leftFirst - rightFirst;\n\t\t\t}\n\t\t\treturn left.label.localeCompare(right.label);\n\t\t});\n};\n\nexport const buildRAGGroundingReferences = (sources: RAGSource[]) => {\n\tconst citations = buildRAGCitations(sources);\n\tconst citationReferenceMap = buildRAGCitationReferenceMap(citations);\n\n\treturn citations.map<RAGGroundingReference>((citation) => {\n\t\tconst excerpts = buildGroundingChunkExcerpts(sources, citation.chunkId);\n\t\tconst excerptSelection = selectPreferredExcerpt(\n\t\t\texcerpts,\n\t\t\tgetContextNumber(citation.metadata?.sectionChunkCount)\n\t\t);\n\t\treturn {\n\t\t\tchunkId: citation.chunkId,\n\t\t\tcontextLabel:\n\t\t\t\tcitation.contextLabel ?? buildContextLabel(citation.metadata),\n\t\t\texcerpt:\n\t\t\t\texcerptSelection.excerpt ||\n\t\t\t\texcerpts?.chunkExcerpt ||\n\t\t\t\tbuildExcerpt(citation.text),\n\t\t\texcerpts,\n\t\t\texcerptSelection,\n\t\t\tlabel: citation.label,\n\t\t\tlocatorLabel:\n\t\t\t\tcitation.locatorLabel ??\n\t\t\t\tbuildLocatorLabel(\n\t\t\t\t\tcitation.metadata,\n\t\t\t\t\tcitation.source,\n\t\t\t\t\tcitation.title\n\t\t\t\t),\n\t\t\tmetadata: citation.metadata,\n\t\t\tnumber: citationReferenceMap[citation.chunkId] ?? 0,\n\t\t\tprovenanceLabel:\n\t\t\t\tcitation.provenanceLabel ??\n\t\t\t\tbuildProvenanceLabel(citation.metadata),\n\t\t\tscore: citation.score,\n\t\t\tsource: citation.source,\n\t\t\ttext: citation.text,\n\t\t\ttitle: citation.title\n\t\t};\n\t});\n};\n"
9
9
  ],
10
- "mappings": "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",
11
- "debugId": "1118AB12826C82F864756E2164756E21",
10
+ "mappings": "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",
11
+ "debugId": "6A5C3ED0012F395064756E2164756E21",
12
12
  "names": []
13
13
  }