@tangle-network/agent-knowledge 22.0.16 → 23.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 +3 -0
- package/CHANGELOG.md +12 -0
- package/README.md +3 -3
- package/dist/benchmarks/index.d.ts +1 -1
- package/dist/benchmarks/index.js +1 -2
- package/dist/{benchmarks-jir3ZP-M.js → benchmarks-BMDc-9V-.js} +3 -4
- package/dist/{benchmarks-jir3ZP-M.js.map → benchmarks-BMDc-9V-.js.map} +1 -1
- package/dist/cli.js +3 -4
- package/dist/{ids-Bevz_pXV.js → ids-C-Z2Uv4c.js} +2 -3
- package/dist/{ids-Bevz_pXV.js.map → ids-C-Z2Uv4c.js.map} +1 -1
- package/dist/{index-BhvSH4E4.d.ts → index-B2s20NlV.d.ts} +3 -25
- package/dist/index-B2s20NlV.d.ts.map +1 -0
- package/dist/{index-OAxtm6is.d.ts → index-CRg_7-ND.d.ts} +2 -4
- package/dist/index-CRg_7-ND.d.ts.map +1 -0
- package/dist/index.d.ts +5 -123
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +45 -84
- package/dist/index.js.map +1 -1
- package/dist/{inspect-rXk5_r3K.js → inspect-tl0P7I7w.js} +33 -63
- package/dist/{inspect-rXk5_r3K.js.map → inspect-tl0P7I7w.js.map} +1 -1
- package/dist/memory/index.d.ts +2 -2
- package/dist/memory/index.js +2 -2
- package/dist/{memory-BH6oT1Qe.js → memory-krApkeRS.js} +15 -27
- package/dist/{memory-BH6oT1Qe.js.map → memory-krApkeRS.js.map} +1 -1
- package/dist/search/index.d.ts +2 -2
- package/dist/search/index.js +1 -2
- package/dist/{search-aZdP2685.js → search-BSGm7yxu.js} +4 -7
- package/dist/{search-aZdP2685.js.map → search-BSGm7yxu.js.map} +1 -1
- package/dist/{search-Dde0PEtY.d.ts → search-SPdjnQUo.d.ts} +2 -6
- package/dist/search-SPdjnQUo.d.ts.map +1 -0
- package/dist/{source-record-CdWvzvO6.js → source-record-9ZPRR1P9.js} +3 -4
- package/dist/{source-record-CdWvzvO6.js.map → source-record-9ZPRR1P9.js.map} +1 -1
- package/dist/{types-BekdNwGD.d.ts → types-1kNPDliG.d.ts} +1 -3
- package/dist/types-1kNPDliG.d.ts.map +1 -0
- package/dist/{types-BWV_Fvp7.d.ts → types-CznsaxVo.d.ts} +2 -4
- package/dist/types-CznsaxVo.d.ts.map +1 -0
- package/dist/viz/index.d.ts +1 -3
- package/dist/viz/index.d.ts.map +1 -1
- package/dist/viz/index.js +1 -2
- package/docs/compatibility.md +8 -8
- package/package.json +14 -14
- package/dist/index-BhvSH4E4.d.ts.map +0 -1
- package/dist/index-OAxtm6is.d.ts.map +0 -1
- package/dist/search-Dde0PEtY.d.ts.map +0 -1
- package/dist/types-BWV_Fvp7.d.ts.map +0 -1
- package/dist/types-BekdNwGD.d.ts.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["exceedsCostCeiling","stopwords","contentWords","hitFromSearchResult","nonEmpty"],"sources":["../src/knowledge-state-scope.ts","../src/kb-improvement/contracts.ts","../src/kb-improvement/state.ts","../src/kb-improvement/activation.ts","../src/immutable-ref.ts","../src/rag-answer-evidence.ts","../src/optimization.ts","../src/rag-eval/knowledge-base.ts","../src/claim-grounding.ts","../src/statistics.ts","../src/rag-eval/answer.ts","../src/rag-eval/providers.ts","../src/rag-eval/scoring.ts","../src/rag-optimization.ts","../src/events.ts","../src/eval-readiness.ts","../src/readiness-helpers.ts","../src/research-loop.ts","../src/retrieval-eval.ts","../src/retrieval-optimization.ts","../src/rag-improvement-phases.ts","../src/rag-improvement-loop.ts","../src/kb-improvement/workspace.ts","../src/kb-improvement/transition.ts","../src/kb-improvement/evaluation.ts","../src/kb-improvement/run.ts","../src/agent-candidate.ts","../src/chunking.ts","../src/discovery.ts","../src/filesystem-search-provider.ts","../src/hub-vector-search-provider.ts","../src/knowledge-brief.ts","../src/knowledge-use-receipts.ts","../src/knowledge-tools.ts","../src/promotion.ts","../src/propose-from-finding.ts","../src/qmd-search-provider.ts","../src/readiness-check.ts","../src/release.ts"],"sourcesContent":["import { z } from 'zod'\nimport { normalizePagesDirectory } from './pages-directory'\n\n/** Authoritative local state included in a KB improvement candidate. */\nexport interface KnowledgeStateScope {\n /** Root-relative Markdown pages directory. Defaults to `knowledge`. */\n pagesDirectory?: string\n /** Include claim ledgers and research events. Excludes indexes, locks, and receipt artifacts. */\n researchState?: boolean\n}\n\nexport const knowledgeStateScopeSchema = z\n .object({\n pagesDirectory: z\n .string()\n .transform((value) => normalizePagesDirectory(value))\n .optional(),\n researchState: z.boolean().optional(),\n })\n .strict()\n\nexport function normalizeKnowledgeStateScope(scope: KnowledgeStateScope = {}) {\n const parsed = knowledgeStateScopeSchema.parse(scope)\n return {\n pagesDirectory: normalizePagesDirectory(parsed.pagesDirectory),\n researchState: parsed.researchState ?? false,\n }\n}\n\nexport const KNOWLEDGE_RESEARCH_STATE_PATHS = [\n '.agent-knowledge/claim-ledgers',\n '.agent-knowledge/events.json',\n '.agent-knowledge/event-log',\n] as const\n","import { contentHash, type RunRecord, validateRunRecord } from '@tangle-network/agent-eval'\nimport {\n type AgentImprovementActivation,\n type AgentImprovementActivationResult,\n agentImprovementActivationResultSchema,\n} from '@tangle-network/agent-interface'\nimport { z } from 'zod'\nimport type {\n BuildEvalKnowledgeBundleOptions,\n EvalKnowledgeBundleBuildResult,\n KnowledgeReadinessSpec,\n} from '../eval-readiness'\nimport { type KnowledgeStateScope, knowledgeStateScopeSchema } from '../knowledge-state-scope'\nimport { DEFAULT_PAGES_DIRECTORY } from '../pages-directory'\nimport type {\n KnowledgeBaseQualityOptions,\n KnowledgeBaseQualityReport,\n RagAnswerEvalArtifact,\n} from '../rag-eval'\nimport type {\n RagKnowledgeImprovementPhase,\n RagKnowledgeResearchOptions,\n RagKnowledgeUpdateInput,\n RagKnowledgeUpdateResult,\n RunRagKnowledgeImprovementLoopOptions,\n RunRagKnowledgeImprovementLoopResult,\n} from '../rag-improvement-loop'\nimport type { RunRagOptimizationOptions } from '../rag-optimization'\nimport type { RunKnowledgeResearchLoopOptions } from '../research-loop'\nimport type { RunRetrievalImprovementLoopOptions } from '../retrieval-optimization'\nimport type { KnowledgeIndex } from '../types'\nimport type { ValidateKnowledgeOptions, ValidateKnowledgeResult } from '../validate'\n\nexport type KnowledgeImprovementStatus =\n | 'running'\n | 'candidate-ready'\n | 'promoted'\n | 'rejected'\n | 'blocked'\n\ninterface KnowledgeImprovementMetricProvenanceBase {\n evaluator: string\n version: string\n}\n\nexport type KnowledgeImprovementMetricProvenance =\n | (KnowledgeImprovementMetricProvenanceBase & {\n method: 'deterministic'\n })\n | (KnowledgeImprovementMetricProvenanceBase & {\n method: 'sampled' | 'composite'\n corpusHash: string\n runRecords: RunRecord[]\n })\n | (KnowledgeImprovementMetricProvenanceBase & {\n method: 'model'\n model: string\n corpusHash: string\n runRecords: RunRecord[]\n })\n\nexport interface KnowledgeImprovementMetric {\n score: number\n passed: boolean\n dimensions?: Record<string, number>\n notes?: string\n provenance: KnowledgeImprovementMetricProvenance\n}\n\nexport interface KnowledgeImprovementEvaluationInput {\n runId: string\n iteration: number\n root: string\n baselineRoot: string\n candidateRoot: string\n baselineIndex: KnowledgeIndex\n candidateIndex: KnowledgeIndex\n baseHash: string\n candidateHash: string\n validation: ValidateKnowledgeResult\n readiness?: EvalKnowledgeBundleBuildResult\n kbQuality: KnowledgeBaseQualityReport\n lifecycle?: RunRagKnowledgeImprovementLoopResult\n signal?: AbortSignal\n}\n\nexport type KnowledgeImprovementEvaluator = (\n input: KnowledgeImprovementEvaluationInput,\n) => Promise<KnowledgeImprovementMetric> | KnowledgeImprovementMetric\n\nexport interface KnowledgeImprovementCandidateRecord {\n iteration: number\n candidateId: string\n baseHash: string\n candidateHash?: string\n evidenceHash?: string\n promotionPlanHash?: string\n /** Durable one-way boundary preventing final-case reuse after interruption. */\n finalEvaluationStartedAt?: string\n status: KnowledgeImprovementStatus\n createdAt: string\n updatedAt: string\n}\n\nexport interface KnowledgeImprovementRunState {\n stateScope?: KnowledgeStateScope\n runId: string\n root: string\n goal: string\n implementationRef: string\n status: KnowledgeImprovementStatus\n baseHash: string\n createdAt: string\n updatedAt: string\n ownerId?: string\n candidates: KnowledgeImprovementCandidateRecord[]\n promotedCandidateId?: string\n blockedReason?: string\n}\n\nexport interface KnowledgeImprovementResult {\n runId: string\n state: KnowledgeImprovementRunState\n candidate?: KnowledgeImprovementCandidateRecord\n evaluation?: KnowledgeImprovementMetric\n lifecycle?: RunRagKnowledgeImprovementLoopResult\n promoted: boolean\n blocked: boolean\n}\n\nexport type KnowledgeImprovementTarget = 'candidate' | 'baseline'\n\nexport interface KnowledgeImprovementMutationReceipt {\n target: KnowledgeImprovementTarget\n beforeHash: string\n afterHash: string\n changed: boolean\n transactionId: string | null\n recovered: boolean\n}\n\nexport interface KnowledgeImprovementMutationResult extends KnowledgeImprovementResult {\n candidate: KnowledgeImprovementCandidateRecord\n mutation: KnowledgeImprovementMutationReceipt\n activationResult?: AgentImprovementActivationResult\n}\n\nexport interface KnowledgeImprovementActivationPersistence {\n activation: AgentImprovementActivation\n attemptedAt: string\n identity: string\n /** May run again after interruption; keep this deterministic and free of external side effects. */\n createResult(\n mutation: KnowledgeImprovementMutationReceipt,\n ): Promise<AgentImprovementActivationResult> | AgentImprovementActivationResult\n}\n\nexport const digestSchema = z.string().regex(/^[a-f0-9]{64}$/)\nexport const immutableRefSchema = z.string().regex(/^(?:sha256:[a-f0-9]{64}|git:[a-f0-9]{40})$/)\n\nexport const runIdSchema = z.string().min(1).max(2_048)\n\nexport const safePathSegmentSchema = z\n .string()\n .min(1)\n .max(128)\n .regex(/^[A-Za-z0-9][A-Za-z0-9._-]*$/)\n\nexport const knowledgeImprovementMutationReceiptSchema = z\n .object({\n target: z.enum(['candidate', 'baseline']),\n beforeHash: digestSchema,\n afterHash: digestSchema,\n changed: z.boolean(),\n transactionId: z.string().uuid().nullable(),\n recovered: z.boolean(),\n })\n .strict()\n\nexport interface KnowledgeImprovementActivationRecord {\n kind: 'knowledge-improvement-activation-result'\n candidateId: string\n mutation: KnowledgeImprovementMutationReceipt\n result: AgentImprovementActivationResult\n}\n\nexport const knowledgeImprovementActivationRecordSchema: z.ZodType<KnowledgeImprovementActivationRecord> =\n z\n .object({\n kind: z.literal('knowledge-improvement-activation-result'),\n candidateId: safePathSegmentSchema,\n mutation: knowledgeImprovementMutationReceiptSchema,\n result: agentImprovementActivationResultSchema,\n })\n .strict()\n\nconst improvementStatusSchema = z.enum([\n 'running',\n 'candidate-ready',\n 'promoted',\n 'rejected',\n 'blocked',\n])\n\nconst runRecordSchema = z.custom<RunRecord>((value) => {\n try {\n validateRunRecord(value)\n return true\n } catch {\n return false\n }\n}, 'invalid agent-eval RunRecord')\n\nconst deterministicMetricProvenanceSchema = z\n .object({\n evaluator: z.string().min(1),\n version: z.string().min(1),\n method: z.literal('deterministic'),\n })\n .strict()\n\nconst measuredMetricProvenanceSchema = z\n .object({\n evaluator: z.string().min(1),\n version: z.string().min(1),\n method: z.enum(['sampled', 'composite']),\n corpusHash: digestSchema,\n runRecords: z.array(runRecordSchema).min(1),\n })\n .strict()\n\nconst modelMetricProvenanceSchema = z\n .object({\n evaluator: z.string().min(1),\n version: z.string().min(1),\n method: z.literal('model'),\n model: z.string().min(1),\n corpusHash: digestSchema,\n runRecords: z.array(runRecordSchema).min(1),\n })\n .strict()\n\nexport const improvementMetricSchema = z\n .object({\n score: z.number().finite().min(0).max(1),\n passed: z.boolean(),\n dimensions: z.record(z.string(), z.number().finite()).optional(),\n notes: z.string().optional(),\n provenance: z.discriminatedUnion('method', [\n deterministicMetricProvenanceSchema,\n measuredMetricProvenanceSchema,\n modelMetricProvenanceSchema,\n ]),\n })\n .strict()\n .superRefine((metric, context) => {\n if (metric.provenance.method === 'deterministic') return\n const actualCorpusHash = contentHash(metric.provenance.runRecords)\n if (actualCorpusHash !== metric.provenance.corpusHash) {\n context.addIssue({\n code: 'custom',\n path: ['provenance', 'corpusHash'],\n message: 'metric corpus hash must bind the complete RunRecord array',\n })\n }\n })\n\nconst candidateRecordSchema = z\n .object({\n iteration: z.number().int().positive(),\n candidateId: safePathSegmentSchema,\n baseHash: digestSchema,\n candidateHash: digestSchema.optional(),\n evidenceHash: digestSchema.optional(),\n promotionPlanHash: digestSchema.optional(),\n finalEvaluationStartedAt: z.iso.datetime().optional(),\n status: improvementStatusSchema,\n createdAt: z.iso.datetime(),\n updatedAt: z.iso.datetime(),\n })\n .strict()\n\nexport const KnowledgeImprovementRunStateSchema = z\n .object({\n stateScope: knowledgeStateScopeSchema.optional(),\n runId: runIdSchema,\n root: z.string().min(1),\n goal: z.string().min(1),\n implementationRef: immutableRefSchema,\n status: improvementStatusSchema,\n baseHash: digestSchema,\n createdAt: z.iso.datetime(),\n updatedAt: z.iso.datetime(),\n ownerId: z.string().min(1).optional(),\n candidates: z.array(candidateRecordSchema),\n promotedCandidateId: safePathSegmentSchema.optional(),\n blockedReason: z.string().min(1).optional(),\n })\n .strict()\n .superRefine((state, context) => {\n const candidateIds = new Set<string>()\n for (const [index, candidate] of state.candidates.entries()) {\n if (candidateIds.has(candidate.candidateId)) {\n context.addIssue({\n code: 'custom',\n path: ['candidates', index, 'candidateId'],\n message: 'candidate ids must be unique within an improvement run',\n })\n }\n candidateIds.add(candidate.candidateId)\n if (candidate.baseHash !== state.baseHash) {\n context.addIssue({\n code: 'custom',\n path: ['candidates', index, 'baseHash'],\n message: 'candidate base hash must match its improvement run',\n })\n }\n if (candidate.status === 'candidate-ready') {\n if (!candidate.candidateHash || !candidate.evidenceHash || !candidate.promotionPlanHash) {\n context.addIssue({\n code: 'custom',\n path: ['candidates', index],\n message: 'ready candidates require content, evidence, and promotion-plan identities',\n })\n }\n }\n if (\n candidate.status === 'promoted' &&\n (!candidate.candidateHash || !candidate.evidenceHash || !candidate.promotionPlanHash)\n ) {\n context.addIssue({\n code: 'custom',\n path: ['candidates', index],\n message: 'promoted candidates require content, evidence, and promotion-plan identities',\n })\n }\n if (\n candidate.status === 'promoted' &&\n Boolean(candidate.evidenceHash) !== Boolean(candidate.promotionPlanHash)\n ) {\n context.addIssue({\n code: 'custom',\n path: ['candidates', index],\n message: 'promoted candidate evidence and promotion-plan identities must appear together',\n })\n }\n if (candidate.status === 'promoted' && state.status !== 'promoted') {\n context.addIssue({\n code: 'custom',\n path: ['candidates', index, 'status'],\n message: 'only a promoted run may contain a promoted candidate',\n })\n }\n }\n if (state.status === 'promoted') {\n const promoted = state.candidates.filter(\n (candidate) => candidate.candidateId === state.promotedCandidateId,\n )\n if (promoted.length !== 1 || promoted[0]?.status !== 'promoted') {\n context.addIssue({\n code: 'custom',\n path: ['promotedCandidateId'],\n message: 'promoted state must identify exactly one promoted candidate',\n })\n }\n } else if (state.promotedCandidateId !== undefined) {\n context.addIssue({\n code: 'custom',\n path: ['promotedCandidateId'],\n message: 'only a promoted run may identify a promoted candidate',\n })\n }\n if (\n state.status === 'candidate-ready' &&\n state.candidates.filter((candidate) => candidate.status === 'candidate-ready').length !== 1\n ) {\n context.addIssue({\n code: 'custom',\n path: ['status'],\n message: 'candidate-ready state must contain exactly one ready candidate',\n })\n }\n if (state.status === 'blocked' && state.blockedReason === undefined) {\n context.addIssue({\n code: 'custom',\n path: ['blockedReason'],\n message: 'blocked state must include a reason',\n })\n }\n })\n\nexport const KnowledgeImprovementEvidenceSchema = z\n .object({\n kind: z.literal('knowledge-improvement-evidence'),\n runId: runIdSchema,\n candidateId: safePathSegmentSchema,\n iteration: z.number().int().positive(),\n goalHash: digestSchema,\n implementationRef: immutableRefSchema,\n baseHash: digestSchema,\n candidateHash: digestSchema,\n promotionPlanHash: digestSchema,\n validation: z.unknown(),\n readiness: z.unknown().nullable(),\n kbQuality: z.unknown(),\n evaluation: improvementMetricSchema,\n lifecycle: z.unknown().nullable(),\n })\n .strict()\n\nexport type KnowledgeImprovementEvidence = z.infer<typeof KnowledgeImprovementEvidenceSchema>\n\n/** Portable identity of one measured candidate. Paths and mutable run state are deliberately excluded. */\nexport const KnowledgeImprovementCandidateRefSchema = z\n .object({\n kind: z.literal('knowledge-improvement-candidate'),\n runId: runIdSchema,\n candidateId: safePathSegmentSchema,\n goalHash: digestSchema,\n baseHash: digestSchema,\n candidateHash: digestSchema,\n evidenceHash: digestSchema,\n promotionPlanHash: digestSchema,\n })\n .strict()\n\nexport type KnowledgeImprovementCandidateRef = z.infer<\n typeof KnowledgeImprovementCandidateRefSchema\n>\n\nexport interface PromoteKnowledgeCandidateOptions {\n root: string\n candidate: KnowledgeImprovementCandidateRef\n activation?: KnowledgeImprovementActivationPersistence\n ownerId?: string\n leaseTtlMs?: number\n now?: () => Date\n onState?: (state: KnowledgeImprovementRunState) => Promise<void> | void\n}\n\nexport type RestoreKnowledgeCandidateBaselineOptions = PromoteKnowledgeCandidateOptions\n\nexport interface LoadKnowledgeImprovementActivationResultOptions {\n root: string\n candidate: KnowledgeImprovementCandidateRef\n activation: AgentImprovementActivation\n identity: string\n}\n\nexport interface UseKnowledgeImprovementCandidateOptions {\n root: string\n candidate: KnowledgeImprovementCandidateRef\n}\n\nexport interface ResolvedKnowledgeImprovementComparisonSnapshot {\n root: string\n hash: string\n}\n\nexport interface ResolvedKnowledgeImprovementComparison {\n stateScope?: KnowledgeStateScope\n reference: KnowledgeImprovementCandidateRef\n evaluation: KnowledgeImprovementMetric\n baseline: ResolvedKnowledgeImprovementComparisonSnapshot\n candidate: ResolvedKnowledgeImprovementComparisonSnapshot\n}\n\nexport interface ResolvedKnowledgeImprovementCandidate {\n stateScope?: KnowledgeStateScope\n root: string\n candidate: KnowledgeImprovementCandidateRef\n evaluation: KnowledgeImprovementMetric\n}\n\nexport interface KnowledgeImprovementRetrievalOptions\n extends Omit<RunRetrievalImprovementLoopOptions, 'index' | 'runDir'> {\n runDir?: RunRetrievalImprovementLoopOptions['runDir']\n}\n\nexport type KnowledgeImprovementRagOptimizationRunInput = Parameters<\n RunRagOptimizationOptions['run']\n>[0] & {\n runId: string\n iteration: number\n candidateId: string\n root: string\n baselineRoot: string\n candidateRoot: string\n candidateIndex: KnowledgeIndex\n baseHash: string\n}\n\nexport interface KnowledgeImprovementRagOptimizationOptions\n extends Omit<RunRagOptimizationOptions, 'run' | 'runDir'> {\n runDir?: RunRagOptimizationOptions['runDir']\n run(input: KnowledgeImprovementRagOptimizationRunInput): Promise<RagAnswerEvalArtifact>\n}\n\nexport interface KnowledgeImprovementUpdateInput extends RagKnowledgeUpdateInput {\n runId: string\n iteration: number\n candidateId: string\n root: string\n baselineRoot: string\n candidateRoot: string\n baseHash: string\n}\n\nexport type KnowledgeImprovementUpdate = (\n input: KnowledgeImprovementUpdateInput,\n) => Promise<RagKnowledgeUpdateResult> | RagKnowledgeUpdateResult\n\nexport interface KnowledgeImprovementOptions {\n /** Declared authoritative local state, frozen and restored with each candidate. */\n stateScope?: KnowledgeStateScope\n root: string\n goal: string\n /**\n * Immutable identity covering callbacks, evaluation policy, models, indexes,\n * external services, and all other behavior that can affect this run.\n */\n implementationRef: string\n runId?: string\n ownerId?: string\n leaseTtlMs?: number\n resume?: boolean\n maxCandidates?: number\n candidateResearchIterations?: number\n strict?: ValidateKnowledgeOptions['strict']\n readinessSpecs?: KnowledgeReadinessSpec[]\n readinessTaskId?: string\n readiness?: Omit<BuildEvalKnowledgeBundleOptions, 'taskId' | 'index' | 'specs'>\n kbQuality?: KnowledgeBaseQualityOptions\n step?: RunKnowledgeResearchLoopOptions['step']\n knowledgeResearch?: Omit<RagKnowledgeResearchOptions, 'root'>\n ragOptimization?: KnowledgeImprovementRagOptimizationOptions\n retrieval?: KnowledgeImprovementRetrievalOptions\n diagnose?: NonNullable<RunRagKnowledgeImprovementLoopOptions['diagnose']>\n acquireKnowledge?: NonNullable<RunRagKnowledgeImprovementLoopOptions['acquireKnowledge']>\n updateKnowledge?: KnowledgeImprovementUpdate\n evaluateAnswers?: NonNullable<RunRagKnowledgeImprovementLoopOptions['evaluateAnswers']>\n answerQualityCostCeiling?: RunRagKnowledgeImprovementLoopOptions['answerQualityCostCeiling']\n decidePromotion?: NonNullable<RunRagKnowledgeImprovementLoopOptions['decidePromotion']>\n enabledPhases?: readonly RagKnowledgeImprovementPhase[]\n requiredPhases?: readonly RagKnowledgeImprovementPhase[]\n /** Repeatable candidate screening that must not use final cases. */\n evaluateDevelopment?: KnowledgeImprovementEvaluator\n /** Single-use final evaluator. A failure ends the run. */\n evaluate?: KnowledgeImprovementEvaluator\n signal?: AbortSignal\n now?: () => Date\n onState?: (state: KnowledgeImprovementRunState) => Promise<void> | void\n}\n\nexport interface LeaseHandle {\n ownerId: string\n assertOwned(): void\n release(): Promise<void>\n}\n\nexport const DEFAULT_LEASE_TTL_MS = 15 * 60 * 1000\n\nexport const UPDATE_PHASES: readonly RagKnowledgeImprovementPhase[] = [\n 'gap-diagnosis',\n 'knowledge-acquisition',\n 'knowledge-update',\n]\n\nexport const EVALUATION_PHASES: readonly RagKnowledgeImprovementPhase[] = [\n 'rag-optimization',\n 'retrieval-tuning',\n 'answer-quality',\n 'promotion',\n]\n\n/**\n * The pages directory every knowledge-improvement path reads and writes.\n *\n * This subsystem has no option for a caller-chosen pages directory: the\n * workspace it snapshots, the plan it hashes, and the transaction it applies\n * all address the default tree. Naming it once means the write allowlist, the\n * plan hash, and the generated-page set cannot disagree about which tree they\n * are talking about, and threading a real choice through later changes one\n * constant instead of hunting call sites.\n */\nexport const KB_IMPROVEMENT_PAGES_DIRECTORY = DEFAULT_PAGES_DIRECTORY\n","import { stat } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport { canonicalJson, contentHash } from '@tangle-network/agent-eval'\nimport {\n canonicalPathsEqual,\n isMissingFile,\n listRegularFilesWithinRoot,\n readRegularFileWithinRoot,\n relativeWithinRoot,\n withSafeDirectory,\n writeJsonDurableWithinRoot,\n} from '../durable-fs'\nimport { sha256, slugify, stableId } from '../ids'\nimport { RUN_LEASE, recordLockOwner, takeOverDeadHolder } from '../lock-holder'\nimport { acquireDurableFileLock } from '../mutation-lock'\nimport { layoutFor } from '../store'\nimport type {\n KnowledgeImprovementCandidateRecord,\n KnowledgeImprovementOptions,\n KnowledgeImprovementRunState,\n LeaseHandle,\n} from './contracts'\nimport { KnowledgeImprovementRunStateSchema, runIdSchema, safePathSegmentSchema } from './contracts'\n\nexport function knowledgeImprovementRunId(root: string, goal: string): string {\n return stableId('kimpr', `${root}:${goal}`)\n}\n\nexport function knowledgeImprovementRunDir(root: string, runId: string): string {\n const parsedRunId = runIdSchema.parse(runId)\n const safeRunId = safePathSegmentSchema.safeParse(parsedRunId)\n const runSegment = safeRunId.success\n ? safeRunId.data\n : `${slugify(parsedRunId).slice(0, 72)}-${sha256(parsedRunId).slice(0, 16)}`\n const improvementsDir = join(layoutFor(root).cacheDir, 'improvements')\n const runDir = join(improvementsDir, runSegment)\n if (relativeWithinRoot(improvementsDir, runDir) === undefined) {\n throw new Error('knowledge improvement run directory escaped its root')\n }\n return runDir\n}\n\nexport async function withKnowledgeImprovementRun<T>(\n root: string,\n runId: string,\n create: boolean,\n use: (runDir: string) => Promise<T> | T,\n): Promise<T> {\n const runDir = knowledgeImprovementRunDir(root, runId)\n const relativePath = relativeWithinRoot(root, runDir)\n if (!relativePath) throw new Error('knowledge improvement run directory escaped its root')\n return withSafeDirectory(root, relativePath, create, async (openedRunDir) => {\n const result = await use(openedRunDir)\n const openedIdentity = await stat(openedRunDir)\n const currentIdentity = await withSafeDirectory(root, relativePath, false, (currentRunDir) =>\n stat(currentRunDir),\n )\n if (openedIdentity.dev !== currentIdentity.dev || openedIdentity.ino !== currentIdentity.ino) {\n throw new Error('knowledge improvement run directory changed during use')\n }\n return result\n })\n}\n\nexport async function loadKnowledgeImprovementState(\n root: string,\n runId: string,\n): Promise<KnowledgeImprovementRunState | null> {\n const expectedRunId = runIdSchema.parse(runId)\n try {\n return await withKnowledgeImprovementRun(root, expectedRunId, false, (runDir) =>\n loadKnowledgeImprovementStateFromRun(root, expectedRunId, runDir),\n )\n } catch (error) {\n if (isMissingFile(error)) return null\n throw error\n }\n}\n\nexport async function loadKnowledgeImprovementStateFromRun(\n root: string,\n runId: string,\n runDir: string,\n): Promise<KnowledgeImprovementRunState> {\n const stateFile = await readRegularFileWithinRoot(runDir, 'state.json')\n const raw = JSON.parse(stateFile.bytes.toString('utf8')) as unknown\n const state = KnowledgeImprovementRunStateSchema.parse(raw) as KnowledgeImprovementRunState\n if (state.runId !== runId) {\n throw new Error('knowledge improvement state does not match the requested run')\n }\n if (!(await canonicalPathsEqual(state.root, root))) {\n throw new Error('knowledge improvement state does not match the requested root')\n }\n for (const candidate of state.candidates) {\n if (candidate.status === 'running') await assertCandidateWorkspace(runDir, candidate)\n }\n return state\n}\n\nasync function assertCandidateWorkspace(\n runDir: string,\n candidate: Pick<KnowledgeImprovementCandidateRecord, 'candidateId'>,\n): Promise<void> {\n await withCandidateWorkspace(runDir, candidate, () => undefined)\n}\n\nexport async function withCandidateWorkspace<T>(\n runDir: string,\n candidate: Pick<KnowledgeImprovementCandidateRecord, 'candidateId'>,\n use: (candidateRoot: string) => Promise<T> | T,\n): Promise<T> {\n return withSafeDirectory(\n runDir,\n join('candidates', safePathSegmentSchema.parse(candidate.candidateId), 'workspace'),\n false,\n use,\n )\n}\n\nexport function findActiveCandidate(\n state: KnowledgeImprovementRunState,\n): KnowledgeImprovementCandidateRecord | undefined {\n return [...state.candidates]\n .reverse()\n .find((candidate) => candidate.status === 'candidate-ready' || candidate.status === 'running')\n}\n\nexport interface KnowledgeImprovementEvent extends Record<string, unknown> {\n at: string\n type: string\n}\n\nexport async function loadKnowledgeImprovementEvents(\n root: string,\n runId: string,\n): Promise<KnowledgeImprovementEvent[]> {\n const parsedRunId = runIdSchema.parse(runId)\n try {\n return await withKnowledgeImprovementRun(root, parsedRunId, false, (runDir) =>\n loadKnowledgeImprovementEventsFromRun(runDir),\n )\n } catch (error) {\n if (isMissingFile(error)) return []\n throw error\n }\n}\n\nexport async function loadKnowledgeImprovementEventsFromRun(\n runDir: string,\n): Promise<KnowledgeImprovementEvent[]> {\n const events: KnowledgeImprovementEvent[] = []\n try {\n for (const file of await listRegularFilesWithinRoot(runDir, 'events')) {\n const name = file.path.slice('events/'.length)\n if (name.includes('/') || !name.endsWith('.json')) {\n throw new Error(`knowledge event store contains an unsupported entry: ${name}`)\n }\n events.push(parseKnowledgeImprovementEvent(JSON.parse(file.bytes.toString('utf8'))))\n }\n } catch (error) {\n if (!isMissingFile(error)) throw error\n }\n\n const unique = new Map<string, KnowledgeImprovementEvent>()\n for (const event of events) {\n const { at: _at, ...semantic } = event\n unique.set(contentHash(semantic), event)\n }\n return [...unique.values()].sort((left, right) => left.at.localeCompare(right.at))\n}\n\nfunction parseKnowledgeImprovementEvent(value: unknown): KnowledgeImprovementEvent {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error('knowledge improvement event is not an object')\n }\n const event = value as Record<string, unknown>\n if (typeof event.at !== 'string' || typeof event.type !== 'string') {\n throw new Error('knowledge improvement event is missing at or type')\n }\n return event as KnowledgeImprovementEvent\n}\n\n/**\n * Take the run's lease, or fail fast while another operator holds it. A holder whose owner record\n * proves it dead (`src/lock-holder.ts`) is taken over at once; any other holder keeps `ttlMs`.\n */\nexport async function acquireRunLease(\n runDir: string,\n options: { ownerId: string; ttlMs: number },\n): Promise<LeaseHandle> {\n const acquire = () =>\n acquireDurableFileLock(runDir, {\n lockfilePath: join(runDir, RUN_LEASE.directory),\n staleMs: options.ttlMs,\n })\n let acquired: Awaited<ReturnType<typeof acquire>>\n try {\n acquired = await acquire()\n } catch (error) {\n if (\n (error as NodeJS.ErrnoException).code !== 'ELOCKED' ||\n !(await takeOverDeadHolder(runDir, options.ttlMs, RUN_LEASE))\n ) {\n throw error\n }\n acquired = await acquire()\n }\n await recordLockOwner(runDir, `knowledge improvement run of ${options.ownerId}`, RUN_LEASE)\n return {\n ownerId: options.ownerId,\n assertOwned: acquired.assertOwned,\n release: acquired.release,\n }\n}\n\nexport async function blockRun(\n runDir: string,\n state: KnowledgeImprovementRunState,\n reason: string,\n onState: KnowledgeImprovementOptions['onState'],\n now: () => Date,\n): Promise<KnowledgeImprovementRunState> {\n state.status = 'blocked'\n state.blockedReason = reason\n state.updatedAt = now().toISOString()\n await saveState(runDir, state, onState)\n return state\n}\n\nexport async function saveState(\n runDir: string,\n state: KnowledgeImprovementRunState,\n onState?: KnowledgeImprovementOptions['onState'],\n): Promise<void> {\n await writeJsonDurableWithinRoot(\n runDir,\n 'state.json',\n KnowledgeImprovementRunStateSchema.parse(state),\n )\n await onState?.(state)\n}\n\nexport async function appendLedger(runDir: string, value: Record<string, unknown>): Promise<void> {\n const type = value.type\n if (typeof type !== 'string' || type.length === 0) {\n throw new Error('knowledge improvement event requires a type')\n }\n const relativePath = join('events', `${contentHash(value)}.json`).replace(/\\\\/g, '/')\n try {\n const file = await readRegularFileWithinRoot(runDir, relativePath)\n const existing = parseKnowledgeImprovementEvent(JSON.parse(file.bytes.toString('utf8')))\n const { at: _at, ...semantic } = existing\n if (canonicalJson(semantic) !== canonicalJson(value)) {\n throw new Error('knowledge improvement event identity conflicts with durable content')\n }\n return\n } catch (error) {\n if (!isMissingFile(error)) throw error\n }\n await writeJsonDurableWithinRoot(runDir, relativePath, {\n at: new Date().toISOString(),\n ...value,\n })\n}\n\nexport function candidateEvidenceRelativePath(candidateId: string): string {\n return join('candidates', safePathSegmentSchema.parse(candidateId), 'evidence.json').replace(\n /\\\\/g,\n '/',\n )\n}\n\nexport function assertExactCandidatePlatform(): void {\n if (process.platform !== 'linux') {\n throw new Error('exact knowledge candidate workflows require Linux directory descriptors')\n }\n}\n","import { canonicalJson } from '@tangle-network/agent-eval'\nimport {\n type AgentImprovementActivation,\n type AgentImprovementActivationResult,\n agentImprovementActivationResultSchema,\n agentImprovementActivationSchema,\n canonicalCandidateDigest,\n omitTopLevelDigest,\n type Sha256Digest,\n sha256DigestSchema,\n} from '@tangle-network/agent-interface'\nimport { z } from 'zod'\nimport { isMissingFile, readRegularFileWithinRoot, writeJsonDurableWithinRoot } from '../durable-fs'\nimport type {\n KnowledgeImprovementActivationPersistence,\n KnowledgeImprovementActivationRecord,\n KnowledgeImprovementCandidateRef,\n KnowledgeImprovementMutationReceipt,\n KnowledgeImprovementTarget,\n LoadKnowledgeImprovementActivationResultOptions,\n} from './contracts'\nimport {\n digestSchema,\n KnowledgeImprovementCandidateRefSchema,\n knowledgeImprovementActivationRecordSchema,\n knowledgeImprovementMutationReceiptSchema,\n} from './contracts'\nimport { assertExactCandidatePlatform, withKnowledgeImprovementRun } from './state'\n\n/** Load the durable result for one exact activation without changing knowledge or run state. */\nexport async function loadKnowledgeImprovementActivationResult(\n options: LoadKnowledgeImprovementActivationResultOptions,\n): Promise<AgentImprovementActivationResult | null> {\n assertExactCandidatePlatform()\n const candidate = Object.freeze(KnowledgeImprovementCandidateRefSchema.parse(options.candidate))\n const activation = verifyCanonicalKnowledgeActivation(options.activation)\n const target = targetForKnowledgeActivation(activation)\n assertKnowledgeActivationAuthority(activation, candidate, target, options.identity)\n return withKnowledgeImprovementRun(options.root, candidate.runId, false, async (runDir) => {\n const record = await loadKnowledgeActivationRecord(\n runDir,\n candidate,\n activation,\n target,\n options.identity,\n )\n return record?.result ?? null\n })\n}\n\nexport interface ResolvedKnowledgeImprovementActivationPersistence\n extends KnowledgeImprovementActivationPersistence {\n activation: AgentImprovementActivation\n}\n\nexport function sourceKnowledgeHash(\n candidate: KnowledgeImprovementCandidateRef,\n target: KnowledgeImprovementTarget,\n): string {\n return target === 'candidate' ? candidate.baseHash : candidate.candidateHash\n}\n\nfunction targetForKnowledgeActivation(\n activation: AgentImprovementActivation,\n): KnowledgeImprovementTarget {\n return activation.intent === 'activate-candidate' ? 'candidate' : 'baseline'\n}\n\nexport function resolveKnowledgeActivationPersistence(\n input: KnowledgeImprovementActivationPersistence,\n candidate: KnowledgeImprovementCandidateRef,\n target: KnowledgeImprovementTarget,\n): ResolvedKnowledgeImprovementActivationPersistence {\n const activation = verifyCanonicalKnowledgeActivation(input.activation)\n assertKnowledgeActivationAuthority(activation, candidate, target, input.identity)\n const attemptedAt = z.iso.datetime().parse(input.attemptedAt)\n if (\n Date.parse(attemptedAt) < Date.parse(activation.authorizedAt) ||\n Date.parse(attemptedAt) >= Date.parse(activation.expiresAt)\n ) {\n throw new Error('knowledge activation attempt is outside its authorization window')\n }\n return Object.freeze({\n activation,\n attemptedAt,\n identity: input.identity,\n createResult: input.createResult,\n })\n}\n\nfunction assertKnowledgeActivationAuthority(\n activation: AgentImprovementActivation,\n candidate: KnowledgeImprovementCandidateRef,\n target: KnowledgeImprovementTarget,\n identity: string,\n): void {\n if (!identity.trim()) throw new Error('knowledge activation identity is required')\n if (targetForKnowledgeActivation(activation) !== target) {\n throw new Error('knowledge activation intent does not match the requested transition')\n }\n if (activation.targets.length !== 1) {\n throw new Error('knowledge activation requires exactly one target')\n }\n const authorizedTarget = activation.targets[0]\n if (authorizedTarget.surface !== 'knowledge' || authorizedTarget.identity !== identity) {\n throw new Error('knowledge activation target does not match this knowledge base')\n }\n if (\n authorizedTarget.expectedBaseDigest !==\n prefixedKnowledgeDigest(sourceKnowledgeHash(candidate, target))\n ) {\n throw new Error('knowledge activation does not authorize the measured source state')\n }\n}\n\nfunction verifyCanonicalKnowledgeActivation(\n value: AgentImprovementActivation,\n): AgentImprovementActivation {\n const activation = agentImprovementActivationSchema.parse(value)\n if (canonicalCandidateDigest(omitTopLevelDigest(activation)) !== activation.digest) {\n throw new Error('knowledge activation digest does not match its canonical content')\n }\n return immutableJsonValue(structuredClone(activation))\n}\n\nfunction verifyCanonicalKnowledgeActivationResult(\n value: AgentImprovementActivationResult,\n): AgentImprovementActivationResult {\n const result = agentImprovementActivationResultSchema.parse(value)\n if (canonicalCandidateDigest(omitTopLevelDigest(result)) !== result.digest) {\n throw new Error('knowledge activation result digest does not match its canonical content')\n }\n return immutableJsonValue(structuredClone(result))\n}\n\nexport async function persistKnowledgeActivationResult(\n runDir: string,\n candidate: KnowledgeImprovementCandidateRef,\n persistence: ResolvedKnowledgeImprovementActivationPersistence,\n target: KnowledgeImprovementTarget,\n mutation: KnowledgeImprovementMutationReceipt,\n): Promise<AgentImprovementActivationResult> {\n const result = assertKnowledgeActivationResult(\n persistence.activation,\n candidate,\n target,\n persistence.identity,\n mutation,\n await persistence.createResult(Object.freeze({ ...mutation })),\n persistence.attemptedAt,\n )\n const record = knowledgeImprovementActivationRecordSchema.parse({\n kind: 'knowledge-improvement-activation-result',\n candidateId: candidate.candidateId,\n mutation,\n result,\n })\n const existing = await loadKnowledgeActivationRecord(\n runDir,\n candidate,\n persistence.activation,\n target,\n persistence.identity,\n )\n if (existing) {\n if (canonicalJson(existing) !== canonicalJson(record)) {\n throw new Error('knowledge activation result identity conflicts with durable content')\n }\n return existing.result\n }\n await writeJsonDurableWithinRoot(\n runDir,\n knowledgeActivationResultPath(persistence.activation.digest),\n record,\n )\n const stored = await loadKnowledgeActivationRecord(\n runDir,\n candidate,\n persistence.activation,\n target,\n persistence.identity,\n )\n if (!stored || canonicalJson(stored) !== canonicalJson(record)) {\n throw new Error('knowledge activation result was not durably persisted')\n }\n return stored.result\n}\n\nexport async function loadKnowledgeActivationRecord(\n runDir: string,\n candidate: KnowledgeImprovementCandidateRef,\n activation: AgentImprovementActivation,\n target: KnowledgeImprovementTarget,\n identity: string,\n): Promise<KnowledgeImprovementActivationRecord | null> {\n let raw: unknown\n try {\n const file = await readRegularFileWithinRoot(\n runDir,\n knowledgeActivationResultPath(activation.digest),\n )\n raw = JSON.parse(file.bytes.toString('utf8')) as unknown\n } catch (error) {\n if (isMissingFile(error)) return null\n throw error\n }\n const record = knowledgeImprovementActivationRecordSchema.parse(raw)\n if (record.candidateId !== candidate.candidateId) {\n throw new Error('knowledge activation result belongs to another candidate')\n }\n const result = assertKnowledgeActivationResult(\n activation,\n candidate,\n target,\n identity,\n record.mutation,\n record.result,\n )\n return immutableJsonValue({ ...record, result })\n}\n\nfunction assertKnowledgeActivationResult(\n activation: AgentImprovementActivation,\n candidate: KnowledgeImprovementCandidateRef,\n target: KnowledgeImprovementTarget,\n identity: string,\n mutationInput: KnowledgeImprovementMutationReceipt,\n resultInput: AgentImprovementActivationResult,\n attemptedAt?: string,\n): AgentImprovementActivationResult {\n assertKnowledgeActivationAuthority(activation, candidate, target, identity)\n const mutation = knowledgeImprovementMutationReceiptSchema.parse(mutationInput)\n const result = verifyCanonicalKnowledgeActivationResult(resultInput)\n if (\n result.idempotencyKey !== activation.digest ||\n (attemptedAt !== undefined && result.attemptedAt !== attemptedAt) ||\n Date.parse(result.attemptedAt) < Date.parse(activation.authorizedAt) ||\n Date.parse(result.attemptedAt) >= Date.parse(activation.expiresAt) ||\n mutation.target !== target ||\n mutation.changed !== (mutation.beforeHash !== mutation.afterHash) ||\n (!mutation.changed && (mutation.transactionId !== null || mutation.recovered))\n ) {\n throw new Error('knowledge activation result does not bind its authorized mutation')\n }\n\n const sourceDigest = prefixedKnowledgeDigest(sourceKnowledgeHash(candidate, target))\n const desiredDigest = prefixedKnowledgeDigest(\n target === 'candidate' ? candidate.candidateHash : candidate.baseHash,\n )\n const beforeDigest = prefixedKnowledgeDigest(mutation.beforeHash)\n const afterDigest = prefixedKnowledgeDigest(mutation.afterHash)\n const outcome = result.outcome\n if (mutation.changed) {\n if (\n mutation.transactionId === null ||\n beforeDigest !== sourceDigest ||\n afterDigest !== desiredDigest ||\n outcome.status !== 'applied' ||\n outcome.transactionId !== mutation.transactionId ||\n outcome.targets.length !== 1 ||\n outcome.targets[0]?.surface !== 'knowledge' ||\n outcome.targets[0]?.identity !== identity ||\n outcome.targets[0]?.beforeDigest !== beforeDigest ||\n outcome.targets[0]?.afterDigest !== afterDigest\n ) {\n throw new Error('knowledge activation result does not prove the applied transaction')\n }\n return result\n }\n\n const expectedStatus = afterDigest === desiredDigest ? 'already-applied' : 'conflict'\n if (\n afterDigest === sourceDigest ||\n outcome.status !== expectedStatus ||\n outcome.targets.length !== 1 ||\n outcome.targets[0]?.surface !== 'knowledge' ||\n outcome.targets[0]?.identity !== identity ||\n outcome.targets[0]?.currentDigest !== afterDigest\n ) {\n throw new Error('knowledge activation result does not prove the observed target state')\n }\n return result\n}\n\nfunction knowledgeActivationResultPath(digest: Sha256Digest): string {\n const parsed = sha256DigestSchema.parse(digest)\n return `activation-results/${parsed.slice('sha256:'.length)}.json`\n}\n\nfunction prefixedKnowledgeDigest(hash: string): Sha256Digest {\n return sha256DigestSchema.parse(`sha256:${digestSchema.parse(hash)}`)\n}\n\nexport function immutableJsonValue<T>(value: T): T {\n if (value === null || typeof value !== 'object') return value\n for (const child of Object.values(value)) immutableJsonValue(child)\n return Object.freeze(value)\n}\n","const SHA256_REF = /^sha256:[a-f0-9]{64}$/\nconst GIT_REF = /^git:[a-f0-9]{40}$/\n\nexport function assertImmutableRef(value: unknown, label: string): asserts value is string {\n if (typeof value !== 'string' || (!SHA256_REF.test(value) && !GIT_REF.test(value))) {\n throw new Error(`${label} must be lowercase sha256:<64 hex> or git:<40 hex>`)\n }\n}\n","import type { ComparisonCost } from '@tangle-network/agent-eval/campaign'\nimport { assertImmutableRef } from './immutable-ref'\n\ninterface RagAnswerEvidence {\n passed: boolean\n metrics: Record<string, number>\n finalScenarioIds: readonly string[]\n datasetRef: string\n evaluatorRef: string\n cost: ComparisonCost\n}\n\nexport function assertRagAnswerEvidence(result: RagAnswerEvidence): void {\n if (!result || typeof result !== 'object') {\n throw new Error('answer-quality evidence must be an object')\n }\n if (typeof result.passed !== 'boolean') {\n throw new Error('answer-quality evidence requires a boolean passed verdict')\n }\n assertImmutableRef(result.datasetRef, 'answer-quality datasetRef')\n assertImmutableRef(result.evaluatorRef, 'answer-quality evaluatorRef')\n if (\n !Array.isArray(result.finalScenarioIds) ||\n result.finalScenarioIds.length < 2 ||\n new Set(result.finalScenarioIds).size !== result.finalScenarioIds.length ||\n result.finalScenarioIds.some((id) => typeof id !== 'string' || id.trim().length === 0)\n ) {\n throw new Error('answer-quality evidence requires at least 2 unique final scenario IDs')\n }\n if (!result.metrics || typeof result.metrics !== 'object' || Array.isArray(result.metrics)) {\n throw new Error('answer-quality evidence requires non-empty finite metrics')\n }\n const metrics = Object.entries(result.metrics)\n if (\n metrics.length === 0 ||\n metrics.some(([key, value]) => key.trim().length === 0 || !Number.isFinite(value))\n ) {\n throw new Error('answer-quality evidence requires non-empty finite metrics')\n }\n if (!result.cost || typeof result.cost !== 'object') {\n throw new Error('answer-quality evidence requires cost accounting')\n }\n if (\n !Number.isFinite(result.cost.totalCostUsd) ||\n result.cost.totalCostUsd < 0 ||\n typeof result.cost.accountingComplete !== 'boolean' ||\n !Array.isArray(result.cost.incompleteReasons) ||\n result.cost.incompleteReasons.some((reason) => typeof reason !== 'string' || !reason.trim())\n ) {\n throw new Error('answer-quality evidence has invalid cost accounting')\n }\n if (result.cost.accountingComplete && result.cost.incompleteReasons.length > 0) {\n throw new Error('complete answer-quality cost accounting cannot include incomplete reasons')\n }\n}\n\nexport function ragAnswerEvidenceRejectionReasons(\n evidence: RagAnswerEvidence,\n costCeiling: number | undefined,\n): string[] {\n const reasons: string[] = []\n if (!evidence.passed) reasons.push('answer-quality evaluation failed')\n if (!evidence.cost.accountingComplete) {\n reasons.push('answer-quality final comparison has incomplete cost accounting')\n }\n if (costCeiling === undefined) {\n reasons.push('answer-quality promotion requires answerQualityCostCeiling')\n } else if (exceedsCostCeiling(evidence.cost.totalCostUsd, costCeiling)) {\n reasons.push(\n `answer-quality final comparison cost ${evidence.cost.totalCostUsd} exceeds ${costCeiling}`,\n )\n }\n return reasons\n}\n\nfunction exceedsCostCeiling(totalCostUsd: number, costCeiling: number): boolean {\n const tolerance = Number.EPSILON * Math.max(1, Math.abs(totalCostUsd), Math.abs(costCeiling)) * 8\n return totalCostUsd - costCeiling > tolerance\n}\n","import { canonicalJson } from '@tangle-network/agent-eval'\nimport {\n type CompareOptimizationMethodsOptions,\n compareOptimizationMethods,\n type DispatchContext,\n type MutableSurface,\n type OptimizationMethod,\n type OptimizationMethodComparison,\n type OptimizationMethodRunOptions,\n type Scenario,\n surfaceHash,\n} from '@tangle-network/agent-eval/campaign'\nimport type { AgentCandidateJsonValue as JsonValue } from '@tangle-network/agent-interface'\nimport { assertImmutableRef } from './immutable-ref'\n\nexport interface SerializedCandidateCodec<TCandidate extends JsonValue> {\n serialize(candidate: TCandidate): string\n parse(surface: string): TCandidate\n}\n\nexport interface SerializedCandidate<TCandidate extends JsonValue> {\n value: TCandidate\n surface: string\n surfaceHash: string\n}\n\ntype ComparisonOptions<TScenario extends Scenario, TArtifact> = Omit<\n CompareOptimizationMethodsOptions<TScenario, TArtifact>,\n | 'methods'\n | 'baselineSurface'\n | 'trainScenarios'\n | 'selectionScenarios'\n | 'testScenarios'\n | 'dispatchWithSurface'\n | 'dispatchRef'\n | 'optimizationRunOptions'\n>\n\nexport interface RunSerializedKnowledgeOptimizationOptions<\n TCandidate extends JsonValue,\n TScenario extends Scenario,\n TArtifact,\n> extends ComparisonOptions<TScenario, TArtifact> {\n /** Immutable identity for candidate execution, judges, models, indexes, and external settings. */\n executionRef: string\n baseline: TCandidate\n method: OptimizationMethod<TScenario, TArtifact>\n trainScenarios: readonly TScenario[]\n selectionScenarios: readonly TScenario[]\n finalScenarios: readonly TScenario[]\n dispatchCandidate(input: {\n candidate: TCandidate\n candidateSurface: string\n candidateSurfaceHash: string\n scenario: TScenario\n context: DispatchContext\n }): Promise<TArtifact>\n codec?: SerializedCandidateCodec<TCandidate>\n /** Detects duplicated cases whose IDs differ within or across data partitions. */\n scenarioFingerprint?: (scenario: TScenario) => string\n optimizationRunOptions?: Omit<OptimizationMethodRunOptions<TScenario, TArtifact>, 'dispatchRef'>\n}\n\nexport interface RunSerializedKnowledgeOptimizationResult<TCandidate extends JsonValue> {\n methodName: string\n baseline: SerializedCandidate<TCandidate>\n winner: SerializedCandidate<TCandidate>\n comparison: OptimizationMethodComparison\n}\n\n/**\n * Runs one complete agent-eval method over a serialized knowledge candidate.\n * The method receives train and selection data; agent-eval owns final scoring.\n */\nexport async function runSerializedKnowledgeOptimization<\n TCandidate extends JsonValue,\n TScenario extends Scenario,\n TArtifact,\n>(\n options: RunSerializedKnowledgeOptimizationOptions<TCandidate, TScenario, TArtifact>,\n): Promise<RunSerializedKnowledgeOptimizationResult<TCandidate>> {\n assertCompleteOptimizationMethod(options.method)\n assertImmutableRef(options.executionRef, 'knowledge optimization executionRef')\n const codec = options.codec ?? jsonCandidateCodec<TCandidate>()\n const baseline = normalizeCandidate(options.baseline, codec, 'baseline')\n const dispatchRef = [\n 'knowledge-optimization',\n options.executionRef,\n baseline.surfaceHash,\n surfaceHash(options.method.name),\n ].join(':')\n assertPartitionContent(\n options.trainScenarios,\n options.selectionScenarios,\n options.finalScenarios,\n options.scenarioFingerprint ?? scenarioContentFingerprint,\n )\n\n const method = canonicalCandidateMethod(options.method, codec)\n const {\n baseline: _baseline,\n method: _method,\n trainScenarios,\n selectionScenarios,\n finalScenarios,\n dispatchCandidate,\n executionRef: _executionRef,\n codec: _codec,\n scenarioFingerprint: _scenarioFingerprint,\n ...comparisonOptions\n } = options\n const optimizationRunOptions = {\n ...(comparisonOptions.reps !== undefined ? { reps: comparisonOptions.reps } : {}),\n ...(comparisonOptions.resumable !== undefined\n ? { resumable: comparisonOptions.resumable }\n : {}),\n ...(comparisonOptions.labeledStore !== undefined\n ? { labeledStore: comparisonOptions.labeledStore }\n : {}),\n ...(comparisonOptions.captureSource !== undefined\n ? { captureSource: comparisonOptions.captureSource }\n : {}),\n ...(comparisonOptions.captureSourceVersionHash !== undefined\n ? { captureSourceVersionHash: comparisonOptions.captureSourceVersionHash }\n : {}),\n ...(comparisonOptions.maxConcurrency !== undefined\n ? { maxConcurrency: comparisonOptions.maxConcurrency }\n : {}),\n ...(comparisonOptions.dispatchTimeoutMs !== undefined\n ? { dispatchTimeoutMs: comparisonOptions.dispatchTimeoutMs }\n : {}),\n ...(comparisonOptions.repo !== undefined ? { repo: comparisonOptions.repo } : {}),\n ...(comparisonOptions.tracing !== undefined ? { tracing: comparisonOptions.tracing } : {}),\n ...(comparisonOptions.expectUsage !== undefined\n ? { expectUsage: comparisonOptions.expectUsage }\n : {}),\n ...(comparisonOptions.now !== undefined ? { now: comparisonOptions.now } : {}),\n ...(comparisonOptions.buildTraceWriter !== undefined\n ? { buildTraceWriter: comparisonOptions.buildTraceWriter }\n : {}),\n ...(comparisonOptions.storage !== undefined ? { storage: comparisonOptions.storage } : {}),\n ...(comparisonOptions.cellPlacement !== undefined\n ? { cellPlacement: comparisonOptions.cellPlacement }\n : {}),\n ...(comparisonOptions.optimizationRunOptions ?? {}),\n dispatchRef,\n }\n const comparison = await compareOptimizationMethods<TScenario, TArtifact>({\n ...comparisonOptions,\n dispatchRef,\n optimizationRunOptions,\n methods: [method],\n baselineSurface: baseline.surface,\n trainScenarios: trainScenarios.map((scenario) => structuredClone(scenario)),\n selectionScenarios: selectionScenarios.map((scenario) => structuredClone(scenario)),\n testScenarios: finalScenarios.map((scenario) => structuredClone(scenario)),\n dispatchWithSurface: async (surface, scenario, context) => {\n const candidate = normalizeSurface(surface, codec, 'candidate')\n return dispatchCandidate({\n candidate: structuredClone(candidate.value),\n candidateSurface: candidate.surface,\n candidateSurfaceHash: candidate.surfaceHash,\n scenario,\n context,\n })\n },\n })\n const winner = normalizeSurface(comparison.best.winnerSurface, codec, 'winner')\n return {\n methodName: options.method.name,\n baseline,\n winner,\n comparison,\n }\n}\n\nfunction assertCompleteOptimizationMethod(method: unknown): void {\n const candidate = method as { name?: unknown; optimize?: unknown } | null | undefined\n if (\n !candidate ||\n typeof candidate.name !== 'string' ||\n candidate.name.trim().length === 0 ||\n typeof candidate.optimize !== 'function'\n ) {\n throw new Error(\n 'knowledge optimization requires a complete OptimizationMethod with a non-empty name and optimize()',\n )\n }\n}\n\nexport function jsonCandidateCodec<\n TCandidate extends JsonValue,\n>(): SerializedCandidateCodec<TCandidate> {\n return {\n serialize: (candidate) => canonicalJson(candidate),\n parse(surface) {\n let parsed: unknown\n try {\n parsed = JSON.parse(surface)\n } catch (error) {\n throw new Error('serialized knowledge candidate is not valid JSON', { cause: error })\n }\n return parsed as TCandidate\n },\n }\n}\n\nexport function jsonObjectCandidateCodec<\n TCandidate extends Record<string, JsonValue>,\n>(): SerializedCandidateCodec<TCandidate> {\n const codec = jsonCandidateCodec<TCandidate>()\n return {\n serialize: codec.serialize,\n parse(surface) {\n const candidate = codec.parse(surface)\n if (!candidate || typeof candidate !== 'object' || Array.isArray(candidate)) {\n throw new Error('serialized knowledge candidate must be a JSON object')\n }\n return candidate\n },\n }\n}\n\nexport function scenarioContentFingerprint(scenario: Scenario): string {\n const {\n id: _id,\n tags: _tags,\n split: _split,\n splitTag: _splitTag,\n ...content\n } = scenario as Scenario & { split?: unknown; splitTag?: unknown }\n return surfaceHash(canonicalJson(content as JsonValue))\n}\n\nfunction canonicalCandidateMethod<\n TCandidate extends JsonValue,\n TScenario extends Scenario,\n TArtifact,\n>(\n method: OptimizationMethod<TScenario, TArtifact>,\n codec: SerializedCandidateCodec<TCandidate>,\n): OptimizationMethod<TScenario, TArtifact> {\n return {\n name: method.name,\n async optimize(input) {\n const result = await method.optimize(input)\n const winner = normalizeSurface(result.winnerSurface, codec, `${method.name} winner`)\n return {\n ...result,\n winnerSurface: winner.surface,\n }\n },\n }\n}\n\nfunction normalizeCandidate<TCandidate extends JsonValue>(\n candidate: TCandidate,\n codec: SerializedCandidateCodec<TCandidate>,\n label: string,\n): SerializedCandidate<TCandidate> {\n let surface: string\n try {\n surface = codec.serialize(candidate)\n } catch (error) {\n throw new Error(`${label} serializer failed`, { cause: error })\n }\n return normalizeSurface(surface, codec, label)\n}\n\nfunction normalizeSurface<TCandidate extends JsonValue>(\n surface: MutableSurface,\n codec: SerializedCandidateCodec<TCandidate>,\n label: string,\n): SerializedCandidate<TCandidate> {\n if (typeof surface !== 'string' || surface.trim().length === 0) {\n throw new Error(`${label} must be a non-empty serialized string`)\n }\n let value: TCandidate\n try {\n value = codec.parse(surface)\n } catch (error) {\n const detail = error instanceof Error ? `: ${error.message}` : ''\n throw new Error(`${label} parser failed${detail}`, { cause: error })\n }\n let canonicalSurface: string\n try {\n canonicalSurface = codec.serialize(value)\n } catch (error) {\n throw new Error(`${label} serializer failed after parsing`, { cause: error })\n }\n if (typeof canonicalSurface !== 'string' || canonicalSurface.trim().length === 0) {\n throw new Error(`${label} serializer must return a non-empty string`)\n }\n const roundTrip = codec.serialize(codec.parse(canonicalSurface))\n if (roundTrip !== canonicalSurface) {\n throw new Error(`${label} codec must round-trip to one canonical surface`)\n }\n return {\n value: structuredClone(value),\n surface: canonicalSurface,\n surfaceHash: surfaceHash(canonicalSurface),\n }\n}\n\nfunction assertPartitionContent<TScenario extends Scenario>(\n train: readonly TScenario[],\n selection: readonly TScenario[],\n final: readonly TScenario[],\n fingerprint: ((scenario: TScenario) => string) | undefined,\n): void {\n if (!fingerprint) return\n const owner = new Map<string, { partition: string; scenarioId: string }>()\n for (const [name, scenarios] of [\n ['train', train],\n ['selection', selection],\n ['final', final],\n ] as const) {\n for (const scenario of scenarios) {\n const identity = fingerprint(scenario)\n if (typeof identity !== 'string' || identity.trim().length === 0) {\n throw new Error(`scenarioFingerprint returned no identity for '${scenario.id}'`)\n }\n const prior = owner.get(identity)\n if (prior) {\n const scope =\n prior.partition === name\n ? `${name} partition duplicates`\n : `${prior.partition}/${name} partitions duplicate`\n throw new Error(\n `serialized knowledge optimization ${scope} scenario content at '${prior.scenarioId}'/'${scenario.id}'`,\n )\n }\n owner.set(identity, { partition: name, scenarioId: scenario.id })\n }\n }\n}\n","import type { RagGapFinding } from '../rag-improvement-loop'\nimport type { KnowledgeIndex } from '../types'\nimport { type ValidateKnowledgeResult, validateKnowledgeIndex } from '../validate'\nimport type { KnowledgeBaseQualityOptions, KnowledgeBaseQualityReport } from './contracts'\nimport { detectNearDuplicatePages } from './near-duplicates'\n\nexport function scoreKnowledgeBaseIndex(\n index: KnowledgeIndex,\n options: KnowledgeBaseQualityOptions = {},\n): KnowledgeBaseQualityReport {\n return scoreValidatedKnowledgeBaseIndex(index, options, validateKnowledgeIndex(index, options))\n}\n\n/** Internal scoring over the validation of this exact index and strictness policy. */\nexport function scoreValidatedKnowledgeBaseIndex(\n index: KnowledgeIndex,\n options: KnowledgeBaseQualityOptions,\n validation: ValidateKnowledgeResult,\n): KnowledgeBaseQualityReport {\n const now = options.now ?? new Date()\n const staleSourceCount = index.sources.filter((source) => {\n return source.validUntil ? Date.parse(source.validUntil) < now.getTime() : false\n }).length\n const sourceHashCounts = new Map<string, number>()\n for (const source of index.sources) {\n sourceHashCounts.set(source.contentHash, (sourceHashCounts.get(source.contentHash) ?? 0) + 1)\n }\n const duplicateSourceHashCount = [...sourceHashCounts.values()].filter(\n (count) => count > 1,\n ).length\n const pagesWithInlineCitations = index.pages.filter(\n (page) => sourceRefs(page.text).length > 0,\n ).length\n const pagesWithSources = index.pages.filter((page) => page.sourceIds.length > 0).length\n const nearDuplicates = detectNearDuplicatePages(index.pages, options.nearDuplicates)\n const maxNearDuplicatePageRate = unitInterval(\n options.maxNearDuplicatePageRate ?? 1,\n 'maxNearDuplicatePageRate',\n )\n const metrics = {\n page_count: index.pages.length,\n source_count: index.sources.length,\n citation_rate: index.pages.length === 0 ? 1 : pagesWithInlineCitations / index.pages.length,\n source_backed_page_rate: index.pages.length === 0 ? 1 : pagesWithSources / index.pages.length,\n stale_source_rate: index.sources.length === 0 ? 0 : staleSourceCount / index.sources.length,\n duplicate_source_hash_rate:\n index.sources.length === 0 ? 0 : duplicateSourceHashCount / index.sources.length,\n lint_error_count: validation.findings.filter((finding) => finding.severity === 'error').length,\n lint_warning_count: validation.findings.filter((finding) => finding.severity === 'warning')\n .length,\n near_duplicate_page_rate: nearDuplicates.duplicatePageRate,\n near_duplicate_page_count: nearDuplicates.duplicatePageCount,\n near_duplicate_pair_count: nearDuplicates.duplicatePairCount,\n }\n const findings: RagGapFinding[] = []\n if (metrics.lint_error_count > 0) {\n findings.push({\n id: 'kb:lint-errors',\n kind: 'unknown',\n severity: 'critical',\n message: `${metrics.lint_error_count} validation error(s) in the knowledge index.`,\n evidence: { lint_error_count: metrics.lint_error_count },\n })\n }\n if (metrics.citation_rate < (options.minCitationRate ?? 0)) {\n findings.push({\n id: 'kb:citation-rate',\n kind: 'missing-source',\n severity: 'error',\n message: 'Inline citation coverage is below the configured minimum.',\n evidence: { citation_rate: metrics.citation_rate },\n })\n }\n if (metrics.stale_source_rate > (options.maxStaleSourceRate ?? 1)) {\n findings.push({\n id: 'kb:stale-source-rate',\n kind: 'stale-source',\n severity: 'error',\n message: 'Stale source rate exceeds the configured maximum.',\n evidence: { stale_source_rate: metrics.stale_source_rate },\n })\n }\n if (nearDuplicates.truncated && maxNearDuplicatePageRate < 1) {\n findings.push({\n id: 'kb:near-duplicate-analysis-truncated',\n kind: 'unknown',\n severity: 'error',\n message:\n 'Near-duplicate analysis reached a configured bound, so the duplicate-page gate cannot be evaluated completely.',\n evidence: {\n candidate_pair_count: nearDuplicates.candidatePairCount,\n compared_pair_count: nearDuplicates.comparedPairCount,\n duplicate_pair_count: nearDuplicates.duplicatePairCount,\n },\n })\n } else if (metrics.near_duplicate_page_rate > maxNearDuplicatePageRate) {\n findings.push({\n id: 'kb:near-duplicate-page-rate',\n kind: 'unknown',\n severity: 'error',\n message: 'Near-duplicate page rate exceeds the configured maximum.',\n evidence: {\n near_duplicate_page_rate: metrics.near_duplicate_page_rate,\n near_duplicate_page_count: metrics.near_duplicate_page_count,\n near_duplicate_pair_count: metrics.near_duplicate_pair_count,\n threshold: nearDuplicates.threshold,\n },\n })\n }\n return { ok: findings.length === 0, metrics, nearDuplicates, findings }\n}\n\nfunction sourceRefs(text: string): string[] {\n const refs: string[] = []\n const regex = /\\[\\^([A-Za-z0-9_-]+)(?:#([A-Za-z0-9_.:-]+))?\\]/g\n let match = regex.exec(text)\n while (match !== null) {\n refs.push(match[0])\n match = regex.exec(text)\n }\n return refs\n}\n\nfunction unitInterval(value: number, name: string): number {\n if (!Number.isFinite(value) || value < 0 || value > 1) {\n throw new Error(`${name} must be a finite number in [0, 1]`)\n }\n return value\n}\n","/**\n * Deterministic claim grounding: is a claim present in a text?\n *\n * The check is text presence, not a model call. RAG answer scoring uses it to\n * test whether a generated claim is supported by the retrieved context.\n */\n\nexport interface GroundingResult {\n /** True when the claim is sufficiently present in the page text. */\n grounded: boolean\n /** How the claim matched (or why it didn't). For audit/notes. */\n mode: 'verbatim' | 'normalized' | 'overlap' | 'absent' | 'empty-claim' | 'empty-text'\n /**\n * Fraction of the claim's content words found in the page text. 1 for a\n * verbatim/normalized hit; the measured overlap otherwise.\n */\n overlap: number\n /** Content words present in the claim but NOT in the page text. */\n missingWords: string[]\n}\n\nexport interface GroundClaimOptions {\n /**\n * Minimum fraction of the claim's content words that must appear in the page\n * text to count as a close paraphrase when there is no verbatim/normalized\n * hit. Default 0.7 — a high bar, because a misattribution is exactly a claim\n * whose specific words the page does not contain.\n */\n minOverlap?: number\n /**\n * Content words shorter than this are ignored (drops \"the\", \"of\", \"is\", …)\n * and never count toward overlap. Default 3.\n */\n minWordLength?: number\n}\n\n/**\n * Stopwords stripped before overlap scoring so the bar measures the claim's\n * SUBSTANTIVE words (the numbers, nouns, methods it asserts), not filler a\n * misattributed page would trivially share with the real one.\n */\nconst stopwords = new Set([\n 'the',\n 'a',\n 'an',\n 'and',\n 'or',\n 'but',\n 'of',\n 'to',\n 'in',\n 'on',\n 'for',\n 'with',\n 'as',\n 'by',\n 'at',\n 'from',\n 'that',\n 'this',\n 'these',\n 'those',\n 'it',\n 'its',\n 'is',\n 'are',\n 'was',\n 'were',\n 'be',\n 'been',\n 'being',\n 'has',\n 'have',\n 'had',\n 'can',\n 'will',\n 'would',\n 'should',\n 'may',\n 'might',\n 'not',\n 'no',\n 'than',\n 'then',\n 'over',\n 'under',\n 'about',\n 'into',\n 'their',\n 'they',\n 'them',\n])\n\n/** Normalize for presence checks: lowercase, collapse whitespace + punctuation. */\nfunction normalize(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^\\p{L}\\p{N}\\s]+/gu, ' ')\n .replace(/\\s+/g, ' ')\n .trim()\n}\n\n/** The claim's substantive content words (deduped, stopwords + short words removed). */\nfunction contentWords(claim: string, minWordLength: number): string[] {\n const words = normalize(claim)\n .split(' ')\n .filter((word) => word.length >= minWordLength && !stopwords.has(word))\n return [...new Set(words)]\n}\n\n/**\n * Is `claim` grounded in `pageText`? Deterministic, no model call:\n *\n * 1. verbatim — the claim string appears as-is (case-insensitive).\n * 2. normalized — the claim appears after collapsing punctuation/whitespace\n * on both sides (so \"5.4x\" vs \"5.4 x\", smart quotes, etc. still match).\n * 3. overlap — a close paraphrase: at least `minOverlap` of the claim's\n * substantive content words appear in the page text. A misattributed page\n * fails here because the SPECIFIC words the claim asserts are absent.\n *\n * Returns the match mode, the measured overlap, and the missing content words,\n * so a caller can state why a claim grounded or did not.\n */\nexport function groundClaimInText(\n claim: string,\n pageText: string,\n options: GroundClaimOptions = {},\n): GroundingResult {\n const minOverlap = options.minOverlap ?? 0.7\n const minWordLength = Math.max(1, options.minWordLength ?? 3)\n\n const claimTrimmed = claim.trim()\n if (!claimTrimmed) return { grounded: false, mode: 'empty-claim', overlap: 0, missingWords: [] }\n if (!pageText.trim()) return { grounded: false, mode: 'empty-text', overlap: 0, missingWords: [] }\n\n const haystackLower = pageText.toLowerCase()\n if (haystackLower.includes(claimTrimmed.toLowerCase())) {\n return { grounded: true, mode: 'verbatim', overlap: 1, missingWords: [] }\n }\n\n const haystackNorm = normalize(pageText)\n const claimNorm = normalize(claimTrimmed)\n if (claimNorm && haystackNorm.includes(claimNorm)) {\n return { grounded: true, mode: 'normalized', overlap: 1, missingWords: [] }\n }\n\n const words = contentWords(claimTrimmed, minWordLength)\n if (words.length === 0) {\n // The claim has no substantive content words (all stopwords/short). With no\n // verbatim/normalized hit there is nothing to ground — treat as absent.\n return { grounded: false, mode: 'absent', overlap: 0, missingWords: [] }\n }\n // Word-boundary presence so \"rotary\" does not match inside \"rotaryxyz\".\n const present = words.filter((word) =>\n new RegExp(`\\\\b${word.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\b`).test(haystackNorm),\n )\n const missingWords = words.filter((word) => !present.includes(word))\n const overlap = present.length / words.length\n const grounded = overlap >= minOverlap\n return { grounded, mode: grounded ? 'overlap' : 'absent', overlap, missingWords }\n}\n","/**\n * The mean of a set of measurements.\n *\n * A measurement that is not a finite number is not a measurement: it is a\n * scorer that divided by zero or an adapter that answered with nothing usable.\n * Averaging it in would spread one broken probe across the whole aggregate,\n * and carrying it through would make the aggregate itself unusable — a\n * non-finite `scoreMean` fails every numeric comparison in the ranking\n * comparator, so the candidate carrying it falls through to the identifier\n * tie-break and places by name rather than by what it scored. Such values are\n * left out, and the mean reports what was actually measured.\n *\n * An empty set answers `0`. That is a reported score, not an absence, and it\n * is the behavior every caller in this package already depends on.\n */\nexport 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","import { groundClaimInText } from '../claim-grounding'\nimport { mean } from '../statistics'\nimport type {\n RagAnswerEvalArtifact,\n RagAnswerEvalScenario,\n RagAnswerQualityJudgeOptions,\n RagEvalCitation,\n RagEvalClaim,\n RagEvalContext,\n RagRequiredContext,\n} from './contracts'\n\nexport function requiredContextTargets(scenario: RagAnswerEvalScenario): RagRequiredContext[] {\n if (scenario.requiredContext?.length) return [...scenario.requiredContext]\n return (scenario.expectedClaims ?? []).map((text) => ({ text }))\n}\n\nexport function requiredContextTexts(scenario: RagAnswerEvalScenario): string[] {\n return requiredContextTargets(scenario).flatMap((target) => (target.text ? [target.text] : []))\n}\n\nexport function contextMatchesTarget(context: RagEvalContext, target: RagRequiredContext): boolean {\n if (target.id && context.id === target.id) return true\n if (target.pageId && context.pageId === target.pageId) return true\n if (target.sourceId && context.sourceId === target.sourceId) return true\n if (target.anchorId && context.anchorId === target.anchorId) return true\n if (target.text && textSupportScore(target.text, context.text) >= 0.7) return true\n return false\n}\n\nexport function contextIsRelevant(\n context: RagEvalContext,\n scenario: RagAnswerEvalScenario,\n): boolean {\n return contextRelevanceScore(context, scenario) >= 0.3\n}\n\nexport function contextRelevanceScore(\n context: RagEvalContext,\n scenario: RagAnswerEvalScenario,\n): number {\n const targets = [\n scenario.query,\n scenario.referenceAnswer,\n ...(scenario.expectedClaims ?? []),\n ...requiredContextTexts(scenario),\n ].filter((value): value is string => Boolean(value?.trim()))\n if (targets.length === 0) return 1\n return Math.max(...targets.map((target) => textSupportScore(target, context.text)))\n}\n\nexport function claimSupport(\n claim: string,\n contexts: readonly RagEvalContext[],\n options: Pick<RagAnswerQualityJudgeOptions, 'minClaimSupport'>,\n): boolean {\n if (contexts.length === 0) return false\n const combined = contexts.map((context) => context.text).join('\\n\\n')\n const deterministic = groundClaimInText(claim, combined, {\n minOverlap: options.minClaimSupport ?? 0.7,\n })\n return (\n deterministic.grounded || textSupportScore(claim, combined) >= (options.minClaimSupport ?? 0.7)\n )\n}\n\nexport function scoreCitations(\n claims: readonly RagEvalClaim[],\n artifact: RagAnswerEvalArtifact,\n scenario: RagAnswerEvalScenario,\n options: Pick<RagAnswerQualityJudgeOptions, 'minClaimSupport'>,\n): { support: number; citedClaimCount: number; supportedCitationCount: number } {\n if (claims.length === 0)\n return { support: scenario.unanswerable ? 1 : 0, citedClaimCount: 0, supportedCitationCount: 0 }\n const citations = artifact.citations ?? []\n const citedClaims = claims.filter((claim) => citationsForClaim(claim, citations).length > 0)\n if (citedClaims.length === 0) {\n return {\n support: scenario.requireCitations ? 0 : 1,\n citedClaimCount: 0,\n supportedCitationCount: 0,\n }\n }\n let supportedCitationCount = 0\n for (const claim of citedClaims) {\n const citedContexts = contextsForClaim(claim, citations, artifact.contexts)\n if (claimSupport(claim.text, citedContexts, options)) supportedCitationCount += 1\n }\n return {\n support: supportedCitationCount / citedClaims.length,\n citedClaimCount: citedClaims.length,\n supportedCitationCount,\n }\n}\n\nfunction citationsForClaim(\n claim: RagEvalClaim,\n citations: readonly RagEvalCitation[],\n): RagEvalCitation[] {\n const claimCitationIds = new Set(claim.citationIds ?? [])\n return citations.filter((citation) => {\n return citation.claimId === claim.id || (citation.id && claimCitationIds.has(citation.id))\n })\n}\n\nfunction contextsForClaim(\n claim: RagEvalClaim,\n citations: readonly RagEvalCitation[],\n contexts: readonly RagEvalContext[],\n): readonly RagEvalContext[] {\n const matchedCitations = citationsForClaim(claim, citations)\n const matchedContexts = contexts.filter((context) =>\n matchedCitations.some((citation) => {\n if (citation.contextId && citation.contextId === context.id) return true\n if (citation.pageId && citation.pageId === context.pageId) return true\n if (citation.sourceId && citation.sourceId === context.sourceId) return true\n if (citation.anchorId && citation.anchorId === context.anchorId) return true\n return false\n }),\n )\n return matchedContexts.length > 0 ? matchedContexts : contexts\n}\n\nexport function scoreAnswerRelevance(\n artifact: RagAnswerEvalArtifact,\n scenario: RagAnswerEvalScenario,\n abstained: boolean,\n): number {\n if (scenario.unanswerable) return abstained ? 1 : 0\n if (abstained) return 0\n const targets = [\n scenario.referenceAnswer,\n ...(scenario.expectedClaims ?? []),\n scenario.query,\n ].filter((value): value is string => Boolean(value?.trim()))\n return Math.max(...targets.map((target) => textSupportScore(target, artifact.answer)))\n}\n\nexport function scoreAnswerCorrectness(\n artifact: RagAnswerEvalArtifact,\n scenario: RagAnswerEvalScenario,\n abstained: boolean,\n): number {\n if (scenario.unanswerable) return abstained ? 1 : 0\n const expected = scenario.expectedClaims ?? []\n const forbidden = scenario.forbiddenClaims ?? []\n const expectedScore =\n expected.length === 0\n ? scoreAnswerRelevance(artifact, scenario, abstained)\n : mean(expected.map((claim) => textSupportScore(claim, artifact.answer)))\n const forbiddenPenalty =\n forbidden.length === 0\n ? 0\n : forbidden.filter((claim) => textSupportScore(claim, artifact.answer) >= 0.7).length /\n forbidden.length\n return clamp01(expectedScore * (1 - forbiddenPenalty))\n}\n\nexport function normalizeClaims(artifact: RagAnswerEvalArtifact): RagEvalClaim[] {\n if (artifact.claims?.length) return [...artifact.claims]\n return splitSentences(artifact.answer).map((text, index) => ({ id: `claim-${index + 1}`, text }))\n}\n\nfunction splitSentences(text: string): string[] {\n return text\n .split(/(?<=[.!?])\\s+/)\n .map((sentence) => sentence.trim())\n .filter((sentence) => sentence.length > 0 && !looksLikeAbstention(sentence))\n}\n\nexport function looksLikeAbstention(answer: string): boolean {\n const normalized = answer.toLowerCase()\n return [\n \"i don't know\",\n 'i do not know',\n 'not enough information',\n 'cannot answer',\n \"can't answer\",\n 'insufficient information',\n 'no reliable answer',\n ].some((phrase) => normalized.includes(phrase))\n}\n\nfunction textSupportScore(needle: string, haystack: string): number {\n const needleWords = contentWords(needle)\n if (needleWords.length === 0) return 0\n const haystackWords = new Set(contentWords(haystack))\n const present = needleWords.filter((word) => haystackWords.has(word))\n return present.length / needleWords.length\n}\n\nfunction contentWords(text: string): string[] {\n const normalized = text\n .toLowerCase()\n .replace(/[^\\p{L}\\p{N}\\s]+/gu, ' ')\n .split(/\\s+/)\n .map((word) => stem(word.trim()))\n .filter((word) => (word.length >= 3 || /^\\d+$/.test(word)) && !stopwords.has(word))\n return [...new Set(normalized)]\n}\n\nfunction stem(word: string): string {\n if (word.endsWith('ies') && word.length > 4) return `${word.slice(0, -3)}y`\n if (word.endsWith('ing') && word.length > 5) return word.slice(0, -3)\n if (word.endsWith('ed') && word.length > 4) return word.slice(0, -2)\n if (word.endsWith('s') && word.length > 3) return word.slice(0, -1)\n return word\n}\n\nexport function neutralScore(condition: boolean): number {\n return condition ? 1 : 0\n}\n\nexport function clamp01(value: number): number {\n if (!Number.isFinite(value)) return 0\n return Math.max(0, Math.min(1, value))\n}\n\nconst stopwords = new Set([\n 'the',\n 'a',\n 'an',\n 'and',\n 'or',\n 'but',\n 'of',\n 'to',\n 'in',\n 'on',\n 'for',\n 'with',\n 'as',\n 'by',\n 'at',\n 'from',\n 'that',\n 'this',\n 'these',\n 'those',\n 'it',\n 'its',\n 'is',\n 'are',\n 'was',\n 'were',\n 'be',\n 'been',\n 'being',\n 'has',\n 'have',\n 'had',\n 'can',\n 'will',\n 'would',\n 'should',\n 'may',\n 'might',\n 'not',\n 'no',\n 'than',\n 'then',\n 'over',\n 'under',\n 'about',\n 'into',\n 'their',\n 'they',\n 'them',\n 'what',\n 'when',\n 'where',\n 'who',\n 'why',\n 'how',\n])\n","import { clamp01, normalizeClaims, requiredContextTexts } from './answer'\nimport type { ExternalRagEvalScore, RagAnswerEvalCase, RagEvalMetricKey } from './contracts'\n\nconst metricAliases: Record<string, RagEvalMetricKey> = {\n answer_correctness: 'answer_correctness',\n answer_relevance: 'answer_relevance',\n answer_relevancy: 'answer_relevance',\n answerrelevancy: 'answer_relevance',\n context_precision: 'context_precision',\n context_recall: 'context_recall',\n context_relevance: 'context_relevance',\n context_relevancy: 'context_relevance',\n context_sufficiency: 'context_sufficiency',\n contextual_precision: 'context_precision',\n contextual_recall: 'context_recall',\n contextual_relevancy: 'context_relevance',\n faithfulness: 'faithfulness',\n groundedness: 'groundedness',\n claim_recall: 'context_recall',\n claim_precision: 'faithfulness',\n citation_support: 'citation_support',\n abstention: 'abstention',\n unsupported_answer_rate: 'unsupported_answer_rate',\n}\n\nexport function normalizeExternalRagScores(\n scores: readonly ExternalRagEvalScore[],\n): Record<string, Record<RagEvalMetricKey, number>> {\n const normalized: Record<string, Record<RagEvalMetricKey, number>> = {}\n for (const item of scores) {\n const provider = item.provider || 'custom'\n const providerScores = (normalized[provider] ?? {}) as Record<RagEvalMetricKey, number>\n for (const [key, value] of Object.entries(item.scores)) {\n const canonical = metricAliases[normalizeMetricName(key)]\n if (!canonical) continue\n if (Number.isFinite(value)) providerScores[canonical] = clamp01(value)\n }\n normalized[provider] = providerScores\n }\n return normalized\n}\n\nexport function toRagasEvaluationRows(cases: readonly RagAnswerEvalCase[]) {\n return cases.map(({ scenario, artifact }) => ({\n user_input: scenario.query,\n response: artifact.answer,\n retrieved_contexts: artifact.contexts.map((context) => context.text),\n reference: scenario.referenceAnswer,\n reference_contexts: requiredContextTexts(scenario),\n }))\n}\n\nexport function toDeepEvalTestCases(cases: readonly RagAnswerEvalCase[]) {\n return cases.map(({ scenario, artifact }) => ({\n input: scenario.query,\n actual_output: artifact.answer,\n expected_output: scenario.referenceAnswer,\n retrieval_context: artifact.contexts.map((context) => context.text),\n context: requiredContextTexts(scenario),\n }))\n}\n\nexport function toTruLensRecords(cases: readonly RagAnswerEvalCase[]) {\n return cases.map(({ scenario, artifact }) => ({\n input: scenario.query,\n output: artifact.answer,\n context: artifact.contexts.map((context) => context.text).join('\\n\\n'),\n }))\n}\n\nexport function toRagCheckerRecords(cases: readonly RagAnswerEvalCase[]) {\n return cases.map(({ scenario, artifact }) => ({\n query_id: scenario.id,\n query: scenario.query,\n gt_answer: scenario.referenceAnswer,\n response: artifact.answer,\n retrieved_context: artifact.contexts.map((context) => ({\n doc_id: context.id,\n text: context.text,\n })),\n claims: normalizeClaims(artifact).map((claim) => claim.text),\n }))\n}\n\nfunction normalizeMetricName(metric: string): string {\n return metric\n .trim()\n .toLowerCase()\n .replace(/[@/.-]+/g, '_')\n .replace(/\\s+/g, '_')\n}\n","import type { JudgeConfig } from '@tangle-network/agent-eval/campaign'\nimport type { RagGapFinding } from '../rag-improvement-loop'\nimport { mean } from '../statistics'\nimport {\n claimSupport,\n clamp01,\n contextIsRelevant,\n contextMatchesTarget,\n contextRelevanceScore,\n looksLikeAbstention,\n neutralScore,\n normalizeClaims,\n requiredContextTargets,\n scoreAnswerCorrectness,\n scoreAnswerRelevance,\n scoreCitations,\n} from './answer'\nimport type {\n RagAnswerEvalArtifact,\n RagAnswerEvalScenario,\n RagAnswerMetricSummary,\n RagAnswerQualityJudgeOptions,\n RagEvalMetricKey,\n} from './contracts'\nimport { normalizeExternalRagScores } from './providers'\n\nconst defaultThresholds: Partial<Record<RagEvalMetricKey, number>> = {\n context_precision: 0.5,\n context_recall: 0.8,\n context_relevance: 0.5,\n context_sufficiency: 0.8,\n faithfulness: 0.9,\n answer_relevance: 0.7,\n citation_support: 0.9,\n abstention: 1,\n unsupported_answer_rate: 0,\n}\n\nconst defaultWeights: Partial<Record<RagEvalMetricKey, number>> = {\n context_relevance: 1,\n context_sufficiency: 1,\n faithfulness: 2,\n answer_relevance: 1,\n citation_support: 1,\n abstention: 1,\n}\n\nexport function ragAnswerQualityJudge(\n options: RagAnswerQualityJudgeOptions = {},\n): JudgeConfig<RagAnswerEvalArtifact, RagAnswerEvalScenario> {\n return {\n name: options.name ?? 'rag-answer-quality',\n dimensions: [\n { key: 'context_precision', description: 'share of retrieved context that is useful' },\n { key: 'context_recall', description: 'share of required evidence present in context' },\n { key: 'context_relevance', description: 'context relevance to the query and answer target' },\n { key: 'context_sufficiency', description: 'whether context is enough to answer' },\n { key: 'faithfulness', description: 'share of answer claims supported by retrieved context' },\n { key: 'answer_relevance', description: 'answer addresses the user query' },\n { key: 'answer_correctness', description: 'answer contains expected claims' },\n { key: 'citation_support', description: 'citations support the claims they cite' },\n { key: 'abstention', description: 'answer abstains exactly when the case is unanswerable' },\n ],\n appliesTo: (scenario) => scenario.kind === 'rag-answer-eval',\n async score({ artifact, scenario }) {\n const summary = scoreRagAnswerArtifact(artifact, scenario, options)\n return {\n dimensions: summary.metrics,\n composite: summary.composite,\n notes: summary.findings.map((finding) => finding.message).join('; '),\n }\n },\n }\n}\n\nexport function scoreRagAnswerArtifact(\n artifact: RagAnswerEvalArtifact,\n scenario: RagAnswerEvalScenario,\n options: RagAnswerQualityJudgeOptions = {},\n): RagAnswerMetricSummary {\n const claims = normalizeClaims(artifact)\n const abstained = artifact.abstained ?? looksLikeAbstention(artifact.answer)\n const requiredTargets = requiredContextTargets(scenario)\n const matchedRequiredContextCount = requiredTargets.filter((target) =>\n artifact.contexts.some((context) => contextMatchesTarget(context, target)),\n ).length\n const requiredContextCount = requiredTargets.length\n const contextRecall =\n requiredContextCount === 0\n ? neutralScore(Boolean(scenario.unanswerable) || artifact.contexts.length > 0)\n : matchedRequiredContextCount / requiredContextCount\n const relevantContextCount = artifact.contexts.filter((context) =>\n contextIsRelevant(context, scenario),\n ).length\n const contextPrecision =\n artifact.contexts.length === 0\n ? scenario.unanswerable\n ? 1\n : 0\n : relevantContextCount / artifact.contexts.length\n const contextRelevance =\n artifact.contexts.length === 0\n ? scenario.unanswerable\n ? 1\n : 0\n : mean(artifact.contexts.map((context) => contextRelevanceScore(context, scenario)))\n const contextSufficiency = requiredContextCount === 0 ? contextRelevance : contextRecall\n const support = claims.map((claim) => claimSupport(claim.text, artifact.contexts, options))\n const supportedClaimCount = support.filter(Boolean).length\n const faithfulness =\n claims.length === 0 ? (abstained ? 1 : 0) : supportedClaimCount / Math.max(1, claims.length)\n const citation = scoreCitations(claims, artifact, scenario, options)\n const answerRelevance = scoreAnswerRelevance(artifact, scenario, abstained)\n const answerCorrectness = scoreAnswerCorrectness(artifact, scenario, abstained)\n const abstention = scenario.unanswerable ? (abstained ? 1 : 0) : abstained ? 0 : 1\n const unsupportedAnswerRate =\n claims.length === 0 ? (abstained ? 0 : 1) : 1 - supportedClaimCount / Math.max(1, claims.length)\n\n const deterministicMetrics: Record<RagEvalMetricKey, number> = {\n context_precision: clamp01(contextPrecision),\n context_recall: clamp01(contextRecall),\n context_relevance: clamp01(contextRelevance),\n context_sufficiency: clamp01(contextSufficiency),\n faithfulness: clamp01(faithfulness),\n groundedness: clamp01(faithfulness),\n answer_relevance: clamp01(answerRelevance),\n answer_correctness: clamp01(answerCorrectness),\n citation_support: clamp01(citation.support),\n abstention: clamp01(abstention),\n unsupported_answer_rate: clamp01(unsupportedAnswerRate),\n }\n const providerScores = normalizeExternalRagScores(artifact.externalScores ?? [])\n const metrics = mergeMetrics(deterministicMetrics, providerScores, options.externalScorePolicy)\n const thresholds = { ...defaultThresholds, ...scenario.thresholds, ...options.thresholds }\n const findings = diagnoseRagAnswerFailure(metrics, scenario, thresholds)\n const composite = weightedComposite(metrics, options.weights ?? defaultWeights)\n\n return {\n metrics,\n composite,\n passed: findings.every(\n (finding) => finding.severity !== 'error' && finding.severity !== 'critical',\n ),\n findings,\n claimCount: claims.length,\n supportedClaimCount,\n citedClaimCount: citation.citedClaimCount,\n supportedCitationCount: citation.supportedCitationCount,\n matchedRequiredContextCount,\n requiredContextCount,\n providerScores,\n }\n}\n\nexport function diagnoseRagAnswerFailure(\n metrics: Record<RagEvalMetricKey, number>,\n scenario: RagAnswerEvalScenario,\n thresholds: Partial<Record<RagEvalMetricKey, number>> = defaultThresholds,\n): RagGapFinding[] {\n const findings: RagGapFinding[] = []\n if (below(metrics.context_recall, thresholds.context_recall)) {\n findings.push({\n id: `${scenario.id}:context-recall`,\n kind: scenario.slices?.includes('multi-source')\n ? 'missing-multihop-evidence'\n : 'retrieval-miss',\n severity: 'error',\n scenarioId: scenario.id,\n message: 'Required evidence was not present in retrieved context.',\n evidence: { context_recall: metrics.context_recall },\n })\n }\n if (below(metrics.context_precision, thresholds.context_precision)) {\n findings.push({\n id: `${scenario.id}:context-precision`,\n kind: 'retrieval-noise',\n severity: 'warning',\n scenarioId: scenario.id,\n message: 'Retrieved context contains too much irrelevant material.',\n evidence: { context_precision: metrics.context_precision },\n })\n }\n if (below(metrics.faithfulness, thresholds.faithfulness)) {\n findings.push({\n id: `${scenario.id}:faithfulness`,\n kind: 'generator-unsupported-claim',\n severity: 'error',\n scenarioId: scenario.id,\n message: 'The answer contains claims not supported by retrieved context.',\n evidence: { faithfulness: metrics.faithfulness },\n })\n }\n if (below(metrics.citation_support, thresholds.citation_support)) {\n findings.push({\n id: `${scenario.id}:citation-support`,\n kind: 'citation-mismatch',\n severity: 'error',\n scenarioId: scenario.id,\n message: 'Citations do not support the claims they are attached to.',\n evidence: { citation_support: metrics.citation_support },\n })\n }\n if (below(metrics.abstention, thresholds.abstention)) {\n findings.push({\n id: `${scenario.id}:abstention`,\n kind: 'incorrect-abstention',\n severity: 'error',\n scenarioId: scenario.id,\n message: scenario.unanswerable\n ? 'The system answered a case marked unanswerable.'\n : 'The system abstained from an answerable case.',\n evidence: { abstention: metrics.abstention },\n })\n }\n return findings\n}\n\nfunction mergeMetrics(\n deterministic: Record<RagEvalMetricKey, number>,\n providerScores: Record<string, Record<RagEvalMetricKey, number>>,\n policy: RagAnswerQualityJudgeOptions['externalScorePolicy'] = 'prefer-external',\n): Record<RagEvalMetricKey, number> {\n if (policy === 'deterministic-first') return deterministic\n const merged = { ...deterministic }\n for (const scores of Object.values(providerScores)) {\n for (const [key, value] of Object.entries(scores) as Array<[RagEvalMetricKey, number]>) {\n merged[key] = value\n if (key === 'groundedness') merged.faithfulness = value\n if (key === 'faithfulness') merged.groundedness = value\n }\n }\n return merged\n}\n\nexport function aggregateRagAnswerMetrics(\n summaries: readonly RagAnswerMetricSummary[],\n): Record<string, number> {\n const keys = new Set<RagEvalMetricKey>()\n for (const summary of summaries) {\n for (const key of Object.keys(summary.metrics) as RagEvalMetricKey[]) keys.add(key)\n }\n const out: Record<string, number> = {}\n for (const key of [...keys].sort()) {\n out[key] = mean(summaries.map((summary) => summary.metrics[key]))\n }\n out.composite = mean(summaries.map((summary) => summary.composite))\n return out\n}\n\nfunction weightedComposite(\n metrics: Record<RagEvalMetricKey, number>,\n weights: Partial<Record<RagEvalMetricKey, number>>,\n): number {\n let weighted = 0\n let total = 0\n for (const [key, weight] of Object.entries(weights) as Array<[RagEvalMetricKey, number]>) {\n if (!Number.isFinite(weight) || weight <= 0) continue\n const metric = metrics[key]\n if (!Number.isFinite(metric)) continue\n const value = key === 'unsupported_answer_rate' ? 1 - metric : metric\n weighted += value * weight\n total += weight\n }\n return total === 0 ? 0 : weighted / total\n}\n\nfunction below(metric: number, threshold: number | undefined): boolean {\n return threshold !== undefined && metric < threshold\n}\n","import type {\n DispatchContext,\n JudgeConfig,\n OptimizationMethod,\n} from '@tangle-network/agent-eval/campaign'\nimport type { AgentCandidateJsonValue as JsonValue } from '@tangle-network/agent-interface'\nimport {\n jsonObjectCandidateCodec,\n type RunSerializedKnowledgeOptimizationOptions,\n type RunSerializedKnowledgeOptimizationResult,\n runSerializedKnowledgeOptimization,\n scenarioContentFingerprint,\n} from './optimization'\nimport type { RagAnswerEvalArtifact, RagAnswerEvalScenario } from './rag-eval'\nimport { ragAnswerQualityJudge } from './rag-eval'\n\nexport type RagOptimizationConfig = Record<string, JsonValue>\n\ntype RagOptimizationBaseOptions = Omit<\n RunSerializedKnowledgeOptimizationOptions<\n RagOptimizationConfig,\n RagAnswerEvalScenario,\n RagAnswerEvalArtifact\n >,\n | 'baseline'\n | 'method'\n | 'trainScenarios'\n | 'selectionScenarios'\n | 'finalScenarios'\n | 'dispatchCandidate'\n | 'judges'\n | 'codec'\n | 'scenarioFingerprint'\n>\n\nexport interface RunRagOptimizationOptions extends RagOptimizationBaseOptions {\n baseline: RagOptimizationConfig\n method: OptimizationMethod<RagAnswerEvalScenario, RagAnswerEvalArtifact>\n trainScenarios: readonly RagAnswerEvalScenario[]\n selectionScenarios: readonly RagAnswerEvalScenario[]\n finalScenarios: readonly RagAnswerEvalScenario[]\n run(input: {\n config: RagOptimizationConfig\n configSurface: string\n configSurfaceHash: string\n scenario: RagAnswerEvalScenario\n context: DispatchContext\n }): Promise<RagAnswerEvalArtifact>\n judges?: readonly JudgeConfig<RagAnswerEvalArtifact, RagAnswerEvalScenario>[]\n}\n\nexport interface RunRagOptimizationResult\n extends RunSerializedKnowledgeOptimizationResult<RagOptimizationConfig> {\n baselineConfig: RagOptimizationConfig\n winnerConfig: RagOptimizationConfig\n trainScenarios: readonly RagAnswerEvalScenario[]\n selectionScenarios: readonly RagAnswerEvalScenario[]\n finalScenarios: readonly RagAnswerEvalScenario[]\n}\n\n/** Optimizes retrieval and answer behavior together as one serialized RAG configuration. */\nexport async function runRagOptimization(\n options: RunRagOptimizationOptions,\n): Promise<RunRagOptimizationResult> {\n const {\n baseline,\n method,\n trainScenarios,\n selectionScenarios,\n finalScenarios,\n run,\n judges,\n ...runOptions\n } = options\n const result = await runSerializedKnowledgeOptimization({\n ...runOptions,\n baseline,\n method,\n trainScenarios,\n selectionScenarios,\n finalScenarios,\n codec: jsonObjectCandidateCodec<RagOptimizationConfig>(),\n judges: [...(judges ?? [ragAnswerQualityJudge()])],\n scenarioFingerprint: scenarioContentFingerprint,\n dispatchCandidate: ({ candidate, candidateSurface, candidateSurfaceHash, scenario, context }) =>\n run({\n config: candidate,\n configSurface: candidateSurface,\n configSurfaceHash: candidateSurfaceHash,\n scenario,\n context,\n }),\n })\n return {\n ...result,\n baselineConfig: result.baseline.value,\n winnerConfig: result.winner.value,\n trainScenarios: [...trainScenarios],\n selectionScenarios: [...selectionScenarios],\n finalScenarios: [...finalScenarios],\n }\n}\n","import { stableId } from './ids'\nimport type { KnowledgeEvent, KnowledgeEventType } from './types'\n\nexport interface KnowledgeEventQuery {\n type?: KnowledgeEventType\n target?: string\n limit?: number\n}\n\nexport function createKnowledgeEvent(input: {\n type: KnowledgeEventType\n actor?: string\n target?: string\n metadata?: Record<string, unknown>\n now?: () => Date\n}): KnowledgeEvent {\n const createdAt = (input.now ?? (() => new Date()))().toISOString()\n return {\n id: stableId(\n 'evt',\n `${input.type}:${input.target ?? ''}:${createdAt}:${JSON.stringify(input.metadata ?? {})}`,\n ),\n type: input.type,\n createdAt,\n // An absent optional is omitted, never written as `undefined`. An event\n // reaches canonical JSON — through a control-loop state fingerprint and\n // through the event log — and that encoder refuses a key with no value.\n ...(input.actor === undefined ? {} : { actor: input.actor }),\n ...(input.target === undefined ? {} : { target: input.target }),\n ...(input.metadata === undefined ? {} : { metadata: input.metadata }),\n }\n}\n","import {\n acquisitionPlansForKnowledgeGaps,\n type DataAcquisitionPlan,\n type KnowledgeAcquisitionMode,\n type KnowledgeBundle,\n type KnowledgeFreshness,\n type KnowledgeImportance,\n type KnowledgeReadinessReport,\n type KnowledgeRequirement,\n type KnowledgeRequirementCategory,\n type KnowledgeSensitivity,\n scoreKnowledgeReadiness,\n type UserQuestion,\n userQuestionsForKnowledgeGaps,\n} from '@tangle-network/agent-eval'\nimport { buildKnowledgeLexicalIndex } from './lexical-index'\nimport { stringMetadata } from './metadata'\nimport { searchKnowledge } from './search'\nimport type { KnowledgeIndex, KnowledgeSearchResult } from './types'\n\nexport interface KnowledgeReadinessSpec {\n id: string\n description: string\n query: string\n requiredFor: string[]\n category: KnowledgeRequirementCategory\n acquisitionMode: KnowledgeAcquisitionMode\n importance: KnowledgeImportance\n freshness: KnowledgeFreshness\n sensitivity: KnowledgeSensitivity\n confidenceNeeded: number\n fallbackPolicy?: KnowledgeRequirement['fallbackPolicy']\n minSources?: number\n minHits?: number\n metadata?: Record<string, unknown>\n}\n\n/**\n * Defaults applied by `defineReadinessSpec` when the caller omits the field.\n *\n * These are deliberately conservative: a domain-specific topic that an agent\n * needs grounded to a high-confidence threshold from at least one authoritative\n * source. Override any field to specialise (e.g. `freshness: 'daily'` for a\n * topic that must reflect today's regulatory state).\n */\nexport const READINESS_SPEC_DEFAULTS = {\n category: 'domain_specific',\n acquisitionMode: 'search_web',\n importance: 'high',\n freshness: 'monthly',\n sensitivity: 'public',\n confidenceNeeded: 0.7,\n minSources: 1,\n minHits: 2,\n} as const satisfies Pick<\n KnowledgeReadinessSpec,\n | 'category'\n | 'acquisitionMode'\n | 'importance'\n | 'freshness'\n | 'sensitivity'\n | 'confidenceNeeded'\n | 'minSources'\n | 'minHits'\n>\n\n/**\n * Inputs accepted by `defineReadinessSpec`. The four fields the caller cannot\n * sanely default (id, description, query, requiredFor) are required; everything\n * else is optional and pulls from `READINESS_SPEC_DEFAULTS`.\n */\nexport type DefineReadinessSpecInput = Pick<\n KnowledgeReadinessSpec,\n 'id' | 'description' | 'query' | 'requiredFor'\n> &\n Partial<Omit<KnowledgeReadinessSpec, 'id' | 'description' | 'query' | 'requiredFor'>>\n\n/**\n * Builder that returns a fully-typed `KnowledgeReadinessSpec` from a slim input.\n *\n * Motivation: `KnowledgeReadinessSpec` has eleven required fields. Most of them\n * (category, acquisition mode, importance, freshness, sensitivity, confidence\n * threshold, source/hit minima) have a clear default for domain-specific KB\n * topics — agents end up copy-pasting the same boilerplate across every spec.\n * This helper collapses that boilerplate while keeping every field overridable.\n *\n * @example\n * defineReadinessSpec({\n * id: 'coop/intent-grounding',\n * description: 'Required grounding for coop pack intent stage',\n * query: 'flock size space ventilation predator',\n * requiredFor: ['IntentIntakeAgent', 'requirements'],\n * })\n *\n * @example // override defaults where the topic demands it\n * defineReadinessSpec({\n * id: 'medical/dosing',\n * description: 'Dosing guidance for compounding pharmacy',\n * query: 'compounding dose schedule',\n * requiredFor: ['DosingAgent'],\n * importance: 'blocking',\n * freshness: 'daily',\n * sensitivity: 'private',\n * confidenceNeeded: 0.95,\n * minSources: 3,\n * })\n */\nexport function defineReadinessSpec(input: DefineReadinessSpecInput): KnowledgeReadinessSpec {\n return {\n ...READINESS_SPEC_DEFAULTS,\n ...input,\n }\n}\n\nexport interface BuildEvalKnowledgeBundleOptions {\n taskId: string\n index: KnowledgeIndex\n specs: KnowledgeReadinessSpec[]\n userAnswers?: Record<string, string>\n searchLimit?: number\n metadata?: Record<string, unknown>\n now?: Date\n}\n\nexport interface EvalKnowledgeBundleBuildResult {\n bundle: KnowledgeBundle\n report: KnowledgeReadinessReport\n requirements: KnowledgeRequirement[]\n searchResultsByRequirement: Record<string, KnowledgeSearchResult[]>\n questions: UserQuestion[]\n acquisitionPlans: DataAcquisitionPlan[]\n}\n\nexport function buildEvalKnowledgeBundle(\n options: BuildEvalKnowledgeBundleOptions,\n): EvalKnowledgeBundleBuildResult {\n const searchLimit = options.searchLimit ?? 5\n const now = options.now ?? new Date()\n const lexicalIndex = options.specs.some((spec) => spec.query.trim() !== '')\n ? buildKnowledgeLexicalIndex(options.index.pages)\n : undefined\n const searchResultsByRequirement: Record<string, KnowledgeSearchResult[]> = {}\n const requirements = options.specs.map((spec) => {\n const results = searchKnowledge(options.index, spec.query, { limit: searchLimit, lexicalIndex })\n searchResultsByRequirement[spec.id] = results\n return requirementFromSearch(options.index, spec, results, now)\n })\n const report = scoreKnowledgeReadiness({\n taskId: options.taskId,\n requirements,\n now,\n userAnswers: options.userAnswers,\n evidenceIds: requirements.flatMap((requirement) => requirement.evidenceIds),\n claimIds: [],\n wikiPageIds: unique(\n requirements.flatMap((requirement) =>\n pageIdsFromResults(searchResultsByRequirement[requirement.id] ?? []),\n ),\n ),\n metadata: options.metadata,\n })\n const questions = userQuestionsForKnowledgeGaps(report.blockingMissingRequirements)\n const acquisitionPlans = acquisitionPlansForKnowledgeGaps([\n ...report.blockingMissingRequirements,\n ...report.nonBlockingGaps,\n ])\n\n return {\n bundle: report.bundle,\n report,\n requirements,\n searchResultsByRequirement,\n questions,\n acquisitionPlans,\n }\n}\n\nfunction requirementFromSearch(\n index: KnowledgeIndex,\n spec: KnowledgeReadinessSpec,\n results: KnowledgeSearchResult[],\n now: Date,\n): KnowledgeRequirement {\n const hitCount = results.length\n const sourceIds = unique(results.flatMap((result) => result.page.sourceIds))\n const sources = index.sources.filter((source) => sourceIds.includes(source.id))\n const bestScore = results[0]?.normalizedScore ?? 0\n const sourceCoverage = spec.minSources\n ? Math.min(1, sourceIds.length / spec.minSources)\n : sourceIds.length > 0\n ? 1\n : 0\n const hitCoverage = spec.minHits ? Math.min(1, hitCount / spec.minHits) : hitCount > 0 ? 1 : 0\n const freshness = sourceFreshness(sources, now)\n const currentConfidence = round(Math.min(bestScore, sourceCoverage, hitCoverage, freshness.score))\n // Omit unknown bounds rather than encoding undefined in canonical records.\n const freshnessFields = {\n ...(freshness.validUntil === undefined ? {} : { validUntil: freshness.validUntil }),\n ...(freshness.lastVerifiedAt === undefined ? {} : { lastVerifiedAt: freshness.lastVerifiedAt }),\n }\n\n return {\n id: spec.id,\n description: spec.description,\n requiredFor: spec.requiredFor,\n category: spec.category,\n acquisitionMode: spec.acquisitionMode,\n importance: spec.importance,\n freshness: spec.freshness,\n sensitivity: spec.sensitivity,\n confidenceNeeded: spec.confidenceNeeded,\n currentConfidence,\n ...freshnessFields,\n evidenceIds: unique([\n ...sourceIds.map((sourceId) => `source:${sourceId}`),\n ...results.map((result) => `page:${result.page.id}`),\n ]),\n fallbackPolicy:\n spec.fallbackPolicy ?? (spec.importance === 'blocking' ? 'block' : 'continue_with_caveat'),\n metadata: {\n ...spec.metadata,\n query: spec.query,\n hitCount,\n sourceCount: sourceIds.length,\n bestNormalizedScore: bestScore,\n expiredSourceIds: freshness.expiredSourceIds,\n freshnessScore: freshness.score,\n // Retain legacy diagnostic aliases. Eval uses the typed fields above.\n ...freshnessFields,\n },\n }\n}\n\nfunction sourceFreshness(\n sources: KnowledgeIndex['sources'],\n now: Date,\n): { score: number; validUntil?: string; lastVerifiedAt?: string; expiredSourceIds: string[] } {\n if (sources.length === 0) return { score: 0, expiredSourceIds: [] }\n const validUntilValues = sources\n .map(\n (source) =>\n source.validUntil ??\n stringMetadata(source.metadata, 'validUntil') ??\n stringMetadata(source.metadata, 'expiresAt'),\n )\n .filter(isIsoDate)\n const lastVerifiedValues = sources\n .map((source) => source.lastVerifiedAt ?? stringMetadata(source.metadata, 'lastVerifiedAt'))\n .filter(isIsoDate)\n const expiredSourceIds = sources\n .filter((source) => {\n const validUntil =\n source.validUntil ??\n stringMetadata(source.metadata, 'validUntil') ??\n stringMetadata(source.metadata, 'expiresAt')\n return validUntil ? Date.parse(validUntil) <= now.getTime() : false\n })\n .map((source) => source.id)\n return {\n score: expiredSourceIds.length > 0 ? 0 : 1,\n validUntil: earliestIso(validUntilValues),\n lastVerifiedAt: latestIso(lastVerifiedValues),\n expiredSourceIds,\n }\n}\n\nfunction isIsoDate(value: string | undefined): value is string {\n return Boolean(value && Number.isFinite(Date.parse(value)))\n}\n\nfunction earliestIso(values: string[]): string | undefined {\n return values.sort((a, b) => Date.parse(a) - Date.parse(b))[0]\n}\n\nfunction latestIso(values: string[]): string | undefined {\n return values.sort((a, b) => Date.parse(b) - Date.parse(a))[0]\n}\n\nfunction pageIdsFromResults(results: KnowledgeSearchResult[]): string[] {\n return results.map((result) => result.page.id)\n}\n\nfunction unique<T>(items: T[]): T[] {\n return [...new Set(items)]\n}\n\nfunction round(value: number): number {\n return Math.round(value * 1000) / 1000\n}\n","import {\n type BuildEvalKnowledgeBundleOptions,\n buildEvalKnowledgeBundle,\n type EvalKnowledgeBundleBuildResult,\n type KnowledgeReadinessSpec,\n} from './eval-readiness'\nimport type { KnowledgeBaseQualityOptions } from './rag-eval'\nimport { scoreValidatedKnowledgeBaseIndex } from './rag-eval/knowledge-base'\nimport type { KnowledgeIndex } from './types'\nimport { prepareKnowledgeValidation, type ValidateKnowledgeOptions } from './validate'\n\n/**\n * The subset of a research-loop options object the readiness gate needs:\n * the goal (default task id), the readiness specs, an optional task-id\n * override, and the rest of the bundle options minus the fields this helper\n * supplies (`taskId`/`index`/`specs`).\n *\n * The research-loop options shape satisfies this structurally.\n */\nexport interface ReadinessGateOptions {\n goal: string\n readinessSpecs?: readonly KnowledgeReadinessSpec[]\n readinessTaskId?: string\n readiness?: Omit<BuildEvalKnowledgeBundleOptions, 'taskId' | 'index' | 'specs'>\n}\n\n/**\n * Build the readiness bundle for a loop run over the given index, or\n * `undefined` when no readiness specs are configured (no gate to report).\n */\nexport function readinessFor(\n options: ReadinessGateOptions,\n index: KnowledgeIndex,\n): EvalKnowledgeBundleBuildResult | undefined {\n if (!options.readinessSpecs?.length) return undefined\n return buildEvalKnowledgeBundle({\n ...(options.readiness ?? {}),\n taskId: options.readinessTaskId ?? options.goal,\n index,\n specs: [...options.readinessSpecs],\n })\n}\n\n/** Assess one index without repeating lint/schema work for its two policy gates. */\nexport function assessKnowledgeIndex(\n options: ReadinessGateOptions & {\n strict?: ValidateKnowledgeOptions['strict']\n kbQuality?: KnowledgeBaseQualityOptions\n },\n index: KnowledgeIndex,\n) {\n const prepared = prepareKnowledgeValidation(index)\n const validation = prepared.validate({ strict: options.strict })\n const readiness = readinessFor(options, index)\n const qualityOptions = { strict: options.strict, ...options.kbQuality }\n const qualityValidation =\n Boolean(qualityOptions.strict) === Boolean(options.strict)\n ? validation\n : prepared.validate(qualityOptions)\n return {\n validation,\n readiness,\n kbQuality: scoreValidatedKnowledgeBaseIndex(index, qualityOptions, qualityValidation),\n }\n}\n","import {\n blockingKnowledgeEval,\n type ControlEvalResult,\n type ControlRuntimeConfig,\n canonicalJson,\n objectiveEval,\n} from '@tangle-network/agent-eval'\nimport type {\n BuildEvalKnowledgeBundleOptions,\n EvalKnowledgeBundleBuildResult,\n KnowledgeReadinessSpec,\n} from './eval-readiness'\nimport { createKnowledgeEvent } from './events'\nimport { buildKnowledgeIndex } from './indexer'\nimport { type ApplyWriteBlocksResult, applyKnowledgeWriteBlocks } from './proposals'\nimport { readinessFor } from './readiness-helpers'\nimport {\n type AddSourceOptions,\n type AddSourceTextInput,\n addSourcePath,\n addSourceText,\n} from './sources'\nimport { initKnowledgeBase } from './store'\nimport type { KnowledgeEvent, KnowledgeIndex, KnowledgeLintFinding, SourceRecord } from './types'\nimport {\n prepareKnowledgeValidation,\n type ValidateKnowledgeOptions,\n type ValidateKnowledgeResult,\n} from './validate'\n\nexport interface KnowledgeResearchLoopContext {\n root: string\n goal: string\n iteration: number\n index: KnowledgeIndex\n lintFindings: KnowledgeLintFinding[]\n validation: ValidateKnowledgeResult\n readiness?: EvalKnowledgeBundleBuildResult\n previousSteps: KnowledgeResearchLoopStep[]\n signal?: AbortSignal\n}\n\nexport interface KnowledgeResearchLoopDecision {\n /**\n * Free-form notes from the researcher. Keep this human-readable; products can\n * store it as the research transcript.\n */\n notes?: string\n /**\n * Local files to register as immutable sources before applying proposals.\n */\n sourcePaths?: string[]\n /**\n * Textual source artifacts discovered by an agent, browser worker, connector,\n * or deep-research process.\n */\n sourceTexts?: AddSourceTextInput[]\n /**\n * Safe write protocol text. The loop parses and applies only accepted\n * `---FILE: knowledge/...---` blocks.\n */\n proposalText?: string\n /**\n * The researcher decides when the wiki is good enough. The loop deliberately\n * does not encode a domain-specific definition of \"done\".\n */\n done?: boolean\n metadata?: Record<string, unknown>\n}\n\nexport interface KnowledgeResearchLoopStep {\n iteration: number\n notes?: string\n addedSources: SourceRecord[]\n applied?: ApplyWriteBlocksResult\n lintFindings: KnowledgeLintFinding[]\n validation: ValidateKnowledgeResult\n readiness?: EvalKnowledgeBundleBuildResult\n event: KnowledgeEvent\n done: boolean\n metadata?: Record<string, unknown>\n}\n\nexport interface RunKnowledgeResearchLoopOptions {\n pagesDirectory?: string\n root: string\n goal: string\n maxIterations?: number\n actor?: string\n strict?: ValidateKnowledgeOptions['strict']\n readinessSpecs?: KnowledgeReadinessSpec[]\n readinessTaskId?: string\n readiness?: Omit<BuildEvalKnowledgeBundleOptions, 'taskId' | 'index' | 'specs'>\n sourceOptions?: Pick<AddSourceOptions, 'adapters' | 'now'>\n signal?: AbortSignal\n step(\n context: KnowledgeResearchLoopContext,\n ): Promise<KnowledgeResearchLoopDecision> | KnowledgeResearchLoopDecision\n onStep?: (step: KnowledgeResearchLoopStep) => Promise<void> | void\n}\n\nexport interface KnowledgeResearchLoopResult {\n root: string\n goal: string\n iterations: number\n done: boolean\n index: KnowledgeIndex\n lintFindings: KnowledgeLintFinding[]\n validation: ValidateKnowledgeResult\n readiness?: EvalKnowledgeBundleBuildResult\n steps: KnowledgeResearchLoopStep[]\n}\n\nexport type KnowledgeControlLoopState = KnowledgeResearchLoopContext\nexport type KnowledgeControlLoopAction = KnowledgeResearchLoopDecision\nexport type KnowledgeControlLoopActionResult = KnowledgeResearchLoopStep\n\nexport interface KnowledgeControlLoopAdapterOptions {\n pagesDirectory?: string\n root: string\n goal: string\n actor?: string\n strict?: ValidateKnowledgeOptions['strict']\n readinessSpecs?: KnowledgeReadinessSpec[]\n readinessTaskId?: string\n readiness?: Omit<BuildEvalKnowledgeBundleOptions, 'taskId' | 'index' | 'specs'>\n sourceOptions?: Pick<AddSourceOptions, 'adapters' | 'now'>\n}\n\nexport type KnowledgeControlLoopAdapter = Pick<\n ControlRuntimeConfig<\n KnowledgeControlLoopState,\n KnowledgeControlLoopAction,\n KnowledgeControlLoopActionResult,\n ControlEvalResult\n >,\n 'intent' | 'observe' | 'validate' | 'act' | 'shouldStop' | 'stopPolicies'\n>\n\n/**\n * Adapter for running knowledge growth through `agent-eval`'s generic control\n * runtime. The caller still owns `decide`: that can be a proposer agent,\n * reviewer agent, deterministic policy, or a composition of all three.\n */\nexport function createKnowledgeControlLoopAdapter(\n options: KnowledgeControlLoopAdapterOptions,\n): KnowledgeControlLoopAdapter {\n let initialized = false\n const appliedSteps: KnowledgeResearchLoopStep[] = []\n\n return {\n intent: options.goal,\n async observe({ history, abortSignal }) {\n if (abortSignal.aborted) throw new Error('Knowledge control loop aborted')\n if (!initialized) {\n await initKnowledgeBase(options.root)\n initialized = true\n }\n const observation = await observeKnowledgeResearch(options)\n return {\n root: options.root,\n goal: options.goal,\n iteration: history.length + 1,\n ...observation,\n previousSteps: [...appliedSteps],\n signal: abortSignal,\n }\n },\n validate({ state }) {\n const errorFindings = state.validation.findings.filter(\n (finding) => finding.severity === 'error',\n )\n const evals: ControlEvalResult[] = [\n objectiveEval({\n id: 'knowledge-valid',\n passed: state.validation.ok,\n severity: 'critical',\n detail: state.validation.ok\n ? 'Knowledge index is valid.'\n : 'Knowledge index has validation errors.',\n metadata: { findings: state.validation.findings },\n }),\n objectiveEval({\n id: 'knowledge-lint-errors',\n passed: errorFindings.length === 0,\n severity: 'error',\n detail:\n errorFindings.length === 0\n ? 'No lint errors.'\n : `${errorFindings.length} lint error(s).`,\n metadata: { findings: errorFindings },\n }),\n ]\n if (state.readiness) evals.push(blockingKnowledgeEval(state.readiness.report))\n return evals\n },\n shouldStop() {\n return { stop: false, pass: false, reason: 'knowledge driver owns stop decisions' }\n },\n stopPolicies: {\n // `observe` hands the caller's AbortSignal to `act` through the state, and a\n // signal has no canonical JSON form. The loop's default fingerprint would\n // refuse the whole state, so fingerprint the observable knowledge and leave\n // the signal out — it carries no observable progress.\n stateFingerprint: ({ signal: _signal, ...observable }) => canonicalJson(observable),\n },\n async act(action, ctx) {\n const { step } = await applyKnowledgeResearchDecision(options, action, ctx.state.iteration)\n appliedSteps.push(step)\n return step\n },\n }\n}\n\nexport async function runKnowledgeResearchLoop(\n options: RunKnowledgeResearchLoopOptions,\n): Promise<KnowledgeResearchLoopResult> {\n const maxIterations = Math.max(1, options.maxIterations ?? 3)\n await initKnowledgeBase(options.root)\n const steps: KnowledgeResearchLoopStep[] = []\n let observation = await observeKnowledgeResearch(options)\n let done = false\n\n for (let iteration = 1; iteration <= maxIterations; iteration++) {\n if (options.signal?.aborted) throw new Error('Knowledge research loop aborted')\n const decision = await options.step({\n root: options.root,\n goal: options.goal,\n iteration,\n ...observation,\n previousSteps: steps,\n signal: options.signal,\n })\n\n done = Boolean(decision.done)\n const applied = await applyKnowledgeResearchDecision(options, decision, iteration)\n const { step } = applied\n observation = applied.observation\n steps.push(step)\n await options.onStep?.(step)\n\n if (done) break\n if (!step.applied && step.addedSources.length === 0) break\n }\n\n return {\n root: options.root,\n goal: options.goal,\n iterations: steps.length,\n done,\n ...observation,\n steps,\n }\n}\n\nasync function applyKnowledgeResearchDecision(\n options: KnowledgeControlLoopAdapterOptions,\n decision: KnowledgeResearchLoopDecision,\n iteration = 1,\n) {\n const addedSources: SourceRecord[] = []\n for (const sourcePath of decision.sourcePaths ?? []) {\n addedSources.push(...(await addSourcePath(options.root, sourcePath, options.sourceOptions)))\n }\n for (const sourceText of decision.sourceTexts ?? []) {\n addedSources.push(await addSourceText(options.root, sourceText, options.sourceOptions))\n }\n\n const applied = decision.proposalText\n ? await applyKnowledgeWriteBlocks(options.root, decision.proposalText, {\n pagesDirectory: options.pagesDirectory,\n })\n : undefined\n\n const observation = await observeKnowledgeResearch(options)\n const { validation, lintFindings, readiness } = observation\n const done = Boolean(decision.done)\n const event = createKnowledgeEvent({\n type: 'research.iteration',\n actor: options.actor,\n target: options.root,\n metadata: {\n goal: options.goal,\n iteration,\n done,\n addedSourceCount: addedSources.length,\n ...(applied === undefined ? {} : { written: applied.written }),\n warningCount: applied?.warnings.length ?? 0,\n errorCount: validation.findings.filter((finding) => finding.severity === 'error').length,\n },\n })\n\n // Every optional below is omitted when it has no value rather than set to\n // `undefined`. A step joins the control-loop state, which is fingerprinted with\n // canonical JSON, and that encoder refuses a key present with no value.\n const step: KnowledgeResearchLoopStep = {\n iteration,\n ...(decision.notes === undefined ? {} : { notes: decision.notes }),\n addedSources,\n ...(applied === undefined ? {} : { applied }),\n lintFindings,\n validation,\n ...(readiness === undefined ? {} : { readiness }),\n event,\n done,\n ...(decision.metadata === undefined ? {} : { metadata: decision.metadata }),\n }\n return { step, observation }\n}\n\nasync function observeKnowledgeResearch(options: KnowledgeControlLoopAdapterOptions) {\n const index = await buildKnowledgeIndex(options.root, options)\n const prepared = prepareKnowledgeValidation(index)\n return {\n index,\n // Both records are public and mutable; keep their findings detached as before.\n lintFindings: structuredClone(prepared.lintFindings),\n validation: prepared.validate({ strict: options.strict }),\n readiness: readinessFor(options, index),\n }\n}\n","import { canonicalJson } from '@tangle-network/agent-eval'\nimport type {\n DispatchContext,\n JudgeConfig,\n MutableSurface,\n Scenario,\n} from '@tangle-network/agent-eval/campaign'\nimport type { AgentCandidateJsonValue as JsonValue } from '@tangle-network/agent-interface'\nimport { searchKnowledge } from './search'\nimport type { KnowledgeIndex, KnowledgeSearchResult } from './types'\n\nexport type RetrievalConfig = Record<string, 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 PartitionRetrievalScenariosOptions {\n selectionFraction?: number\n finalFraction?: number\n seed?: number\n}\n\nexport interface RetrievalScenarioPartitions {\n trainScenarios: RetrievalEvalScenario[]\n selectionScenarios: RetrievalEvalScenario[]\n finalScenarios: RetrievalEvalScenario[]\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 partitionRetrievalScenarios(\n scenarios: readonly RetrievalEvalScenario[],\n options: PartitionRetrievalScenariosOptions = {},\n): RetrievalScenarioPartitions {\n if (scenarios.length < 4) {\n throw new Error(\n 'partitionRetrievalScenarios requires at least 4 scenarios for non-empty train and selection partitions plus 2 final scenarios',\n )\n }\n const selectionFraction = options.selectionFraction ?? 0.2\n const finalFraction = options.finalFraction ?? 0.2\n assertPartitionFraction(selectionFraction, 'selectionFraction')\n assertPartitionFraction(finalFraction, 'finalFraction')\n if (selectionFraction + finalFraction >= 1) {\n throw new Error('selectionFraction + finalFraction must be less than 1')\n }\n const shuffled = seededShuffle(scenarios, options.seed ?? 42)\n const finalCount = Math.max(2, Math.round(shuffled.length * finalFraction))\n const selectionCount = Math.max(1, Math.round(shuffled.length * selectionFraction))\n if (finalCount + selectionCount >= shuffled.length) {\n throw new Error('retrieval scenario fractions leave no training scenarios')\n }\n const trainEnd = shuffled.length - selectionCount - finalCount\n return {\n trainScenarios: shuffled.slice(0, trainEnd),\n selectionScenarios: shuffled.slice(trainEnd, trainEnd + selectionCount),\n finalScenarios: shuffled.slice(trainEnd + selectionCount),\n }\n}\n\nfunction assertPartitionFraction(value: number, name: string): void {\n if (!Number.isFinite(value) || value <= 0 || value >= 1) {\n throw new Error(`${name} must be greater than 0 and less than 1`)\n }\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 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 { canonicalJson } from '@tangle-network/agent-eval'\nimport {\n type JudgeConfig,\n type OptimizationMethod,\n surfaceHash,\n} from '@tangle-network/agent-eval/campaign'\nimport type { AgentCandidateJsonValue as JsonValue } from '@tangle-network/agent-interface'\nimport {\n jsonObjectCandidateCodec,\n type RunSerializedKnowledgeOptimizationOptions,\n type RunSerializedKnowledgeOptimizationResult,\n runSerializedKnowledgeOptimization,\n} from './optimization'\nimport {\n buildRetrievalEvalDispatch,\n type RetrievalConfig,\n type RetrievalEvalArtifact,\n type RetrievalEvalRetriever,\n type RetrievalEvalScenario,\n type RetrievalMetricWeights,\n retrievalRecallJudge,\n} from './retrieval-eval'\nimport type { KnowledgeIndex } from './types'\n\ntype RetrievalOptimizationBaseOptions = Omit<\n RunSerializedKnowledgeOptimizationOptions<\n RetrievalConfig,\n RetrievalEvalScenario,\n RetrievalEvalArtifact\n >,\n | 'baseline'\n | 'method'\n | 'trainScenarios'\n | 'selectionScenarios'\n | 'finalScenarios'\n | 'dispatchCandidate'\n | 'judges'\n | 'codec'\n | 'scenarioFingerprint'\n>\n\nexport interface RunRetrievalImprovementLoopOptions extends RetrievalOptimizationBaseOptions {\n baseline: RetrievalConfig\n trainScenarios: readonly RetrievalEvalScenario[]\n selectionScenarios: readonly RetrievalEvalScenario[]\n finalScenarios: readonly RetrievalEvalScenario[]\n method: OptimizationMethod<RetrievalEvalScenario, RetrievalEvalArtifact>\n index?: KnowledgeIndex\n defaultK?: number\n retrieve?: RetrievalEvalRetriever\n judges?: readonly JudgeConfig<RetrievalEvalArtifact, RetrievalEvalScenario>[]\n metricWeights?: RetrievalMetricWeights\n}\n\nexport interface RunRetrievalImprovementLoopResult\n extends RunSerializedKnowledgeOptimizationResult<RetrievalConfig> {\n baselineConfig: RetrievalConfig\n winnerConfig: RetrievalConfig\n trainScenarios: readonly RetrievalEvalScenario[]\n selectionScenarios: readonly RetrievalEvalScenario[]\n finalScenarios: readonly RetrievalEvalScenario[]\n}\n\nexport async function runRetrievalImprovementLoop(\n options: RunRetrievalImprovementLoopOptions,\n): Promise<RunRetrievalImprovementLoopResult> {\n const dispatch = buildRetrievalEvalDispatch({\n index: options.index,\n defaultK: options.defaultK,\n retrieve: options.retrieve,\n })\n const {\n baseline,\n trainScenarios,\n selectionScenarios,\n finalScenarios,\n method,\n index: _index,\n defaultK: _defaultK,\n retrieve: _retrieve,\n judges,\n metricWeights,\n ...runOptions\n } = options\n const result = await runSerializedKnowledgeOptimization({\n ...runOptions,\n baseline,\n method,\n trainScenarios,\n selectionScenarios,\n finalScenarios,\n codec: jsonObjectCandidateCodec<RetrievalConfig>(),\n judges: [...(judges ?? [retrievalRecallJudge({ weights: metricWeights })])],\n scenarioFingerprint: retrievalScenarioFingerprint,\n dispatchCandidate: ({ candidateSurface, scenario, context }) =>\n dispatch(candidateSurface, scenario, context),\n })\n return {\n ...result,\n baselineConfig: result.baseline.value,\n winnerConfig: result.winner.value,\n trainScenarios: [...trainScenarios],\n selectionScenarios: [...selectionScenarios],\n finalScenarios: [...finalScenarios],\n }\n}\n\nfunction retrievalScenarioFingerprint(scenario: RetrievalEvalScenario): string {\n return surfaceHash(\n canonicalJson({\n query: scenario.query,\n expected: scenario.expected,\n k: scenario.k ?? null,\n } as JsonValue),\n )\n}\n","import { assertRagAnswerEvidence, ragAnswerEvidenceRejectionReasons } from './rag-answer-evidence'\nimport type {\n RagAnswerQualityResult,\n RagKnowledgeImprovementPhase,\n RagKnowledgeImprovementPhaseResult,\n RagKnowledgeUpdateResult,\n RagOptimizationSelection,\n RagPromotionResult,\n RunRagKnowledgeImprovementLoopOptions,\n RunRagKnowledgeImprovementLoopResult,\n} from './rag-improvement-loop'\nimport { type RunRagOptimizationResult, runRagOptimization } from './rag-optimization'\nimport {\n type KnowledgeResearchLoopDecision,\n type RunKnowledgeResearchLoopOptions,\n runKnowledgeResearchLoop,\n} from './research-loop'\nimport {\n type RunRetrievalImprovementLoopResult,\n runRetrievalImprovementLoop,\n} from './retrieval-optimization'\n\ntype MaybePromise<T> = T | Promise<T>\n\nexport async function runRagKnowledgeImprovementPhases(\n options: RunRagKnowledgeImprovementLoopOptions,\n previous?: RunRagKnowledgeImprovementLoopResult,\n): Promise<RunRagKnowledgeImprovementLoopResult> {\n assertConfiguredRequiredPhases(options)\n assertOptionalCostCeiling(options.answerQualityCostCeiling, 'answerQualityCostCeiling')\n const now = options.now ?? (() => new Date())\n const phases: RagKnowledgeImprovementPhaseResult[] = [...(previous?.phases ?? [])]\n let optimization = previous?.optimization\n let retrieval = previous?.retrieval\n let findings = [...(previous?.findings ?? [])]\n let acquisition = previous?.acquisition\n let knowledgeUpdate = previous?.knowledgeUpdate\n let answerQuality = previous?.answerQuality\n let promotion = previous?.promotion\n\n const context = () => ({\n goal: options.goal,\n phases,\n optimization: selectOptimization(optimization),\n signal: options.signal,\n retrieval: selectOptimization(retrieval),\n })\n // One executor owns phase enablement, cancellation, timing, and status records.\n // Actions and their inputs remain lazy: later phases see the preceding results.\n async function runPhase<T>(\n phase: RagKnowledgeImprovementPhase,\n previousValue: T | undefined,\n action: (() => MaybePromise<T>) | undefined,\n summarize: (result: T) => string,\n missing: string,\n ): Promise<T | undefined> {\n if (!phaseEnabled(options, phase)) return previousValue\n const startedAt = now().toISOString()\n if (!action) {\n phases.push({ phase, status: 'skipped', summary: missing, startedAt, finishedAt: startedAt })\n return previousValue\n }\n try {\n assertNotAborted(options.signal)\n const result = await action()\n phases.push({\n phase,\n status: 'completed',\n summary: summarize(result),\n startedAt,\n finishedAt: now().toISOString(),\n })\n return result\n } catch (error) {\n phases.push({\n phase,\n status: 'failed',\n summary: (error as Error).message,\n startedAt,\n finishedAt: now().toISOString(),\n })\n throw error\n }\n }\n\n findings = [\n ...(await runPhase(\n 'gap-diagnosis',\n findings,\n options.diagnose && (() => options.diagnose!(context())),\n (diagnosed) => `${diagnosed.length} finding(s)`,\n 'no diagnosis hook provided',\n ))!,\n ]\n acquisition = await runPhase(\n 'knowledge-acquisition',\n acquisition,\n options.acquireKnowledge && (() => options.acquireKnowledge!({ ...context(), findings })),\n summarizeAcquisitionDecision,\n 'no acquisition hook provided',\n )\n knowledgeUpdate = await runPhase(\n 'knowledge-update',\n knowledgeUpdate,\n options.updateKnowledge\n ? () => options.updateKnowledge!({ ...context(), findings, acquisition })\n : options.knowledgeResearch\n ? () => runKnowledgeResearchUpdate(options, acquisition)\n : undefined,\n (result) => result.summary,\n 'no update hook or research loop provided',\n )\n\n if (\n options.optimization ||\n options.enabledPhases?.includes('rag-optimization') ||\n options.requiredPhases?.includes('rag-optimization')\n ) {\n optimization = await runPhase(\n 'rag-optimization',\n optimization,\n options.optimization && (() => runRagOptimization(options.optimization!)),\n summarizeOptimization,\n 'no full RAG optimization options provided',\n )\n }\n retrieval = await runPhase(\n 'retrieval-tuning',\n retrieval,\n options.retrieval && (() => runRetrievalImprovementLoop(options.retrieval!)),\n summarizeOptimization,\n 'no retrieval options provided',\n )\n const runsAnswerQuality =\n phaseEnabled(options, 'answer-quality') && Boolean(options.evaluateAnswers)\n answerQuality = await runPhase(\n 'answer-quality',\n answerQuality,\n options.evaluateAnswers &&\n (async () => {\n const result = await options.evaluateAnswers!({\n ...context(),\n findings,\n acquisition,\n knowledgeUpdate,\n })\n assertRagAnswerEvidence(result)\n return result\n }),\n summarizeAnswerQuality,\n 'no answer-quality hook provided',\n )\n if (runsAnswerQuality) {\n findings = [...findings, ...(answerQuality!.findings ?? [])]\n }\n promotion = await runPhase(\n 'promotion',\n promotion,\n options.decidePromotion &&\n (() => {\n const evidenceRejection = rejectUnsafePromotionEvidence({\n optimization: optimization?.comparison,\n optimizationCostCeiling: options.optimization?.costCeiling,\n retrieval: retrieval?.comparison,\n retrievalCostCeiling: options.retrieval?.costCeiling,\n answerQuality,\n answerQualityCostCeiling: options.answerQualityCostCeiling,\n })\n return (\n evidenceRejection ??\n options.decidePromotion!({\n ...context(),\n optimizationComparison: optimization?.comparison,\n retrievalComparison: retrieval?.comparison,\n findings,\n acquisition,\n knowledgeUpdate,\n answerQuality,\n })\n )\n }),\n (result) => `${result.promoted ? 'promoted' : 'held'}: ${result.reason}`,\n 'no promotion decision hook provided',\n )\n\n return {\n goal: options.goal,\n phases,\n optimization,\n retrieval,\n findings,\n acquisition,\n knowledgeUpdate,\n answerQuality,\n promotion,\n }\n}\n\nfunction rejectUnsafePromotionEvidence(evidence: {\n optimization?: RunRagOptimizationResult['comparison']\n optimizationCostCeiling?: number\n retrieval?: RunRetrievalImprovementLoopResult['comparison']\n retrievalCostCeiling?: number\n answerQuality?: RagAnswerQualityResult\n answerQualityCostCeiling?: number\n}): RagPromotionResult | undefined {\n const reasons: string[] = []\n if (!evidence.optimization && !evidence.retrieval && !evidence.answerQuality) {\n reasons.push('promotion requires final RAG, retrieval, or answer-quality evidence')\n }\n for (const [label, comparison, costCeiling] of [\n ['RAG', evidence.optimization, evidence.optimizationCostCeiling],\n ['retrieval', evidence.retrieval, evidence.retrievalCostCeiling],\n ] as const) {\n if (!comparison) continue\n if (!comparison.totalCost.accountingComplete) {\n reasons.push(`${label} final comparison has incomplete cost accounting`)\n }\n const optimizerSource = comparison.best.provenance?.source\n if (optimizerSource && optimizerSource.evidence !== 'observed') {\n reasons.push(`${label} optimizer package identity was not observed`)\n }\n if (!comparison.best.decision.promote) {\n reasons.push(\n comparison.best.decision.low < 0\n ? `${label} final comparison does not rule out a regression`\n : `${label} final comparison does not establish the required improvement`,\n )\n }\n if (\n costCeiling !== undefined &&\n exceedsCostCeiling(comparison.totalCost.totalCostUsd, costCeiling)\n ) {\n reasons.push(\n `${label} final comparison cost ${comparison.totalCost.totalCostUsd} exceeds ${costCeiling}`,\n )\n }\n }\n if (evidence.answerQuality) {\n reasons.push(\n ...ragAnswerEvidenceRejectionReasons(\n evidence.answerQuality,\n evidence.answerQualityCostCeiling,\n ),\n )\n }\n if (reasons.length === 0) return undefined\n return {\n promoted: false,\n reason: reasons.join('; '),\n }\n}\n\nfunction assertOptionalCostCeiling(value: number | undefined, label: string): void {\n if (value !== undefined && (!Number.isFinite(value) || value < 0)) {\n throw new Error(`${label} must be a non-negative finite number`)\n }\n}\n\nfunction exceedsCostCeiling(totalCostUsd: number, costCeiling: number): boolean {\n const tolerance = Number.EPSILON * Math.max(1, Math.abs(totalCostUsd), Math.abs(costCeiling)) * 8\n return totalCostUsd - costCeiling > tolerance\n}\n\nfunction summarizeOptimization(\n result: RunRagOptimizationResult | RunRetrievalImprovementLoopResult,\n): string {\n return `${result.methodName}; winner=${result.winner.surfaceHash}`\n}\n\nasync function runKnowledgeResearchUpdate(\n options: RunRagKnowledgeImprovementLoopOptions,\n acquisition: KnowledgeResearchLoopDecision | undefined,\n): Promise<RagKnowledgeUpdateResult> {\n const research = options.knowledgeResearch\n if (!research) {\n throw new Error('knowledgeResearch options are required to run the knowledge update phase')\n }\n const { goal, step, ...rest } = research\n const researchStep = step ?? acquisitionBackedResearchStep(acquisition)\n const maxIterations = step ? rest.maxIterations : 1\n const result = await runKnowledgeResearchLoop({\n ...rest,\n goal: goal ?? options.goal,\n maxIterations,\n signal: options.signal,\n step: researchStep,\n })\n return {\n applied: result.steps.some((stepResult) => {\n return stepResult.addedSources.length > 0 || Boolean(stepResult.applied)\n }),\n summary: `${result.iterations} research iteration(s); done=${String(result.done)}`,\n research: result,\n }\n}\n\nfunction acquisitionBackedResearchStep(\n acquisition: KnowledgeResearchLoopDecision | undefined,\n): RunKnowledgeResearchLoopOptions['step'] {\n if (!acquisition) {\n throw new Error(\n 'knowledgeResearch requires either a step hook or a knowledge-acquisition result to apply',\n )\n }\n return () => ({ ...acquisition, done: acquisition.done ?? true })\n}\n\nfunction selectOptimization(\n result: RunRagOptimizationResult | RunRetrievalImprovementLoopResult | undefined,\n): RagOptimizationSelection | undefined {\n if (!result) return undefined\n return {\n methodName: result.methodName,\n baseline: structuredClone(result.baseline),\n winner: structuredClone(result.winner),\n baselineConfig: structuredClone(result.baselineConfig),\n winnerConfig: structuredClone(result.winnerConfig),\n }\n}\n\nfunction summarizeAcquisitionDecision(decision: KnowledgeResearchLoopDecision): string {\n const sourcePathCount = decision.sourcePaths?.length ?? 0\n const sourceTextCount = decision.sourceTexts?.length ?? 0\n const proposal = decision.proposalText ? 'proposal' : 'no proposal'\n return `${sourcePathCount} path source(s), ${sourceTextCount} text source(s), ${proposal}`\n}\n\nfunction summarizeAnswerQuality(result: RagAnswerQualityResult): string {\n const metrics = Object.entries(result.metrics)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([key, value]) => `${key}=${formatMetric(value)}`)\n .join(', ')\n return `${result.passed ? 'passed' : 'failed'}${metrics ? `; ${metrics}` : ''}`\n}\n\nfunction formatMetric(value: number): string {\n return Number.isFinite(value) ? value.toFixed(3) : String(value)\n}\n\nfunction phaseEnabled(\n options: RunRagKnowledgeImprovementLoopOptions,\n phase: RagKnowledgeImprovementPhase,\n): boolean {\n return !options.enabledPhases || options.enabledPhases.includes(phase)\n}\n\nfunction assertConfiguredRequiredPhases(options: RunRagKnowledgeImprovementLoopOptions): void {\n for (const phase of options.requiredPhases ?? []) {\n if (!phaseEnabled(options, phase)) {\n throw new Error(`required phase ${phase} is not enabled`)\n }\n if (!phaseConfigured(options, phase)) {\n throw new Error(requiredPhaseMessage(phase))\n }\n }\n}\n\nfunction phaseConfigured(\n options: RunRagKnowledgeImprovementLoopOptions,\n phase: RagKnowledgeImprovementPhase,\n): boolean {\n switch (phase) {\n case 'rag-optimization':\n return Boolean(options.optimization)\n case 'retrieval-tuning':\n return Boolean(options.retrieval)\n case 'gap-diagnosis':\n return Boolean(options.diagnose)\n case 'knowledge-acquisition':\n return Boolean(options.acquireKnowledge)\n case 'knowledge-update':\n return Boolean(options.updateKnowledge ?? options.knowledgeResearch)\n case 'answer-quality':\n return Boolean(options.evaluateAnswers)\n case 'promotion':\n return Boolean(options.decidePromotion)\n }\n}\n\nfunction requiredPhaseMessage(phase: RagKnowledgeImprovementPhase): string {\n switch (phase) {\n case 'rag-optimization':\n return 'required phase rag-optimization requires optimization options'\n case 'retrieval-tuning':\n return 'required phase retrieval-tuning requires retrieval options'\n case 'gap-diagnosis':\n return 'required phase gap-diagnosis requires a diagnose hook'\n case 'knowledge-acquisition':\n return 'required phase knowledge-acquisition requires an acquireKnowledge hook'\n case 'knowledge-update':\n return 'required phase knowledge-update requires updateKnowledge or knowledgeResearch'\n case 'answer-quality':\n return 'required phase answer-quality requires an evaluateAnswers hook'\n case 'promotion':\n return 'required phase promotion requires a decidePromotion hook'\n }\n}\n\nfunction assertNotAborted(signal: AbortSignal | undefined): void {\n if (signal?.aborted) {\n throw new Error('RAG knowledge improvement loop aborted')\n }\n}\n","import type { ComparisonCost } from '@tangle-network/agent-eval/campaign'\nimport type { AgentCandidateJsonValue as JsonValue } from '@tangle-network/agent-interface'\nimport { runRagKnowledgeImprovementPhases } from './rag-improvement-phases'\nimport type { RunRagOptimizationOptions, RunRagOptimizationResult } from './rag-optimization'\nimport type {\n KnowledgeResearchLoopDecision,\n KnowledgeResearchLoopResult,\n RunKnowledgeResearchLoopOptions,\n} from './research-loop'\nimport type {\n RunRetrievalImprovementLoopOptions,\n RunRetrievalImprovementLoopResult,\n} from './retrieval-optimization'\n\nexport type RagKnowledgeImprovementPhase =\n | 'rag-optimization'\n | 'retrieval-tuning'\n | 'gap-diagnosis'\n | 'knowledge-acquisition'\n | 'knowledge-update'\n | 'answer-quality'\n | 'promotion'\n\nexport type RagKnowledgeImprovementPhaseStatus = 'completed' | 'skipped' | 'failed'\n\nexport type RagGapKind =\n | 'missing-source'\n | 'stale-source'\n | 'retrieval-miss'\n | 'retrieval-noise'\n | 'chunking-mismatch'\n | 'missing-multihop-evidence'\n | 'generator-unsupported-claim'\n | 'citation-mismatch'\n | 'incorrect-abstention'\n | 'unknown'\n\nexport type RagGapSeverity = 'info' | 'warning' | 'error' | 'critical'\n\nexport interface RagGapFinding {\n id: string\n kind: RagGapKind\n severity: RagGapSeverity\n message: string\n scenarioId?: string\n evidence?: Record<string, JsonValue>\n}\n\nexport interface RagKnowledgeImprovementPhaseResult {\n phase: RagKnowledgeImprovementPhase\n status: RagKnowledgeImprovementPhaseStatus\n summary: string\n startedAt: string\n finishedAt: string\n metadata?: Record<string, JsonValue>\n}\n\nexport type RagOptimizationSelection = Pick<\n RunRagOptimizationResult,\n 'methodName' | 'baseline' | 'winner' | 'baselineConfig' | 'winnerConfig'\n>\n\nexport type RetrievalOptimizationSelection = Pick<\n RunRetrievalImprovementLoopResult,\n 'methodName' | 'baseline' | 'winner' | 'baselineConfig' | 'winnerConfig'\n>\n\nexport interface RagPhaseInputBase {\n goal: string\n phases: readonly RagKnowledgeImprovementPhaseResult[]\n /** Selected candidate only. Adaptive update callbacks run before final scoring starts. */\n optimization?: RagOptimizationSelection\n signal?: AbortSignal\n}\n\nexport interface RagDiagnosisInput extends RagPhaseInputBase {\n retrieval?: RetrievalOptimizationSelection\n}\n\nexport interface RagKnowledgeAcquisitionInput extends RagPhaseInputBase {\n retrieval?: RetrievalOptimizationSelection\n findings: readonly RagGapFinding[]\n}\n\nexport interface RagKnowledgeUpdateInput extends RagPhaseInputBase {\n retrieval?: RetrievalOptimizationSelection\n findings: readonly RagGapFinding[]\n acquisition?: KnowledgeResearchLoopDecision\n}\n\nexport interface RagKnowledgeUpdateResult {\n applied: boolean\n summary: string\n research?: KnowledgeResearchLoopResult\n metadata?: Record<string, JsonValue>\n}\n\nexport interface RagAnswerQualityInput extends RagPhaseInputBase {\n retrieval?: RetrievalOptimizationSelection\n findings: readonly RagGapFinding[]\n acquisition?: KnowledgeResearchLoopDecision\n knowledgeUpdate?: RagKnowledgeUpdateResult\n}\n\nexport interface RagAnswerQualityResult {\n passed: boolean\n metrics: Record<string, number>\n finalScenarioIds: readonly string[]\n datasetRef: string\n evaluatorRef: string\n cost: ComparisonCost\n findings?: readonly RagGapFinding[]\n metadata?: Record<string, JsonValue>\n}\n\nexport interface RagPromotionInput extends RagPhaseInputBase {\n retrieval?: RetrievalOptimizationSelection\n /** Full final-case result available only to the terminal promotion decision. */\n optimizationComparison?: RunRagOptimizationResult['comparison']\n /** Full final-case result available only to the terminal promotion decision. */\n retrievalComparison?: RunRetrievalImprovementLoopResult['comparison']\n findings: readonly RagGapFinding[]\n acquisition?: KnowledgeResearchLoopDecision\n knowledgeUpdate?: RagKnowledgeUpdateResult\n answerQuality?: RagAnswerQualityResult\n}\n\nexport interface RagPromotionResult {\n promoted: boolean\n reason: string\n metadata?: Record<string, JsonValue>\n}\n\nexport interface RagKnowledgeResearchOptions\n extends Omit<RunKnowledgeResearchLoopOptions, 'goal' | 'signal' | 'step'> {\n goal?: string\n step?: RunKnowledgeResearchLoopOptions['step']\n}\n\nexport interface RunRagKnowledgeImprovementLoopOptions {\n goal: string\n optimization?: RunRagOptimizationOptions\n retrieval?: RunRetrievalImprovementLoopOptions\n diagnose?: (input: RagDiagnosisInput) => MaybePromise<readonly RagGapFinding[]>\n acquireKnowledge?: (\n input: RagKnowledgeAcquisitionInput,\n ) => MaybePromise<KnowledgeResearchLoopDecision>\n knowledgeResearch?: RagKnowledgeResearchOptions\n updateKnowledge?: (input: RagKnowledgeUpdateInput) => MaybePromise<RagKnowledgeUpdateResult>\n evaluateAnswers?: (input: RagAnswerQualityInput) => MaybePromise<RagAnswerQualityResult>\n /** Maximum total answer-evaluation spend accepted for promotion. */\n answerQualityCostCeiling?: number\n /**\n * Makes a side-effect-free promotion decision after the library has rejected\n * missing, inconclusive, regressing, unaccounted, or over-budget final evidence.\n */\n decidePromotion?: (input: RagPromotionInput) => MaybePromise<RagPromotionResult>\n enabledPhases?: readonly RagKnowledgeImprovementPhase[]\n requiredPhases?: readonly RagKnowledgeImprovementPhase[]\n signal?: AbortSignal\n now?: () => Date\n}\n\nexport interface RunRagKnowledgeImprovementLoopResult {\n goal: string\n phases: readonly RagKnowledgeImprovementPhaseResult[]\n optimization?: RunRagOptimizationResult\n retrieval?: RunRetrievalImprovementLoopResult\n findings: readonly RagGapFinding[]\n acquisition?: KnowledgeResearchLoopDecision\n knowledgeUpdate?: RagKnowledgeUpdateResult\n answerQuality?: RagAnswerQualityResult\n promotion?: RagPromotionResult\n}\n\ntype MaybePromise<T> = T | Promise<T>\n\nexport async function runRagKnowledgeImprovementLoop(\n options: RunRagKnowledgeImprovementLoopOptions,\n): Promise<RunRagKnowledgeImprovementLoopResult> {\n return runRagKnowledgeImprovementPhases(options)\n}\n","import { createHash } from 'node:crypto'\nimport { cp, lstat, mkdir, mkdtemp, rm } from 'node:fs/promises'\nimport { tmpdir } from 'node:os'\nimport { dirname, join } from 'node:path'\nimport { canonicalJson, contentHash } from '@tangle-network/agent-eval'\nimport {\n canonicalPathsEqual,\n isMissingFile,\n listRegularFilesWithinRoot,\n readRegularFileWithinRoot,\n renameDurable,\n withSafeDirectory,\n} from '../durable-fs'\nimport { sha256, stableId } from '../ids'\nimport { writeKnowledgeIndex } from '../indexer'\nimport {\n KNOWLEDGE_RESEARCH_STATE_PATHS,\n type KnowledgeStateScope,\n normalizeKnowledgeStateScope,\n} from '../knowledge-state-scope'\nimport { withKnowledgeRead } from '../mutation-lock'\nimport { immutableJsonValue } from './activation'\nimport type {\n KnowledgeImprovementCandidateRecord,\n KnowledgeImprovementCandidateRef,\n KnowledgeImprovementEvidence,\n KnowledgeImprovementResult,\n KnowledgeImprovementRunState,\n KnowledgeImprovementTarget,\n ResolvedKnowledgeImprovementCandidate,\n ResolvedKnowledgeImprovementComparison,\n UseKnowledgeImprovementCandidateOptions,\n} from './contracts'\nimport {\n KnowledgeImprovementCandidateRefSchema,\n KnowledgeImprovementEvidenceSchema,\n safePathSegmentSchema,\n} from './contracts'\nimport {\n assertExactCandidatePlatform,\n candidateEvidenceRelativePath,\n loadKnowledgeImprovementStateFromRun,\n withKnowledgeImprovementRun,\n} from './state'\n\n/** Freeze the exact knowledge bytes and measured evidence a later approval may promote. */\nexport function knowledgeImprovementCandidateRef(\n result: Pick<KnowledgeImprovementResult, 'runId' | 'state' | 'candidate'>,\n): KnowledgeImprovementCandidateRef {\n if (!result.candidate) throw new Error('knowledge improvement result has no candidate')\n return candidateRefFor(result.runId, result.state, result.candidate)\n}\n\n/** Use both frozen sides of one measured comparison in isolated, integrity-checked copies. */\nexport async function withKnowledgeImprovementComparison<T>(\n options: UseKnowledgeImprovementCandidateOptions,\n use: (comparison: ResolvedKnowledgeImprovementComparison) => Promise<T> | T,\n): Promise<T> {\n assertExactCandidatePlatform()\n const reference = Object.freeze(KnowledgeImprovementCandidateRefSchema.parse(options.candidate))\n return withKnowledgeImprovementRun(options.root, reference.runId, false, async (runDir) => {\n const state = await loadKnowledgeImprovementStateFromRun(options.root, reference.runId, runDir)\n return withMeasuredCandidateSnapshot(options.root, runDir, state, reference, (resolved) =>\n withBaselineSnapshot(\n runDir,\n reference.baseHash,\n (baselineRoot) =>\n withIsolatedKnowledgeCopy(\n baselineRoot,\n reference.baseHash,\n 'baseline',\n (baseline) =>\n withIsolatedKnowledgeCopy(\n resolved.root,\n reference.candidateHash,\n 'candidate',\n (candidate) =>\n use(\n Object.freeze({\n reference,\n stateScope: Object.freeze(normalizeKnowledgeStateScope(state.stateScope)),\n evaluation: immutableJsonValue(structuredClone(resolved.evidence.evaluation)),\n baseline: Object.freeze({ root: baseline, hash: reference.baseHash }),\n candidate: Object.freeze({ root: candidate, hash: reference.candidateHash }),\n }),\n ),\n state.stateScope,\n ),\n state.stateScope,\n ),\n state.stateScope,\n ),\n )\n })\n}\n\n/** Use the frozen candidate side of one measured comparison. */\nexport async function withKnowledgeImprovementCandidate<T>(\n options: UseKnowledgeImprovementCandidateOptions,\n use: (candidate: ResolvedKnowledgeImprovementCandidate) => Promise<T> | T,\n): Promise<T> {\n assertExactCandidatePlatform()\n const candidateRef = Object.freeze(\n KnowledgeImprovementCandidateRefSchema.parse(options.candidate),\n )\n return withKnowledgeImprovementRun(options.root, candidateRef.runId, false, async (runDir) => {\n const state = await loadKnowledgeImprovementStateFromRun(\n options.root,\n candidateRef.runId,\n runDir,\n )\n return withMeasuredCandidateSnapshot(options.root, runDir, state, candidateRef, (resolved) =>\n withIsolatedKnowledgeCopy(\n resolved.root,\n candidateRef.candidateHash,\n 'candidate',\n (root) =>\n use(\n Object.freeze({\n root,\n candidate: candidateRef,\n stateScope: Object.freeze(normalizeKnowledgeStateScope(state.stateScope)),\n evaluation: immutableJsonValue(structuredClone(resolved.evidence.evaluation)),\n }),\n ),\n state.stateScope,\n ),\n )\n })\n}\n\nexport function candidateRefFor(\n runId: string,\n state: KnowledgeImprovementRunState,\n candidate: KnowledgeImprovementCandidateRecord,\n): KnowledgeImprovementCandidateRef {\n if (candidate.status !== 'candidate-ready' && candidate.status !== 'promoted') {\n throw new Error(`knowledge candidate '${candidate.candidateId}' is not ready`)\n }\n return candidateIdentityFor(runId, state, candidate)\n}\n\nexport function candidateIdentityFor(\n runId: string,\n state: KnowledgeImprovementRunState,\n candidate: KnowledgeImprovementCandidateRecord,\n): KnowledgeImprovementCandidateRef {\n if (!candidate.candidateHash) {\n throw new Error(`knowledge candidate '${candidate.candidateId}' has no content hash`)\n }\n if (!candidate.evidenceHash) {\n throw new Error(`knowledge candidate '${candidate.candidateId}' has no evidence hash`)\n }\n if (!candidate.promotionPlanHash) {\n throw new Error(`knowledge candidate '${candidate.candidateId}' has no promotion plan hash`)\n }\n return Object.freeze({\n kind: 'knowledge-improvement-candidate',\n runId,\n candidateId: candidate.candidateId,\n goalHash: sha256(state.goal),\n baseHash: candidate.baseHash,\n candidateHash: candidate.candidateHash,\n evidenceHash: candidate.evidenceHash,\n promotionPlanHash: candidate.promotionPlanHash,\n })\n}\n\nexport async function withMeasuredCandidateSnapshot<T>(\n liveRoot: string,\n runDir: string,\n state: KnowledgeImprovementRunState,\n candidateRef: KnowledgeImprovementCandidateRef,\n use: (snapshot: {\n root: string\n candidate: KnowledgeImprovementCandidateRecord\n evidence: KnowledgeImprovementEvidence\n }) => Promise<T> | T,\n): Promise<T> {\n await assertStateIdentity(liveRoot, candidateRef, state)\n const candidate = state.candidates.find((entry) => entry.candidateId === candidateRef.candidateId)\n if (!candidate) {\n throw new Error(`knowledge candidate '${candidateRef.candidateId}' does not exist`)\n }\n const expectedRef = candidateRefFor(candidateRef.runId, state, candidate)\n if (canonicalJson(expectedRef) !== canonicalJson(candidateRef)) {\n throw new Error('knowledge candidate approval does not match the measured candidate')\n }\n const evidence = await assertCandidateEvidence(runDir, candidateRef, state.implementationRef)\n const relativePath = join(\n 'candidates',\n candidate.candidateId,\n 'snapshots',\n candidateRef.candidateHash,\n )\n return withSafeDirectory(runDir, relativePath, false, async (root) => {\n if ((await hashKnowledgeBase(root, state.stateScope)) !== candidateRef.candidateHash) {\n throw new Error('knowledge candidate snapshot changed after approval')\n }\n const result = await use({ root, candidate, evidence })\n if ((await hashKnowledgeBase(root, state.stateScope)) !== candidateRef.candidateHash) {\n throw new Error('knowledge candidate snapshot changed during use')\n }\n return result\n })\n}\n\nasync function withIsolatedKnowledgeCopy<T>(\n sourceRoot: string,\n expectedHash: string,\n target: KnowledgeImprovementTarget,\n use: (root: string) => Promise<T> | T,\n scope?: KnowledgeStateScope,\n): Promise<T> {\n const isolationRoot = await mkdtemp(join(tmpdir(), 'agent-knowledge-snapshot-'))\n const snapshotRoot = join(isolationRoot, 'snapshot')\n try {\n await copyKnowledgeWorkspace(sourceRoot, snapshotRoot, scope)\n if ((await hashKnowledgeBase(snapshotRoot, scope)) !== expectedHash) {\n throw new Error(`isolated knowledge ${target} does not match its measured content`)\n }\n const result = await use(snapshotRoot)\n if ((await hashKnowledgeBase(snapshotRoot, scope)) !== expectedHash) {\n throw new Error(`knowledge ${target} snapshot changed during use`)\n }\n return result\n } finally {\n await rm(isolationRoot, { recursive: true, force: true })\n }\n}\n\nexport async function assertCandidateEvidence(\n runDir: string,\n candidate: KnowledgeImprovementCandidateRef,\n expectedImplementationRef: string,\n): Promise<KnowledgeImprovementEvidence> {\n const evidence = KnowledgeImprovementEvidenceSchema.parse(\n JSON.parse(\n (\n await readRegularFileWithinRoot(\n runDir,\n candidateEvidenceRelativePath(candidate.candidateId),\n )\n ).bytes.toString('utf8'),\n ),\n )\n const actualHash = contentHash(evidence)\n if (actualHash !== candidate.evidenceHash) {\n throw new Error(\n `knowledge candidate evidence changed after approval: expected ${candidate.evidenceHash}, got ${actualHash}`,\n )\n }\n if (\n evidence.runId !== candidate.runId ||\n evidence.candidateId !== candidate.candidateId ||\n evidence.goalHash !== candidate.goalHash ||\n evidence.implementationRef !== expectedImplementationRef ||\n evidence.baseHash !== candidate.baseHash ||\n evidence.candidateHash !== candidate.candidateHash ||\n evidence.promotionPlanHash !== candidate.promotionPlanHash ||\n evidence.evaluation.passed !== true\n ) {\n throw new Error('knowledge candidate evidence does not match the approved candidate')\n }\n return evidence\n}\n\nexport async function assertStateIdentity(\n root: string,\n candidateRef: KnowledgeImprovementCandidateRef,\n state: KnowledgeImprovementRunState,\n): Promise<void> {\n if (state.runId !== candidateRef.runId) {\n throw new Error('knowledge candidate run identity does not match persisted state')\n }\n if (!(await canonicalPathsEqual(state.root, root))) {\n throw new Error('knowledge candidate root does not match persisted state')\n }\n if (sha256(state.goal) !== candidateRef.goalHash) {\n throw new Error('knowledge candidate goal does not match persisted state')\n }\n if (state.baseHash !== candidateRef.baseHash) {\n throw new Error('knowledge candidate base does not match persisted state')\n }\n}\n\nexport async function createCandidateWorkspace(\n runDir: string,\n state: KnowledgeImprovementRunState,\n root: string,\n now: () => Date,\n): Promise<KnowledgeImprovementCandidateRecord> {\n const iteration = state.candidates.length + 1\n const candidateId = stableId('kcand', `${state.runId}:${iteration}:${now().toISOString()}`)\n const candidateRoot = candidateWorkspacePath(runDir, candidateId)\n await copyKnowledgeWorkspace(root, candidateRoot, state.stateScope)\n const createdAt = now().toISOString()\n return {\n iteration,\n candidateId,\n baseHash: state.baseHash,\n status: 'running',\n createdAt,\n updatedAt: createdAt,\n }\n}\n\nfunction candidateWorkspacePath(runDir: string, candidateId: string): string {\n return join(runDir, 'candidates', safePathSegmentSchema.parse(candidateId), 'workspace')\n}\n\nfunction baselineSnapshotPath(runDir: string): string {\n return join(runDir, 'baseline')\n}\n\nexport async function createBaselineSnapshot(\n runDir: string,\n root: string,\n expectedHash: string,\n scope?: KnowledgeStateScope,\n): Promise<void> {\n const target = baselineSnapshotPath(runDir)\n try {\n await assertBaselineSnapshot(runDir, expectedHash, scope)\n return\n } catch (error) {\n if (!isMissingFile(error)) throw error\n }\n const preparation = await mkdtemp(join(runDir, 'baseline-prepare-'))\n let activated = false\n try {\n await copyKnowledgeWorkspace(root, preparation, scope)\n const actualHash = await hashKnowledgeBase(preparation, scope)\n if (actualHash !== expectedHash) {\n throw new Error(\n `knowledge base changed while baseline was frozen: expected ${expectedHash}, got ${actualHash}`,\n )\n }\n await renameDurable(preparation, target)\n activated = true\n } finally {\n if (!activated) await rm(preparation, { recursive: true, force: true })\n }\n}\n\nexport async function ensureBaselineSnapshot(\n runDir: string,\n root: string,\n expectedHash: string,\n scope?: KnowledgeStateScope,\n): Promise<void> {\n try {\n await assertBaselineSnapshot(runDir, expectedHash, scope)\n } catch (error) {\n if (!isMissingFile(error)) throw error\n const liveHash = await hashKnowledgeBase(root, scope)\n if (liveHash !== expectedHash) {\n throw new Error(\n 'knowledge improvement baseline snapshot is missing and cannot be reconstructed',\n )\n }\n await createBaselineSnapshot(runDir, root, expectedHash, scope)\n }\n}\n\nasync function assertBaselineSnapshot(\n runDir: string,\n expectedHash: string,\n scope?: KnowledgeStateScope,\n): Promise<void> {\n await withBaselineSnapshot(runDir, expectedHash, () => undefined, scope)\n}\n\nexport async function withBaselineSnapshot<T>(\n runDir: string,\n expectedHash: string,\n use: (baselineRoot: string) => Promise<T> | T,\n scope?: KnowledgeStateScope,\n): Promise<T> {\n return withSafeDirectory(runDir, 'baseline', false, async (baselineRoot) => {\n const actualHash = await hashKnowledgeBase(baselineRoot, scope)\n if (actualHash !== expectedHash) {\n throw new Error(\n `knowledge improvement baseline changed: expected ${expectedHash}, got ${actualHash}`,\n )\n }\n return use(baselineRoot)\n })\n}\n\nexport async function withFrozenCandidateWorkspace<T>(\n runDir: string,\n candidate: KnowledgeImprovementCandidateRecord,\n candidateRoot: string,\n use: (snapshot: { root: string; hash: string }) => Promise<T> | T,\n scope?: KnowledgeStateScope,\n): Promise<T> {\n const snapshotsPath = join(\n 'candidates',\n safePathSegmentSchema.parse(candidate.candidateId),\n 'snapshots',\n )\n return withSafeDirectory(runDir, snapshotsPath, true, async (snapshotsDir) => {\n const preparation = await mkdtemp(join(snapshotsDir, 'prepare-'))\n let activated = false\n try {\n await copyKnowledgeWorkspace(candidateRoot, preparation, scope)\n const hash = await hashKnowledgeBase(preparation, scope)\n try {\n const result = await withSafeDirectory(snapshotsDir, hash, false, async (existing) => {\n if ((await hashKnowledgeBase(existing, scope)) !== hash) {\n throw new Error('knowledge candidate snapshot does not match its content identity')\n }\n return use({ root: existing, hash })\n })\n await rm(preparation, { recursive: true, force: true })\n activated = true\n return result\n } catch (error) {\n if (!isMissingFile(error)) throw error\n }\n await renameDurable(preparation, join(snapshotsDir, hash))\n activated = true\n return withSafeDirectory(snapshotsDir, hash, false, (root) => use({ root, hash }))\n } finally {\n if (!activated) await rm(preparation, { recursive: true, force: true })\n }\n })\n}\n\nexport function clearCandidateMeasurement(candidate: KnowledgeImprovementCandidateRecord): void {\n delete candidate.candidateHash\n delete candidate.evidenceHash\n delete candidate.promotionPlanHash\n}\n\nasync function copyKnowledgeWorkspace(\n sourceRoot: string,\n targetRoot: string,\n scope?: KnowledgeStateScope,\n): Promise<void> {\n const normalized = normalizeKnowledgeStateScope(scope)\n await withKnowledgeRead(sourceRoot, async () => {\n await rm(targetRoot, { recursive: true, force: true })\n await mkdir(join(targetRoot, normalized.pagesDirectory), { recursive: true })\n await mkdir(join(targetRoot, 'raw', 'sources'), { recursive: true })\n for (const path of knowledgeScopePaths(normalized)) {\n await copyIfExists(join(sourceRoot, path), join(targetRoot, path))\n }\n })\n await writeKnowledgeIndex(targetRoot, { pagesDirectory: normalized.pagesDirectory })\n}\n\nfunction knowledgeScopePaths(scope: KnowledgeStateScope): string[] {\n const normalized = normalizeKnowledgeStateScope(scope)\n return [\n normalized.pagesDirectory,\n 'raw',\n '.agent-knowledge/sources.json',\n ...(normalized.researchState ? KNOWLEDGE_RESEARCH_STATE_PATHS : []),\n ]\n}\n\nasync function copyIfExists(source: string, target: string): Promise<void> {\n let sourceStat: Awaited<ReturnType<typeof lstat>>\n try {\n sourceStat = await lstat(source)\n } catch (error) {\n if (isMissingFile(error)) return\n throw error\n }\n if (!sourceStat.isDirectory() && !sourceStat.isFile()) {\n throw new Error(`knowledge surface contains an unsupported filesystem entry: ${source}`)\n }\n await mkdir(dirname(target), { recursive: true })\n await cp(source, target, { recursive: sourceStat.isDirectory(), dereference: false })\n}\n\nexport async function hashKnowledgeBase(\n root: string,\n scope?: KnowledgeStateScope,\n): Promise<string> {\n return withKnowledgeRead(root, () => hashKnowledgeBaseUnlocked(root, scope))\n}\n\nasync function hashKnowledgeBaseUnlocked(\n root: string,\n scope?: KnowledgeStateScope,\n): Promise<string> {\n const normalized = normalizeKnowledgeStateScope(scope)\n const entries = await knowledgeHashEntries(root, normalized)\n const files = entries.map(({ path, hash, mode }) => ({ path, hash, mode }))\n return sha256(\n JSON.stringify(\n normalized.pagesDirectory === 'knowledge' && !normalized.researchState\n ? files\n : { scope: normalized, files },\n ),\n )\n}\n\nexport interface KnowledgeFileIdentity {\n path: string\n hash: string\n transactionHash: string\n mode: number\n}\n\nexport async function knowledgeHashEntries(\n root: string,\n scope?: KnowledgeStateScope,\n): Promise<KnowledgeFileIdentity[]> {\n const entries: KnowledgeFileIdentity[] = []\n for (const path of knowledgeScopePaths(scope ?? {})) {\n try {\n const files =\n path === '.agent-knowledge/sources.json' || path === '.agent-knowledge/events.json'\n ? [{ ...(await readRegularFileWithinRoot(root, path)), path }]\n : await listRegularFilesWithinRoot(root, path)\n for (const file of files)\n entries.push(knowledgeFileIdentity(file.path, file.bytes, file.mode))\n } catch (error) {\n if (!isMissingFile(error)) throw error\n }\n }\n entries.sort((a, b) => a.path.localeCompare(b.path))\n return entries\n}\n\nfunction knowledgeFileIdentity(path: string, bytes: Buffer, mode: number): KnowledgeFileIdentity {\n return {\n path,\n hash: sha256(bytes.toString('base64')),\n transactionHash: createHash('sha256').update(bytes).digest('hex'),\n mode,\n }\n}\n","import { createHash } from 'node:crypto'\nimport { canonicalJson, contentHash } from '@tangle-network/agent-eval'\nimport type { AgentImprovementActivationResult } from '@tangle-network/agent-interface'\nimport { readRegularFileWithinRoot } from '../durable-fs'\nimport {\n applyKnowledgeFileTransaction,\n assertKnowledgeMutationPath,\n finishKnowledgeFileTransaction,\n type KnowledgeFileMutation,\n type KnowledgeFileTransaction,\n type KnowledgeFileTransactionPlanEntry,\n knowledgeFileTransactionPlanHash,\n prepareKnowledgeFileTransaction,\n rollbackKnowledgeFileTransaction,\n} from '../file-transaction'\nimport { writeKnowledgeIndex } from '../indexer'\nimport { type KnowledgeStateScope, normalizeKnowledgeStateScope } from '../knowledge-state-scope'\nimport { withKnowledgeMutation } from '../mutation-lock'\nimport type { RunRagKnowledgeImprovementLoopResult } from '../rag-improvement-loop'\nimport type { ResolvedKnowledgeImprovementActivationPersistence } from './activation'\nimport {\n loadKnowledgeActivationRecord,\n persistKnowledgeActivationResult,\n resolveKnowledgeActivationPersistence,\n sourceKnowledgeHash,\n} from './activation'\nimport type {\n KnowledgeImprovementCandidateRecord,\n KnowledgeImprovementCandidateRef,\n KnowledgeImprovementMutationReceipt,\n KnowledgeImprovementMutationResult,\n KnowledgeImprovementOptions,\n KnowledgeImprovementRunState,\n KnowledgeImprovementTarget,\n PromoteKnowledgeCandidateOptions,\n RestoreKnowledgeCandidateBaselineOptions,\n} from './contracts'\nimport { DEFAULT_LEASE_TTL_MS, KnowledgeImprovementCandidateRefSchema } from './contracts'\nimport {\n acquireRunLease,\n appendLedger,\n assertExactCandidatePlatform,\n blockRun,\n loadKnowledgeImprovementEventsFromRun,\n loadKnowledgeImprovementStateFromRun,\n saveState,\n withKnowledgeImprovementRun,\n} from './state'\nimport {\n assertCandidateEvidence,\n assertStateIdentity,\n candidateIdentityFor,\n hashKnowledgeBase,\n knowledgeHashEntries,\n withBaselineSnapshot,\n withMeasuredCandidateSnapshot,\n} from './workspace'\n\n/** Promote one previously measured candidate without rerunning research or evaluation. */\nexport async function promoteKnowledgeCandidate(\n options: PromoteKnowledgeCandidateOptions,\n): Promise<KnowledgeImprovementMutationResult> {\n return transitionKnowledgeCandidate(options, 'candidate')\n}\n\n/** Restore the frozen baseline paired with one previously measured candidate. */\nexport async function restoreKnowledgeCandidateBaseline(\n options: RestoreKnowledgeCandidateBaselineOptions,\n): Promise<KnowledgeImprovementMutationResult> {\n return transitionKnowledgeCandidate(options, 'baseline')\n}\n\nasync function transitionKnowledgeCandidate(\n options: PromoteKnowledgeCandidateOptions,\n target: KnowledgeImprovementTarget,\n): Promise<KnowledgeImprovementMutationResult> {\n assertExactCandidatePlatform()\n const candidateRef = Object.freeze(\n KnowledgeImprovementCandidateRefSchema.parse(options.candidate),\n )\n const now = options.now ?? (() => new Date())\n const activation = options.activation\n ? resolveKnowledgeActivationPersistence(options.activation, candidateRef, target)\n : undefined\n return withKnowledgeImprovementRun(options.root, candidateRef.runId, false, async (runDir) => {\n const lease = await acquireRunLease(runDir, {\n ownerId: options.ownerId ?? `pid-${process.pid}`,\n ttlMs: options.leaseTtlMs ?? DEFAULT_LEASE_TTL_MS,\n })\n try {\n lease.assertOwned()\n const state = await loadKnowledgeImprovementStateFromRun(\n options.root,\n candidateRef.runId,\n runDir,\n )\n return await applyKnowledgeCandidateTarget(\n {\n root: options.root,\n runDir,\n state,\n candidateRef,\n leaseTtlMs: options.leaseTtlMs ?? DEFAULT_LEASE_TTL_MS,\n assertRunOwned: lease.assertOwned,\n now,\n onState: options.onState,\n activation,\n },\n target,\n )\n } finally {\n await lease.release()\n }\n })\n}\n\ninterface KnowledgeCandidateTransitionInput {\n root: string\n runDir: string\n state: KnowledgeImprovementRunState\n candidateRef: KnowledgeImprovementCandidateRef\n activation?: ResolvedKnowledgeImprovementActivationPersistence\n leaseTtlMs: number\n assertRunOwned(): void\n now: () => Date\n onState?: KnowledgeImprovementOptions['onState']\n lifecycle?: RunRagKnowledgeImprovementLoopResult\n}\n\nasync function applyKnowledgeCandidateTarget(\n input: KnowledgeCandidateTransitionInput,\n target: KnowledgeImprovementTarget,\n): Promise<KnowledgeImprovementMutationResult> {\n const { candidateRef, runDir, state } = input\n await assertStateIdentity(input.root, candidateRef, state)\n const candidate = state.candidates.find((entry) => entry.candidateId === candidateRef.candidateId)\n if (\n !candidate ||\n canonicalJson(candidateIdentityFor(candidateRef.runId, state, candidate)) !==\n canonicalJson(candidateRef)\n ) {\n throw new Error('knowledge candidate approval does not match the measured candidate')\n }\n const action = target === 'candidate' ? 'promotion' : 'restore'\n const desiredHash = target === 'candidate' ? candidateRef.candidateHash : candidateRef.baseHash\n const purpose = knowledgeCandidateTransitionPurpose(candidateRef, state.implementationRef, target)\n const recoveryOwner = input.activation\n ? `knowledge-improvement-activation:${input.activation.activation.digest}`\n : 'knowledge-improvement-candidate-transition'\n return withKnowledgeMutation(\n input.root,\n async (mutationLock) => {\n const assertOwned = () => {\n mutationLock.assertOwned()\n input.assertRunOwned()\n }\n assertOwned()\n const transactionRoot = mutationLock.transactionRoot\n const recovery =\n mutationLock.recovery?.purpose === purpose ? mutationLock.recovery : undefined\n if (!recovery) {\n await assertCandidateEvidence(runDir, candidateRef, state.implementationRef)\n }\n const existingActivation = input.activation\n ? await loadKnowledgeActivationRecord(\n runDir,\n candidateRef,\n input.activation.activation,\n target,\n input.activation.identity,\n )\n : null\n if (existingActivation) {\n if (recovery?.direction === 'rollback') {\n throw new Error('stored knowledge activation result conflicts with a pending rollback')\n }\n if (recovery) {\n const recoveredHash = await hashKnowledgeBase(input.root, state.stateScope)\n if (recoveredHash !== existingActivation.mutation.afterHash) {\n throw new Error('stored knowledge activation result does not match the recovered files')\n }\n await finishKnowledgeFileTransaction({\n root: input.root,\n transactionRoot,\n transaction: recovery.transaction,\n assertOwned,\n })\n }\n if (existingActivation.result.outcome.status === 'conflict') {\n const reason = candidateTransitionConflictReason(\n target,\n candidateRef,\n existingActivation.mutation.afterHash,\n )\n const blocked = await blockCandidateTransition(\n input,\n candidate,\n target,\n reason,\n existingActivation.mutation.afterHash,\n )\n return { ...blocked, activationResult: existingActivation.result }\n }\n return candidateTransitionResult(\n input,\n candidate,\n target === 'candidate' && state.status === 'promoted',\n false,\n existingActivation.mutation,\n existingActivation.result,\n )\n }\n if (recovery?.direction === 'rollback') {\n await finishKnowledgeFileTransaction({\n root: input.root,\n transactionRoot,\n transaction: recovery.transaction,\n assertOwned,\n })\n }\n const recovered = recovery?.direction === 'apply' ? recovery : undefined\n let pending: KnowledgeFileTransaction | null =\n input.activation && recovered ? recovered.transaction : null\n const currentHash = await hashKnowledgeBase(input.root, state.stateScope)\n let transactionId = recovered?.transactionId ?? null\n if (recovered && currentHash !== desiredHash) {\n throw new Error(`recovered knowledge ${action} does not match the approved target`)\n }\n if (state.status === 'promoted' && state.promotedCandidateId !== candidate.candidateId) {\n throw new Error(\n `knowledge run already promoted '${state.promotedCandidateId ?? 'unknown'}'`,\n )\n }\n if (\n target === 'candidate' &&\n state.status === 'promoted' &&\n currentHash !== candidateRef.candidateHash\n ) {\n throw new Error(\n `promoted knowledge base changed: expected ${candidateRef.candidateHash}, got ${currentHash}`,\n )\n }\n if (state.status !== 'promoted' && state.status !== 'candidate-ready') {\n throw new Error(\n `knowledge candidate is not ready for ${action}: run=${state.status}, candidate=${candidate.status}`,\n )\n }\n if (currentHash !== state.baseHash && currentHash !== candidateRef.candidateHash) {\n const reason =\n target === 'candidate'\n ? `base changed before promotion: expected ${state.baseHash}, got ${currentHash}`\n : `knowledge changed before restore: expected ${candidateRef.candidateHash}, got ${currentHash}`\n const mutation = Object.freeze({\n target,\n beforeHash: currentHash,\n afterHash: currentHash,\n changed: false,\n transactionId: null,\n recovered: false,\n }) satisfies KnowledgeImprovementMutationReceipt\n const activationResult = input.activation\n ? await persistKnowledgeActivationResult(\n runDir,\n candidateRef,\n input.activation,\n target,\n mutation,\n )\n : undefined\n const blocked = await blockCandidateTransition(\n input,\n candidate,\n target,\n reason,\n currentHash,\n )\n return activationResult ? { ...blocked, activationResult } : blocked\n }\n\n if (currentHash !== desiredHash && !pending) {\n pending = await withMeasuredCandidateSnapshot(\n input.root,\n runDir,\n state,\n candidateRef,\n (resolved) =>\n withBaselineSnapshot(\n runDir,\n state.baseHash,\n async (baselineRoot) => {\n const sourceRoot = target === 'candidate' ? baselineRoot : resolved.root\n const targetRoot = target === 'candidate' ? resolved.root : baselineRoot\n const plan = await knowledgeFilePlanEntries(\n sourceRoot,\n targetRoot,\n state.stateScope,\n )\n assertCandidateTransitionPlan(plan, candidateRef, target, state.stateScope)\n return prepareKnowledgeFileTransaction({\n root: input.root,\n transactionRoot,\n purpose,\n ...normalizeKnowledgeStateScope(state.stateScope),\n recoveryOwner,\n mutations: await knowledgePlanMutations(targetRoot, plan),\n includeUnchanged: true,\n now: input.now,\n })\n },\n state.stateScope,\n ),\n )\n if (!pending) {\n throw new Error(`knowledge ${action} plan unexpectedly contained no file changes`)\n }\n transactionId = pending.transactionId\n try {\n assertCandidateTransitionTransaction(pending, candidateRef, target, state.stateScope)\n } catch (error) {\n try {\n await rollbackKnowledgeFileTransaction({\n root: input.root,\n transactionRoot,\n transaction: pending,\n beforeCommit: assertOwned,\n })\n await finishKnowledgeFileTransaction({\n root: input.root,\n transactionRoot,\n transaction: pending,\n assertOwned,\n })\n } catch (cleanupError) {\n throw new AggregateError(\n [error, cleanupError],\n `invalid knowledge ${action} transaction could not be removed`,\n )\n }\n throw error\n }\n }\n try {\n if (pending) {\n await applyKnowledgeFileTransaction({\n root: input.root,\n transactionRoot,\n transaction: pending,\n beforeCommit: assertOwned,\n })\n }\n assertOwned()\n if ((await hashKnowledgeBase(input.root, state.stateScope)) !== desiredHash) {\n throw new Error(`knowledge ${action} content does not match the approved target`)\n }\n await writeKnowledgeIndex(input.root, state.stateScope)\n } catch (error) {\n if (!pending) throw error\n if (recovered && input.activation) throw error\n try {\n assertOwned()\n } catch (ownershipError) {\n throw new AggregateError(\n [error, ownershipError],\n `knowledge ${action} lost its lock and left the transaction pending`,\n )\n }\n try {\n await rollbackKnowledgeFileTransaction({\n root: input.root,\n transactionRoot,\n transaction: pending,\n beforeCommit: assertOwned,\n })\n await finishKnowledgeFileTransaction({\n root: input.root,\n transactionRoot,\n transaction: pending,\n assertOwned,\n })\n await writeKnowledgeIndex(input.root, state.stateScope)\n } catch (rollbackError) {\n throw new AggregateError(\n [error, rollbackError],\n `knowledge ${action} failed and could not restore the previous files`,\n )\n }\n throw error\n }\n candidate.status = target === 'candidate' ? 'promoted' : 'candidate-ready'\n candidate.updatedAt = input.now().toISOString()\n state.status = candidate.status\n if (target === 'candidate') state.promotedCandidateId = candidate.candidateId\n else delete state.promotedCandidateId\n delete state.blockedReason\n state.updatedAt = input.now().toISOString()\n await saveState(runDir, state, input.onState)\n await ensureCandidateTransitionEvent(runDir, candidateRef, target)\n let finalHash = await hashKnowledgeBase(input.root, state.stateScope)\n if (finalHash !== desiredHash) {\n throw new Error(`knowledge ${action} changed before its result was returned`)\n }\n const mutation = Object.freeze({\n target,\n beforeHash: transactionId ? sourceKnowledgeHash(candidateRef, target) : currentHash,\n afterHash: finalHash,\n changed: transactionId !== null,\n transactionId,\n recovered: recovered !== undefined,\n }) satisfies KnowledgeImprovementMutationReceipt\n const activationResult = input.activation\n ? await persistKnowledgeActivationResult(\n runDir,\n candidateRef,\n input.activation,\n target,\n mutation,\n )\n : undefined\n if ((await hashKnowledgeBase(input.root, state.stateScope)) !== finalHash) {\n throw new Error(`knowledge ${action} changed while its result was persisted`)\n }\n if (pending) {\n await finishKnowledgeFileTransaction({\n root: input.root,\n transactionRoot,\n transaction: pending,\n assertOwned,\n })\n }\n finalHash = await hashKnowledgeBase(input.root, state.stateScope)\n if (finalHash !== desiredHash) {\n throw new Error(`knowledge ${action} changed before its result was returned`)\n }\n return candidateTransitionResult(\n input,\n candidate,\n target === 'candidate',\n false,\n mutation,\n activationResult,\n )\n },\n {\n staleMs: input.leaseTtlMs,\n resumeTransaction: {\n purpose,\n recoveryOwner,\n validate: (transaction) =>\n assertCandidateTransitionTransaction(transaction, candidateRef, target, state.stateScope),\n deferFinish: input.activation !== undefined,\n },\n },\n )\n}\n\nfunction candidateTransitionConflictReason(\n target: KnowledgeImprovementTarget,\n candidate: KnowledgeImprovementCandidateRef,\n currentHash: string,\n): string {\n return target === 'candidate'\n ? `base changed before promotion: expected ${candidate.baseHash}, got ${currentHash}`\n : `knowledge changed before restore: expected ${candidate.candidateHash}, got ${currentHash}`\n}\n\nasync function blockCandidateTransition(\n input: KnowledgeCandidateTransitionInput,\n candidate: KnowledgeImprovementCandidateRecord,\n target: KnowledgeImprovementTarget,\n reason: string,\n currentHash: string,\n): Promise<KnowledgeImprovementMutationResult> {\n if (input.state.status === 'promoted') {\n candidate.status = 'blocked'\n candidate.updatedAt = input.now().toISOString()\n delete input.state.promotedCandidateId\n }\n await blockRun(input.runDir, input.state, reason, input.onState, input.now)\n await appendLedger(input.runDir, {\n type: target === 'candidate' ? 'promotion.blocked' : 'restore.blocked',\n runId: input.candidateRef.runId,\n candidateId: candidate.candidateId,\n reason,\n })\n return candidateTransitionResult(input, candidate, false, true, {\n target,\n beforeHash: currentHash,\n afterHash: currentHash,\n changed: false,\n transactionId: null,\n recovered: false,\n })\n}\n\nfunction candidateTransitionResult(\n input: KnowledgeCandidateTransitionInput,\n candidate: KnowledgeImprovementCandidateRecord,\n promoted: boolean,\n blocked: boolean,\n mutation: KnowledgeImprovementMutationReceipt,\n activationResult?: AgentImprovementActivationResult,\n): KnowledgeImprovementMutationResult {\n return {\n runId: input.candidateRef.runId,\n state: input.state,\n candidate,\n ...(input.lifecycle ? { lifecycle: input.lifecycle } : {}),\n mutation,\n ...(activationResult ? { activationResult } : {}),\n promoted,\n blocked,\n }\n}\n\nfunction knowledgeCandidateTransitionPurpose(\n candidate: KnowledgeImprovementCandidateRef,\n implementationRef: string,\n target: KnowledgeImprovementTarget,\n): string {\n const action = target === 'candidate' ? 'promotion' : 'restore'\n return `knowledge-${action}:${contentHash({ candidate, implementationRef })}`\n}\n\nexport async function knowledgeFilePlanEntries(\n sourceRoot: string,\n targetRoot: string,\n scope?: KnowledgeStateScope,\n): Promise<KnowledgeFileTransactionPlanEntry[]> {\n const [before, after] = await Promise.all([\n knowledgeHashEntries(sourceRoot, scope),\n knowledgeHashEntries(targetRoot, scope),\n ])\n const beforeByPath = new Map(before.map((entry) => [entry.path, entry]))\n const afterByPath = new Map(after.map((entry) => [entry.path, entry]))\n const paths = [\n ...new Set([...before.map((entry) => entry.path), ...after.map((entry) => entry.path)]),\n ].sort((left, right) => left.localeCompare(right))\n return paths.map((path) => {\n assertKnowledgeMutationPath(\n path,\n normalizeKnowledgeStateScope(scope).pagesDirectory,\n scope?.researchState,\n )\n const beforeEntry = beforeByPath.get(path)\n const afterEntry = afterByPath.get(path)\n return {\n path,\n beforeHash: beforeEntry?.transactionHash ?? null,\n afterHash: afterEntry?.transactionHash ?? null,\n ...(beforeEntry ? { beforeMode: beforeEntry.mode } : {}),\n ...(afterEntry ? { afterMode: afterEntry.mode } : {}),\n }\n })\n}\n\nasync function knowledgePlanMutations(\n targetRoot: string,\n plan: readonly KnowledgeFileTransactionPlanEntry[],\n): Promise<KnowledgeFileMutation[]> {\n return Promise.all(\n plan.map(async (entry) => {\n if (entry.afterHash === null) return { path: entry.path, content: null }\n const file = await readRegularFileWithinRoot(targetRoot, entry.path)\n const actualHash = createHash('sha256').update(file.bytes).digest('hex')\n if (actualHash !== entry.afterHash || file.mode !== entry.afterMode) {\n throw new Error(`knowledge target file changed before activation: ${entry.path}`)\n }\n return { path: entry.path, content: file.bytes, mode: file.mode }\n }),\n )\n}\n\nfunction assertCandidateTransitionPlan(\n plan: readonly KnowledgeFileTransactionPlanEntry[],\n candidate: KnowledgeImprovementCandidateRef,\n target: KnowledgeImprovementTarget,\n scope?: KnowledgeStateScope,\n): void {\n const approvedDirection = target === 'candidate' ? plan : reverseKnowledgeFilePlan(plan)\n const actualPlanHash = knowledgeFileTransactionPlanHash(\n approvedDirection,\n normalizeKnowledgeStateScope(scope).pagesDirectory,\n scope?.researchState,\n )\n if (actualPlanHash !== candidate.promotionPlanHash) {\n throw new Error(\n `knowledge candidate plan changed after approval: expected ${candidate.promotionPlanHash}, got ${actualPlanHash}`,\n )\n }\n}\n\nfunction assertCandidateTransitionTransaction(\n transaction: KnowledgeFileTransaction,\n candidate: KnowledgeImprovementCandidateRef,\n target: KnowledgeImprovementTarget,\n scope?: KnowledgeStateScope,\n): void {\n assertCandidateTransitionPlan(transaction.entries, candidate, target, scope)\n}\n\nfunction reverseKnowledgeFilePlan(\n plan: readonly KnowledgeFileTransactionPlanEntry[],\n): KnowledgeFileTransactionPlanEntry[] {\n return plan.map((entry) => ({\n path: entry.path,\n beforeHash: entry.afterHash,\n afterHash: entry.beforeHash,\n ...(entry.afterMode === undefined ? {} : { beforeMode: entry.afterMode }),\n ...(entry.beforeMode === undefined ? {} : { afterMode: entry.beforeMode }),\n }))\n}\n\nasync function ensureCandidateTransitionEvent(\n runDir: string,\n candidateRef: KnowledgeImprovementCandidateRef,\n target: KnowledgeImprovementTarget,\n): Promise<void> {\n if (await hasCandidateTransitionEvent(runDir, candidateRef, target)) return\n await appendLedger(runDir, {\n type: target === 'candidate' ? 'candidate.promoted' : 'candidate.restored',\n runId: candidateRef.runId,\n candidateId: candidateRef.candidateId,\n candidateHash: candidateRef.candidateHash,\n evidenceHash: candidateRef.evidenceHash,\n promotionPlanHash: candidateRef.promotionPlanHash,\n })\n}\n\nasync function hasCandidateTransitionEvent(\n runDir: string,\n candidateRef: KnowledgeImprovementCandidateRef,\n target: KnowledgeImprovementTarget,\n): Promise<boolean> {\n const eventType = target === 'candidate' ? 'candidate.promoted' : 'candidate.restored'\n let matched = false\n for (const row of await loadKnowledgeImprovementEventsFromRun(runDir)) {\n if (row.type !== eventType || row.candidateId !== candidateRef.candidateId) continue\n if (\n row.runId !== candidateRef.runId ||\n row.candidateHash !== candidateRef.candidateHash ||\n row.evidenceHash !== candidateRef.evidenceHash ||\n row.promotionPlanHash !== candidateRef.promotionPlanHash\n ) {\n throw new Error('persisted knowledge activation event conflicts with the approved candidate')\n }\n matched = true\n }\n return matched\n}\n","import { join } from 'node:path'\nimport { contentHash } from '@tangle-network/agent-eval'\nimport { writeJsonDurableWithinRoot } from '../durable-fs'\nimport type { EvalKnowledgeBundleBuildResult, KnowledgeReadinessSpec } from '../eval-readiness'\nimport { knowledgeFileTransactionPlanHash } from '../file-transaction'\nimport { sha256 } from '../ids'\nimport { assertImmutableRef } from '../immutable-ref'\nimport { buildKnowledgeIndex } from '../indexer'\nimport { normalizeKnowledgeStateScope } from '../knowledge-state-scope'\nimport { ragAnswerEvidenceRejectionReasons } from '../rag-answer-evidence'\nimport type { KnowledgeBaseQualityReport } from '../rag-eval'\nimport {\n type RagKnowledgeImprovementPhase,\n type RagKnowledgeResearchOptions,\n type RunRagKnowledgeImprovementLoopOptions,\n type RunRagKnowledgeImprovementLoopResult,\n runRagKnowledgeImprovementLoop,\n} from '../rag-improvement-loop'\nimport { runRagKnowledgeImprovementPhases } from '../rag-improvement-phases'\nimport { assessKnowledgeIndex } from '../readiness-helpers'\nimport { mean } from '../statistics'\nimport type { ValidateKnowledgeResult } from '../validate'\nimport type {\n KnowledgeImprovementCandidateRecord,\n KnowledgeImprovementMetric,\n KnowledgeImprovementOptions,\n KnowledgeImprovementRunState,\n} from './contracts'\nimport {\n EVALUATION_PHASES,\n improvementMetricSchema,\n KnowledgeImprovementEvidenceSchema,\n UPDATE_PHASES,\n} from './contracts'\nimport {\n appendLedger,\n candidateEvidenceRelativePath,\n saveState,\n withCandidateWorkspace,\n} from './state'\nimport { knowledgeFilePlanEntries } from './transition'\nimport {\n assertCandidateEvidence,\n candidateRefFor,\n clearCandidateMeasurement,\n hashKnowledgeBase,\n withBaselineSnapshot,\n withFrozenCandidateWorkspace,\n} from './workspace'\n\nexport function assertKnowledgeImprovementOptions(options: KnowledgeImprovementOptions): void {\n assertImmutableRef(options.implementationRef, 'knowledge improvement implementationRef')\n normalizeKnowledgeStateScope(options.stateScope)\n for (const phase of options.requiredPhases ?? []) {\n if (options.enabledPhases && !options.enabledPhases.includes(phase)) {\n throw new Error(`required phase ${phase} is not enabled`)\n }\n }\n if (\n options.answerQualityCostCeiling !== undefined &&\n (!Number.isFinite(options.answerQualityCostCeiling) || options.answerQualityCostCeiling < 0)\n ) {\n throw new Error(\n 'knowledge improvement answerQualityCostCeiling must be a non-negative finite number',\n )\n }\n if (options.ragOptimization) {\n assertImmutableRef(\n options.ragOptimization.executionRef,\n 'knowledge improvement RAG executionRef',\n )\n }\n if (options.retrieval) {\n assertImmutableRef(\n options.retrieval.executionRef,\n 'knowledge improvement retrieval executionRef',\n )\n }\n if (options.step && options.knowledgeResearch?.step) {\n throw new Error('improveKnowledgeBase accepts either step or knowledgeResearch.step, not both')\n }\n const updateDrivers = [\n Boolean(options.step ?? options.knowledgeResearch),\n Boolean(options.updateKnowledge),\n ].filter(Boolean).length\n if (updateDrivers > 1) {\n throw new Error(\n 'improveKnowledgeBase accepts only one knowledge-update driver: knowledgeResearch or updateKnowledge',\n )\n }\n}\n\nexport async function measureCandidate(\n runId: string,\n runDir: string,\n state: KnowledgeImprovementRunState,\n candidate: KnowledgeImprovementCandidateRecord,\n options: KnowledgeImprovementOptions,\n now: () => Date,\n): Promise<{\n candidate: KnowledgeImprovementCandidateRecord\n evaluation: KnowledgeImprovementMetric\n lifecycle?: RunRagKnowledgeImprovementLoopResult\n finalEvaluated: boolean\n}> {\n return withCandidateWorkspace(runDir, candidate, async (candidateRoot) => {\n const currentCandidateHash = await hashKnowledgeBase(candidateRoot, options.stateScope)\n if (\n candidate.status === 'candidate-ready' &&\n candidate.candidateHash === currentCandidateHash &&\n candidate.evidenceHash !== undefined &&\n candidate.promotionPlanHash !== undefined\n ) {\n const evidence = await assertCandidateEvidence(\n runDir,\n candidateRefFor(runId, state, candidate),\n state.implementationRef,\n )\n return {\n candidate,\n evaluation: evidence.evaluation,\n ...(evidence.lifecycle === null\n ? {}\n : { lifecycle: evidence.lifecycle as RunRagKnowledgeImprovementLoopResult }),\n finalEvaluated: shouldRunEvaluationStage(options),\n }\n }\n\n clearCandidateMeasurement(candidate)\n let lifecycle: RunRagKnowledgeImprovementLoopResult | undefined\n if (candidate.status === 'running') {\n lifecycle = await runCandidateUpdateLifecycle(runId, candidate, candidateRoot, options, now)\n }\n return withFrozenCandidateWorkspace(\n runDir,\n candidate,\n candidateRoot,\n async (snapshot) => {\n const development = await evaluateCandidate(\n runDir,\n state,\n candidate,\n snapshot,\n lifecycle,\n options,\n now,\n false,\n )\n if (!development.evaluation.passed || !shouldRunEvaluationStage(options)) {\n return {\n ...development,\n ...(lifecycle ? { lifecycle } : {}),\n finalEvaluated: false,\n }\n }\n\n candidate.finalEvaluationStartedAt = now().toISOString()\n candidate.updatedAt = candidate.finalEvaluationStartedAt\n state.updatedAt = candidate.finalEvaluationStartedAt\n await saveState(runDir, state, options.onState)\n await appendLedger(runDir, {\n type: 'candidate.final-evaluation-started',\n runId: state.runId,\n candidateId: candidate.candidateId,\n })\n lifecycle = await runCandidateEvaluationLifecycle(\n runId,\n runDir,\n candidate,\n snapshot.root,\n snapshot.hash,\n lifecycle,\n options,\n now,\n )\n const measured = await evaluateCandidate(\n runDir,\n state,\n candidate,\n snapshot,\n lifecycle,\n options,\n now,\n true,\n )\n return {\n ...measured,\n ...(lifecycle ? { lifecycle } : {}),\n finalEvaluated: true,\n }\n },\n options.stateScope,\n )\n })\n}\n\nasync function runCandidateUpdateLifecycle(\n runId: string,\n candidate: KnowledgeImprovementCandidateRecord,\n candidateRoot: string,\n options: KnowledgeImprovementOptions,\n now: () => Date,\n): Promise<RunRagKnowledgeImprovementLoopResult | undefined> {\n if (!shouldRunUpdateStage(options)) return undefined\n const lifecycle = await runRagKnowledgeImprovementLoop({\n goal: options.goal,\n diagnose: options.diagnose,\n acquireKnowledge: options.acquireKnowledge,\n knowledgeResearch: candidateKnowledgeResearchOptions(candidateRoot, options),\n updateKnowledge: candidateUpdateHook(runId, candidate, candidateRoot, options),\n enabledPhases: selectedStagePhases(options, UPDATE_PHASES),\n requiredPhases: selectedStageRequiredPhases(options, UPDATE_PHASES),\n signal: options.signal,\n now,\n })\n return lifecycle\n}\n\nasync function runCandidateEvaluationLifecycle(\n runId: string,\n runDir: string,\n candidate: KnowledgeImprovementCandidateRecord,\n candidateRoot: string,\n candidateHash: string,\n lifecycle: RunRagKnowledgeImprovementLoopResult | undefined,\n options: KnowledgeImprovementOptions,\n now: () => Date,\n): Promise<RunRagKnowledgeImprovementLoopResult | undefined> {\n if (!shouldRunEvaluationStage(options)) return undefined\n const candidateIndex = await buildKnowledgeIndex(candidateRoot, options.stateScope)\n return withBaselineSnapshot(\n runDir,\n candidate.baseHash,\n (baselineRoot) =>\n runRagKnowledgeImprovementPhases(\n {\n goal: options.goal,\n optimization: options.ragOptimization\n ? {\n ...options.ragOptimization,\n executionRef: candidateExecutionRef(\n options.ragOptimization.executionRef,\n candidateHash,\n ),\n runDir:\n options.ragOptimization.runDir ??\n join(runDir, 'rag-optimization', candidate.candidateId),\n run: (input) =>\n options.ragOptimization!.run({\n ...input,\n runId,\n iteration: candidate.iteration,\n candidateId: candidate.candidateId,\n root: candidateRoot,\n baselineRoot,\n candidateRoot,\n candidateIndex,\n baseHash: candidate.baseHash,\n }),\n }\n : undefined,\n retrieval: options.retrieval\n ? {\n ...options.retrieval,\n executionRef: candidateExecutionRef(options.retrieval.executionRef, candidateHash),\n index: candidateIndex,\n runDir:\n options.retrieval.runDir ?? join(runDir, 'retrieval', candidate.candidateId),\n }\n : undefined,\n evaluateAnswers: options.evaluateAnswers,\n answerQualityCostCeiling: options.answerQualityCostCeiling,\n decidePromotion: options.decidePromotion,\n enabledPhases: selectedStagePhases(options, EVALUATION_PHASES),\n requiredPhases: selectedStageRequiredPhases(options, EVALUATION_PHASES),\n signal: options.signal,\n now,\n },\n lifecycle,\n ),\n options.stateScope,\n )\n}\n\nfunction candidateExecutionRef(executionRef: string, candidateHash: string): string {\n return `sha256:${sha256(`${executionRef}\\n${candidateHash}`)}`\n}\n\nfunction candidateKnowledgeResearchOptions(\n candidateRoot: string,\n options: KnowledgeImprovementOptions,\n): RagKnowledgeResearchOptions | undefined {\n if (!options.step && !options.knowledgeResearch) return undefined\n const { step: researchStep, ...rest } = options.knowledgeResearch ?? {}\n const step = options.step ?? researchStep\n return {\n ...rest,\n root: candidateRoot,\n pagesDirectory: normalizeKnowledgeStateScope(options.stateScope).pagesDirectory,\n step,\n maxIterations:\n rest.maxIterations ?? (step ? (options.candidateResearchIterations ?? 3) : undefined),\n strict: rest.strict ?? options.strict,\n readinessSpecs: rest.readinessSpecs ?? options.readinessSpecs,\n readinessTaskId: rest.readinessTaskId ?? options.readinessTaskId,\n readiness: rest.readiness ?? options.readiness,\n }\n}\n\nfunction candidateUpdateHook(\n runId: string,\n candidate: KnowledgeImprovementCandidateRecord,\n candidateRoot: string,\n options: KnowledgeImprovementOptions,\n): RunRagKnowledgeImprovementLoopOptions['updateKnowledge'] {\n if (!options.updateKnowledge) return undefined\n return (input) =>\n options.updateKnowledge!({\n ...input,\n runId,\n iteration: candidate.iteration,\n candidateId: candidate.candidateId,\n root: candidateRoot,\n baselineRoot: options.root,\n candidateRoot,\n baseHash: candidate.baseHash,\n })\n}\n\nfunction shouldRunUpdateStage(options: KnowledgeImprovementOptions): boolean {\n const phases = selectedStagePhases(options, UPDATE_PHASES)\n if (phases.length === 0) return false\n return Boolean(\n (phases.includes('gap-diagnosis') && options.diagnose) ||\n (phases.includes('knowledge-acquisition') && options.acquireKnowledge) ||\n (phases.includes('knowledge-update') &&\n (options.step || options.knowledgeResearch || options.updateKnowledge)) ||\n selectedStageRequiredPhases(options, UPDATE_PHASES).length > 0,\n )\n}\n\nfunction shouldRunEvaluationStage(options: KnowledgeImprovementOptions): boolean {\n const phases = selectedStagePhases(options, EVALUATION_PHASES)\n if (phases.length === 0) return false\n return Boolean(\n (phases.includes('rag-optimization') && options.ragOptimization) ||\n (phases.includes('retrieval-tuning') && options.retrieval) ||\n (phases.includes('answer-quality') && options.evaluateAnswers) ||\n (phases.includes('promotion') && options.decidePromotion) ||\n options.evaluate ||\n selectedStageRequiredPhases(options, EVALUATION_PHASES).length > 0,\n )\n}\n\nfunction selectedStagePhases(\n options: Pick<KnowledgeImprovementOptions, 'enabledPhases'>,\n stagePhases: readonly RagKnowledgeImprovementPhase[],\n): RagKnowledgeImprovementPhase[] {\n const requested = options.enabledPhases ?? stagePhases\n return requested.filter((phase) => stagePhases.includes(phase))\n}\n\nfunction selectedStageRequiredPhases(\n options: Pick<KnowledgeImprovementOptions, 'requiredPhases'>,\n stagePhases: readonly RagKnowledgeImprovementPhase[],\n): RagKnowledgeImprovementPhase[] {\n return (options.requiredPhases ?? []).filter((phase) => stagePhases.includes(phase))\n}\n\nasync function evaluateCandidate(\n runDir: string,\n state: KnowledgeImprovementRunState,\n candidate: KnowledgeImprovementCandidateRecord,\n snapshot: { root: string; hash: string },\n lifecycle: RunRagKnowledgeImprovementLoopResult | undefined,\n options: KnowledgeImprovementOptions,\n now: () => Date,\n useConfiguredEvaluator: boolean,\n): Promise<{\n candidate: KnowledgeImprovementCandidateRecord\n evaluation: KnowledgeImprovementMetric\n}> {\n return withBaselineSnapshot(\n runDir,\n state.baseHash,\n async (baselineRoot) => {\n const [baselineIndex, candidateIndex] = await Promise.all([\n buildKnowledgeIndex(baselineRoot, options.stateScope),\n buildKnowledgeIndex(snapshot.root, options.stateScope),\n ])\n const { validation, readiness, kbQuality } = assessKnowledgeIndex(options, candidateIndex)\n const candidateHash = snapshot.hash\n const evaluator = useConfiguredEvaluator ? options.evaluate : options.evaluateDevelopment\n const configuredMetric = evaluator\n ? evaluator({\n runId: state.runId,\n iteration: candidate.iteration,\n root: options.root,\n baselineRoot,\n candidateRoot: snapshot.root,\n baselineIndex,\n candidateIndex,\n baseHash: state.baseHash,\n candidateHash,\n validation,\n readiness,\n kbQuality,\n lifecycle,\n signal: options.signal,\n })\n : undefined\n const metric =\n configuredMetric ??\n defaultKnowledgeImprovementMetric(\n validation,\n readiness,\n options.readinessSpecs,\n kbQuality,\n lifecycle,\n )\n const evaluation = applyLifecycleFailures(\n normalizeMetric(await metric),\n lifecycle,\n options.answerQualityCostCeiling,\n )\n const measuredHash = await hashKnowledgeBase(snapshot.root, options.stateScope)\n if (measuredHash !== candidateHash) {\n throw new Error(\n `knowledge candidate changed during evaluation: expected ${candidateHash}, got ${measuredHash}`,\n )\n }\n candidate.candidateHash = candidateHash\n candidate.promotionPlanHash = knowledgeFileTransactionPlanHash(\n await knowledgeFilePlanEntries(baselineRoot, snapshot.root, options.stateScope),\n normalizeKnowledgeStateScope(options.stateScope).pagesDirectory,\n options.stateScope?.researchState,\n )\n const evidence = KnowledgeImprovementEvidenceSchema.parse(\n JSON.parse(\n JSON.stringify({\n kind: 'knowledge-improvement-evidence',\n runId: state.runId,\n candidateId: candidate.candidateId,\n iteration: candidate.iteration,\n goalHash: sha256(state.goal),\n implementationRef: state.implementationRef,\n baseHash: candidate.baseHash,\n candidateHash,\n promotionPlanHash: candidate.promotionPlanHash,\n validation,\n readiness: readiness ?? null,\n kbQuality,\n evaluation,\n lifecycle: lifecycle ?? null,\n }),\n ),\n )\n candidate.evidenceHash = contentHash(evidence)\n candidate.updatedAt = now().toISOString()\n await writeJsonDurableWithinRoot(\n runDir,\n candidateEvidenceRelativePath(candidate.candidateId),\n evidence,\n )\n await appendLedger(runDir, {\n type: 'candidate.evaluated',\n runId: state.runId,\n candidateId: candidate.candidateId,\n score: evaluation.score,\n passed: evaluation.passed,\n })\n return { candidate, evaluation }\n },\n options.stateScope,\n )\n}\n\nfunction defaultKnowledgeImprovementMetric(\n validation: ValidateKnowledgeResult,\n readiness: EvalKnowledgeBundleBuildResult | undefined,\n readinessSpecs: readonly KnowledgeReadinessSpec[] | undefined,\n kbQuality: KnowledgeBaseQualityReport,\n lifecycle: RunRagKnowledgeImprovementLoopResult | undefined,\n): KnowledgeImprovementMetric {\n const blockingMissing = readiness?.report.blockingMissingRequirements.length ?? 0\n const blockingTotal = readinessSpecs?.filter((spec) => spec.importance === 'blocking').length ?? 0\n const dimensions: Record<string, number> = {\n validation: validation.ok ? 1 : 0,\n kb_quality: kbQuality.ok ? 1 : 0,\n ...(blockingTotal > 0\n ? { blocking_readiness: Math.max(0, blockingTotal - blockingMissing) / blockingTotal }\n : {}),\n ...(lifecycle?.answerQuality\n ? { answer_quality: mean(Object.values(lifecycle.answerQuality.metrics)) }\n : {}),\n ...(lifecycle?.promotion ? { promotion_decision: lifecycle.promotion.promoted ? 1 : 0 } : {}),\n }\n const failedReasons = [\n validation.ok ? undefined : 'candidate validation failed',\n kbQuality.ok ? undefined : 'candidate KB quality check failed',\n blockingMissing === 0\n ? undefined\n : `${blockingMissing}/${blockingTotal} blocking knowledge requirements still missing`,\n ].filter((reason): reason is string => Boolean(reason))\n return {\n score: mean(Object.values(dimensions)),\n passed: failedReasons.length === 0,\n dimensions,\n notes: [\n failedReasons.length === 0 ? 'candidate passed configured checks' : failedReasons.join('; '),\n !lifecycle?.answerQuality && !lifecycle?.optimization && !lifecycle?.retrieval\n ? 'structural checks only; no task outcome evaluation was performed'\n : undefined,\n ]\n .filter((note): note is string => note !== undefined)\n .join('; '),\n provenance: {\n evaluator: '@tangle-network/agent-knowledge/default-knowledge-improvement-metric',\n version: '2',\n method: 'deterministic',\n },\n }\n}\n\nfunction applyLifecycleFailures(\n metric: KnowledgeImprovementMetric,\n lifecycle: RunRagKnowledgeImprovementLoopResult | undefined,\n answerQualityCostCeiling: number | undefined,\n): KnowledgeImprovementMetric {\n const answerQualityFailures = lifecycle?.answerQuality\n ? ragAnswerEvidenceRejectionReasons(lifecycle.answerQuality, answerQualityCostCeiling)\n : []\n const reasons = [\n metric.notes,\n ...answerQualityFailures,\n lifecycle?.promotion && !lifecycle.promotion.promoted\n ? `promotion decision held: ${lifecycle.promotion.reason}`\n : undefined,\n ].filter((reason): reason is string => Boolean(reason))\n const forcedFailure =\n answerQualityFailures.length > 0 ||\n Boolean(lifecycle?.promotion && !lifecycle.promotion.promoted)\n return {\n ...metric,\n passed: metric.passed && !forcedFailure,\n notes: reasons.length > 0 ? reasons.join('; ') : metric.notes,\n }\n}\n\nfunction normalizeMetric(metric: KnowledgeImprovementMetric): KnowledgeImprovementMetric {\n return improvementMetricSchema.parse(metric)\n}\n","import { canonicalJson } from '@tangle-network/agent-eval'\nimport { isMissingFile } from '../durable-fs'\nimport { normalizeKnowledgeStateScope } from '../knowledge-state-scope'\nimport { withKnowledgeMutation } from '../mutation-lock'\nimport type { RunRagKnowledgeImprovementLoopResult } from '../rag-improvement-loop'\nimport type {\n KnowledgeImprovementCandidateRecord,\n KnowledgeImprovementMetric,\n KnowledgeImprovementOptions,\n KnowledgeImprovementResult,\n} from './contracts'\nimport { DEFAULT_LEASE_TTL_MS, runIdSchema } from './contracts'\nimport { assertKnowledgeImprovementOptions, measureCandidate } from './evaluation'\nimport {\n acquireRunLease,\n appendLedger,\n assertExactCandidatePlatform,\n blockRun,\n findActiveCandidate,\n knowledgeImprovementRunId,\n loadKnowledgeImprovementStateFromRun,\n saveState,\n withKnowledgeImprovementRun,\n} from './state'\nimport {\n assertCandidateEvidence,\n candidateRefFor,\n createBaselineSnapshot,\n createCandidateWorkspace,\n ensureBaselineSnapshot,\n hashKnowledgeBase,\n withBaselineSnapshot,\n} from './workspace'\n\nexport async function improveKnowledgeBase(\n options: KnowledgeImprovementOptions,\n): Promise<KnowledgeImprovementResult> {\n assertExactCandidatePlatform()\n options = {\n ...options,\n ...(options.stateScope === undefined\n ? {}\n : { stateScope: Object.freeze(normalizeKnowledgeStateScope(options.stateScope)) }),\n }\n assertKnowledgeImprovementOptions(options)\n const now = options.now ?? (() => new Date())\n const runId = runIdSchema.parse(\n options.runId ?? knowledgeImprovementRunId(options.root, options.goal),\n )\n return withKnowledgeImprovementRun(options.root, runId, true, (runDir) =>\n improveKnowledgeBaseInRun(options, runId, runDir, now),\n )\n}\n\nasync function improveKnowledgeBaseInRun(\n options: KnowledgeImprovementOptions,\n runId: string,\n runDir: string,\n now: () => Date,\n): Promise<KnowledgeImprovementResult> {\n const lease = await acquireRunLease(runDir, {\n ownerId: options.ownerId ?? `pid-${process.pid}`,\n ttlMs: options.leaseTtlMs ?? DEFAULT_LEASE_TTL_MS,\n })\n\n try {\n lease.assertOwned()\n let state =\n options.resume === false\n ? null\n : await loadKnowledgeImprovementStateFromRun(options.root, runId, runDir).catch((error) => {\n if (isMissingFile(error)) return null\n throw error\n })\n if (!state) {\n const baseHash = await hashKnowledgeBase(options.root, options.stateScope)\n await createBaselineSnapshot(runDir, options.root, baseHash, options.stateScope)\n state = {\n runId,\n root: options.root,\n goal: options.goal,\n implementationRef: options.implementationRef,\n ...(options.stateScope === undefined\n ? {}\n : { stateScope: normalizeKnowledgeStateScope(options.stateScope) }),\n status: 'running',\n baseHash,\n createdAt: now().toISOString(),\n updatedAt: now().toISOString(),\n ownerId: lease.ownerId,\n candidates: [],\n }\n await saveState(runDir, state, options.onState)\n await appendLedger(runDir, { type: 'run.created', runId, baseHash })\n }\n if (\n canonicalJson(normalizeKnowledgeStateScope(state.stateScope)) !==\n canonicalJson(normalizeKnowledgeStateScope(options.stateScope))\n ) {\n throw new Error('knowledge improvement state does not match the requested stateScope')\n }\n if (state.goal !== options.goal) {\n throw new Error('knowledge improvement state does not match the requested goal')\n }\n if (state.implementationRef !== options.implementationRef) {\n throw new Error('knowledge improvement state does not match the requested implementationRef')\n }\n const promotedCandidateId = state.promotedCandidateId\n const promotedCandidate =\n state.status === 'promoted'\n ? state.candidates.find((candidate) => candidate.candidateId === promotedCandidateId)\n : undefined\n if (state.status === 'promoted' && !promotedCandidate) {\n throw new Error('promoted knowledge state has no promoted candidate')\n }\n if (state.status === 'promoted') {\n const promoted = promotedCandidate!\n const promotedState = state\n return withKnowledgeMutation(options.root, async () => {\n const currentHash = await hashKnowledgeBase(options.root, options.stateScope)\n if (currentHash !== promoted.candidateHash) {\n throw new Error(\n `promoted knowledge base changed: expected ${promoted.candidateHash}, got ${currentHash}`,\n )\n }\n const evidence = await assertCandidateEvidence(\n runDir,\n candidateRefFor(runId, promotedState, promoted),\n promotedState.implementationRef,\n )\n return {\n runId,\n state: promotedState,\n candidate: promoted,\n evaluation: evidence.evaluation,\n promoted: true,\n blocked: false,\n }\n })\n }\n await withKnowledgeMutation(options.root, () => undefined)\n await ensureBaselineSnapshot(runDir, options.root, state.baseHash, state.stateScope)\n\n if (state.status === 'blocked') {\n return { runId, state, promoted: false, blocked: true }\n }\n\n const maxCandidates = Math.max(1, options.maxCandidates ?? 1)\n let candidate = findActiveCandidate(state)\n let lastRejectedCandidate: KnowledgeImprovementCandidateRecord | undefined\n let lastRejectedEvaluation: KnowledgeImprovementMetric | undefined\n let lifecycle: RunRagKnowledgeImprovementLoopResult | undefined\n\n while (candidate || state.candidates.length < maxCandidates) {\n if (candidate?.status === 'running' && candidate.finalEvaluationStartedAt) {\n state = await blockRun(\n runDir,\n state,\n `candidate '${candidate.candidateId}' was interrupted after final evaluation started; refusing to reuse final cases`,\n options.onState,\n now,\n )\n return {\n runId,\n state,\n candidate,\n promoted: false,\n blocked: true,\n }\n }\n if (!candidate) {\n const currentHash = await hashKnowledgeBase(options.root, options.stateScope)\n if (currentHash !== state.baseHash) {\n state = await blockRun(\n runDir,\n state,\n `base changed before candidate creation: expected ${state.baseHash}, got ${currentHash}`,\n options.onState,\n now,\n )\n return { runId, state, promoted: false, blocked: true }\n }\n const activeState = state\n candidate = await withBaselineSnapshot(\n runDir,\n activeState.baseHash,\n (baselineRoot) => createCandidateWorkspace(runDir, activeState, baselineRoot, now),\n state.stateScope,\n )\n state.candidates.push(candidate)\n state.status = 'running'\n state.updatedAt = now().toISOString()\n await saveState(runDir, state, options.onState)\n await appendLedger(runDir, {\n type: 'candidate.created',\n runId,\n candidateId: candidate.candidateId,\n iteration: candidate.iteration,\n })\n }\n\n const measured = await measureCandidate(runId, runDir, state, candidate, options, now)\n candidate = measured.candidate\n const evaluation = measured.evaluation\n lifecycle = measured.lifecycle\n\n if (evaluation.passed) {\n candidate.status = 'candidate-ready'\n candidate.updatedAt = now().toISOString()\n state.status = 'candidate-ready'\n state.updatedAt = now().toISOString()\n await saveState(runDir, state, options.onState)\n await appendLedger(runDir, {\n type: 'candidate.ready',\n runId,\n candidateId: candidate.candidateId,\n })\n break\n }\n\n candidate.status = 'rejected'\n state.status = 'running'\n state.updatedAt = now().toISOString()\n await saveState(runDir, state, options.onState)\n await appendLedger(runDir, {\n type: 'candidate.rejected',\n runId,\n candidateId: candidate.candidateId,\n })\n lastRejectedCandidate = candidate\n lastRejectedEvaluation = evaluation\n candidate = undefined\n if (measured.finalEvaluated) break\n }\n\n if (!candidate) {\n state.status = 'rejected'\n state.updatedAt = now().toISOString()\n await saveState(runDir, state, options.onState)\n return {\n runId,\n state,\n candidate: lastRejectedCandidate,\n ...(lastRejectedEvaluation ? { evaluation: lastRejectedEvaluation } : {}),\n lifecycle,\n promoted: false,\n blocked: false,\n }\n }\n\n const evidence = await assertCandidateEvidence(\n runDir,\n candidateRefFor(runId, state, candidate),\n state.implementationRef,\n )\n return {\n runId,\n state,\n candidate,\n evaluation: evidence.evaluation,\n lifecycle,\n promoted: false,\n blocked: false,\n }\n } finally {\n await lease.release()\n }\n}\n","import {\n type AgentCandidateKnowledgeRef,\n sha256DigestSchema,\n} from '@tangle-network/agent-interface'\n\nimport {\n type KnowledgeImprovementCandidateRef,\n KnowledgeImprovementCandidateRefSchema,\n} from './kb-improvement'\n\n/** Convert a measured knowledge candidate into the shared review and execution identity. */\nexport function toAgentCandidateKnowledgeRef(\n candidate: KnowledgeImprovementCandidateRef,\n): AgentCandidateKnowledgeRef {\n const parsed = KnowledgeImprovementCandidateRefSchema.parse(candidate)\n return {\n ...parsed,\n goalHash: prefixedDigest(parsed.goalHash),\n baseHash: prefixedDigest(parsed.baseHash),\n candidateHash: prefixedDigest(parsed.candidateHash),\n evidenceHash: prefixedDigest(parsed.evidenceHash),\n promotionPlanHash: prefixedDigest(parsed.promotionPlanHash),\n }\n}\n\n/** Recover agent-knowledge's candidate identity from the shared contract. */\nexport function fromAgentCandidateKnowledgeRef(\n candidate: AgentCandidateKnowledgeRef,\n): KnowledgeImprovementCandidateRef {\n return KnowledgeImprovementCandidateRefSchema.parse({\n ...candidate,\n goalHash: rawDigest(candidate.goalHash),\n baseHash: rawDigest(candidate.baseHash),\n candidateHash: rawDigest(candidate.candidateHash),\n evidenceHash: rawDigest(candidate.evidenceHash),\n promotionPlanHash: rawDigest(candidate.promotionPlanHash),\n })\n}\n\nfunction prefixedDigest(value: string) {\n return sha256DigestSchema.parse(`sha256:${value}`)\n}\n\nfunction rawDigest(value: string): string {\n return sha256DigestSchema.parse(value).slice('sha256:'.length)\n}\n","export interface ChunkingOptions {\n targetChars: number\n maxChars: number\n minChars: number\n overlapChars: number\n}\n\nexport interface KnowledgeChunk {\n index: number\n text: string\n headingPath: string\n charStart: number\n charEnd: number\n oversized: boolean\n}\n\nconst DEFAULT_OPTIONS: ChunkingOptions = {\n targetChars: 1000,\n maxChars: 1500,\n minChars: 160,\n overlapChars: 180,\n}\n\nexport function chunkMarkdown(\n content: string,\n options?: Partial<ChunkingOptions>,\n): KnowledgeChunk[] {\n const opts = normalizeOptions({ ...DEFAULT_OPTIONS, ...(options ?? {}) })\n const { body, bodyOffset } = stripFrontmatter(content)\n if (body.trim() === '') return []\n\n const sections = splitSections(body, bodyOffset)\n const chunks: KnowledgeChunk[] = []\n for (const section of sections) {\n for (const part of chunkText(section.text, opts)) {\n const start = section.start + part.start\n chunks.push({\n index: chunks.length,\n text: part.text,\n headingPath: section.headingPath,\n charStart: start,\n charEnd: start + part.text.length,\n oversized: part.text.length > opts.maxChars,\n })\n }\n }\n return chunks\n}\n\nexport function stripFrontmatter(content: string): { body: string; bodyOffset: number } {\n const normalized = content.replace(/\\r\\n/g, '\\n')\n if (!normalized.startsWith('---\\n')) return { body: normalized, bodyOffset: 0 }\n const match = /^---\\n[\\s\\S]*?\\n---\\s*\\n?/.exec(normalized)\n if (!match) return { body: normalized, bodyOffset: 0 }\n return { body: normalized.slice(match[0].length), bodyOffset: match[0].length }\n}\n\nfunction normalizeOptions(opts: ChunkingOptions): ChunkingOptions {\n if (opts.maxChars < opts.targetChars) opts.maxChars = opts.targetChars\n if (opts.overlapChars >= opts.targetChars) opts.overlapChars = Math.floor(opts.targetChars / 2)\n return opts\n}\n\ninterface Section {\n text: string\n start: number\n headingPath: string\n}\n\nfunction splitSections(body: string, bodyOffset: number): Section[] {\n const lines = body.split('\\n')\n const sections: Section[] = []\n const headings: Record<number, string> = {}\n let current: { lines: string[]; start: number; headingPath: string } = {\n lines: [],\n start: bodyOffset,\n headingPath: '',\n }\n let cursor = bodyOffset\n let fence: string | null = null\n\n const flush = () => {\n const text = current.lines.join('\\n')\n if (text.trim() !== '')\n sections.push({ text, start: current.start, headingPath: current.headingPath })\n }\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]!\n const lineLen = line.length + (i < lines.length - 1 ? 1 : 0)\n const fenceMatch = /^(`{3,}|~{3,})/.exec(line)\n if (fenceMatch) {\n const marker = fenceMatch[1]!\n fence = fence === null ? marker : line.startsWith(fence) ? null : fence\n current.lines.push(line)\n cursor += lineLen\n continue\n }\n const heading = fence === null ? /^(#{1,6})\\s+(.+?)\\s*$/.exec(line) : null\n if (heading) {\n flush()\n const level = heading[1]!.length\n headings[level] = heading[2]!.trim()\n for (let next = level + 1; next <= 6; next++) delete headings[next]\n current = {\n lines: [line],\n start: cursor,\n headingPath: Object.entries(headings)\n .sort(([a], [b]) => Number(a) - Number(b))\n .map(([levelText, title]) => `${'#'.repeat(Number(levelText))} ${title}`)\n .join(' > '),\n }\n cursor += lineLen\n continue\n }\n current.lines.push(line)\n cursor += lineLen\n }\n flush()\n return sections\n}\n\nfunction chunkText(text: string, opts: ChunkingOptions): Array<{ text: string; start: number }> {\n if (text.length <= opts.targetChars) return [{ text, start: 0 }]\n const atoms = splitAtoms(text)\n const chunks: Array<{ text: string; start: number }> = []\n let buffer = ''\n let bufferStart = 0\n for (const atom of atoms) {\n if (buffer === '') bufferStart = atom.start\n if (buffer.length > 0 && buffer.length + atom.text.length > opts.targetChars) {\n chunks.push({ text: buffer.trimEnd(), start: bufferStart })\n const overlap = buffer.slice(Math.max(0, buffer.length - opts.overlapChars))\n buffer = overlap + atom.text\n bufferStart = Math.max(bufferStart, atom.start - overlap.length)\n } else {\n buffer += atom.text\n }\n }\n if (buffer.trim() !== '') chunks.push({ text: buffer.trimEnd(), start: bufferStart })\n return mergeTinyChunks(chunks, opts)\n}\n\nfunction splitAtoms(text: string): Array<{ text: string; start: number }> {\n const parts: Array<{ text: string; start: number }> = []\n const paragraphs = text.split(/(\\n\\s*\\n)/)\n let cursor = 0\n for (let i = 0; i < paragraphs.length; i += 2) {\n const paragraph = (paragraphs[i] ?? '') + (paragraphs[i + 1] ?? '')\n if (paragraph === '') continue\n parts.push({ text: paragraph, start: cursor })\n cursor += paragraph.length\n }\n return parts\n}\n\nfunction mergeTinyChunks(\n chunks: Array<{ text: string; start: number }>,\n opts: ChunkingOptions,\n): Array<{ text: string; start: number }> {\n const out: Array<{ text: string; start: number }> = []\n for (const chunk of chunks) {\n const prev = out[out.length - 1]\n if (\n prev &&\n chunk.text.length < opts.minChars &&\n prev.text.length + chunk.text.length <= opts.maxChars\n ) {\n prev.text = `${prev.text}\\n\\n${chunk.text}`\n } else {\n out.push({ ...chunk })\n }\n }\n return out\n}\n","import { isDeepStrictEqual } from 'node:util'\n\nexport interface DiscoveryTask {\n id: string\n goal: string\n query?: string\n sourceHints?: string[]\n metadata?: Record<string, unknown>\n}\n\nexport interface DiscoveryResult {\n taskId: string\n summary: string\n sourceUris?: string[]\n claims?: Array<{ text: string; sourceUri?: string; confidence?: number }>\n followUpTasks?: DiscoveryTask[]\n metadata?: Record<string, unknown>\n}\n\nexport interface KnowledgeDiscoveryWorker {\n run(task: DiscoveryTask, signal?: AbortSignal): Promise<DiscoveryResult> | DiscoveryResult\n}\n\nexport interface KnowledgeDiscoveryDispatcher {\n dispatch(\n tasks: DiscoveryTask[],\n options?: {\n concurrency?: number\n signal?: AbortSignal\n },\n ): Promise<DiscoveryResult[]>\n}\n\nexport type DiscoveryLoopStopReason = 'complete' | 'max-rounds' | 'max-tasks' | 'aborted'\n\nexport interface DiscoveryLoopRound {\n round: number\n tasks: DiscoveryTask[]\n results: DiscoveryResult[]\n queuedFollowUps: DiscoveryTask[]\n}\n\nexport interface DiscoveryLoopResult {\n stopReason: DiscoveryLoopStopReason\n tasksDispatched: number\n results: DiscoveryResult[]\n rounds: DiscoveryLoopRound[]\n /** Tasks retained, not dropped, when a configured limit stops the loop. */\n pendingTasks: DiscoveryTask[]\n /** Structurally identical task identities ignored to prevent cycles. */\n duplicateTaskIds: string[]\n}\n\nexport interface RunDiscoveryLoopOptions {\n dispatcher: KnowledgeDiscoveryDispatcher\n initialTasks: readonly DiscoveryTask[]\n /** Maximum follow-up depth including the initial dispatch. Default 3. */\n maxRounds?: number\n /** Maximum tasks dispatched across all rounds. Default 24. */\n maxTasks?: number\n /** Forwarded to the dispatcher. Default 4. */\n concurrency?: number\n signal?: AbortSignal\n onRound?: (round: DiscoveryLoopRound) => Promise<void> | void\n}\n\n/**\n * Dispatch discovery tasks and recursively pursue worker-proposed follow-ups.\n *\n * The runner owns only bounded scheduling and accounting. Workers own search,\n * source verification, and domain-specific candidate shapes.\n */\nexport async function runDiscoveryLoop(\n options: RunDiscoveryLoopOptions,\n): Promise<DiscoveryLoopResult> {\n const maxRounds = positiveInteger(options.maxRounds ?? 3, 'maxRounds')\n const maxTasks = positiveInteger(options.maxTasks ?? 24, 'maxTasks')\n const concurrency = positiveInteger(options.concurrency ?? 4, 'concurrency')\n const known = new Map<string, DiscoveryTask>()\n const pending: DiscoveryTask[] = []\n const duplicateTaskIds = new Set<string>()\n enqueueTasks(options.initialTasks, known, pending, duplicateTaskIds)\n\n const rounds: DiscoveryLoopRound[] = []\n const results: DiscoveryResult[] = []\n let tasksDispatched = 0\n let aborted = false\n\n while (pending.length > 0 && rounds.length < maxRounds && tasksDispatched < maxTasks) {\n if (options.signal?.aborted) {\n aborted = true\n break\n }\n const capacity = maxTasks - tasksDispatched\n const tasks = pending.splice(0, capacity)\n let dispatched: DiscoveryResult[]\n try {\n dispatched = orderCompleteDispatch(\n tasks,\n await options.dispatcher.dispatch(tasks, {\n concurrency,\n signal: options.signal,\n }),\n )\n } catch (cause) {\n if (!options.signal?.aborted) throw cause\n pending.unshift(...tasks)\n aborted = true\n break\n }\n tasksDispatched += tasks.length\n results.push(...dispatched)\n\n const queuedFollowUps: DiscoveryTask[] = []\n for (const result of dispatched) {\n enqueueTasks(result.followUpTasks ?? [], known, queuedFollowUps, duplicateTaskIds)\n }\n pending.push(...queuedFollowUps)\n const round: DiscoveryLoopRound = {\n round: rounds.length + 1,\n tasks,\n results: dispatched,\n queuedFollowUps,\n }\n rounds.push(round)\n await options.onRound?.(round)\n if (options.signal?.aborted) {\n aborted = true\n break\n }\n }\n\n const stopReason: DiscoveryLoopStopReason = aborted\n ? 'aborted'\n : pending.length === 0\n ? 'complete'\n : tasksDispatched >= maxTasks\n ? 'max-tasks'\n : 'max-rounds'\n return {\n stopReason,\n tasksDispatched,\n results,\n rounds,\n pendingTasks: pending,\n duplicateTaskIds: [...duplicateTaskIds],\n }\n}\n\nexport function createLocalDiscoveryDispatcher(\n worker: KnowledgeDiscoveryWorker,\n): KnowledgeDiscoveryDispatcher {\n return {\n async dispatch(tasks, options = {}) {\n const concurrency = Math.max(1, options.concurrency ?? 4)\n const results: DiscoveryResult[] = []\n let cursor = 0\n async function runNext(): Promise<void> {\n while (cursor < tasks.length) {\n if (options.signal?.aborted) throw new Error('Discovery dispatch aborted')\n const task = tasks[cursor++]!\n results.push(await worker.run(task, options.signal))\n }\n }\n await Promise.all(Array.from({ length: Math.min(concurrency, tasks.length) }, runNext))\n return orderCompleteDispatch(tasks, results)\n },\n }\n}\n\nfunction enqueueTasks(\n tasks: readonly DiscoveryTask[],\n known: Map<string, DiscoveryTask>,\n destination: DiscoveryTask[],\n duplicateTaskIds: Set<string>,\n): void {\n for (const task of tasks) {\n assertTask(task)\n const prior = known.get(task.id)\n if (!prior) {\n known.set(task.id, task)\n destination.push(task)\n continue\n }\n if (!isDeepStrictEqual(prior, task)) {\n throw new Error(`Discovery task id '${task.id}' refers to conflicting tasks`)\n }\n duplicateTaskIds.add(task.id)\n }\n}\n\nfunction assertTask(task: DiscoveryTask): void {\n if (!task.id.trim()) throw new Error('Discovery task id must not be empty')\n if (!task.goal.trim()) throw new Error(`Discovery task '${task.id}' goal must not be empty`)\n}\n\nfunction orderCompleteDispatch(\n tasks: readonly DiscoveryTask[],\n results: readonly DiscoveryResult[],\n): DiscoveryResult[] {\n const order = new Map(tasks.map((task, index) => [task.id, index]))\n const received = new Set<string>()\n for (const result of results) {\n if (!order.has(result.taskId)) {\n throw new Error(`Discovery dispatcher returned unknown task '${result.taskId}'`)\n }\n if (received.has(result.taskId)) {\n throw new Error(`Discovery dispatcher returned task '${result.taskId}' more than once`)\n }\n received.add(result.taskId)\n }\n const missing = tasks.filter((task) => !received.has(task.id)).map((task) => task.id)\n if (missing.length > 0) {\n throw new Error(`Discovery dispatcher omitted tasks: ${missing.join(', ')}`)\n }\n return [...results].sort(\n (a, b) => (order.get(a.taskId) as number) - (order.get(b.taskId) as number),\n )\n}\n\nfunction positiveInteger(value: number, name: string): number {\n if (!Number.isInteger(value) || value < 1) {\n throw new Error(`Discovery loop ${name} must be a positive integer`)\n }\n return value\n}\n","import { buildKnowledgeIndex } from './indexer'\nimport { buildKnowledgeLexicalIndex, type KnowledgeLexicalIndex } from './lexical-index'\nimport { type KnowledgePagesOptions, normalizePagesDirectory } from './pages-directory'\nimport type { RetrievalEvalRetriever, RetrievedKnowledgeHit } from './retrieval-eval'\nimport { searchKnowledge } from './search'\nimport type { KnowledgeIndex, KnowledgeSearchResult } from './types'\n\nexport interface FileSystemSearchProviderOptions extends KnowledgePagesOptions {\n /** Knowledge-base root containing the pages directory and `.agent-knowledge/`. */\n root: string\n /** Optional warm index, useful when the caller already built one. */\n index?: KnowledgeIndex\n /** Default result count for `search()`. Defaults to 10. */\n defaultLimit?: number\n /**\n * `manual` caches the index until `refresh: true` or `invalidate()`.\n * `always` rebuilds from disk on every search.\n */\n refresh?: 'manual' | 'always'\n}\nexport interface FileSystemSearchOptions {\n limit?: number\n refresh?: boolean\n}\n\n/**\n * File-first retrieval over an `agent-knowledge` KB.\n *\n * This is the simple backend for products that want deterministic search over\n * markdown knowledge files before adding embeddings, rerankers, or a vector DB.\n */\nexport class FileSystemSearchProvider {\n readonly root: string\n /** Root-relative directory the provider indexes. */\n readonly pagesDirectory: string\n private index: KnowledgeIndex | undefined\n private lexicalIndex: KnowledgeLexicalIndex | undefined\n private readonly defaultLimit: number\n private readonly refreshMode: 'manual' | 'always'\n\n constructor(options: FileSystemSearchProviderOptions) {\n this.root = options.root\n this.pagesDirectory = normalizePagesDirectory(options.pagesDirectory)\n this.index = options.index\n this.defaultLimit = options.defaultLimit ?? 10\n this.refreshMode = options.refresh ?? 'manual'\n }\n\n async getIndex(options: FileSystemSearchOptions = {}): Promise<KnowledgeIndex> {\n if (this.refreshMode === 'always' || options.refresh || !this.index) {\n this.index = await buildKnowledgeIndex(this.root, { pagesDirectory: this.pagesDirectory })\n this.lexicalIndex = undefined\n }\n return this.index\n }\n\n async search(\n query: string,\n options: FileSystemSearchOptions = {},\n ): Promise<KnowledgeSearchResult[]> {\n const index = await this.getIndex(options)\n if (!this.lexicalIndex) this.lexicalIndex = buildKnowledgeLexicalIndex(index.pages)\n return searchKnowledge(index, query, {\n limit: options.limit ?? this.defaultLimit,\n lexicalIndex: this.lexicalIndex,\n })\n }\n\n async retrieve(\n query: string,\n options: FileSystemSearchOptions = {},\n ): Promise<RetrievedKnowledgeHit[]> {\n const hits = await this.search(query, options)\n return hits.map(hitFromSearchResult)\n }\n\n asRetrievalEvalRetriever(): RetrievalEvalRetriever {\n return async ({ config, scenario, k }) => ({\n hits: await this.retrieve(scenario.query, {\n limit: k,\n refresh: config.refresh === true,\n }),\n })\n }\n\n invalidate(): void {\n this.index = undefined\n this.lexicalIndex = undefined\n }\n}\n\nexport function createFileSystemSearchProvider(\n options: FileSystemSearchProviderOptions,\n): FileSystemSearchProvider {\n return new FileSystemSearchProvider(options)\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","import type { AgentCandidateJsonValue as JsonValue } from '@tangle-network/agent-interface'\nimport { z } from 'zod'\nimport type { RetrievalEvalRetriever, RetrievedKnowledgeHit } from './retrieval-eval'\n\n/**\n * Hub-backed vector retrieval over a user-connected vector database.\n *\n * `FileSystemSearchProvider` (and the QMD snapshot provider) prove the shape\n * of a search backend; this is the third backend: similarity search against a\n * vector database the user already connected through the Tangle Platform Hub\n * (Pinecone, Qdrant, or Weaviate). The provider never talks to the vector DB\n * directly — every query routes through `POST /v1/hub/exec`, so the Hub's\n * per-user connection, per-action policy, approval, and audit pipeline remain\n * the ONLY access path. The Hub's audit trail is the provenance record: every\n * hit carries `provider`, `connectionId`, `indexName`, and the exec action in\n * its metadata, so a retrieval receipt can name exactly which database was\n * queried under which connection.\n *\n * Embeddings are host-owned. `embed` turns the query string into the vector —\n * the same discipline as the QMD provider's vector mode (invoking the host's\n * embedding model is an explicit decision, never implicit).\n *\n * Scores: `score` carries the provider-native score where higher is better\n * (Pinecone similarity, Qdrant similarity); Weaviate distances (lower is\n * better) are mapped through `1/(1+max(0,distance))` so ordering stays\n * monotone. `normalizedScore` is within-set (top hit = 1), the same contract\n * as the filesystem provider — never compare it across queries.\n */\n\n/** Vector databases with a Hub adapter and a similarity-search action. */\nexport type HubVectorProviderKind = 'pinecone' | 'qdrant' | 'weaviate'\n\n/** The host-owned query embedding: text in, finite float vector out. */\nexport type HubVectorEmbed = (query: string) => Promise<readonly number[]>\n\nexport interface HubVectorSearchProviderOptions {\n /** Platform base URL, e.g. `https://id.tangle.tools`. */\n readonly hubUrl: string\n /** Bearer credential for the Hub (the agent's user or service key). */\n readonly apiKey: string\n /** The Hub connection that owns the vector database credential. */\n readonly connectionId: string\n /** Which connected vector database provider to search. */\n readonly provider: HubVectorProviderKind\n /**\n * Index / collection / class being searched. For Qdrant and Weaviate this\n * targets the query; for Pinecone the data plane is bound by the\n * connection's index host, so the name is provenance on every hit.\n */\n readonly indexName: string\n /** Turns the query string into a vector. Required: embedding is host-owned. */\n readonly embed: HubVectorEmbed\n /** Pinecone namespace within the index. Defaults to the default namespace. */\n readonly namespace?: string\n /** Weaviate properties returned per object (in addition to id + distance). */\n readonly properties?: readonly string[]\n /** Default result count for `search()`. Defaults to 5. */\n readonly defaultLimit?: number\n /** Override fetch (tests + non-Node runtimes). */\n readonly fetchImpl?: typeof fetch\n}\n\nexport interface HubVectorSearchOptions {\n /** Result count. Defaults to the provider's `defaultLimit`. */\n readonly limit?: number\n /** Precomputed query vector — skips `embed`. Same space as the index. */\n readonly vector?: readonly number[]\n /** Provider-native metadata filter (Pinecone/Qdrant filter object). */\n readonly filter?: Record<string, unknown>\n}\n\n/** A hub exec or upstream-provider failure, carrying the hub's status/code. */\nexport class HubVectorSearchError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n public readonly code: string | undefined,\n ) {\n super(message)\n this.name = 'HubVectorSearchError'\n }\n}\n\nconst vectorSchema = z.array(z.number().finite()).min(1).max(20_000)\nconst searchOptionsSchema = z\n .object({\n limit: z.number().int().min(1).max(50).optional(),\n vector: vectorSchema.optional(),\n filter: z.record(z.string(), z.unknown()).optional(),\n })\n .strict()\nconst queryTextSchema = z.string().trim().min(1).max(16_000)\nconst providerKindSchema = z.enum(['pinecone', 'qdrant', 'weaviate'])\nconst graphQlNameSchema = /^[A-Za-z_][A-Za-z0-9_]*$/\n\nconst pineconeResultSchema = z\n .object({\n matches: z\n .array(\n z\n .object({\n id: z.union([z.string(), z.number()]),\n score: z.number().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n })\n .passthrough(),\n )\n .default([]),\n })\n .passthrough()\n\nconst qdrantResultSchema = z\n .object({\n result: z\n .array(\n z\n .object({\n id: z.union([z.string(), z.number()]),\n score: z.number().optional(),\n payload: z.record(z.string(), z.unknown()).optional(),\n })\n .passthrough(),\n )\n .default([]),\n })\n .passthrough()\n\nconst weaviateResultSchema = z\n .object({\n data: z\n .object({\n Get: z.record(z.string(), z.array(z.record(z.string(), z.unknown()))).optional(),\n })\n .passthrough(),\n errors: z.array(z.unknown()).optional(),\n })\n .passthrough()\n\n/** Keys commonly carrying human-readable text in vector payloads. */\nconst TEXT_KEYS = ['text', 'content', 'chunk', 'body', 'snippet', 'pageContent', 'summary'] as const\nconst TITLE_KEYS = ['title', 'name', 'heading'] as const\nconst SNIPPET_MAX_CHARS = 400\n\n/** Provider payloads arrive JSON-parsed; the round-trip narrows `unknown` to\n * JSON values for RetrievedKnowledgeHit.metadata without re-validating shape. */\nfunction jsonSafe(\n value: Record<string, unknown> | undefined,\n): { [key: string]: JsonValue } | undefined {\n if (!value) return undefined\n return JSON.parse(JSON.stringify(value)) as { [key: string]: JsonValue }\n}\n\nfunction textFromRecord(record: Record<string, unknown> | undefined): string | undefined {\n if (!record) return undefined\n for (const key of TEXT_KEYS) {\n const value = record[key]\n if (typeof value === 'string' && value.trim()) return value\n }\n return undefined\n}\n\nfunction titleFromRecord(record: Record<string, unknown> | undefined): string | undefined {\n if (!record) return undefined\n for (const key of TITLE_KEYS) {\n const value = record[key]\n if (typeof value === 'string' && value.trim()) return value\n }\n return undefined\n}\n\nfunction snippetFromRecord(record: Record<string, unknown> | undefined): string | undefined {\n const text = textFromRecord(record)\n if (text) return text.length > SNIPPET_MAX_CHARS ? `${text.slice(0, SNIPPET_MAX_CHARS)}…` : text\n if (!record || Object.keys(record).length === 0) return undefined\n const serialized = JSON.stringify(record)\n return serialized.length > SNIPPET_MAX_CHARS\n ? `${serialized.slice(0, SNIPPET_MAX_CHARS)}…`\n : serialized\n}\n\n/** Provenance stamped on every hit — the retrieval-receipt fields. */\nexport interface HubVectorProvenance {\n readonly provider: HubVectorProviderKind\n readonly connectionId: string\n readonly indexName: string\n readonly hubOrigin: string\n readonly action: string\n}\n\n/** One hub exec call: bearer-authenticated, envelope-checked, result-unwrapped. */\nasync function hubExec(\n options: HubVectorSearchProviderOptions,\n path: string,\n input: unknown,\n): Promise<unknown> {\n const fetchImpl = options.fetchImpl ?? fetch\n let origin: string\n try {\n origin = new URL(options.hubUrl).origin\n } catch {\n throw new HubVectorSearchError(`invalid hubUrl: ${options.hubUrl}`, 0, 'INVALID_HUB_URL')\n }\n let response: Response\n try {\n response = await fetchImpl(`${origin}/v1/hub/exec`, {\n method: 'POST',\n headers: {\n authorization: `Bearer ${options.apiKey}`,\n 'content-type': 'application/json',\n accept: 'application/json',\n },\n body: JSON.stringify({ path, input, connectionId: options.connectionId }),\n })\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error)\n throw new HubVectorSearchError(`hub exec request failed: ${reason}`, 0, 'HUB_UNREACHABLE')\n }\n const text = await response.text()\n let parsed: { success?: boolean; data?: { result?: unknown }; error?: unknown } | null = null\n if (text) {\n try {\n parsed = JSON.parse(text)\n } catch {\n // fall through: a non-JSON body is handled below\n }\n }\n if (!response.ok || parsed?.success === false) {\n const errorBody = parsed?.error\n const code =\n errorBody && typeof errorBody === 'object' && 'code' in errorBody\n ? String((errorBody as { code: unknown }).code)\n : undefined\n const message =\n (errorBody && typeof errorBody === 'object' && 'message' in errorBody\n ? String((errorBody as { message: unknown }).message)\n : typeof errorBody === 'string'\n ? errorBody\n : undefined) ?? `hub exec failed (${response.status})`\n throw new HubVectorSearchError(message, response.status, code)\n }\n if (!parsed || parsed.data === undefined || parsed.data.result === undefined) {\n throw new HubVectorSearchError(\n 'hub exec response envelope missing `data.result`',\n response.status,\n 'HUB_INVALID_ENVELOPE',\n )\n }\n return parsed.data.result\n}\n\ninterface RawHit {\n id: string\n score: number | undefined\n record: Record<string, unknown> | undefined\n}\n\nexport class HubVectorSearchProvider {\n readonly provider: HubVectorProviderKind\n readonly connectionId: string\n readonly indexName: string\n private readonly options: HubVectorSearchProviderOptions\n private readonly defaultLimit: number\n private readonly hubOrigin: string\n\n constructor(options: HubVectorSearchProviderOptions) {\n this.options = options\n this.provider = providerKindSchema.parse(options.provider)\n this.connectionId = z.string().trim().min(1).parse(options.connectionId)\n this.indexName = z.string().trim().min(1).parse(options.indexName)\n if (this.provider === 'weaviate') {\n if (!graphQlNameSchema.test(this.indexName)) {\n throw new TypeError('Weaviate class name must be a GraphQL identifier')\n }\n for (const property of options.properties ?? []) {\n if (!graphQlNameSchema.test(property)) {\n throw new TypeError(`Weaviate property '${property}' must be a GraphQL identifier`)\n }\n }\n }\n this.defaultLimit = options.defaultLimit ?? 5\n this.hubOrigin = new URL(options.hubUrl).origin\n }\n\n /** The provenance record a retrieval receipt should carry. */\n get provenance(): HubVectorProvenance {\n return {\n provider: this.provider,\n connectionId: this.connectionId,\n indexName: this.indexName,\n hubOrigin: this.hubOrigin,\n action: this.searchAction(),\n }\n }\n\n async search(\n query: string,\n searchOptions: HubVectorSearchOptions = {},\n ): Promise<RetrievedKnowledgeHit[]> {\n const text = queryTextSchema.parse(query)\n const options = searchOptionsSchema.parse(searchOptions)\n const vector = vectorSchema.parse(options.vector ?? (await this.options.embed(text)))\n const limit = options.limit ?? this.defaultLimit\n const raw = await this.searchRaw(vector, limit, options.filter)\n return this.hitsFromRaw(raw, limit)\n }\n\n /** Alias kept for parity with `FileSystemSearchProvider.retrieve`. */\n async retrieve(\n query: string,\n options: HubVectorSearchOptions = {},\n ): Promise<RetrievedKnowledgeHit[]> {\n return this.search(query, options)\n }\n\n asRetrievalEvalRetriever(): RetrievalEvalRetriever {\n return async ({ scenario, k }) => ({\n hits: await this.search(scenario.query, { limit: k }),\n })\n }\n\n private searchAction(): string {\n if (this.provider === 'pinecone') return 'vectors.query'\n if (this.provider === 'qdrant') return 'points.search'\n return 'graphql.query'\n }\n\n private async searchRaw(\n vector: readonly number[],\n limit: number,\n filter: Record<string, unknown> | undefined,\n ): Promise<RawHit[]> {\n if (this.provider === 'pinecone') {\n const result = pineconeResultSchema.parse(\n await hubExec(this.options, 'pinecone.vectors.query', {\n vector: [...vector],\n top_k: limit,\n include_metadata: true,\n ...(this.options.namespace ? { namespace: this.options.namespace } : {}),\n ...(filter ? { filter } : {}),\n }),\n )\n return result.matches.map((match) => ({\n id: String(match.id),\n score: match.score,\n record: match.metadata,\n }))\n }\n if (this.provider === 'qdrant') {\n const result = qdrantResultSchema.parse(\n await hubExec(this.options, 'qdrant.points.search', {\n collection_name: this.indexName,\n vector: [...vector],\n limit,\n with_payload: true,\n ...(filter ? { filter } : {}),\n }),\n )\n return result.result.map((point) => ({\n id: String(point.id),\n score: point.score,\n record: point.payload,\n }))\n }\n const properties = this.options.properties ?? []\n const propertyFields = properties.map((property) => ` ${property}`).join('')\n const graphQl = `{ Get { ${this.indexName}(nearVector: {vector: ${JSON.stringify([...vector])}}, limit: ${limit}) { _additional { id distance }${propertyFields} } } }`\n const result = weaviateResultSchema.parse(\n await hubExec(this.options, 'weaviate.graphql.query', { query: graphQl }),\n )\n if (result.errors && result.errors.length > 0) {\n throw new HubVectorSearchError(\n `weaviate graphql errors: ${JSON.stringify(result.errors).slice(0, SNIPPET_MAX_CHARS)}`,\n 200,\n 'PROVIDER_GRAPHQL_ERROR',\n )\n }\n const objects = result.data.Get?.[this.indexName] ?? []\n return objects.map((object) => {\n const additional = (object._additional ?? {}) as Record<string, unknown>\n const distance = additional.distance\n return {\n id: String(additional.id ?? ''),\n score:\n typeof distance === 'number' && Number.isFinite(distance)\n ? 1 / (1 + Math.max(0, distance))\n : undefined,\n record: Object.fromEntries(Object.entries(object).filter(([key]) => key !== '_additional')),\n }\n })\n }\n\n private hitsFromRaw(raw: readonly RawHit[], limit: number): RetrievedKnowledgeHit[] {\n const topScore = raw.reduce(\n (top, hit) => (hit.score !== undefined && hit.score > top ? hit.score : top),\n 0,\n )\n return raw.slice(0, limit).map((hit, index) => ({\n pageId: hit.id,\n path: `${this.provider}://${this.indexName}/${hit.id}`,\n ...(titleFromRecord(hit.record) !== undefined ? { title: titleFromRecord(hit.record) } : {}),\n rank: index + 1,\n ...(hit.score !== undefined ? { score: hit.score } : {}),\n ...(topScore > 0 && hit.score !== undefined\n ? { normalizedScore: Math.min(1, Math.max(0, hit.score / topScore)) }\n : {}),\n ...(snippetFromRecord(hit.record) !== undefined\n ? { snippet: snippetFromRecord(hit.record) }\n : {}),\n metadata: {\n provider: this.provider,\n connectionId: this.connectionId,\n indexName: this.indexName,\n hubOrigin: this.hubOrigin,\n action: this.searchAction(),\n retrievedAt: new Date().toISOString(),\n ...(hit.record ? { payload: jsonSafe(hit.record) } : {}),\n },\n }))\n }\n}\n\nexport function createHubVectorSearchProvider(\n options: HubVectorSearchProviderOptions,\n): HubVectorSearchProvider {\n return new HubVectorSearchProvider(options)\n}\n","/**\n * Retrieval briefing.\n *\n * A brief turns \"retrieved\" from something a run claims into something the\n * infrastructure can prove. It ranks the knowledge visible to a question,\n * renders it with the ids a later write must cite, and returns the ranked\n * results in the shape a retrieval receipt takes, so what an actor was given\n * is recorded rather than asserted.\n *\n * Pure: no clock, no filesystem, no network.\n */\nimport { canonicalCandidateDigest, type Sha256Digest } from '@tangle-network/agent-interface'\nimport {\n assertKnowledgeCitationsResolved,\n formatKnowledgeCitationReference,\n parseKnowledgeCitationReference,\n resolveKnowledgeCitation,\n} from './citation-resolution'\nimport type { OriginatedKnowledgeSearchResult } from './knowledge-use-receipts'\nimport { tokenizeText } from './lexical-index'\nimport {\n assembleLexicalIndex,\n DEFAULT_FIELD_BOOSTS,\n type LexicalPageTerms,\n lexicalPageTerms,\n} from './lexical-postings'\nimport type { OriginatedPage } from './run-scoped'\nimport {\n KNOWLEDGE_SEARCH_RETRIEVER_ID,\n type KnowledgeSearchHit,\n searchKnowledgePages,\n} from './search'\nimport type { KnowledgeId, KnowledgePage } from './types'\n\n/** Pages in a brief when the caller names no limit. */\nexport const DEFAULT_KNOWLEDGE_BRIEF_LIMIT = 5\n\nexport interface KnowledgeBriefOptions {\n /** Maximum pages in the brief. Defaults to 5. */\n limit?: number\n /**\n * Drop pages whose own evidence refuted them. Defaults to true, the opposite\n * of `searchKnowledge`: a brief is injected before a run's first token and\n * offers every page it names with an id ready to cite, so a refuted page in\n * it is an invitation to build on a dead claim.\n */\n excludeInvalidated?: boolean\n /** Match pages carrying at least one of these tags. */\n tags?: readonly string[]\n /** Match the exact string stored in `frontmatter.kind`. */\n kinds?: readonly string[]\n /**\n * Bound on the rendered brief. A page whose line does not fit is left out of\n * the whole brief, so `text`, `hits`, `citationIds`, and `results` always\n * describe one identical set of pages.\n */\n maxChars?: number\n}\n\nexport interface KnowledgeBrief {\n readonly question: string\n /** Retriever id to declare in a receipt minted from `results`. */\n readonly retrieverId: typeof KNOWLEDGE_SEARCH_RETRIEVER_ID\n /**\n * Digest of the retrieval settings this brief used. Pass it as the\n * `configDigest` of the receipt's retriever identity. The running package\n * version is the caller's to declare, because a bundled build cannot read it.\n */\n readonly retrieverConfigDigest: Sha256Digest\n readonly hits: readonly KnowledgeSearchHit[]\n /** The ids a write should persist in `cites`, in rank order. */\n readonly citationIds: readonly KnowledgeId[]\n /** Ranked results in the shape `createKnowledgeRetrievalReceipt` takes. */\n readonly results: readonly OriginatedKnowledgeSearchResult[]\n /** Deterministic Markdown: one `- [id] title — snippet` line per page, in rank order. */\n readonly text: string\n}\n\n/**\n * Rank the knowledge one question can see and render it for injection.\n *\n * The same page set produces the same brief on every run: ranking, ordering,\n * and rendering are deterministic, and no field carries a timestamp.\n */\nexport function buildKnowledgeBrief(\n visiblePages: readonly OriginatedPage[],\n question: string,\n options: KnowledgeBriefOptions = {},\n): KnowledgeBrief {\n return prepareKnowledgeBrief(visiblePages)(question, options)\n}\n\n/** Internal prepared view, shared by tools only while their immutable page view is current. */\nconst immutablePageTerms = new WeakMap<KnowledgePage, LexicalPageTerms>()\n\n/** Default-tokenizer terms of a frozen page, computed once per page object across views. */\nfunction defaultPageTerms(page: KnowledgePage): LexicalPageTerms {\n let terms = immutablePageTerms.get(page)\n if (terms === undefined) {\n terms = lexicalPageTerms(page, tokenizeText, DEFAULT_FIELD_BOOSTS)\n if (Object.isFrozen(page)) immutablePageTerms.set(page, terms)\n }\n return terms\n}\n\nexport function prepareKnowledgeBrief(visiblePages: readonly OriginatedPage[]) {\n if (!Array.isArray(visiblePages)) {\n throw new TypeError('knowledge brief requires the visible pages')\n }\n // Resolve citation addresses with the same owner used by read/write validation.\n // Keep a small candidate list per id so resolving links does not rescan the corpus.\n const byId = new Map<KnowledgeId, OriginatedPage[]>()\n for (const entry of visiblePages) {\n const matches = byId.get(entry.page.id) ?? []\n matches.push(entry)\n byId.set(entry.page.id, matches)\n }\n const qualified = (entry: OriginatedPage) =>\n formatKnowledgeCitationReference({ pageId: entry.page.id, origin: entry.origin })\n const originals = new Map<KnowledgePage, OriginatedPage>()\n const pages = visiblePages.map((entry) => {\n const page: KnowledgePage = {\n ...entry.page,\n id: qualified(entry),\n outLinks: entry.page.outLinks.flatMap((link: string) => {\n // A malformed link is not a ranking edge; retain the page unchanged so\n // citation audit can still diagnose it without making retrieval unavailable.\n try {\n const reference = parseKnowledgeCitationReference(link)\n const resolution = resolveKnowledgeCitation(byId.get(reference.pageId) ?? [], reference)\n return resolution.resolved ? [qualified(resolution.resolved)] : []\n } catch (error) {\n if (error instanceof TypeError) return []\n throw error\n }\n }),\n }\n originals.set(page, entry)\n return page\n })\n // Ranking reads only title, path and text, which the qualified copy shares with its original.\n const lexicalIndex = assembleLexicalIndex(\n pages,\n visiblePages.map((entry) => defaultPageTerms(entry.page)),\n tokenizeText,\n DEFAULT_FIELD_BOOSTS,\n )\n return (question: string, options: KnowledgeBriefOptions = {}): KnowledgeBrief => {\n if (typeof question !== 'string' || question.trim().length === 0) {\n throw new TypeError('knowledge brief question must be a non-empty string')\n }\n const limit = options.limit ?? DEFAULT_KNOWLEDGE_BRIEF_LIMIT\n const excludeInvalidated = options.excludeInvalidated ?? true\n const maxChars = options.maxChars\n if (maxChars !== undefined && (!Number.isInteger(maxChars) || maxChars < 0)) {\n throw new Error(`knowledge brief maxChars must be a non-negative integer, got ${maxChars}`)\n }\n\n const ranked = searchKnowledgePages(pages, question, {\n lexicalIndex,\n limit,\n excludeInvalidated,\n ...(options.tags === undefined ? {} : { tags: options.tags }),\n ...(options.kinds === undefined ? {} : { kinds: options.kinds }),\n }).map((hit) => {\n const entry = originals.get(hit.page)!\n const candidates = byId.get(entry.page.id)!\n const reference = {\n pageId: entry.page.id,\n ...(candidates.length === 1 &&\n formatKnowledgeCitationReference({ pageId: entry.page.id }) === entry.page.id\n ? {}\n : { origin: entry.origin }),\n }\n // The whole visible chain determines ambiguity, not just this query's filtered hits.\n // Reusing one id within the SAME origin cannot be repaired with a qualifier.\n assertKnowledgeCitationsResolved(candidates, [reference])\n return {\n ...hit,\n page: entry.page,\n origin: entry.origin,\n citationId: formatKnowledgeCitationReference(reference),\n }\n })\n\n const hits: (KnowledgeSearchHit & OriginatedKnowledgeSearchResult)[] = []\n const lines: string[] = []\n let length = 0\n for (const hit of ranked) {\n const line = briefLine(hit)\n const next = length === 0 ? line.length : length + 1 + line.length\n if (maxChars !== undefined && next > maxChars) break\n hits.push(hit)\n lines.push(line)\n length = next\n }\n\n return Object.freeze({\n question: question.trim(),\n retrieverId: KNOWLEDGE_SEARCH_RETRIEVER_ID,\n retrieverConfigDigest: canonicalCandidateDigest({\n limit,\n excludeInvalidated,\n tags: options.tags === undefined ? null : [...options.tags],\n kinds: options.kinds === undefined ? null : [...options.kinds],\n maxChars: maxChars ?? null,\n }),\n hits: Object.freeze(hits),\n citationIds: Object.freeze(hits.map((hit) => hit.citationId)),\n results: Object.freeze(hits.map((hit) => Object.freeze(hit))),\n text: lines.join('\\n'),\n })\n }\n}\n\nfunction briefLine(hit: KnowledgeSearchHit): string {\n const snippet = hit.snippet.replace(/\\s+/g, ' ').trim()\n return snippet === ''\n ? `- [${hit.citationId}] ${hit.page.title}`\n : `- [${hit.citationId}] ${hit.page.title} — ${snippet}`\n}\n","import type { EvidenceRef } from '@tangle-network/agent-eval/analyst'\nimport {\n canonicalCandidateDigest,\n type Sha256Digest,\n sha256Bytes,\n} from '@tangle-network/agent-interface'\nimport {\n assertSchemaVersion,\n createKnowledgeVisibilitySnapshot,\n decodeKnowledgeVisibilitySnapshot,\n digest,\n KNOWLEDGE_RECEIPT_DIGEST_ALGORITHM,\n KNOWLEDGE_USE_RECEIPT_SCHEMA_VERSION,\n knowledgePageDigest,\n nonEmpty,\n normalizeVisibilityArtifact,\n normalizeVisibilityRef,\n type VisibilityIndex,\n validateKnowledgePage,\n validateOrigin,\n visibilityIdentity,\n visibilityIndexOf,\n} from './knowledge-visibility'\nimport type { OriginatedPage, PageOrigin } from './run-scoped'\nimport type { KnowledgeSearchResult } from './types'\n\nexport {\n createKnowledgeVisibilitySnapshot,\n decodeKnowledgeVisibilitySnapshot,\n encodeKnowledgeVisibilitySnapshot,\n KNOWLEDGE_RECEIPT_DIGEST_ALGORITHM,\n KNOWLEDGE_USE_RECEIPT_SCHEMA_VERSION,\n knowledgePageDigest,\n knowledgeVisibilityArtifactRef,\n verifyKnowledgeVisibilitySnapshot,\n} from './knowledge-visibility'\nexport interface KnowledgeVisibilitySnapshotEntry {\n readonly position: number\n readonly pageId: string\n readonly origin: PageOrigin\n readonly path: string\n readonly pageDigest: Sha256Digest\n readonly sourceIds: readonly string[]\n readonly invalidated: boolean\n}\n\n/** Exact ordered page visibility presented to one retrieval operation. */\nexport interface KnowledgeVisibilitySnapshot {\n readonly schemaVersion: typeof KNOWLEDGE_USE_RECEIPT_SCHEMA_VERSION\n readonly digestAlgorithm: typeof KNOWLEDGE_RECEIPT_DIGEST_ALGORITHM\n readonly snapshotDigest: Sha256Digest\n readonly entries: readonly KnowledgeVisibilitySnapshotEntry[]\n}\n\n/** Content-addressed locator of the stored bytes of one visibility snapshot. */\nexport interface KnowledgeVisibilityArtifactRef {\n readonly uri: string\n /** Digest of the stored bytes, as `knowledgeVisibilityArtifactRef` computes it. */\n readonly digest: Sha256Digest\n readonly byteLength: number\n}\n\n/**\n * Compact identity of one exact visibility snapshot. The snapshot bytes live in\n * the artifact the reference names, or in another durable record the caller\n * keeps; the receipt carries only this reference.\n */\nexport interface KnowledgeVisibilityRef {\n readonly snapshotDigest: Sha256Digest\n readonly pageCount: number\n readonly artifact?: KnowledgeVisibilityArtifactRef\n}\n\nexport interface KnowledgeRetrieverIdentity {\n /** Stable implementation name, for example `token-overlap-v1`. */\n readonly id: string\n /** Published or application-defined implementation version. */\n readonly version: string\n /** Exact identity of every retrieval setting not represented elsewhere. */\n readonly configDigest: Sha256Digest\n}\n\nexport interface OriginatedKnowledgeSearchResult extends KnowledgeSearchResult {\n readonly origin: PageOrigin\n}\n\nexport interface KnowledgeRetrievalResultReceipt {\n readonly rank: number\n readonly pageId: string\n readonly origin: PageOrigin\n readonly path: string\n readonly pageDigest: Sha256Digest\n readonly rrfScore: number\n readonly normalizedScore: number\n readonly snippet: string\n readonly reasons: readonly string[]\n}\n\nexport type KnowledgeReceiptAttributeValue = string | number | boolean | null\n\n/**\n * Immutable proof of what one actor could see and what its retriever returned.\n * Final prose is not evidence that retrieval happened; this receipt is.\n */\nexport interface KnowledgeRetrievalReceipt {\n readonly schemaVersion: typeof KNOWLEDGE_USE_RECEIPT_SCHEMA_VERSION\n readonly kind: 'knowledge-retrieval'\n readonly digestAlgorithm: typeof KNOWLEDGE_RECEIPT_DIGEST_ALGORITHM\n readonly receiptDigest: Sha256Digest\n readonly createdAt: string\n readonly runId: string\n readonly actorId?: string\n readonly profileDigest?: Sha256Digest\n readonly executionRef?: Sha256Digest\n readonly query: string\n readonly retriever: KnowledgeRetrieverIdentity\n readonly visibility: KnowledgeVisibilityRef\n readonly results: readonly KnowledgeRetrievalResultReceipt[]\n readonly evidenceRefs: readonly EvidenceRef[]\n readonly attributes: Readonly<Record<string, KnowledgeReceiptAttributeValue>>\n}\n\nexport interface CreateKnowledgeRetrievalReceiptInput {\n readonly runId: string\n readonly actorId?: string\n readonly profileDigest?: Sha256Digest\n readonly executionRef?: Sha256Digest\n readonly query: string\n readonly retriever: KnowledgeRetrieverIdentity\n /**\n * The snapshot the retriever searched, created once with\n * `createKnowledgeVisibilitySnapshot` and reused for every retrieval over the\n * same view. Results join against its entries; the receipt stores only its\n * reference.\n */\n readonly visibility: KnowledgeVisibilitySnapshot\n /** Where the snapshot bytes are stored, when the caller has persisted them. */\n readonly visibilityArtifact?: KnowledgeVisibilityArtifactRef\n readonly results: readonly OriginatedKnowledgeSearchResult[]\n readonly evidenceRefs?: readonly EvidenceRef[]\n readonly attributes?: Readonly<Record<string, KnowledgeReceiptAttributeValue>>\n readonly createdAt?: Date | string\n}\n\n/**\n * Returns the stored bytes of the artifact, or `undefined` when nothing is\n * stored at its uri. A thrown error is reported as a load failure.\n */\nexport type KnowledgeVisibilityArtifactLoader = (\n artifact: KnowledgeVisibilityArtifactRef,\n) => Promise<Uint8Array | undefined> | Uint8Array | undefined\n\nexport type KnowledgeVisibilityUnavailableReason =\n | 'no-artifact-reference'\n | 'missing'\n | 'load-failed'\n\n/**\n * The visibility snapshot a receipt references could not be obtained, so the\n * result-to-visibility join cannot be proven. This is distinct from a snapshot\n * that loads and fails to match.\n */\nexport class KnowledgeVisibilityUnavailableError extends Error {\n readonly reason: KnowledgeVisibilityUnavailableReason\n readonly snapshotDigest: Sha256Digest\n readonly uri?: string\n\n constructor(input: {\n reason: KnowledgeVisibilityUnavailableReason\n snapshotDigest: Sha256Digest\n uri?: string\n cause?: unknown\n }) {\n const where = input.uri === undefined ? '' : ` at '${input.uri}'`\n const detail = {\n 'no-artifact-reference': 'the receipt carries no artifact reference',\n missing: `no artifact is stored${where}`,\n 'load-failed': `the artifact${where} could not be loaded`,\n }[input.reason]\n super(\n `knowledge visibility snapshot ${input.snapshotDigest} is unavailable: ${detail}`,\n input.cause === undefined ? undefined : { cause: input.cause },\n )\n this.name = 'KnowledgeVisibilityUnavailableError'\n this.reason = input.reason\n this.snapshotDigest = input.snapshotDigest\n if (input.uri !== undefined) this.uri = input.uri\n }\n}\n\nexport type KnowledgeUseRelation =\n | 'supports'\n | 'contradicts'\n | 'extends'\n | 'rederives'\n | 'background'\n\nexport type KnowledgeConsumerKind =\n | 'decision'\n | 'artifact'\n | 'experiment'\n | 'candidate'\n | 'message'\n | 'other'\n\nexport interface KnowledgeConsumerRef {\n readonly kind: KnowledgeConsumerKind\n readonly uri: string\n readonly digest?: Sha256Digest\n}\n\nexport interface KnowledgeUsedResult {\n readonly rank: number\n readonly pageId: string\n readonly origin: PageOrigin\n readonly path: string\n readonly pageDigest: Sha256Digest\n}\n\n/**\n * Immutable proof that one retrieved page was selected for a downstream\n * decision, artifact, experiment, candidate, or message.\n */\nexport interface KnowledgeUseReceipt {\n readonly schemaVersion: typeof KNOWLEDGE_USE_RECEIPT_SCHEMA_VERSION\n readonly kind: 'knowledge-use'\n readonly digestAlgorithm: typeof KNOWLEDGE_RECEIPT_DIGEST_ALGORITHM\n readonly receiptDigest: Sha256Digest\n readonly createdAt: string\n readonly runId: string\n readonly actorId?: string\n readonly profileDigest?: Sha256Digest\n readonly executionRef?: Sha256Digest\n readonly retrievalReceiptDigest: Sha256Digest\n readonly used: KnowledgeUsedResult\n readonly relation: KnowledgeUseRelation\n readonly consumer: KnowledgeConsumerRef\n readonly evidenceRefs: readonly EvidenceRef[]\n readonly attributes: Readonly<Record<string, KnowledgeReceiptAttributeValue>>\n}\n\nexport interface CreateKnowledgeUseReceiptInput {\n readonly retrieval: KnowledgeRetrievalReceipt\n /** Exact one-based rank from the retrieval receipt. */\n readonly selectedRank: number\n readonly relation: KnowledgeUseRelation\n readonly consumer: KnowledgeConsumerRef\n readonly evidenceRefs?: readonly EvidenceRef[]\n readonly attributes?: Readonly<Record<string, KnowledgeReceiptAttributeValue>>\n readonly createdAt?: Date | string\n}\n\n/**\n * Why a retrieval influenced nothing.\n *\n * `irrelevant` means the returned pages did not bear on the question.\n * `no-use` means they did bear on it and the consumer still used none of them.\n */\nexport type KnowledgeRetrievalDispositionRelation = 'irrelevant' | 'no-use'\n\n/**\n * Immutable proof that one retrieval led to no use.\n *\n * A use receipt requires a selected rank, so a retrieval that influenced\n * nothing would otherwise leave no record at all, and \"no evidence of use\" and\n * \"evidence of no use\" would look identical in the ledger.\n */\nexport interface KnowledgeRetrievalDisposition {\n readonly schemaVersion: typeof KNOWLEDGE_USE_RECEIPT_SCHEMA_VERSION\n readonly kind: 'knowledge-retrieval-disposition'\n readonly digestAlgorithm: typeof KNOWLEDGE_RECEIPT_DIGEST_ALGORITHM\n readonly receiptDigest: Sha256Digest\n readonly createdAt: string\n readonly runId: string\n readonly actorId?: string\n readonly profileDigest?: Sha256Digest\n readonly executionRef?: Sha256Digest\n readonly retrievalReceiptDigest: Sha256Digest\n readonly relation: KnowledgeRetrievalDispositionRelation\n readonly consumer: KnowledgeConsumerRef\n readonly evidenceRefs: readonly EvidenceRef[]\n readonly attributes: Readonly<Record<string, KnowledgeReceiptAttributeValue>>\n}\n\nexport interface CreateKnowledgeRetrievalDispositionInput {\n readonly retrieval: KnowledgeRetrievalReceipt\n readonly relation: KnowledgeRetrievalDispositionRelation\n readonly consumer: KnowledgeConsumerRef\n readonly evidenceRefs?: readonly EvidenceRef[]\n readonly attributes?: Readonly<Record<string, KnowledgeReceiptAttributeValue>>\n readonly createdAt?: Date | string\n}\n\n/**\n * Create a retrieval receipt over a precomputed snapshot. Every result must\n * occur in the snapshot with the same page id and bytes; the receipt stores the\n * snapshot's reference, not its entries.\n */\nexport function createKnowledgeRetrievalReceipt(\n input: CreateKnowledgeRetrievalReceiptInput,\n): KnowledgeRetrievalReceipt {\n if (!input || typeof input !== 'object') {\n throw new TypeError('knowledge retrieval receipt input is required')\n }\n const runId = nonEmpty(input.runId, 'knowledge retrieval runId')\n const actorId = optionalText(input.actorId, 'knowledge retrieval actorId')\n const profileDigest = optionalDigest(input.profileDigest, 'knowledge retrieval profileDigest')\n const executionRef = optionalDigest(input.executionRef, 'knowledge retrieval executionRef')\n const query = nonEmpty(input.query, 'knowledge retrieval query')\n const retriever = normalizeRetriever(input.retriever)\n const index = visibilityIndexOf(input.visibility)\n const artifact =\n input.visibilityArtifact === undefined\n ? undefined\n : normalizeVisibilityArtifact(\n input.visibilityArtifact,\n 'knowledge retrieval visibilityArtifact',\n )\n const visibility: KnowledgeVisibilityRef = Object.freeze({\n snapshotDigest: index.snapshot.snapshotDigest,\n pageCount: index.snapshot.entries.length,\n ...(artifact === undefined ? {} : { artifact }),\n })\n const results = normalizeRetrievalResults(input.results, index)\n const evidenceRefs = normalizeEvidenceRefs(input.evidenceRefs ?? [])\n const attributes = normalizeAttributes(input.attributes ?? {})\n const createdAt = isoTimestamp(input.createdAt, 'knowledge retrieval createdAt')\n const material = retrievalMaterial({\n createdAt,\n runId,\n actorId,\n profileDigest,\n executionRef,\n query,\n retriever,\n visibility,\n results,\n evidenceRefs,\n attributes,\n })\n return Object.freeze({\n ...material,\n receiptDigest: canonicalCandidateDigest(material),\n })\n}\n\n/**\n * Verify the receipt's schema, canonical digest, rank continuity, finite\n * scores, and well-formed visibility reference. This proves what the receipt\n * says; it does not prove that the results occur in the referenced snapshot.\n * Use `assertKnowledgeRetrievalMatchesVisibility` or\n * `assertKnowledgeRetrievalMatchesVisibilityArtifact` for that join.\n */\nexport function verifyKnowledgeRetrievalReceipt(\n receipt: KnowledgeRetrievalReceipt,\n): KnowledgeRetrievalReceipt {\n if (!receipt || typeof receipt !== 'object') {\n throw new TypeError('knowledge retrieval receipt is required')\n }\n assertSchemaVersion(receipt.schemaVersion, 'knowledge retrieval')\n if (receipt.kind !== 'knowledge-retrieval') {\n throw new Error(`knowledge retrieval receipt kind must be 'knowledge-retrieval'`)\n }\n if (receipt.digestAlgorithm !== KNOWLEDGE_RECEIPT_DIGEST_ALGORITHM) {\n throw new Error(`unsupported knowledge retrieval digestAlgorithm '${receipt.digestAlgorithm}'`)\n }\n const visibility = normalizeVisibilityRef(receipt.visibility)\n validateReceiptResultShape(receipt.results, visibility.pageCount)\n const material = retrievalMaterial({\n createdAt: isoTimestamp(receipt.createdAt, 'knowledge retrieval createdAt'),\n runId: nonEmpty(receipt.runId, 'knowledge retrieval runId'),\n actorId: optionalText(receipt.actorId, 'knowledge retrieval actorId'),\n profileDigest: optionalDigest(receipt.profileDigest, 'knowledge retrieval profileDigest'),\n executionRef: optionalDigest(receipt.executionRef, 'knowledge retrieval executionRef'),\n query: nonEmpty(receipt.query, 'knowledge retrieval query'),\n retriever: normalizeRetriever(receipt.retriever),\n visibility,\n results: receipt.results,\n evidenceRefs: normalizeEvidenceRefs(receipt.evidenceRefs),\n attributes: normalizeAttributes(receipt.attributes),\n })\n const expected = canonicalCandidateDigest(material)\n if (expected !== receipt.receiptDigest) {\n throw new Error('knowledge retrieval receipt digest mismatch')\n }\n return receipt\n}\n\n/**\n * Prove that the receipt references exactly this snapshot and that every\n * returned result occurs in it with the same page id and bytes. Pass the\n * snapshot itself, or the originated pages to snapshot them first.\n */\nexport function assertKnowledgeRetrievalMatchesVisibility(\n receipt: KnowledgeRetrievalReceipt,\n visibility: KnowledgeVisibilitySnapshot | readonly OriginatedPage[],\n): void {\n verifyKnowledgeRetrievalReceipt(receipt)\n const index = visibilityIndexOf(\n Array.isArray(visibility)\n ? createKnowledgeVisibilitySnapshot(visibility)\n : (visibility as KnowledgeVisibilitySnapshot),\n )\n assertReceiptJoinsVisibility(receipt, index)\n}\n\n/**\n * Load the snapshot artifact the receipt references, prove the stored bytes\n * match the reference, and prove every returned result occurs in the decoded\n * snapshot. A snapshot that cannot be obtained raises\n * `KnowledgeVisibilityUnavailableError`; it is never treated as empty.\n */\nexport async function assertKnowledgeRetrievalMatchesVisibilityArtifact(\n receipt: KnowledgeRetrievalReceipt,\n loadArtifact: KnowledgeVisibilityArtifactLoader,\n): Promise<KnowledgeVisibilitySnapshot> {\n verifyKnowledgeRetrievalReceipt(receipt)\n if (typeof loadArtifact !== 'function') {\n throw new TypeError('knowledge visibility artifact loader must be a function')\n }\n const reference = receipt.visibility\n if (reference.artifact === undefined) {\n throw new KnowledgeVisibilityUnavailableError({\n reason: 'no-artifact-reference',\n snapshotDigest: reference.snapshotDigest,\n })\n }\n const artifact = reference.artifact\n let bytes: Uint8Array | undefined\n try {\n bytes = await loadArtifact(artifact)\n } catch (error) {\n throw new KnowledgeVisibilityUnavailableError({\n reason: 'load-failed',\n snapshotDigest: reference.snapshotDigest,\n uri: artifact.uri,\n cause: error,\n })\n }\n if (bytes === undefined) {\n throw new KnowledgeVisibilityUnavailableError({\n reason: 'missing',\n snapshotDigest: reference.snapshotDigest,\n uri: artifact.uri,\n })\n }\n if (!(bytes instanceof Uint8Array)) {\n throw new TypeError(`knowledge visibility artifact '${artifact.uri}' loaded a non-byte value`)\n }\n if (bytes.byteLength !== artifact.byteLength) {\n throw new Error(\n `knowledge visibility artifact '${artifact.uri}' byteLength mismatch: expected ${artifact.byteLength}, observed ${bytes.byteLength}`,\n )\n }\n if (sha256Bytes(bytes) !== artifact.digest) {\n throw new Error(`knowledge visibility artifact '${artifact.uri}' digest mismatch`)\n }\n const snapshot = decodeKnowledgeVisibilitySnapshot(bytes)\n if (snapshot.snapshotDigest !== reference.snapshotDigest) {\n throw new Error(\n `knowledge visibility artifact '${artifact.uri}' holds snapshot ${snapshot.snapshotDigest}, not ${reference.snapshotDigest}`,\n )\n }\n assertReceiptJoinsVisibility(receipt, visibilityIndexOf(snapshot))\n return snapshot\n}\n\n/** Create a downstream-use receipt for one exact ranked result. */\nexport function createKnowledgeUseReceipt(\n input: CreateKnowledgeUseReceiptInput,\n): KnowledgeUseReceipt {\n if (!input || typeof input !== 'object') {\n throw new TypeError('knowledge use receipt input is required')\n }\n const retrieval = verifyKnowledgeRetrievalReceipt(input.retrieval)\n if (!Number.isSafeInteger(input.selectedRank) || input.selectedRank < 1) {\n throw new TypeError('knowledge use selectedRank must be a positive safe integer')\n }\n const selected = retrieval.results.find((result) => result.rank === input.selectedRank)\n if (!selected) {\n throw new Error(\n `knowledge use selectedRank ${input.selectedRank} was not returned by retrieval ${retrieval.receiptDigest}`,\n )\n }\n const relation = validateUseRelation(input.relation)\n const consumer = normalizeConsumer(input.consumer)\n const evidenceRefs = normalizeEvidenceRefs(input.evidenceRefs ?? [])\n const attributes = normalizeAttributes(input.attributes ?? {})\n const createdAt = isoTimestamp(input.createdAt, 'knowledge use createdAt')\n const used = Object.freeze({\n rank: selected.rank,\n pageId: selected.pageId,\n origin: selected.origin,\n path: selected.path,\n pageDigest: selected.pageDigest,\n })\n const material = useMaterial({\n createdAt,\n retrieval,\n used,\n relation,\n consumer,\n evidenceRefs,\n attributes,\n })\n return Object.freeze({\n ...material,\n receiptDigest: canonicalCandidateDigest(material),\n })\n}\n\n/** Verify one use receipt against the exact retrieval that authorized it. */\nexport function verifyKnowledgeUseReceipt(\n receipt: KnowledgeUseReceipt,\n retrieval: KnowledgeRetrievalReceipt,\n): KnowledgeUseReceipt {\n if (!receipt || typeof receipt !== 'object') {\n throw new TypeError('knowledge use receipt is required')\n }\n const verifiedRetrieval = verifyKnowledgeRetrievalReceipt(retrieval)\n assertSchemaVersion(receipt.schemaVersion, 'knowledge use')\n if (receipt.kind !== 'knowledge-use') {\n throw new Error(`knowledge use receipt kind must be 'knowledge-use'`)\n }\n if (receipt.digestAlgorithm !== KNOWLEDGE_RECEIPT_DIGEST_ALGORITHM) {\n throw new Error(`unsupported knowledge use digestAlgorithm '${receipt.digestAlgorithm}'`)\n }\n if (receipt.retrievalReceiptDigest !== verifiedRetrieval.receiptDigest) {\n throw new Error('knowledge use receipt references a different retrieval receipt')\n }\n const selected = verifiedRetrieval.results.find((result) => result.rank === receipt.used.rank)\n if (\n !selected ||\n selected.pageId !== receipt.used.pageId ||\n selected.origin !== receipt.used.origin ||\n selected.path !== receipt.used.path ||\n selected.pageDigest !== receipt.used.pageDigest\n ) {\n throw new Error('knowledge use receipt selected result does not match the retrieval receipt')\n }\n const material = useMaterial({\n createdAt: isoTimestamp(receipt.createdAt, 'knowledge use createdAt'),\n retrieval: verifiedRetrieval,\n used: receipt.used,\n relation: validateUseRelation(receipt.relation),\n consumer: normalizeConsumer(receipt.consumer),\n evidenceRefs: normalizeEvidenceRefs(receipt.evidenceRefs),\n attributes: normalizeAttributes(receipt.attributes),\n })\n const expected = canonicalCandidateDigest(material)\n if (expected !== receipt.receiptDigest) {\n throw new Error('knowledge use receipt digest mismatch')\n }\n return receipt\n}\n\n/** Record that one retrieval led to no use, with no rank to select. */\nexport function createKnowledgeRetrievalDisposition(\n input: CreateKnowledgeRetrievalDispositionInput,\n): KnowledgeRetrievalDisposition {\n if (!input || typeof input !== 'object') {\n throw new TypeError('knowledge retrieval disposition input is required')\n }\n const material = dispositionMaterial({\n createdAt: isoTimestamp(input.createdAt, 'knowledge retrieval disposition createdAt'),\n retrieval: verifyKnowledgeRetrievalReceipt(input.retrieval),\n relation: validateDispositionRelation(input.relation),\n consumer: normalizeConsumer(input.consumer),\n evidenceRefs: normalizeEvidenceRefs(input.evidenceRefs ?? []),\n attributes: normalizeAttributes(input.attributes ?? {}),\n })\n return Object.freeze({ ...material, receiptDigest: canonicalCandidateDigest(material) })\n}\n\n/** Verify one disposition against the exact retrieval that authorized it. */\nexport function verifyKnowledgeRetrievalDisposition(\n disposition: KnowledgeRetrievalDisposition,\n retrieval: KnowledgeRetrievalReceipt,\n): KnowledgeRetrievalDisposition {\n if (!disposition || typeof disposition !== 'object') {\n throw new TypeError('knowledge retrieval disposition is required')\n }\n const verifiedRetrieval = verifyKnowledgeRetrievalReceipt(retrieval)\n assertSchemaVersion(disposition.schemaVersion, 'knowledge retrieval disposition')\n if (disposition.kind !== 'knowledge-retrieval-disposition') {\n throw new Error(\n `knowledge retrieval disposition kind must be 'knowledge-retrieval-disposition'`,\n )\n }\n if (disposition.digestAlgorithm !== KNOWLEDGE_RECEIPT_DIGEST_ALGORITHM) {\n throw new Error(\n `unsupported knowledge retrieval disposition digestAlgorithm '${disposition.digestAlgorithm}'`,\n )\n }\n if (disposition.retrievalReceiptDigest !== verifiedRetrieval.receiptDigest) {\n throw new Error('knowledge retrieval disposition references a different retrieval receipt')\n }\n const material = dispositionMaterial({\n createdAt: isoTimestamp(disposition.createdAt, 'knowledge retrieval disposition createdAt'),\n retrieval: verifiedRetrieval,\n relation: validateDispositionRelation(disposition.relation),\n consumer: normalizeConsumer(disposition.consumer),\n evidenceRefs: normalizeEvidenceRefs(disposition.evidenceRefs),\n attributes: normalizeAttributes(disposition.attributes),\n })\n if (canonicalCandidateDigest(material) !== disposition.receiptDigest) {\n throw new Error('knowledge retrieval disposition digest mismatch')\n }\n return disposition\n}\n\nfunction assertReceiptJoinsVisibility(\n receipt: KnowledgeRetrievalReceipt,\n index: VisibilityIndex,\n): void {\n if (\n index.snapshot.snapshotDigest !== receipt.visibility.snapshotDigest ||\n index.snapshot.entries.length !== receipt.visibility.pageCount\n ) {\n throw new Error('knowledge retrieval receipt does not match the supplied visibility snapshot')\n }\n for (const result of receipt.results) {\n const entry = index.byIdentity.get(visibilityIdentity(result.origin, result.path))\n if (!entry || entry.pageId !== result.pageId || entry.pageDigest !== result.pageDigest) {\n throw new Error(\n `knowledge retrieval result rank ${result.rank} is not in the visibility snapshot`,\n )\n }\n }\n}\n\nfunction retrievalMaterial(input: {\n createdAt: string\n runId: string\n actorId?: string\n profileDigest?: Sha256Digest\n executionRef?: Sha256Digest\n query: string\n retriever: KnowledgeRetrieverIdentity\n visibility: KnowledgeVisibilityRef\n results: readonly KnowledgeRetrievalResultReceipt[]\n evidenceRefs: readonly EvidenceRef[]\n attributes: Readonly<Record<string, KnowledgeReceiptAttributeValue>>\n}) {\n return {\n schemaVersion: KNOWLEDGE_USE_RECEIPT_SCHEMA_VERSION,\n kind: 'knowledge-retrieval' as const,\n digestAlgorithm: KNOWLEDGE_RECEIPT_DIGEST_ALGORITHM,\n createdAt: input.createdAt,\n runId: input.runId,\n ...(input.actorId === undefined ? {} : { actorId: input.actorId }),\n ...(input.profileDigest === undefined ? {} : { profileDigest: input.profileDigest }),\n ...(input.executionRef === undefined ? {} : { executionRef: input.executionRef }),\n query: input.query,\n retriever: input.retriever,\n visibility: input.visibility,\n results: input.results,\n evidenceRefs: input.evidenceRefs,\n attributes: input.attributes,\n }\n}\n\n/**\n * The actor identity a downstream record inherits from the retrieval that\n * authorized it. A record that re-declared these could disagree with the\n * receipt it references.\n */\nfunction retrievalIdentity(retrieval: KnowledgeRetrievalReceipt) {\n return {\n runId: retrieval.runId,\n ...(retrieval.actorId === undefined ? {} : { actorId: retrieval.actorId }),\n ...(retrieval.profileDigest === undefined ? {} : { profileDigest: retrieval.profileDigest }),\n ...(retrieval.executionRef === undefined ? {} : { executionRef: retrieval.executionRef }),\n retrievalReceiptDigest: retrieval.receiptDigest,\n }\n}\n\nfunction useMaterial(input: {\n createdAt: string\n retrieval: KnowledgeRetrievalReceipt\n used: KnowledgeUsedResult\n relation: KnowledgeUseRelation\n consumer: KnowledgeConsumerRef\n evidenceRefs: readonly EvidenceRef[]\n attributes: Readonly<Record<string, KnowledgeReceiptAttributeValue>>\n}) {\n return {\n schemaVersion: KNOWLEDGE_USE_RECEIPT_SCHEMA_VERSION,\n kind: 'knowledge-use' as const,\n digestAlgorithm: KNOWLEDGE_RECEIPT_DIGEST_ALGORITHM,\n createdAt: input.createdAt,\n ...retrievalIdentity(input.retrieval),\n used: input.used,\n relation: input.relation,\n consumer: input.consumer,\n evidenceRefs: input.evidenceRefs,\n attributes: input.attributes,\n }\n}\n\nfunction dispositionMaterial(input: {\n createdAt: string\n retrieval: KnowledgeRetrievalReceipt\n relation: KnowledgeRetrievalDispositionRelation\n consumer: KnowledgeConsumerRef\n evidenceRefs: readonly EvidenceRef[]\n attributes: Readonly<Record<string, KnowledgeReceiptAttributeValue>>\n}) {\n return {\n schemaVersion: KNOWLEDGE_USE_RECEIPT_SCHEMA_VERSION,\n kind: 'knowledge-retrieval-disposition' as const,\n digestAlgorithm: KNOWLEDGE_RECEIPT_DIGEST_ALGORITHM,\n createdAt: input.createdAt,\n ...retrievalIdentity(input.retrieval),\n relation: input.relation,\n consumer: input.consumer,\n evidenceRefs: input.evidenceRefs,\n attributes: input.attributes,\n }\n}\n\nfunction validateDispositionRelation(\n value: KnowledgeRetrievalDispositionRelation,\n): KnowledgeRetrievalDispositionRelation {\n if (value !== 'irrelevant' && value !== 'no-use') {\n throw new TypeError(`knowledge retrieval disposition relation is invalid: ${String(value)}`)\n }\n return value\n}\n\nfunction normalizeRetrievalResults(\n results: readonly OriginatedKnowledgeSearchResult[],\n index: VisibilityIndex,\n): readonly KnowledgeRetrievalResultReceipt[] {\n if (!Array.isArray(results)) throw new TypeError('knowledge retrieval results must be an array')\n const seenRanks = new Set<number>()\n const seenPages = new Set<string>()\n const normalized = results.map((result, position) => {\n if (!result || typeof result !== 'object') {\n throw new TypeError(`knowledge retrieval results[${position}] must be an object`)\n }\n if (!Number.isSafeInteger(result.rank) || result.rank < 1) {\n throw new TypeError(`knowledge retrieval results[${position}].rank must be positive`)\n }\n if (seenRanks.has(result.rank)) {\n throw new Error(`knowledge retrieval repeats rank ${result.rank}`)\n }\n seenRanks.add(result.rank)\n const origin = validateOrigin(result.origin, `knowledge retrieval results[${position}].origin`)\n validateKnowledgePage(result.page)\n const identity = visibilityIdentity(origin, result.page.path)\n if (seenPages.has(identity)) {\n throw new Error(\n `knowledge retrieval repeats page '${result.page.path}' at origin '${origin}'`,\n )\n }\n seenPages.add(identity)\n const visibleEntry = index.byIdentity.get(identity)\n if (!visibleEntry) {\n throw new Error(\n `knowledge retrieval result '${result.page.path}' at origin '${origin}' was not visible`,\n )\n }\n const pageDigest = knowledgePageDigest(result.page)\n if (visibleEntry.pageId !== result.page.id || visibleEntry.pageDigest !== pageDigest) {\n throw new Error(\n `knowledge retrieval result '${result.page.path}' does not match its visibility snapshot`,\n )\n }\n assertResultScores(result, position)\n return Object.freeze({\n rank: result.rank,\n pageId: result.page.id,\n origin,\n path: result.page.path,\n pageDigest,\n rrfScore: result.rrfScore,\n normalizedScore: result.normalizedScore,\n snippet: typeof result.snippet === 'string' ? result.snippet : '',\n reasons: Object.freeze(\n result.reasons.map((reason: string, reasonIndex: number) =>\n nonEmpty(reason, `knowledge retrieval results[${position}].reasons[${reasonIndex}]`),\n ),\n ),\n })\n })\n normalized.sort((left, right) => left.rank - right.rank)\n assertContiguousRanks(normalized)\n return Object.freeze(normalized)\n}\n\nfunction validateReceiptResultShape(\n results: readonly KnowledgeRetrievalResultReceipt[],\n pageCount: number,\n): void {\n if (!Array.isArray(results)) throw new TypeError('knowledge retrieval results must be an array')\n if (results.length > pageCount) {\n throw new Error(\n `knowledge retrieval returns ${results.length} results from ${pageCount} visible pages`,\n )\n }\n assertContiguousRanks(results)\n const seen = new Set<string>()\n results.forEach((result, position) => {\n if (!result || typeof result !== 'object') {\n throw new TypeError(`knowledge retrieval results[${position}] must be an object`)\n }\n const origin = validateOrigin(result.origin, `knowledge retrieval results[${position}].origin`)\n const identity = visibilityIdentity(\n origin,\n nonEmpty(result.path, `knowledge retrieval results[${position}].path`),\n )\n if (seen.has(identity)) {\n throw new Error(`knowledge retrieval repeats visible page '${result.path}'`)\n }\n seen.add(identity)\n nonEmpty(result.pageId, `knowledge retrieval results[${position}].pageId`)\n digest(result.pageDigest, `knowledge retrieval results[${position}].pageDigest`)\n assertResultScores(result, position)\n if (typeof result.snippet !== 'string') {\n throw new TypeError(`knowledge retrieval results[${position}].snippet must be a string`)\n }\n if (!Array.isArray(result.reasons)) {\n throw new TypeError(`knowledge retrieval results[${position}].reasons must be an array`)\n }\n })\n}\n\n/**\n * Ranks a retriever returned: one-based, unique, and contiguous, so a receipt\n * cannot hide a result by omitting its rank.\n */\nfunction assertContiguousRanks(results: readonly { readonly rank: number }[]): void {\n results.forEach((result, position) => {\n if (result.rank !== position + 1) {\n throw new Error(\n `knowledge retrieval ranks must be contiguous from 1; expected ${position + 1}, observed ${result.rank}`,\n )\n }\n })\n}\n\n/** Scores a receipt may carry: finite, with the normalized score inside [0,1]. */\nfunction assertResultScores(\n result: { readonly rrfScore: number; readonly normalizedScore: number },\n position: number,\n): void {\n finite(result.rrfScore, `knowledge retrieval results[${position}].rrfScore`)\n finite(result.normalizedScore, `knowledge retrieval results[${position}].normalizedScore`)\n if (result.normalizedScore < 0 || result.normalizedScore > 1) {\n throw new TypeError(`knowledge retrieval results[${position}].normalizedScore must be in [0,1]`)\n }\n}\n\nfunction normalizeRetriever(input: KnowledgeRetrieverIdentity): KnowledgeRetrieverIdentity {\n if (!input || typeof input !== 'object') {\n throw new TypeError('knowledge retriever identity is required')\n }\n return Object.freeze({\n id: nonEmpty(input.id, 'knowledge retriever id'),\n version: nonEmpty(input.version, 'knowledge retriever version'),\n configDigest: digest(input.configDigest, 'knowledge retriever configDigest'),\n })\n}\n\nfunction normalizeConsumer(input: KnowledgeConsumerRef): KnowledgeConsumerRef {\n if (!input || typeof input !== 'object') {\n throw new TypeError('knowledge consumer reference is required')\n }\n const kinds: readonly KnowledgeConsumerKind[] = [\n 'decision',\n 'artifact',\n 'experiment',\n 'candidate',\n 'message',\n 'other',\n ]\n if (!kinds.includes(input.kind)) {\n throw new TypeError(`knowledge consumer kind is invalid: ${String(input.kind)}`)\n }\n return Object.freeze({\n kind: input.kind,\n uri: nonEmpty(input.uri, 'knowledge consumer uri'),\n ...(input.digest === undefined\n ? {}\n : { digest: digest(input.digest, 'knowledge consumer digest') }),\n })\n}\n\nfunction normalizeEvidenceRefs(values: readonly EvidenceRef[]): readonly EvidenceRef[] {\n if (!Array.isArray(values)) throw new TypeError('knowledge evidenceRefs must be an array')\n const allowed: readonly EvidenceRef['kind'][] = ['span', 'event', 'artifact', 'finding', 'metric']\n return Object.freeze(\n values.map((value, index) => {\n if (!value || typeof value !== 'object' || !allowed.includes(value.kind)) {\n throw new TypeError(`knowledge evidenceRefs[${index}].kind is invalid`)\n }\n return Object.freeze({\n kind: value.kind,\n uri: nonEmpty(value.uri, `knowledge evidenceRefs[${index}].uri`),\n ...(value.excerpt === undefined\n ? {}\n : { excerpt: nonEmpty(value.excerpt, `knowledge evidenceRefs[${index}].excerpt`) }),\n })\n }),\n )\n}\n\nfunction normalizeAttributes(\n input: Readonly<Record<string, KnowledgeReceiptAttributeValue>>,\n): Readonly<Record<string, KnowledgeReceiptAttributeValue>> {\n if (!input || typeof input !== 'object' || Array.isArray(input)) {\n throw new TypeError('knowledge receipt attributes must be an object')\n }\n const normalized: Record<string, KnowledgeReceiptAttributeValue> = {}\n for (const [key, value] of Object.entries(input)) {\n const name = nonEmpty(key, 'knowledge receipt attribute key')\n if (\n value !== null &&\n typeof value !== 'string' &&\n typeof value !== 'number' &&\n typeof value !== 'boolean'\n ) {\n throw new TypeError(`knowledge receipt attribute '${name}' has an unsupported value`)\n }\n if (typeof value === 'number') finite(value, `knowledge receipt attribute '${name}'`)\n normalized[name] = value\n }\n return Object.freeze(normalized)\n}\n\nfunction validateUseRelation(value: KnowledgeUseRelation): KnowledgeUseRelation {\n const allowed: readonly KnowledgeUseRelation[] = [\n 'supports',\n 'contradicts',\n 'extends',\n 'rederives',\n 'background',\n ]\n if (!allowed.includes(value)) {\n throw new TypeError(`knowledge use relation is invalid: ${String(value)}`)\n }\n return value\n}\n\nfunction optionalDigest(value: unknown, label: string): Sha256Digest | undefined {\n return value === undefined ? undefined : digest(value, label)\n}\n\nfunction optionalText(value: unknown, label: string): string | undefined {\n return value === undefined ? undefined : nonEmpty(value, label)\n}\n\nfunction finite(value: unknown, label: string): asserts value is number {\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n throw new TypeError(`${label} must be a finite number`)\n }\n}\n\nfunction isoTimestamp(value: Date | string | undefined, label: string): string {\n const date = value === undefined ? new Date() : value instanceof Date ? value : new Date(value)\n if (!Number.isFinite(date.getTime())) throw new TypeError(`${label} must be a valid timestamp`)\n return date.toISOString()\n}\n","/**\n * Provider-neutral knowledge tools.\n *\n * Knowledge owns what each tool does; a runtime only transports the definitions\n * and the calls. The shape is `ToolDefinition` from `@tangle-network/agent-interface`,\n * so no provider vocabulary reaches this package and no knowledge behavior\n * reaches a provider adapter.\n *\n * Every search mints a retrieval receipt. Configured receipt capture also\n * persists the exact visibility snapshot before delivering the receipt.\n *\n * Every result carries `timing` in milliseconds: `viewMs` to obtain the current\n * page view, `visibilityMs` to persist a search's snapshot, and for a write\n * `lockWaitMs` and `lockHoldMs` of the store lock.\n */\n\nimport { lstat } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport { pathToFileURL } from 'node:url'\nimport { sha256DigestSchema, type ToolDefinition } from '@tangle-network/agent-interface'\nimport { z } from 'zod'\nimport {\n parseKnowledgeCitationReference,\n resolveKnowledgeCitation,\n resolveKnowledgeCitations,\n} from './citation-resolution'\nimport { isMissingFile, readRegularFileWithinRoot, writeFileDurableWithinRoot } from './durable-fs'\nimport { type KnowledgeBriefOptions, prepareKnowledgeBrief } from './knowledge-brief'\nimport {\n createKnowledgeRetrievalReceipt,\n createKnowledgeVisibilitySnapshot,\n encodeKnowledgeVisibilitySnapshot,\n type KnowledgeRetrievalReceipt,\n knowledgeVisibilityArtifactRef,\n} from './knowledge-use-receipts'\nimport {\n immutablePageDigest,\n knowledgePageDigest,\n snapshotImmutableVisibility,\n} from './knowledge-visibility'\nimport { measureKnowledgeMutation, withKnowledgeMutationLabel } from './mutation-lock'\nimport { normalizePagesDirectory } from './pages-directory'\nimport { applyKnowledgeWriteBlocks, type KnowledgeWriteIntakeRequest } from './proposals'\nimport {\n isKnowledgeToolChain,\n loadKnowledgeToolChain,\n type OriginatedPage,\n type RunScopedStores,\n} from './run-scoped'\nimport { parseKnowledgeWriteBlocks } from './write-protocol'\n\nexport interface CreateKnowledgeToolsOptions {\n readonly stores: RunScopedStores\n /** The run whose store is written and whose chain is read. */\n readonly runId: string\n /**\n * Version of this package the host is running. A bundled build cannot read\n * its own manifest, and a receipt that guessed the version would be a\n * receipt that lies about what ranked the results.\n */\n readonly retrieverVersion: string\n readonly actorId?: string\n readonly pagesDirectory?: string\n /** Intake settings for `knowledge_record`. Absent leaves the write ungated. */\n readonly intake?: Omit<KnowledgeWriteIntakeRequest, 'inheritedPages'>\n /** Retain prior and new bytes for every completed knowledge_record transaction. */\n readonly retainHistory?: boolean\n /** Brief settings for `knowledge_search`, overridden per call by the tool input. */\n readonly brief?: Omit<KnowledgeBriefOptions, 'limit'>\n /** Receipt sink. Exact visibility bytes are persisted in the run store before this is called. */\n readonly recordRetrieval?: (receipt: KnowledgeRetrievalReceipt) => Promise<void> | void\n readonly now?: () => Date\n}\n\n// Weak keys release derived indexes when the bounded store cache replaces a view.\nconst preparedViews = new WeakMap<\n readonly OriginatedPage[],\n {\n brief: ReturnType<typeof prepareKnowledgeBrief>\n visibility: ReturnType<typeof createKnowledgeVisibilitySnapshot>\n bytes: Uint8Array\n }\n>()\n\nfunction prepareView(chain: readonly OriginatedPage[]) {\n const reusable = isKnowledgeToolChain(chain)\n const previous = reusable ? preparedViews.get(chain) : undefined\n if (previous) return previous\n const visibility = reusable\n ? snapshotImmutableVisibility(chain)\n : createKnowledgeVisibilitySnapshot(chain)\n const prepared = {\n brief: prepareKnowledgeBrief(chain),\n visibility,\n bytes: encodeKnowledgeVisibilitySnapshot(visibility),\n }\n if (reusable) preparedViews.set(chain, prepared)\n return prepared\n}\n\nconst searchInput = z.object({\n question: z.string().min(1),\n limit: z.int().min(1).max(50).optional(),\n excludeInvalidated: z\n .boolean()\n .optional()\n .describe('False includes refuted pages for historical research.'),\n tags: z.array(z.string()).optional(),\n kinds: z.array(z.string()).optional(),\n})\nconst readInput = z.object({ pageId: z.string().min(1) })\nconst recordInput = z.object({\n expectedPageDigests: z\n .record(z.string().min(1), sha256DigestSchema.nullable())\n .optional()\n .describe(\n 'For each existing page, pass its path and pageDigest from knowledge_read. Null requires a new page. Missing entries permit new pages only.',\n ),\n proposal: z\n .string()\n .min(1)\n .describe(\n 'One or more complete FILE blocks. Each begins with ---FILE: <page-path>--- and ends with ---END FILE---, each on its own line. Put the page content between them. Every block must be valid; malformed or empty proposals write nothing and return an error.',\n ),\n})\nconst resolveInput = z.object({ references: z.array(z.string().min(1)).min(1) })\n\n/**\n * The four tools an agent needs to use a knowledge store: search, read, record,\n * resolve.\n */\nexport function createKnowledgeTools(options: CreateKnowledgeToolsOptions): ToolDefinition[] {\n const { stores, runId } = options\n if (!stores || typeof stores.loadChain !== 'function') {\n throw new TypeError('knowledge tools require run-scoped stores')\n }\n if (typeof runId !== 'string' || runId.trim().length === 0) {\n throw new TypeError('knowledge tools require a runId')\n }\n if (typeof options.retrieverVersion !== 'string' || options.retrieverVersion.trim() === '') {\n throw new TypeError('knowledge tools require the running retrieverVersion')\n }\n const pages =\n options.pagesDirectory === undefined ? {} : { pagesDirectory: options.pagesDirectory }\n const pagesDirectory = normalizePagesDirectory(options.pagesDirectory)\n\n return [\n tool(\n 'knowledge_search',\n 'Search visible knowledge with unambiguous citation handles. Optionally include refuted history or filter tags and kinds.',\n searchInput,\n async (input) => {\n const started = performance.now()\n const chain = await loadKnowledgeToolChain(stores, runId)\n const prepared = prepareView(chain)\n const viewMs = elapsedSince(started)\n const brief = prepared.brief(input.question, {\n ...options.brief,\n ...(input.limit === undefined ? {} : { limit: input.limit }),\n ...(input.excludeInvalidated === undefined\n ? {}\n : { excludeInvalidated: input.excludeInvalidated }),\n ...(input.tags === undefined ? {} : { tags: input.tags }),\n ...(input.kinds === undefined ? {} : { kinds: input.kinds }),\n })\n const visibility = prepared.visibility\n const persisting = performance.now()\n const visibilityArtifact = options.recordRetrieval\n ? await persistVisibility(stores.storePath(runId), visibility, prepared.bytes)\n : undefined\n const visibilityMs = elapsedSince(persisting)\n const receipt = createKnowledgeRetrievalReceipt({\n runId,\n ...(options.actorId === undefined ? {} : { actorId: options.actorId }),\n query: brief.question,\n retriever: {\n id: brief.retrieverId,\n version: options.retrieverVersion,\n configDigest: brief.retrieverConfigDigest,\n },\n visibility,\n ...(visibilityArtifact ? { visibilityArtifact } : {}),\n results: brief.results,\n createdAt: options.now?.(),\n })\n await options.recordRetrieval?.(receipt)\n return {\n text: brief.text,\n citationIds: brief.citationIds,\n retrievalReceiptDigest: receipt.receiptDigest,\n receipt,\n timing: { viewMs, visibilityMs },\n }\n },\n ),\n\n tool(\n 'knowledge_read',\n 'Read one page by its id, optionally qualified with here::, shared:: or inherited:<runId>::.',\n readInput,\n async (input) => {\n const started = performance.now()\n const chain = await loadKnowledgeToolChain(stores, runId)\n const viewMs = elapsedSince(started)\n const resolution = resolveKnowledgeCitation(\n chain,\n parseKnowledgeCitationReference(input.pageId),\n )\n const digestOf = isKnowledgeToolChain(chain) ? immutablePageDigest : knowledgePageDigest\n return {\n status: resolution.status,\n page:\n resolution.resolved === undefined\n ? null\n : {\n pageId: resolution.resolved.page.id,\n origin: resolution.resolved.origin,\n path: resolution.resolved.page.path,\n title: resolution.resolved.page.title,\n pageDigest: digestOf(resolution.resolved.page),\n text: resolution.resolved.page.text,\n },\n candidates: resolution.candidates.map((candidate) => ({\n pageId: candidate.pageId,\n origin: candidate.origin,\n path: candidate.page.path,\n })),\n timing: { viewMs },\n }\n },\n ),\n\n tool(\n 'knowledge_record',\n `Write pages into this run's store. Use complete blocks exactly like:\\n---FILE: ${pagesDirectory}/example.md---\\n# Example\\nPage content.\\n---END FILE---\\nUse paths under ${pagesDirectory}/. Both delimiters must be on their own lines. To update a page, first knowledge_read it and pass expectedPageDigests[path] = pageDigest. Stale edits and malformed, unsafe, or empty proposals are rejected before writing any pages.`,\n recordInput,\n async (input) => {\n const parsed = parseKnowledgeWriteBlocks(input.proposal, [`${pagesDirectory}/`])\n // Tool success must mean the complete proposal was admitted, not a silent partial write.\n if (parsed.blocks.length === 0 || parsed.warnings.length > 0) {\n throw new Error(\n `knowledge_record rejected the proposal without writing any pages. Use ---FILE: ${pagesDirectory}/example.md--- followed by content and ---END FILE---, each delimiter on its own line. ${parsed.warnings.join(' ')}`,\n )\n }\n const intake = options.intake\n const inheritedPages = intake === undefined ? [] : await inheritedOf(stores, runId)\n const paths = parsed.blocks.map((block) => block.path)\n const holder = `knowledge_record by ${options.actorId ?? 'an unnamed actor'} of ${paths.slice(0, 3).join(', ')}${paths.length > 3 ? ` and ${paths.length - 3} more` : ''}`\n const { value, timing } = await measureKnowledgeMutation(() =>\n withKnowledgeMutationLabel(holder, () =>\n applyKnowledgeWriteBlocks(stores.storePath(runId), input.proposal, {\n ...pages,\n actorId: options.actorId,\n runId,\n expectedPageDigests: input.expectedPageDigests ?? {},\n retainHistory: options.retainHistory ?? true,\n ...(intake === undefined ? {} : { intake: { ...intake, inheritedPages } }),\n }),\n ),\n )\n return { ...value, timing: timing ?? { lockWaitMs: 0, lockHoldMs: 0 } }\n },\n ),\n\n tool(\n 'knowledge_resolve',\n 'Resolve page ids against everything this run can see, without hiding an ambiguity.',\n resolveInput,\n async (input) => {\n const started = performance.now()\n const chain = await loadKnowledgeToolChain(stores, runId)\n const viewMs = elapsedSince(started)\n return {\n resolutions: resolveKnowledgeCitations(\n chain,\n input.references.map((reference) => parseKnowledgeCitationReference(reference)),\n ).map((resolution) => ({\n pageId: resolution.reference.pageId,\n ...(resolution.reference.origin === undefined\n ? {}\n : { origin: resolution.reference.origin }),\n status: resolution.status,\n candidates: resolution.candidates.map((candidate) => ({\n pageId: candidate.pageId,\n origin: candidate.origin,\n path: candidate.page.path,\n })),\n })),\n timing: { viewMs },\n }\n },\n ),\n ]\n}\n\nfunction elapsedSince(started: number): number {\n return Math.round(performance.now() - started)\n}\n\n/** Everything the run can see except what it wrote, which the write path reads itself. */\nasync function inheritedOf(\n stores: RunScopedStores,\n runId: string,\n): Promise<readonly OriginatedPage[]> {\n return (await loadKnowledgeToolChain(stores, runId)).filter((entry) => entry.origin !== 'here')\n}\n\nfunction tool<Schema extends z.ZodType>(\n name: string,\n description: string,\n inputSchema: Schema,\n handler: (input: z.infer<Schema>) => Promise<unknown>,\n): ToolDefinition {\n return {\n name,\n description,\n inputSchema,\n inputSchemaJson: z.toJSONSchema(inputSchema) as Record<string, unknown>,\n handler: (input: unknown) => handler(inputSchema.parse(input)),\n }\n}\n\n/**\n * Snapshot artifacts are immutable, content-addressed evidence, separate from authoritative KB\n * state. They are written without the store lock and without moving the mutation epoch: equal\n * names always carry equal bytes, so concurrent writers converge and a search never blocks a\n * writer or restarts a reader. Stored bytes are compared before reuse; this process skips the\n * comparison only while the file keeps the identity it had when last compared.\n */\nconst verifiedArtifacts = new Map<string, string>()\nconst persisting = new Map<string, Promise<void>>()\nconst MAX_VERIFIED_ARTIFACTS = 1024\n\nasync function persistVisibility(\n root: string,\n snapshot: ReturnType<typeof createKnowledgeVisibilitySnapshot>,\n bytes: Uint8Array,\n) {\n const path = `.agent-knowledge/retrieval-visibility/${snapshot.snapshotDigest.replace('sha256:', '')}.json`\n const absolute = join(root, path)\n const identity = await fileIdentity(absolute)\n if (identity === undefined || verifiedArtifacts.get(absolute) !== identity) {\n let pending = persisting.get(absolute)\n if (!pending) {\n pending = ensureArtifact(root, path, absolute, bytes).finally(() =>\n persisting.delete(absolute),\n )\n persisting.set(absolute, pending)\n }\n await pending\n }\n return knowledgeVisibilityArtifactRef({ uri: pathToFileURL(absolute).href, bytes })\n}\n\nasync function ensureArtifact(root: string, path: string, absolute: string, bytes: Uint8Array) {\n const identity = await fileIdentity(absolute)\n if (identity !== undefined && verifiedArtifacts.get(absolute) === identity) return\n try {\n const existing = await readRegularFileWithinRoot(root, path)\n if (!existing.bytes.equals(bytes)) {\n throw new Error('stored knowledge visibility artifact does not match its content identity')\n }\n } catch (error) {\n if (!isMissingFile(error)) throw error\n await writeFileDurableWithinRoot(root, path, Buffer.from(bytes))\n }\n const verified = await fileIdentity(absolute)\n if (verified === undefined) return\n verifiedArtifacts.delete(absolute)\n verifiedArtifacts.set(absolute, verified)\n if (verifiedArtifacts.size > MAX_VERIFIED_ARTIFACTS) {\n verifiedArtifacts.delete(verifiedArtifacts.keys().next().value!)\n }\n}\n\nasync function fileIdentity(path: string): Promise<string | undefined> {\n try {\n const stat = await lstat(path, { bigint: true })\n if (!stat.isFile()) return undefined\n return [stat.dev, stat.ino, stat.size, stat.mtimeNs, stat.ctimeNs].join(':')\n } catch (error) {\n if (isMissingFile(error)) return undefined\n throw error\n }\n}\n","/**\n * Run-scope to shared-scope promotion.\n *\n * A run writes only its own store. Knowledge reaches the curated shared store\n * through this call and no other, and every promotion leaves a record naming\n * the source run, the promoted bytes, the support carried with them, the actor,\n * and the reason.\n *\n * A claim's cited support travels with it. Promoting a claim while leaving the\n * run-local pages it cites behind is what turns a resolved citation into a\n * dangling one, so the closure of cited pages is carried and the promotion is\n * refused when any citation would not resolve in the target.\n */\nimport { canonicalCandidateDigest, type Sha256Digest } from '@tangle-network/agent-interface'\nimport {\n assertKnowledgeCitationsResolved,\n parseKnowledgeCitationReference,\n resolveKnowledgeCitation,\n} from './citation-resolution'\nimport { isMissingFile, readRegularFileWithinRoot, writeJsonDurableWithinRoot } from './durable-fs'\nimport { commitKnowledgeFileMutations } from './file-transaction'\nimport { knowledgePageDigest } from './knowledge-use-receipts'\nimport { withKnowledgeMutation } from './mutation-lock'\nimport { type KnowledgePagesOptions, normalizePagesDirectory } from './pages-directory'\nimport {\n type OriginatedPage,\n originatedPages,\n type PageOrigin,\n type RunScopedStores,\n} from './run-scoped'\nimport { initKnowledgeBase, knowledgePageFromMarkdown, loadKnowledgePages } from './store'\nimport type { KnowledgeId, KnowledgePage } from './types'\n\nexport const KNOWLEDGE_PROMOTION_SCHEMA_VERSION = '1.0.0' as const\nexport const KNOWLEDGE_PROMOTION_DIGEST_ALGORITHM = 'rfc8785-sha256' as const\n\n/** Root-relative directory holding one JSON record per promotion. */\nexport const KNOWLEDGE_PROMOTIONS_DIRECTORY = '.agent-knowledge/promotions'\n\nexport type KnowledgePromotionErrorCode =\n | 'unknown-page'\n | 'ambiguous-support'\n | 'id-conflict'\n | 'path-conflict'\n\n/** A promotion that cannot be performed exactly as asked. */\nexport class KnowledgePromotionError extends Error {\n readonly code: KnowledgePromotionErrorCode\n\n constructor(code: KnowledgePromotionErrorCode, message: string) {\n super(message)\n this.name = 'KnowledgePromotionError'\n this.code = code\n }\n}\n\nexport interface KnowledgePromotionEntry {\n readonly pageId: KnowledgeId\n readonly path: string\n /** Where the page was read from in the source run's chain. */\n readonly sourceOrigin: PageOrigin\n readonly pageDigest: Sha256Digest\n /** False when the page travelled only because a promoted page cites it. */\n readonly requested: boolean\n}\n\n/** Immutable record of one promotion into a shared store. */\nexport interface KnowledgePromotionRecord {\n readonly schemaVersion: typeof KNOWLEDGE_PROMOTION_SCHEMA_VERSION\n readonly kind: 'knowledge-promotion'\n readonly digestAlgorithm: typeof KNOWLEDGE_PROMOTION_DIGEST_ALGORITHM\n readonly recordDigest: Sha256Digest\n readonly createdAt: string\n readonly runId: string\n readonly actor: string\n readonly reason: string\n /** Promoted pages first, then carried support, each group in path order. */\n readonly entries: readonly KnowledgePromotionEntry[]\n}\n\nexport interface PromoteRunScopedPagesOptions extends KnowledgePagesOptions {\n /** Stable ids of the pages this run authored and wants in shared scope. */\n readonly pageIds: readonly KnowledgeId[]\n /** The curated store every run reads and no run writes directly. */\n readonly sharedRoot: string\n /** Who decided to promote. */\n readonly actor: string\n /** Why this knowledge belongs in shared scope. */\n readonly reason: string\n readonly now?: () => Date\n}\n\n/**\n * Promote pages a run authored into the shared store, with their cited support.\n *\n * Support keeps its own evidence fields exactly as written, so a promoted claim\n * cannot inherit a confidence its support does not carry. Pages travel as the\n * bytes their store holds.\n *\n * Re-running the same promotion is safe: unchanged pages produce no file\n * mutation and the record is content-addressed, so it lands at the same path\n * with the same bytes.\n */\nexport async function promoteRunScopedPages(\n stores: RunScopedStores,\n runId: string,\n options: PromoteRunScopedPagesOptions,\n): Promise<KnowledgePromotionRecord> {\n const pagesDirectory = normalizePagesDirectory(options.pagesDirectory)\n const sharedRoot = nonEmpty(options.sharedRoot, 'promotion sharedRoot')\n const actor = nonEmpty(options.actor, 'promotion actor')\n const reason = nonEmpty(options.reason, 'promotion reason')\n if (!Array.isArray(options.pageIds) || options.pageIds.length === 0) {\n throw new TypeError('promotion pageIds must name at least one page')\n }\n\n const chain = await stores.loadChain(runId)\n const travellers = collectTravellers(chain, options.pageIds)\n const mutations = await Promise.all(\n travellers.map(async (traveller) => ({\n path: traveller.entry.page.path,\n content: await readPageBytes(stores, runId, traveller.entry, pagesDirectory),\n })),\n )\n\n await initKnowledgeBase(sharedRoot)\n return withKnowledgeMutation(sharedRoot, async (lock) => {\n const existing = await loadKnowledgePages(sharedRoot, { pagesDirectory })\n assertNoIdentityConflict(travellers, existing)\n\n const promotedPaths = new Set(travellers.map((traveller) => traveller.entry.page.path))\n const promotedView = originatedPages(\n [\n ...existing.filter((page) => !promotedPaths.has(page.path)),\n ...travellers.map((traveller) => traveller.entry.page),\n ],\n 'shared',\n )\n assertKnowledgeCitationsResolved(\n promotedView,\n travellers.flatMap((traveller) =>\n (traveller.entry.page.cites ?? []).map((persisted: string) =>\n parseKnowledgeCitationReference(persisted),\n ),\n ),\n )\n\n await commitKnowledgeFileMutations({\n root: sharedRoot,\n transactionRoot: lock.transactionRoot,\n purpose: `knowledge-promotion:${runId}`,\n mutations,\n pagesDirectory,\n assertOwned: lock.assertOwned,\n })\n\n const record = buildRecord({\n runId,\n actor,\n reason,\n travellers,\n createdAt: (options.now ?? (() => new Date()))().toISOString(),\n })\n await writeJsonDurableWithinRoot(\n sharedRoot,\n `${KNOWLEDGE_PROMOTIONS_DIRECTORY}/${record.recordDigest}.json`,\n record,\n )\n return record\n })\n}\n\n/** Read one promotion record written by `promoteRunScopedPages`. */\nexport async function loadKnowledgePromotionRecord(\n sharedRoot: string,\n recordDigest: Sha256Digest,\n): Promise<KnowledgePromotionRecord | null> {\n try {\n const snapshot = await readRegularFileWithinRoot(\n sharedRoot,\n `${KNOWLEDGE_PROMOTIONS_DIRECTORY}/${recordDigest}.json`,\n )\n return JSON.parse(snapshot.bytes.toString('utf8')) as KnowledgePromotionRecord\n } catch (error) {\n if (isMissingFile(error)) return null\n throw error\n }\n}\n\ninterface Traveller {\n readonly entry: OriginatedPage\n requested: boolean\n}\n\n/**\n * The requested pages plus the closure of the run-local pages they cite.\n *\n * A citation into the shared store needs no carrying, and an unresolved\n * citation is left to the target-side check, which reports every one of them\n * together rather than failing on the first.\n */\nfunction collectTravellers(\n chain: readonly OriginatedPage[],\n pageIds: readonly KnowledgeId[],\n): Traveller[] {\n const byId = new Map<KnowledgeId, Traveller>()\n const queue: Array<{ entry: OriginatedPage; requested: boolean }> = []\n\n for (const pageId of pageIds) {\n const authored = chain.filter((entry) => entry.origin === 'here' && entry.page.id === pageId)\n if (authored.length === 0) {\n throw new KnowledgePromotionError(\n 'unknown-page',\n `promotion page \"${pageId}\" was not authored by this run`,\n )\n }\n if (authored.length > 1) {\n throw new KnowledgePromotionError(\n 'ambiguous-support',\n `promotion page \"${pageId}\" names ${authored.length} pages in this run`,\n )\n }\n queue.push({ entry: authored[0]!, requested: true })\n }\n\n while (queue.length > 0) {\n const next = queue.shift()!\n const seen = byId.get(next.entry.page.id)\n if (seen) {\n if (next.requested) seen.requested = true\n if (seen.entry.page.path !== next.entry.page.path) {\n throw new KnowledgePromotionError(\n 'ambiguous-support',\n `promotion support \"${next.entry.page.id}\" names more than one visible page`,\n )\n }\n continue\n }\n byId.set(next.entry.page.id, { entry: next.entry, requested: next.requested })\n for (const persisted of next.entry.page.cites ?? []) {\n const resolution = resolveKnowledgeCitation(chain, parseKnowledgeCitationReference(persisted))\n const target = resolution.resolved\n if (target === undefined || target.origin === 'shared') continue\n queue.push({ entry: { page: target.page, origin: target.origin }, requested: false })\n }\n }\n\n return [...byId.values()].sort(\n (left, right) =>\n Number(right.requested) - Number(left.requested) ||\n left.entry.page.path.localeCompare(right.entry.page.path),\n )\n}\n\nfunction assertNoIdentityConflict(\n travellers: readonly Traveller[],\n existing: readonly KnowledgePage[],\n): void {\n for (const traveller of travellers) {\n const page = traveller.entry.page\n const idClash = existing.find((other) => other.id === page.id && other.path !== page.path)\n if (idClash) {\n throw new KnowledgePromotionError(\n 'id-conflict',\n `shared page \"${idClash.path}\" already holds id \"${page.id}\"; promoting \"${page.path}\" would create two`,\n )\n }\n const pathClash = existing.find((other) => other.path === page.path && other.id !== page.id)\n if (pathClash) {\n throw new KnowledgePromotionError(\n 'path-conflict',\n `shared page \"${page.path}\" holds id \"${pathClash.id}\", not \"${page.id}\"`,\n )\n }\n }\n}\n\n/**\n * The page as its own store holds it. A promoted page must be the same bytes\n * in both scopes, so the record's digest describes what a reader will load.\n */\nasync function readPageBytes(\n stores: RunScopedStores,\n runId: string,\n entry: OriginatedPage,\n pagesDirectory: string,\n): Promise<string> {\n const sourceRunId = sourceRunOf(entry.origin, runId)\n const snapshot = await readRegularFileWithinRoot(stores.storePath(sourceRunId), entry.page.path)\n const content = snapshot.bytes.toString('utf8')\n const page = knowledgePageFromMarkdown(entry.page.path, content, pagesDirectory)\n if (knowledgePageDigest(page) !== knowledgePageDigest(entry.page)) {\n throw new KnowledgePromotionError(\n 'path-conflict',\n `source page \"${entry.page.path}\" in run \"${sourceRunId}\" changed after the promotion snapshot`,\n )\n }\n return content\n}\n\nfunction sourceRunOf(origin: PageOrigin, runId: string): string {\n if (origin === 'here') return runId\n if (origin.startsWith('inherited:')) return origin.slice('inherited:'.length)\n throw new Error(`promotion cannot read the bytes of a ${origin} page`)\n}\n\nfunction buildRecord(input: {\n runId: string\n actor: string\n reason: string\n travellers: readonly Traveller[]\n createdAt: string\n}): KnowledgePromotionRecord {\n const entries: KnowledgePromotionEntry[] = input.travellers.map((traveller) =>\n Object.freeze({\n pageId: traveller.entry.page.id,\n path: traveller.entry.page.path,\n sourceOrigin: traveller.entry.origin,\n pageDigest: knowledgePageDigest(traveller.entry.page),\n requested: traveller.requested,\n }),\n )\n const material = {\n schemaVersion: KNOWLEDGE_PROMOTION_SCHEMA_VERSION,\n kind: 'knowledge-promotion' as const,\n digestAlgorithm: KNOWLEDGE_PROMOTION_DIGEST_ALGORITHM,\n createdAt: input.createdAt,\n runId: input.runId,\n actor: input.actor,\n reason: input.reason,\n entries,\n }\n return Object.freeze({ ...material, recordDigest: canonicalCandidateDigest(material) })\n}\n\nfunction nonEmpty(value: string, label: string): string {\n if (typeof value !== 'string' || value.trim().length === 0) {\n throw new TypeError(`${label} must be a non-empty string`)\n }\n return value.trim()\n}\n","/**\n * Bridge from `AnalystFinding` (agent-eval) to knowledge proposals.\n *\n * Closes the failure → wiki side of the recursive-self-improvement\n * loop: a knowledge-gap or knowledge-poisoning finding produced by an\n * analyst becomes a concrete proposal an operator (or auto-merge bot)\n * can review and apply. The bridge is intentionally lossless on the\n * fail-loud side — a finding the parser can't classify returns a\n * `KnowledgeProposalParseError` rather than a silent skip, so the\n * loop never accepts an underspecified edit.\n *\n * Subject grammar this bridge understands (analyst-side convention,\n * stamped in the kind prompts):\n *\n * agent-knowledge:wiki:<page-slug> create / update page\n * agent-knowledge:wiki:<page-slug>#<heading> insert section under page\n * agent-knowledge:claim:<topic> draft claim row\n * agent-knowledge:raw:<source-id> lift raw → curated\n * agent-knowledge:stale:<page-slug> mark page superseded\n *\n * Anything else (websearch:outdated:*, tool-doc:*, system-prompt:*,\n * memory:*) is NOT a knowledge-base concern and returns `null` so the\n * loop's improvement-applier handles it.\n */\n\nimport type { AnalystFinding, AnalystSeverity } from '@tangle-network/agent-eval'\nimport type { ClaimRef, KnowledgeClaim, KnowledgeWriteBlock } from './types'\n\nexport interface KnowledgeProposal {\n /**\n * Stable id derived from the finding so cross-run diffs share an\n * identity. Re-proposing the same finding produces the same id.\n */\n id: string\n /** The finding that generated this proposal — useful for audit + revert. */\n sourceFindingId: string\n /** What the proposal does. */\n kind:\n | 'create-page'\n | 'update-page'\n | 'append-section'\n | 'create-claim'\n | 'lift-raw'\n | 'mark-stale'\n /** Locus on disk (page slug or claim topic). */\n locus: string\n /**\n * Page write blocks the standard `applyKnowledgeWriteBlocks` consumer\n * accepts. Empty for proposals that don't change page text (e.g.\n * `create-claim` produces a `claim` field instead).\n */\n writeBlocks: KnowledgeWriteBlock[]\n /**\n * Granular claim draft for proposals whose unit-of-change is a claim\n * row rather than a whole page. `status: 'draft'` until reviewed.\n */\n claim?: KnowledgeClaim\n /** Per-proposal metadata: severity, confidence, source span. */\n metadata: {\n severity: AnalystSeverity\n confidence: number\n evidence_uri?: string\n analyst_id: string\n }\n}\n\nexport class KnowledgeProposalParseError extends Error {\n constructor(\n public readonly findingId: string,\n public readonly subject: string,\n message: string,\n ) {\n super(`proposeFromFinding(${findingId}, subject=${subject}): ${message}`)\n this.name = 'KnowledgeProposalParseError'\n }\n}\n\n/**\n * Convert one `AnalystFinding` into a knowledge proposal. Returns\n * `null` when the finding's locus isn't a knowledge-base concern\n * (`websearch:outdated:*`, `tool-doc:*`, `system-prompt:*`,\n * `memory:*`, missing subject). Throws when the locus IS a\n * knowledge-base concern but is malformed — that's a bug in the\n * analyst prompt and should fail loud.\n *\n * Caller convention: feed the function the analyst's full findings\n * list and filter out the `null`s; the orchestrator passes the\n * remaining proposals to the existing review / apply pipeline.\n */\nexport function proposeFromFinding(finding: AnalystFinding): KnowledgeProposal | null {\n if (!finding.subject) return null\n if (!finding.subject.startsWith('agent-knowledge:')) return null\n\n const rest = finding.subject.slice('agent-knowledge:'.length)\n const [kindPart, ...locusParts] = rest.split(':')\n const locus = locusParts.join(':')\n if (!kindPart || !locus) {\n throw new KnowledgeProposalParseError(\n finding.finding_id,\n finding.subject,\n 'expected `agent-knowledge:<kind>:<locus>` shape',\n )\n }\n\n const baseMeta: KnowledgeProposal['metadata'] = {\n severity: finding.severity,\n confidence: finding.confidence,\n evidence_uri: finding.evidence_refs[0]?.uri,\n analyst_id: finding.analyst_id,\n }\n\n switch (kindPart) {\n case 'wiki':\n return wikiProposal(finding, locus, baseMeta)\n case 'claim':\n return claimProposal(finding, locus, baseMeta)\n case 'raw':\n return liftRawProposal(finding, locus, baseMeta)\n case 'stale':\n return markStaleProposal(finding, locus, baseMeta)\n default:\n throw new KnowledgeProposalParseError(\n finding.finding_id,\n finding.subject,\n `unknown kind \"${kindPart}\" (expected one of: wiki | claim | raw | stale)`,\n )\n }\n}\n\nfunction wikiProposal(\n finding: AnalystFinding,\n locus: string,\n metadata: KnowledgeProposal['metadata'],\n): KnowledgeProposal {\n const hashIdx = locus.indexOf('#')\n const pageSlug = hashIdx >= 0 ? locus.slice(0, hashIdx) : locus\n const heading = hashIdx >= 0 ? locus.slice(hashIdx + 1) : null\n const path = `knowledge/${ensureSlug(pageSlug)}.md`\n\n const body = renderWikiBody(finding, pageSlug, heading)\n return {\n id: `prop-${finding.finding_id}`,\n sourceFindingId: finding.finding_id,\n kind: heading ? 'append-section' : 'create-page',\n locus: pageSlug,\n writeBlocks: [{ path, content: body }],\n metadata,\n }\n}\n\nfunction claimProposal(\n finding: AnalystFinding,\n locus: string,\n metadata: KnowledgeProposal['metadata'],\n): KnowledgeProposal {\n const refs: ClaimRef[] = finding.evidence_refs\n .filter((r) => r.uri)\n .map((r) => ({\n sourceId: `analyst-finding:${finding.finding_id}`,\n anchorId: r.uri,\n quote: r.excerpt,\n }))\n const claim: KnowledgeClaim = {\n id: `claim-${finding.finding_id}`,\n text: finding.recommended_action ?? finding.claim,\n refs,\n confidence: finding.confidence,\n status: 'draft',\n metadata: {\n analyst_id: finding.analyst_id,\n source_finding_id: finding.finding_id,\n topic: locus,\n },\n }\n return {\n id: `prop-${finding.finding_id}`,\n sourceFindingId: finding.finding_id,\n kind: 'create-claim',\n locus,\n writeBlocks: [],\n claim,\n metadata,\n }\n}\n\nfunction liftRawProposal(\n finding: AnalystFinding,\n sourceId: string,\n metadata: KnowledgeProposal['metadata'],\n): KnowledgeProposal {\n const path = `knowledge/${ensureSlug(sourceId)}.md`\n const body = [\n '---',\n `title: ${sourceId}`,\n `source: ${sourceId}`,\n `status: draft`,\n `lifted_from_finding: ${finding.finding_id}`,\n '---',\n '',\n '## Why this page exists',\n '',\n finding.claim,\n '',\n ...(finding.rationale ? ['## Rationale', '', finding.rationale, ''] : []),\n ...(finding.recommended_action\n ? ['## Recommended action', '', finding.recommended_action, '']\n : []),\n ].join('\\n')\n return {\n id: `prop-${finding.finding_id}`,\n sourceFindingId: finding.finding_id,\n kind: 'lift-raw',\n locus: sourceId,\n writeBlocks: [{ path, content: body }],\n metadata,\n }\n}\n\nfunction markStaleProposal(\n finding: AnalystFinding,\n pageSlug: string,\n metadata: KnowledgeProposal['metadata'],\n): KnowledgeProposal {\n const path = `knowledge/${ensureSlug(pageSlug)}.stale.md`\n const body = [\n '---',\n `title: ${pageSlug} (marked stale)`,\n `status: superseded`,\n `superseded_by_finding: ${finding.finding_id}`,\n `confidence: ${finding.confidence}`,\n '---',\n '',\n '## Why marked stale',\n '',\n finding.claim,\n '',\n ...(finding.rationale ? ['## Evidence', '', finding.rationale, ''] : []),\n ...(finding.recommended_action ? ['## Action', '', finding.recommended_action, ''] : []),\n ].join('\\n')\n return {\n id: `prop-${finding.finding_id}`,\n sourceFindingId: finding.finding_id,\n kind: 'mark-stale',\n locus: pageSlug,\n writeBlocks: [{ path, content: body }],\n metadata,\n }\n}\n\n/**\n * Plural convenience: filter + map across an entire findings batch\n * with one call. Parse errors collect into `errors[]`; the loop\n * decides per-error whether to abort or continue.\n */\nexport interface ProposeFromFindingsResult {\n proposals: KnowledgeProposal[]\n skipped: number\n errors: KnowledgeProposalParseError[]\n}\n\nexport function proposeFromFindings(\n findings: ReadonlyArray<AnalystFinding>,\n): ProposeFromFindingsResult {\n const proposals: KnowledgeProposal[] = []\n const errors: KnowledgeProposalParseError[] = []\n let skipped = 0\n for (const f of findings) {\n try {\n const p = proposeFromFinding(f)\n if (p) proposals.push(p)\n else skipped += 1\n } catch (err) {\n if (err instanceof KnowledgeProposalParseError) errors.push(err)\n else throw err\n }\n }\n return { proposals, skipped, errors }\n}\n\nfunction ensureSlug(s: string): string {\n return (\n s\n .toLowerCase()\n .replace(/[^a-z0-9-]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 200) || 'untitled'\n )\n}\n\nfunction renderWikiBody(finding: AnalystFinding, slug: string, heading: string | null): string {\n const title = humanize(slug)\n if (heading) {\n return [\n `## ${heading}`,\n '',\n finding.claim,\n '',\n ...(finding.rationale ? ['### Rationale', '', finding.rationale, ''] : []),\n ...(finding.recommended_action ? ['### Action', '', finding.recommended_action, ''] : []),\n `_Drafted from finding ${finding.finding_id} (confidence ${finding.confidence.toFixed(2)})._`,\n ].join('\\n')\n }\n return [\n '---',\n `title: ${title}`,\n `status: draft`,\n `drafted_from_finding: ${finding.finding_id}`,\n `confidence: ${finding.confidence}`,\n '---',\n '',\n `# ${title}`,\n '',\n finding.claim,\n '',\n ...(finding.rationale ? ['## Rationale', '', finding.rationale, ''] : []),\n ...(finding.recommended_action\n ? ['## Recommended action', '', finding.recommended_action, '']\n : []),\n ].join('\\n')\n}\n\nfunction humanize(slug: string): string {\n return (\n slug\n .split('-')\n .filter(Boolean)\n .map((w) => w[0]?.toUpperCase() + w.slice(1))\n .join(' ') || slug\n )\n}\n","import { canonicalCandidateDigest, type ToolDefinition } from '@tangle-network/agent-interface'\nimport { z } from 'zod'\nimport { sha256 } from './ids'\nimport { SourceRecordSchema } from './schemas'\nimport type { SourceRecord } from './types'\n\n/** The public QMD SDK subset; the host owns installation, indexing, and model selection. */\nexport interface QmdSearchClient {\n searchLex(query: string, options: { collection: string; limit: number }): Promise<unknown>\n searchVector?(query: string, options: { collection: string; limit: number }): Promise<unknown>\n get(path: string, options: { includeBody: true }): Promise<unknown>\n}\n\nexport interface QmdSourceDocument {\n readonly qmdPath: string\n readonly source: SourceRecord\n}\n\nexport interface QmdSearchProviderOptions {\n readonly client: QmdSearchClient\n readonly scopeId: string\n readonly revision: string\n readonly collection: string\n /** Declared by the index owner after a successful update; absent means unknown. */\n readonly indexedAt?: string\n readonly documents: readonly QmdSourceDocument[]\n /** Vector mode is explicit because it invokes the host's embedding model. */\n readonly mode?: 'lexical' | 'vector'\n}\n\nconst indexedDocument = z.object({\n filepath: z.string(),\n collectionName: z.string(),\n body: z.string(),\n})\nconst searchResults = z.array(z.object({ filepath: z.string(), score: z.number().finite() }))\nconst querySchema = z\n .object({\n query: z.string().trim().min(1).max(16_000),\n limit: z.number().int().min(1).max(50).default(5),\n })\n .strict()\nconst readSchema = z\n .object({\n sourceId: z.string().min(1),\n fromLine: z.number().int().min(1).default(1),\n maxLines: z.number().int().min(1).max(200).default(80),\n })\n .strict()\n\n/**\n * A fixed source snapshot, not an authorization decision. The trusted host supplies\n * one authorized corpus; agents cannot select a collection, bank, or arbitrary path.\n * QMD's index is derived: its bytes must agree with the authoritative source hash.\n */\nexport function createQmdSearchProvider(options: QmdSearchProviderOptions) {\n const { client } = options\n const scopeId = z.string().trim().min(1).parse(options.scopeId)\n const revision = z.string().trim().min(1).parse(options.revision)\n const collection = z\n .string()\n .regex(/^[a-zA-Z0-9_-]+$/)\n .parse(options.collection)\n const mode = z.enum(['lexical', 'vector']).parse(options.mode ?? 'lexical')\n const indexedAt =\n options.indexedAt === undefined\n ? null\n : z.iso.datetime({ offset: true }).parse(options.indexedAt)\n if (mode === 'vector' && !client.searchVector) throw new Error('QMD vector search is unavailable')\n const byId = new Map<string, QmdSourceDocument>()\n const byPath = new Map<string, QmdSourceDocument>()\n for (const entry of options.documents) {\n const source = SourceRecordSchema.parse(structuredClone(entry.source))\n if (!/^[a-f0-9]{64}$/.test(source.contentHash)) {\n throw new TypeError('QMD sources require an exact SHA-256 contentHash')\n }\n if (source.text !== undefined && sha256(source.text) !== source.contentHash) {\n throw new Error('QMD source text does not match its contentHash')\n }\n const prefix = `qmd://${collection}/`\n const path = entry.qmdPath.slice(prefix.length)\n if (\n !entry.qmdPath.startsWith(prefix) ||\n !path ||\n path\n .split('/')\n .some(\n (part) =>\n !part ||\n part === '.' ||\n part === '..' ||\n /[\\\\?#%]/.test(part) ||\n [...part].some((char) => char.charCodeAt(0) < 32),\n )\n )\n throw new TypeError('QMD document path must be within the bound collection')\n if (byId.has(source.id) || byPath.has(entry.qmdPath)) {\n throw new Error('QMD snapshot contains duplicate source ids or paths')\n }\n const document = { qmdPath: entry.qmdPath, source }\n byId.set(source.id, document)\n byPath.set(entry.qmdPath, document)\n }\n const snapshotDigest = canonicalCandidateDigest({\n scopeId,\n revision,\n collection,\n documents: [...byPath.values()]\n .map(({ qmdPath, source }) => ({\n qmdPath,\n id: source.id,\n uri: source.uri,\n contentHash: source.contentHash,\n }))\n .sort((a, b) => (a.qmdPath < b.qmdPath ? -1 : a.qmdPath > b.qmdPath ? 1 : 0)),\n })\n const identity = Object.freeze({\n scopeId,\n revision,\n snapshotDigest,\n indexedAt,\n mode,\n documentCount: byId.size,\n })\n const verifiedRead = async (document: QmdSourceDocument): Promise<QmdSourceDocument> => {\n const parsed = indexedDocument.safeParse(\n await client.get(document.qmdPath, { includeBody: true }),\n )\n if (!parsed.success)\n throw new Error('QMD snapshot document is unavailable or malformed; rebuild the scoped index')\n const indexed = parsed.data\n if (indexed.filepath !== document.qmdPath || indexed.collectionName !== collection) {\n throw new Error('QMD returned a document outside the bound snapshot')\n }\n if (sha256(indexed.body) !== document.source.contentHash) {\n throw new Error('QMD index is stale for this source revision; rebuild the scoped index')\n }\n return {\n qmdPath: document.qmdPath,\n source: { ...structuredClone(document.source), text: indexed.body },\n }\n }\n return {\n ...identity,\n /** Call once at admission; ordinary reads still verify their returned bytes. */\n async verifySnapshot() {\n for (const document of byPath.values()) await verifiedRead(document)\n return {\n ...identity,\n verifiedDocumentCount: byPath.size,\n checkedAt: new Date().toISOString(),\n }\n },\n async search(query: string, searchOptions: { limit?: number } = {}) {\n const request = querySchema.parse({ query, ...searchOptions })\n const search = mode === 'vector' ? client.searchVector! : client.searchLex\n const results = searchResults.parse(\n await search.call(client, request.query, { collection, limit: request.limit }),\n )\n const seen = new Set<string>()\n // Validate the complete returned set before reading any content.\n for (const hit of results) {\n if (!byPath.has(hit.filepath))\n throw new Error('QMD returned a search result outside the bound snapshot')\n if (seen.has(hit.filepath)) throw new Error('QMD returned duplicate search results')\n seen.add(hit.filepath)\n }\n const hits = await Promise.all(\n results.slice(0, request.limit).map(async (hit) => ({\n ...(await verifiedRead(byPath.get(hit.filepath)!)),\n score: hit.score,\n })),\n )\n return { ...identity, hits }\n },\n async read(sourceId: string) {\n const document = byId.get(sourceId)\n if (!document) throw new Error('Source is not in the bound QMD snapshot')\n return { ...identity, document: await verifiedRead(document) }\n },\n }\n}\n\nexport type QmdSearchProvider = ReturnType<typeof createQmdSearchProvider>\n\n/** Same source-checked functions used by a human reader and exact-profile tool grants. */\nexport function createQmdKnowledgeTools(options: {\n readonly provider: QmdSearchProvider\n readonly namePrefix?: string\n}): ToolDefinition[] {\n const prefix = options.namePrefix ?? ''\n if (!/^[a-zA-Z0-9_]*$/.test(prefix)) throw new TypeError('Invalid QMD tool name prefix')\n return [\n {\n name: `${prefix}qmd_search`,\n description:\n 'Search this bound source snapshot. Results carry original source ids, URIs and hashes; use qmd_read for full source lines.',\n inputSchema: querySchema,\n inputSchemaJson: z.toJSONSchema(querySchema) as Record<string, unknown>,\n async handler(input: unknown) {\n const request = querySchema.parse(input)\n const result = await options.provider.search(request.query, { limit: request.limit })\n return {\n ...result,\n hits: result.hits.map(({ source, ...hit }) => {\n const { text, ...reference } = source\n return {\n ...hit,\n source: reference,\n excerpt: text?.slice(0, 2_000),\n excerptTruncated: (text?.length ?? 0) > 2_000,\n }\n }),\n }\n },\n },\n {\n name: `${prefix}qmd_read`,\n description:\n 'Read exact source lines by a source id returned from this snapshot. Other play sources are unavailable.',\n inputSchema: readSchema,\n inputSchemaJson: z.toJSONSchema(readSchema) as Record<string, unknown>,\n async handler(input: unknown) {\n const request = readSchema.parse(input)\n const result = await options.provider.read(request.sourceId)\n const { text = '', ...source } = result.document.source\n const lines = text.split('\\n')\n const selected = lines.slice(request.fromLine - 1, request.fromLine - 1 + request.maxLines)\n const rendered = selected\n .map((line, index) => `${request.fromLine + index}: ${line}`)\n .join('\\n')\n return {\n ...result,\n document: {\n ...result.document,\n source,\n text: rendered.slice(0, 32_000),\n fromLine: request.fromLine,\n totalLines: lines.length,\n truncated:\n rendered.length > 32_000 || request.fromLine - 1 + selected.length < lines.length,\n },\n }\n },\n },\n ]\n}\n","import type {\n BuildEvalKnowledgeBundleOptions,\n EvalKnowledgeBundleBuildResult,\n KnowledgeReadinessSpec,\n} from './eval-readiness'\nimport { buildKnowledgeIndex } from './indexer'\nimport type { KnowledgeBaseQualityOptions, KnowledgeBaseQualityReport } from './rag-eval'\nimport { assessKnowledgeIndex } from './readiness-helpers'\nimport type { KnowledgeIndex } from './types'\nimport type { ValidateKnowledgeOptions, ValidateKnowledgeResult } from './validate'\n\nexport interface EvaluateKnowledgeBaseReadinessOptions {\n root: string\n goal: string\n readinessSpecs?: readonly KnowledgeReadinessSpec[]\n readinessTaskId?: string\n readiness?: Omit<BuildEvalKnowledgeBundleOptions, 'taskId' | 'index' | 'specs'>\n strict?: ValidateKnowledgeOptions['strict']\n kbQuality?: KnowledgeBaseQualityOptions\n}\n\nexport interface KnowledgeBaseReadinessEvaluation {\n ready: boolean\n summary: string\n index: KnowledgeIndex\n validation: ValidateKnowledgeResult\n readiness?: EvalKnowledgeBundleBuildResult\n kbQuality: KnowledgeBaseQualityReport\n dimensions: {\n validation: number\n kb_quality: number\n blocking_readiness: number\n }\n}\n\nexport async function evaluateKnowledgeBaseReadiness(\n options: EvaluateKnowledgeBaseReadinessOptions,\n): Promise<KnowledgeBaseReadinessEvaluation> {\n const index = await buildKnowledgeIndex(options.root)\n const { validation, readiness, kbQuality } = assessKnowledgeIndex(options, index)\n const blockingMissing = readiness?.report.blockingMissingRequirements.length ?? 0\n const blockingTotal =\n options.readinessSpecs?.filter((spec) => spec.importance === 'blocking').length ?? 0\n const blockingReadiness =\n blockingTotal === 0 ? 1 : Math.max(0, blockingTotal - blockingMissing) / blockingTotal\n const ready = validation.ok && kbQuality.ok && blockingMissing === 0\n const failures = [\n validation.ok ? undefined : `${validation.findings.length} validation finding(s)`,\n kbQuality.ok ? undefined : `${kbQuality.findings.length} KB quality finding(s)`,\n blockingMissing === 0\n ? undefined\n : `${blockingMissing}/${blockingTotal} blocking readiness requirement(s) missing`,\n ].filter((failure): failure is string => Boolean(failure))\n\n return {\n ready,\n summary: ready ? 'knowledge base passed readiness checks' : failures.join('; '),\n index,\n validation,\n readiness,\n kbQuality,\n dimensions: {\n validation: validation.ok ? 1 : 0,\n kb_quality: kbQuality.ok ? 1 : 0,\n blocking_readiness: blockingReadiness,\n },\n }\n}\n","import {\n type DatasetScenario,\n evaluateReleaseConfidence,\n type HeldOutGateDecision,\n type ReleaseConfidenceScorecard,\n type ReleaseTraceEvidence,\n type RunRecord,\n validateRunRecord,\n} from '@tangle-network/agent-eval'\nimport { stableId } from './ids'\nimport type { KnowledgeRelease } from './types'\n\nexport interface KnowledgeReleaseReport {\n release: KnowledgeRelease\n scorecard: ReleaseConfidenceScorecard\n candidateRuns: RunRecord[]\n baselineRuns: RunRecord[]\n}\n\n/**\n * Build a knowledge release report from candidate and baseline run records,\n * optional trace evidence, and an optional decision record.\n */\nexport interface KnowledgeReleaseInput {\n candidateId: string\n baselineId?: string\n candidateRuns: RunRecord[]\n baselineRuns?: RunRecord[]\n traces?: ReleaseTraceEvidence[]\n gateDecision?: HeldOutGateDecision | null\n /** Scenario corpus used to prove train and holdout split coverage. */\n scenarios?: readonly DatasetScenario[]\n /**\n * Require both a holdout scenario and a holdout run.\n * Provide `scenarios` with at least one `split: 'holdout'` item when true.\n */\n hasHoldout?: boolean\n /** Candidate is the search-best variant — a promotion precondition. Default true. */\n promotedIsBest?: boolean\n createdAt?: string\n minScore?: number\n}\n\nexport function knowledgeReleaseReport(input: KnowledgeReleaseInput): KnowledgeReleaseReport {\n const baselineRuns = input.baselineRuns ?? []\n const runRecords = [...input.candidateRuns, ...baselineRuns].map(validateRunRecord)\n const scorecard = evaluateReleaseConfidence({\n target: 'agent-knowledge-base',\n candidateId: input.candidateId,\n baselineId: input.baselineId ?? 'baseline',\n traces: input.traces ?? [],\n runs: runRecords,\n scenarios: input.scenarios,\n gateDecision: input.gateDecision ?? null,\n thresholds: {\n requireCorpus: false,\n // This report has run records but no scenario corpus, so it cannot require\n // a positive scenario count.\n minScenarioCount: 0,\n requireHoldout: input.hasHoldout ?? false,\n minHoldoutRuns: input.hasHoldout ? 1 : 0,\n minSearchRuns: 1,\n minMeanScore: input.minScore ?? 0.7,\n },\n })\n const release: KnowledgeRelease = {\n id: stableId('krel', `${input.candidateId}:${input.createdAt ?? new Date().toISOString()}`),\n candidateId: input.candidateId,\n createdAt: input.createdAt ?? new Date().toISOString(),\n promoted: scorecard.status !== 'fail' && (input.promotedIsBest ?? true),\n scorecard,\n runRecordIds: runRecords.map((record) => record.runId),\n }\n return { release, scorecard, candidateRuns: input.candidateRuns, baselineRuns }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["exceedsCostCeiling","stopwords","contentWords","hitFromSearchResult","nonEmpty"],"sources":["../src/knowledge-state-scope.ts","../src/kb-improvement/contracts.ts","../src/kb-improvement/state.ts","../src/kb-improvement/activation.ts","../src/immutable-ref.ts","../src/rag-answer-evidence.ts","../src/optimization.ts","../src/rag-eval/knowledge-base.ts","../src/claim-grounding.ts","../src/statistics.ts","../src/rag-eval/answer.ts","../src/rag-eval/providers.ts","../src/rag-eval/scoring.ts","../src/rag-optimization.ts","../src/events.ts","../src/eval-readiness.ts","../src/readiness-helpers.ts","../src/research-loop.ts","../src/retrieval-eval.ts","../src/retrieval-optimization.ts","../src/rag-improvement-phases.ts","../src/rag-improvement-loop.ts","../src/kb-improvement/workspace.ts","../src/kb-improvement/transition.ts","../src/kb-improvement/evaluation.ts","../src/kb-improvement/run.ts","../src/agent-candidate.ts","../src/chunking.ts","../src/discovery.ts","../src/filesystem-search-provider.ts","../src/hub-vector-search-provider.ts","../src/knowledge-brief.ts","../src/knowledge-use-receipts.ts","../src/knowledge-tools.ts","../src/promotion.ts","../src/propose-from-finding.ts","../src/qmd-search-provider.ts","../src/readiness-check.ts","../src/release.ts"],"sourcesContent":["import { z } from 'zod'\nimport { normalizePagesDirectory } from './pages-directory'\n\n/** Authoritative local state included in a KB improvement candidate. */\nexport interface KnowledgeStateScope {\n /** Root-relative Markdown pages directory. Defaults to `knowledge`. */\n pagesDirectory?: string\n /** Include claim ledgers and research events. Excludes indexes, locks, and receipt artifacts. */\n researchState?: boolean\n}\n\nexport const knowledgeStateScopeSchema = z\n .object({\n pagesDirectory: z\n .string()\n .transform((value) => normalizePagesDirectory(value))\n .optional(),\n researchState: z.boolean().optional(),\n })\n .strict()\n\nexport function normalizeKnowledgeStateScope(scope: KnowledgeStateScope = {}) {\n const parsed = knowledgeStateScopeSchema.parse(scope)\n return {\n pagesDirectory: normalizePagesDirectory(parsed.pagesDirectory),\n researchState: parsed.researchState ?? false,\n }\n}\n\nexport const KNOWLEDGE_RESEARCH_STATE_PATHS = [\n '.agent-knowledge/claim-ledgers',\n '.agent-knowledge/events.json',\n '.agent-knowledge/event-log',\n] as const\n","import { contentHash, type RunRecord, validateRunRecord } from '@tangle-network/agent-eval'\nimport {\n type AgentImprovementActivation,\n type AgentImprovementActivationResult,\n agentImprovementActivationResultSchema,\n} from '@tangle-network/agent-interface'\nimport { z } from 'zod'\nimport type {\n BuildEvalKnowledgeBundleOptions,\n EvalKnowledgeBundleBuildResult,\n KnowledgeReadinessSpec,\n} from '../eval-readiness'\nimport { type KnowledgeStateScope, knowledgeStateScopeSchema } from '../knowledge-state-scope'\nimport { DEFAULT_PAGES_DIRECTORY } from '../pages-directory'\nimport type {\n KnowledgeBaseQualityOptions,\n KnowledgeBaseQualityReport,\n RagAnswerEvalArtifact,\n} from '../rag-eval'\nimport type {\n RagKnowledgeImprovementPhase,\n RagKnowledgeResearchOptions,\n RagKnowledgeUpdateInput,\n RagKnowledgeUpdateResult,\n RunRagKnowledgeImprovementLoopOptions,\n RunRagKnowledgeImprovementLoopResult,\n} from '../rag-improvement-loop'\nimport type { RunRagOptimizationOptions } from '../rag-optimization'\nimport type { RunKnowledgeResearchLoopOptions } from '../research-loop'\nimport type { RunRetrievalImprovementLoopOptions } from '../retrieval-optimization'\nimport type { KnowledgeIndex } from '../types'\nimport type { ValidateKnowledgeOptions, ValidateKnowledgeResult } from '../validate'\n\nexport type KnowledgeImprovementStatus =\n | 'running'\n | 'candidate-ready'\n | 'promoted'\n | 'rejected'\n | 'blocked'\n\ninterface KnowledgeImprovementMetricProvenanceBase {\n evaluator: string\n version: string\n}\n\nexport type KnowledgeImprovementMetricProvenance =\n | (KnowledgeImprovementMetricProvenanceBase & {\n method: 'deterministic'\n })\n | (KnowledgeImprovementMetricProvenanceBase & {\n method: 'sampled' | 'composite'\n corpusHash: string\n runRecords: RunRecord[]\n })\n | (KnowledgeImprovementMetricProvenanceBase & {\n method: 'model'\n model: string\n corpusHash: string\n runRecords: RunRecord[]\n })\n\nexport interface KnowledgeImprovementMetric {\n score: number\n passed: boolean\n dimensions?: Record<string, number>\n notes?: string\n provenance: KnowledgeImprovementMetricProvenance\n}\n\nexport interface KnowledgeImprovementEvaluationInput {\n runId: string\n iteration: number\n root: string\n baselineRoot: string\n candidateRoot: string\n baselineIndex: KnowledgeIndex\n candidateIndex: KnowledgeIndex\n baseHash: string\n candidateHash: string\n validation: ValidateKnowledgeResult\n readiness?: EvalKnowledgeBundleBuildResult\n kbQuality: KnowledgeBaseQualityReport\n lifecycle?: RunRagKnowledgeImprovementLoopResult\n signal?: AbortSignal\n}\n\nexport type KnowledgeImprovementEvaluator = (\n input: KnowledgeImprovementEvaluationInput,\n) => Promise<KnowledgeImprovementMetric> | KnowledgeImprovementMetric\n\nexport interface KnowledgeImprovementCandidateRecord {\n iteration: number\n candidateId: string\n baseHash: string\n candidateHash?: string\n evidenceHash?: string\n promotionPlanHash?: string\n /** Durable one-way boundary preventing final-case reuse after interruption. */\n finalEvaluationStartedAt?: string\n status: KnowledgeImprovementStatus\n createdAt: string\n updatedAt: string\n}\n\nexport interface KnowledgeImprovementRunState {\n stateScope?: KnowledgeStateScope\n runId: string\n root: string\n goal: string\n implementationRef: string\n status: KnowledgeImprovementStatus\n baseHash: string\n createdAt: string\n updatedAt: string\n ownerId?: string\n candidates: KnowledgeImprovementCandidateRecord[]\n promotedCandidateId?: string\n blockedReason?: string\n}\n\nexport interface KnowledgeImprovementResult {\n runId: string\n state: KnowledgeImprovementRunState\n candidate?: KnowledgeImprovementCandidateRecord\n evaluation?: KnowledgeImprovementMetric\n lifecycle?: RunRagKnowledgeImprovementLoopResult\n promoted: boolean\n blocked: boolean\n}\n\nexport type KnowledgeImprovementTarget = 'candidate' | 'baseline'\n\nexport interface KnowledgeImprovementMutationReceipt {\n target: KnowledgeImprovementTarget\n beforeHash: string\n afterHash: string\n changed: boolean\n transactionId: string | null\n recovered: boolean\n}\n\nexport interface KnowledgeImprovementMutationResult extends KnowledgeImprovementResult {\n candidate: KnowledgeImprovementCandidateRecord\n mutation: KnowledgeImprovementMutationReceipt\n activationResult?: AgentImprovementActivationResult\n}\n\nexport interface KnowledgeImprovementActivationPersistence {\n activation: AgentImprovementActivation\n attemptedAt: string\n identity: string\n /** May run again after interruption; keep this deterministic and free of external side effects. */\n createResult(\n mutation: KnowledgeImprovementMutationReceipt,\n ): Promise<AgentImprovementActivationResult> | AgentImprovementActivationResult\n}\n\nexport const digestSchema = z.string().regex(/^[a-f0-9]{64}$/)\nexport const immutableRefSchema = z.string().regex(/^(?:sha256:[a-f0-9]{64}|git:[a-f0-9]{40})$/)\n\nexport const runIdSchema = z.string().min(1).max(2_048)\n\nexport const safePathSegmentSchema = z\n .string()\n .min(1)\n .max(128)\n .regex(/^[A-Za-z0-9][A-Za-z0-9._-]*$/)\n\nexport const knowledgeImprovementMutationReceiptSchema = z\n .object({\n target: z.enum(['candidate', 'baseline']),\n beforeHash: digestSchema,\n afterHash: digestSchema,\n changed: z.boolean(),\n transactionId: z.string().uuid().nullable(),\n recovered: z.boolean(),\n })\n .strict()\n\nexport interface KnowledgeImprovementActivationRecord {\n kind: 'knowledge-improvement-activation-result'\n candidateId: string\n mutation: KnowledgeImprovementMutationReceipt\n result: AgentImprovementActivationResult\n}\n\nexport const knowledgeImprovementActivationRecordSchema: z.ZodType<KnowledgeImprovementActivationRecord> =\n z\n .object({\n kind: z.literal('knowledge-improvement-activation-result'),\n candidateId: safePathSegmentSchema,\n mutation: knowledgeImprovementMutationReceiptSchema,\n result: agentImprovementActivationResultSchema,\n })\n .strict()\n\nconst improvementStatusSchema = z.enum([\n 'running',\n 'candidate-ready',\n 'promoted',\n 'rejected',\n 'blocked',\n])\n\nconst runRecordSchema = z.custom<RunRecord>((value) => {\n try {\n validateRunRecord(value)\n return true\n } catch {\n return false\n }\n}, 'invalid agent-eval RunRecord')\n\nconst deterministicMetricProvenanceSchema = z\n .object({\n evaluator: z.string().min(1),\n version: z.string().min(1),\n method: z.literal('deterministic'),\n })\n .strict()\n\nconst measuredMetricProvenanceSchema = z\n .object({\n evaluator: z.string().min(1),\n version: z.string().min(1),\n method: z.enum(['sampled', 'composite']),\n corpusHash: digestSchema,\n runRecords: z.array(runRecordSchema).min(1),\n })\n .strict()\n\nconst modelMetricProvenanceSchema = z\n .object({\n evaluator: z.string().min(1),\n version: z.string().min(1),\n method: z.literal('model'),\n model: z.string().min(1),\n corpusHash: digestSchema,\n runRecords: z.array(runRecordSchema).min(1),\n })\n .strict()\n\nexport const improvementMetricSchema = z\n .object({\n score: z.number().finite().min(0).max(1),\n passed: z.boolean(),\n dimensions: z.record(z.string(), z.number().finite()).optional(),\n notes: z.string().optional(),\n provenance: z.discriminatedUnion('method', [\n deterministicMetricProvenanceSchema,\n measuredMetricProvenanceSchema,\n modelMetricProvenanceSchema,\n ]),\n })\n .strict()\n .superRefine((metric, context) => {\n if (metric.provenance.method === 'deterministic') return\n const actualCorpusHash = contentHash(metric.provenance.runRecords)\n if (actualCorpusHash !== metric.provenance.corpusHash) {\n context.addIssue({\n code: 'custom',\n path: ['provenance', 'corpusHash'],\n message: 'metric corpus hash must bind the complete RunRecord array',\n })\n }\n })\n\nconst candidateRecordSchema = z\n .object({\n iteration: z.number().int().positive(),\n candidateId: safePathSegmentSchema,\n baseHash: digestSchema,\n candidateHash: digestSchema.optional(),\n evidenceHash: digestSchema.optional(),\n promotionPlanHash: digestSchema.optional(),\n finalEvaluationStartedAt: z.iso.datetime().optional(),\n status: improvementStatusSchema,\n createdAt: z.iso.datetime(),\n updatedAt: z.iso.datetime(),\n })\n .strict()\n\nexport const KnowledgeImprovementRunStateSchema = z\n .object({\n stateScope: knowledgeStateScopeSchema.optional(),\n runId: runIdSchema,\n root: z.string().min(1),\n goal: z.string().min(1),\n implementationRef: immutableRefSchema,\n status: improvementStatusSchema,\n baseHash: digestSchema,\n createdAt: z.iso.datetime(),\n updatedAt: z.iso.datetime(),\n ownerId: z.string().min(1).optional(),\n candidates: z.array(candidateRecordSchema),\n promotedCandidateId: safePathSegmentSchema.optional(),\n blockedReason: z.string().min(1).optional(),\n })\n .strict()\n .superRefine((state, context) => {\n const candidateIds = new Set<string>()\n for (const [index, candidate] of state.candidates.entries()) {\n if (candidateIds.has(candidate.candidateId)) {\n context.addIssue({\n code: 'custom',\n path: ['candidates', index, 'candidateId'],\n message: 'candidate ids must be unique within an improvement run',\n })\n }\n candidateIds.add(candidate.candidateId)\n if (candidate.baseHash !== state.baseHash) {\n context.addIssue({\n code: 'custom',\n path: ['candidates', index, 'baseHash'],\n message: 'candidate base hash must match its improvement run',\n })\n }\n if (candidate.status === 'candidate-ready') {\n if (!candidate.candidateHash || !candidate.evidenceHash || !candidate.promotionPlanHash) {\n context.addIssue({\n code: 'custom',\n path: ['candidates', index],\n message: 'ready candidates require content, evidence, and promotion-plan identities',\n })\n }\n }\n if (\n candidate.status === 'promoted' &&\n (!candidate.candidateHash || !candidate.evidenceHash || !candidate.promotionPlanHash)\n ) {\n context.addIssue({\n code: 'custom',\n path: ['candidates', index],\n message: 'promoted candidates require content, evidence, and promotion-plan identities',\n })\n }\n if (\n candidate.status === 'promoted' &&\n Boolean(candidate.evidenceHash) !== Boolean(candidate.promotionPlanHash)\n ) {\n context.addIssue({\n code: 'custom',\n path: ['candidates', index],\n message: 'promoted candidate evidence and promotion-plan identities must appear together',\n })\n }\n if (candidate.status === 'promoted' && state.status !== 'promoted') {\n context.addIssue({\n code: 'custom',\n path: ['candidates', index, 'status'],\n message: 'only a promoted run may contain a promoted candidate',\n })\n }\n }\n if (state.status === 'promoted') {\n const promoted = state.candidates.filter(\n (candidate) => candidate.candidateId === state.promotedCandidateId,\n )\n if (promoted.length !== 1 || promoted[0]?.status !== 'promoted') {\n context.addIssue({\n code: 'custom',\n path: ['promotedCandidateId'],\n message: 'promoted state must identify exactly one promoted candidate',\n })\n }\n } else if (state.promotedCandidateId !== undefined) {\n context.addIssue({\n code: 'custom',\n path: ['promotedCandidateId'],\n message: 'only a promoted run may identify a promoted candidate',\n })\n }\n if (\n state.status === 'candidate-ready' &&\n state.candidates.filter((candidate) => candidate.status === 'candidate-ready').length !== 1\n ) {\n context.addIssue({\n code: 'custom',\n path: ['status'],\n message: 'candidate-ready state must contain exactly one ready candidate',\n })\n }\n if (state.status === 'blocked' && state.blockedReason === undefined) {\n context.addIssue({\n code: 'custom',\n path: ['blockedReason'],\n message: 'blocked state must include a reason',\n })\n }\n })\n\nexport const KnowledgeImprovementEvidenceSchema = z\n .object({\n kind: z.literal('knowledge-improvement-evidence'),\n runId: runIdSchema,\n candidateId: safePathSegmentSchema,\n iteration: z.number().int().positive(),\n goalHash: digestSchema,\n implementationRef: immutableRefSchema,\n baseHash: digestSchema,\n candidateHash: digestSchema,\n promotionPlanHash: digestSchema,\n validation: z.unknown(),\n readiness: z.unknown().nullable(),\n kbQuality: z.unknown(),\n evaluation: improvementMetricSchema,\n lifecycle: z.unknown().nullable(),\n })\n .strict()\n\nexport type KnowledgeImprovementEvidence = z.infer<typeof KnowledgeImprovementEvidenceSchema>\n\n/** Portable identity of one measured candidate. Paths and mutable run state are deliberately excluded. */\nexport const KnowledgeImprovementCandidateRefSchema = z\n .object({\n kind: z.literal('knowledge-improvement-candidate'),\n runId: runIdSchema,\n candidateId: safePathSegmentSchema,\n goalHash: digestSchema,\n baseHash: digestSchema,\n candidateHash: digestSchema,\n evidenceHash: digestSchema,\n promotionPlanHash: digestSchema,\n })\n .strict()\n\nexport type KnowledgeImprovementCandidateRef = z.infer<\n typeof KnowledgeImprovementCandidateRefSchema\n>\n\nexport interface PromoteKnowledgeCandidateOptions {\n root: string\n candidate: KnowledgeImprovementCandidateRef\n activation?: KnowledgeImprovementActivationPersistence\n ownerId?: string\n leaseTtlMs?: number\n now?: () => Date\n onState?: (state: KnowledgeImprovementRunState) => Promise<void> | void\n}\n\nexport type RestoreKnowledgeCandidateBaselineOptions = PromoteKnowledgeCandidateOptions\n\nexport interface LoadKnowledgeImprovementActivationResultOptions {\n root: string\n candidate: KnowledgeImprovementCandidateRef\n activation: AgentImprovementActivation\n identity: string\n}\n\nexport interface UseKnowledgeImprovementCandidateOptions {\n root: string\n candidate: KnowledgeImprovementCandidateRef\n}\n\nexport interface ResolvedKnowledgeImprovementComparisonSnapshot {\n root: string\n hash: string\n}\n\nexport interface ResolvedKnowledgeImprovementComparison {\n stateScope?: KnowledgeStateScope\n reference: KnowledgeImprovementCandidateRef\n evaluation: KnowledgeImprovementMetric\n baseline: ResolvedKnowledgeImprovementComparisonSnapshot\n candidate: ResolvedKnowledgeImprovementComparisonSnapshot\n}\n\nexport interface ResolvedKnowledgeImprovementCandidate {\n stateScope?: KnowledgeStateScope\n root: string\n candidate: KnowledgeImprovementCandidateRef\n evaluation: KnowledgeImprovementMetric\n}\n\nexport interface KnowledgeImprovementRetrievalOptions\n extends Omit<RunRetrievalImprovementLoopOptions, 'index' | 'runDir'> {\n runDir?: RunRetrievalImprovementLoopOptions['runDir']\n}\n\nexport type KnowledgeImprovementRagOptimizationRunInput = Parameters<\n RunRagOptimizationOptions['run']\n>[0] & {\n runId: string\n iteration: number\n candidateId: string\n root: string\n baselineRoot: string\n candidateRoot: string\n candidateIndex: KnowledgeIndex\n baseHash: string\n}\n\nexport interface KnowledgeImprovementRagOptimizationOptions\n extends Omit<RunRagOptimizationOptions, 'run' | 'runDir'> {\n runDir?: RunRagOptimizationOptions['runDir']\n run(input: KnowledgeImprovementRagOptimizationRunInput): Promise<RagAnswerEvalArtifact>\n}\n\nexport interface KnowledgeImprovementUpdateInput extends RagKnowledgeUpdateInput {\n runId: string\n iteration: number\n candidateId: string\n root: string\n baselineRoot: string\n candidateRoot: string\n baseHash: string\n}\n\nexport type KnowledgeImprovementUpdate = (\n input: KnowledgeImprovementUpdateInput,\n) => Promise<RagKnowledgeUpdateResult> | RagKnowledgeUpdateResult\n\nexport interface KnowledgeImprovementOptions {\n /** Declared authoritative local state, frozen and restored with each candidate. */\n stateScope?: KnowledgeStateScope\n root: string\n goal: string\n /**\n * Immutable identity covering callbacks, evaluation policy, models, indexes,\n * external services, and all other behavior that can affect this run.\n */\n implementationRef: string\n runId?: string\n ownerId?: string\n leaseTtlMs?: number\n resume?: boolean\n maxCandidates?: number\n candidateResearchIterations?: number\n strict?: ValidateKnowledgeOptions['strict']\n readinessSpecs?: KnowledgeReadinessSpec[]\n readinessTaskId?: string\n readiness?: Omit<BuildEvalKnowledgeBundleOptions, 'taskId' | 'index' | 'specs'>\n kbQuality?: KnowledgeBaseQualityOptions\n step?: RunKnowledgeResearchLoopOptions['step']\n knowledgeResearch?: Omit<RagKnowledgeResearchOptions, 'root'>\n ragOptimization?: KnowledgeImprovementRagOptimizationOptions\n retrieval?: KnowledgeImprovementRetrievalOptions\n diagnose?: NonNullable<RunRagKnowledgeImprovementLoopOptions['diagnose']>\n acquireKnowledge?: NonNullable<RunRagKnowledgeImprovementLoopOptions['acquireKnowledge']>\n updateKnowledge?: KnowledgeImprovementUpdate\n evaluateAnswers?: NonNullable<RunRagKnowledgeImprovementLoopOptions['evaluateAnswers']>\n answerQualityCostCeiling?: RunRagKnowledgeImprovementLoopOptions['answerQualityCostCeiling']\n decidePromotion?: NonNullable<RunRagKnowledgeImprovementLoopOptions['decidePromotion']>\n enabledPhases?: readonly RagKnowledgeImprovementPhase[]\n requiredPhases?: readonly RagKnowledgeImprovementPhase[]\n /** Repeatable candidate screening that must not use final cases. */\n evaluateDevelopment?: KnowledgeImprovementEvaluator\n /** Single-use final evaluator. A failure ends the run. */\n evaluate?: KnowledgeImprovementEvaluator\n signal?: AbortSignal\n now?: () => Date\n onState?: (state: KnowledgeImprovementRunState) => Promise<void> | void\n}\n\nexport interface LeaseHandle {\n ownerId: string\n assertOwned(): void\n release(): Promise<void>\n}\n\nexport const DEFAULT_LEASE_TTL_MS = 15 * 60 * 1000\n\nexport const UPDATE_PHASES: readonly RagKnowledgeImprovementPhase[] = [\n 'gap-diagnosis',\n 'knowledge-acquisition',\n 'knowledge-update',\n]\n\nexport const EVALUATION_PHASES: readonly RagKnowledgeImprovementPhase[] = [\n 'rag-optimization',\n 'retrieval-tuning',\n 'answer-quality',\n 'promotion',\n]\n\n/**\n * The pages directory every knowledge-improvement path reads and writes.\n *\n * This subsystem has no option for a caller-chosen pages directory: the\n * workspace it snapshots, the plan it hashes, and the transaction it applies\n * all address the default tree. Naming it once means the write allowlist, the\n * plan hash, and the generated-page set cannot disagree about which tree they\n * are talking about, and threading a real choice through later changes one\n * constant instead of hunting call sites.\n */\nexport const KB_IMPROVEMENT_PAGES_DIRECTORY = DEFAULT_PAGES_DIRECTORY\n","import { stat } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport { canonicalJson, contentHash } from '@tangle-network/agent-eval'\nimport {\n canonicalPathsEqual,\n isMissingFile,\n listRegularFilesWithinRoot,\n readRegularFileWithinRoot,\n relativeWithinRoot,\n withSafeDirectory,\n writeJsonDurableWithinRoot,\n} from '../durable-fs'\nimport { sha256, slugify, stableId } from '../ids'\nimport { RUN_LEASE, recordLockOwner, takeOverDeadHolder } from '../lock-holder'\nimport { acquireDurableFileLock } from '../mutation-lock'\nimport { layoutFor } from '../store'\nimport type {\n KnowledgeImprovementCandidateRecord,\n KnowledgeImprovementOptions,\n KnowledgeImprovementRunState,\n LeaseHandle,\n} from './contracts'\nimport { KnowledgeImprovementRunStateSchema, runIdSchema, safePathSegmentSchema } from './contracts'\n\nexport function knowledgeImprovementRunId(root: string, goal: string): string {\n return stableId('kimpr', `${root}:${goal}`)\n}\n\nexport function knowledgeImprovementRunDir(root: string, runId: string): string {\n const parsedRunId = runIdSchema.parse(runId)\n const safeRunId = safePathSegmentSchema.safeParse(parsedRunId)\n const runSegment = safeRunId.success\n ? safeRunId.data\n : `${slugify(parsedRunId).slice(0, 72)}-${sha256(parsedRunId).slice(0, 16)}`\n const improvementsDir = join(layoutFor(root).cacheDir, 'improvements')\n const runDir = join(improvementsDir, runSegment)\n if (relativeWithinRoot(improvementsDir, runDir) === undefined) {\n throw new Error('knowledge improvement run directory escaped its root')\n }\n return runDir\n}\n\nexport async function withKnowledgeImprovementRun<T>(\n root: string,\n runId: string,\n create: boolean,\n use: (runDir: string) => Promise<T> | T,\n): Promise<T> {\n const runDir = knowledgeImprovementRunDir(root, runId)\n const relativePath = relativeWithinRoot(root, runDir)\n if (!relativePath) throw new Error('knowledge improvement run directory escaped its root')\n return withSafeDirectory(root, relativePath, create, async (openedRunDir) => {\n const result = await use(openedRunDir)\n const openedIdentity = await stat(openedRunDir)\n const currentIdentity = await withSafeDirectory(root, relativePath, false, (currentRunDir) =>\n stat(currentRunDir),\n )\n if (openedIdentity.dev !== currentIdentity.dev || openedIdentity.ino !== currentIdentity.ino) {\n throw new Error('knowledge improvement run directory changed during use')\n }\n return result\n })\n}\n\nexport async function loadKnowledgeImprovementState(\n root: string,\n runId: string,\n): Promise<KnowledgeImprovementRunState | null> {\n const expectedRunId = runIdSchema.parse(runId)\n try {\n return await withKnowledgeImprovementRun(root, expectedRunId, false, (runDir) =>\n loadKnowledgeImprovementStateFromRun(root, expectedRunId, runDir),\n )\n } catch (error) {\n if (isMissingFile(error)) return null\n throw error\n }\n}\n\nexport async function loadKnowledgeImprovementStateFromRun(\n root: string,\n runId: string,\n runDir: string,\n): Promise<KnowledgeImprovementRunState> {\n const stateFile = await readRegularFileWithinRoot(runDir, 'state.json')\n const raw = JSON.parse(stateFile.bytes.toString('utf8')) as unknown\n const state = KnowledgeImprovementRunStateSchema.parse(raw) as KnowledgeImprovementRunState\n if (state.runId !== runId) {\n throw new Error('knowledge improvement state does not match the requested run')\n }\n if (!(await canonicalPathsEqual(state.root, root))) {\n throw new Error('knowledge improvement state does not match the requested root')\n }\n for (const candidate of state.candidates) {\n if (candidate.status === 'running') await assertCandidateWorkspace(runDir, candidate)\n }\n return state\n}\n\nasync function assertCandidateWorkspace(\n runDir: string,\n candidate: Pick<KnowledgeImprovementCandidateRecord, 'candidateId'>,\n): Promise<void> {\n await withCandidateWorkspace(runDir, candidate, () => undefined)\n}\n\nexport async function withCandidateWorkspace<T>(\n runDir: string,\n candidate: Pick<KnowledgeImprovementCandidateRecord, 'candidateId'>,\n use: (candidateRoot: string) => Promise<T> | T,\n): Promise<T> {\n return withSafeDirectory(\n runDir,\n join('candidates', safePathSegmentSchema.parse(candidate.candidateId), 'workspace'),\n false,\n use,\n )\n}\n\nexport function findActiveCandidate(\n state: KnowledgeImprovementRunState,\n): KnowledgeImprovementCandidateRecord | undefined {\n return [...state.candidates]\n .reverse()\n .find((candidate) => candidate.status === 'candidate-ready' || candidate.status === 'running')\n}\n\nexport interface KnowledgeImprovementEvent extends Record<string, unknown> {\n at: string\n type: string\n}\n\nexport async function loadKnowledgeImprovementEvents(\n root: string,\n runId: string,\n): Promise<KnowledgeImprovementEvent[]> {\n const parsedRunId = runIdSchema.parse(runId)\n try {\n return await withKnowledgeImprovementRun(root, parsedRunId, false, (runDir) =>\n loadKnowledgeImprovementEventsFromRun(runDir),\n )\n } catch (error) {\n if (isMissingFile(error)) return []\n throw error\n }\n}\n\nexport async function loadKnowledgeImprovementEventsFromRun(\n runDir: string,\n): Promise<KnowledgeImprovementEvent[]> {\n const events: KnowledgeImprovementEvent[] = []\n try {\n for (const file of await listRegularFilesWithinRoot(runDir, 'events')) {\n const name = file.path.slice('events/'.length)\n if (name.includes('/') || !name.endsWith('.json')) {\n throw new Error(`knowledge event store contains an unsupported entry: ${name}`)\n }\n events.push(parseKnowledgeImprovementEvent(JSON.parse(file.bytes.toString('utf8'))))\n }\n } catch (error) {\n if (!isMissingFile(error)) throw error\n }\n\n const unique = new Map<string, KnowledgeImprovementEvent>()\n for (const event of events) {\n const { at: _at, ...semantic } = event\n unique.set(contentHash(semantic), event)\n }\n return [...unique.values()].sort((left, right) => left.at.localeCompare(right.at))\n}\n\nfunction parseKnowledgeImprovementEvent(value: unknown): KnowledgeImprovementEvent {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error('knowledge improvement event is not an object')\n }\n const event = value as Record<string, unknown>\n if (typeof event.at !== 'string' || typeof event.type !== 'string') {\n throw new Error('knowledge improvement event is missing at or type')\n }\n return event as KnowledgeImprovementEvent\n}\n\n/**\n * Take the run's lease, or fail fast while another operator holds it. A holder whose owner record\n * proves it dead (`src/lock-holder.ts`) is taken over at once; any other holder keeps `ttlMs`.\n */\nexport async function acquireRunLease(\n runDir: string,\n options: { ownerId: string; ttlMs: number },\n): Promise<LeaseHandle> {\n const acquire = () =>\n acquireDurableFileLock(runDir, {\n lockfilePath: join(runDir, RUN_LEASE.directory),\n staleMs: options.ttlMs,\n })\n let acquired: Awaited<ReturnType<typeof acquire>>\n try {\n acquired = await acquire()\n } catch (error) {\n if (\n (error as NodeJS.ErrnoException).code !== 'ELOCKED' ||\n !(await takeOverDeadHolder(runDir, options.ttlMs, RUN_LEASE))\n ) {\n throw error\n }\n acquired = await acquire()\n }\n await recordLockOwner(runDir, `knowledge improvement run of ${options.ownerId}`, RUN_LEASE)\n return {\n ownerId: options.ownerId,\n assertOwned: acquired.assertOwned,\n release: acquired.release,\n }\n}\n\nexport async function blockRun(\n runDir: string,\n state: KnowledgeImprovementRunState,\n reason: string,\n onState: KnowledgeImprovementOptions['onState'],\n now: () => Date,\n): Promise<KnowledgeImprovementRunState> {\n state.status = 'blocked'\n state.blockedReason = reason\n state.updatedAt = now().toISOString()\n await saveState(runDir, state, onState)\n return state\n}\n\nexport async function saveState(\n runDir: string,\n state: KnowledgeImprovementRunState,\n onState?: KnowledgeImprovementOptions['onState'],\n): Promise<void> {\n await writeJsonDurableWithinRoot(\n runDir,\n 'state.json',\n KnowledgeImprovementRunStateSchema.parse(state),\n )\n await onState?.(state)\n}\n\nexport async function appendLedger(runDir: string, value: Record<string, unknown>): Promise<void> {\n const type = value.type\n if (typeof type !== 'string' || type.length === 0) {\n throw new Error('knowledge improvement event requires a type')\n }\n const relativePath = join('events', `${contentHash(value)}.json`).replace(/\\\\/g, '/')\n try {\n const file = await readRegularFileWithinRoot(runDir, relativePath)\n const existing = parseKnowledgeImprovementEvent(JSON.parse(file.bytes.toString('utf8')))\n const { at: _at, ...semantic } = existing\n if (canonicalJson(semantic) !== canonicalJson(value)) {\n throw new Error('knowledge improvement event identity conflicts with durable content')\n }\n return\n } catch (error) {\n if (!isMissingFile(error)) throw error\n }\n await writeJsonDurableWithinRoot(runDir, relativePath, {\n at: new Date().toISOString(),\n ...value,\n })\n}\n\nexport function candidateEvidenceRelativePath(candidateId: string): string {\n return join('candidates', safePathSegmentSchema.parse(candidateId), 'evidence.json').replace(\n /\\\\/g,\n '/',\n )\n}\n\nexport function assertExactCandidatePlatform(): void {\n if (process.platform !== 'linux') {\n throw new Error('exact knowledge candidate workflows require Linux directory descriptors')\n }\n}\n","import { canonicalJson } from '@tangle-network/agent-eval'\nimport {\n type AgentImprovementActivation,\n type AgentImprovementActivationResult,\n agentImprovementActivationResultSchema,\n agentImprovementActivationSchema,\n canonicalCandidateDigest,\n omitTopLevelDigest,\n type Sha256Digest,\n sha256DigestSchema,\n} from '@tangle-network/agent-interface'\nimport { z } from 'zod'\nimport { isMissingFile, readRegularFileWithinRoot, writeJsonDurableWithinRoot } from '../durable-fs'\nimport type {\n KnowledgeImprovementActivationPersistence,\n KnowledgeImprovementActivationRecord,\n KnowledgeImprovementCandidateRef,\n KnowledgeImprovementMutationReceipt,\n KnowledgeImprovementTarget,\n LoadKnowledgeImprovementActivationResultOptions,\n} from './contracts'\nimport {\n digestSchema,\n KnowledgeImprovementCandidateRefSchema,\n knowledgeImprovementActivationRecordSchema,\n knowledgeImprovementMutationReceiptSchema,\n} from './contracts'\nimport { assertExactCandidatePlatform, withKnowledgeImprovementRun } from './state'\n\n/** Load the durable result for one exact activation without changing knowledge or run state. */\nexport async function loadKnowledgeImprovementActivationResult(\n options: LoadKnowledgeImprovementActivationResultOptions,\n): Promise<AgentImprovementActivationResult | null> {\n assertExactCandidatePlatform()\n const candidate = Object.freeze(KnowledgeImprovementCandidateRefSchema.parse(options.candidate))\n const activation = verifyCanonicalKnowledgeActivation(options.activation)\n const target = targetForKnowledgeActivation(activation)\n assertKnowledgeActivationAuthority(activation, candidate, target, options.identity)\n return withKnowledgeImprovementRun(options.root, candidate.runId, false, async (runDir) => {\n const record = await loadKnowledgeActivationRecord(\n runDir,\n candidate,\n activation,\n target,\n options.identity,\n )\n return record?.result ?? null\n })\n}\n\nexport interface ResolvedKnowledgeImprovementActivationPersistence\n extends KnowledgeImprovementActivationPersistence {\n activation: AgentImprovementActivation\n}\n\nexport function sourceKnowledgeHash(\n candidate: KnowledgeImprovementCandidateRef,\n target: KnowledgeImprovementTarget,\n): string {\n return target === 'candidate' ? candidate.baseHash : candidate.candidateHash\n}\n\nfunction targetForKnowledgeActivation(\n activation: AgentImprovementActivation,\n): KnowledgeImprovementTarget {\n return activation.intent === 'activate-candidate' ? 'candidate' : 'baseline'\n}\n\nexport function resolveKnowledgeActivationPersistence(\n input: KnowledgeImprovementActivationPersistence,\n candidate: KnowledgeImprovementCandidateRef,\n target: KnowledgeImprovementTarget,\n): ResolvedKnowledgeImprovementActivationPersistence {\n const activation = verifyCanonicalKnowledgeActivation(input.activation)\n assertKnowledgeActivationAuthority(activation, candidate, target, input.identity)\n const attemptedAt = z.iso.datetime().parse(input.attemptedAt)\n if (\n Date.parse(attemptedAt) < Date.parse(activation.authorizedAt) ||\n Date.parse(attemptedAt) >= Date.parse(activation.expiresAt)\n ) {\n throw new Error('knowledge activation attempt is outside its authorization window')\n }\n return Object.freeze({\n activation,\n attemptedAt,\n identity: input.identity,\n createResult: input.createResult,\n })\n}\n\nfunction assertKnowledgeActivationAuthority(\n activation: AgentImprovementActivation,\n candidate: KnowledgeImprovementCandidateRef,\n target: KnowledgeImprovementTarget,\n identity: string,\n): void {\n if (!identity.trim()) throw new Error('knowledge activation identity is required')\n if (targetForKnowledgeActivation(activation) !== target) {\n throw new Error('knowledge activation intent does not match the requested transition')\n }\n if (activation.targets.length !== 1) {\n throw new Error('knowledge activation requires exactly one target')\n }\n const authorizedTarget = activation.targets[0]\n if (authorizedTarget.surface !== 'knowledge' || authorizedTarget.identity !== identity) {\n throw new Error('knowledge activation target does not match this knowledge base')\n }\n if (\n authorizedTarget.expectedBaseDigest !==\n prefixedKnowledgeDigest(sourceKnowledgeHash(candidate, target))\n ) {\n throw new Error('knowledge activation does not authorize the measured source state')\n }\n}\n\nfunction verifyCanonicalKnowledgeActivation(\n value: AgentImprovementActivation,\n): AgentImprovementActivation {\n const activation = agentImprovementActivationSchema.parse(value)\n if (canonicalCandidateDigest(omitTopLevelDigest(activation)) !== activation.digest) {\n throw new Error('knowledge activation digest does not match its canonical content')\n }\n return immutableJsonValue(structuredClone(activation))\n}\n\nfunction verifyCanonicalKnowledgeActivationResult(\n value: AgentImprovementActivationResult,\n): AgentImprovementActivationResult {\n const result = agentImprovementActivationResultSchema.parse(value)\n if (canonicalCandidateDigest(omitTopLevelDigest(result)) !== result.digest) {\n throw new Error('knowledge activation result digest does not match its canonical content')\n }\n return immutableJsonValue(structuredClone(result))\n}\n\nexport async function persistKnowledgeActivationResult(\n runDir: string,\n candidate: KnowledgeImprovementCandidateRef,\n persistence: ResolvedKnowledgeImprovementActivationPersistence,\n target: KnowledgeImprovementTarget,\n mutation: KnowledgeImprovementMutationReceipt,\n): Promise<AgentImprovementActivationResult> {\n const result = assertKnowledgeActivationResult(\n persistence.activation,\n candidate,\n target,\n persistence.identity,\n mutation,\n await persistence.createResult(Object.freeze({ ...mutation })),\n persistence.attemptedAt,\n )\n const record = knowledgeImprovementActivationRecordSchema.parse({\n kind: 'knowledge-improvement-activation-result',\n candidateId: candidate.candidateId,\n mutation,\n result,\n })\n const existing = await loadKnowledgeActivationRecord(\n runDir,\n candidate,\n persistence.activation,\n target,\n persistence.identity,\n )\n if (existing) {\n if (canonicalJson(existing) !== canonicalJson(record)) {\n throw new Error('knowledge activation result identity conflicts with durable content')\n }\n return existing.result\n }\n await writeJsonDurableWithinRoot(\n runDir,\n knowledgeActivationResultPath(persistence.activation.digest),\n record,\n )\n const stored = await loadKnowledgeActivationRecord(\n runDir,\n candidate,\n persistence.activation,\n target,\n persistence.identity,\n )\n if (!stored || canonicalJson(stored) !== canonicalJson(record)) {\n throw new Error('knowledge activation result was not durably persisted')\n }\n return stored.result\n}\n\nexport async function loadKnowledgeActivationRecord(\n runDir: string,\n candidate: KnowledgeImprovementCandidateRef,\n activation: AgentImprovementActivation,\n target: KnowledgeImprovementTarget,\n identity: string,\n): Promise<KnowledgeImprovementActivationRecord | null> {\n let raw: unknown\n try {\n const file = await readRegularFileWithinRoot(\n runDir,\n knowledgeActivationResultPath(activation.digest),\n )\n raw = JSON.parse(file.bytes.toString('utf8')) as unknown\n } catch (error) {\n if (isMissingFile(error)) return null\n throw error\n }\n const record = knowledgeImprovementActivationRecordSchema.parse(raw)\n if (record.candidateId !== candidate.candidateId) {\n throw new Error('knowledge activation result belongs to another candidate')\n }\n const result = assertKnowledgeActivationResult(\n activation,\n candidate,\n target,\n identity,\n record.mutation,\n record.result,\n )\n return immutableJsonValue({ ...record, result })\n}\n\nfunction assertKnowledgeActivationResult(\n activation: AgentImprovementActivation,\n candidate: KnowledgeImprovementCandidateRef,\n target: KnowledgeImprovementTarget,\n identity: string,\n mutationInput: KnowledgeImprovementMutationReceipt,\n resultInput: AgentImprovementActivationResult,\n attemptedAt?: string,\n): AgentImprovementActivationResult {\n assertKnowledgeActivationAuthority(activation, candidate, target, identity)\n const mutation = knowledgeImprovementMutationReceiptSchema.parse(mutationInput)\n const result = verifyCanonicalKnowledgeActivationResult(resultInput)\n if (\n result.idempotencyKey !== activation.digest ||\n (attemptedAt !== undefined && result.attemptedAt !== attemptedAt) ||\n Date.parse(result.attemptedAt) < Date.parse(activation.authorizedAt) ||\n Date.parse(result.attemptedAt) >= Date.parse(activation.expiresAt) ||\n mutation.target !== target ||\n mutation.changed !== (mutation.beforeHash !== mutation.afterHash) ||\n (!mutation.changed && (mutation.transactionId !== null || mutation.recovered))\n ) {\n throw new Error('knowledge activation result does not bind its authorized mutation')\n }\n\n const sourceDigest = prefixedKnowledgeDigest(sourceKnowledgeHash(candidate, target))\n const desiredDigest = prefixedKnowledgeDigest(\n target === 'candidate' ? candidate.candidateHash : candidate.baseHash,\n )\n const beforeDigest = prefixedKnowledgeDigest(mutation.beforeHash)\n const afterDigest = prefixedKnowledgeDigest(mutation.afterHash)\n const outcome = result.outcome\n if (mutation.changed) {\n if (\n mutation.transactionId === null ||\n beforeDigest !== sourceDigest ||\n afterDigest !== desiredDigest ||\n outcome.status !== 'applied' ||\n outcome.transactionId !== mutation.transactionId ||\n outcome.targets.length !== 1 ||\n outcome.targets[0]?.surface !== 'knowledge' ||\n outcome.targets[0]?.identity !== identity ||\n outcome.targets[0]?.beforeDigest !== beforeDigest ||\n outcome.targets[0]?.afterDigest !== afterDigest\n ) {\n throw new Error('knowledge activation result does not prove the applied transaction')\n }\n return result\n }\n\n const expectedStatus = afterDigest === desiredDigest ? 'already-applied' : 'conflict'\n if (\n afterDigest === sourceDigest ||\n outcome.status !== expectedStatus ||\n outcome.targets.length !== 1 ||\n outcome.targets[0]?.surface !== 'knowledge' ||\n outcome.targets[0]?.identity !== identity ||\n outcome.targets[0]?.currentDigest !== afterDigest\n ) {\n throw new Error('knowledge activation result does not prove the observed target state')\n }\n return result\n}\n\nfunction knowledgeActivationResultPath(digest: Sha256Digest): string {\n const parsed = sha256DigestSchema.parse(digest)\n return `activation-results/${parsed.slice('sha256:'.length)}.json`\n}\n\nfunction prefixedKnowledgeDigest(hash: string): Sha256Digest {\n return sha256DigestSchema.parse(`sha256:${digestSchema.parse(hash)}`)\n}\n\nexport function immutableJsonValue<T>(value: T): T {\n if (value === null || typeof value !== 'object') return value\n for (const child of Object.values(value)) immutableJsonValue(child)\n return Object.freeze(value)\n}\n","const SHA256_REF = /^sha256:[a-f0-9]{64}$/\nconst GIT_REF = /^git:[a-f0-9]{40}$/\n\nexport function assertImmutableRef(value: unknown, label: string): asserts value is string {\n if (typeof value !== 'string' || (!SHA256_REF.test(value) && !GIT_REF.test(value))) {\n throw new Error(`${label} must be lowercase sha256:<64 hex> or git:<40 hex>`)\n }\n}\n","import type { ComparisonCost } from '@tangle-network/agent-eval/campaign'\nimport { assertImmutableRef } from './immutable-ref'\n\ninterface RagAnswerEvidence {\n passed: boolean\n metrics: Record<string, number>\n finalScenarioIds: readonly string[]\n datasetRef: string\n evaluatorRef: string\n cost: ComparisonCost\n}\n\nexport function assertRagAnswerEvidence(result: RagAnswerEvidence): void {\n if (!result || typeof result !== 'object') {\n throw new Error('answer-quality evidence must be an object')\n }\n if (typeof result.passed !== 'boolean') {\n throw new Error('answer-quality evidence requires a boolean passed verdict')\n }\n assertImmutableRef(result.datasetRef, 'answer-quality datasetRef')\n assertImmutableRef(result.evaluatorRef, 'answer-quality evaluatorRef')\n if (\n !Array.isArray(result.finalScenarioIds) ||\n result.finalScenarioIds.length < 2 ||\n new Set(result.finalScenarioIds).size !== result.finalScenarioIds.length ||\n result.finalScenarioIds.some((id) => typeof id !== 'string' || id.trim().length === 0)\n ) {\n throw new Error('answer-quality evidence requires at least 2 unique final scenario IDs')\n }\n if (!result.metrics || typeof result.metrics !== 'object' || Array.isArray(result.metrics)) {\n throw new Error('answer-quality evidence requires non-empty finite metrics')\n }\n const metrics = Object.entries(result.metrics)\n if (\n metrics.length === 0 ||\n metrics.some(([key, value]) => key.trim().length === 0 || !Number.isFinite(value))\n ) {\n throw new Error('answer-quality evidence requires non-empty finite metrics')\n }\n if (!result.cost || typeof result.cost !== 'object') {\n throw new Error('answer-quality evidence requires cost accounting')\n }\n if (\n !Number.isFinite(result.cost.totalCostUsd) ||\n result.cost.totalCostUsd < 0 ||\n typeof result.cost.accountingComplete !== 'boolean' ||\n !Array.isArray(result.cost.incompleteReasons) ||\n result.cost.incompleteReasons.some((reason) => typeof reason !== 'string' || !reason.trim())\n ) {\n throw new Error('answer-quality evidence has invalid cost accounting')\n }\n if (result.cost.accountingComplete && result.cost.incompleteReasons.length > 0) {\n throw new Error('complete answer-quality cost accounting cannot include incomplete reasons')\n }\n}\n\nexport function ragAnswerEvidenceRejectionReasons(\n evidence: RagAnswerEvidence,\n costCeiling: number | undefined,\n): string[] {\n const reasons: string[] = []\n if (!evidence.passed) reasons.push('answer-quality evaluation failed')\n if (!evidence.cost.accountingComplete) {\n reasons.push('answer-quality final comparison has incomplete cost accounting')\n }\n if (costCeiling === undefined) {\n reasons.push('answer-quality promotion requires answerQualityCostCeiling')\n } else if (exceedsCostCeiling(evidence.cost.totalCostUsd, costCeiling)) {\n reasons.push(\n `answer-quality final comparison cost ${evidence.cost.totalCostUsd} exceeds ${costCeiling}`,\n )\n }\n return reasons\n}\n\nfunction exceedsCostCeiling(totalCostUsd: number, costCeiling: number): boolean {\n const tolerance = Number.EPSILON * Math.max(1, Math.abs(totalCostUsd), Math.abs(costCeiling)) * 8\n return totalCostUsd - costCeiling > tolerance\n}\n","import { canonicalJson } from '@tangle-network/agent-eval'\nimport {\n type CompareOptimizationMethodsOptions,\n compareOptimizationMethods,\n type DispatchContext,\n type MutableSurface,\n type OptimizationMethod,\n type OptimizationMethodComparison,\n type OptimizationMethodRunOptions,\n type Scenario,\n surfaceHash,\n} from '@tangle-network/agent-eval/campaign'\nimport type { AgentCandidateJsonValue as JsonValue } from '@tangle-network/agent-interface'\nimport { assertImmutableRef } from './immutable-ref'\n\nexport interface SerializedCandidateCodec<TCandidate extends JsonValue> {\n serialize(candidate: TCandidate): string\n parse(surface: string): TCandidate\n}\n\nexport interface SerializedCandidate<TCandidate extends JsonValue> {\n value: TCandidate\n surface: string\n surfaceHash: string\n}\n\ntype ComparisonOptions<TScenario extends Scenario, TArtifact> = Omit<\n CompareOptimizationMethodsOptions<TScenario, TArtifact>,\n | 'methods'\n | 'baselineSurface'\n | 'trainScenarios'\n | 'selectionScenarios'\n | 'testScenarios'\n | 'dispatchWithSurface'\n | 'dispatchRef'\n | 'optimizationRunOptions'\n>\n\nexport interface RunSerializedKnowledgeOptimizationOptions<\n TCandidate extends JsonValue,\n TScenario extends Scenario,\n TArtifact,\n> extends ComparisonOptions<TScenario, TArtifact> {\n /** Immutable identity for candidate execution, judges, models, indexes, and external settings. */\n executionRef: string\n baseline: TCandidate\n method: OptimizationMethod<TScenario, TArtifact>\n trainScenarios: readonly TScenario[]\n selectionScenarios: readonly TScenario[]\n finalScenarios: readonly TScenario[]\n dispatchCandidate(input: {\n candidate: TCandidate\n candidateSurface: string\n candidateSurfaceHash: string\n scenario: TScenario\n context: DispatchContext\n }): Promise<TArtifact>\n codec?: SerializedCandidateCodec<TCandidate>\n /** Detects duplicated cases whose IDs differ within or across data partitions. */\n scenarioFingerprint?: (scenario: TScenario) => string\n optimizationRunOptions?: Omit<OptimizationMethodRunOptions<TScenario, TArtifact>, 'dispatchRef'>\n}\n\nexport interface RunSerializedKnowledgeOptimizationResult<TCandidate extends JsonValue> {\n methodName: string\n baseline: SerializedCandidate<TCandidate>\n winner: SerializedCandidate<TCandidate>\n comparison: OptimizationMethodComparison\n}\n\n/**\n * Runs one complete agent-eval method over a serialized knowledge candidate.\n * The method receives train and selection data; agent-eval owns final scoring.\n */\nexport async function runSerializedKnowledgeOptimization<\n TCandidate extends JsonValue,\n TScenario extends Scenario,\n TArtifact,\n>(\n options: RunSerializedKnowledgeOptimizationOptions<TCandidate, TScenario, TArtifact>,\n): Promise<RunSerializedKnowledgeOptimizationResult<TCandidate>> {\n assertCompleteOptimizationMethod(options.method)\n assertImmutableRef(options.executionRef, 'knowledge optimization executionRef')\n const codec = options.codec ?? jsonCandidateCodec<TCandidate>()\n const baseline = normalizeCandidate(options.baseline, codec, 'baseline')\n const dispatchRef = [\n 'knowledge-optimization',\n options.executionRef,\n baseline.surfaceHash,\n surfaceHash(options.method.name),\n ].join(':')\n assertPartitionContent(\n options.trainScenarios,\n options.selectionScenarios,\n options.finalScenarios,\n options.scenarioFingerprint ?? scenarioContentFingerprint,\n )\n\n const method = canonicalCandidateMethod(options.method, codec)\n const {\n baseline: _baseline,\n method: _method,\n trainScenarios,\n selectionScenarios,\n finalScenarios,\n dispatchCandidate,\n executionRef: _executionRef,\n codec: _codec,\n scenarioFingerprint: _scenarioFingerprint,\n ...comparisonOptions\n } = options\n const optimizationRunOptions = {\n ...(comparisonOptions.reps !== undefined ? { reps: comparisonOptions.reps } : {}),\n ...(comparisonOptions.resumable !== undefined\n ? { resumable: comparisonOptions.resumable }\n : {}),\n ...(comparisonOptions.labeledStore !== undefined\n ? { labeledStore: comparisonOptions.labeledStore }\n : {}),\n ...(comparisonOptions.captureSource !== undefined\n ? { captureSource: comparisonOptions.captureSource }\n : {}),\n ...(comparisonOptions.captureSourceVersionHash !== undefined\n ? { captureSourceVersionHash: comparisonOptions.captureSourceVersionHash }\n : {}),\n ...(comparisonOptions.maxConcurrency !== undefined\n ? { maxConcurrency: comparisonOptions.maxConcurrency }\n : {}),\n ...(comparisonOptions.dispatchTimeoutMs !== undefined\n ? { dispatchTimeoutMs: comparisonOptions.dispatchTimeoutMs }\n : {}),\n ...(comparisonOptions.repo !== undefined ? { repo: comparisonOptions.repo } : {}),\n ...(comparisonOptions.tracing !== undefined ? { tracing: comparisonOptions.tracing } : {}),\n ...(comparisonOptions.expectUsage !== undefined\n ? { expectUsage: comparisonOptions.expectUsage }\n : {}),\n ...(comparisonOptions.now !== undefined ? { now: comparisonOptions.now } : {}),\n ...(comparisonOptions.buildTraceWriter !== undefined\n ? { buildTraceWriter: comparisonOptions.buildTraceWriter }\n : {}),\n ...(comparisonOptions.storage !== undefined ? { storage: comparisonOptions.storage } : {}),\n ...(comparisonOptions.cellPlacement !== undefined\n ? { cellPlacement: comparisonOptions.cellPlacement }\n : {}),\n ...(comparisonOptions.optimizationRunOptions ?? {}),\n dispatchRef,\n }\n const comparison = await compareOptimizationMethods<TScenario, TArtifact>({\n ...comparisonOptions,\n dispatchRef,\n optimizationRunOptions,\n methods: [method],\n baselineSurface: baseline.surface,\n trainScenarios: trainScenarios.map((scenario) => structuredClone(scenario)),\n selectionScenarios: selectionScenarios.map((scenario) => structuredClone(scenario)),\n testScenarios: finalScenarios.map((scenario) => structuredClone(scenario)),\n dispatchWithSurface: async (surface, scenario, context) => {\n const candidate = normalizeSurface(surface, codec, 'candidate')\n return dispatchCandidate({\n candidate: structuredClone(candidate.value),\n candidateSurface: candidate.surface,\n candidateSurfaceHash: candidate.surfaceHash,\n scenario,\n context,\n })\n },\n })\n const winner = normalizeSurface(comparison.best.winnerSurface, codec, 'winner')\n return {\n methodName: options.method.name,\n baseline,\n winner,\n comparison,\n }\n}\n\nfunction assertCompleteOptimizationMethod(method: unknown): void {\n const candidate = method as { name?: unknown; optimize?: unknown } | null | undefined\n if (\n !candidate ||\n typeof candidate.name !== 'string' ||\n candidate.name.trim().length === 0 ||\n typeof candidate.optimize !== 'function'\n ) {\n throw new Error(\n 'knowledge optimization requires a complete OptimizationMethod with a non-empty name and optimize()',\n )\n }\n}\n\nexport function jsonCandidateCodec<\n TCandidate extends JsonValue,\n>(): SerializedCandidateCodec<TCandidate> {\n return {\n serialize: (candidate) => canonicalJson(candidate),\n parse(surface) {\n let parsed: unknown\n try {\n parsed = JSON.parse(surface)\n } catch (error) {\n throw new Error('serialized knowledge candidate is not valid JSON', { cause: error })\n }\n return parsed as TCandidate\n },\n }\n}\n\nexport function jsonObjectCandidateCodec<\n TCandidate extends Record<string, JsonValue>,\n>(): SerializedCandidateCodec<TCandidate> {\n const codec = jsonCandidateCodec<TCandidate>()\n return {\n serialize: codec.serialize,\n parse(surface) {\n const candidate = codec.parse(surface)\n if (!candidate || typeof candidate !== 'object' || Array.isArray(candidate)) {\n throw new Error('serialized knowledge candidate must be a JSON object')\n }\n return candidate\n },\n }\n}\n\nexport function scenarioContentFingerprint(scenario: Scenario): string {\n const {\n id: _id,\n tags: _tags,\n split: _split,\n splitTag: _splitTag,\n ...content\n } = scenario as Scenario & { split?: unknown; splitTag?: unknown }\n return surfaceHash(canonicalJson(content as JsonValue))\n}\n\nfunction canonicalCandidateMethod<\n TCandidate extends JsonValue,\n TScenario extends Scenario,\n TArtifact,\n>(\n method: OptimizationMethod<TScenario, TArtifact>,\n codec: SerializedCandidateCodec<TCandidate>,\n): OptimizationMethod<TScenario, TArtifact> {\n return {\n name: method.name,\n async optimize(input) {\n const result = await method.optimize(input)\n const winner = normalizeSurface(result.winnerSurface, codec, `${method.name} winner`)\n return {\n ...result,\n winnerSurface: winner.surface,\n }\n },\n }\n}\n\nfunction normalizeCandidate<TCandidate extends JsonValue>(\n candidate: TCandidate,\n codec: SerializedCandidateCodec<TCandidate>,\n label: string,\n): SerializedCandidate<TCandidate> {\n let surface: string\n try {\n surface = codec.serialize(candidate)\n } catch (error) {\n throw new Error(`${label} serializer failed`, { cause: error })\n }\n return normalizeSurface(surface, codec, label)\n}\n\nfunction normalizeSurface<TCandidate extends JsonValue>(\n surface: MutableSurface,\n codec: SerializedCandidateCodec<TCandidate>,\n label: string,\n): SerializedCandidate<TCandidate> {\n if (typeof surface !== 'string' || surface.trim().length === 0) {\n throw new Error(`${label} must be a non-empty serialized string`)\n }\n let value: TCandidate\n try {\n value = codec.parse(surface)\n } catch (error) {\n const detail = error instanceof Error ? `: ${error.message}` : ''\n throw new Error(`${label} parser failed${detail}`, { cause: error })\n }\n let canonicalSurface: string\n try {\n canonicalSurface = codec.serialize(value)\n } catch (error) {\n throw new Error(`${label} serializer failed after parsing`, { cause: error })\n }\n if (typeof canonicalSurface !== 'string' || canonicalSurface.trim().length === 0) {\n throw new Error(`${label} serializer must return a non-empty string`)\n }\n const roundTrip = codec.serialize(codec.parse(canonicalSurface))\n if (roundTrip !== canonicalSurface) {\n throw new Error(`${label} codec must round-trip to one canonical surface`)\n }\n return {\n value: structuredClone(value),\n surface: canonicalSurface,\n surfaceHash: surfaceHash(canonicalSurface),\n }\n}\n\nfunction assertPartitionContent<TScenario extends Scenario>(\n train: readonly TScenario[],\n selection: readonly TScenario[],\n final: readonly TScenario[],\n fingerprint: ((scenario: TScenario) => string) | undefined,\n): void {\n if (!fingerprint) return\n const owner = new Map<string, { partition: string; scenarioId: string }>()\n for (const [name, scenarios] of [\n ['train', train],\n ['selection', selection],\n ['final', final],\n ] as const) {\n for (const scenario of scenarios) {\n const identity = fingerprint(scenario)\n if (typeof identity !== 'string' || identity.trim().length === 0) {\n throw new Error(`scenarioFingerprint returned no identity for '${scenario.id}'`)\n }\n const prior = owner.get(identity)\n if (prior) {\n const scope =\n prior.partition === name\n ? `${name} partition duplicates`\n : `${prior.partition}/${name} partitions duplicate`\n throw new Error(\n `serialized knowledge optimization ${scope} scenario content at '${prior.scenarioId}'/'${scenario.id}'`,\n )\n }\n owner.set(identity, { partition: name, scenarioId: scenario.id })\n }\n }\n}\n","import type { RagGapFinding } from '../rag-improvement-loop'\nimport type { KnowledgeIndex } from '../types'\nimport { type ValidateKnowledgeResult, validateKnowledgeIndex } from '../validate'\nimport type { KnowledgeBaseQualityOptions, KnowledgeBaseQualityReport } from './contracts'\nimport { detectNearDuplicatePages } from './near-duplicates'\n\nexport function scoreKnowledgeBaseIndex(\n index: KnowledgeIndex,\n options: KnowledgeBaseQualityOptions = {},\n): KnowledgeBaseQualityReport {\n return scoreValidatedKnowledgeBaseIndex(index, options, validateKnowledgeIndex(index, options))\n}\n\n/** Internal scoring over the validation of this exact index and strictness policy. */\nexport function scoreValidatedKnowledgeBaseIndex(\n index: KnowledgeIndex,\n options: KnowledgeBaseQualityOptions,\n validation: ValidateKnowledgeResult,\n): KnowledgeBaseQualityReport {\n const now = options.now ?? new Date()\n const staleSourceCount = index.sources.filter((source) => {\n return source.validUntil ? Date.parse(source.validUntil) < now.getTime() : false\n }).length\n const sourceHashCounts = new Map<string, number>()\n for (const source of index.sources) {\n sourceHashCounts.set(source.contentHash, (sourceHashCounts.get(source.contentHash) ?? 0) + 1)\n }\n const duplicateSourceHashCount = [...sourceHashCounts.values()].filter(\n (count) => count > 1,\n ).length\n const pagesWithInlineCitations = index.pages.filter(\n (page) => sourceRefs(page.text).length > 0,\n ).length\n const pagesWithSources = index.pages.filter((page) => page.sourceIds.length > 0).length\n const nearDuplicates = detectNearDuplicatePages(index.pages, options.nearDuplicates)\n const maxNearDuplicatePageRate = unitInterval(\n options.maxNearDuplicatePageRate ?? 1,\n 'maxNearDuplicatePageRate',\n )\n const metrics = {\n page_count: index.pages.length,\n source_count: index.sources.length,\n citation_rate: index.pages.length === 0 ? 1 : pagesWithInlineCitations / index.pages.length,\n source_backed_page_rate: index.pages.length === 0 ? 1 : pagesWithSources / index.pages.length,\n stale_source_rate: index.sources.length === 0 ? 0 : staleSourceCount / index.sources.length,\n duplicate_source_hash_rate:\n index.sources.length === 0 ? 0 : duplicateSourceHashCount / index.sources.length,\n lint_error_count: validation.findings.filter((finding) => finding.severity === 'error').length,\n lint_warning_count: validation.findings.filter((finding) => finding.severity === 'warning')\n .length,\n near_duplicate_page_rate: nearDuplicates.duplicatePageRate,\n near_duplicate_page_count: nearDuplicates.duplicatePageCount,\n near_duplicate_pair_count: nearDuplicates.duplicatePairCount,\n }\n const findings: RagGapFinding[] = []\n if (metrics.lint_error_count > 0) {\n findings.push({\n id: 'kb:lint-errors',\n kind: 'unknown',\n severity: 'critical',\n message: `${metrics.lint_error_count} validation error(s) in the knowledge index.`,\n evidence: { lint_error_count: metrics.lint_error_count },\n })\n }\n if (metrics.citation_rate < (options.minCitationRate ?? 0)) {\n findings.push({\n id: 'kb:citation-rate',\n kind: 'missing-source',\n severity: 'error',\n message: 'Inline citation coverage is below the configured minimum.',\n evidence: { citation_rate: metrics.citation_rate },\n })\n }\n if (metrics.stale_source_rate > (options.maxStaleSourceRate ?? 1)) {\n findings.push({\n id: 'kb:stale-source-rate',\n kind: 'stale-source',\n severity: 'error',\n message: 'Stale source rate exceeds the configured maximum.',\n evidence: { stale_source_rate: metrics.stale_source_rate },\n })\n }\n if (nearDuplicates.truncated && maxNearDuplicatePageRate < 1) {\n findings.push({\n id: 'kb:near-duplicate-analysis-truncated',\n kind: 'unknown',\n severity: 'error',\n message:\n 'Near-duplicate analysis reached a configured bound, so the duplicate-page gate cannot be evaluated completely.',\n evidence: {\n candidate_pair_count: nearDuplicates.candidatePairCount,\n compared_pair_count: nearDuplicates.comparedPairCount,\n duplicate_pair_count: nearDuplicates.duplicatePairCount,\n },\n })\n } else if (metrics.near_duplicate_page_rate > maxNearDuplicatePageRate) {\n findings.push({\n id: 'kb:near-duplicate-page-rate',\n kind: 'unknown',\n severity: 'error',\n message: 'Near-duplicate page rate exceeds the configured maximum.',\n evidence: {\n near_duplicate_page_rate: metrics.near_duplicate_page_rate,\n near_duplicate_page_count: metrics.near_duplicate_page_count,\n near_duplicate_pair_count: metrics.near_duplicate_pair_count,\n threshold: nearDuplicates.threshold,\n },\n })\n }\n return { ok: findings.length === 0, metrics, nearDuplicates, findings }\n}\n\nfunction sourceRefs(text: string): string[] {\n const refs: string[] = []\n const regex = /\\[\\^([A-Za-z0-9_-]+)(?:#([A-Za-z0-9_.:-]+))?\\]/g\n let match = regex.exec(text)\n while (match !== null) {\n refs.push(match[0])\n match = regex.exec(text)\n }\n return refs\n}\n\nfunction unitInterval(value: number, name: string): number {\n if (!Number.isFinite(value) || value < 0 || value > 1) {\n throw new Error(`${name} must be a finite number in [0, 1]`)\n }\n return value\n}\n","/**\n * Deterministic claim grounding: is a claim present in a text?\n *\n * The check is text presence, not a model call. RAG answer scoring uses it to\n * test whether a generated claim is supported by the retrieved context.\n */\n\nexport interface GroundingResult {\n /** True when the claim is sufficiently present in the page text. */\n grounded: boolean\n /** How the claim matched (or why it didn't). For audit/notes. */\n mode: 'verbatim' | 'normalized' | 'overlap' | 'absent' | 'empty-claim' | 'empty-text'\n /**\n * Fraction of the claim's content words found in the page text. 1 for a\n * verbatim/normalized hit; the measured overlap otherwise.\n */\n overlap: number\n /** Content words present in the claim but NOT in the page text. */\n missingWords: string[]\n}\n\nexport interface GroundClaimOptions {\n /**\n * Minimum fraction of the claim's content words that must appear in the page\n * text to count as a close paraphrase when there is no verbatim/normalized\n * hit. Default 0.7 — a high bar, because a misattribution is exactly a claim\n * whose specific words the page does not contain.\n */\n minOverlap?: number\n /**\n * Content words shorter than this are ignored (drops \"the\", \"of\", \"is\", …)\n * and never count toward overlap. Default 3.\n */\n minWordLength?: number\n}\n\n/**\n * Stopwords stripped before overlap scoring so the bar measures the claim's\n * SUBSTANTIVE words (the numbers, nouns, methods it asserts), not filler a\n * misattributed page would trivially share with the real one.\n */\nconst stopwords = new Set([\n 'the',\n 'a',\n 'an',\n 'and',\n 'or',\n 'but',\n 'of',\n 'to',\n 'in',\n 'on',\n 'for',\n 'with',\n 'as',\n 'by',\n 'at',\n 'from',\n 'that',\n 'this',\n 'these',\n 'those',\n 'it',\n 'its',\n 'is',\n 'are',\n 'was',\n 'were',\n 'be',\n 'been',\n 'being',\n 'has',\n 'have',\n 'had',\n 'can',\n 'will',\n 'would',\n 'should',\n 'may',\n 'might',\n 'not',\n 'no',\n 'than',\n 'then',\n 'over',\n 'under',\n 'about',\n 'into',\n 'their',\n 'they',\n 'them',\n])\n\n/** Normalize for presence checks: lowercase, collapse whitespace + punctuation. */\nfunction normalize(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^\\p{L}\\p{N}\\s]+/gu, ' ')\n .replace(/\\s+/g, ' ')\n .trim()\n}\n\n/** The claim's substantive content words (deduped, stopwords + short words removed). */\nfunction contentWords(claim: string, minWordLength: number): string[] {\n const words = normalize(claim)\n .split(' ')\n .filter((word) => word.length >= minWordLength && !stopwords.has(word))\n return [...new Set(words)]\n}\n\n/**\n * Is `claim` grounded in `pageText`? Deterministic, no model call:\n *\n * 1. verbatim — the claim string appears as-is (case-insensitive).\n * 2. normalized — the claim appears after collapsing punctuation/whitespace\n * on both sides (so \"5.4x\" vs \"5.4 x\", smart quotes, etc. still match).\n * 3. overlap — a close paraphrase: at least `minOverlap` of the claim's\n * substantive content words appear in the page text. A misattributed page\n * fails here because the SPECIFIC words the claim asserts are absent.\n *\n * Returns the match mode, the measured overlap, and the missing content words,\n * so a caller can state why a claim grounded or did not.\n */\nexport function groundClaimInText(\n claim: string,\n pageText: string,\n options: GroundClaimOptions = {},\n): GroundingResult {\n const minOverlap = options.minOverlap ?? 0.7\n const minWordLength = Math.max(1, options.minWordLength ?? 3)\n\n const claimTrimmed = claim.trim()\n if (!claimTrimmed) return { grounded: false, mode: 'empty-claim', overlap: 0, missingWords: [] }\n if (!pageText.trim()) return { grounded: false, mode: 'empty-text', overlap: 0, missingWords: [] }\n\n const haystackLower = pageText.toLowerCase()\n if (haystackLower.includes(claimTrimmed.toLowerCase())) {\n return { grounded: true, mode: 'verbatim', overlap: 1, missingWords: [] }\n }\n\n const haystackNorm = normalize(pageText)\n const claimNorm = normalize(claimTrimmed)\n if (claimNorm && haystackNorm.includes(claimNorm)) {\n return { grounded: true, mode: 'normalized', overlap: 1, missingWords: [] }\n }\n\n const words = contentWords(claimTrimmed, minWordLength)\n if (words.length === 0) {\n // The claim has no substantive content words (all stopwords/short). With no\n // verbatim/normalized hit there is nothing to ground — treat as absent.\n return { grounded: false, mode: 'absent', overlap: 0, missingWords: [] }\n }\n // Word-boundary presence so \"rotary\" does not match inside \"rotaryxyz\".\n const present = words.filter((word) =>\n new RegExp(`\\\\b${word.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\\\b`).test(haystackNorm),\n )\n const missingWords = words.filter((word) => !present.includes(word))\n const overlap = present.length / words.length\n const grounded = overlap >= minOverlap\n return { grounded, mode: grounded ? 'overlap' : 'absent', overlap, missingWords }\n}\n","/**\n * The mean of a set of measurements.\n *\n * A measurement that is not a finite number is not a measurement: it is a\n * scorer that divided by zero or an adapter that answered with nothing usable.\n * Averaging it in would spread one broken probe across the whole aggregate,\n * and carrying it through would make the aggregate itself unusable — a\n * non-finite `scoreMean` fails every numeric comparison in the ranking\n * comparator, so the candidate carrying it falls through to the identifier\n * tie-break and places by name rather than by what it scored. Such values are\n * left out, and the mean reports what was actually measured.\n *\n * An empty set answers `0`. That is a reported score, not an absence, and it\n * is the behavior every caller in this package already depends on.\n */\nexport 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","import { groundClaimInText } from '../claim-grounding'\nimport { mean } from '../statistics'\nimport type {\n RagAnswerEvalArtifact,\n RagAnswerEvalScenario,\n RagAnswerQualityJudgeOptions,\n RagEvalCitation,\n RagEvalClaim,\n RagEvalContext,\n RagRequiredContext,\n} from './contracts'\n\nexport function requiredContextTargets(scenario: RagAnswerEvalScenario): RagRequiredContext[] {\n if (scenario.requiredContext?.length) return [...scenario.requiredContext]\n return (scenario.expectedClaims ?? []).map((text) => ({ text }))\n}\n\nexport function requiredContextTexts(scenario: RagAnswerEvalScenario): string[] {\n return requiredContextTargets(scenario).flatMap((target) => (target.text ? [target.text] : []))\n}\n\nexport function contextMatchesTarget(context: RagEvalContext, target: RagRequiredContext): boolean {\n if (target.id && context.id === target.id) return true\n if (target.pageId && context.pageId === target.pageId) return true\n if (target.sourceId && context.sourceId === target.sourceId) return true\n if (target.anchorId && context.anchorId === target.anchorId) return true\n if (target.text && textSupportScore(target.text, context.text) >= 0.7) return true\n return false\n}\n\nexport function contextIsRelevant(\n context: RagEvalContext,\n scenario: RagAnswerEvalScenario,\n): boolean {\n return contextRelevanceScore(context, scenario) >= 0.3\n}\n\nexport function contextRelevanceScore(\n context: RagEvalContext,\n scenario: RagAnswerEvalScenario,\n): number {\n const targets = [\n scenario.query,\n scenario.referenceAnswer,\n ...(scenario.expectedClaims ?? []),\n ...requiredContextTexts(scenario),\n ].filter((value): value is string => Boolean(value?.trim()))\n if (targets.length === 0) return 1\n return Math.max(...targets.map((target) => textSupportScore(target, context.text)))\n}\n\nexport function claimSupport(\n claim: string,\n contexts: readonly RagEvalContext[],\n options: Pick<RagAnswerQualityJudgeOptions, 'minClaimSupport'>,\n): boolean {\n if (contexts.length === 0) return false\n const combined = contexts.map((context) => context.text).join('\\n\\n')\n const deterministic = groundClaimInText(claim, combined, {\n minOverlap: options.minClaimSupport ?? 0.7,\n })\n return (\n deterministic.grounded || textSupportScore(claim, combined) >= (options.minClaimSupport ?? 0.7)\n )\n}\n\nexport function scoreCitations(\n claims: readonly RagEvalClaim[],\n artifact: RagAnswerEvalArtifact,\n scenario: RagAnswerEvalScenario,\n options: Pick<RagAnswerQualityJudgeOptions, 'minClaimSupport'>,\n): { support: number; citedClaimCount: number; supportedCitationCount: number } {\n if (claims.length === 0)\n return { support: scenario.unanswerable ? 1 : 0, citedClaimCount: 0, supportedCitationCount: 0 }\n const citations = artifact.citations ?? []\n const citedClaims = claims.filter((claim) => citationsForClaim(claim, citations).length > 0)\n if (citedClaims.length === 0) {\n return {\n support: scenario.requireCitations ? 0 : 1,\n citedClaimCount: 0,\n supportedCitationCount: 0,\n }\n }\n let supportedCitationCount = 0\n for (const claim of citedClaims) {\n const citedContexts = contextsForClaim(claim, citations, artifact.contexts)\n if (claimSupport(claim.text, citedContexts, options)) supportedCitationCount += 1\n }\n return {\n support: supportedCitationCount / citedClaims.length,\n citedClaimCount: citedClaims.length,\n supportedCitationCount,\n }\n}\n\nfunction citationsForClaim(\n claim: RagEvalClaim,\n citations: readonly RagEvalCitation[],\n): RagEvalCitation[] {\n const claimCitationIds = new Set(claim.citationIds ?? [])\n return citations.filter((citation) => {\n return citation.claimId === claim.id || (citation.id && claimCitationIds.has(citation.id))\n })\n}\n\nfunction contextsForClaim(\n claim: RagEvalClaim,\n citations: readonly RagEvalCitation[],\n contexts: readonly RagEvalContext[],\n): readonly RagEvalContext[] {\n const matchedCitations = citationsForClaim(claim, citations)\n const matchedContexts = contexts.filter((context) =>\n matchedCitations.some((citation) => {\n if (citation.contextId && citation.contextId === context.id) return true\n if (citation.pageId && citation.pageId === context.pageId) return true\n if (citation.sourceId && citation.sourceId === context.sourceId) return true\n if (citation.anchorId && citation.anchorId === context.anchorId) return true\n return false\n }),\n )\n return matchedContexts.length > 0 ? matchedContexts : contexts\n}\n\nexport function scoreAnswerRelevance(\n artifact: RagAnswerEvalArtifact,\n scenario: RagAnswerEvalScenario,\n abstained: boolean,\n): number {\n if (scenario.unanswerable) return abstained ? 1 : 0\n if (abstained) return 0\n const targets = [\n scenario.referenceAnswer,\n ...(scenario.expectedClaims ?? []),\n scenario.query,\n ].filter((value): value is string => Boolean(value?.trim()))\n return Math.max(...targets.map((target) => textSupportScore(target, artifact.answer)))\n}\n\nexport function scoreAnswerCorrectness(\n artifact: RagAnswerEvalArtifact,\n scenario: RagAnswerEvalScenario,\n abstained: boolean,\n): number {\n if (scenario.unanswerable) return abstained ? 1 : 0\n const expected = scenario.expectedClaims ?? []\n const forbidden = scenario.forbiddenClaims ?? []\n const expectedScore =\n expected.length === 0\n ? scoreAnswerRelevance(artifact, scenario, abstained)\n : mean(expected.map((claim) => textSupportScore(claim, artifact.answer)))\n const forbiddenPenalty =\n forbidden.length === 0\n ? 0\n : forbidden.filter((claim) => textSupportScore(claim, artifact.answer) >= 0.7).length /\n forbidden.length\n return clamp01(expectedScore * (1 - forbiddenPenalty))\n}\n\nexport function normalizeClaims(artifact: RagAnswerEvalArtifact): RagEvalClaim[] {\n if (artifact.claims?.length) return [...artifact.claims]\n return splitSentences(artifact.answer).map((text, index) => ({ id: `claim-${index + 1}`, text }))\n}\n\nfunction splitSentences(text: string): string[] {\n return text\n .split(/(?<=[.!?])\\s+/)\n .map((sentence) => sentence.trim())\n .filter((sentence) => sentence.length > 0 && !looksLikeAbstention(sentence))\n}\n\nexport function looksLikeAbstention(answer: string): boolean {\n const normalized = answer.toLowerCase()\n return [\n \"i don't know\",\n 'i do not know',\n 'not enough information',\n 'cannot answer',\n \"can't answer\",\n 'insufficient information',\n 'no reliable answer',\n ].some((phrase) => normalized.includes(phrase))\n}\n\nfunction textSupportScore(needle: string, haystack: string): number {\n const needleWords = contentWords(needle)\n if (needleWords.length === 0) return 0\n const haystackWords = new Set(contentWords(haystack))\n const present = needleWords.filter((word) => haystackWords.has(word))\n return present.length / needleWords.length\n}\n\nfunction contentWords(text: string): string[] {\n const normalized = text\n .toLowerCase()\n .replace(/[^\\p{L}\\p{N}\\s]+/gu, ' ')\n .split(/\\s+/)\n .map((word) => stem(word.trim()))\n .filter((word) => (word.length >= 3 || /^\\d+$/.test(word)) && !stopwords.has(word))\n return [...new Set(normalized)]\n}\n\nfunction stem(word: string): string {\n if (word.endsWith('ies') && word.length > 4) return `${word.slice(0, -3)}y`\n if (word.endsWith('ing') && word.length > 5) return word.slice(0, -3)\n if (word.endsWith('ed') && word.length > 4) return word.slice(0, -2)\n if (word.endsWith('s') && word.length > 3) return word.slice(0, -1)\n return word\n}\n\nexport function neutralScore(condition: boolean): number {\n return condition ? 1 : 0\n}\n\nexport function clamp01(value: number): number {\n if (!Number.isFinite(value)) return 0\n return Math.max(0, Math.min(1, value))\n}\n\nconst stopwords = new Set([\n 'the',\n 'a',\n 'an',\n 'and',\n 'or',\n 'but',\n 'of',\n 'to',\n 'in',\n 'on',\n 'for',\n 'with',\n 'as',\n 'by',\n 'at',\n 'from',\n 'that',\n 'this',\n 'these',\n 'those',\n 'it',\n 'its',\n 'is',\n 'are',\n 'was',\n 'were',\n 'be',\n 'been',\n 'being',\n 'has',\n 'have',\n 'had',\n 'can',\n 'will',\n 'would',\n 'should',\n 'may',\n 'might',\n 'not',\n 'no',\n 'than',\n 'then',\n 'over',\n 'under',\n 'about',\n 'into',\n 'their',\n 'they',\n 'them',\n 'what',\n 'when',\n 'where',\n 'who',\n 'why',\n 'how',\n])\n","import { clamp01, normalizeClaims, requiredContextTexts } from './answer'\nimport type { ExternalRagEvalScore, RagAnswerEvalCase, RagEvalMetricKey } from './contracts'\n\nconst metricAliases: Record<string, RagEvalMetricKey> = {\n answer_correctness: 'answer_correctness',\n answer_relevance: 'answer_relevance',\n answer_relevancy: 'answer_relevance',\n answerrelevancy: 'answer_relevance',\n context_precision: 'context_precision',\n context_recall: 'context_recall',\n context_relevance: 'context_relevance',\n context_relevancy: 'context_relevance',\n context_sufficiency: 'context_sufficiency',\n contextual_precision: 'context_precision',\n contextual_recall: 'context_recall',\n contextual_relevancy: 'context_relevance',\n faithfulness: 'faithfulness',\n groundedness: 'groundedness',\n claim_recall: 'context_recall',\n claim_precision: 'faithfulness',\n citation_support: 'citation_support',\n abstention: 'abstention',\n unsupported_answer_rate: 'unsupported_answer_rate',\n}\n\nexport function normalizeExternalRagScores(\n scores: readonly ExternalRagEvalScore[],\n): Record<string, Record<RagEvalMetricKey, number>> {\n const normalized: Record<string, Record<RagEvalMetricKey, number>> = {}\n for (const item of scores) {\n const provider = item.provider || 'custom'\n const providerScores = (normalized[provider] ?? {}) as Record<RagEvalMetricKey, number>\n for (const [key, value] of Object.entries(item.scores)) {\n const canonical = metricAliases[normalizeMetricName(key)]\n if (!canonical) continue\n if (Number.isFinite(value)) providerScores[canonical] = clamp01(value)\n }\n normalized[provider] = providerScores\n }\n return normalized\n}\n\nexport function toRagasEvaluationRows(cases: readonly RagAnswerEvalCase[]) {\n return cases.map(({ scenario, artifact }) => ({\n user_input: scenario.query,\n response: artifact.answer,\n retrieved_contexts: artifact.contexts.map((context) => context.text),\n reference: scenario.referenceAnswer,\n reference_contexts: requiredContextTexts(scenario),\n }))\n}\n\nexport function toDeepEvalTestCases(cases: readonly RagAnswerEvalCase[]) {\n return cases.map(({ scenario, artifact }) => ({\n input: scenario.query,\n actual_output: artifact.answer,\n expected_output: scenario.referenceAnswer,\n retrieval_context: artifact.contexts.map((context) => context.text),\n context: requiredContextTexts(scenario),\n }))\n}\n\nexport function toTruLensRecords(cases: readonly RagAnswerEvalCase[]) {\n return cases.map(({ scenario, artifact }) => ({\n input: scenario.query,\n output: artifact.answer,\n context: artifact.contexts.map((context) => context.text).join('\\n\\n'),\n }))\n}\n\nexport function toRagCheckerRecords(cases: readonly RagAnswerEvalCase[]) {\n return cases.map(({ scenario, artifact }) => ({\n query_id: scenario.id,\n query: scenario.query,\n gt_answer: scenario.referenceAnswer,\n response: artifact.answer,\n retrieved_context: artifact.contexts.map((context) => ({\n doc_id: context.id,\n text: context.text,\n })),\n claims: normalizeClaims(artifact).map((claim) => claim.text),\n }))\n}\n\nfunction normalizeMetricName(metric: string): string {\n return metric\n .trim()\n .toLowerCase()\n .replace(/[@/.-]+/g, '_')\n .replace(/\\s+/g, '_')\n}\n","import type { JudgeConfig } from '@tangle-network/agent-eval/campaign'\nimport type { RagGapFinding } from '../rag-improvement-loop'\nimport { mean } from '../statistics'\nimport {\n claimSupport,\n clamp01,\n contextIsRelevant,\n contextMatchesTarget,\n contextRelevanceScore,\n looksLikeAbstention,\n neutralScore,\n normalizeClaims,\n requiredContextTargets,\n scoreAnswerCorrectness,\n scoreAnswerRelevance,\n scoreCitations,\n} from './answer'\nimport type {\n RagAnswerEvalArtifact,\n RagAnswerEvalScenario,\n RagAnswerMetricSummary,\n RagAnswerQualityJudgeOptions,\n RagEvalMetricKey,\n} from './contracts'\nimport { normalizeExternalRagScores } from './providers'\n\nconst defaultThresholds: Partial<Record<RagEvalMetricKey, number>> = {\n context_precision: 0.5,\n context_recall: 0.8,\n context_relevance: 0.5,\n context_sufficiency: 0.8,\n faithfulness: 0.9,\n answer_relevance: 0.7,\n citation_support: 0.9,\n abstention: 1,\n unsupported_answer_rate: 0,\n}\n\nconst defaultWeights: Partial<Record<RagEvalMetricKey, number>> = {\n context_relevance: 1,\n context_sufficiency: 1,\n faithfulness: 2,\n answer_relevance: 1,\n citation_support: 1,\n abstention: 1,\n}\n\nexport function ragAnswerQualityJudge(\n options: RagAnswerQualityJudgeOptions = {},\n): JudgeConfig<RagAnswerEvalArtifact, RagAnswerEvalScenario> {\n return {\n name: options.name ?? 'rag-answer-quality',\n dimensions: [\n { key: 'context_precision', description: 'share of retrieved context that is useful' },\n { key: 'context_recall', description: 'share of required evidence present in context' },\n { key: 'context_relevance', description: 'context relevance to the query and answer target' },\n { key: 'context_sufficiency', description: 'whether context is enough to answer' },\n { key: 'faithfulness', description: 'share of answer claims supported by retrieved context' },\n { key: 'answer_relevance', description: 'answer addresses the user query' },\n { key: 'answer_correctness', description: 'answer contains expected claims' },\n { key: 'citation_support', description: 'citations support the claims they cite' },\n { key: 'abstention', description: 'answer abstains exactly when the case is unanswerable' },\n ],\n appliesTo: (scenario) => scenario.kind === 'rag-answer-eval',\n async score({ artifact, scenario }) {\n const summary = scoreRagAnswerArtifact(artifact, scenario, options)\n return {\n dimensions: summary.metrics,\n composite: summary.composite,\n notes: summary.findings.map((finding) => finding.message).join('; '),\n }\n },\n }\n}\n\nexport function scoreRagAnswerArtifact(\n artifact: RagAnswerEvalArtifact,\n scenario: RagAnswerEvalScenario,\n options: RagAnswerQualityJudgeOptions = {},\n): RagAnswerMetricSummary {\n const claims = normalizeClaims(artifact)\n const abstained = artifact.abstained ?? looksLikeAbstention(artifact.answer)\n const requiredTargets = requiredContextTargets(scenario)\n const matchedRequiredContextCount = requiredTargets.filter((target) =>\n artifact.contexts.some((context) => contextMatchesTarget(context, target)),\n ).length\n const requiredContextCount = requiredTargets.length\n const contextRecall =\n requiredContextCount === 0\n ? neutralScore(Boolean(scenario.unanswerable) || artifact.contexts.length > 0)\n : matchedRequiredContextCount / requiredContextCount\n const relevantContextCount = artifact.contexts.filter((context) =>\n contextIsRelevant(context, scenario),\n ).length\n const contextPrecision =\n artifact.contexts.length === 0\n ? scenario.unanswerable\n ? 1\n : 0\n : relevantContextCount / artifact.contexts.length\n const contextRelevance =\n artifact.contexts.length === 0\n ? scenario.unanswerable\n ? 1\n : 0\n : mean(artifact.contexts.map((context) => contextRelevanceScore(context, scenario)))\n const contextSufficiency = requiredContextCount === 0 ? contextRelevance : contextRecall\n const support = claims.map((claim) => claimSupport(claim.text, artifact.contexts, options))\n const supportedClaimCount = support.filter(Boolean).length\n const faithfulness =\n claims.length === 0 ? (abstained ? 1 : 0) : supportedClaimCount / Math.max(1, claims.length)\n const citation = scoreCitations(claims, artifact, scenario, options)\n const answerRelevance = scoreAnswerRelevance(artifact, scenario, abstained)\n const answerCorrectness = scoreAnswerCorrectness(artifact, scenario, abstained)\n const abstention = scenario.unanswerable ? (abstained ? 1 : 0) : abstained ? 0 : 1\n const unsupportedAnswerRate =\n claims.length === 0 ? (abstained ? 0 : 1) : 1 - supportedClaimCount / Math.max(1, claims.length)\n\n const deterministicMetrics: Record<RagEvalMetricKey, number> = {\n context_precision: clamp01(contextPrecision),\n context_recall: clamp01(contextRecall),\n context_relevance: clamp01(contextRelevance),\n context_sufficiency: clamp01(contextSufficiency),\n faithfulness: clamp01(faithfulness),\n groundedness: clamp01(faithfulness),\n answer_relevance: clamp01(answerRelevance),\n answer_correctness: clamp01(answerCorrectness),\n citation_support: clamp01(citation.support),\n abstention: clamp01(abstention),\n unsupported_answer_rate: clamp01(unsupportedAnswerRate),\n }\n const providerScores = normalizeExternalRagScores(artifact.externalScores ?? [])\n const metrics = mergeMetrics(deterministicMetrics, providerScores, options.externalScorePolicy)\n const thresholds = { ...defaultThresholds, ...scenario.thresholds, ...options.thresholds }\n const findings = diagnoseRagAnswerFailure(metrics, scenario, thresholds)\n const composite = weightedComposite(metrics, options.weights ?? defaultWeights)\n\n return {\n metrics,\n composite,\n passed: findings.every(\n (finding) => finding.severity !== 'error' && finding.severity !== 'critical',\n ),\n findings,\n claimCount: claims.length,\n supportedClaimCount,\n citedClaimCount: citation.citedClaimCount,\n supportedCitationCount: citation.supportedCitationCount,\n matchedRequiredContextCount,\n requiredContextCount,\n providerScores,\n }\n}\n\nexport function diagnoseRagAnswerFailure(\n metrics: Record<RagEvalMetricKey, number>,\n scenario: RagAnswerEvalScenario,\n thresholds: Partial<Record<RagEvalMetricKey, number>> = defaultThresholds,\n): RagGapFinding[] {\n const findings: RagGapFinding[] = []\n if (below(metrics.context_recall, thresholds.context_recall)) {\n findings.push({\n id: `${scenario.id}:context-recall`,\n kind: scenario.slices?.includes('multi-source')\n ? 'missing-multihop-evidence'\n : 'retrieval-miss',\n severity: 'error',\n scenarioId: scenario.id,\n message: 'Required evidence was not present in retrieved context.',\n evidence: { context_recall: metrics.context_recall },\n })\n }\n if (below(metrics.context_precision, thresholds.context_precision)) {\n findings.push({\n id: `${scenario.id}:context-precision`,\n kind: 'retrieval-noise',\n severity: 'warning',\n scenarioId: scenario.id,\n message: 'Retrieved context contains too much irrelevant material.',\n evidence: { context_precision: metrics.context_precision },\n })\n }\n if (below(metrics.faithfulness, thresholds.faithfulness)) {\n findings.push({\n id: `${scenario.id}:faithfulness`,\n kind: 'generator-unsupported-claim',\n severity: 'error',\n scenarioId: scenario.id,\n message: 'The answer contains claims not supported by retrieved context.',\n evidence: { faithfulness: metrics.faithfulness },\n })\n }\n if (below(metrics.citation_support, thresholds.citation_support)) {\n findings.push({\n id: `${scenario.id}:citation-support`,\n kind: 'citation-mismatch',\n severity: 'error',\n scenarioId: scenario.id,\n message: 'Citations do not support the claims they are attached to.',\n evidence: { citation_support: metrics.citation_support },\n })\n }\n if (below(metrics.abstention, thresholds.abstention)) {\n findings.push({\n id: `${scenario.id}:abstention`,\n kind: 'incorrect-abstention',\n severity: 'error',\n scenarioId: scenario.id,\n message: scenario.unanswerable\n ? 'The system answered a case marked unanswerable.'\n : 'The system abstained from an answerable case.',\n evidence: { abstention: metrics.abstention },\n })\n }\n return findings\n}\n\nfunction mergeMetrics(\n deterministic: Record<RagEvalMetricKey, number>,\n providerScores: Record<string, Record<RagEvalMetricKey, number>>,\n policy: RagAnswerQualityJudgeOptions['externalScorePolicy'] = 'prefer-external',\n): Record<RagEvalMetricKey, number> {\n if (policy === 'deterministic-first') return deterministic\n const merged = { ...deterministic }\n for (const scores of Object.values(providerScores)) {\n for (const [key, value] of Object.entries(scores) as Array<[RagEvalMetricKey, number]>) {\n merged[key] = value\n if (key === 'groundedness') merged.faithfulness = value\n if (key === 'faithfulness') merged.groundedness = value\n }\n }\n return merged\n}\n\nexport function aggregateRagAnswerMetrics(\n summaries: readonly RagAnswerMetricSummary[],\n): Record<string, number> {\n const keys = new Set<RagEvalMetricKey>()\n for (const summary of summaries) {\n for (const key of Object.keys(summary.metrics) as RagEvalMetricKey[]) keys.add(key)\n }\n const out: Record<string, number> = {}\n for (const key of [...keys].sort()) {\n out[key] = mean(summaries.map((summary) => summary.metrics[key]))\n }\n out.composite = mean(summaries.map((summary) => summary.composite))\n return out\n}\n\nfunction weightedComposite(\n metrics: Record<RagEvalMetricKey, number>,\n weights: Partial<Record<RagEvalMetricKey, number>>,\n): number {\n let weighted = 0\n let total = 0\n for (const [key, weight] of Object.entries(weights) as Array<[RagEvalMetricKey, number]>) {\n if (!Number.isFinite(weight) || weight <= 0) continue\n const metric = metrics[key]\n if (!Number.isFinite(metric)) continue\n const value = key === 'unsupported_answer_rate' ? 1 - metric : metric\n weighted += value * weight\n total += weight\n }\n return total === 0 ? 0 : weighted / total\n}\n\nfunction below(metric: number, threshold: number | undefined): boolean {\n return threshold !== undefined && metric < threshold\n}\n","import type {\n DispatchContext,\n JudgeConfig,\n OptimizationMethod,\n} from '@tangle-network/agent-eval/campaign'\nimport type { AgentCandidateJsonValue as JsonValue } from '@tangle-network/agent-interface'\nimport {\n jsonObjectCandidateCodec,\n type RunSerializedKnowledgeOptimizationOptions,\n type RunSerializedKnowledgeOptimizationResult,\n runSerializedKnowledgeOptimization,\n scenarioContentFingerprint,\n} from './optimization'\nimport type { RagAnswerEvalArtifact, RagAnswerEvalScenario } from './rag-eval'\nimport { ragAnswerQualityJudge } from './rag-eval'\n\nexport type RagOptimizationConfig = Record<string, JsonValue>\n\ntype RagOptimizationBaseOptions = Omit<\n RunSerializedKnowledgeOptimizationOptions<\n RagOptimizationConfig,\n RagAnswerEvalScenario,\n RagAnswerEvalArtifact\n >,\n | 'baseline'\n | 'method'\n | 'trainScenarios'\n | 'selectionScenarios'\n | 'finalScenarios'\n | 'dispatchCandidate'\n | 'judges'\n | 'codec'\n | 'scenarioFingerprint'\n>\n\nexport interface RunRagOptimizationOptions extends RagOptimizationBaseOptions {\n baseline: RagOptimizationConfig\n method: OptimizationMethod<RagAnswerEvalScenario, RagAnswerEvalArtifact>\n trainScenarios: readonly RagAnswerEvalScenario[]\n selectionScenarios: readonly RagAnswerEvalScenario[]\n finalScenarios: readonly RagAnswerEvalScenario[]\n run(input: {\n config: RagOptimizationConfig\n configSurface: string\n configSurfaceHash: string\n scenario: RagAnswerEvalScenario\n context: DispatchContext\n }): Promise<RagAnswerEvalArtifact>\n judges?: readonly JudgeConfig<RagAnswerEvalArtifact, RagAnswerEvalScenario>[]\n}\n\nexport interface RunRagOptimizationResult\n extends RunSerializedKnowledgeOptimizationResult<RagOptimizationConfig> {\n baselineConfig: RagOptimizationConfig\n winnerConfig: RagOptimizationConfig\n trainScenarios: readonly RagAnswerEvalScenario[]\n selectionScenarios: readonly RagAnswerEvalScenario[]\n finalScenarios: readonly RagAnswerEvalScenario[]\n}\n\n/** Optimizes retrieval and answer behavior together as one serialized RAG configuration. */\nexport async function runRagOptimization(\n options: RunRagOptimizationOptions,\n): Promise<RunRagOptimizationResult> {\n const {\n baseline,\n method,\n trainScenarios,\n selectionScenarios,\n finalScenarios,\n run,\n judges,\n ...runOptions\n } = options\n const result = await runSerializedKnowledgeOptimization({\n ...runOptions,\n baseline,\n method,\n trainScenarios,\n selectionScenarios,\n finalScenarios,\n codec: jsonObjectCandidateCodec<RagOptimizationConfig>(),\n judges: [...(judges ?? [ragAnswerQualityJudge()])],\n scenarioFingerprint: scenarioContentFingerprint,\n dispatchCandidate: ({ candidate, candidateSurface, candidateSurfaceHash, scenario, context }) =>\n run({\n config: candidate,\n configSurface: candidateSurface,\n configSurfaceHash: candidateSurfaceHash,\n scenario,\n context,\n }),\n })\n return {\n ...result,\n baselineConfig: result.baseline.value,\n winnerConfig: result.winner.value,\n trainScenarios: [...trainScenarios],\n selectionScenarios: [...selectionScenarios],\n finalScenarios: [...finalScenarios],\n }\n}\n","import { stableId } from './ids'\nimport type { KnowledgeEvent, KnowledgeEventType } from './types'\n\nexport interface KnowledgeEventQuery {\n type?: KnowledgeEventType\n target?: string\n limit?: number\n}\n\nexport function createKnowledgeEvent(input: {\n type: KnowledgeEventType\n actor?: string\n target?: string\n metadata?: Record<string, unknown>\n now?: () => Date\n}): KnowledgeEvent {\n const createdAt = (input.now ?? (() => new Date()))().toISOString()\n return {\n id: stableId(\n 'evt',\n `${input.type}:${input.target ?? ''}:${createdAt}:${JSON.stringify(input.metadata ?? {})}`,\n ),\n type: input.type,\n createdAt,\n // An absent optional is omitted, never written as `undefined`. An event\n // reaches canonical JSON — through a control-loop state fingerprint and\n // through the event log — and that encoder refuses a key with no value.\n ...(input.actor === undefined ? {} : { actor: input.actor }),\n ...(input.target === undefined ? {} : { target: input.target }),\n ...(input.metadata === undefined ? {} : { metadata: input.metadata }),\n }\n}\n","import {\n acquisitionPlansForKnowledgeGaps,\n type DataAcquisitionPlan,\n type KnowledgeAcquisitionMode,\n type KnowledgeBundle,\n type KnowledgeFreshness,\n type KnowledgeImportance,\n type KnowledgeReadinessReport,\n type KnowledgeRequirement,\n type KnowledgeRequirementCategory,\n type KnowledgeSensitivity,\n scoreKnowledgeReadiness,\n type UserQuestion,\n userQuestionsForKnowledgeGaps,\n} from '@tangle-network/agent-eval'\nimport { buildKnowledgeLexicalIndex } from './lexical-index'\nimport { stringMetadata } from './metadata'\nimport { searchKnowledge } from './search'\nimport type { KnowledgeIndex, KnowledgeSearchResult } from './types'\n\nexport interface KnowledgeReadinessSpec {\n id: string\n description: string\n query: string\n requiredFor: string[]\n category: KnowledgeRequirementCategory\n acquisitionMode: KnowledgeAcquisitionMode\n importance: KnowledgeImportance\n freshness: KnowledgeFreshness\n sensitivity: KnowledgeSensitivity\n confidenceNeeded: number\n fallbackPolicy?: KnowledgeRequirement['fallbackPolicy']\n minSources?: number\n minHits?: number\n metadata?: Record<string, unknown>\n}\n\n/**\n * Defaults applied by `defineReadinessSpec` when the caller omits the field.\n *\n * These are deliberately conservative: a domain-specific topic that an agent\n * needs grounded to a high-confidence threshold from at least one authoritative\n * source. Override any field to specialise (e.g. `freshness: 'daily'` for a\n * topic that must reflect today's regulatory state).\n */\nexport const READINESS_SPEC_DEFAULTS = {\n category: 'domain_specific',\n acquisitionMode: 'search_web',\n importance: 'high',\n freshness: 'monthly',\n sensitivity: 'public',\n confidenceNeeded: 0.7,\n minSources: 1,\n minHits: 2,\n} as const satisfies Pick<\n KnowledgeReadinessSpec,\n | 'category'\n | 'acquisitionMode'\n | 'importance'\n | 'freshness'\n | 'sensitivity'\n | 'confidenceNeeded'\n | 'minSources'\n | 'minHits'\n>\n\n/**\n * Inputs accepted by `defineReadinessSpec`. The four fields the caller cannot\n * sanely default (id, description, query, requiredFor) are required; everything\n * else is optional and pulls from `READINESS_SPEC_DEFAULTS`.\n */\nexport type DefineReadinessSpecInput = Pick<\n KnowledgeReadinessSpec,\n 'id' | 'description' | 'query' | 'requiredFor'\n> &\n Partial<Omit<KnowledgeReadinessSpec, 'id' | 'description' | 'query' | 'requiredFor'>>\n\n/**\n * Builder that returns a fully-typed `KnowledgeReadinessSpec` from a slim input.\n *\n * Motivation: `KnowledgeReadinessSpec` has eleven required fields. Most of them\n * (category, acquisition mode, importance, freshness, sensitivity, confidence\n * threshold, source/hit minima) have a clear default for domain-specific KB\n * topics — agents end up copy-pasting the same boilerplate across every spec.\n * This helper collapses that boilerplate while keeping every field overridable.\n *\n * @example\n * defineReadinessSpec({\n * id: 'coop/intent-grounding',\n * description: 'Required grounding for coop pack intent stage',\n * query: 'flock size space ventilation predator',\n * requiredFor: ['IntentIntakeAgent', 'requirements'],\n * })\n *\n * @example // override defaults where the topic demands it\n * defineReadinessSpec({\n * id: 'medical/dosing',\n * description: 'Dosing guidance for compounding pharmacy',\n * query: 'compounding dose schedule',\n * requiredFor: ['DosingAgent'],\n * importance: 'blocking',\n * freshness: 'daily',\n * sensitivity: 'private',\n * confidenceNeeded: 0.95,\n * minSources: 3,\n * })\n */\nexport function defineReadinessSpec(input: DefineReadinessSpecInput): KnowledgeReadinessSpec {\n return {\n ...READINESS_SPEC_DEFAULTS,\n ...input,\n }\n}\n\nexport interface BuildEvalKnowledgeBundleOptions {\n taskId: string\n index: KnowledgeIndex\n specs: KnowledgeReadinessSpec[]\n userAnswers?: Record<string, string>\n searchLimit?: number\n metadata?: Record<string, unknown>\n now?: Date\n}\n\nexport interface EvalKnowledgeBundleBuildResult {\n bundle: KnowledgeBundle\n report: KnowledgeReadinessReport\n requirements: KnowledgeRequirement[]\n searchResultsByRequirement: Record<string, KnowledgeSearchResult[]>\n questions: UserQuestion[]\n acquisitionPlans: DataAcquisitionPlan[]\n}\n\nexport function buildEvalKnowledgeBundle(\n options: BuildEvalKnowledgeBundleOptions,\n): EvalKnowledgeBundleBuildResult {\n const searchLimit = options.searchLimit ?? 5\n const now = options.now ?? new Date()\n const lexicalIndex = options.specs.some((spec) => spec.query.trim() !== '')\n ? buildKnowledgeLexicalIndex(options.index.pages)\n : undefined\n const searchResultsByRequirement: Record<string, KnowledgeSearchResult[]> = {}\n const requirements = options.specs.map((spec) => {\n const results = searchKnowledge(options.index, spec.query, { limit: searchLimit, lexicalIndex })\n searchResultsByRequirement[spec.id] = results\n return requirementFromSearch(options.index, spec, results, now)\n })\n const report = scoreKnowledgeReadiness({\n taskId: options.taskId,\n requirements,\n now,\n userAnswers: options.userAnswers,\n evidenceIds: requirements.flatMap((requirement) => requirement.evidenceIds),\n claimIds: [],\n wikiPageIds: unique(\n requirements.flatMap((requirement) =>\n pageIdsFromResults(searchResultsByRequirement[requirement.id] ?? []),\n ),\n ),\n metadata: options.metadata,\n })\n const questions = userQuestionsForKnowledgeGaps(report.blockingMissingRequirements)\n const acquisitionPlans = acquisitionPlansForKnowledgeGaps([\n ...report.blockingMissingRequirements,\n ...report.nonBlockingGaps,\n ])\n\n return {\n bundle: report.bundle,\n report,\n requirements,\n searchResultsByRequirement,\n questions,\n acquisitionPlans,\n }\n}\n\nfunction requirementFromSearch(\n index: KnowledgeIndex,\n spec: KnowledgeReadinessSpec,\n results: KnowledgeSearchResult[],\n now: Date,\n): KnowledgeRequirement {\n const hitCount = results.length\n const sourceIds = unique(results.flatMap((result) => result.page.sourceIds))\n const sources = index.sources.filter((source) => sourceIds.includes(source.id))\n const bestScore = results[0]?.normalizedScore ?? 0\n const sourceCoverage = spec.minSources\n ? Math.min(1, sourceIds.length / spec.minSources)\n : sourceIds.length > 0\n ? 1\n : 0\n const hitCoverage = spec.minHits ? Math.min(1, hitCount / spec.minHits) : hitCount > 0 ? 1 : 0\n const freshness = sourceFreshness(sources, now)\n const currentConfidence = round(Math.min(bestScore, sourceCoverage, hitCoverage, freshness.score))\n // Omit unknown bounds rather than encoding undefined in canonical records.\n const freshnessFields = {\n ...(freshness.validUntil === undefined ? {} : { validUntil: freshness.validUntil }),\n ...(freshness.lastVerifiedAt === undefined ? {} : { lastVerifiedAt: freshness.lastVerifiedAt }),\n }\n\n return {\n id: spec.id,\n description: spec.description,\n requiredFor: spec.requiredFor,\n category: spec.category,\n acquisitionMode: spec.acquisitionMode,\n importance: spec.importance,\n freshness: spec.freshness,\n sensitivity: spec.sensitivity,\n confidenceNeeded: spec.confidenceNeeded,\n currentConfidence,\n ...freshnessFields,\n evidenceIds: unique([\n ...sourceIds.map((sourceId) => `source:${sourceId}`),\n ...results.map((result) => `page:${result.page.id}`),\n ]),\n fallbackPolicy:\n spec.fallbackPolicy ?? (spec.importance === 'blocking' ? 'block' : 'continue_with_caveat'),\n metadata: {\n ...spec.metadata,\n query: spec.query,\n hitCount,\n sourceCount: sourceIds.length,\n bestNormalizedScore: bestScore,\n expiredSourceIds: freshness.expiredSourceIds,\n freshnessScore: freshness.score,\n // Retain legacy diagnostic aliases. Eval uses the typed fields above.\n ...freshnessFields,\n },\n }\n}\n\nfunction sourceFreshness(\n sources: KnowledgeIndex['sources'],\n now: Date,\n): { score: number; validUntil?: string; lastVerifiedAt?: string; expiredSourceIds: string[] } {\n if (sources.length === 0) return { score: 0, expiredSourceIds: [] }\n const validUntilValues = sources\n .map(\n (source) =>\n source.validUntil ??\n stringMetadata(source.metadata, 'validUntil') ??\n stringMetadata(source.metadata, 'expiresAt'),\n )\n .filter(isIsoDate)\n const lastVerifiedValues = sources\n .map((source) => source.lastVerifiedAt ?? stringMetadata(source.metadata, 'lastVerifiedAt'))\n .filter(isIsoDate)\n const expiredSourceIds = sources\n .filter((source) => {\n const validUntil =\n source.validUntil ??\n stringMetadata(source.metadata, 'validUntil') ??\n stringMetadata(source.metadata, 'expiresAt')\n return validUntil ? Date.parse(validUntil) <= now.getTime() : false\n })\n .map((source) => source.id)\n return {\n score: expiredSourceIds.length > 0 ? 0 : 1,\n validUntil: earliestIso(validUntilValues),\n lastVerifiedAt: latestIso(lastVerifiedValues),\n expiredSourceIds,\n }\n}\n\nfunction isIsoDate(value: string | undefined): value is string {\n return Boolean(value && Number.isFinite(Date.parse(value)))\n}\n\nfunction earliestIso(values: string[]): string | undefined {\n return values.sort((a, b) => Date.parse(a) - Date.parse(b))[0]\n}\n\nfunction latestIso(values: string[]): string | undefined {\n return values.sort((a, b) => Date.parse(b) - Date.parse(a))[0]\n}\n\nfunction pageIdsFromResults(results: KnowledgeSearchResult[]): string[] {\n return results.map((result) => result.page.id)\n}\n\nfunction unique<T>(items: T[]): T[] {\n return [...new Set(items)]\n}\n\nfunction round(value: number): number {\n return Math.round(value * 1000) / 1000\n}\n","import {\n type BuildEvalKnowledgeBundleOptions,\n buildEvalKnowledgeBundle,\n type EvalKnowledgeBundleBuildResult,\n type KnowledgeReadinessSpec,\n} from './eval-readiness'\nimport type { KnowledgeBaseQualityOptions } from './rag-eval'\nimport { scoreValidatedKnowledgeBaseIndex } from './rag-eval/knowledge-base'\nimport type { KnowledgeIndex } from './types'\nimport { prepareKnowledgeValidation, type ValidateKnowledgeOptions } from './validate'\n\n/**\n * The subset of a research-loop options object the readiness gate needs:\n * the goal (default task id), the readiness specs, an optional task-id\n * override, and the rest of the bundle options minus the fields this helper\n * supplies (`taskId`/`index`/`specs`).\n *\n * The research-loop options shape satisfies this structurally.\n */\nexport interface ReadinessGateOptions {\n goal: string\n readinessSpecs?: readonly KnowledgeReadinessSpec[]\n readinessTaskId?: string\n readiness?: Omit<BuildEvalKnowledgeBundleOptions, 'taskId' | 'index' | 'specs'>\n}\n\n/**\n * Build the readiness bundle for a loop run over the given index, or\n * `undefined` when no readiness specs are configured (no gate to report).\n */\nexport function readinessFor(\n options: ReadinessGateOptions,\n index: KnowledgeIndex,\n): EvalKnowledgeBundleBuildResult | undefined {\n if (!options.readinessSpecs?.length) return undefined\n return buildEvalKnowledgeBundle({\n ...(options.readiness ?? {}),\n taskId: options.readinessTaskId ?? options.goal,\n index,\n specs: [...options.readinessSpecs],\n })\n}\n\n/** Assess one index without repeating lint/schema work for its two policy gates. */\nexport function assessKnowledgeIndex(\n options: ReadinessGateOptions & {\n strict?: ValidateKnowledgeOptions['strict']\n kbQuality?: KnowledgeBaseQualityOptions\n },\n index: KnowledgeIndex,\n) {\n const prepared = prepareKnowledgeValidation(index)\n const validation = prepared.validate({ strict: options.strict })\n const readiness = readinessFor(options, index)\n const qualityOptions = { strict: options.strict, ...options.kbQuality }\n const qualityValidation =\n Boolean(qualityOptions.strict) === Boolean(options.strict)\n ? validation\n : prepared.validate(qualityOptions)\n return {\n validation,\n readiness,\n kbQuality: scoreValidatedKnowledgeBaseIndex(index, qualityOptions, qualityValidation),\n }\n}\n","import {\n blockingKnowledgeEval,\n type ControlEvalResult,\n type ControlRuntimeConfig,\n canonicalJson,\n objectiveEval,\n} from '@tangle-network/agent-eval'\nimport type {\n BuildEvalKnowledgeBundleOptions,\n EvalKnowledgeBundleBuildResult,\n KnowledgeReadinessSpec,\n} from './eval-readiness'\nimport { createKnowledgeEvent } from './events'\nimport { buildKnowledgeIndex } from './indexer'\nimport { type ApplyWriteBlocksResult, applyKnowledgeWriteBlocks } from './proposals'\nimport { readinessFor } from './readiness-helpers'\nimport {\n type AddSourceOptions,\n type AddSourceTextInput,\n addSourcePath,\n addSourceText,\n} from './sources'\nimport { initKnowledgeBase } from './store'\nimport type { KnowledgeEvent, KnowledgeIndex, KnowledgeLintFinding, SourceRecord } from './types'\nimport {\n prepareKnowledgeValidation,\n type ValidateKnowledgeOptions,\n type ValidateKnowledgeResult,\n} from './validate'\n\nexport interface KnowledgeResearchLoopContext {\n root: string\n goal: string\n iteration: number\n index: KnowledgeIndex\n lintFindings: KnowledgeLintFinding[]\n validation: ValidateKnowledgeResult\n readiness?: EvalKnowledgeBundleBuildResult\n previousSteps: KnowledgeResearchLoopStep[]\n signal?: AbortSignal\n}\n\nexport interface KnowledgeResearchLoopDecision {\n /**\n * Free-form notes from the researcher. Keep this human-readable; products can\n * store it as the research transcript.\n */\n notes?: string\n /**\n * Local files to register as immutable sources before applying proposals.\n */\n sourcePaths?: string[]\n /**\n * Textual source artifacts discovered by an agent, browser worker, connector,\n * or deep-research process.\n */\n sourceTexts?: AddSourceTextInput[]\n /**\n * Safe write protocol text. The loop parses and applies only accepted\n * `---FILE: knowledge/...---` blocks.\n */\n proposalText?: string\n /**\n * The researcher decides when the wiki is good enough. The loop deliberately\n * does not encode a domain-specific definition of \"done\".\n */\n done?: boolean\n metadata?: Record<string, unknown>\n}\n\nexport interface KnowledgeResearchLoopStep {\n iteration: number\n notes?: string\n addedSources: SourceRecord[]\n applied?: ApplyWriteBlocksResult\n lintFindings: KnowledgeLintFinding[]\n validation: ValidateKnowledgeResult\n readiness?: EvalKnowledgeBundleBuildResult\n event: KnowledgeEvent\n done: boolean\n metadata?: Record<string, unknown>\n}\n\nexport interface RunKnowledgeResearchLoopOptions {\n pagesDirectory?: string\n root: string\n goal: string\n maxIterations?: number\n actor?: string\n strict?: ValidateKnowledgeOptions['strict']\n readinessSpecs?: KnowledgeReadinessSpec[]\n readinessTaskId?: string\n readiness?: Omit<BuildEvalKnowledgeBundleOptions, 'taskId' | 'index' | 'specs'>\n sourceOptions?: Pick<AddSourceOptions, 'adapters' | 'now'>\n signal?: AbortSignal\n step(\n context: KnowledgeResearchLoopContext,\n ): Promise<KnowledgeResearchLoopDecision> | KnowledgeResearchLoopDecision\n onStep?: (step: KnowledgeResearchLoopStep) => Promise<void> | void\n}\n\nexport interface KnowledgeResearchLoopResult {\n root: string\n goal: string\n iterations: number\n done: boolean\n index: KnowledgeIndex\n lintFindings: KnowledgeLintFinding[]\n validation: ValidateKnowledgeResult\n readiness?: EvalKnowledgeBundleBuildResult\n steps: KnowledgeResearchLoopStep[]\n}\n\nexport type KnowledgeControlLoopState = KnowledgeResearchLoopContext\nexport type KnowledgeControlLoopAction = KnowledgeResearchLoopDecision\nexport type KnowledgeControlLoopActionResult = KnowledgeResearchLoopStep\n\nexport interface KnowledgeControlLoopAdapterOptions {\n pagesDirectory?: string\n root: string\n goal: string\n actor?: string\n strict?: ValidateKnowledgeOptions['strict']\n readinessSpecs?: KnowledgeReadinessSpec[]\n readinessTaskId?: string\n readiness?: Omit<BuildEvalKnowledgeBundleOptions, 'taskId' | 'index' | 'specs'>\n sourceOptions?: Pick<AddSourceOptions, 'adapters' | 'now'>\n}\n\nexport type KnowledgeControlLoopAdapter = Pick<\n ControlRuntimeConfig<\n KnowledgeControlLoopState,\n KnowledgeControlLoopAction,\n KnowledgeControlLoopActionResult,\n ControlEvalResult\n >,\n 'intent' | 'observe' | 'validate' | 'act' | 'shouldStop' | 'stopPolicies'\n>\n\n/**\n * Adapter for running knowledge growth through `agent-eval`'s generic control\n * runtime. The caller still owns `decide`: that can be a proposer agent,\n * reviewer agent, deterministic policy, or a composition of all three.\n */\nexport function createKnowledgeControlLoopAdapter(\n options: KnowledgeControlLoopAdapterOptions,\n): KnowledgeControlLoopAdapter {\n let initialized = false\n const appliedSteps: KnowledgeResearchLoopStep[] = []\n\n return {\n intent: options.goal,\n async observe({ history, abortSignal }) {\n if (abortSignal.aborted) throw new Error('Knowledge control loop aborted')\n if (!initialized) {\n await initKnowledgeBase(options.root)\n initialized = true\n }\n const observation = await observeKnowledgeResearch(options)\n return {\n root: options.root,\n goal: options.goal,\n iteration: history.length + 1,\n ...observation,\n previousSteps: [...appliedSteps],\n signal: abortSignal,\n }\n },\n validate({ state }) {\n const errorFindings = state.validation.findings.filter(\n (finding) => finding.severity === 'error',\n )\n const evals: ControlEvalResult[] = [\n objectiveEval({\n id: 'knowledge-valid',\n passed: state.validation.ok,\n severity: 'critical',\n detail: state.validation.ok\n ? 'Knowledge index is valid.'\n : 'Knowledge index has validation errors.',\n metadata: { findings: state.validation.findings },\n }),\n objectiveEval({\n id: 'knowledge-lint-errors',\n passed: errorFindings.length === 0,\n severity: 'error',\n detail:\n errorFindings.length === 0\n ? 'No lint errors.'\n : `${errorFindings.length} lint error(s).`,\n metadata: { findings: errorFindings },\n }),\n ]\n if (state.readiness) evals.push(blockingKnowledgeEval(state.readiness.report))\n return evals\n },\n shouldStop() {\n return { stop: false, pass: false, reason: 'knowledge driver owns stop decisions' }\n },\n stopPolicies: {\n // `observe` hands the caller's AbortSignal to `act` through the state, and a\n // signal has no canonical JSON form. The loop's default fingerprint would\n // refuse the whole state, so fingerprint the observable knowledge and leave\n // the signal out — it carries no observable progress.\n stateFingerprint: ({ signal: _signal, ...observable }) => canonicalJson(observable),\n },\n async act(action, ctx) {\n const { step } = await applyKnowledgeResearchDecision(options, action, ctx.state.iteration)\n appliedSteps.push(step)\n return step\n },\n }\n}\n\nexport async function runKnowledgeResearchLoop(\n options: RunKnowledgeResearchLoopOptions,\n): Promise<KnowledgeResearchLoopResult> {\n const maxIterations = Math.max(1, options.maxIterations ?? 3)\n await initKnowledgeBase(options.root)\n const steps: KnowledgeResearchLoopStep[] = []\n let observation = await observeKnowledgeResearch(options)\n let done = false\n\n for (let iteration = 1; iteration <= maxIterations; iteration++) {\n if (options.signal?.aborted) throw new Error('Knowledge research loop aborted')\n const decision = await options.step({\n root: options.root,\n goal: options.goal,\n iteration,\n ...observation,\n previousSteps: steps,\n signal: options.signal,\n })\n\n done = Boolean(decision.done)\n const applied = await applyKnowledgeResearchDecision(options, decision, iteration)\n const { step } = applied\n observation = applied.observation\n steps.push(step)\n await options.onStep?.(step)\n\n if (done) break\n if (!step.applied && step.addedSources.length === 0) break\n }\n\n return {\n root: options.root,\n goal: options.goal,\n iterations: steps.length,\n done,\n ...observation,\n steps,\n }\n}\n\nasync function applyKnowledgeResearchDecision(\n options: KnowledgeControlLoopAdapterOptions,\n decision: KnowledgeResearchLoopDecision,\n iteration = 1,\n) {\n const addedSources: SourceRecord[] = []\n for (const sourcePath of decision.sourcePaths ?? []) {\n addedSources.push(...(await addSourcePath(options.root, sourcePath, options.sourceOptions)))\n }\n for (const sourceText of decision.sourceTexts ?? []) {\n addedSources.push(await addSourceText(options.root, sourceText, options.sourceOptions))\n }\n\n const applied = decision.proposalText\n ? await applyKnowledgeWriteBlocks(options.root, decision.proposalText, {\n pagesDirectory: options.pagesDirectory,\n })\n : undefined\n\n const observation = await observeKnowledgeResearch(options)\n const { validation, lintFindings, readiness } = observation\n const done = Boolean(decision.done)\n const event = createKnowledgeEvent({\n type: 'research.iteration',\n actor: options.actor,\n target: options.root,\n metadata: {\n goal: options.goal,\n iteration,\n done,\n addedSourceCount: addedSources.length,\n ...(applied === undefined ? {} : { written: applied.written }),\n warningCount: applied?.warnings.length ?? 0,\n errorCount: validation.findings.filter((finding) => finding.severity === 'error').length,\n },\n })\n\n // Every optional below is omitted when it has no value rather than set to\n // `undefined`. A step joins the control-loop state, which is fingerprinted with\n // canonical JSON, and that encoder refuses a key present with no value.\n const step: KnowledgeResearchLoopStep = {\n iteration,\n ...(decision.notes === undefined ? {} : { notes: decision.notes }),\n addedSources,\n ...(applied === undefined ? {} : { applied }),\n lintFindings,\n validation,\n ...(readiness === undefined ? {} : { readiness }),\n event,\n done,\n ...(decision.metadata === undefined ? {} : { metadata: decision.metadata }),\n }\n return { step, observation }\n}\n\nasync function observeKnowledgeResearch(options: KnowledgeControlLoopAdapterOptions) {\n const index = await buildKnowledgeIndex(options.root, options)\n const prepared = prepareKnowledgeValidation(index)\n return {\n index,\n // Both records are public and mutable; keep their findings detached as before.\n lintFindings: structuredClone(prepared.lintFindings),\n validation: prepared.validate({ strict: options.strict }),\n readiness: readinessFor(options, index),\n }\n}\n","import { canonicalJson } from '@tangle-network/agent-eval'\nimport type {\n DispatchContext,\n JudgeConfig,\n MutableSurface,\n Scenario,\n} from '@tangle-network/agent-eval/campaign'\nimport type { AgentCandidateJsonValue as JsonValue } from '@tangle-network/agent-interface'\nimport { searchKnowledge } from './search'\nimport type { KnowledgeIndex, KnowledgeSearchResult } from './types'\n\nexport type RetrievalConfig = Record<string, 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 PartitionRetrievalScenariosOptions {\n selectionFraction?: number\n finalFraction?: number\n seed?: number\n}\n\nexport interface RetrievalScenarioPartitions {\n trainScenarios: RetrievalEvalScenario[]\n selectionScenarios: RetrievalEvalScenario[]\n finalScenarios: RetrievalEvalScenario[]\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 partitionRetrievalScenarios(\n scenarios: readonly RetrievalEvalScenario[],\n options: PartitionRetrievalScenariosOptions = {},\n): RetrievalScenarioPartitions {\n if (scenarios.length < 4) {\n throw new Error(\n 'partitionRetrievalScenarios requires at least 4 scenarios for non-empty train and selection partitions plus 2 final scenarios',\n )\n }\n const selectionFraction = options.selectionFraction ?? 0.2\n const finalFraction = options.finalFraction ?? 0.2\n assertPartitionFraction(selectionFraction, 'selectionFraction')\n assertPartitionFraction(finalFraction, 'finalFraction')\n if (selectionFraction + finalFraction >= 1) {\n throw new Error('selectionFraction + finalFraction must be less than 1')\n }\n const shuffled = seededShuffle(scenarios, options.seed ?? 42)\n const finalCount = Math.max(2, Math.round(shuffled.length * finalFraction))\n const selectionCount = Math.max(1, Math.round(shuffled.length * selectionFraction))\n if (finalCount + selectionCount >= shuffled.length) {\n throw new Error('retrieval scenario fractions leave no training scenarios')\n }\n const trainEnd = shuffled.length - selectionCount - finalCount\n return {\n trainScenarios: shuffled.slice(0, trainEnd),\n selectionScenarios: shuffled.slice(trainEnd, trainEnd + selectionCount),\n finalScenarios: shuffled.slice(trainEnd + selectionCount),\n }\n}\n\nfunction assertPartitionFraction(value: number, name: string): void {\n if (!Number.isFinite(value) || value <= 0 || value >= 1) {\n throw new Error(`${name} must be greater than 0 and less than 1`)\n }\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 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 { canonicalJson } from '@tangle-network/agent-eval'\nimport {\n type JudgeConfig,\n type OptimizationMethod,\n surfaceHash,\n} from '@tangle-network/agent-eval/campaign'\nimport type { AgentCandidateJsonValue as JsonValue } from '@tangle-network/agent-interface'\nimport {\n jsonObjectCandidateCodec,\n type RunSerializedKnowledgeOptimizationOptions,\n type RunSerializedKnowledgeOptimizationResult,\n runSerializedKnowledgeOptimization,\n} from './optimization'\nimport {\n buildRetrievalEvalDispatch,\n type RetrievalConfig,\n type RetrievalEvalArtifact,\n type RetrievalEvalRetriever,\n type RetrievalEvalScenario,\n type RetrievalMetricWeights,\n retrievalRecallJudge,\n} from './retrieval-eval'\nimport type { KnowledgeIndex } from './types'\n\ntype RetrievalOptimizationBaseOptions = Omit<\n RunSerializedKnowledgeOptimizationOptions<\n RetrievalConfig,\n RetrievalEvalScenario,\n RetrievalEvalArtifact\n >,\n | 'baseline'\n | 'method'\n | 'trainScenarios'\n | 'selectionScenarios'\n | 'finalScenarios'\n | 'dispatchCandidate'\n | 'judges'\n | 'codec'\n | 'scenarioFingerprint'\n>\n\nexport interface RunRetrievalImprovementLoopOptions extends RetrievalOptimizationBaseOptions {\n baseline: RetrievalConfig\n trainScenarios: readonly RetrievalEvalScenario[]\n selectionScenarios: readonly RetrievalEvalScenario[]\n finalScenarios: readonly RetrievalEvalScenario[]\n method: OptimizationMethod<RetrievalEvalScenario, RetrievalEvalArtifact>\n index?: KnowledgeIndex\n defaultK?: number\n retrieve?: RetrievalEvalRetriever\n judges?: readonly JudgeConfig<RetrievalEvalArtifact, RetrievalEvalScenario>[]\n metricWeights?: RetrievalMetricWeights\n}\n\nexport interface RunRetrievalImprovementLoopResult\n extends RunSerializedKnowledgeOptimizationResult<RetrievalConfig> {\n baselineConfig: RetrievalConfig\n winnerConfig: RetrievalConfig\n trainScenarios: readonly RetrievalEvalScenario[]\n selectionScenarios: readonly RetrievalEvalScenario[]\n finalScenarios: readonly RetrievalEvalScenario[]\n}\n\nexport async function runRetrievalImprovementLoop(\n options: RunRetrievalImprovementLoopOptions,\n): Promise<RunRetrievalImprovementLoopResult> {\n const dispatch = buildRetrievalEvalDispatch({\n index: options.index,\n defaultK: options.defaultK,\n retrieve: options.retrieve,\n })\n const {\n baseline,\n trainScenarios,\n selectionScenarios,\n finalScenarios,\n method,\n index: _index,\n defaultK: _defaultK,\n retrieve: _retrieve,\n judges,\n metricWeights,\n ...runOptions\n } = options\n const result = await runSerializedKnowledgeOptimization({\n ...runOptions,\n baseline,\n method,\n trainScenarios,\n selectionScenarios,\n finalScenarios,\n codec: jsonObjectCandidateCodec<RetrievalConfig>(),\n judges: [...(judges ?? [retrievalRecallJudge({ weights: metricWeights })])],\n scenarioFingerprint: retrievalScenarioFingerprint,\n dispatchCandidate: ({ candidateSurface, scenario, context }) =>\n dispatch(candidateSurface, scenario, context),\n })\n return {\n ...result,\n baselineConfig: result.baseline.value,\n winnerConfig: result.winner.value,\n trainScenarios: [...trainScenarios],\n selectionScenarios: [...selectionScenarios],\n finalScenarios: [...finalScenarios],\n }\n}\n\nfunction retrievalScenarioFingerprint(scenario: RetrievalEvalScenario): string {\n return surfaceHash(\n canonicalJson({\n query: scenario.query,\n expected: scenario.expected,\n k: scenario.k ?? null,\n } as JsonValue),\n )\n}\n","import { assertRagAnswerEvidence, ragAnswerEvidenceRejectionReasons } from './rag-answer-evidence'\nimport type {\n RagAnswerQualityResult,\n RagKnowledgeImprovementPhase,\n RagKnowledgeImprovementPhaseResult,\n RagKnowledgeUpdateResult,\n RagOptimizationSelection,\n RagPromotionResult,\n RunRagKnowledgeImprovementLoopOptions,\n RunRagKnowledgeImprovementLoopResult,\n} from './rag-improvement-loop'\nimport { type RunRagOptimizationResult, runRagOptimization } from './rag-optimization'\nimport {\n type KnowledgeResearchLoopDecision,\n type RunKnowledgeResearchLoopOptions,\n runKnowledgeResearchLoop,\n} from './research-loop'\nimport {\n type RunRetrievalImprovementLoopResult,\n runRetrievalImprovementLoop,\n} from './retrieval-optimization'\n\ntype MaybePromise<T> = T | Promise<T>\n\nexport async function runRagKnowledgeImprovementPhases(\n options: RunRagKnowledgeImprovementLoopOptions,\n previous?: RunRagKnowledgeImprovementLoopResult,\n): Promise<RunRagKnowledgeImprovementLoopResult> {\n assertConfiguredRequiredPhases(options)\n assertOptionalCostCeiling(options.answerQualityCostCeiling, 'answerQualityCostCeiling')\n const now = options.now ?? (() => new Date())\n const phases: RagKnowledgeImprovementPhaseResult[] = [...(previous?.phases ?? [])]\n let optimization = previous?.optimization\n let retrieval = previous?.retrieval\n let findings = [...(previous?.findings ?? [])]\n let acquisition = previous?.acquisition\n let knowledgeUpdate = previous?.knowledgeUpdate\n let answerQuality = previous?.answerQuality\n let promotion = previous?.promotion\n\n const context = () => ({\n goal: options.goal,\n phases,\n optimization: selectOptimization(optimization),\n signal: options.signal,\n retrieval: selectOptimization(retrieval),\n })\n // One executor owns phase enablement, cancellation, timing, and status records.\n // Actions and their inputs remain lazy: later phases see the preceding results.\n async function runPhase<T>(\n phase: RagKnowledgeImprovementPhase,\n previousValue: T | undefined,\n action: (() => MaybePromise<T>) | undefined,\n summarize: (result: T) => string,\n missing: string,\n ): Promise<T | undefined> {\n if (!phaseEnabled(options, phase)) return previousValue\n const startedAt = now().toISOString()\n if (!action) {\n phases.push({ phase, status: 'skipped', summary: missing, startedAt, finishedAt: startedAt })\n return previousValue\n }\n try {\n assertNotAborted(options.signal)\n const result = await action()\n phases.push({\n phase,\n status: 'completed',\n summary: summarize(result),\n startedAt,\n finishedAt: now().toISOString(),\n })\n return result\n } catch (error) {\n phases.push({\n phase,\n status: 'failed',\n summary: (error as Error).message,\n startedAt,\n finishedAt: now().toISOString(),\n })\n throw error\n }\n }\n\n findings = [\n ...(await runPhase(\n 'gap-diagnosis',\n findings,\n options.diagnose && (() => options.diagnose!(context())),\n (diagnosed) => `${diagnosed.length} finding(s)`,\n 'no diagnosis hook provided',\n ))!,\n ]\n acquisition = await runPhase(\n 'knowledge-acquisition',\n acquisition,\n options.acquireKnowledge && (() => options.acquireKnowledge!({ ...context(), findings })),\n summarizeAcquisitionDecision,\n 'no acquisition hook provided',\n )\n knowledgeUpdate = await runPhase(\n 'knowledge-update',\n knowledgeUpdate,\n options.updateKnowledge\n ? () => options.updateKnowledge!({ ...context(), findings, acquisition })\n : options.knowledgeResearch\n ? () => runKnowledgeResearchUpdate(options, acquisition)\n : undefined,\n (result) => result.summary,\n 'no update hook or research loop provided',\n )\n\n if (\n options.optimization ||\n options.enabledPhases?.includes('rag-optimization') ||\n options.requiredPhases?.includes('rag-optimization')\n ) {\n optimization = await runPhase(\n 'rag-optimization',\n optimization,\n options.optimization && (() => runRagOptimization(options.optimization!)),\n summarizeOptimization,\n 'no full RAG optimization options provided',\n )\n }\n retrieval = await runPhase(\n 'retrieval-tuning',\n retrieval,\n options.retrieval && (() => runRetrievalImprovementLoop(options.retrieval!)),\n summarizeOptimization,\n 'no retrieval options provided',\n )\n const runsAnswerQuality =\n phaseEnabled(options, 'answer-quality') && Boolean(options.evaluateAnswers)\n answerQuality = await runPhase(\n 'answer-quality',\n answerQuality,\n options.evaluateAnswers &&\n (async () => {\n const result = await options.evaluateAnswers!({\n ...context(),\n findings,\n acquisition,\n knowledgeUpdate,\n })\n assertRagAnswerEvidence(result)\n return result\n }),\n summarizeAnswerQuality,\n 'no answer-quality hook provided',\n )\n if (runsAnswerQuality) {\n findings = [...findings, ...(answerQuality!.findings ?? [])]\n }\n promotion = await runPhase(\n 'promotion',\n promotion,\n options.decidePromotion &&\n (() => {\n const evidenceRejection = rejectUnsafePromotionEvidence({\n optimization: optimization?.comparison,\n optimizationCostCeiling: options.optimization?.costCeiling,\n retrieval: retrieval?.comparison,\n retrievalCostCeiling: options.retrieval?.costCeiling,\n answerQuality,\n answerQualityCostCeiling: options.answerQualityCostCeiling,\n })\n return (\n evidenceRejection ??\n options.decidePromotion!({\n ...context(),\n optimizationComparison: optimization?.comparison,\n retrievalComparison: retrieval?.comparison,\n findings,\n acquisition,\n knowledgeUpdate,\n answerQuality,\n })\n )\n }),\n (result) => `${result.promoted ? 'promoted' : 'held'}: ${result.reason}`,\n 'no promotion decision hook provided',\n )\n\n return {\n goal: options.goal,\n phases,\n optimization,\n retrieval,\n findings,\n acquisition,\n knowledgeUpdate,\n answerQuality,\n promotion,\n }\n}\n\nfunction rejectUnsafePromotionEvidence(evidence: {\n optimization?: RunRagOptimizationResult['comparison']\n optimizationCostCeiling?: number\n retrieval?: RunRetrievalImprovementLoopResult['comparison']\n retrievalCostCeiling?: number\n answerQuality?: RagAnswerQualityResult\n answerQualityCostCeiling?: number\n}): RagPromotionResult | undefined {\n const reasons: string[] = []\n if (!evidence.optimization && !evidence.retrieval && !evidence.answerQuality) {\n reasons.push('promotion requires final RAG, retrieval, or answer-quality evidence')\n }\n for (const [label, comparison, costCeiling] of [\n ['RAG', evidence.optimization, evidence.optimizationCostCeiling],\n ['retrieval', evidence.retrieval, evidence.retrievalCostCeiling],\n ] as const) {\n if (!comparison) continue\n if (!comparison.totalCost.accountingComplete) {\n reasons.push(`${label} final comparison has incomplete cost accounting`)\n }\n const optimizerSource = comparison.best.provenance?.source\n if (optimizerSource && optimizerSource.evidence !== 'observed') {\n reasons.push(`${label} optimizer package identity was not observed`)\n }\n if (!comparison.best.decision.promote) {\n reasons.push(\n comparison.best.decision.low < 0\n ? `${label} final comparison does not rule out a regression`\n : `${label} final comparison does not establish the required improvement`,\n )\n }\n if (\n costCeiling !== undefined &&\n exceedsCostCeiling(comparison.totalCost.totalCostUsd, costCeiling)\n ) {\n reasons.push(\n `${label} final comparison cost ${comparison.totalCost.totalCostUsd} exceeds ${costCeiling}`,\n )\n }\n }\n if (evidence.answerQuality) {\n reasons.push(\n ...ragAnswerEvidenceRejectionReasons(\n evidence.answerQuality,\n evidence.answerQualityCostCeiling,\n ),\n )\n }\n if (reasons.length === 0) return undefined\n return {\n promoted: false,\n reason: reasons.join('; '),\n }\n}\n\nfunction assertOptionalCostCeiling(value: number | undefined, label: string): void {\n if (value !== undefined && (!Number.isFinite(value) || value < 0)) {\n throw new Error(`${label} must be a non-negative finite number`)\n }\n}\n\nfunction exceedsCostCeiling(totalCostUsd: number, costCeiling: number): boolean {\n const tolerance = Number.EPSILON * Math.max(1, Math.abs(totalCostUsd), Math.abs(costCeiling)) * 8\n return totalCostUsd - costCeiling > tolerance\n}\n\nfunction summarizeOptimization(\n result: RunRagOptimizationResult | RunRetrievalImprovementLoopResult,\n): string {\n return `${result.methodName}; winner=${result.winner.surfaceHash}`\n}\n\nasync function runKnowledgeResearchUpdate(\n options: RunRagKnowledgeImprovementLoopOptions,\n acquisition: KnowledgeResearchLoopDecision | undefined,\n): Promise<RagKnowledgeUpdateResult> {\n const research = options.knowledgeResearch\n if (!research) {\n throw new Error('knowledgeResearch options are required to run the knowledge update phase')\n }\n const { goal, step, ...rest } = research\n const researchStep = step ?? acquisitionBackedResearchStep(acquisition)\n const maxIterations = step ? rest.maxIterations : 1\n const result = await runKnowledgeResearchLoop({\n ...rest,\n goal: goal ?? options.goal,\n maxIterations,\n signal: options.signal,\n step: researchStep,\n })\n return {\n applied: result.steps.some((stepResult) => {\n return stepResult.addedSources.length > 0 || Boolean(stepResult.applied)\n }),\n summary: `${result.iterations} research iteration(s); done=${String(result.done)}`,\n research: result,\n }\n}\n\nfunction acquisitionBackedResearchStep(\n acquisition: KnowledgeResearchLoopDecision | undefined,\n): RunKnowledgeResearchLoopOptions['step'] {\n if (!acquisition) {\n throw new Error(\n 'knowledgeResearch requires either a step hook or a knowledge-acquisition result to apply',\n )\n }\n return () => ({ ...acquisition, done: acquisition.done ?? true })\n}\n\nfunction selectOptimization(\n result: RunRagOptimizationResult | RunRetrievalImprovementLoopResult | undefined,\n): RagOptimizationSelection | undefined {\n if (!result) return undefined\n return {\n methodName: result.methodName,\n baseline: structuredClone(result.baseline),\n winner: structuredClone(result.winner),\n baselineConfig: structuredClone(result.baselineConfig),\n winnerConfig: structuredClone(result.winnerConfig),\n }\n}\n\nfunction summarizeAcquisitionDecision(decision: KnowledgeResearchLoopDecision): string {\n const sourcePathCount = decision.sourcePaths?.length ?? 0\n const sourceTextCount = decision.sourceTexts?.length ?? 0\n const proposal = decision.proposalText ? 'proposal' : 'no proposal'\n return `${sourcePathCount} path source(s), ${sourceTextCount} text source(s), ${proposal}`\n}\n\nfunction summarizeAnswerQuality(result: RagAnswerQualityResult): string {\n const metrics = Object.entries(result.metrics)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([key, value]) => `${key}=${formatMetric(value)}`)\n .join(', ')\n return `${result.passed ? 'passed' : 'failed'}${metrics ? `; ${metrics}` : ''}`\n}\n\nfunction formatMetric(value: number): string {\n return Number.isFinite(value) ? value.toFixed(3) : String(value)\n}\n\nfunction phaseEnabled(\n options: RunRagKnowledgeImprovementLoopOptions,\n phase: RagKnowledgeImprovementPhase,\n): boolean {\n return !options.enabledPhases || options.enabledPhases.includes(phase)\n}\n\nfunction assertConfiguredRequiredPhases(options: RunRagKnowledgeImprovementLoopOptions): void {\n for (const phase of options.requiredPhases ?? []) {\n if (!phaseEnabled(options, phase)) {\n throw new Error(`required phase ${phase} is not enabled`)\n }\n if (!phaseConfigured(options, phase)) {\n throw new Error(requiredPhaseMessage(phase))\n }\n }\n}\n\nfunction phaseConfigured(\n options: RunRagKnowledgeImprovementLoopOptions,\n phase: RagKnowledgeImprovementPhase,\n): boolean {\n switch (phase) {\n case 'rag-optimization':\n return Boolean(options.optimization)\n case 'retrieval-tuning':\n return Boolean(options.retrieval)\n case 'gap-diagnosis':\n return Boolean(options.diagnose)\n case 'knowledge-acquisition':\n return Boolean(options.acquireKnowledge)\n case 'knowledge-update':\n return Boolean(options.updateKnowledge ?? options.knowledgeResearch)\n case 'answer-quality':\n return Boolean(options.evaluateAnswers)\n case 'promotion':\n return Boolean(options.decidePromotion)\n }\n}\n\nfunction requiredPhaseMessage(phase: RagKnowledgeImprovementPhase): string {\n switch (phase) {\n case 'rag-optimization':\n return 'required phase rag-optimization requires optimization options'\n case 'retrieval-tuning':\n return 'required phase retrieval-tuning requires retrieval options'\n case 'gap-diagnosis':\n return 'required phase gap-diagnosis requires a diagnose hook'\n case 'knowledge-acquisition':\n return 'required phase knowledge-acquisition requires an acquireKnowledge hook'\n case 'knowledge-update':\n return 'required phase knowledge-update requires updateKnowledge or knowledgeResearch'\n case 'answer-quality':\n return 'required phase answer-quality requires an evaluateAnswers hook'\n case 'promotion':\n return 'required phase promotion requires a decidePromotion hook'\n }\n}\n\nfunction assertNotAborted(signal: AbortSignal | undefined): void {\n if (signal?.aborted) {\n throw new Error('RAG knowledge improvement loop aborted')\n }\n}\n","import type { ComparisonCost } from '@tangle-network/agent-eval/campaign'\nimport type { AgentCandidateJsonValue as JsonValue } from '@tangle-network/agent-interface'\nimport { runRagKnowledgeImprovementPhases } from './rag-improvement-phases'\nimport type { RunRagOptimizationOptions, RunRagOptimizationResult } from './rag-optimization'\nimport type {\n KnowledgeResearchLoopDecision,\n KnowledgeResearchLoopResult,\n RunKnowledgeResearchLoopOptions,\n} from './research-loop'\nimport type {\n RunRetrievalImprovementLoopOptions,\n RunRetrievalImprovementLoopResult,\n} from './retrieval-optimization'\n\nexport type RagKnowledgeImprovementPhase =\n | 'rag-optimization'\n | 'retrieval-tuning'\n | 'gap-diagnosis'\n | 'knowledge-acquisition'\n | 'knowledge-update'\n | 'answer-quality'\n | 'promotion'\n\nexport type RagKnowledgeImprovementPhaseStatus = 'completed' | 'skipped' | 'failed'\n\nexport type RagGapKind =\n | 'missing-source'\n | 'stale-source'\n | 'retrieval-miss'\n | 'retrieval-noise'\n | 'chunking-mismatch'\n | 'missing-multihop-evidence'\n | 'generator-unsupported-claim'\n | 'citation-mismatch'\n | 'incorrect-abstention'\n | 'unknown'\n\nexport type RagGapSeverity = 'info' | 'warning' | 'error' | 'critical'\n\nexport interface RagGapFinding {\n id: string\n kind: RagGapKind\n severity: RagGapSeverity\n message: string\n scenarioId?: string\n evidence?: Record<string, JsonValue>\n}\n\nexport interface RagKnowledgeImprovementPhaseResult {\n phase: RagKnowledgeImprovementPhase\n status: RagKnowledgeImprovementPhaseStatus\n summary: string\n startedAt: string\n finishedAt: string\n metadata?: Record<string, JsonValue>\n}\n\nexport type RagOptimizationSelection = Pick<\n RunRagOptimizationResult,\n 'methodName' | 'baseline' | 'winner' | 'baselineConfig' | 'winnerConfig'\n>\n\nexport type RetrievalOptimizationSelection = Pick<\n RunRetrievalImprovementLoopResult,\n 'methodName' | 'baseline' | 'winner' | 'baselineConfig' | 'winnerConfig'\n>\n\nexport interface RagPhaseInputBase {\n goal: string\n phases: readonly RagKnowledgeImprovementPhaseResult[]\n /** Selected candidate only. Adaptive update callbacks run before final scoring starts. */\n optimization?: RagOptimizationSelection\n signal?: AbortSignal\n}\n\nexport interface RagDiagnosisInput extends RagPhaseInputBase {\n retrieval?: RetrievalOptimizationSelection\n}\n\nexport interface RagKnowledgeAcquisitionInput extends RagPhaseInputBase {\n retrieval?: RetrievalOptimizationSelection\n findings: readonly RagGapFinding[]\n}\n\nexport interface RagKnowledgeUpdateInput extends RagPhaseInputBase {\n retrieval?: RetrievalOptimizationSelection\n findings: readonly RagGapFinding[]\n acquisition?: KnowledgeResearchLoopDecision\n}\n\nexport interface RagKnowledgeUpdateResult {\n applied: boolean\n summary: string\n research?: KnowledgeResearchLoopResult\n metadata?: Record<string, JsonValue>\n}\n\nexport interface RagAnswerQualityInput extends RagPhaseInputBase {\n retrieval?: RetrievalOptimizationSelection\n findings: readonly RagGapFinding[]\n acquisition?: KnowledgeResearchLoopDecision\n knowledgeUpdate?: RagKnowledgeUpdateResult\n}\n\nexport interface RagAnswerQualityResult {\n passed: boolean\n metrics: Record<string, number>\n finalScenarioIds: readonly string[]\n datasetRef: string\n evaluatorRef: string\n cost: ComparisonCost\n findings?: readonly RagGapFinding[]\n metadata?: Record<string, JsonValue>\n}\n\nexport interface RagPromotionInput extends RagPhaseInputBase {\n retrieval?: RetrievalOptimizationSelection\n /** Full final-case result available only to the terminal promotion decision. */\n optimizationComparison?: RunRagOptimizationResult['comparison']\n /** Full final-case result available only to the terminal promotion decision. */\n retrievalComparison?: RunRetrievalImprovementLoopResult['comparison']\n findings: readonly RagGapFinding[]\n acquisition?: KnowledgeResearchLoopDecision\n knowledgeUpdate?: RagKnowledgeUpdateResult\n answerQuality?: RagAnswerQualityResult\n}\n\nexport interface RagPromotionResult {\n promoted: boolean\n reason: string\n metadata?: Record<string, JsonValue>\n}\n\nexport interface RagKnowledgeResearchOptions\n extends Omit<RunKnowledgeResearchLoopOptions, 'goal' | 'signal' | 'step'> {\n goal?: string\n step?: RunKnowledgeResearchLoopOptions['step']\n}\n\nexport interface RunRagKnowledgeImprovementLoopOptions {\n goal: string\n optimization?: RunRagOptimizationOptions\n retrieval?: RunRetrievalImprovementLoopOptions\n diagnose?: (input: RagDiagnosisInput) => MaybePromise<readonly RagGapFinding[]>\n acquireKnowledge?: (\n input: RagKnowledgeAcquisitionInput,\n ) => MaybePromise<KnowledgeResearchLoopDecision>\n knowledgeResearch?: RagKnowledgeResearchOptions\n updateKnowledge?: (input: RagKnowledgeUpdateInput) => MaybePromise<RagKnowledgeUpdateResult>\n evaluateAnswers?: (input: RagAnswerQualityInput) => MaybePromise<RagAnswerQualityResult>\n /** Maximum total answer-evaluation spend accepted for promotion. */\n answerQualityCostCeiling?: number\n /**\n * Makes a side-effect-free promotion decision after the library has rejected\n * missing, inconclusive, regressing, unaccounted, or over-budget final evidence.\n */\n decidePromotion?: (input: RagPromotionInput) => MaybePromise<RagPromotionResult>\n enabledPhases?: readonly RagKnowledgeImprovementPhase[]\n requiredPhases?: readonly RagKnowledgeImprovementPhase[]\n signal?: AbortSignal\n now?: () => Date\n}\n\nexport interface RunRagKnowledgeImprovementLoopResult {\n goal: string\n phases: readonly RagKnowledgeImprovementPhaseResult[]\n optimization?: RunRagOptimizationResult\n retrieval?: RunRetrievalImprovementLoopResult\n findings: readonly RagGapFinding[]\n acquisition?: KnowledgeResearchLoopDecision\n knowledgeUpdate?: RagKnowledgeUpdateResult\n answerQuality?: RagAnswerQualityResult\n promotion?: RagPromotionResult\n}\n\ntype MaybePromise<T> = T | Promise<T>\n\nexport async function runRagKnowledgeImprovementLoop(\n options: RunRagKnowledgeImprovementLoopOptions,\n): Promise<RunRagKnowledgeImprovementLoopResult> {\n return runRagKnowledgeImprovementPhases(options)\n}\n","import { createHash } from 'node:crypto'\nimport { cp, lstat, mkdir, mkdtemp, rm } from 'node:fs/promises'\nimport { tmpdir } from 'node:os'\nimport { dirname, join } from 'node:path'\nimport { canonicalJson, contentHash } from '@tangle-network/agent-eval'\nimport {\n canonicalPathsEqual,\n isMissingFile,\n listRegularFilesWithinRoot,\n readRegularFileWithinRoot,\n renameDurable,\n withSafeDirectory,\n} from '../durable-fs'\nimport { sha256, stableId } from '../ids'\nimport { writeKnowledgeIndex } from '../indexer'\nimport {\n KNOWLEDGE_RESEARCH_STATE_PATHS,\n type KnowledgeStateScope,\n normalizeKnowledgeStateScope,\n} from '../knowledge-state-scope'\nimport { withKnowledgeRead } from '../mutation-lock'\nimport { immutableJsonValue } from './activation'\nimport type {\n KnowledgeImprovementCandidateRecord,\n KnowledgeImprovementCandidateRef,\n KnowledgeImprovementEvidence,\n KnowledgeImprovementResult,\n KnowledgeImprovementRunState,\n KnowledgeImprovementTarget,\n ResolvedKnowledgeImprovementCandidate,\n ResolvedKnowledgeImprovementComparison,\n UseKnowledgeImprovementCandidateOptions,\n} from './contracts'\nimport {\n KnowledgeImprovementCandidateRefSchema,\n KnowledgeImprovementEvidenceSchema,\n safePathSegmentSchema,\n} from './contracts'\nimport {\n assertExactCandidatePlatform,\n candidateEvidenceRelativePath,\n loadKnowledgeImprovementStateFromRun,\n withKnowledgeImprovementRun,\n} from './state'\n\n/** Freeze the exact knowledge bytes and measured evidence a later approval may promote. */\nexport function knowledgeImprovementCandidateRef(\n result: Pick<KnowledgeImprovementResult, 'runId' | 'state' | 'candidate'>,\n): KnowledgeImprovementCandidateRef {\n if (!result.candidate) throw new Error('knowledge improvement result has no candidate')\n return candidateRefFor(result.runId, result.state, result.candidate)\n}\n\n/** Use both frozen sides of one measured comparison in isolated, integrity-checked copies. */\nexport async function withKnowledgeImprovementComparison<T>(\n options: UseKnowledgeImprovementCandidateOptions,\n use: (comparison: ResolvedKnowledgeImprovementComparison) => Promise<T> | T,\n): Promise<T> {\n assertExactCandidatePlatform()\n const reference = Object.freeze(KnowledgeImprovementCandidateRefSchema.parse(options.candidate))\n return withKnowledgeImprovementRun(options.root, reference.runId, false, async (runDir) => {\n const state = await loadKnowledgeImprovementStateFromRun(options.root, reference.runId, runDir)\n return withMeasuredCandidateSnapshot(options.root, runDir, state, reference, (resolved) =>\n withBaselineSnapshot(\n runDir,\n reference.baseHash,\n (baselineRoot) =>\n withIsolatedKnowledgeCopy(\n baselineRoot,\n reference.baseHash,\n 'baseline',\n (baseline) =>\n withIsolatedKnowledgeCopy(\n resolved.root,\n reference.candidateHash,\n 'candidate',\n (candidate) =>\n use(\n Object.freeze({\n reference,\n stateScope: Object.freeze(normalizeKnowledgeStateScope(state.stateScope)),\n evaluation: immutableJsonValue(structuredClone(resolved.evidence.evaluation)),\n baseline: Object.freeze({ root: baseline, hash: reference.baseHash }),\n candidate: Object.freeze({ root: candidate, hash: reference.candidateHash }),\n }),\n ),\n state.stateScope,\n ),\n state.stateScope,\n ),\n state.stateScope,\n ),\n )\n })\n}\n\n/** Use the frozen candidate side of one measured comparison. */\nexport async function withKnowledgeImprovementCandidate<T>(\n options: UseKnowledgeImprovementCandidateOptions,\n use: (candidate: ResolvedKnowledgeImprovementCandidate) => Promise<T> | T,\n): Promise<T> {\n assertExactCandidatePlatform()\n const candidateRef = Object.freeze(\n KnowledgeImprovementCandidateRefSchema.parse(options.candidate),\n )\n return withKnowledgeImprovementRun(options.root, candidateRef.runId, false, async (runDir) => {\n const state = await loadKnowledgeImprovementStateFromRun(\n options.root,\n candidateRef.runId,\n runDir,\n )\n return withMeasuredCandidateSnapshot(options.root, runDir, state, candidateRef, (resolved) =>\n withIsolatedKnowledgeCopy(\n resolved.root,\n candidateRef.candidateHash,\n 'candidate',\n (root) =>\n use(\n Object.freeze({\n root,\n candidate: candidateRef,\n stateScope: Object.freeze(normalizeKnowledgeStateScope(state.stateScope)),\n evaluation: immutableJsonValue(structuredClone(resolved.evidence.evaluation)),\n }),\n ),\n state.stateScope,\n ),\n )\n })\n}\n\nexport function candidateRefFor(\n runId: string,\n state: KnowledgeImprovementRunState,\n candidate: KnowledgeImprovementCandidateRecord,\n): KnowledgeImprovementCandidateRef {\n if (candidate.status !== 'candidate-ready' && candidate.status !== 'promoted') {\n throw new Error(`knowledge candidate '${candidate.candidateId}' is not ready`)\n }\n return candidateIdentityFor(runId, state, candidate)\n}\n\nexport function candidateIdentityFor(\n runId: string,\n state: KnowledgeImprovementRunState,\n candidate: KnowledgeImprovementCandidateRecord,\n): KnowledgeImprovementCandidateRef {\n if (!candidate.candidateHash) {\n throw new Error(`knowledge candidate '${candidate.candidateId}' has no content hash`)\n }\n if (!candidate.evidenceHash) {\n throw new Error(`knowledge candidate '${candidate.candidateId}' has no evidence hash`)\n }\n if (!candidate.promotionPlanHash) {\n throw new Error(`knowledge candidate '${candidate.candidateId}' has no promotion plan hash`)\n }\n return Object.freeze({\n kind: 'knowledge-improvement-candidate',\n runId,\n candidateId: candidate.candidateId,\n goalHash: sha256(state.goal),\n baseHash: candidate.baseHash,\n candidateHash: candidate.candidateHash,\n evidenceHash: candidate.evidenceHash,\n promotionPlanHash: candidate.promotionPlanHash,\n })\n}\n\nexport async function withMeasuredCandidateSnapshot<T>(\n liveRoot: string,\n runDir: string,\n state: KnowledgeImprovementRunState,\n candidateRef: KnowledgeImprovementCandidateRef,\n use: (snapshot: {\n root: string\n candidate: KnowledgeImprovementCandidateRecord\n evidence: KnowledgeImprovementEvidence\n }) => Promise<T> | T,\n): Promise<T> {\n await assertStateIdentity(liveRoot, candidateRef, state)\n const candidate = state.candidates.find((entry) => entry.candidateId === candidateRef.candidateId)\n if (!candidate) {\n throw new Error(`knowledge candidate '${candidateRef.candidateId}' does not exist`)\n }\n const expectedRef = candidateRefFor(candidateRef.runId, state, candidate)\n if (canonicalJson(expectedRef) !== canonicalJson(candidateRef)) {\n throw new Error('knowledge candidate approval does not match the measured candidate')\n }\n const evidence = await assertCandidateEvidence(runDir, candidateRef, state.implementationRef)\n const relativePath = join(\n 'candidates',\n candidate.candidateId,\n 'snapshots',\n candidateRef.candidateHash,\n )\n return withSafeDirectory(runDir, relativePath, false, async (root) => {\n if ((await hashKnowledgeBase(root, state.stateScope)) !== candidateRef.candidateHash) {\n throw new Error('knowledge candidate snapshot changed after approval')\n }\n const result = await use({ root, candidate, evidence })\n if ((await hashKnowledgeBase(root, state.stateScope)) !== candidateRef.candidateHash) {\n throw new Error('knowledge candidate snapshot changed during use')\n }\n return result\n })\n}\n\nasync function withIsolatedKnowledgeCopy<T>(\n sourceRoot: string,\n expectedHash: string,\n target: KnowledgeImprovementTarget,\n use: (root: string) => Promise<T> | T,\n scope?: KnowledgeStateScope,\n): Promise<T> {\n const isolationRoot = await mkdtemp(join(tmpdir(), 'agent-knowledge-snapshot-'))\n const snapshotRoot = join(isolationRoot, 'snapshot')\n try {\n await copyKnowledgeWorkspace(sourceRoot, snapshotRoot, scope)\n if ((await hashKnowledgeBase(snapshotRoot, scope)) !== expectedHash) {\n throw new Error(`isolated knowledge ${target} does not match its measured content`)\n }\n const result = await use(snapshotRoot)\n if ((await hashKnowledgeBase(snapshotRoot, scope)) !== expectedHash) {\n throw new Error(`knowledge ${target} snapshot changed during use`)\n }\n return result\n } finally {\n await rm(isolationRoot, { recursive: true, force: true })\n }\n}\n\nexport async function assertCandidateEvidence(\n runDir: string,\n candidate: KnowledgeImprovementCandidateRef,\n expectedImplementationRef: string,\n): Promise<KnowledgeImprovementEvidence> {\n const evidence = KnowledgeImprovementEvidenceSchema.parse(\n JSON.parse(\n (\n await readRegularFileWithinRoot(\n runDir,\n candidateEvidenceRelativePath(candidate.candidateId),\n )\n ).bytes.toString('utf8'),\n ),\n )\n const actualHash = contentHash(evidence)\n if (actualHash !== candidate.evidenceHash) {\n throw new Error(\n `knowledge candidate evidence changed after approval: expected ${candidate.evidenceHash}, got ${actualHash}`,\n )\n }\n if (\n evidence.runId !== candidate.runId ||\n evidence.candidateId !== candidate.candidateId ||\n evidence.goalHash !== candidate.goalHash ||\n evidence.implementationRef !== expectedImplementationRef ||\n evidence.baseHash !== candidate.baseHash ||\n evidence.candidateHash !== candidate.candidateHash ||\n evidence.promotionPlanHash !== candidate.promotionPlanHash ||\n evidence.evaluation.passed !== true\n ) {\n throw new Error('knowledge candidate evidence does not match the approved candidate')\n }\n return evidence\n}\n\nexport async function assertStateIdentity(\n root: string,\n candidateRef: KnowledgeImprovementCandidateRef,\n state: KnowledgeImprovementRunState,\n): Promise<void> {\n if (state.runId !== candidateRef.runId) {\n throw new Error('knowledge candidate run identity does not match persisted state')\n }\n if (!(await canonicalPathsEqual(state.root, root))) {\n throw new Error('knowledge candidate root does not match persisted state')\n }\n if (sha256(state.goal) !== candidateRef.goalHash) {\n throw new Error('knowledge candidate goal does not match persisted state')\n }\n if (state.baseHash !== candidateRef.baseHash) {\n throw new Error('knowledge candidate base does not match persisted state')\n }\n}\n\nexport async function createCandidateWorkspace(\n runDir: string,\n state: KnowledgeImprovementRunState,\n root: string,\n now: () => Date,\n): Promise<KnowledgeImprovementCandidateRecord> {\n const iteration = state.candidates.length + 1\n const candidateId = stableId('kcand', `${state.runId}:${iteration}:${now().toISOString()}`)\n const candidateRoot = candidateWorkspacePath(runDir, candidateId)\n await copyKnowledgeWorkspace(root, candidateRoot, state.stateScope)\n const createdAt = now().toISOString()\n return {\n iteration,\n candidateId,\n baseHash: state.baseHash,\n status: 'running',\n createdAt,\n updatedAt: createdAt,\n }\n}\n\nfunction candidateWorkspacePath(runDir: string, candidateId: string): string {\n return join(runDir, 'candidates', safePathSegmentSchema.parse(candidateId), 'workspace')\n}\n\nfunction baselineSnapshotPath(runDir: string): string {\n return join(runDir, 'baseline')\n}\n\nexport async function createBaselineSnapshot(\n runDir: string,\n root: string,\n expectedHash: string,\n scope?: KnowledgeStateScope,\n): Promise<void> {\n const target = baselineSnapshotPath(runDir)\n try {\n await assertBaselineSnapshot(runDir, expectedHash, scope)\n return\n } catch (error) {\n if (!isMissingFile(error)) throw error\n }\n const preparation = await mkdtemp(join(runDir, 'baseline-prepare-'))\n let activated = false\n try {\n await copyKnowledgeWorkspace(root, preparation, scope)\n const actualHash = await hashKnowledgeBase(preparation, scope)\n if (actualHash !== expectedHash) {\n throw new Error(\n `knowledge base changed while baseline was frozen: expected ${expectedHash}, got ${actualHash}`,\n )\n }\n await renameDurable(preparation, target)\n activated = true\n } finally {\n if (!activated) await rm(preparation, { recursive: true, force: true })\n }\n}\n\nexport async function ensureBaselineSnapshot(\n runDir: string,\n root: string,\n expectedHash: string,\n scope?: KnowledgeStateScope,\n): Promise<void> {\n try {\n await assertBaselineSnapshot(runDir, expectedHash, scope)\n } catch (error) {\n if (!isMissingFile(error)) throw error\n const liveHash = await hashKnowledgeBase(root, scope)\n if (liveHash !== expectedHash) {\n throw new Error(\n 'knowledge improvement baseline snapshot is missing and cannot be reconstructed',\n )\n }\n await createBaselineSnapshot(runDir, root, expectedHash, scope)\n }\n}\n\nasync function assertBaselineSnapshot(\n runDir: string,\n expectedHash: string,\n scope?: KnowledgeStateScope,\n): Promise<void> {\n await withBaselineSnapshot(runDir, expectedHash, () => undefined, scope)\n}\n\nexport async function withBaselineSnapshot<T>(\n runDir: string,\n expectedHash: string,\n use: (baselineRoot: string) => Promise<T> | T,\n scope?: KnowledgeStateScope,\n): Promise<T> {\n return withSafeDirectory(runDir, 'baseline', false, async (baselineRoot) => {\n const actualHash = await hashKnowledgeBase(baselineRoot, scope)\n if (actualHash !== expectedHash) {\n throw new Error(\n `knowledge improvement baseline changed: expected ${expectedHash}, got ${actualHash}`,\n )\n }\n return use(baselineRoot)\n })\n}\n\nexport async function withFrozenCandidateWorkspace<T>(\n runDir: string,\n candidate: KnowledgeImprovementCandidateRecord,\n candidateRoot: string,\n use: (snapshot: { root: string; hash: string }) => Promise<T> | T,\n scope?: KnowledgeStateScope,\n): Promise<T> {\n const snapshotsPath = join(\n 'candidates',\n safePathSegmentSchema.parse(candidate.candidateId),\n 'snapshots',\n )\n return withSafeDirectory(runDir, snapshotsPath, true, async (snapshotsDir) => {\n const preparation = await mkdtemp(join(snapshotsDir, 'prepare-'))\n let activated = false\n try {\n await copyKnowledgeWorkspace(candidateRoot, preparation, scope)\n const hash = await hashKnowledgeBase(preparation, scope)\n try {\n const result = await withSafeDirectory(snapshotsDir, hash, false, async (existing) => {\n if ((await hashKnowledgeBase(existing, scope)) !== hash) {\n throw new Error('knowledge candidate snapshot does not match its content identity')\n }\n return use({ root: existing, hash })\n })\n await rm(preparation, { recursive: true, force: true })\n activated = true\n return result\n } catch (error) {\n if (!isMissingFile(error)) throw error\n }\n await renameDurable(preparation, join(snapshotsDir, hash))\n activated = true\n return withSafeDirectory(snapshotsDir, hash, false, (root) => use({ root, hash }))\n } finally {\n if (!activated) await rm(preparation, { recursive: true, force: true })\n }\n })\n}\n\nexport function clearCandidateMeasurement(candidate: KnowledgeImprovementCandidateRecord): void {\n delete candidate.candidateHash\n delete candidate.evidenceHash\n delete candidate.promotionPlanHash\n}\n\nasync function copyKnowledgeWorkspace(\n sourceRoot: string,\n targetRoot: string,\n scope?: KnowledgeStateScope,\n): Promise<void> {\n const normalized = normalizeKnowledgeStateScope(scope)\n await withKnowledgeRead(sourceRoot, async () => {\n await rm(targetRoot, { recursive: true, force: true })\n await mkdir(join(targetRoot, normalized.pagesDirectory), { recursive: true })\n await mkdir(join(targetRoot, 'raw', 'sources'), { recursive: true })\n for (const path of knowledgeScopePaths(normalized)) {\n await copyIfExists(join(sourceRoot, path), join(targetRoot, path))\n }\n })\n await writeKnowledgeIndex(targetRoot, { pagesDirectory: normalized.pagesDirectory })\n}\n\nfunction knowledgeScopePaths(scope: KnowledgeStateScope): string[] {\n const normalized = normalizeKnowledgeStateScope(scope)\n return [\n normalized.pagesDirectory,\n 'raw',\n '.agent-knowledge/sources.json',\n ...(normalized.researchState ? KNOWLEDGE_RESEARCH_STATE_PATHS : []),\n ]\n}\n\nasync function copyIfExists(source: string, target: string): Promise<void> {\n let sourceStat: Awaited<ReturnType<typeof lstat>>\n try {\n sourceStat = await lstat(source)\n } catch (error) {\n if (isMissingFile(error)) return\n throw error\n }\n if (!sourceStat.isDirectory() && !sourceStat.isFile()) {\n throw new Error(`knowledge surface contains an unsupported filesystem entry: ${source}`)\n }\n await mkdir(dirname(target), { recursive: true })\n await cp(source, target, { recursive: sourceStat.isDirectory(), dereference: false })\n}\n\nexport async function hashKnowledgeBase(\n root: string,\n scope?: KnowledgeStateScope,\n): Promise<string> {\n return withKnowledgeRead(root, () => hashKnowledgeBaseUnlocked(root, scope))\n}\n\nasync function hashKnowledgeBaseUnlocked(\n root: string,\n scope?: KnowledgeStateScope,\n): Promise<string> {\n const normalized = normalizeKnowledgeStateScope(scope)\n const entries = await knowledgeHashEntries(root, normalized)\n const files = entries.map(({ path, hash, mode }) => ({ path, hash, mode }))\n return sha256(\n JSON.stringify(\n normalized.pagesDirectory === 'knowledge' && !normalized.researchState\n ? files\n : { scope: normalized, files },\n ),\n )\n}\n\nexport interface KnowledgeFileIdentity {\n path: string\n hash: string\n transactionHash: string\n mode: number\n}\n\nexport async function knowledgeHashEntries(\n root: string,\n scope?: KnowledgeStateScope,\n): Promise<KnowledgeFileIdentity[]> {\n const entries: KnowledgeFileIdentity[] = []\n for (const path of knowledgeScopePaths(scope ?? {})) {\n try {\n const files =\n path === '.agent-knowledge/sources.json' || path === '.agent-knowledge/events.json'\n ? [{ ...(await readRegularFileWithinRoot(root, path)), path }]\n : await listRegularFilesWithinRoot(root, path)\n for (const file of files)\n entries.push(knowledgeFileIdentity(file.path, file.bytes, file.mode))\n } catch (error) {\n if (!isMissingFile(error)) throw error\n }\n }\n entries.sort((a, b) => a.path.localeCompare(b.path))\n return entries\n}\n\nfunction knowledgeFileIdentity(path: string, bytes: Buffer, mode: number): KnowledgeFileIdentity {\n return {\n path,\n hash: sha256(bytes.toString('base64')),\n transactionHash: createHash('sha256').update(bytes).digest('hex'),\n mode,\n }\n}\n","import { createHash } from 'node:crypto'\nimport { canonicalJson, contentHash } from '@tangle-network/agent-eval'\nimport type { AgentImprovementActivationResult } from '@tangle-network/agent-interface'\nimport { readRegularFileWithinRoot } from '../durable-fs'\nimport {\n applyKnowledgeFileTransaction,\n assertKnowledgeMutationPath,\n finishKnowledgeFileTransaction,\n type KnowledgeFileMutation,\n type KnowledgeFileTransaction,\n type KnowledgeFileTransactionPlanEntry,\n knowledgeFileTransactionPlanHash,\n prepareKnowledgeFileTransaction,\n rollbackKnowledgeFileTransaction,\n} from '../file-transaction'\nimport { writeKnowledgeIndex } from '../indexer'\nimport { type KnowledgeStateScope, normalizeKnowledgeStateScope } from '../knowledge-state-scope'\nimport { withKnowledgeMutation } from '../mutation-lock'\nimport type { RunRagKnowledgeImprovementLoopResult } from '../rag-improvement-loop'\nimport type { ResolvedKnowledgeImprovementActivationPersistence } from './activation'\nimport {\n loadKnowledgeActivationRecord,\n persistKnowledgeActivationResult,\n resolveKnowledgeActivationPersistence,\n sourceKnowledgeHash,\n} from './activation'\nimport type {\n KnowledgeImprovementCandidateRecord,\n KnowledgeImprovementCandidateRef,\n KnowledgeImprovementMutationReceipt,\n KnowledgeImprovementMutationResult,\n KnowledgeImprovementOptions,\n KnowledgeImprovementRunState,\n KnowledgeImprovementTarget,\n PromoteKnowledgeCandidateOptions,\n RestoreKnowledgeCandidateBaselineOptions,\n} from './contracts'\nimport { DEFAULT_LEASE_TTL_MS, KnowledgeImprovementCandidateRefSchema } from './contracts'\nimport {\n acquireRunLease,\n appendLedger,\n assertExactCandidatePlatform,\n blockRun,\n loadKnowledgeImprovementEventsFromRun,\n loadKnowledgeImprovementStateFromRun,\n saveState,\n withKnowledgeImprovementRun,\n} from './state'\nimport {\n assertCandidateEvidence,\n assertStateIdentity,\n candidateIdentityFor,\n hashKnowledgeBase,\n knowledgeHashEntries,\n withBaselineSnapshot,\n withMeasuredCandidateSnapshot,\n} from './workspace'\n\n/** Promote one previously measured candidate without rerunning research or evaluation. */\nexport async function promoteKnowledgeCandidate(\n options: PromoteKnowledgeCandidateOptions,\n): Promise<KnowledgeImprovementMutationResult> {\n return transitionKnowledgeCandidate(options, 'candidate')\n}\n\n/** Restore the frozen baseline paired with one previously measured candidate. */\nexport async function restoreKnowledgeCandidateBaseline(\n options: RestoreKnowledgeCandidateBaselineOptions,\n): Promise<KnowledgeImprovementMutationResult> {\n return transitionKnowledgeCandidate(options, 'baseline')\n}\n\nasync function transitionKnowledgeCandidate(\n options: PromoteKnowledgeCandidateOptions,\n target: KnowledgeImprovementTarget,\n): Promise<KnowledgeImprovementMutationResult> {\n assertExactCandidatePlatform()\n const candidateRef = Object.freeze(\n KnowledgeImprovementCandidateRefSchema.parse(options.candidate),\n )\n const now = options.now ?? (() => new Date())\n const activation = options.activation\n ? resolveKnowledgeActivationPersistence(options.activation, candidateRef, target)\n : undefined\n return withKnowledgeImprovementRun(options.root, candidateRef.runId, false, async (runDir) => {\n const lease = await acquireRunLease(runDir, {\n ownerId: options.ownerId ?? `pid-${process.pid}`,\n ttlMs: options.leaseTtlMs ?? DEFAULT_LEASE_TTL_MS,\n })\n try {\n lease.assertOwned()\n const state = await loadKnowledgeImprovementStateFromRun(\n options.root,\n candidateRef.runId,\n runDir,\n )\n return await applyKnowledgeCandidateTarget(\n {\n root: options.root,\n runDir,\n state,\n candidateRef,\n leaseTtlMs: options.leaseTtlMs ?? DEFAULT_LEASE_TTL_MS,\n assertRunOwned: lease.assertOwned,\n now,\n onState: options.onState,\n activation,\n },\n target,\n )\n } finally {\n await lease.release()\n }\n })\n}\n\ninterface KnowledgeCandidateTransitionInput {\n root: string\n runDir: string\n state: KnowledgeImprovementRunState\n candidateRef: KnowledgeImprovementCandidateRef\n activation?: ResolvedKnowledgeImprovementActivationPersistence\n leaseTtlMs: number\n assertRunOwned(): void\n now: () => Date\n onState?: KnowledgeImprovementOptions['onState']\n lifecycle?: RunRagKnowledgeImprovementLoopResult\n}\n\nasync function applyKnowledgeCandidateTarget(\n input: KnowledgeCandidateTransitionInput,\n target: KnowledgeImprovementTarget,\n): Promise<KnowledgeImprovementMutationResult> {\n const { candidateRef, runDir, state } = input\n await assertStateIdentity(input.root, candidateRef, state)\n const candidate = state.candidates.find((entry) => entry.candidateId === candidateRef.candidateId)\n if (\n !candidate ||\n canonicalJson(candidateIdentityFor(candidateRef.runId, state, candidate)) !==\n canonicalJson(candidateRef)\n ) {\n throw new Error('knowledge candidate approval does not match the measured candidate')\n }\n const action = target === 'candidate' ? 'promotion' : 'restore'\n const desiredHash = target === 'candidate' ? candidateRef.candidateHash : candidateRef.baseHash\n const purpose = knowledgeCandidateTransitionPurpose(candidateRef, state.implementationRef, target)\n const recoveryOwner = input.activation\n ? `knowledge-improvement-activation:${input.activation.activation.digest}`\n : 'knowledge-improvement-candidate-transition'\n return withKnowledgeMutation(\n input.root,\n async (mutationLock) => {\n const assertOwned = () => {\n mutationLock.assertOwned()\n input.assertRunOwned()\n }\n assertOwned()\n const transactionRoot = mutationLock.transactionRoot\n const recovery =\n mutationLock.recovery?.purpose === purpose ? mutationLock.recovery : undefined\n if (!recovery) {\n await assertCandidateEvidence(runDir, candidateRef, state.implementationRef)\n }\n const existingActivation = input.activation\n ? await loadKnowledgeActivationRecord(\n runDir,\n candidateRef,\n input.activation.activation,\n target,\n input.activation.identity,\n )\n : null\n if (existingActivation) {\n if (recovery?.direction === 'rollback') {\n throw new Error('stored knowledge activation result conflicts with a pending rollback')\n }\n if (recovery) {\n const recoveredHash = await hashKnowledgeBase(input.root, state.stateScope)\n if (recoveredHash !== existingActivation.mutation.afterHash) {\n throw new Error('stored knowledge activation result does not match the recovered files')\n }\n await finishKnowledgeFileTransaction({\n root: input.root,\n transactionRoot,\n transaction: recovery.transaction,\n assertOwned,\n })\n }\n if (existingActivation.result.outcome.status === 'conflict') {\n const reason = candidateTransitionConflictReason(\n target,\n candidateRef,\n existingActivation.mutation.afterHash,\n )\n const blocked = await blockCandidateTransition(\n input,\n candidate,\n target,\n reason,\n existingActivation.mutation.afterHash,\n )\n return { ...blocked, activationResult: existingActivation.result }\n }\n return candidateTransitionResult(\n input,\n candidate,\n target === 'candidate' && state.status === 'promoted',\n false,\n existingActivation.mutation,\n existingActivation.result,\n )\n }\n if (recovery?.direction === 'rollback') {\n await finishKnowledgeFileTransaction({\n root: input.root,\n transactionRoot,\n transaction: recovery.transaction,\n assertOwned,\n })\n }\n const recovered = recovery?.direction === 'apply' ? recovery : undefined\n let pending: KnowledgeFileTransaction | null =\n input.activation && recovered ? recovered.transaction : null\n const currentHash = await hashKnowledgeBase(input.root, state.stateScope)\n let transactionId = recovered?.transactionId ?? null\n if (recovered && currentHash !== desiredHash) {\n throw new Error(`recovered knowledge ${action} does not match the approved target`)\n }\n if (state.status === 'promoted' && state.promotedCandidateId !== candidate.candidateId) {\n throw new Error(\n `knowledge run already promoted '${state.promotedCandidateId ?? 'unknown'}'`,\n )\n }\n if (\n target === 'candidate' &&\n state.status === 'promoted' &&\n currentHash !== candidateRef.candidateHash\n ) {\n throw new Error(\n `promoted knowledge base changed: expected ${candidateRef.candidateHash}, got ${currentHash}`,\n )\n }\n if (state.status !== 'promoted' && state.status !== 'candidate-ready') {\n throw new Error(\n `knowledge candidate is not ready for ${action}: run=${state.status}, candidate=${candidate.status}`,\n )\n }\n if (currentHash !== state.baseHash && currentHash !== candidateRef.candidateHash) {\n const reason =\n target === 'candidate'\n ? `base changed before promotion: expected ${state.baseHash}, got ${currentHash}`\n : `knowledge changed before restore: expected ${candidateRef.candidateHash}, got ${currentHash}`\n const mutation = Object.freeze({\n target,\n beforeHash: currentHash,\n afterHash: currentHash,\n changed: false,\n transactionId: null,\n recovered: false,\n }) satisfies KnowledgeImprovementMutationReceipt\n const activationResult = input.activation\n ? await persistKnowledgeActivationResult(\n runDir,\n candidateRef,\n input.activation,\n target,\n mutation,\n )\n : undefined\n const blocked = await blockCandidateTransition(\n input,\n candidate,\n target,\n reason,\n currentHash,\n )\n return activationResult ? { ...blocked, activationResult } : blocked\n }\n\n if (currentHash !== desiredHash && !pending) {\n pending = await withMeasuredCandidateSnapshot(\n input.root,\n runDir,\n state,\n candidateRef,\n (resolved) =>\n withBaselineSnapshot(\n runDir,\n state.baseHash,\n async (baselineRoot) => {\n const sourceRoot = target === 'candidate' ? baselineRoot : resolved.root\n const targetRoot = target === 'candidate' ? resolved.root : baselineRoot\n const plan = await knowledgeFilePlanEntries(\n sourceRoot,\n targetRoot,\n state.stateScope,\n )\n assertCandidateTransitionPlan(plan, candidateRef, target, state.stateScope)\n return prepareKnowledgeFileTransaction({\n root: input.root,\n transactionRoot,\n purpose,\n ...normalizeKnowledgeStateScope(state.stateScope),\n recoveryOwner,\n mutations: await knowledgePlanMutations(targetRoot, plan),\n includeUnchanged: true,\n now: input.now,\n })\n },\n state.stateScope,\n ),\n )\n if (!pending) {\n throw new Error(`knowledge ${action} plan unexpectedly contained no file changes`)\n }\n transactionId = pending.transactionId\n try {\n assertCandidateTransitionTransaction(pending, candidateRef, target, state.stateScope)\n } catch (error) {\n try {\n await rollbackKnowledgeFileTransaction({\n root: input.root,\n transactionRoot,\n transaction: pending,\n beforeCommit: assertOwned,\n })\n await finishKnowledgeFileTransaction({\n root: input.root,\n transactionRoot,\n transaction: pending,\n assertOwned,\n })\n } catch (cleanupError) {\n throw new AggregateError(\n [error, cleanupError],\n `invalid knowledge ${action} transaction could not be removed`,\n )\n }\n throw error\n }\n }\n try {\n if (pending) {\n await applyKnowledgeFileTransaction({\n root: input.root,\n transactionRoot,\n transaction: pending,\n beforeCommit: assertOwned,\n })\n }\n assertOwned()\n if ((await hashKnowledgeBase(input.root, state.stateScope)) !== desiredHash) {\n throw new Error(`knowledge ${action} content does not match the approved target`)\n }\n await writeKnowledgeIndex(input.root, state.stateScope)\n } catch (error) {\n if (!pending) throw error\n if (recovered && input.activation) throw error\n try {\n assertOwned()\n } catch (ownershipError) {\n throw new AggregateError(\n [error, ownershipError],\n `knowledge ${action} lost its lock and left the transaction pending`,\n )\n }\n try {\n await rollbackKnowledgeFileTransaction({\n root: input.root,\n transactionRoot,\n transaction: pending,\n beforeCommit: assertOwned,\n })\n await finishKnowledgeFileTransaction({\n root: input.root,\n transactionRoot,\n transaction: pending,\n assertOwned,\n })\n await writeKnowledgeIndex(input.root, state.stateScope)\n } catch (rollbackError) {\n throw new AggregateError(\n [error, rollbackError],\n `knowledge ${action} failed and could not restore the previous files`,\n )\n }\n throw error\n }\n candidate.status = target === 'candidate' ? 'promoted' : 'candidate-ready'\n candidate.updatedAt = input.now().toISOString()\n state.status = candidate.status\n if (target === 'candidate') state.promotedCandidateId = candidate.candidateId\n else delete state.promotedCandidateId\n delete state.blockedReason\n state.updatedAt = input.now().toISOString()\n await saveState(runDir, state, input.onState)\n await ensureCandidateTransitionEvent(runDir, candidateRef, target)\n let finalHash = await hashKnowledgeBase(input.root, state.stateScope)\n if (finalHash !== desiredHash) {\n throw new Error(`knowledge ${action} changed before its result was returned`)\n }\n const mutation = Object.freeze({\n target,\n beforeHash: transactionId ? sourceKnowledgeHash(candidateRef, target) : currentHash,\n afterHash: finalHash,\n changed: transactionId !== null,\n transactionId,\n recovered: recovered !== undefined,\n }) satisfies KnowledgeImprovementMutationReceipt\n const activationResult = input.activation\n ? await persistKnowledgeActivationResult(\n runDir,\n candidateRef,\n input.activation,\n target,\n mutation,\n )\n : undefined\n if ((await hashKnowledgeBase(input.root, state.stateScope)) !== finalHash) {\n throw new Error(`knowledge ${action} changed while its result was persisted`)\n }\n if (pending) {\n await finishKnowledgeFileTransaction({\n root: input.root,\n transactionRoot,\n transaction: pending,\n assertOwned,\n })\n }\n finalHash = await hashKnowledgeBase(input.root, state.stateScope)\n if (finalHash !== desiredHash) {\n throw new Error(`knowledge ${action} changed before its result was returned`)\n }\n return candidateTransitionResult(\n input,\n candidate,\n target === 'candidate',\n false,\n mutation,\n activationResult,\n )\n },\n {\n staleMs: input.leaseTtlMs,\n resumeTransaction: {\n purpose,\n recoveryOwner,\n validate: (transaction) =>\n assertCandidateTransitionTransaction(transaction, candidateRef, target, state.stateScope),\n deferFinish: input.activation !== undefined,\n },\n },\n )\n}\n\nfunction candidateTransitionConflictReason(\n target: KnowledgeImprovementTarget,\n candidate: KnowledgeImprovementCandidateRef,\n currentHash: string,\n): string {\n return target === 'candidate'\n ? `base changed before promotion: expected ${candidate.baseHash}, got ${currentHash}`\n : `knowledge changed before restore: expected ${candidate.candidateHash}, got ${currentHash}`\n}\n\nasync function blockCandidateTransition(\n input: KnowledgeCandidateTransitionInput,\n candidate: KnowledgeImprovementCandidateRecord,\n target: KnowledgeImprovementTarget,\n reason: string,\n currentHash: string,\n): Promise<KnowledgeImprovementMutationResult> {\n if (input.state.status === 'promoted') {\n candidate.status = 'blocked'\n candidate.updatedAt = input.now().toISOString()\n delete input.state.promotedCandidateId\n }\n await blockRun(input.runDir, input.state, reason, input.onState, input.now)\n await appendLedger(input.runDir, {\n type: target === 'candidate' ? 'promotion.blocked' : 'restore.blocked',\n runId: input.candidateRef.runId,\n candidateId: candidate.candidateId,\n reason,\n })\n return candidateTransitionResult(input, candidate, false, true, {\n target,\n beforeHash: currentHash,\n afterHash: currentHash,\n changed: false,\n transactionId: null,\n recovered: false,\n })\n}\n\nfunction candidateTransitionResult(\n input: KnowledgeCandidateTransitionInput,\n candidate: KnowledgeImprovementCandidateRecord,\n promoted: boolean,\n blocked: boolean,\n mutation: KnowledgeImprovementMutationReceipt,\n activationResult?: AgentImprovementActivationResult,\n): KnowledgeImprovementMutationResult {\n return {\n runId: input.candidateRef.runId,\n state: input.state,\n candidate,\n ...(input.lifecycle ? { lifecycle: input.lifecycle } : {}),\n mutation,\n ...(activationResult ? { activationResult } : {}),\n promoted,\n blocked,\n }\n}\n\nfunction knowledgeCandidateTransitionPurpose(\n candidate: KnowledgeImprovementCandidateRef,\n implementationRef: string,\n target: KnowledgeImprovementTarget,\n): string {\n const action = target === 'candidate' ? 'promotion' : 'restore'\n return `knowledge-${action}:${contentHash({ candidate, implementationRef })}`\n}\n\nexport async function knowledgeFilePlanEntries(\n sourceRoot: string,\n targetRoot: string,\n scope?: KnowledgeStateScope,\n): Promise<KnowledgeFileTransactionPlanEntry[]> {\n const [before, after] = await Promise.all([\n knowledgeHashEntries(sourceRoot, scope),\n knowledgeHashEntries(targetRoot, scope),\n ])\n const beforeByPath = new Map(before.map((entry) => [entry.path, entry]))\n const afterByPath = new Map(after.map((entry) => [entry.path, entry]))\n const paths = [\n ...new Set([...before.map((entry) => entry.path), ...after.map((entry) => entry.path)]),\n ].sort((left, right) => left.localeCompare(right))\n return paths.map((path) => {\n assertKnowledgeMutationPath(\n path,\n normalizeKnowledgeStateScope(scope).pagesDirectory,\n scope?.researchState,\n )\n const beforeEntry = beforeByPath.get(path)\n const afterEntry = afterByPath.get(path)\n return {\n path,\n beforeHash: beforeEntry?.transactionHash ?? null,\n afterHash: afterEntry?.transactionHash ?? null,\n ...(beforeEntry ? { beforeMode: beforeEntry.mode } : {}),\n ...(afterEntry ? { afterMode: afterEntry.mode } : {}),\n }\n })\n}\n\nasync function knowledgePlanMutations(\n targetRoot: string,\n plan: readonly KnowledgeFileTransactionPlanEntry[],\n): Promise<KnowledgeFileMutation[]> {\n return Promise.all(\n plan.map(async (entry) => {\n if (entry.afterHash === null) return { path: entry.path, content: null }\n const file = await readRegularFileWithinRoot(targetRoot, entry.path)\n const actualHash = createHash('sha256').update(file.bytes).digest('hex')\n if (actualHash !== entry.afterHash || file.mode !== entry.afterMode) {\n throw new Error(`knowledge target file changed before activation: ${entry.path}`)\n }\n return { path: entry.path, content: file.bytes, mode: file.mode }\n }),\n )\n}\n\nfunction assertCandidateTransitionPlan(\n plan: readonly KnowledgeFileTransactionPlanEntry[],\n candidate: KnowledgeImprovementCandidateRef,\n target: KnowledgeImprovementTarget,\n scope?: KnowledgeStateScope,\n): void {\n const approvedDirection = target === 'candidate' ? plan : reverseKnowledgeFilePlan(plan)\n const actualPlanHash = knowledgeFileTransactionPlanHash(\n approvedDirection,\n normalizeKnowledgeStateScope(scope).pagesDirectory,\n scope?.researchState,\n )\n if (actualPlanHash !== candidate.promotionPlanHash) {\n throw new Error(\n `knowledge candidate plan changed after approval: expected ${candidate.promotionPlanHash}, got ${actualPlanHash}`,\n )\n }\n}\n\nfunction assertCandidateTransitionTransaction(\n transaction: KnowledgeFileTransaction,\n candidate: KnowledgeImprovementCandidateRef,\n target: KnowledgeImprovementTarget,\n scope?: KnowledgeStateScope,\n): void {\n assertCandidateTransitionPlan(transaction.entries, candidate, target, scope)\n}\n\nfunction reverseKnowledgeFilePlan(\n plan: readonly KnowledgeFileTransactionPlanEntry[],\n): KnowledgeFileTransactionPlanEntry[] {\n return plan.map((entry) => ({\n path: entry.path,\n beforeHash: entry.afterHash,\n afterHash: entry.beforeHash,\n ...(entry.afterMode === undefined ? {} : { beforeMode: entry.afterMode }),\n ...(entry.beforeMode === undefined ? {} : { afterMode: entry.beforeMode }),\n }))\n}\n\nasync function ensureCandidateTransitionEvent(\n runDir: string,\n candidateRef: KnowledgeImprovementCandidateRef,\n target: KnowledgeImprovementTarget,\n): Promise<void> {\n if (await hasCandidateTransitionEvent(runDir, candidateRef, target)) return\n await appendLedger(runDir, {\n type: target === 'candidate' ? 'candidate.promoted' : 'candidate.restored',\n runId: candidateRef.runId,\n candidateId: candidateRef.candidateId,\n candidateHash: candidateRef.candidateHash,\n evidenceHash: candidateRef.evidenceHash,\n promotionPlanHash: candidateRef.promotionPlanHash,\n })\n}\n\nasync function hasCandidateTransitionEvent(\n runDir: string,\n candidateRef: KnowledgeImprovementCandidateRef,\n target: KnowledgeImprovementTarget,\n): Promise<boolean> {\n const eventType = target === 'candidate' ? 'candidate.promoted' : 'candidate.restored'\n let matched = false\n for (const row of await loadKnowledgeImprovementEventsFromRun(runDir)) {\n if (row.type !== eventType || row.candidateId !== candidateRef.candidateId) continue\n if (\n row.runId !== candidateRef.runId ||\n row.candidateHash !== candidateRef.candidateHash ||\n row.evidenceHash !== candidateRef.evidenceHash ||\n row.promotionPlanHash !== candidateRef.promotionPlanHash\n ) {\n throw new Error('persisted knowledge activation event conflicts with the approved candidate')\n }\n matched = true\n }\n return matched\n}\n","import { join } from 'node:path'\nimport { contentHash } from '@tangle-network/agent-eval'\nimport { writeJsonDurableWithinRoot } from '../durable-fs'\nimport type { EvalKnowledgeBundleBuildResult, KnowledgeReadinessSpec } from '../eval-readiness'\nimport { knowledgeFileTransactionPlanHash } from '../file-transaction'\nimport { sha256 } from '../ids'\nimport { assertImmutableRef } from '../immutable-ref'\nimport { buildKnowledgeIndex } from '../indexer'\nimport { normalizeKnowledgeStateScope } from '../knowledge-state-scope'\nimport { ragAnswerEvidenceRejectionReasons } from '../rag-answer-evidence'\nimport type { KnowledgeBaseQualityReport } from '../rag-eval'\nimport {\n type RagKnowledgeImprovementPhase,\n type RagKnowledgeResearchOptions,\n type RunRagKnowledgeImprovementLoopOptions,\n type RunRagKnowledgeImprovementLoopResult,\n runRagKnowledgeImprovementLoop,\n} from '../rag-improvement-loop'\nimport { runRagKnowledgeImprovementPhases } from '../rag-improvement-phases'\nimport { assessKnowledgeIndex } from '../readiness-helpers'\nimport { mean } from '../statistics'\nimport type { ValidateKnowledgeResult } from '../validate'\nimport type {\n KnowledgeImprovementCandidateRecord,\n KnowledgeImprovementMetric,\n KnowledgeImprovementOptions,\n KnowledgeImprovementRunState,\n} from './contracts'\nimport {\n EVALUATION_PHASES,\n improvementMetricSchema,\n KnowledgeImprovementEvidenceSchema,\n UPDATE_PHASES,\n} from './contracts'\nimport {\n appendLedger,\n candidateEvidenceRelativePath,\n saveState,\n withCandidateWorkspace,\n} from './state'\nimport { knowledgeFilePlanEntries } from './transition'\nimport {\n assertCandidateEvidence,\n candidateRefFor,\n clearCandidateMeasurement,\n hashKnowledgeBase,\n withBaselineSnapshot,\n withFrozenCandidateWorkspace,\n} from './workspace'\n\nexport function assertKnowledgeImprovementOptions(options: KnowledgeImprovementOptions): void {\n assertImmutableRef(options.implementationRef, 'knowledge improvement implementationRef')\n normalizeKnowledgeStateScope(options.stateScope)\n for (const phase of options.requiredPhases ?? []) {\n if (options.enabledPhases && !options.enabledPhases.includes(phase)) {\n throw new Error(`required phase ${phase} is not enabled`)\n }\n }\n if (\n options.answerQualityCostCeiling !== undefined &&\n (!Number.isFinite(options.answerQualityCostCeiling) || options.answerQualityCostCeiling < 0)\n ) {\n throw new Error(\n 'knowledge improvement answerQualityCostCeiling must be a non-negative finite number',\n )\n }\n if (options.ragOptimization) {\n assertImmutableRef(\n options.ragOptimization.executionRef,\n 'knowledge improvement RAG executionRef',\n )\n }\n if (options.retrieval) {\n assertImmutableRef(\n options.retrieval.executionRef,\n 'knowledge improvement retrieval executionRef',\n )\n }\n if (options.step && options.knowledgeResearch?.step) {\n throw new Error('improveKnowledgeBase accepts either step or knowledgeResearch.step, not both')\n }\n const updateDrivers = [\n Boolean(options.step ?? options.knowledgeResearch),\n Boolean(options.updateKnowledge),\n ].filter(Boolean).length\n if (updateDrivers > 1) {\n throw new Error(\n 'improveKnowledgeBase accepts only one knowledge-update driver: knowledgeResearch or updateKnowledge',\n )\n }\n}\n\nexport async function measureCandidate(\n runId: string,\n runDir: string,\n state: KnowledgeImprovementRunState,\n candidate: KnowledgeImprovementCandidateRecord,\n options: KnowledgeImprovementOptions,\n now: () => Date,\n): Promise<{\n candidate: KnowledgeImprovementCandidateRecord\n evaluation: KnowledgeImprovementMetric\n lifecycle?: RunRagKnowledgeImprovementLoopResult\n finalEvaluated: boolean\n}> {\n return withCandidateWorkspace(runDir, candidate, async (candidateRoot) => {\n const currentCandidateHash = await hashKnowledgeBase(candidateRoot, options.stateScope)\n if (\n candidate.status === 'candidate-ready' &&\n candidate.candidateHash === currentCandidateHash &&\n candidate.evidenceHash !== undefined &&\n candidate.promotionPlanHash !== undefined\n ) {\n const evidence = await assertCandidateEvidence(\n runDir,\n candidateRefFor(runId, state, candidate),\n state.implementationRef,\n )\n return {\n candidate,\n evaluation: evidence.evaluation,\n ...(evidence.lifecycle === null\n ? {}\n : { lifecycle: evidence.lifecycle as RunRagKnowledgeImprovementLoopResult }),\n finalEvaluated: shouldRunEvaluationStage(options),\n }\n }\n\n clearCandidateMeasurement(candidate)\n let lifecycle: RunRagKnowledgeImprovementLoopResult | undefined\n if (candidate.status === 'running') {\n lifecycle = await runCandidateUpdateLifecycle(runId, candidate, candidateRoot, options, now)\n }\n return withFrozenCandidateWorkspace(\n runDir,\n candidate,\n candidateRoot,\n async (snapshot) => {\n const development = await evaluateCandidate(\n runDir,\n state,\n candidate,\n snapshot,\n lifecycle,\n options,\n now,\n false,\n )\n if (!development.evaluation.passed || !shouldRunEvaluationStage(options)) {\n return {\n ...development,\n ...(lifecycle ? { lifecycle } : {}),\n finalEvaluated: false,\n }\n }\n\n candidate.finalEvaluationStartedAt = now().toISOString()\n candidate.updatedAt = candidate.finalEvaluationStartedAt\n state.updatedAt = candidate.finalEvaluationStartedAt\n await saveState(runDir, state, options.onState)\n await appendLedger(runDir, {\n type: 'candidate.final-evaluation-started',\n runId: state.runId,\n candidateId: candidate.candidateId,\n })\n lifecycle = await runCandidateEvaluationLifecycle(\n runId,\n runDir,\n candidate,\n snapshot.root,\n snapshot.hash,\n lifecycle,\n options,\n now,\n )\n const measured = await evaluateCandidate(\n runDir,\n state,\n candidate,\n snapshot,\n lifecycle,\n options,\n now,\n true,\n )\n return {\n ...measured,\n ...(lifecycle ? { lifecycle } : {}),\n finalEvaluated: true,\n }\n },\n options.stateScope,\n )\n })\n}\n\nasync function runCandidateUpdateLifecycle(\n runId: string,\n candidate: KnowledgeImprovementCandidateRecord,\n candidateRoot: string,\n options: KnowledgeImprovementOptions,\n now: () => Date,\n): Promise<RunRagKnowledgeImprovementLoopResult | undefined> {\n if (!shouldRunUpdateStage(options)) return undefined\n const lifecycle = await runRagKnowledgeImprovementLoop({\n goal: options.goal,\n diagnose: options.diagnose,\n acquireKnowledge: options.acquireKnowledge,\n knowledgeResearch: candidateKnowledgeResearchOptions(candidateRoot, options),\n updateKnowledge: candidateUpdateHook(runId, candidate, candidateRoot, options),\n enabledPhases: selectedStagePhases(options, UPDATE_PHASES),\n requiredPhases: selectedStageRequiredPhases(options, UPDATE_PHASES),\n signal: options.signal,\n now,\n })\n return lifecycle\n}\n\nasync function runCandidateEvaluationLifecycle(\n runId: string,\n runDir: string,\n candidate: KnowledgeImprovementCandidateRecord,\n candidateRoot: string,\n candidateHash: string,\n lifecycle: RunRagKnowledgeImprovementLoopResult | undefined,\n options: KnowledgeImprovementOptions,\n now: () => Date,\n): Promise<RunRagKnowledgeImprovementLoopResult | undefined> {\n if (!shouldRunEvaluationStage(options)) return undefined\n const candidateIndex = await buildKnowledgeIndex(candidateRoot, options.stateScope)\n return withBaselineSnapshot(\n runDir,\n candidate.baseHash,\n (baselineRoot) =>\n runRagKnowledgeImprovementPhases(\n {\n goal: options.goal,\n optimization: options.ragOptimization\n ? {\n ...options.ragOptimization,\n executionRef: candidateExecutionRef(\n options.ragOptimization.executionRef,\n candidateHash,\n ),\n runDir:\n options.ragOptimization.runDir ??\n join(runDir, 'rag-optimization', candidate.candidateId),\n run: (input) =>\n options.ragOptimization!.run({\n ...input,\n runId,\n iteration: candidate.iteration,\n candidateId: candidate.candidateId,\n root: candidateRoot,\n baselineRoot,\n candidateRoot,\n candidateIndex,\n baseHash: candidate.baseHash,\n }),\n }\n : undefined,\n retrieval: options.retrieval\n ? {\n ...options.retrieval,\n executionRef: candidateExecutionRef(options.retrieval.executionRef, candidateHash),\n index: candidateIndex,\n runDir:\n options.retrieval.runDir ?? join(runDir, 'retrieval', candidate.candidateId),\n }\n : undefined,\n evaluateAnswers: options.evaluateAnswers,\n answerQualityCostCeiling: options.answerQualityCostCeiling,\n decidePromotion: options.decidePromotion,\n enabledPhases: selectedStagePhases(options, EVALUATION_PHASES),\n requiredPhases: selectedStageRequiredPhases(options, EVALUATION_PHASES),\n signal: options.signal,\n now,\n },\n lifecycle,\n ),\n options.stateScope,\n )\n}\n\nfunction candidateExecutionRef(executionRef: string, candidateHash: string): string {\n return `sha256:${sha256(`${executionRef}\\n${candidateHash}`)}`\n}\n\nfunction candidateKnowledgeResearchOptions(\n candidateRoot: string,\n options: KnowledgeImprovementOptions,\n): RagKnowledgeResearchOptions | undefined {\n if (!options.step && !options.knowledgeResearch) return undefined\n const { step: researchStep, ...rest } = options.knowledgeResearch ?? {}\n const step = options.step ?? researchStep\n return {\n ...rest,\n root: candidateRoot,\n pagesDirectory: normalizeKnowledgeStateScope(options.stateScope).pagesDirectory,\n step,\n maxIterations:\n rest.maxIterations ?? (step ? (options.candidateResearchIterations ?? 3) : undefined),\n strict: rest.strict ?? options.strict,\n readinessSpecs: rest.readinessSpecs ?? options.readinessSpecs,\n readinessTaskId: rest.readinessTaskId ?? options.readinessTaskId,\n readiness: rest.readiness ?? options.readiness,\n }\n}\n\nfunction candidateUpdateHook(\n runId: string,\n candidate: KnowledgeImprovementCandidateRecord,\n candidateRoot: string,\n options: KnowledgeImprovementOptions,\n): RunRagKnowledgeImprovementLoopOptions['updateKnowledge'] {\n if (!options.updateKnowledge) return undefined\n return (input) =>\n options.updateKnowledge!({\n ...input,\n runId,\n iteration: candidate.iteration,\n candidateId: candidate.candidateId,\n root: candidateRoot,\n baselineRoot: options.root,\n candidateRoot,\n baseHash: candidate.baseHash,\n })\n}\n\nfunction shouldRunUpdateStage(options: KnowledgeImprovementOptions): boolean {\n const phases = selectedStagePhases(options, UPDATE_PHASES)\n if (phases.length === 0) return false\n return Boolean(\n (phases.includes('gap-diagnosis') && options.diagnose) ||\n (phases.includes('knowledge-acquisition') && options.acquireKnowledge) ||\n (phases.includes('knowledge-update') &&\n (options.step || options.knowledgeResearch || options.updateKnowledge)) ||\n selectedStageRequiredPhases(options, UPDATE_PHASES).length > 0,\n )\n}\n\nfunction shouldRunEvaluationStage(options: KnowledgeImprovementOptions): boolean {\n const phases = selectedStagePhases(options, EVALUATION_PHASES)\n if (phases.length === 0) return false\n return Boolean(\n (phases.includes('rag-optimization') && options.ragOptimization) ||\n (phases.includes('retrieval-tuning') && options.retrieval) ||\n (phases.includes('answer-quality') && options.evaluateAnswers) ||\n (phases.includes('promotion') && options.decidePromotion) ||\n options.evaluate ||\n selectedStageRequiredPhases(options, EVALUATION_PHASES).length > 0,\n )\n}\n\nfunction selectedStagePhases(\n options: Pick<KnowledgeImprovementOptions, 'enabledPhases'>,\n stagePhases: readonly RagKnowledgeImprovementPhase[],\n): RagKnowledgeImprovementPhase[] {\n const requested = options.enabledPhases ?? stagePhases\n return requested.filter((phase) => stagePhases.includes(phase))\n}\n\nfunction selectedStageRequiredPhases(\n options: Pick<KnowledgeImprovementOptions, 'requiredPhases'>,\n stagePhases: readonly RagKnowledgeImprovementPhase[],\n): RagKnowledgeImprovementPhase[] {\n return (options.requiredPhases ?? []).filter((phase) => stagePhases.includes(phase))\n}\n\nasync function evaluateCandidate(\n runDir: string,\n state: KnowledgeImprovementRunState,\n candidate: KnowledgeImprovementCandidateRecord,\n snapshot: { root: string; hash: string },\n lifecycle: RunRagKnowledgeImprovementLoopResult | undefined,\n options: KnowledgeImprovementOptions,\n now: () => Date,\n useConfiguredEvaluator: boolean,\n): Promise<{\n candidate: KnowledgeImprovementCandidateRecord\n evaluation: KnowledgeImprovementMetric\n}> {\n return withBaselineSnapshot(\n runDir,\n state.baseHash,\n async (baselineRoot) => {\n const [baselineIndex, candidateIndex] = await Promise.all([\n buildKnowledgeIndex(baselineRoot, options.stateScope),\n buildKnowledgeIndex(snapshot.root, options.stateScope),\n ])\n const { validation, readiness, kbQuality } = assessKnowledgeIndex(options, candidateIndex)\n const candidateHash = snapshot.hash\n const evaluator = useConfiguredEvaluator ? options.evaluate : options.evaluateDevelopment\n const configuredMetric = evaluator\n ? evaluator({\n runId: state.runId,\n iteration: candidate.iteration,\n root: options.root,\n baselineRoot,\n candidateRoot: snapshot.root,\n baselineIndex,\n candidateIndex,\n baseHash: state.baseHash,\n candidateHash,\n validation,\n readiness,\n kbQuality,\n lifecycle,\n signal: options.signal,\n })\n : undefined\n const metric =\n configuredMetric ??\n defaultKnowledgeImprovementMetric(\n validation,\n readiness,\n options.readinessSpecs,\n kbQuality,\n lifecycle,\n )\n const evaluation = applyLifecycleFailures(\n normalizeMetric(await metric),\n lifecycle,\n options.answerQualityCostCeiling,\n )\n const measuredHash = await hashKnowledgeBase(snapshot.root, options.stateScope)\n if (measuredHash !== candidateHash) {\n throw new Error(\n `knowledge candidate changed during evaluation: expected ${candidateHash}, got ${measuredHash}`,\n )\n }\n candidate.candidateHash = candidateHash\n candidate.promotionPlanHash = knowledgeFileTransactionPlanHash(\n await knowledgeFilePlanEntries(baselineRoot, snapshot.root, options.stateScope),\n normalizeKnowledgeStateScope(options.stateScope).pagesDirectory,\n options.stateScope?.researchState,\n )\n const evidence = KnowledgeImprovementEvidenceSchema.parse(\n JSON.parse(\n JSON.stringify({\n kind: 'knowledge-improvement-evidence',\n runId: state.runId,\n candidateId: candidate.candidateId,\n iteration: candidate.iteration,\n goalHash: sha256(state.goal),\n implementationRef: state.implementationRef,\n baseHash: candidate.baseHash,\n candidateHash,\n promotionPlanHash: candidate.promotionPlanHash,\n validation,\n readiness: readiness ?? null,\n kbQuality,\n evaluation,\n lifecycle: lifecycle ?? null,\n }),\n ),\n )\n candidate.evidenceHash = contentHash(evidence)\n candidate.updatedAt = now().toISOString()\n await writeJsonDurableWithinRoot(\n runDir,\n candidateEvidenceRelativePath(candidate.candidateId),\n evidence,\n )\n await appendLedger(runDir, {\n type: 'candidate.evaluated',\n runId: state.runId,\n candidateId: candidate.candidateId,\n score: evaluation.score,\n passed: evaluation.passed,\n })\n return { candidate, evaluation }\n },\n options.stateScope,\n )\n}\n\nfunction defaultKnowledgeImprovementMetric(\n validation: ValidateKnowledgeResult,\n readiness: EvalKnowledgeBundleBuildResult | undefined,\n readinessSpecs: readonly KnowledgeReadinessSpec[] | undefined,\n kbQuality: KnowledgeBaseQualityReport,\n lifecycle: RunRagKnowledgeImprovementLoopResult | undefined,\n): KnowledgeImprovementMetric {\n const blockingMissing = readiness?.report.blockingMissingRequirements.length ?? 0\n const blockingTotal = readinessSpecs?.filter((spec) => spec.importance === 'blocking').length ?? 0\n const dimensions: Record<string, number> = {\n validation: validation.ok ? 1 : 0,\n kb_quality: kbQuality.ok ? 1 : 0,\n ...(blockingTotal > 0\n ? { blocking_readiness: Math.max(0, blockingTotal - blockingMissing) / blockingTotal }\n : {}),\n ...(lifecycle?.answerQuality\n ? { answer_quality: mean(Object.values(lifecycle.answerQuality.metrics)) }\n : {}),\n ...(lifecycle?.promotion ? { promotion_decision: lifecycle.promotion.promoted ? 1 : 0 } : {}),\n }\n const failedReasons = [\n validation.ok ? undefined : 'candidate validation failed',\n kbQuality.ok ? undefined : 'candidate KB quality check failed',\n blockingMissing === 0\n ? undefined\n : `${blockingMissing}/${blockingTotal} blocking knowledge requirements still missing`,\n ].filter((reason): reason is string => Boolean(reason))\n return {\n score: mean(Object.values(dimensions)),\n passed: failedReasons.length === 0,\n dimensions,\n notes: [\n failedReasons.length === 0 ? 'candidate passed configured checks' : failedReasons.join('; '),\n !lifecycle?.answerQuality && !lifecycle?.optimization && !lifecycle?.retrieval\n ? 'structural checks only; no task outcome evaluation was performed'\n : undefined,\n ]\n .filter((note): note is string => note !== undefined)\n .join('; '),\n provenance: {\n evaluator: '@tangle-network/agent-knowledge/default-knowledge-improvement-metric',\n version: '2',\n method: 'deterministic',\n },\n }\n}\n\nfunction applyLifecycleFailures(\n metric: KnowledgeImprovementMetric,\n lifecycle: RunRagKnowledgeImprovementLoopResult | undefined,\n answerQualityCostCeiling: number | undefined,\n): KnowledgeImprovementMetric {\n const answerQualityFailures = lifecycle?.answerQuality\n ? ragAnswerEvidenceRejectionReasons(lifecycle.answerQuality, answerQualityCostCeiling)\n : []\n const reasons = [\n metric.notes,\n ...answerQualityFailures,\n lifecycle?.promotion && !lifecycle.promotion.promoted\n ? `promotion decision held: ${lifecycle.promotion.reason}`\n : undefined,\n ].filter((reason): reason is string => Boolean(reason))\n const forcedFailure =\n answerQualityFailures.length > 0 ||\n Boolean(lifecycle?.promotion && !lifecycle.promotion.promoted)\n return {\n ...metric,\n passed: metric.passed && !forcedFailure,\n notes: reasons.length > 0 ? reasons.join('; ') : metric.notes,\n }\n}\n\nfunction normalizeMetric(metric: KnowledgeImprovementMetric): KnowledgeImprovementMetric {\n return improvementMetricSchema.parse(metric)\n}\n","import { canonicalJson } from '@tangle-network/agent-eval'\nimport { isMissingFile } from '../durable-fs'\nimport { normalizeKnowledgeStateScope } from '../knowledge-state-scope'\nimport { withKnowledgeMutation } from '../mutation-lock'\nimport type { RunRagKnowledgeImprovementLoopResult } from '../rag-improvement-loop'\nimport type {\n KnowledgeImprovementCandidateRecord,\n KnowledgeImprovementMetric,\n KnowledgeImprovementOptions,\n KnowledgeImprovementResult,\n} from './contracts'\nimport { DEFAULT_LEASE_TTL_MS, runIdSchema } from './contracts'\nimport { assertKnowledgeImprovementOptions, measureCandidate } from './evaluation'\nimport {\n acquireRunLease,\n appendLedger,\n assertExactCandidatePlatform,\n blockRun,\n findActiveCandidate,\n knowledgeImprovementRunId,\n loadKnowledgeImprovementStateFromRun,\n saveState,\n withKnowledgeImprovementRun,\n} from './state'\nimport {\n assertCandidateEvidence,\n candidateRefFor,\n createBaselineSnapshot,\n createCandidateWorkspace,\n ensureBaselineSnapshot,\n hashKnowledgeBase,\n withBaselineSnapshot,\n} from './workspace'\n\nexport async function improveKnowledgeBase(\n options: KnowledgeImprovementOptions,\n): Promise<KnowledgeImprovementResult> {\n assertExactCandidatePlatform()\n options = {\n ...options,\n ...(options.stateScope === undefined\n ? {}\n : { stateScope: Object.freeze(normalizeKnowledgeStateScope(options.stateScope)) }),\n }\n assertKnowledgeImprovementOptions(options)\n const now = options.now ?? (() => new Date())\n const runId = runIdSchema.parse(\n options.runId ?? knowledgeImprovementRunId(options.root, options.goal),\n )\n return withKnowledgeImprovementRun(options.root, runId, true, (runDir) =>\n improveKnowledgeBaseInRun(options, runId, runDir, now),\n )\n}\n\nasync function improveKnowledgeBaseInRun(\n options: KnowledgeImprovementOptions,\n runId: string,\n runDir: string,\n now: () => Date,\n): Promise<KnowledgeImprovementResult> {\n const lease = await acquireRunLease(runDir, {\n ownerId: options.ownerId ?? `pid-${process.pid}`,\n ttlMs: options.leaseTtlMs ?? DEFAULT_LEASE_TTL_MS,\n })\n\n try {\n lease.assertOwned()\n let state =\n options.resume === false\n ? null\n : await loadKnowledgeImprovementStateFromRun(options.root, runId, runDir).catch((error) => {\n if (isMissingFile(error)) return null\n throw error\n })\n if (!state) {\n const baseHash = await hashKnowledgeBase(options.root, options.stateScope)\n await createBaselineSnapshot(runDir, options.root, baseHash, options.stateScope)\n state = {\n runId,\n root: options.root,\n goal: options.goal,\n implementationRef: options.implementationRef,\n ...(options.stateScope === undefined\n ? {}\n : { stateScope: normalizeKnowledgeStateScope(options.stateScope) }),\n status: 'running',\n baseHash,\n createdAt: now().toISOString(),\n updatedAt: now().toISOString(),\n ownerId: lease.ownerId,\n candidates: [],\n }\n await saveState(runDir, state, options.onState)\n await appendLedger(runDir, { type: 'run.created', runId, baseHash })\n }\n if (\n canonicalJson(normalizeKnowledgeStateScope(state.stateScope)) !==\n canonicalJson(normalizeKnowledgeStateScope(options.stateScope))\n ) {\n throw new Error('knowledge improvement state does not match the requested stateScope')\n }\n if (state.goal !== options.goal) {\n throw new Error('knowledge improvement state does not match the requested goal')\n }\n if (state.implementationRef !== options.implementationRef) {\n throw new Error('knowledge improvement state does not match the requested implementationRef')\n }\n const promotedCandidateId = state.promotedCandidateId\n const promotedCandidate =\n state.status === 'promoted'\n ? state.candidates.find((candidate) => candidate.candidateId === promotedCandidateId)\n : undefined\n if (state.status === 'promoted' && !promotedCandidate) {\n throw new Error('promoted knowledge state has no promoted candidate')\n }\n if (state.status === 'promoted') {\n const promoted = promotedCandidate!\n const promotedState = state\n return withKnowledgeMutation(options.root, async () => {\n const currentHash = await hashKnowledgeBase(options.root, options.stateScope)\n if (currentHash !== promoted.candidateHash) {\n throw new Error(\n `promoted knowledge base changed: expected ${promoted.candidateHash}, got ${currentHash}`,\n )\n }\n const evidence = await assertCandidateEvidence(\n runDir,\n candidateRefFor(runId, promotedState, promoted),\n promotedState.implementationRef,\n )\n return {\n runId,\n state: promotedState,\n candidate: promoted,\n evaluation: evidence.evaluation,\n promoted: true,\n blocked: false,\n }\n })\n }\n await withKnowledgeMutation(options.root, () => undefined)\n await ensureBaselineSnapshot(runDir, options.root, state.baseHash, state.stateScope)\n\n if (state.status === 'blocked') {\n return { runId, state, promoted: false, blocked: true }\n }\n\n const maxCandidates = Math.max(1, options.maxCandidates ?? 1)\n let candidate = findActiveCandidate(state)\n let lastRejectedCandidate: KnowledgeImprovementCandidateRecord | undefined\n let lastRejectedEvaluation: KnowledgeImprovementMetric | undefined\n let lifecycle: RunRagKnowledgeImprovementLoopResult | undefined\n\n while (candidate || state.candidates.length < maxCandidates) {\n if (candidate?.status === 'running' && candidate.finalEvaluationStartedAt) {\n state = await blockRun(\n runDir,\n state,\n `candidate '${candidate.candidateId}' was interrupted after final evaluation started; refusing to reuse final cases`,\n options.onState,\n now,\n )\n return {\n runId,\n state,\n candidate,\n promoted: false,\n blocked: true,\n }\n }\n if (!candidate) {\n const currentHash = await hashKnowledgeBase(options.root, options.stateScope)\n if (currentHash !== state.baseHash) {\n state = await blockRun(\n runDir,\n state,\n `base changed before candidate creation: expected ${state.baseHash}, got ${currentHash}`,\n options.onState,\n now,\n )\n return { runId, state, promoted: false, blocked: true }\n }\n const activeState = state\n candidate = await withBaselineSnapshot(\n runDir,\n activeState.baseHash,\n (baselineRoot) => createCandidateWorkspace(runDir, activeState, baselineRoot, now),\n state.stateScope,\n )\n state.candidates.push(candidate)\n state.status = 'running'\n state.updatedAt = now().toISOString()\n await saveState(runDir, state, options.onState)\n await appendLedger(runDir, {\n type: 'candidate.created',\n runId,\n candidateId: candidate.candidateId,\n iteration: candidate.iteration,\n })\n }\n\n const measured = await measureCandidate(runId, runDir, state, candidate, options, now)\n candidate = measured.candidate\n const evaluation = measured.evaluation\n lifecycle = measured.lifecycle\n\n if (evaluation.passed) {\n candidate.status = 'candidate-ready'\n candidate.updatedAt = now().toISOString()\n state.status = 'candidate-ready'\n state.updatedAt = now().toISOString()\n await saveState(runDir, state, options.onState)\n await appendLedger(runDir, {\n type: 'candidate.ready',\n runId,\n candidateId: candidate.candidateId,\n })\n break\n }\n\n candidate.status = 'rejected'\n state.status = 'running'\n state.updatedAt = now().toISOString()\n await saveState(runDir, state, options.onState)\n await appendLedger(runDir, {\n type: 'candidate.rejected',\n runId,\n candidateId: candidate.candidateId,\n })\n lastRejectedCandidate = candidate\n lastRejectedEvaluation = evaluation\n candidate = undefined\n if (measured.finalEvaluated) break\n }\n\n if (!candidate) {\n state.status = 'rejected'\n state.updatedAt = now().toISOString()\n await saveState(runDir, state, options.onState)\n return {\n runId,\n state,\n candidate: lastRejectedCandidate,\n ...(lastRejectedEvaluation ? { evaluation: lastRejectedEvaluation } : {}),\n lifecycle,\n promoted: false,\n blocked: false,\n }\n }\n\n const evidence = await assertCandidateEvidence(\n runDir,\n candidateRefFor(runId, state, candidate),\n state.implementationRef,\n )\n return {\n runId,\n state,\n candidate,\n evaluation: evidence.evaluation,\n lifecycle,\n promoted: false,\n blocked: false,\n }\n } finally {\n await lease.release()\n }\n}\n","import {\n type AgentCandidateKnowledgeRef,\n sha256DigestSchema,\n} from '@tangle-network/agent-interface'\n\nimport {\n type KnowledgeImprovementCandidateRef,\n KnowledgeImprovementCandidateRefSchema,\n} from './kb-improvement'\n\n/** Convert a measured knowledge candidate into the shared review and execution identity. */\nexport function toAgentCandidateKnowledgeRef(\n candidate: KnowledgeImprovementCandidateRef,\n): AgentCandidateKnowledgeRef {\n const parsed = KnowledgeImprovementCandidateRefSchema.parse(candidate)\n return {\n ...parsed,\n goalHash: prefixedDigest(parsed.goalHash),\n baseHash: prefixedDigest(parsed.baseHash),\n candidateHash: prefixedDigest(parsed.candidateHash),\n evidenceHash: prefixedDigest(parsed.evidenceHash),\n promotionPlanHash: prefixedDigest(parsed.promotionPlanHash),\n }\n}\n\n/** Recover agent-knowledge's candidate identity from the shared contract. */\nexport function fromAgentCandidateKnowledgeRef(\n candidate: AgentCandidateKnowledgeRef,\n): KnowledgeImprovementCandidateRef {\n return KnowledgeImprovementCandidateRefSchema.parse({\n ...candidate,\n goalHash: rawDigest(candidate.goalHash),\n baseHash: rawDigest(candidate.baseHash),\n candidateHash: rawDigest(candidate.candidateHash),\n evidenceHash: rawDigest(candidate.evidenceHash),\n promotionPlanHash: rawDigest(candidate.promotionPlanHash),\n })\n}\n\nfunction prefixedDigest(value: string) {\n return sha256DigestSchema.parse(`sha256:${value}`)\n}\n\nfunction rawDigest(value: string): string {\n return sha256DigestSchema.parse(value).slice('sha256:'.length)\n}\n","export interface ChunkingOptions {\n targetChars: number\n maxChars: number\n minChars: number\n overlapChars: number\n}\n\nexport interface KnowledgeChunk {\n index: number\n text: string\n headingPath: string\n charStart: number\n charEnd: number\n oversized: boolean\n}\n\nconst DEFAULT_OPTIONS: ChunkingOptions = {\n targetChars: 1000,\n maxChars: 1500,\n minChars: 160,\n overlapChars: 180,\n}\n\nexport function chunkMarkdown(\n content: string,\n options?: Partial<ChunkingOptions>,\n): KnowledgeChunk[] {\n const opts = normalizeOptions({ ...DEFAULT_OPTIONS, ...(options ?? {}) })\n const { body, bodyOffset } = stripFrontmatter(content)\n if (body.trim() === '') return []\n\n const sections = splitSections(body, bodyOffset)\n const chunks: KnowledgeChunk[] = []\n for (const section of sections) {\n for (const part of chunkText(section.text, opts)) {\n const start = section.start + part.start\n chunks.push({\n index: chunks.length,\n text: part.text,\n headingPath: section.headingPath,\n charStart: start,\n charEnd: start + part.text.length,\n oversized: part.text.length > opts.maxChars,\n })\n }\n }\n return chunks\n}\n\nexport function stripFrontmatter(content: string): { body: string; bodyOffset: number } {\n const normalized = content.replace(/\\r\\n/g, '\\n')\n if (!normalized.startsWith('---\\n')) return { body: normalized, bodyOffset: 0 }\n const match = /^---\\n[\\s\\S]*?\\n---\\s*\\n?/.exec(normalized)\n if (!match) return { body: normalized, bodyOffset: 0 }\n return { body: normalized.slice(match[0].length), bodyOffset: match[0].length }\n}\n\nfunction normalizeOptions(opts: ChunkingOptions): ChunkingOptions {\n if (opts.maxChars < opts.targetChars) opts.maxChars = opts.targetChars\n if (opts.overlapChars >= opts.targetChars) opts.overlapChars = Math.floor(opts.targetChars / 2)\n return opts\n}\n\ninterface Section {\n text: string\n start: number\n headingPath: string\n}\n\nfunction splitSections(body: string, bodyOffset: number): Section[] {\n const lines = body.split('\\n')\n const sections: Section[] = []\n const headings: Record<number, string> = {}\n let current: { lines: string[]; start: number; headingPath: string } = {\n lines: [],\n start: bodyOffset,\n headingPath: '',\n }\n let cursor = bodyOffset\n let fence: string | null = null\n\n const flush = () => {\n const text = current.lines.join('\\n')\n if (text.trim() !== '')\n sections.push({ text, start: current.start, headingPath: current.headingPath })\n }\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]!\n const lineLen = line.length + (i < lines.length - 1 ? 1 : 0)\n const fenceMatch = /^(`{3,}|~{3,})/.exec(line)\n if (fenceMatch) {\n const marker = fenceMatch[1]!\n fence = fence === null ? marker : line.startsWith(fence) ? null : fence\n current.lines.push(line)\n cursor += lineLen\n continue\n }\n const heading = fence === null ? /^(#{1,6})\\s+(.+?)\\s*$/.exec(line) : null\n if (heading) {\n flush()\n const level = heading[1]!.length\n headings[level] = heading[2]!.trim()\n for (let next = level + 1; next <= 6; next++) delete headings[next]\n current = {\n lines: [line],\n start: cursor,\n headingPath: Object.entries(headings)\n .sort(([a], [b]) => Number(a) - Number(b))\n .map(([levelText, title]) => `${'#'.repeat(Number(levelText))} ${title}`)\n .join(' > '),\n }\n cursor += lineLen\n continue\n }\n current.lines.push(line)\n cursor += lineLen\n }\n flush()\n return sections\n}\n\nfunction chunkText(text: string, opts: ChunkingOptions): Array<{ text: string; start: number }> {\n if (text.length <= opts.targetChars) return [{ text, start: 0 }]\n const atoms = splitAtoms(text)\n const chunks: Array<{ text: string; start: number }> = []\n let buffer = ''\n let bufferStart = 0\n for (const atom of atoms) {\n if (buffer === '') bufferStart = atom.start\n if (buffer.length > 0 && buffer.length + atom.text.length > opts.targetChars) {\n chunks.push({ text: buffer.trimEnd(), start: bufferStart })\n const overlap = buffer.slice(Math.max(0, buffer.length - opts.overlapChars))\n buffer = overlap + atom.text\n bufferStart = Math.max(bufferStart, atom.start - overlap.length)\n } else {\n buffer += atom.text\n }\n }\n if (buffer.trim() !== '') chunks.push({ text: buffer.trimEnd(), start: bufferStart })\n return mergeTinyChunks(chunks, opts)\n}\n\nfunction splitAtoms(text: string): Array<{ text: string; start: number }> {\n const parts: Array<{ text: string; start: number }> = []\n const paragraphs = text.split(/(\\n\\s*\\n)/)\n let cursor = 0\n for (let i = 0; i < paragraphs.length; i += 2) {\n const paragraph = (paragraphs[i] ?? '') + (paragraphs[i + 1] ?? '')\n if (paragraph === '') continue\n parts.push({ text: paragraph, start: cursor })\n cursor += paragraph.length\n }\n return parts\n}\n\nfunction mergeTinyChunks(\n chunks: Array<{ text: string; start: number }>,\n opts: ChunkingOptions,\n): Array<{ text: string; start: number }> {\n const out: Array<{ text: string; start: number }> = []\n for (const chunk of chunks) {\n const prev = out[out.length - 1]\n if (\n prev &&\n chunk.text.length < opts.minChars &&\n prev.text.length + chunk.text.length <= opts.maxChars\n ) {\n prev.text = `${prev.text}\\n\\n${chunk.text}`\n } else {\n out.push({ ...chunk })\n }\n }\n return out\n}\n","import { isDeepStrictEqual } from 'node:util'\n\nexport interface DiscoveryTask {\n id: string\n goal: string\n query?: string\n sourceHints?: string[]\n metadata?: Record<string, unknown>\n}\n\nexport interface DiscoveryResult {\n taskId: string\n summary: string\n sourceUris?: string[]\n claims?: Array<{ text: string; sourceUri?: string; confidence?: number }>\n followUpTasks?: DiscoveryTask[]\n metadata?: Record<string, unknown>\n}\n\nexport interface KnowledgeDiscoveryWorker {\n run(task: DiscoveryTask, signal?: AbortSignal): Promise<DiscoveryResult> | DiscoveryResult\n}\n\nexport interface KnowledgeDiscoveryDispatcher {\n dispatch(\n tasks: DiscoveryTask[],\n options?: {\n concurrency?: number\n signal?: AbortSignal\n },\n ): Promise<DiscoveryResult[]>\n}\n\nexport type DiscoveryLoopStopReason = 'complete' | 'max-rounds' | 'max-tasks' | 'aborted'\n\nexport interface DiscoveryLoopRound {\n round: number\n tasks: DiscoveryTask[]\n results: DiscoveryResult[]\n queuedFollowUps: DiscoveryTask[]\n}\n\nexport interface DiscoveryLoopResult {\n stopReason: DiscoveryLoopStopReason\n tasksDispatched: number\n results: DiscoveryResult[]\n rounds: DiscoveryLoopRound[]\n /** Tasks retained, not dropped, when a configured limit stops the loop. */\n pendingTasks: DiscoveryTask[]\n /** Structurally identical task identities ignored to prevent cycles. */\n duplicateTaskIds: string[]\n}\n\nexport interface RunDiscoveryLoopOptions {\n dispatcher: KnowledgeDiscoveryDispatcher\n initialTasks: readonly DiscoveryTask[]\n /** Maximum follow-up depth including the initial dispatch. Default 3. */\n maxRounds?: number\n /** Maximum tasks dispatched across all rounds. Default 24. */\n maxTasks?: number\n /** Forwarded to the dispatcher. Default 4. */\n concurrency?: number\n signal?: AbortSignal\n onRound?: (round: DiscoveryLoopRound) => Promise<void> | void\n}\n\n/**\n * Dispatch discovery tasks and recursively pursue worker-proposed follow-ups.\n *\n * The runner owns only bounded scheduling and accounting. Workers own search,\n * source verification, and domain-specific candidate shapes.\n */\nexport async function runDiscoveryLoop(\n options: RunDiscoveryLoopOptions,\n): Promise<DiscoveryLoopResult> {\n const maxRounds = positiveInteger(options.maxRounds ?? 3, 'maxRounds')\n const maxTasks = positiveInteger(options.maxTasks ?? 24, 'maxTasks')\n const concurrency = positiveInteger(options.concurrency ?? 4, 'concurrency')\n const known = new Map<string, DiscoveryTask>()\n const pending: DiscoveryTask[] = []\n const duplicateTaskIds = new Set<string>()\n enqueueTasks(options.initialTasks, known, pending, duplicateTaskIds)\n\n const rounds: DiscoveryLoopRound[] = []\n const results: DiscoveryResult[] = []\n let tasksDispatched = 0\n let aborted = false\n\n while (pending.length > 0 && rounds.length < maxRounds && tasksDispatched < maxTasks) {\n if (options.signal?.aborted) {\n aborted = true\n break\n }\n const capacity = maxTasks - tasksDispatched\n const tasks = pending.splice(0, capacity)\n let dispatched: DiscoveryResult[]\n try {\n dispatched = orderCompleteDispatch(\n tasks,\n await options.dispatcher.dispatch(tasks, {\n concurrency,\n signal: options.signal,\n }),\n )\n } catch (cause) {\n if (!options.signal?.aborted) throw cause\n pending.unshift(...tasks)\n aborted = true\n break\n }\n tasksDispatched += tasks.length\n results.push(...dispatched)\n\n const queuedFollowUps: DiscoveryTask[] = []\n for (const result of dispatched) {\n enqueueTasks(result.followUpTasks ?? [], known, queuedFollowUps, duplicateTaskIds)\n }\n pending.push(...queuedFollowUps)\n const round: DiscoveryLoopRound = {\n round: rounds.length + 1,\n tasks,\n results: dispatched,\n queuedFollowUps,\n }\n rounds.push(round)\n await options.onRound?.(round)\n if (options.signal?.aborted) {\n aborted = true\n break\n }\n }\n\n const stopReason: DiscoveryLoopStopReason = aborted\n ? 'aborted'\n : pending.length === 0\n ? 'complete'\n : tasksDispatched >= maxTasks\n ? 'max-tasks'\n : 'max-rounds'\n return {\n stopReason,\n tasksDispatched,\n results,\n rounds,\n pendingTasks: pending,\n duplicateTaskIds: [...duplicateTaskIds],\n }\n}\n\nexport function createLocalDiscoveryDispatcher(\n worker: KnowledgeDiscoveryWorker,\n): KnowledgeDiscoveryDispatcher {\n return {\n async dispatch(tasks, options = {}) {\n const concurrency = Math.max(1, options.concurrency ?? 4)\n const results: DiscoveryResult[] = []\n let cursor = 0\n async function runNext(): Promise<void> {\n while (cursor < tasks.length) {\n if (options.signal?.aborted) throw new Error('Discovery dispatch aborted')\n const task = tasks[cursor++]!\n results.push(await worker.run(task, options.signal))\n }\n }\n await Promise.all(Array.from({ length: Math.min(concurrency, tasks.length) }, runNext))\n return orderCompleteDispatch(tasks, results)\n },\n }\n}\n\nfunction enqueueTasks(\n tasks: readonly DiscoveryTask[],\n known: Map<string, DiscoveryTask>,\n destination: DiscoveryTask[],\n duplicateTaskIds: Set<string>,\n): void {\n for (const task of tasks) {\n assertTask(task)\n const prior = known.get(task.id)\n if (!prior) {\n known.set(task.id, task)\n destination.push(task)\n continue\n }\n if (!isDeepStrictEqual(prior, task)) {\n throw new Error(`Discovery task id '${task.id}' refers to conflicting tasks`)\n }\n duplicateTaskIds.add(task.id)\n }\n}\n\nfunction assertTask(task: DiscoveryTask): void {\n if (!task.id.trim()) throw new Error('Discovery task id must not be empty')\n if (!task.goal.trim()) throw new Error(`Discovery task '${task.id}' goal must not be empty`)\n}\n\nfunction orderCompleteDispatch(\n tasks: readonly DiscoveryTask[],\n results: readonly DiscoveryResult[],\n): DiscoveryResult[] {\n const order = new Map(tasks.map((task, index) => [task.id, index]))\n const received = new Set<string>()\n for (const result of results) {\n if (!order.has(result.taskId)) {\n throw new Error(`Discovery dispatcher returned unknown task '${result.taskId}'`)\n }\n if (received.has(result.taskId)) {\n throw new Error(`Discovery dispatcher returned task '${result.taskId}' more than once`)\n }\n received.add(result.taskId)\n }\n const missing = tasks.filter((task) => !received.has(task.id)).map((task) => task.id)\n if (missing.length > 0) {\n throw new Error(`Discovery dispatcher omitted tasks: ${missing.join(', ')}`)\n }\n return [...results].sort(\n (a, b) => (order.get(a.taskId) as number) - (order.get(b.taskId) as number),\n )\n}\n\nfunction positiveInteger(value: number, name: string): number {\n if (!Number.isInteger(value) || value < 1) {\n throw new Error(`Discovery loop ${name} must be a positive integer`)\n }\n return value\n}\n","import { buildKnowledgeIndex } from './indexer'\nimport { buildKnowledgeLexicalIndex, type KnowledgeLexicalIndex } from './lexical-index'\nimport { type KnowledgePagesOptions, normalizePagesDirectory } from './pages-directory'\nimport type { RetrievalEvalRetriever, RetrievedKnowledgeHit } from './retrieval-eval'\nimport { searchKnowledge } from './search'\nimport type { KnowledgeIndex, KnowledgeSearchResult } from './types'\n\nexport interface FileSystemSearchProviderOptions extends KnowledgePagesOptions {\n /** Knowledge-base root containing the pages directory and `.agent-knowledge/`. */\n root: string\n /** Optional warm index, useful when the caller already built one. */\n index?: KnowledgeIndex\n /** Default result count for `search()`. Defaults to 10. */\n defaultLimit?: number\n /**\n * `manual` caches the index until `refresh: true` or `invalidate()`.\n * `always` rebuilds from disk on every search.\n */\n refresh?: 'manual' | 'always'\n}\nexport interface FileSystemSearchOptions {\n limit?: number\n refresh?: boolean\n}\n\n/**\n * File-first retrieval over an `agent-knowledge` KB.\n *\n * This is the simple backend for products that want deterministic search over\n * markdown knowledge files before adding embeddings, rerankers, or a vector DB.\n */\nexport class FileSystemSearchProvider {\n readonly root: string\n /** Root-relative directory the provider indexes. */\n readonly pagesDirectory: string\n private index: KnowledgeIndex | undefined\n private lexicalIndex: KnowledgeLexicalIndex | undefined\n private readonly defaultLimit: number\n private readonly refreshMode: 'manual' | 'always'\n\n constructor(options: FileSystemSearchProviderOptions) {\n this.root = options.root\n this.pagesDirectory = normalizePagesDirectory(options.pagesDirectory)\n this.index = options.index\n this.defaultLimit = options.defaultLimit ?? 10\n this.refreshMode = options.refresh ?? 'manual'\n }\n\n async getIndex(options: FileSystemSearchOptions = {}): Promise<KnowledgeIndex> {\n if (this.refreshMode === 'always' || options.refresh || !this.index) {\n this.index = await buildKnowledgeIndex(this.root, { pagesDirectory: this.pagesDirectory })\n this.lexicalIndex = undefined\n }\n return this.index\n }\n\n async search(\n query: string,\n options: FileSystemSearchOptions = {},\n ): Promise<KnowledgeSearchResult[]> {\n const index = await this.getIndex(options)\n if (!this.lexicalIndex) this.lexicalIndex = buildKnowledgeLexicalIndex(index.pages)\n return searchKnowledge(index, query, {\n limit: options.limit ?? this.defaultLimit,\n lexicalIndex: this.lexicalIndex,\n })\n }\n\n async retrieve(\n query: string,\n options: FileSystemSearchOptions = {},\n ): Promise<RetrievedKnowledgeHit[]> {\n const hits = await this.search(query, options)\n return hits.map(hitFromSearchResult)\n }\n\n asRetrievalEvalRetriever(): RetrievalEvalRetriever {\n return async ({ config, scenario, k }) => ({\n hits: await this.retrieve(scenario.query, {\n limit: k,\n refresh: config.refresh === true,\n }),\n })\n }\n\n invalidate(): void {\n this.index = undefined\n this.lexicalIndex = undefined\n }\n}\n\nexport function createFileSystemSearchProvider(\n options: FileSystemSearchProviderOptions,\n): FileSystemSearchProvider {\n return new FileSystemSearchProvider(options)\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","import type { AgentCandidateJsonValue as JsonValue } from '@tangle-network/agent-interface'\nimport { z } from 'zod'\nimport type { RetrievalEvalRetriever, RetrievedKnowledgeHit } from './retrieval-eval'\n\n/**\n * Hub-backed vector retrieval over a user-connected vector database.\n *\n * `FileSystemSearchProvider` (and the QMD snapshot provider) prove the shape\n * of a search backend; this is the third backend: similarity search against a\n * vector database the user already connected through the Tangle Platform Hub\n * (Pinecone, Qdrant, or Weaviate). The provider never talks to the vector DB\n * directly — every query routes through `POST /v1/hub/exec`, so the Hub's\n * per-user connection, per-action policy, approval, and audit pipeline remain\n * the ONLY access path. The Hub's audit trail is the provenance record: every\n * hit carries `provider`, `connectionId`, `indexName`, and the exec action in\n * its metadata, so a retrieval receipt can name exactly which database was\n * queried under which connection.\n *\n * Embeddings are host-owned. `embed` turns the query string into the vector —\n * the same discipline as the QMD provider's vector mode (invoking the host's\n * embedding model is an explicit decision, never implicit).\n *\n * Scores: `score` carries the provider-native score where higher is better\n * (Pinecone similarity, Qdrant similarity); Weaviate distances (lower is\n * better) are mapped through `1/(1+max(0,distance))` so ordering stays\n * monotone. `normalizedScore` is within-set (top hit = 1), the same contract\n * as the filesystem provider — never compare it across queries.\n */\n\n/** Vector databases with a Hub adapter and a similarity-search action. */\nexport type HubVectorProviderKind = 'pinecone' | 'qdrant' | 'weaviate'\n\n/** The host-owned query embedding: text in, finite float vector out. */\nexport type HubVectorEmbed = (query: string) => Promise<readonly number[]>\n\nexport interface HubVectorSearchProviderOptions {\n /** Platform base URL, e.g. `https://id.tangle.tools`. */\n readonly hubUrl: string\n /** Bearer credential for the Hub (the agent's user or service key). */\n readonly apiKey: string\n /** The Hub connection that owns the vector database credential. */\n readonly connectionId: string\n /** Which connected vector database provider to search. */\n readonly provider: HubVectorProviderKind\n /**\n * Index / collection / class being searched. For Qdrant and Weaviate this\n * targets the query; for Pinecone the data plane is bound by the\n * connection's index host, so the name is provenance on every hit.\n */\n readonly indexName: string\n /** Turns the query string into a vector. Required: embedding is host-owned. */\n readonly embed: HubVectorEmbed\n /** Pinecone namespace within the index. Defaults to the default namespace. */\n readonly namespace?: string\n /** Weaviate properties returned per object (in addition to id + distance). */\n readonly properties?: readonly string[]\n /** Default result count for `search()`. Defaults to 5. */\n readonly defaultLimit?: number\n /** Override fetch (tests + non-Node runtimes). */\n readonly fetchImpl?: typeof fetch\n}\n\nexport interface HubVectorSearchOptions {\n /** Result count. Defaults to the provider's `defaultLimit`. */\n readonly limit?: number\n /** Precomputed query vector — skips `embed`. Same space as the index. */\n readonly vector?: readonly number[]\n /** Provider-native metadata filter (Pinecone/Qdrant filter object). */\n readonly filter?: Record<string, unknown>\n}\n\n/** A hub exec or upstream-provider failure, carrying the hub's status/code. */\nexport class HubVectorSearchError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n public readonly code: string | undefined,\n ) {\n super(message)\n this.name = 'HubVectorSearchError'\n }\n}\n\nconst vectorSchema = z.array(z.number().finite()).min(1).max(20_000)\nconst searchOptionsSchema = z\n .object({\n limit: z.number().int().min(1).max(50).optional(),\n vector: vectorSchema.optional(),\n filter: z.record(z.string(), z.unknown()).optional(),\n })\n .strict()\nconst queryTextSchema = z.string().trim().min(1).max(16_000)\nconst providerKindSchema = z.enum(['pinecone', 'qdrant', 'weaviate'])\nconst graphQlNameSchema = /^[A-Za-z_][A-Za-z0-9_]*$/\n\nconst pineconeResultSchema = z\n .object({\n matches: z\n .array(\n z\n .object({\n id: z.union([z.string(), z.number()]),\n score: z.number().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n })\n .passthrough(),\n )\n .default([]),\n })\n .passthrough()\n\nconst qdrantResultSchema = z\n .object({\n result: z\n .array(\n z\n .object({\n id: z.union([z.string(), z.number()]),\n score: z.number().optional(),\n payload: z.record(z.string(), z.unknown()).optional(),\n })\n .passthrough(),\n )\n .default([]),\n })\n .passthrough()\n\nconst weaviateResultSchema = z\n .object({\n data: z\n .object({\n Get: z.record(z.string(), z.array(z.record(z.string(), z.unknown()))).optional(),\n })\n .passthrough(),\n errors: z.array(z.unknown()).optional(),\n })\n .passthrough()\n\n/** Keys commonly carrying human-readable text in vector payloads. */\nconst TEXT_KEYS = ['text', 'content', 'chunk', 'body', 'snippet', 'pageContent', 'summary'] as const\nconst TITLE_KEYS = ['title', 'name', 'heading'] as const\nconst SNIPPET_MAX_CHARS = 400\n\n/** Provider payloads arrive JSON-parsed; the round-trip narrows `unknown` to\n * JSON values for RetrievedKnowledgeHit.metadata without re-validating shape. */\nfunction jsonSafe(\n value: Record<string, unknown> | undefined,\n): { [key: string]: JsonValue } | undefined {\n if (!value) return undefined\n return JSON.parse(JSON.stringify(value)) as { [key: string]: JsonValue }\n}\n\nfunction textFromRecord(record: Record<string, unknown> | undefined): string | undefined {\n if (!record) return undefined\n for (const key of TEXT_KEYS) {\n const value = record[key]\n if (typeof value === 'string' && value.trim()) return value\n }\n return undefined\n}\n\nfunction titleFromRecord(record: Record<string, unknown> | undefined): string | undefined {\n if (!record) return undefined\n for (const key of TITLE_KEYS) {\n const value = record[key]\n if (typeof value === 'string' && value.trim()) return value\n }\n return undefined\n}\n\nfunction snippetFromRecord(record: Record<string, unknown> | undefined): string | undefined {\n const text = textFromRecord(record)\n if (text) return text.length > SNIPPET_MAX_CHARS ? `${text.slice(0, SNIPPET_MAX_CHARS)}…` : text\n if (!record || Object.keys(record).length === 0) return undefined\n const serialized = JSON.stringify(record)\n return serialized.length > SNIPPET_MAX_CHARS\n ? `${serialized.slice(0, SNIPPET_MAX_CHARS)}…`\n : serialized\n}\n\n/** Provenance stamped on every hit — the retrieval-receipt fields. */\nexport interface HubVectorProvenance {\n readonly provider: HubVectorProviderKind\n readonly connectionId: string\n readonly indexName: string\n readonly hubOrigin: string\n readonly action: string\n}\n\n/** One hub exec call: bearer-authenticated, envelope-checked, result-unwrapped. */\nasync function hubExec(\n options: HubVectorSearchProviderOptions,\n path: string,\n input: unknown,\n): Promise<unknown> {\n const fetchImpl = options.fetchImpl ?? fetch\n let origin: string\n try {\n origin = new URL(options.hubUrl).origin\n } catch {\n throw new HubVectorSearchError(`invalid hubUrl: ${options.hubUrl}`, 0, 'INVALID_HUB_URL')\n }\n let response: Response\n try {\n response = await fetchImpl(`${origin}/v1/hub/exec`, {\n method: 'POST',\n headers: {\n authorization: `Bearer ${options.apiKey}`,\n 'content-type': 'application/json',\n accept: 'application/json',\n },\n body: JSON.stringify({ path, input, connectionId: options.connectionId }),\n })\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error)\n throw new HubVectorSearchError(`hub exec request failed: ${reason}`, 0, 'HUB_UNREACHABLE')\n }\n const text = await response.text()\n let parsed: { success?: boolean; data?: { result?: unknown }; error?: unknown } | null = null\n if (text) {\n try {\n parsed = JSON.parse(text)\n } catch {\n // fall through: a non-JSON body is handled below\n }\n }\n if (!response.ok || parsed?.success === false) {\n const errorBody = parsed?.error\n const code =\n errorBody && typeof errorBody === 'object' && 'code' in errorBody\n ? String((errorBody as { code: unknown }).code)\n : undefined\n const message =\n (errorBody && typeof errorBody === 'object' && 'message' in errorBody\n ? String((errorBody as { message: unknown }).message)\n : typeof errorBody === 'string'\n ? errorBody\n : undefined) ?? `hub exec failed (${response.status})`\n throw new HubVectorSearchError(message, response.status, code)\n }\n if (!parsed || parsed.data === undefined || parsed.data.result === undefined) {\n throw new HubVectorSearchError(\n 'hub exec response envelope missing `data.result`',\n response.status,\n 'HUB_INVALID_ENVELOPE',\n )\n }\n return parsed.data.result\n}\n\ninterface RawHit {\n id: string\n score: number | undefined\n record: Record<string, unknown> | undefined\n}\n\nexport class HubVectorSearchProvider {\n readonly provider: HubVectorProviderKind\n readonly connectionId: string\n readonly indexName: string\n private readonly options: HubVectorSearchProviderOptions\n private readonly defaultLimit: number\n private readonly hubOrigin: string\n\n constructor(options: HubVectorSearchProviderOptions) {\n this.options = options\n this.provider = providerKindSchema.parse(options.provider)\n this.connectionId = z.string().trim().min(1).parse(options.connectionId)\n this.indexName = z.string().trim().min(1).parse(options.indexName)\n if (this.provider === 'weaviate') {\n if (!graphQlNameSchema.test(this.indexName)) {\n throw new TypeError('Weaviate class name must be a GraphQL identifier')\n }\n for (const property of options.properties ?? []) {\n if (!graphQlNameSchema.test(property)) {\n throw new TypeError(`Weaviate property '${property}' must be a GraphQL identifier`)\n }\n }\n }\n this.defaultLimit = options.defaultLimit ?? 5\n this.hubOrigin = new URL(options.hubUrl).origin\n }\n\n /** The provenance record a retrieval receipt should carry. */\n get provenance(): HubVectorProvenance {\n return {\n provider: this.provider,\n connectionId: this.connectionId,\n indexName: this.indexName,\n hubOrigin: this.hubOrigin,\n action: this.searchAction(),\n }\n }\n\n async search(\n query: string,\n searchOptions: HubVectorSearchOptions = {},\n ): Promise<RetrievedKnowledgeHit[]> {\n const text = queryTextSchema.parse(query)\n const options = searchOptionsSchema.parse(searchOptions)\n const vector = vectorSchema.parse(options.vector ?? (await this.options.embed(text)))\n const limit = options.limit ?? this.defaultLimit\n const raw = await this.searchRaw(vector, limit, options.filter)\n return this.hitsFromRaw(raw, limit)\n }\n\n /** Alias kept for parity with `FileSystemSearchProvider.retrieve`. */\n async retrieve(\n query: string,\n options: HubVectorSearchOptions = {},\n ): Promise<RetrievedKnowledgeHit[]> {\n return this.search(query, options)\n }\n\n asRetrievalEvalRetriever(): RetrievalEvalRetriever {\n return async ({ scenario, k }) => ({\n hits: await this.search(scenario.query, { limit: k }),\n })\n }\n\n private searchAction(): string {\n if (this.provider === 'pinecone') return 'vectors.query'\n if (this.provider === 'qdrant') return 'points.search'\n return 'graphql.query'\n }\n\n private async searchRaw(\n vector: readonly number[],\n limit: number,\n filter: Record<string, unknown> | undefined,\n ): Promise<RawHit[]> {\n if (this.provider === 'pinecone') {\n const result = pineconeResultSchema.parse(\n await hubExec(this.options, 'pinecone.vectors.query', {\n vector: [...vector],\n top_k: limit,\n include_metadata: true,\n ...(this.options.namespace ? { namespace: this.options.namespace } : {}),\n ...(filter ? { filter } : {}),\n }),\n )\n return result.matches.map((match) => ({\n id: String(match.id),\n score: match.score,\n record: match.metadata,\n }))\n }\n if (this.provider === 'qdrant') {\n const result = qdrantResultSchema.parse(\n await hubExec(this.options, 'qdrant.points.search', {\n collection_name: this.indexName,\n vector: [...vector],\n limit,\n with_payload: true,\n ...(filter ? { filter } : {}),\n }),\n )\n return result.result.map((point) => ({\n id: String(point.id),\n score: point.score,\n record: point.payload,\n }))\n }\n const properties = this.options.properties ?? []\n const propertyFields = properties.map((property) => ` ${property}`).join('')\n const graphQl = `{ Get { ${this.indexName}(nearVector: {vector: ${JSON.stringify([...vector])}}, limit: ${limit}) { _additional { id distance }${propertyFields} } } }`\n const result = weaviateResultSchema.parse(\n await hubExec(this.options, 'weaviate.graphql.query', { query: graphQl }),\n )\n if (result.errors && result.errors.length > 0) {\n throw new HubVectorSearchError(\n `weaviate graphql errors: ${JSON.stringify(result.errors).slice(0, SNIPPET_MAX_CHARS)}`,\n 200,\n 'PROVIDER_GRAPHQL_ERROR',\n )\n }\n const objects = result.data.Get?.[this.indexName] ?? []\n return objects.map((object) => {\n const additional = (object._additional ?? {}) as Record<string, unknown>\n const distance = additional.distance\n return {\n id: String(additional.id ?? ''),\n score:\n typeof distance === 'number' && Number.isFinite(distance)\n ? 1 / (1 + Math.max(0, distance))\n : undefined,\n record: Object.fromEntries(Object.entries(object).filter(([key]) => key !== '_additional')),\n }\n })\n }\n\n private hitsFromRaw(raw: readonly RawHit[], limit: number): RetrievedKnowledgeHit[] {\n const topScore = raw.reduce(\n (top, hit) => (hit.score !== undefined && hit.score > top ? hit.score : top),\n 0,\n )\n return raw.slice(0, limit).map((hit, index) => ({\n pageId: hit.id,\n path: `${this.provider}://${this.indexName}/${hit.id}`,\n ...(titleFromRecord(hit.record) !== undefined ? { title: titleFromRecord(hit.record) } : {}),\n rank: index + 1,\n ...(hit.score !== undefined ? { score: hit.score } : {}),\n ...(topScore > 0 && hit.score !== undefined\n ? { normalizedScore: Math.min(1, Math.max(0, hit.score / topScore)) }\n : {}),\n ...(snippetFromRecord(hit.record) !== undefined\n ? { snippet: snippetFromRecord(hit.record) }\n : {}),\n metadata: {\n provider: this.provider,\n connectionId: this.connectionId,\n indexName: this.indexName,\n hubOrigin: this.hubOrigin,\n action: this.searchAction(),\n retrievedAt: new Date().toISOString(),\n ...(hit.record ? { payload: jsonSafe(hit.record) } : {}),\n },\n }))\n }\n}\n\nexport function createHubVectorSearchProvider(\n options: HubVectorSearchProviderOptions,\n): HubVectorSearchProvider {\n return new HubVectorSearchProvider(options)\n}\n","/**\n * Retrieval briefing.\n *\n * A brief turns \"retrieved\" from something a run claims into something the\n * infrastructure can prove. It ranks the knowledge visible to a question,\n * renders it with the ids a later write must cite, and returns the ranked\n * results in the shape a retrieval receipt takes, so what an actor was given\n * is recorded rather than asserted.\n *\n * Pure: no clock, no filesystem, no network.\n */\nimport { canonicalCandidateDigest, type Sha256Digest } from '@tangle-network/agent-interface'\nimport {\n assertKnowledgeCitationsResolved,\n formatKnowledgeCitationReference,\n parseKnowledgeCitationReference,\n resolveKnowledgeCitation,\n} from './citation-resolution'\nimport type { OriginatedKnowledgeSearchResult } from './knowledge-use-receipts'\nimport { tokenizeText } from './lexical-index'\nimport {\n assembleLexicalIndex,\n DEFAULT_FIELD_BOOSTS,\n type LexicalPageTerms,\n lexicalPageTerms,\n} from './lexical-postings'\nimport type { OriginatedPage } from './run-scoped'\nimport {\n KNOWLEDGE_SEARCH_RETRIEVER_ID,\n type KnowledgeSearchHit,\n searchKnowledgePages,\n} from './search'\nimport type { KnowledgeId, KnowledgePage } from './types'\n\n/** Pages in a brief when the caller names no limit. */\nexport const DEFAULT_KNOWLEDGE_BRIEF_LIMIT = 5\n\nexport interface KnowledgeBriefOptions {\n /** Maximum pages in the brief. Defaults to 5. */\n limit?: number\n /**\n * Drop pages whose own evidence refuted them. Defaults to true, the opposite\n * of `searchKnowledge`: a brief is injected before a run's first token and\n * offers every page it names with an id ready to cite, so a refuted page in\n * it is an invitation to build on a dead claim.\n */\n excludeInvalidated?: boolean\n /** Match pages carrying at least one of these tags. */\n tags?: readonly string[]\n /** Match the exact string stored in `frontmatter.kind`. */\n kinds?: readonly string[]\n /**\n * Bound on the rendered brief. A page whose line does not fit is left out of\n * the whole brief, so `text`, `hits`, `citationIds`, and `results` always\n * describe one identical set of pages.\n */\n maxChars?: number\n}\n\nexport interface KnowledgeBrief {\n readonly question: string\n /** Retriever id to declare in a receipt minted from `results`. */\n readonly retrieverId: typeof KNOWLEDGE_SEARCH_RETRIEVER_ID\n /**\n * Digest of the retrieval settings this brief used. Pass it as the\n * `configDigest` of the receipt's retriever identity. The running package\n * version is the caller's to declare, because a bundled build cannot read it.\n */\n readonly retrieverConfigDigest: Sha256Digest\n readonly hits: readonly KnowledgeSearchHit[]\n /** The ids a write should persist in `cites`, in rank order. */\n readonly citationIds: readonly KnowledgeId[]\n /** Ranked results in the shape `createKnowledgeRetrievalReceipt` takes. */\n readonly results: readonly OriginatedKnowledgeSearchResult[]\n /** Deterministic Markdown: one `- [id] title — snippet` line per page, in rank order. */\n readonly text: string\n}\n\n/**\n * Rank the knowledge one question can see and render it for injection.\n *\n * The same page set produces the same brief on every run: ranking, ordering,\n * and rendering are deterministic, and no field carries a timestamp.\n */\nexport function buildKnowledgeBrief(\n visiblePages: readonly OriginatedPage[],\n question: string,\n options: KnowledgeBriefOptions = {},\n): KnowledgeBrief {\n return prepareKnowledgeBrief(visiblePages)(question, options)\n}\n\n/** Internal prepared view, shared by tools only while their immutable page view is current. */\nconst immutablePageTerms = new WeakMap<KnowledgePage, LexicalPageTerms>()\n\n/** Default-tokenizer terms of a frozen page, computed once per page object across views. */\nfunction defaultPageTerms(page: KnowledgePage): LexicalPageTerms {\n let terms = immutablePageTerms.get(page)\n if (terms === undefined) {\n terms = lexicalPageTerms(page, tokenizeText, DEFAULT_FIELD_BOOSTS)\n if (Object.isFrozen(page)) immutablePageTerms.set(page, terms)\n }\n return terms\n}\n\nexport function prepareKnowledgeBrief(visiblePages: readonly OriginatedPage[]) {\n if (!Array.isArray(visiblePages)) {\n throw new TypeError('knowledge brief requires the visible pages')\n }\n // Resolve citation addresses with the same owner used by read/write validation.\n // Keep a small candidate list per id so resolving links does not rescan the corpus.\n const byId = new Map<KnowledgeId, OriginatedPage[]>()\n for (const entry of visiblePages) {\n const matches = byId.get(entry.page.id) ?? []\n matches.push(entry)\n byId.set(entry.page.id, matches)\n }\n const qualified = (entry: OriginatedPage) =>\n formatKnowledgeCitationReference({ pageId: entry.page.id, origin: entry.origin })\n const originals = new Map<KnowledgePage, OriginatedPage>()\n const pages = visiblePages.map((entry) => {\n const page: KnowledgePage = {\n ...entry.page,\n id: qualified(entry),\n outLinks: entry.page.outLinks.flatMap((link: string) => {\n // A malformed link is not a ranking edge; retain the page unchanged so\n // citation audit can still diagnose it without making retrieval unavailable.\n try {\n const reference = parseKnowledgeCitationReference(link)\n const resolution = resolveKnowledgeCitation(byId.get(reference.pageId) ?? [], reference)\n return resolution.resolved ? [qualified(resolution.resolved)] : []\n } catch (error) {\n if (error instanceof TypeError) return []\n throw error\n }\n }),\n }\n originals.set(page, entry)\n return page\n })\n // Ranking reads only title, path and text, which the qualified copy shares with its original.\n const lexicalIndex = assembleLexicalIndex(\n pages,\n visiblePages.map((entry) => defaultPageTerms(entry.page)),\n tokenizeText,\n DEFAULT_FIELD_BOOSTS,\n )\n return (question: string, options: KnowledgeBriefOptions = {}): KnowledgeBrief => {\n if (typeof question !== 'string' || question.trim().length === 0) {\n throw new TypeError('knowledge brief question must be a non-empty string')\n }\n const limit = options.limit ?? DEFAULT_KNOWLEDGE_BRIEF_LIMIT\n const excludeInvalidated = options.excludeInvalidated ?? true\n const maxChars = options.maxChars\n if (maxChars !== undefined && (!Number.isInteger(maxChars) || maxChars < 0)) {\n throw new Error(`knowledge brief maxChars must be a non-negative integer, got ${maxChars}`)\n }\n\n const ranked = searchKnowledgePages(pages, question, {\n lexicalIndex,\n limit,\n excludeInvalidated,\n ...(options.tags === undefined ? {} : { tags: options.tags }),\n ...(options.kinds === undefined ? {} : { kinds: options.kinds }),\n }).map((hit) => {\n const entry = originals.get(hit.page)!\n const candidates = byId.get(entry.page.id)!\n const reference = {\n pageId: entry.page.id,\n ...(candidates.length === 1 &&\n formatKnowledgeCitationReference({ pageId: entry.page.id }) === entry.page.id\n ? {}\n : { origin: entry.origin }),\n }\n // The whole visible chain determines ambiguity, not just this query's filtered hits.\n // Reusing one id within the SAME origin cannot be repaired with a qualifier.\n assertKnowledgeCitationsResolved(candidates, [reference])\n return {\n ...hit,\n page: entry.page,\n origin: entry.origin,\n citationId: formatKnowledgeCitationReference(reference),\n }\n })\n\n const hits: (KnowledgeSearchHit & OriginatedKnowledgeSearchResult)[] = []\n const lines: string[] = []\n let length = 0\n for (const hit of ranked) {\n const line = briefLine(hit)\n const next = length === 0 ? line.length : length + 1 + line.length\n if (maxChars !== undefined && next > maxChars) break\n hits.push(hit)\n lines.push(line)\n length = next\n }\n\n return Object.freeze({\n question: question.trim(),\n retrieverId: KNOWLEDGE_SEARCH_RETRIEVER_ID,\n retrieverConfigDigest: canonicalCandidateDigest({\n limit,\n excludeInvalidated,\n tags: options.tags === undefined ? null : [...options.tags],\n kinds: options.kinds === undefined ? null : [...options.kinds],\n maxChars: maxChars ?? null,\n }),\n hits: Object.freeze(hits),\n citationIds: Object.freeze(hits.map((hit) => hit.citationId)),\n results: Object.freeze(hits.map((hit) => Object.freeze(hit))),\n text: lines.join('\\n'),\n })\n }\n}\n\nfunction briefLine(hit: KnowledgeSearchHit): string {\n const snippet = hit.snippet.replace(/\\s+/g, ' ').trim()\n return snippet === ''\n ? `- [${hit.citationId}] ${hit.page.title}`\n : `- [${hit.citationId}] ${hit.page.title} — ${snippet}`\n}\n","import type { EvidenceRef } from '@tangle-network/agent-eval/analyst'\nimport {\n canonicalCandidateDigest,\n type Sha256Digest,\n sha256Bytes,\n} from '@tangle-network/agent-interface'\nimport {\n assertSchemaVersion,\n createKnowledgeVisibilitySnapshot,\n decodeKnowledgeVisibilitySnapshot,\n digest,\n KNOWLEDGE_RECEIPT_DIGEST_ALGORITHM,\n KNOWLEDGE_USE_RECEIPT_SCHEMA_VERSION,\n knowledgePageDigest,\n nonEmpty,\n normalizeVisibilityArtifact,\n normalizeVisibilityRef,\n type VisibilityIndex,\n validateKnowledgePage,\n validateOrigin,\n visibilityIdentity,\n visibilityIndexOf,\n} from './knowledge-visibility'\nimport type { OriginatedPage, PageOrigin } from './run-scoped'\nimport type { KnowledgeSearchResult } from './types'\n\nexport {\n createKnowledgeVisibilitySnapshot,\n decodeKnowledgeVisibilitySnapshot,\n encodeKnowledgeVisibilitySnapshot,\n KNOWLEDGE_RECEIPT_DIGEST_ALGORITHM,\n KNOWLEDGE_USE_RECEIPT_SCHEMA_VERSION,\n knowledgePageDigest,\n knowledgeVisibilityArtifactRef,\n verifyKnowledgeVisibilitySnapshot,\n} from './knowledge-visibility'\nexport interface KnowledgeVisibilitySnapshotEntry {\n readonly position: number\n readonly pageId: string\n readonly origin: PageOrigin\n readonly path: string\n readonly pageDigest: Sha256Digest\n readonly sourceIds: readonly string[]\n readonly invalidated: boolean\n}\n\n/** Exact ordered page visibility presented to one retrieval operation. */\nexport interface KnowledgeVisibilitySnapshot {\n readonly schemaVersion: typeof KNOWLEDGE_USE_RECEIPT_SCHEMA_VERSION\n readonly digestAlgorithm: typeof KNOWLEDGE_RECEIPT_DIGEST_ALGORITHM\n readonly snapshotDigest: Sha256Digest\n readonly entries: readonly KnowledgeVisibilitySnapshotEntry[]\n}\n\n/** Content-addressed locator of the stored bytes of one visibility snapshot. */\nexport interface KnowledgeVisibilityArtifactRef {\n readonly uri: string\n /** Digest of the stored bytes, as `knowledgeVisibilityArtifactRef` computes it. */\n readonly digest: Sha256Digest\n readonly byteLength: number\n}\n\n/**\n * Compact identity of one exact visibility snapshot. The snapshot bytes live in\n * the artifact the reference names, or in another durable record the caller\n * keeps; the receipt carries only this reference.\n */\nexport interface KnowledgeVisibilityRef {\n readonly snapshotDigest: Sha256Digest\n readonly pageCount: number\n readonly artifact?: KnowledgeVisibilityArtifactRef\n}\n\nexport interface KnowledgeRetrieverIdentity {\n /** Stable implementation name, for example `token-overlap-v1`. */\n readonly id: string\n /** Published or application-defined implementation version. */\n readonly version: string\n /** Exact identity of every retrieval setting not represented elsewhere. */\n readonly configDigest: Sha256Digest\n}\n\nexport interface OriginatedKnowledgeSearchResult extends KnowledgeSearchResult {\n readonly origin: PageOrigin\n}\n\nexport interface KnowledgeRetrievalResultReceipt {\n readonly rank: number\n readonly pageId: string\n readonly origin: PageOrigin\n readonly path: string\n readonly pageDigest: Sha256Digest\n readonly rrfScore: number\n readonly normalizedScore: number\n readonly snippet: string\n readonly reasons: readonly string[]\n}\n\nexport type KnowledgeReceiptAttributeValue = string | number | boolean | null\n\n/**\n * Immutable proof of what one actor could see and what its retriever returned.\n * Final prose is not evidence that retrieval happened; this receipt is.\n */\nexport interface KnowledgeRetrievalReceipt {\n readonly schemaVersion: typeof KNOWLEDGE_USE_RECEIPT_SCHEMA_VERSION\n readonly kind: 'knowledge-retrieval'\n readonly digestAlgorithm: typeof KNOWLEDGE_RECEIPT_DIGEST_ALGORITHM\n readonly receiptDigest: Sha256Digest\n readonly createdAt: string\n readonly runId: string\n readonly actorId?: string\n readonly profileDigest?: Sha256Digest\n readonly executionRef?: Sha256Digest\n readonly query: string\n readonly retriever: KnowledgeRetrieverIdentity\n readonly visibility: KnowledgeVisibilityRef\n readonly results: readonly KnowledgeRetrievalResultReceipt[]\n readonly evidenceRefs: readonly EvidenceRef[]\n readonly attributes: Readonly<Record<string, KnowledgeReceiptAttributeValue>>\n}\n\nexport interface CreateKnowledgeRetrievalReceiptInput {\n readonly runId: string\n readonly actorId?: string\n readonly profileDigest?: Sha256Digest\n readonly executionRef?: Sha256Digest\n readonly query: string\n readonly retriever: KnowledgeRetrieverIdentity\n /**\n * The snapshot the retriever searched, created once with\n * `createKnowledgeVisibilitySnapshot` and reused for every retrieval over the\n * same view. Results join against its entries; the receipt stores only its\n * reference.\n */\n readonly visibility: KnowledgeVisibilitySnapshot\n /** Where the snapshot bytes are stored, when the caller has persisted them. */\n readonly visibilityArtifact?: KnowledgeVisibilityArtifactRef\n readonly results: readonly OriginatedKnowledgeSearchResult[]\n readonly evidenceRefs?: readonly EvidenceRef[]\n readonly attributes?: Readonly<Record<string, KnowledgeReceiptAttributeValue>>\n readonly createdAt?: Date | string\n}\n\n/**\n * Returns the stored bytes of the artifact, or `undefined` when nothing is\n * stored at its uri. A thrown error is reported as a load failure.\n */\nexport type KnowledgeVisibilityArtifactLoader = (\n artifact: KnowledgeVisibilityArtifactRef,\n) => Promise<Uint8Array | undefined> | Uint8Array | undefined\n\nexport type KnowledgeVisibilityUnavailableReason =\n | 'no-artifact-reference'\n | 'missing'\n | 'load-failed'\n\n/**\n * The visibility snapshot a receipt references could not be obtained, so the\n * result-to-visibility join cannot be proven. This is distinct from a snapshot\n * that loads and fails to match.\n */\nexport class KnowledgeVisibilityUnavailableError extends Error {\n readonly reason: KnowledgeVisibilityUnavailableReason\n readonly snapshotDigest: Sha256Digest\n readonly uri?: string\n\n constructor(input: {\n reason: KnowledgeVisibilityUnavailableReason\n snapshotDigest: Sha256Digest\n uri?: string\n cause?: unknown\n }) {\n const where = input.uri === undefined ? '' : ` at '${input.uri}'`\n const detail = {\n 'no-artifact-reference': 'the receipt carries no artifact reference',\n missing: `no artifact is stored${where}`,\n 'load-failed': `the artifact${where} could not be loaded`,\n }[input.reason]\n super(\n `knowledge visibility snapshot ${input.snapshotDigest} is unavailable: ${detail}`,\n input.cause === undefined ? undefined : { cause: input.cause },\n )\n this.name = 'KnowledgeVisibilityUnavailableError'\n this.reason = input.reason\n this.snapshotDigest = input.snapshotDigest\n if (input.uri !== undefined) this.uri = input.uri\n }\n}\n\nexport type KnowledgeUseRelation =\n | 'supports'\n | 'contradicts'\n | 'extends'\n | 'rederives'\n | 'background'\n\nexport type KnowledgeConsumerKind =\n | 'decision'\n | 'artifact'\n | 'experiment'\n | 'candidate'\n | 'message'\n | 'other'\n\nexport interface KnowledgeConsumerRef {\n readonly kind: KnowledgeConsumerKind\n readonly uri: string\n readonly digest?: Sha256Digest\n}\n\nexport interface KnowledgeUsedResult {\n readonly rank: number\n readonly pageId: string\n readonly origin: PageOrigin\n readonly path: string\n readonly pageDigest: Sha256Digest\n}\n\n/**\n * Immutable proof that one retrieved page was selected for a downstream\n * decision, artifact, experiment, candidate, or message.\n */\nexport interface KnowledgeUseReceipt {\n readonly schemaVersion: typeof KNOWLEDGE_USE_RECEIPT_SCHEMA_VERSION\n readonly kind: 'knowledge-use'\n readonly digestAlgorithm: typeof KNOWLEDGE_RECEIPT_DIGEST_ALGORITHM\n readonly receiptDigest: Sha256Digest\n readonly createdAt: string\n readonly runId: string\n readonly actorId?: string\n readonly profileDigest?: Sha256Digest\n readonly executionRef?: Sha256Digest\n readonly retrievalReceiptDigest: Sha256Digest\n readonly used: KnowledgeUsedResult\n readonly relation: KnowledgeUseRelation\n readonly consumer: KnowledgeConsumerRef\n readonly evidenceRefs: readonly EvidenceRef[]\n readonly attributes: Readonly<Record<string, KnowledgeReceiptAttributeValue>>\n}\n\nexport interface CreateKnowledgeUseReceiptInput {\n readonly retrieval: KnowledgeRetrievalReceipt\n /** Exact one-based rank from the retrieval receipt. */\n readonly selectedRank: number\n readonly relation: KnowledgeUseRelation\n readonly consumer: KnowledgeConsumerRef\n readonly evidenceRefs?: readonly EvidenceRef[]\n readonly attributes?: Readonly<Record<string, KnowledgeReceiptAttributeValue>>\n readonly createdAt?: Date | string\n}\n\n/**\n * Why a retrieval influenced nothing.\n *\n * `irrelevant` means the returned pages did not bear on the question.\n * `no-use` means they did bear on it and the consumer still used none of them.\n */\nexport type KnowledgeRetrievalDispositionRelation = 'irrelevant' | 'no-use'\n\n/**\n * Immutable proof that one retrieval led to no use.\n *\n * A use receipt requires a selected rank, so a retrieval that influenced\n * nothing would otherwise leave no record at all, and \"no evidence of use\" and\n * \"evidence of no use\" would look identical in the ledger.\n */\nexport interface KnowledgeRetrievalDisposition {\n readonly schemaVersion: typeof KNOWLEDGE_USE_RECEIPT_SCHEMA_VERSION\n readonly kind: 'knowledge-retrieval-disposition'\n readonly digestAlgorithm: typeof KNOWLEDGE_RECEIPT_DIGEST_ALGORITHM\n readonly receiptDigest: Sha256Digest\n readonly createdAt: string\n readonly runId: string\n readonly actorId?: string\n readonly profileDigest?: Sha256Digest\n readonly executionRef?: Sha256Digest\n readonly retrievalReceiptDigest: Sha256Digest\n readonly relation: KnowledgeRetrievalDispositionRelation\n readonly consumer: KnowledgeConsumerRef\n readonly evidenceRefs: readonly EvidenceRef[]\n readonly attributes: Readonly<Record<string, KnowledgeReceiptAttributeValue>>\n}\n\nexport interface CreateKnowledgeRetrievalDispositionInput {\n readonly retrieval: KnowledgeRetrievalReceipt\n readonly relation: KnowledgeRetrievalDispositionRelation\n readonly consumer: KnowledgeConsumerRef\n readonly evidenceRefs?: readonly EvidenceRef[]\n readonly attributes?: Readonly<Record<string, KnowledgeReceiptAttributeValue>>\n readonly createdAt?: Date | string\n}\n\n/**\n * Create a retrieval receipt over a precomputed snapshot. Every result must\n * occur in the snapshot with the same page id and bytes; the receipt stores the\n * snapshot's reference, not its entries.\n */\nexport function createKnowledgeRetrievalReceipt(\n input: CreateKnowledgeRetrievalReceiptInput,\n): KnowledgeRetrievalReceipt {\n if (!input || typeof input !== 'object') {\n throw new TypeError('knowledge retrieval receipt input is required')\n }\n const runId = nonEmpty(input.runId, 'knowledge retrieval runId')\n const actorId = optionalText(input.actorId, 'knowledge retrieval actorId')\n const profileDigest = optionalDigest(input.profileDigest, 'knowledge retrieval profileDigest')\n const executionRef = optionalDigest(input.executionRef, 'knowledge retrieval executionRef')\n const query = nonEmpty(input.query, 'knowledge retrieval query')\n const retriever = normalizeRetriever(input.retriever)\n const index = visibilityIndexOf(input.visibility)\n const artifact =\n input.visibilityArtifact === undefined\n ? undefined\n : normalizeVisibilityArtifact(\n input.visibilityArtifact,\n 'knowledge retrieval visibilityArtifact',\n )\n const visibility: KnowledgeVisibilityRef = Object.freeze({\n snapshotDigest: index.snapshot.snapshotDigest,\n pageCount: index.snapshot.entries.length,\n ...(artifact === undefined ? {} : { artifact }),\n })\n const results = normalizeRetrievalResults(input.results, index)\n const evidenceRefs = normalizeEvidenceRefs(input.evidenceRefs ?? [])\n const attributes = normalizeAttributes(input.attributes ?? {})\n const createdAt = isoTimestamp(input.createdAt, 'knowledge retrieval createdAt')\n const material = retrievalMaterial({\n createdAt,\n runId,\n actorId,\n profileDigest,\n executionRef,\n query,\n retriever,\n visibility,\n results,\n evidenceRefs,\n attributes,\n })\n return Object.freeze({\n ...material,\n receiptDigest: canonicalCandidateDigest(material),\n })\n}\n\n/**\n * Verify the receipt's schema, canonical digest, rank continuity, finite\n * scores, and well-formed visibility reference. This proves what the receipt\n * says; it does not prove that the results occur in the referenced snapshot.\n * Use `assertKnowledgeRetrievalMatchesVisibility` or\n * `assertKnowledgeRetrievalMatchesVisibilityArtifact` for that join.\n */\nexport function verifyKnowledgeRetrievalReceipt(\n receipt: KnowledgeRetrievalReceipt,\n): KnowledgeRetrievalReceipt {\n if (!receipt || typeof receipt !== 'object') {\n throw new TypeError('knowledge retrieval receipt is required')\n }\n assertSchemaVersion(receipt.schemaVersion, 'knowledge retrieval')\n if (receipt.kind !== 'knowledge-retrieval') {\n throw new Error(`knowledge retrieval receipt kind must be 'knowledge-retrieval'`)\n }\n if (receipt.digestAlgorithm !== KNOWLEDGE_RECEIPT_DIGEST_ALGORITHM) {\n throw new Error(`unsupported knowledge retrieval digestAlgorithm '${receipt.digestAlgorithm}'`)\n }\n const visibility = normalizeVisibilityRef(receipt.visibility)\n validateReceiptResultShape(receipt.results, visibility.pageCount)\n const material = retrievalMaterial({\n createdAt: isoTimestamp(receipt.createdAt, 'knowledge retrieval createdAt'),\n runId: nonEmpty(receipt.runId, 'knowledge retrieval runId'),\n actorId: optionalText(receipt.actorId, 'knowledge retrieval actorId'),\n profileDigest: optionalDigest(receipt.profileDigest, 'knowledge retrieval profileDigest'),\n executionRef: optionalDigest(receipt.executionRef, 'knowledge retrieval executionRef'),\n query: nonEmpty(receipt.query, 'knowledge retrieval query'),\n retriever: normalizeRetriever(receipt.retriever),\n visibility,\n results: receipt.results,\n evidenceRefs: normalizeEvidenceRefs(receipt.evidenceRefs),\n attributes: normalizeAttributes(receipt.attributes),\n })\n const expected = canonicalCandidateDigest(material)\n if (expected !== receipt.receiptDigest) {\n throw new Error('knowledge retrieval receipt digest mismatch')\n }\n return receipt\n}\n\n/**\n * Prove that the receipt references exactly this snapshot and that every\n * returned result occurs in it with the same page id and bytes. Pass the\n * snapshot itself, or the originated pages to snapshot them first.\n */\nexport function assertKnowledgeRetrievalMatchesVisibility(\n receipt: KnowledgeRetrievalReceipt,\n visibility: KnowledgeVisibilitySnapshot | readonly OriginatedPage[],\n): void {\n verifyKnowledgeRetrievalReceipt(receipt)\n const index = visibilityIndexOf(\n Array.isArray(visibility)\n ? createKnowledgeVisibilitySnapshot(visibility)\n : (visibility as KnowledgeVisibilitySnapshot),\n )\n assertReceiptJoinsVisibility(receipt, index)\n}\n\n/**\n * Load the snapshot artifact the receipt references, prove the stored bytes\n * match the reference, and prove every returned result occurs in the decoded\n * snapshot. A snapshot that cannot be obtained raises\n * `KnowledgeVisibilityUnavailableError`; it is never treated as empty.\n */\nexport async function assertKnowledgeRetrievalMatchesVisibilityArtifact(\n receipt: KnowledgeRetrievalReceipt,\n loadArtifact: KnowledgeVisibilityArtifactLoader,\n): Promise<KnowledgeVisibilitySnapshot> {\n verifyKnowledgeRetrievalReceipt(receipt)\n if (typeof loadArtifact !== 'function') {\n throw new TypeError('knowledge visibility artifact loader must be a function')\n }\n const reference = receipt.visibility\n if (reference.artifact === undefined) {\n throw new KnowledgeVisibilityUnavailableError({\n reason: 'no-artifact-reference',\n snapshotDigest: reference.snapshotDigest,\n })\n }\n const artifact = reference.artifact\n let bytes: Uint8Array | undefined\n try {\n bytes = await loadArtifact(artifact)\n } catch (error) {\n throw new KnowledgeVisibilityUnavailableError({\n reason: 'load-failed',\n snapshotDigest: reference.snapshotDigest,\n uri: artifact.uri,\n cause: error,\n })\n }\n if (bytes === undefined) {\n throw new KnowledgeVisibilityUnavailableError({\n reason: 'missing',\n snapshotDigest: reference.snapshotDigest,\n uri: artifact.uri,\n })\n }\n if (!(bytes instanceof Uint8Array)) {\n throw new TypeError(`knowledge visibility artifact '${artifact.uri}' loaded a non-byte value`)\n }\n if (bytes.byteLength !== artifact.byteLength) {\n throw new Error(\n `knowledge visibility artifact '${artifact.uri}' byteLength mismatch: expected ${artifact.byteLength}, observed ${bytes.byteLength}`,\n )\n }\n if (sha256Bytes(bytes) !== artifact.digest) {\n throw new Error(`knowledge visibility artifact '${artifact.uri}' digest mismatch`)\n }\n const snapshot = decodeKnowledgeVisibilitySnapshot(bytes)\n if (snapshot.snapshotDigest !== reference.snapshotDigest) {\n throw new Error(\n `knowledge visibility artifact '${artifact.uri}' holds snapshot ${snapshot.snapshotDigest}, not ${reference.snapshotDigest}`,\n )\n }\n assertReceiptJoinsVisibility(receipt, visibilityIndexOf(snapshot))\n return snapshot\n}\n\n/** Create a downstream-use receipt for one exact ranked result. */\nexport function createKnowledgeUseReceipt(\n input: CreateKnowledgeUseReceiptInput,\n): KnowledgeUseReceipt {\n if (!input || typeof input !== 'object') {\n throw new TypeError('knowledge use receipt input is required')\n }\n const retrieval = verifyKnowledgeRetrievalReceipt(input.retrieval)\n if (!Number.isSafeInteger(input.selectedRank) || input.selectedRank < 1) {\n throw new TypeError('knowledge use selectedRank must be a positive safe integer')\n }\n const selected = retrieval.results.find((result) => result.rank === input.selectedRank)\n if (!selected) {\n throw new Error(\n `knowledge use selectedRank ${input.selectedRank} was not returned by retrieval ${retrieval.receiptDigest}`,\n )\n }\n const relation = validateUseRelation(input.relation)\n const consumer = normalizeConsumer(input.consumer)\n const evidenceRefs = normalizeEvidenceRefs(input.evidenceRefs ?? [])\n const attributes = normalizeAttributes(input.attributes ?? {})\n const createdAt = isoTimestamp(input.createdAt, 'knowledge use createdAt')\n const used = Object.freeze({\n rank: selected.rank,\n pageId: selected.pageId,\n origin: selected.origin,\n path: selected.path,\n pageDigest: selected.pageDigest,\n })\n const material = useMaterial({\n createdAt,\n retrieval,\n used,\n relation,\n consumer,\n evidenceRefs,\n attributes,\n })\n return Object.freeze({\n ...material,\n receiptDigest: canonicalCandidateDigest(material),\n })\n}\n\n/** Verify one use receipt against the exact retrieval that authorized it. */\nexport function verifyKnowledgeUseReceipt(\n receipt: KnowledgeUseReceipt,\n retrieval: KnowledgeRetrievalReceipt,\n): KnowledgeUseReceipt {\n if (!receipt || typeof receipt !== 'object') {\n throw new TypeError('knowledge use receipt is required')\n }\n const verifiedRetrieval = verifyKnowledgeRetrievalReceipt(retrieval)\n assertSchemaVersion(receipt.schemaVersion, 'knowledge use')\n if (receipt.kind !== 'knowledge-use') {\n throw new Error(`knowledge use receipt kind must be 'knowledge-use'`)\n }\n if (receipt.digestAlgorithm !== KNOWLEDGE_RECEIPT_DIGEST_ALGORITHM) {\n throw new Error(`unsupported knowledge use digestAlgorithm '${receipt.digestAlgorithm}'`)\n }\n if (receipt.retrievalReceiptDigest !== verifiedRetrieval.receiptDigest) {\n throw new Error('knowledge use receipt references a different retrieval receipt')\n }\n const selected = verifiedRetrieval.results.find((result) => result.rank === receipt.used.rank)\n if (\n !selected ||\n selected.pageId !== receipt.used.pageId ||\n selected.origin !== receipt.used.origin ||\n selected.path !== receipt.used.path ||\n selected.pageDigest !== receipt.used.pageDigest\n ) {\n throw new Error('knowledge use receipt selected result does not match the retrieval receipt')\n }\n const material = useMaterial({\n createdAt: isoTimestamp(receipt.createdAt, 'knowledge use createdAt'),\n retrieval: verifiedRetrieval,\n used: receipt.used,\n relation: validateUseRelation(receipt.relation),\n consumer: normalizeConsumer(receipt.consumer),\n evidenceRefs: normalizeEvidenceRefs(receipt.evidenceRefs),\n attributes: normalizeAttributes(receipt.attributes),\n })\n const expected = canonicalCandidateDigest(material)\n if (expected !== receipt.receiptDigest) {\n throw new Error('knowledge use receipt digest mismatch')\n }\n return receipt\n}\n\n/** Record that one retrieval led to no use, with no rank to select. */\nexport function createKnowledgeRetrievalDisposition(\n input: CreateKnowledgeRetrievalDispositionInput,\n): KnowledgeRetrievalDisposition {\n if (!input || typeof input !== 'object') {\n throw new TypeError('knowledge retrieval disposition input is required')\n }\n const material = dispositionMaterial({\n createdAt: isoTimestamp(input.createdAt, 'knowledge retrieval disposition createdAt'),\n retrieval: verifyKnowledgeRetrievalReceipt(input.retrieval),\n relation: validateDispositionRelation(input.relation),\n consumer: normalizeConsumer(input.consumer),\n evidenceRefs: normalizeEvidenceRefs(input.evidenceRefs ?? []),\n attributes: normalizeAttributes(input.attributes ?? {}),\n })\n return Object.freeze({ ...material, receiptDigest: canonicalCandidateDigest(material) })\n}\n\n/** Verify one disposition against the exact retrieval that authorized it. */\nexport function verifyKnowledgeRetrievalDisposition(\n disposition: KnowledgeRetrievalDisposition,\n retrieval: KnowledgeRetrievalReceipt,\n): KnowledgeRetrievalDisposition {\n if (!disposition || typeof disposition !== 'object') {\n throw new TypeError('knowledge retrieval disposition is required')\n }\n const verifiedRetrieval = verifyKnowledgeRetrievalReceipt(retrieval)\n assertSchemaVersion(disposition.schemaVersion, 'knowledge retrieval disposition')\n if (disposition.kind !== 'knowledge-retrieval-disposition') {\n throw new Error(\n `knowledge retrieval disposition kind must be 'knowledge-retrieval-disposition'`,\n )\n }\n if (disposition.digestAlgorithm !== KNOWLEDGE_RECEIPT_DIGEST_ALGORITHM) {\n throw new Error(\n `unsupported knowledge retrieval disposition digestAlgorithm '${disposition.digestAlgorithm}'`,\n )\n }\n if (disposition.retrievalReceiptDigest !== verifiedRetrieval.receiptDigest) {\n throw new Error('knowledge retrieval disposition references a different retrieval receipt')\n }\n const material = dispositionMaterial({\n createdAt: isoTimestamp(disposition.createdAt, 'knowledge retrieval disposition createdAt'),\n retrieval: verifiedRetrieval,\n relation: validateDispositionRelation(disposition.relation),\n consumer: normalizeConsumer(disposition.consumer),\n evidenceRefs: normalizeEvidenceRefs(disposition.evidenceRefs),\n attributes: normalizeAttributes(disposition.attributes),\n })\n if (canonicalCandidateDigest(material) !== disposition.receiptDigest) {\n throw new Error('knowledge retrieval disposition digest mismatch')\n }\n return disposition\n}\n\nfunction assertReceiptJoinsVisibility(\n receipt: KnowledgeRetrievalReceipt,\n index: VisibilityIndex,\n): void {\n if (\n index.snapshot.snapshotDigest !== receipt.visibility.snapshotDigest ||\n index.snapshot.entries.length !== receipt.visibility.pageCount\n ) {\n throw new Error('knowledge retrieval receipt does not match the supplied visibility snapshot')\n }\n for (const result of receipt.results) {\n const entry = index.byIdentity.get(visibilityIdentity(result.origin, result.path))\n if (!entry || entry.pageId !== result.pageId || entry.pageDigest !== result.pageDigest) {\n throw new Error(\n `knowledge retrieval result rank ${result.rank} is not in the visibility snapshot`,\n )\n }\n }\n}\n\nfunction retrievalMaterial(input: {\n createdAt: string\n runId: string\n actorId?: string\n profileDigest?: Sha256Digest\n executionRef?: Sha256Digest\n query: string\n retriever: KnowledgeRetrieverIdentity\n visibility: KnowledgeVisibilityRef\n results: readonly KnowledgeRetrievalResultReceipt[]\n evidenceRefs: readonly EvidenceRef[]\n attributes: Readonly<Record<string, KnowledgeReceiptAttributeValue>>\n}) {\n return {\n schemaVersion: KNOWLEDGE_USE_RECEIPT_SCHEMA_VERSION,\n kind: 'knowledge-retrieval' as const,\n digestAlgorithm: KNOWLEDGE_RECEIPT_DIGEST_ALGORITHM,\n createdAt: input.createdAt,\n runId: input.runId,\n ...(input.actorId === undefined ? {} : { actorId: input.actorId }),\n ...(input.profileDigest === undefined ? {} : { profileDigest: input.profileDigest }),\n ...(input.executionRef === undefined ? {} : { executionRef: input.executionRef }),\n query: input.query,\n retriever: input.retriever,\n visibility: input.visibility,\n results: input.results,\n evidenceRefs: input.evidenceRefs,\n attributes: input.attributes,\n }\n}\n\n/**\n * The actor identity a downstream record inherits from the retrieval that\n * authorized it. A record that re-declared these could disagree with the\n * receipt it references.\n */\nfunction retrievalIdentity(retrieval: KnowledgeRetrievalReceipt) {\n return {\n runId: retrieval.runId,\n ...(retrieval.actorId === undefined ? {} : { actorId: retrieval.actorId }),\n ...(retrieval.profileDigest === undefined ? {} : { profileDigest: retrieval.profileDigest }),\n ...(retrieval.executionRef === undefined ? {} : { executionRef: retrieval.executionRef }),\n retrievalReceiptDigest: retrieval.receiptDigest,\n }\n}\n\nfunction useMaterial(input: {\n createdAt: string\n retrieval: KnowledgeRetrievalReceipt\n used: KnowledgeUsedResult\n relation: KnowledgeUseRelation\n consumer: KnowledgeConsumerRef\n evidenceRefs: readonly EvidenceRef[]\n attributes: Readonly<Record<string, KnowledgeReceiptAttributeValue>>\n}) {\n return {\n schemaVersion: KNOWLEDGE_USE_RECEIPT_SCHEMA_VERSION,\n kind: 'knowledge-use' as const,\n digestAlgorithm: KNOWLEDGE_RECEIPT_DIGEST_ALGORITHM,\n createdAt: input.createdAt,\n ...retrievalIdentity(input.retrieval),\n used: input.used,\n relation: input.relation,\n consumer: input.consumer,\n evidenceRefs: input.evidenceRefs,\n attributes: input.attributes,\n }\n}\n\nfunction dispositionMaterial(input: {\n createdAt: string\n retrieval: KnowledgeRetrievalReceipt\n relation: KnowledgeRetrievalDispositionRelation\n consumer: KnowledgeConsumerRef\n evidenceRefs: readonly EvidenceRef[]\n attributes: Readonly<Record<string, KnowledgeReceiptAttributeValue>>\n}) {\n return {\n schemaVersion: KNOWLEDGE_USE_RECEIPT_SCHEMA_VERSION,\n kind: 'knowledge-retrieval-disposition' as const,\n digestAlgorithm: KNOWLEDGE_RECEIPT_DIGEST_ALGORITHM,\n createdAt: input.createdAt,\n ...retrievalIdentity(input.retrieval),\n relation: input.relation,\n consumer: input.consumer,\n evidenceRefs: input.evidenceRefs,\n attributes: input.attributes,\n }\n}\n\nfunction validateDispositionRelation(\n value: KnowledgeRetrievalDispositionRelation,\n): KnowledgeRetrievalDispositionRelation {\n if (value !== 'irrelevant' && value !== 'no-use') {\n throw new TypeError(`knowledge retrieval disposition relation is invalid: ${String(value)}`)\n }\n return value\n}\n\nfunction normalizeRetrievalResults(\n results: readonly OriginatedKnowledgeSearchResult[],\n index: VisibilityIndex,\n): readonly KnowledgeRetrievalResultReceipt[] {\n if (!Array.isArray(results)) throw new TypeError('knowledge retrieval results must be an array')\n const seenRanks = new Set<number>()\n const seenPages = new Set<string>()\n const normalized = results.map((result, position) => {\n if (!result || typeof result !== 'object') {\n throw new TypeError(`knowledge retrieval results[${position}] must be an object`)\n }\n if (!Number.isSafeInteger(result.rank) || result.rank < 1) {\n throw new TypeError(`knowledge retrieval results[${position}].rank must be positive`)\n }\n if (seenRanks.has(result.rank)) {\n throw new Error(`knowledge retrieval repeats rank ${result.rank}`)\n }\n seenRanks.add(result.rank)\n const origin = validateOrigin(result.origin, `knowledge retrieval results[${position}].origin`)\n validateKnowledgePage(result.page)\n const identity = visibilityIdentity(origin, result.page.path)\n if (seenPages.has(identity)) {\n throw new Error(\n `knowledge retrieval repeats page '${result.page.path}' at origin '${origin}'`,\n )\n }\n seenPages.add(identity)\n const visibleEntry = index.byIdentity.get(identity)\n if (!visibleEntry) {\n throw new Error(\n `knowledge retrieval result '${result.page.path}' at origin '${origin}' was not visible`,\n )\n }\n const pageDigest = knowledgePageDigest(result.page)\n if (visibleEntry.pageId !== result.page.id || visibleEntry.pageDigest !== pageDigest) {\n throw new Error(\n `knowledge retrieval result '${result.page.path}' does not match its visibility snapshot`,\n )\n }\n assertResultScores(result, position)\n return Object.freeze({\n rank: result.rank,\n pageId: result.page.id,\n origin,\n path: result.page.path,\n pageDigest,\n rrfScore: result.rrfScore,\n normalizedScore: result.normalizedScore,\n snippet: typeof result.snippet === 'string' ? result.snippet : '',\n reasons: Object.freeze(\n result.reasons.map((reason: string, reasonIndex: number) =>\n nonEmpty(reason, `knowledge retrieval results[${position}].reasons[${reasonIndex}]`),\n ),\n ),\n })\n })\n normalized.sort((left, right) => left.rank - right.rank)\n assertContiguousRanks(normalized)\n return Object.freeze(normalized)\n}\n\nfunction validateReceiptResultShape(\n results: readonly KnowledgeRetrievalResultReceipt[],\n pageCount: number,\n): void {\n if (!Array.isArray(results)) throw new TypeError('knowledge retrieval results must be an array')\n if (results.length > pageCount) {\n throw new Error(\n `knowledge retrieval returns ${results.length} results from ${pageCount} visible pages`,\n )\n }\n assertContiguousRanks(results)\n const seen = new Set<string>()\n results.forEach((result, position) => {\n if (!result || typeof result !== 'object') {\n throw new TypeError(`knowledge retrieval results[${position}] must be an object`)\n }\n const origin = validateOrigin(result.origin, `knowledge retrieval results[${position}].origin`)\n const identity = visibilityIdentity(\n origin,\n nonEmpty(result.path, `knowledge retrieval results[${position}].path`),\n )\n if (seen.has(identity)) {\n throw new Error(`knowledge retrieval repeats visible page '${result.path}'`)\n }\n seen.add(identity)\n nonEmpty(result.pageId, `knowledge retrieval results[${position}].pageId`)\n digest(result.pageDigest, `knowledge retrieval results[${position}].pageDigest`)\n assertResultScores(result, position)\n if (typeof result.snippet !== 'string') {\n throw new TypeError(`knowledge retrieval results[${position}].snippet must be a string`)\n }\n if (!Array.isArray(result.reasons)) {\n throw new TypeError(`knowledge retrieval results[${position}].reasons must be an array`)\n }\n })\n}\n\n/**\n * Ranks a retriever returned: one-based, unique, and contiguous, so a receipt\n * cannot hide a result by omitting its rank.\n */\nfunction assertContiguousRanks(results: readonly { readonly rank: number }[]): void {\n results.forEach((result, position) => {\n if (result.rank !== position + 1) {\n throw new Error(\n `knowledge retrieval ranks must be contiguous from 1; expected ${position + 1}, observed ${result.rank}`,\n )\n }\n })\n}\n\n/** Scores a receipt may carry: finite, with the normalized score inside [0,1]. */\nfunction assertResultScores(\n result: { readonly rrfScore: number; readonly normalizedScore: number },\n position: number,\n): void {\n finite(result.rrfScore, `knowledge retrieval results[${position}].rrfScore`)\n finite(result.normalizedScore, `knowledge retrieval results[${position}].normalizedScore`)\n if (result.normalizedScore < 0 || result.normalizedScore > 1) {\n throw new TypeError(`knowledge retrieval results[${position}].normalizedScore must be in [0,1]`)\n }\n}\n\nfunction normalizeRetriever(input: KnowledgeRetrieverIdentity): KnowledgeRetrieverIdentity {\n if (!input || typeof input !== 'object') {\n throw new TypeError('knowledge retriever identity is required')\n }\n return Object.freeze({\n id: nonEmpty(input.id, 'knowledge retriever id'),\n version: nonEmpty(input.version, 'knowledge retriever version'),\n configDigest: digest(input.configDigest, 'knowledge retriever configDigest'),\n })\n}\n\nfunction normalizeConsumer(input: KnowledgeConsumerRef): KnowledgeConsumerRef {\n if (!input || typeof input !== 'object') {\n throw new TypeError('knowledge consumer reference is required')\n }\n const kinds: readonly KnowledgeConsumerKind[] = [\n 'decision',\n 'artifact',\n 'experiment',\n 'candidate',\n 'message',\n 'other',\n ]\n if (!kinds.includes(input.kind)) {\n throw new TypeError(`knowledge consumer kind is invalid: ${String(input.kind)}`)\n }\n return Object.freeze({\n kind: input.kind,\n uri: nonEmpty(input.uri, 'knowledge consumer uri'),\n ...(input.digest === undefined\n ? {}\n : { digest: digest(input.digest, 'knowledge consumer digest') }),\n })\n}\n\nfunction normalizeEvidenceRefs(values: readonly EvidenceRef[]): readonly EvidenceRef[] {\n if (!Array.isArray(values)) throw new TypeError('knowledge evidenceRefs must be an array')\n const allowed: readonly EvidenceRef['kind'][] = ['span', 'event', 'artifact', 'finding', 'metric']\n return Object.freeze(\n values.map((value, index) => {\n if (!value || typeof value !== 'object' || !allowed.includes(value.kind)) {\n throw new TypeError(`knowledge evidenceRefs[${index}].kind is invalid`)\n }\n return Object.freeze({\n kind: value.kind,\n uri: nonEmpty(value.uri, `knowledge evidenceRefs[${index}].uri`),\n ...(value.excerpt === undefined\n ? {}\n : { excerpt: nonEmpty(value.excerpt, `knowledge evidenceRefs[${index}].excerpt`) }),\n })\n }),\n )\n}\n\nfunction normalizeAttributes(\n input: Readonly<Record<string, KnowledgeReceiptAttributeValue>>,\n): Readonly<Record<string, KnowledgeReceiptAttributeValue>> {\n if (!input || typeof input !== 'object' || Array.isArray(input)) {\n throw new TypeError('knowledge receipt attributes must be an object')\n }\n const normalized: Record<string, KnowledgeReceiptAttributeValue> = {}\n for (const [key, value] of Object.entries(input)) {\n const name = nonEmpty(key, 'knowledge receipt attribute key')\n if (\n value !== null &&\n typeof value !== 'string' &&\n typeof value !== 'number' &&\n typeof value !== 'boolean'\n ) {\n throw new TypeError(`knowledge receipt attribute '${name}' has an unsupported value`)\n }\n if (typeof value === 'number') finite(value, `knowledge receipt attribute '${name}'`)\n normalized[name] = value\n }\n return Object.freeze(normalized)\n}\n\nfunction validateUseRelation(value: KnowledgeUseRelation): KnowledgeUseRelation {\n const allowed: readonly KnowledgeUseRelation[] = [\n 'supports',\n 'contradicts',\n 'extends',\n 'rederives',\n 'background',\n ]\n if (!allowed.includes(value)) {\n throw new TypeError(`knowledge use relation is invalid: ${String(value)}`)\n }\n return value\n}\n\nfunction optionalDigest(value: unknown, label: string): Sha256Digest | undefined {\n return value === undefined ? undefined : digest(value, label)\n}\n\nfunction optionalText(value: unknown, label: string): string | undefined {\n return value === undefined ? undefined : nonEmpty(value, label)\n}\n\nfunction finite(value: unknown, label: string): asserts value is number {\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n throw new TypeError(`${label} must be a finite number`)\n }\n}\n\nfunction isoTimestamp(value: Date | string | undefined, label: string): string {\n const date = value === undefined ? new Date() : value instanceof Date ? value : new Date(value)\n if (!Number.isFinite(date.getTime())) throw new TypeError(`${label} must be a valid timestamp`)\n return date.toISOString()\n}\n","/**\n * Provider-neutral knowledge tools.\n *\n * Knowledge owns what each tool does; a runtime only transports the definitions\n * and the calls. The shape is `ToolDefinition` from `@tangle-network/agent-interface`,\n * so no provider vocabulary reaches this package and no knowledge behavior\n * reaches a provider adapter.\n *\n * Every search mints a retrieval receipt. Configured receipt capture also\n * persists the exact visibility snapshot before delivering the receipt.\n *\n * Every result carries `timing` in milliseconds: `viewMs` to obtain the current\n * page view, `visibilityMs` to persist a search's snapshot, and for a write\n * `lockWaitMs` and `lockHoldMs` of the store lock.\n */\n\nimport { lstat } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport { pathToFileURL } from 'node:url'\nimport { sha256DigestSchema, type ToolDefinition } from '@tangle-network/agent-interface'\nimport { z } from 'zod'\nimport {\n parseKnowledgeCitationReference,\n resolveKnowledgeCitation,\n resolveKnowledgeCitations,\n} from './citation-resolution'\nimport { isMissingFile, readRegularFileWithinRoot, writeFileDurableWithinRoot } from './durable-fs'\nimport { type KnowledgeBriefOptions, prepareKnowledgeBrief } from './knowledge-brief'\nimport {\n createKnowledgeRetrievalReceipt,\n createKnowledgeVisibilitySnapshot,\n encodeKnowledgeVisibilitySnapshot,\n type KnowledgeRetrievalReceipt,\n knowledgeVisibilityArtifactRef,\n} from './knowledge-use-receipts'\nimport {\n immutablePageDigest,\n knowledgePageDigest,\n snapshotImmutableVisibility,\n} from './knowledge-visibility'\nimport { measureKnowledgeMutation, withKnowledgeMutationLabel } from './mutation-lock'\nimport { normalizePagesDirectory } from './pages-directory'\nimport { applyKnowledgeWriteBlocks, type KnowledgeWriteIntakeRequest } from './proposals'\nimport {\n isKnowledgeToolChain,\n loadKnowledgeToolChain,\n type OriginatedPage,\n type RunScopedStores,\n} from './run-scoped'\nimport { parseKnowledgeWriteBlocks } from './write-protocol'\n\nexport interface CreateKnowledgeToolsOptions {\n readonly stores: RunScopedStores\n /** The run whose store is written and whose chain is read. */\n readonly runId: string\n /**\n * Version of this package the host is running. A bundled build cannot read\n * its own manifest, and a receipt that guessed the version would be a\n * receipt that lies about what ranked the results.\n */\n readonly retrieverVersion: string\n readonly actorId?: string\n readonly pagesDirectory?: string\n /** Intake settings for `knowledge_record`. Absent leaves the write ungated. */\n readonly intake?: Omit<KnowledgeWriteIntakeRequest, 'inheritedPages'>\n /** Retain prior and new bytes for every completed knowledge_record transaction. */\n readonly retainHistory?: boolean\n /** Brief settings for `knowledge_search`, overridden per call by the tool input. */\n readonly brief?: Omit<KnowledgeBriefOptions, 'limit'>\n /** Receipt sink. Exact visibility bytes are persisted in the run store before this is called. */\n readonly recordRetrieval?: (receipt: KnowledgeRetrievalReceipt) => Promise<void> | void\n readonly now?: () => Date\n}\n\n// Weak keys release derived indexes when the bounded store cache replaces a view.\nconst preparedViews = new WeakMap<\n readonly OriginatedPage[],\n {\n brief: ReturnType<typeof prepareKnowledgeBrief>\n visibility: ReturnType<typeof createKnowledgeVisibilitySnapshot>\n bytes: Uint8Array\n }\n>()\n\nfunction prepareView(chain: readonly OriginatedPage[]) {\n const reusable = isKnowledgeToolChain(chain)\n const previous = reusable ? preparedViews.get(chain) : undefined\n if (previous) return previous\n const visibility = reusable\n ? snapshotImmutableVisibility(chain)\n : createKnowledgeVisibilitySnapshot(chain)\n const prepared = {\n brief: prepareKnowledgeBrief(chain),\n visibility,\n bytes: encodeKnowledgeVisibilitySnapshot(visibility),\n }\n if (reusable) preparedViews.set(chain, prepared)\n return prepared\n}\n\nconst searchInput = z.object({\n question: z.string().min(1),\n limit: z.int().min(1).max(50).optional(),\n excludeInvalidated: z\n .boolean()\n .optional()\n .describe('False includes refuted pages for historical research.'),\n tags: z.array(z.string()).optional(),\n kinds: z.array(z.string()).optional(),\n})\nconst readInput = z.object({ pageId: z.string().min(1) })\nconst recordInput = z.object({\n expectedPageDigests: z\n .record(z.string().min(1), sha256DigestSchema.nullable())\n .optional()\n .describe(\n 'For each existing page, pass its path and pageDigest from knowledge_read. Null requires a new page. Missing entries permit new pages only.',\n ),\n proposal: z\n .string()\n .min(1)\n .describe(\n 'One or more complete FILE blocks. Each begins with ---FILE: <page-path>--- and ends with ---END FILE---, each on its own line. Put the page content between them. Every block must be valid; malformed or empty proposals write nothing and return an error.',\n ),\n})\nconst resolveInput = z.object({ references: z.array(z.string().min(1)).min(1) })\n\n/**\n * The four tools an agent needs to use a knowledge store: search, read, record,\n * resolve.\n */\nexport function createKnowledgeTools(options: CreateKnowledgeToolsOptions): ToolDefinition[] {\n const { stores, runId } = options\n if (!stores || typeof stores.loadChain !== 'function') {\n throw new TypeError('knowledge tools require run-scoped stores')\n }\n if (typeof runId !== 'string' || runId.trim().length === 0) {\n throw new TypeError('knowledge tools require a runId')\n }\n if (typeof options.retrieverVersion !== 'string' || options.retrieverVersion.trim() === '') {\n throw new TypeError('knowledge tools require the running retrieverVersion')\n }\n const pages =\n options.pagesDirectory === undefined ? {} : { pagesDirectory: options.pagesDirectory }\n const pagesDirectory = normalizePagesDirectory(options.pagesDirectory)\n\n return [\n tool(\n 'knowledge_search',\n 'Search visible knowledge with unambiguous citation handles. Optionally include refuted history or filter tags and kinds.',\n searchInput,\n async (input) => {\n const started = performance.now()\n const chain = await loadKnowledgeToolChain(stores, runId)\n const prepared = prepareView(chain)\n const viewMs = elapsedSince(started)\n const brief = prepared.brief(input.question, {\n ...options.brief,\n ...(input.limit === undefined ? {} : { limit: input.limit }),\n ...(input.excludeInvalidated === undefined\n ? {}\n : { excludeInvalidated: input.excludeInvalidated }),\n ...(input.tags === undefined ? {} : { tags: input.tags }),\n ...(input.kinds === undefined ? {} : { kinds: input.kinds }),\n })\n const visibility = prepared.visibility\n const persisting = performance.now()\n const visibilityArtifact = options.recordRetrieval\n ? await persistVisibility(stores.storePath(runId), visibility, prepared.bytes)\n : undefined\n const visibilityMs = elapsedSince(persisting)\n const receipt = createKnowledgeRetrievalReceipt({\n runId,\n ...(options.actorId === undefined ? {} : { actorId: options.actorId }),\n query: brief.question,\n retriever: {\n id: brief.retrieverId,\n version: options.retrieverVersion,\n configDigest: brief.retrieverConfigDigest,\n },\n visibility,\n ...(visibilityArtifact ? { visibilityArtifact } : {}),\n results: brief.results,\n createdAt: options.now?.(),\n })\n await options.recordRetrieval?.(receipt)\n return {\n text: brief.text,\n citationIds: brief.citationIds,\n retrievalReceiptDigest: receipt.receiptDigest,\n receipt,\n timing: { viewMs, visibilityMs },\n }\n },\n ),\n\n tool(\n 'knowledge_read',\n 'Read one page by its id, optionally qualified with here::, shared:: or inherited:<runId>::.',\n readInput,\n async (input) => {\n const started = performance.now()\n const chain = await loadKnowledgeToolChain(stores, runId)\n const viewMs = elapsedSince(started)\n const resolution = resolveKnowledgeCitation(\n chain,\n parseKnowledgeCitationReference(input.pageId),\n )\n const digestOf = isKnowledgeToolChain(chain) ? immutablePageDigest : knowledgePageDigest\n return {\n status: resolution.status,\n page:\n resolution.resolved === undefined\n ? null\n : {\n pageId: resolution.resolved.page.id,\n origin: resolution.resolved.origin,\n path: resolution.resolved.page.path,\n title: resolution.resolved.page.title,\n pageDigest: digestOf(resolution.resolved.page),\n text: resolution.resolved.page.text,\n },\n candidates: resolution.candidates.map((candidate) => ({\n pageId: candidate.pageId,\n origin: candidate.origin,\n path: candidate.page.path,\n })),\n timing: { viewMs },\n }\n },\n ),\n\n tool(\n 'knowledge_record',\n `Write pages into this run's store. Use complete blocks exactly like:\\n---FILE: ${pagesDirectory}/example.md---\\n# Example\\nPage content.\\n---END FILE---\\nUse paths under ${pagesDirectory}/. Both delimiters must be on their own lines. To update a page, first knowledge_read it and pass expectedPageDigests[path] = pageDigest. Stale edits and malformed, unsafe, or empty proposals are rejected before writing any pages.`,\n recordInput,\n async (input) => {\n const parsed = parseKnowledgeWriteBlocks(input.proposal, [`${pagesDirectory}/`])\n // Tool success must mean the complete proposal was admitted, not a silent partial write.\n if (parsed.blocks.length === 0 || parsed.warnings.length > 0) {\n throw new Error(\n `knowledge_record rejected the proposal without writing any pages. Use ---FILE: ${pagesDirectory}/example.md--- followed by content and ---END FILE---, each delimiter on its own line. ${parsed.warnings.join(' ')}`,\n )\n }\n const intake = options.intake\n const inheritedPages = intake === undefined ? [] : await inheritedOf(stores, runId)\n const paths = parsed.blocks.map((block) => block.path)\n const holder = `knowledge_record by ${options.actorId ?? 'an unnamed actor'} of ${paths.slice(0, 3).join(', ')}${paths.length > 3 ? ` and ${paths.length - 3} more` : ''}`\n const { value, timing } = await measureKnowledgeMutation(() =>\n withKnowledgeMutationLabel(holder, () =>\n applyKnowledgeWriteBlocks(stores.storePath(runId), input.proposal, {\n ...pages,\n actorId: options.actorId,\n runId,\n expectedPageDigests: input.expectedPageDigests ?? {},\n retainHistory: options.retainHistory ?? true,\n ...(intake === undefined ? {} : { intake: { ...intake, inheritedPages } }),\n }),\n ),\n )\n return { ...value, timing: timing ?? { lockWaitMs: 0, lockHoldMs: 0 } }\n },\n ),\n\n tool(\n 'knowledge_resolve',\n 'Resolve page ids against everything this run can see, without hiding an ambiguity.',\n resolveInput,\n async (input) => {\n const started = performance.now()\n const chain = await loadKnowledgeToolChain(stores, runId)\n const viewMs = elapsedSince(started)\n return {\n resolutions: resolveKnowledgeCitations(\n chain,\n input.references.map((reference) => parseKnowledgeCitationReference(reference)),\n ).map((resolution) => ({\n pageId: resolution.reference.pageId,\n ...(resolution.reference.origin === undefined\n ? {}\n : { origin: resolution.reference.origin }),\n status: resolution.status,\n candidates: resolution.candidates.map((candidate) => ({\n pageId: candidate.pageId,\n origin: candidate.origin,\n path: candidate.page.path,\n })),\n })),\n timing: { viewMs },\n }\n },\n ),\n ]\n}\n\nfunction elapsedSince(started: number): number {\n return Math.round(performance.now() - started)\n}\n\n/** Everything the run can see except what it wrote, which the write path reads itself. */\nasync function inheritedOf(\n stores: RunScopedStores,\n runId: string,\n): Promise<readonly OriginatedPage[]> {\n return (await loadKnowledgeToolChain(stores, runId)).filter((entry) => entry.origin !== 'here')\n}\n\nfunction tool<Schema extends z.ZodType>(\n name: string,\n description: string,\n inputSchema: Schema,\n handler: (input: z.infer<Schema>) => Promise<unknown>,\n): ToolDefinition {\n return {\n name,\n description,\n inputSchema,\n inputSchemaJson: z.toJSONSchema(inputSchema) as Record<string, unknown>,\n handler: (input: unknown) => handler(inputSchema.parse(input)),\n }\n}\n\n/**\n * Snapshot artifacts are immutable, content-addressed evidence, separate from authoritative KB\n * state. They are written without the store lock and without moving the mutation epoch: equal\n * names always carry equal bytes, so concurrent writers converge and a search never blocks a\n * writer or restarts a reader. Stored bytes are compared before reuse; this process skips the\n * comparison only while the file keeps the identity it had when last compared.\n */\nconst verifiedArtifacts = new Map<string, string>()\nconst persisting = new Map<string, Promise<void>>()\nconst MAX_VERIFIED_ARTIFACTS = 1024\n\nasync function persistVisibility(\n root: string,\n snapshot: ReturnType<typeof createKnowledgeVisibilitySnapshot>,\n bytes: Uint8Array,\n) {\n const path = `.agent-knowledge/retrieval-visibility/${snapshot.snapshotDigest.replace('sha256:', '')}.json`\n const absolute = join(root, path)\n const identity = await fileIdentity(absolute)\n if (identity === undefined || verifiedArtifacts.get(absolute) !== identity) {\n let pending = persisting.get(absolute)\n if (!pending) {\n pending = ensureArtifact(root, path, absolute, bytes).finally(() =>\n persisting.delete(absolute),\n )\n persisting.set(absolute, pending)\n }\n await pending\n }\n return knowledgeVisibilityArtifactRef({ uri: pathToFileURL(absolute).href, bytes })\n}\n\nasync function ensureArtifact(root: string, path: string, absolute: string, bytes: Uint8Array) {\n const identity = await fileIdentity(absolute)\n if (identity !== undefined && verifiedArtifacts.get(absolute) === identity) return\n try {\n const existing = await readRegularFileWithinRoot(root, path)\n if (!existing.bytes.equals(bytes)) {\n throw new Error('stored knowledge visibility artifact does not match its content identity')\n }\n } catch (error) {\n if (!isMissingFile(error)) throw error\n await writeFileDurableWithinRoot(root, path, Buffer.from(bytes))\n }\n const verified = await fileIdentity(absolute)\n if (verified === undefined) return\n verifiedArtifacts.delete(absolute)\n verifiedArtifacts.set(absolute, verified)\n if (verifiedArtifacts.size > MAX_VERIFIED_ARTIFACTS) {\n verifiedArtifacts.delete(verifiedArtifacts.keys().next().value!)\n }\n}\n\nasync function fileIdentity(path: string): Promise<string | undefined> {\n try {\n const stat = await lstat(path, { bigint: true })\n if (!stat.isFile()) return undefined\n return [stat.dev, stat.ino, stat.size, stat.mtimeNs, stat.ctimeNs].join(':')\n } catch (error) {\n if (isMissingFile(error)) return undefined\n throw error\n }\n}\n","/**\n * Run-scope to shared-scope promotion.\n *\n * A run writes only its own store. Knowledge reaches the curated shared store\n * through this call and no other, and every promotion leaves a record naming\n * the source run, the promoted bytes, the support carried with them, the actor,\n * and the reason.\n *\n * A claim's cited support travels with it. Promoting a claim while leaving the\n * run-local pages it cites behind is what turns a resolved citation into a\n * dangling one, so the closure of cited pages is carried and the promotion is\n * refused when any citation would not resolve in the target.\n */\nimport { canonicalCandidateDigest, type Sha256Digest } from '@tangle-network/agent-interface'\nimport {\n assertKnowledgeCitationsResolved,\n parseKnowledgeCitationReference,\n resolveKnowledgeCitation,\n} from './citation-resolution'\nimport { isMissingFile, readRegularFileWithinRoot, writeJsonDurableWithinRoot } from './durable-fs'\nimport { commitKnowledgeFileMutations } from './file-transaction'\nimport { knowledgePageDigest } from './knowledge-use-receipts'\nimport { withKnowledgeMutation } from './mutation-lock'\nimport { type KnowledgePagesOptions, normalizePagesDirectory } from './pages-directory'\nimport {\n type OriginatedPage,\n originatedPages,\n type PageOrigin,\n type RunScopedStores,\n} from './run-scoped'\nimport { initKnowledgeBase, knowledgePageFromMarkdown, loadKnowledgePages } from './store'\nimport type { KnowledgeId, KnowledgePage } from './types'\n\nexport const KNOWLEDGE_PROMOTION_SCHEMA_VERSION = '1.0.0' as const\nexport const KNOWLEDGE_PROMOTION_DIGEST_ALGORITHM = 'rfc8785-sha256' as const\n\n/** Root-relative directory holding one JSON record per promotion. */\nexport const KNOWLEDGE_PROMOTIONS_DIRECTORY = '.agent-knowledge/promotions'\n\nexport type KnowledgePromotionErrorCode =\n | 'unknown-page'\n | 'ambiguous-support'\n | 'id-conflict'\n | 'path-conflict'\n\n/** A promotion that cannot be performed exactly as asked. */\nexport class KnowledgePromotionError extends Error {\n readonly code: KnowledgePromotionErrorCode\n\n constructor(code: KnowledgePromotionErrorCode, message: string) {\n super(message)\n this.name = 'KnowledgePromotionError'\n this.code = code\n }\n}\n\nexport interface KnowledgePromotionEntry {\n readonly pageId: KnowledgeId\n readonly path: string\n /** Where the page was read from in the source run's chain. */\n readonly sourceOrigin: PageOrigin\n readonly pageDigest: Sha256Digest\n /** False when the page travelled only because a promoted page cites it. */\n readonly requested: boolean\n}\n\n/** Immutable record of one promotion into a shared store. */\nexport interface KnowledgePromotionRecord {\n readonly schemaVersion: typeof KNOWLEDGE_PROMOTION_SCHEMA_VERSION\n readonly kind: 'knowledge-promotion'\n readonly digestAlgorithm: typeof KNOWLEDGE_PROMOTION_DIGEST_ALGORITHM\n readonly recordDigest: Sha256Digest\n readonly createdAt: string\n readonly runId: string\n readonly actor: string\n readonly reason: string\n /** Promoted pages first, then carried support, each group in path order. */\n readonly entries: readonly KnowledgePromotionEntry[]\n}\n\nexport interface PromoteRunScopedPagesOptions extends KnowledgePagesOptions {\n /** Stable ids of the pages this run authored and wants in shared scope. */\n readonly pageIds: readonly KnowledgeId[]\n /** The curated store every run reads and no run writes directly. */\n readonly sharedRoot: string\n /** Who decided to promote. */\n readonly actor: string\n /** Why this knowledge belongs in shared scope. */\n readonly reason: string\n readonly now?: () => Date\n}\n\n/**\n * Promote pages a run authored into the shared store, with their cited support.\n *\n * Support keeps its own evidence fields exactly as written, so a promoted claim\n * cannot inherit a confidence its support does not carry. Pages travel as the\n * bytes their store holds.\n *\n * Re-running the same promotion is safe: unchanged pages produce no file\n * mutation and the record is content-addressed, so it lands at the same path\n * with the same bytes.\n */\nexport async function promoteRunScopedPages(\n stores: RunScopedStores,\n runId: string,\n options: PromoteRunScopedPagesOptions,\n): Promise<KnowledgePromotionRecord> {\n const pagesDirectory = normalizePagesDirectory(options.pagesDirectory)\n const sharedRoot = nonEmpty(options.sharedRoot, 'promotion sharedRoot')\n const actor = nonEmpty(options.actor, 'promotion actor')\n const reason = nonEmpty(options.reason, 'promotion reason')\n if (!Array.isArray(options.pageIds) || options.pageIds.length === 0) {\n throw new TypeError('promotion pageIds must name at least one page')\n }\n\n const chain = await stores.loadChain(runId)\n const travellers = collectTravellers(chain, options.pageIds)\n const mutations = await Promise.all(\n travellers.map(async (traveller) => ({\n path: traveller.entry.page.path,\n content: await readPageBytes(stores, runId, traveller.entry, pagesDirectory),\n })),\n )\n\n await initKnowledgeBase(sharedRoot)\n return withKnowledgeMutation(sharedRoot, async (lock) => {\n const existing = await loadKnowledgePages(sharedRoot, { pagesDirectory })\n assertNoIdentityConflict(travellers, existing)\n\n const promotedPaths = new Set(travellers.map((traveller) => traveller.entry.page.path))\n const promotedView = originatedPages(\n [\n ...existing.filter((page) => !promotedPaths.has(page.path)),\n ...travellers.map((traveller) => traveller.entry.page),\n ],\n 'shared',\n )\n assertKnowledgeCitationsResolved(\n promotedView,\n travellers.flatMap((traveller) =>\n (traveller.entry.page.cites ?? []).map((persisted: string) =>\n parseKnowledgeCitationReference(persisted),\n ),\n ),\n )\n\n await commitKnowledgeFileMutations({\n root: sharedRoot,\n transactionRoot: lock.transactionRoot,\n purpose: `knowledge-promotion:${runId}`,\n mutations,\n pagesDirectory,\n assertOwned: lock.assertOwned,\n })\n\n const record = buildRecord({\n runId,\n actor,\n reason,\n travellers,\n createdAt: (options.now ?? (() => new Date()))().toISOString(),\n })\n await writeJsonDurableWithinRoot(\n sharedRoot,\n `${KNOWLEDGE_PROMOTIONS_DIRECTORY}/${record.recordDigest}.json`,\n record,\n )\n return record\n })\n}\n\n/** Read one promotion record written by `promoteRunScopedPages`. */\nexport async function loadKnowledgePromotionRecord(\n sharedRoot: string,\n recordDigest: Sha256Digest,\n): Promise<KnowledgePromotionRecord | null> {\n try {\n const snapshot = await readRegularFileWithinRoot(\n sharedRoot,\n `${KNOWLEDGE_PROMOTIONS_DIRECTORY}/${recordDigest}.json`,\n )\n return JSON.parse(snapshot.bytes.toString('utf8')) as KnowledgePromotionRecord\n } catch (error) {\n if (isMissingFile(error)) return null\n throw error\n }\n}\n\ninterface Traveller {\n readonly entry: OriginatedPage\n requested: boolean\n}\n\n/**\n * The requested pages plus the closure of the run-local pages they cite.\n *\n * A citation into the shared store needs no carrying, and an unresolved\n * citation is left to the target-side check, which reports every one of them\n * together rather than failing on the first.\n */\nfunction collectTravellers(\n chain: readonly OriginatedPage[],\n pageIds: readonly KnowledgeId[],\n): Traveller[] {\n const byId = new Map<KnowledgeId, Traveller>()\n const queue: Array<{ entry: OriginatedPage; requested: boolean }> = []\n\n for (const pageId of pageIds) {\n const authored = chain.filter((entry) => entry.origin === 'here' && entry.page.id === pageId)\n if (authored.length === 0) {\n throw new KnowledgePromotionError(\n 'unknown-page',\n `promotion page \"${pageId}\" was not authored by this run`,\n )\n }\n if (authored.length > 1) {\n throw new KnowledgePromotionError(\n 'ambiguous-support',\n `promotion page \"${pageId}\" names ${authored.length} pages in this run`,\n )\n }\n queue.push({ entry: authored[0]!, requested: true })\n }\n\n while (queue.length > 0) {\n const next = queue.shift()!\n const seen = byId.get(next.entry.page.id)\n if (seen) {\n if (next.requested) seen.requested = true\n if (seen.entry.page.path !== next.entry.page.path) {\n throw new KnowledgePromotionError(\n 'ambiguous-support',\n `promotion support \"${next.entry.page.id}\" names more than one visible page`,\n )\n }\n continue\n }\n byId.set(next.entry.page.id, { entry: next.entry, requested: next.requested })\n for (const persisted of next.entry.page.cites ?? []) {\n const resolution = resolveKnowledgeCitation(chain, parseKnowledgeCitationReference(persisted))\n const target = resolution.resolved\n if (target === undefined || target.origin === 'shared') continue\n queue.push({ entry: { page: target.page, origin: target.origin }, requested: false })\n }\n }\n\n return [...byId.values()].sort(\n (left, right) =>\n Number(right.requested) - Number(left.requested) ||\n left.entry.page.path.localeCompare(right.entry.page.path),\n )\n}\n\nfunction assertNoIdentityConflict(\n travellers: readonly Traveller[],\n existing: readonly KnowledgePage[],\n): void {\n for (const traveller of travellers) {\n const page = traveller.entry.page\n const idClash = existing.find((other) => other.id === page.id && other.path !== page.path)\n if (idClash) {\n throw new KnowledgePromotionError(\n 'id-conflict',\n `shared page \"${idClash.path}\" already holds id \"${page.id}\"; promoting \"${page.path}\" would create two`,\n )\n }\n const pathClash = existing.find((other) => other.path === page.path && other.id !== page.id)\n if (pathClash) {\n throw new KnowledgePromotionError(\n 'path-conflict',\n `shared page \"${page.path}\" holds id \"${pathClash.id}\", not \"${page.id}\"`,\n )\n }\n }\n}\n\n/**\n * The page as its own store holds it. A promoted page must be the same bytes\n * in both scopes, so the record's digest describes what a reader will load.\n */\nasync function readPageBytes(\n stores: RunScopedStores,\n runId: string,\n entry: OriginatedPage,\n pagesDirectory: string,\n): Promise<string> {\n const sourceRunId = sourceRunOf(entry.origin, runId)\n const snapshot = await readRegularFileWithinRoot(stores.storePath(sourceRunId), entry.page.path)\n const content = snapshot.bytes.toString('utf8')\n const page = knowledgePageFromMarkdown(entry.page.path, content, pagesDirectory)\n if (knowledgePageDigest(page) !== knowledgePageDigest(entry.page)) {\n throw new KnowledgePromotionError(\n 'path-conflict',\n `source page \"${entry.page.path}\" in run \"${sourceRunId}\" changed after the promotion snapshot`,\n )\n }\n return content\n}\n\nfunction sourceRunOf(origin: PageOrigin, runId: string): string {\n if (origin === 'here') return runId\n if (origin.startsWith('inherited:')) return origin.slice('inherited:'.length)\n throw new Error(`promotion cannot read the bytes of a ${origin} page`)\n}\n\nfunction buildRecord(input: {\n runId: string\n actor: string\n reason: string\n travellers: readonly Traveller[]\n createdAt: string\n}): KnowledgePromotionRecord {\n const entries: KnowledgePromotionEntry[] = input.travellers.map((traveller) =>\n Object.freeze({\n pageId: traveller.entry.page.id,\n path: traveller.entry.page.path,\n sourceOrigin: traveller.entry.origin,\n pageDigest: knowledgePageDigest(traveller.entry.page),\n requested: traveller.requested,\n }),\n )\n const material = {\n schemaVersion: KNOWLEDGE_PROMOTION_SCHEMA_VERSION,\n kind: 'knowledge-promotion' as const,\n digestAlgorithm: KNOWLEDGE_PROMOTION_DIGEST_ALGORITHM,\n createdAt: input.createdAt,\n runId: input.runId,\n actor: input.actor,\n reason: input.reason,\n entries,\n }\n return Object.freeze({ ...material, recordDigest: canonicalCandidateDigest(material) })\n}\n\nfunction nonEmpty(value: string, label: string): string {\n if (typeof value !== 'string' || value.trim().length === 0) {\n throw new TypeError(`${label} must be a non-empty string`)\n }\n return value.trim()\n}\n","/**\n * Bridge from `AnalystFinding` (agent-eval) to knowledge proposals.\n *\n * Closes the failure → wiki side of the recursive-self-improvement\n * loop: a knowledge-gap or knowledge-poisoning finding produced by an\n * analyst becomes a concrete proposal an operator (or auto-merge bot)\n * can review and apply. The bridge is intentionally lossless on the\n * fail-loud side — a finding the parser can't classify returns a\n * `KnowledgeProposalParseError` rather than a silent skip, so the\n * loop never accepts an underspecified edit.\n *\n * Subject grammar this bridge understands (analyst-side convention,\n * stamped in the kind prompts):\n *\n * agent-knowledge:wiki:<page-slug> create / update page\n * agent-knowledge:wiki:<page-slug>#<heading> insert section under page\n * agent-knowledge:claim:<topic> draft claim row\n * agent-knowledge:raw:<source-id> lift raw → curated\n * agent-knowledge:stale:<page-slug> mark page superseded\n *\n * Anything else (websearch:outdated:*, tool-doc:*, system-prompt:*,\n * memory:*) is NOT a knowledge-base concern and returns `null` so the\n * loop's improvement-applier handles it.\n */\n\nimport type { AnalystFinding, AnalystSeverity } from '@tangle-network/agent-eval'\nimport type { ClaimRef, KnowledgeClaim, KnowledgeWriteBlock } from './types'\n\nexport interface KnowledgeProposal {\n /**\n * Stable id derived from the finding so cross-run diffs share an\n * identity. Re-proposing the same finding produces the same id.\n */\n id: string\n /** The finding that generated this proposal — useful for audit + revert. */\n sourceFindingId: string\n /** What the proposal does. */\n kind:\n | 'create-page'\n | 'update-page'\n | 'append-section'\n | 'create-claim'\n | 'lift-raw'\n | 'mark-stale'\n /** Locus on disk (page slug or claim topic). */\n locus: string\n /**\n * Page write blocks the standard `applyKnowledgeWriteBlocks` consumer\n * accepts. Empty for proposals that don't change page text (e.g.\n * `create-claim` produces a `claim` field instead).\n */\n writeBlocks: KnowledgeWriteBlock[]\n /**\n * Granular claim draft for proposals whose unit-of-change is a claim\n * row rather than a whole page. `status: 'draft'` until reviewed.\n */\n claim?: KnowledgeClaim\n /** Per-proposal metadata: severity, confidence, source span. */\n metadata: {\n severity: AnalystSeverity\n confidence: number\n evidence_uri?: string\n analyst_id: string\n }\n}\n\nexport class KnowledgeProposalParseError extends Error {\n constructor(\n public readonly findingId: string,\n public readonly subject: string,\n message: string,\n ) {\n super(`proposeFromFinding(${findingId}, subject=${subject}): ${message}`)\n this.name = 'KnowledgeProposalParseError'\n }\n}\n\n/**\n * Convert one `AnalystFinding` into a knowledge proposal. Returns\n * `null` when the finding's locus isn't a knowledge-base concern\n * (`websearch:outdated:*`, `tool-doc:*`, `system-prompt:*`,\n * `memory:*`, missing subject). Throws when the locus IS a\n * knowledge-base concern but is malformed — that's a bug in the\n * analyst prompt and should fail loud.\n *\n * Caller convention: feed the function the analyst's full findings\n * list and filter out the `null`s; the orchestrator passes the\n * remaining proposals to the existing review / apply pipeline.\n */\nexport function proposeFromFinding(finding: AnalystFinding): KnowledgeProposal | null {\n if (!finding.subject) return null\n if (!finding.subject.startsWith('agent-knowledge:')) return null\n\n const rest = finding.subject.slice('agent-knowledge:'.length)\n const [kindPart, ...locusParts] = rest.split(':')\n const locus = locusParts.join(':')\n if (!kindPart || !locus) {\n throw new KnowledgeProposalParseError(\n finding.finding_id,\n finding.subject,\n 'expected `agent-knowledge:<kind>:<locus>` shape',\n )\n }\n\n const baseMeta: KnowledgeProposal['metadata'] = {\n severity: finding.severity,\n confidence: finding.confidence,\n evidence_uri: finding.evidence_refs[0]?.uri,\n analyst_id: finding.analyst_id,\n }\n\n switch (kindPart) {\n case 'wiki':\n return wikiProposal(finding, locus, baseMeta)\n case 'claim':\n return claimProposal(finding, locus, baseMeta)\n case 'raw':\n return liftRawProposal(finding, locus, baseMeta)\n case 'stale':\n return markStaleProposal(finding, locus, baseMeta)\n default:\n throw new KnowledgeProposalParseError(\n finding.finding_id,\n finding.subject,\n `unknown kind \"${kindPart}\" (expected one of: wiki | claim | raw | stale)`,\n )\n }\n}\n\nfunction wikiProposal(\n finding: AnalystFinding,\n locus: string,\n metadata: KnowledgeProposal['metadata'],\n): KnowledgeProposal {\n const hashIdx = locus.indexOf('#')\n const pageSlug = hashIdx >= 0 ? locus.slice(0, hashIdx) : locus\n const heading = hashIdx >= 0 ? locus.slice(hashIdx + 1) : null\n const path = `knowledge/${ensureSlug(pageSlug)}.md`\n\n const body = renderWikiBody(finding, pageSlug, heading)\n return {\n id: `prop-${finding.finding_id}`,\n sourceFindingId: finding.finding_id,\n kind: heading ? 'append-section' : 'create-page',\n locus: pageSlug,\n writeBlocks: [{ path, content: body }],\n metadata,\n }\n}\n\nfunction claimProposal(\n finding: AnalystFinding,\n locus: string,\n metadata: KnowledgeProposal['metadata'],\n): KnowledgeProposal {\n const refs: ClaimRef[] = finding.evidence_refs\n .filter((r) => r.uri)\n .map((r) => ({\n sourceId: `analyst-finding:${finding.finding_id}`,\n anchorId: r.uri,\n quote: r.excerpt,\n }))\n const claim: KnowledgeClaim = {\n id: `claim-${finding.finding_id}`,\n text: finding.recommended_action ?? finding.claim,\n refs,\n confidence: finding.confidence,\n status: 'draft',\n metadata: {\n analyst_id: finding.analyst_id,\n source_finding_id: finding.finding_id,\n topic: locus,\n },\n }\n return {\n id: `prop-${finding.finding_id}`,\n sourceFindingId: finding.finding_id,\n kind: 'create-claim',\n locus,\n writeBlocks: [],\n claim,\n metadata,\n }\n}\n\nfunction liftRawProposal(\n finding: AnalystFinding,\n sourceId: string,\n metadata: KnowledgeProposal['metadata'],\n): KnowledgeProposal {\n const path = `knowledge/${ensureSlug(sourceId)}.md`\n const body = [\n '---',\n `title: ${sourceId}`,\n `source: ${sourceId}`,\n `status: draft`,\n `lifted_from_finding: ${finding.finding_id}`,\n '---',\n '',\n '## Why this page exists',\n '',\n finding.claim,\n '',\n ...(finding.rationale ? ['## Rationale', '', finding.rationale, ''] : []),\n ...(finding.recommended_action\n ? ['## Recommended action', '', finding.recommended_action, '']\n : []),\n ].join('\\n')\n return {\n id: `prop-${finding.finding_id}`,\n sourceFindingId: finding.finding_id,\n kind: 'lift-raw',\n locus: sourceId,\n writeBlocks: [{ path, content: body }],\n metadata,\n }\n}\n\nfunction markStaleProposal(\n finding: AnalystFinding,\n pageSlug: string,\n metadata: KnowledgeProposal['metadata'],\n): KnowledgeProposal {\n const path = `knowledge/${ensureSlug(pageSlug)}.stale.md`\n const body = [\n '---',\n `title: ${pageSlug} (marked stale)`,\n `status: superseded`,\n `superseded_by_finding: ${finding.finding_id}`,\n `confidence: ${finding.confidence}`,\n '---',\n '',\n '## Why marked stale',\n '',\n finding.claim,\n '',\n ...(finding.rationale ? ['## Evidence', '', finding.rationale, ''] : []),\n ...(finding.recommended_action ? ['## Action', '', finding.recommended_action, ''] : []),\n ].join('\\n')\n return {\n id: `prop-${finding.finding_id}`,\n sourceFindingId: finding.finding_id,\n kind: 'mark-stale',\n locus: pageSlug,\n writeBlocks: [{ path, content: body }],\n metadata,\n }\n}\n\n/**\n * Plural convenience: filter + map across an entire findings batch\n * with one call. Parse errors collect into `errors[]`; the loop\n * decides per-error whether to abort or continue.\n */\nexport interface ProposeFromFindingsResult {\n proposals: KnowledgeProposal[]\n skipped: number\n errors: KnowledgeProposalParseError[]\n}\n\nexport function proposeFromFindings(\n findings: ReadonlyArray<AnalystFinding>,\n): ProposeFromFindingsResult {\n const proposals: KnowledgeProposal[] = []\n const errors: KnowledgeProposalParseError[] = []\n let skipped = 0\n for (const f of findings) {\n try {\n const p = proposeFromFinding(f)\n if (p) proposals.push(p)\n else skipped += 1\n } catch (err) {\n if (err instanceof KnowledgeProposalParseError) errors.push(err)\n else throw err\n }\n }\n return { proposals, skipped, errors }\n}\n\nfunction ensureSlug(s: string): string {\n return (\n s\n .toLowerCase()\n .replace(/[^a-z0-9-]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 200) || 'untitled'\n )\n}\n\nfunction renderWikiBody(finding: AnalystFinding, slug: string, heading: string | null): string {\n const title = humanize(slug)\n if (heading) {\n return [\n `## ${heading}`,\n '',\n finding.claim,\n '',\n ...(finding.rationale ? ['### Rationale', '', finding.rationale, ''] : []),\n ...(finding.recommended_action ? ['### Action', '', finding.recommended_action, ''] : []),\n `_Drafted from finding ${finding.finding_id} (confidence ${finding.confidence.toFixed(2)})._`,\n ].join('\\n')\n }\n return [\n '---',\n `title: ${title}`,\n `status: draft`,\n `drafted_from_finding: ${finding.finding_id}`,\n `confidence: ${finding.confidence}`,\n '---',\n '',\n `# ${title}`,\n '',\n finding.claim,\n '',\n ...(finding.rationale ? ['## Rationale', '', finding.rationale, ''] : []),\n ...(finding.recommended_action\n ? ['## Recommended action', '', finding.recommended_action, '']\n : []),\n ].join('\\n')\n}\n\nfunction humanize(slug: string): string {\n return (\n slug\n .split('-')\n .filter(Boolean)\n .map((w) => w[0]?.toUpperCase() + w.slice(1))\n .join(' ') || slug\n )\n}\n","import { canonicalCandidateDigest, type ToolDefinition } from '@tangle-network/agent-interface'\nimport { z } from 'zod'\nimport { sha256 } from './ids'\nimport { SourceRecordSchema } from './schemas'\nimport type { SourceRecord } from './types'\n\n/** The public QMD SDK subset; the host owns installation, indexing, and model selection. */\nexport interface QmdSearchClient {\n searchLex(query: string, options: { collection: string; limit: number }): Promise<unknown>\n searchVector?(query: string, options: { collection: string; limit: number }): Promise<unknown>\n get(path: string, options: { includeBody: true }): Promise<unknown>\n}\n\nexport interface QmdSourceDocument {\n readonly qmdPath: string\n readonly source: SourceRecord\n}\n\nexport interface QmdSearchProviderOptions {\n readonly client: QmdSearchClient\n readonly scopeId: string\n readonly revision: string\n readonly collection: string\n /** Declared by the index owner after a successful update; absent means unknown. */\n readonly indexedAt?: string\n readonly documents: readonly QmdSourceDocument[]\n /** Vector mode is explicit because it invokes the host's embedding model. */\n readonly mode?: 'lexical' | 'vector'\n}\n\nconst indexedDocument = z.object({\n filepath: z.string(),\n collectionName: z.string(),\n body: z.string(),\n})\nconst searchResults = z.array(z.object({ filepath: z.string(), score: z.number().finite() }))\nconst querySchema = z\n .object({\n query: z.string().trim().min(1).max(16_000),\n limit: z.number().int().min(1).max(50).default(5),\n })\n .strict()\nconst readSchema = z\n .object({\n sourceId: z.string().min(1),\n fromLine: z.number().int().min(1).default(1),\n maxLines: z.number().int().min(1).max(200).default(80),\n })\n .strict()\n\n/**\n * A fixed source snapshot, not an authorization decision. The trusted host supplies\n * one authorized corpus; agents cannot select a collection, bank, or arbitrary path.\n * QMD's index is derived: its bytes must agree with the authoritative source hash.\n */\nexport function createQmdSearchProvider(options: QmdSearchProviderOptions) {\n const { client } = options\n const scopeId = z.string().trim().min(1).parse(options.scopeId)\n const revision = z.string().trim().min(1).parse(options.revision)\n const collection = z\n .string()\n .regex(/^[a-zA-Z0-9_-]+$/)\n .parse(options.collection)\n const mode = z.enum(['lexical', 'vector']).parse(options.mode ?? 'lexical')\n const indexedAt =\n options.indexedAt === undefined\n ? null\n : z.iso.datetime({ offset: true }).parse(options.indexedAt)\n if (mode === 'vector' && !client.searchVector) throw new Error('QMD vector search is unavailable')\n const byId = new Map<string, QmdSourceDocument>()\n const byPath = new Map<string, QmdSourceDocument>()\n for (const entry of options.documents) {\n const source = SourceRecordSchema.parse(structuredClone(entry.source))\n if (!/^[a-f0-9]{64}$/.test(source.contentHash)) {\n throw new TypeError('QMD sources require an exact SHA-256 contentHash')\n }\n if (source.text !== undefined && sha256(source.text) !== source.contentHash) {\n throw new Error('QMD source text does not match its contentHash')\n }\n const prefix = `qmd://${collection}/`\n const path = entry.qmdPath.slice(prefix.length)\n if (\n !entry.qmdPath.startsWith(prefix) ||\n !path ||\n path\n .split('/')\n .some(\n (part) =>\n !part ||\n part === '.' ||\n part === '..' ||\n /[\\\\?#%]/.test(part) ||\n [...part].some((char) => char.charCodeAt(0) < 32),\n )\n )\n throw new TypeError('QMD document path must be within the bound collection')\n if (byId.has(source.id) || byPath.has(entry.qmdPath)) {\n throw new Error('QMD snapshot contains duplicate source ids or paths')\n }\n const document = { qmdPath: entry.qmdPath, source }\n byId.set(source.id, document)\n byPath.set(entry.qmdPath, document)\n }\n const snapshotDigest = canonicalCandidateDigest({\n scopeId,\n revision,\n collection,\n documents: [...byPath.values()]\n .map(({ qmdPath, source }) => ({\n qmdPath,\n id: source.id,\n uri: source.uri,\n contentHash: source.contentHash,\n }))\n .sort((a, b) => (a.qmdPath < b.qmdPath ? -1 : a.qmdPath > b.qmdPath ? 1 : 0)),\n })\n const identity = Object.freeze({\n scopeId,\n revision,\n snapshotDigest,\n indexedAt,\n mode,\n documentCount: byId.size,\n })\n const verifiedRead = async (document: QmdSourceDocument): Promise<QmdSourceDocument> => {\n const parsed = indexedDocument.safeParse(\n await client.get(document.qmdPath, { includeBody: true }),\n )\n if (!parsed.success)\n throw new Error('QMD snapshot document is unavailable or malformed; rebuild the scoped index')\n const indexed = parsed.data\n if (indexed.filepath !== document.qmdPath || indexed.collectionName !== collection) {\n throw new Error('QMD returned a document outside the bound snapshot')\n }\n if (sha256(indexed.body) !== document.source.contentHash) {\n throw new Error('QMD index is stale for this source revision; rebuild the scoped index')\n }\n return {\n qmdPath: document.qmdPath,\n source: { ...structuredClone(document.source), text: indexed.body },\n }\n }\n return {\n ...identity,\n /** Call once at admission; ordinary reads still verify their returned bytes. */\n async verifySnapshot() {\n for (const document of byPath.values()) await verifiedRead(document)\n return {\n ...identity,\n verifiedDocumentCount: byPath.size,\n checkedAt: new Date().toISOString(),\n }\n },\n async search(query: string, searchOptions: { limit?: number } = {}) {\n const request = querySchema.parse({ query, ...searchOptions })\n const search = mode === 'vector' ? client.searchVector! : client.searchLex\n const results = searchResults.parse(\n await search.call(client, request.query, { collection, limit: request.limit }),\n )\n const seen = new Set<string>()\n // Validate the complete returned set before reading any content.\n for (const hit of results) {\n if (!byPath.has(hit.filepath))\n throw new Error('QMD returned a search result outside the bound snapshot')\n if (seen.has(hit.filepath)) throw new Error('QMD returned duplicate search results')\n seen.add(hit.filepath)\n }\n const hits = await Promise.all(\n results.slice(0, request.limit).map(async (hit) => ({\n ...(await verifiedRead(byPath.get(hit.filepath)!)),\n score: hit.score,\n })),\n )\n return { ...identity, hits }\n },\n async read(sourceId: string) {\n const document = byId.get(sourceId)\n if (!document) throw new Error('Source is not in the bound QMD snapshot')\n return { ...identity, document: await verifiedRead(document) }\n },\n }\n}\n\nexport type QmdSearchProvider = ReturnType<typeof createQmdSearchProvider>\n\n/** Same source-checked functions used by a human reader and exact-profile tool grants. */\nexport function createQmdKnowledgeTools(options: {\n readonly provider: QmdSearchProvider\n readonly namePrefix?: string\n}): ToolDefinition[] {\n const prefix = options.namePrefix ?? ''\n if (!/^[a-zA-Z0-9_]*$/.test(prefix)) throw new TypeError('Invalid QMD tool name prefix')\n return [\n {\n name: `${prefix}qmd_search`,\n description:\n 'Search this bound source snapshot. Results carry original source ids, URIs and hashes; use qmd_read for full source lines.',\n inputSchema: querySchema,\n inputSchemaJson: z.toJSONSchema(querySchema) as Record<string, unknown>,\n async handler(input: unknown) {\n const request = querySchema.parse(input)\n const result = await options.provider.search(request.query, { limit: request.limit })\n return {\n ...result,\n hits: result.hits.map(({ source, ...hit }) => {\n const { text, ...reference } = source\n return {\n ...hit,\n source: reference,\n excerpt: text?.slice(0, 2_000),\n excerptTruncated: (text?.length ?? 0) > 2_000,\n }\n }),\n }\n },\n },\n {\n name: `${prefix}qmd_read`,\n description:\n 'Read exact source lines by a source id returned from this snapshot. Other play sources are unavailable.',\n inputSchema: readSchema,\n inputSchemaJson: z.toJSONSchema(readSchema) as Record<string, unknown>,\n async handler(input: unknown) {\n const request = readSchema.parse(input)\n const result = await options.provider.read(request.sourceId)\n const { text = '', ...source } = result.document.source\n const lines = text.split('\\n')\n const selected = lines.slice(request.fromLine - 1, request.fromLine - 1 + request.maxLines)\n const rendered = selected\n .map((line, index) => `${request.fromLine + index}: ${line}`)\n .join('\\n')\n return {\n ...result,\n document: {\n ...result.document,\n source,\n text: rendered.slice(0, 32_000),\n fromLine: request.fromLine,\n totalLines: lines.length,\n truncated:\n rendered.length > 32_000 || request.fromLine - 1 + selected.length < lines.length,\n },\n }\n },\n },\n ]\n}\n","import type {\n BuildEvalKnowledgeBundleOptions,\n EvalKnowledgeBundleBuildResult,\n KnowledgeReadinessSpec,\n} from './eval-readiness'\nimport { buildKnowledgeIndex } from './indexer'\nimport type { KnowledgeBaseQualityOptions, KnowledgeBaseQualityReport } from './rag-eval'\nimport { assessKnowledgeIndex } from './readiness-helpers'\nimport type { KnowledgeIndex } from './types'\nimport type { ValidateKnowledgeOptions, ValidateKnowledgeResult } from './validate'\n\nexport interface EvaluateKnowledgeBaseReadinessOptions {\n root: string\n goal: string\n readinessSpecs?: readonly KnowledgeReadinessSpec[]\n readinessTaskId?: string\n readiness?: Omit<BuildEvalKnowledgeBundleOptions, 'taskId' | 'index' | 'specs'>\n strict?: ValidateKnowledgeOptions['strict']\n kbQuality?: KnowledgeBaseQualityOptions\n}\n\nexport interface KnowledgeBaseReadinessEvaluation {\n ready: boolean\n summary: string\n index: KnowledgeIndex\n validation: ValidateKnowledgeResult\n readiness?: EvalKnowledgeBundleBuildResult\n kbQuality: KnowledgeBaseQualityReport\n dimensions: {\n validation: number\n kb_quality: number\n blocking_readiness: number\n }\n}\n\nexport async function evaluateKnowledgeBaseReadiness(\n options: EvaluateKnowledgeBaseReadinessOptions,\n): Promise<KnowledgeBaseReadinessEvaluation> {\n const index = await buildKnowledgeIndex(options.root)\n const { validation, readiness, kbQuality } = assessKnowledgeIndex(options, index)\n const blockingMissing = readiness?.report.blockingMissingRequirements.length ?? 0\n const blockingTotal =\n options.readinessSpecs?.filter((spec) => spec.importance === 'blocking').length ?? 0\n const blockingReadiness =\n blockingTotal === 0 ? 1 : Math.max(0, blockingTotal - blockingMissing) / blockingTotal\n const ready = validation.ok && kbQuality.ok && blockingMissing === 0\n const failures = [\n validation.ok ? undefined : `${validation.findings.length} validation finding(s)`,\n kbQuality.ok ? undefined : `${kbQuality.findings.length} KB quality finding(s)`,\n blockingMissing === 0\n ? undefined\n : `${blockingMissing}/${blockingTotal} blocking readiness requirement(s) missing`,\n ].filter((failure): failure is string => Boolean(failure))\n\n return {\n ready,\n summary: ready ? 'knowledge base passed readiness checks' : failures.join('; '),\n index,\n validation,\n readiness,\n kbQuality,\n dimensions: {\n validation: validation.ok ? 1 : 0,\n kb_quality: kbQuality.ok ? 1 : 0,\n blocking_readiness: blockingReadiness,\n },\n }\n}\n","import {\n type DatasetScenario,\n evaluateReleaseConfidence,\n type HeldOutGateDecision,\n type ReleaseConfidenceScorecard,\n type ReleaseTraceEvidence,\n type RunRecord,\n validateRunRecord,\n} from '@tangle-network/agent-eval'\nimport { stableId } from './ids'\nimport type { KnowledgeRelease } from './types'\n\nexport interface KnowledgeReleaseReport {\n release: KnowledgeRelease\n scorecard: ReleaseConfidenceScorecard\n candidateRuns: RunRecord[]\n baselineRuns: RunRecord[]\n}\n\n/**\n * Build a knowledge release report from candidate and baseline run records,\n * optional trace evidence, and an optional decision record.\n */\nexport interface KnowledgeReleaseInput {\n candidateId: string\n baselineId?: string\n candidateRuns: RunRecord[]\n baselineRuns?: RunRecord[]\n traces?: ReleaseTraceEvidence[]\n gateDecision?: HeldOutGateDecision | null\n /** Scenario corpus used to prove train and holdout split coverage. */\n scenarios?: readonly DatasetScenario[]\n /**\n * Require both a holdout scenario and a holdout run.\n * Provide `scenarios` with at least one `split: 'holdout'` item when true.\n */\n hasHoldout?: boolean\n /** Candidate is the search-best variant — a promotion precondition. Default true. */\n promotedIsBest?: boolean\n createdAt?: string\n minScore?: number\n}\n\nexport function knowledgeReleaseReport(input: KnowledgeReleaseInput): KnowledgeReleaseReport {\n const baselineRuns = input.baselineRuns ?? []\n const runRecords = [...input.candidateRuns, ...baselineRuns].map(validateRunRecord)\n const scorecard = evaluateReleaseConfidence({\n target: 'agent-knowledge-base',\n candidateId: input.candidateId,\n baselineId: input.baselineId ?? 'baseline',\n traces: input.traces ?? [],\n runs: runRecords,\n scenarios: input.scenarios,\n gateDecision: input.gateDecision ?? null,\n thresholds: {\n requireCorpus: false,\n // This report has run records but no scenario corpus, so it cannot require\n // a positive scenario count.\n minScenarioCount: 0,\n requireHoldout: input.hasHoldout ?? false,\n minHoldoutRuns: input.hasHoldout ? 1 : 0,\n minSearchRuns: 1,\n minMeanScore: input.minScore ?? 0.7,\n },\n })\n const release: KnowledgeRelease = {\n id: stableId('krel', `${input.candidateId}:${input.createdAt ?? new Date().toISOString()}`),\n candidateId: input.candidateId,\n createdAt: input.createdAt ?? new Date().toISOString(),\n promoted: scorecard.status !== 'fail' && (input.promotedIsBest ?? true),\n scorecard,\n runRecordIds: runRecords.map((record) => record.runId),\n }\n return { release, scorecard, candidateRuns: input.candidateRuns, baselineRuns }\n}\n"],"mappings":"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"}
|