@axlsdk/axl 0.7.6 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +29 -6
- package/dist/index.cjs +164 -52
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +46 -3
- package/dist/index.d.ts +46 -3
- package/dist/index.js +163 -52
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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/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/mcp/client.ts","../src/mcp/manager.ts","../src/memory/manager.ts","../src/telemetry/noop.ts","../src/telemetry/index.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 } from './workflow.js';\n\n// Runtime\nexport { AxlRuntime } from './runtime.js';\nexport { defineConfig } from './config.js';\nexport type { AxlConfig } from './config.js';\n\n// Stream\nexport { AxlStream } from './stream.js';\n\n// Session\nexport { Session } from './session.js';\nexport type { SessionOptions } from './session.js';\n\n// Context\nexport { WorkflowContext, zodToJsonSchema } from './context.js';\nexport type { WorkflowContextInit } from './context.js';\nexport type {\n Result,\n BudgetResult,\n HumanDecision,\n TraceEvent,\n StreamEvent,\n AskOptions,\n DelegateOptions,\n RaceOptions,\n VoteOptions,\n VerifyOptions,\n BudgetOptions,\n SpawnOptions,\n MapOptions,\n AwaitHumanOptions,\n ExecutionInfo,\n GuardrailResult,\n InputGuardrail,\n OutputGuardrail,\n GuardrailBlockHandler,\n GuardrailsConfig,\n HandoffRecord,\n AgentCallInfo,\n} from './types.js';\n\n// Errors\nexport {\n AxlError,\n VerifyError,\n QuorumNotMet,\n NoConsensus,\n TimeoutError,\n MaxTurnsError,\n ToolDenied,\n BudgetExceededError,\n GuardrailError,\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 { StateStore, ExecutionState, PendingDecision } 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 { 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 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.ZodTypeAny, 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.ZodTypeAny = z.ZodTypeAny, 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.ZodTypeAny, 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 doesn't have a native JSON mode like OpenAI's json_object.\n // Instead, we append a system-level instruction requesting valid JSON output.\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// 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 = options.responseFormat.json_schema.schema;\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: 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 { type 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 TraceEvent,\n ChatMessage,\n ToolCallMessage,\n ProviderResponse,\n AgentCallInfo,\n} from './types.js';\nimport {\n VerifyError,\n QuorumNotMet,\n NoConsensus,\n TimeoutError,\n MaxTurnsError,\n BudgetExceededError,\n GuardrailError,\n} from './errors.js';\nimport type { Agent } from './agent.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 * Convert a Zod schema to a JSON Schema object for tool definitions.\n *\n * Handles: string, number, boolean, array, object, optional, default, enum,\n * literal, union, nullable.\n *\n * Not handled: discriminated unions, branded types, transforms, refinements,\n * lazy, record, map, set, tuple, intersection. These fall through to an\n * empty object `{}`.\n */\n/** Internal Zod _def shape used by zodToJsonSchema to traverse schemas. */\ninterface ZodDef {\n typeName: string;\n type?: z.ZodTypeAny;\n shape?: () => Record<string, z.ZodTypeAny>;\n innerType?: z.ZodTypeAny;\n values?: string[];\n value?: unknown;\n options?: z.ZodTypeAny[];\n}\n\n/** Convert a Zod schema to JSON Schema (subset). Exported for Studio tool introspection. */\nexport function zodToJsonSchema(schema: z.ZodTypeAny): unknown {\n const def = (schema as unknown as { _def: ZodDef })._def;\n if (!def || !def.typeName) return {};\n\n switch (def.typeName) {\n case 'ZodString':\n return { type: 'string' };\n case 'ZodNumber':\n return { type: 'number' };\n case 'ZodBoolean':\n return { type: 'boolean' };\n case 'ZodArray':\n return { type: 'array', items: zodToJsonSchema(def.type!) };\n case 'ZodObject': {\n const shape = def.shape?.() ?? {};\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n for (const [key, value] of Object.entries(shape)) {\n properties[key] = zodToJsonSchema(value);\n const innerDef = (value as unknown as { _def: ZodDef })._def;\n if (innerDef?.typeName !== 'ZodOptional' && innerDef?.typeName !== 'ZodDefault') {\n required.push(key);\n }\n }\n return { type: 'object', properties, required: required.length > 0 ? required : undefined };\n }\n case 'ZodOptional':\n return zodToJsonSchema(def.innerType!);\n case 'ZodDefault':\n return zodToJsonSchema(def.innerType!);\n case 'ZodEnum':\n return { type: 'string', enum: def.values };\n case 'ZodLiteral': {\n const v = def.value;\n const t = v === null ? 'null' : typeof v;\n return { type: t, const: v };\n }\n case 'ZodUnion':\n return { oneOf: def.options!.map((o: z.ZodTypeAny) => zodToJsonSchema(o)) };\n case 'ZodNullable':\n return { ...(zodToJsonSchema(def.innerType!) as object), nullable: true };\n default:\n return {};\n }\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/** Strip markdown code fences (```json ... ```) from LLM responses before JSON parsing. */\nfunction stripMarkdownFences(text: string): string {\n const trimmed = text.trim();\n if (trimmed.startsWith('```')) {\n // Remove opening fence (```json, ```JSON, ``` etc.) and closing ```\n const withoutOpening = trimmed.replace(/^```\\w*\\s*\\n?/, '');\n const withoutClosing = withoutOpening.replace(/\\n?```\\s*$/, '');\n return withoutClosing.trim();\n }\n return trimmed;\n}\n\n/** Estimate tokens for a message array. */\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: TraceEvent) => void;\n onToken?: (token: string) => void;\n onToolCall?: (call: { name: string; args: unknown }) => 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 }) => void;\n /** Callback fired after each ctx.ask() completes (once per ask invocation). */\n onAgentCallComplete?: (call: AgentCallInfo) => void;\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 private config: AxlConfig;\n private providerRegistry: ProviderRegistry;\n private sessionHistory: ChatMessage[];\n private onTrace?: (event: TraceEvent) => void;\n private onToken?: (token: string) => void;\n private onToolCall?: (call: { name: string; args: unknown }) => 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 private stepCounter = 0;\n private checkpointCounter = 0;\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 }) => 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 // 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.\n * Isolates: session history, step counter, streaming callbacks (onToken, onAgentStart, onToolCall).\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 onAgentCallComplete: this.onAgentCallComplete,\n awaitHumanHandler: this.awaitHumanHandler,\n pendingDecisions: this.pendingDecisions,\n toolOverrides: this.toolOverrides,\n signal: this.signal,\n workflowName: this.workflowName,\n // Isolated: sessionHistory (empty), stepCounter (0),\n // onToken (null), onAgentStart (null), onToolCall (null)\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 // ── ctx.ask() ─────────────────────────────────────────────────────────\n\n async ask<T = string>(agent: Agent, prompt: string, options?: AskOptions<T>): Promise<T> {\n return this._checkpoint(async () => {\n const costBefore = this.budgetContext?.totalCost ?? 0;\n const startTime = Date.now();\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 without\n // relying on an instance property (which is racy under 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,\n 0,\n undefined,\n undefined,\n undefined,\n usageCapture,\n );\n return result as T;\n };\n\n const result = 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() - startTime);\n if (usageCapture.value) {\n span.setAttribute('axl.agent.prompt_tokens', usageCapture.value.prompt_tokens);\n span.setAttribute(\n 'axl.agent.completion_tokens',\n usageCapture.value.completion_tokens,\n );\n if (usageCapture.value.cached_tokens)\n span.setAttribute('axl.agent.cached_tokens', usageCapture.value.cached_tokens);\n }\n return r;\n },\n )\n : await doCall();\n\n const costAfter = this.budgetContext?.totalCost ?? 0;\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() - startTime,\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 return result;\n });\n }\n\n private async executeAgentCall(\n agent: Agent,\n prompt: string,\n options?: AskOptions<unknown>,\n retryCount = 0,\n previousOutput?: string,\n previousError?: string,\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.emitTrace({\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.ZodTypeAny);\n userContent += `\\n\\nRespond with valid JSON matching this schema:\\n${JSON.stringify(jsonSchema, null, 2)}`;\n }\n\n // Self-correction: include previous failed output\n if (previousOutput && previousError) {\n userContent += `\\n\\nYour previous response was invalid:\\n${previousOutput}\\n\\nError: ${previousError}\\n\\nPlease fix and try again.`;\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.emitTrace({\n type: 'guardrail',\n agent: agent._name,\n data: { guardrailType: 'input', blocked: inputResult.block, reason: inputResult.reason },\n });\n this.spanManager?.addEventToActiveSpan('axl.guardrail.check', {\n 'axl.guardrail.type': 'input',\n 'axl.guardrail.blocked': inputResult.block,\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 const currentMessages = [...messages];\n let turns = 0;\n let guardrailOutputRetries = 0;\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\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 this.onAgentStart?.({ agent: agent._name, model: modelUri });\n\n let response: ProviderResponse;\n\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<string, { id: string; name: string; arguments: string }>();\n let streamProviderMetadata: Record<string, unknown> | undefined;\n\n let thinkingContent = '';\n\n for await (const chunk of provider.stream(currentMessages, chatOptions)) {\n if (chunk.type === 'text_delta') {\n content += chunk.content;\n this.onToken(chunk.content);\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\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 if (this.budgetContext) {\n this.budgetContext.totalCost += response.cost;\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\n this.emitTrace({\n type: 'agent_call',\n agent: agent._name,\n model: modelUri,\n promptVersion: agent._config.version,\n cost: response.cost,\n duration: Date.now() - startTime,\n data: { prompt, response: response.content },\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\n // Pass accumulated messages so the target agent can see the source agent's work.\n // Only forward schema/retries/metadata — the target agent uses its own model params.\n const handoffOptions = options\n ? { schema: options.schema, retries: options.retries, metadata: options.metadata }\n : undefined;\n const handoffFn = () =>\n this.executeAgentCall(\n descriptor.agent,\n handoffPrompt,\n handoffOptions,\n 0,\n undefined,\n undefined,\n currentMessages,\n usageCapture,\n );\n\n if (mode === 'roundtrip') {\n // Roundtrip: execute target, feed result back to source as tool response\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 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 const result = await executeRoundtrip();\n const duration = Date.now() - handoffStart;\n span.setAttribute('axl.handoff.duration', duration);\n this.emitTrace({\n type: 'handoff',\n agent: agent._name,\n data: { target: targetName, mode, duration },\n });\n return result;\n },\n );\n } else {\n await executeRoundtrip();\n this.emitTrace({\n type: 'handoff',\n agent: agent._name,\n data: { target: targetName, mode, duration: Date.now() - handoffStart },\n });\n }\n continue; // Source agent loop continues\n }\n\n // Oneway (default): return target's result, exiting source's loop\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 const duration = Date.now() - handoffStart;\n span.setAttribute('axl.handoff.duration', duration);\n this.emitTrace({\n type: 'handoff',\n agent: agent._name,\n data: { target: targetName, mode, duration },\n });\n return result;\n },\n );\n }\n const onewayResult = await handoffFn();\n this.emitTrace({\n type: 'handoff',\n agent: agent._name,\n data: { target: targetName, mode, duration: Date.now() - handoffStart },\n });\n return onewayResult;\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.onToolCall?.({ name: toolName, args: toolArgs });\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.emitTrace({\n type: 'tool_call',\n agent: agent._name,\n tool: toolName,\n duration: Date.now() - toolStart,\n data: { args: toolArgs, result: toolResult },\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.emitTrace({ 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.onToolCall?.({ name: toolName, args: toolArgs });\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<boolean> => {\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 this.emitTrace({\n type: 'tool_denied',\n agent: agent._name,\n tool: toolName,\n data: { denied: true, reason, args: toolArgs },\n });\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 false;\n }\n return true;\n };\n\n let approved: boolean;\n if (this.spanManager) {\n approved = 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);\n return result;\n },\n );\n } else {\n approved = await approvalFn();\n }\n\n if (!approved) continue;\n\n // Emit approval-succeeded trace so the stream handler can emit a tool_approval event\n this.emitTrace({\n type: 'tool_denied',\n agent: agent._name,\n tool: toolName,\n data: { denied: false, args: toolArgs },\n });\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 invocations\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.emitTrace({\n type: 'tool_call',\n agent: agent._name,\n tool: traceName,\n duration: Date.now() - toolStart,\n data: { args: toolArgs, result: toolResult },\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 // -- Output guardrail --\n if (guardrails?.output) {\n const outputResult = await guardrails.output(content, { metadata: this.metadata });\n this.emitTrace({\n type: 'guardrail',\n agent: agent._name,\n data: {\n guardrailType: 'output',\n blocked: outputResult.block,\n reason: outputResult.reason,\n },\n });\n this.spanManager?.addEventToActiveSpan('axl.guardrail.check', {\n 'axl.guardrail.type': 'output',\n 'axl.guardrail.blocked': outputResult.block,\n ...(outputResult.reason ? { 'axl.guardrail.reason': outputResult.reason } : {}),\n });\n if (outputResult.block) {\n const onBlock = guardrails.onBlock ?? 'throw';\n if (onBlock === 'retry') {\n const maxGuardrailRetries = guardrails.maxRetries ?? 2;\n if (guardrailOutputRetries < maxGuardrailRetries) {\n guardrailOutputRetries++;\n currentMessages.push({\n role: 'assistant',\n content,\n ...(response.providerMetadata\n ? { providerMetadata: response.providerMetadata }\n : {}),\n });\n currentMessages.push({\n role: 'system',\n content: `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 continue; // Re-enter the while loop for another LLM turn\n }\n // Max retries exhausted — fall through to throw\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 // Schema validation if requested\n if (options?.schema) {\n try {\n const parsed = JSON.parse(stripMarkdownFences(content));\n const validated = (options.schema as z.ZodTypeAny).parse(parsed);\n // Push only on successful validation — retries must not leak invalid responses\n this.pushAssistantToSessionHistory(content, response.providerMetadata);\n return validated;\n } catch (err) {\n const maxRetries = options.retries ?? 3;\n if (retryCount < maxRetries) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n return this.executeAgentCall(\n agent,\n prompt,\n options,\n retryCount + 1,\n content,\n errorMsg,\n undefined,\n usageCapture,\n );\n }\n const zodErr =\n err instanceof ZodError\n ? err\n : new ZodError([\n {\n code: 'custom',\n path: [],\n message: err instanceof Error ? err.message : String(err),\n },\n ]);\n throw new VerifyError(content, zodErr, maxRetries);\n }\n }\n\n // Push final assistant message to session history (preserves providerMetadata\n // for multi-turn Gemini thought signatures and other provider-specific context).\n this.pushAssistantToSessionHistory(content, response.providerMetadata);\n return 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, and returns it.\n * On replay (resume after restart), returns the saved result without re-executing.\n * This prevents duplicate side effects (double API calls, double refunds, etc.).\n */\n async checkpoint<T>(fn: () => Promise<T>): Promise<T> {\n return this._checkpoint(fn);\n }\n\n /**\n * Internal checkpoint implementation shared by both the public checkpoint()\n * and the automatic checkpointing in ask/spawn/race/parallel/map.\n */\n private async _checkpoint<T>(fn: () => Promise<T>): Promise<T> {\n const step = this.checkpointCounter++;\n\n // If no state store, just execute without persistence\n if (!this.stateStore) {\n return fn();\n }\n\n // Check for a saved checkpoint from a previous execution\n const saved = await this.stateStore.getCheckpoint(this.executionId, step);\n if (saved !== null) {\n this.emitTrace({\n type: 'log',\n data: { event: 'checkpoint_replay', step },\n });\n this.spanManager?.addEventToActiveSpan('axl.checkpoint.hit', { 'axl.checkpoint.step': step });\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, step, result);\n\n this.emitTrace({\n type: 'log',\n data: { event: 'checkpoint_save', step },\n });\n this.spanManager?.addEventToActiveSpan('axl.checkpoint.miss', { 'axl.checkpoint.step': step });\n\n return result;\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(() => {\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: (lastOutput?: unknown, errorMessage?: string) => Promise<unknown>,\n schema: z.ZodType<T>,\n options?: VerifyOptions<T>,\n ): Promise<T> {\n const maxRetries = options?.retries ?? 3;\n let lastOutput: unknown = undefined;\n let lastErrorMessage: string | undefined = undefined;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n let result: unknown;\n try {\n result = await fn(lastOutput, lastErrorMessage);\n lastOutput = result;\n return schema.parse(result) as T;\n } catch (err) {\n if (err instanceof ZodError) {\n lastErrorMessage = err.message;\n } else if (err instanceof Error) {\n lastErrorMessage = err.message;\n } else {\n lastErrorMessage = String(err);\n }\n\n if (attempt === maxRetries) {\n if (options?.fallback !== undefined) return options.fallback;\n const zodErr =\n err instanceof ZodError\n ? err\n : new ZodError([{ code: 'custom', path: [], message: lastErrorMessage }]);\n throw new VerifyError(lastOutput, zodErr, maxRetries);\n }\n }\n }\n\n if (options?.fallback !== undefined) return options.fallback;\n throw new VerifyError(\n lastOutput,\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(() => {\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.ZodTypeAny | 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((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 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(() => Promise.all(fns.map((fn) => fn())) as Promise<T>);\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._mapImpl(items, fn, options));\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 const decision = await this.awaitHumanHandler(options);\n this.emitTrace({\n type: 'log',\n data: { event: 'await_human_resolved', channel: options.channel, decision },\n });\n return decision;\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.stepCounter,\n status: 'waiting',\n metadata: {\n ...this.metadata,\n awaitHumanChannel: options.channel,\n awaitHumanPrompt: options.prompt,\n },\n });\n }\n\n this.emitTrace({\n type: 'log',\n data: { event: 'await_human', 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 // 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.stepCounter,\n status: 'running',\n });\n }\n\n return decision;\n }\n\n // ── ctx.log() ─────────────────────────────────────────────────────────\n\n log(event: string, data?: unknown): void {\n this.emitTrace({\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 const sessionId = this.metadata?.sessionId as string | undefined;\n await this.memoryManager.remember(key, value, this.stateStore, sessionId, options);\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 const sessionId = this.metadata?.sessionId as string | undefined;\n return this.memoryManager.recall(key, this.stateStore, sessionId, options);\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 await this.memoryManager.forget(key, this.stateStore, sessionId, options);\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 return this.ask(agents[0], prompt, {\n schema: options?.schema,\n retries: options?.retries,\n metadata: options?.metadata,\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.emitTrace({\n type: 'delegate',\n agent: '_delegate_router',\n data: {\n candidates: agents.map((a) => a._name),\n routerModel: routerModelUri,\n },\n });\n\n return this.ask(routerAgent, prompt, {\n schema: options?.schema,\n retries: options?.retries,\n metadata: options?.metadata,\n });\n }\n\n // ── Private ───────────────────────────────────────────────────────────\n\n private emitTrace(partial: Omit<TraceEvent, 'executionId' | 'step' | 'timestamp'>): void {\n let data = partial.data;\n if (this.config.trace?.redact && partial.type === 'agent_call' && data) {\n data = { ...(data as Record<string, unknown>), prompt: '[redacted]', response: '[redacted]' };\n }\n const event: TraceEvent = {\n executionId: this.executionId,\n step: this.stepCounter++,\n timestamp: Date.now(),\n ...partial,\n data,\n };\n this.onTrace?.(event);\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/** 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 $${spent.toFixed(4)} of $${limit.toFixed(4)} 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/** 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","/** 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\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.ZodTypeAny = z.ZodTypeAny,\n TOutput extends z.ZodTypeAny = z.ZodTypeAny,\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.ZodTypeAny = z.ZodTypeAny,\n TOutput extends z.ZodTypeAny = z.ZodTypeAny,\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 * 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.ZodTypeAny, TOutput extends z.ZodTypeAny = z.ZodTypeAny>(\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 { appendFileSync, mkdirSync } from 'node:fs';\nimport { dirname } from 'node:path';\nimport type { AxlConfig } from './config.js';\nimport { resolveConfig } from './config.js';\nimport type { Workflow } 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 } 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 TraceEvent,\n ExecutionInfo,\n HumanDecision,\n ChatMessage,\n HandoffRecord,\n} from './types.js';\nimport { NoopSpanManager } from './telemetry/noop.js';\nimport { createSpanManager } from './telemetry/index.js';\nimport type { SpanManager } from './telemetry/types.js';\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\nexport type ExecuteOptions = {\n metadata?: Record<string, unknown>;\n};\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 {\n config: unknown;\n executeWorkflow?: (input: unknown) => Promise<{ output: unknown; cost?: number }>;\n }\n >();\n private mcpManager?: McpManager;\n private memoryManager?: MemoryManager;\n private spanManager: SpanManager = new NoopSpanManager();\n\n constructor(config?: AxlConfig) {\n super();\n this.config = resolveConfig(config ?? {});\n this.providerRegistry = new ProviderRegistry();\n this.stateStore = this.createStateStore();\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 * 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 /** Register a workflow with the runtime. */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n register(workflow: Workflow<any, any>): 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(\n name: string,\n config: unknown,\n executeWorkflow?: (input: unknown) => Promise<{ output: unknown; cost?: number }>,\n ): 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(name: string):\n | {\n config: unknown;\n executeWorkflow?: (input: unknown) => Promise<{ output: unknown; cost?: number }>;\n }\n | undefined {\n return this.registeredEvals.get(name);\n }\n\n /** Run a registered eval by name. */\n async runRegisteredEval(name: string): Promise<unknown> {\n const entry = this.registeredEvals.get(name);\n if (!entry) throw new Error(`Eval \"${name}\" is not registered`);\n\n if (entry.executeWorkflow) {\n // Use custom executeWorkflow if provided\n let runEvalFn: (\n config: unknown,\n executeFn: (input: unknown) => Promise<{ output: unknown; cost?: number }>,\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 return runEvalFn(entry.config, entry.executeWorkflow);\n }\n\n // Default: use runtime.eval() which creates its own executeWorkflow\n return 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 }\n\n /** Get all execution info (running + completed). */\n getExecutions(): ExecutionInfo[] {\n return [...this.executions.values()];\n }\n\n /**\n * Create a lightweight WorkflowContext for ad-hoc use (tool testing, prototyping).\n * The context has access to the runtime's providers, state store, and MCP manager\n * but no session history, streaming callbacks, or budget tracking.\n */\n createContext(options?: { metadata?: Record<string, unknown> }): WorkflowContext {\n return new WorkflowContext({\n input: undefined,\n executionId: randomUUID(),\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 });\n }\n\n /** Register a custom provider instance. */\n registerProvider(name: string, provider: Provider): void {\n this.providerRegistry.registerInstance(name, provider);\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 // Create execution info\n const execInfo: ExecutionInfo = {\n executionId,\n workflow: name,\n status: 'running',\n steps: [],\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: TraceEvent) => {\n execInfo.steps.push(event);\n if (event.cost) execInfo.totalCost += event.cost;\n this.emit('trace', event);\n this.outputTraceEvent(event);\n // Persist handoff records to session metadata\n if (event.type === 'handoff') {\n const sessionId = options?.metadata?.sessionId as string | undefined;\n if (sessionId) {\n const data = event.data as Record<string, unknown> | undefined;\n this.appendHandoffRecord(sessionId, {\n source: event.agent ?? '',\n target: (data?.target as string) ?? '',\n mode: (data?.mode as 'oneway' | 'roundtrip') ?? 'oneway',\n timestamp: event.timestamp,\n duration: (data?.duration as number) ?? undefined,\n });\n }\n }\n },\n pendingDecisions: this.pendingDecisionResolvers,\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 });\n\n // Emit workflow start trace\n ctx.log('workflow_start', { workflow: name, executionId });\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 async (span) => {\n try {\n const result = await workflow.handler(ctx);\n\n // Validate (and coerce) output if schema exists\n const output = workflow.outputSchema ? workflow.outputSchema.parse(result) : result;\n\n execInfo.status = 'completed';\n execInfo.completedAt = Date.now();\n execInfo.duration = execInfo.completedAt - execInfo.startedAt;\n ctx.log('workflow_end', {\n workflow: name,\n status: 'completed',\n duration: execInfo.duration,\n cost: execInfo.totalCost,\n });\n\n // Clean up checkpoints for completed execution\n if (this.stateStore.deleteCheckpoints) {\n await this.stateStore.deleteCheckpoints(executionId);\n }\n\n span.setAttribute('axl.workflow.cost', execInfo.totalCost);\n span.setAttribute('axl.workflow.duration', execInfo.duration);\n\n return output;\n } catch (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.log('workflow_end', { workflow: name, status: 'failed', error: execInfo.error });\n throw err;\n } finally {\n this.abortControllers.delete(executionId);\n }\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 // Execute asynchronously, piping events to the stream\n // execInfo is captured by the closure so the catch handler can update it on error.\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 executionId = randomUUID();\n this.abortControllers.set(executionId, controller);\n const sessionHistory = (options?.metadata?.sessionHistory as ChatMessage[]) ?? undefined;\n\n // Create execution info for stream executions\n execInfo = {\n executionId,\n workflow: name,\n status: 'running',\n steps: [],\n totalCost: 0,\n startedAt: Date.now(),\n duration: 0,\n };\n this.executions.set(executionId, execInfo);\n\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: TraceEvent) => {\n execInfo!.steps.push(event);\n if (event.cost) execInfo!.totalCost += event.cost;\n this.emit('trace', event);\n this.outputTraceEvent(event);\n // Emit typed stream events for specific trace types\n if (event.type === 'handoff') {\n const data = event.data as Record<string, unknown> | undefined;\n axlStream._push({\n type: 'handoff',\n source: event.agent ?? '',\n target: (data?.target as string) ?? '',\n mode: (data?.mode as 'oneway' | 'roundtrip') ?? undefined,\n });\n // Persist handoff records to session metadata\n const sessionId = options?.metadata?.sessionId as string | undefined;\n if (sessionId) {\n this.appendHandoffRecord(sessionId, {\n source: event.agent ?? '',\n target: (data?.target as string) ?? '',\n mode: (data?.mode as 'oneway' | 'roundtrip') ?? 'oneway',\n timestamp: event.timestamp,\n duration: (data?.duration as number) ?? undefined,\n });\n }\n } else if (event.type === 'tool_denied') {\n const data = event.data as Record<string, unknown> | undefined;\n if (data?.denied === false) {\n // Approval succeeded\n axlStream._push({\n type: 'tool_approval',\n name: event.tool ?? '',\n args: data?.args,\n approved: true,\n });\n } else {\n // Approval denied\n axlStream._push({\n type: 'tool_approval',\n name: event.tool ?? '',\n args: data?.args,\n approved: false,\n reason: (data?.reason as string) ?? undefined,\n });\n }\n } else if (event.type === 'agent_call') {\n axlStream._push({\n type: 'agent_end',\n agent: event.agent ?? '',\n cost: event.cost,\n duration: event.duration,\n });\n } else if (event.type === 'tool_call') {\n axlStream._push({\n type: 'tool_result',\n name: event.tool ?? '',\n result: (event.data as Record<string, unknown>)?.result,\n });\n }\n // Always emit raw step event for backwards compat\n axlStream._push({ type: 'step', step: event.step, data: event });\n },\n onToken: (token: string) => {\n axlStream._push({ type: 'token', data: token });\n },\n onToolCall: (call: { name: string; args: unknown }) => {\n axlStream._push({ type: 'tool_call', name: call.name, args: call.args });\n },\n onAgentStart: (info: { agent: string; model: string }) => {\n axlStream._push({ type: 'agent_start', agent: info.agent, model: info.model });\n },\n pendingDecisions: this.pendingDecisionResolvers,\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 });\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 async (span) => {\n try {\n const rawResult = await workflow.handler(ctx);\n const result = workflow.outputSchema\n ? workflow.outputSchema.parse(rawResult)\n : rawResult;\n\n execInfo!.status = 'completed';\n execInfo!.completedAt = Date.now();\n execInfo!.duration = execInfo!.completedAt - execInfo!.startedAt;\n\n // Clean up checkpoints for completed execution\n if (this.stateStore.deleteCheckpoints) {\n await this.stateStore.deleteCheckpoints(executionId);\n }\n\n span.setAttribute('axl.workflow.cost', execInfo!.totalCost);\n span.setAttribute('axl.workflow.duration', execInfo!.duration);\n\n return result;\n } finally {\n this.abortControllers.delete(executionId);\n }\n },\n );\n };\n\n run()\n .then((result) => axlStream._done(result))\n .catch((err) => {\n // Update execution status on error\n if (execInfo) {\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 }\n axlStream._error(err instanceof Error ? err : new Error(String(err)));\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 return this.executions.get(executionId);\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(config: {\n workflow: string;\n dataset: unknown;\n scorers: unknown[];\n concurrency?: number;\n budget?: string;\n metadata?: Record<string, unknown>;\n }): Promise<unknown> {\n let runEval: (\n config: unknown,\n executeFn: (input: unknown) => Promise<{ output: unknown; cost?: number }>,\n ) => Promise<unknown>;\n try {\n // @ts-expect-error — @axlsdk/eval is an optional peer dependency\n ({ runEval } = 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 (input: unknown): Promise<{ output: unknown; cost?: number }> => {\n let cost = 0;\n const costListener = (event: TraceEvent) => {\n if (event.cost) cost += event.cost;\n };\n this.on('trace', costListener);\n try {\n const output = await this.execute(config.workflow, input);\n return { output, cost };\n } finally {\n this.off('trace', costListener);\n }\n };\n\n return runEval(config, executeWorkflow);\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): Promise<unknown> {\n let evalCompareFn: (baseline: unknown, candidate: unknown) => Promise<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);\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 outputTraceEvent(event: TraceEvent): 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.logTraceEvent(event);\n }\n\n private logTraceEvent(event: TraceEvent): 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 const data = event.data as { workflow?: string } | undefined;\n\n if (event.type === 'workflow_start') {\n parts.push(`${workflowPrefix}workflow:${data?.workflow ?? 'unknown'} | started`);\n } else if (event.type === 'workflow_end') {\n parts.push(`${workflowPrefix}workflow:${data?.workflow ?? 'unknown'} | completed`);\n } else if (event.type === 'agent_call') {\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') {\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 if (level === 'full' && event.data) {\n parts.push(`data:${JSON.stringify(event.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","import { writeFileSync, readFileSync, existsSync, mkdirSync, unlinkSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport type { ChatMessage, HumanDecision } from '../types.js';\nimport type { StateStore, PendingDecision, ExecutionState } 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<number, 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\n constructor() {\n // Load any persisted awaitHuman state from previous process\n this.loadPersistedState();\n }\n\n async saveCheckpoint(executionId: string, step: number, data: unknown): Promise<void> {\n let steps = this.checkpoints.get(executionId);\n if (!steps) {\n steps = new Map();\n this.checkpoints.set(executionId, steps);\n }\n steps.set(step, structuredClone(data));\n }\n\n async getCheckpoint(executionId: string, step: number): Promise<unknown | null> {\n const steps = this.checkpoints.get(executionId);\n if (!steps) return null;\n const data = steps.get(step);\n return data !== undefined ? structuredClone(data) : null;\n }\n\n async getLatestCheckpoint(executionId: string): Promise<{ step: number; data: unknown } | null> {\n const steps = this.checkpoints.get(executionId);\n if (!steps || steps.size === 0) return null;\n let maxStep = -1;\n for (const step of steps.keys()) {\n if (step > maxStep) maxStep = step;\n }\n return { step: maxStep, data: structuredClone(steps.get(maxStep)) };\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]) => ({ key, value }));\n }\n\n async deleteMemory(scope: string, key: string): Promise<void> {\n this.memories.get(scope)?.delete(key);\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, HumanDecision } from '../types.js';\nimport type { StateStore, PendingDecision, ExecutionState } 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\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.initTables();\n }\n\n private initTables(): void {\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS checkpoints (\n execution_id TEXT NOT NULL,\n step INTEGER NOT NULL,\n data TEXT NOT NULL,\n PRIMARY KEY (execution_id, step)\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 }\n\n // ── Checkpoints ────────────────────────────────────────────────────────\n\n async saveCheckpoint(executionId: string, step: number, data: unknown): Promise<void> {\n const stmt = this.db.prepare(\n 'INSERT OR REPLACE INTO checkpoints (execution_id, step, data) VALUES (?, ?, ?)',\n );\n stmt.run(executionId, step, JSON.stringify(data));\n }\n\n async getCheckpoint(executionId: string, step: number): Promise<unknown | null> {\n const stmt = this.db.prepare(\n 'SELECT data FROM checkpoints WHERE execution_id = ? AND step = ?',\n );\n const row = stmt.get(executionId, step) as { data: string } | undefined;\n return row ? safeJsonParse(row.data) : null;\n }\n\n async getLatestCheckpoint(executionId: string): Promise<{ step: number; data: unknown } | null> {\n const stmt = this.db.prepare(\n 'SELECT step, data FROM checkpoints WHERE execution_id = ? ORDER BY step DESC LIMIT 1',\n );\n const row = stmt.get(executionId) as { step: number; data: string } | undefined;\n return row ? { step: row.step, data: 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 // ── 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 updateHistory((event as { data: unknown }).data).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 type { StreamEvent } from './types.js';\n\n/**\n * A streamable workflow execution.\n *\n * Extends Node's Readable and implements AsyncIterable<StreamEvent>.\n * Supports .on() events, for-await-of, .text iterator, and .pipe().\n */\nexport class AxlStream extends Readable {\n private bus = new EventEmitter();\n private tokens: string[] = [];\n private result: unknown = undefined;\n private finished = false;\n readonly promise: Promise<unknown>;\n private eventQueue: StreamEvent[] = [];\n private waiters: Array<(value: IteratorResult<StreamEvent>) => 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 }\n\n private static readonly STREAM_EVENTS = new Set([\n 'token',\n 'tool_call',\n 'tool_result',\n 'tool_approval',\n 'agent_start',\n 'agent_end',\n 'handoff',\n 'step',\n 'done',\n 'error',\n ]);\n\n on(event: string, handler: (...args: unknown[]) => void): this {\n if (AxlStream.STREAM_EVENTS.has(event)) {\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)) {\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<StreamEvent>> => {\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 StreamEvent, 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 if (value.type === 'token') return { value: value.data, done: false };\n }\n },\n };\n },\n };\n }\n\n get steps(): AsyncIterable<StreamEvent> {\n const stepTypes = new Set([\n 'agent_start',\n 'agent_end',\n 'tool_call',\n 'tool_result',\n 'tool_approval',\n 'handoff',\n ]);\n const self = this;\n return {\n [Symbol.asyncIterator](): AsyncIterator<StreamEvent> {\n const iter = self[Symbol.asyncIterator]();\n return {\n async next(): Promise<IteratorResult<StreamEvent>> {\n while (true) {\n const { value, done } = await iter.next();\n if (done) return { value: undefined as unknown as StreamEvent, done: true };\n if (stepTypes.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: StreamEvent) => {\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 a stream event. Called by the runtime. */\n _push(event: StreamEvent): void {\n if (this.finished) return;\n if (event.type === 'token') this.tokens.push(event.data);\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 /** Signal successful completion. */\n _done(result: unknown): void {\n if (this.finished) return;\n this.finished = true;\n this.result = result;\n const doneEvent: StreamEvent = { type: 'done', data: result };\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 StreamEvent, done: true });\n }\n this.waiters.length = 0;\n this.bus.emit('__resolve', result);\n }\n\n /** Signal an error. */\n _error(error: Error): void {\n if (this.finished) return;\n this.finished = true;\n const errorEvent: StreamEvent = { type: 'error', error };\n this.bus.emit('error', errorEvent);\n this.push(null);\n for (const w of this.waiters) {\n w({ value: undefined as unknown as StreamEvent, done: true });\n }\n this.waiters.length = 0;\n this.bus.emit('__reject', error);\n }\n\n get fullText(): string {\n return this.tokens.join('');\n }\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 VectorResult,\n RememberOptions,\n RecallOptions,\n} from './types.js';\nimport type { StateStore } from '../state/types.js';\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 async remember(\n key: string,\n value: unknown,\n stateStore: StateStore,\n sessionId: string | undefined,\n options?: RememberOptions,\n ): Promise<void> {\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 [embedding] = await this.embedder.embed([text]);\n await this.vectorStore.upsert([\n {\n id: `${storeScope}:${key}`,\n content: text,\n embedding,\n metadata: { key, scope, ...options?.metadata },\n },\n ]);\n }\n }\n\n /**\n * Recall a value from memory by key, or perform semantic search if query is provided.\n */\n async recall(\n key: string,\n stateStore: StateStore,\n sessionId: string | undefined,\n options?: RecallOptions,\n ): Promise<unknown | VectorResult[] | null> {\n // Semantic search mode\n if (options?.query && this.vectorStore && this.embedder) {\n const [embedding] = await this.embedder.embed([options.query]);\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(embedding, 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 return filtered.slice(0, topK);\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 stateStore.getMemory(storeScope, key);\n }\n\n // Fallback to sessionMeta\n const storeKey = `memory:${storeScope}:${key}`;\n return 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","import type { ChatMessage, HumanDecision } from '../types.js';\nimport type { StateStore, PendingDecision, ExecutionState } 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 // ── Checkpoints ──────────────────────────────────────────────────────\n\n async saveCheckpoint(executionId: string, step: number, data: unknown): Promise<void> {\n await this.client.hSet(this.checkpointKey(executionId), String(step), JSON.stringify(data));\n }\n\n async getCheckpoint(executionId: string, step: number): Promise<unknown | null> {\n const raw = await this.client.hGet(this.checkpointKey(executionId), String(step));\n return raw != null ? JSON.parse(raw) : null;\n }\n\n async getLatestCheckpoint(executionId: string): Promise<{ step: number; data: unknown } | null> {\n const all = await this.client.hGetAll(this.checkpointKey(executionId));\n if (!all || Object.keys(all).length === 0) return null;\n\n let maxStep = -1;\n let maxData: unknown = null;\n for (const [stepStr, raw] of Object.entries(all)) {\n const step = Number(stepStr);\n if (step > maxStep) {\n maxStep = step;\n maxData = JSON.parse(raw);\n }\n }\n\n return { step: maxStep, data: maxData };\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 // ── 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 } from './types.js';\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[]): Promise<number[][]> {\n const response = await fetch(`${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 });\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 };\n\n // Sort by index to maintain input order\n return json.data.sort((a, b) => a.index - b.index).map((d) => d.embedding);\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":["sleep","tool","THINKING_BUDGETS","tool","providerName","model","agent","result","costAfter","content","toolArgs","toolStart","toolResult","resultContent","tool","summaryMsg","recentTokens","splitIdx","parentSignal","decision","import_node_events","import_node_crypto","import_node_fs","import_node_path","tool","OTelSpanManager","workflow","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/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/mcp/client.ts","../src/mcp/manager.ts","../src/memory/manager.ts","../src/telemetry/noop.ts","../src/telemetry/index.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 } from './workflow.js';\n\n// Runtime\nexport { AxlRuntime } from './runtime.js';\nexport { defineConfig } from './config.js';\nexport type { AxlConfig } from './config.js';\n\n// Stream\nexport { AxlStream } from './stream.js';\n\n// Session\nexport { Session } from './session.js';\nexport type { SessionOptions } from './session.js';\n\n// Context\nexport { WorkflowContext, zodToJsonSchema } from './context.js';\nexport type { WorkflowContextInit } from './context.js';\nexport type {\n Result,\n BudgetResult,\n HumanDecision,\n TraceEvent,\n StreamEvent,\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';\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 { StateStore, ExecutionState, PendingDecision } 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 { 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 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.ZodTypeAny, 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.ZodTypeAny = z.ZodTypeAny, 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.ZodTypeAny, 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 doesn't have a native JSON mode like OpenAI's json_object.\n // Instead, we append a system-level instruction requesting valid JSON output.\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// 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 = options.responseFormat.json_schema.schema;\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: 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 { type 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 TraceEvent,\n ChatMessage,\n ToolCallMessage,\n ProviderResponse,\n AgentCallInfo,\n ValidateResult,\n VerifyRetry,\n} from './types.js';\nimport {\n AxlError,\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 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 * Convert a Zod schema to a JSON Schema object for tool definitions.\n *\n * Handles: string, number, boolean, array, object, optional, default, enum,\n * literal, union, nullable.\n *\n * Not handled: discriminated unions, branded types, transforms, refinements,\n * lazy, record, map, set, tuple, intersection. These fall through to an\n * empty object `{}`.\n */\n/** Internal Zod _def shape used by zodToJsonSchema to traverse schemas. */\ninterface ZodDef {\n typeName: string;\n type?: z.ZodTypeAny;\n shape?: () => Record<string, z.ZodTypeAny>;\n innerType?: z.ZodTypeAny;\n values?: string[];\n value?: unknown;\n options?: z.ZodTypeAny[];\n}\n\n/** Convert a Zod schema to JSON Schema (subset). Exported for Studio tool introspection. */\nexport function zodToJsonSchema(schema: z.ZodTypeAny): unknown {\n const def = (schema as unknown as { _def: ZodDef })._def;\n if (!def || !def.typeName) return {};\n\n switch (def.typeName) {\n case 'ZodString':\n return { type: 'string' };\n case 'ZodNumber':\n return { type: 'number' };\n case 'ZodBoolean':\n return { type: 'boolean' };\n case 'ZodArray':\n return { type: 'array', items: zodToJsonSchema(def.type!) };\n case 'ZodObject': {\n const shape = def.shape?.() ?? {};\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n for (const [key, value] of Object.entries(shape)) {\n properties[key] = zodToJsonSchema(value);\n const innerDef = (value as unknown as { _def: ZodDef })._def;\n if (innerDef?.typeName !== 'ZodOptional' && innerDef?.typeName !== 'ZodDefault') {\n required.push(key);\n }\n }\n return { type: 'object', properties, required: required.length > 0 ? required : undefined };\n }\n case 'ZodOptional':\n return zodToJsonSchema(def.innerType!);\n case 'ZodDefault':\n return zodToJsonSchema(def.innerType!);\n case 'ZodEnum':\n return { type: 'string', enum: def.values };\n case 'ZodLiteral': {\n const v = def.value;\n const t = v === null ? 'null' : typeof v;\n return { type: t, const: v };\n }\n case 'ZodUnion':\n return { oneOf: def.options!.map((o: z.ZodTypeAny) => zodToJsonSchema(o)) };\n case 'ZodNullable':\n return { ...(zodToJsonSchema(def.innerType!) as object), nullable: true };\n default:\n return {};\n }\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/** Strip markdown code fences (```json ... ```) from LLM responses before JSON parsing. */\nfunction stripMarkdownFences(text: string): string {\n const trimmed = text.trim();\n if (trimmed.startsWith('```')) {\n // Remove opening fence (```json, ```JSON, ``` etc.) and closing ```\n const withoutOpening = trimmed.replace(/^```\\w*\\s*\\n?/, '');\n const withoutClosing = withoutOpening.replace(/\\n?```\\s*$/, '');\n return withoutClosing.trim();\n }\n return trimmed;\n}\n\n/** Estimate tokens for a message array. */\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: TraceEvent) => void;\n onToken?: (token: string) => void;\n onToolCall?: (call: { name: string; args: unknown }) => 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 }) => void;\n /** Callback fired after each ctx.ask() completes (once per ask invocation). */\n onAgentCallComplete?: (call: AgentCallInfo) => void;\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 private config: AxlConfig;\n private providerRegistry: ProviderRegistry;\n private sessionHistory: ChatMessage[];\n private onTrace?: (event: TraceEvent) => void;\n private onToken?: (token: string) => void;\n private onToolCall?: (call: { name: string; args: unknown }) => 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 private stepCounter = 0;\n private checkpointCounter = 0;\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 }) => 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 // 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.\n * Isolates: session history, step counter, streaming callbacks (onToken, onAgentStart, onToolCall).\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 onAgentCallComplete: this.onAgentCallComplete,\n awaitHumanHandler: this.awaitHumanHandler,\n pendingDecisions: this.pendingDecisions,\n toolOverrides: this.toolOverrides,\n signal: this.signal,\n workflowName: this.workflowName,\n // Isolated: sessionHistory (empty), stepCounter (0),\n // onToken (null), onAgentStart (null), onToolCall (null)\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 // ── ctx.ask() ─────────────────────────────────────────────────────────\n\n async ask<T = string>(agent: Agent, prompt: string, options?: AskOptions<T>): Promise<T> {\n return this._checkpoint(async () => {\n const costBefore = this.budgetContext?.totalCost ?? 0;\n const startTime = Date.now();\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 without\n // relying on an instance property (which is racy under 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 const result = 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() - startTime);\n if (usageCapture.value) {\n span.setAttribute('axl.agent.prompt_tokens', usageCapture.value.prompt_tokens);\n span.setAttribute(\n 'axl.agent.completion_tokens',\n usageCapture.value.completion_tokens,\n );\n if (usageCapture.value.cached_tokens)\n span.setAttribute('axl.agent.cached_tokens', usageCapture.value.cached_tokens);\n }\n return r;\n },\n )\n : await doCall();\n\n const costAfter = this.budgetContext?.totalCost ?? 0;\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() - startTime,\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 return result;\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.emitTrace({\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.ZodTypeAny);\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.emitTrace({\n type: 'guardrail',\n agent: agent._name,\n data: { guardrailType: 'input', blocked: inputResult.block, reason: inputResult.reason },\n });\n this.spanManager?.addEventToActiveSpan('axl.guardrail.check', {\n 'axl.guardrail.type': 'input',\n 'axl.guardrail.blocked': inputResult.block,\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 not supported: validate requires schema (JSON output),\n // and on retry the token stream would contain tokens from multiple attempts\n // concatenated together with no separator, producing garbled output.\n if (this.onToken && options?.validate) {\n throw new AxlError(\n 'INVALID_CONFIG',\n 'Cannot use validate with streaming. Validate requires schema (JSON output) which does not benefit from token streaming. Use a non-streaming call instead.',\n );\n }\n\n const currentMessages = [...messages];\n let turns = 0;\n let guardrailOutputRetries = 0;\n let schemaRetries = 0;\n let validateRetries = 0;\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\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 this.onAgentStart?.({ agent: agent._name, model: modelUri });\n\n let response: ProviderResponse;\n\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<string, { id: string; name: string; arguments: string }>();\n let streamProviderMetadata: Record<string, unknown> | undefined;\n\n let thinkingContent = '';\n\n for await (const chunk of provider.stream(currentMessages, chatOptions)) {\n if (chunk.type === 'text_delta') {\n content += chunk.content;\n this.onToken(chunk.content);\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\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 if (this.budgetContext) {\n this.budgetContext.totalCost += response.cost;\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\n this.emitTrace({\n type: 'agent_call',\n agent: agent._name,\n model: modelUri,\n promptVersion: agent._config.version,\n cost: response.cost,\n duration: Date.now() - startTime,\n data: { prompt, response: response.content },\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\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 const handoffFn = () =>\n this.executeAgentCall(\n descriptor.agent,\n handoffPrompt,\n handoffOptions,\n currentMessages,\n usageCapture,\n );\n\n if (mode === 'roundtrip') {\n // Roundtrip: execute target, feed result back to source as tool response\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 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 const result = await executeRoundtrip();\n const duration = Date.now() - handoffStart;\n span.setAttribute('axl.handoff.duration', duration);\n this.emitTrace({\n type: 'handoff',\n agent: agent._name,\n data: { target: targetName, mode, duration },\n });\n return result;\n },\n );\n } else {\n await executeRoundtrip();\n this.emitTrace({\n type: 'handoff',\n agent: agent._name,\n data: { target: targetName, mode, duration: Date.now() - handoffStart },\n });\n }\n continue; // Source agent loop continues\n }\n\n // Oneway (default): return target's result, exiting source's loop\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 const duration = Date.now() - handoffStart;\n span.setAttribute('axl.handoff.duration', duration);\n this.emitTrace({\n type: 'handoff',\n agent: agent._name,\n data: { target: targetName, mode, duration },\n });\n return result;\n },\n );\n }\n const onewayResult = await handoffFn();\n this.emitTrace({\n type: 'handoff',\n agent: agent._name,\n data: { target: targetName, mode, duration: Date.now() - handoffStart },\n });\n return onewayResult;\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.onToolCall?.({ name: toolName, args: toolArgs });\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.emitTrace({\n type: 'tool_call',\n agent: agent._name,\n tool: toolName,\n duration: Date.now() - toolStart,\n data: { args: toolArgs, result: toolResult },\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.emitTrace({ 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.onToolCall?.({ name: toolName, args: toolArgs });\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<boolean> => {\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 this.emitTrace({\n type: 'tool_denied',\n agent: agent._name,\n tool: toolName,\n data: { denied: true, reason, args: toolArgs },\n });\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 false;\n }\n return true;\n };\n\n let approved: boolean;\n if (this.spanManager) {\n approved = 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);\n return result;\n },\n );\n } else {\n approved = await approvalFn();\n }\n\n if (!approved) continue;\n\n // Emit approval-succeeded trace so the stream handler can emit a tool_approval event\n this.emitTrace({\n type: 'tool_denied',\n agent: agent._name,\n tool: toolName,\n data: { denied: false, args: toolArgs },\n });\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 invocations\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.emitTrace({\n type: 'tool_call',\n agent: agent._name,\n tool: traceName,\n duration: Date.now() - toolStart,\n data: { args: toolArgs, result: toolResult },\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 this.emitTrace({\n type: 'guardrail',\n agent: agent._name,\n data: {\n guardrailType: 'output',\n blocked: outputResult.block,\n reason: outputResult.reason,\n },\n });\n this.spanManager?.addEventToActiveSpan('axl.guardrail.check', {\n 'axl.guardrail.type': 'output',\n 'axl.guardrail.blocked': outputResult.block,\n ...(outputResult.reason ? { 'axl.guardrail.reason': outputResult.reason } : {}),\n });\n if (outputResult.block) {\n const onBlock = guardrails.onBlock ?? 'throw';\n if (onBlock === 'retry') {\n const maxGuardrailRetries = guardrails.maxRetries ?? 2;\n if (guardrailOutputRetries < maxGuardrailRetries) {\n guardrailOutputRetries++;\n currentMessages.push({\n role: 'assistant',\n content,\n ...(response.providerMetadata\n ? { providerMetadata: response.providerMetadata }\n : {}),\n });\n currentMessages.push({\n role: 'system',\n content: `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 continue; // Re-enter the while loop for another LLM turn\n }\n // Max retries exhausted — fall through to throw\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 try {\n const parsed = JSON.parse(stripMarkdownFences(content));\n validated = (options.schema as z.ZodTypeAny).parse(parsed);\n } catch (err) {\n const maxSchemaRetries = options.retries ?? 3;\n if (schemaRetries < maxSchemaRetries) {\n schemaRetries++;\n const errorMsg = err instanceof Error ? err.message : String(err);\n currentMessages.push({\n role: 'assistant',\n content,\n ...(response.providerMetadata ? { providerMetadata: response.providerMetadata } : {}),\n });\n currentMessages.push({\n role: 'system',\n content: `Your response was not valid JSON or did not match the required schema: ${errorMsg}. Please fix and try again.`,\n });\n continue; // Re-enter the while loop for another LLM turn\n }\n const zodErr =\n err instanceof ZodError\n ? err\n : new ZodError([\n {\n code: 'custom',\n path: [],\n message: err instanceof Error ? err.message : String(err),\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 this.emitTrace({\n type: 'validate',\n agent: agent._name,\n data: {\n valid: validateResult.valid,\n ...(validateResult.reason ? { reason: validateResult.reason } : {}),\n },\n });\n this.spanManager?.addEventToActiveSpan('axl.validate.check', {\n 'axl.validate.valid': validateResult.valid,\n ...(validateResult.reason ? { 'axl.validate.reason': validateResult.reason } : {}),\n });\n\n if (!validateResult.valid) {\n const maxValidateRetries = options.validateRetries ?? 2;\n if (validateRetries < maxValidateRetries) {\n validateRetries++;\n currentMessages.push({\n role: 'assistant',\n content,\n ...(response.providerMetadata ? { providerMetadata: response.providerMetadata } : {}),\n });\n currentMessages.push({\n role: 'system',\n content: `Your response parsed correctly but failed validation: ${validateResult.reason ?? 'Validation failed'}. Previous attempts are visible above. Please fix and try again.`,\n });\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 — push to session history and return\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, and returns it.\n * On replay (resume after restart), returns the saved result without re-executing.\n * This prevents duplicate side effects (double API calls, double refunds, etc.).\n */\n async checkpoint<T>(fn: () => Promise<T>): Promise<T> {\n return this._checkpoint(fn);\n }\n\n /**\n * Internal checkpoint implementation shared by both the public checkpoint()\n * and the automatic checkpointing in ask/spawn/race/parallel/map.\n */\n private async _checkpoint<T>(fn: () => Promise<T>): Promise<T> {\n const step = this.checkpointCounter++;\n\n // If no state store, just execute without persistence\n if (!this.stateStore) {\n return fn();\n }\n\n // Check for a saved checkpoint from a previous execution\n const saved = await this.stateStore.getCheckpoint(this.executionId, step);\n if (saved !== null) {\n this.emitTrace({\n type: 'log',\n data: { event: 'checkpoint_replay', step },\n });\n this.spanManager?.addEventToActiveSpan('axl.checkpoint.hit', { 'axl.checkpoint.step': step });\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, step, result);\n\n this.emitTrace({\n type: 'log',\n data: { event: 'checkpoint_save', step },\n });\n this.spanManager?.addEventToActiveSpan('axl.checkpoint.miss', { 'axl.checkpoint.step': step });\n\n return result;\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(() => {\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 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 if (options?.fallback !== undefined) return options.fallback;\n throw new ValidationError(parsed, errorMsg, maxRetries);\n }\n continue;\n }\n }\n\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 lastRetry = {\n error: err.reason,\n output: rawOutput,\n parsed: err.lastOutput as T,\n };\n if (attempt === maxRetries) {\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 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 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(() => {\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.ZodTypeAny | 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(() => Promise.all(fns.map((fn) => fn())) as Promise<T>);\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._mapImpl(items, fn, options));\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 const decision = await this.awaitHumanHandler(options);\n this.emitTrace({\n type: 'log',\n data: { event: 'await_human_resolved', channel: options.channel, decision },\n });\n return decision;\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.stepCounter,\n status: 'waiting',\n metadata: {\n ...this.metadata,\n awaitHumanChannel: options.channel,\n awaitHumanPrompt: options.prompt,\n },\n });\n }\n\n this.emitTrace({\n type: 'log',\n data: { event: 'await_human', 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 // 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.stepCounter,\n status: 'running',\n });\n }\n\n return decision;\n }\n\n // ── ctx.log() ─────────────────────────────────────────────────────────\n\n log(event: string, data?: unknown): void {\n this.emitTrace({\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 const sessionId = this.metadata?.sessionId as string | undefined;\n await this.memoryManager.remember(key, value, this.stateStore, sessionId, options);\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 const sessionId = this.metadata?.sessionId as string | undefined;\n return this.memoryManager.recall(key, this.stateStore, sessionId, options);\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 await this.memoryManager.forget(key, this.stateStore, sessionId, options);\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 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.emitTrace({\n type: 'delegate',\n agent: '_delegate_router',\n data: {\n candidates: agents.map((a) => a._name),\n routerModel: routerModelUri,\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 private emitTrace(partial: Omit<TraceEvent, 'executionId' | 'step' | 'timestamp'>): void {\n let data = partial.data;\n if (this.config.trace?.redact && partial.type === 'agent_call' && data) {\n data = { ...(data as Record<string, unknown>), prompt: '[redacted]', response: '[redacted]' };\n }\n const event: TraceEvent = {\n executionId: this.executionId,\n step: this.stepCounter++,\n timestamp: Date.now(),\n ...partial,\n data,\n };\n this.onTrace?.(event);\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/** 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 $${spent.toFixed(4)} of $${limit.toFixed(4)} 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","/** 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\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.ZodTypeAny = z.ZodTypeAny,\n TOutput extends z.ZodTypeAny = z.ZodTypeAny,\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.ZodTypeAny = z.ZodTypeAny,\n TOutput extends z.ZodTypeAny = z.ZodTypeAny,\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 * 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.ZodTypeAny, TOutput extends z.ZodTypeAny = z.ZodTypeAny>(\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 { appendFileSync, mkdirSync } from 'node:fs';\nimport { dirname } from 'node:path';\nimport type { AxlConfig } from './config.js';\nimport { resolveConfig } from './config.js';\nimport type { Workflow } 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 } 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 TraceEvent,\n ExecutionInfo,\n HumanDecision,\n ChatMessage,\n HandoffRecord,\n} from './types.js';\nimport { NoopSpanManager } from './telemetry/noop.js';\nimport { createSpanManager } from './telemetry/index.js';\nimport type { SpanManager } from './telemetry/types.js';\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\nexport type ExecuteOptions = {\n metadata?: Record<string, unknown>;\n};\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 {\n config: unknown;\n executeWorkflow?: (input: unknown) => Promise<{ output: unknown; cost?: number }>;\n }\n >();\n private mcpManager?: McpManager;\n private memoryManager?: MemoryManager;\n private spanManager: SpanManager = new NoopSpanManager();\n\n constructor(config?: AxlConfig) {\n super();\n this.config = resolveConfig(config ?? {});\n this.providerRegistry = new ProviderRegistry();\n this.stateStore = this.createStateStore();\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 * 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 /** Register a workflow with the runtime. */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n register(workflow: Workflow<any, any>): 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(\n name: string,\n config: unknown,\n executeWorkflow?: (input: unknown) => Promise<{ output: unknown; cost?: number }>,\n ): 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(name: string):\n | {\n config: unknown;\n executeWorkflow?: (input: unknown) => Promise<{ output: unknown; cost?: number }>;\n }\n | undefined {\n return this.registeredEvals.get(name);\n }\n\n /** Run a registered eval by name. */\n async runRegisteredEval(name: string): Promise<unknown> {\n const entry = this.registeredEvals.get(name);\n if (!entry) throw new Error(`Eval \"${name}\" is not registered`);\n\n if (entry.executeWorkflow) {\n // Use custom executeWorkflow if provided\n let runEvalFn: (\n config: unknown,\n executeFn: (input: unknown) => Promise<{ output: unknown; cost?: number }>,\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 return runEvalFn(entry.config, entry.executeWorkflow);\n }\n\n // Default: use runtime.eval() which creates its own executeWorkflow\n return 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 }\n\n /** Get all execution info (running + completed). */\n getExecutions(): ExecutionInfo[] {\n return [...this.executions.values()];\n }\n\n /**\n * Create a lightweight WorkflowContext for ad-hoc use (tool testing, prototyping).\n * The context has access to the runtime's providers, state store, and MCP manager\n * but no session history, streaming callbacks, or budget tracking.\n */\n createContext(options?: { metadata?: Record<string, unknown> }): WorkflowContext {\n return new WorkflowContext({\n input: undefined,\n executionId: randomUUID(),\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 });\n }\n\n /** Register a custom provider instance. */\n registerProvider(name: string, provider: Provider): void {\n this.providerRegistry.registerInstance(name, provider);\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 // Create execution info\n const execInfo: ExecutionInfo = {\n executionId,\n workflow: name,\n status: 'running',\n steps: [],\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: TraceEvent) => {\n execInfo.steps.push(event);\n if (event.cost) execInfo.totalCost += event.cost;\n this.emit('trace', event);\n this.outputTraceEvent(event);\n // Persist handoff records to session metadata\n if (event.type === 'handoff') {\n const sessionId = options?.metadata?.sessionId as string | undefined;\n if (sessionId) {\n const data = event.data as Record<string, unknown> | undefined;\n this.appendHandoffRecord(sessionId, {\n source: event.agent ?? '',\n target: (data?.target as string) ?? '',\n mode: (data?.mode as 'oneway' | 'roundtrip') ?? 'oneway',\n timestamp: event.timestamp,\n duration: (data?.duration as number) ?? undefined,\n });\n }\n }\n },\n pendingDecisions: this.pendingDecisionResolvers,\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 });\n\n // Emit workflow start trace\n ctx.log('workflow_start', { workflow: name, executionId });\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 async (span) => {\n try {\n const result = await workflow.handler(ctx);\n\n // Validate (and coerce) output if schema exists\n const output = workflow.outputSchema ? workflow.outputSchema.parse(result) : result;\n\n execInfo.status = 'completed';\n execInfo.completedAt = Date.now();\n execInfo.duration = execInfo.completedAt - execInfo.startedAt;\n ctx.log('workflow_end', {\n workflow: name,\n status: 'completed',\n duration: execInfo.duration,\n cost: execInfo.totalCost,\n });\n\n // Clean up checkpoints for completed execution\n if (this.stateStore.deleteCheckpoints) {\n await this.stateStore.deleteCheckpoints(executionId);\n }\n\n span.setAttribute('axl.workflow.cost', execInfo.totalCost);\n span.setAttribute('axl.workflow.duration', execInfo.duration);\n\n return output;\n } catch (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.log('workflow_end', { workflow: name, status: 'failed', error: execInfo.error });\n throw err;\n } finally {\n this.abortControllers.delete(executionId);\n }\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 // Execute asynchronously, piping events to the stream\n // execInfo is captured by the closure so the catch handler can update it on error.\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 executionId = randomUUID();\n this.abortControllers.set(executionId, controller);\n const sessionHistory = (options?.metadata?.sessionHistory as ChatMessage[]) ?? undefined;\n\n // Create execution info for stream executions\n execInfo = {\n executionId,\n workflow: name,\n status: 'running',\n steps: [],\n totalCost: 0,\n startedAt: Date.now(),\n duration: 0,\n };\n this.executions.set(executionId, execInfo);\n\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: TraceEvent) => {\n execInfo!.steps.push(event);\n if (event.cost) execInfo!.totalCost += event.cost;\n this.emit('trace', event);\n this.outputTraceEvent(event);\n // Emit typed stream events for specific trace types\n if (event.type === 'handoff') {\n const data = event.data as Record<string, unknown> | undefined;\n axlStream._push({\n type: 'handoff',\n source: event.agent ?? '',\n target: (data?.target as string) ?? '',\n mode: (data?.mode as 'oneway' | 'roundtrip') ?? undefined,\n });\n // Persist handoff records to session metadata\n const sessionId = options?.metadata?.sessionId as string | undefined;\n if (sessionId) {\n this.appendHandoffRecord(sessionId, {\n source: event.agent ?? '',\n target: (data?.target as string) ?? '',\n mode: (data?.mode as 'oneway' | 'roundtrip') ?? 'oneway',\n timestamp: event.timestamp,\n duration: (data?.duration as number) ?? undefined,\n });\n }\n } else if (event.type === 'tool_denied') {\n const data = event.data as Record<string, unknown> | undefined;\n if (data?.denied === false) {\n // Approval succeeded\n axlStream._push({\n type: 'tool_approval',\n name: event.tool ?? '',\n args: data?.args,\n approved: true,\n });\n } else {\n // Approval denied\n axlStream._push({\n type: 'tool_approval',\n name: event.tool ?? '',\n args: data?.args,\n approved: false,\n reason: (data?.reason as string) ?? undefined,\n });\n }\n } else if (event.type === 'agent_call') {\n axlStream._push({\n type: 'agent_end',\n agent: event.agent ?? '',\n cost: event.cost,\n duration: event.duration,\n });\n } else if (event.type === 'tool_call') {\n axlStream._push({\n type: 'tool_result',\n name: event.tool ?? '',\n result: (event.data as Record<string, unknown>)?.result,\n });\n }\n // Always emit raw step event for backwards compat\n axlStream._push({ type: 'step', step: event.step, data: event });\n },\n onToken: (token: string) => {\n axlStream._push({ type: 'token', data: token });\n },\n onToolCall: (call: { name: string; args: unknown }) => {\n axlStream._push({ type: 'tool_call', name: call.name, args: call.args });\n },\n onAgentStart: (info: { agent: string; model: string }) => {\n axlStream._push({ type: 'agent_start', agent: info.agent, model: info.model });\n },\n pendingDecisions: this.pendingDecisionResolvers,\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 });\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 async (span) => {\n try {\n const rawResult = await workflow.handler(ctx);\n const result = workflow.outputSchema\n ? workflow.outputSchema.parse(rawResult)\n : rawResult;\n\n execInfo!.status = 'completed';\n execInfo!.completedAt = Date.now();\n execInfo!.duration = execInfo!.completedAt - execInfo!.startedAt;\n\n // Clean up checkpoints for completed execution\n if (this.stateStore.deleteCheckpoints) {\n await this.stateStore.deleteCheckpoints(executionId);\n }\n\n span.setAttribute('axl.workflow.cost', execInfo!.totalCost);\n span.setAttribute('axl.workflow.duration', execInfo!.duration);\n\n return result;\n } finally {\n this.abortControllers.delete(executionId);\n }\n },\n );\n };\n\n run()\n .then((result) => axlStream._done(result))\n .catch((err) => {\n // Update execution status on error\n if (execInfo) {\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 }\n axlStream._error(err instanceof Error ? err : new Error(String(err)));\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 return this.executions.get(executionId);\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(config: {\n workflow: string;\n dataset: unknown;\n scorers: unknown[];\n concurrency?: number;\n budget?: string;\n metadata?: Record<string, unknown>;\n }): Promise<unknown> {\n let runEval: (\n config: unknown,\n executeFn: (input: unknown) => Promise<{ output: unknown; cost?: number }>,\n ) => Promise<unknown>;\n try {\n // @ts-expect-error — @axlsdk/eval is an optional peer dependency\n ({ runEval } = 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 (input: unknown): Promise<{ output: unknown; cost?: number }> => {\n let cost = 0;\n const costListener = (event: TraceEvent) => {\n if (event.cost) cost += event.cost;\n };\n this.on('trace', costListener);\n try {\n const output = await this.execute(config.workflow, input);\n return { output, cost };\n } finally {\n this.off('trace', costListener);\n }\n };\n\n return runEval(config, executeWorkflow);\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): Promise<unknown> {\n let evalCompareFn: (baseline: unknown, candidate: unknown) => Promise<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);\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 outputTraceEvent(event: TraceEvent): 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.logTraceEvent(event);\n }\n\n private logTraceEvent(event: TraceEvent): 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 const data = event.data as { workflow?: string } | undefined;\n\n if (event.type === 'workflow_start') {\n parts.push(`${workflowPrefix}workflow:${data?.workflow ?? 'unknown'} | started`);\n } else if (event.type === 'workflow_end') {\n parts.push(`${workflowPrefix}workflow:${data?.workflow ?? 'unknown'} | completed`);\n } else if (event.type === 'agent_call') {\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') {\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 if (level === 'full' && event.data) {\n parts.push(`data:${JSON.stringify(event.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","import { writeFileSync, readFileSync, existsSync, mkdirSync, unlinkSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport type { ChatMessage, HumanDecision } from '../types.js';\nimport type { StateStore, PendingDecision, ExecutionState } 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<number, 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\n constructor() {\n // Load any persisted awaitHuman state from previous process\n this.loadPersistedState();\n }\n\n async saveCheckpoint(executionId: string, step: number, data: unknown): Promise<void> {\n let steps = this.checkpoints.get(executionId);\n if (!steps) {\n steps = new Map();\n this.checkpoints.set(executionId, steps);\n }\n steps.set(step, structuredClone(data));\n }\n\n async getCheckpoint(executionId: string, step: number): Promise<unknown | null> {\n const steps = this.checkpoints.get(executionId);\n if (!steps) return null;\n const data = steps.get(step);\n return data !== undefined ? structuredClone(data) : null;\n }\n\n async getLatestCheckpoint(executionId: string): Promise<{ step: number; data: unknown } | null> {\n const steps = this.checkpoints.get(executionId);\n if (!steps || steps.size === 0) return null;\n let maxStep = -1;\n for (const step of steps.keys()) {\n if (step > maxStep) maxStep = step;\n }\n return { step: maxStep, data: structuredClone(steps.get(maxStep)) };\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]) => ({ key, value }));\n }\n\n async deleteMemory(scope: string, key: string): Promise<void> {\n this.memories.get(scope)?.delete(key);\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, HumanDecision } from '../types.js';\nimport type { StateStore, PendingDecision, ExecutionState } 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\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.initTables();\n }\n\n private initTables(): void {\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS checkpoints (\n execution_id TEXT NOT NULL,\n step INTEGER NOT NULL,\n data TEXT NOT NULL,\n PRIMARY KEY (execution_id, step)\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 }\n\n // ── Checkpoints ────────────────────────────────────────────────────────\n\n async saveCheckpoint(executionId: string, step: number, data: unknown): Promise<void> {\n const stmt = this.db.prepare(\n 'INSERT OR REPLACE INTO checkpoints (execution_id, step, data) VALUES (?, ?, ?)',\n );\n stmt.run(executionId, step, JSON.stringify(data));\n }\n\n async getCheckpoint(executionId: string, step: number): Promise<unknown | null> {\n const stmt = this.db.prepare(\n 'SELECT data FROM checkpoints WHERE execution_id = ? AND step = ?',\n );\n const row = stmt.get(executionId, step) as { data: string } | undefined;\n return row ? safeJsonParse(row.data) : null;\n }\n\n async getLatestCheckpoint(executionId: string): Promise<{ step: number; data: unknown } | null> {\n const stmt = this.db.prepare(\n 'SELECT step, data FROM checkpoints WHERE execution_id = ? ORDER BY step DESC LIMIT 1',\n );\n const row = stmt.get(executionId) as { step: number; data: string } | undefined;\n return row ? { step: row.step, data: 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 // ── 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 updateHistory((event as { data: unknown }).data).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 type { StreamEvent } from './types.js';\n\n/**\n * A streamable workflow execution.\n *\n * Extends Node's Readable and implements AsyncIterable<StreamEvent>.\n * Supports .on() events, for-await-of, .text iterator, and .pipe().\n */\nexport class AxlStream extends Readable {\n private bus = new EventEmitter();\n private tokens: string[] = [];\n private result: unknown = undefined;\n private finished = false;\n readonly promise: Promise<unknown>;\n private eventQueue: StreamEvent[] = [];\n private waiters: Array<(value: IteratorResult<StreamEvent>) => 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 }\n\n private static readonly STREAM_EVENTS = new Set([\n 'token',\n 'tool_call',\n 'tool_result',\n 'tool_approval',\n 'agent_start',\n 'agent_end',\n 'handoff',\n 'step',\n 'done',\n 'error',\n ]);\n\n on(event: string, handler: (...args: unknown[]) => void): this {\n if (AxlStream.STREAM_EVENTS.has(event)) {\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)) {\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<StreamEvent>> => {\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 StreamEvent, 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 if (value.type === 'token') return { value: value.data, done: false };\n }\n },\n };\n },\n };\n }\n\n get steps(): AsyncIterable<StreamEvent> {\n const stepTypes = new Set([\n 'agent_start',\n 'agent_end',\n 'tool_call',\n 'tool_result',\n 'tool_approval',\n 'handoff',\n ]);\n const self = this;\n return {\n [Symbol.asyncIterator](): AsyncIterator<StreamEvent> {\n const iter = self[Symbol.asyncIterator]();\n return {\n async next(): Promise<IteratorResult<StreamEvent>> {\n while (true) {\n const { value, done } = await iter.next();\n if (done) return { value: undefined as unknown as StreamEvent, done: true };\n if (stepTypes.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: StreamEvent) => {\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 a stream event. Called by the runtime. */\n _push(event: StreamEvent): void {\n if (this.finished) return;\n if (event.type === 'token') this.tokens.push(event.data);\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 /** Signal successful completion. */\n _done(result: unknown): void {\n if (this.finished) return;\n this.finished = true;\n this.result = result;\n const doneEvent: StreamEvent = { type: 'done', data: result };\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 StreamEvent, done: true });\n }\n this.waiters.length = 0;\n this.bus.emit('__resolve', result);\n }\n\n /** Signal an error. */\n _error(error: Error): void {\n if (this.finished) return;\n this.finished = true;\n const errorEvent: StreamEvent = { type: 'error', error };\n this.bus.emit('error', errorEvent);\n this.push(null);\n for (const w of this.waiters) {\n w({ value: undefined as unknown as StreamEvent, done: true });\n }\n this.waiters.length = 0;\n this.bus.emit('__reject', error);\n }\n\n get fullText(): string {\n return this.tokens.join('');\n }\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 VectorResult,\n RememberOptions,\n RecallOptions,\n} from './types.js';\nimport type { StateStore } from '../state/types.js';\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 async remember(\n key: string,\n value: unknown,\n stateStore: StateStore,\n sessionId: string | undefined,\n options?: RememberOptions,\n ): Promise<void> {\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 [embedding] = await this.embedder.embed([text]);\n await this.vectorStore.upsert([\n {\n id: `${storeScope}:${key}`,\n content: text,\n embedding,\n metadata: { key, scope, ...options?.metadata },\n },\n ]);\n }\n }\n\n /**\n * Recall a value from memory by key, or perform semantic search if query is provided.\n */\n async recall(\n key: string,\n stateStore: StateStore,\n sessionId: string | undefined,\n options?: RecallOptions,\n ): Promise<unknown | VectorResult[] | null> {\n // Semantic search mode\n if (options?.query && this.vectorStore && this.embedder) {\n const [embedding] = await this.embedder.embed([options.query]);\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(embedding, 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 return filtered.slice(0, topK);\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 stateStore.getMemory(storeScope, key);\n }\n\n // Fallback to sessionMeta\n const storeKey = `memory:${storeScope}:${key}`;\n return 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","import type { ChatMessage, HumanDecision } from '../types.js';\nimport type { StateStore, PendingDecision, ExecutionState } 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 // ── Checkpoints ──────────────────────────────────────────────────────\n\n async saveCheckpoint(executionId: string, step: number, data: unknown): Promise<void> {\n await this.client.hSet(this.checkpointKey(executionId), String(step), JSON.stringify(data));\n }\n\n async getCheckpoint(executionId: string, step: number): Promise<unknown | null> {\n const raw = await this.client.hGet(this.checkpointKey(executionId), String(step));\n return raw != null ? JSON.parse(raw) : null;\n }\n\n async getLatestCheckpoint(executionId: string): Promise<{ step: number; data: unknown } | null> {\n const all = await this.client.hGetAll(this.checkpointKey(executionId));\n if (!all || Object.keys(all).length === 0) return null;\n\n let maxStep = -1;\n let maxData: unknown = null;\n for (const [stepStr, raw] of Object.entries(all)) {\n const step = Number(stepStr);\n if (step > maxStep) {\n maxStep = step;\n maxData = JSON.parse(raw);\n }\n }\n\n return { step: maxStep, data: maxData };\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 // ── 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 } from './types.js';\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[]): Promise<number[][]> {\n const response = await fetch(`${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 });\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 };\n\n // Sort by index to maintain input order\n return json.data.sort((a, b) => a.index - b.index).map((d) => d.embedding);\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":["sleep","tool","THINKING_BUDGETS","tool","providerName","model","agent","result","costAfter","content","toolArgs","toolStart","toolResult","resultContent","tool","summaryMsg","recentTokens","splitIdx","parentSignal","decision","import_node_events","import_node_crypto","import_node_fs","import_node_path","tool","OTelSpanManager","workflow","cosineSimilarity"]}
|