incantx 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 CHANGED
@@ -139,12 +139,23 @@ Tool call matching details:
139
139
  - `name` matches `tool_calls[].function.name`.
140
140
  - `arguments` is a **subset match** against the parsed JSON from `tool_calls[].function.arguments` (which is a JSON string in OpenAI format).
141
141
 
142
+ ### Expecting tool results (agent-provided)
143
+
144
+ If your agent returns `tool_messages` alongside `message` (same JSONL response), use `expect.tool_results` to assert on those `role: "tool"` messages.
145
+
146
+ Tool result matching details:
147
+
148
+ - Match by `tool_call_id` and/or `name`.
149
+ - `content_json` is a subset match against parsed JSON from `tool_messages[].content`.
150
+
142
151
  ### Expecting assistant content (LLM-judged)
143
152
 
144
153
  Use `expect.assistant.llm` to express the intended outcome in natural language.
145
154
 
146
155
  The CLI can grade this using an LLM judge. By default (`--judge auto`), it will only run if `OPENAI_API_KEY` is set; otherwise these checks are marked `SKIP`.
147
156
 
157
+ For deterministic checks without an LLM, use `expect.assistant.content` with `expect.assistant.content_match: contains|exact`.
158
+
148
159
  ## Agent integration (language-agnostic)
149
160
 
150
161
  ### Subprocess (recommended for local agents)
@@ -209,7 +220,8 @@ Example (abridged):
209
220
 
210
221
  ```json
211
222
  {
212
- "message": { "role": "assistant", "content": "hello", "tool_calls": [] }
223
+ "message": { "role": "assistant", "content": "hello", "tool_calls": [] },
224
+ "tool_messages": []
213
225
  }
214
226
  ```
215
227
 
package/dist/cli.js CHANGED
@@ -204,7 +204,7 @@ ${stderrText}` : ""));
204
204
  if (!isSuccess(payload)) {
205
205
  throw new Error(`Agent response must be { "message": { ... } } or { "error": { "message": ... } }.`);
206
206
  }
207
- return payload.message;
207
+ return payload;
208
208
  } finally {
209
209
  proc.kill();
210
210
  await Promise.allSettled([proc.exited, stderrPromise]);
@@ -299,16 +299,92 @@ function checkToolCalls(expect, message) {
299
299
  }
300
300
  return { status: "pass" };
301
301
  }
302
- async function evaluateExpectations(expect, message, judge) {
302
+ function matchToolResult(expected, actual) {
303
+ if (expected.tool_call_id !== undefined && actual.tool_call_id !== expected.tool_call_id)
304
+ return false;
305
+ if (expected.name !== undefined && actual.name !== expected.name)
306
+ return false;
307
+ if (expected.content !== undefined) {
308
+ const mode = expected.content_match ?? "exact";
309
+ if (mode === "exact" && actual.content !== expected.content)
310
+ return false;
311
+ if (mode === "contains" && !actual.content.includes(expected.content))
312
+ return false;
313
+ }
314
+ if (expected.content_json !== undefined) {
315
+ const actualJson = parseJsonOrUndefined(actual.content);
316
+ if (actualJson === undefined)
317
+ return false;
318
+ if (!deepPartialMatch(expected.content_json, actualJson))
319
+ return false;
320
+ }
321
+ return true;
322
+ }
323
+ function checkToolResults(expect, toolMessages) {
324
+ const expectedResults = expect.tool_results ?? [];
325
+ if (expectedResults.length === 0)
326
+ return { status: "pass" };
327
+ const mode = expect.tool_results_match ?? "contains";
328
+ if (mode === "contains") {
329
+ for (const expected of expectedResults) {
330
+ if (!expected.name && !expected.tool_call_id) {
331
+ return { status: "fail", reason: "tool_results entries must include at least 'name' or 'tool_call_id'." };
332
+ }
333
+ const ok = toolMessages.some((actual) => matchToolResult(expected, actual));
334
+ if (!ok) {
335
+ return {
336
+ status: "fail",
337
+ reason: `Expected tool result not found${expected.name ? `: ${expected.name}` : ""}.`
338
+ };
339
+ }
340
+ }
341
+ return { status: "pass" };
342
+ }
343
+ if (toolMessages.length !== expectedResults.length) {
344
+ return {
345
+ status: "fail",
346
+ reason: `Expected exactly ${expectedResults.length} tool result(s), got ${toolMessages.length}.`
347
+ };
348
+ }
349
+ for (let i = 0;i < expectedResults.length; i++) {
350
+ const expected = expectedResults[i];
351
+ const actual = toolMessages[i];
352
+ if (!expected || !actual || !matchToolResult(expected, actual)) {
353
+ return { status: "fail", reason: `Tool result mismatch at index ${i}.` };
354
+ }
355
+ }
356
+ return { status: "pass" };
357
+ }
358
+ function checkAssistantContent(expect, message) {
359
+ const expected = expect.assistant?.content;
360
+ if (expected === undefined)
361
+ return { status: "pass" };
362
+ const mode = expect.assistant?.content_match ?? "contains";
363
+ if (mode === "exact") {
364
+ if (message.content !== expected)
365
+ return { status: "fail", reason: "Assistant content did not match exactly." };
366
+ return { status: "pass" };
367
+ }
368
+ if (!message.content.includes(expected))
369
+ return { status: "fail", reason: "Assistant content did not contain expected text." };
370
+ return { status: "pass" };
371
+ }
372
+ async function evaluateExpectations(expect, turn, judge) {
303
373
  if (!expect)
304
374
  return { status: "pass" };
305
- const toolRes = checkToolCalls(expect, message);
375
+ const toolRes = checkToolCalls(expect, turn.message);
306
376
  if (toolRes.status !== "pass")
307
377
  return toolRes;
378
+ const toolResultsRes = checkToolResults(expect, turn.tool_messages ?? []);
379
+ if (toolResultsRes.status !== "pass")
380
+ return toolResultsRes;
381
+ const contentRes = checkAssistantContent(expect, turn.message);
382
+ if (contentRes.status !== "pass")
383
+ return contentRes;
308
384
  if (expect.assistant?.llm) {
309
385
  if (!judge)
310
386
  return { status: "skip", reason: "LLM judge not configured." };
311
- return await judge({ expectation: expect.assistant.llm, message });
387
+ return await judge({ expectation: expect.assistant.llm, message: turn.message });
312
388
  }
313
389
  return { status: "pass" };
314
390
  }
@@ -344,17 +420,18 @@ async function runFixtureFile(path, options = {}) {
344
420
  try {
345
421
  const agent = pickAgentSpec(file, fixture);
346
422
  const messages = [...fixture.history ?? [], { role: "user", content: fixture.input }];
347
- const message = await callSubprocessAgent(agent, {
423
+ const res = await callSubprocessAgent(agent, {
348
424
  messages,
349
425
  tools: [],
350
426
  tool_choice: "auto"
351
427
  });
352
- const expectation = await evaluateExpectations(fixture.expect, message, judge);
428
+ const expectation = await evaluateExpectations(fixture.expect, res, judge);
353
429
  results.push({
354
430
  id: fixture.id,
355
431
  status: expectation.status,
356
432
  reason: expectation.reason,
357
- message
433
+ message: res.message,
434
+ tool_messages: res.tool_messages
358
435
  });
359
436
  } catch (err) {
360
437
  const reason = err instanceof Error ? err.message : String(err);
@@ -457,4 +534,4 @@ Summary: ${pass} passed, ${fail} failed, ${skip} skipped`);
457
534
  }
458
535
  await main();
459
536
 
460
- //# debugId=E9C824803FAB034D64756E2164756E21
537
+ //# debugId=F85A6CE94B1A98B264756E2164756E21
package/dist/cli.js.map CHANGED
@@ -3,14 +3,14 @@
3
3
  "sources": ["../src/cli.ts", "../src/runner/runFixtureFile.ts", "../src/fixture/load.ts", "../src/judge/openaiJudge.ts", "../src/runner/subprocessAgent.ts", "../src/runner/deepMatch.ts", "../src/runner/expectations.ts"],
