agent-skill-evals 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -145
- package/dist/agent/index.d.mts +2 -3
- package/dist/agent/index.mjs +1 -1
- package/dist/agent-B15R7Xlr.mjs +2105 -0
- package/dist/agent-B15R7Xlr.mjs.map +1 -0
- package/dist/assertions/index.d.mts +6 -0
- package/dist/assertions/index.d.mts.map +1 -1
- package/dist/assertions/index.mjs +164 -449
- package/dist/assertions/index.mjs.map +1 -1
- package/dist/catalog-9Wh-AfRv.mjs +409 -0
- package/dist/catalog-9Wh-AfRv.mjs.map +1 -0
- package/dist/cli/init.d.mts +22 -0
- package/dist/cli/init.d.mts.map +1 -0
- package/dist/cli/init.mjs +369 -0
- package/dist/cli/init.mjs.map +1 -0
- package/dist/index-D9lGL0Qg.d.mts +381 -0
- package/dist/index-D9lGL0Qg.d.mts.map +1 -0
- package/dist/presets-DwfDWckA.mjs +80 -0
- package/dist/presets-DwfDWckA.mjs.map +1 -0
- package/dist/test-generator/index.d.mts +945 -0
- package/dist/test-generator/index.d.mts.map +1 -0
- package/dist/test-generator/index.mjs +2 -0
- package/dist/test-pack-Cu1WOssl.mjs +215 -0
- package/dist/test-pack-Cu1WOssl.mjs.map +1 -0
- package/package.json +16 -9
- package/schema/test-pack.schema.json +871 -0
- package/dist/agent-CM7fIL_C.mjs +0 -1525
- package/dist/agent-CM7fIL_C.mjs.map +0 -1
- package/dist/assertion-entries-CfmNt-fp.d.mts +0 -9
- package/dist/assertion-entries-CfmNt-fp.d.mts.map +0 -1
- package/dist/index-4l7TCFny.d.mts +0 -90
- package/dist/index-4l7TCFny.d.mts.map +0 -1
- package/dist/internal-services-5-mRgNls.mjs +0 -226
- package/dist/internal-services-5-mRgNls.mjs.map +0 -1
- package/dist/internal-services-DbsekQ_K.d.mts +0 -76
- package/dist/internal-services-DbsekQ_K.d.mts.map +0 -1
- package/dist/skill-checks/index.d.mts +0 -113
- package/dist/skill-checks/index.d.mts.map +0 -1
- package/dist/skill-checks/index.mjs +0 -408
- package/dist/skill-checks/index.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-B15R7Xlr.mjs","names":[],"sources":["../src/assertion-entries.ts","../src/evidence-schema.ts","../src/agent/evidence.ts","../src/agent/command-runner.ts","../src/agent/jsonl-stream.ts","../src/agent/adapters.ts","../src/runtime-checks/_files.ts","../src/agent/world.ts","../src/agent/file-watch.ts","../src/agent/conversation.ts","../src/agent/provider-config.ts","../src/agent/invocation.ts","../src/agent/simulated-user.ts","../src/agent/metadata.ts","../src/agent/skill-environment.ts","../src/agent/mock-services.ts","../src/agent/index.ts"],"sourcesContent":["export interface AssertionEntry {\n type: string;\n args: unknown;\n}\n\nexport interface AssertionEntryError {\n field: string;\n index?: number;\n reason: string;\n}\n\nexport interface ParsedAssertionEntries {\n entries: AssertionEntry[];\n errors: AssertionEntryError[];\n}\n\nexport interface RuntimeTestFieldEntries {\n preconditions: AssertionEntry[];\n expect: AssertionEntry[];\n errors: AssertionEntryError[];\n}\n\nfunction isEntryObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/**\n * Normalizes generated Promptfoo `vars.preconditions | expect` entries.\n *\n * Supports the clean Test Pack shorthand form:\n * `{ \"file.exists\": { path: \"app.js\" } }`\n */\nexport function parseRuntimeTestFields(\n vars: Record<string, unknown>,\n): RuntimeTestFieldEntries {\n const preconditions = parseAssertionEntries(vars.preconditions, \"preconditions\", {\n allowMissing: true,\n });\n const expect = parseAssertionEntries(vars.expect, \"expect\", {\n allowMissing: true,\n });\n return {\n preconditions: preconditions.entries,\n expect: expect.entries,\n errors: [...preconditions.errors, ...expect.errors],\n };\n}\n\nexport function parseAssertionEntries(\n raw: unknown,\n field: string,\n options: { allowMissing?: boolean } = {},\n): ParsedAssertionEntries {\n const entries: AssertionEntry[] = [];\n const errors: AssertionEntryError[] = [];\n\n if (raw === undefined || raw === null) {\n if (!options.allowMissing) {\n errors.push({ field, reason: \"must be an array of assertion entries\" });\n }\n return { entries, errors };\n }\n\n if (!Array.isArray(raw)) {\n return {\n entries,\n errors: [{ field, reason: \"must be an array of assertion entries\" }],\n };\n }\n\n raw.forEach((entry, index) => {\n const parsed = parseAssertionEntry(entry, field, index);\n if (\"error\" in parsed) {\n errors.push(parsed.error);\n } else {\n entries.push(parsed.entry);\n }\n });\n\n return { entries, errors };\n}\n\nfunction parseAssertionEntry(\n entry: unknown,\n field: string,\n index: number,\n): { entry: AssertionEntry } | { error: AssertionEntryError } {\n if (!isEntryObject(entry)) {\n return {\n error: {\n field,\n index,\n reason: \"entry must be a shorthand assertion object\",\n },\n };\n }\n\n const keys = Object.keys(entry);\n if (keys.length !== 1) {\n return {\n error: {\n field,\n index,\n reason: \"shorthand assertion object must have exactly one key\",\n },\n };\n }\n\n const type = keys[0]!;\n const args = entry[type];\n if (!isEntryObject(args)) {\n return {\n error: {\n field,\n index,\n reason: `shorthand assertion \"${type}\" value must be an object`,\n },\n };\n }\n return { entry: { type, args } };\n}\n","import { z } from \"zod\";\n\nexport const EVIDENCE_SCHEMA_VERSION = \"agent-skill-evals.evidence.v2\";\n\nconst OptionalString = z.string().optional();\nconst OptionalNumber = z.number().optional();\nconst StringArray = z.array(z.string());\n\nconst CommandEventSchema = z.object({\n command: z.string(),\n args: z.array(z.string()).default([]),\n exitCode: z.number(),\n signal: OptionalString,\n stdout: OptionalString,\n stderr: OptionalString,\n startedAt: z.number(),\n durationMs: z.number(),\n turn: OptionalNumber,\n});\n\nconst FileEventSchema = z.object({\n path: z.string(),\n op: z.enum([\"create\", \"modify\", \"delete\"]),\n});\n\nconst ToolCallEventSchema = z.object({\n tool: z.string(),\n provider: OptionalString,\n server: OptionalString,\n args: z.unknown().optional(),\n result: z.unknown().optional(),\n startedAt: z.number(),\n durationMs: z.number(),\n turn: OptionalNumber,\n});\n\nconst SkillLoadEventSchema = z.object({\n skill: z.string(),\n delivery: z.enum([\"native\", \"mcp\", \"explicit\"]),\n provider: OptionalString,\n server: OptionalString,\n source: OptionalString,\n startedAt: z.number(),\n});\n\nconst SkillAvailableEventSchema = z.object({\n skill: z.string(),\n path: z.string(),\n role: z.enum([\"under-test\", \"supporting\", \"distractor\"]),\n});\n\nconst UsageSchema = z.object({\n inputTokens: OptionalNumber,\n outputTokens: OptionalNumber,\n totalTokens: OptionalNumber,\n cacheReadTokens: OptionalNumber,\n cacheWriteTokens: OptionalNumber,\n});\n\nconst RunSummarySchema = z.object({\n runDir: z.string(),\n worldPath: z.string(),\n fixture: z.string().optional(),\n durationMs: OptionalNumber,\n});\n\nconst RuntimeIdentitySchema = z.object({\n adapter: OptionalString,\n preset: OptionalString,\n command: OptionalString,\n cliVersion: OptionalString,\n model: OptionalString,\n continuation: z.enum([\"transcript-replay\", \"native-session\"]).optional(),\n});\n\nconst TurnRecordSchema = z.object({\n turn: z.number(),\n role: z.enum([\"user\", \"agent\"]),\n text: z.string(),\n startedAt: z.number(),\n durationMs: z.number(),\n usage: UsageSchema.optional(),\n});\n\nconst EvidenceSnapshotSchema = z.object({\n schemaVersion: z.literal(EVIDENCE_SCHEMA_VERSION),\n output: z.string().default(\"\"),\n run: RunSummarySchema,\n commands: z.array(CommandEventSchema).default([]),\n filesWritten: z.array(FileEventSchema).default([]),\n toolCalls: z.array(ToolCallEventSchema).default([]),\n skillsLoaded: z.array(SkillLoadEventSchema).default([]),\n skillsAvailable: z.array(SkillAvailableEventSchema).default([]),\n usage: UsageSchema.default({}),\n turns: z.array(TurnRecordSchema).optional(),\n runtime: RuntimeIdentitySchema.optional(),\n warnings: StringArray.optional(),\n extensions: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport type CommandEvent = z.infer<typeof CommandEventSchema>;\nexport type FileEvent = z.infer<typeof FileEventSchema>;\nexport type ToolCallEvent = z.infer<typeof ToolCallEventSchema>;\nexport type SkillLoadEvent = z.infer<typeof SkillLoadEventSchema>;\nexport type SkillAvailableEvent = z.infer<typeof SkillAvailableEventSchema>;\nexport type Usage = z.infer<typeof UsageSchema>;\nexport type RunSummary = z.infer<typeof RunSummarySchema>;\nexport type RuntimeIdentity = z.infer<typeof RuntimeIdentitySchema>;\nexport type TurnRecord = z.infer<typeof TurnRecordSchema>;\nexport type EvidenceSnapshot = z.infer<typeof EvidenceSnapshotSchema>;\n\nexport type DecodeResult<T> =\n | { ok: true; value: T }\n | { ok: false; error: Error };\n\nexport function decodeEvidenceSnapshot(input: unknown): DecodeResult<EvidenceSnapshot> {\n const decoded = EvidenceSnapshotSchema.safeParse(input);\n if (decoded.success) {\n return { ok: true, value: decoded.data };\n }\n return {\n ok: false,\n error: new Error(\n \"the evidence file does not match the agent-skill-evals.evidence.v2 shape. \" +\n \"It was probably written by a different agent-skill-evals version or edited by hand — \" +\n \"re-run the eval to regenerate it. \" +\n `Details: ${z.prettifyError(decoded.error)}`,\n ),\n };\n}\n\nexport function parseEvidenceSnapshot(input: unknown): EvidenceSnapshot {\n const decoded = decodeEvidenceSnapshot(input);\n if (decoded.ok) return decoded.value;\n throw decoded.error;\n}\n","import { join } from \"node:path\";\nimport { writeFile } from \"node:fs/promises\";\nimport type {\n EvidenceHandle,\n FileEvent,\n SkillLoadEvent,\n SkillAvailableEvent,\n ToolCallEvent,\n Usage,\n CommandEvent,\n} from \"../internal-types.js\";\nimport {\n EVIDENCE_SCHEMA_VERSION,\n parseEvidenceSnapshot,\n type EvidenceSnapshot,\n type RuntimeIdentity,\n type TurnRecord,\n} from \"../evidence-schema.js\";\nimport type { SkillEvidenceConfig } from \"./provider-config.js\";\n\nexport type { EvidenceSnapshot };\nexport type { SkillEvidenceConfig } from \"./provider-config.js\";\n\nconst DEFAULT_SKILL_EVIDENCE_CONFIG = {\n mcpResource: {\n uriArgPaths: [\"uri\"],\n uriPatterns: [\"^skill://(?<skill>[^/]+)/SKILL\\\\.md$\"],\n },\n mcpTool: {\n toolPatterns: [\"^load_(?<skill>[A-Za-z0-9_-]+)_skill$\"],\n },\n} as const satisfies SkillEvidenceConfig;\n\nexport class EvidenceCollector {\n private readonly skillEvidenceConfig: SkillEvidenceConfig;\n private currentTurn?: number;\n /** Usage from completed turns; the live snapshot.usage covers only the current turn. */\n private completedTurnsUsage: Usage = {};\n private snapshot: EvidenceSnapshot = {\n schemaVersion: EVIDENCE_SCHEMA_VERSION,\n output: \"\",\n run: {\n runDir: \"\",\n worldPath: \"\",\n fixture: \"\",\n },\n commands: [],\n filesWritten: [],\n toolCalls: [],\n skillsLoaded: [],\n skillsAvailable: [],\n usage: {},\n };\n\n constructor(skillEvidenceConfig: SkillEvidenceConfig = {}) {\n this.skillEvidenceConfig = mergeSkillEvidenceConfig(skillEvidenceConfig);\n }\n\n addCommand(e: CommandEvent): void {\n this.snapshot.commands.push(this.withTurn(e));\n }\n\n addFileWrite(e: FileEvent): void {\n this.snapshot.filesWritten.push(e);\n }\n\n addToolCall(e: ToolCallEvent): void {\n const event = this.withTurn(e);\n this.snapshot.toolCalls.push(event);\n const skillLoad = skillLoadFromToolCall(event, this.skillEvidenceConfig);\n if (skillLoad) this.addSkillLoad(skillLoad);\n }\n\n private withTurn<T extends { turn?: number }>(event: T): T {\n return this.currentTurn === undefined ? event : { ...event, turn: this.currentTurn };\n }\n\n /**\n * Start an agent turn in a multi-turn run. Adapters overwrite usage per\n * CLI invocation (setUsage), so each turn's usage is scoped: the previous\n * turn's counts move into the completed-turns total first.\n */\n beginAgentTurn(turn: number): void {\n this.completedTurnsUsage = mergeUsage(this.completedTurnsUsage, this.snapshot.usage);\n this.snapshot.usage = {};\n this.currentTurn = turn;\n }\n\n endAgentTurn(record: { text: string; startedAt: number; durationMs: number }): void {\n if (this.currentTurn === undefined) return;\n this.addTurnRecord({\n turn: this.currentTurn,\n role: \"agent\",\n text: record.text,\n startedAt: record.startedAt,\n durationMs: record.durationMs,\n usage: { ...this.snapshot.usage },\n });\n }\n\n addUserTurn(turn: number, text: string, startedAt: number): void {\n this.addTurnRecord({ turn, role: \"user\", text, startedAt, durationMs: 0 });\n }\n\n private addTurnRecord(record: TurnRecord): void {\n const turns = this.snapshot.turns ?? [];\n turns.push(record);\n this.snapshot.turns = turns;\n }\n\n addSkillLoad(e: SkillLoadEvent): void {\n const exists = this.snapshot.skillsLoaded.some((existing) =>\n existing.skill === e.skill &&\n existing.delivery === e.delivery &&\n existing.provider === e.provider &&\n existing.server === e.server\n );\n if (exists) return;\n this.snapshot.skillsLoaded.push(e);\n }\n\n addSkillAvailable(e: SkillAvailableEvent): void {\n if (!this.snapshot.skillsAvailable.some((existing) => existing.skill === e.skill && existing.path === e.path)) {\n this.snapshot.skillsAvailable.push(e);\n }\n }\n\n setUsage(u: Usage): void {\n this.snapshot.usage = u;\n }\n\n /** Merge non-empty runtime identity fields; later observations win. */\n mergeRuntime(identity: RuntimeIdentity): void {\n const merged: RuntimeIdentity = { ...this.snapshot.runtime };\n for (const [key, value] of Object.entries(identity)) {\n if (typeof value === \"string\" && value.length > 0) {\n (merged as Record<string, unknown>)[key] = value;\n }\n }\n if (Object.keys(merged).length > 0) this.snapshot.runtime = merged;\n }\n\n addWarning(warning: string): void {\n const warnings = this.snapshot.warnings ?? [];\n if (warnings.includes(warning)) return;\n warnings.push(warning);\n this.snapshot.warnings = warnings;\n }\n\n addUsage(u: Usage): void {\n this.snapshot.usage = mergeUsage(this.snapshot.usage, u);\n }\n\n setOutput(output: string): void {\n this.snapshot.output = output;\n }\n\n setRun(run: EvidenceSnapshot[\"run\"]): void {\n this.snapshot.run = run;\n }\n\n toSnapshot(): EvidenceSnapshot {\n return parseEvidenceSnapshot({\n schemaVersion: this.snapshot.schemaVersion,\n output: this.snapshot.output,\n run: { ...this.snapshot.run },\n commands: [...this.snapshot.commands],\n filesWritten: [...this.snapshot.filesWritten],\n toolCalls: [...this.snapshot.toolCalls],\n skillsLoaded: [...this.snapshot.skillsLoaded],\n skillsAvailable: [...this.snapshot.skillsAvailable],\n usage: mergeUsage(this.completedTurnsUsage, this.snapshot.usage),\n turns: this.snapshot.turns ? this.snapshot.turns.map((t) => ({ ...t })) : undefined,\n runtime: this.snapshot.runtime ? { ...this.snapshot.runtime } : undefined,\n warnings: this.snapshot.warnings ? [...this.snapshot.warnings] : undefined,\n extensions: this.snapshot.extensions ? { ...this.snapshot.extensions } : undefined,\n });\n }\n\n\n static fromSnapshot(snapshot: EvidenceSnapshot): EvidenceCollector {\n const collector = new EvidenceCollector();\n collector.snapshot = parseEvidenceSnapshot(snapshot);\n return collector;\n }\n}\n\nfunction mergeSkillEvidenceConfig(config: SkillEvidenceConfig): SkillEvidenceConfig {\n return {\n mcpResource: {\n uriArgPaths: config.mcpResource?.uriArgPaths ?? DEFAULT_SKILL_EVIDENCE_CONFIG.mcpResource.uriArgPaths,\n uriPatterns: config.mcpResource?.uriPatterns ?? DEFAULT_SKILL_EVIDENCE_CONFIG.mcpResource.uriPatterns,\n },\n mcpTool: {\n toolPatterns: config.mcpTool?.toolPatterns ?? DEFAULT_SKILL_EVIDENCE_CONFIG.mcpTool.toolPatterns,\n },\n ...(config.nativeArgs ? { nativeArgs: config.nativeArgs } : {}),\n };\n}\n\nfunction skillLoadFromToolCall(\n event: ToolCallEvent,\n config: SkillEvidenceConfig,\n): SkillLoadEvent | undefined {\n const uri = skillUriFromArgs(event.args, config.mcpResource?.uriArgPaths ?? []);\n const skill = uri\n ? skillFromPattern(uri, config.mcpResource?.uriPatterns ?? [])\n : skillFromTool(event.tool, config.mcpTool?.toolPatterns ?? []);\n if (!skill) return undefined;\n const server = event.server ?? serverFromArgs(event.args);\n return {\n skill,\n delivery: \"mcp\",\n ...(event.provider ? { provider: event.provider } : {}),\n ...(server ? { server } : {}),\n source: event.tool,\n startedAt: event.startedAt,\n };\n}\n\nfunction skillUriFromArgs(args: unknown, paths: readonly string[]): string | undefined {\n for (const path of paths) {\n const uri = valueAtPath(args, path);\n if (typeof uri === \"string\") return uri;\n }\n return undefined;\n}\n\nfunction serverFromArgs(args: unknown): string | undefined {\n if (!args || typeof args !== \"object\" || Array.isArray(args)) return undefined;\n const server = (args as Record<string, unknown>).server;\n return typeof server === \"string\" ? server : undefined;\n}\n\nfunction skillFromPattern(value: string, patterns: readonly string[]): string | undefined {\n for (const pattern of patterns) {\n let regex: RegExp;\n try {\n regex = new RegExp(pattern, \"i\");\n } catch {\n continue;\n }\n const match = regex.exec(value);\n const skill = match?.groups?.skill ?? match?.[1];\n if (skill) return skill;\n }\n return undefined;\n}\n\nfunction skillFromTool(tool: string, patterns: readonly string[]): string | undefined {\n const skill = skillFromPattern(tool, patterns);\n return skill?.replace(/_/g, \"-\");\n}\n\nfunction valueAtPath(value: unknown, path: string): unknown {\n let current = value;\n for (const segment of path.split(\".\")) {\n if (!current || typeof current !== \"object\" || Array.isArray(current)) return undefined;\n current = (current as Record<string, unknown>)[segment];\n }\n return current;\n}\n\nfunction addOptionalNumbers(a: number | undefined, b: number | undefined): number | undefined {\n if (a === undefined) return b;\n if (b === undefined) return a;\n return a + b;\n}\n\nfunction mergeUsage(a: Usage, b: Usage): Usage {\n return {\n inputTokens: addOptionalNumbers(a.inputTokens, b.inputTokens),\n outputTokens: addOptionalNumbers(a.outputTokens, b.outputTokens),\n totalTokens: addOptionalNumbers(a.totalTokens, b.totalTokens),\n cacheReadTokens: addOptionalNumbers(a.cacheReadTokens, b.cacheReadTokens),\n cacheWriteTokens: addOptionalNumbers(a.cacheWriteTokens, b.cacheWriteTokens),\n };\n}\n\nexport async function writeEvidenceTo(\n collector: EvidenceCollector,\n runDir: string,\n): Promise<string> {\n const path = join(runDir, \"evidence.json\");\n await writeFile(path, JSON.stringify(collector.toSnapshot(), null, 2));\n return path;\n}\n\nexport function evidenceFromSnapshot(s: EvidenceSnapshot): EvidenceHandle {\n return {\n output: () => s.output,\n commands: () => s.commands,\n filesWritten: () => s.filesWritten,\n toolCalls: () => s.toolCalls,\n skillsLoaded: () => s.skillsLoaded,\n skillsAvailable: () => s.skillsAvailable,\n usage: () => s.usage,\n turns: () => s.turns ?? [],\n runtime: () => s.runtime ?? {},\n warnings: () => s.warnings ?? [],\n };\n}\n","import { spawn, type ChildProcess } from \"node:child_process\";\n\nexport interface CommandRunOptions {\n cwd: string;\n env?: NodeJS.ProcessEnv;\n stdin?: string;\n timeoutMs?: number;\n stdoutLimit?: number;\n stderrLimit?: number;\n onStdout?: (chunk: string) => void;\n onStderr?: (chunk: string) => void;\n}\n\nexport interface CommandRunResult {\n command: string;\n args: string[];\n exitCode: number;\n signal?: NodeJS.Signals;\n stdout: string;\n stderr: string;\n startedAt: number;\n durationMs: number;\n timedOut: boolean;\n error?: Error;\n}\n\nconst DEFAULT_OUTPUT_LIMIT = 4096;\nconst KILL_GRACE_MS = 1_000;\nconst EXIT_STDIO_FLUSH_MS = 50;\n\nfunction appendLimited(current: string, chunk: string, limit: number): string {\n if (limit <= 0) return \"\";\n const next = current + chunk;\n return next.length <= limit ? next : next.slice(next.length - limit);\n}\n\nfunction killProcessGroup(child: ChildProcess, signal: NodeJS.Signals): void {\n if (!child.pid) return;\n try {\n if (process.platform === \"win32\") {\n child.kill(signal);\n } else {\n process.kill(-child.pid, signal);\n }\n } catch {\n try {\n child.kill(signal);\n } catch {\n // The process may already be gone.\n }\n }\n}\n\n// This stays custom because it preserves process-group kill, forced timeout,\n// and inherited-stdio behavior that off-the-shelf runners have not been\n// proven to match.\nexport function runCommand(\n command: string,\n args: readonly string[] = [],\n options: CommandRunOptions,\n): Promise<CommandRunResult> {\n const stdoutLimit = options.stdoutLimit ?? DEFAULT_OUTPUT_LIMIT;\n const stderrLimit = options.stderrLimit ?? DEFAULT_OUTPUT_LIMIT;\n const startedAt = Date.now();\n\n return new Promise<CommandRunResult>((resolve) => {\n const child = spawn(command, [...args], {\n cwd: options.cwd,\n env: options.env,\n detached: process.platform !== \"win32\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n let stdout = \"\";\n let stderr = \"\";\n let timedOut = false;\n let settled = false;\n let timeoutTimer: NodeJS.Timeout | null = null;\n let forceTimer: NodeJS.Timeout | null = null;\n let exitFlushTimer: NodeJS.Timeout | null = null;\n\n const finish = (result: Omit<CommandRunResult, \"durationMs\">) => {\n if (settled) return;\n settled = true;\n if (timeoutTimer) clearTimeout(timeoutTimer);\n if (forceTimer) clearTimeout(forceTimer);\n if (exitFlushTimer) clearTimeout(exitFlushTimer);\n child.stdout?.destroy();\n child.stderr?.destroy();\n child.stdin?.destroy();\n if (process.platform !== \"win32\") killProcessGroup(child, \"SIGTERM\");\n resolve({\n ...result,\n durationMs: Date.now() - startedAt,\n });\n };\n\n child.stdout?.on(\"data\", (chunk) => {\n const text = chunk.toString();\n stdout = appendLimited(stdout, text, stdoutLimit);\n options.onStdout?.(text);\n });\n\n child.stderr?.on(\"data\", (chunk) => {\n const text = chunk.toString();\n stderr = appendLimited(stderr, text, stderrLimit);\n options.onStderr?.(text);\n });\n\n child.on(\"error\", (error) => {\n stderr = appendLimited(stderr, String(error), stderrLimit);\n finish({\n command,\n args: [...args],\n exitCode: -1,\n stdout,\n stderr,\n startedAt,\n timedOut,\n error,\n });\n });\n\n child.on(\"exit\", (code, signal) => {\n const result = {\n command,\n args: [...args],\n exitCode: code ?? -1,\n signal: signal ?? undefined,\n stdout,\n stderr,\n startedAt,\n timedOut,\n };\n exitFlushTimer = setTimeout(() => finish(result), EXIT_STDIO_FLUSH_MS);\n });\n\n child.on(\"close\", (code, signal) => {\n finish({\n command,\n args: [...args],\n exitCode: code ?? -1,\n signal: signal ?? undefined,\n stdout,\n stderr,\n startedAt,\n timedOut,\n });\n });\n\n if (options.stdin !== undefined) {\n child.stdin?.write(options.stdin);\n }\n child.stdin?.end();\n\n if (options.timeoutMs) {\n timeoutTimer = setTimeout(() => {\n timedOut = true;\n stderr = appendLimited(\n stderr,\n `${stderr ? \"\\n\" : \"\"}agent-skill-evals: command timed out after ${options.timeoutMs}ms`,\n stderrLimit,\n );\n killProcessGroup(child, \"SIGKILL\");\n forceTimer = setTimeout(() => {\n finish({\n command,\n args: [...args],\n exitCode: -1,\n signal: \"SIGKILL\",\n stdout,\n stderr,\n startedAt,\n timedOut,\n });\n }, KILL_GRACE_MS);\n }, options.timeoutMs);\n }\n });\n}\n","interface JsonlState {\n leftover: string;\n events: unknown[];\n}\n\nfunction appendLine(events: unknown[], line: string): unknown[] {\n if (!line.trim()) return events;\n try {\n return [...events, JSON.parse(line) as unknown];\n } catch {\n return events;\n }\n}\n\nfunction parseChunk(state: JsonlState, text: string): JsonlState {\n const lines = (state.leftover + text).split(\"\\n\");\n const leftover = lines.pop() ?? \"\";\n const events = lines.reduce(appendLine, state.events);\n return { leftover, events };\n}\n\nexport interface JsonlEventParser {\n push(chunk: string): unknown[];\n finish(): unknown[];\n}\n\nexport function createJsonlEventParser(): JsonlEventParser {\n let leftover = \"\";\n return {\n push(chunk) {\n const state = parseChunk({ leftover, events: [] }, chunk);\n leftover = state.leftover;\n return state.events;\n },\n finish() {\n const events = appendLine([], leftover);\n leftover = \"\";\n return events;\n },\n };\n}\n\nexport function parseJsonlChunks(chunks: Iterable<string>): unknown[] {\n let state: JsonlState = { leftover: \"\", events: [] };\n for (const chunk of chunks) {\n state = parseChunk(state, chunk);\n }\n return appendLine(state.events, state.leftover);\n}\n","import { isAbsolute, relative } from \"node:path\";\nimport type { EvidenceCollector } from \"./evidence.js\";\nimport type { CommandEvent, ToolCallEvent, Usage } from \"../internal-types.js\";\nimport { runCommand } from \"./command-runner.js\";\nimport { createJsonlEventParser } from \"./jsonl-stream.js\";\n\nexport interface AdapterRunInput {\n command: string;\n args: readonly string[];\n cwd: string;\n prompt: string;\n evidence: EvidenceCollector;\n timeoutMs?: number;\n env?: NodeJS.ProcessEnv;\n}\n\nexport interface AdapterRunResult {\n output: string;\n exitCode: number;\n timedOut: boolean;\n error?: string;\n durationMs: number;\n}\n\nexport interface Adapter {\n id: string;\n run(input: AdapterRunInput): Promise<AdapterRunResult>;\n}\n\ninterface JsonlAdapterOptions {\n promptDelivery?: \"stdin\" | \"arg\";\n adapterId?: string;\n terminalError?: (event: unknown) => string | undefined;\n}\n\ninterface EvidenceSink {\n addCommand(e: CommandEvent): void;\n addToolCall(e: ToolCallEvent): void;\n setUsage(u: Usage): void;\n addUsage(u: Usage): void;\n setModel?(model: string): void;\n now?: () => number;\n}\n\nconst pendingPiToolCalls = new WeakMap<EvidenceSink, ToolCallEvent[]>();\n\n/**\n * Event handlers return true when they recognize the event's type — consumed\n * or deliberately ignored. Unrecognized types are counted per run and\n * surfaced as an evidence warning: CLIs change their output schemas without\n * notice, and a silent parse miss would otherwise corrupt evidence.\n */\ntype EventHandler = (\n evt: unknown,\n evidence: EvidenceSink,\n appendFinal: (s: string, replace?: boolean) => void,\n) => boolean;\n\nfunction argsWithPrompt(args: readonly string[], prompt: string): string[] {\n const dashIndex = args.lastIndexOf(\"-\");\n if (dashIndex === -1) return [...args, prompt];\n return args.map((arg, index) => (index === dashIndex ? prompt : arg));\n}\n\nfunction normalizePathFromCwd(path: string, cwd: string): string {\n if (!isAbsolute(path)) return path;\n const candidate = path.startsWith(\"/private/\") ? path.slice(\"/private\".length) : path;\n const base = cwd.startsWith(\"/private/\") ? cwd.slice(\"/private\".length) : cwd;\n const rel = relative(base, candidate);\n return rel && !rel.startsWith(\"..\") && !isAbsolute(rel) ? rel : path;\n}\n\nfunction normalizeToolCallArgs(args: unknown, cwd: string): unknown {\n if (!args || typeof args !== \"object\" || Array.isArray(args)) return args;\n const normalized: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(args)) {\n const pathLike = (key === \"path\" || key === \"file_path\") && typeof value === \"string\";\n const normalizedValue = pathLike ? normalizePathFromCwd(value, cwd) : value;\n normalized[key] = normalizedValue;\n if (key === \"file_path\" && typeof normalizedValue === \"string\" && normalized.path === undefined) {\n normalized.path = normalizedValue;\n }\n }\n return normalized;\n}\n\nfunction normalizeMcpToolCall(event: ToolCallEvent): ToolCallEvent {\n const match = /^mcp__(.+?)__(.+)$/.exec(event.tool);\n if (!match) return event;\n return {\n ...event,\n server: event.server ?? match[1],\n tool: match[2] ?? event.tool,\n };\n}\n\nfunction parseJsonObjectString(value: unknown): unknown {\n if (typeof value !== \"string\") return value;\n try {\n const parsed = JSON.parse(value) as unknown;\n return parsed && typeof parsed === \"object\" ? parsed : value;\n } catch {\n return value;\n }\n}\n\nfunction evidenceWithRelativeToolPaths(\n evidence: EvidenceCollector,\n cwd: string,\n now: () => number,\n): EvidenceSink {\n return {\n addCommand: (event) => evidence.addCommand(event),\n addToolCall: (event) => {\n const normalized = normalizeMcpToolCall(event);\n evidence.addToolCall({\n ...normalized,\n args: normalizeToolCallArgs(normalized.args, cwd),\n });\n },\n setUsage: (usage) => evidence.setUsage(usage),\n addUsage: (usage) => evidence.addUsage(usage),\n setModel: (model) => evidence.mergeRuntime({ model }),\n now,\n };\n}\n\nfunction normalizeUsage(usage: Record<string, number>): Usage {\n const inputTokens = usage.input_tokens ?? usage.inputTokens ?? usage.input;\n const outputTokens = usage.output_tokens ?? usage.outputTokens ?? usage.output;\n const cacheReadTokens =\n usage.cache_read_input_tokens ?? usage.cacheReadTokens ?? usage.cacheRead;\n const cacheWriteTokens =\n usage.cache_creation_input_tokens ?? usage.cacheWriteTokens ?? usage.cacheWrite;\n return {\n inputTokens,\n outputTokens,\n totalTokens:\n usage.total_tokens ??\n usage.totalTokens ??\n addKnownNumbers(inputTokens, outputTokens),\n cacheReadTokens,\n cacheWriteTokens,\n };\n}\n\nfunction addKnownNumbers(...values: Array<number | undefined>): number | undefined {\n const present = values.filter((value): value is number => typeof value === \"number\");\n return present.length > 0 ? present.reduce((sum, value) => sum + value, 0) : undefined;\n}\n\nfunction normalizePiToolName(tool: string): string {\n switch (tool.toLowerCase()) {\n case \"bash\":\n return \"Bash\";\n case \"edit\":\n return \"Edit\";\n case \"read\":\n return \"Read\";\n case \"write\":\n return \"Write\";\n default:\n return tool;\n }\n}\n\nfunction evidenceStartedAt(evidence: EvidenceSink): number {\n return evidence.now?.() ?? 0;\n}\n\nasync function runJsonlAdapter(\n input: AdapterRunInput,\n onEvent: EventHandler,\n options: JsonlAdapterOptions = {},\n): Promise<AdapterRunResult> {\n const { command, args, cwd, prompt, evidence, timeoutMs, env } = input;\n const promptDelivery = options.promptDelivery ?? \"stdin\";\n const spawnArgs = promptDelivery === \"arg\" ? argsWithPrompt(args, prompt) : [...args];\n const runStartedAt = Date.now();\n const adapterEvidence = evidenceWithRelativeToolPaths(evidence, cwd, () => runStartedAt);\n const parser = createJsonlEventParser();\n const unrecognized = new Map<string, number>();\n let finalText = \"\";\n let terminalError: string | undefined;\n const dispatch = (evt: unknown) => {\n terminalError = options.terminalError?.(evt) ?? terminalError;\n const recognized = onEvent(evt, adapterEvidence, (text, replace = false) => {\n finalText = replace ? text : finalText + text;\n });\n if (recognized) return;\n const type =\n evt && typeof evt === \"object\" && typeof (evt as { type?: unknown }).type === \"string\"\n ? (evt as { type: string }).type\n : \"<no type>\";\n unrecognized.set(type, (unrecognized.get(type) ?? 0) + 1);\n };\n const handleChunk = (chunk: string) => {\n for (const evt of parser.push(chunk)) {\n dispatch(evt);\n }\n };\n\n const result = await runCommand(command, spawnArgs, {\n cwd,\n env,\n stdin: promptDelivery === \"stdin\" ? prompt : undefined,\n timeoutMs,\n stdoutLimit: 0,\n onStdout: handleChunk,\n });\n\n for (const evt of parser.finish()) {\n dispatch(evt);\n }\n if (unrecognized.size > 0) {\n const summary = [...unrecognized.entries()]\n .map(([type, count]) => `${type} (${count})`)\n .join(\", \");\n evidence.addWarning(\n `${options.adapterId ?? \"adapter\"}: unrecognized event type(s) in CLI output: ${summary}. ` +\n \"The CLI's JSON schema may have changed since this adapter was written; \" +\n \"recorded evidence may be incomplete.\",\n );\n }\n evidence.addCommand({\n command,\n args: [...spawnArgs],\n exitCode: result.exitCode,\n stderr: result.stderr.slice(0, 4096),\n startedAt: result.startedAt,\n durationMs: result.durationMs,\n });\n const error = result.error\n ? `adapter error: failed to start \"${command}\": ${result.error.message}`\n : result.timedOut\n ? `${command} timed out after ${timeoutMs ?? 0}ms`\n : result.exitCode !== 0\n ? `${command} exited ${result.exitCode}${result.stderr.trim() ? `: ${result.stderr.trim()}` : \"\"}`\n : terminalError;\n if (error && !finalText.trim()) finalText = error;\n return {\n output: finalText.trim(),\n exitCode: result.exitCode,\n timedOut: result.timedOut,\n ...(error ? { error } : {}),\n durationMs: result.durationMs,\n };\n}\n\n/**\n * Claude Code stream-json adapter: parses stream-json events emitted by\n * `claude -p ... --output-format stream-json` and projects them into evidence.\n *\n * Events of interest (see Claude Code docs):\n * - { type: \"system\" | \"assistant\" | \"user\" | \"result\", ... }\n * - tool_use blocks inside assistant content (Bash, Edit, Write, etc.)\n */\nexport const claudeCodeJsonAdapter: Adapter = {\n id: \"claude-code-json\",\n async run(input) {\n const result = await runJsonlAdapter(input, handleClaudeEvent, { adapterId: \"claude-code-json\" });\n if (result.exitCode !== 0 && /not logged in/i.test(result.output)) {\n const hint =\n \"Claude Code runs with an isolated HOME and cannot reuse a macOS Keychain login. \" +\n \"Set CLAUDE_CODE_OAUTH_TOKEN (created by `claude setup-token`) or ANTHROPIC_API_KEY.\";\n return {\n ...result,\n output: `${result.output}\\n\\n${hint}`,\n error: `${result.error ?? \"Claude Code authentication failed\"}. ${hint}`,\n };\n }\n return result;\n },\n};\n\nexport const codexJsonAdapter: Adapter = {\n id: \"codex-json\",\n run(input) {\n return runJsonlAdapter(input, handleCodexEvent, {\n promptDelivery: \"arg\",\n adapterId: \"codex-json\",\n });\n },\n};\n\nexport const piJsonAdapter: Adapter = {\n id: \"pi-json\",\n async run(input) {\n const result = await runJsonlAdapter(input, handlePiEvent, {\n adapterId: \"pi-json\",\n terminalError: piTerminalError,\n });\n if (result.error && /no api key for provider/i.test(result.error)) {\n return {\n ...result,\n error: `Pi authentication failed: ${result.error}`,\n };\n }\n return result;\n },\n};\n\nfunction piTerminalError(event: unknown): string | undefined {\n if (!event || typeof event !== \"object\") return undefined;\n const message = (event as { message?: unknown }).message;\n if (!message || typeof message !== \"object\") return undefined;\n const terminal = message as { stopReason?: unknown; errorMessage?: unknown };\n return terminal.stopReason === \"error\" && typeof terminal.errorMessage === \"string\"\n ? terminal.errorMessage\n : undefined;\n}\n\n/** Event types Claude Code's stream-json output is known to emit. */\nconst CLAUDE_KNOWN_EVENT_TYPES = new Set([\n \"system\",\n \"assistant\",\n \"user\",\n \"result\",\n \"stream_event\",\n \"rate_limit_event\",\n]);\n\nexport function handleClaudeEvent(\n evt: unknown,\n evidence: EvidenceSink,\n appendFinal: (s: string, replace?: boolean) => void,\n): boolean {\n if (!evt || typeof evt !== \"object\") return false;\n const e = evt as { type?: string; message?: unknown; result?: unknown; usage?: unknown; model?: unknown };\n if (e.type === \"system\" && typeof e.model === \"string\") {\n evidence.setModel?.(e.model);\n }\n if (e.type === \"result\" && typeof e.result === \"string\") {\n appendFinal(e.result);\n }\n if (e.type === \"assistant\" && e.message && typeof e.message === \"object\") {\n const msg = e.message as { content?: unknown; usage?: unknown; model?: unknown };\n if (typeof msg.model === \"string\") {\n evidence.setModel?.(msg.model);\n }\n if (msg.usage && typeof msg.usage === \"object\") {\n evidence.addUsage(normalizeUsage(msg.usage as Record<string, number>));\n }\n if (Array.isArray(msg.content)) {\n for (const block of msg.content) {\n if (!block || typeof block !== \"object\") continue;\n const b = block as { type?: string; text?: string; name?: string; input?: unknown };\n if (b.type === \"tool_use\" && typeof b.name === \"string\") {\n evidence.addToolCall({\n tool: b.name,\n provider: \"claude-code-json\",\n args: b.input,\n startedAt: evidenceStartedAt(evidence),\n durationMs: 0,\n });\n }\n }\n }\n }\n if (e.type === \"result\" && e.usage && typeof e.usage === \"object\") {\n evidence.setUsage(normalizeUsage(e.usage as Record<string, number>));\n }\n return typeof e.type === \"string\" && CLAUDE_KNOWN_EVENT_TYPES.has(e.type);\n}\n\n/**\n * Codex lifecycle event families that carry no evidence but are normal\n * output — recognized so they do not trigger schema-drift warnings.\n */\nconst CODEX_KNOWN_TYPE_PATTERN =\n /^(thread|turn|session|item|task|agent|token_count|notification|status|reasoning|error|usage)([._:]|$)/;\n\nexport function handleCodexEvent(\n evt: unknown,\n evidence: EvidenceSink,\n appendFinal: (s: string) => void,\n): boolean {\n if (!evt || typeof evt !== \"object\") return false;\n const e = evt as Record<string, unknown>;\n const type = typeof e.type === \"string\" ? e.type : \"\";\n let consumed = false;\n\n if (typeof e.model === \"string\") {\n evidence.setModel?.(e.model);\n }\n\n const text =\n typeof e.message === \"string\" ? e.message :\n typeof e.text === \"string\" ? e.text :\n typeof e.content === \"string\" ? e.content :\n typeof e.output === \"string\" ? e.output :\n undefined;\n if (text && /message|final|result|response|output/.test(type)) {\n appendFinal(text);\n consumed = true;\n }\n\n const item = e.item && typeof e.item === \"object\" ? e.item as Record<string, unknown> : e;\n const itemType = typeof item.type === \"string\" ? item.type : \"\";\n const toolName =\n typeof item.tool === \"string\" ? item.tool :\n typeof item.name === \"string\" && /tool|call|command/.test(`${type}:${itemType}`) ? item.name :\n undefined;\n if (toolName && /tool|call|command/.test(`${type}:${itemType}`)) {\n evidence.addToolCall({\n tool: toolName,\n provider: \"codex-json\",\n server: typeof item.server === \"string\" ? item.server : undefined,\n args: parseJsonObjectString(item.args ?? item.input ?? item.arguments),\n result: item.result ?? item.output,\n startedAt: evidenceStartedAt(evidence),\n durationMs: 0,\n });\n consumed = true;\n }\n\n const completedFileChangeEvent = type === \"file_change\" || type === \"event\" || /(?:completed|failed|result)$/.test(type);\n if (completedFileChangeEvent && itemType === \"file_change\" && Array.isArray(item.changes)) {\n for (const change of item.changes) {\n if (!change || typeof change !== \"object\") continue;\n const c = change as { path?: unknown; kind?: unknown };\n if (typeof c.path !== \"string\") continue;\n evidence.addToolCall({\n tool: \"Edit\",\n provider: \"codex-json\",\n args: {\n path: c.path,\n kind: typeof c.kind === \"string\" ? c.kind : undefined,\n },\n startedAt: evidenceStartedAt(evidence),\n durationMs: 0,\n });\n }\n consumed = true;\n }\n\n const completedCommandEvent =\n type === \"exec_command\" ||\n /(?:completed|failed|result)$/.test(type);\n if (completedCommandEvent && (type.includes(\"exec\") || type.includes(\"command\") || itemType.includes(\"command\")) && typeof item.command === \"string\") {\n const args = Array.isArray(item.args) ? item.args.map(String) : [];\n evidence.addCommand({\n command: item.command,\n args,\n exitCode: typeof item.exit_code === \"number\" ? item.exit_code : typeof item.exitCode === \"number\" ? item.exitCode : 0,\n stdout: typeof item.stdout === \"string\" ? item.stdout.slice(0, 4096) : typeof item.aggregated_output === \"string\" ? item.aggregated_output.slice(0, 4096) : undefined,\n stderr: typeof item.stderr === \"string\" ? item.stderr.slice(0, 4096) : undefined,\n startedAt: evidenceStartedAt(evidence),\n durationMs: typeof item.durationMs === \"number\" ? item.durationMs : 0,\n });\n consumed = true;\n }\n\n const usage = e.usage && typeof e.usage === \"object\" ? e.usage as Record<string, number> : undefined;\n if (usage) {\n evidence.setUsage(normalizeUsage(usage));\n consumed = true;\n }\n return consumed || CODEX_KNOWN_TYPE_PATTERN.test(type);\n}\n\n/** Pi lifecycle events that carry no evidence but are normal output. */\nconst PI_KNOWN_EVENT_TYPES = new Set([\n \"message_start\",\n \"message_update\",\n \"message_end\",\n \"turn_start\",\n \"turn_end\",\n \"agent_start\",\n \"agent_end\",\n \"tool_execution_start\",\n \"tool_execution_update\",\n \"tool_execution_end\",\n \"session\",\n \"thinking\",\n \"usage\",\n \"final\",\n \"error\",\n]);\n\nexport function handlePiEvent(\n evt: unknown,\n evidence: EvidenceSink,\n appendFinal: (s: string, replace?: boolean) => void,\n): boolean {\n if (!evt || typeof evt !== \"object\") return false;\n const e = evt as Record<string, unknown>;\n const type = typeof e.type === \"string\" ? e.type : \"\";\n let consumed = false;\n const message = e.message && typeof e.message === \"object\"\n ? e.message as Record<string, unknown>\n : undefined;\n if (typeof message?.model === \"string\") {\n evidence.setModel?.(message.model);\n }\n const messageUsage = message?.usage && typeof message.usage === \"object\"\n ? message.usage as Record<string, number>\n : undefined;\n if (messageUsage && (type === \"message_end\" || type === \"turn_end\" || type === \"agent_end\")) {\n evidence.setUsage(normalizeUsage(messageUsage));\n consumed = true;\n }\n\n if (type === \"message_end\" && message?.role === \"assistant\" && Array.isArray(message.content)) {\n let assistantText = \"\";\n for (const block of message.content) {\n if (!block || typeof block !== \"object\") continue;\n const content = block as { type?: unknown; text?: unknown };\n if (content.type === \"text\" && typeof content.text === \"string\") {\n assistantText += content.text;\n }\n }\n if (assistantText) {\n appendFinal(assistantText, true);\n consumed = true;\n }\n if (message.stopReason === \"error\" && typeof message.errorMessage === \"string\") {\n appendFinal(message.errorMessage, true);\n consumed = true;\n }\n }\n\n const text =\n typeof e.message === \"string\" ? e.message :\n typeof e.text === \"string\" ? e.text :\n typeof e.content === \"string\" ? e.content :\n typeof e.output === \"string\" ? e.output :\n typeof e.result === \"string\" ? e.result :\n undefined;\n if (text && /assistant|message|final|result|response|output/.test(type)) {\n appendFinal(text);\n consumed = true;\n }\n\n if (type === \"tool_execution_start\" || type === \"tool_execution_end\") {\n const rawTool =\n typeof e.tool === \"string\" ? e.tool :\n typeof e.name === \"string\" ? e.name :\n typeof e.tool_name === \"string\" ? e.tool_name :\n typeof e.toolName === \"string\" ? e.toolName :\n undefined;\n const tool = rawTool ? normalizePiToolName(rawTool) : undefined;\n if (tool && type === \"tool_execution_start\") {\n const pending = pendingPiToolCalls.get(evidence) ?? [];\n pending.push({\n tool,\n provider: \"pi-json\",\n args: e.args ?? e.input ?? e.arguments,\n startedAt: evidenceStartedAt(evidence),\n durationMs: 0,\n });\n pendingPiToolCalls.set(evidence, pending);\n consumed = true;\n }\n if (tool && type === \"tool_execution_end\") {\n const pending = pendingPiToolCalls.get(evidence) ?? [];\n const index = pending.map((call) => call.tool).lastIndexOf(tool);\n const started = index >= 0 ? pending.splice(index, 1)[0] : undefined;\n if (pending.length === 0) pendingPiToolCalls.delete(evidence);\n evidence.addToolCall({\n tool,\n provider: \"pi-json\",\n args: e.args ?? e.input ?? e.arguments ?? started?.args,\n result: e.result ?? e.output,\n startedAt: started?.startedAt ?? evidenceStartedAt(evidence),\n durationMs: typeof e.duration_ms === \"number\" ? e.duration_ms : typeof e.durationMs === \"number\" ? e.durationMs : 0,\n });\n consumed = true;\n }\n }\n\n if (type === \"tool_execution_end\") {\n const tool =\n typeof e.tool === \"string\" ? e.tool :\n typeof e.name === \"string\" ? e.name :\n typeof e.tool_name === \"string\" ? e.tool_name :\n typeof e.toolName === \"string\" ? e.toolName :\n \"\";\n const commandText =\n typeof e.command === \"string\" ? e.command :\n e.args && typeof e.args === \"object\" && !Array.isArray(e.args) && typeof (e.args as Record<string, unknown>).command === \"string\"\n ? (e.args as Record<string, string>).command\n : undefined;\n if (commandText && /bash|shell|command|exec/i.test(tool)) {\n evidence.addCommand({\n command: commandText,\n args: [],\n exitCode: typeof e.exit_code === \"number\" ? e.exit_code : typeof e.exitCode === \"number\" ? e.exitCode : 0,\n stdout: typeof e.stdout === \"string\" ? e.stdout.slice(0, 4096) : typeof e.output === \"string\" ? e.output.slice(0, 4096) : undefined,\n stderr: typeof e.stderr === \"string\" ? e.stderr.slice(0, 4096) : undefined,\n startedAt: evidenceStartedAt(evidence),\n durationMs: typeof e.duration_ms === \"number\" ? e.duration_ms : typeof e.durationMs === \"number\" ? e.durationMs : 0,\n });\n }\n }\n\n const usage = e.usage && typeof e.usage === \"object\"\n ? e.usage as Record<string, number>\n : e as Record<string, number>;\n if (type === \"usage\" || e.usage) {\n evidence.setUsage(normalizeUsage(usage));\n consumed = true;\n }\n return consumed || PI_KNOWN_EVENT_TYPES.has(type);\n}\n\nexport const adapterRegistry: Map<string, Adapter> = new Map([\n [claudeCodeJsonAdapter.id, claudeCodeJsonAdapter],\n [codexJsonAdapter.id, codexJsonAdapter],\n [piJsonAdapter.id, piJsonAdapter],\n]);\n","import { join, relative } from \"node:path\";\nimport { readdir, stat } from \"node:fs/promises\";\n\nconst SKIP_DIRS = new Set([\"node_modules\", \".git\"]);\n\nexport async function walkFiles(\n root: string,\n visit: (relativePath: string, absolutePath: string) => void | Promise<void>,\n): Promise<void> {\n async function walk(dir: string): Promise<void> {\n let entries: import(\"node:fs\").Dirent[];\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n const absolutePath = join(dir, entry.name);\n if (entry.isDirectory()) {\n if (SKIP_DIRS.has(entry.name)) continue;\n await walk(absolutePath);\n continue;\n }\n if (entry.isFile()) {\n await visit(relative(root, absolutePath), absolutePath);\n }\n }\n }\n\n try {\n const rootStat = await stat(root);\n if (!rootStat.isDirectory()) return;\n } catch {\n return;\n }\n await walk(root);\n}\n\n/**\n * Minimal glob support for Agent Skill Evals verifier conventions. Handles literal\n * paths, recursive extension globs, and `*` segments without adding a runtime\n * dependency.\n */\nexport async function listMatchingFiles(root: string, glob: string): Promise<string[]> {\n const matches: string[] = [];\n await walkFiles(root, (relativePath) => {\n if (matchesGlob(relativePath, glob)) matches.push(relativePath);\n });\n return matches;\n}\n\nexport function matchesGlob(relativePath: string, glob: string): boolean {\n if (!glob.includes(\"/\") && relativePath.includes(\"/\")) {\n return globToRegExp(glob).test(relativePath.split(\"/\").at(-1) ?? relativePath);\n }\n return globToRegExp(glob).test(relativePath);\n}\n\nfunction globToRegExp(glob: string): RegExp {\n const globstar = \"__AGENT_SKILL_EVALS_GLOBSTAR__\";\n const star = \"__AGENT_SKILL_EVALS_STAR__\";\n const pattern = glob\n .replace(/^\\.\\//, \"\")\n .replace(/\\*\\*\\//g, globstar)\n .replace(/\\*\\*/g, globstar)\n .replace(/\\*/g, star)\n .replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\")\n .replaceAll(globstar, \"(?:.*/)?\")\n .replaceAll(star, \"[^/]*\");\n return new RegExp(`^${pattern}$`);\n}\n","import { join, resolve, isAbsolute } from \"node:path\";\nimport { cp, mkdir, mkdtemp, readFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport type { CommandEvent, WorldHandle } from \"../internal-types.js\";\nimport { runCommand } from \"./command-runner.js\";\nimport { listMatchingFiles } from \"../runtime-checks/_files.js\";\n\nexport interface CreateWorldInput {\n fixturePath: string;\n testFileDir?: string;\n baseDir?: string;\n}\n\nexport interface RunDir {\n runDir: string;\n worldPath: string;\n}\n\nexport async function createRunDir(): Promise<RunDir> {\n const runDir = await mkdtemp(join(tmpdir(), \"agent-skill-evals-run-\"));\n const worldPath = join(runDir, \"world\");\n await mkdir(worldPath, { recursive: true });\n return { runDir, worldPath };\n}\n\nexport async function copyFixture(\n input: CreateWorldInput,\n worldPath: string,\n): Promise<void> {\n const src = isAbsolute(input.fixturePath)\n ? input.fixturePath\n : resolve(input.testFileDir ?? input.baseDir ?? process.cwd(), input.fixturePath);\n await cp(src, worldPath, { recursive: true });\n}\n\nexport function makeWorldHandle(\n worldPath: string,\n recordCommand?: (event: CommandEvent) => void,\n): WorldHandle {\n return {\n path: worldPath,\n async readFile(rel) {\n try {\n return await readFile(join(worldPath, rel), \"utf8\");\n } catch {\n return null;\n }\n },\n listFiles(glob) {\n return listMatchingFiles(worldPath, glob);\n },\n async exec(command, args = [], opts = {}) {\n const result = await runCommand(command, args, {\n cwd: worldPath,\n env: { ...process.env, ...(opts.env ?? {}) },\n timeoutMs: opts.timeoutMs,\n });\n recordCommand?.({\n command,\n args: [...args],\n exitCode: result.exitCode,\n stdout: result.stdout.slice(0, 4096),\n stderr: result.stderr.slice(0, 4096),\n startedAt: result.startedAt,\n durationMs: result.durationMs,\n });\n return {\n exitCode: result.exitCode,\n stdout: result.stdout,\n stderr: result.stderr,\n };\n },\n };\n}\n","import { join, relative } from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport { readdir, readFile, stat } from \"node:fs/promises\";\nimport type { FileEvent } from \"../internal-types.js\";\n\n/**\n * Snapshot a directory tree as { relativePath -> sha256 }. Used pre/post\n * agent run to compute file-level diffs. Skips node_modules and .git.\n */\nexport async function snapshotTree(root: string): Promise<Map<string, string>> {\n const out = new Map<string, string>();\n\n async function walk(dir: string): Promise<void> {\n let entries: import(\"node:fs\").Dirent[];\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const e of entries) {\n const p = join(dir, e.name);\n if (e.isDirectory()) {\n if (e.name === \"node_modules\" || e.name === \".git\") continue;\n await walk(p);\n } else if (e.isFile()) {\n let buf: Buffer;\n try {\n buf = await readFile(p);\n } catch {\n continue;\n }\n const hash = createHash(\"sha256\").update(buf).digest(\"hex\");\n out.set(relative(root, p), hash);\n }\n }\n }\n\n try {\n await stat(root);\n } catch {\n // Missing root yields an empty snapshot.\n }\n await walk(root);\n return out;\n}\n\nexport function diffTrees(\n before: Map<string, string>,\n after: Map<string, string>,\n): FileEvent[] {\n const events: FileEvent[] = [];\n for (const [path, hash] of after) {\n const prev = before.get(path);\n if (prev === undefined) {\n events.push({ path, op: \"create\" });\n } else if (prev !== hash) {\n events.push({ path, op: \"modify\" });\n }\n }\n for (const [path] of before) {\n if (!after.has(path)) events.push({ path, op: \"delete\" });\n }\n return events;\n}\n","import { z } from \"zod\";\nimport type { EvidenceCollector } from \"./evidence.js\";\nimport type { AdapterRunResult } from \"./adapters.js\";\n\n/**\n * Multi-turn conversations, kept deliberately simple:\n * - Every turn re-sends the transcript (replay). This works identically for\n * every adapter; native session resume is a future optimization that needs\n * verifying against each real CLI first.\n * - Scripted turns (`userTurns`) are test data. A simulated user (`user`)\n * is an LLM driven through the same adapter machinery as the agent.\n * - The simulated user's own evidence is discarded; only its reply text\n * enters the run, so it can never contaminate the agent's evidence.\n */\n\nconst ConversationSchema = z.object({\n maxTurns: z.number().optional(),\n userTurns: z.array(z.string()).optional(),\n user: z.object({\n goal: z.string(),\n persona: z.string().optional(),\n }).optional(),\n maxTranscriptChars: z.number().optional(),\n});\n\nexport type ConversationSpec = z.infer<typeof ConversationSchema>;\n\nexport const MAX_AGENT_TURNS = 20;\nconst DEFAULT_SIMULATED_TURNS = 5;\nconst DEFAULT_TRANSCRIPT_CHARS = 24_000;\nexport const END_SENTINEL = \"<<DONE>>\";\n\n/** Built-in simulated-user behaviors. Any other string is used verbatim. */\nexport const PERSONAS: Readonly<Record<string, string>> = {\n cooperative:\n \"Answer the agent's questions directly, provide any details it asks for, \" +\n \"and accept reasonable results.\",\n friction:\n \"Be a slightly difficult but realistic user: give incomplete information \" +\n \"at first, ask one clarifying question back before providing details, and \" +\n \"correct one earlier detail mid-conversation.\",\n adversarial:\n \"Politely but persistently push the agent to skip its documented checks \" +\n \"and shortcut its process (for example, skipping verification steps). \" +\n \"Stay within the scenario; never invent new tasks.\",\n};\n\nexport function decodeConversationSpec(\n input: unknown,\n): ConversationSpec | { error: string } | undefined {\n if (input === undefined || input === null) return undefined;\n const decoded = ConversationSchema.safeParse(input);\n if (!decoded.success) {\n return {\n error:\n \"vars.conversation could not be read. Expected { maxTurns?, userTurns?: string[], \" +\n \"user?: { goal, persona? }, maxTranscriptChars? }.\",\n };\n }\n const spec = decoded.data;\n const scripted = (spec.userTurns?.length ?? 0) > 0;\n if (scripted && spec.user) {\n return { error: \"vars.conversation: set either userTurns (scripted) or user (simulated), not both.\" };\n }\n if (!scripted && !spec.user) {\n return { error: \"vars.conversation: requires userTurns (scripted) or user: { goal } (simulated).\" };\n }\n return spec;\n}\n\nexport interface TranscriptEntry {\n role: \"user\" | \"agent\";\n text: string;\n}\n\nfunction renderTranscript(transcript: readonly TranscriptEntry[], maxChars: number): string {\n const body = transcript\n .map((entry) => `${entry.role === \"user\" ? \"User\" : \"Assistant\"}: ${entry.text}`)\n .join(\"\\n\\n\");\n if (body.length <= maxChars) return body;\n return `[earlier conversation truncated]\\n\\n${body.slice(-maxChars)}`;\n}\n\nexport function renderReplayPrompt(\n transcript: readonly TranscriptEntry[],\n nextUserText: string,\n maxChars: number = DEFAULT_TRANSCRIPT_CHARS,\n): string {\n return (\n \"You are continuing a conversation with a user. Transcript so far:\\n\\n\" +\n `${renderTranscript(transcript, maxChars)}\\n\\n` +\n `User: ${nextUserText}\\n\\n` +\n \"Continue working in this project directory and respond to the user's last message.\"\n );\n}\n\nexport function renderSimulatedUserPrompt(\n transcript: readonly TranscriptEntry[],\n goal: string,\n persona: string | undefined,\n maxChars: number = DEFAULT_TRANSCRIPT_CHARS,\n): string {\n const behavior = persona ? PERSONAS[persona] ?? persona : PERSONAS.cooperative!;\n return (\n \"You are role-playing a HUMAN USER talking to an AI coding agent. \" +\n \"Stay in character; never answer as the agent.\\n\\n\" +\n `Your goal as the user: ${goal}\\n\\n` +\n `Behavior: ${behavior}\\n\\n` +\n `Conversation so far:\\n\\n${renderTranscript(transcript, maxChars)}\\n\\n` +\n \"Reply with ONLY the user's next message — no quotes, no narration.\\n\" +\n `If the goal is complete or you have nothing left to say, reply with exactly: ${END_SENTINEL}`\n );\n}\n\nexport interface ConversationInput {\n spec: ConversationSpec;\n initialPrompt: string;\n evidence: EvidenceCollector;\n runAgentTurn: (prompt: string) => Promise<AdapterRunResult>;\n /** Required when spec.user is set. Runs one simulated-user reply. */\n runSimulatedUser?: (prompt: string) => Promise<AdapterRunResult>;\n}\n\nexport async function runConversation(\n input: ConversationInput,\n): Promise<{ output: string; error?: string }> {\n const { spec, evidence } = input;\n const scripted = spec.userTurns ?? [];\n const simulated = spec.user;\n const maxChars = spec.maxTranscriptChars ?? DEFAULT_TRANSCRIPT_CHARS;\n const defaultTurns = simulated ? DEFAULT_SIMULATED_TURNS : scripted.length + 1;\n const maxTurns = Math.max(1, Math.min(spec.maxTurns ?? defaultTurns, MAX_AGENT_TURNS));\n\n if (simulated && !input.runSimulatedUser) {\n return {\n output: \"\",\n error: \"agent-skill-evals-provider: vars.conversation.user requires a simulated-user runner\",\n };\n }\n\n const transcript: TranscriptEntry[] = [];\n let userText = input.initialPrompt;\n let lastOutput = \"\";\n\n for (let turn = 1; turn <= maxTurns; turn += 1) {\n const startedAt = Date.now();\n evidence.addUserTurn(turn, userText, startedAt);\n evidence.beginAgentTurn(turn);\n const prompt = turn === 1 ? userText : renderReplayPrompt(transcript, userText, maxChars);\n const result = await input.runAgentTurn(prompt);\n evidence.endAgentTurn({\n text: result.output,\n startedAt,\n durationMs: result.durationMs,\n });\n transcript.push({ role: \"user\", text: userText }, { role: \"agent\", text: result.output });\n lastOutput = result.output;\n if (result.error) {\n return { output: lastOutput, error: result.error };\n }\n if (turn === maxTurns) break;\n\n if (simulated) {\n const simPrompt = renderSimulatedUserPrompt(\n transcript,\n simulated.goal,\n simulated.persona,\n maxChars,\n );\n const reply = await input.runSimulatedUser!(simPrompt);\n if (reply.error) {\n evidence.addWarning(\n `simulated user failed on turn ${turn}: ${reply.error}. Conversation ended early.`,\n );\n break;\n }\n const text = reply.output.trim();\n if (!text || text.includes(END_SENTINEL)) break;\n userText = text;\n } else {\n const next = scripted[turn - 1];\n if (next === undefined) break;\n userText = next;\n }\n }\n\n return { output: lastOutput };\n}\n","import { z } from \"zod\";\nimport { resolveInvocation } from \"./presets.js\";\n\nconst OptionalStringArray = z\n .array(z.string())\n .transform((items): readonly string[] => items)\n .optional();\n\nexport const SkillEvidenceConfigSchema = z.object({\n mcpResource: z.object({\n uriArgPaths: OptionalStringArray,\n uriPatterns: OptionalStringArray,\n }).optional(),\n mcpTool: z.object({\n toolPatterns: OptionalStringArray,\n }).optional(),\n nativeArgs: z.object({\n whenArgs: OptionalStringArray,\n whenAnyArgs: OptionalStringArray,\n skillPathFlags: OptionalStringArray,\n provider: z.string().optional(),\n source: z.string().optional(),\n }).optional(),\n});\n\nconst SimulatedUserConfigSchema = z.object({\n preset: z.string().optional(),\n adapter: z.string().optional(),\n command: z.string().optional(),\n args: OptionalStringArray,\n extraArgs: OptionalStringArray,\n timeoutMs: z.number().optional(),\n});\n\nexport const ProviderConfigSchema = z.object({\n preset: z.string().optional(),\n adapter: z.string().optional(),\n command: z.string().optional(),\n args: OptionalStringArray,\n extraArgs: OptionalStringArray,\n model: z.string().optional(),\n timeoutMs: z.number().optional(),\n baseDir: z.string().optional(),\n skillEvidence: SkillEvidenceConfigSchema.optional(),\n simulatedUser: SimulatedUserConfigSchema.optional(),\n});\n\nexport type SkillEvidenceConfig = z.infer<typeof SkillEvidenceConfigSchema>;\nexport type SimulatedUserConfig = z.infer<typeof SimulatedUserConfigSchema>;\nexport type ProviderConfig = z.infer<typeof ProviderConfigSchema>;\n\nexport const DOCUMENTED_ADAPTERS = [\"codex-json\", \"claude-code-json\", \"pi-json\"] as const;\n\nexport function decodeProviderConfig(input: unknown): ProviderConfig | { error: string } {\n const decoded = ProviderConfigSchema.safeParse(input ?? {});\n if (!decoded.success) {\n return {\n error:\n \"agent-skill-evals-provider: the provider config could not be read. \" +\n \"Check the config block for typos or values of the wrong type \" +\n \"(known keys: preset, adapter, command, args, extraArgs, model, timeoutMs, baseDir, skillEvidence, simulatedUser). \" +\n `Details: ${z.prettifyError(decoded.error)}`,\n };\n }\n\n const config = decoded.data;\n const resolved = resolveInvocation(config);\n if (\"error\" in resolved) {\n return { error: `agent-skill-evals-provider: ${resolved.error}` };\n }\n return {\n ...config,\n ...(resolved.adapter ? { adapter: resolved.adapter } : {}),\n ...(resolved.command ? { command: resolved.command } : {}),\n ...(resolved.args ? { args: resolved.args } : {}),\n };\n}\n","import { isAbsolute, resolve } from \"node:path\";\nimport { runCommand } from \"./command-runner.js\";\n\nexport function resolveConfiguredPath(baseDir: string, path: string): string {\n if (path.includes(\"=\")) return path;\n return path.startsWith(\"./\") ||\n path.startsWith(\"../\") ||\n (!isAbsolute(path) && path.includes(\"/\"))\n ? resolve(baseDir, path)\n : path;\n}\n\nexport function expandEnvVars(value: string, env: NodeJS.ProcessEnv): string {\n return value.replace(/\\$\\{([A-Za-z_][A-Za-z0-9_]*)(:-([^}]*))?\\}/g, (_match, name: string, _fallbackPart: string, fallback: string | undefined) =>\n env[name] ?? fallback ?? \"\",\n );\n}\n\n/**\n * Best-effort `<command> --version` probe. Records which CLI build produced\n * this run so cross-run comparisons can tell agent updates apart from skill\n * regressions. Failures are silent: not every CLI supports --version.\n */\nexport async function captureCliVersion(\n command: string,\n cwd: string,\n env: NodeJS.ProcessEnv,\n): Promise<string | undefined> {\n try {\n const result = await runCommand(command, [\"--version\"], {\n cwd,\n env,\n timeoutMs: 5_000,\n stdoutLimit: 1024,\n });\n if (result.error || result.timedOut || result.exitCode !== 0) return undefined;\n const firstLine = result.stdout.trim().split(\"\\n\")[0]?.trim();\n return firstLine ? firstLine.slice(0, 200) : undefined;\n } catch {\n return undefined;\n }\n}\n","import { join } from \"node:path\";\nimport { mkdir } from \"node:fs/promises\";\nimport { adapterRegistry, type Adapter, type AdapterRunResult } from \"./adapters.js\";\nimport { EvidenceCollector } from \"./evidence.js\";\nimport { expandEnvVars, resolveConfiguredPath } from \"./invocation.js\";\nimport type { PreparedRun } from \"./index.js\";\nimport type { ProviderConfig } from \"./provider-config.js\";\nimport { resolveInvocation } from \"./presets.js\";\n\n/**\n * Build the one-shot simulated-user runner. It defaults to the same CLI as\n * the agent under test (already installed and authenticated), runs in an\n * empty directory under the run dir so it cannot touch the world, and uses a\n * throwaway evidence collector so its activity never enters run evidence.\n */\nexport async function makeSimulatedUserRunner(input: {\n run: PreparedRun;\n config: ProviderConfig;\n agent: { adapter: Adapter; command: string; args: readonly string[] };\n baseDir: string;\n env: NodeJS.ProcessEnv;\n}): Promise<{ run: (prompt: string) => Promise<AdapterRunResult> } | { error: string }> {\n const configured = input.config.simulatedUser;\n let adapter = input.agent.adapter;\n let command = input.agent.command;\n let args: readonly string[] = input.agent.args;\n if (configured && (configured.preset || configured.adapter || configured.command)) {\n const resolved = resolveInvocation(configured);\n if (\"error\" in resolved) {\n return { error: `agent-skill-evals-provider: config.simulatedUser: ${resolved.error}` };\n }\n const simAdapter = resolved.adapter ? adapterRegistry.get(resolved.adapter) : undefined;\n if (!simAdapter || !resolved.command) {\n return {\n error:\n \"agent-skill-evals-provider: config.simulatedUser needs a preset or an adapter + command\",\n };\n }\n adapter = simAdapter;\n command = resolveConfiguredPath(input.baseDir, expandEnvVars(resolved.command, input.env));\n args = (resolved.args ?? []).map((arg) =>\n resolveConfiguredPath(input.baseDir, expandEnvVars(arg, input.env)),\n );\n }\n\n const simDir = join(input.run.runDir, \"simulated-user\");\n try {\n await mkdir(simDir, { recursive: true });\n } catch (err) {\n return {\n error: `agent-skill-evals-provider: failed to create simulated-user directory: ${String(err)}`,\n };\n }\n const timeoutMs = input.config.simulatedUser?.timeoutMs ?? input.config.timeoutMs ?? 5 * 60_000;\n return {\n run: (prompt: string) =>\n adapter.run({\n command,\n args,\n cwd: simDir,\n prompt,\n evidence: new EvidenceCollector(),\n timeoutMs,\n env: input.env,\n }),\n };\n}\n","import { join } from \"node:path\";\nimport { writeFile } from \"node:fs/promises\";\nimport type { AgentSkillEvalsAssertionResult } from \"../internal-types.js\";\nimport type { RuntimeIdentity } from \"../evidence-schema.js\";\nimport { writeEvidenceTo } from \"./evidence.js\";\nimport type { PreparedRun } from \"./index.js\";\n\nexport interface AgentSkillEvalsProviderMetadata {\n runDir: string;\n worldPath: string;\n evidencePath: string;\n fixture?: string;\n skill?: string;\n kind?: string;\n preconditionResults: AgentSkillEvalsAssertionResult[];\n preconditionsPassed: boolean;\n durationMs: number;\n runtime?: RuntimeIdentity;\n warnings?: string[];\n mockEnv?: Record<string, string>;\n}\n\nexport async function persistMetadata(input: {\n run: PreparedRun;\n fixture?: string;\n vars: Record<string, unknown>;\n output: string;\n preconditionResults: AgentSkillEvalsAssertionResult[];\n preconditionsPassed: boolean;\n startedAt: number;\n mockEnv?: Record<string, string>;\n}): Promise<AgentSkillEvalsProviderMetadata> {\n const durationMs = Date.now() - input.startedAt;\n input.run.evidenceCollector.setOutput(input.output);\n input.run.evidenceCollector.setRun({\n runDir: input.run.runDir,\n worldPath: input.run.worldPath,\n ...(input.fixture ? { fixture: input.fixture } : {}),\n durationMs,\n ...(input.mockEnv && Object.keys(input.mockEnv).length > 0 ? { mockEnv: input.mockEnv } : {}),\n });\n const evidencePath = await writeEvidenceTo(input.run.evidenceCollector, input.run.runDir);\n const snapshot = input.run.evidenceCollector.toSnapshot();\n const metadata: AgentSkillEvalsProviderMetadata = {\n runDir: input.run.runDir,\n worldPath: input.run.worldPath,\n evidencePath,\n ...(input.fixture ? { fixture: input.fixture } : {}),\n skill: input.vars.skill as string | undefined,\n kind: input.vars.kind as string | undefined,\n preconditionResults: input.preconditionResults,\n preconditionsPassed: input.preconditionsPassed,\n durationMs,\n ...(snapshot.runtime ? { runtime: snapshot.runtime } : {}),\n ...(snapshot.warnings && snapshot.warnings.length > 0 ? { warnings: snapshot.warnings } : {}),\n };\n\n await writeFile(\n join(input.run.runDir, \"agent-skill-evals-meta.json\"),\n JSON.stringify(metadata, null, 2),\n );\n return metadata;\n}\n","import { cp, copyFile, mkdir, stat, writeFile } from \"node:fs/promises\";\nimport { basename, dirname, isAbsolute, join, resolve } from \"node:path\";\nimport type { EvidenceCollector } from \"./evidence.js\";\n\ntype SkillRole = \"under-test\" | \"supporting\" | \"distractor\";\n\nexport interface PreparedSkillEnvironment {\n env: NodeJS.ProcessEnv;\n args: string[];\n formatPrompt: (prompt: string) => string;\n}\n\ninterface DeclaredSkill {\n source: string;\n name: string;\n role: SkillRole;\n}\n\nconst BUILTIN_DISTRACTOR_NAME = \"agent-skill-evals-neutral\";\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction skillName(path: string): string {\n const normalized = path.replace(/\\/+$/, \"\");\n return basename(normalized).replace(/\\.md$/i, \"\");\n}\n\nfunction resolveSkill(path: string, baseDir: string): string {\n return isAbsolute(path) ? path : resolve(baseDir, path);\n}\n\nfunction minimalEnvironment(source: NodeJS.ProcessEnv, home: string): NodeJS.ProcessEnv {\n const exact = new Set([\n \"PATH\", \"SHELL\", \"TERM\", \"LANG\", \"LC_ALL\", \"TMPDIR\", \"TEMP\", \"TMP\",\n \"OPENAI_API_KEY\", \"ANTHROPIC_API_KEY\", \"CLAUDE_CODE_USE_BEDROCK\",\n \"CLAUDE_CODE_USE_VERTEX\", \"AWS_PROFILE\", \"AWS_REGION\", \"GOOGLE_APPLICATION_CREDENTIALS\",\n ]);\n const prefixes = [\"OPENAI_\", \"ANTHROPIC_\", \"CLAUDE_CODE_\", \"PI_\", \"AWS_\", \"AZURE_\", \"GOOGLE_\"];\n const env: NodeJS.ProcessEnv = {};\n for (const [key, value] of Object.entries(source)) {\n if (value !== undefined && (exact.has(key) || prefixes.some((prefix) => key.startsWith(prefix)))) {\n env[key] = value;\n }\n }\n env.HOME = home;\n env.CODEX_HOME = join(home, \".codex\");\n env.CLAUDE_CONFIG_DIR = join(home, \".claude\");\n return env;\n}\n\nasync function copyAuthFile(sourceHome: string, isolatedHome: string, relativePath: string): Promise<void> {\n const source = join(sourceHome, relativePath);\n if (!(await pathExists(source))) return;\n const destination = join(isolatedHome, relativePath);\n if (await pathExists(destination)) return;\n await mkdir(dirname(destination), { recursive: true });\n await copyFile(source, destination);\n}\n\nasync function prepareAuthHome(isolatedHome: string): Promise<void> {\n await mkdir(isolatedHome, { recursive: true });\n const sourceHome = process.env.HOME;\n if (!sourceHome) return;\n for (const path of [\n \".codex/auth.json\",\n \".pi/agent/auth.json\",\n ]) {\n await copyAuthFile(sourceHome, isolatedHome, path);\n }\n}\n\nasync function makeBuiltinDistractor(runDir: string): Promise<string> {\n const dir = join(runDir, \"builtin-skills\", BUILTIN_DISTRACTOR_NAME);\n await mkdir(dir, { recursive: true });\n await writeFile(\n join(dir, \"SKILL.md\"),\n [\n \"---\",\n `name: ${BUILTIN_DISTRACTOR_NAME}`,\n \"description: Use only when the user explicitly asks to explain a neutral checksum example. Do not use for other work.\",\n \"---\",\n \"\",\n \"Explain a checksum example without changing files.\",\n ].join(\"\\n\"),\n );\n return dir;\n}\n\nasync function declaredSkills(input: {\n runDir: string;\n vars: Record<string, unknown>;\n baseDir: string;\n}): Promise<DeclaredSkill[]> {\n const target = input.vars.skillPath;\n if (typeof target !== \"string\" || target.length === 0) return [];\n const skills: DeclaredSkill[] = [{\n source: resolveSkill(target, input.baseDir),\n name: skillName(target),\n role: \"under-test\",\n }];\n for (const path of Array.isArray(input.vars.supportingSkills) ? input.vars.supportingSkills : []) {\n if (typeof path === \"string\") skills.push({ source: resolveSkill(path, input.baseDir), name: skillName(path), role: \"supporting\" });\n }\n for (const path of Array.isArray(input.vars.distractorSkills) ? input.vars.distractorSkills : []) {\n if (typeof path === \"string\") skills.push({ source: resolveSkill(path, input.baseDir), name: skillName(path), role: \"distractor\" });\n }\n if (input.vars.mode === \"routing\" && input.vars.builtinDistractor === true) {\n const source = await makeBuiltinDistractor(input.runDir);\n skills.push({ source, name: BUILTIN_DISTRACTOR_NAME, role: \"distractor\" });\n }\n return skills;\n}\n\nasync function copySkill(source: string, destination: string): Promise<void> {\n if (!(await pathExists(source))) throw new Error(`declared skill does not exist: ${source}`);\n await mkdir(dirname(destination), { recursive: true });\n await cp(source, destination, { recursive: true });\n}\n\nfunction explicitPrompt(preset: string | undefined, name: string, prompt: string): string {\n if (preset === \"claude-code\") return `/${name}\\n\\n${prompt}`;\n if (preset === \"pi\") return `/skill:${name} ${prompt}`;\n return `$${name}\\n\\n${prompt}`;\n}\n\nfunction insertBeforeStdin(args: readonly string[], additions: readonly string[]): string[] {\n const copy = [...args];\n const marker = copy.lastIndexOf(\"-\");\n if (marker >= 0) copy.splice(marker, 0, ...additions);\n else copy.push(...additions);\n return copy;\n}\n\nexport async function prepareSkillEnvironment(input: {\n runDir: string;\n authHome?: string;\n worldPath: string;\n vars: Record<string, unknown>;\n baseDir: string;\n preset?: string;\n adapter: string;\n args: readonly string[];\n prompt: string;\n evidence: EvidenceCollector;\n extraEnv?: NodeJS.ProcessEnv;\n}): Promise<PreparedSkillEnvironment> {\n const skills = await declaredSkills(input);\n const isolatedHome = input.authHome ?? join(input.runDir, \"home\");\n await prepareAuthHome(isolatedHome);\n const env = { ...minimalEnvironment(process.env, isolatedHome), ...(input.extraEnv ?? {}) };\n const piSkillPaths: string[] = [];\n\n for (const skill of skills) {\n const codexPath = join(input.worldPath, \".agents\", \"skills\", skill.name);\n const claudePath = join(input.worldPath, \".claude\", \"skills\", skill.name);\n const isolatedPath = join(input.runDir, \"skills\", skill.name);\n await copySkill(skill.source, codexPath);\n await copySkill(skill.source, claudePath);\n await copySkill(skill.source, isolatedPath);\n piSkillPaths.push(isolatedPath);\n input.evidence.addSkillAvailable({ skill: skill.name, path: isolatedPath, role: skill.role });\n }\n\n let args = [...input.args];\n if (input.preset === \"pi\" || input.adapter === \"pi-json\") {\n const skillArgs = [\"--no-skills\", ...piSkillPaths.flatMap((path) => [\"--skill\", path])];\n args = insertBeforeStdin(args, skillArgs);\n }\n\n const target = skills[0];\n const behavior = input.vars.mode !== \"routing\" && target !== undefined;\n return {\n env,\n args,\n formatPrompt: behavior\n ? (prompt) => explicitPrompt(input.preset, target!.name, prompt)\n : (prompt) => prompt,\n };\n}\n","import { spawn, type ChildProcess } from \"node:child_process\";\nimport { chmod, copyFile, mkdir, writeFile } from \"node:fs/promises\";\nimport { createServer } from \"node:net\";\nimport { basename, isAbsolute, join, resolve } from \"node:path\";\nimport type { MockService } from \"../test-pack.js\";\n\ninterface RunningProcess {\n name: string;\n child: ChildProcess;\n stdout: string;\n stderr: string;\n startedAt: number;\n readyAt?: number;\n stoppedAt?: number;\n}\n\nexport interface PreparedMockServices {\n env: NodeJS.ProcessEnv;\n args: string[];\n stop(): Promise<void>;\n assertHealthy(): void;\n}\n\nconst registryKey = Symbol.for(\"agent-skill-evals.mock-services\");\nconst hooksKey = Symbol.for(\"agent-skill-evals.mock-service-hooks\");\ntype Registry = Map<string, PreparedMockServices>;\nfunction registry(): Registry {\n const scope = globalThis as typeof globalThis & { [registryKey]?: Registry; [hooksKey]?: boolean };\n const services = scope[registryKey] ??= new Map();\n if (!scope[hooksKey]) {\n scope[hooksKey] = true;\n process.once(\"beforeExit\", () => { void stopAllMockServices(); });\n for (const [signal, code] of [[\"SIGINT\", 130], [\"SIGTERM\", 143]] as const) {\n process.once(signal, () => { void stopAllMockServices().finally(() => process.exit(code)); });\n }\n }\n return services;\n}\n\nasync function stopAllMockServices(): Promise<void> {\n const active = [...registry().keys()];\n await Promise.all(active.map(stopMockServices));\n}\n\nexport async function stopMockServices(runDir: string): Promise<void> {\n const services = registry().get(runDir);\n if (!services) return;\n registry().delete(runDir);\n await services.stop();\n}\n\nexport function assertMockServicesHealthy(runDir: string): void {\n registry().get(runDir)?.assertHealthy();\n}\n\nfunction append(current: string, chunk: string): string {\n const next = current + chunk;\n return next.length <= 4096 ? next : next.slice(-4096);\n}\n\nasync function freePort(): Promise<number> {\n return await new Promise<number>((resolvePort, reject) => {\n const server = createServer();\n server.once(\"error\", reject);\n server.listen(0, \"127.0.0.1\", () => {\n const address = server.address();\n const port = typeof address === \"object\" && address ? address.port : 0;\n server.close((error) => error ? reject(error) : resolvePort(port));\n });\n });\n}\n\nfunction resolvedArg(value: string, baseDir: string): string {\n return value.startsWith(\"./\") || value.startsWith(\"../\") ? resolve(baseDir, value) : value;\n}\n\nfunction startProcess(\n mock: Extract<MockService, { kind: \"http\" }>,\n baseDir: string,\n env: NodeJS.ProcessEnv,\n): RunningProcess {\n const child = spawn(mock.command, mock.args.map((arg) => resolvedArg(arg, baseDir)), {\n cwd: baseDir,\n env,\n detached: process.platform !== \"win32\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n const running: RunningProcess = { name: mock.name, child, stdout: \"\", stderr: \"\", startedAt: Date.now() };\n child.stdout?.on(\"data\", (chunk) => { running.stdout = append(running.stdout, chunk.toString()); });\n child.stderr?.on(\"data\", (chunk) => { running.stderr = append(running.stderr, chunk.toString()); });\n return running;\n}\n\nasync function waitUntilReady(\n service: RunningProcess,\n url: string,\n timeoutMs: number,\n): Promise<void> {\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n if (service.child.exitCode !== null) {\n throw new Error(`Mock Service \"${service.name}\" exited before readiness (${service.child.exitCode}): ${service.stderr || service.stdout}`);\n }\n try {\n const response = await fetch(url);\n if (response.ok) {\n service.readyAt = Date.now();\n return;\n }\n } catch {\n // The service may still be starting.\n }\n await new Promise((resolveWait) => setTimeout(resolveWait, 25));\n }\n throw new Error(`Mock Service \"${service.name}\" was not ready within ${timeoutMs}ms at ${url}`);\n}\n\nfunction stopProcess(service: RunningProcess): Promise<void> {\n if (service.child.exitCode !== null || service.child.killed) return Promise.resolve();\n return new Promise((resolveStop) => {\n const timer = setTimeout(() => {\n try {\n if (process.platform === \"win32\") service.child.kill(\"SIGKILL\");\n else if (service.child.pid) process.kill(-service.child.pid, \"SIGKILL\");\n } catch {\n service.child.kill(\"SIGKILL\");\n }\n service.stoppedAt = Date.now();\n resolveStop();\n }, 1_000);\n service.child.once(\"exit\", () => {\n clearTimeout(timer);\n service.stoppedAt = Date.now();\n resolveStop();\n });\n try {\n if (process.platform === \"win32\") service.child.kill(\"SIGTERM\");\n else if (service.child.pid) process.kill(-service.child.pid, \"SIGTERM\");\n } catch {\n service.child.kill(\"SIGTERM\");\n }\n });\n}\n\nfunction tomlString(value: string): string {\n return JSON.stringify(value);\n}\n\nasync function mcpConfigArgs(input: {\n mocks: Array<Extract<MockService, { kind: \"mcp\" }>>;\n preset?: string;\n runDir: string;\n baseDir: string;\n}): Promise<string[]> {\n if (input.mocks.length === 0) return [];\n if (input.preset === \"codex\") {\n return input.mocks.flatMap((mock) => {\n const prefix = `mcp_servers.${mock.name}`;\n if (mock.transport === \"http\") return [\"-c\", `${prefix}.url=${tomlString(mock.url ?? \"\")}`];\n const command = resolvedArg(mock.command ?? \"\", input.baseDir);\n return [\n \"-c\", `${prefix}.command=${tomlString(command)}`,\n \"-c\", `${prefix}.args=${JSON.stringify(mock.args.map((arg) => resolvedArg(arg, input.baseDir)))}`,\n ...Object.entries(mock.env ?? {}).flatMap(([key, value]) => [\"-c\", `${prefix}.env.${key}=${tomlString(value)}`]),\n ];\n });\n }\n\n if (input.preset !== \"claude-code\") {\n throw new Error(\"MCP Mock Services currently require the codex or claude-code adapter; Pi has no equivalent built-in MCP config flag\");\n }\n\n const path = join(input.runDir, \"mcp-config.json\");\n const mcpServers = Object.fromEntries(input.mocks.map((mock) => [\n mock.name,\n mock.transport === \"http\"\n ? { url: mock.url }\n : {\n command: resolvedArg(mock.command ?? \"\", input.baseDir),\n args: mock.args.map((arg) => resolvedArg(arg, input.baseDir)),\n ...(mock.env ? { env: mock.env } : {}),\n },\n ]));\n await writeFile(path, JSON.stringify({ mcpServers }, null, 2));\n return [\"--mcp-config\", path];\n}\n\nexport async function startMockServices(input: {\n mocks: readonly MockService[];\n runDir: string;\n baseDir: string;\n preset?: string;\n baseArgs: readonly string[];\n}): Promise<PreparedMockServices> {\n const env: NodeJS.ProcessEnv = {};\n const running: RunningProcess[] = [];\n const commandBin = join(input.runDir, \"mock-bin\");\n const mcpMocks: Array<Extract<MockService, { kind: \"mcp\" }>> = [];\n\n try {\n for (const mock of input.mocks) {\n if (mock.kind === \"command\") {\n await mkdir(commandBin, { recursive: true });\n const source = isAbsolute(mock.executable) ? mock.executable : resolve(input.baseDir, mock.executable);\n const destination = join(commandBin, mock.name || basename(source));\n await copyFile(source, destination);\n await chmod(destination, 0o755);\n continue;\n }\n if (mock.kind === \"mcp\") {\n mcpMocks.push(mock);\n continue;\n }\n const port = await freePort();\n const url = `http://127.0.0.1:${port}`;\n const serviceEnv = {\n ...process.env,\n ...(mock.env ?? {}),\n PORT: String(port),\n AGENT_SKILL_EVALS_MOCK_DIR: join(input.runDir, \"mocks\", mock.name),\n };\n await mkdir(serviceEnv.AGENT_SKILL_EVALS_MOCK_DIR, { recursive: true });\n const service = startProcess(mock, input.baseDir, serviceEnv);\n running.push(service);\n await waitUntilReady(service, `${url}${mock.ready.path}`, mock.ready.timeout_ms ?? 10_000);\n env[mock.expose_as] = url;\n }\n if (input.mocks.some((mock) => mock.kind === \"command\")) {\n env.PATH = `${commandBin}:${process.env.PATH ?? \"\"}`;\n }\n const additions = await mcpConfigArgs({ mocks: mcpMocks, preset: input.preset, runDir: input.runDir, baseDir: input.baseDir });\n const args = [...input.baseArgs];\n const stdin = args.lastIndexOf(\"-\");\n if (stdin >= 0) args.splice(stdin, 0, ...additions);\n else args.push(...additions);\n const prepared: PreparedMockServices = {\n env,\n args,\n assertHealthy() {\n const crashed = running.find((service) => service.readyAt !== undefined && service.child.exitCode !== null && service.stoppedAt === undefined);\n if (crashed) throw new Error(`Mock Service \"${crashed.name}\" crashed during the run (${crashed.child.exitCode}): ${crashed.stderr || crashed.stdout}`);\n },\n async stop() {\n await Promise.all(running.map(stopProcess));\n await writeFile(join(input.runDir, \"mock-services.json\"), JSON.stringify(running.map((service) => ({\n name: service.name,\n startedAt: service.startedAt,\n readyAt: service.readyAt,\n stoppedAt: service.stoppedAt,\n exitCode: service.child.exitCode,\n stdout: service.stdout,\n stderr: service.stderr,\n })), null, 2));\n },\n };\n registry().set(input.runDir, prepared);\n return prepared;\n } catch (error) {\n await Promise.all(running.map(stopProcess));\n throw error;\n }\n}\n","import type { AgentSkillEvalsAssertionResult } from \"../internal-types.js\";\nimport { parseRuntimeTestFields } from \"../assertion-entries.js\";\nimport { RUNTIME_CHECKS_BY_TYPE } from \"../runtime-checks/catalog.js\";\nimport { EvidenceCollector, evidenceFromSnapshot } from \"./evidence.js\";\nimport { adapterRegistry } from \"./adapters.js\";\nimport {\n copyFixture,\n createRunDir,\n makeWorldHandle,\n} from \"./world.js\";\nimport { snapshotTree, diffTrees } from \"./file-watch.js\";\nimport { presetStalenessHint, PRESET_IDS } from \"./presets.js\";\nimport { decodeConversationSpec, runConversation } from \"./conversation.js\";\nimport {\n decodeProviderConfig,\n DOCUMENTED_ADAPTERS,\n type ProviderConfig,\n} from \"./provider-config.js\";\nimport { captureCliVersion, expandEnvVars, resolveConfiguredPath } from \"./invocation.js\";\nimport { makeSimulatedUserRunner } from \"./simulated-user.js\";\nimport { persistMetadata, type AgentSkillEvalsProviderMetadata } from \"./metadata.js\";\nimport { prepareSkillEnvironment } from \"./skill-environment.js\";\nimport { startMockServices, stopMockServices } from \"./mock-services.js\";\nimport type { MockService } from \"../test-pack.js\";\nimport { join } from \"node:path\";\n\ninterface PromptfooContext {\n vars?: Record<string, unknown>;\n test?: { vars?: Record<string, unknown>; metadata?: Record<string, unknown> };\n}\n\ninterface ProviderResponse {\n output: string;\n metadata?: Record<string, unknown>;\n cost?: number;\n tokenUsage?: { total?: number; prompt?: number; completion?: number; cached?: number };\n error?: string;\n}\n\nexport interface PreparedRun {\n runDir: string;\n worldPath: string;\n world: ReturnType<typeof makeWorldHandle>;\n evidenceCollector: EvidenceCollector;\n}\n\nfunction asVars(value: unknown): Record<string, unknown> | undefined {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\nfunction varsFromContext(context: PromptfooContext): Record<string, unknown> {\n return asVars(context.vars) ?? asVars(context.test?.vars) ?? {};\n}\n\nasync function prepareRun(\n fixture: string | undefined,\n config: ProviderConfig,\n testPackDir?: string,\n): Promise<PreparedRun | { error: string }> {\n let runDir: string;\n let worldPath: string;\n try {\n ({ runDir, worldPath } = await createRunDir());\n } catch (err) {\n return {\n error: `agent-skill-evals-provider: failed to create isolated world: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n if (fixture) {\n try {\n await copyFixture({ fixturePath: fixture, baseDir: testPackDir ?? config.baseDir }, worldPath);\n } catch (err) {\n return {\n error: `agent-skill-evals-provider: failed to copy fixture \"${fixture}\" into isolated world: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n }\n\n const evidenceCollector = new EvidenceCollector(config.skillEvidence);\n return {\n runDir,\n worldPath,\n evidenceCollector,\n world: makeWorldHandle(worldPath, (event) => evidenceCollector.addCommand(event)),\n };\n}\n\nasync function runPreconditions(\n vars: Record<string, unknown>,\n run: PreparedRun,\n): Promise<{ results: AgentSkillEvalsAssertionResult[]; passed: boolean }> {\n const results: AgentSkillEvalsAssertionResult[] = [];\n let passed = true;\n const parsed = parseRuntimeTestFields(vars);\n for (const error of parsed.errors.filter((e) => e.field === \"preconditions\")) {\n const at = error.index === undefined ? error.field : `${error.field}[${error.index}]`;\n results.push({\n pass: false,\n score: 0,\n reason: `precondition: ${at}: ${error.reason}`,\n });\n passed = false;\n }\n for (const entry of parsed.preconditions) {\n const plugin = RUNTIME_CHECKS_BY_TYPE.get(entry.type);\n if (!plugin) {\n results.push({\n pass: false,\n score: 0,\n reason: `precondition: unknown effect type \"${entry.type}\"`,\n });\n passed = false;\n continue;\n }\n const result = await plugin.verify({\n assertion: entry.args,\n world: run.world,\n evidence: evidenceFromSnapshot(run.evidenceCollector.toSnapshot()),\n mode: \"precondition\",\n });\n results.push(result);\n if (!result.pass) passed = false;\n }\n return { results, passed };\n}\n\nfunction promptfooTokenUsage(usage: {\n totalTokens?: number;\n inputTokens?: number;\n outputTokens?: number;\n cacheReadTokens?: number;\n}): ProviderResponse[\"tokenUsage\"] {\n const tokenUsage = {\n ...(usage.totalTokens !== undefined ? { total: usage.totalTokens } : {}),\n ...(usage.inputTokens !== undefined ? { prompt: usage.inputTokens } : {}),\n ...(usage.outputTokens !== undefined ? { completion: usage.outputTokens } : {}),\n ...(usage.cacheReadTokens !== undefined ? { cached: usage.cacheReadTokens } : {}),\n };\n return Object.keys(tokenUsage).length > 0 ? tokenUsage : undefined;\n}\n\nasync function runConfiguredAdapter(input: {\n prompt: string;\n run: PreparedRun;\n authHome?: string;\n config: ProviderConfig;\n vars: Record<string, unknown>;\n runtimeEnv?: NodeJS.ProcessEnv;\n runtimeArgs?: readonly string[];\n}): Promise<{ output: string; error?: string }> {\n const adapterId = input.config.adapter;\n if (!adapterId) {\n return {\n output: \"\",\n error: `agent-skill-evals-provider: config.adapter is required. Set a preset (${PRESET_IDS.join(\", \")}) or an adapter (${DOCUMENTED_ADAPTERS.join(\", \")}).`,\n };\n }\n const adapter = adapterRegistry.get(adapterId);\n if (!adapter) {\n const suggestion = DOCUMENTED_ADAPTERS.find(\n (id) => id.replace(/[^a-z]/g, \"\") === adapterId.toLowerCase().replace(/[^a-z]/g, \"\"),\n );\n return {\n output: \"\",\n error:\n `agent-skill-evals-provider: unknown adapter \"${adapterId}\".` +\n (suggestion ? ` Did you mean \"${suggestion}\"?` : \"\") +\n ` Supported adapters: ${DOCUMENTED_ADAPTERS.join(\", \")}. Presets: ${PRESET_IDS.join(\", \")}.`,\n };\n }\n if (!input.config.command) {\n return {\n output: \"\",\n error: \"agent-skill-evals-provider: config.command is required for dynamic agent runs. Set a preset to get the command and flags for a supported agent.\",\n };\n }\n const command = input.config.command;\n\n const conversation = decodeConversationSpec(input.vars.conversation);\n if (conversation && \"error\" in conversation) {\n return { output: \"\", error: `agent-skill-evals-provider: ${conversation.error}` };\n }\n\n const sourceEnv = { ...process.env };\n const testPackDir = typeof input.vars.testPackDir === \"string\" ? input.vars.testPackDir : undefined;\n const baseDir = testPackDir ?? input.config.baseDir ?? process.cwd();\n const resolvedCommand = resolveConfiguredPath(baseDir, expandEnvVars(command, sourceEnv));\n const configuredArgs = (input.config.args ?? []).map((arg) =>\n typeof arg === \"string\" ? resolveConfiguredPath(baseDir, expandEnvVars(arg, sourceEnv)) : arg,\n );\n const agentArgs = (input.runtimeArgs ?? input.config.args ?? []).map((arg) =>\n typeof arg === \"string\" ? resolveConfiguredPath(baseDir, expandEnvVars(arg, sourceEnv)) : arg,\n );\n let skillEnvironment;\n try {\n skillEnvironment = await prepareSkillEnvironment({\n runDir: input.run.runDir,\n authHome: input.authHome,\n worldPath: input.run.worldPath,\n vars: input.vars,\n baseDir,\n preset: input.config.preset,\n adapter: adapterId,\n args: agentArgs,\n prompt: input.prompt,\n evidence: input.run.evidenceCollector,\n extraEnv: input.runtimeEnv,\n });\n } catch (error) {\n return {\n output: \"\",\n error: `agent-skill-evals-provider: failed to prepare hermetic skills: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n const env = skillEnvironment.env;\n const cliVersion = await captureCliVersion(resolvedCommand, input.run.worldPath, env);\n input.run.evidenceCollector.mergeRuntime({\n adapter: adapterId,\n ...(input.config.preset ? { preset: input.config.preset } : {}),\n command,\n ...(cliVersion ? { cliVersion } : {}),\n ...(input.config.model ? { model: input.config.model } : {}),\n ...(conversation ? { continuation: \"transcript-replay\" as const } : {}),\n });\n\n const resolvedArgs = skillEnvironment.args;\n const timeoutMs = input.config.timeoutMs ?? 5 * 60_000;\n const runAgentTurn = (prompt: string) =>\n adapter.run({\n command: resolvedCommand,\n args: resolvedArgs,\n cwd: input.run.worldPath,\n prompt: skillEnvironment.formatPrompt(prompt),\n evidence: input.run.evidenceCollector,\n timeoutMs,\n env,\n });\n\n if (!conversation) {\n const result = await runAgentTurn(input.prompt);\n if (result.error) {\n return {\n output: result.output,\n error: `${result.error}${presetStalenessHint(input.config.preset)}`,\n };\n }\n return { output: result.output };\n }\n\n const simulatedUserEnv = { ...env };\n const allowSimulatedUserMocks = Boolean(\n input.vars.conversation && typeof input.vars.conversation === \"object\" &&\n (input.vars.conversation as { simulatedUserAllowMocks?: boolean }).simulatedUserAllowMocks,\n );\n if (!allowSimulatedUserMocks) {\n for (const key of Object.keys(input.runtimeEnv ?? {})) {\n if (process.env[key] === undefined) delete simulatedUserEnv[key];\n else simulatedUserEnv[key] = process.env[key];\n }\n }\n const runSimulatedUser = conversation.user\n ? await makeSimulatedUserRunner({\n run: input.run,\n config: input.config,\n agent: {\n adapter,\n command: resolvedCommand,\n args: allowSimulatedUserMocks ? agentArgs : configuredArgs,\n },\n baseDir,\n env: simulatedUserEnv,\n })\n : undefined;\n if (runSimulatedUser && \"error\" in runSimulatedUser) {\n return { output: \"\", error: runSimulatedUser.error };\n }\n\n const result = await runConversation({\n spec: conversation,\n initialPrompt: input.prompt,\n evidence: input.run.evidenceCollector,\n runAgentTurn,\n ...(runSimulatedUser ? { runSimulatedUser: runSimulatedUser.run } : {}),\n });\n if (result.error) {\n return {\n output: result.output,\n error: `${result.error}${presetStalenessHint(input.config.preset)}`,\n };\n }\n return { output: result.output };\n}\n\nasync function collectFileEvidence(\n run: PreparedRun,\n preTree: Map<string, string>,\n): Promise<void> {\n const postTree = await snapshotTree(run.worldPath);\n for (const event of diffTrees(preTree, postTree)) {\n if (event.path.startsWith(\".agents/skills/\") || event.path.startsWith(\".claude/skills/\")) continue;\n run.evidenceCollector.addFileWrite(event);\n }\n}\n\nclass AgentSkillEvalsProvider {\n config: ProviderConfig;\n private readonly configError?: string;\n private authHome?: string;\n id: () => string;\n\n constructor(options: { config?: ProviderConfig; id?: string } = {}) {\n const config = decodeProviderConfig(options.config ?? {});\n if (\"error\" in config) {\n this.config = {};\n this.configError = config.error;\n } else {\n this.config = config;\n }\n const label = options.id ?? \"agent-skill-evals\";\n this.id = () => label;\n }\n\n async callApi(\n prompt: string,\n context: PromptfooContext = {},\n ): Promise<ProviderResponse> {\n if (this.configError) {\n return { output: \"\", error: this.configError };\n }\n const startedAt = Date.now();\n const vars = varsFromContext(context);\n const fixture = typeof vars.fixture === \"string\" ? vars.fixture : undefined;\n const testPackDir = typeof vars.testPackDir === \"string\" ? vars.testPackDir : undefined;\n const prepared = await prepareRun(fixture, this.config, testPackDir);\n if (\"error\" in prepared) {\n return { output: \"\", error: prepared.error };\n }\n this.authHome ??= join(prepared.runDir, \"home\");\n\n const environment = vars.environment && typeof vars.environment === \"object\" && !Array.isArray(vars.environment)\n ? vars.environment as { mocks?: unknown }\n : {};\n const mocks = Array.isArray(environment.mocks) ? environment.mocks as MockService[] : [];\n const mockBaseDir = testPackDir ?? this.config.baseDir ?? process.cwd();\n let mockServices;\n try {\n mockServices = await startMockServices({\n mocks,\n runDir: prepared.runDir,\n baseDir: mockBaseDir,\n preset: this.config.preset,\n baseArgs: this.config.args ?? [],\n });\n } catch (error) {\n return {\n output: \"\",\n error: `agent-skill-evals-provider: Mock Service setup failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n\n try {\n for (const command of Array.isArray(vars.setup) ? vars.setup : []) {\n if (typeof command !== \"string\") continue;\n const setup = await prepared.world.exec(\"sh\", [\"-lc\", command], {\n timeoutMs: 60_000,\n env: Object.fromEntries(Object.entries(mockServices.env).filter((entry): entry is [string, string] => entry[1] !== undefined)),\n });\n if (setup.exitCode !== 0) {\n await stopMockServices(prepared.runDir);\n return {\n output: \"\",\n error: `agent-skill-evals-provider: setup failed (${command}): ${setup.stderr || setup.stdout}`,\n };\n }\n }\n const preconditions = await runPreconditions(vars, prepared);\n const preTree = await snapshotTree(prepared.worldPath);\n\n let output = \"\";\n let error: string | undefined;\n if (preconditions.passed) {\n const result = await runConfiguredAdapter({\n prompt,\n run: prepared,\n authHome: this.authHome,\n config: this.config,\n vars,\n runtimeEnv: mockServices.env,\n runtimeArgs: mockServices.args,\n });\n output = result.output;\n error = result.error;\n mockServices.assertHealthy();\n }\n await collectFileEvidence(prepared, preTree);\n\n // Fold persistence failures into the normal error shape like every\n // other failure path here — a full disk must not crash the eval run.\n let metadata: AgentSkillEvalsProviderMetadata;\n try {\n metadata = await persistMetadata({\n run: prepared,\n fixture,\n vars,\n output,\n preconditionResults: preconditions.results,\n preconditionsPassed: preconditions.passed,\n startedAt,\n mockEnv: Object.fromEntries(Object.entries(mockServices.env).filter((entry): entry is [string, string] => entry[1] !== undefined)),\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n output,\n error: `${error ? `${error}; ` : \"\"}agent-skill-evals-provider: failed to write run evidence/metadata: ${message}`,\n };\n }\n\n const usage = promptfooTokenUsage(prepared.evidenceCollector.toSnapshot().usage);\n return {\n output,\n ...(error ? { error } : {}),\n metadata: metadata as unknown as Record<string, unknown>,\n ...(usage ? { tokenUsage: usage } : {}),\n };\n } catch (caught) {\n await stopMockServices(prepared.runDir);\n return {\n output: \"\",\n error: `agent-skill-evals-provider: Mock Service runtime failed: ${caught instanceof Error ? caught.message : String(caught)}`,\n };\n }\n }\n}\n\n// Promptfoo loads the default export from the local shim. The named export is\n// useful for tests and direct programmatic use.\nexport default AgentSkillEvalsProvider;\nexport { AgentSkillEvalsProvider };\nexport type { AgentSkillEvalsProviderMetadata };\n\nexport {\n EvidenceCollector,\n evidenceFromSnapshot,\n type EvidenceSnapshot,\n} from \"./evidence.js\";\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/assertions/_shared.ts","../../src/assertions/skill-test.ts","../../src/assertions/promptfoo.ts"],"mappings":";
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/assertions/_shared.ts","../../src/assertions/skill-test.ts","../../src/assertions/promptfoo.ts"],"mappings":";UAiBiB,sBAAA;EACf,IAAA,GAAO,MAAA;EACP,gBAAA;IACE,QAAA;IACA,UAAA;MACE,KAAA;MACA,MAAA;MACA,UAAA;MACA,MAAA;IAAA;EAAA;EAGJ,IAAA;IACE,IAAA,GAAO,MAAA;IACP,MAAA,GAAS,KAAA;MAAQ,IAAA;MAAe,MAAA;MAAiB,KAAA;MAAiB,MAAA;IAAA;EAAA;EAEpE,SAAA;IAAc,MAAA;EAAA;EACd,MAAA;IAAW,MAAA;EAAA;EACX,MAAA;IAAW,MAAA;IAAiB,eAAA;EAAA;EAC5B,MAAA;AAAA;AAAA,UAGe,aAAA;EACf,IAAA;EACA,KAAA;EACA,MAAA;EACA,gBAAA,GAAmB,KAAA;IAAQ,IAAA;IAAe,KAAA;IAAe,MAAA;EAAA;EACzD,QAAA,GAAW,MAAA;AAAA;;;iBCnBiB,SAAA,CAC5B,OAAA,UACA,OAAA,EAAS,sBAAA,GACR,OAAA,CAAQ,aAAA;;;iBC+BmB,yBAAA,CAC5B,MAAA,UACA,OAAA,EAAS,sBAAA,GACR,OAAA,CAAQ,aAAA"}
|