agentv 4.25.1 → 4.25.2-next.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{agentv-provider-TXM4UEUT-SUZSAXWZ.js → agentv-provider-MUIGGIP3-QCGXJ3CT.js} +2 -2
- package/dist/{artifact-writer-HGCLGCCA.js → artifact-writer-RQXZ2LRL.js} +5 -7
- package/dist/chunk-55QZVA5X.js +616 -0
- package/dist/chunk-55QZVA5X.js.map +1 -0
- package/dist/{chunk-VBMGJOS6.js → chunk-67WQGAPE.js} +3 -3
- package/dist/{chunk-BTHPLK43.js → chunk-F3VB3LBW.js} +18332 -14538
- package/dist/chunk-F3VB3LBW.js.map +1 -0
- package/dist/{chunk-BAUNAXHT.js → chunk-HSHTTN6C.js} +6 -6
- package/dist/{chunk-5Z3QIGCT.js → chunk-PKHXZYEN.js} +11 -15
- package/dist/chunk-PKHXZYEN.js.map +1 -0
- package/dist/{chunk-SR4I5KET.js → chunk-R3CXYNTN.js} +8 -8
- package/dist/{chunk-AWSSD3XU.js → chunk-TBJI6GIE.js} +9 -9
- package/dist/chunk-TBJI6GIE.js.map +1 -0
- package/dist/{chunk-ZQ5YI3RR.js → chunk-YNASYH73.js} +6 -6
- package/dist/cli.js +6 -8
- package/dist/cli.js.map +1 -1
- package/dist/{dist-ACKVXAB3.js → dist-ZYHQ37J6.js} +4 -6
- package/dist/{esm-UYZ3HJBU.js → esm-NNMQYIKT.js} +4 -4
- package/dist/{esm-QNEMCJPL.js → esm-TTEMJEVV.js} +3 -3
- package/dist/{esm-ZADQ4XQH-5LX2IKZV.js → esm-ZADQ4XQH-QUFGGZL4.js} +8 -8
- package/dist/index.js +6 -8
- package/dist/{interactive-A42HOUBD.js → interactive-5YGZAGG3.js} +6 -8
- package/dist/{interactive-A42HOUBD.js.map → interactive-5YGZAGG3.js.map} +1 -1
- package/dist/{src-PXDA7QIS.js → src-76ISS3LH.js} +9 -9
- package/dist/templates/.agentv/targets.yaml +31 -0
- package/dist/{ts-eval-loader-4CFPGHGT-CVAN5S2D.js → ts-eval-loader-5JMF2N65-V53D7C3V.js} +3 -5
- package/package.json +2 -2
- package/dist/chunk-5Z3QIGCT.js.map +0 -1
- package/dist/chunk-AWSSD3XU.js.map +0 -1
- package/dist/chunk-BTHPLK43.js.map +0 -1
- package/dist/chunk-HQDCIXVH.js +0 -51
- package/dist/chunk-HQDCIXVH.js.map +0 -1
- package/dist/chunk-JFD3TI3N.js +0 -456
- package/dist/chunk-JFD3TI3N.js.map +0 -1
- package/dist/chunk-ZKO2LGRR.js +0 -25365
- package/dist/chunk-ZKO2LGRR.js.map +0 -1
- package/dist/token-OWTDW6LT.js +0 -66
- package/dist/token-OWTDW6LT.js.map +0 -1
- package/dist/token-util-S5R2C23V.js +0 -8
- package/dist/ts-eval-loader-4CFPGHGT-CVAN5S2D.js.map +0 -1
- /package/dist/{agentv-provider-TXM4UEUT-SUZSAXWZ.js.map → agentv-provider-MUIGGIP3-QCGXJ3CT.js.map} +0 -0
- /package/dist/{artifact-writer-HGCLGCCA.js.map → artifact-writer-RQXZ2LRL.js.map} +0 -0
- /package/dist/{chunk-VBMGJOS6.js.map → chunk-67WQGAPE.js.map} +0 -0
- /package/dist/{chunk-BAUNAXHT.js.map → chunk-HSHTTN6C.js.map} +0 -0
- /package/dist/{chunk-SR4I5KET.js.map → chunk-R3CXYNTN.js.map} +0 -0
- /package/dist/{chunk-ZQ5YI3RR.js.map → chunk-YNASYH73.js.map} +0 -0
- /package/dist/{dist-ACKVXAB3.js.map → dist-ZYHQ37J6.js.map} +0 -0
- /package/dist/{esm-UYZ3HJBU.js.map → esm-NNMQYIKT.js.map} +0 -0
- /package/dist/{esm-QNEMCJPL.js.map → esm-TTEMJEVV.js.map} +0 -0
- /package/dist/{esm-ZADQ4XQH-5LX2IKZV.js.map → esm-ZADQ4XQH-QUFGGZL4.js.map} +0 -0
- /package/dist/{src-PXDA7QIS.js.map → src-76ISS3LH.js.map} +0 -0
- /package/dist/{token-util-S5R2C23V.js.map → ts-eval-loader-5JMF2N65-V53D7C3V.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../packages/core/src/evaluation/providers/llm-providers.ts","../../../packages/core/src/evaluation/providers/agentv-provider.ts"],"sourcesContent":["/**\n * LLM provider classes for the five direct-API providers AgentV supports:\n * OpenAI, Azure OpenAI, OpenRouter, Anthropic, Google (Gemini).\n *\n * All five route through @mariozechner/pi-ai. Each provider class:\n * 1. Resolves a pi-ai Model in its constructor (registry lookup + field\n * merges; one-time work).\n * 2. Implements invoke() by delegating to invokePiAi(), which runs the\n * stateless single-shot path or the multi-step agent loop depending on\n * whether the request carries `tools`.\n *\n * To add a new provider:\n * 1. Add a config interface in targets.ts.\n * 2. Add a class here that resolves a PiModel + maps config to invokePiAi\n * options. Pi-ai's KnownProvider list (see types.d.ts) is the source of\n * truth for `providerName`; pi-ai's KnownApi list is the source of\n * truth for `apiId`.\n * 3. Register it in providers/index.ts.\n */\n\nimport {\n type Api as PiApi,\n type AssistantMessage as PiAssistantMessage,\n type KnownProvider as PiKnownProvider,\n type Message as PiMessage,\n type Model as PiModelBase,\n type Tool as PiTool,\n type ToolCall as PiToolCall,\n complete as piComplete,\n getModel as piGetModel,\n registerBuiltInApiProviders,\n} from '@mariozechner/pi-ai';\n\n// Pi-ai's `Model<TApi>` is generic over the api id. Every site that passes a\n// model around treats it as `Model<Api>` (the runtime-string variant), so\n// alias once here.\ntype PiModel = PiModelBase<PiApi>;\n\n// pi-ai routes complete()/stream() by Model.api; the built-in providers must be\n// registered once at module load. Cheap; idempotent across repeated imports.\nregisterBuiltInApiProviders();\n\nimport type { JsonObject } from '../types.js';\nimport type {\n AnthropicResolvedConfig,\n AzureResolvedConfig,\n GeminiResolvedConfig,\n OpenAIResolvedConfig,\n OpenRouterResolvedConfig,\n RetryConfig,\n} from './targets.js';\nimport type { ChatPrompt, Provider, ProviderRequest, ProviderResponse } from './types.js';\n\nconst DEFAULT_SYSTEM_PROMPT =\n 'You are a careful assistant. Follow all provided instructions and do not fabricate results.';\n\nexport interface ProviderDefaults {\n readonly temperature?: number;\n readonly maxOutputTokens?: number;\n readonly thinkingBudget?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Provider classes — model is resolved in the constructor, invoke() is thin.\n// ---------------------------------------------------------------------------\n\nexport class OpenAIProvider implements Provider {\n readonly id: string;\n readonly kind = 'openai' as const;\n readonly targetName: string;\n\n private readonly piModel: PiModel;\n private readonly defaults: ProviderDefaults;\n private readonly retryConfig?: RetryConfig;\n private readonly apiKey: string;\n\n constructor(targetName: string, config: OpenAIResolvedConfig) {\n this.id = `openai:${targetName}`;\n this.targetName = targetName;\n this.apiKey = config.apiKey;\n this.defaults = {\n temperature: config.temperature,\n maxOutputTokens: config.maxOutputTokens,\n };\n this.retryConfig = config.retry;\n this.piModel = resolvePiModel({\n providerName: 'openai',\n apiId: config.apiFormat === 'responses' ? 'openai-responses' : 'openai-completions',\n modelId: config.model,\n baseUrl: config.baseURL,\n });\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n return invokePiAi({\n model: this.piModel,\n apiKey: this.apiKey,\n request,\n defaults: this.defaults,\n retryConfig: this.retryConfig,\n });\n }\n}\n\nexport class OpenRouterProvider implements Provider {\n readonly id: string;\n readonly kind = 'openrouter' as const;\n readonly targetName: string;\n\n private readonly piModel: PiModel;\n private readonly defaults: ProviderDefaults;\n private readonly retryConfig?: RetryConfig;\n private readonly apiKey: string;\n\n constructor(targetName: string, config: OpenRouterResolvedConfig) {\n this.id = `openrouter:${targetName}`;\n this.targetName = targetName;\n this.apiKey = config.apiKey;\n this.defaults = {\n temperature: config.temperature,\n maxOutputTokens: config.maxOutputTokens,\n };\n this.retryConfig = config.retry;\n // OpenRouter exposes an OpenAI-compatible endpoint; pi-ai routes it through\n // openai-completions with a fixed baseUrl.\n this.piModel = resolvePiModel({\n providerName: 'openrouter',\n apiId: 'openai-completions',\n modelId: config.model,\n baseUrl: 'https://openrouter.ai/api/v1',\n });\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n return invokePiAi({\n model: this.piModel,\n apiKey: this.apiKey,\n request,\n defaults: this.defaults,\n retryConfig: this.retryConfig,\n });\n }\n}\n\nexport class AnthropicProvider implements Provider {\n readonly id: string;\n readonly kind = 'anthropic' as const;\n readonly targetName: string;\n\n private readonly piModel: PiModel;\n private readonly defaults: ProviderDefaults;\n private readonly retryConfig?: RetryConfig;\n private readonly apiKey: string;\n private readonly thinkingBudget?: number;\n\n constructor(targetName: string, config: AnthropicResolvedConfig) {\n this.id = `anthropic:${targetName}`;\n this.targetName = targetName;\n this.apiKey = config.apiKey;\n this.thinkingBudget = config.thinkingBudget;\n this.defaults = {\n temperature: config.temperature,\n maxOutputTokens: config.maxOutputTokens,\n thinkingBudget: config.thinkingBudget,\n };\n this.retryConfig = config.retry;\n this.piModel = resolvePiModel({\n providerName: 'anthropic',\n apiId: 'anthropic-messages',\n modelId: config.model,\n });\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n // Pi-ai's Anthropic provider takes the same numeric thinking budget as the\n // legacy Vercel path — no lossy bucket mapping needed for older models.\n // Newer models (Opus 4.6, Sonnet 4.6) ignore thinkingBudgetTokens in favor\n // of adaptive thinking; we still pass it for forward-compat.\n const providerOptions =\n this.thinkingBudget !== undefined\n ? { thinkingEnabled: true, thinkingBudgetTokens: this.thinkingBudget }\n : undefined;\n\n return invokePiAi({\n model: this.piModel,\n apiKey: this.apiKey,\n request,\n defaults: this.defaults,\n retryConfig: this.retryConfig,\n ...(providerOptions ? { providerOptions } : {}),\n });\n }\n}\n\nexport class GeminiProvider implements Provider {\n readonly id: string;\n readonly kind = 'gemini' as const;\n readonly targetName: string;\n\n private readonly piModel: PiModel;\n private readonly defaults: ProviderDefaults;\n private readonly retryConfig?: RetryConfig;\n private readonly apiKey: string;\n\n constructor(targetName: string, config: GeminiResolvedConfig) {\n this.id = `gemini:${targetName}`;\n this.targetName = targetName;\n this.apiKey = config.apiKey;\n this.defaults = {\n temperature: config.temperature,\n maxOutputTokens: config.maxOutputTokens,\n };\n this.retryConfig = config.retry;\n this.piModel = resolvePiModel({\n providerName: 'google',\n apiId: 'google-generative-ai',\n modelId: config.model,\n });\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n return invokePiAi({\n model: this.piModel,\n apiKey: this.apiKey,\n request,\n defaults: this.defaults,\n retryConfig: this.retryConfig,\n });\n }\n}\n\nexport class AzureProvider implements Provider {\n readonly id: string;\n readonly kind = 'azure' as const;\n readonly targetName: string;\n\n private readonly piModel: PiModel;\n private readonly defaults: ProviderDefaults;\n private readonly retryConfig?: RetryConfig;\n private readonly apiKey: string;\n private readonly providerOptions: Record<string, unknown>;\n\n constructor(targetName: string, config: AzureResolvedConfig) {\n this.id = `azure:${targetName}`;\n this.targetName = targetName;\n this.apiKey = config.apiKey;\n this.defaults = {\n temperature: config.temperature,\n maxOutputTokens: config.maxOutputTokens,\n };\n this.retryConfig = config.retry;\n\n // Pi-ai's azure-openai-responses provider handles the Azure-specific URL\n // shape and api-version query param. We pass either a full base URL or a\n // resource name + apiVersion via providerOptions; pi-ai does the rest.\n //\n // apiFormat is intentionally not branched here: pi-ai uses Azure's\n // Responses API for both chat-style and responses-style calls. Users who\n // hit an Azure deployment that only exposes /chat/completions can route\n // through `provider: openai` with a deployment-scoped baseURL instead.\n const trimmed = config.resourceName.trim();\n const isFullUrl = /^https?:\\/\\//i.test(trimmed);\n const baseUrl = isFullUrl ? buildAzureBaseUrl(trimmed) : undefined;\n\n this.providerOptions = {\n ...(baseUrl ? { azureBaseUrl: baseUrl } : { azureResourceName: trimmed }),\n ...(config.version ? { azureApiVersion: config.version } : {}),\n };\n\n this.piModel = resolvePiModel({\n providerName: 'azure-openai-responses',\n apiId: 'azure-openai-responses',\n // The \"model id\" for Azure is the deployment name.\n modelId: config.deploymentName,\n ...(baseUrl ? { baseUrl } : {}),\n });\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n return invokePiAi({\n model: this.piModel,\n apiKey: this.apiKey,\n request,\n defaults: this.defaults,\n retryConfig: this.retryConfig,\n providerOptions: this.providerOptions,\n });\n }\n}\n\n/**\n * Normalize a user-supplied Azure URL to pi-ai's expected base.\n *\n * Pi-ai's azure-openai-responses appends `/responses?api-version=...` to the\n * baseUrl, so the URL we hand it should end at the `/openai/v1` segment.\n * Accept either:\n * - https://<resource>.openai.azure.com → add `/openai/v1`\n * - https://<resource>.openai.azure.com/openai → replace `/openai` with `/openai/v1`\n * - https://<resource>.openai.azure.com/openai/v1 → keep as-is\n */\nfunction buildAzureBaseUrl(input: string): string {\n const trimmed = input.replace(/\\/+$/, '');\n if (trimmed.endsWith('/openai/v1')) return trimmed;\n if (trimmed.endsWith('/openai')) return `${trimmed}/v1`;\n return `${trimmed}/openai/v1`;\n}\n\n// ---------------------------------------------------------------------------\n// Shared adapter — invokePiAi runs the model call (single-shot or agent loop)\n// ---------------------------------------------------------------------------\n\nexport interface InvokePiAiOptions {\n /** Pre-resolved pi-ai model (built once in the provider constructor). */\n readonly model: PiModel;\n /**\n * Per-call credential — pi-ai treats apiKey as a StreamOptions field. When\n * omitted, pi-ai falls back to the provider-specific env var (OPENAI_API_KEY,\n * ANTHROPIC_API_KEY, ...). The agentv provider relies on that fallback.\n */\n readonly apiKey?: string;\n readonly request: ProviderRequest;\n readonly defaults: ProviderDefaults;\n readonly retryConfig?: RetryConfig;\n /**\n * Provider-specific options merged into pi-ai's call options. Pi-ai's\n * ProviderStreamOptions is `StreamOptions & Record<string, unknown>`, so\n * extra keys flow through to the underlying provider impl. Example:\n * Anthropic accepts `{ thinkingEnabled: true, thinkingBudgetTokens: 8000 }`.\n */\n readonly providerOptions?: Record<string, unknown>;\n}\n\nexport async function invokePiAi(options: InvokePiAiOptions): Promise<ProviderResponse> {\n const { model, apiKey, request, defaults, retryConfig, providerOptions } = options;\n const tools = request.tools && request.tools.length > 0 ? request.tools : undefined;\n const maxSteps = tools ? Math.max(1, request.maxSteps ?? 1) : 1;\n\n const { systemPrompt, messages } = chatPromptToPiContext(buildChatPrompt(request));\n if (request.images && request.images.length > 0) {\n attachImagesToLastUserMessage(messages, request.images);\n }\n // Cast safety: pi-ai types `Tool.parameters` as a TypeBox `TSchema` for\n // TS-level inference, but its OpenAI-completions converter forwards\n // `parameters` to the wire format as-is — see pi-ai/dist/providers/openai-\n // completions.js `convertTools` which annotates `parameters: tool.parameters\n // // TypeBox already generates JSON Schema`. Plain JSON Schema works at\n // runtime; the cast bridges the TS-only Symbol-branding gap.\n const piTools: PiTool[] | undefined = tools\n ? (tools.map((t) => ({\n name: t.name,\n description: t.description,\n parameters: t.parameters,\n })) as unknown as PiTool[])\n : undefined;\n const ctx = { systemPrompt, messages, ...(piTools ? { tools: piTools } : {}) };\n const { temperature, maxOutputTokens } = resolveModelSettings(request, defaults);\n const callOptions = {\n ...(apiKey !== undefined ? { apiKey } : {}),\n temperature,\n ...(maxOutputTokens !== undefined ? { maxTokens: maxOutputTokens } : {}),\n signal: request.signal,\n ...(providerOptions ?? {}),\n };\n\n const startTime = new Date().toISOString();\n const startMs = Date.now();\n\n const aggregateUsage: AggregatedUsage = { input: 0, output: 0, cacheRead: 0, cost: 0 };\n let stepCount = 0;\n let toolCallCount = 0;\n let result: PiAssistantMessage = await withRetry(\n () => piComplete(model, ctx, callOptions),\n retryConfig,\n request.signal,\n );\n ctx.messages.push(result);\n stepCount = 1;\n accumulateUsage(aggregateUsage, result.usage);\n\n // Agent loop: run tool calls and re-invoke until the model stops requesting\n // tools or we hit maxSteps. Single-shot calls (no tools) skip this entirely.\n while (tools) {\n const calls = result.content.filter(\n (b: PiAssistantMessage['content'][number]): b is PiToolCall => b.type === 'toolCall',\n );\n if (calls.length === 0) break;\n if (stepCount >= maxSteps) break;\n\n toolCallCount += calls.length;\n\n for (const call of calls) {\n const tool = tools.find((t) => t.name === call.name);\n let output: unknown;\n let isError = false;\n try {\n if (!tool) {\n throw new Error(`pi-ai adapter: model called unknown tool '${call.name}'`);\n }\n output = await tool.execute(call.arguments);\n } catch (err) {\n output = err instanceof Error ? err.message : String(err);\n isError = true;\n }\n ctx.messages.push({\n role: 'toolResult',\n toolCallId: call.id,\n toolName: call.name,\n content: [\n { type: 'text', text: typeof output === 'string' ? output : JSON.stringify(output) },\n ],\n isError,\n timestamp: Date.now(),\n });\n }\n\n result = await withRetry(\n () => piComplete(model, ctx, callOptions),\n retryConfig,\n request.signal,\n );\n ctx.messages.push(result);\n stepCount += 1;\n accumulateUsage(aggregateUsage, result.usage);\n }\n\n const endTime = new Date().toISOString();\n const durationMs = Date.now() - startMs;\n\n return mapPiResponse(result, {\n durationMs,\n startTime,\n endTime,\n aggregateUsage,\n steps: tools ? { count: stepCount, toolCallCount } : undefined,\n });\n}\n\ninterface AggregatedUsage {\n input: number;\n output: number;\n cacheRead: number;\n cost: number;\n}\n\nfunction accumulateUsage(agg: AggregatedUsage, u: PiAssistantMessage['usage']): void {\n agg.input += u.input;\n agg.output += u.output;\n agg.cacheRead += u.cacheRead;\n agg.cost += u.cost.total;\n}\n\nexport function resolvePiModel(args: {\n providerName: string;\n apiId: string;\n modelId: string;\n baseUrl?: string;\n}): PiModel {\n const { providerName, apiId, modelId, baseUrl } = args;\n\n // Cast safety: pi-ai's `getModel<TProvider, TModelId>` is generic over a\n // generated registry, but its implementation in pi-ai/dist/models.js is a\n // plain Map lookup — `modelRegistry.get(provider)?.get(modelId)` — that\n // accepts any string and returns `undefined` on miss. The PiKnownProvider /\n // `as never` casts satisfy the type-level constraint without changing\n // runtime behavior; the try/catch is defensive in case a future pi-ai\n // version starts throwing. We synthesize a minimal descriptor below for\n // unknown pairs (custom gateways, Azure deployments).\n let model: PiModel | undefined;\n try {\n model = piGetModel(providerName as PiKnownProvider, modelId as never) as PiModel | undefined;\n } catch {\n model = undefined;\n }\n\n if (!model) {\n const fallbackBaseUrl = baseUrl ?? defaultBaseUrlFor(providerName);\n if (!fallbackBaseUrl) {\n throw new Error(\n `pi-ai adapter cannot resolve a baseUrl for provider '${providerName}' / model '${modelId}'. Either set the target's baseUrl/endpoint or use a model id pi-ai recognizes.`,\n );\n }\n // Universal fallback matching pi-coding-agent's ModelRegistry. These\n // numbers are mostly metadata: on the complete() / streamOpenAICompletions\n // path we use, pi-ai only sets max_tokens when the caller passes\n // StreamOptions.maxTokens (we omit it unless request.maxOutputTokens is\n // set). pi-ai's *simple* options builder (buildBaseOptions in\n // simple-options.js) does fall back to Math.min(model.maxTokens, 32000)\n // when maxTokens is omitted — we don't currently call that path, but if\n // a future caller switches to completeSimple, the 16384 here keeps the\n // fallback ceiling sane.\n model = {\n id: modelId,\n name: modelId,\n api: apiId,\n provider: providerName,\n baseUrl: fallbackBaseUrl,\n reasoning: false,\n input: ['text'],\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n contextWindow: 128_000,\n maxTokens: 16_384,\n };\n }\n\n if (model.api !== apiId) {\n model = { ...model, api: apiId };\n }\n if (baseUrl) {\n model = { ...model, baseUrl };\n }\n\n return model;\n}\n\n/**\n * Default baseUrl when `getModel` misses and the caller didn't supply one.\n * Returning `undefined` makes resolvePiModel throw — preferable to passing an\n * empty string into pi-ai's OpenAI client, which fails opaquely.\n */\nfunction defaultBaseUrlFor(providerName: string): string | undefined {\n if (providerName === 'openai') return 'https://api.openai.com/v1';\n if (providerName === 'openrouter') return 'https://openrouter.ai/api/v1';\n return undefined;\n}\n\ninterface PiContext {\n readonly systemPrompt: string | undefined;\n readonly messages: PiMessage[];\n}\n\nfunction chatPromptToPiContext(chatPrompt: ChatPrompt): PiContext {\n const systemSegments: string[] = [];\n const messages: PiMessage[] = [];\n const now = Date.now();\n\n for (const message of chatPrompt) {\n if (message.role === 'system') {\n systemSegments.push(message.content);\n continue;\n }\n if (message.role === 'user') {\n messages.push({ role: 'user', content: message.content, timestamp: now });\n continue;\n }\n if (message.role === 'assistant') {\n messages.push({\n role: 'assistant',\n content: [{ type: 'text', text: message.content }],\n api: '',\n provider: '',\n model: '',\n usage: {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n totalTokens: 0,\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n },\n stopReason: 'stop',\n timestamp: now,\n });\n continue;\n }\n if (message.role === 'tool' || message.role === 'function') {\n const prefix = message.name ? `@[${message.name}]: ` : '@[Tool]: ';\n messages.push({\n role: 'assistant',\n content: [{ type: 'text', text: `${prefix}${message.content}` }],\n api: '',\n provider: '',\n model: '',\n usage: {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n totalTokens: 0,\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n },\n stopReason: 'stop',\n timestamp: now,\n });\n continue;\n }\n throw new Error(`pi-ai adapter received unsupported message role '${message.role}'.`);\n }\n\n return {\n systemPrompt: systemSegments.length > 0 ? systemSegments.join('\\n\\n') : undefined,\n messages,\n };\n}\n\nfunction attachImagesToLastUserMessage(\n messages: PiMessage[],\n images: ProviderRequest['images'],\n): void {\n if (!images || images.length === 0) return;\n for (let i = messages.length - 1; i >= 0; i--) {\n const m = messages[i];\n if (m.role !== 'user') continue;\n const text = typeof m.content === 'string' ? m.content : '';\n messages[i] = {\n ...m,\n content: [\n ...(text ? [{ type: 'text' as const, text }] : []),\n ...images.map((img) => ({\n type: 'image' as const,\n data: img.source,\n mimeType: img.media_type,\n })),\n ],\n };\n return;\n }\n // No user message to attach images to — synthesize one.\n messages.push({\n role: 'user',\n content: images.map((img) => ({\n type: 'image' as const,\n data: img.source,\n mimeType: img.media_type,\n })),\n timestamp: Date.now(),\n });\n}\n\nfunction mapPiResponse(\n result: PiAssistantMessage,\n timing: {\n durationMs: number;\n startTime: string;\n endTime: string;\n aggregateUsage: AggregatedUsage;\n steps?: { count: number; toolCallCount: number };\n },\n): ProviderResponse {\n const text = result.content\n .filter((b): b is { type: 'text'; text: string } => b.type === 'text')\n .map((b) => b.text)\n .join('');\n\n // Token usage is aggregated across all model turns in the agent loop, not\n // just the final turn. Single-shot calls have aggregateUsage == lastTurnUsage.\n const cached = timing.aggregateUsage.cacheRead > 0 ? timing.aggregateUsage.cacheRead : undefined;\n const tokenUsage = {\n input: timing.aggregateUsage.input,\n output: timing.aggregateUsage.output,\n ...(cached !== undefined ? { cached } : {}),\n };\n\n // pi-ai always populates `cost.total`, but it computes 0 when the model\n // descriptor lacks pricing (fallback descriptor for unknown ids, or pi-ai's\n // registry simply not having rates yet). Surface 0 as \"unknown\" by leaving\n // costUsd undefined — keeps parity with consumers that previously saw it\n // unset.\n const costUsd = timing.aggregateUsage.cost > 0 ? timing.aggregateUsage.cost : undefined;\n\n return {\n raw: result,\n usage: toJsonObject(result.usage),\n output: [{ role: 'assistant' as const, content: text }],\n tokenUsage,\n ...(costUsd !== undefined ? { costUsd } : {}),\n durationMs: timing.durationMs,\n startTime: timing.startTime,\n endTime: timing.endTime,\n ...(timing.steps ? { steps: timing.steps } : {}),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Chat-prompt construction (shared with old paths; not pi-ai-specific)\n// ---------------------------------------------------------------------------\n\nfunction buildChatPrompt(request: ProviderRequest): ChatPrompt {\n const provided = request.chatPrompt?.length ? request.chatPrompt : undefined;\n if (provided) {\n const hasSystemMessage = provided.some((message) => message.role === 'system');\n if (hasSystemMessage) {\n return provided;\n }\n const systemContent = resolveSystemContent(request);\n return [{ role: 'system', content: systemContent }, ...provided];\n }\n\n const systemContent = resolveSystemContent(request);\n const userContent = request.question.trim();\n\n return [\n { role: 'system', content: systemContent },\n { role: 'user', content: userContent },\n ];\n}\n\nfunction resolveSystemContent(request: ProviderRequest): string {\n if (request.systemPrompt && request.systemPrompt.trim().length > 0) {\n return request.systemPrompt.trim();\n }\n return DEFAULT_SYSTEM_PROMPT;\n}\n\nfunction resolveModelSettings(\n request: ProviderRequest,\n defaults: ProviderDefaults,\n): { temperature?: number; maxOutputTokens?: number } {\n return {\n temperature: request.temperature ?? defaults.temperature,\n maxOutputTokens: request.maxOutputTokens ?? defaults.maxOutputTokens,\n };\n}\n\nfunction toJsonObject(value: unknown): JsonObject | undefined {\n if (!value || typeof value !== 'object') {\n return undefined;\n }\n try {\n return JSON.parse(JSON.stringify(value)) as JsonObject;\n } catch {\n return undefined;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Retry / backoff — library-agnostic; wraps any async fn that may transient-fail\n// ---------------------------------------------------------------------------\n\nfunction extractStatus(error: unknown): number | undefined {\n if (!error || typeof error !== 'object') return undefined;\n\n const candidate = error as Record<string, unknown>;\n const directStatus = candidate.status ?? candidate.statusCode;\n if (typeof directStatus === 'number' && Number.isFinite(directStatus)) {\n return directStatus;\n }\n\n const responseStatus =\n typeof candidate.response === 'object' && candidate.response\n ? (candidate.response as { status?: unknown }).status\n : undefined;\n if (typeof responseStatus === 'number' && Number.isFinite(responseStatus)) {\n return responseStatus;\n }\n\n const message = typeof candidate.message === 'string' ? candidate.message : undefined;\n if (message) {\n const match = message.match(/HTTP\\s+(\\d{3})/i);\n if (match) {\n const parsed = Number.parseInt(match[1], 10);\n if (Number.isFinite(parsed)) return parsed;\n }\n }\n\n return undefined;\n}\n\nfunction isNetworkError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false;\n\n const candidate = error as Record<string, unknown>;\n if (candidate.name === 'AbortError') return false;\n\n const code = candidate.code;\n if (typeof code === 'string' && /^E(AI|CONN|HOST|NET|PIPE|TIME|REFUSED|RESET)/i.test(code)) {\n return true;\n }\n\n const message = typeof candidate.message === 'string' ? candidate.message : undefined;\n if (\n message &&\n /(network|fetch failed|ECONNRESET|ENOTFOUND|EAI_AGAIN|ETIMEDOUT|ECONNREFUSED)/i.test(message)\n ) {\n return true;\n }\n\n return false;\n}\n\nfunction isRetryableError(error: unknown, retryableStatusCodes: readonly number[]): boolean {\n const status = extractStatus(error);\n if (status === 401 || status === 403) return false;\n if (typeof status === 'number') return retryableStatusCodes.includes(status);\n return isNetworkError(error);\n}\n\nfunction calculateRetryDelay(attempt: number, config: Required<RetryConfig>): number {\n const delay = Math.min(\n config.maxDelayMs,\n config.initialDelayMs * config.backoffFactor ** attempt,\n );\n return delay * (0.75 + Math.random() * 0.5);\n}\n\nasync function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function withRetry<T>(\n fn: () => Promise<T>,\n retryConfig?: RetryConfig,\n signal?: AbortSignal,\n): Promise<T> {\n const config: Required<RetryConfig> = {\n maxRetries: retryConfig?.maxRetries ?? 3,\n initialDelayMs: retryConfig?.initialDelayMs ?? 1000,\n maxDelayMs: retryConfig?.maxDelayMs ?? 60000,\n backoffFactor: retryConfig?.backoffFactor ?? 2,\n retryableStatusCodes: retryConfig?.retryableStatusCodes ?? [500, 408, 429, 502, 503, 504],\n };\n\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= config.maxRetries; attempt++) {\n if (signal?.aborted) {\n throw new Error(`Request aborted: ${signal.reason ?? 'Unknown reason'}`);\n }\n\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n\n if (attempt >= config.maxRetries) break;\n if (!isRetryableError(error, config.retryableStatusCodes)) throw error;\n\n const delay = calculateRetryDelay(attempt, config);\n await sleep(delay);\n }\n }\n\n throw lastError;\n}\n","import { invokePiAi, resolvePiModel } from './llm-providers.js';\nimport type { AgentVResolvedConfig } from './targets.js';\nimport type { Provider, ProviderRequest, ProviderResponse } from './types.js';\n\n/**\n * AgentV built-in grader provider.\n *\n * Resolves a `provider:model` string (e.g. `openai:gpt-5-mini`,\n * `anthropic:claude-sonnet-4-20250514`) into a pi-ai Model and runs the call\n * through the shared invokePiAi adapter. API keys are read from the\n * provider-specific env var (OPENAI_API_KEY, ANTHROPIC_API_KEY, ...) by pi-ai;\n * we don't carry credentials in this provider's config.\n *\n * Used as `--grader-target agentv --model openai:gpt-5-mini`.\n */\nexport class AgentvProvider implements Provider {\n readonly id: string;\n readonly kind = 'agentv' as const;\n readonly targetName: string;\n\n private readonly piModel: ReturnType<typeof resolvePiModel>;\n private readonly defaults: { temperature: number };\n\n constructor(targetName: string, config: AgentVResolvedConfig) {\n this.id = `agentv:${targetName}`;\n this.targetName = targetName;\n const { providerName, apiId, modelId } = parseAgentvModel(config.model);\n this.piModel = resolvePiModel({ providerName, apiId, modelId });\n this.defaults = { temperature: config.temperature };\n }\n\n async invoke(request: ProviderRequest): Promise<ProviderResponse> {\n return invokePiAi({\n model: this.piModel,\n request,\n defaults: this.defaults,\n });\n }\n}\n\n/**\n * Parse `provider:model` into the pi-ai routing fields. Each provider\n * shorthand maps to a pi-ai (providerName, apiId) pair:\n *\n * openai:<id> → ('openai', 'openai-completions')\n * anthropic:<id> → ('anthropic', 'anthropic-messages')\n * azure:<id> → ('azure-openai-responses', 'azure-openai-responses')\n * google:<id> → ('google', 'google-generative-ai')\n */\nfunction parseAgentvModel(model: string): {\n providerName: string;\n apiId: string;\n modelId: string;\n} {\n const colonIndex = model.indexOf(':');\n if (colonIndex === -1) {\n throw new Error(\n `Invalid agentv model \"${model}\". Expected \"provider:model\" (e.g., \"openai:gpt-5-mini\").`,\n );\n }\n const provider = model.slice(0, colonIndex);\n const modelId = model.slice(colonIndex + 1);\n\n switch (provider) {\n case 'openai':\n return { providerName: 'openai', apiId: 'openai-completions', modelId };\n case 'anthropic':\n return { providerName: 'anthropic', apiId: 'anthropic-messages', modelId };\n case 'azure':\n return {\n providerName: 'azure-openai-responses',\n apiId: 'azure-openai-responses',\n modelId,\n };\n case 'google':\n return { providerName: 'google', apiId: 'google-generative-ai', modelId };\n default:\n throw new Error(\n `Unsupported agentv provider \"${provider}\" in \"${model}\". Supported: openai, anthropic, azure, google.`,\n );\n }\n}\n"],"mappings":";;;AAoBA;EAQE,YAAY;EACZ,YAAY;EACZ;OACK;AASP,4BAA4B;AAa5B,IAAM,wBACJ;AAYK,IAAM,iBAAN,MAAyC;EACrC;EACA,OAAO;EACP;EAEQ;EACA;EACA;EACA;EAEjB,YAAY,YAAoB,QAA8B;AAC5D,SAAK,KAAK,UAAU,UAAU;AAC9B,SAAK,aAAa;AAClB,SAAK,SAAS,OAAO;AACrB,SAAK,WAAW;MACd,aAAa,OAAO;MACpB,iBAAiB,OAAO;IAC1B;AACA,SAAK,cAAc,OAAO;AAC1B,SAAK,UAAU,eAAe;MAC5B,cAAc;MACd,OAAO,OAAO,cAAc,cAAc,qBAAqB;MAC/D,SAAS,OAAO;MAChB,SAAS,OAAO;IAClB,CAAC;EACH;EAEA,MAAM,OAAO,SAAqD;AAChE,WAAO,WAAW;MAChB,OAAO,KAAK;MACZ,QAAQ,KAAK;MACb;MACA,UAAU,KAAK;MACf,aAAa,KAAK;IACpB,CAAC;EACH;AACF;AAEO,IAAM,qBAAN,MAA6C;EACzC;EACA,OAAO;EACP;EAEQ;EACA;EACA;EACA;EAEjB,YAAY,YAAoB,QAAkC;AAChE,SAAK,KAAK,cAAc,UAAU;AAClC,SAAK,aAAa;AAClB,SAAK,SAAS,OAAO;AACrB,SAAK,WAAW;MACd,aAAa,OAAO;MACpB,iBAAiB,OAAO;IAC1B;AACA,SAAK,cAAc,OAAO;AAG1B,SAAK,UAAU,eAAe;MAC5B,cAAc;MACd,OAAO;MACP,SAAS,OAAO;MAChB,SAAS;IACX,CAAC;EACH;EAEA,MAAM,OAAO,SAAqD;AAChE,WAAO,WAAW;MAChB,OAAO,KAAK;MACZ,QAAQ,KAAK;MACb;MACA,UAAU,KAAK;MACf,aAAa,KAAK;IACpB,CAAC;EACH;AACF;AAEO,IAAM,oBAAN,MAA4C;EACxC;EACA,OAAO;EACP;EAEQ;EACA;EACA;EACA;EACA;EAEjB,YAAY,YAAoB,QAAiC;AAC/D,SAAK,KAAK,aAAa,UAAU;AACjC,SAAK,aAAa;AAClB,SAAK,SAAS,OAAO;AACrB,SAAK,iBAAiB,OAAO;AAC7B,SAAK,WAAW;MACd,aAAa,OAAO;MACpB,iBAAiB,OAAO;MACxB,gBAAgB,OAAO;IACzB;AACA,SAAK,cAAc,OAAO;AAC1B,SAAK,UAAU,eAAe;MAC5B,cAAc;MACd,OAAO;MACP,SAAS,OAAO;IAClB,CAAC;EACH;EAEA,MAAM,OAAO,SAAqD;AAKhE,UAAM,kBACJ,KAAK,mBAAmB,SACpB,EAAE,iBAAiB,MAAM,sBAAsB,KAAK,eAAe,IACnE;AAEN,WAAO,WAAW;MAChB,OAAO,KAAK;MACZ,QAAQ,KAAK;MACb;MACA,UAAU,KAAK;MACf,aAAa,KAAK;MAClB,GAAI,kBAAkB,EAAE,gBAAgB,IAAI,CAAC;IAC/C,CAAC;EACH;AACF;AAEO,IAAM,iBAAN,MAAyC;EACrC;EACA,OAAO;EACP;EAEQ;EACA;EACA;EACA;EAEjB,YAAY,YAAoB,QAA8B;AAC5D,SAAK,KAAK,UAAU,UAAU;AAC9B,SAAK,aAAa;AAClB,SAAK,SAAS,OAAO;AACrB,SAAK,WAAW;MACd,aAAa,OAAO;MACpB,iBAAiB,OAAO;IAC1B;AACA,SAAK,cAAc,OAAO;AAC1B,SAAK,UAAU,eAAe;MAC5B,cAAc;MACd,OAAO;MACP,SAAS,OAAO;IAClB,CAAC;EACH;EAEA,MAAM,OAAO,SAAqD;AAChE,WAAO,WAAW;MAChB,OAAO,KAAK;MACZ,QAAQ,KAAK;MACb;MACA,UAAU,KAAK;MACf,aAAa,KAAK;IACpB,CAAC;EACH;AACF;AAEO,IAAM,gBAAN,MAAwC;EACpC;EACA,OAAO;EACP;EAEQ;EACA;EACA;EACA;EACA;EAEjB,YAAY,YAAoB,QAA6B;AAC3D,SAAK,KAAK,SAAS,UAAU;AAC7B,SAAK,aAAa;AAClB,SAAK,SAAS,OAAO;AACrB,SAAK,WAAW;MACd,aAAa,OAAO;MACpB,iBAAiB,OAAO;IAC1B;AACA,SAAK,cAAc,OAAO;AAU1B,UAAM,UAAU,OAAO,aAAa,KAAK;AACzC,UAAM,YAAY,gBAAgB,KAAK,OAAO;AAC9C,UAAM,UAAU,YAAY,kBAAkB,OAAO,IAAI;AAEzD,SAAK,kBAAkB;MACrB,GAAI,UAAU,EAAE,cAAc,QAAQ,IAAI,EAAE,mBAAmB,QAAQ;MACvE,GAAI,OAAO,UAAU,EAAE,iBAAiB,OAAO,QAAQ,IAAI,CAAC;IAC9D;AAEA,SAAK,UAAU,eAAe;MAC5B,cAAc;MACd,OAAO;;MAEP,SAAS,OAAO;MAChB,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;IAC/B,CAAC;EACH;EAEA,MAAM,OAAO,SAAqD;AAChE,WAAO,WAAW;MAChB,OAAO,KAAK;MACZ,QAAQ,KAAK;MACb;MACA,UAAU,KAAK;MACf,aAAa,KAAK;MAClB,iBAAiB,KAAK;IACxB,CAAC;EACH;AACF;AAYA,SAAS,kBAAkB,OAAuB;AAChD,QAAM,UAAU,MAAM,QAAQ,QAAQ,EAAE;AACxC,MAAI,QAAQ,SAAS,YAAY,EAAG,QAAO;AAC3C,MAAI,QAAQ,SAAS,SAAS,EAAG,QAAO,GAAG,OAAO;AAClD,SAAO,GAAG,OAAO;AACnB;AA2BA,eAAsB,WAAW,SAAuD;AACtF,QAAM,EAAE,OAAO,QAAQ,SAAS,UAAU,aAAa,gBAAgB,IAAI;AAC3E,QAAM,QAAQ,QAAQ,SAAS,QAAQ,MAAM,SAAS,IAAI,QAAQ,QAAQ;AAC1E,QAAM,WAAW,QAAQ,KAAK,IAAI,GAAG,QAAQ,YAAY,CAAC,IAAI;AAE9D,QAAM,EAAE,cAAc,SAAS,IAAI,sBAAsB,gBAAgB,OAAO,CAAC;AACjF,MAAI,QAAQ,UAAU,QAAQ,OAAO,SAAS,GAAG;AAC/C,kCAA8B,UAAU,QAAQ,MAAM;EACxD;AAOA,QAAM,UAAgC,QACjC,MAAM,IAAI,CAAC,OAAO;IACjB,MAAM,EAAE;IACR,aAAa,EAAE;IACf,YAAY,EAAE;EAChB,EAAE,IACF;AACJ,QAAM,MAAM,EAAE,cAAc,UAAU,GAAI,UAAU,EAAE,OAAO,QAAQ,IAAI,CAAC,EAAG;AAC7E,QAAM,EAAE,aAAa,gBAAgB,IAAI,qBAAqB,SAAS,QAAQ;AAC/E,QAAM,cAAc;IAClB,GAAI,WAAW,SAAY,EAAE,OAAO,IAAI,CAAC;IACzC;IACA,GAAI,oBAAoB,SAAY,EAAE,WAAW,gBAAgB,IAAI,CAAC;IACtE,QAAQ,QAAQ;IAChB,GAAI,mBAAmB,CAAC;EAC1B;AAEA,QAAM,aAAY,oBAAI,KAAK,GAAE,YAAY;AACzC,QAAM,UAAU,KAAK,IAAI;AAEzB,QAAM,iBAAkC,EAAE,OAAO,GAAG,QAAQ,GAAG,WAAW,GAAG,MAAM,EAAE;AACrF,MAAI,YAAY;AAChB,MAAI,gBAAgB;AACpB,MAAI,SAA6B,MAAM;IACrC,MAAM,WAAW,OAAO,KAAK,WAAW;IACxC;IACA,QAAQ;EACV;AACA,MAAI,SAAS,KAAK,MAAM;AACxB,cAAY;AACZ,kBAAgB,gBAAgB,OAAO,KAAK;AAI5C,SAAO,OAAO;AACZ,UAAM,QAAQ,OAAO,QAAQ;MAC3B,CAAC,MAA8D,EAAE,SAAS;IAC5E;AACA,QAAI,MAAM,WAAW,EAAG;AACxB,QAAI,aAAa,SAAU;AAE3B,qBAAiB,MAAM;AAEvB,eAAW,QAAQ,OAAO;AACxB,YAAM,OAAO,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI;AACnD,UAAI;AACJ,UAAI,UAAU;AACd,UAAI;AACF,YAAI,CAAC,MAAM;AACT,gBAAM,IAAI,MAAM,6CAA6C,KAAK,IAAI,GAAG;QAC3E;AACA,iBAAS,MAAM,KAAK,QAAQ,KAAK,SAAS;MAC5C,SAAS,KAAK;AACZ,iBAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AACxD,kBAAU;MACZ;AACA,UAAI,SAAS,KAAK;QAChB,MAAM;QACN,YAAY,KAAK;QACjB,UAAU,KAAK;QACf,SAAS;UACP,EAAE,MAAM,QAAQ,MAAM,OAAO,WAAW,WAAW,SAAS,KAAK,UAAU,MAAM,EAAE;QACrF;QACA;QACA,WAAW,KAAK,IAAI;MACtB,CAAC;IACH;AAEA,aAAS,MAAM;MACb,MAAM,WAAW,OAAO,KAAK,WAAW;MACxC;MACA,QAAQ;IACV;AACA,QAAI,SAAS,KAAK,MAAM;AACxB,iBAAa;AACb,oBAAgB,gBAAgB,OAAO,KAAK;EAC9C;AAEA,QAAM,WAAU,oBAAI,KAAK,GAAE,YAAY;AACvC,QAAM,aAAa,KAAK,IAAI,IAAI;AAEhC,SAAO,cAAc,QAAQ;IAC3B;IACA;IACA;IACA;IACA,OAAO,QAAQ,EAAE,OAAO,WAAW,cAAc,IAAI;EACvD,CAAC;AACH;AASA,SAAS,gBAAgB,KAAsB,GAAsC;AACnF,MAAI,SAAS,EAAE;AACf,MAAI,UAAU,EAAE;AAChB,MAAI,aAAa,EAAE;AACnB,MAAI,QAAQ,EAAE,KAAK;AACrB;AAEO,SAAS,eAAe,MAKnB;AACV,QAAM,EAAE,cAAc,OAAO,SAAS,QAAQ,IAAI;AAUlD,MAAI;AACJ,MAAI;AACF,YAAQ,WAAW,cAAiC,OAAgB;EACtE,QAAQ;AACN,YAAQ;EACV;AAEA,MAAI,CAAC,OAAO;AACV,UAAM,kBAAkB,WAAW,kBAAkB,YAAY;AACjE,QAAI,CAAC,iBAAiB;AACpB,YAAM,IAAI;QACR,wDAAwD,YAAY,cAAc,OAAO;MAC3F;IACF;AAUA,YAAQ;MACN,IAAI;MACJ,MAAM;MACN,KAAK;MACL,UAAU;MACV,SAAS;MACT,WAAW;MACX,OAAO,CAAC,MAAM;MACd,MAAM,EAAE,OAAO,GAAG,QAAQ,GAAG,WAAW,GAAG,YAAY,EAAE;MACzD,eAAe;MACf,WAAW;IACb;EACF;AAEA,MAAI,MAAM,QAAQ,OAAO;AACvB,YAAQ,EAAE,GAAG,OAAO,KAAK,MAAM;EACjC;AACA,MAAI,SAAS;AACX,YAAQ,EAAE,GAAG,OAAO,QAAQ;EAC9B;AAEA,SAAO;AACT;AAOA,SAAS,kBAAkB,cAA0C;AACnE,MAAI,iBAAiB,SAAU,QAAO;AACtC,MAAI,iBAAiB,aAAc,QAAO;AAC1C,SAAO;AACT;AAOA,SAAS,sBAAsB,YAAmC;AAChE,QAAM,iBAA2B,CAAC;AAClC,QAAM,WAAwB,CAAC;AAC/B,QAAM,MAAM,KAAK,IAAI;AAErB,aAAW,WAAW,YAAY;AAChC,QAAI,QAAQ,SAAS,UAAU;AAC7B,qBAAe,KAAK,QAAQ,OAAO;AACnC;IACF;AACA,QAAI,QAAQ,SAAS,QAAQ;AAC3B,eAAS,KAAK,EAAE,MAAM,QAAQ,SAAS,QAAQ,SAAS,WAAW,IAAI,CAAC;AACxE;IACF;AACA,QAAI,QAAQ,SAAS,aAAa;AAChC,eAAS,KAAK;QACZ,MAAM;QACN,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,QAAQ,QAAQ,CAAC;QACjD,KAAK;QACL,UAAU;QACV,OAAO;QACP,OAAO;UACL,OAAO;UACP,QAAQ;UACR,WAAW;UACX,YAAY;UACZ,aAAa;UACb,MAAM,EAAE,OAAO,GAAG,QAAQ,GAAG,WAAW,GAAG,YAAY,GAAG,OAAO,EAAE;QACrE;QACA,YAAY;QACZ,WAAW;MACb,CAAC;AACD;IACF;AACA,QAAI,QAAQ,SAAS,UAAU,QAAQ,SAAS,YAAY;AAC1D,YAAM,SAAS,QAAQ,OAAO,KAAK,QAAQ,IAAI,QAAQ;AACvD,eAAS,KAAK;QACZ,MAAM;QACN,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,GAAG,MAAM,GAAG,QAAQ,OAAO,GAAG,CAAC;QAC/D,KAAK;QACL,UAAU;QACV,OAAO;QACP,OAAO;UACL,OAAO;UACP,QAAQ;UACR,WAAW;UACX,YAAY;UACZ,aAAa;UACb,MAAM,EAAE,OAAO,GAAG,QAAQ,GAAG,WAAW,GAAG,YAAY,GAAG,OAAO,EAAE;QACrE;QACA,YAAY;QACZ,WAAW;MACb,CAAC;AACD;IACF;AACA,UAAM,IAAI,MAAM,oDAAoD,QAAQ,IAAI,IAAI;EACtF;AAEA,SAAO;IACL,cAAc,eAAe,SAAS,IAAI,eAAe,KAAK,MAAM,IAAI;IACxE;EACF;AACF;AAEA,SAAS,8BACP,UACA,QACM;AACN,MAAI,CAAC,UAAU,OAAO,WAAW,EAAG;AACpC,WAAS,IAAI,SAAS,SAAS,GAAG,KAAK,GAAG,KAAK;AAC7C,UAAM,IAAI,SAAS,CAAC;AACpB,QAAI,EAAE,SAAS,OAAQ;AACvB,UAAM,OAAO,OAAO,EAAE,YAAY,WAAW,EAAE,UAAU;AACzD,aAAS,CAAC,IAAI;MACZ,GAAG;MACH,SAAS;QACP,GAAI,OAAO,CAAC,EAAE,MAAM,QAAiB,KAAK,CAAC,IAAI,CAAC;QAChD,GAAG,OAAO,IAAI,CAAC,SAAS;UACtB,MAAM;UACN,MAAM,IAAI;UACV,UAAU,IAAI;QAChB,EAAE;MACJ;IACF;AACA;EACF;AAEA,WAAS,KAAK;IACZ,MAAM;IACN,SAAS,OAAO,IAAI,CAAC,SAAS;MAC5B,MAAM;MACN,MAAM,IAAI;MACV,UAAU,IAAI;IAChB,EAAE;IACF,WAAW,KAAK,IAAI;EACtB,CAAC;AACH;AAEA,SAAS,cACP,QACA,QAOkB;AAClB,QAAM,OAAO,OAAO,QACjB,OAAO,CAAC,MAA2C,EAAE,SAAS,MAAM,EACpE,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,KAAK,EAAE;AAIV,QAAM,SAAS,OAAO,eAAe,YAAY,IAAI,OAAO,eAAe,YAAY;AACvF,QAAM,aAAa;IACjB,OAAO,OAAO,eAAe;IAC7B,QAAQ,OAAO,eAAe;IAC9B,GAAI,WAAW,SAAY,EAAE,OAAO,IAAI,CAAC;EAC3C;AAOA,QAAM,UAAU,OAAO,eAAe,OAAO,IAAI,OAAO,eAAe,OAAO;AAE9E,SAAO;IACL,KAAK;IACL,OAAO,aAAa,OAAO,KAAK;IAChC,QAAQ,CAAC,EAAE,MAAM,aAAsB,SAAS,KAAK,CAAC;IACtD;IACA,GAAI,YAAY,SAAY,EAAE,QAAQ,IAAI,CAAC;IAC3C,YAAY,OAAO;IACnB,WAAW,OAAO;IAClB,SAAS,OAAO;IAChB,GAAI,OAAO,QAAQ,EAAE,OAAO,OAAO,MAAM,IAAI,CAAC;EAChD;AACF;AAMA,SAAS,gBAAgB,SAAsC;AAC7D,QAAM,WAAW,QAAQ,YAAY,SAAS,QAAQ,aAAa;AACnE,MAAI,UAAU;AACZ,UAAM,mBAAmB,SAAS,KAAK,CAAC,YAAY,QAAQ,SAAS,QAAQ;AAC7E,QAAI,kBAAkB;AACpB,aAAO;IACT;AACA,UAAMA,iBAAgB,qBAAqB,OAAO;AAClD,WAAO,CAAC,EAAE,MAAM,UAAU,SAASA,eAAc,GAAG,GAAG,QAAQ;EACjE;AAEA,QAAM,gBAAgB,qBAAqB,OAAO;AAClD,QAAM,cAAc,QAAQ,SAAS,KAAK;AAE1C,SAAO;IACL,EAAE,MAAM,UAAU,SAAS,cAAc;IACzC,EAAE,MAAM,QAAQ,SAAS,YAAY;EACvC;AACF;AAEA,SAAS,qBAAqB,SAAkC;AAC9D,MAAI,QAAQ,gBAAgB,QAAQ,aAAa,KAAK,EAAE,SAAS,GAAG;AAClE,WAAO,QAAQ,aAAa,KAAK;EACnC;AACA,SAAO;AACT;AAEA,SAAS,qBACP,SACA,UACoD;AACpD,SAAO;IACL,aAAa,QAAQ,eAAe,SAAS;IAC7C,iBAAiB,QAAQ,mBAAmB,SAAS;EACvD;AACF;AAEA,SAAS,aAAa,OAAwC;AAC5D,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,WAAO;EACT;AACA,MAAI;AACF,WAAO,KAAK,MAAM,KAAK,UAAU,KAAK,CAAC;EACzC,QAAQ;AACN,WAAO;EACT;AACF;AAMA,SAAS,cAAc,OAAoC;AACzD,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAEhD,QAAM,YAAY;AAClB,QAAM,eAAe,UAAU,UAAU,UAAU;AACnD,MAAI,OAAO,iBAAiB,YAAY,OAAO,SAAS,YAAY,GAAG;AACrE,WAAO;EACT;AAEA,QAAM,iBACJ,OAAO,UAAU,aAAa,YAAY,UAAU,WAC/C,UAAU,SAAkC,SAC7C;AACN,MAAI,OAAO,mBAAmB,YAAY,OAAO,SAAS,cAAc,GAAG;AACzE,WAAO;EACT;AAEA,QAAM,UAAU,OAAO,UAAU,YAAY,WAAW,UAAU,UAAU;AAC5E,MAAI,SAAS;AACX,UAAM,QAAQ,QAAQ,MAAM,iBAAiB;AAC7C,QAAI,OAAO;AACT,YAAM,SAAS,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE;AAC3C,UAAI,OAAO,SAAS,MAAM,EAAG,QAAO;IACtC;EACF;AAEA,SAAO;AACT;AAEA,SAAS,eAAe,OAAyB;AAC/C,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAEhD,QAAM,YAAY;AAClB,MAAI,UAAU,SAAS,aAAc,QAAO;AAE5C,QAAM,OAAO,UAAU;AACvB,MAAI,OAAO,SAAS,YAAY,gDAAgD,KAAK,IAAI,GAAG;AAC1F,WAAO;EACT;AAEA,QAAM,UAAU,OAAO,UAAU,YAAY,WAAW,UAAU,UAAU;AAC5E,MACE,WACA,gFAAgF,KAAK,OAAO,GAC5F;AACA,WAAO;EACT;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,OAAgB,sBAAkD;AAC1F,QAAM,SAAS,cAAc,KAAK;AAClC,MAAI,WAAW,OAAO,WAAW,IAAK,QAAO;AAC7C,MAAI,OAAO,WAAW,SAAU,QAAO,qBAAqB,SAAS,MAAM;AAC3E,SAAO,eAAe,KAAK;AAC7B;AAEA,SAAS,oBAAoB,SAAiB,QAAuC;AACnF,QAAM,QAAQ,KAAK;IACjB,OAAO;IACP,OAAO,iBAAiB,OAAO,iBAAiB;EAClD;AACA,SAAO,SAAS,OAAO,KAAK,OAAO,IAAI;AACzC;AAEA,eAAe,MAAM,IAA2B;AAC9C,SAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AACzD;AAEA,eAAe,UACb,IACA,aACA,QACY;AACZ,QAAM,SAAgC;IACpC,YAAY,aAAa,cAAc;IACvC,gBAAgB,aAAa,kBAAkB;IAC/C,YAAY,aAAa,cAAc;IACvC,eAAe,aAAa,iBAAiB;IAC7C,sBAAsB,aAAa,wBAAwB,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;EAC1F;AAEA,MAAI;AAEJ,WAAS,UAAU,GAAG,WAAW,OAAO,YAAY,WAAW;AAC7D,QAAI,QAAQ,SAAS;AACnB,YAAM,IAAI,MAAM,oBAAoB,OAAO,UAAU,gBAAgB,EAAE;IACzE;AAEA,QAAI;AACF,aAAO,MAAM,GAAG;IAClB,SAAS,OAAO;AACd,kBAAY;AAEZ,UAAI,WAAW,OAAO,WAAY;AAClC,UAAI,CAAC,iBAAiB,OAAO,OAAO,oBAAoB,EAAG,OAAM;AAEjE,YAAM,QAAQ,oBAAoB,SAAS,MAAM;AACjD,YAAM,MAAM,KAAK;IACnB;EACF;AAEA,QAAM;AACR;ACjzBO,IAAM,iBAAN,MAAyC;EACrC;EACA,OAAO;EACP;EAEQ;EACA;EAEjB,YAAY,YAAoB,QAA8B;AAC5D,SAAK,KAAK,UAAU,UAAU;AAC9B,SAAK,aAAa;AAClB,UAAM,EAAE,cAAc,OAAO,QAAQ,IAAI,iBAAiB,OAAO,KAAK;AACtE,SAAK,UAAU,eAAe,EAAE,cAAc,OAAO,QAAQ,CAAC;AAC9D,SAAK,WAAW,EAAE,aAAa,OAAO,YAAY;EACpD;EAEA,MAAM,OAAO,SAAqD;AAChE,WAAO,WAAW;MAChB,OAAO,KAAK;MACZ;MACA,UAAU,KAAK;IACjB,CAAC;EACH;AACF;AAWA,SAAS,iBAAiB,OAIxB;AACA,QAAM,aAAa,MAAM,QAAQ,GAAG;AACpC,MAAI,eAAe,IAAI;AACrB,UAAM,IAAI;MACR,yBAAyB,KAAK;IAChC;EACF;AACA,QAAM,WAAW,MAAM,MAAM,GAAG,UAAU;AAC1C,QAAM,UAAU,MAAM,MAAM,aAAa,CAAC;AAE1C,UAAQ,UAAU;IAChB,KAAK;AACH,aAAO,EAAE,cAAc,UAAU,OAAO,sBAAsB,QAAQ;IACxE,KAAK;AACH,aAAO,EAAE,cAAc,aAAa,OAAO,sBAAsB,QAAQ;IAC3E,KAAK;AACH,aAAO;QACL,cAAc;QACd,OAAO;QACP;MACF;IACF,KAAK;AACH,aAAO,EAAE,cAAc,UAAU,OAAO,wBAAwB,QAAQ;IAC1E;AACE,YAAM,IAAI;QACR,gCAAgC,QAAQ,SAAS,KAAK;MACxD;EACJ;AACF;","names":["systemContent"]}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
|
|
2
2
|
import {
|
|
3
3
|
toTranscriptJsonLines
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-PKHXZYEN.js";
|
|
5
5
|
import {
|
|
6
6
|
DEFAULT_THRESHOLD
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-F3VB3LBW.js";
|
|
8
8
|
|
|
9
9
|
// src/commands/eval/artifact-writer.ts
|
|
10
10
|
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
@@ -690,4 +690,4 @@ export {
|
|
|
690
690
|
writePerTestArtifacts,
|
|
691
691
|
writeArtifactsFromResults
|
|
692
692
|
};
|
|
693
|
-
//# sourceMappingURL=chunk-
|
|
693
|
+
//# sourceMappingURL=chunk-67WQGAPE.js.map
|