4
4
  "sourcesContent": [
5
5
  "#!/usr/bin/env bun\nimport { stat } from \"node:fs/promises\";\nimport { extname, resolve } from \"node:path\";\nimport { Glob } from \"bun\";\nimport { runFixtureFile } from \"./runner/runFixtureFile\";\n\nfunction usage(): string {\n return [\n \"Usage:\",\n \" incantx <file-or-dir> [--judge auto|off|on] [--judge-model <model>]\",\n \" incantx run <file-or-dir> [--judge auto|off|on] [--judge-model <model>]\",\n \"\",\n \"Examples:\",\n \" incantx tests/fixtures/weather.yaml\",\n \" incantx tests/fixtures --judge off\",\n ].join(\"\\n\");\n}\n\nfunction parseArgs(argv: string[]) {\n const [first, ...restAll] = argv;\n const opts: { judge?: \"auto\" | \"off\" | \"on\"; judgeModel?: string } = {};\n\n if (!first) return { command: \"help\" as const };\n if (first === \"-h\" || first === \"--help\") return { command: \"help\" as const };\n\n const target = first === \"run\" ? restAll[0] : first;\n const rest = first === \"run\" ? restAll.slice(1) : restAll;\n\n for (let i = 0; i < rest.length; i++) {\n const a = rest[i];\n if (a === \"--judge\") opts.judge = rest[++i] as any;\n else if (a === \"--judge-model\") opts.judgeModel = rest[++i];\n else if (a === \"-h\" || a === \"--help\") return { command: \"help\" as const };\n else throw new Error(`Unknown arg: ${a}`);\n }\n\n return { command: \"run\" as const, target, opts };\n}\n\nasync function listFixtureFiles(target: string): Promise<string[]> {\n const abs = resolve(target);\n const s = await stat(abs);\n if (s.isFile()) return [abs];\n\n const glob = new Glob(\"**/*.{yaml,yml}\");\n const out: string[] = [];\n for await (const rel of glob.scan({ cwd: abs, onlyFiles: true })) {\n out.push(resolve(abs, rel));\n }\n out.sort();\n return out;\n}\n\nfunction formatStatus(status: \"pass\" | \"fail\" | \"skip\"): string {\n if (status === \"pass\") return \"PASS\";\n if (status === \"skip\") return \"SKIP\";\n return \"FAIL\";\n}\n\nasync function main() {\n const parsed = parseArgs(process.argv.slice(2));\n if ((parsed as any).command === \"help\" || !(\"command\" in parsed) || parsed.command !== \"run\") {\n console.log(usage());\n process.exit(0);\n }\n\n if (!parsed.target) throw new Error(\"Missing <file-or-dir>.\");\n\n const files = await listFixtureFiles(parsed.target);\n if (files.length === 0) throw new Error(`No fixture files found under: ${parsed.target}`);\n\n let pass = 0;\n let fail = 0;\n let skip = 0;\n\n for (const file of files) {\n if (![\".yaml\", \".yml\"].includes(extname(file))) continue;\n const res = await runFixtureFile(file, {\n judgeMode: parsed.opts.judge ?? \"auto\",\n judgeModel: parsed.opts.judgeModel,\n });\n\n console.log(res.path);\n for (const r of res.results) {\n console.log(` ${formatStatus(r.status)} ${r.id}${r.reason ? ` — ${r.reason}` : \"\"}`);\n if (r.status === \"pass\") pass++;\n else if (r.status === \"skip\") skip++;\n else fail++;\n }\n }\n\n console.log(`\\nSummary: ${pass} passed, ${fail} failed, ${skip} skipped`);\n process.exit(fail > 0 ? 1 : 0);\n}\n\nawait main();\n",
6
- "import { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport type { AssistantMessage } from \"../agent/types\";\nimport { loadFixtureFile } from \"../fixture/load\";\nimport type { AgentSpec, Fixture, FixtureFile } from \"../fixture/types\";\nimport { createOpenAIJudge } from \"../judge/openaiJudge\";\nimport { callSubprocessAgent } from \"./subprocessAgent\";\nimport type { ExpectationResult, Judge } from \"./expectations\";\nimport { evaluateExpectations } from \"./expectations\";\n\nexport type JudgeMode = \"off\" | \"auto\" | \"on\";\n\nexport type RunOptions = {\n judgeMode?: JudgeMode;\n judgeModel?: string;\n};\n\nexport type FixtureResult = {\n id: string;\n status: \"pass\" | \"fail\" | \"skip\";\n reason?: string;\n message?: AssistantMessage;\n};\n\nexport type FixtureFileResult = {\n path: string;\n results: FixtureResult[];\n};\n\nfunction pickAgentSpec(file: FixtureFile, fixture: Fixture): AgentSpec {\n const agent = fixture.agent ?? file.agent;\n if (!agent) throw new Error(`Fixture '${fixture.id}' has no agent. Add file-level 'agent:' or fixture-level 'agent:'.`);\n if ((agent.type ?? \"subprocess\") !== \"subprocess\") throw new Error(`Unsupported agent type: ${agent.type}`);\n return agent;\n}\n\nfunction makeJudge(mode: JudgeMode, model?: string): Judge | undefined {\n if (mode === \"off\") return undefined;\n\n const apiKey = process.env.OPENAI_API_KEY;\n if (!apiKey) {\n if (mode === \"on\") throw new Error(\"Judge mode is 'on' but OPENAI_API_KEY is not set.\");\n return undefined;\n }\n\n return createOpenAIJudge({ apiKey, model });\n}\n\nexport async function runFixtureFile(path: string, options: RunOptions = {}): Promise<FixtureFileResult> {\n const absolute = resolve(path);\n const yamlText = await readFile(absolute, \"utf8\");\n const file = loadFixtureFile(yamlText);\n\n const judgeMode = options.judgeMode ?? \"auto\";\n const judge = makeJudge(judgeMode, options.judgeModel);\n\n const results: FixtureResult[] = [];\n\n for (const fixture of file.fixtures) {\n try {\n const agent = pickAgentSpec(file, fixture);\n const messages = [...(fixture.history ?? []), { role: \"user\", content: fixture.input } as const];\n\n const message = await callSubprocessAgent(agent, {\n messages,\n tools: [],\n tool_choice: \"auto\",\n });\n\n const expectation = await evaluateExpectations(fixture.expect, message, judge);\n results.push({\n id: fixture.id,\n status: expectation.status,\n reason: (expectation as Extract<ExpectationResult, { status: \"fail\" | \"skip\" }>).reason,\n message,\n });\n } catch (err) {\n const reason = err instanceof Error ? err.message : String(err);\n results.push({ id: fixture.id, status: \"fail\", reason });\n }\n }\n\n return { path: absolute, results };\n}\n",
6
+ "import { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport type { AssistantMessage, ToolMessage } from \"../agent/types\";\nimport { loadFixtureFile } from \"../fixture/load\";\nimport type { AgentSpec, Fixture, FixtureFile } from \"../fixture/types\";\nimport { createOpenAIJudge } from \"../judge/openaiJudge\";\nimport { callSubprocessAgent } from \"./subprocessAgent\";\nimport type { ExpectationResult, Judge } from \"./expectations\";\nimport { evaluateExpectations } from \"./expectations\";\n\nexport type JudgeMode = \"off\" | \"auto\" | \"on\";\n\nexport type RunOptions = {\n judgeMode?: JudgeMode;\n judgeModel?: string;\n};\n\nexport type FixtureResult = {\n id: string;\n status: \"pass\" | \"fail\" | \"skip\";\n reason?: string;\n message?: AssistantMessage;\n tool_messages?: ToolMessage[];\n};\n\nexport type FixtureFileResult = {\n path: string;\n results: FixtureResult[];\n};\n\nfunction pickAgentSpec(file: FixtureFile, fixture: Fixture): AgentSpec {\n const agent = fixture.agent ?? file.agent;\n if (!agent) throw new Error(`Fixture '${fixture.id}' has no agent. Add file-level 'agent:' or fixture-level 'agent:'.`);\n if ((agent.type ?? \"subprocess\") !== \"subprocess\") throw new Error(`Unsupported agent type: ${agent.type}`);\n return agent;\n}\n\nfunction makeJudge(mode: JudgeMode, model?: string): Judge | undefined {\n if (mode === \"off\") return undefined;\n\n const apiKey = process.env.OPENAI_API_KEY;\n if (!apiKey) {\n if (mode === \"on\") throw new Error(\"Judge mode is 'on' but OPENAI_API_KEY is not set.\");\n return undefined;\n }\n\n return createOpenAIJudge({ apiKey, model });\n}\n\nexport async function runFixtureFile(path: string, options: RunOptions = {}): Promise<FixtureFileResult> {\n const absolute = resolve(path);\n const yamlText = await readFile(absolute, \"utf8\");\n const file = loadFixtureFile(yamlText);\n\n const judgeMode = options.judgeMode ?? \"auto\";\n const judge = makeJudge(judgeMode, options.judgeModel);\n\n const results: FixtureResult[] = [];\n\n for (const fixture of file.fixtures) {\n try {\n const agent = pickAgentSpec(file, fixture);\n const messages = [...(fixture.history ?? []), { role: \"user\", content: fixture.input } as const];\n\n const res = await callSubprocessAgent(agent, {\n messages,\n tools: [],\n tool_choice: \"auto\",\n });\n\n const expectation = await evaluateExpectations(fixture.expect, res, judge);\n results.push({\n id: fixture.id,\n status: expectation.status,\n reason: (expectation as Extract<ExpectationResult, { status: \"fail\" | \"skip\" }>).reason,\n message: res.message,\n tool_messages: res.tool_messages,\n });\n } catch (err) {\n const reason = err instanceof Error ? err.message : String(err);\n results.push({ id: fixture.id, status: \"fail\", reason });\n }\n }\n\n return { path: absolute, results };\n}\n",
7
7
  "import { parse as parseYaml } from \"yaml\";\nimport type { AgentSpec, FixtureFile } from \"./types\";\n\nfunction expandEnvVars(value: string, env: Record<string, string | undefined>): string {\n return value.replace(/\\$\\{([A-Z0-9_]+)\\}/gi, (_, key: string) => env[key] ?? \"\");\n}\n\nfunction normalizeAgentSpec(raw: AgentSpec, env: Record<string, string | undefined>): AgentSpec {\n const normalized: AgentSpec = { ...raw };\n\n if (normalized.type === undefined) normalized.type = \"subprocess\";\n if (!Array.isArray(normalized.command) || normalized.command.length === 0) {\n throw new Error(\"`agent.command` must be a non-empty array of strings.\");\n }\n\n normalized.command = normalized.command.map((part) => String(part));\n\n if (normalized.cwd !== undefined) normalized.cwd = String(normalized.cwd);\n if (normalized.timeout_ms !== undefined) normalized.timeout_ms = Number(normalized.timeout_ms);\n\n if (normalized.env) {\n const expanded: Record<string, string> = {};\n for (const [k, v] of Object.entries(normalized.env)) {\n expanded[k] = expandEnvVars(String(v), env);\n }\n normalized.env = expanded;\n }\n\n return normalized;\n}\n\nexport function loadFixtureFile(yamlText: string, env: Record<string, string | undefined> = process.env): FixtureFile {\n const data = parseYaml(yamlText) as unknown;\n if (!data || typeof data !== \"object\") throw new Error(\"Fixture file must be a YAML object.\");\n\n const file = data as Partial<FixtureFile>;\n if (!Array.isArray(file.fixtures)) throw new Error(\"Fixture file must contain `fixtures: [...]`.\");\n\n const normalized: FixtureFile = {\n fixtures: file.fixtures as FixtureFile[\"fixtures\"],\n };\n\n if (file.agent) normalized.agent = normalizeAgentSpec(file.agent as AgentSpec, env);\n\n normalized.fixtures = normalized.fixtures.map((fixture, index) => {\n if (!fixture || typeof fixture !== \"object\") throw new Error(`fixtures[${index}] must be an object.`);\n if (!(\"id\" in fixture)) throw new Error(`fixtures[${index}].id is required.`);\n if (!(\"input\" in fixture)) throw new Error(`fixtures[${index}].input is required.`);\n\n const out = { ...fixture } as any;\n out.id = String(out.id);\n out.input = String(out.input);\n\n if (out.agent) out.agent = normalizeAgentSpec(out.agent as AgentSpec, env);\n if (out.expect?.tool_calls_match === undefined && out.expect?.tool_calls) out.expect.tool_calls_match = \"contains\";\n\n return out;\n });\n\n return normalized;\n}\n",
8
8
  "import type { AssistantMessage } from \"../agent/types\";\nimport type { ExpectationResult } from \"../runner/expectations\";\n\nexport type OpenAIJudgeOptions = {\n apiKey: string;\n baseUrl?: string;\n model?: string;\n};\n\ntype JudgeResponse = { pass: boolean; reason: string };\n\nexport function createOpenAIJudge(options: OpenAIJudgeOptions) {\n const baseUrl = options.baseUrl ?? process.env.OPENAI_BASE_URL ?? \"https://api.openai.com/v1\";\n const model = options.model ?? process.env.OPENAI_JUDGE_MODEL ?? \"gpt-4o-mini\";\n\n return async ({ expectation, message }: { expectation: string; message: AssistantMessage }): Promise<ExpectationResult> => {\n const system =\n \"You are a strict test evaluator. Decide if the assistant message satisfies the expectation. \" +\n \"Respond with ONLY valid JSON: {\\\"pass\\\": boolean, \\\"reason\\\": string}.\";\n\n const user = JSON.stringify(\n {\n expectation,\n assistant_message: message,\n },\n null,\n 2\n );\n\n const res = await fetch(`${baseUrl}/chat/completions`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${options.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n model,\n temperature: 0,\n messages: [\n { role: \"system\", content: system },\n { role: \"user\", content: user },\n ],\n }),\n });\n\n if (!res.ok) {\n const body = await res.text().catch(() => \"\");\n return {\n status: \"fail\",\n reason: `Judge call failed: ${res.status} ${res.statusText}${body ? `\\n${body}` : \"\"}`,\n };\n }\n\n const data = (await res.json()) as any;\n const content = data?.choices?.[0]?.message?.content;\n if (typeof content !== \"string\" || content.trim().length === 0) {\n return { status: \"fail\", reason: \"Judge returned no content.\" };\n }\n\n let parsed: JudgeResponse;\n try {\n parsed = JSON.parse(content) as JudgeResponse;\n } catch {\n return { status: \"fail\", reason: `Judge did not return valid JSON.\\n${content}` };\n }\n\n if (parsed.pass) return { status: \"pass\" };\n return { status: \"fail\", reason: parsed.reason || \"Expectation not satisfied.\" };\n };\n}\n",
9
- "import type { AssistantMessage, ChatAgentRequest } from \"../agent/types\";\nimport type { AgentSpec } from \"../fixture/types\";\n\ntype AgentProcessSuccess = { message: AssistantMessage };\ntype AgentProcessError = { error: { message: string } };\n\nfunction isSuccess(value: unknown): value is AgentProcessSuccess {\n return !!value && typeof value === \"object\" && \"message\" in (value as any);\n}\n\nfunction isError(value: unknown): value is AgentProcessError {\n return !!value && typeof value === \"object\" && \"error\" in (value as any);\n}\n\nasync function readFirstNonEmptyLine(stream: ReadableStream<Uint8Array>, timeoutMs: number): Promise<string> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n const deadline = Date.now() + timeoutMs;\n\n type ReadResult = { value?: Uint8Array; done: boolean };\n\n while (true) {\n const timeLeft = deadline - Date.now();\n if (timeLeft <= 0) throw new Error(`Timed out waiting for agent response after ${timeoutMs}ms.`);\n\n let timerId: ReturnType<typeof setTimeout> | undefined;\n const timerPromise = new Promise<never>((_, reject) => {\n timerId = setTimeout(() => reject(new Error(`Timed out waiting for agent response after ${timeoutMs}ms.`)), timeLeft);\n });\n\n let chunk: ReadResult;\n try {\n chunk = await Promise.race([reader.read(), timerPromise]);\n } finally {\n if (timerId !== undefined) clearTimeout(timerId);\n }\n\n const { value, done } = chunk;\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n while (true) {\n const idx = buffer.indexOf(\"\\n\");\n if (idx === -1) break;\n const line = buffer.slice(0, idx).trim();\n buffer = buffer.slice(idx + 1);\n if (line.length > 0) return line;\n }\n }\n\n const tail = buffer.trim();\n if (tail.length > 0) return tail;\n throw new Error(\"Agent produced no output on stdout.\");\n}\n\nexport async function callSubprocessAgent(spec: AgentSpec, request: ChatAgentRequest): Promise<AssistantMessage> {\n const timeoutMs = spec.timeout_ms ?? 20_000;\n\n const proc = Bun.spawn(spec.command, {\n cwd: spec.cwd,\n env: { ...process.env, ...(spec.env ?? {}) },\n stdin: \"pipe\",\n stdout: \"pipe\",\n stderr: \"pipe\",\n });\n\n const stdin = proc.stdin;\n if (!stdin) throw new Error(\"Failed to open agent stdin.\");\n\n stdin.write(`${JSON.stringify(request)}\\n`);\n stdin.end();\n\n let stderrText = \"\";\n const stderrPromise = (async () => {\n if (!proc.stderr) return;\n stderrText = await new Response(proc.stderr).text().catch(() => \"\");\n })();\n\n try {\n if (!proc.stdout) throw new Error(\"Failed to open agent stdout.\");\n const line = await readFirstNonEmptyLine(proc.stdout, timeoutMs);\n\n let payload: unknown;\n try {\n payload = JSON.parse(line) as unknown;\n } catch {\n throw new Error(\n `Agent stdout is not valid JSON.\\n` +\n `Line: ${line}\\n` +\n (stderrText ? `Stderr:\\n${stderrText}` : \"\")\n );\n }\n\n if (isError(payload)) throw new Error(payload.error.message);\n if (!isSuccess(payload)) {\n throw new Error(`Agent response must be { \"message\": { ... } } or { \"error\": { \"message\": ... } }.`);\n }\n\n return payload.message;\n } finally {\n proc.kill();\n await Promise.allSettled([proc.exited, stderrPromise]);\n }\n}\n",
9
+ "import type { AssistantMessage, ChatAgentRequest, ToolMessage } from \"../agent/types\";\nimport type { AgentSpec } from \"../fixture/types\";\n\nexport type SubprocessAgentResponse = { message: AssistantMessage; tool_messages?: ToolMessage[] };\ntype AgentProcessError = { error: { message: string } };\n\nfunction isSuccess(value: unknown): value is SubprocessAgentResponse {\n return !!value && typeof value === \"object\" && \"message\" in (value as any);\n}\n\nfunction isError(value: unknown): value is AgentProcessError {\n return !!value && typeof value === \"object\" && \"error\" in (value as any);\n}\n\nasync function readFirstNonEmptyLine(stream: ReadableStream<Uint8Array>, timeoutMs: number): Promise<string> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n const deadline = Date.now() + timeoutMs;\n\n type ReadResult = { value?: Uint8Array; done: boolean };\n\n while (true) {\n const timeLeft = deadline - Date.now();\n if (timeLeft <= 0) throw new Error(`Timed out waiting for agent response after ${timeoutMs}ms.`);\n\n let timerId: ReturnType<typeof setTimeout> | undefined;\n const timerPromise = new Promise<never>((_, reject) => {\n timerId = setTimeout(() => reject(new Error(`Timed out waiting for agent response after ${timeoutMs}ms.`)), timeLeft);\n });\n\n let chunk: ReadResult;\n try {\n chunk = await Promise.race([reader.read(), timerPromise]);\n } finally {\n if (timerId !== undefined) clearTimeout(timerId);\n }\n\n const { value, done } = chunk;\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n while (true) {\n const idx = buffer.indexOf(\"\\n\");\n if (idx === -1) break;\n const line = buffer.slice(0, idx).trim();\n buffer = buffer.slice(idx + 1);\n if (line.length > 0) return line;\n }\n }\n\n const tail = buffer.trim();\n if (tail.length > 0) return tail;\n throw new Error(\"Agent produced no output on stdout.\");\n}\n\nexport async function callSubprocessAgent(spec: AgentSpec, request: ChatAgentRequest): Promise<SubprocessAgentResponse> {\n const timeoutMs = spec.timeout_ms ?? 20_000;\n\n const proc = Bun.spawn(spec.command, {\n cwd: spec.cwd,\n env: { ...process.env, ...(spec.env ?? {}) },\n stdin: \"pipe\",\n stdout: \"pipe\",\n stderr: \"pipe\",\n });\n\n const stdin = proc.stdin;\n if (!stdin) throw new Error(\"Failed to open agent stdin.\");\n\n stdin.write(`${JSON.stringify(request)}\\n`);\n stdin.end();\n\n let stderrText = \"\";\n const stderrPromise = (async () => {\n if (!proc.stderr) return;\n stderrText = await new Response(proc.stderr).text().catch(() => \"\");\n })();\n\n try {\n if (!proc.stdout) throw new Error(\"Failed to open agent stdout.\");\n const line = await readFirstNonEmptyLine(proc.stdout, timeoutMs);\n\n let payload: unknown;\n try {\n payload = JSON.parse(line) as unknown;\n } catch {\n throw new Error(\n `Agent stdout is not valid JSON.\\n` +\n `Line: ${line}\\n` +\n (stderrText ? `Stderr:\\n${stderrText}` : \"\")\n );\n }\n\n if (isError(payload)) throw new Error(payload.error.message);\n if (!isSuccess(payload)) {\n throw new Error(`Agent response must be { \"message\": { ... } } or { \"error\": { \"message\": ... } }.`);\n }\n\n return payload;\n } finally {\n proc.kill();\n await Promise.allSettled([proc.exited, stderrPromise]);\n }\n}\n",
10
10
  "export function deepPartialMatch(expected: unknown, actual: unknown): boolean {\n if (expected === actual) return true;\n\n if (expected === null || actual === null) return expected === actual;\n\n const expectedType = typeof expected;\n const actualType = typeof actual;\n if (expectedType !== actualType) return false;\n\n if (Array.isArray(expected)) {\n if (!Array.isArray(actual)) return false;\n if (expected.length !== actual.length) return false;\n for (let i = 0; i < expected.length; i++) {\n if (!deepPartialMatch(expected[i], actual[i])) return false;\n }\n return true;\n }\n\n if (expectedType === \"object\") {\n if (Array.isArray(actual)) return false;\n const expectedObj = expected as Record<string, unknown>;\n const actualObj = actual as Record<string, unknown>;\n for (const [key, expectedValue] of Object.entries(expectedObj)) {\n if (!(key in actualObj)) return false;\n if (!deepPartialMatch(expectedValue, actualObj[key])) return false;\n }\n return true;\n }\n\n return false;\n}\n\n",
11
- "import type { AssistantMessage } from \"../agent/types\";\nimport type { FixtureExpectation, ToolCallExpectation } from \"../fixture/types\";\nimport { deepPartialMatch } from \"./deepMatch\";\n\nexport type ExpectationResult =\n | { status: \"pass\" }\n | { status: \"fail\"; reason: string }\n | { status: \"skip\"; reason: string };\n\nfunction parseJsonOrUndefined(value: string): unknown | undefined {\n try {\n return JSON.parse(value) as unknown;\n } catch {\n return undefined;\n }\n}\n\nfunction matchToolCall(expected: ToolCallExpectation, actual: NonNullable<AssistantMessage[\"tool_calls\"]>[number]): boolean {\n if (actual.function.name !== expected.name) return false;\n if (expected.arguments === undefined) return true;\n const actualArgs = parseJsonOrUndefined(actual.function.arguments);\n if (actualArgs === undefined) return false;\n return deepPartialMatch(expected.arguments, actualArgs);\n}\n\nfunction checkToolCalls(expect: FixtureExpectation, message: AssistantMessage): ExpectationResult {\n const expectedCalls = expect.tool_calls ?? [];\n if (expectedCalls.length === 0) return { status: \"pass\" };\n\n const actualCalls = message.tool_calls ?? [];\n const mode = expect.tool_calls_match ?? \"contains\";\n\n if (mode === \"contains\") {\n for (const expected of expectedCalls) {\n const ok = actualCalls.some((actual) => matchToolCall(expected, actual));\n if (!ok) {\n return {\n status: \"fail\",\n reason: `Expected tool call not found: ${expected.name}`,\n };\n }\n }\n return { status: \"pass\" };\n }\n\n if (actualCalls.length !== expectedCalls.length) {\n return {\n status: \"fail\",\n reason: `Expected exactly ${expectedCalls.length} tool call(s), got ${actualCalls.length}.`,\n };\n }\n\n for (let i = 0; i < expectedCalls.length; i++) {\n const expected = expectedCalls[i];\n const actual = actualCalls[i];\n if (!expected || !actual || !matchToolCall(expected, actual)) {\n return { status: \"fail\", reason: `Tool call mismatch at index ${i}.` };\n }\n }\n\n return { status: \"pass\" };\n}\n\nexport type Judge = (args: { expectation: string; message: AssistantMessage }) => Promise<ExpectationResult>;\n\nexport async function evaluateExpectations(\n expect: FixtureExpectation | undefined,\n message: AssistantMessage,\n judge: Judge | undefined\n): Promise<ExpectationResult> {\n if (!expect) return { status: \"pass\" };\n\n const toolRes = checkToolCalls(expect, message);\n if (toolRes.status !== \"pass\") return toolRes;\n\n if (expect.assistant?.llm) {\n if (!judge) return { status: \"skip\", reason: \"LLM judge not configured.\" };\n return await judge({ expectation: expect.assistant.llm, message });\n }\n\n return { status: \"pass\" };\n}\n"
11
+ "import type { AssistantMessage, ToolMessage } from \"../agent/types\";\nimport type { FixtureExpectation, ToolCallExpectation, ToolResultExpectation } from \"../fixture/types\";\nimport { deepPartialMatch } from \"./deepMatch\";\n\nexport type ExpectationResult =\n | { status: \"pass\" }\n | { status: \"fail\"; reason: string }\n | { status: \"skip\"; reason: string };\n\nfunction parseJsonOrUndefined(value: string): unknown | undefined {\n try {\n return JSON.parse(value) as unknown;\n } catch {\n return undefined;\n }\n}\n\nfunction matchToolCall(expected: ToolCallExpectation, actual: NonNullable<AssistantMessage[\"tool_calls\"]>[number]): boolean {\n if (actual.function.name !== expected.name) return false;\n if (expected.arguments === undefined) return true;\n const actualArgs = parseJsonOrUndefined(actual.function.arguments);\n if (actualArgs === undefined) return false;\n return deepPartialMatch(expected.arguments, actualArgs);\n}\n\nfunction checkToolCalls(expect: FixtureExpectation, message: AssistantMessage): ExpectationResult {\n const expectedCalls = expect.tool_calls ?? [];\n if (expectedCalls.length === 0) return { status: \"pass\" };\n\n const actualCalls = message.tool_calls ?? [];\n const mode = expect.tool_calls_match ?? \"contains\";\n\n if (mode === \"contains\") {\n for (const expected of expectedCalls) {\n const ok = actualCalls.some((actual) => matchToolCall(expected, actual));\n if (!ok) {\n return {\n status: \"fail\",\n reason: `Expected tool call not found: ${expected.name}`,\n };\n }\n }\n return { status: \"pass\" };\n }\n\n if (actualCalls.length !== expectedCalls.length) {\n return {\n status: \"fail\",\n reason: `Expected exactly ${expectedCalls.length} tool call(s), got ${actualCalls.length}.`,\n };\n }\n\n for (let i = 0; i < expectedCalls.length; i++) {\n const expected = expectedCalls[i];\n const actual = actualCalls[i];\n if (!expected || !actual || !matchToolCall(expected, actual)) {\n return { status: \"fail\", reason: `Tool call mismatch at index ${i}.` };\n }\n }\n\n return { status: \"pass\" };\n}\n\nexport type Judge = (args: { expectation: string; message: AssistantMessage }) => Promise<ExpectationResult>;\n\ntype AgentTurn = { message: AssistantMessage; tool_messages?: ToolMessage[] };\n\nfunction matchToolResult(expected: ToolResultExpectation, actual: ToolMessage): boolean {\n if (expected.tool_call_id !== undefined && actual.tool_call_id !== expected.tool_call_id) return false;\n if (expected.name !== undefined && actual.name !== expected.name) return false;\n\n if (expected.content !== undefined) {\n const mode = expected.content_match ?? \"exact\";\n if (mode === \"exact\" && actual.content !== expected.content) return false;\n if (mode === \"contains\" && !actual.content.includes(expected.content)) return false;\n }\n\n if (expected.content_json !== undefined) {\n const actualJson = parseJsonOrUndefined(actual.content);\n if (actualJson === undefined) return false;\n if (!deepPartialMatch(expected.content_json, actualJson)) return false;\n }\n\n return true;\n}\n\nfunction checkToolResults(expect: FixtureExpectation, toolMessages: ToolMessage[]): ExpectationResult {\n const expectedResults = expect.tool_results ?? [];\n if (expectedResults.length === 0) return { status: \"pass\" };\n\n const mode = expect.tool_results_match ?? \"contains\";\n\n if (mode === \"contains\") {\n for (const expected of expectedResults) {\n if (!expected.name && !expected.tool_call_id) {\n return { status: \"fail\", reason: \"tool_results entries must include at least 'name' or 'tool_call_id'.\" };\n }\n\n const ok = toolMessages.some((actual) => matchToolResult(expected, actual));\n if (!ok) {\n return {\n status: \"fail\",\n reason: `Expected tool result not found${expected.name ? `: ${expected.name}` : \"\"}.`,\n };\n }\n }\n return { status: \"pass\" };\n }\n\n if (toolMessages.length !== expectedResults.length) {\n return {\n status: \"fail\",\n reason: `Expected exactly ${expectedResults.length} tool result(s), got ${toolMessages.length}.`,\n };\n }\n\n for (let i = 0; i < expectedResults.length; i++) {\n const expected = expectedResults[i];\n const actual = toolMessages[i];\n if (!expected || !actual || !matchToolResult(expected, actual)) {\n return { status: \"fail\", reason: `Tool result mismatch at index ${i}.` };\n }\n }\n\n return { status: \"pass\" };\n}\n\nfunction checkAssistantContent(expect: FixtureExpectation, message: AssistantMessage): ExpectationResult {\n const expected = expect.assistant?.content;\n if (expected === undefined) return { status: \"pass\" };\n\n const mode = expect.assistant?.content_match ?? \"contains\";\n if (mode === \"exact\") {\n if (message.content !== expected) return { status: \"fail\", reason: \"Assistant content did not match exactly.\" };\n return { status: \"pass\" };\n }\n\n if (!message.content.includes(expected)) return { status: \"fail\", reason: \"Assistant content did not contain expected text.\" };\n return { status: \"pass\" };\n}\n\nexport async function evaluateExpectations(\n expect: FixtureExpectation | undefined,\n turn: AgentTurn,\n judge: Judge | undefined\n): Promise<ExpectationResult> {\n if (!expect) return { status: \"pass\" };\n\n const toolRes = checkToolCalls(expect, turn.message);\n if (toolRes.status !== \"pass\") return toolRes;\n\n const toolResultsRes = checkToolResults(expect, turn.tool_messages ?? []);\n if (toolResultsRes.status !== \"pass\") return toolResultsRes;\n\n const contentRes = checkAssistantContent(expect, turn.message);\n if (contentRes.status !== \"pass\") return contentRes;\n\n if (expect.assistant?.llm) {\n if (!judge) return { status: \"skip\", reason: \"LLM judge not configured.\" };\n return await judge({ expectation: expect.assistant.llm, message: turn.message });\n }\n\n return { status: \"pass\" };\n}\n"
12
12
  ],
