@vitest-evals/harness-pi-ai 0.9.0-beta.1 → 0.9.0-beta.3

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
@@ -11,12 +11,31 @@ npm install -D vitest-evals @vitest-evals/harness-pi-ai
11
11
  ## Usage
12
12
 
13
13
  ```ts
14
+ import { expect } from "vitest";
14
15
  import { piAiHarness } from "@vitest-evals/harness-pi-ai";
16
+ import { describeEval, toolCalls } from "vitest-evals";
15
17
 
16
18
  const harness = piAiHarness({
17
19
  createAgent: () => createRefundAgent(),
20
+ toolReplay: {
21
+ lookupInvoice: true,
22
+ },
18
23
  prompt: sharedJudgePrompt,
19
24
  });
25
+
26
+ describeEval("refund agent", { harness }, (it) => {
27
+ it("approves a refundable invoice", async ({ run }) => {
28
+ const result = await run("Refund invoice inv_123");
29
+
30
+ expect(result.output).toMatchObject({
31
+ status: "approved",
32
+ });
33
+ expect(toolCalls(result.session).map((call) => call.name)).toEqual([
34
+ "lookupInvoice",
35
+ "createRefund",
36
+ ]);
37
+ });
38
+ });
20
39
  ```
21
40
 
22
41
  `prompt` gives rubric or factuality judges the same provider/model setup
