{"version":3,"sources":["../../src/agents/types.ts","../../src/agents/Agent.ts","../../src/utils/id.ts","../../src/agents/llm/LLMProvider.ts","../../src/agents/llm/OpenAIProvider.ts","../../src/agents/llm/AnthropicProvider.ts","../../src/agents/AgentExecutor.ts","../../src/agents/StreamingAgentExecutor.ts","../../src/agents/AgentSwarm.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * AIKIT Agent Orchestration System - Type Definitions\n *\n * This module defines the core types for the AI agent execution framework.\n * Provides type-safe interfaces for agents, tools, and execution traces.\n */\n\nimport { z } from 'zod';\n\n// ============================================================================\n// Tool Definition Types\n// ============================================================================\n\n/**\n * Schema definition for tool parameters using Zod\n */\nexport type ToolParameterSchema = z.ZodObject<any> | z.ZodType<any>;\n\n/**\n * Tool metadata and configuration\n */\nexport interface ToolDefinition<TParams = any, TResult = any> {\n  /**\n   * Unique identifier for the tool\n   */\n  name: string;\n\n  /**\n   * Human-readable description of what the tool does\n   * This is used by the LLM to understand when to use the tool\n   */\n  description: string;\n\n  /**\n   * Zod schema for validating tool parameters\n   */\n  parameters: ToolParameterSchema;\n\n  /**\n   * The actual function that executes the tool\n   * @param params - Validated parameters matching the schema\n   * @returns Promise resolving to the tool result\n   */\n  execute: (params: TParams) => Promise<TResult>;\n\n  /**\n   * Optional retry configuration\n   */\n  retry?: {\n    maxAttempts: number;\n    backoffMs: number;\n  };\n\n  /**\n   * Optional timeout in milliseconds\n   */\n  timeoutMs?: number;\n\n  /**\n   * Optional metadata for categorization and filtering\n   */\n  metadata?: Record<string, unknown>;\n}\n\n/**\n * Runtime tool call request from the LLM\n */\nexport interface ToolCall {\n  /**\n   * Unique ID for this specific tool call invocation\n   */\n  id: string;\n\n  /**\n   * Name of the tool to execute\n   */\n  name: string;\n\n  /**\n   * Parameters to pass to the tool (validated against schema)\n   */\n  parameters: Record<string, unknown>;\n}\n\n/**\n * Result of a tool execution\n */\nexport interface ToolResult {\n  /**\n   * ID of the tool call this result corresponds to\n   */\n  toolCallId: string;\n\n  /**\n   * Name of the tool that was executed\n   */\n  toolName: string;\n\n  /**\n   * The result data from the tool execution\n   */\n  result: unknown;\n\n  /**\n   * Error information if the tool execution failed\n   */\n  error?: {\n    message: string;\n    code?: string;\n    stack?: string;\n  };\n\n  /**\n   * Execution metadata\n   */\n  metadata: {\n    durationMs: number;\n    timestamp: string;\n    retryCount?: number;\n  };\n}\n\n// ============================================================================\n// Agent Types\n// ============================================================================\n\n/**\n * Agent configuration\n */\nexport interface AgentConfig {\n  /**\n   * Unique identifier for the agent\n   */\n  id: string;\n\n  /**\n   * Human-readable name\n   */\n  name: string;\n\n  /**\n   * Description of the agent's purpose and capabilities\n   */\n  description?: string;\n\n  /**\n   * System prompt that defines the agent's behavior\n   */\n  systemPrompt: string;\n\n  /**\n   * LLM provider configuration\n   */\n  llm: {\n    provider: 'openai' | 'anthropic' | 'google' | 'custom';\n    model: string;\n    temperature?: number;\n    maxTokens?: number;\n    topP?: number;\n    apiKey?: string;\n    baseUrl?: string;\n  };\n\n  /**\n   * Tools available to this agent\n   */\n  tools: ToolDefinition[];\n\n  /**\n   * Maximum number of execution steps before stopping\n   */\n  maxSteps?: number;\n\n  /**\n   * Whether to enable streaming responses\n   */\n  streaming?: boolean;\n\n  /**\n   * Custom metadata\n   */\n  metadata?: Record<string, unknown>;\n}\n\n/**\n * Message in the agent conversation\n */\nexport interface Message {\n  role: 'system' | 'user' | 'assistant' | 'tool';\n  content: string;\n  name?: string; // For tool messages\n  toolCalls?: ToolCall[];\n  toolCallId?: string; // For tool result messages\n  timestamp?: string;\n}\n\n/**\n * Agent state during execution\n */\nexport interface AgentState {\n  /**\n   * Current step number in the execution\n   */\n  step: number;\n\n  /**\n   * Conversation history\n   */\n  messages: Message[];\n\n  /**\n   * Pending tool calls waiting to be executed\n   */\n  pendingToolCalls: ToolCall[];\n\n  /**\n   * Results from completed tool calls\n   */\n  toolResults: ToolResult[];\n\n  /**\n   * Whether the agent has finished execution\n   */\n  isComplete: boolean;\n\n  /**\n   * Final response if execution is complete\n   */\n  finalResponse?: string;\n\n  /**\n   * Error information if execution failed\n   */\n  error?: {\n    message: string;\n    step: number;\n    cause?: unknown;\n  };\n}\n\n// ============================================================================\n// Execution Trace Types\n// ============================================================================\n\n/**\n * Types of events in the execution trace\n */\nexport type TraceEventType =\n  | 'agent_start'\n  | 'agent_end'\n  | 'llm_request'\n  | 'llm_response'\n  | 'llm_stream_start'\n  | 'llm_stream_chunk'\n  | 'llm_stream_end'\n  | 'tool_call_request'\n  | 'tool_call_start'\n  | 'tool_call_end'\n  | 'tool_call_error'\n  | 'step_start'\n  | 'step_end'\n  | 'error';\n\n/**\n * Individual trace event\n */\nexport interface TraceEvent {\n  /**\n   * Event type\n   */\n  type: TraceEventType;\n\n  /**\n   * Timestamp when the event occurred\n   */\n  timestamp: string;\n\n  /**\n   * Step number during which this event occurred\n   */\n  step?: number;\n\n  /**\n   * Event-specific data\n   */\n  data: Record<string, unknown>;\n\n  /**\n   * Duration in milliseconds (for start/end pairs)\n   */\n  durationMs?: number;\n}\n\n/**\n * Complete execution trace\n */\nexport interface ExecutionTrace {\n  /**\n   * Unique execution ID\n   */\n  executionId: string;\n\n  /**\n   * Agent ID\n   */\n  agentId: string;\n\n  /**\n   * Start timestamp\n   */\n  startTime: string;\n\n  /**\n   * End timestamp\n   */\n  endTime?: string;\n\n  /**\n   * Total duration in milliseconds\n   */\n  durationMs?: number;\n\n  /**\n   * All trace events in chronological order\n   */\n  events: TraceEvent[];\n\n  /**\n   * Final agent state\n   */\n  finalState?: AgentState;\n\n  /**\n   * Execution statistics\n   */\n  stats: {\n    totalSteps: number;\n    totalToolCalls: number;\n    totalLLMCalls: number;\n    totalTokensUsed?: number;\n    successfulToolCalls: number;\n    failedToolCalls: number;\n  };\n}\n\n// ============================================================================\n// Streaming Types\n// ============================================================================\n\n/**\n * Streaming event types\n */\nexport type StreamEventType =\n  | 'start'\n  | 'step'\n  | 'thought'\n  | 'tool_call'\n  | 'tool_result'\n  | 'text_chunk'\n  | 'final_answer'\n  | 'complete'\n  | 'error';\n\n/**\n * Base streaming event\n */\nexport interface StreamEvent {\n  type: StreamEventType;\n  timestamp: string;\n  data: unknown;\n}\n\n/**\n * Streaming callback handler\n */\nexport type StreamCallback = (event: StreamEvent) => void | Promise<void>;\n\n/**\n * Agent step event for streaming\n */\nexport interface AgentStepEvent {\n  /**\n   * Event type identifier\n   */\n  type: 'step';\n\n  /**\n   * Current step number\n   */\n  step: number;\n\n  /**\n   * Step timestamp\n   */\n  timestamp: string;\n\n  /**\n   * Step metadata\n   */\n  metadata?: {\n    messagesCount?: number;\n    pendingToolCalls?: number;\n  };\n}\n\n/**\n * Thought event - agent's reasoning/thinking\n */\nexport interface ThoughtEvent {\n  /**\n   * Event type identifier\n   */\n  type: 'thought';\n\n  /**\n   * The thought/reasoning content\n   */\n  content: string;\n\n  /**\n   * Step number during which this thought occurred\n   */\n  step: number;\n\n  /**\n   * Event timestamp\n   */\n  timestamp: string;\n}\n\n/**\n * Tool call event\n */\nexport interface ToolCallEvent {\n  /**\n   * Event type identifier\n   */\n  type: 'tool_call';\n\n  /**\n   * The tool call details\n   */\n  toolCall: ToolCall;\n\n  /**\n   * Step number\n   */\n  step: number;\n\n  /**\n   * Event timestamp\n   */\n  timestamp: string;\n}\n\n/**\n * Tool result event\n */\nexport interface ToolResultEvent {\n  /**\n   * Event type identifier\n   */\n  type: 'tool_result';\n\n  /**\n   * The tool execution result\n   */\n  result: ToolResult;\n\n  /**\n   * Step number\n   */\n  step: number;\n\n  /**\n   * Event timestamp\n   */\n  timestamp: string;\n}\n\n/**\n * Final answer event\n */\nexport interface FinalAnswerEvent {\n  /**\n   * Event type identifier\n   */\n  type: 'final_answer';\n\n  /**\n   * The final answer/response\n   */\n  answer: string;\n\n  /**\n   * Step number\n   */\n  step: number;\n\n  /**\n   * Event timestamp\n   */\n  timestamp: string;\n}\n\n/**\n * Error event\n */\nexport interface ErrorEvent {\n  /**\n   * Event type identifier\n   */\n  type: 'error';\n\n  /**\n   * Error message\n   */\n  error: string;\n\n  /**\n   * Error code\n   */\n  code?: string;\n\n  /**\n   * Step number where error occurred\n   */\n  step?: number;\n\n  /**\n   * Event timestamp\n   */\n  timestamp: string;\n}\n\n/**\n * Union type of all agent execution streaming events\n */\nexport type AgentExecutionEvent =\n  | AgentStepEvent\n  | ThoughtEvent\n  | ToolCallEvent\n  | ToolResultEvent\n  | FinalAnswerEvent\n  | ErrorEvent;\n\n// ============================================================================\n// Error Types\n// ============================================================================\n\n/**\n * Base error for agent system\n */\nexport class AgentError extends Error {\n  constructor(\n    message: string,\n    public code: string,\n    public context?: Record<string, unknown>\n  ) {\n    super(message);\n    this.name = 'AgentError';\n  }\n}\n\n/**\n * Tool execution error\n */\nexport class ToolExecutionError extends AgentError {\n  constructor(\n    message: string,\n    public toolName: string,\n    public toolCallId: string,\n    context?: Record<string, unknown>\n  ) {\n    super(message, 'TOOL_EXECUTION_ERROR', { ...context, toolName, toolCallId });\n    this.name = 'ToolExecutionError';\n  }\n}\n\n/**\n * Tool validation error\n */\nexport class ToolValidationError extends AgentError {\n  constructor(\n    message: string,\n    public toolName: string,\n    public validationErrors: z.ZodError,\n    context?: Record<string, unknown>\n  ) {\n    super(message, 'TOOL_VALIDATION_ERROR', {\n      ...context,\n      toolName,\n      errors: validationErrors.errors,\n    });\n    this.name = 'ToolValidationError';\n  }\n}\n\n/**\n * LLM error\n */\nexport class LLMError extends AgentError {\n  constructor(\n    message: string,\n    public provider: string,\n    context?: Record<string, unknown>\n  ) {\n    super(message, 'LLM_ERROR', { ...context, provider });\n    this.name = 'LLMError';\n  }\n}\n\n/**\n * Max steps exceeded error\n */\nexport class MaxStepsExceededError extends AgentError {\n  constructor(maxSteps: number, context?: Record<string, unknown>) {\n    super(\n      `Agent exceeded maximum steps: ${maxSteps}`,\n      'MAX_STEPS_EXCEEDED',\n      { ...context, maxSteps }\n    );\n    this.name = 'MaxStepsExceededError';\n  }\n}\n\n// ============================================================================\n// Utility Types\n// ============================================================================\n\n/**\n * Extract parameter type from tool definition\n */\nexport type ToolParams<T extends ToolDefinition> = T extends ToolDefinition<\n  infer P,\n  any\n>\n  ? P\n  : never;\n\n/**\n * Extract result type from tool definition\n */\nexport type ToolResultType<T extends ToolDefinition> = T extends ToolDefinition<\n  any,\n  infer R\n>\n  ? R\n  : never;\n\n/**\n * Type-safe tool registry\n */\nexport type ToolRegistry = Map<string, ToolDefinition>;\n\n// ============================================================================\n// Agent Swarm Types\n// ============================================================================\n\n/**\n * Role of an agent in the swarm\n */\nexport type AgentRole = 'supervisor' | 'specialist';\n\n/**\n * Specialist agent configuration for swarm\n */\nexport interface SpecialistAgent {\n  /**\n   * Unique identifier for the specialist\n   */\n  id: string;\n\n  /**\n   * Agent instance\n   */\n  agent: any; // Will be Agent type, avoiding circular dependency\n\n  /**\n   * Specialization area/domain\n   */\n  specialization: string;\n\n  /**\n   * Keywords/tags that trigger this specialist\n   */\n  keywords?: string[];\n\n  /**\n   * Priority when multiple specialists match (higher = preferred)\n   */\n  priority?: number;\n\n  /**\n   * Whether this specialist can handle multiple tasks concurrently\n   */\n  concurrent?: boolean;\n}\n\n/**\n * Task routing decision\n */\nexport interface TaskRoutingDecision {\n  /**\n   * ID of the specialist agent to handle the task\n   */\n  specialistId: string;\n\n  /**\n   * Reason for routing to this specialist\n   */\n  reason: string;\n\n  /**\n   * Confidence score (0-1)\n   */\n  confidence: number;\n}\n\n/**\n * Specialist execution result\n */\nexport interface SpecialistResult {\n  /**\n   * ID of the specialist that executed the task\n   */\n  specialistId: string;\n\n  /**\n   * Specialization area\n   */\n  specialization: string;\n\n  /**\n   * Response from the specialist\n   */\n  response: string;\n\n  /**\n   * Execution trace from the specialist\n   */\n  trace: ExecutionTrace;\n\n  /**\n   * Whether execution was successful\n   */\n  success: boolean;\n\n  /**\n   * Error if execution failed\n   */\n  error?: Error;\n\n  /**\n   * Execution metadata\n   */\n  metadata: {\n    startTime: string;\n    endTime: string;\n    durationMs: number;\n  };\n}\n\n/**\n * Configuration for AgentSwarm\n */\nexport interface SwarmConfig {\n  /**\n   * Unique identifier for the swarm\n   */\n  id: string;\n\n  /**\n   * Human-readable name\n   */\n  name: string;\n\n  /**\n   * Description of the swarm's purpose\n   */\n  description?: string;\n\n  /**\n   * Supervisor agent that coordinates specialists\n   */\n  supervisor: any; // Will be Agent type, avoiding circular dependency\n\n  /**\n   * Specialist agents in the swarm\n   */\n  specialists: SpecialistAgent[];\n\n  /**\n   * Maximum number of concurrent specialist executions\n   */\n  maxConcurrent?: number;\n\n  /**\n   * Whether to enable parallel execution of independent tasks\n   */\n  parallelExecution?: boolean;\n\n  /**\n   * Timeout for specialist executions (milliseconds)\n   */\n  specialistTimeoutMs?: number;\n\n  /**\n   * Custom routing strategy\n   */\n  customRouter?: (\n    task: string,\n    specialists: SpecialistAgent[]\n  ) => Promise<TaskRoutingDecision>;\n\n  /**\n   * Custom result synthesizer\n   */\n  customSynthesizer?: (\n    results: SpecialistResult[]\n  ) => Promise<string>;\n\n  /**\n   * Custom metadata\n   */\n  metadata?: Record<string, unknown>;\n}\n\n/**\n * Swarm execution result\n */\nexport interface SwarmResult {\n  /**\n   * Final synthesized response\n   */\n  response: string;\n\n  /**\n   * Results from individual specialists\n   */\n  specialistResults: SpecialistResult[];\n\n  /**\n   * Combined execution trace from all agents\n   */\n  combinedTrace: ExecutionTrace;\n\n  /**\n   * Supervisor's decision-making trace\n   */\n  supervisorTrace: ExecutionTrace;\n\n  /**\n   * Whether execution was successful\n   */\n  success: boolean;\n\n  /**\n   * Error if execution failed\n   */\n  error?: Error;\n\n  /**\n   * Execution statistics\n   */\n  stats: {\n    totalSpecialistsInvoked: number;\n    successfulSpecialists: number;\n    failedSpecialists: number;\n    totalDurationMs: number;\n    parallelExecutions: number;\n  };\n}\n","/**\n * AIKIT Agent - Base Agent Class\n *\n * This module provides the base Agent class with tool registration,\n * validation, and management capabilities.\n */\n\nimport { z } from 'zod';\nimport { zodToJsonSchema } from 'zod-to-json-schema';\nimport {\n  AgentConfig,\n  ToolDefinition,\n  ToolRegistry,\n  ToolCall,\n  ToolResult,\n  Message,\n  AgentError,\n  ToolValidationError,\n} from './types';\n\n/**\n * Base Agent class that manages tools and provides execution context\n */\nexport class Agent {\n  /**\n   * Agent configuration\n   */\n  public readonly config: AgentConfig;\n\n  /**\n   * Tool registry (name -> definition)\n   */\n  private toolRegistry: ToolRegistry;\n\n  constructor(config: AgentConfig) {\n    this.config = config;\n    this.toolRegistry = new Map();\n\n    // Register provided tools\n    if (config.tools && config.tools.length > 0) {\n      config.tools.forEach((tool) => this.registerTool(tool));\n    }\n  }\n\n  /**\n   * Register a tool with the agent\n   */\n  public registerTool(tool: ToolDefinition): void {\n    // Validate tool definition\n    this.validateToolDefinition(tool);\n\n    // Check for duplicate tool names\n    if (this.toolRegistry.has(tool.name)) {\n      throw new AgentError(\n        `Tool with name \"${tool.name}\" is already registered`,\n        'DUPLICATE_TOOL_NAME',\n        { toolName: tool.name }\n      );\n    }\n\n    this.toolRegistry.set(tool.name, tool);\n  }\n\n  /**\n   * Register multiple tools at once\n   */\n  public registerTools(tools: ToolDefinition[]): void {\n    tools.forEach((tool) => this.registerTool(tool));\n  }\n\n  /**\n   * Unregister a tool by name\n   */\n  public unregisterTool(toolName: string): boolean {\n    return this.toolRegistry.delete(toolName);\n  }\n\n  /**\n   * Get a tool by name\n   */\n  public getTool(toolName: string): ToolDefinition | undefined {\n    return this.toolRegistry.get(toolName);\n  }\n\n  /**\n   * Get all registered tools\n   */\n  public getTools(): ToolDefinition[] {\n    return Array.from(this.toolRegistry.values());\n  }\n\n  /**\n   * Check if a tool is registered\n   */\n  public hasTool(toolName: string): boolean {\n    return this.toolRegistry.has(toolName);\n  }\n\n  /**\n   * Get tool names for LLM function calling\n   */\n  public getToolSchemas(): Array<{\n    name: string;\n    description: string;\n    parameters: Record<string, unknown>;\n  }> {\n    return this.getTools().map((tool) => ({\n      name: tool.name,\n      description: tool.description,\n      parameters: this.zodSchemaToJsonSchema(tool.parameters),\n    }));\n  }\n\n  /**\n   * Validate tool call parameters against the tool's schema\n   */\n  public validateToolCall(toolCall: ToolCall): {\n    valid: boolean;\n    error?: ToolValidationError;\n    validatedParams?: unknown;\n  } {\n    const tool = this.toolRegistry.get(toolCall.name);\n\n    if (!tool) {\n      return {\n        valid: false,\n        error: new ToolValidationError(\n          `Tool \"${toolCall.name}\" not found`,\n          toolCall.name,\n          new z.ZodError([\n            {\n              code: 'custom',\n              path: [],\n              message: `Tool \"${toolCall.name}\" not found`,\n            },\n          ])\n        ),\n      };\n    }\n\n    try {\n      const validatedParams = tool.parameters.parse(toolCall.parameters);\n      return { valid: true, validatedParams };\n    } catch (error) {\n      if (error instanceof z.ZodError) {\n        return {\n          valid: false,\n          error: new ToolValidationError(\n            `Invalid parameters for tool \"${toolCall.name}\"`,\n            toolCall.name,\n            error,\n            { parameters: toolCall.parameters }\n          ),\n        };\n      }\n      throw error;\n    }\n  }\n\n  /**\n   * Execute a single tool call\n   */\n  public async executeToolCall(toolCall: ToolCall): Promise<ToolResult> {\n    const startTime = Date.now();\n    const tool = this.toolRegistry.get(toolCall.name);\n\n    if (!tool) {\n      return {\n        toolCallId: toolCall.id,\n        toolName: toolCall.name,\n        result: null,\n        error: {\n          message: `Tool \"${toolCall.name}\" not found`,\n          code: 'TOOL_NOT_FOUND',\n        },\n        metadata: {\n          durationMs: Date.now() - startTime,\n          timestamp: new Date().toISOString(),\n        },\n      };\n    }\n\n    // Validate parameters\n    const validation = this.validateToolCall(toolCall);\n    if (!validation.valid) {\n      return {\n        toolCallId: toolCall.id,\n        toolName: toolCall.name,\n        result: null,\n        error: {\n          message: validation.error!.message,\n          code: 'VALIDATION_ERROR',\n          stack: validation.error!.stack,\n        },\n        metadata: {\n          durationMs: Date.now() - startTime,\n          timestamp: new Date().toISOString(),\n        },\n      };\n    }\n\n    // Execute with retry logic\n    const maxAttempts = tool.retry?.maxAttempts ?? 1;\n    const backoffMs = tool.retry?.backoffMs ?? 1000;\n    let lastError: Error | null = null;\n\n    for (let attempt = 0; attempt < maxAttempts; attempt++) {\n      try {\n        // Execute with timeout if specified\n        const result = tool.timeoutMs\n          ? await this.executeWithTimeout(\n              () => tool.execute(validation.validatedParams),\n              tool.timeoutMs\n            )\n          : await tool.execute(validation.validatedParams);\n\n        return {\n          toolCallId: toolCall.id,\n          toolName: toolCall.name,\n          result,\n          metadata: {\n            durationMs: Date.now() - startTime,\n            timestamp: new Date().toISOString(),\n            retryCount: attempt,\n          },\n        };\n      } catch (error) {\n        lastError = error as Error;\n\n        // If this isn't the last attempt, wait before retrying\n        if (attempt < maxAttempts - 1) {\n          await this.sleep(backoffMs * (attempt + 1));\n        }\n      }\n    }\n\n    // All attempts failed\n    return {\n      toolCallId: toolCall.id,\n      toolName: toolCall.name,\n      result: null,\n      error: {\n        message: lastError?.message ?? 'Unknown error',\n        code: 'EXECUTION_ERROR',\n        stack: lastError?.stack,\n      },\n      metadata: {\n        durationMs: Date.now() - startTime,\n        timestamp: new Date().toISOString(),\n        retryCount: maxAttempts - 1,\n      },\n    };\n  }\n\n  /**\n   * Execute multiple tool calls in parallel\n   */\n  public async executeToolCalls(toolCalls: ToolCall[]): Promise<ToolResult[]> {\n    return Promise.all(toolCalls.map((tc) => this.executeToolCall(tc)));\n  }\n\n  /**\n   * Build initial messages for the agent\n   */\n  public buildInitialMessages(userMessage: string): Message[] {\n    const messages: Message[] = [];\n\n    // Add system prompt\n    if (this.config.systemPrompt) {\n      messages.push({\n        role: 'system',\n        content: this.config.systemPrompt,\n        timestamp: new Date().toISOString(),\n      });\n    }\n\n    // Add user message\n    messages.push({\n      role: 'user',\n      content: userMessage,\n      timestamp: new Date().toISOString(),\n    });\n\n    return messages;\n  }\n\n  /**\n   * Get agent metadata for logging/tracing\n   */\n  public getMetadata(): Record<string, unknown> {\n    return {\n      id: this.config.id,\n      name: this.config.name,\n      description: this.config.description,\n      llm: {\n        provider: this.config.llm.provider,\n        model: this.config.llm.model,\n      },\n      toolCount: this.toolRegistry.size,\n      toolNames: Array.from(this.toolRegistry.keys()),\n      maxSteps: this.config.maxSteps,\n      streaming: this.config.streaming,\n      ...this.config.metadata,\n    };\n  }\n\n  // ============================================================================\n  // Private Helper Methods\n  // ============================================================================\n\n  /**\n   * Validate tool definition structure\n   */\n  private validateToolDefinition(tool: ToolDefinition): void {\n    if (!tool.name || typeof tool.name !== 'string') {\n      throw new AgentError(\n        'Tool name is required and must be a string',\n        'INVALID_TOOL_DEFINITION'\n      );\n    }\n\n    if (!tool.description || typeof tool.description !== 'string') {\n      throw new AgentError(\n        'Tool description is required and must be a string',\n        'INVALID_TOOL_DEFINITION',\n        { toolName: tool.name }\n      );\n    }\n\n    if (!tool.parameters || !(tool.parameters instanceof z.ZodType)) {\n      throw new AgentError(\n        'Tool parameters must be a valid Zod schema',\n        'INVALID_TOOL_DEFINITION',\n        { toolName: tool.name }\n      );\n    }\n\n    if (!tool.execute || typeof tool.execute !== 'function') {\n      throw new AgentError(\n        'Tool execute must be a function',\n        'INVALID_TOOL_DEFINITION',\n        { toolName: tool.name }\n      );\n    }\n  }\n\n  /**\n   * Convert Zod schema to JSON schema for LLM function calling\n   */\n  private zodSchemaToJsonSchema(schema: z.ZodType): Record<string, unknown> {\n    try {\n      // Use zod-to-json-schema library for complete, accurate conversion\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      const jsonSchema = zodToJsonSchema(schema as any, {\n        target: 'openApi3',           // OpenAI-compatible format\n        $refStrategy: 'none',          // Inline all schemas (no $ref)\n        strictUnions: false,           // More permissive union handling\n        errorMessages: false,          // Exclude error messages from schema\n        markdownDescription: false,    // Use 'description' not 'markdownDescription'\n        dateStrategy: 'string',        // Convert dates to ISO strings\n        emailStrategy: 'format:email', // Use 'format: email' for z.email()\n        base64Strategy: 'contentEncoding:base64', // Base64 handling\n      }) as any;\n\n      // Remove $schema property as it's not needed for LLM function calling\n      if (jsonSchema.$schema) {\n        delete jsonSchema.$schema;\n      }\n\n      return jsonSchema as Record<string, unknown>;\n    } catch (error) {\n      console.warn('Failed to convert Zod schema to JSON schema:', error);\n      // Fallback to basic object schema\n      return {\n        type: 'object',\n        properties: {},\n        additionalProperties: true\n      };\n    }\n  }\n\n\n  /**\n   * Execute a function with timeout\n   */\n  private async executeWithTimeout<T>(\n    fn: () => Promise<T>,\n    timeoutMs: number\n  ): Promise<T> {\n    return Promise.race([\n      fn(),\n      new Promise<T>((_, reject) =>\n        setTimeout(\n          () => reject(new Error(`Timeout after ${timeoutMs}ms`)),\n          timeoutMs\n        )\n      ),\n    ]);\n  }\n\n  /**\n   * Sleep for specified milliseconds\n   */\n  private sleep(ms: number): Promise<void> {\n    return new Promise((resolve) => setTimeout(resolve, ms));\n  }\n}\n\n/**\n * Factory function to create an agent\n */\nexport function createAgent(config: AgentConfig): Agent {\n  return new Agent(config);\n}\n","/**\n * ID generation utilities\n */\n\n/**\n * Generate a unique ID with optional prefix\n */\nexport function generateId(prefix?: string): string {\n  const timestamp = Date.now().toString(36);\n  const randomPart = Math.random().toString(36).substring(2, 9);\n  const id = `${timestamp}-${randomPart}`;\n  return prefix ? `${prefix}-${id}` : id;\n}\n\n/**\n * Generate a short unique ID\n */\nexport function generateShortId(): string {\n  return Math.random().toString(36).substring(2, 9);\n}\n","/**\n * LLM Provider Interface\n *\n * Defines the contract for LLM providers to integrate with the agent system\n */\n\nimport { Message, ToolCall } from '../types';\n\n/**\n * Chat request parameters\n */\nexport interface ChatRequest {\n  messages: Message[];\n  tools?: Array<{\n    name: string;\n    description: string;\n    parameters: Record<string, unknown>;\n  }>;\n  temperature?: number;\n  maxTokens?: number;\n  topP?: number;\n  streaming?: boolean;\n  onStream?: (chunk: string) => void | Promise<void>;\n}\n\n/**\n * Chat response\n */\nexport interface ChatResponse {\n  content: string;\n  toolCalls?: ToolCall[];\n  finishReason?: 'stop' | 'tool_calls' | 'length' | 'content_filter';\n  usage?: {\n    promptTokens: number;\n    completionTokens: number;\n    totalTokens: number;\n  };\n}\n\n/**\n * Base LLM provider interface\n */\nexport abstract class LLMProvider {\n  protected config: any;\n\n  constructor(config: any) {\n    this.config = config;\n  }\n\n  /**\n   * Send a chat request to the LLM\n   */\n  abstract chat(request: ChatRequest): Promise<ChatResponse>;\n\n  /**\n   * Get provider name\n   */\n  abstract getProviderName(): string;\n}\n","/**\n * OpenAI LLM Provider\n *\n * Integration with OpenAI's chat completion API\n */\n\nimport { LLMProvider, ChatRequest, ChatResponse } from './LLMProvider';\nimport { ToolCall, LLMError } from '../types';\nimport { generateShortId } from '../../utils/id';\n\n/**\n * OpenAI-specific configuration\n */\nexport interface OpenAIConfig {\n  apiKey: string;\n  model: string;\n  baseUrl?: string;\n  organization?: string;\n  temperature?: number;\n  maxTokens?: number;\n  topP?: number;\n}\n\n/**\n * OpenAI provider implementation\n */\nexport class OpenAIProvider extends LLMProvider {\n  private apiKey: string;\n  private baseUrl: string;\n  private model: string;\n\n  constructor(config: OpenAIConfig) {\n    super(config);\n    this.apiKey = config.apiKey || process.env['OPENAI_API_KEY'] || '';\n    this.baseUrl = config.baseUrl || 'https://api.openai.com/v1';\n    this.model = config.model;\n\n    if (!this.apiKey) {\n      throw new LLMError('OpenAI API key is required', 'openai', { config });\n    }\n  }\n\n  /**\n   * Send chat request to OpenAI\n   */\n  async chat(request: ChatRequest): Promise<ChatResponse> {\n    try {\n      const messages = this.convertMessages(request.messages);\n      const tools = request.tools ? this.convertTools(request.tools) : undefined;\n\n      const payload: any = {\n        model: this.model,\n        messages,\n        temperature: request.temperature ?? this.config.temperature ?? 0.7,\n        max_tokens: request.maxTokens ?? this.config.maxTokens,\n        top_p: request.topP ?? this.config.topP,\n        stream: request.streaming ?? false,\n      };\n\n      if (tools && tools.length > 0) {\n        payload.tools = tools;\n        payload.tool_choice = 'auto';\n      }\n\n      // Handle streaming\n      if (request.streaming && request.onStream) {\n        return await this.streamChat(payload, request.onStream);\n      }\n\n      // Regular non-streaming chat\n      const response = await fetch(`${this.baseUrl}/chat/completions`, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          Authorization: `Bearer ${this.apiKey}`,\n          ...(this.config.organization && {\n            'OpenAI-Organization': this.config.organization,\n          }),\n        },\n        body: JSON.stringify(payload),\n      });\n\n      if (!response.ok) {\n        const error = await response.json();\n        throw new Error(error.error?.message || 'OpenAI API error');\n      }\n\n      const data = await response.json();\n      return this.parseResponse(data);\n    } catch (error) {\n      const errorObj = error as Error;\n      throw new LLMError(\n        `OpenAI chat failed: ${errorObj.message}`,\n        'openai',\n        { model: this.model, error: errorObj }\n      );\n    }\n  }\n\n  /**\n   * Stream chat completion\n   */\n  private async streamChat(\n    payload: any,\n    onStream: (chunk: string) => void | Promise<void>\n  ): Promise<ChatResponse> {\n    const response = await fetch(`${this.baseUrl}/chat/completions`, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n        Authorization: `Bearer ${this.apiKey}`,\n        ...(this.config.organization && {\n          'OpenAI-Organization': this.config.organization,\n        }),\n      },\n      body: JSON.stringify(payload),\n    });\n\n    if (!response.ok) {\n      const error = await response.json();\n      throw new Error(error.error?.message || 'OpenAI API error');\n    }\n\n    const reader = response.body?.getReader();\n    if (!reader) {\n      throw new Error('No response body');\n    }\n\n    const decoder = new TextDecoder();\n    let content = '';\n    let toolCalls: ToolCall[] | undefined;\n\n    try {\n      while (true) {\n        const { done, value } = await reader.read();\n        if (done) break;\n\n        const chunk = decoder.decode(value);\n        const lines = chunk.split('\\n').filter((line) => line.trim() !== '');\n\n        for (const line of lines) {\n          if (line.startsWith('data: ')) {\n            const data = line.slice(6);\n            if (data === '[DONE]') continue;\n\n            try {\n              const parsed = JSON.parse(data);\n              const delta = parsed.choices?.[0]?.delta;\n\n              if (delta?.content) {\n                content += delta.content;\n                await onStream(delta.content);\n              }\n\n              if (delta?.tool_calls) {\n                toolCalls = this.parseToolCalls(delta.tool_calls);\n              }\n            } catch (e) {\n              // Skip invalid JSON\n            }\n          }\n        }\n      }\n    } finally {\n      reader.releaseLock();\n    }\n\n    return {\n      content,\n      toolCalls,\n      finishReason: toolCalls ? 'tool_calls' : 'stop',\n    };\n  }\n\n  /**\n   * Parse OpenAI response\n   */\n  private parseResponse(data: any): ChatResponse {\n    const choice = data.choices?.[0];\n    if (!choice) {\n      throw new Error('No choices in OpenAI response');\n    }\n\n    const message = choice.message;\n    const toolCalls = message.tool_calls\n      ? this.parseToolCalls(message.tool_calls)\n      : undefined;\n\n    return {\n      content: message.content || '',\n      toolCalls,\n      finishReason: this.mapFinishReason(choice.finish_reason),\n      usage: data.usage\n        ? {\n            promptTokens: data.usage.prompt_tokens,\n            completionTokens: data.usage.completion_tokens,\n            totalTokens: data.usage.total_tokens,\n          }\n        : undefined,\n    };\n  }\n\n  /**\n   * Convert messages to OpenAI format\n   */\n  private convertMessages(messages: any[]): any[] {\n    return messages.map((msg) => {\n      const converted: any = {\n        role: msg.role,\n        content: msg.content,\n      };\n\n      if (msg.name) {\n        converted.name = msg.name;\n      }\n\n      if (msg.toolCalls) {\n        converted.tool_calls = msg.toolCalls.map((tc: ToolCall) => ({\n          id: tc.id,\n          type: 'function',\n          function: {\n            name: tc.name,\n            arguments: JSON.stringify(tc.parameters),\n          },\n        }));\n      }\n\n      if (msg.toolCallId) {\n        converted.tool_call_id = msg.toolCallId;\n      }\n\n      return converted;\n    });\n  }\n\n  /**\n   * Convert tools to OpenAI format\n   */\n  private convertTools(tools: any[]): any[] {\n    return tools.map((tool) => ({\n      type: 'function',\n      function: {\n        name: tool.name,\n        description: tool.description,\n        parameters: tool.parameters,\n      },\n    }));\n  }\n\n  /**\n   * Parse tool calls from OpenAI response\n   */\n  private parseToolCalls(toolCalls: any[]): ToolCall[] {\n    return toolCalls.map((tc) => ({\n      id: tc.id || `tool-${generateShortId()}`,\n      name: tc.function.name,\n      parameters: JSON.parse(tc.function.arguments || '{}'),\n    }));\n  }\n\n  /**\n   * Map OpenAI finish reason to standard format\n   */\n  private mapFinishReason(\n    reason: string\n  ): 'stop' | 'tool_calls' | 'length' | 'content_filter' {\n    switch (reason) {\n      case 'stop':\n        return 'stop';\n      case 'tool_calls':\n        return 'tool_calls';\n      case 'length':\n        return 'length';\n      case 'content_filter':\n        return 'content_filter';\n      default:\n        return 'stop';\n    }\n  }\n\n  getProviderName(): string {\n    return 'openai';\n  }\n}\n","/**\n * Anthropic LLM Provider\n *\n * Integration with Anthropic's Claude API\n */\n\nimport { LLMProvider, ChatRequest, ChatResponse } from './LLMProvider';\nimport { ToolCall, LLMError } from '../types';\n// import { generateShortId } from '../../utils/id';\n\n/**\n * Anthropic-specific configuration\n */\nexport interface AnthropicConfig {\n  apiKey: string;\n  model: string;\n  baseUrl?: string;\n  temperature?: number;\n  maxTokens?: number;\n  topP?: number;\n}\n\n/**\n * Anthropic provider implementation\n */\nexport class AnthropicProvider extends LLMProvider {\n  private apiKey: string;\n  private baseUrl: string;\n  private model: string;\n\n  constructor(config: AnthropicConfig) {\n    super(config);\n    this.apiKey = config.apiKey || process.env['ANTHROPIC_API_KEY'] || '';\n    this.baseUrl = config.baseUrl || 'https://api.anthropic.com/v1';\n    this.model = config.model;\n\n    if (!this.apiKey) {\n      throw new LLMError('Anthropic API key is required', 'anthropic', { config });\n    }\n  }\n\n  /**\n   * Send chat request to Anthropic\n   */\n  async chat(request: ChatRequest): Promise<ChatResponse> {\n    try {\n      const { system, messages } = this.convertMessages(request.messages);\n      const tools = request.tools ? this.convertTools(request.tools) : undefined;\n\n      const payload: any = {\n        model: this.model,\n        messages,\n        max_tokens: request.maxTokens ?? this.config.maxTokens ?? 4096,\n        temperature: request.temperature ?? this.config.temperature ?? 0.7,\n        top_p: request.topP ?? this.config.topP,\n        stream: request.streaming ?? false,\n      };\n\n      if (system) {\n        payload.system = system;\n      }\n\n      if (tools && tools.length > 0) {\n        payload.tools = tools;\n      }\n\n      // Handle streaming\n      if (request.streaming && request.onStream) {\n        return await this.streamChat(payload, request.onStream);\n      }\n\n      // Regular non-streaming chat\n      const response = await fetch(`${this.baseUrl}/messages`, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          'x-api-key': this.apiKey,\n          'anthropic-version': '2023-06-01',\n        },\n        body: JSON.stringify(payload),\n      });\n\n      if (!response.ok) {\n        const error = await response.json();\n        throw new Error(error.error?.message || 'Anthropic API error');\n      }\n\n      const data = await response.json();\n      return this.parseResponse(data);\n    } catch (error) {\n      const errorObj = error as Error;\n      throw new LLMError(\n        `Anthropic chat failed: ${errorObj.message}`,\n        'anthropic',\n        { model: this.model, error: errorObj }\n      );\n    }\n  }\n\n  /**\n   * Stream chat completion\n   */\n  private async streamChat(\n    payload: any,\n    onStream: (chunk: string) => void | Promise<void>\n  ): Promise<ChatResponse> {\n    const response = await fetch(`${this.baseUrl}/messages`, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n        'x-api-key': this.apiKey,\n        'anthropic-version': '2023-06-01',\n      },\n      body: JSON.stringify(payload),\n    });\n\n    if (!response.ok) {\n      const error = await response.json();\n      throw new Error(error.error?.message || 'Anthropic API error');\n    }\n\n    const reader = response.body?.getReader();\n    if (!reader) {\n      throw new Error('No response body');\n    }\n\n    const decoder = new TextDecoder();\n    let content = '';\n    let toolCalls: ToolCall[] | undefined;\n\n    try {\n      while (true) {\n        const { done, value } = await reader.read();\n        if (done) break;\n\n        const chunk = decoder.decode(value);\n        const lines = chunk.split('\\n').filter((line) => line.trim() !== '');\n\n        for (const line of lines) {\n          if (line.startsWith('data: ')) {\n            const data = line.slice(6);\n\n            try {\n              const parsed = JSON.parse(data);\n\n              if (parsed.type === 'content_block_delta') {\n                const delta = parsed.delta;\n                if (delta.type === 'text_delta' && delta.text) {\n                  content += delta.text;\n                  await onStream(delta.text);\n                }\n              }\n\n              if (parsed.type === 'content_block_start') {\n                const block = parsed.content_block;\n                if (block.type === 'tool_use') {\n                  if (!toolCalls) toolCalls = [];\n                  toolCalls.push({\n                    id: block.id,\n                    name: block.name,\n                    parameters: {},\n                  });\n                }\n              }\n\n              if (parsed.type === 'content_block_delta') {\n                const delta = parsed.delta;\n                if (delta.type === 'input_json_delta' && delta.partial_json) {\n                  // Accumulate tool parameters\n                  if (toolCalls && toolCalls.length > 0) {\n                    const lastTool = toolCalls[toolCalls.length - 1];\n                    // Note: This is simplified - real implementation would\n                    // need to properly accumulate JSON chunks\n                    if (lastTool) {\n                      try {\n                        lastTool.parameters = JSON.parse(delta.partial_json);\n                      } catch {\n                        // Continue accumulating\n                      }\n                    }\n                  }\n                }\n              }\n            } catch (e) {\n              // Skip invalid JSON\n            }\n          }\n        }\n      }\n    } finally {\n      reader.releaseLock();\n    }\n\n    return {\n      content,\n      toolCalls,\n      finishReason: toolCalls ? 'tool_calls' : 'stop',\n    };\n  }\n\n  /**\n   * Parse Anthropic response\n   */\n  private parseResponse(data: any): ChatResponse {\n    let content = '';\n    let toolCalls: ToolCall[] | undefined;\n\n    // Anthropic returns content as an array of blocks\n    if (data.content && Array.isArray(data.content)) {\n      for (const block of data.content) {\n        if (block.type === 'text') {\n          content += block.text;\n        } else if (block.type === 'tool_use') {\n          if (!toolCalls) toolCalls = [];\n          toolCalls.push({\n            id: block.id,\n            name: block.name,\n            parameters: block.input || {},\n          });\n        }\n      }\n    }\n\n    return {\n      content,\n      toolCalls,\n      finishReason: this.mapStopReason(data.stop_reason),\n      usage: data.usage\n        ? {\n            promptTokens: data.usage.input_tokens,\n            completionTokens: data.usage.output_tokens,\n            totalTokens: data.usage.input_tokens + data.usage.output_tokens,\n          }\n        : undefined,\n    };\n  }\n\n  /**\n   * Convert messages to Anthropic format\n   */\n  private convertMessages(messages: any[]): {\n    system?: string;\n    messages: any[];\n  } {\n    let system: string | undefined;\n    const anthropicMessages: any[] = [];\n\n    for (const msg of messages) {\n      if (msg.role === 'system') {\n        system = msg.content;\n        continue;\n      }\n\n      if (msg.role === 'tool') {\n        // Tool result message\n        anthropicMessages.push({\n          role: 'user',\n          content: [\n            {\n              type: 'tool_result',\n              tool_use_id: msg.toolCallId,\n              content: msg.content,\n            },\n          ],\n        });\n      } else if (msg.toolCalls) {\n        // Assistant message with tool calls\n        const content: any[] = [];\n\n        if (msg.content) {\n          content.push({\n            type: 'text',\n            text: msg.content,\n          });\n        }\n\n        for (const tc of msg.toolCalls) {\n          content.push({\n            type: 'tool_use',\n            id: tc.id,\n            name: tc.name,\n            input: tc.parameters,\n          });\n        }\n\n        anthropicMessages.push({\n          role: 'assistant',\n          content,\n        });\n      } else {\n        // Regular message\n        anthropicMessages.push({\n          role: msg.role === 'user' ? 'user' : 'assistant',\n          content: msg.content,\n        });\n      }\n    }\n\n    return { system, messages: anthropicMessages };\n  }\n\n  /**\n   * Convert tools to Anthropic format\n   */\n  private convertTools(tools: any[]): any[] {\n    return tools.map((tool) => ({\n      name: tool.name,\n      description: tool.description,\n      input_schema: tool.parameters,\n    }));\n  }\n\n  /**\n   * Map Anthropic stop reason to standard format\n   */\n  private mapStopReason(\n    reason: string\n  ): 'stop' | 'tool_calls' | 'length' | 'content_filter' {\n    switch (reason) {\n      case 'end_turn':\n        return 'stop';\n      case 'tool_use':\n        return 'tool_calls';\n      case 'max_tokens':\n        return 'length';\n      case 'stop_sequence':\n        return 'stop';\n      default:\n        return 'stop';\n    }\n  }\n\n  getProviderName(): string {\n    return 'anthropic';\n  }\n}\n","/**\n * AIKIT AgentExecutor - Multi-Step Agent Execution Engine\n *\n * This module implements the core agent execution loop with tool calling,\n * streaming support, error handling, and detailed execution tracing.\n */\n\nimport { Agent } from './Agent';\nimport {\n  AgentState,\n  Message,\n  ToolResult,\n  ExecutionTrace,\n  TraceEvent,\n  StreamCallback,\n  StreamEvent,\n  MaxStepsExceededError,\n  LLMError,\n  AgentError,\n} from './types';\nimport { generateId } from '../utils/id';\nimport { LLMProvider } from './llm/LLMProvider';\nimport { OpenAIProvider } from './llm/OpenAIProvider';\nimport { AnthropicProvider } from './llm/AnthropicProvider';\n\n/**\n * Configuration for agent execution\n */\nexport interface ExecutionConfig {\n  /**\n   * Maximum number of steps before stopping\n   */\n  maxSteps?: number;\n\n  /**\n   * Whether to enable streaming\n   */\n  streaming?: boolean;\n\n  /**\n   * Stream callback for real-time updates\n   */\n  onStream?: StreamCallback;\n\n  /**\n   * Whether to include detailed traces\n   */\n  verbose?: boolean;\n\n  /**\n   * Custom LLM provider instance\n   */\n  llmProvider?: LLMProvider;\n\n  /**\n   * Additional context to include in execution\n   */\n  context?: Record<string, unknown>;\n}\n\n/**\n * Result of agent execution\n */\nexport interface ExecutionResult {\n  /**\n   * Final response from the agent\n   */\n  response: string;\n\n  /**\n   * Final agent state\n   */\n  state: AgentState;\n\n  /**\n   * Complete execution trace\n   */\n  trace: ExecutionTrace;\n\n  /**\n   * Whether execution was successful\n   */\n  success: boolean;\n\n  /**\n   * Error if execution failed\n   */\n  error?: Error;\n}\n\n/**\n * AgentExecutor - Orchestrates multi-step agent execution with tool calling\n */\nexport class AgentExecutor {\n  private agent: Agent;\n  private llmProvider: LLMProvider;\n  private executionId: string;\n  private trace: ExecutionTrace;\n  private state: AgentState;\n  private defaultConfig: ExecutionConfig;\n\n  constructor(agent: Agent, config?: ExecutionConfig) {\n    this.agent = agent;\n    this.executionId = generateId('exec');\n    this.defaultConfig = config ?? {};\n\n    // Initialize LLM provider\n    if (config?.llmProvider) {\n      this.llmProvider = config.llmProvider;\n    } else {\n      this.llmProvider = this.createLLMProvider(agent.config.llm);\n    }\n\n    // Initialize trace\n    this.trace = {\n      executionId: this.executionId,\n      agentId: agent.config.id,\n      startTime: new Date().toISOString(),\n      events: [],\n      stats: {\n        totalSteps: 0,\n        totalToolCalls: 0,\n        totalLLMCalls: 0,\n        successfulToolCalls: 0,\n        failedToolCalls: 0,\n      },\n    };\n\n    // Initialize state\n    this.state = {\n      step: 0,\n      messages: [],\n      pendingToolCalls: [],\n      toolResults: [],\n      isComplete: false,\n    };\n  }\n\n  /**\n   * Execute the agent with the given input\n   */\n  public async execute(\n    input: string,\n    config?: ExecutionConfig\n  ): Promise<ExecutionResult> {\n    const startTime = Date.now();\n\n    try {\n      // Add trace event for agent start\n      this.addTraceEvent({\n        type: 'agent_start',\n        timestamp: new Date().toISOString(),\n        data: {\n          input,\n          agentId: this.agent.config.id,\n          config,\n        },\n      });\n\n      // Emit stream event\n      await this.emitStreamEvent(config?.onStream, {\n        type: 'start',\n        timestamp: new Date().toISOString(),\n        data: { input },\n      });\n\n      // Build initial messages\n      this.state.messages = this.agent.buildInitialMessages(input);\n\n      // Execute the main loop\n      const maxSteps = config?.maxSteps ?? this.defaultConfig.maxSteps ?? this.agent.config.maxSteps ?? 10;\n      await this.executionLoop(maxSteps, config);\n\n      // Calculate final stats\n      this.trace.endTime = new Date().toISOString();\n      this.trace.durationMs = Date.now() - startTime;\n      this.trace.finalState = this.state;\n\n      // Add trace event for agent end\n      this.addTraceEvent({\n        type: 'agent_end',\n        timestamp: new Date().toISOString(),\n        data: {\n          success: !this.state.error,\n          finalResponse: this.state.finalResponse,\n        },\n        durationMs: this.trace.durationMs,\n      });\n\n      // Emit completion stream event\n      await this.emitStreamEvent(config?.onStream, {\n        type: 'complete',\n        timestamp: new Date().toISOString(),\n        data: {\n          response: this.state.finalResponse ?? '',\n          trace: this.trace,\n        },\n      });\n\n      return {\n        response: this.state.finalResponse ?? '',\n        state: this.state,\n        trace: this.trace,\n        success: !this.state.error,\n        error: this.state.error\n          ? new Error(this.state.error.message)\n          : undefined,\n      };\n    } catch (error) {\n      // Handle unexpected errors\n      const errorObj = error as Error;\n      this.state.error = {\n        message: errorObj.message,\n        step: this.state.step,\n        cause: error,\n      };\n\n      this.trace.endTime = new Date().toISOString();\n      this.trace.durationMs = Date.now() - startTime;\n      this.trace.finalState = this.state;\n\n      this.addTraceEvent({\n        type: 'error',\n        timestamp: new Date().toISOString(),\n        data: {\n          error: errorObj.message,\n          stack: errorObj.stack,\n        },\n      });\n\n      await this.emitStreamEvent(config?.onStream, {\n        type: 'error',\n        timestamp: new Date().toISOString(),\n        data: { error: errorObj.message },\n      });\n\n      return {\n        response: '',\n        state: this.state,\n        trace: this.trace,\n        success: false,\n        error: errorObj,\n      };\n    }\n  }\n\n  /**\n   * Main execution loop\n   */\n  private async executionLoop(\n    maxSteps: number,\n    config?: ExecutionConfig\n  ): Promise<void> {\n    while (this.state.step < maxSteps && !this.state.isComplete) {\n      // Only increment step counter for LLM reasoning steps, not for tool execution\n      const isToolExecutionStep = this.state.pendingToolCalls.length > 0;\n      if (!isToolExecutionStep) {\n        this.state.step++;\n        this.trace.stats.totalSteps++;\n      }\n\n      // Add step start trace event\n      this.addTraceEvent({\n        type: 'step_start',\n        timestamp: new Date().toISOString(),\n        step: this.state.step,\n        data: {\n          messagesCount: this.state.messages.length,\n          pendingToolCalls: this.state.pendingToolCalls.length,\n        },\n      });\n\n      // Emit step stream event\n      await this.emitStreamEvent(config?.onStream, {\n        type: 'step',\n        timestamp: new Date().toISOString(),\n        data: { step: this.state.step },\n      });\n\n      try {\n        // If there are pending tool calls, execute them\n        if (isToolExecutionStep) {\n          await this.executeToolCallsStep(config);\n        } else {\n          // Otherwise, get next response from LLM\n          await this.llmStep(config);\n        }\n      } catch (error) {\n        const errorObj = error as Error;\n\n        // Check if it's a MaxStepsExceededError\n        if (error instanceof MaxStepsExceededError) {\n          throw error;\n        }\n\n        // Log error in trace but continue if possible\n        this.addTraceEvent({\n          type: 'error',\n          timestamp: new Date().toISOString(),\n          step: this.state.step,\n          data: {\n            error: errorObj.message,\n            stack: errorObj.stack,\n          },\n        });\n\n        // If it's a critical error, stop execution\n        if (error instanceof LLMError) {\n          this.state.error = {\n            message: errorObj.message,\n            step: this.state.step,\n            cause: error,\n          };\n          this.state.isComplete = true;\n          break;\n        }\n\n        // For tool errors, we can continue\n        continue;\n      }\n\n      // Add step end trace event\n      this.addTraceEvent({\n        type: 'step_end',\n        timestamp: new Date().toISOString(),\n        step: this.state.step,\n        data: {\n          isComplete: this.state.isComplete,\n        },\n      });\n    }\n\n    // Check if we exceeded max steps\n    if (this.state.step >= maxSteps && !this.state.isComplete) {\n      throw new MaxStepsExceededError(maxSteps, {\n        executionId: this.executionId,\n        step: this.state.step,\n      });\n    }\n  }\n\n  /**\n   * Execute LLM step to get next response\n   */\n  private async llmStep(config?: ExecutionConfig): Promise<void> {\n    const startTime = Date.now();\n\n    // Add LLM request trace event\n    this.addTraceEvent({\n      type: 'llm_request',\n      timestamp: new Date().toISOString(),\n      step: this.state.step,\n      data: {\n        messagesCount: this.state.messages.length,\n        tools: this.agent.getToolSchemas(),\n      },\n    });\n\n    this.trace.stats.totalLLMCalls++;\n\n    try {\n      // Call LLM provider\n      const response = await this.llmProvider.chat({\n        messages: this.state.messages,\n        tools: this.agent.getToolSchemas(),\n        streaming: config?.streaming,\n        onStream: config?.streaming\n          ? async (chunk) => {\n              await this.emitStreamEvent(config.onStream, {\n                type: 'text_chunk',\n                timestamp: new Date().toISOString(),\n                data: chunk,\n              });\n            }\n          : undefined,\n      });\n\n      // Add LLM response trace event\n      this.addTraceEvent({\n        type: 'llm_response',\n        timestamp: new Date().toISOString(),\n        step: this.state.step,\n        data: {\n          content: response.content,\n          toolCalls: response.toolCalls,\n          finishReason: response.finishReason,\n        },\n        durationMs: Date.now() - startTime,\n      });\n\n      // Add assistant message to conversation\n      const assistantMessage: Message = {\n        role: 'assistant',\n        content: response.content,\n        toolCalls: response.toolCalls,\n        timestamp: new Date().toISOString(),\n      };\n      this.state.messages.push(assistantMessage);\n\n      // Check if LLM wants to call tools\n      if (response.toolCalls && response.toolCalls.length > 0) {\n        this.state.pendingToolCalls = response.toolCalls;\n        this.trace.stats.totalToolCalls += response.toolCalls.length;\n\n        // Emit tool call events\n        for (const toolCall of response.toolCalls) {\n          await this.emitStreamEvent(config?.onStream, {\n            type: 'tool_call',\n            timestamp: new Date().toISOString(),\n            data: { toolCall },\n          });\n        }\n      } else {\n        // No tool calls - execution is complete\n        this.state.isComplete = true;\n        this.state.finalResponse = response.content;\n      }\n    } catch (error) {\n      const errorObj = error as Error;\n      throw new LLMError(\n        `LLM call failed: ${errorObj.message}`,\n        this.agent.config.llm.provider,\n        {\n          step: this.state.step,\n          messagesCount: this.state.messages.length,\n        }\n      );\n    }\n  }\n\n  /**\n   * Execute pending tool calls\n   */\n  private async executeToolCallsStep(config?: ExecutionConfig): Promise<void> {\n    const toolCalls = this.state.pendingToolCalls;\n    this.state.pendingToolCalls = [];\n\n    const results: ToolResult[] = [];\n\n    for (const toolCall of toolCalls) {\n      const startTime = Date.now();\n\n      // Add tool call start trace event\n      this.addTraceEvent({\n        type: 'tool_call_start',\n        timestamp: new Date().toISOString(),\n        step: this.state.step,\n        data: {\n          toolCallId: toolCall.id,\n          toolName: toolCall.name,\n          parameters: toolCall.parameters,\n        },\n      });\n\n      try {\n        // Execute tool\n        const result = await this.agent.executeToolCall(toolCall);\n        results.push(result);\n\n        // Update stats\n        if (result.error) {\n          this.trace.stats.failedToolCalls++;\n\n          // Add tool error trace event\n          this.addTraceEvent({\n            type: 'tool_call_error',\n            timestamp: new Date().toISOString(),\n            step: this.state.step,\n            data: {\n              toolCallId: toolCall.id,\n              toolName: toolCall.name,\n              error: result.error,\n            },\n            durationMs: Date.now() - startTime,\n          });\n        } else {\n          this.trace.stats.successfulToolCalls++;\n\n          // Add tool call end trace event\n          this.addTraceEvent({\n            type: 'tool_call_end',\n            timestamp: new Date().toISOString(),\n            step: this.state.step,\n            data: {\n              toolCallId: toolCall.id,\n              toolName: toolCall.name,\n              result: result.result,\n            },\n            durationMs: Date.now() - startTime,\n          });\n        }\n\n        // Emit tool result stream event\n        await this.emitStreamEvent(config?.onStream, {\n          type: 'tool_result',\n          timestamp: new Date().toISOString(),\n          data: { result },\n        });\n\n        // Add tool result message to conversation\n        const toolMessage: Message = {\n          role: 'tool',\n          content: result.error\n            ? `Error: ${result.error.message}`\n            : JSON.stringify(result.result),\n          name: toolCall.name,\n          toolCallId: toolCall.id,\n          timestamp: new Date().toISOString(),\n        };\n        this.state.messages.push(toolMessage);\n        this.state.toolResults.push(result);\n      } catch (error) {\n        const errorObj = error as Error;\n        this.trace.stats.failedToolCalls++;\n\n        // Add tool error trace event\n        this.addTraceEvent({\n          type: 'tool_call_error',\n          timestamp: new Date().toISOString(),\n          step: this.state.step,\n          data: {\n            toolCallId: toolCall.id,\n            toolName: toolCall.name,\n            error: errorObj.message,\n            stack: errorObj.stack,\n          },\n          durationMs: Date.now() - startTime,\n        });\n\n        // Add error message to conversation\n        const errorMessage: Message = {\n          role: 'tool',\n          content: `Error: ${errorObj.message}`,\n          name: toolCall.name,\n          toolCallId: toolCall.id,\n          timestamp: new Date().toISOString(),\n        };\n        this.state.messages.push(errorMessage);\n      }\n    }\n  }\n\n  /**\n   * Add an event to the execution trace\n   */\n  private addTraceEvent(event: TraceEvent): void {\n    this.trace.events.push(event);\n  }\n\n  /**\n   * Emit a stream event\n   */\n  private async emitStreamEvent(\n    callback: StreamCallback | undefined,\n    event: StreamEvent\n  ): Promise<void> {\n    if (callback) {\n      try {\n        await callback(event);\n      } catch (error) {\n        // Log but don't fail execution on stream errors\n        console.error('Stream callback error:', error);\n      }\n    }\n  }\n\n  /**\n   * Create LLM provider based on config\n   */\n  private createLLMProvider(llmConfig: any): LLMProvider {\n    switch (llmConfig.provider) {\n      case 'openai':\n        return new OpenAIProvider(llmConfig);\n      case 'anthropic':\n        return new AnthropicProvider(llmConfig);\n      default:\n        throw new AgentError(\n          `Unsupported LLM provider: ${llmConfig.provider}`,\n          'UNSUPPORTED_PROVIDER'\n        );\n    }\n  }\n\n  /**\n   * Get current execution trace\n   */\n  public getTrace(): ExecutionTrace {\n    return { ...this.trace };\n  }\n\n  /**\n   * Get current agent state\n   */\n  public getState(): AgentState {\n    return { ...this.state };\n  }\n}\n\n/**\n * Factory function to create and execute an agent in one call\n */\nexport async function executeAgent(\n  agent: Agent,\n  input: string,\n  config?: ExecutionConfig\n): Promise<ExecutionResult> {\n  const executor = new AgentExecutor(agent, config);\n  return executor.execute(input, config);\n}\n","/**\n * AIKIT StreamingAgentExecutor - Streaming Agent Execution with Async Iterators\n *\n * This module provides streaming execution capabilities for agents,\n * allowing real-time updates as the agent thinks, calls tools, and generates responses.\n */\n\nimport { Agent } from './Agent';\nimport {\n  AgentState,\n  Message,\n  ToolResult,\n  ExecutionTrace,\n  TraceEvent,\n  AgentExecutionEvent,\n  AgentStepEvent,\n  ThoughtEvent,\n  ToolCallEvent,\n  ToolResultEvent,\n  FinalAnswerEvent,\n  ErrorEvent,\n  MaxStepsExceededError,\n  LLMError,\n  AgentError,\n} from './types';\nimport { generateId } from '../utils/id';\nimport { LLMProvider } from './llm/LLMProvider';\nimport { OpenAIProvider } from './llm/OpenAIProvider';\nimport { AnthropicProvider } from './llm/AnthropicProvider';\n\n/**\n * Configuration for streaming execution\n */\nexport interface StreamingExecutionConfig {\n  /**\n   * Maximum number of steps before stopping\n   */\n  maxSteps?: number;\n\n  /**\n   * Custom LLM provider instance\n   */\n  llmProvider?: LLMProvider;\n\n  /**\n   * Whether to include detailed traces\n   */\n  verbose?: boolean;\n\n  /**\n   * Additional context to include in execution\n   */\n  context?: Record<string, unknown>;\n}\n\n/**\n * Complete streaming execution result\n */\nexport interface StreamingExecutionResult {\n  /**\n   * Final response from the agent\n   */\n  response: string;\n\n  /**\n   * Final agent state\n   */\n  state: AgentState;\n\n  /**\n   * Complete execution trace\n   */\n  trace: ExecutionTrace;\n\n  /**\n   * Whether execution was successful\n   */\n  success: boolean;\n\n  /**\n   * Error if execution failed\n   */\n  error?: Error;\n}\n\n/**\n * StreamingAgentExecutor - Provides async iterator-based streaming execution\n *\n * Usage:\n * ```typescript\n * const executor = new StreamingAgentExecutor(agent);\n * for await (const event of executor.stream(input)) {\n *   if (event.type === 'thought') {\n *     console.log('Agent thinking:', event.content);\n *   } else if (event.type === 'tool_call') {\n *     console.log('Calling tool:', event.toolCall.name);\n *   } else if (event.type === 'final_answer') {\n *     console.log('Final answer:', event.answer);\n *   }\n * }\n * ```\n */\nexport class StreamingAgentExecutor {\n  private agent: Agent;\n  private llmProvider: LLMProvider;\n  private executionId: string;\n  private trace: ExecutionTrace;\n  private state: AgentState;\n\n  constructor(agent: Agent, config?: StreamingExecutionConfig) {\n    this.agent = agent;\n    this.executionId = generateId('exec');\n\n    // Initialize LLM provider\n    if (config?.llmProvider) {\n      this.llmProvider = config.llmProvider;\n    } else {\n      this.llmProvider = this.createLLMProvider(agent.config.llm);\n    }\n\n    // Initialize trace\n    this.trace = {\n      executionId: this.executionId,\n      agentId: agent.config.id,\n      startTime: new Date().toISOString(),\n      events: [],\n      stats: {\n        totalSteps: 0,\n        totalToolCalls: 0,\n        totalLLMCalls: 0,\n        successfulToolCalls: 0,\n        failedToolCalls: 0,\n      },\n    };\n\n    // Initialize state\n    this.state = {\n      step: 0,\n      messages: [],\n      pendingToolCalls: [],\n      toolResults: [],\n      isComplete: false,\n    };\n  }\n\n  /**\n   * Stream agent execution as an async iterator\n   * Yields events as the agent progresses through execution\n   */\n  async *stream(\n    input: string,\n    config?: StreamingExecutionConfig\n  ): AsyncGenerator<AgentExecutionEvent, StreamingExecutionResult, undefined> {\n    const startTime = Date.now();\n\n    try {\n      // Add trace event for agent start\n      this.addTraceEvent({\n        type: 'agent_start',\n        timestamp: new Date().toISOString(),\n        data: {\n          input,\n          agentId: this.agent.config.id,\n          config,\n        },\n      });\n\n      // Build initial messages\n      this.state.messages = this.agent.buildInitialMessages(input);\n\n      // Execute the main loop\n      const maxSteps = config?.maxSteps ?? this.agent.config.maxSteps ?? 10;\n\n      // Execute the streaming loop\n      yield* this.executionStreamLoop(maxSteps, config);\n\n      // Calculate final stats\n      this.trace.endTime = new Date().toISOString();\n      this.trace.durationMs = Date.now() - startTime;\n      this.trace.finalState = this.state;\n\n      // Add trace event for agent end\n      this.addTraceEvent({\n        type: 'agent_end',\n        timestamp: new Date().toISOString(),\n        data: {\n          success: !this.state.error,\n          finalResponse: this.state.finalResponse,\n        },\n        durationMs: this.trace.durationMs,\n      });\n\n      return {\n        response: this.state.finalResponse ?? '',\n        state: this.state,\n        trace: this.trace,\n        success: !this.state.error,\n        error: this.state.error\n          ? new Error(this.state.error.message)\n          : undefined,\n      };\n    } catch (error) {\n      // Handle unexpected errors\n      const errorObj = error as Error;\n\n      // Re-throw MaxStepsExceededError - this is an expected constraint violation\n      if (error instanceof MaxStepsExceededError) {\n        throw error;\n      }\n\n      this.state.error = {\n        message: errorObj.message,\n        step: this.state.step,\n        cause: error,\n      };\n\n      this.trace.endTime = new Date().toISOString();\n      this.trace.durationMs = Date.now() - startTime;\n      this.trace.finalState = this.state;\n\n      this.addTraceEvent({\n        type: 'error',\n        timestamp: new Date().toISOString(),\n        data: {\n          error: errorObj.message,\n          stack: errorObj.stack,\n        },\n      });\n\n      // Yield error event\n      const errorEvent: ErrorEvent = {\n        type: 'error',\n        error: errorObj.message,\n        code:\n          error instanceof AgentError\n            ? error.code\n            : 'UNKNOWN_ERROR',\n        step: this.state.step,\n        timestamp: new Date().toISOString(),\n      };\n      yield errorEvent;\n\n      return {\n        response: '',\n        state: this.state,\n        trace: this.trace,\n        success: false,\n        error: errorObj,\n      };\n    }\n  }\n\n  /**\n   * Main streaming execution loop\n   */\n  private async *executionStreamLoop(\n    maxSteps: number,\n    config?: StreamingExecutionConfig\n  ): AsyncGenerator<AgentExecutionEvent, void, undefined> {\n    while (this.state.step < maxSteps && !this.state.isComplete) {\n      this.state.step++;\n      this.trace.stats.totalSteps++;\n\n      // Add step start trace event\n      this.addTraceEvent({\n        type: 'step_start',\n        timestamp: new Date().toISOString(),\n        step: this.state.step,\n        data: {\n          messagesCount: this.state.messages.length,\n          pendingToolCalls: this.state.pendingToolCalls.length,\n        },\n      });\n\n      // Emit step event\n      const stepEvent: AgentStepEvent = {\n        type: 'step',\n        step: this.state.step,\n        timestamp: new Date().toISOString(),\n        metadata: {\n          messagesCount: this.state.messages.length,\n          pendingToolCalls: this.state.pendingToolCalls.length,\n        },\n      };\n      yield stepEvent;\n\n      try {\n        // If there are pending tool calls, execute them\n        if (this.state.pendingToolCalls.length > 0) {\n          yield* this.executeToolCallsStreamStep(config);\n        } else {\n          // Otherwise, get next response from LLM\n          yield* this.llmStreamStep(config);\n        }\n      } catch (error) {\n        const errorObj = error as Error;\n\n        // Check if it's a MaxStepsExceededError\n        if (error instanceof MaxStepsExceededError) {\n          throw error;\n        }\n\n        // Log error in trace\n        this.addTraceEvent({\n          type: 'error',\n          timestamp: new Date().toISOString(),\n          step: this.state.step,\n          data: {\n            error: errorObj.message,\n            stack: errorObj.stack,\n          },\n        });\n\n        // Yield error event\n        const errorEvent: ErrorEvent = {\n          type: 'error',\n          error: errorObj.message,\n          code:\n            error instanceof AgentError\n              ? error.code\n              : 'UNKNOWN_ERROR',\n          step: this.state.step,\n          timestamp: new Date().toISOString(),\n        };\n        yield errorEvent;\n\n        // If it's a critical error, stop execution\n        if (error instanceof LLMError) {\n          this.state.error = {\n            message: errorObj.message,\n            step: this.state.step,\n            cause: error,\n          };\n          this.state.isComplete = true;\n          break;\n        }\n\n        // For tool errors, we can continue\n        continue;\n      }\n\n      // Add step end trace event\n      this.addTraceEvent({\n        type: 'step_end',\n        timestamp: new Date().toISOString(),\n        step: this.state.step,\n        data: {\n          isComplete: this.state.isComplete,\n        },\n      });\n    }\n\n    // Check if we exceeded max steps\n    if (this.state.step >= maxSteps && !this.state.isComplete) {\n      throw new MaxStepsExceededError(maxSteps, {\n        executionId: this.executionId,\n        step: this.state.step,\n      });\n    }\n  }\n\n  /**\n   * Execute LLM step and stream thoughts\n   */\n  private async *llmStreamStep(\n    _config?: StreamingExecutionConfig\n  ): AsyncGenerator<AgentExecutionEvent, void, undefined> {\n    const startTime = Date.now();\n\n    // Add LLM request trace event\n    this.addTraceEvent({\n      type: 'llm_request',\n      timestamp: new Date().toISOString(),\n      step: this.state.step,\n      data: {\n        messagesCount: this.state.messages.length,\n        tools: this.agent.getToolSchemas(),\n      },\n    });\n\n    this.trace.stats.totalLLMCalls++;\n\n    try {\n      // Call LLM provider\n      const response = await this.llmProvider.chat({\n        messages: this.state.messages,\n        tools: this.agent.getToolSchemas(),\n        streaming: false, // We handle our own streaming of events\n      });\n\n      // Add LLM response trace event\n      this.addTraceEvent({\n        type: 'llm_response',\n        timestamp: new Date().toISOString(),\n        step: this.state.step,\n        data: {\n          content: response.content,\n          toolCalls: response.toolCalls,\n          finishReason: response.finishReason,\n        },\n        durationMs: Date.now() - startTime,\n      });\n\n      // If there's content, yield it as a thought event\n      if (response.content && response.content.trim()) {\n        const thoughtEvent: ThoughtEvent = {\n          type: 'thought',\n          content: response.content,\n          step: this.state.step,\n          timestamp: new Date().toISOString(),\n        };\n        yield thoughtEvent;\n      }\n\n      // Add assistant message to conversation\n      const assistantMessage: Message = {\n        role: 'assistant',\n        content: response.content,\n        toolCalls: response.toolCalls,\n        timestamp: new Date().toISOString(),\n      };\n      this.state.messages.push(assistantMessage);\n\n      // Check if LLM wants to call tools\n      if (response.toolCalls && response.toolCalls.length > 0) {\n        this.state.pendingToolCalls = response.toolCalls;\n        this.trace.stats.totalToolCalls += response.toolCalls.length;\n\n        // Yield tool call events\n        for (const toolCall of response.toolCalls) {\n          const toolCallEvent: ToolCallEvent = {\n            type: 'tool_call',\n            toolCall,\n            step: this.state.step,\n            timestamp: new Date().toISOString(),\n          };\n          yield toolCallEvent;\n        }\n      } else {\n        // No tool calls - execution is complete\n        this.state.isComplete = true;\n        this.state.finalResponse = response.content;\n\n        // Yield final answer event\n        const finalAnswerEvent: FinalAnswerEvent = {\n          type: 'final_answer',\n          answer: response.content,\n          step: this.state.step,\n          timestamp: new Date().toISOString(),\n        };\n        yield finalAnswerEvent;\n      }\n    } catch (error) {\n      const errorObj = error as Error;\n      throw new LLMError(\n        `LLM call failed: ${errorObj.message}`,\n        this.agent.config.llm.provider,\n        {\n          step: this.state.step,\n          messagesCount: this.state.messages.length,\n        }\n      );\n    }\n  }\n\n  /**\n   * Execute pending tool calls and stream results\n   */\n  private async *executeToolCallsStreamStep(\n    _config?: StreamingExecutionConfig\n  ): AsyncGenerator<AgentExecutionEvent, void, undefined> {\n    const toolCalls = this.state.pendingToolCalls;\n    this.state.pendingToolCalls = [];\n\n    for (const toolCall of toolCalls) {\n      const startTime = Date.now();\n\n      // Add tool call start trace event\n      this.addTraceEvent({\n        type: 'tool_call_start',\n        timestamp: new Date().toISOString(),\n        step: this.state.step,\n        data: {\n          toolCallId: toolCall.id,\n          toolName: toolCall.name,\n          parameters: toolCall.parameters,\n        },\n      });\n\n      try {\n        // Execute tool\n        const result = await this.agent.executeToolCall(toolCall);\n\n        // Update stats\n        if (result.error) {\n          this.trace.stats.failedToolCalls++;\n\n          // Add tool error trace event\n          this.addTraceEvent({\n            type: 'tool_call_error',\n            timestamp: new Date().toISOString(),\n            step: this.state.step,\n            data: {\n              toolCallId: toolCall.id,\n              toolName: toolCall.name,\n              error: result.error,\n            },\n            durationMs: Date.now() - startTime,\n          });\n        } else {\n          this.trace.stats.successfulToolCalls++;\n\n          // Add tool call end trace event\n          this.addTraceEvent({\n            type: 'tool_call_end',\n            timestamp: new Date().toISOString(),\n            step: this.state.step,\n            data: {\n              toolCallId: toolCall.id,\n              toolName: toolCall.name,\n              result: result.result,\n            },\n            durationMs: Date.now() - startTime,\n          });\n        }\n\n        // Yield tool result event\n        const toolResultEvent: ToolResultEvent = {\n          type: 'tool_result',\n          result,\n          step: this.state.step,\n          timestamp: new Date().toISOString(),\n        };\n        yield toolResultEvent;\n\n        // Add tool result message to conversation\n        const toolMessage: Message = {\n          role: 'tool',\n          content: result.error\n            ? `Error: ${result.error.message}`\n            : JSON.stringify(result.result),\n          name: toolCall.name,\n          toolCallId: toolCall.id,\n          timestamp: new Date().toISOString(),\n        };\n        this.state.messages.push(toolMessage);\n        this.state.toolResults.push(result);\n      } catch (error) {\n        const errorObj = error as Error;\n        this.trace.stats.failedToolCalls++;\n\n        // Add tool error trace event\n        this.addTraceEvent({\n          type: 'tool_call_error',\n          timestamp: new Date().toISOString(),\n          step: this.state.step,\n          data: {\n            toolCallId: toolCall.id,\n            toolName: toolCall.name,\n            error: errorObj.message,\n            stack: errorObj.stack,\n          },\n          durationMs: Date.now() - startTime,\n        });\n\n        // Create error result\n        const errorResult: ToolResult = {\n          toolCallId: toolCall.id,\n          toolName: toolCall.name,\n          result: null,\n          error: {\n            message: errorObj.message,\n            code: 'EXECUTION_ERROR',\n            stack: errorObj.stack,\n          },\n          metadata: {\n            durationMs: Date.now() - startTime,\n            timestamp: new Date().toISOString(),\n          },\n        };\n\n        // Yield tool result event with error\n        const toolResultEvent: ToolResultEvent = {\n          type: 'tool_result',\n          result: errorResult,\n          step: this.state.step,\n          timestamp: new Date().toISOString(),\n        };\n        yield toolResultEvent;\n\n        // Add error message to conversation\n        const errorMessage: Message = {\n          role: 'tool',\n          content: `Error: ${errorObj.message}`,\n          name: toolCall.name,\n          toolCallId: toolCall.id,\n          timestamp: new Date().toISOString(),\n        };\n        this.state.messages.push(errorMessage);\n      }\n    }\n  }\n\n  /**\n   * Add an event to the execution trace\n   */\n  private addTraceEvent(event: TraceEvent): void {\n    this.trace.events.push(event);\n  }\n\n  /**\n   * Create LLM provider based on config\n   */\n  private createLLMProvider(llmConfig: any): LLMProvider {\n    switch (llmConfig.provider) {\n      case 'openai':\n        return new OpenAIProvider(llmConfig);\n      case 'anthropic':\n        return new AnthropicProvider(llmConfig);\n      default:\n        throw new AgentError(\n          `Unsupported LLM provider: ${llmConfig.provider}`,\n          'UNSUPPORTED_PROVIDER'\n        );\n    }\n  }\n\n  /**\n   * Get current execution trace\n   */\n  public getTrace(): ExecutionTrace {\n    return { ...this.trace };\n  }\n\n  /**\n   * Get current agent state\n   */\n  public getState(): AgentState {\n    return { ...this.state };\n  }\n}\n\n/**\n * Factory function to create a streaming executor and iterate over events\n */\nexport async function* streamAgentExecution(\n  agent: Agent,\n  input: string,\n  config?: StreamingExecutionConfig\n): AsyncGenerator<AgentExecutionEvent, StreamingExecutionResult, undefined> {\n  const executor = new StreamingAgentExecutor(agent, config);\n  return yield* executor.stream(input, config);\n}\n","/**\n * AIKIT AgentSwarm - Multi-Agent Coordination System\n *\n * This module implements a swarm architecture where a supervisor agent\n * coordinates multiple specialist agents to handle complex tasks.\n */\n\nimport { EventEmitter } from 'events';\nimport { Agent } from './Agent';\nimport { AgentExecutor, ExecutionConfig, ExecutionResult } from './AgentExecutor';\nimport {\n  SwarmConfig,\n  SwarmResult,\n  SpecialistAgent,\n  SpecialistResult,\n  TaskRoutingDecision,\n  ExecutionTrace,\n  TraceEvent,\n  AgentError,\n} from './types';\nimport { generateId } from '../utils/id';\n\n/**\n * Events emitted by the AgentSwarm\n */\nexport interface SwarmEvents {\n  'swarm:start': { input: string; timestamp: string };\n  'swarm:routing': { task: string; decision: TaskRoutingDecision };\n  'specialist:start': { specialistId: string; task: string };\n  'specialist:complete': { specialistId: string; result: SpecialistResult };\n  'specialist:error': { specialistId: string; error: Error };\n  'swarm:synthesis': { results: SpecialistResult[] };\n  'swarm:complete': { result: SwarmResult };\n  'swarm:error': { error: Error };\n}\n\n/**\n * AgentSwarm - Coordinates multiple specialist agents under a supervisor\n */\nexport class AgentSwarm extends EventEmitter {\n  /**\n   * Swarm configuration\n   */\n  public readonly config: SwarmConfig;\n\n  /**\n   * Supervisor agent\n   */\n  private supervisor: Agent;\n\n  /**\n   * Map of specialist agents\n   */\n  private specialists: Map<string, SpecialistAgent>;\n\n  /**\n   * Execution ID for the current swarm execution\n   */\n  private executionId?: string;\n\n  constructor(config: SwarmConfig) {\n    super();\n    this.validateConfig(config);\n    this.config = config;\n    this.supervisor = config.supervisor;\n    this.specialists = new Map();\n\n    // Register all specialists\n    config.specialists.forEach((specialist) => {\n      this.registerSpecialist(specialist);\n    });\n  }\n\n  /**\n   * Register a new specialist agent\n   */\n  public registerSpecialist(specialist: SpecialistAgent): void {\n    // Validate specialist configuration\n    if (!specialist.id || typeof specialist.id !== 'string') {\n      throw new AgentError(\n        'Specialist ID is required and must be a string',\n        'INVALID_SPECIALIST_CONFIG'\n      );\n    }\n\n    if (!specialist.agent) {\n      throw new AgentError(\n        `Specialist ${specialist.id} must have an agent instance`,\n        'INVALID_SPECIALIST_CONFIG',\n        { specialistId: specialist.id }\n      );\n    }\n\n    if (!specialist.specialization || typeof specialist.specialization !== 'string') {\n      throw new AgentError(\n        `Specialist ${specialist.id} must have a specialization`,\n        'INVALID_SPECIALIST_CONFIG',\n        { specialistId: specialist.id }\n      );\n    }\n\n    // Check for duplicate specialist IDs\n    if (this.specialists.has(specialist.id)) {\n      throw new AgentError(\n        `Specialist with ID \"${specialist.id}\" is already registered`,\n        'DUPLICATE_SPECIALIST_ID',\n        { specialistId: specialist.id }\n      );\n    }\n\n    this.specialists.set(specialist.id, specialist);\n  }\n\n  /**\n   * Unregister a specialist agent\n   */\n  public unregisterSpecialist(specialistId: string): boolean {\n    return this.specialists.delete(specialistId);\n  }\n\n  /**\n   * Get a specialist by ID\n   */\n  public getSpecialist(specialistId: string): SpecialistAgent | undefined {\n    return this.specialists.get(specialistId);\n  }\n\n  /**\n   * Get all registered specialists\n   */\n  public getSpecialists(): SpecialistAgent[] {\n    return Array.from(this.specialists.values());\n  }\n\n  /**\n   * Execute the swarm with the given task\n   */\n  public async execute(\n    task: string,\n    config?: ExecutionConfig\n  ): Promise<SwarmResult> {\n    this.executionId = generateId('swarm');\n    const startTime = Date.now();\n\n    // Emit start event\n    this.emit('swarm:start', {\n      input: task,\n      timestamp: new Date().toISOString(),\n    });\n\n    try {\n      // Step 1: Use supervisor to analyze and route the task\n      const routingDecisions = await this.routeTask(task, config);\n\n      // Step 2: Execute specialists based on routing decisions\n      const specialistResults = await this.executeSpecialists(\n        task,\n        routingDecisions,\n        config\n      );\n\n      // Step 3: Synthesize results from all specialists\n      const synthesizedResponse = await this.synthesizeResults(\n        task,\n        specialistResults,\n        config\n      );\n\n      // Step 4: Build combined trace\n      const combinedTrace = this.buildCombinedTrace(\n        specialistResults,\n        startTime\n      );\n\n      // Build final result\n      const result: SwarmResult = {\n        response: synthesizedResponse,\n        specialistResults,\n        combinedTrace,\n        supervisorTrace: this.getSupervisorTrace(routingDecisions),\n        success: specialistResults.every((r) => r.success),\n        stats: {\n          totalSpecialistsInvoked: specialistResults.length,\n          successfulSpecialists: specialistResults.filter((r) => r.success).length,\n          failedSpecialists: specialistResults.filter((r) => !r.success).length,\n          totalDurationMs: Date.now() - startTime,\n          parallelExecutions: this.config.parallelExecution ? specialistResults.length : 0,\n        },\n      };\n\n      // Emit complete event\n      this.emit('swarm:complete', { result });\n\n      return result;\n    } catch (error) {\n      const errorObj = error as Error;\n\n      // Emit error event\n      this.emit('swarm:error', { error: errorObj });\n\n      // Return error result\n      return {\n        response: '',\n        specialistResults: [],\n        combinedTrace: this.buildEmptyTrace(startTime),\n        supervisorTrace: this.buildEmptyTrace(startTime),\n        success: false,\n        error: errorObj,\n        stats: {\n          totalSpecialistsInvoked: 0,\n          successfulSpecialists: 0,\n          failedSpecialists: 0,\n          totalDurationMs: Date.now() - startTime,\n          parallelExecutions: 0,\n        },\n      };\n    }\n  }\n\n  /**\n   * Route the task to appropriate specialists\n   */\n  private async routeTask(\n    task: string,\n    config?: ExecutionConfig\n  ): Promise<TaskRoutingDecision[]> {\n    // Use custom router if provided\n    if (this.config.customRouter) {\n      const decision = await this.config.customRouter(\n        task,\n        Array.from(this.specialists.values())\n      );\n      this.emit('swarm:routing', { task, decision });\n      return [decision];\n    }\n\n    // Default routing: keyword-based matching\n    const matchedSpecialists = this.matchSpecialistsByKeywords(task);\n\n    if (matchedSpecialists.length === 0) {\n      // If no keywords match, ask supervisor to decide\n      return this.supervisorRouting(task, config);\n    }\n\n    // Sort by priority and return routing decisions\n    const sortedSpecialists = matchedSpecialists.sort(\n      (a, b) => (b.priority ?? 0) - (a.priority ?? 0)\n    );\n\n    const decisions: TaskRoutingDecision[] = sortedSpecialists.map((specialist) => ({\n      specialistId: specialist.id,\n      reason: `Matched keywords: ${specialist.keywords?.join(', ')}`,\n      confidence: 0.8,\n    }));\n\n    // Emit routing events\n    decisions.forEach((decision) => {\n      this.emit('swarm:routing', { task, decision });\n    });\n\n    return decisions;\n  }\n\n  /**\n   * Match specialists based on keywords in the task\n   */\n  private matchSpecialistsByKeywords(task: string): SpecialistAgent[] {\n    const taskLower = task.toLowerCase();\n    const matched: SpecialistAgent[] = [];\n\n    this.specialists.forEach((specialist) => {\n      if (specialist.keywords && specialist.keywords.length > 0) {\n        const hasMatch = specialist.keywords.some((keyword) =>\n          taskLower.includes(keyword.toLowerCase())\n        );\n        if (hasMatch) {\n          matched.push(specialist);\n        }\n      }\n    });\n\n    return matched;\n  }\n\n  /**\n   * Use supervisor agent to route the task\n   */\n  private async supervisorRouting(\n    task: string,\n    config?: ExecutionConfig\n  ): Promise<TaskRoutingDecision[]> {\n    // Build prompt for supervisor\n    const specialistsList = Array.from(this.specialists.values())\n      .map(\n        (s) =>\n          `- ${s.id}: ${s.specialization} (keywords: ${s.keywords?.join(', ') || 'none'})`\n      )\n      .join('\\n');\n\n    const supervisorPrompt = `You are a supervisor agent coordinating a team of specialists.\n\nAvailable specialists:\n${specialistsList}\n\nTask: ${task}\n\nBased on this task, which specialist(s) should handle it? Respond with a JSON object containing:\n{\n  \"specialistId\": \"the ID of the specialist\",\n  \"reason\": \"why this specialist should handle the task\",\n  \"confidence\": 0.0-1.0\n}\n\nIf multiple specialists are needed, respond with a JSON array of such objects.`;\n\n    try {\n      const executor = new AgentExecutor(this.supervisor, config);\n      const result = await executor.execute(supervisorPrompt, config);\n\n      // Parse supervisor's response\n      const decisions = this.parseSupervisorResponse(result.response);\n\n      // Emit routing events\n      decisions.forEach((decision) => {\n        this.emit('swarm:routing', { task, decision });\n      });\n\n      return decisions;\n    } catch (error) {\n      // Fallback: use first available specialist\n      const firstSpecialist = Array.from(this.specialists.values())[0];\n      if (!firstSpecialist) {\n        throw new AgentError(\n          'No specialists available and supervisor routing failed',\n          'ROUTING_FAILED',\n          { originalError: error }\n        );\n      }\n\n      const fallbackDecision: TaskRoutingDecision = {\n        specialistId: firstSpecialist.id,\n        reason: 'Fallback to first available specialist',\n        confidence: 0.3,\n      };\n\n      this.emit('swarm:routing', { task, decision: fallbackDecision });\n      return [fallbackDecision];\n    }\n  }\n\n  /**\n   * Parse supervisor's routing response\n   */\n  private parseSupervisorResponse(response: string): TaskRoutingDecision[] {\n    try {\n      // Try to extract JSON from the response\n      const jsonMatch = response.match(/\\{[\\s\\S]*\\}|\\[[\\s\\S]*\\]/);\n      if (!jsonMatch) {\n        throw new Error('No JSON found in response');\n      }\n\n      const parsed = JSON.parse(jsonMatch[0]);\n\n      // Handle single decision or array\n      const decisions = Array.isArray(parsed) ? parsed : [parsed];\n\n      // Validate decisions\n      return decisions\n        .filter((d) => d.specialistId && this.specialists.has(d.specialistId))\n        .map((d) => ({\n          specialistId: d.specialistId,\n          reason: d.reason || 'No reason provided',\n          confidence: d.confidence ?? 0.5,\n        }));\n    } catch (error) {\n      // Fallback: use first available specialist\n      const firstSpecialist = Array.from(this.specialists.values())[0];\n      if (!firstSpecialist) {\n        return [];\n      }\n\n      return [\n        {\n          specialistId: firstSpecialist.id,\n          reason: 'Failed to parse supervisor response, using fallback',\n          confidence: 0.2,\n        },\n      ];\n    }\n  }\n\n  /**\n   * Execute specialist agents based on routing decisions\n   */\n  private async executeSpecialists(\n    task: string,\n    decisions: TaskRoutingDecision[],\n    config?: ExecutionConfig\n  ): Promise<SpecialistResult[]> {\n    if (decisions.length === 0) {\n      throw new AgentError(\n        'No routing decisions provided',\n        'NO_ROUTING_DECISIONS'\n      );\n    }\n\n    // Determine execution mode\n    const parallelExecution = this.config.parallelExecution ?? false;\n    const maxConcurrent = this.config.maxConcurrent ?? decisions.length;\n\n    if (parallelExecution) {\n      return this.executeSpecialistsParallel(task, decisions, maxConcurrent, config);\n    } else {\n      return this.executeSpecialistsSequential(task, decisions, config);\n    }\n  }\n\n  /**\n   * Execute specialists in parallel\n   */\n  private async executeSpecialistsParallel(\n    task: string,\n    decisions: TaskRoutingDecision[],\n    maxConcurrent: number,\n    config?: ExecutionConfig\n  ): Promise<SpecialistResult[]> {\n    const results: SpecialistResult[] = [];\n    const executing: Promise<SpecialistResult>[] = [];\n\n    for (const decision of decisions) {\n      const promise = this.executeSpecialist(task, decision, config);\n      executing.push(promise);\n\n      // Limit concurrent executions\n      if (executing.length >= maxConcurrent) {\n        const result = await Promise.race(executing);\n        results.push(result);\n        executing.splice(\n          executing.findIndex((p) => p === promise),\n          1\n        );\n      }\n    }\n\n    // Wait for remaining executions\n    const remaining = await Promise.all(executing);\n    results.push(...remaining);\n\n    return results;\n  }\n\n  /**\n   * Execute specialists sequentially\n   */\n  private async executeSpecialistsSequential(\n    task: string,\n    decisions: TaskRoutingDecision[],\n    config?: ExecutionConfig\n  ): Promise<SpecialistResult[]> {\n    const results: SpecialistResult[] = [];\n\n    for (const decision of decisions) {\n      const result = await this.executeSpecialist(task, decision, config);\n      results.push(result);\n    }\n\n    return results;\n  }\n\n  /**\n   * Execute a single specialist\n   */\n  private async executeSpecialist(\n    task: string,\n    decision: TaskRoutingDecision,\n    config?: ExecutionConfig\n  ): Promise<SpecialistResult> {\n    const specialist = this.specialists.get(decision.specialistId);\n    if (!specialist) {\n      return this.buildErrorResult(\n        decision.specialistId,\n        'unknown',\n        new Error(`Specialist ${decision.specialistId} not found`)\n      );\n    }\n\n    const startTime = Date.now();\n\n    // Emit start event\n    this.emit('specialist:start', {\n      specialistId: specialist.id,\n      task,\n    });\n\n    try {\n      // Execute the specialist agent\n      const executor = new AgentExecutor(specialist.agent, config);\n\n      // Apply timeout if configured\n      const specialistConfig = {\n        ...config,\n        maxSteps: config?.maxSteps ?? 10,\n      };\n\n      const executionPromise = executor.execute(task, specialistConfig);\n\n      const result: ExecutionResult = this.config.specialistTimeoutMs\n        ? await this.executeWithTimeout(\n            executionPromise,\n            this.config.specialistTimeoutMs\n          )\n        : await executionPromise;\n\n      const specialistResult: SpecialistResult = {\n        specialistId: specialist.id,\n        specialization: specialist.specialization,\n        response: result.response,\n        trace: result.trace,\n        success: result.success,\n        error: result.error,\n        metadata: {\n          startTime: new Date(startTime).toISOString(),\n          endTime: new Date().toISOString(),\n          durationMs: Date.now() - startTime,\n        },\n      };\n\n      // Emit complete event\n      this.emit('specialist:complete', {\n        specialistId: specialist.id,\n        result: specialistResult,\n      });\n\n      return specialistResult;\n    } catch (error) {\n      const errorObj = error as Error;\n\n      // Emit error event\n      this.emit('specialist:error', {\n        specialistId: specialist.id,\n        error: errorObj,\n      });\n\n      return this.buildErrorResult(\n        specialist.id,\n        specialist.specialization,\n        errorObj,\n        startTime\n      );\n    }\n  }\n\n  /**\n   * Synthesize results from multiple specialists\n   */\n  private async synthesizeResults(\n    originalTask: string,\n    results: SpecialistResult[],\n    config?: ExecutionConfig\n  ): Promise<string> {\n    // Use custom synthesizer if provided\n    if (this.config.customSynthesizer) {\n      return this.config.customSynthesizer(results);\n    }\n\n    // If only one specialist, return its response directly\n    if (results.length === 1) {\n      return results[0]?.response ?? '';\n    }\n\n    // Emit synthesis event\n    this.emit('swarm:synthesis', { results });\n\n    // Default synthesis: combine all specialist responses\n    const combinedResponses = results\n      .map(\n        (r, i) =>\n          `### Specialist ${i + 1}: ${r.specialization}\\n${r.success ? r.response : `Error: ${r.error?.message}`}`\n      )\n      .join('\\n\\n');\n\n    // Use supervisor to synthesize the final response\n    const synthesisPrompt = `You are a supervisor agent. You delegated a complex task to specialists and received their responses.\n\nOriginal task: ${originalTask}\n\nSpecialist responses:\n${combinedResponses}\n\nPlease synthesize these responses into a single, coherent answer that addresses the original task.`;\n\n    try {\n      const executor = new AgentExecutor(this.supervisor, config);\n      const result = await executor.execute(synthesisPrompt, config);\n      return result.response;\n    } catch (error) {\n      // Fallback: return concatenated responses\n      return combinedResponses;\n    }\n  }\n\n  /**\n   * Build combined execution trace from all specialists\n   */\n  private buildCombinedTrace(\n    results: SpecialistResult[],\n    startTime: number\n  ): ExecutionTrace {\n    const allEvents: TraceEvent[] = [];\n\n    // Collect all events from specialist traces\n    results.forEach((result) => {\n      const specialistEvents = result.trace.events.map((event) => ({\n        ...event,\n        data: {\n          ...event.data,\n          specialistId: result.specialistId,\n          specialization: result.specialization,\n        },\n      }));\n      allEvents.push(...specialistEvents);\n    });\n\n    // Sort events by timestamp\n    allEvents.sort(\n      (a, b) =>\n        new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime()\n    );\n\n    // Aggregate stats\n    const totalStats = results.reduce(\n      (acc, result) => ({\n        totalSteps: acc.totalSteps + result.trace.stats.totalSteps,\n        totalToolCalls: acc.totalToolCalls + result.trace.stats.totalToolCalls,\n        totalLLMCalls: acc.totalLLMCalls + result.trace.stats.totalLLMCalls,\n        successfulToolCalls:\n          acc.successfulToolCalls + result.trace.stats.successfulToolCalls,\n        failedToolCalls: acc.failedToolCalls + result.trace.stats.failedToolCalls,\n        totalTokensUsed:\n          (acc.totalTokensUsed ?? 0) + (result.trace.stats.totalTokensUsed ?? 0),\n      }),\n      {\n        totalSteps: 0,\n        totalToolCalls: 0,\n        totalLLMCalls: 0,\n        successfulToolCalls: 0,\n        failedToolCalls: 0,\n        totalTokensUsed: 0,\n      }\n    );\n\n    return {\n      executionId: this.executionId ?? generateId('swarm'),\n      agentId: this.config.id,\n      startTime: new Date(startTime).toISOString(),\n      endTime: new Date().toISOString(),\n      durationMs: Date.now() - startTime,\n      events: allEvents,\n      stats: totalStats,\n    };\n  }\n\n  /**\n   * Get supervisor trace (routing decisions)\n   */\n  private getSupervisorTrace(decisions: TaskRoutingDecision[]): ExecutionTrace {\n    const events: TraceEvent[] = decisions.map((decision) => ({\n      type: 'agent_start',\n      timestamp: new Date().toISOString(),\n      data: {\n        action: 'routing_decision',\n        specialistId: decision.specialistId,\n        reason: decision.reason,\n        confidence: decision.confidence,\n      },\n    }));\n\n    return {\n      executionId: generateId('supervisor'),\n      agentId: this.supervisor.config.id,\n      startTime: new Date().toISOString(),\n      endTime: new Date().toISOString(),\n      events,\n      stats: {\n        totalSteps: decisions.length,\n        totalToolCalls: 0,\n        totalLLMCalls: 0,\n        successfulToolCalls: 0,\n        failedToolCalls: 0,\n      },\n    };\n  }\n\n  /**\n   * Build an empty trace for error cases\n   */\n  private buildEmptyTrace(startTime: number): ExecutionTrace {\n    return {\n      executionId: this.executionId ?? generateId('swarm'),\n      agentId: this.config.id,\n      startTime: new Date(startTime).toISOString(),\n      endTime: new Date().toISOString(),\n      durationMs: Date.now() - startTime,\n      events: [],\n      stats: {\n        totalSteps: 0,\n        totalToolCalls: 0,\n        totalLLMCalls: 0,\n        successfulToolCalls: 0,\n        failedToolCalls: 0,\n      },\n    };\n  }\n\n  /**\n   * Build error result for a specialist\n   */\n  private buildErrorResult(\n    specialistId: string,\n    specialization: string,\n    error: Error,\n    startTime?: number\n  ): SpecialistResult {\n    const start = startTime ?? Date.now();\n    return {\n      specialistId,\n      specialization,\n      response: '',\n      trace: this.buildEmptyTrace(start),\n      success: false,\n      error,\n      metadata: {\n        startTime: new Date(start).toISOString(),\n        endTime: new Date().toISOString(),\n        durationMs: Date.now() - start,\n      },\n    };\n  }\n\n  /**\n   * Execute with timeout\n   */\n  private async executeWithTimeout<T>(\n    promise: Promise<T>,\n    timeoutMs: number\n  ): Promise<T> {\n    return Promise.race([\n      promise,\n      new Promise<T>((_, reject) =>\n        setTimeout(\n          () => reject(new Error(`Specialist execution timeout after ${timeoutMs}ms`)),\n          timeoutMs\n        )\n      ),\n    ]);\n  }\n\n  /**\n   * Validate swarm configuration\n   */\n  private validateConfig(config: SwarmConfig): void {\n    if (!config.id || typeof config.id !== 'string') {\n      throw new AgentError(\n        'Swarm ID is required and must be a string',\n        'INVALID_SWARM_CONFIG'\n      );\n    }\n\n    if (!config.name || typeof config.name !== 'string') {\n      throw new AgentError(\n        'Swarm name is required and must be a string',\n        'INVALID_SWARM_CONFIG',\n        { swarmId: config.id }\n      );\n    }\n\n    if (!config.supervisor) {\n      throw new AgentError(\n        'Supervisor agent is required',\n        'INVALID_SWARM_CONFIG',\n        { swarmId: config.id }\n      );\n    }\n\n    if (!config.specialists || !Array.isArray(config.specialists)) {\n      throw new AgentError(\n        'Specialists array is required',\n        'INVALID_SWARM_CONFIG',\n        { swarmId: config.id }\n      );\n    }\n\n    if (config.specialists.length === 0) {\n      throw new AgentError(\n        'At least one specialist is required',\n        'INVALID_SWARM_CONFIG',\n        { swarmId: config.id }\n      );\n    }\n  }\n\n  /**\n   * Get swarm metadata\n   */\n  public getMetadata(): Record<string, unknown> {\n    return {\n      id: this.config.id,\n      name: this.config.name,\n      description: this.config.description,\n      supervisorId: this.supervisor.config.id,\n      specialistsCount: this.specialists.size,\n      specialists: Array.from(this.specialists.values()).map((s) => ({\n        id: s.id,\n        specialization: s.specialization,\n        keywords: s.keywords,\n        priority: s.priority,\n      })),\n      maxConcurrent: this.config.maxConcurrent,\n      parallelExecution: this.config.parallelExecution,\n      ...this.config.metadata,\n    };\n  }\n}\n\n/**\n * Factory function to create an AgentSwarm\n */\nexport function createAgentSwarm(config: SwarmConfig): AgentSwarm {\n  return new AgentSwarm(config);\n}\n"]}