13
- "mappings": "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",
14
- "debugId": "E9C824803FAB034D64756E2164756E21",
13
+ "mappings": "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",
14
+ "debugId": "F85A6CE94B1A98B264756E2164756E21",
15
15
  "names": []
16
16
  }
package/dist/index.js CHANGED
@@ -304,7 +304,7 @@ ${stderrText}` : ""));
304
304
  if (!isSuccess(payload)) {
305
305
  throw new Error(`Agent response must be { "message": { ... } } or { "error": { "message": ... } }.`);
306
306
  }
307
- return payload.message;
307
+ return payload;
308
308
  } finally {
309
309
  proc.kill();
310
310
  await Promise.allSettled([proc.exited, stderrPromise]);
@@ -399,16 +399,92 @@ function checkToolCalls(expect, message) {
399
399
  }
400
400
  return { status: "pass" };
401
401
  }
402
- async function evaluateExpectations(expect, message, judge) {
402
+ function matchToolResult(expected, actual) {
403
+ if (expected.tool_call_id !== undefined && actual.tool_call_id !== expected.tool_call_id)
404
+ return false;
405
+ if (expected.name !== undefined && actual.name !== expected.name)
406
+ return false;
407
+ if (expected.content !== undefined) {
408
+ const mode = expected.content_match ?? "exact";
409
+ if (mode === "exact" && actual.content !== expected.content)
410
+ return false;
411
+ if (mode === "contains" && !actual.content.includes(expected.content))
412
+ return false;
413
+ }
414
+ if (expected.content_json !== undefined) {
415
+ const actualJson = parseJsonOrUndefined(actual.content);
416
+ if (actualJson === undefined)
417
+ return false;
418
+ if (!deepPartialMatch(expected.content_json, actualJson))
419
+ return false;
420
+ }
421
+ return true;
422
+ }
423
+ function checkToolResults(expect, toolMessages) {
424
+ const expectedResults = expect.tool_results ?? [];
425
+ if (expectedResults.length === 0)
426
+ return { status: "pass" };
427
+ const mode = expect.tool_results_match ?? "contains";
428
+ if (mode === "contains") {
429
+ for (const expected of expectedResults) {
430
+ if (!expected.name && !expected.tool_call_id) {
431
+ return { status: "fail", reason: "tool_results entries must include at least 'name' or 'tool_call_id'." };
432
+ }
433
+ const ok = toolMessages.some((actual) => matchToolResult(expected, actual));
434
+ if (!ok) {
435
+ return {
436
+ status: "fail",
437
+ reason: `Expected tool result not found${expected.name ? `: ${expected.name}` : ""}.`
438
+ };
439
+ }
440
+ }
441
+ return { status: "pass" };
442
+ }
443
+ if (toolMessages.length !== expectedResults.length) {
444
+ return {
445
+ status: "fail",
446
+ reason: `Expected exactly ${expectedResults.length} tool result(s), got ${toolMessages.length}.`
447
+ };
448
+ }
449
+ for (let i = 0;i < expectedResults.length; i++) {
450
+ const expected = expectedResults[i];
451
+ const actual = toolMessages[i];
452
+ if (!expected || !actual || !matchToolResult(expected, actual)) {
453
+ return { status: "fail", reason: `Tool result mismatch at index ${i}.` };
454
+ }
455
+ }
456
+ return { status: "pass" };
457
+ }
458
+ function checkAssistantContent(expect, message) {
459
+ const expected = expect.assistant?.content;
460
+ if (expected === undefined)
461
+ return { status: "pass" };
462
+ const mode = expect.assistant?.content_match ?? "contains";
463
+ if (mode === "exact") {
464
+ if (message.content !== expected)
465
+ return { status: "fail", reason: "Assistant content did not match exactly." };
466
+ return { status: "pass" };
467
+ }
468
+ if (!message.content.includes(expected))
469
+ return { status: "fail", reason: "Assistant content did not contain expected text." };
470
+ return { status: "pass" };
471
+ }
472
+ async function evaluateExpectations(expect, turn, judge) {
403
473
  if (!expect)
404
474
  return { status: "pass" };
405
- const toolRes = checkToolCalls(expect, message);
475
+ const toolRes = checkToolCalls(expect, turn.message);
406
476
  if (toolRes.status !== "pass")
407
477
  return toolRes;
478
+ const toolResultsRes = checkToolResults(expect, turn.tool_messages ?? []);
479
+ if (toolResultsRes.status !== "pass")
480
+ return toolResultsRes;
481
+ const contentRes = checkAssistantContent(expect, turn.message);
482
+ if (contentRes.status !== "pass")
483
+ return contentRes;
408
484
  if (expect.assistant?.llm) {
409
485
  if (!judge)
410
486
  return { status: "skip", reason: "LLM judge not configured." };
411
- return await judge({ expectation: expect.assistant.llm, message });
487
+ return await judge({ expectation: expect.assistant.llm, message: turn.message });
412
488
  }
413
489
  return { status: "pass" };
414
490
  }
@@ -444,17 +520,18 @@ async function runFixtureFile(path, options = {}) {
444
520
  try {
445
521
  const agent = pickAgentSpec(file, fixture);
446
522
  const messages = [...fixture.history ?? [], { role: "user", content: fixture.input }];
447
- const message = await callSubprocessAgent(agent, {
523
+ const res = await callSubprocessAgent(agent, {
448
524
  messages,
449
525
  tools: [],
450
526
  tool_choice: "auto"
451
527
  });
452
- const expectation = await evaluateExpectations(fixture.expect, message, judge);
528
+ const expectation = await evaluateExpectations(fixture.expect, res, judge);
453
529
  results.push({
454
530
  id: fixture.id,
455
531
  status: expectation.status,
456
532
  reason: expectation.reason,
457
- message
533
+ message: res.message,
534
+ tool_messages: res.tool_messages
458
535
  });
459
536
  } catch (err) {
460
537
  const reason = err instanceof Error ? err.message : String(err);
@@ -470,4 +547,4 @@ export {
470
547
  createMockWeatherAgent
471
548
  };
472
549
 
473
- //# debugId=D5671399AC39730564756E2164756E21
550
+ //# debugId=176F52ED9B21804364756E2164756E21
package/dist/index.js.map CHANGED
@@ -5,13 +5,13 @@
5
5
  "import type { AssistantMessage, ChatAgent, ChatMessage, ToolMessage } from \"./types\";\n\nfunction last<T>(items: T[]): T | undefined {\n return items.length > 0 ? items[items.length - 1] : undefined;\n}\n\nfunction findLatestToolMessage(messages: ChatMessage[], toolName: string): ToolMessage | undefined {\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i];\n if (!message) continue;\n if (message.role === \"tool\" && message.name === toolName) return message;\n }\n return undefined;\n}\n\nfunction tryParseJson<T>(value: string): T | undefined {\n try {\n return JSON.parse(value) as T;\n } catch {\n return undefined;\n }\n}\n\nexport type MockWeatherAgentOptions = {\n toolName?: string;\n};\n\nexport function createMockWeatherAgent(options: MockWeatherAgentOptions = {}): ChatAgent {\n const toolName = options.toolName ?? \"get_weather\";\n let callCounter = 0;\n\n return async ({ messages }) => {\n const latest = last(messages);\n if (!latest || latest.role !== \"user\") {\n return { role: \"assistant\", content: \"Send a user message to continue.\" };\n }\n\n const userText = latest.content.toLowerCase();\n\n if (userText.includes(\"weather\")) {\n callCounter += 1;\n return {\n role: \"assistant\",\n content: \"\",\n tool_calls: [\n {\n id: `call_${callCounter}`,\n type: \"function\",\n function: {\n name: toolName,\n arguments: JSON.stringify({ location: \"Dublin\", unit: \"c\" }),\n },\n },\n ],\n };\n }\n\n if (userText.includes(\"umbrella\")) {\n const toolMessage = findLatestToolMessage(messages, toolName);\n const payload = toolMessage ? tryParseJson<{ temp_c?: number; condition?: string }>(toolMessage.content) : undefined;\n const condition = payload?.condition?.toLowerCase();\n\n if (condition?.includes(\"rain\")) {\n return { role: \"assistant\", content: \"Yes—bring an umbrella. The forecast shows rain.\" };\n }\n if (toolMessage) {\n return { role: \"assistant\", content: \"Probably yes—better to be prepared based on the forecast.\" };\n }\n return {\n role: \"assistant\",\n content: \"\",\n tool_calls: [\n {\n id: `call_${++callCounter}`,\n type: \"function\",\n function: { name: toolName, arguments: JSON.stringify({ location: \"Dublin\", unit: \"c\" }) },\n },\n ],\n };\n }\n\n const reply: AssistantMessage = { role: \"assistant\", content: \"OK.\" };\n return reply;\n };\n}\n",
6
6
  "import type { AssistantMessage, ChatAgent, ChatAgentRequest } from \"./types\";\n\nexport type OpenAIChatAgentOptions = {\n apiKey?: string;\n baseUrl?: string;\n defaultModel?: string;\n};\n\ntype OpenAIChatCompletionResponse = {\n choices: Array<{\n message: AssistantMessage;\n }>;\n};\n\nexport function createOpenAIChatAgent(options: OpenAIChatAgentOptions = {}): ChatAgent {\n const apiKey = options.apiKey ?? process.env.OPENAI_API_KEY;\n const baseUrl = options.baseUrl ?? process.env.OPENAI_BASE_URL ?? \"https://api.openai.com/v1\";\n const defaultModel = options.defaultModel ?? process.env.OPENAI_MODEL ?? \"gpt-4o-mini\";\n\n if (!apiKey) {\n throw new Error(\"Missing OPENAI_API_KEY (or pass { apiKey }).\");\n }\n\n return async (req: ChatAgentRequest) => {\n const model = req.model ?? defaultModel;\n const res = await fetch(`${baseUrl}/chat/completions`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n model,\n messages: req.messages,\n tools: req.tools,\n tool_choice: req.tool_choice,\n }),\n });\n\n if (!res.ok) {\n const body = await res.text().catch(() => \"\");\n throw new Error(`OpenAI chat.completions failed: ${res.status} ${res.statusText}${body ? `\\n${body}` : \"\"}`);\n }\n\n const data = (await res.json()) as OpenAIChatCompletionResponse;\n const message = data.choices?.[0]?.message;\n if (!message) throw new Error(\"OpenAI chat.completions returned no message.\");\n return message;\n };\n}\n",
7
7
  "import { parse as parseYaml } from \"yaml\";\nimport type { AgentSpec, FixtureFile } from \"./types\";\n\nfunction expandEnvVars(value: string, env: Record<string, string | undefined>): string {\n return value.replace(/\\$\\{([A-Z0-9_]+)\\}/gi, (_, key: string) => env[key] ?? \"\");\n}\n\nfunction normalizeAgentSpec(raw: AgentSpec, env: Record<string, string | undefined>): AgentSpec {\n const normalized: AgentSpec = { ...raw };\n\n if (normalized.type === undefined) normalized.type = \"subprocess\";\n if (!Array.isArray(normalized.command) || normalized.command.length === 0) {\n throw new Error(\"`agent.command` must be a non-empty array of strings.\");\n }\n\n normalized.command = normalized.command.map((part) => String(part));\n\n if (normalized.cwd !== undefined) normalized.cwd = String(normalized.cwd);\n if (normalized.timeout_ms !== undefined) normalized.timeout_ms = Number(normalized.timeout_ms);\n\n if (normalized.env) {\n const expanded: Record<string, string> = {};\n for (const [k, v] of Object.entries(normalized.env)) {\n expanded[k] = expandEnvVars(String(v), env);\n }\n normalized.env = expanded;\n }\n\n return normalized;\n}\n\nexport function loadFixtureFile(yamlText: string, env: Record<string, string | undefined> = process.env): FixtureFile {\n const data = parseYaml(yamlText) as unknown;\n if (!data || typeof data !== \"object\") throw new Error(\"Fixture file must be a YAML object.\");\n\n const file = data as Partial<FixtureFile>;\n if (!Array.isArray(file.fixtures)) throw new Error(\"Fixture file must contain `fixtures: [...]`.\");\n\n const normalized: FixtureFile = {\n fixtures: file.fixtures as FixtureFile[\"fixtures\"],\n };\n\n if (file.agent) normalized.agent = normalizeAgentSpec(file.agent as AgentSpec, env);\n\n normalized.fixtures = normalized.fixtures.map((fixture, index) => {\n if (!fixture || typeof fixture !== \"object\") throw new Error(`fixtures[${index}] must be an object.`);\n if (!(\"id\" in fixture)) throw new Error(`fixtures[${index}].id is required.`);\n if (!(\"input\" in fixture)) throw new Error(`fixtures[${index}].input is required.`);\n\n const out = { ...fixture } as any;\n out.id = String(out.id);\n out.input = String(out.input);\n\n if (out.agent) out.agent = normalizeAgentSpec(out.agent as AgentSpec, env);\n if (out.expect?.tool_calls_match === undefined && out.expect?.tool_calls) out.expect.tool_calls_match = \"contains\";\n\n return out;\n });\n\n return normalized;\n}\n",
8
- "import { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport type { AssistantMessage } from \"../agent/types\";\nimport { loadFixtureFile } from \"../fixture/load\";\nimport type { AgentSpec, Fixture, FixtureFile } from \"../fixture/types\";\nimport { createOpenAIJudge } from \"../judge/openaiJudge\";\nimport { callSubprocessAgent } from \"./subprocessAgent\";\nimport type { ExpectationResult, Judge } from \"./expectations\";\nimport { evaluateExpectations } from \"./expectations\";\n\nexport type JudgeMode = \"off\" | \"auto\" | \"on\";\n\nexport type RunOptions = {\n judgeMode?: JudgeMode;\n judgeModel?: string;\n};\n\nexport type FixtureResult = {\n id: string;\n status: \"pass\" | \"fail\" | \"skip\";\n reason?: string;\n message?: AssistantMessage;\n};\n\nexport type FixtureFileResult = {\n path: string;\n results: FixtureResult[];\n};\n\nfunction pickAgentSpec(file: FixtureFile, fixture: Fixture): AgentSpec {\n const agent = fixture.agent ?? file.agent;\n if (!agent) throw new Error(`Fixture '${fixture.id}' has no agent. Add file-level 'agent:' or fixture-level 'agent:'.`);\n if ((agent.type ?? \"subprocess\") !== \"subprocess\") throw new Error(`Unsupported agent type: ${agent.type}`);\n return agent;\n}\n\nfunction makeJudge(mode: JudgeMode, model?: string): Judge | undefined {\n if (mode === \"off\") return undefined;\n\n const apiKey = process.env.OPENAI_API_KEY;\n if (!apiKey) {\n if (mode === \"on\") throw new Error(\"Judge mode is 'on' but OPENAI_API_KEY is not set.\");\n return undefined;\n }\n\n return createOpenAIJudge({ apiKey, model });\n}\n\nexport async function runFixtureFile(path: string, options: RunOptions = {}): Promise<FixtureFileResult> {\n const absolute = resolve(path);\n const yamlText = await readFile(absolute, \"utf8\");\n const file = loadFixtureFile(yamlText);\n\n const judgeMode = options.judgeMode ?? \"auto\";\n const judge = makeJudge(judgeMode, options.judgeModel);\n\n const results: FixtureResult[] = [];\n\n for (const fixture of file.fixtures) {\n try {\n const agent = pickAgentSpec(file, fixture);\n const messages = [...(fixture.history ?? []), { role: \"user\", content: fixture.input } as const];\n\n const message = await callSubprocessAgent(agent, {\n messages,\n tools: [],\n tool_choice: \"auto\",\n });\n\n const expectation = await evaluateExpectations(fixture.expect, message, judge);\n results.push({\n id: fixture.id,\n status: expectation.status,\n reason: (expectation as Extract<ExpectationResult, { status: \"fail\" | \"skip\" }>).reason,\n message,\n });\n } catch (err) {\n const reason = err instanceof Error ? err.message : String(err);\n results.push({ id: fixture.id, status: \"fail\", reason });\n }\n }\n\n return { path: absolute, results };\n}\n",
8
+ "import { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport type { AssistantMessage, ToolMessage } from \"../agent/types\";\nimport { loadFixtureFile } from \"../fixture/load\";\nimport type { AgentSpec, Fixture, FixtureFile } from \"../fixture/types\";\nimport { createOpenAIJudge } from \"../judge/openaiJudge\";\nimport { callSubprocessAgent } from \"./subprocessAgent\";\nimport type { ExpectationResult, Judge } from \"./expectations\";\nimport { evaluateExpectations } from \"./expectations\";\n\nexport type JudgeMode = \"off\" | \"auto\" | \"on\";\n\nexport type RunOptions = {\n judgeMode?: JudgeMode;\n judgeModel?: string;\n};\n\nexport type FixtureResult = {\n id: string;\n status: \"pass\" | \"fail\" | \"skip\";\n reason?: string;\n message?: AssistantMessage;\n tool_messages?: ToolMessage[];\n};\n\nexport type FixtureFileResult = {\n path: string;\n results: FixtureResult[];\n};\n\nfunction pickAgentSpec(file: FixtureFile, fixture: Fixture): AgentSpec {\n const agent = fixture.agent ?? file.agent;\n if (!agent) throw new Error(`Fixture '${fixture.id}' has no agent. Add file-level 'agent:' or fixture-level 'agent:'.`);\n if ((agent.type ?? \"subprocess\") !== \"subprocess\") throw new Error(`Unsupported agent type: ${agent.type}`);\n return agent;\n}\n\nfunction makeJudge(mode: JudgeMode, model?: string): Judge | undefined {\n if (mode === \"off\") return undefined;\n\n const apiKey = process.env.OPENAI_API_KEY;\n if (!apiKey) {\n if (mode === \"on\") throw new Error(\"Judge mode is 'on' but OPENAI_API_KEY is not set.\");\n return undefined;\n }\n\n return createOpenAIJudge({ apiKey, model });\n}\n\nexport async function runFixtureFile(path: string, options: RunOptions = {}): Promise<FixtureFileResult> {\n const absolute = resolve(path);\n const yamlText = await readFile(absolute, \"utf8\");\n const file = loadFixtureFile(yamlText);\n\n const judgeMode = options.judgeMode ?? \"auto\";\n const judge = makeJudge(judgeMode, options.judgeModel);\n\n const results: FixtureResult[] = [];\n\n for (const fixture of file.fixtures) {\n try {\n const agent = pickAgentSpec(file, fixture);\n const messages = [...(fixture.history ?? []), { role: \"user\", content: fixture.input } as const];\n\n const res = await callSubprocessAgent(agent, {\n messages,\n tools: [],\n tool_choice: \"auto\",\n });\n\n const expectation = await evaluateExpectations(fixture.expect, res, judge);\n results.push({\n id: fixture.id,\n status: expectation.status,\n reason: (expectation as Extract<ExpectationResult, { status: \"fail\" | \"skip\" }>).reason,\n message: res.message,\n tool_messages: res.tool_messages,\n });\n } catch (err) {\n const reason = err instanceof Error ? err.message : String(err);\n results.push({ id: fixture.id, status: \"fail\", reason });\n }\n }\n\n return { path: absolute, results };\n}\n",
9
9
  "import type { AssistantMessage } from \"../agent/types\";\nimport type { ExpectationResult } from \"../runner/expectations\";\n\nexport type OpenAIJudgeOptions = {\n apiKey: string;\n baseUrl?: string;\n model?: string;\n};\n\ntype JudgeResponse = { pass: boolean; reason: string };\n\nexport function createOpenAIJudge(options: OpenAIJudgeOptions) {\n const baseUrl = options.baseUrl ?? process.env.OPENAI_BASE_URL ?? \"https://api.openai.com/v1\";\n const model = options.model ?? process.env.OPENAI_JUDGE_MODEL ?? \"gpt-4o-mini\";\n\n return async ({ expectation, message }: { expectation: string; message: AssistantMessage }): Promise<ExpectationResult> => {\n const system =\n \"You are a strict test evaluator. Decide if the assistant message satisfies the expectation. \" +\n \"Respond with ONLY valid JSON: {\\\"pass\\\": boolean, \\\"reason\\\": string}.\";\n\n const user = JSON.stringify(\n {\n expectation,\n assistant_message: message,\n },\n null,\n 2\n );\n\n const res = await fetch(`${baseUrl}/chat/completions`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${options.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n model,\n temperature: 0,\n messages: [\n { role: \"system\", content: system },\n { role: \"user\", content: user },\n ],\n }),\n });\n\n if (!res.ok) {\n const body = await res.text().catch(() => \"\");\n return {\n status: \"fail\",\n reason: `Judge call failed: ${res.status} ${res.statusText}${body ? `\\n${body}` : \"\"}`,\n };\n }\n\n const data = (await res.json()) as any;\n const content = data?.choices?.[0]?.message?.content;\n if (typeof content !== \"string\" || content.trim().length === 0) {\n return { status: \"fail\", reason: \"Judge returned no content.\" };\n }\n\n let parsed: JudgeResponse;\n try {\n parsed = JSON.parse(content) as JudgeResponse;\n } catch {\n return { status: \"fail\", reason: `Judge did not return valid JSON.\\n${content}` };\n }\n\n if (parsed.pass) return { status: \"pass\" };\n return { status: \"fail\", reason: parsed.reason || \"Expectation not satisfied.\" };\n };\n}\n",
10
- "import type { AssistantMessage, ChatAgentRequest } from \"../agent/types\";\nimport type { AgentSpec } from \"../fixture/types\";\n\ntype AgentProcessSuccess = { message: AssistantMessage };\ntype AgentProcessError = { error: { message: string } };\n\nfunction isSuccess(value: unknown): value is AgentProcessSuccess {\n return !!value && typeof value === \"object\" && \"message\" in (value as any);\n}\n\nfunction isError(value: unknown): value is AgentProcessError {\n return !!value && typeof value === \"object\" && \"error\" in (value as any);\n}\n\nasync function readFirstNonEmptyLine(stream: ReadableStream<Uint8Array>, timeoutMs: number): Promise<string> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n const deadline = Date.now() + timeoutMs;\n\n type ReadResult = { value?: Uint8Array; done: boolean };\n\n while (true) {\n const timeLeft = deadline - Date.now();\n if (timeLeft <= 0) throw new Error(`Timed out waiting for agent response after ${timeoutMs}ms.`);\n\n let timerId: ReturnType<typeof setTimeout> | undefined;\n const timerPromise = new Promise<never>((_, reject) => {\n timerId = setTimeout(() => reject(new Error(`Timed out waiting for agent response after ${timeoutMs}ms.`)), timeLeft);\n });\n\n let chunk: ReadResult;\n try {\n chunk = await Promise.race([reader.read(), timerPromise]);\n } finally {\n if (timerId !== undefined) clearTimeout(timerId);\n }\n\n const { value, done } = chunk;\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n while (true) {\n const idx = buffer.indexOf(\"\\n\");\n if (idx === -1) break;\n const line = buffer.slice(0, idx).trim();\n buffer = buffer.slice(idx + 1);\n if (line.length > 0) return line;\n }\n }\n\n const tail = buffer.trim();\n if (tail.length > 0) return tail;\n throw new Error(\"Agent produced no output on stdout.\");\n}\n\nexport async function callSubprocessAgent(spec: AgentSpec, request: ChatAgentRequest): Promise<AssistantMessage> {\n const timeoutMs = spec.timeout_ms ?? 20_000;\n\n const proc = Bun.spawn(spec.command, {\n cwd: spec.cwd,\n env: { ...process.env, ...(spec.env ?? {}) },\n stdin: \"pipe\",\n stdout: \"pipe\",\n stderr: \"pipe\",\n });\n\n const stdin = proc.stdin;\n if (!stdin) throw new Error(\"Failed to open agent stdin.\");\n\n stdin.write(`${JSON.stringify(request)}\\n`);\n stdin.end();\n\n let stderrText = \"\";\n const stderrPromise = (async () => {\n if (!proc.stderr) return;\n stderrText = await new Response(proc.stderr).text().catch(() => \"\");\n })();\n\n try {\n if (!proc.stdout) throw new Error(\"Failed to open agent stdout.\");\n const line = await readFirstNonEmptyLine(proc.stdout, timeoutMs);\n\n let payload: unknown;\n try {\n payload = JSON.parse(line) as unknown;\n } catch {\n throw new Error(\n `Agent stdout is not valid JSON.\\n` +\n `Line: ${line}\\n` +\n (stderrText ? `Stderr:\\n${stderrText}` : \"\")\n );\n }\n\n if (isError(payload)) throw new Error(payload.error.message);\n if (!isSuccess(payload)) {\n throw new Error(`Agent response must be { \"message\": { ... } } or { \"error\": { \"message\": ... } }.`);\n }\n\n return payload.message;\n } finally {\n proc.kill();\n await Promise.allSettled([proc.exited, stderrPromise]);\n }\n}\n",
10
+ "import type { AssistantMessage, ChatAgentRequest, ToolMessage } from \"../agent/types\";\nimport type { AgentSpec } from \"../fixture/types\";\n\nexport type SubprocessAgentResponse = { message: AssistantMessage; tool_messages?: ToolMessage[] };\ntype AgentProcessError = { error: { message: string } };\n\nfunction isSuccess(value: unknown): value is SubprocessAgentResponse {\n return !!value && typeof value === \"object\" && \"message\" in (value as any);\n}\n\nfunction isError(value: unknown): value is AgentProcessError {\n return !!value && typeof value === \"object\" && \"error\" in (value as any);\n}\n\nasync function readFirstNonEmptyLine(stream: ReadableStream<Uint8Array>, timeoutMs: number): Promise<string> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n const deadline = Date.now() + timeoutMs;\n\n type ReadResult = { value?: Uint8Array; done: boolean };\n\n while (true) {\n const timeLeft = deadline - Date.now();\n if (timeLeft <= 0) throw new Error(`Timed out waiting for agent response after ${timeoutMs}ms.`);\n\n let timerId: ReturnType<typeof setTimeout> | undefined;\n const timerPromise = new Promise<never>((_, reject) => {\n timerId = setTimeout(() => reject(new Error(`Timed out waiting for agent response after ${timeoutMs}ms.`)), timeLeft);\n });\n\n let chunk: ReadResult;\n try {\n chunk = await Promise.race([reader.read(), timerPromise]);\n } finally {\n if (timerId !== undefined) clearTimeout(timerId);\n }\n\n const { value, done } = chunk;\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n while (true) {\n const idx = buffer.indexOf(\"\\n\");\n if (idx === -1) break;\n const line = buffer.slice(0, idx).trim();\n buffer = buffer.slice(idx + 1);\n if (line.length > 0) return line;\n }\n }\n\n const tail = buffer.trim();\n if (tail.length > 0) return tail;\n throw new Error(\"Agent produced no output on stdout.\");\n}\n\nexport async function callSubprocessAgent(spec: AgentSpec, request: ChatAgentRequest): Promise<SubprocessAgentResponse> {\n const timeoutMs = spec.timeout_ms ?? 20_000;\n\n const proc = Bun.spawn(spec.command, {\n cwd: spec.cwd,\n env: { ...process.env, ...(spec.env ?? {}) },\n stdin: \"pipe\",\n stdout: \"pipe\",\n stderr: \"pipe\",\n });\n\n const stdin = proc.stdin;\n if (!stdin) throw new Error(\"Failed to open agent stdin.\");\n\n stdin.write(`${JSON.stringify(request)}\\n`);\n stdin.end();\n\n let stderrText = \"\";\n const stderrPromise = (async () => {\n if (!proc.stderr) return;\n stderrText = await new Response(proc.stderr).text().catch(() => \"\");\n })();\n\n try {\n if (!proc.stdout) throw new Error(\"Failed to open agent stdout.\");\n const line = await readFirstNonEmptyLine(proc.stdout, timeoutMs);\n\n let payload: unknown;\n try {\n payload = JSON.parse(line) as unknown;\n } catch {\n throw new Error(\n `Agent stdout is not valid JSON.\\n` +\n `Line: ${line}\\n` +\n (stderrText ? `Stderr:\\n${stderrText}` : \"\")\n );\n }\n\n if (isError(payload)) throw new Error(payload.error.message);\n if (!isSuccess(payload)) {\n throw new Error(`Agent response must be { \"message\": { ... } } or { \"error\": { \"message\": ... } }.`);\n }\n\n return payload;\n } finally {\n proc.kill();\n await Promise.allSettled([proc.exited, stderrPromise]);\n }\n}\n",
11
11
  "export function deepPartialMatch(expected: unknown, actual: unknown): boolean {\n if (expected === actual) return true;\n\n if (expected === null || actual === null) return expected === actual;\n\n const expectedType = typeof expected;\n const actualType = typeof actual;\n if (expectedType !== actualType) return false;\n\n if (Array.isArray(expected)) {\n if (!Array.isArray(actual)) return false;\n if (expected.length !== actual.length) return false;\n for (let i = 0; i < expected.length; i++) {\n if (!deepPartialMatch(expected[i], actual[i])) return false;\n }\n return true;\n }\n\n if (expectedType === \"object\") {\n if (Array.isArray(actual)) return false;\n const expectedObj = expected as Record<string, unknown>;\n const actualObj = actual as Record<string, unknown>;\n for (const [key, expectedValue] of Object.entries(expectedObj)) {\n if (!(key in actualObj)) return false;\n if (!deepPartialMatch(expectedValue, actualObj[key])) return false;\n }\n return true;\n }\n\n return false;\n}\n\n",
12
- "import type { AssistantMessage } from \"../agent/types\";\nimport type { FixtureExpectation, ToolCallExpectation } from \"../fixture/types\";\nimport { deepPartialMatch } from \"./deepMatch\";\n\nexport type ExpectationResult =\n | { status: \"pass\" }\n | { status: \"fail\"; reason: string }\n | { status: \"skip\"; reason: string };\n\nfunction parseJsonOrUndefined(value: string): unknown | undefined {\n try {\n return JSON.parse(value) as unknown;\n } catch {\n return undefined;\n }\n}\n\nfunction matchToolCall(expected: ToolCallExpectation, actual: NonNullable<AssistantMessage[\"tool_calls\"]>[number]): boolean {\n if (actual.function.name !== expected.name) return false;\n if (expected.arguments === undefined) return true;\n const actualArgs = parseJsonOrUndefined(actual.function.arguments);\n if (actualArgs === undefined) return false;\n return deepPartialMatch(expected.arguments, actualArgs);\n}\n\nfunction checkToolCalls(expect: FixtureExpectation, message: AssistantMessage): ExpectationResult {\n const expectedCalls = expect.tool_calls ?? [];\n if (expectedCalls.length === 0) return { status: \"pass\" };\n\n const actualCalls = message.tool_calls ?? [];\n const mode = expect.tool_calls_match ?? \"contains\";\n\n if (mode === \"contains\") {\n for (const expected of expectedCalls) {\n const ok = actualCalls.some((actual) => matchToolCall(expected, actual));\n if (!ok) {\n return {\n status: \"fail\",\n reason: `Expected tool call not found: ${expected.name}`,\n };\n }\n }\n return { status: \"pass\" };\n }\n\n if (actualCalls.length !== expectedCalls.length) {\n return {\n status: \"fail\",\n reason: `Expected exactly ${expectedCalls.length} tool call(s), got ${actualCalls.length}.`,\n };\n }\n\n for (let i = 0; i < expectedCalls.length; i++) {\n const expected = expectedCalls[i];\n const actual = actualCalls[i];\n if (!expected || !actual || !matchToolCall(expected, actual)) {\n return { status: \"fail\", reason: `Tool call mismatch at index ${i}.` };\n }\n }\n\n return { status: \"pass\" };\n}\n\nexport type Judge = (args: { expectation: string; message: AssistantMessage }) => Promise<ExpectationResult>;\n\nexport async function evaluateExpectations(\n expect: FixtureExpectation | undefined,\n message: AssistantMessage,\n judge: Judge | undefined\n): Promise<ExpectationResult> {\n if (!expect) return { status: \"pass\" };\n\n const toolRes = checkToolCalls(expect, message);\n if (toolRes.status !== \"pass\") return toolRes;\n\n if (expect.assistant?.llm) {\n if (!judge) return { status: \"skip\", reason: \"LLM judge not configured.\" };\n return await judge({ expectation: expect.assistant.llm, message });\n }\n\n return { status: \"pass\" };\n}\n"
12
+ "import type { AssistantMessage, ToolMessage } from \"../agent/types\";\nimport type { FixtureExpectation, ToolCallExpectation, ToolResultExpectation } from \"../fixture/types\";\nimport { deepPartialMatch } from \"./deepMatch\";\n\nexport type ExpectationResult =\n | { status: \"pass\" }\n | { status: \"fail\"; reason: string }\n | { status: \"skip\"; reason: string };\n\nfunction parseJsonOrUndefined(value: string): unknown | undefined {\n try {\n return JSON.parse(value) as unknown;\n } catch {\n return undefined;\n }\n}\n\nfunction matchToolCall(expected: ToolCallExpectation, actual: NonNullable<AssistantMessage[\"tool_calls\"]>[number]): boolean {\n if (actual.function.name !== expected.name) return false;\n if (expected.arguments === undefined) return true;\n const actualArgs = parseJsonOrUndefined(actual.function.arguments);\n if (actualArgs === undefined) return false;\n return deepPartialMatch(expected.arguments, actualArgs);\n}\n\nfunction checkToolCalls(expect: FixtureExpectation, message: AssistantMessage): ExpectationResult {\n const expectedCalls = expect.tool_calls ?? [];\n if (expectedCalls.length === 0) return { status: \"pass\" };\n\n const actualCalls = message.tool_calls ?? [];\n const mode = expect.tool_calls_match ?? \"contains\";\n\n if (mode === \"contains\") {\n for (const expected of expectedCalls) {\n const ok = actualCalls.some((actual) => matchToolCall(expected, actual));\n if (!ok) {\n return {\n status: \"fail\",\n reason: `Expected tool call not found: ${expected.name}`,\n };\n }\n }\n return { status: \"pass\" };\n }\n\n if (actualCalls.length !== expectedCalls.length) {\n return {\n status: \"fail\",\n reason: `Expected exactly ${expectedCalls.length} tool call(s), got ${actualCalls.length}.`,\n };\n }\n\n for (let i = 0; i < expectedCalls.length; i++) {\n const expected = expectedCalls[i];\n const actual = actualCalls[i];\n if (!expected || !actual || !matchToolCall(expected, actual)) {\n return { status: \"fail\", reason: `Tool call mismatch at index ${i}.` };\n }\n }\n\n return { status: \"pass\" };\n}\n\nexport type Judge = (args: { expectation: string; message: AssistantMessage }) => Promise<ExpectationResult>;\n\ntype AgentTurn = { message: AssistantMessage; tool_messages?: ToolMessage[] };\n\nfunction matchToolResult(expected: ToolResultExpectation, actual: ToolMessage): boolean {\n if (expected.tool_call_id !== undefined && actual.tool_call_id !== expected.tool_call_id) return false;\n if (expected.name !== undefined && actual.name !== expected.name) return false;\n\n if (expected.content !== undefined) {\n const mode = expected.content_match ?? \"exact\";\n if (mode === \"exact\" && actual.content !== expected.content) return false;\n if (mode === \"contains\" && !actual.content.includes(expected.content)) return false;\n }\n\n if (expected.content_json !== undefined) {\n const actualJson = parseJsonOrUndefined(actual.content);\n if (actualJson === undefined) return false;\n if (!deepPartialMatch(expected.content_json, actualJson)) return false;\n }\n\n return true;\n}\n\nfunction checkToolResults(expect: FixtureExpectation, toolMessages: ToolMessage[]): ExpectationResult {\n const expectedResults = expect.tool_results ?? [];\n if (expectedResults.length === 0) return { status: \"pass\" };\n\n const mode = expect.tool_results_match ?? \"contains\";\n\n if (mode === \"contains\") {\n for (const expected of expectedResults) {\n if (!expected.name && !expected.tool_call_id) {\n return { status: \"fail\", reason: \"tool_results entries must include at least 'name' or 'tool_call_id'.\" };\n }\n\n const ok = toolMessages.some((actual) => matchToolResult(expected, actual));\n if (!ok) {\n return {\n status: \"fail\",\n reason: `Expected tool result not found${expected.name ? `: ${expected.name}` : \"\"}.`,\n };\n }\n }\n return { status: \"pass\" };\n }\n\n if (toolMessages.length !== expectedResults.length) {\n return {\n status: \"fail\",\n reason: `Expected exactly ${expectedResults.length} tool result(s), got ${toolMessages.length}.`,\n };\n }\n\n for (let i = 0; i < expectedResults.length; i++) {\n const expected = expectedResults[i];\n const actual = toolMessages[i];\n if (!expected || !actual || !matchToolResult(expected, actual)) {\n return { status: \"fail\", reason: `Tool result mismatch at index ${i}.` };\n }\n }\n\n return { status: \"pass\" };\n}\n\nfunction checkAssistantContent(expect: FixtureExpectation, message: AssistantMessage): ExpectationResult {\n const expected = expect.assistant?.content;\n if (expected === undefined) return { status: \"pass\" };\n\n const mode = expect.assistant?.content_match ?? \"contains\";\n if (mode === \"exact\") {\n if (message.content !== expected) return { status: \"fail\", reason: \"Assistant content did not match exactly.\" };\n return { status: \"pass\" };\n }\n\n if (!message.content.includes(expected)) return { status: \"fail\", reason: \"Assistant content did not contain expected text.\" };\n return { status: \"pass\" };\n}\n\nexport async function evaluateExpectations(\n expect: FixtureExpectation | undefined,\n turn: AgentTurn,\n judge: Judge | undefined\n): Promise<ExpectationResult> {\n if (!expect) return { status: \"pass\" };\n\n const toolRes = checkToolCalls(expect, turn.message);\n if (toolRes.status !== \"pass\") return toolRes;\n\n const toolResultsRes = checkToolResults(expect, turn.tool_messages ?? []);\n if (toolResultsRes.status !== \"pass\") return toolResultsRes;\n\n const contentRes = checkAssistantContent(expect, turn.message);\n if (contentRes.status !== \"pass\") return contentRes;\n\n if (expect.assistant?.llm) {\n if (!judge) return { status: \"skip\", reason: \"LLM judge not configured.\" };\n return await judge({ expectation: expect.assistant.llm, message: turn.message });\n }\n\n return { status: \"pass\" };\n}\n"
13
13
  ],