@@ -38,6 +57,26 @@ const harness = piAiHarness({
38
57
  If the agent already implements `run(input, runtime)`, you can omit `run` and
39
58
  the harness will call that method automatically.
40
59
 
60
+ `createAgent` receives the per-run input and harness context before the adapter
61
+ infers and instruments native agent tools. Use that for scenario-specific
62
+ instructions, tool closures, metadata, or seeded artifacts without leaving the
63
+ default replay path:
64
+
65
+ ```ts
66
+ const harness = piAiHarness({
67
+ createAgent: ({ input, context }) =>
68
+ createRefundAgent({
69
+ instructions: buildInstructions(input),
70
+ metadata: context.metadata,
71
+ setArtifact: context.setArtifact,
72
+ }),
73
+ toolReplay: {
74
+ lookupInvoice: true,
75
+ },
76
+ prompt: sharedJudgePrompt,
77
+ });
78
+ ```
79
+
41
80
  You should not need to configure output/session/usage basics for the normal Pi
42
81
  path. Pass your agent and let the adapter infer both the toolset and the
43
82
  normalized result from common Pi-style return values such as `decision` or
@@ -74,7 +113,7 @@ The adapter provides:
74
113
  - a required prompt seam for LLM-backed judges
75
114
  - normalized session capture from emitted events and wrapped tool calls
76
115
  - usage/output inference for common `pi-ai`-style result objects
77
- - opt-in tool replay/recording when the tool definition sets `replay: true`
116
+ - opt-in tool replay/recording from harness-level `toolReplay`
78
117
 
79
118
  See the workspace demo in `apps/demo-pi`.
80
119
 
@@ -95,17 +134,24 @@ export default defineConfig({
95
134
  });
96
135
  ```
97
136
 
98
- Then opt individual tools into recording/replay:
137
+ Then opt individual tools into recording/replay from the harness:
99
138
 
100
139
  ```ts
101
- const tools = {
102
- lookupInvoice: {
103
- replay: true,
104
- execute: async ({ invoiceId }) => fetchInvoice(invoiceId),
140
+ const harness = piAiHarness({
141
+ createAgent: () => createRefundAgent(),
142
+ toolReplay: {
143
+ lookupInvoice: true,
105
144
  },
106
- };
145
+ prompt: sharedJudgePrompt,
146
+ });
107
147
  ```
108
148
 
149
+ When an agent exposes both a native Pi tool and a runtime tool with the same
150
+ name, a native tool call records in its own cassette namespace. Runtime calls of
151
+ that same name are treated as implementation details while the native tool is
152
+ executing, so delegated runtime calls do not create duplicate trace entries or
153
+ overwrite the native recording.
154
+
109
155
  Supported modes:
110
156
 
111
157
  - `off`: never read or write recordings
package/dist/index.d.mts CHANGED
@@ -20,9 +20,10 @@ interface PiAiToolContext<TInput = string, TMetadata extends HarnessMetadata = H
20
20
  }
21
21
  type PiAiToolRecording<TArgs extends Record<string, JsonValue> = Record<string, JsonValue>, TResult extends JsonValue = JsonValue> = ToolRecording<TArgs, TResult>;
22
22
  type PiAiToolReplayConfig<TArgs extends Record<string, JsonValue> = Record<string, JsonValue>, TResult extends JsonValue = JsonValue, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = ToolReplayConfig<TArgs, TResult, PiAiToolContext<TInput, TMetadata>>;
23
+ type PiAiToolReplayPolicy<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = boolean | PiAiToolReplayConfig<Record<string, JsonValue>, JsonValue, TInput, TMetadata>;
24
+ type PiAiToolReplayPolicies<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = Record<string, PiAiToolReplayPolicy<TInput, TMetadata>>;
23
25
  interface PiAiToolDefinition<TArgs extends Record<string, JsonValue> = Record<string, JsonValue>, TResult extends JsonValue = JsonValue, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> {
24
26
  description?: string;
25
- replay?: boolean | PiAiToolReplayConfig<TArgs, TResult, TInput, TMetadata>;
26
27
  execute: (args: TArgs, context: PiAiToolContext<TInput, TMetadata>) => MaybePromise<TResult>;
27
28
  }
28
29
  type PiAiToolset<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = AnyPiAiToolset<TInput, TMetadata>;
@@ -44,9 +45,14 @@ interface PiAiHarnessRunArgs<TAgent, TInput, TMetadata extends HarnessMetadata,
44
45
  interface PiAiHarnessResultArgs<TAgent, TInput, TMetadata extends HarnessMetadata, TResult, TTools extends PiAiToolset<TInput, TMetadata>> extends PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools> {
45
46
  result: TResult;
46
47
  }
48
+ interface PiAiCreateAgentArgs<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> {
49
+ input: TInput;
50
+ context: HarnessContext<TMetadata>;
51
+ }
47
52
  interface PiAiHarnessBaseOptions<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<TInput, TMetadata>> {
48
53
  agent?: TAgent;
49
- createAgent?: () => MaybePromise<TAgent>;
54
+ createAgent?: (args: PiAiCreateAgentArgs<TInput, TMetadata>) => MaybePromise<TAgent>;
55
+ toolReplay?: PiAiToolReplayPolicies<TInput, TMetadata>;
50
56
  normalize?: PiAiHarnessNormalizeOptions<TAgent, TInput, TMetadata, TResult, TTools>;
51
57
  prompt: HarnessPrompt;
52
58
  name?: string;
@@ -71,4 +77,4 @@ interface PiAiHarnessNormalizeOptions<TAgent, TInput = string, TMetadata extends
71
77
  declare function piAiHarness<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<TInput, TMetadata>>(options: PiAiHarnessWithToolsOptions<TAgent, TInput, TMetadata, TResult, TTools>): Harness<TInput, TMetadata>;
72
78
  declare function piAiHarness<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown>(options: PiAiHarnessInferredToolsOptions<TAgent, TInput, TMetadata, TResult>): Harness<TInput, TMetadata>;
73
79
 
74
- export { type PiAiEventSink, type PiAiHarnessInferredToolsOptions, type PiAiHarnessNormalizeOptions, type PiAiHarnessOptions, type PiAiHarnessResultArgs, type PiAiHarnessRunArgs, type PiAiHarnessWithToolsOptions, type PiAiReplayMode, type PiAiRuntime, type PiAiToolContext, type PiAiToolDefinition, type PiAiToolRecording, type PiAiToolReplayConfig, type PiAiToolset, piAiHarness };
80
+ export { type PiAiCreateAgentArgs, type PiAiEventSink, type PiAiHarnessInferredToolsOptions, type PiAiHarnessNormalizeOptions, type PiAiHarnessOptions, type PiAiHarnessResultArgs, type PiAiHarnessRunArgs, type PiAiHarnessWithToolsOptions, type PiAiReplayMode, type PiAiRuntime, type PiAiToolContext, type PiAiToolDefinition, type PiAiToolRecording, type PiAiToolReplayConfig, type PiAiToolReplayPolicies, type PiAiToolReplayPolicy, type PiAiToolset, piAiHarness };
package/dist/index.d.ts CHANGED
@@ -20,9 +20,10 @@ interface PiAiToolContext<TInput = string, TMetadata extends HarnessMetadata = H
20
20
  }
21
21
  type PiAiToolRecording<TArgs extends Record<string, JsonValue> = Record<string, JsonValue>, TResult extends JsonValue = JsonValue> = ToolRecording<TArgs, TResult>;
22
22
  type PiAiToolReplayConfig<TArgs extends Record<string, JsonValue> = Record<string, JsonValue>, TResult extends JsonValue = JsonValue, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = ToolReplayConfig<TArgs, TResult, PiAiToolContext<TInput, TMetadata>>;
23
+ type PiAiToolReplayPolicy<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = boolean | PiAiToolReplayConfig<Record<string, JsonValue>, JsonValue, TInput, TMetadata>;
24
+ type PiAiToolReplayPolicies<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = Record<string, PiAiToolReplayPolicy<TInput, TMetadata>>;
23
25
  interface PiAiToolDefinition<TArgs extends Record<string, JsonValue> = Record<string, JsonValue>, TResult extends JsonValue = JsonValue, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> {
24
26
  description?: string;
25
- replay?: boolean | PiAiToolReplayConfig<TArgs, TResult, TInput, TMetadata>;
26
27
  execute: (args: TArgs, context: PiAiToolContext<TInput, TMetadata>) => MaybePromise<TResult>;
27
28
  }
28
29
  type PiAiToolset<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> = AnyPiAiToolset<TInput, TMetadata>;
@@ -44,9 +45,14 @@ interface PiAiHarnessRunArgs<TAgent, TInput, TMetadata extends HarnessMetadata,
44
45
  interface PiAiHarnessResultArgs<TAgent, TInput, TMetadata extends HarnessMetadata, TResult, TTools extends PiAiToolset<TInput, TMetadata>> extends PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools> {
45
46
  result: TResult;
46
47
  }
48
+ interface PiAiCreateAgentArgs<TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata> {
49
+ input: TInput;
50
+ context: HarnessContext<TMetadata>;
51
+ }
47
52
  interface PiAiHarnessBaseOptions<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<TInput, TMetadata>> {
48
53
  agent?: TAgent;
49
- createAgent?: () => MaybePromise<TAgent>;
54
+ createAgent?: (args: PiAiCreateAgentArgs<TInput, TMetadata>) => MaybePromise<TAgent>;
55
+ toolReplay?: PiAiToolReplayPolicies<TInput, TMetadata>;
50
56
  normalize?: PiAiHarnessNormalizeOptions<TAgent, TInput, TMetadata, TResult, TTools>;
51
57
  prompt: HarnessPrompt;
52
58
  name?: string;
@@ -71,4 +77,4 @@ interface PiAiHarnessNormalizeOptions<TAgent, TInput = string, TMetadata extends
71
77
  declare function piAiHarness<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown, TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<TInput, TMetadata>>(options: PiAiHarnessWithToolsOptions<TAgent, TInput, TMetadata, TResult, TTools>): Harness<TInput, TMetadata>;
72
78
  declare function piAiHarness<TAgent, TInput = string, TMetadata extends HarnessMetadata = HarnessMetadata, TResult = unknown>(options: PiAiHarnessInferredToolsOptions<TAgent, TInput, TMetadata, TResult>): Harness<TInput, TMetadata>;
73
79
 
74
- export { type PiAiEventSink, type PiAiHarnessInferredToolsOptions, type PiAiHarnessNormalizeOptions, type PiAiHarnessOptions, type PiAiHarnessResultArgs, type PiAiHarnessRunArgs, type PiAiHarnessWithToolsOptions, type PiAiReplayMode, type PiAiRuntime, type PiAiToolContext, type PiAiToolDefinition, type PiAiToolRecording, type PiAiToolReplayConfig, type PiAiToolset, piAiHarness };
80
+ export { type PiAiCreateAgentArgs, type PiAiEventSink, type PiAiHarnessInferredToolsOptions, type PiAiHarnessNormalizeOptions, type PiAiHarnessOptions, type PiAiHarnessResultArgs, type PiAiHarnessRunArgs, type PiAiHarnessWithToolsOptions, type PiAiReplayMode, type PiAiRuntime, type PiAiToolContext, type PiAiToolDefinition, type PiAiToolRecording, type PiAiToolReplayConfig, type PiAiToolReplayPolicies, type PiAiToolReplayPolicy, type PiAiToolset, piAiHarness };
package/dist/index.js CHANGED
@@ -31,7 +31,10 @@ function piAiHarness(options) {
31
31
  name: options.name ?? "pi-ai",
32
32
  prompt: options.prompt,
33
33
  run: async (input, context) => {
34
- const agent = await resolveAgent(options);
34
+ const agent = await resolveAgent(options, {
35
+ input,
36
+ context
37
+ });
35
38
  const messages = [
36
39
  {
37
40
  role: "user",
@@ -65,10 +68,13 @@ function piAiHarness(options) {
65
68
  };
66
69
  }
67
70
  async function executePiHarnessRun(options, agent, input, context, messages, runtimeTools, nativeToolsets) {
71
+ const executionState = createPiToolExecutionState();
68
72
  const runtime = createRuntime({
69
73
  input,
70
74
  context,
71
75
  tools: runtimeTools,
76
+ toolReplay: options.toolReplay,
77
+ executionState,
72
78
  messages
73
79
  });
74
80
  try {
@@ -79,7 +85,9 @@ async function executePiHarnessRun(options, agent, input, context, messages, run
79
85
  input,
80
86
  context,
81
87
  messages,
82
- toolCalls: runtime.toolCalls
88
+ toolCalls: runtime.toolCalls,
89
+ toolReplay: options.toolReplay,
90
+ executionState
83
91
  },
84
92
  () => runAgent(options, {
85
93
  agent,
@@ -125,12 +133,12 @@ async function executePiHarnessRun(options, agent, input, context, messages, run
125
133
  throw (0, import_harness.attachHarnessRunToError)(error, run);
126
134
  }
127
135
  }
128
- async function resolveAgent(options) {
136
+ async function resolveAgent(options, args) {
129
137
  if (options.agent !== void 0) {
130
138
  return options.agent;
131
139
  }
132
140
  if (options.createAgent) {
133
- return options.createAgent();
141
+ return options.createAgent(args);
134
142
  }
135
143
  throw new Error(
136
144
  "piAiHarness requires either an agent instance or a createAgent() function."
@@ -257,12 +265,16 @@ async function withInstrumentedAgentTools(agent, toolsets, args, callback) {
257
265
  signal: args.context.signal,
258
266
  setArtifact: args.context.setArtifact
259
267
  };
268
+ const leaveNativeTool = enterNativeToolExecution(
269
+ args.executionState,
270
+ tool.name
271
+ );
260
272
  try {
261
273
  const execution = await executeNativeToolWithReplay({
262
274
  toolName: tool.name,
263
275
  toolCallId,
264
276
  execute: originalExecute,
265
- replay: tool.replay,
277
+ replay: args.toolReplay?.[tool.name],
266
278
  args: rawArgs,
267
279
  context: toolContext
268
280
  });
@@ -306,6 +318,8 @@ async function withInstrumentedAgentTools(agent, toolsets, args, callback) {
306
318
  toolCalls: [call]
307
319
  });
308
320
  throw error;
321
+ } finally {
322
+ leaveNativeTool();
309
323
  }
310
324
  };
311
325
  instrumentedExecute[ORIGINAL_NATIVE_EXECUTE] = originalExecute;
@@ -382,6 +396,28 @@ function getNativeToolExecuteOrigin(execute) {
382
396
  const nativeExecute = execute;
383
397
  return nativeExecute[ORIGINAL_NATIVE_EXECUTE] ?? nativeExecute;
384
398
  }
399
+ function createPiToolExecutionState() {
400
+ return {
401
+ activeNativeToolNames: /* @__PURE__ */ new Map()
402
+ };
403
+ }
404
+ function enterNativeToolExecution(state, toolName) {
405
+ state.activeNativeToolNames.set(
406
+ toolName,
407
+ (state.activeNativeToolNames.get(toolName) ?? 0) + 1
408
+ );
409
+ return () => {
410
+ const nextCount = (state.activeNativeToolNames.get(toolName) ?? 1) - 1;
411
+ if (nextCount <= 0) {
412
+ state.activeNativeToolNames.delete(toolName);
413
+ return;
414
+ }
415
+ state.activeNativeToolNames.set(toolName, nextCount);
416
+ };
417
+ }
418
+ function hasActiveNativeToolExecution(state, toolName) {
419
+ return (state.activeNativeToolNames.get(toolName) ?? 0) > 0;
420
+ }
385
421
  async function executeNativeToolWithReplay({
386
422
  toolName,
387
423
  toolCallId,
@@ -393,7 +429,7 @@ async function executeNativeToolWithReplay({
393
429
  let didExecute = false;
394
430
  let liveResult;
395
431
  const execution = await (0, import_replay.executeWithReplay)({
396
- toolName,
432
+ toolName: createNativeReplayToolName(toolName),
397
433
  args,
398
434
  context,
399
435
  execute: async (toolArgs) => {
@@ -415,10 +451,15 @@ async function executeNativeToolWithReplay({
415
451
  replay: execution.replay
416
452
  };
417
453
  }
454
+ function createNativeReplayToolName(toolName) {
455
+ return `${toolName}.native`;
456
+ }
418
457
  function createRuntime({
419
458
  input,
420
459
  context,
421
460
  tools,
461
+ toolReplay,
462
+ executionState,
422
463
  messages
423
464
  }) {
424
465
  const toolCalls = [];
@@ -463,6 +504,10 @@ function createRuntime({
463
504
  toolName,
464
505
  async (args) => {
465
506
  const startedAt = /* @__PURE__ */ new Date();
507
+ const isNativeImplementationCall = hasActiveNativeToolExecution(
508
+ executionState,
509
+ toolName
510
+ );
466
511
  const toolContext = {
467
512
  input,
468
513
  metadata: context.metadata,
@@ -473,10 +518,14 @@ function createRuntime({
473
518
  const execution = await executeToolWithReplay({
474
519
  toolName,
475
520
  tool,
521
+ replay: isNativeImplementationCall ? void 0 : toolReplay?.[toolName],
476
522
  args,
477
523
  context: toolContext
478
524
  });
479
525
  const finishedAt = /* @__PURE__ */ new Date();
526
+ if (isNativeImplementationCall) {
527
+ return execution.result;
528
+ }
480
529
  const call = {
481
530
  name: toolName,
482
531
  arguments: args,
@@ -501,6 +550,9 @@ function createRuntime({
501
550
  return execution.result;
502
551
  } catch (error) {
503
552
  const finishedAt = /* @__PURE__ */ new Date();
553
+ if (isNativeImplementationCall) {
554
+ throw error;
555
+ }
504
556
  const call = {
505
557
  name: toolName,
506
558
  arguments: args,
@@ -653,6 +705,7 @@ function resolveErrors(result) {
653
705
  async function executeToolWithReplay({
654
706
  toolName,
655
707
  tool,
708
+ replay,
656
709
  args,
657
710
  context
658
711
  }) {
@@ -660,8 +713,8 @@ async function executeToolWithReplay({
660
713
  toolName,
661
714
  args,
662
715
  context,
663
- execute: tool.execute,
664
- replay: tool.replay
716
+ execute: (toolArgs, toolContext) => tool.execute(toolArgs, toolContext),
717
+ replay
665
718
  });
666
719
  }
667
720
  // Annotate the CommonJS export names for ESM import in node:
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type {\n Harness,\n HarnessContext,\n HarnessMetadata,\n HarnessPrompt,\n HarnessRun,\n JsonValue,\n NormalizedMessage,\n NormalizedSession,\n TimingSummary,\n ToolCallRecord,\n UsageSummary,\n} from \"vitest-evals/harness\";\nimport {\n attachHarnessRunToError,\n isHarnessRun,\n isNormalizedSession,\n normalizeContent,\n resolveHarnessRunErrors,\n serializeError,\n toJsonValue,\n} from \"vitest-evals/harness\";\nimport {\n executeWithReplay,\n getReplayMetadataFromError,\n normalizeReplayMetadata,\n} from \"vitest-evals/replay\";\nimport type {\n ReplayMode,\n ToolRecording,\n ToolReplayConfig,\n} from \"vitest-evals/replay\";\n\ntype MaybePromise<T> = T | Promise<T>;\ntype AnyPiAiToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<string, PiAiToolDefinition<any, any, TInput, TMetadata>>;\ntype InferredPiAiToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<\n string,\n PiAiToolDefinition<Record<string, JsonValue>, JsonValue, TInput, TMetadata>\n>;\n\ntype PiAgentToolLike<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = {\n name: string;\n replay?:\n | boolean\n | PiAiToolReplayConfig<\n Record<string, JsonValue>,\n JsonValue,\n TInput,\n TMetadata\n >;\n execute: (toolCallId: string, args: Record<string, JsonValue>) => unknown;\n};\n\nconst ORIGINAL_NATIVE_EXECUTE = Symbol(\"vitest-evals.originalNativeExecute\");\n\ntype NativeToolExecute<\n TInput,\n TMetadata extends HarnessMetadata,\n> = PiAgentToolLike<TInput, TMetadata>[\"execute\"] & {\n [ORIGINAL_NATIVE_EXECUTE]?: PiAgentToolLike<TInput, TMetadata>[\"execute\"];\n};\n\nexport type PiAiReplayMode = ReplayMode;\n\nexport interface PiAiEventSink {\n message: (message: NormalizedMessage) => void;\n system: (content: JsonValue, metadata?: Record<string, JsonValue>) => void;\n user: (content: JsonValue, metadata?: Record<string, JsonValue>) => void;\n assistant: (content: JsonValue, metadata?: Record<string, JsonValue>) => void;\n tool: (\n name: string,\n content: JsonValue,\n metadata?: Record<string, JsonValue>,\n ) => void;\n}\n\nexport interface PiAiToolContext<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> {\n input: TInput;\n metadata: HarnessContext<TMetadata>[\"metadata\"];\n signal?: AbortSignal;\n setArtifact: HarnessContext<TMetadata>[\"setArtifact\"];\n}\n\nexport type PiAiToolRecording<\n TArgs extends Record<string, JsonValue> = Record<string, JsonValue>,\n TResult extends JsonValue = JsonValue,\n> = ToolRecording<TArgs, TResult>;\n\nexport type PiAiToolReplayConfig<\n TArgs extends Record<string, JsonValue> = Record<string, JsonValue>,\n TResult extends JsonValue = JsonValue,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = ToolReplayConfig<TArgs, TResult, PiAiToolContext<TInput, TMetadata>>;\n\nexport interface PiAiToolDefinition<\n TArgs extends Record<string, JsonValue> = Record<string, JsonValue>,\n TResult extends JsonValue = JsonValue,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> {\n description?: string;\n replay?: boolean | PiAiToolReplayConfig<TArgs, TResult, TInput, TMetadata>;\n execute: (\n args: TArgs,\n context: PiAiToolContext<TInput, TMetadata>,\n ) => MaybePromise<TResult>;\n}\n\nexport type PiAiToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = AnyPiAiToolset<TInput, TMetadata>;\n\ntype ToolArgs<TTool> = TTool extends PiAiToolDefinition<\n infer TArgs,\n infer _TResult,\n infer _TInput,\n infer _TMetadata\n>\n ? TArgs\n : never;\n\ntype ToolResult<TTool> = TTool extends PiAiToolDefinition<\n infer _TArgs,\n infer TResult,\n infer _TInput,\n infer _TMetadata\n>\n ? TResult\n : never;\n\nexport type PiAiRuntime<\n TTools extends PiAiToolset<TInput, TMetadata>,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = {\n tools: {\n [K in keyof TTools]: (\n args: ToolArgs<TTools[K]>,\n ) => Promise<ToolResult<TTools[K]>>;\n };\n events: PiAiEventSink;\n signal?: AbortSignal;\n};\n\nexport interface PiAiHarnessRunArgs<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TTools extends PiAiToolset<TInput, TMetadata>,\n> {\n agent: TAgent;\n input: TInput;\n context: HarnessContext<TMetadata>;\n runtime: PiAiRuntime<TTools, TInput, TMetadata>;\n}\n\nexport interface PiAiHarnessResultArgs<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n> extends PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools> {\n result: TResult;\n}\n\ninterface PiAiHarnessBaseOptions<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n> {\n agent?: TAgent;\n createAgent?: () => MaybePromise<TAgent>;\n normalize?: PiAiHarnessNormalizeOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools\n >;\n prompt: HarnessPrompt;\n name?: string;\n}\n\nexport interface PiAiHarnessWithToolsOptions<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n> extends PiAiHarnessBaseOptions<TAgent, TInput, TMetadata, TResult, TTools> {\n tools: TTools;\n run?: (\n args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n ) => MaybePromise<TResult | HarnessRun>;\n}\n\nexport interface PiAiHarnessInferredToolsOptions<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n> extends PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n InferredPiAiToolset<TInput, TMetadata>\n > {\n tools?: undefined;\n run?: (\n args: PiAiHarnessRunArgs<\n TAgent,\n TInput,\n TMetadata,\n InferredPiAiToolset<TInput, TMetadata>\n >,\n ) => MaybePromise<TResult | HarnessRun>;\n}\n\nexport type PiAiHarnessOptions<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n> =\n | PiAiHarnessWithToolsOptions<TAgent, TInput, TMetadata, TResult, TTools>\n | PiAiHarnessInferredToolsOptions<TAgent, TInput, TMetadata, TResult>;\n\ntype PiAiHarnessRunOptions<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n> = PiAiHarnessBaseOptions<TAgent, TInput, TMetadata, TResult, TTools> & {\n run?: (\n args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n ) => MaybePromise<TResult | HarnessRun>;\n};\n\ntype PiAiRunnableAgent<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n> = {\n run: (\n input: TInput,\n runtime: PiAiRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<TResult | HarnessRun>;\n};\n\nexport interface PiAiHarnessNormalizeOptions<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n> {\n session?: (\n args: PiAiHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n ) => MaybePromise<NormalizedSession>;\n output?: (\n args: PiAiHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n ) => MaybePromise<JsonValue | undefined>;\n usage?: (\n args: PiAiHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n ) => MaybePromise<UsageSummary>;\n timings?: (\n args: PiAiHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n ) => MaybePromise<TimingSummary | undefined>;\n errors?: (\n args: PiAiHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n ) => MaybePromise<Array<Record<string, JsonValue>>>;\n}\n\ntype InferredToolSurfaces<TInput, TMetadata extends HarnessMetadata> = {\n runtimeTools?: InferredPiAiToolset<TInput, TMetadata>;\n nativeToolsets?: Array<PiAgentToolLike<TInput, TMetadata>[]>;\n};\n\n/** Adapts a Pi agent runtime into a normalized vitest-evals harness. */\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n>(\n options: PiAiHarnessWithToolsOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools\n >,\n): Harness<TInput, TMetadata>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n>(\n options: PiAiHarnessInferredToolsOptions<TAgent, TInput, TMetadata, TResult>,\n): Harness<TInput, TMetadata>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n>(\n options: PiAiHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools>,\n): Harness<TInput, TMetadata> {\n return {\n name: options.name ?? \"pi-ai\",\n prompt: options.prompt,\n run: async (input, context) => {\n const agent = await resolveAgent(options);\n const messages: NormalizedMessage[] = [\n {\n role: \"user\",\n content: normalizeContent(input),\n },\n ];\n const inferredTools = resolveInferredToolSurfaces<TInput, TMetadata>(\n agent,\n );\n\n if (hasExplicitToolset(options)) {\n return executePiHarnessRun(\n options,\n agent,\n input,\n context,\n messages,\n options.tools,\n inferredTools.nativeToolsets,\n );\n }\n\n return executePiHarnessRun(\n options,\n agent,\n input,\n context,\n messages,\n inferredTools.runtimeTools,\n inferredTools.nativeToolsets,\n );\n },\n };\n}\n\nasync function executePiHarnessRun<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n>(\n options: PiAiHarnessRunOptions<TAgent, TInput, TMetadata, TResult, TTools>,\n agent: TAgent,\n input: TInput,\n context: HarnessContext<TMetadata>,\n messages: NormalizedMessage[],\n runtimeTools: TTools | undefined,\n nativeToolsets?: Array<PiAgentToolLike<TInput, TMetadata>[]>,\n): Promise<HarnessRun> {\n const runtime = createRuntime({\n input,\n context,\n tools: runtimeTools,\n messages,\n });\n\n try {\n const result = await withInstrumentedAgentTools(\n agent,\n nativeToolsets,\n {\n input,\n context,\n messages,\n toolCalls: runtime.toolCalls,\n },\n () =>\n runAgent(options, {\n agent,\n input,\n context,\n runtime,\n }),\n );\n\n if (isHarnessRun(result) && !hasResultOverrides(options)) {\n if (Object.keys(context.artifacts).length > 0 && !result.artifacts) {\n result.artifacts = context.artifacts;\n }\n return result;\n }\n\n const normalizeResult = result as TResult;\n const resultArgs = {\n agent,\n input,\n context,\n runtime,\n result: normalizeResult,\n } satisfies PiAiHarnessResultArgs<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools\n >;\n\n const output = options.normalize?.output\n ? await options.normalize.output(resultArgs)\n : resolveOutput(normalizeResult);\n const usage = options.normalize?.usage\n ? await options.normalize.usage(resultArgs)\n : resolveUsage(normalizeResult, runtime.toolCalls.length);\n const session = options.normalize?.session\n ? await options.normalize.session(resultArgs)\n : resolveSession(normalizeResult, messages, output, usage);\n\n return {\n session,\n output,\n usage,\n timings: options.normalize?.timings\n ? await options.normalize.timings(resultArgs)\n : undefined,\n artifacts:\n Object.keys(context.artifacts).length > 0\n ? context.artifacts\n : undefined,\n errors: options.normalize?.errors\n ? await options.normalize.errors(resultArgs)\n : resolveErrors(normalizeResult),\n };\n } catch (error) {\n const usage = resolveUsage(undefined, runtime.toolCalls.length);\n const run = {\n session: resolveSession(undefined, messages, undefined, usage),\n output: undefined,\n usage,\n artifacts:\n Object.keys(context.artifacts).length > 0\n ? context.artifacts\n : undefined,\n errors: [serializeError(error)],\n } satisfies HarnessRun;\n\n throw attachHarnessRunToError(error, run);\n }\n}\n\nasync function resolveAgent<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n>(options: PiAiHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools>) {\n if (options.agent !== undefined) {\n return options.agent;\n }\n\n if (options.createAgent) {\n return options.createAgent();\n }\n\n throw new Error(\n \"piAiHarness requires either an agent instance or a createAgent() function.\",\n );\n}\n\nfunction hasResultOverrides<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n>(options: PiAiHarnessRunOptions<TAgent, TInput, TMetadata, TResult, TTools>) {\n return Boolean(\n options.normalize?.output ??\n options.normalize?.session ??\n options.normalize?.usage ??\n options.normalize?.timings ??\n options.normalize?.errors,\n );\n}\n\nfunction resolveInferredToolSurfaces<TInput, TMetadata extends HarnessMetadata>(\n agent: unknown,\n): InferredToolSurfaces<TInput, TMetadata> {\n let runtimeTools: InferredPiAiToolset<TInput, TMetadata> | undefined;\n const nativeToolsets: Array<PiAgentToolLike<TInput, TMetadata>[]> = [];\n const seenToolsets = new Set<PiAgentToolLike<TInput, TMetadata>[]>();\n\n for (const candidate of getAgentToolCandidates(agent)) {\n const nextRuntimeTools = getRuntimeToolset<TInput, TMetadata>(candidate);\n if (runtimeTools === undefined && nextRuntimeTools !== undefined) {\n runtimeTools = nextRuntimeTools;\n }\n\n const nativeTools = getNativeToolArray(candidate);\n if (nativeTools && !seenToolsets.has(nativeTools)) {\n seenToolsets.add(nativeTools);\n nativeToolsets.push(nativeTools);\n }\n }\n\n return {\n ...(runtimeTools ? { runtimeTools } : {}),\n ...(nativeToolsets.length > 0 ? { nativeToolsets } : {}),\n };\n}\n\nfunction getAgentToolCandidates(agent: unknown): object[] {\n const roots = getAgentRoots(agent);\n const candidates: object[] = [];\n const seen = new Set<object>();\n\n for (const root of roots) {\n addUniqueObject(candidates, seen, root);\n addUniqueObject(candidates, seen, getObjectProperty(root, \"state\"));\n addUniqueObject(candidates, seen, getObjectProperty(root, \"initialState\"));\n }\n\n return candidates;\n}\n\nfunction getAgentRoots(agent: unknown): object[] {\n return [asObject(agent)]\n .concat(asObject(getObjectProperty(agent, \"agent\")))\n .filter((value): value is object => value !== undefined);\n}\n\nfunction addUniqueObject(\n candidates: object[],\n seen: Set<object>,\n value: unknown,\n) {\n if (!value || typeof value !== \"object\" || seen.has(value)) {\n return;\n }\n\n seen.add(value);\n candidates.push(value);\n}\n\nfunction asObject(value: unknown): object | undefined {\n return value && typeof value === \"object\" ? value : undefined;\n}\n\nfunction getObjectProperty(value: unknown, key: string): unknown {\n return value && typeof value === \"object\"\n ? (value as Record<string, unknown>)[key]\n : undefined;\n}\n\nfunction getRuntimeToolset<TInput, TMetadata extends HarnessMetadata>(\n value: object,\n): InferredPiAiToolset<TInput, TMetadata> | undefined {\n const candidate =\n getObjectProperty(value, \"tools\") ?? getObjectProperty(value, \"toolset\");\n\n return isPiAiToolset(candidate)\n ? (candidate as InferredPiAiToolset<TInput, TMetadata>)\n : undefined;\n}\n\nfunction getNativeToolArray<TInput, TMetadata extends HarnessMetadata>(\n value: object,\n): PiAgentToolLike<TInput, TMetadata>[] | undefined {\n const candidate = getObjectProperty(value, \"tools\");\n if (isAgentToolArray(candidate)) {\n return candidate as PiAgentToolLike<TInput, TMetadata>[];\n }\n\n return undefined;\n}\n\nasync function runAgent<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n>(\n options: PiAiHarnessRunOptions<TAgent, TInput, TMetadata, TResult, TTools>,\n args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n): Promise<TResult | HarnessRun> {\n if (options.run) {\n return options.run(args);\n }\n\n if (hasPiAiRunMethod<TInput, TMetadata, TResult, TTools>(args.agent)) {\n return args.agent.run(args.input, args.runtime);\n }\n\n throw new Error(\n \"piAiHarness requires a run() function unless the provided agent exposes run(input, runtime).\",\n );\n}\n\nfunction hasExplicitToolset<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n>(\n options: PiAiHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools>,\n): options is PiAiHarnessWithToolsOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools\n> {\n return options.tools !== undefined;\n}\n\nfunction hasPiAiRunMethod<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n>(\n agent: unknown,\n): agent is PiAiRunnableAgent<TInput, TMetadata, TResult, TTools> {\n if (!agent || typeof agent !== \"object\") {\n return false;\n }\n\n return (\n \"run\" in agent && typeof (agent as { run?: unknown }).run === \"function\"\n );\n}\n\nfunction isPiAiToolset(value: unknown): value is PiAiToolset {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return false;\n }\n\n const tools = Object.values(value);\n return (\n tools.length > 0 &&\n tools.every((tool) =>\n Boolean(\n tool &&\n typeof tool === \"object\" &&\n \"execute\" in tool &&\n typeof (tool as { execute?: unknown }).execute === \"function\",\n ),\n )\n );\n}\n\nfunction isAgentToolArray(value: unknown): value is PiAgentToolLike[] {\n return (\n Array.isArray(value) &&\n value.every((tool) =>\n Boolean(\n tool &&\n typeof tool === \"object\" &&\n \"name\" in tool &&\n typeof (tool as { name?: unknown }).name === \"string\" &&\n \"execute\" in tool &&\n typeof (tool as { execute?: unknown }).execute === \"function\",\n ),\n )\n );\n}\n\nasync function withInstrumentedAgentTools<\n TResult,\n TInput,\n TMetadata extends HarnessMetadata,\n>(\n agent: unknown,\n toolsets: Array<PiAgentToolLike<TInput, TMetadata>[]> | undefined,\n args: {\n input: TInput;\n context: HarnessContext<TMetadata>;\n messages: NormalizedMessage[];\n toolCalls: ToolCallRecord[];\n },\n callback: () => Promise<TResult>,\n) {\n if (!toolsets || toolsets.length === 0) {\n return callback();\n }\n\n const originalExecutions = new Map<\n PiAgentToolLike<TInput, TMetadata>,\n PiAgentToolLike<TInput, TMetadata>[\"execute\"]\n >();\n const originalResets = new Map<ResettableAgent, ResettableAgent[\"reset\"]>();\n\n const patchTool = (tool: PiAgentToolLike<TInput, TMetadata>) => {\n if (originalExecutions.has(tool)) {\n return;\n }\n\n const originalExecute = getNativeToolExecuteOrigin(tool.execute);\n originalExecutions.set(tool, originalExecute);\n const instrumentedExecute: NativeToolExecute<TInput, TMetadata> = async (\n toolCallId: string,\n rawArgs: Record<string, JsonValue>,\n ) => {\n const startedAt = new Date();\n const toolContext = {\n input: args.input,\n metadata: args.context.metadata,\n signal: args.context.signal,\n setArtifact: args.context.setArtifact,\n } satisfies PiAiToolContext<TInput, TMetadata>;\n\n try {\n const execution = await executeNativeToolWithReplay({\n toolName: tool.name,\n toolCallId,\n execute: originalExecute,\n replay: tool.replay,\n args: rawArgs,\n context: toolContext,\n });\n const finishedAt = new Date();\n const call = {\n name: tool.name,\n arguments: rawArgs,\n result: execution.normalizedResult,\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n metadata: normalizeReplayMetadata(execution.replay),\n } satisfies ToolCallRecord;\n args.toolCalls.push(call);\n args.messages.push({\n role: \"assistant\",\n toolCalls: [call],\n });\n args.messages.push({\n role: \"tool\",\n content: execution.normalizedResult,\n metadata: {\n name: tool.name,\n },\n });\n return execution.result;\n } catch (error) {\n const finishedAt = new Date();\n const call = {\n name: tool.name,\n arguments: rawArgs,\n error: serializeToolCallError(error),\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n metadata: normalizeReplayMetadata(getReplayMetadataFromError(error)),\n } satisfies ToolCallRecord;\n args.toolCalls.push(call);\n args.messages.push({\n role: \"assistant\",\n toolCalls: [call],\n });\n throw error;\n }\n };\n instrumentedExecute[ORIGINAL_NATIVE_EXECUTE] = originalExecute;\n tool.execute = instrumentedExecute;\n };\n\n const patchToolsets = (\n nextToolsets: Array<PiAgentToolLike<TInput, TMetadata>[]>,\n ) => {\n for (const toolset of nextToolsets) {\n for (const tool of toolset) {\n patchTool(tool);\n }\n }\n };\n\n patchToolsets(toolsets);\n\n for (const target of getAgentResetTargets(agent)) {\n const originalReset = target.reset;\n originalResets.set(target, originalReset);\n target.reset = function patchedReset(this: ResettableAgent, ...resetArgs) {\n const resetResult = originalReset.apply(this, resetArgs);\n\n if (isPromiseLike(resetResult)) {\n return resetResult.finally(() => {\n patchToolsets(\n resolveInferredNativeToolsets<TInput, TMetadata>(agent),\n );\n });\n }\n\n patchToolsets(resolveInferredNativeToolsets<TInput, TMetadata>(agent));\n return resetResult;\n };\n }\n\n try {\n return await callback();\n } finally {\n for (const [target, originalReset] of originalResets) {\n target.reset = originalReset;\n }\n\n for (const [tool, originalExecute] of originalExecutions) {\n tool.execute = originalExecute;\n }\n }\n}\n\ntype ResettableAgent = {\n reset: (...args: unknown[]) => unknown;\n};\n\nfunction getAgentResetTargets(agent: unknown): ResettableAgent[] {\n return getAgentRoots(agent).filter(isResettableAgent);\n}\n\nfunction isResettableAgent(value: object): value is ResettableAgent {\n return \"reset\" in value && typeof value.reset === \"function\";\n}\n\nfunction resolveInferredNativeToolsets<\n TInput,\n TMetadata extends HarnessMetadata,\n>(agent: unknown): Array<PiAgentToolLike<TInput, TMetadata>[]> {\n const toolsets: Array<PiAgentToolLike<TInput, TMetadata>[]> = [];\n const seenToolsets = new Set<PiAgentToolLike<TInput, TMetadata>[]>();\n\n for (const candidate of getAgentToolCandidates(agent)) {\n const nativeTools = getNativeToolArray(candidate);\n if (nativeTools && !seenToolsets.has(nativeTools)) {\n seenToolsets.add(nativeTools);\n toolsets.push(nativeTools);\n }\n }\n\n return toolsets;\n}\n\nfunction isPromiseLike(value: unknown): value is Promise<unknown> {\n return Boolean(\n value && typeof (value as { then?: unknown }).then === \"function\",\n );\n}\n\nfunction serializeToolCallError(\n error: unknown,\n): NonNullable<ToolCallRecord[\"error\"]> {\n const serialized = serializeError(error);\n const { message, type, ...details } = serialized;\n\n return {\n ...details,\n message: typeof message === \"string\" ? message : String(message),\n ...(typeof type === \"string\" ? { type } : {}),\n };\n}\n\nfunction getNativeToolExecuteOrigin<TInput, TMetadata extends HarnessMetadata>(\n execute: PiAgentToolLike<TInput, TMetadata>[\"execute\"],\n) {\n const nativeExecute = execute as NativeToolExecute<TInput, TMetadata>;\n return nativeExecute[ORIGINAL_NATIVE_EXECUTE] ?? nativeExecute;\n}\n\nasync function executeNativeToolWithReplay<\n TInput,\n TMetadata extends HarnessMetadata,\n>({\n toolName,\n toolCallId,\n execute,\n replay,\n args,\n context,\n}: {\n toolName: string;\n toolCallId: string;\n execute: PiAgentToolLike<TInput, TMetadata>[\"execute\"];\n replay: PiAgentToolLike<TInput, TMetadata>[\"replay\"];\n args: Record<string, JsonValue>;\n context: PiAiToolContext<TInput, TMetadata>;\n}) {\n let didExecute = false;\n let liveResult: unknown;\n\n const execution = await executeWithReplay({\n toolName,\n args,\n context,\n execute: async (toolArgs) => {\n didExecute = true;\n liveResult = await execute(toolCallId, toolArgs);\n return createNativeToolReplayEnvelope(liveResult);\n },\n replay,\n });\n\n if (didExecute) {\n return {\n result: liveResult,\n normalizedResult: normalizeReplayToolResult(liveResult),\n replay: execution.replay,\n };\n }\n\n return {\n ...resolveNativeToolReplayResult(execution.result),\n replay: execution.replay,\n };\n}\n\nfunction createRuntime<\n TInput,\n TMetadata extends HarnessMetadata,\n TTools extends PiAiToolset<TInput, TMetadata>,\n>({\n input,\n context,\n tools,\n messages,\n}: {\n input: TInput;\n context: HarnessContext<TMetadata>;\n tools: TTools | undefined;\n messages: NormalizedMessage[];\n}): PiAiRuntime<TTools, TInput, TMetadata> & {\n toolCalls: ToolCallRecord[];\n} {\n const toolCalls: ToolCallRecord[] = [];\n const eventSink: PiAiEventSink = {\n message: (message) => {\n messages.push(message);\n },\n system: (content, metadata) => {\n messages.push({\n role: \"system\",\n content,\n metadata,\n });\n },\n user: (content, metadata) => {\n messages.push({\n role: \"user\",\n content,\n metadata,\n });\n },\n assistant: (content, metadata) => {\n messages.push({\n role: \"assistant\",\n content,\n metadata,\n });\n },\n tool: (name, content, metadata) => {\n messages.push({\n role: \"tool\",\n content,\n metadata: {\n name,\n ...(metadata ?? {}),\n },\n });\n },\n };\n\n const runtimeTools = Object.fromEntries(\n Object.entries(tools ?? {}).map(([toolName, tool]) => [\n toolName,\n async (args: Record<string, JsonValue>) => {\n const startedAt = new Date();\n const toolContext = {\n input,\n metadata: context.metadata,\n signal: context.signal,\n setArtifact: context.setArtifact,\n } satisfies PiAiToolContext<TInput, TMetadata>;\n\n try {\n const execution = await executeToolWithReplay({\n toolName,\n tool,\n args,\n context: toolContext,\n });\n const finishedAt = new Date();\n const call = {\n name: toolName,\n arguments: args,\n result: execution.result,\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n metadata: normalizeReplayMetadata(execution.replay),\n } satisfies ToolCallRecord;\n toolCalls.push(call);\n messages.push({\n role: \"assistant\",\n toolCalls: [call],\n });\n messages.push({\n role: \"tool\",\n content: execution.result,\n metadata: {\n name: toolName,\n },\n });\n return execution.result;\n } catch (error) {\n const finishedAt = new Date();\n const call = {\n name: toolName,\n arguments: args,\n error: serializeToolCallError(error),\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n metadata: normalizeReplayMetadata(\n getReplayMetadataFromError(error),\n ),\n } satisfies ToolCallRecord;\n toolCalls.push(call);\n messages.push({\n role: \"assistant\",\n toolCalls: [call],\n });\n throw error;\n }\n },\n ]),\n ) as unknown as PiAiRuntime<TTools, TInput, TMetadata>[\"tools\"];\n\n return {\n tools: runtimeTools,\n events: eventSink,\n signal: context.signal,\n toolCalls,\n };\n}\n\nfunction resolveOutput(result: unknown): JsonValue | undefined {\n if (!result || typeof result !== \"object\") {\n return toJsonValue(result);\n }\n\n const candidates = [\n \"output\",\n \"decision\",\n \"result\",\n \"final\",\n ] satisfies string[];\n\n for (const key of candidates) {\n const value = (result as Record<string, unknown>)[key];\n const normalized = toJsonValue(value);\n if (normalized !== undefined) {\n return normalized;\n }\n }\n\n return undefined;\n}\n\nfunction normalizeToolResult(result: unknown): JsonValue | undefined {\n const details =\n result && typeof result === \"object\"\n ? toJsonValue((result as { details?: unknown }).details)\n : undefined;\n if (details !== undefined) {\n return details;\n }\n\n return (\n toJsonValue(result) ?? (result === undefined ? undefined : String(result))\n );\n}\n\nfunction normalizeReplayToolResult(result: unknown): JsonValue {\n return normalizeToolResult(result) ?? null;\n}\n\ntype NativeToolReplayEnvelope = {\n __vitestEvals: {\n kind: \"pi-ai-native-tool-result\";\n version: 2;\n };\n agentResult: JsonValue;\n normalizedResult: JsonValue;\n};\n\ntype LegacyNativeToolReplayEnvelope = {\n __vitestEvals: {\n kind: \"pi-ai-native-tool-result\";\n version: 1;\n };\n normalizedResult: JsonValue;\n agentResult?: JsonValue;\n};\n\nfunction createNativeToolReplayEnvelope(\n result: unknown,\n): NativeToolReplayEnvelope {\n const normalizedResult = normalizeReplayToolResult(result);\n\n return {\n __vitestEvals: {\n kind: \"pi-ai-native-tool-result\",\n version: 2,\n },\n agentResult: toJsonValue(result) ?? normalizedResult,\n normalizedResult,\n };\n}\n\nfunction resolveNativeToolReplayResult(result: JsonValue) {\n if (isNativeToolReplayEnvelope(result)) {\n return {\n result: result.agentResult,\n normalizedResult: result.normalizedResult,\n };\n }\n\n if (isLegacyNativeToolReplayEnvelope(result)) {\n return {\n result: result.agentResult ?? result.normalizedResult,\n normalizedResult: result.normalizedResult,\n };\n }\n\n return {\n result,\n normalizedResult: normalizeReplayToolResult(result),\n };\n}\n\nfunction isNativeToolReplayEnvelope(\n value: unknown,\n): value is NativeToolReplayEnvelope {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n \"__vitestEvals\" in value &&\n isNativeToolReplayMarker(\n (value as { __vitestEvals?: unknown }).__vitestEvals,\n ) &&\n \"agentResult\" in value &&\n \"normalizedResult\" in value,\n );\n}\n\nfunction isNativeToolReplayMarker(\n value: unknown,\n): value is NativeToolReplayEnvelope[\"__vitestEvals\"] {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n \"kind\" in value &&\n (value as { kind?: unknown }).kind === \"pi-ai-native-tool-result\" &&\n \"version\" in value &&\n (value as { version?: unknown }).version === 2,\n );\n}\n\nfunction isLegacyNativeToolReplayEnvelope(\n value: unknown,\n): value is LegacyNativeToolReplayEnvelope {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n \"__vitestEvals\" in value &&\n isLegacyNativeToolReplayMarker(\n (value as { __vitestEvals?: unknown }).__vitestEvals,\n ) &&\n \"normalizedResult\" in value,\n );\n}\n\nfunction isLegacyNativeToolReplayMarker(\n value: unknown,\n): value is LegacyNativeToolReplayEnvelope[\"__vitestEvals\"] {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n \"kind\" in value &&\n (value as { kind?: unknown }).kind === \"pi-ai-native-tool-result\" &&\n \"version\" in value &&\n (value as { version?: unknown }).version === 1,\n );\n}\n\nfunction resolveUsage(result: unknown, toolCallCount: number): UsageSummary {\n if (!result || typeof result !== \"object\") {\n return toolCallCount > 0 ? { toolCalls: toolCallCount } : {};\n }\n\n const usageValue =\n (result as Record<string, unknown>).usage ??\n (result as Record<string, unknown>).metrics;\n\n const usage =\n usageValue && typeof usageValue === \"object\"\n ? ({ ...(usageValue as Record<string, unknown>) } as UsageSummary)\n : {};\n\n if (usage.toolCalls === undefined && toolCallCount > 0) {\n usage.toolCalls = toolCallCount;\n }\n\n return usage;\n}\n\nfunction resolveSession(\n result: unknown,\n messages: NormalizedMessage[],\n output: JsonValue | undefined,\n usage: UsageSummary,\n): NormalizedSession {\n if (\n isNormalizedSession(\n (result as Record<string, unknown> | undefined)?.session,\n )\n ) {\n return (result as { session: NormalizedSession }).session;\n }\n\n if (\n isNormalizedSession((result as Record<string, unknown> | undefined)?.trace)\n ) {\n return (result as { trace: NormalizedSession }).trace;\n }\n\n const sessionMessages = [...messages];\n if (\n output !== undefined &&\n !sessionMessages.some(\n (message) =>\n message.role === \"assistant\" && message.content !== undefined,\n )\n ) {\n sessionMessages.push({\n role: \"assistant\",\n content: output,\n });\n }\n\n return {\n messages: sessionMessages,\n outputText: typeof output === \"string\" ? output : undefined,\n provider:\n ((result as Record<string, unknown> | undefined)?.provider as\n | string\n | undefined) ?? usage.provider,\n model:\n ((result as Record<string, unknown> | undefined)?.model as\n | string\n | undefined) ?? usage.model,\n };\n}\n\nfunction resolveErrors(result: unknown): Array<Record<string, JsonValue>> {\n return resolveHarnessRunErrors(result);\n}\n\nasync function executeToolWithReplay<\n TArgs extends Record<string, JsonValue>,\n TResult extends JsonValue,\n TInput,\n TMetadata extends HarnessMetadata,\n>({\n toolName,\n tool,\n args,\n context,\n}: {\n toolName: string;\n tool: PiAiToolDefinition<TArgs, TResult, TInput, TMetadata>;\n args: TArgs;\n context: PiAiToolContext<TInput, TMetadata>;\n}) {\n return executeWithReplay({\n toolName,\n args,\n context,\n execute: tool.execute,\n replay: tool.replay,\n });\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type {\n Harness,\n HarnessContext,\n HarnessMetadata,\n HarnessPrompt,\n HarnessRun,\n JsonValue,\n NormalizedMessage,\n NormalizedSession,\n TimingSummary,\n ToolCallRecord,\n UsageSummary,\n} from \"vitest-evals/harness\";\nimport {\n attachHarnessRunToError,\n isHarnessRun,\n isNormalizedSession,\n normalizeContent,\n resolveHarnessRunErrors,\n serializeError,\n toJsonValue,\n} from \"vitest-evals/harness\";\nimport {\n executeWithReplay,\n getReplayMetadataFromError,\n normalizeReplayMetadata,\n} from \"vitest-evals/replay\";\nimport type {\n ReplayMode,\n ToolRecording,\n ToolReplayConfig,\n} from \"vitest-evals/replay\";\n\ntype MaybePromise<T> = T | Promise<T>;\ntype AnyPiAiToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<string, PiAiToolDefinition<any, any, TInput, TMetadata>>;\ntype InferredPiAiToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<\n string,\n PiAiToolDefinition<Record<string, JsonValue>, JsonValue, TInput, TMetadata>\n>;\n\ntype PiAgentToolLike<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = {\n name: string;\n execute: (toolCallId: string, args: Record<string, JsonValue>) => unknown;\n};\n\nconst ORIGINAL_NATIVE_EXECUTE = Symbol(\"vitest-evals.originalNativeExecute\");\n\ntype NativeToolExecute<\n TInput,\n TMetadata extends HarnessMetadata,\n> = PiAgentToolLike<TInput, TMetadata>[\"execute\"] & {\n [ORIGINAL_NATIVE_EXECUTE]?: PiAgentToolLike<TInput, TMetadata>[\"execute\"];\n};\n\nexport type PiAiReplayMode = ReplayMode;\n\nexport interface PiAiEventSink {\n message: (message: NormalizedMessage) => void;\n system: (content: JsonValue, metadata?: Record<string, JsonValue>) => void;\n user: (content: JsonValue, metadata?: Record<string, JsonValue>) => void;\n assistant: (content: JsonValue, metadata?: Record<string, JsonValue>) => void;\n tool: (\n name: string,\n content: JsonValue,\n metadata?: Record<string, JsonValue>,\n ) => void;\n}\n\nexport interface PiAiToolContext<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> {\n input: TInput;\n metadata: HarnessContext<TMetadata>[\"metadata\"];\n signal?: AbortSignal;\n setArtifact: HarnessContext<TMetadata>[\"setArtifact\"];\n}\n\nexport type PiAiToolRecording<\n TArgs extends Record<string, JsonValue> = Record<string, JsonValue>,\n TResult extends JsonValue = JsonValue,\n> = ToolRecording<TArgs, TResult>;\n\nexport type PiAiToolReplayConfig<\n TArgs extends Record<string, JsonValue> = Record<string, JsonValue>,\n TResult extends JsonValue = JsonValue,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = ToolReplayConfig<TArgs, TResult, PiAiToolContext<TInput, TMetadata>>;\n\nexport type PiAiToolReplayPolicy<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> =\n | boolean\n | PiAiToolReplayConfig<\n Record<string, JsonValue>,\n JsonValue,\n TInput,\n TMetadata\n >;\n\nexport type PiAiToolReplayPolicies<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<string, PiAiToolReplayPolicy<TInput, TMetadata>>;\n\nexport interface PiAiToolDefinition<\n TArgs extends Record<string, JsonValue> = Record<string, JsonValue>,\n TResult extends JsonValue = JsonValue,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> {\n description?: string;\n execute: (\n args: TArgs,\n context: PiAiToolContext<TInput, TMetadata>,\n ) => MaybePromise<TResult>;\n}\n\nexport type PiAiToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = AnyPiAiToolset<TInput, TMetadata>;\n\ntype ToolArgs<TTool> = TTool extends PiAiToolDefinition<\n infer TArgs,\n infer _TResult,\n infer _TInput,\n infer _TMetadata\n>\n ? TArgs\n : never;\n\ntype ToolResult<TTool> = TTool extends PiAiToolDefinition<\n infer _TArgs,\n infer TResult,\n infer _TInput,\n infer _TMetadata\n>\n ? TResult\n : never;\n\nexport type PiAiRuntime<\n TTools extends PiAiToolset<TInput, TMetadata>,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = {\n tools: {\n [K in keyof TTools]: (\n args: ToolArgs<TTools[K]>,\n ) => Promise<ToolResult<TTools[K]>>;\n };\n events: PiAiEventSink;\n signal?: AbortSignal;\n};\n\nexport interface PiAiHarnessRunArgs<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TTools extends PiAiToolset<TInput, TMetadata>,\n> {\n agent: TAgent;\n input: TInput;\n context: HarnessContext<TMetadata>;\n runtime: PiAiRuntime<TTools, TInput, TMetadata>;\n}\n\nexport interface PiAiHarnessResultArgs<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n> extends PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools> {\n result: TResult;\n}\n\nexport interface PiAiCreateAgentArgs<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> {\n input: TInput;\n context: HarnessContext<TMetadata>;\n}\n\ninterface PiAiHarnessBaseOptions<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n> {\n agent?: TAgent;\n createAgent?: (\n args: PiAiCreateAgentArgs<TInput, TMetadata>,\n ) => MaybePromise<TAgent>;\n toolReplay?: PiAiToolReplayPolicies<TInput, TMetadata>;\n normalize?: PiAiHarnessNormalizeOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools\n >;\n prompt: HarnessPrompt;\n name?: string;\n}\n\nexport interface PiAiHarnessWithToolsOptions<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n> extends PiAiHarnessBaseOptions<TAgent, TInput, TMetadata, TResult, TTools> {\n tools: TTools;\n run?: (\n args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n ) => MaybePromise<TResult | HarnessRun>;\n}\n\nexport interface PiAiHarnessInferredToolsOptions<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n> extends PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n InferredPiAiToolset<TInput, TMetadata>\n > {\n tools?: undefined;\n run?: (\n args: PiAiHarnessRunArgs<\n TAgent,\n TInput,\n TMetadata,\n InferredPiAiToolset<TInput, TMetadata>\n >,\n ) => MaybePromise<TResult | HarnessRun>;\n}\n\nexport type PiAiHarnessOptions<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n> =\n | PiAiHarnessWithToolsOptions<TAgent, TInput, TMetadata, TResult, TTools>\n | PiAiHarnessInferredToolsOptions<TAgent, TInput, TMetadata, TResult>;\n\ntype PiAiHarnessRunOptions<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n> = PiAiHarnessBaseOptions<TAgent, TInput, TMetadata, TResult, TTools> & {\n run?: (\n args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n ) => MaybePromise<TResult | HarnessRun>;\n};\n\ntype PiAiRunnableAgent<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n> = {\n run: (\n input: TInput,\n runtime: PiAiRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<TResult | HarnessRun>;\n};\n\nexport interface PiAiHarnessNormalizeOptions<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n> {\n session?: (\n args: PiAiHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n ) => MaybePromise<NormalizedSession>;\n output?: (\n args: PiAiHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n ) => MaybePromise<JsonValue | undefined>;\n usage?: (\n args: PiAiHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n ) => MaybePromise<UsageSummary>;\n timings?: (\n args: PiAiHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n ) => MaybePromise<TimingSummary | undefined>;\n errors?: (\n args: PiAiHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n ) => MaybePromise<Array<Record<string, JsonValue>>>;\n}\n\ntype InferredToolSurfaces<TInput, TMetadata extends HarnessMetadata> = {\n runtimeTools?: InferredPiAiToolset<TInput, TMetadata>;\n nativeToolsets?: Array<PiAgentToolLike<TInput, TMetadata>[]>;\n};\n\ntype PiToolExecutionState = {\n activeNativeToolNames: Map<string, number>;\n};\n\n/** Adapts a Pi agent runtime into a normalized vitest-evals harness. */\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n>(\n options: PiAiHarnessWithToolsOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools\n >,\n): Harness<TInput, TMetadata>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n>(\n options: PiAiHarnessInferredToolsOptions<TAgent, TInput, TMetadata, TResult>,\n): Harness<TInput, TMetadata>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n>(\n options: PiAiHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools>,\n): Harness<TInput, TMetadata> {\n return {\n name: options.name ?? \"pi-ai\",\n prompt: options.prompt,\n run: async (input, context) => {\n const agent = await resolveAgent(options, {\n input,\n context,\n });\n const messages: NormalizedMessage[] = [\n {\n role: \"user\",\n content: normalizeContent(input),\n },\n ];\n const inferredTools = resolveInferredToolSurfaces<TInput, TMetadata>(\n agent,\n );\n\n if (hasExplicitToolset(options)) {\n return executePiHarnessRun(\n options,\n agent,\n input,\n context,\n messages,\n options.tools,\n inferredTools.nativeToolsets,\n );\n }\n\n return executePiHarnessRun(\n options,\n agent,\n input,\n context,\n messages,\n inferredTools.runtimeTools,\n inferredTools.nativeToolsets,\n );\n },\n };\n}\n\nasync function executePiHarnessRun<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n>(\n options: PiAiHarnessRunOptions<TAgent, TInput, TMetadata, TResult, TTools>,\n agent: TAgent,\n input: TInput,\n context: HarnessContext<TMetadata>,\n messages: NormalizedMessage[],\n runtimeTools: TTools | undefined,\n nativeToolsets?: Array<PiAgentToolLike<TInput, TMetadata>[]>,\n): Promise<HarnessRun> {\n const executionState = createPiToolExecutionState();\n const runtime = createRuntime({\n input,\n context,\n tools: runtimeTools,\n toolReplay: options.toolReplay,\n executionState,\n messages,\n });\n\n try {\n const result = await withInstrumentedAgentTools(\n agent,\n nativeToolsets,\n {\n input,\n context,\n messages,\n toolCalls: runtime.toolCalls,\n toolReplay: options.toolReplay,\n executionState,\n },\n () =>\n runAgent(options, {\n agent,\n input,\n context,\n runtime,\n }),\n );\n\n if (isHarnessRun(result) && !hasResultOverrides(options)) {\n if (Object.keys(context.artifacts).length > 0 && !result.artifacts) {\n result.artifacts = context.artifacts;\n }\n return result;\n }\n\n const normalizeResult = result as TResult;\n const resultArgs = {\n agent,\n input,\n context,\n runtime,\n result: normalizeResult,\n } satisfies PiAiHarnessResultArgs<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools\n >;\n\n const output = options.normalize?.output\n ? await options.normalize.output(resultArgs)\n : resolveOutput(normalizeResult);\n const usage = options.normalize?.usage\n ? await options.normalize.usage(resultArgs)\n : resolveUsage(normalizeResult, runtime.toolCalls.length);\n const session = options.normalize?.session\n ? await options.normalize.session(resultArgs)\n : resolveSession(normalizeResult, messages, output, usage);\n\n return {\n session,\n output,\n usage,\n timings: options.normalize?.timings\n ? await options.normalize.timings(resultArgs)\n : undefined,\n artifacts:\n Object.keys(context.artifacts).length > 0\n ? context.artifacts\n : undefined,\n errors: options.normalize?.errors\n ? await options.normalize.errors(resultArgs)\n : resolveErrors(normalizeResult),\n };\n } catch (error) {\n const usage = resolveUsage(undefined, runtime.toolCalls.length);\n const run = {\n session: resolveSession(undefined, messages, undefined, usage),\n output: undefined,\n usage,\n artifacts:\n Object.keys(context.artifacts).length > 0\n ? context.artifacts\n : undefined,\n errors: [serializeError(error)],\n } satisfies HarnessRun;\n\n throw attachHarnessRunToError(error, run);\n }\n}\n\nasync function resolveAgent<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n>(\n options: PiAiHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools>,\n args: PiAiCreateAgentArgs<TInput, TMetadata>,\n) {\n if (options.agent !== undefined) {\n return options.agent;\n }\n\n if (options.createAgent) {\n return options.createAgent(args);\n }\n\n throw new Error(\n \"piAiHarness requires either an agent instance or a createAgent() function.\",\n );\n}\n\nfunction hasResultOverrides<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n>(options: PiAiHarnessRunOptions<TAgent, TInput, TMetadata, TResult, TTools>) {\n return Boolean(\n options.normalize?.output ??\n options.normalize?.session ??\n options.normalize?.usage ??\n options.normalize?.timings ??\n options.normalize?.errors,\n );\n}\n\nfunction resolveInferredToolSurfaces<TInput, TMetadata extends HarnessMetadata>(\n agent: unknown,\n): InferredToolSurfaces<TInput, TMetadata> {\n let runtimeTools: InferredPiAiToolset<TInput, TMetadata> | undefined;\n const nativeToolsets: Array<PiAgentToolLike<TInput, TMetadata>[]> = [];\n const seenToolsets = new Set<PiAgentToolLike<TInput, TMetadata>[]>();\n\n for (const candidate of getAgentToolCandidates(agent)) {\n const nextRuntimeTools = getRuntimeToolset<TInput, TMetadata>(candidate);\n if (runtimeTools === undefined && nextRuntimeTools !== undefined) {\n runtimeTools = nextRuntimeTools;\n }\n\n const nativeTools = getNativeToolArray(candidate);\n if (nativeTools && !seenToolsets.has(nativeTools)) {\n seenToolsets.add(nativeTools);\n nativeToolsets.push(nativeTools);\n }\n }\n\n return {\n ...(runtimeTools ? { runtimeTools } : {}),\n ...(nativeToolsets.length > 0 ? { nativeToolsets } : {}),\n };\n}\n\nfunction getAgentToolCandidates(agent: unknown): object[] {\n const roots = getAgentRoots(agent);\n const candidates: object[] = [];\n const seen = new Set<object>();\n\n for (const root of roots) {\n addUniqueObject(candidates, seen, root);\n addUniqueObject(candidates, seen, getObjectProperty(root, \"state\"));\n addUniqueObject(candidates, seen, getObjectProperty(root, \"initialState\"));\n }\n\n return candidates;\n}\n\nfunction getAgentRoots(agent: unknown): object[] {\n return [asObject(agent)]\n .concat(asObject(getObjectProperty(agent, \"agent\")))\n .filter((value): value is object => value !== undefined);\n}\n\nfunction addUniqueObject(\n candidates: object[],\n seen: Set<object>,\n value: unknown,\n) {\n if (!value || typeof value !== \"object\" || seen.has(value)) {\n return;\n }\n\n seen.add(value);\n candidates.push(value);\n}\n\nfunction asObject(value: unknown): object | undefined {\n return value && typeof value === \"object\" ? value : undefined;\n}\n\nfunction getObjectProperty(value: unknown, key: string): unknown {\n return value && typeof value === \"object\"\n ? (value as Record<string, unknown>)[key]\n : undefined;\n}\n\nfunction getRuntimeToolset<TInput, TMetadata extends HarnessMetadata>(\n value: object,\n): InferredPiAiToolset<TInput, TMetadata> | undefined {\n const candidate =\n getObjectProperty(value, \"tools\") ?? getObjectProperty(value, \"toolset\");\n\n return isPiAiToolset(candidate)\n ? (candidate as InferredPiAiToolset<TInput, TMetadata>)\n : undefined;\n}\n\nfunction getNativeToolArray<TInput, TMetadata extends HarnessMetadata>(\n value: object,\n): PiAgentToolLike<TInput, TMetadata>[] | undefined {\n const candidate = getObjectProperty(value, \"tools\");\n if (isAgentToolArray(candidate)) {\n return candidate as PiAgentToolLike<TInput, TMetadata>[];\n }\n\n return undefined;\n}\n\nasync function runAgent<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n>(\n options: PiAiHarnessRunOptions<TAgent, TInput, TMetadata, TResult, TTools>,\n args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n): Promise<TResult | HarnessRun> {\n if (options.run) {\n return options.run(args);\n }\n\n if (hasPiAiRunMethod<TInput, TMetadata, TResult, TTools>(args.agent)) {\n return args.agent.run(args.input, args.runtime);\n }\n\n throw new Error(\n \"piAiHarness requires a run() function unless the provided agent exposes run(input, runtime).\",\n );\n}\n\nfunction hasExplicitToolset<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n>(\n options: PiAiHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools>,\n): options is PiAiHarnessWithToolsOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools\n> {\n return options.tools !== undefined;\n}\n\nfunction hasPiAiRunMethod<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n>(\n agent: unknown,\n): agent is PiAiRunnableAgent<TInput, TMetadata, TResult, TTools> {\n if (!agent || typeof agent !== \"object\") {\n return false;\n }\n\n return (\n \"run\" in agent && typeof (agent as { run?: unknown }).run === \"function\"\n );\n}\n\nfunction isPiAiToolset(value: unknown): value is PiAiToolset {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return false;\n }\n\n const tools = Object.values(value);\n return (\n tools.length > 0 &&\n tools.every((tool) =>\n Boolean(\n tool &&\n typeof tool === \"object\" &&\n \"execute\" in tool &&\n typeof (tool as { execute?: unknown }).execute === \"function\",\n ),\n )\n );\n}\n\nfunction isAgentToolArray(value: unknown): value is PiAgentToolLike[] {\n return (\n Array.isArray(value) &&\n value.every((tool) =>\n Boolean(\n tool &&\n typeof tool === \"object\" &&\n \"name\" in tool &&\n typeof (tool as { name?: unknown }).name === \"string\" &&\n \"execute\" in tool &&\n typeof (tool as { execute?: unknown }).execute === \"function\",\n ),\n )\n );\n}\n\nasync function withInstrumentedAgentTools<\n TResult,\n TInput,\n TMetadata extends HarnessMetadata,\n>(\n agent: unknown,\n toolsets: Array<PiAgentToolLike<TInput, TMetadata>[]> | undefined,\n args: {\n input: TInput;\n context: HarnessContext<TMetadata>;\n messages: NormalizedMessage[];\n toolCalls: ToolCallRecord[];\n toolReplay: PiAiToolReplayPolicies<TInput, TMetadata> | undefined;\n executionState: PiToolExecutionState;\n },\n callback: () => Promise<TResult>,\n) {\n if (!toolsets || toolsets.length === 0) {\n return callback();\n }\n\n const originalExecutions = new Map<\n PiAgentToolLike<TInput, TMetadata>,\n PiAgentToolLike<TInput, TMetadata>[\"execute\"]\n >();\n const originalResets = new Map<ResettableAgent, ResettableAgent[\"reset\"]>();\n\n const patchTool = (tool: PiAgentToolLike<TInput, TMetadata>) => {\n if (originalExecutions.has(tool)) {\n return;\n }\n\n const originalExecute = getNativeToolExecuteOrigin(tool.execute);\n originalExecutions.set(tool, originalExecute);\n const instrumentedExecute: NativeToolExecute<TInput, TMetadata> = async (\n toolCallId: string,\n rawArgs: Record<string, JsonValue>,\n ) => {\n const startedAt = new Date();\n const toolContext = {\n input: args.input,\n metadata: args.context.metadata,\n signal: args.context.signal,\n setArtifact: args.context.setArtifact,\n } satisfies PiAiToolContext<TInput, TMetadata>;\n const leaveNativeTool = enterNativeToolExecution(\n args.executionState,\n tool.name,\n );\n\n try {\n const execution = await executeNativeToolWithReplay({\n toolName: tool.name,\n toolCallId,\n execute: originalExecute,\n replay: args.toolReplay?.[tool.name],\n args: rawArgs,\n context: toolContext,\n });\n const finishedAt = new Date();\n const call = {\n name: tool.name,\n arguments: rawArgs,\n result: execution.normalizedResult,\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n metadata: normalizeReplayMetadata(execution.replay),\n } satisfies ToolCallRecord;\n args.toolCalls.push(call);\n args.messages.push({\n role: \"assistant\",\n toolCalls: [call],\n });\n args.messages.push({\n role: \"tool\",\n content: execution.normalizedResult,\n metadata: {\n name: tool.name,\n },\n });\n return execution.result;\n } catch (error) {\n const finishedAt = new Date();\n const call = {\n name: tool.name,\n arguments: rawArgs,\n error: serializeToolCallError(error),\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n metadata: normalizeReplayMetadata(getReplayMetadataFromError(error)),\n } satisfies ToolCallRecord;\n args.toolCalls.push(call);\n args.messages.push({\n role: \"assistant\",\n toolCalls: [call],\n });\n throw error;\n } finally {\n leaveNativeTool();\n }\n };\n instrumentedExecute[ORIGINAL_NATIVE_EXECUTE] = originalExecute;\n tool.execute = instrumentedExecute;\n };\n\n const patchToolsets = (\n nextToolsets: Array<PiAgentToolLike<TInput, TMetadata>[]>,\n ) => {\n for (const toolset of nextToolsets) {\n for (const tool of toolset) {\n patchTool(tool);\n }\n }\n };\n\n patchToolsets(toolsets);\n\n for (const target of getAgentResetTargets(agent)) {\n const originalReset = target.reset;\n originalResets.set(target, originalReset);\n target.reset = function patchedReset(this: ResettableAgent, ...resetArgs) {\n const resetResult = originalReset.apply(this, resetArgs);\n\n if (isPromiseLike(resetResult)) {\n return resetResult.finally(() => {\n patchToolsets(\n resolveInferredNativeToolsets<TInput, TMetadata>(agent),\n );\n });\n }\n\n patchToolsets(resolveInferredNativeToolsets<TInput, TMetadata>(agent));\n return resetResult;\n };\n }\n\n try {\n return await callback();\n } finally {\n for (const [target, originalReset] of originalResets) {\n target.reset = originalReset;\n }\n\n for (const [tool, originalExecute] of originalExecutions) {\n tool.execute = originalExecute;\n }\n }\n}\n\ntype ResettableAgent = {\n reset: (...args: unknown[]) => unknown;\n};\n\nfunction getAgentResetTargets(agent: unknown): ResettableAgent[] {\n return getAgentRoots(agent).filter(isResettableAgent);\n}\n\nfunction isResettableAgent(value: object): value is ResettableAgent {\n return \"reset\" in value && typeof value.reset === \"function\";\n}\n\nfunction resolveInferredNativeToolsets<\n TInput,\n TMetadata extends HarnessMetadata,\n>(agent: unknown): Array<PiAgentToolLike<TInput, TMetadata>[]> {\n const toolsets: Array<PiAgentToolLike<TInput, TMetadata>[]> = [];\n const seenToolsets = new Set<PiAgentToolLike<TInput, TMetadata>[]>();\n\n for (const candidate of getAgentToolCandidates(agent)) {\n const nativeTools = getNativeToolArray(candidate);\n if (nativeTools && !seenToolsets.has(nativeTools)) {\n seenToolsets.add(nativeTools);\n toolsets.push(nativeTools);\n }\n }\n\n return toolsets;\n}\n\nfunction isPromiseLike(value: unknown): value is Promise<unknown> {\n return Boolean(\n value && typeof (value as { then?: unknown }).then === \"function\",\n );\n}\n\nfunction serializeToolCallError(\n error: unknown,\n): NonNullable<ToolCallRecord[\"error\"]> {\n const serialized = serializeError(error);\n const { message, type, ...details } = serialized;\n\n return {\n ...details,\n message: typeof message === \"string\" ? message : String(message),\n ...(typeof type === \"string\" ? { type } : {}),\n };\n}\n\nfunction getNativeToolExecuteOrigin<TInput, TMetadata extends HarnessMetadata>(\n execute: PiAgentToolLike<TInput, TMetadata>[\"execute\"],\n) {\n const nativeExecute = execute as NativeToolExecute<TInput, TMetadata>;\n return nativeExecute[ORIGINAL_NATIVE_EXECUTE] ?? nativeExecute;\n}\n\nfunction createPiToolExecutionState(): PiToolExecutionState {\n return {\n activeNativeToolNames: new Map(),\n };\n}\n\nfunction enterNativeToolExecution(\n state: PiToolExecutionState,\n toolName: string,\n) {\n state.activeNativeToolNames.set(\n toolName,\n (state.activeNativeToolNames.get(toolName) ?? 0) + 1,\n );\n\n return () => {\n const nextCount = (state.activeNativeToolNames.get(toolName) ?? 1) - 1;\n if (nextCount <= 0) {\n state.activeNativeToolNames.delete(toolName);\n return;\n }\n\n state.activeNativeToolNames.set(toolName, nextCount);\n };\n}\n\nfunction hasActiveNativeToolExecution(\n state: PiToolExecutionState,\n toolName: string,\n) {\n return (state.activeNativeToolNames.get(toolName) ?? 0) > 0;\n}\n\nasync function executeNativeToolWithReplay<\n TInput,\n TMetadata extends HarnessMetadata,\n>({\n toolName,\n toolCallId,\n execute,\n replay,\n args,\n context,\n}: {\n toolName: string;\n toolCallId: string;\n execute: PiAgentToolLike<TInput, TMetadata>[\"execute\"];\n replay: PiAiToolReplayPolicy<TInput, TMetadata> | undefined;\n args: Record<string, JsonValue>;\n context: PiAiToolContext<TInput, TMetadata>;\n}) {\n let didExecute = false;\n let liveResult: unknown;\n\n const execution = await executeWithReplay({\n toolName: createNativeReplayToolName(toolName),\n args,\n context,\n execute: async (toolArgs) => {\n didExecute = true;\n liveResult = await execute(toolCallId, toolArgs);\n return createNativeToolReplayEnvelope(liveResult);\n },\n replay,\n });\n\n if (didExecute) {\n return {\n result: liveResult,\n normalizedResult: normalizeReplayToolResult(liveResult),\n replay: execution.replay,\n };\n }\n\n return {\n ...resolveNativeToolReplayResult(execution.result),\n replay: execution.replay,\n };\n}\n\nfunction createNativeReplayToolName(toolName: string) {\n return `${toolName}.native`;\n}\n\nfunction createRuntime<\n TInput,\n TMetadata extends HarnessMetadata,\n TTools extends PiAiToolset<TInput, TMetadata>,\n>({\n input,\n context,\n tools,\n toolReplay,\n executionState,\n messages,\n}: {\n input: TInput;\n context: HarnessContext<TMetadata>;\n tools: TTools | undefined;\n toolReplay: PiAiToolReplayPolicies<TInput, TMetadata> | undefined;\n executionState: PiToolExecutionState;\n messages: NormalizedMessage[];\n}): PiAiRuntime<TTools, TInput, TMetadata> & {\n toolCalls: ToolCallRecord[];\n} {\n const toolCalls: ToolCallRecord[] = [];\n const eventSink: PiAiEventSink = {\n message: (message) => {\n messages.push(message);\n },\n system: (content, metadata) => {\n messages.push({\n role: \"system\",\n content,\n metadata,\n });\n },\n user: (content, metadata) => {\n messages.push({\n role: \"user\",\n content,\n metadata,\n });\n },\n assistant: (content, metadata) => {\n messages.push({\n role: \"assistant\",\n content,\n metadata,\n });\n },\n tool: (name, content, metadata) => {\n messages.push({\n role: \"tool\",\n content,\n metadata: {\n name,\n ...(metadata ?? {}),\n },\n });\n },\n };\n\n const runtimeTools = Object.fromEntries(\n Object.entries(tools ?? {}).map(([toolName, tool]) => [\n toolName,\n async (args: Record<string, JsonValue>) => {\n const startedAt = new Date();\n const isNativeImplementationCall = hasActiveNativeToolExecution(\n executionState,\n toolName,\n );\n const toolContext = {\n input,\n metadata: context.metadata,\n signal: context.signal,\n setArtifact: context.setArtifact,\n } satisfies PiAiToolContext<TInput, TMetadata>;\n\n try {\n const execution = await executeToolWithReplay({\n toolName,\n tool,\n replay: isNativeImplementationCall\n ? undefined\n : toolReplay?.[toolName],\n args,\n context: toolContext,\n });\n const finishedAt = new Date();\n\n if (isNativeImplementationCall) {\n return execution.result;\n }\n\n const call = {\n name: toolName,\n arguments: args,\n result: execution.result,\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n metadata: normalizeReplayMetadata(execution.replay),\n } satisfies ToolCallRecord;\n toolCalls.push(call);\n messages.push({\n role: \"assistant\",\n toolCalls: [call],\n });\n messages.push({\n role: \"tool\",\n content: execution.result,\n metadata: {\n name: toolName,\n },\n });\n return execution.result;\n } catch (error) {\n const finishedAt = new Date();\n if (isNativeImplementationCall) {\n throw error;\n }\n\n const call = {\n name: toolName,\n arguments: args,\n error: serializeToolCallError(error),\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n metadata: normalizeReplayMetadata(\n getReplayMetadataFromError(error),\n ),\n } satisfies ToolCallRecord;\n toolCalls.push(call);\n messages.push({\n role: \"assistant\",\n toolCalls: [call],\n });\n throw error;\n }\n },\n ]),\n ) as unknown as PiAiRuntime<TTools, TInput, TMetadata>[\"tools\"];\n\n return {\n tools: runtimeTools,\n events: eventSink,\n signal: context.signal,\n toolCalls,\n };\n}\n\nfunction resolveOutput(result: unknown): JsonValue | undefined {\n if (!result || typeof result !== \"object\") {\n return toJsonValue(result);\n }\n\n const candidates = [\n \"output\",\n \"decision\",\n \"result\",\n \"final\",\n ] satisfies string[];\n\n for (const key of candidates) {\n const value = (result as Record<string, unknown>)[key];\n const normalized = toJsonValue(value);\n if (normalized !== undefined) {\n return normalized;\n }\n }\n\n return undefined;\n}\n\nfunction normalizeToolResult(result: unknown): JsonValue | undefined {\n const details =\n result && typeof result === \"object\"\n ? toJsonValue((result as { details?: unknown }).details)\n : undefined;\n if (details !== undefined) {\n return details;\n }\n\n return (\n toJsonValue(result) ?? (result === undefined ? undefined : String(result))\n );\n}\n\nfunction normalizeReplayToolResult(result: unknown): JsonValue {\n return normalizeToolResult(result) ?? null;\n}\n\ntype NativeToolReplayEnvelope = {\n __vitestEvals: {\n kind: \"pi-ai-native-tool-result\";\n version: 2;\n };\n agentResult: JsonValue;\n normalizedResult: JsonValue;\n};\n\ntype LegacyNativeToolReplayEnvelope = {\n __vitestEvals: {\n kind: \"pi-ai-native-tool-result\";\n version: 1;\n };\n normalizedResult: JsonValue;\n agentResult?: JsonValue;\n};\n\nfunction createNativeToolReplayEnvelope(\n result: unknown,\n): NativeToolReplayEnvelope {\n const normalizedResult = normalizeReplayToolResult(result);\n\n return {\n __vitestEvals: {\n kind: \"pi-ai-native-tool-result\",\n version: 2,\n },\n agentResult: toJsonValue(result) ?? normalizedResult,\n normalizedResult,\n };\n}\n\nfunction resolveNativeToolReplayResult(result: JsonValue) {\n if (isNativeToolReplayEnvelope(result)) {\n return {\n result: result.agentResult,\n normalizedResult: result.normalizedResult,\n };\n }\n\n if (isLegacyNativeToolReplayEnvelope(result)) {\n return {\n result: result.agentResult ?? result.normalizedResult,\n normalizedResult: result.normalizedResult,\n };\n }\n\n return {\n result,\n normalizedResult: normalizeReplayToolResult(result),\n };\n}\n\nfunction isNativeToolReplayEnvelope(\n value: unknown,\n): value is NativeToolReplayEnvelope {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n \"__vitestEvals\" in value &&\n isNativeToolReplayMarker(\n (value as { __vitestEvals?: unknown }).__vitestEvals,\n ) &&\n \"agentResult\" in value &&\n \"normalizedResult\" in value,\n );\n}\n\nfunction isNativeToolReplayMarker(\n value: unknown,\n): value is NativeToolReplayEnvelope[\"__vitestEvals\"] {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n \"kind\" in value &&\n (value as { kind?: unknown }).kind === \"pi-ai-native-tool-result\" &&\n \"version\" in value &&\n (value as { version?: unknown }).version === 2,\n );\n}\n\nfunction isLegacyNativeToolReplayEnvelope(\n value: unknown,\n): value is LegacyNativeToolReplayEnvelope {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n \"__vitestEvals\" in value &&\n isLegacyNativeToolReplayMarker(\n (value as { __vitestEvals?: unknown }).__vitestEvals,\n ) &&\n \"normalizedResult\" in value,\n );\n}\n\nfunction isLegacyNativeToolReplayMarker(\n value: unknown,\n): value is LegacyNativeToolReplayEnvelope[\"__vitestEvals\"] {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n \"kind\" in value &&\n (value as { kind?: unknown }).kind === \"pi-ai-native-tool-result\" &&\n \"version\" in value &&\n (value as { version?: unknown }).version === 1,\n );\n}\n\nfunction resolveUsage(result: unknown, toolCallCount: number): UsageSummary {\n if (!result || typeof result !== \"object\") {\n return toolCallCount > 0 ? { toolCalls: toolCallCount } : {};\n }\n\n const usageValue =\n (result as Record<string, unknown>).usage ??\n (result as Record<string, unknown>).metrics;\n\n const usage =\n usageValue && typeof usageValue === \"object\"\n ? ({ ...(usageValue as Record<string, unknown>) } as UsageSummary)\n : {};\n\n if (usage.toolCalls === undefined && toolCallCount > 0) {\n usage.toolCalls = toolCallCount;\n }\n\n return usage;\n}\n\nfunction resolveSession(\n result: unknown,\n messages: NormalizedMessage[],\n output: JsonValue | undefined,\n usage: UsageSummary,\n): NormalizedSession {\n if (\n isNormalizedSession(\n (result as Record<string, unknown> | undefined)?.session,\n )\n ) {\n return (result as { session: NormalizedSession }).session;\n }\n\n if (\n isNormalizedSession((result as Record<string, unknown> | undefined)?.trace)\n ) {\n return (result as { trace: NormalizedSession }).trace;\n }\n\n const sessionMessages = [...messages];\n if (\n output !== undefined &&\n !sessionMessages.some(\n (message) =>\n message.role === \"assistant\" && message.content !== undefined,\n )\n ) {\n sessionMessages.push({\n role: \"assistant\",\n content: output,\n });\n }\n\n return {\n messages: sessionMessages,\n outputText: typeof output === \"string\" ? output : undefined,\n provider:\n ((result as Record<string, unknown> | undefined)?.provider as\n | string\n | undefined) ?? usage.provider,\n model:\n ((result as Record<string, unknown> | undefined)?.model as\n | string\n | undefined) ?? usage.model,\n };\n}\n\nfunction resolveErrors(result: unknown): Array<Record<string, JsonValue>> {\n return resolveHarnessRunErrors(result);\n}\n\nasync function executeToolWithReplay<\n TArgs extends Record<string, JsonValue>,\n TResult extends JsonValue,\n TInput,\n TMetadata extends HarnessMetadata,\n>({\n toolName,\n tool,\n replay,\n args,\n context,\n}: {\n toolName: string;\n tool: PiAiToolDefinition<TArgs, TResult, TInput, TMetadata>;\n replay: PiAiToolReplayPolicy<TInput, TMetadata> | undefined;\n args: TArgs;\n context: PiAiToolContext<TInput, TMetadata>;\n}) {\n return executeWithReplay<\n Record<string, JsonValue>,\n JsonValue,\n PiAiToolContext<TInput, TMetadata>\n >({\n toolName,\n args,\n context,\n execute: (toolArgs, toolContext) =>\n tool.execute(toolArgs as TArgs, toolContext),\n replay,\n });\n}\n"],"mappings":"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","names":[]}
package/dist/index.mjs CHANGED
@@ -19,7 +19,10 @@ function piAiHarness(options) {
19
19
  name: options.name ?? "pi-ai",
20
20
  prompt: options.prompt,
21
21
  run: async (input, context) => {
22
- const agent = await resolveAgent(options);
22
+ const agent = await resolveAgent(options, {
23
+ input,
24
+ context
25
+ });
23
26
  const messages = [
24
27
  {
25
28
  role: "user",
@@ -53,10 +56,13 @@ function piAiHarness(options) {
53
56
  };
54
57
  }
55
58
  async function executePiHarnessRun(options, agent, input, context, messages, runtimeTools, nativeToolsets) {
59
+ const executionState = createPiToolExecutionState();
56
60
  const runtime = createRuntime({
57
61
  input,
58
62
  context,
59
63
  tools: runtimeTools,
64
+ toolReplay: options.toolReplay,
65
+ executionState,
60
66
  messages
61
67
  });
62
68
  try {
@@ -67,7 +73,9 @@ async function executePiHarnessRun(options, agent, input, context, messages, run
67
73
  input,
68
74
  context,
69
75
  messages,
70
- toolCalls: runtime.toolCalls
76
+ toolCalls: runtime.toolCalls,
77
+ toolReplay: options.toolReplay,
78
+ executionState
71
79
  },
72
80
  () => runAgent(options, {
73
81
  agent,
@@ -113,12 +121,12 @@ async function executePiHarnessRun(options, agent, input, context, messages, run
113
121
  throw attachHarnessRunToError(error, run);
114
122
  }
115
123
  }
116
- async function resolveAgent(options) {
124
+ async function resolveAgent(options, args) {
117
125
  if (options.agent !== void 0) {
118
126
  return options.agent;
119
127
  }
120
128
  if (options.createAgent) {
121
- return options.createAgent();
129
+ return options.createAgent(args);
122
130
  }
123
131
  throw new Error(
124
132
  "piAiHarness requires either an agent instance or a createAgent() function."
@@ -245,12 +253,16 @@ async function withInstrumentedAgentTools(agent, toolsets, args, callback) {
245
253
  signal: args.context.signal,
246
254
  setArtifact: args.context.setArtifact
247
255
  };
256
+ const leaveNativeTool = enterNativeToolExecution(
257
+ args.executionState,
258
+ tool.name
259
+ );
248
260
  try {
249
261
  const execution = await executeNativeToolWithReplay({
250
262
  toolName: tool.name,
251
263
  toolCallId,
252
264
  execute: originalExecute,
253
- replay: tool.replay,
265
+ replay: args.toolReplay?.[tool.name],
254
266
  args: rawArgs,
255
267
  context: toolContext
256
268
  });
@@ -294,6 +306,8 @@ async function withInstrumentedAgentTools(agent, toolsets, args, callback) {
294
306
  toolCalls: [call]
295
307
  });
296
308
  throw error;
309
+ } finally {
310
+ leaveNativeTool();
297
311
  }
298
312
  };
299
313
  instrumentedExecute[ORIGINAL_NATIVE_EXECUTE] = originalExecute;
@@ -370,6 +384,28 @@ function getNativeToolExecuteOrigin(execute) {
370
384
  const nativeExecute = execute;
371
385
  return nativeExecute[ORIGINAL_NATIVE_EXECUTE] ?? nativeExecute;
372
386
  }
387
+ function createPiToolExecutionState() {
388
+ return {
389
+ activeNativeToolNames: /* @__PURE__ */ new Map()
390
+ };
391
+ }
392
+ function enterNativeToolExecution(state, toolName) {
393
+ state.activeNativeToolNames.set(
394
+ toolName,
395
+ (state.activeNativeToolNames.get(toolName) ?? 0) + 1
396
+ );
397
+ return () => {
398
+ const nextCount = (state.activeNativeToolNames.get(toolName) ?? 1) - 1;
399
+ if (nextCount <= 0) {
400
+ state.activeNativeToolNames.delete(toolName);
401
+ return;
402
+ }
403
+ state.activeNativeToolNames.set(toolName, nextCount);
404
+ };
405
+ }
406
+ function hasActiveNativeToolExecution(state, toolName) {
407
+ return (state.activeNativeToolNames.get(toolName) ?? 0) > 0;
408
+ }
373
409
  async function executeNativeToolWithReplay({
374
410
  toolName,
375
411
  toolCallId,
@@ -381,7 +417,7 @@ async function executeNativeToolWithReplay({
381
417
  let didExecute = false;
382
418
  let liveResult;
383
419
  const execution = await executeWithReplay({
384
- toolName,
420
+ toolName: createNativeReplayToolName(toolName),
385
421
  args,
386
422
  context,
387
423
  execute: async (toolArgs) => {
@@ -403,10 +439,15 @@ async function executeNativeToolWithReplay({
403
439
  replay: execution.replay
404
440
  };
405
441
  }
442
+ function createNativeReplayToolName(toolName) {
443
+ return `${toolName}.native`;
444
+ }
406
445
  function createRuntime({
407
446
  input,
408
447
  context,
409
448
  tools,
449
+ toolReplay,
450
+ executionState,
410
451
  messages
411
452
  }) {
412
453
  const toolCalls = [];
@@ -451,6 +492,10 @@ function createRuntime({
451
492
  toolName,
452
493
  async (args) => {
453
494
  const startedAt = /* @__PURE__ */ new Date();
495
+ const isNativeImplementationCall = hasActiveNativeToolExecution(
496
+ executionState,
497
+ toolName
498
+ );
454
499
  const toolContext = {
455
500
  input,
456
501
  metadata: context.metadata,
@@ -461,10 +506,14 @@ function createRuntime({
461
506
  const execution = await executeToolWithReplay({
462
507
  toolName,
463
508
  tool,
509
+ replay: isNativeImplementationCall ? void 0 : toolReplay?.[toolName],
464
510
  args,
465
511
  context: toolContext
466
512
  });
467
513
  const finishedAt = /* @__PURE__ */ new Date();
514
+ if (isNativeImplementationCall) {
515
+ return execution.result;
516
+ }
468
517
  const call = {
469
518
  name: toolName,
470
519
  arguments: args,
@@ -489,6 +538,9 @@ function createRuntime({
489
538
  return execution.result;
490
539
  } catch (error) {
491
540
  const finishedAt = /* @__PURE__ */ new Date();
541
+ if (isNativeImplementationCall) {
542
+ throw error;
543
+ }
492
544
  const call = {
493
545
  name: toolName,
494
546
  arguments: args,
@@ -641,6 +693,7 @@ function resolveErrors(result) {
641
693
  async function executeToolWithReplay({
642
694
  toolName,
643
695
  tool,
696
+ replay,
644
697
  args,
645
698
  context
646
699
  }) {
@@ -648,8 +701,8 @@ async function executeToolWithReplay({
648
701
  toolName,
649
702
  args,
650
703
  context,
651
- execute: tool.execute,
652
- replay: tool.replay
704
+ execute: (toolArgs, toolContext) => tool.execute(toolArgs, toolContext),
705
+ replay
653
706
  });
654
707
  }
655
708
  export {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type {\n Harness,\n HarnessContext,\n HarnessMetadata,\n HarnessPrompt,\n HarnessRun,\n JsonValue,\n NormalizedMessage,\n NormalizedSession,\n TimingSummary,\n ToolCallRecord,\n UsageSummary,\n} from \"vitest-evals/harness\";\nimport {\n attachHarnessRunToError,\n isHarnessRun,\n isNormalizedSession,\n normalizeContent,\n resolveHarnessRunErrors,\n serializeError,\n toJsonValue,\n} from \"vitest-evals/harness\";\nimport {\n executeWithReplay,\n getReplayMetadataFromError,\n normalizeReplayMetadata,\n} from \"vitest-evals/replay\";\nimport type {\n ReplayMode,\n ToolRecording,\n ToolReplayConfig,\n} from \"vitest-evals/replay\";\n\ntype MaybePromise<T> = T | Promise<T>;\ntype AnyPiAiToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<string, PiAiToolDefinition<any, any, TInput, TMetadata>>;\ntype InferredPiAiToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<\n string,\n PiAiToolDefinition<Record<string, JsonValue>, JsonValue, TInput, TMetadata>\n>;\n\ntype PiAgentToolLike<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = {\n name: string;\n replay?:\n | boolean\n | PiAiToolReplayConfig<\n Record<string, JsonValue>,\n JsonValue,\n TInput,\n TMetadata\n >;\n execute: (toolCallId: string, args: Record<string, JsonValue>) => unknown;\n};\n\nconst ORIGINAL_NATIVE_EXECUTE = Symbol(\"vitest-evals.originalNativeExecute\");\n\ntype NativeToolExecute<\n TInput,\n TMetadata extends HarnessMetadata,\n> = PiAgentToolLike<TInput, TMetadata>[\"execute\"] & {\n [ORIGINAL_NATIVE_EXECUTE]?: PiAgentToolLike<TInput, TMetadata>[\"execute\"];\n};\n\nexport type PiAiReplayMode = ReplayMode;\n\nexport interface PiAiEventSink {\n message: (message: NormalizedMessage) => void;\n system: (content: JsonValue, metadata?: Record<string, JsonValue>) => void;\n user: (content: JsonValue, metadata?: Record<string, JsonValue>) => void;\n assistant: (content: JsonValue, metadata?: Record<string, JsonValue>) => void;\n tool: (\n name: string,\n content: JsonValue,\n metadata?: Record<string, JsonValue>,\n ) => void;\n}\n\nexport interface PiAiToolContext<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> {\n input: TInput;\n metadata: HarnessContext<TMetadata>[\"metadata\"];\n signal?: AbortSignal;\n setArtifact: HarnessContext<TMetadata>[\"setArtifact\"];\n}\n\nexport type PiAiToolRecording<\n TArgs extends Record<string, JsonValue> = Record<string, JsonValue>,\n TResult extends JsonValue = JsonValue,\n> = ToolRecording<TArgs, TResult>;\n\nexport type PiAiToolReplayConfig<\n TArgs extends Record<string, JsonValue> = Record<string, JsonValue>,\n TResult extends JsonValue = JsonValue,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = ToolReplayConfig<TArgs, TResult, PiAiToolContext<TInput, TMetadata>>;\n\nexport interface PiAiToolDefinition<\n TArgs extends Record<string, JsonValue> = Record<string, JsonValue>,\n TResult extends JsonValue = JsonValue,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> {\n description?: string;\n replay?: boolean | PiAiToolReplayConfig<TArgs, TResult, TInput, TMetadata>;\n execute: (\n args: TArgs,\n context: PiAiToolContext<TInput, TMetadata>,\n ) => MaybePromise<TResult>;\n}\n\nexport type PiAiToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = AnyPiAiToolset<TInput, TMetadata>;\n\ntype ToolArgs<TTool> = TTool extends PiAiToolDefinition<\n infer TArgs,\n infer _TResult,\n infer _TInput,\n infer _TMetadata\n>\n ? TArgs\n : never;\n\ntype ToolResult<TTool> = TTool extends PiAiToolDefinition<\n infer _TArgs,\n infer TResult,\n infer _TInput,\n infer _TMetadata\n>\n ? TResult\n : never;\n\nexport type PiAiRuntime<\n TTools extends PiAiToolset<TInput, TMetadata>,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = {\n tools: {\n [K in keyof TTools]: (\n args: ToolArgs<TTools[K]>,\n ) => Promise<ToolResult<TTools[K]>>;\n };\n events: PiAiEventSink;\n signal?: AbortSignal;\n};\n\nexport interface PiAiHarnessRunArgs<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TTools extends PiAiToolset<TInput, TMetadata>,\n> {\n agent: TAgent;\n input: TInput;\n context: HarnessContext<TMetadata>;\n runtime: PiAiRuntime<TTools, TInput, TMetadata>;\n}\n\nexport interface PiAiHarnessResultArgs<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n> extends PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools> {\n result: TResult;\n}\n\ninterface PiAiHarnessBaseOptions<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n> {\n agent?: TAgent;\n createAgent?: () => MaybePromise<TAgent>;\n normalize?: PiAiHarnessNormalizeOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools\n >;\n prompt: HarnessPrompt;\n name?: string;\n}\n\nexport interface PiAiHarnessWithToolsOptions<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n> extends PiAiHarnessBaseOptions<TAgent, TInput, TMetadata, TResult, TTools> {\n tools: TTools;\n run?: (\n args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n ) => MaybePromise<TResult | HarnessRun>;\n}\n\nexport interface PiAiHarnessInferredToolsOptions<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n> extends PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n InferredPiAiToolset<TInput, TMetadata>\n > {\n tools?: undefined;\n run?: (\n args: PiAiHarnessRunArgs<\n TAgent,\n TInput,\n TMetadata,\n InferredPiAiToolset<TInput, TMetadata>\n >,\n ) => MaybePromise<TResult | HarnessRun>;\n}\n\nexport type PiAiHarnessOptions<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n> =\n | PiAiHarnessWithToolsOptions<TAgent, TInput, TMetadata, TResult, TTools>\n | PiAiHarnessInferredToolsOptions<TAgent, TInput, TMetadata, TResult>;\n\ntype PiAiHarnessRunOptions<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n> = PiAiHarnessBaseOptions<TAgent, TInput, TMetadata, TResult, TTools> & {\n run?: (\n args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n ) => MaybePromise<TResult | HarnessRun>;\n};\n\ntype PiAiRunnableAgent<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n> = {\n run: (\n input: TInput,\n runtime: PiAiRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<TResult | HarnessRun>;\n};\n\nexport interface PiAiHarnessNormalizeOptions<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n> {\n session?: (\n args: PiAiHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n ) => MaybePromise<NormalizedSession>;\n output?: (\n args: PiAiHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n ) => MaybePromise<JsonValue | undefined>;\n usage?: (\n args: PiAiHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n ) => MaybePromise<UsageSummary>;\n timings?: (\n args: PiAiHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n ) => MaybePromise<TimingSummary | undefined>;\n errors?: (\n args: PiAiHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n ) => MaybePromise<Array<Record<string, JsonValue>>>;\n}\n\ntype InferredToolSurfaces<TInput, TMetadata extends HarnessMetadata> = {\n runtimeTools?: InferredPiAiToolset<TInput, TMetadata>;\n nativeToolsets?: Array<PiAgentToolLike<TInput, TMetadata>[]>;\n};\n\n/** Adapts a Pi agent runtime into a normalized vitest-evals harness. */\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n>(\n options: PiAiHarnessWithToolsOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools\n >,\n): Harness<TInput, TMetadata>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n>(\n options: PiAiHarnessInferredToolsOptions<TAgent, TInput, TMetadata, TResult>,\n): Harness<TInput, TMetadata>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n>(\n options: PiAiHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools>,\n): Harness<TInput, TMetadata> {\n return {\n name: options.name ?? \"pi-ai\",\n prompt: options.prompt,\n run: async (input, context) => {\n const agent = await resolveAgent(options);\n const messages: NormalizedMessage[] = [\n {\n role: \"user\",\n content: normalizeContent(input),\n },\n ];\n const inferredTools = resolveInferredToolSurfaces<TInput, TMetadata>(\n agent,\n );\n\n if (hasExplicitToolset(options)) {\n return executePiHarnessRun(\n options,\n agent,\n input,\n context,\n messages,\n options.tools,\n inferredTools.nativeToolsets,\n );\n }\n\n return executePiHarnessRun(\n options,\n agent,\n input,\n context,\n messages,\n inferredTools.runtimeTools,\n inferredTools.nativeToolsets,\n );\n },\n };\n}\n\nasync function executePiHarnessRun<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n>(\n options: PiAiHarnessRunOptions<TAgent, TInput, TMetadata, TResult, TTools>,\n agent: TAgent,\n input: TInput,\n context: HarnessContext<TMetadata>,\n messages: NormalizedMessage[],\n runtimeTools: TTools | undefined,\n nativeToolsets?: Array<PiAgentToolLike<TInput, TMetadata>[]>,\n): Promise<HarnessRun> {\n const runtime = createRuntime({\n input,\n context,\n tools: runtimeTools,\n messages,\n });\n\n try {\n const result = await withInstrumentedAgentTools(\n agent,\n nativeToolsets,\n {\n input,\n context,\n messages,\n toolCalls: runtime.toolCalls,\n },\n () =>\n runAgent(options, {\n agent,\n input,\n context,\n runtime,\n }),\n );\n\n if (isHarnessRun(result) && !hasResultOverrides(options)) {\n if (Object.keys(context.artifacts).length > 0 && !result.artifacts) {\n result.artifacts = context.artifacts;\n }\n return result;\n }\n\n const normalizeResult = result as TResult;\n const resultArgs = {\n agent,\n input,\n context,\n runtime,\n result: normalizeResult,\n } satisfies PiAiHarnessResultArgs<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools\n >;\n\n const output = options.normalize?.output\n ? await options.normalize.output(resultArgs)\n : resolveOutput(normalizeResult);\n const usage = options.normalize?.usage\n ? await options.normalize.usage(resultArgs)\n : resolveUsage(normalizeResult, runtime.toolCalls.length);\n const session = options.normalize?.session\n ? await options.normalize.session(resultArgs)\n : resolveSession(normalizeResult, messages, output, usage);\n\n return {\n session,\n output,\n usage,\n timings: options.normalize?.timings\n ? await options.normalize.timings(resultArgs)\n : undefined,\n artifacts:\n Object.keys(context.artifacts).length > 0\n ? context.artifacts\n : undefined,\n errors: options.normalize?.errors\n ? await options.normalize.errors(resultArgs)\n : resolveErrors(normalizeResult),\n };\n } catch (error) {\n const usage = resolveUsage(undefined, runtime.toolCalls.length);\n const run = {\n session: resolveSession(undefined, messages, undefined, usage),\n output: undefined,\n usage,\n artifacts:\n Object.keys(context.artifacts).length > 0\n ? context.artifacts\n : undefined,\n errors: [serializeError(error)],\n } satisfies HarnessRun;\n\n throw attachHarnessRunToError(error, run);\n }\n}\n\nasync function resolveAgent<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n>(options: PiAiHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools>) {\n if (options.agent !== undefined) {\n return options.agent;\n }\n\n if (options.createAgent) {\n return options.createAgent();\n }\n\n throw new Error(\n \"piAiHarness requires either an agent instance or a createAgent() function.\",\n );\n}\n\nfunction hasResultOverrides<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n>(options: PiAiHarnessRunOptions<TAgent, TInput, TMetadata, TResult, TTools>) {\n return Boolean(\n options.normalize?.output ??\n options.normalize?.session ??\n options.normalize?.usage ??\n options.normalize?.timings ??\n options.normalize?.errors,\n );\n}\n\nfunction resolveInferredToolSurfaces<TInput, TMetadata extends HarnessMetadata>(\n agent: unknown,\n): InferredToolSurfaces<TInput, TMetadata> {\n let runtimeTools: InferredPiAiToolset<TInput, TMetadata> | undefined;\n const nativeToolsets: Array<PiAgentToolLike<TInput, TMetadata>[]> = [];\n const seenToolsets = new Set<PiAgentToolLike<TInput, TMetadata>[]>();\n\n for (const candidate of getAgentToolCandidates(agent)) {\n const nextRuntimeTools = getRuntimeToolset<TInput, TMetadata>(candidate);\n if (runtimeTools === undefined && nextRuntimeTools !== undefined) {\n runtimeTools = nextRuntimeTools;\n }\n\n const nativeTools = getNativeToolArray(candidate);\n if (nativeTools && !seenToolsets.has(nativeTools)) {\n seenToolsets.add(nativeTools);\n nativeToolsets.push(nativeTools);\n }\n }\n\n return {\n ...(runtimeTools ? { runtimeTools } : {}),\n ...(nativeToolsets.length > 0 ? { nativeToolsets } : {}),\n };\n}\n\nfunction getAgentToolCandidates(agent: unknown): object[] {\n const roots = getAgentRoots(agent);\n const candidates: object[] = [];\n const seen = new Set<object>();\n\n for (const root of roots) {\n addUniqueObject(candidates, seen, root);\n addUniqueObject(candidates, seen, getObjectProperty(root, \"state\"));\n addUniqueObject(candidates, seen, getObjectProperty(root, \"initialState\"));\n }\n\n return candidates;\n}\n\nfunction getAgentRoots(agent: unknown): object[] {\n return [asObject(agent)]\n .concat(asObject(getObjectProperty(agent, \"agent\")))\n .filter((value): value is object => value !== undefined);\n}\n\nfunction addUniqueObject(\n candidates: object[],\n seen: Set<object>,\n value: unknown,\n) {\n if (!value || typeof value !== \"object\" || seen.has(value)) {\n return;\n }\n\n seen.add(value);\n candidates.push(value);\n}\n\nfunction asObject(value: unknown): object | undefined {\n return value && typeof value === \"object\" ? value : undefined;\n}\n\nfunction getObjectProperty(value: unknown, key: string): unknown {\n return value && typeof value === \"object\"\n ? (value as Record<string, unknown>)[key]\n : undefined;\n}\n\nfunction getRuntimeToolset<TInput, TMetadata extends HarnessMetadata>(\n value: object,\n): InferredPiAiToolset<TInput, TMetadata> | undefined {\n const candidate =\n getObjectProperty(value, \"tools\") ?? getObjectProperty(value, \"toolset\");\n\n return isPiAiToolset(candidate)\n ? (candidate as InferredPiAiToolset<TInput, TMetadata>)\n : undefined;\n}\n\nfunction getNativeToolArray<TInput, TMetadata extends HarnessMetadata>(\n value: object,\n): PiAgentToolLike<TInput, TMetadata>[] | undefined {\n const candidate = getObjectProperty(value, \"tools\");\n if (isAgentToolArray(candidate)) {\n return candidate as PiAgentToolLike<TInput, TMetadata>[];\n }\n\n return undefined;\n}\n\nasync function runAgent<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n>(\n options: PiAiHarnessRunOptions<TAgent, TInput, TMetadata, TResult, TTools>,\n args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n): Promise<TResult | HarnessRun> {\n if (options.run) {\n return options.run(args);\n }\n\n if (hasPiAiRunMethod<TInput, TMetadata, TResult, TTools>(args.agent)) {\n return args.agent.run(args.input, args.runtime);\n }\n\n throw new Error(\n \"piAiHarness requires a run() function unless the provided agent exposes run(input, runtime).\",\n );\n}\n\nfunction hasExplicitToolset<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n>(\n options: PiAiHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools>,\n): options is PiAiHarnessWithToolsOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools\n> {\n return options.tools !== undefined;\n}\n\nfunction hasPiAiRunMethod<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n>(\n agent: unknown,\n): agent is PiAiRunnableAgent<TInput, TMetadata, TResult, TTools> {\n if (!agent || typeof agent !== \"object\") {\n return false;\n }\n\n return (\n \"run\" in agent && typeof (agent as { run?: unknown }).run === \"function\"\n );\n}\n\nfunction isPiAiToolset(value: unknown): value is PiAiToolset {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return false;\n }\n\n const tools = Object.values(value);\n return (\n tools.length > 0 &&\n tools.every((tool) =>\n Boolean(\n tool &&\n typeof tool === \"object\" &&\n \"execute\" in tool &&\n typeof (tool as { execute?: unknown }).execute === \"function\",\n ),\n )\n );\n}\n\nfunction isAgentToolArray(value: unknown): value is PiAgentToolLike[] {\n return (\n Array.isArray(value) &&\n value.every((tool) =>\n Boolean(\n tool &&\n typeof tool === \"object\" &&\n \"name\" in tool &&\n typeof (tool as { name?: unknown }).name === \"string\" &&\n \"execute\" in tool &&\n typeof (tool as { execute?: unknown }).execute === \"function\",\n ),\n )\n );\n}\n\nasync function withInstrumentedAgentTools<\n TResult,\n TInput,\n TMetadata extends HarnessMetadata,\n>(\n agent: unknown,\n toolsets: Array<PiAgentToolLike<TInput, TMetadata>[]> | undefined,\n args: {\n input: TInput;\n context: HarnessContext<TMetadata>;\n messages: NormalizedMessage[];\n toolCalls: ToolCallRecord[];\n },\n callback: () => Promise<TResult>,\n) {\n if (!toolsets || toolsets.length === 0) {\n return callback();\n }\n\n const originalExecutions = new Map<\n PiAgentToolLike<TInput, TMetadata>,\n PiAgentToolLike<TInput, TMetadata>[\"execute\"]\n >();\n const originalResets = new Map<ResettableAgent, ResettableAgent[\"reset\"]>();\n\n const patchTool = (tool: PiAgentToolLike<TInput, TMetadata>) => {\n if (originalExecutions.has(tool)) {\n return;\n }\n\n const originalExecute = getNativeToolExecuteOrigin(tool.execute);\n originalExecutions.set(tool, originalExecute);\n const instrumentedExecute: NativeToolExecute<TInput, TMetadata> = async (\n toolCallId: string,\n rawArgs: Record<string, JsonValue>,\n ) => {\n const startedAt = new Date();\n const toolContext = {\n input: args.input,\n metadata: args.context.metadata,\n signal: args.context.signal,\n setArtifact: args.context.setArtifact,\n } satisfies PiAiToolContext<TInput, TMetadata>;\n\n try {\n const execution = await executeNativeToolWithReplay({\n toolName: tool.name,\n toolCallId,\n execute: originalExecute,\n replay: tool.replay,\n args: rawArgs,\n context: toolContext,\n });\n const finishedAt = new Date();\n const call = {\n name: tool.name,\n arguments: rawArgs,\n result: execution.normalizedResult,\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n metadata: normalizeReplayMetadata(execution.replay),\n } satisfies ToolCallRecord;\n args.toolCalls.push(call);\n args.messages.push({\n role: \"assistant\",\n toolCalls: [call],\n });\n args.messages.push({\n role: \"tool\",\n content: execution.normalizedResult,\n metadata: {\n name: tool.name,\n },\n });\n return execution.result;\n } catch (error) {\n const finishedAt = new Date();\n const call = {\n name: tool.name,\n arguments: rawArgs,\n error: serializeToolCallError(error),\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n metadata: normalizeReplayMetadata(getReplayMetadataFromError(error)),\n } satisfies ToolCallRecord;\n args.toolCalls.push(call);\n args.messages.push({\n role: \"assistant\",\n toolCalls: [call],\n });\n throw error;\n }\n };\n instrumentedExecute[ORIGINAL_NATIVE_EXECUTE] = originalExecute;\n tool.execute = instrumentedExecute;\n };\n\n const patchToolsets = (\n nextToolsets: Array<PiAgentToolLike<TInput, TMetadata>[]>,\n ) => {\n for (const toolset of nextToolsets) {\n for (const tool of toolset) {\n patchTool(tool);\n }\n }\n };\n\n patchToolsets(toolsets);\n\n for (const target of getAgentResetTargets(agent)) {\n const originalReset = target.reset;\n originalResets.set(target, originalReset);\n target.reset = function patchedReset(this: ResettableAgent, ...resetArgs) {\n const resetResult = originalReset.apply(this, resetArgs);\n\n if (isPromiseLike(resetResult)) {\n return resetResult.finally(() => {\n patchToolsets(\n resolveInferredNativeToolsets<TInput, TMetadata>(agent),\n );\n });\n }\n\n patchToolsets(resolveInferredNativeToolsets<TInput, TMetadata>(agent));\n return resetResult;\n };\n }\n\n try {\n return await callback();\n } finally {\n for (const [target, originalReset] of originalResets) {\n target.reset = originalReset;\n }\n\n for (const [tool, originalExecute] of originalExecutions) {\n tool.execute = originalExecute;\n }\n }\n}\n\ntype ResettableAgent = {\n reset: (...args: unknown[]) => unknown;\n};\n\nfunction getAgentResetTargets(agent: unknown): ResettableAgent[] {\n return getAgentRoots(agent).filter(isResettableAgent);\n}\n\nfunction isResettableAgent(value: object): value is ResettableAgent {\n return \"reset\" in value && typeof value.reset === \"function\";\n}\n\nfunction resolveInferredNativeToolsets<\n TInput,\n TMetadata extends HarnessMetadata,\n>(agent: unknown): Array<PiAgentToolLike<TInput, TMetadata>[]> {\n const toolsets: Array<PiAgentToolLike<TInput, TMetadata>[]> = [];\n const seenToolsets = new Set<PiAgentToolLike<TInput, TMetadata>[]>();\n\n for (const candidate of getAgentToolCandidates(agent)) {\n const nativeTools = getNativeToolArray(candidate);\n if (nativeTools && !seenToolsets.has(nativeTools)) {\n seenToolsets.add(nativeTools);\n toolsets.push(nativeTools);\n }\n }\n\n return toolsets;\n}\n\nfunction isPromiseLike(value: unknown): value is Promise<unknown> {\n return Boolean(\n value && typeof (value as { then?: unknown }).then === \"function\",\n );\n}\n\nfunction serializeToolCallError(\n error: unknown,\n): NonNullable<ToolCallRecord[\"error\"]> {\n const serialized = serializeError(error);\n const { message, type, ...details } = serialized;\n\n return {\n ...details,\n message: typeof message === \"string\" ? message : String(message),\n ...(typeof type === \"string\" ? { type } : {}),\n };\n}\n\nfunction getNativeToolExecuteOrigin<TInput, TMetadata extends HarnessMetadata>(\n execute: PiAgentToolLike<TInput, TMetadata>[\"execute\"],\n) {\n const nativeExecute = execute as NativeToolExecute<TInput, TMetadata>;\n return nativeExecute[ORIGINAL_NATIVE_EXECUTE] ?? nativeExecute;\n}\n\nasync function executeNativeToolWithReplay<\n TInput,\n TMetadata extends HarnessMetadata,\n>({\n toolName,\n toolCallId,\n execute,\n replay,\n args,\n context,\n}: {\n toolName: string;\n toolCallId: string;\n execute: PiAgentToolLike<TInput, TMetadata>[\"execute\"];\n replay: PiAgentToolLike<TInput, TMetadata>[\"replay\"];\n args: Record<string, JsonValue>;\n context: PiAiToolContext<TInput, TMetadata>;\n}) {\n let didExecute = false;\n let liveResult: unknown;\n\n const execution = await executeWithReplay({\n toolName,\n args,\n context,\n execute: async (toolArgs) => {\n didExecute = true;\n liveResult = await execute(toolCallId, toolArgs);\n return createNativeToolReplayEnvelope(liveResult);\n },\n replay,\n });\n\n if (didExecute) {\n return {\n result: liveResult,\n normalizedResult: normalizeReplayToolResult(liveResult),\n replay: execution.replay,\n };\n }\n\n return {\n ...resolveNativeToolReplayResult(execution.result),\n replay: execution.replay,\n };\n}\n\nfunction createRuntime<\n TInput,\n TMetadata extends HarnessMetadata,\n TTools extends PiAiToolset<TInput, TMetadata>,\n>({\n input,\n context,\n tools,\n messages,\n}: {\n input: TInput;\n context: HarnessContext<TMetadata>;\n tools: TTools | undefined;\n messages: NormalizedMessage[];\n}): PiAiRuntime<TTools, TInput, TMetadata> & {\n toolCalls: ToolCallRecord[];\n} {\n const toolCalls: ToolCallRecord[] = [];\n const eventSink: PiAiEventSink = {\n message: (message) => {\n messages.push(message);\n },\n system: (content, metadata) => {\n messages.push({\n role: \"system\",\n content,\n metadata,\n });\n },\n user: (content, metadata) => {\n messages.push({\n role: \"user\",\n content,\n metadata,\n });\n },\n assistant: (content, metadata) => {\n messages.push({\n role: \"assistant\",\n content,\n metadata,\n });\n },\n tool: (name, content, metadata) => {\n messages.push({\n role: \"tool\",\n content,\n metadata: {\n name,\n ...(metadata ?? {}),\n },\n });\n },\n };\n\n const runtimeTools = Object.fromEntries(\n Object.entries(tools ?? {}).map(([toolName, tool]) => [\n toolName,\n async (args: Record<string, JsonValue>) => {\n const startedAt = new Date();\n const toolContext = {\n input,\n metadata: context.metadata,\n signal: context.signal,\n setArtifact: context.setArtifact,\n } satisfies PiAiToolContext<TInput, TMetadata>;\n\n try {\n const execution = await executeToolWithReplay({\n toolName,\n tool,\n args,\n context: toolContext,\n });\n const finishedAt = new Date();\n const call = {\n name: toolName,\n arguments: args,\n result: execution.result,\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n metadata: normalizeReplayMetadata(execution.replay),\n } satisfies ToolCallRecord;\n toolCalls.push(call);\n messages.push({\n role: \"assistant\",\n toolCalls: [call],\n });\n messages.push({\n role: \"tool\",\n content: execution.result,\n metadata: {\n name: toolName,\n },\n });\n return execution.result;\n } catch (error) {\n const finishedAt = new Date();\n const call = {\n name: toolName,\n arguments: args,\n error: serializeToolCallError(error),\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n metadata: normalizeReplayMetadata(\n getReplayMetadataFromError(error),\n ),\n } satisfies ToolCallRecord;\n toolCalls.push(call);\n messages.push({\n role: \"assistant\",\n toolCalls: [call],\n });\n throw error;\n }\n },\n ]),\n ) as unknown as PiAiRuntime<TTools, TInput, TMetadata>[\"tools\"];\n\n return {\n tools: runtimeTools,\n events: eventSink,\n signal: context.signal,\n toolCalls,\n };\n}\n\nfunction resolveOutput(result: unknown): JsonValue | undefined {\n if (!result || typeof result !== \"object\") {\n return toJsonValue(result);\n }\n\n const candidates = [\n \"output\",\n \"decision\",\n \"result\",\n \"final\",\n ] satisfies string[];\n\n for (const key of candidates) {\n const value = (result as Record<string, unknown>)[key];\n const normalized = toJsonValue(value);\n if (normalized !== undefined) {\n return normalized;\n }\n }\n\n return undefined;\n}\n\nfunction normalizeToolResult(result: unknown): JsonValue | undefined {\n const details =\n result && typeof result === \"object\"\n ? toJsonValue((result as { details?: unknown }).details)\n : undefined;\n if (details !== undefined) {\n return details;\n }\n\n return (\n toJsonValue(result) ?? (result === undefined ? undefined : String(result))\n );\n}\n\nfunction normalizeReplayToolResult(result: unknown): JsonValue {\n return normalizeToolResult(result) ?? null;\n}\n\ntype NativeToolReplayEnvelope = {\n __vitestEvals: {\n kind: \"pi-ai-native-tool-result\";\n version: 2;\n };\n agentResult: JsonValue;\n normalizedResult: JsonValue;\n};\n\ntype LegacyNativeToolReplayEnvelope = {\n __vitestEvals: {\n kind: \"pi-ai-native-tool-result\";\n version: 1;\n };\n normalizedResult: JsonValue;\n agentResult?: JsonValue;\n};\n\nfunction createNativeToolReplayEnvelope(\n result: unknown,\n): NativeToolReplayEnvelope {\n const normalizedResult = normalizeReplayToolResult(result);\n\n return {\n __vitestEvals: {\n kind: \"pi-ai-native-tool-result\",\n version: 2,\n },\n agentResult: toJsonValue(result) ?? normalizedResult,\n normalizedResult,\n };\n}\n\nfunction resolveNativeToolReplayResult(result: JsonValue) {\n if (isNativeToolReplayEnvelope(result)) {\n return {\n result: result.agentResult,\n normalizedResult: result.normalizedResult,\n };\n }\n\n if (isLegacyNativeToolReplayEnvelope(result)) {\n return {\n result: result.agentResult ?? result.normalizedResult,\n normalizedResult: result.normalizedResult,\n };\n }\n\n return {\n result,\n normalizedResult: normalizeReplayToolResult(result),\n };\n}\n\nfunction isNativeToolReplayEnvelope(\n value: unknown,\n): value is NativeToolReplayEnvelope {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n \"__vitestEvals\" in value &&\n isNativeToolReplayMarker(\n (value as { __vitestEvals?: unknown }).__vitestEvals,\n ) &&\n \"agentResult\" in value &&\n \"normalizedResult\" in value,\n );\n}\n\nfunction isNativeToolReplayMarker(\n value: unknown,\n): value is NativeToolReplayEnvelope[\"__vitestEvals\"] {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n \"kind\" in value &&\n (value as { kind?: unknown }).kind === \"pi-ai-native-tool-result\" &&\n \"version\" in value &&\n (value as { version?: unknown }).version === 2,\n );\n}\n\nfunction isLegacyNativeToolReplayEnvelope(\n value: unknown,\n): value is LegacyNativeToolReplayEnvelope {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n \"__vitestEvals\" in value &&\n isLegacyNativeToolReplayMarker(\n (value as { __vitestEvals?: unknown }).__vitestEvals,\n ) &&\n \"normalizedResult\" in value,\n );\n}\n\nfunction isLegacyNativeToolReplayMarker(\n value: unknown,\n): value is LegacyNativeToolReplayEnvelope[\"__vitestEvals\"] {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n \"kind\" in value &&\n (value as { kind?: unknown }).kind === \"pi-ai-native-tool-result\" &&\n \"version\" in value &&\n (value as { version?: unknown }).version === 1,\n );\n}\n\nfunction resolveUsage(result: unknown, toolCallCount: number): UsageSummary {\n if (!result || typeof result !== \"object\") {\n return toolCallCount > 0 ? { toolCalls: toolCallCount } : {};\n }\n\n const usageValue =\n (result as Record<string, unknown>).usage ??\n (result as Record<string, unknown>).metrics;\n\n const usage =\n usageValue && typeof usageValue === \"object\"\n ? ({ ...(usageValue as Record<string, unknown>) } as UsageSummary)\n : {};\n\n if (usage.toolCalls === undefined && toolCallCount > 0) {\n usage.toolCalls = toolCallCount;\n }\n\n return usage;\n}\n\nfunction resolveSession(\n result: unknown,\n messages: NormalizedMessage[],\n output: JsonValue | undefined,\n usage: UsageSummary,\n): NormalizedSession {\n if (\n isNormalizedSession(\n (result as Record<string, unknown> | undefined)?.session,\n )\n ) {\n return (result as { session: NormalizedSession }).session;\n }\n\n if (\n isNormalizedSession((result as Record<string, unknown> | undefined)?.trace)\n ) {\n return (result as { trace: NormalizedSession }).trace;\n }\n\n const sessionMessages = [...messages];\n if (\n output !== undefined &&\n !sessionMessages.some(\n (message) =>\n message.role === \"assistant\" && message.content !== undefined,\n )\n ) {\n sessionMessages.push({\n role: \"assistant\",\n content: output,\n });\n }\n\n return {\n messages: sessionMessages,\n outputText: typeof output === \"string\" ? output : undefined,\n provider:\n ((result as Record<string, unknown> | undefined)?.provider as\n | string\n | undefined) ?? usage.provider,\n model:\n ((result as Record<string, unknown> | undefined)?.model as\n | string\n | undefined) ?? usage.model,\n };\n}\n\nfunction resolveErrors(result: unknown): Array<Record<string, JsonValue>> {\n return resolveHarnessRunErrors(result);\n}\n\nasync function executeToolWithReplay<\n TArgs extends Record<string, JsonValue>,\n TResult extends JsonValue,\n TInput,\n TMetadata extends HarnessMetadata,\n>({\n toolName,\n tool,\n args,\n context,\n}: {\n toolName: string;\n tool: PiAiToolDefinition<TArgs, TResult, TInput, TMetadata>;\n args: TArgs;\n context: PiAiToolContext<TInput, TMetadata>;\n}) {\n return executeWithReplay({\n toolName,\n args,\n context,\n execute: tool.execute,\n replay: tool.replay,\n });\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type {\n Harness,\n HarnessContext,\n HarnessMetadata,\n HarnessPrompt,\n HarnessRun,\n JsonValue,\n NormalizedMessage,\n NormalizedSession,\n TimingSummary,\n ToolCallRecord,\n UsageSummary,\n} from \"vitest-evals/harness\";\nimport {\n attachHarnessRunToError,\n isHarnessRun,\n isNormalizedSession,\n normalizeContent,\n resolveHarnessRunErrors,\n serializeError,\n toJsonValue,\n} from \"vitest-evals/harness\";\nimport {\n executeWithReplay,\n getReplayMetadataFromError,\n normalizeReplayMetadata,\n} from \"vitest-evals/replay\";\nimport type {\n ReplayMode,\n ToolRecording,\n ToolReplayConfig,\n} from \"vitest-evals/replay\";\n\ntype MaybePromise<T> = T | Promise<T>;\ntype AnyPiAiToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<string, PiAiToolDefinition<any, any, TInput, TMetadata>>;\ntype InferredPiAiToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<\n string,\n PiAiToolDefinition<Record<string, JsonValue>, JsonValue, TInput, TMetadata>\n>;\n\ntype PiAgentToolLike<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = {\n name: string;\n execute: (toolCallId: string, args: Record<string, JsonValue>) => unknown;\n};\n\nconst ORIGINAL_NATIVE_EXECUTE = Symbol(\"vitest-evals.originalNativeExecute\");\n\ntype NativeToolExecute<\n TInput,\n TMetadata extends HarnessMetadata,\n> = PiAgentToolLike<TInput, TMetadata>[\"execute\"] & {\n [ORIGINAL_NATIVE_EXECUTE]?: PiAgentToolLike<TInput, TMetadata>[\"execute\"];\n};\n\nexport type PiAiReplayMode = ReplayMode;\n\nexport interface PiAiEventSink {\n message: (message: NormalizedMessage) => void;\n system: (content: JsonValue, metadata?: Record<string, JsonValue>) => void;\n user: (content: JsonValue, metadata?: Record<string, JsonValue>) => void;\n assistant: (content: JsonValue, metadata?: Record<string, JsonValue>) => void;\n tool: (\n name: string,\n content: JsonValue,\n metadata?: Record<string, JsonValue>,\n ) => void;\n}\n\nexport interface PiAiToolContext<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> {\n input: TInput;\n metadata: HarnessContext<TMetadata>[\"metadata\"];\n signal?: AbortSignal;\n setArtifact: HarnessContext<TMetadata>[\"setArtifact\"];\n}\n\nexport type PiAiToolRecording<\n TArgs extends Record<string, JsonValue> = Record<string, JsonValue>,\n TResult extends JsonValue = JsonValue,\n> = ToolRecording<TArgs, TResult>;\n\nexport type PiAiToolReplayConfig<\n TArgs extends Record<string, JsonValue> = Record<string, JsonValue>,\n TResult extends JsonValue = JsonValue,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = ToolReplayConfig<TArgs, TResult, PiAiToolContext<TInput, TMetadata>>;\n\nexport type PiAiToolReplayPolicy<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> =\n | boolean\n | PiAiToolReplayConfig<\n Record<string, JsonValue>,\n JsonValue,\n TInput,\n TMetadata\n >;\n\nexport type PiAiToolReplayPolicies<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<string, PiAiToolReplayPolicy<TInput, TMetadata>>;\n\nexport interface PiAiToolDefinition<\n TArgs extends Record<string, JsonValue> = Record<string, JsonValue>,\n TResult extends JsonValue = JsonValue,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> {\n description?: string;\n execute: (\n args: TArgs,\n context: PiAiToolContext<TInput, TMetadata>,\n ) => MaybePromise<TResult>;\n}\n\nexport type PiAiToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = AnyPiAiToolset<TInput, TMetadata>;\n\ntype ToolArgs<TTool> = TTool extends PiAiToolDefinition<\n infer TArgs,\n infer _TResult,\n infer _TInput,\n infer _TMetadata\n>\n ? TArgs\n : never;\n\ntype ToolResult<TTool> = TTool extends PiAiToolDefinition<\n infer _TArgs,\n infer TResult,\n infer _TInput,\n infer _TMetadata\n>\n ? TResult\n : never;\n\nexport type PiAiRuntime<\n TTools extends PiAiToolset<TInput, TMetadata>,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = {\n tools: {\n [K in keyof TTools]: (\n args: ToolArgs<TTools[K]>,\n ) => Promise<ToolResult<TTools[K]>>;\n };\n events: PiAiEventSink;\n signal?: AbortSignal;\n};\n\nexport interface PiAiHarnessRunArgs<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TTools extends PiAiToolset<TInput, TMetadata>,\n> {\n agent: TAgent;\n input: TInput;\n context: HarnessContext<TMetadata>;\n runtime: PiAiRuntime<TTools, TInput, TMetadata>;\n}\n\nexport interface PiAiHarnessResultArgs<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n> extends PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools> {\n result: TResult;\n}\n\nexport interface PiAiCreateAgentArgs<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> {\n input: TInput;\n context: HarnessContext<TMetadata>;\n}\n\ninterface PiAiHarnessBaseOptions<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n> {\n agent?: TAgent;\n createAgent?: (\n args: PiAiCreateAgentArgs<TInput, TMetadata>,\n ) => MaybePromise<TAgent>;\n toolReplay?: PiAiToolReplayPolicies<TInput, TMetadata>;\n normalize?: PiAiHarnessNormalizeOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools\n >;\n prompt: HarnessPrompt;\n name?: string;\n}\n\nexport interface PiAiHarnessWithToolsOptions<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n> extends PiAiHarnessBaseOptions<TAgent, TInput, TMetadata, TResult, TTools> {\n tools: TTools;\n run?: (\n args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n ) => MaybePromise<TResult | HarnessRun>;\n}\n\nexport interface PiAiHarnessInferredToolsOptions<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n> extends PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n InferredPiAiToolset<TInput, TMetadata>\n > {\n tools?: undefined;\n run?: (\n args: PiAiHarnessRunArgs<\n TAgent,\n TInput,\n TMetadata,\n InferredPiAiToolset<TInput, TMetadata>\n >,\n ) => MaybePromise<TResult | HarnessRun>;\n}\n\nexport type PiAiHarnessOptions<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n> =\n | PiAiHarnessWithToolsOptions<TAgent, TInput, TMetadata, TResult, TTools>\n | PiAiHarnessInferredToolsOptions<TAgent, TInput, TMetadata, TResult>;\n\ntype PiAiHarnessRunOptions<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n> = PiAiHarnessBaseOptions<TAgent, TInput, TMetadata, TResult, TTools> & {\n run?: (\n args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n ) => MaybePromise<TResult | HarnessRun>;\n};\n\ntype PiAiRunnableAgent<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n> = {\n run: (\n input: TInput,\n runtime: PiAiRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<TResult | HarnessRun>;\n};\n\nexport interface PiAiHarnessNormalizeOptions<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n> {\n session?: (\n args: PiAiHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n ) => MaybePromise<NormalizedSession>;\n output?: (\n args: PiAiHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n ) => MaybePromise<JsonValue | undefined>;\n usage?: (\n args: PiAiHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n ) => MaybePromise<UsageSummary>;\n timings?: (\n args: PiAiHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n ) => MaybePromise<TimingSummary | undefined>;\n errors?: (\n args: PiAiHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n ) => MaybePromise<Array<Record<string, JsonValue>>>;\n}\n\ntype InferredToolSurfaces<TInput, TMetadata extends HarnessMetadata> = {\n runtimeTools?: InferredPiAiToolset<TInput, TMetadata>;\n nativeToolsets?: Array<PiAgentToolLike<TInput, TMetadata>[]>;\n};\n\ntype PiToolExecutionState = {\n activeNativeToolNames: Map<string, number>;\n};\n\n/** Adapts a Pi agent runtime into a normalized vitest-evals harness. */\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n>(\n options: PiAiHarnessWithToolsOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools\n >,\n): Harness<TInput, TMetadata>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n>(\n options: PiAiHarnessInferredToolsOptions<TAgent, TInput, TMetadata, TResult>,\n): Harness<TInput, TMetadata>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n>(\n options: PiAiHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools>,\n): Harness<TInput, TMetadata> {\n return {\n name: options.name ?? \"pi-ai\",\n prompt: options.prompt,\n run: async (input, context) => {\n const agent = await resolveAgent(options, {\n input,\n context,\n });\n const messages: NormalizedMessage[] = [\n {\n role: \"user\",\n content: normalizeContent(input),\n },\n ];\n const inferredTools = resolveInferredToolSurfaces<TInput, TMetadata>(\n agent,\n );\n\n if (hasExplicitToolset(options)) {\n return executePiHarnessRun(\n options,\n agent,\n input,\n context,\n messages,\n options.tools,\n inferredTools.nativeToolsets,\n );\n }\n\n return executePiHarnessRun(\n options,\n agent,\n input,\n context,\n messages,\n inferredTools.runtimeTools,\n inferredTools.nativeToolsets,\n );\n },\n };\n}\n\nasync function executePiHarnessRun<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n>(\n options: PiAiHarnessRunOptions<TAgent, TInput, TMetadata, TResult, TTools>,\n agent: TAgent,\n input: TInput,\n context: HarnessContext<TMetadata>,\n messages: NormalizedMessage[],\n runtimeTools: TTools | undefined,\n nativeToolsets?: Array<PiAgentToolLike<TInput, TMetadata>[]>,\n): Promise<HarnessRun> {\n const executionState = createPiToolExecutionState();\n const runtime = createRuntime({\n input,\n context,\n tools: runtimeTools,\n toolReplay: options.toolReplay,\n executionState,\n messages,\n });\n\n try {\n const result = await withInstrumentedAgentTools(\n agent,\n nativeToolsets,\n {\n input,\n context,\n messages,\n toolCalls: runtime.toolCalls,\n toolReplay: options.toolReplay,\n executionState,\n },\n () =>\n runAgent(options, {\n agent,\n input,\n context,\n runtime,\n }),\n );\n\n if (isHarnessRun(result) && !hasResultOverrides(options)) {\n if (Object.keys(context.artifacts).length > 0 && !result.artifacts) {\n result.artifacts = context.artifacts;\n }\n return result;\n }\n\n const normalizeResult = result as TResult;\n const resultArgs = {\n agent,\n input,\n context,\n runtime,\n result: normalizeResult,\n } satisfies PiAiHarnessResultArgs<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools\n >;\n\n const output = options.normalize?.output\n ? await options.normalize.output(resultArgs)\n : resolveOutput(normalizeResult);\n const usage = options.normalize?.usage\n ? await options.normalize.usage(resultArgs)\n : resolveUsage(normalizeResult, runtime.toolCalls.length);\n const session = options.normalize?.session\n ? await options.normalize.session(resultArgs)\n : resolveSession(normalizeResult, messages, output, usage);\n\n return {\n session,\n output,\n usage,\n timings: options.normalize?.timings\n ? await options.normalize.timings(resultArgs)\n : undefined,\n artifacts:\n Object.keys(context.artifacts).length > 0\n ? context.artifacts\n : undefined,\n errors: options.normalize?.errors\n ? await options.normalize.errors(resultArgs)\n : resolveErrors(normalizeResult),\n };\n } catch (error) {\n const usage = resolveUsage(undefined, runtime.toolCalls.length);\n const run = {\n session: resolveSession(undefined, messages, undefined, usage),\n output: undefined,\n usage,\n artifacts:\n Object.keys(context.artifacts).length > 0\n ? context.artifacts\n : undefined,\n errors: [serializeError(error)],\n } satisfies HarnessRun;\n\n throw attachHarnessRunToError(error, run);\n }\n}\n\nasync function resolveAgent<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n>(\n options: PiAiHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools>,\n args: PiAiCreateAgentArgs<TInput, TMetadata>,\n) {\n if (options.agent !== undefined) {\n return options.agent;\n }\n\n if (options.createAgent) {\n return options.createAgent(args);\n }\n\n throw new Error(\n \"piAiHarness requires either an agent instance or a createAgent() function.\",\n );\n}\n\nfunction hasResultOverrides<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n>(options: PiAiHarnessRunOptions<TAgent, TInput, TMetadata, TResult, TTools>) {\n return Boolean(\n options.normalize?.output ??\n options.normalize?.session ??\n options.normalize?.usage ??\n options.normalize?.timings ??\n options.normalize?.errors,\n );\n}\n\nfunction resolveInferredToolSurfaces<TInput, TMetadata extends HarnessMetadata>(\n agent: unknown,\n): InferredToolSurfaces<TInput, TMetadata> {\n let runtimeTools: InferredPiAiToolset<TInput, TMetadata> | undefined;\n const nativeToolsets: Array<PiAgentToolLike<TInput, TMetadata>[]> = [];\n const seenToolsets = new Set<PiAgentToolLike<TInput, TMetadata>[]>();\n\n for (const candidate of getAgentToolCandidates(agent)) {\n const nextRuntimeTools = getRuntimeToolset<TInput, TMetadata>(candidate);\n if (runtimeTools === undefined && nextRuntimeTools !== undefined) {\n runtimeTools = nextRuntimeTools;\n }\n\n const nativeTools = getNativeToolArray(candidate);\n if (nativeTools && !seenToolsets.has(nativeTools)) {\n seenToolsets.add(nativeTools);\n nativeToolsets.push(nativeTools);\n }\n }\n\n return {\n ...(runtimeTools ? { runtimeTools } : {}),\n ...(nativeToolsets.length > 0 ? { nativeToolsets } : {}),\n };\n}\n\nfunction getAgentToolCandidates(agent: unknown): object[] {\n const roots = getAgentRoots(agent);\n const candidates: object[] = [];\n const seen = new Set<object>();\n\n for (const root of roots) {\n addUniqueObject(candidates, seen, root);\n addUniqueObject(candidates, seen, getObjectProperty(root, \"state\"));\n addUniqueObject(candidates, seen, getObjectProperty(root, \"initialState\"));\n }\n\n return candidates;\n}\n\nfunction getAgentRoots(agent: unknown): object[] {\n return [asObject(agent)]\n .concat(asObject(getObjectProperty(agent, \"agent\")))\n .filter((value): value is object => value !== undefined);\n}\n\nfunction addUniqueObject(\n candidates: object[],\n seen: Set<object>,\n value: unknown,\n) {\n if (!value || typeof value !== \"object\" || seen.has(value)) {\n return;\n }\n\n seen.add(value);\n candidates.push(value);\n}\n\nfunction asObject(value: unknown): object | undefined {\n return value && typeof value === \"object\" ? value : undefined;\n}\n\nfunction getObjectProperty(value: unknown, key: string): unknown {\n return value && typeof value === \"object\"\n ? (value as Record<string, unknown>)[key]\n : undefined;\n}\n\nfunction getRuntimeToolset<TInput, TMetadata extends HarnessMetadata>(\n value: object,\n): InferredPiAiToolset<TInput, TMetadata> | undefined {\n const candidate =\n getObjectProperty(value, \"tools\") ?? getObjectProperty(value, \"toolset\");\n\n return isPiAiToolset(candidate)\n ? (candidate as InferredPiAiToolset<TInput, TMetadata>)\n : undefined;\n}\n\nfunction getNativeToolArray<TInput, TMetadata extends HarnessMetadata>(\n value: object,\n): PiAgentToolLike<TInput, TMetadata>[] | undefined {\n const candidate = getObjectProperty(value, \"tools\");\n if (isAgentToolArray(candidate)) {\n return candidate as PiAgentToolLike<TInput, TMetadata>[];\n }\n\n return undefined;\n}\n\nasync function runAgent<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n>(\n options: PiAiHarnessRunOptions<TAgent, TInput, TMetadata, TResult, TTools>,\n args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n): Promise<TResult | HarnessRun> {\n if (options.run) {\n return options.run(args);\n }\n\n if (hasPiAiRunMethod<TInput, TMetadata, TResult, TTools>(args.agent)) {\n return args.agent.run(args.input, args.runtime);\n }\n\n throw new Error(\n \"piAiHarness requires a run() function unless the provided agent exposes run(input, runtime).\",\n );\n}\n\nfunction hasExplicitToolset<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n>(\n options: PiAiHarnessOptions<TAgent, TInput, TMetadata, TResult, TTools>,\n): options is PiAiHarnessWithToolsOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools\n> {\n return options.tools !== undefined;\n}\n\nfunction hasPiAiRunMethod<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n>(\n agent: unknown,\n): agent is PiAiRunnableAgent<TInput, TMetadata, TResult, TTools> {\n if (!agent || typeof agent !== \"object\") {\n return false;\n }\n\n return (\n \"run\" in agent && typeof (agent as { run?: unknown }).run === \"function\"\n );\n}\n\nfunction isPiAiToolset(value: unknown): value is PiAiToolset {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return false;\n }\n\n const tools = Object.values(value);\n return (\n tools.length > 0 &&\n tools.every((tool) =>\n Boolean(\n tool &&\n typeof tool === \"object\" &&\n \"execute\" in tool &&\n typeof (tool as { execute?: unknown }).execute === \"function\",\n ),\n )\n );\n}\n\nfunction isAgentToolArray(value: unknown): value is PiAgentToolLike[] {\n return (\n Array.isArray(value) &&\n value.every((tool) =>\n Boolean(\n tool &&\n typeof tool === \"object\" &&\n \"name\" in tool &&\n typeof (tool as { name?: unknown }).name === \"string\" &&\n \"execute\" in tool &&\n typeof (tool as { execute?: unknown }).execute === \"function\",\n ),\n )\n );\n}\n\nasync function withInstrumentedAgentTools<\n TResult,\n TInput,\n TMetadata extends HarnessMetadata,\n>(\n agent: unknown,\n toolsets: Array<PiAgentToolLike<TInput, TMetadata>[]> | undefined,\n args: {\n input: TInput;\n context: HarnessContext<TMetadata>;\n messages: NormalizedMessage[];\n toolCalls: ToolCallRecord[];\n toolReplay: PiAiToolReplayPolicies<TInput, TMetadata> | undefined;\n executionState: PiToolExecutionState;\n },\n callback: () => Promise<TResult>,\n) {\n if (!toolsets || toolsets.length === 0) {\n return callback();\n }\n\n const originalExecutions = new Map<\n PiAgentToolLike<TInput, TMetadata>,\n PiAgentToolLike<TInput, TMetadata>[\"execute\"]\n >();\n const originalResets = new Map<ResettableAgent, ResettableAgent[\"reset\"]>();\n\n const patchTool = (tool: PiAgentToolLike<TInput, TMetadata>) => {\n if (originalExecutions.has(tool)) {\n return;\n }\n\n const originalExecute = getNativeToolExecuteOrigin(tool.execute);\n originalExecutions.set(tool, originalExecute);\n const instrumentedExecute: NativeToolExecute<TInput, TMetadata> = async (\n toolCallId: string,\n rawArgs: Record<string, JsonValue>,\n ) => {\n const startedAt = new Date();\n const toolContext = {\n input: args.input,\n metadata: args.context.metadata,\n signal: args.context.signal,\n setArtifact: args.context.setArtifact,\n } satisfies PiAiToolContext<TInput, TMetadata>;\n const leaveNativeTool = enterNativeToolExecution(\n args.executionState,\n tool.name,\n );\n\n try {\n const execution = await executeNativeToolWithReplay({\n toolName: tool.name,\n toolCallId,\n execute: originalExecute,\n replay: args.toolReplay?.[tool.name],\n args: rawArgs,\n context: toolContext,\n });\n const finishedAt = new Date();\n const call = {\n name: tool.name,\n arguments: rawArgs,\n result: execution.normalizedResult,\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n metadata: normalizeReplayMetadata(execution.replay),\n } satisfies ToolCallRecord;\n args.toolCalls.push(call);\n args.messages.push({\n role: \"assistant\",\n toolCalls: [call],\n });\n args.messages.push({\n role: \"tool\",\n content: execution.normalizedResult,\n metadata: {\n name: tool.name,\n },\n });\n return execution.result;\n } catch (error) {\n const finishedAt = new Date();\n const call = {\n name: tool.name,\n arguments: rawArgs,\n error: serializeToolCallError(error),\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n metadata: normalizeReplayMetadata(getReplayMetadataFromError(error)),\n } satisfies ToolCallRecord;\n args.toolCalls.push(call);\n args.messages.push({\n role: \"assistant\",\n toolCalls: [call],\n });\n throw error;\n } finally {\n leaveNativeTool();\n }\n };\n instrumentedExecute[ORIGINAL_NATIVE_EXECUTE] = originalExecute;\n tool.execute = instrumentedExecute;\n };\n\n const patchToolsets = (\n nextToolsets: Array<PiAgentToolLike<TInput, TMetadata>[]>,\n ) => {\n for (const toolset of nextToolsets) {\n for (const tool of toolset) {\n patchTool(tool);\n }\n }\n };\n\n patchToolsets(toolsets);\n\n for (const target of getAgentResetTargets(agent)) {\n const originalReset = target.reset;\n originalResets.set(target, originalReset);\n target.reset = function patchedReset(this: ResettableAgent, ...resetArgs) {\n const resetResult = originalReset.apply(this, resetArgs);\n\n if (isPromiseLike(resetResult)) {\n return resetResult.finally(() => {\n patchToolsets(\n resolveInferredNativeToolsets<TInput, TMetadata>(agent),\n );\n });\n }\n\n patchToolsets(resolveInferredNativeToolsets<TInput, TMetadata>(agent));\n return resetResult;\n };\n }\n\n try {\n return await callback();\n } finally {\n for (const [target, originalReset] of originalResets) {\n target.reset = originalReset;\n }\n\n for (const [tool, originalExecute] of originalExecutions) {\n tool.execute = originalExecute;\n }\n }\n}\n\ntype ResettableAgent = {\n reset: (...args: unknown[]) => unknown;\n};\n\nfunction getAgentResetTargets(agent: unknown): ResettableAgent[] {\n return getAgentRoots(agent).filter(isResettableAgent);\n}\n\nfunction isResettableAgent(value: object): value is ResettableAgent {\n return \"reset\" in value && typeof value.reset === \"function\";\n}\n\nfunction resolveInferredNativeToolsets<\n TInput,\n TMetadata extends HarnessMetadata,\n>(agent: unknown): Array<PiAgentToolLike<TInput, TMetadata>[]> {\n const toolsets: Array<PiAgentToolLike<TInput, TMetadata>[]> = [];\n const seenToolsets = new Set<PiAgentToolLike<TInput, TMetadata>[]>();\n\n for (const candidate of getAgentToolCandidates(agent)) {\n const nativeTools = getNativeToolArray(candidate);\n if (nativeTools && !seenToolsets.has(nativeTools)) {\n seenToolsets.add(nativeTools);\n toolsets.push(nativeTools);\n }\n }\n\n return toolsets;\n}\n\nfunction isPromiseLike(value: unknown): value is Promise<unknown> {\n return Boolean(\n value && typeof (value as { then?: unknown }).then === \"function\",\n );\n}\n\nfunction serializeToolCallError(\n error: unknown,\n): NonNullable<ToolCallRecord[\"error\"]> {\n const serialized = serializeError(error);\n const { message, type, ...details } = serialized;\n\n return {\n ...details,\n message: typeof message === \"string\" ? message : String(message),\n ...(typeof type === \"string\" ? { type } : {}),\n };\n}\n\nfunction getNativeToolExecuteOrigin<TInput, TMetadata extends HarnessMetadata>(\n execute: PiAgentToolLike<TInput, TMetadata>[\"execute\"],\n) {\n const nativeExecute = execute as NativeToolExecute<TInput, TMetadata>;\n return nativeExecute[ORIGINAL_NATIVE_EXECUTE] ?? nativeExecute;\n}\n\nfunction createPiToolExecutionState(): PiToolExecutionState {\n return {\n activeNativeToolNames: new Map(),\n };\n}\n\nfunction enterNativeToolExecution(\n state: PiToolExecutionState,\n toolName: string,\n) {\n state.activeNativeToolNames.set(\n toolName,\n (state.activeNativeToolNames.get(toolName) ?? 0) + 1,\n );\n\n return () => {\n const nextCount = (state.activeNativeToolNames.get(toolName) ?? 1) - 1;\n if (nextCount <= 0) {\n state.activeNativeToolNames.delete(toolName);\n return;\n }\n\n state.activeNativeToolNames.set(toolName, nextCount);\n };\n}\n\nfunction hasActiveNativeToolExecution(\n state: PiToolExecutionState,\n toolName: string,\n) {\n return (state.activeNativeToolNames.get(toolName) ?? 0) > 0;\n}\n\nasync function executeNativeToolWithReplay<\n TInput,\n TMetadata extends HarnessMetadata,\n>({\n toolName,\n toolCallId,\n execute,\n replay,\n args,\n context,\n}: {\n toolName: string;\n toolCallId: string;\n execute: PiAgentToolLike<TInput, TMetadata>[\"execute\"];\n replay: PiAiToolReplayPolicy<TInput, TMetadata> | undefined;\n args: Record<string, JsonValue>;\n context: PiAiToolContext<TInput, TMetadata>;\n}) {\n let didExecute = false;\n let liveResult: unknown;\n\n const execution = await executeWithReplay({\n toolName: createNativeReplayToolName(toolName),\n args,\n context,\n execute: async (toolArgs) => {\n didExecute = true;\n liveResult = await execute(toolCallId, toolArgs);\n return createNativeToolReplayEnvelope(liveResult);\n },\n replay,\n });\n\n if (didExecute) {\n return {\n result: liveResult,\n normalizedResult: normalizeReplayToolResult(liveResult),\n replay: execution.replay,\n };\n }\n\n return {\n ...resolveNativeToolReplayResult(execution.result),\n replay: execution.replay,\n };\n}\n\nfunction createNativeReplayToolName(toolName: string) {\n return `${toolName}.native`;\n}\n\nfunction createRuntime<\n TInput,\n TMetadata extends HarnessMetadata,\n TTools extends PiAiToolset<TInput, TMetadata>,\n>({\n input,\n context,\n tools,\n toolReplay,\n executionState,\n messages,\n}: {\n input: TInput;\n context: HarnessContext<TMetadata>;\n tools: TTools | undefined;\n toolReplay: PiAiToolReplayPolicies<TInput, TMetadata> | undefined;\n executionState: PiToolExecutionState;\n messages: NormalizedMessage[];\n}): PiAiRuntime<TTools, TInput, TMetadata> & {\n toolCalls: ToolCallRecord[];\n} {\n const toolCalls: ToolCallRecord[] = [];\n const eventSink: PiAiEventSink = {\n message: (message) => {\n messages.push(message);\n },\n system: (content, metadata) => {\n messages.push({\n role: \"system\",\n content,\n metadata,\n });\n },\n user: (content, metadata) => {\n messages.push({\n role: \"user\",\n content,\n metadata,\n });\n },\n assistant: (content, metadata) => {\n messages.push({\n role: \"assistant\",\n content,\n metadata,\n });\n },\n tool: (name, content, metadata) => {\n messages.push({\n role: \"tool\",\n content,\n metadata: {\n name,\n ...(metadata ?? {}),\n },\n });\n },\n };\n\n const runtimeTools = Object.fromEntries(\n Object.entries(tools ?? {}).map(([toolName, tool]) => [\n toolName,\n async (args: Record<string, JsonValue>) => {\n const startedAt = new Date();\n const isNativeImplementationCall = hasActiveNativeToolExecution(\n executionState,\n toolName,\n );\n const toolContext = {\n input,\n metadata: context.metadata,\n signal: context.signal,\n setArtifact: context.setArtifact,\n } satisfies PiAiToolContext<TInput, TMetadata>;\n\n try {\n const execution = await executeToolWithReplay({\n toolName,\n tool,\n replay: isNativeImplementationCall\n ? undefined\n : toolReplay?.[toolName],\n args,\n context: toolContext,\n });\n const finishedAt = new Date();\n\n if (isNativeImplementationCall) {\n return execution.result;\n }\n\n const call = {\n name: toolName,\n arguments: args,\n result: execution.result,\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n metadata: normalizeReplayMetadata(execution.replay),\n } satisfies ToolCallRecord;\n toolCalls.push(call);\n messages.push({\n role: \"assistant\",\n toolCalls: [call],\n });\n messages.push({\n role: \"tool\",\n content: execution.result,\n metadata: {\n name: toolName,\n },\n });\n return execution.result;\n } catch (error) {\n const finishedAt = new Date();\n if (isNativeImplementationCall) {\n throw error;\n }\n\n const call = {\n name: toolName,\n arguments: args,\n error: serializeToolCallError(error),\n startedAt: startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs: finishedAt.getTime() - startedAt.getTime(),\n metadata: normalizeReplayMetadata(\n getReplayMetadataFromError(error),\n ),\n } satisfies ToolCallRecord;\n toolCalls.push(call);\n messages.push({\n role: \"assistant\",\n toolCalls: [call],\n });\n throw error;\n }\n },\n ]),\n ) as unknown as PiAiRuntime<TTools, TInput, TMetadata>[\"tools\"];\n\n return {\n tools: runtimeTools,\n events: eventSink,\n signal: context.signal,\n toolCalls,\n };\n}\n\nfunction resolveOutput(result: unknown): JsonValue | undefined {\n if (!result || typeof result !== \"object\") {\n return toJsonValue(result);\n }\n\n const candidates = [\n \"output\",\n \"decision\",\n \"result\",\n \"final\",\n ] satisfies string[];\n\n for (const key of candidates) {\n const value = (result as Record<string, unknown>)[key];\n const normalized = toJsonValue(value);\n if (normalized !== undefined) {\n return normalized;\n }\n }\n\n return undefined;\n}\n\nfunction normalizeToolResult(result: unknown): JsonValue | undefined {\n const details =\n result && typeof result === \"object\"\n ? toJsonValue((result as { details?: unknown }).details)\n : undefined;\n if (details !== undefined) {\n return details;\n }\n\n return (\n toJsonValue(result) ?? (result === undefined ? undefined : String(result))\n );\n}\n\nfunction normalizeReplayToolResult(result: unknown): JsonValue {\n return normalizeToolResult(result) ?? null;\n}\n\ntype NativeToolReplayEnvelope = {\n __vitestEvals: {\n kind: \"pi-ai-native-tool-result\";\n version: 2;\n };\n agentResult: JsonValue;\n normalizedResult: JsonValue;\n};\n\ntype LegacyNativeToolReplayEnvelope = {\n __vitestEvals: {\n kind: \"pi-ai-native-tool-result\";\n version: 1;\n };\n normalizedResult: JsonValue;\n agentResult?: JsonValue;\n};\n\nfunction createNativeToolReplayEnvelope(\n result: unknown,\n): NativeToolReplayEnvelope {\n const normalizedResult = normalizeReplayToolResult(result);\n\n return {\n __vitestEvals: {\n kind: \"pi-ai-native-tool-result\",\n version: 2,\n },\n agentResult: toJsonValue(result) ?? normalizedResult,\n normalizedResult,\n };\n}\n\nfunction resolveNativeToolReplayResult(result: JsonValue) {\n if (isNativeToolReplayEnvelope(result)) {\n return {\n result: result.agentResult,\n normalizedResult: result.normalizedResult,\n };\n }\n\n if (isLegacyNativeToolReplayEnvelope(result)) {\n return {\n result: result.agentResult ?? result.normalizedResult,\n normalizedResult: result.normalizedResult,\n };\n }\n\n return {\n result,\n normalizedResult: normalizeReplayToolResult(result),\n };\n}\n\nfunction isNativeToolReplayEnvelope(\n value: unknown,\n): value is NativeToolReplayEnvelope {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n \"__vitestEvals\" in value &&\n isNativeToolReplayMarker(\n (value as { __vitestEvals?: unknown }).__vitestEvals,\n ) &&\n \"agentResult\" in value &&\n \"normalizedResult\" in value,\n );\n}\n\nfunction isNativeToolReplayMarker(\n value: unknown,\n): value is NativeToolReplayEnvelope[\"__vitestEvals\"] {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n \"kind\" in value &&\n (value as { kind?: unknown }).kind === \"pi-ai-native-tool-result\" &&\n \"version\" in value &&\n (value as { version?: unknown }).version === 2,\n );\n}\n\nfunction isLegacyNativeToolReplayEnvelope(\n value: unknown,\n): value is LegacyNativeToolReplayEnvelope {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n \"__vitestEvals\" in value &&\n isLegacyNativeToolReplayMarker(\n (value as { __vitestEvals?: unknown }).__vitestEvals,\n ) &&\n \"normalizedResult\" in value,\n );\n}\n\nfunction isLegacyNativeToolReplayMarker(\n value: unknown,\n): value is LegacyNativeToolReplayEnvelope[\"__vitestEvals\"] {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n \"kind\" in value &&\n (value as { kind?: unknown }).kind === \"pi-ai-native-tool-result\" &&\n \"version\" in value &&\n (value as { version?: unknown }).version === 1,\n );\n}\n\nfunction resolveUsage(result: unknown, toolCallCount: number): UsageSummary {\n if (!result || typeof result !== \"object\") {\n return toolCallCount > 0 ? { toolCalls: toolCallCount } : {};\n }\n\n const usageValue =\n (result as Record<string, unknown>).usage ??\n (result as Record<string, unknown>).metrics;\n\n const usage =\n usageValue && typeof usageValue === \"object\"\n ? ({ ...(usageValue as Record<string, unknown>) } as UsageSummary)\n : {};\n\n if (usage.toolCalls === undefined && toolCallCount > 0) {\n usage.toolCalls = toolCallCount;\n }\n\n return usage;\n}\n\nfunction resolveSession(\n result: unknown,\n messages: NormalizedMessage[],\n output: JsonValue | undefined,\n usage: UsageSummary,\n): NormalizedSession {\n if (\n isNormalizedSession(\n (result as Record<string, unknown> | undefined)?.session,\n )\n ) {\n return (result as { session: NormalizedSession }).session;\n }\n\n if (\n isNormalizedSession((result as Record<string, unknown> | undefined)?.trace)\n ) {\n return (result as { trace: NormalizedSession }).trace;\n }\n\n const sessionMessages = [...messages];\n if (\n output !== undefined &&\n !sessionMessages.some(\n (message) =>\n message.role === \"assistant\" && message.content !== undefined,\n )\n ) {\n sessionMessages.push({\n role: \"assistant\",\n content: output,\n });\n }\n\n return {\n messages: sessionMessages,\n outputText: typeof output === \"string\" ? output : undefined,\n provider:\n ((result as Record<string, unknown> | undefined)?.provider as\n | string\n | undefined) ?? usage.provider,\n model:\n ((result as Record<string, unknown> | undefined)?.model as\n | string\n | undefined) ?? usage.model,\n };\n}\n\nfunction resolveErrors(result: unknown): Array<Record<string, JsonValue>> {\n return resolveHarnessRunErrors(result);\n}\n\nasync function executeToolWithReplay<\n TArgs extends Record<string, JsonValue>,\n TResult extends JsonValue,\n TInput,\n TMetadata extends HarnessMetadata,\n>({\n toolName,\n tool,\n replay,\n args,\n context,\n}: {\n toolName: string;\n tool: PiAiToolDefinition<TArgs, TResult, TInput, TMetadata>;\n replay: PiAiToolReplayPolicy<TInput, TMetadata> | undefined;\n args: TArgs;\n context: PiAiToolContext<TInput, TMetadata>;\n}) {\n return executeWithReplay<\n Record<string, JsonValue>,\n JsonValue,\n PiAiToolContext<TInput, TMetadata>\n >({\n toolName,\n args,\n context,\n execute: (toolArgs, toolContext) =>\n tool.execute(toolArgs as TArgs, toolContext),\n replay,\n });\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vitest-evals/harness-pi-ai",
3
- "version": "0.9.0-beta.1",
3
+ "version": "0.9.0-beta.3",
4
4
  "sideEffects": false,
5
5
  "types": "./dist/index.d.ts",
6
6
  "main": "./dist/index.js",
@@ -27,7 +27,7 @@
27
27
  "devDependencies": {
28
28
  "@mariozechner/pi-agent-core": "^0.67.68",
29
29
  "@mariozechner/pi-ai": "^0.67.68",
30
- "vitest-evals": "0.9.0-beta.1"
30
+ "vitest-evals": "0.9.0-beta.3"
31
31
  },
32
32
  "scripts": {
33
33
  "build": "tsup --config ./tsup.config.ts"