@theokit/sdk 4.52.0 → 4.53.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.
Files changed (105) hide show
  1. package/CHANGELOG.md +75 -17
  2. package/dist/{agent-C66BEJGO.cjs → agent-JX5SBYDE.cjs} +14 -13
  3. package/dist/{agent-C66BEJGO.cjs.map → agent-JX5SBYDE.cjs.map} +1 -1
  4. package/dist/{agent-HYQGJTIN.js → agent-ZAGG6ZBS.js} +13 -12
  5. package/dist/{agent-HYQGJTIN.js.map → agent-ZAGG6ZBS.js.map} +1 -1
  6. package/dist/auth/index.cjs +28 -27
  7. package/dist/auth/index.cjs.map +1 -1
  8. package/dist/auth/index.d.cts +15 -0
  9. package/dist/auth/index.d.ts +15 -0
  10. package/dist/auth/index.js +4 -3
  11. package/dist/auth/index.js.map +1 -1
  12. package/dist/chunk-23VZBRDQ.js +147 -0
  13. package/dist/chunk-23VZBRDQ.js.map +1 -0
  14. package/dist/{chunk-YARJG3GV.cjs → chunk-2QMK627M.cjs} +3 -3
  15. package/dist/{chunk-YARJG3GV.cjs.map → chunk-2QMK627M.cjs.map} +1 -1
  16. package/dist/{chunk-LLK2RS6I.cjs → chunk-2VFZQEDW.cjs} +56 -56
  17. package/dist/{chunk-LLK2RS6I.cjs.map → chunk-2VFZQEDW.cjs.map} +1 -1
  18. package/dist/{chunk-YBB66SZZ.js → chunk-2Y5NO2SY.js} +5 -5
  19. package/dist/{chunk-YBB66SZZ.js.map → chunk-2Y5NO2SY.js.map} +1 -1
  20. package/dist/{chunk-V2EJLKGA.js → chunk-2YWWPCGX.js} +4 -3
  21. package/dist/chunk-2YWWPCGX.js.map +1 -0
  22. package/dist/chunk-33L2NVTJ.cjs +177 -0
  23. package/dist/chunk-33L2NVTJ.cjs.map +1 -0
  24. package/dist/{chunk-DU7PBCAM.js → chunk-3SHW7XKK.js} +3 -3
  25. package/dist/{chunk-DU7PBCAM.js.map → chunk-3SHW7XKK.js.map} +1 -1
  26. package/dist/{chunk-J4RY5DTI.js → chunk-634YVZLU.js} +3 -3
  27. package/dist/{chunk-J4RY5DTI.js.map → chunk-634YVZLU.js.map} +1 -1
  28. package/dist/{chunk-T6ZCG5AP.cjs → chunk-BC5EUG7R.cjs} +7 -6
  29. package/dist/chunk-BC5EUG7R.cjs.map +1 -0
  30. package/dist/{chunk-ZNEYQ56O.cjs → chunk-DM6Y5B2G.cjs} +23 -23
  31. package/dist/{chunk-ZNEYQ56O.cjs.map → chunk-DM6Y5B2G.cjs.map} +1 -1
  32. package/dist/{chunk-WVDH34LK.cjs → chunk-FRITRLZQ.cjs} +2 -2
  33. package/dist/chunk-FRITRLZQ.cjs.map +1 -0
  34. package/dist/{chunk-NACDF3PK.js → chunk-HTK54K2J.js} +3 -3
  35. package/dist/{chunk-SDJYLCJK.cjs.map → chunk-HTK54K2J.js.map} +1 -1
  36. package/dist/{chunk-SPZZSAHV.js → chunk-I5OTK2RP.js} +3 -3
  37. package/dist/{chunk-SPZZSAHV.js.map → chunk-I5OTK2RP.js.map} +1 -1
  38. package/dist/{chunk-U3PAW4PL.js → chunk-NAF4L3T6.js} +2 -2
  39. package/dist/chunk-NAF4L3T6.js.map +1 -0
  40. package/dist/chunk-NUEL6RCZ.cjs +155 -0
  41. package/dist/chunk-NUEL6RCZ.cjs.map +1 -0
  42. package/dist/{chunk-ZFARZBOX.js → chunk-NZOR3N4E.js} +11 -11
  43. package/dist/{chunk-ZFARZBOX.js.map → chunk-NZOR3N4E.js.map} +1 -1
  44. package/dist/{chunk-2CD5XUAG.cjs → chunk-QN5N3ZVT.cjs} +5 -5
  45. package/dist/{chunk-2CD5XUAG.cjs.map → chunk-QN5N3ZVT.cjs.map} +1 -1
  46. package/dist/{chunk-OI6RHLGC.cjs → chunk-T5ZWI3MC.cjs} +5 -5
  47. package/dist/{chunk-OI6RHLGC.cjs.map → chunk-T5ZWI3MC.cjs.map} +1 -1
  48. package/dist/{chunk-SDJYLCJK.cjs → chunk-TR4V2LHV.cjs} +3 -3
  49. package/dist/chunk-TR4V2LHV.cjs.map +1 -0
  50. package/dist/chunk-XRI6DXPZ.js +171 -0
  51. package/dist/chunk-XRI6DXPZ.js.map +1 -0
  52. package/dist/{compact-session-AXKDB6FC.cjs → compact-session-6GKIS4SD.cjs} +16 -15
  53. package/dist/{compact-session-AXKDB6FC.cjs.map → compact-session-6GKIS4SD.cjs.map} +1 -1
  54. package/dist/{compact-session-DUAUEFRR.js → compact-session-EJ36VH5I.js} +8 -7
  55. package/dist/{compact-session-DUAUEFRR.js.map → compact-session-EJ36VH5I.js.map} +1 -1
  56. package/dist/cron.cjs +13 -12
  57. package/dist/cron.js +12 -11
  58. package/dist/eval.cjs +16 -15
  59. package/dist/eval.cjs.map +1 -1
  60. package/dist/eval.js +12 -11
  61. package/dist/eval.js.map +1 -1
  62. package/dist/fs-session-store-LIKYT24K.js +10 -0
  63. package/dist/{fs-session-store-2TF3ZWMT.js.map → fs-session-store-LIKYT24K.js.map} +1 -1
  64. package/dist/{fs-session-store-TL4RJTXZ.cjs → fs-session-store-VXXDIBGM.cjs} +5 -5
  65. package/dist/{fs-session-store-TL4RJTXZ.cjs.map → fs-session-store-VXXDIBGM.cjs.map} +1 -1
  66. package/dist/index.cjs +43 -42
  67. package/dist/index.cjs.map +1 -1
  68. package/dist/index.js +14 -13
  69. package/dist/index.js.map +1 -1
  70. package/dist/{inject-session-TASLP5FA.cjs → inject-session-67SF65FC.cjs} +4 -4
  71. package/dist/{inject-session-TASLP5FA.cjs.map → inject-session-67SF65FC.cjs.map} +1 -1
  72. package/dist/{inject-session-RBGOGACE.js → inject-session-HO7FYVCX.js} +3 -3
  73. package/dist/{inject-session-RBGOGACE.js.map → inject-session-HO7FYVCX.js.map} +1 -1
  74. package/dist/internal/auth/api-key-prefix.d.ts +7 -1
  75. package/dist/internal/mcp/oauth.d.ts +1 -0
  76. package/dist/internal/mcp/token-storage.d.ts +1 -0
  77. package/dist/internal/persistence/index.cjs +6 -6
  78. package/dist/internal/persistence/index.js +1 -1
  79. package/dist/internal/persistence/transcript-ops.d.cts +6 -7
  80. package/dist/internal/persistence/transcript-ops.d.ts +6 -7
  81. package/dist/mcp-auth.cjs +299 -0
  82. package/dist/mcp-auth.cjs.map +1 -0
  83. package/dist/mcp-auth.d.cts +17 -0
  84. package/dist/mcp-auth.d.ts +17 -0
  85. package/dist/mcp-auth.js +292 -0
  86. package/dist/mcp-auth.js.map +1 -0
  87. package/dist/models.cjs +11 -10
  88. package/dist/models.cjs.map +1 -1
  89. package/dist/models.js +3 -2
  90. package/dist/models.js.map +1 -1
  91. package/dist/persistence.cjs +16 -7
  92. package/dist/persistence.cjs.map +1 -1
  93. package/dist/persistence.js +11 -2
  94. package/dist/persistence.js.map +1 -1
  95. package/package.json +11 -1
  96. package/dist/chunk-BKRTYDVN.js +0 -312
  97. package/dist/chunk-BKRTYDVN.js.map +0 -1
  98. package/dist/chunk-NACDF3PK.js.map +0 -1
  99. package/dist/chunk-T6ZCG5AP.cjs.map +0 -1
  100. package/dist/chunk-U3PAW4PL.js.map +0 -1
  101. package/dist/chunk-V2EJLKGA.js.map +0 -1
  102. package/dist/chunk-WVDH34LK.cjs.map +0 -1
  103. package/dist/chunk-XK54DTRF.cjs +0 -325
  104. package/dist/chunk-XK54DTRF.cjs.map +0 -1
  105. package/dist/fs-session-store-2TF3ZWMT.js +0 -10
