@vitest-evals/harness-pi-ai 0.16.0 → 0.17.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 +26 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +26 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -52,7 +52,22 @@ function piAiJudgeHarness(config) {
|
|
|
52
52
|
...signal ? { signal } : {}
|
|
53
53
|
}
|
|
54
54
|
);
|
|
55
|
-
|
|
55
|
+
const output = resolvePiAiJudgeText(message);
|
|
56
|
+
const usage = resolveUsage(message, 0);
|
|
57
|
+
return {
|
|
58
|
+
output,
|
|
59
|
+
session: resolveSession(
|
|
60
|
+
message,
|
|
61
|
+
[
|
|
62
|
+
{ type: "message", role: "user", content: prompt },
|
|
63
|
+
{ type: "message", role: "assistant", content: output }
|
|
64
|
+
],
|
|
65
|
+
output,
|
|
66
|
+
usage
|
|
67
|
+
),
|
|
68
|
+
usage,
|
|
69
|
+
errors: []
|
|
70
|
+
};
|
|
56
71
|
}
|
|
57
72
|
});
|
|
58
73
|
}
|
|
@@ -890,6 +905,7 @@ function resolveUsage(result, toolCallCount) {
|
|
|
890
905
|
outputTokens: numberField(usageRecord.outputTokens),
|
|
891
906
|
reasoningTokens: numberField(usageRecord.reasoningTokens),
|
|
892
907
|
totalTokens: numberField(usageRecord.totalTokens),
|
|
908
|
+
costUsd: resolveCostUsd(usageRecord),
|
|
893
909
|
toolCalls: numberField(usageRecord.toolCalls),
|
|
894
910
|
retries: numberField(usageRecord.retries),
|
|
895
911
|
metadata: collectUsageMetadata(usageRecord)
|
|
@@ -920,9 +936,18 @@ var USAGE_SUMMARY_KEYS = /* @__PURE__ */ new Set([
|
|
|
920
936
|
"outputTokens",
|
|
921
937
|
"reasoningTokens",
|
|
922
938
|
"totalTokens",
|
|
939
|
+
"costUsd",
|
|
923
940
|
"toolCalls",
|
|
924
941
|
"retries"
|
|
925
942
|
]);
|
|
943
|
+
function resolveCostUsd(usage) {
|
|
944
|
+
const direct = numberField(usage.costUsd);
|
|
945
|
+
if (direct !== void 0) {
|
|
946
|
+
return direct;
|
|
947
|
+
}
|
|
948
|
+
const cost = usage.cost;
|
|
949
|
+
return cost && typeof cost === "object" && !Array.isArray(cost) ? numberField(cost.total) : void 0;
|
|
950
|
+
}
|
|
926
951
|
function stringField(value) {
|
|
927
952
|
return typeof value === "string" ? value : void 0;
|
|
928
953
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type {\n Harness,\n HarnessContext,\n HarnessRun,\n JsonValue,\n NormalizedError,\n NormalizedSpan,\n NormalizedSession,\n TranscriptEvent,\n TranscriptMessageEvent,\n TranscriptToolCallEvent,\n NormalizedTrace,\n TimingSummary,\n UsageSummary,\n} from \"vitest-evals/harness\";\nimport {\n attachHarnessRunToError,\n createFailedHarnessRun,\n createGenAiUsageAttributes,\n ensureRunTrace,\n getHarnessRunFromError,\n isHarnessRun,\n isNormalizedSession,\n normalizeMetadata,\n normalizeContent,\n normalizeSpanAttributes,\n normalizeSpanError,\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<TAgent, TInput = string> =\n | TAgent\n | ((args: PiAiCreateAgentArgs<TInput>) => MaybePromise<TAgent>);\ntype AnyPiAiToolset<TInput = string> = Record<\n string,\n PiAiToolDefinition<any, any, TInput>\n>;\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<TInput = string> = Record<\n string,\n PiAiToolDefinition<Record<string, JsonValue>, JsonValue, TInput>\n>;\n\ntype PiAgentToolLike<TInput = string> = {\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 TTools extends PiAiToolset<TInput>,\n> = TAgent extends {\n run: (\n input: TInput,\n runtime: PiAiRuntime<TTools, TInput>,\n ) => MaybePromise<infer TResult>;\n}\n ? Awaited<TResult>\n : unknown;\n\nconst ORIGINAL_NATIVE_EXECUTE = Symbol(\"vitest-evals.originalNativeExecute\");\n\ntype NativeToolExecute<TInput> = PiAgentToolLike<TInput>[\"execute\"] & {\n [ORIGINAL_NATIVE_EXECUTE]?: PiAgentToolLike<TInput>[\"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 events. */\nexport interface PiAiEventSink {\n message: (event: TranscriptMessageEvent) => 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 /** Records a tool-result event linked to an assistant tool call by id. */\n tool: (\n toolCallId: string,\n content: JsonValue,\n options?: {\n name?: string;\n error?: NormalizedError;\n metadata?: Record<string, JsonValue>;\n },\n ) => void;\n}\n\n/** Context passed to instrumented Pi AI tool executions. */\nexport interface PiAiToolContext<TInput = string> {\n input: TInput;\n signal?: AbortSignal;\n setArtifact: HarnessContext[\"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> = ToolReplayConfig<TArgs, TResult, PiAiToolContext<TInput>>;\n\n/** Replay policy for one Pi AI tool. */\nexport type PiAiToolReplayPolicy<TInput = string> =\n | boolean\n | PiAiToolReplayConfig<Record<string, JsonValue>, JsonValue, TInput>;\n\n/** Replay policy map keyed by Pi AI tool name. */\nexport type PiAiToolReplayPolicies<TInput = string> = Record<\n string,\n PiAiToolReplayPolicy<TInput>\n>;\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> {\n description?: string;\n execute: (\n args: TArgs,\n context: PiAiToolContext<TInput>,\n ) => MaybePromise<TResult>;\n}\n\n/** Toolset shape accepted by the Pi AI harness. */\nexport type PiAiToolset<TInput = string> = AnyPiAiToolset<TInput>;\n\ntype ToolArgs<TTool> = TTool extends PiAiToolDefinition<\n infer TArgs,\n infer _TResult,\n infer _TInput\n>\n ? TArgs\n : never;\n\ntype ToolResult<TTool> = TTool extends PiAiToolDefinition<\n infer _TArgs,\n infer TResult,\n infer _TInput\n>\n ? TResult\n : never;\n\n/** Runtime object passed into Pi AI agent entrypoints. */\nexport type PiAiRuntime<TTools extends PiAiToolset<TInput>, TInput = string> = {\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 TTools extends PiAiToolset<TInput>,\n> {\n agent: TAgent;\n input: TInput;\n context: HarnessContext;\n runtime: PiAiRuntime<TTools, TInput>;\n}\n\n/** Arguments passed to Pi AI harness output selectors. */\nexport interface PiAiHarnessResultArgs<\n TAgent,\n TInput,\n TResult,\n TTools extends PiAiToolset<TInput>,\n> extends PiAiHarnessRunArgs<TAgent, TInput, TTools> {\n result: TResult;\n}\n\n/** Arguments passed to per-run Pi AI agent factories. */\nexport interface PiAiCreateAgentArgs<TInput = string> {\n input: TInput;\n context: HarnessContext;\n}\n\ninterface PiAiHarnessBaseOptions<\n TAgent,\n TInput = string,\n TResult = unknown,\n TTools extends PiAiToolset<TInput> = PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> {\n agent: AgentSource<TAgent, TInput>;\n toolReplay?: PiAiToolReplayPolicies<TInput>;\n output?: PiAiHarnessOutputSelector<TAgent, TInput, TResult, TTools, TOutput>;\n name?: string;\n}\n\ninterface PiAiHarnessWithToolsOptions<\n TAgent,\n TInput = string,\n TResult = unknown,\n TTools extends PiAiToolset<TInput> = PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> extends PiAiHarnessBaseOptions<TAgent, TInput, TResult, TTools, TOutput> {\n tools: TTools;\n run?: (\n args: PiAiHarnessRunArgs<TAgent, TInput, TTools>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n}\n\ninterface PiAiHarnessInferredToolsOptions<\n TAgent,\n TInput = string,\n TResult = unknown,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> extends PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TResult,\n InferredPiAiToolset<TInput>,\n TOutput\n > {\n tools?: undefined;\n run?: (\n args: PiAiHarnessRunArgs<TAgent, TInput, InferredPiAiToolset<TInput>>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n}\n\ntype PiAiHarnessOptions<\n TAgent,\n TInput = string,\n TResult = unknown,\n TTools extends PiAiToolset<TInput> = PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> =\n | PiAiHarnessWithToolsOptions<TAgent, TInput, TResult, TTools, TOutput>\n | PiAiHarnessInferredToolsOptions<TAgent, TInput, TResult, TOutput>;\n\ntype PiAiHarnessWithToolsOptionsWithOutput<\n TAgent,\n TInput = string,\n TResult = unknown,\n TTools extends PiAiToolset<TInput> = PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = PiAiHarnessWithToolsOptions<TAgent, TInput, TResult, TTools, TOutput> & {\n output: PiAiHarnessOutputSelector<TAgent, TInput, TResult, TTools, TOutput>;\n};\n\ntype PiAiHarnessInferredToolsOptionsWithOutput<\n TAgent,\n TInput = string,\n TResult = unknown,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = PiAiHarnessInferredToolsOptions<TAgent, TInput, TResult, TOutput> & {\n output: PiAiHarnessOutputSelector<\n TAgent,\n TInput,\n TResult,\n InferredPiAiToolset<TInput>,\n TOutput\n >;\n};\n\ntype PiAiHarnessWithToolsRunOptionsWithoutOutput<\n TAgent,\n TInput = string,\n TResult = unknown,\n TTools extends PiAiToolset<TInput> = PiAiToolset<TInput>,\n> = PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TResult,\n TTools,\n JsonValue | undefined\n> & {\n tools: TTools;\n run: (\n args: PiAiHarnessRunArgs<TAgent, TInput, TTools>,\n ) => MaybePromise<TResult>;\n output?: never;\n};\n\ntype PiAiHarnessWithToolsAgentOptionsWithoutOutput<\n TAgent,\n TInput = string,\n TTools extends PiAiToolset<TInput> = PiAiToolset<TInput>,\n> = PiAiHarnessBaseOptions<\n TAgent,\n TInput,\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 TResult = unknown,\n> = PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TResult,\n InferredPiAiToolset<TInput>,\n JsonValue | undefined\n> & {\n tools?: undefined;\n run: (\n args: PiAiHarnessRunArgs<TAgent, TInput, InferredPiAiToolset<TInput>>,\n ) => MaybePromise<TResult>;\n output?: never;\n};\n\ntype PiAiHarnessInferredToolsAgentOptionsWithoutOutput<\n TAgent,\n TInput = string,\n> = PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n unknown,\n InferredPiAiToolset<TInput>,\n JsonValue | undefined\n> & {\n tools?: undefined;\n run?: never;\n output?: never;\n};\n\ntype PiAiHarnessRunOptions<\n TAgent,\n TInput,\n TResult,\n TTools extends PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined,\n> = PiAiHarnessBaseOptions<TAgent, TInput, TResult, TTools, TOutput> & {\n run?: (\n args: PiAiHarnessRunArgs<TAgent, TInput, TTools>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n};\n\ntype PiAiRunnableAgent<\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends PiAiToolset<TInput>,\n> = {\n run: (\n input: TInput,\n runtime: PiAiRuntime<TTools, TInput>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n};\n\ntype PiAiHarnessOutputSelector<\n TAgent,\n TInput = string,\n TResult = unknown,\n TTools extends PiAiToolset<TInput> = PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = (\n args: PiAiHarnessResultArgs<TAgent, TInput, TResult, TTools>,\n) => MaybePromise<TOutput>;\n\ntype InferredToolSurfaces<TInput> = {\n runtimeTools?: InferredPiAiToolset<TInput>;\n nativeToolsets?: Array<PiAgentToolLike<TInput>[]>;\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 TResult = unknown,\n TTools extends PiAiToolset<TInput> = PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: PiAiHarnessWithToolsOptionsWithOutput<\n TAgent,\n TInput,\n TResult,\n TTools,\n TOutput\n >,\n): Harness<TInput, TOutput>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TResult = unknown,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: PiAiHarnessInferredToolsOptionsWithOutput<\n TAgent,\n TInput,\n TResult,\n TOutput\n >,\n): Harness<TInput, TOutput>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TResult = unknown,\n TTools extends PiAiToolset<TInput> = PiAiToolset<TInput>,\n>(\n options: PiAiHarnessWithToolsRunOptionsWithoutOutput<\n TAgent,\n TInput,\n TResult,\n TTools\n >,\n): Harness<TInput, PiAiResultOutput<Awaited<TResult>>>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TTools extends PiAiToolset<TInput> = PiAiToolset<TInput>,\n>(\n options: PiAiHarnessWithToolsAgentOptionsWithoutOutput<\n TAgent,\n TInput,\n TTools\n >,\n): Harness<TInput, PiAiResultOutput<PiAiAgentResult<TAgent, TInput, TTools>>>;\nexport function piAiHarness<TAgent, TInput = string, TResult = unknown>(\n options: PiAiHarnessInferredToolsRunOptionsWithoutOutput<\n TAgent,\n TInput,\n TResult\n >,\n): Harness<TInput, PiAiResultOutput<Awaited<TResult>>>;\nexport function piAiHarness<TAgent, TInput = string>(\n options: PiAiHarnessInferredToolsAgentOptionsWithoutOutput<TAgent, TInput>,\n): Harness<\n TInput,\n PiAiResultOutput<PiAiAgentResult<TAgent, TInput, InferredPiAiToolset<TInput>>>\n>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TResult = unknown,\n TTools extends PiAiToolset<TInput> = PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: PiAiHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>,\n): Harness<TInput, TOutput> {\n validateOptions(options);\n\n const harnessName = options.name ?? \"pi-ai\";\n const harness: Harness<TInput, TOutput> = {\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 events: TranscriptEvent[] = [\n {\n type: \"message\",\n role: \"user\",\n content: normalizeContent(input),\n },\n ];\n const inferredTools = resolveInferredToolSurfaces<TInput>(agent);\n\n if (hasExplicitToolset(options)) {\n return await executePiHarnessRun(\n options,\n agent,\n input,\n context,\n events,\n options.tools,\n inferredTools.nativeToolsets,\n );\n }\n\n return await executePiHarnessRun(\n options,\n agent,\n input,\n context,\n events,\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>(\n input: TInput,\n context: HarnessContext,\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 TResult,\n TTools extends PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined,\n>(options: PiAiHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>) {\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 TResult,\n TTools extends PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessRunOptions<TAgent, TInput, TResult, TTools, TOutput>,\n agent: TAgent,\n input: TInput,\n context: HarnessContext,\n events: TranscriptEvent[],\n runtimeTools: TTools | undefined,\n nativeToolsets?: Array<PiAgentToolLike<TInput>[]>,\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 events,\n });\n\n try {\n const result = await withInstrumentedAgentTools(\n agent,\n nativeToolsets,\n {\n input,\n context,\n events,\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<TAgent, TInput, TResult, TTools>;\n\n const output = options.output\n ? await options.output(resultArgs)\n : (resolveOutput(normalizeResult) as TOutput | undefined);\n const usage = resolveUsage(normalizeResult, countToolCallEvents(events));\n const session = resolveSession(normalizeResult, events, 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, countToolCallEvents(events));\n const session = resolveSession(undefined, events, 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 TResult,\n TTools extends PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>,\n args: PiAiCreateAgentArgs<TInput>,\n) {\n return resolveAgentSource(options.agent, args);\n}\n\nasync function resolveAgentSource<TAgent, TInput>(\n agent: AgentSource<TAgent, TInput>,\n args: PiAiCreateAgentArgs<TInput>,\n): Promise<TAgent> {\n if (isAgentFactory(agent)) {\n return agent(args);\n }\n\n return agent;\n}\n\nfunction isAgentFactory<TAgent, TInput>(\n agent: AgentSource<TAgent, TInput>,\n): agent is (args: PiAiCreateAgentArgs<TInput>) => MaybePromise<TAgent> {\n return typeof agent === \"function\" && !hasPiAiRunMethod(agent);\n}\n\nfunction hasOutputSelector<\n TAgent,\n TInput,\n TResult,\n TTools extends PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined,\n>(options: PiAiHarnessRunOptions<TAgent, TInput, TResult, TTools, TOutput>) {\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 = [rootSpan, ...(modelSpan ? [modelSpan] : [])];\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>(\n agent: unknown,\n): InferredToolSurfaces<TInput> {\n let runtimeTools: InferredPiAiToolset<TInput> | undefined;\n const nativeToolsets: Array<PiAgentToolLike<TInput>[]> = [];\n const seenToolsets = new Set<PiAgentToolLike<TInput>[]>();\n\n for (const candidate of getAgentToolCandidates(agent)) {\n const nextRuntimeTools = getRuntimeToolset<TInput>(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>(\n value: object,\n): InferredPiAiToolset<TInput> | undefined {\n const candidate =\n getObjectProperty(value, \"tools\") ?? getObjectProperty(value, \"toolset\");\n\n return isPiAiToolset(candidate)\n ? (candidate as InferredPiAiToolset<TInput>)\n : undefined;\n}\n\nfunction getNativeToolArray<TInput>(\n value: object,\n): PiAgentToolLike<TInput>[] | undefined {\n const candidate = getObjectProperty(value, \"tools\");\n if (isAgentToolArray(candidate)) {\n return candidate as PiAgentToolLike<TInput>[];\n }\n\n return undefined;\n}\n\nasync function runAgent<\n TAgent,\n TInput,\n TResult,\n TTools extends PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessRunOptions<TAgent, TInput, TResult, TTools, TOutput>,\n args: PiAiHarnessRunArgs<TAgent, TInput, TTools>,\n): Promise<TResult | HarnessRun<TOutput>> {\n if (options.run) {\n return options.run(args);\n }\n\n if (hasPiAiRunMethod<TInput, TResult, TOutput, TTools>(args.agent)) {\n return args.agent.run(args.input, args.runtime);\n }\n\n throw new Error(\n \"piAiHarness requires a run() function unless the provided agent exposes run(input, runtime).\",\n );\n}\n\nfunction hasExplicitToolset<\n TAgent,\n TInput,\n TResult,\n TTools extends PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>,\n): options is PiAiHarnessWithToolsOptions<\n TAgent,\n TInput,\n TResult,\n TTools,\n TOutput\n> {\n return options.tools !== undefined;\n}\n\nfunction hasPiAiRunMethod<\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends PiAiToolset<TInput>,\n>(\n agent: unknown,\n): agent is PiAiRunnableAgent<TInput, 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<TResult, TInput>(\n agent: unknown,\n toolsets: Array<PiAgentToolLike<TInput>[]> | undefined,\n args: {\n input: TInput;\n context: HarnessContext;\n events: TranscriptEvent[];\n toolReplay: PiAiToolReplayPolicies<TInput> | 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>,\n PiAgentToolLike<TInput>[\"execute\"]\n >();\n const originalResets = new Map<ResettableAgent, ResettableAgent[\"reset\"]>();\n\n const patchTool = (tool: PiAgentToolLike<TInput>) => {\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> = async (\n toolCallId: string,\n rawArgs: Record<string, JsonValue>,\n ) => {\n const startedAt = new Date();\n const toolContext = {\n input: args.input,\n signal: args.context.signal,\n setArtifact: args.context.setArtifact,\n } satisfies PiAiToolContext<TInput>;\n const leaveNativeTool = enterNativeToolExecution(\n args.executionState,\n tool.name,\n );\n const call: TranscriptToolCallEvent = {\n type: \"tool_call\",\n id: toolCallId,\n name: tool.name,\n arguments: rawArgs,\n startedAt: startedAt.toISOString(),\n metadata: normalizeReplayMetadata(undefined),\n } satisfies TranscriptToolCallEvent;\n args.events.push(call);\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 call.finishedAt = finishedAt.toISOString();\n call.durationMs = finishedAt.getTime() - startedAt.getTime();\n call.metadata = normalizeReplayMetadata(execution.replay);\n args.events.push({\n type: \"tool_result\",\n toolCallId,\n name: tool.name,\n content: execution.normalizedResult,\n startedAt: call.startedAt,\n finishedAt: call.finishedAt,\n durationMs: call.durationMs,\n });\n return execution.result;\n } catch (error) {\n const finishedAt = new Date();\n call.finishedAt = finishedAt.toISOString();\n call.durationMs = finishedAt.getTime() - startedAt.getTime();\n call.metadata = normalizeReplayMetadata(\n getReplayMetadataFromError(error),\n );\n args.events.push({\n type: \"tool_result\",\n toolCallId,\n name: tool.name,\n error: serializeToolCallError(error),\n startedAt: call.startedAt,\n finishedAt: call.finishedAt,\n durationMs: call.durationMs,\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 = (nextToolsets: Array<PiAgentToolLike<TInput>[]>) => {\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(resolveInferredNativeToolsets<TInput>(agent));\n });\n }\n\n patchToolsets(resolveInferredNativeToolsets<TInput>(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<TInput>(\n agent: unknown,\n): Array<PiAgentToolLike<TInput>[]> {\n const toolsets: Array<PiAgentToolLike<TInput>[]> = [];\n const seenToolsets = new Set<PiAgentToolLike<TInput>[]>();\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(error: unknown): NormalizedError {\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\n/** Creates a runtime-local id used on both assistant tool calls and tool results. */\nfunction createRuntimeToolCallId(toolName: string, index: number) {\n return `runtime:${toolName}:${index + 1}`;\n}\n\nfunction getNativeToolExecuteOrigin<TInput>(\n execute: PiAgentToolLike<TInput>[\"execute\"],\n) {\n const nativeExecute = execute as NativeToolExecute<TInput>;\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<TInput>({\n toolName,\n toolCallId,\n execute,\n replay,\n args,\n context,\n}: {\n toolName: string;\n toolCallId: string;\n execute: PiAgentToolLike<TInput>[\"execute\"];\n replay: PiAiToolReplayPolicy<TInput> | undefined;\n args: Record<string, JsonValue>;\n context: PiAiToolContext<TInput>;\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<TInput, TTools extends PiAiToolset<TInput>>({\n input,\n context,\n tools,\n toolReplay,\n executionState,\n events,\n}: {\n input: TInput;\n context: HarnessContext;\n tools: TTools | undefined;\n toolReplay: PiAiToolReplayPolicies<TInput> | undefined;\n executionState: PiToolExecutionState;\n events: TranscriptEvent[];\n}): PiAiRuntime<TTools, TInput> {\n const eventSink: PiAiEventSink = {\n message: (event) => {\n events.push(event);\n },\n system: (content, metadata) => {\n events.push({\n type: \"message\",\n role: \"system\",\n content,\n metadata,\n });\n },\n user: (content, metadata) => {\n events.push({\n type: \"message\",\n role: \"user\",\n content,\n metadata,\n });\n },\n assistant: (content, metadata) => {\n events.push({\n type: \"message\",\n role: \"assistant\",\n content,\n metadata,\n });\n },\n tool: (toolCallId, content, options) => {\n events.push({\n type: \"tool_result\",\n toolCallId,\n ...(options?.name ? { name: options.name } : {}),\n content,\n ...(options?.error ? { error: options.error } : {}),\n ...(options?.metadata ? { metadata: options.metadata } : {}),\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 signal: context.signal,\n setArtifact: context.setArtifact,\n } satisfies PiAiToolContext<TInput>;\n const toolCallId = createRuntimeToolCallId(\n toolName,\n countToolCallEvents(events),\n );\n const call: TranscriptToolCallEvent = {\n type: \"tool_call\",\n id: toolCallId,\n name: toolName,\n arguments: args,\n startedAt: startedAt.toISOString(),\n } satisfies TranscriptToolCallEvent;\n\n try {\n if (!isNativeImplementationCall) {\n events.push(call);\n }\n\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 call.finishedAt = finishedAt.toISOString();\n call.durationMs = finishedAt.getTime() - startedAt.getTime();\n call.metadata = normalizeReplayMetadata(execution.replay);\n events.push({\n type: \"tool_result\",\n toolCallId,\n name: toolName,\n content: execution.result,\n startedAt: call.startedAt,\n finishedAt: call.finishedAt,\n durationMs: call.durationMs,\n });\n return execution.result;\n } catch (error) {\n const finishedAt = new Date();\n if (isNativeImplementationCall) {\n throw error;\n }\n\n call.finishedAt = finishedAt.toISOString();\n call.durationMs = finishedAt.getTime() - startedAt.getTime();\n call.metadata = normalizeReplayMetadata(\n getReplayMetadataFromError(error),\n );\n events.push({\n type: \"tool_result\",\n toolCallId,\n name: toolName,\n error: serializeToolCallError(error),\n startedAt: call.startedAt,\n finishedAt: call.finishedAt,\n durationMs: call.durationMs,\n });\n throw error;\n }\n },\n ]),\n ) as unknown as PiAiRuntime<TTools, TInput>[\"tools\"];\n\n return {\n tools: runtimeTools,\n events: eventSink,\n signal: context.signal,\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 countToolCallEvents(events: readonly TranscriptEvent[]) {\n return events.filter((event) => event.type === \"tool_call\").length;\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 events: TranscriptEvent[],\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 const sessionEvents = [...events];\n if (\n output !== undefined &&\n !sessionEvents.some(\n (event) =>\n event.type === \"message\" &&\n event.role === \"assistant\" &&\n event.content !== undefined,\n )\n ) {\n sessionEvents.push({\n type: \"message\",\n role: \"assistant\",\n content: output,\n });\n }\n\n return {\n events: sessionEvents,\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>({\n toolName,\n tool,\n replay,\n args,\n context,\n}: {\n toolName: string;\n tool: PiAiToolDefinition<TArgs, TResult, TInput>;\n replay: PiAiToolReplayPolicy<TInput> | undefined;\n args: TArgs;\n context: PiAiToolContext<TInput>;\n}) {\n return executeWithReplay<\n Record<string, JsonValue>,\n JsonValue,\n PiAiToolContext<TInput>\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 HarnessRun,\n JsonValue,\n NormalizedError,\n NormalizedSpan,\n NormalizedSession,\n TranscriptEvent,\n TranscriptMessageEvent,\n TranscriptToolCallEvent,\n NormalizedTrace,\n TimingSummary,\n UsageSummary,\n} from \"vitest-evals/harness\";\nimport {\n attachHarnessRunToError,\n createFailedHarnessRun,\n createGenAiUsageAttributes,\n ensureRunTrace,\n getHarnessRunFromError,\n isHarnessRun,\n isNormalizedSession,\n normalizeMetadata,\n normalizeContent,\n normalizeSpanAttributes,\n normalizeSpanError,\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<TAgent, TInput = string> =\n | TAgent\n | ((args: PiAiCreateAgentArgs<TInput>) => MaybePromise<TAgent>);\ntype AnyPiAiToolset<TInput = string> = Record<\n string,\n PiAiToolDefinition<any, any, TInput>\n>;\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 const output = resolvePiAiJudgeText(message);\n const usage = resolveUsage(message, 0);\n return {\n output,\n session: resolveSession(\n message,\n [\n { type: \"message\", role: \"user\", content: prompt },\n { type: \"message\", role: \"assistant\", content: output },\n ],\n output,\n usage,\n ),\n usage,\n errors: [],\n };\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<TInput = string> = Record<\n string,\n PiAiToolDefinition<Record<string, JsonValue>, JsonValue, TInput>\n>;\n\ntype PiAgentToolLike<TInput = string> = {\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 TTools extends PiAiToolset<TInput>,\n> = TAgent extends {\n run: (\n input: TInput,\n runtime: PiAiRuntime<TTools, TInput>,\n ) => MaybePromise<infer TResult>;\n}\n ? Awaited<TResult>\n : unknown;\n\nconst ORIGINAL_NATIVE_EXECUTE = Symbol(\"vitest-evals.originalNativeExecute\");\n\ntype NativeToolExecute<TInput> = PiAgentToolLike<TInput>[\"execute\"] & {\n [ORIGINAL_NATIVE_EXECUTE]?: PiAgentToolLike<TInput>[\"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 events. */\nexport interface PiAiEventSink {\n message: (event: TranscriptMessageEvent) => 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 /** Records a tool-result event linked to an assistant tool call by id. */\n tool: (\n toolCallId: string,\n content: JsonValue,\n options?: {\n name?: string;\n error?: NormalizedError;\n metadata?: Record<string, JsonValue>;\n },\n ) => void;\n}\n\n/** Context passed to instrumented Pi AI tool executions. */\nexport interface PiAiToolContext<TInput = string> {\n input: TInput;\n signal?: AbortSignal;\n setArtifact: HarnessContext[\"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> = ToolReplayConfig<TArgs, TResult, PiAiToolContext<TInput>>;\n\n/** Replay policy for one Pi AI tool. */\nexport type PiAiToolReplayPolicy<TInput = string> =\n | boolean\n | PiAiToolReplayConfig<Record<string, JsonValue>, JsonValue, TInput>;\n\n/** Replay policy map keyed by Pi AI tool name. */\nexport type PiAiToolReplayPolicies<TInput = string> = Record<\n string,\n PiAiToolReplayPolicy<TInput>\n>;\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> {\n description?: string;\n execute: (\n args: TArgs,\n context: PiAiToolContext<TInput>,\n ) => MaybePromise<TResult>;\n}\n\n/** Toolset shape accepted by the Pi AI harness. */\nexport type PiAiToolset<TInput = string> = AnyPiAiToolset<TInput>;\n\ntype ToolArgs<TTool> = TTool extends PiAiToolDefinition<\n infer TArgs,\n infer _TResult,\n infer _TInput\n>\n ? TArgs\n : never;\n\ntype ToolResult<TTool> = TTool extends PiAiToolDefinition<\n infer _TArgs,\n infer TResult,\n infer _TInput\n>\n ? TResult\n : never;\n\n/** Runtime object passed into Pi AI agent entrypoints. */\nexport type PiAiRuntime<TTools extends PiAiToolset<TInput>, TInput = string> = {\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 TTools extends PiAiToolset<TInput>,\n> {\n agent: TAgent;\n input: TInput;\n context: HarnessContext;\n runtime: PiAiRuntime<TTools, TInput>;\n}\n\n/** Arguments passed to Pi AI harness output selectors. */\nexport interface PiAiHarnessResultArgs<\n TAgent,\n TInput,\n TResult,\n TTools extends PiAiToolset<TInput>,\n> extends PiAiHarnessRunArgs<TAgent, TInput, TTools> {\n result: TResult;\n}\n\n/** Arguments passed to per-run Pi AI agent factories. */\nexport interface PiAiCreateAgentArgs<TInput = string> {\n input: TInput;\n context: HarnessContext;\n}\n\ninterface PiAiHarnessBaseOptions<\n TAgent,\n TInput = string,\n TResult = unknown,\n TTools extends PiAiToolset<TInput> = PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> {\n agent: AgentSource<TAgent, TInput>;\n toolReplay?: PiAiToolReplayPolicies<TInput>;\n output?: PiAiHarnessOutputSelector<TAgent, TInput, TResult, TTools, TOutput>;\n name?: string;\n}\n\ninterface PiAiHarnessWithToolsOptions<\n TAgent,\n TInput = string,\n TResult = unknown,\n TTools extends PiAiToolset<TInput> = PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> extends PiAiHarnessBaseOptions<TAgent, TInput, TResult, TTools, TOutput> {\n tools: TTools;\n run?: (\n args: PiAiHarnessRunArgs<TAgent, TInput, TTools>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n}\n\ninterface PiAiHarnessInferredToolsOptions<\n TAgent,\n TInput = string,\n TResult = unknown,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> extends PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TResult,\n InferredPiAiToolset<TInput>,\n TOutput\n > {\n tools?: undefined;\n run?: (\n args: PiAiHarnessRunArgs<TAgent, TInput, InferredPiAiToolset<TInput>>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n}\n\ntype PiAiHarnessOptions<\n TAgent,\n TInput = string,\n TResult = unknown,\n TTools extends PiAiToolset<TInput> = PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> =\n | PiAiHarnessWithToolsOptions<TAgent, TInput, TResult, TTools, TOutput>\n | PiAiHarnessInferredToolsOptions<TAgent, TInput, TResult, TOutput>;\n\ntype PiAiHarnessWithToolsOptionsWithOutput<\n TAgent,\n TInput = string,\n TResult = unknown,\n TTools extends PiAiToolset<TInput> = PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = PiAiHarnessWithToolsOptions<TAgent, TInput, TResult, TTools, TOutput> & {\n output: PiAiHarnessOutputSelector<TAgent, TInput, TResult, TTools, TOutput>;\n};\n\ntype PiAiHarnessInferredToolsOptionsWithOutput<\n TAgent,\n TInput = string,\n TResult = unknown,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = PiAiHarnessInferredToolsOptions<TAgent, TInput, TResult, TOutput> & {\n output: PiAiHarnessOutputSelector<\n TAgent,\n TInput,\n TResult,\n InferredPiAiToolset<TInput>,\n TOutput\n >;\n};\n\ntype PiAiHarnessWithToolsRunOptionsWithoutOutput<\n TAgent,\n TInput = string,\n TResult = unknown,\n TTools extends PiAiToolset<TInput> = PiAiToolset<TInput>,\n> = PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TResult,\n TTools,\n JsonValue | undefined\n> & {\n tools: TTools;\n run: (\n args: PiAiHarnessRunArgs<TAgent, TInput, TTools>,\n ) => MaybePromise<TResult>;\n output?: never;\n};\n\ntype PiAiHarnessWithToolsAgentOptionsWithoutOutput<\n TAgent,\n TInput = string,\n TTools extends PiAiToolset<TInput> = PiAiToolset<TInput>,\n> = PiAiHarnessBaseOptions<\n TAgent,\n TInput,\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 TResult = unknown,\n> = PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TResult,\n InferredPiAiToolset<TInput>,\n JsonValue | undefined\n> & {\n tools?: undefined;\n run: (\n args: PiAiHarnessRunArgs<TAgent, TInput, InferredPiAiToolset<TInput>>,\n ) => MaybePromise<TResult>;\n output?: never;\n};\n\ntype PiAiHarnessInferredToolsAgentOptionsWithoutOutput<\n TAgent,\n TInput = string,\n> = PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n unknown,\n InferredPiAiToolset<TInput>,\n JsonValue | undefined\n> & {\n tools?: undefined;\n run?: never;\n output?: never;\n};\n\ntype PiAiHarnessRunOptions<\n TAgent,\n TInput,\n TResult,\n TTools extends PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined,\n> = PiAiHarnessBaseOptions<TAgent, TInput, TResult, TTools, TOutput> & {\n run?: (\n args: PiAiHarnessRunArgs<TAgent, TInput, TTools>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n};\n\ntype PiAiRunnableAgent<\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends PiAiToolset<TInput>,\n> = {\n run: (\n input: TInput,\n runtime: PiAiRuntime<TTools, TInput>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n};\n\ntype PiAiHarnessOutputSelector<\n TAgent,\n TInput = string,\n TResult = unknown,\n TTools extends PiAiToolset<TInput> = PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = (\n args: PiAiHarnessResultArgs<TAgent, TInput, TResult, TTools>,\n) => MaybePromise<TOutput>;\n\ntype InferredToolSurfaces<TInput> = {\n runtimeTools?: InferredPiAiToolset<TInput>;\n nativeToolsets?: Array<PiAgentToolLike<TInput>[]>;\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 TResult = unknown,\n TTools extends PiAiToolset<TInput> = PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: PiAiHarnessWithToolsOptionsWithOutput<\n TAgent,\n TInput,\n TResult,\n TTools,\n TOutput\n >,\n): Harness<TInput, TOutput>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TResult = unknown,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: PiAiHarnessInferredToolsOptionsWithOutput<\n TAgent,\n TInput,\n TResult,\n TOutput\n >,\n): Harness<TInput, TOutput>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TResult = unknown,\n TTools extends PiAiToolset<TInput> = PiAiToolset<TInput>,\n>(\n options: PiAiHarnessWithToolsRunOptionsWithoutOutput<\n TAgent,\n TInput,\n TResult,\n TTools\n >,\n): Harness<TInput, PiAiResultOutput<Awaited<TResult>>>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TTools extends PiAiToolset<TInput> = PiAiToolset<TInput>,\n>(\n options: PiAiHarnessWithToolsAgentOptionsWithoutOutput<\n TAgent,\n TInput,\n TTools\n >,\n): Harness<TInput, PiAiResultOutput<PiAiAgentResult<TAgent, TInput, TTools>>>;\nexport function piAiHarness<TAgent, TInput = string, TResult = unknown>(\n options: PiAiHarnessInferredToolsRunOptionsWithoutOutput<\n TAgent,\n TInput,\n TResult\n >,\n): Harness<TInput, PiAiResultOutput<Awaited<TResult>>>;\nexport function piAiHarness<TAgent, TInput = string>(\n options: PiAiHarnessInferredToolsAgentOptionsWithoutOutput<TAgent, TInput>,\n): Harness<\n TInput,\n PiAiResultOutput<PiAiAgentResult<TAgent, TInput, InferredPiAiToolset<TInput>>>\n>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TResult = unknown,\n TTools extends PiAiToolset<TInput> = PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: PiAiHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>,\n): Harness<TInput, TOutput> {\n validateOptions(options);\n\n const harnessName = options.name ?? \"pi-ai\";\n const harness: Harness<TInput, TOutput> = {\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 events: TranscriptEvent[] = [\n {\n type: \"message\",\n role: \"user\",\n content: normalizeContent(input),\n },\n ];\n const inferredTools = resolveInferredToolSurfaces<TInput>(agent);\n\n if (hasExplicitToolset(options)) {\n return await executePiHarnessRun(\n options,\n agent,\n input,\n context,\n events,\n options.tools,\n inferredTools.nativeToolsets,\n );\n }\n\n return await executePiHarnessRun(\n options,\n agent,\n input,\n context,\n events,\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>(\n input: TInput,\n context: HarnessContext,\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 TResult,\n TTools extends PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined,\n>(options: PiAiHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>) {\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 TResult,\n TTools extends PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessRunOptions<TAgent, TInput, TResult, TTools, TOutput>,\n agent: TAgent,\n input: TInput,\n context: HarnessContext,\n events: TranscriptEvent[],\n runtimeTools: TTools | undefined,\n nativeToolsets?: Array<PiAgentToolLike<TInput>[]>,\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 events,\n });\n\n try {\n const result = await withInstrumentedAgentTools(\n agent,\n nativeToolsets,\n {\n input,\n context,\n events,\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<TAgent, TInput, TResult, TTools>;\n\n const output = options.output\n ? await options.output(resultArgs)\n : (resolveOutput(normalizeResult) as TOutput | undefined);\n const usage = resolveUsage(normalizeResult, countToolCallEvents(events));\n const session = resolveSession(normalizeResult, events, 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, countToolCallEvents(events));\n const session = resolveSession(undefined, events, 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 TResult,\n TTools extends PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>,\n args: PiAiCreateAgentArgs<TInput>,\n) {\n return resolveAgentSource(options.agent, args);\n}\n\nasync function resolveAgentSource<TAgent, TInput>(\n agent: AgentSource<TAgent, TInput>,\n args: PiAiCreateAgentArgs<TInput>,\n): Promise<TAgent> {\n if (isAgentFactory(agent)) {\n return agent(args);\n }\n\n return agent;\n}\n\nfunction isAgentFactory<TAgent, TInput>(\n agent: AgentSource<TAgent, TInput>,\n): agent is (args: PiAiCreateAgentArgs<TInput>) => MaybePromise<TAgent> {\n return typeof agent === \"function\" && !hasPiAiRunMethod(agent);\n}\n\nfunction hasOutputSelector<\n TAgent,\n TInput,\n TResult,\n TTools extends PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined,\n>(options: PiAiHarnessRunOptions<TAgent, TInput, TResult, TTools, TOutput>) {\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 = [rootSpan, ...(modelSpan ? [modelSpan] : [])];\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>(\n agent: unknown,\n): InferredToolSurfaces<TInput> {\n let runtimeTools: InferredPiAiToolset<TInput> | undefined;\n const nativeToolsets: Array<PiAgentToolLike<TInput>[]> = [];\n const seenToolsets = new Set<PiAgentToolLike<TInput>[]>();\n\n for (const candidate of getAgentToolCandidates(agent)) {\n const nextRuntimeTools = getRuntimeToolset<TInput>(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>(\n value: object,\n): InferredPiAiToolset<TInput> | undefined {\n const candidate =\n getObjectProperty(value, \"tools\") ?? getObjectProperty(value, \"toolset\");\n\n return isPiAiToolset(candidate)\n ? (candidate as InferredPiAiToolset<TInput>)\n : undefined;\n}\n\nfunction getNativeToolArray<TInput>(\n value: object,\n): PiAgentToolLike<TInput>[] | undefined {\n const candidate = getObjectProperty(value, \"tools\");\n if (isAgentToolArray(candidate)) {\n return candidate as PiAgentToolLike<TInput>[];\n }\n\n return undefined;\n}\n\nasync function runAgent<\n TAgent,\n TInput,\n TResult,\n TTools extends PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessRunOptions<TAgent, TInput, TResult, TTools, TOutput>,\n args: PiAiHarnessRunArgs<TAgent, TInput, TTools>,\n): Promise<TResult | HarnessRun<TOutput>> {\n if (options.run) {\n return options.run(args);\n }\n\n if (hasPiAiRunMethod<TInput, TResult, TOutput, TTools>(args.agent)) {\n return args.agent.run(args.input, args.runtime);\n }\n\n throw new Error(\n \"piAiHarness requires a run() function unless the provided agent exposes run(input, runtime).\",\n );\n}\n\nfunction hasExplicitToolset<\n TAgent,\n TInput,\n TResult,\n TTools extends PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>,\n): options is PiAiHarnessWithToolsOptions<\n TAgent,\n TInput,\n TResult,\n TTools,\n TOutput\n> {\n return options.tools !== undefined;\n}\n\nfunction hasPiAiRunMethod<\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends PiAiToolset<TInput>,\n>(\n agent: unknown,\n): agent is PiAiRunnableAgent<TInput, 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<TResult, TInput>(\n agent: unknown,\n toolsets: Array<PiAgentToolLike<TInput>[]> | undefined,\n args: {\n input: TInput;\n context: HarnessContext;\n events: TranscriptEvent[];\n toolReplay: PiAiToolReplayPolicies<TInput> | 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>,\n PiAgentToolLike<TInput>[\"execute\"]\n >();\n const originalResets = new Map<ResettableAgent, ResettableAgent[\"reset\"]>();\n\n const patchTool = (tool: PiAgentToolLike<TInput>) => {\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> = async (\n toolCallId: string,\n rawArgs: Record<string, JsonValue>,\n ) => {\n const startedAt = new Date();\n const toolContext = {\n input: args.input,\n signal: args.context.signal,\n setArtifact: args.context.setArtifact,\n } satisfies PiAiToolContext<TInput>;\n const leaveNativeTool = enterNativeToolExecution(\n args.executionState,\n tool.name,\n );\n const call: TranscriptToolCallEvent = {\n type: \"tool_call\",\n id: toolCallId,\n name: tool.name,\n arguments: rawArgs,\n startedAt: startedAt.toISOString(),\n metadata: normalizeReplayMetadata(undefined),\n } satisfies TranscriptToolCallEvent;\n args.events.push(call);\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 call.finishedAt = finishedAt.toISOString();\n call.durationMs = finishedAt.getTime() - startedAt.getTime();\n call.metadata = normalizeReplayMetadata(execution.replay);\n args.events.push({\n type: \"tool_result\",\n toolCallId,\n name: tool.name,\n content: execution.normalizedResult,\n startedAt: call.startedAt,\n finishedAt: call.finishedAt,\n durationMs: call.durationMs,\n });\n return execution.result;\n } catch (error) {\n const finishedAt = new Date();\n call.finishedAt = finishedAt.toISOString();\n call.durationMs = finishedAt.getTime() - startedAt.getTime();\n call.metadata = normalizeReplayMetadata(\n getReplayMetadataFromError(error),\n );\n args.events.push({\n type: \"tool_result\",\n toolCallId,\n name: tool.name,\n error: serializeToolCallError(error),\n startedAt: call.startedAt,\n finishedAt: call.finishedAt,\n durationMs: call.durationMs,\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 = (nextToolsets: Array<PiAgentToolLike<TInput>[]>) => {\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(resolveInferredNativeToolsets<TInput>(agent));\n });\n }\n\n patchToolsets(resolveInferredNativeToolsets<TInput>(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<TInput>(\n agent: unknown,\n): Array<PiAgentToolLike<TInput>[]> {\n const toolsets: Array<PiAgentToolLike<TInput>[]> = [];\n const seenToolsets = new Set<PiAgentToolLike<TInput>[]>();\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(error: unknown): NormalizedError {\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\n/** Creates a runtime-local id used on both assistant tool calls and tool results. */\nfunction createRuntimeToolCallId(toolName: string, index: number) {\n return `runtime:${toolName}:${index + 1}`;\n}\n\nfunction getNativeToolExecuteOrigin<TInput>(\n execute: PiAgentToolLike<TInput>[\"execute\"],\n) {\n const nativeExecute = execute as NativeToolExecute<TInput>;\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<TInput>({\n toolName,\n toolCallId,\n execute,\n replay,\n args,\n context,\n}: {\n toolName: string;\n toolCallId: string;\n execute: PiAgentToolLike<TInput>[\"execute\"];\n replay: PiAiToolReplayPolicy<TInput> | undefined;\n args: Record<string, JsonValue>;\n context: PiAiToolContext<TInput>;\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<TInput, TTools extends PiAiToolset<TInput>>({\n input,\n context,\n tools,\n toolReplay,\n executionState,\n events,\n}: {\n input: TInput;\n context: HarnessContext;\n tools: TTools | undefined;\n toolReplay: PiAiToolReplayPolicies<TInput> | undefined;\n executionState: PiToolExecutionState;\n events: TranscriptEvent[];\n}): PiAiRuntime<TTools, TInput> {\n const eventSink: PiAiEventSink = {\n message: (event) => {\n events.push(event);\n },\n system: (content, metadata) => {\n events.push({\n type: \"message\",\n role: \"system\",\n content,\n metadata,\n });\n },\n user: (content, metadata) => {\n events.push({\n type: \"message\",\n role: \"user\",\n content,\n metadata,\n });\n },\n assistant: (content, metadata) => {\n events.push({\n type: \"message\",\n role: \"assistant\",\n content,\n metadata,\n });\n },\n tool: (toolCallId, content, options) => {\n events.push({\n type: \"tool_result\",\n toolCallId,\n ...(options?.name ? { name: options.name } : {}),\n content,\n ...(options?.error ? { error: options.error } : {}),\n ...(options?.metadata ? { metadata: options.metadata } : {}),\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 signal: context.signal,\n setArtifact: context.setArtifact,\n } satisfies PiAiToolContext<TInput>;\n const toolCallId = createRuntimeToolCallId(\n toolName,\n countToolCallEvents(events),\n );\n const call: TranscriptToolCallEvent = {\n type: \"tool_call\",\n id: toolCallId,\n name: toolName,\n arguments: args,\n startedAt: startedAt.toISOString(),\n } satisfies TranscriptToolCallEvent;\n\n try {\n if (!isNativeImplementationCall) {\n events.push(call);\n }\n\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 call.finishedAt = finishedAt.toISOString();\n call.durationMs = finishedAt.getTime() - startedAt.getTime();\n call.metadata = normalizeReplayMetadata(execution.replay);\n events.push({\n type: \"tool_result\",\n toolCallId,\n name: toolName,\n content: execution.result,\n startedAt: call.startedAt,\n finishedAt: call.finishedAt,\n durationMs: call.durationMs,\n });\n return execution.result;\n } catch (error) {\n const finishedAt = new Date();\n if (isNativeImplementationCall) {\n throw error;\n }\n\n call.finishedAt = finishedAt.toISOString();\n call.durationMs = finishedAt.getTime() - startedAt.getTime();\n call.metadata = normalizeReplayMetadata(\n getReplayMetadataFromError(error),\n );\n events.push({\n type: \"tool_result\",\n toolCallId,\n name: toolName,\n error: serializeToolCallError(error),\n startedAt: call.startedAt,\n finishedAt: call.finishedAt,\n durationMs: call.durationMs,\n });\n throw error;\n }\n },\n ]),\n ) as unknown as PiAiRuntime<TTools, TInput>[\"tools\"];\n\n return {\n tools: runtimeTools,\n events: eventSink,\n signal: context.signal,\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 countToolCallEvents(events: readonly TranscriptEvent[]) {\n return events.filter((event) => event.type === \"tool_call\").length;\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 costUsd: resolveCostUsd(usageRecord),\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 \"costUsd\",\n \"toolCalls\",\n \"retries\",\n]);\n\nfunction resolveCostUsd(usage: Record<string, unknown>) {\n const direct = numberField(usage.costUsd);\n if (direct !== undefined) {\n return direct;\n }\n\n const cost = usage.cost;\n return cost && typeof cost === \"object\" && !Array.isArray(cost)\n ? numberField((cost as Record<string, unknown>).total)\n : undefined;\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 events: TranscriptEvent[],\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 const sessionEvents = [...events];\n if (\n output !== undefined &&\n !sessionEvents.some(\n (event) =>\n event.type === \"message\" &&\n event.role === \"assistant\" &&\n event.content !== undefined,\n )\n ) {\n sessionEvents.push({\n type: \"message\",\n role: \"assistant\",\n content: output,\n });\n }\n\n return {\n events: sessionEvents,\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>({\n toolName,\n tool,\n replay,\n args,\n context,\n}: {\n toolName: string;\n tool: PiAiToolDefinition<TArgs, TResult, TInput>;\n replay: PiAiToolReplayPolicy<TInput> | undefined;\n args: TArgs;\n context: PiAiToolContext<TInput>;\n}) {\n return executeWithReplay<\n Record<string, JsonValue>,\n JsonValue,\n PiAiToolContext<TInput>\n >({\n toolName,\n args,\n context,\n execute: (toolArgs, toolContext) =>\n tool.execute(toolArgs as TArgs, toolContext),\n replay,\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeA,qBAeO;AACP,oBAIO;AAMP,oBAGO;AACP,mBAA+B;AA4B/B,IAAI,cAAc;AAkDX,SAAS,iBACd,QACA;AACA,aAAO,kCAAmB;AAAA,IACxB,MAAM,OAAO,QAAQ;AAAA,IACrB,KAAK,OAAO,EAAE,gBAAgB,QAAQ,OAAO,GAAG,EAAE,OAAO,MAAM;AAC7D,YAAM,UAAU,UAAM;AAAA,QACpB,OAAO;AAAA,QACP;AAAA,UACE,cAAc,4BAA4B,QAAQ,cAAc;AAAA,UAChE,UAAU;AAAA,YACR;AAAA,cACE,MAAM;AAAA,cACN,SAAS;AAAA,cACT,WAAW,KAAK,IAAI;AAAA,YACtB;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,GAAI,OAAO,WAAW,CAAC;AAAA,UACvB,GAAI,OAAO,gBAAgB,SACvB,EAAE,aAAa,OAAO,YAAY,IAClC,CAAC;AAAA,UACL,GAAI,OAAO,oBAAoB,SAC3B,EAAE,WAAW,OAAO,gBAAgB,IACpC,CAAC;AAAA,UACL,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,QAC7B;AAAA,MACF;AAEA,YAAM,SAAS,qBAAqB,OAAO;AAC3C,YAAM,QAAQ,aAAa,SAAS,CAAC;AACrC,aAAO;AAAA,QACL;AAAA,QACA,SAAS;AAAA,UACP;AAAA,UACA;AAAA,YACE,EAAE,MAAM,WAAW,MAAM,QAAQ,SAAS,OAAO;AAAA,YACjD,EAAE,MAAM,WAAW,MAAM,aAAa,SAAS,OAAO;AAAA,UACxD;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA;AAAA,QACA,QAAQ,CAAC;AAAA,MACX;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,4BACP,QACA,gBACA;AACA,MAAI,gBAAgB,SAAS,QAAQ;AACnC,WAAO;AAAA,EACT;AAEA,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA,eAAe,SACX;AAAA,EAAiB,KAAK,UAAU,eAAe,QAAQ,MAAM,CAAC,CAAC,KAC/D;AAAA,EACN,EACG,OAAO,OAAO,EACd,KAAK,MAAM;AAEd,SAAO,SAAS,GAAG,MAAM;AAAA;AAAA,EAAO,eAAe,KAAK;AACtD;AAEA,SAAS,qBAAqB,SAA2B;AACvD,MAAI,QAAQ,eAAe,WAAW,QAAQ,eAAe,WAAW;AACtE,UAAM,IAAI,MAAM,QAAQ,gBAAgB,6BAA6B;AAAA,EACvE;AAEA,SAAO,QAAQ,QACZ,OAAO,CAAC,SAAS,KAAK,SAAS,MAAM,EACrC,IAAI,CAAC,SAAS,KAAK,IAAI,EACvB,KAAK,EAAE,EACP,KAAK;AACV;AA8BA,IAAM,0BAA0B,OAAO,oCAAoC;AAiYpE,SAAS,YAOd,SAC0B;AAC1B,kBAAgB,OAAO;AAEvB,QAAM,cAAc,QAAQ,QAAQ;AACpC,QAAM,UAAoC;AAAA,IACxC,MAAM;AAAA,IACN,KAAK,OAAO,OAAO,YAAY;AAC7B,YAAM,YAAY,oBAAI,KAAK;AAE3B,UAAI;AACF,cAAM,QAAQ,MAAM,aAAa,SAAS;AAAA,UACxC;AAAA,UACA;AAAA,QACF,CAAC;AACD,cAAM,SAA4B;AAAA,UAChC;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,aAAS,iCAAiB,KAAK;AAAA,UACjC;AAAA,QACF;AACA,cAAM,gBAAgB,4BAAoC,KAAK;AAE/D,YAAI,mBAAmB,OAAO,GAAG;AAC/B,iBAAO,MAAM;AAAA,YACX;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,QAAQ;AAAA,YACR,cAAc;AAAA,UAChB;AAAA,QACF;AAEA,eAAO,MAAM;AAAA,UACX;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,cAAc;AAAA,UACd,cAAc;AAAA,QAChB;AAAA,MACF,SAAS,OAAO;AACd,gBAAI,uCAAuB,KAAK,GAAG;AACjC,gBAAM;AAAA,QACR;AAEA,kBAAM;AAAA,UACJ;AAAA,UACA,oBAAoB,OAAO,SAAS,OAAO,aAAa,SAAS;AAAA,QACnE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,oBACP,OACA,SACA,OACA,aACA,WACA;AACA,QAAM,UAAM,uCAAuB,OAAO,OAAO;AAAA,IAC/C,WAAW,QAAQ;AAAA,EACrB,CAAC;AACD,qCAAe,KAAK;AAAA,IAClB,MAAM;AAAA,IACN;AAAA,IACA,YAAY,oBAAI,KAAK;AAAA,IACrB,eAAe;AAAA,IACf,QAAQ;AAAA,EACV,CAAC;AAED,SAAO;AACT;AAEA,SAAS,gBAMP,SAAuE;AACvE,MAAI,QAAQ,UAAU,QAAW;AAC/B,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,oBAOb,SACA,OACA,OACA,SACA,QACA,cACA,gBAC8B;AAC9B,QAAM,QAAQ,oBAAoB,QAAQ,QAAQ,OAAO;AACzD,QAAM,iBAAiB,2BAA2B;AAClD,QAAM,UAAU,cAAc;AAAA,IAC5B;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,YAAY,QAAQ;AAAA,IACpB;AAAA,IACA;AAAA,EACF,CAAC;AAED,MAAI;AACF,UAAM,SAAS,MAAM;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY,QAAQ;AAAA,QACpB;AAAA,MACF;AAAA,MACA,MACE,SAAS,SAAS;AAAA,QAChB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACL;AAEA,YAAI,6BAAa,MAAM,KAAK,CAAC,kBAAkB,OAAO,GAAG;AACvD,UAAI,OAAO,KAAK,QAAQ,SAAS,EAAE,SAAS,KAAK,CAAC,OAAO,WAAW;AAClE,eAAO,YAAY,QAAQ;AAAA,MAC7B;AACA,sBAAgB,QAAQ,OAAO,oBAAI,KAAK,CAAC;AACzC,aAAO;AAAA,IACT;AAEA,UAAM,kBAAkB;AACxB,UAAM,aAAa;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,IACV;AAEA,UAAM,SAAS,QAAQ,SACnB,MAAM,QAAQ,OAAO,UAAU,IAC9B,cAAc,eAAe;AAClC,UAAM,QAAQ,aAAa,iBAAiB,oBAAoB,MAAM,CAAC;AACvE,UAAM,UAAU,eAAe,iBAAiB,QAAQ,QAAQ,KAAK;AACrE,UAAM,SAAS,cAAc,eAAe;AAC5C,UAAM,aAAa,oBAAI,KAAK;AAE5B,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA,WACE,OAAO,KAAK,QAAQ,SAAS,EAAE,SAAS,IACpC,QAAQ,YACR;AAAA,MACN;AAAA,MACA,QAAQ;AAAA,QACN,gBAAgB,OAAO;AAAA,UACrB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,UAAM,QAAQ,aAAa,QAAW,oBAAoB,MAAM,CAAC;AACjE,UAAM,UAAU,eAAe,QAAW,QAAQ,QAAW,KAAK;AAClE,UAAM,aAAa,oBAAI,KAAK;AAC5B,UAAM,sBAAkB,+BAAe,KAAK;AAC5C,UAAM,MAAM;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA,WACE,OAAO,KAAK,QAAQ,SAAS,EAAE,SAAS,IACpC,QAAQ,YACR;AAAA,MACN,QAAQ,CAAC,eAAe;AAAA,MACxB,QAAQ;AAAA,QACN,gBAAgB,OAAO;AAAA,UACrB;AAAA,UACA;AAAA,UACA,QAAQ,CAAC,eAAe;AAAA,UACxB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,cAAM,wCAAwB,OAAO,GAAG;AAAA,EAC1C;AACF;AAEA,eAAe,aAOb,SACA,MACA;AACA,SAAO,mBAAmB,QAAQ,OAAO,IAAI;AAC/C;AAEA,eAAe,mBACb,OACA,MACiB;AACjB,MAAI,eAAe,KAAK,GAAG;AACzB,WAAO,MAAM,IAAI;AAAA,EACnB;AAEA,SAAO;AACT;AAEA,SAAS,eACP,OACsE;AACtE,SAAO,OAAO,UAAU,cAAc,CAAC,iBAAiB,KAAK;AAC/D;AAEA,SAAS,kBAMP,SAA0E;AAC1E,SAAO,QAAQ,QAAQ,MAAM;AAC/B;AASA,SAAS,oBAAoB,MAA6B;AACxD,QAAM,KAAK,eAAe,EAAE,WAAW;AAEvC,SAAO;AAAA,IACL;AAAA,IACA,YAAY,GAAG,EAAE;AAAA,IACjB;AAAA,IACA,WAAW,oBAAI,KAAK;AAAA,EACtB;AACF;AAEA,SAAS,gBACP,KACA,OACA,YACA;AACA,QAAM,cAAc,gBAAgB,OAAO;AAAA,IACzC,SAAS,IAAI;AAAA,IACb,OAAO,IAAI;AAAA,IACX,QAAQ,IAAI,UAAU,CAAC;AAAA,IACvB;AAAA,EACF,CAAC;AAED,MAAI,SAAS,CAAC,GAAI,IAAI,UAAU,CAAC,GAAI,WAAW;AAClD;AAEA,SAAS,gBACP,OACA,SAMiB;AACjB,QAAM,aAAa,QAAQ;AAC3B,QAAM,aAAa,WAAW,QAAQ,IAAI,MAAM,UAAU,QAAQ;AAClE,QAAM,YAAY,QAAQ,SAAS,CAAC,QAChC,mCAAmB,QAAQ,OAAO,CAAC,CAAC,IACpC;AACJ,QAAM,WAA2B;AAAA,IAC/B,IAAI,MAAM;AAAA,IACV,SAAS,MAAM;AAAA,IACf,MAAM,MAAM;AAAA,IACZ,MAAM;AAAA,IACN,WAAW,MAAM,UAAU,YAAY;AAAA,IACvC,YAAY,WAAW,YAAY;AAAA,IACnC;AAAA,IACA,QAAQ,YAAY,UAAU;AAAA,IAC9B,GAAI,YAAY,EAAE,OAAO,UAAU,IAAI,CAAC;AAAA,IACxC,gBAAY,wCAAwB;AAAA,MAClC,yBAAyB;AAAA,MACzB,wBAAwB,MAAM;AAAA,MAC9B,OAAG,2CAA2B,QAAQ,KAAK;AAAA,IAC7C,CAAC;AAAA,EACH;AACA,QAAM,YAAY,qBAAqB,OAAO,QAAQ,KAAK;AAC3D,QAAM,QAAQ,CAAC,UAAU,GAAI,YAAY,CAAC,SAAS,IAAI,CAAC,CAAE;AAE1D,SAAO;AAAA,IACL,IAAI,MAAM;AAAA,IACV,MAAM,MAAM;AAAA,IACZ,WAAW,MAAM,UAAU,YAAY;AAAA,IACvC,YAAY,WAAW,YAAY;AAAA,IACnC;AAAA,IACA,UAAU;AAAA,MACR,QAAQ;AAAA,IACV;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,qBACP,OACA,OAC4B;AAC5B,MAAI,CAAC,OAAO,YAAY,CAAC,OAAO,OAAO;AACrC,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,IAAI,GAAG,MAAM,EAAE;AAAA,IACf,SAAS,MAAM;AAAA,IACf,UAAU,MAAM;AAAA,IAChB,MAAM,MAAM,QAAQ,SAAS,MAAM,KAAK,KAAK;AAAA,IAC7C,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,gBAAY,wCAAwB;AAAA,MAClC,yBAAyB;AAAA,MACzB,OAAG,2CAA2B,KAAK;AAAA,IACrC,CAAC;AAAA,EACH;AACF;AAEA,SAAS,4BACP,OAC8B;AAC9B,MAAI;AACJ,QAAM,iBAAmD,CAAC;AAC1D,QAAM,eAAe,oBAAI,IAA+B;AAExD,aAAW,aAAa,uBAAuB,KAAK,GAAG;AACrD,UAAM,mBAAmB,kBAA0B,SAAS;AAC5D,QAAI,iBAAiB,UAAa,qBAAqB,QAAW;AAChE,qBAAe;AAAA,IACjB;AAEA,UAAM,cAAc,mBAAmB,SAAS;AAChD,QAAI,eAAe,CAAC,aAAa,IAAI,WAAW,GAAG;AACjD,mBAAa,IAAI,WAAW;AAC5B,qBAAe,KAAK,WAAW;AAAA,IACjC;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAI,eAAe,EAAE,aAAa,IAAI,CAAC;AAAA,IACvC,GAAI,eAAe,SAAS,IAAI,EAAE,eAAe,IAAI,CAAC;AAAA,EACxD;AACF;AAEA,SAAS,uBAAuB,OAA0B;AACxD,QAAM,QAAQ,cAAc,KAAK;AACjC,QAAM,aAAuB,CAAC;AAC9B,QAAM,OAAO,oBAAI,IAAY;AAE7B,aAAW,QAAQ,OAAO;AACxB,oBAAgB,YAAY,MAAM,IAAI;AACtC,oBAAgB,YAAY,MAAM,kBAAkB,MAAM,OAAO,CAAC;AAClE,oBAAgB,YAAY,MAAM,kBAAkB,MAAM,cAAc,CAAC;AAAA,EAC3E;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,OAA0B;AAC/C,SAAO,CAAC,SAAS,KAAK,CAAC,EACpB,OAAO,SAAS,kBAAkB,OAAO,OAAO,CAAC,CAAC,EAClD,OAAO,CAAC,UAA2B,UAAU,MAAS;AAC3D;AAEA,SAAS,gBACP,YACA,MACA,OACA;AACA,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,KAAK,IAAI,KAAK,GAAG;AAC1D;AAAA,EACF;AAEA,OAAK,IAAI,KAAK;AACd,aAAW,KAAK,KAAK;AACvB;AAEA,SAAS,SAAS,OAAoC;AACpD,SAAO,SAAS,OAAO,UAAU,WAAW,QAAQ;AACtD;AAEA,SAAS,kBAAkB,OAAgB,KAAsB;AAC/D,SAAO,SAAS,OAAO,UAAU,WAC5B,MAAkC,GAAG,IACtC;AACN;AAEA,SAAS,kBACP,OACyC;AACzC,QAAM,YACJ,kBAAkB,OAAO,OAAO,KAAK,kBAAkB,OAAO,SAAS;AAEzE,SAAO,cAAc,SAAS,IACzB,YACD;AACN;AAEA,SAAS,mBACP,OACuC;AACvC,QAAM,YAAY,kBAAkB,OAAO,OAAO;AAClD,MAAI,iBAAiB,SAAS,GAAG;AAC/B,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,eAAe,SAOb,SACA,MACwC;AACxC,MAAI,QAAQ,KAAK;AACf,WAAO,QAAQ,IAAI,IAAI;AAAA,EACzB;AAEA,MAAI,iBAAmD,KAAK,KAAK,GAAG;AAClE,WAAO,KAAK,MAAM,IAAI,KAAK,OAAO,KAAK,OAAO;AAAA,EAChD;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,EACF;AACF;AAEA,SAAS,mBAOP,SAOA;AACA,SAAO,QAAQ,UAAU;AAC3B;AAEA,SAAS,iBAMP,OAC8D;AAC9D,MAAI,CAAC,SAAU,OAAO,UAAU,YAAY,OAAO,UAAU,YAAa;AACxE,WAAO;AAAA,EACT;AAEA,SACE,SAAS,SAAS,OAAQ,MAA4B,QAAQ;AAElE;AAEA,SAAS,cAAc,OAAsC;AAC3D,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;AAC/D,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,OAAO,OAAO,KAAK;AACjC,SACE,MAAM,SAAS,KACf,MAAM;AAAA,IAAM,CAAC,SACX;AAAA,MACE,QACE,OAAO,SAAS,YAChB,aAAa,QACb,OAAQ,KAA+B,YAAY;AAAA,IACvD;AAAA,EACF;AAEJ;AAEA,SAAS,iBAAiB,OAA4C;AACpE,SACE,MAAM,QAAQ,KAAK,KACnB,MAAM;AAAA,IAAM,CAAC,SACX;AAAA,MACE,QACE,OAAO,SAAS,YAChB,UAAU,QACV,OAAQ,KAA4B,SAAS,YAC7C,aAAa,QACb,OAAQ,KAA+B,YAAY;AAAA,IACvD;AAAA,EACF;AAEJ;AAEA,eAAe,2BACb,OACA,UACA,MAOA,UACA;AACA,MAAI,CAAC,YAAY,SAAS,WAAW,GAAG;AACtC,WAAO,SAAS;AAAA,EAClB;AAEA,QAAM,qBAAqB,oBAAI,IAG7B;AACF,QAAM,iBAAiB,oBAAI,IAA+C;AAE1E,QAAM,YAAY,CAAC,SAAkC;AACnD,QAAI,mBAAmB,IAAI,IAAI,GAAG;AAChC;AAAA,IACF;AAEA,UAAM,kBAAkB,2BAA2B,KAAK,OAAO;AAC/D,uBAAmB,IAAI,MAAM,eAAe;AAC5C,UAAM,sBAAiD,OACrD,YACA,YACG;AACH,YAAM,YAAY,oBAAI,KAAK;AAC3B,YAAM,cAAc;AAAA,QAClB,OAAO,KAAK;AAAA,QACZ,QAAQ,KAAK,QAAQ;AAAA,QACrB,aAAa,KAAK,QAAQ;AAAA,MAC5B;AACA,YAAM,kBAAkB;AAAA,QACtB,KAAK;AAAA,QACL,KAAK;AAAA,MACP;AACA,YAAM,OAAgC;AAAA,QACpC,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,MAAM,KAAK;AAAA,QACX,WAAW;AAAA,QACX,WAAW,UAAU,YAAY;AAAA,QACjC,cAAU,uCAAwB,MAAS;AAAA,MAC7C;AACA,WAAK,OAAO,KAAK,IAAI;AAErB,UAAI;AACF,cAAM,YAAY,MAAM,4BAA4B;AAAA,UAClD,UAAU,KAAK;AAAA,UACf;AAAA,UACA,SAAS;AAAA,UACT,QAAQ,KAAK,aAAa,KAAK,IAAI;AAAA,UACnC,MAAM;AAAA,UACN,SAAS;AAAA,QACX,CAAC;AACD,cAAM,aAAa,oBAAI,KAAK;AAC5B,aAAK,aAAa,WAAW,YAAY;AACzC,aAAK,aAAa,WAAW,QAAQ,IAAI,UAAU,QAAQ;AAC3D,aAAK,eAAW,uCAAwB,UAAU,MAAM;AACxD,aAAK,OAAO,KAAK;AAAA,UACf,MAAM;AAAA,UACN;AAAA,UACA,MAAM,KAAK;AAAA,UACX,SAAS,UAAU;AAAA,UACnB,WAAW,KAAK;AAAA,UAChB,YAAY,KAAK;AAAA,UACjB,YAAY,KAAK;AAAA,QACnB,CAAC;AACD,eAAO,UAAU;AAAA,MACnB,SAAS,OAAO;AACd,cAAM,aAAa,oBAAI,KAAK;AAC5B,aAAK,aAAa,WAAW,YAAY;AACzC,aAAK,aAAa,WAAW,QAAQ,IAAI,UAAU,QAAQ;AAC3D,aAAK,eAAW;AAAA,cACd,0CAA2B,KAAK;AAAA,QAClC;AACA,aAAK,OAAO,KAAK;AAAA,UACf,MAAM;AAAA,UACN;AAAA,UACA,MAAM,KAAK;AAAA,UACX,OAAO,uBAAuB,KAAK;AAAA,UACnC,WAAW,KAAK;AAAA,UAChB,YAAY,KAAK;AAAA,UACjB,YAAY,KAAK;AAAA,QACnB,CAAC;AACD,cAAM;AAAA,MACR,UAAE;AACA,wBAAgB;AAAA,MAClB;AAAA,IACF;AACA,wBAAoB,uBAAuB,IAAI;AAC/C,SAAK,UAAU;AAAA,EACjB;AAEA,QAAM,gBAAgB,CAAC,iBAAmD;AACxE,eAAW,WAAW,cAAc;AAClC,iBAAW,QAAQ,SAAS;AAC1B,kBAAU,IAAI;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEA,gBAAc,QAAQ;AAEtB,aAAW,UAAU,qBAAqB,KAAK,GAAG;AAChD,UAAM,gBAAgB,OAAO;AAC7B,mBAAe,IAAI,QAAQ,aAAa;AACxC,WAAO,QAAQ,SAAS,gBAAuC,WAAW;AACxE,YAAM,cAAc,cAAc,MAAM,MAAM,SAAS;AAEvD,UAAI,cAAc,WAAW,GAAG;AAC9B,eAAO,YAAY,QAAQ,MAAM;AAC/B,wBAAc,8BAAsC,KAAK,CAAC;AAAA,QAC5D,CAAC;AAAA,MACH;AAEA,oBAAc,8BAAsC,KAAK,CAAC;AAC1D,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI;AACF,WAAO,MAAM,SAAS;AAAA,EACxB,UAAE;AACA,eAAW,CAAC,QAAQ,aAAa,KAAK,gBAAgB;AACpD,aAAO,QAAQ;AAAA,IACjB;AAEA,eAAW,CAAC,MAAM,eAAe,KAAK,oBAAoB;AACxD,WAAK,UAAU;AAAA,IACjB;AAAA,EACF;AACF;AAMA,SAAS,qBAAqB,OAAmC;AAC/D,SAAO,cAAc,KAAK,EAAE,OAAO,iBAAiB;AACtD;AAEA,SAAS,kBAAkB,OAAyC;AAClE,SAAO,WAAW,SAAS,OAAO,MAAM,UAAU;AACpD;AAEA,SAAS,8BACP,OACkC;AAClC,QAAM,WAA6C,CAAC;AACpD,QAAM,eAAe,oBAAI,IAA+B;AAExD,aAAW,aAAa,uBAAuB,KAAK,GAAG;AACrD,UAAM,cAAc,mBAAmB,SAAS;AAChD,QAAI,eAAe,CAAC,aAAa,IAAI,WAAW,GAAG;AACjD,mBAAa,IAAI,WAAW;AAC5B,eAAS,KAAK,WAAW;AAAA,IAC3B;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,OAA2C;AAChE,SAAO;AAAA,IACL,SAAS,OAAQ,MAA6B,SAAS;AAAA,EACzD;AACF;AAEA,SAAS,uBAAuB,OAAiC;AAC/D,QAAM,iBAAa,+BAAe,KAAK;AACvC,QAAM,EAAE,SAAS,MAAM,GAAG,QAAQ,IAAI;AAEtC,SAAO;AAAA,IACL,GAAG;AAAA,IACH,SAAS,OAAO,YAAY,WAAW,UAAU,OAAO,OAAO;AAAA,IAC/D,GAAI,OAAO,SAAS,WAAW,EAAE,KAAK,IAAI,CAAC;AAAA,EAC7C;AACF;AAGA,SAAS,wBAAwB,UAAkB,OAAe;AAChE,SAAO,WAAW,QAAQ,IAAI,QAAQ,CAAC;AACzC;AAEA,SAAS,2BACP,SACA;AACA,QAAM,gBAAgB;AACtB,SAAO,cAAc,uBAAuB,KAAK;AACnD;AAEA,SAAS,6BAAmD;AAC1D,SAAO;AAAA,IACL,uBAAuB,oBAAI,IAAI;AAAA,EACjC;AACF;AAEA,SAAS,yBACP,OACA,UACA;AACA,QAAM,sBAAsB;AAAA,IAC1B;AAAA,KACC,MAAM,sBAAsB,IAAI,QAAQ,KAAK,KAAK;AAAA,EACrD;AAEA,SAAO,MAAM;AACX,UAAM,aAAa,MAAM,sBAAsB,IAAI,QAAQ,KAAK,KAAK;AACrE,QAAI,aAAa,GAAG;AAClB,YAAM,sBAAsB,OAAO,QAAQ;AAC3C;AAAA,IACF;AAEA,UAAM,sBAAsB,IAAI,UAAU,SAAS;AAAA,EACrD;AACF;AAEA,SAAS,6BACP,OACA,UACA;AACA,UAAQ,MAAM,sBAAsB,IAAI,QAAQ,KAAK,KAAK;AAC5D;AAEA,eAAe,4BAAoC;AAAA,EACjD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAOG;AACD,MAAI,aAAa;AACjB,MAAI;AAEJ,QAAM,YAAY,UAAM,iCAAkB;AAAA,IACxC,UAAU,2BAA2B,QAAQ;AAAA,IAC7C;AAAA,IACA;AAAA,IACA,SAAS,OAAO,aAAa;AAC3B,mBAAa;AACb,mBAAa,MAAM,QAAQ,YAAY,QAAQ;AAC/C,aAAO,+BAA+B,UAAU;AAAA,IAClD;AAAA,IACA;AAAA,EACF,CAAC;AAED,MAAI,YAAY;AACd,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,kBAAkB,0BAA0B,UAAU;AAAA,MACtD,QAAQ,UAAU;AAAA,IACpB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG,8BAA8B,UAAU,MAAM;AAAA,IACjD,QAAQ,UAAU;AAAA,EACpB;AACF;AAEA,SAAS,2BAA2B,UAAkB;AACpD,SAAO,GAAG,QAAQ;AACpB;AAEA,SAAS,cAA0D;AAAA,EACjE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAOgC;AAC9B,QAAM,YAA2B;AAAA,IAC/B,SAAS,CAAC,UAAU;AAClB,aAAO,KAAK,KAAK;AAAA,IACnB;AAAA,IACA,QAAQ,CAAC,SAAS,aAAa;AAC7B,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,QACN;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,MAAM,CAAC,SAAS,aAAa;AAC3B,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,QACN;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,WAAW,CAAC,SAAS,aAAa;AAChC,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,QACN;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,MAAM,CAAC,YAAY,SAAS,YAAY;AACtC,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN;AAAA,QACA,GAAI,SAAS,OAAO,EAAE,MAAM,QAAQ,KAAK,IAAI,CAAC;AAAA,QAC9C;AAAA,QACA,GAAI,SAAS,QAAQ,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC;AAAA,QACjD,GAAI,SAAS,WAAW,EAAE,UAAU,QAAQ,SAAS,IAAI,CAAC;AAAA,MAC5D,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,eAAe,OAAO;AAAA,IAC1B,OAAO,QAAQ,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,UAAU,IAAI,MAAM;AAAA,MACpD;AAAA,MACA,OAAO,SAAoC;AACzC,cAAM,YAAY,oBAAI,KAAK;AAC3B,cAAM,6BAA6B;AAAA,UACjC;AAAA,UACA;AAAA,QACF;AACA,cAAM,cAAc;AAAA,UAClB;AAAA,UACA,QAAQ,QAAQ;AAAA,UAChB,aAAa,QAAQ;AAAA,QACvB;AACA,cAAM,aAAa;AAAA,UACjB;AAAA,UACA,oBAAoB,MAAM;AAAA,QAC5B;AACA,cAAM,OAAgC;AAAA,UACpC,MAAM;AAAA,UACN,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,WAAW;AAAA,UACX,WAAW,UAAU,YAAY;AAAA,QACnC;AAEA,YAAI;AACF,cAAI,CAAC,4BAA4B;AAC/B,mBAAO,KAAK,IAAI;AAAA,UAClB;AAEA,gBAAM,YAAY,MAAM,sBAAsB;AAAA,YAC5C;AAAA,YACA;AAAA,YACA,QAAQ,6BACJ,SACA,aAAa,QAAQ;AAAA,YACzB;AAAA,YACA,SAAS;AAAA,UACX,CAAC;AACD,gBAAM,aAAa,oBAAI,KAAK;AAE5B,cAAI,4BAA4B;AAC9B,mBAAO,UAAU;AAAA,UACnB;AAEA,eAAK,aAAa,WAAW,YAAY;AACzC,eAAK,aAAa,WAAW,QAAQ,IAAI,UAAU,QAAQ;AAC3D,eAAK,eAAW,uCAAwB,UAAU,MAAM;AACxD,iBAAO,KAAK;AAAA,YACV,MAAM;AAAA,YACN;AAAA,YACA,MAAM;AAAA,YACN,SAAS,UAAU;AAAA,YACnB,WAAW,KAAK;AAAA,YAChB,YAAY,KAAK;AAAA,YACjB,YAAY,KAAK;AAAA,UACnB,CAAC;AACD,iBAAO,UAAU;AAAA,QACnB,SAAS,OAAO;AACd,gBAAM,aAAa,oBAAI,KAAK;AAC5B,cAAI,4BAA4B;AAC9B,kBAAM;AAAA,UACR;AAEA,eAAK,aAAa,WAAW,YAAY;AACzC,eAAK,aAAa,WAAW,QAAQ,IAAI,UAAU,QAAQ;AAC3D,eAAK,eAAW;AAAA,gBACd,0CAA2B,KAAK;AAAA,UAClC;AACA,iBAAO,KAAK;AAAA,YACV,MAAM;AAAA,YACN;AAAA,YACA,MAAM;AAAA,YACN,OAAO,uBAAuB,KAAK;AAAA,YACnC,WAAW,KAAK;AAAA,YAChB,YAAY,KAAK;AAAA,YACjB,YAAY,KAAK;AAAA,UACnB,CAAC;AACD,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ,QAAQ;AAAA,EAClB;AACF;AAEA,SAAS,cAAc,QAAwC;AAC7D,MAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,CAAC,QAAQ;AAC5B,QAAM,eAAe;AAErB,aAAW,OAAO,YAAY;AAC5B,QAAI,OAAO,UAAU,eAAe,KAAK,cAAc,GAAG,GAAG;AAC3D,aAAO,cAAc,aAAa,GAAG,CAAC;AAAA,IACxC;AAAA,EACF;AAEA,SAAO;AACT;AAMA,SAAS,cAAc,OAAuC;AAC5D,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AAEA,MACE,UAAU,QACV,OAAO,UAAU,YACjB,OAAO,UAAU,WACjB;AACA,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,OAAO,SAAS,KAAK,IAAI,QAAQ;AAAA,EAC1C;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,UAAM,QAAqB,CAAC;AAC5B,eAAW,QAAQ,OAAO;AACxB,YAAM,aAAa,cAAc,IAAI;AACrC,UAAI,eAAe,QAAW;AAC5B,eAAO;AAAA,MACT;AACA,YAAM,KAAK,UAAU;AAAA,IACvB;AACA,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,YAAY,OAAO,eAAe,KAAK;AAC7C,QAAI,cAAc,OAAO,aAAa,cAAc,MAAM;AACxD,aAAO;AAAA,IACT;AAEA,UAAM,SAAoC,CAAC;AAC3C,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,YAAM,aAAa,cAAc,KAAK;AACtC,UAAI,eAAe,QAAW;AAC5B,eAAO;AAAA,MACT;AACA,aAAO,GAAG,IAAI;AAAA,IAChB;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,oBAAoB,QAAwC;AACnE,QAAM,UACJ,UAAU,OAAO,WAAW,eACxB,4BAAa,OAAiC,OAAO,IACrD;AACN,MAAI,YAAY,QAAW;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,iBAAa,4BAAY,MAAM;AACrC,SAAO,eAAe,SAClB,aACA,WAAW,SACT,SACA,OAAO,MAAM;AACrB;AAEA,SAAS,0BAA0B,QAA4B;AAC7D,SAAO,oBAAoB,MAAM,KAAK;AACxC;AAoBA,SAAS,+BACP,QAC0B;AAC1B,QAAM,mBAAmB,0BAA0B,MAAM;AAEzD,QAAM,kBAAc,4BAAY,MAAM;AAEtC,SAAO;AAAA,IACL,eAAe;AAAA,MACb,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA,aAAa,gBAAgB,SAAY,cAAc;AAAA,IACvD;AAAA,EACF;AACF;AAEA,SAAS,8BAA8B,QAAmB;AACxD,MAAI,2BAA2B,MAAM,GAAG;AACtC,WAAO;AAAA,MACL,QAAQ,OAAO;AAAA,MACf,kBAAkB,OAAO;AAAA,IAC3B;AAAA,EACF;AAEA,MAAI,iCAAiC,MAAM,GAAG;AAC5C,WAAO;AAAA,MACL,QAAQ,OAAO,eAAe,OAAO;AAAA,MACrC,kBAAkB,OAAO;AAAA,IAC3B;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,kBAAkB,0BAA0B,MAAM;AAAA,EACpD;AACF;AAEA,SAAS,2BACP,OACmC;AACnC,SAAO;AAAA,IACL,SACE,OAAO,UAAU,YACjB,mBAAmB,SACnB;AAAA,MACG,MAAsC;AAAA,IACzC,KACA,iBAAiB,SACjB,sBAAsB;AAAA,EAC1B;AACF;AAEA,SAAS,yBACP,OACoD;AACpD,SAAO;AAAA,IACL,SACE,OAAO,UAAU,YACjB,UAAU,SACT,MAA6B,SAAS,8BACvC,aAAa,SACZ,MAAgC,YAAY;AAAA,EACjD;AACF;AAEA,SAAS,iCACP,OACyC;AACzC,SAAO;AAAA,IACL,SACE,OAAO,UAAU,YACjB,mBAAmB,SACnB;AAAA,MACG,MAAsC;AAAA,IACzC,KACA,sBAAsB;AAAA,EAC1B;AACF;AAEA,SAAS,+BACP,OAC0D;AAC1D,SAAO;AAAA,IACL,SACE,OAAO,UAAU,YACjB,UAAU,SACT,MAA6B,SAAS,8BACvC,aAAa,SACZ,MAAgC,YAAY;AAAA,EACjD;AACF;AAEA,SAAS,oBAAoB,QAAoC;AAC/D,SAAO,OAAO,OAAO,CAAC,UAAU,MAAM,SAAS,WAAW,EAAE;AAC9D;AAEA,SAAS,aAAa,QAAiB,eAAqC;AAC1E,MAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,WAAO,gBAAgB,IAAI,EAAE,WAAW,cAAc,IAAI,CAAC;AAAA,EAC7D;AAEA,QAAM,aACH,OAAmC,SACnC,OAAmC;AAEtC,MACE,CAAC,cACD,OAAO,eAAe,YACtB,MAAM,QAAQ,UAAU,GACxB;AACA,WAAO,gBAAgB,IAAI,EAAE,WAAW,cAAc,IAAI,CAAC;AAAA,EAC7D;AAEA,QAAM,cAAc;AACpB,QAAM,QAAsB;AAAA,IAC1B,UAAU,YAAY,YAAY,QAAQ;AAAA,IAC1C,OAAO,YAAY,YAAY,KAAK;AAAA,IACpC,aAAa,YAAY,YAAY,WAAW;AAAA,IAChD,cAAc,YAAY,YAAY,YAAY;AAAA,IAClD,iBAAiB,YAAY,YAAY,eAAe;AAAA,IACxD,aAAa,YAAY,YAAY,WAAW;AAAA,IAChD,SAAS,eAAe,WAAW;AAAA,IACnC,WAAW,YAAY,YAAY,SAAS;AAAA,IAC5C,SAAS,YAAY,YAAY,OAAO;AAAA,IACxC,UAAU,qBAAqB,WAAW;AAAA,EAC5C;AAEA,MAAI,MAAM,cAAc,UAAa,gBAAgB,GAAG;AACtD,UAAM,YAAY;AAAA,EACpB;AAEA,SAAO;AACT;AAEA,SAAS,qBAAqB,OAAgC;AAC5D,QAAM,WAAoC,CAAC;AAC3C,QAAM,iBAAiB,MAAM;AAC7B,MACE,kBACA,OAAO,mBAAmB,YAC1B,CAAC,MAAM,QAAQ,cAAc,GAC7B;AACA,WAAO,OAAO,UAAU,cAAc;AAAA,EACxC;AAEA,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,QAAI,QAAQ,cAAc,mBAAmB,IAAI,GAAG,GAAG;AACrD;AAAA,IACF;AACA,aAAS,GAAG,IAAI;AAAA,EAClB;AAEA,aAAO,kCAAkB,QAAQ;AACnC;AAEA,IAAM,qBAAqB,oBAAI,IAAI;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,eAAe,OAAgC;AACtD,QAAM,SAAS,YAAY,MAAM,OAAO;AACxC,MAAI,WAAW,QAAW;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,MAAM;AACnB,SAAO,QAAQ,OAAO,SAAS,YAAY,CAAC,MAAM,QAAQ,IAAI,IAC1D,YAAa,KAAiC,KAAK,IACnD;AACN;AAEA,SAAS,YAAY,OAAgB;AACnC,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEA,SAAS,YAAY,OAAgB;AACnC,SAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,IACrD,QACA;AACN;AAEA,SAAS,eACP,QACA,QACA,QACA,OACmB;AACnB,UACE;AAAA,IACG,QAAgD;AAAA,EACnD,GACA;AACA,WAAQ,OAA0C;AAAA,EACpD;AAEA,QAAM,gBAAgB,CAAC,GAAG,MAAM;AAChC,MACE,WAAW,UACX,CAAC,cAAc;AAAA,IACb,CAAC,UACC,MAAM,SAAS,aACf,MAAM,SAAS,eACf,MAAM,YAAY;AAAA,EACtB,GACA;AACA,kBAAc,KAAK;AAAA,MACjB,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,UACI,QAAgD,YAEhC,MAAM;AAAA,IAC1B,OACI,QAAgD,SAEhC,MAAM;AAAA,EAC5B;AACF;AAEA,SAAS,cAAc,QAAmD;AACxE,aAAO,wCAAwB,MAAM;AACvC;AAEA,eAAe,sBAIb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;AACD,aAAO,iCAIL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,CAAC,UAAU,gBAClB,KAAK,QAAQ,UAAmB,WAAW;AAAA,IAC7C;AAAA,EACF,CAAC;AACH;","names":[]}
|
package/dist/index.mjs
CHANGED
|
@@ -48,7 +48,22 @@ function piAiJudgeHarness(config) {
|
|
|
48
48
|
...signal ? { signal } : {}
|
|
49
49
|
}
|
|
50
50
|
);
|
|
51
|
-
|
|
51
|
+
const output = resolvePiAiJudgeText(message);
|
|
52
|
+
const usage = resolveUsage(message, 0);
|
|
53
|
+
return {
|
|
54
|
+
output,
|
|
55
|
+
session: resolveSession(
|
|
56
|
+
message,
|
|
57
|
+
[
|
|
58
|
+
{ type: "message", role: "user", content: prompt },
|
|
59
|
+
{ type: "message", role: "assistant", content: output }
|
|
60
|
+
],
|
|
61
|
+
output,
|
|
62
|
+
usage
|
|
63
|
+
),
|
|
64
|
+
usage,
|
|
65
|
+
errors: []
|
|
66
|
+
};
|
|
52
67
|
}
|
|
53
68
|
});
|
|
54
69
|
}
|
|
@@ -886,6 +901,7 @@ function resolveUsage(result, toolCallCount) {
|
|
|
886
901
|
outputTokens: numberField(usageRecord.outputTokens),
|
|
887
902
|
reasoningTokens: numberField(usageRecord.reasoningTokens),
|
|
888
903
|
totalTokens: numberField(usageRecord.totalTokens),
|
|
904
|
+
costUsd: resolveCostUsd(usageRecord),
|
|
889
905
|
toolCalls: numberField(usageRecord.toolCalls),
|
|
890
906
|
retries: numberField(usageRecord.retries),
|
|
891
907
|
metadata: collectUsageMetadata(usageRecord)
|
|
@@ -916,9 +932,18 @@ var USAGE_SUMMARY_KEYS = /* @__PURE__ */ new Set([
|
|
|
916
932
|
"outputTokens",
|
|
917
933
|
"reasoningTokens",
|
|
918
934
|
"totalTokens",
|
|
935
|
+
"costUsd",
|
|
919
936
|
"toolCalls",
|
|
920
937
|
"retries"
|
|
921
938
|
]);
|
|
939
|
+
function resolveCostUsd(usage) {
|
|
940
|
+
const direct = numberField(usage.costUsd);
|
|
941
|
+
if (direct !== void 0) {
|
|
942
|
+
return direct;
|
|
943
|
+
}
|
|
944
|
+
const cost = usage.cost;
|
|
945
|
+
return cost && typeof cost === "object" && !Array.isArray(cost) ? numberField(cost.total) : void 0;
|
|
946
|
+
}
|
|
922
947
|
function stringField(value) {
|
|
923
948
|
return typeof value === "string" ? value : void 0;
|
|
924
949
|
}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type {\n Harness,\n HarnessContext,\n HarnessRun,\n JsonValue,\n NormalizedError,\n NormalizedSpan,\n NormalizedSession,\n TranscriptEvent,\n TranscriptMessageEvent,\n TranscriptToolCallEvent,\n NormalizedTrace,\n TimingSummary,\n UsageSummary,\n} from \"vitest-evals/harness\";\nimport {\n attachHarnessRunToError,\n createFailedHarnessRun,\n createGenAiUsageAttributes,\n ensureRunTrace,\n getHarnessRunFromError,\n isHarnessRun,\n isNormalizedSession,\n normalizeMetadata,\n normalizeContent,\n normalizeSpanAttributes,\n normalizeSpanError,\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<TAgent, TInput = string> =\n | TAgent\n | ((args: PiAiCreateAgentArgs<TInput>) => MaybePromise<TAgent>);\ntype AnyPiAiToolset<TInput = string> = Record<\n string,\n PiAiToolDefinition<any, any, TInput>\n>;\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<TInput = string> = Record<\n string,\n PiAiToolDefinition<Record<string, JsonValue>, JsonValue, TInput>\n>;\n\ntype PiAgentToolLike<TInput = string> = {\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 TTools extends PiAiToolset<TInput>,\n> = TAgent extends {\n run: (\n input: TInput,\n runtime: PiAiRuntime<TTools, TInput>,\n ) => MaybePromise<infer TResult>;\n}\n ? Awaited<TResult>\n : unknown;\n\nconst ORIGINAL_NATIVE_EXECUTE = Symbol(\"vitest-evals.originalNativeExecute\");\n\ntype NativeToolExecute<TInput> = PiAgentToolLike<TInput>[\"execute\"] & {\n [ORIGINAL_NATIVE_EXECUTE]?: PiAgentToolLike<TInput>[\"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 events. */\nexport interface PiAiEventSink {\n message: (event: TranscriptMessageEvent) => 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 /** Records a tool-result event linked to an assistant tool call by id. */\n tool: (\n toolCallId: string,\n content: JsonValue,\n options?: {\n name?: string;\n error?: NormalizedError;\n metadata?: Record<string, JsonValue>;\n },\n ) => void;\n}\n\n/** Context passed to instrumented Pi AI tool executions. */\nexport interface PiAiToolContext<TInput = string> {\n input: TInput;\n signal?: AbortSignal;\n setArtifact: HarnessContext[\"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> = ToolReplayConfig<TArgs, TResult, PiAiToolContext<TInput>>;\n\n/** Replay policy for one Pi AI tool. */\nexport type PiAiToolReplayPolicy<TInput = string> =\n | boolean\n | PiAiToolReplayConfig<Record<string, JsonValue>, JsonValue, TInput>;\n\n/** Replay policy map keyed by Pi AI tool name. */\nexport type PiAiToolReplayPolicies<TInput = string> = Record<\n string,\n PiAiToolReplayPolicy<TInput>\n>;\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> {\n description?: string;\n execute: (\n args: TArgs,\n context: PiAiToolContext<TInput>,\n ) => MaybePromise<TResult>;\n}\n\n/** Toolset shape accepted by the Pi AI harness. */\nexport type PiAiToolset<TInput = string> = AnyPiAiToolset<TInput>;\n\ntype ToolArgs<TTool> = TTool extends PiAiToolDefinition<\n infer TArgs,\n infer _TResult,\n infer _TInput\n>\n ? TArgs\n : never;\n\ntype ToolResult<TTool> = TTool extends PiAiToolDefinition<\n infer _TArgs,\n infer TResult,\n infer _TInput\n>\n ? TResult\n : never;\n\n/** Runtime object passed into Pi AI agent entrypoints. */\nexport type PiAiRuntime<TTools extends PiAiToolset<TInput>, TInput = string> = {\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 TTools extends PiAiToolset<TInput>,\n> {\n agent: TAgent;\n input: TInput;\n context: HarnessContext;\n runtime: PiAiRuntime<TTools, TInput>;\n}\n\n/** Arguments passed to Pi AI harness output selectors. */\nexport interface PiAiHarnessResultArgs<\n TAgent,\n TInput,\n TResult,\n TTools extends PiAiToolset<TInput>,\n> extends PiAiHarnessRunArgs<TAgent, TInput, TTools> {\n result: TResult;\n}\n\n/** Arguments passed to per-run Pi AI agent factories. */\nexport interface PiAiCreateAgentArgs<TInput = string> {\n input: TInput;\n context: HarnessContext;\n}\n\ninterface PiAiHarnessBaseOptions<\n TAgent,\n TInput = string,\n TResult = unknown,\n TTools extends PiAiToolset<TInput> = PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> {\n agent: AgentSource<TAgent, TInput>;\n toolReplay?: PiAiToolReplayPolicies<TInput>;\n output?: PiAiHarnessOutputSelector<TAgent, TInput, TResult, TTools, TOutput>;\n name?: string;\n}\n\ninterface PiAiHarnessWithToolsOptions<\n TAgent,\n TInput = string,\n TResult = unknown,\n TTools extends PiAiToolset<TInput> = PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> extends PiAiHarnessBaseOptions<TAgent, TInput, TResult, TTools, TOutput> {\n tools: TTools;\n run?: (\n args: PiAiHarnessRunArgs<TAgent, TInput, TTools>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n}\n\ninterface PiAiHarnessInferredToolsOptions<\n TAgent,\n TInput = string,\n TResult = unknown,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> extends PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TResult,\n InferredPiAiToolset<TInput>,\n TOutput\n > {\n tools?: undefined;\n run?: (\n args: PiAiHarnessRunArgs<TAgent, TInput, InferredPiAiToolset<TInput>>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n}\n\ntype PiAiHarnessOptions<\n TAgent,\n TInput = string,\n TResult = unknown,\n TTools extends PiAiToolset<TInput> = PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> =\n | PiAiHarnessWithToolsOptions<TAgent, TInput, TResult, TTools, TOutput>\n | PiAiHarnessInferredToolsOptions<TAgent, TInput, TResult, TOutput>;\n\ntype PiAiHarnessWithToolsOptionsWithOutput<\n TAgent,\n TInput = string,\n TResult = unknown,\n TTools extends PiAiToolset<TInput> = PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = PiAiHarnessWithToolsOptions<TAgent, TInput, TResult, TTools, TOutput> & {\n output: PiAiHarnessOutputSelector<TAgent, TInput, TResult, TTools, TOutput>;\n};\n\ntype PiAiHarnessInferredToolsOptionsWithOutput<\n TAgent,\n TInput = string,\n TResult = unknown,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = PiAiHarnessInferredToolsOptions<TAgent, TInput, TResult, TOutput> & {\n output: PiAiHarnessOutputSelector<\n TAgent,\n TInput,\n TResult,\n InferredPiAiToolset<TInput>,\n TOutput\n >;\n};\n\ntype PiAiHarnessWithToolsRunOptionsWithoutOutput<\n TAgent,\n TInput = string,\n TResult = unknown,\n TTools extends PiAiToolset<TInput> = PiAiToolset<TInput>,\n> = PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TResult,\n TTools,\n JsonValue | undefined\n> & {\n tools: TTools;\n run: (\n args: PiAiHarnessRunArgs<TAgent, TInput, TTools>,\n ) => MaybePromise<TResult>;\n output?: never;\n};\n\ntype PiAiHarnessWithToolsAgentOptionsWithoutOutput<\n TAgent,\n TInput = string,\n TTools extends PiAiToolset<TInput> = PiAiToolset<TInput>,\n> = PiAiHarnessBaseOptions<\n TAgent,\n TInput,\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 TResult = unknown,\n> = PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TResult,\n InferredPiAiToolset<TInput>,\n JsonValue | undefined\n> & {\n tools?: undefined;\n run: (\n args: PiAiHarnessRunArgs<TAgent, TInput, InferredPiAiToolset<TInput>>,\n ) => MaybePromise<TResult>;\n output?: never;\n};\n\ntype PiAiHarnessInferredToolsAgentOptionsWithoutOutput<\n TAgent,\n TInput = string,\n> = PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n unknown,\n InferredPiAiToolset<TInput>,\n JsonValue | undefined\n> & {\n tools?: undefined;\n run?: never;\n output?: never;\n};\n\ntype PiAiHarnessRunOptions<\n TAgent,\n TInput,\n TResult,\n TTools extends PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined,\n> = PiAiHarnessBaseOptions<TAgent, TInput, TResult, TTools, TOutput> & {\n run?: (\n args: PiAiHarnessRunArgs<TAgent, TInput, TTools>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n};\n\ntype PiAiRunnableAgent<\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends PiAiToolset<TInput>,\n> = {\n run: (\n input: TInput,\n runtime: PiAiRuntime<TTools, TInput>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n};\n\ntype PiAiHarnessOutputSelector<\n TAgent,\n TInput = string,\n TResult = unknown,\n TTools extends PiAiToolset<TInput> = PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = (\n args: PiAiHarnessResultArgs<TAgent, TInput, TResult, TTools>,\n) => MaybePromise<TOutput>;\n\ntype InferredToolSurfaces<TInput> = {\n runtimeTools?: InferredPiAiToolset<TInput>;\n nativeToolsets?: Array<PiAgentToolLike<TInput>[]>;\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 TResult = unknown,\n TTools extends PiAiToolset<TInput> = PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: PiAiHarnessWithToolsOptionsWithOutput<\n TAgent,\n TInput,\n TResult,\n TTools,\n TOutput\n >,\n): Harness<TInput, TOutput>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TResult = unknown,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: PiAiHarnessInferredToolsOptionsWithOutput<\n TAgent,\n TInput,\n TResult,\n TOutput\n >,\n): Harness<TInput, TOutput>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TResult = unknown,\n TTools extends PiAiToolset<TInput> = PiAiToolset<TInput>,\n>(\n options: PiAiHarnessWithToolsRunOptionsWithoutOutput<\n TAgent,\n TInput,\n TResult,\n TTools\n >,\n): Harness<TInput, PiAiResultOutput<Awaited<TResult>>>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TTools extends PiAiToolset<TInput> = PiAiToolset<TInput>,\n>(\n options: PiAiHarnessWithToolsAgentOptionsWithoutOutput<\n TAgent,\n TInput,\n TTools\n >,\n): Harness<TInput, PiAiResultOutput<PiAiAgentResult<TAgent, TInput, TTools>>>;\nexport function piAiHarness<TAgent, TInput = string, TResult = unknown>(\n options: PiAiHarnessInferredToolsRunOptionsWithoutOutput<\n TAgent,\n TInput,\n TResult\n >,\n): Harness<TInput, PiAiResultOutput<Awaited<TResult>>>;\nexport function piAiHarness<TAgent, TInput = string>(\n options: PiAiHarnessInferredToolsAgentOptionsWithoutOutput<TAgent, TInput>,\n): Harness<\n TInput,\n PiAiResultOutput<PiAiAgentResult<TAgent, TInput, InferredPiAiToolset<TInput>>>\n>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TResult = unknown,\n TTools extends PiAiToolset<TInput> = PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: PiAiHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>,\n): Harness<TInput, TOutput> {\n validateOptions(options);\n\n const harnessName = options.name ?? \"pi-ai\";\n const harness: Harness<TInput, TOutput> = {\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 events: TranscriptEvent[] = [\n {\n type: \"message\",\n role: \"user\",\n content: normalizeContent(input),\n },\n ];\n const inferredTools = resolveInferredToolSurfaces<TInput>(agent);\n\n if (hasExplicitToolset(options)) {\n return await executePiHarnessRun(\n options,\n agent,\n input,\n context,\n events,\n options.tools,\n inferredTools.nativeToolsets,\n );\n }\n\n return await executePiHarnessRun(\n options,\n agent,\n input,\n context,\n events,\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>(\n input: TInput,\n context: HarnessContext,\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 TResult,\n TTools extends PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined,\n>(options: PiAiHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>) {\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 TResult,\n TTools extends PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessRunOptions<TAgent, TInput, TResult, TTools, TOutput>,\n agent: TAgent,\n input: TInput,\n context: HarnessContext,\n events: TranscriptEvent[],\n runtimeTools: TTools | undefined,\n nativeToolsets?: Array<PiAgentToolLike<TInput>[]>,\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 events,\n });\n\n try {\n const result = await withInstrumentedAgentTools(\n agent,\n nativeToolsets,\n {\n input,\n context,\n events,\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<TAgent, TInput, TResult, TTools>;\n\n const output = options.output\n ? await options.output(resultArgs)\n : (resolveOutput(normalizeResult) as TOutput | undefined);\n const usage = resolveUsage(normalizeResult, countToolCallEvents(events));\n const session = resolveSession(normalizeResult, events, 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, countToolCallEvents(events));\n const session = resolveSession(undefined, events, 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 TResult,\n TTools extends PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>,\n args: PiAiCreateAgentArgs<TInput>,\n) {\n return resolveAgentSource(options.agent, args);\n}\n\nasync function resolveAgentSource<TAgent, TInput>(\n agent: AgentSource<TAgent, TInput>,\n args: PiAiCreateAgentArgs<TInput>,\n): Promise<TAgent> {\n if (isAgentFactory(agent)) {\n return agent(args);\n }\n\n return agent;\n}\n\nfunction isAgentFactory<TAgent, TInput>(\n agent: AgentSource<TAgent, TInput>,\n): agent is (args: PiAiCreateAgentArgs<TInput>) => MaybePromise<TAgent> {\n return typeof agent === \"function\" && !hasPiAiRunMethod(agent);\n}\n\nfunction hasOutputSelector<\n TAgent,\n TInput,\n TResult,\n TTools extends PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined,\n>(options: PiAiHarnessRunOptions<TAgent, TInput, TResult, TTools, TOutput>) {\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 = [rootSpan, ...(modelSpan ? [modelSpan] : [])];\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>(\n agent: unknown,\n): InferredToolSurfaces<TInput> {\n let runtimeTools: InferredPiAiToolset<TInput> | undefined;\n const nativeToolsets: Array<PiAgentToolLike<TInput>[]> = [];\n const seenToolsets = new Set<PiAgentToolLike<TInput>[]>();\n\n for (const candidate of getAgentToolCandidates(agent)) {\n const nextRuntimeTools = getRuntimeToolset<TInput>(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>(\n value: object,\n): InferredPiAiToolset<TInput> | undefined {\n const candidate =\n getObjectProperty(value, \"tools\") ?? getObjectProperty(value, \"toolset\");\n\n return isPiAiToolset(candidate)\n ? (candidate as InferredPiAiToolset<TInput>)\n : undefined;\n}\n\nfunction getNativeToolArray<TInput>(\n value: object,\n): PiAgentToolLike<TInput>[] | undefined {\n const candidate = getObjectProperty(value, \"tools\");\n if (isAgentToolArray(candidate)) {\n return candidate as PiAgentToolLike<TInput>[];\n }\n\n return undefined;\n}\n\nasync function runAgent<\n TAgent,\n TInput,\n TResult,\n TTools extends PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessRunOptions<TAgent, TInput, TResult, TTools, TOutput>,\n args: PiAiHarnessRunArgs<TAgent, TInput, TTools>,\n): Promise<TResult | HarnessRun<TOutput>> {\n if (options.run) {\n return options.run(args);\n }\n\n if (hasPiAiRunMethod<TInput, TResult, TOutput, TTools>(args.agent)) {\n return args.agent.run(args.input, args.runtime);\n }\n\n throw new Error(\n \"piAiHarness requires a run() function unless the provided agent exposes run(input, runtime).\",\n );\n}\n\nfunction hasExplicitToolset<\n TAgent,\n TInput,\n TResult,\n TTools extends PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>,\n): options is PiAiHarnessWithToolsOptions<\n TAgent,\n TInput,\n TResult,\n TTools,\n TOutput\n> {\n return options.tools !== undefined;\n}\n\nfunction hasPiAiRunMethod<\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends PiAiToolset<TInput>,\n>(\n agent: unknown,\n): agent is PiAiRunnableAgent<TInput, 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<TResult, TInput>(\n agent: unknown,\n toolsets: Array<PiAgentToolLike<TInput>[]> | undefined,\n args: {\n input: TInput;\n context: HarnessContext;\n events: TranscriptEvent[];\n toolReplay: PiAiToolReplayPolicies<TInput> | 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>,\n PiAgentToolLike<TInput>[\"execute\"]\n >();\n const originalResets = new Map<ResettableAgent, ResettableAgent[\"reset\"]>();\n\n const patchTool = (tool: PiAgentToolLike<TInput>) => {\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> = async (\n toolCallId: string,\n rawArgs: Record<string, JsonValue>,\n ) => {\n const startedAt = new Date();\n const toolContext = {\n input: args.input,\n signal: args.context.signal,\n setArtifact: args.context.setArtifact,\n } satisfies PiAiToolContext<TInput>;\n const leaveNativeTool = enterNativeToolExecution(\n args.executionState,\n tool.name,\n );\n const call: TranscriptToolCallEvent = {\n type: \"tool_call\",\n id: toolCallId,\n name: tool.name,\n arguments: rawArgs,\n startedAt: startedAt.toISOString(),\n metadata: normalizeReplayMetadata(undefined),\n } satisfies TranscriptToolCallEvent;\n args.events.push(call);\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 call.finishedAt = finishedAt.toISOString();\n call.durationMs = finishedAt.getTime() - startedAt.getTime();\n call.metadata = normalizeReplayMetadata(execution.replay);\n args.events.push({\n type: \"tool_result\",\n toolCallId,\n name: tool.name,\n content: execution.normalizedResult,\n startedAt: call.startedAt,\n finishedAt: call.finishedAt,\n durationMs: call.durationMs,\n });\n return execution.result;\n } catch (error) {\n const finishedAt = new Date();\n call.finishedAt = finishedAt.toISOString();\n call.durationMs = finishedAt.getTime() - startedAt.getTime();\n call.metadata = normalizeReplayMetadata(\n getReplayMetadataFromError(error),\n );\n args.events.push({\n type: \"tool_result\",\n toolCallId,\n name: tool.name,\n error: serializeToolCallError(error),\n startedAt: call.startedAt,\n finishedAt: call.finishedAt,\n durationMs: call.durationMs,\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 = (nextToolsets: Array<PiAgentToolLike<TInput>[]>) => {\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(resolveInferredNativeToolsets<TInput>(agent));\n });\n }\n\n patchToolsets(resolveInferredNativeToolsets<TInput>(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<TInput>(\n agent: unknown,\n): Array<PiAgentToolLike<TInput>[]> {\n const toolsets: Array<PiAgentToolLike<TInput>[]> = [];\n const seenToolsets = new Set<PiAgentToolLike<TInput>[]>();\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(error: unknown): NormalizedError {\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\n/** Creates a runtime-local id used on both assistant tool calls and tool results. */\nfunction createRuntimeToolCallId(toolName: string, index: number) {\n return `runtime:${toolName}:${index + 1}`;\n}\n\nfunction getNativeToolExecuteOrigin<TInput>(\n execute: PiAgentToolLike<TInput>[\"execute\"],\n) {\n const nativeExecute = execute as NativeToolExecute<TInput>;\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<TInput>({\n toolName,\n toolCallId,\n execute,\n replay,\n args,\n context,\n}: {\n toolName: string;\n toolCallId: string;\n execute: PiAgentToolLike<TInput>[\"execute\"];\n replay: PiAiToolReplayPolicy<TInput> | undefined;\n args: Record<string, JsonValue>;\n context: PiAiToolContext<TInput>;\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<TInput, TTools extends PiAiToolset<TInput>>({\n input,\n context,\n tools,\n toolReplay,\n executionState,\n events,\n}: {\n input: TInput;\n context: HarnessContext;\n tools: TTools | undefined;\n toolReplay: PiAiToolReplayPolicies<TInput> | undefined;\n executionState: PiToolExecutionState;\n events: TranscriptEvent[];\n}): PiAiRuntime<TTools, TInput> {\n const eventSink: PiAiEventSink = {\n message: (event) => {\n events.push(event);\n },\n system: (content, metadata) => {\n events.push({\n type: \"message\",\n role: \"system\",\n content,\n metadata,\n });\n },\n user: (content, metadata) => {\n events.push({\n type: \"message\",\n role: \"user\",\n content,\n metadata,\n });\n },\n assistant: (content, metadata) => {\n events.push({\n type: \"message\",\n role: \"assistant\",\n content,\n metadata,\n });\n },\n tool: (toolCallId, content, options) => {\n events.push({\n type: \"tool_result\",\n toolCallId,\n ...(options?.name ? { name: options.name } : {}),\n content,\n ...(options?.error ? { error: options.error } : {}),\n ...(options?.metadata ? { metadata: options.metadata } : {}),\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 signal: context.signal,\n setArtifact: context.setArtifact,\n } satisfies PiAiToolContext<TInput>;\n const toolCallId = createRuntimeToolCallId(\n toolName,\n countToolCallEvents(events),\n );\n const call: TranscriptToolCallEvent = {\n type: \"tool_call\",\n id: toolCallId,\n name: toolName,\n arguments: args,\n startedAt: startedAt.toISOString(),\n } satisfies TranscriptToolCallEvent;\n\n try {\n if (!isNativeImplementationCall) {\n events.push(call);\n }\n\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 call.finishedAt = finishedAt.toISOString();\n call.durationMs = finishedAt.getTime() - startedAt.getTime();\n call.metadata = normalizeReplayMetadata(execution.replay);\n events.push({\n type: \"tool_result\",\n toolCallId,\n name: toolName,\n content: execution.result,\n startedAt: call.startedAt,\n finishedAt: call.finishedAt,\n durationMs: call.durationMs,\n });\n return execution.result;\n } catch (error) {\n const finishedAt = new Date();\n if (isNativeImplementationCall) {\n throw error;\n }\n\n call.finishedAt = finishedAt.toISOString();\n call.durationMs = finishedAt.getTime() - startedAt.getTime();\n call.metadata = normalizeReplayMetadata(\n getReplayMetadataFromError(error),\n );\n events.push({\n type: \"tool_result\",\n toolCallId,\n name: toolName,\n error: serializeToolCallError(error),\n startedAt: call.startedAt,\n finishedAt: call.finishedAt,\n durationMs: call.durationMs,\n });\n throw error;\n }\n },\n ]),\n ) as unknown as PiAiRuntime<TTools, TInput>[\"tools\"];\n\n return {\n tools: runtimeTools,\n events: eventSink,\n signal: context.signal,\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 countToolCallEvents(events: readonly TranscriptEvent[]) {\n return events.filter((event) => event.type === \"tool_call\").length;\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 events: TranscriptEvent[],\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 const sessionEvents = [...events];\n if (\n output !== undefined &&\n !sessionEvents.some(\n (event) =>\n event.type === \"message\" &&\n event.role === \"assistant\" &&\n event.content !== undefined,\n )\n ) {\n sessionEvents.push({\n type: \"message\",\n role: \"assistant\",\n content: output,\n });\n }\n\n return {\n events: sessionEvents,\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>({\n toolName,\n tool,\n replay,\n args,\n context,\n}: {\n toolName: string;\n tool: PiAiToolDefinition<TArgs, TResult, TInput>;\n replay: PiAiToolReplayPolicy<TInput> | undefined;\n args: TArgs;\n context: PiAiToolContext<TInput>;\n}) {\n return executeWithReplay<\n Record<string, JsonValue>,\n JsonValue,\n PiAiToolContext<TInput>\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 HarnessRun,\n JsonValue,\n NormalizedError,\n NormalizedSpan,\n NormalizedSession,\n TranscriptEvent,\n TranscriptMessageEvent,\n TranscriptToolCallEvent,\n NormalizedTrace,\n TimingSummary,\n UsageSummary,\n} from \"vitest-evals/harness\";\nimport {\n attachHarnessRunToError,\n createFailedHarnessRun,\n createGenAiUsageAttributes,\n ensureRunTrace,\n getHarnessRunFromError,\n isHarnessRun,\n isNormalizedSession,\n normalizeMetadata,\n normalizeContent,\n normalizeSpanAttributes,\n normalizeSpanError,\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<TAgent, TInput = string> =\n | TAgent\n | ((args: PiAiCreateAgentArgs<TInput>) => MaybePromise<TAgent>);\ntype AnyPiAiToolset<TInput = string> = Record<\n string,\n PiAiToolDefinition<any, any, TInput>\n>;\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 const output = resolvePiAiJudgeText(message);\n const usage = resolveUsage(message, 0);\n return {\n output,\n session: resolveSession(\n message,\n [\n { type: \"message\", role: \"user\", content: prompt },\n { type: \"message\", role: \"assistant\", content: output },\n ],\n output,\n usage,\n ),\n usage,\n errors: [],\n };\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<TInput = string> = Record<\n string,\n PiAiToolDefinition<Record<string, JsonValue>, JsonValue, TInput>\n>;\n\ntype PiAgentToolLike<TInput = string> = {\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 TTools extends PiAiToolset<TInput>,\n> = TAgent extends {\n run: (\n input: TInput,\n runtime: PiAiRuntime<TTools, TInput>,\n ) => MaybePromise<infer TResult>;\n}\n ? Awaited<TResult>\n : unknown;\n\nconst ORIGINAL_NATIVE_EXECUTE = Symbol(\"vitest-evals.originalNativeExecute\");\n\ntype NativeToolExecute<TInput> = PiAgentToolLike<TInput>[\"execute\"] & {\n [ORIGINAL_NATIVE_EXECUTE]?: PiAgentToolLike<TInput>[\"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 events. */\nexport interface PiAiEventSink {\n message: (event: TranscriptMessageEvent) => 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 /** Records a tool-result event linked to an assistant tool call by id. */\n tool: (\n toolCallId: string,\n content: JsonValue,\n options?: {\n name?: string;\n error?: NormalizedError;\n metadata?: Record<string, JsonValue>;\n },\n ) => void;\n}\n\n/** Context passed to instrumented Pi AI tool executions. */\nexport interface PiAiToolContext<TInput = string> {\n input: TInput;\n signal?: AbortSignal;\n setArtifact: HarnessContext[\"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> = ToolReplayConfig<TArgs, TResult, PiAiToolContext<TInput>>;\n\n/** Replay policy for one Pi AI tool. */\nexport type PiAiToolReplayPolicy<TInput = string> =\n | boolean\n | PiAiToolReplayConfig<Record<string, JsonValue>, JsonValue, TInput>;\n\n/** Replay policy map keyed by Pi AI tool name. */\nexport type PiAiToolReplayPolicies<TInput = string> = Record<\n string,\n PiAiToolReplayPolicy<TInput>\n>;\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> {\n description?: string;\n execute: (\n args: TArgs,\n context: PiAiToolContext<TInput>,\n ) => MaybePromise<TResult>;\n}\n\n/** Toolset shape accepted by the Pi AI harness. */\nexport type PiAiToolset<TInput = string> = AnyPiAiToolset<TInput>;\n\ntype ToolArgs<TTool> = TTool extends PiAiToolDefinition<\n infer TArgs,\n infer _TResult,\n infer _TInput\n>\n ? TArgs\n : never;\n\ntype ToolResult<TTool> = TTool extends PiAiToolDefinition<\n infer _TArgs,\n infer TResult,\n infer _TInput\n>\n ? TResult\n : never;\n\n/** Runtime object passed into Pi AI agent entrypoints. */\nexport type PiAiRuntime<TTools extends PiAiToolset<TInput>, TInput = string> = {\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 TTools extends PiAiToolset<TInput>,\n> {\n agent: TAgent;\n input: TInput;\n context: HarnessContext;\n runtime: PiAiRuntime<TTools, TInput>;\n}\n\n/** Arguments passed to Pi AI harness output selectors. */\nexport interface PiAiHarnessResultArgs<\n TAgent,\n TInput,\n TResult,\n TTools extends PiAiToolset<TInput>,\n> extends PiAiHarnessRunArgs<TAgent, TInput, TTools> {\n result: TResult;\n}\n\n/** Arguments passed to per-run Pi AI agent factories. */\nexport interface PiAiCreateAgentArgs<TInput = string> {\n input: TInput;\n context: HarnessContext;\n}\n\ninterface PiAiHarnessBaseOptions<\n TAgent,\n TInput = string,\n TResult = unknown,\n TTools extends PiAiToolset<TInput> = PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> {\n agent: AgentSource<TAgent, TInput>;\n toolReplay?: PiAiToolReplayPolicies<TInput>;\n output?: PiAiHarnessOutputSelector<TAgent, TInput, TResult, TTools, TOutput>;\n name?: string;\n}\n\ninterface PiAiHarnessWithToolsOptions<\n TAgent,\n TInput = string,\n TResult = unknown,\n TTools extends PiAiToolset<TInput> = PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> extends PiAiHarnessBaseOptions<TAgent, TInput, TResult, TTools, TOutput> {\n tools: TTools;\n run?: (\n args: PiAiHarnessRunArgs<TAgent, TInput, TTools>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n}\n\ninterface PiAiHarnessInferredToolsOptions<\n TAgent,\n TInput = string,\n TResult = unknown,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> extends PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TResult,\n InferredPiAiToolset<TInput>,\n TOutput\n > {\n tools?: undefined;\n run?: (\n args: PiAiHarnessRunArgs<TAgent, TInput, InferredPiAiToolset<TInput>>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n}\n\ntype PiAiHarnessOptions<\n TAgent,\n TInput = string,\n TResult = unknown,\n TTools extends PiAiToolset<TInput> = PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> =\n | PiAiHarnessWithToolsOptions<TAgent, TInput, TResult, TTools, TOutput>\n | PiAiHarnessInferredToolsOptions<TAgent, TInput, TResult, TOutput>;\n\ntype PiAiHarnessWithToolsOptionsWithOutput<\n TAgent,\n TInput = string,\n TResult = unknown,\n TTools extends PiAiToolset<TInput> = PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = PiAiHarnessWithToolsOptions<TAgent, TInput, TResult, TTools, TOutput> & {\n output: PiAiHarnessOutputSelector<TAgent, TInput, TResult, TTools, TOutput>;\n};\n\ntype PiAiHarnessInferredToolsOptionsWithOutput<\n TAgent,\n TInput = string,\n TResult = unknown,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = PiAiHarnessInferredToolsOptions<TAgent, TInput, TResult, TOutput> & {\n output: PiAiHarnessOutputSelector<\n TAgent,\n TInput,\n TResult,\n InferredPiAiToolset<TInput>,\n TOutput\n >;\n};\n\ntype PiAiHarnessWithToolsRunOptionsWithoutOutput<\n TAgent,\n TInput = string,\n TResult = unknown,\n TTools extends PiAiToolset<TInput> = PiAiToolset<TInput>,\n> = PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TResult,\n TTools,\n JsonValue | undefined\n> & {\n tools: TTools;\n run: (\n args: PiAiHarnessRunArgs<TAgent, TInput, TTools>,\n ) => MaybePromise<TResult>;\n output?: never;\n};\n\ntype PiAiHarnessWithToolsAgentOptionsWithoutOutput<\n TAgent,\n TInput = string,\n TTools extends PiAiToolset<TInput> = PiAiToolset<TInput>,\n> = PiAiHarnessBaseOptions<\n TAgent,\n TInput,\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 TResult = unknown,\n> = PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n TResult,\n InferredPiAiToolset<TInput>,\n JsonValue | undefined\n> & {\n tools?: undefined;\n run: (\n args: PiAiHarnessRunArgs<TAgent, TInput, InferredPiAiToolset<TInput>>,\n ) => MaybePromise<TResult>;\n output?: never;\n};\n\ntype PiAiHarnessInferredToolsAgentOptionsWithoutOutput<\n TAgent,\n TInput = string,\n> = PiAiHarnessBaseOptions<\n TAgent,\n TInput,\n unknown,\n InferredPiAiToolset<TInput>,\n JsonValue | undefined\n> & {\n tools?: undefined;\n run?: never;\n output?: never;\n};\n\ntype PiAiHarnessRunOptions<\n TAgent,\n TInput,\n TResult,\n TTools extends PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined,\n> = PiAiHarnessBaseOptions<TAgent, TInput, TResult, TTools, TOutput> & {\n run?: (\n args: PiAiHarnessRunArgs<TAgent, TInput, TTools>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n};\n\ntype PiAiRunnableAgent<\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends PiAiToolset<TInput>,\n> = {\n run: (\n input: TInput,\n runtime: PiAiRuntime<TTools, TInput>,\n ) => MaybePromise<TResult | HarnessRun<TOutput>>;\n};\n\ntype PiAiHarnessOutputSelector<\n TAgent,\n TInput = string,\n TResult = unknown,\n TTools extends PiAiToolset<TInput> = PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n> = (\n args: PiAiHarnessResultArgs<TAgent, TInput, TResult, TTools>,\n) => MaybePromise<TOutput>;\n\ntype InferredToolSurfaces<TInput> = {\n runtimeTools?: InferredPiAiToolset<TInput>;\n nativeToolsets?: Array<PiAgentToolLike<TInput>[]>;\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 TResult = unknown,\n TTools extends PiAiToolset<TInput> = PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: PiAiHarnessWithToolsOptionsWithOutput<\n TAgent,\n TInput,\n TResult,\n TTools,\n TOutput\n >,\n): Harness<TInput, TOutput>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TResult = unknown,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: PiAiHarnessInferredToolsOptionsWithOutput<\n TAgent,\n TInput,\n TResult,\n TOutput\n >,\n): Harness<TInput, TOutput>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TResult = unknown,\n TTools extends PiAiToolset<TInput> = PiAiToolset<TInput>,\n>(\n options: PiAiHarnessWithToolsRunOptionsWithoutOutput<\n TAgent,\n TInput,\n TResult,\n TTools\n >,\n): Harness<TInput, PiAiResultOutput<Awaited<TResult>>>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TTools extends PiAiToolset<TInput> = PiAiToolset<TInput>,\n>(\n options: PiAiHarnessWithToolsAgentOptionsWithoutOutput<\n TAgent,\n TInput,\n TTools\n >,\n): Harness<TInput, PiAiResultOutput<PiAiAgentResult<TAgent, TInput, TTools>>>;\nexport function piAiHarness<TAgent, TInput = string, TResult = unknown>(\n options: PiAiHarnessInferredToolsRunOptionsWithoutOutput<\n TAgent,\n TInput,\n TResult\n >,\n): Harness<TInput, PiAiResultOutput<Awaited<TResult>>>;\nexport function piAiHarness<TAgent, TInput = string>(\n options: PiAiHarnessInferredToolsAgentOptionsWithoutOutput<TAgent, TInput>,\n): Harness<\n TInput,\n PiAiResultOutput<PiAiAgentResult<TAgent, TInput, InferredPiAiToolset<TInput>>>\n>;\nexport function piAiHarness<\n TAgent,\n TInput = string,\n TResult = unknown,\n TTools extends PiAiToolset<TInput> = PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined = JsonValue | undefined,\n>(\n options: PiAiHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>,\n): Harness<TInput, TOutput> {\n validateOptions(options);\n\n const harnessName = options.name ?? \"pi-ai\";\n const harness: Harness<TInput, TOutput> = {\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 events: TranscriptEvent[] = [\n {\n type: \"message\",\n role: \"user\",\n content: normalizeContent(input),\n },\n ];\n const inferredTools = resolveInferredToolSurfaces<TInput>(agent);\n\n if (hasExplicitToolset(options)) {\n return await executePiHarnessRun(\n options,\n agent,\n input,\n context,\n events,\n options.tools,\n inferredTools.nativeToolsets,\n );\n }\n\n return await executePiHarnessRun(\n options,\n agent,\n input,\n context,\n events,\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>(\n input: TInput,\n context: HarnessContext,\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 TResult,\n TTools extends PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined,\n>(options: PiAiHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>) {\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 TResult,\n TTools extends PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessRunOptions<TAgent, TInput, TResult, TTools, TOutput>,\n agent: TAgent,\n input: TInput,\n context: HarnessContext,\n events: TranscriptEvent[],\n runtimeTools: TTools | undefined,\n nativeToolsets?: Array<PiAgentToolLike<TInput>[]>,\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 events,\n });\n\n try {\n const result = await withInstrumentedAgentTools(\n agent,\n nativeToolsets,\n {\n input,\n context,\n events,\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<TAgent, TInput, TResult, TTools>;\n\n const output = options.output\n ? await options.output(resultArgs)\n : (resolveOutput(normalizeResult) as TOutput | undefined);\n const usage = resolveUsage(normalizeResult, countToolCallEvents(events));\n const session = resolveSession(normalizeResult, events, 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, countToolCallEvents(events));\n const session = resolveSession(undefined, events, 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 TResult,\n TTools extends PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>,\n args: PiAiCreateAgentArgs<TInput>,\n) {\n return resolveAgentSource(options.agent, args);\n}\n\nasync function resolveAgentSource<TAgent, TInput>(\n agent: AgentSource<TAgent, TInput>,\n args: PiAiCreateAgentArgs<TInput>,\n): Promise<TAgent> {\n if (isAgentFactory(agent)) {\n return agent(args);\n }\n\n return agent;\n}\n\nfunction isAgentFactory<TAgent, TInput>(\n agent: AgentSource<TAgent, TInput>,\n): agent is (args: PiAiCreateAgentArgs<TInput>) => MaybePromise<TAgent> {\n return typeof agent === \"function\" && !hasPiAiRunMethod(agent);\n}\n\nfunction hasOutputSelector<\n TAgent,\n TInput,\n TResult,\n TTools extends PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined,\n>(options: PiAiHarnessRunOptions<TAgent, TInput, TResult, TTools, TOutput>) {\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 = [rootSpan, ...(modelSpan ? [modelSpan] : [])];\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>(\n agent: unknown,\n): InferredToolSurfaces<TInput> {\n let runtimeTools: InferredPiAiToolset<TInput> | undefined;\n const nativeToolsets: Array<PiAgentToolLike<TInput>[]> = [];\n const seenToolsets = new Set<PiAgentToolLike<TInput>[]>();\n\n for (const candidate of getAgentToolCandidates(agent)) {\n const nextRuntimeTools = getRuntimeToolset<TInput>(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>(\n value: object,\n): InferredPiAiToolset<TInput> | undefined {\n const candidate =\n getObjectProperty(value, \"tools\") ?? getObjectProperty(value, \"toolset\");\n\n return isPiAiToolset(candidate)\n ? (candidate as InferredPiAiToolset<TInput>)\n : undefined;\n}\n\nfunction getNativeToolArray<TInput>(\n value: object,\n): PiAgentToolLike<TInput>[] | undefined {\n const candidate = getObjectProperty(value, \"tools\");\n if (isAgentToolArray(candidate)) {\n return candidate as PiAgentToolLike<TInput>[];\n }\n\n return undefined;\n}\n\nasync function runAgent<\n TAgent,\n TInput,\n TResult,\n TTools extends PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessRunOptions<TAgent, TInput, TResult, TTools, TOutput>,\n args: PiAiHarnessRunArgs<TAgent, TInput, TTools>,\n): Promise<TResult | HarnessRun<TOutput>> {\n if (options.run) {\n return options.run(args);\n }\n\n if (hasPiAiRunMethod<TInput, TResult, TOutput, TTools>(args.agent)) {\n return args.agent.run(args.input, args.runtime);\n }\n\n throw new Error(\n \"piAiHarness requires a run() function unless the provided agent exposes run(input, runtime).\",\n );\n}\n\nfunction hasExplicitToolset<\n TAgent,\n TInput,\n TResult,\n TTools extends PiAiToolset<TInput>,\n TOutput extends JsonValue | undefined,\n>(\n options: PiAiHarnessOptions<TAgent, TInput, TResult, TTools, TOutput>,\n): options is PiAiHarnessWithToolsOptions<\n TAgent,\n TInput,\n TResult,\n TTools,\n TOutput\n> {\n return options.tools !== undefined;\n}\n\nfunction hasPiAiRunMethod<\n TInput,\n TResult,\n TOutput extends JsonValue | undefined,\n TTools extends PiAiToolset<TInput>,\n>(\n agent: unknown,\n): agent is PiAiRunnableAgent<TInput, 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<TResult, TInput>(\n agent: unknown,\n toolsets: Array<PiAgentToolLike<TInput>[]> | undefined,\n args: {\n input: TInput;\n context: HarnessContext;\n events: TranscriptEvent[];\n toolReplay: PiAiToolReplayPolicies<TInput> | 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>,\n PiAgentToolLike<TInput>[\"execute\"]\n >();\n const originalResets = new Map<ResettableAgent, ResettableAgent[\"reset\"]>();\n\n const patchTool = (tool: PiAgentToolLike<TInput>) => {\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> = async (\n toolCallId: string,\n rawArgs: Record<string, JsonValue>,\n ) => {\n const startedAt = new Date();\n const toolContext = {\n input: args.input,\n signal: args.context.signal,\n setArtifact: args.context.setArtifact,\n } satisfies PiAiToolContext<TInput>;\n const leaveNativeTool = enterNativeToolExecution(\n args.executionState,\n tool.name,\n );\n const call: TranscriptToolCallEvent = {\n type: \"tool_call\",\n id: toolCallId,\n name: tool.name,\n arguments: rawArgs,\n startedAt: startedAt.toISOString(),\n metadata: normalizeReplayMetadata(undefined),\n } satisfies TranscriptToolCallEvent;\n args.events.push(call);\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 call.finishedAt = finishedAt.toISOString();\n call.durationMs = finishedAt.getTime() - startedAt.getTime();\n call.metadata = normalizeReplayMetadata(execution.replay);\n args.events.push({\n type: \"tool_result\",\n toolCallId,\n name: tool.name,\n content: execution.normalizedResult,\n startedAt: call.startedAt,\n finishedAt: call.finishedAt,\n durationMs: call.durationMs,\n });\n return execution.result;\n } catch (error) {\n const finishedAt = new Date();\n call.finishedAt = finishedAt.toISOString();\n call.durationMs = finishedAt.getTime() - startedAt.getTime();\n call.metadata = normalizeReplayMetadata(\n getReplayMetadataFromError(error),\n );\n args.events.push({\n type: \"tool_result\",\n toolCallId,\n name: tool.name,\n error: serializeToolCallError(error),\n startedAt: call.startedAt,\n finishedAt: call.finishedAt,\n durationMs: call.durationMs,\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 = (nextToolsets: Array<PiAgentToolLike<TInput>[]>) => {\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(resolveInferredNativeToolsets<TInput>(agent));\n });\n }\n\n patchToolsets(resolveInferredNativeToolsets<TInput>(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<TInput>(\n agent: unknown,\n): Array<PiAgentToolLike<TInput>[]> {\n const toolsets: Array<PiAgentToolLike<TInput>[]> = [];\n const seenToolsets = new Set<PiAgentToolLike<TInput>[]>();\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(error: unknown): NormalizedError {\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\n/** Creates a runtime-local id used on both assistant tool calls and tool results. */\nfunction createRuntimeToolCallId(toolName: string, index: number) {\n return `runtime:${toolName}:${index + 1}`;\n}\n\nfunction getNativeToolExecuteOrigin<TInput>(\n execute: PiAgentToolLike<TInput>[\"execute\"],\n) {\n const nativeExecute = execute as NativeToolExecute<TInput>;\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<TInput>({\n toolName,\n toolCallId,\n execute,\n replay,\n args,\n context,\n}: {\n toolName: string;\n toolCallId: string;\n execute: PiAgentToolLike<TInput>[\"execute\"];\n replay: PiAiToolReplayPolicy<TInput> | undefined;\n args: Record<string, JsonValue>;\n context: PiAiToolContext<TInput>;\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<TInput, TTools extends PiAiToolset<TInput>>({\n input,\n context,\n tools,\n toolReplay,\n executionState,\n events,\n}: {\n input: TInput;\n context: HarnessContext;\n tools: TTools | undefined;\n toolReplay: PiAiToolReplayPolicies<TInput> | undefined;\n executionState: PiToolExecutionState;\n events: TranscriptEvent[];\n}): PiAiRuntime<TTools, TInput> {\n const eventSink: PiAiEventSink = {\n message: (event) => {\n events.push(event);\n },\n system: (content, metadata) => {\n events.push({\n type: \"message\",\n role: \"system\",\n content,\n metadata,\n });\n },\n user: (content, metadata) => {\n events.push({\n type: \"message\",\n role: \"user\",\n content,\n metadata,\n });\n },\n assistant: (content, metadata) => {\n events.push({\n type: \"message\",\n role: \"assistant\",\n content,\n metadata,\n });\n },\n tool: (toolCallId, content, options) => {\n events.push({\n type: \"tool_result\",\n toolCallId,\n ...(options?.name ? { name: options.name } : {}),\n content,\n ...(options?.error ? { error: options.error } : {}),\n ...(options?.metadata ? { metadata: options.metadata } : {}),\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 signal: context.signal,\n setArtifact: context.setArtifact,\n } satisfies PiAiToolContext<TInput>;\n const toolCallId = createRuntimeToolCallId(\n toolName,\n countToolCallEvents(events),\n );\n const call: TranscriptToolCallEvent = {\n type: \"tool_call\",\n id: toolCallId,\n name: toolName,\n arguments: args,\n startedAt: startedAt.toISOString(),\n } satisfies TranscriptToolCallEvent;\n\n try {\n if (!isNativeImplementationCall) {\n events.push(call);\n }\n\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 call.finishedAt = finishedAt.toISOString();\n call.durationMs = finishedAt.getTime() - startedAt.getTime();\n call.metadata = normalizeReplayMetadata(execution.replay);\n events.push({\n type: \"tool_result\",\n toolCallId,\n name: toolName,\n content: execution.result,\n startedAt: call.startedAt,\n finishedAt: call.finishedAt,\n durationMs: call.durationMs,\n });\n return execution.result;\n } catch (error) {\n const finishedAt = new Date();\n if (isNativeImplementationCall) {\n throw error;\n }\n\n call.finishedAt = finishedAt.toISOString();\n call.durationMs = finishedAt.getTime() - startedAt.getTime();\n call.metadata = normalizeReplayMetadata(\n getReplayMetadataFromError(error),\n );\n events.push({\n type: \"tool_result\",\n toolCallId,\n name: toolName,\n error: serializeToolCallError(error),\n startedAt: call.startedAt,\n finishedAt: call.finishedAt,\n durationMs: call.durationMs,\n });\n throw error;\n }\n },\n ]),\n ) as unknown as PiAiRuntime<TTools, TInput>[\"tools\"];\n\n return {\n tools: runtimeTools,\n events: eventSink,\n signal: context.signal,\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 countToolCallEvents(events: readonly TranscriptEvent[]) {\n return events.filter((event) => event.type === \"tool_call\").length;\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 costUsd: resolveCostUsd(usageRecord),\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 \"costUsd\",\n \"toolCalls\",\n \"retries\",\n]);\n\nfunction resolveCostUsd(usage: Record<string, unknown>) {\n const direct = numberField(usage.costUsd);\n if (direct !== undefined) {\n return direct;\n }\n\n const cost = usage.cost;\n return cost && typeof cost === \"object\" && !Array.isArray(cost)\n ? numberField((cost as Record<string, unknown>).total)\n : undefined;\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 events: TranscriptEvent[],\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 const sessionEvents = [...events];\n if (\n output !== undefined &&\n !sessionEvents.some(\n (event) =>\n event.type === \"message\" &&\n event.role === \"assistant\" &&\n event.content !== undefined,\n )\n ) {\n sessionEvents.push({\n type: \"message\",\n role: \"assistant\",\n content: output,\n });\n }\n\n return {\n events: sessionEvents,\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>({\n toolName,\n tool,\n replay,\n args,\n context,\n}: {\n toolName: string;\n tool: PiAiToolDefinition<TArgs, TResult, TInput>;\n replay: PiAiToolReplayPolicy<TInput> | undefined;\n args: TArgs;\n context: PiAiToolContext<TInput>;\n}) {\n return executeWithReplay<\n Record<string, JsonValue>,\n JsonValue,\n PiAiToolContext<TInput>\n >({\n toolName,\n args,\n context,\n execute: (toolArgs, toolContext) =>\n tool.execute(toolArgs as TArgs, toolContext),\n replay,\n });\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vitest-evals/harness-pi-ai",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.17.0",
|
|
4
4
|
"description": "pi-ai harness adapter with tool replay for vitest-evals.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@mariozechner/pi-agent-core": "^0.67.68",
|
|
41
41
|
"@mariozechner/pi-ai": "^0.67.68",
|
|
42
|
-
"vitest-evals": "0.
|
|
42
|
+
"vitest-evals": "0.17.0"
|
|
43
43
|
},
|
|
44
44
|
"scripts": {
|
|
45
45
|
"build": "tsup --config ./tsup.config.ts"
|