14
- "mappings": "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",
15
- "debugId": "D5671399AC39730564756E2164756E21",
14
+ "mappings": ";;AAEA,SAAS,IAAO,CAAC,OAA2B;AAAA,EAC1C,OAAO,MAAM,SAAS,IAAI,MAAM,MAAM,SAAS,KAAK;AAAA;AAGtD,SAAS,qBAAqB,CAAC,UAAyB,UAA2C;AAAA,EACjG,SAAS,IAAI,SAAS,SAAS,EAAG,KAAK,GAAG,KAAK;AAAA,IAC7C,MAAM,UAAU,SAAS;AAAA,IACzB,IAAI,CAAC;AAAA,MAAS;AAAA,IACd,IAAI,QAAQ,SAAS,UAAU,QAAQ,SAAS;AAAA,MAAU,OAAO;AAAA,EACnE;AAAA,EACA;AAAA;AAGF,SAAS,YAAe,CAAC,OAA8B;AAAA,EACrD,IAAI;AAAA,IACF,OAAO,KAAK,MAAM,KAAK;AAAA,IACvB,MAAM;AAAA,IACN;AAAA;AAAA;AAQG,SAAS,sBAAsB,CAAC,UAAmC,CAAC,GAAc;AAAA,EACvF,MAAM,WAAW,QAAQ,YAAY;AAAA,EACrC,IAAI,cAAc;AAAA,EAElB,OAAO,SAAS,eAAe;AAAA,IAC7B,MAAM,SAAS,KAAK,QAAQ;AAAA,IAC5B,IAAI,CAAC,UAAU,OAAO,SAAS,QAAQ;AAAA,MACrC,OAAO,EAAE,MAAM,aAAa,SAAS,mCAAmC;AAAA,IAC1E;AAAA,IAEA,MAAM,WAAW,OAAO,QAAQ,YAAY;AAAA,IAE5C,IAAI,SAAS,SAAS,SAAS,GAAG;AAAA,MAChC,eAAe;AAAA,MACf,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,QACT,YAAY;AAAA,UACV;AAAA,YACE,IAAI,QAAQ;AAAA,YACZ,MAAM;AAAA,YACN,UAAU;AAAA,cACR,MAAM;AAAA,cACN,WAAW,KAAK,UAAU,EAAE,UAAU,UAAU,MAAM,IAAI,CAAC;AAAA,YAC7D;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IAEA,IAAI,SAAS,SAAS,UAAU,GAAG;AAAA,MACjC,MAAM,cAAc,sBAAsB,UAAU,QAAQ;AAAA,MAC5D,MAAM,UAAU,cAAc,aAAsD,YAAY,OAAO,IAAI;AAAA,MAC3G,MAAM,YAAY,SAAS,WAAW,YAAY;AAAA,MAElD,IAAI,WAAW,SAAS,MAAM,GAAG;AAAA,QAC/B,OAAO,EAAE,MAAM,aAAa,SAAS,uDAAiD;AAAA,MACxF;AAAA,MACA,IAAI,aAAa;AAAA,QACf,OAAO,EAAE,MAAM,aAAa,SAAS,iEAA2D;AAAA,MAClG;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,QACT,YAAY;AAAA,UACV;AAAA,YACE,IAAI,QAAQ,EAAE;AAAA,YACd,MAAM;AAAA,YACN,UAAU,EAAE,MAAM,UAAU,WAAW,KAAK,UAAU,EAAE,UAAU,UAAU,MAAM,IAAI,CAAC,EAAE;AAAA,UAC3F;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IAEA,MAAM,QAA0B,EAAE,MAAM,aAAa,SAAS,MAAM;AAAA,IACpE,OAAO;AAAA;AAAA;;ACpEJ,SAAS,qBAAqB,CAAC,UAAkC,CAAC,GAAc;AAAA,EACrF,MAAM,SAAS,QAAQ,UAAU,QAAQ,IAAI;AAAA,EAC7C,MAAM,UAAU,QAAQ,WAAW,QAAQ,IAAI,mBAAmB;AAAA,EAClE,MAAM,eAAe,QAAQ,gBAAgB,QAAQ,IAAI,gBAAgB;AAAA,EAEzE,IAAI,CAAC,QAAQ;AAAA,IACX,MAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AAAA,EAEA,OAAO,OAAO,QAA0B;AAAA,IACtC,MAAM,QAAQ,IAAI,SAAS;AAAA,IAC3B,MAAM,MAAM,MAAM,MAAM,GAAG,4BAA4B;AAAA,MACrD,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,eAAe,UAAU;AAAA,QACzB,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACnB;AAAA,QACA,UAAU,IAAI;AAAA,QACd,OAAO,IAAI;AAAA,QACX,aAAa,IAAI;AAAA,MACnB,CAAC;AAAA,IACH,CAAC;AAAA,IAED,IAAI,CAAC,IAAI,IAAI;AAAA,MACX,MAAM,OAAO,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AAAA,MAC5C,MAAM,IAAI,MAAM,mCAAmC,IAAI,UAAU,IAAI,aAAa,OAAO;AAAA,EAAK,SAAS,IAAI;AAAA,IAC7G;AAAA,IAEA,MAAM,OAAQ,MAAM,IAAI,KAAK;AAAA,IAC7B,MAAM,UAAU,KAAK,UAAU,IAAI;AAAA,IACnC,IAAI,CAAC;AAAA,MAAS,MAAM,IAAI,MAAM,8CAA8C;AAAA,IAC5E,OAAO;AAAA;AAAA;;AC/CX,kBAAS;AAGT,SAAS,aAAa,CAAC,OAAe,KAAiD;AAAA,EACrF,OAAO,MAAM,QAAQ,wBAAwB,CAAC,GAAG,QAAgB,IAAI,QAAQ,EAAE;AAAA;AAGjF,SAAS,kBAAkB,CAAC,KAAgB,KAAoD;AAAA,EAC9F,MAAM,aAAwB,KAAK,IAAI;AAAA,EAEvC,IAAI,WAAW,SAAS;AAAA,IAAW,WAAW,OAAO;AAAA,EACrD,IAAI,CAAC,MAAM,QAAQ,WAAW,OAAO,KAAK,WAAW,QAAQ,WAAW,GAAG;AAAA,IACzE,MAAM,IAAI,MAAM,uDAAuD;AAAA,EACzE;AAAA,EAEA,WAAW,UAAU,WAAW,QAAQ,IAAI,CAAC,SAAS,OAAO,IAAI,CAAC;AAAA,EAElE,IAAI,WAAW,QAAQ;AAAA,IAAW,WAAW,MAAM,OAAO,WAAW,GAAG;AAAA,EACxE,IAAI,WAAW,eAAe;AAAA,IAAW,WAAW,aAAa,OAAO,WAAW,UAAU;AAAA,EAE7F,IAAI,WAAW,KAAK;AAAA,IAClB,MAAM,WAAmC,CAAC;AAAA,IAC1C,YAAY,GAAG,MAAM,OAAO,QAAQ,WAAW,GAAG,GAAG;AAAA,MACnD,SAAS,KAAK,cAAc,OAAO,CAAC,GAAG,GAAG;AAAA,IAC5C;AAAA,IACA,WAAW,MAAM;AAAA,EACnB;AAAA,EAEA,OAAO;AAAA;AAGF,SAAS,eAAe,CAAC,UAAkB,MAA0C,QAAQ,KAAkB;AAAA,EACpH,MAAM,OAAO,UAAU,QAAQ;AAAA,EAC/B,IAAI,CAAC,QAAQ,OAAO,SAAS;AAAA,IAAU,MAAM,IAAI,MAAM,qCAAqC;AAAA,EAE5F,MAAM,OAAO;AAAA,EACb,IAAI,CAAC,MAAM,QAAQ,KAAK,QAAQ;AAAA,IAAG,MAAM,IAAI,MAAM,8CAA8C;AAAA,EAEjG,MAAM,aAA0B;AAAA,IAC9B,UAAU,KAAK;AAAA,EACjB;AAAA,EAEA,IAAI,KAAK;AAAA,IAAO,WAAW,QAAQ,mBAAmB,KAAK,OAAoB,GAAG;AAAA,EAElF,WAAW,WAAW,WAAW,SAAS,IAAI,CAAC,SAAS,UAAU;AAAA,IAChE,IAAI,CAAC,WAAW,OAAO,YAAY;AAAA,MAAU,MAAM,IAAI,MAAM,YAAY,2BAA2B;AAAA,IACpG,IAAI,EAAE,QAAQ;AAAA,MAAU,MAAM,IAAI,MAAM,YAAY,wBAAwB;AAAA,IAC5E,IAAI,EAAE,WAAW;AAAA,MAAU,MAAM,IAAI,MAAM,YAAY,2BAA2B;AAAA,IAElF,MAAM,MAAM,KAAK,QAAQ;AAAA,IACzB,IAAI,KAAK,OAAO,IAAI,EAAE;AAAA,IACtB,IAAI,QAAQ,OAAO,IAAI,KAAK;AAAA,IAE5B,IAAI,IAAI;AAAA,MAAO,IAAI,QAAQ,mBAAmB,IAAI,OAAoB,GAAG;AAAA,IACzE,IAAI,IAAI,QAAQ,qBAAqB,aAAa,IAAI,QAAQ;AAAA,MAAY,IAAI,OAAO,mBAAmB;AAAA,IAExG,OAAO;AAAA,GACR;AAAA,EAED,OAAO;AAAA;;AC3DT;AACA;;;ACUO,SAAS,iBAAiB,CAAC,SAA6B;AAAA,EAC7D,MAAM,UAAU,QAAQ,WAAW,QAAQ,IAAI,mBAAmB;AAAA,EAClE,MAAM,QAAQ,QAAQ,SAAS,QAAQ,IAAI,sBAAsB;AAAA,EAEjE,OAAO,SAAS,aAAa,cAA8F;AAAA,IACzH,MAAM,SACJ,iGACA;AAAA,IAEF,MAAM,OAAO,KAAK,UAChB;AAAA,MACE;AAAA,MACA,mBAAmB;AAAA,IACrB,GACA,MACA,CACF;AAAA,IAEA,MAAM,MAAM,MAAM,MAAM,GAAG,4BAA4B;AAAA,MACrD,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,eAAe,UAAU,QAAQ;AAAA,QACjC,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACnB;AAAA,QACA,aAAa;AAAA,QACb,UAAU;AAAA,UACR,EAAE,MAAM,UAAU,SAAS,OAAO;AAAA,UAClC,EAAE,MAAM,QAAQ,SAAS,KAAK;AAAA,QAChC;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,IAED,IAAI,CAAC,IAAI,IAAI;AAAA,MACX,MAAM,OAAO,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AAAA,MAC5C,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,QAAQ,sBAAsB,IAAI,UAAU,IAAI,aAAa,OAAO;AAAA,EAAK,SAAS;AAAA,MACpF;AAAA,IACF;AAAA,IAEA,MAAM,OAAQ,MAAM,IAAI,KAAK;AAAA,IAC7B,MAAM,UAAU,MAAM,UAAU,IAAI,SAAS;AAAA,IAC7C,IAAI,OAAO,YAAY,YAAY,QAAQ,KAAK,EAAE,WAAW,GAAG;AAAA,MAC9D,OAAO,EAAE,QAAQ,QAAQ,QAAQ,6BAA6B;AAAA,IAChE;AAAA,IAEA,IAAI;AAAA,IACJ,IAAI;AAAA,MACF,SAAS,KAAK,MAAM,OAAO;AAAA,MAC3B,MAAM;AAAA,MACN,OAAO,EAAE,QAAQ,QAAQ,QAAQ;AAAA,EAAqC,UAAU;AAAA;AAAA,IAGlF,IAAI,OAAO;AAAA,MAAM,OAAO,EAAE,QAAQ,OAAO;AAAA,IACzC,OAAO,EAAE,QAAQ,QAAQ,QAAQ,OAAO,UAAU,6BAA6B;AAAA;AAAA;;;AC7DnF,SAAS,SAAS,CAAC,OAAkD;AAAA,EACnE,OAAO,CAAC,CAAC,SAAS,OAAO,UAAU,YAAY,aAAc;AAAA;AAG/D,SAAS,OAAO,CAAC,OAA4C;AAAA,EAC3D,OAAO,CAAC,CAAC,SAAS,OAAO,UAAU,YAAY,WAAY;AAAA;AAG7D,eAAe,qBAAqB,CAAC,QAAoC,WAAoC;AAAA,EAC3G,MAAM,SAAS,OAAO,UAAU;AAAA,EAChC,MAAM,UAAU,IAAI;AAAA,EACpB,IAAI,SAAS;AAAA,EAEb,MAAM,WAAW,KAAK,IAAI,IAAI;AAAA,EAI9B,OAAO,MAAM;AAAA,IACX,MAAM,WAAW,WAAW,KAAK,IAAI;AAAA,IACrC,IAAI,YAAY;AAAA,MAAG,MAAM,IAAI,MAAM,8CAA8C,cAAc;AAAA,IAE/F,IAAI;AAAA,IACJ,MAAM,eAAe,IAAI,QAAe,CAAC,GAAG,WAAW;AAAA,MACrD,UAAU,WAAW,MAAM,OAAO,IAAI,MAAM,8CAA8C,cAAc,CAAC,GAAG,QAAQ;AAAA,KACrH;AAAA,IAED,IAAI;AAAA,IACJ,IAAI;AAAA,MACF,QAAQ,MAAM,QAAQ,KAAK,CAAC,OAAO,KAAK,GAAG,YAAY,CAAC;AAAA,cACxD;AAAA,MACA,IAAI,YAAY;AAAA,QAAW,aAAa,OAAO;AAAA;AAAA,IAGjD,QAAQ,OAAO,SAAS;AAAA,IACxB,IAAI;AAAA,MAAM;AAAA,IAEV,UAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAAA,IAEhD,OAAO,MAAM;AAAA,MACX,MAAM,MAAM,OAAO,QAAQ;AAAA,CAAI;AAAA,MAC/B,IAAI,QAAQ;AAAA,QAAI;AAAA,MAChB,MAAM,OAAO,OAAO,MAAM,GAAG,GAAG,EAAE,KAAK;AAAA,MACvC,SAAS,OAAO,MAAM,MAAM,CAAC;AAAA,MAC7B,IAAI,KAAK,SAAS;AAAA,QAAG,OAAO;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,OAAO,KAAK;AAAA,EACzB,IAAI,KAAK,SAAS;AAAA,IAAG,OAAO;AAAA,EAC5B,MAAM,IAAI,MAAM,qCAAqC;AAAA;AAGvD,eAAsB,mBAAmB,CAAC,MAAiB,SAA6D;AAAA,EACtH,MAAM,YAAY,KAAK,cAAc;AAAA,EAErC,MAAM,OAAO,IAAI,MAAM,KAAK,SAAS;AAAA,IACnC,KAAK,KAAK;AAAA,IACV,KAAK,KAAK,QAAQ,QAAS,KAAK,OAAO,CAAC,EAAG;AAAA,IAC3C,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV,CAAC;AAAA,EAED,MAAM,QAAQ,KAAK;AAAA,EACnB,IAAI,CAAC;AAAA,IAAO,MAAM,IAAI,MAAM,6BAA6B;AAAA,EAEzD,MAAM,MAAM,GAAG,KAAK,UAAU,OAAO;AAAA,CAAK;AAAA,EAC1C,MAAM,IAAI;AAAA,EAEV,IAAI,aAAa;AAAA,EACjB,MAAM,iBAAiB,YAAY;AAAA,IACjC,IAAI,CAAC,KAAK;AAAA,MAAQ;AAAA,IAClB,aAAa,MAAM,IAAI,SAAS,KAAK,MAAM,EAAE,KAAK,EAAE,MAAM,MAAM,EAAE;AAAA,KACjE;AAAA,EAEH,IAAI;AAAA,IACF,IAAI,CAAC,KAAK;AAAA,MAAQ,MAAM,IAAI,MAAM,8BAA8B;AAAA,IAChE,MAAM,OAAO,MAAM,sBAAsB,KAAK,QAAQ,SAAS;AAAA,IAE/D,IAAI;AAAA,IACJ,IAAI;AAAA,MACF,UAAU,KAAK,MAAM,IAAI;AAAA,MACzB,MAAM;AAAA,MACN,MAAM,IAAI,MACR;AAAA,IACE,SAAS;AAAA,KACR,aAAa;AAAA,EAAY,eAAe,GAC7C;AAAA;AAAA,IAGF,IAAI,QAAQ,OAAO;AAAA,MAAG,MAAM,IAAI,MAAM,QAAQ,MAAM,OAAO;AAAA,IAC3D,IAAI,CAAC,UAAU,OAAO,GAAG;AAAA,MACvB,MAAM,IAAI,MAAM,mFAAmF;AAAA,IACrG;AAAA,IAEA,OAAO;AAAA,YACP;AAAA,IACA,KAAK,KAAK;AAAA,IACV,MAAM,QAAQ,WAAW,CAAC,KAAK,QAAQ,aAAa,CAAC;AAAA;AAAA;;;ACxGlD,SAAS,gBAAgB,CAAC,UAAmB,QAA0B;AAAA,EAC5E,IAAI,aAAa;AAAA,IAAQ,OAAO;AAAA,EAEhC,IAAI,aAAa,QAAQ,WAAW;AAAA,IAAM,OAAO,aAAa;AAAA,EAE9D,MAAM,eAAe,OAAO;AAAA,EAC5B,MAAM,aAAa,OAAO;AAAA,EAC1B,IAAI,iBAAiB;AAAA,IAAY,OAAO;AAAA,EAExC,IAAI,MAAM,QAAQ,QAAQ,GAAG;AAAA,IAC3B,IAAI,CAAC,MAAM,QAAQ,MAAM;AAAA,MAAG,OAAO;AAAA,IACnC,IAAI,SAAS,WAAW,OAAO;AAAA,MAAQ,OAAO;AAAA,IAC9C,SAAS,IAAI,EAAG,IAAI,SAAS,QAAQ,KAAK;AAAA,MACxC,IAAI,CAAC,iBAAiB,SAAS,IAAI,OAAO,EAAE;AAAA,QAAG,OAAO;AAAA,IACxD;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,iBAAiB,UAAU;AAAA,IAC7B,IAAI,MAAM,QAAQ,MAAM;AAAA,MAAG,OAAO;AAAA,IAClC,MAAM,cAAc;AAAA,IACpB,MAAM,YAAY;AAAA,IAClB,YAAY,KAAK,kBAAkB,OAAO,QAAQ,WAAW,GAAG;AAAA,MAC9D,IAAI,EAAE,OAAO;AAAA,QAAY,OAAO;AAAA,MAChC,IAAI,CAAC,iBAAiB,eAAe,UAAU,IAAI;AAAA,QAAG,OAAO;AAAA,IAC/D;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EAEA,OAAO;AAAA;;;ACpBT,SAAS,oBAAoB,CAAC,OAAoC;AAAA,EAChE,IAAI;AAAA,IACF,OAAO,KAAK,MAAM,KAAK;AAAA,IACvB,MAAM;AAAA,IACN;AAAA;AAAA;AAIJ,SAAS,aAAa,CAAC,UAA+B,QAAsE;AAAA,EAC1H,IAAI,OAAO,SAAS,SAAS,SAAS;AAAA,IAAM,OAAO;AAAA,EACnD,IAAI,SAAS,cAAc;AAAA,IAAW,OAAO;AAAA,EAC7C,MAAM,aAAa,qBAAqB,OAAO,SAAS,SAAS;AAAA,EACjE,IAAI,eAAe;AAAA,IAAW,OAAO;AAAA,EACrC,OAAO,iBAAiB,SAAS,WAAW,UAAU;AAAA;AAGxD,SAAS,cAAc,CAAC,QAA4B,SAA8C;AAAA,EAChG,MAAM,gBAAgB,OAAO,cAAc,CAAC;AAAA,EAC5C,IAAI,cAAc,WAAW;AAAA,IAAG,OAAO,EAAE,QAAQ,OAAO;AAAA,EAExD,MAAM,cAAc,QAAQ,cAAc,CAAC;AAAA,EAC3C,MAAM,OAAO,OAAO,oBAAoB;AAAA,EAExC,IAAI,SAAS,YAAY;AAAA,IACvB,WAAW,YAAY,eAAe;AAAA,MACpC,MAAM,KAAK,YAAY,KAAK,CAAC,WAAW,cAAc,UAAU,MAAM,CAAC;AAAA,MACvE,IAAI,CAAC,IAAI;AAAA,QACP,OAAO;AAAA,UACL,QAAQ;AAAA,UACR,QAAQ,iCAAiC,SAAS;AAAA,QACpD;AAAA,MACF;AAAA,IACF;AAAA,IACA,OAAO,EAAE,QAAQ,OAAO;AAAA,EAC1B;AAAA,EAEA,IAAI,YAAY,WAAW,cAAc,QAAQ;AAAA,IAC/C,OAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ,oBAAoB,cAAc,4BAA4B,YAAY;AAAA,IACpF;AAAA,EACF;AAAA,EAEA,SAAS,IAAI,EAAG,IAAI,cAAc,QAAQ,KAAK;AAAA,IAC7C,MAAM,WAAW,cAAc;AAAA,IAC/B,MAAM,SAAS,YAAY;AAAA,IAC3B,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,cAAc,UAAU,MAAM,GAAG;AAAA,MAC5D,OAAO,EAAE,QAAQ,QAAQ,QAAQ,+BAA+B,KAAK;AAAA,IACvE;AAAA,EACF;AAAA,EAEA,OAAO,EAAE,QAAQ,OAAO;AAAA;AAO1B,SAAS,eAAe,CAAC,UAAiC,QAA8B;AAAA,EACtF,IAAI,SAAS,iBAAiB,aAAa,OAAO,iBAAiB,SAAS;AAAA,IAAc,OAAO;AAAA,EACjG,IAAI,SAAS,SAAS,aAAa,OAAO,SAAS,SAAS;AAAA,IAAM,OAAO;AAAA,EAEzE,IAAI,SAAS,YAAY,WAAW;AAAA,IAClC,MAAM,OAAO,SAAS,iBAAiB;AAAA,IACvC,IAAI,SAAS,WAAW,OAAO,YAAY,SAAS;AAAA,MAAS,OAAO;AAAA,IACpE,IAAI,SAAS,cAAc,CAAC,OAAO,QAAQ,SAAS,SAAS,OAAO;AAAA,MAAG,OAAO;AAAA,EAChF;AAAA,EAEA,IAAI,SAAS,iBAAiB,WAAW;AAAA,IACvC,MAAM,aAAa,qBAAqB,OAAO,OAAO;AAAA,IACtD,IAAI,eAAe;AAAA,MAAW,OAAO;AAAA,IACrC,IAAI,CAAC,iBAAiB,SAAS,cAAc,UAAU;AAAA,MAAG,OAAO;AAAA,EACnE;AAAA,EAEA,OAAO;AAAA;AAGT,SAAS,gBAAgB,CAAC,QAA4B,cAAgD;AAAA,EACpG,MAAM,kBAAkB,OAAO,gBAAgB,CAAC;AAAA,EAChD,IAAI,gBAAgB,WAAW;AAAA,IAAG,OAAO,EAAE,QAAQ,OAAO;AAAA,EAE1D,MAAM,OAAO,OAAO,sBAAsB;AAAA,EAE1C,IAAI,SAAS,YAAY;AAAA,IACvB,WAAW,YAAY,iBAAiB;AAAA,MACtC,IAAI,CAAC,SAAS,QAAQ,CAAC,SAAS,cAAc;AAAA,QAC5C,OAAO,EAAE,QAAQ,QAAQ,QAAQ,uEAAuE;AAAA,MAC1G;AAAA,MAEA,MAAM,KAAK,aAAa,KAAK,CAAC,WAAW,gBAAgB,UAAU,MAAM,CAAC;AAAA,MAC1E,IAAI,CAAC,IAAI;AAAA,QACP,OAAO;AAAA,UACL,QAAQ;AAAA,UACR,QAAQ,iCAAiC,SAAS,OAAO,KAAK,SAAS,SAAS;AAAA,QAClF;AAAA,MACF;AAAA,IACF;AAAA,IACA,OAAO,EAAE,QAAQ,OAAO;AAAA,EAC1B;AAAA,EAEA,IAAI,aAAa,WAAW,gBAAgB,QAAQ;AAAA,IAClD,OAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ,oBAAoB,gBAAgB,8BAA8B,aAAa;AAAA,IACzF;AAAA,EACF;AAAA,EAEA,SAAS,IAAI,EAAG,IAAI,gBAAgB,QAAQ,KAAK;AAAA,IAC/C,MAAM,WAAW,gBAAgB;AAAA,IACjC,MAAM,SAAS,aAAa;AAAA,IAC5B,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,gBAAgB,UAAU,MAAM,GAAG;AAAA,MAC9D,OAAO,EAAE,QAAQ,QAAQ,QAAQ,iCAAiC,KAAK;AAAA,IACzE;AAAA,EACF;AAAA,EAEA,OAAO,EAAE,QAAQ,OAAO;AAAA;AAG1B,SAAS,qBAAqB,CAAC,QAA4B,SAA8C;AAAA,EACvG,MAAM,WAAW,OAAO,WAAW;AAAA,EACnC,IAAI,aAAa;AAAA,IAAW,OAAO,EAAE,QAAQ,OAAO;AAAA,EAEpD,MAAM,OAAO,OAAO,WAAW,iBAAiB;AAAA,EAChD,IAAI,SAAS,SAAS;AAAA,IACpB,IAAI,QAAQ,YAAY;AAAA,MAAU,OAAO,EAAE,QAAQ,QAAQ,QAAQ,2CAA2C;AAAA,IAC9G,OAAO,EAAE,QAAQ,OAAO;AAAA,EAC1B;AAAA,EAEA,IAAI,CAAC,QAAQ,QAAQ,SAAS,QAAQ;AAAA,IAAG,OAAO,EAAE,QAAQ,QAAQ,QAAQ,mDAAmD;AAAA,EAC7H,OAAO,EAAE,QAAQ,OAAO;AAAA;AAG1B,eAAsB,oBAAoB,CACxC,QACA,MACA,OAC4B;AAAA,EAC5B,IAAI,CAAC;AAAA,IAAQ,OAAO,EAAE,QAAQ,OAAO;AAAA,EAErC,MAAM,UAAU,eAAe,QAAQ,KAAK,OAAO;AAAA,EACnD,IAAI,QAAQ,WAAW;AAAA,IAAQ,OAAO;AAAA,EAEtC,MAAM,iBAAiB,iBAAiB,QAAQ,KAAK,iBAAiB,CAAC,CAAC;AAAA,EACxE,IAAI,eAAe,WAAW;AAAA,IAAQ,OAAO;AAAA,EAE7C,MAAM,aAAa,sBAAsB,QAAQ,KAAK,OAAO;AAAA,EAC7D,IAAI,WAAW,WAAW;AAAA,IAAQ,OAAO;AAAA,EAEzC,IAAI,OAAO,WAAW,KAAK;AAAA,IACzB,IAAI,CAAC;AAAA,MAAO,OAAO,EAAE,QAAQ,QAAQ,QAAQ,4BAA4B;AAAA,IACzE,OAAO,MAAM,MAAM,EAAE,aAAa,OAAO,UAAU,KAAK,SAAS,KAAK,QAAQ,CAAC;AAAA,EACjF;AAAA,EAEA,OAAO,EAAE,QAAQ,OAAO;AAAA;;;AJpI1B,SAAS,aAAa,CAAC,MAAmB,SAA6B;AAAA,EACrE,MAAM,QAAQ,QAAQ,SAAS,KAAK;AAAA,EACpC,IAAI,CAAC;AAAA,IAAO,MAAM,IAAI,MAAM,YAAY,QAAQ,sEAAsE;AAAA,EACtH,KAAK,MAAM,QAAQ,kBAAkB;AAAA,IAAc,MAAM,IAAI,MAAM,2BAA2B,MAAM,MAAM;AAAA,EAC1G,OAAO;AAAA;AAGT,SAAS,SAAS,CAAC,MAAiB,OAAmC;AAAA,EACrE,IAAI,SAAS;AAAA,IAAO;AAAA,EAEpB,MAAM,SAAS,QAAQ,IAAI;AAAA,EAC3B,IAAI,CAAC,QAAQ;AAAA,IACX,IAAI,SAAS;AAAA,MAAM,MAAM,IAAI,MAAM,mDAAmD;AAAA,IACtF;AAAA,EACF;AAAA,EAEA,OAAO,kBAAkB,EAAE,QAAQ,MAAM,CAAC;AAAA;AAG5C,eAAsB,cAAc,CAAC,MAAc,UAAsB,CAAC,GAA+B;AAAA,EACvG,MAAM,WAAW,QAAQ,IAAI;AAAA,EAC7B,MAAM,WAAW,MAAM,SAAS,UAAU,MAAM;AAAA,EAChD,MAAM,OAAO,gBAAgB,QAAQ;AAAA,EAErC,MAAM,YAAY,QAAQ,aAAa;AAAA,EACvC,MAAM,QAAQ,UAAU,WAAW,QAAQ,UAAU;AAAA,EAErD,MAAM,UAA2B,CAAC;AAAA,EAElC,WAAW,WAAW,KAAK,UAAU;AAAA,IACnC,IAAI;AAAA,MACF,MAAM,QAAQ,cAAc,MAAM,OAAO;AAAA,MACzC,MAAM,WAAW,CAAC,GAAI,QAAQ,WAAW,CAAC,GAAI,EAAE,MAAM,QAAQ,SAAS,QAAQ,MAAM,CAAU;AAAA,MAE/F,MAAM,MAAM,MAAM,oBAAoB,OAAO;AAAA,QAC3C;AAAA,QACA,OAAO,CAAC;AAAA,QACR,aAAa;AAAA,MACf,CAAC;AAAA,MAED,MAAM,cAAc,MAAM,qBAAqB,QAAQ,QAAQ,KAAK,KAAK;AAAA,MACzE,QAAQ,KAAK;AAAA,QACX,IAAI,QAAQ;AAAA,QACZ,QAAQ,YAAY;AAAA,QACpB,QAAS,YAAwE;AAAA,QACjF,SAAS,IAAI;AAAA,QACb,eAAe,IAAI;AAAA,MACrB,CAAC;AAAA,MACD,OAAO,KAAK;AAAA,MACZ,MAAM,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MAC9D,QAAQ,KAAK,EAAE,IAAI,QAAQ,IAAI,QAAQ,QAAQ,OAAO,CAAC;AAAA;AAAA,EAE3D;AAAA,EAEA,OAAO,EAAE,MAAM,UAAU,QAAQ;AAAA;",
15
+ "debugId": "176F52ED9B21804364756E2164756E21",
16
16
  "names": []