package/dist/eval.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/internal/eval/aggregate.ts","../src/internal/eval/dataset-iter.ts","../src/internal/eval/single-flight.ts","../src/internal/eval/telemetry.ts","../src/internal/eval/trials.ts","../src/internal/eval/runner.ts","../src/internal/eval/assert.ts","../src/internal/eval/code-runner.ts","../src/internal/scorers/levenshtein.ts","../src/internal/scorers/llm-judge.ts","../src/scorers.ts","../src/eval.ts"],"names":["getTracer","diag","readJsonlIds","appendJsonl","getAgentFacade","randomUUID","shellEscapePosix","openRouterMemoryEmbeddingProviderAdapter","LocalSandbox","z"],"mappings":"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","file":"eval.cjs","sourcesContent":["/**\n * D211 — compute `EvalAggregate` from a list of `EvalRowResult`.\n *\n * Pure functions; no IO. p50/p95 computed via sort+index (O(n log n) is\n * fine for v1; eval datasets are bounded by D210 streaming-deferral).\n *\n * @internal\n */\n\nimport type { EvalAggregate, EvalRowResult, PerScorerStats } from \"../../types/eval.js\";\n\nfunction percentile(sorted: number[], p: number): number {\n if (sorted.length === 0) return 0;\n if (sorted.length === 1) return sorted[0] ?? 0;\n // Nearest-rank method: idx = ceil(p/100 * N) - 1\n const idx = Math.max(0, Math.min(sorted.length - 1, Math.ceil((p / 100) * sorted.length) - 1));\n return sorted[idx] ?? 0;\n}\n\nfunction median(sorted: number[]): number {\n if (sorted.length === 0) return 0;\n const mid = Math.floor(sorted.length / 2);\n if (sorted.length % 2 === 0) {\n return ((sorted[mid - 1] ?? 0) + (sorted[mid] ?? 0)) / 2;\n }\n return sorted[mid] ?? 0;\n}\n\nexport function computeAggregate(rows: ReadonlyArray<EvalRowResult>): EvalAggregate {\n if (rows.length === 0) {\n return {\n meanScore: 0,\n medianScore: 0,\n passRatio: 0,\n perScorer: {},\n totalRows: 0,\n errorRows: 0,\n durationMsP50: 0,\n durationMsP95: 0,\n tokensInTotal: 0,\n tokensOutTotal: 0,\n };\n }\n\n const meanScores = rows.map((r) => r.meanScore);\n const sortedMeans = [...meanScores].sort((a, b) => a - b);\n const meanScore = meanScores.reduce((acc, s) => acc + s, 0) / rows.length;\n const medianScore = median(sortedMeans);\n const passRatio = rows.filter((r) => r.meanScore >= 0.5).length / rows.length;\n const errorRows = rows.filter((r) => r.error !== undefined).length;\n\n // Per-scorer rollup: gather all scores by scorer name across all rows.\n const perScorerBuckets = new Map<string, number[]>();\n for (const row of rows) {\n for (const s of row.scores) {\n const bucket = perScorerBuckets.get(s.name) ?? [];\n bucket.push(s.score);\n perScorerBuckets.set(s.name, bucket);\n }\n }\n const perScorer: Record<string, PerScorerStats> = {};\n for (const [name, scores] of perScorerBuckets) {\n const sorted = [...scores].sort((a, b) => a - b);\n perScorer[name] = {\n mean: scores.reduce((acc, s) => acc + s, 0) / scores.length,\n median: median(sorted),\n min: sorted[0] ?? 0,\n max: sorted[sorted.length - 1] ?? 0,\n };\n }\n\n const durations = [...rows.map((r) => r.durationMs)].sort((a, b) => a - b);\n const durationMsP50 = percentile(durations, 50);\n const durationMsP95 = percentile(durations, 95);\n\n const tokensInTotal = rows.reduce((acc, r) => acc + (r.tokensIn ?? 0), 0);\n const tokensOutTotal = rows.reduce((acc, r) => acc + (r.tokensOut ?? 0), 0);\n\n return {\n meanScore,\n medianScore,\n passRatio,\n perScorer,\n totalRows: rows.length,\n errorRows,\n durationMsP50,\n durationMsP95,\n tokensInTotal,\n tokensOutTotal,\n };\n}\n\n/**\n * Clamp a raw scorer return to a safe [0, 1] number. Rejects NaN, ±Infinity,\n * negatives, > 1 (EC-6). Returns a sanitized `{score, reason}` pair.\n *\n * @internal\n */\nexport function clampScore(raw: { score: number; reason?: string }): {\n score: number;\n reason?: string;\n} {\n let score = raw.score;\n let reason = raw.reason;\n if (!Number.isFinite(score)) {\n score = 0;\n reason = reason ?? \"score_not_finite\";\n } else if (score < 0) {\n score = 0;\n reason = reason ?? \"score_below_zero\";\n } else if (score > 1) {\n score = 1;\n reason = reason ?? \"score_above_one\";\n }\n return reason === undefined ? { score } : { score, reason };\n}\n","/**\n * D210 — normalize `Dataset` (array OR factory-of-iterable) into a\n * concrete `AsyncIterable<DatasetEntry>`. Then the runner materializes\n * the list (v1 doesn't stream the aggregate).\n *\n * @internal\n */\n\nimport type { Dataset, DatasetEntry } from \"../../types/eval.js\";\n\nexport async function* normalizeDataset(d: Dataset): AsyncGenerator<DatasetEntry, void, void> {\n if (Array.isArray(d)) {\n for (const entry of d) yield entry;\n return;\n }\n if (typeof d === \"function\") {\n const iterable = d();\n for await (const entry of iterable as AsyncIterable<DatasetEntry> | Iterable<DatasetEntry>) {\n yield entry;\n }\n return;\n }\n throw new Error(\n `Invalid dataset shape: expected Array<DatasetEntry> OR (() => Iterable<DatasetEntry> | AsyncIterable<DatasetEntry>); got ${typeof d}`,\n );\n}\n\nexport async function materializeDataset(d: Dataset): Promise<DatasetEntry[]> {\n const out: DatasetEntry[] = [];\n for await (const entry of normalizeDataset(d)) out.push(entry);\n return out;\n}\n","/**\n * D213 — single-flight guard for `Eval.run`. Module-level `Set<string>`\n * tracks running names; `acquire` throws on collision; `release` is\n * idempotent.\n *\n * @internal\n */\n\nconst RUNNING = new Set<string>();\n\nexport class EvalAlreadyRunningError extends Error {\n override readonly name = \"EvalAlreadyRunningError\";\n readonly evalName: string;\n constructor(evalName: string) {\n super(\n `Eval \"${evalName}\" is already running in this process. Use a unique name per concurrent run (D213).`,\n );\n this.evalName = evalName;\n }\n}\n\nexport function acquireSingleFlight(name: string): void {\n if (RUNNING.has(name)) {\n throw new EvalAlreadyRunningError(name);\n }\n RUNNING.add(name);\n}\n\nexport function releaseSingleFlight(name: string): void {\n RUNNING.delete(name);\n}\n\n/** Test-only — clears the running set. NOT exported via barrel. */\nexport function __resetSingleFlightForTests(): void {\n RUNNING.clear();\n}\n","/**\n * D206 — minimal OTel piggyback for `Eval.run`. Emits a parent `eval.run`\n * span when available; child `agent.send` spans (existing per D34) nest\n * correctly when OTel context is active.\n *\n * @internal\n */\n\nimport { getTracer, resetTracerCacheForTests, type SpanLike } from \"../telemetry/tracer-loader.js\";\n\nconst TRACER_NAME = \"theokit-sdk-eval\";\n\nexport interface EvalTelemetryHandle {\n setAttribute(key: string, value: string | number | boolean): void;\n end(): void;\n}\n\nconst NOOP_HANDLE: EvalTelemetryHandle = {\n setAttribute: () => undefined,\n end: () => undefined,\n};\n\nfunction safe<T>(fn: () => T, fallback: T): T {\n try {\n return fn();\n } catch {\n return fallback;\n }\n}\n\n/**\n * Start an `eval.run` span. Returns a handle whose `end()` MUST be called\n * in `finally`. When OTel is unavailable, returns a no-op.\n */\nexport function startEvalRunSpan(attrs: {\n name: string;\n id: string;\n rows: number;\n concurrency: number;\n}): EvalTelemetryHandle {\n const tracer = getTracer(TRACER_NAME);\n if (tracer === undefined) return NOOP_HANDLE;\n const span: SpanLike | undefined = safe(\n () =>\n tracer.startSpan(\"eval.run\", {\n attributes: {\n \"eval.name\": attrs.name,\n \"eval.id\": attrs.id,\n \"eval.rows.total\": attrs.rows,\n \"eval.concurrency\": attrs.concurrency,\n },\n }),\n undefined,\n );\n if (span === undefined) return NOOP_HANDLE;\n return {\n setAttribute: (key, value) => safe(() => span.setAttribute(key, value), undefined),\n end: () => safe(() => span.end(), undefined),\n };\n}\n\n/** Test-only — clears the tracer cache so a re-load happens. */\nexport function __resetEvalOtelCacheForTests(): void {\n resetTracerCacheForTests();\n}\n","/**\n * SE41 — trial expansion + collapse for `EvalOptions.trials`.\n *\n * Strategy: EXPAND each dataset entry into `trials` tagged copies, run them\n * through the existing execution paths untouched, then COLLAPSE the resulting\n * per-trial rows back into one row per original entry. Per-scorer score is the\n * mean over the trials — an errored trial contributes 0 (a reliability signal),\n * so the denominator is always `trials`, not the count of successful trials.\n *\n * @internal\n */\n\nimport type { DatasetEntry, EvalRowResult } from \"../../types/eval.js\";\n\n/** Reserved metadata key: the original dataset-row index a trial belongs to. */\nexport const TRIAL_INDEX_KEY = \"__evalRowIndex\";\n/** Reserved metadata key: the 0-based trial number within a row. */\nexport const TRIAL_NUM_KEY = \"__evalTrial\";\n\n/** Repeat each entry `trials` times, tagging each copy with its origin + trial number. */\nexport function expandForTrials(\n entries: ReadonlyArray<DatasetEntry>,\n trials: number,\n): DatasetEntry[] {\n const out: DatasetEntry[] = [];\n for (let i = 0; i < entries.length; i += 1) {\n const entry = entries[i];\n if (entry === undefined) continue;\n for (let t = 0; t < trials; t += 1) {\n out.push({\n ...entry,\n metadata: { ...(entry.metadata ?? {}), [TRIAL_INDEX_KEY]: i, [TRIAL_NUM_KEY]: t },\n });\n }\n }\n return out;\n}\n\nfunction stripReserved(\n metadata: Record<string, unknown> | undefined,\n): Record<string, unknown> | undefined {\n if (metadata === undefined) return undefined;\n const { [TRIAL_INDEX_KEY]: _idx, [TRIAL_NUM_KEY]: _trial, ...rest } = metadata;\n return Object.keys(rest).length > 0 ? rest : undefined;\n}\n\nfunction sumDefined(values: ReadonlyArray<number | undefined>): number | undefined {\n const present = values.filter((v): v is number => typeof v === \"number\");\n return present.length > 0 ? present.reduce((acc, v) => acc + v, 0) : undefined;\n}\n\n/** Mean score per scorer across the group, denominator `trials` (errored → 0). */\nfunction meanScoresByScorer(\n group: EvalRowResult[],\n trials: number,\n): Array<{ name: string; score: number; reason: string }> {\n const names: string[] = [];\n const sums = new Map<string, number>();\n for (const row of group) {\n for (const s of row.scores) {\n if (!sums.has(s.name)) {\n names.push(s.name);\n sums.set(s.name, 0);\n }\n sums.set(s.name, (sums.get(s.name) ?? 0) + s.score);\n }\n }\n return names.map((name) => ({\n name,\n score: (sums.get(name) ?? 0) / trials,\n reason: `mean of ${trials} trials`,\n }));\n}\n\nfunction collapseGroup(index: number, group: EvalRowResult[], trials: number): EvalRowResult {\n const first = group[0] as EvalRowResult;\n const scores = meanScoresByScorer(group, trials);\n const allErrored = group.every((r) => r.error !== undefined);\n const meanScore =\n allErrored || scores.length === 0\n ? 0\n : scores.reduce((acc, s) => acc + s.score, 0) / scores.length;\n const firstOk = group.find((r) => r.error === undefined);\n const errorMsg = allErrored ? group.find((r) => r.error !== undefined)?.error : undefined;\n const metadata = stripReserved(first.metadata);\n const tokensIn = sumDefined(group.map((r) => r.tokensIn));\n const tokensOut = sumDefined(group.map((r) => r.tokensOut));\n\n return {\n index,\n input: first.input,\n output: firstOk?.output ?? first.output,\n ...(first.expected !== undefined ? { expected: first.expected } : {}),\n scores,\n meanScore,\n durationMs: group.reduce((acc, r) => acc + r.durationMs, 0),\n ...(tokensIn !== undefined ? { tokensIn } : {}),\n ...(tokensOut !== undefined ? { tokensOut } : {}),\n ...(errorMsg !== undefined ? { error: errorMsg } : {}),\n ...(metadata !== undefined ? { metadata } : {}),\n trialCount: trials,\n };\n}\n\n/** Group per-trial rows by their original entry index and collapse each group. */\nexport function collapseTrials(\n rows: ReadonlyArray<EvalRowResult>,\n trials: number,\n): EvalRowResult[] {\n const groups = new Map<number, EvalRowResult[]>();\n for (const row of rows) {\n const meta = row.metadata as Record<string, unknown> | undefined;\n const origIdx =\n typeof meta?.[TRIAL_INDEX_KEY] === \"number\" ? (meta[TRIAL_INDEX_KEY] as number) : row.index;\n const arr = groups.get(origIdx) ?? [];\n arr.push(row);\n groups.set(origIdx, arr);\n }\n return [...groups.entries()]\n .sort((a, b) => a[0] - b[0])\n .map(([origIdx, group]) => collapseGroup(origIdx, group, trials));\n}\n","/**\n * D204 — Eval execution engine. Orchestrates dataset materialization,\n * `Agent.batch` fanout, scorer application, aggregate computation, and\n * single-flight lifecycle.\n *\n * @internal\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport type { SDKAgent } from \"../../types/agent.js\";\nimport type { BatchOptions, BatchResult } from \"../../types/batch.js\";\nimport type {\n DatasetEntry,\n EvalAggregate,\n EvalHooks,\n EvalOptions,\n EvalPersistOptions,\n EvalRowResult,\n EvalRun,\n EvalRunOptions,\n NamedScorer,\n Score,\n Scorer,\n} from \"../../types/eval.js\";\nimport { diag } from \"../diagnostics.js\";\nimport { appendJsonl, readJsonlIds } from \"../persistence/jsonl.js\";\nimport { getAgentFacade } from \"../runtime/registry/agent-factory-registry.js\";\nimport { clampScore, computeAggregate } from \"./aggregate.js\";\nimport { materializeDataset } from \"./dataset-iter.js\";\nimport { acquireSingleFlight, releaseSingleFlight } from \"./single-flight.js\";\nimport { startEvalRunSpan } from \"./telemetry.js\";\nimport { collapseTrials, expandForTrials } from \"./trials.js\";\n\n/**\n * EC-4: every hook invocation is wrapped here. User code throwing in\n * `afterRow` / `beforeRun` / `afterRun` is caught + warned once to stderr;\n * the run continues.\n */\nfunction safeHook(fn: () => void): void {\n try {\n fn();\n } catch (err) {\n // theokit#147 — through the interceptable channel. The allowlist entry that exempted this file\n // claimed the caller controls the destination; it does not, and an in-process `Eval` run under a\n // TUI corrupted its frame by exactly the mechanism the issue reports.\n diag(`[eval] hook threw (ignored): ${err instanceof Error ? err.message : String(err)}\\n`);\n }\n}\n\nfunction isAgentInstance(value: unknown): value is SDKAgent {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { send?: unknown }).send === \"function\" &&\n typeof (value as { agentId?: unknown }).agentId === \"string\"\n );\n}\n\ninterface NormalizedScorer {\n name: string;\n score: Scorer;\n}\n\nfunction normalizeScorers(input: ReadonlyArray<Scorer | NamedScorer>): NormalizedScorer[] {\n return input.map((s, i) => {\n if (typeof s === \"function\") {\n return { name: `scorer-${i}`, score: s };\n }\n return { name: s.name, score: s.score };\n });\n}\n\n/**\n * M6-1 durable-persist sink. `isResumed` answers the pre-execution skip\n * question (success-only); `finalize` applies `classify` + per-row flush the\n * instant a row completes. When neither `persist` nor `classify` is set, both\n * are no-ops and behavior is byte-identical to the pre-M6 runner.\n */\ninterface RowSink {\n isResumed(entry: DatasetEntry, index: number): boolean;\n finalize(row: EvalRowResult): EvalRowResult;\n}\n\n/**\n * A row-shaped probe built from a dataset entry, used to compute `persist.key`\n * BEFORE the agent runs (so a resumed row is skipped without paying for it).\n * A well-behaved `key` reads only durable fields (`input` / `metadata`).\n */\nfunction probeRow(entry: DatasetEntry, index: number): EvalRowResult {\n return {\n index,\n input: entry.input,\n output: \"\",\n ...(entry.expected !== undefined ? { expected: entry.expected } : {}),\n scores: [],\n meanScore: 0,\n durationMs: 0,\n ...(entry.metadata !== undefined ? { metadata: entry.metadata } : {}),\n };\n}\n\n/** Success-only resume key-set: keys of persisted rows that completed without `error`. */\nfunction computeDoneKeys(persist: EvalPersistOptions): Set<string> {\n if (persist.resume !== true) return new Set<string>();\n return readJsonlIds(persist.path, (parsed) =>\n parsed.error === undefined ? persist.key(parsed as unknown as EvalRowResult) : undefined,\n );\n}\n\n/** Append a row without ever aborting the batch on an I/O error (mirror swebench-batch.ts:206). */\nfunction appendRowSafely(path: string, row: EvalRowResult): void {\n try {\n appendJsonl(path, row);\n } catch (err) {\n diag(\n `[eval] persist append failed (ignored): ${err instanceof Error ? err.message : String(err)}\\n`,\n );\n }\n}\n\nfunction makeRowSink(\n persist: EvalPersistOptions | undefined,\n classify: ((row: EvalRowResult) => string) | undefined,\n): RowSink {\n const doneKeys = persist !== undefined ? computeDoneKeys(persist) : new Set<string>();\n return {\n isResumed(entry, index) {\n if (persist === undefined || doneKeys.size === 0) return false;\n return doneKeys.has(persist.key(probeRow(entry, index)));\n },\n finalize(row) {\n const outcome = classify?.(row);\n const finalRow = outcome !== undefined ? { ...row, outcome } : row;\n if (persist !== undefined) appendRowSafely(persist.path, finalRow);\n return finalRow;\n },\n };\n}\n\nasync function applyScorer(\n scorer: NormalizedScorer,\n output: string,\n expected: unknown,\n): Promise<{ name: string; score: number; reason?: string }> {\n let raw: Score;\n try {\n const result = scorer.score(output, expected);\n raw = result instanceof Promise ? await result : result;\n } catch (err) {\n return {\n name: scorer.name,\n score: 0,\n reason: `scorer_threw: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n const clamped = clampScore(raw);\n return clamped.reason === undefined\n ? { name: scorer.name, score: clamped.score }\n : { name: scorer.name, score: clamped.score, reason: clamped.reason };\n}\n\nfunction rowFromBatchResult(\n entry: DatasetEntry,\n batchResult: BatchResult,\n scorerResults: ReadonlyArray<{ name: string; score: number; reason?: string }>,\n index: number,\n): EvalRowResult {\n const meanScore =\n scorerResults.length === 0\n ? 0\n : scorerResults.reduce((acc, s) => acc + s.score, 0) / scorerResults.length;\n const baseFields = {\n index,\n input: entry.input,\n expected: entry.expected,\n durationMs: batchResult.durationMs ?? 0,\n scores: scorerResults,\n meanScore,\n };\n if (batchResult.ok === true) {\n return {\n ...baseFields,\n output: batchResult.result.result ?? \"\",\n ...(entry.metadata !== undefined ? { metadata: entry.metadata } : {}),\n };\n }\n return {\n ...baseFields,\n output: \"\",\n error: batchResult.error.message,\n ...(entry.metadata !== undefined ? { metadata: entry.metadata } : {}),\n };\n}\n\n/**\n * Resolve the agent factory for a given dataset entry, honoring D204's\n * three accepted shapes:\n * - Agent instance → use as-is for every row (shared state).\n * - AgentOptions → wrap into a per-row factory that builds + disposes.\n * - (entry) => Agent → call to get the agent for THIS entry.\n *\n * Returns the `BatchOptions.agent`-shaped factory expected by `Agent.batch`.\n */\nfunction makeAgentForBatch(\n spec: EvalOptions[\"agent\"],\n _entries: ReadonlyArray<DatasetEntry>,\n): BatchOptions {\n // BatchOptions extends AgentOptions; when caller provides an Agent instance,\n // we still need to pass SOMETHING to AgentOptions (model). For the instance\n // case we proxy through a degenerate options shape that we override via the\n // batch's internal agent-factory path — but the simplest correct thing is\n // to call agent.send() directly OUTSIDE batch in that case.\n if (isAgentInstance(spec) || typeof spec === \"function\") {\n // Both cases handled outside Agent.batch (see runEvalLoop).\n throw new Error(\"internal: makeAgentForBatch only handles AgentOptions\");\n }\n return spec as BatchOptions;\n}\n\n/**\n * For Agent-instance OR factory-function shapes, we can't use Agent.batch\n * (which requires AgentOptions to create fresh agents). Run a hand-rolled\n * bounded loop instead.\n */\ntype AgentSpec = SDKAgent | ((entry: DatasetEntry) => SDKAgent | Promise<SDKAgent>);\n\n/** Run a single manual-path slot: skip if resumed, else execute + finalize + record. */\nasync function runManualSlot(\n idx: number,\n entries: ReadonlyArray<DatasetEntry>,\n spec: AgentSpec,\n scorers: ReadonlyArray<NormalizedScorer>,\n sink: RowSink,\n rows: EvalRowResult[],\n onRow: (row: EvalRowResult, index: number) => void,\n): Promise<void> {\n const entry = entries[idx];\n if (entry === undefined) return;\n if (sink.isResumed(entry, idx)) return; // M6-1: already persisted successfully\n const row = sink.finalize(await runOneEntry(spec, entry, idx, scorers));\n rows[idx] = row;\n onRow(row, idx);\n}\n\n/**\n * For Agent-instance OR factory-function shapes, we can't use Agent.batch\n * (which requires AgentOptions to create fresh agents). Run a hand-rolled\n * bounded loop instead.\n */\nasync function runRowsManually(\n entries: ReadonlyArray<DatasetEntry>,\n spec: AgentSpec,\n scorers: ReadonlyArray<NormalizedScorer>,\n concurrency: number,\n signal: AbortSignal | undefined,\n onRow: (row: EvalRowResult, index: number) => void,\n sink: RowSink,\n): Promise<EvalRowResult[]> {\n const rows: EvalRowResult[] = new Array(entries.length);\n const state = { cursor: 0 };\n\n const worker = async (): Promise<void> => {\n while (state.cursor < entries.length) {\n if (signal?.aborted === true) return;\n const idx = state.cursor;\n state.cursor += 1;\n await runManualSlot(idx, entries, spec, scorers, sink, rows, onRow);\n }\n };\n\n const workers = Array.from({ length: Math.min(concurrency, entries.length) }, () => worker());\n await Promise.all(workers);\n return rows.filter((r): r is EvalRowResult => r !== undefined);\n}\n\nasync function executeAgent(\n spec: AgentSpec,\n entry: DatasetEntry,\n): Promise<{ output: string; errorMsg?: string }> {\n try {\n const agent = isAgentInstance(spec) ? spec : await spec(entry);\n const run = await agent.send(entry.input);\n const result = await run.wait();\n if (result.status === \"finished\") return { output: result.result ?? \"\" };\n return { output: \"\", errorMsg: result.error?.message ?? `run ${result.status}` };\n } catch (err) {\n return { output: \"\", errorMsg: err instanceof Error ? err.message : String(err) };\n }\n}\n\nasync function runOneEntry(\n spec: AgentSpec,\n entry: DatasetEntry,\n idx: number,\n scorers: ReadonlyArray<NormalizedScorer>,\n): Promise<EvalRowResult> {\n const t0 = Date.now();\n const { output, errorMsg } = await executeAgent(spec, entry);\n const durationMs = Date.now() - t0;\n const scoreEntries: Array<{ name: string; score: number; reason?: string }> = [];\n if (errorMsg === undefined) {\n for (const scorer of scorers) {\n scoreEntries.push(await applyScorer(scorer, output, entry.expected));\n }\n }\n const meanScore =\n scoreEntries.length === 0\n ? 0\n : scoreEntries.reduce((acc, s) => acc + s.score, 0) / scoreEntries.length;\n return {\n index: idx,\n input: entry.input,\n output,\n ...(entry.expected !== undefined ? { expected: entry.expected } : {}),\n scores: scoreEntries,\n meanScore: errorMsg === undefined ? meanScore : 0,\n durationMs,\n ...(errorMsg !== undefined ? { error: errorMsg } : {}),\n ...(entry.metadata !== undefined ? { metadata: entry.metadata } : {}),\n };\n}\n\n/**\n * AgentOptions path: use Agent.batch for fanout, then apply scorers per result.\n */\nasync function scoreBatchOutput(\n br: { ok: boolean; result?: { result?: string } } | undefined,\n expected: unknown,\n scorers: ReadonlyArray<NormalizedScorer>,\n): Promise<Array<{ name: string; score: number; reason?: string }>> {\n const scoreEntries: Array<{ name: string; score: number; reason?: string }> = [];\n if (br?.ok !== true) return scoreEntries;\n const output = br.result?.result ?? \"\";\n for (const scorer of scorers) {\n scoreEntries.push(await applyScorer(scorer, output, expected));\n }\n return scoreEntries;\n}\n\nasync function runRowsViaBatch(\n entries: ReadonlyArray<DatasetEntry>,\n agentOptions: BatchOptions,\n scorers: ReadonlyArray<NormalizedScorer>,\n concurrency: number,\n signal: AbortSignal | undefined,\n onRow: (row: EvalRowResult, index: number) => void,\n sink: RowSink,\n): Promise<EvalRowResult[]> {\n // M6-1: resumed rows are filtered out BEFORE the batch so they cost nothing.\n const pending: Array<{ entry: DatasetEntry; index: number }> = [];\n for (let i = 0; i < entries.length; i += 1) {\n const entry = entries[i];\n if (entry === undefined) continue;\n if (sink.isResumed(entry, i)) continue;\n pending.push({ entry, index: i });\n }\n const batchOpts: BatchOptions = {\n ...agentOptions,\n concurrency,\n ...(signal !== undefined ? { signal } : {}),\n };\n const batchResults = await getAgentFacade().batch(\n pending.map((p) => p.entry.input),\n batchOpts,\n );\n const rows: EvalRowResult[] = [];\n for (let i = 0; i < batchResults.length; i += 1) {\n const slot = pending[i];\n const br = batchResults[i];\n if (slot === undefined || br === undefined) continue;\n const scoreEntries = await scoreBatchOutput(br, slot.entry.expected, scorers);\n const row = sink.finalize(rowFromBatchResult(slot.entry, br, scoreEntries, slot.index));\n rows.push(row);\n onRow(row, slot.index);\n }\n return rows;\n}\n\nexport async function runEval(\n options: EvalOptions,\n runOpts: EvalRunOptions | undefined,\n): Promise<EvalRun> {\n acquireSingleFlight(options.name);\n const id = randomUUID();\n const startedAt = Date.now();\n const entries = await materializeDataset(options.dataset);\n const materialized: DatasetEntry[] = entries.map((e) => ({ ...e }));\n // SE41: with trials > 1, run each entry N times (tagged), then collapse.\n const trials = options.trials ?? 1;\n const indexed: DatasetEntry[] = trials > 1 ? expandForTrials(materialized, trials) : materialized;\n const scorers = normalizeScorers(options.scorers);\n const concurrency = options.concurrency ?? 4;\n const signal = runOpts?.signal;\n // D206 — open `eval.run` span (no-op when OTel unavailable). MUST end in finally.\n const span = startEvalRunSpan({\n name: options.name,\n id,\n rows: entries.length,\n concurrency,\n });\n try {\n const hooks: EvalHooks | undefined = options.hooks;\n safeHook(() => hooks?.beforeRun?.({ name: options.name, totalEstimate: entries.length }));\n\n const onRow = (row: EvalRowResult, i: number): void => {\n safeHook(() => hooks?.afterRow?.(row, i));\n };\n // M6-1: durable per-row persist + resume + classify (no-op when unset).\n const sink = makeRowSink(runOpts?.persist, runOpts?.classify);\n\n let rows: EvalRowResult[];\n if (isAgentInstance(options.agent) || typeof options.agent === \"function\") {\n rows = await runRowsManually(\n indexed,\n options.agent as SDKAgent | ((entry: DatasetEntry) => SDKAgent | Promise<SDKAgent>),\n scorers,\n concurrency,\n signal,\n onRow,\n sink,\n );\n } else {\n const batchOpts = makeAgentForBatch(options.agent, indexed);\n rows = await runRowsViaBatch(indexed, batchOpts, scorers, concurrency, signal, onRow, sink);\n }\n\n // SE41: collapse per-trial rows back to one row per dataset entry.\n const finalRows = trials > 1 ? collapseTrials(rows, trials) : rows;\n const aggregate: EvalAggregate = computeAggregate(finalRows);\n const endedAt = Date.now();\n const run: EvalRun = {\n id,\n name: options.name,\n startedAt,\n endedAt,\n durationMs: endedAt - startedAt,\n aggregate,\n rows: finalRows,\n ...(options.metadata !== undefined ? { metadata: options.metadata } : {}),\n };\n safeHook(() => hooks?.afterRun?.(run));\n // Annotate the span with final aggregate metrics (D206 / D211).\n span.setAttribute(\"eval.aggregate.meanScore\", run.aggregate.meanScore);\n span.setAttribute(\"eval.aggregate.errorRows\", run.aggregate.errorRows);\n span.setAttribute(\"eval.aggregate.durationMsP95\", run.aggregate.durationMsP95);\n span.setAttribute(\"eval.aggregate.tokensInTotal\", run.aggregate.tokensInTotal);\n return run;\n } finally {\n span.end();\n releaseSingleFlight(options.name);\n }\n}\n","/**\n * SE41 — `assertEval(run, thresholds)`: the CI gate for evals.\n *\n * A pure function over a completed {@link EvalRun}. It reads only\n * `run.aggregate`, collects EVERY unmet threshold (not just the first), and\n * throws {@link EvalThresholdError} carrying the full failure list. Passing\n * silently returns `void` — drop it straight into a Vitest `it(...)` or a\n * standalone eval script whose non-zero exit fails the CI job.\n *\n * @public\n */\n\nimport type { EvalRun, EvalThresholdFailure, EvalThresholds } from \"../../types/eval.js\";\n\n/** Thrown by {@link assertEval} when a run misses one or more thresholds. */\nexport class EvalThresholdError extends Error {\n override readonly name = \"EvalThresholdError\";\n /** The eval's name (`EvalRun.name`). */\n readonly evalName: string;\n /** Every unmet threshold, in check order. */\n readonly failures: readonly EvalThresholdFailure[];\n\n constructor(evalName: string, failures: readonly EvalThresholdFailure[]) {\n const lines = failures.map(\n (f) =>\n ` - ${f.metric}: required ${f.threshold}, got ${\n Number.isNaN(f.actual) ? \"n/a (scorer absent)\" : f.actual\n }`,\n );\n super(\n `Eval \"${evalName}\" failed ${failures.length} threshold${failures.length === 1 ? \"\" : \"s\"}:\\n${lines.join(\"\\n\")}`,\n );\n this.evalName = evalName;\n this.failures = failures;\n }\n}\n\n/** `actual < threshold` ⇒ a failure for a floor metric, else `undefined`. */\nfunction floor(\n metric: string,\n actual: number,\n threshold: number | undefined,\n): EvalThresholdFailure | undefined {\n if (threshold === undefined || actual >= threshold) return undefined;\n return { metric, threshold, actual };\n}\n\n/** Per-scorer floor checks (an absent named scorer is a failure with NaN actual). */\nfunction perScorerFailures(\n perScorer: EvalRun[\"aggregate\"][\"perScorer\"],\n thresholds: Readonly<Record<string, number>> | undefined,\n): EvalThresholdFailure[] {\n if (thresholds === undefined) return [];\n const out: EvalThresholdFailure[] = [];\n for (const [name, min] of Object.entries(thresholds)) {\n const stats = perScorer[name];\n if (stats === undefined || stats.mean < min) {\n out.push({\n metric: `perScorer.${name}`,\n threshold: min,\n actual: stats === undefined ? Number.NaN : stats.mean,\n });\n }\n }\n return out;\n}\n\n/**\n * Assert a run meets every set threshold. Throws {@link EvalThresholdError}\n * with the complete list of failures when it does not; returns `void` on pass.\n */\nexport function assertEval(run: EvalRun, thresholds: EvalThresholds): void {\n const a = run.aggregate;\n const errorRatio = a.totalRows > 0 ? a.errorRows / a.totalRows : 0;\n const ceiling =\n thresholds.maxErrorRatio !== undefined && errorRatio > thresholds.maxErrorRatio\n ? { metric: \"errorRatio\", threshold: thresholds.maxErrorRatio, actual: errorRatio }\n : undefined;\n\n const failures = [\n floor(\"meanScore\", a.meanScore, thresholds.minMeanScore),\n floor(\"passRatio\", a.passRatio, thresholds.minPassRatio),\n ceiling,\n ...perScorerFailures(a.perScorer, thresholds.perScorer),\n ].filter((f): f is EvalThresholdFailure => f !== undefined);\n\n if (failures.length > 0) {\n throw new EvalThresholdError(run.name, failures);\n }\n}\n","/**\n * M6-4 — capture an agent's code change as a gradeable artifact.\n *\n * After an agent mutates a provisioned repo, `captureArtifact` records the\n * working-tree `git diff` and validates it is coherent with the tree via a\n * reverse `git apply --check` (no re-clone needed). The resulting\n * `{ diff, applies }` becomes `EvalRowResult.artifact`, the input the Phase 5\n * verify-gate grades. Every command rides {@link SandboxBackend.execute}\n * (ADR D2 — portable across Local/Docker/E2B).\n *\n * reference: knowledge-base/references/theocode-eval/lib/swebench-batch.ts:154\n * (build prediction from captured diff), :157 (reverse apply-check on the\n * mutated tree).\n *\n * Re-exported from `@theokit/sdk/eval` for consumers composing a code-eval\n * harness.\n *\n * @public\n */\n\nimport { shellEscapePosix } from \"../../sandbox/shell-escape.js\";\nimport type { SandboxBackend } from \"../../sandbox/types.js\";\n\n/** Temp filename for the captured patch, written inside the repo dir. */\nconst ARTIFACT_PATCH = \".theo-artifact.patch\";\n\n/**\n * Capture the working-tree diff of `repoDir` and check it reverse-applies.\n * An empty diff (clean tree) returns `{ diff: \"\", applies: false }`.\n */\nexport async function captureArtifact(\n sandbox: SandboxBackend,\n repoDir: string,\n): Promise<{ diff: string; applies: boolean }> {\n const dir = shellEscapePosix(repoDir);\n const diffRes = await sandbox.execute(`git -C ${dir} diff`);\n const diff = diffRes.stdout;\n if (diff.length === 0) return { diff: \"\", applies: false };\n\n // Write the patch into the repo and reverse-apply-check it against the\n // mutated tree — confirms the diff is coherent without re-cloning.\n await sandbox.uploadFile(`${repoDir}/${ARTIFACT_PATCH}`, diff);\n const check = await sandbox.execute(\n `git -C ${dir} apply --check --reverse ${shellEscapePosix(ARTIFACT_PATCH)}`,\n );\n return { diff, applies: check.exitCode === 0 };\n}\n","/**\n * SE41 — Levenshtein edit distance for `Scorers.levenshtein`.\n *\n * Classic two-row dynamic-programming distance (O(n) memory). Callers MUST\n * bound input length via {@link LEVENSHTEIN_MAX_LEN} before calling — the\n * algorithm is O(n*m) time, so unbounded LLM output would be a DoS vector.\n *\n * @internal\n */\n\n/** Max per-string length the fuzzy scorer will process (bounds O(n*m) cost). */\nexport const LEVENSHTEIN_MAX_LEN = 4000;\n\n/** Compute DP row `i` from the previous row (extracted to keep each fn simple). */\nfunction nextRow(prev: number[], rowIndex: number, ai: number, b: string): number[] {\n const curr: number[] = [rowIndex];\n for (let j = 1; j <= b.length; j += 1) {\n const cost = ai === b.charCodeAt(j - 1) ? 0 : 1;\n curr[j] = Math.min((prev[j] ?? 0) + 1, (curr[j - 1] ?? 0) + 1, (prev[j - 1] ?? 0) + cost);\n }\n return curr;\n}\n\n/** Minimum single-edit distance between `a` and `b` (two-row DP, O(n) memory). */\nexport function levenshteinDistance(a: string, b: string): number {\n const m = a.length;\n const n = b.length;\n if (m === 0) return n;\n if (n === 0) return m;\n\n let prev: number[] = [];\n for (let j = 0; j <= n; j += 1) prev[j] = j;\n for (let i = 1; i <= m; i += 1) prev = nextRow(prev, i, a.charCodeAt(i - 1), b);\n return prev[n] ?? 0;\n}\n","/**\n * LLM-as-judge scorer implementation (ADR D205).\n *\n * Builds a transient agent with the judge model + apiKey, calls the public\n * Agent facade's `prompt` (via the `getAgentFacade()` inversion seam) with a\n * structured judge prompt, parses score from the response. Returns 0 (with\n * diagnostic reason) on any parse failure.\n *\n * @internal\n */\n\nimport type { ModelSelection } from \"../../types/agent.js\";\nimport type { Score } from \"../../types/eval.js\";\nimport type { ProviderRoutingSettings } from \"../../types/providers.js\";\nimport { getAgentFacade } from \"../runtime/registry/agent-factory-registry.js\";\n\nexport interface LlmJudgeOptions {\n readonly model: ModelSelection;\n readonly apiKey: string;\n readonly criteria: string;\n /** \"continuous\" → [0, 1] real number. \"discrete\" → 0 or 1 only. Default: continuous. */\n readonly rubric?: \"continuous\" | \"discrete\";\n readonly providers?: ProviderRoutingSettings;\n}\n\nfunction buildPrompt(\n subject: string,\n criteria: string,\n rubric: \"continuous\" | \"discrete\",\n expected: unknown,\n): string {\n const scoreHint =\n rubric === \"discrete\" ? \"between 0 and 1 (use 0 for fail, 1 for pass)\" : \"between 0.0 and 1.0\";\n const expectedBlock =\n expected !== undefined ? `EXPECTED (reference): ${JSON.stringify(expected)}\\n\\n` : \"\";\n return [\n \"You are evaluating an AI assistant's output.\",\n \"\",\n `CRITERIA: ${criteria}`,\n \"\",\n `${expectedBlock}ACTUAL OUTPUT:`,\n '\"\"\"',\n subject,\n '\"\"\"',\n \"\",\n `Reply with EXACTLY this JSON object on a single line:`,\n `{\"score\": <number ${scoreHint}>, \"reason\": \"<one short sentence>\"}`,\n \"\",\n \"Reply with the JSON object ONLY. No preface, no explanation outside the JSON.\",\n ].join(\"\\n\");\n}\n\n/**\n * EC-8: regex is GENEROUS — accepts the JSON object even when the model\n * wraps it in markdown fences (```json ... ```) or prose around it.\n */\nconst SCORE_REGEX = /\\{\\s*\"score\"\\s*:\\s*([0-9]*\\.?[0-9]+)\\s*,\\s*\"reason\"\\s*:\\s*\"([^\"]*)\"\\s*\\}/;\n\nasync function callJudge(\n message: string,\n options: LlmJudgeOptions,\n): Promise<{ ok: true; text: string } | { ok: false; reason: string }> {\n try {\n const result = await getAgentFacade().prompt(message, {\n apiKey: options.apiKey,\n model: options.model,\n local: { cwd: process.cwd(), sandboxOptions: { enabled: false } },\n ...(options.providers !== undefined ? { providers: options.providers } : {}),\n });\n if (result.status === \"finished\") return { ok: true, text: result.result ?? \"\" };\n return { ok: false, reason: `judge_run_failed: ${result.error?.message ?? result.status}` };\n } catch (err) {\n return {\n ok: false,\n reason: `judge_threw: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n}\n\nfunction parseScore(text: string, rubric: \"continuous\" | \"discrete\"): Score {\n const match = SCORE_REGEX.exec(text);\n if (match === null) return { score: 0, reason: \"judge_parse_failed\" };\n const raw = Number(match[1]);\n if (!Number.isFinite(raw)) return { score: 0, reason: \"judge_score_not_finite\" };\n const clamped = rubric === \"discrete\" ? (raw >= 0.5 ? 1 : 0) : Math.max(0, Math.min(1, raw));\n return { score: clamped, reason: match[2] };\n}\n\nexport async function llmJudgeScore(\n options: LlmJudgeOptions & { output: string; expected?: unknown },\n): Promise<Score> {\n const rubric = options.rubric ?? \"continuous\";\n const message = buildPrompt(options.output, options.criteria, rubric, options.expected);\n const judgement = await callJudge(message, options);\n if (!judgement.ok) return { score: 0, reason: judgement.reason };\n return parseScore(judgement.text, rubric);\n}\n","/**\n * Built-in scorers for `Eval.create` (Adoption Roadmap #2, ADR D203).\n *\n * Each scorer is a CURRIED FACTORY: call with config, get back a\n * `NamedScorer` ready to drop into `EvalOptions.scorers[]`.\n *\n * import { Scorers } from \"@theokit/sdk/eval\";\n * const scorers = [\n * Scorers.containsExpected({ caseSensitive: false }),\n * Scorers.regex(/jazz|blues/i),\n * ];\n *\n * @public\n */\n\nimport type { ZodType, z } from \"zod\";\n\nimport { openRouterMemoryEmbeddingProviderAdapter } from \"./internal/memory/adapters/openrouter-embedding.js\";\nimport type { EmbeddingRuntime } from \"./internal/memory/embedding-adapter.js\";\nimport { LEVENSHTEIN_MAX_LEN, levenshteinDistance } from \"./internal/scorers/levenshtein.js\";\nimport { type LlmJudgeOptions, llmJudgeScore } from \"./internal/scorers/llm-judge.js\";\nimport { LocalSandbox } from \"./sandbox/local-sandbox.js\";\nimport { shellEscapePosix } from \"./sandbox/shell-escape.js\";\nimport type { NamedScorer, Score, VerifyGateOptions } from \"./types/eval.js\";\n\n/** EC-2 fix: cap JSON parse input to bound memory. 1 MB is generous for structured output. */\nconst JSON_SHAPE_MAX_BYTES = 1_000_000;\n\n/** SE41 — options for the deterministic fuzzy `Scorers.levenshtein`. */\ninterface LevenshteinOptions {\n /** Case-sensitive compare. Default: false (fuzzy matching is usually case-insensitive). */\n caseSensitive?: boolean;\n /**\n * When set, binarize: `score = normalizedSimilarity >= threshold ? 1 : 0`.\n * When omitted, return the continuous similarity in `[0, 1]`.\n */\n threshold?: number;\n}\n\n/** SE41 — options for the deterministic `Scorers.numericDiff`. */\ninterface NumericDiffOptions {\n /**\n * When set, binarize: `score = |output - expected| <= tolerance ? 1 : 0`.\n * When omitted, return the continuous relative closeness in `[0, 1]`.\n */\n tolerance?: number;\n}\n\n/** SE41 — options for `Scorers.embeddingSimilarity`. */\ninterface EmbeddingSimilarityOptions {\n /** Embedding API key. Defaults to `OPENROUTER_API_KEY` from the environment. */\n apiKey?: string;\n /** Embedding model id (OpenRouter catalog). Default: `openai/text-embedding-3-small`. */\n model?: string;\n /** Override the embeddings HTTP base URL. */\n baseUrl?: string;\n /** When set, binarize: `score = cosine >= threshold ? 1 : 0`. Else continuous. */\n threshold?: number;\n /**\n * Inject an embedding function (DIP): `(texts) => vectors`. When provided, the\n * OpenRouter runtime is NOT constructed — used by tests and custom providers.\n */\n embed?: (texts: ReadonlyArray<string>) => Promise<number[][]>;\n}\n\n/** Cosine similarity of two vectors; 0 when either has zero magnitude. */\nfunction cosineSimilarity(a: ReadonlyArray<number>, b: ReadonlyArray<number>): number {\n const n = Math.min(a.length, b.length);\n let dot = 0;\n let na = 0;\n let nb = 0;\n for (let i = 0; i < n; i += 1) {\n const av = a[i] ?? 0;\n const bv = b[i] ?? 0;\n dot += av * bv;\n na += av * av;\n nb += bv * bv;\n }\n if (na === 0 || nb === 0) return 0;\n return dot / (Math.sqrt(na) * Math.sqrt(nb));\n}\n\n/**\n * Validate + case-normalize a string scorer's `(output, expected)` pair. Returns\n * the normalized pair, or a failure `Score` when `expected` is not a usable\n * string (shared by every string-based scorer — single source for EC-1 parity).\n */\nfunction normalizeStringInputs(\n output: string,\n expected: unknown,\n caseSensitive: boolean,\n): { o: string; e: string } | Score {\n if (typeof expected !== \"string\") return { score: 0, reason: \"expected_not_string\" };\n if (expected.length === 0) return { score: 0, reason: \"expected_empty\" };\n return {\n o: caseSensitive ? output : output.toLowerCase(),\n e: caseSensitive ? expected : expected.toLowerCase(),\n };\n}\n\n/** Module-level scoring body for `Scorers.levenshtein` (keeps the factory flat). */\nfunction scoreLevenshtein(\n output: string,\n expected: unknown,\n caseSensitive: boolean,\n threshold: number | undefined,\n): Score {\n const norm = normalizeStringInputs(output, expected, caseSensitive);\n if (!(\"o\" in norm)) return norm;\n const { o, e } = norm;\n if (o.length > LEVENSHTEIN_MAX_LEN || e.length > LEVENSHTEIN_MAX_LEN) {\n return { score: 0, reason: \"input_too_large\" };\n }\n const sim = 1 - levenshteinDistance(o, e) / Math.max(o.length, e.length, 1);\n if (threshold === undefined) return { score: sim };\n return sim >= threshold ? { score: 1 } : { score: 0, reason: `sim=${sim.toFixed(3)}` };\n}\n\n/** Coerce a value to a finite number, or `undefined` when it is not numeric. */\nfunction toFiniteNumber(value: unknown): number | undefined {\n if (typeof value === \"number\") return Number.isFinite(value) ? value : undefined;\n if (value === undefined || value === null) return undefined;\n const n = Number(String(value).trim());\n return Number.isFinite(n) ? n : undefined;\n}\n\n/** Module-level scoring body for `Scorers.numericDiff`. */\nfunction scoreNumericDiff(output: string, expected: unknown, tolerance: number | undefined): Score {\n const o = toFiniteNumber(output);\n if (o === undefined) return { score: 0, reason: \"output_not_numeric\" };\n const e = toFiniteNumber(expected);\n if (e === undefined) return { score: 0, reason: \"expected_not_numeric\" };\n if (tolerance !== undefined) {\n return Math.abs(o - e) <= tolerance\n ? { score: 1 }\n : { score: 0, reason: `abs_diff=${Math.abs(o - e)}` };\n }\n const denom = Math.max(Math.abs(o), Math.abs(e));\n if (denom === 0) return { score: 1 };\n return { score: Math.max(0, 1 - Math.abs(o - e) / denom) };\n}\n\n/** Assemble the OpenRouter adapter options from the scorer opts (omitting undefineds). */\nfunction embedderCreateOptions(opts: EmbeddingSimilarityOptions): {\n model?: string;\n apiKey?: string;\n baseUrl?: string;\n} {\n return {\n ...(opts.model !== undefined ? { model: opts.model } : {}),\n ...(opts.apiKey !== undefined ? { apiKey: opts.apiKey } : {}),\n ...(opts.baseUrl !== undefined ? { baseUrl: opts.baseUrl } : {}),\n };\n}\n\n/** Build the default (OpenRouter-backed) embedder for `embeddingSimilarity`. */\nfunction makeDefaultEmbedder(\n opts: EmbeddingSimilarityOptions,\n): (texts: ReadonlyArray<string>) => Promise<number[][]> {\n let runtime: Promise<EmbeddingRuntime> | undefined;\n return (texts) => {\n if (runtime === undefined) {\n runtime = openRouterMemoryEmbeddingProviderAdapter.create(embedderCreateOptions(opts));\n }\n return runtime.then((rt) => rt.embed(texts));\n };\n}\n\ninterface ExactMatchOptions {\n /** Case-sensitive compare. Default: true. */\n caseSensitive?: boolean;\n}\n\ninterface ContainsExpectedOptions {\n /** Case-sensitive compare. Default: false. */\n caseSensitive?: boolean;\n}\n\ninterface JsonShapeOptions {\n /** Include Zod's error message in the failure reason. Default: false. */\n strict?: boolean;\n}\n\nfunction makeStringScorer(\n name: string,\n caseSensitive: boolean,\n compare: (output: string, expected: string) => Score,\n): NamedScorer {\n return {\n name,\n score: (output, expected): Score => {\n const norm = normalizeStringInputs(output, expected, caseSensitive);\n return \"o\" in norm ? compare(norm.o, norm.e) : norm;\n },\n };\n}\n\nexport const Scorers = {\n /**\n * `output.trim() === expected.trim()`. Refuses empty `expected` (EC-1\n * — two empties would otherwise pass silently).\n */\n exactMatch(opts: ExactMatchOptions = {}): NamedScorer {\n return makeStringScorer(\"exact-match\", opts.caseSensitive ?? true, (o, e) =>\n o.trim() === e.trim() ? { score: 1 } : { score: 0, reason: \"mismatch\" },\n );\n },\n\n /**\n * `output.includes(expected)`. Refuses empty `expected` (EC-1 —\n * `\"\".includes(\"\")` is always `true`, would inflate pass ratio).\n */\n containsExpected(opts: ContainsExpectedOptions = {}): NamedScorer {\n return makeStringScorer(\"contains-expected\", opts.caseSensitive ?? false, (o, e) =>\n o.includes(e) ? { score: 1 } : { score: 0, reason: \"not_found\" },\n );\n },\n\n /**\n * `pattern.test(output)`.\n *\n * **ReDoS caveat (EC-10):** the regex is applied to LLM output, which\n * may be adversarial. Patterns with catastrophic backtracking (e.g.\n * `/(a+)+$/`) can hang the eval. Test your pattern against worst-case\n * inputs before using in production.\n */\n regex(pattern: RegExp): NamedScorer {\n return {\n name: `regex(${pattern.source})`,\n score: (output): Score => {\n const ok = pattern.test(output);\n return ok ? { score: 1 } : { score: 0, reason: \"regex_no_match\" };\n },\n };\n },\n\n /**\n * SE41 — normalized Levenshtein similarity: `1 - editDistance / max(len)`.\n * Deterministic (no LLM), so it always runs in CI. `threshold` binarizes.\n *\n * Refuses empty/non-string `expected` (EC-1 parity) and caps input at\n * {@link LEVENSHTEIN_MAX_LEN} chars to bound the O(n*m) cost on adversarial output.\n */\n levenshtein(opts: LevenshteinOptions = {}): NamedScorer {\n const caseSensitive = opts.caseSensitive ?? false;\n const { threshold } = opts;\n return {\n name: threshold !== undefined ? `levenshtein(>=${threshold})` : \"levenshtein\",\n score: (output, expected): Score =>\n scoreLevenshtein(output, expected, caseSensitive, threshold),\n };\n },\n\n /**\n * SE41 — numeric closeness. Parses `output` and `expected` as numbers and\n * scores continuous relative closeness `1 - |o-e| / max(|o|,|e|)` (both 0 ⇒ 1),\n * or a binary pass when `tolerance` is set. Deterministic (no LLM).\n */\n numericDiff(opts: NumericDiffOptions = {}): NamedScorer {\n const { tolerance } = opts;\n return {\n name: \"numeric-diff\",\n score: (output, expected): Score => scoreNumericDiff(output, expected, tolerance),\n };\n },\n\n /**\n * SE41 — semantic similarity via embeddings: cosine of `embed(output)` vs\n * `embed(expected)`, clamped to `[0, 1]` (negatives → 0). `threshold` binarizes.\n *\n * By default routes through OpenRouter's embeddings endpoint\n * (`OPENROUTER_API_KEY`); inject `embed` to use another provider or to test\n * deterministically. Each scored row costs one embeddings call.\n */\n embeddingSimilarity(opts: EmbeddingSimilarityOptions): NamedScorer {\n const { threshold } = opts;\n const embed = opts.embed ?? makeDefaultEmbedder(opts);\n return {\n name:\n threshold !== undefined ? `embedding-similarity(>=${threshold})` : \"embedding-similarity\",\n score: async (output, expected): Promise<Score> => {\n if (typeof expected !== \"string\") return { score: 0, reason: \"expected_not_string\" };\n const [vo, ve] = await embed([output, expected]);\n if (vo === undefined || ve === undefined) return { score: 0, reason: \"embed_failed\" };\n const score = Math.max(0, cosineSimilarity(vo, ve));\n if (threshold === undefined) return { score };\n return score >= threshold ? { score: 1 } : { score: 0, reason: `cos=${score.toFixed(3)}` };\n },\n };\n },\n\n /**\n * Parse `output` as JSON and validate against a Zod schema.\n *\n * - EC-2 fix: output is bounded by `JSON_SHAPE_MAX_BYTES` (1 MB)\n * BEFORE `JSON.parse` to avoid OOM on runaway LLM responses.\n * - `strict: true` includes Zod's first error message in `reason`.\n */\n /**\n * LLM-as-judge scorer (ADR D205).\n *\n * **Cost note (EC-12):** every row with this scorer adds ~1 LLM call\n * for the judge. For 1000 rows × gpt-4o-mini, expect ~2x the baseline\n * token spend. The eval `aggregate.tokensInTotal` only reflects the\n * EVAL agent's tokens, not the judge's — forecast accordingly.\n *\n * **Bias note (D205):** `apiKey` is intentionally separate so callers\n * cannot accidentally judge their own output. Pass a different key\n * (can target the same provider, but explicit by design).\n *\n * **EC-8 (parser robustness):** the regex accepts JSON inside markdown\n * code fences and prose-wrapped JSON — common LLM output shapes.\n */\n llmJudge(opts: LlmJudgeOptions): NamedScorer {\n return {\n name: \"llm-judge\",\n score: (output, expected) => {\n const callOpts: LlmJudgeOptions & { output: string; expected?: unknown } =\n expected !== undefined ? { ...opts, output, expected } : { ...opts, output };\n return llmJudgeScore(callOpts);\n },\n };\n },\n\n /**\n * Verify-gate scorer (M6-2): runs the project's tests in the provisioned\n * repo via `SandboxBackend.execute` and scores `1` iff the command exits `0`,\n * else `0` with the exit code + truncated stderr in `reason`. Grades the\n * artifact captured by `captureArtifact` (D2 — rides `execute`, never a\n * direct `child_process`).\n *\n * SECURITY: `command` is REQUIRED and the caller's builder owns shell-safety\n * of the (potentially untrusted, dataset-derived) test identifiers. There is\n * NO default that runs bare test names — that would interpolate untrusted\n * `failToPass`/`passToPass` straight into a shell. `repoDir` is shell-escaped\n * by the SDK; the test list is the builder's responsibility to render safely.\n *\n * PORTABILITY: the command is wrapped as `cd <repoDir> && <cmd>`, which\n * assumes a shell-backed `SandboxBackend` (LocalSandbox/Docker). A backend\n * that rejects shell metacharacters in `execute` is unsupported for this scorer.\n */\n verifyGate(opts: VerifyGateOptions): NamedScorer {\n const { sandbox = new LocalSandbox(), repoDir, failToPass, passToPass, command } = opts;\n return {\n name: \"verify-gate\",\n score: async (): Promise<Score> => {\n const cmd = command([...failToPass, ...passToPass]).trim();\n if (cmd.length === 0) {\n return { score: 0, reason: \"verify_gate_empty_command\" };\n }\n const r = await sandbox.execute(`cd ${shellEscapePosix(repoDir)} && ${cmd}`);\n if (r.exitCode === 0) return { score: 1 };\n return { score: 0, reason: `exit=${r.exitCode} ${r.stderr.slice(0, 200)}`.trim() };\n },\n };\n },\n\n jsonShape<T extends ZodType>(schema: T, opts: JsonShapeOptions = {}): NamedScorer {\n return {\n name: \"json-shape\",\n score: (output): Score => {\n if (output.length > JSON_SHAPE_MAX_BYTES) {\n return { score: 0, reason: \"output_too_large\" };\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(output);\n } catch {\n return { score: 0, reason: \"invalid_json\" };\n }\n const result = schema.safeParse(parsed);\n if (result.success) return { score: 1 };\n if (opts.strict === true) {\n const issue = (result.error as z.ZodError).issues?.[0];\n return { score: 0, reason: `schema_invalid: ${issue?.message ?? \"?\"}` };\n }\n return { score: 0, reason: \"schema_invalid\" };\n },\n };\n },\n};\n","/**\n * Public `Eval` namespace (Adoption Roadmap #2, ADRs D202-D213).\n *\n * Usage:\n *\n * import { Eval, Scorers } from \"@theokit/sdk/eval\";\n * const run = await Eval.create({\n * name: \"qa-smoke\",\n * dataset: [{ input: \"Say ok\", expected: \"ok\" }],\n * scorers: [Scorers.containsExpected()],\n * agent: { apiKey: process.env.OPENROUTER_API_KEY, model: { id: \"openai/gpt-4o-mini\" } },\n * }).run();\n * console.log(run.aggregate.meanScore);\n *\n * @public\n */\n\n// Bootstrap import: loading this facade must register the public Agent facade\n// into the agent-factory-registry seam, because `internal/eval/runner.ts` and\n// `internal/scorers/llm-judge.ts` resolve it via `getAgentFacade()` at runtime\n// instead of importing `agent.ts` directly (which would invert the\n// public-api -> internal dependency direction). The `@theokit/sdk/eval`\n// sub-path entry would otherwise throw \"Agent facade not registered\".\nimport \"./agent.js\";\nimport { z } from \"zod\";\nimport { runEval } from \"./internal/eval/runner.js\";\nimport type { EvalOptions, EvalRun, EvalRunOptions } from \"./types/eval.js\";\n\nconst EvalOptionsSchema = z.object({\n name: z.string().min(1, \"Eval.name must be non-empty\"),\n // dataset / scorers / agent are validated lightly here; deep validation is\n // structural and lives in the runner (where it's cheap to do once).\n dataset: z.unknown().refine((v) => Array.isArray(v) || typeof v === \"function\", {\n message:\n \"dataset must be an array of DatasetEntry OR a factory returning Iterable/AsyncIterable\",\n }),\n scorers: z.unknown().refine((v) => Array.isArray(v) && v.length >= 1, {\n message: \"scorers must be an array with at least one scorer\",\n }),\n agent: z.unknown().refine((v) => v !== undefined && v !== null, {\n message: \"agent must be an SDKAgent, AgentOptions, or factory function\",\n }),\n // EC-3: concurrency MUST be a finite integer in [1, 64]. Bare `z.number()`\n // would let Infinity / 0 / negatives slip through.\n concurrency: z\n .number()\n .int(\"concurrency must be an integer\")\n .min(1, \"concurrency must be >= 1\")\n .max(64, \"concurrency must be <= 64\")\n .optional(),\n // SE41: trials MUST be a finite integer in [1, 100]. Guards against 0\n // (no-op run) and unbounded fanout that would DoS the provider.\n trials: z\n .number()\n .int(\"trials must be an integer\")\n .min(1, \"trials must be >= 1\")\n .max(100, \"trials must be <= 100\")\n .optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n hooks: z\n .object({\n beforeRun: z.function().optional(),\n afterRow: z.function().optional(),\n afterRun: z.function().optional(),\n })\n .partial()\n .optional(),\n});\n\nexport class Eval {\n private constructor(private readonly options: EvalOptions) {}\n\n /**\n * Construct an Eval. Throws on bad options (empty name, concurrency\n * out of range, empty scorers, etc).\n */\n static create(options: EvalOptions): Eval {\n EvalOptionsSchema.parse(options);\n return new Eval(options);\n }\n\n /**\n * Run the eval. Resolves with a populated {@link EvalRun}. Per D208,\n * row errors are isolated; per D213, two runs with the same name\n * throw `EvalAlreadyRunningError`.\n */\n run(runOpts?: EvalRunOptions): Promise<EvalRun> {\n return runEval(this.options, runOpts);\n }\n}\n\n// SE41: the CI gate — assert a run meets score/error thresholds or throw.\nexport { assertEval, EvalThresholdError } from \"./internal/eval/assert.js\";\n// M6-4: capture an agent's code change as a gradeable artifact (git diff + reverse apply-check).\nexport { captureArtifact } from \"./internal/eval/code-runner.js\";\nexport { EvalAlreadyRunningError } from \"./internal/eval/single-flight.js\";\n// M6-5: generic JSONL dataset loader (schema delegated to the caller's `map`, ADR D3).\nexport { JsonlParseError, loadJsonl } from \"./internal/persistence/jsonl.js\";\nexport { Scorers } from \"./scorers.js\";\nexport type * from \"./types/eval.js\";\n"]}
1
+ {"version":3,"sources":["../src/internal/eval/aggregate.ts","../src/internal/eval/dataset-iter.ts","../src/internal/eval/single-flight.ts","../src/internal/eval/telemetry.ts","../src/internal/eval/trials.ts","../src/internal/eval/runner.ts","../src/internal/eval/assert.ts","../src/internal/eval/code-runner.ts","../src/internal/scorers/levenshtein.ts","../src/internal/scorers/llm-judge.ts","../src/scorers.ts","../src/eval.ts"],"names":["getTracer","diag","readJsonlIds","appendJsonl","getAgentFacade","randomUUID","shellEscapePosix","openRouterMemoryEmbeddingProviderAdapter","LocalSandbox","z"],"mappings":"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","file":"eval.cjs","sourcesContent":["/**\n * D211 — compute `EvalAggregate` from a list of `EvalRowResult`.\n *\n * Pure functions; no IO. p50/p95 computed via sort+index (O(n log n) is\n * fine for v1; eval datasets are bounded by D210 streaming-deferral).\n *\n * @internal\n */\n\nimport type { EvalAggregate, EvalRowResult, PerScorerStats } from \"../../types/eval.js\";\n\nfunction percentile(sorted: number[], p: number): number {\n if (sorted.length === 0) return 0;\n if (sorted.length === 1) return sorted[0] ?? 0;\n // Nearest-rank method: idx = ceil(p/100 * N) - 1\n const idx = Math.max(0, Math.min(sorted.length - 1, Math.ceil((p / 100) * sorted.length) - 1));\n return sorted[idx] ?? 0;\n}\n\nfunction median(sorted: number[]): number {\n if (sorted.length === 0) return 0;\n const mid = Math.floor(sorted.length / 2);\n if (sorted.length % 2 === 0) {\n return ((sorted[mid - 1] ?? 0) + (sorted[mid] ?? 0)) / 2;\n }\n return sorted[mid] ?? 0;\n}\n\nexport function computeAggregate(rows: ReadonlyArray<EvalRowResult>): EvalAggregate {\n if (rows.length === 0) {\n return {\n meanScore: 0,\n medianScore: 0,\n passRatio: 0,\n perScorer: {},\n totalRows: 0,\n errorRows: 0,\n durationMsP50: 0,\n durationMsP95: 0,\n tokensInTotal: 0,\n tokensOutTotal: 0,\n };\n }\n\n const meanScores = rows.map((r) => r.meanScore);\n const sortedMeans = [...meanScores].sort((a, b) => a - b);\n const meanScore = meanScores.reduce((acc, s) => acc + s, 0) / rows.length;\n const medianScore = median(sortedMeans);\n const passRatio = rows.filter((r) => r.meanScore >= 0.5).length / rows.length;\n const errorRows = rows.filter((r) => r.error !== undefined).length;\n\n // Per-scorer rollup: gather all scores by scorer name across all rows.\n const perScorerBuckets = new Map<string, number[]>();\n for (const row of rows) {\n for (const s of row.scores) {\n const bucket = perScorerBuckets.get(s.name) ?? [];\n bucket.push(s.score);\n perScorerBuckets.set(s.name, bucket);\n }\n }\n const perScorer: Record<string, PerScorerStats> = {};\n for (const [name, scores] of perScorerBuckets) {\n const sorted = [...scores].sort((a, b) => a - b);\n perScorer[name] = {\n mean: scores.reduce((acc, s) => acc + s, 0) / scores.length,\n median: median(sorted),\n min: sorted[0] ?? 0,\n max: sorted[sorted.length - 1] ?? 0,\n };\n }\n\n const durations = [...rows.map((r) => r.durationMs)].sort((a, b) => a - b);\n const durationMsP50 = percentile(durations, 50);\n const durationMsP95 = percentile(durations, 95);\n\n const tokensInTotal = rows.reduce((acc, r) => acc + (r.tokensIn ?? 0), 0);\n const tokensOutTotal = rows.reduce((acc, r) => acc + (r.tokensOut ?? 0), 0);\n\n return {\n meanScore,\n medianScore,\n passRatio,\n perScorer,\n totalRows: rows.length,\n errorRows,\n durationMsP50,\n durationMsP95,\n tokensInTotal,\n tokensOutTotal,\n };\n}\n\n/**\n * Clamp a raw scorer return to a safe [0, 1] number. Rejects NaN, ±Infinity,\n * negatives, > 1 (EC-6). Returns a sanitized `{score, reason}` pair.\n *\n * @internal\n */\nexport function clampScore(raw: { score: number; reason?: string }): {\n score: number;\n reason?: string;\n} {\n let score = raw.score;\n let reason = raw.reason;\n if (!Number.isFinite(score)) {\n score = 0;\n reason = reason ?? \"score_not_finite\";\n } else if (score < 0) {\n score = 0;\n reason = reason ?? \"score_below_zero\";\n } else if (score > 1) {\n score = 1;\n reason = reason ?? \"score_above_one\";\n }\n return reason === undefined ? { score } : { score, reason };\n}\n","/**\n * D210 — normalize `Dataset` (array OR factory-of-iterable) into a\n * concrete `AsyncIterable<DatasetEntry>`. Then the runner materializes\n * the list (v1 doesn't stream the aggregate).\n *\n * @internal\n */\n\nimport type { Dataset, DatasetEntry } from \"../../types/eval.js\";\n\nexport async function* normalizeDataset(d: Dataset): AsyncGenerator<DatasetEntry, void, void> {\n if (Array.isArray(d)) {\n for (const entry of d) yield entry;\n return;\n }\n if (typeof d === \"function\") {\n const iterable = d();\n for await (const entry of iterable as AsyncIterable<DatasetEntry> | Iterable<DatasetEntry>) {\n yield entry;\n }\n return;\n }\n throw new Error(\n `Invalid dataset shape: expected Array<DatasetEntry> OR (() => Iterable<DatasetEntry> | AsyncIterable<DatasetEntry>); got ${typeof d}`,\n );\n}\n\nexport async function materializeDataset(d: Dataset): Promise<DatasetEntry[]> {\n const out: DatasetEntry[] = [];\n for await (const entry of normalizeDataset(d)) out.push(entry);\n return out;\n}\n","/**\n * D213 — single-flight guard for `Eval.run`. Module-level `Set<string>`\n * tracks running names; `acquire` throws on collision; `release` is\n * idempotent.\n *\n * @internal\n */\n\nconst RUNNING = new Set<string>();\n\nexport class EvalAlreadyRunningError extends Error {\n override readonly name = \"EvalAlreadyRunningError\";\n readonly evalName: string;\n constructor(evalName: string) {\n super(\n `Eval \"${evalName}\" is already running in this process. Use a unique name per concurrent run (D213).`,\n );\n this.evalName = evalName;\n }\n}\n\nexport function acquireSingleFlight(name: string): void {\n if (RUNNING.has(name)) {\n throw new EvalAlreadyRunningError(name);\n }\n RUNNING.add(name);\n}\n\nexport function releaseSingleFlight(name: string): void {\n RUNNING.delete(name);\n}\n\n/** Test-only — clears the running set. NOT exported via barrel. */\nexport function __resetSingleFlightForTests(): void {\n RUNNING.clear();\n}\n","/**\n * D206 — minimal OTel piggyback for `Eval.run`. Emits a parent `eval.run`\n * span when available; child `agent.send` spans (existing per D34) nest\n * correctly when OTel context is active.\n *\n * @internal\n */\n\nimport { getTracer, resetTracerCacheForTests, type SpanLike } from \"../telemetry/tracer-loader.js\";\n\nconst TRACER_NAME = \"theokit-sdk-eval\";\n\nexport interface EvalTelemetryHandle {\n setAttribute(key: string, value: string | number | boolean): void;\n end(): void;\n}\n\nconst NOOP_HANDLE: EvalTelemetryHandle = {\n setAttribute: () => undefined,\n end: () => undefined,\n};\n\nfunction safe<T>(fn: () => T, fallback: T): T {\n try {\n return fn();\n } catch {\n return fallback;\n }\n}\n\n/**\n * Start an `eval.run` span. Returns a handle whose `end()` MUST be called\n * in `finally`. When OTel is unavailable, returns a no-op.\n */\nexport function startEvalRunSpan(attrs: {\n name: string;\n id: string;\n rows: number;\n concurrency: number;\n}): EvalTelemetryHandle {\n const tracer = getTracer(TRACER_NAME);\n if (tracer === undefined) return NOOP_HANDLE;\n const span: SpanLike | undefined = safe(\n () =>\n tracer.startSpan(\"eval.run\", {\n attributes: {\n \"eval.name\": attrs.name,\n \"eval.id\": attrs.id,\n \"eval.rows.total\": attrs.rows,\n \"eval.concurrency\": attrs.concurrency,\n },\n }),\n undefined,\n );\n if (span === undefined) return NOOP_HANDLE;\n return {\n setAttribute: (key, value) => safe(() => span.setAttribute(key, value), undefined),\n end: () => safe(() => span.end(), undefined),\n };\n}\n\n/** Test-only — clears the tracer cache so a re-load happens. */\nexport function __resetEvalOtelCacheForTests(): void {\n resetTracerCacheForTests();\n}\n","/**\n * SE41 — trial expansion + collapse for `EvalOptions.trials`.\n *\n * Strategy: EXPAND each dataset entry into `trials` tagged copies, run them\n * through the existing execution paths untouched, then COLLAPSE the resulting\n * per-trial rows back into one row per original entry. Per-scorer score is the\n * mean over the trials — an errored trial contributes 0 (a reliability signal),\n * so the denominator is always `trials`, not the count of successful trials.\n *\n * @internal\n */\n\nimport type { DatasetEntry, EvalRowResult } from \"../../types/eval.js\";\n\n/** Reserved metadata key: the original dataset-row index a trial belongs to. */\nexport const TRIAL_INDEX_KEY = \"__evalRowIndex\";\n/** Reserved metadata key: the 0-based trial number within a row. */\nexport const TRIAL_NUM_KEY = \"__evalTrial\";\n\n/** Repeat each entry `trials` times, tagging each copy with its origin + trial number. */\nexport function expandForTrials(\n entries: ReadonlyArray<DatasetEntry>,\n trials: number,\n): DatasetEntry[] {\n const out: DatasetEntry[] = [];\n for (let i = 0; i < entries.length; i += 1) {\n const entry = entries[i];\n if (entry === undefined) continue;\n for (let t = 0; t < trials; t += 1) {\n out.push({\n ...entry,\n metadata: { ...(entry.metadata ?? {}), [TRIAL_INDEX_KEY]: i, [TRIAL_NUM_KEY]: t },\n });\n }\n }\n return out;\n}\n\nfunction stripReserved(\n metadata: Record<string, unknown> | undefined,\n): Record<string, unknown> | undefined {\n if (metadata === undefined) return undefined;\n const { [TRIAL_INDEX_KEY]: _idx, [TRIAL_NUM_KEY]: _trial, ...rest } = metadata;\n return Object.keys(rest).length > 0 ? rest : undefined;\n}\n\nfunction sumDefined(values: ReadonlyArray<number | undefined>): number | undefined {\n const present = values.filter((v): v is number => typeof v === \"number\");\n return present.length > 0 ? present.reduce((acc, v) => acc + v, 0) : undefined;\n}\n\n/** Mean score per scorer across the group, denominator `trials` (errored → 0). */\nfunction meanScoresByScorer(\n group: EvalRowResult[],\n trials: number,\n): Array<{ name: string; score: number; reason: string }> {\n const names: string[] = [];\n const sums = new Map<string, number>();\n for (const row of group) {\n for (const s of row.scores) {\n if (!sums.has(s.name)) {\n names.push(s.name);\n sums.set(s.name, 0);\n }\n sums.set(s.name, (sums.get(s.name) ?? 0) + s.score);\n }\n }\n return names.map((name) => ({\n name,\n score: (sums.get(name) ?? 0) / trials,\n reason: `mean of ${trials} trials`,\n }));\n}\n\nfunction collapseGroup(index: number, group: EvalRowResult[], trials: number): EvalRowResult {\n const first = group[0] as EvalRowResult;\n const scores = meanScoresByScorer(group, trials);\n const allErrored = group.every((r) => r.error !== undefined);\n const meanScore =\n allErrored || scores.length === 0\n ? 0\n : scores.reduce((acc, s) => acc + s.score, 0) / scores.length;\n const firstOk = group.find((r) => r.error === undefined);\n const errorMsg = allErrored ? group.find((r) => r.error !== undefined)?.error : undefined;\n const metadata = stripReserved(first.metadata);\n const tokensIn = sumDefined(group.map((r) => r.tokensIn));\n const tokensOut = sumDefined(group.map((r) => r.tokensOut));\n\n return {\n index,\n input: first.input,\n output: firstOk?.output ?? first.output,\n ...(first.expected !== undefined ? { expected: first.expected } : {}),\n scores,\n meanScore,\n durationMs: group.reduce((acc, r) => acc + r.durationMs, 0),\n ...(tokensIn !== undefined ? { tokensIn } : {}),\n ...(tokensOut !== undefined ? { tokensOut } : {}),\n ...(errorMsg !== undefined ? { error: errorMsg } : {}),\n ...(metadata !== undefined ? { metadata } : {}),\n trialCount: trials,\n };\n}\n\n/** Group per-trial rows by their original entry index and collapse each group. */\nexport function collapseTrials(\n rows: ReadonlyArray<EvalRowResult>,\n trials: number,\n): EvalRowResult[] {\n const groups = new Map<number, EvalRowResult[]>();\n for (const row of rows) {\n const meta = row.metadata as Record<string, unknown> | undefined;\n const origIdx =\n typeof meta?.[TRIAL_INDEX_KEY] === \"number\" ? (meta[TRIAL_INDEX_KEY] as number) : row.index;\n const arr = groups.get(origIdx) ?? [];\n arr.push(row);\n groups.set(origIdx, arr);\n }\n return [...groups.entries()]\n .sort((a, b) => a[0] - b[0])\n .map(([origIdx, group]) => collapseGroup(origIdx, group, trials));\n}\n","/**\n * D204 — Eval execution engine. Orchestrates dataset materialization,\n * `Agent.batch` fanout, scorer application, aggregate computation, and\n * single-flight lifecycle.\n *\n * @internal\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport type { SDKAgent } from \"../../types/agent.js\";\nimport type { BatchOptions, BatchResult } from \"../../types/batch.js\";\nimport type {\n DatasetEntry,\n EvalAggregate,\n EvalHooks,\n EvalOptions,\n EvalPersistOptions,\n EvalRowResult,\n EvalRun,\n EvalRunOptions,\n NamedScorer,\n Score,\n Scorer,\n} from \"../../types/eval.js\";\nimport { diag } from \"../diagnostics.js\";\nimport { appendJsonl, readJsonlIds } from \"../persistence/jsonl.js\";\nimport { getAgentFacade } from \"../runtime/registry/agent-factory-registry.js\";\nimport { clampScore, computeAggregate } from \"./aggregate.js\";\nimport { materializeDataset } from \"./dataset-iter.js\";\nimport { acquireSingleFlight, releaseSingleFlight } from \"./single-flight.js\";\nimport { startEvalRunSpan } from \"./telemetry.js\";\nimport { collapseTrials, expandForTrials } from \"./trials.js\";\n\n/**\n * EC-4: every hook invocation is wrapped here. User code throwing in\n * `afterRow` / `beforeRun` / `afterRun` is caught + warned once to stderr;\n * the run continues.\n */\nfunction safeHook(fn: () => void): void {\n try {\n fn();\n } catch (err) {\n // theokit#147 — through the interceptable channel. The allowlist entry that exempted this file\n // claimed the caller controls the destination; it does not, and an in-process `Eval` run under a\n // TUI corrupted its frame by exactly the mechanism the issue reports.\n diag(`[eval] hook threw (ignored): ${err instanceof Error ? err.message : String(err)}\\n`);\n }\n}\n\nfunction isAgentInstance(value: unknown): value is SDKAgent {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { send?: unknown }).send === \"function\" &&\n typeof (value as { agentId?: unknown }).agentId === \"string\"\n );\n}\n\ninterface NormalizedScorer {\n name: string;\n score: Scorer;\n}\n\nfunction normalizeScorers(input: ReadonlyArray<Scorer | NamedScorer>): NormalizedScorer[] {\n return input.map((s, i) => {\n if (typeof s === \"function\") {\n return { name: `scorer-${i}`, score: s };\n }\n return { name: s.name, score: s.score };\n });\n}\n\n/**\n * M6-1 durable-persist sink. `isResumed` answers the pre-execution skip\n * question (success-only); `finalize` applies `classify` + per-row flush the\n * instant a row completes. When neither `persist` nor `classify` is set, both\n * are no-ops and behavior is byte-identical to the pre-M6 runner.\n */\ninterface RowSink {\n isResumed(entry: DatasetEntry, index: number): boolean;\n finalize(row: EvalRowResult): EvalRowResult;\n}\n\n/**\n * A row-shaped probe built from a dataset entry, used to compute `persist.key`\n * BEFORE the agent runs (so a resumed row is skipped without paying for it).\n * A well-behaved `key` reads only durable fields (`input` / `metadata`).\n */\nfunction probeRow(entry: DatasetEntry, index: number): EvalRowResult {\n return {\n index,\n input: entry.input,\n output: \"\",\n ...(entry.expected !== undefined ? { expected: entry.expected } : {}),\n scores: [],\n meanScore: 0,\n durationMs: 0,\n ...(entry.metadata !== undefined ? { metadata: entry.metadata } : {}),\n };\n}\n\n/** Success-only resume key-set: keys of persisted rows that completed without `error`. */\nfunction computeDoneKeys(persist: EvalPersistOptions): Set<string> {\n if (persist.resume !== true) return new Set<string>();\n return readJsonlIds(persist.path, (parsed) =>\n parsed.error === undefined ? persist.key(parsed as unknown as EvalRowResult) : undefined,\n );\n}\n\n/** Append a row without ever aborting the batch on an I/O error (mirror swebench-batch.ts:206). */\nfunction appendRowSafely(path: string, row: EvalRowResult): void {\n try {\n appendJsonl(path, row);\n } catch (err) {\n diag(\n `[eval] persist append failed (ignored): ${err instanceof Error ? err.message : String(err)}\\n`,\n );\n }\n}\n\nfunction makeRowSink(\n persist: EvalPersistOptions | undefined,\n classify: ((row: EvalRowResult) => string) | undefined,\n): RowSink {\n const doneKeys = persist !== undefined ? computeDoneKeys(persist) : new Set<string>();\n return {\n isResumed(entry, index) {\n if (persist === undefined || doneKeys.size === 0) return false;\n return doneKeys.has(persist.key(probeRow(entry, index)));\n },\n finalize(row) {\n const outcome = classify?.(row);\n const finalRow = outcome !== undefined ? { ...row, outcome } : row;\n if (persist !== undefined) appendRowSafely(persist.path, finalRow);\n return finalRow;\n },\n };\n}\n\nasync function applyScorer(\n scorer: NormalizedScorer,\n output: string,\n expected: unknown,\n): Promise<{ name: string; score: number; reason?: string }> {\n let raw: Score;\n try {\n const result = scorer.score(output, expected);\n raw = result instanceof Promise ? await result : result;\n } catch (err) {\n return {\n name: scorer.name,\n score: 0,\n reason: `scorer_threw: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n const clamped = clampScore(raw);\n return clamped.reason === undefined\n ? { name: scorer.name, score: clamped.score }\n : { name: scorer.name, score: clamped.score, reason: clamped.reason };\n}\n\nfunction rowFromBatchResult(\n entry: DatasetEntry,\n batchResult: BatchResult,\n scorerResults: ReadonlyArray<{ name: string; score: number; reason?: string }>,\n index: number,\n): EvalRowResult {\n const meanScore =\n scorerResults.length === 0\n ? 0\n : scorerResults.reduce((acc, s) => acc + s.score, 0) / scorerResults.length;\n const baseFields = {\n index,\n input: entry.input,\n expected: entry.expected,\n durationMs: batchResult.durationMs ?? 0,\n scores: scorerResults,\n meanScore,\n };\n if (batchResult.ok === true) {\n return {\n ...baseFields,\n output: batchResult.result.result ?? \"\",\n ...(entry.metadata !== undefined ? { metadata: entry.metadata } : {}),\n };\n }\n return {\n ...baseFields,\n output: \"\",\n error: batchResult.error.message,\n ...(entry.metadata !== undefined ? { metadata: entry.metadata } : {}),\n };\n}\n\n/**\n * Resolve the agent factory for a given dataset entry, honoring D204's\n * three accepted shapes:\n * - Agent instance → use as-is for every row (shared state).\n * - AgentOptions → wrap into a per-row factory that builds + disposes.\n * - (entry) => Agent → call to get the agent for THIS entry.\n *\n * Returns the `BatchOptions.agent`-shaped factory expected by `Agent.batch`.\n */\nfunction makeAgentForBatch(\n spec: EvalOptions[\"agent\"],\n _entries: ReadonlyArray<DatasetEntry>,\n): BatchOptions {\n // BatchOptions extends AgentOptions; when caller provides an Agent instance,\n // we still need to pass SOMETHING to AgentOptions (model). For the instance\n // case we proxy through a degenerate options shape that we override via the\n // batch's internal agent-factory path — but the simplest correct thing is\n // to call agent.send() directly OUTSIDE batch in that case.\n if (isAgentInstance(spec) || typeof spec === \"function\") {\n // Both cases handled outside Agent.batch (see runEvalLoop).\n throw new Error(\"internal: makeAgentForBatch only handles AgentOptions\");\n }\n return spec as BatchOptions;\n}\n\n/**\n * For Agent-instance OR factory-function shapes, we can't use Agent.batch\n * (which requires AgentOptions to create fresh agents). Run a hand-rolled\n * bounded loop instead.\n */\ntype AgentSpec = SDKAgent | ((entry: DatasetEntry) => SDKAgent | Promise<SDKAgent>);\n\n/** Run a single manual-path slot: skip if resumed, else execute + finalize + record. */\nasync function runManualSlot(\n idx: number,\n entries: ReadonlyArray<DatasetEntry>,\n spec: AgentSpec,\n scorers: ReadonlyArray<NormalizedScorer>,\n sink: RowSink,\n rows: EvalRowResult[],\n onRow: (row: EvalRowResult, index: number) => void,\n): Promise<void> {\n const entry = entries[idx];\n if (entry === undefined) return;\n if (sink.isResumed(entry, idx)) return; // M6-1: already persisted successfully\n const row = sink.finalize(await runOneEntry(spec, entry, idx, scorers));\n rows[idx] = row;\n onRow(row, idx);\n}\n\n/**\n * For Agent-instance OR factory-function shapes, we can't use Agent.batch\n * (which requires AgentOptions to create fresh agents). Run a hand-rolled\n * bounded loop instead.\n */\nasync function runRowsManually(\n entries: ReadonlyArray<DatasetEntry>,\n spec: AgentSpec,\n scorers: ReadonlyArray<NormalizedScorer>,\n concurrency: number,\n signal: AbortSignal | undefined,\n onRow: (row: EvalRowResult, index: number) => void,\n sink: RowSink,\n): Promise<EvalRowResult[]> {\n const rows: EvalRowResult[] = new Array(entries.length);\n const state = { cursor: 0 };\n\n const worker = async (): Promise<void> => {\n while (state.cursor < entries.length) {\n if (signal?.aborted === true) return;\n const idx = state.cursor;\n state.cursor += 1;\n await runManualSlot(idx, entries, spec, scorers, sink, rows, onRow);\n }\n };\n\n const workers = Array.from({ length: Math.min(concurrency, entries.length) }, () => worker());\n await Promise.all(workers);\n return rows.filter((r): r is EvalRowResult => r !== undefined);\n}\n\nasync function executeAgent(\n spec: AgentSpec,\n entry: DatasetEntry,\n): Promise<{ output: string; errorMsg?: string }> {\n try {\n const agent = isAgentInstance(spec) ? spec : await spec(entry);\n const run = await agent.send(entry.input);\n const result = await run.wait();\n if (result.status === \"finished\") return { output: result.result ?? \"\" };\n return { output: \"\", errorMsg: result.error?.message ?? `run ${result.status}` };\n } catch (err) {\n return { output: \"\", errorMsg: err instanceof Error ? err.message : String(err) };\n }\n}\n\nasync function runOneEntry(\n spec: AgentSpec,\n entry: DatasetEntry,\n idx: number,\n scorers: ReadonlyArray<NormalizedScorer>,\n): Promise<EvalRowResult> {\n const t0 = Date.now();\n const { output, errorMsg } = await executeAgent(spec, entry);\n const durationMs = Date.now() - t0;\n const scoreEntries: Array<{ name: string; score: number; reason?: string }> = [];\n if (errorMsg === undefined) {\n for (const scorer of scorers) {\n scoreEntries.push(await applyScorer(scorer, output, entry.expected));\n }\n }\n const meanScore =\n scoreEntries.length === 0\n ? 0\n : scoreEntries.reduce((acc, s) => acc + s.score, 0) / scoreEntries.length;\n return {\n index: idx,\n input: entry.input,\n output,\n ...(entry.expected !== undefined ? { expected: entry.expected } : {}),\n scores: scoreEntries,\n meanScore: errorMsg === undefined ? meanScore : 0,\n durationMs,\n ...(errorMsg !== undefined ? { error: errorMsg } : {}),\n ...(entry.metadata !== undefined ? { metadata: entry.metadata } : {}),\n };\n}\n\n/**\n * AgentOptions path: use Agent.batch for fanout, then apply scorers per result.\n */\nasync function scoreBatchOutput(\n br: { ok: boolean; result?: { result?: string } } | undefined,\n expected: unknown,\n scorers: ReadonlyArray<NormalizedScorer>,\n): Promise<Array<{ name: string; score: number; reason?: string }>> {\n const scoreEntries: Array<{ name: string; score: number; reason?: string }> = [];\n if (br?.ok !== true) return scoreEntries;\n const output = br.result?.result ?? \"\";\n for (const scorer of scorers) {\n scoreEntries.push(await applyScorer(scorer, output, expected));\n }\n return scoreEntries;\n}\n\nasync function runRowsViaBatch(\n entries: ReadonlyArray<DatasetEntry>,\n agentOptions: BatchOptions,\n scorers: ReadonlyArray<NormalizedScorer>,\n concurrency: number,\n signal: AbortSignal | undefined,\n onRow: (row: EvalRowResult, index: number) => void,\n sink: RowSink,\n): Promise<EvalRowResult[]> {\n // M6-1: resumed rows are filtered out BEFORE the batch so they cost nothing.\n const pending: Array<{ entry: DatasetEntry; index: number }> = [];\n for (let i = 0; i < entries.length; i += 1) {\n const entry = entries[i];\n if (entry === undefined) continue;\n if (sink.isResumed(entry, i)) continue;\n pending.push({ entry, index: i });\n }\n const batchOpts: BatchOptions = {\n ...agentOptions,\n concurrency,\n ...(signal !== undefined ? { signal } : {}),\n };\n const batchResults = await getAgentFacade().batch(\n pending.map((p) => p.entry.input),\n batchOpts,\n );\n const rows: EvalRowResult[] = [];\n for (let i = 0; i < batchResults.length; i += 1) {\n const slot = pending[i];\n const br = batchResults[i];\n if (slot === undefined || br === undefined) continue;\n const scoreEntries = await scoreBatchOutput(br, slot.entry.expected, scorers);\n const row = sink.finalize(rowFromBatchResult(slot.entry, br, scoreEntries, slot.index));\n rows.push(row);\n onRow(row, slot.index);\n }\n return rows;\n}\n\nexport async function runEval(\n options: EvalOptions,\n runOpts: EvalRunOptions | undefined,\n): Promise<EvalRun> {\n acquireSingleFlight(options.name);\n const id = randomUUID();\n const startedAt = Date.now();\n const entries = await materializeDataset(options.dataset);\n const materialized: DatasetEntry[] = entries.map((e) => ({ ...e }));\n // SE41: with trials > 1, run each entry N times (tagged), then collapse.\n const trials = options.trials ?? 1;\n const indexed: DatasetEntry[] = trials > 1 ? expandForTrials(materialized, trials) : materialized;\n const scorers = normalizeScorers(options.scorers);\n const concurrency = options.concurrency ?? 4;\n const signal = runOpts?.signal;\n // D206 — open `eval.run` span (no-op when OTel unavailable). MUST end in finally.\n const span = startEvalRunSpan({\n name: options.name,\n id,\n rows: entries.length,\n concurrency,\n });\n try {\n const hooks: EvalHooks | undefined = options.hooks;\n safeHook(() => hooks?.beforeRun?.({ name: options.name, totalEstimate: entries.length }));\n\n const onRow = (row: EvalRowResult, i: number): void => {\n safeHook(() => hooks?.afterRow?.(row, i));\n };\n // M6-1: durable per-row persist + resume + classify (no-op when unset).\n const sink = makeRowSink(runOpts?.persist, runOpts?.classify);\n\n let rows: EvalRowResult[];\n if (isAgentInstance(options.agent) || typeof options.agent === \"function\") {\n rows = await runRowsManually(\n indexed,\n options.agent as SDKAgent | ((entry: DatasetEntry) => SDKAgent | Promise<SDKAgent>),\n scorers,\n concurrency,\n signal,\n onRow,\n sink,\n );\n } else {\n const batchOpts = makeAgentForBatch(options.agent, indexed);\n rows = await runRowsViaBatch(indexed, batchOpts, scorers, concurrency, signal, onRow, sink);\n }\n\n // SE41: collapse per-trial rows back to one row per dataset entry.\n const finalRows = trials > 1 ? collapseTrials(rows, trials) : rows;\n const aggregate: EvalAggregate = computeAggregate(finalRows);\n const endedAt = Date.now();\n const run: EvalRun = {\n id,\n name: options.name,\n startedAt,\n endedAt,\n durationMs: endedAt - startedAt,\n aggregate,\n rows: finalRows,\n ...(options.metadata !== undefined ? { metadata: options.metadata } : {}),\n };\n safeHook(() => hooks?.afterRun?.(run));\n // Annotate the span with final aggregate metrics (D206 / D211).\n span.setAttribute(\"eval.aggregate.meanScore\", run.aggregate.meanScore);\n span.setAttribute(\"eval.aggregate.errorRows\", run.aggregate.errorRows);\n span.setAttribute(\"eval.aggregate.durationMsP95\", run.aggregate.durationMsP95);\n span.setAttribute(\"eval.aggregate.tokensInTotal\", run.aggregate.tokensInTotal);\n return run;\n } finally {\n span.end();\n releaseSingleFlight(options.name);\n }\n}\n","/**\n * SE41 — `assertEval(run, thresholds)`: the CI gate for evals.\n *\n * A pure function over a completed {@link EvalRun}. It reads only\n * `run.aggregate`, collects EVERY unmet threshold (not just the first), and\n * throws {@link EvalThresholdError} carrying the full failure list. Passing\n * silently returns `void` — drop it straight into a Vitest `it(...)` or a\n * standalone eval script whose non-zero exit fails the CI job.\n *\n * @public\n */\n\nimport type { EvalRun, EvalThresholdFailure, EvalThresholds } from \"../../types/eval.js\";\n\n/** Thrown by {@link assertEval} when a run misses one or more thresholds. */\nexport class EvalThresholdError extends Error {\n override readonly name = \"EvalThresholdError\";\n /** The eval's name (`EvalRun.name`). */\n readonly evalName: string;\n /** Every unmet threshold, in check order. */\n readonly failures: readonly EvalThresholdFailure[];\n\n constructor(evalName: string, failures: readonly EvalThresholdFailure[]) {\n const lines = failures.map(\n (f) =>\n ` - ${f.metric}: required ${f.threshold}, got ${\n Number.isNaN(f.actual) ? \"n/a (scorer absent)\" : f.actual\n }`,\n );\n super(\n `Eval \"${evalName}\" failed ${failures.length} threshold${failures.length === 1 ? \"\" : \"s\"}:\\n${lines.join(\"\\n\")}`,\n );\n this.evalName = evalName;\n this.failures = failures;\n }\n}\n\n/** `actual < threshold` ⇒ a failure for a floor metric, else `undefined`. */\nfunction floor(\n metric: string,\n actual: number,\n threshold: number | undefined,\n): EvalThresholdFailure | undefined {\n if (threshold === undefined || actual >= threshold) return undefined;\n return { metric, threshold, actual };\n}\n\n/** Per-scorer floor checks (an absent named scorer is a failure with NaN actual). */\nfunction perScorerFailures(\n perScorer: EvalRun[\"aggregate\"][\"perScorer\"],\n thresholds: Readonly<Record<string, number>> | undefined,\n): EvalThresholdFailure[] {\n if (thresholds === undefined) return [];\n const out: EvalThresholdFailure[] = [];\n for (const [name, min] of Object.entries(thresholds)) {\n const stats = perScorer[name];\n if (stats === undefined || stats.mean < min) {\n out.push({\n metric: `perScorer.${name}`,\n threshold: min,\n actual: stats === undefined ? Number.NaN : stats.mean,\n });\n }\n }\n return out;\n}\n\n/**\n * Assert a run meets every set threshold. Throws {@link EvalThresholdError}\n * with the complete list of failures when it does not; returns `void` on pass.\n */\nexport function assertEval(run: EvalRun, thresholds: EvalThresholds): void {\n const a = run.aggregate;\n const errorRatio = a.totalRows > 0 ? a.errorRows / a.totalRows : 0;\n const ceiling =\n thresholds.maxErrorRatio !== undefined && errorRatio > thresholds.maxErrorRatio\n ? { metric: \"errorRatio\", threshold: thresholds.maxErrorRatio, actual: errorRatio }\n : undefined;\n\n const failures = [\n floor(\"meanScore\", a.meanScore, thresholds.minMeanScore),\n floor(\"passRatio\", a.passRatio, thresholds.minPassRatio),\n ceiling,\n ...perScorerFailures(a.perScorer, thresholds.perScorer),\n ].filter((f): f is EvalThresholdFailure => f !== undefined);\n\n if (failures.length > 0) {\n throw new EvalThresholdError(run.name, failures);\n }\n}\n","/**\n * M6-4 — capture an agent's code change as a gradeable artifact.\n *\n * After an agent mutates a provisioned repo, `captureArtifact` records the\n * working-tree `git diff` and validates it is coherent with the tree via a\n * reverse `git apply --check` (no re-clone needed). The resulting\n * `{ diff, applies }` becomes `EvalRowResult.artifact`, the input the Phase 5\n * verify-gate grades. Every command rides {@link SandboxBackend.execute}\n * (ADR D2 — portable across Local/Docker/E2B).\n *\n * reference: knowledge-base/references/theocode-eval/lib/swebench-batch.ts:154\n * (build prediction from captured diff), :157 (reverse apply-check on the\n * mutated tree).\n *\n * Re-exported from `@theokit/sdk/eval` for consumers composing a code-eval\n * harness.\n *\n * @public\n */\n\nimport { shellEscapePosix } from \"../../sandbox/shell-escape.js\";\nimport type { SandboxBackend } from \"../../sandbox/types.js\";\n\n/** Temp filename for the captured patch, written inside the repo dir. */\nconst ARTIFACT_PATCH = \".theo-artifact.patch\";\n\n/**\n * Capture the working-tree diff of `repoDir` and check it reverse-applies.\n * An empty diff (clean tree) returns `{ diff: \"\", applies: false }`.\n */\nexport async function captureArtifact(\n sandbox: SandboxBackend,\n repoDir: string,\n): Promise<{ diff: string; applies: boolean }> {\n const dir = shellEscapePosix(repoDir);\n const diffRes = await sandbox.execute(`git -C ${dir} diff`);\n const diff = diffRes.stdout;\n if (diff.length === 0) return { diff: \"\", applies: false };\n\n // Write the patch into the repo and reverse-apply-check it against the\n // mutated tree — confirms the diff is coherent without re-cloning.\n await sandbox.uploadFile(`${repoDir}/${ARTIFACT_PATCH}`, diff);\n const check = await sandbox.execute(\n `git -C ${dir} apply --check --reverse ${shellEscapePosix(ARTIFACT_PATCH)}`,\n );\n return { diff, applies: check.exitCode === 0 };\n}\n","/**\n * SE41 — Levenshtein edit distance for `Scorers.levenshtein`.\n *\n * Classic two-row dynamic-programming distance (O(n) memory). Callers MUST\n * bound input length via {@link LEVENSHTEIN_MAX_LEN} before calling — the\n * algorithm is O(n*m) time, so unbounded LLM output would be a DoS vector.\n *\n * @internal\n */\n\n/** Max per-string length the fuzzy scorer will process (bounds O(n*m) cost). */\nexport const LEVENSHTEIN_MAX_LEN = 4000;\n\n/** Compute DP row `i` from the previous row (extracted to keep each fn simple). */\nfunction nextRow(prev: number[], rowIndex: number, ai: number, b: string): number[] {\n const curr: number[] = [rowIndex];\n for (let j = 1; j <= b.length; j += 1) {\n const cost = ai === b.charCodeAt(j - 1) ? 0 : 1;\n curr[j] = Math.min((prev[j] ?? 0) + 1, (curr[j - 1] ?? 0) + 1, (prev[j - 1] ?? 0) + cost);\n }\n return curr;\n}\n\n/** Minimum single-edit distance between `a` and `b` (two-row DP, O(n) memory). */\nexport function levenshteinDistance(a: string, b: string): number {\n const m = a.length;\n const n = b.length;\n if (m === 0) return n;\n if (n === 0) return m;\n\n let prev: number[] = [];\n for (let j = 0; j <= n; j += 1) prev[j] = j;\n for (let i = 1; i <= m; i += 1) prev = nextRow(prev, i, a.charCodeAt(i - 1), b);\n return prev[n] ?? 0;\n}\n","/**\n * LLM-as-judge scorer implementation (ADR D205).\n *\n * Builds a transient agent with the judge model + apiKey, calls the public\n * Agent facade's `prompt` (via the `getAgentFacade()` inversion seam) with a\n * structured judge prompt, parses score from the response. Returns 0 (with\n * diagnostic reason) on any parse failure.\n *\n * @internal\n */\n\nimport type { ModelSelection } from \"../../types/agent.js\";\nimport type { Score } from \"../../types/eval.js\";\nimport type { ProviderRoutingSettings } from \"../../types/providers.js\";\nimport { getAgentFacade } from \"../runtime/registry/agent-factory-registry.js\";\n\nexport interface LlmJudgeOptions {\n readonly model: ModelSelection;\n readonly apiKey: string;\n readonly criteria: string;\n /** \"continuous\" → [0, 1] real number. \"discrete\" → 0 or 1 only. Default: continuous. */\n readonly rubric?: \"continuous\" | \"discrete\";\n readonly providers?: ProviderRoutingSettings;\n}\n\nfunction buildPrompt(\n subject: string,\n criteria: string,\n rubric: \"continuous\" | \"discrete\",\n expected: unknown,\n): string {\n const scoreHint =\n rubric === \"discrete\" ? \"between 0 and 1 (use 0 for fail, 1 for pass)\" : \"between 0.0 and 1.0\";\n const expectedBlock =\n expected !== undefined ? `EXPECTED (reference): ${JSON.stringify(expected)}\\n\\n` : \"\";\n return [\n \"You are evaluating an AI assistant's output.\",\n \"\",\n `CRITERIA: ${criteria}`,\n \"\",\n `${expectedBlock}ACTUAL OUTPUT:`,\n '\"\"\"',\n subject,\n '\"\"\"',\n \"\",\n `Reply with EXACTLY this JSON object on a single line:`,\n `{\"score\": <number ${scoreHint}>, \"reason\": \"<one short sentence>\"}`,\n \"\",\n \"Reply with the JSON object ONLY. No preface, no explanation outside the JSON.\",\n ].join(\"\\n\");\n}\n\n/**\n * EC-8: regex is GENEROUS — accepts the JSON object even when the model\n * wraps it in markdown fences (```json ... ```) or prose around it.\n */\nconst SCORE_REGEX = /\\{\\s*\"score\"\\s*:\\s*([0-9]*\\.?[0-9]+)\\s*,\\s*\"reason\"\\s*:\\s*\"([^\"]*)\"\\s*\\}/;\n\nasync function callJudge(\n message: string,\n options: LlmJudgeOptions,\n): Promise<{ ok: true; text: string } | { ok: false; reason: string }> {\n try {\n const result = await getAgentFacade().prompt(message, {\n apiKey: options.apiKey,\n model: options.model,\n local: { cwd: process.cwd(), sandboxOptions: { enabled: false } },\n ...(options.providers !== undefined ? { providers: options.providers } : {}),\n });\n if (result.status === \"finished\") return { ok: true, text: result.result ?? \"\" };\n return { ok: false, reason: `judge_run_failed: ${result.error?.message ?? result.status}` };\n } catch (err) {\n return {\n ok: false,\n reason: `judge_threw: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n}\n\nfunction parseScore(text: string, rubric: \"continuous\" | \"discrete\"): Score {\n const match = SCORE_REGEX.exec(text);\n if (match === null) return { score: 0, reason: \"judge_parse_failed\" };\n const raw = Number(match[1]);\n if (!Number.isFinite(raw)) return { score: 0, reason: \"judge_score_not_finite\" };\n const clamped = rubric === \"discrete\" ? (raw >= 0.5 ? 1 : 0) : Math.max(0, Math.min(1, raw));\n return { score: clamped, reason: match[2] };\n}\n\nexport async function llmJudgeScore(\n options: LlmJudgeOptions & { output: string; expected?: unknown },\n): Promise<Score> {\n const rubric = options.rubric ?? \"continuous\";\n const message = buildPrompt(options.output, options.criteria, rubric, options.expected);\n const judgement = await callJudge(message, options);\n if (!judgement.ok) return { score: 0, reason: judgement.reason };\n return parseScore(judgement.text, rubric);\n}\n","/**\n * Built-in scorers for `Eval.create` (Adoption Roadmap #2, ADR D203).\n *\n * Each scorer is a CURRIED FACTORY: call with config, get back a\n * `NamedScorer` ready to drop into `EvalOptions.scorers[]`.\n *\n * import { Scorers } from \"@theokit/sdk/eval\";\n * const scorers = [\n * Scorers.containsExpected({ caseSensitive: false }),\n * Scorers.regex(/jazz|blues/i),\n * ];\n *\n * @public\n */\n\nimport type { ZodType, z } from \"zod\";\n\nimport { openRouterMemoryEmbeddingProviderAdapter } from \"./internal/memory/adapters/openrouter-embedding.js\";\nimport type { EmbeddingRuntime } from \"./internal/memory/embedding-adapter.js\";\nimport { LEVENSHTEIN_MAX_LEN, levenshteinDistance } from \"./internal/scorers/levenshtein.js\";\nimport { type LlmJudgeOptions, llmJudgeScore } from \"./internal/scorers/llm-judge.js\";\nimport { LocalSandbox } from \"./sandbox/local-sandbox.js\";\nimport { shellEscapePosix } from \"./sandbox/shell-escape.js\";\nimport type { NamedScorer, Score, VerifyGateOptions } from \"./types/eval.js\";\n\n/** EC-2 fix: cap JSON parse input to bound memory. 1 MB is generous for structured output. */\nconst JSON_SHAPE_MAX_BYTES = 1_000_000;\n\n/** SE41 — options for the deterministic fuzzy `Scorers.levenshtein`. */\ninterface LevenshteinOptions {\n /** Case-sensitive compare. Default: false (fuzzy matching is usually case-insensitive). */\n caseSensitive?: boolean;\n /**\n * When set, binarize: `score = normalizedSimilarity >= threshold ? 1 : 0`.\n * When omitted, return the continuous similarity in `[0, 1]`.\n */\n threshold?: number;\n}\n\n/** SE41 — options for the deterministic `Scorers.numericDiff`. */\ninterface NumericDiffOptions {\n /**\n * When set, binarize: `score = |output - expected| <= tolerance ? 1 : 0`.\n * When omitted, return the continuous relative closeness in `[0, 1]`.\n */\n tolerance?: number;\n}\n\n/** SE41 — options for `Scorers.embeddingSimilarity`. */\ninterface EmbeddingSimilarityOptions {\n /** Embedding API key. Defaults to `OPENROUTER_API_KEY` from the environment. */\n apiKey?: string;\n /** Embedding model id (OpenRouter catalog). Default: `openai/text-embedding-3-small`. */\n model?: string;\n /** Override the embeddings HTTP base URL. */\n baseUrl?: string;\n /** When set, binarize: `score = cosine >= threshold ? 1 : 0`. Else continuous. */\n threshold?: number;\n /**\n * Inject an embedding function (DIP): `(texts) => vectors`. When provided, the\n * OpenRouter runtime is NOT constructed — used by tests and custom providers.\n */\n embed?: (texts: ReadonlyArray<string>) => Promise<number[][]>;\n}\n\n/** Cosine similarity of two vectors; 0 when either has zero magnitude. */\nfunction cosineSimilarity(a: ReadonlyArray<number>, b: ReadonlyArray<number>): number {\n const n = Math.min(a.length, b.length);\n let dot = 0;\n let na = 0;\n let nb = 0;\n for (let i = 0; i < n; i += 1) {\n const av = a[i] ?? 0;\n const bv = b[i] ?? 0;\n dot += av * bv;\n na += av * av;\n nb += bv * bv;\n }\n if (na === 0 || nb === 0) return 0;\n return dot / (Math.sqrt(na) * Math.sqrt(nb));\n}\n\n/**\n * Validate + case-normalize a string scorer's `(output, expected)` pair. Returns\n * the normalized pair, or a failure `Score` when `expected` is not a usable\n * string (shared by every string-based scorer — single source for EC-1 parity).\n */\nfunction normalizeStringInputs(\n output: string,\n expected: unknown,\n caseSensitive: boolean,\n): { o: string; e: string } | Score {\n if (typeof expected !== \"string\") return { score: 0, reason: \"expected_not_string\" };\n if (expected.length === 0) return { score: 0, reason: \"expected_empty\" };\n return {\n o: caseSensitive ? output : output.toLowerCase(),\n e: caseSensitive ? expected : expected.toLowerCase(),\n };\n}\n\n/** Module-level scoring body for `Scorers.levenshtein` (keeps the factory flat). */\nfunction scoreLevenshtein(\n output: string,\n expected: unknown,\n caseSensitive: boolean,\n threshold: number | undefined,\n): Score {\n const norm = normalizeStringInputs(output, expected, caseSensitive);\n if (!(\"o\" in norm)) return norm;\n const { o, e } = norm;\n if (o.length > LEVENSHTEIN_MAX_LEN || e.length > LEVENSHTEIN_MAX_LEN) {\n return { score: 0, reason: \"input_too_large\" };\n }\n const sim = 1 - levenshteinDistance(o, e) / Math.max(o.length, e.length, 1);\n if (threshold === undefined) return { score: sim };\n return sim >= threshold ? { score: 1 } : { score: 0, reason: `sim=${sim.toFixed(3)}` };\n}\n\n/** Coerce a value to a finite number, or `undefined` when it is not numeric. */\nfunction toFiniteNumber(value: unknown): number | undefined {\n if (typeof value === \"number\") return Number.isFinite(value) ? value : undefined;\n if (value === undefined || value === null) return undefined;\n const n = Number(String(value).trim());\n return Number.isFinite(n) ? n : undefined;\n}\n\n/** Module-level scoring body for `Scorers.numericDiff`. */\nfunction scoreNumericDiff(output: string, expected: unknown, tolerance: number | undefined): Score {\n const o = toFiniteNumber(output);\n if (o === undefined) return { score: 0, reason: \"output_not_numeric\" };\n const e = toFiniteNumber(expected);\n if (e === undefined) return { score: 0, reason: \"expected_not_numeric\" };\n if (tolerance !== undefined) {\n return Math.abs(o - e) <= tolerance\n ? { score: 1 }\n : { score: 0, reason: `abs_diff=${Math.abs(o - e)}` };\n }\n const denom = Math.max(Math.abs(o), Math.abs(e));\n if (denom === 0) return { score: 1 };\n return { score: Math.max(0, 1 - Math.abs(o - e) / denom) };\n}\n\n/** Assemble the OpenRouter adapter options from the scorer opts (omitting undefineds). */\nfunction embedderCreateOptions(opts: EmbeddingSimilarityOptions): {\n model?: string;\n apiKey?: string;\n baseUrl?: string;\n} {\n return {\n ...(opts.model !== undefined ? { model: opts.model } : {}),\n ...(opts.apiKey !== undefined ? { apiKey: opts.apiKey } : {}),\n ...(opts.baseUrl !== undefined ? { baseUrl: opts.baseUrl } : {}),\n };\n}\n\n/** Build the default (OpenRouter-backed) embedder for `embeddingSimilarity`. */\nfunction makeDefaultEmbedder(\n opts: EmbeddingSimilarityOptions,\n): (texts: ReadonlyArray<string>) => Promise<number[][]> {\n let runtime: Promise<EmbeddingRuntime> | undefined;\n return (texts) => {\n if (runtime === undefined) {\n runtime = openRouterMemoryEmbeddingProviderAdapter.create(embedderCreateOptions(opts));\n }\n return runtime.then((rt) => rt.embed(texts));\n };\n}\n\ninterface ExactMatchOptions {\n /** Case-sensitive compare. Default: true. */\n caseSensitive?: boolean;\n}\n\ninterface ContainsExpectedOptions {\n /** Case-sensitive compare. Default: false. */\n caseSensitive?: boolean;\n}\n\ninterface JsonShapeOptions {\n /** Include Zod's error message in the failure reason. Default: false. */\n strict?: boolean;\n}\n\nfunction makeStringScorer(\n name: string,\n caseSensitive: boolean,\n compare: (output: string, expected: string) => Score,\n): NamedScorer {\n return {\n name,\n score: (output, expected): Score => {\n const norm = normalizeStringInputs(output, expected, caseSensitive);\n return \"o\" in norm ? compare(norm.o, norm.e) : norm;\n },\n };\n}\n\nexport const Scorers = {\n /**\n * `output.trim() === expected.trim()`. Refuses empty `expected` (EC-1\n * — two empties would otherwise pass silently).\n */\n exactMatch(opts: ExactMatchOptions = {}): NamedScorer {\n return makeStringScorer(\"exact-match\", opts.caseSensitive ?? true, (o, e) =>\n o.trim() === e.trim() ? { score: 1 } : { score: 0, reason: \"mismatch\" },\n );\n },\n\n /**\n * `output.includes(expected)`. Refuses empty `expected` (EC-1 —\n * `\"\".includes(\"\")` is always `true`, would inflate pass ratio).\n */\n containsExpected(opts: ContainsExpectedOptions = {}): NamedScorer {\n return makeStringScorer(\"contains-expected\", opts.caseSensitive ?? false, (o, e) =>\n o.includes(e) ? { score: 1 } : { score: 0, reason: \"not_found\" },\n );\n },\n\n /**\n * `pattern.test(output)`.\n *\n * **ReDoS caveat (EC-10):** the regex is applied to LLM output, which\n * may be adversarial. Patterns with catastrophic backtracking (e.g.\n * `/(a+)+$/`) can hang the eval. Test your pattern against worst-case\n * inputs before using in production.\n */\n regex(pattern: RegExp): NamedScorer {\n return {\n name: `regex(${pattern.source})`,\n score: (output): Score => {\n const ok = pattern.test(output);\n return ok ? { score: 1 } : { score: 0, reason: \"regex_no_match\" };\n },\n };\n },\n\n /**\n * SE41 — normalized Levenshtein similarity: `1 - editDistance / max(len)`.\n * Deterministic (no LLM), so it always runs in CI. `threshold` binarizes.\n *\n * Refuses empty/non-string `expected` (EC-1 parity) and caps input at\n * {@link LEVENSHTEIN_MAX_LEN} chars to bound the O(n*m) cost on adversarial output.\n */\n levenshtein(opts: LevenshteinOptions = {}): NamedScorer {\n const caseSensitive = opts.caseSensitive ?? false;\n const { threshold } = opts;\n return {\n name: threshold !== undefined ? `levenshtein(>=${threshold})` : \"levenshtein\",\n score: (output, expected): Score =>\n scoreLevenshtein(output, expected, caseSensitive, threshold),\n };\n },\n\n /**\n * SE41 — numeric closeness. Parses `output` and `expected` as numbers and\n * scores continuous relative closeness `1 - |o-e| / max(|o|,|e|)` (both 0 ⇒ 1),\n * or a binary pass when `tolerance` is set. Deterministic (no LLM).\n */\n numericDiff(opts: NumericDiffOptions = {}): NamedScorer {\n const { tolerance } = opts;\n return {\n name: \"numeric-diff\",\n score: (output, expected): Score => scoreNumericDiff(output, expected, tolerance),\n };\n },\n\n /**\n * SE41 — semantic similarity via embeddings: cosine of `embed(output)` vs\n * `embed(expected)`, clamped to `[0, 1]` (negatives → 0). `threshold` binarizes.\n *\n * By default routes through OpenRouter's embeddings endpoint\n * (`OPENROUTER_API_KEY`); inject `embed` to use another provider or to test\n * deterministically. Each scored row costs one embeddings call.\n */\n embeddingSimilarity(opts: EmbeddingSimilarityOptions): NamedScorer {\n const { threshold } = opts;\n const embed = opts.embed ?? makeDefaultEmbedder(opts);\n return {\n name:\n threshold !== undefined ? `embedding-similarity(>=${threshold})` : \"embedding-similarity\",\n score: async (output, expected): Promise<Score> => {\n if (typeof expected !== \"string\") return { score: 0, reason: \"expected_not_string\" };\n const [vo, ve] = await embed([output, expected]);\n if (vo === undefined || ve === undefined) return { score: 0, reason: \"embed_failed\" };\n const score = Math.max(0, cosineSimilarity(vo, ve));\n if (threshold === undefined) return { score };\n return score >= threshold ? { score: 1 } : { score: 0, reason: `cos=${score.toFixed(3)}` };\n },\n };\n },\n\n /**\n * Parse `output` as JSON and validate against a Zod schema.\n *\n * - EC-2 fix: output is bounded by `JSON_SHAPE_MAX_BYTES` (1 MB)\n * BEFORE `JSON.parse` to avoid OOM on runaway LLM responses.\n * - `strict: true` includes Zod's first error message in `reason`.\n */\n /**\n * LLM-as-judge scorer (ADR D205).\n *\n * **Cost note (EC-12):** every row with this scorer adds ~1 LLM call\n * for the judge. For 1000 rows × gpt-4o-mini, expect ~2x the baseline\n * token spend. The eval `aggregate.tokensInTotal` only reflects the\n * EVAL agent's tokens, not the judge's — forecast accordingly.\n *\n * **Bias note (D205):** `apiKey` is intentionally separate so callers\n * cannot accidentally judge their own output. Pass a different key\n * (can target the same provider, but explicit by design).\n *\n * **EC-8 (parser robustness):** the regex accepts JSON inside markdown\n * code fences and prose-wrapped JSON — common LLM output shapes.\n */\n llmJudge(opts: LlmJudgeOptions): NamedScorer {\n return {\n name: \"llm-judge\",\n score: (output, expected) => {\n const callOpts: LlmJudgeOptions & { output: string; expected?: unknown } =\n expected !== undefined ? { ...opts, output, expected } : { ...opts, output };\n return llmJudgeScore(callOpts);\n },\n };\n },\n\n /**\n * Verify-gate scorer (M6-2): runs the project's tests in the provisioned\n * repo via `SandboxBackend.execute` and scores `1` iff the command exits `0`,\n * else `0` with the exit code + truncated stderr in `reason`. Grades the\n * artifact captured by `captureArtifact` (D2 — rides `execute`, never a\n * direct `child_process`).\n *\n * SECURITY: `command` is REQUIRED and the caller's builder owns shell-safety\n * of the (potentially untrusted, dataset-derived) test identifiers. There is\n * NO default that runs bare test names — that would interpolate untrusted\n * `failToPass`/`passToPass` straight into a shell. `repoDir` is shell-escaped\n * by the SDK; the test list is the builder's responsibility to render safely.\n *\n * PORTABILITY: the command is wrapped as `cd <repoDir> && <cmd>`, which\n * assumes a shell-backed `SandboxBackend` (LocalSandbox/Docker). A backend\n * that rejects shell metacharacters in `execute` is unsupported for this scorer.\n */\n verifyGate(opts: VerifyGateOptions): NamedScorer {\n const { sandbox = new LocalSandbox(), repoDir, failToPass, passToPass, command } = opts;\n return {\n name: \"verify-gate\",\n score: async (): Promise<Score> => {\n const cmd = command([...failToPass, ...passToPass]).trim();\n if (cmd.length === 0) {\n return { score: 0, reason: \"verify_gate_empty_command\" };\n }\n const r = await sandbox.execute(`cd ${shellEscapePosix(repoDir)} && ${cmd}`);\n if (r.exitCode === 0) return { score: 1 };\n return { score: 0, reason: `exit=${r.exitCode} ${r.stderr.slice(0, 200)}`.trim() };\n },\n };\n },\n\n jsonShape<T extends ZodType>(schema: T, opts: JsonShapeOptions = {}): NamedScorer {\n return {\n name: \"json-shape\",\n score: (output): Score => {\n if (output.length > JSON_SHAPE_MAX_BYTES) {\n return { score: 0, reason: \"output_too_large\" };\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(output);\n } catch {\n return { score: 0, reason: \"invalid_json\" };\n }\n const result = schema.safeParse(parsed);\n if (result.success) return { score: 1 };\n if (opts.strict === true) {\n const issue = (result.error as z.ZodError).issues?.[0];\n return { score: 0, reason: `schema_invalid: ${issue?.message ?? \"?\"}` };\n }\n return { score: 0, reason: \"schema_invalid\" };\n },\n };\n },\n};\n","/**\n * Public `Eval` namespace (Adoption Roadmap #2, ADRs D202-D213).\n *\n * Usage:\n *\n * import { Eval, Scorers } from \"@theokit/sdk/eval\";\n * const run = await Eval.create({\n * name: \"qa-smoke\",\n * dataset: [{ input: \"Say ok\", expected: \"ok\" }],\n * scorers: [Scorers.containsExpected()],\n * agent: { apiKey: process.env.OPENROUTER_API_KEY, model: { id: \"openai/gpt-4o-mini\" } },\n * }).run();\n * console.log(run.aggregate.meanScore);\n *\n * @public\n */\n\n// Bootstrap import: loading this facade must register the public Agent facade\n// into the agent-factory-registry seam, because `internal/eval/runner.ts` and\n// `internal/scorers/llm-judge.ts` resolve it via `getAgentFacade()` at runtime\n// instead of importing `agent.ts` directly (which would invert the\n// public-api -> internal dependency direction). The `@theokit/sdk/eval`\n// sub-path entry would otherwise throw \"Agent facade not registered\".\nimport \"./agent.js\";\nimport { z } from \"zod\";\nimport { runEval } from \"./internal/eval/runner.js\";\nimport type { EvalOptions, EvalRun, EvalRunOptions } from \"./types/eval.js\";\n\nconst EvalOptionsSchema = z.object({\n name: z.string().min(1, \"Eval.name must be non-empty\"),\n // dataset / scorers / agent are validated lightly here; deep validation is\n // structural and lives in the runner (where it's cheap to do once).\n dataset: z.unknown().refine((v) => Array.isArray(v) || typeof v === \"function\", {\n message:\n \"dataset must be an array of DatasetEntry OR a factory returning Iterable/AsyncIterable\",\n }),\n scorers: z.unknown().refine((v) => Array.isArray(v) && v.length >= 1, {\n message: \"scorers must be an array with at least one scorer\",\n }),\n agent: z.unknown().refine((v) => v !== undefined && v !== null, {\n message: \"agent must be an SDKAgent, AgentOptions, or factory function\",\n }),\n // EC-3: concurrency MUST be a finite integer in [1, 64]. Bare `z.number()`\n // would let Infinity / 0 / negatives slip through.\n concurrency: z\n .number()\n .int(\"concurrency must be an integer\")\n .min(1, \"concurrency must be >= 1\")\n .max(64, \"concurrency must be <= 64\")\n .optional(),\n // SE41: trials MUST be a finite integer in [1, 100]. Guards against 0\n // (no-op run) and unbounded fanout that would DoS the provider.\n trials: z\n .number()\n .int(\"trials must be an integer\")\n .min(1, \"trials must be >= 1\")\n .max(100, \"trials must be <= 100\")\n .optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n hooks: z\n .object({\n beforeRun: z.function().optional(),\n afterRow: z.function().optional(),\n afterRun: z.function().optional(),\n })\n .partial()\n .optional(),\n});\n\nexport class Eval {\n private constructor(private readonly options: EvalOptions) {}\n\n /**\n * Construct an Eval. Throws on bad options (empty name, concurrency\n * out of range, empty scorers, etc).\n */\n static create(options: EvalOptions): Eval {\n EvalOptionsSchema.parse(options);\n return new Eval(options);\n }\n\n /**\n * Run the eval. Resolves with a populated {@link EvalRun}. Per D208,\n * row errors are isolated; per D213, two runs with the same name\n * throw `EvalAlreadyRunningError`.\n */\n run(runOpts?: EvalRunOptions): Promise<EvalRun> {\n return runEval(this.options, runOpts);\n }\n}\n\n// SE41: the CI gate — assert a run meets score/error thresholds or throw.\nexport { assertEval, EvalThresholdError } from \"./internal/eval/assert.js\";\n// M6-4: capture an agent's code change as a gradeable artifact (git diff + reverse apply-check).\nexport { captureArtifact } from \"./internal/eval/code-runner.js\";\nexport { EvalAlreadyRunningError } from \"./internal/eval/single-flight.js\";\n// M6-5: generic JSONL dataset loader (schema delegated to the caller's `map`, ADR D3).\nexport { JsonlParseError, loadJsonl } from \"./internal/persistence/jsonl.js\";\nexport { Scorers } from \"./scorers.js\";\nexport type * from \"./types/eval.js\";\n"]}
package/dist/eval.js CHANGED
@@ -1,16 +1,16 @@
1
1
  import { shellEscapePosix, LocalSandbox } from './chunk-DEZ75ET5.js';
