@tangle-network/agent-knowledge 4.0.1 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +35 -19
- package/CHANGELOG.md +48 -0
- package/README.md +220 -943
- package/dist/benchmarks/index.d.ts +3 -2
- package/dist/benchmarks/index.js +1 -1
- package/dist/{chunk-EUAXSBMH.js → chunk-AKYJG2MR.js} +224 -224
- package/dist/chunk-AKYJG2MR.js.map +1 -0
- package/dist/{chunk-BBCIB4UL.js → chunk-EYIA5PLQ.js} +27 -195
- package/dist/chunk-EYIA5PLQ.js.map +1 -0
- package/dist/{chunk-3CAAGJCE.js → chunk-LMR53POQ.js} +1227 -574
- package/dist/chunk-LMR53POQ.js.map +1 -0
- package/dist/{chunk-WCYW2GDA.js → chunk-MYFM6LKH.js} +2 -2
- package/dist/chunk-MYFM6LKH.js.map +1 -0
- package/dist/cli.js +1 -1
- package/dist/index-Cf7txrYP.d.ts +790 -0
- package/dist/index.d.ts +252 -73
- package/dist/index.js +2813 -2229
- package/dist/index.js.map +1 -1
- package/dist/memory/index.d.ts +8 -709
- package/dist/memory/index.js +2 -2
- package/dist/sources/index.d.ts +17 -33
- package/dist/sources/index.js +1 -1
- package/dist/{types-ZzY_x0r7.d.ts → types-BY-xLVw-.d.ts} +28 -67
- package/docs/eval/investment-material-facts.md +28 -29
- package/docs/eval/rag-eval-roadmap.md +21 -17
- package/docs/results/adaptive.md +13 -13
- package/docs/results/claim-grounding.md +11 -11
- package/docs/results/cost-quality.md +4 -4
- package/docs/results/investment-thesis.md +56 -56
- package/docs/results/research-driving.md +54 -54
- package/docs/two-agent-research-ab.md +94 -94
- package/package.json +11 -11
- package/skills/build-with-agent-knowledge/SKILL.md +97 -0
- package/dist/chunk-3CAAGJCE.js.map +0 -1
- package/dist/chunk-BBCIB4UL.js.map +0 -1
- package/dist/chunk-EUAXSBMH.js.map +0 -1
- package/dist/chunk-WCYW2GDA.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/memory/source-record.ts","../src/benchmarks/adapters.ts","../src/benchmarks/utils.ts","../src/benchmarks/validation.ts","../src/benchmarks/catalog.ts","../src/benchmarks/memory-runner.ts","../src/memory/attempt-log.ts","../src/memory/lifecycle.ts","../src/memory/run-control.ts","../src/benchmarks/memory-recovery.ts","../src/benchmarks/memory-responder.ts","../src/benchmarks/suite.ts","../src/benchmarks/metrics.ts","../src/retrieval-eval.ts","../src/benchmarks/scoring.ts","../src/benchmarks/retrieval.ts"],"sourcesContent":["import { sha256, stableId } from '../ids'\nimport type { SourceRecord } from '../types'\nimport type { AgentMemoryHit, AgentMemoryScope, AgentMemoryWriteResult } from './types'\n\nexport function memoryHitToSourceRecord(\n hit: AgentMemoryHit,\n options: { now?: () => Date; scope?: AgentMemoryScope } = {},\n): SourceRecord {\n const contentHash = sha256(`${hit.uri}\\n${hit.text}`)\n return {\n id: stableId('src', `${hit.uri}:${contentHash}`),\n uri: hit.uri,\n title: hit.title ?? `${hit.kind}:${hit.id}`,\n mediaType: 'text/plain',\n contentHash,\n text: hit.text,\n validUntil: hit.validUntil,\n lastVerifiedAt: hit.lastVerifiedAt,\n createdAt: (options.now ?? (() => new Date()))().toISOString(),\n metadata: {\n ...(hit.metadata ?? {}),\n source: 'agent-memory',\n memoryId: hit.id,\n memoryKind: hit.kind,\n score: hit.score,\n normalizedScore: hit.normalizedScore,\n confidence: hit.confidence,\n scope: options.scope,\n },\n }\n}\n\nexport function memoryWriteResultToSourceRecord(\n result: AgentMemoryWriteResult,\n text: string,\n options: { now?: () => Date; scope?: AgentMemoryScope } = {},\n): SourceRecord {\n return memoryHitToSourceRecord(\n {\n id: result.id,\n uri: result.uri,\n kind: result.kind,\n text,\n metadata: result.metadata,\n },\n options,\n )\n}\n","import { memoryHitToSourceRecord, memoryWriteResultToSourceRecord } from '../memory/source-record'\n\nimport type {\n AgentMemoryAdapter,\n AgentMemoryHit,\n AgentMemoryScope,\n AgentMemoryWriteInput,\n} from '../memory/types'\n\nexport function createNoopMemoryBenchmarkAdapter(id = 'no-memory'): AgentMemoryAdapter {\n return {\n id,\n branchIsolation: { mode: 'scoped' },\n async search() {\n return []\n },\n async getContext(query) {\n return { query, text: '', hits: [], sourceRecords: [] }\n },\n async write(input) {\n return {\n accepted: false,\n id: input.id ?? `${id}:ignored`,\n uri: `memory://${id}/ignored`,\n kind: input.kind,\n }\n },\n async clear() {},\n async flush() {},\n }\n}\n\nexport function createInMemoryBenchmarkAdapter(options: { id?: string } = {}): AgentMemoryAdapter {\n const id = options.id ?? 'in-memory'\n const rows: Array<{\n seq: number\n input: AgentMemoryWriteInput\n hit: AgentMemoryHit\n }> = []\n let seq = 0\n const adapter: AgentMemoryAdapter = {\n id,\n branchIsolation: { mode: 'scoped' },\n async search(query, searchOptions = {}) {\n const scored = rows\n .filter((row) => memoryScopeMatches(row.input.scope, searchOptions.scope))\n .filter((row) => !searchOptions.kinds?.length || searchOptions.kinds.includes(row.hit.kind))\n .map((row) => {\n const lexical = tokenOverlap(query, row.hit.text)\n const recency = row.seq / Math.max(1, seq)\n return {\n ...row.hit,\n score: lexical + recency * 0.01,\n normalizedScore: lexical,\n }\n })\n .filter((hit) =>\n searchOptions.minScore === undefined ? true : hit.score! >= searchOptions.minScore,\n )\n .sort((a, b) => (b.score ?? 0) - (a.score ?? 0))\n return scored.slice(0, searchOptions.limit ?? 5)\n },\n async getContext(query, searchOptions = {}) {\n const hits = await adapter.search(query, searchOptions)\n return {\n query,\n hits,\n sourceRecords: hits.map((hit) =>\n memoryHitToSourceRecord(hit, { scope: searchOptions.scope }),\n ),\n text: renderMemoryHits(hits),\n }\n },\n async write(input) {\n seq += 1\n const memoryId = input.id ?? `${id}:${seq}`\n const hit: AgentMemoryHit = {\n id: memoryId,\n uri: `memory://${id}/${encodeURIComponent(memoryId)}`,\n kind: input.kind,\n text: input.text,\n title: input.title,\n score: 1,\n normalizedScore: 1,\n createdAt: input.metadata?.timestamp as string | undefined,\n metadata: {\n ...(input.metadata ?? {}),\n scope: input.scope,\n },\n }\n rows.push({ seq, input, hit })\n return {\n accepted: true,\n id: memoryId,\n uri: hit.uri,\n kind: input.kind,\n sourceRecord: memoryWriteResultToSourceRecord(\n {\n accepted: true,\n id: memoryId,\n uri: hit.uri,\n kind: input.kind,\n metadata: hit.metadata,\n },\n input.text,\n { scope: input.scope },\n ),\n metadata: hit.metadata,\n }\n },\n async clear(scope) {\n for (let index = rows.length - 1; index >= 0; index -= 1) {\n if (memoryScopeMatches(rows[index]!.input.scope, scope)) rows.splice(index, 1)\n }\n },\n async flush() {},\n }\n return adapter\n}\n\nexport function memoryEventId(hit: AgentMemoryHit): string | undefined {\n const eventId = hit.metadata?.eventId\n return typeof eventId === 'string' ? eventId : undefined\n}\n\nexport function memoryActorId(hit: AgentMemoryHit): string | undefined {\n const actorId = hit.metadata?.actorId\n return typeof actorId === 'string' ? actorId : undefined\n}\n\nfunction memoryScopeMatches(stored?: AgentMemoryScope, requested?: AgentMemoryScope): boolean {\n if (!requested) return true\n if (requested.tenantId !== undefined && stored?.tenantId !== requested.tenantId) return false\n if (requested.userId !== undefined && stored?.userId !== requested.userId) return false\n if (requested.agentId !== undefined && stored?.agentId !== requested.agentId) return false\n if (requested.teamId !== undefined && stored?.teamId !== requested.teamId) return false\n if (requested.runId !== undefined && stored?.runId !== requested.runId) return false\n if (requested.sessionId !== undefined && stored?.sessionId !== requested.sessionId) return false\n if (requested.namespace !== undefined && stored?.namespace !== requested.namespace) return false\n for (const [key, value] of Object.entries(requested.tags ?? {})) {\n if (stored?.tags?.[key] !== value) return false\n }\n return true\n}\n\nfunction tokenOverlap(query: string, text: string): number {\n const queryTokens = new Set(tokenize(query))\n if (queryTokens.size === 0) return 0\n const textTokens = new Set(tokenize(text))\n let matched = 0\n for (const token of queryTokens) {\n if (textTokens.has(token)) matched += 1\n }\n return matched / queryTokens.size\n}\n\nfunction tokenize(text: string): string[] {\n const stop = new Set([\n 'the',\n 'and',\n 'for',\n 'this',\n 'that',\n 'with',\n 'what',\n 'should',\n 'agent',\n 'user',\n 'current',\n 'now',\n 'use',\n ])\n return text\n .toLowerCase()\n .split(/[^a-z0-9/]+/)\n .filter((token) => token.length > 2 && !stop.has(token))\n}\n\nfunction renderMemoryHits(hits: readonly AgentMemoryHit[]): string {\n return hits\n .map((hit, index) => {\n const eventId = memoryEventId(hit)\n const actorId = memoryActorId(hit)\n return [\n `[${index + 1}] ${hit.title ?? hit.id}`,\n eventId ? `event=${eventId}` : '',\n actorId ? `actor=${actorId}` : '',\n hit.text,\n ]\n .filter(Boolean)\n .join('\\n')\n })\n .join('\\n\\n')\n}\n","export function mean(values: readonly number[]): number {\n const finite = values.filter(Number.isFinite)\n if (finite.length === 0) return 0\n return finite.reduce((sum, value) => sum + value, 0) / finite.length\n}\n\nexport function unique(values: readonly string[]): string[] {\n return [...new Set(values.filter(Boolean))]\n}\n\nexport function formatNumber(value: number): string {\n if (!Number.isFinite(value)) return '0'\n return value.toFixed(value === 0 || Math.abs(value) >= 10 ? 0 : 3)\n}\n\nexport function normalizeUsd(value: number): number {\n return Number(value.toFixed(12))\n}\n\nexport function compactObject(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(compactObject)\n if (!value || typeof value !== 'object') return value\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .filter(([, entry]) => entry !== undefined)\n .map(([key, entry]) => [key, compactObject(entry)]),\n )\n}\n","import type {\n KnowledgeBenchmarkCase,\n KnowledgeClaimMatcher,\n KnowledgeMemoryBenchmarkCase,\n KnowledgeMemoryFactMatcher,\n} from './types'\n\nexport function isKnowledgeMemoryBenchmarkCase(\n testCase: KnowledgeBenchmarkCase,\n): testCase is KnowledgeMemoryBenchmarkCase {\n return testCase.taskKind.startsWith('memory-')\n}\n\nexport function assertKnowledgeBenchmarkCases(cases: readonly KnowledgeBenchmarkCase[]): void {\n if (cases.length === 0) throw new Error('knowledge benchmark requires cases')\n assertUniqueNonEmptyStrings(\n cases.map((testCase) => testCase.id),\n 'knowledge benchmark case id',\n )\n for (const testCase of cases) {\n if (typeof testCase.family !== 'string' || !testCase.family.trim()) {\n throw new Error(`knowledge benchmark case ${testCase.id} requires a family`)\n }\n if (testCase.taskKind === 'retrieval') continue\n if (isKnowledgeMemoryBenchmarkCase(testCase)) {\n assertUniqueNonEmptyStrings(\n testCase.events.map((event) => event.id),\n `${testCase.id} memory event id`,\n )\n for (const event of testCase.events) {\n assertNonEmptyBenchmarkString(event.text, `${testCase.id} memory event ${event.id} text`)\n }\n assertClaimMatchers(testCase.requiredFacts ?? [], `${testCase.id} requiredFacts`)\n assertClaimMatchers(testCase.forbiddenFacts ?? [], `${testCase.id} forbiddenFacts`)\n assertUniqueNonEmptyStrings(\n testCase.expectedEventIds ?? [],\n `${testCase.id} expected event id`,\n )\n assertUniqueNonEmptyStrings(\n testCase.expectedActorIds ?? [],\n `${testCase.id} expected actor id`,\n )\n } else {\n assertClaimMatchers(testCase.requiredClaims ?? [], `${testCase.id} requiredClaims`)\n assertClaimMatchers(testCase.forbiddenClaims ?? [], `${testCase.id} forbiddenClaims`)\n assertUniqueNonEmptyStrings(testCase.expectedSourceIds ?? [], `${testCase.id} source id`)\n }\n }\n}\n\nfunction assertClaimMatchers(claims: readonly KnowledgeClaimMatcher[], label: string): void {\n assertUniqueNonEmptyStrings(\n claims.map((claim) => claim.id),\n `${label} matcher id`,\n )\n for (const claim of claims) {\n if (claim.anyOf.length === 0) throw new Error(`${label} matcher ${claim.id} requires anyOf`)\n assertUniqueNonEmptyStrings(claim.anyOf, `${label} matcher ${claim.id} anyOf`)\n if (claim.weight !== undefined && (!Number.isFinite(claim.weight) || claim.weight <= 0)) {\n throw new Error(`${label} matcher ${claim.id} weight must be a positive finite number`)\n }\n const sourceEventIds = (claim as Partial<KnowledgeMemoryFactMatcher>).sourceEventIds\n if (sourceEventIds !== undefined) {\n assertUniqueNonEmptyStrings(sourceEventIds, `${label} matcher ${claim.id} source event id`)\n }\n }\n}\n\nexport function assertUniqueNonEmptyStrings(values: readonly string[], label: string): void {\n const seen = new Set<string>()\n for (const value of values) {\n assertNonEmptyBenchmarkString(value, label)\n if (seen.has(value)) throw new Error(`duplicate ${label}: ${value}`)\n seen.add(value)\n }\n}\n\nexport function assertNonEmptyBenchmarkString(\n value: unknown,\n label: string,\n): asserts value is string {\n if (typeof value !== 'string' || !value.trim()) throw new Error(`${label} must be non-empty`)\n}\n","import type { RetrievalGoldTarget, RetrievedKnowledgeHit } from '../retrieval-eval'\n\nimport type {\n KnowledgeAnswerBenchmarkTaskKind,\n KnowledgeBenchmarkArtifact,\n KnowledgeBenchmarkCase,\n KnowledgeBenchmarkFamily,\n KnowledgeBenchmarkSource,\n KnowledgeBenchmarkSpec,\n KnowledgeBenchmarkSplit,\n KnowledgeMemoryBenchmarkCase,\n KnowledgeMemoryBenchmarkTaskKind,\n} from './types'\n\nimport { unique } from './utils'\n\nimport { isKnowledgeMemoryBenchmarkCase } from './validation'\n\nexport const INDUSTRY_RAG_BENCHMARKS: readonly (KnowledgeBenchmarkSpec & {\n taskKind: 'retrieval' | KnowledgeAnswerBenchmarkTaskKind\n})[] = [\n {\n id: 'beir',\n family: 'beir',\n taskKind: 'retrieval',\n primaryMetrics: ['nDCG@10', 'Recall@100', 'MRR@10'],\n adapter: 'buildRetrievalBenchmarkCasesFromQrels',\n notes: 'Classic zero-shot retrieval suites using query/corpus/qrels files.',\n },\n {\n id: 'mteb-retrieval',\n family: 'mteb-retrieval',\n taskKind: 'retrieval',\n primaryMetrics: ['nDCG@10', 'Recall@100'],\n adapter: 'buildRetrievalBenchmarkCasesFromQrels',\n notes: 'MTEB retrieval task shape; same qrels bridge, different dataset provenance.',\n },\n {\n id: 'msmarco',\n family: 'msmarco',\n taskKind: 'retrieval',\n primaryMetrics: ['MRR@10', 'Recall@100'],\n adapter: 'buildRetrievalBenchmarkCasesFromQrels',\n notes: 'Passage retrieval and reranking smoke for web-style questions.',\n },\n {\n id: 'trec-dl',\n family: 'trec-dl',\n taskKind: 'retrieval',\n primaryMetrics: ['nDCG@10', 'MAP', 'Recall@100'],\n adapter: 'buildRetrievalBenchmarkCasesFromQrels',\n notes: 'Deep Learning Track judgments over MS MARCO-derived corpora.',\n },\n {\n id: 'miracl',\n family: 'miracl',\n taskKind: 'retrieval',\n primaryMetrics: ['nDCG@10', 'Recall@100'],\n adapter: 'buildRetrievalBenchmarkCasesFromQrels',\n notes: 'Multilingual retrieval; use language tags on cases.',\n },\n {\n id: 'lotte',\n family: 'lotte',\n taskKind: 'retrieval',\n primaryMetrics: ['Success@5', 'Recall@100'],\n adapter: 'buildRetrievalBenchmarkCasesFromQrels',\n notes: 'Long-tail search tasks; map collection/domain into tags.',\n },\n {\n id: 'bright',\n family: 'bright',\n taskKind: 'retrieval',\n primaryMetrics: ['nDCG@10', 'Recall@100'],\n adapter: 'buildRetrievalBenchmarkCasesFromQrels',\n notes: 'Reasoning-heavy retrieval; preserve domain tags for slice reporting.',\n },\n {\n id: 'crag',\n family: 'crag',\n taskKind: 'rag-answer',\n primaryMetrics: ['claim_recall', 'citation_recall', 'hallucination_safe'],\n adapter: 'KnowledgeAnswerBenchmarkCase',\n notes: 'Answer quality and freshness cases; use required/forbidden claims plus citations.',\n },\n {\n id: 'hotpotqa',\n family: 'hotpotqa',\n taskKind: 'rag-answer',\n primaryMetrics: ['claim_recall', 'citation_recall'],\n adapter: 'KnowledgeAnswerBenchmarkCase',\n notes: 'Multihop QA; encode each supporting fact as a required claim.',\n },\n {\n id: 'kilt',\n family: 'kilt',\n taskKind: 'rag-answer',\n primaryMetrics: ['claim_recall', 'citation_recall'],\n adapter: 'KnowledgeAnswerBenchmarkCase',\n notes: 'Knowledge-intensive generation with provenance; encode expected pages/sources.',\n },\n {\n id: 'ragtruth',\n family: 'ragtruth',\n taskKind: 'hallucination',\n primaryMetrics: ['hallucination_safe', 'forbidden_claim_rate'],\n adapter: 'KnowledgeAnswerBenchmarkCase',\n notes: 'Hallucination detection; encode hallucinated spans as forbidden claims.',\n },\n {\n id: 'faithbench',\n family: 'faithbench',\n taskKind: 'hallucination',\n primaryMetrics: ['hallucination_safe', 'forbidden_claim_rate'],\n adapter: 'KnowledgeAnswerBenchmarkCase',\n notes: 'Faithfulness benchmark; score unsupported claims as forbidden claims.',\n },\n {\n id: 'first-party/kb-improvement',\n family: 'first-party',\n taskKind: 'kb-improvement',\n primaryMetrics: ['claim_recall', 'hallucination_safe', 'score'],\n adapter: 'KnowledgeAnswerBenchmarkCase',\n notes: 'Project-owned candidate-KB validation; grade the produced KB text or answer bundle.',\n },\n]\n\nexport const INDUSTRY_MEMORY_BENCHMARKS: readonly (KnowledgeBenchmarkSpec & {\n taskKind: KnowledgeMemoryBenchmarkTaskKind\n})[] = [\n {\n id: 'locomo/qa',\n family: 'locomo',\n taskKind: 'memory-recall',\n primaryMetrics: ['memory_fact_recall', 'memory_event_recall'],\n adapter: 'KnowledgeMemoryBenchmarkCase',\n notes: 'Long-term conversational QA over multi-session histories.',\n },\n {\n id: 'locomo/event-summary',\n family: 'locomo',\n taskKind: 'memory-summarization',\n primaryMetrics: ['memory_fact_recall', 'memory_event_recall'],\n adapter: 'KnowledgeMemoryBenchmarkCase',\n notes: 'Event summarization over long conversational histories.',\n },\n {\n id: 'longmemeval',\n family: 'longmemeval',\n taskKind: 'memory-temporal',\n primaryMetrics: ['memory_fact_recall', 'memory_stale_safe', 'memory_event_recall'],\n adapter: 'KnowledgeMemoryBenchmarkCase',\n notes: 'Long-term assistant memory with temporal and update-sensitive probes.',\n },\n {\n id: 'longmemeval-v2',\n family: 'longmemeval-v2',\n taskKind: 'memory-reasoning',\n primaryMetrics: ['memory_fact_recall', 'memory_event_recall', 'score'],\n adapter: 'KnowledgeMemoryBenchmarkCase',\n notes: 'Experience reuse from long agent histories; track accuracy and latency.',\n },\n {\n id: 'memora',\n family: 'memora',\n taskKind: 'memory-update',\n primaryMetrics: ['memory_fact_recall', 'memory_stale_safe', 'memory_stale_rate'],\n adapter: 'KnowledgeMemoryBenchmarkCase',\n notes: 'Forgetting-aware memory accuracy: reward current facts and penalize obsolete ones.',\n },\n {\n id: 'memoryagentbench',\n family: 'memoryagentbench',\n taskKind: 'memory-ingest',\n primaryMetrics: ['memory_fact_recall', 'memory_event_recall'],\n adapter: 'KnowledgeMemoryBenchmarkCase',\n notes: 'Incremental multi-turn information intake before later recall.',\n },\n {\n id: 'memorybank',\n family: 'memorybank',\n taskKind: 'memory-recommendation',\n primaryMetrics: ['memory_fact_recall', 'memory_stale_safe'],\n adapter: 'KnowledgeMemoryBenchmarkCase',\n notes: 'Personalized memory use for preference-aware downstream choices.',\n },\n {\n id: 'groupmembench',\n family: 'groupmembench',\n taskKind: 'memory-multiparty',\n primaryMetrics: ['memory_fact_recall', 'memory_actor_recall', 'memory_stale_safe'],\n adapter: 'KnowledgeMemoryBenchmarkCase',\n notes: 'Multi-party memory with speaker attribution, update, and term ambiguity pressure.',\n },\n {\n id: 'first-party/memory-lifecycle',\n family: 'first-party',\n taskKind: 'memory-forgetting',\n primaryMetrics: ['memory_fact_recall', 'memory_stale_safe', 'memory_event_recall'],\n adapter: 'KnowledgeMemoryBenchmarkCase',\n notes: 'Project-owned lifecycle pack for ingest, recall, update, forgetting, and ambiguity.',\n },\n]\n\nexport function buildIndustryRagBenchmarkSmokeCases(\n specs: readonly (KnowledgeBenchmarkSpec & {\n taskKind: 'retrieval' | KnowledgeAnswerBenchmarkTaskKind\n })[] = INDUSTRY_RAG_BENCHMARKS,\n): KnowledgeBenchmarkCase[] {\n return specs.map((spec) => {\n const source = {\n name: spec.id,\n version: 'smoke',\n }\n const split = spec.taskKind === 'retrieval' ? 'search' : 'holdout'\n const tags = unique(['industry-smoke', spec.id, spec.family, spec.taskKind])\n if (spec.taskKind === 'retrieval') {\n return {\n id: `${spec.id}/smoke:q1`,\n family: spec.family,\n taskKind: 'retrieval',\n split,\n tags,\n source,\n query: `${spec.id} smoke retrieval query`,\n expected: [{ kind: 'page', pageId: `${spec.id}:doc-1` }],\n k: 5,\n metadata: {\n adapter: spec.adapter,\n primaryMetrics: spec.primaryMetrics,\n },\n }\n }\n\n return {\n id: `${spec.id}/smoke:q1`,\n family: spec.family,\n taskKind: spec.taskKind,\n split,\n tags,\n source,\n prompt: `${spec.id} smoke benchmark prompt`,\n requiredClaims: [\n {\n id: `${spec.id}:required`,\n anyOf: [`${spec.id} supported answer`],\n },\n ],\n forbiddenClaims: [\n {\n id: `${spec.id}:unsupported`,\n anyOf: [`${spec.id} unsupported claim`],\n },\n ],\n expectedSourceIds: [`${spec.id}:source-1`],\n referenceAnswer: `${spec.id} supported answer`,\n metadata: {\n adapter: spec.adapter,\n primaryMetrics: spec.primaryMetrics,\n },\n }\n })\n}\n\nexport function respondToIndustryRagBenchmarkSmokeCase(input: {\n case: KnowledgeBenchmarkCase\n}): KnowledgeBenchmarkArtifact {\n const testCase = input.case\n if (isKnowledgeMemoryBenchmarkCase(testCase)) {\n return respondToIndustryMemoryBenchmarkSmokeCase({ case: testCase })\n }\n if (testCase.taskKind === 'retrieval') {\n const expected = Array.isArray(testCase.expected) ? testCase.expected[0] : testCase.expected\n const hit = hitForExpectedTarget(expected, testCase.id)\n return {\n hits: [hit],\n durationMs: 1,\n metadata: {\n smoke: true,\n },\n }\n }\n\n return {\n answer: (testCase.requiredClaims ?? [])\n .map((claim) => claim.anyOf[0])\n .filter((fragment): fragment is string => Boolean(fragment))\n .join(' '),\n citedSourceIds: testCase.expectedSourceIds ?? [],\n durationMs: 1,\n metadata: {\n smoke: true,\n },\n }\n}\n\nexport function buildIndustryMemoryBenchmarkSmokeCases(\n specs: readonly (KnowledgeBenchmarkSpec & {\n taskKind: KnowledgeMemoryBenchmarkTaskKind\n })[] = INDUSTRY_MEMORY_BENCHMARKS,\n): KnowledgeMemoryBenchmarkCase[] {\n return specs.map((spec) => {\n const currentEventId = `${spec.id}:event-current`\n const staleEventId = `${spec.id}:event-stale`\n const actorId = spec.taskKind === 'memory-multiparty' ? 'teammate-ada' : 'user'\n const currentFact = `${spec.id} current memory`\n const staleFact = `${spec.id} stale memory`\n return {\n id: `${spec.id}/smoke:q1`,\n family: spec.family,\n taskKind: spec.taskKind,\n split: spec.taskKind === 'memory-forgetting' ? 'holdout' : 'dev',\n tags: unique(['memory-smoke', spec.id, spec.family, spec.taskKind]),\n source: {\n name: spec.id,\n version: 'smoke',\n },\n events: [\n {\n id: staleEventId,\n actorId,\n sessionId: `${spec.id}:session-1`,\n timestamp: '2026-01-01T00:00:00.000Z',\n text: `${actorId} once had this obsolete fact: ${staleFact}.`,\n },\n {\n id: currentEventId,\n actorId,\n sessionId: `${spec.id}:session-2`,\n timestamp: '2026-02-01T00:00:00.000Z',\n text: `${actorId} updated the durable fact to: ${currentFact}.`,\n },\n ],\n prompt: `Use memory to answer the ${spec.id} smoke probe.`,\n requiredFacts: [\n {\n id: `${spec.id}:current`,\n anyOf: [currentFact],\n sourceEventIds: [currentEventId],\n },\n ],\n forbiddenFacts: [\n {\n id: `${spec.id}:stale`,\n anyOf: [staleFact],\n sourceEventIds: [staleEventId],\n obsolete: true,\n },\n ],\n expectedEventIds: [currentEventId],\n expectedActorIds: [actorId],\n referenceAnswer: currentFact,\n metadata: {\n adapter: spec.adapter,\n primaryMetrics: spec.primaryMetrics,\n },\n }\n })\n}\n\nexport function respondToIndustryMemoryBenchmarkSmokeCase(input: {\n case: KnowledgeMemoryBenchmarkCase\n}): KnowledgeBenchmarkArtifact {\n const testCase = input.case\n const facts = testCase.requiredFacts\n ?.map((fact) => fact.anyOf[0])\n .filter((fragment): fragment is string => Boolean(fragment))\n return {\n answer: facts?.join(' ') ?? '',\n rememberedFacts: facts ?? [],\n citedEventIds: testCase.expectedEventIds ?? [],\n actorIds: testCase.expectedActorIds ?? [],\n durationMs: 1,\n metadata: {\n smoke: true,\n },\n }\n}\n\nexport function buildFirstPartyMemoryLifecycleBenchmarkCases(): KnowledgeMemoryBenchmarkCase[] {\n const base = {\n family: 'first-party',\n source: {\n name: 'first-party/memory-lifecycle',\n version: 'real-v1',\n },\n } as const\n return [\n memoryLifecycleCase({\n ...base,\n id: 'first-party/memory-lifecycle:allergy',\n taskKind: 'memory-ingest',\n split: 'dev',\n actorId: 'user',\n prompt: 'What food restriction should catering remember for this user?',\n staleText: 'The user said they had no food allergies on the first onboarding form.',\n currentText: 'The user later corrected the profile: they have a severe peanut allergy.',\n required: 'severe peanut allergy',\n forbidden: 'no food allergies',\n }),\n memoryLifecycleCase({\n ...base,\n id: 'first-party/memory-lifecycle:account-tier',\n taskKind: 'memory-recall',\n split: 'dev',\n actorId: 'sales-ops',\n prompt: 'What is the customer account tier now?',\n staleText: 'Sales ops originally marked the customer as starter tier.',\n currentText: 'Sales ops updated the customer to enterprise tier after procurement approval.',\n required: 'enterprise tier',\n forbidden: 'starter tier',\n }),\n memoryLifecycleCase({\n ...base,\n id: 'first-party/memory-lifecycle:launch-date',\n taskKind: 'memory-temporal',\n split: 'holdout',\n actorId: 'pm',\n prompt: 'What launch date should the agent use?',\n staleText: 'The PM first planned the launch for April 3.',\n currentText: 'The PM moved the launch date to April 17 after legal review.',\n required: 'April 17',\n forbidden: 'April 3',\n }),\n memoryLifecycleCase({\n ...base,\n id: 'first-party/memory-lifecycle:briefing-channel',\n taskKind: 'memory-update',\n split: 'holdout',\n actorId: 'user',\n prompt: 'How should daily briefings be delivered now?',\n staleText: 'The user used to want daily briefings by SMS.',\n currentText: 'The user changed daily briefings to email only.',\n required: 'email only',\n forbidden: 'SMS',\n }),\n memoryLifecycleCase({\n ...base,\n id: 'first-party/memory-lifecycle:shipping-address',\n taskKind: 'memory-forgetting',\n split: 'holdout',\n actorId: 'user',\n prompt: 'What shipping address is current?',\n staleText: 'The old shipping address was 14 Pine Street, Apartment 2.',\n currentText: 'The current shipping address is 88 Cedar Avenue, Suite 9.',\n required: '88 Cedar Avenue, Suite 9',\n forbidden: '14 Pine Street',\n }),\n memoryLifecycleCase({\n ...base,\n id: 'first-party/memory-lifecycle:approval-owner',\n taskKind: 'memory-reasoning',\n split: 'holdout',\n actorId: 'finance',\n prompt: 'Who owns travel approval now?',\n staleText: 'Finance said Liam owned travel approvals last quarter.',\n currentText: 'Finance reassigned travel approvals to Maya this quarter.',\n required: 'Maya',\n forbidden: 'Liam',\n }),\n memoryLifecycleCase({\n ...base,\n id: 'first-party/memory-lifecycle:project-summary',\n taskKind: 'memory-summarization',\n split: 'dev',\n actorId: 'pm',\n prompt: 'Summarize the current Project Orion risks.',\n staleText: 'The old Project Orion risk was logo color churn.',\n currentText: 'The current Project Orion risks are vendor delay and a QA staffing gap.',\n required: 'vendor delay',\n extraRequired: 'QA staffing gap',\n forbidden: 'logo color churn',\n }),\n memoryLifecycleCase({\n ...base,\n id: 'first-party/memory-lifecycle:meeting-format',\n taskKind: 'memory-recommendation',\n split: 'holdout',\n actorId: 'user',\n prompt: 'What meeting format should the agent recommend?',\n staleText: 'The user previously preferred long video calls for planning.',\n currentText: 'The user now prefers async docs for planning instead of video calls.',\n required: 'async docs',\n forbidden: 'long video calls',\n }),\n memoryLifecycleCase({\n ...base,\n id: 'first-party/memory-lifecycle:multiparty-ada',\n taskKind: 'memory-multiparty',\n split: 'holdout',\n actorId: 'ada',\n prompt: 'Which SDK language did Ada ask for?',\n staleText: 'Ben asked for a Python notebook example.',\n currentText: 'Ada asked for a Rust SDK example.',\n required: 'Rust SDK',\n forbidden: 'Python notebook',\n }),\n memoryLifecycleCase({\n ...base,\n id: 'first-party/memory-lifecycle:timezone',\n taskKind: 'memory-recall',\n split: 'dev',\n actorId: 'user',\n prompt: 'What timezone should scheduling use for this user?',\n staleText: 'The user profile originally listed Pacific time.',\n currentText: 'The user corrected scheduling to America/Denver time.',\n required: 'America/Denver',\n forbidden: 'Pacific time',\n }),\n memoryLifecycleCase({\n ...base,\n id: 'first-party/memory-lifecycle:dinner-preference',\n taskKind: 'memory-update',\n split: 'holdout',\n actorId: 'user',\n prompt: 'What dinner preference should the assistant use?',\n staleText: 'The user was previously vegetarian for team dinners.',\n currentText: 'The user updated dinner restrictions to no shellfish.',\n required: 'no shellfish',\n forbidden: 'vegetarian',\n }),\n memoryLifecycleCase({\n ...base,\n id: 'first-party/memory-lifecycle:support-sla',\n taskKind: 'memory-temporal',\n split: 'holdout',\n actorId: 'support-lead',\n prompt: 'What support SLA is current?',\n staleText: 'Support used to promise a 24 hour response SLA.',\n currentText: 'Support changed the current response SLA to 2 business hours.',\n required: '2 business hours',\n forbidden: '24 hour',\n }),\n ]\n}\n\nfunction hitForExpectedTarget(\n expected: RetrievalGoldTarget | undefined,\n fallbackId: string,\n): RetrievedKnowledgeHit {\n if (!expected) {\n return {\n pageId: fallbackId,\n path: `${fallbackId}.md`,\n rank: 1,\n }\n }\n switch (expected.kind) {\n case 'page':\n return {\n pageId: expected.pageId,\n path: `${expected.pageId}.md`,\n rank: 1,\n }\n case 'page-path':\n return {\n pageId: expected.path,\n path: expected.path,\n rank: 1,\n }\n case 'source':\n return {\n pageId: expected.sourceId,\n path: `${expected.sourceId}.md`,\n sourceIds: [expected.sourceId],\n rank: 1,\n }\n case 'source-anchor':\n return {\n pageId: expected.sourceId,\n path: `${expected.sourceId}.md`,\n sourceIds: [expected.sourceId],\n sourceSpans: [{ sourceId: expected.sourceId, anchorId: expected.anchorId }],\n rank: 1,\n }\n case 'source-span':\n return {\n pageId: expected.sourceId,\n path: `${expected.sourceId}.md`,\n sourceIds: [expected.sourceId],\n sourceSpans: [\n {\n sourceId: expected.sourceId,\n charStart: expected.charStart,\n charEnd: expected.charEnd,\n },\n ],\n rank: 1,\n }\n }\n}\n\nfunction memoryLifecycleCase(input: {\n id: string\n family: KnowledgeBenchmarkFamily\n source: KnowledgeBenchmarkSource\n taskKind: KnowledgeMemoryBenchmarkTaskKind\n split: KnowledgeBenchmarkSplit\n actorId: string\n prompt: string\n staleText: string\n currentText: string\n required: string\n extraRequired?: string\n forbidden: string\n}): KnowledgeMemoryBenchmarkCase {\n const staleEventId = `${input.id}:stale`\n const currentEventId = `${input.id}:current`\n return {\n id: input.id,\n family: input.family,\n taskKind: input.taskKind,\n split: input.split,\n tags: unique(['first-party-memory-lifecycle', input.taskKind, input.split]),\n source: input.source,\n events: [\n {\n id: staleEventId,\n actorId: input.actorId,\n sessionId: `${input.id}:session-1`,\n timestamp: '2026-01-01T00:00:00.000Z',\n text: input.staleText,\n },\n {\n id: currentEventId,\n actorId: input.actorId,\n sessionId: `${input.id}:session-2`,\n timestamp: '2026-02-01T00:00:00.000Z',\n text: input.currentText,\n },\n ],\n prompt: input.prompt,\n requiredFacts: [\n {\n id: `${input.id}:required-1`,\n anyOf: [input.required],\n sourceEventIds: [currentEventId],\n },\n ...(input.extraRequired\n ? [\n {\n id: `${input.id}:required-2`,\n anyOf: [input.extraRequired],\n sourceEventIds: [currentEventId],\n },\n ]\n : []),\n ],\n forbiddenFacts: [\n {\n id: `${input.id}:stale`,\n anyOf: [input.forbidden],\n sourceEventIds: [staleEventId],\n obsolete: true,\n },\n ],\n expectedEventIds: [currentEventId],\n expectedActorIds: [input.actorId],\n referenceAnswer: input.required,\n }\n}\n","import { join } from 'node:path'\n\nimport { canonicalJson } from '@tangle-network/agent-eval'\n\nimport {\n type CampaignStorage,\n type CostLedgerHandle,\n createRunCostLedger,\n fsCampaignStorage,\n resolveRunDir,\n} from '@tangle-network/agent-eval/campaign'\n\nimport { stableId } from '../ids'\n\nimport { DEFAULT_MEMORY_RECOVERY_RETRIES_PER_ATTEMPT } from '../memory/attempt-log'\n\nimport {\n releaseMemoryAdapterCreatedAfterAbort,\n resolveMemoryCleanupTimeoutMs,\n runBoundedMemoryLifecycle,\n} from '../memory/lifecycle'\n\nimport { acquireAgentMemoryRunLease, type OwnedAgentMemoryRunLease } from '../memory/run-control'\n\nimport type { AgentMemoryAdapter } from '../memory/types'\n\nimport {\n assertScopedMemoryBenchmarkAdapter,\n memoryAdapterBenchmarkExpectedId,\n recoverMemoryAdapterBenchmarkAttempts,\n} from './memory-recovery'\n\nimport {\n createMemoryAdapterBenchmarkResponder,\n MemoryAdapterBenchmarkCleanupError,\n} from './memory-responder'\n\nimport { runKnowledgeBenchmarkSuite } from './suite'\n\nimport type {\n KnowledgeBenchmarkArtifact,\n KnowledgeBenchmarkResponder,\n MemoryAdapterBenchmarkCandidate,\n MemoryAdapterBenchmarkRankingRow,\n RunKnowledgeBenchmarkSuiteResult,\n RunMemoryAdapterBenchmarkOptions,\n RunMemoryAdapterBenchmarkResult,\n} from './types'\n\nimport { formatNumber, normalizeUsd } from './utils'\n\nimport { assertNonEmptyBenchmarkString, assertUniqueNonEmptyStrings } from './validation'\n\nconst MEMORY_ADAPTER_BENCHMARK_IMPLEMENTATION_REF = 'agent-knowledge:memory-adapter-benchmark:v7'\n\nexport async function runMemoryAdapterBenchmark(\n options: RunMemoryAdapterBenchmarkOptions,\n): Promise<RunMemoryAdapterBenchmarkResult> {\n if (options.candidates.length === 0)\n throw new Error('memory adapter benchmark requires candidates')\n const allCandidates = [...options.candidates, ...(options.recoveryCandidates ?? [])]\n assertUniqueNonEmptyStrings(\n allCandidates.map((candidate) => candidate.id),\n 'memory adapter candidate id',\n )\n for (const candidate of allCandidates) {\n assertNonEmptyBenchmarkString(candidate.ref, `memory adapter candidate ${candidate.id} ref`)\n if (candidate.adapterId !== undefined) {\n assertNonEmptyBenchmarkString(\n candidate.adapterId,\n `memory adapter candidate ${candidate.id} adapterId`,\n )\n }\n if (!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(candidate.id)) {\n throw new Error(\n `memory adapter candidate id '${candidate.id}' must be a safe directory segment`,\n )\n }\n if (\n candidate.adapterCreationCostUsd !== undefined &&\n (!Number.isFinite(candidate.adapterCreationCostUsd) || candidate.adapterCreationCostUsd < 0)\n ) {\n throw new Error(\n `${candidate.id}: adapterCreationCostUsd must be a non-negative finite number`,\n )\n }\n if (\n candidate.costUsdPerCase !== undefined &&\n (!Number.isFinite(candidate.costUsdPerCase) || candidate.costUsdPerCase < 0)\n ) {\n throw new Error(`${candidate.id}: costUsdPerCase must be a non-negative finite number`)\n }\n if (\n candidate.recoveryCostUsdPerAttempt !== undefined &&\n (!Number.isFinite(candidate.recoveryCostUsdPerAttempt) ||\n candidate.recoveryCostUsdPerAttempt < 0)\n ) {\n throw new Error(\n `${candidate.id}: recoveryCostUsdPerAttempt must be a non-negative finite number`,\n )\n }\n }\n const storage = options.storage ?? fsCampaignStorage()\n if (!storage.append) {\n throw new Error('memory adapter benchmark requires CampaignStorage.append')\n }\n const runDir = resolveRunDir(options.runDir, options.repo)\n const cleanupTimeoutMs = resolveMemoryCleanupTimeoutMs(\n options.cleanupTimeoutMs,\n 'memory adapter benchmark',\n )\n const maxRecoveryAttempts = options.maxRecoveryAttempts ?? 1_000\n if (!Number.isSafeInteger(maxRecoveryAttempts) || maxRecoveryAttempts <= 0) {\n throw new Error('memory adapter benchmark maxRecoveryAttempts must be a positive safe integer')\n }\n const maxRecoveryRetriesPerAttempt =\n options.maxRecoveryRetriesPerAttempt ?? DEFAULT_MEMORY_RECOVERY_RETRIES_PER_ATTEMPT\n if (!Number.isSafeInteger(maxRecoveryRetriesPerAttempt) || maxRecoveryRetriesPerAttempt <= 0) {\n throw new Error(\n 'memory adapter benchmark maxRecoveryRetriesPerAttempt must be a positive safe integer',\n )\n }\n storage.ensureDir(runDir)\n const lease = await acquireAgentMemoryRunLease({\n experimentId: `memory-adapter-benchmark:${runDir}`,\n runDir,\n storage,\n customStorage: options.storage !== undefined,\n lockFileName: 'memory-adapter-benchmark.lock',\n label: 'memory adapter benchmark',\n controllerMode: options.controllerMode,\n acquireRunLease: options.acquireRunLease,\n })\n let result: RunMemoryAdapterBenchmarkResult | undefined\n let primaryError: unknown\n try {\n result = await runOwnedMemoryAdapterBenchmark(\n options,\n storage,\n runDir,\n lease,\n cleanupTimeoutMs,\n maxRecoveryAttempts,\n maxRecoveryRetriesPerAttempt,\n )\n } catch (error) {\n primaryError = error\n }\n let releaseError: unknown\n try {\n await lease.release()\n } catch (error) {\n releaseError = error\n }\n if (primaryError && releaseError) {\n throw new AggregateError(\n [primaryError, releaseError],\n 'memory adapter benchmark failed and its controller lease could not be released',\n )\n }\n if (primaryError) throw primaryError\n if (releaseError) throw releaseError\n if (!result) throw new Error('memory adapter benchmark produced no result')\n return result\n}\n\nasync function runOwnedMemoryAdapterBenchmark(\n options: RunMemoryAdapterBenchmarkOptions,\n storage: CampaignStorage,\n runDir: string,\n lease: OwnedAgentMemoryRunLease,\n cleanupTimeoutMs: number,\n maxRecoveryAttempts: number,\n maxRecoveryRetriesPerAttempt: number,\n): Promise<RunMemoryAdapterBenchmarkResult> {\n const maxConcurrency = options.maxConcurrency ?? 2\n if (!Number.isSafeInteger(maxConcurrency) || maxConcurrency <= 0) {\n throw new Error('memory adapter benchmark maxConcurrency must be a positive safe integer')\n }\n const costCeiling = options.costCeiling ?? options.costLedger?.costCeilingUsd ?? 0\n const costLedger =\n options.costLedger ??\n createRunCostLedger({\n storage,\n runDir,\n costCeilingUsd: costCeiling,\n })\n if (costLedger.costCeilingUsd !== costCeiling) {\n throw new Error(\n 'memory adapter benchmark costCeiling must match the shared cost ledger ceiling',\n )\n }\n const attemptLogPath = join(runDir, 'memory-adapter-attempts.jsonl')\n const recoveryLogPath = join(runDir, 'memory-adapter-recovery-attempts.jsonl')\n await recoverMemoryAdapterBenchmarkAttempts({\n candidates: [...options.candidates, ...(options.recoveryCandidates ?? [])],\n storage,\n attemptLogPath,\n lease,\n cleanupTimeoutMs,\n maxConcurrency,\n now: options.now,\n runDir,\n costLedger,\n costPhase: options.costPhase ?? 'memory.adapter-benchmark',\n maxRecoveryAttempts,\n recoveryLogPath,\n maxRecoveryRetriesPerAttempt,\n })\n await lease.assertOwned()\n const rows: MemoryAdapterBenchmarkRankingRow[] = []\n for (const candidate of options.candidates) {\n await lease.assertOwned()\n const expectedAdapterId = memoryAdapterBenchmarkExpectedId(candidate)\n let adapter: AgentMemoryAdapter | undefined\n let adapterPromise: Promise<AgentMemoryAdapter> | undefined\n let adapterCreationError: unknown\n const getAdapter = (): Promise<AgentMemoryAdapter> => {\n if (!adapterPromise) {\n const abortController = new AbortController()\n const creation = createMemoryAdapterBenchmarkAdapter({\n candidate,\n purpose: 'execute',\n signal: abortController.signal,\n costLedger,\n runDir,\n costPhase: options.costPhase ?? 'memory.adapter-benchmark',\n })\n releaseMemoryAdapterCreatedAfterAbort({ creation, signal: abortController.signal })\n adapterPromise = runBoundedMemoryLifecycle({\n operation: `${candidate.id}: benchmark execute adapter creation`,\n timeoutMs: Math.min(cleanupTimeoutMs, options.dispatchTimeoutMs ?? cleanupTimeoutMs),\n abortController,\n run: () => creation,\n })\n .then((created) => {\n adapter = created\n if (created.id !== expectedAdapterId) {\n throw new Error(\n `${candidate.id}: createAdapter returned id '${created.id}', expected '${expectedAdapterId}'`,\n )\n }\n assertScopedMemoryBenchmarkAdapter(created)\n return created\n })\n .catch((error) => {\n adapterCreationError = error\n throw error\n })\n }\n return adapterPromise\n }\n const dispatchedExecutions: Promise<KnowledgeBenchmarkArtifact>[] = []\n let run: RunKnowledgeBenchmarkSuiteResult<KnowledgeBenchmarkArtifact> | undefined\n let primaryError: unknown\n try {\n await lease.assertOwned()\n let respond: KnowledgeBenchmarkResponder<KnowledgeBenchmarkArtifact> | undefined\n run = await runKnowledgeBenchmarkSuite({\n cases: options.cases,\n respond(input) {\n const operation = getAdapter().then((activeAdapter) => {\n respond ??= createMemoryAdapterBenchmarkResponder({\n adapter: activeAdapter,\n candidateId: candidate.id,\n candidateRef: candidate.ref,\n storage,\n attemptLogPath,\n lease,\n cleanupTimeoutMs,\n searchLimit: candidate.searchLimit,\n scope: candidate.scope,\n adapterCreationCostUsd: candidate.adapterCreationCostUsd,\n costUsdPerCase: candidate.costUsdPerCase,\n recoveryCostUsdPerAttempt: candidate.recoveryCostUsdPerAttempt,\n now: options.now,\n })\n return respond(input)\n })\n dispatchedExecutions.push(operation)\n return operation\n },\n respondRef: stableId(\n 'memory_adapter_benchmark',\n canonicalJson({\n implementationRef: MEMORY_ADAPTER_BENCHMARK_IMPLEMENTATION_REF,\n candidateRef: candidate.ref,\n adapterId: expectedAdapterId,\n searchLimit: candidate.searchLimit ?? null,\n adapterCreationCostUsd: candidate.adapterCreationCostUsd ?? 0,\n costUsdPerCase: candidate.costUsdPerCase ?? 0,\n recoveryCostUsdPerAttempt: candidate.recoveryCostUsdPerAttempt ?? 0,\n scope: candidate.scope ?? null,\n }),\n ),\n runDir: join(runDir, candidate.id),\n storage,\n seed: options.seed,\n reps: options.reps,\n resumable: options.resumable,\n costCeiling,\n costLedger,\n costPhase: `${options.costPhase ?? 'memory.adapter-benchmark'}.${candidate.id}`,\n maxConcurrency: options.maxConcurrency,\n dispatchTimeoutMs: options.dispatchTimeoutMs,\n expectUsage: options.expectUsage ?? 'off',\n now: options.now,\n })\n } catch (error) {\n primaryError = error\n }\n\n const settledExecutions = await Promise.allSettled(dispatchedExecutions)\n const dispatchCleanupErrors = settledExecutions.flatMap((settled) =>\n settled.status === 'rejected' && settled.reason instanceof MemoryAdapterBenchmarkCleanupError\n ? [settled.reason]\n : [],\n )\n if (!primaryError && adapterCreationError) primaryError = adapterCreationError\n if (run) {\n rows.push({\n rank: 0,\n candidateId: candidate.id,\n label: candidate.label ?? candidate.id,\n adapterId: expectedAdapterId,\n scoreMean: run.report.score.mean,\n passRate: run.report.dimensions.passed?.mean ?? 0,\n totalCases: run.report.totalCases,\n totalCells: run.report.totalCells,\n cellsFailed: run.report.cellsFailed,\n totalCostUsd: run.report.totalCostUsd,\n reportJsonPath: run.reportJsonPath,\n reportMarkdownPath: run.reportMarkdownPath,\n report: run.report,\n })\n }\n const cleanupErrors: unknown[] = []\n let cleanupOwned = true\n try {\n await lease.assertOwned()\n } catch (error) {\n cleanupOwned = false\n cleanupErrors.push(error)\n }\n if (cleanupOwned && adapter && !adapterCreationError) {\n const activeAdapter = adapter\n try {\n await runBoundedMemoryLifecycle({\n operation: `${candidate.id}: benchmark adapter flush`,\n timeoutMs: cleanupTimeoutMs,\n resource: activeAdapter,\n run: () => activeAdapter.flush?.(),\n })\n } catch (error) {\n cleanupErrors.push(error)\n }\n }\n if (adapter) {\n try {\n await runBoundedMemoryLifecycle({\n operation: `${candidate.id}: benchmark adapter close`,\n timeoutMs: cleanupTimeoutMs,\n resource: adapter,\n run: () => adapter!.close?.(),\n })\n } catch (error) {\n cleanupErrors.push(error)\n }\n }\n if (primaryError || dispatchCleanupErrors.length > 0 || cleanupErrors.length > 0) {\n const errors = [\n ...(primaryError ? [primaryError] : []),\n ...dispatchCleanupErrors,\n ...cleanupErrors,\n ]\n if (errors.length === 1) throw errors[0]\n throw new AggregateError(errors, `${candidate.id}: memory adapter benchmark cleanup failed`)\n }\n await lease.assertOwned()\n }\n\n const costByCandidate = memoryAdapterBenchmarkCostByCandidate(costLedger, runDir, [\n ...options.candidates,\n ...(options.recoveryCandidates ?? []),\n ])\n const ranked = rows\n .map((row) => {\n const totalCostUsd = normalizeUsd(costByCandidate.get(row.candidateId) ?? 0)\n return {\n ...row,\n totalCostUsd,\n }\n })\n .sort(\n (a, b) =>\n Number(a.cellsFailed > 0) - Number(b.cellsFailed > 0) ||\n b.scoreMean - a.scoreMean ||\n b.passRate - a.passRate ||\n a.totalCostUsd - b.totalCostUsd ||\n a.candidateId.localeCompare(b.candidateId),\n )\n .map((row, index) => ({ ...row, rank: index + 1 }))\n const rankingJsonPath = join(runDir, 'memory-adapter-ranking.json')\n const rankingMarkdownPath = join(runDir, 'memory-adapter-ranking.md')\n const unrankedRecoveryCostUsd = normalizeUsd(\n (options.recoveryCandidates ?? []).reduce(\n (sum, candidate) => sum + (costByCandidate.get(candidate.id) ?? 0),\n 0,\n ),\n )\n const totalCostUsd = normalizeUsd(\n [...costByCandidate.values()].reduce((sum, cost) => sum + cost, 0),\n )\n storage.write(\n rankingJsonPath,\n `${JSON.stringify({ totalCostUsd, unrankedRecoveryCostUsd, rows: ranked }, null, 2)}\\n`,\n )\n storage.write(\n rankingMarkdownPath,\n renderMemoryAdapterRankingMarkdown(ranked, totalCostUsd, unrankedRecoveryCostUsd),\n )\n return {\n rows: ranked,\n totalCostUsd,\n unrankedRecoveryCostUsd,\n rankingJsonPath,\n rankingMarkdownPath,\n attemptLogPath,\n recoveryLogPath,\n }\n}\n\nasync function createMemoryAdapterBenchmarkAdapter(input: {\n candidate: MemoryAdapterBenchmarkCandidate\n purpose: 'execute' | 'recovery'\n signal: AbortSignal\n costLedger: CostLedgerHandle\n runDir: string\n costPhase: string\n}): Promise<AgentMemoryAdapter> {\n const { candidate, purpose, signal, costLedger, runDir, costPhase } = input\n const costUsd = candidate.adapterCreationCostUsd ?? 0\n let externalCallAttempted = false\n const create = async (): Promise<AgentMemoryAdapter> => {\n const adapter = await candidate.createAdapter({\n purpose,\n signal,\n markExternalCall: () => {\n externalCallAttempted = true\n },\n })\n if (!adapter || typeof adapter !== 'object') {\n throw new Error(`${candidate.id}: createAdapter returned no ${purpose} adapter`)\n }\n return adapter\n }\n if (costUsd === 0) return create()\n\n const tags = memoryAdapterCreationCostTags(runDir, candidate.id, purpose)\n const generation = costLedger.list({ tags }).length\n const receipt = {\n model: candidate.id,\n inputTokens: 0,\n outputTokens: 0,\n actualCostUsd: costUsd,\n } as const\n const paid = await costLedger.runPaidCall({\n callId: memoryAdapterCreationCostCallId(candidate, purpose, generation),\n channel: 'driver',\n phase: `${costPhase}.${candidate.id}.adapter-${purpose}`,\n actor: `agent-knowledge:memory-adapter:${candidate.id}`,\n model: candidate.id,\n tags,\n maximumCharge: { externallyEnforcedMaximumUsd: costUsd },\n execute: create,\n receipt: () => ({\n ...receipt,\n actualCostUsd: externalCallAttempted ? costUsd : 0,\n }),\n receiptFromError: () => ({\n ...receipt,\n actualCostUsd: externalCallAttempted ? costUsd : 0,\n }),\n })\n if (!paid.succeeded) throw paid.error\n return paid.value\n}\n\nfunction memoryAdapterCreationCostTags(\n runDir: string,\n candidateId: string,\n purpose: 'execute' | 'recovery',\n): Record<string, string> {\n return {\n runDir: join(runDir, candidateId),\n candidateId,\n memoryAdapterCreation: purpose,\n }\n}\n\nfunction memoryAdapterCreationCostCallId(\n candidate: MemoryAdapterBenchmarkCandidate,\n purpose: 'execute' | 'recovery',\n generation: number,\n): string {\n return stableId(\n 'memory_adapter_creation_cost_call',\n canonicalJson({\n purpose,\n generation,\n candidateId: candidate.id,\n candidateRef: candidate.ref,\n adapterCreationCostUsd: candidate.adapterCreationCostUsd ?? 0,\n }),\n )\n}\n\nfunction memoryAdapterBenchmarkCostByCandidate(\n costLedger: CostLedgerHandle,\n runDir: string,\n candidates: readonly MemoryAdapterBenchmarkCandidate[],\n): ReadonlyMap<string, number> {\n const candidateByRunDir = new Map(\n candidates.map((candidate) => [join(runDir, candidate.id), candidate.id]),\n )\n const totals = new Map<string, number>()\n for (const receipt of costLedger.list()) {\n const candidateId = receipt.tags?.runDir\n ? candidateByRunDir.get(receipt.tags.runDir)\n : undefined\n if (!candidateId) continue\n totals.set(candidateId, (totals.get(candidateId) ?? 0) + receipt.costUsd)\n }\n return totals\n}\n\nfunction renderMemoryAdapterRankingMarkdown(\n rows: readonly MemoryAdapterBenchmarkRankingRow[],\n totalCostUsd: number,\n unrankedRecoveryCostUsd: number,\n): string {\n return [\n '# Memory Adapter Ranking',\n '',\n `- total cost: $${formatNumber(totalCostUsd)}`,\n `- retired-candidate recovery cost: $${formatNumber(unrankedRecoveryCostUsd)}`,\n '',\n '| rank | candidate | adapter | cases | cells | failed | mean score | pass rate | cost |',\n '| ---: | --- | --- | ---: | ---: | ---: | ---: | ---: | ---: |',\n ...rows.map(\n (row) =>\n `| ${row.rank} | ${row.label} | ${row.adapterId} | ${row.totalCases} | ${row.totalCells} | ${row.cellsFailed} | ${formatNumber(row.scoreMean)} | ${formatNumber(row.passRate)} | $${formatNumber(row.totalCostUsd)} |`,\n ),\n '',\n ].join('\\n')\n}\n","import type { CampaignStorage, CostLedgerHandle } from '@tangle-network/agent-eval/campaign'\n\nexport interface AttemptJournalEvent {\n status: 'started' | 'cleaned'\n recordedAt: string\n}\n\ninterface RecoveryAttemptEvent {\n schema: 1\n attemptId: string\n generation: number\n recordedAt: string\n}\n\nconst journalByteLengths = new WeakMap<CampaignStorage, Map<string, number>>()\n\nexport const DEFAULT_MEMORY_RECOVERY_RETRIES_PER_ATTEMPT = 3\n\nconst MEMORY_PROVIDER_ACTOR_PREFIXES = [\n 'agent-knowledge:memory-adapter:',\n 'agent-knowledge:memory-adapter-recovery:',\n 'agent-knowledge:memory-experiment:',\n 'agent-knowledge:memory-recovery:',\n] as const\n\nexport function reconcileInterruptedMemoryPaidCalls(costLedger: CostLedgerHandle): void {\n reconcileInterruptedPaidCallsAtMaximum(\n costLedger,\n (actor) => isMemoryProviderActor(actor),\n 'external memory provider',\n )\n}\n\nexport function reconcileInterruptedRunPaidCalls(\n costLedger: CostLedgerHandle,\n label: string,\n): void {\n reconcileInterruptedPaidCallsAtMaximum(costLedger, () => true, label)\n}\n\nfunction reconcileInterruptedPaidCallsAtMaximum(\n costLedger: CostLedgerHandle,\n ownsActor: (actor: string) => boolean,\n label: string,\n): void {\n if (costLedger.summary().unresolvedCalls === 0) return\n const pending = requirePendingCostCallInspection(costLedger)\n for (const call of pending) {\n if (call.state !== 'interrupted' || !ownsActor(call.actor)) continue\n if (call.maximumCostUsd === undefined) {\n throw new Error(\n `cannot recover unbounded interrupted ${label} call '${call.callId}' for '${call.actor}'`,\n )\n }\n try {\n costLedger.reconcile(\n call.callId,\n {\n model: call.model,\n inputTokens: 0,\n outputTokens: 0,\n actualCostUsd: call.maximumCostUsd,\n },\n {\n error: `process exited before the ${label} receipt for '${call.actor}' was recorded; charged the reserved maximum`,\n },\n )\n } catch (error) {\n if (isMissingPendingCostCall(error, call.callId)) continue\n throw error\n }\n }\n}\n\nexport function assertNoInterruptedPaidCalls(costLedger: CostLedgerHandle, label: string): void {\n const unresolved = costLedger.summary().unresolvedCalls\n if (unresolved === 0) return\n const pending = requirePendingCostCallInspection(costLedger)\n const blocked = pending.filter((call) => call.state !== 'active')\n throw new Error(\n `${label} has ${unresolved} unresolved paid call(s) that cannot be resumed: ${blocked\n .map((call) => `${call.callId} (${call.actor}, ${call.state})`)\n .join(', ')}`,\n )\n}\n\nexport function hasSettledPaidCall(costLedger: CostLedgerHandle, callId: string): boolean {\n return costLedger.list().some((receipt) => receipt.callId === callId)\n}\n\nexport function appendAttemptJournalEvent<TEvent extends AttemptJournalEvent>(input: {\n storage: CampaignStorage\n path: string\n event: TEvent\n label: string\n}): void {\n appendDurableJournalEvent(input)\n}\n\nexport function appendDurableJournalEvent<TEvent extends object>(input: {\n storage: CampaignStorage\n path: string\n event: TEvent\n label: string\n}): void {\n const { storage, path, event, label } = input\n if (!storage.append) throw new Error(`${label} requires CampaignStorage.append`)\n const line = `${JSON.stringify(event)}\\n`\n const byteLengths = journalByteLengths.get(storage) ?? new Map<string, number>()\n journalByteLengths.set(storage, byteLengths)\n for (let retry = 0; retry < 100; retry += 1) {\n let expectedBytes = byteLengths.get(path)\n if (expectedBytes === undefined) {\n const current = storage.read(path)\n if (current === undefined && storage.exists(path)) {\n throw new Error(`cannot read ${label} '${path}'`)\n }\n expectedBytes = new TextEncoder().encode(current ?? '').byteLength\n byteLengths.set(path, expectedBytes)\n }\n const appendedBytes = storage.append(path, line, expectedBytes)\n if (appendedBytes !== undefined) {\n byteLengths.set(path, appendedBytes)\n return\n }\n byteLengths.delete(path)\n }\n throw new Error(`${label} '${path}' remained contended after 100 retries`)\n}\n\n/** Reserves one durable recovery generation per attempt before provider work starts. */\nexport function reserveRecoveryAttempts(input: {\n storage: CampaignStorage\n path: string\n attemptIds: readonly string[]\n maxRetriesPerAttempt: number\n label: string\n now?: () => Date\n}): ReadonlyMap<string, number> {\n const { storage, path, attemptIds, maxRetriesPerAttempt, label } = input\n if (!Number.isSafeInteger(maxRetriesPerAttempt) || maxRetriesPerAttempt <= 0) {\n throw new Error(`${label} maxRetriesPerAttempt must be a positive safe integer`)\n }\n const uniqueAttemptIds = new Set(attemptIds)\n if (uniqueAttemptIds.size !== attemptIds.length || attemptIds.some((id) => !id.trim())) {\n throw new Error(`${label} attempt ids must be unique non-empty strings`)\n }\n const generations = readRecoveryAttemptGenerations(storage, path, label)\n for (const attemptId of attemptIds) {\n const prior = generations.get(attemptId) ?? 0\n if (prior >= maxRetriesPerAttempt) {\n throw new Error(\n `${label} '${attemptId}' exhausted ${maxRetriesPerAttempt} recovery attempts; increase maxRecoveryRetriesPerAttempt only after inspecting provider state`,\n )\n }\n }\n const reserved = new Map<string, number>()\n for (const attemptId of attemptIds) {\n const generation = (generations.get(attemptId) ?? 0) + 1\n appendDurableJournalEvent({\n storage,\n path,\n label,\n event: {\n schema: 1,\n attemptId,\n generation,\n recordedAt: (input.now ?? (() => new Date()))().toISOString(),\n } satisfies RecoveryAttemptEvent,\n })\n generations.set(attemptId, generation)\n reserved.set(attemptId, generation)\n }\n return reserved\n}\n\nexport function readActiveAttemptJournal<TEvent extends AttemptJournalEvent>(input: {\n storage: CampaignStorage\n path: string\n label: string\n parse(value: unknown, path: string, line: number): TEvent\n id(event: TEvent): string\n sameAttempt(left: TEvent, right: TEvent): boolean\n}): TEvent[] {\n const { storage, path, label, parse, id, sameAttempt } = input\n const stored = storage.read(path)\n if (stored === undefined) {\n if (storage.exists(path)) throw new Error(`cannot read ${label} '${path}'`)\n return []\n }\n const active = new Map<string, TEvent>()\n const completed = new Map<string, TEvent>()\n for (const [index, line] of stored.split('\\n').entries()) {\n if (!line) continue\n let raw: unknown\n try {\n raw = JSON.parse(line)\n } catch (error) {\n throw new Error(`invalid ${label} '${path}' line ${index + 1}`, { cause: error })\n }\n const event = parse(raw, path, index + 1)\n const attemptId = id(event)\n if (event.status === 'started') {\n if (active.has(attemptId) || completed.has(attemptId)) {\n throw new Error(`${label} '${path}' repeats attempt '${attemptId}'`)\n }\n active.set(attemptId, event)\n continue\n }\n\n const started = active.get(attemptId)\n if (started && sameAttempt(started, event)) {\n active.delete(attemptId)\n completed.set(attemptId, started)\n continue\n }\n\n const prior = completed.get(attemptId)\n if (prior && sameAttempt(prior, event)) continue\n throw new Error(`${label} '${path}' has an unmatched cleanup for '${attemptId}'`)\n }\n return [...active.values()]\n}\n\nfunction readRecoveryAttemptGenerations(\n storage: CampaignStorage,\n path: string,\n label: string,\n): Map<string, number> {\n const stored = storage.read(path)\n if (stored === undefined) {\n if (storage.exists(path)) throw new Error(`cannot read ${label} '${path}'`)\n return new Map()\n }\n const generations = new Map<string, number>()\n for (const [index, line] of stored.split('\\n').entries()) {\n if (!line) continue\n let raw: unknown\n try {\n raw = JSON.parse(line)\n } catch (error) {\n throw new Error(`invalid ${label} '${path}' line ${index + 1}`, { cause: error })\n }\n const event = parseRecoveryAttemptEvent(raw, path, index + 1, label)\n const expected = (generations.get(event.attemptId) ?? 0) + 1\n if (event.generation !== expected) {\n throw new Error(\n `${label} '${path}' has recovery generation ${event.generation} for '${event.attemptId}', expected ${expected}`,\n )\n }\n generations.set(event.attemptId, event.generation)\n }\n return generations\n}\n\nfunction parseRecoveryAttemptEvent(\n value: unknown,\n path: string,\n line: number,\n label: string,\n): RecoveryAttemptEvent {\n const event = value as Partial<RecoveryAttemptEvent> | null\n const valid =\n typeof event === 'object' &&\n event !== null &&\n event.schema === 1 &&\n typeof event.attemptId === 'string' &&\n event.attemptId.length > 0 &&\n Number.isSafeInteger(event.generation) &&\n event.generation! > 0 &&\n typeof event.recordedAt === 'string' &&\n !Number.isNaN(Date.parse(event.recordedAt))\n if (!valid) throw new Error(`invalid ${label} '${path}' line ${line}`)\n return value as RecoveryAttemptEvent\n}\n\nfunction isMissingPendingCostCall(error: unknown, callId: string): boolean {\n return error instanceof Error && error.message === `CostLedger: no pending call '${callId}'`\n}\n\nfunction requirePendingCostCallInspection(costLedger: CostLedgerHandle) {\n if (!costLedger.listPending) {\n throw new Error(\n 'interrupted memory recovery requires CostLedger.listPending() from @tangle-network/agent-eval 0.122.8 or newer',\n )\n }\n return costLedger.listPending()\n}\n\nfunction isMemoryProviderActor(actor: string): boolean {\n return MEMORY_PROVIDER_ACTOR_PREFIXES.some((prefix) => actor.startsWith(prefix))\n}\n","import type { AgentMemoryAdapter } from './types'\n\nexport const DEFAULT_MEMORY_CLEANUP_TIMEOUT_MS = 180_000\n\nexport class AgentMemoryLifecycleTimeoutError extends Error {\n constructor(\n readonly operation: string,\n readonly timeoutMs: number,\n ) {\n super(`${operation} did not finish within ${timeoutMs}ms`)\n this.name = 'AgentMemoryLifecycleTimeoutError'\n }\n}\n\nexport class AgentMemoryLifecycleUnsafeError extends Error {\n constructor(\n readonly operation: string,\n readonly priorTimeout: AgentMemoryLifecycleTimeoutError,\n ) {\n super(\n `${operation} cannot start because '${priorTimeout.operation}' is still running after its ${priorTimeout.timeoutMs}ms timeout`,\n { cause: priorTimeout },\n )\n this.name = 'AgentMemoryLifecycleUnsafeError'\n }\n}\n\nconst timedOutResources = new WeakMap<object, AgentMemoryLifecycleTimeoutError>()\n\nexport function releaseMemoryAdapterCreatedAfterAbort(input: {\n creation: Promise<AgentMemoryAdapter | null>\n signal: AbortSignal\n dispose?: (adapter: AgentMemoryAdapter) => Promise<void>\n}): void {\n void input.creation.then(\n async (adapter) => {\n if (!adapter || !input.signal.aborted) return\n try {\n await adapter.close?.()\n } catch {}\n try {\n await input.dispose?.(adapter)\n } catch {}\n },\n () => undefined,\n )\n}\n\nexport function resolveMemoryCleanupTimeoutMs(value: number | undefined, label: string): number {\n const timeoutMs = value ?? DEFAULT_MEMORY_CLEANUP_TIMEOUT_MS\n if (!Number.isSafeInteger(timeoutMs) || timeoutMs <= 0) {\n throw new Error(`${label} cleanupTimeoutMs must be a positive safe integer`)\n }\n return timeoutMs\n}\n\nexport async function runBoundedMemoryLifecycle<T>(input: {\n operation: string\n timeoutMs: number\n /** Prevent later operations from using the same client while timed-out work may still be running. */\n resource?: object\n /** Cooperatively cancel provider work before reporting a timeout. */\n abortController?: AbortController\n run(): Promise<T> | T\n}): Promise<T> {\n const priorTimeout = input.resource ? timedOutResources.get(input.resource) : undefined\n if (priorTimeout) throw new AgentMemoryLifecycleUnsafeError(input.operation, priorTimeout)\n let timeout: ReturnType<typeof setTimeout> | undefined\n let timeoutError: AgentMemoryLifecycleTimeoutError | undefined\n const work = Promise.resolve().then(input.run)\n if (input.resource) {\n const resource = input.resource\n void work.then(\n () => {\n if (timeoutError && timedOutResources.get(resource) === timeoutError) {\n timedOutResources.delete(resource)\n }\n },\n () => {\n if (timeoutError && timedOutResources.get(resource) === timeoutError) {\n timedOutResources.delete(resource)\n }\n },\n )\n }\n const deadline = new Promise<never>((_, reject) => {\n timeout = setTimeout(() => {\n timeoutError = new AgentMemoryLifecycleTimeoutError(input.operation, input.timeoutMs)\n if (input.resource) timedOutResources.set(input.resource, timeoutError)\n input.abortController?.abort(timeoutError)\n reject(timeoutError)\n }, input.timeoutMs)\n })\n try {\n return await Promise.race([work, deadline])\n } finally {\n if (timeout) clearTimeout(timeout)\n }\n}\n\nexport function memoryRecoveryDelayMs(adapter: AgentMemoryAdapter): number {\n const isolation = adapter.branchIsolation\n if (isolation?.mode !== 'scoped' || isolation.processExitSafe !== false) return 0\n const delayMs = isolation.recoveryDelayMs\n if (typeof delayMs !== 'number' || !Number.isSafeInteger(delayMs) || delayMs <= 0) {\n throw new Error(\n `${adapter.id}: processExitSafe=false requires a positive recoveryDelayMs for abandoned writes`,\n )\n }\n return delayMs\n}\n\nexport async function sleepForMemoryRecovery(\n delayMs: number,\n assertOwned: () => Promise<void>,\n timeoutMs = delayMs,\n operation = 'memory recovery visibility wait',\n): Promise<void> {\n if (delayMs <= 0) return\n if (!Number.isSafeInteger(timeoutMs) || timeoutMs <= 0) {\n throw new Error(`${operation} timeout must be a positive safe integer`)\n }\n await new Promise<void>((resolve) => setTimeout(resolve, Math.min(delayMs, timeoutMs)))\n await assertOwned()\n if (delayMs > timeoutMs) throw new AgentMemoryLifecycleTimeoutError(operation, timeoutMs)\n}\n\nexport function createMemoryExecutionPool(limit: number): {\n run<T>(operation: () => Promise<T>): Promise<T>\n} {\n let active = 0\n const waiters: Array<() => void> = []\n return {\n async run<T>(operation: () => Promise<T>): Promise<T> {\n if (active >= limit) await new Promise<void>((resolve) => waiters.push(resolve))\n active += 1\n try {\n return await operation()\n } finally {\n active -= 1\n waiters.shift()?.()\n }\n },\n }\n}\n","import { join } from 'node:path'\nimport { acquireSingleRunLock, type CampaignStorage } from '@tangle-network/agent-eval/campaign'\n\nexport interface AgentMemoryRunLease {\n assertOwned(): Promise<void> | void\n release(): Promise<void> | void\n}\n\nexport type AgentMemoryAcquireRunLease = (input: {\n experimentId: string\n runDir: string\n}) => AgentMemoryRunLease | Promise<AgentMemoryRunLease>\n\nexport type AgentMemoryControllerMode = 'process-local'\n\nexport interface OwnedAgentMemoryRunLease {\n assertOwned(): Promise<void>\n release(): Promise<void>\n}\n\nconst activeProcessLocalRuns = new Set<string>()\n\nexport async function acquireAgentMemoryRunLease(input: {\n experimentId: string\n runDir: string\n storage: CampaignStorage\n customStorage: boolean\n lockFileName: string\n label: string\n controllerMode?: AgentMemoryControllerMode\n acquireRunLease?: AgentMemoryAcquireRunLease\n}): Promise<OwnedAgentMemoryRunLease> {\n if (input.acquireRunLease && input.controllerMode) {\n throw new Error(`${input.label} cannot combine acquireRunLease with controllerMode`)\n }\n if (input.acquireRunLease) {\n const lease = await input.acquireRunLease({\n experimentId: input.experimentId,\n runDir: input.runDir,\n })\n if (!lease || typeof lease.assertOwned !== 'function' || typeof lease.release !== 'function') {\n throw new Error(`${input.label} acquireRunLease must return assertOwned and release`)\n }\n return {\n async assertOwned() {\n await lease.assertOwned()\n },\n async release() {\n await lease.release()\n },\n }\n }\n\n if (!input.customStorage) {\n if (input.controllerMode) {\n throw new Error(`${input.label} controllerMode is only valid with custom storage`)\n }\n const lock = acquireSingleRunLock({\n lockPath: join(input.runDir, input.lockFileName),\n releaseOnExit: false,\n })\n return {\n async assertOwned() {},\n async release() {\n lock.release()\n },\n }\n }\n\n if (input.controllerMode !== 'process-local') {\n throw new Error(\n `${input.label} custom storage requires acquireRunLease or controllerMode='process-local'`,\n )\n }\n const runKey = `${input.label}:${input.runDir}`\n if (activeProcessLocalRuns.has(runKey)) {\n throw new Error(`${input.label} run '${input.runDir}' already has an active controller`)\n }\n activeProcessLocalRuns.add(runKey)\n let released = false\n return {\n async assertOwned() {\n if (released || !activeProcessLocalRuns.has(runKey)) {\n throw new Error(`${input.label} run '${input.runDir}' controller lease was lost`)\n }\n },\n async release() {\n if (released) return\n released = true\n activeProcessLocalRuns.delete(runKey)\n },\n }\n}\n","import { join } from 'node:path'\n\nimport { canonicalJson } from '@tangle-network/agent-eval'\n\nimport type { CampaignStorage, CostLedgerHandle } from '@tangle-network/agent-eval/campaign'\n\nimport { stableId } from '../ids'\n\nimport {\n appendAttemptJournalEvent,\n assertNoInterruptedPaidCalls,\n hasSettledPaidCall,\n readActiveAttemptJournal,\n reconcileInterruptedMemoryPaidCalls,\n reserveRecoveryAttempts,\n} from '../memory/attempt-log'\n\nimport {\n createMemoryExecutionPool,\n memoryRecoveryDelayMs,\n releaseMemoryAdapterCreatedAfterAbort,\n runBoundedMemoryLifecycle,\n sleepForMemoryRecovery,\n} from '../memory/lifecycle'\n\nimport type { OwnedAgentMemoryRunLease } from '../memory/run-control'\n\nimport type { AgentMemoryAdapter, AgentMemoryScope } from '../memory/types'\n\nimport type { MemoryAdapterBenchmarkCandidate } from './types'\n\nexport function memoryAdapterBenchmarkExpectedId(\n candidate: MemoryAdapterBenchmarkCandidate,\n): string {\n return candidate.adapterId ?? candidate.id\n}\n\nexport async function recoverMemoryAdapterBenchmarkAttempts(input: {\n candidates: readonly MemoryAdapterBenchmarkCandidate[]\n storage: CampaignStorage\n attemptLogPath: string\n lease: OwnedAgentMemoryRunLease\n cleanupTimeoutMs: number\n maxConcurrency: number\n now?: () => Date\n runDir: string\n costLedger: CostLedgerHandle\n costPhase: string\n maxRecoveryAttempts: number\n recoveryLogPath: string\n maxRecoveryRetriesPerAttempt: number\n}): Promise<void> {\n let attempts = readActiveMemoryBenchmarkAttempts(input.storage, input.attemptLogPath)\n if (attempts.length > input.maxRecoveryAttempts) {\n throw new Error(\n `memory adapter benchmark has ${attempts.length} unfinished attempts; maxRecoveryAttempts is ${input.maxRecoveryAttempts}`,\n )\n }\n const candidateById = new Map(input.candidates.map((candidate) => [candidate.id, candidate]))\n for (const attempt of attempts) {\n const candidate = candidateById.get(attempt.candidateId)\n if (!candidate) {\n throw new Error(\n `cannot recover memory benchmark attempts: candidate '${attempt.candidateId}' is missing; pass it in recoveryCandidates`,\n )\n }\n assertMemoryBenchmarkAttemptCandidateMatches(attempt, candidate)\n }\n\n reconcileInterruptedMemoryPaidCalls(input.costLedger)\n assertNoInterruptedPaidCalls(input.costLedger, 'memory adapter benchmark recovery')\n\n for (const attempt of attempts) {\n const candidate = candidateById.get(attempt.candidateId)!\n const costUsd = candidate.costUsdPerCase ?? 0\n if (\n costUsd > 0 &&\n !hasSettledPaidCall(input.costLedger, memoryBenchmarkCostCallId(attempt, 'execute', 0))\n ) {\n appendMemoryBenchmarkAttemptEvent(input.storage, input.attemptLogPath, {\n ...attempt,\n status: 'cleaned',\n recovery: true,\n recordedAt: (input.now ?? (() => new Date()))().toISOString(),\n })\n }\n }\n attempts = readActiveMemoryBenchmarkAttempts(input.storage, input.attemptLogPath)\n const recoveryGenerations = reserveRecoveryAttempts({\n storage: input.storage,\n path: input.recoveryLogPath,\n attemptIds: attempts.map((attempt) => attempt.attemptId),\n maxRetriesPerAttempt: input.maxRecoveryRetriesPerAttempt,\n label: 'memory benchmark recovery attempt log',\n now: input.now,\n })\n const grouped = groupMemoryBenchmarkAttempts(attempts)\n const pool = createMemoryExecutionPool(input.maxConcurrency)\n const settled = await Promise.allSettled(\n [...grouped]\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([candidateId, candidateAttempts]) =>\n pool.run(async () => {\n await input.lease.assertOwned()\n const candidate = candidateById.get(candidateId)\n if (!candidate) {\n throw new Error(\n `cannot recover memory benchmark attempts: candidate '${candidateId}' is missing; pass it in recoveryCandidates`,\n )\n }\n for (const attempt of candidateAttempts) {\n assertMemoryBenchmarkAttemptCandidateMatches(attempt, candidate)\n if (recoveryGenerations.get(attempt.attemptId) === undefined) {\n throw new Error(\n `missing recovery generation for memory benchmark attempt '${attempt.attemptId}'`,\n )\n }\n }\n\n let recoveryAttemptsStarted = 0\n let adapterCreationExternalCallAttempted = false\n const cleared: MemoryAdapterBenchmarkAttemptEvent[] = []\n const recover = async (): Promise<void> => {\n let adapter: AgentMemoryAdapter | undefined\n let primaryError: unknown\n try {\n const abortController = new AbortController()\n const creation = Promise.resolve().then(() =>\n candidate.createAdapter({\n purpose: 'recovery',\n signal: abortController.signal,\n markExternalCall: () => {\n adapterCreationExternalCallAttempted = true\n },\n }),\n )\n releaseMemoryAdapterCreatedAfterAbort({\n creation,\n signal: abortController.signal,\n })\n adapter = await runBoundedMemoryLifecycle({\n operation: `${candidate.id}: benchmark recovery adapter creation`,\n timeoutMs: input.cleanupTimeoutMs,\n abortController,\n run: () => creation,\n })\n assertScopedMemoryBenchmarkAdapter(adapter)\n for (const attempt of candidateAttempts) {\n if (adapter.id !== attempt.adapterId) {\n throw new Error(\n `cannot recover memory benchmark attempt '${attempt.attemptId}': adapter changed from '${attempt.adapterId}' to '${adapter.id}'`,\n )\n }\n }\n await sleepForMemoryRecovery(\n memoryRecoveryDelayMs(adapter),\n () => input.lease.assertOwned(),\n input.cleanupTimeoutMs,\n `${candidate.id}: benchmark recovery visibility wait`,\n )\n for (const attempt of candidateAttempts.sort((left, right) =>\n left.attemptId.localeCompare(right.attemptId),\n )) {\n await input.lease.assertOwned()\n try {\n recoveryAttemptsStarted += 1\n await runBoundedMemoryLifecycle({\n operation: `${candidate.id}: abandoned benchmark attempt cleanup`,\n timeoutMs: input.cleanupTimeoutMs,\n resource: adapter,\n run: () => adapter!.clear!(attempt.scope),\n })\n await input.lease.assertOwned()\n cleared.push(attempt)\n } catch (error) {\n primaryError = primaryError\n ? new AggregateError(\n [primaryError, error],\n `${candidate.id}: multiple benchmark attempts failed recovery`,\n )\n : error\n }\n }\n } catch (error) {\n primaryError = primaryError\n ? new AggregateError(\n [primaryError, error],\n `${candidate.id}: benchmark recovery failed in multiple operations`,\n )\n : error\n }\n\n let closeError: unknown\n if (adapter) {\n try {\n await runBoundedMemoryLifecycle({\n operation: `${candidate.id}: benchmark recovery adapter close`,\n timeoutMs: input.cleanupTimeoutMs,\n resource: adapter,\n run: () => adapter!.close?.(),\n })\n } catch (error) {\n closeError = error\n }\n }\n let journalError: unknown\n if (!closeError) {\n try {\n for (const attempt of cleared) {\n await input.lease.assertOwned()\n appendMemoryBenchmarkAttemptEvent(input.storage, input.attemptLogPath, {\n ...attempt,\n status: 'cleaned',\n recovery: true,\n recordedAt: (input.now ?? (() => new Date()))().toISOString(),\n })\n }\n } catch (error) {\n journalError = error\n }\n }\n const failures = [primaryError, closeError, journalError].filter(\n (error) => error !== undefined,\n )\n if (failures.length > 1) {\n throw new AggregateError(\n failures,\n `${candidate.id}: benchmark attempt recovery, adapter close, or cleanup journal failed`,\n )\n }\n if (primaryError) throw primaryError\n if (closeError) throw closeError\n if (journalError) throw journalError\n }\n\n const recoveryCostUsd = candidate.recoveryCostUsdPerAttempt ?? 0\n const adapterCreationCostUsd = candidate.adapterCreationCostUsd ?? 0\n const maximumCostUsd = adapterCreationCostUsd + recoveryCostUsd * candidateAttempts.length\n const actualCostUsd = (): number =>\n (adapterCreationExternalCallAttempted ? adapterCreationCostUsd : 0) +\n recoveryCostUsd * recoveryAttemptsStarted\n let recoveryError: unknown\n if (maximumCostUsd === 0) {\n try {\n await recover()\n } catch (error) {\n recoveryError = error\n }\n } else {\n const receipt = {\n model: candidate.id,\n inputTokens: 0,\n outputTokens: 0,\n } as const\n const tags = memoryBenchmarkRecoveryCostTags(input.runDir, candidate.id)\n const paid = await input.costLedger.runPaidCall({\n callId: memoryBenchmarkRecoveryCostCallId(\n candidate,\n candidateAttempts,\n recoveryGenerations,\n ),\n channel: 'driver',\n phase: `${input.costPhase}.${candidate.id}.recovery`,\n actor: `agent-knowledge:memory-adapter-recovery:${candidate.id}`,\n model: candidate.id,\n tags,\n maximumCharge: { externallyEnforcedMaximumUsd: maximumCostUsd },\n execute: recover,\n receipt: () => ({ ...receipt, actualCostUsd: actualCostUsd() }),\n receiptFromError: () => ({\n ...receipt,\n actualCostUsd: actualCostUsd(),\n }),\n })\n if (!paid.succeeded) recoveryError = paid.error\n }\n if (recoveryError) throw recoveryError\n }),\n ),\n )\n const failures = settled.flatMap((result) =>\n result.status === 'rejected' ? [result.reason] : [],\n )\n if (failures.length === 1) throw failures[0]\n if (failures.length > 1) {\n throw new AggregateError(failures, 'multiple memory benchmark candidates failed recovery')\n }\n}\n\nfunction groupMemoryBenchmarkAttempts(\n attempts: readonly MemoryAdapterBenchmarkAttemptEvent[],\n): Map<string, MemoryAdapterBenchmarkAttemptEvent[]> {\n const grouped = new Map<string, MemoryAdapterBenchmarkAttemptEvent[]>()\n for (const attempt of attempts) {\n const group = grouped.get(attempt.candidateId) ?? []\n group.push(attempt)\n grouped.set(attempt.candidateId, group)\n }\n return grouped\n}\n\nexport function memoryBenchmarkCostCallId(\n attempt: MemoryAdapterBenchmarkAttemptEvent,\n purpose: 'execute' | 'recovery',\n generation: number,\n): string {\n return stableId(\n 'memory_benchmark_cost_call',\n canonicalJson({\n purpose,\n generation,\n attemptId: attempt.attemptId,\n candidateId: attempt.candidateId,\n candidateRef: attempt.candidateRef,\n adapterId: attempt.adapterId,\n adapterCreationCostUsd: attempt.adapterCreationCostUsd,\n costUsdPerCase: attempt.costUsdPerCase,\n recoveryCostUsdPerAttempt: attempt.recoveryCostUsdPerAttempt,\n caseId: attempt.caseId,\n cellId: attempt.cellId,\n }),\n )\n}\n\nfunction memoryBenchmarkRecoveryCostCallId(\n candidate: MemoryAdapterBenchmarkCandidate,\n attempts: readonly MemoryAdapterBenchmarkAttemptEvent[],\n generations: ReadonlyMap<string, number>,\n): string {\n return stableId(\n 'memory_benchmark_recovery_cost_call',\n canonicalJson({\n candidateId: candidate.id,\n candidateRef: candidate.ref,\n adapterCreationCostUsd: candidate.adapterCreationCostUsd ?? 0,\n recoveryCostUsdPerAttempt: candidate.recoveryCostUsdPerAttempt ?? 0,\n attempts: attempts\n .map((attempt) => ({\n attemptId: attempt.attemptId,\n generation: generations.get(attempt.attemptId),\n }))\n .sort((left, right) => left.attemptId.localeCompare(right.attemptId)),\n }),\n )\n}\n\nfunction memoryBenchmarkRecoveryCostTags(\n runDir: string,\n candidateId: string,\n): Record<string, string> {\n return {\n runDir: join(runDir, candidateId),\n candidateId,\n memoryRecovery: 'benchmark',\n }\n}\n\nexport function appendMemoryBenchmarkAttemptEvent(\n storage: CampaignStorage,\n path: string,\n event: MemoryAdapterBenchmarkAttemptEvent,\n): void {\n appendAttemptJournalEvent({\n storage,\n path,\n event,\n label: 'memory benchmark attempt log',\n })\n}\n\nfunction readActiveMemoryBenchmarkAttempts(\n storage: CampaignStorage,\n path: string,\n): MemoryAdapterBenchmarkAttemptEvent[] {\n return readActiveAttemptJournal({\n storage,\n path,\n label: 'memory benchmark attempt log',\n parse: parseMemoryBenchmarkAttemptEvent,\n id: (event) => event.attemptId,\n sameAttempt: sameMemoryBenchmarkAttempt,\n })\n}\n\nfunction parseMemoryBenchmarkAttemptEvent(\n value: unknown,\n path: string,\n line: number,\n): MemoryAdapterBenchmarkAttemptEvent {\n const event = value as Partial<MemoryAdapterBenchmarkAttemptEvent> | null\n const valid =\n typeof event === 'object' &&\n event !== null &&\n event.schema === 3 &&\n (event.status === 'started' || event.status === 'cleaned') &&\n isNonEmptyString(event.attemptId) &&\n isNonEmptyString(event.candidateId) &&\n isNonEmptyString(event.candidateRef) &&\n isNonEmptyString(event.adapterId) &&\n isNonEmptyString(event.caseId) &&\n isNonEmptyString(event.cellId) &&\n isAgentMemoryScope(event.scope) &&\n typeof event.adapterCreationCostUsd === 'number' &&\n Number.isFinite(event.adapterCreationCostUsd) &&\n event.adapterCreationCostUsd >= 0 &&\n typeof event.costUsdPerCase === 'number' &&\n Number.isFinite(event.costUsdPerCase) &&\n event.costUsdPerCase >= 0 &&\n typeof event.recoveryCostUsdPerAttempt === 'number' &&\n Number.isFinite(event.recoveryCostUsdPerAttempt) &&\n event.recoveryCostUsdPerAttempt >= 0 &&\n typeof event.recordedAt === 'string' &&\n !Number.isNaN(Date.parse(event.recordedAt)) &&\n typeof event.recovery === 'boolean'\n if (!valid) {\n throw new Error(`invalid memory benchmark attempt event in '${path}' line ${line}`)\n }\n return value as MemoryAdapterBenchmarkAttemptEvent\n}\n\nfunction sameMemoryBenchmarkAttempt(\n left: MemoryAdapterBenchmarkAttemptEvent,\n right: MemoryAdapterBenchmarkAttemptEvent,\n): boolean {\n return (\n left.attemptId === right.attemptId &&\n left.candidateId === right.candidateId &&\n left.candidateRef === right.candidateRef &&\n left.adapterId === right.adapterId &&\n left.caseId === right.caseId &&\n left.cellId === right.cellId &&\n canonicalJson(left.scope) === canonicalJson(right.scope) &&\n left.adapterCreationCostUsd === right.adapterCreationCostUsd &&\n left.costUsdPerCase === right.costUsdPerCase &&\n left.recoveryCostUsdPerAttempt === right.recoveryCostUsdPerAttempt\n )\n}\n\nfunction assertMemoryBenchmarkAttemptCandidateMatches(\n attempt: MemoryAdapterBenchmarkAttemptEvent,\n candidate: MemoryAdapterBenchmarkCandidate,\n): void {\n if (attempt.candidateRef !== candidate.ref) {\n throw new Error(\n `cannot recover memory benchmark attempt '${attempt.attemptId}': candidate ref changed from '${attempt.candidateRef}' to '${candidate.ref}'`,\n )\n }\n const expectedAdapterId = memoryAdapterBenchmarkExpectedId(candidate)\n if (attempt.adapterId !== expectedAdapterId) {\n throw new Error(\n `cannot recover memory benchmark attempt '${attempt.attemptId}': adapter id changed from '${attempt.adapterId}' to '${expectedAdapterId}'`,\n )\n }\n const executionCost = candidate.costUsdPerCase ?? 0\n const adapterCreationCost = candidate.adapterCreationCostUsd ?? 0\n const recoveryCost = candidate.recoveryCostUsdPerAttempt ?? 0\n if (\n adapterCreationCost !== attempt.adapterCreationCostUsd ||\n executionCost !== attempt.costUsdPerCase ||\n recoveryCost !== attempt.recoveryCostUsdPerAttempt\n ) {\n throw new Error(\n `cannot recover memory benchmark attempt '${attempt.attemptId}': candidate cost settings changed; start a new run or restore the recorded costs`,\n )\n }\n}\n\nexport function assertScopedMemoryBenchmarkAdapter(adapter: AgentMemoryAdapter): void {\n if (adapter.branchIsolation?.mode !== 'scoped') {\n throw new Error(\n `${adapter.id}: direct memory benchmark requires branchIsolation mode scoped; use runAgentMemoryExperiment for dedicated instances`,\n )\n }\n if (!adapter.clear) {\n throw new Error(`${adapter.id}: direct memory benchmark requires exact scoped clear`)\n }\n}\n\nfunction isAgentMemoryScope(value: unknown): value is AgentMemoryScope {\n if (!isRecordValue(value)) return false\n const allowed = new Set([\n 'tenantId',\n 'userId',\n 'agentId',\n 'teamId',\n 'runId',\n 'sessionId',\n 'namespace',\n 'tags',\n ])\n if (Object.keys(value).some((key) => !allowed.has(key))) return false\n for (const key of [\n 'tenantId',\n 'userId',\n 'agentId',\n 'teamId',\n 'runId',\n 'sessionId',\n 'namespace',\n ]) {\n if (value[key] !== undefined && typeof value[key] !== 'string') return false\n }\n if (value.tags === undefined) return true\n return (\n isRecordValue(value.tags) &&\n Object.values(value.tags).every((entry) => typeof entry === 'string')\n )\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === 'string' && value.trim().length > 0\n}\n\nfunction isRecordValue(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nexport interface MemoryAdapterBenchmarkAttemptEvent {\n schema: 3\n status: 'started' | 'cleaned'\n attemptId: string\n candidateId: string\n candidateRef: string\n adapterId: string\n caseId: string\n cellId: string\n scope: AgentMemoryScope\n adapterCreationCostUsd: number\n costUsdPerCase: number\n recoveryCostUsdPerAttempt: number\n recordedAt: string\n recovery: boolean\n}\n","import { randomUUID } from 'node:crypto'\nimport type { CampaignStorage } from '@tangle-network/agent-eval/campaign'\nimport { runBoundedMemoryLifecycle } from '../memory/lifecycle'\nimport type { OwnedAgentMemoryRunLease } from '../memory/run-control'\nimport type { AgentMemoryAdapter, AgentMemoryScope } from '../memory/types'\nimport { memoryActorId, memoryEventId } from './adapters'\nimport {\n appendMemoryBenchmarkAttemptEvent,\n assertScopedMemoryBenchmarkAdapter,\n type MemoryAdapterBenchmarkAttemptEvent,\n memoryBenchmarkCostCallId,\n} from './memory-recovery'\nimport type {\n KnowledgeBenchmarkArtifact,\n KnowledgeBenchmarkResponder,\n KnowledgeMemoryBenchmarkCase,\n} from './types'\nimport { compactObject, unique } from './utils'\nimport { isKnowledgeMemoryBenchmarkCase } from './validation'\n\nexport function createMemoryAdapterBenchmarkResponder(options: {\n adapter: AgentMemoryAdapter\n candidateId: string\n candidateRef: string\n storage: CampaignStorage\n attemptLogPath: string\n lease: OwnedAgentMemoryRunLease\n cleanupTimeoutMs: number\n searchLimit?: number\n scope?: AgentMemoryScope\n costUsdPerCase?: number\n adapterCreationCostUsd?: number\n recoveryCostUsdPerAttempt?: number\n now?: () => Date\n}): KnowledgeBenchmarkResponder<KnowledgeBenchmarkArtifact> {\n assertScopedMemoryBenchmarkAdapter(options.adapter)\n return async ({ case: testCase, context: dispatchContext }) => {\n if (!isKnowledgeMemoryBenchmarkCase(testCase)) {\n return { answer: '', metadata: { candidateId: options.candidateId, skipped: true } }\n }\n const costUsd = options.costUsdPerCase ?? 0\n if (!Number.isFinite(costUsd) || costUsd < 0) {\n throw new Error(`memory adapter costUsdPerCase must be non-negative finite, got ${costUsd}`)\n }\n\n dispatchContext.signal.throwIfAborted()\n await options.lease.assertOwned()\n const startedAt = Date.now()\n const attemptId = randomUUID()\n const scope = benchmarkMemoryScope(\n options.candidateId,\n testCase,\n dispatchContext.cellId,\n attemptId,\n options.scope,\n )\n const attempt: MemoryAdapterBenchmarkAttemptEvent = {\n schema: 3,\n status: 'started',\n attemptId,\n candidateId: options.candidateId,\n candidateRef: options.candidateRef,\n adapterId: options.adapter.id,\n caseId: testCase.id,\n cellId: dispatchContext.cellId,\n scope,\n adapterCreationCostUsd: options.adapterCreationCostUsd ?? 0,\n costUsdPerCase: costUsd,\n recoveryCostUsdPerAttempt: options.recoveryCostUsdPerAttempt ?? 0,\n recordedAt: (options.now ?? (() => new Date()))().toISOString(),\n recovery: false,\n }\n appendMemoryBenchmarkAttemptEvent(options.storage, options.attemptLogPath, attempt)\n\n let externalCallAttempted = false\n const appendCleanedAttempt = (priorError?: unknown): void => {\n try {\n appendMemoryBenchmarkAttemptEvent(options.storage, options.attemptLogPath, {\n ...attempt,\n status: 'cleaned',\n recordedAt: (options.now ?? (() => new Date()))().toISOString(),\n })\n } catch (error) {\n throw new MemoryAdapterBenchmarkCleanupError(\n [...(priorError ? [priorError] : []), error],\n `${options.candidateId}: memory benchmark cleanup could not be recorded`,\n )\n }\n }\n const execute = async (): Promise<KnowledgeBenchmarkArtifact> => {\n dispatchContext.signal.throwIfAborted()\n await options.lease.assertOwned()\n let artifact: KnowledgeBenchmarkArtifact | undefined\n let primaryError: unknown\n try {\n for (const event of testCase.events) {\n dispatchContext.signal.throwIfAborted()\n await options.lease.assertOwned()\n externalCallAttempted = true\n await options.adapter.write({\n id: event.id,\n kind: 'message',\n text: event.text,\n role: event.actorId === 'user' ? 'user' : 'assistant',\n title: `${testCase.id}:${event.id}`,\n scope,\n metadata: compactObject({\n benchmarkCaseId: testCase.id,\n benchmarkCellId: dispatchContext.cellId,\n benchmarkAttemptId: attemptId,\n eventId: event.id,\n actorId: event.actorId,\n sessionId: event.sessionId,\n timestamp: event.timestamp,\n ...event.metadata,\n }) as Record<string, unknown>,\n })\n dispatchContext.signal.throwIfAborted()\n await options.lease.assertOwned()\n }\n externalCallAttempted = true\n await options.adapter.flush?.()\n dispatchContext.signal.throwIfAborted()\n await options.lease.assertOwned()\n\n externalCallAttempted = true\n const adapterContext = await options.adapter.getContext(testCase.prompt, {\n scope,\n limit: options.searchLimit ?? 1,\n metadata: {\n benchmarkCaseId: testCase.id,\n benchmarkCellId: dispatchContext.cellId,\n benchmarkAttemptId: attemptId,\n candidateId: options.candidateId,\n },\n })\n dispatchContext.signal.throwIfAborted()\n await options.lease.assertOwned()\n const hits = adapterContext.hits\n artifact = {\n answer: adapterContext.text,\n rememberedFacts: hits.map((hit) => hit.text),\n citedEventIds: unique(hits.map(memoryEventId).filter((id): id is string => Boolean(id))),\n usedMemoryIds: hits.map((hit) => hit.id),\n actorIds: unique(hits.map(memoryActorId).filter((id): id is string => Boolean(id))),\n costUsd,\n durationMs: Math.max(0, Date.now() - startedAt),\n metadata: {\n candidateId: options.candidateId,\n adapterId: options.adapter.id,\n hitCount: hits.length,\n },\n }\n } catch (error) {\n primaryError = error\n }\n\n const cleanupErrors: unknown[] = []\n let cleanupOwned = true\n try {\n await options.lease.assertOwned()\n } catch (error) {\n cleanupOwned = false\n cleanupErrors.push(error)\n }\n if (cleanupOwned) {\n try {\n await runBoundedMemoryLifecycle({\n operation: `${options.candidateId}: benchmark attempt flush`,\n timeoutMs: options.cleanupTimeoutMs,\n resource: options.adapter,\n run: () => {\n externalCallAttempted = true\n return options.adapter.flush?.()\n },\n })\n } catch (error) {\n cleanupErrors.push(error)\n }\n try {\n await runBoundedMemoryLifecycle({\n operation: `${options.candidateId}: benchmark attempt cleanup`,\n timeoutMs: options.cleanupTimeoutMs,\n resource: options.adapter,\n run: () => {\n externalCallAttempted = true\n return options.adapter.clear!(scope)\n },\n })\n } catch (error) {\n cleanupErrors.push(error)\n }\n }\n if (cleanupOwned && cleanupErrors.length === 0) appendCleanedAttempt(primaryError)\n if (cleanupErrors.length > 0) {\n const errors = [...(primaryError ? [primaryError] : []), ...cleanupErrors]\n throw new MemoryAdapterBenchmarkCleanupError(\n errors,\n `${options.candidateId}: memory benchmark attempt cleanup failed`,\n )\n }\n if (primaryError) throw primaryError\n if (!artifact)\n throw new Error(`${options.candidateId}: memory benchmark produced no artifact`)\n return artifact\n }\n\n if (costUsd === 0) {\n let artifact: KnowledgeBenchmarkArtifact | undefined\n let error: unknown\n try {\n artifact = await execute()\n } catch (caught) {\n error = caught\n }\n if (error) throw error\n if (!artifact)\n throw new Error(`${options.candidateId}: memory benchmark produced no artifact`)\n return artifact\n }\n const receipt = {\n model: options.adapter.id,\n inputTokens: 0,\n outputTokens: 0,\n actualCostUsd: costUsd,\n } as const\n const paid = await dispatchContext.cost.runPaidCall({\n callId: memoryBenchmarkCostCallId(attempt, 'execute', 0),\n actor: `agent-knowledge:memory-adapter:${options.adapter.id}`,\n model: options.adapter.id,\n maximumCharge: { externallyEnforcedMaximumUsd: costUsd },\n execute,\n receipt: () => receipt,\n receiptFromError: () => ({\n ...receipt,\n actualCostUsd: externalCallAttempted ? costUsd : 0,\n }),\n })\n if (!paid.succeeded) throw paid.error\n return paid.value\n }\n}\n\nexport class MemoryAdapterBenchmarkCleanupError extends AggregateError {}\n\nfunction benchmarkMemoryScope(\n candidateId: string,\n testCase: KnowledgeMemoryBenchmarkCase,\n cellId: string,\n attemptId: string,\n scope: AgentMemoryScope = {},\n): AgentMemoryScope {\n return {\n ...scope,\n namespace: `${scope.namespace ?? 'agent-knowledge-memory-benchmark'}:${attemptId}`,\n tags: {\n ...(scope.tags ?? {}),\n benchmarkCandidateId: candidateId,\n benchmarkCaseId: testCase.id,\n benchmarkCellId: cellId,\n benchmarkAttemptId: attemptId,\n },\n }\n}\n","import { join } from 'node:path'\n\nimport { canonicalJson } from '@tangle-network/agent-eval'\n\nimport {\n fsCampaignStorage,\n type JudgeConfig,\n type RunCampaignOptions,\n runCampaign,\n} from '@tangle-network/agent-eval/campaign'\n\nimport { stableId } from '../ids'\n\nimport { renderSliceTable, summarizeKnowledgeBenchmarkCampaign } from './metrics'\n\nimport { scoreKnowledgeBenchmarkArtifact } from './scoring'\n\nimport type {\n KnowledgeBenchmarkArtifact,\n KnowledgeBenchmarkCase,\n KnowledgeBenchmarkReport,\n KnowledgeBenchmarkScenario,\n KnowledgeBenchmarkSplit,\n RunKnowledgeBenchmarkSuiteOptions,\n RunKnowledgeBenchmarkSuiteResult,\n} from './types'\n\nimport { compactObject, formatNumber, unique } from './utils'\n\nimport { assertKnowledgeBenchmarkCases, assertNonEmptyBenchmarkString } from './validation'\n\nconst KNOWLEDGE_BENCHMARK_IMPLEMENTATION_REF = 'agent-knowledge:benchmark-suite:v2'\n\nexport async function runKnowledgeBenchmarkSuite<TArtifact = KnowledgeBenchmarkArtifact>(\n options: RunKnowledgeBenchmarkSuiteOptions<TArtifact>,\n): Promise<RunKnowledgeBenchmarkSuiteResult<TArtifact>> {\n assertKnowledgeBenchmarkCases(options.cases)\n if (options.respondRef !== undefined) {\n assertNonEmptyBenchmarkString(options.respondRef, 'knowledge benchmark respondRef')\n } else if (options.resumable !== false) {\n throw new Error('knowledge benchmark respondRef is required when resumable is enabled')\n }\n const storage = options.storage ?? fsCampaignStorage()\n const costCeiling = options.costCeiling ?? options.costLedger?.costCeilingUsd ?? 0\n if (options.costLedger && options.costLedger.costCeilingUsd !== costCeiling) {\n throw new Error('knowledge benchmark costCeiling must match the shared cost ledger ceiling')\n }\n const scenarios = buildKnowledgeBenchmarkScenarios(options.cases, options.splits)\n const dispatch: RunCampaignOptions<KnowledgeBenchmarkScenario, TArtifact>['dispatch'] = async (\n scenario,\n context,\n ) => {\n const artifact = await options.respond({ case: scenario.case, scenario, context })\n return artifact\n }\n const campaign = await runCampaign<KnowledgeBenchmarkScenario, TArtifact>({\n scenarios,\n dispatch,\n dispatchRef: stableId(\n 'knowledge_benchmark',\n canonicalJson({\n implementationRef: KNOWLEDGE_BENCHMARK_IMPLEMENTATION_REF,\n respondRef: options.respondRef ?? 'non-resumable',\n }),\n ),\n judges: [knowledgeBenchmarkJudge<TArtifact>()],\n runDir: options.runDir,\n repo: options.repo,\n seed: options.seed,\n reps: options.reps,\n resumable: options.resumable,\n costCeiling,\n costLedger: options.costLedger,\n costPhase: options.costPhase,\n maxConcurrency: options.maxConcurrency,\n dispatchTimeoutMs: options.dispatchTimeoutMs,\n expectUsage: options.expectUsage ?? 'off',\n storage,\n now: options.now,\n })\n const report = summarizeKnowledgeBenchmarkCampaign({ scenarios, campaign })\n const reportJsonPath = join(campaign.runDir, 'knowledge-benchmark-report.json')\n const reportMarkdownPath = join(campaign.runDir, 'knowledge-benchmark-report.md')\n storage.write(reportJsonPath, `${JSON.stringify(report, null, 2)}\\n`)\n storage.write(reportMarkdownPath, renderKnowledgeBenchmarkReportMarkdown(report))\n return {\n scenarios,\n campaign,\n report,\n reportJsonPath,\n reportMarkdownPath,\n }\n}\n\nexport function renderKnowledgeBenchmarkReportMarkdown(report: KnowledgeBenchmarkReport): string {\n return [\n '# Knowledge Benchmark Report',\n '',\n `- cases: ${report.totalCases}`,\n `- cells: ${report.totalCells} total, ${report.cellsFailed} failed, ${report.cellsCached} cached`,\n `- cost: $${formatNumber(report.totalCostUsd)}`,\n `- score: mean ${formatNumber(report.score.mean)}, median ${formatNumber(report.score.median)}, p90 ${formatNumber(report.score.p90)}, n=${report.score.n}`,\n '',\n '## Task Kinds',\n '',\n renderSliceTable(report.byTaskKind),\n '',\n '## Splits',\n '',\n renderSliceTable(report.bySplit),\n '',\n '## Dimensions',\n '',\n '| dimension | n | mean | p90 |',\n '| --- | ---: | ---: | ---: |',\n ...Object.entries(report.dimensions)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(\n ([key, dist]) =>\n `| ${key} | ${dist.n} | ${formatNumber(dist.mean)} | ${formatNumber(dist.p90)} |`,\n ),\n '',\n ].join('\\n')\n}\n\nexport function buildKnowledgeBenchmarkScenarios(\n cases: readonly KnowledgeBenchmarkCase[],\n splits?: readonly KnowledgeBenchmarkSplit[],\n): KnowledgeBenchmarkScenario[] {\n const splitSet = splits ? new Set(splits) : null\n return cases.flatMap((testCase) => {\n const splitTag = testCase.split ?? 'dev'\n if (splitSet && !splitSet.has(splitTag)) return []\n return [\n compactObject({\n id: testCase.id,\n kind: 'knowledge-benchmark' as const,\n family: testCase.family,\n taskKind: testCase.taskKind,\n splitTag,\n tags: unique([splitTag, ...(testCase.tags ?? [])]),\n case: compactObject(testCase),\n }) as KnowledgeBenchmarkScenario,\n ]\n })\n}\n\nexport function knowledgeBenchmarkJudge<TArtifact = KnowledgeBenchmarkArtifact>(): JudgeConfig<\n TArtifact,\n KnowledgeBenchmarkScenario\n> {\n return {\n name: 'knowledge-benchmark',\n judgeVersion: 'agent-knowledge:knowledge-benchmark:v2',\n dimensions: [\n { key: 'score', description: 'primary knowledge benchmark score' },\n { key: 'passed', description: '1 when the benchmark case passes' },\n { key: 'claim_recall', description: 'required claim coverage' },\n { key: 'citation_recall', description: 'expected citation/source coverage' },\n { key: 'hallucination_safe', description: '1 when no forbidden claim appears' },\n { key: 'memory_fact_recall', description: 'current memory fact coverage' },\n { key: 'memory_event_recall', description: 'expected memory event/source coverage' },\n { key: 'memory_stale_safe', description: '1 when obsolete memory is not reused' },\n { key: 'memory_actor_recall', description: 'expected speaker/user attribution coverage' },\n ],\n appliesTo: (scenario) => scenario.kind === 'knowledge-benchmark',\n score({ artifact, scenario }) {\n const evaluation = scoreKnowledgeBenchmarkArtifact(scenario.case, artifact)\n return {\n dimensions: {\n score: evaluation.score,\n passed: evaluation.passed ? 1 : 0,\n ...evaluation.dimensions,\n },\n composite: evaluation.score,\n notes: evaluation.notes,\n }\n },\n }\n}\n","import type { CampaignResult } from '@tangle-network/agent-eval/campaign'\n\nimport type {\n KnowledgeBenchmarkDistribution,\n KnowledgeBenchmarkReport,\n KnowledgeBenchmarkScenario,\n KnowledgeBenchmarkSliceSummary,\n} from './types'\n\nimport { formatNumber, mean } from './utils'\n\nexport function summarizeKnowledgeBenchmarkCampaign<TArtifact>(input: {\n scenarios: readonly KnowledgeBenchmarkScenario[]\n campaign: CampaignResult<TArtifact, KnowledgeBenchmarkScenario>\n}): KnowledgeBenchmarkReport {\n const scenariosById = new Map(input.scenarios.map((scenario) => [scenario.id, scenario]))\n const rows = input.campaign.cells.map((cell) => {\n const score = Object.values(cell.judgeScores)[0]\n const scenario = scenariosById.get(cell.scenarioId)\n return {\n cell,\n scenario,\n composite: score?.composite ?? 0,\n passed: (score?.dimensions.passed ?? 0) >= 1,\n dimensions: score?.dimensions ?? {},\n }\n })\n const successful = rows.filter((row) => !row.cell.error)\n return {\n totalCases: input.scenarios.length,\n totalCells: input.campaign.cells.length,\n cellsFailed: input.campaign.aggregates.cellsFailed,\n cellsCached: input.campaign.aggregates.cellsCached,\n totalCostUsd: input.campaign.aggregates.totalCostUsd,\n bySplit: summarizeSlices(successful, (row) => row.scenario?.splitTag ?? 'unknown'),\n byFamily: summarizeSlices(successful, (row) => row.scenario?.family ?? 'unknown'),\n byTaskKind: summarizeSlices(successful, (row) => row.scenario?.taskKind ?? 'unknown'),\n dimensions: summarizeDimensions(successful.map((row) => row.dimensions)),\n score: distribution(successful.map((row) => row.composite)),\n }\n}\n\nfunction summarizeDimensions(\n rows: Array<Record<string, number>>,\n): Record<string, KnowledgeBenchmarkDistribution> {\n const values = new Map<string, number[]>()\n for (const row of rows) {\n for (const [key, value] of Object.entries(row)) {\n if (!Number.isFinite(value)) continue\n const list = values.get(key) ?? []\n list.push(value)\n values.set(key, list)\n }\n }\n return Object.fromEntries([...values.entries()].map(([key, vals]) => [key, distribution(vals)]))\n}\n\nfunction summarizeSlices<T>(\n rows: T[],\n keyOf: (row: T) => string,\n): Record<string, KnowledgeBenchmarkSliceSummary> {\n const grouped = new Map<string, T[]>()\n for (const row of rows) {\n const key = keyOf(row)\n const list = grouped.get(key) ?? []\n list.push(row)\n grouped.set(key, list)\n }\n return Object.fromEntries(\n [...grouped.entries()].map(([key, list]) => {\n const withShape = list as Array<{ composite: number; passed: boolean }>\n return [\n key,\n {\n n: list.length,\n meanScore: mean(withShape.map((row) => row.composite)),\n passRate: mean(withShape.map((row) => (row.passed ? 1 : 0))),\n score: distribution(withShape.map((row) => row.composite)),\n },\n ]\n }),\n )\n}\n\nfunction distribution(values: readonly number[]): KnowledgeBenchmarkDistribution {\n const finite = [...values].filter(Number.isFinite).sort((a, b) => a - b)\n if (finite.length === 0) return { n: 0, min: 0, mean: 0, median: 0, p90: 0, max: 0 }\n return {\n n: finite.length,\n min: finite[0]!,\n mean: mean(finite),\n median: percentile(finite, 0.5),\n p90: percentile(finite, 0.9),\n max: finite[finite.length - 1]!,\n }\n}\n\nfunction percentile(sortedValues: readonly number[], p: number): number {\n if (sortedValues.length === 0) return 0\n const index = Math.min(\n sortedValues.length - 1,\n Math.max(0, Math.ceil(p * sortedValues.length) - 1),\n )\n return sortedValues[index]!\n}\n\nexport function renderSliceTable(slices: Record<string, KnowledgeBenchmarkSliceSummary>): string {\n const rows = Object.entries(slices).map(\n ([key, slice]) =>\n `| ${key} | ${slice.n} | ${formatNumber(slice.meanScore)} | ${formatNumber(slice.passRate)} | ${formatNumber(slice.score.p90)} |`,\n )\n return [\n '| slice | n | mean score | pass rate | score p90 |',\n '| --- | ---: | ---: | ---: | ---: |',\n ...(rows.length ? rows : ['| none | 0 | 0 | 0 | 0 |']),\n ].join('\\n')\n}\n","import {\n type DispatchContext,\n type Gate,\n type GenerationRecord,\n heldOutGate,\n type JsonValue,\n type JudgeConfig,\n type MutableSurface,\n type ParameterCandidate,\n parameterSweepProposer,\n type RunImprovementLoopOptions,\n type RunImprovementLoopResult,\n runImprovementLoop,\n type Scenario,\n type SurfaceProposer,\n} from '@tangle-network/agent-eval/campaign'\nimport { searchKnowledge } from './search'\nimport type { KnowledgeIndex, KnowledgeSearchResult } from './types'\n\nexport type RetrievalConfig = Record<string, JsonValue>\nexport type RetrievalParameterSearchSpace = Record<string, readonly JsonValue[]>\n\nexport type RetrievalGoldTarget =\n | { kind: 'page'; pageId: string }\n | { kind: 'page-path'; path: string }\n | { kind: 'source'; sourceId: string }\n | { kind: 'source-anchor'; sourceId: string; anchorId: string }\n | { kind: 'source-span'; sourceId: string; charStart: number; charEnd: number }\n\nexport interface RetrievalEvalScenario extends Scenario {\n kind: 'retrieval-eval'\n query: string\n expected: RetrievalGoldTarget | readonly RetrievalGoldTarget[]\n k?: number\n}\n\nexport interface RetrievedSourceSpan {\n sourceId: string\n anchorId?: string\n charStart?: number\n charEnd?: number\n}\n\nexport interface RetrievedKnowledgeHit {\n pageId: string\n path: string\n title?: string\n rank: number\n score?: number\n normalizedScore?: number\n sourceIds?: readonly string[]\n sourceSpans?: readonly RetrievedSourceSpan[]\n snippet?: string\n metadata?: Record<string, JsonValue>\n}\n\nexport interface RetrievalEvalArtifact {\n config: RetrievalConfig\n query: string\n requestedK: number\n hits: readonly RetrievedKnowledgeHit[]\n durationMs: number\n /** Informational copy. Billable retrievers account through context.cost.runPaidCall. */\n costUsd?: number\n metadata?: Record<string, JsonValue>\n}\n\nexport interface RetrievalMetricSummary {\n recall: number\n mrr: number\n ndcg: number\n precisionAtK: number\n expectedCount: number\n matchedCount: number\n relevantHitCount: number\n firstHitRank: number | null\n matchedTargetIds: readonly string[]\n}\n\nexport interface RetrievalEvalRetrieverInput {\n index?: KnowledgeIndex\n config: RetrievalConfig\n scenario: RetrievalEvalScenario\n k: number\n signal: AbortSignal\n context: DispatchContext\n}\n\nexport interface RetrievalEvalRetrieverResult {\n hits: readonly RetrievedKnowledgeHit[]\n /** Informational copy. Billable retrievers account through context.cost.runPaidCall. */\n costUsd?: number\n metadata?: Record<string, JsonValue>\n}\n\nexport type RetrievalEvalRetriever = (\n input: RetrievalEvalRetrieverInput,\n) => Promise<readonly RetrievedKnowledgeHit[] | RetrievalEvalRetrieverResult>\n\nexport interface BuildRetrievalEvalDispatchOptions {\n index?: KnowledgeIndex\n defaultK?: number\n retrieve?: RetrievalEvalRetriever\n}\n\nexport interface RetrievalMetricWeights {\n recall?: number\n mrr?: number\n ndcg?: number\n precisionAtK?: number\n}\n\nexport interface RetrievalRecallJudgeOptions {\n name?: string\n weights?: RetrievalMetricWeights\n}\n\nexport interface BuildRetrievalParameterCandidatesOptions {\n baseline?: RetrievalConfig\n}\n\nexport interface RetrievalParameterSweepProposerOptions {\n candidates?: readonly ParameterCandidate[]\n searchSpace?: RetrievalParameterSearchSpace\n baseline?: RetrievalConfig\n}\n\ntype RetrievalLoopBaseOptions = RunImprovementLoopOptions<\n RetrievalEvalScenario,\n RetrievalEvalArtifact\n>\n\nexport interface RunRetrievalImprovementLoopOptions {\n baseline: RetrievalConfig\n scenarios: readonly RetrievalEvalScenario[]\n holdoutScenarios?: readonly RetrievalEvalScenario[]\n index?: KnowledgeIndex\n defaultK?: number\n retrieve?: RetrievalEvalRetriever\n candidates?: readonly ParameterCandidate[]\n searchSpace?: RetrievalParameterSearchSpace\n judges?: readonly JudgeConfig<RetrievalEvalArtifact, RetrievalEvalScenario>[]\n gate?: Gate<RetrievalEvalArtifact, RetrievalEvalScenario>\n metricWeights?: RetrievalMetricWeights\n targetRecall?: number\n holdoutFraction?: number\n splitSeed?: number\n deltaThreshold?: number\n runDir?: RetrievalLoopBaseOptions['runDir']\n seed?: RetrievalLoopBaseOptions['seed']\n reps?: RetrievalLoopBaseOptions['reps']\n resumable?: RetrievalLoopBaseOptions['resumable']\n costCeiling?: RetrievalLoopBaseOptions['costCeiling']\n maxConcurrency?: RetrievalLoopBaseOptions['maxConcurrency']\n dispatchTimeoutMs?: RetrievalLoopBaseOptions['dispatchTimeoutMs']\n expectUsage?: RetrievalLoopBaseOptions['expectUsage']\n tracing?: RetrievalLoopBaseOptions['tracing']\n storage?: RetrievalLoopBaseOptions['storage']\n populationSize?: RetrievalLoopBaseOptions['populationSize']\n maxGenerations?: RetrievalLoopBaseOptions['maxGenerations']\n promoteTopK?: RetrievalLoopBaseOptions['promoteTopK']\n maxImprovementShots?: RetrievalLoopBaseOptions['maxImprovementShots']\n report?: RetrievalLoopBaseOptions['report']\n findings?: RetrievalLoopBaseOptions['findings']\n now?: RetrievalLoopBaseOptions['now']\n}\n\nexport interface RunRetrievalImprovementLoopResult\n extends RunImprovementLoopResult<RetrievalEvalArtifact, RetrievalEvalScenario> {\n baselineConfig: RetrievalConfig\n winnerConfig: RetrievalConfig\n trainScenarios: readonly RetrievalEvalScenario[]\n holdoutScenarios: readonly RetrievalEvalScenario[]\n candidates: readonly ParameterCandidate[]\n targetRecall?: number\n}\n\nexport function retrievalConfigSurface(config: RetrievalConfig): string {\n return canonicalJson(config)\n}\n\nexport function retrievalConfigFromSurface(surface: MutableSurface): RetrievalConfig {\n if (typeof surface !== 'string') {\n throw new Error(\n `retrievalConfigFromSurface expected a JSON string surface, got ${typeof surface}`,\n )\n }\n let parsed: unknown\n try {\n parsed = JSON.parse(surface)\n } catch (error) {\n throw new Error(`retrievalConfigFromSurface could not parse JSON: ${(error as Error).message}`)\n }\n if (!isJsonObject(parsed)) {\n throw new Error('retrievalConfigFromSurface expected a JSON object')\n }\n return parsed\n}\n\nexport function buildRetrievalEvalDispatch(options: BuildRetrievalEvalDispatchOptions) {\n if (!options.retrieve && !options.index) {\n throw new Error('buildRetrievalEvalDispatch requires either index or retrieve')\n }\n const defaultK = options.defaultK ?? 5\n const retrieve = options.retrieve ?? defaultSearchRetriever\n\n return async (\n surface: MutableSurface,\n scenario: RetrievalEvalScenario,\n context: DispatchContext,\n ): Promise<RetrievalEvalArtifact> => {\n const config = retrievalConfigFromSurface(surface)\n const k = retrievalK(config, scenario, defaultK)\n const startedAt = Date.now()\n const result = await retrieve({\n index: options.index,\n config,\n scenario,\n k,\n signal: context.signal,\n context,\n })\n const normalized = normalizeRetrieverResult(result)\n return {\n config,\n query: scenario.query,\n requestedK: k,\n hits: normalized.hits,\n durationMs: Date.now() - startedAt,\n costUsd: normalized.costUsd,\n metadata: normalized.metadata,\n }\n }\n}\n\nexport function retrievalRecallJudge(\n options: RetrievalRecallJudgeOptions = {},\n): JudgeConfig<RetrievalEvalArtifact, RetrievalEvalScenario> {\n const weights = normalizeWeights(options.weights ?? { recall: 1 })\n return {\n name: options.name ?? 'retrieval-recall',\n dimensions: [\n { key: 'recall', description: 'fraction of expected knowledge targets retrieved' },\n { key: 'mrr', description: 'reciprocal rank of the first matching hit' },\n { key: 'ndcg', description: 'rank-aware gain for newly matched targets' },\n {\n key: 'precision_at_k',\n description: 'share of returned hits that match at least one target',\n },\n ],\n appliesTo: (scenario) => scenario.kind === 'retrieval-eval',\n async score({ artifact, scenario }) {\n const metrics = scoreRetrievalArtifact(artifact, scenario)\n const composite =\n (metrics.recall * weights.recall +\n metrics.mrr * weights.mrr +\n metrics.ndcg * weights.ndcg +\n metrics.precisionAtK * weights.precisionAtK) /\n (weights.recall + weights.mrr + weights.ndcg + weights.precisionAtK)\n return {\n dimensions: {\n recall: metrics.recall,\n mrr: metrics.mrr,\n ndcg: metrics.ndcg,\n precision_at_k: metrics.precisionAtK,\n },\n composite,\n notes: `matched ${metrics.matchedCount}/${metrics.expectedCount}; first_hit_rank=${metrics.firstHitRank ?? 'none'}`,\n }\n },\n }\n}\n\nexport function scoreRetrievalArtifact(\n artifact: RetrievalEvalArtifact,\n scenario: RetrievalEvalScenario,\n): RetrievalMetricSummary {\n const targets = normalizeTargets(scenario.expected)\n if (targets.length === 0) {\n throw new Error(`retrieval eval scenario ${scenario.id} has no expected targets`)\n }\n\n const matchedTargetIds = new Set<string>()\n let firstHitRank: number | null = null\n let relevantHitCount = 0\n let dcg = 0\n\n for (const hit of artifact.hits) {\n const newlyMatched = targets.filter((target) => {\n const targetId = retrievalTargetId(target)\n return !matchedTargetIds.has(targetId) && hitMatchesTarget(hit, target)\n })\n\n if (newlyMatched.length === 0) {\n continue\n }\n\n relevantHitCount += 1\n if (firstHitRank === null) {\n firstHitRank = hit.rank\n }\n dcg += 1 / Math.log2(hit.rank + 1)\n for (const target of newlyMatched) {\n matchedTargetIds.add(retrievalTargetId(target))\n }\n }\n\n const expectedCount = targets.length\n const matchedCount = matchedTargetIds.size\n const idealRankCount = Math.min(expectedCount, Math.max(1, artifact.requestedK))\n const idcg = idealDcg(idealRankCount)\n return {\n recall: matchedCount / expectedCount,\n mrr: firstHitRank === null ? 0 : 1 / firstHitRank,\n ndcg: idcg === 0 ? 0 : dcg / idcg,\n precisionAtK: artifact.hits.length === 0 ? 0 : relevantHitCount / artifact.hits.length,\n expectedCount,\n matchedCount,\n relevantHitCount,\n firstHitRank,\n matchedTargetIds: [...matchedTargetIds].sort(),\n }\n}\n\nexport function buildRetrievalParameterCandidates(\n searchSpace: RetrievalParameterSearchSpace,\n options: BuildRetrievalParameterCandidatesOptions = {},\n): ParameterCandidate[] {\n const candidates: ParameterCandidate[] = []\n for (const [path, values] of Object.entries(searchSpace).sort(([a], [b]) => a.localeCompare(b))) {\n for (const value of values) {\n if (\n options.baseline &&\n canonicalJson(getConfigPath(options.baseline, path)) === canonicalJson(value)\n ) {\n continue\n }\n candidates.push({\n label: `${path}=${formatCandidateValue(value)}`,\n rationale: `Set retrieval config ${path} to ${formatCandidateValue(value)}`,\n changes: [{ path, value }],\n })\n }\n }\n return candidates\n}\n\nexport function retrievalParameterSweepProposer(\n options: RetrievalParameterSweepProposerOptions,\n): SurfaceProposer {\n const candidates =\n options.candidates ??\n (options.searchSpace\n ? buildRetrievalParameterCandidates(options.searchSpace, { baseline: options.baseline })\n : [])\n\n if (candidates.length === 0) {\n throw new Error('retrievalParameterSweepProposer requires at least one candidate')\n }\n\n return parameterSweepProposer({ candidates })\n}\n\nexport async function runRetrievalImprovementLoop(\n options: RunRetrievalImprovementLoopOptions,\n): Promise<RunRetrievalImprovementLoopResult> {\n const split = splitRetrievalScenarios(options)\n const candidates = resolveRetrievalCandidates(options)\n const populationSize = options.populationSize ?? Math.max(1, Math.min(4, candidates.length))\n const maxGenerations =\n options.maxGenerations ?? Math.max(1, Math.ceil(candidates.length / populationSize))\n const proposer = withTargetRecallStop(\n retrievalParameterSweepProposer({ candidates }),\n options.targetRecall,\n )\n const gate =\n options.gate ??\n heldOutGate<RetrievalEvalArtifact, RetrievalEvalScenario>({\n scenarios: split.holdoutScenarios,\n deltaThreshold: options.deltaThreshold ?? 0.02,\n })\n const result = await runImprovementLoop<RetrievalEvalScenario, RetrievalEvalArtifact>({\n baselineSurface: retrievalConfigSurface(options.baseline),\n scenarios: split.trainScenarios,\n holdoutScenarios: split.holdoutScenarios,\n dispatchWithSurface: buildRetrievalEvalDispatch({\n index: options.index,\n defaultK: options.defaultK,\n retrieve: options.retrieve,\n }),\n judges: [...(options.judges ?? [retrievalRecallJudge({ weights: options.metricWeights })])],\n proposer,\n gate,\n autoOnPromote: 'none',\n runDir: options.runDir ?? '.agent-knowledge/retrieval-improvement',\n seed: options.seed,\n reps: options.reps,\n resumable: options.resumable,\n costCeiling: options.costCeiling,\n maxConcurrency: options.maxConcurrency,\n dispatchTimeoutMs: options.dispatchTimeoutMs,\n expectUsage: options.expectUsage ?? 'off',\n tracing: options.tracing,\n storage: options.storage,\n populationSize,\n maxGenerations,\n promoteTopK: options.promoteTopK,\n maxImprovementShots: options.maxImprovementShots,\n report: options.report,\n findings: options.findings,\n now: options.now,\n })\n\n return {\n ...result,\n baselineConfig: options.baseline,\n winnerConfig: retrievalConfigFromSurface(result.winnerSurface),\n trainScenarios: split.trainScenarios,\n holdoutScenarios: split.holdoutScenarios,\n candidates,\n targetRecall: options.targetRecall,\n }\n}\n\nfunction splitRetrievalScenarios(options: RunRetrievalImprovementLoopOptions): {\n trainScenarios: RetrievalEvalScenario[]\n holdoutScenarios: RetrievalEvalScenario[]\n} {\n const scenarios = [...options.scenarios]\n if (scenarios.length === 0) {\n throw new Error('runRetrievalImprovementLoop requires at least one training scenario')\n }\n if (options.holdoutScenarios) {\n const holdoutScenarios = [...options.holdoutScenarios]\n if (holdoutScenarios.length === 0) {\n throw new Error('runRetrievalImprovementLoop holdoutScenarios must not be empty')\n }\n return { trainScenarios: scenarios, holdoutScenarios }\n }\n\n if (scenarios.length < 2) {\n throw new Error(\n 'runRetrievalImprovementLoop requires at least 2 scenarios when holdoutScenarios are not provided',\n )\n }\n const holdoutFraction = options.holdoutFraction ?? 0.3\n if (!Number.isFinite(holdoutFraction) || holdoutFraction <= 0 || holdoutFraction >= 1) {\n throw new Error(\n `runRetrievalImprovementLoop holdoutFraction must be > 0 and < 1, got ${String(holdoutFraction)}`,\n )\n }\n const shuffled = seededShuffle(scenarios, options.splitSeed ?? options.seed ?? 42)\n const holdoutCount = Math.min(\n shuffled.length - 1,\n Math.max(1, Math.round(shuffled.length * holdoutFraction)),\n )\n const splitIndex = shuffled.length - holdoutCount\n return {\n trainScenarios: shuffled.slice(0, splitIndex),\n holdoutScenarios: shuffled.slice(splitIndex),\n }\n}\n\nfunction resolveRetrievalCandidates(\n options: RunRetrievalImprovementLoopOptions,\n): ParameterCandidate[] {\n const candidates = options.candidates\n ? [...options.candidates]\n : options.searchSpace\n ? buildRetrievalParameterCandidates(options.searchSpace, { baseline: options.baseline })\n : []\n\n if (candidates.length === 0) {\n throw new Error('runRetrievalImprovementLoop requires candidates or searchSpace')\n }\n return candidates\n}\n\nfunction withTargetRecallStop(\n proposer: SurfaceProposer,\n targetRecall: number | undefined,\n): SurfaceProposer {\n if (targetRecall === undefined) {\n return proposer\n }\n if (!Number.isFinite(targetRecall) || targetRecall < 0 || targetRecall > 1) {\n throw new Error(`targetRecall must be between 0 and 1, got ${String(targetRecall)}`)\n }\n return {\n kind: `${proposer.kind}:target-recall`,\n propose: (context) => proposer.propose(context),\n decide(args) {\n const baseDecision = proposer.decide?.(args)\n if (baseDecision?.stop) {\n return baseDecision\n }\n const bestRecall = bestObservedRecall(args.history)\n if (bestRecall >= targetRecall) {\n return {\n stop: true,\n reason: `target recall ${targetRecall} reached with train recall ${bestRecall}`,\n }\n }\n return { stop: false }\n },\n }\n}\n\nfunction bestObservedRecall(history: GenerationRecord[]): number {\n let best = Number.NEGATIVE_INFINITY\n for (const generation of history) {\n for (const candidate of generation.candidates) {\n const recall = candidate.dimensions.recall\n if (recall !== undefined && Number.isFinite(recall) && recall > best) {\n best = recall\n }\n }\n }\n return best\n}\n\nfunction retrievalK(\n config: RetrievalConfig,\n scenario: RetrievalEvalScenario,\n defaultK: number,\n): number {\n const rawK = config.k ?? config.topK ?? scenario.k ?? defaultK\n if (typeof rawK !== 'number' || !Number.isFinite(rawK) || rawK <= 0) {\n throw new Error(`retrieval k must be a positive number, got ${String(rawK)}`)\n }\n return Math.floor(rawK)\n}\n\nasync function defaultSearchRetriever(\n input: RetrievalEvalRetrieverInput,\n): Promise<RetrievalEvalRetrieverResult> {\n if (!input.index) {\n throw new Error('default retrieval eval search requires an index')\n }\n const results = searchKnowledge(input.index, input.scenario.query, input.k)\n return { hits: results.map(hitFromSearchResult) }\n}\n\nfunction hitFromSearchResult(result: KnowledgeSearchResult): RetrievedKnowledgeHit {\n return {\n pageId: result.page.id,\n path: result.page.path,\n title: result.page.title,\n rank: result.rank,\n score: result.score,\n normalizedScore: result.normalizedScore,\n sourceIds: result.page.sourceIds,\n snippet: result.snippet,\n }\n}\n\nfunction normalizeRetrieverResult(\n result: readonly RetrievedKnowledgeHit[] | RetrievalEvalRetrieverResult,\n): RetrievalEvalRetrieverResult {\n if (isHitArray(result)) {\n return { hits: result }\n }\n return result\n}\n\nfunction normalizeTargets(\n expected: RetrievalGoldTarget | readonly RetrievalGoldTarget[],\n): RetrievalGoldTarget[] {\n return isTargetArray(expected) ? [...expected] : [expected]\n}\n\nfunction isHitArray(\n result: readonly RetrievedKnowledgeHit[] | RetrievalEvalRetrieverResult,\n): result is readonly RetrievedKnowledgeHit[] {\n return Array.isArray(result)\n}\n\nfunction isTargetArray(\n expected: RetrievalGoldTarget | readonly RetrievalGoldTarget[],\n): expected is readonly RetrievalGoldTarget[] {\n return Array.isArray(expected)\n}\n\nfunction hitMatchesTarget(hit: RetrievedKnowledgeHit, target: RetrievalGoldTarget): boolean {\n switch (target.kind) {\n case 'page':\n return hit.pageId === target.pageId\n case 'page-path':\n return hit.path === target.path\n case 'source':\n return Boolean(hit.sourceIds?.includes(target.sourceId))\n case 'source-anchor':\n return Boolean(\n hit.sourceSpans?.some(\n (span) => span.sourceId === target.sourceId && span.anchorId === target.anchorId,\n ),\n )\n case 'source-span':\n return Boolean(\n hit.sourceSpans?.some(\n (span) => span.sourceId === target.sourceId && spanOverlaps(span, target),\n ),\n )\n }\n}\n\nfunction spanOverlaps(\n hit: RetrievedSourceSpan,\n target: Extract<RetrievalGoldTarget, { kind: 'source-span' }>,\n): boolean {\n if (typeof hit.charStart !== 'number' || typeof hit.charEnd !== 'number') {\n return false\n }\n return hit.charStart < target.charEnd && target.charStart < hit.charEnd\n}\n\nfunction retrievalTargetId(target: RetrievalGoldTarget): string {\n switch (target.kind) {\n case 'page':\n return `page:${target.pageId}`\n case 'page-path':\n return `page-path:${target.path}`\n case 'source':\n return `source:${target.sourceId}`\n case 'source-anchor':\n return `source-anchor:${target.sourceId}:${target.anchorId}`\n case 'source-span':\n return `source-span:${target.sourceId}:${target.charStart}:${target.charEnd}`\n }\n}\n\nfunction idealDcg(count: number): number {\n let score = 0\n for (let i = 1; i <= count; i += 1) {\n score += 1 / Math.log2(i + 1)\n }\n return score\n}\n\nfunction normalizeWeights(weights: RetrievalMetricWeights): Required<RetrievalMetricWeights> {\n const normalized = {\n recall: normalizeWeight(weights.recall),\n mrr: normalizeWeight(weights.mrr),\n ndcg: normalizeWeight(weights.ndcg),\n precisionAtK: normalizeWeight(weights.precisionAtK),\n }\n const total = normalized.recall + normalized.mrr + normalized.ndcg + normalized.precisionAtK\n if (total <= 0) {\n throw new Error('retrievalRecallJudge requires at least one positive metric weight')\n }\n return normalized\n}\n\nfunction normalizeWeight(value: number | undefined): number {\n if (value === undefined) {\n return 0\n }\n if (!Number.isFinite(value) || value < 0) {\n throw new Error(\n `retrievalRecallJudge metric weights must be non-negative finite numbers, got ${String(value)}`,\n )\n }\n return value\n}\n\nfunction getConfigPath(config: RetrievalConfig, path: string): JsonValue | undefined {\n let current: JsonValue | undefined = config\n for (const part of path.split('.')) {\n if (!isJsonObject(current)) {\n return undefined\n }\n current = current[part]\n }\n return current\n}\n\nfunction formatCandidateValue(value: JsonValue): string {\n if (typeof value === 'string') {\n return value\n }\n return canonicalJson(value)\n}\n\nfunction canonicalJson(value: JsonValue | undefined): string {\n if (value === undefined) {\n return 'undefined'\n }\n if (Array.isArray(value)) {\n return `[${value.map(canonicalJson).join(',')}]`\n }\n if (isJsonObject(value)) {\n const entries = Object.entries(value)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([key, child]) => `${JSON.stringify(key)}:${canonicalJson(child)}`)\n return `{${entries.join(',')}}`\n }\n return JSON.stringify(value)\n}\n\nfunction isJsonObject(value: unknown): value is Record<string, JsonValue> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction seededShuffle<T>(items: readonly T[], seed: number): T[] {\n const out = [...items]\n let state = seed >>> 0\n for (let i = out.length - 1; i > 0; i -= 1) {\n state = (state * 1664525 + 1013904223) >>> 0\n const j = state % (i + 1)\n ;[out[i], out[j]] = [out[j]!, out[i]!]\n }\n return out\n}\n","import {\n type RetrievalEvalArtifact,\n type RetrievalEvalScenario,\n scoreRetrievalArtifact,\n} from '../retrieval-eval'\n\nimport type {\n KnowledgeBenchmarkArtifact,\n KnowledgeBenchmarkCase,\n KnowledgeBenchmarkEvaluation,\n KnowledgeClaimMatcher,\n KnowledgeMemoryBenchmarkCase,\n KnowledgeRetrievalBenchmarkCase,\n} from './types'\n\nimport { mean, unique } from './utils'\n\nimport { isKnowledgeMemoryBenchmarkCase } from './validation'\n\nexport function scoreKnowledgeBenchmarkArtifact<TArtifact>(\n testCase: KnowledgeBenchmarkCase,\n artifact: TArtifact,\n): KnowledgeBenchmarkEvaluation {\n if (testCase.taskKind === 'retrieval') {\n const retrievalArtifact = normalizeRetrievalArtifact(testCase, artifact)\n const metrics = scoreRetrievalArtifact(retrievalArtifact, retrievalScenarioForCase(testCase))\n return {\n score: metrics.recall,\n passed: metrics.recall >= 1,\n dimensions: {\n recall: metrics.recall,\n mrr: metrics.mrr,\n ndcg: metrics.ndcg,\n precision_at_k: metrics.precisionAtK,\n expected_count: metrics.expectedCount,\n matched_count: metrics.matchedCount,\n },\n notes: `matched ${metrics.matchedCount}/${metrics.expectedCount}; first_hit_rank=${metrics.firstHitRank ?? 'none'}`,\n raw: { matchedTargetIds: metrics.matchedTargetIds },\n }\n }\n if (isKnowledgeMemoryBenchmarkCase(testCase)) {\n return scoreMemoryBenchmarkArtifact(testCase, artifact)\n }\n\n const answerArtifact = artifact as KnowledgeBenchmarkArtifact\n const text = answerArtifact.text ?? answerArtifact.answer ?? ''\n const required = scoreClaims(text, testCase.requiredClaims ?? [])\n const forbidden = scoreForbiddenClaims(text, testCase.forbiddenClaims ?? [])\n const citation = scoreCitationRecall(\n answerArtifact.citedSourceIds ?? [],\n testCase.expectedSourceIds ?? [],\n )\n const components = [\n required.totalWeight > 0 ? required.recall : undefined,\n testCase.expectedSourceIds && testCase.expectedSourceIds.length > 0 ? citation : undefined,\n forbidden.safe,\n ].filter((value): value is number => value !== undefined)\n const score = mean(components)\n return {\n score,\n passed: score >= 1,\n dimensions: {\n claim_recall: required.recall,\n citation_recall: citation,\n hallucination_safe: forbidden.safe,\n forbidden_claim_rate: forbidden.rate,\n required_claim_count: required.total,\n matched_claim_count: required.matched,\n forbidden_claim_count: forbidden.total,\n matched_forbidden_claim_count: forbidden.matched,\n },\n notes: `required=${required.matched}/${required.total}; forbidden=${forbidden.matched}/${forbidden.total}; citation_recall=${citation.toFixed(3)}`,\n raw: {\n matchedRequiredClaimIds: required.matchedIds,\n matchedForbiddenClaimIds: forbidden.matchedIds,\n },\n }\n}\n\nexport function scoreMemoryBenchmarkArtifact<TArtifact>(\n testCase: KnowledgeMemoryBenchmarkCase,\n artifact: TArtifact,\n): KnowledgeBenchmarkEvaluation {\n const memoryArtifact = artifact as KnowledgeBenchmarkArtifact\n const text = [\n memoryArtifact.text,\n memoryArtifact.answer,\n ...(memoryArtifact.rememberedFacts ?? []),\n ]\n .filter((part): part is string => typeof part === 'string' && part.length > 0)\n .join('\\n')\n const required = scoreClaims(text, testCase.requiredFacts ?? [])\n const forbidden = scoreForbiddenClaims(text, testCase.forbiddenFacts ?? [])\n const eventIds = unique([\n ...(memoryArtifact.citedEventIds ?? []),\n ...(memoryArtifact.usedMemoryIds ?? []),\n ])\n const eventRecall = scoreCitationRecall(eventIds, testCase.expectedEventIds ?? [])\n const actorRecall = scoreCitationRecall(\n memoryArtifact.actorIds ?? [],\n testCase.expectedActorIds ?? [],\n )\n const components = [\n required.totalWeight > 0 ? required.recall : undefined,\n testCase.expectedEventIds && testCase.expectedEventIds.length > 0 ? eventRecall : undefined,\n testCase.expectedActorIds && testCase.expectedActorIds.length > 0 ? actorRecall : undefined,\n testCase.forbiddenFacts && testCase.forbiddenFacts.length > 0 ? forbidden.safe : undefined,\n ].filter((value): value is number => value !== undefined)\n const score = mean(components)\n const dimensions: Record<string, number> = {}\n if (required.totalWeight > 0) {\n dimensions.memory_fact_recall = required.recall\n dimensions.memory_required_fact_count = required.total\n dimensions.memory_matched_fact_count = required.matched\n }\n if (testCase.expectedEventIds && testCase.expectedEventIds.length > 0) {\n dimensions.memory_event_recall = eventRecall\n }\n if (testCase.expectedActorIds && testCase.expectedActorIds.length > 0) {\n dimensions.memory_actor_recall = actorRecall\n }\n if (testCase.forbiddenFacts && testCase.forbiddenFacts.length > 0) {\n dimensions.memory_stale_safe = forbidden.safe\n dimensions.memory_stale_rate = forbidden.rate\n dimensions.memory_forbidden_fact_count = forbidden.total\n dimensions.memory_matched_forbidden_fact_count = forbidden.matched\n }\n return {\n score,\n passed: score >= 1,\n dimensions,\n applicableDimensions: Object.keys(dimensions),\n notes: `memory required=${required.matched}/${required.total}; stale=${forbidden.matched}/${forbidden.total}; event_recall=${eventRecall.toFixed(3)}; actor_recall=${actorRecall.toFixed(3)}`,\n raw: {\n matchedRequiredFactIds: required.matchedIds,\n matchedForbiddenFactIds: forbidden.matchedIds,\n citedEventIds: eventIds,\n actorIds: memoryArtifact.actorIds ?? [],\n },\n }\n}\n\nfunction retrievalScenarioForCase(\n testCase: KnowledgeRetrievalBenchmarkCase,\n): RetrievalEvalScenario {\n return {\n id: testCase.id,\n kind: 'retrieval-eval',\n query: testCase.query,\n expected: testCase.expected,\n ...(testCase.k !== undefined ? { k: testCase.k } : {}),\n }\n}\n\nfunction normalizeRetrievalArtifact<TArtifact>(\n testCase: KnowledgeRetrievalBenchmarkCase,\n artifact: TArtifact,\n): RetrievalEvalArtifact {\n const maybe = artifact as Partial<RetrievalEvalArtifact> & KnowledgeBenchmarkArtifact\n const hits = maybe.hits ?? []\n if (Array.isArray(maybe.hits) && maybe.query && maybe.requestedK !== undefined) {\n return maybe as RetrievalEvalArtifact\n }\n return {\n config: {},\n query: testCase.query,\n requestedK: testCase.k ?? Math.max(1, hits.length),\n hits,\n durationMs: maybe.durationMs ?? 0,\n ...(maybe.costUsd !== undefined ? { costUsd: maybe.costUsd } : {}),\n ...(maybe.metadata ? { metadata: maybe.metadata } : {}),\n }\n}\n\nfunction scoreClaims(text: string, claims: readonly KnowledgeClaimMatcher[]) {\n let matched = 0\n let matchedWeight = 0\n let totalWeight = 0\n const matchedIds: string[] = []\n const haystack = text.toLowerCase()\n for (const claim of claims) {\n if (\n !claim.id.trim() ||\n claim.anyOf.length === 0 ||\n claim.anyOf.some((value) => !value.trim())\n ) {\n throw new Error(\n 'claim matchers require a non-empty id and at least one non-empty alternative',\n )\n }\n const weight = claim.weight ?? 1\n if (!Number.isFinite(weight) || weight <= 0) {\n throw new Error(`claim matcher ${claim.id} weight must be a positive finite number`)\n }\n totalWeight += weight\n if (claim.anyOf.some((fragment) => haystack.includes(fragment.toLowerCase()))) {\n matched += 1\n matchedWeight += weight\n matchedIds.push(claim.id)\n }\n }\n return {\n total: claims.length,\n matched,\n totalWeight,\n recall: totalWeight === 0 ? 1 : matchedWeight / totalWeight,\n matchedIds,\n }\n}\n\nfunction scoreForbiddenClaims(text: string, claims: readonly KnowledgeClaimMatcher[]) {\n const matched = scoreClaims(text, claims)\n return {\n total: claims.length,\n matched: matched.matched,\n matchedIds: matched.matchedIds,\n rate: claims.length === 0 ? 0 : matched.matched / claims.length,\n safe: matched.matched === 0 ? 1 : 0,\n }\n}\n\nfunction scoreCitationRecall(\n citedSourceIds: readonly string[],\n expectedSourceIds: readonly string[],\n): number {\n if (expectedSourceIds.length === 0) return 1\n const cited = new Set(citedSourceIds)\n const matched = expectedSourceIds.filter((sourceId) => cited.has(sourceId)).length\n return matched / expectedSourceIds.length\n}\n","import type { RetrievalGoldTarget } from '../retrieval-eval'\n\nimport type {\n BuildRetrievalBenchmarkCasesFromQrelsOptions,\n KnowledgeRetrievalBenchmarkCase,\n KnowledgeRetrievalBenchmarkQrel,\n} from './types'\n\nimport { compactObject, unique } from './utils'\n\nexport function parseKnowledgeBenchmarkJsonl<T = unknown>(text: string): T[] {\n return text\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n .map((line, index) => {\n try {\n return JSON.parse(line) as T\n } catch (error) {\n throw new Error(`invalid JSONL row ${index + 1}: ${(error as Error).message}`)\n }\n })\n}\n\nexport function parseKnowledgeBenchmarkQrels(text: string): KnowledgeRetrievalBenchmarkQrel[] {\n return text\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith('#'))\n .flatMap((line, index) => {\n const parts = line.split(/\\t|\\s+/)\n if (parts.length < 3) return []\n const [queryId, maybeZeroOrDocId, maybeDocIdOrScore, maybeScore] = parts\n if (!queryId || !maybeZeroOrDocId || !maybeDocIdOrScore) return []\n if (queryId.toLowerCase() === 'qid' || queryId.toLowerCase() === 'query-id') return []\n const documentId = maybeScore === undefined ? maybeZeroOrDocId : maybeDocIdOrScore\n const scoreText = maybeScore === undefined ? maybeDocIdOrScore : maybeScore\n const score = Number(scoreText)\n if (!documentId || !Number.isFinite(score)) {\n throw new Error(`invalid qrels row ${index + 1}: expected query id, doc id, score`)\n }\n return [{ queryId, documentId, score }]\n })\n}\n\nexport function buildRetrievalBenchmarkCasesFromQrels(\n options: BuildRetrievalBenchmarkCasesFromQrelsOptions,\n): KnowledgeRetrievalBenchmarkCase[] {\n const qrelsByQuery = new Map<string, KnowledgeRetrievalBenchmarkQrel[]>()\n for (const qrel of options.qrels) {\n if (qrel.score <= 0) continue\n const list = qrelsByQuery.get(qrel.queryId) ?? []\n list.push(qrel)\n qrelsByQuery.set(qrel.queryId, list)\n }\n\n return options.queries.flatMap((query) => {\n const qrels = qrelsByQuery.get(query.id) ?? []\n if (qrels.length === 0) return []\n const split = query.split ?? options.splitOf?.(query.id)\n const expected = qrels.map((qrel) =>\n options.documentTarget\n ? options.documentTarget(qrel.documentId, qrel)\n : defaultDocumentTarget(qrel.documentId, options.targetKind ?? 'page'),\n )\n return [\n compactObject({\n id: `${options.benchmarkId}:${query.id}`,\n family: options.family,\n taskKind: 'retrieval' as const,\n query: query.text,\n expected,\n k: options.k,\n split,\n tags: unique([...(options.tags ?? []), ...(query.tags ?? []), ...(split ? [split] : [])]),\n source: options.source,\n metadata: query.metadata,\n }) as KnowledgeRetrievalBenchmarkCase,\n ]\n })\n}\n\nfunction defaultDocumentTarget(\n documentId: string,\n targetKind: 'page' | 'page-path' | 'source',\n): RetrievalGoldTarget {\n switch (targetKind) {\n case 'page':\n return { kind: 'page', pageId: documentId }\n case 'page-path':\n return { kind: 'page-path', path: documentId }\n case 'source':\n return { kind: 'source', sourceId: documentId }\n }\n}\n"],"mappings":"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","names":["join","canonicalJson","fsCampaignStorage","join","failures","join","join","canonicalJson","canonicalJson","canonicalJson","join","fsCampaignStorage","join","canonicalJson","totalCostUsd"]}
|