17
17
  }
@@ -21,11 +21,22 @@ export type FixtureExpectation = {
21
21
  assistant?: AssistantExpectation;
22
22
  tool_calls_match?: "contains" | "exact";
23
23
  tool_calls?: ToolCallExpectation[];
24
+ tool_results_match?: "contains" | "exact";
25
+ tool_results?: ToolResultExpectation[];
24
26
  };
25
27
  export type AssistantExpectation = {
26
- llm: string;
28
+ content?: string;
29
+ content_match?: "contains" | "exact";
30
+ llm?: string;
27
31
  };
28
32
  export type ToolCallExpectation = {
29
33
  name: string;
30
34
  arguments?: Record<string, unknown>;
31
35
  };
36
+ export type ToolResultExpectation = {
37
+ name?: string;
38
+ tool_call_id?: string;
39
+ content?: string;
40
+ content_match?: "contains" | "exact";
41
+ content_json?: Record<string, unknown>;
42
+ };
@@ -1,4 +1,4 @@
1
- import type { AssistantMessage } from "../agent/types";
1
+ import type { AssistantMessage, ToolMessage } from "../agent/types";
2
2
  import type { FixtureExpectation } from "../fixture/types";
3
3
  export type ExpectationResult = {
4
4
  status: "pass";
@@ -13,4 +13,9 @@ export type Judge = (args: {
13
13
  expectation: string;
14
14
  message: AssistantMessage;
15
15
  }) => Promise<ExpectationResult>;
16
- export declare function evaluateExpectations(expect: FixtureExpectation | undefined, message: AssistantMessage, judge: Judge | undefined): Promise<ExpectationResult>;
16
+ type AgentTurn = {
17
+ message: AssistantMessage;
18
+ tool_messages?: ToolMessage[];
19
+ };
20
+ export declare function evaluateExpectations(expect: FixtureExpectation | undefined, turn: AgentTurn, judge: Judge | undefined): Promise<ExpectationResult>;
21
+ export {};
@@ -1,4 +1,4 @@
1
- import type { AssistantMessage } from "../agent/types";
1
+ import type { AssistantMessage, ToolMessage } from "../agent/types";
2
2
  export type JudgeMode = "off" | "auto" | "on";
3
3
  export type RunOptions = {
4
4
  judgeMode?: JudgeMode;
@@ -9,6 +9,7 @@ export type FixtureResult = {
9
9
  status: "pass" | "fail" | "skip";
10
10
  reason?: string;
11
11
  message?: AssistantMessage;
12
+ tool_messages?: ToolMessage[];
12
13
  };
13
14
  export type FixtureFileResult = {
14
15
  path: string;
@@ -1,3 +1,7 @@
1
- import type { AssistantMessage, ChatAgentRequest } from "../agent/types";
1
+ import type { AssistantMessage, ChatAgentRequest, ToolMessage } from "../agent/types";
2
2
  import type { AgentSpec } from "../fixture/types";
3
- export declare function callSubprocessAgent(spec: AgentSpec, request: ChatAgentRequest): Promise<AssistantMessage>;
3
+ export type SubprocessAgentResponse = {
4
+ message: AssistantMessage;
5
+ tool_messages?: ToolMessage[];
6
+ };
7
+ export declare function callSubprocessAgent(spec: AgentSpec, request: ChatAgentRequest): Promise<SubprocessAgentResponse>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "incantx",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "YAML-driven agent conversation testing (history + tool calls) for Bun-based agents.",
5
5
  "keywords": ["ai", "agent", "testing", "fixtures", "yaml", "bun"],
6
6
  "license": "UNLICENSED",