2
- import { openRouterMemoryEmbeddingProviderAdapter } from './chunk-ZFARZBOX.js';
3
- import './chunk-SPZZSAHV.js';
2
+ import { openRouterMemoryEmbeddingProviderAdapter } from './chunk-NZOR3N4E.js';
3
+ import './chunk-I5OTK2RP.js';
4
+ import './chunk-OIBHY6JQ.js';
4
5
  import './chunk-2SFBB54R.js';
5
6
  import './chunk-7TB5U7RK.js';
6
7
  import { getTracer } from './chunk-K2BQQ445.js';
7
- import './chunk-J4RY5DTI.js';
8
- import './chunk-YBB66SZZ.js';
9
- import './chunk-4QEC4CCS.js';
8
+ import './chunk-634YVZLU.js';
9
+ import './chunk-2Y5NO2SY.js';
10
10
  import './chunk-DHVNJYTO.js';
11
+ import './chunk-4QEC4CCS.js';
11
12
  import './chunk-UJ3SXRZZ.js';
12
13
  import './chunk-NOS7PTKP.js';
13
- import './chunk-OIBHY6JQ.js';
14
14
  import './chunk-AM2CNBKE.js';
15
15
  import './chunk-34XOCZJO.js';
16
16
  import './chunk-L7EGRCKJ.js';
