@axlsdk/axl 0.17.1 → 0.17.2
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.cjs +13 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +12 -4
- package/dist/index.d.ts +12 -4
- package/dist/index.js +13 -5
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/telemetry/span-manager.ts","../src/index.ts","../src/tool.ts","../src/providers/types.ts","../src/providers/retry.ts","../src/providers/openai.ts","../src/providers/openai-responses.ts","../src/providers/anthropic.ts","../src/providers/gemini.ts","../src/providers/registry.ts","../src/context.ts","../src/errors.ts","../src/partial-json.ts","../src/event-utils.ts","../src/redaction.ts","../src/config.ts","../src/agent.ts","../src/workflow.ts","../src/runtime.ts","../src/state/memory.ts","../src/state/sqlite.ts","../src/session.ts","../src/stream.ts","../src/types.ts","../src/mcp/client.ts","../src/mcp/manager.ts","../src/memory/manager.ts","../src/telemetry/noop.ts","../src/telemetry/index.ts","../src/module-resolve.ts","../src/cli-internals.ts","../src/state/redis.ts","../src/memory/embedder-openai.ts","../src/memory/vector-memory.ts","../src/memory/vector-sqlite.ts"],"sourcesContent":["import type { SpanHandle, SpanManager, TelemetryConfig } from './types.js';\n\n/** Minimal interface for an OTel span. */\ninterface OTelSpan {\n setAttribute(key: string, value: string | number | boolean): void;\n addEvent(name: string, attributes?: Record<string, string | number | boolean>): void;\n setStatus(status: { code: unknown; message?: string }): void;\n end(): void;\n}\n\n/** Minimal interface for an OTel tracer. */\ninterface OTelTracer {\n startActiveSpan<T>(\n name: string,\n options: { attributes: Record<string, string | number | boolean> },\n fn: (span: OTelSpan) => Promise<T>,\n ): Promise<T>;\n}\n\n/** Minimal interface for an OTel tracer provider. */\ninterface OTelTracerProvider {\n getTracer(name: string): OTelTracer;\n shutdown?(): Promise<void>;\n}\n\n/** Minimal interface for the @opentelemetry/api module. */\ninterface OTelApi {\n SpanStatusCode: { OK: unknown; ERROR: unknown };\n trace: {\n getTracerProvider(): OTelTracerProvider;\n getActiveSpan?(): OTelSpan | undefined;\n };\n}\n\n/**\n * OpenTelemetry-backed SpanManager.\n * Dynamically imports @opentelemetry/api to avoid hard dependency.\n */\nexport class OTelSpanManager implements SpanManager {\n private tracer: OTelTracer;\n private otelApi: OTelApi;\n private tracerProvider: OTelTracerProvider;\n\n private constructor(otelApi: OTelApi, tracer: OTelTracer, tracerProvider: OTelTracerProvider) {\n this.otelApi = otelApi;\n this.tracer = tracer;\n this.tracerProvider = tracerProvider;\n }\n\n static async create(config: TelemetryConfig): Promise<OTelSpanManager> {\n let otelApi: OTelApi;\n try {\n otelApi = (await import('@opentelemetry/api')) as unknown as OTelApi;\n } catch {\n throw new Error(\n '@opentelemetry/api is required for telemetry. Install it with: npm install @opentelemetry/api',\n );\n }\n\n const tracerProvider =\n (config.tracerProvider as OTelTracerProvider | undefined) ??\n otelApi.trace.getTracerProvider();\n const serviceName = config.serviceName ?? 'axl';\n const tracer = tracerProvider.getTracer(serviceName);\n\n return new OTelSpanManager(otelApi, tracer, tracerProvider);\n }\n\n async withSpanAsync<T>(\n name: string,\n attributes: Record<string, string | number | boolean>,\n fn: (span: SpanHandle) => Promise<T>,\n ): Promise<T> {\n const otelApi = this.otelApi;\n\n return this.tracer.startActiveSpan(name, { attributes }, async (otelSpan: OTelSpan) => {\n const handle: SpanHandle = {\n setAttribute(key: string, value: string | number | boolean) {\n otelSpan.setAttribute(key, value);\n },\n addEvent(eventName: string, attrs?: Record<string, string | number | boolean>) {\n otelSpan.addEvent(eventName, attrs);\n },\n setStatus(code: 'ok' | 'error', message?: string) {\n const statusCode =\n code === 'ok' ? otelApi.SpanStatusCode.OK : otelApi.SpanStatusCode.ERROR;\n otelSpan.setStatus({ code: statusCode, message });\n },\n end() {\n otelSpan.end();\n },\n };\n\n try {\n const result = await fn(handle);\n handle.setStatus('ok');\n return result;\n } catch (err) {\n handle.setStatus('error', err instanceof Error ? err.message : String(err));\n throw err;\n } finally {\n handle.end();\n }\n });\n }\n\n addEventToActiveSpan(name: string, attributes?: Record<string, string | number | boolean>): void {\n const activeSpan = this.otelApi.trace.getActiveSpan?.();\n if (activeSpan) {\n activeSpan.addEvent(name, attributes);\n }\n }\n\n async shutdown(): Promise<void> {\n if (this.tracerProvider && typeof this.tracerProvider.shutdown === 'function') {\n await this.tracerProvider.shutdown();\n }\n }\n}\n","// Core API\nexport { tool } from './tool.js';\nexport type { Tool, ToolConfig, ToolHooks, RetryPolicy } from './tool.js';\n\nexport { agent } from './agent.js';\nexport type { Agent, AgentConfig, HandoffDescriptor } from './agent.js';\n\nexport { workflow } from './workflow.js';\nexport type { Workflow, WorkflowConfig, AnyWorkflow } from './workflow.js';\n\n// Runtime\nexport { AxlRuntime } from './runtime.js';\nexport type { CreateContextOptions, ExecuteOptions, EvalExecuteWorkflow } from './runtime.js';\n\n// Module-resolution helpers — internal but exported so the eval CLI and\n// Studio middleware share one implementation of the ESM/CJS interop walk.\n// Not part of the stable public API.\nexport { resolveRuntime, pickDefault, pickExport } from './module-resolve.js';\n\n// CLI internals — internal helpers for tsx loader registration, glob\n// expansion, conditions registration, and config-file detection. Shared\n// between axl-eval and axl-studio so a fix to (e.g.) the tsx loader\n// applies to both atomically. Not part of the stable public API.\nexport {\n CONFIG_CANDIDATES,\n findConfig,\n needsTsxLoader,\n importModule,\n expandGlob,\n registerConditions,\n} from './cli-internals.js';\nexport { defineConfig } from './config.js';\nexport type { AxlConfig } from './config.js';\n\n// Stream — carries `AxlEvent` directly. No `StreamEvent` shim — consumers\n// narrow on `event.type` from the `AxlEvent` union (spec/16 decision 8).\nexport { AxlStream } from './stream.js';\n\n// Event helpers — consumer-facing utilities for accumulators / reducers\n// that need to honor spec invariants (cost-rollup skip, root-level\n// filter, leaf-cost detection). Use these instead of hand-rolling the\n// `event.type !== 'ask_end'` guard at every call site.\nexport {\n eventCostContribution,\n isCostBearingLeaf,\n isRootLevel,\n COST_BEARING_LEAF_TYPES,\n} from './event-utils.js';\n\n// Tolerant JSON parser — used internally for `partial_object` streaming.\n// Exported so consumers building their own progressive-render pipelines\n// can reuse the same truncation recovery + stack-overflow guard rails\n// we ship with the SDK.\nexport { parsePartialJson } from './partial-json.js';\n\n// Session\nexport { Session } from './session.js';\nexport type { SessionOptions } from './session.js';\n\n// Context\nexport { WorkflowContext, zodToJsonSchema, extractJson } from './context.js';\nexport type { WorkflowContextInit } from './context.js';\nexport type {\n Result,\n BudgetResult,\n HumanDecision,\n // Unified event model — replaces the old TraceEvent + StreamEvent split.\n AxlEvent,\n AxlEventType,\n AxlEventBase,\n AxlEventOf,\n AskScoped,\n CallbackMeta,\n // Per-type data shapes — consumers narrowing via `event.type` get\n // statically-typed access to `data`. Kept in the same export block as\n // `AxlEvent` so the discriminated union and its parts move together.\n AgentCallStartData,\n AgentCallEndData,\n AgentCallParams,\n ToolCallData,\n ToolCallStartData,\n ToolApprovalData,\n ToolDeniedData,\n HandoffStartData,\n HandoffReturnData,\n DelegateData,\n VerifyData,\n WorkflowStartData,\n WorkflowEndData,\n MemoryEventData,\n CheckpointEventData,\n AwaitHumanData,\n AwaitHumanResolvedData,\n GuardrailData,\n SchemaCheckData,\n ValidateData,\n AskOptions,\n DelegateOptions,\n RaceOptions,\n VoteOptions,\n VerifyRetry,\n VerifyOptions,\n BudgetOptions,\n SpawnOptions,\n MapOptions,\n AwaitHumanOptions,\n ExecutionInfo,\n GuardrailResult,\n InputGuardrail,\n OutputGuardrail,\n GuardrailBlockHandler,\n GuardrailsConfig,\n ValidateResult,\n OutputValidator,\n HandoffRecord,\n AgentCallInfo,\n} from './types.js';\nexport { AXL_EVENT_TYPES } from './types.js';\nexport { REDACTED, REDACTION_RULES, redactEvent } from './redaction.js';\n\n// Errors\nexport {\n AxlError,\n VerifyError,\n QuorumNotMet,\n NoConsensus,\n TimeoutError,\n MaxTurnsError,\n ToolDenied,\n BudgetExceededError,\n GuardrailError,\n ValidationError,\n} from './errors.js';\n\n// Provider\nexport { OpenAIProvider } from './providers/openai.js';\nexport { OpenAIResponsesProvider } from './providers/openai-responses.js';\nexport { AnthropicProvider } from './providers/anthropic.js';\nexport { GeminiProvider } from './providers/gemini.js';\nexport { ProviderRegistry } from './providers/registry.js';\nexport type {\n Provider,\n ProviderAdapter,\n ChatMessage,\n ToolCallMessage,\n ProviderResponse,\n StreamChunk,\n ChatOptions,\n Effort,\n ToolChoice,\n} from './providers/types.js';\nexport { resolveThinkingOptions, type ResolvedThinkingOptions } from './providers/types.js';\n\n// MCP\nexport { McpManager } from './mcp/manager.js';\nexport type { McpToolDefinition, McpServer, McpToolResult, McpServerConfig } from './mcp/types.js';\n\n// State\nexport type {\n StateStore,\n ExecutionState,\n PendingDecision,\n EvalHistoryEntry,\n} from './state/types.js';\nexport { MemoryStore } from './state/memory.js';\nexport { SQLiteStore } from './state/sqlite.js';\nexport { RedisStore } from './state/redis.js';\n\n// Memory\nexport { MemoryManager } from './memory/manager.js';\nexport type { RememberResult, RecallResult } from './memory/manager.js';\nexport { OpenAIEmbedder } from './memory/embedder-openai.js';\nexport { InMemoryVectorStore } from './memory/vector-memory.js';\nexport { SqliteVectorStore } from './memory/vector-sqlite.js';\nexport type {\n VectorEntry,\n VectorResult,\n VectorStore,\n Embedder,\n EmbedResult,\n EmbedUsage,\n RememberOptions,\n RecallOptions,\n MemoryConfig,\n} from './memory/types.js';\n\n// Telemetry\nexport { NoopSpanManager, createSpanManager } from './telemetry/index.js';\nexport type { TelemetryConfig, SpanHandle, SpanManager } from './telemetry/types.js';\n","import type { z } from 'zod';\nimport type { WorkflowContext } from './context.js';\n\n/** Retry policy for tool handlers */\nexport type RetryPolicy = {\n attempts?: number;\n backoff?: 'none' | 'linear' | 'exponential';\n on?: (error: Error & { status?: number }) => boolean;\n};\n\n/** Lifecycle hooks for tool execution. */\nexport type ToolHooks<TInput = unknown, TOutput = unknown> = {\n /** Transform input before the handler runs. Receives parsed input and workflow context. */\n before?(input: TInput, ctx: WorkflowContext): TInput | Promise<TInput>;\n /** Transform output after the handler runs. Receives handler result and workflow context. */\n after?(output: TOutput, ctx: WorkflowContext): TOutput | Promise<TOutput>;\n};\n\n/** Tool configuration */\nexport type ToolConfig<TInput extends z.ZodType, TOutput = unknown> = {\n name: string;\n description: string;\n input: TInput;\n handler: (input: z.infer<TInput>, ctx: WorkflowContext) => TOutput | Promise<TOutput>;\n retry?: RetryPolicy;\n sensitive?: boolean;\n /** Maximum string length for any string argument. Default: 10000. Set to 0 to disable. */\n maxStringLength?: number;\n /** When true, agent-initiated calls trigger ctx.awaitHuman() before execution. */\n requireApproval?: boolean;\n /** Lifecycle hooks: before/after the handler. */\n hooks?: ToolHooks<z.infer<TInput>, TOutput>;\n};\n\n/** A defined tool instance */\nexport type Tool<TInput extends z.ZodType = z.ZodType, TOutput = unknown> = {\n readonly name: string;\n readonly description: string;\n readonly inputSchema: TInput;\n readonly sensitive: boolean;\n readonly retry: RetryPolicy;\n readonly requireApproval: boolean;\n readonly hooks?: ToolHooks<z.infer<TInput>, TOutput>;\n /** Run the tool directly from workflow code */\n run(ctx: WorkflowContext, input: z.infer<TInput>): Promise<TOutput>;\n /** Execute the handler (internal use — includes retry logic) */\n _execute(input: z.infer<TInput>, ctx?: WorkflowContext): Promise<TOutput>;\n};\n\nconst DEFAULT_MAX_STRING_LENGTH = 10_000;\n\n/**\n * Recursively validate string lengths in parsed tool arguments.\n * Throws if any string exceeds the configured max length.\n */\nfunction validateStringLengths(value: unknown, maxLen: number, path = ''): void {\n if (typeof value === 'string') {\n if (value.length > maxLen) {\n throw new Error(\n `String argument${path ? ` at \"${path}\"` : ''} exceeds maximum length (${value.length} > ${maxLen})`,\n );\n }\n } else if (Array.isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n validateStringLengths(value[i], maxLen, path ? `${path}[${i}]` : `[${i}]`);\n }\n } else if (value !== null && typeof value === 'object') {\n for (const [key, val] of Object.entries(value)) {\n validateStringLengths(val, maxLen, path ? `${path}.${key}` : key);\n }\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction getBackoffMs(attempt: number, strategy: 'none' | 'linear' | 'exponential'): number {\n switch (strategy) {\n case 'none':\n return 0;\n case 'linear':\n return attempt * 1000;\n case 'exponential':\n return Math.pow(2, attempt - 1) * 1000;\n }\n}\n\n/**\n * Define a tool with Zod-validated input, a handler function, and optional retry policy.\n * @param config - Tool configuration: name, description, input schema, handler, retry, and sensitivity options.\n * @returns A Tool instance that can be attached to agents and invoked via `tool.run()` or agent tool calling.\n */\nexport function tool<TInput extends z.ZodType, TOutput = unknown>(\n config: ToolConfig<TInput, TOutput>,\n): Tool<TInput, TOutput> {\n const retryPolicy: RetryPolicy = {\n attempts: config.retry?.attempts ?? 1,\n backoff: config.retry?.backoff ?? 'exponential',\n on: config.retry?.on,\n };\n\n const maxStringLen = config.maxStringLength ?? DEFAULT_MAX_STRING_LENGTH;\n\n const execute = async (input: z.infer<TInput>, ctx?: WorkflowContext): Promise<TOutput> => {\n // Validate input against schema\n const parsed = config.input.parse(input);\n\n // Enforce string length limits\n if (maxStringLen > 0) {\n validateStringLengths(parsed, maxStringLen);\n }\n\n const maxAttempts = retryPolicy.attempts ?? 1;\n\n let lastError: Error | undefined;\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n // ctx is optional on _execute but required on handler. In practice, all runtime\n // call sites (agent tool loop, tool.run) always provide ctx. The undefined case\n // only occurs when _execute is called directly in tests or internal code.\n return await config.handler(parsed, ctx as WorkflowContext);\n } catch (err) {\n lastError = err instanceof Error ? err : new Error(String(err));\n\n if (attempt === maxAttempts) break;\n\n // Check retry predicate\n if (retryPolicy.on && !retryPolicy.on(lastError as Error & { status?: number })) {\n break;\n }\n\n // Apply backoff\n const backoffMs = getBackoffMs(attempt, retryPolicy.backoff ?? 'exponential');\n if (backoffMs > 0) {\n await sleep(backoffMs);\n }\n }\n }\n\n throw lastError;\n };\n\n return {\n name: config.name,\n description: config.description,\n inputSchema: config.input,\n sensitive: config.sensitive ?? false,\n retry: retryPolicy,\n requireApproval: config.requireApproval ?? false,\n hooks: config.hooks,\n\n async run(ctx: WorkflowContext, input: z.infer<TInput>): Promise<TOutput> {\n const startTime = Date.now();\n try {\n // Apply before hook (no approval gate for direct workflow calls)\n let processedInput = input;\n if (config.hooks?.before) {\n processedInput = await config.hooks.before(processedInput, ctx);\n }\n\n let result = await execute(processedInput, ctx);\n\n // Apply after hook\n if (config.hooks?.after) {\n result = await config.hooks.after(result, ctx);\n }\n\n ctx.log('tool_call_complete', {\n tool: config.name,\n duration: Date.now() - startTime,\n });\n return result;\n } catch (err) {\n ctx.log('tool_call_error', {\n tool: config.name,\n error: err instanceof Error ? err.message : String(err),\n duration: Date.now() - startTime,\n });\n throw err;\n }\n },\n\n _execute: execute,\n };\n}\n","import type { ChatMessage, ProviderResponse, ToolCallMessage } from '../types.js';\n\n// Re-export for convenience\nexport type { ChatMessage, ProviderResponse, ToolCallMessage };\n\n/**\n * Tool definition in OpenAI-compatible format.\n * All providers normalize to this format internally.\n */\nexport type ToolDefinition = {\n type: 'function';\n function: {\n name: string;\n description: string;\n parameters: unknown; // JSON Schema\n strict?: boolean;\n };\n};\n\n/**\n * Unified effort level controlling how thoroughly the model responds.\n *\n * - `'none'` — Disable thinking/reasoning. On Gemini 3.x, maps to the model's\n * minimum thinking level (3.1 Pro: 'low', others: 'minimal'). On other providers,\n * fully disables reasoning.\n * - `'low'` through `'max'` — Increasing levels of reasoning depth and token spend.\n *\n * Provider mapping:\n * - Anthropic 4.6: adaptive thinking + output_config.effort\n * - Anthropic Opus 4.5: output_config.effort (no adaptive)\n * - Anthropic older: thinking.budget_tokens fallback\n * - OpenAI o-series: reasoning_effort\n * - OpenAI GPT-5.x: reasoning.effort / reasoning_effort\n * - Gemini 3.x: thinkingLevel (`'none'` → model min: `'minimal'` or `'low'` for 3.1 Pro)\n * - Gemini 2.x: thinkingBudget (`'none'` → 0; some models have minimums)\n */\nexport type Effort = 'none' | 'low' | 'medium' | 'high' | 'max';\n\n/** Tool choice strategy for LLM calls. */\nexport type ToolChoice =\n | 'auto'\n | 'none'\n | 'required'\n | { type: 'function'; function: { name: string } };\n\n/**\n * Options passed to provider chat/stream calls.\n */\nexport type ChatOptions = {\n model: string;\n temperature?: number;\n tools?: ToolDefinition[];\n maxTokens?: number;\n responseFormat?: ResponseFormat;\n stop?: string[];\n signal?: AbortSignal;\n /** How hard should the model try? Primary param for cost/quality tradeoff.\n * 'none' disables thinking/reasoning (Gemini 3.x: maps to minimal).\n * Omit to use provider defaults. */\n effort?: Effort;\n /** Precise thinking token budget (advanced). When set alongside `effort`, overrides the\n * thinking/reasoning allocation. On Anthropic 4.6, `effort` still controls output quality\n * independently. On all other providers, `thinkingBudget` fully overrides `effort` for\n * reasoning behavior. Set to 0 to disable thinking while keeping effort for output control\n * (Anthropic-specific optimization; on other providers, simply disables reasoning). */\n thinkingBudget?: number;\n /** Show reasoning summaries in responses (thinking_content / thinking_delta).\n * Supported on OpenAI Responses API and Gemini. No-op on Anthropic. */\n includeThoughts?: boolean;\n toolChoice?: ToolChoice;\n /** Provider-specific options merged LAST into the raw API request body.\n * Can override any computed field including model and messages — use with care.\n * NOT portable across providers — use effort/thinkingBudget/includeThoughts for cross-provider behavior. */\n providerOptions?: Record<string, unknown>;\n};\n\n/**\n * Response format for structured output (JSON mode).\n */\nexport type ResponseFormat =\n | { type: 'text' }\n | { type: 'json_object' }\n | { type: 'json_schema'; json_schema: { name: string; strict?: boolean; schema: unknown } };\n\n/**\n * Chunks emitted during streaming.\n */\nexport type StreamChunk =\n | { type: 'text_delta'; content: string }\n | { type: 'thinking_delta'; content: string }\n | { type: 'tool_call_delta'; id: string; name?: string; arguments?: string }\n | {\n type: 'done';\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n reasoning_tokens?: number;\n cached_tokens?: number;\n };\n /** Estimated cost in USD for this call, computed the same way as ProviderResponse.cost. */\n cost?: number;\n /** Provider-specific opaque metadata (e.g. raw Gemini parts with thought signatures). */\n providerMetadata?: Record<string, unknown>;\n };\n\n/**\n * Core provider interface. Every LLM adapter must implement this.\n */\nexport interface Provider {\n /** Human-readable name for the provider (e.g. \"openai\", \"anthropic\") */\n readonly name?: string;\n\n /**\n * Send a chat completion request and return the full response.\n */\n chat(messages: ChatMessage[], options: ChatOptions): Promise<ProviderResponse>;\n\n /**\n * Stream a chat completion, yielding chunks as they arrive.\n */\n stream(messages: ChatMessage[], options: ChatOptions): AsyncGenerator<StreamChunk>;\n}\n\n/**\n * Alias for Provider. Used for backward compatibility with index.ts exports.\n */\nexport type ProviderAdapter = Provider;\n\n/** Normalized thinking options computed once, used by all providers. */\nexport type ResolvedThinkingOptions = {\n /** Raw effort value from user. */\n effort: Effort | undefined;\n /** Raw thinking budget from user. */\n thinkingBudget: number | undefined;\n /** Whether to include thought summaries in responses. */\n includeThoughts: boolean;\n /** True when thinking/reasoning should be disabled (effort: 'none' or thinkingBudget: 0). */\n thinkingDisabled: boolean;\n /** Effort level with 'none' stripped (undefined when effort is 'none' or unset). */\n activeEffort: Exclude<Effort, 'none'> | undefined;\n /** True when an explicit positive budget overrides effort-based allocation. */\n hasBudgetOverride: boolean;\n};\n\n/** Resolve effort/thinkingBudget/includeThoughts into normalized form.\n * Validates inputs and computes derived flags used by all provider adapters. */\nexport function resolveThinkingOptions(\n options: Pick<ChatOptions, 'effort' | 'thinkingBudget' | 'includeThoughts'>,\n): ResolvedThinkingOptions {\n if (options.thinkingBudget !== undefined && options.thinkingBudget < 0) {\n throw new Error(`thinkingBudget must be non-negative, got ${options.thinkingBudget}`);\n }\n const effort = options.effort;\n const thinkingBudget = options.thinkingBudget;\n const hasBudgetOverride = thinkingBudget !== undefined && thinkingBudget > 0;\n return {\n effort,\n thinkingBudget,\n includeThoughts: options.includeThoughts ?? false,\n // Budget override wins: effort: 'none' + thinkingBudget: 5000 → thinking enabled\n thinkingDisabled: (effort === 'none' || thinkingBudget === 0) && !hasBudgetOverride,\n activeEffort: effort && effort !== 'none' ? effort : undefined,\n hasBudgetOverride,\n };\n}\n","/**\n * Retry wrapper for provider fetch calls.\n * Retries on rate-limit (429) and transient server errors (503, 529)\n * with exponential backoff, jitter, and Retry-After header support.\n */\n\nconst RETRYABLE_STATUS_CODES = new Set([429, 503, 529]);\nconst MAX_RETRIES = 2; // 3 total attempts\nconst BASE_DELAY_MS = 1000;\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve) => {\n if (signal?.aborted) {\n resolve();\n return;\n }\n const timer = setTimeout(resolve, ms);\n signal?.addEventListener(\n 'abort',\n () => {\n clearTimeout(timer);\n resolve();\n },\n { once: true },\n );\n });\n}\n\n/**\n * Wrapper around fetch that retries on rate-limit and transient server errors\n * (429, 503, 529) with exponential backoff and jitter.\n * Returns the response as-is for non-retryable errors or after exhausting retries.\n */\nexport async function fetchWithRetry(\n input: string | URL,\n init?: RequestInit,\n maxRetries = MAX_RETRIES,\n): Promise<Response> {\n for (let attempt = 0; ; attempt++) {\n const res = await fetch(input, init);\n\n // Return immediately if OK, non-retryable, or out of retries\n if (res.ok || !RETRYABLE_STATUS_CODES.has(res.status) || attempt >= maxRetries) {\n return res;\n }\n\n // Don't retry if aborted\n if (init?.signal?.aborted) {\n return res;\n }\n\n // Calculate delay: respect Retry-After header, else exponential backoff\n const retryAfter = res.headers.get('retry-after');\n let delay: number;\n if (retryAfter && !isNaN(Number(retryAfter))) {\n delay = Number(retryAfter) * 1000;\n } else {\n delay = BASE_DELAY_MS * 2 ** attempt;\n }\n // Jitter: +/-25%\n delay *= 0.75 + Math.random() * 0.5;\n\n await sleep(delay, init?.signal ?? undefined);\n }\n}\n","import type {\n Provider,\n ChatOptions,\n ChatMessage,\n ProviderResponse,\n StreamChunk,\n Effort,\n} from './types.js';\nimport { resolveThinkingOptions } from './types.js';\nimport { fetchWithRetry } from './retry.js';\n\n// ---------------------------------------------------------------------------\n// Approximate per-token pricing (USD) for common OpenAI models.\n// Format: [promptCostPerToken, completionCostPerToken, cacheMultiplier]\n// cacheMultiplier is the fraction of input rate charged for cached tokens.\n// These are approximations for budget estimation, not billing.\n// Actual pricing may differ; check OpenAI's pricing page for current rates.\n// ---------------------------------------------------------------------------\n\nexport const OPENAI_PRICING: Record<string, [number, number, number]> = {\n // gpt-4o era — cache reads at 50% of input rate\n 'gpt-4o': [2.5e-6, 10e-6, 0.5],\n 'gpt-4o-mini': [0.15e-6, 0.6e-6, 0.5],\n 'gpt-4-turbo': [10e-6, 30e-6, 0.5],\n 'gpt-4': [30e-6, 60e-6, 0.5],\n 'gpt-3.5-turbo': [0.5e-6, 1.5e-6, 0.5],\n o1: [15e-6, 60e-6, 0.5],\n 'o1-mini': [3e-6, 12e-6, 0.5],\n 'o1-pro': [150e-6, 600e-6, 0.5],\n // gpt-4.1 / o3 / o4 era — cache reads at 25% of input rate\n 'gpt-4.1': [2e-6, 8e-6, 0.25],\n 'gpt-4.1-mini': [0.4e-6, 1.6e-6, 0.25],\n 'gpt-4.1-nano': [0.1e-6, 0.4e-6, 0.25],\n o3: [10e-6, 40e-6, 0.25],\n 'o3-mini': [1.1e-6, 4.4e-6, 0.25],\n 'o3-pro': [20e-6, 80e-6, 0.25],\n 'o4-mini': [1.1e-6, 4.4e-6, 0.25],\n // gpt-5 era — cache reads at 10% of input rate\n 'gpt-5': [1.25e-6, 10e-6, 0.1],\n 'gpt-5-mini': [0.25e-6, 2e-6, 0.1],\n 'gpt-5-nano': [0.05e-6, 0.4e-6, 0.1],\n 'gpt-5.1': [1.25e-6, 10e-6, 0.1],\n 'gpt-5.2': [1.75e-6, 14e-6, 0.1],\n 'gpt-5.3': [1.75e-6, 14e-6, 0.1],\n 'gpt-5.4': [2.5e-6, 15e-6, 0.1],\n 'gpt-5.4-pro': [30e-6, 180e-6, 0.1],\n};\n\n// Pre-sorted keys for prefix matching (longest first so \"gpt-5-mini\" matches before \"gpt-5\")\nconst PRICING_KEYS_BY_LENGTH = Object.keys(OPENAI_PRICING).sort((a, b) => b.length - a.length);\n\nexport function estimateOpenAICost(\n model: string,\n promptTokens: number,\n completionTokens: number,\n cachedTokens?: number,\n): number {\n // Try exact match first, then longest-prefix match for versioned models (e.g. gpt-4o-2024-05-13)\n let pricing = OPENAI_PRICING[model];\n if (!pricing) {\n for (const key of PRICING_KEYS_BY_LENGTH) {\n if (model.startsWith(key)) {\n pricing = OPENAI_PRICING[key];\n break;\n }\n }\n }\n if (!pricing) return 0;\n\n const [inputRate, outputRate, cacheMultiplier] = pricing;\n const cached = cachedTokens ?? 0;\n const inputCost = (promptTokens - cached) * inputRate + cached * inputRate * cacheMultiplier;\n return inputCost + completionTokens * outputRate;\n}\n\n/** Returns true for o-series models (o1, o3, o4-mini) that always reason. */\nexport function isOSeriesModel(model: string): boolean {\n return /^(o1|o3|o4-mini)/.test(model);\n}\n\n/** Returns true for models that accept reasoning_effort. */\nexport function supportsReasoningEffort(model: string): boolean {\n return isOSeriesModel(model) || /^gpt-5/.test(model);\n}\n\nexport type ReasoningEffort = 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh';\n\n/** Returns true for models that support reasoning_effort: 'none' (gpt-5.1+). */\nexport function supportsReasoningNone(model: string): boolean {\n return /^gpt-5\\.[1-9]/.test(model);\n}\n\n/**\n * Returns true for models that support reasoning_effort: 'xhigh'.\n * Per OpenAI docs: \"xhigh is supported for all models after gpt-5.1-codex-max.\"\n * This means gpt-5.2+ (gpt-5.1 itself does NOT support xhigh).\n */\nexport function supportsXhigh(model: string): boolean {\n // gpt-5.2+ — models after gpt-5.1-codex-max\n return /^gpt-5\\.([2-9]|\\d{2,})/.test(model);\n}\n\n/**\n * Clamp reasoning_effort to model-supported range.\n *\n * Model constraints (from OpenAI API reference):\n * - gpt-5-pro: only supports 'high'\n * - gpt-5.1+: supports 'none', 'low', 'medium', 'high'\n * - Pre-gpt-5.1 (o-series, gpt-5, gpt-5-mini, gpt-5-nano): no 'none', default 'medium'\n * - xhigh: only models after gpt-5.1-codex-max (gpt-5.2+)\n */\nexport function clampReasoningEffort(model: string, effort: ReasoningEffort): ReasoningEffort {\n // gpt-5-pro only supports 'high'\n if (model.startsWith('gpt-5-pro')) return 'high';\n\n // 'none' only supported on gpt-5.1+; clamp to 'minimal' (closest to 'none')\n if (effort === 'none' && !supportsReasoningNone(model)) return 'minimal';\n\n // 'xhigh' only supported on gpt-5.2+\n if (effort === 'xhigh' && !supportsXhigh(model)) return 'high';\n\n return effort;\n}\n\n/** Map Effort to OpenAI reasoning_effort wire value. */\nexport function effortToReasoningEffort(effort: Exclude<Effort, 'none'>): ReasoningEffort {\n return effort === 'max' ? 'xhigh' : effort;\n}\n\n/** Map budgetTokens to nearest OpenAI reasoning_effort. */\nexport function budgetToReasoningEffort(budget: number): ReasoningEffort {\n if (budget <= 1024) return 'low';\n if (budget <= 8192) return 'medium';\n return 'high';\n}\n\n/**\n * OpenAI-compatible provider using raw fetch (no SDK dependency).\n *\n * Supports:\n * - Chat completions\n * - Tool calling\n * - Streaming via SSE\n * - Structured output via response_format (JSON mode / JSON schema)\n * - Reasoning models (o1/o3/o4-mini) with developer role and reasoning_effort\n */\nexport class OpenAIProvider implements Provider {\n readonly name = 'openai';\n private baseUrl: string;\n private apiKey: string;\n\n constructor(options: { apiKey?: string; baseUrl?: string } = {}) {\n this.apiKey = options.apiKey ?? process.env.OPENAI_API_KEY ?? '';\n this.baseUrl = (\n options.baseUrl ??\n process.env.OPENAI_BASE_URL ??\n 'https://api.openai.com/v1'\n ).replace(/\\/$/, '');\n\n if (!this.apiKey) {\n throw new Error('OpenAI API key is required. Set OPENAI_API_KEY or pass apiKey in options.');\n }\n }\n\n // ---------------------------------------------------------------------------\n // chat - non-streaming completion\n // ---------------------------------------------------------------------------\n\n async chat(messages: ChatMessage[], options: ChatOptions): Promise<ProviderResponse> {\n const body = this.buildRequestBody(messages, options, false);\n\n const res = await fetchWithRetry(`${this.baseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(body),\n signal: options.signal,\n });\n\n if (!res.ok) {\n const errorBody = await res.text();\n const message = this.extractErrorMessage(errorBody, res.status);\n throw new Error(message);\n }\n\n const json = (await res.json()) as OpenAIChatResponse;\n const choice = json.choices[0];\n\n const usage = json.usage\n ? {\n prompt_tokens: json.usage.prompt_tokens,\n completion_tokens: json.usage.completion_tokens,\n total_tokens: json.usage.total_tokens,\n reasoning_tokens: json.usage.completion_tokens_details?.reasoning_tokens,\n cached_tokens: json.usage.prompt_tokens_details?.cached_tokens,\n }\n : undefined;\n\n const cost = usage\n ? estimateOpenAICost(\n options.model,\n usage.prompt_tokens,\n usage.completion_tokens,\n usage.cached_tokens,\n )\n : undefined;\n\n return {\n content: choice.message.content ?? '',\n tool_calls: choice.message.tool_calls?.map((tc) => ({\n id: tc.id,\n type: 'function' as const,\n function: {\n name: tc.function.name,\n arguments: tc.function.arguments,\n },\n })),\n usage,\n cost,\n };\n }\n\n // ---------------------------------------------------------------------------\n // stream - SSE streaming completion\n // ---------------------------------------------------------------------------\n\n async *stream(messages: ChatMessage[], options: ChatOptions): AsyncGenerator<StreamChunk> {\n const body = this.buildRequestBody(messages, options, true);\n\n const res = await fetchWithRetry(`${this.baseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(body),\n signal: options.signal,\n });\n\n if (!res.ok) {\n const errorBody = await res.text();\n const message = this.extractErrorMessage(errorBody, res.status);\n throw new Error(message);\n }\n\n if (!res.body) {\n throw new Error('OpenAI stream response has no body');\n }\n\n yield* this.parseSSEStream(res.body, options.model);\n }\n\n // ---------------------------------------------------------------------------\n // Internal helpers\n // ---------------------------------------------------------------------------\n\n private buildRequestBody(\n messages: ChatMessage[],\n options: ChatOptions,\n stream: boolean,\n ): Record<string, unknown> {\n const oSeries = isOSeriesModel(options.model);\n const reasoningCapable = supportsReasoningEffort(options.model);\n const { thinkingBudget, thinkingDisabled, activeEffort, hasBudgetOverride } =\n resolveThinkingOptions(options);\n\n // Compute effective reasoning effort for OpenAI wire format\n let wireEffort: ReasoningEffort | undefined;\n if (reasoningCapable) {\n if (hasBudgetOverride) {\n // Explicit budget always takes precedence (consistent with Anthropic/Gemini)\n wireEffort = clampReasoningEffort(options.model, budgetToReasoningEffort(thinkingBudget!));\n } else if (!thinkingDisabled && activeEffort) {\n wireEffort = clampReasoningEffort(options.model, effortToReasoningEffort(activeEffort));\n } else if (thinkingDisabled) {\n // Disable reasoning: covers both effort='none' and thinkingBudget=0\n wireEffort = clampReasoningEffort(options.model, 'none');\n }\n }\n\n // Temperature: always strip for o-series; for GPT-5.x, strip only when reasoning active\n const stripTemp = oSeries || (reasoningCapable && wireEffort !== undefined);\n\n const body: Record<string, unknown> = {\n model: options.model,\n messages: messages.map((m) => this.formatMessage(m, oSeries)),\n stream,\n };\n\n if (options.temperature !== undefined && !stripTemp) {\n body.temperature = options.temperature;\n }\n\n // Use max_completion_tokens instead of deprecated max_tokens\n if (options.maxTokens !== undefined) {\n body.max_completion_tokens = options.maxTokens;\n }\n\n if (options.stop) body.stop = options.stop;\n\n if (options.tools && options.tools.length > 0) {\n body.tools = options.tools;\n // o-series models don't support parallel_tool_calls; GPT-5.x and others do\n if (!oSeries) {\n body.parallel_tool_calls = true;\n }\n }\n\n if (options.toolChoice !== undefined) {\n body.tool_choice = options.toolChoice;\n }\n\n if (options.responseFormat) {\n body.response_format = options.responseFormat;\n }\n\n if (wireEffort) body.reasoning_effort = wireEffort;\n\n if (stream) {\n body.stream_options = { include_usage: true };\n }\n\n if (options.providerOptions) {\n Object.assign(body, options.providerOptions);\n }\n\n return body;\n }\n\n /** Extract a human-readable message from an API error response body. */\n private extractErrorMessage(body: string, status: number): string {\n try {\n const json = JSON.parse(body) as { error?: { message?: string; type?: string } };\n if (json.error?.message) {\n return `OpenAI API error (${status}): ${json.error.message}`;\n }\n } catch {\n // Not JSON, use raw body\n }\n return `OpenAI API error (${status}): ${body}`;\n }\n\n private formatMessage(msg: ChatMessage, oSeries: boolean): Record<string, unknown> {\n const out: Record<string, unknown> = {\n role: msg.role === 'system' && oSeries ? 'developer' : msg.role,\n content: msg.content,\n };\n if (msg.name) out.name = msg.name;\n if (msg.tool_calls) out.tool_calls = msg.tool_calls;\n if (msg.tool_call_id) out.tool_call_id = msg.tool_call_id;\n return out;\n }\n\n private async *parseSSEStream(\n body: ReadableStream<Uint8Array>,\n model: string,\n ): AsyncGenerator<StreamChunk> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n let usageData:\n | {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n reasoning_tokens?: number;\n cached_tokens?: number;\n }\n | undefined;\n\n // Map tool call index -> id, so we can associate streamed deltas that\n // arrive before the id field with the correct tool call once the id appears.\n const indexToId = new Map<number, string>();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n // Keep the last potentially-incomplete line in the buffer\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(':')) continue;\n\n if (trimmed === 'data: [DONE]') {\n yield {\n type: 'done',\n usage: usageData,\n cost: usageData\n ? estimateOpenAICost(\n model,\n usageData.prompt_tokens,\n usageData.completion_tokens,\n usageData.cached_tokens,\n )\n : undefined,\n };\n return;\n }\n\n if (trimmed.startsWith('data: ')) {\n const jsonStr = trimmed.slice(6);\n let parsed: OpenAIStreamChunk;\n try {\n parsed = JSON.parse(jsonStr) as OpenAIStreamChunk;\n } catch {\n continue; // Skip malformed JSON\n }\n\n // Capture usage from the final chunk if present\n if (parsed.usage) {\n usageData = {\n prompt_tokens: parsed.usage.prompt_tokens,\n completion_tokens: parsed.usage.completion_tokens,\n total_tokens: parsed.usage.total_tokens,\n reasoning_tokens: parsed.usage.completion_tokens_details?.reasoning_tokens,\n cached_tokens: parsed.usage.prompt_tokens_details?.cached_tokens,\n };\n continue;\n }\n\n const delta = parsed.choices?.[0]?.delta;\n if (!delta) continue;\n\n // Text content\n if (delta.content) {\n yield { type: 'text_delta', content: delta.content };\n }\n\n // Tool call deltas\n if (delta.tool_calls) {\n for (const tc of delta.tool_calls) {\n // Track id by index so subsequent deltas without an id\n // map to the correct tool call\n if (tc.id) {\n indexToId.set(tc.index, tc.id);\n }\n const id = indexToId.get(tc.index) ?? `__pending_${tc.index}`;\n yield {\n type: 'tool_call_delta',\n id,\n name: tc.function?.name,\n arguments: tc.function?.arguments,\n };\n }\n }\n }\n }\n }\n\n // If we exit the loop without a [DONE], still emit done with whatever usage we have\n yield {\n type: 'done',\n usage: usageData,\n cost: usageData\n ? estimateOpenAICost(\n model,\n usageData.prompt_tokens,\n usageData.completion_tokens,\n usageData.cached_tokens,\n )\n : undefined,\n };\n } finally {\n reader.releaseLock();\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// OpenAI API response types (internal)\n// ---------------------------------------------------------------------------\n\ntype OpenAIChatResponse = {\n choices: Array<{\n message: {\n content: string | null;\n tool_calls?: Array<{\n id: string;\n type: 'function';\n function: { name: string; arguments: string };\n }>;\n };\n finish_reason: string;\n }>;\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n completion_tokens_details?: {\n reasoning_tokens?: number;\n };\n prompt_tokens_details?: {\n cached_tokens?: number;\n };\n };\n};\n\ntype OpenAIStreamChunk = {\n choices?: Array<{\n delta: {\n content?: string;\n tool_calls?: Array<{\n index: number;\n id?: string;\n function?: { name?: string; arguments?: string };\n }>;\n };\n finish_reason: string | null;\n }>;\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n completion_tokens_details?: {\n reasoning_tokens?: number;\n };\n prompt_tokens_details?: {\n cached_tokens?: number;\n };\n };\n};\n","import type { Provider, ChatOptions, ChatMessage, ProviderResponse, StreamChunk } from './types.js';\nimport {\n estimateOpenAICost,\n isOSeriesModel,\n supportsReasoningEffort,\n effortToReasoningEffort,\n budgetToReasoningEffort,\n clampReasoningEffort,\n} from './openai.js';\nimport type { ReasoningEffort } from './openai.js';\nimport { resolveThinkingOptions } from './types.js';\nimport { fetchWithRetry } from './retry.js';\n\n/**\n * OpenAI Responses API provider using raw fetch (no SDK dependency).\n *\n * Maps the standard Provider interface to OpenAI's Responses API (`POST /v1/responses`).\n * The Responses API is OpenAI's recommended path forward with better caching,\n * built-in tools, and native reasoning support.\n */\nexport class OpenAIResponsesProvider implements Provider {\n readonly name = 'openai-responses';\n private baseUrl: string;\n private apiKey: string;\n\n constructor(options: { apiKey?: string; baseUrl?: string } = {}) {\n this.apiKey = options.apiKey ?? process.env.OPENAI_API_KEY ?? '';\n this.baseUrl = (\n options.baseUrl ??\n process.env.OPENAI_BASE_URL ??\n 'https://api.openai.com/v1'\n ).replace(/\\/$/, '');\n\n if (!this.apiKey) {\n throw new Error('OpenAI API key is required. Set OPENAI_API_KEY or pass apiKey in options.');\n }\n }\n\n // ---------------------------------------------------------------------------\n // chat - non-streaming\n // ---------------------------------------------------------------------------\n\n async chat(messages: ChatMessage[], options: ChatOptions): Promise<ProviderResponse> {\n const body = this.buildRequestBody(messages, options, false);\n\n const res = await fetchWithRetry(`${this.baseUrl}/responses`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(body),\n signal: options.signal,\n });\n\n if (!res.ok) {\n const errorBody = await res.text();\n const message = this.extractErrorMessage(errorBody, res.status);\n throw new Error(message);\n }\n\n const json = (await res.json()) as ResponsesAPIResponse;\n return this.parseResponse(json, options.model);\n }\n\n // ---------------------------------------------------------------------------\n // stream - SSE streaming\n // ---------------------------------------------------------------------------\n\n async *stream(messages: ChatMessage[], options: ChatOptions): AsyncGenerator<StreamChunk> {\n const body = this.buildRequestBody(messages, options, true);\n\n const res = await fetchWithRetry(`${this.baseUrl}/responses`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(body),\n signal: options.signal,\n });\n\n if (!res.ok) {\n const errorBody = await res.text();\n const message = this.extractErrorMessage(errorBody, res.status);\n throw new Error(message);\n }\n\n if (!res.body) {\n throw new Error('OpenAI Responses stream has no body');\n }\n\n yield* this.parseSSEStream(res.body, options.model);\n }\n\n // ---------------------------------------------------------------------------\n // Internal: build request body\n // ---------------------------------------------------------------------------\n\n private buildRequestBody(\n messages: ChatMessage[],\n options: ChatOptions,\n stream: boolean,\n ): Record<string, unknown> {\n const oSeries = isOSeriesModel(options.model);\n const reasoningCapable = supportsReasoningEffort(options.model);\n const { thinkingBudget, includeThoughts, thinkingDisabled, activeEffort, hasBudgetOverride } =\n resolveThinkingOptions(options);\n\n // Compute effective reasoning effort for wire format\n let wireEffort: ReasoningEffort | undefined;\n if (reasoningCapable) {\n if (hasBudgetOverride) {\n // Explicit budget always takes precedence (consistent with Anthropic/Gemini)\n wireEffort = clampReasoningEffort(options.model, budgetToReasoningEffort(thinkingBudget!));\n } else if (!thinkingDisabled && activeEffort) {\n wireEffort = clampReasoningEffort(options.model, effortToReasoningEffort(activeEffort));\n } else if (thinkingDisabled) {\n // Disable reasoning: covers both effort='none' and thinkingBudget=0\n wireEffort = clampReasoningEffort(options.model, 'none');\n }\n }\n\n // Temperature: always strip for o-series; for GPT-5.x, strip only when reasoning active\n const stripTemp = oSeries || (reasoningCapable && wireEffort !== undefined);\n\n // Extract system messages → instructions\n const systemMessages = messages.filter((m) => m.role === 'system');\n const nonSystemMessages = messages.filter((m) => m.role !== 'system');\n\n const body: Record<string, unknown> = {\n model: options.model,\n input: this.buildInput(nonSystemMessages),\n store: false,\n stream,\n };\n\n if (systemMessages.length > 0) {\n body.instructions = systemMessages.map((m) => m.content).join('\\n');\n }\n\n if (options.maxTokens !== undefined) {\n body.max_output_tokens = options.maxTokens;\n }\n\n if (options.temperature !== undefined && !stripTemp) {\n body.temperature = options.temperature;\n }\n\n if (options.tools && options.tools.length > 0) {\n body.tools = options.tools.map((t) => ({\n type: 'function' as const,\n name: t.function.name,\n description: t.function.description,\n parameters: t.function.parameters,\n ...(t.function.strict !== undefined ? { strict: t.function.strict } : {}),\n }));\n }\n\n if (options.toolChoice !== undefined) {\n if (typeof options.toolChoice === 'object' && 'function' in options.toolChoice) {\n body.tool_choice = { type: 'function', name: options.toolChoice.function.name };\n } else {\n body.tool_choice = options.toolChoice;\n }\n }\n\n // Build reasoning config for models that support it\n if (reasoningCapable && (wireEffort !== undefined || includeThoughts)) {\n const reasoning: Record<string, unknown> = {};\n if (wireEffort !== undefined) reasoning.effort = wireEffort;\n if (includeThoughts) reasoning.summary = 'detailed';\n if (Object.keys(reasoning).length > 0) body.reasoning = reasoning;\n }\n\n // Request encrypted reasoning content for round-tripping\n if (reasoningCapable) {\n body.include = ['reasoning.encrypted_content'];\n }\n\n if (options.responseFormat) {\n body.text = { format: this.mapResponseFormat(options.responseFormat) };\n }\n\n if (options.providerOptions) {\n Object.assign(body, options.providerOptions);\n }\n\n return body;\n }\n\n // ---------------------------------------------------------------------------\n // Internal: message → input mapping\n // ---------------------------------------------------------------------------\n\n private buildInput(messages: ChatMessage[]): ResponsesInputItem[] {\n const input: ResponsesInputItem[] = [];\n\n for (const msg of messages) {\n if (msg.role === 'tool') {\n input.push({\n type: 'function_call_output',\n call_id: msg.tool_call_id ?? '',\n output: msg.content,\n });\n } else if (msg.role === 'assistant' && msg.tool_calls && msg.tool_calls.length > 0) {\n // Inject reasoning items from providerMetadata if present (round-trip)\n const reasoningItems = msg.providerMetadata?.openaiReasoningItems as\n | ResponsesInputItem[]\n | undefined;\n if (reasoningItems) {\n for (const item of reasoningItems) {\n input.push(item);\n }\n }\n\n if (msg.content) {\n input.push({ type: 'message', role: 'assistant', content: msg.content });\n }\n for (const tc of msg.tool_calls) {\n input.push({\n type: 'function_call',\n call_id: tc.id,\n name: tc.function.name,\n arguments: tc.function.arguments,\n });\n }\n } else if (msg.role === 'user' || msg.role === 'assistant') {\n // Inject reasoning items for assistant messages without tool calls too\n if (msg.role === 'assistant' && msg.providerMetadata?.openaiReasoningItems) {\n const reasoningItems = msg.providerMetadata.openaiReasoningItems as ResponsesInputItem[];\n for (const item of reasoningItems) {\n input.push(item);\n }\n }\n\n input.push({\n type: 'message',\n role: msg.role,\n content: msg.content,\n });\n }\n }\n\n return input;\n }\n\n // ---------------------------------------------------------------------------\n // Internal: map responseFormat to Responses API text.format\n // ---------------------------------------------------------------------------\n\n /**\n * The Responses API uses `text.format` instead of `response_format`.\n * For `json_schema`, the schema fields are flattened into the format object\n * rather than nested under a `json_schema` key.\n *\n * Chat Completions: `{ type: \"json_schema\", json_schema: { name, strict, schema } }`\n * Responses API: `{ type: \"json_schema\", name, strict, schema }`\n */\n private mapResponseFormat(\n format: NonNullable<ChatOptions['responseFormat']>,\n ): Record<string, unknown> {\n if (format.type === 'json_schema' && 'json_schema' in format) {\n const { json_schema, ...rest } = format;\n return { ...rest, ...json_schema };\n }\n return format;\n }\n\n // ---------------------------------------------------------------------------\n // Internal: parse non-streaming response\n // ---------------------------------------------------------------------------\n\n private parseResponse(json: ResponsesAPIResponse, model: string): ProviderResponse {\n let content = '';\n let thinkingContent = '';\n const toolCalls: ProviderResponse['tool_calls'] = [];\n const reasoningItems: unknown[] = [];\n\n for (const item of json.output) {\n if (item.type === 'message') {\n for (const part of item.content ?? []) {\n if (part.type === 'output_text') {\n content += part.text;\n }\n }\n } else if (item.type === 'function_call') {\n toolCalls.push({\n id: item.call_id,\n type: 'function',\n function: {\n name: item.name,\n arguments: item.arguments,\n },\n });\n } else if (item.type === 'reasoning') {\n // Capture reasoning items for round-tripping via providerMetadata\n reasoningItems.push(item);\n // Extract summary text if present\n if (item.summary) {\n for (const s of item.summary) {\n if (s.type === 'summary_text' && s.text) {\n thinkingContent += s.text;\n }\n }\n }\n }\n }\n\n const usage = json.usage\n ? {\n prompt_tokens: json.usage.input_tokens,\n completion_tokens: json.usage.output_tokens,\n total_tokens: json.usage.total_tokens,\n reasoning_tokens: json.usage.output_tokens_details?.reasoning_tokens,\n cached_tokens: json.usage.input_tokens_details?.cached_tokens,\n }\n : undefined;\n\n const cost = usage\n ? estimateOpenAICost(model, usage.prompt_tokens, usage.completion_tokens, usage.cached_tokens)\n : undefined;\n\n const providerMetadata =\n reasoningItems.length > 0 ? { openaiReasoningItems: reasoningItems } : undefined;\n\n return {\n content,\n thinking_content: thinkingContent || undefined,\n tool_calls: toolCalls.length > 0 ? toolCalls : undefined,\n usage,\n cost,\n providerMetadata,\n };\n }\n\n // ---------------------------------------------------------------------------\n // Internal: parse SSE stream\n // ---------------------------------------------------------------------------\n\n private async *parseSSEStream(\n body: ReadableStream<Uint8Array>,\n model: string,\n ): AsyncGenerator<StreamChunk> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n // Track current function_call item for argument deltas\n const callIdMap = new Map<number, string>();\n // Must persist across read() calls — event: and data: lines may arrive in separate chunks\n let eventType = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(':')) continue;\n\n if (trimmed.startsWith('event: ')) {\n eventType = trimmed.slice(7);\n continue;\n }\n\n if (trimmed.startsWith('data: ')) {\n const jsonStr = trimmed.slice(6);\n let data: ResponsesStreamEventData;\n try {\n data = JSON.parse(jsonStr) as ResponsesStreamEventData;\n } catch {\n continue;\n }\n\n const chunk = this.handleStreamEvent(eventType, data, model, callIdMap);\n if (chunk) {\n yield chunk;\n // If done, exit\n if (chunk.type === 'done') return;\n }\n\n eventType = '';\n }\n }\n }\n\n // Stream ended without a completed event\n yield { type: 'done' };\n } finally {\n reader.releaseLock();\n }\n }\n\n private handleStreamEvent(\n eventType: string,\n data: ResponsesStreamEventData,\n model: string,\n callIdMap: Map<number, string>,\n ): StreamChunk | null {\n switch (eventType) {\n case 'response.output_text.delta':\n return { type: 'text_delta', content: data.delta ?? '' };\n\n case 'response.reasoning_summary_text.delta':\n return { type: 'thinking_delta', content: data.delta ?? '' };\n\n case 'response.output_item.added':\n if (data.item?.type === 'function_call') {\n const callId = data.item.call_id ?? data.item.id ?? '';\n const outputIndex = data.output_index ?? 0;\n callIdMap.set(outputIndex, callId);\n return {\n type: 'tool_call_delta',\n id: callId,\n name: data.item.name,\n };\n }\n return null;\n\n case 'response.function_call_arguments.delta': {\n const outputIndex = data.output_index ?? 0;\n const callId = callIdMap.get(outputIndex) ?? '';\n return {\n type: 'tool_call_delta',\n id: callId,\n arguments: data.delta ?? '',\n };\n }\n\n case 'response.completed': {\n const response = data.response as ResponsesAPIResponse | undefined;\n const usage = response?.usage\n ? {\n prompt_tokens: response.usage.input_tokens,\n completion_tokens: response.usage.output_tokens,\n total_tokens: response.usage.total_tokens,\n reasoning_tokens: response.usage.output_tokens_details?.reasoning_tokens,\n cached_tokens: response.usage.input_tokens_details?.cached_tokens,\n }\n : undefined;\n\n // Capture reasoning items from completed response for providerMetadata\n const reasoningItems = response?.output?.filter((item) => item.type === 'reasoning') ?? [];\n const providerMetadata =\n reasoningItems.length > 0 ? { openaiReasoningItems: reasoningItems } : undefined;\n\n return {\n type: 'done',\n usage,\n cost: usage\n ? estimateOpenAICost(\n model,\n usage.prompt_tokens,\n usage.completion_tokens,\n usage.cached_tokens,\n )\n : undefined,\n providerMetadata,\n };\n }\n\n case 'response.failed': {\n const errorMsg =\n data.response?.error?.message ??\n data.response?.status_details?.error?.message ??\n 'Unknown error';\n throw new Error(`OpenAI Responses API error: ${errorMsg}`);\n }\n\n default:\n return null;\n }\n }\n\n // ---------------------------------------------------------------------------\n // Internal: error handling\n // ---------------------------------------------------------------------------\n\n private extractErrorMessage(body: string, status: number): string {\n try {\n const json = JSON.parse(body) as { error?: { message?: string; type?: string } };\n if (json.error?.message) {\n return `OpenAI Responses API error (${status}): ${json.error.message}`;\n }\n } catch {\n // Not JSON, use raw body\n }\n return `OpenAI Responses API error (${status}): ${body}`;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Responses API types (internal)\n// ---------------------------------------------------------------------------\n\n/** Union of possible SSE event data payloads from the Responses API stream. */\ntype ResponsesStreamEventData = {\n delta?: string;\n output_index?: number;\n item?: { type: string; call_id?: string; id?: string; name?: string };\n response?: ResponsesAPIResponse & {\n error?: { message?: string };\n status_details?: { error?: { message?: string } };\n };\n};\n\ntype ResponsesInputItem =\n | { type: 'message'; role: 'user' | 'assistant'; content: string }\n | { type: 'function_call'; call_id: string; name: string; arguments: string }\n | { type: 'function_call_output'; call_id: string; output: string }\n | { type: 'reasoning'; id: string; encrypted_content: string; [key: string]: unknown };\n\ntype ResponsesAPIResponse = {\n id: string;\n output: Array<\n | {\n type: 'message';\n role: 'assistant';\n content?: Array<{ type: 'output_text'; text: string }>;\n }\n | {\n type: 'function_call';\n id: string;\n call_id: string;\n name: string;\n arguments: string;\n }\n | {\n type: 'reasoning';\n id: string;\n summary?: Array<{ type: 'summary_text'; text: string }>;\n encrypted_content?: string;\n [key: string]: unknown;\n }\n >;\n usage?: {\n input_tokens: number;\n output_tokens: number;\n total_tokens: number;\n output_tokens_details?: {\n reasoning_tokens?: number;\n };\n input_tokens_details?: {\n cached_tokens?: number;\n };\n };\n};\n","import type {\n Provider,\n ChatOptions,\n ChatMessage,\n ProviderResponse,\n StreamChunk,\n ToolDefinition,\n ToolCallMessage,\n} from './types.js';\nimport { resolveThinkingOptions } from './types.js';\nimport { fetchWithRetry } from './retry.js';\n\nconst ANTHROPIC_API_VERSION = '2023-06-01';\n\n// ---------------------------------------------------------------------------\n// Approximate per-token pricing (USD) for common Anthropic models.\n// Format: [inputCostPerToken, outputCostPerToken]\n// These are rough estimates for budget tracking; not guaranteed to be exact.\n// ---------------------------------------------------------------------------\n\nconst ANTHROPIC_PRICING: Record<string, [number, number]> = {\n 'claude-opus-4-6': [5e-6, 25e-6],\n 'claude-sonnet-4-6': [3e-6, 15e-6],\n 'claude-opus-4-5': [5e-6, 25e-6],\n 'claude-opus-4-1': [15e-6, 75e-6],\n 'claude-sonnet-4-5': [3e-6, 15e-6],\n 'claude-haiku-4-5': [1e-6, 5e-6],\n 'claude-sonnet-4': [3e-6, 15e-6],\n 'claude-opus-4': [15e-6, 75e-6],\n 'claude-3-7-sonnet': [3e-6, 15e-6],\n 'claude-3-5-sonnet': [3e-6, 15e-6],\n 'claude-3-5-haiku': [0.8e-6, 4e-6],\n 'claude-3-opus': [15e-6, 75e-6],\n 'claude-3-sonnet': [3e-6, 15e-6],\n 'claude-3-haiku': [0.25e-6, 1.25e-6],\n};\n\n/** Pre-sorted keys (longest first) for prefix matching versioned model names. */\nconst ANTHROPIC_PRICING_KEYS_BY_LENGTH = Object.keys(ANTHROPIC_PRICING).sort(\n (a, b) => b.length - a.length,\n);\n\nfunction estimateAnthropicCost(\n model: string,\n inputTokens: number,\n outputTokens: number,\n cacheReadTokens?: number,\n cacheWriteTokens?: number,\n): number {\n // Try exact match first, then prefix match for versioned models\n let pricing = ANTHROPIC_PRICING[model];\n if (!pricing) {\n for (const key of ANTHROPIC_PRICING_KEYS_BY_LENGTH) {\n if (model.startsWith(key)) {\n pricing = ANTHROPIC_PRICING[key];\n break;\n }\n }\n }\n if (!pricing) return 0;\n\n const [inputRate, outputRate] = pricing;\n const cacheRead = cacheReadTokens ?? 0;\n const cacheWrite = cacheWriteTokens ?? 0;\n // Anthropic cache reads cost 10% of base input rate (uniform across all models).\n // Cache writes cost 125% for the default 5-minute TTL, or 200% for the 1-hour TTL.\n // The API response does not distinguish between TTLs in cache_creation_input_tokens,\n // so we conservatively assume 5-minute writes (1.25x) for all cache creation tokens.\n const inputCost =\n (inputTokens - cacheRead - cacheWrite) * inputRate +\n cacheRead * inputRate * 0.1 +\n cacheWrite * inputRate * 1.25;\n return inputCost + outputTokens * outputRate;\n}\n\n/** Default thinking budget tokens for each effort level (manual mode fallback). */\nconst THINKING_BUDGETS: Record<string, number> = {\n low: 1024,\n medium: 5000,\n high: 10000,\n // 30000 (not 32000) to stay under the 32K max_tokens limit on Opus 4/4.1.\n // With auto-bump (+1024), max_tokens becomes 31024 which fits all models.\n max: 30000,\n};\n\n/**\n * Check if a model supports Anthropic's adaptive thinking mode.\n * Adaptive thinking is supported on Claude Opus 4.6 and Sonnet 4.6.\n */\nfunction supportsAdaptiveThinking(model: string): boolean {\n return model.startsWith('claude-opus-4-6') || model.startsWith('claude-sonnet-4-6');\n}\n\n/**\n * Check if a model supports effort: 'max' in adaptive thinking mode.\n * Only Opus 4.6 supports max effort. Sonnet 4.6 supports adaptive mode\n * but not the 'max' effort level.\n */\nfunction supportsMaxEffort(model: string): boolean {\n return model.startsWith('claude-opus-4-6');\n}\n\n/** Models that support output_config.effort (Opus 4.6, Sonnet 4.6, Opus 4.5). */\nfunction supportsEffort(model: string): boolean {\n return (\n model.startsWith('claude-opus-4-6') ||\n model.startsWith('claude-sonnet-4-6') ||\n model.startsWith('claude-opus-4-5')\n );\n}\n\n/**\n * Anthropic provider using raw fetch (no SDK dependency).\n *\n * Supports:\n * - Chat completions via /v1/messages\n * - Tool calling (tool_use / tool_result content blocks)\n * - Streaming via SSE\n *\n * Message mapping:\n * - \"system\" role messages are extracted and sent as the top-level `system` param\n * - \"tool\" role messages are mapped to user messages with tool_result content blocks\n * - \"assistant\" messages with tool_calls are mapped to tool_use content blocks\n */\nexport class AnthropicProvider implements Provider {\n readonly name = 'anthropic';\n private baseUrl: string;\n private apiKey: string;\n private currentModel?: string;\n\n constructor(options: { apiKey?: string; baseUrl?: string } = {}) {\n this.apiKey = options.apiKey ?? process.env.ANTHROPIC_API_KEY ?? '';\n this.baseUrl = (options.baseUrl ?? 'https://api.anthropic.com/v1').replace(/\\/$/, '');\n\n if (!this.apiKey) {\n throw new Error(\n 'Anthropic API key is required. Set ANTHROPIC_API_KEY or pass apiKey in options.',\n );\n }\n }\n\n // ---------------------------------------------------------------------------\n // chat - non-streaming completion\n // ---------------------------------------------------------------------------\n\n async chat(messages: ChatMessage[], options: ChatOptions): Promise<ProviderResponse> {\n this.currentModel = options.model;\n const body = this.buildRequestBody(messages, options, false);\n\n const res = await fetchWithRetry(`${this.baseUrl}/messages`, {\n method: 'POST',\n headers: this.buildHeaders(),\n body: JSON.stringify(body),\n signal: options.signal,\n });\n\n if (!res.ok) {\n const errorBody = await res.text();\n const message = this.extractErrorMessage(errorBody, res.status);\n throw new Error(message);\n }\n\n const json = (await res.json()) as AnthropicMessageResponse;\n return this.parseResponse(json);\n }\n\n // ---------------------------------------------------------------------------\n // stream - SSE streaming completion\n // ---------------------------------------------------------------------------\n\n async *stream(messages: ChatMessage[], options: ChatOptions): AsyncGenerator<StreamChunk> {\n const body = this.buildRequestBody(messages, options, true);\n\n const res = await fetchWithRetry(`${this.baseUrl}/messages`, {\n method: 'POST',\n headers: this.buildHeaders(),\n body: JSON.stringify(body),\n signal: options.signal,\n });\n\n if (!res.ok) {\n const errorBody = await res.text();\n const message = this.extractErrorMessage(errorBody, res.status);\n throw new Error(message);\n }\n\n if (!res.body) {\n throw new Error('Anthropic stream response has no body');\n }\n\n yield* this.parseSSEStream(res.body, options.model);\n }\n\n // ---------------------------------------------------------------------------\n // Internal: request building\n // ---------------------------------------------------------------------------\n\n private buildHeaders(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n 'anthropic-version': ANTHROPIC_API_VERSION,\n };\n }\n\n /** Extract a human-readable message from an API error response body. */\n private extractErrorMessage(body: string, status: number): string {\n try {\n const json = JSON.parse(body) as { error?: { message?: string; type?: string } };\n if (json.error?.message) {\n return `Anthropic API error (${status}): ${json.error.message}`;\n }\n } catch {\n // Not JSON, use raw body\n }\n return `Anthropic API error (${status}): ${body}`;\n }\n\n private buildRequestBody(\n messages: ChatMessage[],\n options: ChatOptions,\n stream: boolean,\n ): Record<string, unknown> {\n // Extract system messages into a single system parameter\n const systemMessages = messages.filter((m) => m.role === 'system');\n const nonSystemMessages = messages.filter((m) => m.role !== 'system');\n const systemText = systemMessages.map((m) => m.content).join('\\n\\n');\n\n const body: Record<string, unknown> = {\n model: options.model,\n messages: this.mapMessages(nonSystemMessages),\n max_tokens: options.maxTokens ?? 4096,\n stream,\n };\n\n if (systemText) {\n body.system = systemText;\n }\n\n if (options.stop) {\n body.stop_sequences = options.stop;\n }\n\n if (options.tools && options.tools.length > 0) {\n body.tools = options.tools.map((t) => this.mapToolDefinition(t));\n }\n\n if (options.toolChoice !== undefined) {\n body.tool_choice = this.mapToolChoice(options.toolChoice);\n }\n\n // Build thinking/effort config\n const { thinkingBudget, thinkingDisabled, activeEffort, hasBudgetOverride } =\n resolveThinkingOptions(options);\n let resolvedEffort = activeEffort;\n if (resolvedEffort === 'max' && !supportsMaxEffort(options.model)) {\n resolvedEffort = 'high';\n }\n\n if (hasBudgetOverride) {\n // Explicit budget → manual mode (precise override), regardless of model\n body.thinking = { type: 'enabled', budget_tokens: thinkingBudget! };\n const currentMax = body.max_tokens as number;\n if (currentMax < thinkingBudget! + 1024) {\n body.max_tokens = thinkingBudget! + 1024;\n }\n // If effort also set on a model that supports it, send output_config alongside\n if (resolvedEffort && supportsEffort(options.model)) {\n body.output_config = { effort: resolvedEffort };\n }\n } else if (thinkingDisabled) {\n // effort: 'none' or thinkingBudget: 0 → no thinking block\n // thinkingBudget: 0 + effort → standalone effort (Anthropic optimization)\n if (resolvedEffort && supportsEffort(options.model)) {\n body.output_config = { effort: resolvedEffort };\n }\n } else if (resolvedEffort && supportsAdaptiveThinking(options.model)) {\n // 4.6 models (default): adaptive thinking + effort (recommended combo)\n body.thinking = { type: 'adaptive' };\n body.output_config = { effort: resolvedEffort };\n } else if (resolvedEffort && supportsEffort(options.model)) {\n // Opus 4.5: supports effort but not adaptive thinking → effort only\n body.output_config = { effort: resolvedEffort };\n } else if (resolvedEffort) {\n // Older models: no effort support → map effort to thinking budget as fallback\n const budget = THINKING_BUDGETS[resolvedEffort] ?? 5000;\n body.thinking = { type: 'enabled', budget_tokens: budget };\n const currentMax = body.max_tokens as number;\n if (currentMax < budget + 1024) {\n body.max_tokens = budget + 1024;\n }\n }\n // No effort, no budget → no thinking, no effort sent\n\n // Anthropic rejects temperature when thinking is enabled.\n // Strip when any thinking block is present in the built body.\n if (options.temperature !== undefined && !body.thinking) {\n body.temperature = options.temperature;\n }\n\n // Anthropic's native structured outputs (output_config.format) use constrained\n // decoding which can degrade quality and may reject complex schemas. Instead, we\n // use a system prompt instruction for all JSON modes and rely on client-side\n // validation (extractJson + Zod).\n if (options.responseFormat && options.responseFormat.type !== 'text') {\n const jsonInstruction =\n 'You must respond with valid JSON only. No markdown fences, no extra text.';\n body.system = body.system ? `${body.system}\\n\\n${jsonInstruction}` : jsonInstruction;\n }\n\n if (options.providerOptions) {\n Object.assign(body, options.providerOptions);\n }\n\n return body;\n }\n\n /**\n * Map OpenAI-format ChatMessages to Anthropic message format.\n *\n * Key transformations:\n * - assistant messages with tool_calls -> assistant with tool_use content blocks\n * - tool messages (tool results) -> user messages with tool_result content blocks\n */\n private mapMessages(messages: ChatMessage[]): AnthropicMessage[] {\n const result: AnthropicMessage[] = [];\n\n for (const msg of messages) {\n if (msg.role === 'assistant') {\n if (msg.tool_calls && msg.tool_calls.length > 0) {\n // Assistant message with tool calls\n const content: AnthropicContentBlock[] = [];\n\n // Include text content if present\n if (msg.content) {\n content.push({ type: 'text', text: msg.content });\n }\n\n // Map each tool call to a tool_use block\n for (const tc of msg.tool_calls) {\n let parsedArgs: unknown;\n try {\n parsedArgs = JSON.parse(tc.function.arguments);\n } catch {\n parsedArgs = {};\n }\n content.push({\n type: 'tool_use',\n id: tc.id,\n name: tc.function.name,\n input: parsedArgs,\n });\n }\n\n result.push({ role: 'assistant', content });\n } else {\n result.push({ role: 'assistant', content: msg.content });\n }\n } else if (msg.role === 'tool') {\n // Tool result messages become user messages with tool_result content blocks.\n // Anthropic requires tool results in a user-role message.\n result.push({\n role: 'user',\n content: [\n {\n type: 'tool_result',\n tool_use_id: msg.tool_call_id!,\n content: msg.content,\n },\n ],\n });\n } else if (msg.role === 'user') {\n result.push({ role: 'user', content: msg.content });\n }\n // system messages already handled at top level\n }\n\n // Anthropic requires alternating user/assistant turns.\n // Merge consecutive same-role messages if necessary.\n return this.mergeConsecutiveRoles(result);\n }\n\n /**\n * Merge consecutive messages with the same role into a single message.\n * This handles cases where multiple tool_result blocks need to be in one user message.\n */\n private mergeConsecutiveRoles(messages: AnthropicMessage[]): AnthropicMessage[] {\n if (messages.length === 0) return messages;\n\n const merged: AnthropicMessage[] = [messages[0]];\n\n for (let i = 1; i < messages.length; i++) {\n const prev = merged[merged.length - 1];\n const curr = messages[i];\n\n if (prev.role === curr.role) {\n // Merge: convert both to content-block arrays and concatenate\n const prevBlocks = this.toContentBlocks(prev.content);\n const currBlocks = this.toContentBlocks(curr.content);\n prev.content = [...prevBlocks, ...currBlocks];\n } else {\n merged.push(curr);\n }\n }\n\n return merged;\n }\n\n private toContentBlocks(content: string | AnthropicContentBlock[]): AnthropicContentBlock[] {\n if (typeof content === 'string') {\n return [{ type: 'text', text: content }];\n }\n return content;\n }\n\n /**\n * Map an OpenAI-format ToolDefinition to Anthropic's tool format.\n */\n private mapToolDefinition(tool: ToolDefinition): AnthropicToolDef {\n return {\n name: tool.function.name,\n description: tool.function.description,\n input_schema: tool.function.parameters as Record<string, unknown>,\n };\n }\n\n /**\n * Map Axl's ToolChoice to Anthropic's tool_choice format.\n *\n * Axl (OpenAI format) → Anthropic format\n * 'auto' → { type: 'auto' }\n * 'none' → { type: 'none' }\n * 'required' → { type: 'any' }\n * { type:'function', function: { name } } → { type: 'tool', name }\n */\n private mapToolChoice(choice: NonNullable<ChatOptions['toolChoice']>): Record<string, unknown> {\n if (typeof choice === 'string') {\n if (choice === 'required') return { type: 'any' };\n return { type: choice };\n }\n // Specific function: { type: 'function', function: { name } } → { type: 'tool', name }\n return { type: 'tool', name: choice.function.name };\n }\n\n // ---------------------------------------------------------------------------\n // Internal: response parsing\n // ---------------------------------------------------------------------------\n\n private parseResponse(json: AnthropicMessageResponse): ProviderResponse {\n let content = '';\n let thinkingContent = '';\n const toolCalls: ToolCallMessage[] = [];\n\n for (const block of json.content) {\n if (block.type === 'thinking') {\n thinkingContent += block.thinking;\n } else if (block.type === 'text') {\n content += block.text;\n } else if (block.type === 'tool_use') {\n toolCalls.push({\n id: block.id,\n type: 'function',\n function: {\n name: block.name,\n arguments: JSON.stringify(block.input),\n },\n });\n }\n }\n\n const cacheRead = json.usage?.cache_read_input_tokens ?? 0;\n const cacheWrite = json.usage?.cache_creation_input_tokens ?? 0;\n // Anthropic's input_tokens excludes cached tokens; total prompt is the sum of all three\n const totalInput = (json.usage?.input_tokens ?? 0) + cacheRead + cacheWrite;\n\n const usage = json.usage\n ? {\n prompt_tokens: totalInput,\n completion_tokens: json.usage.output_tokens,\n total_tokens: totalInput + json.usage.output_tokens,\n cached_tokens: cacheRead > 0 ? cacheRead : undefined,\n }\n : undefined;\n\n const cost = json.usage\n ? estimateAnthropicCost(\n this.currentModel ?? '',\n totalInput,\n json.usage.output_tokens,\n cacheRead,\n cacheWrite,\n )\n : undefined;\n\n return {\n content,\n thinking_content: thinkingContent || undefined,\n tool_calls: toolCalls.length > 0 ? toolCalls : undefined,\n usage,\n cost,\n };\n }\n\n // ---------------------------------------------------------------------------\n // Internal: SSE stream parsing\n // ---------------------------------------------------------------------------\n\n private async *parseSSEStream(\n body: ReadableStream<Uint8Array>,\n model: string,\n ): AsyncGenerator<StreamChunk> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n // Track current content block type being streamed\n let currentToolId = '';\n let currentToolName = '';\n let usage:\n | {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n cached_tokens?: number;\n }\n | undefined;\n let cacheWrite = 0;\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(':')) continue;\n\n if (!trimmed.startsWith('data: ')) continue;\n\n const jsonStr = trimmed.slice(6);\n let event: AnthropicStreamEvent;\n try {\n event = JSON.parse(jsonStr) as AnthropicStreamEvent;\n } catch {\n continue;\n }\n\n switch (event.type) {\n case 'content_block_start': {\n const block = event.content_block;\n if (block?.type === 'tool_use') {\n currentToolId = block.id ?? '';\n currentToolName = block.name ?? '';\n // Emit the start of a tool call\n yield {\n type: 'tool_call_delta',\n id: currentToolId,\n name: currentToolName,\n arguments: '',\n };\n }\n break;\n }\n\n case 'content_block_delta': {\n const delta = event.delta;\n if (delta?.type === 'thinking_delta' && delta.thinking) {\n yield { type: 'thinking_delta', content: delta.thinking };\n } else if (delta?.type === 'text_delta' && delta.text) {\n yield { type: 'text_delta', content: delta.text };\n } else if (delta?.type === 'input_json_delta' && delta.partial_json) {\n yield {\n type: 'tool_call_delta',\n id: currentToolId,\n arguments: delta.partial_json,\n };\n }\n break;\n }\n\n case 'content_block_stop': {\n // Reset block tracking\n currentToolId = '';\n currentToolName = '';\n break;\n }\n\n case 'message_start': {\n // message_start arrives first in the SSE stream with input token counts\n if (event.message?.usage) {\n const cacheRead = event.message.usage.cache_read_input_tokens ?? 0;\n cacheWrite = event.message.usage.cache_creation_input_tokens ?? 0;\n const inputTokens =\n (event.message.usage.input_tokens ?? 0) + cacheRead + cacheWrite;\n usage = {\n prompt_tokens: inputTokens,\n completion_tokens: 0,\n total_tokens: inputTokens,\n cached_tokens: cacheRead > 0 ? cacheRead : undefined,\n };\n }\n break;\n }\n\n case 'message_delta': {\n // message_delta arrives near the end with output token counts\n if (event.usage) {\n const outputTokens = event.usage.output_tokens ?? 0;\n if (usage) {\n usage.completion_tokens = outputTokens;\n usage.total_tokens = usage.prompt_tokens + outputTokens;\n } else {\n usage = {\n prompt_tokens: 0,\n completion_tokens: outputTokens,\n total_tokens: outputTokens,\n };\n }\n }\n break;\n }\n\n case 'message_stop': {\n // Finalize usage totals\n if (usage) {\n usage.total_tokens = usage.prompt_tokens + usage.completion_tokens;\n }\n yield {\n type: 'done',\n usage,\n cost: usage\n ? estimateAnthropicCost(\n model,\n usage.prompt_tokens,\n usage.completion_tokens,\n usage.cached_tokens,\n cacheWrite,\n )\n : undefined,\n };\n return;\n }\n }\n }\n }\n\n // If we exit without a message_stop, still emit done\n yield {\n type: 'done',\n usage,\n cost: usage\n ? estimateAnthropicCost(\n model,\n usage.prompt_tokens,\n usage.completion_tokens,\n usage.cached_tokens,\n cacheWrite,\n )\n : undefined,\n };\n } finally {\n reader.releaseLock();\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Anthropic API types (internal)\n// ---------------------------------------------------------------------------\n\ntype AnthropicContentBlock =\n | { type: 'text'; text: string }\n | { type: 'tool_use'; id: string; name: string; input: unknown }\n | { type: 'tool_result'; tool_use_id: string; content: string };\n\ntype AnthropicMessage = {\n role: 'user' | 'assistant';\n content: string | AnthropicContentBlock[];\n};\n\ntype AnthropicToolDef = {\n name: string;\n description: string;\n input_schema: Record<string, unknown>;\n};\n\ntype AnthropicMessageResponse = {\n id: string;\n type: 'message';\n role: 'assistant';\n content: Array<\n | { type: 'thinking'; thinking: string }\n | { type: 'text'; text: string }\n | { type: 'tool_use'; id: string; name: string; input: unknown }\n >;\n stop_reason: string | null;\n usage: {\n input_tokens: number;\n output_tokens: number;\n cache_read_input_tokens?: number;\n cache_creation_input_tokens?: number;\n };\n};\n\ntype AnthropicStreamEvent = {\n type:\n | 'message_start'\n | 'content_block_start'\n | 'content_block_delta'\n | 'content_block_stop'\n | 'message_delta'\n | 'message_stop'\n | 'ping';\n message?: {\n usage?: {\n input_tokens?: number;\n output_tokens?: number;\n cache_read_input_tokens?: number;\n cache_creation_input_tokens?: number;\n };\n };\n content_block?: {\n type?: 'text' | 'thinking' | 'tool_use';\n id?: string;\n name?: string;\n text?: string;\n };\n delta?: {\n type?: 'text_delta' | 'thinking_delta' | 'input_json_delta';\n text?: string;\n thinking?: string;\n partial_json?: string;\n };\n usage?: {\n output_tokens?: number;\n };\n};\n","import type {\n Provider,\n ChatOptions,\n ChatMessage,\n ProviderResponse,\n StreamChunk,\n ToolDefinition,\n ToolCallMessage,\n} from './types.js';\nimport { resolveThinkingOptions } from './types.js';\nimport { fetchWithRetry } from './retry.js';\n\n// ---------------------------------------------------------------------------\n// Schema sanitization for Gemini's tool/responseSchema dialect.\n//\n// Gemini accepts a strict subset of OpenAPI 3.0 Schema Object — narrower\n// than standard JSON Schema. Zod v4's `z.toJSONSchema()` emits Draft\n// 2020-12 fields that Gemini rejects with a 400. Caught in the live\n// integration test pass — every Zod-defined tool 400'd on first call.\n//\n// Allowed: type, format, description, nullable, enum, properties,\n// required, items, minItems, maxItems, minLength, maxLength,\n// minimum, maximum, pattern, anyOf, propertyOrdering, default,\n// title, minProperties, maxProperties, example, multipleOf\n// Rejected: additionalProperties, $schema, $ref, $defs, definitions,\n// not, allOf, oneOf, patternProperties, const,\n// unevaluatedProperties, unevaluatedItems\n//\n// Two fields get TRANSLATED rather than stripped because they're load-\n// bearing for common Zod patterns:\n//\n// `oneOf` → `anyOf` — `z.discriminatedUnion()` produces `oneOf`.\n// Naive stripping would erase the entire union\n// shape and Gemini would have no schema for\n// the field. The two are semantically identical\n// for tool-use (the discriminator field already\n// enforces mutual exclusion at the consumer\n// site).\n//\n// `const: x` → `enum: [x]` — `z.literal('foo')` produces `const`.\n// Naive stripping would lose the constraint\n// entirely. `enum` with a single value is\n// Gemini's supported equivalent. (If both\n// `const` and `enum` are present, the explicit\n// `enum` wins — we don't clobber.)\n//\n// `allOf` is stripped (rare in Zod output and merging it correctly is\n// non-trivial — schema intersections that survive `allOf` removal will\n// surface as a schema validation retry on our side, which is acceptable\n// degradation). The function recurses through every value so an inner\n// `additionalProperties: false` on a nested object also gets removed —\n// the 400 fires at any depth.\n//\n// Loss without `additionalProperties: false`: the LLM has slightly less\n// guidance about strict-mode schemas, so it may occasionally emit extra\n// fields. Default Zod (`z.object`) silently strips them on parse, so the\n// user sees clean data; `.strict()` schemas trigger our schema retry\n// loop. Net cost: a handful of extra tokens, occasional retry. Not a\n// correctness issue.\n// ---------------------------------------------------------------------------\n\nconst GEMINI_DISALLOWED_SCHEMA_KEYS = new Set([\n 'additionalProperties',\n '$schema',\n '$ref',\n '$defs',\n 'definitions',\n 'not',\n 'allOf',\n 'patternProperties',\n 'unevaluatedProperties',\n 'unevaluatedItems',\n]);\n\nfunction sanitizeSchemaForGemini(schema: unknown): unknown {\n if (Array.isArray(schema)) {\n return schema.map((item) => sanitizeSchemaForGemini(item));\n }\n if (schema === null || typeof schema !== 'object') {\n return schema;\n }\n const src = schema as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(src)) {\n if (GEMINI_DISALLOWED_SCHEMA_KEYS.has(key)) continue;\n if (key === 'oneOf') {\n // Translate to anyOf — preserves z.discriminatedUnion's union shape.\n out.anyOf = sanitizeSchemaForGemini(value);\n continue;\n }\n if (key === 'const') {\n // Translate to enum with one element — preserves z.literal's\n // constraint. Skip if `enum` is also set so we don't clobber an\n // explicit enum the schema author already wrote.\n if (!('enum' in src)) out.enum = [value];\n continue;\n }\n out[key] = sanitizeSchemaForGemini(value);\n }\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// Approximate per-token pricing (USD) for common Gemini models.\n// Format: [inputCostPerToken, outputCostPerToken]\n// Uses standard context pricing (<=200k) as default.\n// ---------------------------------------------------------------------------\n\nconst GEMINI_PRICING: Record<string, [number, number]> = {\n 'gemini-2.5-pro': [1.25e-6, 10e-6],\n 'gemini-2.5-flash': [0.3e-6, 2.5e-6],\n 'gemini-2.5-flash-lite': [0.1e-6, 0.4e-6],\n 'gemini-2.0-flash': [0.1e-6, 0.4e-6],\n 'gemini-2.0-flash-lite': [0.1e-6, 0.4e-6],\n 'gemini-3-pro-preview': [2e-6, 12e-6],\n 'gemini-3-flash-preview': [0.5e-6, 3e-6],\n 'gemini-3.1-pro-preview': [2e-6, 12e-6],\n 'gemini-3.1-flash-lite-preview': [0.25e-6, 1.5e-6],\n};\n\n/** Pre-sorted keys (longest first) for prefix matching versioned model names. */\nconst GEMINI_PRICING_KEYS_BY_LENGTH = Object.keys(GEMINI_PRICING).sort(\n (a, b) => b.length - a.length,\n);\n\nfunction estimateGeminiCost(\n model: string,\n inputTokens: number,\n outputTokens: number,\n cachedTokens?: number,\n): number {\n let pricing = GEMINI_PRICING[model];\n if (!pricing) {\n for (const key of GEMINI_PRICING_KEYS_BY_LENGTH) {\n if (model.startsWith(key)) {\n pricing = GEMINI_PRICING[key];\n break;\n }\n }\n }\n if (!pricing) return 0;\n\n const [inputRate, outputRate] = pricing;\n const cached = cachedTokens ?? 0;\n // Gemini charges 10% of input rate for cached tokens (90% discount)\n const inputCost = (inputTokens - cached) * inputRate + cached * inputRate * 0.1;\n return inputCost + outputTokens * outputRate;\n}\n\n/** Default thinking budget tokens for each effort level (Gemini 2.x). */\nconst THINKING_BUDGETS: Record<string, number> = {\n low: 1024,\n medium: 5000,\n high: 10000,\n max: 24576,\n};\n\n/** Gemini 3.x thinkingLevel values mapped from unified effort levels. */\nconst THINKING_LEVELS: Record<string, string> = {\n low: 'low',\n medium: 'medium',\n high: 'high',\n max: 'high', // 3.x caps at 'high'\n};\n\n/** Check if a model is Gemini 3.x generation (uses thinkingLevel instead of thinkingBudget). */\nfunction isGemini3x(model: string): boolean {\n return /^gemini-3[.-]/.test(model);\n}\n\n/**\n * Map thinkingBudget to Gemini thinkingLevel.\n *\n * Gemini 3.x uses `thinkingLevel` (string enum: 'low' | 'medium' | 'high').\n * Gemini 2.x uses `thinkingBudget` (integer token count).\n * Budget form `{ budgetTokens }` maps to nearest `thinkingLevel` on 3.x,\n * exact `thinkingBudget` on 2.x.\n */\nfunction budgetToThinkingLevel(budgetTokens: number): string {\n if (budgetTokens <= 1024) return 'low';\n if (budgetTokens <= 5000) return 'medium';\n return 'high';\n}\n\n/** Get the minimum supported thinkingLevel for a 3.x model. */\nfunction minThinkingLevel(model: string): string {\n // 3.1 Pro doesn't support 'minimal' — 'low' is the floor\n if (model.startsWith('gemini-3.1-pro')) return 'low';\n return 'minimal';\n}\n\n/** Warn once per model that effort: 'none' cannot fully disable thinking on Gemini 3.x. */\nconst _warned3xEffortNone = new Set<string>();\nfunction warnGemini3xEffortNone(model: string): void {\n if (_warned3xEffortNone.has(model)) return;\n _warned3xEffortNone.add(model);\n console.warn(\n `[axl] effort: 'none' on Gemini 3.x (${model}) maps to the model's minimum thinking level ` +\n `('${minThinkingLevel(model)}'), not fully disabled. Gemini 3.x models cannot disable thinking entirely.`,\n );\n}\n\n/**\n * Google Gemini provider using raw fetch (no SDK dependency).\n *\n * Supports:\n * - Chat completions via generateContent\n * - Tool calling (functionCall / functionResponse)\n * - Streaming via SSE (streamGenerateContent)\n * - Structured output via responseMimeType / responseSchema\n *\n * Message mapping:\n * - \"system\" role messages are extracted into the top-level `system_instruction` param\n * - \"assistant\" role is mapped to \"model\" role\n * - \"tool\" role messages are mapped to user messages with functionResponse parts\n * - assistant messages with tool_calls are mapped to functionCall parts\n */\nexport class GeminiProvider implements Provider {\n readonly name = 'google';\n private baseUrl: string;\n private apiKey: string;\n private callCounter = 0;\n\n constructor(options: { apiKey?: string; baseUrl?: string } = {}) {\n this.apiKey = options.apiKey ?? process.env.GOOGLE_API_KEY ?? process.env.GEMINI_API_KEY ?? '';\n this.baseUrl = (options.baseUrl ?? 'https://generativelanguage.googleapis.com/v1beta').replace(\n /\\/$/,\n '',\n );\n\n if (!this.apiKey) {\n throw new Error('Google API key is required. Set GOOGLE_API_KEY or pass apiKey in options.');\n }\n }\n\n // ---------------------------------------------------------------------------\n // chat - non-streaming completion\n // ---------------------------------------------------------------------------\n\n async chat(messages: ChatMessage[], options: ChatOptions): Promise<ProviderResponse> {\n const body = this.buildRequestBody(messages, options);\n\n const res = await fetchWithRetry(`${this.baseUrl}/models/${options.model}:generateContent`, {\n method: 'POST',\n headers: this.buildHeaders(),\n body: JSON.stringify(body),\n signal: options.signal,\n });\n\n if (!res.ok) {\n const errorBody = await res.text();\n const message = this.extractErrorMessage(errorBody, res.status);\n throw new Error(message);\n }\n\n const json = (await res.json()) as GeminiResponse;\n return this.parseResponse(json, options.model);\n }\n\n // ---------------------------------------------------------------------------\n // stream - SSE streaming completion\n // ---------------------------------------------------------------------------\n\n async *stream(messages: ChatMessage[], options: ChatOptions): AsyncGenerator<StreamChunk> {\n const body = this.buildRequestBody(messages, options);\n\n const res = await fetchWithRetry(\n `${this.baseUrl}/models/${options.model}:streamGenerateContent?alt=sse`,\n {\n method: 'POST',\n headers: this.buildHeaders(),\n body: JSON.stringify(body),\n signal: options.signal,\n },\n );\n\n if (!res.ok) {\n const errorBody = await res.text();\n const message = this.extractErrorMessage(errorBody, res.status);\n throw new Error(message);\n }\n\n if (!res.body) {\n throw new Error('Gemini stream response has no body');\n }\n\n yield* this.parseSSEStream(res.body, options.model);\n }\n\n // ---------------------------------------------------------------------------\n // Internal: request building\n // ---------------------------------------------------------------------------\n\n private buildHeaders(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n 'x-goog-api-key': this.apiKey,\n };\n }\n\n private extractErrorMessage(body: string, status: number): string {\n try {\n const json = JSON.parse(body) as {\n error?: { message?: string; code?: number; status?: string };\n };\n if (json.error?.message) {\n return `Gemini API error (${status}): ${json.error.message}`;\n }\n } catch {\n // Not JSON, use raw body\n }\n return `Gemini API error (${status}): ${body}`;\n }\n\n private buildRequestBody(messages: ChatMessage[], options: ChatOptions): Record<string, unknown> {\n const systemMessages = messages.filter((m) => m.role === 'system');\n const nonSystemMessages = messages.filter((m) => m.role !== 'system');\n const systemText = systemMessages.map((m) => m.content).join('\\n\\n');\n\n const body: Record<string, unknown> = {\n contents: this.mapMessages(nonSystemMessages),\n };\n\n if (systemText) {\n body.system_instruction = { parts: [{ text: systemText }] };\n }\n\n if (options.tools && options.tools.length > 0) {\n body.tools = [\n {\n functionDeclarations: options.tools.map((t) => this.mapToolDefinition(t)),\n },\n ];\n }\n\n const generationConfig: Record<string, unknown> = {};\n\n if (options.temperature !== undefined) {\n generationConfig.temperature = options.temperature;\n }\n if (options.maxTokens !== undefined) {\n generationConfig.maxOutputTokens = options.maxTokens;\n }\n if (options.stop) {\n generationConfig.stopSequences = options.stop;\n }\n\n if (options.responseFormat && options.responseFormat.type !== 'text') {\n generationConfig.responseMimeType = 'application/json';\n if (\n options.responseFormat.type === 'json_schema' &&\n options.responseFormat.json_schema?.schema\n ) {\n generationConfig.responseSchema = sanitizeSchemaForGemini(\n options.responseFormat.json_schema.schema,\n );\n }\n }\n\n if (Object.keys(generationConfig).length > 0) {\n body.generationConfig = generationConfig;\n }\n\n // Map effort/thinkingBudget/includeThoughts to Gemini's thinkingConfig\n const {\n effort,\n thinkingBudget,\n includeThoughts,\n thinkingDisabled,\n activeEffort,\n hasBudgetOverride,\n } = resolveThinkingOptions(options);\n\n if (thinkingDisabled) {\n // effort: 'none' or thinkingBudget: 0 → minimize thinking\n if (isGemini3x(options.model)) {\n if (effort === 'none') {\n warnGemini3xEffortNone(options.model);\n }\n generationConfig.thinkingConfig = { thinkingLevel: minThinkingLevel(options.model) };\n } else {\n generationConfig.thinkingConfig = { thinkingBudget: 0 };\n }\n if (!body.generationConfig) body.generationConfig = generationConfig;\n } else if (hasBudgetOverride) {\n // Explicit budget takes precedence over effort\n const config: Record<string, unknown> = {};\n if (isGemini3x(options.model)) {\n config.thinkingLevel = budgetToThinkingLevel(thinkingBudget!);\n } else {\n config.thinkingBudget = thinkingBudget!;\n }\n if (includeThoughts) config.includeThoughts = true;\n generationConfig.thinkingConfig = config;\n if (!body.generationConfig) body.generationConfig = generationConfig;\n } else if (activeEffort) {\n const config: Record<string, unknown> = {};\n if (isGemini3x(options.model)) {\n config.thinkingLevel = THINKING_LEVELS[activeEffort] ?? 'medium';\n } else {\n // 2.5 Pro supports a higher max budget (32768) than other 2.5 models (24576)\n if (activeEffort === 'max' && options.model.startsWith('gemini-2.5-pro')) {\n config.thinkingBudget = 32768;\n } else {\n config.thinkingBudget = THINKING_BUDGETS[activeEffort] ?? 5000;\n }\n }\n if (includeThoughts) config.includeThoughts = true;\n generationConfig.thinkingConfig = config;\n if (!body.generationConfig) body.generationConfig = generationConfig;\n } else if (includeThoughts) {\n generationConfig.thinkingConfig = { includeThoughts: true };\n if (!body.generationConfig) body.generationConfig = generationConfig;\n }\n // No effort, no budget, no includeThoughts → no thinkingConfig (provider defaults)\n\n // Map toolChoice to Gemini's toolConfig.functionCallingConfig\n if (options.toolChoice !== undefined) {\n body.toolConfig = { functionCallingConfig: this.mapToolChoice(options.toolChoice) };\n }\n\n if (options.providerOptions) {\n Object.assign(body, options.providerOptions);\n }\n\n return body;\n }\n\n /**\n * Map OpenAI-format ChatMessages to Gemini content format.\n *\n * Key transformations:\n * - assistant role -> model role\n * - assistant messages with tool_calls -> model messages with functionCall parts\n * - tool messages -> user messages with functionResponse parts\n *\n * Two-pass approach: first build a tool_call_id -> function name mapping\n * from assistant messages, then use it when mapping tool result messages.\n */\n private mapMessages(messages: ChatMessage[]): GeminiContent[] {\n // Pass 1: build tool_call_id -> function name mapping\n const toolCallIdToName = new Map<string, string>();\n for (const msg of messages) {\n if (msg.role === 'assistant' && msg.tool_calls) {\n for (const tc of msg.tool_calls) {\n toolCallIdToName.set(tc.id, tc.function.name);\n }\n }\n }\n\n // Pass 2: transform messages\n const result: GeminiContent[] = [];\n\n for (const msg of messages) {\n if (msg.role === 'assistant') {\n // If we have raw Gemini parts from a previous response, use them directly.\n // This preserves thoughtSignature and other opaque fields that Gemini requires\n // in subsequent turns for multi-turn reasoning context.\n const rawParts = msg.providerMetadata?.geminiParts as GeminiPart[] | undefined;\n if (rawParts && rawParts.length > 0) {\n result.push({ role: 'model', parts: rawParts });\n } else {\n const parts: GeminiPart[] = [];\n\n if (msg.content) {\n parts.push({ text: msg.content });\n }\n\n if (msg.tool_calls && msg.tool_calls.length > 0) {\n for (const tc of msg.tool_calls) {\n let parsedArgs: Record<string, unknown>;\n try {\n parsedArgs = JSON.parse(tc.function.arguments) as Record<string, unknown>;\n } catch {\n parsedArgs = {};\n }\n parts.push({\n functionCall: {\n name: tc.function.name,\n args: parsedArgs,\n },\n });\n }\n }\n\n if (parts.length > 0) {\n result.push({ role: 'model', parts });\n }\n }\n } else if (msg.role === 'tool') {\n const functionName = toolCallIdToName.get(msg.tool_call_id!) ?? 'unknown';\n let responseData: unknown;\n try {\n responseData = JSON.parse(msg.content);\n } catch {\n responseData = { result: msg.content };\n }\n result.push({\n role: 'user',\n parts: [\n {\n functionResponse: {\n name: functionName,\n response: responseData as Record<string, unknown>,\n },\n },\n ],\n });\n } else if (msg.role === 'user') {\n result.push({ role: 'user', parts: [{ text: msg.content }] });\n }\n // system messages already handled at top level\n }\n\n // Merge consecutive same-role messages\n return this.mergeConsecutiveRoles(result);\n }\n\n /**\n * Merge consecutive messages with the same role into a single message.\n * Gemini requires alternating user/model turns.\n */\n private mergeConsecutiveRoles(messages: GeminiContent[]): GeminiContent[] {\n if (messages.length === 0) return messages;\n\n const merged: GeminiContent[] = [messages[0]];\n\n for (let i = 1; i < messages.length; i++) {\n const prev = merged[merged.length - 1];\n const curr = messages[i];\n\n if (prev.role === curr.role) {\n prev.parts = [...prev.parts, ...curr.parts];\n } else {\n merged.push(curr);\n }\n }\n\n return merged;\n }\n\n /**\n * Map Axl's ToolChoice to Gemini's functionCallingConfig format.\n *\n * - 'auto' → { mode: 'AUTO' }\n * - 'none' → { mode: 'NONE' }\n * - 'required' → { mode: 'ANY' }\n * - { type: 'function', function: { name } } → { mode: 'ANY', allowedFunctionNames: [name] }\n */\n private mapToolChoice(choice: NonNullable<ChatOptions['toolChoice']>): Record<string, unknown> {\n if (typeof choice === 'string') {\n const modeMap: Record<string, string> = {\n auto: 'AUTO',\n none: 'NONE',\n required: 'ANY',\n };\n return { mode: modeMap[choice] ?? 'AUTO' };\n }\n // Specific function choice\n return { mode: 'ANY', allowedFunctionNames: [choice.function.name] };\n }\n\n private mapToolDefinition(tool: ToolDefinition): {\n name: string;\n description: string;\n parameters: unknown;\n } {\n return {\n name: tool.function.name,\n description: tool.function.description,\n parameters: sanitizeSchemaForGemini(tool.function.parameters),\n };\n }\n\n // ---------------------------------------------------------------------------\n // Internal: response parsing\n // ---------------------------------------------------------------------------\n\n private parseResponse(json: GeminiResponse, model: string): ProviderResponse {\n const candidate = json.candidates?.[0];\n let content = '';\n let thinkingContent = '';\n const toolCalls: ToolCallMessage[] = [];\n\n if (candidate?.content?.parts) {\n for (const part of candidate.content.parts) {\n if (part.thought && part.text) {\n thinkingContent += part.text;\n } else if (part.text) {\n content += part.text;\n } else if (part.functionCall) {\n toolCalls.push({\n id: `call_${this.callCounter++}`,\n type: 'function',\n function: {\n name: part.functionCall.name,\n arguments: JSON.stringify(part.functionCall.args),\n },\n });\n }\n }\n }\n\n const cachedTokens = json.usageMetadata?.cachedContentTokenCount;\n const reasoningTokens = json.usageMetadata?.thoughtsTokenCount;\n const usage = json.usageMetadata\n ? {\n prompt_tokens: json.usageMetadata.promptTokenCount ?? 0,\n completion_tokens: json.usageMetadata.candidatesTokenCount ?? 0,\n total_tokens: json.usageMetadata.totalTokenCount ?? 0,\n cached_tokens: cachedTokens && cachedTokens > 0 ? cachedTokens : undefined,\n reasoning_tokens: reasoningTokens && reasoningTokens > 0 ? reasoningTokens : undefined,\n }\n : undefined;\n\n const cost = usage\n ? estimateGeminiCost(model, usage.prompt_tokens, usage.completion_tokens, usage.cached_tokens)\n : undefined;\n\n // Attach raw Gemini parts as providerMetadata so they can be sent back\n // verbatim in subsequent turns, preserving thoughtSignature and other opaque fields.\n const rawParts = candidate?.content?.parts;\n const providerMetadata = rawParts ? { geminiParts: rawParts } : undefined;\n\n return {\n content,\n thinking_content: thinkingContent || undefined,\n tool_calls: toolCalls.length > 0 ? toolCalls : undefined,\n usage,\n cost,\n providerMetadata,\n };\n }\n\n // ---------------------------------------------------------------------------\n // Internal: SSE stream parsing\n // ---------------------------------------------------------------------------\n\n private async *parseSSEStream(\n body: ReadableStream<Uint8Array>,\n model: string,\n ): AsyncGenerator<StreamChunk> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n let usage:\n | {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n cached_tokens?: number;\n reasoning_tokens?: number;\n }\n | undefined;\n // Accumulate raw parts across stream chunks for providerMetadata round-tripping\n const accumulatedParts: Array<Record<string, unknown>> = [];\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(':')) continue;\n\n if (!trimmed.startsWith('data: ')) continue;\n\n const jsonStr = trimmed.slice(6);\n let chunk: GeminiResponse;\n try {\n chunk = JSON.parse(jsonStr) as GeminiResponse;\n } catch {\n continue;\n }\n\n // Extract usage from this chunk (accumulate from final chunk)\n if (chunk.usageMetadata) {\n const cached = chunk.usageMetadata.cachedContentTokenCount;\n const reasoning = chunk.usageMetadata.thoughtsTokenCount;\n usage = {\n prompt_tokens: chunk.usageMetadata.promptTokenCount ?? 0,\n completion_tokens: chunk.usageMetadata.candidatesTokenCount ?? 0,\n total_tokens: chunk.usageMetadata.totalTokenCount ?? 0,\n cached_tokens: cached && cached > 0 ? cached : undefined,\n reasoning_tokens: reasoning && reasoning > 0 ? reasoning : undefined,\n };\n }\n\n const candidate = chunk.candidates?.[0];\n if (candidate?.content?.parts) {\n for (const part of candidate.content.parts) {\n // Accumulate raw parts for providerMetadata\n accumulatedParts.push(part);\n\n if (part.thought && part.text) {\n yield { type: 'thinking_delta', content: part.text };\n } else if (part.text) {\n yield { type: 'text_delta', content: part.text };\n } else if (part.functionCall) {\n // Gemini sends complete functionCall objects (not incremental deltas)\n yield {\n type: 'tool_call_delta',\n id: `call_${this.callCounter++}`,\n name: part.functionCall.name,\n arguments: JSON.stringify(part.functionCall.args),\n };\n }\n }\n }\n }\n }\n\n const providerMetadata =\n accumulatedParts.length > 0 ? { geminiParts: accumulatedParts } : undefined;\n yield {\n type: 'done',\n usage,\n cost: usage\n ? estimateGeminiCost(\n model,\n usage.prompt_tokens,\n usage.completion_tokens,\n usage.cached_tokens,\n )\n : undefined,\n providerMetadata,\n };\n } finally {\n reader.releaseLock();\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Gemini API types (internal)\n// ---------------------------------------------------------------------------\n\n/**\n * Gemini part type for request building.\n *\n * Uses an index signature to allow opaque provider fields (e.g. thoughtSignature)\n * to round-trip through conversation history without being stripped.\n */\ntype GeminiPart = {\n text?: string;\n functionCall?: { name: string; args: Record<string, unknown> };\n functionResponse?: { name: string; response: Record<string, unknown> };\n [key: string]: unknown;\n};\n\ntype GeminiContent = {\n role: 'user' | 'model';\n parts: GeminiPart[];\n};\n\ntype GeminiResponse = {\n candidates?: Array<{\n content?: {\n role: string;\n parts: Array<{\n text?: string;\n thought?: boolean;\n functionCall?: { name: string; args: Record<string, unknown> };\n [key: string]: unknown;\n }>;\n };\n finishReason?: string;\n }>;\n usageMetadata?: {\n promptTokenCount?: number;\n candidatesTokenCount?: number;\n totalTokenCount?: number;\n cachedContentTokenCount?: number;\n thoughtsTokenCount?: number;\n };\n};\n","import type { Provider } from './types.js';\nimport { OpenAIProvider } from './openai.js';\nimport { OpenAIResponsesProvider } from './openai-responses.js';\nimport { AnthropicProvider } from './anthropic.js';\nimport { GeminiProvider } from './gemini.js';\nimport type { AxlConfig } from '../config.js';\n\n/**\n * Resolved result from a provider:model URI.\n */\nexport type ResolvedProvider = {\n provider: Provider;\n model: string;\n};\n\ntype ProviderFactory = (config: AxlConfig) => Provider;\n\n// ---------------------------------------------------------------------------\n// Built-in provider factories\n// ---------------------------------------------------------------------------\n\nconst builtinFactories: Record<string, ProviderFactory> = {\n openai: (config) => {\n const opts = config.providers?.openai ?? {};\n return new OpenAIProvider({ apiKey: opts.apiKey, baseUrl: opts.baseUrl });\n },\n 'openai-responses': (config) => {\n const opts = config.providers?.['openai-responses'] ?? config.providers?.openai ?? {};\n return new OpenAIResponsesProvider({ apiKey: opts.apiKey, baseUrl: opts.baseUrl });\n },\n anthropic: (config) => {\n const opts = config.providers?.anthropic ?? {};\n return new AnthropicProvider({ apiKey: opts.apiKey, baseUrl: opts.baseUrl });\n },\n google: (config) => {\n const opts = config.providers?.google ?? {};\n return new GeminiProvider({ apiKey: opts.apiKey, baseUrl: opts.baseUrl });\n },\n};\n\n// ---------------------------------------------------------------------------\n// Provider Registry\n// ---------------------------------------------------------------------------\n\n/**\n * Registry for LLM providers. Holds cached provider instances and supports\n * custom provider registration.\n *\n * Usage:\n * const registry = new ProviderRegistry();\n * registry.register('custom', (config) => new MyProvider(config));\n * const { provider, model } = registry.resolve('openai:gpt-4o', config);\n */\nexport class ProviderRegistry {\n /** Cached provider instances, keyed by provider name */\n private instances = new Map<string, Provider>();\n\n /** Factory functions, keyed by provider name */\n private factories = new Map<string, ProviderFactory>();\n\n /** Fallback provider returned when no factory or instance matches */\n private fallbackInstance?: Provider;\n\n constructor() {\n // Register built-in providers\n for (const [name, factory] of Object.entries(builtinFactories)) {\n this.factories.set(name, factory);\n }\n }\n\n /**\n * Register a custom provider factory.\n * If a provider with this name already exists, it is replaced and\n * any cached instance is evicted.\n */\n register(name: string, factory: ProviderFactory): void {\n this.factories.set(name, factory);\n this.instances.delete(name); // evict stale cache\n }\n\n /**\n * Register a pre-instantiated provider directly.\n */\n registerInstance(name: string, provider: Provider): void {\n this.instances.set(name, provider);\n }\n\n /**\n * Check whether a provider with the given name is registered.\n */\n has(name: string): boolean {\n return this.factories.has(name) || this.instances.has(name);\n }\n\n /**\n * List all registered provider names.\n */\n list(): string[] {\n const names = new Set([...this.factories.keys(), ...this.instances.keys()]);\n return [...names];\n }\n\n /**\n * Set a fallback provider returned when no factory or instance matches.\n * Useful for testing where a single mock provider covers all agents.\n */\n setFallback(provider: Provider): void {\n this.fallbackInstance = provider;\n }\n\n /**\n * Get a provider instance by name, creating it lazily via its factory.\n */\n get(name: string, config: AxlConfig = {}): Provider {\n // Return cached instance if available\n const cached = this.instances.get(name);\n if (cached) return cached;\n\n // Create via factory\n const factory = this.factories.get(name);\n if (factory) {\n const instance = factory(config);\n this.instances.set(name, instance);\n return instance;\n }\n\n // Fall back to the fallback provider if set\n if (this.fallbackInstance) {\n return this.fallbackInstance;\n }\n\n throw new Error(`Unknown provider \"${name}\". Registered providers: ${this.list().join(', ')}`);\n }\n\n /**\n * Resolve a \"provider:model\" URI string into a Provider instance and model name.\n *\n * Supported formats:\n * - \"openai:gpt-4o\" -> provider=openai, model=gpt-4o\n * - \"anthropic:claude-3\" -> provider=anthropic, model=claude-3\n * - \"gpt-4o\" -> uses defaultProvider from config, model=gpt-4o\n * - undefined / empty -> uses defaultProvider and defaultModel from config\n *\n * @param uri Provider:model string, or just a model name\n * @param config Axl configuration for provider options and defaults\n */\n resolve(uri: string | undefined, config: AxlConfig = {}): ResolvedProvider {\n if (!uri) {\n // Fall back to config defaults\n const providerName = config.defaultProvider ?? 'openai';\n const model = config.defaultModel ?? 'gpt-4o';\n return { provider: this.get(providerName, config), model };\n }\n\n const colonIndex = uri.indexOf(':');\n\n if (colonIndex === -1) {\n // No colon -> treat entire string as model name, use default provider\n const providerName = config.defaultProvider ?? 'openai';\n return { provider: this.get(providerName, config), model: uri };\n }\n\n const providerName = uri.slice(0, colonIndex);\n const model = uri.slice(colonIndex + 1);\n\n if (!providerName || !model) {\n throw new Error(\n `Invalid provider URI \"${uri}\". Expected format: \"provider:model\" (e.g. \"openai:gpt-4o\")`,\n );\n }\n\n return { provider: this.get(providerName, config), model };\n }\n\n /**\n * Clear all cached provider instances. Useful for testing or reconfiguration.\n */\n clearCache(): void {\n this.instances.clear();\n }\n\n /**\n * Clear all registered factories (including built-ins).\n * Useful for test runtimes where only explicitly registered instances should be used.\n */\n clearFactories(): void {\n this.factories.clear();\n }\n}\n\n// ---------------------------------------------------------------------------\n// Default singleton registry\n// ---------------------------------------------------------------------------\n\n/**\n * Default global provider registry.\n * Import this for convenience; create your own ProviderRegistry for isolation.\n */\nexport const defaultRegistry = new ProviderRegistry();\n\n/**\n * Convenience function: resolve a provider:model URI using the default registry.\n */\nexport function resolveProvider(uri: string | undefined, config: AxlConfig = {}): ResolvedProvider {\n return defaultRegistry.resolve(uri, config);\n}\n","import { AsyncLocalStorage } from 'node:async_hooks';\nimport { randomUUID } from 'node:crypto';\nimport { z, ZodError } from 'zod';\nimport type {\n Result,\n BudgetResult,\n HumanDecision,\n BudgetOptions,\n MapOptions,\n SpawnOptions,\n VoteOptions,\n VerifyOptions,\n AwaitHumanOptions,\n AskOptions,\n DelegateOptions,\n RaceOptions,\n AxlEvent,\n CallbackMeta,\n ChatMessage,\n ToolCallMessage,\n ProviderResponse,\n AgentCallInfo,\n AgentCallParams,\n ValidateResult,\n VerifyRetry,\n} from './types.js';\nimport {\n VerifyError,\n QuorumNotMet,\n NoConsensus,\n TimeoutError,\n MaxTurnsError,\n BudgetExceededError,\n GuardrailError,\n ValidationError,\n} from './errors.js';\nimport type { Agent } from './agent.js';\nimport { parsePartialJson } from './partial-json.js';\nimport { COST_BEARING_LEAF_TYPES } from './event-utils.js';\nimport { redactEvent } from './redaction.js';\nimport type { Provider, ChatOptions, ToolDefinition } from './providers/types.js';\nimport type { ProviderRegistry } from './providers/registry.js';\nimport type { AxlConfig } from './config.js';\nimport { parseDuration, parseCost } from './config.js';\nimport type { StateStore } from './state/types.js';\nimport type { McpManager } from './mcp/manager.js';\nimport type { SpanManager } from './telemetry/types.js';\nimport type { MemoryManager } from './memory/manager.js';\nimport type { RememberOptions, RecallOptions, VectorResult } from './memory/types.js';\n\n/**\n * AsyncLocalStorage for per-branch abort signals.\n * Used by race/spawn/map/budget to thread signals through async contexts\n * without mutating shared state on the WorkflowContext instance.\n */\nconst signalStorage = new AsyncLocalStorage<AbortSignal>();\n\n/**\n * Per-ask frame propagated via AsyncLocalStorage.\n *\n * - `askId` / `depth` / `agent`: identify the ask this event belongs to so\n * consumers can group, indent, and link nested asks without consulting\n * parent context.\n * - `parentAskId`: set on every nested frame so the consumer can reconstruct\n * the ask tree; absent on the root ask.\n * - `stepRef`: a single mutable counter shared across the entire execution\n * (root ask + every nested ask + every branch primitive). Atomically\n * incremented on each event emission so `event.step` is monotonic across\n * the whole tree, not per-context.\n */\ntype AskFrame = {\n askId: string;\n parentAskId?: string;\n depth: number;\n agent?: string;\n stepRef: { value: number };\n /**\n * Cost incurred by THIS ask only — agent_call_end + tool_call_end events\n * emitted within this frame (NOT including nested asks, which have their\n * own frame and own counter). `emitEvent` increments this on every event\n * that carries `cost` as long as the event's frame matches `this`. Read\n * by `ask_end` to populate `cost` per spec decision 10.\n */\n askCost: { value: number };\n};\nconst askStorage = new AsyncLocalStorage<AskFrame>();\n\n/** Convert a Zod schema to JSON Schema. Exported for Studio tool introspection.\n * Wraps Zod v4's built-in `z.toJSONSchema()`, stripping the `$schema` key\n * since tool parameter schemas are embedded objects, not standalone documents. */\nexport function zodToJsonSchema(schema: z.ZodType): Record<string, unknown> {\n const result = z.toJSONSchema(schema, { unrepresentable: 'any' }) as Record<string, unknown>;\n delete result.$schema;\n return result;\n}\n\n/** Simple token estimator: ~4 chars per token. Good enough for context management. */\nfunction estimateTokens(text: string): number {\n return Math.ceil(text.length / 4);\n}\n\n/**\n * Extract JSON from LLM response content.\n * Handles: raw JSON, markdown fenced blocks (```json ... ```),\n * and content with leading/trailing text around a JSON object/array.\n */\nexport function extractJson(content: string): string {\n const trimmed = content.trim();\n\n // Content starts with { or [ — extract balanced JSON (handles trailing text)\n if (trimmed.startsWith('{')) {\n return extractBalanced(trimmed, 0, '{', '}') ?? trimmed;\n }\n if (trimmed.startsWith('[')) {\n return extractBalanced(trimmed, 0, '[', ']') ?? trimmed;\n }\n\n // Extract from markdown fenced code block\n const fenceMatch = trimmed.match(/```(?:json)?\\s*\\n?([\\s\\S]*?)\\n?\\s*```/);\n if (fenceMatch) {\n return fenceMatch[1].trim();\n }\n\n // Find the first balanced { ... } or [ ... ]\n const open = trimmed.indexOf('{');\n if (open >= 0) {\n const extracted = extractBalanced(trimmed, open, '{', '}');\n if (extracted) return extracted;\n }\n\n const openBracket = trimmed.indexOf('[');\n if (openBracket >= 0) {\n const extracted = extractBalanced(trimmed, openBracket, '[', ']');\n if (extracted) return extracted;\n }\n\n // Nothing found — return as-is and let JSON.parse produce the error\n return trimmed;\n}\n\n/** Extract a balanced substring from `start` matching open/close chars, respecting JSON strings. */\nfunction extractBalanced(\n str: string,\n start: number,\n openChar: string,\n closeChar: string,\n): string | null {\n let depth = 0;\n let inString = false;\n let escape = false;\n for (let i = start; i < str.length; i++) {\n const ch = str[i];\n if (escape) {\n escape = false;\n continue;\n }\n if (ch === '\\\\' && inString) {\n escape = true;\n continue;\n }\n if (ch === '\"') {\n inString = !inString;\n continue;\n }\n if (inString) continue;\n if (ch === openChar) depth++;\n else if (ch === closeChar) {\n depth--;\n if (depth === 0) return str.slice(start, i + 1);\n }\n }\n return null;\n}\n\n/** Estimate tokens for a message array. */\n/**\n * Append the assistant's failed attempt and the corrective feedback message to\n * the conversation so the next LLM turn sees both. Shared across guardrail,\n * schema_check, and validate retry paths — keeps the exact message shape in\n * one place so fixes (e.g. preserving providerMetadata for Gemini) apply to\n * all three gates at once.\n */\nfunction appendRetryMessages(\n messages: ChatMessage[],\n content: string,\n feedbackMessage: string,\n providerMetadata?: Record<string, unknown>,\n): void {\n messages.push({\n role: 'assistant',\n content,\n ...(providerMetadata ? { providerMetadata } : {}),\n });\n messages.push({ role: 'system', content: feedbackMessage });\n}\n\nfunction estimateMessagesTokens(messages: ChatMessage[]): number {\n let total = 0;\n for (const msg of messages) {\n total += estimateTokens(msg.content);\n if (msg.tool_calls) {\n for (const tc of msg.tool_calls) {\n total += estimateTokens(tc.function.name + tc.function.arguments);\n }\n }\n total += 4; // per-message overhead (role, separators)\n }\n return total;\n}\n\nexport type WorkflowContextInit = {\n input: unknown;\n executionId: string;\n metadata?: Record<string, unknown>;\n config: AxlConfig;\n providerRegistry: ProviderRegistry;\n sessionHistory?: ChatMessage[];\n onTrace?: (event: AxlEvent) => void;\n /** Per-token streaming callback. `meta` carries `askId`/`parentAskId`/\n * `depth`/`agent` so consumers can route or filter (e.g., `meta.depth === 0`\n * for root-only chat UIs). */\n onToken?: (token: string, meta: CallbackMeta) => void;\n /** Pre-execution tool-call callback. `meta` carries the ask correlation. */\n onToolCall?: (call: { name: string; args: unknown; callId?: string }, meta: CallbackMeta) => void;\n pendingDecisions?: Map<string, (d: HumanDecision) => void>;\n budgetContext?: {\n totalCost: number;\n limit: number;\n exceeded: boolean;\n policy: string;\n abortController?: AbortController;\n };\n stateStore?: StateStore;\n signal?: AbortSignal;\n workflowName?: string;\n mcpManager?: McpManager;\n /** SpanManager for OpenTelemetry instrumentation. */\n spanManager?: SpanManager;\n /** MemoryManager for ctx.remember() / ctx.recall() operations. */\n memoryManager?: MemoryManager;\n /** When true, the context replays from checkpoints before executing. */\n resumeMode?: boolean;\n /** Override tool handlers by name. Bypasses normal tool lookup in executeAgentCall. */\n toolOverrides?: Map<string, (args: unknown) => Promise<unknown>>;\n /** Handler for awaitHuman — when set, returns immediately instead of waiting for pendingDecisions. */\n awaitHumanHandler?: (options: AwaitHumanOptions) => HumanDecision | Promise<HumanDecision>;\n /** Callback fired when an agent LLM call is about to start. */\n onAgentStart?: (info: { agent: string; model: string }, meta: CallbackMeta) => void;\n /** Callback fired after each ctx.ask() completes (once per ask invocation). */\n onAgentCallComplete?: (call: AgentCallInfo) => void;\n /** Internal: shared auto-checkpoint counters. Set by `createChildContext`\n * so parent + child share the same number space, preventing checkpoint\n * store key collisions across nested `WorkflowContext` instances.\n *\n * - `byAgent` — per-agent counter for `ctx.ask` auto-checkpoints; each\n * agent's first ask gets `0`, second gets `1`, etc. Composed name:\n * `__auto/<agent>/ask/<n>`. Reads naturally as \"orchestrator's first\n * ask, second ask…\" instead of a global ordinal.\n * - `root` — counter for `ctx.spawn` / `race` / `parallel` / `map`\n * wrappers, which don't have an agent context (they wrap arbitrary\n * fn callbacks). Composed name: `__auto/<primitive>/<n>`.\n *\n * Root contexts default to a fresh `{ byAgent: new Map(), root: 0 }`. */\n autoCheckpointCounters?: { byAgent: Map<string, number>; root: number };\n};\n\n/**\n * The central coordination object for all Axl primitives.\n * Carries execution state, tracing, budget tracking, and session history.\n */\nexport class WorkflowContext<TInput = unknown> {\n readonly input: TInput;\n readonly executionId: string;\n readonly metadata: Record<string, unknown>;\n\n /**\n * Total cost accumulated by agent calls in this context.\n * Inside a `ctx.budget()` block, returns only that block's cost.\n * After the block completes, the nested cost is rolled up into the parent total.\n */\n get totalCost(): number {\n return this.budgetContext?.totalCost ?? 0;\n }\n\n private config: AxlConfig;\n private providerRegistry: ProviderRegistry;\n private sessionHistory: ChatMessage[];\n private onTrace?: (event: AxlEvent) => void;\n private onToken?: (token: string, meta: CallbackMeta) => void;\n private onToolCall?: (\n call: { name: string; args: unknown; callId?: string },\n meta: CallbackMeta,\n ) => void;\n private pendingDecisions?: Map<string, (d: HumanDecision) => void>;\n private budgetContext?: {\n totalCost: number;\n limit: number;\n exceeded: boolean;\n policy: string;\n abortController?: AbortController;\n };\n private stateStore?: StateStore;\n /** Root step counter for this execution. Inherited by every ctx.ask()\n * frame so all events from this WorkflowContext (root + nested) share\n * a single monotonic counter, even when concurrent branch primitives\n * fire asks before any single parent ask exists. Per-instance so\n * separate executions don't cross-talk. */\n private stepRefRoot: { value: number } = { value: 0 };\n /**\n * Auto-checkpoint counters for internal `_checkpoint` callers. Held by\n * reference so child contexts created via `createChildContext` share\n * the same number space — otherwise a tool handler's nested `ctx.ask()`\n * (which auto-checkpoints) would collide with the parent's\n * auto-checkpoints in the state store. See `WorkflowContextInit\n * .autoCheckpointCounters` for the per-agent vs root split.\n * User-facing `ctx.checkpoint(name, fn)` requires an explicit name and\n * does NOT touch these counters — it goes straight to the store under\n * the caller-supplied key.\n */\n private autoCheckpointCounters: { byAgent: Map<string, number>; root: number };\n /** Idempotency guards for `workflow_start` / `workflow_end` emission.\n * Both `runtime.execute()` and `runtime.stream()` have paths where a\n * post-emit side-effect (checkpoint deletion, state-store persistence)\n * can throw AFTER `_emitWorkflowEnd({status: 'completed'})` has already\n * fired — the outer catch would then fire `_emitWorkflowEnd({status:\n * 'failed'})` for a second time. These flags make both emitters\n * single-fire so consumers never see paired-then-conflicting terminal\n * events for one execution. */\n private _workflowStartEmitted = false;\n private _workflowEndEmitted = false;\n private signal?: AbortSignal;\n private summaryCache?: string;\n private workflowName?: string;\n private mcpManager?: McpManager;\n private spanManager?: SpanManager;\n private memoryManager?: MemoryManager;\n private resumeMode: boolean;\n private toolOverrides?: Map<string, (args: unknown) => Promise<unknown>>;\n private awaitHumanHandler?: (\n options: AwaitHumanOptions,\n ) => HumanDecision | Promise<HumanDecision>;\n private onAgentStart?: (info: { agent: string; model: string }, meta: CallbackMeta) => void;\n private onAgentCallComplete?: (call: AgentCallInfo) => void;\n constructor(init: WorkflowContextInit) {\n this.input = init.input as TInput;\n this.executionId = init.executionId;\n this.metadata = init.metadata ?? {};\n this.config = init.config;\n this.providerRegistry = init.providerRegistry;\n this.sessionHistory = init.sessionHistory ?? [];\n this.onTrace = init.onTrace;\n this.onToken = init.onToken;\n this.onToolCall = init.onToolCall;\n this.pendingDecisions = init.pendingDecisions;\n this.budgetContext = init.budgetContext;\n this.stateStore = init.stateStore;\n this.signal = init.signal;\n this.workflowName = init.workflowName;\n this.mcpManager = init.mcpManager;\n this.spanManager = init.spanManager;\n this.memoryManager = init.memoryManager;\n this.resumeMode = init.resumeMode ?? false;\n this.toolOverrides = init.toolOverrides;\n this.awaitHumanHandler = init.awaitHumanHandler;\n this.onAgentStart = init.onAgentStart;\n this.onAgentCallComplete = init.onAgentCallComplete;\n // Inherit auto-checkpoint counters from parent if provided; otherwise\n // start a fresh ref. Shared by reference so child contexts increment\n // the same counters and never collide with the parent in the store.\n this.autoCheckpointCounters = init.autoCheckpointCounters ?? {\n byAgent: new Map(),\n root: 0,\n };\n // Restore cached summary from session metadata (survives across requests)\n if (init.metadata?.summaryCache) {\n this.summaryCache = init.metadata.summaryCache as string;\n }\n }\n\n /**\n * Create a child context for nested agent invocations (e.g., agent-as-tool).\n * Shares: budget tracking, abort signals, trace emission, provider registry,\n * state store, span manager, memory manager, MCP manager, config,\n * awaitHuman handler, pending decisions, tool overrides, AND the\n * streaming callbacks (onToken / onAgentStart / onToolCall).\n * Isolates: session history.\n *\n * Streaming callbacks now propagate into nested asks because every callback\n * invocation carries `meta.askId`/`meta.parentAskId`/`meta.depth` so\n * consumers that want root-only behavior can filter on `meta.depth === 0`\n * instead of relying on the runtime to drop nested events. This is the\n * \"nested ask visibility\" fix from spec §3.2.\n *\n * The shared step counter lives in `askStorage` (ALS), so there is no\n * per-context counter to pass through anymore. Nested events are\n * correlated to their parent via `parentAskId` (set on every nested ask\n * by ALS frame allocation) — the deprecated `parentToolCallId` field\n * was removed in 0.16.0.\n */\n createChildContext(): WorkflowContext {\n return new WorkflowContext({\n input: this.input,\n executionId: this.executionId,\n config: this.config,\n providerRegistry: this.providerRegistry,\n metadata: { ...this.metadata },\n // Shared infrastructure\n budgetContext: this.budgetContext,\n stateStore: this.stateStore,\n mcpManager: this.mcpManager,\n spanManager: this.spanManager,\n memoryManager: this.memoryManager,\n onTrace: this.onTrace,\n onToken: this.onToken,\n onToolCall: this.onToolCall,\n onAgentStart: this.onAgentStart,\n onAgentCallComplete: this.onAgentCallComplete,\n awaitHumanHandler: this.awaitHumanHandler,\n pendingDecisions: this.pendingDecisions,\n toolOverrides: this.toolOverrides,\n signal: this.signal,\n workflowName: this.workflowName,\n // Share the parent's auto-checkpoint counters so internal checkpoints\n // emitted from `ctx.ask` / spawn / race / parallel / map in this\n // child context don't collide with the parent's in the state store.\n autoCheckpointCounters: this.autoCheckpointCounters,\n // Isolated: sessionHistory (empty)\n });\n }\n\n /**\n * Resolve the current abort signal.\n * Branch-scoped signals (from race/spawn/map/budget) in AsyncLocalStorage\n * take priority over the instance-level signal.\n */\n private get currentSignal(): AbortSignal | undefined {\n return signalStorage.getStore() ?? this.signal;\n }\n\n /**\n * Build a `CallbackMeta` for the current ask frame. Used at every\n * `onToken`/`onToolCall`/`onAgentStart` call site so consumers can\n * route or filter by ask correlation (`meta.depth === 0` for root\n * chat UIs, etc.).\n *\n * If the call is somehow outside an ask frame (e.g., a programmatic\n * `tool.run()` test harness), falls back to a synthetic meta keyed off\n * `executionId` so the type contract holds — consumers see `depth: 0`\n * and can ignore those events.\n */\n private currentCallbackMeta(agentName: string): CallbackMeta {\n const frame = askStorage.getStore();\n if (frame) {\n return {\n askId: frame.askId,\n ...(frame.parentAskId ? { parentAskId: frame.parentAskId } : {}),\n depth: frame.depth,\n agent: agentName,\n };\n }\n return { askId: this.executionId, depth: 0, agent: agentName };\n }\n\n // ── ctx.ask() ─────────────────────────────────────────────────────────\n\n async ask<T = string>(agent: Agent, prompt: string, options?: AskOptions<T>): Promise<T> {\n const agentName = agent._name;\n return this._checkpoint(\n this._autoCheckpointName('ask', agentName),\n async () => {\n // Allocate the ask frame BEFORE entering askStorage.run so the\n // emitEvent calls inside the run() callback see the new frame in ALS.\n const parentFrame = askStorage.getStore();\n const askId = randomUUID();\n const depth = (parentFrame?.depth ?? -1) + 1;\n // Nested asks inherit the parent frame's counter; top-level asks\n // share the WorkflowContext's instance-level `stepRefRoot` so all\n // top-level asks (including concurrent ones from spawn / parallel /\n // race) share a single monotonic counter. Spec §3.7.\n const stepRef = parentFrame?.stepRef ?? this.stepRefRoot;\n const frame: AskFrame = {\n askId,\n parentAskId: parentFrame?.askId,\n depth,\n agent: agent._name,\n stepRef,\n askCost: { value: 0 },\n };\n\n return askStorage.run(frame, async () => {\n const askStart = Date.now();\n this.emitEvent({ type: 'ask_start', prompt });\n\n // `costBefore` snapshots the global budget so we can pass the per-ask\n // cost delta to onAgentCallComplete (legacy callback that reports the\n // whole-tree spend). `frame.askCost` is the spec-correct, this-ask-only\n // figure used on `ask_end` (decision 10).\n const costBefore = this.budgetContext?.totalCost ?? 0;\n const resolveCtx = options?.metadata\n ? { metadata: { ...this.metadata, ...options.metadata } }\n : { metadata: this.metadata };\n\n // Use a mutable container to capture usage from executeAgentCall\n // without relying on an instance property (which is racy under\n // concurrent calls).\n const usageCapture: {\n value?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n cached_tokens?: number;\n };\n } = {};\n\n const doCall = async () => {\n const result = await this.executeAgentCall(\n agent,\n prompt,\n options as AskOptions<unknown>,\n undefined,\n usageCapture,\n );\n return result as T;\n };\n\n // Spec decision 9 invariant: every `ask_start` has a matching\n // `ask_end`. Implemented via try/finally so ANY exit path —\n // current catches (gate exhaustion, budget, abort) AND any\n // future failure path added between `ask_start` and the\n // success emit — surfaces as `ask_end`. The workflow-level\n // `error` event is reserved for failures with no ask_end\n // available; consumers must never see both for the same failure.\n let outcome: { ok: true; result: T } | { ok: false; error: string } | undefined;\n try {\n const result: T = this.spanManager\n ? await this.spanManager.withSpanAsync(\n 'axl.agent.ask',\n {\n 'axl.agent.name': agent._name,\n 'axl.agent.model': agent.resolveModel(resolveCtx),\n },\n async (span) => {\n const r = await doCall();\n const costAfter = this.budgetContext?.totalCost ?? 0;\n span.setAttribute('axl.agent.cost', costAfter - costBefore);\n span.setAttribute('axl.agent.duration', Date.now() - askStart);\n if (usageCapture.value) {\n span.setAttribute(\n 'axl.agent.prompt_tokens',\n usageCapture.value.prompt_tokens,\n );\n span.setAttribute(\n 'axl.agent.completion_tokens',\n usageCapture.value.completion_tokens,\n );\n if (usageCapture.value.cached_tokens)\n span.setAttribute(\n 'axl.agent.cached_tokens',\n usageCapture.value.cached_tokens,\n );\n }\n return r;\n },\n )\n : await doCall();\n outcome = { ok: true, result };\n\n // Success path: invoke the legacy onAgentCallComplete hook.\n // Isolate consumer bugs (mirror the onTrace pattern at\n // emitEvent): a hook throw is post-success observability —\n // the agent's run already succeeded, so we must NOT\n // overwrite the outcome to ok:false. Swallow + console.error\n // so reliability dashboards keyed off ask_end.outcome aren't\n // poisoned by hook bugs.\n const costAfter = this.budgetContext?.totalCost ?? 0;\n if (this.onAgentCallComplete) {\n try {\n this.onAgentCallComplete({\n agent: agent._name,\n prompt,\n response: typeof result === 'string' ? result : JSON.stringify(result),\n model: agent.resolveModel(resolveCtx),\n cost: costAfter - costBefore,\n duration: Date.now() - askStart,\n promptVersion: agent._config.version,\n temperature: options?.temperature ?? agent._config.temperature,\n maxTokens: options?.maxTokens ?? agent._config.maxTokens ?? 4096,\n effort: options?.effort ?? agent._config.effort,\n thinkingBudget: options?.thinkingBudget ?? agent._config.thinkingBudget,\n includeThoughts: options?.includeThoughts ?? agent._config.includeThoughts,\n toolChoice: options?.toolChoice ?? agent._config.toolChoice,\n stop: options?.stop ?? agent._config.stop,\n providerOptions: options?.providerOptions ?? agent._config.providerOptions,\n });\n } catch (hookErr) {\n console.error(\n '[axl] onAgentCallComplete hook threw; ask outcome unchanged:',\n hookErr instanceof Error ? hookErr.message : String(hookErr),\n );\n }\n }\n return result;\n } catch (err) {\n outcome = {\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n };\n throw err;\n } finally {\n // Defensive: `outcome` is always set by either the success\n // or catch branch above. The fallback covers an internal\n // bug (e.g., a future synchronous throw before either\n // branch runs) so we never silently drop the ask_end event.\n this.emitEvent({\n type: 'ask_end',\n outcome:\n outcome ??\n ({\n ok: false,\n error: 'ask_end emitted without outcome — internal bug',\n } as const),\n cost: frame.askCost.value,\n duration: Date.now() - askStart,\n });\n }\n });\n },\n { agent: agentName },\n );\n }\n\n private async executeAgentCall(\n agent: Agent,\n prompt: string,\n options?: AskOptions<unknown>,\n handoffMessages?: ChatMessage[],\n usageCapture?: {\n value?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n cached_tokens?: number;\n };\n },\n ): Promise<unknown> {\n // Budget check\n if (this.budgetContext?.exceeded) {\n const { limit, totalCost: spent, policy } = this.budgetContext;\n if (policy === 'warn') {\n this.emitEvent({\n type: 'log',\n data: { warning: 'Budget exceeded', limit, spent, policy },\n });\n } else if (policy === 'finish_and_stop') {\n throw new BudgetExceededError(limit, spent, policy);\n } else {\n // hard_stop: the AbortController in budget() handles in-flight cancellation.\n // This path is reached on the *next* ctx.ask() call after budget was exceeded.\n throw new BudgetExceededError(limit, spent, policy);\n }\n }\n\n // Merge workflow metadata with per-call metadata (per-call takes precedence)\n const resolveCtx = options?.metadata\n ? { metadata: { ...this.metadata, ...options.metadata } }\n : { metadata: this.metadata };\n const modelUri = agent.resolveModel(resolveCtx);\n const systemPrompt = agent.resolveSystem(resolveCtx);\n const { provider, model } = this.providerRegistry.resolve(modelUri, this.config);\n\n // Resolve dynamic handoffs once per call to ensure consistency\n // between tool definitions and handoff lookup within the same turn.\n let resolvedHandoffs:\n | Array<{ agent: Agent; description?: string; mode?: 'oneway' | 'roundtrip' }>\n | undefined;\n if (typeof agent._config.handoffs === 'function') {\n try {\n resolvedHandoffs = agent._config.handoffs(resolveCtx);\n } catch (err) {\n this.log('handoff_resolve_error', {\n agent: agent._name,\n error: err instanceof Error ? err.message : String(err),\n });\n resolvedHandoffs = undefined;\n }\n } else {\n resolvedHandoffs = agent._config.handoffs;\n }\n\n // Build tool definitions\n const toolDefs = this.buildToolDefs(agent, resolvedHandoffs);\n\n // Build messages\n const messages: ChatMessage[] = [];\n if (systemPrompt) {\n messages.push({ role: 'system', content: systemPrompt });\n }\n\n // Include session history (with context window management)\n const maxContext = agent._config.maxContext;\n if (maxContext && this.sessionHistory.length > 0) {\n const reserveTokens = this.config.contextManagement?.reserveTokens ?? 2000;\n const systemTokens = systemPrompt ? estimateTokens(systemPrompt) : 0;\n const toolTokens = toolDefs.length > 0 ? estimateTokens(JSON.stringify(toolDefs)) : 0;\n const overhead = systemTokens + toolTokens + reserveTokens;\n const availableForHistory = maxContext - overhead;\n\n const historyTokens = estimateMessagesTokens(this.sessionHistory);\n if (historyTokens > availableForHistory) {\n // Need to summarize: find the split point\n const summarizedMessages = await this.summarizeHistory(\n provider,\n model,\n this.sessionHistory,\n availableForHistory,\n );\n for (const msg of summarizedMessages) {\n messages.push(msg);\n }\n } else {\n for (const msg of this.sessionHistory) {\n messages.push(msg);\n }\n }\n } else {\n for (const msg of this.sessionHistory) {\n messages.push(msg);\n }\n }\n\n // Build user prompt\n let userContent = prompt;\n if (options?.schema) {\n const jsonSchema = zodToJsonSchema(options.schema as z.ZodType);\n userContent += `\\n\\nRespond with valid JSON matching this schema:\\n${JSON.stringify(jsonSchema, null, 2)}`;\n }\n\n messages.push({ role: 'user', content: userContent });\n\n // If this agent was reached via handoff, include the source agent's conversation\n if (handoffMessages && handoffMessages.length > 0) {\n // Inject handoff context as a system message summarizing the source agent's work,\n // then append the raw tool-call exchanges so the target agent has full context.\n const handoffContext = handoffMessages.filter(\n (m) => m.role === 'assistant' || m.role === 'tool',\n );\n if (handoffContext.length > 0) {\n messages.push({\n role: 'system',\n content:\n 'The following is the conversation history from the previous agent that handed off to you:',\n });\n for (const msg of handoffContext) {\n // Flatten tool messages into user messages to avoid protocol issues\n const content =\n msg.role === 'tool'\n ? `[Tool result for ${msg.tool_call_id}]: ${msg.content}`\n : msg.content;\n // Skip empty content (e.g. assistant messages with only tool calls)\n if (!content) continue;\n messages.push({ role: 'user', content });\n }\n }\n }\n\n // -- Input guardrail --\n const guardrails = agent._config.guardrails;\n if (guardrails?.input) {\n const inputResult = await guardrails.input(prompt, { metadata: this.metadata });\n this.emitEvent({\n type: 'guardrail',\n agent: agent._name,\n data: {\n guardrailType: 'input',\n blocked: inputResult.block,\n ...(inputResult.reason ? { reason: inputResult.reason } : {}),\n // Input guardrails can't retry (prompt is user-supplied), so attempt\n // and maxAttempts are always 1 — emit them for shape consistency with\n // output guardrails so consumers don't need two narrowers.\n attempt: 1,\n maxAttempts: 1,\n },\n });\n this.spanManager?.addEventToActiveSpan('axl.guardrail.check', {\n 'axl.guardrail.type': 'input',\n 'axl.guardrail.blocked': inputResult.block,\n 'axl.guardrail.attempt': 1,\n 'axl.guardrail.maxAttempts': 1,\n ...(inputResult.reason ? { 'axl.guardrail.reason': inputResult.reason } : {}),\n });\n if (inputResult.block) {\n const onBlock = guardrails.onBlock ?? 'throw';\n if (typeof onBlock === 'function') {\n return onBlock(inputResult.reason ?? 'Input blocked by guardrail', {\n metadata: this.metadata,\n });\n }\n // 'retry' behaves as 'throw' for input guardrails (prompt is user-supplied, can't retry)\n throw new GuardrailError('input', inputResult.reason ?? 'Input blocked by guardrail');\n }\n }\n\n const maxTurns = agent._config.maxTurns ?? 25;\n const timeoutMs = parseDuration(agent._config.timeout ?? '60s');\n const startTime = Date.now();\n\n // Streaming + validate is supported as of the unified event model\n // (spec §4.1). With pipeline events landing in PR 2, retry boundaries\n // are visible to consumers via `pipeline(status: 'failed' | 'committed')`\n // and `AxlStream.fullText` only commits the winning attempt's tokens.\n // Until pipeline events ship, retried tokens still concatenate; the\n // tradeoff is acceptable because the throw was a worse failure mode\n // (refused to run a valid configuration).\n\n const currentMessages = [...messages];\n let turns = 0;\n let guardrailOutputRetries = 0;\n let schemaRetries = 0;\n let validateRetries = 0;\n const maxGuardrailRetries = guardrails?.maxRetries ?? 2;\n // Set before `continue`ing to a retry turn; read when emitting the next\n // agent_call so consumers can see *why* a given LLM call is a retry.\n let pendingRetryReason: 'schema' | 'validate' | 'guardrail' | undefined;\n // `trace.level === 'full'` opts into verbose traces: we include the full ChatMessage[]\n // snapshot on each agent_call so the trace explorer can reconstruct exactly what the\n // model saw (growing with tool results + retry feedback across turns).\n const verboseTrace = this.config.trace?.level === 'full';\n\n // Track the most recent pipeline `start` so the terminal `committed`\n // event can carry the matching stage/attempt/maxAttempts. Spec §4.2.\n let lastStartStage: 'initial' | 'schema' | 'validate' | 'guardrail' = 'initial';\n let lastStartAttempt = 1;\n let lastStartMaxAttempts = 1;\n\n while (turns < maxTurns) {\n // Timeout check\n if (Date.now() - startTime > timeoutMs) {\n throw new TimeoutError('ctx.ask()', timeoutMs);\n }\n\n turns++;\n // Emit pipeline `start` only on the FIRST turn of the ask OR when\n // entering a gate-rejection retry. Tool-calling continuations\n // within the same ask do NOT produce additional starts — they're\n // agent-loop iterations, not retry attempts. Spec §4.2 invariant.\n const isFirstTurn = turns === 1;\n const isRetryTurn = pendingRetryReason !== undefined;\n if (isFirstTurn || isRetryTurn) {\n const stage: 'initial' | 'schema' | 'validate' | 'guardrail' =\n pendingRetryReason ?? 'initial';\n let pipelineAttempt = 1;\n let pipelineMaxAttempts = 1;\n if (stage === 'guardrail') {\n pipelineAttempt = guardrailOutputRetries + 1;\n pipelineMaxAttempts = maxGuardrailRetries + 1;\n } else if (stage === 'schema') {\n pipelineAttempt = schemaRetries + 1;\n pipelineMaxAttempts = (options?.retries ?? 3) + 1;\n } else if (stage === 'validate') {\n pipelineAttempt = validateRetries + 1;\n pipelineMaxAttempts = (options?.validateRetries ?? 2) + 1;\n }\n lastStartStage = stage;\n lastStartAttempt = pipelineAttempt;\n lastStartMaxAttempts = pipelineMaxAttempts;\n this.emitEvent({\n type: 'pipeline',\n agent: agent._name,\n status: 'start',\n stage,\n attempt: pipelineAttempt,\n maxAttempts: pipelineMaxAttempts,\n });\n }\n // Per-turn start time for accurate `duration` on each agent_call event.\n // `startTime` above is the start of the entire ask() call; without this,\n // turn N's duration would include all prior turns' latency and gates.\n const turnStart = Date.now();\n\n const chatOptions: ChatOptions = {\n model,\n temperature: options?.temperature ?? agent._config.temperature,\n tools: toolDefs.length > 0 ? toolDefs : undefined,\n maxTokens: options?.maxTokens ?? agent._config.maxTokens ?? 4096,\n effort: options?.effort ?? agent._config.effort,\n thinkingBudget: options?.thinkingBudget ?? agent._config.thinkingBudget,\n includeThoughts: options?.includeThoughts ?? agent._config.includeThoughts,\n toolChoice: options?.toolChoice ?? agent._config.toolChoice,\n stop: options?.stop ?? agent._config.stop,\n providerOptions: options?.providerOptions ?? agent._config.providerOptions,\n signal: this.currentSignal,\n };\n\n // If schema requested and no tools, use JSON mode\n if (options?.schema && toolDefs.length === 0) {\n chatOptions.responseFormat = { type: 'json_object' };\n }\n\n const callbackMeta = this.currentCallbackMeta(agent._name);\n\n // Build the request-side payload BEFORE the call. Everything here is\n // known at dispatch time, so consumers see \"what's being asked\" the\n // moment the call leaves the runtime — they don't have to wait for a\n // response (or a hung connection) to inspect prompt/system/params.\n const callParams: AgentCallParams = {\n ...(chatOptions.temperature !== undefined ? { temperature: chatOptions.temperature } : {}),\n maxTokens: chatOptions.maxTokens,\n ...(chatOptions.effort !== undefined ? { effort: chatOptions.effort } : {}),\n ...(chatOptions.thinkingBudget !== undefined\n ? { thinkingBudget: chatOptions.thinkingBudget }\n : {}),\n ...(chatOptions.includeThoughts !== undefined\n ? { includeThoughts: chatOptions.includeThoughts }\n : {}),\n ...(chatOptions.toolChoice !== undefined ? { toolChoice: chatOptions.toolChoice } : {}),\n ...(chatOptions.stop !== undefined ? { stop: chatOptions.stop } : {}),\n };\n\n // Verbose-mode message snapshot — clone defensively so post-call\n // mutations (tool results, retry feedback) don't bleed back into the\n // already-emitted event.\n let messagesSnapshot: ChatMessage[] | undefined;\n if (verboseTrace) {\n try {\n messagesSnapshot = structuredClone(currentMessages);\n } catch (err) {\n console.warn(\n '[axl] verbose trace messages snapshot failed to clone; emitting shallow copy:',\n err instanceof Error ? err.message : String(err),\n );\n messagesSnapshot = [...currentMessages];\n }\n }\n\n // Capture-and-clear pendingRetryReason BEFORE start so both start and\n // end carry the same retryReason for this turn.\n const retryReason = pendingRetryReason;\n pendingRetryReason = undefined;\n\n this.emitEvent({\n type: 'agent_call_start',\n agent: agent._name,\n model: modelUri,\n turn: turns,\n data: {\n prompt,\n ...(systemPrompt ? { system: systemPrompt } : {}),\n params: callParams,\n turn: turns,\n ...(retryReason ? { retryReason } : {}),\n ...(toolDefs.length > 0 ? { toolNames: toolDefs.map((t) => t.function.name) } : {}),\n ...(messagesSnapshot ? { messages: messagesSnapshot } : {}),\n },\n });\n this.onAgentStart?.({ agent: agent._name, model: modelUri }, callbackMeta);\n\n let response: ProviderResponse;\n\n // Provider call wrapped so any throw still emits a paired\n // `agent_call_end` — consumers (Studio waterfall, cost rollup, AsyncLocalStorage\n // accumulators) rely on the start/end pair invariant. Without this, a\n // provider 5xx or abort leaves an orphan start in the trace and the\n // ask_end / workflow_end terminal events still fire — but downstream\n // groupers never see the close, so per-ask cost rollup and ask-tree\n // reconstruction silently drift. We rethrow after emit so the existing\n // ask-loop error handling (ask_end({ok:false}), MaxTurnsError, etc.) is\n // unchanged.\n try {\n if (this.onToken) {\n // Use streaming to emit tokens in real-time\n let content = '';\n const toolCalls: ToolCallMessage[] = [];\n const toolCallBuffers = new Map<\n string,\n { id: string; name: string; arguments: string }\n >();\n let streamProviderMetadata: Record<string, unknown> | undefined;\n\n let thinkingContent = '';\n\n // partial_object emission gating (spec §4.2):\n // - schema is set\n // - no tools (JSON-mode response, not tool-calling)\n // - schema root is a ZodObject (only object roots get partials)\n // Structural-boundary throttle: emit when we cross a `,`, `}`, or\n // `]` that is OUTSIDE a string literal. A naive \"last char of\n // delta is a comma\" check (review B-9) over-emits on prose-heavy\n // fields like {\"description\": \"short, comma-heavy text...\"} —\n // every comma inside the string triggered a parse. We track\n // in-string + escape state across chunks with a small walker so\n // each boundary fires exactly once at a real structural seam.\n const partialObjectEnabled =\n !!options?.schema && toolDefs.length === 0 && options.schema instanceof z.ZodObject;\n const currentAttempt = schemaRetries + 1;\n // Running parser state for the delta walker. Reset per ask\n // invocation (not per retry — schema retry feeds the same\n // conversation back, so we want a fresh parse of the new attempt).\n let inString = false;\n let escaped = false;\n let boundaryPending = false;\n\n for await (const chunk of provider.stream(currentMessages, chatOptions)) {\n if (chunk.type === 'text_delta') {\n content += chunk.content;\n // Emit a `token` AxlEvent so wire consumers (AxlStream) and\n // trace listeners both see it. Stream-only — `runtime.execute`'s\n // onTrace skips persisting tokens to ExecutionInfo.events.\n this.emitEvent({ type: 'token', data: chunk.content });\n this.onToken(chunk.content, callbackMeta);\n if (partialObjectEnabled) {\n // Walk `chunk.content` char-by-char, updating the\n // in-string / escape state and recording whether a\n // structural boundary landed outside a string. The\n // running state survives across chunks because\n // `inString` / `escaped` are closed over by the outer\n // for-await loop.\n for (const ch of chunk.content) {\n if (escaped) {\n escaped = false;\n continue;\n }\n if (ch === '\\\\') {\n // Inside a string, `\\\\` starts an escape. Outside,\n // a bare backslash is invalid JSON — treat the same\n // way (swallow the next char) so malformed input\n // doesn't derail our state machine.\n escaped = true;\n continue;\n }\n if (ch === '\"') {\n inString = !inString;\n continue;\n }\n if (!inString && (ch === ',' || ch === '}' || ch === ']')) {\n boundaryPending = true;\n }\n }\n if (boundaryPending) {\n boundaryPending = false;\n let parsed: unknown;\n try {\n parsed = parsePartialJson(extractJson(content));\n } catch {\n // Mid-document malformed (not just truncation) — skip\n // this delta. The next structural boundary outside a\n // string will get another shot once the model writes\n // valid syntax.\n parsed = undefined;\n }\n if (parsed !== undefined) {\n this.emitEvent({\n type: 'partial_object',\n agent: agent._name,\n attempt: currentAttempt,\n data: { object: parsed },\n });\n }\n }\n }\n } else if (chunk.type === 'thinking_delta') {\n thinkingContent += chunk.content;\n } else if (chunk.type === 'tool_call_delta') {\n let buffer = toolCallBuffers.get(chunk.id);\n if (!buffer) {\n buffer = { id: chunk.id, name: '', arguments: '' };\n toolCallBuffers.set(chunk.id, buffer);\n }\n if (chunk.name) buffer.name = chunk.name;\n if (chunk.arguments) buffer.arguments += chunk.arguments;\n } else if (chunk.type === 'done') {\n streamProviderMetadata = chunk.providerMetadata;\n // Usage and cost info from done chunk if available\n if (chunk.usage) {\n response = {\n content,\n tool_calls: undefined,\n usage: chunk.usage,\n cost: chunk.cost,\n };\n }\n }\n }\n\n // Convert tool call buffers to ToolCallMessage format\n for (const buffer of toolCallBuffers.values()) {\n toolCalls.push({\n id: buffer.id,\n type: 'function',\n function: {\n name: buffer.name,\n arguments: buffer.arguments,\n },\n });\n }\n\n response ??= {\n content,\n usage: { prompt_tokens: 0, completion_tokens: 0, total_tokens: 0 },\n };\n if (toolCalls.length > 0) {\n response.tool_calls = toolCalls;\n }\n if (streamProviderMetadata) {\n response.providerMetadata = streamProviderMetadata;\n }\n if (thinkingContent) {\n response.thinking_content = thinkingContent;\n }\n } else {\n response = await provider.chat(currentMessages, chatOptions);\n }\n } catch (err) {\n // Emit the paired `agent_call_end` before rethrowing. Empty response,\n // error message in `data.error`. No usage/cost — provider didn't\n // deliver one. `duration` reflects time-to-failure.\n this.emitEvent({\n type: 'agent_call_end',\n agent: agent._name,\n model: modelUri,\n promptVersion: agent._config.version,\n duration: Date.now() - turnStart,\n data: {\n response: '',\n turn: turns,\n ...(retryReason ? { retryReason } : {}),\n error: err instanceof Error ? err.message : String(err),\n },\n });\n throw err;\n }\n\n // Capture usage for span instrumentation (per-call, not per-instance)\n if (usageCapture && response.usage) {\n usageCapture.value = response.usage;\n }\n\n // Track cost\n if (response.cost) {\n this._accumulateBudgetCost(response.cost);\n }\n\n // Snapshot of what we actually sent the provider this turn (excluding the\n // new assistant message that's about to be appended). Consumers can use\n // this to reconstruct the model's exact view on any given turn.\n // structuredClone avoids sharing references with `currentMessages` — later\n // turns mutate pushed-into arrays (e.g. tool_calls), and async consumers\n this.emitEvent({\n type: 'agent_call_end',\n agent: agent._name,\n model: modelUri,\n promptVersion: agent._config.version,\n cost: response.cost,\n tokens: response.usage\n ? {\n input: response.usage.prompt_tokens,\n output: response.usage.completion_tokens,\n reasoning: response.usage.reasoning_tokens,\n }\n : undefined,\n duration: Date.now() - turnStart,\n data: {\n response: response.content,\n ...(response.thinking_content ? { thinking: response.thinking_content } : {}),\n turn: turns,\n ...(retryReason ? { retryReason } : {}),\n },\n });\n\n // Handle tool calls\n if (response.tool_calls && response.tool_calls.length > 0) {\n currentMessages.push({\n role: 'assistant',\n content: response.content || '',\n tool_calls: response.tool_calls,\n ...(response.providerMetadata ? { providerMetadata: response.providerMetadata } : {}),\n });\n\n for (const toolCall of response.tool_calls) {\n const toolName = toolCall.function.name;\n\n // Check for handoff\n if (toolName.startsWith('handoff_to_')) {\n const targetName = toolName.replace('handoff_to_', '');\n const descriptor = resolvedHandoffs?.find((h) => h.agent._name === targetName);\n if (descriptor) {\n const mode = descriptor.mode ?? 'oneway';\n\n // For roundtrip, parse the message parameter from tool call args\n let handoffPrompt = prompt;\n if (mode === 'roundtrip') {\n try {\n const args = JSON.parse(toolCall.function.arguments);\n if (args.message) handoffPrompt = args.message;\n } catch {\n // Fall back to original prompt if args can't be parsed\n }\n }\n\n const handoffStart = Date.now();\n // Capture the source ask's frame for handoff correlation.\n // Review B-7 / B-8: we now allocate a REAL ask frame for\n // the target and run its executeAgentCall under\n // `askStorage.run(targetFrame, …)` so events emitted from\n // the target's tool-calling loop carry the proper\n // `askId: handoffToAskId` + `parentAskId: handoffFromAskId`.\n // Previously `toAskId` was a synthesized UUID with no\n // matching frame, so consumers grouping by `askId` saw\n // the handoff row as an orphan.\n const sourceFrame = askStorage.getStore();\n const handoffFromAskId = sourceFrame?.askId ?? this.executionId;\n const handoffSourceDepth = sourceFrame?.depth ?? 0;\n const handoffToAskId = randomUUID();\n const handoffTargetDepth = handoffSourceDepth + 1;\n const targetFrame: AskFrame = {\n askId: handoffToAskId,\n parentAskId: handoffFromAskId,\n depth: handoffTargetDepth,\n agent: descriptor.agent._name,\n stepRef: sourceFrame?.stepRef ?? this.stepRefRoot,\n askCost: { value: 0 },\n };\n\n // Pass accumulated messages so the target agent can see the source agent's work.\n // Forward schema/retries/validate/metadata — the target agent uses its own model params.\n const handoffOptions = options\n ? {\n schema: options.schema,\n retries: options.retries,\n metadata: options.metadata,\n validate: options.validate,\n validateRetries: options.validateRetries,\n }\n : undefined;\n // Execute the target's ask frame. Wraps `executeAgentCall`\n // in ask_start/ask_end so the target has the same event\n // shape as a regular `ctx.ask()` call — consumers grouping\n // by askId can resolve the target agent via its ask_start,\n // and the tree view's per-ask summary (duration, cost,\n // outcome) works uniformly for direct and handoff asks.\n const handoffFn = () =>\n askStorage.run(targetFrame, async () => {\n this.emitEvent({ type: 'ask_start', prompt: handoffPrompt });\n const targetAskStart = Date.now();\n try {\n const result = await this.executeAgentCall(\n descriptor.agent,\n handoffPrompt,\n handoffOptions,\n currentMessages,\n usageCapture,\n );\n this.emitEvent({\n type: 'ask_end',\n outcome: { ok: true, result },\n cost: targetFrame.askCost.value,\n duration: Date.now() - targetAskStart,\n });\n return result;\n } catch (err) {\n this.emitEvent({\n type: 'ask_end',\n outcome: {\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n },\n cost: targetFrame.askCost.value,\n duration: Date.now() - targetAskStart,\n });\n throw err;\n }\n });\n\n // Emit handoff_start BEFORE the target ask begins so it\n // orders correctly in step-sorted timelines (ahead of the\n // target's ask_start / agent_call_* events). Always fired\n // regardless of mode — this event represents the transition.\n this.emitEvent({\n type: 'handoff_start',\n agent: agent._name,\n fromAskId: handoffFromAskId,\n toAskId: handoffToAskId,\n sourceDepth: handoffSourceDepth,\n targetDepth: handoffTargetDepth,\n data: {\n source: agent._name,\n target: targetName,\n mode,\n ...(mode === 'roundtrip' && handoffPrompt !== prompt\n ? { message: handoffPrompt }\n : {}),\n },\n });\n\n if (mode === 'roundtrip') {\n // Roundtrip: execute target, feed result back to source as tool response,\n // then emit `handoff_return` to mark control returning to source.\n // The target's return value is observable on its `ask_end.outcome`.\n const executeRoundtrip = async (): Promise<unknown> => {\n const result = await handoffFn();\n const resultStr = typeof result === 'string' ? result : JSON.stringify(result);\n currentMessages.push({\n role: 'tool',\n content: resultStr,\n tool_call_id: toolCall.id,\n });\n return result;\n };\n\n // `handoff_return` always emits — success OR failure. If the\n // target throws, control still returns to source (via the\n // exception path); without the event the timeline shows a\n // `handoff_start` with no completion. Try/finally re-throws\n // any error so the source's loop sees the failure.\n if (this.spanManager) {\n await this.spanManager.withSpanAsync(\n 'axl.agent.handoff',\n {\n 'axl.handoff.source': agent._name,\n 'axl.handoff.target': targetName,\n 'axl.handoff.mode': mode,\n },\n async (span) => {\n try {\n return await executeRoundtrip();\n } finally {\n const duration = Date.now() - handoffStart;\n span.setAttribute('axl.handoff.duration', duration);\n this.emitEvent({\n type: 'handoff_return',\n agent: agent._name,\n fromAskId: handoffFromAskId,\n toAskId: handoffToAskId,\n sourceDepth: handoffSourceDepth,\n targetDepth: handoffTargetDepth,\n data: { source: agent._name, target: targetName, duration },\n });\n }\n },\n );\n } else {\n try {\n await executeRoundtrip();\n } finally {\n this.emitEvent({\n type: 'handoff_return',\n agent: agent._name,\n fromAskId: handoffFromAskId,\n toAskId: handoffToAskId,\n sourceDepth: handoffSourceDepth,\n targetDepth: handoffTargetDepth,\n data: {\n source: agent._name,\n target: targetName,\n duration: Date.now() - handoffStart,\n },\n });\n }\n }\n continue; // Source agent loop continues\n }\n\n // Oneway (default): return target's result, exiting source's loop.\n // No `handoff_return` event — control doesn't come back to source.\n // The target's `ask_end` already marks the end of this chain.\n if (this.spanManager) {\n return this.spanManager.withSpanAsync(\n 'axl.agent.handoff',\n {\n 'axl.handoff.source': agent._name,\n 'axl.handoff.target': targetName,\n 'axl.handoff.mode': mode,\n },\n async (span) => {\n const result = await handoffFn();\n span.setAttribute('axl.handoff.duration', Date.now() - handoffStart);\n return result;\n },\n );\n }\n return await handoffFn();\n }\n }\n\n // Check toolOverrides first (for mock tool interception)\n const toolOverride = this.toolOverrides?.get(toolName);\n if (toolOverride) {\n let toolArgs: unknown;\n try {\n toolArgs = JSON.parse(toolCall.function.arguments);\n } catch {\n currentMessages.push({\n role: 'tool',\n content: `Error: Invalid JSON in tool arguments. Please provide valid JSON.`,\n tool_call_id: toolCall.id,\n });\n continue;\n }\n this.emitEvent({\n type: 'tool_call_start',\n tool: toolName,\n callId: toolCall.id,\n data: { args: toolArgs },\n });\n this.onToolCall?.(\n { name: toolName, args: toolArgs, callId: toolCall.id },\n callbackMeta,\n );\n const toolStart = Date.now();\n\n const executeOverride = async () => {\n let toolResult: unknown;\n try {\n toolResult = await toolOverride(toolArgs);\n } catch (err) {\n toolResult = { error: err instanceof Error ? err.message : String(err) };\n }\n return toolResult;\n };\n\n const toolResult = this.spanManager\n ? await this.spanManager.withSpanAsync(\n 'axl.tool.call',\n {\n 'axl.tool.name': toolName,\n 'axl.agent.name': agent._name,\n },\n async (span) => {\n const r = await executeOverride();\n span.setAttribute('axl.tool.duration', Date.now() - toolStart);\n const isError =\n r && typeof r === 'object' && 'error' in (r as Record<string, unknown>);\n span.setAttribute('axl.tool.success', !isError);\n if (isError)\n span.setStatus('error', (r as Record<string, unknown>).error as string);\n return r;\n },\n )\n : await executeOverride();\n\n const resultContent = JSON.stringify(toolResult);\n this.emitEvent({\n type: 'tool_call_end',\n agent: agent._name,\n tool: toolName,\n duration: Date.now() - toolStart,\n data: { args: toolArgs, result: toolResult, callId: toolCall.id },\n });\n currentMessages.push({\n role: 'tool',\n content: resultContent,\n tool_call_id: toolCall.id,\n });\n continue;\n }\n\n // Find the tool (check local tools first, then MCP tools)\n const tool = agent._config.tools?.find((t) => t.name === toolName);\n const isMcpTool = !tool && this.mcpManager?.isMcpTool(toolName);\n\n if (!tool && !isMcpTool) {\n // Tool denied\n this.emitEvent({ type: 'tool_denied', agent: agent._name, tool: toolName });\n currentMessages.push({\n role: 'tool',\n content: `Tool \"${toolName}\" is not available. Available tools: ${agent._config.tools?.map((t) => t.name).join(', ') ?? 'none'}`,\n tool_call_id: toolCall.id,\n });\n continue;\n }\n\n // Parse tool arguments\n let toolArgs: unknown;\n try {\n toolArgs = JSON.parse(toolCall.function.arguments);\n } catch {\n currentMessages.push({\n role: 'tool',\n content: `Error: Invalid JSON in tool arguments. Please provide valid JSON.`,\n tool_call_id: toolCall.id,\n });\n continue;\n }\n\n this.emitEvent({\n type: 'tool_call_start',\n tool: toolName,\n callId: toolCall.id,\n data: { args: toolArgs },\n });\n this.onToolCall?.({ name: toolName, args: toolArgs, callId: toolCall.id }, callbackMeta);\n\n const toolStart = Date.now();\n\n // Approval gate: if tool requires approval, ask the human first.\n // Note: MCP tools have no `tool` object here (isMcpTool is true instead),\n // so they bypass the approval gate entirely. This is intentional — MCP tools\n // are externally managed and don't carry requireApproval config.\n if (tool && tool.requireApproval) {\n const approvalFn = async (): Promise<{ approved: boolean; reason?: string }> => {\n const decision = await this.awaitHuman({\n channel: 'tool_approval',\n prompt: `Tool \"${toolName}\" wants to execute with args: ${JSON.stringify(toolArgs)}`,\n metadata: { toolName, args: toolArgs, agent: agent._name },\n });\n if (!decision.approved) {\n const reason = decision.reason ?? 'Denied by human';\n currentMessages.push({\n role: 'tool',\n content: JSON.stringify({ error: `Tool denied by human: ${reason}` }),\n tool_call_id: toolCall.id,\n });\n return { approved: false, reason };\n }\n return { approved: true };\n };\n\n let approvalOutcome: { approved: boolean; reason?: string };\n if (this.spanManager) {\n approvalOutcome = await this.spanManager.withSpanAsync(\n 'axl.tool.approval',\n {\n 'axl.tool.name': toolName,\n 'axl.agent.name': agent._name,\n },\n async (span) => {\n const result = await approvalFn();\n span.setAttribute('axl.tool.approval.approved', result.approved);\n return result;\n },\n );\n } else {\n approvalOutcome = await approvalFn();\n }\n\n this.emitEvent({\n type: 'tool_approval',\n agent: agent._name,\n tool: toolName,\n data: {\n approved: approvalOutcome.approved,\n args: toolArgs,\n ...(approvalOutcome.reason ? { reason: approvalOutcome.reason } : {}),\n },\n });\n\n if (!approvalOutcome.approved) continue;\n }\n\n // Before hook: transform input before execution\n if (tool && tool.hooks?.before) {\n try {\n toolArgs = await tool.hooks.before(toolArgs, this);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n currentMessages.push({\n role: 'tool',\n content: JSON.stringify({ error: `Before hook error: ${errorMsg}` }),\n tool_call_id: toolCall.id,\n });\n continue;\n }\n }\n\n const executeTool = async (): Promise<{ toolResult: unknown; resultContent: string }> => {\n let toolResult: unknown;\n let resultContent: string;\n\n if (isMcpTool && this.mcpManager) {\n // Execute MCP tool\n try {\n const mcpResult = await this.mcpManager.callTool(toolName, toolArgs);\n toolResult = mcpResult;\n // Extract text content from MCP result\n resultContent = mcpResult.content\n .map((c: { type: string; text?: string }) =>\n c.type === 'text' ? c.text : `[${c.type}]`,\n )\n .join('\\n');\n if (mcpResult.isError) {\n resultContent = `Error: ${resultContent}`;\n }\n } catch (err) {\n toolResult = { error: err instanceof Error ? err.message : String(err) };\n resultContent = JSON.stringify(toolResult);\n }\n } else if (tool) {\n // Execute local tool with a child context for nested agent\n // invocations (agent-as-tool pattern). Nested events are\n // correlated to the outer ask via `parentAskId` from the\n // ALS frame, so the child context doesn't need to thread\n // anything explicitly.\n const childCtx = this.createChildContext();\n try {\n toolResult = await tool._execute(toolArgs, childCtx);\n } catch (err) {\n toolResult = { error: err instanceof Error ? err.message : String(err) };\n }\n\n // After hook: transform output after execution (only on success)\n if (\n tool.hooks?.after &&\n !(\n toolResult &&\n typeof toolResult === 'object' &&\n 'error' in (toolResult as Record<string, unknown>)\n )\n ) {\n try {\n toolResult = await tool.hooks.after(toolResult, this);\n } catch (err) {\n toolResult = {\n error: `After hook error: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n }\n\n // Redact sensitive tool results\n resultContent = tool.sensitive\n ? '[REDACTED - sensitive tool output]'\n : JSON.stringify(toolResult);\n } else {\n toolResult = undefined;\n resultContent = 'Tool execution error';\n }\n\n return { toolResult, resultContent };\n };\n\n // Use qualified \"server:tool_name\" for MCP tools in traces\n const traceName =\n isMcpTool && this.mcpManager\n ? (this.mcpManager.getQualifiedName(toolName) ?? toolName)\n : toolName;\n\n const { toolResult, resultContent } = this.spanManager\n ? await this.spanManager.withSpanAsync(\n 'axl.tool.call',\n {\n 'axl.tool.name': traceName,\n 'axl.agent.name': agent._name,\n },\n async (span) => {\n const r = await executeTool();\n span.setAttribute('axl.tool.duration', Date.now() - toolStart);\n const isError =\n r.toolResult &&\n typeof r.toolResult === 'object' &&\n 'error' in (r.toolResult as Record<string, unknown>);\n span.setAttribute('axl.tool.success', !isError);\n if (isError)\n span.setStatus(\n 'error',\n (r.toolResult as Record<string, unknown>).error as string,\n );\n return r;\n },\n )\n : await executeTool();\n\n this.emitEvent({\n type: 'tool_call_end',\n agent: agent._name,\n tool: traceName,\n duration: Date.now() - toolStart,\n data: { args: toolArgs, result: toolResult, callId: toolCall.id },\n });\n\n currentMessages.push({\n role: 'tool',\n content: resultContent,\n tool_call_id: toolCall.id,\n });\n }\n\n continue; // Next turn\n }\n\n // No tool calls — we have the final response\n const content = response.content;\n\n // -- Gate 1: Output guardrail (raw text — content safety) --\n if (guardrails?.output) {\n const outputResult = await guardrails.output(content, { metadata: this.metadata });\n\n // Compute retry intent *before* emitting the trace so the feedback message\n // the LLM will see on its next attempt is visible in the same event.\n const attempt = guardrailOutputRetries + 1;\n const maxAttempts = maxGuardrailRetries + 1;\n const onBlock = guardrails.onBlock ?? 'throw';\n let feedbackMessage: string | undefined;\n if (\n outputResult.block &&\n onBlock === 'retry' &&\n guardrailOutputRetries < maxGuardrailRetries\n ) {\n feedbackMessage = `Your previous response was blocked by a safety guardrail: ${outputResult.reason ?? 'Output blocked'}. Please provide a different response that complies with the guidelines.`;\n }\n\n this.emitEvent({\n type: 'guardrail',\n agent: agent._name,\n data: {\n guardrailType: 'output',\n blocked: outputResult.block,\n ...(outputResult.reason ? { reason: outputResult.reason } : {}),\n attempt,\n maxAttempts,\n ...(feedbackMessage ? { feedbackMessage } : {}),\n },\n });\n this.spanManager?.addEventToActiveSpan('axl.guardrail.check', {\n 'axl.guardrail.type': 'output',\n 'axl.guardrail.blocked': outputResult.block,\n 'axl.guardrail.attempt': attempt,\n 'axl.guardrail.maxAttempts': maxAttempts,\n ...(outputResult.reason ? { 'axl.guardrail.reason': outputResult.reason } : {}),\n });\n\n if (outputResult.block) {\n if (feedbackMessage) {\n this.emitEvent({\n type: 'pipeline',\n agent: agent._name,\n status: 'failed',\n stage: 'guardrail',\n attempt: guardrailOutputRetries + 1,\n maxAttempts: maxGuardrailRetries + 1,\n reason: feedbackMessage,\n });\n guardrailOutputRetries++;\n appendRetryMessages(\n currentMessages,\n content,\n feedbackMessage,\n response.providerMetadata,\n );\n pendingRetryReason = 'guardrail';\n continue; // Re-enter the while loop for another LLM turn\n }\n if (typeof onBlock === 'function') {\n return onBlock(outputResult.reason ?? 'Output blocked by guardrail', {\n metadata: this.metadata,\n });\n }\n throw new GuardrailError('output', outputResult.reason ?? 'Output blocked by guardrail');\n }\n }\n\n // -- Gate 2: Schema validation (parse + Zod) --\n let validated: unknown = undefined;\n if (options?.schema) {\n const maxSchemaRetries = options.retries ?? 3;\n const schemaAttempt = schemaRetries + 1;\n const schemaMaxAttempts = maxSchemaRetries + 1;\n let schemaValid = false;\n let schemaReason: string | undefined;\n let schemaFeedback: string | undefined;\n let schemaErr: unknown;\n try {\n const parsed = JSON.parse(extractJson(content));\n validated = (options.schema as z.ZodType).parse(parsed);\n schemaValid = true;\n } catch (err) {\n schemaErr = err;\n schemaReason = err instanceof Error ? err.message : String(err);\n if (schemaRetries < maxSchemaRetries) {\n schemaFeedback = `Your response was not valid JSON or did not match the required schema: ${schemaReason}. Please fix and try again.`;\n }\n }\n\n this.emitEvent({\n type: 'schema_check',\n agent: agent._name,\n data: {\n valid: schemaValid,\n ...(schemaReason ? { reason: schemaReason } : {}),\n attempt: schemaAttempt,\n maxAttempts: schemaMaxAttempts,\n ...(schemaFeedback ? { feedbackMessage: schemaFeedback } : {}),\n },\n });\n this.spanManager?.addEventToActiveSpan('axl.schema.check', {\n 'axl.schema.valid': schemaValid,\n 'axl.schema.attempt': schemaAttempt,\n 'axl.schema.maxAttempts': schemaMaxAttempts,\n ...(schemaReason ? { 'axl.schema.reason': schemaReason } : {}),\n });\n\n if (!schemaValid) {\n if (schemaFeedback) {\n this.emitEvent({\n type: 'pipeline',\n agent: agent._name,\n status: 'failed',\n stage: 'schema',\n attempt: schemaRetries + 1,\n maxAttempts: (options.retries ?? 3) + 1,\n reason: schemaFeedback,\n });\n schemaRetries++;\n appendRetryMessages(\n currentMessages,\n content,\n schemaFeedback,\n response.providerMetadata,\n );\n pendingRetryReason = 'schema';\n continue; // Re-enter the while loop for another LLM turn\n }\n const zodErr =\n schemaErr instanceof ZodError\n ? schemaErr\n : new ZodError([\n {\n code: 'custom',\n path: [],\n message: schemaReason ?? 'Schema parse failed',\n },\n ]);\n throw new VerifyError(content, zodErr, maxSchemaRetries);\n }\n }\n\n // -- Gate 3: Business rule validation (typed object) --\n // Only runs when both a schema and validate function are provided.\n // Without a schema, use output guardrails for raw text validation instead.\n if (options?.schema && options.validate) {\n // Wrap user-supplied validator in try/catch — treat exceptions as validation failures\n // so they get the same retry semantics instead of crashing the pipeline.\n let validateResult: ValidateResult;\n try {\n validateResult = await options.validate(validated, {\n metadata: this.metadata,\n });\n } catch (err) {\n const reason = err instanceof Error ? err.message : String(err);\n validateResult = { valid: false, reason: `Validator error: ${reason}` };\n }\n\n const maxValidateRetries = options.validateRetries ?? 2;\n const validateAttempt = validateRetries + 1;\n const validateMaxAttempts = maxValidateRetries + 1;\n let validateFeedback: string | undefined;\n if (!validateResult.valid && validateRetries < maxValidateRetries) {\n validateFeedback = `Your response parsed correctly but failed validation: ${validateResult.reason ?? 'Validation failed'}. Previous attempts are visible above. Please fix and try again.`;\n }\n\n this.emitEvent({\n type: 'validate',\n agent: agent._name,\n data: {\n valid: validateResult.valid,\n ...(validateResult.reason ? { reason: validateResult.reason } : {}),\n attempt: validateAttempt,\n maxAttempts: validateMaxAttempts,\n ...(validateFeedback ? { feedbackMessage: validateFeedback } : {}),\n },\n });\n this.spanManager?.addEventToActiveSpan('axl.validate.check', {\n 'axl.validate.valid': validateResult.valid,\n 'axl.validate.attempt': validateAttempt,\n 'axl.validate.maxAttempts': validateMaxAttempts,\n ...(validateResult.reason ? { 'axl.validate.reason': validateResult.reason } : {}),\n });\n\n if (!validateResult.valid) {\n if (validateFeedback) {\n this.emitEvent({\n type: 'pipeline',\n agent: agent._name,\n status: 'failed',\n stage: 'validate',\n attempt: validateRetries + 1,\n maxAttempts: (options.validateRetries ?? 2) + 1,\n reason: validateFeedback,\n });\n validateRetries++;\n appendRetryMessages(\n currentMessages,\n content,\n validateFeedback,\n response.providerMetadata,\n );\n pendingRetryReason = 'validate';\n continue; // Re-enter the while loop — goes through all gates again\n }\n throw new ValidationError(\n validated,\n validateResult.reason ?? 'Validation failed',\n maxValidateRetries,\n );\n }\n }\n\n // All gates passed — emit pipeline `committed`, push to session\n // history, and return. Spec §4.2: terminal pipeline event for this\n // ask, fires before `done`.\n this.emitEvent({\n type: 'pipeline',\n agent: agent._name,\n status: 'committed',\n stage: lastStartStage,\n attempt: lastStartAttempt,\n maxAttempts: lastStartMaxAttempts,\n });\n this.pushAssistantToSessionHistory(content, response.providerMetadata);\n return validated ?? content;\n }\n\n throw new MaxTurnsError('ctx.ask()', maxTurns);\n }\n\n /**\n * Push the final assistant message into session history, preserving providerMetadata\n * (e.g., Gemini thought signatures needed for multi-turn reasoning context).\n */\n private pushAssistantToSessionHistory(\n content: string,\n providerMetadata?: Record<string, unknown>,\n ): void {\n this.sessionHistory.push({\n role: 'assistant',\n content,\n ...(providerMetadata ? { providerMetadata } : {}),\n });\n }\n\n private buildToolDefs(\n agent: Agent,\n resolvedHandoffs?: Array<{ agent: Agent; description?: string; mode?: 'oneway' | 'roundtrip' }>,\n ): ToolDefinition[] {\n const defs: ToolDefinition[] = [];\n\n if (agent._config.tools) {\n for (const tool of agent._config.tools) {\n defs.push({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: zodToJsonSchema(tool.inputSchema),\n },\n });\n }\n }\n\n // Add handoff tools (already resolved by caller)\n if (resolvedHandoffs) {\n for (const { agent: handoffAgent, description, mode } of resolvedHandoffs) {\n const isRoundtrip = mode === 'roundtrip';\n const defaultDesc = isRoundtrip\n ? `Delegate a task to ${handoffAgent._name} and receive the result back`\n : `Hand off the conversation to ${handoffAgent._name}`;\n defs.push({\n type: 'function',\n function: {\n name: `handoff_to_${handoffAgent._name}`,\n description: description ?? defaultDesc,\n parameters: isRoundtrip\n ? {\n type: 'object',\n properties: { message: { type: 'string', description: 'The task to delegate' } },\n required: ['message'],\n }\n : { type: 'object', properties: {} },\n },\n });\n }\n }\n\n // Add MCP tools\n if (this.mcpManager) {\n const mcpDefs = this.mcpManager.getToolDefinitions(agent._config.mcp, agent._config.mcpTools);\n defs.push(...mcpDefs);\n }\n\n return defs;\n }\n\n /**\n * Summarize old messages to fit within context window.\n * Keeps recent messages intact, summarizes older ones.\n */\n private async summarizeHistory(\n provider: Provider,\n model: string,\n history: ChatMessage[],\n availableTokens: number,\n ): Promise<ChatMessage[]> {\n // If we have a cached summary and the history hasn't grown much, reuse it\n if (this.summaryCache) {\n const summaryMsg: ChatMessage = {\n role: 'system',\n content: `Summary of earlier conversation:\\n${this.summaryCache}`,\n };\n const summaryTokens = estimateTokens(summaryMsg.content) + 4;\n const remaining = availableTokens - summaryTokens;\n\n // Find how many recent messages fit\n let recentTokens = 0;\n let splitIdx = history.length;\n for (let i = history.length - 1; i >= 0; i--) {\n const msgTokens = estimateTokens(history[i].content) + 4;\n if (recentTokens + msgTokens > remaining) break;\n recentTokens += msgTokens;\n splitIdx = i;\n }\n\n if (splitIdx < history.length) {\n return [summaryMsg, ...history.slice(splitIdx)];\n }\n }\n\n // No cache or cache insufficient — generate a new summary\n // Find the split: keep as many recent messages as possible\n let recentTokens = 0;\n let splitIdx = history.length;\n const targetRecent = Math.floor(availableTokens * 0.6); // 60% for recent messages\n\n for (let i = history.length - 1; i >= 0; i--) {\n const msgTokens = estimateTokens(history[i].content) + 4;\n if (recentTokens + msgTokens > targetRecent) break;\n recentTokens += msgTokens;\n splitIdx = i;\n }\n\n // If nothing to summarize (all messages are \"recent\"), just return all\n if (splitIdx === 0) return history;\n\n const oldMessages = history.slice(0, splitIdx);\n\n // Summarize old messages using the configured summary model or the same model\n const summaryModelUri = this.config.contextManagement?.summaryModel;\n let summaryProvider: Provider;\n let summaryModel: string;\n\n if (summaryModelUri) {\n const resolved = this.providerRegistry.resolve(summaryModelUri, this.config);\n summaryProvider = resolved.provider;\n summaryModel = resolved.model;\n } else {\n summaryProvider = provider;\n summaryModel = model;\n }\n\n const oldContent = oldMessages.map((m) => `${m.role}: ${m.content}`).join('\\n');\n\n const summaryResponse = await summaryProvider.chat(\n [\n {\n role: 'system',\n content:\n 'Summarize the following conversation concisely, preserving key facts, decisions, and context needed for continuing the conversation.',\n },\n { role: 'user', content: oldContent },\n ],\n { model: summaryModel, maxTokens: 1024, signal: this.currentSignal },\n );\n\n this.summaryCache = summaryResponse.content;\n\n // Persist summary cache to session metadata so it survives across requests\n const sessionId = this.metadata?.sessionId as string | undefined;\n if (sessionId && this.stateStore) {\n await this.stateStore.saveSessionMeta(sessionId, 'summaryCache', this.summaryCache);\n }\n\n const summaryMsg: ChatMessage = {\n role: 'system',\n content: `Summary of earlier conversation:\\n${summaryResponse.content}`,\n };\n\n return [summaryMsg, ...history.slice(splitIdx)];\n }\n\n // ── ctx.checkpoint() ────────────────────────────────────────────────\n\n /**\n * Execute a function with checkpoint-replay semantics.\n *\n * On first execution, runs `fn()`, saves the result under `name`, and\n * returns it. On replay (resume after restart), returns the saved result\n * without re-executing. This prevents duplicate side effects (double API\n * calls, double refunds, etc.).\n *\n * `name` must be a stable, caller-supplied identifier — the same call\n * site MUST pass the same name across runs of the same execution for\n * replay to work. Names are scoped to a single execution and must be\n * unique within it; reusing a name (e.g. inside a loop) gives\n * last-write-wins behavior. For loops, compose names from the iterator:\n * `ctx.checkpoint(`process-${id}`, fn)`.\n *\n * Names starting with `__auto/` are reserved for runtime-internal\n * auto-checkpointing of `ctx.ask` / spawn / race / parallel / map.\n */\n async checkpoint<T>(name: string, fn: () => Promise<T>): Promise<T> {\n // Defensive validation — checkpoint names are state-store keys, so\n // empty/whitespace-only names round-trip silently and create\n // hard-to-debug replay failures. The reserved-prefix check is\n // case-insensitive and trim-aware so accidentally constructed names\n // like '__AUTO/foo' or ' __auto/foo' don't sneak past.\n if (typeof name !== 'string' || name.length === 0) {\n throw new Error('ctx.checkpoint name must be a non-empty string.');\n }\n if (name !== name.trim()) {\n throw new Error(\n `ctx.checkpoint name \"${name}\" has leading/trailing whitespace — trim before passing.`,\n );\n }\n if (name.toLowerCase().startsWith('__auto/')) {\n throw new Error(\n `ctx.checkpoint name \"${name}\" is reserved — names starting with \"__auto/\" (case-insensitive) are used by the runtime for ask/spawn/race/parallel/map auto-checkpointing.`,\n );\n }\n return this._checkpoint(name, fn);\n }\n\n /**\n * Internal checkpoint implementation shared by both the public\n * `checkpoint(name, fn)` and the automatic checkpointing in\n * ask/spawn/race/parallel/map. Internal callers pass an `__auto/...`\n * name composed by `_autoCheckpointName`.\n *\n * `agent` is the originating agent for ask auto-checkpoints — passing\n * it explicitly stamps `event.agent` on the trace events even though\n * the emit fires before/after `fn()` (where the ask's ALS frame\n * either doesn't exist yet or has already torn down). Without this,\n * post-fn `checkpoint_save` rows show no agent in the trace UI.\n */\n private async _checkpoint<T>(\n name: string,\n fn: () => Promise<T>,\n options?: { agent?: string },\n ): Promise<T> {\n // If no state store, just execute without persistence\n if (!this.stateStore) {\n return fn();\n }\n\n const agentStamp = options?.agent ? { agent: options.agent } : {};\n\n // Check for a saved checkpoint from a previous execution\n const saved = await this.stateStore.getCheckpoint(this.executionId, name);\n if (saved !== null) {\n this.emitEvent({\n type: 'checkpoint_replay',\n ...agentStamp,\n data: { name },\n });\n this.spanManager?.addEventToActiveSpan('axl.checkpoint.hit', { 'axl.checkpoint.name': name });\n return saved as T;\n }\n\n // Execute and save the result\n const result = await fn();\n\n await this.stateStore.saveCheckpoint(this.executionId, name, result);\n\n this.emitEvent({\n type: 'checkpoint_save',\n ...agentStamp,\n data: { name },\n });\n this.spanManager?.addEventToActiveSpan('axl.checkpoint.miss', { 'axl.checkpoint.name': name });\n\n return result;\n }\n\n /** Generate a stable auto-checkpoint name for an internal primitive.\n *\n * For `ctx.ask`, the originating agent is known and gets a per-agent\n * counter — the resulting name reads as \"orchestrator's first ask\"\n * (`__auto/orchestrator-agent/ask/0`) instead of a global ordinal.\n * For `spawn` / `race` / `parallel` / `map`, no agent context is\n * available (those wrap arbitrary fn callbacks), so the name uses\n * the root counter: `__auto/spawn/0`, `__auto/race/3`, etc.\n *\n * All counters live on a shared ref passed through `createChildContext`,\n * so a tool handler's nested `ctx.ask()` (which runs in a child\n * WorkflowContext) can never collide with the parent's auto-names in\n * the state store. */\n private _autoCheckpointName(\n primitive: 'ask' | 'spawn' | 'race' | 'parallel' | 'map',\n agent?: string,\n ): string {\n const counters = this.autoCheckpointCounters;\n if (primitive === 'ask' && agent) {\n const n = counters.byAgent.get(agent) ?? 0;\n counters.byAgent.set(agent, n + 1);\n return `__auto/${agent}/ask/${n}`;\n }\n const n = counters.root++;\n return `__auto/${primitive}/${n}`;\n }\n\n // ── ctx.spawn() ───────────────────────────────────────────────────────\n\n async spawn<T>(\n n: number,\n fn: (index: number) => Promise<T>,\n options?: SpawnOptions,\n ): Promise<Result<T>[]> {\n return this._checkpoint(this._autoCheckpointName('spawn'), () => {\n if (this.spanManager) {\n return this.spanManager.withSpanAsync(\n 'axl.ctx.spawn',\n {\n 'axl.spawn.count': n,\n ...(options?.quorum != null ? { 'axl.spawn.quorum': options.quorum } : {}),\n },\n async (span) => {\n const results = await this._spawnImpl(n, fn, options);\n const completed = results.filter((r) => r !== undefined).length;\n const succeeded = results.filter((r) => r?.ok).length;\n span.setAttribute('axl.spawn.completed', completed);\n span.setAttribute('axl.spawn.succeeded', succeeded);\n span.setAttribute('axl.spawn.cancelled', n - completed);\n return results;\n },\n );\n }\n return this._spawnImpl(n, fn, options);\n });\n }\n\n private async _spawnImpl<T>(\n n: number,\n fn: (index: number) => Promise<T>,\n options?: SpawnOptions,\n ): Promise<Result<T>[]> {\n const results: Result<T>[] = [];\n let successCount = 0;\n const quorum = options?.quorum;\n\n if (quorum) {\n const controller = new AbortController();\n const parentSignal = this.currentSignal;\n const composedSignal = parentSignal\n ? AbortSignal.any([parentSignal, controller.signal])\n : controller.signal;\n\n return new Promise<Result<T>[]>((resolve, reject) => {\n let settled = false;\n let completedCount = 0;\n\n for (let i = 0; i < n; i++) {\n const index = i;\n // Run each branch in an AsyncLocalStorage context with the composed signal\n const p = signalStorage.run(composedSignal, () => fn(index));\n\n p.then((value) => {\n if (settled) return;\n results[index] = { ok: true, value };\n successCount++;\n completedCount++;\n if (successCount >= quorum) {\n settled = true;\n controller.abort(); // Cancel remaining branches\n resolve(results);\n } else if (completedCount === n && successCount < quorum) {\n settled = true;\n reject(new QuorumNotMet(quorum, successCount, results));\n }\n }).catch((err) => {\n if (settled) return;\n // AbortErrors from our cancellation don't count as failures\n const isAbort = err instanceof DOMException && err.name === 'AbortError';\n if (isAbort) {\n completedCount++;\n if (completedCount === n && !settled && successCount < quorum) {\n settled = true;\n reject(new QuorumNotMet(quorum, successCount, results));\n }\n return;\n }\n results[index] = { ok: false, error: err instanceof Error ? err.message : String(err) };\n completedCount++;\n if (completedCount === n && successCount < quorum) {\n settled = true;\n reject(new QuorumNotMet(quorum, successCount, results));\n }\n });\n }\n });\n }\n\n // Default: run all, return all results\n const parentSignal = this.currentSignal;\n const promises = Array.from({ length: n }, (_, i) => {\n const run = () =>\n fn(i)\n .then((value): Result<T> => ({ ok: true, value }))\n .catch(\n (err): Result<T> => ({\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n }),\n );\n // Propagate parent signal so budget hard_stop can cancel non-quorum spawns\n return parentSignal ? signalStorage.run(parentSignal, run) : run();\n });\n\n return Promise.all(promises);\n }\n\n // ── ctx.vote() ────────────────────────────────────────────────────────\n\n vote<T>(results: Result<T>[], options: VoteOptions<T>): T | Promise<T> {\n if (this.spanManager) {\n return this.spanManager.withSpanAsync(\n 'axl.ctx.vote',\n {\n 'axl.vote.strategy': options.strategy,\n 'axl.vote.candidates': results.filter((r) => r.ok).length,\n },\n async (span) => {\n const result = await this._voteImpl(results, options);\n span.setAttribute(\n 'axl.vote.result',\n typeof result === 'object' ? JSON.stringify(result) : String(result),\n );\n return result;\n },\n );\n }\n return this._voteImpl(results, options);\n }\n\n private _voteImpl<T>(results: Result<T>[], options: VoteOptions<T>): T | Promise<T> {\n const successes = results\n .filter((r): r is Result<T> & { ok: true } => r.ok)\n .map((r) => r.value);\n\n if (successes.length === 0) {\n throw new NoConsensus('No successful results to vote on');\n }\n\n const { strategy, key, scorer, reducer } = options;\n\n if (scorer || (strategy === 'custom' && reducer)) {\n return this.asyncVote(successes, options);\n }\n\n switch (strategy) {\n case 'majority':\n return this.majorityVote(successes, key);\n case 'unanimous':\n return this.unanimousVote(successes, key);\n case 'highest':\n return this.numericVote(successes, key, 'highest');\n case 'lowest':\n return this.numericVote(successes, key, 'lowest');\n case 'mean':\n return this.meanVote(successes) as T;\n case 'median':\n return this.medianVote(successes) as T;\n case 'custom':\n if (reducer) return reducer(successes) as T;\n throw new NoConsensus('Custom strategy requires a reducer');\n default:\n throw new NoConsensus(`Unknown strategy: ${strategy}`);\n }\n }\n\n private async asyncVote<T>(successes: T[], options: VoteOptions<T>): Promise<T> {\n const { strategy, scorer, reducer } = options;\n\n if (strategy === 'custom' && reducer) {\n return reducer(successes);\n }\n\n if (scorer && (strategy === 'highest' || strategy === 'lowest')) {\n const scored = await Promise.all(\n successes.map(async (v) => ({ value: v, score: await scorer(v) })),\n );\n scored.sort((a, b) => (strategy === 'highest' ? b.score - a.score : a.score - b.score));\n return scored[0].value;\n }\n\n throw new NoConsensus(`Cannot use scorer with strategy \"${strategy}\"`);\n }\n\n private majorityVote<T>(values: T[], key?: string): T {\n const counts = new Map<string, { count: number; value: T }>();\n for (const v of values) {\n const k = key ? String((v as Record<string, unknown>)[key]) : JSON.stringify(v);\n const entry = counts.get(k);\n if (entry) entry.count++;\n else counts.set(k, { count: 1, value: v });\n }\n let best: { count: number; value: T } | undefined;\n for (const entry of counts.values()) {\n if (!best || entry.count > best.count) best = entry;\n }\n return best!.value;\n }\n\n private unanimousVote<T>(values: T[], key?: string): T {\n const first = key ? (values[0] as Record<string, unknown>)[key] : JSON.stringify(values[0]);\n for (let i = 1; i < values.length; i++) {\n const current = key ? (values[i] as Record<string, unknown>)[key] : JSON.stringify(values[i]);\n if (String(current) !== String(first)) {\n throw new NoConsensus('Unanimous vote failed: values differ');\n }\n }\n return values[0];\n }\n\n private numericVote<T>(values: T[], key: string | undefined, mode: 'highest' | 'lowest'): T {\n let best = values[0];\n let bestVal = key ? Number((values[0] as Record<string, unknown>)[key]) : Number(values[0]);\n for (let i = 1; i < values.length; i++) {\n const val = key ? Number((values[i] as Record<string, unknown>)[key]) : Number(values[i]);\n if (mode === 'highest' ? val > bestVal : val < bestVal) {\n best = values[i];\n bestVal = val;\n }\n }\n return best;\n }\n\n private meanVote(values: unknown[]): number {\n const nums = values.map(Number);\n return nums.reduce((a, b) => a + b, 0) / nums.length;\n }\n\n private medianVote(values: unknown[]): number {\n const sorted = values.map(Number).sort((a, b) => a - b);\n const mid = Math.floor(sorted.length / 2);\n return sorted.length % 2 !== 0 ? sorted[mid] : (sorted[mid - 1] + sorted[mid]) / 2;\n }\n\n // ── ctx.verify() ──────────────────────────────────────────────────────\n\n async verify<T>(\n fn: (retry?: VerifyRetry<T>) => Promise<unknown>,\n schema: z.ZodType<T>,\n options?: VerifyOptions<T>,\n ): Promise<T> {\n const maxRetries = options?.retries ?? 3;\n let lastRetry: VerifyRetry<T> | undefined = undefined;\n\n // Emits exactly one `verify` trace event at each terminal point so consumers\n // can see the outcome (pass/fail) and the number of attempts used. Called\n // just before every return/throw below; no-op on `continue`.\n const emitVerifyOutcome = (passed: boolean, attempts: number, lastError?: string) => {\n this.emitEvent({\n type: 'verify',\n agent: undefined,\n data: {\n passed,\n attempts,\n ...(lastError ? { lastError } : {}),\n },\n });\n };\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n let rawOutput: unknown;\n try {\n const result = await fn(lastRetry);\n rawOutput = result;\n const parsed = schema.parse(result) as T;\n\n // Post-schema business rule validation\n if (options?.validate) {\n let validateResult: ValidateResult;\n try {\n validateResult = await options.validate(parsed, { metadata: this.metadata });\n } catch (err) {\n const reason = err instanceof Error ? err.message : String(err);\n validateResult = { valid: false, reason: `Validator error: ${reason}` };\n }\n if (!validateResult.valid) {\n const errorMsg = validateResult.reason ?? 'Validation failed';\n lastRetry = { error: errorMsg, output: rawOutput, parsed };\n if (attempt === maxRetries) {\n emitVerifyOutcome(false, attempt + 1, errorMsg);\n if (options?.fallback !== undefined) return options.fallback;\n throw new ValidationError(parsed, errorMsg, maxRetries);\n }\n continue;\n }\n }\n\n emitVerifyOutcome(true, attempt + 1);\n return parsed;\n } catch (err) {\n if (err instanceof ValidationError) {\n // ValidationError from our own validate block or from fn (e.g., ctx.ask() validate\n // exhausted). Extract the parsed object so the next retry can repair it.\n // When fn() throws, rawOutput is undefined — fall back to the error's lastOutput.\n lastRetry = {\n error: err.reason,\n output: rawOutput ?? err.lastOutput,\n parsed: err.lastOutput as T,\n };\n if (attempt === maxRetries) {\n emitVerifyOutcome(false, attempt + 1, err.reason);\n if (options?.fallback !== undefined) return options.fallback;\n throw err;\n }\n continue;\n }\n\n // VerifyError from fn (e.g., ctx.ask() with schema exhausted retries, or nested\n // ctx.verify()). Extract lastOutput so fn can attempt repair — output is the raw\n // LLM response that failed parsing, parsed stays undefined.\n if (err instanceof VerifyError) {\n lastRetry = { error: err.message, output: rawOutput ?? err.lastOutput };\n if (attempt === maxRetries) {\n emitVerifyOutcome(false, attempt + 1, err.message);\n if (options?.fallback !== undefined) return options.fallback;\n throw err;\n }\n continue;\n }\n\n const errorMsg =\n err instanceof ZodError ? err.message : err instanceof Error ? err.message : String(err);\n lastRetry = { error: errorMsg, output: rawOutput };\n\n if (attempt === maxRetries) {\n emitVerifyOutcome(false, attempt + 1, errorMsg);\n if (options?.fallback !== undefined) return options.fallback;\n const zodErr =\n err instanceof ZodError\n ? err\n : new ZodError([{ code: 'custom', path: [], message: errorMsg }]);\n throw new VerifyError(rawOutput, zodErr, maxRetries);\n }\n }\n }\n\n emitVerifyOutcome(false, maxRetries + 1, lastRetry?.error ?? 'Verify failed');\n if (options?.fallback !== undefined) return options.fallback;\n throw new VerifyError(\n lastRetry?.output,\n new ZodError([{ code: 'custom', path: [], message: 'Verify failed' }]),\n maxRetries,\n );\n }\n\n // ── ctx.budget() ──────────────────────────────────────────────────────\n\n async budget<T>(options: BudgetOptions, fn: () => Promise<T>): Promise<BudgetResult<T>> {\n const limit = parseCost(options.cost);\n const policy = options.onExceed ?? 'finish_and_stop';\n\n const parentBudget = this.budgetContext;\n const controller = policy === 'hard_stop' ? new AbortController() : undefined;\n const parentSignal = this.currentSignal;\n\n const budgetSignal = controller\n ? parentSignal\n ? AbortSignal.any([parentSignal, controller.signal])\n : controller.signal\n : undefined;\n\n this.budgetContext = {\n totalCost: 0,\n limit,\n exceeded: false,\n policy,\n abortController: controller,\n };\n\n const executeBudget = async (): Promise<BudgetResult<T>> => {\n try {\n // Run fn in an AsyncLocalStorage context with the budget signal\n const value = budgetSignal ? await signalStorage.run(budgetSignal, fn) : await fn();\n const totalCost = this.budgetContext!.totalCost;\n const exceeded = this.budgetContext!.exceeded;\n return { value, budgetExceeded: exceeded, totalCost };\n } catch (err) {\n if (this.budgetContext!.exceeded) {\n return { value: null, budgetExceeded: true, totalCost: this.budgetContext!.totalCost };\n }\n // AbortError from hard_stop should count as budget exceeded\n if (err instanceof DOMException && err.name === 'AbortError' && controller) {\n return { value: null, budgetExceeded: true, totalCost: this.budgetContext!.totalCost };\n }\n throw err;\n } finally {\n if (parentBudget) parentBudget.totalCost += this.budgetContext!.totalCost;\n this.budgetContext = parentBudget;\n }\n };\n\n if (this.spanManager) {\n return this.spanManager.withSpanAsync(\n 'axl.ctx.budget',\n {\n 'axl.budget.limit': limit,\n 'axl.budget.policy': policy,\n },\n async (span) => {\n const result = await executeBudget();\n span.setAttribute('axl.budget.totalCost', result.totalCost);\n span.setAttribute('axl.budget.exceeded', result.budgetExceeded);\n return result;\n },\n );\n }\n\n return executeBudget();\n }\n\n /** Get the current budget status, or null if not inside a budget block. */\n getBudgetStatus(): { spent: number; limit: number; remaining: number } | null {\n if (!this.budgetContext) return null;\n return {\n spent: this.budgetContext.totalCost,\n limit: this.budgetContext.limit,\n remaining: Math.max(0, this.budgetContext.limit - this.budgetContext.totalCost),\n };\n }\n\n // ── ctx.race() ────────────────────────────────────────────────────────\n\n async race<T>(fns: Array<() => Promise<T>>, options?: RaceOptions<T>): Promise<T> {\n return this._checkpoint(this._autoCheckpointName('race'), () => {\n if (this.spanManager) {\n return this.spanManager.withSpanAsync(\n 'axl.ctx.race',\n {\n 'axl.race.participants': fns.length,\n },\n async (span) => {\n let winnerIndex = -1;\n const wrappedFns = fns.map((fn, i) => async () => {\n const result = await fn();\n winnerIndex = i;\n return result;\n });\n const result = await this._raceImpl(wrappedFns, options);\n span.setAttribute('axl.race.resolved', true);\n span.setAttribute('axl.race.winner', winnerIndex);\n return result;\n },\n );\n }\n return this._raceImpl(fns, options);\n });\n }\n\n private async _raceImpl<T>(fns: Array<() => Promise<T>>, options?: RaceOptions<T>): Promise<T> {\n const controller = new AbortController();\n let lastError: Error | undefined;\n const schema = options?.schema as z.ZodType | undefined;\n\n const parentSignal = this.currentSignal;\n const composedSignal = parentSignal\n ? AbortSignal.any([parentSignal, controller.signal])\n : controller.signal;\n\n return new Promise<T>((resolve, reject) => {\n let settled = false;\n let remaining = fns.length;\n\n for (const fn of fns) {\n // Run each branch in an AsyncLocalStorage context with the composed signal.\n // This ensures the signal persists through all awaits in the branch.\n const p = signalStorage.run(composedSignal, fn);\n\n p.then(async (value) => {\n if (settled) return;\n // If a schema is provided, validate the result.\n // Invalid results are discarded and the race continues.\n if (schema) {\n const parsed = schema.safeParse(value);\n if (!parsed.success) {\n remaining--;\n lastError = new Error(`Schema validation failed: ${parsed.error.message}`);\n if (remaining === 0 && !settled) {\n settled = true;\n reject(lastError);\n }\n return;\n }\n // Post-schema business rule validation — invalid results discarded like schema failures\n if (options?.validate) {\n try {\n const validateResult = await options.validate(parsed.data as T, {\n metadata: this.metadata,\n });\n if (!validateResult.valid) {\n remaining--;\n lastError = new Error(\n `Validation failed: ${validateResult.reason ?? 'Validation failed'}`,\n );\n if (remaining === 0 && !settled) {\n settled = true;\n reject(lastError);\n }\n return;\n }\n } catch (err) {\n remaining--;\n lastError =\n err instanceof Error ? err : new Error(`Validator error: ${String(err)}`);\n if (remaining === 0 && !settled) {\n settled = true;\n reject(lastError);\n }\n return;\n }\n }\n if (settled) return; // another branch may have won during async validate\n settled = true;\n controller.abort();\n resolve(parsed.data as T);\n return;\n }\n settled = true;\n controller.abort(); // Cancel losing branches\n resolve(value);\n }).catch((err) => {\n if (settled) return;\n // Ignore AbortErrors from our own cancellation\n if (err instanceof DOMException && err.name === 'AbortError') {\n remaining--;\n if (remaining === 0 && !settled) {\n settled = true;\n reject(lastError ?? new Error('All race branches were aborted'));\n }\n return;\n }\n remaining--;\n lastError = err instanceof Error ? err : new Error(String(err));\n if (remaining === 0 && !settled) {\n settled = true;\n reject(lastError);\n }\n });\n }\n });\n }\n\n // ── ctx.parallel() ────────────────────────────────────────────────────\n\n async parallel<T extends unknown[]>(fns: { [K in keyof T]: () => Promise<T[K]> }): Promise<T> {\n return this._checkpoint(\n this._autoCheckpointName('parallel'),\n () => Promise.all(fns.map((fn) => fn())) as Promise<T>,\n );\n }\n\n // ── ctx.map() ─────────────────────────────────────────────────────────\n\n async map<T, U>(\n items: T[],\n fn: (item: T, index: number) => Promise<U>,\n options?: MapOptions,\n ): Promise<Result<U>[]> {\n return this._checkpoint(this._autoCheckpointName('map'), () =>\n this._mapImpl(items, fn, options),\n );\n }\n\n private async _mapImpl<T, U>(\n items: T[],\n fn: (item: T, index: number) => Promise<U>,\n options?: MapOptions,\n ): Promise<Result<U>[]> {\n const concurrency = options?.concurrency ?? 5;\n const quorum = options?.quorum;\n const results: Result<U>[] = new Array(items.length);\n let nextIndex = 0;\n let successCount = 0;\n let completedCount = 0;\n let settled = false;\n\n const controller = quorum ? new AbortController() : undefined;\n const parentSignal = this.currentSignal;\n const mapSignal = controller\n ? parentSignal\n ? AbortSignal.any([parentSignal, controller.signal])\n : controller.signal\n : parentSignal;\n\n return new Promise<Result<U>[]>((resolve, reject) => {\n if (items.length === 0) {\n resolve([]);\n return;\n }\n\n const runNext = async () => {\n while (nextIndex < items.length && !settled) {\n const idx = nextIndex++;\n try {\n // Run each item in an AsyncLocalStorage context with the map signal\n const value = mapSignal\n ? await signalStorage.run(mapSignal, () => fn(items[idx], idx))\n : await fn(items[idx], idx);\n results[idx] = { ok: true, value };\n successCount++;\n } catch (err) {\n // Ignore AbortErrors from our own quorum cancellation\n if (\n err instanceof DOMException &&\n err.name === 'AbortError' &&\n controller?.signal.aborted\n ) {\n completedCount++;\n return;\n }\n results[idx] = { ok: false, error: err instanceof Error ? err.message : String(err) };\n }\n completedCount++;\n\n if (quorum && successCount >= quorum) {\n settled = true;\n controller?.abort(); // Cancel remaining work\n resolve(results);\n return;\n }\n\n if (completedCount === items.length) {\n if (quorum && successCount < quorum) {\n reject(new QuorumNotMet(quorum, successCount, results));\n } else {\n resolve(results);\n }\n return;\n }\n }\n };\n\n const workers = Math.min(concurrency, items.length);\n for (let i = 0; i < workers; i++) {\n runNext().catch((err) => {\n if (!settled) reject(err);\n });\n }\n });\n }\n\n // ── ctx.awaitHuman() ──────────────────────────────────────────────────\n\n async awaitHuman(options: AwaitHumanOptions): Promise<HumanDecision> {\n if (this.spanManager) {\n return this.spanManager.withSpanAsync(\n 'axl.ctx.awaitHuman',\n {\n 'axl.awaitHuman.channel': options.channel,\n },\n async (span) => {\n const start = Date.now();\n const result = await this._awaitHumanImpl(options);\n span.setAttribute('axl.awaitHuman.wait_duration', Date.now() - start);\n span.setAttribute('axl.awaitHuman.approved', result.approved);\n return result;\n },\n );\n }\n return this._awaitHumanImpl(options);\n }\n\n private async _awaitHumanImpl(options: AwaitHumanOptions): Promise<HumanDecision> {\n if (this.awaitHumanHandler) {\n // Emit `await_human` BEFORE invoking the handler so consumers see the\n // start/end pair regardless of which approval path is taken\n // (synchronous handler vs runtime-mediated pendingDecisions).\n this.emitEvent({\n type: 'await_human',\n data: { channel: options.channel, prompt: options.prompt },\n });\n const decision = await this.awaitHumanHandler(options);\n this.emitEvent({\n type: 'await_human_resolved',\n data: { channel: options.channel, decision },\n });\n return decision;\n }\n\n if (!this.pendingDecisions) {\n throw new Error(\n 'Tool requires approval but no approval handler is configured. ' +\n 'Provide awaitHumanHandler to createContext() or use runtime.execute() with workflow infrastructure.',\n );\n }\n\n if (this.stateStore) {\n await this.stateStore.savePendingDecision(this.executionId, {\n executionId: this.executionId,\n channel: options.channel,\n prompt: options.prompt,\n metadata: options.metadata,\n createdAt: new Date().toISOString(),\n });\n\n // Persist execution state so we can resume after restart\n await this.stateStore.saveExecutionState(this.executionId, {\n workflow: this.workflowName ?? 'unknown',\n input: this.input,\n step: this.stepRefRoot.value,\n status: 'waiting',\n metadata: {\n ...this.metadata,\n awaitHumanChannel: options.channel,\n awaitHumanPrompt: options.prompt,\n },\n });\n }\n\n this.emitEvent({\n type: 'await_human',\n data: { channel: options.channel, prompt: options.prompt },\n });\n\n const decision = await new Promise<HumanDecision>((resolve) => {\n this.pendingDecisions!.set(this.executionId, resolve);\n });\n\n // Mirror the synchronous-handler path — emit `await_human_resolved` so\n // every `await_human` has a paired terminal event regardless of whether\n // the decision came in-process or via runtime.resolveDecision.\n this.emitEvent({\n type: 'await_human_resolved',\n data: { channel: options.channel, decision },\n });\n\n // Update execution state to running after decision is received\n if (this.stateStore) {\n await this.stateStore.saveExecutionState(this.executionId, {\n workflow: this.workflowName ?? 'unknown',\n input: this.input,\n step: this.stepRefRoot.value,\n status: 'running',\n });\n }\n\n return decision;\n }\n\n /**\n * Compose an `AbortSignal` for a memory operation's underlying embedder\n * fetch. Combines the parent context signal (user cancellation,\n * `runtime.execute({ signal })`) with the budget hard_stop abort so\n * that either cause correctly aborts an in-flight embed call.\n *\n * Returns `undefined` if there's nothing to cancel on — the embedder\n * runs without a signal in that case, matching its prior behavior.\n *\n * @internal\n */\n private _composeMemorySignal(): AbortSignal | undefined {\n const budgetSignal = this.budgetContext?.abortController?.signal;\n if (this.signal && budgetSignal) return AbortSignal.any([this.signal, budgetSignal]);\n return this.signal ?? budgetSignal;\n }\n\n /**\n * Accumulate a cost amount into the active `budgetContext` and trip the\n * `exceeded` flag if we've crossed the limit. On `hard_stop` policy,\n * also fires the abort controller so in-flight operations cancel.\n *\n * Called from every code path that spends money: the `agent_call` loop,\n * semantic memory operations (`ctx.remember({embed:true})`, `ctx.recall({query})`),\n * and any future cost-emitting primitive. Centralizing the logic here\n * means `ctx.budget({ limit, policy })` accurately enforces the limit\n * across ALL cost sources — not just agent calls.\n *\n * @internal\n */\n private _accumulateBudgetCost(amount: number): void {\n if (!this.budgetContext) return;\n if (!Number.isFinite(amount) || amount <= 0) return;\n this.budgetContext.totalCost += amount;\n if (this.budgetContext.totalCost >= this.budgetContext.limit) {\n this.budgetContext.exceeded = true;\n // hard_stop: abort current in-flight operations immediately\n if (this.budgetContext.policy === 'hard_stop' && this.budgetContext.abortController) {\n this.budgetContext.abortController.abort();\n }\n }\n }\n\n // ── workflow lifecycle trace emission ──────────────────────────────────\n //\n // These are called by the runtime at execution boundaries. They emit\n // first-class `workflow_start` / `workflow_end` trace events instead of\n // the previous `ctx.log('workflow_start', ...)` indirection — so consumers\n // that narrow via `event.type === 'workflow_start'` actually see them.\n // Internal: the runtime is the only caller, user workflows never call these.\n\n /** @internal — idempotent; no-ops on second+ call within one ctx. */\n _emitWorkflowStart(input: unknown): void {\n if (this._workflowStartEmitted) return;\n this._workflowStartEmitted = true;\n this.emitEvent({\n type: 'workflow_start',\n workflow: this.workflowName,\n data: { input },\n });\n }\n\n /** @internal — idempotent; no-ops on second+ call within one ctx.\n * Protects against the post-emit-side-effect double-fire (reviewer\n * bug B1): `runtime.execute()` / `runtime.stream()` emit\n * `workflow_end(completed)`, then call `deleteCheckpoints` /\n * `persistExecution`. If either throws, the outer catch would\n * otherwise fire a second `workflow_end(failed)` with conflicting\n * status. First-wins semantics: the completed event stands, the\n * inner side-effect failure propagates as a normal thrown error. */\n _emitWorkflowEnd(info: {\n status: 'completed' | 'failed';\n duration: number;\n result?: unknown;\n error?: string;\n aborted?: boolean;\n }): void {\n if (this._workflowEndEmitted) return;\n this._workflowEndEmitted = true;\n this.emitEvent({\n type: 'workflow_end',\n workflow: this.workflowName,\n duration: info.duration,\n data: {\n status: info.status,\n duration: info.duration,\n ...(info.result !== undefined ? { result: info.result } : {}),\n ...(info.error !== undefined ? { error: info.error } : {}),\n ...(info.aborted ? { aborted: true } : {}),\n },\n });\n }\n\n // ── ctx.log() ─────────────────────────────────────────────────────────\n\n log(event: string, data?: unknown): void {\n this.emitEvent({\n type: 'log',\n data: {\n event,\n ...(data && typeof data === 'object'\n ? (data as Record<string, unknown>)\n : data !== undefined\n ? { value: data }\n : {}),\n },\n });\n\n // Forward log events to the active OTel span\n if (this.spanManager) {\n const attrs: Record<string, string | number | boolean> = { 'axl.log.event': event };\n if (data !== undefined && typeof data === 'object' && data !== null) {\n for (const [k, v] of Object.entries(data as Record<string, unknown>)) {\n if (typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean') {\n attrs[`axl.log.${k}`] = v;\n }\n }\n }\n this.spanManager.addEventToActiveSpan('axl.log', attrs);\n }\n }\n\n // -- ctx.remember() / ctx.recall() ----------------------------------------\n\n /**\n * Store a value in memory, scoped to the current session (default) or globally.\n * When a vector store is configured, the value is also embedded for semantic recall.\n */\n async remember(key: string, value: unknown, options?: RememberOptions): Promise<void> {\n if (!this.memoryManager) {\n throw new Error(\n 'Memory is not configured. Provide a memoryManager in WorkflowContextInit or configure memory in AxlConfig.',\n );\n }\n if (!this.stateStore) {\n throw new Error('A state store is required for memory operations.');\n }\n // Budget gate: refuse to start a new memory op if the budget has\n // already been breached. Semantic remember hits a paid embedding API\n // and without this check a hard_stop budget only stopped the next\n // `ctx.ask()` call — memory writes could keep spending after the\n // limit. Mirrors the gate at the top of `ctx.ask()`.\n if (this.budgetContext?.exceeded) {\n const { limit, totalCost: spent, policy } = this.budgetContext;\n if (policy !== 'warn') {\n throw new BudgetExceededError(limit, spent, policy);\n }\n }\n const sessionId = this.metadata?.sessionId as string | undefined;\n const scope: 'session' | 'global' = options?.scope ?? (sessionId ? 'session' : 'global');\n // Operation-only audit trail — values are deliberately NOT traced because\n // they can be arbitrary user data. Emit on both success and failure so\n // compliance consumers can reconstruct the full audit history even when\n // the underlying store rejects the write.\n try {\n const memorySignal = this._composeMemorySignal();\n const { usage } = await this.memoryManager.remember(\n key,\n value,\n this.stateStore,\n sessionId,\n options,\n memorySignal,\n );\n // Budget attribution: embedder spend counts against `ctx.budget()`\n // the same way agent_call cost does. Without this, a RAG workload\n // with heavy semantic memory can silently breach a hard_stop\n // budget (memory cost was previously only flowing through the\n // trace-event rail for trackExecution, bypassing budgetContext).\n if (usage?.cost != null) {\n this._accumulateBudgetCost(usage.cost);\n }\n // Surface embedder cost at the AxlEvent top level so the\n // `trackExecution` listener picks it up automatically (it sums\n // `event.cost` across every event in scope, regardless of type).\n // Also mirror `usage.tokens` to top-level `tokens.input` so the\n // CostAggregator's early-return gate (`cost == null && !tokens`)\n // doesn't silently drop zero-cost-but-nonzero-token events from a\n // local embedder or an unknown-pricing model. Tokens live in\n // `tokens.input` because embedding APIs bill on input only.\n // `usage` is also nested into the event `data` for trace-explorer\n // visibility (debuggers see the full model/cost/tokens breakdown).\n this.emitEvent({\n type: 'memory_remember',\n ...(usage?.cost != null ? { cost: usage.cost } : {}),\n ...(usage?.tokens != null ? { tokens: { input: usage.tokens } } : {}),\n data: {\n key,\n scope,\n embed: options?.embed === true,\n ...(usage ? { usage } : {}),\n },\n });\n } catch (err) {\n // Recover cost attribution on the partial-failure path: if the\n // embedder call succeeded but a downstream step (vectorStore.upsert)\n // failed, `MemoryManager.remember` attaches the usage to the error\n // as a non-enumerable `axlEmbedUsage` property. The user has already\n // been billed for the embed — we owe them accurate cost tracking\n // even though the memory write ultimately failed (including budget\n // accounting, so a partial-failure RAG burst still counts against\n // a hard_stop budget).\n const partialUsage = (err as { axlEmbedUsage?: import('./memory/types.js').EmbedUsage })\n .axlEmbedUsage;\n if (partialUsage?.cost != null) {\n this._accumulateBudgetCost(partialUsage.cost);\n }\n this.emitEvent({\n type: 'memory_remember',\n ...(partialUsage?.cost != null ? { cost: partialUsage.cost } : {}),\n ...(partialUsage?.tokens != null ? { tokens: { input: partialUsage.tokens } } : {}),\n data: {\n key,\n scope,\n embed: options?.embed === true,\n ...(partialUsage ? { usage: partialUsage } : {}),\n error: err instanceof Error ? err.message : String(err),\n },\n });\n throw err;\n }\n }\n\n /**\n * Recall a value from memory by key, or perform semantic search if query option is provided.\n */\n async recall(key: string, options?: RecallOptions): Promise<unknown | VectorResult[] | null> {\n if (!this.memoryManager) {\n throw new Error(\n 'Memory is not configured. Provide a memoryManager in WorkflowContextInit or configure memory in AxlConfig.',\n );\n }\n if (!this.stateStore) {\n throw new Error('A state store is required for memory operations.');\n }\n // Budget gate: refuse to start a new semantic recall if the budget\n // has already been breached. See ctx.remember for rationale.\n if (this.budgetContext?.exceeded) {\n const { limit, totalCost: spent, policy } = this.budgetContext;\n if (policy !== 'warn') {\n throw new BudgetExceededError(limit, spent, policy);\n }\n }\n const sessionId = this.metadata?.sessionId as string | undefined;\n const scope: 'session' | 'global' = options?.scope ?? (sessionId ? 'session' : 'global');\n const semantic = options?.query !== undefined;\n // Operation-only audit trail. Emit on both success and failure.\n try {\n const memorySignal = this._composeMemorySignal();\n const { data, usage } = await this.memoryManager.recall(\n key,\n this.stateStore,\n sessionId,\n options,\n memorySignal,\n );\n let hit: boolean;\n let resultCount: number | undefined;\n if (semantic) {\n resultCount = Array.isArray(data) ? data.length : 0;\n hit = resultCount > 0;\n } else {\n hit = data !== null && data !== undefined;\n }\n // Budget attribution: semantic recall embedder cost counts against\n // `ctx.budget()`. Heavy RAG read workloads could previously breach\n // a hard_stop budget silently — memory cost flowed through the trace\n // rail for trackExecution but bypassed budgetContext.\n if (usage?.cost != null) {\n this._accumulateBudgetCost(usage.cost);\n }\n // Surface embedder cost + tokens at the AxlEvent top level so\n // the `trackExecution` listener picks cost up and the CostAggregator's\n // early-return gate (`cost == null && !tokens`) doesn't silently\n // drop zero-cost-but-nonzero-token events. `usage` is also nested\n // into `data.usage` for trace inspection.\n this.emitEvent({\n type: 'memory_recall',\n ...(usage?.cost != null ? { cost: usage.cost } : {}),\n ...(usage?.tokens != null ? { tokens: { input: usage.tokens } } : {}),\n data: {\n key,\n scope,\n semantic,\n hit,\n ...(resultCount !== undefined ? { resultCount, count: resultCount } : {}),\n ...(usage ? { usage } : {}),\n },\n });\n return data;\n } catch (err) {\n this.emitEvent({\n type: 'memory_recall',\n data: {\n key,\n scope,\n semantic,\n hit: false,\n error: err instanceof Error ? err.message : String(err),\n },\n });\n throw err;\n }\n }\n\n /** Delete a memory entry by key. */\n async forget(key: string, options?: { scope?: 'session' | 'global' }): Promise<void> {\n if (!this.memoryManager) {\n throw new Error(\n 'Memory is not configured. Provide a memoryManager in WorkflowContextInit or configure memory in AxlConfig.',\n );\n }\n if (!this.stateStore) {\n throw new Error('A state store is required for memory operations.');\n }\n const sessionId = this.metadata?.sessionId as string | undefined;\n const scope: 'session' | 'global' = options?.scope ?? (sessionId ? 'session' : 'global');\n try {\n await this.memoryManager.forget(key, this.stateStore, sessionId, options);\n this.emitEvent({\n type: 'memory_forget',\n data: { key, scope },\n });\n } catch (err) {\n this.emitEvent({\n type: 'memory_forget',\n data: {\n key,\n scope,\n error: err instanceof Error ? err.message : String(err),\n },\n });\n throw err;\n }\n }\n\n // ── ctx.delegate() ──────────────────────────────────────────────────\n\n /**\n * Select the best agent from a list of candidates and invoke it.\n * Creates a temporary router agent that uses handoffs to pick the right specialist.\n *\n * This is convenience sugar over creating a router agent with dynamic handoffs.\n * For full control over the router's behavior, create the router agent explicitly.\n *\n * @param agents - Candidate agents to choose from (at least 1)\n * @param prompt - The prompt to send to the selected agent\n * @param options - Optional: schema, routerModel, metadata, retries\n */\n async delegate<T = string>(\n agents: Agent[],\n prompt: string,\n options?: DelegateOptions<T>,\n ): Promise<T> {\n if (agents.length === 0) {\n throw new Error('ctx.delegate() requires at least one candidate agent');\n }\n\n // Validate no duplicate agent names — duplicates produce duplicate tool names\n // which violates LLM API contracts and makes the second agent unreachable.\n const names = new Set<string>();\n for (const a of agents) {\n if (names.has(a._name)) {\n throw new Error(\n `ctx.delegate() received duplicate agent name '${a._name}'. All candidate agents must have unique names.`,\n );\n }\n names.add(a._name);\n }\n\n if (agents.length === 1) {\n this.emitEvent({\n type: 'delegate',\n agent: agents[0]._name,\n data: {\n candidates: [agents[0]._name],\n selected: agents[0]._name,\n reason: 'single_candidate',\n },\n });\n return this.ask(agents[0], prompt, {\n schema: options?.schema,\n retries: options?.retries,\n metadata: options?.metadata,\n validate: options?.validate,\n validateRetries: options?.validateRetries,\n });\n }\n\n // Resolve the router model: explicit option > first candidate's model\n const resolveCtx = options?.metadata\n ? { metadata: { ...this.metadata, ...options.metadata } }\n : { metadata: this.metadata };\n const routerModelUri = options?.routerModel ?? agents[0].resolveModel(resolveCtx);\n\n // Build handoff descriptors from candidates.\n // Use the agent's system prompt (truncated) as the handoff description\n // so the router LLM understands each candidate's capability.\n const handoffs = agents.map((a) => {\n let description: string;\n try {\n description = a.resolveSystem(resolveCtx).slice(0, 200);\n } catch {\n description = `Agent: ${a._name}`;\n }\n return { agent: a, description };\n });\n\n const routerSystem =\n 'Route to the best agent for this task. Always hand off; never answer directly.';\n\n // Create a temporary router agent (inline to avoid circular import with agent.ts).\n // maxTurns: 2 allows one turn for the LLM to pick a handoff, plus one retry\n // if the first response is text instead of a tool call.\n const routerAgent: Agent = {\n _config: {\n model: routerModelUri,\n system: routerSystem,\n temperature: 0,\n handoffs,\n maxTurns: 2,\n },\n _name: '_delegate_router',\n ask: async () => {\n throw new Error('Direct invocation not supported on delegate router');\n },\n resolveModel: () => routerModelUri,\n resolveSystem: () => routerSystem,\n };\n\n this.emitEvent({\n type: 'delegate',\n agent: '_delegate_router',\n data: {\n candidates: agents.map((a) => a._name),\n routerModel: routerModelUri,\n reason: 'routed',\n },\n });\n\n return this.ask(routerAgent, prompt, {\n schema: options?.schema,\n retries: options?.retries,\n metadata: options?.metadata,\n validate: options?.validate,\n validateRetries: options?.validateRetries,\n });\n }\n\n // ── Private ───────────────────────────────────────────────────────────\n\n /**\n * Internal emitter input — intentionally loose so call sites don't need to\n * build a perfectly-narrowed discriminated-union member. The resulting\n * `AxlEvent` (exported type) remains strict, and TypeScript narrows it at\n * consumer sites via the `type` discriminator.\n */\n private emitEvent(partial: {\n type: AxlEvent['type'];\n workflow?: string;\n agent?: string;\n tool?: string;\n promptVersion?: string;\n model?: string;\n cost?: number;\n tokens?: { input?: number; output?: number; reasoning?: number };\n duration?: number;\n data?: unknown;\n // Variant-specific fields are accepted as `unknown`-typed extras so\n // call sites don't need to build a perfectly-narrowed discriminated\n // union member. The final `as unknown as AxlEvent` cast at the bottom\n // of the function is the runtime contract — emit sites are\n // responsible for pairing `type` with the matching variant fields.\n [key: string]: unknown;\n }): void {\n // Redaction is now table-driven: `REDACTION_RULES` in `redaction.ts`\n // owns every per-variant scrub, applied below to the constructed\n // event via `redactEvent(...)`. The legacy if/else ladder that used\n // to live here was duplicated by Studio's `redactStreamEvent`; both\n // sites now consult the same rules so adding a new event variant\n // can't drift between layers. Per-variant scrub contracts live at\n // the rule definitions in `redaction.ts`.\n const data: unknown = partial.data;\n // `as unknown as AxlEvent`: the loose internal `partial` type can't be\n // narrowed to a single discriminated union member at compile time, but the\n // runtime invariant is maintained by the gate/emission call sites that\n // always pair `type` with matching `data`/`tool`/etc.\n //\n // NOTE on redaction: we deliberately do NOT scrub top-level `cost`,\n // `tokens`, or `duration` under `config.trace.redact`. They are numeric\n // observability metrics (non-PII) and are load-bearing — `trackExecution`'s\n // cost-aggregation listener and Studio's CostAggregator both read\n // `event.cost` / `event.tokens` directly, so zeroing them would silently\n // break cost totals when redaction is enabled. In strict compliance\n // environments where even aggregate spend is sensitive, callers should\n // filter these events out entirely via `onTrace` rather than mutate them.\n //\n // NOTE on `workflow`: every trace event gets stamped with the owning\n // workflow name automatically (if set on the context). Previously each\n // caller had to explicitly pass `workflow` in the partial, and only\n // `_emitWorkflowStart` / `_emitWorkflowEnd` did so — which meant\n // `event.workflow` was undefined on every other event type in production.\n // Studio's `CostData.byWorkflow.cost` was effectively always $0 as a\n // result (workflows appeared with execution counts but zero spend).\n // Auto-stamping here is the single-source-of-truth fix: callers can\n // still override via `partial.workflow` if needed (e.g. a child context\n // emitting on behalf of its parent), but the common case \"just works\".\n // Read the ALS frame for ask correlation. The step counter prefers the\n // ALS frame's `stepRef` (which is `this.stepRefRoot` for top-level\n // asks, or the parent's counter for nested asks). Out-of-ask events\n // (workflow_start, workflow_end, ad-hoc log) also use `stepRefRoot` so\n // every event from this WorkflowContext shares one monotonic counter.\n const frame = askStorage.getStore();\n const step = (frame?.stepRef ?? this.stepRefRoot).value++;\n // Per-frame ask cost rollup. Only count cost-bearing leaf events\n // emitted directly within this frame — nested asks have their own\n // frame and their own counter, and their own `ask_end` event will\n // surface their rollup. This keeps `ask_end.cost` honest per spec\n // decision 10. Uses `COST_BEARING_LEAF_TYPES` so the rollup stays\n // in lockstep with `eventCostContribution` / `isCostBearingLeaf` —\n // previously this was hardcoded to `agent_call_end | tool_call_end`\n // which silently dropped embedder cost (`memory_remember` /\n // `memory_recall`) from the per-ask rollup when `ctx.recall()` ran\n // inside an ask.\n const cost = (partial as { cost?: number }).cost;\n if (\n frame &&\n typeof cost === 'number' &&\n Number.isFinite(cost) &&\n cost >= 0 &&\n (COST_BEARING_LEAF_TYPES as readonly string[]).includes(partial.type as string)\n ) {\n frame.askCost.value += cost;\n }\n const event = {\n executionId: this.executionId,\n step,\n timestamp: Date.now(),\n ...(this.workflowName ? { workflow: this.workflowName } : {}),\n // Stamp ask correlation from ALS. Variants like `workflow_start` /\n // `workflow_end` and out-of-ask events (log/memory/checkpoint/await_human\n // when emitted at workflow scope) may legitimately have no frame —\n // they still get `depth: 0` so consumers can render them at root\n // level without having to guess. `askId`/`parentAskId`/`agent` stay\n // unset for non-ask-scoped events, matching the `Partial<AskScoped>`\n // shape on those union members.\n ...(frame\n ? {\n askId: frame.askId,\n ...(frame.parentAskId ? { parentAskId: frame.parentAskId } : {}),\n depth: frame.depth,\n ...(frame.agent ? { agent: frame.agent } : {}),\n }\n : { depth: 0 }),\n ...partial,\n data,\n } as unknown as AxlEvent;\n // Per-variant scrub via the shared `REDACTION_RULES` table — single\n // source of truth shared with Studio's `redactStreamEvent`. Applied\n // AFTER the event is constructed so cost-rail accumulation (above)\n // sees the unscrubbed numeric fields. Top-level numerics (`cost`,\n // `tokens`, `duration`) are preserved by every rule.\n const finalEvent = this.config.trace?.redact ? redactEvent(event) : event;\n // Isolate consumer bugs: a buggy onTrace handler must not crash the\n // workflow. Swallow and forward to console.error so the caller sees\n // the failure in ops but the workflow keeps running.\n if (this.onTrace) {\n try {\n this.onTrace(finalEvent);\n } catch (err) {\n console.error(\n '[axl] onTrace handler threw; trace event dropped:',\n err instanceof Error ? err.message : String(err),\n );\n }\n }\n }\n}\n","import type { ZodError } from 'zod';\nimport type { Result } from './types.js';\n\n/** Base error class for all Axl errors */\nexport class AxlError extends Error {\n readonly code: string;\n\n constructor(code: string, message: string) {\n super(message);\n this.name = 'AxlError';\n this.code = code;\n }\n}\n\n/** Thrown when schema validation fails after all retries exhausted */\nexport class VerifyError extends AxlError {\n readonly lastOutput: unknown;\n readonly zodError: ZodError;\n readonly retries: number;\n\n constructor(lastOutput: unknown, zodError: ZodError, retries: number) {\n super('VERIFY_ERROR', `Schema validation failed after ${retries} retries: ${zodError.message}`);\n this.name = 'VerifyError';\n this.lastOutput = lastOutput;\n this.zodError = zodError;\n this.retries = retries;\n }\n}\n\n/** Thrown when quorum is not met in spawn */\nexport class QuorumNotMet extends AxlError {\n readonly results: Result<unknown>[];\n\n constructor(required: number, actual: number, results: Result<unknown>[]) {\n super('QUORUM_NOT_MET', `Quorum not met: needed ${required} successes, got ${actual}`);\n this.name = 'QuorumNotMet';\n this.results = results;\n }\n}\n\n/** Thrown when vote cannot reach consensus */\nexport class NoConsensus extends AxlError {\n constructor(reason: string) {\n super('NO_CONSENSUS', `No consensus: ${reason}`);\n this.name = 'NoConsensus';\n }\n}\n\n/** Thrown when an operation exceeds its timeout */\nexport class TimeoutError extends AxlError {\n constructor(operation: string, timeoutMs: number) {\n super('TIMEOUT', `${operation} exceeded timeout of ${timeoutMs}ms`);\n this.name = 'TimeoutError';\n }\n}\n\n/**\n * Format a cost for human-readable error messages. Uses tiered precision\n * so sub-cent costs (semantic memory embedder calls, cached responses,\n * free-tier models) don't collapse to `$0.0000`. Mirrors the Studio\n * client's `formatCost` utility so users see consistent numbers.\n *\n * Sign: negative values prefix `-` before the `$`, so `-1.50` renders\n * as `-$1.50` (not `$-1.50`). Negative costs aren't physically\n * meaningful but a budget accounting bug could produce them, and we\n * want those to be visibly wrong instead of hidden behind formatting.\n *\n * Non-finite: `NaN` and `±Infinity` are fail-loud signals that\n * something is broken in cost accounting — we preserve them literally\n * (`$NaN`, `$Infinity`, `-$Infinity`) so users see the bug in the\n * error message rather than a misleading `$0.00`.\n *\n * Tiers (for finite, non-zero values):\n * `|cost| < $0.000001` (noise) → `< $0.000001` (or `-< $0.000001`)\n * `|cost| < $0.0001` → scientific, e.g. `$1.5e-7`\n * `|cost| < $0.01` → 6 decimals, e.g. `$0.000095`\n * `|cost| >= $0.01` → 2 decimals, e.g. `$1.23`\n */\nfunction formatBudgetCost(cost: number): string {\n // Fail-loud on non-finite: `NaN` / `Infinity` reaching this function\n // almost certainly means a cost-accounting bug, and collapsing them\n // to `$0.00` would hide the signal in the error message.\n if (Number.isNaN(cost)) return '$NaN';\n if (cost === Infinity) return '$Infinity';\n if (cost === -Infinity) return '-$Infinity';\n if (cost === 0) return '$0.00';\n\n const sign = cost < 0 ? '-' : '';\n const abs = Math.abs(cost);\n if (abs < 0.000001) return `${sign}< $0.000001`;\n if (abs < 0.0001) {\n const [mantissa, exponent] = abs.toExponential(2).split('e');\n return `${sign}$${mantissa}e${parseInt(exponent, 10)}`;\n }\n if (abs < 0.01) return `${sign}$${abs.toFixed(6)}`;\n return `${sign}$${abs.toFixed(2)}`;\n}\n\n/** Thrown when a budget limit is exceeded */\nexport class BudgetExceededError extends AxlError {\n readonly limit: number;\n readonly spent: number;\n readonly policy: string;\n\n constructor(limit: number, spent: number, policy: string) {\n super(\n 'BUDGET_EXCEEDED',\n `Budget exceeded: spent ${formatBudgetCost(spent)} of ${formatBudgetCost(\n limit,\n )} limit (policy: ${policy})`,\n );\n this.name = 'BudgetExceededError';\n this.limit = limit;\n this.spent = spent;\n this.policy = policy;\n }\n}\n\n/** Thrown when an agent exceeds its maximum number of tool-calling turns */\nexport class MaxTurnsError extends AxlError {\n readonly maxTurns: number;\n\n constructor(operation: string, maxTurns: number) {\n super('MAX_TURNS', `${operation} exceeded maximum of ${maxTurns} turns`);\n this.name = 'MaxTurnsError';\n this.maxTurns = maxTurns;\n }\n}\n\n/** Thrown when a guardrail blocks a request/response and the policy is 'throw'. */\nexport class GuardrailError extends AxlError {\n readonly guardrailType: 'input' | 'output';\n readonly reason: string;\n\n constructor(guardrailType: 'input' | 'output', reason: string) {\n super('GUARDRAIL_BLOCKED', `${guardrailType} guardrail blocked: ${reason}`);\n this.name = 'GuardrailError';\n this.guardrailType = guardrailType;\n this.reason = reason;\n }\n}\n\n/** Thrown when post-schema business rule validation fails after all retries exhausted */\nexport class ValidationError extends AxlError {\n readonly lastOutput: unknown;\n readonly reason: string;\n readonly retries: number;\n\n constructor(lastOutput: unknown, reason: string, retries: number) {\n super('VALIDATION_ERROR', `Validation failed after ${retries} retries: ${reason}`);\n this.name = 'ValidationError';\n this.lastOutput = lastOutput;\n this.reason = reason;\n this.retries = retries;\n }\n}\n\n/** Internal: thrown when an agent tries to call a tool not in its ACL */\nexport class ToolDenied extends AxlError {\n readonly toolName: string;\n readonly agentName: string;\n\n constructor(toolName: string, agentName: string) {\n super(\n 'TOOL_DENIED',\n `Agent \"${agentName}\" attempted to call tool \"${toolName}\" which is not in its ACL`,\n );\n this.name = 'ToolDenied';\n this.toolName = toolName;\n this.agentName = agentName;\n }\n}\n","/**\n * Tolerant JSON parser for progressive structured-output streaming.\n *\n * Accepts partial / truncated JSON and returns the longest parseable prefix\n * as a structured value. Used by `ctx.ask({ schema })` while streaming so\n * consumers can render fields as they arrive — see `partial_object` AxlEvent.\n *\n * Scope (intentional minimum):\n * - Single-pass tokenizer + recursive-descent state machine.\n * - Only TRAILING truncation is tolerated. Mid-document malformed input\n * throws. (A consumer rendering progressive output sees one well-formed\n * subtree at a time, never bogus shape changes.)\n * - Supports objects, arrays, strings (with `\\\"` `\\\\` `\\n` `\\t` `\\r` `\\b`\n * `\\f` `\\/` `\\uXXXX`), numbers (int/float/exp/negative), `true` /\n * `false` / `null`.\n * - Rejects: trailing commas, comments, unquoted keys.\n *\n * Truncation recovery:\n * - Unterminated string → return content parsed so far.\n * - Unterminated number → return valid prefix if it's a complete number;\n * drop the key/value if the prefix is malformed\n * (`-`, `1.`, `1e` → drop).\n * - Unclosed `[` → array with parsed elements.\n * - Unclosed `{` → object with parsed pairs. A key without a value\n * is dropped.\n * - `,` or `:` at EOF → ignored; the last complete value wins.\n *\n * Zero runtime deps. ~250 LOC.\n */\n\n/**\n * Maximum nesting depth we'll accept before throwing. LLM responses\n * don't organically produce 256-deep nested structures — a deeply-\n * adversarial provider returning `[[[[[...]]]]]` can exhaust V8's\n * default ~10k-frame stack via the recursive-descent walker (each\n * `parseValue` → `parseArray/Object` pair consumes ~3 frames). The\n * cap is an availability guard, not a correctness limit.\n */\nconst MAX_DEPTH = 256;\n\n/** Parse a JSON-shaped string that may be truncated mid-stream. */\nexport function parsePartialJson(input: string): unknown {\n const parser = new PartialParser(input);\n parser.skipWhitespace();\n if (parser.eof()) return undefined;\n const result = parser.parseValue();\n return result.value;\n}\n\n/** Internal: a single attempt at parsing some prefix of the input. */\ntype ParseResult = { value: unknown; complete: boolean };\n\nclass PartialParser {\n private pos = 0;\n private depth = 0;\n constructor(private readonly src: string) {}\n\n eof(): boolean {\n return this.pos >= this.src.length;\n }\n\n peek(): string {\n return this.src[this.pos];\n }\n\n advance(): string {\n return this.src[this.pos++];\n }\n\n skipWhitespace(): void {\n while (!this.eof()) {\n const c = this.peek();\n if (c === ' ' || c === '\\n' || c === '\\t' || c === '\\r') {\n this.pos++;\n } else {\n break;\n }\n }\n }\n\n parseValue(): ParseResult {\n this.skipWhitespace();\n if (this.eof()) return { value: undefined, complete: false };\n const c = this.peek();\n // Gate object/array recursion on the depth counter — scalar parsers\n // don't recurse so they skip the check. Enter/exit via try/finally\n // so any throw from below (EOF, malformed input) still restores the\n // depth counter to its caller-visible state.\n if (c === '{' || c === '[') {\n if (++this.depth > MAX_DEPTH) {\n throw new SyntaxError(\n `Maximum nesting depth exceeded (${MAX_DEPTH}) at position ${this.pos}`,\n );\n }\n try {\n return c === '{' ? this.parseObject() : this.parseArray();\n } finally {\n this.depth--;\n }\n }\n if (c === '\"') return this.parseString();\n if (c === 't' || c === 'f') return this.parseBool();\n if (c === 'n') return this.parseNull();\n if (c === '-' || (c >= '0' && c <= '9')) return this.parseNumber();\n throw new SyntaxError(`Unexpected character '${c}' at position ${this.pos}`);\n }\n\n parseObject(): ParseResult {\n this.advance(); // consume '{'\n const obj: Record<string, unknown> = {};\n this.skipWhitespace();\n if (this.eof()) return { value: obj, complete: false };\n if (this.peek() === '}') {\n this.advance();\n return { value: obj, complete: true };\n }\n while (!this.eof()) {\n this.skipWhitespace();\n if (this.eof()) return { value: obj, complete: false };\n // Trailing comma sniff (mid-stream, the previous iteration already\n // consumed a comma): if we see `}` here, the object is closed.\n if (this.peek() === '}') {\n this.advance();\n return { value: obj, complete: true };\n }\n // Key must be a string. Unquoted keys are rejected.\n if (this.peek() !== '\"') {\n throw new SyntaxError(`Expected '\"' at position ${this.pos}, got '${this.peek()}'`);\n }\n const keyResult = this.parseString();\n if (!keyResult.complete) {\n // Truncated key — drop it; the rest of the object stands.\n return { value: obj, complete: false };\n }\n const key = keyResult.value as string;\n this.skipWhitespace();\n if (this.eof()) return { value: obj, complete: false };\n if (this.peek() !== ':') {\n // Truncated before colon — drop the dangling key.\n return { value: obj, complete: false };\n }\n this.advance(); // consume ':'\n this.skipWhitespace();\n if (this.eof()) return { value: obj, complete: false };\n const valueResult = this.parseValue();\n if (valueResult.value !== undefined || valueResult.complete) {\n obj[key] = valueResult.value;\n }\n if (!valueResult.complete) {\n return { value: obj, complete: false };\n }\n this.skipWhitespace();\n if (this.eof()) return { value: obj, complete: false };\n const next = this.peek();\n if (next === ',') {\n this.advance();\n continue;\n }\n if (next === '}') {\n this.advance();\n return { value: obj, complete: true };\n }\n throw new SyntaxError(`Expected ',' or '}' at position ${this.pos}, got '${next}'`);\n }\n return { value: obj, complete: false };\n }\n\n parseArray(): ParseResult {\n this.advance(); // consume '['\n const arr: unknown[] = [];\n this.skipWhitespace();\n if (this.eof()) return { value: arr, complete: false };\n if (this.peek() === ']') {\n this.advance();\n return { value: arr, complete: true };\n }\n while (!this.eof()) {\n this.skipWhitespace();\n if (this.eof()) return { value: arr, complete: false };\n if (this.peek() === ']') {\n this.advance();\n return { value: arr, complete: true };\n }\n const elemResult = this.parseValue();\n if (elemResult.value !== undefined || elemResult.complete) {\n arr.push(elemResult.value);\n }\n if (!elemResult.complete) {\n return { value: arr, complete: false };\n }\n this.skipWhitespace();\n if (this.eof()) return { value: arr, complete: false };\n const next = this.peek();\n if (next === ',') {\n this.advance();\n continue;\n }\n if (next === ']') {\n this.advance();\n return { value: arr, complete: true };\n }\n throw new SyntaxError(`Expected ',' or ']' at position ${this.pos}, got '${next}'`);\n }\n return { value: arr, complete: false };\n }\n\n parseString(): ParseResult {\n this.advance(); // consume opening '\"'\n let result = '';\n while (!this.eof()) {\n const c = this.advance();\n if (c === '\"') return { value: result, complete: true };\n if (c === '\\\\') {\n if (this.eof()) {\n // Trailing backslash — drop it, return what we have.\n return { value: result, complete: false };\n }\n const esc = this.advance();\n switch (esc) {\n case '\"':\n result += '\"';\n break;\n case '\\\\':\n result += '\\\\';\n break;\n case '/':\n result += '/';\n break;\n case 'b':\n result += '\\b';\n break;\n case 'f':\n result += '\\f';\n break;\n case 'n':\n result += '\\n';\n break;\n case 'r':\n result += '\\r';\n break;\n case 't':\n result += '\\t';\n break;\n case 'u': {\n // 4 hex digits\n if (this.pos + 4 > this.src.length) {\n return { value: result, complete: false };\n }\n const hex = this.src.slice(this.pos, this.pos + 4);\n if (!/^[0-9a-fA-F]{4}$/.test(hex)) {\n throw new SyntaxError(`Invalid \\\\u escape '${hex}' at position ${this.pos}`);\n }\n this.pos += 4;\n result += String.fromCharCode(parseInt(hex, 16));\n break;\n }\n default:\n throw new SyntaxError(`Invalid escape '\\\\${esc}' at position ${this.pos - 1}`);\n }\n } else {\n result += c;\n }\n }\n // EOF without closing quote.\n return { value: result, complete: false };\n }\n\n parseNumber(): ParseResult {\n const start = this.pos;\n if (this.peek() === '-') this.advance();\n // Integer part\n while (!this.eof() && this.peek() >= '0' && this.peek() <= '9') this.advance();\n // Fractional part\n if (!this.eof() && this.peek() === '.') {\n this.advance();\n while (!this.eof() && this.peek() >= '0' && this.peek() <= '9') this.advance();\n }\n // Exponent\n if (!this.eof() && (this.peek() === 'e' || this.peek() === 'E')) {\n this.advance();\n if (!this.eof() && (this.peek() === '+' || this.peek() === '-')) this.advance();\n while (!this.eof() && this.peek() >= '0' && this.peek() <= '9') this.advance();\n }\n const text = this.src.slice(start, this.pos);\n // Reject malformed prefixes like '-', '1.', '1e', '1e+'.\n if (text === '' || text === '-' || /\\.$/.test(text) || /[eE][+-]?$/.test(text)) {\n return { value: undefined, complete: false };\n }\n const n = Number(text);\n if (Number.isNaN(n)) {\n return { value: undefined, complete: false };\n }\n return { value: n, complete: true };\n }\n\n parseBool(): ParseResult {\n const remaining = this.src.slice(this.pos);\n if (remaining.startsWith('true')) {\n this.pos += 4;\n return { value: true, complete: true };\n }\n if (remaining.startsWith('false')) {\n this.pos += 5;\n return { value: false, complete: true };\n }\n // Truncated — could be 'tru' or 'fals'. Drop.\n if ('true'.startsWith(remaining) || 'false'.startsWith(remaining)) {\n this.pos = this.src.length;\n return { value: undefined, complete: false };\n }\n throw new SyntaxError(`Expected 'true' or 'false' at position ${this.pos}`);\n }\n\n parseNull(): ParseResult {\n const remaining = this.src.slice(this.pos);\n if (remaining.startsWith('null')) {\n this.pos += 4;\n return { value: null, complete: true };\n }\n if ('null'.startsWith(remaining)) {\n this.pos = this.src.length;\n return { value: undefined, complete: false };\n }\n throw new SyntaxError(`Expected 'null' at position ${this.pos}`);\n }\n}\n","/**\n * Shared helpers for working with `AxlEvent` streams.\n *\n * Consumers writing their own accumulators / reducers reach for these so\n * they don't have to re-derive spec invariants at every call site. The\n * core runtime, AxlTestRuntime, and Studio's cost reducer ALL use these —\n * keeping one source of truth for each invariant.\n */\nimport type { AxlEvent } from './types.js';\n\n/**\n * Variants that directly carry an authoritative cost charge from the\n * provider (or embedder). `ask_end` is a per-ask ROLLUP of these leaves\n * — counting it alongside them would double-charge. Any future\n * cost-emitting variant MUST be added here AND NOT be a rollup.\n *\n * Treated as a `Set` for O(1) membership checks; exported `as const`\n * tuple so exhaustiveness fixtures can cross-check against\n * `AXL_EVENT_TYPES`.\n */\nexport const COST_BEARING_LEAF_TYPES = [\n 'agent_call_end',\n 'tool_call_end',\n 'memory_remember',\n 'memory_recall',\n] as const;\n\nconst COST_LEAF_SET: ReadonlySet<string> = new Set(COST_BEARING_LEAF_TYPES);\n\n/**\n * Cost contribution of `event` to a running total.\n *\n * Returns the event's `cost` if it's a cost-bearing leaf; 0 otherwise.\n * The key invariant (spec/16 decision 10): `ask_end` events carry a\n * per-ask ROLLUP of leaf costs that already passed through consumer\n * accumulators, so they contribute 0 here to avoid double-counting.\n *\n * Use this at every place you'd write `total += event.cost`:\n *\n * for (const ev of info.events) total += eventCostContribution(ev);\n *\n * Consumers who want the authoritative per-ask rollup read\n * `ask_end.cost` directly — that field is populated whether or not\n * the leaf events were summed separately. Spec decision 10.\n */\nexport function eventCostContribution(event: AxlEvent): number {\n // `ask_end` explicitly excluded (rollup). Other variants that carry\n // a top-level `cost` (e.g., `agent_call_end`, `tool_call_end`,\n // `memory_*`) contribute their charge directly. Unknown future\n // variants with `cost` set but NOT in the leaf set also contribute\n // — covering providers that invent new cost-bearing events. The\n // conservative choice would be \"only count whitelisted\"; we've\n // chosen the liberal choice (\"count anything with cost except\n // ask_end\") because missing a cost charge is a harder-to-detect\n // regression than a small over-count on a hypothetical new variant.\n //\n // `Number.isFinite` guards against NaN / +-Infinity from malformed\n // pricing tables (spec/16 bug-review §B-2). `c >= 0` guards against\n // negative values — providers always charge, never refund per-call,\n // so a negative `cost` is almost certainly a pricing-table typo or a\n // buggy third-party provider. Silently ignore either anomaly:\n // polluting the running total is permanent — it flows into every\n // downstream consumer (budget checks, cost dashboard, eval metadata)\n // and can't be recovered.\n if (event.type === 'ask_end') return 0;\n const c = event.cost;\n return typeof c === 'number' && Number.isFinite(c) && c >= 0 ? c : 0;\n}\n\n/**\n * True when the event is a cost-bearing leaf (contributes directly to\n * totals) — used by internal emitters that need to know whether to\n * bump per-frame askCost rollups.\n *\n * Distinct from `eventCostContribution(e) > 0`: an `agent_call_end`\n * with `cost: 0` is still a leaf (produced by a free / cached turn),\n * just one that happens to contribute zero.\n */\nexport function isCostBearingLeaf(event: AxlEvent): boolean {\n return COST_LEAF_SET.has(event.type);\n}\n\n/**\n * True when the event originates from the root ask (`depth === 0`)\n * or has no ask correlation at all (workflow / done / error / log).\n *\n * Used by consumers that want \"just the chat bubble\" tokens or\n * \"just the root ask\" visuals. Nested-ask UIs drop this filter.\n *\n * `depth` is coerced through `?? 0` so events without the field\n * (out-of-ask lifecycle events, synthesized terminals) are treated\n * as root-level — they're never at depth ≥ 1.\n */\nexport function isRootLevel(event: AxlEvent): boolean {\n // `AskScoped` variants carry `depth`; out-of-ask lifecycle events\n // (workflow_*, done, error, handoff without askId) don't. Treat\n // missing `depth` as root-level — those events are never at\n // depth ≥ 1.\n const d = (event as { depth?: number }).depth;\n return (d ?? 0) === 0;\n}\n","/**\n * Per-variant redaction rules for `AxlEvent`.\n *\n * `config.trace.redact` is an observability-boundary filter that scrubs\n * user/LLM content from events before they reach consumers. Two layers\n * historically applied this filter independently:\n *\n * 1. Core: `WorkflowContext.emitEvent()` — emit-time scrub before `onTrace`.\n * 2. Studio: `redactStreamEvent()` — wire-boundary scrub before WS broadcast\n * and again at REST serialization (`redactExecutionInfo`).\n *\n * Both layers walked the same `AxlEvent` discriminated union, with separate\n * if/else and switch/case ladders. Adding a new variant required updating\n * both. They had drifted: WS missed `workflow_start`/`workflow_end`,\n * `log`, and the full `memory_*` walk that core applied. Defense-in-depth\n * also broke for runtimes that flipped `redact` after emitting events —\n * REST reads of stored `ExecutionInfo.events` would leak fields the WS\n * layer didn't know to scrub.\n *\n * `REDACTION_RULES` is the single source of truth: a `Record<AxlEventType,\n * RuleFor<...>>` so adding a new variant to `AXL_EVENT_TYPES` without a\n * corresponding entry is a typecheck error. Every rule is pure (no\n * mutation), so the same rule runs at emit time and at the wire boundary\n * with identical results.\n *\n * Numeric/structural fields (`cost`, `tokens`, `duration`, `askId`,\n * `parentAskId`, `depth`, `agent`, `executionId`, `step`, `timestamp`,\n * `callId`, `tool`, `model`, `workflow`) are NEVER scrubbed — they're\n * non-PII observability metadata and load-bearing for cost rails. Rules\n * preserve these by spreading `{ ...event }` and only overriding the\n * specific user-content field(s) for that variant.\n */\nimport type { AxlEvent, AxlEventOf, AxlEventType } from './types.js';\n\nexport const REDACTED = '[redacted]';\n\n/** Type-safe rule signature: takes a specific event variant, returns the same variant. */\ntype RuleFor<T extends AxlEventType> = (event: AxlEventOf<T>) => AxlEventOf<T>;\n\n/**\n * Walk a one-level object, preserving structural keys and numeric/boolean\n * scalars while scrubbing strings and replacing nested arrays/null with\n * the redacted sentinel. Used by `log` and `memory_*` rules.\n *\n * Nested object fields (one level deep) get the same treatment: numerics\n * and booleans pass through; everything else becomes `[redacted]`. We\n * deliberately don't recurse beyond one level — `usage.tokens` /\n * `usage.cost` are the only structured-numeric fields we ship today, and\n * preserving them at two-level depth keeps cost-aggregation rails\n * working even under redaction.\n */\nfunction walkObjectOneLevel(\n obj: Record<string, unknown>,\n preserveKeys: ReadonlySet<string>,\n): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) {\n if (preserveKeys.has(k) || typeof v === 'number' || typeof v === 'boolean') {\n out[k] = v;\n } else if (typeof v === 'string') {\n out[k] = REDACTED;\n } else if (v !== null && typeof v === 'object' && !Array.isArray(v)) {\n const inner = v as Record<string, unknown>;\n const innerOut: Record<string, unknown> = {};\n for (const [ik, iv] of Object.entries(inner)) {\n if (typeof iv === 'number' || typeof iv === 'boolean') {\n innerOut[ik] = iv;\n } else {\n innerOut[ik] = REDACTED;\n }\n }\n out[k] = innerOut;\n } else {\n out[k] = REDACTED;\n }\n }\n return out;\n}\n\nconst LOG_PRESERVE_KEYS: ReadonlySet<string> = new Set(['event']);\nconst MEMORY_PRESERVE_KEYS: ReadonlySet<string> = new Set(['scope']);\n\n/** Shared rule for the legacy gate events (`guardrail` / `schema_check` / `validate`). */\nfunction redactGate<T extends 'guardrail' | 'schema_check' | 'validate'>(\n event: AxlEventOf<T>,\n): AxlEventOf<T> {\n const d = (event as { data?: { reason?: string; feedbackMessage?: string } }).data;\n if (!d) return event;\n if (d.reason === undefined && d.feedbackMessage === undefined) return event;\n return {\n ...event,\n data: {\n ...d,\n ...(d.reason !== undefined ? { reason: REDACTED } : {}),\n ...(d.feedbackMessage !== undefined ? { feedbackMessage: REDACTED } : {}),\n },\n } as AxlEventOf<T>;\n}\n\n/** Shared rule for the three `memory_*` events. */\nfunction redactMemory<T extends 'memory_remember' | 'memory_recall' | 'memory_forget'>(\n event: AxlEventOf<T>,\n): AxlEventOf<T> {\n const d = (event as { data?: Record<string, unknown> }).data;\n if (!d || typeof d !== 'object') return event;\n return {\n ...event,\n data: walkObjectOneLevel(d, MEMORY_PRESERVE_KEYS),\n } as AxlEventOf<T>;\n}\n\n/** Identity helper — used for variants that carry no user content. */\nconst passthrough = <T extends AxlEventType>(e: AxlEventOf<T>): AxlEventOf<T> => e;\n\n/**\n * Per-variant rule table. Adding a new variant to `AXL_EVENT_TYPES`\n * without a corresponding entry here is a typecheck error — the\n * `Record<AxlEventType, ...>` mapped type forces exhaustiveness.\n *\n * For variants that ship no user content today (`delegate`,\n * `handoff_return`, `checkpoint_*`), the rule is `passthrough` — but\n * that's still an explicit, reviewed decision rather than a\n * silent omission.\n */\nexport const REDACTION_RULES: { [K in AxlEventType]: RuleFor<K> } = {\n workflow_start: (e) =>\n e.data.input !== undefined ? { ...e, data: { ...e.data, input: REDACTED } } : e,\n workflow_end: (e) => {\n const d = e.data;\n if (d.result === undefined && d.error === undefined) return e;\n return {\n ...e,\n data: {\n ...d,\n ...(d.result !== undefined ? { result: REDACTED } : {}),\n ...(d.error !== undefined ? { error: REDACTED } : {}),\n },\n };\n },\n ask_start: (e) => ({ ...e, prompt: REDACTED }),\n ask_end: (e) => ({\n ...e,\n outcome: e.outcome.ok ? { ok: true, result: REDACTED } : { ok: false, error: REDACTED },\n }),\n agent_call_start: (e) => {\n const d = e.data;\n const out = { ...d, prompt: REDACTED } as typeof d;\n if (d.system !== undefined) out.system = REDACTED;\n if (Array.isArray(d.messages)) {\n out.messages = [{ role: 'system', content: `[${d.messages.length} messages redacted]` }];\n }\n return { ...e, data: out };\n },\n agent_call_end: (e) => {\n const d = e.data;\n const out = { ...d, response: REDACTED } as typeof d;\n if (d.thinking !== undefined) out.thinking = REDACTED;\n if (d.error !== undefined) out.error = REDACTED;\n return { ...e, data: out };\n },\n token: (e) => ({ ...e, data: REDACTED }),\n tool_call_start: (e) => ({ ...e, data: { ...e.data, args: REDACTED } }),\n tool_call_end: (e) => ({ ...e, data: { ...e.data, args: REDACTED, result: REDACTED } }),\n tool_approval: (e) => ({\n ...e,\n data: {\n ...e.data,\n args: REDACTED,\n ...(e.data.reason !== undefined ? { reason: REDACTED } : {}),\n },\n }),\n tool_denied: (e) => {\n if (!e.data) return e;\n const d = e.data;\n if (d.args === undefined && d.reason === undefined) return e;\n return {\n ...e,\n data: {\n ...d,\n ...(d.args !== undefined ? { args: REDACTED } : {}),\n ...(d.reason !== undefined ? { reason: REDACTED } : {}),\n },\n };\n },\n delegate: passthrough as unknown as RuleFor<'delegate'>,\n handoff_start: (e) =>\n e.data.message !== undefined ? { ...e, data: { ...e.data, message: REDACTED } } : e,\n handoff_return: passthrough as unknown as RuleFor<'handoff_return'>,\n pipeline: (e) => (e.status === 'failed' ? { ...e, reason: REDACTED } : e),\n partial_object: (e) => ({ ...e, data: { ...e.data, object: REDACTED } }),\n verify: (e) =>\n e.data.lastError !== undefined ? { ...e, data: { ...e.data, lastError: REDACTED } } : e,\n log: (e) => {\n if (!e.data || typeof e.data !== 'object' || Array.isArray(e.data)) return e;\n return { ...e, data: walkObjectOneLevel(e.data as Record<string, unknown>, LOG_PRESERVE_KEYS) };\n },\n memory_remember: redactMemory as unknown as RuleFor<'memory_remember'>,\n memory_recall: redactMemory as unknown as RuleFor<'memory_recall'>,\n memory_forget: redactMemory as unknown as RuleFor<'memory_forget'>,\n checkpoint_save: passthrough as unknown as RuleFor<'checkpoint_save'>,\n checkpoint_replay: passthrough as unknown as RuleFor<'checkpoint_replay'>,\n await_human: (e) =>\n e.data.prompt !== undefined ? { ...e, data: { ...e.data, prompt: REDACTED } } : e,\n await_human_resolved: (e) => {\n const dec = e.data.decision;\n if (!dec) return e;\n const hasData = 'data' in dec && dec.data !== undefined;\n const hasReason = 'reason' in dec && dec.reason !== undefined;\n if (!hasData && !hasReason) return e;\n const scrubbed = { ...dec };\n if (hasData) (scrubbed as { data?: string }).data = REDACTED;\n if (hasReason) (scrubbed as { reason?: string }).reason = REDACTED;\n return { ...e, data: { ...e.data, decision: scrubbed } };\n },\n guardrail: redactGate as unknown as RuleFor<'guardrail'>,\n schema_check: redactGate as unknown as RuleFor<'schema_check'>,\n validate: redactGate as unknown as RuleFor<'validate'>,\n done: (e) => ({ ...e, data: { result: REDACTED } }),\n error: (e) => ({ ...e, data: { ...e.data, message: REDACTED } }),\n};\n\n/**\n * Apply the redaction rule for `event.type` and return a new event with\n * user-content fields scrubbed. Pure: never mutates the input.\n *\n * Caller responsibility: only invoke when redaction is enabled. The rules\n * unconditionally scrub — they don't gate on `config.trace.redact`. Both\n * `WorkflowContext.emitEvent` (core) and `redactStreamEvent` (Studio)\n * check the flag before calling this function.\n */\nexport function redactEvent(event: AxlEvent): AxlEvent {\n const rule = REDACTION_RULES[event.type] as RuleFor<typeof event.type>;\n return rule(event as never);\n}\n","/** Provider configuration */\nexport type ProviderConfig = {\n apiKey?: string;\n baseUrl?: string;\n};\n\n/** MCP server configuration */\nexport type McpServerConfig = {\n name: string;\n command?: string;\n uri?: string;\n env?: Record<string, string>;\n};\n\n/** Trace configuration */\nexport type TraceConfig = {\n enabled?: boolean;\n level?: 'off' | 'steps' | 'full';\n output?: 'console' | 'json' | 'file';\n /** When true, redact prompt/response data from agent_call trace events to prevent PII leakage. */\n redact?: boolean;\n};\n\nimport type { StateStore } from './state/types.js';\n\n/** State store configuration */\nexport type StateConfig = {\n store?: StateStore | 'memory' | 'sqlite';\n sqlite?: { path: string };\n /**\n * Maximum number of events retained in `ExecutionInfo.events` per\n * execution. Token and partial_object events are already excluded\n * from the array (high-volume, stream-only); this cap bounds the\n * remaining structural events (`agent_call_*`, `tool_call_*`, gate\n * events, pipeline, etc).\n *\n * Pathological workloads (e.g., 50 nested asks × 20-turn tool loops)\n * can otherwise accumulate tens of thousands of events totalling\n * hundreds of MB before the terminal `done` event fires. When the\n * cap is hit, further events are dropped from the array and a single\n * `log` event with `data.event === 'events_truncated'` is appended\n * recording the truncation. The trace channel (`runtime.on('trace')`)\n * and WS broadcast continue to receive every event — only the\n * in-memory `ExecutionInfo.events` array is bounded.\n *\n * Default: 50_000. Set to `Infinity` to disable the cap (legacy\n * behavior; only safe for short-lived executions). Must be a positive\n * integer or `Infinity`.\n */\n maxEventsPerExecution?: number;\n};\n\n/** Global defaults */\nexport type DefaultsConfig = {\n timeout?: string;\n maxRetries?: number;\n budgetPolicy?: 'finish_and_stop' | 'hard_stop' | 'warn';\n};\n\n/** Context window management configuration */\nexport type ContextManagementConfig = {\n summaryModel?: string;\n reserveTokens?: number;\n};\n\nimport type { TelemetryConfig } from './telemetry/types.js';\nimport type { MemoryConfig } from './memory/types.js';\n\n/** Full Axl configuration */\nexport type AxlConfig = {\n providers?: Record<string, ProviderConfig>;\n defaultProvider?: string;\n defaultModel?: string;\n mcp?: {\n servers?: McpServerConfig[];\n };\n state?: StateConfig;\n trace?: TraceConfig;\n defaults?: DefaultsConfig;\n contextManagement?: ContextManagementConfig;\n memory?: MemoryConfig;\n telemetry?: TelemetryConfig;\n};\n\n/**\n * Create a type-safe Axl configuration object for providers, state, tracing, and defaults.\n * @param config - The full Axl configuration (providers, state store, tracing, defaults, context management).\n * @returns The same configuration object, validated at the type level.\n */\nexport function defineConfig(config: AxlConfig): AxlConfig {\n return config;\n}\n\n/** Parse duration strings like \"30s\", \"500ms\", \"5m\" to milliseconds */\nexport function parseDuration(duration: string): number {\n const match = duration.match(/^(\\d+(?:\\.\\d+)?)\\s*(ms|s|m|h)$/);\n if (!match) throw new Error(`Invalid duration format: \"${duration}\"`);\n\n const value = parseFloat(match[1]);\n const unit = match[2];\n\n switch (unit) {\n case 'ms':\n return value;\n case 's':\n return value * 1000;\n case 'm':\n return value * 60_000;\n case 'h':\n return value * 3_600_000;\n default:\n throw new Error(`Unknown duration unit: \"${unit}\"`);\n }\n}\n\n/** Parse cost strings like \"$5.00\" to number */\nexport function parseCost(cost: string): number {\n const match = cost.match(/^\\$?([\\d.]+)$/);\n if (!match) throw new Error(`Invalid cost format: \"${cost}\"`);\n return parseFloat(match[1]);\n}\n\n/** Merge config with environment variable overrides */\nexport function resolveConfig(config: AxlConfig): AxlConfig {\n const resolved = { ...config };\n\n // Env overrides\n if (process.env.AXL_DEFAULT_PROVIDER) {\n resolved.defaultProvider = process.env.AXL_DEFAULT_PROVIDER;\n }\n if (process.env.AXL_STATE_STORE) {\n const envStore = process.env.AXL_STATE_STORE;\n if (envStore === 'memory' || envStore === 'sqlite') {\n resolved.state = {\n ...resolved.state,\n store: envStore,\n };\n }\n }\n if (process.env.AXL_TRACE_ENABLED !== undefined) {\n resolved.trace = { ...resolved.trace, enabled: process.env.AXL_TRACE_ENABLED === 'true' };\n }\n if (process.env.AXL_TRACE_LEVEL) {\n resolved.trace = {\n ...resolved.trace,\n level: process.env.AXL_TRACE_LEVEL as 'off' | 'steps' | 'full',\n };\n }\n\n // Standard API key env vars — create provider entry if it doesn't exist\n if (process.env.OPENAI_API_KEY) {\n if (!resolved.providers) resolved.providers = {};\n resolved.providers.openai = {\n ...(resolved.providers.openai ?? {}),\n apiKey: process.env.OPENAI_API_KEY,\n };\n }\n if (process.env.ANTHROPIC_API_KEY) {\n if (!resolved.providers) resolved.providers = {};\n resolved.providers.anthropic = {\n ...(resolved.providers.anthropic ?? {}),\n apiKey: process.env.ANTHROPIC_API_KEY,\n };\n }\n\n const googleKey = process.env.GOOGLE_API_KEY ?? process.env.GEMINI_API_KEY;\n if (googleKey) {\n if (!resolved.providers) resolved.providers = {};\n resolved.providers.google = {\n ...(resolved.providers.google ?? {}),\n apiKey: googleKey,\n };\n }\n\n return resolved;\n}\n","import type { Tool } from './tool.js';\nimport type { AskOptions, GuardrailsConfig } from './types.js';\nimport type { Effort, ToolChoice } from './providers/types.js';\nimport { ProviderRegistry } from './providers/registry.js';\nimport { WorkflowContext } from './context.js';\nimport { randomUUID } from 'node:crypto';\n\n/** Descriptor for a handoff target agent with optional description. */\nexport type HandoffDescriptor = {\n agent: Agent;\n description?: string;\n /** Handoff mode: 'oneway' (default) exits source loop, 'roundtrip' returns result to source. */\n mode?: 'oneway' | 'roundtrip';\n};\n\n/** Agent configuration */\nexport type AgentConfig = {\n name?: string;\n model: string | ((ctx: { metadata?: Record<string, unknown> }) => string);\n system: string | ((ctx: { metadata?: Record<string, unknown> }) => string);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n tools?: Tool<any, any>[];\n handoffs?:\n | HandoffDescriptor[]\n | ((ctx: { metadata?: Record<string, unknown> }) => HandoffDescriptor[]);\n mcp?: string[];\n mcpTools?: string[];\n temperature?: number;\n maxTokens?: number;\n effort?: Effort;\n thinkingBudget?: number;\n includeThoughts?: boolean;\n toolChoice?: ToolChoice;\n stop?: string[];\n /** Provider-specific options merged into API requests. Not portable across providers. */\n providerOptions?: Record<string, unknown>;\n maxTurns?: number;\n timeout?: string;\n maxContext?: number;\n version?: string;\n guardrails?: GuardrailsConfig;\n};\n\n/** A defined agent instance */\nexport type Agent = {\n readonly _config: AgentConfig;\n readonly _name: string;\n /** Direct invocation for prototyping (no workflow context) */\n ask<T = string>(prompt: string, options?: AskOptions<T>): Promise<T>;\n /** Resolve model string for given context */\n resolveModel(ctx?: { metadata?: Record<string, unknown> }): string;\n /** Resolve system prompt for given context */\n resolveSystem(ctx?: { metadata?: Record<string, unknown> }): string;\n};\n\nlet agentCounter = 0;\n\n/**\n * Define an agent with a model, system prompt, tools, and optional handoffs.\n * Agents are inert definitions until invoked via `ctx.ask()` or `agent.ask()`.\n * @param config - Agent configuration: model URI, system prompt (static or dynamic), tools, temperature, etc.\n * @returns An Agent instance that can be used with `ctx.ask()` inside workflows or called directly for prototyping.\n */\nexport function agent(config: AgentConfig): Agent {\n agentCounter++;\n\n // Derive a name: prefer explicit name, then model string, then fallback counter\n const modelStr = typeof config.model === 'string' ? config.model : undefined;\n const defaultName = config.name ?? modelStr ?? `Agent_${agentCounter}`;\n\n const resolveModel = (ctx?: { metadata?: Record<string, unknown> }): string => {\n return typeof config.model === 'function' ? config.model(ctx ?? {}) : config.model;\n };\n\n const resolveSystem = (ctx?: { metadata?: Record<string, unknown> }): string => {\n const sys = config.system;\n return typeof sys === 'function' ? sys(ctx ?? {}) : sys;\n };\n\n const agentInstance: Agent = {\n _config: config,\n _name: defaultName,\n\n async ask<T = string>(prompt: string, options?: AskOptions<T>): Promise<T> {\n // Direct invocation — creates a lightweight implicit context\n // This is a simplified path for quick experiments and prototyping;\n // production use should use ctx.ask() inside a workflow.\n const registry = new ProviderRegistry();\n const ctx = new WorkflowContext({\n input: prompt,\n executionId: randomUUID(),\n config: {},\n providerRegistry: registry,\n });\n return ctx.ask(agentInstance, prompt, options);\n },\n\n resolveModel,\n resolveSystem,\n };\n\n return agentInstance;\n}\n","import type { z } from 'zod';\nimport type { WorkflowContext } from './context.js';\n\n/** Workflow configuration */\nexport type WorkflowConfig<\n TInput extends z.ZodType = z.ZodType,\n TOutput extends z.ZodType = z.ZodType,\n> = {\n name: string;\n input: TInput;\n output?: TOutput;\n handler: (ctx: WorkflowContext<z.infer<TInput>>) => Promise<z.infer<TOutput>>;\n};\n\n/** A defined workflow instance */\nexport type Workflow<\n TInput extends z.ZodType = z.ZodType,\n TOutput extends z.ZodType = z.ZodType,\n> = {\n readonly name: string;\n readonly inputSchema: TInput;\n readonly outputSchema: TOutput | undefined;\n readonly handler: (ctx: WorkflowContext<z.infer<TInput>>) => Promise<z.infer<TOutput>>;\n};\n\n/**\n * Bivariant-parameter alias for `Workflow<any, any>`. Function parameters\n * are contravariant under strict types, so `Workflow<TInput=MsgType>` won't\n * satisfy a `Workflow<unknown, unknown>` slot. The standard escape hatch is\n * to widen to `any`. This alias gives that workaround a name so call sites\n * (e.g. `AxlRuntime.register`, `AxlTestRuntime.WorkflowLike.handler`) don't\n * each independently re-derive it.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyWorkflow = Workflow<any, any>;\n\n/**\n * Define a named workflow with Zod-validated input/output and an async handler.\n * Register workflows with `AxlRuntime.register()` to execute them.\n * @param config - Workflow configuration: name, input schema, optional output schema, and async handler receiving a WorkflowContext.\n * @returns A Workflow instance ready to be registered with an AxlRuntime.\n */\nexport function workflow<TInput extends z.ZodType, TOutput extends z.ZodType = z.ZodType>(\n config: WorkflowConfig<TInput, TOutput>,\n): Workflow<TInput, TOutput> {\n return {\n name: config.name,\n inputSchema: config.input,\n outputSchema: config.output,\n handler: config.handler,\n };\n}\n","import { EventEmitter } from 'node:events';\nimport { randomUUID } from 'node:crypto';\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport { appendFileSync, mkdirSync } from 'node:fs';\nimport { dirname } from 'node:path';\nimport type { AxlConfig } from './config.js';\nimport { parseCost, resolveConfig } from './config.js';\nimport type { Workflow, AnyWorkflow } from './workflow.js';\nimport type { Tool } from './tool.js';\nimport type { Agent } from './agent.js';\nimport type { Provider } from './providers/types.js';\nimport { ProviderRegistry } from './providers/registry.js';\nimport type { StateStore, PendingDecision, EvalHistoryEntry } from './state/types.js';\nimport { MemoryStore } from './state/memory.js';\nimport { SQLiteStore } from './state/sqlite.js';\nimport { WorkflowContext } from './context.js';\nimport { Session, type SessionOptions } from './session.js';\nimport { AxlStream } from './stream.js';\nimport { McpManager } from './mcp/manager.js';\nimport { MemoryManager } from './memory/manager.js';\nimport type {\n AxlEvent,\n CallbackMeta,\n ExecutionInfo,\n HumanDecision,\n AwaitHumanOptions,\n ChatMessage,\n HandoffRecord,\n} from './types.js';\nimport { eventCostContribution } from './event-utils.js';\nimport { NoopSpanManager } from './telemetry/noop.js';\nimport { createSpanManager } from './telemetry/index.js';\nimport type { SpanManager, SpanHandle } from './telemetry/types.js';\n\n/**\n * Function exported from an eval module that overrides the default\n * `runtime.execute(workflow, input)` behavior. The runtime injects itself as\n * the second argument so user code can call `runtime.createContext()` etc.\n *\n * Returns `{ output, cost?, metadata? }` — cost and metadata are optional and\n * fall back to values derived from `runtime.trackExecution()` when omitted.\n *\n * Single source of truth for the eval-execution contract; consumed by\n * `registerEval`, `getRegisteredEval`, the `axl-eval` CLI, and\n * `@axlsdk/studio`'s eval-loader.\n */\nexport type EvalExecuteWorkflow = (\n input: unknown,\n runtime?: AxlRuntime,\n) => Promise<{ output: unknown; cost?: number; metadata?: Record<string, unknown> }>;\n\n/** Simple DJB2 hash of input for span correlation. */\nfunction hashInput(input: unknown): string {\n const str = JSON.stringify(input) ?? '';\n let hash = 5381;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) + hash + str.charCodeAt(i)) | 0;\n }\n return (hash >>> 0).toString(16);\n}\n\n/** Default cap on `ExecutionInfo.events` per execution. Can be\n * overridden via `config.state.maxEventsPerExecution`. */\nconst DEFAULT_MAX_EVENTS_PER_EXECUTION = 50_000;\n\n/** Detect AbortError from both `DOMException` (browser / Node fetch path)\n * and a plain `Error` with `name === 'AbortError'` (signal.throwIfAborted,\n * user-thrown abort). A strict instanceof check misses cancellations\n * thrown by other code paths. */\nfunction isAbortError(err: unknown): boolean {\n return (\n typeof err === 'object' && err !== null && (err as { name?: unknown }).name === 'AbortError'\n );\n}\n\n/** Bounded push to `execInfo.events`. Skips high-volume stream-only\n * variants (token, partial_object — never persisted).\n *\n * Semantics: `cap` is the MAX array length. When pushing would cross\n * the cap, the cap-th slot is REPLACED with a sentinel `log` event\n * describing the truncation. Subsequent events are silently dropped\n * (the sentinel persists). The trace channel and WS broadcast still\n * see every event — only the in-memory array is bounded.\n *\n * Trade-off: replacing rather than appending preserves the documented\n * \"events.length ≤ cap\" contract at the cost of dropping the cap-th\n * regular event. The sentinel itself encodes the cap and reason so\n * consumers know exactly what was lost. */\nfunction pushEventBounded(execInfo: ExecutionInfo, event: AxlEvent, cap: number): void {\n if (event.type === 'token' || event.type === 'partial_object') return;\n if (cap === Infinity || execInfo.events.length < cap) {\n execInfo.events.push(event);\n return;\n }\n // Length === cap. If the last entry is already the sentinel, this is\n // a silent drop. Otherwise replace the last entry with the sentinel\n // so consumers find a clear truncation marker at array tail.\n const last = execInfo.events[execInfo.events.length - 1];\n const alreadyTruncated =\n last?.type === 'log' &&\n typeof last.data === 'object' &&\n last.data !== null &&\n (last.data as { event?: string }).event === 'events_truncated';\n if (!alreadyTruncated) {\n execInfo.events[execInfo.events.length - 1] = {\n type: 'log',\n executionId: event.executionId,\n step: event.step,\n timestamp: Date.now(),\n data: {\n event: 'events_truncated',\n cap,\n message:\n `ExecutionInfo.events truncated at ${cap} entries. ` +\n `Subsequent events are still delivered to runtime.on('trace') ` +\n `and the WS broadcast — only the in-memory array is bounded. ` +\n `Raise via config.state.maxEventsPerExecution.`,\n },\n } as AxlEvent;\n }\n}\n\nexport type ExecuteOptions = {\n metadata?: Record<string, unknown>;\n /** Handler for tool approval requests. When provided, tools with `requireApproval` resolve\n * via this handler instead of suspending the execution and registering a pending decision.\n * Useful for in-process testing and ad-hoc invocations where you don't want to poll\n * `runtime.getPendingDecisions()` and call `runtime.resolveDecision()`. */\n awaitHumanHandler?: (options: AwaitHumanOptions) => Promise<HumanDecision>;\n};\n\n/**\n * Shape of events forwarded to an eval `onProgress` callback. Mirrors\n * `@axlsdk/eval`'s `EvalProgressEvent` so runtime consumers can type their\n * callbacks without importing the optional peer dep.\n */\nexport type EvalProgressEventShape =\n | { type: 'item_done'; itemIndex: number; totalItems: number }\n | { type: 'run_done'; totalItems: number; failures: number };\n\nexport type CreateContextOptions = {\n metadata?: Record<string, unknown>;\n /** Cost budget for the context (e.g., '$0.50'). Enforced via finish_and_stop policy. */\n budget?: string;\n /** Abort signal for cancellation/timeouts. */\n signal?: AbortSignal;\n /** Prior conversation history for multi-turn eval testing. */\n sessionHistory?: ChatMessage[];\n /** Token streaming callback. `meta` carries `askId`/`parentAskId`/`depth`/`agent`\n * so consumers can route or filter by ask correlation (e.g.,\n * `meta.depth === 0` for root-only chat UIs). */\n onToken?: (token: string, meta: CallbackMeta) => void;\n /** Fires when an agent invokes a tool. `meta` carries the same ask\n * correlation shape as `onToken`. */\n onToolCall?: (call: { name: string; args: unknown; callId?: string }, meta: CallbackMeta) => void;\n /** Fires when an agent begins processing a turn. `meta` carries the\n * same ask correlation shape as `onToken`. */\n onAgentStart?: (info: { agent: string; model?: string }, meta: CallbackMeta) => void;\n /** Handler for tool approval requests. Called when an agent invokes a tool with requireApproval. */\n awaitHumanHandler?: (options: AwaitHumanOptions) => Promise<HumanDecision>;\n};\n\n/** Cost scope for tracking cost across async boundaries via AsyncLocalStorage. */\ntype CostScope = {\n totalCost: number;\n trackedIds: Set<string>;\n parent?: CostScope;\n};\n\nconst costScopeStorage = new AsyncLocalStorage<CostScope>();\n\n/**\n * The main entry point for executing Axl workflows.\n * Manages workflow registration, provider resolution, state storage, tracing, MCP servers,\n * and human-in-the-loop decision handling. Supports both synchronous (`execute`) and\n * streaming (`stream`) execution modes, as well as multi-turn sessions.\n */\nexport class AxlRuntime extends EventEmitter {\n private config: AxlConfig;\n private workflows = new Map<string, Workflow>();\n private tools = new Map<string, Tool>();\n private agents = new Map<string, Agent>();\n private providerRegistry: ProviderRegistry;\n private stateStore: StateStore;\n private executions = new Map<string, ExecutionInfo>();\n private pendingDecisionResolvers = new Map<string, (d: HumanDecision) => void>();\n private abortControllers = new Map<string, AbortController>();\n private registeredEvals = new Map<\n string,\n { config: unknown; executeWorkflow?: EvalExecuteWorkflow }\n >();\n private mcpManager?: McpManager;\n private memoryManager?: MemoryManager;\n private spanManager: SpanManager = new NoopSpanManager();\n private historicalExecutions = new Map<string, ExecutionInfo>();\n private historicalExecutionsLoadPromise: Promise<void> | null = null;\n private evalHistory: EvalHistoryEntry[] = [];\n private evalHistoryLoadPromise: Promise<void> | null = null;\n /** Resolved cap on `ExecutionInfo.events` per execution. Cached on\n * the instance so per-event onTrace handlers don't reach into\n * `this.config.state` on every emission. */\n private readonly maxEventsPerExecution: number;\n\n constructor(config?: AxlConfig) {\n super();\n this.config = resolveConfig(config ?? {});\n this.providerRegistry = new ProviderRegistry();\n this.stateStore = this.createStateStore();\n // Resolve + validate the events cap once at construction. Reject\n // 0 / negatives / fractions / NaN early; allow Infinity for the\n // legacy \"unbounded\" opt-out.\n const requested = this.config.state?.maxEventsPerExecution;\n if (requested === undefined) {\n this.maxEventsPerExecution = DEFAULT_MAX_EVENTS_PER_EXECUTION;\n } else if (requested === Infinity) {\n this.maxEventsPerExecution = Infinity;\n } else if (\n typeof requested !== 'number' ||\n !Number.isFinite(requested) ||\n !Number.isInteger(requested) ||\n requested < 1\n ) {\n throw new RangeError(\n `config.state.maxEventsPerExecution must be a positive integer or Infinity; got ${requested}`,\n );\n } else {\n this.maxEventsPerExecution = requested;\n }\n if (this.config.memory) {\n this.memoryManager = new MemoryManager({\n vectorStore: this.config.memory.vectorStore,\n embedder: this.config.memory.embedder,\n });\n }\n }\n\n /**\n * Whether `config.trace.redact` is enabled on this runtime. A narrow\n * boolean getter is preferred over exposing the full config because:\n * (a) `Readonly<AxlConfig>` is shallow so the config would be mutable\n * at runtime through sub-objects, subverting any compliance guarantee;\n * (b) observability consumers like Studio only need the boolean, not\n * the whole config tree; (c) if future observability config needs to\n * expand, each new flag gets its own narrow getter.\n *\n * Studio's server-side redaction helpers (executions, memory, sessions,\n * evals, decisions, tools, playground, workflows) all route through\n * this accessor to decide whether to scrub response payloads.\n */\n isRedactEnabled(): boolean {\n return this.config.trace?.redact === true;\n }\n\n /**\n * Initialize MCP servers configured in the config.\n * Call this before executing workflows that use MCP tools.\n */\n async initializeMcp(): Promise<void> {\n if (this.config.mcp?.servers && this.config.mcp.servers.length > 0) {\n this.mcpManager = new McpManager();\n await this.mcpManager.initialize(this.config.mcp.servers);\n }\n }\n\n /**\n * Initialize OpenTelemetry telemetry based on config.\n * Call this before executing workflows to enable span creation.\n */\n async initializeTelemetry(): Promise<void> {\n this.spanManager = await createSpanManager(this.config.telemetry);\n }\n\n /** Get the MCP manager (if initialized). */\n getMcpManager(): McpManager | undefined {\n return this.mcpManager;\n }\n\n private createStateStore(): StateStore {\n const storeOption = this.config.state?.store ?? 'memory';\n if (typeof storeOption !== 'string') return storeOption;\n switch (storeOption) {\n case 'sqlite':\n return new SQLiteStore(this.config.state?.sqlite?.path ?? './data/axl.db');\n case 'memory':\n default:\n return new MemoryStore();\n }\n }\n\n /**\n * Run a workflow body inside an ALREADY-CONSTRUCTED `WorkflowContext`\n * with full lifecycle invariants: emit `workflow_start` → run handler\n * → parse output → emit `workflow_end` → delete checkpoints → persist.\n *\n * Shared between `execute()` and `stream()`. Centralizes the\n * \"start iff end\" pairing invariant so a future emit path\n * (e.g., `resumeExecution`) can inherit correct behavior by routing\n * through this helper. Also factors out the AbortError detection.\n *\n * Side effects on `execInfo`: sets `status` / `completedAt` /\n * `duration` / `result` (or `error`) before emitting `workflow_end`.\n * On throw: emits `workflow_end({status: 'failed', aborted?})` and\n * persists before rethrowing. `abortControllers.delete` runs in\n * `finally` regardless of outcome.\n *\n * Caller responsibilities:\n * - Allocate `executionId` and register it in `abortControllers` map\n * BEFORE calling this helper (so early-throw paths still have a\n * correlation id available for terminal events).\n * - Construct `execInfo` and `ctx` before calling.\n * - Pass `span` if the call site is inside a tracer span — this\n * helper sets `axl.workflow.cost` / `.duration` attributes on\n * success.\n */\n private async runWorkflowBody(args: {\n workflow: AnyWorkflow;\n ctx: WorkflowContext;\n execInfo: ExecutionInfo;\n validated: unknown;\n span?: SpanHandle;\n }): Promise<unknown> {\n const { workflow, ctx, execInfo, validated, span } = args;\n try {\n // Spec/16 §3.6a: workflow_start is a first-class trace event\n // emitted inside the span context so OTel exporters that correlate\n // events to spans via active-context see it.\n ctx._emitWorkflowStart(validated);\n const raw = await workflow.handler(ctx);\n const result = workflow.outputSchema ? workflow.outputSchema.parse(raw) : raw;\n\n execInfo.status = 'completed';\n execInfo.completedAt = Date.now();\n execInfo.duration = execInfo.completedAt - execInfo.startedAt;\n execInfo.result = result;\n ctx._emitWorkflowEnd({\n status: 'completed',\n duration: execInfo.duration,\n result,\n });\n\n // Clean up checkpoints for completed execution\n if (this.stateStore.deleteCheckpoints) {\n await this.stateStore.deleteCheckpoints(execInfo.executionId);\n }\n\n span?.setAttribute('axl.workflow.cost', execInfo.totalCost);\n span?.setAttribute('axl.workflow.duration', execInfo.duration);\n\n this.persistExecution(execInfo);\n return result;\n } catch (err) {\n const aborted = isAbortError(err);\n execInfo.status = 'failed';\n execInfo.completedAt = Date.now();\n execInfo.duration = execInfo.completedAt - execInfo.startedAt;\n execInfo.error = err instanceof Error ? err.message : String(err);\n ctx._emitWorkflowEnd({\n status: 'failed',\n duration: execInfo.duration,\n error: execInfo.error,\n ...(aborted ? { aborted: true } : {}),\n });\n this.persistExecution(execInfo);\n throw err;\n } finally {\n this.abortControllers.delete(execInfo.executionId);\n }\n }\n\n /**\n * Persist a completed/failed execution to the state store (fire-and-forget)\n * and move it from the active executions map to the historical cache.\n */\n private persistExecution(execInfo: ExecutionInfo): void {\n const snapshot = structuredClone(execInfo);\n\n if (this.stateStore.saveExecution) {\n this.stateStore.saveExecution(snapshot).catch(() => {\n // Best-effort persistence — execution still succeeded/failed normally\n });\n }\n\n // Move from active to historical cache to bound active map growth.\n // Use the snapshot so the cached entry is not mutated by lingering closures.\n const id = execInfo.executionId;\n this.historicalExecutions.set(id, snapshot);\n this.executions.delete(id);\n }\n\n /** Register a workflow with the runtime. */\n register(workflow: AnyWorkflow): void {\n this.workflows.set(workflow.name, workflow);\n }\n\n /** Register standalone tools for Studio introspection and direct testing. */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n registerTool(...tools: Tool<any, any>[]): void {\n for (const t of tools) {\n this.tools.set(t.name, t);\n }\n }\n\n /** Register standalone agents for Studio playground and introspection. */\n registerAgent(...agents: Agent[]): void {\n for (const a of agents) {\n this.agents.set(a._name, a);\n }\n }\n\n // ── Introspection (used by Studio) ────────────────────────────────\n\n /** Get all registered workflow names. */\n getWorkflowNames(): string[] {\n return [...this.workflows.keys()];\n }\n\n /** Get a registered workflow by name. */\n getWorkflow(name: string): Workflow | undefined {\n return this.workflows.get(name);\n }\n\n /** Get all registered workflows. */\n getWorkflows(): Workflow[] {\n return [...this.workflows.values()];\n }\n\n /** Get all registered standalone tools. */\n getTools(): Tool[] {\n return [...this.tools.values()];\n }\n\n /** Get a registered standalone tool by name. */\n getTool(name: string): Tool | undefined {\n return this.tools.get(name);\n }\n\n /** Get all registered standalone agents. */\n getAgents(): Agent[] {\n return [...this.agents.values()];\n }\n\n /** Get a registered standalone agent by name. */\n getAgent(name: string): Agent | undefined {\n return this.agents.get(name);\n }\n\n /**\n * Register an eval config for Studio introspection and execution.\n * The config should be the result of `defineEval()` from `@axlsdk/eval`.\n * An optional `executeWorkflow` function can override the default behavior\n * of calling `runtime.execute()`.\n */\n registerEval(name: string, config: unknown, executeWorkflow?: EvalExecuteWorkflow): void {\n this.registeredEvals.set(name, { config, executeWorkflow });\n }\n\n /** Get metadata about all registered evals. */\n getRegisteredEvals(): Array<{\n name: string;\n workflow: string;\n dataset: string;\n scorers: string[];\n }> {\n const result: Array<{ name: string; workflow: string; dataset: string; scorers: string[] }> =\n [];\n for (const [name, { config }] of this.registeredEvals) {\n const cfg = config as {\n workflow?: string;\n dataset?: { name?: string };\n scorers?: Array<{ name?: string }>;\n };\n result.push({\n name,\n workflow: cfg.workflow ?? 'unknown',\n dataset: cfg.dataset?.name ?? 'unknown',\n scorers: (cfg.scorers ?? []).map((s) => s.name ?? 'unknown'),\n });\n }\n return result;\n }\n\n /** Get a registered eval config by name. */\n getRegisteredEval(\n name: string,\n ): { config: unknown; executeWorkflow?: EvalExecuteWorkflow } | undefined {\n return this.registeredEvals.get(name);\n }\n\n /** Run a registered eval by name. */\n async runRegisteredEval(\n name: string,\n options?: {\n metadata?: Record<string, unknown>;\n /** Called after each dataset item completes (execution + scoring). */\n onProgress?: (event: EvalProgressEventShape) => void;\n /** Abort signal — checked before starting each item. */\n signal?: AbortSignal;\n /**\n * When `true`, populate `EvalItem.traces` on every item (success + failure\n * paths). Forwards to `runEval({ captureTraces: true })`, which wraps each\n * item's execution in `runtime.trackExecution({ captureTraces: true })`.\n * Verbose-mode `agent_call_start.data.messages` snapshots are stripped from\n * captured traces to keep memory bounded.\n */\n captureTraces?: boolean;\n },\n ): Promise<unknown> {\n const entry = this.registeredEvals.get(name);\n if (!entry) throw new Error(`Eval \"${name}\" is not registered`);\n\n let result: unknown;\n\n if (entry.executeWorkflow) {\n // Use custom executeWorkflow if provided, injecting this runtime as second arg\n let runEvalFn: (\n config: unknown,\n executeFn: (\n input: unknown,\n runtime: unknown,\n ) => Promise<{ output: unknown; cost?: number; metadata?: Record<string, unknown> }>,\n runtime: unknown,\n evalOptions?: {\n onProgress?: (event: EvalProgressEventShape) => void;\n signal?: AbortSignal;\n captureTraces?: boolean;\n },\n ) => Promise<unknown>;\n try {\n // @ts-expect-error — @axlsdk/eval is an optional peer dependency\n ({ runEval: runEvalFn } = await import('@axlsdk/eval'));\n } catch {\n throw new Error(\n 'axl-eval is required for AxlRuntime.runRegisteredEval(). Install it with: npm install @axlsdk/eval',\n );\n }\n const originalExecuteFn = entry.executeWorkflow!;\n\n // Wrap with trackExecution for transparent cost + metadata capture.\n // When captureTraces is on, runEval wraps this again in a second\n // trackExecution({ captureTraces: true }) — nested trackExecution walks\n // the AsyncLocalStorage parent chain so both scopes observe events.\n const wrappedExecuteFn = async (\n input: unknown,\n runtime: unknown,\n ): Promise<{ output: unknown; cost?: number; metadata?: Record<string, unknown> }> => {\n const {\n result,\n cost: trackedCost,\n metadata,\n } = await this.trackExecution(async () => {\n return originalExecuteFn(input, runtime as AxlRuntime);\n });\n // Prefer user-supplied cost if present, fall back to tracked cost\n return {\n output: result.output,\n cost: result.cost ?? trackedCost,\n metadata: result.metadata ?? metadata,\n };\n };\n\n result = await runEvalFn(entry.config, wrappedExecuteFn, this, {\n onProgress: options?.onProgress,\n signal: options?.signal,\n captureTraces: options?.captureTraces,\n });\n } else {\n // Default: use runtime.eval() which creates its own executeWorkflow\n result = await this.eval(\n entry.config as {\n workflow: string;\n dataset: unknown;\n scorers: unknown[];\n concurrency?: number;\n budget?: string;\n metadata?: Record<string, unknown>;\n },\n {\n onProgress: options?.onProgress,\n signal: options?.signal,\n captureTraces: options?.captureTraces,\n },\n );\n }\n\n // Merge extra metadata if provided (e.g., runGroupId for multi-run)\n const resultObj = result as Record<string, unknown>;\n if (options?.metadata) {\n resultObj.metadata = {\n ...(resultObj.metadata as Record<string, unknown>),\n ...options.metadata,\n };\n }\n\n // Persist eval result to history (best-effort — don't lose the result on store errors)\n try {\n await this.saveEvalResult({\n id: (resultObj.id as string) ?? randomUUID(),\n eval: name,\n timestamp: Date.now(),\n data: structuredClone(result),\n });\n } catch {\n // Best-effort persistence — eval still succeeded\n }\n\n return result;\n }\n\n /** Get all execution info (running + completed + historical). */\n async getExecutions(): Promise<ExecutionInfo[]> {\n // Lazy-load historical executions from store on first access (once-guard)\n if (!this.historicalExecutionsLoadPromise && this.stateStore.listExecutions) {\n this.historicalExecutionsLoadPromise = this.stateStore\n .listExecutions()\n .then((stored) => {\n for (const exec of stored) {\n if (\n !this.executions.has(exec.executionId) &&\n !this.historicalExecutions.has(exec.executionId)\n ) {\n this.historicalExecutions.set(exec.executionId, exec);\n }\n }\n })\n .catch(() => {\n // Failed to load — reset so next call retries\n this.historicalExecutionsLoadPromise = null;\n });\n }\n if (this.historicalExecutionsLoadPromise) {\n await this.historicalExecutionsLoadPromise;\n }\n\n // Merge: in-memory takes precedence (has live data)\n const merged = new Map(this.historicalExecutions);\n for (const [id, exec] of this.executions) {\n merged.set(id, exec);\n }\n return [...merged.values()].sort((a, b) => b.startedAt - a.startedAt);\n }\n\n /**\n * Create a WorkflowContext for ad-hoc use (evals, tool testing, prototyping).\n * The context has access to the runtime's providers, state store, MCP manager,\n * and automatically emits trace events and tracks cost.\n */\n createContext(options?: CreateContextOptions): WorkflowContext {\n const executionId = randomUUID();\n const budgetLimit = options?.budget ? parseCost(options.budget) : Infinity;\n\n // Register with active cost scope for trackCost() attribution\n this.registerWithCostScope(executionId);\n\n return new WorkflowContext({\n input: undefined,\n executionId,\n metadata: options?.metadata,\n config: this.config,\n providerRegistry: this.providerRegistry,\n stateStore: this.stateStore,\n mcpManager: this.mcpManager,\n spanManager: this.spanManager,\n memoryManager: this.memoryManager,\n sessionHistory: options?.sessionHistory,\n signal: options?.signal,\n onToken: options?.onToken,\n onToolCall: options?.onToolCall,\n onAgentStart: options?.onAgentStart,\n awaitHumanHandler: options?.awaitHumanHandler,\n onTrace: (event: AxlEvent) => {\n this.emit('trace', event);\n this.outputAxlEvent(event);\n },\n budgetContext: {\n totalCost: 0,\n limit: budgetLimit,\n exceeded: false,\n policy: 'finish_and_stop',\n },\n });\n }\n\n /** Register a custom provider instance. */\n registerProvider(name: string, provider: Provider): void {\n this.providerRegistry.registerInstance(name, provider);\n }\n\n /** Resolve a provider:model URI to a Provider instance and model name. */\n resolveProvider(uri: string): { provider: Provider; model: string } {\n return this.providerRegistry.resolve(uri, this.config);\n }\n\n /** Execute a workflow and return the result. */\n async execute(name: string, input: unknown, options?: ExecuteOptions): Promise<unknown> {\n const workflow = this.workflows.get(name);\n if (!workflow) {\n throw new Error(\n `Workflow \"${name}\" not registered. Available: ${[...this.workflows.keys()].join(', ')}`,\n );\n }\n\n // Validate input\n const validated = workflow.inputSchema.parse(input);\n const executionId = randomUUID();\n const controller = new AbortController();\n this.abortControllers.set(executionId, controller);\n\n // Register with active cost scope for trackCost() attribution\n this.registerWithCostScope(executionId);\n\n // Create execution info\n const execInfo: ExecutionInfo = {\n executionId,\n workflow: name,\n status: 'running',\n events: [],\n totalCost: 0,\n startedAt: Date.now(),\n duration: 0,\n };\n this.executions.set(executionId, execInfo);\n\n // Resolve session history from metadata if present\n const sessionHistory = (options?.metadata?.sessionHistory as ChatMessage[]) ?? undefined;\n\n // Create workflow context\n const ctx = new WorkflowContext({\n input: validated,\n executionId,\n metadata: options?.metadata,\n config: this.config,\n providerRegistry: this.providerRegistry,\n sessionHistory,\n signal: controller.signal,\n onTrace: (event: AxlEvent) => {\n // High-volume stream-only events (`token`, `partial_object`)\n // are never persisted, plus a bounded cap on the rest to avoid\n // OOM on pathological workloads (50 nested asks × 20-turn tool\n // loops can otherwise accumulate hundreds of MB before\n // terminal `done`). Trace channel + WS broadcast still see\n // every event; only the in-memory array is bounded.\n pushEventBounded(execInfo, event, this.maxEventsPerExecution);\n execInfo.totalCost += eventCostContribution(event);\n this.emit('trace', event);\n this.outputAxlEvent(event);\n // Persist handoff records to session metadata. Records land on\n // `handoff_start` carrying source/target/mode/toAskId.\n // Duration backfill is mode-specific:\n // - oneway: target's `ask_end.duration` (the target's full work)\n // - roundtrip: `handoff_return.data.duration` (round-trip wall-clock,\n // includes pushing the result back into source's convo)\n // Both modes correlate to the target via `toAskId` (handoff_start)\n // matched against `ask_end.askId`.\n if (event.type === 'handoff_start') {\n const sessionId = options?.metadata?.sessionId as string | undefined;\n if (sessionId) {\n this.appendHandoffRecord(sessionId, {\n source: event.data.source,\n target: event.data.target,\n mode: event.data.mode,\n timestamp: event.timestamp,\n toAskId: event.toAskId,\n });\n }\n } else if (event.type === 'handoff_return') {\n const sessionId = options?.metadata?.sessionId as string | undefined;\n if (sessionId) {\n this.updateHandoffDuration(sessionId, {\n toAskId: event.toAskId,\n duration: event.data.duration,\n });\n }\n } else if (event.type === 'ask_end') {\n // Backfill duration for ONEWAY handoffs whose target just ended.\n // Oneway has no `handoff_return`; without this listener, the\n // record stays `duration: undefined`. Roundtrip records also\n // hit this path, but `handoff_return` fires AFTER the target's\n // `ask_end` and overwrites with the round-trip duration —\n // intentional (round-trip wall-clock is the more useful figure\n // for roundtrip).\n const sessionId = options?.metadata?.sessionId as string | undefined;\n if (sessionId && event.askId && typeof event.duration === 'number') {\n this.updateHandoffDuration(sessionId, {\n toAskId: event.askId,\n duration: event.duration,\n });\n }\n }\n },\n pendingDecisions: this.pendingDecisionResolvers,\n awaitHumanHandler: options?.awaitHumanHandler,\n stateStore: this.stateStore,\n workflowName: name,\n mcpManager: this.mcpManager,\n memoryManager: this.memoryManager,\n resumeMode: !!options?.metadata?.resumeMode,\n spanManager: this.spanManager,\n budgetContext: {\n totalCost: 0,\n limit: Infinity,\n exceeded: false,\n policy: 'finish_and_stop',\n },\n });\n\n return this.spanManager.withSpanAsync(\n 'axl.workflow.execute',\n {\n 'axl.workflow.name': name,\n 'axl.execution.id': executionId,\n 'axl.workflow.input_hash': hashInput(validated),\n },\n (span) =>\n this.runWorkflowBody({\n workflow,\n ctx,\n execInfo,\n validated,\n span,\n }),\n );\n }\n\n /** Execute a workflow and return a stream. */\n stream(name: string, input: unknown, options?: ExecuteOptions): AxlStream {\n const axlStream = new AxlStream();\n const controller = new AbortController();\n\n // Cancel workflow when consumer disconnects (stops reading the stream)\n axlStream.on('close', () => controller.abort());\n\n // Generate executionId BEFORE the async closure so it's available on\n // terminal `done` / `error` events even when `run()` throws early\n // (e.g., unregistered workflow, input validation failure). Review S4:\n // previously `_done(result, execInfo?.executionId ?? '')` sent an\n // empty-string sentinel in that path, which broke consumers\n // correlating the terminal event with the execution.\n const executionId = randomUUID();\n this.abortControllers.set(executionId, controller);\n // `execInfo` is closure-captured for the outer `.catch` so it can\n // tell whether the early-throw safety net needs to fire (it's\n // allocated inside `run()` — the catch path is defensive about\n // running before `execInfo` is assigned).\n let execInfo: ExecutionInfo | undefined;\n\n const run = async () => {\n const workflow = this.workflows.get(name);\n if (!workflow) throw new Error(`Workflow \"${name}\" not registered`);\n\n const validated = workflow.inputSchema.parse(input);\n const sessionHistory = (options?.metadata?.sessionHistory as ChatMessage[]) ?? undefined;\n\n // Register with active cost scope for trackCost() attribution\n this.registerWithCostScope(executionId);\n\n // Create execution info for stream executions\n execInfo = {\n executionId,\n workflow: name,\n status: 'running',\n events: [],\n totalCost: 0,\n startedAt: Date.now(),\n duration: 0,\n };\n this.executions.set(executionId, execInfo);\n\n const wfCtx = new WorkflowContext({\n input: validated,\n executionId,\n metadata: options?.metadata,\n config: this.config,\n providerRegistry: this.providerRegistry,\n sessionHistory,\n signal: controller.signal,\n // Sentinel `onToken` so the streaming code path in WorkflowContext\n // is entered (it's gated on `this.onToken` being defined). The\n // actual `token` AxlEvents are emitted via `emitEvent` and reach\n // the wire through `onTrace` — this callback is just the gate.\n onToken: () => {},\n onTrace: (event: AxlEvent) => {\n // High-volume stream-only events never persist; remaining\n // structural events are bounded by maxEventsPerExecution. See\n // execute() for full rationale.\n pushEventBounded(execInfo!, event, this.maxEventsPerExecution);\n execInfo!.totalCost += eventCostContribution(event);\n this.emit('trace', event);\n this.outputAxlEvent(event);\n // Single fan-out: every event flows verbatim to the wire. The\n // legacy translation layer (which derived StreamEvent shapes\n // like `agent_end` / `tool_result` / `step` and dropped fields\n // along the way) is gone — consumers receive the full AxlEvent.\n axlStream._push(event);\n\n // Side effect: persist handoff records to session metadata.\n // Mirrors the non-streaming path. See the comment block on the\n // execute() onTrace handler for duration semantics.\n if (event.type === 'handoff_start') {\n const sessionId = options?.metadata?.sessionId as string | undefined;\n if (sessionId) {\n this.appendHandoffRecord(sessionId, {\n source: event.data.source,\n target: event.data.target,\n mode: event.data.mode,\n timestamp: event.timestamp,\n toAskId: event.toAskId,\n });\n }\n } else if (event.type === 'handoff_return') {\n const sessionId = options?.metadata?.sessionId as string | undefined;\n if (sessionId) {\n this.updateHandoffDuration(sessionId, {\n toAskId: event.toAskId,\n duration: event.data.duration,\n });\n }\n } else if (event.type === 'ask_end') {\n const sessionId = options?.metadata?.sessionId as string | undefined;\n if (sessionId && event.askId && typeof event.duration === 'number') {\n this.updateHandoffDuration(sessionId, {\n toAskId: event.askId,\n duration: event.duration,\n });\n }\n }\n },\n pendingDecisions: this.pendingDecisionResolvers,\n awaitHumanHandler: options?.awaitHumanHandler,\n stateStore: this.stateStore,\n workflowName: name,\n mcpManager: this.mcpManager,\n memoryManager: this.memoryManager,\n resumeMode: !!options?.metadata?.resumeMode,\n spanManager: this.spanManager,\n budgetContext: {\n totalCost: 0,\n limit: Infinity,\n exceeded: false,\n policy: 'finish_and_stop',\n },\n });\n\n return this.spanManager.withSpanAsync(\n 'axl.workflow.execute',\n {\n 'axl.workflow.name': name,\n 'axl.execution.id': executionId,\n 'axl.workflow.input_hash': hashInput(validated),\n },\n (span) =>\n this.runWorkflowBody({\n workflow,\n ctx: wfCtx,\n execInfo: execInfo!,\n validated,\n span,\n }),\n );\n };\n\n run()\n .then((result) => axlStream._done(result, executionId))\n .catch((err) => {\n // Early-throw safety net: if `runWorkflowBody` was never reached\n // (input parse, ctx construction, or registry lookup threw before\n // it ran), `execInfo.status` is still 'running' — the helper's\n // lifecycle emit/persist/cleanup didn't happen. Update + persist\n // here. If the helper DID run, it left status as 'failed' and\n // already persisted; we skip redundant work.\n if (execInfo && execInfo.status === 'running') {\n execInfo.status = 'failed';\n execInfo.completedAt = Date.now();\n execInfo.duration = execInfo.completedAt - execInfo.startedAt;\n execInfo.error = err instanceof Error ? err.message : String(err);\n // No `ctx` available on this path — `wfCtx` lives inside the\n // run() closure and was never assigned to a closure variable.\n // workflow_start was also never emitted (helper hadn't run),\n // so the start↔end pairing invariant holds: neither emitted.\n // `isAbortError` doesn't apply here either: `aborted: true` is\n // documented as \"user-driven cancellation that reached an\n // emitted workflow_end\". With no workflow_end, there's no\n // place to set the flag.\n this.persistExecution(execInfo);\n }\n // Clean up the abort controller even on pre-execInfo throws\n // (e.g., \"workflow not registered\") — the helper's `finally`\n // clears it on the success path, but early-throw never reaches\n // the helper.\n this.abortControllers.delete(executionId);\n axlStream._error(err instanceof Error ? err : new Error(String(err)), executionId);\n });\n\n return axlStream;\n }\n\n /** Create or resume a session. */\n session(id: string, options?: SessionOptions): Session {\n return new Session(id, this, this.stateStore, options);\n }\n\n /** Gracefully shut down the runtime, aborting in-flight executions and closing state stores and MCP servers. */\n async shutdown(): Promise<void> {\n // Abort all in-flight executions\n for (const [, controller] of this.abortControllers) {\n controller.abort();\n }\n this.abortControllers.clear();\n\n const errors: Error[] = [];\n const safeClose = async (label: string, fn: () => Promise<void>) => {\n try {\n await fn();\n } catch (err) {\n errors.push(new Error(`${label}: ${err instanceof Error ? err.message : String(err)}`));\n }\n };\n\n if (this.mcpManager) await safeClose('mcpManager', () => this.mcpManager!.shutdown());\n if (this.memoryManager) await safeClose('memoryManager', () => this.memoryManager!.close());\n if (this.stateStore.close) await safeClose('stateStore', () => this.stateStore.close!());\n await safeClose('spanManager', () => this.spanManager.shutdown());\n\n if (errors.length > 0) {\n throw new Error(\n `shutdown encountered ${errors.length} error(s): ${errors.map((e) => e.message).join('; ')}`,\n );\n }\n }\n\n /** Abort a running execution by its ID. */\n abort(executionId: string): void {\n const controller = this.abortControllers.get(executionId);\n if (controller) {\n controller.abort();\n this.abortControllers.delete(executionId);\n }\n }\n\n /** Get execution details by ID. */\n async getExecution(executionId: string): Promise<ExecutionInfo | undefined> {\n // Check active in-memory executions first\n const inMemory = this.executions.get(executionId);\n if (inMemory) return inMemory;\n\n // Check historical cache\n const cached = this.historicalExecutions.get(executionId);\n if (cached) return cached;\n\n // Fall through to store\n if (this.stateStore.getExecution) {\n const stored = await this.stateStore.getExecution(executionId);\n if (stored) {\n this.historicalExecutions.set(executionId, stored);\n return stored;\n }\n }\n\n return undefined;\n }\n\n /** Save an eval result to history. */\n async saveEvalResult(entry: EvalHistoryEntry): Promise<void> {\n // Add to in-memory cache (newest first)\n this.evalHistory.unshift(entry);\n\n // Persist to store\n if (this.stateStore.saveEvalResult) {\n await this.stateStore.saveEvalResult(entry);\n }\n\n // Emit for live aggregation (e.g., Studio eval trends)\n this.emit('eval_result', entry);\n }\n\n /**\n * Delete an eval history entry by id. Removes from in-memory cache and\n * the configured StateStore. Returns true if an entry was actually removed.\n *\n * Ensures lazy-loaded history is loaded first so the in-memory cache and\n * the store can't drift apart on the deletion path.\n */\n async deleteEvalResult(id: string): Promise<boolean> {\n // Force a lazy-load so the in-memory cache reflects everything in the\n // store before we mutate it.\n await this.getEvalHistory();\n\n const beforeLength = this.evalHistory.length;\n this.evalHistory = this.evalHistory.filter((e) => e.id !== id);\n const removedFromMemory = this.evalHistory.length < beforeLength;\n\n let removedFromStore = false;\n if (this.stateStore.deleteEvalResult) {\n removedFromStore = await this.stateStore.deleteEvalResult(id);\n }\n\n return removedFromMemory || removedFromStore;\n }\n\n /** Get eval result history (most recent first). */\n async getEvalHistory(): Promise<EvalHistoryEntry[]> {\n // Lazy-load from store on first access (once-guard)\n if (!this.evalHistoryLoadPromise && this.stateStore.listEvalResults) {\n this.evalHistoryLoadPromise = this.stateStore\n .listEvalResults()\n .then((stored) => {\n // Merge: stored entries not already in memory\n const ids = new Set(this.evalHistory.map((e) => e.id));\n for (const entry of stored) {\n if (!ids.has(entry.id)) {\n this.evalHistory.push(entry);\n }\n }\n // Re-sort by timestamp descending\n this.evalHistory.sort((a, b) => b.timestamp - a.timestamp);\n })\n .catch(() => {\n // Failed to load — reset so next call retries\n this.evalHistoryLoadPromise = null;\n });\n }\n if (this.evalHistoryLoadPromise) {\n await this.evalHistoryLoadPromise;\n }\n return [...this.evalHistory];\n }\n\n /** List pending human decisions. */\n async getPendingDecisions(): Promise<PendingDecision[]> {\n return this.stateStore.getPendingDecisions();\n }\n\n /** Resolve a pending human decision. */\n async resolveDecision(executionId: string, decision: HumanDecision): Promise<void> {\n const resolver = this.pendingDecisionResolvers.get(executionId);\n if (resolver) {\n // In-memory resolver exists — workflow is still running in this process\n resolver(decision);\n this.pendingDecisionResolvers.delete(executionId);\n }\n await this.stateStore.resolveDecision(executionId, decision);\n\n // Cross-restart: if no in-memory resolver, the workflow was lost on restart.\n // Trigger a re-execution that replays from checkpoints.\n if (!resolver) {\n const state = await this.stateStore.getExecutionState(executionId);\n if (state && state.status === 'waiting') {\n await this.resumeExecution(executionId);\n }\n }\n }\n\n /**\n * Resume a specific execution that was waiting for a human decision.\n * Re-runs the workflow from scratch; the workflow should use checkpoint-replay\n * to skip already-completed steps and pick up from the awaitHuman point.\n */\n async resumeExecution(executionId: string): Promise<unknown> {\n const state = await this.stateStore.getExecutionState(executionId);\n if (!state) {\n throw new Error(`No execution state found for \"${executionId}\"`);\n }\n\n const workflow = this.workflows.get(state.workflow);\n if (!workflow) {\n throw new Error(\n `Workflow \"${state.workflow}\" not registered. Cannot resume execution \"${executionId}\".`,\n );\n }\n\n // Re-execute the workflow with the same input — checkpoint-replay will skip completed steps\n return this.execute(state.workflow, state.input, {\n metadata: { ...state.metadata, resumedFrom: executionId, resumeMode: true },\n });\n }\n\n /**\n * Resume all pending executions that were waiting for human decisions.\n * Call this on startup to resume workflows that were interrupted by a restart.\n * Returns the execution IDs that were resumed.\n */\n async resumePending(): Promise<string[]> {\n const pendingIds = await this.stateStore.listPendingExecutions();\n const resumed: string[] = [];\n\n for (const executionId of pendingIds) {\n try {\n await this.resumeExecution(executionId);\n resumed.push(executionId);\n } catch (err) {\n this.emit('error', {\n type: 'resume_failed',\n executionId,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n return resumed;\n }\n\n /**\n * Summarize a list of chat messages into a concise summary string.\n * Used by Session to summarize dropped messages when history.summarize is enabled.\n */\n async summarizeMessages(messages: ChatMessage[], modelUri: string): Promise<string> {\n const { provider, model } = this.providerRegistry.resolve(modelUri, this.config);\n const response = await provider.chat(\n [\n {\n role: 'system',\n content:\n 'Summarize the following conversation concisely, preserving key facts, decisions, and context needed for continuing the conversation.',\n },\n {\n role: 'user',\n content: messages.map((m) => `${m.role}: ${m.content}`).join('\\n'),\n },\n ],\n { model, maxTokens: 1024 },\n );\n return response.content;\n }\n\n /** Get the state store (for testing and advanced use cases). */\n getStateStore(): StateStore {\n return this.stateStore;\n }\n\n /**\n * Run an evaluation against a registered workflow.\n * Requires `axl-eval` as a peer dependency.\n *\n * @see Spec Section 13.5\n */\n async eval(\n config: {\n workflow: string;\n dataset: unknown;\n scorers: unknown[];\n concurrency?: number;\n budget?: string;\n metadata?: Record<string, unknown>;\n },\n options?: {\n onProgress?: (event: EvalProgressEventShape) => void;\n signal?: AbortSignal;\n captureTraces?: boolean;\n },\n ): Promise<unknown> {\n let runEvalFn: (\n config: unknown,\n executeFn: (\n input: unknown,\n runtime: unknown,\n ) => Promise<{ output: unknown; cost?: number; metadata?: Record<string, unknown> }>,\n runtime: unknown,\n evalOptions?: {\n onProgress?: (event: EvalProgressEventShape) => void;\n signal?: AbortSignal;\n captureTraces?: boolean;\n },\n ) => Promise<unknown>;\n try {\n // @ts-expect-error — @axlsdk/eval is an optional peer dependency\n ({ runEval: runEvalFn } = await import('@axlsdk/eval'));\n } catch {\n throw new Error(\n 'axl-eval is required for AxlRuntime.eval(). Install it with: npm install @axlsdk/eval',\n );\n }\n\n const executeWorkflow = async (\n input: unknown,\n ): Promise<{ output: unknown; cost?: number; metadata?: Record<string, unknown> }> => {\n const { result, cost, metadata } = await this.trackExecution(async () => {\n return this.execute(config.workflow, input);\n });\n return { output: result, cost, metadata };\n };\n\n return runEvalFn(config, executeWorkflow, this, options);\n }\n\n /**\n * Compare two evaluation results to detect regressions and improvements.\n * Requires `axl-eval` as a peer dependency.\n *\n * @see Spec Section 13.6\n */\n async evalCompare(baseline: unknown, candidate: unknown, options?: unknown): Promise<unknown> {\n let evalCompareFn: (baseline: unknown, candidate: unknown, options?: unknown) => unknown;\n try {\n // @ts-expect-error — @axlsdk/eval is an optional peer dependency\n ({ evalCompare: evalCompareFn } = await import('@axlsdk/eval'));\n } catch {\n throw new Error(\n 'axl-eval is required for AxlRuntime.evalCompare(). Install it with: npm install @axlsdk/eval',\n );\n }\n\n return evalCompareFn(baseline, candidate, options);\n }\n\n /**\n * Track cost across any runtime operations within the given function.\n * Uses AsyncLocalStorage to scope cost attribution to specific execution IDs,\n * making it correct with concurrent calls.\n *\n * Works with both `createContext()` and `execute()` calls inside `fn`.\n */\n async trackCost<T>(fn: () => Promise<T>): Promise<{ result: T; cost: number }> {\n const { result, cost } = await this.trackExecution(fn);\n return { result, cost };\n }\n\n /**\n * Track cost and execution metadata across any runtime operations within the given function.\n * Uses AsyncLocalStorage to scope attribution to specific execution IDs,\n * making it correct with concurrent calls.\n *\n * Returns cost (same as `trackCost`) plus metadata extracted from trace events:\n * models (unique URIs), tokens (input/output/reasoning sums), and agent call count.\n *\n * ## Cost vs tokens semantics\n *\n * - `cost` is the full aggregate across EVERY event with a top-level\n * `event.cost` set: agent calls, tool calls, semantic memory ops, etc.\n * This is the number to reconcile against your provider bill.\n *\n * - `metadata.tokens` is narrowly scoped to **agent** prompt/completion/\n * reasoning tokens. Embedder tokens from semantic `ctx.remember({embed:true})`\n * / `ctx.recall({query})` are deliberately NOT summed here — they're a\n * different category (input-only, different pricing, different model).\n * Conflating them would make \"prompt tokens\" misleading in the UI. If you\n * need embedder token counts, subscribe to `runtime.on('trace', ...)` and\n * read `data.usage.tokens` on `memory_remember` / `memory_recall` events.\n *\n * Pass `{ captureTraces: true }` to also collect the raw `AxlEvent[]` observed\n * during `fn()`. This is opt-in because it keeps every event in memory for the\n * duration of the call — useful for eval per-item capture, debugging, and test\n * assertions, but overhead grows with trace volume. When enabled, verbose-mode\n * `agent_call_start.data.messages` snapshots are omitted from captured events (still\n * broadcast via onTrace) to keep memory bounded — callers who need the full\n * verbose snapshot should subscribe to `runtime.on('trace', ...)` directly.\n *\n * Works with both `createContext()` and `execute()` calls inside `fn`.\n */\n async trackExecution<T>(\n fn: () => Promise<T>,\n options?: { captureTraces?: boolean },\n ): Promise<{\n result: T;\n cost: number;\n traces?: AxlEvent[];\n metadata: {\n models: string[];\n modelCallCounts?: Record<string, number>;\n /**\n * Agent token totals only — does not include embedder tokens from\n * semantic memory operations. See the method-level JSDoc above.\n */\n tokens: { input: number; output: number; reasoning: number };\n agentCalls: number;\n /**\n * Unique workflow names observed during execution, ordered by first\n * appearance (outermost first for nested calls). Captured automatically\n * from `workflow_start` trace events — callers don't need to declare\n * anything. Parallel mechanism to `models`.\n */\n workflows: string[];\n /** Call counts per workflow, if workflows.length > 0. */\n workflowCallCounts?: Record<string, number>;\n };\n }> {\n const parentScope = costScopeStorage.getStore();\n const scope: CostScope = {\n totalCost: 0,\n trackedIds: new Set(),\n parent: parentScope,\n };\n\n const modelCalls = new Map<string, number>();\n // Insertion-ordered Map: first time we see a workflow it gets added at\n // the end, so iteration order is \"first-seen first\" — which for nested\n // workflow calls puts the outermost workflow first.\n const workflowCalls = new Map<string, number>();\n const tokens = { input: 0, output: 0, reasoning: 0 };\n let agentCalls = 0;\n const capturedTraces: AxlEvent[] | undefined = options?.captureTraces ? [] : undefined;\n\n const listener = (event: AxlEvent) => {\n if (!scope.trackedIds.has(event.executionId)) return;\n // Cost rollup via shared helper — one source of truth for the\n // \"skip ask_end, finite-check, leaf-only\" invariant (spec §10).\n scope.totalCost += eventCostContribution(event);\n if (event.type === 'agent_call_end') {\n if (event.model) modelCalls.set(event.model, (modelCalls.get(event.model) ?? 0) + 1);\n agentCalls++;\n if (event.tokens) {\n tokens.input += event.tokens.input ?? 0;\n tokens.output += event.tokens.output ?? 0;\n tokens.reasoning += event.tokens.reasoning ?? 0;\n }\n }\n // Both `runtime.execute()` and `runtime.stream()` now emit workflow_start\n // as a first-class `type: 'workflow_start'` event. AxlTestRuntime does\n // the same. The prior log-form fallback is no longer needed.\n if (event.type === 'workflow_start' && event.workflow) {\n workflowCalls.set(event.workflow, (workflowCalls.get(event.workflow) ?? 0) + 1);\n }\n\n // Capture a compact copy of the event when requested. We strip the\n // verbose `messages` field (can be tens of KB per turn) to keep memory\n // predictable — callers who need the full verbose snapshot should\n // subscribe to `runtime.on('trace', ...)` directly.\n if (capturedTraces) {\n // Skip high-volume stream-only events for the same reason\n // `runtime.execute()` / `runtime.stream()` drop them from\n // `ExecutionInfo.events`: a streaming eval item with thousands of\n // tokens / progressive `partial_object` snapshots would blow memory\n // when `captureTraces: true` is set on `runEval`. Reviewer bug B3.\n if (event.type === 'token' || event.type === 'partial_object') return;\n // Verbose `messages[]` snapshots live on agent_call_start (request\n // side) under the start/end split. Strip to keep memory bounded.\n if (event.type === 'agent_call_start' && event.data) {\n const d = event.data as Record<string, unknown>;\n if ('messages' in d) {\n const rest: Record<string, unknown> = {};\n for (const k of Object.keys(d)) {\n if (k !== 'messages') rest[k] = d[k];\n }\n capturedTraces.push({ ...event, data: rest } as AxlEvent);\n return;\n }\n }\n capturedTraces.push(event);\n }\n };\n\n // Temporarily increase maxListeners to avoid warnings at high concurrency\n this.setMaxListeners(this.getMaxListeners() + 1);\n this.on('trace', listener);\n try {\n const result = await costScopeStorage.run(scope, fn);\n return {\n result,\n cost: scope.totalCost,\n ...(capturedTraces ? { traces: capturedTraces } : {}),\n metadata: {\n models: [...modelCalls.keys()],\n modelCallCounts: modelCalls.size > 0 ? Object.fromEntries(modelCalls) : undefined,\n tokens,\n agentCalls,\n workflows: [...workflowCalls.keys()],\n workflowCallCounts:\n workflowCalls.size > 0 ? Object.fromEntries(workflowCalls) : undefined,\n },\n };\n } catch (err) {\n // Attach captured traces to the thrown error so callers using\n // `captureTraces: true` can recover the diagnostic trail on failure\n // (e.g., eval runner per-item traces for failed items). Non-enumerable\n // so the property doesn't pollute JSON serialization or stack traces.\n if (capturedTraces && typeof err === 'object' && err !== null) {\n Object.defineProperty(err, 'axlCapturedTraces', {\n value: capturedTraces,\n enumerable: false,\n writable: true,\n configurable: true,\n });\n }\n throw err;\n } finally {\n this.off('trace', listener);\n this.setMaxListeners(this.getMaxListeners() - 1);\n }\n }\n\n /** Register an execution ID with the active cost scope for trackCost() attribution. */\n private registerWithCostScope(executionId: string): void {\n const costScope = costScopeStorage.getStore();\n if (costScope) {\n let scope: CostScope | undefined = costScope;\n while (scope) {\n scope.trackedIds.add(executionId);\n scope = scope.parent;\n }\n }\n }\n\n /**\n * Handle trace event output based on configuration.\n *\n * When trace is disabled or level is 'off', events are still emitted via\n * EventEmitter (for programmatic subscribers) but nothing is logged to console.\n * The emit('trace', event) call happens before this method is called, so\n * programmatic subscribers always receive events regardless of trace config.\n */\n private outputAxlEvent(event: AxlEvent): void {\n const traceConfig = this.config.trace;\n if (!traceConfig?.enabled) return;\n\n const level = traceConfig.level ?? 'steps';\n if (level === 'off') return;\n\n const output = traceConfig.output ?? 'console';\n\n if (output === 'json') {\n console.log(JSON.stringify(event));\n return;\n }\n\n if (output === 'file') {\n const filename = `axl-trace-${event.executionId}.jsonl`;\n try {\n appendFileSync(filename, JSON.stringify(event) + '\\n');\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n mkdirSync(dirname(filename), { recursive: true });\n appendFileSync(filename, JSON.stringify(event) + '\\n');\n } else {\n throw err;\n }\n }\n return;\n }\n\n // Console output (default)\n this.logAxlEvent(event);\n }\n\n private logAxlEvent(event: AxlEvent): void {\n const level = this.config.trace?.level ?? 'steps';\n const workflowPrefix = event.workflow ? `workflow:${event.workflow} | ` : '';\n const parts = [`[axl] execution:${event.executionId}`];\n\n if (event.type === 'workflow_start') {\n // workflow name now lives on the event top-level, not in data.\n parts.push(`${workflowPrefix}started`);\n } else if (event.type === 'workflow_end') {\n // Honour the actual outcome — previously this always said \"completed\"\n // even for failed/aborted runs.\n const d = event.data as { status?: string; aborted?: boolean } | undefined;\n const status = d?.aborted ? 'aborted' : (d?.status ?? 'completed');\n parts.push(`${workflowPrefix}${status}`);\n if (event.duration != null) parts.push(`${(event.duration / 1000).toFixed(1)}s`);\n } else if (event.type === 'agent_call_end') {\n parts.push(`${workflowPrefix}step:${event.step} agent_call`);\n if (event.agent) parts.push(`agent:${event.agent}`);\n if (event.promptVersion) parts.push(`version:${event.promptVersion}`);\n if (event.model) parts.push(`model:${event.model}`);\n if (event.duration) parts.push(`${(event.duration / 1000).toFixed(1)}s`);\n if (event.cost) parts.push(`$${event.cost.toFixed(3)}`);\n if (level === 'full' && event.data) {\n parts.push(`data:${JSON.stringify(event.data)}`);\n }\n } else if (event.type === 'tool_call_end') {\n parts.push(`${workflowPrefix}step:${event.step} tool_call`);\n if (event.tool) parts.push(`tool:${event.tool}`);\n if (event.duration) parts.push(`${event.duration}ms`);\n if (level === 'full' && event.data) {\n parts.push(`data:${JSON.stringify(event.data)}`);\n }\n } else if (event.type === 'guardrail') {\n const gData = event.data as\n | { guardrailType?: string; blocked?: boolean; reason?: string }\n | undefined;\n parts.push(`${workflowPrefix}step:${event.step} guardrail`);\n if (gData?.guardrailType) parts.push(`type:${gData.guardrailType}`);\n if (gData?.blocked !== undefined) parts.push(gData.blocked ? 'BLOCKED' : 'passed');\n if (gData?.reason) parts.push(`reason:${gData.reason}`);\n } else if (event.type === 'log') {\n parts.push(`${workflowPrefix}log: ${JSON.stringify(event.data)}`);\n } else {\n parts.push(`${workflowPrefix}${event.type}`);\n // Some variants don't carry `data` (e.g., `ask_start`).\n // Inspect dynamically so the logger remains a catch-all without\n // enumerating every variant.\n const data = (event as { data?: unknown }).data;\n if (level === 'full' && data !== undefined) {\n parts.push(`data:${JSON.stringify(data)}`);\n }\n }\n\n console.log(parts.join(' | '));\n }\n\n /**\n * Append a handoff record to session metadata.\n * Note: The read-modify-write is not atomic. Concurrent handoffs in the same\n * session could lose a record. In practice, trace events within a single\n * execution are sequential (same event loop), so this is only a concern for\n * cross-execution concurrency on the same session, which is unlikely.\n */\n private appendHandoffRecord(sessionId: string, record: HandoffRecord): void {\n // Fire and forget — don't block the trace handler\n this.stateStore\n .getSessionMeta(sessionId, 'handoffHistory')\n .then((existing) => {\n const history = (existing as HandoffRecord[]) ?? [];\n history.push(record);\n return this.stateStore.saveSessionMeta(sessionId, 'handoffHistory', history);\n })\n .catch(() => {\n // Silently ignore persistence errors in the trace path\n });\n }\n\n /**\n * Patch `duration` on the handoff record matching `toAskId` (the target\n * frame's askId, which the runtime stamps on `handoff_start` and which\n * appears as `askId` on the target's `ask_end`).\n *\n * Called from two places per handoff:\n * - target's `ask_end` — first-write source for ONEWAY (no return event).\n * - `handoff_return` — overwrites for ROUNDTRIP with the round-trip\n * wall-clock figure (intentional: round-trip\n * duration is the more useful metric for the\n * source-paused-for-N-ms semantic).\n *\n * No-op if no record matches `toAskId` (e.g., stream subscribed mid-\n * handoff, or session metadata got wiped) — `duration` stays undefined,\n * which is the documented default for `HandoffRecord`.\n */\n private updateHandoffDuration(\n sessionId: string,\n match: { toAskId: string; duration: number },\n ): void {\n this.stateStore\n .getSessionMeta(sessionId, 'handoffHistory')\n .then((existing) => {\n const history = (existing as HandoffRecord[]) ?? [];\n for (const r of history) {\n if (r.toAskId === match.toAskId) {\n r.duration = match.duration;\n return this.stateStore.saveSessionMeta(sessionId, 'handoffHistory', history);\n }\n }\n return undefined;\n })\n .catch(() => {\n // Silently ignore persistence errors in the trace path\n });\n }\n}\n","import { writeFileSync, readFileSync, existsSync, mkdirSync, unlinkSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport type { ChatMessage, ExecutionInfo, HumanDecision } from '../types.js';\nimport type { StateStore, PendingDecision, ExecutionState, EvalHistoryEntry } from './types.js';\n\n/**\n * Path to the MemoryStore temp file for awaitHuman state.\n * Ensures awaitHuman state survives process restarts even\n * when using MemoryStore (spec requirement).\n *\n * NOTE: tmpdir() persistence is best-effort. Temp directories may be cleaned\n * by the OS at any time (e.g., on reboot or via periodic cleanup policies).\n * For durable awaitHuman persistence, use SQLite or Redis state stores.\n */\nconst AWAIT_HUMAN_TEMP_DIR = join(tmpdir(), 'axl-memory-store');\nconst AWAIT_HUMAN_TEMP_FILE = join(AWAIT_HUMAN_TEMP_DIR, 'await-human-state.json');\n\ntype PersistedAwaitHumanState = {\n decisions: Record<string, PendingDecision>;\n executionStates: Record<string, ExecutionState>;\n};\n\n/**\n * In-memory implementation of StateStore.\n * Fast for development and testing, but lost on process restart.\n *\n * Exception: awaitHuman state (pending decisions + execution states with\n * status \"waiting\") is persisted to a temporary file so it survives restarts.\n * This is the one exception to \"memory means ephemeral\" — because a human\n * could take hours to respond, and losing that state is unacceptable.\n */\nexport class MemoryStore implements StateStore {\n private checkpoints = new Map<string, Map<string, unknown>>();\n private sessions = new Map<string, ChatMessage[]>();\n private sessionMeta = new Map<string, Map<string, unknown>>();\n private decisions = new Map<string, PendingDecision>();\n private executionStates = new Map<string, ExecutionState>();\n private memories = new Map<string, Map<string, unknown>>();\n private executionHistory = new Map<string, ExecutionInfo>();\n private evalHistory = new Map<string, EvalHistoryEntry>();\n\n constructor() {\n // Load any persisted awaitHuman state from previous process\n this.loadPersistedState();\n }\n\n async saveCheckpoint(executionId: string, name: string, data: unknown): Promise<void> {\n let entries = this.checkpoints.get(executionId);\n if (!entries) {\n entries = new Map();\n this.checkpoints.set(executionId, entries);\n }\n entries.set(name, structuredClone(data));\n }\n\n async getCheckpoint(executionId: string, name: string): Promise<unknown | null> {\n const entries = this.checkpoints.get(executionId);\n if (!entries) return null;\n const data = entries.get(name);\n return data !== undefined ? structuredClone(data) : null;\n }\n\n async saveSession(sessionId: string, history: ChatMessage[]): Promise<void> {\n this.sessions.set(sessionId, structuredClone(history));\n }\n\n async getSession(sessionId: string): Promise<ChatMessage[]> {\n const history = this.sessions.get(sessionId);\n return history ? structuredClone(history) : [];\n }\n\n async deleteSession(sessionId: string): Promise<void> {\n this.sessions.delete(sessionId);\n this.sessionMeta.delete(sessionId);\n }\n\n async saveSessionMeta(sessionId: string, key: string, value: unknown): Promise<void> {\n let meta = this.sessionMeta.get(sessionId);\n if (!meta) {\n meta = new Map();\n this.sessionMeta.set(sessionId, meta);\n }\n meta.set(key, structuredClone(value));\n }\n\n async getSessionMeta(sessionId: string, key: string): Promise<unknown | null> {\n const meta = this.sessionMeta.get(sessionId);\n if (!meta) return null;\n const value = meta.get(key);\n return value !== undefined ? structuredClone(value) : null;\n }\n\n async savePendingDecision(executionId: string, decision: PendingDecision): Promise<void> {\n this.decisions.set(executionId, structuredClone(decision));\n this.persistAwaitHumanState();\n }\n\n async getPendingDecisions(): Promise<PendingDecision[]> {\n return [...this.decisions.values()].map((d) => structuredClone(d));\n }\n\n async resolveDecision(executionId: string, _result: HumanDecision): Promise<void> {\n this.decisions.delete(executionId);\n this.persistAwaitHumanState();\n }\n\n // ── Execution State ──────────────────────────────────────────────────\n\n async saveExecutionState(executionId: string, state: ExecutionState): Promise<void> {\n this.executionStates.set(executionId, structuredClone(state));\n // Persist waiting states to temp file\n if (state.status === 'waiting') {\n this.persistAwaitHumanState();\n }\n }\n\n async getExecutionState(executionId: string): Promise<ExecutionState | null> {\n const state = this.executionStates.get(executionId);\n return state ? structuredClone(state) : null;\n }\n\n async listPendingExecutions(): Promise<string[]> {\n const pending: string[] = [];\n for (const [id, state] of this.executionStates) {\n if (state.status === 'waiting') pending.push(id);\n }\n return pending;\n }\n\n // ── Memory ──────────────────────────────────────────────────────\n\n async saveMemory(scope: string, key: string, value: unknown): Promise<void> {\n let scopeMap = this.memories.get(scope);\n if (!scopeMap) {\n scopeMap = new Map();\n this.memories.set(scope, scopeMap);\n }\n scopeMap.set(key, structuredClone(value));\n }\n\n async getMemory(scope: string, key: string): Promise<unknown | null> {\n const val = this.memories.get(scope)?.get(key);\n return val !== undefined ? structuredClone(val) : null;\n }\n\n async getAllMemory(scope: string): Promise<Array<{ key: string; value: unknown }>> {\n const scopeMap = this.memories.get(scope);\n if (!scopeMap) return [];\n return Array.from(scopeMap.entries()).map(([key, value]) => ({\n key,\n value: structuredClone(value),\n }));\n }\n\n async deleteMemory(scope: string, key: string): Promise<void> {\n this.memories.get(scope)?.delete(key);\n }\n\n // ── Execution History ──────────────────────────────────────────────\n\n async saveExecution(execution: ExecutionInfo): Promise<void> {\n this.executionHistory.set(execution.executionId, structuredClone(execution));\n }\n\n async getExecution(executionId: string): Promise<ExecutionInfo | null> {\n const exec = this.executionHistory.get(executionId);\n return exec ? structuredClone(exec) : null;\n }\n\n async listExecutions(limit?: number): Promise<ExecutionInfo[]> {\n const sorted = [...this.executionHistory.values()].sort((a, b) => b.startedAt - a.startedAt);\n const result = limit ? sorted.slice(0, limit) : sorted;\n return result.map((e) => structuredClone(e));\n }\n\n // ── Eval History ──────────────────────────────────────────────────\n\n async saveEvalResult(entry: EvalHistoryEntry): Promise<void> {\n this.evalHistory.set(entry.id, structuredClone(entry));\n }\n\n async listEvalResults(limit?: number): Promise<EvalHistoryEntry[]> {\n const sorted = [...this.evalHistory.values()].sort((a, b) => b.timestamp - a.timestamp);\n const result = limit ? sorted.slice(0, limit) : sorted;\n return result.map((e) => structuredClone(e));\n }\n\n async deleteEvalResult(id: string): Promise<boolean> {\n return this.evalHistory.delete(id);\n }\n\n // ── Sessions (Studio introspection) ─────────────────────────────────\n\n async listSessions(): Promise<string[]> {\n return [...this.sessions.keys()];\n }\n\n // ── Lifecycle ──────────────────────────────────────────────────────\n\n async close(): Promise<void> {}\n\n async deleteCheckpoints(executionId: string): Promise<void> {\n this.checkpoints.delete(executionId);\n }\n\n // ── Temp File Persistence (awaitHuman only) ────────────────────────\n\n private persistAwaitHumanState(): void {\n try {\n const state: PersistedAwaitHumanState = {\n decisions: Object.fromEntries(this.decisions),\n executionStates: {},\n };\n\n // Only persist execution states that are in 'waiting' status\n for (const [id, execState] of this.executionStates) {\n if (execState.status === 'waiting') {\n state.executionStates[id] = execState;\n }\n }\n\n // Only write if there's something to persist\n if (\n Object.keys(state.decisions).length === 0 &&\n Object.keys(state.executionStates).length === 0\n ) {\n // Clean up temp file if nothing to persist\n try {\n unlinkSync(AWAIT_HUMAN_TEMP_FILE);\n } catch {\n /* ignore */\n }\n return;\n }\n\n mkdirSync(AWAIT_HUMAN_TEMP_DIR, { recursive: true });\n writeFileSync(AWAIT_HUMAN_TEMP_FILE, JSON.stringify(state), 'utf-8');\n } catch {\n // Best-effort persistence — don't crash if temp file write fails\n }\n }\n\n private loadPersistedState(): void {\n try {\n if (!existsSync(AWAIT_HUMAN_TEMP_FILE)) return;\n\n const raw = readFileSync(AWAIT_HUMAN_TEMP_FILE, 'utf-8');\n const state = JSON.parse(raw) as PersistedAwaitHumanState;\n\n for (const [id, decision] of Object.entries(state.decisions)) {\n this.decisions.set(id, decision);\n }\n for (const [id, execState] of Object.entries(state.executionStates)) {\n this.executionStates.set(id, execState);\n }\n\n // Clean up the temp file after loading\n unlinkSync(AWAIT_HUMAN_TEMP_FILE);\n } catch {\n // Best-effort load — ignore errors\n }\n }\n}\n","import type { ChatMessage, ExecutionInfo, HumanDecision } from '../types.js';\nimport type { StateStore, PendingDecision, ExecutionState, EvalHistoryEntry } from './types.js';\n\n// Lazy-loaded better-sqlite3 types\ntype Database = import('better-sqlite3').Database;\ntype DatabaseConstructor = typeof import('better-sqlite3');\n\n/** Safely parse JSON, returning null on corrupt data instead of crashing. */\nfunction safeJsonParse(data: string): unknown | null {\n try {\n return JSON.parse(data);\n } catch {\n return null;\n }\n}\n\ntype ExecutionHistoryRow = {\n execution_id: string;\n workflow: string;\n status: string;\n total_cost: number;\n started_at: number;\n completed_at: number | null;\n duration: number;\n error: string | null;\n events: string;\n};\n\nfunction rowToExecutionInfo(row: ExecutionHistoryRow): ExecutionInfo {\n return {\n executionId: row.execution_id,\n workflow: row.workflow,\n status: row.status as ExecutionInfo['status'],\n totalCost: row.total_cost,\n startedAt: row.started_at,\n completedAt: row.completed_at ?? undefined,\n duration: row.duration,\n error: row.error ?? undefined,\n events: (safeJsonParse(row.events) as ExecutionInfo['events']) ?? [],\n };\n}\n\n/**\n * SQLite-backed StateStore using better-sqlite3.\n *\n * Zero-config, file-based persistence suitable for single-process production.\n * Uses prepared statements for all operations.\n *\n * Requires `better-sqlite3` as a peer dependency. If not installed,\n * the constructor throws a clear error message.\n */\nexport class SQLiteStore implements StateStore {\n private db: Database;\n\n constructor(filePath: string) {\n let BetterSqlite3: DatabaseConstructor;\n try {\n BetterSqlite3 = require('better-sqlite3');\n } catch {\n throw new Error(\n 'better-sqlite3 is required for SQLiteStore. Install it with: npm install better-sqlite3',\n );\n }\n\n this.db = new BetterSqlite3(filePath);\n this.db.pragma('journal_mode = WAL');\n this.migrate();\n this.initTables();\n }\n\n /**\n * Idempotent schema migration. Tracks version via `PRAGMA user_version`\n * so reopens skip applied steps. Wrapped in `BEGIN IMMEDIATE` so\n * concurrent `SQLiteStore` constructors serialize at the file level\n * and rollback on failure leaves the DB in a clean pre-migration\n * state.\n *\n * Migration history:\n * - v1 (spec/16): rename `execution_history.steps` → `events`. The\n * JS-level `ExecutionInfo.steps` was renamed to `.events` in PR 1\n * commit 1; this brings the on-disk schema in line.\n * - v2 (named checkpoints): rename `checkpoints.step` (INTEGER) →\n * `checkpoints.name` (TEXT). The runtime now requires\n * `ctx.checkpoint(name, fn)` so the per-context numeric counter is\n * gone — names are caller-supplied stable identifiers. Existing\n * numeric step values become stringified names (\"0\", \"1\", …) to\n * preserve replay continuity for in-flight executions across the\n * upgrade boundary.\n *\n * Applied BEFORE `initTables()` so the subsequent `CREATE TABLE\n * IF NOT EXISTS` runs against the post-migration column name. Fresh\n * installs just create the table with `events` directly and bump\n * `user_version` to the current version.\n *\n * TOCTOU guard (review B-3): the initial `user_version` read is\n * informational only — a concurrent process can complete the\n * migration between that read and our `BEGIN IMMEDIATE`. We\n * re-read `user_version` inside the transaction and short-circuit\n * if it's already at target, so the non-idempotent half (writes\n * that went beyond a simple ALTER) never double-applies under a\n * race. The current v0→v1 step IS idempotent via the column-\n * presence check, but future migrations may not be, and the\n * transactional re-read costs nothing.\n */\n private migrate(): void {\n const TARGET_VERSION = 2;\n const current = this.db.pragma('user_version', { simple: true }) as number;\n if (current >= TARGET_VERSION) return;\n\n this.db.exec('BEGIN IMMEDIATE');\n try {\n // Re-read under the write lock — a concurrent constructor may\n // have completed the migration between our pragma read above\n // and our lock acquisition. Short-circuit to avoid re-applying.\n const committed = this.db.pragma('user_version', { simple: true }) as number;\n if (committed >= TARGET_VERSION) {\n this.db.exec('COMMIT');\n return;\n }\n // v0 → v1: rename `steps` column on `execution_history` if present.\n // `table_info()` is safe even if the table doesn't exist (returns []).\n if (committed < 1) {\n const cols = this.db.pragma('table_info(execution_history)') as Array<{ name: string }>;\n if (cols.some((c) => c.name === 'steps') && !cols.some((c) => c.name === 'events')) {\n this.db.exec('ALTER TABLE execution_history RENAME COLUMN steps TO events');\n }\n }\n // v1 → v2: rename `checkpoints.step` (INTEGER) → `checkpoints.name`\n // (TEXT). SQLite columns are dynamically typed so existing integer\n // values continue to work; ALTER TABLE just updates the column name\n // (and type hint) so new schemas match. NOTE: legacy auto-checkpoint\n // rows (\"0\", \"1\", …) are *structurally* preserved but become\n // unreachable — the new runtime composes auto-checkpoint names like\n // `__auto/<agent>/ask/<n>`, which never match the legacy integer\n // strings. In-flight executions resumed under v2 will re-execute\n // side effects (no replay match). Drain or cancel running\n // executions before upgrading. User-named checkpoints (only\n // possible on the new API) are unaffected.\n if (committed < 2) {\n const cols = this.db.pragma('table_info(checkpoints)') as Array<{ name: string }>;\n if (cols.some((c) => c.name === 'step') && !cols.some((c) => c.name === 'name')) {\n this.db.exec('ALTER TABLE checkpoints RENAME COLUMN step TO name');\n }\n }\n this.db.pragma(`user_version = ${TARGET_VERSION}`);\n this.db.exec('COMMIT');\n } catch (err) {\n this.db.exec('ROLLBACK');\n throw err;\n }\n }\n\n private initTables(): void {\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS checkpoints (\n execution_id TEXT NOT NULL,\n name TEXT NOT NULL,\n data TEXT NOT NULL,\n PRIMARY KEY (execution_id, name)\n );\n\n CREATE TABLE IF NOT EXISTS sessions (\n session_id TEXT PRIMARY KEY,\n history TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS decisions (\n execution_id TEXT PRIMARY KEY,\n channel TEXT NOT NULL,\n prompt TEXT NOT NULL,\n metadata TEXT,\n created_at TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS execution_state (\n execution_id TEXT PRIMARY KEY,\n workflow TEXT NOT NULL,\n input TEXT NOT NULL,\n step INTEGER NOT NULL DEFAULT 0,\n status TEXT NOT NULL DEFAULT 'running',\n metadata TEXT\n );\n\n CREATE TABLE IF NOT EXISTS session_meta (\n session_id TEXT NOT NULL,\n key TEXT NOT NULL,\n value TEXT NOT NULL,\n PRIMARY KEY (session_id, key)\n );\n\n CREATE TABLE IF NOT EXISTS memory (\n scope TEXT NOT NULL,\n key TEXT NOT NULL,\n value TEXT NOT NULL,\n updated_at TEXT NOT NULL DEFAULT (datetime('now')),\n PRIMARY KEY (scope, key)\n );\n\n CREATE TABLE IF NOT EXISTS execution_history (\n execution_id TEXT PRIMARY KEY,\n workflow TEXT NOT NULL,\n status TEXT NOT NULL,\n total_cost REAL NOT NULL DEFAULT 0,\n started_at INTEGER NOT NULL,\n completed_at INTEGER,\n duration INTEGER NOT NULL DEFAULT 0,\n error TEXT,\n events TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS eval_history (\n id TEXT PRIMARY KEY,\n eval_name TEXT NOT NULL,\n timestamp INTEGER NOT NULL,\n data TEXT NOT NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_exec_history_started ON execution_history (started_at DESC);\n CREATE INDEX IF NOT EXISTS idx_eval_history_timestamp ON eval_history (timestamp DESC);\n `);\n }\n\n // ── Checkpoints ────────────────────────────────────────────────────────\n\n async saveCheckpoint(executionId: string, name: string, data: unknown): Promise<void> {\n const stmt = this.db.prepare(\n 'INSERT OR REPLACE INTO checkpoints (execution_id, name, data) VALUES (?, ?, ?)',\n );\n stmt.run(executionId, name, JSON.stringify(data));\n }\n\n async getCheckpoint(executionId: string, name: string): Promise<unknown | null> {\n const stmt = this.db.prepare(\n 'SELECT data FROM checkpoints WHERE execution_id = ? AND name = ?',\n );\n const row = stmt.get(executionId, name) as { data: string } | undefined;\n return row ? safeJsonParse(row.data) : null;\n }\n\n // ── Sessions ────────────────────────────────────────────────────────────\n\n async saveSession(sessionId: string, history: ChatMessage[]): Promise<void> {\n const stmt = this.db.prepare(\n 'INSERT OR REPLACE INTO sessions (session_id, history) VALUES (?, ?)',\n );\n stmt.run(sessionId, JSON.stringify(history));\n }\n\n async getSession(sessionId: string): Promise<ChatMessage[]> {\n const stmt = this.db.prepare('SELECT history FROM sessions WHERE session_id = ?');\n const row = stmt.get(sessionId) as { history: string } | undefined;\n return row ? ((safeJsonParse(row.history) as ChatMessage[]) ?? []) : [];\n }\n\n async deleteSession(sessionId: string): Promise<void> {\n const stmt = this.db.prepare('DELETE FROM sessions WHERE session_id = ?');\n stmt.run(sessionId);\n const metaStmt = this.db.prepare('DELETE FROM session_meta WHERE session_id = ?');\n metaStmt.run(sessionId);\n }\n\n async saveSessionMeta(sessionId: string, key: string, value: unknown): Promise<void> {\n const stmt = this.db.prepare(\n 'INSERT OR REPLACE INTO session_meta (session_id, key, value) VALUES (?, ?, ?)',\n );\n stmt.run(sessionId, key, JSON.stringify(value));\n }\n\n async getSessionMeta(sessionId: string, key: string): Promise<unknown | null> {\n const stmt = this.db.prepare('SELECT value FROM session_meta WHERE session_id = ? AND key = ?');\n const row = stmt.get(sessionId, key) as { value: string } | undefined;\n return row ? safeJsonParse(row.value) : null;\n }\n\n // ── Pending Decisions ──────────────────────────────────────────────────\n\n async savePendingDecision(executionId: string, decision: PendingDecision): Promise<void> {\n const stmt = this.db.prepare(\n 'INSERT OR REPLACE INTO decisions (execution_id, channel, prompt, metadata, created_at) VALUES (?, ?, ?, ?, ?)',\n );\n stmt.run(\n executionId,\n decision.channel,\n decision.prompt,\n decision.metadata ? JSON.stringify(decision.metadata) : null,\n decision.createdAt,\n );\n }\n\n async getPendingDecisions(): Promise<PendingDecision[]> {\n const stmt = this.db.prepare('SELECT * FROM decisions');\n const rows = stmt.all() as Array<{\n execution_id: string;\n channel: string;\n prompt: string;\n metadata: string | null;\n created_at: string;\n }>;\n return rows.map((row) => ({\n executionId: row.execution_id,\n channel: row.channel,\n prompt: row.prompt,\n metadata: row.metadata\n ? (safeJsonParse(row.metadata) as Record<string, unknown> | undefined)\n : undefined,\n createdAt: row.created_at,\n }));\n }\n\n async resolveDecision(executionId: string, _result: HumanDecision): Promise<void> {\n const stmt = this.db.prepare('DELETE FROM decisions WHERE execution_id = ?');\n stmt.run(executionId);\n }\n\n // ── Execution State (for awaitHuman suspend/resume) ────────────────────\n\n async saveExecutionState(executionId: string, state: ExecutionState): Promise<void> {\n const stmt = this.db.prepare(\n 'INSERT OR REPLACE INTO execution_state (execution_id, workflow, input, step, status, metadata) VALUES (?, ?, ?, ?, ?, ?)',\n );\n stmt.run(\n executionId,\n state.workflow,\n JSON.stringify(state.input),\n state.step,\n state.status,\n state.metadata ? JSON.stringify(state.metadata) : null,\n );\n }\n\n async getExecutionState(executionId: string): Promise<ExecutionState | null> {\n const stmt = this.db.prepare('SELECT * FROM execution_state WHERE execution_id = ?');\n const row = stmt.get(executionId) as\n | {\n execution_id: string;\n workflow: string;\n input: string;\n step: number;\n status: string;\n metadata: string | null;\n }\n | undefined;\n if (!row) return null;\n return {\n workflow: row.workflow,\n input: safeJsonParse(row.input),\n step: row.step,\n status: row.status as 'waiting' | 'running',\n metadata: row.metadata\n ? (safeJsonParse(row.metadata) as Record<string, unknown> | undefined)\n : undefined,\n };\n }\n\n async listPendingExecutions(): Promise<string[]> {\n const stmt = this.db.prepare(\n \"SELECT execution_id FROM execution_state WHERE status = 'waiting'\",\n );\n const rows = stmt.all() as Array<{ execution_id: string }>;\n return rows.map((r) => r.execution_id);\n }\n\n // ── Execution History ────────────────────────────────────────────────────\n\n async saveExecution(execution: ExecutionInfo): Promise<void> {\n this.db\n .prepare(\n 'INSERT OR REPLACE INTO execution_history (execution_id, workflow, status, total_cost, started_at, completed_at, duration, error, events) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)',\n )\n .run(\n execution.executionId,\n execution.workflow,\n execution.status,\n execution.totalCost,\n execution.startedAt,\n execution.completedAt ?? null,\n execution.duration,\n execution.error ?? null,\n JSON.stringify(execution.events),\n );\n }\n\n async getExecution(executionId: string): Promise<ExecutionInfo | null> {\n const row = this.db\n .prepare('SELECT * FROM execution_history WHERE execution_id = ?')\n .get(executionId) as ExecutionHistoryRow | undefined;\n return row ? rowToExecutionInfo(row) : null;\n }\n\n async listExecutions(limit?: number): Promise<ExecutionInfo[]> {\n const sql = limit\n ? 'SELECT * FROM execution_history ORDER BY started_at DESC LIMIT ?'\n : 'SELECT * FROM execution_history ORDER BY started_at DESC';\n const rows = (\n limit ? this.db.prepare(sql).all(limit) : this.db.prepare(sql).all()\n ) as ExecutionHistoryRow[];\n return rows.map(rowToExecutionInfo);\n }\n\n // ── Eval History ────────────────────────────────────────────────────────\n\n async saveEvalResult(entry: EvalHistoryEntry): Promise<void> {\n this.db\n .prepare(\n 'INSERT OR REPLACE INTO eval_history (id, eval_name, timestamp, data) VALUES (?, ?, ?, ?)',\n )\n .run(entry.id, entry.eval, entry.timestamp, JSON.stringify(entry.data));\n }\n\n async listEvalResults(limit?: number): Promise<EvalHistoryEntry[]> {\n const sql = limit\n ? 'SELECT * FROM eval_history ORDER BY timestamp DESC LIMIT ?'\n : 'SELECT * FROM eval_history ORDER BY timestamp DESC';\n const rows = (limit ? this.db.prepare(sql).all(limit) : this.db.prepare(sql).all()) as Array<{\n id: string;\n eval_name: string;\n timestamp: number;\n data: string;\n }>;\n return rows.map((r) => ({\n id: r.id,\n eval: r.eval_name,\n timestamp: r.timestamp,\n data: safeJsonParse(r.data),\n }));\n }\n\n async deleteEvalResult(id: string): Promise<boolean> {\n const result = this.db.prepare('DELETE FROM eval_history WHERE id = ?').run(id);\n return result.changes > 0;\n }\n\n // ── Sessions (Studio introspection) ────────────────────────────────────\n\n async listSessions(): Promise<string[]> {\n const rows = this.db.prepare('SELECT session_id FROM sessions').all() as Array<{\n session_id: string;\n }>;\n return rows.map((r) => r.session_id);\n }\n\n // ── Memory ────────────────────────────────────────────────────────────\n\n async saveMemory(scope: string, key: string, value: unknown): Promise<void> {\n this.db\n .prepare(\n \"INSERT OR REPLACE INTO memory (scope, key, value, updated_at) VALUES (?, ?, ?, datetime('now'))\",\n )\n .run(scope, key, JSON.stringify(value));\n }\n\n async getMemory(scope: string, key: string): Promise<unknown | null> {\n const row = this.db\n .prepare('SELECT value FROM memory WHERE scope = ? AND key = ?')\n .get(scope, key) as { value: string } | undefined;\n return row ? safeJsonParse(row.value) : null;\n }\n\n async getAllMemory(scope: string): Promise<Array<{ key: string; value: unknown }>> {\n const rows = this.db\n .prepare('SELECT key, value FROM memory WHERE scope = ?')\n .all(scope) as Array<{ key: string; value: string }>;\n return rows.map((r) => ({ key: r.key, value: safeJsonParse(r.value) }));\n }\n\n async deleteMemory(scope: string, key: string): Promise<void> {\n this.db.prepare('DELETE FROM memory WHERE scope = ? AND key = ?').run(scope, key);\n }\n\n /** Close the database connection. */\n async close(): Promise<void> {\n this.db.close();\n }\n\n async deleteCheckpoints(executionId: string): Promise<void> {\n const stmt = this.db.prepare('DELETE FROM checkpoints WHERE execution_id = ?');\n stmt.run(executionId);\n }\n}\n","import type { ChatMessage, HandoffRecord } from './types.js';\nimport type { StateStore } from './state/types.js';\nimport type { AxlRuntime } from './runtime.js';\nimport type { AxlStream } from './stream.js';\n\n/** Options for configuring a session. */\nexport type SessionOptions = {\n /** History management options. */\n history?: {\n /** Maximum number of messages to keep in history. Older messages are trimmed (or summarized if summarize is true). */\n maxMessages?: number;\n /** When true and maxMessages is exceeded, summarize old messages instead of dropping them. Requires summaryModel to be set. Default: false. */\n summarize?: boolean;\n /** Model URI to use for summarization (e.g., 'openai:gpt-4o-mini'). Required when summarize is true. */\n summaryModel?: string;\n };\n /** Whether to persist session history to the state store. Default: true. */\n persist?: boolean;\n};\n\n/**\n * A stateful conversation session.\n * Persists message history across multiple interactions.\n */\nexport class Session {\n private closed = false;\n private options: SessionOptions;\n\n constructor(\n private sessionId: string,\n private runtime: AxlRuntime,\n private store: StateStore,\n options?: SessionOptions,\n ) {\n this.options = options ?? {};\n }\n\n get id(): string {\n return this.sessionId;\n }\n\n async send(workflowName: string, input: unknown): Promise<unknown> {\n if (this.closed) throw new Error('Session has been ended');\n\n const history = await this.store.getSession(this.sessionId);\n let cachedSummary = (await this.store.getSessionMeta(this.sessionId, 'summaryCache')) as\n | string\n | null;\n\n // Apply maxMessages limit\n const maxMessages = this.options.history?.maxMessages;\n if (maxMessages && history.length > maxMessages) {\n if (this.options.history?.summarize) {\n const summaryModel = this.options.history?.summaryModel;\n if (!summaryModel) {\n throw new Error('SessionOptions.history.summaryModel is required when summarize is true');\n }\n const messagesToDrop = history.slice(0, history.length - maxMessages);\n // Include existing summary as context for the new summarization\n const toSummarize: ChatMessage[] = cachedSummary\n ? [\n { role: 'system', content: `Previous conversation summary: ${cachedSummary}` },\n ...messagesToDrop,\n ]\n : messagesToDrop;\n const summary = await this.runtime.summarizeMessages(toSummarize, summaryModel);\n await this.store.saveSessionMeta(this.sessionId, 'summaryCache', summary);\n // Update local reference so the workflow receives the fresh summary\n cachedSummary = summary;\n }\n const trimmed = history.slice(-maxMessages);\n history.length = 0;\n history.push(...trimmed);\n }\n\n const userMessage: ChatMessage = {\n role: 'user',\n content: typeof input === 'string' ? input : JSON.stringify(input),\n };\n history.push(userMessage);\n\n const result = await this.runtime.execute(workflowName, input, {\n metadata: {\n sessionId: this.sessionId,\n sessionHistory: history,\n ...(cachedSummary ? { summaryCache: cachedSummary } : {}),\n },\n });\n\n // executeAgentCall may have already pushed the assistant message (with\n // providerMetadata for Gemini thought signatures etc.). Only add one if needed.\n const lastMsg = history[history.length - 1];\n if (!(lastMsg && lastMsg.role === 'assistant')) {\n history.push({\n role: 'assistant',\n content: typeof result === 'string' ? result : JSON.stringify(result),\n });\n }\n\n if (this.options.persist !== false) {\n await this.store.saveSession(this.sessionId, history);\n }\n return result;\n }\n\n async stream(workflowName: string, input: unknown): Promise<AxlStream> {\n if (this.closed) throw new Error('Session has been ended');\n\n const history = await this.store.getSession(this.sessionId);\n let cachedSummary = (await this.store.getSessionMeta(this.sessionId, 'summaryCache')) as\n | string\n | null;\n\n // Apply maxMessages limit\n const maxMessages = this.options.history?.maxMessages;\n if (maxMessages && history.length > maxMessages) {\n if (this.options.history?.summarize) {\n const summaryModel = this.options.history?.summaryModel;\n if (!summaryModel) {\n throw new Error('SessionOptions.history.summaryModel is required when summarize is true');\n }\n const messagesToDrop = history.slice(0, history.length - maxMessages);\n // Include existing summary as context for the new summarization\n const toSummarize: ChatMessage[] = cachedSummary\n ? [\n { role: 'system', content: `Previous conversation summary: ${cachedSummary}` },\n ...messagesToDrop,\n ]\n : messagesToDrop;\n const summary = await this.runtime.summarizeMessages(toSummarize, summaryModel);\n await this.store.saveSessionMeta(this.sessionId, 'summaryCache', summary);\n // Update local reference so the workflow receives the fresh summary\n cachedSummary = summary;\n }\n const trimmed = history.slice(-maxMessages);\n history.length = 0;\n history.push(...trimmed);\n }\n\n const userMessage: ChatMessage = {\n role: 'user',\n content: typeof input === 'string' ? input : JSON.stringify(input),\n };\n history.push(userMessage);\n\n const axlStream = this.runtime.stream(workflowName, input, {\n metadata: {\n sessionId: this.sessionId,\n sessionHistory: history,\n ...(cachedSummary ? { summaryCache: cachedSummary } : {}),\n },\n });\n\n const updateHistory = async (result: unknown): Promise<void> => {\n // executeAgentCall may have already pushed the assistant message (with\n // providerMetadata for Gemini thought signatures etc.). Only add one if needed.\n const lastMsg = history[history.length - 1];\n if (!(lastMsg && lastMsg.role === 'assistant')) {\n history.push({\n role: 'assistant',\n content: typeof result === 'string' ? result : JSON.stringify(result),\n });\n }\n if (this.options.persist !== false) {\n await this.store.saveSession(this.sessionId, history);\n }\n };\n\n axlStream.on('done', (event: unknown) => {\n // The unified event model wraps the result in `data: { result }` on\n // `done` events (spec §2.1) — extract and pass the inner result to\n // the legacy updateHistory path.\n const data = (event as { data: { result: unknown } }).data;\n updateHistory(data.result).catch((err) => {\n this.runtime.emit('error', {\n type: 'session_history_save_failed',\n sessionId: this.sessionId,\n error: err instanceof Error ? err.message : String(err),\n });\n });\n });\n\n return axlStream;\n }\n\n async history(): Promise<ChatMessage[]> {\n return this.store.getSession(this.sessionId);\n }\n\n /** Get the handoff history for this session. */\n async handoffs(): Promise<HandoffRecord[]> {\n return (\n ((await this.store.getSessionMeta(this.sessionId, 'handoffHistory')) as HandoffRecord[]) ?? []\n );\n }\n\n async end(): Promise<void> {\n this.closed = true;\n if (this.options.persist !== false) {\n await this.store.deleteSession(this.sessionId);\n }\n }\n\n async fork(newId: string): Promise<Session> {\n const history = await this.store.getSession(this.sessionId);\n const forked = new Session(newId, this.runtime, this.store, this.options);\n await this.store.saveSession(newId, [...history]);\n\n // Copy session metadata (e.g. summaryCache, handoffHistory) to the forked session\n const summaryCache = await this.store.getSessionMeta(this.sessionId, 'summaryCache');\n if (summaryCache !== null) {\n await this.store.saveSessionMeta(newId, 'summaryCache', summaryCache);\n }\n\n const handoffHistory = await this.store.getSessionMeta(this.sessionId, 'handoffHistory');\n if (handoffHistory !== null) {\n await this.store.saveSessionMeta(newId, 'handoffHistory', handoffHistory);\n }\n\n return forked;\n }\n}\n","import { Readable } from 'node:stream';\nimport { EventEmitter } from 'node:events';\nimport { AXL_EVENT_TYPES, type AxlEvent, type AxlEventType } from './types.js';\nimport { isRootLevel } from './event-utils.js';\n\n/**\n * A streamable workflow execution.\n *\n * Extends Node's Readable and implements `AsyncIterable<AxlEvent>`. Supports\n * `.on()` events, `for-await-of`, the `.text` iterator (root-only tokens),\n * the `.lifecycle` iterator (structural events only), and `.pipe()`.\n *\n * The wire carries `AxlEvent` directly — there is no per-stream synthesized\n * shape. Consumers narrow on `event.type` and use `AskScoped` fields\n * (`askId`, `parentAskId`, `depth`) for routing/filtering.\n */\nexport class AxlStream extends Readable {\n private bus = new EventEmitter();\n /**\n * Per-ask token buffers split into \"in-progress\" and \"committed\"\n * halves so `fullText` only includes tokens from attempts that\n * actually won. Scoping is per-`askId` so concurrent root-level asks\n * (`ctx.parallel`, `ctx.spawn`, `ctx.race`, `ctx.map`) don't\n * interleave each other's tokens — each branch's chunks stay\n * contiguous, and a `pipeline(failed)` on one branch only discards\n * THAT branch's in-progress buffer (previously: shared buffer caused\n * a failure on one branch to discard a peer's in-flight successful\n * tokens). Insertion order in the Maps reflects which ask emitted\n * its first token first, which is what `fullText` joins on.\n *\n * On `pipeline(status: 'committed')` for an ask, that ask's\n * in-progress entry flushes to its committed entry. On\n * `pipeline(status: 'failed')` or `ask_end({ok:false})` for an ask,\n * that ask's in-progress entry is discarded. Spec/16 §4.3.\n *\n * Tokens emitted outside any ask (synthesized test fixtures with no\n * `askId`) fall back to an empty-string sentinel key — preserves the\n * single-buffer behavior for that legacy case.\n */\n private attemptByAsk = new Map<string, string[]>();\n private committedByAsk = new Map<string, string>();\n private result: unknown = undefined;\n private finished = false;\n readonly promise: Promise<unknown>;\n private eventQueue: AxlEvent[] = [];\n private waiters: Array<(value: IteratorResult<AxlEvent>) => void> = [];\n\n constructor() {\n super({ objectMode: true, read() {} });\n\n let resolvePromise: (value: unknown) => void;\n let rejectPromise: (error: Error) => void;\n this.promise = new Promise((resolve, reject) => {\n resolvePromise = resolve;\n rejectPromise = reject;\n });\n\n this.bus.on('__resolve', (value: unknown) => resolvePromise!(value));\n this.bus.on('__reject', (error: Error) => rejectPromise!(error));\n // Prevent unhandled 'error' events from crashing the process\n this.bus.on('error', () => {});\n // Prevent unhandled promise rejection when _error() rejects the promise\n // and no consumer has called stream.promise.catch(). Errors are delivered\n // through the promise rejection and the EventEmitter 'error' event.\n this.promise.catch(() => {});\n }\n\n /** Wire-format event names callers can subscribe to via `.on(name, fn)`.\n * Derived from the canonical `AXL_EVENT_TYPES` tuple — adding a new\n * variant in `types.ts` automatically extends the subscribable set. */\n private static readonly STREAM_EVENTS = new Set<AxlEventType>(AXL_EVENT_TYPES);\n\n on(event: string, handler: (...args: unknown[]) => void): this {\n if (AxlStream.STREAM_EVENTS.has(event as AxlEventType)) {\n this.bus.on(event, handler);\n } else {\n super.on(event, handler);\n }\n return this;\n }\n\n off(event: string, handler: (...args: unknown[]) => void): this {\n if (AxlStream.STREAM_EVENTS.has(event as AxlEventType)) {\n this.bus.off(event, handler);\n } else {\n super.off(event, handler);\n }\n return this;\n }\n\n [Symbol.asyncIterator]() {\n const self = this;\n return {\n next: (): Promise<IteratorResult<AxlEvent>> => {\n if (self.eventQueue.length > 0) {\n return Promise.resolve({ value: self.eventQueue.shift()!, done: false });\n }\n if (self.finished && self.eventQueue.length === 0) {\n return Promise.resolve({ value: undefined as unknown as AxlEvent, done: true });\n }\n return new Promise((resolve) => {\n self.waiters.push(resolve);\n });\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n [Symbol.asyncDispose]() {\n self.destroy();\n return Promise.resolve();\n },\n };\n }\n\n get text(): AsyncIterable<string> {\n const self = this;\n return {\n [Symbol.asyncIterator](): AsyncIterator<string> {\n const iter = self[Symbol.asyncIterator]();\n return {\n async next(): Promise<IteratorResult<string>> {\n while (true) {\n const { value, done } = await iter.next();\n if (done) return { value: undefined as unknown as string, done: true };\n // Root-only token text by default — consumers wanting nested\n // tokens too should iterate the whole stream and filter on\n // `event.depth >= 1` themselves.\n if (value.type === 'token' && isRootLevel(value)) {\n return { value: value.data, done: false };\n }\n }\n },\n };\n },\n };\n }\n\n /**\n * Iterator over `{ askId, text }` pairs — one emission per token chunk,\n * tagged with the ask frame that produced it. Complements `.text`\n * (root-only stream): consumers building a split-pane UI that shows\n * each sub-agent's output in its own lane can group by `askId`\n * without iterating the raw stream and hand-filtering on `event.type`.\n *\n * Nested and root tokens both flow through. The `agent` field names\n * the producing agent for UI labelling; it's undefined when the token\n * was emitted outside any ask (rare — synthesized test fixtures).\n */\n get textByAsk(): AsyncIterable<{ askId: string; agent?: string; text: string }> {\n const self = this;\n return {\n [Symbol.asyncIterator](): AsyncIterator<{ askId: string; agent?: string; text: string }> {\n const iter = self[Symbol.asyncIterator]();\n return {\n async next(): Promise<IteratorResult<{ askId: string; agent?: string; text: string }>> {\n while (true) {\n const { value, done } = await iter.next();\n if (done) {\n return {\n value: undefined as unknown as { askId: string; agent?: string; text: string },\n done: true,\n };\n }\n if (value.type === 'token') {\n return {\n value: { askId: value.askId, agent: value.agent, text: value.data },\n done: false,\n };\n }\n }\n },\n };\n },\n };\n }\n\n /**\n * Iterator over structural lifecycle events only — skips per-token chatter\n * and progressive partial_object emissions. Useful for waterfall UIs and\n * any consumer that wants the \"what happened\" timeline without per-chunk\n * noise. Renamed from `.steps` in the unified-event-model migration\n * because these are events, not pipeline steps.\n */\n get lifecycle(): AsyncIterable<AxlEvent> {\n const lifecycleTypes = new Set<AxlEventType>([\n 'ask_start',\n 'ask_end',\n 'agent_call_start',\n 'agent_call_end',\n 'tool_call_start',\n 'tool_call_end',\n 'tool_approval',\n 'tool_denied',\n 'handoff_start',\n 'handoff_return',\n 'delegate',\n 'pipeline',\n 'verify',\n 'workflow_start',\n 'workflow_end',\n // Durable-execution checkpoints — structural points in the timeline.\n 'checkpoint_save',\n 'checkpoint_replay',\n // Human-in-the-loop — pause/resume are major timeline landmarks.\n 'await_human',\n 'await_human_resolved',\n ]);\n const self = this;\n return {\n [Symbol.asyncIterator](): AsyncIterator<AxlEvent> {\n const iter = self[Symbol.asyncIterator]();\n return {\n async next(): Promise<IteratorResult<AxlEvent>> {\n while (true) {\n const { value, done } = await iter.next();\n if (done) return { value: undefined as unknown as AxlEvent, done: true };\n if (lifecycleTypes.has(value.type)) return { value, done: false };\n }\n },\n };\n },\n };\n }\n\n pipe<T extends NodeJS.WritableStream>(destination: T, options?: { end?: boolean }): T {\n const shouldEnd = options?.end !== false;\n this.bus.on('token', (event: AxlEvent) => {\n if (event.type === 'token') destination.write(event.data);\n });\n this.bus.on('done', () => {\n if (shouldEnd) destination.end();\n });\n this.bus.on('error', () => {\n if (shouldEnd) destination.end();\n });\n return destination;\n }\n\n /** Push an event onto the stream. Called by the runtime. */\n _push(event: AxlEvent): void {\n if (this.finished) return;\n // Token accumulation for `fullText`. Root-only by default to preserve the\n // canonical \"render this in a chat bubble\" use case; nested-ask tokens\n // still flow through the iterator so consumers that want them can filter.\n // Scoped by askId so concurrent root asks don't interleave.\n if (event.type === 'token' && isRootLevel(event)) {\n const key = event.askId ?? '';\n const attempt = this.attemptByAsk.get(key);\n if (attempt) {\n attempt.push(event.data);\n } else {\n this.attemptByAsk.set(key, [event.data]);\n }\n }\n // Pipeline lifecycle: commit on success, discard on failure. Spec §4.3.\n // Reading `fullText` between `committed` and `done` sees the correct\n // text — that's why we commit on `committed` (which fires before\n // `done`) rather than on `done`. Per-ask scoping ensures a failed\n // attempt on one branch doesn't discard a sibling branch's tokens.\n if (event.type === 'pipeline' && isRootLevel(event)) {\n const key = event.askId ?? '';\n if (event.status === 'committed') {\n const attempt = this.attemptByAsk.get(key);\n if (attempt && attempt.length > 0) {\n const prev = this.committedByAsk.get(key) ?? '';\n this.committedByAsk.set(key, prev + attempt.join(''));\n this.attemptByAsk.set(key, []);\n }\n } else if (event.status === 'failed') {\n this.attemptByAsk.set(key, []);\n }\n }\n // Terminal-throw safety net: `ctx.ask()` exit paths that throw\n // (max-turns, guardrail exhaustion, verify-throw, validate-throw) do\n // NOT emit `pipeline(failed)` — they emit `ask_end({ok:false})` and\n // propagate the error. Without this reset, the failed ask's\n // in-progress tokens would stay buffered and flush into the NEXT\n // ask's `pipeline(committed)`, corrupting `fullText`. Reviewer bug\n // B2. Only applies to root asks; nested asks don't enter the\n // per-ask buffer (they're filtered out by `isRootLevel` on the\n // token-accumulation path above). Per-ask scoping means a failure\n // on one root branch only clears its own buffer.\n if (event.type === 'ask_end' && isRootLevel(event) && !event.outcome.ok) {\n this.attemptByAsk.set(event.askId ?? '', []);\n }\n this.bus.emit(event.type, event);\n this.push(event);\n const waiter = this.waiters.shift();\n if (waiter) {\n waiter({ value: event, done: false });\n } else {\n this.eventQueue.push(event);\n }\n }\n\n /**\n * Signal successful completion.\n *\n * `executionId` is required — the runtime must allocate it before\n * calling `stream()` so terminal events always carry a real id.\n * Previously the default-empty parameter surfaced blank executionIds\n * on error paths that threw before `execInfo` was assigned (review S4).\n */\n _done(result: unknown, executionId: string): void {\n if (this.finished) return;\n this.finished = true;\n this.result = result;\n // Synthesize a terminal `done` AxlEvent. The stream itself is the\n // emission source (no WorkflowContext frame to read), so `step` is set\n // to `Number.MAX_SAFE_INTEGER` as a sentinel meaning \"after all\n // numbered events\" — consumers ordering by step still see `done` last.\n const doneEvent: AxlEvent = {\n type: 'done',\n executionId,\n step: Number.MAX_SAFE_INTEGER,\n timestamp: Date.now(),\n data: { result },\n };\n this.bus.emit('done', doneEvent);\n this.push(doneEvent);\n this.push(null);\n const waiter = this.waiters.shift();\n if (waiter) {\n waiter({ value: doneEvent, done: false });\n } else {\n this.eventQueue.push(doneEvent);\n }\n for (const w of this.waiters) {\n w({ value: undefined as unknown as AxlEvent, done: true });\n }\n this.waiters.length = 0;\n this.bus.emit('__resolve', result);\n }\n\n /** Signal an error. `executionId` is required for the same reason as\n * `_done`: terminal events must carry a real id even when the\n * failure happens before any real trace event fires (review S4). */\n _error(error: Error, executionId: string): void {\n if (this.finished) return;\n this.finished = true;\n const errorEvent: AxlEvent = {\n type: 'error',\n executionId,\n step: Number.MAX_SAFE_INTEGER,\n timestamp: Date.now(),\n data: { message: error.message, name: error.name },\n };\n this.bus.emit('error', errorEvent);\n this.push(errorEvent);\n this.push(null);\n const waiter = this.waiters.shift();\n if (waiter) {\n waiter({ value: errorEvent, done: false });\n } else {\n this.eventQueue.push(errorEvent);\n }\n for (const w of this.waiters) {\n w({ value: undefined as unknown as AxlEvent, done: true });\n }\n this.waiters.length = 0;\n this.bus.emit('__reject', error);\n }\n\n /** Concatenated root-only text from committed attempts plus the\n * current in-flight attempt(s). Retried (gate-rejected) attempts\n * are excluded — see spec/16 §4.3. Reading mid-attempt returns the\n * in-progress text; reading after `pipeline(committed)` (which\n * fires before `done`) returns the canonical winning text.\n *\n * With concurrent root-level asks (`ctx.parallel`, `ctx.spawn`,\n * `ctx.race`, `ctx.map`), each branch's tokens are scoped per-`askId`\n * and emitted contiguously in the order each ask first started\n * emitting tokens. A `pipeline(failed)` or `ask_end({ok:false})` on\n * one branch only discards THAT branch's in-progress buffer —\n * sibling branches are unaffected. For UIs that want each sub-agent\n * in its own lane, prefer `textByAsk`. */\n get fullText(): string {\n let out = '';\n // Iterate in insertion order. Map preserves it so `fullText` is\n // deterministic given the same emission order.\n for (const [key, committed] of this.committedByAsk) {\n out += committed;\n const attempt = this.attemptByAsk.get(key);\n if (attempt && attempt.length > 0) out += attempt.join('');\n }\n // Asks that have emitted tokens but never committed (still in-flight,\n // or failed) — append their in-progress buffers in insertion order\n // after all committed text.\n for (const [key, attempt] of this.attemptByAsk) {\n if (this.committedByAsk.has(key)) continue;\n if (attempt.length > 0) out += attempt.join('');\n }\n return out;\n }\n}\n","import type { z } from 'zod';\nimport type { Effort, ToolChoice } from './providers/types.js';\n\n/** Result type for concurrent operations (spawn, map) */\nexport type Result<T> = { ok: true; value: T } | { ok: false; error: string };\n\n/** Budget execution result */\nexport type BudgetResult<T> = {\n value: T | null;\n budgetExceeded: boolean;\n totalCost: number;\n};\n\n/** Human decision from awaitHuman */\nexport type HumanDecision =\n | { approved: true; data?: string }\n | { approved: false; reason?: string };\n\n/** Budget options */\nexport type BudgetOptions = {\n cost: string;\n onExceed?: 'finish_and_stop' | 'hard_stop' | 'warn';\n};\n\n/** Map options */\nexport type MapOptions = {\n concurrency?: number;\n quorum?: number;\n};\n\n/** Spawn options */\nexport type SpawnOptions = {\n quorum?: number;\n};\n\n/** Vote strategies */\nexport type VoteStrategy =\n | 'majority'\n | 'unanimous'\n | 'highest'\n | 'lowest'\n | 'mean'\n | 'median'\n | 'custom';\n\n/** Vote options */\nexport type VoteOptions<T> = {\n strategy: VoteStrategy;\n key?: string;\n scorer?: (value: T) => number | Promise<number>;\n reducer?: (values: T[]) => T | Promise<T>;\n};\n\n/** Context passed to the verify function on retry (undefined on first call). */\nexport type VerifyRetry<T> = {\n /** Error message from the failed attempt (schema or validate). */\n error: string;\n /** Raw return value from the previous fn call. When fn() throws a ValidationError\n * or VerifyError, falls back to err.lastOutput so the retry has data to repair. */\n output: unknown;\n /** Schema-parsed object — only present when schema passed but validate failed.\n * Also populated from ValidationError.lastOutput when fn() throws (e.g., inner\n * ctx.ask() exhausted its validate retries). Safe to modify and return. */\n parsed?: T;\n};\n\n/** Verify options */\nexport type VerifyOptions<T> = {\n retries?: number;\n fallback?: T;\n /** Post-schema business rule validation on the parsed object. */\n validate?: OutputValidator<T>;\n};\n\n/** AwaitHuman options */\nexport type AwaitHumanOptions = {\n channel: string;\n prompt: string;\n metadata?: Record<string, unknown>;\n};\n\n/** Ask options */\nexport type AskOptions<T = unknown> = {\n schema?: z.ZodType<T>;\n retries?: number;\n /** Post-schema business rule validation. Receives the parsed typed object after schema\n * validation succeeds. Only runs when `schema` is set. Retries with accumulating context\n * on failure (LLM sees all previous failed attempts). Throws `ValidationError` on exhaustion. */\n validate?: OutputValidator<T>;\n /** Maximum retries for validate failures (default: 2). */\n validateRetries?: number;\n /** Per-call metadata passed to dynamic model/system selector functions. */\n metadata?: Record<string, unknown>;\n /** Override temperature for this call. */\n temperature?: number;\n /** Override max tokens for this call (default: 4096). */\n maxTokens?: number;\n /** How hard should the model try? Primary param for cost/quality tradeoff. */\n effort?: Effort;\n /** Precise thinking token budget (advanced). Overrides effort-based thinking allocation. */\n thinkingBudget?: number;\n /** Show reasoning summaries in responses. */\n includeThoughts?: boolean;\n /** Tool choice strategy for this call. */\n toolChoice?: ToolChoice;\n /** Stop sequences for this call. */\n stop?: string[];\n /** Provider-specific options merged into API requests. Not portable across providers. */\n providerOptions?: Record<string, unknown>;\n};\n\n/** Delegate options */\nexport type DelegateOptions<T = unknown> = {\n /** Zod schema for structured output from the selected agent. */\n schema?: z.ZodType<T>;\n /** Model URI for the internal router agent (default: first candidate's model). */\n routerModel?: string;\n /** Additional metadata passed to the router and selected agent. */\n metadata?: Record<string, unknown>;\n /** Number of retries for structured output validation (passed to the final ask). */\n retries?: number;\n /** Post-schema business rule validation. Passed through to the final `ctx.ask()` call. */\n validate?: OutputValidator<T>;\n /** Maximum retries for validate failures (default: 2). Passed through to the final `ctx.ask()` call. */\n validateRetries?: number;\n};\n\n/** Race options */\nexport type RaceOptions<T = unknown> = {\n /** Schema to validate each result. Invalid results are discarded and the race continues. */\n schema?: z.ZodType<T>;\n /** Post-schema business rule validation. Results that fail are discarded (same as schema failures). */\n validate?: OutputValidator<T>;\n};\n\n/** Execution status */\nexport type ExecutionStatus = 'running' | 'completed' | 'failed' | 'waiting';\n\n/**\n * Canonical list of `AxlEvent.type` discriminators. Single source of truth —\n * derive `AxlEventType` from this tuple and use it to validate stream filters,\n * redaction tables, and exhaustiveness assertions.\n */\nexport const AXL_EVENT_TYPES = [\n // Workflow lifecycle\n 'workflow_start',\n 'workflow_end',\n // Ask boundary\n 'ask_start',\n 'ask_end',\n // Agent turn lifecycle\n 'agent_call_start',\n 'agent_call_end',\n // Content delivery (stream-only)\n 'token',\n // Tool invocation lifecycle\n 'tool_call_start',\n 'tool_call_end',\n // Single-point tool events\n 'tool_approval',\n 'tool_denied',\n // Delegation\n 'delegate',\n // Handoff (spans two asks; not AskScoped).\n // `handoff_start` emits before the target ask begins; always fired.\n // `handoff_return` emits when control returns to source; roundtrip only\n // (oneway handoffs have no return trip — the target's `ask_end` IS the\n // end of the chain).\n 'handoff_start',\n 'handoff_return',\n // Pipeline (retry/validation lifecycle) — added in PR 2; reserved here.\n 'pipeline',\n // Progressive structured output — added in PR 2; reserved here.\n 'partial_object',\n // Verification\n 'verify',\n // Observability\n 'log',\n 'memory_remember',\n 'memory_recall',\n 'memory_forget',\n // Durable execution checkpoints (`ctx.checkpoint`)\n 'checkpoint_save',\n 'checkpoint_replay',\n // Human-in-the-loop (`ctx.awaitHuman`)\n 'await_human',\n 'await_human_resolved',\n // Legacy gate events — emitted by current code; collapsed into `pipeline`\n // in PR 2 (spec/16-streaming-wire-reliability §4.2).\n 'guardrail',\n 'schema_check',\n 'validate',\n // Terminal workflow markers\n 'done',\n 'error',\n] as const;\n\n/** Discriminator union derived from `AXL_EVENT_TYPES`. */\nexport type AxlEventType = (typeof AXL_EVENT_TYPES)[number];\n\n/** Resolved model parameters sent to the provider for an LLM call. */\nexport type AgentCallParams = {\n temperature?: number;\n maxTokens?: number;\n effort?: Effort;\n thinkingBudget?: number;\n includeThoughts?: boolean;\n toolChoice?: ToolChoice;\n stop?: string[];\n};\n\n/**\n * Data shape for `agent_call_start` events — the **request** side of the call.\n * Everything here is known at the moment the call is dispatched, before the\n * provider responds. Consumers can render \"what's being asked\" without waiting\n * for completion.\n */\nexport type AgentCallStartData = {\n /** Original user prompt passed to `ctx.ask()`. Does not include retry feedback or tool results. */\n prompt: string;\n /** Resolved system prompt (after evaluating dynamic system selectors). */\n system?: string;\n /** Resolved model parameters sent to the provider for this call. */\n params?: AgentCallParams;\n /** 1-indexed iteration of the tool-calling loop for this `ctx.ask()` call. */\n turn: number;\n /** When set, this call is a retry triggered by a failed gate check on the previous turn. */\n retryReason?: 'schema' | 'validate' | 'guardrail';\n /** Names of tools exposed to the model on this call. Empty/omitted when no tools are bound. */\n toolNames?: string[];\n /** Full ChatMessage[] sent to the provider this turn. Only populated when `trace.level === 'full'`. */\n messages?: ChatMessage[];\n};\n\n/**\n * Data shape for `agent_call_end` events — the **response** side of the call.\n * Populated when the provider returns (success or recoverable failure). The\n * companion request-side payload lives on the matching `agent_call_start`.\n *\n * Pair invariant: every `agent_call_start` is followed by exactly one\n * `agent_call_end`, even on provider error. On the error path `response` is\n * empty and `error` carries the provider's message; cost/tokens/duration are\n * still emitted (top-level on the event) when partial usage is available.\n */\nexport type AgentCallEndData = {\n /** Final LLM response content for this turn. Empty string on error. */\n response: string;\n /** Reasoning/thinking content returned by the provider, when available. */\n thinking?: string;\n /** 1-indexed iteration of the tool-calling loop. Mirrors the matching `agent_call_start.data.turn`. */\n turn: number;\n /** Mirrors `agent_call_start.data.retryReason` so cost-attribution consumers\n * reading `agent_call_end` (cost lives here) can bucket without joining. */\n retryReason?: 'schema' | 'validate' | 'guardrail';\n /** Provider error message when the call threw (network failure, 4xx/5xx,\n * abort, etc). Mutually exclusive with `response` content. Subject to\n * `config.trace.redact` (vendor errors can echo prompt text). */\n error?: string;\n};\n\n/** Data shape for `tool_call_end` events. */\nexport type ToolCallData = {\n args: unknown;\n result: unknown;\n callId?: string;\n};\n\n/** Data shape for `tool_call_start` events. */\nexport type ToolCallStartData = {\n args: unknown;\n};\n\n/** Data shape for `tool_approval` events. Emitted by the approval gate on both outcomes. */\nexport type ToolApprovalData = {\n approved: boolean;\n args: unknown;\n reason?: string;\n};\n\n/** Data shape for `tool_denied` events. Emitted when the LLM names a tool the agent doesn't expose. */\nexport type ToolDeniedData = {\n args?: unknown;\n reason?: string;\n callId?: string;\n};\n\n/** Data shape for `handoff_start` events (always emitted, pre-transition). */\nexport type HandoffStartData = {\n source: string;\n target: string;\n mode: 'oneway' | 'roundtrip';\n /** The `message` arg the source agent passed when invoking `handoff_to_X`\n * (roundtrip mode only). Subject to `config.trace.redact`. */\n message?: string;\n};\n\n/** Data shape for `handoff_return` events (roundtrip-only, post-return).\n * The returned value itself is observable via the target ask's\n * `ask_end.outcome`; this event marks the control transfer back to the\n * source agent and carries the round-trip duration. */\nexport type HandoffReturnData = {\n source: string;\n target: string;\n /** Wall-clock ms from `handoff_start` emission to control returning. */\n duration: number;\n};\n\n/** Data shape for `delegate` events. */\nexport type DelegateData = {\n candidates: string[];\n /** Set when the decision is known at emission time (single-agent short-circuit). */\n selected?: string;\n /** Router model used for multi-agent routing. */\n routerModel?: string;\n /** Why this delegate was emitted: 'routed' (multi-agent) or 'single_candidate'. */\n reason: 'routed' | 'single_candidate';\n};\n\n/** Data shape for `verify` events. */\nexport type VerifyData = {\n attempts: number;\n passed: boolean;\n lastError?: string;\n};\n\n/** Data shape for legacy `guardrail` events. Replaced by `pipeline` in PR 2. */\nexport type GuardrailData = {\n guardrailType: 'input' | 'output';\n blocked: boolean;\n reason?: string;\n attempt?: number;\n maxAttempts?: number;\n feedbackMessage?: string;\n};\n\n/** Data shape for legacy `schema_check` events. Replaced by `pipeline` in PR 2. */\nexport type SchemaCheckData = {\n valid: boolean;\n reason?: string;\n attempt: number;\n maxAttempts: number;\n feedbackMessage?: string;\n};\n\n/** Data shape for legacy `validate` events. Replaced by `pipeline` in PR 2. */\nexport type ValidateData = {\n valid: boolean;\n reason?: string;\n attempt: number;\n maxAttempts: number;\n feedbackMessage?: string;\n};\n\n/** Data shape for `workflow_start` events. Emitted once per workflow execution. */\nexport type WorkflowStartData = {\n /** The validated input passed to the workflow handler. */\n input: unknown;\n};\n\n/** Data shape for `workflow_end` events. Emitted once per workflow execution\n * on completion, failure, or cancellation. Distinguish cancellation via `aborted`. */\nexport type WorkflowEndData = {\n status: 'completed' | 'failed';\n duration: number;\n /** Workflow return value. Present on `status: 'completed'`. */\n result?: unknown;\n /** Error message. Present on `status: 'failed'`. */\n error?: string;\n /** True when the failure was an `AbortError` (user cancellation, budget hard_stop,\n * or consumer disconnect on streaming workflows). */\n aborted?: boolean;\n};\n\n/** Data shape for `checkpoint_save` / `checkpoint_replay` events.\n * Emitted by `ctx.checkpoint(name, fn)` — `save` on first execution,\n * `replay` when a saved value short-circuits the function call. */\nexport type CheckpointEventData = {\n /** Stable, caller-supplied identifier under which the checkpoint is\n * stored. Internal auto-checkpoints from ask/spawn/race/parallel/map\n * use names prefixed with `__auto/<primitive>/`. */\n name: string;\n};\n\n/** Data shape for `await_human` events — emitted when execution suspends\n * for a human decision via `ctx.awaitHuman()`. The pending side of the\n * pair; `await_human_resolved` follows when the decision arrives. */\nexport type AwaitHumanData = {\n /** Optional human-facing prompt describing the decision needed. */\n prompt?: string;\n /** Channel routing the decision (e.g., 'slack', 'email', custom). */\n channel?: string;\n};\n\n/** Data shape for `await_human_resolved` events — paired terminal of an\n * `await_human` request. Carries the `HumanDecision` returned to the workflow. */\nexport type AwaitHumanResolvedData = {\n channel?: string;\n decision: HumanDecision;\n};\n\n/** Data shape for `memory_remember` / `memory_recall` / `memory_forget` events. */\nexport type MemoryEventData = {\n scope: string;\n key?: string;\n /** Result count for `recall` (number of vectors returned). */\n count?: number;\n /** Embedder cost for semantic recall/remember. Mirrored at the top-level\n * `cost` on the event so cost rails (`trackExecution`) pick it up. */\n cost?: number;\n /** Embedder usage detail (tokens / model). */\n usage?: { tokens?: number; cost?: number; model?: string };\n /** True when this memory op called the semantic recall path (vs. key-only). */\n embed?: boolean;\n /** True when a key-only recall returned a value / semantic call path. */\n semantic?: boolean;\n /** True when a key-only recall returned a value. */\n hit?: boolean;\n /** Result count for `recall` (alias for `count` retained for back-compat). */\n resultCount?: number;\n /** Error message when the operation failed on the partial-failure path. */\n error?: string;\n};\n\n/** Common fields carried by every `AxlEvent` regardless of `type`. */\nexport type AxlEventBase = {\n executionId: string;\n /** Monotonic per-execution step counter, shared across nested asks via ALS. */\n step: number;\n /** Wall-clock ms. */\n timestamp: number;\n /** Workflow this event belongs to. Auto-stamped by `emitEvent` from\n * `this.workflowName` when defined; callers may override. */\n workflow?: string;\n /** Optional emitting-agent name. Variants that always have an agent\n * (e.g., `agent_call_start/end`) redeclare it as required so consumers\n * narrowing on those variants get a non-optional `agent`. Single-point\n * events that may or may not have an agent (`handoff`, gate events,\n * `log`) keep the optional. */\n agent?: string;\n /** Optional model URI — set on agent-related events; ignored on others. */\n model?: string;\n /** Optional prompt version stamped from `agent._config.version`. */\n promptVersion?: string;\n /**\n * Cost (USD) contributed by this event.\n *\n * Two DIFFERENT semantics ship on this field and consumers must know\n * which they're reading:\n *\n * - **Leaf cost** (`agent_call_end`, `tool_call_end`, `memory_remember`,\n * `memory_recall`): the authoritative charge for this single\n * provider call / tool invocation / embedder call. Summing these\n * across an execution gives the true spend.\n *\n * - **Per-ask rollup** (`ask_end`): the SUM of leaf costs emitted\n * within this ask's frame, EXCLUDING nested asks (which roll up\n * into their own `ask_end`). Spec/16 decision 10.\n *\n * **If you write your own accumulator, DO NOT do `total += event.cost`\n * across all event types — you'll double-count every ask** because the\n * leaves AND the rollup both carry `cost`. Use the exported\n * `eventCostContribution(event)` helper from `@axlsdk/axl` instead:\n * it encapsulates the \"skip ask_end, finite-check, leaf-only\" rule in\n * one place so your accumulator stays in lockstep with the built-in\n * `runtime.trackExecution`, `ExecutionInfo.totalCost`, and Studio's\n * cost aggregator.\n *\n * Other variants may stamp `cost` optionally to flow into cost rails\n * (e.g., memory ops mirror `usage.cost` here). Review UX-8.\n */\n cost?: number;\n /** Token counts. Required-by-narrowing on `agent_call_end`; optional on\n * any event that wishes to mirror an aggregate. Scope is agent prompt /\n * completion / reasoning tokens ONLY — embedder tokens live in\n * `memory_*.data.usage.tokens` and are deliberately NOT summed into\n * this field (different pricing, different model, different category). */\n tokens?: { input?: number; output?: number; reasoning?: number };\n /** Duration in ms (set on `_end` variants and a few single-point events). */\n duration?: number;\n};\n\n/** Fields on every event that originates within a specific `ctx.ask()` call. */\nexport type AskScoped = {\n askId: string;\n /** Absent on root ask. */\n parentAskId?: string;\n /** 0 = root ask; +1 per nested ask. */\n depth: number;\n /** Emitting agent's name. Absent on `ask_start` (pre-resolution) and on\n * events that predate agent resolution. */\n agent?: string;\n};\n\n/**\n * Meta carried alongside callback invocations (`onToken`, `onAgentStart`,\n * `onToolCall`) so consumers can group/route by ask.\n *\n * Note: `agent` is **required** here (the callback is always invoked\n * inside an ALS frame that has the agent name already resolved). On the\n * event side (`AskScoped.agent`) the field is optional — events emitted\n * before agent resolution (e.g., `ask_start` is fired before the\n * dynamic agent selector runs) can land without it.\n */\nexport type CallbackMeta = {\n askId: string;\n parentAskId?: string;\n depth: number;\n agent: string;\n};\n\n/**\n * Unified event union. Replaces the old `TraceEvent` (rich, persisted) and\n * `StreamEvent` (lean, wire) by emitting a single rich event from one site\n * and consuming the same shape on both rails.\n *\n * - Streaming consumers iterate `AxlStream` (an `AsyncIterable<AxlEvent>`).\n * - Non-streaming consumers read `ExecutionInfo.events: AxlEvent[]`.\n *\n * Tree reconstruction: group ask-scoped events by `askId`, parent-link via\n * `parentAskId`, sort by `step`, render by `depth`. Tokens (high-volume) and\n * `partial_object` events are stream-only — never persisted to\n * `ExecutionInfo.events`.\n *\n * When adding a new variant, extend `AXL_EVENT_TYPES` AND the emitter in\n * `WorkflowContext.emitEvent()` together so the compiler catches drift; the\n * exhaustiveness fixture in `__tests__/axl-event-exhaustive.test-d.ts` will\n * also fail until the new case is handled.\n */\nexport type AxlEvent =\n // ── Execution lifecycle ─────────────────────────────────────────────────\n | (AxlEventBase & { type: 'workflow_start'; workflow: string; data: WorkflowStartData })\n | (AxlEventBase & { type: 'workflow_end'; workflow: string; data: WorkflowEndData })\n\n // ── Ask boundary (user-level ctx.ask() call) ────────────────────────────\n | (AxlEventBase & AskScoped & { type: 'ask_start'; prompt: string })\n | (AxlEventBase &\n AskScoped & {\n type: 'ask_end';\n /** Discriminated outcome — narrow on `outcome.ok`. Ask-internal throws\n * surface here, NOT via the workflow-level `error` event. */\n outcome: { ok: true; result: unknown } | { ok: false; error: string };\n /** Sum of `agent_call_end.cost` + `tool_call_end.cost` WITHIN THIS ASK,\n * excluding nested asks. Nested asks contribute to their own ask_end. */\n cost: number;\n duration: number;\n })\n\n // ── Agent turn lifecycle (one LLM call within an ask) ───────────────────\n | (AxlEventBase &\n AskScoped & {\n type: 'agent_call_start';\n agent: string;\n model: string;\n /** 1-indexed tool-calling loop iteration within the ask. */\n turn: number;\n /** Request-side payload — prompt, system, params, messages, retry context. */\n data: AgentCallStartData;\n })\n | (AxlEventBase &\n AskScoped & {\n type: 'agent_call_end';\n agent: string;\n model: string;\n /** Authoritative turn-level cost. */\n cost: number;\n duration: number;\n tokens?: { input?: number; output?: number; reasoning?: number };\n /** Response-side payload — response text, thinking. */\n data: AgentCallEndData;\n })\n\n // ── Content delivery (stream-only; never in ExecutionInfo.events) ───────\n | (AxlEventBase & AskScoped & { type: 'token'; data: string })\n\n // ── Tool invocation lifecycle ───────────────────────────────────────────\n | (AxlEventBase &\n AskScoped & {\n type: 'tool_call_start';\n tool: string;\n callId: string;\n data: ToolCallStartData;\n })\n | (AxlEventBase &\n AskScoped & {\n type: 'tool_call_end';\n tool: string;\n callId: string;\n duration: number;\n cost?: number;\n data: ToolCallData;\n })\n\n // ── Single-point tool events ────────────────────────────────────────────\n | (AxlEventBase &\n AskScoped & {\n type: 'tool_approval';\n tool: string;\n callId?: string;\n data: ToolApprovalData;\n })\n | (AxlEventBase &\n AskScoped & {\n type: 'tool_denied';\n tool: string;\n callId?: string;\n data?: ToolDeniedData;\n })\n\n // ── Delegation ──────────────────────────────────────────────────────────\n | (AxlEventBase & AskScoped & { type: 'delegate'; data: DelegateData })\n\n // ── Handoff (spans two asks — NOT AskScoped) ───────────────────────────\n //\n // Asymmetric by mode: oneway emits only `handoff_start` (no return trip);\n // roundtrip emits both `handoff_start` and `handoff_return`. This matches\n // the control flow — oneway terminates at the target, roundtrip returns\n // to source. `handoff_start` fires BEFORE the target ask begins, so it\n // orders correctly in step-sorted timelines (ahead of the target's\n // ask_start/agent_call_*/ask_end).\n | (AxlEventBase & {\n type: 'handoff_start';\n fromAskId: string;\n toAskId: string;\n sourceDepth: number;\n targetDepth: number;\n data: HandoffStartData;\n })\n | (AxlEventBase & {\n type: 'handoff_return';\n fromAskId: string;\n toAskId: string;\n sourceDepth: number;\n targetDepth: number;\n data: HandoffReturnData;\n })\n\n // ── Pipeline (retry/validation lifecycle; multi-state via `status`) ─────\n | (AxlEventBase &\n AskScoped & {\n type: 'pipeline';\n status: 'start';\n stage: 'initial' | 'schema' | 'validate' | 'guardrail';\n attempt: number;\n maxAttempts: number;\n })\n | (AxlEventBase &\n AskScoped & {\n type: 'pipeline';\n status: 'failed';\n stage: 'schema' | 'validate' | 'guardrail';\n attempt: number;\n maxAttempts: number;\n /** Feedback message about to be injected into the conversation. */\n reason: string;\n })\n | (AxlEventBase &\n AskScoped & {\n type: 'pipeline';\n status: 'committed';\n /** The stage of the most recent `pipeline(start)` — `'initial'` when\n * the ask committed on the first pass, otherwise the gate that last\n * retried before commit. Lets consumers tell \"committed cleanly\"\n * from \"committed after a schema/validate/guardrail retry\". */\n stage: 'initial' | 'schema' | 'validate' | 'guardrail';\n /** The final successful attempt. */\n attempt: number;\n maxAttempts: number;\n })\n\n // ── Progressive structured output ───────────────────────────────────────\n | (AxlEventBase &\n AskScoped & {\n type: 'partial_object';\n attempt: number;\n /** DeepPartial<T>; consumers cast at the render site. */\n data: { object: unknown };\n })\n\n // ── Verification ────────────────────────────────────────────────────────\n | (AxlEventBase & AskScoped & { type: 'verify'; data: VerifyData })\n\n // ── Legacy gate events (collapsed into `pipeline` in PR 2) ──────────────\n | (AxlEventBase & Partial<AskScoped> & { type: 'guardrail'; data?: GuardrailData })\n | (AxlEventBase & Partial<AskScoped> & { type: 'schema_check'; data?: SchemaCheckData })\n | (AxlEventBase & Partial<AskScoped> & { type: 'validate'; data?: ValidateData })\n\n // ── Observability ───────────────────────────────────────────────────────\n | (AxlEventBase & Partial<AskScoped> & { type: 'log'; data: unknown })\n | (AxlEventBase &\n Partial<AskScoped> & {\n type: 'memory_remember' | 'memory_recall' | 'memory_forget';\n data: MemoryEventData;\n })\n\n // ── Durable execution checkpoints (`ctx.checkpoint`) ────────────────────\n | (AxlEventBase &\n Partial<AskScoped> & {\n type: 'checkpoint_save' | 'checkpoint_replay';\n data: CheckpointEventData;\n })\n\n // ── Human-in-the-loop (`ctx.awaitHuman`) ────────────────────────────────\n | (AxlEventBase &\n Partial<AskScoped> & {\n type: 'await_human';\n data: AwaitHumanData;\n })\n | (AxlEventBase &\n Partial<AskScoped> & {\n type: 'await_human_resolved';\n data: AwaitHumanResolvedData;\n })\n\n // ── Terminal workflow markers (idiomatic names; see decision 9) ─────────\n | (AxlEventBase & { type: 'done'; data: { result: unknown } })\n | (AxlEventBase &\n Partial<AskScoped> & {\n type: 'error';\n data: { message: string; name?: string; code?: string };\n });\n\n/** Convenience: extract the union member matching a given `type` discriminator. */\nexport type AxlEventOf<T extends AxlEventType> = Extract<AxlEvent, { type: T }>;\n\n/** Result of a guardrail check. */\nexport type GuardrailResult = {\n block: boolean;\n reason?: string;\n};\n\n/** Input guardrail function. Runs before the LLM call. */\nexport type InputGuardrail = (\n prompt: string,\n ctx: { metadata: Record<string, unknown> },\n) => GuardrailResult | Promise<GuardrailResult>;\n\n/** Output guardrail function. Runs after the LLM response. */\nexport type OutputGuardrail = (\n response: string,\n ctx: { metadata: Record<string, unknown> },\n) => GuardrailResult | Promise<GuardrailResult>;\n\n/** Handler for when a guardrail blocks. */\nexport type GuardrailBlockHandler =\n | 'retry'\n | 'throw'\n | ((reason: string, ctx: { metadata: Record<string, unknown> }) => string | Promise<string>);\n\n/** Full guardrails configuration for an agent. */\nexport type GuardrailsConfig = {\n input?: InputGuardrail;\n output?: OutputGuardrail;\n onBlock?: GuardrailBlockHandler;\n maxRetries?: number;\n};\n\n/** Result of a validate check (post-schema business rule validation).\n * Note: uses `valid: true` = pass, unlike `GuardrailResult` which uses `block: true` = fail. */\nexport type ValidateResult = {\n valid: boolean;\n reason?: string;\n};\n\n/** Output validator function. Runs after schema parsing on the typed object.\n * Only invoked when a schema is provided on the `ctx.ask()` call — without a schema,\n * use output guardrails for raw text validation instead. */\nexport type OutputValidator<T = unknown> = (\n output: T,\n ctx: { metadata: Record<string, unknown> },\n) => ValidateResult | Promise<ValidateResult>;\n\n/** Execution info */\nexport type ExecutionInfo = {\n executionId: string;\n workflow: string;\n status: ExecutionStatus;\n /** Full event timeline. Tokens and `partial_object` events are NOT persisted\n * here (stream-only); aggregate `tokens: { input, output, reasoning? }`\n * on `agent_call_end` is the persisted token representation. */\n events: AxlEvent[];\n totalCost: number;\n startedAt: number;\n completedAt?: number;\n duration: number;\n result?: unknown;\n error?: string;\n};\n\n/** Record of an agent handoff event (persisted in session metadata).\n *\n * `duration` semantics:\n * - `oneway`: target's full ask duration (start-to-completion).\n * - `roundtrip`: full round-trip wall-clock (handoff_start → handoff_return),\n * includes the time to push the result back into the source's\n * conversation. Both measurements are populated by the\n * runtime once the corresponding event fires; if the target\n * never completes (workflow aborted mid-handoff), `duration`\n * stays undefined.\n *\n * `toAskId` is the askId of the target frame — lets consumers correlate\n * the record to the target's `ask_end` event in the trace stream. */\nexport type HandoffRecord = {\n source: string;\n target: string;\n mode: 'oneway' | 'roundtrip';\n timestamp: number;\n duration?: number;\n toAskId?: string;\n};\n\n/** Information about a completed agent call, emitted via onAgentCallComplete. */\nexport type AgentCallInfo = {\n agent: string;\n prompt: string;\n response: string;\n model: string;\n cost: number;\n duration: number;\n promptVersion?: string;\n temperature?: number;\n maxTokens?: number;\n effort?: Effort;\n thinkingBudget?: number;\n includeThoughts?: boolean;\n toolChoice?: ToolChoice;\n stop?: string[];\n /** Provider-specific options merged into API requests. Not portable across providers. */\n providerOptions?: Record<string, unknown>;\n};\n\n/** Chat message types for provider communication */\nexport type ChatRole = 'system' | 'user' | 'assistant' | 'tool';\n\nexport type ChatMessage = {\n role: ChatRole;\n content: string;\n name?: string;\n tool_calls?: ToolCallMessage[];\n tool_call_id?: string;\n /** Provider-specific opaque metadata that must round-trip through conversation history. */\n providerMetadata?: Record<string, unknown>;\n};\n\nexport type ToolCallMessage = {\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n};\n\n/** Provider response */\nexport type ProviderResponse = {\n content: string;\n thinking_content?: string;\n tool_calls?: ToolCallMessage[];\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n reasoning_tokens?: number;\n cached_tokens?: number;\n };\n cost?: number;\n /** Provider-specific opaque metadata that needs to round-trip through conversation history. */\n providerMetadata?: Record<string, unknown>;\n};\n","import { spawn, type ChildProcess } from 'node:child_process';\nimport type {\n McpToolDefinition,\n McpToolResult,\n McpServer,\n McpServerConfig,\n JsonRpcRequest,\n JsonRpcResponse,\n} from './types.js';\n\n/**\n * MCP client using stdio transport.\n *\n * Spawns a child process and communicates via JSON-RPC over stdin/stdout.\n * Each message is a newline-delimited JSON-RPC object.\n */\nexport class StdioMcpClient implements McpServer {\n readonly name: string;\n tools: McpToolDefinition[] = [];\n private process: ChildProcess | null = null;\n private nextId = 1;\n private pending = new Map<\n number,\n {\n resolve: (value: JsonRpcResponse) => void;\n reject: (error: Error) => void;\n }\n >();\n private buffer = '';\n\n constructor(private config: McpServerConfig) {\n this.name = config.name;\n }\n\n async connect(): Promise<void> {\n if (!this.config.command) {\n throw new Error(`MCP server \"${this.name}\" has no command configured for stdio transport`);\n }\n\n const args = this.config.args ?? [];\n this.process = spawn(this.config.command, args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n env: { ...process.env, ...this.config.env },\n });\n\n this.process.stdout!.on('data', (data: Buffer) => {\n this.buffer += data.toString();\n this.processBuffer();\n });\n\n this.process.on('error', (err) => {\n // Reject all pending requests\n for (const { reject } of this.pending.values()) {\n reject(err);\n }\n this.pending.clear();\n });\n\n // Send initialize request\n const initResponse = await this.sendRequest('initialize', {\n protocolVersion: '2024-11-05',\n capabilities: {},\n clientInfo: { name: 'axl', version: '0.1.0' },\n });\n\n if (!initResponse.result) {\n throw new Error(`MCP server \"${this.name}\" failed to initialize`);\n }\n\n // Send initialized notification (no id = notification)\n this.sendNotification('notifications/initialized');\n\n // Discover tools\n await this.discoverTools();\n }\n\n private processBuffer(): void {\n const lines = this.buffer.split('\\n');\n this.buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n try {\n const msg = JSON.parse(trimmed) as JsonRpcResponse;\n if (msg.id !== undefined) {\n const pending = this.pending.get(msg.id);\n if (pending) {\n this.pending.delete(msg.id);\n pending.resolve(msg);\n }\n }\n } catch {\n // Ignore malformed JSON\n }\n }\n }\n\n private sendRequest(\n method: string,\n params?: unknown,\n timeoutMs = 30000,\n ): Promise<JsonRpcResponse> {\n return new Promise((resolve, reject) => {\n if (!this.process?.stdin?.writable) {\n reject(new Error(`MCP server \"${this.name}\" is not connected`));\n return;\n }\n\n const id = this.nextId++;\n const request: JsonRpcRequest = {\n jsonrpc: '2.0',\n id,\n method,\n params,\n };\n\n const timer = setTimeout(() => {\n this.pending.delete(id);\n reject(\n new Error(`MCP server \"${this.name}\" request \"${method}\" timed out after ${timeoutMs}ms`),\n );\n }, timeoutMs);\n\n this.pending.set(id, {\n resolve: (value) => {\n clearTimeout(timer);\n resolve(value);\n },\n reject: (err) => {\n clearTimeout(timer);\n reject(err);\n },\n });\n this.process.stdin.write(JSON.stringify(request) + '\\n');\n });\n }\n\n private sendNotification(method: string, params?: unknown): void {\n if (!this.process?.stdin?.writable) return;\n\n const notification = {\n jsonrpc: '2.0',\n method,\n ...(params ? { params } : {}),\n };\n this.process.stdin.write(JSON.stringify(notification) + '\\n');\n }\n\n private async discoverTools(): Promise<void> {\n const response = await this.sendRequest('tools/list');\n if (response.error) {\n throw new Error(\n `Failed to list tools from MCP server \"${this.name}\": ${response.error.message}`,\n );\n }\n\n const result = response.result as {\n tools: Array<{ name: string; description?: string; inputSchema?: unknown }>;\n };\n this.tools = (result.tools ?? []).map((t) => ({\n name: t.name,\n description: t.description ?? '',\n inputSchema: t.inputSchema ?? { type: 'object', properties: {} },\n }));\n }\n\n async callTool(toolName: string, args: unknown): Promise<McpToolResult> {\n const response = await this.sendRequest('tools/call', {\n name: toolName,\n arguments: args,\n });\n\n if (response.error) {\n return {\n content: [{ type: 'text', text: `Error: ${response.error.message}` }],\n isError: true,\n };\n }\n\n return response.result as McpToolResult;\n }\n\n async close(): Promise<void> {\n if (this.process) {\n this.process.kill();\n this.process = null;\n }\n for (const { reject } of this.pending.values()) {\n reject(new Error('MCP client closed'));\n }\n this.pending.clear();\n }\n}\n\n/**\n * MCP client using HTTP/SSE transport.\n *\n * Communicates with an MCP server via HTTP POST requests.\n */\nexport class HttpMcpClient implements McpServer {\n readonly name: string;\n tools: McpToolDefinition[] = [];\n private baseUrl: string;\n\n constructor(private config: McpServerConfig) {\n this.name = config.name;\n this.baseUrl = (config.uri ?? '').replace(/\\/$/, '');\n }\n\n async connect(): Promise<void> {\n if (!this.baseUrl) {\n throw new Error(`MCP server \"${this.name}\" has no URI configured for HTTP transport`);\n }\n\n // Initialize\n const initResult = await this.postRequest('initialize', {\n protocolVersion: '2024-11-05',\n capabilities: {},\n clientInfo: { name: 'axl', version: '0.1.0' },\n });\n\n if (!initResult) {\n throw new Error(`MCP server \"${this.name}\" failed to initialize`);\n }\n\n // Discover tools\n await this.discoverTools();\n }\n\n private async postRequest(method: string, params?: unknown, timeoutMs = 30000): Promise<unknown> {\n const request: JsonRpcRequest = {\n jsonrpc: '2.0',\n id: 1,\n method,\n params,\n };\n\n const res = await fetch(this.baseUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(request),\n signal: AbortSignal.timeout(timeoutMs),\n });\n\n if (!res.ok) {\n throw new Error(`MCP HTTP error (${res.status}): ${await res.text()}`);\n }\n\n const response = (await res.json()) as JsonRpcResponse;\n if (response.error) {\n throw new Error(`MCP server error: ${response.error.message}`);\n }\n\n return response.result;\n }\n\n private async discoverTools(): Promise<void> {\n const result = (await this.postRequest('tools/list')) as {\n tools: Array<{ name: string; description?: string; inputSchema?: unknown }>;\n };\n this.tools = (result.tools ?? []).map((t) => ({\n name: t.name,\n description: t.description ?? '',\n inputSchema: t.inputSchema ?? { type: 'object', properties: {} },\n }));\n }\n\n async callTool(toolName: string, args: unknown): Promise<McpToolResult> {\n try {\n const result = (await this.postRequest('tools/call', {\n name: toolName,\n arguments: args,\n })) as McpToolResult;\n return result;\n } catch (err) {\n return {\n content: [\n { type: 'text', text: `Error: ${err instanceof Error ? err.message : String(err)}` },\n ],\n isError: true,\n };\n }\n }\n\n async close(): Promise<void> {\n // HTTP transport: no persistent connection to close\n }\n}\n\n/**\n * Create the appropriate MCP client based on configuration.\n */\nexport function createMcpClient(config: McpServerConfig): StdioMcpClient | HttpMcpClient {\n if (config.uri) {\n return new HttpMcpClient(config);\n }\n return new StdioMcpClient(config);\n}\n","import type { McpServer, McpServerConfig, McpToolDefinition, McpToolResult } from './types.js';\nimport { createMcpClient } from './client.js';\nimport type { ToolDefinition } from '../providers/types.js';\n\n/**\n * Manages connections to multiple MCP servers.\n * Discovers tools, filters by agent config, and routes tool calls.\n *\n * MCP tools are namespaced internally as \"server:tool_name\" for disambiguation\n * and trace output, but presented to the LLM with their original names\n * (no prefix) to avoid confusing the model.\n */\nexport class McpManager {\n private servers = new Map<string, McpServer>();\n private initPromise: Promise<void> | null = null;\n\n /**\n * Initialize connections to all configured MCP servers.\n * Safe to call multiple times — subsequent calls return the original promise.\n */\n async initialize(configs: McpServerConfig[]): Promise<void> {\n if (this.initPromise) return this.initPromise;\n\n this.initPromise = (async () => {\n for (const config of configs) {\n const client = createMcpClient(config);\n await client.connect();\n this.servers.set(config.name, client);\n }\n })();\n\n try {\n await this.initPromise;\n } catch (err) {\n // Reset so a retry can attempt initialization again\n this.initPromise = null;\n throw err;\n }\n }\n\n /**\n * Get all tools from all connected servers.\n */\n getAllTools(): Array<{ server: string; tool: McpToolDefinition }> {\n const tools: Array<{ server: string; tool: McpToolDefinition }> = [];\n for (const [serverName, server] of this.servers) {\n for (const tool of server.tools) {\n tools.push({ server: serverName, tool });\n }\n }\n return tools;\n }\n\n /**\n * Get the qualified name for an MCP tool: \"server:tool_name\".\n * Used in traces and ACL declarations.\n */\n getQualifiedName(toolName: string): string | undefined {\n for (const [serverName, server] of this.servers) {\n if (server.tools.some((t) => t.name === toolName)) {\n return `${serverName}:${toolName}`;\n }\n }\n return undefined;\n }\n\n /**\n * Get tool definitions filtered for a specific agent's MCP configuration.\n *\n * @param agentMcp - Server names the agent has access to (undefined = all)\n * @param agentMcpTools - Specific tool names the agent can use.\n * Accepts both plain names (\"read_file\") and qualified names (\"fs-server:read_file\").\n * Qualified names enable disambiguation when multiple servers expose same-named tools.\n */\n getToolsForAgent(\n agentMcp?: string[],\n agentMcpTools?: string[],\n ): Array<{ server: string; tool: McpToolDefinition }> {\n const allTools = this.getAllTools();\n\n // Filter by server names if specified\n let filtered = agentMcp ? allTools.filter(({ server }) => agentMcp.includes(server)) : allTools;\n\n // Filter by specific tool names if specified\n if (agentMcpTools) {\n filtered = filtered.filter(({ server, tool }) => {\n const qualifiedName = `${server}:${tool.name}`;\n // Match against both qualified (\"server:tool\") and plain (\"tool\") names\n return agentMcpTools.includes(qualifiedName) || agentMcpTools.includes(tool.name);\n });\n }\n\n return filtered;\n }\n\n /**\n * Convert MCP tools to ToolDefinition format for sending to LLMs.\n * Tools are presented with their original names (no server prefix)\n * to avoid confusing the LLM.\n */\n getToolDefinitions(agentMcp?: string[], agentMcpTools?: string[]): ToolDefinition[] {\n const tools = this.getToolsForAgent(agentMcp, agentMcpTools);\n return tools.map(({ tool }) => ({\n type: 'function' as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n },\n }));\n }\n\n /**\n * Call a tool by name. Finds the correct server automatically.\n *\n * @param toolName - The tool name\n * @param args - Arguments for the tool\n * @param serverHint - Optional server name if known (for disambiguation)\n */\n async callTool(toolName: string, args: unknown, serverHint?: string): Promise<McpToolResult> {\n // If server hint provided, use it directly\n if (serverHint) {\n const server = this.servers.get(serverHint);\n if (!server) {\n return {\n content: [{ type: 'text', text: `MCP server \"${serverHint}\" not found` }],\n isError: true,\n };\n }\n return server.callTool(toolName, args);\n }\n\n // Find the server that has this tool\n for (const [, server] of this.servers) {\n const hasTool = server.tools.some((t) => t.name === toolName);\n if (hasTool) {\n return server.callTool(toolName, args);\n }\n }\n\n return {\n content: [{ type: 'text', text: `MCP tool \"${toolName}\" not found on any server` }],\n isError: true,\n };\n }\n\n /**\n * Check if a tool name belongs to an MCP server.\n */\n isMcpTool(toolName: string): boolean {\n for (const [, server] of this.servers) {\n if (server.tools.some((t) => t.name === toolName)) return true;\n }\n return false;\n }\n\n /**\n * Shut down all MCP server connections.\n */\n async shutdown(): Promise<void> {\n for (const [, server] of this.servers) {\n await server.close();\n }\n this.servers.clear();\n }\n\n /**\n * Get the number of connected servers.\n */\n get serverCount(): number {\n return this.servers.size;\n }\n}\n","import type {\n VectorStore,\n Embedder,\n EmbedUsage,\n EmbedResult,\n VectorResult,\n RememberOptions,\n RecallOptions,\n} from './types.js';\nimport type { StateStore } from '../state/types.js';\n\n/**\n * Result of a `MemoryManager.remember()` call.\n *\n * Exposes embedder `usage` so callers (WorkflowContext) can attribute\n * cost to the current execution scope and surface it in trace events.\n * `usage` is absent when no embedding happened (embed option not set,\n * or no vector store configured).\n */\nexport type RememberResult = {\n usage?: EmbedUsage;\n};\n\n/**\n * Result of a `MemoryManager.recall()` call.\n *\n * Wraps the original return shape (key-value payload or vector search\n * results) with optional embedder `usage`. Semantic recall populates\n * `usage` when the embedder reported it; key-value lookups never do.\n */\nexport type RecallResult = {\n data: unknown | VectorResult[] | null;\n usage?: EmbedUsage;\n};\n\n/**\n * Validate the shape returned by a user-supplied `Embedder.embed()` call.\n *\n * In 0.15 the `Embedder` contract changed from `Promise<number[][]>` to\n * `Promise<{ vectors: number[][]; usage?: EmbedUsage }>` so semantic\n * memory can carry cost attribution out to `ctx.budget()` and the cost\n * aggregator. A custom embedder that still returns the legacy bare\n * `number[][]` shape would otherwise destructure to `vectors === undefined`\n * and throw a cryptic `TypeError: Cannot read properties of undefined\n * (reading '0')` deep inside upsert/search — giving no hint to the user\n * that the fix is a return-shape migration, not a bug in axl.\n *\n * Fail loudly with a clear migration hint at the interface boundary.\n */\nfunction assertEmbedResult(result: unknown): asserts result is EmbedResult {\n if (Array.isArray(result)) {\n throw new Error(\n 'Embedder.embed() returned a bare number[][] (legacy shape). ' +\n 'As of @axlsdk/axl 0.15, Embedder.embed() must return ' +\n '{ vectors: number[][]; usage?: { tokens?, cost?, model? } }. ' +\n 'Wrap your existing return value: `return { vectors: await old() }`.',\n );\n }\n if (\n !result ||\n typeof result !== 'object' ||\n !Array.isArray((result as { vectors?: unknown }).vectors)\n ) {\n throw new Error(\n 'Embedder.embed() must return { vectors: number[][]; usage?: EmbedUsage }. ' +\n `Got ${result === null ? 'null' : typeof result}.`,\n );\n }\n}\n\n/**\n * Coordinates key-value memory and vector store for semantic search.\n * All key-value operations delegate to the StateStore.\n * Vector operations use the configured VectorStore + Embedder.\n */\nexport class MemoryManager {\n private vectorStore?: VectorStore;\n private embedder?: Embedder;\n\n constructor(options?: { vectorStore?: VectorStore; embedder?: Embedder }) {\n this.vectorStore = options?.vectorStore;\n this.embedder = options?.embedder;\n\n if (this.vectorStore && !this.embedder) {\n throw new Error('An embedder is required when a vectorStore is configured');\n }\n }\n\n /**\n * Store a key-value pair in memory.\n * If a vector store and embedder are configured and embed is true,\n * also embeds the value for semantic search.\n *\n * Returns `{ usage }` when embedding happened, carrying the embedder's\n * cost/token reporting out to the caller for cost attribution.\n */\n async remember(\n key: string,\n value: unknown,\n stateStore: StateStore,\n sessionId: string | undefined,\n options?: RememberOptions,\n signal?: AbortSignal,\n ): Promise<RememberResult> {\n const scope = options?.scope ?? 'session';\n\n // Determine the storage scope string\n if (scope === 'session' && !sessionId) {\n throw new Error(\n 'sessionId is required for session-scoped memory. Use { scope: \"global\" } or provide a sessionId in metadata.',\n );\n }\n const storeScope = scope === 'session' ? `session:${sessionId}` : 'global';\n\n // Use dedicated memory methods if available, otherwise fall back to sessionMeta\n if (stateStore.saveMemory) {\n await stateStore.saveMemory(storeScope, key, value);\n } else {\n const storeKey = `memory:${storeScope}:${key}`;\n await stateStore.saveSessionMeta(storeKey, 'value', value);\n if (options?.metadata) {\n await stateStore.saveSessionMeta(storeKey, 'metadata', options.metadata);\n }\n }\n\n // Optionally embed for semantic search (opt-in: embed must be explicitly true)\n if (options?.embed === true && this.vectorStore && this.embedder) {\n const text = typeof value === 'string' ? value : JSON.stringify(value);\n const raw = await this.embedder.embed([text], signal);\n assertEmbedResult(raw);\n const { vectors, usage } = raw;\n // The embed API call already happened — the user has been billed.\n // If the downstream vectorStore.upsert fails, we must preserve the\n // usage attribution so the caller's error handler can still record\n // cost for the completed embed. Without this, a transient vector-store\n // failure silently decouples real API spend from the cost tracker,\n // and the user's reported costs diverge from their provider bill.\n try {\n await this.vectorStore.upsert([\n {\n id: `${storeScope}:${key}`,\n content: text,\n embedding: vectors[0],\n metadata: { key, scope, ...options?.metadata },\n },\n ]);\n } catch (err) {\n if (usage && typeof err === 'object' && err !== null) {\n // Non-enumerable so it doesn't pollute `JSON.stringify(err)` or\n // stack-trace output, but code that knows to look for it can\n // recover the cost attribution on the failure path.\n Object.defineProperty(err, 'axlEmbedUsage', {\n value: usage,\n enumerable: false,\n writable: true,\n configurable: true,\n });\n }\n throw err;\n }\n return usage ? { usage } : {};\n }\n\n return {};\n }\n\n /**\n * Recall a value from memory by key, or perform semantic search if query is provided.\n *\n * Always returns `{ data }`; semantic recalls additionally include\n * `usage` from the embedder (when the embedder reported it).\n */\n async recall(\n key: string,\n stateStore: StateStore,\n sessionId: string | undefined,\n options?: RecallOptions,\n signal?: AbortSignal,\n ): Promise<RecallResult> {\n // Semantic search mode\n if (options?.query && this.vectorStore && this.embedder) {\n const raw = await this.embedder.embed([options.query], signal);\n assertEmbedResult(raw);\n const { vectors, usage } = raw;\n const topK = options?.topK ?? 5;\n\n // Determine the target scope for filtering\n const searchScope = options?.scope ?? 'session';\n if (searchScope === 'session' && !sessionId) {\n throw new Error(\n 'sessionId is required for session-scoped memory. Use { scope: \"global\" } or provide a sessionId in metadata.',\n );\n }\n\n // Fetch extra results to account for scope filtering, then filter by scope\n const rawResults = await this.vectorStore.search(vectors[0], topK * 3);\n const filtered = rawResults.filter((r) => {\n // Global entries are always visible\n if (r.id.startsWith('global:')) return true;\n // Session entries only visible to the same session\n if (searchScope === 'session') return r.id.startsWith(`session:${sessionId}:`);\n return true;\n });\n const data = filtered.slice(0, topK);\n return usage ? { data, usage } : { data };\n }\n\n // Key-value lookup\n const scope = options?.scope ?? 'session';\n if (scope === 'session' && !sessionId) {\n throw new Error(\n 'sessionId is required for session-scoped memory. Use { scope: \"global\" } or provide a sessionId in metadata.',\n );\n }\n const storeScope = scope === 'session' ? `session:${sessionId}` : 'global';\n\n if (stateStore.getMemory) {\n return { data: await stateStore.getMemory(storeScope, key) };\n }\n\n // Fallback to sessionMeta\n const storeKey = `memory:${storeScope}:${key}`;\n return { data: await stateStore.getSessionMeta(storeKey, 'value') };\n }\n\n /** Delete a memory entry. If a vector store is configured, also removes the embedding. */\n async forget(\n key: string,\n stateStore: StateStore,\n sessionId: string | undefined,\n options?: { scope?: 'session' | 'global' },\n ): Promise<void> {\n const scope = options?.scope ?? 'session';\n if (scope === 'session' && !sessionId) {\n throw new Error(\n 'sessionId is required for session-scoped memory. Use { scope: \"global\" } or provide a sessionId in metadata.',\n );\n }\n const storeScope = scope === 'session' ? `session:${sessionId}` : 'global';\n\n if (stateStore.deleteMemory) {\n await stateStore.deleteMemory(storeScope, key);\n } else {\n // Fallback: save null to effectively \"delete\" both value and metadata keys\n const storeKey = `memory:${storeScope}:${key}`;\n await stateStore.saveSessionMeta(storeKey, 'value', null);\n await stateStore.saveSessionMeta(storeKey, 'metadata', null);\n }\n\n // Remove from vector store if present\n if (this.vectorStore) {\n await this.vectorStore.delete([`${storeScope}:${key}`]);\n }\n }\n\n /** Shut down the vector store if it has a close method. */\n async close(): Promise<void> {\n if (this.vectorStore?.close) {\n await this.vectorStore.close();\n }\n }\n}\n","import type { SpanHandle, SpanManager } from './types.js';\n\nconst NOOP_SPAN: SpanHandle = {\n setAttribute() {},\n addEvent() {},\n setStatus() {},\n end() {},\n};\n\n/**\n * No-op span manager. Zero overhead when OTel is not configured.\n * All methods are synchronous no-ops that return immediately.\n */\nexport class NoopSpanManager implements SpanManager {\n async withSpanAsync<T>(\n _name: string,\n _attributes: Record<string, string | number | boolean>,\n fn: (span: SpanHandle) => Promise<T>,\n ): Promise<T> {\n return fn(NOOP_SPAN);\n }\n\n addEventToActiveSpan(): void {}\n\n async shutdown(): Promise<void> {}\n}\n","export type { TelemetryConfig, SpanHandle, SpanManager } from './types.js';\nexport { NoopSpanManager } from './noop.js';\nexport { OTelSpanManager } from './span-manager.js';\n\nimport type { TelemetryConfig, SpanManager } from './types.js';\nimport { NoopSpanManager } from './noop.js';\n\n/**\n * Create a SpanManager based on configuration.\n * Returns NoopSpanManager when telemetry is disabled (zero overhead).\n * Dynamically imports OTelSpanManager when enabled (avoids hard dep).\n */\nexport async function createSpanManager(config?: TelemetryConfig): Promise<SpanManager> {\n if (!config?.enabled) {\n return new NoopSpanManager();\n }\n\n const { OTelSpanManager } = await import('./span-manager.js');\n return OTelSpanManager.create(config);\n}\n","/**\n * Module-export resolution helpers for dynamically-imported user modules.\n *\n * Walks the ESM/CJS interop chain so consumers see the same shape regardless\n * of how Node loaded the file. The original motivating bug: `axl-eval` looked\n * up `executeWorkflow` as `mod.executeWorkflow` only, but tsx-loading a `.ts`\n * file in a CJS package puts named exports on `mod.default.executeWorkflow`,\n * so the lookup silently fell back to identity passthrough — producing\n * all-zero scores in CI.\n *\n * Use these helpers (not hand-rolled `mod.default ?? mod` walks) at every\n * dynamic-import call site to keep default and named lookups symmetric.\n *\n * @internal Not part of the public SDK surface — exported only so the eval\n * CLI and Studio middleware can share one implementation.\n */\n\n/**\n * Resolve the AxlRuntime from a dynamically imported config module.\n * Handles ESM default exports, CJS-to-ESM interop wrapping, and named exports.\n *\n * Module shapes handled:\n * - ESM `export default runtime` → `mod.default` is the runtime\n * - CJS compiled from `export default runtime` → `mod.default.default` is the runtime\n * - CJS `module.exports = runtime` → `mod.default` is the runtime\n * - Named `export { runtime }` → `mod.runtime` is the runtime\n *\n * @internal\n */\nexport function resolveRuntime(mod: Record<string, unknown>): unknown {\n const def = mod.default as Record<string, unknown> | undefined;\n return def?.default ?? def ?? mod.runtime;\n}\n\n/**\n * Look up the default-ish export from a dynamically imported module. Walks\n * the ESM/CJS interop chain plus a `config` named-export fallback that some\n * eval modules use.\n *\n * Module shapes handled:\n * - ESM `export default cfg`: `mod.default`\n * - CJS-wrapped-as-ESM: `mod.default.default`\n * - Named `export const config = cfg`: `mod.config`\n * - Bare module value: `mod`\n *\n * Mirrors the chain `pickExport()` walks for named exports — keep them in\n * sync so resolution is symmetric.\n *\n * @internal\n */\nexport function pickDefault<T>(mod: Record<string, unknown>): T {\n const def = mod.default as Record<string, unknown> | undefined;\n return (def?.default ?? def ?? mod.config ?? mod) as T;\n}\n\n/**\n * Look up a named export from a dynamically imported module, walking the\n * ESM/CJS interop chain symmetrically with `resolveRuntime` and `pickDefault`.\n *\n * Module shapes handled:\n * - ESM: `mod[key]`\n * - CJS-wrapped-as-ESM: `mod.default[key]` (tsx/ts compiled to CJS)\n * - CJS double-wrap: `mod.default.default[key]` (rare interop edge)\n *\n * Without this helper, named exports would be silently invisible whenever the\n * module loads as CJS (e.g. a `.ts` file in a package without `\"type\": \"module\"`),\n * even though the default export resolves correctly via the chain walk.\n *\n * `null`-valued exports are treated as \"absent\" (the `??` chain falls through),\n * matching how a missing export presents at the language level. Callers that\n * need to distinguish \"explicitly null\" from \"missing\" should not use this helper.\n *\n * @internal\n */\nexport function pickExport<T>(mod: Record<string, unknown>, key: string): T | undefined {\n const def = mod.default as Record<string, unknown> | undefined;\n return (mod[key] ??\n def?.[key] ??\n (def?.default as Record<string, unknown> | undefined)?.[key]) as T | undefined;\n}\n","/**\n * Shared CLI helpers for `@axlsdk/eval` and `@axlsdk/studio`. Hosted in core\n * so a fix to (e.g.) the tsx loader registration applies to both consumers\n * atomically — same anti-drift reasoning as `module-resolve.ts`.\n *\n * Not exported from the package index intentionally — these are loader-level\n * utilities, not part of the runtime/agent API. Consumers re-export the\n * pieces they need from their own `cli-utils` modules.\n *\n * @internal\n */\n\nimport { resolve, dirname, basename } from 'node:path';\nimport { existsSync, readdirSync, statSync } from 'node:fs';\nimport { pathToFileURL } from 'node:url';\n\n// ── Config auto-detection ──────────────────────────────────────────\n\n/**\n * Filenames searched (in order) when no `--config` is passed. Both `axl-eval`\n * and `axl-studio` walk this list — kept here so adding a new candidate\n * (e.g. `axl.config.cts`) takes effect everywhere.\n *\n * @internal\n */\nexport const CONFIG_CANDIDATES = [\n 'axl.config.mts',\n 'axl.config.ts',\n 'axl.config.mjs',\n 'axl.config.js',\n];\n\n/**\n * Find an `axl.config.*` file in `cwd`, returning the absolute path of the\n * first match in `CONFIG_CANDIDATES` order. Returns `undefined` if none exist.\n *\n * @internal\n */\nexport function findConfig(cwd: string): string | undefined {\n for (const name of CONFIG_CANDIDATES) {\n const p = resolve(cwd, name);\n if (existsSync(p)) return p;\n }\n return undefined;\n}\n\n// ── Extension helpers ──────────────────────────────────────────────\n\n/**\n * Returns true if the file is TypeScript and needs tsx to load.\n *\n * @internal\n */\nexport function needsTsxLoader(filePath: string): boolean {\n return /\\.[mc]?tsx?$/.test(filePath);\n}\n\n// ── Module loading ────────────────────────────────────────────────\n\n// Tracks whether we've already activated tsx's process-wide ESM loader hooks.\n// `undefined` = not yet attempted, `true` = active, `false` = tsx unavailable.\n// Module-scoped so the second consumer (e.g. studio after eval) reuses\n// eval's registration instead of attempting to re-register.\nlet tsxRegistered: boolean | undefined;\n\n/**\n * Activate tsx's process-wide ESM loader hooks once per Node process so any\n * subsequent `await import('./foo.ts')` is transformed.\n *\n * Implementation note: tsx's `tsImport(specifier, parent)` uses a unique\n * namespace per call — it only transforms the entry import. Chained imports\n * MADE BY the entry file fall back to native Node ESM resolution, which\n * can't load `.ts` sources. That broke `--conditions development` whenever a\n * monorepo's `development` export pointed at `.ts` files. We instead call\n * `register()` (no namespace) once and rely on plain `await import()` for\n * each file — tsx then intercepts the entire ESM module graph for the\n * process lifetime.\n *\n * Process-wide registration is what tsx's own CLI does. The hook is\n * idempotent and only acts on TypeScript-extension specifiers. Falls back\n * to false if tsx is not installed.\n *\n * @internal\n */\nasync function ensureTsxRegistered(): Promise<boolean> {\n if (tsxRegistered !== undefined) return tsxRegistered;\n try {\n // @ts-expect-error — tsx is an optional runtime dependency\n const mod = await import('tsx/esm/api');\n if (typeof mod.register === 'function') {\n mod.register();\n tsxRegistered = true;\n } else {\n tsxRegistered = false;\n }\n } catch {\n tsxRegistered = false;\n }\n return tsxRegistered;\n}\n\n/**\n * Import a module by file path, activating tsx's loader for `.ts`/`.tsx`\n * files. Throws an actionable error if tsx is needed but not installed —\n * preventing Node's cryptic `Unknown file extension '.ts'` from leaking\n * to the user.\n *\n * @internal\n */\nexport async function importModule(\n filePath: string,\n _parentURL?: string,\n): Promise<Record<string, unknown>> {\n if (needsTsxLoader(filePath)) {\n const registered = await ensureTsxRegistered();\n if (!registered) {\n throw new Error(\n `Cannot load TypeScript file ${filePath}: tsx is not installed.\\n` +\n ` tsx is declared by @axlsdk/eval / @axlsdk/studio so pnpm 8+ and npm 7+\\n` +\n ` install it automatically. On Yarn Classic or with auto-install-peers\\n` +\n ` disabled, install it explicitly: npm install -D tsx`,\n );\n }\n }\n return await import(pathToFileURL(filePath).href);\n}\n\n// ── Glob expansion ────────────────────────────────────────────────\n\nconst MAX_GLOB_DEPTH = 20;\n\n/**\n * Minimal glob expander. Both axl-eval (CLI args) and axl-studio's\n * eval-loader (`evals: '...'` middleware option) walk this so a user gets\n * identical behavior whether they invoke the CLI or mount the middleware.\n *\n * Supported forms:\n * - `dir/*.eval.ts` — match files in dir/\n * - `dir/.../*.eval.ts` — recursively match under dir/ (use `**\\/*.eval.ts`)\n * - `**\\/*.eval.ts` — recursively match under cwd\n *\n * Multi-segment `**` (e.g. `a/**\\/b/**\\/*.ts`) is not supported — deliberate\n * scope limit; users with that need can pre-expand themselves.\n *\n * @internal\n */\nexport function expandGlob(pattern: string, cwd: string): string[] {\n if (pattern.includes('**/')) {\n const sepIdx = pattern.indexOf('**/');\n const baseDir = resolve(cwd, pattern.slice(0, sepIdx) || '.');\n const fileGlob = pattern.slice(sepIdx + 3) || '*';\n return findFiles(baseDir, fileGlob, true);\n }\n const dir = resolve(cwd, dirname(pattern));\n const fileGlob = basename(pattern);\n return findFiles(dir, fileGlob, false);\n}\n\nfunction findFiles(dir: string, fileGlob: string, recursive: boolean, depth = 0): string[] {\n if (depth > MAX_GLOB_DEPTH) return [];\n const matcher = globToRegex(fileGlob);\n const results: string[] = [];\n try {\n const entries = readdirSync(dir);\n for (const entry of entries) {\n const full = resolve(dir, entry);\n try {\n const stat = statSync(full);\n if (stat.isFile() && matcher.test(entry)) {\n results.push(full);\n } else if (stat.isDirectory() && recursive) {\n results.push(...findFiles(full, fileGlob, true, depth + 1));\n }\n } catch {\n // Skip unreadable entries\n }\n }\n } catch {\n // Directory missing — return empty\n }\n return results;\n}\n\nfunction globToRegex(glob: string): RegExp {\n const escaped = glob.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&').replace(/\\*/g, '.*');\n return new RegExp(`^${escaped}$`);\n}\n\n// ── Conditions ────────────────────────────────────────────────────\n\n/**\n * Add custom Node.js import conditions process-wide via `module.register()`.\n * Used by `--conditions development` in monorepos whose package.json\n * `exports` use a `development` condition to point at `.ts` source instead\n * of built `dist`.\n *\n * Caveat: ESM-only. CJS `require()` chains bypass the hook. Files tsx\n * compiles to CJS (`.cts`, or `.ts` in a package without\n * `\"type\": \"module\"`) issue `require()` calls that don't see the extra\n * conditions — workaround is to add `\"type\": \"module\"` or rename to `.mts`.\n *\n * @internal\n */\nexport async function registerConditions(conditions: string[]): Promise<void> {\n try {\n const nodeModule = await import('node:module');\n const hookCode = [\n `const extra = ${JSON.stringify(conditions)};`,\n `export async function resolve(specifier, context, nextResolve) {`,\n ` return nextResolve(specifier, {`,\n ` ...context,`,\n ` conditions: [...new Set([...context.conditions, ...extra])],`,\n ` });`,\n `}`,\n ].join('\\n');\n nodeModule.register(`data:text/javascript,${encodeURIComponent(hookCode)}`);\n } catch {\n console.warn('Warning: --conditions requires Node.js 20.6+');\n }\n}\n","import type { ChatMessage, ExecutionInfo, HumanDecision } from '../types.js';\nimport type { StateStore, PendingDecision, ExecutionState, EvalHistoryEntry } from './types.js';\n\n// Minimal interface for the node-redis client methods we use.\n// Avoids a hard compile-time dependency on the redis package.\ninterface RedisClient {\n hSet(key: string, field: string, value: string): Promise<number>;\n hGet(key: string, field: string): Promise<string | null | undefined>;\n hGetAll(key: string): Promise<Record<string, string>>;\n hDel(key: string, field: string | string[]): Promise<number>;\n set(key: string, value: string): Promise<string | null>;\n get(key: string): Promise<string | null>;\n del(key: string | string[]): Promise<number>;\n sAdd(key: string, member: string | string[]): Promise<number>;\n sRem(key: string, member: string | string[]): Promise<number>;\n sMembers(key: string): Promise<string[]>;\n quit(): Promise<void>;\n}\n\n/**\n * Redis-backed StateStore using the official `redis` (node-redis) client.\n *\n * Designed for multi-process and sidecar deployments where\n * multiple runtime instances need shared state.\n *\n * Requires `redis` as a peer dependency. Create instances via the\n * async `RedisStore.create()` factory, which connects before returning.\n */\nexport class RedisStore implements StateStore {\n private constructor(private client: RedisClient) {}\n\n /**\n * Create a connected RedisStore instance.\n *\n * @param url - Redis connection URL (e.g. `redis://localhost:6379`). Defaults to `redis://localhost:6379`.\n */\n static async create(url?: string): Promise<RedisStore> {\n let createClient: (opts?: { url?: string }) => RedisClient & { connect(): Promise<void> };\n try {\n const mod = require('redis');\n createClient = mod.createClient ?? mod.default?.createClient;\n if (typeof createClient !== 'function') {\n throw new Error(\n 'redis package does not export createClient. Ensure you have redis ^5.0.0 installed: npm install redis',\n );\n }\n } catch (err) {\n if (err instanceof Error && err.message.includes('createClient')) throw err;\n throw new Error('redis is required for RedisStore. Install it with: npm install redis');\n }\n\n const client = url ? createClient({ url }) : createClient();\n await client.connect();\n return new RedisStore(client);\n }\n\n // ── Key helpers ──────────────────────────────────────────────────────\n\n private checkpointKey(executionId: string): string {\n return `axl:checkpoint:${executionId}`;\n }\n\n private sessionKey(sessionId: string): string {\n return `axl:session:${sessionId}`;\n }\n\n private sessionMetaKey(sessionId: string): string {\n return `axl:session-meta:${sessionId}`;\n }\n\n private decisionsKey(): string {\n return 'axl:decisions';\n }\n\n private executionStateKey(executionId: string): string {\n return `axl:exec-state:${executionId}`;\n }\n\n private pendingExecSetKey(): string {\n return 'axl:pending-executions';\n }\n\n private execHistoryKey(executionId: string): string {\n return `axl:exec-history:${executionId}`;\n }\n\n private execHistorySetKey(): string {\n return 'axl:exec-history-ids';\n }\n\n private evalHistoryKey(id: string): string {\n return `axl:eval-history:${id}`;\n }\n\n private evalHistorySetKey(): string {\n return 'axl:eval-history-ids';\n }\n\n // ── Checkpoints ──────────────────────────────────────────────────────\n\n async saveCheckpoint(executionId: string, name: string, data: unknown): Promise<void> {\n await this.client.hSet(this.checkpointKey(executionId), name, JSON.stringify(data));\n }\n\n async getCheckpoint(executionId: string, name: string): Promise<unknown | null> {\n const raw = await this.client.hGet(this.checkpointKey(executionId), name);\n return raw != null ? JSON.parse(raw) : null;\n }\n\n // ── Sessions ─────────────────────────────────────────────────────────\n\n async saveSession(sessionId: string, history: ChatMessage[]): Promise<void> {\n await this.client.set(this.sessionKey(sessionId), JSON.stringify(history));\n await this.client.sAdd('axl:session-ids', sessionId);\n }\n\n async getSession(sessionId: string): Promise<ChatMessage[]> {\n const raw = await this.client.get(this.sessionKey(sessionId));\n return raw ? JSON.parse(raw) : [];\n }\n\n async deleteSession(sessionId: string): Promise<void> {\n await this.client.del(this.sessionKey(sessionId));\n await this.client.del(this.sessionMetaKey(sessionId));\n await this.client.sRem('axl:session-ids', sessionId);\n }\n\n async saveSessionMeta(sessionId: string, key: string, value: unknown): Promise<void> {\n await this.client.hSet(this.sessionMetaKey(sessionId), key, JSON.stringify(value));\n }\n\n async getSessionMeta(sessionId: string, key: string): Promise<unknown | null> {\n const raw = await this.client.hGet(this.sessionMetaKey(sessionId), key);\n return raw != null ? JSON.parse(raw) : null;\n }\n\n // ── Pending Decisions ────────────────────────────────────────────────\n\n async savePendingDecision(executionId: string, decision: PendingDecision): Promise<void> {\n await this.client.hSet(this.decisionsKey(), executionId, JSON.stringify(decision));\n }\n\n async getPendingDecisions(): Promise<PendingDecision[]> {\n const all = await this.client.hGetAll(this.decisionsKey());\n if (!all) return [];\n return Object.values(all).map((raw) => JSON.parse(raw));\n }\n\n async resolveDecision(executionId: string, _result: HumanDecision): Promise<void> {\n await this.client.hDel(this.decisionsKey(), executionId);\n }\n\n // ── Execution State ──────────────────────────────────────────────────\n\n async saveExecutionState(executionId: string, state: ExecutionState): Promise<void> {\n await this.client.set(this.executionStateKey(executionId), JSON.stringify(state));\n\n if (state.status === 'waiting') {\n await this.client.sAdd(this.pendingExecSetKey(), executionId);\n } else {\n await this.client.sRem(this.pendingExecSetKey(), executionId);\n }\n }\n\n async getExecutionState(executionId: string): Promise<ExecutionState | null> {\n const raw = await this.client.get(this.executionStateKey(executionId));\n return raw ? JSON.parse(raw) : null;\n }\n\n async listPendingExecutions(): Promise<string[]> {\n return this.client.sMembers(this.pendingExecSetKey());\n }\n\n // ── Execution History ────────────────────────────────────────────────\n\n async saveExecution(execution: ExecutionInfo): Promise<void> {\n // Write set membership first — if we crash between the two writes,\n // listExecutions gracefully skips IDs with missing values.\n await this.client.sAdd(this.execHistorySetKey(), execution.executionId);\n await this.client.set(this.execHistoryKey(execution.executionId), JSON.stringify(execution));\n }\n\n async getExecution(executionId: string): Promise<ExecutionInfo | null> {\n const raw = await this.client.get(this.execHistoryKey(executionId));\n return raw ? JSON.parse(raw) : null;\n }\n\n async listExecutions(limit?: number): Promise<ExecutionInfo[]> {\n const ids = await this.client.sMembers(this.execHistorySetKey());\n if (ids.length === 0) return [];\n\n const entries: ExecutionInfo[] = [];\n for (const id of ids) {\n const raw = await this.client.get(this.execHistoryKey(id));\n if (raw) entries.push(JSON.parse(raw));\n }\n entries.sort((a, b) => b.startedAt - a.startedAt);\n return limit ? entries.slice(0, limit) : entries;\n }\n\n // ── Eval History ────────────────────────────────────────────────────\n\n async saveEvalResult(entry: EvalHistoryEntry): Promise<void> {\n await this.client.sAdd(this.evalHistorySetKey(), entry.id);\n await this.client.set(this.evalHistoryKey(entry.id), JSON.stringify(entry));\n }\n\n async listEvalResults(limit?: number): Promise<EvalHistoryEntry[]> {\n const ids = await this.client.sMembers(this.evalHistorySetKey());\n if (ids.length === 0) return [];\n\n const entries: EvalHistoryEntry[] = [];\n for (const id of ids) {\n const raw = await this.client.get(this.evalHistoryKey(id));\n if (raw) entries.push(JSON.parse(raw));\n }\n entries.sort((a, b) => b.timestamp - a.timestamp);\n return limit ? entries.slice(0, limit) : entries;\n }\n\n async deleteEvalResult(id: string): Promise<boolean> {\n // Remove from both the index set and the data key. del() returns the\n // number of keys actually deleted, which we use as the \"existed\" signal\n // so callers can distinguish \"not found\" from \"deleted\" without a\n // separate EXISTS round-trip.\n await this.client.sRem(this.evalHistorySetKey(), id);\n const deleted = await this.client.del(this.evalHistoryKey(id));\n return deleted > 0;\n }\n\n // ── Sessions (Studio introspection) ────────────────────────────────────\n\n async listSessions(): Promise<string[]> {\n // Redis doesn't have a built-in way to list keys by pattern without SCAN,\n // so we maintain a set of session IDs alongside the session data.\n return this.client.sMembers('axl:session-ids');\n }\n\n /** Close the Redis connection. */\n async close(): Promise<void> {\n await this.client.quit();\n }\n\n async deleteCheckpoints(executionId: string): Promise<void> {\n await this.client.del(this.checkpointKey(executionId));\n }\n}\n","import type { Embedder, EmbedResult } from './types.js';\nimport { fetchWithRetry } from '../providers/retry.js';\n\n/**\n * Per-million-token USD pricing for OpenAI embedding models.\n *\n * These values are hardcoded because (a) there's no pricing endpoint on\n * the OpenAI API and (b) the alternative is asking users to pass a\n * pricing table into every MemoryManager. Accept drift as a maintenance\n * cost — pricing changes ~yearly and we update this table in the same\n * commit as any rename/deprecation.\n *\n * Source: https://openai.com/api/pricing/ (embeddings section)\n * Last verified: April 2026.\n */\nconst EMBEDDING_PRICE_PER_1M_TOKENS: Record<string, number> = {\n 'text-embedding-3-small': 0.02,\n 'text-embedding-3-large': 0.13,\n 'text-embedding-ada-002': 0.1,\n};\n\n/**\n * Compute USD cost for a given model + token count.\n * Returns undefined for unknown models — we don't guess pricing, and a\n * missing cost is strictly better than a wrong cost in downstream math.\n */\nfunction computeCost(model: string, tokens: number): number | undefined {\n const pricePerMillion = EMBEDDING_PRICE_PER_1M_TOKENS[model];\n if (pricePerMillion == null) return undefined;\n return (tokens / 1_000_000) * pricePerMillion;\n}\n\n/**\n * OpenAI embeddings via raw fetch (zero SDK dependency).\n * Uses the /v1/embeddings endpoint.\n */\nexport class OpenAIEmbedder implements Embedder {\n private apiKey: string;\n private model: string;\n private baseUrl: string;\n readonly dimensions: number;\n\n constructor(\n options: {\n apiKey?: string;\n model?: string;\n baseUrl?: string;\n dimensions?: number;\n } = {},\n ) {\n this.apiKey = options.apiKey ?? process.env.OPENAI_API_KEY ?? '';\n if (!this.apiKey) {\n throw new Error('OpenAI API key is required for OpenAIEmbedder');\n }\n this.model = options.model ?? 'text-embedding-3-small';\n this.baseUrl = options.baseUrl ?? 'https://api.openai.com';\n this.dimensions = options.dimensions ?? 1536;\n }\n\n async embed(texts: string[], signal?: AbortSignal): Promise<EmbedResult> {\n // Use `fetchWithRetry` for consistency with the core provider adapters\n // (`openai`, `openai-responses`, `anthropic`, `gemini`) — transient\n // 429/503/529 responses get exponential-backoff retry with Retry-After\n // support. Without this, a rate-limited embed() call tanked the parent\n // `ctx.remember({embed:true})` and cost attribution silently lost the\n // call from observability.\n const response = await fetchWithRetry(`${this.baseUrl}/v1/embeddings`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n model: this.model,\n input: texts,\n dimensions: this.dimensions,\n }),\n signal,\n });\n\n if (!response.ok) {\n const body = await response.text();\n throw new Error(`OpenAI embeddings API error (${response.status}): ${body}`);\n }\n\n const json = (await response.json()) as {\n data: Array<{ embedding: number[]; index: number }>;\n usage?: { prompt_tokens?: number; total_tokens?: number };\n };\n\n // Sort by index to maintain input order\n const vectors = json.data.sort((a, b) => a.index - b.index).map((d) => d.embedding);\n\n // OpenAI's embeddings endpoint bills on prompt tokens; total_tokens\n // equals prompt_tokens for this endpoint but prefer the explicit field.\n const tokens = json.usage?.prompt_tokens ?? json.usage?.total_tokens;\n const cost = tokens != null ? computeCost(this.model, tokens) : undefined;\n\n // Only emit `usage` when the API actually reported something useful.\n // A bare `{ model }` with no tokens/cost would trigger downstream\n // byEmbedder bucketing that records zero-everything entries —\n // misleading at best. If neither tokens nor cost are available\n // (Azure proxy without a usage block, compat mode), omit `usage`\n // entirely and the cost/observability path short-circuits cleanly.\n if (tokens == null && cost == null) {\n return { vectors };\n }\n\n return {\n vectors,\n usage: {\n ...(tokens != null ? { tokens } : {}),\n ...(cost != null ? { cost } : {}),\n model: this.model,\n },\n };\n }\n}\n","import type { VectorStore, VectorEntry, VectorResult } from './types.js';\n\n/** Compute cosine similarity between two vectors. */\nfunction cosineSimilarity(a: number[], b: number[]): number {\n let dot = 0;\n let normA = 0;\n let normB = 0;\n for (let i = 0; i < a.length; i++) {\n dot += a[i] * b[i];\n normA += a[i] * a[i];\n normB += b[i] * b[i];\n }\n const denom = Math.sqrt(normA) * Math.sqrt(normB);\n return denom === 0 ? 0 : dot / denom;\n}\n\n/**\n * In-memory vector store using brute-force cosine similarity.\n * Suitable for testing and small datasets only.\n */\nexport class InMemoryVectorStore implements VectorStore {\n private entries = new Map<string, VectorEntry>();\n\n async upsert(entries: VectorEntry[]): Promise<void> {\n for (const entry of entries) {\n this.entries.set(entry.id, { ...entry });\n }\n }\n\n async search(embedding: number[], topK: number): Promise<VectorResult[]> {\n const results: VectorResult[] = [];\n\n for (const entry of this.entries.values()) {\n const score = cosineSimilarity(embedding, entry.embedding);\n results.push({\n id: entry.id,\n content: entry.content,\n score,\n metadata: entry.metadata,\n });\n }\n\n results.sort((a, b) => b.score - a.score);\n return results.slice(0, topK);\n }\n\n async delete(ids: string[]): Promise<void> {\n for (const id of ids) {\n this.entries.delete(id);\n }\n }\n}\n","import type { VectorStore, VectorEntry, VectorResult } from './types.js';\n\n/** Minimal interface for a better-sqlite3 database instance. */\ninterface BetterSqlite3Database {\n pragma(pragma: string): unknown;\n exec(sql: string): void;\n prepare(sql: string): {\n run(...params: unknown[]): unknown;\n all(...params: unknown[]): unknown[];\n };\n transaction<T extends (...args: never[]) => void>(fn: T): T;\n close(): void;\n}\n\n/**\n * SQLite-backed vector store using better-sqlite3.\n * Uses a simple serialized embedding column with brute-force cosine similarity in JS.\n * For production workloads, consider a dedicated vector database.\n *\n * This avoids dependency on sqlite-vec extension by computing similarity in JS\n * after retrieving all rows (brute-force scan). Suitable for small-to-medium datasets.\n */\nexport class SqliteVectorStore implements VectorStore {\n private db: BetterSqlite3Database;\n\n constructor(options: { path?: string } = {}) {\n let Database: new (path: string) => BetterSqlite3Database;\n try {\n Database = require('better-sqlite3');\n } catch {\n throw new Error(\n 'better-sqlite3 is required for SqliteVectorStore. Install it with: npm install better-sqlite3',\n );\n }\n this.db = new Database(options.path ?? ':memory:');\n this.db.pragma('journal_mode = WAL');\n this.initTables();\n }\n\n private initTables(): void {\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS vectors (\n id TEXT PRIMARY KEY,\n content TEXT NOT NULL,\n embedding TEXT NOT NULL,\n metadata TEXT\n )\n `);\n }\n\n async upsert(entries: VectorEntry[]): Promise<void> {\n const stmt = this.db.prepare(\n 'INSERT OR REPLACE INTO vectors (id, content, embedding, metadata) VALUES (?, ?, ?, ?)',\n );\n const tx = this.db.transaction((items: VectorEntry[]) => {\n for (const entry of items) {\n stmt.run(\n entry.id,\n entry.content,\n JSON.stringify(entry.embedding),\n entry.metadata ? JSON.stringify(entry.metadata) : null,\n );\n }\n });\n tx(entries);\n }\n\n async search(embedding: number[], topK: number): Promise<VectorResult[]> {\n const rows = this.db\n .prepare('SELECT id, content, embedding, metadata FROM vectors')\n .all() as Array<{\n id: string;\n content: string;\n embedding: string;\n metadata: string | null;\n }>;\n\n const results: VectorResult[] = rows.map((row) => {\n const storedEmbedding = JSON.parse(row.embedding) as number[];\n const score = cosineSimilarity(embedding, storedEmbedding);\n return {\n id: row.id,\n content: row.content,\n score,\n metadata: row.metadata ? JSON.parse(row.metadata) : undefined,\n };\n });\n\n results.sort((a, b) => b.score - a.score);\n return results.slice(0, topK);\n }\n\n async delete(ids: string[]): Promise<void> {\n if (ids.length === 0) return;\n const placeholders = ids.map(() => '?').join(',');\n this.db.prepare(`DELETE FROM vectors WHERE id IN (${placeholders})`).run(...ids);\n }\n\n async close(): Promise<void> {\n this.db.close();\n }\n}\n\n/** Compute cosine similarity between two vectors. */\nfunction cosineSimilarity(a: number[], b: number[]): number {\n let dot = 0;\n let normA = 0;\n let normB = 0;\n for (let i = 0; i < a.length; i++) {\n dot += a[i] * b[i];\n normA += a[i] * a[i];\n normB += b[i] * b[i];\n }\n const denom = Math.sqrt(normA) * Math.sqrt(normB);\n return denom === 0 ? 0 : dot / denom;\n}\n"],"mappings":"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","names":["resolve","sleep","resolve","tool","THINKING_BUDGETS","tool","providerName","model","agent","costAfter","content","toolArgs","toolStart","toolResult","resultContent","tool","summaryMsg","recentTokens","splitIdx","n","parentSignal","resolve","result","decision","import_node_crypto","import_node_events","import_node_crypto","import_node_async_hooks","import_node_fs","import_node_path","resolve","resolve","tool","OTelSpanManager","workflow","result","import_node_path","import_node_fs","fileGlob","cosineSimilarity"]}
|
|
1
|
+
{"version":3,"sources":["../src/telemetry/span-manager.ts","../src/index.ts","../src/tool.ts","../src/providers/types.ts","../src/providers/retry.ts","../src/providers/openai.ts","../src/providers/openai-responses.ts","../src/providers/anthropic.ts","../src/providers/gemini.ts","../src/providers/registry.ts","../src/context.ts","../src/errors.ts","../src/partial-json.ts","../src/event-utils.ts","../src/redaction.ts","../src/config.ts","../src/agent.ts","../src/workflow.ts","../src/runtime.ts","../src/state/memory.ts","../src/state/sqlite.ts","../src/session.ts","../src/stream.ts","../src/types.ts","../src/mcp/client.ts","../src/mcp/manager.ts","../src/memory/manager.ts","../src/telemetry/noop.ts","../src/telemetry/index.ts","../src/module-resolve.ts","../src/cli-internals.ts","../src/state/redis.ts","../src/memory/embedder-openai.ts","../src/memory/vector-memory.ts","../src/memory/vector-sqlite.ts"],"sourcesContent":["import type { SpanHandle, SpanManager, TelemetryConfig } from './types.js';\n\n/** Minimal interface for an OTel span. */\ninterface OTelSpan {\n setAttribute(key: string, value: string | number | boolean): void;\n addEvent(name: string, attributes?: Record<string, string | number | boolean>): void;\n setStatus(status: { code: unknown; message?: string }): void;\n end(): void;\n}\n\n/** Minimal interface for an OTel tracer. */\ninterface OTelTracer {\n startActiveSpan<T>(\n name: string,\n options: { attributes: Record<string, string | number | boolean> },\n fn: (span: OTelSpan) => Promise<T>,\n ): Promise<T>;\n}\n\n/** Minimal interface for an OTel tracer provider. */\ninterface OTelTracerProvider {\n getTracer(name: string): OTelTracer;\n shutdown?(): Promise<void>;\n}\n\n/** Minimal interface for the @opentelemetry/api module. */\ninterface OTelApi {\n SpanStatusCode: { OK: unknown; ERROR: unknown };\n trace: {\n getTracerProvider(): OTelTracerProvider;\n getActiveSpan?(): OTelSpan | undefined;\n };\n}\n\n/**\n * OpenTelemetry-backed SpanManager.\n * Dynamically imports @opentelemetry/api to avoid hard dependency.\n */\nexport class OTelSpanManager implements SpanManager {\n private tracer: OTelTracer;\n private otelApi: OTelApi;\n private tracerProvider: OTelTracerProvider;\n\n private constructor(otelApi: OTelApi, tracer: OTelTracer, tracerProvider: OTelTracerProvider) {\n this.otelApi = otelApi;\n this.tracer = tracer;\n this.tracerProvider = tracerProvider;\n }\n\n static async create(config: TelemetryConfig): Promise<OTelSpanManager> {\n let otelApi: OTelApi;\n try {\n otelApi = (await import('@opentelemetry/api')) as unknown as OTelApi;\n } catch {\n throw new Error(\n '@opentelemetry/api is required for telemetry. Install it with: npm install @opentelemetry/api',\n );\n }\n\n const tracerProvider =\n (config.tracerProvider as OTelTracerProvider | undefined) ??\n otelApi.trace.getTracerProvider();\n const serviceName = config.serviceName ?? 'axl';\n const tracer = tracerProvider.getTracer(serviceName);\n\n return new OTelSpanManager(otelApi, tracer, tracerProvider);\n }\n\n async withSpanAsync<T>(\n name: string,\n attributes: Record<string, string | number | boolean>,\n fn: (span: SpanHandle) => Promise<T>,\n ): Promise<T> {\n const otelApi = this.otelApi;\n\n return this.tracer.startActiveSpan(name, { attributes }, async (otelSpan: OTelSpan) => {\n const handle: SpanHandle = {\n setAttribute(key: string, value: string | number | boolean) {\n otelSpan.setAttribute(key, value);\n },\n addEvent(eventName: string, attrs?: Record<string, string | number | boolean>) {\n otelSpan.addEvent(eventName, attrs);\n },\n setStatus(code: 'ok' | 'error', message?: string) {\n const statusCode =\n code === 'ok' ? otelApi.SpanStatusCode.OK : otelApi.SpanStatusCode.ERROR;\n otelSpan.setStatus({ code: statusCode, message });\n },\n end() {\n otelSpan.end();\n },\n };\n\n try {\n const result = await fn(handle);\n handle.setStatus('ok');\n return result;\n } catch (err) {\n handle.setStatus('error', err instanceof Error ? err.message : String(err));\n throw err;\n } finally {\n handle.end();\n }\n });\n }\n\n addEventToActiveSpan(name: string, attributes?: Record<string, string | number | boolean>): void {\n const activeSpan = this.otelApi.trace.getActiveSpan?.();\n if (activeSpan) {\n activeSpan.addEvent(name, attributes);\n }\n }\n\n async shutdown(): Promise<void> {\n if (this.tracerProvider && typeof this.tracerProvider.shutdown === 'function') {\n await this.tracerProvider.shutdown();\n }\n }\n}\n","// Core API\nexport { tool } from './tool.js';\nexport type { Tool, ToolConfig, ToolHooks, RetryPolicy } from './tool.js';\n\nexport { agent } from './agent.js';\nexport type { Agent, AgentConfig, HandoffDescriptor } from './agent.js';\n\nexport { workflow } from './workflow.js';\nexport type { Workflow, WorkflowConfig, AnyWorkflow } from './workflow.js';\n\n// Runtime\nexport { AxlRuntime } from './runtime.js';\nexport type { CreateContextOptions, ExecuteOptions, EvalExecuteWorkflow } from './runtime.js';\n\n// Module-resolution helpers — internal but exported so the eval CLI and\n// Studio middleware share one implementation of the ESM/CJS interop walk.\n// Not part of the stable public API.\nexport { resolveRuntime, pickDefault, pickExport } from './module-resolve.js';\n\n// CLI internals — internal helpers for tsx loader registration, glob\n// expansion, conditions registration, and config-file detection. Shared\n// between axl-eval and axl-studio so a fix to (e.g.) the tsx loader\n// applies to both atomically. Not part of the stable public API.\nexport {\n CONFIG_CANDIDATES,\n findConfig,\n needsTsxLoader,\n importModule,\n expandGlob,\n registerConditions,\n} from './cli-internals.js';\nexport { defineConfig } from './config.js';\nexport type { AxlConfig } from './config.js';\n\n// Stream — carries `AxlEvent` directly. No `StreamEvent` shim — consumers\n// narrow on `event.type` from the `AxlEvent` union (spec/16 decision 8).\nexport { AxlStream } from './stream.js';\n\n// Event helpers — consumer-facing utilities for accumulators / reducers\n// that need to honor spec invariants (cost-rollup skip, root-level\n// filter, leaf-cost detection). Use these instead of hand-rolling the\n// `event.type !== 'ask_end'` guard at every call site.\nexport {\n eventCostContribution,\n isCostBearingLeaf,\n isRootLevel,\n COST_BEARING_LEAF_TYPES,\n} from './event-utils.js';\n\n// Tolerant JSON parser — used internally for `partial_object` streaming.\n// Exported so consumers building their own progressive-render pipelines\n// can reuse the same truncation recovery + stack-overflow guard rails\n// we ship with the SDK.\nexport { parsePartialJson } from './partial-json.js';\n\n// Session\nexport { Session } from './session.js';\nexport type { SessionOptions } from './session.js';\n\n// Context\nexport { WorkflowContext, zodToJsonSchema, extractJson } from './context.js';\nexport type { WorkflowContextInit } from './context.js';\nexport type {\n Result,\n BudgetResult,\n HumanDecision,\n // Unified event model — replaces the old TraceEvent + StreamEvent split.\n AxlEvent,\n AxlEventType,\n AxlEventBase,\n AxlEventOf,\n AskScoped,\n CallbackMeta,\n // Per-type data shapes — consumers narrowing via `event.type` get\n // statically-typed access to `data`. Kept in the same export block as\n // `AxlEvent` so the discriminated union and its parts move together.\n AgentCallStartData,\n AgentCallEndData,\n AgentCallParams,\n ToolCallData,\n ToolCallStartData,\n ToolApprovalData,\n ToolDeniedData,\n HandoffStartData,\n HandoffReturnData,\n DelegateData,\n VerifyData,\n WorkflowStartData,\n WorkflowEndData,\n MemoryEventData,\n CheckpointEventData,\n AwaitHumanData,\n AwaitHumanResolvedData,\n GuardrailData,\n SchemaCheckData,\n ValidateData,\n AskOptions,\n DelegateOptions,\n RaceOptions,\n VoteOptions,\n VerifyRetry,\n VerifyOptions,\n BudgetOptions,\n SpawnOptions,\n MapOptions,\n AwaitHumanOptions,\n ExecutionInfo,\n GuardrailResult,\n InputGuardrail,\n OutputGuardrail,\n GuardrailBlockHandler,\n GuardrailsConfig,\n ValidateResult,\n OutputValidator,\n HandoffRecord,\n AgentCallInfo,\n} from './types.js';\nexport { AXL_EVENT_TYPES } from './types.js';\nexport { REDACTED, REDACTION_RULES, redactEvent } from './redaction.js';\n\n// Errors\nexport {\n AxlError,\n VerifyError,\n QuorumNotMet,\n NoConsensus,\n TimeoutError,\n MaxTurnsError,\n ToolDenied,\n BudgetExceededError,\n GuardrailError,\n ValidationError,\n} from './errors.js';\n\n// Provider\nexport { OpenAIProvider } from './providers/openai.js';\nexport { OpenAIResponsesProvider } from './providers/openai-responses.js';\nexport { AnthropicProvider } from './providers/anthropic.js';\nexport { GeminiProvider } from './providers/gemini.js';\nexport { ProviderRegistry } from './providers/registry.js';\nexport type {\n Provider,\n ProviderAdapter,\n ChatMessage,\n ToolCallMessage,\n ProviderResponse,\n StreamChunk,\n ChatOptions,\n Effort,\n ToolChoice,\n} from './providers/types.js';\nexport { resolveThinkingOptions, type ResolvedThinkingOptions } from './providers/types.js';\n\n// MCP\nexport { McpManager } from './mcp/manager.js';\nexport type { McpToolDefinition, McpServer, McpToolResult, McpServerConfig } from './mcp/types.js';\n\n// State\nexport type {\n StateStore,\n ExecutionState,\n PendingDecision,\n EvalHistoryEntry,\n} from './state/types.js';\nexport { MemoryStore } from './state/memory.js';\nexport { SQLiteStore } from './state/sqlite.js';\nexport { RedisStore } from './state/redis.js';\n\n// Memory\nexport { MemoryManager } from './memory/manager.js';\nexport type { RememberResult, RecallResult } from './memory/manager.js';\nexport { OpenAIEmbedder } from './memory/embedder-openai.js';\nexport { InMemoryVectorStore } from './memory/vector-memory.js';\nexport { SqliteVectorStore } from './memory/vector-sqlite.js';\nexport type {\n VectorEntry,\n VectorResult,\n VectorStore,\n Embedder,\n EmbedResult,\n EmbedUsage,\n RememberOptions,\n RecallOptions,\n MemoryConfig,\n} from './memory/types.js';\n\n// Telemetry\nexport { NoopSpanManager, createSpanManager } from './telemetry/index.js';\nexport type { TelemetryConfig, SpanHandle, SpanManager } from './telemetry/types.js';\n","import type { z } from 'zod';\nimport type { WorkflowContext } from './context.js';\n\n/** Retry policy for tool handlers */\nexport type RetryPolicy = {\n attempts?: number;\n backoff?: 'none' | 'linear' | 'exponential';\n on?: (error: Error & { status?: number }) => boolean;\n};\n\n/** Lifecycle hooks for tool execution. */\nexport type ToolHooks<TInput = unknown, TOutput = unknown> = {\n /** Transform input before the handler runs. Receives parsed input and workflow context. */\n before?(input: TInput, ctx: WorkflowContext): TInput | Promise<TInput>;\n /** Transform output after the handler runs. Receives handler result and workflow context. */\n after?(output: TOutput, ctx: WorkflowContext): TOutput | Promise<TOutput>;\n};\n\n/** Tool configuration */\nexport type ToolConfig<TInput extends z.ZodType, TOutput = unknown> = {\n name: string;\n description: string;\n input: TInput;\n handler: (input: z.infer<TInput>, ctx: WorkflowContext) => TOutput | Promise<TOutput>;\n retry?: RetryPolicy;\n sensitive?: boolean;\n /** Maximum string length for any string argument. Default: 10000. Set to 0 to disable. */\n maxStringLength?: number;\n /** When true, agent-initiated calls trigger ctx.awaitHuman() before execution. */\n requireApproval?: boolean;\n /** Lifecycle hooks: before/after the handler. */\n hooks?: ToolHooks<z.infer<TInput>, TOutput>;\n};\n\n/** A defined tool instance */\nexport type Tool<TInput extends z.ZodType = z.ZodType, TOutput = unknown> = {\n readonly name: string;\n readonly description: string;\n readonly inputSchema: TInput;\n readonly sensitive: boolean;\n readonly retry: RetryPolicy;\n readonly requireApproval: boolean;\n readonly hooks?: ToolHooks<z.infer<TInput>, TOutput>;\n /** Run the tool directly from workflow code */\n run(ctx: WorkflowContext, input: z.infer<TInput>): Promise<TOutput>;\n /** Execute the handler (internal use — includes retry logic) */\n _execute(input: z.infer<TInput>, ctx?: WorkflowContext): Promise<TOutput>;\n};\n\nconst DEFAULT_MAX_STRING_LENGTH = 10_000;\n\n/**\n * Recursively validate string lengths in parsed tool arguments.\n * Throws if any string exceeds the configured max length.\n */\nfunction validateStringLengths(value: unknown, maxLen: number, path = ''): void {\n if (typeof value === 'string') {\n if (value.length > maxLen) {\n throw new Error(\n `String argument${path ? ` at \"${path}\"` : ''} exceeds maximum length (${value.length} > ${maxLen})`,\n );\n }\n } else if (Array.isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n validateStringLengths(value[i], maxLen, path ? `${path}[${i}]` : `[${i}]`);\n }\n } else if (value !== null && typeof value === 'object') {\n for (const [key, val] of Object.entries(value)) {\n validateStringLengths(val, maxLen, path ? `${path}.${key}` : key);\n }\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction getBackoffMs(attempt: number, strategy: 'none' | 'linear' | 'exponential'): number {\n switch (strategy) {\n case 'none':\n return 0;\n case 'linear':\n return attempt * 1000;\n case 'exponential':\n return Math.pow(2, attempt - 1) * 1000;\n }\n}\n\n/**\n * Define a tool with Zod-validated input, a handler function, and optional retry policy.\n * @param config - Tool configuration: name, description, input schema, handler, retry, and sensitivity options.\n * @returns A Tool instance that can be attached to agents and invoked via `tool.run()` or agent tool calling.\n */\nexport function tool<TInput extends z.ZodType, TOutput = unknown>(\n config: ToolConfig<TInput, TOutput>,\n): Tool<TInput, TOutput> {\n const retryPolicy: RetryPolicy = {\n attempts: config.retry?.attempts ?? 1,\n backoff: config.retry?.backoff ?? 'exponential',\n on: config.retry?.on,\n };\n\n const maxStringLen = config.maxStringLength ?? DEFAULT_MAX_STRING_LENGTH;\n\n const execute = async (input: z.infer<TInput>, ctx?: WorkflowContext): Promise<TOutput> => {\n // Validate input against schema\n const parsed = config.input.parse(input);\n\n // Enforce string length limits\n if (maxStringLen > 0) {\n validateStringLengths(parsed, maxStringLen);\n }\n\n const maxAttempts = retryPolicy.attempts ?? 1;\n\n let lastError: Error | undefined;\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n // ctx is optional on _execute but required on handler. In practice, all runtime\n // call sites (agent tool loop, tool.run) always provide ctx. The undefined case\n // only occurs when _execute is called directly in tests or internal code.\n return await config.handler(parsed, ctx as WorkflowContext);\n } catch (err) {\n lastError = err instanceof Error ? err : new Error(String(err));\n\n if (attempt === maxAttempts) break;\n\n // Check retry predicate\n if (retryPolicy.on && !retryPolicy.on(lastError as Error & { status?: number })) {\n break;\n }\n\n // Apply backoff\n const backoffMs = getBackoffMs(attempt, retryPolicy.backoff ?? 'exponential');\n if (backoffMs > 0) {\n await sleep(backoffMs);\n }\n }\n }\n\n throw lastError;\n };\n\n return {\n name: config.name,\n description: config.description,\n inputSchema: config.input,\n sensitive: config.sensitive ?? false,\n retry: retryPolicy,\n requireApproval: config.requireApproval ?? false,\n hooks: config.hooks,\n\n async run(ctx: WorkflowContext, input: z.infer<TInput>): Promise<TOutput> {\n const startTime = Date.now();\n try {\n // Apply before hook (no approval gate for direct workflow calls)\n let processedInput = input;\n if (config.hooks?.before) {\n processedInput = await config.hooks.before(processedInput, ctx);\n }\n\n let result = await execute(processedInput, ctx);\n\n // Apply after hook\n if (config.hooks?.after) {\n result = await config.hooks.after(result, ctx);\n }\n\n ctx.log('tool_call_complete', {\n tool: config.name,\n duration: Date.now() - startTime,\n });\n return result;\n } catch (err) {\n ctx.log('tool_call_error', {\n tool: config.name,\n error: err instanceof Error ? err.message : String(err),\n duration: Date.now() - startTime,\n });\n throw err;\n }\n },\n\n _execute: execute,\n };\n}\n","import type { ChatMessage, ProviderResponse, ToolCallMessage } from '../types.js';\n\n// Re-export for convenience\nexport type { ChatMessage, ProviderResponse, ToolCallMessage };\n\n/**\n * Tool definition in OpenAI-compatible format.\n * All providers normalize to this format internally.\n */\nexport type ToolDefinition = {\n type: 'function';\n function: {\n name: string;\n description: string;\n parameters: unknown; // JSON Schema\n strict?: boolean;\n };\n};\n\n/**\n * Unified effort level controlling how thoroughly the model responds.\n *\n * - `'none'` — Disable thinking/reasoning. On Gemini 3.x, maps to the model's\n * minimum thinking level (3.1 Pro: 'low', others: 'minimal'). On other providers,\n * fully disables reasoning.\n * - `'low'` through `'max'` — Increasing levels of reasoning depth and token spend.\n *\n * Provider mapping:\n * - Anthropic 4.6: adaptive thinking + output_config.effort\n * - Anthropic Opus 4.5: output_config.effort (no adaptive)\n * - Anthropic older: thinking.budget_tokens fallback\n * - OpenAI o-series: reasoning_effort\n * - OpenAI GPT-5.x: reasoning.effort / reasoning_effort\n * - Gemini 3.x: thinkingLevel (`'none'` → model min: `'minimal'` or `'low'` for 3.1 Pro)\n * - Gemini 2.x: thinkingBudget (`'none'` → 0; some models have minimums)\n */\nexport type Effort = 'none' | 'low' | 'medium' | 'high' | 'max';\n\n/** Tool choice strategy for LLM calls. */\nexport type ToolChoice =\n | 'auto'\n | 'none'\n | 'required'\n | { type: 'function'; function: { name: string } };\n\n/**\n * Options passed to provider chat/stream calls.\n */\nexport type ChatOptions = {\n model: string;\n temperature?: number;\n tools?: ToolDefinition[];\n maxTokens?: number;\n responseFormat?: ResponseFormat;\n stop?: string[];\n signal?: AbortSignal;\n /** How hard should the model try? Primary param for cost/quality tradeoff.\n * 'none' disables thinking/reasoning (Gemini 3.x: maps to minimal).\n * Omit to use provider defaults. */\n effort?: Effort;\n /** Precise thinking token budget (advanced). When set alongside `effort`, overrides the\n * thinking/reasoning allocation. On Anthropic 4.6, `effort` still controls output quality\n * independently. On all other providers, `thinkingBudget` fully overrides `effort` for\n * reasoning behavior. Set to 0 to disable thinking while keeping effort for output control\n * (Anthropic-specific optimization; on other providers, simply disables reasoning). */\n thinkingBudget?: number;\n /** Show reasoning summaries in responses (thinking_content / thinking_delta).\n * Supported on OpenAI Responses API and Gemini. No-op on Anthropic. */\n includeThoughts?: boolean;\n toolChoice?: ToolChoice;\n /** Provider-specific options merged LAST into the raw API request body.\n * Can override any computed field including model and messages — use with care.\n * NOT portable across providers — use effort/thinkingBudget/includeThoughts for cross-provider behavior. */\n providerOptions?: Record<string, unknown>;\n};\n\n/**\n * Response format for structured output (JSON mode).\n */\nexport type ResponseFormat =\n | { type: 'text' }\n | { type: 'json_object' }\n | { type: 'json_schema'; json_schema: { name: string; strict?: boolean; schema: unknown } };\n\n/**\n * Chunks emitted during streaming.\n */\nexport type StreamChunk =\n | { type: 'text_delta'; content: string }\n | { type: 'thinking_delta'; content: string }\n | { type: 'tool_call_delta'; id: string; name?: string; arguments?: string }\n | {\n type: 'done';\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n reasoning_tokens?: number;\n cached_tokens?: number;\n };\n /** Estimated cost in USD for this call, computed the same way as ProviderResponse.cost. */\n cost?: number;\n /** Provider-specific opaque metadata (e.g. raw Gemini parts with thought signatures). */\n providerMetadata?: Record<string, unknown>;\n };\n\n/**\n * Core provider interface. Every LLM adapter must implement this.\n */\nexport interface Provider {\n /** Human-readable name for the provider (e.g. \"openai\", \"anthropic\") */\n readonly name?: string;\n\n /**\n * Send a chat completion request and return the full response.\n */\n chat(messages: ChatMessage[], options: ChatOptions): Promise<ProviderResponse>;\n\n /**\n * Stream a chat completion, yielding chunks as they arrive.\n */\n stream(messages: ChatMessage[], options: ChatOptions): AsyncGenerator<StreamChunk>;\n}\n\n/**\n * Alias for Provider. Used for backward compatibility with index.ts exports.\n */\nexport type ProviderAdapter = Provider;\n\n/** Normalized thinking options computed once, used by all providers. */\nexport type ResolvedThinkingOptions = {\n /** Raw effort value from user. */\n effort: Effort | undefined;\n /** Raw thinking budget from user. */\n thinkingBudget: number | undefined;\n /** Whether to include thought summaries in responses. */\n includeThoughts: boolean;\n /** True when thinking/reasoning should be disabled (effort: 'none' or thinkingBudget: 0). */\n thinkingDisabled: boolean;\n /** Effort level with 'none' stripped (undefined when effort is 'none' or unset). */\n activeEffort: Exclude<Effort, 'none'> | undefined;\n /** True when an explicit positive budget overrides effort-based allocation. */\n hasBudgetOverride: boolean;\n};\n\n/** Resolve effort/thinkingBudget/includeThoughts into normalized form.\n * Validates inputs and computes derived flags used by all provider adapters. */\nexport function resolveThinkingOptions(\n options: Pick<ChatOptions, 'effort' | 'thinkingBudget' | 'includeThoughts'>,\n): ResolvedThinkingOptions {\n if (options.thinkingBudget !== undefined && options.thinkingBudget < 0) {\n throw new Error(`thinkingBudget must be non-negative, got ${options.thinkingBudget}`);\n }\n const effort = options.effort;\n const thinkingBudget = options.thinkingBudget;\n const hasBudgetOverride = thinkingBudget !== undefined && thinkingBudget > 0;\n return {\n effort,\n thinkingBudget,\n includeThoughts: options.includeThoughts ?? false,\n // Budget override wins: effort: 'none' + thinkingBudget: 5000 → thinking enabled\n thinkingDisabled: (effort === 'none' || thinkingBudget === 0) && !hasBudgetOverride,\n activeEffort: effort && effort !== 'none' ? effort : undefined,\n hasBudgetOverride,\n };\n}\n","/**\n * Retry wrapper for provider fetch calls.\n * Retries on rate-limit (429) and transient server errors (503, 529)\n * with exponential backoff, jitter, and Retry-After header support.\n */\n\nconst RETRYABLE_STATUS_CODES = new Set([429, 503, 529]);\nconst MAX_RETRIES = 2; // 3 total attempts\nconst BASE_DELAY_MS = 1000;\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve) => {\n if (signal?.aborted) {\n resolve();\n return;\n }\n const timer = setTimeout(resolve, ms);\n signal?.addEventListener(\n 'abort',\n () => {\n clearTimeout(timer);\n resolve();\n },\n { once: true },\n );\n });\n}\n\n/**\n * Wrapper around fetch that retries on rate-limit and transient server errors\n * (429, 503, 529) with exponential backoff and jitter.\n * Returns the response as-is for non-retryable errors or after exhausting retries.\n */\nexport async function fetchWithRetry(\n input: string | URL,\n init?: RequestInit,\n maxRetries = MAX_RETRIES,\n): Promise<Response> {\n for (let attempt = 0; ; attempt++) {\n const res = await fetch(input, init);\n\n // Return immediately if OK, non-retryable, or out of retries\n if (res.ok || !RETRYABLE_STATUS_CODES.has(res.status) || attempt >= maxRetries) {\n return res;\n }\n\n // Don't retry if aborted\n if (init?.signal?.aborted) {\n return res;\n }\n\n // Calculate delay: respect Retry-After header, else exponential backoff\n const retryAfter = res.headers.get('retry-after');\n let delay: number;\n if (retryAfter && !isNaN(Number(retryAfter))) {\n delay = Number(retryAfter) * 1000;\n } else {\n delay = BASE_DELAY_MS * 2 ** attempt;\n }\n // Jitter: +/-25%\n delay *= 0.75 + Math.random() * 0.5;\n\n await sleep(delay, init?.signal ?? undefined);\n }\n}\n","import type {\n Provider,\n ChatOptions,\n ChatMessage,\n ProviderResponse,\n StreamChunk,\n Effort,\n} from './types.js';\nimport { resolveThinkingOptions } from './types.js';\nimport { fetchWithRetry } from './retry.js';\n\n// ---------------------------------------------------------------------------\n// Approximate per-token pricing (USD) for common OpenAI models.\n// Format: [promptCostPerToken, completionCostPerToken, cacheMultiplier]\n// cacheMultiplier is the fraction of input rate charged for cached tokens.\n// These are approximations for budget estimation, not billing.\n// Actual pricing may differ; check OpenAI's pricing page for current rates.\n// ---------------------------------------------------------------------------\n\nexport const OPENAI_PRICING: Record<string, [number, number, number]> = {\n // gpt-4o era — cache reads at 50% of input rate\n 'gpt-4o': [2.5e-6, 10e-6, 0.5],\n 'gpt-4o-mini': [0.15e-6, 0.6e-6, 0.5],\n 'gpt-4-turbo': [10e-6, 30e-6, 0.5],\n 'gpt-4': [30e-6, 60e-6, 0.5],\n 'gpt-3.5-turbo': [0.5e-6, 1.5e-6, 0.5],\n o1: [15e-6, 60e-6, 0.5],\n 'o1-mini': [3e-6, 12e-6, 0.5],\n 'o1-pro': [150e-6, 600e-6, 0.5],\n // gpt-4.1 / o3 / o4 era — cache reads at 25% of input rate\n 'gpt-4.1': [2e-6, 8e-6, 0.25],\n 'gpt-4.1-mini': [0.4e-6, 1.6e-6, 0.25],\n 'gpt-4.1-nano': [0.1e-6, 0.4e-6, 0.25],\n o3: [10e-6, 40e-6, 0.25],\n 'o3-mini': [1.1e-6, 4.4e-6, 0.25],\n 'o3-pro': [20e-6, 80e-6, 0.25],\n 'o4-mini': [1.1e-6, 4.4e-6, 0.25],\n // gpt-5 era — cache reads at 10% of input rate\n 'gpt-5': [1.25e-6, 10e-6, 0.1],\n 'gpt-5-mini': [0.25e-6, 2e-6, 0.1],\n 'gpt-5-nano': [0.05e-6, 0.4e-6, 0.1],\n 'gpt-5.1': [1.25e-6, 10e-6, 0.1],\n 'gpt-5.2': [1.75e-6, 14e-6, 0.1],\n 'gpt-5.3': [1.75e-6, 14e-6, 0.1],\n 'gpt-5.4': [2.5e-6, 15e-6, 0.1],\n 'gpt-5.4-pro': [30e-6, 180e-6, 0.1],\n};\n\n// Pre-sorted keys for prefix matching (longest first so \"gpt-5-mini\" matches before \"gpt-5\")\nconst PRICING_KEYS_BY_LENGTH = Object.keys(OPENAI_PRICING).sort((a, b) => b.length - a.length);\n\nexport function estimateOpenAICost(\n model: string,\n promptTokens: number,\n completionTokens: number,\n cachedTokens?: number,\n): number {\n // Try exact match first, then longest-prefix match for versioned models (e.g. gpt-4o-2024-05-13)\n let pricing = OPENAI_PRICING[model];\n if (!pricing) {\n for (const key of PRICING_KEYS_BY_LENGTH) {\n if (model.startsWith(key)) {\n pricing = OPENAI_PRICING[key];\n break;\n }\n }\n }\n if (!pricing) return 0;\n\n const [inputRate, outputRate, cacheMultiplier] = pricing;\n const cached = cachedTokens ?? 0;\n const inputCost = (promptTokens - cached) * inputRate + cached * inputRate * cacheMultiplier;\n return inputCost + completionTokens * outputRate;\n}\n\n/** Returns true for o-series models (o1, o3, o4-mini) that always reason. */\nexport function isOSeriesModel(model: string): boolean {\n return /^(o1|o3|o4-mini)/.test(model);\n}\n\n/** Returns true for models that accept reasoning_effort. */\nexport function supportsReasoningEffort(model: string): boolean {\n return isOSeriesModel(model) || /^gpt-5/.test(model);\n}\n\nexport type ReasoningEffort = 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh';\n\n/** Returns true for models that support reasoning_effort: 'none' (gpt-5.1+). */\nexport function supportsReasoningNone(model: string): boolean {\n return /^gpt-5\\.[1-9]/.test(model);\n}\n\n/**\n * Returns true for models that support reasoning_effort: 'xhigh'.\n * Per OpenAI docs: \"xhigh is supported for all models after gpt-5.1-codex-max.\"\n * This means gpt-5.2+ (gpt-5.1 itself does NOT support xhigh).\n */\nexport function supportsXhigh(model: string): boolean {\n // gpt-5.2+ — models after gpt-5.1-codex-max\n return /^gpt-5\\.([2-9]|\\d{2,})/.test(model);\n}\n\n/**\n * Clamp reasoning_effort to model-supported range.\n *\n * Model constraints (from OpenAI API reference):\n * - gpt-5-pro: only supports 'high'\n * - gpt-5.1+: supports 'none', 'low', 'medium', 'high'\n * - Pre-gpt-5.1 (o-series, gpt-5, gpt-5-mini, gpt-5-nano): no 'none', default 'medium'\n * - xhigh: only models after gpt-5.1-codex-max (gpt-5.2+)\n */\nexport function clampReasoningEffort(model: string, effort: ReasoningEffort): ReasoningEffort {\n // gpt-5-pro only supports 'high'\n if (model.startsWith('gpt-5-pro')) return 'high';\n\n // 'none' only supported on gpt-5.1+; clamp to 'minimal' (closest to 'none')\n if (effort === 'none' && !supportsReasoningNone(model)) return 'minimal';\n\n // 'xhigh' only supported on gpt-5.2+\n if (effort === 'xhigh' && !supportsXhigh(model)) return 'high';\n\n return effort;\n}\n\n/** Map Effort to OpenAI reasoning_effort wire value. */\nexport function effortToReasoningEffort(effort: Exclude<Effort, 'none'>): ReasoningEffort {\n return effort === 'max' ? 'xhigh' : effort;\n}\n\n/** Map budgetTokens to nearest OpenAI reasoning_effort. */\nexport function budgetToReasoningEffort(budget: number): ReasoningEffort {\n if (budget <= 1024) return 'low';\n if (budget <= 8192) return 'medium';\n return 'high';\n}\n\n/**\n * OpenAI-compatible provider using raw fetch (no SDK dependency).\n *\n * Supports:\n * - Chat completions\n * - Tool calling\n * - Streaming via SSE\n * - Structured output via response_format (JSON mode / JSON schema)\n * - Reasoning models (o1/o3/o4-mini) with developer role and reasoning_effort\n */\nexport class OpenAIProvider implements Provider {\n readonly name = 'openai';\n private baseUrl: string;\n private apiKey: string;\n\n constructor(options: { apiKey?: string; baseUrl?: string } = {}) {\n this.apiKey = options.apiKey ?? process.env.OPENAI_API_KEY ?? '';\n this.baseUrl = (\n options.baseUrl ??\n process.env.OPENAI_BASE_URL ??\n 'https://api.openai.com/v1'\n ).replace(/\\/$/, '');\n\n if (!this.apiKey) {\n throw new Error('OpenAI API key is required. Set OPENAI_API_KEY or pass apiKey in options.');\n }\n }\n\n // ---------------------------------------------------------------------------\n // chat - non-streaming completion\n // ---------------------------------------------------------------------------\n\n async chat(messages: ChatMessage[], options: ChatOptions): Promise<ProviderResponse> {\n const body = this.buildRequestBody(messages, options, false);\n\n const res = await fetchWithRetry(`${this.baseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(body),\n signal: options.signal,\n });\n\n if (!res.ok) {\n const errorBody = await res.text();\n const message = this.extractErrorMessage(errorBody, res.status);\n throw new Error(message);\n }\n\n const json = (await res.json()) as OpenAIChatResponse;\n const choice = json.choices[0];\n\n const usage = json.usage\n ? {\n prompt_tokens: json.usage.prompt_tokens,\n completion_tokens: json.usage.completion_tokens,\n total_tokens: json.usage.total_tokens,\n reasoning_tokens: json.usage.completion_tokens_details?.reasoning_tokens,\n cached_tokens: json.usage.prompt_tokens_details?.cached_tokens,\n }\n : undefined;\n\n const cost = usage\n ? estimateOpenAICost(\n options.model,\n usage.prompt_tokens,\n usage.completion_tokens,\n usage.cached_tokens,\n )\n : undefined;\n\n return {\n content: choice.message.content ?? '',\n tool_calls: choice.message.tool_calls?.map((tc) => ({\n id: tc.id,\n type: 'function' as const,\n function: {\n name: tc.function.name,\n arguments: tc.function.arguments,\n },\n })),\n usage,\n cost,\n };\n }\n\n // ---------------------------------------------------------------------------\n // stream - SSE streaming completion\n // ---------------------------------------------------------------------------\n\n async *stream(messages: ChatMessage[], options: ChatOptions): AsyncGenerator<StreamChunk> {\n const body = this.buildRequestBody(messages, options, true);\n\n const res = await fetchWithRetry(`${this.baseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(body),\n signal: options.signal,\n });\n\n if (!res.ok) {\n const errorBody = await res.text();\n const message = this.extractErrorMessage(errorBody, res.status);\n throw new Error(message);\n }\n\n if (!res.body) {\n throw new Error('OpenAI stream response has no body');\n }\n\n yield* this.parseSSEStream(res.body, options.model);\n }\n\n // ---------------------------------------------------------------------------\n // Internal helpers\n // ---------------------------------------------------------------------------\n\n private buildRequestBody(\n messages: ChatMessage[],\n options: ChatOptions,\n stream: boolean,\n ): Record<string, unknown> {\n const oSeries = isOSeriesModel(options.model);\n const reasoningCapable = supportsReasoningEffort(options.model);\n const { thinkingBudget, thinkingDisabled, activeEffort, hasBudgetOverride } =\n resolveThinkingOptions(options);\n\n // Compute effective reasoning effort for OpenAI wire format\n let wireEffort: ReasoningEffort | undefined;\n if (reasoningCapable) {\n if (hasBudgetOverride) {\n // Explicit budget always takes precedence (consistent with Anthropic/Gemini)\n wireEffort = clampReasoningEffort(options.model, budgetToReasoningEffort(thinkingBudget!));\n } else if (!thinkingDisabled && activeEffort) {\n wireEffort = clampReasoningEffort(options.model, effortToReasoningEffort(activeEffort));\n } else if (thinkingDisabled) {\n // Disable reasoning: covers both effort='none' and thinkingBudget=0\n wireEffort = clampReasoningEffort(options.model, 'none');\n }\n }\n\n // Temperature: always strip for o-series; for GPT-5.x, strip only when reasoning active\n const stripTemp = oSeries || (reasoningCapable && wireEffort !== undefined);\n\n const body: Record<string, unknown> = {\n model: options.model,\n messages: messages.map((m) => this.formatMessage(m, oSeries)),\n stream,\n };\n\n if (options.temperature !== undefined && !stripTemp) {\n body.temperature = options.temperature;\n }\n\n // Use max_completion_tokens instead of deprecated max_tokens\n if (options.maxTokens !== undefined) {\n body.max_completion_tokens = options.maxTokens;\n }\n\n if (options.stop) body.stop = options.stop;\n\n if (options.tools && options.tools.length > 0) {\n body.tools = options.tools;\n // o-series models don't support parallel_tool_calls; GPT-5.x and others do\n if (!oSeries) {\n body.parallel_tool_calls = true;\n }\n }\n\n if (options.toolChoice !== undefined) {\n body.tool_choice = options.toolChoice;\n }\n\n if (options.responseFormat) {\n body.response_format = options.responseFormat;\n }\n\n if (wireEffort) body.reasoning_effort = wireEffort;\n\n if (stream) {\n body.stream_options = { include_usage: true };\n }\n\n if (options.providerOptions) {\n Object.assign(body, options.providerOptions);\n }\n\n return body;\n }\n\n /** Extract a human-readable message from an API error response body. */\n private extractErrorMessage(body: string, status: number): string {\n try {\n const json = JSON.parse(body) as { error?: { message?: string; type?: string } };\n if (json.error?.message) {\n return `OpenAI API error (${status}): ${json.error.message}`;\n }\n } catch {\n // Not JSON, use raw body\n }\n return `OpenAI API error (${status}): ${body}`;\n }\n\n private formatMessage(msg: ChatMessage, oSeries: boolean): Record<string, unknown> {\n const out: Record<string, unknown> = {\n role: msg.role === 'system' && oSeries ? 'developer' : msg.role,\n content: msg.content,\n };\n if (msg.name) out.name = msg.name;\n if (msg.tool_calls) out.tool_calls = msg.tool_calls;\n if (msg.tool_call_id) out.tool_call_id = msg.tool_call_id;\n return out;\n }\n\n private async *parseSSEStream(\n body: ReadableStream<Uint8Array>,\n model: string,\n ): AsyncGenerator<StreamChunk> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n let usageData:\n | {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n reasoning_tokens?: number;\n cached_tokens?: number;\n }\n | undefined;\n\n // Map tool call index -> id, so we can associate streamed deltas that\n // arrive before the id field with the correct tool call once the id appears.\n const indexToId = new Map<number, string>();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n // Keep the last potentially-incomplete line in the buffer\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(':')) continue;\n\n if (trimmed === 'data: [DONE]') {\n yield {\n type: 'done',\n usage: usageData,\n cost: usageData\n ? estimateOpenAICost(\n model,\n usageData.prompt_tokens,\n usageData.completion_tokens,\n usageData.cached_tokens,\n )\n : undefined,\n };\n return;\n }\n\n if (trimmed.startsWith('data: ')) {\n const jsonStr = trimmed.slice(6);\n let parsed: OpenAIStreamChunk;\n try {\n parsed = JSON.parse(jsonStr) as OpenAIStreamChunk;\n } catch {\n continue; // Skip malformed JSON\n }\n\n // Capture usage from the final chunk if present\n if (parsed.usage) {\n usageData = {\n prompt_tokens: parsed.usage.prompt_tokens,\n completion_tokens: parsed.usage.completion_tokens,\n total_tokens: parsed.usage.total_tokens,\n reasoning_tokens: parsed.usage.completion_tokens_details?.reasoning_tokens,\n cached_tokens: parsed.usage.prompt_tokens_details?.cached_tokens,\n };\n continue;\n }\n\n const delta = parsed.choices?.[0]?.delta;\n if (!delta) continue;\n\n // Text content\n if (delta.content) {\n yield { type: 'text_delta', content: delta.content };\n }\n\n // Tool call deltas\n if (delta.tool_calls) {\n for (const tc of delta.tool_calls) {\n // Track id by index so subsequent deltas without an id\n // map to the correct tool call\n if (tc.id) {\n indexToId.set(tc.index, tc.id);\n }\n const id = indexToId.get(tc.index) ?? `__pending_${tc.index}`;\n yield {\n type: 'tool_call_delta',\n id,\n name: tc.function?.name,\n arguments: tc.function?.arguments,\n };\n }\n }\n }\n }\n }\n\n // If we exit the loop without a [DONE], still emit done with whatever usage we have\n yield {\n type: 'done',\n usage: usageData,\n cost: usageData\n ? estimateOpenAICost(\n model,\n usageData.prompt_tokens,\n usageData.completion_tokens,\n usageData.cached_tokens,\n )\n : undefined,\n };\n } finally {\n reader.releaseLock();\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// OpenAI API response types (internal)\n// ---------------------------------------------------------------------------\n\ntype OpenAIChatResponse = {\n choices: Array<{\n message: {\n content: string | null;\n tool_calls?: Array<{\n id: string;\n type: 'function';\n function: { name: string; arguments: string };\n }>;\n };\n finish_reason: string;\n }>;\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n completion_tokens_details?: {\n reasoning_tokens?: number;\n };\n prompt_tokens_details?: {\n cached_tokens?: number;\n };\n };\n};\n\ntype OpenAIStreamChunk = {\n choices?: Array<{\n delta: {\n content?: string;\n tool_calls?: Array<{\n index: number;\n id?: string;\n function?: { name?: string; arguments?: string };\n }>;\n };\n finish_reason: string | null;\n }>;\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n completion_tokens_details?: {\n reasoning_tokens?: number;\n };\n prompt_tokens_details?: {\n cached_tokens?: number;\n };\n };\n};\n","import type { Provider, ChatOptions, ChatMessage, ProviderResponse, StreamChunk } from './types.js';\nimport {\n estimateOpenAICost,\n isOSeriesModel,\n supportsReasoningEffort,\n effortToReasoningEffort,\n budgetToReasoningEffort,\n clampReasoningEffort,\n} from './openai.js';\nimport type { ReasoningEffort } from './openai.js';\nimport { resolveThinkingOptions } from './types.js';\nimport { fetchWithRetry } from './retry.js';\n\n/**\n * OpenAI Responses API provider using raw fetch (no SDK dependency).\n *\n * Maps the standard Provider interface to OpenAI's Responses API (`POST /v1/responses`).\n * The Responses API is OpenAI's recommended path forward with better caching,\n * built-in tools, and native reasoning support.\n */\nexport class OpenAIResponsesProvider implements Provider {\n readonly name = 'openai-responses';\n private baseUrl: string;\n private apiKey: string;\n\n constructor(options: { apiKey?: string; baseUrl?: string } = {}) {\n this.apiKey = options.apiKey ?? process.env.OPENAI_API_KEY ?? '';\n this.baseUrl = (\n options.baseUrl ??\n process.env.OPENAI_BASE_URL ??\n 'https://api.openai.com/v1'\n ).replace(/\\/$/, '');\n\n if (!this.apiKey) {\n throw new Error('OpenAI API key is required. Set OPENAI_API_KEY or pass apiKey in options.');\n }\n }\n\n // ---------------------------------------------------------------------------\n // chat - non-streaming\n // ---------------------------------------------------------------------------\n\n async chat(messages: ChatMessage[], options: ChatOptions): Promise<ProviderResponse> {\n const body = this.buildRequestBody(messages, options, false);\n\n const res = await fetchWithRetry(`${this.baseUrl}/responses`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(body),\n signal: options.signal,\n });\n\n if (!res.ok) {\n const errorBody = await res.text();\n const message = this.extractErrorMessage(errorBody, res.status);\n throw new Error(message);\n }\n\n const json = (await res.json()) as ResponsesAPIResponse;\n return this.parseResponse(json, options.model);\n }\n\n // ---------------------------------------------------------------------------\n // stream - SSE streaming\n // ---------------------------------------------------------------------------\n\n async *stream(messages: ChatMessage[], options: ChatOptions): AsyncGenerator<StreamChunk> {\n const body = this.buildRequestBody(messages, options, true);\n\n const res = await fetchWithRetry(`${this.baseUrl}/responses`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(body),\n signal: options.signal,\n });\n\n if (!res.ok) {\n const errorBody = await res.text();\n const message = this.extractErrorMessage(errorBody, res.status);\n throw new Error(message);\n }\n\n if (!res.body) {\n throw new Error('OpenAI Responses stream has no body');\n }\n\n yield* this.parseSSEStream(res.body, options.model);\n }\n\n // ---------------------------------------------------------------------------\n // Internal: build request body\n // ---------------------------------------------------------------------------\n\n private buildRequestBody(\n messages: ChatMessage[],\n options: ChatOptions,\n stream: boolean,\n ): Record<string, unknown> {\n const oSeries = isOSeriesModel(options.model);\n const reasoningCapable = supportsReasoningEffort(options.model);\n const { thinkingBudget, includeThoughts, thinkingDisabled, activeEffort, hasBudgetOverride } =\n resolveThinkingOptions(options);\n\n // Compute effective reasoning effort for wire format\n let wireEffort: ReasoningEffort | undefined;\n if (reasoningCapable) {\n if (hasBudgetOverride) {\n // Explicit budget always takes precedence (consistent with Anthropic/Gemini)\n wireEffort = clampReasoningEffort(options.model, budgetToReasoningEffort(thinkingBudget!));\n } else if (!thinkingDisabled && activeEffort) {\n wireEffort = clampReasoningEffort(options.model, effortToReasoningEffort(activeEffort));\n } else if (thinkingDisabled) {\n // Disable reasoning: covers both effort='none' and thinkingBudget=0\n wireEffort = clampReasoningEffort(options.model, 'none');\n }\n }\n\n // Temperature: always strip for o-series; for GPT-5.x, strip only when reasoning active\n const stripTemp = oSeries || (reasoningCapable && wireEffort !== undefined);\n\n // Extract system messages → instructions\n const systemMessages = messages.filter((m) => m.role === 'system');\n const nonSystemMessages = messages.filter((m) => m.role !== 'system');\n\n const body: Record<string, unknown> = {\n model: options.model,\n input: this.buildInput(nonSystemMessages),\n store: false,\n stream,\n };\n\n if (systemMessages.length > 0) {\n body.instructions = systemMessages.map((m) => m.content).join('\\n');\n }\n\n if (options.maxTokens !== undefined) {\n body.max_output_tokens = options.maxTokens;\n }\n\n if (options.temperature !== undefined && !stripTemp) {\n body.temperature = options.temperature;\n }\n\n if (options.tools && options.tools.length > 0) {\n body.tools = options.tools.map((t) => ({\n type: 'function' as const,\n name: t.function.name,\n description: t.function.description,\n parameters: t.function.parameters,\n ...(t.function.strict !== undefined ? { strict: t.function.strict } : {}),\n }));\n }\n\n if (options.toolChoice !== undefined) {\n if (typeof options.toolChoice === 'object' && 'function' in options.toolChoice) {\n body.tool_choice = { type: 'function', name: options.toolChoice.function.name };\n } else {\n body.tool_choice = options.toolChoice;\n }\n }\n\n // Build reasoning config for models that support it\n if (reasoningCapable && (wireEffort !== undefined || includeThoughts)) {\n const reasoning: Record<string, unknown> = {};\n if (wireEffort !== undefined) reasoning.effort = wireEffort;\n if (includeThoughts) reasoning.summary = 'detailed';\n if (Object.keys(reasoning).length > 0) body.reasoning = reasoning;\n }\n\n // Request encrypted reasoning content for round-tripping\n if (reasoningCapable) {\n body.include = ['reasoning.encrypted_content'];\n }\n\n if (options.responseFormat) {\n body.text = { format: this.mapResponseFormat(options.responseFormat) };\n }\n\n if (options.providerOptions) {\n Object.assign(body, options.providerOptions);\n }\n\n return body;\n }\n\n // ---------------------------------------------------------------------------\n // Internal: message → input mapping\n // ---------------------------------------------------------------------------\n\n private buildInput(messages: ChatMessage[]): ResponsesInputItem[] {\n const input: ResponsesInputItem[] = [];\n\n for (const msg of messages) {\n if (msg.role === 'tool') {\n input.push({\n type: 'function_call_output',\n call_id: msg.tool_call_id ?? '',\n output: msg.content,\n });\n } else if (msg.role === 'assistant' && msg.tool_calls && msg.tool_calls.length > 0) {\n // Inject reasoning items from providerMetadata if present (round-trip)\n const reasoningItems = msg.providerMetadata?.openaiReasoningItems as\n | ResponsesInputItem[]\n | undefined;\n if (reasoningItems) {\n for (const item of reasoningItems) {\n input.push(item);\n }\n }\n\n if (msg.content) {\n input.push({ type: 'message', role: 'assistant', content: msg.content });\n }\n for (const tc of msg.tool_calls) {\n input.push({\n type: 'function_call',\n call_id: tc.id,\n name: tc.function.name,\n arguments: tc.function.arguments,\n });\n }\n } else if (msg.role === 'user' || msg.role === 'assistant') {\n // Inject reasoning items for assistant messages without tool calls too\n if (msg.role === 'assistant' && msg.providerMetadata?.openaiReasoningItems) {\n const reasoningItems = msg.providerMetadata.openaiReasoningItems as ResponsesInputItem[];\n for (const item of reasoningItems) {\n input.push(item);\n }\n }\n\n input.push({\n type: 'message',\n role: msg.role,\n content: msg.content,\n });\n }\n }\n\n return input;\n }\n\n // ---------------------------------------------------------------------------\n // Internal: map responseFormat to Responses API text.format\n // ---------------------------------------------------------------------------\n\n /**\n * The Responses API uses `text.format` instead of `response_format`.\n * For `json_schema`, the schema fields are flattened into the format object\n * rather than nested under a `json_schema` key.\n *\n * Chat Completions: `{ type: \"json_schema\", json_schema: { name, strict, schema } }`\n * Responses API: `{ type: \"json_schema\", name, strict, schema }`\n */\n private mapResponseFormat(\n format: NonNullable<ChatOptions['responseFormat']>,\n ): Record<string, unknown> {\n if (format.type === 'json_schema' && 'json_schema' in format) {\n const { json_schema, ...rest } = format;\n return { ...rest, ...json_schema };\n }\n return format;\n }\n\n // ---------------------------------------------------------------------------\n // Internal: parse non-streaming response\n // ---------------------------------------------------------------------------\n\n private parseResponse(json: ResponsesAPIResponse, model: string): ProviderResponse {\n let content = '';\n let thinkingContent = '';\n const toolCalls: ProviderResponse['tool_calls'] = [];\n const reasoningItems: unknown[] = [];\n\n for (const item of json.output) {\n if (item.type === 'message') {\n for (const part of item.content ?? []) {\n if (part.type === 'output_text') {\n content += part.text;\n }\n }\n } else if (item.type === 'function_call') {\n toolCalls.push({\n id: item.call_id,\n type: 'function',\n function: {\n name: item.name,\n arguments: item.arguments,\n },\n });\n } else if (item.type === 'reasoning') {\n // Capture reasoning items for round-tripping via providerMetadata\n reasoningItems.push(item);\n // Extract summary text if present\n if (item.summary) {\n for (const s of item.summary) {\n if (s.type === 'summary_text' && s.text) {\n thinkingContent += s.text;\n }\n }\n }\n }\n }\n\n const usage = json.usage\n ? {\n prompt_tokens: json.usage.input_tokens,\n completion_tokens: json.usage.output_tokens,\n total_tokens: json.usage.total_tokens,\n reasoning_tokens: json.usage.output_tokens_details?.reasoning_tokens,\n cached_tokens: json.usage.input_tokens_details?.cached_tokens,\n }\n : undefined;\n\n const cost = usage\n ? estimateOpenAICost(model, usage.prompt_tokens, usage.completion_tokens, usage.cached_tokens)\n : undefined;\n\n const providerMetadata =\n reasoningItems.length > 0 ? { openaiReasoningItems: reasoningItems } : undefined;\n\n return {\n content,\n thinking_content: thinkingContent || undefined,\n tool_calls: toolCalls.length > 0 ? toolCalls : undefined,\n usage,\n cost,\n providerMetadata,\n };\n }\n\n // ---------------------------------------------------------------------------\n // Internal: parse SSE stream\n // ---------------------------------------------------------------------------\n\n private async *parseSSEStream(\n body: ReadableStream<Uint8Array>,\n model: string,\n ): AsyncGenerator<StreamChunk> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n // Track current function_call item for argument deltas\n const callIdMap = new Map<number, string>();\n // Must persist across read() calls — event: and data: lines may arrive in separate chunks\n let eventType = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(':')) continue;\n\n if (trimmed.startsWith('event: ')) {\n eventType = trimmed.slice(7);\n continue;\n }\n\n if (trimmed.startsWith('data: ')) {\n const jsonStr = trimmed.slice(6);\n let data: ResponsesStreamEventData;\n try {\n data = JSON.parse(jsonStr) as ResponsesStreamEventData;\n } catch {\n continue;\n }\n\n const chunk = this.handleStreamEvent(eventType, data, model, callIdMap);\n if (chunk) {\n yield chunk;\n // If done, exit\n if (chunk.type === 'done') return;\n }\n\n eventType = '';\n }\n }\n }\n\n // Stream ended without a completed event\n yield { type: 'done' };\n } finally {\n reader.releaseLock();\n }\n }\n\n private handleStreamEvent(\n eventType: string,\n data: ResponsesStreamEventData,\n model: string,\n callIdMap: Map<number, string>,\n ): StreamChunk | null {\n switch (eventType) {\n case 'response.output_text.delta':\n return { type: 'text_delta', content: data.delta ?? '' };\n\n case 'response.reasoning_summary_text.delta':\n return { type: 'thinking_delta', content: data.delta ?? '' };\n\n case 'response.output_item.added':\n if (data.item?.type === 'function_call') {\n const callId = data.item.call_id ?? data.item.id ?? '';\n const outputIndex = data.output_index ?? 0;\n callIdMap.set(outputIndex, callId);\n return {\n type: 'tool_call_delta',\n id: callId,\n name: data.item.name,\n };\n }\n return null;\n\n case 'response.function_call_arguments.delta': {\n const outputIndex = data.output_index ?? 0;\n const callId = callIdMap.get(outputIndex) ?? '';\n return {\n type: 'tool_call_delta',\n id: callId,\n arguments: data.delta ?? '',\n };\n }\n\n case 'response.completed': {\n const response = data.response as ResponsesAPIResponse | undefined;\n const usage = response?.usage\n ? {\n prompt_tokens: response.usage.input_tokens,\n completion_tokens: response.usage.output_tokens,\n total_tokens: response.usage.total_tokens,\n reasoning_tokens: response.usage.output_tokens_details?.reasoning_tokens,\n cached_tokens: response.usage.input_tokens_details?.cached_tokens,\n }\n : undefined;\n\n // Capture reasoning items from completed response for providerMetadata\n const reasoningItems = response?.output?.filter((item) => item.type === 'reasoning') ?? [];\n const providerMetadata =\n reasoningItems.length > 0 ? { openaiReasoningItems: reasoningItems } : undefined;\n\n return {\n type: 'done',\n usage,\n cost: usage\n ? estimateOpenAICost(\n model,\n usage.prompt_tokens,\n usage.completion_tokens,\n usage.cached_tokens,\n )\n : undefined,\n providerMetadata,\n };\n }\n\n case 'response.failed': {\n const errorMsg =\n data.response?.error?.message ??\n data.response?.status_details?.error?.message ??\n 'Unknown error';\n throw new Error(`OpenAI Responses API error: ${errorMsg}`);\n }\n\n default:\n return null;\n }\n }\n\n // ---------------------------------------------------------------------------\n // Internal: error handling\n // ---------------------------------------------------------------------------\n\n private extractErrorMessage(body: string, status: number): string {\n try {\n const json = JSON.parse(body) as { error?: { message?: string; type?: string } };\n if (json.error?.message) {\n return `OpenAI Responses API error (${status}): ${json.error.message}`;\n }\n } catch {\n // Not JSON, use raw body\n }\n return `OpenAI Responses API error (${status}): ${body}`;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Responses API types (internal)\n// ---------------------------------------------------------------------------\n\n/** Union of possible SSE event data payloads from the Responses API stream. */\ntype ResponsesStreamEventData = {\n delta?: string;\n output_index?: number;\n item?: { type: string; call_id?: string; id?: string; name?: string };\n response?: ResponsesAPIResponse & {\n error?: { message?: string };\n status_details?: { error?: { message?: string } };\n };\n};\n\ntype ResponsesInputItem =\n | { type: 'message'; role: 'user' | 'assistant'; content: string }\n | { type: 'function_call'; call_id: string; name: string; arguments: string }\n | { type: 'function_call_output'; call_id: string; output: string }\n | { type: 'reasoning'; id: string; encrypted_content: string; [key: string]: unknown };\n\ntype ResponsesAPIResponse = {\n id: string;\n output: Array<\n | {\n type: 'message';\n role: 'assistant';\n content?: Array<{ type: 'output_text'; text: string }>;\n }\n | {\n type: 'function_call';\n id: string;\n call_id: string;\n name: string;\n arguments: string;\n }\n | {\n type: 'reasoning';\n id: string;\n summary?: Array<{ type: 'summary_text'; text: string }>;\n encrypted_content?: string;\n [key: string]: unknown;\n }\n >;\n usage?: {\n input_tokens: number;\n output_tokens: number;\n total_tokens: number;\n output_tokens_details?: {\n reasoning_tokens?: number;\n };\n input_tokens_details?: {\n cached_tokens?: number;\n };\n };\n};\n","import type {\n Provider,\n ChatOptions,\n ChatMessage,\n ProviderResponse,\n StreamChunk,\n ToolDefinition,\n ToolCallMessage,\n} from './types.js';\nimport { resolveThinkingOptions } from './types.js';\nimport { fetchWithRetry } from './retry.js';\n\nconst ANTHROPIC_API_VERSION = '2023-06-01';\n\n// ---------------------------------------------------------------------------\n// Approximate per-token pricing (USD) for common Anthropic models.\n// Format: [inputCostPerToken, outputCostPerToken]\n// These are rough estimates for budget tracking; not guaranteed to be exact.\n// ---------------------------------------------------------------------------\n\nconst ANTHROPIC_PRICING: Record<string, [number, number]> = {\n 'claude-opus-4-6': [5e-6, 25e-6],\n 'claude-sonnet-4-6': [3e-6, 15e-6],\n 'claude-opus-4-5': [5e-6, 25e-6],\n 'claude-opus-4-1': [15e-6, 75e-6],\n 'claude-sonnet-4-5': [3e-6, 15e-6],\n 'claude-haiku-4-5': [1e-6, 5e-6],\n 'claude-sonnet-4': [3e-6, 15e-6],\n 'claude-opus-4': [15e-6, 75e-6],\n 'claude-3-7-sonnet': [3e-6, 15e-6],\n 'claude-3-5-sonnet': [3e-6, 15e-6],\n 'claude-3-5-haiku': [0.8e-6, 4e-6],\n 'claude-3-opus': [15e-6, 75e-6],\n 'claude-3-sonnet': [3e-6, 15e-6],\n 'claude-3-haiku': [0.25e-6, 1.25e-6],\n};\n\n/** Pre-sorted keys (longest first) for prefix matching versioned model names. */\nconst ANTHROPIC_PRICING_KEYS_BY_LENGTH = Object.keys(ANTHROPIC_PRICING).sort(\n (a, b) => b.length - a.length,\n);\n\nfunction estimateAnthropicCost(\n model: string,\n inputTokens: number,\n outputTokens: number,\n cacheReadTokens?: number,\n cacheWriteTokens?: number,\n): number {\n // Try exact match first, then prefix match for versioned models\n let pricing = ANTHROPIC_PRICING[model];\n if (!pricing) {\n for (const key of ANTHROPIC_PRICING_KEYS_BY_LENGTH) {\n if (model.startsWith(key)) {\n pricing = ANTHROPIC_PRICING[key];\n break;\n }\n }\n }\n if (!pricing) return 0;\n\n const [inputRate, outputRate] = pricing;\n const cacheRead = cacheReadTokens ?? 0;\n const cacheWrite = cacheWriteTokens ?? 0;\n // Anthropic cache reads cost 10% of base input rate (uniform across all models).\n // Cache writes cost 125% for the default 5-minute TTL, or 200% for the 1-hour TTL.\n // The API response does not distinguish between TTLs in cache_creation_input_tokens,\n // so we conservatively assume 5-minute writes (1.25x) for all cache creation tokens.\n const inputCost =\n (inputTokens - cacheRead - cacheWrite) * inputRate +\n cacheRead * inputRate * 0.1 +\n cacheWrite * inputRate * 1.25;\n return inputCost + outputTokens * outputRate;\n}\n\n/** Default thinking budget tokens for each effort level (manual mode fallback). */\nconst THINKING_BUDGETS: Record<string, number> = {\n low: 1024,\n medium: 5000,\n high: 10000,\n // 30000 (not 32000) to stay under the 32K max_tokens limit on Opus 4/4.1.\n // With auto-bump (+1024), max_tokens becomes 31024 which fits all models.\n max: 30000,\n};\n\n/**\n * Check if a model supports Anthropic's adaptive thinking mode.\n * Adaptive thinking is supported on Claude Opus 4.6 and Sonnet 4.6.\n */\nfunction supportsAdaptiveThinking(model: string): boolean {\n return model.startsWith('claude-opus-4-6') || model.startsWith('claude-sonnet-4-6');\n}\n\n/**\n * Check if a model supports effort: 'max' in adaptive thinking mode.\n * Only Opus 4.6 supports max effort. Sonnet 4.6 supports adaptive mode\n * but not the 'max' effort level.\n */\nfunction supportsMaxEffort(model: string): boolean {\n return model.startsWith('claude-opus-4-6');\n}\n\n/** Models that support output_config.effort (Opus 4.6, Sonnet 4.6, Opus 4.5). */\nfunction supportsEffort(model: string): boolean {\n return (\n model.startsWith('claude-opus-4-6') ||\n model.startsWith('claude-sonnet-4-6') ||\n model.startsWith('claude-opus-4-5')\n );\n}\n\n/**\n * Anthropic provider using raw fetch (no SDK dependency).\n *\n * Supports:\n * - Chat completions via /v1/messages\n * - Tool calling (tool_use / tool_result content blocks)\n * - Streaming via SSE\n *\n * Message mapping:\n * - \"system\" role messages are extracted and sent as the top-level `system` param\n * - \"tool\" role messages are mapped to user messages with tool_result content blocks\n * - \"assistant\" messages with tool_calls are mapped to tool_use content blocks\n */\nexport class AnthropicProvider implements Provider {\n readonly name = 'anthropic';\n private baseUrl: string;\n private apiKey: string;\n private currentModel?: string;\n\n constructor(options: { apiKey?: string; baseUrl?: string } = {}) {\n this.apiKey = options.apiKey ?? process.env.ANTHROPIC_API_KEY ?? '';\n this.baseUrl = (options.baseUrl ?? 'https://api.anthropic.com/v1').replace(/\\/$/, '');\n\n if (!this.apiKey) {\n throw new Error(\n 'Anthropic API key is required. Set ANTHROPIC_API_KEY or pass apiKey in options.',\n );\n }\n }\n\n // ---------------------------------------------------------------------------\n // chat - non-streaming completion\n // ---------------------------------------------------------------------------\n\n async chat(messages: ChatMessage[], options: ChatOptions): Promise<ProviderResponse> {\n this.currentModel = options.model;\n const body = this.buildRequestBody(messages, options, false);\n\n const res = await fetchWithRetry(`${this.baseUrl}/messages`, {\n method: 'POST',\n headers: this.buildHeaders(),\n body: JSON.stringify(body),\n signal: options.signal,\n });\n\n if (!res.ok) {\n const errorBody = await res.text();\n const message = this.extractErrorMessage(errorBody, res.status);\n throw new Error(message);\n }\n\n const json = (await res.json()) as AnthropicMessageResponse;\n return this.parseResponse(json);\n }\n\n // ---------------------------------------------------------------------------\n // stream - SSE streaming completion\n // ---------------------------------------------------------------------------\n\n async *stream(messages: ChatMessage[], options: ChatOptions): AsyncGenerator<StreamChunk> {\n const body = this.buildRequestBody(messages, options, true);\n\n const res = await fetchWithRetry(`${this.baseUrl}/messages`, {\n method: 'POST',\n headers: this.buildHeaders(),\n body: JSON.stringify(body),\n signal: options.signal,\n });\n\n if (!res.ok) {\n const errorBody = await res.text();\n const message = this.extractErrorMessage(errorBody, res.status);\n throw new Error(message);\n }\n\n if (!res.body) {\n throw new Error('Anthropic stream response has no body');\n }\n\n yield* this.parseSSEStream(res.body, options.model);\n }\n\n // ---------------------------------------------------------------------------\n // Internal: request building\n // ---------------------------------------------------------------------------\n\n private buildHeaders(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n 'anthropic-version': ANTHROPIC_API_VERSION,\n };\n }\n\n /** Extract a human-readable message from an API error response body. */\n private extractErrorMessage(body: string, status: number): string {\n try {\n const json = JSON.parse(body) as { error?: { message?: string; type?: string } };\n if (json.error?.message) {\n return `Anthropic API error (${status}): ${json.error.message}`;\n }\n } catch {\n // Not JSON, use raw body\n }\n return `Anthropic API error (${status}): ${body}`;\n }\n\n private buildRequestBody(\n messages: ChatMessage[],\n options: ChatOptions,\n stream: boolean,\n ): Record<string, unknown> {\n // Extract system messages into a single system parameter\n const systemMessages = messages.filter((m) => m.role === 'system');\n const nonSystemMessages = messages.filter((m) => m.role !== 'system');\n const systemText = systemMessages.map((m) => m.content).join('\\n\\n');\n\n const body: Record<string, unknown> = {\n model: options.model,\n messages: this.mapMessages(nonSystemMessages),\n max_tokens: options.maxTokens ?? 4096,\n stream,\n };\n\n if (systemText) {\n body.system = systemText;\n }\n\n if (options.stop) {\n body.stop_sequences = options.stop;\n }\n\n if (options.tools && options.tools.length > 0) {\n body.tools = options.tools.map((t) => this.mapToolDefinition(t));\n }\n\n if (options.toolChoice !== undefined) {\n body.tool_choice = this.mapToolChoice(options.toolChoice);\n }\n\n // Build thinking/effort config\n const { thinkingBudget, thinkingDisabled, activeEffort, hasBudgetOverride } =\n resolveThinkingOptions(options);\n let resolvedEffort = activeEffort;\n if (resolvedEffort === 'max' && !supportsMaxEffort(options.model)) {\n resolvedEffort = 'high';\n }\n\n if (hasBudgetOverride) {\n // Explicit budget → manual mode (precise override), regardless of model\n body.thinking = { type: 'enabled', budget_tokens: thinkingBudget! };\n const currentMax = body.max_tokens as number;\n if (currentMax < thinkingBudget! + 1024) {\n body.max_tokens = thinkingBudget! + 1024;\n }\n // If effort also set on a model that supports it, send output_config alongside\n if (resolvedEffort && supportsEffort(options.model)) {\n body.output_config = { effort: resolvedEffort };\n }\n } else if (thinkingDisabled) {\n // effort: 'none' or thinkingBudget: 0 → no thinking block\n // thinkingBudget: 0 + effort → standalone effort (Anthropic optimization)\n if (resolvedEffort && supportsEffort(options.model)) {\n body.output_config = { effort: resolvedEffort };\n }\n } else if (resolvedEffort && supportsAdaptiveThinking(options.model)) {\n // 4.6 models (default): adaptive thinking + effort (recommended combo)\n body.thinking = { type: 'adaptive' };\n body.output_config = { effort: resolvedEffort };\n } else if (resolvedEffort && supportsEffort(options.model)) {\n // Opus 4.5: supports effort but not adaptive thinking → effort only\n body.output_config = { effort: resolvedEffort };\n } else if (resolvedEffort) {\n // Older models: no effort support → map effort to thinking budget as fallback\n const budget = THINKING_BUDGETS[resolvedEffort] ?? 5000;\n body.thinking = { type: 'enabled', budget_tokens: budget };\n const currentMax = body.max_tokens as number;\n if (currentMax < budget + 1024) {\n body.max_tokens = budget + 1024;\n }\n }\n // No effort, no budget → no thinking, no effort sent\n\n // Anthropic rejects temperature when thinking is enabled.\n // Strip when any thinking block is present in the built body.\n if (options.temperature !== undefined && !body.thinking) {\n body.temperature = options.temperature;\n }\n\n // Anthropic's native structured outputs (output_config.format) use constrained\n // decoding which can degrade quality and may reject complex schemas. Instead, we\n // use a system prompt instruction for all JSON modes and rely on client-side\n // validation (extractJson + Zod).\n if (options.responseFormat && options.responseFormat.type !== 'text') {\n const jsonInstruction =\n 'You must respond with valid JSON only. No markdown fences, no extra text.';\n body.system = body.system ? `${body.system}\\n\\n${jsonInstruction}` : jsonInstruction;\n }\n\n if (options.providerOptions) {\n Object.assign(body, options.providerOptions);\n }\n\n return body;\n }\n\n /**\n * Map OpenAI-format ChatMessages to Anthropic message format.\n *\n * Key transformations:\n * - assistant messages with tool_calls -> assistant with tool_use content blocks\n * - tool messages (tool results) -> user messages with tool_result content blocks\n */\n private mapMessages(messages: ChatMessage[]): AnthropicMessage[] {\n const result: AnthropicMessage[] = [];\n\n for (const msg of messages) {\n if (msg.role === 'assistant') {\n if (msg.tool_calls && msg.tool_calls.length > 0) {\n // Assistant message with tool calls\n const content: AnthropicContentBlock[] = [];\n\n // Include text content if present\n if (msg.content) {\n content.push({ type: 'text', text: msg.content });\n }\n\n // Map each tool call to a tool_use block\n for (const tc of msg.tool_calls) {\n let parsedArgs: unknown;\n try {\n parsedArgs = JSON.parse(tc.function.arguments);\n } catch {\n parsedArgs = {};\n }\n content.push({\n type: 'tool_use',\n id: tc.id,\n name: tc.function.name,\n input: parsedArgs,\n });\n }\n\n result.push({ role: 'assistant', content });\n } else {\n result.push({ role: 'assistant', content: msg.content });\n }\n } else if (msg.role === 'tool') {\n // Tool result messages become user messages with tool_result content blocks.\n // Anthropic requires tool results in a user-role message.\n result.push({\n role: 'user',\n content: [\n {\n type: 'tool_result',\n tool_use_id: msg.tool_call_id!,\n content: msg.content,\n },\n ],\n });\n } else if (msg.role === 'user') {\n result.push({ role: 'user', content: msg.content });\n }\n // system messages already handled at top level\n }\n\n // Anthropic requires alternating user/assistant turns.\n // Merge consecutive same-role messages if necessary.\n return this.mergeConsecutiveRoles(result);\n }\n\n /**\n * Merge consecutive messages with the same role into a single message.\n * This handles cases where multiple tool_result blocks need to be in one user message.\n */\n private mergeConsecutiveRoles(messages: AnthropicMessage[]): AnthropicMessage[] {\n if (messages.length === 0) return messages;\n\n const merged: AnthropicMessage[] = [messages[0]];\n\n for (let i = 1; i < messages.length; i++) {\n const prev = merged[merged.length - 1];\n const curr = messages[i];\n\n if (prev.role === curr.role) {\n // Merge: convert both to content-block arrays and concatenate\n const prevBlocks = this.toContentBlocks(prev.content);\n const currBlocks = this.toContentBlocks(curr.content);\n prev.content = [...prevBlocks, ...currBlocks];\n } else {\n merged.push(curr);\n }\n }\n\n return merged;\n }\n\n private toContentBlocks(content: string | AnthropicContentBlock[]): AnthropicContentBlock[] {\n if (typeof content === 'string') {\n return [{ type: 'text', text: content }];\n }\n return content;\n }\n\n /**\n * Map an OpenAI-format ToolDefinition to Anthropic's tool format.\n */\n private mapToolDefinition(tool: ToolDefinition): AnthropicToolDef {\n return {\n name: tool.function.name,\n description: tool.function.description,\n input_schema: tool.function.parameters as Record<string, unknown>,\n };\n }\n\n /**\n * Map Axl's ToolChoice to Anthropic's tool_choice format.\n *\n * Axl (OpenAI format) → Anthropic format\n * 'auto' → { type: 'auto' }\n * 'none' → { type: 'none' }\n * 'required' → { type: 'any' }\n * { type:'function', function: { name } } → { type: 'tool', name }\n */\n private mapToolChoice(choice: NonNullable<ChatOptions['toolChoice']>): Record<string, unknown> {\n if (typeof choice === 'string') {\n if (choice === 'required') return { type: 'any' };\n return { type: choice };\n }\n // Specific function: { type: 'function', function: { name } } → { type: 'tool', name }\n return { type: 'tool', name: choice.function.name };\n }\n\n // ---------------------------------------------------------------------------\n // Internal: response parsing\n // ---------------------------------------------------------------------------\n\n private parseResponse(json: AnthropicMessageResponse): ProviderResponse {\n let content = '';\n let thinkingContent = '';\n const toolCalls: ToolCallMessage[] = [];\n\n for (const block of json.content) {\n if (block.type === 'thinking') {\n thinkingContent += block.thinking;\n } else if (block.type === 'text') {\n content += block.text;\n } else if (block.type === 'tool_use') {\n toolCalls.push({\n id: block.id,\n type: 'function',\n function: {\n name: block.name,\n arguments: JSON.stringify(block.input),\n },\n });\n }\n }\n\n const cacheRead = json.usage?.cache_read_input_tokens ?? 0;\n const cacheWrite = json.usage?.cache_creation_input_tokens ?? 0;\n // Anthropic's input_tokens excludes cached tokens; total prompt is the sum of all three\n const totalInput = (json.usage?.input_tokens ?? 0) + cacheRead + cacheWrite;\n\n const usage = json.usage\n ? {\n prompt_tokens: totalInput,\n completion_tokens: json.usage.output_tokens,\n total_tokens: totalInput + json.usage.output_tokens,\n cached_tokens: cacheRead > 0 ? cacheRead : undefined,\n }\n : undefined;\n\n const cost = json.usage\n ? estimateAnthropicCost(\n this.currentModel ?? '',\n totalInput,\n json.usage.output_tokens,\n cacheRead,\n cacheWrite,\n )\n : undefined;\n\n return {\n content,\n thinking_content: thinkingContent || undefined,\n tool_calls: toolCalls.length > 0 ? toolCalls : undefined,\n usage,\n cost,\n };\n }\n\n // ---------------------------------------------------------------------------\n // Internal: SSE stream parsing\n // ---------------------------------------------------------------------------\n\n private async *parseSSEStream(\n body: ReadableStream<Uint8Array>,\n model: string,\n ): AsyncGenerator<StreamChunk> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n // Track current content block type being streamed\n let currentToolId = '';\n let currentToolName = '';\n let usage:\n | {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n cached_tokens?: number;\n }\n | undefined;\n let cacheWrite = 0;\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(':')) continue;\n\n if (!trimmed.startsWith('data: ')) continue;\n\n const jsonStr = trimmed.slice(6);\n let event: AnthropicStreamEvent;\n try {\n event = JSON.parse(jsonStr) as AnthropicStreamEvent;\n } catch {\n continue;\n }\n\n switch (event.type) {\n case 'content_block_start': {\n const block = event.content_block;\n if (block?.type === 'tool_use') {\n currentToolId = block.id ?? '';\n currentToolName = block.name ?? '';\n // Emit the start of a tool call\n yield {\n type: 'tool_call_delta',\n id: currentToolId,\n name: currentToolName,\n arguments: '',\n };\n }\n break;\n }\n\n case 'content_block_delta': {\n const delta = event.delta;\n if (delta?.type === 'thinking_delta' && delta.thinking) {\n yield { type: 'thinking_delta', content: delta.thinking };\n } else if (delta?.type === 'text_delta' && delta.text) {\n yield { type: 'text_delta', content: delta.text };\n } else if (delta?.type === 'input_json_delta' && delta.partial_json) {\n yield {\n type: 'tool_call_delta',\n id: currentToolId,\n arguments: delta.partial_json,\n };\n }\n break;\n }\n\n case 'content_block_stop': {\n // Reset block tracking\n currentToolId = '';\n currentToolName = '';\n break;\n }\n\n case 'message_start': {\n // message_start arrives first in the SSE stream with input token counts\n if (event.message?.usage) {\n const cacheRead = event.message.usage.cache_read_input_tokens ?? 0;\n cacheWrite = event.message.usage.cache_creation_input_tokens ?? 0;\n const inputTokens =\n (event.message.usage.input_tokens ?? 0) + cacheRead + cacheWrite;\n usage = {\n prompt_tokens: inputTokens,\n completion_tokens: 0,\n total_tokens: inputTokens,\n cached_tokens: cacheRead > 0 ? cacheRead : undefined,\n };\n }\n break;\n }\n\n case 'message_delta': {\n // message_delta arrives near the end with output token counts\n if (event.usage) {\n const outputTokens = event.usage.output_tokens ?? 0;\n if (usage) {\n usage.completion_tokens = outputTokens;\n usage.total_tokens = usage.prompt_tokens + outputTokens;\n } else {\n usage = {\n prompt_tokens: 0,\n completion_tokens: outputTokens,\n total_tokens: outputTokens,\n };\n }\n }\n break;\n }\n\n case 'message_stop': {\n // Finalize usage totals\n if (usage) {\n usage.total_tokens = usage.prompt_tokens + usage.completion_tokens;\n }\n yield {\n type: 'done',\n usage,\n cost: usage\n ? estimateAnthropicCost(\n model,\n usage.prompt_tokens,\n usage.completion_tokens,\n usage.cached_tokens,\n cacheWrite,\n )\n : undefined,\n };\n return;\n }\n }\n }\n }\n\n // If we exit without a message_stop, still emit done\n yield {\n type: 'done',\n usage,\n cost: usage\n ? estimateAnthropicCost(\n model,\n usage.prompt_tokens,\n usage.completion_tokens,\n usage.cached_tokens,\n cacheWrite,\n )\n : undefined,\n };\n } finally {\n reader.releaseLock();\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Anthropic API types (internal)\n// ---------------------------------------------------------------------------\n\ntype AnthropicContentBlock =\n | { type: 'text'; text: string }\n | { type: 'tool_use'; id: string; name: string; input: unknown }\n | { type: 'tool_result'; tool_use_id: string; content: string };\n\ntype AnthropicMessage = {\n role: 'user' | 'assistant';\n content: string | AnthropicContentBlock[];\n};\n\ntype AnthropicToolDef = {\n name: string;\n description: string;\n input_schema: Record<string, unknown>;\n};\n\ntype AnthropicMessageResponse = {\n id: string;\n type: 'message';\n role: 'assistant';\n content: Array<\n | { type: 'thinking'; thinking: string }\n | { type: 'text'; text: string }\n | { type: 'tool_use'; id: string; name: string; input: unknown }\n >;\n stop_reason: string | null;\n usage: {\n input_tokens: number;\n output_tokens: number;\n cache_read_input_tokens?: number;\n cache_creation_input_tokens?: number;\n };\n};\n\ntype AnthropicStreamEvent = {\n type:\n | 'message_start'\n | 'content_block_start'\n | 'content_block_delta'\n | 'content_block_stop'\n | 'message_delta'\n | 'message_stop'\n | 'ping';\n message?: {\n usage?: {\n input_tokens?: number;\n output_tokens?: number;\n cache_read_input_tokens?: number;\n cache_creation_input_tokens?: number;\n };\n };\n content_block?: {\n type?: 'text' | 'thinking' | 'tool_use';\n id?: string;\n name?: string;\n text?: string;\n };\n delta?: {\n type?: 'text_delta' | 'thinking_delta' | 'input_json_delta';\n text?: string;\n thinking?: string;\n partial_json?: string;\n };\n usage?: {\n output_tokens?: number;\n };\n};\n","import type {\n Provider,\n ChatOptions,\n ChatMessage,\n ProviderResponse,\n StreamChunk,\n ToolDefinition,\n ToolCallMessage,\n} from './types.js';\nimport { resolveThinkingOptions } from './types.js';\nimport { fetchWithRetry } from './retry.js';\n\n// ---------------------------------------------------------------------------\n// Schema sanitization for Gemini's tool/responseSchema dialect.\n//\n// Gemini accepts a strict subset of OpenAPI 3.0 Schema Object — narrower\n// than standard JSON Schema. Zod v4's `z.toJSONSchema()` emits Draft\n// 2020-12 fields that Gemini rejects with a 400. Caught in the live\n// integration test pass — every Zod-defined tool 400'd on first call.\n//\n// Allowed: type, format, description, nullable, enum, properties,\n// required, items, minItems, maxItems, minLength, maxLength,\n// minimum, maximum, pattern, anyOf, propertyOrdering, default,\n// title, minProperties, maxProperties, example, multipleOf\n// Rejected: additionalProperties, $schema, $ref, $defs, definitions,\n// not, allOf, oneOf, patternProperties, const,\n// unevaluatedProperties, unevaluatedItems\n//\n// Two fields get TRANSLATED rather than stripped because they're load-\n// bearing for common Zod patterns:\n//\n// `oneOf` → `anyOf` — `z.discriminatedUnion()` produces `oneOf`.\n// Naive stripping would erase the entire union\n// shape and Gemini would have no schema for\n// the field. The two are semantically identical\n// for tool-use (the discriminator field already\n// enforces mutual exclusion at the consumer\n// site).\n//\n// `const: x` → `enum: [x]` — `z.literal('foo')` produces `const`.\n// Naive stripping would lose the constraint\n// entirely. `enum` with a single value is\n// Gemini's supported equivalent. (If both\n// `const` and `enum` are present, the explicit\n// `enum` wins — we don't clobber.)\n//\n// `allOf` is stripped (rare in Zod output and merging it correctly is\n// non-trivial — schema intersections that survive `allOf` removal will\n// surface as a schema validation retry on our side, which is acceptable\n// degradation). The function recurses through every value so an inner\n// `additionalProperties: false` on a nested object also gets removed —\n// the 400 fires at any depth.\n//\n// Loss without `additionalProperties: false`: the LLM has slightly less\n// guidance about strict-mode schemas, so it may occasionally emit extra\n// fields. Default Zod (`z.object`) silently strips them on parse, so the\n// user sees clean data; `.strict()` schemas trigger our schema retry\n// loop. Net cost: a handful of extra tokens, occasional retry. Not a\n// correctness issue.\n// ---------------------------------------------------------------------------\n\nconst GEMINI_DISALLOWED_SCHEMA_KEYS = new Set([\n 'additionalProperties',\n '$schema',\n '$ref',\n '$defs',\n 'definitions',\n 'not',\n 'allOf',\n 'patternProperties',\n 'unevaluatedProperties',\n 'unevaluatedItems',\n]);\n\nfunction sanitizeSchemaForGemini(schema: unknown): unknown {\n if (Array.isArray(schema)) {\n return schema.map((item) => sanitizeSchemaForGemini(item));\n }\n if (schema === null || typeof schema !== 'object') {\n return schema;\n }\n const src = schema as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(src)) {\n if (GEMINI_DISALLOWED_SCHEMA_KEYS.has(key)) continue;\n if (key === 'oneOf') {\n // Translate to anyOf — preserves z.discriminatedUnion's union shape.\n out.anyOf = sanitizeSchemaForGemini(value);\n continue;\n }\n if (key === 'const') {\n // Translate to enum with one element — preserves z.literal's\n // constraint. Skip if `enum` is also set so we don't clobber an\n // explicit enum the schema author already wrote.\n if (!('enum' in src)) out.enum = [value];\n continue;\n }\n out[key] = sanitizeSchemaForGemini(value);\n }\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// Approximate per-token pricing (USD) for common Gemini models.\n// Format: [inputCostPerToken, outputCostPerToken]\n// Uses standard context pricing (<=200k) as default.\n// ---------------------------------------------------------------------------\n\nconst GEMINI_PRICING: Record<string, [number, number]> = {\n 'gemini-2.5-pro': [1.25e-6, 10e-6],\n 'gemini-2.5-flash': [0.3e-6, 2.5e-6],\n 'gemini-2.5-flash-lite': [0.1e-6, 0.4e-6],\n 'gemini-2.0-flash': [0.1e-6, 0.4e-6],\n 'gemini-2.0-flash-lite': [0.1e-6, 0.4e-6],\n 'gemini-3-pro-preview': [2e-6, 12e-6],\n 'gemini-3-flash-preview': [0.5e-6, 3e-6],\n 'gemini-3.1-pro-preview': [2e-6, 12e-6],\n 'gemini-3.1-flash-lite-preview': [0.25e-6, 1.5e-6],\n};\n\n/** Pre-sorted keys (longest first) for prefix matching versioned model names. */\nconst GEMINI_PRICING_KEYS_BY_LENGTH = Object.keys(GEMINI_PRICING).sort(\n (a, b) => b.length - a.length,\n);\n\nfunction estimateGeminiCost(\n model: string,\n inputTokens: number,\n outputTokens: number,\n cachedTokens?: number,\n): number {\n let pricing = GEMINI_PRICING[model];\n if (!pricing) {\n for (const key of GEMINI_PRICING_KEYS_BY_LENGTH) {\n if (model.startsWith(key)) {\n pricing = GEMINI_PRICING[key];\n break;\n }\n }\n }\n if (!pricing) return 0;\n\n const [inputRate, outputRate] = pricing;\n const cached = cachedTokens ?? 0;\n // Gemini charges 10% of input rate for cached tokens (90% discount)\n const inputCost = (inputTokens - cached) * inputRate + cached * inputRate * 0.1;\n return inputCost + outputTokens * outputRate;\n}\n\n/** Default thinking budget tokens for each effort level (Gemini 2.x). */\nconst THINKING_BUDGETS: Record<string, number> = {\n low: 1024,\n medium: 5000,\n high: 10000,\n max: 24576,\n};\n\n/** Gemini 3.x thinkingLevel values mapped from unified effort levels. */\nconst THINKING_LEVELS: Record<string, string> = {\n low: 'low',\n medium: 'medium',\n high: 'high',\n max: 'high', // 3.x caps at 'high'\n};\n\n/** Check if a model is Gemini 3.x generation (uses thinkingLevel instead of thinkingBudget). */\nfunction isGemini3x(model: string): boolean {\n return /^gemini-3[.-]/.test(model);\n}\n\n/**\n * Map thinkingBudget to Gemini thinkingLevel.\n *\n * Gemini 3.x uses `thinkingLevel` (string enum: 'low' | 'medium' | 'high').\n * Gemini 2.x uses `thinkingBudget` (integer token count).\n * Budget form `{ budgetTokens }` maps to nearest `thinkingLevel` on 3.x,\n * exact `thinkingBudget` on 2.x.\n */\nfunction budgetToThinkingLevel(budgetTokens: number): string {\n if (budgetTokens <= 1024) return 'low';\n if (budgetTokens <= 5000) return 'medium';\n return 'high';\n}\n\n/** Get the minimum supported thinkingLevel for a 3.x model. */\nfunction minThinkingLevel(model: string): string {\n // 3.1 Pro doesn't support 'minimal' — 'low' is the floor\n if (model.startsWith('gemini-3.1-pro')) return 'low';\n return 'minimal';\n}\n\n/** Warn once per model that effort: 'none' cannot fully disable thinking on Gemini 3.x. */\nconst _warned3xEffortNone = new Set<string>();\nfunction warnGemini3xEffortNone(model: string): void {\n if (_warned3xEffortNone.has(model)) return;\n _warned3xEffortNone.add(model);\n console.warn(\n `[axl] effort: 'none' on Gemini 3.x (${model}) maps to the model's minimum thinking level ` +\n `('${minThinkingLevel(model)}'), not fully disabled. Gemini 3.x models cannot disable thinking entirely.`,\n );\n}\n\n/**\n * Google Gemini provider using raw fetch (no SDK dependency).\n *\n * Supports:\n * - Chat completions via generateContent\n * - Tool calling (functionCall / functionResponse)\n * - Streaming via SSE (streamGenerateContent)\n * - Structured output via responseMimeType / responseSchema\n *\n * Message mapping:\n * - \"system\" role messages are extracted into the top-level `system_instruction` param\n * - \"assistant\" role is mapped to \"model\" role\n * - \"tool\" role messages are mapped to user messages with functionResponse parts\n * - assistant messages with tool_calls are mapped to functionCall parts\n */\nexport class GeminiProvider implements Provider {\n readonly name = 'google';\n private baseUrl: string;\n private apiKey: string;\n private callCounter = 0;\n\n constructor(options: { apiKey?: string; baseUrl?: string } = {}) {\n this.apiKey = options.apiKey ?? process.env.GOOGLE_API_KEY ?? process.env.GEMINI_API_KEY ?? '';\n this.baseUrl = (options.baseUrl ?? 'https://generativelanguage.googleapis.com/v1beta').replace(\n /\\/$/,\n '',\n );\n\n if (!this.apiKey) {\n throw new Error('Google API key is required. Set GOOGLE_API_KEY or pass apiKey in options.');\n }\n }\n\n // ---------------------------------------------------------------------------\n // chat - non-streaming completion\n // ---------------------------------------------------------------------------\n\n async chat(messages: ChatMessage[], options: ChatOptions): Promise<ProviderResponse> {\n const body = this.buildRequestBody(messages, options);\n\n const res = await fetchWithRetry(`${this.baseUrl}/models/${options.model}:generateContent`, {\n method: 'POST',\n headers: this.buildHeaders(),\n body: JSON.stringify(body),\n signal: options.signal,\n });\n\n if (!res.ok) {\n const errorBody = await res.text();\n const message = this.extractErrorMessage(errorBody, res.status);\n throw new Error(message);\n }\n\n const json = (await res.json()) as GeminiResponse;\n return this.parseResponse(json, options.model);\n }\n\n // ---------------------------------------------------------------------------\n // stream - SSE streaming completion\n // ---------------------------------------------------------------------------\n\n async *stream(messages: ChatMessage[], options: ChatOptions): AsyncGenerator<StreamChunk> {\n const body = this.buildRequestBody(messages, options);\n\n const res = await fetchWithRetry(\n `${this.baseUrl}/models/${options.model}:streamGenerateContent?alt=sse`,\n {\n method: 'POST',\n headers: this.buildHeaders(),\n body: JSON.stringify(body),\n signal: options.signal,\n },\n );\n\n if (!res.ok) {\n const errorBody = await res.text();\n const message = this.extractErrorMessage(errorBody, res.status);\n throw new Error(message);\n }\n\n if (!res.body) {\n throw new Error('Gemini stream response has no body');\n }\n\n yield* this.parseSSEStream(res.body, options.model);\n }\n\n // ---------------------------------------------------------------------------\n // Internal: request building\n // ---------------------------------------------------------------------------\n\n private buildHeaders(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n 'x-goog-api-key': this.apiKey,\n };\n }\n\n private extractErrorMessage(body: string, status: number): string {\n try {\n const json = JSON.parse(body) as {\n error?: { message?: string; code?: number; status?: string };\n };\n if (json.error?.message) {\n return `Gemini API error (${status}): ${json.error.message}`;\n }\n } catch {\n // Not JSON, use raw body\n }\n return `Gemini API error (${status}): ${body}`;\n }\n\n private buildRequestBody(messages: ChatMessage[], options: ChatOptions): Record<string, unknown> {\n const systemMessages = messages.filter((m) => m.role === 'system');\n const nonSystemMessages = messages.filter((m) => m.role !== 'system');\n const systemText = systemMessages.map((m) => m.content).join('\\n\\n');\n\n const body: Record<string, unknown> = {\n contents: this.mapMessages(nonSystemMessages),\n };\n\n if (systemText) {\n body.system_instruction = { parts: [{ text: systemText }] };\n }\n\n if (options.tools && options.tools.length > 0) {\n body.tools = [\n {\n functionDeclarations: options.tools.map((t) => this.mapToolDefinition(t)),\n },\n ];\n }\n\n const generationConfig: Record<string, unknown> = {};\n\n if (options.temperature !== undefined) {\n generationConfig.temperature = options.temperature;\n }\n if (options.maxTokens !== undefined) {\n generationConfig.maxOutputTokens = options.maxTokens;\n }\n if (options.stop) {\n generationConfig.stopSequences = options.stop;\n }\n\n if (options.responseFormat && options.responseFormat.type !== 'text') {\n generationConfig.responseMimeType = 'application/json';\n if (\n options.responseFormat.type === 'json_schema' &&\n options.responseFormat.json_schema?.schema\n ) {\n generationConfig.responseSchema = sanitizeSchemaForGemini(\n options.responseFormat.json_schema.schema,\n );\n }\n }\n\n if (Object.keys(generationConfig).length > 0) {\n body.generationConfig = generationConfig;\n }\n\n // Map effort/thinkingBudget/includeThoughts to Gemini's thinkingConfig\n const {\n effort,\n thinkingBudget,\n includeThoughts,\n thinkingDisabled,\n activeEffort,\n hasBudgetOverride,\n } = resolveThinkingOptions(options);\n\n if (thinkingDisabled) {\n // effort: 'none' or thinkingBudget: 0 → minimize thinking\n if (isGemini3x(options.model)) {\n if (effort === 'none') {\n warnGemini3xEffortNone(options.model);\n }\n generationConfig.thinkingConfig = { thinkingLevel: minThinkingLevel(options.model) };\n } else {\n generationConfig.thinkingConfig = { thinkingBudget: 0 };\n }\n if (!body.generationConfig) body.generationConfig = generationConfig;\n } else if (hasBudgetOverride) {\n // Explicit budget takes precedence over effort\n const config: Record<string, unknown> = {};\n if (isGemini3x(options.model)) {\n config.thinkingLevel = budgetToThinkingLevel(thinkingBudget!);\n } else {\n config.thinkingBudget = thinkingBudget!;\n }\n if (includeThoughts) config.includeThoughts = true;\n generationConfig.thinkingConfig = config;\n if (!body.generationConfig) body.generationConfig = generationConfig;\n } else if (activeEffort) {\n const config: Record<string, unknown> = {};\n if (isGemini3x(options.model)) {\n config.thinkingLevel = THINKING_LEVELS[activeEffort] ?? 'medium';\n } else {\n // 2.5 Pro supports a higher max budget (32768) than other 2.5 models (24576)\n if (activeEffort === 'max' && options.model.startsWith('gemini-2.5-pro')) {\n config.thinkingBudget = 32768;\n } else {\n config.thinkingBudget = THINKING_BUDGETS[activeEffort] ?? 5000;\n }\n }\n if (includeThoughts) config.includeThoughts = true;\n generationConfig.thinkingConfig = config;\n if (!body.generationConfig) body.generationConfig = generationConfig;\n } else if (includeThoughts) {\n generationConfig.thinkingConfig = { includeThoughts: true };\n if (!body.generationConfig) body.generationConfig = generationConfig;\n }\n // No effort, no budget, no includeThoughts → no thinkingConfig (provider defaults)\n\n // Map toolChoice to Gemini's toolConfig.functionCallingConfig\n if (options.toolChoice !== undefined) {\n body.toolConfig = { functionCallingConfig: this.mapToolChoice(options.toolChoice) };\n }\n\n if (options.providerOptions) {\n Object.assign(body, options.providerOptions);\n }\n\n return body;\n }\n\n /**\n * Map OpenAI-format ChatMessages to Gemini content format.\n *\n * Key transformations:\n * - assistant role -> model role\n * - assistant messages with tool_calls -> model messages with functionCall parts\n * - tool messages -> user messages with functionResponse parts\n *\n * Two-pass approach: first build a tool_call_id -> function name mapping\n * from assistant messages, then use it when mapping tool result messages.\n */\n private mapMessages(messages: ChatMessage[]): GeminiContent[] {\n // Pass 1: build tool_call_id -> function name mapping\n const toolCallIdToName = new Map<string, string>();\n for (const msg of messages) {\n if (msg.role === 'assistant' && msg.tool_calls) {\n for (const tc of msg.tool_calls) {\n toolCallIdToName.set(tc.id, tc.function.name);\n }\n }\n }\n\n // Pass 2: transform messages\n const result: GeminiContent[] = [];\n\n for (const msg of messages) {\n if (msg.role === 'assistant') {\n // If we have raw Gemini parts from a previous response, use them directly.\n // This preserves thoughtSignature and other opaque fields that Gemini requires\n // in subsequent turns for multi-turn reasoning context.\n const rawParts = msg.providerMetadata?.geminiParts as GeminiPart[] | undefined;\n if (rawParts && rawParts.length > 0) {\n result.push({ role: 'model', parts: rawParts });\n } else {\n const parts: GeminiPart[] = [];\n\n if (msg.content) {\n parts.push({ text: msg.content });\n }\n\n if (msg.tool_calls && msg.tool_calls.length > 0) {\n for (const tc of msg.tool_calls) {\n let parsedArgs: Record<string, unknown>;\n try {\n parsedArgs = JSON.parse(tc.function.arguments) as Record<string, unknown>;\n } catch {\n parsedArgs = {};\n }\n parts.push({\n functionCall: {\n name: tc.function.name,\n args: parsedArgs,\n },\n });\n }\n }\n\n if (parts.length > 0) {\n result.push({ role: 'model', parts });\n }\n }\n } else if (msg.role === 'tool') {\n const functionName = toolCallIdToName.get(msg.tool_call_id!) ?? 'unknown';\n let responseData: unknown;\n try {\n responseData = JSON.parse(msg.content);\n } catch {\n responseData = { result: msg.content };\n }\n result.push({\n role: 'user',\n parts: [\n {\n functionResponse: {\n name: functionName,\n response: responseData as Record<string, unknown>,\n },\n },\n ],\n });\n } else if (msg.role === 'user') {\n result.push({ role: 'user', parts: [{ text: msg.content }] });\n }\n // system messages already handled at top level\n }\n\n // Merge consecutive same-role messages\n return this.mergeConsecutiveRoles(result);\n }\n\n /**\n * Merge consecutive messages with the same role into a single message.\n * Gemini requires alternating user/model turns.\n */\n private mergeConsecutiveRoles(messages: GeminiContent[]): GeminiContent[] {\n if (messages.length === 0) return messages;\n\n const merged: GeminiContent[] = [messages[0]];\n\n for (let i = 1; i < messages.length; i++) {\n const prev = merged[merged.length - 1];\n const curr = messages[i];\n\n if (prev.role === curr.role) {\n prev.parts = [...prev.parts, ...curr.parts];\n } else {\n merged.push(curr);\n }\n }\n\n return merged;\n }\n\n /**\n * Map Axl's ToolChoice to Gemini's functionCallingConfig format.\n *\n * - 'auto' → { mode: 'AUTO' }\n * - 'none' → { mode: 'NONE' }\n * - 'required' → { mode: 'ANY' }\n * - { type: 'function', function: { name } } → { mode: 'ANY', allowedFunctionNames: [name] }\n */\n private mapToolChoice(choice: NonNullable<ChatOptions['toolChoice']>): Record<string, unknown> {\n if (typeof choice === 'string') {\n const modeMap: Record<string, string> = {\n auto: 'AUTO',\n none: 'NONE',\n required: 'ANY',\n };\n return { mode: modeMap[choice] ?? 'AUTO' };\n }\n // Specific function choice\n return { mode: 'ANY', allowedFunctionNames: [choice.function.name] };\n }\n\n private mapToolDefinition(tool: ToolDefinition): {\n name: string;\n description: string;\n parameters: unknown;\n } {\n return {\n name: tool.function.name,\n description: tool.function.description,\n parameters: sanitizeSchemaForGemini(tool.function.parameters),\n };\n }\n\n // ---------------------------------------------------------------------------\n // Internal: response parsing\n // ---------------------------------------------------------------------------\n\n private parseResponse(json: GeminiResponse, model: string): ProviderResponse {\n const candidate = json.candidates?.[0];\n let content = '';\n let thinkingContent = '';\n const toolCalls: ToolCallMessage[] = [];\n\n if (candidate?.content?.parts) {\n for (const part of candidate.content.parts) {\n if (part.thought && part.text) {\n thinkingContent += part.text;\n } else if (part.text) {\n content += part.text;\n } else if (part.functionCall) {\n toolCalls.push({\n id: `call_${this.callCounter++}`,\n type: 'function',\n function: {\n name: part.functionCall.name,\n arguments: JSON.stringify(part.functionCall.args),\n },\n });\n }\n }\n }\n\n const cachedTokens = json.usageMetadata?.cachedContentTokenCount;\n const reasoningTokens = json.usageMetadata?.thoughtsTokenCount;\n const usage = json.usageMetadata\n ? {\n prompt_tokens: json.usageMetadata.promptTokenCount ?? 0,\n completion_tokens: json.usageMetadata.candidatesTokenCount ?? 0,\n total_tokens: json.usageMetadata.totalTokenCount ?? 0,\n cached_tokens: cachedTokens && cachedTokens > 0 ? cachedTokens : undefined,\n reasoning_tokens: reasoningTokens && reasoningTokens > 0 ? reasoningTokens : undefined,\n }\n : undefined;\n\n const cost = usage\n ? estimateGeminiCost(model, usage.prompt_tokens, usage.completion_tokens, usage.cached_tokens)\n : undefined;\n\n // Attach raw Gemini parts as providerMetadata so they can be sent back\n // verbatim in subsequent turns, preserving thoughtSignature and other opaque fields.\n const rawParts = candidate?.content?.parts;\n const providerMetadata = rawParts ? { geminiParts: rawParts } : undefined;\n\n return {\n content,\n thinking_content: thinkingContent || undefined,\n tool_calls: toolCalls.length > 0 ? toolCalls : undefined,\n usage,\n cost,\n providerMetadata,\n };\n }\n\n // ---------------------------------------------------------------------------\n // Internal: SSE stream parsing\n // ---------------------------------------------------------------------------\n\n private async *parseSSEStream(\n body: ReadableStream<Uint8Array>,\n model: string,\n ): AsyncGenerator<StreamChunk> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n let usage:\n | {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n cached_tokens?: number;\n reasoning_tokens?: number;\n }\n | undefined;\n // Accumulate raw parts across stream chunks for providerMetadata round-tripping\n const accumulatedParts: Array<Record<string, unknown>> = [];\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(':')) continue;\n\n if (!trimmed.startsWith('data: ')) continue;\n\n const jsonStr = trimmed.slice(6);\n let chunk: GeminiResponse;\n try {\n chunk = JSON.parse(jsonStr) as GeminiResponse;\n } catch {\n continue;\n }\n\n // Extract usage from this chunk (accumulate from final chunk)\n if (chunk.usageMetadata) {\n const cached = chunk.usageMetadata.cachedContentTokenCount;\n const reasoning = chunk.usageMetadata.thoughtsTokenCount;\n usage = {\n prompt_tokens: chunk.usageMetadata.promptTokenCount ?? 0,\n completion_tokens: chunk.usageMetadata.candidatesTokenCount ?? 0,\n total_tokens: chunk.usageMetadata.totalTokenCount ?? 0,\n cached_tokens: cached && cached > 0 ? cached : undefined,\n reasoning_tokens: reasoning && reasoning > 0 ? reasoning : undefined,\n };\n }\n\n const candidate = chunk.candidates?.[0];\n if (candidate?.content?.parts) {\n for (const part of candidate.content.parts) {\n // Accumulate raw parts for providerMetadata\n accumulatedParts.push(part);\n\n if (part.thought && part.text) {\n yield { type: 'thinking_delta', content: part.text };\n } else if (part.text) {\n yield { type: 'text_delta', content: part.text };\n } else if (part.functionCall) {\n // Gemini sends complete functionCall objects (not incremental deltas)\n yield {\n type: 'tool_call_delta',\n id: `call_${this.callCounter++}`,\n name: part.functionCall.name,\n arguments: JSON.stringify(part.functionCall.args),\n };\n }\n }\n }\n }\n }\n\n const providerMetadata =\n accumulatedParts.length > 0 ? { geminiParts: accumulatedParts } : undefined;\n yield {\n type: 'done',\n usage,\n cost: usage\n ? estimateGeminiCost(\n model,\n usage.prompt_tokens,\n usage.completion_tokens,\n usage.cached_tokens,\n )\n : undefined,\n providerMetadata,\n };\n } finally {\n reader.releaseLock();\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Gemini API types (internal)\n// ---------------------------------------------------------------------------\n\n/**\n * Gemini part type for request building.\n *\n * Uses an index signature to allow opaque provider fields (e.g. thoughtSignature)\n * to round-trip through conversation history without being stripped.\n */\ntype GeminiPart = {\n text?: string;\n functionCall?: { name: string; args: Record<string, unknown> };\n functionResponse?: { name: string; response: Record<string, unknown> };\n [key: string]: unknown;\n};\n\ntype GeminiContent = {\n role: 'user' | 'model';\n parts: GeminiPart[];\n};\n\ntype GeminiResponse = {\n candidates?: Array<{\n content?: {\n role: string;\n parts: Array<{\n text?: string;\n thought?: boolean;\n functionCall?: { name: string; args: Record<string, unknown> };\n [key: string]: unknown;\n }>;\n };\n finishReason?: string;\n }>;\n usageMetadata?: {\n promptTokenCount?: number;\n candidatesTokenCount?: number;\n totalTokenCount?: number;\n cachedContentTokenCount?: number;\n thoughtsTokenCount?: number;\n };\n};\n","import type { Provider } from './types.js';\nimport { OpenAIProvider } from './openai.js';\nimport { OpenAIResponsesProvider } from './openai-responses.js';\nimport { AnthropicProvider } from './anthropic.js';\nimport { GeminiProvider } from './gemini.js';\nimport type { AxlConfig } from '../config.js';\n\n/**\n * Resolved result from a provider:model URI.\n */\nexport type ResolvedProvider = {\n provider: Provider;\n model: string;\n};\n\ntype ProviderFactory = (config: AxlConfig) => Provider;\n\n// ---------------------------------------------------------------------------\n// Built-in provider factories\n// ---------------------------------------------------------------------------\n\nconst builtinFactories: Record<string, ProviderFactory> = {\n openai: (config) => {\n const opts = config.providers?.openai ?? {};\n return new OpenAIProvider({ apiKey: opts.apiKey, baseUrl: opts.baseUrl });\n },\n 'openai-responses': (config) => {\n const opts = config.providers?.['openai-responses'] ?? config.providers?.openai ?? {};\n return new OpenAIResponsesProvider({ apiKey: opts.apiKey, baseUrl: opts.baseUrl });\n },\n anthropic: (config) => {\n const opts = config.providers?.anthropic ?? {};\n return new AnthropicProvider({ apiKey: opts.apiKey, baseUrl: opts.baseUrl });\n },\n google: (config) => {\n const opts = config.providers?.google ?? {};\n return new GeminiProvider({ apiKey: opts.apiKey, baseUrl: opts.baseUrl });\n },\n};\n\n// ---------------------------------------------------------------------------\n// Provider Registry\n// ---------------------------------------------------------------------------\n\n/**\n * Registry for LLM providers. Holds cached provider instances and supports\n * custom provider registration.\n *\n * Usage:\n * const registry = new ProviderRegistry();\n * registry.register('custom', (config) => new MyProvider(config));\n * const { provider, model } = registry.resolve('openai:gpt-4o', config);\n */\nexport class ProviderRegistry {\n /** Cached provider instances, keyed by provider name */\n private instances = new Map<string, Provider>();\n\n /** Factory functions, keyed by provider name */\n private factories = new Map<string, ProviderFactory>();\n\n /** Fallback provider returned when no factory or instance matches */\n private fallbackInstance?: Provider;\n\n constructor() {\n // Register built-in providers\n for (const [name, factory] of Object.entries(builtinFactories)) {\n this.factories.set(name, factory);\n }\n }\n\n /**\n * Register a custom provider factory.\n * If a provider with this name already exists, it is replaced and\n * any cached instance is evicted.\n */\n register(name: string, factory: ProviderFactory): void {\n this.factories.set(name, factory);\n this.instances.delete(name); // evict stale cache\n }\n\n /**\n * Register a pre-instantiated provider directly.\n */\n registerInstance(name: string, provider: Provider): void {\n this.instances.set(name, provider);\n }\n\n /**\n * Check whether a provider with the given name is registered.\n */\n has(name: string): boolean {\n return this.factories.has(name) || this.instances.has(name);\n }\n\n /**\n * List all registered provider names.\n */\n list(): string[] {\n const names = new Set([...this.factories.keys(), ...this.instances.keys()]);\n return [...names];\n }\n\n /**\n * Set a fallback provider returned when no factory or instance matches.\n * Useful for testing where a single mock provider covers all agents.\n */\n setFallback(provider: Provider): void {\n this.fallbackInstance = provider;\n }\n\n /**\n * Get a provider instance by name, creating it lazily via its factory.\n */\n get(name: string, config: AxlConfig = {}): Provider {\n // Return cached instance if available\n const cached = this.instances.get(name);\n if (cached) return cached;\n\n // Create via factory\n const factory = this.factories.get(name);\n if (factory) {\n const instance = factory(config);\n this.instances.set(name, instance);\n return instance;\n }\n\n // Fall back to the fallback provider if set\n if (this.fallbackInstance) {\n return this.fallbackInstance;\n }\n\n throw new Error(`Unknown provider \"${name}\". Registered providers: ${this.list().join(', ')}`);\n }\n\n /**\n * Resolve a \"provider:model\" URI string into a Provider instance and model name.\n *\n * Supported formats:\n * - \"openai:gpt-4o\" -> provider=openai, model=gpt-4o\n * - \"anthropic:claude-3\" -> provider=anthropic, model=claude-3\n * - \"gpt-4o\" -> uses defaultProvider from config, model=gpt-4o\n * - undefined / empty -> uses defaultProvider and defaultModel from config\n *\n * @param uri Provider:model string, or just a model name\n * @param config Axl configuration for provider options and defaults\n */\n resolve(uri: string | undefined, config: AxlConfig = {}): ResolvedProvider {\n if (!uri) {\n // Fall back to config defaults\n const providerName = config.defaultProvider ?? 'openai';\n const model = config.defaultModel ?? 'gpt-4o';\n return { provider: this.get(providerName, config), model };\n }\n\n const colonIndex = uri.indexOf(':');\n\n if (colonIndex === -1) {\n // No colon -> treat entire string as model name, use default provider\n const providerName = config.defaultProvider ?? 'openai';\n return { provider: this.get(providerName, config), model: uri };\n }\n\n const providerName = uri.slice(0, colonIndex);\n const model = uri.slice(colonIndex + 1);\n\n if (!providerName || !model) {\n throw new Error(\n `Invalid provider URI \"${uri}\". Expected format: \"provider:model\" (e.g. \"openai:gpt-4o\")`,\n );\n }\n\n return { provider: this.get(providerName, config), model };\n }\n\n /**\n * Clear all cached provider instances. Useful for testing or reconfiguration.\n */\n clearCache(): void {\n this.instances.clear();\n }\n\n /**\n * Clear all registered factories (including built-ins).\n * Useful for test runtimes where only explicitly registered instances should be used.\n */\n clearFactories(): void {\n this.factories.clear();\n }\n}\n\n// ---------------------------------------------------------------------------\n// Default singleton registry\n// ---------------------------------------------------------------------------\n\n/**\n * Default global provider registry.\n * Import this for convenience; create your own ProviderRegistry for isolation.\n */\nexport const defaultRegistry = new ProviderRegistry();\n\n/**\n * Convenience function: resolve a provider:model URI using the default registry.\n */\nexport function resolveProvider(uri: string | undefined, config: AxlConfig = {}): ResolvedProvider {\n return defaultRegistry.resolve(uri, config);\n}\n","import { AsyncLocalStorage } from 'node:async_hooks';\nimport { randomUUID } from 'node:crypto';\nimport { z, ZodError } from 'zod';\nimport type {\n Result,\n BudgetResult,\n HumanDecision,\n BudgetOptions,\n MapOptions,\n SpawnOptions,\n VoteOptions,\n VerifyOptions,\n AwaitHumanOptions,\n AskOptions,\n DelegateOptions,\n RaceOptions,\n AxlEvent,\n CallbackMeta,\n ChatMessage,\n ToolCallMessage,\n ProviderResponse,\n AgentCallInfo,\n AgentCallParams,\n ValidateResult,\n VerifyRetry,\n} from './types.js';\nimport {\n VerifyError,\n QuorumNotMet,\n NoConsensus,\n TimeoutError,\n MaxTurnsError,\n BudgetExceededError,\n GuardrailError,\n ValidationError,\n} from './errors.js';\nimport type { Agent } from './agent.js';\nimport { parsePartialJson } from './partial-json.js';\nimport { COST_BEARING_LEAF_TYPES } from './event-utils.js';\nimport { redactEvent } from './redaction.js';\nimport type { Provider, ChatOptions, ToolDefinition } from './providers/types.js';\nimport type { ProviderRegistry } from './providers/registry.js';\nimport type { AxlConfig } from './config.js';\nimport { parseDuration, parseCost } from './config.js';\nimport type { StateStore } from './state/types.js';\nimport type { McpManager } from './mcp/manager.js';\nimport type { SpanManager } from './telemetry/types.js';\nimport type { MemoryManager } from './memory/manager.js';\nimport type { RememberOptions, RecallOptions, VectorResult } from './memory/types.js';\n\n/**\n * AsyncLocalStorage for per-branch abort signals.\n * Used by race/spawn/map/budget to thread signals through async contexts\n * without mutating shared state on the WorkflowContext instance.\n */\nconst signalStorage = new AsyncLocalStorage<AbortSignal>();\n\n/**\n * Per-ask frame propagated via AsyncLocalStorage.\n *\n * - `askId` / `depth` / `agent`: identify the ask this event belongs to so\n * consumers can group, indent, and link nested asks without consulting\n * parent context.\n * - `parentAskId`: set on every nested frame so the consumer can reconstruct\n * the ask tree; absent on the root ask.\n * - `stepRef`: a single mutable counter shared across the entire execution\n * (root ask + every nested ask + every branch primitive). Atomically\n * incremented on each event emission so `event.step` is monotonic across\n * the whole tree, not per-context.\n */\ntype AskFrame = {\n askId: string;\n parentAskId?: string;\n depth: number;\n agent?: string;\n stepRef: { value: number };\n /**\n * Cost incurred by THIS ask only — agent_call_end + tool_call_end events\n * emitted within this frame (NOT including nested asks, which have their\n * own frame and own counter). `emitEvent` increments this on every event\n * that carries `cost` as long as the event's frame matches `this`. Read\n * by `ask_end` to populate `cost` per spec decision 10.\n */\n askCost: { value: number };\n};\nconst askStorage = new AsyncLocalStorage<AskFrame>();\n\n/** Convert a Zod schema to JSON Schema. Exported for Studio tool introspection.\n * Wraps Zod v4's built-in `z.toJSONSchema()`, stripping the `$schema` key\n * since tool parameter schemas are embedded objects, not standalone documents. */\nexport function zodToJsonSchema(schema: z.ZodType): Record<string, unknown> {\n const result = z.toJSONSchema(schema, { unrepresentable: 'any' }) as Record<string, unknown>;\n delete result.$schema;\n return result;\n}\n\n/** Simple token estimator: ~4 chars per token. Good enough for context management. */\nfunction estimateTokens(text: string): number {\n return Math.ceil(text.length / 4);\n}\n\n/**\n * Extract JSON from LLM response content.\n * Handles: raw JSON, markdown fenced blocks (```json ... ```),\n * and content with leading/trailing text around a JSON object/array.\n */\nexport function extractJson(content: string): string {\n const trimmed = content.trim();\n\n // Content starts with { or [ — extract balanced JSON (handles trailing text)\n if (trimmed.startsWith('{')) {\n return extractBalanced(trimmed, 0, '{', '}') ?? trimmed;\n }\n if (trimmed.startsWith('[')) {\n return extractBalanced(trimmed, 0, '[', ']') ?? trimmed;\n }\n\n // Extract from markdown fenced code block\n const fenceMatch = trimmed.match(/```(?:json)?\\s*\\n?([\\s\\S]*?)\\n?\\s*```/);\n if (fenceMatch) {\n return fenceMatch[1].trim();\n }\n\n // Find the first balanced { ... } or [ ... ]\n const open = trimmed.indexOf('{');\n if (open >= 0) {\n const extracted = extractBalanced(trimmed, open, '{', '}');\n if (extracted) return extracted;\n }\n\n const openBracket = trimmed.indexOf('[');\n if (openBracket >= 0) {\n const extracted = extractBalanced(trimmed, openBracket, '[', ']');\n if (extracted) return extracted;\n }\n\n // Nothing found — return as-is and let JSON.parse produce the error\n return trimmed;\n}\n\n/** Extract a balanced substring from `start` matching open/close chars, respecting JSON strings. */\nfunction extractBalanced(\n str: string,\n start: number,\n openChar: string,\n closeChar: string,\n): string | null {\n let depth = 0;\n let inString = false;\n let escape = false;\n for (let i = start; i < str.length; i++) {\n const ch = str[i];\n if (escape) {\n escape = false;\n continue;\n }\n if (ch === '\\\\' && inString) {\n escape = true;\n continue;\n }\n if (ch === '\"') {\n inString = !inString;\n continue;\n }\n if (inString) continue;\n if (ch === openChar) depth++;\n else if (ch === closeChar) {\n depth--;\n if (depth === 0) return str.slice(start, i + 1);\n }\n }\n return null;\n}\n\n/** Estimate tokens for a message array. */\n/**\n * Append the assistant's failed attempt and the corrective feedback message to\n * the conversation so the next LLM turn sees both. Shared across guardrail,\n * schema_check, and validate retry paths — keeps the exact message shape in\n * one place so fixes (e.g. preserving providerMetadata for Gemini) apply to\n * all three gates at once.\n */\nfunction appendRetryMessages(\n messages: ChatMessage[],\n content: string,\n feedbackMessage: string,\n providerMetadata?: Record<string, unknown>,\n): void {\n messages.push({\n role: 'assistant',\n content,\n ...(providerMetadata ? { providerMetadata } : {}),\n });\n messages.push({ role: 'system', content: feedbackMessage });\n}\n\nfunction estimateMessagesTokens(messages: ChatMessage[]): number {\n let total = 0;\n for (const msg of messages) {\n total += estimateTokens(msg.content);\n if (msg.tool_calls) {\n for (const tc of msg.tool_calls) {\n total += estimateTokens(tc.function.name + tc.function.arguments);\n }\n }\n total += 4; // per-message overhead (role, separators)\n }\n return total;\n}\n\nexport type WorkflowContextInit = {\n input: unknown;\n executionId: string;\n metadata?: Record<string, unknown>;\n config: AxlConfig;\n providerRegistry: ProviderRegistry;\n sessionHistory?: ChatMessage[];\n onTrace?: (event: AxlEvent) => void;\n /** Per-token streaming callback. `meta` carries `askId`/`parentAskId`/\n * `depth`/`agent` so consumers can route or filter (e.g., `meta.depth === 0`\n * for root-only chat UIs). */\n onToken?: (token: string, meta: CallbackMeta) => void;\n /** Pre-execution tool-call callback. `meta` carries the ask correlation. */\n onToolCall?: (call: { name: string; args: unknown; callId?: string }, meta: CallbackMeta) => void;\n pendingDecisions?: Map<string, (d: HumanDecision) => void>;\n budgetContext?: {\n totalCost: number;\n limit: number;\n exceeded: boolean;\n policy: string;\n abortController?: AbortController;\n };\n stateStore?: StateStore;\n signal?: AbortSignal;\n workflowName?: string;\n mcpManager?: McpManager;\n /** SpanManager for OpenTelemetry instrumentation. */\n spanManager?: SpanManager;\n /** MemoryManager for ctx.remember() / ctx.recall() operations. */\n memoryManager?: MemoryManager;\n /** When true, the context replays from checkpoints before executing. */\n resumeMode?: boolean;\n /** Override tool handlers by name. Bypasses normal tool lookup in executeAgentCall. */\n toolOverrides?: Map<string, (args: unknown) => Promise<unknown>>;\n /** Handler for awaitHuman — when set, returns immediately instead of waiting for pendingDecisions. */\n awaitHumanHandler?: (options: AwaitHumanOptions) => HumanDecision | Promise<HumanDecision>;\n /** Callback fired when an agent LLM call is about to start. */\n onAgentStart?: (info: { agent: string; model: string }, meta: CallbackMeta) => void;\n /** Callback fired after each ctx.ask() completes (once per ask invocation). */\n onAgentCallComplete?: (call: AgentCallInfo) => void;\n /** Internal: shared auto-checkpoint counters. Set by `createChildContext`\n * so parent + child share the same number space, preventing checkpoint\n * store key collisions across nested `WorkflowContext` instances.\n *\n * - `byAgent` — per-agent counter for `ctx.ask` auto-checkpoints; each\n * agent's first ask gets `0`, second gets `1`, etc. Composed name:\n * `__auto/<agent>/ask/<n>`. Reads naturally as \"orchestrator's first\n * ask, second ask…\" instead of a global ordinal.\n * - `root` — counter for `ctx.spawn` / `race` / `parallel` / `map`\n * wrappers, which don't have an agent context (they wrap arbitrary\n * fn callbacks). Composed name: `__auto/<primitive>/<n>`.\n *\n * Root contexts default to a fresh `{ byAgent: new Map(), root: 0 }`. */\n autoCheckpointCounters?: { byAgent: Map<string, number>; root: number };\n};\n\n/**\n * The central coordination object for all Axl primitives.\n * Carries execution state, tracing, budget tracking, and session history.\n */\nexport class WorkflowContext<TInput = unknown> {\n readonly input: TInput;\n readonly executionId: string;\n readonly metadata: Record<string, unknown>;\n\n /**\n * Total cost accumulated by agent calls in this context.\n * Inside a `ctx.budget()` block, returns only that block's cost.\n * After the block completes, the nested cost is rolled up into the parent total.\n */\n get totalCost(): number {\n return this.budgetContext?.totalCost ?? 0;\n }\n\n private config: AxlConfig;\n private providerRegistry: ProviderRegistry;\n private sessionHistory: ChatMessage[];\n private onTrace?: (event: AxlEvent) => void;\n private onToken?: (token: string, meta: CallbackMeta) => void;\n private onToolCall?: (\n call: { name: string; args: unknown; callId?: string },\n meta: CallbackMeta,\n ) => void;\n private pendingDecisions?: Map<string, (d: HumanDecision) => void>;\n private budgetContext?: {\n totalCost: number;\n limit: number;\n exceeded: boolean;\n policy: string;\n abortController?: AbortController;\n };\n private stateStore?: StateStore;\n /** Root step counter for this execution. Inherited by every ctx.ask()\n * frame so all events from this WorkflowContext (root + nested) share\n * a single monotonic counter, even when concurrent branch primitives\n * fire asks before any single parent ask exists. Per-instance so\n * separate executions don't cross-talk. */\n private stepRefRoot: { value: number } = { value: 0 };\n /**\n * Auto-checkpoint counters for internal `_checkpoint` callers. Held by\n * reference so child contexts created via `createChildContext` share\n * the same number space — otherwise a tool handler's nested `ctx.ask()`\n * (which auto-checkpoints) would collide with the parent's\n * auto-checkpoints in the state store. See `WorkflowContextInit\n * .autoCheckpointCounters` for the per-agent vs root split.\n * User-facing `ctx.checkpoint(name, fn)` requires an explicit name and\n * does NOT touch these counters — it goes straight to the store under\n * the caller-supplied key.\n */\n private autoCheckpointCounters: { byAgent: Map<string, number>; root: number };\n /** Idempotency guards for `workflow_start` / `workflow_end` emission.\n * Both `runtime.execute()` and `runtime.stream()` have paths where a\n * post-emit side-effect (checkpoint deletion, state-store persistence)\n * can throw AFTER `_emitWorkflowEnd({status: 'completed'})` has already\n * fired — the outer catch would then fire `_emitWorkflowEnd({status:\n * 'failed'})` for a second time. These flags make both emitters\n * single-fire so consumers never see paired-then-conflicting terminal\n * events for one execution. */\n private _workflowStartEmitted = false;\n private _workflowEndEmitted = false;\n private signal?: AbortSignal;\n private summaryCache?: string;\n private workflowName?: string;\n private mcpManager?: McpManager;\n private spanManager?: SpanManager;\n private memoryManager?: MemoryManager;\n private resumeMode: boolean;\n private toolOverrides?: Map<string, (args: unknown) => Promise<unknown>>;\n private awaitHumanHandler?: (\n options: AwaitHumanOptions,\n ) => HumanDecision | Promise<HumanDecision>;\n private onAgentStart?: (info: { agent: string; model: string }, meta: CallbackMeta) => void;\n private onAgentCallComplete?: (call: AgentCallInfo) => void;\n constructor(init: WorkflowContextInit) {\n this.input = init.input as TInput;\n this.executionId = init.executionId;\n this.metadata = init.metadata ?? {};\n this.config = init.config;\n this.providerRegistry = init.providerRegistry;\n this.sessionHistory = init.sessionHistory ?? [];\n this.onTrace = init.onTrace;\n this.onToken = init.onToken;\n this.onToolCall = init.onToolCall;\n this.pendingDecisions = init.pendingDecisions;\n this.budgetContext = init.budgetContext;\n this.stateStore = init.stateStore;\n this.signal = init.signal;\n this.workflowName = init.workflowName;\n this.mcpManager = init.mcpManager;\n this.spanManager = init.spanManager;\n this.memoryManager = init.memoryManager;\n this.resumeMode = init.resumeMode ?? false;\n this.toolOverrides = init.toolOverrides;\n this.awaitHumanHandler = init.awaitHumanHandler;\n this.onAgentStart = init.onAgentStart;\n this.onAgentCallComplete = init.onAgentCallComplete;\n // Inherit auto-checkpoint counters from parent if provided; otherwise\n // start a fresh ref. Shared by reference so child contexts increment\n // the same counters and never collide with the parent in the store.\n this.autoCheckpointCounters = init.autoCheckpointCounters ?? {\n byAgent: new Map(),\n root: 0,\n };\n // Restore cached summary from session metadata (survives across requests)\n if (init.metadata?.summaryCache) {\n this.summaryCache = init.metadata.summaryCache as string;\n }\n }\n\n /**\n * Create a child context for nested agent invocations (e.g., agent-as-tool).\n * Shares: budget tracking, abort signals, trace emission, provider registry,\n * state store, span manager, memory manager, MCP manager, config,\n * awaitHuman handler, pending decisions, tool overrides, AND the\n * streaming callbacks (onToken / onAgentStart / onToolCall).\n * Isolates: session history.\n *\n * Streaming callbacks now propagate into nested asks because every callback\n * invocation carries `meta.askId`/`meta.parentAskId`/`meta.depth` so\n * consumers that want root-only behavior can filter on `meta.depth === 0`\n * instead of relying on the runtime to drop nested events. This is the\n * \"nested ask visibility\" fix from spec §3.2.\n *\n * The shared step counter lives in `askStorage` (ALS), so there is no\n * per-context counter to pass through anymore. Nested events are\n * correlated to their parent via `parentAskId` (set on every nested ask\n * by ALS frame allocation) — the deprecated `parentToolCallId` field\n * was removed in 0.16.0.\n */\n createChildContext(): WorkflowContext {\n return new WorkflowContext({\n input: this.input,\n executionId: this.executionId,\n config: this.config,\n providerRegistry: this.providerRegistry,\n metadata: { ...this.metadata },\n // Shared infrastructure\n budgetContext: this.budgetContext,\n stateStore: this.stateStore,\n mcpManager: this.mcpManager,\n spanManager: this.spanManager,\n memoryManager: this.memoryManager,\n onTrace: this.onTrace,\n onToken: this.onToken,\n onToolCall: this.onToolCall,\n onAgentStart: this.onAgentStart,\n onAgentCallComplete: this.onAgentCallComplete,\n awaitHumanHandler: this.awaitHumanHandler,\n pendingDecisions: this.pendingDecisions,\n toolOverrides: this.toolOverrides,\n signal: this.signal,\n workflowName: this.workflowName,\n // Share the parent's auto-checkpoint counters so internal checkpoints\n // emitted from `ctx.ask` / spawn / race / parallel / map in this\n // child context don't collide with the parent's in the state store.\n autoCheckpointCounters: this.autoCheckpointCounters,\n // Isolated: sessionHistory (empty)\n });\n }\n\n /**\n * Resolve the current abort signal.\n * Branch-scoped signals (from race/spawn/map/budget) in AsyncLocalStorage\n * take priority over the instance-level signal.\n */\n private get currentSignal(): AbortSignal | undefined {\n return signalStorage.getStore() ?? this.signal;\n }\n\n /**\n * Build a `CallbackMeta` for the current ask frame. Used at every\n * `onToken`/`onToolCall`/`onAgentStart` call site so consumers can\n * route or filter by ask correlation (`meta.depth === 0` for root\n * chat UIs, etc.).\n *\n * If the call is somehow outside an ask frame (e.g., a programmatic\n * `tool.run()` test harness), falls back to a synthetic meta keyed off\n * `executionId` so the type contract holds — consumers see `depth: 0`\n * and can ignore those events.\n */\n private currentCallbackMeta(agentName: string): CallbackMeta {\n const frame = askStorage.getStore();\n if (frame) {\n return {\n askId: frame.askId,\n ...(frame.parentAskId ? { parentAskId: frame.parentAskId } : {}),\n depth: frame.depth,\n agent: agentName,\n };\n }\n return { askId: this.executionId, depth: 0, agent: agentName };\n }\n\n // ── ctx.ask() ─────────────────────────────────────────────────────────\n\n async ask<T = string>(agent: Agent, prompt: string, options?: AskOptions<T>): Promise<T> {\n const agentName = agent._name;\n return this._checkpoint(\n this._autoCheckpointName('ask', agentName),\n async () => {\n // Allocate the ask frame BEFORE entering askStorage.run so the\n // emitEvent calls inside the run() callback see the new frame in ALS.\n const parentFrame = askStorage.getStore();\n const askId = randomUUID();\n const depth = (parentFrame?.depth ?? -1) + 1;\n // Nested asks inherit the parent frame's counter; top-level asks\n // share the WorkflowContext's instance-level `stepRefRoot` so all\n // top-level asks (including concurrent ones from spawn / parallel /\n // race) share a single monotonic counter. Spec §3.7.\n const stepRef = parentFrame?.stepRef ?? this.stepRefRoot;\n const frame: AskFrame = {\n askId,\n parentAskId: parentFrame?.askId,\n depth,\n agent: agent._name,\n stepRef,\n askCost: { value: 0 },\n };\n\n return askStorage.run(frame, async () => {\n const askStart = Date.now();\n this.emitEvent({ type: 'ask_start', prompt });\n\n // `costBefore` snapshots the global budget so we can pass the per-ask\n // cost delta to onAgentCallComplete (legacy callback that reports the\n // whole-tree spend). `frame.askCost` is the spec-correct, this-ask-only\n // figure used on `ask_end` (decision 10).\n const costBefore = this.budgetContext?.totalCost ?? 0;\n const resolveCtx = options?.metadata\n ? { metadata: { ...this.metadata, ...options.metadata } }\n : { metadata: this.metadata };\n\n // Use a mutable container to capture usage from executeAgentCall\n // without relying on an instance property (which is racy under\n // concurrent calls).\n const usageCapture: {\n value?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n cached_tokens?: number;\n };\n } = {};\n\n const doCall = async () => {\n const result = await this.executeAgentCall(\n agent,\n prompt,\n options as AskOptions<unknown>,\n undefined,\n usageCapture,\n );\n return result as T;\n };\n\n // Spec decision 9 invariant: every `ask_start` has a matching\n // `ask_end`. Implemented via try/finally so ANY exit path —\n // current catches (gate exhaustion, budget, abort) AND any\n // future failure path added between `ask_start` and the\n // success emit — surfaces as `ask_end`. The workflow-level\n // `error` event is reserved for failures with no ask_end\n // available; consumers must never see both for the same failure.\n let outcome: { ok: true; result: T } | { ok: false; error: string } | undefined;\n try {\n const result: T = this.spanManager\n ? await this.spanManager.withSpanAsync(\n 'axl.agent.ask',\n {\n 'axl.agent.name': agent._name,\n 'axl.agent.model': agent.resolveModel(resolveCtx),\n },\n async (span) => {\n const r = await doCall();\n const costAfter = this.budgetContext?.totalCost ?? 0;\n span.setAttribute('axl.agent.cost', costAfter - costBefore);\n span.setAttribute('axl.agent.duration', Date.now() - askStart);\n if (usageCapture.value) {\n span.setAttribute(\n 'axl.agent.prompt_tokens',\n usageCapture.value.prompt_tokens,\n );\n span.setAttribute(\n 'axl.agent.completion_tokens',\n usageCapture.value.completion_tokens,\n );\n if (usageCapture.value.cached_tokens)\n span.setAttribute(\n 'axl.agent.cached_tokens',\n usageCapture.value.cached_tokens,\n );\n }\n return r;\n },\n )\n : await doCall();\n outcome = { ok: true, result };\n\n // Success path: invoke the legacy onAgentCallComplete hook.\n // Isolate consumer bugs (mirror the onTrace pattern at\n // emitEvent): a hook throw is post-success observability —\n // the agent's run already succeeded, so we must NOT\n // overwrite the outcome to ok:false. Swallow + console.error\n // so reliability dashboards keyed off ask_end.outcome aren't\n // poisoned by hook bugs.\n const costAfter = this.budgetContext?.totalCost ?? 0;\n if (this.onAgentCallComplete) {\n try {\n this.onAgentCallComplete({\n agent: agent._name,\n prompt,\n response: typeof result === 'string' ? result : JSON.stringify(result),\n model: agent.resolveModel(resolveCtx),\n cost: costAfter - costBefore,\n duration: Date.now() - askStart,\n promptVersion: agent._config.version,\n temperature: options?.temperature ?? agent._config.temperature,\n maxTokens: options?.maxTokens ?? agent._config.maxTokens ?? 4096,\n effort: options?.effort ?? agent._config.effort,\n thinkingBudget: options?.thinkingBudget ?? agent._config.thinkingBudget,\n includeThoughts: options?.includeThoughts ?? agent._config.includeThoughts,\n toolChoice: options?.toolChoice ?? agent._config.toolChoice,\n stop: options?.stop ?? agent._config.stop,\n providerOptions: options?.providerOptions ?? agent._config.providerOptions,\n });\n } catch (hookErr) {\n console.error(\n '[axl] onAgentCallComplete hook threw; ask outcome unchanged:',\n hookErr instanceof Error ? hookErr.message : String(hookErr),\n );\n }\n }\n return result;\n } catch (err) {\n outcome = {\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n };\n throw err;\n } finally {\n // Defensive: `outcome` is always set by either the success\n // or catch branch above. The fallback covers an internal\n // bug (e.g., a future synchronous throw before either\n // branch runs) so we never silently drop the ask_end event.\n this.emitEvent({\n type: 'ask_end',\n outcome:\n outcome ??\n ({\n ok: false,\n error: 'ask_end emitted without outcome — internal bug',\n } as const),\n cost: frame.askCost.value,\n duration: Date.now() - askStart,\n });\n }\n });\n },\n { agent: agentName },\n );\n }\n\n private async executeAgentCall(\n agent: Agent,\n prompt: string,\n options?: AskOptions<unknown>,\n handoffMessages?: ChatMessage[],\n usageCapture?: {\n value?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n cached_tokens?: number;\n };\n },\n ): Promise<unknown> {\n // Budget check\n if (this.budgetContext?.exceeded) {\n const { limit, totalCost: spent, policy } = this.budgetContext;\n if (policy === 'warn') {\n this.emitEvent({\n type: 'log',\n data: { warning: 'Budget exceeded', limit, spent, policy },\n });\n } else if (policy === 'finish_and_stop') {\n throw new BudgetExceededError(limit, spent, policy);\n } else {\n // hard_stop: the AbortController in budget() handles in-flight cancellation.\n // This path is reached on the *next* ctx.ask() call after budget was exceeded.\n throw new BudgetExceededError(limit, spent, policy);\n }\n }\n\n // Merge workflow metadata with per-call metadata (per-call takes precedence)\n const resolveCtx = options?.metadata\n ? { metadata: { ...this.metadata, ...options.metadata } }\n : { metadata: this.metadata };\n const modelUri = agent.resolveModel(resolveCtx);\n const systemPrompt = agent.resolveSystem(resolveCtx);\n const { provider, model } = this.providerRegistry.resolve(modelUri, this.config);\n\n // Resolve dynamic handoffs once per call to ensure consistency\n // between tool definitions and handoff lookup within the same turn.\n let resolvedHandoffs:\n | Array<{ agent: Agent; description?: string; mode?: 'oneway' | 'roundtrip' }>\n | undefined;\n if (typeof agent._config.handoffs === 'function') {\n try {\n resolvedHandoffs = agent._config.handoffs(resolveCtx);\n } catch (err) {\n this.log('handoff_resolve_error', {\n agent: agent._name,\n error: err instanceof Error ? err.message : String(err),\n });\n resolvedHandoffs = undefined;\n }\n } else {\n resolvedHandoffs = agent._config.handoffs;\n }\n\n // Build tool definitions\n const toolDefs = this.buildToolDefs(agent, resolvedHandoffs);\n\n // Build messages\n const messages: ChatMessage[] = [];\n if (systemPrompt) {\n messages.push({ role: 'system', content: systemPrompt });\n }\n\n // Include session history (with context window management)\n const maxContext = agent._config.maxContext;\n if (maxContext && this.sessionHistory.length > 0) {\n const reserveTokens = this.config.contextManagement?.reserveTokens ?? 2000;\n const systemTokens = systemPrompt ? estimateTokens(systemPrompt) : 0;\n const toolTokens = toolDefs.length > 0 ? estimateTokens(JSON.stringify(toolDefs)) : 0;\n const overhead = systemTokens + toolTokens + reserveTokens;\n const availableForHistory = maxContext - overhead;\n\n const historyTokens = estimateMessagesTokens(this.sessionHistory);\n if (historyTokens > availableForHistory) {\n // Need to summarize: find the split point\n const summarizedMessages = await this.summarizeHistory(\n provider,\n model,\n this.sessionHistory,\n availableForHistory,\n );\n for (const msg of summarizedMessages) {\n messages.push(msg);\n }\n } else {\n for (const msg of this.sessionHistory) {\n messages.push(msg);\n }\n }\n } else {\n for (const msg of this.sessionHistory) {\n messages.push(msg);\n }\n }\n\n // Build user prompt\n let userContent = prompt;\n if (options?.schema) {\n const jsonSchema = zodToJsonSchema(options.schema as z.ZodType);\n userContent += `\\n\\nRespond with valid JSON matching this schema:\\n${JSON.stringify(jsonSchema, null, 2)}`;\n }\n\n messages.push({ role: 'user', content: userContent });\n\n // If this agent was reached via handoff, include the source agent's conversation\n if (handoffMessages && handoffMessages.length > 0) {\n // Inject handoff context as a system message summarizing the source agent's work,\n // then append the raw tool-call exchanges so the target agent has full context.\n const handoffContext = handoffMessages.filter(\n (m) => m.role === 'assistant' || m.role === 'tool',\n );\n if (handoffContext.length > 0) {\n messages.push({\n role: 'system',\n content:\n 'The following is the conversation history from the previous agent that handed off to you:',\n });\n for (const msg of handoffContext) {\n // Flatten tool messages into user messages to avoid protocol issues\n const content =\n msg.role === 'tool'\n ? `[Tool result for ${msg.tool_call_id}]: ${msg.content}`\n : msg.content;\n // Skip empty content (e.g. assistant messages with only tool calls)\n if (!content) continue;\n messages.push({ role: 'user', content });\n }\n }\n }\n\n // -- Input guardrail --\n const guardrails = agent._config.guardrails;\n if (guardrails?.input) {\n const inputResult = await guardrails.input(prompt, { metadata: this.metadata });\n this.emitEvent({\n type: 'guardrail',\n agent: agent._name,\n data: {\n guardrailType: 'input',\n blocked: inputResult.block,\n ...(inputResult.reason ? { reason: inputResult.reason } : {}),\n // Input guardrails can't retry (prompt is user-supplied), so attempt\n // and maxAttempts are always 1 — emit them for shape consistency with\n // output guardrails so consumers don't need two narrowers.\n attempt: 1,\n maxAttempts: 1,\n },\n });\n this.spanManager?.addEventToActiveSpan('axl.guardrail.check', {\n 'axl.guardrail.type': 'input',\n 'axl.guardrail.blocked': inputResult.block,\n 'axl.guardrail.attempt': 1,\n 'axl.guardrail.maxAttempts': 1,\n ...(inputResult.reason ? { 'axl.guardrail.reason': inputResult.reason } : {}),\n });\n if (inputResult.block) {\n const onBlock = guardrails.onBlock ?? 'throw';\n if (typeof onBlock === 'function') {\n return onBlock(inputResult.reason ?? 'Input blocked by guardrail', {\n metadata: this.metadata,\n });\n }\n // 'retry' behaves as 'throw' for input guardrails (prompt is user-supplied, can't retry)\n throw new GuardrailError('input', inputResult.reason ?? 'Input blocked by guardrail');\n }\n }\n\n const maxTurns = agent._config.maxTurns ?? 25;\n const timeoutMs = parseDuration(agent._config.timeout ?? '60s');\n const startTime = Date.now();\n\n // Streaming + validate is supported as of the unified event model\n // (spec §4.1). With pipeline events landing in PR 2, retry boundaries\n // are visible to consumers via `pipeline(status: 'failed' | 'committed')`\n // and `AxlStream.fullText` only commits the winning attempt's tokens.\n // Until pipeline events ship, retried tokens still concatenate; the\n // tradeoff is acceptable because the throw was a worse failure mode\n // (refused to run a valid configuration).\n\n const currentMessages = [...messages];\n let turns = 0;\n let guardrailOutputRetries = 0;\n let schemaRetries = 0;\n let validateRetries = 0;\n const maxGuardrailRetries = guardrails?.maxRetries ?? 2;\n // Set before `continue`ing to a retry turn; read when emitting the next\n // agent_call so consumers can see *why* a given LLM call is a retry.\n let pendingRetryReason: 'schema' | 'validate' | 'guardrail' | undefined;\n // `trace.level === 'full'` opts into verbose traces: we include the full ChatMessage[]\n // snapshot on each agent_call so the trace explorer can reconstruct exactly what the\n // model saw (growing with tool results + retry feedback across turns).\n const verboseTrace = this.config.trace?.level === 'full';\n\n // Track the most recent pipeline `start` so the terminal `committed`\n // event can carry the matching stage/attempt/maxAttempts. Spec §4.2.\n let lastStartStage: 'initial' | 'schema' | 'validate' | 'guardrail' = 'initial';\n let lastStartAttempt = 1;\n let lastStartMaxAttempts = 1;\n\n while (turns < maxTurns) {\n // Timeout check\n if (Date.now() - startTime > timeoutMs) {\n throw new TimeoutError('ctx.ask()', timeoutMs);\n }\n\n turns++;\n // Emit pipeline `start` only on the FIRST turn of the ask OR when\n // entering a gate-rejection retry. Tool-calling continuations\n // within the same ask do NOT produce additional starts — they're\n // agent-loop iterations, not retry attempts. Spec §4.2 invariant.\n const isFirstTurn = turns === 1;\n const isRetryTurn = pendingRetryReason !== undefined;\n if (isFirstTurn || isRetryTurn) {\n const stage: 'initial' | 'schema' | 'validate' | 'guardrail' =\n pendingRetryReason ?? 'initial';\n let pipelineAttempt = 1;\n let pipelineMaxAttempts = 1;\n if (stage === 'guardrail') {\n pipelineAttempt = guardrailOutputRetries + 1;\n pipelineMaxAttempts = maxGuardrailRetries + 1;\n } else if (stage === 'schema') {\n pipelineAttempt = schemaRetries + 1;\n pipelineMaxAttempts = (options?.retries ?? 3) + 1;\n } else if (stage === 'validate') {\n pipelineAttempt = validateRetries + 1;\n pipelineMaxAttempts = (options?.validateRetries ?? 2) + 1;\n }\n lastStartStage = stage;\n lastStartAttempt = pipelineAttempt;\n lastStartMaxAttempts = pipelineMaxAttempts;\n this.emitEvent({\n type: 'pipeline',\n agent: agent._name,\n status: 'start',\n stage,\n attempt: pipelineAttempt,\n maxAttempts: pipelineMaxAttempts,\n });\n }\n // Per-turn start time for accurate `duration` on each agent_call event.\n // `startTime` above is the start of the entire ask() call; without this,\n // turn N's duration would include all prior turns' latency and gates.\n const turnStart = Date.now();\n\n const chatOptions: ChatOptions = {\n model,\n temperature: options?.temperature ?? agent._config.temperature,\n tools: toolDefs.length > 0 ? toolDefs : undefined,\n maxTokens: options?.maxTokens ?? agent._config.maxTokens ?? 4096,\n effort: options?.effort ?? agent._config.effort,\n thinkingBudget: options?.thinkingBudget ?? agent._config.thinkingBudget,\n includeThoughts: options?.includeThoughts ?? agent._config.includeThoughts,\n toolChoice: options?.toolChoice ?? agent._config.toolChoice,\n stop: options?.stop ?? agent._config.stop,\n providerOptions: options?.providerOptions ?? agent._config.providerOptions,\n signal: this.currentSignal,\n };\n\n // If schema requested and no tools, use JSON mode\n if (options?.schema && toolDefs.length === 0) {\n chatOptions.responseFormat = { type: 'json_object' };\n }\n\n const callbackMeta = this.currentCallbackMeta(agent._name);\n\n // Build the request-side payload BEFORE the call. Everything here is\n // known at dispatch time, so consumers see \"what's being asked\" the\n // moment the call leaves the runtime — they don't have to wait for a\n // response (or a hung connection) to inspect prompt/system/params.\n const callParams: AgentCallParams = {\n ...(chatOptions.temperature !== undefined ? { temperature: chatOptions.temperature } : {}),\n maxTokens: chatOptions.maxTokens,\n ...(chatOptions.effort !== undefined ? { effort: chatOptions.effort } : {}),\n ...(chatOptions.thinkingBudget !== undefined\n ? { thinkingBudget: chatOptions.thinkingBudget }\n : {}),\n ...(chatOptions.includeThoughts !== undefined\n ? { includeThoughts: chatOptions.includeThoughts }\n : {}),\n ...(chatOptions.toolChoice !== undefined ? { toolChoice: chatOptions.toolChoice } : {}),\n ...(chatOptions.stop !== undefined ? { stop: chatOptions.stop } : {}),\n };\n\n // Verbose-mode message snapshot — clone defensively so post-call\n // mutations (tool results, retry feedback) don't bleed back into the\n // already-emitted event.\n let messagesSnapshot: ChatMessage[] | undefined;\n if (verboseTrace) {\n try {\n messagesSnapshot = structuredClone(currentMessages);\n } catch (err) {\n console.warn(\n '[axl] verbose trace messages snapshot failed to clone; emitting shallow copy:',\n err instanceof Error ? err.message : String(err),\n );\n messagesSnapshot = [...currentMessages];\n }\n }\n\n // Capture-and-clear pendingRetryReason BEFORE start so both start and\n // end carry the same retryReason for this turn.\n const retryReason = pendingRetryReason;\n pendingRetryReason = undefined;\n\n this.emitEvent({\n type: 'agent_call_start',\n agent: agent._name,\n model: modelUri,\n turn: turns,\n data: {\n prompt,\n ...(systemPrompt ? { system: systemPrompt } : {}),\n params: callParams,\n turn: turns,\n ...(retryReason ? { retryReason } : {}),\n ...(toolDefs.length > 0 ? { toolNames: toolDefs.map((t) => t.function.name) } : {}),\n ...(messagesSnapshot ? { messages: messagesSnapshot } : {}),\n },\n });\n this.onAgentStart?.({ agent: agent._name, model: modelUri }, callbackMeta);\n\n let response: ProviderResponse;\n\n // Provider call wrapped so any throw still emits a paired\n // `agent_call_end` — consumers (Studio waterfall, cost rollup, AsyncLocalStorage\n // accumulators) rely on the start/end pair invariant. Without this, a\n // provider 5xx or abort leaves an orphan start in the trace and the\n // ask_end / workflow_end terminal events still fire — but downstream\n // groupers never see the close, so per-ask cost rollup and ask-tree\n // reconstruction silently drift. We rethrow after emit so the existing\n // ask-loop error handling (ask_end({ok:false}), MaxTurnsError, etc.) is\n // unchanged.\n try {\n if (this.onToken) {\n // Use streaming to emit tokens in real-time\n let content = '';\n const toolCalls: ToolCallMessage[] = [];\n const toolCallBuffers = new Map<\n string,\n { id: string; name: string; arguments: string }\n >();\n let streamProviderMetadata: Record<string, unknown> | undefined;\n\n let thinkingContent = '';\n\n // partial_object emission gating (spec §4.2):\n // - schema is set\n // - no tools (JSON-mode response, not tool-calling)\n // - schema root is a ZodObject (only object roots get partials)\n // Structural-boundary throttle: emit when we cross a `,`, `}`, or\n // `]` that is OUTSIDE a string literal. A naive \"last char of\n // delta is a comma\" check (review B-9) over-emits on prose-heavy\n // fields like {\"description\": \"short, comma-heavy text...\"} —\n // every comma inside the string triggered a parse. We track\n // in-string + escape state across chunks with a small walker so\n // each boundary fires exactly once at a real structural seam.\n const partialObjectEnabled =\n !!options?.schema && toolDefs.length === 0 && options.schema instanceof z.ZodObject;\n const currentAttempt = schemaRetries + 1;\n // Running parser state for the delta walker. Reset per ask\n // invocation (not per retry — schema retry feeds the same\n // conversation back, so we want a fresh parse of the new attempt).\n let inString = false;\n let escaped = false;\n let boundaryPending = false;\n\n for await (const chunk of provider.stream(currentMessages, chatOptions)) {\n if (chunk.type === 'text_delta') {\n content += chunk.content;\n // Emit a `token` AxlEvent so wire consumers (AxlStream) and\n // trace listeners both see it. Stream-only — `runtime.execute`'s\n // onTrace skips persisting tokens to ExecutionInfo.events.\n this.emitEvent({ type: 'token', data: chunk.content });\n this.onToken(chunk.content, callbackMeta);\n if (partialObjectEnabled) {\n // Walk `chunk.content` char-by-char, updating the\n // in-string / escape state and recording whether a\n // structural boundary landed outside a string. The\n // running state survives across chunks because\n // `inString` / `escaped` are closed over by the outer\n // for-await loop.\n for (const ch of chunk.content) {\n if (escaped) {\n escaped = false;\n continue;\n }\n if (ch === '\\\\') {\n // Inside a string, `\\\\` starts an escape. Outside,\n // a bare backslash is invalid JSON — treat the same\n // way (swallow the next char) so malformed input\n // doesn't derail our state machine.\n escaped = true;\n continue;\n }\n if (ch === '\"') {\n inString = !inString;\n continue;\n }\n if (!inString && (ch === ',' || ch === '}' || ch === ']')) {\n boundaryPending = true;\n }\n }\n if (boundaryPending) {\n boundaryPending = false;\n let parsed: unknown;\n try {\n parsed = parsePartialJson(extractJson(content));\n } catch {\n // Mid-document malformed (not just truncation) — skip\n // this delta. The next structural boundary outside a\n // string will get another shot once the model writes\n // valid syntax.\n parsed = undefined;\n }\n if (parsed !== undefined) {\n this.emitEvent({\n type: 'partial_object',\n agent: agent._name,\n attempt: currentAttempt,\n data: { object: parsed },\n });\n }\n }\n }\n } else if (chunk.type === 'thinking_delta') {\n thinkingContent += chunk.content;\n } else if (chunk.type === 'tool_call_delta') {\n let buffer = toolCallBuffers.get(chunk.id);\n if (!buffer) {\n buffer = { id: chunk.id, name: '', arguments: '' };\n toolCallBuffers.set(chunk.id, buffer);\n }\n if (chunk.name) buffer.name = chunk.name;\n if (chunk.arguments) buffer.arguments += chunk.arguments;\n } else if (chunk.type === 'done') {\n streamProviderMetadata = chunk.providerMetadata;\n // Usage and cost info from done chunk if available\n if (chunk.usage) {\n response = {\n content,\n tool_calls: undefined,\n usage: chunk.usage,\n cost: chunk.cost,\n };\n }\n }\n }\n\n // Convert tool call buffers to ToolCallMessage format\n for (const buffer of toolCallBuffers.values()) {\n toolCalls.push({\n id: buffer.id,\n type: 'function',\n function: {\n name: buffer.name,\n arguments: buffer.arguments,\n },\n });\n }\n\n response ??= {\n content,\n usage: { prompt_tokens: 0, completion_tokens: 0, total_tokens: 0 },\n };\n if (toolCalls.length > 0) {\n response.tool_calls = toolCalls;\n }\n if (streamProviderMetadata) {\n response.providerMetadata = streamProviderMetadata;\n }\n if (thinkingContent) {\n response.thinking_content = thinkingContent;\n }\n } else {\n response = await provider.chat(currentMessages, chatOptions);\n }\n } catch (err) {\n // Emit the paired `agent_call_end` before rethrowing. Empty response,\n // error message in `data.error`. No usage/cost — provider didn't\n // deliver one. `duration` reflects time-to-failure.\n this.emitEvent({\n type: 'agent_call_end',\n agent: agent._name,\n model: modelUri,\n promptVersion: agent._config.version,\n duration: Date.now() - turnStart,\n data: {\n response: '',\n turn: turns,\n ...(retryReason ? { retryReason } : {}),\n error: err instanceof Error ? err.message : String(err),\n },\n });\n throw err;\n }\n\n // Capture usage for span instrumentation (per-call, not per-instance)\n if (usageCapture && response.usage) {\n usageCapture.value = response.usage;\n }\n\n // Track cost\n if (response.cost) {\n this._accumulateBudgetCost(response.cost);\n }\n\n // Snapshot of what we actually sent the provider this turn (excluding the\n // new assistant message that's about to be appended). Consumers can use\n // this to reconstruct the model's exact view on any given turn.\n // structuredClone avoids sharing references with `currentMessages` — later\n // turns mutate pushed-into arrays (e.g. tool_calls), and async consumers\n this.emitEvent({\n type: 'agent_call_end',\n agent: agent._name,\n model: modelUri,\n promptVersion: agent._config.version,\n cost: response.cost,\n tokens: response.usage\n ? {\n input: response.usage.prompt_tokens,\n output: response.usage.completion_tokens,\n reasoning: response.usage.reasoning_tokens,\n }\n : undefined,\n duration: Date.now() - turnStart,\n data: {\n response: response.content,\n ...(response.thinking_content ? { thinking: response.thinking_content } : {}),\n turn: turns,\n ...(retryReason ? { retryReason } : {}),\n },\n });\n\n // Handle tool calls\n if (response.tool_calls && response.tool_calls.length > 0) {\n currentMessages.push({\n role: 'assistant',\n content: response.content || '',\n tool_calls: response.tool_calls,\n ...(response.providerMetadata ? { providerMetadata: response.providerMetadata } : {}),\n });\n\n for (const toolCall of response.tool_calls) {\n const toolName = toolCall.function.name;\n\n // Check for handoff\n if (toolName.startsWith('handoff_to_')) {\n const targetName = toolName.replace('handoff_to_', '');\n const descriptor = resolvedHandoffs?.find((h) => h.agent._name === targetName);\n if (descriptor) {\n const mode = descriptor.mode ?? 'oneway';\n\n // For roundtrip, parse the message parameter from tool call args\n let handoffPrompt = prompt;\n if (mode === 'roundtrip') {\n try {\n const args = JSON.parse(toolCall.function.arguments);\n if (args.message) handoffPrompt = args.message;\n } catch {\n // Fall back to original prompt if args can't be parsed\n }\n }\n\n const handoffStart = Date.now();\n // Capture the source ask's frame for handoff correlation.\n // Review B-7 / B-8: we now allocate a REAL ask frame for\n // the target and run its executeAgentCall under\n // `askStorage.run(targetFrame, …)` so events emitted from\n // the target's tool-calling loop carry the proper\n // `askId: handoffToAskId` + `parentAskId: handoffFromAskId`.\n // Previously `toAskId` was a synthesized UUID with no\n // matching frame, so consumers grouping by `askId` saw\n // the handoff row as an orphan.\n const sourceFrame = askStorage.getStore();\n const handoffFromAskId = sourceFrame?.askId ?? this.executionId;\n const handoffSourceDepth = sourceFrame?.depth ?? 0;\n const handoffToAskId = randomUUID();\n const handoffTargetDepth = handoffSourceDepth + 1;\n const targetFrame: AskFrame = {\n askId: handoffToAskId,\n parentAskId: handoffFromAskId,\n depth: handoffTargetDepth,\n agent: descriptor.agent._name,\n stepRef: sourceFrame?.stepRef ?? this.stepRefRoot,\n askCost: { value: 0 },\n };\n\n // Pass accumulated messages so the target agent can see the source agent's work.\n // Forward schema/retries/validate/metadata — the target agent uses its own model params.\n const handoffOptions = options\n ? {\n schema: options.schema,\n retries: options.retries,\n metadata: options.metadata,\n validate: options.validate,\n validateRetries: options.validateRetries,\n }\n : undefined;\n // Execute the target's ask frame. Wraps `executeAgentCall`\n // in ask_start/ask_end so the target has the same event\n // shape as a regular `ctx.ask()` call — consumers grouping\n // by askId can resolve the target agent via its ask_start,\n // and the tree view's per-ask summary (duration, cost,\n // outcome) works uniformly for direct and handoff asks.\n const handoffFn = () =>\n askStorage.run(targetFrame, async () => {\n this.emitEvent({ type: 'ask_start', prompt: handoffPrompt });\n const targetAskStart = Date.now();\n try {\n const result = await this.executeAgentCall(\n descriptor.agent,\n handoffPrompt,\n handoffOptions,\n currentMessages,\n usageCapture,\n );\n this.emitEvent({\n type: 'ask_end',\n outcome: { ok: true, result },\n cost: targetFrame.askCost.value,\n duration: Date.now() - targetAskStart,\n });\n return result;\n } catch (err) {\n this.emitEvent({\n type: 'ask_end',\n outcome: {\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n },\n cost: targetFrame.askCost.value,\n duration: Date.now() - targetAskStart,\n });\n throw err;\n }\n });\n\n // Emit handoff_start BEFORE the target ask begins so it\n // orders correctly in step-sorted timelines (ahead of the\n // target's ask_start / agent_call_* events). Always fired\n // regardless of mode — this event represents the transition.\n this.emitEvent({\n type: 'handoff_start',\n agent: agent._name,\n fromAskId: handoffFromAskId,\n toAskId: handoffToAskId,\n sourceDepth: handoffSourceDepth,\n targetDepth: handoffTargetDepth,\n data: {\n source: agent._name,\n target: targetName,\n mode,\n ...(mode === 'roundtrip' && handoffPrompt !== prompt\n ? { message: handoffPrompt }\n : {}),\n },\n });\n\n if (mode === 'roundtrip') {\n // Roundtrip: execute target, feed result back to source as tool response,\n // then emit `handoff_return` to mark control returning to source.\n // The target's return value is observable on its `ask_end.outcome`.\n const executeRoundtrip = async (): Promise<unknown> => {\n const result = await handoffFn();\n const resultStr = typeof result === 'string' ? result : JSON.stringify(result);\n currentMessages.push({\n role: 'tool',\n content: resultStr,\n tool_call_id: toolCall.id,\n });\n return result;\n };\n\n // `handoff_return` always emits — success OR failure. If the\n // target throws, control still returns to source (via the\n // exception path); without the event the timeline shows a\n // `handoff_start` with no completion. Try/finally re-throws\n // any error so the source's loop sees the failure.\n if (this.spanManager) {\n await this.spanManager.withSpanAsync(\n 'axl.agent.handoff',\n {\n 'axl.handoff.source': agent._name,\n 'axl.handoff.target': targetName,\n 'axl.handoff.mode': mode,\n },\n async (span) => {\n try {\n return await executeRoundtrip();\n } finally {\n const duration = Date.now() - handoffStart;\n span.setAttribute('axl.handoff.duration', duration);\n this.emitEvent({\n type: 'handoff_return',\n agent: agent._name,\n fromAskId: handoffFromAskId,\n toAskId: handoffToAskId,\n sourceDepth: handoffSourceDepth,\n targetDepth: handoffTargetDepth,\n data: { source: agent._name, target: targetName, duration },\n });\n }\n },\n );\n } else {\n try {\n await executeRoundtrip();\n } finally {\n this.emitEvent({\n type: 'handoff_return',\n agent: agent._name,\n fromAskId: handoffFromAskId,\n toAskId: handoffToAskId,\n sourceDepth: handoffSourceDepth,\n targetDepth: handoffTargetDepth,\n data: {\n source: agent._name,\n target: targetName,\n duration: Date.now() - handoffStart,\n },\n });\n }\n }\n continue; // Source agent loop continues\n }\n\n // Oneway (default): return target's result, exiting source's loop.\n // No `handoff_return` event — control doesn't come back to source.\n // The target's `ask_end` already marks the end of this chain.\n if (this.spanManager) {\n return this.spanManager.withSpanAsync(\n 'axl.agent.handoff',\n {\n 'axl.handoff.source': agent._name,\n 'axl.handoff.target': targetName,\n 'axl.handoff.mode': mode,\n },\n async (span) => {\n const result = await handoffFn();\n span.setAttribute('axl.handoff.duration', Date.now() - handoffStart);\n return result;\n },\n );\n }\n return await handoffFn();\n }\n }\n\n // Check toolOverrides first (for mock tool interception)\n const toolOverride = this.toolOverrides?.get(toolName);\n if (toolOverride) {\n let toolArgs: unknown;\n try {\n toolArgs = JSON.parse(toolCall.function.arguments);\n } catch {\n currentMessages.push({\n role: 'tool',\n content: `Error: Invalid JSON in tool arguments. Please provide valid JSON.`,\n tool_call_id: toolCall.id,\n });\n continue;\n }\n this.emitEvent({\n type: 'tool_call_start',\n tool: toolName,\n callId: toolCall.id,\n data: { args: toolArgs },\n });\n this.onToolCall?.(\n { name: toolName, args: toolArgs, callId: toolCall.id },\n callbackMeta,\n );\n const toolStart = Date.now();\n\n const executeOverride = async () => {\n let toolResult: unknown;\n try {\n toolResult = await toolOverride(toolArgs);\n } catch (err) {\n toolResult = { error: err instanceof Error ? err.message : String(err) };\n }\n return toolResult;\n };\n\n const toolResult = this.spanManager\n ? await this.spanManager.withSpanAsync(\n 'axl.tool.call',\n {\n 'axl.tool.name': toolName,\n 'axl.agent.name': agent._name,\n },\n async (span) => {\n const r = await executeOverride();\n span.setAttribute('axl.tool.duration', Date.now() - toolStart);\n const isError =\n r && typeof r === 'object' && 'error' in (r as Record<string, unknown>);\n span.setAttribute('axl.tool.success', !isError);\n if (isError)\n span.setStatus('error', (r as Record<string, unknown>).error as string);\n return r;\n },\n )\n : await executeOverride();\n\n const resultContent = JSON.stringify(toolResult);\n this.emitEvent({\n type: 'tool_call_end',\n agent: agent._name,\n tool: toolName,\n duration: Date.now() - toolStart,\n data: { args: toolArgs, result: toolResult, callId: toolCall.id },\n });\n currentMessages.push({\n role: 'tool',\n content: resultContent,\n tool_call_id: toolCall.id,\n });\n continue;\n }\n\n // Find the tool (check local tools first, then MCP tools)\n const tool = agent._config.tools?.find((t) => t.name === toolName);\n const isMcpTool = !tool && this.mcpManager?.isMcpTool(toolName);\n\n if (!tool && !isMcpTool) {\n // Tool denied\n this.emitEvent({ type: 'tool_denied', agent: agent._name, tool: toolName });\n currentMessages.push({\n role: 'tool',\n content: `Tool \"${toolName}\" is not available. Available tools: ${agent._config.tools?.map((t) => t.name).join(', ') ?? 'none'}`,\n tool_call_id: toolCall.id,\n });\n continue;\n }\n\n // Parse tool arguments\n let toolArgs: unknown;\n try {\n toolArgs = JSON.parse(toolCall.function.arguments);\n } catch {\n currentMessages.push({\n role: 'tool',\n content: `Error: Invalid JSON in tool arguments. Please provide valid JSON.`,\n tool_call_id: toolCall.id,\n });\n continue;\n }\n\n this.emitEvent({\n type: 'tool_call_start',\n tool: toolName,\n callId: toolCall.id,\n data: { args: toolArgs },\n });\n this.onToolCall?.({ name: toolName, args: toolArgs, callId: toolCall.id }, callbackMeta);\n\n const toolStart = Date.now();\n\n // Approval gate: if tool requires approval, ask the human first.\n // Note: MCP tools have no `tool` object here (isMcpTool is true instead),\n // so they bypass the approval gate entirely. This is intentional — MCP tools\n // are externally managed and don't carry requireApproval config.\n if (tool && tool.requireApproval) {\n const approvalFn = async (): Promise<{ approved: boolean; reason?: string }> => {\n const decision = await this.awaitHuman({\n channel: 'tool_approval',\n prompt: `Tool \"${toolName}\" wants to execute with args: ${JSON.stringify(toolArgs)}`,\n metadata: { toolName, args: toolArgs, agent: agent._name },\n });\n if (!decision.approved) {\n const reason = decision.reason ?? 'Denied by human';\n currentMessages.push({\n role: 'tool',\n content: JSON.stringify({ error: `Tool denied by human: ${reason}` }),\n tool_call_id: toolCall.id,\n });\n return { approved: false, reason };\n }\n return { approved: true };\n };\n\n let approvalOutcome: { approved: boolean; reason?: string };\n if (this.spanManager) {\n approvalOutcome = await this.spanManager.withSpanAsync(\n 'axl.tool.approval',\n {\n 'axl.tool.name': toolName,\n 'axl.agent.name': agent._name,\n },\n async (span) => {\n const result = await approvalFn();\n span.setAttribute('axl.tool.approval.approved', result.approved);\n return result;\n },\n );\n } else {\n approvalOutcome = await approvalFn();\n }\n\n this.emitEvent({\n type: 'tool_approval',\n agent: agent._name,\n tool: toolName,\n data: {\n approved: approvalOutcome.approved,\n args: toolArgs,\n ...(approvalOutcome.reason ? { reason: approvalOutcome.reason } : {}),\n },\n });\n\n if (!approvalOutcome.approved) continue;\n }\n\n // Before hook: transform input before execution\n if (tool && tool.hooks?.before) {\n try {\n toolArgs = await tool.hooks.before(toolArgs, this);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n currentMessages.push({\n role: 'tool',\n content: JSON.stringify({ error: `Before hook error: ${errorMsg}` }),\n tool_call_id: toolCall.id,\n });\n continue;\n }\n }\n\n const executeTool = async (): Promise<{ toolResult: unknown; resultContent: string }> => {\n let toolResult: unknown;\n let resultContent: string;\n\n if (isMcpTool && this.mcpManager) {\n // Execute MCP tool\n try {\n const mcpResult = await this.mcpManager.callTool(toolName, toolArgs);\n toolResult = mcpResult;\n // Extract text content from MCP result\n resultContent = mcpResult.content\n .map((c: { type: string; text?: string }) =>\n c.type === 'text' ? c.text : `[${c.type}]`,\n )\n .join('\\n');\n if (mcpResult.isError) {\n resultContent = `Error: ${resultContent}`;\n }\n } catch (err) {\n toolResult = { error: err instanceof Error ? err.message : String(err) };\n resultContent = JSON.stringify(toolResult);\n }\n } else if (tool) {\n // Execute local tool with a child context for nested agent\n // invocations (agent-as-tool pattern). Nested events are\n // correlated to the outer ask via `parentAskId` from the\n // ALS frame, so the child context doesn't need to thread\n // anything explicitly.\n const childCtx = this.createChildContext();\n try {\n toolResult = await tool._execute(toolArgs, childCtx);\n } catch (err) {\n toolResult = { error: err instanceof Error ? err.message : String(err) };\n }\n\n // After hook: transform output after execution (only on success)\n if (\n tool.hooks?.after &&\n !(\n toolResult &&\n typeof toolResult === 'object' &&\n 'error' in (toolResult as Record<string, unknown>)\n )\n ) {\n try {\n toolResult = await tool.hooks.after(toolResult, this);\n } catch (err) {\n toolResult = {\n error: `After hook error: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n }\n\n // Redact sensitive tool results\n resultContent = tool.sensitive\n ? '[REDACTED - sensitive tool output]'\n : JSON.stringify(toolResult);\n } else {\n toolResult = undefined;\n resultContent = 'Tool execution error';\n }\n\n return { toolResult, resultContent };\n };\n\n // Use qualified \"server:tool_name\" for MCP tools in traces\n const traceName =\n isMcpTool && this.mcpManager\n ? (this.mcpManager.getQualifiedName(toolName) ?? toolName)\n : toolName;\n\n const { toolResult, resultContent } = this.spanManager\n ? await this.spanManager.withSpanAsync(\n 'axl.tool.call',\n {\n 'axl.tool.name': traceName,\n 'axl.agent.name': agent._name,\n },\n async (span) => {\n const r = await executeTool();\n span.setAttribute('axl.tool.duration', Date.now() - toolStart);\n const isError =\n r.toolResult &&\n typeof r.toolResult === 'object' &&\n 'error' in (r.toolResult as Record<string, unknown>);\n span.setAttribute('axl.tool.success', !isError);\n if (isError)\n span.setStatus(\n 'error',\n (r.toolResult as Record<string, unknown>).error as string,\n );\n return r;\n },\n )\n : await executeTool();\n\n this.emitEvent({\n type: 'tool_call_end',\n agent: agent._name,\n tool: traceName,\n duration: Date.now() - toolStart,\n data: { args: toolArgs, result: toolResult, callId: toolCall.id },\n });\n\n currentMessages.push({\n role: 'tool',\n content: resultContent,\n tool_call_id: toolCall.id,\n });\n }\n\n continue; // Next turn\n }\n\n // No tool calls — we have the final response\n const content = response.content;\n\n // -- Gate 1: Output guardrail (raw text — content safety) --\n if (guardrails?.output) {\n const outputResult = await guardrails.output(content, { metadata: this.metadata });\n\n // Compute retry intent *before* emitting the trace so the feedback message\n // the LLM will see on its next attempt is visible in the same event.\n const attempt = guardrailOutputRetries + 1;\n const maxAttempts = maxGuardrailRetries + 1;\n const onBlock = guardrails.onBlock ?? 'throw';\n let feedbackMessage: string | undefined;\n if (\n outputResult.block &&\n onBlock === 'retry' &&\n guardrailOutputRetries < maxGuardrailRetries\n ) {\n feedbackMessage = `Your previous response was blocked by a safety guardrail: ${outputResult.reason ?? 'Output blocked'}. Please provide a different response that complies with the guidelines.`;\n }\n\n this.emitEvent({\n type: 'guardrail',\n agent: agent._name,\n data: {\n guardrailType: 'output',\n blocked: outputResult.block,\n ...(outputResult.reason ? { reason: outputResult.reason } : {}),\n attempt,\n maxAttempts,\n ...(feedbackMessage ? { feedbackMessage } : {}),\n },\n });\n this.spanManager?.addEventToActiveSpan('axl.guardrail.check', {\n 'axl.guardrail.type': 'output',\n 'axl.guardrail.blocked': outputResult.block,\n 'axl.guardrail.attempt': attempt,\n 'axl.guardrail.maxAttempts': maxAttempts,\n ...(outputResult.reason ? { 'axl.guardrail.reason': outputResult.reason } : {}),\n });\n\n if (outputResult.block) {\n if (feedbackMessage) {\n this.emitEvent({\n type: 'pipeline',\n agent: agent._name,\n status: 'failed',\n stage: 'guardrail',\n attempt: guardrailOutputRetries + 1,\n maxAttempts: maxGuardrailRetries + 1,\n reason: feedbackMessage,\n });\n guardrailOutputRetries++;\n appendRetryMessages(\n currentMessages,\n content,\n feedbackMessage,\n response.providerMetadata,\n );\n pendingRetryReason = 'guardrail';\n continue; // Re-enter the while loop for another LLM turn\n }\n if (typeof onBlock === 'function') {\n return onBlock(outputResult.reason ?? 'Output blocked by guardrail', {\n metadata: this.metadata,\n });\n }\n throw new GuardrailError('output', outputResult.reason ?? 'Output blocked by guardrail');\n }\n }\n\n // -- Gate 2: Schema validation (parse + Zod) --\n let validated: unknown = undefined;\n if (options?.schema) {\n const maxSchemaRetries = options.retries ?? 3;\n const schemaAttempt = schemaRetries + 1;\n const schemaMaxAttempts = maxSchemaRetries + 1;\n let schemaValid = false;\n let schemaReason: string | undefined;\n let schemaFeedback: string | undefined;\n let schemaErr: unknown;\n try {\n const parsed = JSON.parse(extractJson(content));\n validated = (options.schema as z.ZodType).parse(parsed);\n schemaValid = true;\n } catch (err) {\n schemaErr = err;\n schemaReason = err instanceof Error ? err.message : String(err);\n if (schemaRetries < maxSchemaRetries) {\n schemaFeedback = `Your response was not valid JSON or did not match the required schema: ${schemaReason}. Please fix and try again.`;\n }\n }\n\n this.emitEvent({\n type: 'schema_check',\n agent: agent._name,\n data: {\n valid: schemaValid,\n ...(schemaReason ? { reason: schemaReason } : {}),\n attempt: schemaAttempt,\n maxAttempts: schemaMaxAttempts,\n ...(schemaFeedback ? { feedbackMessage: schemaFeedback } : {}),\n },\n });\n this.spanManager?.addEventToActiveSpan('axl.schema.check', {\n 'axl.schema.valid': schemaValid,\n 'axl.schema.attempt': schemaAttempt,\n 'axl.schema.maxAttempts': schemaMaxAttempts,\n ...(schemaReason ? { 'axl.schema.reason': schemaReason } : {}),\n });\n\n if (!schemaValid) {\n if (schemaFeedback) {\n this.emitEvent({\n type: 'pipeline',\n agent: agent._name,\n status: 'failed',\n stage: 'schema',\n attempt: schemaRetries + 1,\n maxAttempts: (options.retries ?? 3) + 1,\n reason: schemaFeedback,\n });\n schemaRetries++;\n appendRetryMessages(\n currentMessages,\n content,\n schemaFeedback,\n response.providerMetadata,\n );\n pendingRetryReason = 'schema';\n continue; // Re-enter the while loop for another LLM turn\n }\n const zodErr =\n schemaErr instanceof ZodError\n ? schemaErr\n : new ZodError([\n {\n code: 'custom',\n path: [],\n message: schemaReason ?? 'Schema parse failed',\n },\n ]);\n throw new VerifyError(content, zodErr, maxSchemaRetries);\n }\n }\n\n // -- Gate 3: Business rule validation (typed object) --\n // Only runs when both a schema and validate function are provided.\n // Without a schema, use output guardrails for raw text validation instead.\n if (options?.schema && options.validate) {\n // Wrap user-supplied validator in try/catch — treat exceptions as validation failures\n // so they get the same retry semantics instead of crashing the pipeline.\n let validateResult: ValidateResult;\n try {\n validateResult = await options.validate(validated, {\n metadata: this.metadata,\n });\n } catch (err) {\n const reason = err instanceof Error ? err.message : String(err);\n validateResult = { valid: false, reason: `Validator error: ${reason}` };\n }\n\n const maxValidateRetries = options.validateRetries ?? 2;\n const validateAttempt = validateRetries + 1;\n const validateMaxAttempts = maxValidateRetries + 1;\n let validateFeedback: string | undefined;\n if (!validateResult.valid && validateRetries < maxValidateRetries) {\n validateFeedback = `Your response parsed correctly but failed validation: ${validateResult.reason ?? 'Validation failed'}. Previous attempts are visible above. Please fix and try again.`;\n }\n\n this.emitEvent({\n type: 'validate',\n agent: agent._name,\n data: {\n valid: validateResult.valid,\n ...(validateResult.reason ? { reason: validateResult.reason } : {}),\n attempt: validateAttempt,\n maxAttempts: validateMaxAttempts,\n ...(validateFeedback ? { feedbackMessage: validateFeedback } : {}),\n },\n });\n this.spanManager?.addEventToActiveSpan('axl.validate.check', {\n 'axl.validate.valid': validateResult.valid,\n 'axl.validate.attempt': validateAttempt,\n 'axl.validate.maxAttempts': validateMaxAttempts,\n ...(validateResult.reason ? { 'axl.validate.reason': validateResult.reason } : {}),\n });\n\n if (!validateResult.valid) {\n if (validateFeedback) {\n this.emitEvent({\n type: 'pipeline',\n agent: agent._name,\n status: 'failed',\n stage: 'validate',\n attempt: validateRetries + 1,\n maxAttempts: (options.validateRetries ?? 2) + 1,\n reason: validateFeedback,\n });\n validateRetries++;\n appendRetryMessages(\n currentMessages,\n content,\n validateFeedback,\n response.providerMetadata,\n );\n pendingRetryReason = 'validate';\n continue; // Re-enter the while loop — goes through all gates again\n }\n throw new ValidationError(\n validated,\n validateResult.reason ?? 'Validation failed',\n maxValidateRetries,\n );\n }\n }\n\n // All gates passed — emit pipeline `committed`, push to session\n // history, and return. Spec §4.2: terminal pipeline event for this\n // ask, fires before `done`.\n this.emitEvent({\n type: 'pipeline',\n agent: agent._name,\n status: 'committed',\n stage: lastStartStage,\n attempt: lastStartAttempt,\n maxAttempts: lastStartMaxAttempts,\n });\n this.pushAssistantToSessionHistory(content, response.providerMetadata);\n return validated ?? content;\n }\n\n throw new MaxTurnsError('ctx.ask()', maxTurns);\n }\n\n /**\n * Push the final assistant message into session history, preserving providerMetadata\n * (e.g., Gemini thought signatures needed for multi-turn reasoning context).\n */\n private pushAssistantToSessionHistory(\n content: string,\n providerMetadata?: Record<string, unknown>,\n ): void {\n this.sessionHistory.push({\n role: 'assistant',\n content,\n ...(providerMetadata ? { providerMetadata } : {}),\n });\n }\n\n private buildToolDefs(\n agent: Agent,\n resolvedHandoffs?: Array<{ agent: Agent; description?: string; mode?: 'oneway' | 'roundtrip' }>,\n ): ToolDefinition[] {\n const defs: ToolDefinition[] = [];\n\n if (agent._config.tools) {\n for (const tool of agent._config.tools) {\n defs.push({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: zodToJsonSchema(tool.inputSchema),\n },\n });\n }\n }\n\n // Add handoff tools (already resolved by caller)\n if (resolvedHandoffs) {\n for (const { agent: handoffAgent, description, mode } of resolvedHandoffs) {\n const isRoundtrip = mode === 'roundtrip';\n const defaultDesc = isRoundtrip\n ? `Delegate a task to ${handoffAgent._name} and receive the result back`\n : `Hand off the conversation to ${handoffAgent._name}`;\n defs.push({\n type: 'function',\n function: {\n name: `handoff_to_${handoffAgent._name}`,\n description: description ?? defaultDesc,\n parameters: isRoundtrip\n ? {\n type: 'object',\n properties: { message: { type: 'string', description: 'The task to delegate' } },\n required: ['message'],\n }\n : { type: 'object', properties: {} },\n },\n });\n }\n }\n\n // Add MCP tools\n if (this.mcpManager) {\n const mcpDefs = this.mcpManager.getToolDefinitions(agent._config.mcp, agent._config.mcpTools);\n defs.push(...mcpDefs);\n }\n\n return defs;\n }\n\n /**\n * Summarize old messages to fit within context window.\n * Keeps recent messages intact, summarizes older ones.\n */\n private async summarizeHistory(\n provider: Provider,\n model: string,\n history: ChatMessage[],\n availableTokens: number,\n ): Promise<ChatMessage[]> {\n // If we have a cached summary and the history hasn't grown much, reuse it\n if (this.summaryCache) {\n const summaryMsg: ChatMessage = {\n role: 'system',\n content: `Summary of earlier conversation:\\n${this.summaryCache}`,\n };\n const summaryTokens = estimateTokens(summaryMsg.content) + 4;\n const remaining = availableTokens - summaryTokens;\n\n // Find how many recent messages fit\n let recentTokens = 0;\n let splitIdx = history.length;\n for (let i = history.length - 1; i >= 0; i--) {\n const msgTokens = estimateTokens(history[i].content) + 4;\n if (recentTokens + msgTokens > remaining) break;\n recentTokens += msgTokens;\n splitIdx = i;\n }\n\n if (splitIdx < history.length) {\n return [summaryMsg, ...history.slice(splitIdx)];\n }\n }\n\n // No cache or cache insufficient — generate a new summary\n // Find the split: keep as many recent messages as possible\n let recentTokens = 0;\n let splitIdx = history.length;\n const targetRecent = Math.floor(availableTokens * 0.6); // 60% for recent messages\n\n for (let i = history.length - 1; i >= 0; i--) {\n const msgTokens = estimateTokens(history[i].content) + 4;\n if (recentTokens + msgTokens > targetRecent) break;\n recentTokens += msgTokens;\n splitIdx = i;\n }\n\n // If nothing to summarize (all messages are \"recent\"), just return all\n if (splitIdx === 0) return history;\n\n const oldMessages = history.slice(0, splitIdx);\n\n // Summarize old messages using the configured summary model or the same model\n const summaryModelUri = this.config.contextManagement?.summaryModel;\n let summaryProvider: Provider;\n let summaryModel: string;\n\n if (summaryModelUri) {\n const resolved = this.providerRegistry.resolve(summaryModelUri, this.config);\n summaryProvider = resolved.provider;\n summaryModel = resolved.model;\n } else {\n summaryProvider = provider;\n summaryModel = model;\n }\n\n const oldContent = oldMessages.map((m) => `${m.role}: ${m.content}`).join('\\n');\n\n const summaryResponse = await summaryProvider.chat(\n [\n {\n role: 'system',\n content:\n 'Summarize the following conversation concisely, preserving key facts, decisions, and context needed for continuing the conversation.',\n },\n { role: 'user', content: oldContent },\n ],\n { model: summaryModel, maxTokens: 1024, signal: this.currentSignal },\n );\n\n this.summaryCache = summaryResponse.content;\n\n // Persist summary cache to session metadata so it survives across requests\n const sessionId = this.metadata?.sessionId as string | undefined;\n if (sessionId && this.stateStore) {\n await this.stateStore.saveSessionMeta(sessionId, 'summaryCache', this.summaryCache);\n }\n\n const summaryMsg: ChatMessage = {\n role: 'system',\n content: `Summary of earlier conversation:\\n${summaryResponse.content}`,\n };\n\n return [summaryMsg, ...history.slice(splitIdx)];\n }\n\n // ── ctx.checkpoint() ────────────────────────────────────────────────\n\n /**\n * Execute a function with checkpoint-replay semantics.\n *\n * On first execution, runs `fn()`, saves the result under `name`, and\n * returns it. On replay (resume after restart), returns the saved result\n * without re-executing. This prevents duplicate side effects (double API\n * calls, double refunds, etc.).\n *\n * `name` must be a stable, caller-supplied identifier — the same call\n * site MUST pass the same name across runs of the same execution for\n * replay to work. Names are scoped to a single execution and must be\n * unique within it; reusing a name (e.g. inside a loop) gives\n * last-write-wins behavior. For loops, compose names from the iterator:\n * `ctx.checkpoint(`process-${id}`, fn)`.\n *\n * Names starting with `__auto/` are reserved for runtime-internal\n * auto-checkpointing of `ctx.ask` / spawn / race / parallel / map.\n */\n async checkpoint<T>(name: string, fn: () => Promise<T>): Promise<T> {\n // Defensive validation — checkpoint names are state-store keys, so\n // empty/whitespace-only names round-trip silently and create\n // hard-to-debug replay failures. The reserved-prefix check is\n // case-insensitive and trim-aware so accidentally constructed names\n // like '__AUTO/foo' or ' __auto/foo' don't sneak past.\n if (typeof name !== 'string' || name.length === 0) {\n throw new Error('ctx.checkpoint name must be a non-empty string.');\n }\n if (name !== name.trim()) {\n throw new Error(\n `ctx.checkpoint name \"${name}\" has leading/trailing whitespace — trim before passing.`,\n );\n }\n if (name.toLowerCase().startsWith('__auto/')) {\n throw new Error(\n `ctx.checkpoint name \"${name}\" is reserved — names starting with \"__auto/\" (case-insensitive) are used by the runtime for ask/spawn/race/parallel/map auto-checkpointing.`,\n );\n }\n return this._checkpoint(name, fn);\n }\n\n /**\n * Internal checkpoint implementation shared by both the public\n * `checkpoint(name, fn)` and the automatic checkpointing in\n * ask/spawn/race/parallel/map. Internal callers pass an `__auto/...`\n * name composed by `_autoCheckpointName`.\n *\n * `agent` is the originating agent for ask auto-checkpoints — passing\n * it explicitly stamps `event.agent` on the trace events even though\n * the emit fires before/after `fn()` (where the ask's ALS frame\n * either doesn't exist yet or has already torn down). Without this,\n * post-fn `checkpoint_save` rows show no agent in the trace UI.\n */\n private async _checkpoint<T>(\n name: string,\n fn: () => Promise<T>,\n options?: { agent?: string },\n ): Promise<T> {\n // If no state store, just execute without persistence\n if (!this.stateStore) {\n return fn();\n }\n\n const agentStamp = options?.agent ? { agent: options.agent } : {};\n\n // Check for a saved checkpoint from a previous execution\n const saved = await this.stateStore.getCheckpoint(this.executionId, name);\n if (saved !== null) {\n this.emitEvent({\n type: 'checkpoint_replay',\n ...agentStamp,\n data: { name },\n });\n this.spanManager?.addEventToActiveSpan('axl.checkpoint.hit', { 'axl.checkpoint.name': name });\n return saved as T;\n }\n\n // Execute and save the result\n const result = await fn();\n\n await this.stateStore.saveCheckpoint(this.executionId, name, result);\n\n this.emitEvent({\n type: 'checkpoint_save',\n ...agentStamp,\n data: { name },\n });\n this.spanManager?.addEventToActiveSpan('axl.checkpoint.miss', { 'axl.checkpoint.name': name });\n\n return result;\n }\n\n /** Generate a stable auto-checkpoint name for an internal primitive.\n *\n * For `ctx.ask`, the originating agent is known and gets a per-agent\n * counter — the resulting name reads as \"orchestrator's first ask\"\n * (`__auto/orchestrator-agent/ask/0`) instead of a global ordinal.\n * For `spawn` / `race` / `parallel` / `map`, no agent context is\n * available (those wrap arbitrary fn callbacks), so the name uses\n * the root counter: `__auto/spawn/0`, `__auto/race/3`, etc.\n *\n * All counters live on a shared ref passed through `createChildContext`,\n * so a tool handler's nested `ctx.ask()` (which runs in a child\n * WorkflowContext) can never collide with the parent's auto-names in\n * the state store. */\n private _autoCheckpointName(\n primitive: 'ask' | 'spawn' | 'race' | 'parallel' | 'map',\n agent?: string,\n ): string {\n const counters = this.autoCheckpointCounters;\n if (primitive === 'ask' && agent) {\n const n = counters.byAgent.get(agent) ?? 0;\n counters.byAgent.set(agent, n + 1);\n return `__auto/${agent}/ask/${n}`;\n }\n const n = counters.root++;\n return `__auto/${primitive}/${n}`;\n }\n\n // ── ctx.spawn() ───────────────────────────────────────────────────────\n\n async spawn<T>(\n n: number,\n fn: (index: number) => Promise<T>,\n options?: SpawnOptions,\n ): Promise<Result<T>[]> {\n return this._checkpoint(this._autoCheckpointName('spawn'), () => {\n if (this.spanManager) {\n return this.spanManager.withSpanAsync(\n 'axl.ctx.spawn',\n {\n 'axl.spawn.count': n,\n ...(options?.quorum != null ? { 'axl.spawn.quorum': options.quorum } : {}),\n },\n async (span) => {\n const results = await this._spawnImpl(n, fn, options);\n const completed = results.filter((r) => r !== undefined).length;\n const succeeded = results.filter((r) => r?.ok).length;\n span.setAttribute('axl.spawn.completed', completed);\n span.setAttribute('axl.spawn.succeeded', succeeded);\n span.setAttribute('axl.spawn.cancelled', n - completed);\n return results;\n },\n );\n }\n return this._spawnImpl(n, fn, options);\n });\n }\n\n private async _spawnImpl<T>(\n n: number,\n fn: (index: number) => Promise<T>,\n options?: SpawnOptions,\n ): Promise<Result<T>[]> {\n const results: Result<T>[] = [];\n let successCount = 0;\n const quorum = options?.quorum;\n\n if (quorum) {\n const controller = new AbortController();\n const parentSignal = this.currentSignal;\n const composedSignal = parentSignal\n ? AbortSignal.any([parentSignal, controller.signal])\n : controller.signal;\n\n return new Promise<Result<T>[]>((resolve, reject) => {\n let settled = false;\n let completedCount = 0;\n\n for (let i = 0; i < n; i++) {\n const index = i;\n // Run each branch in an AsyncLocalStorage context with the composed signal\n const p = signalStorage.run(composedSignal, () => fn(index));\n\n p.then((value) => {\n if (settled) return;\n results[index] = { ok: true, value };\n successCount++;\n completedCount++;\n if (successCount >= quorum) {\n settled = true;\n controller.abort(); // Cancel remaining branches\n resolve(results);\n } else if (completedCount === n && successCount < quorum) {\n settled = true;\n reject(new QuorumNotMet(quorum, successCount, results));\n }\n }).catch((err) => {\n if (settled) return;\n // AbortErrors from our cancellation don't count as failures\n const isAbort = err instanceof DOMException && err.name === 'AbortError';\n if (isAbort) {\n completedCount++;\n if (completedCount === n && !settled && successCount < quorum) {\n settled = true;\n reject(new QuorumNotMet(quorum, successCount, results));\n }\n return;\n }\n results[index] = { ok: false, error: err instanceof Error ? err.message : String(err) };\n completedCount++;\n if (completedCount === n && successCount < quorum) {\n settled = true;\n reject(new QuorumNotMet(quorum, successCount, results));\n }\n });\n }\n });\n }\n\n // Default: run all, return all results\n const parentSignal = this.currentSignal;\n const promises = Array.from({ length: n }, (_, i) => {\n const run = () =>\n fn(i)\n .then((value): Result<T> => ({ ok: true, value }))\n .catch(\n (err): Result<T> => ({\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n }),\n );\n // Propagate parent signal so budget hard_stop can cancel non-quorum spawns\n return parentSignal ? signalStorage.run(parentSignal, run) : run();\n });\n\n return Promise.all(promises);\n }\n\n // ── ctx.vote() ────────────────────────────────────────────────────────\n\n vote<T>(results: Result<T>[], options: VoteOptions<T>): T | Promise<T> {\n if (this.spanManager) {\n return this.spanManager.withSpanAsync(\n 'axl.ctx.vote',\n {\n 'axl.vote.strategy': options.strategy,\n 'axl.vote.candidates': results.filter((r) => r.ok).length,\n },\n async (span) => {\n const result = await this._voteImpl(results, options);\n span.setAttribute(\n 'axl.vote.result',\n typeof result === 'object' ? JSON.stringify(result) : String(result),\n );\n return result;\n },\n );\n }\n return this._voteImpl(results, options);\n }\n\n private _voteImpl<T>(results: Result<T>[], options: VoteOptions<T>): T | Promise<T> {\n const successes = results\n .filter((r): r is Result<T> & { ok: true } => r.ok)\n .map((r) => r.value);\n\n if (successes.length === 0) {\n throw new NoConsensus('No successful results to vote on');\n }\n\n const { strategy, key, scorer, reducer } = options;\n\n if (scorer || (strategy === 'custom' && reducer)) {\n return this.asyncVote(successes, options);\n }\n\n switch (strategy) {\n case 'majority':\n return this.majorityVote(successes, key);\n case 'unanimous':\n return this.unanimousVote(successes, key);\n case 'highest':\n return this.numericVote(successes, key, 'highest');\n case 'lowest':\n return this.numericVote(successes, key, 'lowest');\n case 'mean':\n return this.meanVote(successes) as T;\n case 'median':\n return this.medianVote(successes) as T;\n case 'custom':\n if (reducer) return reducer(successes) as T;\n throw new NoConsensus('Custom strategy requires a reducer');\n default:\n throw new NoConsensus(`Unknown strategy: ${strategy}`);\n }\n }\n\n private async asyncVote<T>(successes: T[], options: VoteOptions<T>): Promise<T> {\n const { strategy, scorer, reducer } = options;\n\n if (strategy === 'custom' && reducer) {\n return reducer(successes);\n }\n\n if (scorer && (strategy === 'highest' || strategy === 'lowest')) {\n const scored = await Promise.all(\n successes.map(async (v) => ({ value: v, score: await scorer(v) })),\n );\n scored.sort((a, b) => (strategy === 'highest' ? b.score - a.score : a.score - b.score));\n return scored[0].value;\n }\n\n throw new NoConsensus(`Cannot use scorer with strategy \"${strategy}\"`);\n }\n\n private majorityVote<T>(values: T[], key?: string): T {\n const counts = new Map<string, { count: number; value: T }>();\n for (const v of values) {\n const k = key ? String((v as Record<string, unknown>)[key]) : JSON.stringify(v);\n const entry = counts.get(k);\n if (entry) entry.count++;\n else counts.set(k, { count: 1, value: v });\n }\n let best: { count: number; value: T } | undefined;\n for (const entry of counts.values()) {\n if (!best || entry.count > best.count) best = entry;\n }\n return best!.value;\n }\n\n private unanimousVote<T>(values: T[], key?: string): T {\n const first = key ? (values[0] as Record<string, unknown>)[key] : JSON.stringify(values[0]);\n for (let i = 1; i < values.length; i++) {\n const current = key ? (values[i] as Record<string, unknown>)[key] : JSON.stringify(values[i]);\n if (String(current) !== String(first)) {\n throw new NoConsensus('Unanimous vote failed: values differ');\n }\n }\n return values[0];\n }\n\n private numericVote<T>(values: T[], key: string | undefined, mode: 'highest' | 'lowest'): T {\n let best = values[0];\n let bestVal = key ? Number((values[0] as Record<string, unknown>)[key]) : Number(values[0]);\n for (let i = 1; i < values.length; i++) {\n const val = key ? Number((values[i] as Record<string, unknown>)[key]) : Number(values[i]);\n if (mode === 'highest' ? val > bestVal : val < bestVal) {\n best = values[i];\n bestVal = val;\n }\n }\n return best;\n }\n\n private meanVote(values: unknown[]): number {\n const nums = values.map(Number);\n return nums.reduce((a, b) => a + b, 0) / nums.length;\n }\n\n private medianVote(values: unknown[]): number {\n const sorted = values.map(Number).sort((a, b) => a - b);\n const mid = Math.floor(sorted.length / 2);\n return sorted.length % 2 !== 0 ? sorted[mid] : (sorted[mid - 1] + sorted[mid]) / 2;\n }\n\n // ── ctx.verify() ──────────────────────────────────────────────────────\n\n async verify<T>(\n fn: (retry?: VerifyRetry<T>) => Promise<unknown>,\n schema: z.ZodType<T>,\n options?: VerifyOptions<T>,\n ): Promise<T> {\n const maxRetries = options?.retries ?? 3;\n let lastRetry: VerifyRetry<T> | undefined = undefined;\n\n // Emits exactly one `verify` trace event at each terminal point so consumers\n // can see the outcome (pass/fail) and the number of attempts used. Called\n // just before every return/throw below; no-op on `continue`.\n const emitVerifyOutcome = (passed: boolean, attempts: number, lastError?: string) => {\n this.emitEvent({\n type: 'verify',\n agent: undefined,\n data: {\n passed,\n attempts,\n ...(lastError ? { lastError } : {}),\n },\n });\n };\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n let rawOutput: unknown;\n try {\n const result = await fn(lastRetry);\n rawOutput = result;\n const parsed = schema.parse(result) as T;\n\n // Post-schema business rule validation\n if (options?.validate) {\n let validateResult: ValidateResult;\n try {\n validateResult = await options.validate(parsed, { metadata: this.metadata });\n } catch (err) {\n const reason = err instanceof Error ? err.message : String(err);\n validateResult = { valid: false, reason: `Validator error: ${reason}` };\n }\n if (!validateResult.valid) {\n const errorMsg = validateResult.reason ?? 'Validation failed';\n lastRetry = { error: errorMsg, output: rawOutput, parsed };\n if (attempt === maxRetries) {\n emitVerifyOutcome(false, attempt + 1, errorMsg);\n if (options?.fallback !== undefined) return options.fallback;\n throw new ValidationError(parsed, errorMsg, maxRetries);\n }\n continue;\n }\n }\n\n emitVerifyOutcome(true, attempt + 1);\n return parsed;\n } catch (err) {\n if (err instanceof ValidationError) {\n // ValidationError from our own validate block or from fn (e.g., ctx.ask() validate\n // exhausted). Extract the parsed object so the next retry can repair it.\n // When fn() throws, rawOutput is undefined — fall back to the error's lastOutput.\n lastRetry = {\n error: err.reason,\n output: rawOutput ?? err.lastOutput,\n parsed: err.lastOutput as T,\n };\n if (attempt === maxRetries) {\n emitVerifyOutcome(false, attempt + 1, err.reason);\n if (options?.fallback !== undefined) return options.fallback;\n throw err;\n }\n continue;\n }\n\n // VerifyError from fn (e.g., ctx.ask() with schema exhausted retries, or nested\n // ctx.verify()). Extract lastOutput so fn can attempt repair — output is the raw\n // LLM response that failed parsing, parsed stays undefined.\n if (err instanceof VerifyError) {\n lastRetry = { error: err.message, output: rawOutput ?? err.lastOutput };\n if (attempt === maxRetries) {\n emitVerifyOutcome(false, attempt + 1, err.message);\n if (options?.fallback !== undefined) return options.fallback;\n throw err;\n }\n continue;\n }\n\n const errorMsg =\n err instanceof ZodError ? err.message : err instanceof Error ? err.message : String(err);\n lastRetry = { error: errorMsg, output: rawOutput };\n\n if (attempt === maxRetries) {\n emitVerifyOutcome(false, attempt + 1, errorMsg);\n if (options?.fallback !== undefined) return options.fallback;\n const zodErr =\n err instanceof ZodError\n ? err\n : new ZodError([{ code: 'custom', path: [], message: errorMsg }]);\n throw new VerifyError(rawOutput, zodErr, maxRetries);\n }\n }\n }\n\n emitVerifyOutcome(false, maxRetries + 1, lastRetry?.error ?? 'Verify failed');\n if (options?.fallback !== undefined) return options.fallback;\n throw new VerifyError(\n lastRetry?.output,\n new ZodError([{ code: 'custom', path: [], message: 'Verify failed' }]),\n maxRetries,\n );\n }\n\n // ── ctx.budget() ──────────────────────────────────────────────────────\n\n async budget<T>(options: BudgetOptions, fn: () => Promise<T>): Promise<BudgetResult<T>> {\n const limit = parseCost(options.cost);\n const policy = options.onExceed ?? 'finish_and_stop';\n\n const parentBudget = this.budgetContext;\n const controller = policy === 'hard_stop' ? new AbortController() : undefined;\n const parentSignal = this.currentSignal;\n\n const budgetSignal = controller\n ? parentSignal\n ? AbortSignal.any([parentSignal, controller.signal])\n : controller.signal\n : undefined;\n\n this.budgetContext = {\n totalCost: 0,\n limit,\n exceeded: false,\n policy,\n abortController: controller,\n };\n\n const executeBudget = async (): Promise<BudgetResult<T>> => {\n try {\n // Run fn in an AsyncLocalStorage context with the budget signal\n const value = budgetSignal ? await signalStorage.run(budgetSignal, fn) : await fn();\n const totalCost = this.budgetContext!.totalCost;\n const exceeded = this.budgetContext!.exceeded;\n return { value, budgetExceeded: exceeded, totalCost };\n } catch (err) {\n if (this.budgetContext!.exceeded) {\n return { value: null, budgetExceeded: true, totalCost: this.budgetContext!.totalCost };\n }\n // AbortError from hard_stop should count as budget exceeded\n if (err instanceof DOMException && err.name === 'AbortError' && controller) {\n return { value: null, budgetExceeded: true, totalCost: this.budgetContext!.totalCost };\n }\n throw err;\n } finally {\n if (parentBudget) parentBudget.totalCost += this.budgetContext!.totalCost;\n this.budgetContext = parentBudget;\n }\n };\n\n if (this.spanManager) {\n return this.spanManager.withSpanAsync(\n 'axl.ctx.budget',\n {\n 'axl.budget.limit': limit,\n 'axl.budget.policy': policy,\n },\n async (span) => {\n const result = await executeBudget();\n span.setAttribute('axl.budget.totalCost', result.totalCost);\n span.setAttribute('axl.budget.exceeded', result.budgetExceeded);\n return result;\n },\n );\n }\n\n return executeBudget();\n }\n\n /** Get the current budget status, or null if not inside a budget block. */\n getBudgetStatus(): { spent: number; limit: number; remaining: number } | null {\n if (!this.budgetContext) return null;\n return {\n spent: this.budgetContext.totalCost,\n limit: this.budgetContext.limit,\n remaining: Math.max(0, this.budgetContext.limit - this.budgetContext.totalCost),\n };\n }\n\n // ── ctx.race() ────────────────────────────────────────────────────────\n\n async race<T>(fns: Array<() => Promise<T>>, options?: RaceOptions<T>): Promise<T> {\n return this._checkpoint(this._autoCheckpointName('race'), () => {\n if (this.spanManager) {\n return this.spanManager.withSpanAsync(\n 'axl.ctx.race',\n {\n 'axl.race.participants': fns.length,\n },\n async (span) => {\n let winnerIndex = -1;\n const wrappedFns = fns.map((fn, i) => async () => {\n const result = await fn();\n winnerIndex = i;\n return result;\n });\n const result = await this._raceImpl(wrappedFns, options);\n span.setAttribute('axl.race.resolved', true);\n span.setAttribute('axl.race.winner', winnerIndex);\n return result;\n },\n );\n }\n return this._raceImpl(fns, options);\n });\n }\n\n private async _raceImpl<T>(fns: Array<() => Promise<T>>, options?: RaceOptions<T>): Promise<T> {\n const controller = new AbortController();\n let lastError: Error | undefined;\n const schema = options?.schema as z.ZodType | undefined;\n\n const parentSignal = this.currentSignal;\n const composedSignal = parentSignal\n ? AbortSignal.any([parentSignal, controller.signal])\n : controller.signal;\n\n return new Promise<T>((resolve, reject) => {\n let settled = false;\n let remaining = fns.length;\n\n for (const fn of fns) {\n // Run each branch in an AsyncLocalStorage context with the composed signal.\n // This ensures the signal persists through all awaits in the branch.\n const p = signalStorage.run(composedSignal, fn);\n\n p.then(async (value) => {\n if (settled) return;\n // If a schema is provided, validate the result.\n // Invalid results are discarded and the race continues.\n if (schema) {\n const parsed = schema.safeParse(value);\n if (!parsed.success) {\n remaining--;\n lastError = new Error(`Schema validation failed: ${parsed.error.message}`);\n if (remaining === 0 && !settled) {\n settled = true;\n reject(lastError);\n }\n return;\n }\n // Post-schema business rule validation — invalid results discarded like schema failures\n if (options?.validate) {\n try {\n const validateResult = await options.validate(parsed.data as T, {\n metadata: this.metadata,\n });\n if (!validateResult.valid) {\n remaining--;\n lastError = new Error(\n `Validation failed: ${validateResult.reason ?? 'Validation failed'}`,\n );\n if (remaining === 0 && !settled) {\n settled = true;\n reject(lastError);\n }\n return;\n }\n } catch (err) {\n remaining--;\n lastError =\n err instanceof Error ? err : new Error(`Validator error: ${String(err)}`);\n if (remaining === 0 && !settled) {\n settled = true;\n reject(lastError);\n }\n return;\n }\n }\n if (settled) return; // another branch may have won during async validate\n settled = true;\n controller.abort();\n resolve(parsed.data as T);\n return;\n }\n settled = true;\n controller.abort(); // Cancel losing branches\n resolve(value);\n }).catch((err) => {\n if (settled) return;\n // Ignore AbortErrors from our own cancellation\n if (err instanceof DOMException && err.name === 'AbortError') {\n remaining--;\n if (remaining === 0 && !settled) {\n settled = true;\n reject(lastError ?? new Error('All race branches were aborted'));\n }\n return;\n }\n remaining--;\n lastError = err instanceof Error ? err : new Error(String(err));\n if (remaining === 0 && !settled) {\n settled = true;\n reject(lastError);\n }\n });\n }\n });\n }\n\n // ── ctx.parallel() ────────────────────────────────────────────────────\n\n async parallel<T extends unknown[]>(fns: { [K in keyof T]: () => Promise<T[K]> }): Promise<T> {\n return this._checkpoint(\n this._autoCheckpointName('parallel'),\n () => Promise.all(fns.map((fn) => fn())) as Promise<T>,\n );\n }\n\n // ── ctx.map() ─────────────────────────────────────────────────────────\n\n async map<T, U>(\n items: T[],\n fn: (item: T, index: number) => Promise<U>,\n options?: MapOptions,\n ): Promise<Result<U>[]> {\n return this._checkpoint(this._autoCheckpointName('map'), () =>\n this._mapImpl(items, fn, options),\n );\n }\n\n private async _mapImpl<T, U>(\n items: T[],\n fn: (item: T, index: number) => Promise<U>,\n options?: MapOptions,\n ): Promise<Result<U>[]> {\n const concurrency = options?.concurrency ?? 5;\n const quorum = options?.quorum;\n const results: Result<U>[] = new Array(items.length);\n let nextIndex = 0;\n let successCount = 0;\n let completedCount = 0;\n let settled = false;\n\n const controller = quorum ? new AbortController() : undefined;\n const parentSignal = this.currentSignal;\n const mapSignal = controller\n ? parentSignal\n ? AbortSignal.any([parentSignal, controller.signal])\n : controller.signal\n : parentSignal;\n\n return new Promise<Result<U>[]>((resolve, reject) => {\n if (items.length === 0) {\n resolve([]);\n return;\n }\n\n const runNext = async () => {\n while (nextIndex < items.length && !settled) {\n const idx = nextIndex++;\n try {\n // Run each item in an AsyncLocalStorage context with the map signal\n const value = mapSignal\n ? await signalStorage.run(mapSignal, () => fn(items[idx], idx))\n : await fn(items[idx], idx);\n results[idx] = { ok: true, value };\n successCount++;\n } catch (err) {\n // Ignore AbortErrors from our own quorum cancellation\n if (\n err instanceof DOMException &&\n err.name === 'AbortError' &&\n controller?.signal.aborted\n ) {\n completedCount++;\n return;\n }\n results[idx] = { ok: false, error: err instanceof Error ? err.message : String(err) };\n }\n completedCount++;\n\n if (quorum && successCount >= quorum) {\n settled = true;\n controller?.abort(); // Cancel remaining work\n resolve(results);\n return;\n }\n\n if (completedCount === items.length) {\n if (quorum && successCount < quorum) {\n reject(new QuorumNotMet(quorum, successCount, results));\n } else {\n resolve(results);\n }\n return;\n }\n }\n };\n\n const workers = Math.min(concurrency, items.length);\n for (let i = 0; i < workers; i++) {\n runNext().catch((err) => {\n if (!settled) reject(err);\n });\n }\n });\n }\n\n // ── ctx.awaitHuman() ──────────────────────────────────────────────────\n\n async awaitHuman(options: AwaitHumanOptions): Promise<HumanDecision> {\n if (this.spanManager) {\n return this.spanManager.withSpanAsync(\n 'axl.ctx.awaitHuman',\n {\n 'axl.awaitHuman.channel': options.channel,\n },\n async (span) => {\n const start = Date.now();\n const result = await this._awaitHumanImpl(options);\n span.setAttribute('axl.awaitHuman.wait_duration', Date.now() - start);\n span.setAttribute('axl.awaitHuman.approved', result.approved);\n return result;\n },\n );\n }\n return this._awaitHumanImpl(options);\n }\n\n private async _awaitHumanImpl(options: AwaitHumanOptions): Promise<HumanDecision> {\n if (this.awaitHumanHandler) {\n // Emit `await_human` BEFORE invoking the handler so consumers see the\n // start/end pair regardless of which approval path is taken\n // (synchronous handler vs runtime-mediated pendingDecisions).\n this.emitEvent({\n type: 'await_human',\n data: { channel: options.channel, prompt: options.prompt },\n });\n const decision = await this.awaitHumanHandler(options);\n this.emitEvent({\n type: 'await_human_resolved',\n data: { channel: options.channel, decision },\n });\n return decision;\n }\n\n if (!this.pendingDecisions) {\n throw new Error(\n 'Tool requires approval but no approval handler is configured. ' +\n 'Provide awaitHumanHandler to createContext() or use runtime.execute() with workflow infrastructure.',\n );\n }\n\n if (this.stateStore) {\n await this.stateStore.savePendingDecision(this.executionId, {\n executionId: this.executionId,\n channel: options.channel,\n prompt: options.prompt,\n metadata: options.metadata,\n createdAt: new Date().toISOString(),\n });\n\n // Persist execution state so we can resume after restart\n await this.stateStore.saveExecutionState(this.executionId, {\n workflow: this.workflowName ?? 'unknown',\n input: this.input,\n step: this.stepRefRoot.value,\n status: 'waiting',\n metadata: {\n ...this.metadata,\n awaitHumanChannel: options.channel,\n awaitHumanPrompt: options.prompt,\n },\n });\n }\n\n this.emitEvent({\n type: 'await_human',\n data: { channel: options.channel, prompt: options.prompt },\n });\n\n const decision = await new Promise<HumanDecision>((resolve) => {\n this.pendingDecisions!.set(this.executionId, resolve);\n });\n\n // Mirror the synchronous-handler path — emit `await_human_resolved` so\n // every `await_human` has a paired terminal event regardless of whether\n // the decision came in-process or via runtime.resolveDecision.\n this.emitEvent({\n type: 'await_human_resolved',\n data: { channel: options.channel, decision },\n });\n\n // Update execution state to running after decision is received\n if (this.stateStore) {\n await this.stateStore.saveExecutionState(this.executionId, {\n workflow: this.workflowName ?? 'unknown',\n input: this.input,\n step: this.stepRefRoot.value,\n status: 'running',\n });\n }\n\n return decision;\n }\n\n /**\n * Compose an `AbortSignal` for a memory operation's underlying embedder\n * fetch. Combines the parent context signal (user cancellation,\n * `runtime.execute({ signal })`) with the budget hard_stop abort so\n * that either cause correctly aborts an in-flight embed call.\n *\n * Returns `undefined` if there's nothing to cancel on — the embedder\n * runs without a signal in that case, matching its prior behavior.\n *\n * @internal\n */\n private _composeMemorySignal(): AbortSignal | undefined {\n const budgetSignal = this.budgetContext?.abortController?.signal;\n if (this.signal && budgetSignal) return AbortSignal.any([this.signal, budgetSignal]);\n return this.signal ?? budgetSignal;\n }\n\n /**\n * Accumulate a cost amount into the active `budgetContext` and trip the\n * `exceeded` flag if we've crossed the limit. On `hard_stop` policy,\n * also fires the abort controller so in-flight operations cancel.\n *\n * Called from every code path that spends money: the `agent_call` loop,\n * semantic memory operations (`ctx.remember({embed:true})`, `ctx.recall({query})`),\n * and any future cost-emitting primitive. Centralizing the logic here\n * means `ctx.budget({ limit, policy })` accurately enforces the limit\n * across ALL cost sources — not just agent calls.\n *\n * @internal\n */\n private _accumulateBudgetCost(amount: number): void {\n if (!this.budgetContext) return;\n if (!Number.isFinite(amount) || amount <= 0) return;\n this.budgetContext.totalCost += amount;\n if (this.budgetContext.totalCost >= this.budgetContext.limit) {\n this.budgetContext.exceeded = true;\n // hard_stop: abort current in-flight operations immediately\n if (this.budgetContext.policy === 'hard_stop' && this.budgetContext.abortController) {\n this.budgetContext.abortController.abort();\n }\n }\n }\n\n // ── workflow lifecycle trace emission ──────────────────────────────────\n //\n // These are called by the runtime at execution boundaries. They emit\n // first-class `workflow_start` / `workflow_end` trace events instead of\n // the previous `ctx.log('workflow_start', ...)` indirection — so consumers\n // that narrow via `event.type === 'workflow_start'` actually see them.\n // Internal: the runtime is the only caller, user workflows never call these.\n\n /** @internal — idempotent; no-ops on second+ call within one ctx. */\n _emitWorkflowStart(input: unknown): void {\n if (this._workflowStartEmitted) return;\n this._workflowStartEmitted = true;\n this.emitEvent({\n type: 'workflow_start',\n workflow: this.workflowName,\n data: { input },\n });\n }\n\n /** @internal — idempotent; no-ops on second+ call within one ctx.\n * Protects against the post-emit-side-effect double-fire (reviewer\n * bug B1): `runtime.execute()` / `runtime.stream()` emit\n * `workflow_end(completed)`, then call `deleteCheckpoints` /\n * `persistExecution`. If either throws, the outer catch would\n * otherwise fire a second `workflow_end(failed)` with conflicting\n * status. First-wins semantics: the completed event stands, the\n * inner side-effect failure propagates as a normal thrown error. */\n _emitWorkflowEnd(info: {\n status: 'completed' | 'failed';\n duration: number;\n result?: unknown;\n error?: string;\n aborted?: boolean;\n }): void {\n if (this._workflowEndEmitted) return;\n this._workflowEndEmitted = true;\n this.emitEvent({\n type: 'workflow_end',\n workflow: this.workflowName,\n duration: info.duration,\n data: {\n status: info.status,\n duration: info.duration,\n ...(info.result !== undefined ? { result: info.result } : {}),\n ...(info.error !== undefined ? { error: info.error } : {}),\n ...(info.aborted ? { aborted: true } : {}),\n },\n });\n }\n\n // ── ctx.log() ─────────────────────────────────────────────────────────\n\n log(event: string, data?: unknown): void {\n this.emitEvent({\n type: 'log',\n data: {\n event,\n ...(data && typeof data === 'object'\n ? (data as Record<string, unknown>)\n : data !== undefined\n ? { value: data }\n : {}),\n },\n });\n\n // Forward log events to the active OTel span\n if (this.spanManager) {\n const attrs: Record<string, string | number | boolean> = { 'axl.log.event': event };\n if (data !== undefined && typeof data === 'object' && data !== null) {\n for (const [k, v] of Object.entries(data as Record<string, unknown>)) {\n if (typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean') {\n attrs[`axl.log.${k}`] = v;\n }\n }\n }\n this.spanManager.addEventToActiveSpan('axl.log', attrs);\n }\n }\n\n // -- ctx.remember() / ctx.recall() ----------------------------------------\n\n /**\n * Store a value in memory, scoped to the current session (default) or globally.\n * When a vector store is configured, the value is also embedded for semantic recall.\n */\n async remember(key: string, value: unknown, options?: RememberOptions): Promise<void> {\n if (!this.memoryManager) {\n throw new Error(\n 'Memory is not configured. Provide a memoryManager in WorkflowContextInit or configure memory in AxlConfig.',\n );\n }\n if (!this.stateStore) {\n throw new Error('A state store is required for memory operations.');\n }\n // Budget gate: refuse to start a new memory op if the budget has\n // already been breached. Semantic remember hits a paid embedding API\n // and without this check a hard_stop budget only stopped the next\n // `ctx.ask()` call — memory writes could keep spending after the\n // limit. Mirrors the gate at the top of `ctx.ask()`.\n if (this.budgetContext?.exceeded) {\n const { limit, totalCost: spent, policy } = this.budgetContext;\n if (policy !== 'warn') {\n throw new BudgetExceededError(limit, spent, policy);\n }\n }\n const sessionId = this.metadata?.sessionId as string | undefined;\n const scope: 'session' | 'global' = options?.scope ?? (sessionId ? 'session' : 'global');\n // Operation-only audit trail — values are deliberately NOT traced because\n // they can be arbitrary user data. Emit on both success and failure so\n // compliance consumers can reconstruct the full audit history even when\n // the underlying store rejects the write.\n try {\n const memorySignal = this._composeMemorySignal();\n const { usage } = await this.memoryManager.remember(\n key,\n value,\n this.stateStore,\n sessionId,\n options,\n memorySignal,\n );\n // Budget attribution: embedder spend counts against `ctx.budget()`\n // the same way agent_call cost does. Without this, a RAG workload\n // with heavy semantic memory can silently breach a hard_stop\n // budget (memory cost was previously only flowing through the\n // trace-event rail for trackExecution, bypassing budgetContext).\n if (usage?.cost != null) {\n this._accumulateBudgetCost(usage.cost);\n }\n // Surface embedder cost at the AxlEvent top level so the\n // `trackExecution` listener picks it up automatically (it sums\n // `event.cost` across every event in scope, regardless of type).\n // Also mirror `usage.tokens` to top-level `tokens.input` so the\n // CostAggregator's early-return gate (`cost == null && !tokens`)\n // doesn't silently drop zero-cost-but-nonzero-token events from a\n // local embedder or an unknown-pricing model. Tokens live in\n // `tokens.input` because embedding APIs bill on input only.\n // `usage` is also nested into the event `data` for trace-explorer\n // visibility (debuggers see the full model/cost/tokens breakdown).\n this.emitEvent({\n type: 'memory_remember',\n ...(usage?.cost != null ? { cost: usage.cost } : {}),\n ...(usage?.tokens != null ? { tokens: { input: usage.tokens } } : {}),\n data: {\n key,\n scope,\n embed: options?.embed === true,\n ...(usage ? { usage } : {}),\n },\n });\n } catch (err) {\n // Recover cost attribution on the partial-failure path: if the\n // embedder call succeeded but a downstream step (vectorStore.upsert)\n // failed, `MemoryManager.remember` attaches the usage to the error\n // as a non-enumerable `axlEmbedUsage` property. The user has already\n // been billed for the embed — we owe them accurate cost tracking\n // even though the memory write ultimately failed (including budget\n // accounting, so a partial-failure RAG burst still counts against\n // a hard_stop budget).\n const partialUsage = (err as { axlEmbedUsage?: import('./memory/types.js').EmbedUsage })\n .axlEmbedUsage;\n if (partialUsage?.cost != null) {\n this._accumulateBudgetCost(partialUsage.cost);\n }\n this.emitEvent({\n type: 'memory_remember',\n ...(partialUsage?.cost != null ? { cost: partialUsage.cost } : {}),\n ...(partialUsage?.tokens != null ? { tokens: { input: partialUsage.tokens } } : {}),\n data: {\n key,\n scope,\n embed: options?.embed === true,\n ...(partialUsage ? { usage: partialUsage } : {}),\n error: err instanceof Error ? err.message : String(err),\n },\n });\n throw err;\n }\n }\n\n /**\n * Recall a value from memory by key, or perform semantic search if query option is provided.\n */\n async recall(key: string, options?: RecallOptions): Promise<unknown | VectorResult[] | null> {\n if (!this.memoryManager) {\n throw new Error(\n 'Memory is not configured. Provide a memoryManager in WorkflowContextInit or configure memory in AxlConfig.',\n );\n }\n if (!this.stateStore) {\n throw new Error('A state store is required for memory operations.');\n }\n // Budget gate: refuse to start a new semantic recall if the budget\n // has already been breached. See ctx.remember for rationale.\n if (this.budgetContext?.exceeded) {\n const { limit, totalCost: spent, policy } = this.budgetContext;\n if (policy !== 'warn') {\n throw new BudgetExceededError(limit, spent, policy);\n }\n }\n const sessionId = this.metadata?.sessionId as string | undefined;\n const scope: 'session' | 'global' = options?.scope ?? (sessionId ? 'session' : 'global');\n const semantic = options?.query !== undefined;\n // Operation-only audit trail. Emit on both success and failure.\n try {\n const memorySignal = this._composeMemorySignal();\n const { data, usage } = await this.memoryManager.recall(\n key,\n this.stateStore,\n sessionId,\n options,\n memorySignal,\n );\n let hit: boolean;\n let resultCount: number | undefined;\n if (semantic) {\n resultCount = Array.isArray(data) ? data.length : 0;\n hit = resultCount > 0;\n } else {\n hit = data !== null && data !== undefined;\n }\n // Budget attribution: semantic recall embedder cost counts against\n // `ctx.budget()`. Heavy RAG read workloads could previously breach\n // a hard_stop budget silently — memory cost flowed through the trace\n // rail for trackExecution but bypassed budgetContext.\n if (usage?.cost != null) {\n this._accumulateBudgetCost(usage.cost);\n }\n // Surface embedder cost + tokens at the AxlEvent top level so\n // the `trackExecution` listener picks cost up and the CostAggregator's\n // early-return gate (`cost == null && !tokens`) doesn't silently\n // drop zero-cost-but-nonzero-token events. `usage` is also nested\n // into `data.usage` for trace inspection.\n this.emitEvent({\n type: 'memory_recall',\n ...(usage?.cost != null ? { cost: usage.cost } : {}),\n ...(usage?.tokens != null ? { tokens: { input: usage.tokens } } : {}),\n data: {\n key,\n scope,\n semantic,\n hit,\n ...(resultCount !== undefined ? { resultCount, count: resultCount } : {}),\n ...(usage ? { usage } : {}),\n },\n });\n return data;\n } catch (err) {\n this.emitEvent({\n type: 'memory_recall',\n data: {\n key,\n scope,\n semantic,\n hit: false,\n error: err instanceof Error ? err.message : String(err),\n },\n });\n throw err;\n }\n }\n\n /** Delete a memory entry by key. */\n async forget(key: string, options?: { scope?: 'session' | 'global' }): Promise<void> {\n if (!this.memoryManager) {\n throw new Error(\n 'Memory is not configured. Provide a memoryManager in WorkflowContextInit or configure memory in AxlConfig.',\n );\n }\n if (!this.stateStore) {\n throw new Error('A state store is required for memory operations.');\n }\n const sessionId = this.metadata?.sessionId as string | undefined;\n const scope: 'session' | 'global' = options?.scope ?? (sessionId ? 'session' : 'global');\n try {\n await this.memoryManager.forget(key, this.stateStore, sessionId, options);\n this.emitEvent({\n type: 'memory_forget',\n data: { key, scope },\n });\n } catch (err) {\n this.emitEvent({\n type: 'memory_forget',\n data: {\n key,\n scope,\n error: err instanceof Error ? err.message : String(err),\n },\n });\n throw err;\n }\n }\n\n // ── ctx.delegate() ──────────────────────────────────────────────────\n\n /**\n * Select the best agent from a list of candidates and invoke it.\n * Creates a temporary router agent that uses handoffs to pick the right specialist.\n *\n * This is convenience sugar over creating a router agent with dynamic handoffs.\n * For full control over the router's behavior, create the router agent explicitly.\n *\n * @param agents - Candidate agents to choose from (at least 1)\n * @param prompt - The prompt to send to the selected agent\n * @param options - Optional: schema, routerModel, metadata, retries\n */\n async delegate<T = string>(\n agents: Agent[],\n prompt: string,\n options?: DelegateOptions<T>,\n ): Promise<T> {\n if (agents.length === 0) {\n throw new Error('ctx.delegate() requires at least one candidate agent');\n }\n\n // Validate no duplicate agent names — duplicates produce duplicate tool names\n // which violates LLM API contracts and makes the second agent unreachable.\n const names = new Set<string>();\n for (const a of agents) {\n if (names.has(a._name)) {\n throw new Error(\n `ctx.delegate() received duplicate agent name '${a._name}'. All candidate agents must have unique names.`,\n );\n }\n names.add(a._name);\n }\n\n if (agents.length === 1) {\n this.emitEvent({\n type: 'delegate',\n agent: agents[0]._name,\n data: {\n candidates: [agents[0]._name],\n selected: agents[0]._name,\n reason: 'single_candidate',\n },\n });\n return this.ask(agents[0], prompt, {\n schema: options?.schema,\n retries: options?.retries,\n metadata: options?.metadata,\n validate: options?.validate,\n validateRetries: options?.validateRetries,\n });\n }\n\n // Resolve the router model: explicit option > first candidate's model\n const resolveCtx = options?.metadata\n ? { metadata: { ...this.metadata, ...options.metadata } }\n : { metadata: this.metadata };\n const routerModelUri = options?.routerModel ?? agents[0].resolveModel(resolveCtx);\n\n // Build handoff descriptors from candidates.\n // Use the agent's system prompt (truncated) as the handoff description\n // so the router LLM understands each candidate's capability.\n const handoffs = agents.map((a) => {\n let description: string;\n try {\n description = a.resolveSystem(resolveCtx).slice(0, 200);\n } catch {\n description = `Agent: ${a._name}`;\n }\n return { agent: a, description };\n });\n\n const routerSystem =\n 'Route to the best agent for this task. Always hand off; never answer directly.';\n\n // Create a temporary router agent (inline to avoid circular import with agent.ts).\n // maxTurns: 2 allows one turn for the LLM to pick a handoff, plus one retry\n // if the first response is text instead of a tool call.\n const routerAgent: Agent = {\n _config: {\n model: routerModelUri,\n system: routerSystem,\n temperature: 0,\n handoffs,\n maxTurns: 2,\n },\n _name: '_delegate_router',\n ask: async () => {\n throw new Error('Direct invocation not supported on delegate router');\n },\n resolveModel: () => routerModelUri,\n resolveSystem: () => routerSystem,\n };\n\n this.emitEvent({\n type: 'delegate',\n agent: '_delegate_router',\n data: {\n candidates: agents.map((a) => a._name),\n routerModel: routerModelUri,\n reason: 'routed',\n },\n });\n\n return this.ask(routerAgent, prompt, {\n schema: options?.schema,\n retries: options?.retries,\n metadata: options?.metadata,\n validate: options?.validate,\n validateRetries: options?.validateRetries,\n });\n }\n\n // ── Private ───────────────────────────────────────────────────────────\n\n /**\n * Internal emitter input — intentionally loose so call sites don't need to\n * build a perfectly-narrowed discriminated-union member. The resulting\n * `AxlEvent` (exported type) remains strict, and TypeScript narrows it at\n * consumer sites via the `type` discriminator.\n */\n private emitEvent(partial: {\n type: AxlEvent['type'];\n workflow?: string;\n agent?: string;\n tool?: string;\n promptVersion?: string;\n model?: string;\n cost?: number;\n tokens?: { input?: number; output?: number; reasoning?: number };\n duration?: number;\n data?: unknown;\n // Variant-specific fields are accepted as `unknown`-typed extras so\n // call sites don't need to build a perfectly-narrowed discriminated\n // union member. The final `as unknown as AxlEvent` cast at the bottom\n // of the function is the runtime contract — emit sites are\n // responsible for pairing `type` with the matching variant fields.\n [key: string]: unknown;\n }): void {\n // Redaction is now table-driven: `REDACTION_RULES` in `redaction.ts`\n // owns every per-variant scrub, applied below to the constructed\n // event via `redactEvent(...)`. The legacy if/else ladder that used\n // to live here was duplicated by Studio's `redactStreamEvent`; both\n // sites now consult the same rules so adding a new event variant\n // can't drift between layers. Per-variant scrub contracts live at\n // the rule definitions in `redaction.ts`.\n const data: unknown = partial.data;\n // `as unknown as AxlEvent`: the loose internal `partial` type can't be\n // narrowed to a single discriminated union member at compile time, but the\n // runtime invariant is maintained by the gate/emission call sites that\n // always pair `type` with matching `data`/`tool`/etc.\n //\n // NOTE on redaction: we deliberately do NOT scrub top-level `cost`,\n // `tokens`, or `duration` under `config.trace.redact`. They are numeric\n // observability metrics (non-PII) and are load-bearing — `trackExecution`'s\n // cost-aggregation listener and Studio's CostAggregator both read\n // `event.cost` / `event.tokens` directly, so zeroing them would silently\n // break cost totals when redaction is enabled. In strict compliance\n // environments where even aggregate spend is sensitive, callers should\n // filter these events out entirely via `onTrace` rather than mutate them.\n //\n // NOTE on `workflow`: every trace event gets stamped with the owning\n // workflow name automatically (if set on the context). Previously each\n // caller had to explicitly pass `workflow` in the partial, and only\n // `_emitWorkflowStart` / `_emitWorkflowEnd` did so — which meant\n // `event.workflow` was undefined on every other event type in production.\n // Studio's `CostData.byWorkflow.cost` was effectively always $0 as a\n // result (workflows appeared with execution counts but zero spend).\n // Auto-stamping here is the single-source-of-truth fix: callers can\n // still override via `partial.workflow` if needed (e.g. a child context\n // emitting on behalf of its parent), but the common case \"just works\".\n // Read the ALS frame for ask correlation. The step counter prefers the\n // ALS frame's `stepRef` (which is `this.stepRefRoot` for top-level\n // asks, or the parent's counter for nested asks). Out-of-ask events\n // (workflow_start, workflow_end, ad-hoc log) also use `stepRefRoot` so\n // every event from this WorkflowContext shares one monotonic counter.\n const frame = askStorage.getStore();\n const step = (frame?.stepRef ?? this.stepRefRoot).value++;\n // Per-frame ask cost rollup. Only count cost-bearing leaf events\n // emitted directly within this frame — nested asks have their own\n // frame and their own counter, and their own `ask_end` event will\n // surface their rollup. This keeps `ask_end.cost` honest per spec\n // decision 10. Uses `COST_BEARING_LEAF_TYPES` so the rollup stays\n // in lockstep with `eventCostContribution` / `isCostBearingLeaf` —\n // previously this was hardcoded to `agent_call_end | tool_call_end`\n // which silently dropped embedder cost (`memory_remember` /\n // `memory_recall`) from the per-ask rollup when `ctx.recall()` ran\n // inside an ask.\n const cost = (partial as { cost?: number }).cost;\n if (\n frame &&\n typeof cost === 'number' &&\n Number.isFinite(cost) &&\n cost >= 0 &&\n (COST_BEARING_LEAF_TYPES as readonly string[]).includes(partial.type as string)\n ) {\n frame.askCost.value += cost;\n }\n const event = {\n executionId: this.executionId,\n step,\n timestamp: Date.now(),\n ...(this.workflowName ? { workflow: this.workflowName } : {}),\n // Stamp ask correlation from ALS. Variants like `workflow_start` /\n // `workflow_end` and out-of-ask events (log/memory/checkpoint/await_human\n // when emitted at workflow scope) may legitimately have no frame —\n // they still get `depth: 0` so consumers can render them at root\n // level without having to guess. `askId`/`parentAskId`/`agent` stay\n // unset for non-ask-scoped events, matching the `Partial<AskScoped>`\n // shape on those union members.\n ...(frame\n ? {\n askId: frame.askId,\n ...(frame.parentAskId ? { parentAskId: frame.parentAskId } : {}),\n depth: frame.depth,\n ...(frame.agent ? { agent: frame.agent } : {}),\n }\n : { depth: 0 }),\n ...partial,\n data,\n } as unknown as AxlEvent;\n // Per-variant scrub via the shared `REDACTION_RULES` table — single\n // source of truth shared with Studio's `redactStreamEvent`. Applied\n // AFTER the event is constructed so cost-rail accumulation (above)\n // sees the unscrubbed numeric fields. Top-level numerics (`cost`,\n // `tokens`, `duration`) are preserved by every rule.\n const finalEvent = this.config.trace?.redact ? redactEvent(event) : event;\n // Isolate consumer bugs: a buggy onTrace handler must not crash the\n // workflow. Swallow and forward to console.error so the caller sees\n // the failure in ops but the workflow keeps running.\n if (this.onTrace) {\n try {\n this.onTrace(finalEvent);\n } catch (err) {\n console.error(\n '[axl] onTrace handler threw; trace event dropped:',\n err instanceof Error ? err.message : String(err),\n );\n }\n }\n }\n}\n","import type { ZodError } from 'zod';\nimport type { Result } from './types.js';\n\n/** Base error class for all Axl errors */\nexport class AxlError extends Error {\n readonly code: string;\n\n constructor(code: string, message: string) {\n super(message);\n this.name = 'AxlError';\n this.code = code;\n }\n}\n\n/** Thrown when schema validation fails after all retries exhausted */\nexport class VerifyError extends AxlError {\n readonly lastOutput: unknown;\n readonly zodError: ZodError;\n readonly retries: number;\n\n constructor(lastOutput: unknown, zodError: ZodError, retries: number) {\n super('VERIFY_ERROR', `Schema validation failed after ${retries} retries: ${zodError.message}`);\n this.name = 'VerifyError';\n this.lastOutput = lastOutput;\n this.zodError = zodError;\n this.retries = retries;\n }\n}\n\n/** Thrown when quorum is not met in spawn */\nexport class QuorumNotMet extends AxlError {\n readonly results: Result<unknown>[];\n\n constructor(required: number, actual: number, results: Result<unknown>[]) {\n super('QUORUM_NOT_MET', `Quorum not met: needed ${required} successes, got ${actual}`);\n this.name = 'QuorumNotMet';\n this.results = results;\n }\n}\n\n/** Thrown when vote cannot reach consensus */\nexport class NoConsensus extends AxlError {\n constructor(reason: string) {\n super('NO_CONSENSUS', `No consensus: ${reason}`);\n this.name = 'NoConsensus';\n }\n}\n\n/** Thrown when an operation exceeds its timeout */\nexport class TimeoutError extends AxlError {\n constructor(operation: string, timeoutMs: number) {\n super('TIMEOUT', `${operation} exceeded timeout of ${timeoutMs}ms`);\n this.name = 'TimeoutError';\n }\n}\n\n/**\n * Format a cost for human-readable error messages. Uses tiered precision\n * so sub-cent costs (semantic memory embedder calls, cached responses,\n * free-tier models) don't collapse to `$0.0000`. Mirrors the Studio\n * client's `formatCost` utility so users see consistent numbers.\n *\n * Sign: negative values prefix `-` before the `$`, so `-1.50` renders\n * as `-$1.50` (not `$-1.50`). Negative costs aren't physically\n * meaningful but a budget accounting bug could produce them, and we\n * want those to be visibly wrong instead of hidden behind formatting.\n *\n * Non-finite: `NaN` and `±Infinity` are fail-loud signals that\n * something is broken in cost accounting — we preserve them literally\n * (`$NaN`, `$Infinity`, `-$Infinity`) so users see the bug in the\n * error message rather than a misleading `$0.00`.\n *\n * Tiers (for finite, non-zero values):\n * `|cost| < $0.000001` (noise) → `< $0.000001` (or `-< $0.000001`)\n * `|cost| < $0.0001` → scientific, e.g. `$1.5e-7`\n * `|cost| < $0.01` → 6 decimals, e.g. `$0.000095`\n * `|cost| >= $0.01` → 2 decimals, e.g. `$1.23`\n */\nfunction formatBudgetCost(cost: number): string {\n // Fail-loud on non-finite: `NaN` / `Infinity` reaching this function\n // almost certainly means a cost-accounting bug, and collapsing them\n // to `$0.00` would hide the signal in the error message.\n if (Number.isNaN(cost)) return '$NaN';\n if (cost === Infinity) return '$Infinity';\n if (cost === -Infinity) return '-$Infinity';\n if (cost === 0) return '$0.00';\n\n const sign = cost < 0 ? '-' : '';\n const abs = Math.abs(cost);\n if (abs < 0.000001) return `${sign}< $0.000001`;\n if (abs < 0.0001) {\n const [mantissa, exponent] = abs.toExponential(2).split('e');\n return `${sign}$${mantissa}e${parseInt(exponent, 10)}`;\n }\n if (abs < 0.01) return `${sign}$${abs.toFixed(6)}`;\n return `${sign}$${abs.toFixed(2)}`;\n}\n\n/** Thrown when a budget limit is exceeded */\nexport class BudgetExceededError extends AxlError {\n readonly limit: number;\n readonly spent: number;\n readonly policy: string;\n\n constructor(limit: number, spent: number, policy: string) {\n super(\n 'BUDGET_EXCEEDED',\n `Budget exceeded: spent ${formatBudgetCost(spent)} of ${formatBudgetCost(\n limit,\n )} limit (policy: ${policy})`,\n );\n this.name = 'BudgetExceededError';\n this.limit = limit;\n this.spent = spent;\n this.policy = policy;\n }\n}\n\n/** Thrown when an agent exceeds its maximum number of tool-calling turns */\nexport class MaxTurnsError extends AxlError {\n readonly maxTurns: number;\n\n constructor(operation: string, maxTurns: number) {\n super('MAX_TURNS', `${operation} exceeded maximum of ${maxTurns} turns`);\n this.name = 'MaxTurnsError';\n this.maxTurns = maxTurns;\n }\n}\n\n/** Thrown when a guardrail blocks a request/response and the policy is 'throw'. */\nexport class GuardrailError extends AxlError {\n readonly guardrailType: 'input' | 'output';\n readonly reason: string;\n\n constructor(guardrailType: 'input' | 'output', reason: string) {\n super('GUARDRAIL_BLOCKED', `${guardrailType} guardrail blocked: ${reason}`);\n this.name = 'GuardrailError';\n this.guardrailType = guardrailType;\n this.reason = reason;\n }\n}\n\n/** Thrown when post-schema business rule validation fails after all retries exhausted */\nexport class ValidationError extends AxlError {\n readonly lastOutput: unknown;\n readonly reason: string;\n readonly retries: number;\n\n constructor(lastOutput: unknown, reason: string, retries: number) {\n super('VALIDATION_ERROR', `Validation failed after ${retries} retries: ${reason}`);\n this.name = 'ValidationError';\n this.lastOutput = lastOutput;\n this.reason = reason;\n this.retries = retries;\n }\n}\n\n/** Internal: thrown when an agent tries to call a tool not in its ACL */\nexport class ToolDenied extends AxlError {\n readonly toolName: string;\n readonly agentName: string;\n\n constructor(toolName: string, agentName: string) {\n super(\n 'TOOL_DENIED',\n `Agent \"${agentName}\" attempted to call tool \"${toolName}\" which is not in its ACL`,\n );\n this.name = 'ToolDenied';\n this.toolName = toolName;\n this.agentName = agentName;\n }\n}\n","/**\n * Tolerant JSON parser for progressive structured-output streaming.\n *\n * Accepts partial / truncated JSON and returns the longest parseable prefix\n * as a structured value. Used by `ctx.ask({ schema })` while streaming so\n * consumers can render fields as they arrive — see `partial_object` AxlEvent.\n *\n * Scope (intentional minimum):\n * - Single-pass tokenizer + recursive-descent state machine.\n * - Only TRAILING truncation is tolerated. Mid-document malformed input\n * throws. (A consumer rendering progressive output sees one well-formed\n * subtree at a time, never bogus shape changes.)\n * - Supports objects, arrays, strings (with `\\\"` `\\\\` `\\n` `\\t` `\\r` `\\b`\n * `\\f` `\\/` `\\uXXXX`), numbers (int/float/exp/negative), `true` /\n * `false` / `null`.\n * - Rejects: trailing commas, comments, unquoted keys.\n *\n * Truncation recovery:\n * - Unterminated string → return content parsed so far.\n * - Unterminated number → return valid prefix if it's a complete number;\n * drop the key/value if the prefix is malformed\n * (`-`, `1.`, `1e` → drop).\n * - Unclosed `[` → array with parsed elements.\n * - Unclosed `{` → object with parsed pairs. A key without a value\n * is dropped.\n * - `,` or `:` at EOF → ignored; the last complete value wins.\n *\n * Zero runtime deps. ~250 LOC.\n */\n\n/**\n * Maximum nesting depth we'll accept before throwing. LLM responses\n * don't organically produce 256-deep nested structures — a deeply-\n * adversarial provider returning `[[[[[...]]]]]` can exhaust V8's\n * default ~10k-frame stack via the recursive-descent walker (each\n * `parseValue` → `parseArray/Object` pair consumes ~3 frames). The\n * cap is an availability guard, not a correctness limit.\n */\nconst MAX_DEPTH = 256;\n\n/** Parse a JSON-shaped string that may be truncated mid-stream. */\nexport function parsePartialJson(input: string): unknown {\n const parser = new PartialParser(input);\n parser.skipWhitespace();\n if (parser.eof()) return undefined;\n const result = parser.parseValue();\n return result.value;\n}\n\n/** Internal: a single attempt at parsing some prefix of the input. */\ntype ParseResult = { value: unknown; complete: boolean };\n\nclass PartialParser {\n private pos = 0;\n private depth = 0;\n constructor(private readonly src: string) {}\n\n eof(): boolean {\n return this.pos >= this.src.length;\n }\n\n peek(): string {\n return this.src[this.pos];\n }\n\n advance(): string {\n return this.src[this.pos++];\n }\n\n skipWhitespace(): void {\n while (!this.eof()) {\n const c = this.peek();\n if (c === ' ' || c === '\\n' || c === '\\t' || c === '\\r') {\n this.pos++;\n } else {\n break;\n }\n }\n }\n\n parseValue(): ParseResult {\n this.skipWhitespace();\n if (this.eof()) return { value: undefined, complete: false };\n const c = this.peek();\n // Gate object/array recursion on the depth counter — scalar parsers\n // don't recurse so they skip the check. Enter/exit via try/finally\n // so any throw from below (EOF, malformed input) still restores the\n // depth counter to its caller-visible state.\n if (c === '{' || c === '[') {\n if (++this.depth > MAX_DEPTH) {\n throw new SyntaxError(\n `Maximum nesting depth exceeded (${MAX_DEPTH}) at position ${this.pos}`,\n );\n }\n try {\n return c === '{' ? this.parseObject() : this.parseArray();\n } finally {\n this.depth--;\n }\n }\n if (c === '\"') return this.parseString();\n if (c === 't' || c === 'f') return this.parseBool();\n if (c === 'n') return this.parseNull();\n if (c === '-' || (c >= '0' && c <= '9')) return this.parseNumber();\n throw new SyntaxError(`Unexpected character '${c}' at position ${this.pos}`);\n }\n\n parseObject(): ParseResult {\n this.advance(); // consume '{'\n const obj: Record<string, unknown> = {};\n this.skipWhitespace();\n if (this.eof()) return { value: obj, complete: false };\n if (this.peek() === '}') {\n this.advance();\n return { value: obj, complete: true };\n }\n while (!this.eof()) {\n this.skipWhitespace();\n if (this.eof()) return { value: obj, complete: false };\n // Trailing comma sniff (mid-stream, the previous iteration already\n // consumed a comma): if we see `}` here, the object is closed.\n if (this.peek() === '}') {\n this.advance();\n return { value: obj, complete: true };\n }\n // Key must be a string. Unquoted keys are rejected.\n if (this.peek() !== '\"') {\n throw new SyntaxError(`Expected '\"' at position ${this.pos}, got '${this.peek()}'`);\n }\n const keyResult = this.parseString();\n if (!keyResult.complete) {\n // Truncated key — drop it; the rest of the object stands.\n return { value: obj, complete: false };\n }\n const key = keyResult.value as string;\n this.skipWhitespace();\n if (this.eof()) return { value: obj, complete: false };\n if (this.peek() !== ':') {\n // Truncated before colon — drop the dangling key.\n return { value: obj, complete: false };\n }\n this.advance(); // consume ':'\n this.skipWhitespace();\n if (this.eof()) return { value: obj, complete: false };\n const valueResult = this.parseValue();\n if (valueResult.value !== undefined || valueResult.complete) {\n obj[key] = valueResult.value;\n }\n if (!valueResult.complete) {\n return { value: obj, complete: false };\n }\n this.skipWhitespace();\n if (this.eof()) return { value: obj, complete: false };\n const next = this.peek();\n if (next === ',') {\n this.advance();\n continue;\n }\n if (next === '}') {\n this.advance();\n return { value: obj, complete: true };\n }\n throw new SyntaxError(`Expected ',' or '}' at position ${this.pos}, got '${next}'`);\n }\n return { value: obj, complete: false };\n }\n\n parseArray(): ParseResult {\n this.advance(); // consume '['\n const arr: unknown[] = [];\n this.skipWhitespace();\n if (this.eof()) return { value: arr, complete: false };\n if (this.peek() === ']') {\n this.advance();\n return { value: arr, complete: true };\n }\n while (!this.eof()) {\n this.skipWhitespace();\n if (this.eof()) return { value: arr, complete: false };\n if (this.peek() === ']') {\n this.advance();\n return { value: arr, complete: true };\n }\n const elemResult = this.parseValue();\n if (elemResult.value !== undefined || elemResult.complete) {\n arr.push(elemResult.value);\n }\n if (!elemResult.complete) {\n return { value: arr, complete: false };\n }\n this.skipWhitespace();\n if (this.eof()) return { value: arr, complete: false };\n const next = this.peek();\n if (next === ',') {\n this.advance();\n continue;\n }\n if (next === ']') {\n this.advance();\n return { value: arr, complete: true };\n }\n throw new SyntaxError(`Expected ',' or ']' at position ${this.pos}, got '${next}'`);\n }\n return { value: arr, complete: false };\n }\n\n parseString(): ParseResult {\n this.advance(); // consume opening '\"'\n let result = '';\n while (!this.eof()) {\n const c = this.advance();\n if (c === '\"') return { value: result, complete: true };\n if (c === '\\\\') {\n if (this.eof()) {\n // Trailing backslash — drop it, return what we have.\n return { value: result, complete: false };\n }\n const esc = this.advance();\n switch (esc) {\n case '\"':\n result += '\"';\n break;\n case '\\\\':\n result += '\\\\';\n break;\n case '/':\n result += '/';\n break;\n case 'b':\n result += '\\b';\n break;\n case 'f':\n result += '\\f';\n break;\n case 'n':\n result += '\\n';\n break;\n case 'r':\n result += '\\r';\n break;\n case 't':\n result += '\\t';\n break;\n case 'u': {\n // 4 hex digits\n if (this.pos + 4 > this.src.length) {\n return { value: result, complete: false };\n }\n const hex = this.src.slice(this.pos, this.pos + 4);\n if (!/^[0-9a-fA-F]{4}$/.test(hex)) {\n throw new SyntaxError(`Invalid \\\\u escape '${hex}' at position ${this.pos}`);\n }\n this.pos += 4;\n result += String.fromCharCode(parseInt(hex, 16));\n break;\n }\n default:\n throw new SyntaxError(`Invalid escape '\\\\${esc}' at position ${this.pos - 1}`);\n }\n } else {\n result += c;\n }\n }\n // EOF without closing quote.\n return { value: result, complete: false };\n }\n\n parseNumber(): ParseResult {\n const start = this.pos;\n if (this.peek() === '-') this.advance();\n // Integer part\n while (!this.eof() && this.peek() >= '0' && this.peek() <= '9') this.advance();\n // Fractional part\n if (!this.eof() && this.peek() === '.') {\n this.advance();\n while (!this.eof() && this.peek() >= '0' && this.peek() <= '9') this.advance();\n }\n // Exponent\n if (!this.eof() && (this.peek() === 'e' || this.peek() === 'E')) {\n this.advance();\n if (!this.eof() && (this.peek() === '+' || this.peek() === '-')) this.advance();\n while (!this.eof() && this.peek() >= '0' && this.peek() <= '9') this.advance();\n }\n const text = this.src.slice(start, this.pos);\n // Reject malformed prefixes like '-', '1.', '1e', '1e+'.\n if (text === '' || text === '-' || /\\.$/.test(text) || /[eE][+-]?$/.test(text)) {\n return { value: undefined, complete: false };\n }\n const n = Number(text);\n if (Number.isNaN(n)) {\n return { value: undefined, complete: false };\n }\n return { value: n, complete: true };\n }\n\n parseBool(): ParseResult {\n const remaining = this.src.slice(this.pos);\n if (remaining.startsWith('true')) {\n this.pos += 4;\n return { value: true, complete: true };\n }\n if (remaining.startsWith('false')) {\n this.pos += 5;\n return { value: false, complete: true };\n }\n // Truncated — could be 'tru' or 'fals'. Drop.\n if ('true'.startsWith(remaining) || 'false'.startsWith(remaining)) {\n this.pos = this.src.length;\n return { value: undefined, complete: false };\n }\n throw new SyntaxError(`Expected 'true' or 'false' at position ${this.pos}`);\n }\n\n parseNull(): ParseResult {\n const remaining = this.src.slice(this.pos);\n if (remaining.startsWith('null')) {\n this.pos += 4;\n return { value: null, complete: true };\n }\n if ('null'.startsWith(remaining)) {\n this.pos = this.src.length;\n return { value: undefined, complete: false };\n }\n throw new SyntaxError(`Expected 'null' at position ${this.pos}`);\n }\n}\n","/**\n * Shared helpers for working with `AxlEvent` streams.\n *\n * Consumers writing their own accumulators / reducers reach for these so\n * they don't have to re-derive spec invariants at every call site. The\n * core runtime, AxlTestRuntime, and Studio's cost reducer ALL use these —\n * keeping one source of truth for each invariant.\n */\nimport type { AxlEvent } from './types.js';\n\n/**\n * Variants that directly carry an authoritative cost charge from the\n * provider (or embedder). `ask_end` is a per-ask ROLLUP of these leaves\n * — counting it alongside them would double-charge. Any future\n * cost-emitting variant MUST be added here AND NOT be a rollup.\n *\n * Treated as a `Set` for O(1) membership checks; exported `as const`\n * tuple so exhaustiveness fixtures can cross-check against\n * `AXL_EVENT_TYPES`.\n */\nexport const COST_BEARING_LEAF_TYPES = [\n 'agent_call_end',\n 'tool_call_end',\n 'memory_remember',\n 'memory_recall',\n] as const;\n\nconst COST_LEAF_SET: ReadonlySet<string> = new Set(COST_BEARING_LEAF_TYPES);\n\n/**\n * Cost contribution of `event` to a running total.\n *\n * Returns the event's `cost` if it's a cost-bearing leaf; 0 otherwise.\n * The key invariant (spec/16 decision 10): `ask_end` events carry a\n * per-ask ROLLUP of leaf costs that already passed through consumer\n * accumulators, so they contribute 0 here to avoid double-counting.\n *\n * Use this at every place you'd write `total += event.cost`:\n *\n * for (const ev of info.events) total += eventCostContribution(ev);\n *\n * Consumers who want the authoritative per-ask rollup read\n * `ask_end.cost` directly — that field is populated whether or not\n * the leaf events were summed separately. Spec decision 10.\n */\nexport function eventCostContribution(event: AxlEvent): number {\n // `ask_end` explicitly excluded (rollup). Other variants that carry\n // a top-level `cost` (e.g., `agent_call_end`, `tool_call_end`,\n // `memory_*`) contribute their charge directly. Unknown future\n // variants with `cost` set but NOT in the leaf set also contribute\n // — covering providers that invent new cost-bearing events. The\n // conservative choice would be \"only count whitelisted\"; we've\n // chosen the liberal choice (\"count anything with cost except\n // ask_end\") because missing a cost charge is a harder-to-detect\n // regression than a small over-count on a hypothetical new variant.\n //\n // `Number.isFinite` guards against NaN / +-Infinity from malformed\n // pricing tables (spec/16 bug-review §B-2). `c >= 0` guards against\n // negative values — providers always charge, never refund per-call,\n // so a negative `cost` is almost certainly a pricing-table typo or a\n // buggy third-party provider. Silently ignore either anomaly:\n // polluting the running total is permanent — it flows into every\n // downstream consumer (budget checks, cost dashboard, eval metadata)\n // and can't be recovered.\n if (event.type === 'ask_end') return 0;\n const c = event.cost;\n return typeof c === 'number' && Number.isFinite(c) && c >= 0 ? c : 0;\n}\n\n/**\n * True when the event is a cost-bearing leaf (contributes directly to\n * totals) — used by internal emitters that need to know whether to\n * bump per-frame askCost rollups.\n *\n * Distinct from `eventCostContribution(e) > 0`: an `agent_call_end`\n * with `cost: 0` is still a leaf (produced by a free / cached turn),\n * just one that happens to contribute zero.\n */\nexport function isCostBearingLeaf(event: AxlEvent): boolean {\n return COST_LEAF_SET.has(event.type);\n}\n\n/**\n * True when the event originates from the root ask (`depth === 0`)\n * or has no ask correlation at all (workflow / done / error / log).\n *\n * Used by consumers that want \"just the chat bubble\" tokens or\n * \"just the root ask\" visuals. Nested-ask UIs drop this filter.\n *\n * `depth` is coerced through `?? 0` so events without the field\n * (out-of-ask lifecycle events, synthesized terminals) are treated\n * as root-level — they're never at depth ≥ 1.\n */\nexport function isRootLevel(event: AxlEvent): boolean {\n // `AskScoped` variants carry `depth`; out-of-ask lifecycle events\n // (workflow_*, done, error, handoff without askId) don't. Treat\n // missing `depth` as root-level — those events are never at\n // depth ≥ 1.\n const d = (event as { depth?: number }).depth;\n return (d ?? 0) === 0;\n}\n","/**\n * Per-variant redaction rules for `AxlEvent`.\n *\n * `config.trace.redact` is an observability-boundary filter that scrubs\n * user/LLM content from events before they reach consumers. Two layers\n * historically applied this filter independently:\n *\n * 1. Core: `WorkflowContext.emitEvent()` — emit-time scrub before `onTrace`.\n * 2. Studio: `redactStreamEvent()` — wire-boundary scrub before WS broadcast\n * and again at REST serialization (`redactExecutionInfo`).\n *\n * Both layers walked the same `AxlEvent` discriminated union, with separate\n * if/else and switch/case ladders. Adding a new variant required updating\n * both. They had drifted: WS missed `workflow_start`/`workflow_end`,\n * `log`, and the full `memory_*` walk that core applied. Defense-in-depth\n * also broke for runtimes that flipped `redact` after emitting events —\n * REST reads of stored `ExecutionInfo.events` would leak fields the WS\n * layer didn't know to scrub.\n *\n * `REDACTION_RULES` is the single source of truth: a `Record<AxlEventType,\n * RuleFor<...>>` so adding a new variant to `AXL_EVENT_TYPES` without a\n * corresponding entry is a typecheck error. Every rule is pure (no\n * mutation), so the same rule runs at emit time and at the wire boundary\n * with identical results.\n *\n * Numeric/structural fields (`cost`, `tokens`, `duration`, `askId`,\n * `parentAskId`, `depth`, `agent`, `executionId`, `step`, `timestamp`,\n * `callId`, `tool`, `model`, `workflow`) are NEVER scrubbed — they're\n * non-PII observability metadata and load-bearing for cost rails. Rules\n * preserve these by spreading `{ ...event }` and only overriding the\n * specific user-content field(s) for that variant.\n */\nimport type { AxlEvent, AxlEventOf, AxlEventType } from './types.js';\n\nexport const REDACTED = '[redacted]';\n\n/** Type-safe rule signature: takes a specific event variant, returns the same variant. */\ntype RuleFor<T extends AxlEventType> = (event: AxlEventOf<T>) => AxlEventOf<T>;\n\n/**\n * Walk a one-level object, preserving structural keys and numeric/boolean\n * scalars while scrubbing strings and replacing nested arrays/null with\n * the redacted sentinel. Used by `log` and `memory_*` rules.\n *\n * Nested object fields (one level deep) get the same treatment: numerics\n * and booleans pass through; everything else becomes `[redacted]`. We\n * deliberately don't recurse beyond one level — `usage.tokens` /\n * `usage.cost` are the only structured-numeric fields we ship today, and\n * preserving them at two-level depth keeps cost-aggregation rails\n * working even under redaction.\n */\nfunction walkObjectOneLevel(\n obj: Record<string, unknown>,\n preserveKeys: ReadonlySet<string>,\n): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) {\n if (preserveKeys.has(k) || typeof v === 'number' || typeof v === 'boolean') {\n out[k] = v;\n } else if (typeof v === 'string') {\n out[k] = REDACTED;\n } else if (v !== null && typeof v === 'object' && !Array.isArray(v)) {\n const inner = v as Record<string, unknown>;\n const innerOut: Record<string, unknown> = {};\n for (const [ik, iv] of Object.entries(inner)) {\n if (typeof iv === 'number' || typeof iv === 'boolean') {\n innerOut[ik] = iv;\n } else {\n innerOut[ik] = REDACTED;\n }\n }\n out[k] = innerOut;\n } else {\n out[k] = REDACTED;\n }\n }\n return out;\n}\n\nconst LOG_PRESERVE_KEYS: ReadonlySet<string> = new Set(['event']);\nconst MEMORY_PRESERVE_KEYS: ReadonlySet<string> = new Set(['scope']);\n\n/** Shared rule for the legacy gate events (`guardrail` / `schema_check` / `validate`). */\nfunction redactGate<T extends 'guardrail' | 'schema_check' | 'validate'>(\n event: AxlEventOf<T>,\n): AxlEventOf<T> {\n const d = (event as { data?: { reason?: string; feedbackMessage?: string } }).data;\n if (!d) return event;\n if (d.reason === undefined && d.feedbackMessage === undefined) return event;\n return {\n ...event,\n data: {\n ...d,\n ...(d.reason !== undefined ? { reason: REDACTED } : {}),\n ...(d.feedbackMessage !== undefined ? { feedbackMessage: REDACTED } : {}),\n },\n } as AxlEventOf<T>;\n}\n\n/** Shared rule for the three `memory_*` events. */\nfunction redactMemory<T extends 'memory_remember' | 'memory_recall' | 'memory_forget'>(\n event: AxlEventOf<T>,\n): AxlEventOf<T> {\n const d = (event as { data?: Record<string, unknown> }).data;\n if (!d || typeof d !== 'object') return event;\n return {\n ...event,\n data: walkObjectOneLevel(d, MEMORY_PRESERVE_KEYS),\n } as AxlEventOf<T>;\n}\n\n/** Identity helper — used for variants that carry no user content. */\nconst passthrough = <T extends AxlEventType>(e: AxlEventOf<T>): AxlEventOf<T> => e;\n\n/**\n * Per-variant rule table. Adding a new variant to `AXL_EVENT_TYPES`\n * without a corresponding entry here is a typecheck error — the\n * `Record<AxlEventType, ...>` mapped type forces exhaustiveness.\n *\n * For variants that ship no user content today (`delegate`,\n * `handoff_return`, `checkpoint_*`), the rule is `passthrough` — but\n * that's still an explicit, reviewed decision rather than a\n * silent omission.\n */\nexport const REDACTION_RULES: { [K in AxlEventType]: RuleFor<K> } = {\n workflow_start: (e) =>\n e.data.input !== undefined ? { ...e, data: { ...e.data, input: REDACTED } } : e,\n workflow_end: (e) => {\n const d = e.data;\n if (d.result === undefined && d.error === undefined) return e;\n return {\n ...e,\n data: {\n ...d,\n ...(d.result !== undefined ? { result: REDACTED } : {}),\n ...(d.error !== undefined ? { error: REDACTED } : {}),\n },\n };\n },\n ask_start: (e) => ({ ...e, prompt: REDACTED }),\n ask_end: (e) => ({\n ...e,\n outcome: e.outcome.ok ? { ok: true, result: REDACTED } : { ok: false, error: REDACTED },\n }),\n agent_call_start: (e) => {\n const d = e.data;\n const out = { ...d, prompt: REDACTED } as typeof d;\n if (d.system !== undefined) out.system = REDACTED;\n if (Array.isArray(d.messages)) {\n out.messages = [{ role: 'system', content: `[${d.messages.length} messages redacted]` }];\n }\n return { ...e, data: out };\n },\n agent_call_end: (e) => {\n const d = e.data;\n const out = { ...d, response: REDACTED } as typeof d;\n if (d.thinking !== undefined) out.thinking = REDACTED;\n if (d.error !== undefined) out.error = REDACTED;\n return { ...e, data: out };\n },\n token: (e) => ({ ...e, data: REDACTED }),\n tool_call_start: (e) => ({ ...e, data: { ...e.data, args: REDACTED } }),\n tool_call_end: (e) => ({ ...e, data: { ...e.data, args: REDACTED, result: REDACTED } }),\n tool_approval: (e) => ({\n ...e,\n data: {\n ...e.data,\n args: REDACTED,\n ...(e.data.reason !== undefined ? { reason: REDACTED } : {}),\n },\n }),\n tool_denied: (e) => {\n if (!e.data) return e;\n const d = e.data;\n if (d.args === undefined && d.reason === undefined) return e;\n return {\n ...e,\n data: {\n ...d,\n ...(d.args !== undefined ? { args: REDACTED } : {}),\n ...(d.reason !== undefined ? { reason: REDACTED } : {}),\n },\n };\n },\n delegate: passthrough as unknown as RuleFor<'delegate'>,\n handoff_start: (e) =>\n e.data.message !== undefined ? { ...e, data: { ...e.data, message: REDACTED } } : e,\n handoff_return: passthrough as unknown as RuleFor<'handoff_return'>,\n pipeline: (e) => (e.status === 'failed' ? { ...e, reason: REDACTED } : e),\n partial_object: (e) => ({ ...e, data: { ...e.data, object: REDACTED } }),\n verify: (e) =>\n e.data.lastError !== undefined ? { ...e, data: { ...e.data, lastError: REDACTED } } : e,\n log: (e) => {\n if (!e.data || typeof e.data !== 'object' || Array.isArray(e.data)) return e;\n return { ...e, data: walkObjectOneLevel(e.data as Record<string, unknown>, LOG_PRESERVE_KEYS) };\n },\n memory_remember: redactMemory as unknown as RuleFor<'memory_remember'>,\n memory_recall: redactMemory as unknown as RuleFor<'memory_recall'>,\n memory_forget: redactMemory as unknown as RuleFor<'memory_forget'>,\n checkpoint_save: passthrough as unknown as RuleFor<'checkpoint_save'>,\n checkpoint_replay: passthrough as unknown as RuleFor<'checkpoint_replay'>,\n await_human: (e) =>\n e.data.prompt !== undefined ? { ...e, data: { ...e.data, prompt: REDACTED } } : e,\n await_human_resolved: (e) => {\n const dec = e.data.decision;\n if (!dec) return e;\n const hasData = 'data' in dec && dec.data !== undefined;\n const hasReason = 'reason' in dec && dec.reason !== undefined;\n if (!hasData && !hasReason) return e;\n const scrubbed = { ...dec };\n if (hasData) (scrubbed as { data?: string }).data = REDACTED;\n if (hasReason) (scrubbed as { reason?: string }).reason = REDACTED;\n return { ...e, data: { ...e.data, decision: scrubbed } };\n },\n guardrail: redactGate as unknown as RuleFor<'guardrail'>,\n schema_check: redactGate as unknown as RuleFor<'schema_check'>,\n validate: redactGate as unknown as RuleFor<'validate'>,\n done: (e) => ({ ...e, data: { result: REDACTED } }),\n error: (e) => ({ ...e, data: { ...e.data, message: REDACTED } }),\n};\n\n/**\n * Apply the redaction rule for `event.type` and return a new event with\n * user-content fields scrubbed. Pure: never mutates the input.\n *\n * Caller responsibility: only invoke when redaction is enabled. The rules\n * unconditionally scrub — they don't gate on `config.trace.redact`. Both\n * `WorkflowContext.emitEvent` (core) and `redactStreamEvent` (Studio)\n * check the flag before calling this function.\n */\nexport function redactEvent(event: AxlEvent): AxlEvent {\n const rule = REDACTION_RULES[event.type] as RuleFor<typeof event.type>;\n return rule(event as never);\n}\n","/** Provider configuration */\nexport type ProviderConfig = {\n apiKey?: string;\n baseUrl?: string;\n};\n\n/** MCP server configuration */\nexport type McpServerConfig = {\n name: string;\n command?: string;\n uri?: string;\n env?: Record<string, string>;\n};\n\n/** Trace configuration */\nexport type TraceConfig = {\n enabled?: boolean;\n level?: 'off' | 'steps' | 'full';\n output?: 'console' | 'json' | 'file';\n /** When true, redact prompt/response data from agent_call trace events to prevent PII leakage. */\n redact?: boolean;\n};\n\nimport type { StateStore } from './state/types.js';\n\n/** State store configuration */\nexport type StateConfig = {\n store?: StateStore | 'memory' | 'sqlite';\n sqlite?: { path: string };\n /**\n * Maximum number of events retained in `ExecutionInfo.events` per\n * execution. Token and partial_object events are already excluded\n * from the array (high-volume, stream-only); this cap bounds the\n * remaining structural events (`agent_call_*`, `tool_call_*`, gate\n * events, pipeline, etc).\n *\n * Pathological workloads (e.g., 50 nested asks × 20-turn tool loops)\n * can otherwise accumulate tens of thousands of events totalling\n * hundreds of MB before the terminal `done` event fires. When the\n * cap is hit, further events are dropped from the array and a single\n * `log` event with `data.event === 'events_truncated'` is appended\n * recording the truncation. The trace channel (`runtime.on('trace')`)\n * and WS broadcast continue to receive every event — only the\n * in-memory `ExecutionInfo.events` array is bounded.\n *\n * Default: 50_000. Set to `Infinity` to disable the cap (legacy\n * behavior; only safe for short-lived executions). Must be a positive\n * integer or `Infinity`.\n */\n maxEventsPerExecution?: number;\n};\n\n/** Global defaults */\nexport type DefaultsConfig = {\n timeout?: string;\n maxRetries?: number;\n budgetPolicy?: 'finish_and_stop' | 'hard_stop' | 'warn';\n};\n\n/** Context window management configuration */\nexport type ContextManagementConfig = {\n summaryModel?: string;\n reserveTokens?: number;\n};\n\nimport type { TelemetryConfig } from './telemetry/types.js';\nimport type { MemoryConfig } from './memory/types.js';\n\n/** Full Axl configuration */\nexport type AxlConfig = {\n providers?: Record<string, ProviderConfig>;\n defaultProvider?: string;\n defaultModel?: string;\n mcp?: {\n servers?: McpServerConfig[];\n };\n state?: StateConfig;\n trace?: TraceConfig;\n defaults?: DefaultsConfig;\n contextManagement?: ContextManagementConfig;\n memory?: MemoryConfig;\n telemetry?: TelemetryConfig;\n};\n\n/**\n * Create a type-safe Axl configuration object for providers, state, tracing, and defaults.\n * @param config - The full Axl configuration (providers, state store, tracing, defaults, context management).\n * @returns The same configuration object, validated at the type level.\n */\nexport function defineConfig(config: AxlConfig): AxlConfig {\n return config;\n}\n\n/** Parse duration strings like \"30s\", \"500ms\", \"5m\" to milliseconds */\nexport function parseDuration(duration: string): number {\n const match = duration.match(/^(\\d+(?:\\.\\d+)?)\\s*(ms|s|m|h)$/);\n if (!match) throw new Error(`Invalid duration format: \"${duration}\"`);\n\n const value = parseFloat(match[1]);\n const unit = match[2];\n\n switch (unit) {\n case 'ms':\n return value;\n case 's':\n return value * 1000;\n case 'm':\n return value * 60_000;\n case 'h':\n return value * 3_600_000;\n default:\n throw new Error(`Unknown duration unit: \"${unit}\"`);\n }\n}\n\n/** Parse cost strings like \"$5.00\" to number */\nexport function parseCost(cost: string): number {\n const match = cost.match(/^\\$?([\\d.]+)$/);\n if (!match) throw new Error(`Invalid cost format: \"${cost}\"`);\n return parseFloat(match[1]);\n}\n\n/** Merge config with environment variable overrides */\nexport function resolveConfig(config: AxlConfig): AxlConfig {\n const resolved = { ...config };\n\n // Env overrides\n if (process.env.AXL_DEFAULT_PROVIDER) {\n resolved.defaultProvider = process.env.AXL_DEFAULT_PROVIDER;\n }\n if (process.env.AXL_STATE_STORE) {\n const envStore = process.env.AXL_STATE_STORE;\n if (envStore === 'memory' || envStore === 'sqlite') {\n resolved.state = {\n ...resolved.state,\n store: envStore,\n };\n }\n }\n if (process.env.AXL_TRACE_ENABLED !== undefined) {\n resolved.trace = { ...resolved.trace, enabled: process.env.AXL_TRACE_ENABLED === 'true' };\n }\n if (process.env.AXL_TRACE_LEVEL) {\n resolved.trace = {\n ...resolved.trace,\n level: process.env.AXL_TRACE_LEVEL as 'off' | 'steps' | 'full',\n };\n }\n\n // Standard API key env vars — create provider entry if it doesn't exist\n if (process.env.OPENAI_API_KEY) {\n if (!resolved.providers) resolved.providers = {};\n resolved.providers.openai = {\n ...(resolved.providers.openai ?? {}),\n apiKey: process.env.OPENAI_API_KEY,\n };\n }\n if (process.env.ANTHROPIC_API_KEY) {\n if (!resolved.providers) resolved.providers = {};\n resolved.providers.anthropic = {\n ...(resolved.providers.anthropic ?? {}),\n apiKey: process.env.ANTHROPIC_API_KEY,\n };\n }\n\n const googleKey = process.env.GOOGLE_API_KEY ?? process.env.GEMINI_API_KEY;\n if (googleKey) {\n if (!resolved.providers) resolved.providers = {};\n resolved.providers.google = {\n ...(resolved.providers.google ?? {}),\n apiKey: googleKey,\n };\n }\n\n return resolved;\n}\n","import type { Tool } from './tool.js';\nimport type { AskOptions, GuardrailsConfig } from './types.js';\nimport type { Effort, ToolChoice } from './providers/types.js';\nimport { ProviderRegistry } from './providers/registry.js';\nimport { WorkflowContext } from './context.js';\nimport { randomUUID } from 'node:crypto';\n\n/** Descriptor for a handoff target agent with optional description. */\nexport type HandoffDescriptor = {\n agent: Agent;\n description?: string;\n /** Handoff mode: 'oneway' (default) exits source loop, 'roundtrip' returns result to source. */\n mode?: 'oneway' | 'roundtrip';\n};\n\n/** Agent configuration */\nexport type AgentConfig = {\n name?: string;\n model: string | ((ctx: { metadata?: Record<string, unknown> }) => string);\n system: string | ((ctx: { metadata?: Record<string, unknown> }) => string);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n tools?: Tool<any, any>[];\n handoffs?:\n | HandoffDescriptor[]\n | ((ctx: { metadata?: Record<string, unknown> }) => HandoffDescriptor[]);\n mcp?: string[];\n mcpTools?: string[];\n temperature?: number;\n maxTokens?: number;\n effort?: Effort;\n thinkingBudget?: number;\n includeThoughts?: boolean;\n toolChoice?: ToolChoice;\n stop?: string[];\n /** Provider-specific options merged into API requests. Not portable across providers. */\n providerOptions?: Record<string, unknown>;\n maxTurns?: number;\n timeout?: string;\n maxContext?: number;\n version?: string;\n guardrails?: GuardrailsConfig;\n};\n\n/** A defined agent instance */\nexport type Agent = {\n readonly _config: AgentConfig;\n readonly _name: string;\n /** Direct invocation for prototyping (no workflow context) */\n ask<T = string>(prompt: string, options?: AskOptions<T>): Promise<T>;\n /** Resolve model string for given context */\n resolveModel(ctx?: { metadata?: Record<string, unknown> }): string;\n /** Resolve system prompt for given context */\n resolveSystem(ctx?: { metadata?: Record<string, unknown> }): string;\n};\n\nlet agentCounter = 0;\n\n/**\n * Define an agent with a model, system prompt, tools, and optional handoffs.\n * Agents are inert definitions until invoked via `ctx.ask()` or `agent.ask()`.\n * @param config - Agent configuration: model URI, system prompt (static or dynamic), tools, temperature, etc.\n * @returns An Agent instance that can be used with `ctx.ask()` inside workflows or called directly for prototyping.\n */\nexport function agent(config: AgentConfig): Agent {\n agentCounter++;\n\n // Derive a name: prefer explicit name, then model string, then fallback counter\n const modelStr = typeof config.model === 'string' ? config.model : undefined;\n const defaultName = config.name ?? modelStr ?? `Agent_${agentCounter}`;\n\n const resolveModel = (ctx?: { metadata?: Record<string, unknown> }): string => {\n return typeof config.model === 'function' ? config.model(ctx ?? {}) : config.model;\n };\n\n const resolveSystem = (ctx?: { metadata?: Record<string, unknown> }): string => {\n const sys = config.system;\n return typeof sys === 'function' ? sys(ctx ?? {}) : sys;\n };\n\n const agentInstance: Agent = {\n _config: config,\n _name: defaultName,\n\n async ask<T = string>(prompt: string, options?: AskOptions<T>): Promise<T> {\n // Direct invocation — creates a lightweight implicit context\n // This is a simplified path for quick experiments and prototyping;\n // production use should use ctx.ask() inside a workflow.\n const registry = new ProviderRegistry();\n const ctx = new WorkflowContext({\n input: prompt,\n executionId: randomUUID(),\n config: {},\n providerRegistry: registry,\n });\n return ctx.ask(agentInstance, prompt, options);\n },\n\n resolveModel,\n resolveSystem,\n };\n\n return agentInstance;\n}\n","import type { z } from 'zod';\nimport type { WorkflowContext } from './context.js';\n\n/** Workflow configuration */\nexport type WorkflowConfig<\n TInput extends z.ZodType = z.ZodType,\n TOutput extends z.ZodType = z.ZodType,\n> = {\n name: string;\n input: TInput;\n output?: TOutput;\n handler: (ctx: WorkflowContext<z.infer<TInput>>) => Promise<z.infer<TOutput>>;\n};\n\n/** A defined workflow instance */\nexport type Workflow<\n TInput extends z.ZodType = z.ZodType,\n TOutput extends z.ZodType = z.ZodType,\n> = {\n readonly name: string;\n readonly inputSchema: TInput;\n readonly outputSchema: TOutput | undefined;\n readonly handler: (ctx: WorkflowContext<z.infer<TInput>>) => Promise<z.infer<TOutput>>;\n};\n\n/**\n * Bivariant-parameter alias for `Workflow<any, any>`. Function parameters\n * are contravariant under strict types, so `Workflow<TInput=MsgType>` won't\n * satisfy a `Workflow<unknown, unknown>` slot. The standard escape hatch is\n * to widen to `any`. This alias gives that workaround a name so call sites\n * (e.g. `AxlRuntime.register`, `AxlTestRuntime.WorkflowLike.handler`) don't\n * each independently re-derive it.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyWorkflow = Workflow<any, any>;\n\n/**\n * Define a named workflow with Zod-validated input/output and an async handler.\n * Register workflows with `AxlRuntime.register()` to execute them.\n * @param config - Workflow configuration: name, input schema, optional output schema, and async handler receiving a WorkflowContext.\n * @returns A Workflow instance ready to be registered with an AxlRuntime.\n */\nexport function workflow<TInput extends z.ZodType, TOutput extends z.ZodType = z.ZodType>(\n config: WorkflowConfig<TInput, TOutput>,\n): Workflow<TInput, TOutput> {\n return {\n name: config.name,\n inputSchema: config.input,\n outputSchema: config.output,\n handler: config.handler,\n };\n}\n","import { EventEmitter } from 'node:events';\nimport { randomUUID } from 'node:crypto';\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport { appendFileSync, mkdirSync } from 'node:fs';\nimport { dirname } from 'node:path';\nimport type { AxlConfig } from './config.js';\nimport { parseCost, resolveConfig } from './config.js';\nimport type { Workflow, AnyWorkflow } from './workflow.js';\nimport type { Tool } from './tool.js';\nimport type { Agent } from './agent.js';\nimport type { Provider } from './providers/types.js';\nimport { ProviderRegistry } from './providers/registry.js';\nimport type { StateStore, PendingDecision, EvalHistoryEntry } from './state/types.js';\nimport { MemoryStore } from './state/memory.js';\nimport { SQLiteStore } from './state/sqlite.js';\nimport { WorkflowContext } from './context.js';\nimport { Session, type SessionOptions } from './session.js';\nimport { AxlStream } from './stream.js';\nimport { McpManager } from './mcp/manager.js';\nimport { MemoryManager } from './memory/manager.js';\nimport type {\n AxlEvent,\n CallbackMeta,\n ExecutionInfo,\n HumanDecision,\n AwaitHumanOptions,\n ChatMessage,\n HandoffRecord,\n} from './types.js';\nimport { eventCostContribution } from './event-utils.js';\nimport { NoopSpanManager } from './telemetry/noop.js';\nimport { createSpanManager } from './telemetry/index.js';\nimport type { SpanManager, SpanHandle } from './telemetry/types.js';\n\n/**\n * Function exported from an eval module that overrides the default\n * `runtime.execute(workflow, input)` behavior. The runtime injects itself as\n * the second argument so user code can call `runtime.createContext()` etc.\n *\n * Returns `{ output, cost?, metadata? }` — cost and metadata are optional and\n * fall back to values derived from `runtime.trackExecution()` when omitted.\n *\n * Single source of truth for the eval-execution contract; consumed by\n * `registerEval`, `getRegisteredEval`, the `axl-eval` CLI, and\n * `@axlsdk/studio`'s eval-loader.\n */\nexport type EvalExecuteWorkflow = (\n input: unknown,\n runtime?: AxlRuntime,\n) => Promise<{ output: unknown; cost?: number; metadata?: Record<string, unknown> }>;\n\n/** Simple DJB2 hash of input for span correlation. */\nfunction hashInput(input: unknown): string {\n const str = JSON.stringify(input) ?? '';\n let hash = 5381;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) + hash + str.charCodeAt(i)) | 0;\n }\n return (hash >>> 0).toString(16);\n}\n\n/** Default cap on `ExecutionInfo.events` per execution. Can be\n * overridden via `config.state.maxEventsPerExecution`. */\nconst DEFAULT_MAX_EVENTS_PER_EXECUTION = 50_000;\n\n/** Detect AbortError from both `DOMException` (browser / Node fetch path)\n * and a plain `Error` with `name === 'AbortError'` (signal.throwIfAborted,\n * user-thrown abort). A strict instanceof check misses cancellations\n * thrown by other code paths. */\nfunction isAbortError(err: unknown): boolean {\n return (\n typeof err === 'object' && err !== null && (err as { name?: unknown }).name === 'AbortError'\n );\n}\n\n/** Bounded push to `execInfo.events`. Skips high-volume stream-only\n * variants (token, partial_object — never persisted).\n *\n * Semantics: `cap` is the MAX array length. When pushing would cross\n * the cap, the cap-th slot is REPLACED with a sentinel `log` event\n * describing the truncation. Subsequent events are silently dropped\n * (the sentinel persists). The trace channel and WS broadcast still\n * see every event — only the in-memory array is bounded.\n *\n * Trade-off: replacing rather than appending preserves the documented\n * \"events.length ≤ cap\" contract at the cost of dropping the cap-th\n * regular event. The sentinel itself encodes the cap and reason so\n * consumers know exactly what was lost. */\nfunction pushEventBounded(execInfo: ExecutionInfo, event: AxlEvent, cap: number): void {\n if (event.type === 'token' || event.type === 'partial_object') return;\n if (cap === Infinity || execInfo.events.length < cap) {\n execInfo.events.push(event);\n return;\n }\n // Length === cap. If the last entry is already the sentinel, this is\n // a silent drop. Otherwise replace the last entry with the sentinel\n // so consumers find a clear truncation marker at array tail.\n const last = execInfo.events[execInfo.events.length - 1];\n const alreadyTruncated =\n last?.type === 'log' &&\n typeof last.data === 'object' &&\n last.data !== null &&\n (last.data as { event?: string }).event === 'events_truncated';\n if (!alreadyTruncated) {\n execInfo.events[execInfo.events.length - 1] = {\n type: 'log',\n executionId: event.executionId,\n step: event.step,\n timestamp: Date.now(),\n data: {\n event: 'events_truncated',\n cap,\n message:\n `ExecutionInfo.events truncated at ${cap} entries. ` +\n `Subsequent events are still delivered to runtime.on('trace') ` +\n `and the WS broadcast — only the in-memory array is bounded. ` +\n `Raise via config.state.maxEventsPerExecution.`,\n },\n } as AxlEvent;\n }\n}\n\nexport type ExecuteOptions = {\n metadata?: Record<string, unknown>;\n /** Handler for tool approval requests. When provided, tools with `requireApproval` resolve\n * via this handler instead of suspending the execution and registering a pending decision.\n * Useful for in-process testing and ad-hoc invocations where you don't want to poll\n * `runtime.getPendingDecisions()` and call `runtime.resolveDecision()`. */\n awaitHumanHandler?: (options: AwaitHumanOptions) => Promise<HumanDecision>;\n};\n\n/**\n * Shape of events forwarded to an eval `onProgress` callback. Mirrors\n * `@axlsdk/eval`'s `EvalProgressEvent` so runtime consumers can type their\n * callbacks without importing the optional peer dep.\n */\nexport type EvalProgressEventShape =\n | { type: 'item_done'; itemIndex: number; totalItems: number }\n | { type: 'run_done'; totalItems: number; failures: number };\n\nexport type CreateContextOptions = {\n metadata?: Record<string, unknown>;\n /** Cost budget for the context (e.g., '$0.50'). Enforced via finish_and_stop policy. */\n budget?: string;\n /** Abort signal for cancellation/timeouts. */\n signal?: AbortSignal;\n /** Prior conversation history for multi-turn eval testing. */\n sessionHistory?: ChatMessage[];\n /** Token streaming callback. `meta` carries `askId`/`parentAskId`/`depth`/`agent`\n * so consumers can route or filter by ask correlation (e.g.,\n * `meta.depth === 0` for root-only chat UIs). */\n onToken?: (token: string, meta: CallbackMeta) => void;\n /** Fires when an agent invokes a tool. `meta` carries the same ask\n * correlation shape as `onToken`. */\n onToolCall?: (call: { name: string; args: unknown; callId?: string }, meta: CallbackMeta) => void;\n /** Fires when an agent begins processing a turn. `meta` carries the\n * same ask correlation shape as `onToken`. */\n onAgentStart?: (info: { agent: string; model?: string }, meta: CallbackMeta) => void;\n /** Handler for tool approval requests. Called when an agent invokes a tool with requireApproval. */\n awaitHumanHandler?: (options: AwaitHumanOptions) => Promise<HumanDecision>;\n};\n\n/** Cost scope for tracking cost across async boundaries via AsyncLocalStorage. */\ntype CostScope = {\n totalCost: number;\n trackedIds: Set<string>;\n parent?: CostScope;\n};\n\nconst costScopeStorage = new AsyncLocalStorage<CostScope>();\n\n/**\n * The main entry point for executing Axl workflows.\n * Manages workflow registration, provider resolution, state storage, tracing, MCP servers,\n * and human-in-the-loop decision handling. Supports both synchronous (`execute`) and\n * streaming (`stream`) execution modes, as well as multi-turn sessions.\n */\nexport class AxlRuntime extends EventEmitter {\n private config: AxlConfig;\n private workflows = new Map<string, Workflow>();\n private tools = new Map<string, Tool>();\n private agents = new Map<string, Agent>();\n private providerRegistry: ProviderRegistry;\n private stateStore: StateStore;\n private executions = new Map<string, ExecutionInfo>();\n private pendingDecisionResolvers = new Map<string, (d: HumanDecision) => void>();\n private abortControllers = new Map<string, AbortController>();\n private registeredEvals = new Map<\n string,\n { config: unknown; executeWorkflow?: EvalExecuteWorkflow }\n >();\n private mcpManager?: McpManager;\n private memoryManager?: MemoryManager;\n private spanManager: SpanManager = new NoopSpanManager();\n private historicalExecutions = new Map<string, ExecutionInfo>();\n private historicalExecutionsLoadPromise: Promise<void> | null = null;\n private evalHistory: EvalHistoryEntry[] = [];\n private evalHistoryLoadPromise: Promise<void> | null = null;\n /** Resolved cap on `ExecutionInfo.events` per execution. Cached on\n * the instance so per-event onTrace handlers don't reach into\n * `this.config.state` on every emission. */\n private readonly maxEventsPerExecution: number;\n\n constructor(config?: AxlConfig) {\n super();\n this.config = resolveConfig(config ?? {});\n this.providerRegistry = new ProviderRegistry();\n this.stateStore = this.createStateStore();\n // Resolve + validate the events cap once at construction. Reject\n // 0 / negatives / fractions / NaN early; allow Infinity for the\n // legacy \"unbounded\" opt-out.\n const requested = this.config.state?.maxEventsPerExecution;\n if (requested === undefined) {\n this.maxEventsPerExecution = DEFAULT_MAX_EVENTS_PER_EXECUTION;\n } else if (requested === Infinity) {\n this.maxEventsPerExecution = Infinity;\n } else if (\n typeof requested !== 'number' ||\n !Number.isFinite(requested) ||\n !Number.isInteger(requested) ||\n requested < 1\n ) {\n throw new RangeError(\n `config.state.maxEventsPerExecution must be a positive integer or Infinity; got ${requested}`,\n );\n } else {\n this.maxEventsPerExecution = requested;\n }\n if (this.config.memory) {\n this.memoryManager = new MemoryManager({\n vectorStore: this.config.memory.vectorStore,\n embedder: this.config.memory.embedder,\n });\n }\n }\n\n /**\n * Whether `config.trace.redact` is enabled on this runtime. A narrow\n * boolean getter is preferred over exposing the full config because:\n * (a) `Readonly<AxlConfig>` is shallow so the config would be mutable\n * at runtime through sub-objects, subverting any compliance guarantee;\n * (b) observability consumers like Studio only need the boolean, not\n * the whole config tree; (c) if future observability config needs to\n * expand, each new flag gets its own narrow getter.\n *\n * Studio's server-side redaction helpers (executions, memory, sessions,\n * evals, decisions, tools, playground, workflows) all route through\n * this accessor to decide whether to scrub response payloads.\n */\n isRedactEnabled(): boolean {\n return this.config.trace?.redact === true;\n }\n\n /**\n * Initialize MCP servers configured in the config.\n * Call this before executing workflows that use MCP tools.\n */\n async initializeMcp(): Promise<void> {\n if (this.config.mcp?.servers && this.config.mcp.servers.length > 0) {\n this.mcpManager = new McpManager();\n await this.mcpManager.initialize(this.config.mcp.servers);\n }\n }\n\n /**\n * Initialize OpenTelemetry telemetry based on config.\n * Call this before executing workflows to enable span creation.\n */\n async initializeTelemetry(): Promise<void> {\n this.spanManager = await createSpanManager(this.config.telemetry);\n }\n\n /** Get the MCP manager (if initialized). */\n getMcpManager(): McpManager | undefined {\n return this.mcpManager;\n }\n\n private createStateStore(): StateStore {\n const storeOption = this.config.state?.store ?? 'memory';\n if (typeof storeOption !== 'string') return storeOption;\n switch (storeOption) {\n case 'sqlite':\n return new SQLiteStore(this.config.state?.sqlite?.path ?? './data/axl.db');\n case 'memory':\n default:\n return new MemoryStore();\n }\n }\n\n /**\n * Run a workflow body inside an ALREADY-CONSTRUCTED `WorkflowContext`\n * with full lifecycle invariants: emit `workflow_start` → run handler\n * → parse output → emit `workflow_end` → delete checkpoints → persist.\n *\n * Shared between `execute()` and `stream()`. Centralizes the\n * \"start iff end\" pairing invariant so a future emit path\n * (e.g., `resumeExecution`) can inherit correct behavior by routing\n * through this helper. Also factors out the AbortError detection.\n *\n * Side effects on `execInfo`: sets `status` / `completedAt` /\n * `duration` / `result` (or `error`) before emitting `workflow_end`.\n * On throw: emits `workflow_end({status: 'failed', aborted?})` and\n * persists before rethrowing. `abortControllers.delete` runs in\n * `finally` regardless of outcome.\n *\n * Caller responsibilities:\n * - Allocate `executionId` and register it in `abortControllers` map\n * BEFORE calling this helper (so early-throw paths still have a\n * correlation id available for terminal events).\n * - Construct `execInfo` and `ctx` before calling.\n * - Pass `span` if the call site is inside a tracer span — this\n * helper sets `axl.workflow.cost` / `.duration` attributes on\n * success.\n */\n private async runWorkflowBody(args: {\n workflow: AnyWorkflow;\n ctx: WorkflowContext;\n execInfo: ExecutionInfo;\n validated: unknown;\n span?: SpanHandle;\n }): Promise<unknown> {\n const { workflow, ctx, execInfo, validated, span } = args;\n try {\n // Spec/16 §3.6a: workflow_start is a first-class trace event\n // emitted inside the span context so OTel exporters that correlate\n // events to spans via active-context see it.\n ctx._emitWorkflowStart(validated);\n const raw = await workflow.handler(ctx);\n const result = workflow.outputSchema ? workflow.outputSchema.parse(raw) : raw;\n\n execInfo.status = 'completed';\n execInfo.completedAt = Date.now();\n execInfo.duration = execInfo.completedAt - execInfo.startedAt;\n execInfo.result = result;\n ctx._emitWorkflowEnd({\n status: 'completed',\n duration: execInfo.duration,\n result,\n });\n\n // Clean up checkpoints for completed execution\n if (this.stateStore.deleteCheckpoints) {\n await this.stateStore.deleteCheckpoints(execInfo.executionId);\n }\n\n span?.setAttribute('axl.workflow.cost', execInfo.totalCost);\n span?.setAttribute('axl.workflow.duration', execInfo.duration);\n\n this.persistExecution(execInfo);\n return result;\n } catch (err) {\n const aborted = isAbortError(err);\n execInfo.status = 'failed';\n execInfo.completedAt = Date.now();\n execInfo.duration = execInfo.completedAt - execInfo.startedAt;\n execInfo.error = err instanceof Error ? err.message : String(err);\n ctx._emitWorkflowEnd({\n status: 'failed',\n duration: execInfo.duration,\n error: execInfo.error,\n ...(aborted ? { aborted: true } : {}),\n });\n this.persistExecution(execInfo);\n throw err;\n } finally {\n this.abortControllers.delete(execInfo.executionId);\n }\n }\n\n /**\n * Persist a completed/failed execution to the state store (fire-and-forget)\n * and move it from the active executions map to the historical cache.\n */\n private persistExecution(execInfo: ExecutionInfo): void {\n const snapshot = structuredClone(execInfo);\n\n if (this.stateStore.saveExecution) {\n this.stateStore.saveExecution(snapshot).catch(() => {\n // Best-effort persistence — execution still succeeded/failed normally\n });\n }\n\n // Move from active to historical cache to bound active map growth.\n // Use the snapshot so the cached entry is not mutated by lingering closures.\n const id = execInfo.executionId;\n this.historicalExecutions.set(id, snapshot);\n this.executions.delete(id);\n }\n\n /** Register a workflow with the runtime. */\n register(workflow: AnyWorkflow): void {\n this.workflows.set(workflow.name, workflow);\n }\n\n /** Register standalone tools for Studio introspection and direct testing. */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n registerTool(...tools: Tool<any, any>[]): void {\n for (const t of tools) {\n this.tools.set(t.name, t);\n }\n }\n\n /** Register standalone agents for Studio playground and introspection. */\n registerAgent(...agents: Agent[]): void {\n for (const a of agents) {\n this.agents.set(a._name, a);\n }\n }\n\n // ── Introspection (used by Studio) ────────────────────────────────\n\n /** Get all registered workflow names. */\n getWorkflowNames(): string[] {\n return [...this.workflows.keys()];\n }\n\n /** Get a registered workflow by name. */\n getWorkflow(name: string): Workflow | undefined {\n return this.workflows.get(name);\n }\n\n /** Get all registered workflows. */\n getWorkflows(): Workflow[] {\n return [...this.workflows.values()];\n }\n\n /** Get all registered standalone tools. */\n getTools(): Tool[] {\n return [...this.tools.values()];\n }\n\n /** Get a registered standalone tool by name. */\n getTool(name: string): Tool | undefined {\n return this.tools.get(name);\n }\n\n /** Get all registered standalone agents. */\n getAgents(): Agent[] {\n return [...this.agents.values()];\n }\n\n /** Get a registered standalone agent by name. */\n getAgent(name: string): Agent | undefined {\n return this.agents.get(name);\n }\n\n /**\n * Register an eval config for Studio introspection and execution.\n * The config should be the result of `defineEval()` from `@axlsdk/eval`.\n * An optional `executeWorkflow` function can override the default behavior\n * of calling `runtime.execute()`.\n */\n registerEval(name: string, config: unknown, executeWorkflow?: EvalExecuteWorkflow): void {\n this.registeredEvals.set(name, { config, executeWorkflow });\n }\n\n /** Get metadata about all registered evals. */\n getRegisteredEvals(): Array<{\n name: string;\n workflow: string;\n dataset: string;\n scorers: string[];\n }> {\n const result: Array<{ name: string; workflow: string; dataset: string; scorers: string[] }> =\n [];\n for (const [name, { config }] of this.registeredEvals) {\n const cfg = config as {\n workflow?: string;\n dataset?: { name?: string };\n scorers?: Array<{ name?: string }>;\n };\n result.push({\n name,\n workflow: cfg.workflow ?? 'unknown',\n dataset: cfg.dataset?.name ?? 'unknown',\n scorers: (cfg.scorers ?? []).map((s) => s.name ?? 'unknown'),\n });\n }\n return result;\n }\n\n /** Get a registered eval config by name. */\n getRegisteredEval(\n name: string,\n ): { config: unknown; executeWorkflow?: EvalExecuteWorkflow } | undefined {\n return this.registeredEvals.get(name);\n }\n\n /** Run a registered eval by name. */\n async runRegisteredEval(\n name: string,\n options?: {\n metadata?: Record<string, unknown>;\n /** Called after each dataset item completes (execution + scoring). */\n onProgress?: (event: EvalProgressEventShape) => void;\n /** Abort signal — checked before starting each item. */\n signal?: AbortSignal;\n /**\n * When `true`, populate `EvalItem.traces` on every item (success + failure\n * paths). Forwards to `runEval({ captureTraces: true })`, which wraps each\n * item's execution in `runtime.trackExecution({ captureTraces: true })`.\n * Verbose-mode `agent_call_start.data.messages` snapshots are stripped from\n * captured traces to keep memory bounded.\n */\n captureTraces?: boolean;\n },\n ): Promise<unknown> {\n const entry = this.registeredEvals.get(name);\n if (!entry) throw new Error(`Eval \"${name}\" is not registered`);\n\n let result: unknown;\n\n if (entry.executeWorkflow) {\n // Use custom executeWorkflow if provided, injecting this runtime as second arg\n let runEvalFn: (\n config: unknown,\n executeFn: (\n input: unknown,\n runtime: unknown,\n ) => Promise<{ output: unknown; cost?: number; metadata?: Record<string, unknown> }>,\n runtime: unknown,\n evalOptions?: {\n onProgress?: (event: EvalProgressEventShape) => void;\n signal?: AbortSignal;\n captureTraces?: boolean;\n },\n ) => Promise<unknown>;\n try {\n // @ts-expect-error — @axlsdk/eval is an optional peer dependency\n ({ runEval: runEvalFn } = await import('@axlsdk/eval'));\n } catch {\n throw new Error(\n 'axl-eval is required for AxlRuntime.runRegisteredEval(). Install it with: npm install @axlsdk/eval',\n );\n }\n const originalExecuteFn = entry.executeWorkflow!;\n\n // Wrap with trackExecution for transparent cost + metadata capture.\n // When captureTraces is on, runEval wraps this again in a second\n // trackExecution({ captureTraces: true }) — nested trackExecution walks\n // the AsyncLocalStorage parent chain so both scopes observe events.\n const wrappedExecuteFn = async (\n input: unknown,\n runtime: unknown,\n ): Promise<{ output: unknown; cost?: number; metadata?: Record<string, unknown> }> => {\n const {\n result,\n cost: trackedCost,\n metadata,\n } = await this.trackExecution(async () => {\n return originalExecuteFn(input, runtime as AxlRuntime);\n });\n // Prefer user-supplied cost if present, fall back to tracked cost\n return {\n output: result.output,\n cost: result.cost ?? trackedCost,\n metadata: result.metadata ?? metadata,\n };\n };\n\n result = await runEvalFn(entry.config, wrappedExecuteFn, this, {\n onProgress: options?.onProgress,\n signal: options?.signal,\n captureTraces: options?.captureTraces,\n });\n } else {\n // Default: use runtime.eval() which creates its own executeWorkflow\n result = await this.eval(\n entry.config as {\n workflow: string;\n dataset: unknown;\n scorers: unknown[];\n concurrency?: number;\n budget?: string;\n metadata?: Record<string, unknown>;\n },\n {\n onProgress: options?.onProgress,\n signal: options?.signal,\n captureTraces: options?.captureTraces,\n },\n );\n }\n\n // Merge extra metadata if provided (e.g., runGroupId for multi-run)\n const resultObj = result as Record<string, unknown>;\n if (options?.metadata) {\n resultObj.metadata = {\n ...(resultObj.metadata as Record<string, unknown>),\n ...options.metadata,\n };\n }\n\n // Persist eval result to history (best-effort — don't lose the result on store errors)\n try {\n await this.saveEvalResult({\n id: (resultObj.id as string) ?? randomUUID(),\n eval: name,\n timestamp: Date.now(),\n data: structuredClone(result),\n });\n } catch {\n // Best-effort persistence — eval still succeeded\n }\n\n return result;\n }\n\n /** Get all execution info (running + completed + historical). */\n async getExecutions(): Promise<ExecutionInfo[]> {\n // Lazy-load historical executions from store on first access (once-guard)\n if (!this.historicalExecutionsLoadPromise && this.stateStore.listExecutions) {\n this.historicalExecutionsLoadPromise = this.stateStore\n .listExecutions()\n .then((stored) => {\n for (const exec of stored) {\n if (\n !this.executions.has(exec.executionId) &&\n !this.historicalExecutions.has(exec.executionId)\n ) {\n this.historicalExecutions.set(exec.executionId, exec);\n }\n }\n })\n .catch(() => {\n // Failed to load — reset so next call retries\n this.historicalExecutionsLoadPromise = null;\n });\n }\n if (this.historicalExecutionsLoadPromise) {\n await this.historicalExecutionsLoadPromise;\n }\n\n // Merge: in-memory takes precedence (has live data)\n const merged = new Map(this.historicalExecutions);\n for (const [id, exec] of this.executions) {\n merged.set(id, exec);\n }\n return [...merged.values()].sort((a, b) => b.startedAt - a.startedAt);\n }\n\n /**\n * Create a WorkflowContext for ad-hoc use (evals, tool testing, prototyping).\n * The context has access to the runtime's providers, state store, MCP manager,\n * and automatically emits trace events and tracks cost.\n */\n createContext(options?: CreateContextOptions): WorkflowContext {\n const executionId = randomUUID();\n const budgetLimit = options?.budget ? parseCost(options.budget) : Infinity;\n\n // Register with active cost scope for trackCost() attribution\n this.registerWithCostScope(executionId);\n\n return new WorkflowContext({\n input: undefined,\n executionId,\n metadata: options?.metadata,\n config: this.config,\n providerRegistry: this.providerRegistry,\n stateStore: this.stateStore,\n mcpManager: this.mcpManager,\n spanManager: this.spanManager,\n memoryManager: this.memoryManager,\n sessionHistory: options?.sessionHistory,\n signal: options?.signal,\n onToken: options?.onToken,\n onToolCall: options?.onToolCall,\n onAgentStart: options?.onAgentStart,\n awaitHumanHandler: options?.awaitHumanHandler,\n onTrace: (event: AxlEvent) => {\n this.emit('trace', event);\n this.outputAxlEvent(event);\n },\n budgetContext: {\n totalCost: 0,\n limit: budgetLimit,\n exceeded: false,\n policy: 'finish_and_stop',\n },\n });\n }\n\n /** Register a custom provider instance. */\n registerProvider(name: string, provider: Provider): void {\n this.providerRegistry.registerInstance(name, provider);\n }\n\n /** Resolve a provider:model URI to a Provider instance and model name. */\n resolveProvider(uri: string): { provider: Provider; model: string } {\n return this.providerRegistry.resolve(uri, this.config);\n }\n\n /** Execute a workflow and return the result. */\n async execute(name: string, input: unknown, options?: ExecuteOptions): Promise<unknown> {\n const workflow = this.workflows.get(name);\n if (!workflow) {\n throw new Error(\n `Workflow \"${name}\" not registered. Available: ${[...this.workflows.keys()].join(', ')}`,\n );\n }\n\n // Validate input\n const validated = workflow.inputSchema.parse(input);\n const executionId = randomUUID();\n const controller = new AbortController();\n this.abortControllers.set(executionId, controller);\n\n // Register with active cost scope for trackCost() attribution\n this.registerWithCostScope(executionId);\n\n // Create execution info\n const execInfo: ExecutionInfo = {\n executionId,\n workflow: name,\n status: 'running',\n events: [],\n totalCost: 0,\n startedAt: Date.now(),\n duration: 0,\n };\n this.executions.set(executionId, execInfo);\n\n // Resolve session history from metadata if present\n const sessionHistory = (options?.metadata?.sessionHistory as ChatMessage[]) ?? undefined;\n\n // Create workflow context\n const ctx = new WorkflowContext({\n input: validated,\n executionId,\n metadata: options?.metadata,\n config: this.config,\n providerRegistry: this.providerRegistry,\n sessionHistory,\n signal: controller.signal,\n onTrace: (event: AxlEvent) => {\n // High-volume stream-only events (`token`, `partial_object`)\n // are never persisted, plus a bounded cap on the rest to avoid\n // OOM on pathological workloads (50 nested asks × 20-turn tool\n // loops can otherwise accumulate hundreds of MB before\n // terminal `done`). Trace channel + WS broadcast still see\n // every event; only the in-memory array is bounded.\n pushEventBounded(execInfo, event, this.maxEventsPerExecution);\n execInfo.totalCost += eventCostContribution(event);\n this.emit('trace', event);\n this.outputAxlEvent(event);\n // Persist handoff records to session metadata. Records land on\n // `handoff_start` carrying source/target/mode/toAskId.\n // Duration backfill is mode-specific:\n // - oneway: target's `ask_end.duration` (the target's full work)\n // - roundtrip: `handoff_return.data.duration` (round-trip wall-clock,\n // includes pushing the result back into source's convo)\n // Both modes correlate to the target via `toAskId` (handoff_start)\n // matched against `ask_end.askId`.\n if (event.type === 'handoff_start') {\n const sessionId = options?.metadata?.sessionId as string | undefined;\n if (sessionId) {\n this.appendHandoffRecord(sessionId, {\n source: event.data.source,\n target: event.data.target,\n mode: event.data.mode,\n timestamp: event.timestamp,\n toAskId: event.toAskId,\n });\n }\n } else if (event.type === 'handoff_return') {\n const sessionId = options?.metadata?.sessionId as string | undefined;\n if (sessionId) {\n this.updateHandoffDuration(sessionId, {\n toAskId: event.toAskId,\n duration: event.data.duration,\n });\n }\n } else if (event.type === 'ask_end') {\n // Backfill duration for ONEWAY handoffs whose target just ended.\n // Oneway has no `handoff_return`; without this listener, the\n // record stays `duration: undefined`. Roundtrip records also\n // hit this path, but `handoff_return` fires AFTER the target's\n // `ask_end` and overwrites with the round-trip duration —\n // intentional (round-trip wall-clock is the more useful figure\n // for roundtrip).\n const sessionId = options?.metadata?.sessionId as string | undefined;\n if (sessionId && event.askId && typeof event.duration === 'number') {\n this.updateHandoffDuration(sessionId, {\n toAskId: event.askId,\n duration: event.duration,\n });\n }\n }\n },\n pendingDecisions: this.pendingDecisionResolvers,\n awaitHumanHandler: options?.awaitHumanHandler,\n stateStore: this.stateStore,\n workflowName: name,\n mcpManager: this.mcpManager,\n memoryManager: this.memoryManager,\n resumeMode: !!options?.metadata?.resumeMode,\n spanManager: this.spanManager,\n budgetContext: {\n totalCost: 0,\n limit: Infinity,\n exceeded: false,\n policy: 'finish_and_stop',\n },\n });\n\n return this.spanManager.withSpanAsync(\n 'axl.workflow.execute',\n {\n 'axl.workflow.name': name,\n 'axl.execution.id': executionId,\n 'axl.workflow.input_hash': hashInput(validated),\n },\n (span) =>\n this.runWorkflowBody({\n workflow,\n ctx,\n execInfo,\n validated,\n span,\n }),\n );\n }\n\n /** Execute a workflow and return a stream. */\n stream(name: string, input: unknown, options?: ExecuteOptions): AxlStream {\n const axlStream = new AxlStream();\n const controller = new AbortController();\n\n // Cancel workflow when consumer disconnects (stops reading the stream)\n axlStream.on('close', () => controller.abort());\n\n // Generate executionId BEFORE the async closure so it's available on\n // terminal `done` / `error` events even when `run()` throws early\n // (e.g., unregistered workflow, input validation failure). Review S4:\n // previously `_done(result, execInfo?.executionId ?? '')` sent an\n // empty-string sentinel in that path, which broke consumers\n // correlating the terminal event with the execution.\n const executionId = randomUUID();\n this.abortControllers.set(executionId, controller);\n // `execInfo` is closure-captured for the outer `.catch` so it can\n // tell whether the early-throw safety net needs to fire (it's\n // allocated inside `run()` — the catch path is defensive about\n // running before `execInfo` is assigned).\n let execInfo: ExecutionInfo | undefined;\n\n const run = async () => {\n const workflow = this.workflows.get(name);\n if (!workflow) throw new Error(`Workflow \"${name}\" not registered`);\n\n const validated = workflow.inputSchema.parse(input);\n const sessionHistory = (options?.metadata?.sessionHistory as ChatMessage[]) ?? undefined;\n\n // Register with active cost scope for trackCost() attribution\n this.registerWithCostScope(executionId);\n\n // Create execution info for stream executions\n execInfo = {\n executionId,\n workflow: name,\n status: 'running',\n events: [],\n totalCost: 0,\n startedAt: Date.now(),\n duration: 0,\n };\n this.executions.set(executionId, execInfo);\n\n const wfCtx = new WorkflowContext({\n input: validated,\n executionId,\n metadata: options?.metadata,\n config: this.config,\n providerRegistry: this.providerRegistry,\n sessionHistory,\n signal: controller.signal,\n // Sentinel `onToken` so the streaming code path in WorkflowContext\n // is entered (it's gated on `this.onToken` being defined). The\n // actual `token` AxlEvents are emitted via `emitEvent` and reach\n // the wire through `onTrace` — this callback is just the gate.\n onToken: () => {},\n onTrace: (event: AxlEvent) => {\n // High-volume stream-only events never persist; remaining\n // structural events are bounded by maxEventsPerExecution. See\n // execute() for full rationale.\n pushEventBounded(execInfo!, event, this.maxEventsPerExecution);\n execInfo!.totalCost += eventCostContribution(event);\n this.emit('trace', event);\n this.outputAxlEvent(event);\n // Single fan-out: every event flows verbatim to the wire. The\n // legacy translation layer (which derived StreamEvent shapes\n // like `agent_end` / `tool_result` / `step` and dropped fields\n // along the way) is gone — consumers receive the full AxlEvent.\n axlStream._push(event);\n\n // Side effect: persist handoff records to session metadata.\n // Mirrors the non-streaming path. See the comment block on the\n // execute() onTrace handler for duration semantics.\n if (event.type === 'handoff_start') {\n const sessionId = options?.metadata?.sessionId as string | undefined;\n if (sessionId) {\n this.appendHandoffRecord(sessionId, {\n source: event.data.source,\n target: event.data.target,\n mode: event.data.mode,\n timestamp: event.timestamp,\n toAskId: event.toAskId,\n });\n }\n } else if (event.type === 'handoff_return') {\n const sessionId = options?.metadata?.sessionId as string | undefined;\n if (sessionId) {\n this.updateHandoffDuration(sessionId, {\n toAskId: event.toAskId,\n duration: event.data.duration,\n });\n }\n } else if (event.type === 'ask_end') {\n const sessionId = options?.metadata?.sessionId as string | undefined;\n if (sessionId && event.askId && typeof event.duration === 'number') {\n this.updateHandoffDuration(sessionId, {\n toAskId: event.askId,\n duration: event.duration,\n });\n }\n }\n },\n pendingDecisions: this.pendingDecisionResolvers,\n awaitHumanHandler: options?.awaitHumanHandler,\n stateStore: this.stateStore,\n workflowName: name,\n mcpManager: this.mcpManager,\n memoryManager: this.memoryManager,\n resumeMode: !!options?.metadata?.resumeMode,\n spanManager: this.spanManager,\n budgetContext: {\n totalCost: 0,\n limit: Infinity,\n exceeded: false,\n policy: 'finish_and_stop',\n },\n });\n\n return this.spanManager.withSpanAsync(\n 'axl.workflow.execute',\n {\n 'axl.workflow.name': name,\n 'axl.execution.id': executionId,\n 'axl.workflow.input_hash': hashInput(validated),\n },\n (span) =>\n this.runWorkflowBody({\n workflow,\n ctx: wfCtx,\n execInfo: execInfo!,\n validated,\n span,\n }),\n );\n };\n\n run()\n .then((result) => axlStream._done(result, executionId))\n .catch((err) => {\n // Early-throw safety net: if `runWorkflowBody` was never reached\n // (input parse, ctx construction, or registry lookup threw before\n // it ran), `execInfo.status` is still 'running' — the helper's\n // lifecycle emit/persist/cleanup didn't happen. Update + persist\n // here. If the helper DID run, it left status as 'failed' and\n // already persisted; we skip redundant work.\n if (execInfo && execInfo.status === 'running') {\n execInfo.status = 'failed';\n execInfo.completedAt = Date.now();\n execInfo.duration = execInfo.completedAt - execInfo.startedAt;\n execInfo.error = err instanceof Error ? err.message : String(err);\n // No `ctx` available on this path — `wfCtx` lives inside the\n // run() closure and was never assigned to a closure variable.\n // workflow_start was also never emitted (helper hadn't run),\n // so the start↔end pairing invariant holds: neither emitted.\n // `isAbortError` doesn't apply here either: `aborted: true` is\n // documented as \"user-driven cancellation that reached an\n // emitted workflow_end\". With no workflow_end, there's no\n // place to set the flag.\n this.persistExecution(execInfo);\n }\n // Clean up the abort controller even on pre-execInfo throws\n // (e.g., \"workflow not registered\") — the helper's `finally`\n // clears it on the success path, but early-throw never reaches\n // the helper.\n this.abortControllers.delete(executionId);\n axlStream._error(err instanceof Error ? err : new Error(String(err)), executionId);\n });\n\n return axlStream;\n }\n\n /** Create or resume a session. */\n session(id: string, options?: SessionOptions): Session {\n return new Session(id, this, this.stateStore, options);\n }\n\n /** Gracefully shut down the runtime, aborting in-flight executions and closing state stores and MCP servers. */\n async shutdown(): Promise<void> {\n // Abort all in-flight executions\n for (const [, controller] of this.abortControllers) {\n controller.abort();\n }\n this.abortControllers.clear();\n\n const errors: Error[] = [];\n const safeClose = async (label: string, fn: () => Promise<void>) => {\n try {\n await fn();\n } catch (err) {\n errors.push(new Error(`${label}: ${err instanceof Error ? err.message : String(err)}`));\n }\n };\n\n if (this.mcpManager) await safeClose('mcpManager', () => this.mcpManager!.shutdown());\n if (this.memoryManager) await safeClose('memoryManager', () => this.memoryManager!.close());\n if (this.stateStore.close) await safeClose('stateStore', () => this.stateStore.close!());\n await safeClose('spanManager', () => this.spanManager.shutdown());\n\n if (errors.length > 0) {\n throw new Error(\n `shutdown encountered ${errors.length} error(s): ${errors.map((e) => e.message).join('; ')}`,\n );\n }\n }\n\n /** Abort a running execution by its ID. */\n abort(executionId: string): void {\n const controller = this.abortControllers.get(executionId);\n if (controller) {\n controller.abort();\n this.abortControllers.delete(executionId);\n }\n }\n\n /** Get execution details by ID. */\n async getExecution(executionId: string): Promise<ExecutionInfo | undefined> {\n // Check active in-memory executions first\n const inMemory = this.executions.get(executionId);\n if (inMemory) return inMemory;\n\n // Check historical cache\n const cached = this.historicalExecutions.get(executionId);\n if (cached) return cached;\n\n // Fall through to store\n if (this.stateStore.getExecution) {\n const stored = await this.stateStore.getExecution(executionId);\n if (stored) {\n this.historicalExecutions.set(executionId, stored);\n return stored;\n }\n }\n\n return undefined;\n }\n\n /** Save an eval result to history. */\n async saveEvalResult(entry: EvalHistoryEntry): Promise<void> {\n // Add to in-memory cache (newest first)\n this.evalHistory.unshift(entry);\n\n // Persist to store\n if (this.stateStore.saveEvalResult) {\n await this.stateStore.saveEvalResult(entry);\n }\n\n // Emit for live aggregation (e.g., Studio eval trends)\n this.emit('eval_result', entry);\n }\n\n /**\n * Delete an eval history entry by id. Removes from in-memory cache and\n * the configured StateStore. Returns true if an entry was actually removed.\n *\n * Ensures lazy-loaded history is loaded first so the in-memory cache and\n * the store can't drift apart on the deletion path.\n */\n async deleteEvalResult(id: string): Promise<boolean> {\n // Force a lazy-load so the in-memory cache reflects everything in the\n // store before we mutate it.\n await this.getEvalHistory();\n\n const beforeLength = this.evalHistory.length;\n this.evalHistory = this.evalHistory.filter((e) => e.id !== id);\n const removedFromMemory = this.evalHistory.length < beforeLength;\n\n let removedFromStore = false;\n if (this.stateStore.deleteEvalResult) {\n removedFromStore = await this.stateStore.deleteEvalResult(id);\n }\n\n return removedFromMemory || removedFromStore;\n }\n\n /** Get eval result history (most recent first). */\n async getEvalHistory(): Promise<EvalHistoryEntry[]> {\n // Lazy-load from store on first access (once-guard)\n if (!this.evalHistoryLoadPromise && this.stateStore.listEvalResults) {\n this.evalHistoryLoadPromise = this.stateStore\n .listEvalResults()\n .then((stored) => {\n // Merge: stored entries not already in memory\n const ids = new Set(this.evalHistory.map((e) => e.id));\n for (const entry of stored) {\n if (!ids.has(entry.id)) {\n this.evalHistory.push(entry);\n }\n }\n // Re-sort by timestamp descending\n this.evalHistory.sort((a, b) => b.timestamp - a.timestamp);\n })\n .catch(() => {\n // Failed to load — reset so next call retries\n this.evalHistoryLoadPromise = null;\n });\n }\n if (this.evalHistoryLoadPromise) {\n await this.evalHistoryLoadPromise;\n }\n return [...this.evalHistory];\n }\n\n /** List pending human decisions. */\n async getPendingDecisions(): Promise<PendingDecision[]> {\n return this.stateStore.getPendingDecisions();\n }\n\n /** Resolve a pending human decision. */\n async resolveDecision(executionId: string, decision: HumanDecision): Promise<void> {\n const resolver = this.pendingDecisionResolvers.get(executionId);\n if (resolver) {\n // In-memory resolver exists — workflow is still running in this process\n resolver(decision);\n this.pendingDecisionResolvers.delete(executionId);\n }\n await this.stateStore.resolveDecision(executionId, decision);\n\n // Cross-restart: if no in-memory resolver, the workflow was lost on restart.\n // Trigger a re-execution that replays from checkpoints.\n if (!resolver) {\n const state = await this.stateStore.getExecutionState(executionId);\n if (state && state.status === 'waiting') {\n await this.resumeExecution(executionId);\n }\n }\n }\n\n /**\n * Resume a specific execution that was waiting for a human decision.\n * Re-runs the workflow from scratch; the workflow should use checkpoint-replay\n * to skip already-completed steps and pick up from the awaitHuman point.\n */\n async resumeExecution(executionId: string): Promise<unknown> {\n const state = await this.stateStore.getExecutionState(executionId);\n if (!state) {\n throw new Error(`No execution state found for \"${executionId}\"`);\n }\n\n const workflow = this.workflows.get(state.workflow);\n if (!workflow) {\n throw new Error(\n `Workflow \"${state.workflow}\" not registered. Cannot resume execution \"${executionId}\".`,\n );\n }\n\n // Re-execute the workflow with the same input — checkpoint-replay will skip completed steps\n return this.execute(state.workflow, state.input, {\n metadata: { ...state.metadata, resumedFrom: executionId, resumeMode: true },\n });\n }\n\n /**\n * Resume all pending executions that were waiting for human decisions.\n * Call this on startup to resume workflows that were interrupted by a restart.\n * Returns the execution IDs that were resumed.\n */\n async resumePending(): Promise<string[]> {\n const pendingIds = await this.stateStore.listPendingExecutions();\n const resumed: string[] = [];\n\n for (const executionId of pendingIds) {\n try {\n await this.resumeExecution(executionId);\n resumed.push(executionId);\n } catch (err) {\n this.emit('error', {\n type: 'resume_failed',\n executionId,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n return resumed;\n }\n\n /**\n * Summarize a list of chat messages into a concise summary string.\n * Used by Session to summarize dropped messages when history.summarize is enabled.\n */\n async summarizeMessages(messages: ChatMessage[], modelUri: string): Promise<string> {\n const { provider, model } = this.providerRegistry.resolve(modelUri, this.config);\n const response = await provider.chat(\n [\n {\n role: 'system',\n content:\n 'Summarize the following conversation concisely, preserving key facts, decisions, and context needed for continuing the conversation.',\n },\n {\n role: 'user',\n content: messages.map((m) => `${m.role}: ${m.content}`).join('\\n'),\n },\n ],\n { model, maxTokens: 1024 },\n );\n return response.content;\n }\n\n /** Get the state store (for testing and advanced use cases). */\n getStateStore(): StateStore {\n return this.stateStore;\n }\n\n /**\n * Run an evaluation against a registered workflow.\n * Requires `axl-eval` as a peer dependency.\n *\n * @see Spec Section 13.5\n */\n async eval(\n config: {\n workflow: string;\n dataset: unknown;\n scorers: unknown[];\n concurrency?: number;\n budget?: string;\n metadata?: Record<string, unknown>;\n },\n options?: {\n onProgress?: (event: EvalProgressEventShape) => void;\n signal?: AbortSignal;\n captureTraces?: boolean;\n },\n ): Promise<unknown> {\n let runEvalFn: (\n config: unknown,\n executeFn: (\n input: unknown,\n runtime: unknown,\n ) => Promise<{ output: unknown; cost?: number; metadata?: Record<string, unknown> }>,\n runtime: unknown,\n evalOptions?: {\n onProgress?: (event: EvalProgressEventShape) => void;\n signal?: AbortSignal;\n captureTraces?: boolean;\n },\n ) => Promise<unknown>;\n try {\n // @ts-expect-error — @axlsdk/eval is an optional peer dependency\n ({ runEval: runEvalFn } = await import('@axlsdk/eval'));\n } catch {\n throw new Error(\n 'axl-eval is required for AxlRuntime.eval(). Install it with: npm install @axlsdk/eval',\n );\n }\n\n const executeWorkflow = async (\n input: unknown,\n ): Promise<{ output: unknown; cost?: number; metadata?: Record<string, unknown> }> => {\n const { result, cost, metadata } = await this.trackExecution(async () => {\n return this.execute(config.workflow, input);\n });\n return { output: result, cost, metadata };\n };\n\n return runEvalFn(config, executeWorkflow, this, options);\n }\n\n /**\n * Compare two evaluation results to detect regressions and improvements.\n * Requires `axl-eval` as a peer dependency.\n *\n * @see Spec Section 13.6\n */\n async evalCompare(baseline: unknown, candidate: unknown, options?: unknown): Promise<unknown> {\n let evalCompareFn: (baseline: unknown, candidate: unknown, options?: unknown) => unknown;\n try {\n // @ts-expect-error — @axlsdk/eval is an optional peer dependency\n ({ evalCompare: evalCompareFn } = await import('@axlsdk/eval'));\n } catch {\n throw new Error(\n 'axl-eval is required for AxlRuntime.evalCompare(). Install it with: npm install @axlsdk/eval',\n );\n }\n\n return evalCompareFn(baseline, candidate, options);\n }\n\n /**\n * Track cost across any runtime operations within the given function.\n * Uses AsyncLocalStorage to scope cost attribution to specific execution IDs,\n * making it correct with concurrent calls.\n *\n * Works with both `createContext()` and `execute()` calls inside `fn`.\n */\n async trackCost<T>(fn: () => Promise<T>): Promise<{ result: T; cost: number }> {\n const { result, cost } = await this.trackExecution(fn);\n return { result, cost };\n }\n\n /**\n * Track cost and execution metadata across any runtime operations within the given function.\n * Uses AsyncLocalStorage to scope attribution to specific execution IDs,\n * making it correct with concurrent calls.\n *\n * Returns cost (same as `trackCost`) plus metadata extracted from trace events:\n * models (unique URIs), tokens (input/output/reasoning sums), and agent call count.\n *\n * ## Cost vs tokens semantics\n *\n * - `cost` is the full aggregate across EVERY event with a top-level\n * `event.cost` set: agent calls, tool calls, semantic memory ops, etc.\n * This is the number to reconcile against your provider bill.\n *\n * - `metadata.tokens` is narrowly scoped to **agent** prompt/completion/\n * reasoning tokens. Embedder tokens from semantic `ctx.remember({embed:true})`\n * / `ctx.recall({query})` are deliberately NOT summed here — they're a\n * different category (input-only, different pricing, different model).\n * Conflating them would make \"prompt tokens\" misleading in the UI. If you\n * need embedder token counts, subscribe to `runtime.on('trace', ...)` and\n * read `data.usage.tokens` on `memory_remember` / `memory_recall` events.\n *\n * Pass `{ captureTraces: true }` to also collect the raw `AxlEvent[]` observed\n * during `fn()`. This is opt-in because it keeps every event in memory for the\n * duration of the call — useful for eval per-item capture, debugging, and test\n * assertions, but overhead grows with trace volume. When enabled, verbose-mode\n * `agent_call_start.data.messages` snapshots are omitted from captured events (still\n * broadcast via onTrace) to keep memory bounded — callers who need the full\n * verbose snapshot should subscribe to `runtime.on('trace', ...)` directly.\n *\n * Works with both `createContext()` and `execute()` calls inside `fn`.\n */\n async trackExecution<T>(\n fn: () => Promise<T>,\n options?: { captureTraces?: boolean },\n ): Promise<{\n result: T;\n cost: number;\n traces?: AxlEvent[];\n metadata: {\n models: string[];\n modelCallCounts?: Record<string, number>;\n /**\n * Agent token totals only — does not include embedder tokens from\n * semantic memory operations. See the method-level JSDoc above.\n */\n tokens: { input: number; output: number; reasoning: number };\n agentCalls: number;\n /**\n * Unique workflow names observed during execution, ordered by first\n * appearance (outermost first for nested calls). Captured automatically\n * from `workflow_start` trace events — callers don't need to declare\n * anything. Parallel mechanism to `models`.\n */\n workflows: string[];\n /** Call counts per workflow, if workflows.length > 0. */\n workflowCallCounts?: Record<string, number>;\n };\n }> {\n const parentScope = costScopeStorage.getStore();\n const scope: CostScope = {\n totalCost: 0,\n trackedIds: new Set(),\n parent: parentScope,\n };\n\n const modelCalls = new Map<string, number>();\n // Insertion-ordered Map: first time we see a workflow it gets added at\n // the end, so iteration order is \"first-seen first\" — which for nested\n // workflow calls puts the outermost workflow first.\n const workflowCalls = new Map<string, number>();\n const tokens = { input: 0, output: 0, reasoning: 0 };\n let agentCalls = 0;\n const capturedTraces: AxlEvent[] | undefined = options?.captureTraces ? [] : undefined;\n\n const listener = (event: AxlEvent) => {\n if (!scope.trackedIds.has(event.executionId)) return;\n // Cost rollup via shared helper — one source of truth for the\n // \"skip ask_end, finite-check, leaf-only\" invariant (spec §10).\n scope.totalCost += eventCostContribution(event);\n if (event.type === 'agent_call_end') {\n if (event.model) modelCalls.set(event.model, (modelCalls.get(event.model) ?? 0) + 1);\n agentCalls++;\n if (event.tokens) {\n tokens.input += event.tokens.input ?? 0;\n tokens.output += event.tokens.output ?? 0;\n tokens.reasoning += event.tokens.reasoning ?? 0;\n }\n }\n // Both `runtime.execute()` and `runtime.stream()` now emit workflow_start\n // as a first-class `type: 'workflow_start'` event. AxlTestRuntime does\n // the same. The prior log-form fallback is no longer needed.\n if (event.type === 'workflow_start' && event.workflow) {\n workflowCalls.set(event.workflow, (workflowCalls.get(event.workflow) ?? 0) + 1);\n }\n\n // Capture a compact copy of the event when requested. We strip the\n // verbose `messages` field (can be tens of KB per turn) to keep memory\n // predictable — callers who need the full verbose snapshot should\n // subscribe to `runtime.on('trace', ...)` directly.\n if (capturedTraces) {\n // Skip high-volume stream-only events for the same reason\n // `runtime.execute()` / `runtime.stream()` drop them from\n // `ExecutionInfo.events`: a streaming eval item with thousands of\n // tokens / progressive `partial_object` snapshots would blow memory\n // when `captureTraces: true` is set on `runEval`. Reviewer bug B3.\n if (event.type === 'token' || event.type === 'partial_object') return;\n // Verbose `messages[]` snapshots live on agent_call_start (request\n // side) under the start/end split. Strip to keep memory bounded.\n if (event.type === 'agent_call_start' && event.data) {\n const d = event.data as Record<string, unknown>;\n if ('messages' in d) {\n const rest: Record<string, unknown> = {};\n for (const k of Object.keys(d)) {\n if (k !== 'messages') rest[k] = d[k];\n }\n capturedTraces.push({ ...event, data: rest } as AxlEvent);\n return;\n }\n }\n capturedTraces.push(event);\n }\n };\n\n // Temporarily increase maxListeners to avoid warnings at high concurrency\n this.setMaxListeners(this.getMaxListeners() + 1);\n this.on('trace', listener);\n try {\n const result = await costScopeStorage.run(scope, fn);\n return {\n result,\n cost: scope.totalCost,\n ...(capturedTraces ? { traces: capturedTraces } : {}),\n metadata: {\n models: [...modelCalls.keys()],\n modelCallCounts: modelCalls.size > 0 ? Object.fromEntries(modelCalls) : undefined,\n tokens,\n agentCalls,\n workflows: [...workflowCalls.keys()],\n workflowCallCounts:\n workflowCalls.size > 0 ? Object.fromEntries(workflowCalls) : undefined,\n },\n };\n } catch (err) {\n // Attach captured traces to the thrown error so callers using\n // `captureTraces: true` can recover the diagnostic trail on failure\n // (e.g., eval runner per-item traces for failed items). Non-enumerable\n // so the property doesn't pollute JSON serialization or stack traces.\n if (capturedTraces && typeof err === 'object' && err !== null) {\n Object.defineProperty(err, 'axlCapturedTraces', {\n value: capturedTraces,\n enumerable: false,\n writable: true,\n configurable: true,\n });\n }\n throw err;\n } finally {\n this.off('trace', listener);\n this.setMaxListeners(this.getMaxListeners() - 1);\n }\n }\n\n /** Register an execution ID with the active cost scope for trackCost() attribution. */\n private registerWithCostScope(executionId: string): void {\n const costScope = costScopeStorage.getStore();\n if (costScope) {\n let scope: CostScope | undefined = costScope;\n while (scope) {\n scope.trackedIds.add(executionId);\n scope = scope.parent;\n }\n }\n }\n\n /**\n * Handle trace event output based on configuration.\n *\n * When trace is disabled or level is 'off', events are still emitted via\n * EventEmitter (for programmatic subscribers) but nothing is logged to console.\n * The emit('trace', event) call happens before this method is called, so\n * programmatic subscribers always receive events regardless of trace config.\n */\n private outputAxlEvent(event: AxlEvent): void {\n const traceConfig = this.config.trace;\n if (!traceConfig?.enabled) return;\n\n const level = traceConfig.level ?? 'steps';\n if (level === 'off') return;\n\n const output = traceConfig.output ?? 'console';\n\n if (output === 'json') {\n console.log(JSON.stringify(event));\n return;\n }\n\n if (output === 'file') {\n const filename = `axl-trace-${event.executionId}.jsonl`;\n try {\n appendFileSync(filename, JSON.stringify(event) + '\\n');\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n mkdirSync(dirname(filename), { recursive: true });\n appendFileSync(filename, JSON.stringify(event) + '\\n');\n } else {\n throw err;\n }\n }\n return;\n }\n\n // Console output (default)\n this.logAxlEvent(event);\n }\n\n private logAxlEvent(event: AxlEvent): void {\n const level = this.config.trace?.level ?? 'steps';\n const workflowPrefix = event.workflow ? `workflow:${event.workflow} | ` : '';\n const parts = [`[axl] execution:${event.executionId}`];\n\n if (event.type === 'workflow_start') {\n // workflow name now lives on the event top-level, not in data.\n parts.push(`${workflowPrefix}started`);\n } else if (event.type === 'workflow_end') {\n // Honour the actual outcome — previously this always said \"completed\"\n // even for failed/aborted runs.\n const d = event.data as { status?: string; aborted?: boolean } | undefined;\n const status = d?.aborted ? 'aborted' : (d?.status ?? 'completed');\n parts.push(`${workflowPrefix}${status}`);\n if (event.duration != null) parts.push(`${(event.duration / 1000).toFixed(1)}s`);\n } else if (event.type === 'agent_call_end') {\n parts.push(`${workflowPrefix}step:${event.step} agent_call`);\n if (event.agent) parts.push(`agent:${event.agent}`);\n if (event.promptVersion) parts.push(`version:${event.promptVersion}`);\n if (event.model) parts.push(`model:${event.model}`);\n if (event.duration) parts.push(`${(event.duration / 1000).toFixed(1)}s`);\n if (event.cost) parts.push(`$${event.cost.toFixed(3)}`);\n if (level === 'full' && event.data) {\n parts.push(`data:${JSON.stringify(event.data)}`);\n }\n } else if (event.type === 'tool_call_end') {\n parts.push(`${workflowPrefix}step:${event.step} tool_call`);\n if (event.tool) parts.push(`tool:${event.tool}`);\n if (event.duration) parts.push(`${event.duration}ms`);\n if (level === 'full' && event.data) {\n parts.push(`data:${JSON.stringify(event.data)}`);\n }\n } else if (event.type === 'guardrail') {\n const gData = event.data as\n | { guardrailType?: string; blocked?: boolean; reason?: string }\n | undefined;\n parts.push(`${workflowPrefix}step:${event.step} guardrail`);\n if (gData?.guardrailType) parts.push(`type:${gData.guardrailType}`);\n if (gData?.blocked !== undefined) parts.push(gData.blocked ? 'BLOCKED' : 'passed');\n if (gData?.reason) parts.push(`reason:${gData.reason}`);\n } else if (event.type === 'log') {\n parts.push(`${workflowPrefix}log: ${JSON.stringify(event.data)}`);\n } else {\n parts.push(`${workflowPrefix}${event.type}`);\n // Some variants don't carry `data` (e.g., `ask_start`).\n // Inspect dynamically so the logger remains a catch-all without\n // enumerating every variant.\n const data = (event as { data?: unknown }).data;\n if (level === 'full' && data !== undefined) {\n parts.push(`data:${JSON.stringify(data)}`);\n }\n }\n\n console.log(parts.join(' | '));\n }\n\n /**\n * Append a handoff record to session metadata.\n * Note: The read-modify-write is not atomic. Concurrent handoffs in the same\n * session could lose a record. In practice, trace events within a single\n * execution are sequential (same event loop), so this is only a concern for\n * cross-execution concurrency on the same session, which is unlikely.\n */\n private appendHandoffRecord(sessionId: string, record: HandoffRecord): void {\n // Fire and forget — don't block the trace handler\n this.stateStore\n .getSessionMeta(sessionId, 'handoffHistory')\n .then((existing) => {\n const history = (existing as HandoffRecord[]) ?? [];\n history.push(record);\n return this.stateStore.saveSessionMeta(sessionId, 'handoffHistory', history);\n })\n .catch(() => {\n // Silently ignore persistence errors in the trace path\n });\n }\n\n /**\n * Patch `duration` on the handoff record matching `toAskId` (the target\n * frame's askId, which the runtime stamps on `handoff_start` and which\n * appears as `askId` on the target's `ask_end`).\n *\n * Called from two places per handoff:\n * - target's `ask_end` — first-write source for ONEWAY (no return event).\n * - `handoff_return` — overwrites for ROUNDTRIP with the round-trip\n * wall-clock figure (intentional: round-trip\n * duration is the more useful metric for the\n * source-paused-for-N-ms semantic).\n *\n * No-op if no record matches `toAskId` (e.g., stream subscribed mid-\n * handoff, or session metadata got wiped) — `duration` stays undefined,\n * which is the documented default for `HandoffRecord`.\n */\n private updateHandoffDuration(\n sessionId: string,\n match: { toAskId: string; duration: number },\n ): void {\n this.stateStore\n .getSessionMeta(sessionId, 'handoffHistory')\n .then((existing) => {\n const history = (existing as HandoffRecord[]) ?? [];\n for (const r of history) {\n if (r.toAskId === match.toAskId) {\n r.duration = match.duration;\n return this.stateStore.saveSessionMeta(sessionId, 'handoffHistory', history);\n }\n }\n return undefined;\n })\n .catch(() => {\n // Silently ignore persistence errors in the trace path\n });\n }\n}\n","import { writeFileSync, readFileSync, existsSync, mkdirSync, unlinkSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport type { ChatMessage, ExecutionInfo, HumanDecision } from '../types.js';\nimport type { StateStore, PendingDecision, ExecutionState, EvalHistoryEntry } from './types.js';\n\n/**\n * Path to the MemoryStore temp file for awaitHuman state.\n * Ensures awaitHuman state survives process restarts even\n * when using MemoryStore (spec requirement).\n *\n * NOTE: tmpdir() persistence is best-effort. Temp directories may be cleaned\n * by the OS at any time (e.g., on reboot or via periodic cleanup policies).\n * For durable awaitHuman persistence, use SQLite or Redis state stores.\n */\nconst AWAIT_HUMAN_TEMP_DIR = join(tmpdir(), 'axl-memory-store');\nconst AWAIT_HUMAN_TEMP_FILE = join(AWAIT_HUMAN_TEMP_DIR, 'await-human-state.json');\n\ntype PersistedAwaitHumanState = {\n decisions: Record<string, PendingDecision>;\n executionStates: Record<string, ExecutionState>;\n};\n\n/**\n * In-memory implementation of StateStore.\n * Fast for development and testing, but lost on process restart.\n *\n * Exception: awaitHuman state (pending decisions + execution states with\n * status \"waiting\") is persisted to a temporary file so it survives restarts.\n * This is the one exception to \"memory means ephemeral\" — because a human\n * could take hours to respond, and losing that state is unacceptable.\n */\nexport class MemoryStore implements StateStore {\n private checkpoints = new Map<string, Map<string, unknown>>();\n private sessions = new Map<string, ChatMessage[]>();\n private sessionMeta = new Map<string, Map<string, unknown>>();\n private decisions = new Map<string, PendingDecision>();\n private executionStates = new Map<string, ExecutionState>();\n private memories = new Map<string, Map<string, unknown>>();\n private executionHistory = new Map<string, ExecutionInfo>();\n private evalHistory = new Map<string, EvalHistoryEntry>();\n\n constructor() {\n // Load any persisted awaitHuman state from previous process\n this.loadPersistedState();\n }\n\n async saveCheckpoint(executionId: string, name: string, data: unknown): Promise<void> {\n let entries = this.checkpoints.get(executionId);\n if (!entries) {\n entries = new Map();\n this.checkpoints.set(executionId, entries);\n }\n entries.set(name, structuredClone(data));\n }\n\n async getCheckpoint(executionId: string, name: string): Promise<unknown | null> {\n const entries = this.checkpoints.get(executionId);\n if (!entries) return null;\n const data = entries.get(name);\n return data !== undefined ? structuredClone(data) : null;\n }\n\n async saveSession(sessionId: string, history: ChatMessage[]): Promise<void> {\n this.sessions.set(sessionId, structuredClone(history));\n }\n\n async getSession(sessionId: string): Promise<ChatMessage[]> {\n const history = this.sessions.get(sessionId);\n return history ? structuredClone(history) : [];\n }\n\n async deleteSession(sessionId: string): Promise<void> {\n this.sessions.delete(sessionId);\n this.sessionMeta.delete(sessionId);\n }\n\n async saveSessionMeta(sessionId: string, key: string, value: unknown): Promise<void> {\n let meta = this.sessionMeta.get(sessionId);\n if (!meta) {\n meta = new Map();\n this.sessionMeta.set(sessionId, meta);\n }\n meta.set(key, structuredClone(value));\n }\n\n async getSessionMeta(sessionId: string, key: string): Promise<unknown | null> {\n const meta = this.sessionMeta.get(sessionId);\n if (!meta) return null;\n const value = meta.get(key);\n return value !== undefined ? structuredClone(value) : null;\n }\n\n async savePendingDecision(executionId: string, decision: PendingDecision): Promise<void> {\n this.decisions.set(executionId, structuredClone(decision));\n this.persistAwaitHumanState();\n }\n\n async getPendingDecisions(): Promise<PendingDecision[]> {\n return [...this.decisions.values()].map((d) => structuredClone(d));\n }\n\n async resolveDecision(executionId: string, _result: HumanDecision): Promise<void> {\n this.decisions.delete(executionId);\n this.persistAwaitHumanState();\n }\n\n // ── Execution State ──────────────────────────────────────────────────\n\n async saveExecutionState(executionId: string, state: ExecutionState): Promise<void> {\n this.executionStates.set(executionId, structuredClone(state));\n // Persist waiting states to temp file\n if (state.status === 'waiting') {\n this.persistAwaitHumanState();\n }\n }\n\n async getExecutionState(executionId: string): Promise<ExecutionState | null> {\n const state = this.executionStates.get(executionId);\n return state ? structuredClone(state) : null;\n }\n\n async listPendingExecutions(): Promise<string[]> {\n const pending: string[] = [];\n for (const [id, state] of this.executionStates) {\n if (state.status === 'waiting') pending.push(id);\n }\n return pending;\n }\n\n // ── Memory ──────────────────────────────────────────────────────\n\n async saveMemory(scope: string, key: string, value: unknown): Promise<void> {\n let scopeMap = this.memories.get(scope);\n if (!scopeMap) {\n scopeMap = new Map();\n this.memories.set(scope, scopeMap);\n }\n scopeMap.set(key, structuredClone(value));\n }\n\n async getMemory(scope: string, key: string): Promise<unknown | null> {\n const val = this.memories.get(scope)?.get(key);\n return val !== undefined ? structuredClone(val) : null;\n }\n\n async getAllMemory(scope: string): Promise<Array<{ key: string; value: unknown }>> {\n const scopeMap = this.memories.get(scope);\n if (!scopeMap) return [];\n return Array.from(scopeMap.entries()).map(([key, value]) => ({\n key,\n value: structuredClone(value),\n }));\n }\n\n async deleteMemory(scope: string, key: string): Promise<void> {\n this.memories.get(scope)?.delete(key);\n }\n\n // ── Execution History ──────────────────────────────────────────────\n\n async saveExecution(execution: ExecutionInfo): Promise<void> {\n this.executionHistory.set(execution.executionId, structuredClone(execution));\n }\n\n async getExecution(executionId: string): Promise<ExecutionInfo | null> {\n const exec = this.executionHistory.get(executionId);\n return exec ? structuredClone(exec) : null;\n }\n\n async listExecutions(limit?: number): Promise<ExecutionInfo[]> {\n const sorted = [...this.executionHistory.values()].sort((a, b) => b.startedAt - a.startedAt);\n const result = limit ? sorted.slice(0, limit) : sorted;\n return result.map((e) => structuredClone(e));\n }\n\n // ── Eval History ──────────────────────────────────────────────────\n\n async saveEvalResult(entry: EvalHistoryEntry): Promise<void> {\n this.evalHistory.set(entry.id, structuredClone(entry));\n }\n\n async listEvalResults(limit?: number): Promise<EvalHistoryEntry[]> {\n const sorted = [...this.evalHistory.values()].sort((a, b) => b.timestamp - a.timestamp);\n const result = limit ? sorted.slice(0, limit) : sorted;\n return result.map((e) => structuredClone(e));\n }\n\n async deleteEvalResult(id: string): Promise<boolean> {\n return this.evalHistory.delete(id);\n }\n\n // ── Sessions (Studio introspection) ─────────────────────────────────\n\n async listSessions(): Promise<string[]> {\n return [...this.sessions.keys()];\n }\n\n // ── Lifecycle ──────────────────────────────────────────────────────\n\n async close(): Promise<void> {}\n\n async deleteCheckpoints(executionId: string): Promise<void> {\n this.checkpoints.delete(executionId);\n }\n\n // ── Temp File Persistence (awaitHuman only) ────────────────────────\n\n private persistAwaitHumanState(): void {\n try {\n const state: PersistedAwaitHumanState = {\n decisions: Object.fromEntries(this.decisions),\n executionStates: {},\n };\n\n // Only persist execution states that are in 'waiting' status\n for (const [id, execState] of this.executionStates) {\n if (execState.status === 'waiting') {\n state.executionStates[id] = execState;\n }\n }\n\n // Only write if there's something to persist\n if (\n Object.keys(state.decisions).length === 0 &&\n Object.keys(state.executionStates).length === 0\n ) {\n // Clean up temp file if nothing to persist\n try {\n unlinkSync(AWAIT_HUMAN_TEMP_FILE);\n } catch {\n /* ignore */\n }\n return;\n }\n\n mkdirSync(AWAIT_HUMAN_TEMP_DIR, { recursive: true });\n writeFileSync(AWAIT_HUMAN_TEMP_FILE, JSON.stringify(state), 'utf-8');\n } catch {\n // Best-effort persistence — don't crash if temp file write fails\n }\n }\n\n private loadPersistedState(): void {\n try {\n if (!existsSync(AWAIT_HUMAN_TEMP_FILE)) return;\n\n const raw = readFileSync(AWAIT_HUMAN_TEMP_FILE, 'utf-8');\n const state = JSON.parse(raw) as PersistedAwaitHumanState;\n\n for (const [id, decision] of Object.entries(state.decisions)) {\n this.decisions.set(id, decision);\n }\n for (const [id, execState] of Object.entries(state.executionStates)) {\n this.executionStates.set(id, execState);\n }\n\n // Clean up the temp file after loading\n unlinkSync(AWAIT_HUMAN_TEMP_FILE);\n } catch {\n // Best-effort load — ignore errors\n }\n }\n}\n","import type { ChatMessage, ExecutionInfo, HumanDecision } from '../types.js';\nimport type { StateStore, PendingDecision, ExecutionState, EvalHistoryEntry } from './types.js';\n\n// Lazy-loaded better-sqlite3 types\ntype Database = import('better-sqlite3').Database;\ntype DatabaseConstructor = typeof import('better-sqlite3');\n\n/** Safely parse JSON, returning null on corrupt data instead of crashing. */\nfunction safeJsonParse(data: string): unknown | null {\n try {\n return JSON.parse(data);\n } catch {\n return null;\n }\n}\n\ntype ExecutionHistoryRow = {\n execution_id: string;\n workflow: string;\n status: string;\n total_cost: number;\n started_at: number;\n completed_at: number | null;\n duration: number;\n error: string | null;\n events: string;\n};\n\nfunction rowToExecutionInfo(row: ExecutionHistoryRow): ExecutionInfo {\n return {\n executionId: row.execution_id,\n workflow: row.workflow,\n status: row.status as ExecutionInfo['status'],\n totalCost: row.total_cost,\n startedAt: row.started_at,\n completedAt: row.completed_at ?? undefined,\n duration: row.duration,\n error: row.error ?? undefined,\n events: (safeJsonParse(row.events) as ExecutionInfo['events']) ?? [],\n };\n}\n\n/**\n * SQLite-backed StateStore using better-sqlite3.\n *\n * Zero-config, file-based persistence suitable for single-process production.\n * Uses prepared statements for all operations.\n *\n * Requires `better-sqlite3` as a peer dependency. If not installed,\n * the constructor throws a clear error message.\n */\nexport class SQLiteStore implements StateStore {\n private db: Database;\n\n constructor(filePath: string) {\n let BetterSqlite3: DatabaseConstructor;\n try {\n BetterSqlite3 = require('better-sqlite3');\n } catch {\n throw new Error(\n 'better-sqlite3 is required for SQLiteStore. Install it with: npm install better-sqlite3',\n );\n }\n\n this.db = new BetterSqlite3(filePath);\n this.db.pragma('journal_mode = WAL');\n this.migrate();\n this.initTables();\n }\n\n /**\n * Idempotent schema migration. Tracks version via `PRAGMA user_version`\n * so reopens skip applied steps. Wrapped in `BEGIN IMMEDIATE` so\n * concurrent `SQLiteStore` constructors serialize at the file level\n * and rollback on failure leaves the DB in a clean pre-migration\n * state.\n *\n * Migration history:\n * - v1 (spec/16): rename `execution_history.steps` → `events`. The\n * JS-level `ExecutionInfo.steps` was renamed to `.events` in PR 1\n * commit 1; this brings the on-disk schema in line.\n * - v2 (named checkpoints): rename `checkpoints.step` (INTEGER) →\n * `checkpoints.name` (TEXT). The runtime now requires\n * `ctx.checkpoint(name, fn)` so the per-context numeric counter is\n * gone — names are caller-supplied stable identifiers. Existing\n * numeric step values become stringified names (\"0\", \"1\", …) to\n * preserve replay continuity for in-flight executions across the\n * upgrade boundary.\n *\n * Applied BEFORE `initTables()` so the subsequent `CREATE TABLE\n * IF NOT EXISTS` runs against the post-migration column name. Fresh\n * installs just create the table with `events` directly and bump\n * `user_version` to the current version.\n *\n * TOCTOU guard (review B-3): the initial `user_version` read is\n * informational only — a concurrent process can complete the\n * migration between that read and our `BEGIN IMMEDIATE`. We\n * re-read `user_version` inside the transaction and short-circuit\n * if it's already at target, so the non-idempotent half (writes\n * that went beyond a simple ALTER) never double-applies under a\n * race. The current v0→v1 step IS idempotent via the column-\n * presence check, but future migrations may not be, and the\n * transactional re-read costs nothing.\n */\n private migrate(): void {\n const TARGET_VERSION = 2;\n const current = this.db.pragma('user_version', { simple: true }) as number;\n if (current >= TARGET_VERSION) return;\n\n this.db.exec('BEGIN IMMEDIATE');\n try {\n // Re-read under the write lock — a concurrent constructor may\n // have completed the migration between our pragma read above\n // and our lock acquisition. Short-circuit to avoid re-applying.\n const committed = this.db.pragma('user_version', { simple: true }) as number;\n if (committed >= TARGET_VERSION) {\n this.db.exec('COMMIT');\n return;\n }\n // v0 → v1: rename `steps` column on `execution_history` if present.\n // `table_info()` is safe even if the table doesn't exist (returns []).\n if (committed < 1) {\n const cols = this.db.pragma('table_info(execution_history)') as Array<{ name: string }>;\n if (cols.some((c) => c.name === 'steps') && !cols.some((c) => c.name === 'events')) {\n this.db.exec('ALTER TABLE execution_history RENAME COLUMN steps TO events');\n }\n }\n // v1 → v2: rename `checkpoints.step` (INTEGER) → `checkpoints.name`\n // (TEXT). SQLite columns are dynamically typed so existing integer\n // values continue to work; ALTER TABLE just updates the column name\n // (and type hint) so new schemas match. NOTE: legacy auto-checkpoint\n // rows (\"0\", \"1\", …) are *structurally* preserved but become\n // unreachable — the new runtime composes auto-checkpoint names like\n // `__auto/<agent>/ask/<n>`, which never match the legacy integer\n // strings. In-flight executions resumed under v2 will re-execute\n // side effects (no replay match). Drain or cancel running\n // executions before upgrading. User-named checkpoints (only\n // possible on the new API) are unaffected.\n if (committed < 2) {\n const cols = this.db.pragma('table_info(checkpoints)') as Array<{ name: string }>;\n if (cols.some((c) => c.name === 'step') && !cols.some((c) => c.name === 'name')) {\n this.db.exec('ALTER TABLE checkpoints RENAME COLUMN step TO name');\n }\n }\n this.db.pragma(`user_version = ${TARGET_VERSION}`);\n this.db.exec('COMMIT');\n } catch (err) {\n this.db.exec('ROLLBACK');\n throw err;\n }\n }\n\n private initTables(): void {\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS checkpoints (\n execution_id TEXT NOT NULL,\n name TEXT NOT NULL,\n data TEXT NOT NULL,\n PRIMARY KEY (execution_id, name)\n );\n\n CREATE TABLE IF NOT EXISTS sessions (\n session_id TEXT PRIMARY KEY,\n history TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS decisions (\n execution_id TEXT PRIMARY KEY,\n channel TEXT NOT NULL,\n prompt TEXT NOT NULL,\n metadata TEXT,\n created_at TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS execution_state (\n execution_id TEXT PRIMARY KEY,\n workflow TEXT NOT NULL,\n input TEXT NOT NULL,\n step INTEGER NOT NULL DEFAULT 0,\n status TEXT NOT NULL DEFAULT 'running',\n metadata TEXT\n );\n\n CREATE TABLE IF NOT EXISTS session_meta (\n session_id TEXT NOT NULL,\n key TEXT NOT NULL,\n value TEXT NOT NULL,\n PRIMARY KEY (session_id, key)\n );\n\n CREATE TABLE IF NOT EXISTS memory (\n scope TEXT NOT NULL,\n key TEXT NOT NULL,\n value TEXT NOT NULL,\n updated_at TEXT NOT NULL DEFAULT (datetime('now')),\n PRIMARY KEY (scope, key)\n );\n\n CREATE TABLE IF NOT EXISTS execution_history (\n execution_id TEXT PRIMARY KEY,\n workflow TEXT NOT NULL,\n status TEXT NOT NULL,\n total_cost REAL NOT NULL DEFAULT 0,\n started_at INTEGER NOT NULL,\n completed_at INTEGER,\n duration INTEGER NOT NULL DEFAULT 0,\n error TEXT,\n events TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS eval_history (\n id TEXT PRIMARY KEY,\n eval_name TEXT NOT NULL,\n timestamp INTEGER NOT NULL,\n data TEXT NOT NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_exec_history_started ON execution_history (started_at DESC);\n CREATE INDEX IF NOT EXISTS idx_eval_history_timestamp ON eval_history (timestamp DESC);\n `);\n }\n\n // ── Checkpoints ────────────────────────────────────────────────────────\n\n async saveCheckpoint(executionId: string, name: string, data: unknown): Promise<void> {\n const stmt = this.db.prepare(\n 'INSERT OR REPLACE INTO checkpoints (execution_id, name, data) VALUES (?, ?, ?)',\n );\n stmt.run(executionId, name, JSON.stringify(data));\n }\n\n async getCheckpoint(executionId: string, name: string): Promise<unknown | null> {\n const stmt = this.db.prepare(\n 'SELECT data FROM checkpoints WHERE execution_id = ? AND name = ?',\n );\n const row = stmt.get(executionId, name) as { data: string } | undefined;\n return row ? safeJsonParse(row.data) : null;\n }\n\n // ── Sessions ────────────────────────────────────────────────────────────\n\n async saveSession(sessionId: string, history: ChatMessage[]): Promise<void> {\n const stmt = this.db.prepare(\n 'INSERT OR REPLACE INTO sessions (session_id, history) VALUES (?, ?)',\n );\n stmt.run(sessionId, JSON.stringify(history));\n }\n\n async getSession(sessionId: string): Promise<ChatMessage[]> {\n const stmt = this.db.prepare('SELECT history FROM sessions WHERE session_id = ?');\n const row = stmt.get(sessionId) as { history: string } | undefined;\n return row ? ((safeJsonParse(row.history) as ChatMessage[]) ?? []) : [];\n }\n\n async deleteSession(sessionId: string): Promise<void> {\n const stmt = this.db.prepare('DELETE FROM sessions WHERE session_id = ?');\n stmt.run(sessionId);\n const metaStmt = this.db.prepare('DELETE FROM session_meta WHERE session_id = ?');\n metaStmt.run(sessionId);\n }\n\n async saveSessionMeta(sessionId: string, key: string, value: unknown): Promise<void> {\n const stmt = this.db.prepare(\n 'INSERT OR REPLACE INTO session_meta (session_id, key, value) VALUES (?, ?, ?)',\n );\n stmt.run(sessionId, key, JSON.stringify(value));\n }\n\n async getSessionMeta(sessionId: string, key: string): Promise<unknown | null> {\n const stmt = this.db.prepare('SELECT value FROM session_meta WHERE session_id = ? AND key = ?');\n const row = stmt.get(sessionId, key) as { value: string } | undefined;\n return row ? safeJsonParse(row.value) : null;\n }\n\n // ── Pending Decisions ──────────────────────────────────────────────────\n\n async savePendingDecision(executionId: string, decision: PendingDecision): Promise<void> {\n const stmt = this.db.prepare(\n 'INSERT OR REPLACE INTO decisions (execution_id, channel, prompt, metadata, created_at) VALUES (?, ?, ?, ?, ?)',\n );\n stmt.run(\n executionId,\n decision.channel,\n decision.prompt,\n decision.metadata ? JSON.stringify(decision.metadata) : null,\n decision.createdAt,\n );\n }\n\n async getPendingDecisions(): Promise<PendingDecision[]> {\n const stmt = this.db.prepare('SELECT * FROM decisions');\n const rows = stmt.all() as Array<{\n execution_id: string;\n channel: string;\n prompt: string;\n metadata: string | null;\n created_at: string;\n }>;\n return rows.map((row) => ({\n executionId: row.execution_id,\n channel: row.channel,\n prompt: row.prompt,\n metadata: row.metadata\n ? (safeJsonParse(row.metadata) as Record<string, unknown> | undefined)\n : undefined,\n createdAt: row.created_at,\n }));\n }\n\n async resolveDecision(executionId: string, _result: HumanDecision): Promise<void> {\n const stmt = this.db.prepare('DELETE FROM decisions WHERE execution_id = ?');\n stmt.run(executionId);\n }\n\n // ── Execution State (for awaitHuman suspend/resume) ────────────────────\n\n async saveExecutionState(executionId: string, state: ExecutionState): Promise<void> {\n const stmt = this.db.prepare(\n 'INSERT OR REPLACE INTO execution_state (execution_id, workflow, input, step, status, metadata) VALUES (?, ?, ?, ?, ?, ?)',\n );\n stmt.run(\n executionId,\n state.workflow,\n JSON.stringify(state.input),\n state.step,\n state.status,\n state.metadata ? JSON.stringify(state.metadata) : null,\n );\n }\n\n async getExecutionState(executionId: string): Promise<ExecutionState | null> {\n const stmt = this.db.prepare('SELECT * FROM execution_state WHERE execution_id = ?');\n const row = stmt.get(executionId) as\n | {\n execution_id: string;\n workflow: string;\n input: string;\n step: number;\n status: string;\n metadata: string | null;\n }\n | undefined;\n if (!row) return null;\n return {\n workflow: row.workflow,\n input: safeJsonParse(row.input),\n step: row.step,\n status: row.status as 'waiting' | 'running',\n metadata: row.metadata\n ? (safeJsonParse(row.metadata) as Record<string, unknown> | undefined)\n : undefined,\n };\n }\n\n async listPendingExecutions(): Promise<string[]> {\n const stmt = this.db.prepare(\n \"SELECT execution_id FROM execution_state WHERE status = 'waiting'\",\n );\n const rows = stmt.all() as Array<{ execution_id: string }>;\n return rows.map((r) => r.execution_id);\n }\n\n // ── Execution History ────────────────────────────────────────────────────\n\n async saveExecution(execution: ExecutionInfo): Promise<void> {\n this.db\n .prepare(\n 'INSERT OR REPLACE INTO execution_history (execution_id, workflow, status, total_cost, started_at, completed_at, duration, error, events) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)',\n )\n .run(\n execution.executionId,\n execution.workflow,\n execution.status,\n execution.totalCost,\n execution.startedAt,\n execution.completedAt ?? null,\n execution.duration,\n execution.error ?? null,\n JSON.stringify(execution.events),\n );\n }\n\n async getExecution(executionId: string): Promise<ExecutionInfo | null> {\n const row = this.db\n .prepare('SELECT * FROM execution_history WHERE execution_id = ?')\n .get(executionId) as ExecutionHistoryRow | undefined;\n return row ? rowToExecutionInfo(row) : null;\n }\n\n async listExecutions(limit?: number): Promise<ExecutionInfo[]> {\n const sql = limit\n ? 'SELECT * FROM execution_history ORDER BY started_at DESC LIMIT ?'\n : 'SELECT * FROM execution_history ORDER BY started_at DESC';\n const rows = (\n limit ? this.db.prepare(sql).all(limit) : this.db.prepare(sql).all()\n ) as ExecutionHistoryRow[];\n return rows.map(rowToExecutionInfo);\n }\n\n // ── Eval History ────────────────────────────────────────────────────────\n\n async saveEvalResult(entry: EvalHistoryEntry): Promise<void> {\n this.db\n .prepare(\n 'INSERT OR REPLACE INTO eval_history (id, eval_name, timestamp, data) VALUES (?, ?, ?, ?)',\n )\n .run(entry.id, entry.eval, entry.timestamp, JSON.stringify(entry.data));\n }\n\n async listEvalResults(limit?: number): Promise<EvalHistoryEntry[]> {\n const sql = limit\n ? 'SELECT * FROM eval_history ORDER BY timestamp DESC LIMIT ?'\n : 'SELECT * FROM eval_history ORDER BY timestamp DESC';\n const rows = (limit ? this.db.prepare(sql).all(limit) : this.db.prepare(sql).all()) as Array<{\n id: string;\n eval_name: string;\n timestamp: number;\n data: string;\n }>;\n return rows.map((r) => ({\n id: r.id,\n eval: r.eval_name,\n timestamp: r.timestamp,\n data: safeJsonParse(r.data),\n }));\n }\n\n async deleteEvalResult(id: string): Promise<boolean> {\n const result = this.db.prepare('DELETE FROM eval_history WHERE id = ?').run(id);\n return result.changes > 0;\n }\n\n // ── Sessions (Studio introspection) ────────────────────────────────────\n\n async listSessions(): Promise<string[]> {\n const rows = this.db.prepare('SELECT session_id FROM sessions').all() as Array<{\n session_id: string;\n }>;\n return rows.map((r) => r.session_id);\n }\n\n // ── Memory ────────────────────────────────────────────────────────────\n\n async saveMemory(scope: string, key: string, value: unknown): Promise<void> {\n this.db\n .prepare(\n \"INSERT OR REPLACE INTO memory (scope, key, value, updated_at) VALUES (?, ?, ?, datetime('now'))\",\n )\n .run(scope, key, JSON.stringify(value));\n }\n\n async getMemory(scope: string, key: string): Promise<unknown | null> {\n const row = this.db\n .prepare('SELECT value FROM memory WHERE scope = ? AND key = ?')\n .get(scope, key) as { value: string } | undefined;\n return row ? safeJsonParse(row.value) : null;\n }\n\n async getAllMemory(scope: string): Promise<Array<{ key: string; value: unknown }>> {\n const rows = this.db\n .prepare('SELECT key, value FROM memory WHERE scope = ?')\n .all(scope) as Array<{ key: string; value: string }>;\n return rows.map((r) => ({ key: r.key, value: safeJsonParse(r.value) }));\n }\n\n async deleteMemory(scope: string, key: string): Promise<void> {\n this.db.prepare('DELETE FROM memory WHERE scope = ? AND key = ?').run(scope, key);\n }\n\n /** Close the database connection. */\n async close(): Promise<void> {\n this.db.close();\n }\n\n async deleteCheckpoints(executionId: string): Promise<void> {\n const stmt = this.db.prepare('DELETE FROM checkpoints WHERE execution_id = ?');\n stmt.run(executionId);\n }\n}\n","import type { ChatMessage, HandoffRecord } from './types.js';\nimport type { StateStore } from './state/types.js';\nimport type { AxlRuntime } from './runtime.js';\nimport type { AxlStream } from './stream.js';\n\n/** Options for configuring a session. */\nexport type SessionOptions = {\n /** History management options. */\n history?: {\n /** Maximum number of messages to keep in history. Older messages are trimmed (or summarized if summarize is true). */\n maxMessages?: number;\n /** When true and maxMessages is exceeded, summarize old messages instead of dropping them. Requires summaryModel to be set. Default: false. */\n summarize?: boolean;\n /** Model URI to use for summarization (e.g., 'openai:gpt-4o-mini'). Required when summarize is true. */\n summaryModel?: string;\n };\n /** Whether to persist session history to the state store. Default: true. */\n persist?: boolean;\n};\n\n/**\n * A stateful conversation session.\n * Persists message history across multiple interactions.\n */\nexport class Session {\n private closed = false;\n private options: SessionOptions;\n\n constructor(\n private sessionId: string,\n private runtime: AxlRuntime,\n private store: StateStore,\n options?: SessionOptions,\n ) {\n this.options = options ?? {};\n }\n\n get id(): string {\n return this.sessionId;\n }\n\n async send(workflowName: string, input: unknown): Promise<unknown> {\n if (this.closed) throw new Error('Session has been ended');\n\n const history = await this.store.getSession(this.sessionId);\n let cachedSummary = (await this.store.getSessionMeta(this.sessionId, 'summaryCache')) as\n | string\n | null;\n\n // Apply maxMessages limit\n const maxMessages = this.options.history?.maxMessages;\n if (maxMessages && history.length > maxMessages) {\n if (this.options.history?.summarize) {\n const summaryModel = this.options.history?.summaryModel;\n if (!summaryModel) {\n throw new Error('SessionOptions.history.summaryModel is required when summarize is true');\n }\n const messagesToDrop = history.slice(0, history.length - maxMessages);\n // Include existing summary as context for the new summarization\n const toSummarize: ChatMessage[] = cachedSummary\n ? [\n { role: 'system', content: `Previous conversation summary: ${cachedSummary}` },\n ...messagesToDrop,\n ]\n : messagesToDrop;\n const summary = await this.runtime.summarizeMessages(toSummarize, summaryModel);\n await this.store.saveSessionMeta(this.sessionId, 'summaryCache', summary);\n // Update local reference so the workflow receives the fresh summary\n cachedSummary = summary;\n }\n const trimmed = history.slice(-maxMessages);\n history.length = 0;\n history.push(...trimmed);\n }\n\n const userMessage: ChatMessage = {\n role: 'user',\n content: typeof input === 'string' ? input : JSON.stringify(input),\n };\n history.push(userMessage);\n\n const result = await this.runtime.execute(workflowName, input, {\n metadata: {\n sessionId: this.sessionId,\n sessionHistory: history,\n ...(cachedSummary ? { summaryCache: cachedSummary } : {}),\n },\n });\n\n // executeAgentCall may have already pushed the assistant message (with\n // providerMetadata for Gemini thought signatures etc.). Only add one if needed.\n const lastMsg = history[history.length - 1];\n if (!(lastMsg && lastMsg.role === 'assistant')) {\n history.push({\n role: 'assistant',\n content: typeof result === 'string' ? result : JSON.stringify(result),\n });\n }\n\n if (this.options.persist !== false) {\n await this.store.saveSession(this.sessionId, history);\n }\n return result;\n }\n\n async stream(workflowName: string, input: unknown): Promise<AxlStream> {\n if (this.closed) throw new Error('Session has been ended');\n\n const history = await this.store.getSession(this.sessionId);\n let cachedSummary = (await this.store.getSessionMeta(this.sessionId, 'summaryCache')) as\n | string\n | null;\n\n // Apply maxMessages limit\n const maxMessages = this.options.history?.maxMessages;\n if (maxMessages && history.length > maxMessages) {\n if (this.options.history?.summarize) {\n const summaryModel = this.options.history?.summaryModel;\n if (!summaryModel) {\n throw new Error('SessionOptions.history.summaryModel is required when summarize is true');\n }\n const messagesToDrop = history.slice(0, history.length - maxMessages);\n // Include existing summary as context for the new summarization\n const toSummarize: ChatMessage[] = cachedSummary\n ? [\n { role: 'system', content: `Previous conversation summary: ${cachedSummary}` },\n ...messagesToDrop,\n ]\n : messagesToDrop;\n const summary = await this.runtime.summarizeMessages(toSummarize, summaryModel);\n await this.store.saveSessionMeta(this.sessionId, 'summaryCache', summary);\n // Update local reference so the workflow receives the fresh summary\n cachedSummary = summary;\n }\n const trimmed = history.slice(-maxMessages);\n history.length = 0;\n history.push(...trimmed);\n }\n\n const userMessage: ChatMessage = {\n role: 'user',\n content: typeof input === 'string' ? input : JSON.stringify(input),\n };\n history.push(userMessage);\n\n const axlStream = this.runtime.stream(workflowName, input, {\n metadata: {\n sessionId: this.sessionId,\n sessionHistory: history,\n ...(cachedSummary ? { summaryCache: cachedSummary } : {}),\n },\n });\n\n const updateHistory = async (result: unknown): Promise<void> => {\n // executeAgentCall may have already pushed the assistant message (with\n // providerMetadata for Gemini thought signatures etc.). Only add one if needed.\n const lastMsg = history[history.length - 1];\n if (!(lastMsg && lastMsg.role === 'assistant')) {\n history.push({\n role: 'assistant',\n content: typeof result === 'string' ? result : JSON.stringify(result),\n });\n }\n if (this.options.persist !== false) {\n await this.store.saveSession(this.sessionId, history);\n }\n };\n\n axlStream.on('done', (event: unknown) => {\n // The unified event model wraps the result in `data: { result }` on\n // `done` events (spec §2.1) — extract and pass the inner result to\n // the legacy updateHistory path.\n const data = (event as { data: { result: unknown } }).data;\n updateHistory(data.result).catch((err) => {\n this.runtime.emit('error', {\n type: 'session_history_save_failed',\n sessionId: this.sessionId,\n error: err instanceof Error ? err.message : String(err),\n });\n });\n });\n\n return axlStream;\n }\n\n async history(): Promise<ChatMessage[]> {\n return this.store.getSession(this.sessionId);\n }\n\n /** Get the handoff history for this session. */\n async handoffs(): Promise<HandoffRecord[]> {\n return (\n ((await this.store.getSessionMeta(this.sessionId, 'handoffHistory')) as HandoffRecord[]) ?? []\n );\n }\n\n async end(): Promise<void> {\n this.closed = true;\n if (this.options.persist !== false) {\n await this.store.deleteSession(this.sessionId);\n }\n }\n\n async fork(newId: string): Promise<Session> {\n const history = await this.store.getSession(this.sessionId);\n const forked = new Session(newId, this.runtime, this.store, this.options);\n await this.store.saveSession(newId, [...history]);\n\n // Copy session metadata (e.g. summaryCache, handoffHistory) to the forked session\n const summaryCache = await this.store.getSessionMeta(this.sessionId, 'summaryCache');\n if (summaryCache !== null) {\n await this.store.saveSessionMeta(newId, 'summaryCache', summaryCache);\n }\n\n const handoffHistory = await this.store.getSessionMeta(this.sessionId, 'handoffHistory');\n if (handoffHistory !== null) {\n await this.store.saveSessionMeta(newId, 'handoffHistory', handoffHistory);\n }\n\n return forked;\n }\n}\n","import { Readable } from 'node:stream';\nimport { EventEmitter } from 'node:events';\nimport { AXL_EVENT_TYPES, type AxlEvent, type AxlEventType } from './types.js';\nimport { isRootLevel } from './event-utils.js';\n\n/**\n * A streamable workflow execution.\n *\n * Extends Node's Readable and implements `AsyncIterable<AxlEvent>`. Supports\n * `.on()` events, `for-await-of`, the `.text` iterator (root-only tokens),\n * the `.lifecycle` iterator (structural events only), and `.pipe()`.\n *\n * The wire carries `AxlEvent` directly — there is no per-stream synthesized\n * shape. Consumers narrow on `event.type` and use `AskScoped` fields\n * (`askId`, `parentAskId`, `depth`) for routing/filtering.\n */\nexport class AxlStream extends Readable {\n private bus = new EventEmitter();\n /**\n * Per-ask token buffers split into \"in-progress\" and \"committed\"\n * halves so `fullText` only includes tokens from attempts that\n * actually won. Scoping is per-`askId` so concurrent root-level asks\n * (`ctx.parallel`, `ctx.spawn`, `ctx.race`, `ctx.map`) don't\n * interleave each other's tokens — each branch's chunks stay\n * contiguous, and a `pipeline(failed)` on one branch only discards\n * THAT branch's in-progress buffer (previously: shared buffer caused\n * a failure on one branch to discard a peer's in-flight successful\n * tokens). Insertion order in the Maps reflects which ask emitted\n * its first token first, which is what `fullText` joins on.\n *\n * On `pipeline(status: 'committed')` for an ask, that ask's\n * in-progress entry flushes to its committed entry. On\n * `pipeline(status: 'failed')` or `ask_end({ok:false})` for an ask,\n * that ask's in-progress entry is discarded. Spec/16 §4.3.\n *\n * Tokens emitted outside any ask (synthesized test fixtures with no\n * `askId`) fall back to an empty-string sentinel key — preserves the\n * single-buffer behavior for that legacy case.\n */\n private attemptByAsk = new Map<string, string[]>();\n private committedByAsk = new Map<string, string>();\n private result: unknown = undefined;\n private finished = false;\n readonly promise: Promise<unknown>;\n private eventQueue: AxlEvent[] = [];\n private waiters: Array<(value: IteratorResult<AxlEvent>) => void> = [];\n\n constructor() {\n super({ objectMode: true, read() {} });\n\n let resolvePromise: (value: unknown) => void;\n let rejectPromise: (error: Error) => void;\n this.promise = new Promise((resolve, reject) => {\n resolvePromise = resolve;\n rejectPromise = reject;\n });\n\n this.bus.on('__resolve', (value: unknown) => resolvePromise!(value));\n this.bus.on('__reject', (error: Error) => rejectPromise!(error));\n // Prevent unhandled 'error' events from crashing the process\n this.bus.on('error', () => {});\n // Prevent unhandled promise rejection when _error() rejects the promise\n // and no consumer has called stream.promise.catch(). Errors are delivered\n // through the promise rejection and the EventEmitter 'error' event.\n this.promise.catch(() => {});\n }\n\n /** Wire-format event names callers can subscribe to via `.on(name, fn)`.\n * Derived from the canonical `AXL_EVENT_TYPES` tuple — adding a new\n * variant in `types.ts` automatically extends the subscribable set. */\n private static readonly STREAM_EVENTS = new Set<AxlEventType>(AXL_EVENT_TYPES);\n\n on(event: string, handler: (...args: unknown[]) => void): this {\n if (AxlStream.STREAM_EVENTS.has(event as AxlEventType)) {\n this.bus.on(event, handler);\n } else {\n super.on(event, handler);\n }\n return this;\n }\n\n off(event: string, handler: (...args: unknown[]) => void): this {\n if (AxlStream.STREAM_EVENTS.has(event as AxlEventType)) {\n this.bus.off(event, handler);\n } else {\n super.off(event, handler);\n }\n return this;\n }\n\n [Symbol.asyncIterator]() {\n const self = this;\n return {\n next: (): Promise<IteratorResult<AxlEvent>> => {\n if (self.eventQueue.length > 0) {\n return Promise.resolve({ value: self.eventQueue.shift()!, done: false });\n }\n if (self.finished && self.eventQueue.length === 0) {\n return Promise.resolve({ value: undefined as unknown as AxlEvent, done: true });\n }\n return new Promise((resolve) => {\n self.waiters.push(resolve);\n });\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n [Symbol.asyncDispose]() {\n self.destroy();\n return Promise.resolve();\n },\n };\n }\n\n get text(): AsyncIterable<string> {\n const self = this;\n return {\n [Symbol.asyncIterator](): AsyncIterator<string> {\n const iter = self[Symbol.asyncIterator]();\n return {\n async next(): Promise<IteratorResult<string>> {\n while (true) {\n const { value, done } = await iter.next();\n if (done) return { value: undefined as unknown as string, done: true };\n // Root-only token text by default — consumers wanting nested\n // tokens too should iterate the whole stream and filter on\n // `event.depth >= 1` themselves.\n if (value.type === 'token' && isRootLevel(value)) {\n return { value: value.data, done: false };\n }\n }\n },\n };\n },\n };\n }\n\n /**\n * Iterator over `{ askId, text }` pairs — one emission per token chunk,\n * tagged with the ask frame that produced it. Complements `.text`\n * (root-only stream): consumers building a split-pane UI that shows\n * each sub-agent's output in its own lane can group by `askId`\n * without iterating the raw stream and hand-filtering on `event.type`.\n *\n * Nested and root tokens both flow through. The `agent` field names\n * the producing agent for UI labelling; it's undefined when the token\n * was emitted outside any ask (rare — synthesized test fixtures).\n */\n get textByAsk(): AsyncIterable<{ askId: string; agent?: string; text: string }> {\n const self = this;\n return {\n [Symbol.asyncIterator](): AsyncIterator<{ askId: string; agent?: string; text: string }> {\n const iter = self[Symbol.asyncIterator]();\n return {\n async next(): Promise<IteratorResult<{ askId: string; agent?: string; text: string }>> {\n while (true) {\n const { value, done } = await iter.next();\n if (done) {\n return {\n value: undefined as unknown as { askId: string; agent?: string; text: string },\n done: true,\n };\n }\n if (value.type === 'token') {\n return {\n value: { askId: value.askId, agent: value.agent, text: value.data },\n done: false,\n };\n }\n }\n },\n };\n },\n };\n }\n\n /**\n * Iterator over structural lifecycle events only — skips per-token chatter\n * and progressive partial_object emissions. Useful for waterfall UIs and\n * any consumer that wants the \"what happened\" timeline without per-chunk\n * noise. Renamed from `.steps` in the unified-event-model migration\n * because these are events, not pipeline steps.\n */\n get lifecycle(): AsyncIterable<AxlEvent> {\n const lifecycleTypes = new Set<AxlEventType>([\n 'ask_start',\n 'ask_end',\n 'agent_call_start',\n 'agent_call_end',\n 'tool_call_start',\n 'tool_call_end',\n 'tool_approval',\n 'tool_denied',\n 'handoff_start',\n 'handoff_return',\n 'delegate',\n 'pipeline',\n 'verify',\n 'workflow_start',\n 'workflow_end',\n // Durable-execution checkpoints — structural points in the timeline.\n 'checkpoint_save',\n 'checkpoint_replay',\n // Human-in-the-loop — pause/resume are major timeline landmarks.\n 'await_human',\n 'await_human_resolved',\n ]);\n const self = this;\n return {\n [Symbol.asyncIterator](): AsyncIterator<AxlEvent> {\n const iter = self[Symbol.asyncIterator]();\n return {\n async next(): Promise<IteratorResult<AxlEvent>> {\n while (true) {\n const { value, done } = await iter.next();\n if (done) return { value: undefined as unknown as AxlEvent, done: true };\n if (lifecycleTypes.has(value.type)) return { value, done: false };\n }\n },\n };\n },\n };\n }\n\n pipe<T extends NodeJS.WritableStream>(destination: T, options?: { end?: boolean }): T {\n const shouldEnd = options?.end !== false;\n this.bus.on('token', (event: AxlEvent) => {\n if (event.type === 'token') destination.write(event.data);\n });\n this.bus.on('done', () => {\n if (shouldEnd) destination.end();\n });\n this.bus.on('error', () => {\n if (shouldEnd) destination.end();\n });\n return destination;\n }\n\n /** Push an event onto the stream. Called by the runtime. */\n _push(event: AxlEvent): void {\n if (this.finished) return;\n // Token accumulation for `fullText`. Root-only by default to preserve the\n // canonical \"render this in a chat bubble\" use case; nested-ask tokens\n // still flow through the iterator so consumers that want them can filter.\n // Scoped by askId so concurrent root asks don't interleave.\n if (event.type === 'token' && isRootLevel(event)) {\n const key = event.askId ?? '';\n const attempt = this.attemptByAsk.get(key);\n if (attempt) {\n attempt.push(event.data);\n } else {\n this.attemptByAsk.set(key, [event.data]);\n }\n }\n // Pipeline lifecycle: commit on success, discard on failure. Spec §4.3.\n // Reading `fullText` between `committed` and `done` sees the correct\n // text — that's why we commit on `committed` (which fires before\n // `done`) rather than on `done`. Per-ask scoping ensures a failed\n // attempt on one branch doesn't discard a sibling branch's tokens.\n if (event.type === 'pipeline' && isRootLevel(event)) {\n const key = event.askId ?? '';\n if (event.status === 'committed') {\n const attempt = this.attemptByAsk.get(key);\n if (attempt && attempt.length > 0) {\n const prev = this.committedByAsk.get(key) ?? '';\n this.committedByAsk.set(key, prev + attempt.join(''));\n this.attemptByAsk.set(key, []);\n }\n } else if (event.status === 'failed') {\n this.attemptByAsk.set(key, []);\n }\n }\n // Terminal-throw safety net: `ctx.ask()` exit paths that throw\n // (max-turns, guardrail exhaustion, verify-throw, validate-throw) do\n // NOT emit `pipeline(failed)` — they emit `ask_end({ok:false})` and\n // propagate the error. Without this reset, the failed ask's\n // in-progress tokens would stay buffered and flush into the NEXT\n // ask's `pipeline(committed)`, corrupting `fullText`. Reviewer bug\n // B2. Only applies to root asks; nested asks don't enter the\n // per-ask buffer (they're filtered out by `isRootLevel` on the\n // token-accumulation path above). Per-ask scoping means a failure\n // on one root branch only clears its own buffer.\n if (event.type === 'ask_end' && isRootLevel(event) && !event.outcome.ok) {\n this.attemptByAsk.set(event.askId ?? '', []);\n }\n this.bus.emit(event.type, event);\n this.push(event);\n const waiter = this.waiters.shift();\n if (waiter) {\n waiter({ value: event, done: false });\n } else {\n this.eventQueue.push(event);\n }\n }\n\n /**\n * Signal successful completion.\n *\n * `executionId` is required — the runtime must allocate it before\n * calling `stream()` so terminal events always carry a real id.\n * Previously the default-empty parameter surfaced blank executionIds\n * on error paths that threw before `execInfo` was assigned (review S4).\n */\n _done(result: unknown, executionId: string): void {\n if (this.finished) return;\n this.finished = true;\n this.result = result;\n // Synthesize a terminal `done` AxlEvent. The stream itself is the\n // emission source (no WorkflowContext frame to read), so `step` is set\n // to `Number.MAX_SAFE_INTEGER` as a sentinel meaning \"after all\n // numbered events\" — consumers ordering by step still see `done` last.\n const doneEvent: AxlEvent = {\n type: 'done',\n executionId,\n step: Number.MAX_SAFE_INTEGER,\n timestamp: Date.now(),\n data: { result },\n };\n this.bus.emit('done', doneEvent);\n this.push(doneEvent);\n this.push(null);\n const waiter = this.waiters.shift();\n if (waiter) {\n waiter({ value: doneEvent, done: false });\n } else {\n this.eventQueue.push(doneEvent);\n }\n for (const w of this.waiters) {\n w({ value: undefined as unknown as AxlEvent, done: true });\n }\n this.waiters.length = 0;\n this.bus.emit('__resolve', result);\n }\n\n /** Signal an error. `executionId` is required for the same reason as\n * `_done`: terminal events must carry a real id even when the\n * failure happens before any real trace event fires (review S4). */\n _error(error: Error, executionId: string): void {\n if (this.finished) return;\n this.finished = true;\n const errorEvent: AxlEvent = {\n type: 'error',\n executionId,\n step: Number.MAX_SAFE_INTEGER,\n timestamp: Date.now(),\n data: { message: error.message, name: error.name },\n };\n this.bus.emit('error', errorEvent);\n this.push(errorEvent);\n this.push(null);\n const waiter = this.waiters.shift();\n if (waiter) {\n waiter({ value: errorEvent, done: false });\n } else {\n this.eventQueue.push(errorEvent);\n }\n for (const w of this.waiters) {\n w({ value: undefined as unknown as AxlEvent, done: true });\n }\n this.waiters.length = 0;\n this.bus.emit('__reject', error);\n }\n\n /** Concatenated root-only text from committed attempts plus the\n * current in-flight attempt(s). Retried (gate-rejected) attempts\n * are excluded — see spec/16 §4.3. Reading mid-attempt returns the\n * in-progress text; reading after `pipeline(committed)` (which\n * fires before `done`) returns the canonical winning text.\n *\n * With concurrent root-level asks (`ctx.parallel`, `ctx.spawn`,\n * `ctx.race`, `ctx.map`), each branch's tokens are scoped per-`askId`\n * and emitted contiguously in the order each ask first started\n * emitting tokens. A `pipeline(failed)` or `ask_end({ok:false})` on\n * one branch only discards THAT branch's in-progress buffer —\n * sibling branches are unaffected. For UIs that want each sub-agent\n * in its own lane, prefer `textByAsk`. */\n get fullText(): string {\n let out = '';\n // Iterate in insertion order. Map preserves it so `fullText` is\n // deterministic given the same emission order.\n for (const [key, committed] of this.committedByAsk) {\n out += committed;\n const attempt = this.attemptByAsk.get(key);\n if (attempt && attempt.length > 0) out += attempt.join('');\n }\n // Asks that have emitted tokens but never committed (still in-flight,\n // or failed) — append their in-progress buffers in insertion order\n // after all committed text.\n for (const [key, attempt] of this.attemptByAsk) {\n if (this.committedByAsk.has(key)) continue;\n if (attempt.length > 0) out += attempt.join('');\n }\n return out;\n }\n}\n","import type { z } from 'zod';\nimport type { Effort, ToolChoice } from './providers/types.js';\n\n/** Result type for concurrent operations (spawn, map) */\nexport type Result<T> = { ok: true; value: T } | { ok: false; error: string };\n\n/** Budget execution result */\nexport type BudgetResult<T> = {\n value: T | null;\n budgetExceeded: boolean;\n totalCost: number;\n};\n\n/** Human decision from awaitHuman */\nexport type HumanDecision =\n | { approved: true; data?: string }\n | { approved: false; reason?: string };\n\n/** Budget options */\nexport type BudgetOptions = {\n cost: string;\n onExceed?: 'finish_and_stop' | 'hard_stop' | 'warn';\n};\n\n/** Map options */\nexport type MapOptions = {\n concurrency?: number;\n quorum?: number;\n};\n\n/** Spawn options */\nexport type SpawnOptions = {\n quorum?: number;\n};\n\n/** Vote strategies */\nexport type VoteStrategy =\n | 'majority'\n | 'unanimous'\n | 'highest'\n | 'lowest'\n | 'mean'\n | 'median'\n | 'custom';\n\n/** Vote options */\nexport type VoteOptions<T> = {\n strategy: VoteStrategy;\n key?: string;\n scorer?: (value: T) => number | Promise<number>;\n reducer?: (values: T[]) => T | Promise<T>;\n};\n\n/** Context passed to the verify function on retry (undefined on first call). */\nexport type VerifyRetry<T> = {\n /** Error message from the failed attempt (schema or validate). */\n error: string;\n /** Raw return value from the previous fn call. When fn() throws a ValidationError\n * or VerifyError, falls back to err.lastOutput so the retry has data to repair. */\n output: unknown;\n /** Schema-parsed object — only present when schema passed but validate failed.\n * Also populated from ValidationError.lastOutput when fn() throws (e.g., inner\n * ctx.ask() exhausted its validate retries). Safe to modify and return. */\n parsed?: T;\n};\n\n/** Verify options */\nexport type VerifyOptions<T> = {\n retries?: number;\n fallback?: T;\n /** Post-schema business rule validation on the parsed object. */\n validate?: OutputValidator<T>;\n};\n\n/** AwaitHuman options */\nexport type AwaitHumanOptions = {\n channel: string;\n prompt: string;\n metadata?: Record<string, unknown>;\n};\n\n/** Ask options */\nexport type AskOptions<T = unknown> = {\n schema?: z.ZodType<T>;\n retries?: number;\n /** Post-schema business rule validation. Receives the parsed typed object after schema\n * validation succeeds. Only runs when `schema` is set. Retries with accumulating context\n * on failure (LLM sees all previous failed attempts). Throws `ValidationError` on exhaustion. */\n validate?: OutputValidator<T>;\n /** Maximum retries for validate failures (default: 2). */\n validateRetries?: number;\n /** Per-call metadata passed to dynamic model/system selector functions. */\n metadata?: Record<string, unknown>;\n /** Override temperature for this call. */\n temperature?: number;\n /** Override max tokens for this call (default: 4096). */\n maxTokens?: number;\n /** How hard should the model try? Primary param for cost/quality tradeoff. */\n effort?: Effort;\n /** Precise thinking token budget (advanced). Overrides effort-based thinking allocation. */\n thinkingBudget?: number;\n /** Show reasoning summaries in responses. */\n includeThoughts?: boolean;\n /** Tool choice strategy for this call. */\n toolChoice?: ToolChoice;\n /** Stop sequences for this call. */\n stop?: string[];\n /** Provider-specific options merged into API requests. Not portable across providers. */\n providerOptions?: Record<string, unknown>;\n};\n\n/** Delegate options */\nexport type DelegateOptions<T = unknown> = {\n /** Zod schema for structured output from the selected agent. */\n schema?: z.ZodType<T>;\n /** Model URI for the internal router agent (default: first candidate's model). */\n routerModel?: string;\n /** Additional metadata passed to the router and selected agent. */\n metadata?: Record<string, unknown>;\n /** Number of retries for structured output validation (passed to the final ask). */\n retries?: number;\n /** Post-schema business rule validation. Passed through to the final `ctx.ask()` call. */\n validate?: OutputValidator<T>;\n /** Maximum retries for validate failures (default: 2). Passed through to the final `ctx.ask()` call. */\n validateRetries?: number;\n};\n\n/** Race options */\nexport type RaceOptions<T = unknown> = {\n /** Schema to validate each result. Invalid results are discarded and the race continues. */\n schema?: z.ZodType<T>;\n /** Post-schema business rule validation. Results that fail are discarded (same as schema failures). */\n validate?: OutputValidator<T>;\n};\n\n/** Execution status */\nexport type ExecutionStatus = 'running' | 'completed' | 'failed' | 'waiting';\n\n/**\n * Canonical list of `AxlEvent.type` discriminators. Single source of truth —\n * derive `AxlEventType` from this tuple and use it to validate stream filters,\n * redaction tables, and exhaustiveness assertions.\n */\nexport const AXL_EVENT_TYPES = [\n // Workflow lifecycle\n 'workflow_start',\n 'workflow_end',\n // Ask boundary\n 'ask_start',\n 'ask_end',\n // Agent turn lifecycle\n 'agent_call_start',\n 'agent_call_end',\n // Content delivery (stream-only)\n 'token',\n // Tool invocation lifecycle\n 'tool_call_start',\n 'tool_call_end',\n // Single-point tool events\n 'tool_approval',\n 'tool_denied',\n // Delegation\n 'delegate',\n // Handoff (spans two asks; not AskScoped).\n // `handoff_start` emits before the target ask begins; always fired.\n // `handoff_return` emits when control returns to source; roundtrip only\n // (oneway handoffs have no return trip — the target's `ask_end` IS the\n // end of the chain).\n 'handoff_start',\n 'handoff_return',\n // Pipeline (retry/validation lifecycle) — added in PR 2; reserved here.\n 'pipeline',\n // Progressive structured output — added in PR 2; reserved here.\n 'partial_object',\n // Verification\n 'verify',\n // Observability\n 'log',\n 'memory_remember',\n 'memory_recall',\n 'memory_forget',\n // Durable execution checkpoints (`ctx.checkpoint`)\n 'checkpoint_save',\n 'checkpoint_replay',\n // Human-in-the-loop (`ctx.awaitHuman`)\n 'await_human',\n 'await_human_resolved',\n // Legacy gate events — emitted by current code; collapsed into `pipeline`\n // in PR 2 (spec/16-streaming-wire-reliability §4.2).\n 'guardrail',\n 'schema_check',\n 'validate',\n // Terminal workflow markers\n 'done',\n 'error',\n] as const;\n\n/** Discriminator union derived from `AXL_EVENT_TYPES`. */\nexport type AxlEventType = (typeof AXL_EVENT_TYPES)[number];\n\n/** Resolved model parameters sent to the provider for an LLM call. */\nexport type AgentCallParams = {\n temperature?: number;\n maxTokens?: number;\n effort?: Effort;\n thinkingBudget?: number;\n includeThoughts?: boolean;\n toolChoice?: ToolChoice;\n stop?: string[];\n};\n\n/**\n * Data shape for `agent_call_start` events — the **request** side of the call.\n * Everything here is known at the moment the call is dispatched, before the\n * provider responds. Consumers can render \"what's being asked\" without waiting\n * for completion.\n */\nexport type AgentCallStartData = {\n /** Original user prompt passed to `ctx.ask()`. Does not include retry feedback or tool results. */\n prompt: string;\n /** Resolved system prompt (after evaluating dynamic system selectors). */\n system?: string;\n /** Resolved model parameters sent to the provider for this call. */\n params?: AgentCallParams;\n /** 1-indexed iteration of the tool-calling loop for this `ctx.ask()` call. */\n turn: number;\n /** When set, this call is a retry triggered by a failed gate check on the previous turn. */\n retryReason?: 'schema' | 'validate' | 'guardrail';\n /** Names of tools exposed to the model on this call. Empty/omitted when no tools are bound. */\n toolNames?: string[];\n /** Full ChatMessage[] sent to the provider this turn. Only populated when `trace.level === 'full'`. */\n messages?: ChatMessage[];\n};\n\n/**\n * Data shape for `agent_call_end` events — the **response** side of the call.\n * Populated when the provider returns (success or recoverable failure). The\n * companion request-side payload lives on the matching `agent_call_start`.\n *\n * Pair invariant: every `agent_call_start` is followed by exactly one\n * `agent_call_end`, even on provider error. On the error path `response` is\n * empty and `error` carries the provider's message; cost/tokens/duration are\n * still emitted (top-level on the event) when partial usage is available.\n */\nexport type AgentCallEndData = {\n /** Final LLM response content for this turn. Empty string on error. */\n response: string;\n /** Reasoning/thinking content returned by the provider, when available. */\n thinking?: string;\n /** 1-indexed iteration of the tool-calling loop. Mirrors the matching `agent_call_start.data.turn`. */\n turn: number;\n /** Mirrors `agent_call_start.data.retryReason` so cost-attribution consumers\n * reading `agent_call_end` (cost lives here) can bucket without joining. */\n retryReason?: 'schema' | 'validate' | 'guardrail';\n /** Provider error message when the call threw (network failure, 4xx/5xx,\n * abort, etc). Mutually exclusive with `response` content. Subject to\n * `config.trace.redact` (vendor errors can echo prompt text). */\n error?: string;\n};\n\n/** Data shape for `tool_call_end` events. */\nexport type ToolCallData = {\n args: unknown;\n result: unknown;\n callId?: string;\n};\n\n/** Data shape for `tool_call_start` events. */\nexport type ToolCallStartData = {\n args: unknown;\n};\n\n/** Data shape for `tool_approval` events. Emitted by the approval gate on both outcomes. */\nexport type ToolApprovalData = {\n approved: boolean;\n args: unknown;\n reason?: string;\n};\n\n/** Data shape for `tool_denied` events. Emitted when the LLM names a tool the agent doesn't expose. */\nexport type ToolDeniedData = {\n args?: unknown;\n reason?: string;\n callId?: string;\n};\n\n/** Data shape for `handoff_start` events (always emitted, pre-transition). */\nexport type HandoffStartData = {\n source: string;\n target: string;\n mode: 'oneway' | 'roundtrip';\n /** The `message` arg the source agent passed when invoking `handoff_to_X`\n * (roundtrip mode only). Subject to `config.trace.redact`. */\n message?: string;\n};\n\n/** Data shape for `handoff_return` events (roundtrip-only, post-return).\n * The returned value itself is observable via the target ask's\n * `ask_end.outcome`; this event marks the control transfer back to the\n * source agent and carries the round-trip duration. */\nexport type HandoffReturnData = {\n source: string;\n target: string;\n /** Wall-clock ms from `handoff_start` emission to control returning. */\n duration: number;\n};\n\n/** Data shape for `delegate` events. */\nexport type DelegateData = {\n candidates: string[];\n /** Set when the decision is known at emission time (single-agent short-circuit). */\n selected?: string;\n /** Router model used for multi-agent routing. */\n routerModel?: string;\n /** Why this delegate was emitted: 'routed' (multi-agent) or 'single_candidate'. */\n reason: 'routed' | 'single_candidate';\n};\n\n/** Data shape for `verify` events. */\nexport type VerifyData = {\n attempts: number;\n passed: boolean;\n lastError?: string;\n};\n\n/** Data shape for legacy `guardrail` events. Replaced by `pipeline` in PR 2. */\nexport type GuardrailData = {\n guardrailType: 'input' | 'output';\n blocked: boolean;\n reason?: string;\n attempt?: number;\n maxAttempts?: number;\n feedbackMessage?: string;\n};\n\n/** Data shape for legacy `schema_check` events. Replaced by `pipeline` in PR 2. */\nexport type SchemaCheckData = {\n valid: boolean;\n reason?: string;\n attempt: number;\n maxAttempts: number;\n feedbackMessage?: string;\n};\n\n/** Data shape for legacy `validate` events. Replaced by `pipeline` in PR 2. */\nexport type ValidateData = {\n valid: boolean;\n reason?: string;\n attempt: number;\n maxAttempts: number;\n feedbackMessage?: string;\n};\n\n/** Data shape for `workflow_start` events. Emitted once per workflow execution. */\nexport type WorkflowStartData = {\n /** The validated input passed to the workflow handler. */\n input: unknown;\n};\n\n/** Data shape for `workflow_end` events. Emitted once per workflow execution\n * on completion, failure, or cancellation. Distinguish cancellation via `aborted`. */\nexport type WorkflowEndData = {\n status: 'completed' | 'failed';\n duration: number;\n /** Workflow return value. Present on `status: 'completed'`. */\n result?: unknown;\n /** Error message. Present on `status: 'failed'`. */\n error?: string;\n /** True when the failure was an `AbortError` (user cancellation, budget hard_stop,\n * or consumer disconnect on streaming workflows). */\n aborted?: boolean;\n};\n\n/** Data shape for `checkpoint_save` / `checkpoint_replay` events.\n * Emitted by `ctx.checkpoint(name, fn)` — `save` on first execution,\n * `replay` when a saved value short-circuits the function call. */\nexport type CheckpointEventData = {\n /** Stable, caller-supplied identifier under which the checkpoint is\n * stored. Internal auto-checkpoints from ask/spawn/race/parallel/map\n * use names prefixed with `__auto/<primitive>/`. */\n name: string;\n};\n\n/** Data shape for `await_human` events — emitted when execution suspends\n * for a human decision via `ctx.awaitHuman()`. The pending side of the\n * pair; `await_human_resolved` follows when the decision arrives. */\nexport type AwaitHumanData = {\n /** Optional human-facing prompt describing the decision needed. */\n prompt?: string;\n /** Channel routing the decision (e.g., 'slack', 'email', custom). */\n channel?: string;\n};\n\n/** Data shape for `await_human_resolved` events — paired terminal of an\n * `await_human` request. Carries the `HumanDecision` returned to the workflow. */\nexport type AwaitHumanResolvedData = {\n channel?: string;\n decision: HumanDecision;\n};\n\n/** Data shape for `memory_remember` / `memory_recall` / `memory_forget` events. */\nexport type MemoryEventData = {\n scope: string;\n key?: string;\n /** Result count for `recall` (number of vectors returned). */\n count?: number;\n /** Embedder cost for semantic recall/remember. Mirrored at the top-level\n * `cost` on the event so cost rails (`trackExecution`) pick it up. */\n cost?: number;\n /** Embedder usage detail (tokens / model). */\n usage?: { tokens?: number; cost?: number; model?: string };\n /** True when this memory op called the semantic recall path (vs. key-only). */\n embed?: boolean;\n /** True when a key-only recall returned a value / semantic call path. */\n semantic?: boolean;\n /** True when a key-only recall returned a value. */\n hit?: boolean;\n /** Result count for `recall` (alias for `count` retained for back-compat). */\n resultCount?: number;\n /** Error message when the operation failed on the partial-failure path. */\n error?: string;\n};\n\n/** Common fields carried by every `AxlEvent` regardless of `type`. */\nexport type AxlEventBase = {\n executionId: string;\n /** Monotonic per-execution step counter, shared across nested asks via ALS. */\n step: number;\n /** Wall-clock ms. */\n timestamp: number;\n /** Workflow this event belongs to. Auto-stamped by `emitEvent` from\n * `this.workflowName` when defined; callers may override. */\n workflow?: string;\n /** Optional emitting-agent name. Variants that always have an agent\n * (e.g., `agent_call_start/end`) redeclare it as required so consumers\n * narrowing on those variants get a non-optional `agent`. Single-point\n * events that may or may not have an agent (`handoff`, gate events,\n * `log`) keep the optional. */\n agent?: string;\n /** Optional model URI — set on agent-related events; ignored on others. */\n model?: string;\n /** Optional prompt version stamped from `agent._config.version`. */\n promptVersion?: string;\n /**\n * Cost (USD) contributed by this event.\n *\n * Two DIFFERENT semantics ship on this field and consumers must know\n * which they're reading:\n *\n * - **Leaf cost** (`agent_call_end`, `tool_call_end`, `memory_remember`,\n * `memory_recall`): the authoritative charge for this single\n * provider call / tool invocation / embedder call. Summing these\n * across an execution gives the true spend.\n *\n * - **Per-ask rollup** (`ask_end`): the SUM of leaf costs emitted\n * within this ask's frame, EXCLUDING nested asks (which roll up\n * into their own `ask_end`). Spec/16 decision 10.\n *\n * **If you write your own accumulator, DO NOT do `total += event.cost`\n * across all event types — you'll double-count every ask** because the\n * leaves AND the rollup both carry `cost`. Use the exported\n * `eventCostContribution(event)` helper from `@axlsdk/axl` instead:\n * it encapsulates the \"skip ask_end, finite-check, leaf-only\" rule in\n * one place so your accumulator stays in lockstep with the built-in\n * `runtime.trackExecution`, `ExecutionInfo.totalCost`, and Studio's\n * cost aggregator.\n *\n * Other variants may stamp `cost` optionally to flow into cost rails\n * (e.g., memory ops mirror `usage.cost` here). Review UX-8.\n */\n cost?: number;\n /** Token counts. Required-by-narrowing on `agent_call_end`; optional on\n * any event that wishes to mirror an aggregate. Scope is agent prompt /\n * completion / reasoning tokens ONLY — embedder tokens live in\n * `memory_*.data.usage.tokens` and are deliberately NOT summed into\n * this field (different pricing, different model, different category). */\n tokens?: { input?: number; output?: number; reasoning?: number };\n /** Duration in ms (set on `_end` variants and a few single-point events). */\n duration?: number;\n};\n\n/** Fields on every event that originates within a specific `ctx.ask()` call. */\nexport type AskScoped = {\n askId: string;\n /** Absent on root ask. */\n parentAskId?: string;\n /** 0 = root ask; +1 per nested ask. */\n depth: number;\n /** Emitting agent's name. Absent on `ask_start` (pre-resolution) and on\n * events that predate agent resolution. */\n agent?: string;\n};\n\n/**\n * Meta carried alongside callback invocations (`onToken`, `onAgentStart`,\n * `onToolCall`) so consumers can group/route by ask.\n *\n * Note: `agent` is **required** here (the callback is always invoked\n * inside an ALS frame that has the agent name already resolved). On the\n * event side (`AskScoped.agent`) the field is optional — events emitted\n * before agent resolution (e.g., `ask_start` is fired before the\n * dynamic agent selector runs) can land without it.\n */\nexport type CallbackMeta = {\n askId: string;\n parentAskId?: string;\n depth: number;\n agent: string;\n};\n\n/**\n * Unified event union. Replaces the old `TraceEvent` (rich, persisted) and\n * `StreamEvent` (lean, wire) by emitting a single rich event from one site\n * and consuming the same shape on both rails.\n *\n * - Streaming consumers iterate `AxlStream` (an `AsyncIterable<AxlEvent>`).\n * - Non-streaming consumers read `ExecutionInfo.events: AxlEvent[]`.\n *\n * Tree reconstruction: group ask-scoped events by `askId`, parent-link via\n * `parentAskId`, sort by `step`, render by `depth`. Tokens (high-volume) and\n * `partial_object` events are stream-only — never persisted to\n * `ExecutionInfo.events`.\n *\n * When adding a new variant, extend `AXL_EVENT_TYPES` AND the emitter in\n * `WorkflowContext.emitEvent()` together so the compiler catches drift; the\n * exhaustiveness fixture in `__tests__/axl-event-exhaustive.test-d.ts` will\n * also fail until the new case is handled.\n */\nexport type AxlEvent =\n // ── Execution lifecycle ─────────────────────────────────────────────────\n | (AxlEventBase & { type: 'workflow_start'; workflow: string; data: WorkflowStartData })\n | (AxlEventBase & { type: 'workflow_end'; workflow: string; data: WorkflowEndData })\n\n // ── Ask boundary (user-level ctx.ask() call) ────────────────────────────\n | (AxlEventBase & AskScoped & { type: 'ask_start'; prompt: string })\n | (AxlEventBase &\n AskScoped & {\n type: 'ask_end';\n /** Discriminated outcome — narrow on `outcome.ok`. Ask-internal throws\n * surface here, NOT via the workflow-level `error` event. */\n outcome: { ok: true; result: unknown } | { ok: false; error: string };\n /** Sum of `agent_call_end.cost` + `tool_call_end.cost` WITHIN THIS ASK,\n * excluding nested asks. Nested asks contribute to their own ask_end. */\n cost: number;\n duration: number;\n })\n\n // ── Agent turn lifecycle (one LLM call within an ask) ───────────────────\n | (AxlEventBase &\n AskScoped & {\n type: 'agent_call_start';\n agent: string;\n model: string;\n /** 1-indexed tool-calling loop iteration within the ask. */\n turn: number;\n /** Request-side payload — prompt, system, params, messages, retry context. */\n data: AgentCallStartData;\n })\n | (AxlEventBase &\n AskScoped & {\n type: 'agent_call_end';\n agent: string;\n model: string;\n /** Authoritative turn-level cost. */\n cost: number;\n duration: number;\n tokens?: { input?: number; output?: number; reasoning?: number };\n /** Response-side payload — response text, thinking. */\n data: AgentCallEndData;\n })\n\n // ── Content delivery (stream-only; never in ExecutionInfo.events) ───────\n | (AxlEventBase & AskScoped & { type: 'token'; data: string })\n\n // ── Tool invocation lifecycle ───────────────────────────────────────────\n | (AxlEventBase &\n AskScoped & {\n type: 'tool_call_start';\n tool: string;\n callId: string;\n data: ToolCallStartData;\n })\n | (AxlEventBase &\n AskScoped & {\n type: 'tool_call_end';\n tool: string;\n callId: string;\n duration: number;\n cost?: number;\n data: ToolCallData;\n })\n\n // ── Single-point tool events ────────────────────────────────────────────\n | (AxlEventBase &\n AskScoped & {\n type: 'tool_approval';\n tool: string;\n callId?: string;\n data: ToolApprovalData;\n })\n | (AxlEventBase &\n AskScoped & {\n type: 'tool_denied';\n tool: string;\n callId?: string;\n data?: ToolDeniedData;\n })\n\n // ── Delegation ──────────────────────────────────────────────────────────\n | (AxlEventBase & AskScoped & { type: 'delegate'; data: DelegateData })\n\n // ── Handoff (spans two asks — NOT AskScoped) ───────────────────────────\n //\n // Asymmetric by mode: oneway emits only `handoff_start` (no return trip);\n // roundtrip emits both `handoff_start` and `handoff_return`. This matches\n // the control flow — oneway terminates at the target, roundtrip returns\n // to source. `handoff_start` fires BEFORE the target ask begins, so it\n // orders correctly in step-sorted timelines (ahead of the target's\n // ask_start/agent_call_*/ask_end).\n | (AxlEventBase & {\n type: 'handoff_start';\n fromAskId: string;\n toAskId: string;\n sourceDepth: number;\n targetDepth: number;\n data: HandoffStartData;\n })\n | (AxlEventBase & {\n type: 'handoff_return';\n fromAskId: string;\n toAskId: string;\n sourceDepth: number;\n targetDepth: number;\n data: HandoffReturnData;\n })\n\n // ── Pipeline (retry/validation lifecycle; multi-state via `status`) ─────\n | (AxlEventBase &\n AskScoped & {\n type: 'pipeline';\n status: 'start';\n stage: 'initial' | 'schema' | 'validate' | 'guardrail';\n attempt: number;\n maxAttempts: number;\n })\n | (AxlEventBase &\n AskScoped & {\n type: 'pipeline';\n status: 'failed';\n stage: 'schema' | 'validate' | 'guardrail';\n attempt: number;\n maxAttempts: number;\n /** Feedback message about to be injected into the conversation. */\n reason: string;\n })\n | (AxlEventBase &\n AskScoped & {\n type: 'pipeline';\n status: 'committed';\n /** The stage of the most recent `pipeline(start)` — `'initial'` when\n * the ask committed on the first pass, otherwise the gate that last\n * retried before commit. Lets consumers tell \"committed cleanly\"\n * from \"committed after a schema/validate/guardrail retry\". */\n stage: 'initial' | 'schema' | 'validate' | 'guardrail';\n /** The final successful attempt. */\n attempt: number;\n maxAttempts: number;\n })\n\n // ── Progressive structured output ───────────────────────────────────────\n | (AxlEventBase &\n AskScoped & {\n type: 'partial_object';\n attempt: number;\n /** DeepPartial<T>; consumers cast at the render site. */\n data: { object: unknown };\n })\n\n // ── Verification ────────────────────────────────────────────────────────\n | (AxlEventBase & AskScoped & { type: 'verify'; data: VerifyData })\n\n // ── Legacy gate events (collapsed into `pipeline` in PR 2) ──────────────\n | (AxlEventBase & Partial<AskScoped> & { type: 'guardrail'; data?: GuardrailData })\n | (AxlEventBase & Partial<AskScoped> & { type: 'schema_check'; data?: SchemaCheckData })\n | (AxlEventBase & Partial<AskScoped> & { type: 'validate'; data?: ValidateData })\n\n // ── Observability ───────────────────────────────────────────────────────\n | (AxlEventBase & Partial<AskScoped> & { type: 'log'; data: unknown })\n | (AxlEventBase &\n Partial<AskScoped> & {\n type: 'memory_remember' | 'memory_recall' | 'memory_forget';\n data: MemoryEventData;\n })\n\n // ── Durable execution checkpoints (`ctx.checkpoint`) ────────────────────\n | (AxlEventBase &\n Partial<AskScoped> & {\n type: 'checkpoint_save' | 'checkpoint_replay';\n data: CheckpointEventData;\n })\n\n // ── Human-in-the-loop (`ctx.awaitHuman`) ────────────────────────────────\n | (AxlEventBase &\n Partial<AskScoped> & {\n type: 'await_human';\n data: AwaitHumanData;\n })\n | (AxlEventBase &\n Partial<AskScoped> & {\n type: 'await_human_resolved';\n data: AwaitHumanResolvedData;\n })\n\n // ── Terminal workflow markers (idiomatic names; see decision 9) ─────────\n | (AxlEventBase & { type: 'done'; data: { result: unknown } })\n | (AxlEventBase &\n Partial<AskScoped> & {\n type: 'error';\n data: { message: string; name?: string; code?: string };\n });\n\n/** Convenience: extract the union member matching a given `type` discriminator. */\nexport type AxlEventOf<T extends AxlEventType> = Extract<AxlEvent, { type: T }>;\n\n/** Result of a guardrail check. */\nexport type GuardrailResult = {\n block: boolean;\n reason?: string;\n};\n\n/** Input guardrail function. Runs before the LLM call. */\nexport type InputGuardrail = (\n prompt: string,\n ctx: { metadata: Record<string, unknown> },\n) => GuardrailResult | Promise<GuardrailResult>;\n\n/** Output guardrail function. Runs after the LLM response. */\nexport type OutputGuardrail = (\n response: string,\n ctx: { metadata: Record<string, unknown> },\n) => GuardrailResult | Promise<GuardrailResult>;\n\n/** Handler for when a guardrail blocks. */\nexport type GuardrailBlockHandler =\n | 'retry'\n | 'throw'\n | ((reason: string, ctx: { metadata: Record<string, unknown> }) => string | Promise<string>);\n\n/** Full guardrails configuration for an agent. */\nexport type GuardrailsConfig = {\n input?: InputGuardrail;\n output?: OutputGuardrail;\n onBlock?: GuardrailBlockHandler;\n maxRetries?: number;\n};\n\n/** Result of a validate check (post-schema business rule validation).\n * Note: uses `valid: true` = pass, unlike `GuardrailResult` which uses `block: true` = fail. */\nexport type ValidateResult = {\n valid: boolean;\n reason?: string;\n};\n\n/** Output validator function. Runs after schema parsing on the typed object.\n * Only invoked when a schema is provided on the `ctx.ask()` call — without a schema,\n * use output guardrails for raw text validation instead. */\nexport type OutputValidator<T = unknown> = (\n output: T,\n ctx: { metadata: Record<string, unknown> },\n) => ValidateResult | Promise<ValidateResult>;\n\n/** Execution info */\nexport type ExecutionInfo = {\n executionId: string;\n workflow: string;\n status: ExecutionStatus;\n /** Full event timeline. Tokens and `partial_object` events are NOT persisted\n * here (stream-only); aggregate `tokens: { input, output, reasoning? }`\n * on `agent_call_end` is the persisted token representation. */\n events: AxlEvent[];\n totalCost: number;\n startedAt: number;\n completedAt?: number;\n duration: number;\n result?: unknown;\n error?: string;\n};\n\n/** Record of an agent handoff event (persisted in session metadata).\n *\n * `duration` semantics:\n * - `oneway`: target's full ask duration (start-to-completion).\n * - `roundtrip`: full round-trip wall-clock (handoff_start → handoff_return),\n * includes the time to push the result back into the source's\n * conversation. Both measurements are populated by the\n * runtime once the corresponding event fires; if the target\n * never completes (workflow aborted mid-handoff), `duration`\n * stays undefined.\n *\n * `toAskId` is the askId of the target frame — lets consumers correlate\n * the record to the target's `ask_end` event in the trace stream. */\nexport type HandoffRecord = {\n source: string;\n target: string;\n mode: 'oneway' | 'roundtrip';\n timestamp: number;\n duration?: number;\n toAskId?: string;\n};\n\n/** Information about a completed agent call, emitted via onAgentCallComplete. */\nexport type AgentCallInfo = {\n agent: string;\n prompt: string;\n response: string;\n model: string;\n cost: number;\n duration: number;\n promptVersion?: string;\n temperature?: number;\n maxTokens?: number;\n effort?: Effort;\n thinkingBudget?: number;\n includeThoughts?: boolean;\n toolChoice?: ToolChoice;\n stop?: string[];\n /** Provider-specific options merged into API requests. Not portable across providers. */\n providerOptions?: Record<string, unknown>;\n};\n\n/** Chat message types for provider communication */\nexport type ChatRole = 'system' | 'user' | 'assistant' | 'tool';\n\nexport type ChatMessage = {\n role: ChatRole;\n content: string;\n name?: string;\n tool_calls?: ToolCallMessage[];\n tool_call_id?: string;\n /** Provider-specific opaque metadata that must round-trip through conversation history. */\n providerMetadata?: Record<string, unknown>;\n};\n\nexport type ToolCallMessage = {\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n};\n\n/** Provider response */\nexport type ProviderResponse = {\n content: string;\n thinking_content?: string;\n tool_calls?: ToolCallMessage[];\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n reasoning_tokens?: number;\n cached_tokens?: number;\n };\n cost?: number;\n /** Provider-specific opaque metadata that needs to round-trip through conversation history. */\n providerMetadata?: Record<string, unknown>;\n};\n","import { spawn, type ChildProcess } from 'node:child_process';\nimport type {\n McpToolDefinition,\n McpToolResult,\n McpServer,\n McpServerConfig,\n JsonRpcRequest,\n JsonRpcResponse,\n} from './types.js';\n\n/**\n * MCP client using stdio transport.\n *\n * Spawns a child process and communicates via JSON-RPC over stdin/stdout.\n * Each message is a newline-delimited JSON-RPC object.\n */\nexport class StdioMcpClient implements McpServer {\n readonly name: string;\n tools: McpToolDefinition[] = [];\n private process: ChildProcess | null = null;\n private nextId = 1;\n private pending = new Map<\n number,\n {\n resolve: (value: JsonRpcResponse) => void;\n reject: (error: Error) => void;\n }\n >();\n private buffer = '';\n\n constructor(private config: McpServerConfig) {\n this.name = config.name;\n }\n\n async connect(): Promise<void> {\n if (!this.config.command) {\n throw new Error(`MCP server \"${this.name}\" has no command configured for stdio transport`);\n }\n\n const args = this.config.args ?? [];\n this.process = spawn(this.config.command, args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n env: { ...process.env, ...this.config.env },\n });\n\n this.process.stdout!.on('data', (data: Buffer) => {\n this.buffer += data.toString();\n this.processBuffer();\n });\n\n this.process.on('error', (err) => {\n // Reject all pending requests\n for (const { reject } of this.pending.values()) {\n reject(err);\n }\n this.pending.clear();\n });\n\n // Send initialize request\n const initResponse = await this.sendRequest('initialize', {\n protocolVersion: '2024-11-05',\n capabilities: {},\n clientInfo: { name: 'axl', version: '0.1.0' },\n });\n\n if (!initResponse.result) {\n throw new Error(`MCP server \"${this.name}\" failed to initialize`);\n }\n\n // Send initialized notification (no id = notification)\n this.sendNotification('notifications/initialized');\n\n // Discover tools\n await this.discoverTools();\n }\n\n private processBuffer(): void {\n const lines = this.buffer.split('\\n');\n this.buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n try {\n const msg = JSON.parse(trimmed) as JsonRpcResponse;\n if (msg.id !== undefined) {\n const pending = this.pending.get(msg.id);\n if (pending) {\n this.pending.delete(msg.id);\n pending.resolve(msg);\n }\n }\n } catch {\n // Ignore malformed JSON\n }\n }\n }\n\n private sendRequest(\n method: string,\n params?: unknown,\n timeoutMs = 30000,\n ): Promise<JsonRpcResponse> {\n return new Promise((resolve, reject) => {\n if (!this.process?.stdin?.writable) {\n reject(new Error(`MCP server \"${this.name}\" is not connected`));\n return;\n }\n\n const id = this.nextId++;\n const request: JsonRpcRequest = {\n jsonrpc: '2.0',\n id,\n method,\n params,\n };\n\n const timer = setTimeout(() => {\n this.pending.delete(id);\n reject(\n new Error(`MCP server \"${this.name}\" request \"${method}\" timed out after ${timeoutMs}ms`),\n );\n }, timeoutMs);\n\n this.pending.set(id, {\n resolve: (value) => {\n clearTimeout(timer);\n resolve(value);\n },\n reject: (err) => {\n clearTimeout(timer);\n reject(err);\n },\n });\n this.process.stdin.write(JSON.stringify(request) + '\\n');\n });\n }\n\n private sendNotification(method: string, params?: unknown): void {\n if (!this.process?.stdin?.writable) return;\n\n const notification = {\n jsonrpc: '2.0',\n method,\n ...(params ? { params } : {}),\n };\n this.process.stdin.write(JSON.stringify(notification) + '\\n');\n }\n\n private async discoverTools(): Promise<void> {\n const response = await this.sendRequest('tools/list');\n if (response.error) {\n throw new Error(\n `Failed to list tools from MCP server \"${this.name}\": ${response.error.message}`,\n );\n }\n\n const result = response.result as {\n tools: Array<{ name: string; description?: string; inputSchema?: unknown }>;\n };\n this.tools = (result.tools ?? []).map((t) => ({\n name: t.name,\n description: t.description ?? '',\n inputSchema: t.inputSchema ?? { type: 'object', properties: {} },\n }));\n }\n\n async callTool(toolName: string, args: unknown): Promise<McpToolResult> {\n const response = await this.sendRequest('tools/call', {\n name: toolName,\n arguments: args,\n });\n\n if (response.error) {\n return {\n content: [{ type: 'text', text: `Error: ${response.error.message}` }],\n isError: true,\n };\n }\n\n return response.result as McpToolResult;\n }\n\n async close(): Promise<void> {\n if (this.process) {\n this.process.kill();\n this.process = null;\n }\n for (const { reject } of this.pending.values()) {\n reject(new Error('MCP client closed'));\n }\n this.pending.clear();\n }\n}\n\n/**\n * MCP client using HTTP/SSE transport.\n *\n * Communicates with an MCP server via HTTP POST requests.\n */\nexport class HttpMcpClient implements McpServer {\n readonly name: string;\n tools: McpToolDefinition[] = [];\n private baseUrl: string;\n\n constructor(private config: McpServerConfig) {\n this.name = config.name;\n this.baseUrl = (config.uri ?? '').replace(/\\/$/, '');\n }\n\n async connect(): Promise<void> {\n if (!this.baseUrl) {\n throw new Error(`MCP server \"${this.name}\" has no URI configured for HTTP transport`);\n }\n\n // Initialize\n const initResult = await this.postRequest('initialize', {\n protocolVersion: '2024-11-05',\n capabilities: {},\n clientInfo: { name: 'axl', version: '0.1.0' },\n });\n\n if (!initResult) {\n throw new Error(`MCP server \"${this.name}\" failed to initialize`);\n }\n\n // Discover tools\n await this.discoverTools();\n }\n\n private async postRequest(method: string, params?: unknown, timeoutMs = 30000): Promise<unknown> {\n const request: JsonRpcRequest = {\n jsonrpc: '2.0',\n id: 1,\n method,\n params,\n };\n\n const res = await fetch(this.baseUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(request),\n signal: AbortSignal.timeout(timeoutMs),\n });\n\n if (!res.ok) {\n throw new Error(`MCP HTTP error (${res.status}): ${await res.text()}`);\n }\n\n const response = (await res.json()) as JsonRpcResponse;\n if (response.error) {\n throw new Error(`MCP server error: ${response.error.message}`);\n }\n\n return response.result;\n }\n\n private async discoverTools(): Promise<void> {\n const result = (await this.postRequest('tools/list')) as {\n tools: Array<{ name: string; description?: string; inputSchema?: unknown }>;\n };\n this.tools = (result.tools ?? []).map((t) => ({\n name: t.name,\n description: t.description ?? '',\n inputSchema: t.inputSchema ?? { type: 'object', properties: {} },\n }));\n }\n\n async callTool(toolName: string, args: unknown): Promise<McpToolResult> {\n try {\n const result = (await this.postRequest('tools/call', {\n name: toolName,\n arguments: args,\n })) as McpToolResult;\n return result;\n } catch (err) {\n return {\n content: [\n { type: 'text', text: `Error: ${err instanceof Error ? err.message : String(err)}` },\n ],\n isError: true,\n };\n }\n }\n\n async close(): Promise<void> {\n // HTTP transport: no persistent connection to close\n }\n}\n\n/**\n * Create the appropriate MCP client based on configuration.\n */\nexport function createMcpClient(config: McpServerConfig): StdioMcpClient | HttpMcpClient {\n if (config.uri) {\n return new HttpMcpClient(config);\n }\n return new StdioMcpClient(config);\n}\n","import type { McpServer, McpServerConfig, McpToolDefinition, McpToolResult } from './types.js';\nimport { createMcpClient } from './client.js';\nimport type { ToolDefinition } from '../providers/types.js';\n\n/**\n * Manages connections to multiple MCP servers.\n * Discovers tools, filters by agent config, and routes tool calls.\n *\n * MCP tools are namespaced internally as \"server:tool_name\" for disambiguation\n * and trace output, but presented to the LLM with their original names\n * (no prefix) to avoid confusing the model.\n */\nexport class McpManager {\n private servers = new Map<string, McpServer>();\n private initPromise: Promise<void> | null = null;\n\n /**\n * Initialize connections to all configured MCP servers.\n * Safe to call multiple times — subsequent calls return the original promise.\n */\n async initialize(configs: McpServerConfig[]): Promise<void> {\n if (this.initPromise) return this.initPromise;\n\n this.initPromise = (async () => {\n for (const config of configs) {\n const client = createMcpClient(config);\n await client.connect();\n this.servers.set(config.name, client);\n }\n })();\n\n try {\n await this.initPromise;\n } catch (err) {\n // Reset so a retry can attempt initialization again\n this.initPromise = null;\n throw err;\n }\n }\n\n /**\n * Get all tools from all connected servers.\n */\n getAllTools(): Array<{ server: string; tool: McpToolDefinition }> {\n const tools: Array<{ server: string; tool: McpToolDefinition }> = [];\n for (const [serverName, server] of this.servers) {\n for (const tool of server.tools) {\n tools.push({ server: serverName, tool });\n }\n }\n return tools;\n }\n\n /**\n * Get the qualified name for an MCP tool: \"server:tool_name\".\n * Used in traces and ACL declarations.\n */\n getQualifiedName(toolName: string): string | undefined {\n for (const [serverName, server] of this.servers) {\n if (server.tools.some((t) => t.name === toolName)) {\n return `${serverName}:${toolName}`;\n }\n }\n return undefined;\n }\n\n /**\n * Get tool definitions filtered for a specific agent's MCP configuration.\n *\n * @param agentMcp - Server names the agent has access to (undefined = all)\n * @param agentMcpTools - Specific tool names the agent can use.\n * Accepts both plain names (\"read_file\") and qualified names (\"fs-server:read_file\").\n * Qualified names enable disambiguation when multiple servers expose same-named tools.\n */\n getToolsForAgent(\n agentMcp?: string[],\n agentMcpTools?: string[],\n ): Array<{ server: string; tool: McpToolDefinition }> {\n const allTools = this.getAllTools();\n\n // Filter by server names if specified\n let filtered = agentMcp ? allTools.filter(({ server }) => agentMcp.includes(server)) : allTools;\n\n // Filter by specific tool names if specified\n if (agentMcpTools) {\n filtered = filtered.filter(({ server, tool }) => {\n const qualifiedName = `${server}:${tool.name}`;\n // Match against both qualified (\"server:tool\") and plain (\"tool\") names\n return agentMcpTools.includes(qualifiedName) || agentMcpTools.includes(tool.name);\n });\n }\n\n return filtered;\n }\n\n /**\n * Convert MCP tools to ToolDefinition format for sending to LLMs.\n * Tools are presented with their original names (no server prefix)\n * to avoid confusing the LLM.\n */\n getToolDefinitions(agentMcp?: string[], agentMcpTools?: string[]): ToolDefinition[] {\n const tools = this.getToolsForAgent(agentMcp, agentMcpTools);\n return tools.map(({ tool }) => ({\n type: 'function' as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n },\n }));\n }\n\n /**\n * Call a tool by name. Finds the correct server automatically.\n *\n * @param toolName - The tool name\n * @param args - Arguments for the tool\n * @param serverHint - Optional server name if known (for disambiguation)\n */\n async callTool(toolName: string, args: unknown, serverHint?: string): Promise<McpToolResult> {\n // If server hint provided, use it directly\n if (serverHint) {\n const server = this.servers.get(serverHint);\n if (!server) {\n return {\n content: [{ type: 'text', text: `MCP server \"${serverHint}\" not found` }],\n isError: true,\n };\n }\n return server.callTool(toolName, args);\n }\n\n // Find the server that has this tool\n for (const [, server] of this.servers) {\n const hasTool = server.tools.some((t) => t.name === toolName);\n if (hasTool) {\n return server.callTool(toolName, args);\n }\n }\n\n return {\n content: [{ type: 'text', text: `MCP tool \"${toolName}\" not found on any server` }],\n isError: true,\n };\n }\n\n /**\n * Check if a tool name belongs to an MCP server.\n */\n isMcpTool(toolName: string): boolean {\n for (const [, server] of this.servers) {\n if (server.tools.some((t) => t.name === toolName)) return true;\n }\n return false;\n }\n\n /**\n * Shut down all MCP server connections.\n */\n async shutdown(): Promise<void> {\n for (const [, server] of this.servers) {\n await server.close();\n }\n this.servers.clear();\n }\n\n /**\n * Get the number of connected servers.\n */\n get serverCount(): number {\n return this.servers.size;\n }\n}\n","import type {\n VectorStore,\n Embedder,\n EmbedUsage,\n EmbedResult,\n VectorResult,\n RememberOptions,\n RecallOptions,\n} from './types.js';\nimport type { StateStore } from '../state/types.js';\n\n/**\n * Result of a `MemoryManager.remember()` call.\n *\n * Exposes embedder `usage` so callers (WorkflowContext) can attribute\n * cost to the current execution scope and surface it in trace events.\n * `usage` is absent when no embedding happened (embed option not set,\n * or no vector store configured).\n */\nexport type RememberResult = {\n usage?: EmbedUsage;\n};\n\n/**\n * Result of a `MemoryManager.recall()` call.\n *\n * Wraps the original return shape (key-value payload or vector search\n * results) with optional embedder `usage`. Semantic recall populates\n * `usage` when the embedder reported it; key-value lookups never do.\n */\nexport type RecallResult = {\n data: unknown | VectorResult[] | null;\n usage?: EmbedUsage;\n};\n\n/**\n * Validate the shape returned by a user-supplied `Embedder.embed()` call.\n *\n * In 0.15 the `Embedder` contract changed from `Promise<number[][]>` to\n * `Promise<{ vectors: number[][]; usage?: EmbedUsage }>` so semantic\n * memory can carry cost attribution out to `ctx.budget()` and the cost\n * aggregator. A custom embedder that still returns the legacy bare\n * `number[][]` shape would otherwise destructure to `vectors === undefined`\n * and throw a cryptic `TypeError: Cannot read properties of undefined\n * (reading '0')` deep inside upsert/search — giving no hint to the user\n * that the fix is a return-shape migration, not a bug in axl.\n *\n * Fail loudly with a clear migration hint at the interface boundary.\n */\nfunction assertEmbedResult(result: unknown): asserts result is EmbedResult {\n if (Array.isArray(result)) {\n throw new Error(\n 'Embedder.embed() returned a bare number[][] (legacy shape). ' +\n 'As of @axlsdk/axl 0.15, Embedder.embed() must return ' +\n '{ vectors: number[][]; usage?: { tokens?, cost?, model? } }. ' +\n 'Wrap your existing return value: `return { vectors: await old() }`.',\n );\n }\n if (\n !result ||\n typeof result !== 'object' ||\n !Array.isArray((result as { vectors?: unknown }).vectors)\n ) {\n throw new Error(\n 'Embedder.embed() must return { vectors: number[][]; usage?: EmbedUsage }. ' +\n `Got ${result === null ? 'null' : typeof result}.`,\n );\n }\n}\n\n/**\n * Coordinates key-value memory and vector store for semantic search.\n * All key-value operations delegate to the StateStore.\n * Vector operations use the configured VectorStore + Embedder.\n */\nexport class MemoryManager {\n private vectorStore?: VectorStore;\n private embedder?: Embedder;\n\n constructor(options?: { vectorStore?: VectorStore; embedder?: Embedder }) {\n this.vectorStore = options?.vectorStore;\n this.embedder = options?.embedder;\n\n if (this.vectorStore && !this.embedder) {\n throw new Error('An embedder is required when a vectorStore is configured');\n }\n }\n\n /**\n * Store a key-value pair in memory.\n * If a vector store and embedder are configured and embed is true,\n * also embeds the value for semantic search.\n *\n * Returns `{ usage }` when embedding happened, carrying the embedder's\n * cost/token reporting out to the caller for cost attribution.\n */\n async remember(\n key: string,\n value: unknown,\n stateStore: StateStore,\n sessionId: string | undefined,\n options?: RememberOptions,\n signal?: AbortSignal,\n ): Promise<RememberResult> {\n const scope = options?.scope ?? 'session';\n\n // Determine the storage scope string\n if (scope === 'session' && !sessionId) {\n throw new Error(\n 'sessionId is required for session-scoped memory. Use { scope: \"global\" } or provide a sessionId in metadata.',\n );\n }\n const storeScope = scope === 'session' ? `session:${sessionId}` : 'global';\n\n // Use dedicated memory methods if available, otherwise fall back to sessionMeta\n if (stateStore.saveMemory) {\n await stateStore.saveMemory(storeScope, key, value);\n } else {\n const storeKey = `memory:${storeScope}:${key}`;\n await stateStore.saveSessionMeta(storeKey, 'value', value);\n if (options?.metadata) {\n await stateStore.saveSessionMeta(storeKey, 'metadata', options.metadata);\n }\n }\n\n // Optionally embed for semantic search (opt-in: embed must be explicitly true)\n if (options?.embed === true && this.vectorStore && this.embedder) {\n const text = typeof value === 'string' ? value : JSON.stringify(value);\n const raw = await this.embedder.embed([text], signal);\n assertEmbedResult(raw);\n const { vectors, usage } = raw;\n // The embed API call already happened — the user has been billed.\n // If the downstream vectorStore.upsert fails, we must preserve the\n // usage attribution so the caller's error handler can still record\n // cost for the completed embed. Without this, a transient vector-store\n // failure silently decouples real API spend from the cost tracker,\n // and the user's reported costs diverge from their provider bill.\n try {\n await this.vectorStore.upsert([\n {\n id: `${storeScope}:${key}`,\n content: text,\n embedding: vectors[0],\n metadata: { key, scope, ...options?.metadata },\n },\n ]);\n } catch (err) {\n if (usage && typeof err === 'object' && err !== null) {\n // Non-enumerable so it doesn't pollute `JSON.stringify(err)` or\n // stack-trace output, but code that knows to look for it can\n // recover the cost attribution on the failure path.\n Object.defineProperty(err, 'axlEmbedUsage', {\n value: usage,\n enumerable: false,\n writable: true,\n configurable: true,\n });\n }\n throw err;\n }\n return usage ? { usage } : {};\n }\n\n return {};\n }\n\n /**\n * Recall a value from memory by key, or perform semantic search if query is provided.\n *\n * Always returns `{ data }`; semantic recalls additionally include\n * `usage` from the embedder (when the embedder reported it).\n */\n async recall(\n key: string,\n stateStore: StateStore,\n sessionId: string | undefined,\n options?: RecallOptions,\n signal?: AbortSignal,\n ): Promise<RecallResult> {\n // Semantic search mode\n if (options?.query && this.vectorStore && this.embedder) {\n const raw = await this.embedder.embed([options.query], signal);\n assertEmbedResult(raw);\n const { vectors, usage } = raw;\n const topK = options?.topK ?? 5;\n\n // Determine the target scope for filtering\n const searchScope = options?.scope ?? 'session';\n if (searchScope === 'session' && !sessionId) {\n throw new Error(\n 'sessionId is required for session-scoped memory. Use { scope: \"global\" } or provide a sessionId in metadata.',\n );\n }\n\n // Fetch extra results to account for scope filtering, then filter by scope\n const rawResults = await this.vectorStore.search(vectors[0], topK * 3);\n const filtered = rawResults.filter((r) => {\n // Global entries are always visible\n if (r.id.startsWith('global:')) return true;\n // Session entries only visible to the same session\n if (searchScope === 'session') return r.id.startsWith(`session:${sessionId}:`);\n return true;\n });\n const data = filtered.slice(0, topK);\n return usage ? { data, usage } : { data };\n }\n\n // Key-value lookup\n const scope = options?.scope ?? 'session';\n if (scope === 'session' && !sessionId) {\n throw new Error(\n 'sessionId is required for session-scoped memory. Use { scope: \"global\" } or provide a sessionId in metadata.',\n );\n }\n const storeScope = scope === 'session' ? `session:${sessionId}` : 'global';\n\n if (stateStore.getMemory) {\n return { data: await stateStore.getMemory(storeScope, key) };\n }\n\n // Fallback to sessionMeta\n const storeKey = `memory:${storeScope}:${key}`;\n return { data: await stateStore.getSessionMeta(storeKey, 'value') };\n }\n\n /** Delete a memory entry. If a vector store is configured, also removes the embedding. */\n async forget(\n key: string,\n stateStore: StateStore,\n sessionId: string | undefined,\n options?: { scope?: 'session' | 'global' },\n ): Promise<void> {\n const scope = options?.scope ?? 'session';\n if (scope === 'session' && !sessionId) {\n throw new Error(\n 'sessionId is required for session-scoped memory. Use { scope: \"global\" } or provide a sessionId in metadata.',\n );\n }\n const storeScope = scope === 'session' ? `session:${sessionId}` : 'global';\n\n if (stateStore.deleteMemory) {\n await stateStore.deleteMemory(storeScope, key);\n } else {\n // Fallback: save null to effectively \"delete\" both value and metadata keys\n const storeKey = `memory:${storeScope}:${key}`;\n await stateStore.saveSessionMeta(storeKey, 'value', null);\n await stateStore.saveSessionMeta(storeKey, 'metadata', null);\n }\n\n // Remove from vector store if present\n if (this.vectorStore) {\n await this.vectorStore.delete([`${storeScope}:${key}`]);\n }\n }\n\n /** Shut down the vector store if it has a close method. */\n async close(): Promise<void> {\n if (this.vectorStore?.close) {\n await this.vectorStore.close();\n }\n }\n}\n","import type { SpanHandle, SpanManager } from './types.js';\n\nconst NOOP_SPAN: SpanHandle = {\n setAttribute() {},\n addEvent() {},\n setStatus() {},\n end() {},\n};\n\n/**\n * No-op span manager. Zero overhead when OTel is not configured.\n * All methods are synchronous no-ops that return immediately.\n */\nexport class NoopSpanManager implements SpanManager {\n async withSpanAsync<T>(\n _name: string,\n _attributes: Record<string, string | number | boolean>,\n fn: (span: SpanHandle) => Promise<T>,\n ): Promise<T> {\n return fn(NOOP_SPAN);\n }\n\n addEventToActiveSpan(): void {}\n\n async shutdown(): Promise<void> {}\n}\n","export type { TelemetryConfig, SpanHandle, SpanManager } from './types.js';\nexport { NoopSpanManager } from './noop.js';\nexport { OTelSpanManager } from './span-manager.js';\n\nimport type { TelemetryConfig, SpanManager } from './types.js';\nimport { NoopSpanManager } from './noop.js';\n\n/**\n * Create a SpanManager based on configuration.\n * Returns NoopSpanManager when telemetry is disabled (zero overhead).\n * Dynamically imports OTelSpanManager when enabled (avoids hard dep).\n */\nexport async function createSpanManager(config?: TelemetryConfig): Promise<SpanManager> {\n if (!config?.enabled) {\n return new NoopSpanManager();\n }\n\n const { OTelSpanManager } = await import('./span-manager.js');\n return OTelSpanManager.create(config);\n}\n","/**\n * Module-export resolution helpers for dynamically-imported user modules.\n *\n * Walks the ESM/CJS interop chain so consumers see the same shape regardless\n * of how Node loaded the file. The original motivating bug: `axl-eval` looked\n * up `executeWorkflow` as `mod.executeWorkflow` only, but tsx-loading a `.ts`\n * file in a CJS package puts named exports on `mod.default.executeWorkflow`,\n * so the lookup silently fell back to identity passthrough — producing\n * all-zero scores in CI.\n *\n * Use these helpers (not hand-rolled `mod.default ?? mod` walks) at every\n * dynamic-import call site to keep default and named lookups symmetric.\n *\n * @internal Not part of the public SDK surface — exported only so the eval\n * CLI and Studio middleware can share one implementation.\n */\n\n/**\n * Resolve the AxlRuntime from a dynamically imported config module.\n * Handles ESM default exports, CJS-to-ESM interop wrapping, and named exports.\n *\n * Module shapes handled:\n * - ESM `export default runtime` → `mod.default` is the runtime\n * - CJS compiled from `export default runtime` → `mod.default.default` is the runtime\n * - CJS `module.exports = runtime` → `mod.default` is the runtime\n * - Named `export { runtime }` → `mod.runtime` is the runtime\n *\n * @internal\n */\nexport function resolveRuntime(mod: Record<string, unknown>): unknown {\n const def = mod.default as Record<string, unknown> | undefined;\n return def?.default ?? def ?? mod.runtime;\n}\n\n/**\n * Look up the default-ish export from a dynamically imported module. Walks\n * the ESM/CJS interop chain plus a `config` named-export fallback that some\n * eval modules use.\n *\n * Module shapes handled:\n * - ESM `export default cfg`: `mod.default`\n * - CJS-wrapped-as-ESM: `mod.default.default`\n * - Named `export const config = cfg`: `mod.config`\n * - Bare module value: `mod`\n *\n * Mirrors the chain `pickExport()` walks for named exports — keep them in\n * sync so resolution is symmetric.\n *\n * @internal\n */\nexport function pickDefault<T>(mod: Record<string, unknown>): T {\n const def = mod.default as Record<string, unknown> | undefined;\n return (def?.default ?? def ?? mod.config ?? mod) as T;\n}\n\n/**\n * Look up a named export from a dynamically imported module, walking the\n * ESM/CJS interop chain symmetrically with `resolveRuntime` and `pickDefault`.\n *\n * Module shapes handled:\n * - ESM: `mod[key]`\n * - CJS-wrapped-as-ESM: `mod.default[key]` (tsx/ts compiled to CJS)\n * - CJS double-wrap: `mod.default.default[key]` (rare interop edge)\n *\n * Without this helper, named exports would be silently invisible whenever the\n * module loads as CJS (e.g. a `.ts` file in a package without `\"type\": \"module\"`),\n * even though the default export resolves correctly via the chain walk.\n *\n * `null`-valued exports are treated as \"absent\" (the `??` chain falls through),\n * matching how a missing export presents at the language level. Callers that\n * need to distinguish \"explicitly null\" from \"missing\" should not use this helper.\n *\n * @internal\n */\nexport function pickExport<T>(mod: Record<string, unknown>, key: string): T | undefined {\n const def = mod.default as Record<string, unknown> | undefined;\n return (mod[key] ??\n def?.[key] ??\n (def?.default as Record<string, unknown> | undefined)?.[key]) as T | undefined;\n}\n","/**\n * Shared CLI helpers for `@axlsdk/eval` and `@axlsdk/studio`. Hosted in core\n * so a fix to (e.g.) the tsx loader registration applies to both consumers\n * atomically — same anti-drift reasoning as `module-resolve.ts`.\n *\n * Not exported from the package index intentionally — these are loader-level\n * utilities, not part of the runtime/agent API. Consumers re-export the\n * pieces they need from their own `cli-utils` modules.\n *\n * @internal\n */\n\nimport { resolve, dirname, basename } from 'node:path';\nimport { existsSync, readdirSync, statSync } from 'node:fs';\nimport { pathToFileURL } from 'node:url';\n\n// ── Config auto-detection ──────────────────────────────────────────\n\n/**\n * Filenames searched (in order) when no `--config` is passed. Both `axl-eval`\n * and `axl-studio` walk this list — kept here so adding a new candidate\n * (e.g. `axl.config.cts`) takes effect everywhere.\n *\n * @internal\n */\nexport const CONFIG_CANDIDATES = [\n 'axl.config.mts',\n 'axl.config.ts',\n 'axl.config.mjs',\n 'axl.config.js',\n];\n\n/**\n * Find an `axl.config.*` file in `cwd`, returning the absolute path of the\n * first match in `CONFIG_CANDIDATES` order. Returns `undefined` if none exist.\n *\n * @internal\n */\nexport function findConfig(cwd: string): string | undefined {\n for (const name of CONFIG_CANDIDATES) {\n const p = resolve(cwd, name);\n if (existsSync(p)) return p;\n }\n return undefined;\n}\n\n// ── Extension helpers ──────────────────────────────────────────────\n\n/**\n * Returns true if the file is TypeScript and needs tsx to load.\n *\n * @internal\n */\nexport function needsTsxLoader(filePath: string): boolean {\n return /\\.[mc]?tsx?$/.test(filePath);\n}\n\n// ── Module loading ────────────────────────────────────────────────\n\n// Tracks whether we've already activated tsx's process-wide loader hooks.\n// `undefined` = not yet attempted, `true` = ESM hook active (CJS hook is\n// best-effort and tracked separately by tsx itself), `false` = tsx\n// unavailable. Module-scoped so the second consumer (e.g. studio after\n// eval) reuses eval's registration instead of attempting to re-register.\nlet tsxRegistered: boolean | undefined;\n\n/**\n * Activate tsx's process-wide loader hooks once per Node process so any\n * subsequent `await import('./foo.ts')` AND any transitive `require('./foo.ts')`\n * from a CJS workspace dep are transformed.\n *\n * Why both hooks: tsx ships separate ESM (`tsx/esm/api`) and CJS\n * (`tsx/cjs/api`) hook APIs. The ESM hook intercepts `import()`. The CJS\n * hook patches `require.extensions` so `require('./x.ts')` from a CJS\n * package also gets transformed. tsx's own CLI registers both for the same\n * reason. Registering only ESM means a `.ts` eval file in a CJS-typed\n * package whose chain goes `import → cjs-pkg → require('./helper.ts')`\n * trips Node's `require(esm)` path (since the .ts has no CJS handler) and\n * fails with `ES Module ... cycle` / `Unknown file extension '.ts'`. The\n * ESM hook can't help — it doesn't see `require()` calls.\n *\n * Implementation note: tsx's `tsImport(specifier, parent)` uses a unique\n * namespace per call — it only transforms the entry import. Chained imports\n * MADE BY the entry file fall back to native Node ESM resolution, which\n * can't load `.ts` sources. That broke `--conditions development` whenever a\n * monorepo's `development` export pointed at `.ts` files. We instead call\n * `register()` (no namespace) once and rely on plain `await import()` for\n * each file — tsx then intercepts the entire ESM module graph for the\n * process lifetime.\n *\n * Process-wide registration is what tsx's own CLI does. Both hooks are\n * idempotent and only act on TypeScript-extension specifiers. ESM is the\n * critical hook (powers our entry-file `import()` below); CJS is\n * best-effort — if its API import fails on some unusual tsx build the ESM\n * hook still works, leaving callers in the pre-fix state for CJS chains\n * rather than worse. Falls back to false if tsx is not installed.\n *\n * @internal\n */\nasync function ensureTsxRegistered(): Promise<boolean> {\n if (tsxRegistered !== undefined) return tsxRegistered;\n try {\n // @ts-expect-error — tsx is an optional runtime dependency\n const esm = await import('tsx/esm/api');\n if (typeof esm.register !== 'function') {\n tsxRegistered = false;\n return tsxRegistered;\n }\n esm.register();\n tsxRegistered = true;\n } catch {\n tsxRegistered = false;\n return tsxRegistered;\n }\n try {\n // @ts-expect-error — tsx is an optional runtime dependency\n const cjs = await import('tsx/cjs/api');\n if (typeof cjs.register === 'function') {\n cjs.register();\n }\n } catch {\n // CJS api unavailable — `require('./x.ts')` chains from CJS workspace\n // deps will still trip require(esm) cycles (pre-fix behavior). Leave\n // tsxRegistered=true so the ESM-driven entry load proceeds.\n }\n return tsxRegistered;\n}\n\n/**\n * Import a module by file path, activating tsx's loader for `.ts`/`.tsx`\n * files. Throws an actionable error if tsx is needed but not installed —\n * preventing Node's cryptic `Unknown file extension '.ts'` from leaking\n * to the user.\n *\n * @internal\n */\nexport async function importModule(\n filePath: string,\n _parentURL?: string,\n): Promise<Record<string, unknown>> {\n if (needsTsxLoader(filePath)) {\n const registered = await ensureTsxRegistered();\n if (!registered) {\n throw new Error(\n `Cannot load TypeScript file ${filePath}: tsx is not installed.\\n` +\n ` tsx is declared by @axlsdk/eval / @axlsdk/studio so pnpm 8+ and npm 7+\\n` +\n ` install it automatically. On Yarn Classic or with auto-install-peers\\n` +\n ` disabled, install it explicitly: npm install -D tsx`,\n );\n }\n }\n return await import(pathToFileURL(filePath).href);\n}\n\n// ── Glob expansion ────────────────────────────────────────────────\n\nconst MAX_GLOB_DEPTH = 20;\n\n/**\n * Minimal glob expander. Both axl-eval (CLI args) and axl-studio's\n * eval-loader (`evals: '...'` middleware option) walk this so a user gets\n * identical behavior whether they invoke the CLI or mount the middleware.\n *\n * Supported forms:\n * - `dir/*.eval.ts` — match files in dir/\n * - `dir/.../*.eval.ts` — recursively match under dir/ (use `**\\/*.eval.ts`)\n * - `**\\/*.eval.ts` — recursively match under cwd\n *\n * Multi-segment `**` (e.g. `a/**\\/b/**\\/*.ts`) is not supported — deliberate\n * scope limit; users with that need can pre-expand themselves.\n *\n * @internal\n */\nexport function expandGlob(pattern: string, cwd: string): string[] {\n if (pattern.includes('**/')) {\n const sepIdx = pattern.indexOf('**/');\n const baseDir = resolve(cwd, pattern.slice(0, sepIdx) || '.');\n const fileGlob = pattern.slice(sepIdx + 3) || '*';\n return findFiles(baseDir, fileGlob, true);\n }\n const dir = resolve(cwd, dirname(pattern));\n const fileGlob = basename(pattern);\n return findFiles(dir, fileGlob, false);\n}\n\nfunction findFiles(dir: string, fileGlob: string, recursive: boolean, depth = 0): string[] {\n if (depth > MAX_GLOB_DEPTH) return [];\n const matcher = globToRegex(fileGlob);\n const results: string[] = [];\n try {\n const entries = readdirSync(dir);\n for (const entry of entries) {\n const full = resolve(dir, entry);\n try {\n const stat = statSync(full);\n if (stat.isFile() && matcher.test(entry)) {\n results.push(full);\n } else if (stat.isDirectory() && recursive) {\n results.push(...findFiles(full, fileGlob, true, depth + 1));\n }\n } catch {\n // Skip unreadable entries\n }\n }\n } catch {\n // Directory missing — return empty\n }\n return results;\n}\n\nfunction globToRegex(glob: string): RegExp {\n const escaped = glob.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&').replace(/\\*/g, '.*');\n return new RegExp(`^${escaped}$`);\n}\n\n// ── Conditions ────────────────────────────────────────────────────\n\n/**\n * Add custom Node.js import conditions process-wide via `module.register()`.\n * Used by `--conditions development` in monorepos whose package.json\n * `exports` use a `development` condition to point at `.ts` source instead\n * of built `dist`.\n *\n * Caveat: ESM-only. `node:module.register()` only installs ESM resolve\n * hooks; Node's CJS resolver never sees them. So when tsx compiles a\n * `.ts` file in a CJS-typed package, its `import` statements become\n * `require()` calls, those `require()`s use the CJS resolver, and the\n * extra conditions don't propagate — meaning a workspace package whose\n * `exports.development → \"./src/foo.ts\"` resolves to the `default`\n * entry (e.g. built `./dist/foo.js`) instead of the `.ts` source. This\n * is independent of the `tsx/cjs/api` hook (which fixes `.ts` *file\n * loading* under require, but can't make the CJS resolver consult ESM\n * conditions). Workaround for full condition coverage: add\n * `\"type\": \"module\"` to the importer's package, or rename it to `.mts`,\n * so its internal imports stay as `import` and hit the ESM resolve hook.\n *\n * @internal\n */\nexport async function registerConditions(conditions: string[]): Promise<void> {\n try {\n const nodeModule = await import('node:module');\n const hookCode = [\n `const extra = ${JSON.stringify(conditions)};`,\n `export async function resolve(specifier, context, nextResolve) {`,\n ` return nextResolve(specifier, {`,\n ` ...context,`,\n ` conditions: [...new Set([...context.conditions, ...extra])],`,\n ` });`,\n `}`,\n ].join('\\n');\n nodeModule.register(`data:text/javascript,${encodeURIComponent(hookCode)}`);\n } catch {\n console.warn('Warning: --conditions requires Node.js 20.6+');\n }\n}\n","import type { ChatMessage, ExecutionInfo, HumanDecision } from '../types.js';\nimport type { StateStore, PendingDecision, ExecutionState, EvalHistoryEntry } from './types.js';\n\n// Minimal interface for the node-redis client methods we use.\n// Avoids a hard compile-time dependency on the redis package.\ninterface RedisClient {\n hSet(key: string, field: string, value: string): Promise<number>;\n hGet(key: string, field: string): Promise<string | null | undefined>;\n hGetAll(key: string): Promise<Record<string, string>>;\n hDel(key: string, field: string | string[]): Promise<number>;\n set(key: string, value: string): Promise<string | null>;\n get(key: string): Promise<string | null>;\n del(key: string | string[]): Promise<number>;\n sAdd(key: string, member: string | string[]): Promise<number>;\n sRem(key: string, member: string | string[]): Promise<number>;\n sMembers(key: string): Promise<string[]>;\n quit(): Promise<void>;\n}\n\n/**\n * Redis-backed StateStore using the official `redis` (node-redis) client.\n *\n * Designed for multi-process and sidecar deployments where\n * multiple runtime instances need shared state.\n *\n * Requires `redis` as a peer dependency. Create instances via the\n * async `RedisStore.create()` factory, which connects before returning.\n */\nexport class RedisStore implements StateStore {\n private constructor(private client: RedisClient) {}\n\n /**\n * Create a connected RedisStore instance.\n *\n * @param url - Redis connection URL (e.g. `redis://localhost:6379`). Defaults to `redis://localhost:6379`.\n */\n static async create(url?: string): Promise<RedisStore> {\n let createClient: (opts?: { url?: string }) => RedisClient & { connect(): Promise<void> };\n try {\n const mod = require('redis');\n createClient = mod.createClient ?? mod.default?.createClient;\n if (typeof createClient !== 'function') {\n throw new Error(\n 'redis package does not export createClient. Ensure you have redis ^5.0.0 installed: npm install redis',\n );\n }\n } catch (err) {\n if (err instanceof Error && err.message.includes('createClient')) throw err;\n throw new Error('redis is required for RedisStore. Install it with: npm install redis');\n }\n\n const client = url ? createClient({ url }) : createClient();\n await client.connect();\n return new RedisStore(client);\n }\n\n // ── Key helpers ──────────────────────────────────────────────────────\n\n private checkpointKey(executionId: string): string {\n return `axl:checkpoint:${executionId}`;\n }\n\n private sessionKey(sessionId: string): string {\n return `axl:session:${sessionId}`;\n }\n\n private sessionMetaKey(sessionId: string): string {\n return `axl:session-meta:${sessionId}`;\n }\n\n private decisionsKey(): string {\n return 'axl:decisions';\n }\n\n private executionStateKey(executionId: string): string {\n return `axl:exec-state:${executionId}`;\n }\n\n private pendingExecSetKey(): string {\n return 'axl:pending-executions';\n }\n\n private execHistoryKey(executionId: string): string {\n return `axl:exec-history:${executionId}`;\n }\n\n private execHistorySetKey(): string {\n return 'axl:exec-history-ids';\n }\n\n private evalHistoryKey(id: string): string {\n return `axl:eval-history:${id}`;\n }\n\n private evalHistorySetKey(): string {\n return 'axl:eval-history-ids';\n }\n\n // ── Checkpoints ──────────────────────────────────────────────────────\n\n async saveCheckpoint(executionId: string, name: string, data: unknown): Promise<void> {\n await this.client.hSet(this.checkpointKey(executionId), name, JSON.stringify(data));\n }\n\n async getCheckpoint(executionId: string, name: string): Promise<unknown | null> {\n const raw = await this.client.hGet(this.checkpointKey(executionId), name);\n return raw != null ? JSON.parse(raw) : null;\n }\n\n // ── Sessions ─────────────────────────────────────────────────────────\n\n async saveSession(sessionId: string, history: ChatMessage[]): Promise<void> {\n await this.client.set(this.sessionKey(sessionId), JSON.stringify(history));\n await this.client.sAdd('axl:session-ids', sessionId);\n }\n\n async getSession(sessionId: string): Promise<ChatMessage[]> {\n const raw = await this.client.get(this.sessionKey(sessionId));\n return raw ? JSON.parse(raw) : [];\n }\n\n async deleteSession(sessionId: string): Promise<void> {\n await this.client.del(this.sessionKey(sessionId));\n await this.client.del(this.sessionMetaKey(sessionId));\n await this.client.sRem('axl:session-ids', sessionId);\n }\n\n async saveSessionMeta(sessionId: string, key: string, value: unknown): Promise<void> {\n await this.client.hSet(this.sessionMetaKey(sessionId), key, JSON.stringify(value));\n }\n\n async getSessionMeta(sessionId: string, key: string): Promise<unknown | null> {\n const raw = await this.client.hGet(this.sessionMetaKey(sessionId), key);\n return raw != null ? JSON.parse(raw) : null;\n }\n\n // ── Pending Decisions ────────────────────────────────────────────────\n\n async savePendingDecision(executionId: string, decision: PendingDecision): Promise<void> {\n await this.client.hSet(this.decisionsKey(), executionId, JSON.stringify(decision));\n }\n\n async getPendingDecisions(): Promise<PendingDecision[]> {\n const all = await this.client.hGetAll(this.decisionsKey());\n if (!all) return [];\n return Object.values(all).map((raw) => JSON.parse(raw));\n }\n\n async resolveDecision(executionId: string, _result: HumanDecision): Promise<void> {\n await this.client.hDel(this.decisionsKey(), executionId);\n }\n\n // ── Execution State ──────────────────────────────────────────────────\n\n async saveExecutionState(executionId: string, state: ExecutionState): Promise<void> {\n await this.client.set(this.executionStateKey(executionId), JSON.stringify(state));\n\n if (state.status === 'waiting') {\n await this.client.sAdd(this.pendingExecSetKey(), executionId);\n } else {\n await this.client.sRem(this.pendingExecSetKey(), executionId);\n }\n }\n\n async getExecutionState(executionId: string): Promise<ExecutionState | null> {\n const raw = await this.client.get(this.executionStateKey(executionId));\n return raw ? JSON.parse(raw) : null;\n }\n\n async listPendingExecutions(): Promise<string[]> {\n return this.client.sMembers(this.pendingExecSetKey());\n }\n\n // ── Execution History ────────────────────────────────────────────────\n\n async saveExecution(execution: ExecutionInfo): Promise<void> {\n // Write set membership first — if we crash between the two writes,\n // listExecutions gracefully skips IDs with missing values.\n await this.client.sAdd(this.execHistorySetKey(), execution.executionId);\n await this.client.set(this.execHistoryKey(execution.executionId), JSON.stringify(execution));\n }\n\n async getExecution(executionId: string): Promise<ExecutionInfo | null> {\n const raw = await this.client.get(this.execHistoryKey(executionId));\n return raw ? JSON.parse(raw) : null;\n }\n\n async listExecutions(limit?: number): Promise<ExecutionInfo[]> {\n const ids = await this.client.sMembers(this.execHistorySetKey());\n if (ids.length === 0) return [];\n\n const entries: ExecutionInfo[] = [];\n for (const id of ids) {\n const raw = await this.client.get(this.execHistoryKey(id));\n if (raw) entries.push(JSON.parse(raw));\n }\n entries.sort((a, b) => b.startedAt - a.startedAt);\n return limit ? entries.slice(0, limit) : entries;\n }\n\n // ── Eval History ────────────────────────────────────────────────────\n\n async saveEvalResult(entry: EvalHistoryEntry): Promise<void> {\n await this.client.sAdd(this.evalHistorySetKey(), entry.id);\n await this.client.set(this.evalHistoryKey(entry.id), JSON.stringify(entry));\n }\n\n async listEvalResults(limit?: number): Promise<EvalHistoryEntry[]> {\n const ids = await this.client.sMembers(this.evalHistorySetKey());\n if (ids.length === 0) return [];\n\n const entries: EvalHistoryEntry[] = [];\n for (const id of ids) {\n const raw = await this.client.get(this.evalHistoryKey(id));\n if (raw) entries.push(JSON.parse(raw));\n }\n entries.sort((a, b) => b.timestamp - a.timestamp);\n return limit ? entries.slice(0, limit) : entries;\n }\n\n async deleteEvalResult(id: string): Promise<boolean> {\n // Remove from both the index set and the data key. del() returns the\n // number of keys actually deleted, which we use as the \"existed\" signal\n // so callers can distinguish \"not found\" from \"deleted\" without a\n // separate EXISTS round-trip.\n await this.client.sRem(this.evalHistorySetKey(), id);\n const deleted = await this.client.del(this.evalHistoryKey(id));\n return deleted > 0;\n }\n\n // ── Sessions (Studio introspection) ────────────────────────────────────\n\n async listSessions(): Promise<string[]> {\n // Redis doesn't have a built-in way to list keys by pattern without SCAN,\n // so we maintain a set of session IDs alongside the session data.\n return this.client.sMembers('axl:session-ids');\n }\n\n /** Close the Redis connection. */\n async close(): Promise<void> {\n await this.client.quit();\n }\n\n async deleteCheckpoints(executionId: string): Promise<void> {\n await this.client.del(this.checkpointKey(executionId));\n }\n}\n","import type { Embedder, EmbedResult } from './types.js';\nimport { fetchWithRetry } from '../providers/retry.js';\n\n/**\n * Per-million-token USD pricing for OpenAI embedding models.\n *\n * These values are hardcoded because (a) there's no pricing endpoint on\n * the OpenAI API and (b) the alternative is asking users to pass a\n * pricing table into every MemoryManager. Accept drift as a maintenance\n * cost — pricing changes ~yearly and we update this table in the same\n * commit as any rename/deprecation.\n *\n * Source: https://openai.com/api/pricing/ (embeddings section)\n * Last verified: April 2026.\n */\nconst EMBEDDING_PRICE_PER_1M_TOKENS: Record<string, number> = {\n 'text-embedding-3-small': 0.02,\n 'text-embedding-3-large': 0.13,\n 'text-embedding-ada-002': 0.1,\n};\n\n/**\n * Compute USD cost for a given model + token count.\n * Returns undefined for unknown models — we don't guess pricing, and a\n * missing cost is strictly better than a wrong cost in downstream math.\n */\nfunction computeCost(model: string, tokens: number): number | undefined {\n const pricePerMillion = EMBEDDING_PRICE_PER_1M_TOKENS[model];\n if (pricePerMillion == null) return undefined;\n return (tokens / 1_000_000) * pricePerMillion;\n}\n\n/**\n * OpenAI embeddings via raw fetch (zero SDK dependency).\n * Uses the /v1/embeddings endpoint.\n */\nexport class OpenAIEmbedder implements Embedder {\n private apiKey: string;\n private model: string;\n private baseUrl: string;\n readonly dimensions: number;\n\n constructor(\n options: {\n apiKey?: string;\n model?: string;\n baseUrl?: string;\n dimensions?: number;\n } = {},\n ) {\n this.apiKey = options.apiKey ?? process.env.OPENAI_API_KEY ?? '';\n if (!this.apiKey) {\n throw new Error('OpenAI API key is required for OpenAIEmbedder');\n }\n this.model = options.model ?? 'text-embedding-3-small';\n this.baseUrl = options.baseUrl ?? 'https://api.openai.com';\n this.dimensions = options.dimensions ?? 1536;\n }\n\n async embed(texts: string[], signal?: AbortSignal): Promise<EmbedResult> {\n // Use `fetchWithRetry` for consistency with the core provider adapters\n // (`openai`, `openai-responses`, `anthropic`, `gemini`) — transient\n // 429/503/529 responses get exponential-backoff retry with Retry-After\n // support. Without this, a rate-limited embed() call tanked the parent\n // `ctx.remember({embed:true})` and cost attribution silently lost the\n // call from observability.\n const response = await fetchWithRetry(`${this.baseUrl}/v1/embeddings`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n model: this.model,\n input: texts,\n dimensions: this.dimensions,\n }),\n signal,\n });\n\n if (!response.ok) {\n const body = await response.text();\n throw new Error(`OpenAI embeddings API error (${response.status}): ${body}`);\n }\n\n const json = (await response.json()) as {\n data: Array<{ embedding: number[]; index: number }>;\n usage?: { prompt_tokens?: number; total_tokens?: number };\n };\n\n // Sort by index to maintain input order\n const vectors = json.data.sort((a, b) => a.index - b.index).map((d) => d.embedding);\n\n // OpenAI's embeddings endpoint bills on prompt tokens; total_tokens\n // equals prompt_tokens for this endpoint but prefer the explicit field.\n const tokens = json.usage?.prompt_tokens ?? json.usage?.total_tokens;\n const cost = tokens != null ? computeCost(this.model, tokens) : undefined;\n\n // Only emit `usage` when the API actually reported something useful.\n // A bare `{ model }` with no tokens/cost would trigger downstream\n // byEmbedder bucketing that records zero-everything entries —\n // misleading at best. If neither tokens nor cost are available\n // (Azure proxy without a usage block, compat mode), omit `usage`\n // entirely and the cost/observability path short-circuits cleanly.\n if (tokens == null && cost == null) {\n return { vectors };\n }\n\n return {\n vectors,\n usage: {\n ...(tokens != null ? { tokens } : {}),\n ...(cost != null ? { cost } : {}),\n model: this.model,\n },\n };\n }\n}\n","import type { VectorStore, VectorEntry, VectorResult } from './types.js';\n\n/** Compute cosine similarity between two vectors. */\nfunction cosineSimilarity(a: number[], b: number[]): number {\n let dot = 0;\n let normA = 0;\n let normB = 0;\n for (let i = 0; i < a.length; i++) {\n dot += a[i] * b[i];\n normA += a[i] * a[i];\n normB += b[i] * b[i];\n }\n const denom = Math.sqrt(normA) * Math.sqrt(normB);\n return denom === 0 ? 0 : dot / denom;\n}\n\n/**\n * In-memory vector store using brute-force cosine similarity.\n * Suitable for testing and small datasets only.\n */\nexport class InMemoryVectorStore implements VectorStore {\n private entries = new Map<string, VectorEntry>();\n\n async upsert(entries: VectorEntry[]): Promise<void> {\n for (const entry of entries) {\n this.entries.set(entry.id, { ...entry });\n }\n }\n\n async search(embedding: number[], topK: number): Promise<VectorResult[]> {\n const results: VectorResult[] = [];\n\n for (const entry of this.entries.values()) {\n const score = cosineSimilarity(embedding, entry.embedding);\n results.push({\n id: entry.id,\n content: entry.content,\n score,\n metadata: entry.metadata,\n });\n }\n\n results.sort((a, b) => b.score - a.score);\n return results.slice(0, topK);\n }\n\n async delete(ids: string[]): Promise<void> {\n for (const id of ids) {\n this.entries.delete(id);\n }\n }\n}\n","import type { VectorStore, VectorEntry, VectorResult } from './types.js';\n\n/** Minimal interface for a better-sqlite3 database instance. */\ninterface BetterSqlite3Database {\n pragma(pragma: string): unknown;\n exec(sql: string): void;\n prepare(sql: string): {\n run(...params: unknown[]): unknown;\n all(...params: unknown[]): unknown[];\n };\n transaction<T extends (...args: never[]) => void>(fn: T): T;\n close(): void;\n}\n\n/**\n * SQLite-backed vector store using better-sqlite3.\n * Uses a simple serialized embedding column with brute-force cosine similarity in JS.\n * For production workloads, consider a dedicated vector database.\n *\n * This avoids dependency on sqlite-vec extension by computing similarity in JS\n * after retrieving all rows (brute-force scan). Suitable for small-to-medium datasets.\n */\nexport class SqliteVectorStore implements VectorStore {\n private db: BetterSqlite3Database;\n\n constructor(options: { path?: string } = {}) {\n let Database: new (path: string) => BetterSqlite3Database;\n try {\n Database = require('better-sqlite3');\n } catch {\n throw new Error(\n 'better-sqlite3 is required for SqliteVectorStore. Install it with: npm install better-sqlite3',\n );\n }\n this.db = new Database(options.path ?? ':memory:');\n this.db.pragma('journal_mode = WAL');\n this.initTables();\n }\n\n private initTables(): void {\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS vectors (\n id TEXT PRIMARY KEY,\n content TEXT NOT NULL,\n embedding TEXT NOT NULL,\n metadata TEXT\n )\n `);\n }\n\n async upsert(entries: VectorEntry[]): Promise<void> {\n const stmt = this.db.prepare(\n 'INSERT OR REPLACE INTO vectors (id, content, embedding, metadata) VALUES (?, ?, ?, ?)',\n );\n const tx = this.db.transaction((items: VectorEntry[]) => {\n for (const entry of items) {\n stmt.run(\n entry.id,\n entry.content,\n JSON.stringify(entry.embedding),\n entry.metadata ? JSON.stringify(entry.metadata) : null,\n );\n }\n });\n tx(entries);\n }\n\n async search(embedding: number[], topK: number): Promise<VectorResult[]> {\n const rows = this.db\n .prepare('SELECT id, content, embedding, metadata FROM vectors')\n .all() as Array<{\n id: string;\n content: string;\n embedding: string;\n metadata: string | null;\n }>;\n\n const results: VectorResult[] = rows.map((row) => {\n const storedEmbedding = JSON.parse(row.embedding) as number[];\n const score = cosineSimilarity(embedding, storedEmbedding);\n return {\n id: row.id,\n content: row.content,\n score,\n metadata: row.metadata ? JSON.parse(row.metadata) : undefined,\n };\n });\n\n results.sort((a, b) => b.score - a.score);\n return results.slice(0, topK);\n }\n\n async delete(ids: string[]): Promise<void> {\n if (ids.length === 0) return;\n const placeholders = ids.map(() => '?').join(',');\n this.db.prepare(`DELETE FROM vectors WHERE id IN (${placeholders})`).run(...ids);\n }\n\n async close(): Promise<void> {\n this.db.close();\n }\n}\n\n/** Compute cosine similarity between two vectors. */\nfunction cosineSimilarity(a: number[], b: number[]): number {\n let dot = 0;\n let normA = 0;\n let normB = 0;\n for (let i = 0; i < a.length; i++) {\n dot += a[i] * b[i];\n normA += a[i] * a[i];\n normB += b[i] * b[i];\n }\n const denom = Math.sqrt(normA) * Math.sqrt(normB);\n return denom === 0 ? 0 : dot / denom;\n}\n"],"mappings":"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","names":["resolve","sleep","resolve","tool","THINKING_BUDGETS","tool","providerName","model","agent","costAfter","content","toolArgs","toolStart","toolResult","resultContent","tool","summaryMsg","recentTokens","splitIdx","n","parentSignal","resolve","result","decision","import_node_crypto","import_node_events","import_node_crypto","import_node_async_hooks","import_node_fs","import_node_path","resolve","resolve","tool","OTelSpanManager","workflow","result","import_node_path","import_node_fs","fileGlob","cosineSimilarity"]}
|