@leostera/evalkit 0.3.0 → 0.5.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/CHANGELOG.md +93 -0
- package/README.md +8 -7
- package/dist/cli.mjs +525 -72
- package/dist/cli.mjs.map +1 -1
- package/dist/dashboard/assets/index-D9NtA46z.css +2 -0
- package/dist/dashboard/assets/{index-CVd_Np_w.js → index-DrBwLKJD.js} +1 -1
- package/dist/dashboard/index.html +2 -2
- package/dist/files-C-U0-PWW.mjs +26 -0
- package/dist/files-C-U0-PWW.mjs.map +1 -0
- package/dist/index-db-HdZXelOS.d.mts +142 -0
- package/dist/index-db-HdZXelOS.d.mts.map +1 -0
- package/dist/index-db-vbqEGFaU.mjs +548 -0
- package/dist/index-db-vbqEGFaU.mjs.map +1 -0
- package/dist/{index-M5eRlMfd.d.mts → index-lOw0fmak.d.mts} +96 -9
- package/dist/index-lOw0fmak.d.mts.map +1 -0
- package/dist/index.d.mts +2 -2
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/dist/runner.d.mts +21 -3
- package/dist/runner.d.mts.map +1 -1
- package/dist/runner.mjs +1 -1
- package/dist/share-worker.d.mts +51 -0
- package/dist/share-worker.d.mts.map +1 -0
- package/dist/share-worker.mjs +73 -0
- package/dist/share-worker.mjs.map +1 -0
- package/dist/share.d.mts +116 -0
- package/dist/share.d.mts.map +1 -0
- package/dist/share.mjs +4 -0
- package/dist/{src-DrwwgaPn.mjs → src-ButXPY8P.mjs} +20 -5
- package/dist/src-ButXPY8P.mjs.map +1 -0
- package/dist/{src-DluldGKn.mjs → src-DoPs9Yug.mjs} +11 -7
- package/dist/src-DoPs9Yug.mjs.map +1 -0
- package/dist/src-DzZueFn3.mjs +98 -0
- package/dist/src-DzZueFn3.mjs.map +1 -0
- package/package.json +10 -1
- package/dist/dashboard/assets/index-CMr4aulR.css +0 -2
- package/dist/index-M5eRlMfd.d.mts.map +0 -1
- package/dist/src-DluldGKn.mjs.map +0 -1
- package/dist/src-DrwwgaPn.mjs.map +0 -1
|
@@ -202,18 +202,33 @@ const MatrixCellSchema = Schema.Struct({
|
|
|
202
202
|
id: Schema.String,
|
|
203
203
|
cellKey: Schema.String
|
|
204
204
|
});
|
|
205
|
+
const RunSourceSchema = Schema.Struct({
|
|
206
|
+
repo: Schema.String,
|
|
207
|
+
project: Schema.String,
|
|
208
|
+
commit: Schema.String,
|
|
209
|
+
ref: Schema.optional(Schema.String),
|
|
210
|
+
committedAt: Schema.optional(Schema.String),
|
|
211
|
+
dirty: Schema.Boolean,
|
|
212
|
+
ci: Schema.optional(Schema.Struct({
|
|
213
|
+
provider: Schema.String,
|
|
214
|
+
pipeline: Schema.optional(Schema.String),
|
|
215
|
+
job: Schema.optional(Schema.String),
|
|
216
|
+
url: Schema.optional(Schema.String)
|
|
217
|
+
}))
|
|
218
|
+
});
|
|
205
219
|
const RunMetadataSchema = Schema.Struct({
|
|
206
|
-
schemaVersion: Schema.Literal(2, 3),
|
|
220
|
+
schemaVersion: Schema.Literal(2, 3, 4),
|
|
207
221
|
runUri: resourceUriSchema("run"),
|
|
208
222
|
evalId: Schema.String,
|
|
209
223
|
suiteId: Schema.optional(Schema.String),
|
|
210
224
|
parameters: Schema.optional(ParametersSchema),
|
|
211
225
|
matrix: Schema.optional(MatrixCellSchema),
|
|
212
226
|
aut: Schema.optional(AutIdentitySchema),
|
|
213
|
-
startedAt: Schema.String
|
|
227
|
+
startedAt: Schema.String,
|
|
228
|
+
source: Schema.optional(RunSourceSchema)
|
|
214
229
|
});
|
|
215
230
|
const TrialMetadataSchema = Schema.Struct({
|
|
216
|
-
schemaVersion: Schema.Literal(2, 3),
|
|
231
|
+
schemaVersion: Schema.Literal(2, 3, 4),
|
|
217
232
|
runUri: resourceUriSchema("run"),
|
|
218
233
|
trialUri: resourceUriSchema("trial"),
|
|
219
234
|
trialIndex: Schema.Number,
|
|
@@ -671,6 +686,6 @@ function recordError(error) {
|
|
|
671
686
|
};
|
|
672
687
|
}
|
|
673
688
|
//#endregion
|
|
674
|
-
export {
|
|
689
|
+
export { TrajectoryEventSchema as A, UuidSchema as B, RecordedErrorSchema as C, RunStatusSchema as D, RunSourceSchema as E, UsageSchema as F, resourceUuid as G, parseResourceUri as H, defineEvalMatrix as I, canonicalParameters as L, TrialMetadataSchema as M, TrialScoringSchema as N, RunSummarySchema as O, TrialSummarySchema as P, ResourceKindSchema as R, JudgeRunInfoSchema as S, RunMetadataSchema as T, resourceUri as U, authorId as V, resourceUriSchema as W, ApiErrorSchema as _, defineSuite as a, CheckpointResultSchema as b, expectToolCall as c, judge as d, predicate as f, parseTrajectoryJsonl as g, user as h, defineEval as i, TrialManifestSchema as j, ScoreResultSchema as k, file as l, registerEvals as m, authoringId as n, directory as o, recordError as p, defineAgent as r, dynamic as s, agent as t, inlineFile as u, ArtifactEntrySchema as v, RunManifestSchema as w, JsonValueSchema as x, AutIdentitySchema as y, ResourceUriSchema as z };
|
|
675
690
|
|
|
676
|
-
//# sourceMappingURL=src-
|
|
691
|
+
//# sourceMappingURL=src-ButXPY8P.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"src-ButXPY8P.mjs","names":[],"sources":["../../core/src/identity.ts","../../core/src/canonical-json.ts","../../core/src/matrix.ts","../../core/src/schema.ts","../../core/src/trajectory.ts","../../core/src/index.ts"],"sourcesContent":["import * as Schema from 'effect/Schema';\n\nexport const ResourceKindSchema = Schema.Literal('run', 'trial', 'artifact');\nexport type ResourceKind = typeof ResourceKindSchema.Type;\n\n/** Human-authored project-local identifier; never a generated resource URI. */\nexport function authorId(value: string): string {\n if (!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(value))\n throw new Error(`ID must be lowercase kebab-case: ${value}`);\n return value;\n}\n\n/** RFC 4122 textual UUID. EvalKit accepts v4/v7 and other valid UUID versions. */\nexport const UuidSchema = Schema.String.pipe(\n Schema.pattern(\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,\n ),\n);\nexport type Uuid = typeof UuidSchema.Type;\n\nexport type ResourceUri<TKind extends ResourceKind = ResourceKind> =\n `evalkit:${TKind}:${string}`;\n\nexport const ResourceUriSchema = Schema.String.pipe(\n Schema.pattern(\n /^evalkit:(run|trial|artifact):[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,\n ),\n);\n\nexport function resourceUriSchema<TKind extends ResourceKind>(kind: TKind) {\n return Schema.String.pipe(\n Schema.pattern(\n new RegExp(\n `^evalkit:${kind}:[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$`,\n 'i',\n ),\n ),\n );\n}\n\nexport function resourceUri<TKind extends ResourceKind>(\n kind: TKind,\n uuid: Uuid,\n): ResourceUri<TKind> {\n return `evalkit:${kind}:${uuid}`;\n}\n\nexport function parseResourceUri<TKind extends ResourceKind>(\n value: string,\n expectedKind?: TKind,\n): { kind: TKind; uuid: Uuid; uri: ResourceUri<TKind> } {\n const match = /^evalkit:(run|trial|artifact):(.+)$/.exec(value);\n if (!match) throw new Error(`Invalid EvalKit resource URI: ${value}`);\n const kind = match[1] as TKind;\n if (expectedKind && kind !== expectedKind)\n throw new Error(\n `Expected an EvalKit ${expectedKind} URI; received ${value}`,\n );\n const uuid = Schema.decodeUnknownSync(UuidSchema)(match[2]) as Uuid;\n return { kind, uuid, uri: resourceUri(kind, uuid) };\n}\n\nexport function resourceUuid(value: string, expectedKind?: ResourceKind): Uuid {\n return parseResourceUri(value, expectedKind).uuid;\n}\n","// Dependency-free so browser bundles (the dashboard) can import it without\n// pulling in the Effect schemas behind the package root.\nimport type { JsonValue } from './index.js';\n\n/** Canonical JSON: keys sorted recursively, array order preserved. Rejects non-JSON inputs. */\nexport function canonicalParameters(value: JsonValue): string {\n if (value === null || typeof value === 'string' || typeof value === 'boolean')\n return JSON.stringify(value);\n if (typeof value === 'number' && Number.isFinite(value))\n return JSON.stringify(value);\n if (Array.isArray(value))\n return `[${value.map(canonicalParameters).join(',')}]`;\n if (\n typeof value === 'object' &&\n Object.getPrototypeOf(value) === Object.prototype\n ) {\n return `{${Object.keys(value)\n .sort()\n .map(\n (key) => `${JSON.stringify(key)}:${canonicalParameters(value[key]!)}`,\n )\n .join(',')}}`;\n }\n throw new Error('Matrix parameters must be finite JSON values');\n}\n","import {\n authoringId,\n type EvalDefinition,\n type JsonObject,\n type JsonValue,\n} from './index.js';\nimport { canonicalParameters } from './canonical-json.js';\n\nexport { canonicalParameters };\n\nexport type MatrixSelection = {\n /** Base eval IDs. Unknown values fail before dispatch. */\n evals?: readonly string[];\n /** Select existing dimension values, rather than overwriting every cell with the same value. */\n parameters?: Readonly<Record<string, readonly JsonValue[]>>;\n /** Overrides for non-dimension execution settings (e.g. maxTokens). */\n overrides?: JsonObject;\n};\nexport type EvalMatrixCell = {\n matrixId: string;\n /** Stable canonical key including matrix, base eval and effective parameters. */\n key: string;\n eval: EvalDefinition;\n parameters: JsonObject;\n};\nexport type EvalMatrixDefinition = {\n id: string;\n name?: string;\n evals: readonly EvalDefinition[];\n parameters: Readonly<Record<string, readonly JsonValue[]>>;\n defaults?: JsonObject;\n /** Complete correlated assignments, crossed with independent parameters. */\n cases?: readonly JsonObject[];\n /** Partial patterns over declared dimensions; matching cells are never run. */\n exclude?: readonly JsonObject[];\n};\nexport type EvalMatrix = EvalMatrixDefinition & {\n kind: 'matrix';\n count(selection?: MatrixSelection): number;\n cells(selection?: MatrixSelection): IterableIterator<EvalMatrixCell>;\n};\n\nconst COUNT_BUDGET = 100_000;\nconst equal = (a: JsonValue, b: JsonValue) =>\n canonicalParameters(a) === canonicalParameters(b);\nconst matches = (pattern: JsonObject, values: JsonObject) =>\n Object.entries(pattern).every(\n ([key, value]) => Object.hasOwn(values, key) && equal(values[key]!, value),\n );\n\nexport function defineEvalMatrix<const T extends EvalMatrixDefinition>(\n definition: T,\n): EvalMatrix & T {\n authoringId(definition);\n const identities = new Set<string>();\n for (const evaluation of definition.evals) {\n const id = authoringId(evaluation);\n if (identities.has(id)) throw new Error(`Duplicate matrix eval: ${id}`);\n identities.add(id);\n }\n const axes = Object.entries(definition.parameters).sort(([a], [b]) =>\n a.localeCompare(b),\n );\n for (const [axis, choices] of axes) {\n if (!axis || !choices.length)\n throw new Error(`Matrix axis ${axis} must have at least one value`);\n const keys = choices.map(canonicalParameters);\n if (new Set(keys).size !== keys.length)\n throw new Error(`Duplicate values for matrix axis: ${axis}`);\n }\n canonicalParameters(definition.defaults ?? {});\n if (definition.cases && !definition.cases.length)\n throw new Error('Matrix cases must have at least one assignment');\n const cases = definition.cases ?? [{}];\n const caseKeys = Object.keys(cases[0]!).sort();\n const caseSignatures = new Set<string>();\n for (const assignment of cases) {\n canonicalParameters(assignment);\n if (Object.keys(assignment).sort().join('\\0') !== caseKeys.join('\\0'))\n throw new Error('Matrix cases must have the same dimensions');\n for (const key of caseKeys) {\n if (\n Object.hasOwn(definition.parameters, key) ||\n Object.hasOwn(definition.defaults ?? {}, key)\n )\n throw new Error(\n `Matrix case dimension conflicts with axis or default: ${key}`,\n );\n }\n const signature = canonicalParameters(assignment);\n if (caseSignatures.has(signature)) throw new Error('Duplicate matrix case');\n caseSignatures.add(signature);\n }\n const declared = new Set([...caseKeys, ...axes.map(([key]) => key)]);\n const exclusions = definition.exclude ?? [];\n for (const [index, pattern] of exclusions.entries()) {\n canonicalParameters(pattern);\n if (!Object.keys(pattern).length)\n throw new Error(`Matrix exclude[${index}] must specify a dimension`);\n for (const key of Object.keys(pattern))\n if (!declared.has(key))\n throw new Error(`Unknown matrix exclude dimension: ${key}`);\n if (\n !cases.some((assignment) =>\n Object.entries(pattern).every(\n ([key, value]) =>\n !Object.hasOwn(assignment, key) || equal(assignment[key]!, value),\n ),\n ) ||\n !axes.every(\n ([key, choices]) =>\n !Object.hasOwn(pattern, key) ||\n choices.some((choice) => equal(choice, pattern[key]!)),\n )\n )\n throw new Error(`Matrix exclude[${index}] matches no declared cell`);\n }\n const caseChoices = new Map(\n caseKeys.map((key) => [key, cases.map((assignment) => assignment[key]!)]),\n );\n\n function select(selection: MatrixSelection = {}) {\n for (const key of Object.keys(selection.parameters ?? {})) {\n if (!declared.has(key)) throw new Error(`Unknown matrix axis: ${key}`);\n }\n for (const key of Object.keys(selection.overrides ?? {})) {\n if (declared.has(key))\n throw new Error(`Select axis ${key}; do not override it`);\n }\n canonicalParameters(selection.overrides ?? {});\n for (const name of selection.evals ?? []) {\n if (!definition.evals.some((e) => e.id === name))\n throw new Error(`Unknown matrix eval: ${name}`);\n }\n const evals = definition.evals.filter(\n (e) => !selection.evals || selection.evals.includes(e.id),\n );\n const selected = new Map<string, Set<string>>();\n for (const [key, values] of Object.entries(selection.parameters ?? {})) {\n const available = definition.parameters[key] ?? caseChoices.get(key)!;\n const keys = new Set(values.map(canonicalParameters));\n for (const value of keys)\n if (!available.some((choice) => canonicalParameters(choice) === value))\n throw new Error(`Unknown ${key} value: ${value}`);\n selected.set(key, keys);\n }\n const filteredCases = cases.filter((assignment) =>\n caseKeys.every(\n (key) =>\n !selected.has(key) ||\n selected.get(key)!.has(canonicalParameters(assignment[key]!)),\n ),\n );\n const selectedAxes = axes.map(\n ([axis, choices]) =>\n [\n axis,\n choices.filter(\n (choice) =>\n !selected.has(axis) ||\n selected.get(axis)!.has(canonicalParameters(choice)),\n ),\n ] as const,\n );\n return {\n evals,\n cases: filteredCases,\n axes: selectedAxes,\n defaults: { ...definition.defaults, ...selection.overrides },\n };\n }\n\n /** Inclusion/exclusion counts sparse forbidden patterns without expanding the product. */\n function countCase(\n assignment: JsonObject,\n selectedAxes: readonly (readonly [string, readonly JsonValue[]])[],\n budget: { remaining: number },\n ): number {\n const patterns = exclusions\n .filter((pattern) =>\n Object.entries(pattern).every(\n ([key, value]) =>\n !Object.hasOwn(assignment, key) || equal(assignment[key]!, value),\n ),\n )\n .map(\n (pattern) =>\n Object.fromEntries(\n Object.entries(pattern).filter(\n ([key]) => !Object.hasOwn(assignment, key),\n ),\n ) as JsonObject,\n );\n const product = selectedAxes.reduce(\n (count, [, values]) => count * values.length,\n 1,\n );\n if (!patterns.length) return product;\n if (patterns.some((pattern) => !Object.keys(pattern).length)) return 0;\n function intersection(pattern: JsonObject): number {\n return selectedAxes.reduce(\n (count, [axis, choices]) =>\n count *\n (Object.hasOwn(pattern, axis)\n ? Number(choices.some((choice) => equal(choice, pattern[axis]!)))\n : choices.length),\n 1,\n );\n }\n let eligible = product;\n function visit(start: number, combined: JsonObject, sign: number): void {\n for (let index = start; index < patterns.length; index++) {\n if (--budget.remaining < 0)\n throw new Error(\n 'Exact matrix count exceeds planning budget; narrow the selection or exclusions',\n );\n const pattern = patterns[index]!;\n if (\n Object.entries(pattern).some(\n ([key, value]) =>\n Object.hasOwn(combined, key) && !equal(combined[key]!, value),\n )\n )\n continue;\n const merged = { ...combined, ...pattern };\n const matches = intersection(merged);\n if (!matches) continue;\n eligible += sign * matches;\n visit(index + 1, merged, -sign);\n }\n }\n visit(0, {}, -1);\n return eligible;\n }\n\n return {\n ...definition,\n kind: 'matrix',\n count(selection) {\n const selected = select(selection);\n const budget = { remaining: COUNT_BUDGET };\n const perEval = selected.cases.reduce(\n (count, assignment) =>\n count + countCase(assignment, selected.axes, budget),\n 0,\n );\n const count = perEval * selected.evals.length;\n if (!Number.isSafeInteger(count))\n throw new Error('Matrix exceeds safe cell count');\n return count;\n },\n *cells(selection) {\n const selected = select(selection);\n function* expand(\n index: number,\n values: JsonObject,\n ): Generator<JsonObject> {\n if (index === selected.axes.length) {\n yield values;\n return;\n }\n const [axis, choices] = selected.axes[index]!;\n for (const choice of choices)\n yield* expand(index + 1, { ...values, [axis]: choice });\n }\n for (const evaluation of selected.evals) {\n for (const assignment of selected.cases) {\n for (const dimensions of expand(0, assignment)) {\n if (exclusions.some((pattern) => matches(pattern, dimensions)))\n continue;\n const parameters = { ...selected.defaults, ...dimensions };\n yield {\n matrixId: definition.id,\n eval: evaluation,\n parameters,\n key: canonicalParameters({\n matrix: authoringId(definition),\n eval: authoringId(evaluation),\n parameters,\n }),\n };\n }\n }\n }\n },\n };\n}\n","import * as Schema from 'effect/Schema';\nimport { resourceUriSchema } from './identity.js';\nimport type { JsonValue, TrajectoryEvent } from './index.js';\n\n/** Runtime schemas for serialized EvalKit report and API boundaries. */\nexport const RunStatusSchema = Schema.Literal(\n 'running',\n 'completed',\n 'failed',\n 'cancelled',\n);\n\nexport const RecordedErrorSchema = Schema.Struct({\n name: Schema.String,\n message: Schema.String,\n stack: Schema.optional(Schema.String),\n});\n\nexport const AutIdentitySchema = Schema.Struct({\n name: Schema.optional(Schema.String),\n kind: Schema.String,\n id: Schema.String,\n version: Schema.optional(Schema.String),\n});\n\n// Payloads and scorer evidence are provider-neutral JSON, not benchmark-specific objects.\nexport const JsonValueSchema: Schema.Schema<JsonValue> = Schema.suspend(() =>\n Schema.Union(\n Schema.Null,\n Schema.Boolean,\n Schema.Number,\n Schema.String,\n Schema.mutable(Schema.Array(JsonValueSchema)),\n Schema.Record({ key: Schema.String, value: JsonValueSchema }),\n ),\n);\n\nconst ParametersSchema = Schema.Record({\n key: Schema.String,\n value: JsonValueSchema,\n});\nconst MatrixCellSchema = Schema.Struct({\n id: Schema.String,\n cellKey: Schema.String,\n});\n\nexport const RunSourceSchema = Schema.Struct({\n repo: Schema.String,\n project: Schema.String,\n commit: Schema.String,\n ref: Schema.optional(Schema.String),\n committedAt: Schema.optional(Schema.String),\n dirty: Schema.Boolean,\n ci: Schema.optional(\n Schema.Struct({\n provider: Schema.String,\n pipeline: Schema.optional(Schema.String),\n job: Schema.optional(Schema.String),\n url: Schema.optional(Schema.String),\n }),\n ),\n});\n\nexport const RunMetadataSchema = Schema.Struct({\n schemaVersion: Schema.Literal(2, 3, 4),\n runUri: resourceUriSchema('run'),\n evalId: Schema.String,\n suiteId: Schema.optional(Schema.String),\n parameters: Schema.optional(ParametersSchema),\n matrix: Schema.optional(MatrixCellSchema),\n aut: Schema.optional(AutIdentitySchema),\n startedAt: Schema.String,\n source: Schema.optional(RunSourceSchema),\n});\n\nexport const TrialMetadataSchema = Schema.Struct({\n schemaVersion: Schema.Literal(2, 3, 4),\n runUri: resourceUriSchema('run'),\n trialUri: resourceUriSchema('trial'),\n trialIndex: Schema.Number,\n evalId: Schema.String,\n parameters: Schema.optional(ParametersSchema),\n matrix: Schema.optional(MatrixCellSchema),\n aut: Schema.optional(AutIdentitySchema),\n startedAt: Schema.String,\n});\n\n/** On-disk manifests include a lifecycle status; older finalized manifests may still say running. */\nexport const RunManifestSchema = Schema.Struct({\n ...RunMetadataSchema.fields,\n status: Schema.optional(RunStatusSchema),\n});\nexport const TrialManifestSchema = Schema.Struct({\n ...TrialMetadataSchema.fields,\n status: Schema.optional(RunStatusSchema),\n});\n\nexport const UsageSchema = Schema.Struct({\n inputTokens: Schema.optional(Schema.Number),\n outputTokens: Schema.optional(Schema.Number),\n totalTokens: Schema.optional(Schema.Number),\n});\n\nexport const JudgeRunInfoSchema = Schema.Struct({\n agent: Schema.optional(\n Schema.Struct({\n id: Schema.String,\n kind: Schema.String,\n name: Schema.optional(Schema.String),\n version: Schema.optional(Schema.String),\n }),\n ),\n usage: Schema.optional(UsageSchema),\n events: Schema.optional(Schema.mutable(Schema.Array(JsonValueSchema))),\n});\n\nexport const ScoreResultSchema = Schema.Struct({\n name: Schema.String,\n kind: Schema.Literal('predicate', 'judge'),\n value: Schema.optional(Schema.Number),\n passed: Schema.optional(Schema.Boolean),\n explanation: Schema.optional(Schema.String),\n evidence: Schema.optional(JsonValueSchema),\n judge: Schema.optional(JudgeRunInfoSchema),\n durationMs: Schema.Number,\n error: Schema.optional(RecordedErrorSchema),\n});\nexport const CheckpointResultSchema = Schema.Struct({\n step: Schema.Number,\n kind: Schema.Literal('predicate', 'judge', 'expect-tool-call'),\n name: Schema.String,\n status: Schema.Literal('passed', 'failed', 'error', 'skipped'),\n value: Schema.optional(Schema.Number),\n passed: Schema.optional(Schema.Boolean),\n explanation: Schema.optional(Schema.String),\n evidence: Schema.optional(JsonValueSchema),\n judge: Schema.optional(JudgeRunInfoSchema),\n durationMs: Schema.optional(Schema.Number),\n error: Schema.optional(RecordedErrorSchema),\n matchedToolCall: Schema.optional(\n Schema.Struct({ eventIndex: Schema.Number, id: Schema.String }),\n ),\n});\nexport const TrialScoringSchema = Schema.Struct({\n results: Schema.mutable(Schema.Array(ScoreResultSchema)),\n checkpoints: Schema.optional(\n Schema.mutable(Schema.Array(CheckpointResultSchema)),\n ),\n skippedScorers: Schema.optional(Schema.mutable(Schema.Array(Schema.String))),\n overall: Schema.optional(Schema.Number),\n passed: Schema.Boolean,\n});\nexport const ArtifactEntrySchema = Schema.Struct({\n path: Schema.String,\n kind: Schema.Literal('file', 'directory'),\n size: Schema.optional(Schema.Number),\n});\nexport const TrialSummarySchema = Schema.Struct({\n status: RunStatusSchema,\n endedAt: Schema.String,\n durationMs: Schema.optional(Schema.Number),\n scoring: Schema.optional(TrialScoringSchema),\n artifacts: Schema.optional(Schema.mutable(Schema.Array(ArtifactEntrySchema))),\n error: Schema.optional(RecordedErrorSchema),\n});\n\nexport const RunSummarySchema = Schema.Struct({\n status: RunStatusSchema,\n endedAt: Schema.String,\n durationMs: Schema.optional(Schema.Number),\n trialCount: Schema.Number,\n passed: Schema.Number,\n failed: Schema.Number,\n error: Schema.optional(RecordedErrorSchema),\n});\n\nconst autEvent = {\n started: Schema.Struct({\n source: Schema.Literal('aut'),\n kind: Schema.Literal('started'),\n timestamp: Schema.String,\n }),\n message: Schema.Struct({\n source: Schema.Literal('aut'),\n kind: Schema.Literal('message'),\n role: Schema.Literal('system', 'user', 'assistant', 'tool'),\n content: JsonValueSchema,\n timestamp: Schema.String,\n }),\n toolCall: Schema.Struct({\n source: Schema.Literal('aut'),\n kind: Schema.Literal('tool-call'),\n id: Schema.String,\n name: Schema.String,\n arguments: JsonValueSchema,\n timestamp: Schema.String,\n }),\n toolResult: Schema.Struct({\n source: Schema.Literal('aut'),\n kind: Schema.Literal('tool-result'),\n id: Schema.String,\n name: Schema.optional(Schema.String),\n result: JsonValueSchema,\n timestamp: Schema.String,\n }),\n turnStarted: Schema.Struct({\n source: Schema.Literal('aut'),\n kind: Schema.Literal('turn-started'),\n turn: Schema.Number,\n timestamp: Schema.String,\n }),\n turnCompleted: Schema.Struct({\n source: Schema.Literal('aut'),\n kind: Schema.Literal('turn-completed'),\n turn: Schema.Number,\n timestamp: Schema.String,\n latencyMs: Schema.optional(Schema.Number),\n usage: Schema.optional(UsageSchema),\n }),\n completed: Schema.Struct({\n source: Schema.Literal('aut'),\n kind: Schema.Literal('completed'),\n output: Schema.optional(JsonValueSchema),\n timestamp: Schema.String,\n }),\n error: Schema.Struct({\n source: Schema.Literal('aut'),\n kind: Schema.Literal('error'),\n error: RecordedErrorSchema,\n timestamp: Schema.String,\n }),\n};\nconst runnerEvent = {\n trialStarted: Schema.Struct({\n source: Schema.Literal('runner'),\n kind: Schema.Literal('trial-started'),\n timestamp: Schema.String,\n }),\n stepStarted: Schema.Struct({\n source: Schema.Literal('runner'),\n kind: Schema.Literal('transcript-step-started'),\n step: Schema.Number,\n timestamp: Schema.String,\n }),\n stepCompleted: Schema.Struct({\n source: Schema.Literal('runner'),\n kind: Schema.Literal('transcript-step-completed'),\n step: Schema.Number,\n timestamp: Schema.String,\n }),\n stepSkipped: Schema.Struct({\n source: Schema.Literal('runner'),\n kind: Schema.Literal('transcript-step-skipped'),\n step: Schema.Number,\n timestamp: Schema.String,\n }),\n checkpointStarted: Schema.Struct({\n source: Schema.Literal('runner'),\n kind: Schema.Literal('checkpoint-started'),\n step: Schema.Number,\n name: Schema.String,\n timestamp: Schema.String,\n }),\n checkpointCompleted: Schema.Struct({\n source: Schema.Literal('runner'),\n kind: Schema.Literal('checkpoint-completed'),\n step: Schema.Number,\n status: Schema.Literal('passed', 'failed'),\n timestamp: Schema.String,\n }),\n checkpointError: Schema.Struct({\n source: Schema.Literal('runner'),\n kind: Schema.Literal('checkpoint-error'),\n step: Schema.Number,\n error: RecordedErrorSchema,\n timestamp: Schema.String,\n }),\n scorerStarted: Schema.Struct({\n source: Schema.Literal('runner'),\n kind: Schema.Literal('scorer-started'),\n scorer: Schema.String,\n timestamp: Schema.String,\n }),\n scorerCompleted: Schema.Struct({\n source: Schema.Literal('runner'),\n kind: Schema.Literal('scorer-completed'),\n scorer: Schema.String,\n value: Schema.Number,\n timestamp: Schema.String,\n }),\n scorerFailed: Schema.Struct({\n source: Schema.Literal('runner'),\n kind: Schema.Literal('scorer-failed'),\n scorer: Schema.String,\n error: RecordedErrorSchema,\n timestamp: Schema.String,\n }),\n trialCompleted: Schema.Struct({\n source: Schema.Literal('runner'),\n kind: Schema.Literal('trial-completed'),\n timestamp: Schema.String,\n }),\n error: Schema.Struct({\n source: Schema.Literal('runner'),\n kind: Schema.Literal('error'),\n error: RecordedErrorSchema,\n timestamp: Schema.String,\n }),\n};\n\nexport const TrajectoryEventSchema: Schema.Schema<TrajectoryEvent> =\n Schema.Union(...Object.values(autEvent), ...Object.values(runnerEvent));\n\nexport const ApiErrorSchema = Schema.Struct({\n error: Schema.String,\n message: Schema.String,\n});\n","import * as Schema from 'effect/Schema';\nimport type { TrajectoryEvent } from './index.js';\nimport { TrajectoryEventSchema } from './schema.js';\n\n/** Decode one private report's JSONL trajectory; reject malformed/non-event lines with their line number. */\nexport function parseTrajectoryJsonl(contents: string): TrajectoryEvent[] {\n const events: TrajectoryEvent[] = [];\n for (const [index, line] of contents.split(/\\r?\\n/).entries()) {\n if (!line.trim()) continue;\n try {\n events.push(\n Schema.decodeUnknownSync(TrajectoryEventSchema)(JSON.parse(line)),\n );\n } catch (cause) {\n throw new Error(`Invalid trajectory JSONL at line ${index + 1}`, {\n cause,\n });\n }\n }\n return events;\n}\n","import { authorId, type ResourceUri } from './identity.js';\nexport {\n defineConfig,\n type EvalkitConfig,\n type ShareConfig,\n type ShareHeaders,\n} from './config.js';\n\nexport type JsonPrimitive = boolean | number | string | null;\nexport type JsonValue =\n JsonPrimitive | JsonValue[] | { [key: string]: JsonValue };\nexport type JsonObject = { [key: string]: JsonValue };\n\nexport type AutIdentity = {\n /** Human-readable logical agent name shown in catalogs and dashboards. */\n name?: string;\n kind: string;\n id: string;\n version?: string;\n};\n\nexport type AgentRuntimeName = 'local' | 'sandbox' | 'remote';\n\n/**\n * A serializable runtime requirement for an AUT. Concrete runtime packages own\n * the interpretation of `kind` and `configuration`.\n */\nexport type AgentRuntime = {\n kind: string;\n configuration?: JsonObject;\n};\n\nexport type AgentRuntimes = Partial<Record<AgentRuntimeName, AgentRuntime>>;\n\nexport type Usage = {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n};\n\nexport type RecordedError = {\n name: string;\n message: string;\n stack?: string;\n};\n\nexport type AutEvent =\n | { kind: 'started'; timestamp: string }\n | {\n kind: 'message';\n role: 'system' | 'user' | 'assistant' | 'tool';\n content: JsonValue;\n timestamp: string;\n }\n | {\n kind: 'tool-call';\n id: string;\n name: string;\n arguments: JsonValue;\n timestamp: string;\n }\n | {\n kind: 'tool-result';\n id: string;\n name?: string;\n result: JsonValue;\n timestamp: string;\n }\n | { kind: 'turn-started'; turn: number; timestamp: string }\n | {\n kind: 'turn-completed';\n turn: number;\n timestamp: string;\n latencyMs?: number;\n usage?: Usage;\n }\n | { kind: 'completed'; output?: JsonValue; timestamp: string }\n | { kind: 'error'; error: RecordedError; timestamp: string };\n\nexport type RunnerEvent =\n | { kind: 'trial-started'; timestamp: string }\n | { kind: 'transcript-step-started'; step: number; timestamp: string }\n | { kind: 'transcript-step-completed'; step: number; timestamp: string }\n | { kind: 'transcript-step-skipped'; step: number; timestamp: string }\n | {\n kind: 'checkpoint-started';\n step: number;\n name: string;\n timestamp: string;\n }\n | {\n kind: 'checkpoint-completed';\n step: number;\n status: 'passed' | 'failed';\n timestamp: string;\n }\n | {\n kind: 'checkpoint-error';\n step: number;\n error: RecordedError;\n timestamp: string;\n }\n | { kind: 'scorer-started'; scorer: string; timestamp: string }\n | {\n kind: 'scorer-completed';\n scorer: string;\n value: number;\n timestamp: string;\n }\n | {\n kind: 'scorer-failed';\n scorer: string;\n error: RecordedError;\n timestamp: string;\n }\n | { kind: 'trial-completed'; timestamp: string }\n | { kind: 'error'; error: RecordedError; timestamp: string };\n\nexport type TrajectoryEvent =\n (AutEvent & { source: 'aut' }) | (RunnerEvent & { source: 'runner' });\n\nexport type WorkspaceView = {\n /** Absolute path to this trial-scoped workspace. Do not persist it in reports. */\n root: string;\n};\n\nexport type CandidateWorkspace = WorkspaceView;\nexport type EvaluatorWorkspace = WorkspaceView;\n\nexport type AutContext = {\n runId: string;\n evalId: string;\n trialId: string;\n trialIndex: number;\n metadata: JsonObject;\n /** Run-time parameters supplied by the eval definition or CLI invocation. */\n parameters?: JsonObject;\n runtime?: AgentRuntimeName;\n /** Contains only resources visible to the AUT/model. */\n workspace: CandidateWorkspace;\n /** Private evaluator capability for trusted AUT adapters; never expose this to the model. */\n evaluatorWorkspace: EvaluatorWorkspace;\n};\n\nexport type FixtureContext = Omit<\n AutContext,\n 'workspace' | 'evaluatorWorkspace'\n>;\n\nexport type AutAdapter<TMessage = string> = {\n readonly identity?: AutIdentity;\n /** Available execution environments for this AUT. */\n readonly runtimes?: AgentRuntimes;\n start(options: {\n context: AutContext;\n runtime?: AgentRuntime;\n onEvent: (event: AutEvent) => void | Promise<void>;\n }): Promise<AutSession<TMessage>>;\n};\n\nexport type AutSession<TMessage = string> = {\n /** Resolves once the AUT has completed the turn initiated by this message. */\n send(message: TMessage): Promise<void>;\n close(): Promise<void>;\n};\n\n/**\n * Defines an Agent Under Test without coupling it to a runtime or transport.\n * It preserves the adapter's concrete type for application-specific helpers.\n */\nexport function defineAgent<const T extends AutAdapter>(agent: T): T {\n if (agent.identity) authoringId(agent.identity);\n return agent;\n}\n\nexport type FixtureVisibility = 'candidate' | 'evaluator';\n\nexport type DirectoryFixture = {\n kind: 'directory';\n src: string;\n dst: string;\n visibility: FixtureVisibility;\n};\n\nexport type FileFixture = {\n kind: 'file';\n src: string;\n dst: string;\n visibility: FixtureVisibility;\n};\n\nexport type InlineFixture = {\n kind: 'inline';\n file: string;\n data: string;\n visibility: FixtureVisibility;\n};\n\nexport type DynamicFixture = {\n kind: 'dynamic';\n create(\n context: FixtureContext,\n ): Fixture | Fixture[] | Promise<Fixture | Fixture[]>;\n};\n\nexport type Fixture =\n DirectoryFixture | FileFixture | InlineFixture | DynamicFixture;\n\nfunction defaultFixtureDestination(src: string): string {\n const normalized = src.replace(/\\\\/g, '/').replace(/\\/+$/, '');\n const destination = normalized.slice(normalized.lastIndexOf('/') + 1);\n if (!destination || destination === '.' || destination === '..') {\n throw new Error(`Fixture source needs a basename: ${src}`);\n }\n return destination;\n}\n\n/**\n * Declares a directory relative to the invoking project's working directory.\n * The short form is candidate-visible and copies beneath the source basename.\n */\nexport function directory(\n src: string,\n options: Partial<Omit<DirectoryFixture, 'kind' | 'src'>> = {},\n): DirectoryFixture {\n return {\n kind: 'directory',\n src,\n dst: options.dst ?? defaultFixtureDestination(src),\n visibility: options.visibility ?? 'candidate',\n };\n}\n\nexport function file(\n src: string,\n options: Omit<FileFixture, 'kind' | 'src'>,\n): FileFixture {\n return { kind: 'file', src, ...options };\n}\n\nexport function inlineFile(\n file: string,\n data: string,\n visibility: FixtureVisibility,\n): InlineFixture {\n return { kind: 'inline', file, data, visibility };\n}\n\nexport function dynamic(create: DynamicFixture['create']): DynamicFixture {\n return { kind: 'dynamic', create };\n}\n\nexport type UserStep = {\n kind: 'user';\n message: string;\n};\n\nexport type AgentStep = {\n kind: 'agent';\n expectation: JsonObject;\n};\n\nexport type TurnView = {\n userStepIndex: number;\n events: readonly (AutEvent & { source: 'aut' })[];\n assistantMessages: readonly (Extract<AutEvent, { kind: 'message' }> & {\n role: 'assistant';\n source: 'aut';\n })[];\n toolCalls: readonly {\n eventIndex: number;\n id: string;\n name: string;\n arguments: JsonValue;\n resultObservation: 'observed' | 'absent' | 'ambiguous';\n result?: JsonValue;\n }[];\n lastAssistantText?: string;\n};\n\nexport type ExpectToolCallStep = {\n kind: 'expect-tool-call';\n name: string;\n expected: { name: string; arguments?: JsonValue };\n};\nexport type TranscriptStep =\n UserStep | AgentStep | ScoringRule | ExpectToolCallStep;\n\n/** Observes a tool call in the preceding turn; never invokes a tool. */\nexport function expectToolCall(\n expected: ExpectToolCallStep['expected'],\n): ExpectToolCallStep {\n if (!expected.name.trim())\n throw new Error('Expected tool name must not be empty');\n return { kind: 'expect-tool-call', name: expected.name, expected };\n}\n\nexport function user(message: string): UserStep {\n return { kind: 'user', message };\n}\n\nexport function agent(expectation: JsonObject): AgentStep {\n return { kind: 'agent', expectation };\n}\n\nexport type JudgeRunInfo = {\n agent?: AutIdentity;\n usage?: Usage;\n /** Judge-agent observations; never attributed to the AUT trajectory. */\n events?: JsonValue[];\n};\n\nexport type ScoreValue =\n | number\n | {\n value: number;\n passed?: boolean;\n explanation?: string;\n evidence?: JsonValue;\n /** Judge-agent evidence, never inferred from AUT usage. */\n judge?: JudgeRunInfo;\n };\n\nexport type ScoreResult = {\n name: string;\n kind: 'predicate' | 'judge';\n value?: number;\n passed?: boolean;\n explanation?: string;\n evidence?: JsonValue;\n judge?: JudgeRunInfo;\n durationMs: number;\n error?: RecordedError;\n};\n\nexport type ArtifactView = {\n candidate: CandidateWorkspace;\n evaluator: EvaluatorWorkspace;\n};\n\nexport type ScoringContext = {\n context: AutContext;\n trajectory: { events: readonly TrajectoryEvent[] };\n artifacts: ArtifactView;\n /** Most recent completed turn; absent if no user message has been sent. */\n turn?: TurnView;\n};\n\nexport type PredicateScorer = {\n kind: 'predicate';\n name: string;\n supportsPartial?: boolean;\n run(\n context: ScoringContext,\n ): boolean | ScoreValue | Promise<boolean | ScoreValue>;\n};\n\nexport type JudgeRule = {\n kind: 'judge';\n name: string;\n rubric: string;\n /** Run even when the scenario stopped early or execution failed. */\n supportsPartial?: boolean;\n};\n\nexport type ScoringRule = PredicateScorer | JudgeRule;\n\nexport function predicate(\n name: string,\n run: PredicateScorer['run'],\n options: Pick<PredicateScorer, 'supportsPartial'> = {},\n): PredicateScorer {\n return { kind: 'predicate', name, run, ...options };\n}\n\nexport function judge(\n name: string,\n options: Pick<JudgeRule, 'rubric' | 'supportsPartial'>,\n): JudgeRule {\n if (!name.trim() || !options.rubric.trim())\n throw new Error('Judge name and rubric must not be empty');\n return { kind: 'judge', name, ...options };\n}\n\nexport type EvalPolicy = {\n timeoutMs?: number;\n /** Stop later transcript steps after a failed checkpoint assertion. Default false. */\n failfast?: boolean;\n /** Number of independent trials requested by local and hosted runners. */\n trials?: number;\n};\n\nexport type EvalDefinition<TAgent extends AutAdapter = AutAdapter> = {\n id: string;\n name?: string;\n agent: TAgent;\n /** Separate judge agent; its model and tools are never inherited from the AUT. */\n judge?: AutAdapter;\n fixtures?: Fixture[];\n transcript: TranscriptStep[];\n scoring: ScoringRule[];\n policy?: EvalPolicy;\n metadata?: JsonObject;\n};\n\nexport function defineEval<const T extends EvalDefinition>(definition: T): T {\n authoringId(definition);\n let hasUser = false;\n for (const step of definition.transcript) {\n if (step.kind === 'user') hasUser = true;\n else if (step.kind !== 'agent' && !hasUser)\n throw new Error('Checkpoint requires a preceding user step');\n }\n if (\n (definition.transcript.some((step) => step.kind === 'judge') ||\n definition.scoring.some((rule) => rule.kind === 'judge')) &&\n !definition.judge\n )\n throw new Error('Judge rules require an eval judge agent');\n if (definition.judge && definition.judge === definition.agent)\n throw new Error('Judge agent must be distinct from the agent under test');\n return definition;\n}\n\nexport { defineEvalMatrix, canonicalParameters } from './matrix.js';\nexport type { EvalMatrix, EvalMatrixCell, MatrixSelection } from './matrix.js';\nimport type { EvalMatrix } from './matrix.js';\n\nexport type EvalSuite<\n TEvals extends readonly EvalDefinition[] = readonly EvalDefinition[],\n> = {\n id: string;\n name?: string;\n evals: TEvals;\n};\n\nexport function defineSuite<const TSuite extends EvalSuite>(\n suite: TSuite,\n): TSuite {\n authoringId(suite);\n return suite;\n}\n\nexport type EvalRegistration = EvalDefinition | EvalSuite | EvalMatrix;\n\nexport function authoringId(value: { id: string }): string {\n if ('uri' in value || 'uuid' in value || 'slug' in value)\n throw new Error('Authored resources use id, not uri, uuid, or slug');\n return authorId(value.id);\n}\n\nfunction isEvalMatrix(\n registration: EvalRegistration,\n): registration is EvalMatrix {\n return 'kind' in registration && registration.kind === 'matrix';\n}\n\nfunction isEvalSuite(\n registration: EvalRegistration,\n): registration is EvalSuite {\n return !isEvalMatrix(registration) && 'evals' in registration;\n}\n\nexport type EvalRegistry = {\n /** All registered evals, flattened from standalone entries and suites. */\n evals: readonly EvalDefinition[];\n suites: readonly EvalSuite[];\n matrices: readonly EvalMatrix[];\n get(uri: string): EvalDefinition | undefined;\n getSuite(uri: string): EvalSuite | undefined;\n metadata(): EvalRegistryMetadata[];\n suiteMetadata(): EvalSuiteMetadata[];\n catalog(): EvalCatalogEntry[];\n};\n\nexport type EvalRegistryMetadata = {\n id: string;\n name?: string;\n suiteId?: string;\n};\n\nexport type EvalSuiteMetadata = {\n id: string;\n name?: string;\n evalIds: string[];\n};\n\nexport type EvalCatalogFixture = {\n kind: Fixture['kind'];\n source: string;\n destination?: string;\n visibility?: FixtureVisibility;\n};\n\nexport type EvalCatalogEntry = {\n id: string;\n path: string;\n name?: string;\n suiteId?: string;\n agent: {\n name?: string;\n kind: string;\n id?: string;\n version?: string;\n runtimes: Array<{ name: AgentRuntimeName; kind: string }>;\n };\n fixtures: EvalCatalogFixture[];\n trialCount: number;\n scorers: Array<{ name: string; kind: ScoringRule['kind'] }>;\n};\n\n/**\n * Creates an explicit, statically imported eval registry. A suite is a\n * path-like grouping of evals; nesting is presentation derived from its ID.\n */\nexport function registerEvals<\n const TRegistrations extends readonly EvalRegistration[],\n>(registrations: TRegistrations): EvalRegistry {\n const byId = new Map<string, EvalDefinition>();\n const suiteById = new Map<string, EvalSuite>();\n const suiteIdByEvalId = new Map<string, EvalSuite>();\n const standalone: EvalDefinition[] = [];\n const matrices: EvalMatrix[] = [];\n\n for (const registration of registrations) {\n if (isEvalMatrix(registration)) {\n const id = authoringId(registration);\n if (matrices.some((matrix) => authoringId(matrix) === id))\n throw new Error(`Eval registry contains duplicate matrix ID: ${id}`);\n matrices.push(registration);\n continue;\n }\n const suite = isEvalSuite(registration) ? registration : undefined;\n if (suite) {\n const id = authoringId(suite);\n if (suiteById.has(id))\n throw new Error(`Eval registry contains duplicate suite ID: ${id}`);\n suiteById.set(id, suite);\n }\n const evaluations: readonly EvalDefinition[] = suite\n ? suite.evals\n : [registration as EvalDefinition];\n for (const evaluation of evaluations) {\n const id = authoringId(evaluation);\n if (byId.has(id))\n throw new Error(`Eval registry contains duplicate eval ID: ${id}`);\n byId.set(id, evaluation);\n if (suite) suiteIdByEvalId.set(id, suite);\n else standalone.push(evaluation);\n }\n }\n\n const evals = [\n ...standalone,\n ...Array.from(suiteById.values()).flatMap((suite) => suite.evals),\n ];\n return {\n evals,\n suites: [...suiteById.values()],\n matrices,\n get: (id) => byId.get(id),\n getSuite: (id) => suiteById.get(id),\n metadata: () =>\n evals.map((evaluation) => {\n const suite = suiteIdByEvalId.get(authoringId(evaluation));\n return {\n id: evaluation.id,\n ...(evaluation.name ? { name: evaluation.name } : {}),\n ...(suite ? { suiteId: suite.id } : {}),\n };\n }),\n suiteMetadata: () =>\n [...suiteById.values()].map((suite) => ({\n id: suite.id,\n evalIds: suite.evals.map(authoringId),\n ...(suite.name ? { name: suite.name } : {}),\n })),\n catalog: () =>\n evals.map((evaluation) => {\n const suite = suiteIdByEvalId.get(authoringId(evaluation));\n const identity = evaluation.agent.identity;\n return {\n id: evaluation.id,\n path: suite ? `${suite.id}#${evaluation.id}` : evaluation.id,\n ...(evaluation.name ? { name: evaluation.name } : {}),\n ...(suite ? { suiteId: suite.id } : {}),\n agent: {\n ...(identity?.name ? { name: identity.name } : {}),\n kind: identity?.kind ?? 'adapter',\n ...(identity?.id ? { id: identity.id } : {}),\n ...(identity?.version ? { version: identity.version } : {}),\n runtimes: Object.entries(evaluation.agent.runtimes ?? {}).map(\n ([name, runtime]) => ({\n name: name as AgentRuntimeName,\n kind: runtime.kind,\n }),\n ),\n },\n fixtures: (evaluation.fixtures ?? []).map((fixture) =>\n fixture.kind === 'dynamic'\n ? { kind: 'dynamic', source: 'dynamic' }\n : fixture.kind === 'inline'\n ? {\n kind: 'inline',\n source: fixture.file,\n destination: fixture.file,\n visibility: fixture.visibility,\n }\n : {\n kind: fixture.kind,\n source: fixture.src,\n destination: fixture.dst,\n visibility: fixture.visibility,\n },\n ),\n trialCount: evaluation.policy?.trials ?? 1,\n scorers: evaluation.scoring.map(({ name, kind }) => ({ name, kind })),\n };\n }),\n };\n}\n\nexport type RunStatus = 'running' | 'completed' | 'failed' | 'cancelled';\n\n/**\n * Where a run's eval code came from: the repository, eval project and commit.\n * Results are tagged with it; they are never stored in the repository itself.\n */\nexport type RunSource = {\n /** Normalized repository key, e.g. `gitlab.example.com/group/repo`. */\n repo: string;\n /** Eval project directory relative to the repository root; `\"\"` at the root. */\n project: string;\n /** Full commit SHA. */\n commit: string;\n ref?: string;\n committedAt?: string;\n /** True when the working tree had uncommitted changes at run time. */\n dirty: boolean;\n ci?: { provider: string; pipeline?: string; job?: string; url?: string };\n};\n\n/** The project's evals and suites when a run started; written beside its manifest. */\nexport type RunCatalog = {\n catalog: EvalCatalogEntry[];\n evals: EvalRegistryMetadata[];\n suites: EvalSuiteMetadata[];\n};\n\nexport type RunMetadata = {\n schemaVersion: 2 | 3 | 4;\n runId: string;\n runUri: ResourceUri<'run'>;\n evalId: string;\n suiteId?: string;\n parameters?: JsonObject;\n matrix?: { id: string; cellKey: string };\n aut?: AutIdentity;\n startedAt: string;\n /** Present from schema version 4 when the run's commit could be determined. */\n source?: RunSource;\n};\n\nexport type TrialMetadata = {\n schemaVersion: 2 | 3 | 4;\n runId: string;\n runUri: ResourceUri<'run'>;\n trialId: string;\n trialUri: ResourceUri<'trial'>;\n trialIndex: number;\n evalId: string;\n parameters?: JsonObject;\n matrix?: { id: string; cellKey: string };\n aut?: AutIdentity;\n startedAt: string;\n};\n\nexport type CheckpointResult = {\n step: number;\n kind: 'predicate' | 'judge' | 'expect-tool-call';\n name: string;\n status: 'passed' | 'failed' | 'error' | 'skipped';\n value?: number;\n passed?: boolean;\n explanation?: string;\n evidence?: JsonValue;\n judge?: JudgeRunInfo;\n durationMs?: number;\n error?: RecordedError;\n matchedToolCall?: { eventIndex: number; id: string };\n};\n\nexport type TrialScoring = {\n results: ScoreResult[];\n checkpoints?: CheckpointResult[];\n skippedScorers?: string[];\n overall?: number;\n passed: boolean;\n};\n\nexport type ArtifactEntry = {\n /** Path relative to this trial's artifact root. */\n path: string;\n kind: 'file' | 'directory';\n size?: number;\n};\n\nexport type TrialSummary = {\n status: RunStatus;\n endedAt: string;\n durationMs?: number;\n scoring?: TrialScoring;\n artifacts?: ArtifactEntry[];\n error?: RecordedError;\n};\n\nexport type RunSummary = {\n status: RunStatus;\n endedAt: string;\n durationMs?: number;\n trialCount: number;\n passed: number;\n failed: number;\n error?: RecordedError;\n};\n\nexport type TrialWriter = {\n appendEvent(event: TrajectoryEvent): Promise<void>;\n writeScores(scoring: TrialScoring): Promise<void>;\n /** Writes a file below this trial's artifact root. */\n writeArtifact(path: string, data: Uint8Array): Promise<void>;\n finalize(summary: TrialSummary): Promise<void>;\n};\n\nexport type RunWriter = {\n readonly location: string;\n startTrial(metadata: TrialMetadata): Promise<TrialWriter>;\n finalize(summary: RunSummary): Promise<void>;\n};\n\nexport type ReportStore = {\n startRun(\n metadata: RunMetadata,\n context?: { catalog?: RunCatalog },\n ): Promise<RunWriter>;\n};\n\nexport type TrialResult = {\n runId: string;\n runUri: ResourceUri<'run'>;\n trialId: string;\n trialUri: ResourceUri<'trial'>;\n trialIndex: number;\n evalId: string;\n status: RunStatus;\n reportLocation: string;\n durationMs?: number;\n scoring?: TrialScoring;\n error?: RecordedError;\n};\n\nexport type AggregateScoring = {\n passed: number;\n failed: number;\n passRate: number;\n overall?: number;\n};\n\nexport type RunResult = TrialResult & {\n runId: string;\n trialCount?: number;\n passed?: number;\n failed?: number;\n aggregateScoring?: AggregateScoring;\n /** Present for an aggregate multi-trial run. */\n trials?: TrialResult[];\n};\n\nexport * from './identity.js';\nexport * from './schema.js';\nexport * from './trajectory.js';\n\nexport function recordError(error: unknown): RecordedError {\n if (error instanceof Error) {\n return {\n name: error.name,\n message: error.message,\n ...(error.stack ? { stack: error.stack } : {}),\n };\n }\n\n return { name: 'Error', message: String(error) };\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { A as
|
|
1
|
+
import { A as TrajectoryEventSchema, L as canonicalParameters, M as TrialMetadataSchema, N as TrialScoringSchema, O as RunSummarySchema, P as TrialSummarySchema, T as RunMetadataSchema, U as resourceUri, b as CheckpointResultSchema, g as parseTrajectoryJsonl, j as TrialManifestSchema, k as ScoreResultSchema, n as authoringId, p as recordError, w as RunManifestSchema, x as JsonValueSchema } from "./src-ButXPY8P.mjs";
|
|
2
2
|
import * as Schema from "effect/Schema";
|
|
3
3
|
import { Data, Effect, Either, Exit, Scope } from "effect";
|
|
4
4
|
import { appendFile, copyFile, cp, lstat, mkdir, mkdtemp, readFile, readdir, rename, rm, writeFile } from "node:fs/promises";
|
|
@@ -518,6 +518,8 @@ async function evaluateFinalScorers(definition, input) {
|
|
|
518
518
|
//#endregion
|
|
519
519
|
//#region ../runner/src/local-report-store.ts
|
|
520
520
|
const MANIFEST_FILE = "manifest.json";
|
|
521
|
+
/** The project's evals and suites when the run started (schema version 4+). */
|
|
522
|
+
const CATALOG_FILE = "catalog.json";
|
|
521
523
|
async function writeJson(filePath, value) {
|
|
522
524
|
await writeFile(filePath, `${JSON.stringify(value, null, 2)}\n`);
|
|
523
525
|
}
|
|
@@ -590,10 +592,11 @@ var LocalRunWriter = class {
|
|
|
590
592
|
};
|
|
591
593
|
/** Persists each run as a local tree rooted below `rootDirectory`. */
|
|
592
594
|
function localReportStore(rootDirectory) {
|
|
593
|
-
return { async startRun(metadata) {
|
|
595
|
+
return { async startRun(metadata, context) {
|
|
594
596
|
assertPathSegment(metadata.runId, "runId");
|
|
595
597
|
const directory = path.resolve(rootDirectory, metadata.runId);
|
|
596
598
|
await mkdir(directory, { recursive: true });
|
|
599
|
+
if (context?.catalog) await writeJson(path.join(directory, CATALOG_FILE), context.catalog);
|
|
597
600
|
await writeJson(path.join(directory, MANIFEST_FILE), {
|
|
598
601
|
...Schema.encodeSync(RunMetadataSchema)(metadata),
|
|
599
602
|
status: "running"
|
|
@@ -691,11 +694,12 @@ function assertUuid(value, label) {
|
|
|
691
694
|
}
|
|
692
695
|
function runMetadata(definition, options, runId, startedAt) {
|
|
693
696
|
return {
|
|
694
|
-
schemaVersion:
|
|
697
|
+
schemaVersion: 4,
|
|
695
698
|
runId,
|
|
696
699
|
runUri: canonicalId("run", runId),
|
|
697
700
|
evalId: definition.id,
|
|
698
701
|
...options.suiteId ? { suiteId: options.suiteId } : {},
|
|
702
|
+
...options.source ? { source: options.source } : {},
|
|
699
703
|
...definition.agent.identity ? { aut: definition.agent.identity } : {},
|
|
700
704
|
parameters: options.parameters,
|
|
701
705
|
matrix: options.matrix,
|
|
@@ -726,7 +730,7 @@ async function executeRun(definition, options) {
|
|
|
726
730
|
const now = options.now ?? (() => /* @__PURE__ */ new Date());
|
|
727
731
|
const aggregateStartedAt = now();
|
|
728
732
|
const runId = options.runId ?? createId("run");
|
|
729
|
-
const runWriter = await options.report.startRun(runMetadata(definition, options, runId, aggregateStartedAt.toISOString()));
|
|
733
|
+
const runWriter = await options.report.startRun(runMetadata(definition, options, runId, aggregateStartedAt.toISOString()), { catalog: options.catalog });
|
|
730
734
|
const trialEffects = Array.from({ length: requestedTrials }, (_, trialIndex) => {
|
|
731
735
|
const trial = Effect.tryPromise({
|
|
732
736
|
try: () => runTrial(definition, {
|
|
@@ -793,9 +797,9 @@ async function runTrial(definition, options) {
|
|
|
793
797
|
...selectedRuntime ? { runtime: selectedRuntime } : {}
|
|
794
798
|
};
|
|
795
799
|
const events = [];
|
|
796
|
-
const runWriter = options.runWriter ?? await options.report.startRun(runMetadata(definition, options, runId, startedAt));
|
|
800
|
+
const runWriter = options.runWriter ?? await options.report.startRun(runMetadata(definition, options, runId, startedAt), { catalog: options.catalog });
|
|
797
801
|
const trialWriter = await runWriter.startTrial({
|
|
798
|
-
schemaVersion:
|
|
802
|
+
schemaVersion: 4,
|
|
799
803
|
runId,
|
|
800
804
|
runUri: canonicalId("run", runId),
|
|
801
805
|
trialId,
|
|
@@ -992,4 +996,4 @@ async function runTrial(definition, options) {
|
|
|
992
996
|
//#endregion
|
|
993
997
|
export { readTrialEvents as a, readTrialSummary as c, CheckpointExecutionError as d, FixtureError as f, readRunSummary as i, localReportStore as l, ScoringError as m, runMatrix as n, readTrialManifest as o, ReportError as p, readRunManifest as r, readTrialScoring as s, runEval as t, AutExecutionError as u };
|
|
994
998
|
|
|
995
|
-
//# sourceMappingURL=src-
|
|
999
|
+
//# sourceMappingURL=src-DoPs9Yug.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"src-DoPs9Yug.mjs","names":["failure","failure"],"sources":["../../runner/src/errors.ts","../../runner/src/snapshot.ts","../../runner/src/workspace.ts","../../runner/src/score.ts","../../runner/src/judge-agent.ts","../../runner/src/evaluate-rule.ts","../../runner/src/turn.ts","../../runner/src/checkpoint.ts","../../runner/src/effect-boundary.ts","../../runner/src/transcript.ts","../../runner/src/final-scoring.ts","../../runner/src/local-report-store.ts","../../runner/src/local-report-reader.ts","../../runner/src/matrix.ts","../../runner/src/index.ts"],"sourcesContent":["import { Data } from 'effect';\n\nexport class AutExecutionError extends Data.TaggedError('AutExecutionError')<{\n cause: unknown;\n message?: string;\n}> {}\n\nexport class FixtureError extends Data.TaggedError('FixtureError')<{\n cause: unknown;\n message?: string;\n}> {}\n\nexport class ReportError extends Data.TaggedError('ReportError')<{\n cause: unknown;\n message?: string;\n}> {}\n\nexport class ScoringError extends Data.TaggedError('ScoringError')<{\n cause: unknown;\n message?: string;\n}> {}\n\nexport class RuleExecutionError extends Data.TaggedError('RuleExecutionError')<{\n name: string;\n message: string;\n cause: unknown;\n}> {}\n\nexport class CheckpointExecutionError extends Data.TaggedError(\n 'CheckpointExecutionError',\n)<{\n step: number;\n name: string;\n message: string;\n cause: unknown;\n}> {}\n","import { lstat, readdir, readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport type { ArtifactEntry, TrialWriter } from '@evalkit/core';\n\n/**\n * Copies every regular file in the candidate workspace into the trial report.\n * Symbolic links are rejected so snapshots cannot follow paths outside the trial.\n */\nexport async function snapshotCandidateWorkspace(\n candidateRoot: string,\n writer: TrialWriter,\n): Promise<ArtifactEntry[]> {\n const artifacts: ArtifactEntry[] = [];\n\n async function visit(\n directory: string,\n relativeDirectory: string,\n ): Promise<void> {\n const entries = await readdir(directory, { withFileTypes: true });\n entries.sort((left, right) => left.name.localeCompare(right.name));\n\n for (const entry of entries) {\n const absolutePath = path.join(directory, entry.name);\n const relativePath = path.join(relativeDirectory, entry.name);\n const stat = await lstat(absolutePath);\n\n if (stat.isSymbolicLink()) {\n throw new Error(\n `Candidate workspace contains a symbolic link: ${relativePath}`,\n );\n }\n if (stat.isDirectory()) {\n artifacts.push({\n path: path.join('candidate', relativePath),\n kind: 'directory',\n });\n await visit(absolutePath, relativePath);\n continue;\n }\n if (!stat.isFile()) {\n throw new Error(\n `Candidate workspace contains an unsupported entry: ${relativePath}`,\n );\n }\n\n const data = await readFile(absolutePath);\n const artifactPath = path.join('candidate', relativePath);\n await writer.writeArtifact(artifactPath, data);\n artifacts.push({\n path: artifactPath,\n kind: 'file',\n size: data.byteLength,\n });\n }\n }\n\n await visit(candidateRoot, '');\n return artifacts;\n}\n","import { copyFile, cp, mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\nimport type {\n ArtifactView,\n AutContext,\n Fixture,\n FixtureContext,\n FixtureVisibility,\n} from '@evalkit/core';\n\nconst MAX_DYNAMIC_FIXTURE_DEPTH = 16;\n\nexport type TrialWorkspace = {\n artifacts: ArtifactView;\n cleanup(): Promise<void>;\n};\n\nfunction workspaceRoot(\n visibility: FixtureVisibility,\n artifacts: ArtifactView,\n): string {\n return visibility === 'candidate'\n ? artifacts.candidate.root\n : artifacts.evaluator.root;\n}\n\nfunction destinationPath(root: string, destination: string): string {\n if (!destination || path.isAbsolute(destination)) {\n throw new Error(\n `Fixture destination must be a non-empty relative path: ${destination}`,\n );\n }\n\n const normalized = path.normalize(destination);\n if (normalized === '..' || normalized.startsWith(`..${path.sep}`)) {\n throw new Error(\n `Fixture destination escapes its workspace: ${destination}`,\n );\n }\n\n return path.join(root, normalized);\n}\n\nasync function resolveFixtures(\n fixtures: readonly Fixture[],\n context: FixtureContext,\n depth = 0,\n): Promise<Exclude<Fixture, { kind: 'dynamic' }>[]> {\n if (depth > MAX_DYNAMIC_FIXTURE_DEPTH) {\n throw new Error('Dynamic fixture nesting exceeds the supported depth');\n }\n\n const resolved: Exclude<Fixture, { kind: 'dynamic' }>[] = [];\n for (const fixture of fixtures) {\n if (fixture.kind !== 'dynamic') {\n resolved.push(fixture);\n continue;\n }\n\n const created = await fixture.create(context);\n const nested = Array.isArray(created) ? created : [created];\n resolved.push(...(await resolveFixtures(nested, context, depth + 1)));\n }\n return resolved;\n}\n\nfunction assertUniqueDestinations(\n fixtures: readonly Exclude<Fixture, { kind: 'dynamic' }>[],\n): void {\n const destinations = new Set<string>();\n for (const fixture of fixtures) {\n const destination = fixture.kind === 'inline' ? fixture.file : fixture.dst;\n const key = `${fixture.visibility}:${destination}`;\n if (destinations.has(key)) {\n throw new Error(\n `Duplicate ${fixture.visibility} fixture destination: ${destination}`,\n );\n }\n destinations.add(key);\n }\n}\n\n/** Creates isolated candidate and evaluator directories and materializes fixtures into each. */\nfunction trialDirectoryName(trialId: string): string {\n return trialId.replace(/[^a-zA-Z0-9._-]/g, '_');\n}\n\nexport async function createTrialWorkspace(\n context: FixtureContext,\n fixtures: readonly Fixture[] = [],\n persistentRoot?: string,\n): Promise<TrialWorkspace> {\n const root = persistentRoot\n ? path.join(\n path.resolve(persistentRoot),\n trialDirectoryName(context.trialId),\n )\n : await mkdtemp(path.join(os.tmpdir(), 'evalkit-trial-'));\n const persistent = persistentRoot !== undefined;\n const artifacts: ArtifactView = {\n candidate: { root: path.join(root, 'candidate') },\n evaluator: { root: path.join(root, 'evaluator') },\n };\n\n try {\n await Promise.all([\n mkdir(artifacts.candidate.root, { recursive: true }),\n mkdir(artifacts.evaluator.root, { recursive: true }),\n ]);\n\n const resolved = await resolveFixtures(fixtures, context);\n assertUniqueDestinations(resolved);\n\n for (const fixture of resolved) {\n const target = destinationPath(\n workspaceRoot(fixture.visibility, artifacts),\n fixture.kind === 'inline' ? fixture.file : fixture.dst,\n );\n await mkdir(path.dirname(target), { recursive: true });\n\n if (fixture.kind === 'directory') {\n await cp(fixture.src, target, {\n recursive: true,\n force: false,\n errorOnExist: true,\n });\n } else if (fixture.kind === 'file') {\n await copyFile(fixture.src, target);\n } else {\n await writeFile(target, fixture.data);\n }\n }\n\n return {\n artifacts,\n // Persistent local workspaces are intentionally retained for debugging.\n cleanup: persistent\n ? async () => {}\n : () => rm(root, { recursive: true, force: true }),\n };\n } catch (error) {\n await rm(root, { recursive: true, force: true });\n throw error;\n }\n}\n\n/** Exposed for adapters that need the candidate workspace capability from an AUT context. */\nexport function candidateWorkspace(context: AutContext): string {\n return context.workspace.root;\n}\n","import type { ScoreResult, ScoreValue } from '@evalkit/core';\n\n/** Shared normalization for inline and final predicate and judge rules. */\nexport function normalizeScore(\n value: ScoreValue | boolean,\n): Omit<ScoreResult, 'name' | 'kind' | 'durationMs'> {\n const normalized =\n typeof value === 'boolean'\n ? { value: Number(value) }\n : typeof value === 'number'\n ? { value }\n : value;\n if (\n !normalized ||\n !Number.isFinite(normalized.value) ||\n normalized.value < 0 ||\n normalized.value > 1\n )\n throw new Error(\n `Score value must be a finite number from 0 to 1; received ${normalized?.value}`,\n );\n if ('judge' in normalized && normalized.judge) {\n const { usage } = normalized.judge;\n if (\n usage &&\n Object.values(usage).some(\n (tokens) => !Number.isSafeInteger(tokens) || tokens < 0,\n )\n )\n throw new Error('Judge token usage must contain nonnegative integers');\n }\n return {\n value: normalized.value,\n passed: normalized.passed ?? normalized.value === 1,\n ...(normalized.explanation ? { explanation: normalized.explanation } : {}),\n ...(normalized.evidence === undefined\n ? {}\n : { evidence: normalized.evidence }),\n ...('judge' in normalized && normalized.judge !== undefined\n ? { judge: normalized.judge }\n : {}),\n };\n}\n","import { Effect } from 'effect';\nimport * as Schema from 'effect/Schema';\nimport {\n JsonValueSchema,\n TrajectoryEventSchema,\n type AutAdapter,\n type AutContext,\n type AutEvent,\n type JudgeRule,\n type JudgeRunInfo,\n type JsonValue,\n type ScoreValue,\n type ScoringContext,\n} from '@evalkit/core';\nimport { RuleExecutionError } from './errors.js';\n\nconst failure = (name: string, cause: unknown) =>\n new RuleExecutionError({\n name,\n cause,\n message: cause instanceof Error ? cause.message : String(cause),\n });\n\n/** Drive a distinct agent session for one assessment; do not add its events to AUT trajectory. */\nexport function runJudgeAgent(\n rule: JudgeRule,\n agent: AutAdapter,\n input: ScoringContext,\n placement: 'transcript' | 'scoring',\n): Effect.Effect<\n { value: ScoreValue | boolean; judge: JudgeRunInfo },\n RuleExecutionError\n> {\n const events: AutEvent[] = [];\n const context: AutContext = {\n ...input.context,\n // Judge tools operate in evaluator space, not the candidate's mutable workspace.\n workspace: input.artifacts.evaluator,\n evaluatorWorkspace: input.artifacts.evaluator,\n };\n const prompt = JSON.stringify({\n name: rule.name,\n rubric: rule.rubric,\n placement,\n evidence:\n placement === 'transcript'\n ? { turn: input.turn?.events ?? [] }\n : { trajectory: input.trajectory.events },\n instruction:\n 'Return only a JSON verdict with value (a number from 0 to 1), optional passed, explanation, and evidence.',\n });\n let closeError: RuleExecutionError | undefined;\n return Effect.gen(function* () {\n yield* Effect.acquireUseRelease(\n Effect.tryPromise({\n try: () =>\n agent.start({\n context,\n onEvent: (event) => {\n // Validate normalized judge observations before persisting them separately.\n const observed = Schema.decodeUnknownSync(TrajectoryEventSchema)({\n ...event,\n source: 'aut',\n });\n if (observed.source !== 'aut')\n throw new Error('Invalid judge event source');\n const { source: _, ...validated } = observed;\n events.push(validated);\n },\n }),\n catch: (cause) => failure(rule.name, cause),\n }),\n (session) =>\n Effect.tryPromise({\n try: () => session.send(prompt),\n catch: (cause) => failure(rule.name, cause),\n }),\n (session) =>\n Effect.tryPromise({\n try: () => session.close(),\n catch: (cause) => failure(rule.name, cause),\n }).pipe(\n Effect.catchAll((error) =>\n Effect.sync(() => {\n closeError = error;\n }),\n ),\n ),\n );\n if (closeError) return yield* Effect.fail(closeError);\n const completed = events\n .slice()\n .reverse()\n .find(\n (event) => event.kind === 'completed' && event.output !== undefined,\n );\n const assistant = events\n .slice()\n .reverse()\n .find((event) => event.kind === 'message' && event.role === 'assistant');\n const output =\n completed?.kind === 'completed'\n ? completed.output\n : assistant?.kind === 'message'\n ? assistant.content\n : undefined;\n if (output === undefined)\n return yield* Effect.fail(\n failure(rule.name, new Error('Judge agent did not emit a verdict')),\n );\n const value = yield* Effect.try({\n try: () =>\n typeof output === 'string' ? (JSON.parse(output) as unknown) : output,\n catch: (cause) => failure(rule.name, cause),\n });\n const encodedEvents = yield* Schema.decodeUnknown(JsonValueSchema)(\n events,\n ).pipe(Effect.mapError((cause) => failure(rule.name, cause)));\n if (!Array.isArray(encodedEvents))\n return yield* Effect.fail(\n failure(rule.name, new Error('Judge events must be an array')),\n );\n const usage = events\n .slice()\n .reverse()\n .find((event) => event.kind === 'turn-completed' && event.usage);\n return {\n value: value as ScoreValue | boolean, // normalized and Schema-validated by the shared rule evaluator\n judge: {\n ...(agent.identity ? { agent: agent.identity } : {}),\n ...(usage?.kind === 'turn-completed' && usage.usage\n ? { usage: usage.usage }\n : {}),\n events: encodedEvents as JsonValue[],\n },\n };\n });\n}\n","import { Effect } from 'effect';\nimport * as Schema from 'effect/Schema';\nimport {\n ScoreResultSchema,\n type AutAdapter,\n type ScoreResult,\n type ScoringContext,\n type ScoringRule,\n} from '@evalkit/core';\nimport { RuleExecutionError } from './errors.js';\nimport { normalizeScore } from './score.js';\nimport { runJudgeAgent } from './judge-agent.js';\n\nconst failure = (name: string, cause: unknown) =>\n new RuleExecutionError({\n name,\n cause,\n message: cause instanceof Error ? cause.message : String(cause),\n });\n\n/** Both placements call the same rule executor; only input timing and persistence differ. */\nexport function evaluateRule(\n rule: ScoringRule,\n input: ScoringContext,\n judgeAgent: AutAdapter | undefined,\n placement: 'transcript' | 'scoring',\n): Effect.Effect<\n Omit<ScoreResult, 'name' | 'kind' | 'durationMs'>,\n RuleExecutionError\n> {\n return Effect.gen(function* () {\n if (rule.kind === 'judge' && !judgeAgent)\n return yield* Effect.fail(\n failure(\n rule.name,\n new Error('Judge rules require an eval judge agent'),\n ),\n );\n const evaluated =\n rule.kind === 'predicate'\n ? {\n value: yield* Effect.tryPromise({\n try: async () => rule.run(input),\n catch: (cause) => failure(rule.name, cause),\n }),\n }\n : yield* runJudgeAgent(rule, judgeAgent!, input, placement);\n const score = yield* Effect.try({\n try: () => normalizeScore(evaluated.value),\n catch: (cause) => failure(rule.name, cause),\n });\n const withJudge =\n rule.kind === 'judge' && 'judge' in evaluated\n ? { ...score, judge: evaluated.judge }\n : score;\n const validated = yield* Schema.decodeUnknown(ScoreResultSchema)({\n name: rule.name,\n kind: rule.kind,\n durationMs: 0,\n ...withJudge,\n }).pipe(Effect.mapError((cause) => failure(rule.name, cause)));\n return {\n value: validated.value!,\n passed: validated.passed!,\n ...(validated.explanation === undefined\n ? {}\n : { explanation: validated.explanation }),\n ...(validated.evidence === undefined\n ? {}\n : { evidence: validated.evidence }),\n ...(validated.judge === undefined ? {} : { judge: validated.judge }),\n };\n });\n}\n","import {\n canonicalParameters,\n type AutEvent,\n type JsonValue,\n type TrajectoryEvent,\n type TurnView,\n} from '@evalkit/core';\n\ntype AutTrajectoryEvent = AutEvent & { source: 'aut' };\n\n/** Freeze the observation window at send() completion, before checkpoint events arrive. */\nexport function turnView(\n events: readonly TrajectoryEvent[],\n start: number,\n end: number,\n userStepIndex: number,\n): TurnView {\n const window = events.slice(start, end);\n const autEvents = window.filter(\n (event): event is AutTrajectoryEvent => event.source === 'aut',\n );\n const assistantMessages = autEvents.filter(\n (\n event,\n ): event is Extract<AutEvent, { kind: 'message' }> & {\n role: 'assistant';\n source: 'aut';\n } => event.kind === 'message' && event.role === 'assistant',\n );\n const calls = window.flatMap((event, index) =>\n event.source === 'aut' && event.kind === 'tool-call'\n ? [{ event, eventIndex: start + index }]\n : [],\n );\n const results = autEvents.filter(\n (\n event,\n ): event is Extract<AutEvent, { kind: 'tool-result' }> & {\n source: 'aut';\n } => event.kind === 'tool-result',\n );\n return {\n userStepIndex,\n events: autEvents,\n assistantMessages,\n toolCalls: calls.map(({ event, eventIndex }) => {\n const matches = results.filter((result) => result.id === event.id);\n const ambiguous =\n calls.filter((call) => call.event.id === event.id).length !== 1 ||\n matches.length > 1;\n return {\n eventIndex,\n id: event.id,\n name: event.name,\n arguments: event.arguments,\n resultObservation: ambiguous\n ? ('ambiguous' as const)\n : matches.length\n ? ('observed' as const)\n : ('absent' as const),\n ...(!ambiguous && matches.length ? { result: matches[0]!.result } : {}),\n };\n }),\n ...(typeof assistantMessages.at(-1)?.content === 'string'\n ? { lastAssistantText: assistantMessages.at(-1)!.content as string }\n : {}),\n };\n}\n\n/** Exact JSON matching: object keys do not matter, array order does. */\nexport function matchingToolCall(\n turn: TurnView,\n name: string,\n args?: JsonValue,\n) {\n const expected = args === undefined ? undefined : canonicalParameters(args);\n return turn.toolCalls.find(\n (call) =>\n call.name === name &&\n (expected === undefined ||\n canonicalParameters(call.arguments) === expected),\n );\n}\n","import { Effect } from 'effect';\nimport * as Schema from 'effect/Schema';\nimport {\n CheckpointResultSchema,\n type ArtifactView,\n type AutContext,\n type ScoringRule,\n type AutAdapter,\n type ExpectToolCallStep,\n type TrajectoryEvent,\n type TurnView,\n type CheckpointResult,\n} from '@evalkit/core';\nimport { CheckpointExecutionError } from './errors.js';\nimport { normalizeScore } from './score.js';\nimport { evaluateRule } from './evaluate-rule.js';\nimport { matchingToolCall } from './turn.js';\n\nconst failure = (step: number, name: string, cause: unknown) =>\n new CheckpointExecutionError({\n step,\n name,\n cause,\n message: cause instanceof Error ? cause.message : String(cause),\n });\n\n/** An assertion failure is a successful Effect containing a failed result; only execution errors enter the error channel. */\nexport function evaluateCheckpoint(\n step: ScoringRule | ExpectToolCallStep,\n index: number,\n input: {\n context: AutContext;\n artifacts: ArtifactView;\n trajectory: { events: readonly TrajectoryEvent[] };\n turn: TurnView;\n },\n now: () => Date,\n judgeAgent?: AutAdapter,\n): Effect.Effect<\n CheckpointResult & { status: 'passed' | 'failed' },\n CheckpointExecutionError\n> {\n const annotations = {\n evalId: input.context.evalId,\n runId: input.context.runId,\n trialId: input.context.trialId,\n step: index,\n checkpoint: step.name,\n };\n return Effect.gen(function* () {\n const started = now();\n yield* Effect.logDebug('checkpoint started');\n const match =\n step.kind === 'expect-tool-call'\n ? yield* Effect.try({\n try: () =>\n matchingToolCall(\n input.turn,\n step.expected.name,\n step.expected.arguments,\n ),\n catch: (cause) => failure(index, step.name, cause),\n })\n : undefined;\n const score =\n step.kind === 'expect-tool-call'\n ? yield* Effect.try({\n try: () => normalizeScore(Boolean(match)),\n catch: (cause) => failure(index, step.name, cause),\n })\n : yield* evaluateRule(step, input, judgeAgent, 'transcript').pipe(\n Effect.mapError((cause) => failure(index, step.name, cause)),\n );\n const result = yield* Schema.decodeUnknown(CheckpointResultSchema)({\n step: index,\n kind: step.kind,\n name: step.name,\n status: score.passed ? 'passed' : 'failed',\n durationMs: now().getTime() - started.getTime(),\n ...score,\n ...(match\n ? { matchedToolCall: { eventIndex: match.eventIndex, id: match.id } }\n : {}),\n }).pipe(Effect.mapError((cause) => failure(index, step.name, cause)));\n yield* Effect.logInfo('checkpoint completed').pipe(\n Effect.annotateLogs({ status: result.status }),\n );\n return {\n ...result,\n status: score.passed ? ('passed' as const) : ('failed' as const),\n };\n }).pipe(\n Effect.tapError((error) =>\n Effect.logError('checkpoint execution error').pipe(\n Effect.annotateLogs({ errorName: error._tag }),\n ),\n ),\n Effect.annotateLogs(annotations),\n );\n}\n","import { Effect, Either } from 'effect';\n\n/** Keep tagged Effect failures intact when bridging into the legacy async reporting lifecycle. Defects still reject. */\nexport async function runBoundary<A, E>(\n effect: Effect.Effect<A, E>,\n): Promise<A> {\n const outcome = await Effect.runPromise(Effect.either(effect));\n if (Either.isLeft(outcome)) throw outcome.left;\n return outcome.right;\n}\n","import { Effect } from 'effect';\nimport {\n recordError,\n type AutContext,\n type AutSession,\n type CheckpointResult,\n type EvalDefinition,\n type RunnerEvent,\n type TrajectoryEvent,\n type TurnView,\n} from '@evalkit/core';\nimport { evaluateCheckpoint } from './checkpoint.js';\nimport { runBoundary } from './effect-boundary.js';\nimport { AutExecutionError, ReportError } from './errors.js';\nimport { turnView } from './turn.js';\nimport type { TrialWorkspace } from './workspace.js';\n\n/** Progress survives a failed step so partial scoring can see completed turns and checkpoints. */\nexport type TranscriptProgress = {\n checkpoints: CheckpointResult[];\n lastTurn?: TurnView;\n stoppedEarly: boolean;\n};\n\ntype TranscriptExecution = {\n context: AutContext;\n artifacts: TrialWorkspace['artifacts'];\n events: TrajectoryEvent[];\n now: () => Date;\n randomSeed: number;\n emitRunner: (event: RunnerEvent) => Promise<void>;\n progress: TranscriptProgress;\n};\n\nexport async function executeTranscript(\n definition: EvalDefinition,\n session: AutSession,\n input: TranscriptExecution,\n): Promise<void> {\n const { now, emitRunner, progress } = input;\n for (const [index, step] of definition.transcript.entries()) {\n await emitRunner({\n kind: 'transcript-step-started',\n step: index,\n timestamp: now().toISOString(),\n });\n if (step.kind === 'user') {\n const cursor = input.events.length;\n await sendUserTurn(\n session,\n step.message.replaceAll('{{randomSeed}}', String(input.randomSeed)),\n );\n progress.lastTurn = turnView(\n input.events,\n cursor,\n input.events.length,\n index,\n );\n } else if (\n step.kind === 'predicate' ||\n step.kind === 'judge' ||\n step.kind === 'expect-tool-call'\n ) {\n const result = await runCheckpoint(definition, step, index, input);\n progress.checkpoints.push(result);\n await emitRunner({\n kind: 'checkpoint-completed',\n step: index,\n status: result.status,\n timestamp: now().toISOString(),\n });\n await emitRunner({\n kind: 'transcript-step-completed',\n step: index,\n timestamp: now().toISOString(),\n });\n if (!result.passed && definition.policy?.failfast) {\n progress.stoppedEarly = true;\n await skipRemainingSteps(definition, index, input);\n break;\n }\n continue;\n } else {\n throw new Error(\n `Transcript step kind \"${step.kind}\" is not executable yet`,\n );\n }\n await emitRunner({\n kind: 'transcript-step-completed',\n step: index,\n timestamp: now().toISOString(),\n });\n }\n}\n\nasync function sendUserTurn(\n session: AutSession,\n message: string,\n): Promise<void> {\n await runBoundary(\n Effect.tryPromise({\n try: () => session.send(message),\n catch: (cause) =>\n cause instanceof ReportError\n ? cause\n : new AutExecutionError({\n cause,\n message: cause instanceof Error ? cause.message : String(cause),\n }),\n }),\n );\n}\n\ntype CheckpointStep = Extract<\n EvalDefinition['transcript'][number],\n { kind: 'predicate' | 'judge' | 'expect-tool-call' }\n>;\n\nasync function runCheckpoint(\n definition: EvalDefinition,\n step: CheckpointStep,\n index: number,\n input: TranscriptExecution,\n): Promise<CheckpointResult & { status: 'passed' | 'failed' }> {\n const { now, emitRunner, progress } = input;\n if (!progress.lastTurn)\n throw new Error('Checkpoint requires a preceding user step');\n const started = now();\n await emitRunner({\n kind: 'checkpoint-started',\n step: index,\n name: step.name,\n timestamp: started.toISOString(),\n });\n return runBoundary(\n evaluateCheckpoint(\n step,\n index,\n {\n context: input.context,\n artifacts: input.artifacts,\n trajectory: { events: input.events },\n turn: progress.lastTurn,\n },\n now,\n definition.judge,\n ),\n ).catch(async (error: unknown) => {\n const recorded = recordError(error);\n progress.checkpoints.push({\n step: index,\n kind: step.kind,\n name: step.name,\n status: 'error',\n durationMs: now().getTime() - started.getTime(),\n error: recorded,\n });\n try {\n await emitRunner({\n kind: 'checkpoint-error',\n step: index,\n error: recorded,\n timestamp: now().toISOString(),\n });\n } catch {\n // Preserve the checkpoint error if the writer also fails.\n }\n throw error;\n });\n}\n\nasync function skipRemainingSteps(\n definition: EvalDefinition,\n after: number,\n { now, emitRunner, progress }: TranscriptExecution,\n): Promise<void> {\n for (let index = after + 1; index < definition.transcript.length; index++) {\n await emitRunner({\n kind: 'transcript-step-skipped',\n step: index,\n timestamp: now().toISOString(),\n });\n const step = definition.transcript[index]!;\n if (\n step.kind === 'predicate' ||\n step.kind === 'judge' ||\n step.kind === 'expect-tool-call'\n )\n progress.checkpoints.push({\n step: index,\n kind: step.kind,\n name: step.name,\n status: 'skipped',\n });\n }\n}\n","import { Effect } from 'effect';\nimport {\n recordError,\n type AutContext,\n type CheckpointResult,\n type EvalDefinition,\n type RunnerEvent,\n type ScoreResult,\n type TrajectoryEvent,\n type TrialScoring,\n type TurnView,\n} from '@evalkit/core';\nimport { runBoundary } from './effect-boundary.js';\nimport { ScoringError } from './errors.js';\nimport { evaluateRule } from './evaluate-rule.js';\nimport type { TrialWorkspace } from './workspace.js';\n\nexport function scoreSummary(\n results: ScoreResult[],\n checkpoints: CheckpointResult[],\n skippedScorers: string[],\n): TrialScoring {\n const valid = results.filter((result) => result.value !== undefined);\n const hasError = results.some((result) => result.error !== undefined);\n return {\n results,\n ...(checkpoints.length ? { checkpoints } : {}),\n ...(skippedScorers.length ? { skippedScorers } : {}),\n ...(valid.length === 0\n ? {}\n : {\n overall:\n valid.reduce((sum, result) => sum + (result.value ?? 0), 0) /\n valid.length,\n }),\n passed:\n !hasError &&\n results.every((result) => result.passed === true) &&\n checkpoints.every((result) => result.status === 'passed') &&\n !skippedScorers.length,\n };\n}\n\ntype FinalScoringInput = {\n context?: AutContext;\n workspace?: TrialWorkspace;\n events: TrajectoryEvent[];\n lastTurn?: TurnView;\n primaryError?: unknown;\n stoppedEarly: boolean;\n reportingFailed: boolean;\n results: ScoreResult[];\n skippedScorers: string[];\n now: () => Date;\n emitRunner: (event: RunnerEvent) => Promise<void>;\n};\n\n/** Append completed scores to the supplied arrays, even when a later scorer or report write fails. */\nexport async function evaluateFinalScorers(\n definition: EvalDefinition,\n input: FinalScoringInput,\n): Promise<void> {\n const {\n context,\n workspace,\n events,\n lastTurn,\n results,\n skippedScorers,\n now,\n emitRunner,\n } = input;\n for (const scorer of definition.scoring) {\n if (\n input.reportingFailed ||\n !context ||\n !workspace ||\n ((input.primaryError || input.stoppedEarly) &&\n (!('supportsPartial' in scorer) || !scorer.supportsPartial))\n ) {\n skippedScorers.push(scorer.name);\n continue;\n }\n const started = now();\n await emitRunner({\n kind: 'scorer-started',\n scorer: scorer.name,\n timestamp: started.toISOString(),\n });\n let result: ScoreResult;\n try {\n const score = await runBoundary(\n evaluateRule(\n scorer,\n {\n context,\n artifacts: workspace.artifacts,\n trajectory: { events },\n ...(lastTurn ? { turn: lastTurn } : {}),\n },\n definition.judge,\n 'scoring',\n ).pipe(\n Effect.mapError(\n (cause) => new ScoringError({ cause, message: cause.message }),\n ),\n ),\n );\n result = {\n name: scorer.name,\n kind: scorer.kind,\n durationMs: now().getTime() - started.getTime(),\n ...score,\n };\n results.push(result);\n } catch (error) {\n const recorded = recordError(error);\n results.push({\n name: scorer.name,\n kind: scorer.kind,\n durationMs: now().getTime() - started.getTime(),\n error: recorded,\n passed: false,\n });\n await emitRunner({\n kind: 'scorer-failed',\n scorer: scorer.name,\n error: recorded,\n timestamp: now().toISOString(),\n });\n continue;\n }\n await emitRunner({\n kind: 'scorer-completed',\n scorer: scorer.name,\n value: result.value ?? 0,\n timestamp: now().toISOString(),\n });\n }\n}\n","import { appendFile, mkdir, rename, writeFile } from 'node:fs/promises';\nimport { randomUUID } from 'node:crypto';\nimport path from 'node:path';\nimport * as Schema from 'effect/Schema';\nimport {\n RunMetadataSchema,\n RunSummarySchema,\n TrialMetadataSchema,\n TrialScoringSchema,\n TrialSummarySchema,\n TrajectoryEventSchema,\n} from '@evalkit/core';\nimport type {\n ReportStore,\n RunMetadata,\n RunSummary,\n RunWriter,\n TrialMetadata,\n TrialScoring,\n TrialSummary,\n TrialWriter,\n TrajectoryEvent,\n} from '@evalkit/core';\n\nconst MANIFEST_FILE = 'manifest.json';\n/** The project's evals and suites when the run started (schema version 4+). */\nexport const CATALOG_FILE = 'catalog.json';\n\nasync function writeJson(filePath: string, value: unknown): Promise<void> {\n await writeFile(filePath, `${JSON.stringify(value, null, 2)}\\n`);\n}\n\nasync function replaceJson(filePath: string, value: unknown): Promise<void> {\n const temporary = `${filePath}.${randomUUID()}.tmp`;\n await writeJson(temporary, value);\n await rename(temporary, filePath);\n}\n\nfunction assertPathSegment(value: string, name: string): void {\n if (\n !value ||\n value === '.' ||\n value === '..' ||\n value.includes('/') ||\n value.includes('\\\\')\n ) {\n throw new Error(`${name} must be a single relative path segment`);\n }\n}\n\nfunction artifactPath(root: string, value: string): string {\n if (!value || path.isAbsolute(value)) {\n throw new Error(\n `Artifact path must be a non-empty relative path: ${value}`,\n );\n }\n const normalized = path.normalize(value);\n if (normalized === '..' || normalized.startsWith(`..${path.sep}`)) {\n throw new Error(`Artifact path escapes its root: ${value}`);\n }\n return path.join(root, normalized);\n}\n\nclass LocalTrialWriter implements TrialWriter {\n constructor(\n private readonly directory: string,\n private readonly metadata: TrialMetadata,\n ) {}\n\n appendEvent(event: TrajectoryEvent): Promise<void> {\n return appendFile(\n path.join(this.directory, 'trajectory.jsonl'),\n `${JSON.stringify(Schema.encodeSync(TrajectoryEventSchema)(event))}\\n`,\n );\n }\n\n writeScores(scoring: TrialScoring): Promise<void> {\n return writeJson(\n path.join(this.directory, 'scoring.json'),\n Schema.encodeSync(TrialScoringSchema)(scoring),\n );\n }\n\n async writeArtifact(relativePath: string, data: Uint8Array): Promise<void> {\n const target = artifactPath(\n path.join(this.directory, 'artifacts'),\n relativePath,\n );\n await mkdir(path.dirname(target), { recursive: true });\n await writeFile(target, data);\n }\n\n async finalize(summary: TrialSummary): Promise<void> {\n await writeJson(\n path.join(this.directory, 'summary.json'),\n Schema.encodeSync(TrialSummarySchema)(summary),\n );\n await replaceJson(path.join(this.directory, MANIFEST_FILE), {\n ...Schema.encodeSync(TrialMetadataSchema)(this.metadata),\n status: summary.status,\n });\n }\n}\n\nclass LocalRunWriter implements RunWriter {\n constructor(\n readonly location: string,\n private readonly directory: string,\n private readonly metadata: RunMetadata,\n ) {}\n\n async startTrial(metadata: TrialMetadata): Promise<TrialWriter> {\n assertPathSegment(metadata.trialId, 'trialId');\n const directory = path.join(this.directory, 'trials', metadata.trialId);\n await mkdir(directory, { recursive: true });\n await writeJson(path.join(directory, MANIFEST_FILE), {\n ...Schema.encodeSync(TrialMetadataSchema)(metadata),\n status: 'running',\n });\n return new LocalTrialWriter(directory, metadata);\n }\n\n async finalize(summary: RunSummary): Promise<void> {\n await writeJson(\n path.join(this.directory, 'summary.json'),\n Schema.encodeSync(RunSummarySchema)(summary),\n );\n await replaceJson(path.join(this.directory, MANIFEST_FILE), {\n ...Schema.encodeSync(RunMetadataSchema)(this.metadata),\n status: summary.status,\n });\n }\n}\n\n/** Persists each run as a local tree rooted below `rootDirectory`. */\nexport function localReportStore(rootDirectory: string): ReportStore {\n return {\n async startRun(metadata, context): Promise<RunWriter> {\n assertPathSegment(metadata.runId, 'runId');\n const directory = path.resolve(rootDirectory, metadata.runId);\n await mkdir(directory, { recursive: true });\n if (context?.catalog)\n await writeJson(path.join(directory, CATALOG_FILE), context.catalog);\n await writeJson(path.join(directory, MANIFEST_FILE), {\n ...Schema.encodeSync(RunMetadataSchema)(metadata),\n status: 'running',\n });\n return new LocalRunWriter(\n path.relative(process.cwd(), directory),\n directory,\n metadata,\n );\n },\n };\n}\n","import { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport * as Schema from 'effect/Schema';\nimport {\n RunManifestSchema,\n RunSummarySchema,\n TrialManifestSchema,\n TrialSummarySchema,\n TrialScoringSchema,\n parseTrajectoryJsonl,\n} from '@evalkit/core';\n\n/** Shared v2/v3 local report boundary for CLI, dashboard, and CI consumers. */\nasync function decode<A, I>(\n file: string,\n schema: Schema.Schema<A, I>,\n): Promise<A> {\n return Schema.decodeUnknownSync(schema)(\n JSON.parse(await readFile(file, 'utf8')),\n );\n}\n\nexport const readRunManifest = (root: string, runId: string) =>\n decode(join(root, runId, 'manifest.json'), RunManifestSchema);\nexport const readRunSummary = (root: string, runId: string) =>\n decode(join(root, runId, 'summary.json'), RunSummarySchema);\nexport const readTrialManifest = (\n root: string,\n runId: string,\n trialId: string,\n) =>\n decode(\n join(root, runId, 'trials', trialId, 'manifest.json'),\n TrialManifestSchema,\n );\nexport const readTrialSummary = (\n root: string,\n runId: string,\n trialId: string,\n) =>\n decode(\n join(root, runId, 'trials', trialId, 'summary.json'),\n TrialSummarySchema,\n );\nexport const readTrialScoring = (\n root: string,\n runId: string,\n trialId: string,\n) =>\n decode(\n join(root, runId, 'trials', trialId, 'scoring.json'),\n TrialScoringSchema,\n );\nexport async function readTrialEvents(\n root: string,\n runId: string,\n trialId: string,\n) {\n return parseTrajectoryJsonl(\n await readFile(\n join(root, runId, 'trials', trialId, 'trajectory.jsonl'),\n 'utf8',\n ),\n );\n}\n","import { Effect } from 'effect';\nimport type {\n EvalMatrix,\n EvalMatrixCell,\n MatrixSelection,\n RunResult,\n} from '@evalkit/core';\nimport { runEval, type RunEvalOptions } from './index.js';\n\n/** Bounded workers pull cells from the iterator; no Cartesian job array is allocated. */\nexport function runMatrix(\n matrix: EvalMatrix,\n options: Omit<\n RunEvalOptions,\n 'runId' | 'trialId' | 'parameters' | 'matrix'\n > & {\n selection?: MatrixSelection;\n onResult?: (\n cell: EvalMatrixCell,\n result: RunResult,\n ) => void | Promise<void>;\n },\n): Effect.Effect<{ cells: number; passed: number; failed: number }, unknown> {\n return Effect.gen(function* () {\n const concurrency = options.concurrency ?? 4;\n if (!Number.isSafeInteger(concurrency) || concurrency < 1)\n throw new Error('Concurrency must be a positive integer');\n const count = matrix.count(options.selection);\n const iterator = matrix.cells(options.selection);\n const summary = { cells: 0, passed: 0, failed: 0 };\n yield* Effect.all(\n Array.from({ length: Math.min(count, concurrency) }, () =>\n Effect.gen(function* () {\n while (true) {\n const next = iterator.next();\n if (next.done) return;\n const cell = next.value;\n const runtime =\n options.runtime ??\n (['local', 'remote', 'sandbox'] as const).find(\n (name) => cell.eval.agent.runtimes?.[name],\n );\n const result = yield* runEval(cell.eval, {\n ...options,\n concurrency: 1,\n runtime,\n parameters: cell.parameters,\n matrix: { id: matrix.id, cellKey: cell.key },\n });\n summary.cells++;\n if (\n result.status === 'completed' &&\n (result.aggregateScoring?.passRate === 1 ||\n result.scoring?.passed)\n )\n summary.passed++;\n else summary.failed++;\n if (options.onResult)\n yield* Effect.tryPromise(async () =>\n options.onResult!(cell, result),\n );\n }\n }),\n ),\n { concurrency },\n );\n return summary;\n });\n}\n","export {\n AutExecutionError,\n FixtureError,\n ReportError,\n ScoringError,\n CheckpointExecutionError,\n} from './errors.js';\n\nimport { Effect, Exit, Scope } from 'effect';\nimport {\n recordError,\n resourceUri,\n authoringId,\n type AgentRuntimeName,\n type JsonObject,\n type ArtifactEntry,\n type AutContext,\n type AutEvent,\n type EvalDefinition,\n type ReportStore,\n type RunnerEvent,\n type RunResult,\n type RunStatus,\n type ResourceKind,\n type RunWriter,\n type RunMetadata,\n type RunCatalog,\n type RunSource,\n type ScoreResult,\n type TrialScoring,\n type Uuid,\n type TrajectoryEvent,\n} from '@evalkit/core';\nimport { snapshotCandidateWorkspace } from './snapshot.js';\nimport { createTrialWorkspace, type TrialWorkspace } from './workspace.js';\nimport { executeTranscript, type TranscriptProgress } from './transcript.js';\nimport { evaluateFinalScorers, scoreSummary } from './final-scoring.js';\nimport { AutExecutionError, FixtureError, ReportError } from './errors.js';\nimport { runBoundary } from './effect-boundary.js';\n\nexport { localReportStore } from './local-report-store.js';\nexport * from './local-report-reader.js';\nexport { runMatrix } from './matrix.js';\n\nexport type RunEvalOptions = {\n report: ReportStore;\n runId?: string;\n trialId?: string;\n suiteId?: string;\n /** Overrides the eval policy's requested number of independent trials. */\n trials?: number;\n /** Parameters made available to the AUT for this invocation. */\n parameters?: JsonObject;\n /** Matrix provenance retained with every aggregate and trial manifest. */\n matrix?: RunMetadata['matrix'];\n /** Selects a declared AUT runtime such as local, sandbox, or remote. */\n runtime?: AgentRuntimeName;\n /** Maximum number of trials from this aggregate run executing concurrently. */\n concurrency?: number;\n /** Optional shared limiter for coordinating trials across aggregate runs. */\n semaphore?: Effect.Semaphore;\n /** Base directory for persistent local trial workspaces. Omit for an ephemeral OS temp workspace. */\n workspaceRoot?: string;\n /** Repository and commit the eval code came from, recorded in the manifest. */\n source?: RunSource;\n /** The project's evals and suites at run time, saved beside the manifest. */\n catalog?: RunCatalog;\n now?: () => Date;\n};\n\ntype InternalTrialOptions = RunEvalOptions & {\n runWriter?: RunWriter;\n trialIndex?: number;\n};\n\n/** Effect-native aggregate eval execution entry point. */\nexport function runEval(\n definition: EvalDefinition,\n options: RunEvalOptions,\n): Effect.Effect<RunResult, unknown> {\n return Effect.gen(function* () {\n yield* Effect.logInfo('eval run started').pipe(\n Effect.annotateLogs({\n evalId: authoringId(definition),\n ...(options.runId ? { runId: options.runId } : {}),\n ...(options.suiteId ? { suiteId: options.suiteId } : {}),\n }),\n );\n const result = yield* Effect.tryPromise({\n try: () => executeRun(definition, options),\n catch: (error) => error,\n });\n yield* Effect.logInfo('eval run finished').pipe(\n Effect.annotateLogs({\n evalId: authoringId(definition),\n runId: result.runId,\n status: result.status,\n }),\n );\n return result;\n });\n}\n\nfunction createId(_kind: 'run' | 'trial'): string {\n return crypto.randomUUID();\n}\n\nfunction canonicalId<K extends ResourceKind>(kind: K, id: string) {\n return resourceUri(kind, id as Uuid);\n}\n\nfunction assertUuid(value: string, label: string): void {\n if (\n !/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n value,\n )\n ) {\n throw new Error(`${label} must be a UUID`);\n }\n}\n\nfunction runMetadata(\n definition: EvalDefinition,\n options: RunEvalOptions,\n runId: string,\n startedAt: string,\n): RunMetadata {\n return {\n schemaVersion: 4,\n runId,\n runUri: canonicalId('run', runId),\n evalId: definition.id,\n ...(options.suiteId ? { suiteId: options.suiteId } : {}),\n ...(options.source ? { source: options.source } : {}),\n ...(definition.agent.identity ? { aut: definition.agent.identity } : {}),\n parameters: options.parameters,\n matrix: options.matrix,\n startedAt,\n };\n}\n\n/** Recording a secondary error must never mask the original failure or block cleanup. */\nasync function tryEmitError(\n error: unknown,\n emitRunner: (event: RunnerEvent) => Promise<void>,\n now: () => Date,\n): Promise<void> {\n try {\n await emitRunner({\n kind: 'error',\n error: recordError(error),\n timestamp: now().toISOString(),\n });\n } catch {\n // A failed report writer cannot prevent cleanup or finalization.\n }\n}\n\n/** Executes one aggregate eval run and its requested isolated trials. */\nasync function executeRun(\n definition: EvalDefinition,\n options: RunEvalOptions,\n): Promise<RunResult> {\n let hasUser = false;\n for (const step of definition.transcript) {\n if (step.kind === 'user') hasUser = true;\n else if (step.kind !== 'agent' && !hasUser)\n throw new Error('Checkpoint requires a preceding user step');\n }\n if (definition.judge && definition.judge === definition.agent)\n throw new Error('Judge agent must be distinct from the agent under test');\n if (options.runId) assertUuid(options.runId, 'runId');\n if (options.trialId) assertUuid(options.trialId, 'trialId');\n const requestedTrials = options.trials ?? definition.policy?.trials ?? 1;\n if (!Number.isInteger(requestedTrials) || requestedTrials < 1) {\n throw new Error(\n `Trial count must be a positive integer; received ${requestedTrials}`,\n );\n }\n if (requestedTrials === 1) return runTrial(definition, options);\n\n const now = options.now ?? (() => new Date());\n const aggregateStartedAt = now();\n const runId = options.runId ?? createId('run');\n const runWriter = await options.report.startRun(\n runMetadata(definition, options, runId, aggregateStartedAt.toISOString()),\n { catalog: options.catalog },\n );\n const trialEffects = Array.from(\n { length: requestedTrials },\n (_, trialIndex) => {\n const trial = Effect.tryPromise({\n try: () =>\n runTrial(definition, {\n ...options,\n runId,\n trialId: createId('trial'),\n trials: 1,\n runWriter,\n trialIndex,\n }),\n catch: (error) => error,\n });\n return options.semaphore\n ? options.semaphore.withPermits(1)(trial)\n : trial;\n },\n );\n const trials = await Effect.runPromise(\n Effect.all(trialEffects, {\n concurrency: options.concurrency ?? 32,\n }),\n );\n const failed = trials.filter(\n (trial) => trial.status !== 'completed' || !trial.scoring?.passed,\n ).length;\n const status = trials.some((trial) => trial.status === 'failed')\n ? 'failed'\n : 'completed';\n const endedAt = now();\n await runWriter.finalize({\n status,\n endedAt: endedAt.toISOString(),\n durationMs: endedAt.getTime() - aggregateStartedAt.getTime(),\n trialCount: trials.length,\n passed: trials.length - failed,\n failed,\n });\n const overallScores = trials\n .map((trial) => trial.scoring?.overall)\n .filter((score): score is number => score !== undefined);\n return {\n ...trials[0]!,\n runId,\n evalId: authoringId(definition),\n status,\n trialCount: trials.length,\n passed: trials.length - failed,\n failed,\n aggregateScoring: {\n passed: trials.length - failed,\n failed,\n passRate: (trials.length - failed) / trials.length,\n ...(overallScores.length\n ? {\n overall:\n overallScores.reduce((sum, score) => sum + score, 0) /\n overallScores.length,\n }\n : {}),\n },\n trials,\n };\n}\n\nasync function runTrial(\n definition: EvalDefinition,\n options: InternalTrialOptions,\n): Promise<RunResult> {\n const now = options.now ?? (() => new Date());\n const runId = options.runId ?? createId('run');\n const trialId = options.trialId ?? createId('trial');\n const startedAt = now().toISOString();\n const selectedRuntime = options.runtime;\n const runtime = selectedRuntime\n ? definition.agent.runtimes?.[selectedRuntime]\n : undefined;\n if (selectedRuntime && !runtime) {\n throw new Error(\n `AUT does not declare the requested ${selectedRuntime} runtime`,\n );\n }\n\n const randomSeed = crypto.getRandomValues(new Uint32Array(1))[0]!;\n const fixtureContext = {\n runId,\n evalId: authoringId(definition),\n trialId,\n trialIndex: options.trialIndex ?? 0,\n metadata: {\n ...definition.metadata,\n randomSeed,\n },\n ...(options.parameters ? { parameters: options.parameters } : {}),\n ...(selectedRuntime ? { runtime: selectedRuntime } : {}),\n } as const;\n const events: TrajectoryEvent[] = [];\n const runWriter =\n options.runWriter ??\n (await options.report.startRun(\n runMetadata(definition, options, runId, startedAt),\n { catalog: options.catalog },\n ));\n const trialWriter = await runWriter.startTrial({\n schemaVersion: 4,\n runId,\n runUri: canonicalId('run', runId),\n trialId,\n trialUri: canonicalId('trial', trialId),\n trialIndex: options.trialIndex ?? 0,\n evalId: definition.id,\n ...(definition.agent.identity ? { aut: definition.agent.identity } : {}),\n parameters: options.parameters,\n matrix: options.matrix,\n startedAt,\n });\n\n let writeChain = Promise.resolve();\n let reportingFailed = false;\n const append = async (event: TrajectoryEvent): Promise<void> => {\n events.push(event);\n writeChain = writeChain.then(() => trialWriter.appendEvent(event));\n try {\n await writeChain;\n } catch (cause) {\n reportingFailed = true;\n throw new ReportError({\n cause,\n message: cause instanceof Error ? cause.message : String(cause),\n });\n }\n };\n const emitRunner = (event: RunnerEvent) =>\n append({ ...event, source: 'runner' });\n const onAutEvent = (event: AutEvent) => append({ ...event, source: 'aut' });\n\n let workspace: TrialWorkspace | undefined;\n let context: AutContext | undefined;\n let primaryError: unknown;\n let closeError: unknown;\n let scoring: TrialScoring | undefined;\n let artifacts: ArtifactEntry[] | undefined;\n let status: RunStatus = 'running';\n const progress: TranscriptProgress = { checkpoints: [], stoppedEarly: false };\n let cleanupError: unknown;\n const workspaceScope = await Effect.runPromise(Scope.make());\n\n try {\n await emitRunner({ kind: 'trial-started', timestamp: now().toISOString() });\n workspace = await runBoundary(\n Effect.acquireRelease(\n Effect.tryPromise({\n try: () =>\n createTrialWorkspace(\n fixtureContext,\n definition.fixtures,\n options.workspaceRoot,\n ),\n catch: (cause) =>\n new FixtureError({\n cause,\n message: cause instanceof Error ? cause.message : String(cause),\n }),\n }),\n (created) =>\n Effect.tryPromise({\n try: () => created.cleanup(),\n catch: (cause) =>\n new FixtureError({\n cause,\n message: cause instanceof Error ? cause.message : String(cause),\n }),\n }).pipe(\n Effect.catchAll((error) =>\n Effect.sync(() => {\n cleanupError = error;\n }).pipe(\n Effect.tap(() =>\n Effect.logError('trial workspace cleanup failed'),\n ),\n ),\n ),\n ),\n ).pipe(Effect.provideService(Scope.Scope, workspaceScope)),\n );\n const trialWorkspace = workspace;\n const trialContext: AutContext = {\n ...fixtureContext,\n workspace: trialWorkspace.artifacts.candidate,\n evaluatorWorkspace: trialWorkspace.artifacts.evaluator,\n };\n context = trialContext;\n // The Effect bracket closes the AUT even when a step or report append fails.\n await runBoundary(\n Effect.acquireUseRelease(\n Effect.tryPromise({\n try: () =>\n definition.agent.start({\n context: trialContext,\n ...(runtime ? { runtime } : {}),\n onEvent: onAutEvent,\n }),\n catch: (cause) =>\n new AutExecutionError({\n cause,\n message: cause instanceof Error ? cause.message : String(cause),\n }),\n }),\n (session) =>\n Effect.tryPromise({\n try: () =>\n executeTranscript(definition, session, {\n context: trialContext,\n artifacts: trialWorkspace.artifacts,\n events,\n now,\n randomSeed,\n emitRunner,\n progress,\n }),\n catch: (cause) => cause,\n }),\n (opened) =>\n Effect.tryPromise({\n try: () => opened.close(),\n catch: (cause) =>\n new AutExecutionError({\n cause,\n message: cause instanceof Error ? cause.message : String(cause),\n }),\n }).pipe(\n Effect.catchAll((error) =>\n Effect.sync(() => {\n closeError = error;\n }).pipe(\n Effect.tap(() => Effect.logError('AUT session close failed')),\n ),\n ),\n ),\n ).pipe(Effect.annotateLogs({ runId, trialId, evalId: definition.id })),\n );\n } catch (error) {\n primaryError = error;\n await tryEmitError(error, emitRunner, now);\n }\n\n if (closeError) {\n if (!primaryError) primaryError = closeError;\n await tryEmitError(closeError, emitRunner, now);\n }\n\n const { checkpoints, stoppedEarly, lastTurn } = progress;\n const scoreResults: ScoreResult[] = [];\n const skippedScorers: string[] = [];\n try {\n await evaluateFinalScorers(definition, {\n context,\n workspace,\n events,\n lastTurn,\n primaryError,\n stoppedEarly,\n reportingFailed,\n results: scoreResults,\n skippedScorers,\n now,\n emitRunner,\n });\n\n scoring = scoreSummary(scoreResults, checkpoints, skippedScorers);\n await trialWriter.writeScores(scoring);\n\n if (workspace) {\n try {\n artifacts = await snapshotCandidateWorkspace(\n workspace.artifacts.candidate.root,\n trialWriter,\n );\n } catch (captureError) {\n if (!primaryError) primaryError = captureError;\n await tryEmitError(captureError, emitRunner, now);\n }\n }\n } catch (error) {\n if (!primaryError) primaryError = error;\n await tryEmitError(error, emitRunner, now);\n } finally {\n await Effect.runPromise(\n Scope.close(workspaceScope, Exit.succeed(undefined)),\n );\n if (cleanupError) {\n if (!primaryError) primaryError = cleanupError;\n await tryEmitError(cleanupError, emitRunner, now);\n }\n }\n\n scoring ??= scoreSummary(scoreResults, checkpoints, skippedScorers);\n if (!primaryError) {\n try {\n await emitRunner({\n kind: 'trial-completed',\n timestamp: now().toISOString(),\n });\n } catch (error) {\n primaryError = error;\n }\n }\n status = primaryError ? 'failed' : 'completed';\n\n const error = primaryError ? recordError(primaryError) : undefined;\n const endedAt = now().toISOString();\n await trialWriter.finalize({\n status,\n endedAt,\n durationMs: new Date(endedAt).getTime() - new Date(startedAt).getTime(),\n scoring,\n ...(artifacts ? { artifacts } : {}),\n ...(error ? { error } : {}),\n });\n if (!options.runWriter) {\n await runWriter.finalize({\n status,\n endedAt,\n trialCount: 1,\n passed: status === 'completed' && scoring.passed ? 1 : 0,\n failed: status === 'failed' || !scoring.passed ? 1 : 0,\n ...(error ? { error } : {}),\n });\n }\n\n return {\n runId,\n runUri: canonicalId('run', runId),\n trialId,\n trialUri: canonicalId('trial', trialId),\n trialIndex: options.trialIndex ?? 0,\n evalId: definition.id,\n status,\n reportLocation: runWriter.location,\n durationMs: new Date(endedAt).getTime() - new Date(startedAt).getTime(),\n scoring,\n ...(error ? { error } : {}),\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { n as asyncIndex, r as createShareApp, t as ShareIndexDb } from "./index-db-vbqEGFaU.mjs";
|
|
2
|
+
import { mkdir, readFile, readdir, rename, writeFile } from "node:fs/promises";
|
|
3
|
+
import { dirname, join, relative, resolve, sep } from "node:path";
|
|
4
|
+
import { Database } from "bun:sqlite";
|
|
5
|
+
//#region ../share/src/fs-files.ts
|
|
6
|
+
/** Result files in a directory, for `evalkit share serve` and tests. */
|
|
7
|
+
function directoryFiles(root) {
|
|
8
|
+
const base = resolve(root);
|
|
9
|
+
const pathFor = (key) => {
|
|
10
|
+
const path = resolve(base, key);
|
|
11
|
+
if (!path.startsWith(`${base}${sep}`)) throw new Error(`Invalid storage key: ${key}`);
|
|
12
|
+
return path;
|
|
13
|
+
};
|
|
14
|
+
return {
|
|
15
|
+
async get(key) {
|
|
16
|
+
try {
|
|
17
|
+
return new Uint8Array(await readFile(pathFor(key)));
|
|
18
|
+
} catch (error) {
|
|
19
|
+
if (error.code === "ENOENT") return null;
|
|
20
|
+
throw error;
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
async put(key, data) {
|
|
24
|
+
const path = pathFor(key);
|
|
25
|
+
await mkdir(dirname(path), { recursive: true });
|
|
26
|
+
const temporary = `${path}.${crypto.randomUUID()}.tmp`;
|
|
27
|
+
await writeFile(temporary, data);
|
|
28
|
+
await rename(temporary, path);
|
|
29
|
+
},
|
|
30
|
+
async *list(prefix) {
|
|
31
|
+
const trimmed = prefix.replace(/\/+$/, "");
|
|
32
|
+
const start = trimmed ? pathFor(trimmed) : base;
|
|
33
|
+
let entries;
|
|
34
|
+
try {
|
|
35
|
+
entries = await readdir(start, {
|
|
36
|
+
withFileTypes: true,
|
|
37
|
+
recursive: true
|
|
38
|
+
});
|
|
39
|
+
} catch (error) {
|
|
40
|
+
if (error.code === "ENOENT") return;
|
|
41
|
+
throw error;
|
|
42
|
+
}
|
|
43
|
+
for (const entry of entries) if (entry.isFile() && !entry.name.endsWith(".tmp")) yield relative(base, join(entry.parentPath, entry.name)).split(sep).join("/");
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
//#endregion
|
|
48
|
+
//#region ../share/src/index-bun.ts
|
|
49
|
+
/** The index in a SQLite file, for `evalkit share serve` and tests. */
|
|
50
|
+
function sqliteIndex(path) {
|
|
51
|
+
const db = new Database(path, { create: true });
|
|
52
|
+
db.run("PRAGMA journal_mode = WAL");
|
|
53
|
+
return asyncIndex(new ShareIndexDb({
|
|
54
|
+
all: (query, ...params) => db.query(query).all(...params),
|
|
55
|
+
run: (query, ...params) => {
|
|
56
|
+
db.query(query).run(...params);
|
|
57
|
+
},
|
|
58
|
+
transaction: (work) => db.transaction(work)()
|
|
59
|
+
}));
|
|
60
|
+
}
|
|
61
|
+
//#endregion
|
|
62
|
+
//#region ../share/src/node.ts
|
|
63
|
+
const TYPES = {
|
|
64
|
+
".js": "text/javascript",
|
|
65
|
+
".css": "text/css",
|
|
66
|
+
".svg": "image/svg+xml",
|
|
67
|
+
".woff2": "font/woff2"
|
|
68
|
+
};
|
|
69
|
+
/** Serve the bundled dashboard from a directory (`dist/dashboard`). */
|
|
70
|
+
function directoryAssets(root) {
|
|
71
|
+
const base = resolve(root);
|
|
72
|
+
return {
|
|
73
|
+
index: () => readFile(join(base, "index.html"), "utf8"),
|
|
74
|
+
async get(path) {
|
|
75
|
+
const file = resolve(base, "assets", path);
|
|
76
|
+
if (!file.startsWith(`${base}${sep}`)) return null;
|
|
77
|
+
try {
|
|
78
|
+
const extension = file.slice(file.lastIndexOf("."));
|
|
79
|
+
return new Response(await readFile(file), { headers: { "content-type": TYPES[extension] ?? "application/octet-stream" } });
|
|
80
|
+
} catch {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/** A share server on Bun: files and `index.sqlite` live in `dir`. */
|
|
87
|
+
async function createDirectoryShareApp(options) {
|
|
88
|
+
await mkdir(options.dir, { recursive: true });
|
|
89
|
+
return createShareApp({
|
|
90
|
+
files: directoryFiles(join(options.dir, "files")),
|
|
91
|
+
index: sqliteIndex(join(options.dir, "index.sqlite")),
|
|
92
|
+
assets: directoryAssets(options.dashboardRoot)
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
//#endregion
|
|
96
|
+
export { directoryFiles as i, directoryAssets as n, sqliteIndex as r, createDirectoryShareApp as t };
|
|
97
|
+
|
|
98
|
+
//# sourceMappingURL=src-DzZueFn3.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"src-DzZueFn3.mjs","names":[],"sources":["../../share/src/fs-files.ts","../../share/src/index-bun.ts","../../share/src/node.ts"],"sourcesContent":["import { mkdir, readFile, readdir, rename, writeFile } from 'node:fs/promises';\nimport { dirname, join, relative, resolve, sep } from 'node:path';\nimport type { ShareFiles } from './files.js';\n\n/** Result files in a directory, for `evalkit share serve` and tests. */\nexport function directoryFiles(root: string): ShareFiles {\n const base = resolve(root);\n const pathFor = (key: string) => {\n const path = resolve(base, key);\n if (!path.startsWith(`${base}${sep}`))\n throw new Error(`Invalid storage key: ${key}`);\n return path;\n };\n return {\n async get(key) {\n try {\n return new Uint8Array(await readFile(pathFor(key)));\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return null;\n throw error;\n }\n },\n async put(key, data) {\n const path = pathFor(key);\n await mkdir(dirname(path), { recursive: true });\n // Write then rename so readers never see a partial file.\n const temporary = `${path}.${crypto.randomUUID()}.tmp`;\n await writeFile(temporary, data);\n await rename(temporary, path);\n },\n async *list(prefix) {\n const trimmed = prefix.replace(/\\/+$/, '');\n const start = trimmed ? pathFor(trimmed) : base;\n let entries;\n try {\n entries = await readdir(start, {\n withFileTypes: true,\n recursive: true,\n });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return;\n throw error;\n }\n for (const entry of entries)\n if (entry.isFile() && !entry.name.endsWith('.tmp'))\n yield relative(base, join(entry.parentPath, entry.name))\n .split(sep)\n .join('/');\n },\n };\n}\n","import { Database } from 'bun:sqlite';\nimport { asyncIndex, ShareIndexDb, type ShareIndex } from './index-db.js';\n\n/** The index in a SQLite file, for `evalkit share serve` and tests. */\nexport function sqliteIndex(path: string): ShareIndex {\n const db = new Database(path, { create: true });\n db.run('PRAGMA journal_mode = WAL');\n return asyncIndex(\n new ShareIndexDb({\n all: (query, ...params) => db.query(query).all(...params) as never,\n run: (query, ...params) => {\n db.query(query).run(...params);\n },\n transaction: (work) => db.transaction(work)(),\n }),\n );\n}\n","import { mkdir, readFile } from 'node:fs/promises';\nimport { join, resolve, sep } from 'node:path';\nimport { createShareApp, type DashboardAssets } from './app.js';\nimport { directoryFiles } from './fs-files.js';\nimport { sqliteIndex } from './index-bun.js';\n\nconst TYPES: Record<string, string> = {\n '.js': 'text/javascript',\n '.css': 'text/css',\n '.svg': 'image/svg+xml',\n '.woff2': 'font/woff2',\n};\n\n/** Serve the bundled dashboard from a directory (`dist/dashboard`). */\nexport function directoryAssets(root: string): DashboardAssets {\n const base = resolve(root);\n return {\n index: () => readFile(join(base, 'index.html'), 'utf8'),\n async get(path) {\n const file = resolve(base, 'assets', path);\n if (!file.startsWith(`${base}${sep}`)) return null;\n try {\n const extension = file.slice(file.lastIndexOf('.'));\n return new Response(await readFile(file), {\n headers: {\n 'content-type': TYPES[extension] ?? 'application/octet-stream',\n },\n });\n } catch {\n return null;\n }\n },\n };\n}\n\n/** A share server on Bun: files and `index.sqlite` live in `dir`. */\nexport async function createDirectoryShareApp(options: {\n dir: string;\n dashboardRoot: string;\n}) {\n await mkdir(options.dir, { recursive: true });\n return createShareApp({\n files: directoryFiles(join(options.dir, 'files')),\n index: sqliteIndex(join(options.dir, 'index.sqlite')),\n assets: directoryAssets(options.dashboardRoot),\n });\n}\n"],"mappings":";;;;;;AAKA,SAAgB,eAAe,MAA0B;CACvD,MAAM,OAAO,QAAQ,IAAI;CACzB,MAAM,WAAW,QAAgB;EAC/B,MAAM,OAAO,QAAQ,MAAM,GAAG;EAC9B,IAAI,CAAC,KAAK,WAAW,GAAG,OAAO,KAAK,GAClC,MAAM,IAAI,MAAM,wBAAwB,KAAK;EAC/C,OAAO;CACT;CACA,OAAO;EACL,MAAM,IAAI,KAAK;GACb,IAAI;IACF,OAAO,IAAI,WAAW,MAAM,SAAS,QAAQ,GAAG,CAAC,CAAC;GACpD,SAAS,OAAO;IACd,IAAK,MAAgC,SAAS,UAAU,OAAO;IAC/D,MAAM;GACR;EACF;EACA,MAAM,IAAI,KAAK,MAAM;GACnB,MAAM,OAAO,QAAQ,GAAG;GACxB,MAAM,MAAM,QAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;GAE9C,MAAM,YAAY,GAAG,KAAK,GAAG,OAAO,WAAW,EAAE;GACjD,MAAM,UAAU,WAAW,IAAI;GAC/B,MAAM,OAAO,WAAW,IAAI;EAC9B;EACA,OAAO,KAAK,QAAQ;GAClB,MAAM,UAAU,OAAO,QAAQ,QAAQ,EAAE;GACzC,MAAM,QAAQ,UAAU,QAAQ,OAAO,IAAI;GAC3C,IAAI;GACJ,IAAI;IACF,UAAU,MAAM,QAAQ,OAAO;KAC7B,eAAe;KACf,WAAW;IACb,CAAC;GACH,SAAS,OAAO;IACd,IAAK,MAAgC,SAAS,UAAU;IACxD,MAAM;GACR;GACA,KAAK,MAAM,SAAS,SAClB,IAAI,MAAM,OAAO,KAAK,CAAC,MAAM,KAAK,SAAS,MAAM,GAC/C,MAAM,SAAS,MAAM,KAAK,MAAM,YAAY,MAAM,IAAI,CAAC,CAAC,CACrD,MAAM,GAAG,CAAC,CACV,KAAK,GAAG;EACjB;CACF;AACF;;;;AC9CA,SAAgB,YAAY,MAA0B;CACpD,MAAM,KAAK,IAAI,SAAS,MAAM,EAAE,QAAQ,KAAK,CAAC;CAC9C,GAAG,IAAI,2BAA2B;CAClC,OAAO,WACL,IAAI,aAAa;EACf,MAAM,OAAO,GAAG,WAAW,GAAG,MAAM,KAAK,CAAC,CAAC,IAAI,GAAG,MAAM;EACxD,MAAM,OAAO,GAAG,WAAW;GACzB,GAAG,MAAM,KAAK,CAAC,CAAC,IAAI,GAAG,MAAM;EAC/B;EACA,cAAc,SAAS,GAAG,YAAY,IAAI,CAAC,CAAC;CAC9C,CAAC,CACH;AACF;;;ACVA,MAAM,QAAgC;CACpC,OAAO;CACP,QAAQ;CACR,QAAQ;CACR,UAAU;AACZ;;AAGA,SAAgB,gBAAgB,MAA+B;CAC7D,MAAM,OAAO,QAAQ,IAAI;CACzB,OAAO;EACL,aAAa,SAAS,KAAK,MAAM,YAAY,GAAG,MAAM;EACtD,MAAM,IAAI,MAAM;GACd,MAAM,OAAO,QAAQ,MAAM,UAAU,IAAI;GACzC,IAAI,CAAC,KAAK,WAAW,GAAG,OAAO,KAAK,GAAG,OAAO;GAC9C,IAAI;IACF,MAAM,YAAY,KAAK,MAAM,KAAK,YAAY,GAAG,CAAC;IAClD,OAAO,IAAI,SAAS,MAAM,SAAS,IAAI,GAAG,EACxC,SAAS,EACP,gBAAgB,MAAM,cAAc,2BACtC,EACF,CAAC;GACH,QAAQ;IACN,OAAO;GACT;EACF;CACF;AACF;;AAGA,eAAsB,wBAAwB,SAG3C;CACD,MAAM,MAAM,QAAQ,KAAK,EAAE,WAAW,KAAK,CAAC;CAC5C,OAAO,eAAe;EACpB,OAAO,eAAe,KAAK,QAAQ,KAAK,OAAO,CAAC;EAChD,OAAO,YAAY,KAAK,QAAQ,KAAK,cAAc,CAAC;EACpD,QAAQ,gBAAgB,QAAQ,aAAa;CAC/C,CAAC;AACH"}
|