@@ -19,7 +19,7 @@ import './chunk-OZXPA3ME.js';
19
19
  import './chunk-OXNYIMZZ.js';
20
20
  import './chunk-FD2UT76F.js';
21
21
  import './chunk-U54XCYG3.js';
22
- import './chunk-U3PAW4PL.js';
22
+ import './chunk-NAF4L3T6.js';
23
23
  import './chunk-RP5HQVLD.js';
24
24
  import { getAgentFacade } from './chunk-6X6ID4MO.js';
25
25
  import './chunk-4NAKHID5.js';
@@ -28,8 +28,8 @@ import './chunk-ITQ4NO4P.js';
28
28
  import './chunk-ZSJPRPN7.js';
29
29
  import './chunk-R7TKOQMJ.js';
30
30
  import './chunk-C4EU627W.js';
31
- import { readJsonlIds, appendJsonl } from './chunk-NACDF3PK.js';
32
- export { JsonlParseError, loadJsonl } from './chunk-NACDF3PK.js';
31
+ import { readJsonlIds, appendJsonl } from './chunk-HTK54K2J.js';
32
+ export { JsonlParseError, loadJsonl } from './chunk-HTK54K2J.js';
33
33
  import './chunk-W4FV7JBH.js';
34
34
  import './chunk-2XLKLVVR.js';
35
35
  import './chunk-JJZ4NIAG.js';
@@ -38,8 +38,9 @@ import './chunk-CHVSMEKM.js';
38
38
  import './chunk-XGYI2KQH.js';
39
39
  import './chunk-KIX45IKP.js';
40
40
  import './chunk-X2FR4OIT.js';
41
- import './chunk-V2EJLKGA.js';
42
- import './chunk-BKRTYDVN.js';
41
+ import './chunk-2YWWPCGX.js';
42
+ import './chunk-XRI6DXPZ.js';
43
+ import './chunk-23VZBRDQ.js';
43
44
  import './chunk-5NBUH3NO.js';
44
45
  import './chunk-BXVSBYGW.js';
45
46
  import './chunk-XWCTBGYK.js';