{"version":3,"sources":["../src/constants.ts","../src/provider-registry.ts","../src/registry.ts","../src/model-selector.ts","../src/prompt-manager.ts","../src/types.ts","../src/base-agent.ts","../src/factory.ts","../src/events/event-bus.ts","../src/events/schemas.ts","../src/events/buses/in-memory.ts","../src/events/buses/callback.ts","../src/events/buses/multi.ts","../src/events/buses/filtered.ts","../src/events/buses/validating.ts"],"names":["ToolLoopAgent","z"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * AI Model Constants\n * Centralized model identifiers for consistent reference\n * Updated: October 2025\n */\n\n/**\n * Available AI models\n */\nexport const AI_MODELS = {\n  // Anthropic Claude 4.x models (2025)\n  CLAUDE_SONNET_45: 'claude-sonnet-4-5',\n  CLAUDE_HAIKU_45: 'claude-haiku-4-5',\n  CLAUDE_OPUS_41: 'claude-opus-4-1',\n\n  // Legacy Anthropic Claude 3.x models\n  CLAUDE_35_SONNET: 'claude-3-5-sonnet-20241022',\n  CLAUDE_35_HAIKU: 'claude-3-5-haiku-20241022',\n\n  // OpenAI GPT-5 models (2025)\n  GPT_5: 'gpt-5',\n  GPT_5_PRO: 'gpt-5-pro',\n  GPT_5_MINI: 'gpt-5-mini',\n  GPT_5_NANO: 'gpt-5-nano',\n\n  // OpenAI GPT-4.1 models (2025)\n  GPT_41: 'gpt-4.1',\n  GPT_41_MINI: 'gpt-4.1-mini',\n\n  // OpenAI GPT-4o models\n  GPT_4O: 'gpt-4o',\n  GPT_4O_MINI: 'gpt-4o-mini',\n\n  // OpenAI o-series reasoning models (2025)\n  O3_MINI: 'o3-mini',\n  O4_MINI: 'o4-mini',\n\n  // Google Gemini 2.5 models (2025)\n  GEMINI_25_PRO: 'gemini-2.5-pro',\n  GEMINI_25_FLASH: 'gemini-2.5-flash',\n\n  // Google Gemini 2.0 models\n  GEMINI_20_FLASH: 'gemini-2.0-flash',\n\n  // Legacy Google Gemini 1.5 models\n  GEMINI_15_PRO: 'gemini-1.5-pro',\n  GEMINI_15_FLASH: 'gemini-1.5-flash',\n} as const;\n\nexport type AIModel = (typeof AI_MODELS)[keyof typeof AI_MODELS];\n\n/**\n * Model categories for intelligent selection\n */\nexport const MODEL_CATEGORIES = {\n  FAST: [\n    AI_MODELS.CLAUDE_HAIKU_45,\n    AI_MODELS.GPT_5_NANO,\n    AI_MODELS.GPT_41_MINI,\n    AI_MODELS.GEMINI_25_FLASH,\n    AI_MODELS.GEMINI_20_FLASH,\n  ],\n  BALANCED: [\n    AI_MODELS.CLAUDE_SONNET_45,\n    AI_MODELS.GPT_5,\n    AI_MODELS.GPT_41,\n    AI_MODELS.GEMINI_25_PRO,\n  ],\n  POWERFUL: [AI_MODELS.CLAUDE_OPUS_41, AI_MODELS.GPT_5_PRO, AI_MODELS.GEMINI_25_PRO],\n  REASONING: [AI_MODELS.O3_MINI, AI_MODELS.O4_MINI],\n  LONG_CONTEXT: [AI_MODELS.GEMINI_25_PRO],\n} as const;\n\n/**\n * Complexity level for model selection\n */\nexport type ComplexityLevel = 'low' | 'medium' | 'high' | 'critical';\n\n/**\n * Operation type for model selection\n */\nexport type OperationType = 'generate' | 'stream' | 'tool' | 'embedding';\n","/**\n * Provider Registry\n * Get language model instances from AI SDK providers\n */\n\nimport type { LanguageModel } from 'ai';\nimport type { AIModel } from './constants.js';\n\n/**\n * Language model instance\n */\nexport type { LanguageModel };\n\n/**\n * Provider configuration\n */\nexport type ProviderConfig = {\n  apiKey?: string;\n  baseURL?: string;\n  headers?: Record<string, string>;\n};\n\n/**\n * Get a language model instance\n * Dynamically imports the correct provider based on model name\n *\n * @param model - The model identifier\n * @param config - Optional provider configuration\n * @returns Language model instance\n */\nexport async function getModel(\n  model: AIModel | string,\n  config?: ProviderConfig\n): Promise<LanguageModel> {\n  const modelStr = model.toLowerCase();\n\n  // Anthropic Claude models\n  if (modelStr.includes('claude')) {\n    const { createAnthropic } = await import('@ai-sdk/anthropic');\n    const provider = createAnthropic({\n      apiKey: config?.apiKey ?? process.env.ANTHROPIC_API_KEY,\n      baseURL: config?.baseURL,\n      headers: config?.headers,\n    });\n    return provider(model);\n  }\n\n  // OpenAI models (gpt, o3, o4)\n  if (modelStr.includes('gpt') || modelStr.includes('o3') || modelStr.includes('o4')) {\n    const { createOpenAI } = await import('@ai-sdk/openai');\n    const provider = createOpenAI({\n      apiKey: config?.apiKey ?? process.env.OPENAI_API_KEY,\n      baseURL: config?.baseURL,\n      headers: config?.headers,\n    });\n    return provider(model);\n  }\n\n  // Google Gemini models\n  if (modelStr.includes('gemini')) {\n    const { createGoogleGenerativeAI } = await import('@ai-sdk/google');\n    const provider = createGoogleGenerativeAI({\n      apiKey: config?.apiKey ?? process.env.GOOGLE_GENERATIVE_AI_API_KEY,\n      baseURL: config?.baseURL,\n      headers: config?.headers,\n    });\n    return provider(model);\n  }\n\n  throw new Error(\n    `Unknown model provider for: ${model}. Supported: Claude (Anthropic), GPT/O-series (OpenAI), Gemini (Google)`\n  );\n}\n","/**\n * Agent Registry - Centralized agent configuration\n * Single source of truth for all agent metadata\n */\n\nimport type { AIModel, ComplexityLevel } from './constants.js';\n\n/**\n * Agent registry metadata\n */\nexport type AgentRegistryMetadata = {\n  /** Default model for this agent type */\n  defaultModel: AIModel;\n  /** Fallback prompt if agent-specific prompt not found */\n  fallbackPrompt: string;\n  /** Complexity level for model selection */\n  complexity: ComplexityLevel;\n  /** Human-readable description */\n  description: string;\n};\n\n/**\n * Central agent registry\n * Add new agents here - this is the single place for registration\n *\n * Example:\n * ```typescript\n * export const AGENT_REGISTRY = {\n *   chat: {\n *     defaultModel: AI_MODELS.CLAUDE_HAIKU_45,\n *     fallbackPrompt: 'You are a helpful assistant.',\n *     complexity: 'low',\n *     description: 'Conversational chat agent',\n *   },\n *   research: {\n *     defaultModel: AI_MODELS.CLAUDE_SONNET_45,\n *     fallbackPrompt: 'You are a research assistant.',\n *     complexity: 'medium',\n *     description: 'Research and analysis agent',\n *   },\n * } as const satisfies Record<string, AgentRegistryMetadata>;\n * ```\n */\nexport const AGENT_REGISTRY = {\n  // Built-in agents can be registered here\n  // Developers add their own agents to this registry\n} as const satisfies Record<string, AgentRegistryMetadata>;\n\n/**\n * Agent type - auto-generated from registry keys\n */\nexport type AgentType = keyof typeof AGENT_REGISTRY;\n\n/**\n * Get all registered agent types\n */\nexport function getRegisteredAgentTypes(): readonly string[] {\n  return Object.keys(AGENT_REGISTRY);\n}\n\n/**\n * Check if an agent type is registered\n */\nexport function isAgentTypeRegistered(agentType: string): agentType is AgentType {\n  return agentType in AGENT_REGISTRY;\n}\n\n/**\n * Get agent configuration metadata from registry\n * @throws {Error} If agent type is not registered\n */\nexport function getAgentConfig(agentType: string): AgentRegistryMetadata {\n  const config = AGENT_REGISTRY[agentType as AgentType];\n  if (!config) {\n    throw new Error(\n      `Agent type \"${agentType}\" not found in registry. Available types: ${getRegisteredAgentTypes().join(', ')}`\n    );\n  }\n  return config;\n}\n\n/**\n * Get default model for an agent type\n */\nexport function getAgentDefaultModel(agentType: string): AIModel {\n  return getAgentConfig(agentType).defaultModel;\n}\n\n/**\n * Get fallback prompt for an agent type\n */\nexport function getAgentFallbackPrompt(agentType: string): string {\n  return getAgentConfig(agentType).fallbackPrompt;\n}\n\n/**\n * Get complexity level for an agent type\n */\nexport function getAgentComplexity(agentType: string): ComplexityLevel {\n  return getAgentConfig(agentType).complexity;\n}\n\n/**\n * Get agent description\n */\nexport function getAgentDescription(agentType: string): string {\n  return getAgentConfig(agentType).description;\n}\n","/**\n * ModelSelector - Intelligent model selection based on complexity and operation\n */\n\nimport {\n  type AIModel,\n  AI_MODELS,\n  type ComplexityLevel,\n  MODEL_CATEGORIES,\n  type OperationType,\n} from './constants.js';\nimport { type LanguageModel, getModel } from './provider-registry.js';\nimport { getAgentDefaultModel, isAgentTypeRegistered } from './registry.js';\n\n/**\n * Model selection context\n */\nexport type SelectionContext = {\n  operation?: OperationType;\n  complexity?: ComplexityLevel;\n  modelOverride?: AIModel | string;\n};\n\n/**\n * ModelSelector configuration\n */\nexport type ModelSelectorConfig = {\n  agentType?: string;\n  defaultModel?: AIModel | string;\n  enableFallback?: boolean;\n};\n\n/**\n * ModelSelector - Intelligent, context-aware model selection\n *\n * Features:\n * - Reads default model from Agent Registry if agent is registered\n * - Complexity-based model routing\n * - Operation-aware selection (stream vs generate)\n * - Manual override support\n *\n * @example\n * ```typescript\n * const selector = new ModelSelector({ agentType: 'chat' });\n * const model = await selector.getLanguageModel({\n *   complexity: 'low',\n *   operation: 'stream'\n * });\n * ```\n */\nexport class ModelSelector {\n  private readonly defaultModel: AIModel | string;\n\n  constructor(config: ModelSelectorConfig = {}) {\n    // Try to get default model from registry if agent is registered\n    if (config.agentType && isAgentTypeRegistered(config.agentType)) {\n      this.defaultModel = config.defaultModel ?? getAgentDefaultModel(config.agentType);\n    } else {\n      this.defaultModel = config.defaultModel ?? AI_MODELS.CLAUDE_SONNET_45;\n    }\n  }\n\n  /**\n   * Get language model based on context\n   */\n  async getLanguageModel(context: SelectionContext = {}): Promise<LanguageModel> {\n    // Use override if provided\n    if (context.modelOverride) {\n      return getModel(context.modelOverride);\n    }\n\n    // Select model based on complexity\n    const model = this.selectModel(context.complexity ?? 'medium');\n\n    return getModel(model);\n  }\n\n  /**\n   * Select model based on complexity\n   */\n  private selectModel(complexity: ComplexityLevel): AIModel {\n    switch (complexity) {\n      case 'low':\n        return MODEL_CATEGORIES.FAST[0]; // Claude Haiku\n      case 'medium':\n        return MODEL_CATEGORIES.BALANCED[0]; // Claude Sonnet\n      case 'high':\n      case 'critical':\n        return MODEL_CATEGORIES.POWERFUL[0]; // Claude Opus\n      default:\n        return this.defaultModel as AIModel;\n    }\n  }\n\n  /**\n   * Get the selected model name (without async)\n   * Useful for logging before model instantiation\n   */\n  getSelectedModelName(context: SelectionContext = {}): string {\n    if (context.modelOverride) {\n      return context.modelOverride;\n    }\n    return this.selectModel(context.complexity ?? 'medium');\n  }\n}\n","/**\n * PromptManager - Simple prompt management with context interpolation\n * Framework-agnostic, no external dependencies\n */\n\nimport type { PromptContext } from './types.js';\n\n/**\n * Prompt storage interface (pluggable)\n */\nexport interface PromptStorage {\n  get(name: string): string | undefined | Promise<string | undefined>;\n}\n\n/**\n * PromptManager configuration\n */\nexport type PromptManagerConfig = {\n  /** Agent type for prompt resolution */\n  agentType: string;\n  /** Prompt storage (optional) */\n  storage?: PromptStorage;\n  /** Fallback prompt if no prompt found */\n  fallbackPrompt?: string;\n};\n\n/**\n * Simple in-memory prompt storage\n */\nexport class MemoryPromptStorage implements PromptStorage {\n  constructor(private prompts: Record<string, string> = {}) {}\n\n  get(name: string): string | undefined {\n    return this.prompts[name];\n  }\n\n  set(name: string, content: string): void {\n    this.prompts[name] = content;\n  }\n\n  has(name: string): boolean {\n    return name in this.prompts;\n  }\n\n  delete(name: string): boolean {\n    if (name in this.prompts) {\n      delete this.prompts[name];\n      return true;\n    }\n    return false;\n  }\n\n  clear(): void {\n    this.prompts = {};\n  }\n\n  list(): string[] {\n    return Object.keys(this.prompts);\n  }\n}\n\n/**\n * PromptManager - Manages agent-specific prompts with context interpolation\n *\n * @example\n * ```typescript\n * const manager = new PromptManager({\n *   agentType: 'chat',\n *   fallbackPrompt: 'You are a helpful assistant for {{userName}}'\n * });\n *\n * const prompt = await manager.getPrompt({ userName: 'Alice' });\n * // => \"You are a helpful assistant for Alice\"\n * ```\n */\nexport class PromptManager {\n  private readonly agentType: string;\n  private readonly storage?: PromptStorage;\n  private readonly fallbackPrompt: string;\n\n  constructor(config: PromptManagerConfig) {\n    this.agentType = config.agentType;\n    this.storage = config.storage;\n    this.fallbackPrompt = config.fallbackPrompt ?? 'You are a helpful AI assistant.';\n  }\n\n  /**\n   * Get prompt for agent with context interpolation\n   */\n  async getPrompt(context?: PromptContext): Promise<string> {\n    let prompt: string;\n\n    // Try to get agent-specific prompt from storage\n    if (this.storage) {\n      const promptName = this.getPromptName();\n      const stored = await this.storage.get(promptName);\n      prompt = stored ?? this.fallbackPrompt;\n    } else {\n      prompt = this.fallbackPrompt;\n    }\n\n    // Interpolate context if provided\n    return context ? this.interpolate(prompt, context) : prompt;\n  }\n\n  /**\n   * Get prompt name for agent type\n   * Convention: {agentType}_system\n   */\n  private getPromptName(): string {\n    return `${this.agentType}_system`;\n  }\n\n  /**\n   * Interpolate context variables into prompt\n   * Supports {{variable}} and {{nested.property}} syntax\n   */\n  private interpolate(template: string, context: PromptContext): string {\n    return template.replace(/\\{\\{(\\w+(?:\\.\\w+)*)\\}\\}/g, (match, path) => {\n      const value = this.getNestedValue(context, path);\n      return value !== undefined ? String(value) : match;\n    });\n  }\n\n  /**\n   * Get nested property value from context\n   */\n  private getNestedValue(obj: PromptContext, path: string): unknown {\n    const parts = path.split('.');\n    let current: unknown = obj;\n\n    for (const part of parts) {\n      if (current && typeof current === 'object' && part in current) {\n        current = (current as Record<string, unknown>)[part];\n      } else {\n        return undefined;\n      }\n    }\n\n    return current;\n  }\n}\n","/**\n * Core Types for Agent Framework\n */\n\nimport type { Tool } from 'ai';\nimport type { EventBus, SimpleEventBus } from './events/index.js';\n\n/**\n * Pluggable Logger Interface\n * Implement this to integrate with your logging system\n */\nexport interface AgentLogger {\n  debug(message: string, data?: unknown): void;\n  info(message: string, data?: unknown): void;\n  warn(message: string, data?: unknown): void;\n  error(message: string, error: Error, data?: unknown): void;\n}\n\n/**\n * Console logger (default implementation)\n */\nexport class ConsoleLogger implements AgentLogger {\n  constructor(private readonly prefix = '[Agent]') {}\n\n  debug(message: string, data?: unknown): void {\n    console.debug(`${this.prefix} ${message}`, data ?? '');\n  }\n\n  info(message: string, data?: unknown): void {\n    console.log(`${this.prefix} ${message}`, data ?? '');\n  }\n\n  warn(message: string, data?: unknown): void {\n    console.warn(`${this.prefix} ${message}`, data ?? '');\n  }\n\n  error(message: string, error: Error, data?: unknown): void {\n    console.error(`${this.prefix} ${message}`, error, data ?? '');\n  }\n}\n\n/**\n * Multi-tenancy configuration (optional)\n */\nexport type TenancyConfig = {\n  /** User ID for the agent instance */\n  userId: string;\n  /** Organization ID for tenant isolation */\n  organizationId: string;\n};\n\n/**\n * Prompt context for variable interpolation\n */\nexport type PromptContext = Record<string, unknown>;\n\n/**\n * Agent configuration\n */\nexport type AgentConfig = {\n  /** Agent type identifier */\n  agentType: string;\n\n  /** Optional agent ID (generated if not provided) */\n  agentId?: string;\n\n  /** Multi-tenant configuration (optional) */\n  tenancy?: TenancyConfig;\n\n  /** Custom system prompt (overrides default) */\n  systemPrompt?: string;\n\n  /** Prompt context for variable interpolation */\n  promptContext?: PromptContext;\n\n  /** Maximum tool loop iterations (default: 20) */\n  maxSteps?: number;\n\n  /** Custom tools to register */\n  tools?: Record<string, Tool>;\n\n  /** Event bus for observability (optional) */\n  events?: EventBus | SimpleEventBus;\n\n  /** Logger implementation (default: ConsoleLogger) */\n  logger?: AgentLogger;\n\n  /** Enable debug logging */\n  debug?: boolean;\n};\n\n/**\n * Send message options\n */\nexport type SendMessageOptions = {\n  /** User prompt (for single-turn) */\n  prompt?: string;\n\n  /** Message history (for multi-turn) */\n  messages?: unknown[];\n\n  /** Enable streaming */\n  stream?: boolean;\n\n  /** Additional context for this message */\n  context?: PromptContext;\n\n  /** Custom tools for this message */\n  tools?: Record<string, Tool>;\n\n  /** Maximum tokens to generate */\n  maxTokens?: number;\n\n  /** Sampling temperature (0-2) */\n  temperature?: number;\n\n  /** Step finish callback */\n  onStepFinish?: OnStepFinishCallback;\n\n  /** Finish callback */\n  onFinish?: OnFinishCallback;\n};\n\n/**\n * Tool call information\n */\nexport type ToolCall = {\n  toolName: string;\n  args: Record<string, unknown>;\n};\n\n/**\n * Tool result information\n */\nexport type ToolResult = {\n  toolName: string;\n  toolCallId: string;\n  result: unknown;\n};\n\n/**\n * Token usage information\n */\nexport type TokenUsage = {\n  promptTokens: number;\n  completionTokens: number;\n  totalTokens: number;\n};\n\n/**\n * Agent result (non-streaming)\n */\nexport type AgentResult = {\n  text: string;\n  toolCalls?: ToolCall[];\n  toolResults?: ToolResult[];\n  finishReason: string;\n  usage: TokenUsage;\n};\n\n/**\n * Agent stream result\n */\nexport type AgentStreamResult = {\n  textStream: AsyncIterable<string>;\n  fullStream: AsyncIterable<unknown>;\n  text: Promise<string>;\n  finishReason: Promise<string>;\n  usage: Promise<TokenUsage>;\n};\n\n/**\n * Step finish event\n */\nexport type StepFinishEvent = {\n  stepType: 'initial' | 'continue' | 'tool-result';\n  stepNumber: number;\n  finishReason: string;\n  usage: {\n    inputTokens: number;\n    outputTokens: number;\n    totalTokens: number;\n  };\n  text: string;\n  toolCalls?: ToolCall[];\n  toolResults?: ToolResult[];\n};\n\n/**\n * Finish event\n */\nexport type FinishEvent = {\n  finishReason: string;\n  text: string;\n  usage: {\n    inputTokens: number;\n    outputTokens: number;\n    totalTokens: number;\n  };\n  totalUsage: {\n    inputTokens: number;\n    outputTokens: number;\n    totalTokens: number;\n  };\n  toolCalls?: ToolCall[];\n  toolResults?: ToolResult[];\n  stepCount: number;\n};\n\n/**\n * Callback types\n */\nexport type OnStepFinishCallback = (event: StepFinishEvent) => void | Promise<void>;\nexport type OnFinishCallback = (event: FinishEvent) => void | Promise<void>;\n\n/**\n * Custom Error Classes\n */\n\nexport class AgentError extends Error {\n  constructor(\n    message: string,\n    public code: string,\n    public details?: unknown\n  ) {\n    super(message);\n    this.name = 'AgentError';\n  }\n}\n\nexport class ModelError extends Error {\n  constructor(\n    message: string,\n    public originalError?: unknown\n  ) {\n    super(message);\n    this.name = 'ModelError';\n  }\n}\n\nexport class ToolExecutionError extends Error {\n  constructor(\n    message: string,\n    public toolName: string,\n    public details?: unknown\n  ) {\n    super(message);\n    this.name = 'ToolExecutionError';\n  }\n}\n","/**\n * BaseAgent - Abstract base class for building AI agents\n * Framework-agnostic with pluggable event system and optional multi-tenancy\n */\n\nimport { type Tool, ToolLoopAgent } from 'ai';\nimport type { ComplexityLevel } from './constants.js';\nimport type { EventBus, SimpleEventBus } from './events/index.js';\nimport type { AgentEvent } from './events/types.js';\nimport { ModelSelector } from './model-selector.js';\nimport { PromptManager } from './prompt-manager.js';\nimport type { LanguageModel } from './provider-registry.js';\nimport { getAgentComplexity, getAgentFallbackPrompt, isAgentTypeRegistered } from './registry.js';\nimport type {\n  AgentConfig,\n  AgentLogger,\n  AgentResult,\n  AgentStreamResult,\n  OnFinishCallback,\n  OnStepFinishCallback,\n  SendMessageOptions,\n} from './types.js';\nimport { AgentError, ConsoleLogger, ModelError } from './types.js';\n\n/**\n * Constants\n */\nconst DEFAULT_MAX_STEPS = 20;\nconst PROMPT_LOG_MAX_LENGTH = 100;\n\n/**\n * Type definitions for AI SDK compatibility\n */\n\n/**\n * Parameters for AI SDK ToolLoopAgent generate/stream calls.\n *\n * Note: The AI SDK requires either `prompt` OR `messages` to be provided,\n * but TypeScript cannot express this XOR constraint. We enforce this at\n * runtime by conditionally setting these fields before calling the SDK.\n */\ntype AISDKCallParams = {\n  prompt?: string;\n  messages?: unknown[];\n  maxTokens?: number;\n  temperature?: number;\n};\n\n/**\n * BaseAgent - Abstract class for building AI agents\n *\n * Features:\n * - ToolLoopAgent integration for multi-step reasoning\n * - Event emission for observability\n * - Intelligent model selection\n * - Prompt management with context interpolation\n * - Optional multi-tenancy\n * - Pluggable logging\n *\n * @example\n * ```typescript\n * export class ChatAgent extends BaseAgent {\n *   constructor(config) {\n *     super({ ...config, agentType: 'chat' });\n *   }\n *\n *   protected getTools() {\n *     return {}; // Chat agents typically don't need tools\n *   }\n * }\n * ```\n */\nexport abstract class BaseAgent {\n  protected readonly agentId: string;\n  protected readonly agentType: string;\n  protected readonly tenancy?: { userId: string; organizationId: string };\n  protected readonly modelSelector: ModelSelector;\n  protected readonly promptManager: PromptManager;\n  protected readonly logger: AgentLogger;\n  protected readonly maxSteps: number;\n  protected readonly customTools: Record<string, Tool>;\n  protected readonly systemPromptOverride?: string;\n  protected readonly promptContext?: Record<string, unknown>;\n  protected readonly eventBus?: EventBus | SimpleEventBus;\n\n  constructor(config: AgentConfig) {\n    this.agentId = config.agentId ?? this.generateAgentId();\n    this.agentType = config.agentType;\n    this.tenancy = config.tenancy;\n    this.maxSteps = config.maxSteps ?? DEFAULT_MAX_STEPS;\n    this.customTools = config.tools ?? {};\n    this.systemPromptOverride = config.systemPrompt;\n    this.promptContext = config.promptContext;\n    this.eventBus = config.events;\n\n    // Initialize logger (pluggable or default to console)\n    this.logger = config.logger ?? new ConsoleLogger(`[${this.agentType}Agent]`);\n\n    // Initialize ModelSelector\n    this.modelSelector = new ModelSelector({\n      agentType: this.agentType,\n    });\n\n    // Initialize PromptManager with registry fallback if available\n    const fallbackPrompt =\n      config.systemPrompt ??\n      (isAgentTypeRegistered(this.agentType) ? getAgentFallbackPrompt(this.agentType) : undefined);\n\n    this.promptManager = new PromptManager({\n      agentType: this.agentType,\n      fallbackPrompt,\n    });\n\n    this.logger.info('Agent initialized', {\n      agentId: this.agentId,\n      agentType: this.agentType,\n      tenancy: this.tenancy,\n      maxSteps: this.maxSteps,\n    });\n\n    // Emit creation event\n    this.emitEvent({\n      type: 'agent.created',\n      timestamp: new Date().toISOString(),\n      agentId: this.agentId,\n      agentType: this.agentType,\n      context: this.promptContext,\n    });\n  }\n\n  /**\n   * Send a message to the agent and get a response\n   */\n  async sendMessage(options: SendMessageOptions): Promise<AgentResult | AgentStreamResult> {\n    const {\n      prompt,\n      messages,\n      stream = false,\n      context,\n      tools,\n      maxTokens,\n      temperature,\n      onStepFinish,\n      onFinish,\n    } = options;\n\n    // Validate: must provide either prompt or messages\n    if (!(prompt || messages)) {\n      throw new AgentError('Must provide either prompt or messages', 'INVALID_INPUT');\n    }\n\n    if (prompt && messages) {\n      throw new AgentError(\n        'Cannot provide both prompt and messages - use one or the other',\n        'INVALID_INPUT'\n      );\n    }\n\n    const startTime = Date.now();\n\n    this.logger.debug('Sending message to agent', {\n      stream,\n      mode: prompt ? 'single-turn' : 'multi-turn',\n      promptLength: prompt?.length,\n      messageCount: messages?.length,\n      hasTools: !!tools,\n    });\n\n    try {\n      // Get system prompt with context interpolation\n      const mergedContext = { ...this.promptContext, ...context };\n      const systemPrompt =\n        this.systemPromptOverride ?? (await this.promptManager.getPrompt(mergedContext));\n\n      // Emit prompt loaded event\n      this.emitEvent({\n        type: 'prompt.loaded',\n        timestamp: new Date().toISOString(),\n        agentId: this.agentId,\n        promptName: `${this.agentType}_system`,\n        source: this.systemPromptOverride ? 'override' : 'fallback',\n      });\n\n      if (mergedContext && Object.keys(mergedContext).length > 0) {\n        this.emitEvent({\n          type: 'prompt.interpolated',\n          timestamp: new Date().toISOString(),\n          agentId: this.agentId,\n          variables: Object.keys(mergedContext),\n          characterCount: systemPrompt.length,\n        });\n      }\n\n      // Get optimized model for this operation\n      const model = await this.modelSelector.getLanguageModel({\n        operation: stream ? 'stream' : 'generate',\n        complexity: this.getComplexity(),\n      });\n\n      const selectedModelName = this.modelSelector.getSelectedModelName({\n        operation: stream ? 'stream' : 'generate',\n        complexity: this.getComplexity(),\n      });\n\n      // Emit model selection event\n      this.emitEvent({\n        type: 'model.selected',\n        timestamp: new Date().toISOString(),\n        agentId: this.agentId,\n        agentType: this.agentType,\n        model: selectedModelName,\n        provider: this.getProviderFromModel(selectedModelName),\n        complexity: this.getComplexity(),\n        operation: stream ? 'stream' : 'generate',\n        reason: 'complexity-based routing',\n      });\n\n      // Merge tools\n      const allTools = this.getTools();\n      const mergedTools = { ...allTools, ...tools };\n\n      // Emit agent started event\n      this.emitEvent({\n        type: 'agent.started',\n        timestamp: new Date().toISOString(),\n        agentId: this.agentId,\n        agentType: this.agentType,\n        operation: stream ? 'stream' : 'generate',\n        model: selectedModelName,\n      });\n\n      if (stream) {\n        return this.handleStreamingResponse({\n          model,\n          systemPrompt,\n          tools: mergedTools,\n          prompt,\n          messages,\n          maxTokens,\n          temperature,\n          onStepFinish,\n          onFinish,\n          startTime,\n        });\n      }\n\n      // Create ToolLoopAgent instance for non-streaming\n      const agent = new ToolLoopAgent({\n        model,\n        instructions: systemPrompt,\n        tools: Object.keys(mergedTools).length > 0 ? mergedTools : undefined,\n        stopWhen: (result) => result.steps.length >= this.maxSteps,\n      });\n\n      return await this.handleNonStreamingResponse({\n        agent,\n        prompt,\n        messages,\n        maxTokens,\n        temperature,\n        startTime,\n      });\n    } catch (error) {\n      const durationMs = Date.now() - startTime;\n\n      // Normalize error to Error instance for consistent handling\n      const err = error instanceof Error ? error : new Error(String(error));\n\n      this.logger.error('Error sending message', err, {\n        prompt: prompt?.substring(0, PROMPT_LOG_MAX_LENGTH),\n        messageCount: messages?.length,\n      });\n\n      // Emit failure event\n      this.emitEvent({\n        type: 'agent.failed',\n        timestamp: new Date().toISOString(),\n        agentId: this.agentId,\n        agentType: this.agentType,\n        error: {\n          code: 'code' in err ? String(err.code) : 'UNKNOWN',\n          message: err.message,\n          stack: err.stack,\n        },\n        durationMs,\n      });\n\n      if (error instanceof AgentError) {\n        throw error;\n      }\n\n      throw new ModelError('Failed to send message to agent', error);\n    }\n  }\n\n  /**\n   * Handle non-streaming response\n   */\n  private async handleNonStreamingResponse(options: {\n    agent: ToolLoopAgent;\n    prompt?: string;\n    messages?: unknown[];\n    maxTokens?: number;\n    temperature?: number;\n    startTime: number;\n  }): Promise<AgentResult> {\n    const { agent, prompt, messages, maxTokens, temperature, startTime } = options;\n\n    this.logger.debug('Generating non-streaming response');\n\n    try {\n      const callParams = this.buildCallParams({ prompt, messages, maxTokens, temperature });\n\n      // TypeScript cannot infer that buildCallParams ensures either prompt or messages is set.\n      // We build the params dynamically and guarantee the constraint at runtime.\n      // @ts-expect-error - Dynamic parameter building ensures valid structure\n      const result = await agent.generate(callParams);\n\n      // Log and emit tool calls\n      if (result.toolCalls && result.toolCalls.length > 0) {\n        this.logger.info('Tool calls executed', {\n          toolCallCount: result.toolCalls.length,\n          tools: result.toolCalls.map((tc) => tc.toolName),\n        });\n\n        for (const tc of result.toolCalls) {\n          this.logger.debug('Tool call details', {\n            toolName: tc.toolName,\n            args: tc.input,\n          });\n\n          // Emit tool called event\n          this.emitEvent({\n            type: 'tool.called',\n            timestamp: new Date().toISOString(),\n            agentId: this.agentId,\n            stepNumber: 1, // Non-streaming is typically single step\n            toolName: tc.toolName,\n            toolCallId: tc.toolCallId,\n            args: tc.input as Record<string, unknown>,\n          });\n        }\n\n        if (result.toolResults && result.toolResults.length > 0) {\n          for (const tr of result.toolResults) {\n            this.logger.debug('Tool result', {\n              toolName: tr.toolName,\n              toolCallId: tr.toolCallId,\n              output: tr.output,\n            });\n\n            const output = tr.output as { success?: boolean; error?: string };\n            const isError = output && typeof output === 'object' && output.success === false;\n\n            if (isError) {\n              this.logger.warn('Tool execution failed', {\n                toolName: tr.toolName,\n                error: output.error,\n              });\n            }\n\n            // Emit tool completed event\n            this.emitEvent({\n              type: 'tool.completed',\n              timestamp: new Date().toISOString(),\n              agentId: this.agentId,\n              stepNumber: 1,\n              toolName: tr.toolName,\n              toolCallId: tr.toolCallId,\n              durationMs: 0, // Duration tracking would require instrumentation\n              success: !isError,\n              result: tr.output,\n              error: isError ? output.error : undefined,\n            });\n          }\n        }\n      }\n\n      // Emit tokens consumed\n      this.emitEvent({\n        type: 'tokens.consumed',\n        timestamp: new Date().toISOString(),\n        agentId: this.agentId,\n        model: this.modelSelector.getSelectedModelName({ complexity: this.getComplexity() }),\n        tokens: {\n          input: result.usage.inputTokens ?? 0,\n          output: result.usage.outputTokens ?? 0,\n          total: result.usage.totalTokens ?? 0,\n        },\n      });\n\n      const durationMs = Date.now() - startTime;\n\n      this.logger.info('Non-streaming response generated', {\n        textLength: result.text.length,\n        finishReason: result.finishReason,\n        usage: result.usage,\n        toolCallCount: result.toolCalls?.length ?? 0,\n      });\n\n      // Emit completion event\n      this.emitEvent({\n        type: 'agent.completed',\n        timestamp: new Date().toISOString(),\n        agentId: this.agentId,\n        agentType: this.agentType,\n        durationMs,\n        stepCount: 1,\n        totalTokens: result.usage.totalTokens ?? 0,\n        finishReason: result.finishReason,\n      });\n\n      return {\n        text: result.text,\n        toolCalls: result.toolCalls?.map((tc) => ({\n          toolName: tc.toolName,\n          args: tc.input as Record<string, unknown>,\n        })),\n        toolResults: result.toolResults?.map((tr) => ({\n          toolName: tr.toolName,\n          toolCallId: tr.toolCallId,\n          result: tr.output,\n        })),\n        finishReason: result.finishReason,\n        usage: {\n          promptTokens: result.usage.inputTokens ?? 0,\n          completionTokens: result.usage.outputTokens ?? 0,\n          totalTokens: result.usage.totalTokens ?? 0,\n        },\n      };\n    } catch (error) {\n      this.logger.error('Error in non-streaming generation', error as Error);\n      throw new ModelError('Failed to generate response', error);\n    }\n  }\n\n  /**\n   * Handle streaming response\n   */\n  private async handleStreamingResponse(options: {\n    model: LanguageModel;\n    systemPrompt: string;\n    tools: Record<string, Tool>;\n    prompt?: string;\n    messages?: unknown[];\n    maxTokens?: number;\n    temperature?: number;\n    onStepFinish?: OnStepFinishCallback;\n    onFinish?: OnFinishCallback;\n    startTime: number;\n  }): Promise<AgentStreamResult> {\n    const {\n      model,\n      systemPrompt,\n      tools: mergedTools,\n      prompt,\n      messages,\n      maxTokens,\n      temperature,\n      onStepFinish,\n      onFinish,\n      startTime,\n    } = options;\n\n    this.logger.debug('Starting streaming response');\n\n    // Emit stream started\n    this.emitEvent({\n      type: 'stream.started',\n      timestamp: new Date().toISOString(),\n      agentId: this.agentId,\n    });\n\n    let stepCounter = 0;\n\n    try {\n      const agent = new ToolLoopAgent({\n        model,\n        instructions: systemPrompt,\n        tools: Object.keys(mergedTools).length > 0 ? mergedTools : undefined,\n        stopWhen: (result) => result.steps.length >= this.maxSteps,\n        onStepFinish: onStepFinish\n          ? async (result) => {\n              stepCounter++;\n\n              this.logger.debug('Step finished', {\n                stepNumber: stepCounter,\n                finishReason: result.finishReason,\n                textLength: result.text.length,\n              });\n\n              // Emit step completed event\n              this.emitEvent({\n                type: 'step.completed',\n                timestamp: new Date().toISOString(),\n                agentId: this.agentId,\n                stepNumber: stepCounter,\n                stepType: stepCounter === 1 ? 'initial' : 'continue',\n                durationMs: 0,\n                tokens: {\n                  input: result.usage.inputTokens ?? 0,\n                  output: result.usage.outputTokens ?? 0,\n                  total: result.usage.totalTokens ?? 0,\n                },\n                finishReason: result.finishReason,\n                toolCallCount: result.toolCalls?.length ?? 0,\n              });\n\n              await onStepFinish({\n                stepType: stepCounter === 1 ? 'initial' : 'continue',\n                stepNumber: stepCounter,\n                finishReason: result.finishReason,\n                usage: {\n                  inputTokens: result.usage.inputTokens ?? 0,\n                  outputTokens: result.usage.outputTokens ?? 0,\n                  totalTokens: result.usage.totalTokens ?? 0,\n                },\n                text: result.text,\n                toolCalls: result.toolCalls?.map((tc) => ({\n                  toolName: tc.toolName,\n                  args: tc.input as Record<string, unknown>,\n                })),\n                toolResults: result.toolResults?.map((tr) => ({\n                  toolName: tr.toolName,\n                  toolCallId: tr.toolCallId,\n                  result: tr.output,\n                })),\n              });\n            }\n          : undefined,\n        onFinish: onFinish\n          ? async (result) => {\n              const durationMs = Date.now() - startTime;\n\n              this.logger.info('Generation finished', {\n                stepCount: result.steps.length,\n                finishReason: result.finishReason,\n                totalTokens: result.totalUsage.totalTokens,\n              });\n\n              // Emit completion event\n              this.emitEvent({\n                type: 'agent.completed',\n                timestamp: new Date().toISOString(),\n                agentId: this.agentId,\n                agentType: this.agentType,\n                durationMs,\n                stepCount: result.steps.length,\n                totalTokens: result.totalUsage.totalTokens ?? 0,\n                finishReason: result.finishReason,\n              });\n\n              await onFinish({\n                finishReason: result.finishReason,\n                text: result.text,\n                usage: {\n                  inputTokens: result.usage.inputTokens ?? 0,\n                  outputTokens: result.usage.outputTokens ?? 0,\n                  totalTokens: result.usage.totalTokens ?? 0,\n                },\n                totalUsage: {\n                  inputTokens: result.totalUsage.inputTokens ?? 0,\n                  outputTokens: result.totalUsage.outputTokens ?? 0,\n                  totalTokens: result.totalUsage.totalTokens ?? 0,\n                },\n                toolCalls: result.toolCalls?.map((tc) => ({\n                  toolName: tc.toolName,\n                  args: tc.input as Record<string, unknown>,\n                })),\n                toolResults: result.toolResults?.map((tr) => ({\n                  toolName: tr.toolName,\n                  toolCallId: tr.toolCallId,\n                  result: tr.output,\n                })),\n                stepCount: result.steps.length,\n              });\n            }\n          : undefined,\n      });\n\n      const callParams = this.buildCallParams({ prompt, messages, maxTokens, temperature });\n\n      // TypeScript cannot infer that buildCallParams ensures either prompt or messages is set.\n      // We build the params dynamically and guarantee the constraint at runtime.\n      // @ts-expect-error - Dynamic parameter building ensures valid structure\n      const stream = await agent.stream(callParams);\n\n      return {\n        textStream: stream.textStream,\n        fullStream: stream.fullStream,\n        text: stream.text,\n        finishReason: stream.finishReason,\n        usage: stream.usage.then((usage) => ({\n          promptTokens: usage.inputTokens ?? 0,\n          completionTokens: usage.outputTokens ?? 0,\n          totalTokens: usage.totalTokens ?? 0,\n        })),\n      };\n    } catch (error) {\n      this.logger.error('Error in streaming generation', error as Error);\n      throw new ModelError('Failed to stream response', error);\n    }\n  }\n\n  /**\n   * Emit an event (fire and forget)\n   */\n  protected emitEvent(event: AgentEvent): void {\n    if (this.eventBus) {\n      Promise.resolve(this.eventBus.publish(event)).catch((err) => {\n        console.error('[BaseAgent] Failed to publish event:', err);\n      });\n    }\n  }\n\n  /**\n   * Generate unique agent ID\n   */\n  private generateAgentId(): string {\n    return `agent_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`;\n  }\n\n  /**\n   * Build AI SDK call parameters from input options\n   */\n  private buildCallParams(options: {\n    prompt?: string;\n    messages?: unknown[];\n    maxTokens?: number;\n    temperature?: number;\n  }): AISDKCallParams {\n    const { prompt, messages, maxTokens, temperature } = options;\n\n    const params: AISDKCallParams = {\n      ...(maxTokens && { maxTokens }),\n      ...(temperature !== undefined && { temperature }),\n    };\n\n    if (prompt) {\n      params.prompt = prompt;\n    } else if (messages) {\n      params.messages = messages;\n    }\n\n    return params;\n  }\n\n  /**\n   * Extract provider name from model string\n   */\n  private getProviderFromModel(model: string): string {\n    if (model.includes('claude')) return 'anthropic';\n    if (model.includes('gpt') || model.includes('o3') || model.includes('o4')) return 'openai';\n    if (model.includes('gemini')) return 'google';\n    return 'unknown';\n  }\n\n  /**\n   * Get agent-specific tools\n   * Must be implemented by concrete agents\n   */\n  protected abstract getTools(): Record<string, Tool>;\n\n  /**\n   * Get complexity level for model selection\n   * Automatically reads from Agent Registry if agent is registered,\n   * otherwise returns 'medium' as default\n   *\n   * Override this method for dynamic complexity based on runtime state\n   */\n  protected getComplexity(): ComplexityLevel {\n    // Try to get from registry first (for registered agents)\n    if (isAgentTypeRegistered(this.agentType)) {\n      return getAgentComplexity(this.agentType);\n    }\n\n    // Fallback for unregistered agents or legacy code\n    return 'medium';\n  }\n\n  /**\n   * Get agent type\n   */\n  getAgentType(): string {\n    return this.agentType;\n  }\n\n  /**\n   * Get agent ID\n   */\n  getAgentId(): string {\n    return this.agentId;\n  }\n\n  /**\n   * Get tenancy config (if configured)\n   */\n  getTenancy(): { userId: string; organizationId: string } | undefined {\n    return this.tenancy;\n  }\n\n  /**\n   * Get the configured language model\n   */\n  async getModel(): Promise<LanguageModel> {\n    return this.modelSelector.getLanguageModel({\n      operation: 'stream',\n      complexity: this.getComplexity(),\n    });\n  }\n\n  /**\n   * Get the system prompt with context interpolation\n   */\n  async getSystemPrompt(additionalContext?: Record<string, unknown>): Promise<string> {\n    const mergedContext = { ...this.promptContext, ...additionalContext };\n    return this.systemPromptOverride ?? (await this.promptManager.getPrompt(mergedContext));\n  }\n\n  /**\n   * Get agent tools\n   */\n  getAgentTools(): Record<string, Tool> {\n    return this.getTools();\n  }\n}\n","/**\n * AgentFactory - Type-safe agent instantiation\n * Note: Agent classes are imported here to avoid circular dependencies\n */\n\nimport type { BaseAgent } from './base-agent.js';\nimport type { AgentConfig } from './types.js';\n\n/**\n * Agent class constructor type\n */\nexport type AgentClass = new (config: AgentConfig) => BaseAgent;\n\n/**\n * Agent class registry\n * Map agent types to their class constructors\n *\n * Developers register their agent classes here:\n * ```typescript\n * import { ChatAgent } from './agents/chat-agent';\n * import { ResearchAgent } from './agents/research-agent';\n *\n * const AGENT_CLASS_MAP = {\n *   chat: ChatAgent,\n *   research: ResearchAgent,\n * };\n * ```\n */\nconst AGENT_CLASS_MAP: Record<string, AgentClass> = {\n  // Developers add their agent classes here\n  // This is kept separate from registry.ts to avoid circular dependencies\n};\n\n/**\n * Error thrown when attempting to create an unknown agent type\n */\nexport class UnknownAgentTypeError extends Error {\n  readonly agentType: string;\n\n  constructor(agentType: string) {\n    const availableTypes = Object.keys(AGENT_CLASS_MAP);\n    super(`Unknown agent type: ${agentType}. Available types: ${availableTypes.join(', ')}`);\n    this.agentType = agentType;\n    this.name = 'UnknownAgentTypeError';\n  }\n}\n\n/**\n * Register an agent class\n * Call this to add a new agent type to the factory\n *\n * @example\n * ```typescript\n * import { registerAgentClass } from '@ai-kit/agents';\n * import { ChatAgent } from './my-agents';\n *\n * registerAgentClass('chat', ChatAgent);\n * ```\n */\nexport function registerAgentClass(agentType: string, agentClass: AgentClass): void {\n  if (agentType in AGENT_CLASS_MAP) {\n    console.warn(`[AgentFactory] Overwriting existing agent class for type: ${agentType}`);\n  }\n  AGENT_CLASS_MAP[agentType] = agentClass;\n}\n\n/**\n * Check if an agent class is registered\n */\nexport function isAgentClassRegistered(agentType: string): boolean {\n  return agentType in AGENT_CLASS_MAP;\n}\n\n/**\n * Get all registered agent class types\n */\nexport function getRegisteredAgentClasses(): readonly string[] {\n  return Object.keys(AGENT_CLASS_MAP);\n}\n\n/**\n * Create an agent instance\n *\n * @param config - Agent configuration\n * @returns Agent instance\n * @throws {UnknownAgentTypeError} If agent type is not registered\n *\n * @example\n * ```typescript\n * const agent = createAgent({\n *   agentType: 'chat',\n *   promptContext: { userName: 'Alice' },\n * });\n * ```\n */\nexport function createAgent(config: AgentConfig): BaseAgent {\n  const { agentType } = config;\n\n  // Check if agent class is registered\n  const AgentClass = AGENT_CLASS_MAP[agentType];\n  if (!AgentClass) {\n    throw new UnknownAgentTypeError(agentType);\n  }\n\n  // Instantiate agent\n  return new AgentClass(config);\n}\n\n/**\n * Check if an agent type is available for creation\n */\nexport function isAgentTypeAvailable(agentType: string): boolean {\n  return agentType in AGENT_CLASS_MAP;\n}\n\n/**\n * Get list of available agent types\n */\nexport function getAvailableAgentTypes(): readonly string[] {\n  return Object.keys(AGENT_CLASS_MAP);\n}\n","/**\n * EventBus Interface\n * Pluggable event system for agent observability and integration\n */\n\nimport type { AgentEvent, AgentEventType, ExtractEvent } from './types.js';\n\n/**\n * Unsubscribe function returned by subscribe\n */\nexport type Unsubscribe = () => void;\n\n/**\n * Event handler function (sync or async)\n */\nexport type EventHandler<T extends AgentEvent = AgentEvent> = (event: T) => void | Promise<void>;\n\n/**\n * EventBus interface - implement this to integrate with your infrastructure\n *\n * @example\n * ```typescript\n * class KafkaEventBus implements EventBus {\n *   async publish(event: AgentEvent): Promise<void> {\n *     await this.producer.send({\n *       topic: 'agent-events',\n *       messages: [{ value: JSON.stringify(event) }]\n *     });\n *   }\n *\n *   subscribe(): Unsubscribe {\n *     throw new Error('Subscribe not supported for Kafka');\n *   }\n * }\n * ```\n */\nexport interface EventBus {\n  /**\n   * Publish an event to the bus\n   * Can be sync or async depending on implementation\n   *\n   * @param event - The event to publish\n   */\n  publish(event: AgentEvent): void | Promise<void>;\n\n  /**\n   * Subscribe to all events\n   * Optional - some buses (like Kafka, webhooks) may not support subscribe\n   *\n   * @param handler - Function to call for each event\n   * @returns Unsubscribe function to stop receiving events\n   */\n  subscribe(handler: EventHandler): Unsubscribe;\n\n  /**\n   * Subscribe to specific event types\n   * Optional - some buses may not support type-specific subscriptions\n   *\n   * @param eventType - The event type to subscribe to\n   * @param handler - Function to call for events of this type\n   * @returns Unsubscribe function to stop receiving events\n   */\n  subscribe<T extends AgentEventType>(\n    eventType: T,\n    handler: EventHandler<ExtractEvent<T>>\n  ): Unsubscribe;\n}\n\n/**\n * Simplified EventBus for callback-only implementations\n * Useful for simple integrations that only need to publish\n */\nexport interface SimpleEventBus {\n  publish(event: AgentEvent): void | Promise<void>;\n}\n\n/**\n * Type guard to check if a bus supports subscriptions\n */\nexport function supportsSubscribe(bus: EventBus | SimpleEventBus): bus is EventBus {\n  return 'subscribe' in bus && typeof bus.subscribe === 'function';\n}\n","/**\n * Zod Schemas for Event Validation\n * Ensures event integrity before publishing\n */\n\nimport { z } from 'zod';\n\n/**\n * Base schema shared by all events\n */\nconst baseEventSchema = z.object({\n  timestamp: z.string().datetime(),\n  agentId: z.string(),\n});\n\n/**\n * Agent lifecycle event schemas\n */\nexport const agentCreatedEventSchema = baseEventSchema.extend({\n  type: z.literal('agent.created'),\n  agentType: z.string(),\n  context: z.record(z.unknown()).optional(),\n});\n\nexport const agentStartedEventSchema = baseEventSchema.extend({\n  type: z.literal('agent.started'),\n  agentType: z.string(),\n  operation: z.enum(['generate', 'stream']),\n  model: z.string(),\n});\n\nexport const agentCompletedEventSchema = baseEventSchema.extend({\n  type: z.literal('agent.completed'),\n  agentType: z.string(),\n  durationMs: z.number().nonnegative(),\n  stepCount: z.number().int().nonnegative(),\n  totalTokens: z.number().int().nonnegative(),\n  totalCost: z.number().nonnegative().optional(),\n  finishReason: z.string(),\n});\n\nexport const agentFailedEventSchema = baseEventSchema.extend({\n  type: z.literal('agent.failed'),\n  agentType: z.string(),\n  error: z.object({\n    code: z.string(),\n    message: z.string(),\n    stack: z.string().optional(),\n  }),\n  durationMs: z.number().nonnegative(),\n});\n\n/**\n * Step lifecycle event schemas\n */\nexport const stepStartedEventSchema = baseEventSchema.extend({\n  type: z.literal('step.started'),\n  stepNumber: z.number().int().positive(),\n  stepType: z.enum(['initial', 'continue', 'tool-result']),\n});\n\nexport const stepCompletedEventSchema = baseEventSchema.extend({\n  type: z.literal('step.completed'),\n  stepNumber: z.number().int().positive(),\n  stepType: z.enum(['initial', 'continue', 'tool-result']),\n  durationMs: z.number().nonnegative(),\n  tokens: z.object({\n    input: z.number().int().nonnegative(),\n    output: z.number().int().nonnegative(),\n    total: z.number().int().nonnegative(),\n  }),\n  finishReason: z.string(),\n  toolCallCount: z.number().int().nonnegative(),\n});\n\n/**\n * Tool execution event schemas\n */\nexport const toolCalledEventSchema = baseEventSchema.extend({\n  type: z.literal('tool.called'),\n  stepNumber: z.number().int().positive(),\n  toolName: z.string(),\n  toolCallId: z.string(),\n  args: z.record(z.unknown()),\n});\n\nexport const toolCompletedEventSchema = baseEventSchema.extend({\n  type: z.literal('tool.completed'),\n  stepNumber: z.number().int().positive(),\n  toolName: z.string(),\n  toolCallId: z.string(),\n  durationMs: z.number().nonnegative(),\n  success: z.boolean(),\n  result: z.unknown().optional(),\n  error: z.string().optional(),\n});\n\n/**\n * Model selection event schema\n */\nexport const modelSelectedEventSchema = baseEventSchema.extend({\n  type: z.literal('model.selected'),\n  agentType: z.string(),\n  model: z.string(),\n  provider: z.string(),\n  complexity: z.enum(['low', 'medium', 'high', 'critical']),\n  operation: z.enum(['generate', 'stream']),\n  reason: z.string(),\n});\n\n/**\n * Prompt event schemas\n */\nexport const promptLoadedEventSchema = baseEventSchema.extend({\n  type: z.literal('prompt.loaded'),\n  promptName: z.string(),\n  source: z.enum(['service', 'fallback', 'override']),\n});\n\nexport const promptInterpolatedEventSchema = baseEventSchema.extend({\n  type: z.literal('prompt.interpolated'),\n  variables: z.array(z.string()),\n  characterCount: z.number().int().nonnegative(),\n});\n\n/**\n * Token usage event schema\n */\nexport const tokensConsumedEventSchema = baseEventSchema.extend({\n  type: z.literal('tokens.consumed'),\n  stepNumber: z.number().int().positive().optional(),\n  model: z.string(),\n  tokens: z.object({\n    input: z.number().int().nonnegative(),\n    output: z.number().int().nonnegative(),\n    total: z.number().int().nonnegative(),\n  }),\n  estimatedCost: z.number().nonnegative().optional(),\n});\n\n/**\n * Streaming event schemas\n */\nexport const streamStartedEventSchema = baseEventSchema.extend({\n  type: z.literal('stream.started'),\n});\n\nexport const streamChunkEventSchema = baseEventSchema.extend({\n  type: z.literal('stream.chunk'),\n  chunk: z.string(),\n  byteCount: z.number().int().nonnegative(),\n});\n\nexport const streamCompletedEventSchema = baseEventSchema.extend({\n  type: z.literal('stream.completed'),\n  totalChunks: z.number().int().nonnegative(),\n  totalBytes: z.number().int().nonnegative(),\n  durationMs: z.number().nonnegative(),\n});\n\n/**\n * Discriminated union schema for all events\n */\nexport const agentEventSchema = z.discriminatedUnion('type', [\n  agentCreatedEventSchema,\n  agentStartedEventSchema,\n  agentCompletedEventSchema,\n  agentFailedEventSchema,\n  stepStartedEventSchema,\n  stepCompletedEventSchema,\n  toolCalledEventSchema,\n  toolCompletedEventSchema,\n  modelSelectedEventSchema,\n  promptLoadedEventSchema,\n  promptInterpolatedEventSchema,\n  tokensConsumedEventSchema,\n  streamStartedEventSchema,\n  streamChunkEventSchema,\n  streamCompletedEventSchema,\n]);\n\n/**\n * Validate an event against its schema\n * @param event - The event to validate\n * @returns Validation result\n */\nexport function validateEvent(event: unknown) {\n  return agentEventSchema.safeParse(event);\n}\n\n/**\n * Type guard to check if an object is a valid AgentEvent\n */\nexport function isValidAgentEvent(event: unknown): event is z.infer<typeof agentEventSchema> {\n  return agentEventSchema.safeParse(event).success;\n}\n","/**\n * InMemoryEventBus\n * Default event bus for testing and in-process event handling\n */\n\nimport type { EventBus, EventHandler, Unsubscribe } from '../event-bus.js';\nimport type { AgentEvent, AgentEventType, ExtractEvent } from '../types.js';\n\n/**\n * InMemoryEventBus - Simple event bus for in-process subscriptions\n *\n * Perfect for:\n * - Testing and development\n * - Local event handling\n * - Building debugging tools\n * - Prototyping\n *\n * @example\n * ```typescript\n * const eventBus = new InMemoryEventBus();\n *\n * // Subscribe to all events\n * eventBus.subscribe(event => {\n *   console.log(event.type, event);\n * });\n *\n * // Subscribe to specific event type\n * eventBus.subscribe('agent.completed', event => {\n *   console.log('Agent completed:', event.agentId);\n * });\n * ```\n */\nexport class InMemoryEventBus implements EventBus {\n  private handlers: Set<EventHandler> = new Set();\n  private typedHandlers: Map<AgentEventType, Set<EventHandler>> = new Map();\n\n  /**\n   * Publish an event to all subscribers\n   */\n  publish(event: AgentEvent): void {\n    // Call general handlers\n    for (const handler of this.handlers) {\n      try {\n        handler(event);\n      } catch (error) {\n        console.error('[InMemoryEventBus] Handler error:', error);\n      }\n    }\n\n    // Call type-specific handlers\n    const typeHandlers = this.typedHandlers.get(event.type);\n    if (typeHandlers) {\n      for (const handler of typeHandlers) {\n        try {\n          handler(event);\n        } catch (error) {\n          console.error(`[InMemoryEventBus] Handler error for type ${event.type}:`, error);\n        }\n      }\n    }\n  }\n\n  /**\n   * Subscribe to events\n   * Supports both general and type-specific subscriptions\n   */\n  subscribe(handler: EventHandler): Unsubscribe;\n  subscribe<T extends AgentEventType>(\n    eventType: T,\n    handler: EventHandler<ExtractEvent<T>>\n  ): Unsubscribe;\n  subscribe<T extends AgentEventType>(\n    handlerOrType: EventHandler | T,\n    handler?: EventHandler<ExtractEvent<T>>\n  ): Unsubscribe {\n    // Type-specific subscription\n    if (typeof handlerOrType === 'string' && handler) {\n      const eventType = handlerOrType;\n      if (!this.typedHandlers.has(eventType)) {\n        this.typedHandlers.set(eventType, new Set());\n      }\n      // biome-ignore lint/style/noNonNullAssertion: We just ensured it exists\n      this.typedHandlers.get(eventType)!.add(handler as EventHandler);\n\n      return () => {\n        this.typedHandlers.get(eventType)?.delete(handler as EventHandler);\n        if (this.typedHandlers.get(eventType)?.size === 0) {\n          this.typedHandlers.delete(eventType);\n        }\n      };\n    }\n\n    // General subscription\n    const generalHandler = handlerOrType as EventHandler;\n    this.handlers.add(generalHandler);\n\n    return () => {\n      this.handlers.delete(generalHandler);\n    };\n  }\n\n  /**\n   * Get current subscriber count\n   * Useful for testing and debugging\n   */\n  getSubscriberCount(): { total: number; byType: Record<string, number> } {\n    const byType: Record<string, number> = {};\n    for (const [type, handlers] of this.typedHandlers.entries()) {\n      byType[type] = handlers.size;\n    }\n\n    return {\n      total: this.handlers.size,\n      byType,\n    };\n  }\n\n  /**\n   * Clear all subscriptions\n   * Useful for cleanup in tests\n   */\n  clear(): void {\n    this.handlers.clear();\n    this.typedHandlers.clear();\n  }\n}\n","/**\n * CallbackEventBus\n * Simple event bus that calls a single callback function\n */\n\nimport type { EventBus, EventHandler, Unsubscribe } from '../event-bus.js';\nimport type { AgentEvent } from '../types.js';\n\n/**\n * CallbackEventBus - Minimal event bus with a single callback\n *\n * Perfect for:\n * - Simple integrations\n * - Forwarding events to a single destination\n * - Testing with a spy function\n *\n * @example\n * ```typescript\n * const eventBus = new CallbackEventBus(event => {\n *   console.log('[EVENT]', event.type);\n *   myLoggingService.log(event);\n * });\n * ```\n */\nexport class CallbackEventBus implements EventBus {\n  constructor(private readonly callback: EventHandler) {}\n\n  /**\n   * Publish an event by calling the callback\n   */\n  publish(event: AgentEvent): void | Promise<void> {\n    try {\n      return this.callback(event);\n    } catch (error) {\n      console.error('[CallbackEventBus] Callback error:', error);\n    }\n  }\n\n  /**\n   * Subscribe is not supported for CallbackEventBus\n   * Use InMemoryEventBus if you need subscriptions\n   */\n  subscribe(): Unsubscribe {\n    throw new Error('CallbackEventBus does not support subscribe(). Use InMemoryEventBus instead.');\n  }\n}\n\n/**\n * Create a callback event bus from a function\n * Convenience factory function\n */\nexport function createCallbackEventBus(callback: EventHandler): CallbackEventBus {\n  return new CallbackEventBus(callback);\n}\n","/**\n * MultiEventBus\n * Fan-out events to multiple event buses simultaneously\n */\n\nimport type { EventBus, EventHandler, SimpleEventBus, Unsubscribe } from '../event-bus.js';\nimport { supportsSubscribe } from '../event-bus.js';\nimport type { AgentEvent } from '../types.js';\n\n/**\n * MultiEventBus - Publish events to multiple buses simultaneously\n *\n * Perfect for:\n * - Multi-destination event routing (Kafka + Webhook + Database)\n * - Combining local and remote event handling\n * - Building complex event pipelines\n *\n * @example\n * ```typescript\n * const eventBus = new MultiEventBus([\n *   new KafkaEventBus(kafka, 'agent-events'),\n *   new WebhookEventBus('https://api.example.com/events'),\n *   new InMemoryEventBus(), // Local logging\n * ]);\n * ```\n */\nexport class MultiEventBus implements EventBus {\n  constructor(private readonly buses: (EventBus | SimpleEventBus)[]) {\n    if (buses.length === 0) {\n      console.warn('[MultiEventBus] Created with zero buses');\n    }\n  }\n\n  /**\n   * Publish event to all buses in parallel\n   * Continues even if some buses fail\n   */\n  async publish(event: AgentEvent): Promise<void> {\n    const results = await Promise.allSettled(\n      this.buses.map((bus) => {\n        try {\n          const result = bus.publish(event);\n          return result instanceof Promise ? result : Promise.resolve();\n        } catch (error) {\n          return Promise.reject(error);\n        }\n      })\n    );\n\n    // Log failures but don't throw\n    const failures = results.filter((r) => r.status === 'rejected');\n    if (failures.length > 0) {\n      console.error(\n        `[MultiEventBus] ${failures.length}/${this.buses.length} buses failed`,\n        failures\n      );\n    }\n  }\n\n  /**\n   * Subscribe to all buses that support subscriptions\n   */\n  subscribe(handler: EventHandler): Unsubscribe {\n    const unsubscribers: Unsubscribe[] = [];\n\n    for (const bus of this.buses) {\n      if (supportsSubscribe(bus)) {\n        try {\n          unsubscribers.push(bus.subscribe(handler));\n        } catch (error) {\n          console.error('[MultiEventBus] Subscribe failed for bus:', error);\n        }\n      }\n    }\n\n    if (unsubscribers.length === 0) {\n      console.warn('[MultiEventBus] No buses support subscribe()');\n    }\n\n    return () => {\n      for (const unsub of unsubscribers) {\n        try {\n          unsub();\n        } catch (error) {\n          console.error('[MultiEventBus] Unsubscribe failed:', error);\n        }\n      }\n    };\n  }\n\n  /**\n   * Add a bus to the multi-bus\n   */\n  addBus(bus: EventBus | SimpleEventBus): void {\n    this.buses.push(bus);\n  }\n\n  /**\n   * Remove a bus from the multi-bus\n   */\n  removeBus(bus: EventBus | SimpleEventBus): boolean {\n    const index = this.buses.indexOf(bus);\n    if (index !== -1) {\n      this.buses.splice(index, 1);\n      return true;\n    }\n    return false;\n  }\n\n  /**\n   * Get the number of buses\n   */\n  getBusCount(): number {\n    return this.buses.length;\n  }\n}\n\n/**\n * Create a multi event bus from multiple buses\n * Convenience factory function\n */\nexport function createMultiEventBus(buses: (EventBus | SimpleEventBus)[]): MultiEventBus {\n  return new MultiEventBus(buses);\n}\n","/**\n * FilteredEventBus\n * Filter events before publishing to an underlying bus\n */\n\nimport type { EventBus, EventHandler, Unsubscribe } from '../event-bus.js';\nimport type { AgentEvent, AgentEventType } from '../types.js';\n\n/**\n * Filter predicate function\n */\nexport type EventFilter = (event: AgentEvent) => boolean;\n\n/**\n * FilteredEventBus - Only publish events that match a filter\n *\n * Perfect for:\n * - Filtering by event type\n * - Filtering by agent type\n * - Filtering by criticality (errors only, etc.)\n * - Reducing noise in event streams\n *\n * @example\n * ```typescript\n * // Only publish errors\n * const errorBus = new FilteredEventBus(\n *   databaseBus,\n *   event => event.type === 'agent.failed'\n * );\n *\n * // Only publish high-token usage\n * const costBus = new FilteredEventBus(\n *   analyticsBus,\n *   event => event.type === 'tokens.consumed' && event.tokens.total > 10000\n * );\n * ```\n */\nexport class FilteredEventBus implements EventBus {\n  constructor(\n    private readonly bus: EventBus,\n    private readonly filter: EventFilter\n  ) {}\n\n  /**\n   * Publish event only if it passes the filter\n   */\n  publish(event: AgentEvent): void | Promise<void> {\n    if (this.filter(event)) {\n      return this.bus.publish(event);\n    }\n  }\n\n  /**\n   * Subscribe with filter applied\n   * Handler only receives events that pass the filter\n   */\n  subscribe(handler: EventHandler): Unsubscribe {\n    return this.bus.subscribe((event) => {\n      if (this.filter(event)) {\n        handler(event);\n      }\n    });\n  }\n}\n\n/**\n * Predefined filters for common use cases\n */\nexport const Filters = {\n  /**\n   * Filter by event type\n   */\n  byType: (types: AgentEventType[]): EventFilter => {\n    const typeSet = new Set(types);\n    return (event) => typeSet.has(event.type);\n  },\n\n  /**\n   * Filter by agent type\n   */\n  byAgentType: (agentTypes: string[]): EventFilter => {\n    const typeSet = new Set(agentTypes);\n    return (event) => 'agentType' in event && typeSet.has(event.agentType);\n  },\n\n  /**\n   * Filter errors only\n   */\n  errorsOnly: (): EventFilter => {\n    return (event) => event.type === 'agent.failed';\n  },\n\n  /**\n   * Filter completed events only\n   */\n  completedOnly: (): EventFilter => {\n    return (event) => event.type === 'agent.completed' || event.type === 'step.completed';\n  },\n\n  /**\n   * Filter by minimum token usage\n   */\n  minTokens: (minTokens: number): EventFilter => {\n    return (event) => {\n      if (event.type === 'tokens.consumed') {\n        return event.tokens.total >= minTokens;\n      }\n      if (event.type === 'agent.completed') {\n        return event.totalTokens >= minTokens;\n      }\n      return false;\n    };\n  },\n\n  /**\n   * Filter lifecycle events only (no tools, tokens, etc.)\n   */\n  lifecycleOnly: (): EventFilter => {\n    const lifecycleTypes: AgentEventType[] = [\n      'agent.created',\n      'agent.started',\n      'agent.completed',\n      'agent.failed',\n      'step.started',\n      'step.completed',\n    ];\n    return Filters.byType(lifecycleTypes);\n  },\n\n  /**\n   * Combine multiple filters with AND logic\n   */\n  and: (...filters: EventFilter[]): EventFilter => {\n    return (event) => filters.every((filter) => filter(event));\n  },\n\n  /**\n   * Combine multiple filters with OR logic\n   */\n  or: (...filters: EventFilter[]): EventFilter => {\n    return (event) => filters.some((filter) => filter(event));\n  },\n\n  /**\n   * Negate a filter\n   */\n  not: (filter: EventFilter): EventFilter => {\n    return (event) => !filter(event);\n  },\n};\n\n/**\n * Create a filtered event bus\n * Convenience factory function\n */\nexport function createFilteredEventBus(bus: EventBus, filter: EventFilter): FilteredEventBus {\n  return new FilteredEventBus(bus, filter);\n}\n","/**\n * ValidatingEventBus\n * Validate events against Zod schema before publishing\n */\n\nimport type { EventBus, EventHandler, Unsubscribe } from '../event-bus.js';\nimport { validateEvent } from '../schemas.js';\nimport type { AgentEvent } from '../types.js';\n\n/**\n * Validation error handler\n */\nexport type ValidationErrorHandler = (event: unknown, errors: unknown) => void;\n\n/**\n * ValidatingEventBus - Validate events before publishing\n *\n * Perfect for:\n * - Development and testing\n * - Catching bugs in event emission\n * - Ensuring event integrity\n * - Debugging event issues\n *\n * @example\n * ```typescript\n * const eventBus = new ValidatingEventBus(kafkaBus, {\n *   onValidationError: (event, errors) => {\n *     console.error('Invalid event:', event, errors);\n *     alerting.notify('Invalid event detected');\n *   }\n * });\n * ```\n */\nexport class ValidatingEventBus implements EventBus {\n  private readonly onValidationError?: ValidationErrorHandler;\n\n  constructor(\n    private readonly bus: EventBus,\n    options?: {\n      onValidationError?: ValidationErrorHandler;\n    }\n  ) {\n    this.onValidationError = options?.onValidationError;\n  }\n\n  /**\n   * Validate and publish event\n   * Invalid events are not published\n   */\n  publish(event: AgentEvent): void | Promise<void> {\n    const result = validateEvent(event);\n\n    if (!result.success) {\n      const errors = result.error.format();\n\n      // Call custom error handler\n      if (this.onValidationError) {\n        this.onValidationError(event, errors);\n      } else {\n        // Default error logging\n        console.error('[ValidatingEventBus] Invalid event:', {\n          event,\n          errors,\n        });\n      }\n\n      // Do not publish invalid events\n      return;\n    }\n\n    return this.bus.publish(event);\n  }\n\n  /**\n   * Subscribe with validation\n   */\n  subscribe(handler: EventHandler): Unsubscribe {\n    return this.bus.subscribe(handler);\n  }\n}\n\n/**\n * Create a validating event bus\n * Convenience factory function\n */\nexport function createValidatingEventBus(\n  bus: EventBus,\n  options?: {\n    onValidationError?: ValidationErrorHandler;\n  }\n): ValidatingEventBus {\n  return new ValidatingEventBus(bus, options);\n}\n"]}