@vitest-evals/harness-pi-ai 0.10.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -28,6 +28,7 @@ var import_harness = require("vitest-evals/harness");
28
28
  var import_replay = require("vitest-evals/replay");
29
29
  var import_judges = require("vitest-evals/judges");
30
30
  var import_pi_ai = require("@mariozechner/pi-ai");
31
+ var nextTraceId = 0;
31
32
  function piAiJudgeHarness(config) {
32
33
  return (0, import_judges.createJudgeHarness)({
33
34
  name: config.name ?? "pi-ai",
@@ -77,46 +78,71 @@ function resolvePiAiJudgeText(message) {
77
78
  var ORIGINAL_NATIVE_EXECUTE = Symbol("vitest-evals.originalNativeExecute");
78
79
  function piAiHarness(options) {
79
80
  validateOptions(options);
81
+ const harnessName = options.name ?? "pi-ai";
80
82
  const harness = {
81
- name: options.name ?? "pi-ai",
83
+ name: harnessName,
82
84
  run: async (input, context) => {
83
- const agent = await resolveAgent(options, {
84
- input,
85
- context
86
- });
87
- const messages = [
88
- {
89
- role: "user",
90
- content: (0, import_harness.normalizeContent)(input)
85
+ const startedAt = /* @__PURE__ */ new Date();
86
+ try {
87
+ const agent = await resolveAgent(options, {
88
+ input,
89
+ context
90
+ });
91
+ const messages = [
92
+ {
93
+ role: "user",
94
+ content: (0, import_harness.normalizeContent)(input)
95
+ }
96
+ ];
97
+ const inferredTools = resolveInferredToolSurfaces(
98
+ agent
99
+ );
100
+ if (hasExplicitToolset(options)) {
101
+ return await executePiHarnessRun(
102
+ options,
103
+ agent,
104
+ input,
105
+ context,
106
+ messages,
107
+ options.tools,
108
+ inferredTools.nativeToolsets
109
+ );
91
110
  }
92
- ];
93
- const inferredTools = resolveInferredToolSurfaces(
94
- agent
95
- );
96
- if (hasExplicitToolset(options)) {
97
- return executePiHarnessRun(
111
+ return await executePiHarnessRun(
98
112
  options,
99
113
  agent,
100
114
  input,
101
115
  context,
102
116
  messages,
103
- options.tools,
117
+ inferredTools.runtimeTools,
104
118
  inferredTools.nativeToolsets
105
119
  );
120
+ } catch (error) {
121
+ if ((0, import_harness.getHarnessRunFromError)(error)) {
122
+ throw error;
123
+ }
124
+ throw (0, import_harness.attachHarnessRunToError)(
125
+ error,
126
+ createFailedPiAiRun(input, context, error, harnessName, startedAt)
127
+ );
106
128
  }
107
- return executePiHarnessRun(
108
- options,
109
- agent,
110
- input,
111
- context,
112
- messages,
113
- inferredTools.runtimeTools,
114
- inferredTools.nativeToolsets
115
- );
116
129
  }
117
130
  };
118
131
  return harness;
119
132
  }
133
+ function createFailedPiAiRun(input, context, error, harnessName, startedAt) {
134
+ const run = (0, import_harness.createFailedHarnessRun)(input, error, {
135
+ artifacts: context.artifacts
136
+ });
137
+ (0, import_harness.ensureRunTrace)(run, {
138
+ name: harnessName,
139
+ startedAt,
140
+ finishedAt: /* @__PURE__ */ new Date(),
141
+ operationName: "invoke_agent",
142
+ source: "harness-pi-ai"
143
+ });
144
+ return run;
145
+ }
120
146
  function validateOptions(options) {
121
147
  if (options.agent === void 0) {
122
148
  throw new Error(
@@ -125,6 +151,7 @@ function validateOptions(options) {
125
151
  }
126
152
  }
127
153
  async function executePiHarnessRun(options, agent, input, context, messages, runtimeTools, nativeToolsets) {
154
+ const trace = createTraceRecorder(options.name ?? "pi-ai");
128
155
  const executionState = createPiToolExecutionState();
129
156
  const runtime = createRuntime({
130
157
  input,
@@ -157,6 +184,7 @@ async function executePiHarnessRun(options, agent, input, context, messages, run
157
184
  if (Object.keys(context.artifacts).length > 0 && !result.artifacts) {
158
185
  result.artifacts = context.artifacts;
159
186
  }
187
+ attachPiAiTrace(result, trace, /* @__PURE__ */ new Date());
160
188
  return result;
161
189
  }
162
190
  const normalizeResult = result;
@@ -170,21 +198,42 @@ async function executePiHarnessRun(options, agent, input, context, messages, run
170
198
  const output = options.output ? await options.output(resultArgs) : resolveOutput(normalizeResult);
171
199
  const usage = resolveUsage(normalizeResult, runtime.toolCalls.length);
172
200
  const session = resolveSession(normalizeResult, messages, output, usage);
201
+ const errors = resolveErrors(normalizeResult);
202
+ const finishedAt = /* @__PURE__ */ new Date();
173
203
  return {
174
204
  session,
175
205
  output,
176
206
  usage,
177
207
  artifacts: Object.keys(context.artifacts).length > 0 ? context.artifacts : void 0,
178
- errors: resolveErrors(normalizeResult)
208
+ errors,
209
+ traces: [
210
+ finishPiAiTrace(trace, {
211
+ session,
212
+ usage,
213
+ errors,
214
+ finishedAt
215
+ })
216
+ ]
179
217
  };
180
218
  } catch (error) {
181
219
  const usage = resolveUsage(void 0, runtime.toolCalls.length);
220
+ const session = resolveSession(void 0, messages, void 0, usage);
221
+ const finishedAt = /* @__PURE__ */ new Date();
222
+ const serializedError = (0, import_harness.serializeError)(error);
182
223
  const run = {
183
- session: resolveSession(void 0, messages, void 0, usage),
224
+ session,
184
225
  output: void 0,
185
226
  usage,
186
227
  artifacts: Object.keys(context.artifacts).length > 0 ? context.artifacts : void 0,
187
- errors: [(0, import_harness.serializeError)(error)]
228
+ errors: [serializedError],
229
+ traces: [
230
+ finishPiAiTrace(trace, {
231
+ session,
232
+ usage,
233
+ errors: [serializedError],
234
+ finishedAt
235
+ })
236
+ ]
188
237
  };
189
238
  throw (0, import_harness.attachHarnessRunToError)(error, run);
190
239
  }
@@ -204,6 +253,83 @@ function isAgentFactory(agent) {
204
253
  function hasOutputSelector(options) {
205
254
  return Boolean(options.output);
206
255
  }
256
+ function createTraceRecorder(name) {
257
+ const id = `pi_ai_trace_${++nextTraceId}`;
258
+ return {
259
+ id,
260
+ rootSpanId: `${id}:run`,
261
+ name,
262
+ startedAt: /* @__PURE__ */ new Date()
263
+ };
264
+ }
265
+ function attachPiAiTrace(run, trace, finishedAt) {
266
+ const nativeTrace = finishPiAiTrace(trace, {
267
+ session: run.session,
268
+ usage: run.usage,
269
+ errors: run.errors ?? [],
270
+ finishedAt
271
+ });
272
+ run.traces = [...run.traces ?? [], nativeTrace];
273
+ }
274
+ function finishPiAiTrace(trace, options) {
275
+ const finishedAt = options.finishedAt;
276
+ const durationMs = finishedAt.getTime() - trace.startedAt.getTime();
277
+ const rootError = options.errors?.[0] ? (0, import_harness.normalizeSpanError)(options.errors[0]) : void 0;
278
+ const rootSpan = {
279
+ id: trace.rootSpanId,
280
+ traceId: trace.id,
281
+ name: trace.name,
282
+ kind: "run",
283
+ startedAt: trace.startedAt.toISOString(),
284
+ finishedAt: finishedAt.toISOString(),
285
+ durationMs,
286
+ status: rootError ? "error" : "ok",
287
+ ...rootError ? { error: rootError } : {},
288
+ attributes: (0, import_harness.normalizeSpanAttributes)({
289
+ "gen_ai.operation.name": "invoke_agent",
290
+ "gen_ai.workflow.name": trace.name,
291
+ ...(0, import_harness.createGenAiUsageAttributes)(options.usage)
292
+ })
293
+ };
294
+ const modelSpan = createUsageModelSpan(trace, options.usage);
295
+ const spans = [
296
+ rootSpan,
297
+ ...modelSpan ? [modelSpan] : [],
298
+ ...(0, import_harness.createToolCallSpans)((0, import_harness.toolCalls)(options.session), {
299
+ traceId: trace.id,
300
+ parentId: trace.rootSpanId,
301
+ spanIdPrefix: `${trace.id}:tool`
302
+ })
303
+ ];
304
+ return {
305
+ id: trace.id,
306
+ name: trace.name,
307
+ startedAt: trace.startedAt.toISOString(),
308
+ finishedAt: finishedAt.toISOString(),
309
+ durationMs,
310
+ metadata: {
311
+ source: "harness-pi-ai"
312
+ },
313
+ spans
314
+ };
315
+ }
316
+ function createUsageModelSpan(trace, usage) {
317
+ if (!usage?.provider && !usage?.model) {
318
+ return void 0;
319
+ }
320
+ return {
321
+ id: `${trace.id}:model:1`,
322
+ traceId: trace.id,
323
+ parentId: trace.rootSpanId,
324
+ name: usage.model ? `pi-ai ${usage.model}` : "pi-ai model",
325
+ kind: "model",
326
+ status: "ok",
327
+ attributes: (0, import_harness.normalizeSpanAttributes)({
328
+ "gen_ai.operation.name": "chat",
329
+ ...(0, import_harness.createGenAiUsageAttributes)(usage)
330
+ })
331
+ };
332
+ }
207
333
  function resolveInferredToolSurfaces(agent) {
208
334
  let runtimeTools;
209
335
  const nativeToolsets = [];
@@ -335,6 +461,7 @@ async function withInstrumentedAgentTools(agent, toolsets, args, callback) {
335
461
  });
336
462
  const finishedAt = /* @__PURE__ */ new Date();
337
463
  const call = {
464
+ id: toolCallId,
338
465
  name: tool.name,
339
466
  arguments: rawArgs,
340
467
  result: execution.normalizedResult,
@@ -359,6 +486,7 @@ async function withInstrumentedAgentTools(agent, toolsets, args, callback) {
359
486
  } catch (error) {
360
487
  const finishedAt = /* @__PURE__ */ new Date();
361
488
  const call = {
489
+ id: toolCallId,
362
490
  name: tool.name,
363
491
  arguments: rawArgs,
364
492
  error: serializeToolCallError(error),
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 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 normalizeMetadata,\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\";\nimport {\n createJudgeHarness,\n type JudgeHarnessInput,\n} from \"vitest-evals/judges\";\nimport { completeSimple } from \"@mariozechner/pi-ai\";\nimport type {\n Api,\n AssistantMessage,\n Model,\n SimpleStreamOptions,\n} from \"@mariozechner/pi-ai\";\n\ntype MaybePromise<T> = T | Promise<T>;\ntype JsonOutput<TValue> = [TValue] extends [JsonValue | undefined]\n ? TValue\n : undefined;\ntype ResultFieldOutput<\n TResult,\n TKey extends string,\n> = TKey extends keyof TResult\n ? Record<string, never> extends Pick<TResult, TKey>\n ? JsonOutput<TResult[TKey]> | undefined\n : JsonOutput<TResult[TKey]>\n : undefined;\ntype AgentSource<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> =\n | TAgent\n | ((args: PiAiCreateAgentArgs<TInput, TMetadata>) => MaybePromise<TAgent>);\ntype AnyPiAiToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<string, PiAiToolDefinition<any, any, TInput, TMetadata>>;\n\n/**\n * Configuration for adapting a Pi AI model into a judge harness.\n *\n * @example\n * ```ts\n * import { getModel } from \"@mariozechner/pi-ai\";\n * import { piAiJudgeHarness } from \"@vitest-evals/harness-pi-ai\";\n *\n * const judgeHarness = piAiJudgeHarness({\n * model: getModel(\"anthropic\", \"claude-sonnet-4-5\"),\n * temperature: 0,\n * });\n * ```\n */\nexport interface PiAiJudgeHarnessConfig<TApi extends Api = Api> {\n /** Pi AI model used for judge prompts. */\n model: Model<TApi>;\n /** Optional display name for diagnostics. */\n name?: string;\n /** Optional judge-model temperature. */\n temperature?: number;\n /** Optional judge-model token cap. */\n maxOutputTokens?: number;\n /** Additional Pi AI stream options forwarded to `completeSimple(...)`. */\n options?: Omit<SimpleStreamOptions, \"signal\" | \"temperature\" | \"maxTokens\">;\n}\n\n/**\n * Adapts a Pi AI model into the provider-neutral judge harness API.\n *\n * @example\n * ```ts\n * import { getModel } from \"@mariozechner/pi-ai\";\n * import { piAiJudgeHarness } from \"@vitest-evals/harness-pi-ai\";\n * import { describeEval, FactualityJudge } from \"vitest-evals\";\n *\n * const judgeHarness = piAiJudgeHarness({\n * model: getModel(\"anthropic\", \"claude-sonnet-4-5\"),\n * temperature: 0,\n * });\n *\n * describeEval(\"qa agent\", {\n * harness: qaHarness,\n * judgeHarness,\n * judges: [FactualityJudge()],\n * }, (it) => {});\n * ```\n */\nexport function piAiJudgeHarness<TApi extends Api>(\n config: PiAiJudgeHarnessConfig<TApi>,\n) {\n return createJudgeHarness({\n name: config.name ?? \"pi-ai\",\n run: async ({ responseFormat, system, prompt }, { signal }) => {\n const message = await completeSimple(\n config.model,\n {\n systemPrompt: formatPiAiJudgeSystemPrompt(system, responseFormat),\n messages: [\n {\n role: \"user\",\n content: prompt,\n timestamp: Date.now(),\n },\n ],\n },\n {\n ...(config.options ?? {}),\n ...(config.temperature !== undefined\n ? { temperature: config.temperature }\n : {}),\n ...(config.maxOutputTokens !== undefined\n ? { maxTokens: config.maxOutputTokens }\n : {}),\n ...(signal ? { signal } : {}),\n },\n );\n\n return resolvePiAiJudgeText(message);\n },\n });\n}\n\nfunction formatPiAiJudgeSystemPrompt(\n system: string | undefined,\n responseFormat: JudgeHarnessInput[\"responseFormat\"],\n) {\n if (responseFormat?.type !== \"json\") {\n return system;\n }\n\n const jsonInstruction = [\n \"Return only valid JSON. Do not include markdown fences or explanatory prose.\",\n responseFormat.schema\n ? `JSON Schema:\\n${JSON.stringify(responseFormat.schema, null, 2)}`\n : undefined,\n ]\n .filter(Boolean)\n .join(\"\\n\\n\");\n\n return system ? `${system}\\n\\n${jsonInstruction}` : jsonInstruction;\n}\n\nfunction resolvePiAiJudgeText(message: AssistantMessage) {\n if (message.stopReason === \"error\" || message.stopReason === \"aborted\") {\n throw new Error(message.errorMessage ?? \"Pi AI judge harness failed.\");\n }\n\n return message.content\n .filter((part) => part.type === \"text\")\n .map((part) => part.text)\n .join(\"\")\n .trim();\n}\n\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\ntype PiAiResultOutput<TResult> = TResult extends HarnessRun<infer TOutput>\n ? TOutput\n : \"output\" extends keyof TResult\n ? ResultFieldOutput<TResult, \"output\">\n : undefined;\ntype PiAiAgentResult<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TTools extends PiAiToolset<TInput, TMetadata>,\n> = TAgent extends {\n run: (\n input: TInput,\n runtime: PiAiRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<infer TResult>;\n}\n ? Awaited<TResult>\n : unknown;\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\n/** Replay mode alias used by the Pi AI harness package. */\nexport type PiAiReplayMode = ReplayMode;\n\n/** Event sink for recording Pi AI transcript messages. */\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\n/** Context passed to instrumented Pi AI tool executions. */\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\n/** Tool replay recording shape for Pi AI tools. */\nexport type PiAiToolRecording<\n TArgs extends Record<string, JsonValue> = Record<string, JsonValue>,\n TResult extends JsonValue = JsonValue,\n> = ToolRecording<TArgs, TResult>;\n\n/** Replay configuration for a Pi AI tool. */\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\n/** Replay policy for one Pi AI tool. */\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\n/** Replay policy map keyed by Pi AI tool name. */\nexport type PiAiToolReplayPolicies<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<string, PiAiToolReplayPolicy<TInput, TMetadata>>;\n\n/** Tool definition accepted by the Pi AI harness runtime. */\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\n/** Toolset shape accepted by the Pi AI harness. */\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\n/** Runtime object passed into Pi AI agent entrypoints. */\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\n/** Arguments passed to custom Pi AI harness run callbacks. */\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\n/** Arguments passed to Pi AI harness output selectors. */\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\n/** Arguments passed to per-run Pi AI agent factories. */\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 TOutput extends JsonValue | undefined = JsonValue | undefined,\n> {\n agent: AgentSource<TAgent, TInput, TMetadata>;\n toolReplay?: PiAiToolReplayPolicies<TInput, TMetadata>;\n output?: PiAiHarnessOutputSelector<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >;\n name?: string;\n}\n\ninterface 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 TOutput extends JsonValue | undefined = JsonValue | undefined,\n> extends PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n > {\n tools: TTools;\n run?: (\n args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n}\n\ninterface PiAiHarnessInferredToolsOptions<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> extends PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n InferredPiAiToolset<TInput, TMetadata>,\n TOutput\n > {\n tools?: undefined;\n run?: (\n args: PiAiHarnessRunArgs<\n TAgent,\n TInput,\n TMetadata,\n InferredPiAiToolset<TInput, TMetadata>\n >,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n}\n\ntype 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 TOutput extends JsonValue | undefined = JsonValue | undefined,\n> =\n | PiAiHarnessWithToolsOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >\n | PiAiHarnessInferredToolsOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TOutput\n >;\n\ntype PiAiHarnessWithToolsOptionsWithOutput<\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 TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = PiAiHarnessWithToolsOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n> & {\n output: PiAiHarnessOutputSelector<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >;\n};\n\ntype PiAiHarnessInferredToolsOptionsWithOutput<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = PiAiHarnessInferredToolsOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TOutput\n> & {\n output: PiAiHarnessOutputSelector<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n InferredPiAiToolset<TInput, TMetadata>,\n TOutput\n >;\n};\n\ntype PiAiHarnessWithToolsRunOptionsWithoutOutput<\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> = PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n JsonValue | undefined\n> & {\n tools: TTools;\n run: (\n args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n ) => MaybePromise<TResult>;\n output?: never;\n};\n\ntype PiAiHarnessWithToolsAgentOptionsWithoutOutput<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n> = PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n unknown,\n TTools,\n JsonValue | undefined\n> & {\n tools: TTools;\n run?: never;\n output?: never;\n};\n\ntype PiAiHarnessInferredToolsRunOptionsWithoutOutput<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n> = PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n InferredPiAiToolset<TInput, TMetadata>,\n JsonValue | undefined\n> & {\n tools?: undefined;\n run: (\n args: PiAiHarnessRunArgs<\n TAgent,\n TInput,\n TMetadata,\n InferredPiAiToolset<TInput, TMetadata>\n >,\n ) => MaybePromise<TResult>;\n output?: never;\n};\n\ntype PiAiHarnessInferredToolsAgentOptionsWithoutOutput<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n unknown,\n InferredPiAiToolset<TInput, TMetadata>,\n JsonValue | undefined\n> & {\n tools?: undefined;\n run?: never;\n output?: never;\n};\n\ntype PiAiHarnessRunOptions<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n TOutput extends JsonValue | undefined,\n> = PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n> & {\n run?: (\n args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n};\n\ntype PiAiRunnableAgent<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends PiAiToolset<TInput, TMetadata>,\n> = {\n run: (\n input: TInput,\n runtime: PiAiRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n};\n\ntype PiAiHarnessOutputSelector<\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 TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = (\n args: PiAiHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n) => MaybePromise<TOutput>;\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 TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: PiAiHarnessWithToolsOptionsWithOutput<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n): Harness<TInput, TOutput, TMetadata>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: PiAiHarnessInferredToolsOptionsWithOutput<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TOutput\n >,\n): Harness<TInput, TOutput, 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: PiAiHarnessWithToolsRunOptionsWithoutOutput<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools\n >,\n): Harness<TInput, PiAiResultOutput<Awaited<TResult>>, TMetadata>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n>(\n options: PiAiHarnessWithToolsAgentOptionsWithoutOutput<\n TAgent,\n TInput,\n TMetadata,\n TTools\n >,\n): Harness<\n TInput,\n PiAiResultOutput<PiAiAgentResult<TAgent, TInput, TMetadata, TTools>>,\n TMetadata\n>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n>(\n options: PiAiHarnessInferredToolsRunOptionsWithoutOutput<\n TAgent,\n TInput,\n TMetadata,\n TResult\n >,\n): Harness<TInput, PiAiResultOutput<Awaited<TResult>>, TMetadata>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n>(\n options: PiAiHarnessInferredToolsAgentOptionsWithoutOutput<\n TAgent,\n TInput,\n TMetadata\n >,\n): Harness<\n TInput,\n PiAiResultOutput<\n PiAiAgentResult<\n TAgent,\n TInput,\n TMetadata,\n InferredPiAiToolset<TInput, TMetadata>\n >\n >,\n TMetadata\n>;\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 TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: PiAiHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n): Harness<TInput, TOutput, TMetadata> {\n validateOptions(options);\n\n const harness: Harness<TInput, TOutput, TMetadata> = {\n name: options.name ?? \"pi-ai\",\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 return harness;\n}\n\nfunction validateOptions<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n) {\n if (options.agent === undefined) {\n throw new Error(\n \"piAiHarness requires agent. Pass an agent instance or an agent factory.\",\n );\n }\n}\n\nasync function executePiHarnessRun<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessRunOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\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<TOutput>> {\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) && !hasOutputSelector(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.output\n ? await options.output(resultArgs)\n : (resolveOutput(normalizeResult) as TOutput | undefined);\n const usage = resolveUsage(normalizeResult, runtime.toolCalls.length);\n const session = resolveSession(normalizeResult, messages, output, usage);\n\n return {\n session,\n output,\n usage,\n artifacts:\n Object.keys(context.artifacts).length > 0\n ? context.artifacts\n : undefined,\n errors: resolveErrors(normalizeResult),\n } as HarnessRun<TOutput>;\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 TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n args: PiAiCreateAgentArgs<TInput, TMetadata>,\n) {\n return resolveAgentSource(options.agent, args);\n}\n\nasync function resolveAgentSource<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n>(\n agent: AgentSource<TAgent, TInput, TMetadata>,\n args: PiAiCreateAgentArgs<TInput, TMetadata>,\n): Promise<TAgent> {\n if (isAgentFactory(agent)) {\n return agent(args);\n }\n\n return agent;\n}\n\nfunction isAgentFactory<TAgent, TInput, TMetadata extends HarnessMetadata>(\n agent: AgentSource<TAgent, TInput, TMetadata>,\n): agent is (\n args: PiAiCreateAgentArgs<TInput, TMetadata>,\n) => MaybePromise<TAgent> {\n return typeof agent === \"function\" && !hasPiAiRunMethod(agent);\n}\n\nfunction hasOutputSelector<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessRunOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n) {\n return Boolean(options.output);\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 TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessRunOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n): Promise<TResult | HarnessRun<TOutput>> {\n if (options.run) {\n return options.run(args);\n }\n\n if (\n hasPiAiRunMethod<TInput, TMetadata, TResult, TOutput, TTools>(args.agent)\n ) {\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 TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n): options is PiAiHarnessWithToolsOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n> {\n return options.tools !== undefined;\n}\n\nfunction hasPiAiRunMethod<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends PiAiToolset<TInput, TMetadata>,\n>(\n agent: unknown,\n): agent is PiAiRunnableAgent<TInput, TMetadata, TResult, TOutput, TTools> {\n if (!agent || (typeof agent !== \"object\" && typeof agent !== \"function\")) {\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 undefined;\n }\n\n const candidates = [\"output\"] satisfies string[];\n const resultRecord = result as Record<string, unknown>;\n\n for (const key of candidates) {\n if (Object.prototype.hasOwnProperty.call(resultRecord, key)) {\n return toOutputValue(resultRecord[key]);\n }\n }\n\n return undefined;\n}\n\n// Keep this adapter-local rather than exporting a core helper. Core\n// `toJsonValue` normalizes trace data; inferred app output should only accept\n// values that are already JSON-safe so the public contract stays explicit.\n// Invalid nested values reject the whole candidate instead of being patched.\nfunction toOutputValue(value: unknown): JsonValue | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n\n if (typeof value === \"number\") {\n return Number.isFinite(value) ? value : undefined;\n }\n\n if (Array.isArray(value)) {\n const items: JsonValue[] = [];\n for (const item of value) {\n const normalized = toOutputValue(item);\n if (normalized === undefined) {\n return undefined;\n }\n items.push(normalized);\n }\n return items;\n }\n\n if (typeof value === \"object\") {\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) {\n return undefined;\n }\n\n const record: Record<string, JsonValue> = {};\n for (const [key, entry] of Object.entries(value)) {\n const normalized = toOutputValue(entry);\n if (normalized === undefined) {\n return undefined;\n }\n record[key] = normalized;\n }\n return record;\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 const normalized = toJsonValue(result);\n return normalized !== undefined\n ? normalized\n : result === undefined\n ? undefined\n : String(result);\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 const agentResult = toJsonValue(result);\n\n return {\n __vitestEvals: {\n kind: \"pi-ai-native-tool-result\",\n version: 2,\n },\n agentResult: agentResult !== undefined ? agentResult : 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 if (\n !usageValue ||\n typeof usageValue !== \"object\" ||\n Array.isArray(usageValue)\n ) {\n return toolCallCount > 0 ? { toolCalls: toolCallCount } : {};\n }\n\n const usageRecord = usageValue as Record<string, unknown>;\n const usage: UsageSummary = {\n provider: stringField(usageRecord.provider),\n model: stringField(usageRecord.model),\n inputTokens: numberField(usageRecord.inputTokens),\n outputTokens: numberField(usageRecord.outputTokens),\n reasoningTokens: numberField(usageRecord.reasoningTokens),\n totalTokens: numberField(usageRecord.totalTokens),\n toolCalls: numberField(usageRecord.toolCalls),\n retries: numberField(usageRecord.retries),\n metadata: collectUsageMetadata(usageRecord),\n };\n\n if (usage.toolCalls === undefined && toolCallCount > 0) {\n usage.toolCalls = toolCallCount;\n }\n\n return usage;\n}\n\nfunction collectUsageMetadata(usage: Record<string, unknown>) {\n const metadata: Record<string, unknown> = {};\n const nestedMetadata = usage.metadata;\n if (\n nestedMetadata &&\n typeof nestedMetadata === \"object\" &&\n !Array.isArray(nestedMetadata)\n ) {\n Object.assign(metadata, nestedMetadata);\n }\n\n for (const [key, value] of Object.entries(usage)) {\n if (key === \"metadata\" || USAGE_SUMMARY_KEYS.has(key)) {\n continue;\n }\n metadata[key] = value;\n }\n\n return normalizeMetadata(metadata);\n}\n\nconst USAGE_SUMMARY_KEYS = new Set([\n \"provider\",\n \"model\",\n \"inputTokens\",\n \"outputTokens\",\n \"reasoningTokens\",\n \"totalTokens\",\n \"toolCalls\",\n \"retries\",\n]);\n\nfunction stringField(value: unknown) {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction numberField(value: unknown) {\n return typeof value === \"number\" && Number.isFinite(value)\n ? value\n : undefined;\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 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":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type {\n Harness,\n HarnessContext,\n HarnessMetadata,\n HarnessRun,\n JsonValue,\n NormalizedMessage,\n NormalizedSpan,\n NormalizedSession,\n NormalizedTrace,\n TimingSummary,\n ToolCallRecord,\n UsageSummary,\n} from \"vitest-evals/harness\";\nimport {\n attachHarnessRunToError,\n createFailedHarnessRun,\n createGenAiUsageAttributes,\n createToolCallSpans,\n ensureRunTrace,\n getHarnessRunFromError,\n isHarnessRun,\n isNormalizedSession,\n normalizeMetadata,\n normalizeContent,\n normalizeSpanAttributes,\n normalizeSpanError,\n resolveHarnessRunErrors,\n serializeError,\n toJsonValue,\n toolCalls as collectToolCalls,\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\";\nimport {\n createJudgeHarness,\n type JudgeHarnessInput,\n} from \"vitest-evals/judges\";\nimport { completeSimple } from \"@mariozechner/pi-ai\";\nimport type {\n Api,\n AssistantMessage,\n Model,\n SimpleStreamOptions,\n} from \"@mariozechner/pi-ai\";\n\ntype MaybePromise<T> = T | Promise<T>;\ntype JsonOutput<TValue> = [TValue] extends [JsonValue | undefined]\n ? TValue\n : undefined;\ntype ResultFieldOutput<\n TResult,\n TKey extends string,\n> = TKey extends keyof TResult\n ? Record<string, never> extends Pick<TResult, TKey>\n ? JsonOutput<TResult[TKey]> | undefined\n : JsonOutput<TResult[TKey]>\n : undefined;\ntype AgentSource<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> =\n | TAgent\n | ((args: PiAiCreateAgentArgs<TInput, TMetadata>) => MaybePromise<TAgent>);\ntype AnyPiAiToolset<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<string, PiAiToolDefinition<any, any, TInput, TMetadata>>;\n\nlet nextTraceId = 0;\n\n/**\n * Configuration for adapting a Pi AI model into a judge harness.\n *\n * @example\n * ```ts\n * import { getModel } from \"@mariozechner/pi-ai\";\n * import { piAiJudgeHarness } from \"@vitest-evals/harness-pi-ai\";\n *\n * const judgeHarness = piAiJudgeHarness({\n * model: getModel(\"anthropic\", \"claude-sonnet-4-5\"),\n * temperature: 0,\n * });\n * ```\n */\nexport interface PiAiJudgeHarnessConfig<TApi extends Api = Api> {\n /** Pi AI model used for judge prompts. */\n model: Model<TApi>;\n /** Optional display name for diagnostics. */\n name?: string;\n /** Optional judge-model temperature. */\n temperature?: number;\n /** Optional judge-model token cap. */\n maxOutputTokens?: number;\n /** Additional Pi AI stream options forwarded to `completeSimple(...)`. */\n options?: Omit<SimpleStreamOptions, \"signal\" | \"temperature\" | \"maxTokens\">;\n}\n\n/**\n * Adapts a Pi AI model into the provider-neutral judge harness API.\n *\n * @example\n * ```ts\n * import { getModel } from \"@mariozechner/pi-ai\";\n * import { piAiJudgeHarness } from \"@vitest-evals/harness-pi-ai\";\n * import { describeEval, FactualityJudge } from \"vitest-evals\";\n *\n * const judgeHarness = piAiJudgeHarness({\n * model: getModel(\"anthropic\", \"claude-sonnet-4-5\"),\n * temperature: 0,\n * });\n *\n * describeEval(\"qa agent\", {\n * harness: qaHarness,\n * judgeHarness,\n * judges: [FactualityJudge()],\n * }, (it) => {});\n * ```\n */\nexport function piAiJudgeHarness<TApi extends Api>(\n config: PiAiJudgeHarnessConfig<TApi>,\n) {\n return createJudgeHarness({\n name: config.name ?? \"pi-ai\",\n run: async ({ responseFormat, system, prompt }, { signal }) => {\n const message = await completeSimple(\n config.model,\n {\n systemPrompt: formatPiAiJudgeSystemPrompt(system, responseFormat),\n messages: [\n {\n role: \"user\",\n content: prompt,\n timestamp: Date.now(),\n },\n ],\n },\n {\n ...(config.options ?? {}),\n ...(config.temperature !== undefined\n ? { temperature: config.temperature }\n : {}),\n ...(config.maxOutputTokens !== undefined\n ? { maxTokens: config.maxOutputTokens }\n : {}),\n ...(signal ? { signal } : {}),\n },\n );\n\n return resolvePiAiJudgeText(message);\n },\n });\n}\n\nfunction formatPiAiJudgeSystemPrompt(\n system: string | undefined,\n responseFormat: JudgeHarnessInput[\"responseFormat\"],\n) {\n if (responseFormat?.type !== \"json\") {\n return system;\n }\n\n const jsonInstruction = [\n \"Return only valid JSON. Do not include markdown fences or explanatory prose.\",\n responseFormat.schema\n ? `JSON Schema:\\n${JSON.stringify(responseFormat.schema, null, 2)}`\n : undefined,\n ]\n .filter(Boolean)\n .join(\"\\n\\n\");\n\n return system ? `${system}\\n\\n${jsonInstruction}` : jsonInstruction;\n}\n\nfunction resolvePiAiJudgeText(message: AssistantMessage) {\n if (message.stopReason === \"error\" || message.stopReason === \"aborted\") {\n throw new Error(message.errorMessage ?? \"Pi AI judge harness failed.\");\n }\n\n return message.content\n .filter((part) => part.type === \"text\")\n .map((part) => part.text)\n .join(\"\")\n .trim();\n}\n\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\ntype PiAiResultOutput<TResult> = TResult extends HarnessRun<infer TOutput>\n ? TOutput\n : \"output\" extends keyof TResult\n ? ResultFieldOutput<TResult, \"output\">\n : undefined;\ntype PiAiAgentResult<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TTools extends PiAiToolset<TInput, TMetadata>,\n> = TAgent extends {\n run: (\n input: TInput,\n runtime: PiAiRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<infer TResult>;\n}\n ? Awaited<TResult>\n : unknown;\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\n/** Replay mode alias used by the Pi AI harness package. */\nexport type PiAiReplayMode = ReplayMode;\n\n/** Event sink for recording Pi AI transcript messages. */\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\n/** Context passed to instrumented Pi AI tool executions. */\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\n/** Tool replay recording shape for Pi AI tools. */\nexport type PiAiToolRecording<\n TArgs extends Record<string, JsonValue> = Record<string, JsonValue>,\n TResult extends JsonValue = JsonValue,\n> = ToolRecording<TArgs, TResult>;\n\n/** Replay configuration for a Pi AI tool. */\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\n/** Replay policy for one Pi AI tool. */\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\n/** Replay policy map keyed by Pi AI tool name. */\nexport type PiAiToolReplayPolicies<\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = Record<string, PiAiToolReplayPolicy<TInput, TMetadata>>;\n\n/** Tool definition accepted by the Pi AI harness runtime. */\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\n/** Toolset shape accepted by the Pi AI harness. */\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\n/** Runtime object passed into Pi AI agent entrypoints. */\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\n/** Arguments passed to custom Pi AI harness run callbacks. */\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\n/** Arguments passed to Pi AI harness output selectors. */\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\n/** Arguments passed to per-run Pi AI agent factories. */\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 TOutput extends JsonValue | undefined = JsonValue | undefined,\n> {\n agent: AgentSource<TAgent, TInput, TMetadata>;\n toolReplay?: PiAiToolReplayPolicies<TInput, TMetadata>;\n output?: PiAiHarnessOutputSelector<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >;\n name?: string;\n}\n\ninterface 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 TOutput extends JsonValue | undefined = JsonValue | undefined,\n> extends PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n > {\n tools: TTools;\n run?: (\n args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n}\n\ninterface PiAiHarnessInferredToolsOptions<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> extends PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n InferredPiAiToolset<TInput, TMetadata>,\n TOutput\n > {\n tools?: undefined;\n run?: (\n args: PiAiHarnessRunArgs<\n TAgent,\n TInput,\n TMetadata,\n InferredPiAiToolset<TInput, TMetadata>\n >,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n}\n\ntype 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 TOutput extends JsonValue | undefined = JsonValue | undefined,\n> =\n | PiAiHarnessWithToolsOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >\n | PiAiHarnessInferredToolsOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TOutput\n >;\n\ntype PiAiHarnessWithToolsOptionsWithOutput<\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 TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = PiAiHarnessWithToolsOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n> & {\n output: PiAiHarnessOutputSelector<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >;\n};\n\ntype PiAiHarnessInferredToolsOptionsWithOutput<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = PiAiHarnessInferredToolsOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TOutput\n> & {\n output: PiAiHarnessOutputSelector<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n InferredPiAiToolset<TInput, TMetadata>,\n TOutput\n >;\n};\n\ntype PiAiHarnessWithToolsRunOptionsWithoutOutput<\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> = PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n JsonValue | undefined\n> & {\n tools: TTools;\n run: (\n args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n ) => MaybePromise<TResult>;\n output?: never;\n};\n\ntype PiAiHarnessWithToolsAgentOptionsWithoutOutput<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n> = PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n unknown,\n TTools,\n JsonValue | undefined\n> & {\n tools: TTools;\n run?: never;\n output?: never;\n};\n\ntype PiAiHarnessInferredToolsRunOptionsWithoutOutput<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n> = PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n InferredPiAiToolset<TInput, TMetadata>,\n JsonValue | undefined\n> & {\n tools?: undefined;\n run: (\n args: PiAiHarnessRunArgs<\n TAgent,\n TInput,\n TMetadata,\n InferredPiAiToolset<TInput, TMetadata>\n >,\n ) => MaybePromise<TResult>;\n output?: never;\n};\n\ntype PiAiHarnessInferredToolsAgentOptionsWithoutOutput<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n> = PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n unknown,\n InferredPiAiToolset<TInput, TMetadata>,\n JsonValue | undefined\n> & {\n tools?: undefined;\n run?: never;\n output?: never;\n};\n\ntype PiAiHarnessRunOptions<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n TOutput extends JsonValue | undefined,\n> = PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n> & {\n run?: (\n args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n};\n\ntype PiAiRunnableAgent<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends PiAiToolset<TInput, TMetadata>,\n> = {\n run: (\n input: TInput,\n runtime: PiAiRuntime<TTools, TInput, TMetadata>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n};\n\ntype PiAiHarnessOutputSelector<\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 TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = (\n args: PiAiHarnessResultArgs<TAgent, TInput, TMetadata, TResult, TTools>,\n) => MaybePromise<TOutput>;\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 TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: PiAiHarnessWithToolsOptionsWithOutput<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n): Harness<TInput, TOutput, TMetadata>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: PiAiHarnessInferredToolsOptionsWithOutput<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TOutput\n >,\n): Harness<TInput, TOutput, 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: PiAiHarnessWithToolsRunOptionsWithoutOutput<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools\n >,\n): Harness<TInput, PiAiResultOutput<Awaited<TResult>>, TMetadata>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TTools extends PiAiToolset<TInput, TMetadata> = PiAiToolset<\n TInput,\n TMetadata\n >,\n>(\n options: PiAiHarnessWithToolsAgentOptionsWithoutOutput<\n TAgent,\n TInput,\n TMetadata,\n TTools\n >,\n): Harness<\n TInput,\n PiAiResultOutput<PiAiAgentResult<TAgent, TInput, TMetadata, TTools>>,\n TMetadata\n>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n TResult = unknown,\n>(\n options: PiAiHarnessInferredToolsRunOptionsWithoutOutput<\n TAgent,\n TInput,\n TMetadata,\n TResult\n >,\n): Harness<TInput, PiAiResultOutput<Awaited<TResult>>, TMetadata>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TMetadata extends HarnessMetadata = HarnessMetadata,\n>(\n options: PiAiHarnessInferredToolsAgentOptionsWithoutOutput<\n TAgent,\n TInput,\n TMetadata\n >,\n): Harness<\n TInput,\n PiAiResultOutput<\n PiAiAgentResult<\n TAgent,\n TInput,\n TMetadata,\n InferredPiAiToolset<TInput, TMetadata>\n >\n >,\n TMetadata\n>;\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 TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: PiAiHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n): Harness<TInput, TOutput, TMetadata> {\n validateOptions(options);\n\n const harnessName = options.name ?? \"pi-ai\";\n const harness: Harness<TInput, TOutput, TMetadata> = {\n name: harnessName,\n run: async (input, context) => {\n const startedAt = new Date();\n\n try {\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 await executePiHarnessRun(\n options,\n agent,\n input,\n context,\n messages,\n options.tools,\n inferredTools.nativeToolsets,\n );\n }\n\n return await executePiHarnessRun(\n options,\n agent,\n input,\n context,\n messages,\n inferredTools.runtimeTools,\n inferredTools.nativeToolsets,\n );\n } catch (error) {\n if (getHarnessRunFromError(error)) {\n throw error;\n }\n\n throw attachHarnessRunToError(\n error,\n createFailedPiAiRun(input, context, error, harnessName, startedAt),\n );\n }\n },\n };\n\n return harness;\n}\n\nfunction createFailedPiAiRun<TInput, TMetadata extends HarnessMetadata>(\n input: TInput,\n context: HarnessContext<TMetadata>,\n error: unknown,\n harnessName: string,\n startedAt: Date,\n) {\n const run = createFailedHarnessRun(input, error, {\n artifacts: context.artifacts,\n });\n ensureRunTrace(run, {\n name: harnessName,\n startedAt,\n finishedAt: new Date(),\n operationName: \"invoke_agent\",\n source: \"harness-pi-ai\",\n });\n\n return run;\n}\n\nfunction validateOptions<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n) {\n if (options.agent === undefined) {\n throw new Error(\n \"piAiHarness requires agent. Pass an agent instance or an agent factory.\",\n );\n }\n}\n\nasync function executePiHarnessRun<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessRunOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\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<TOutput>> {\n const trace = createTraceRecorder(options.name ?? \"pi-ai\");\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) && !hasOutputSelector(options)) {\n if (Object.keys(context.artifacts).length > 0 && !result.artifacts) {\n result.artifacts = context.artifacts;\n }\n attachPiAiTrace(result, trace, new Date());\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.output\n ? await options.output(resultArgs)\n : (resolveOutput(normalizeResult) as TOutput | undefined);\n const usage = resolveUsage(normalizeResult, runtime.toolCalls.length);\n const session = resolveSession(normalizeResult, messages, output, usage);\n const errors = resolveErrors(normalizeResult);\n const finishedAt = new Date();\n\n return {\n session,\n output,\n usage,\n artifacts:\n Object.keys(context.artifacts).length > 0\n ? context.artifacts\n : undefined,\n errors,\n traces: [\n finishPiAiTrace(trace, {\n session,\n usage,\n errors,\n finishedAt,\n }),\n ],\n } as HarnessRun<TOutput>;\n } catch (error) {\n const usage = resolveUsage(undefined, runtime.toolCalls.length);\n const session = resolveSession(undefined, messages, undefined, usage);\n const finishedAt = new Date();\n const serializedError = serializeError(error);\n const run = {\n session,\n output: undefined,\n usage,\n artifacts:\n Object.keys(context.artifacts).length > 0\n ? context.artifacts\n : undefined,\n errors: [serializedError],\n traces: [\n finishPiAiTrace(trace, {\n session,\n usage,\n errors: [serializedError],\n finishedAt,\n }),\n ],\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 TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n args: PiAiCreateAgentArgs<TInput, TMetadata>,\n) {\n return resolveAgentSource(options.agent, args);\n}\n\nasync function resolveAgentSource<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n>(\n agent: AgentSource<TAgent, TInput, TMetadata>,\n args: PiAiCreateAgentArgs<TInput, TMetadata>,\n): Promise<TAgent> {\n if (isAgentFactory(agent)) {\n return agent(args);\n }\n\n return agent;\n}\n\nfunction isAgentFactory<TAgent, TInput, TMetadata extends HarnessMetadata>(\n agent: AgentSource<TAgent, TInput, TMetadata>,\n): agent is (\n args: PiAiCreateAgentArgs<TInput, TMetadata>,\n) => MaybePromise<TAgent> {\n return typeof agent === \"function\" && !hasPiAiRunMethod(agent);\n}\n\nfunction hasOutputSelector<\n TAgent,\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TTools extends PiAiToolset<TInput, TMetadata>,\n TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessRunOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n) {\n return Boolean(options.output);\n}\n\ntype TraceRecorder = {\n id: string;\n rootSpanId: string;\n name: string;\n startedAt: Date;\n};\n\nfunction createTraceRecorder(name: string): TraceRecorder {\n const id = `pi_ai_trace_${++nextTraceId}`;\n\n return {\n id,\n rootSpanId: `${id}:run`,\n name,\n startedAt: new Date(),\n };\n}\n\nfunction attachPiAiTrace(\n run: HarnessRun,\n trace: TraceRecorder,\n finishedAt: Date,\n) {\n const nativeTrace = finishPiAiTrace(trace, {\n session: run.session,\n usage: run.usage,\n errors: run.errors ?? [],\n finishedAt,\n });\n\n run.traces = [...(run.traces ?? []), nativeTrace];\n}\n\nfunction finishPiAiTrace(\n trace: TraceRecorder,\n options: {\n session: NormalizedSession;\n usage?: UsageSummary;\n errors?: unknown[];\n finishedAt: Date;\n },\n): NormalizedTrace {\n const finishedAt = options.finishedAt;\n const durationMs = finishedAt.getTime() - trace.startedAt.getTime();\n const rootError = options.errors?.[0]\n ? normalizeSpanError(options.errors[0])\n : undefined;\n const rootSpan: NormalizedSpan = {\n id: trace.rootSpanId,\n traceId: trace.id,\n name: trace.name,\n kind: \"run\",\n startedAt: trace.startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs,\n status: rootError ? \"error\" : \"ok\",\n ...(rootError ? { error: rootError } : {}),\n attributes: normalizeSpanAttributes({\n \"gen_ai.operation.name\": \"invoke_agent\",\n \"gen_ai.workflow.name\": trace.name,\n ...createGenAiUsageAttributes(options.usage),\n }),\n };\n const modelSpan = createUsageModelSpan(trace, options.usage);\n const spans = [\n rootSpan,\n ...(modelSpan ? [modelSpan] : []),\n ...createToolCallSpans(collectToolCalls(options.session), {\n traceId: trace.id,\n parentId: trace.rootSpanId,\n spanIdPrefix: `${trace.id}:tool`,\n }),\n ];\n\n return {\n id: trace.id,\n name: trace.name,\n startedAt: trace.startedAt.toISOString(),\n finishedAt: finishedAt.toISOString(),\n durationMs,\n metadata: {\n source: \"harness-pi-ai\",\n },\n spans,\n };\n}\n\nfunction createUsageModelSpan(\n trace: TraceRecorder,\n usage: UsageSummary | undefined,\n): NormalizedSpan | undefined {\n if (!usage?.provider && !usage?.model) {\n return undefined;\n }\n\n return {\n id: `${trace.id}:model:1`,\n traceId: trace.id,\n parentId: trace.rootSpanId,\n name: usage.model ? `pi-ai ${usage.model}` : \"pi-ai model\",\n kind: \"model\",\n status: \"ok\",\n attributes: normalizeSpanAttributes({\n \"gen_ai.operation.name\": \"chat\",\n ...createGenAiUsageAttributes(usage),\n }),\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 TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessRunOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n args: PiAiHarnessRunArgs<TAgent, TInput, TMetadata, TTools>,\n): Promise<TResult | HarnessRun<TOutput>> {\n if (options.run) {\n return options.run(args);\n }\n\n if (\n hasPiAiRunMethod<TInput, TMetadata, TResult, TOutput, TTools>(args.agent)\n ) {\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 TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n >,\n): options is PiAiHarnessWithToolsOptions<\n TAgent,\n TInput,\n TMetadata,\n TResult,\n TTools,\n TOutput\n> {\n return options.tools !== undefined;\n}\n\nfunction hasPiAiRunMethod<\n TInput,\n TMetadata extends HarnessMetadata,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends PiAiToolset<TInput, TMetadata>,\n>(\n agent: unknown,\n): agent is PiAiRunnableAgent<TInput, TMetadata, TResult, TOutput, TTools> {\n if (!agent || (typeof agent !== \"object\" && typeof agent !== \"function\")) {\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 id: toolCallId,\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 id: toolCallId,\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 undefined;\n }\n\n const candidates = [\"output\"] satisfies string[];\n const resultRecord = result as Record<string, unknown>;\n\n for (const key of candidates) {\n if (Object.prototype.hasOwnProperty.call(resultRecord, key)) {\n return toOutputValue(resultRecord[key]);\n }\n }\n\n return undefined;\n}\n\n// Keep this adapter-local rather than exporting a core helper. Core\n// `toJsonValue` normalizes trace data; inferred app output should only accept\n// values that are already JSON-safe so the public contract stays explicit.\n// Invalid nested values reject the whole candidate instead of being patched.\nfunction toOutputValue(value: unknown): JsonValue | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n\n if (typeof value === \"number\") {\n return Number.isFinite(value) ? value : undefined;\n }\n\n if (Array.isArray(value)) {\n const items: JsonValue[] = [];\n for (const item of value) {\n const normalized = toOutputValue(item);\n if (normalized === undefined) {\n return undefined;\n }\n items.push(normalized);\n }\n return items;\n }\n\n if (typeof value === \"object\") {\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) {\n return undefined;\n }\n\n const record: Record<string, JsonValue> = {};\n for (const [key, entry] of Object.entries(value)) {\n const normalized = toOutputValue(entry);\n if (normalized === undefined) {\n return undefined;\n }\n record[key] = normalized;\n }\n return record;\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 const normalized = toJsonValue(result);\n return normalized !== undefined\n ? normalized\n : result === undefined\n ? undefined\n : String(result);\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 const agentResult = toJsonValue(result);\n\n return {\n __vitestEvals: {\n kind: \"pi-ai-native-tool-result\",\n version: 2,\n },\n agentResult: agentResult !== undefined ? agentResult : 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 if (\n !usageValue ||\n typeof usageValue !== \"object\" ||\n Array.isArray(usageValue)\n ) {\n return toolCallCount > 0 ? { toolCalls: toolCallCount } : {};\n }\n\n const usageRecord = usageValue as Record<string, unknown>;\n const usage: UsageSummary = {\n provider: stringField(usageRecord.provider),\n model: stringField(usageRecord.model),\n inputTokens: numberField(usageRecord.inputTokens),\n outputTokens: numberField(usageRecord.outputTokens),\n reasoningTokens: numberField(usageRecord.reasoningTokens),\n totalTokens: numberField(usageRecord.totalTokens),\n toolCalls: numberField(usageRecord.toolCalls),\n retries: numberField(usageRecord.retries),\n metadata: collectUsageMetadata(usageRecord),\n };\n\n if (usage.toolCalls === undefined && toolCallCount > 0) {\n usage.toolCalls = toolCallCount;\n }\n\n return usage;\n}\n\nfunction collectUsageMetadata(usage: Record<string, unknown>) {\n const metadata: Record<string, unknown> = {};\n const nestedMetadata = usage.metadata;\n if (\n nestedMetadata &&\n typeof nestedMetadata === \"object\" &&\n !Array.isArray(nestedMetadata)\n ) {\n Object.assign(metadata, nestedMetadata);\n }\n\n for (const [key, value] of Object.entries(usage)) {\n if (key === \"metadata\" || USAGE_SUMMARY_KEYS.has(key)) {\n continue;\n }\n metadata[key] = value;\n }\n\n return normalizeMetadata(metadata);\n}\n\nconst USAGE_SUMMARY_KEYS = new Set([\n \"provider\",\n \"model\",\n \"inputTokens\",\n \"outputTokens\",\n \"reasoningTokens\",\n \"totalTokens\",\n \"toolCalls\",\n \"retries\",\n]);\n\nfunction stringField(value: unknown) {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction numberField(value: unknown) {\n return typeof value === \"number\" && Number.isFinite(value)\n ? value\n : undefined;\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 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":["collectToolCalls"]}