{"version":3,"sources":["../src/context.ts","../src/index.ts","../../debug/src/index.ts","../../memory/src/utils.ts","../src/agent.ts","../src/handoff.ts","../src/handoff-prompt.ts","../src/run-context.ts","../src/streaming.ts","../src/tool-result-extractor.ts","../src/utils.ts","../src/guardrails.ts","../src/permissions.ts","../src/routing.ts"],"sourcesContent":["/**\n * Context Management using AI SDK's experimental_context\n *\n * This provides type-safe context that flows through tools via AI SDK's\n * built-in experimental_context parameter.\n *\n * Key features:\n * - Uses AI SDK's official context mechanism\n * - Fully flexible user context - pass ANY type you want (object, string, class instance, etc.)\n * - Stream writer for artifacts and real-time updates\n * - Type-safe with full TypeScript support\n * - Available in all tools via executionOptions.experimental_context\n */\n\nimport type { MemoryConfig } from \"@ai-sdk-tools/memory\";\nimport type { UIMessageStreamWriter } from \"ai\";\n\n/**\n * Core execution context that flows through tools via AI SDK\n *\n * This merges your custom context with required system fields.\n * Your context fields are available at the top level alongside writer and metadata.\n *\n * @template TContext - Your custom context type (must be an object)\n */\nexport type ExecutionContext<\n  TContext extends Record<string, unknown> = Record<string, unknown>,\n> = TContext & {\n  /** Stream writer for real-time updates and artifacts */\n  writer: UIMessageStreamWriter;\n\n  /** Metadata about the current execution */\n  metadata?: {\n    /** Current agent name */\n    agent?: string;\n    /** Execution start time */\n    startTime?: Date;\n    /** Request ID for tracing */\n    requestId?: string;\n    /** Chat ID for memory scope */\n    chatId?: string;\n    /** User ID for memory scope */\n    userId?: string;\n    /** Any custom metadata */\n    [key: string]: unknown;\n  };\n\n  /** Memory configuration for persistent context */\n  memory?: MemoryConfig;\n};\n\n/**\n * Type-safe context creator options\n *\n * @template TContext - Your custom context type (must be an object)\n */\nexport interface ContextOptions<\n  TContext extends Record<string, unknown> = Record<string, unknown>,\n> {\n  /** Your custom application context - spread at the top level */\n  context: TContext;\n\n  /** Stream writer (required in streaming mode) */\n  writer: UIMessageStreamWriter;\n\n  /** Metadata */\n  metadata?: ExecutionContext<TContext>[\"metadata\"];\n}\n\n/**\n * Create an execution context to pass to AI SDK's experimental_context\n *\n * Your context object is spread at the top level, merged with writer and metadata.\n * This means you can access your fields directly without a wrapper.\n *\n * @template TContext - Your custom context type (must be an object)\n *\n * @example Basic usage\n * ```typescript\n * const context = createExecutionContext({\n *   context: { userId: '123', db: database, permissions: ['read', 'write'] },\n *   writer: streamWriter\n * });\n * // Access in tools: executionOptions.experimental_context.userId\n * ```\n *\n * @example With typed context\n * ```typescript\n * interface MyAppContext {\n *   tenant: string;\n *   workspace: string;\n *   features: string[];\n * }\n *\n * const context = createExecutionContext<MyAppContext>({\n *   context: { tenant: 'acme', workspace: 'main', features: ['analytics'] },\n *   writer: streamWriter\n * });\n * // Access in tools: executionOptions.experimental_context.tenant\n * ```\n *\n * @example With metadata\n * ```typescript\n * const context = createExecutionContext({\n *   context: { userId: '123', tenantId: 'acme' },\n *   writer: streamWriter,\n *   metadata: { agent: 'reports', requestId: 'req_123' }\n * });\n * ```\n */\nexport function createExecutionContext<\n  TContext extends Record<string, unknown> = Record<string, unknown>,\n>(options: ContextOptions<TContext>): ExecutionContext<TContext> {\n  return {\n    ...options.context,\n    writer: options.writer,\n    metadata: {\n      startTime: new Date(),\n      ...options.metadata,\n    },\n  } as ExecutionContext<TContext>;\n}\n\n/**\n * Get your custom context from execution options\n *\n * Your context fields are available directly in experimental_context (no wrapper).\n * This helper provides type-safe access.\n *\n * @template T - Your custom context type (object)\n * @param executionOptions - Tool execution options from AI SDK\n * @returns Your custom context\n *\n * @example Direct access (no helper needed)\n * ```typescript\n * export const myTool = tool({\n *   execute: async (params, executionOptions) => {\n *     // Access fields directly\n *     const userId = executionOptions.experimental_context.userId;\n *     const db = executionOptions.experimental_context.db;\n *   }\n * });\n * ```\n *\n * @example With typed helper\n * ```typescript\n * interface AppContext {\n *   userId: string;\n *   tenantId: string;\n *   db: Database;\n * }\n *\n * export const myTool = tool({\n *   execute: async (params, executionOptions) => {\n *     const { userId, tenantId, db } = getContext<AppContext>(executionOptions);\n *     const user = await db.users.findOne(userId);\n *   }\n * });\n * ```\n */\nexport function getContext<\n  T extends Record<string, unknown> = Record<string, unknown>,\n>(executionOptions?: { experimental_context?: T }): T | undefined {\n  // AI SDK passes context via experimental_context\n  return executionOptions?.experimental_context;\n}\n","// Core exports\nexport { Agent } from \"./agent.js\";\nexport type { ContextOptions, ExecutionContext } from \"./context.js\";\n// Context management\nexport { createExecutionContext, getContext } from \"./context.js\";\n// Guardrails\nexport {\n  AgentsError,\n  GuardrailExecutionError,\n  InputGuardrailTripwireTriggered,\n  MaxTurnsExceededError,\n  OutputGuardrailTripwireTriggered,\n  runInputGuardrails,\n  runOutputGuardrails,\n  ToolCallError,\n  ToolPermissionDeniedError,\n} from \"./guardrails.js\";\n// Handoff utilities\nexport {\n  createHandoff,\n  createHandoffTool,\n  isHandoffResult,\n  isHandoffTool,\n  HANDOFF_TOOL_NAME,\n  handoff,\n  getTransferMessage,\n} from \"./handoff.js\";\n// Permissions\nexport {\n  checkToolPermission,\n  createUsageTracker,\n  trackToolCall,\n} from \"./permissions.js\";\n// Routing\nexport { findBestMatch, matchAgent } from \"./routing.js\";\nexport { AgentRunContext } from \"./run-context.js\";\n// Streaming utilities\nexport {\n  writeAgentStatus,\n  writeDataPart,\n  writeRateLimit,\n} from \"./streaming.js\";\n// Types\nexport type {\n  AgentConfig,\n  AgentDataParts,\n  AgentEvent,\n  AgentGenerateOptions,\n  AgentGenerateResult,\n  AgentStreamOptions,\n  AgentStreamOptionsUI,\n  AgentStreamResult,\n  AgentUIMessage,\n  ConfiguredHandoff,\n  ExtendedExecutionContext,\n  GuardrailResult,\n  HandoffConfig,\n  HandoffData,\n  HandoffInstruction,\n  InputGuardrail,\n  MemoryIdentifiers,\n  OutputGuardrail,\n  ToolPermissionCheck,\n  ToolPermissionContext,\n  ToolPermissionResult,\n  ToolPermissions,\n} from \"./types.js\";\n// Utilities\nexport { extractTextFromMessage } from \"./utils.js\";\n","const isDebugEnabled = process.env.DEBUG_AGENTS === 'true';\n\n// ANSI color codes for terminal output\nconst colors = {\n  reset: '\\x1b[0m',\n  gray: '\\x1b[90m',\n  blue: '\\x1b[34m',\n  cyan: '\\x1b[36m',\n  yellow: '\\x1b[33m',\n  red: '\\x1b[31m',\n  green: '\\x1b[32m',\n  magenta: '\\x1b[35m',\n};\n\n// Format timestamp\nconst timestamp = () => new Date().toISOString().slice(11, 23);\n\n// Create category-scoped logger with clean API\nexport function createLogger(category: string) {\n  if (!isDebugEnabled) {\n    // Return no-op functions when debug is disabled\n    return {\n      debug: () => {},\n      info: () => {},\n      warn: () => {},\n      error: () => {},\n    };\n  }\n\n  return {\n    debug: (message: string, data?: any) => {\n      const ts = `${colors.gray}[${timestamp()}]${colors.reset}`;\n      const level = `${colors.blue}DEBUG${colors.reset}`;\n      const cat = `${colors.cyan}[${category}]${colors.reset}`;\n      const dataStr = data ? ` ${colors.gray}${JSON.stringify(data)}${colors.reset}` : '';\n      console.log(`${ts} ${level} ${cat} ${message}${dataStr}`);\n    },\n    info: (message: string, data?: any) => {\n      const ts = `${colors.gray}[${timestamp()}]${colors.reset}`;\n      const level = `${colors.green}INFO${colors.reset}`;\n      const cat = `${colors.cyan}[${category}]${colors.reset}`;\n      const dataStr = data ? ` ${colors.gray}${JSON.stringify(data)}${colors.reset}` : '';\n      console.log(`${ts} ${level} ${cat} ${message}${dataStr}`);\n    },\n    warn: (message: string, data?: any) => {\n      const ts = `${colors.gray}[${timestamp()}]${colors.reset}`;\n      const level = `${colors.yellow}WARN${colors.reset}`;\n      const cat = `${colors.cyan}[${category}]${colors.reset}`;\n      const dataStr = data ? ` ${colors.gray}${JSON.stringify(data)}${colors.reset}` : '';\n      console.warn(`${ts} ${level} ${cat} ${message}${dataStr}`);\n    },\n    error: (message: string, data?: any) => {\n      const ts = `${colors.gray}[${timestamp()}]${colors.reset}`;\n      const level = `${colors.red}ERROR${colors.reset}`;\n      const cat = `${colors.cyan}[${category}]${colors.reset}`;\n      const dataStr = data ? ` ${colors.gray}${JSON.stringify(data)}${colors.reset}` : '';\n      console.error(`${ts} ${level} ${cat} ${message}${dataStr}`);\n    },\n  };\n}\n\n// Export a base logger for backward compatibility\nexport const logger = {\n  debug: (message: string, data?: any) => {\n    if (!isDebugEnabled) return;\n    const ts = `${colors.gray}[${timestamp()}]${colors.reset}`;\n    const level = `${colors.blue}DEBUG${colors.reset}`;\n    const dataStr = data ? ` ${colors.gray}${JSON.stringify(data)}${colors.reset}` : '';\n    console.log(`${ts} ${level} ${message}${dataStr}`);\n  },\n  info: (message: string, data?: any) => {\n    if (!isDebugEnabled) return;\n    const ts = `${colors.gray}[${timestamp()}]${colors.reset}`;\n    const level = `${colors.green}INFO${colors.reset}`;\n    const dataStr = data ? ` ${colors.gray}${JSON.stringify(data)}${colors.reset}` : '';\n    console.log(`${ts} ${level} ${message}${dataStr}`);\n  },\n  warn: (message: string, data?: any) => {\n    if (!isDebugEnabled) return;\n    const ts = `${colors.gray}[${timestamp()}]${colors.reset}`;\n    const level = `${colors.yellow}WARN${colors.reset}`;\n    const dataStr = data ? ` ${colors.gray}${JSON.stringify(data)}${colors.reset}` : '';\n    console.warn(`${ts} ${level} ${message}${dataStr}`);\n  },\n  error: (message: string, data?: any) => {\n    if (!isDebugEnabled) return;\n    const ts = `${colors.gray}[${timestamp()}]${colors.reset}`;\n    const level = `${colors.red}ERROR${colors.reset}`;\n    const dataStr = data ? ` ${colors.gray}${JSON.stringify(data)}${colors.reset}` : '';\n    console.error(`${ts} ${level} ${message}${dataStr}`);\n  },\n};\n\n","import type { ConversationMessage, WorkingMemory } from \"./types.js\";\n\n/**\n * Default working memory template\n */\nexport const DEFAULT_TEMPLATE = `# Working Memory\n\n## Key Facts\n- [Important information goes here]\n\n## Current Focus\n- [What the user is working on]\n\n## Preferences\n- [User preferences and settings]\n`;\n\n/**\n * Format working memory for system prompt\n */\nexport function formatWorkingMemory(memory: WorkingMemory | null): string {\n  if (!memory?.content) return \"\";\n  return `\\n## Working Memory\\n\\n${memory.content}\\n`;\n}\n\n/**\n * Format conversation history\n */\nexport function formatHistory(\n  messages: ConversationMessage[],\n  limit = 10,\n): string {\n  if (!messages.length) return \"\";\n\n  const recent = messages.slice(-limit);\n  const formatted = recent\n    .map((m) => `**${m.role}**: ${m.content}`)\n    .join(\"\\n\\n\");\n\n  return `\\n## Recent Messages\\n\\n${formatted}\\n`;\n}\n\n/**\n * Instructions for working memory\n */\nexport function getWorkingMemoryInstructions(template: string): string {\n  return `\n## Working Memory\n\nYou have access to persistent working memory that stores user preferences, context, and important facts across conversations.\n\n**ALWAYS call updateWorkingMemory when:**\n- User shares OR corrects their name, role, company, or preferences\n- User provides OR updates important facts you should remember\n- User corrects previous information about themselves\n- Any new or changed context that should persist for future conversations\n\n**Template structure to follow:**\n\\`\\`\\`\n${template}\n\\`\\`\\`\n\n**Critical:** After calling updateWorkingMemory, respond to the user confirming the update.\n`.trim();\n}\n","import { createLogger } from \"@ai-sdk-tools/debug\";\nimport {\n  DEFAULT_TEMPLATE,\n  formatWorkingMemory,\n  getWorkingMemoryInstructions,\n  type MemoryConfig,\n} from \"@ai-sdk-tools/memory\";\nimport {\n  Experimental_Agent as AISDKAgent,\n  convertToModelMessages,\n  createUIMessageStream,\n  createUIMessageStreamResponse,\n  generateObject,\n  generateText,\n  type LanguageModel,\n  type ModelMessage,\n  type StepResult,\n  stepCountIs,\n  type Tool,\n  tool,\n  type UIMessage,\n  type UIMessageStreamOnFinishCallback,\n  type UIMessageStreamWriter,\n} from \"ai\";\nimport { z } from \"zod\";\nimport { createExecutionContext } from \"./context.js\";\nimport {\n  createHandoffTool,\n  HANDOFF_TOOL_NAME,\n  isHandoffResult,\n} from \"./handoff.js\";\nimport { promptWithHandoffInstructions } from \"./handoff-prompt.js\";\nimport { AgentRunContext } from \"./run-context.js\";\nimport { writeAgentStatus, writeSuggestions } from \"./streaming.js\";\nimport { createDefaultInputFilter } from \"./tool-result-extractor.js\";\nimport type {\n  AgentConfig,\n  AgentEvent,\n  AgentGenerateOptions,\n  AgentGenerateResult,\n  AgentStreamOptions,\n  AgentStreamOptionsUI,\n  AgentStreamResult,\n  ConfiguredHandoff,\n  ExtendedExecutionContext,\n  HandoffInputData,\n  HandoffInstruction,\n  Agent as IAgent,\n  InputGuardrail,\n  MemoryIdentifiers,\n  OutputGuardrail,\n  ToolPermissions,\n} from \"./types.js\";\nimport { extractTextFromMessage, stripMetadata } from \"./utils.js\";\n\nconst logger = createLogger(\"AGENT\");\n\nexport class Agent<\n  TContext extends Record<string, unknown> = Record<string, unknown>,\n> implements IAgent<TContext>\n{\n  public readonly name: string;\n  public readonly instructions: string | ((context: TContext) => string);\n  public readonly matchOn?:\n    | (string | RegExp)[]\n    | ((message: string) => boolean);\n  public readonly onEvent?: (event: AgentEvent) => void | Promise<void>;\n  public readonly inputGuardrails?: InputGuardrail[];\n  public readonly outputGuardrails?: OutputGuardrail[];\n  public readonly permissions?: ToolPermissions;\n  public readonly lastMessages?: number;\n  private readonly memory?: MemoryConfig;\n  private readonly model: LanguageModel;\n  private readonly aiAgent: AISDKAgent<Record<string, Tool>>;\n  private readonly handoffAgents: Array<IAgent<any> | ConfiguredHandoff<any>>;\n  private readonly configuredTools:\n    | Record<string, Tool>\n    | ((context: TContext) => Record<string, Tool>);\n  private readonly modelSettings?: Record<string, unknown>;\n  // Cache for system prompt construction\n  private _cachedSystemPrompt?: string;\n  private _cacheKey?: string;\n\n  constructor(config: AgentConfig<TContext>) {\n    this.name = config.name;\n    this.instructions = config.instructions;\n    this.matchOn = config.matchOn;\n    this.onEvent = config.onEvent;\n    this.inputGuardrails = config.inputGuardrails;\n    this.outputGuardrails = config.outputGuardrails;\n    this.permissions = config.permissions;\n    this.lastMessages = config.lastMessages;\n    this.memory = config.memory;\n    this.model = config.model;\n    this.handoffAgents = config.handoffs || [];\n    this.modelSettings = config.modelSettings;\n\n    // Store tools config (will be resolved at runtime)\n    this.configuredTools = config.tools || {};\n\n    // Create AI SDK Agent with minimal config (system prompt overridden per-request in stream())\n    // Extract toolChoice from modelSettings (needs to be a top-level param per AI SDK)\n    const { toolChoice, ...otherModelSettings } = config.modelSettings || {};\n\n    this.aiAgent = new AISDKAgent<Record<string, Tool>>({\n      model: config.model,\n      system: \"\", // Will be overridden per-request with resolved instructions\n      tools: {}, // Will be overridden per-request with resolved tools\n      stopWhen: stepCountIs(config.maxTurns || 10),\n      temperature: config.temperature,\n      toolChoice: toolChoice as any, // Pass toolChoice as top-level param\n      ...otherModelSettings,\n    });\n  }\n\n  async generate(options: AgentGenerateOptions): Promise<AgentGenerateResult> {\n    const startTime = new Date();\n\n    try {\n      const result =\n        options.messages && options.messages.length > 0\n          ? await this.aiAgent.generate({\n              messages: [\n                ...options.messages,\n                { role: \"user\", content: options.prompt || \"Continue\" },\n              ],\n            })\n          : await this.aiAgent.generate({\n              prompt: options.prompt,\n            });\n\n      const endTime = new Date();\n\n      // Extract handoffs from steps\n      const handoffs: HandoffInstruction[] = [];\n      if (result.steps) {\n        for (const step of result.steps) {\n          if (step.toolResults) {\n            for (const toolResult of step.toolResults) {\n              if (isHandoffResult(toolResult.output)) {\n                handoffs.push(toolResult.output as HandoffInstruction);\n              }\n            }\n          }\n        }\n      }\n\n      return {\n        text: result.text || \"\",\n        finalAgent: this.name,\n        finalOutput: result.text || \"\",\n        handoffs,\n        metadata: {\n          startTime,\n          endTime,\n          duration: endTime.getTime() - startTime.getTime(),\n        },\n        steps: result.steps,\n        finishReason: result.finishReason,\n        usage: result.usage,\n        toolCalls: result.toolCalls?.map((tc) => ({\n          toolCallId: tc.toolCallId,\n          toolName: tc.toolName,\n          args: \"args\" in tc ? tc.args : undefined,\n        })),\n      };\n    } catch (error) {\n      throw new Error(\n        `Agent ${this.name} failed: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n      );\n    }\n  }\n\n  stream(\n    options: AgentStreamOptions | { messages: ModelMessage[] },\n  ): AgentStreamResult {\n    logger.debug(`${this.name} stream called`, { name: this.name });\n\n    // Extract our internal execution context (we map to/from AI SDK's experimental_context at boundaries)\n    const executionContext = (options as Record<string, unknown>)\n      .executionContext as Record<string, unknown> | undefined;\n    const maxSteps = (options as Record<string, unknown>).maxSteps as\n      | number\n      | undefined;\n    const onStepFinish = (options as Record<string, unknown>).onStepFinish as\n      | ((step: unknown) => void | Promise<void>)\n      | undefined;\n    const toolChoice = (options as Record<string, unknown>).toolChoice as\n      | string\n      | undefined;\n\n    // Resolve instructions dynamically (static string or function)\n    const resolvedInstructions =\n      typeof this.instructions === \"function\"\n        ? this.instructions(executionContext as TContext)\n        : this.instructions;\n\n    // Get memory addition from context if preloaded\n    const extendedContext = executionContext as ExtendedExecutionContext;\n    const memoryAddition = extendedContext._memoryAddition || \"\";\n\n    // Build cache key for static parts\n    const cacheKey = `${typeof this.instructions === \"string\" ? this.instructions : \"dynamic\"}_${this.handoffAgents.length}_${this.memory?.workingMemory?.enabled || false}`;\n\n    // Build system prompt with caching for static parts\n    let systemPrompt: string;\n    if (\n      this._cacheKey === cacheKey &&\n      this._cachedSystemPrompt &&\n      !memoryAddition\n    ) {\n      // Use cached version if no dynamic memory addition\n      systemPrompt = this._cachedSystemPrompt;\n    } else {\n      // Build the static base prompt\n      let basePrompt =\n        this.handoffAgents.length > 0\n          ? promptWithHandoffInstructions(resolvedInstructions)\n          : resolvedInstructions;\n\n      // Add working memory instructions if enabled\n      if (this.memory?.workingMemory?.enabled) {\n        const workingMemoryInstructions = getWorkingMemoryInstructions(\n          this.memory.workingMemory.template || DEFAULT_TEMPLATE,\n        );\n        basePrompt += `\\n\\n${workingMemoryInstructions}`;\n      }\n\n      // Cache the base prompt if instructions are static\n      if (typeof this.instructions === \"string\" && !memoryAddition) {\n        this._cachedSystemPrompt = basePrompt;\n        this._cacheKey = cacheKey;\n      }\n\n      // Add dynamic memory addition\n      systemPrompt = basePrompt + memoryAddition;\n    }\n\n    // Resolve tools dynamically (static object or function)\n    const resolvedTools =\n      typeof this.configuredTools === \"function\"\n        ? this.configuredTools(executionContext as TContext)\n        : { ...this.configuredTools };\n\n    // Add handoff tool if needed\n    if (this.handoffAgents.length > 0) {\n      resolvedTools[HANDOFF_TOOL_NAME] = createHandoffTool(this.handoffAgents);\n      // Note: Agents communicate via conversationMessages during handoffs\n    }\n\n    // Add working memory update tool if enabled\n    // Give to all agents that can do work (have tools beyond just handoff)\n    const hasOtherTools = Object.keys(resolvedTools).some(\n      (key) => key !== HANDOFF_TOOL_NAME,\n    );\n    const isPureOrchestrator = this.handoffAgents.length > 0 && !hasOtherTools;\n\n    if (this.memory?.workingMemory?.enabled && !isPureOrchestrator) {\n      resolvedTools.updateWorkingMemory = this.createWorkingMemoryTool();\n    }\n\n    // Note: Conversation history is automatically loaded via loadMessagesWithHistory()\n\n    // Build additional options to pass to AI SDK\n    // Extract toolChoice as a top-level param (per AI SDK requirements)\n    const { toolChoice: configuredToolChoice, ...otherSettings } =\n      this.modelSettings || {};\n\n    // Allow runtime toolChoice to override configured toolChoice\n    const effectiveToolChoice = toolChoice\n      ? { type: \"tool\" as const, toolName: toolChoice }\n      : configuredToolChoice;\n\n    const additionalOptions: Record<string, unknown> = {\n      system: systemPrompt, // Override system prompt per call\n      tools: resolvedTools, // Add resolved tools here\n      toolChoice: effectiveToolChoice, // Pass toolChoice as top-level param\n      ...otherSettings, // Include other model settings\n    };\n\n    if (executionContext) {\n      additionalOptions.experimental_context = executionContext;\n    }\n\n    if (maxSteps) additionalOptions.maxSteps = maxSteps;\n    if (onStepFinish) additionalOptions.onStepFinish = onStepFinish;\n\n    // Handle simple { messages } format (like working code)\n    if (\"messages\" in options && !(\"prompt\" in options) && options.messages) {\n      logger.debug(`Stream with messages only`, {\n        messageCount: options.messages.length,\n      });\n      return this.aiAgent.stream({\n        messages: options.messages,\n        ...additionalOptions,\n      }) as unknown as AgentStreamResult;\n    }\n\n    // Handle full AgentStreamOptions format\n    const opts = options as AgentStreamOptions;\n    logger.debug(`Stream options for ${this.name}`, {\n      hasPrompt: !!opts.prompt,\n      messageCount: opts.messages?.length || 0,\n    });\n\n    if (!opts.prompt && (!opts.messages || opts.messages.length === 0)) {\n      throw new Error(\"No prompt or messages provided to stream method\");\n    }\n\n    // If we have messages, append prompt as user message\n    if (opts.messages && opts.messages.length > 0 && opts.prompt) {\n      return this.aiAgent.stream({\n        messages: [...opts.messages, { role: \"user\", content: opts.prompt }],\n        ...additionalOptions,\n      }) as unknown as AgentStreamResult;\n    }\n\n    // Prompt only\n    if (opts.prompt) {\n      return this.aiAgent.stream({\n        prompt: opts.prompt,\n        ...additionalOptions,\n      }) as unknown as AgentStreamResult;\n    }\n\n    throw new Error(\"No valid options provided to stream method\");\n  }\n\n  getHandoffs(): Array<IAgent<any>> {\n    return this.handoffAgents.map((h) => (\"agent\" in h ? h.agent : h));\n  }\n\n  getConfiguredHandoffs(): Array<ConfiguredHandoff<any>> {\n    return this.handoffAgents.map((h) => (\"agent\" in h ? h : { agent: h }));\n  }\n\n  /**\n   * Convert agent execution to UI Message Stream Response\n   * High-level API for Next.js route handlers\n   *\n   * This follows the working pattern from the route.ts reference code\n   */\n  toUIMessageStream(options: AgentStreamOptionsUI): Response {\n    const {\n      message,\n      strategy = \"auto\",\n      maxRounds = 5,\n      maxSteps = 10,\n      context,\n      agentChoice,\n      toolChoice,\n      beforeStream,\n      onEvent,\n      // AI SDK createUIMessageStream options\n      onFinish,\n      onError,\n      generateId,\n      // AI SDK toUIMessageStream options\n      sendReasoning,\n      sendSources,\n      sendFinish,\n      sendStart,\n      messageMetadata,\n      // Response options\n      status,\n      statusText,\n      headers,\n    } = options;\n\n    // Declare variable to store chat metadata (will be loaded in execute block)\n    let existingChatForSave: any = null;\n\n    // Wrap onFinish to save messages after streaming\n    const wrappedOnFinish: UIMessageStreamOnFinishCallback<never> = async (\n      event,\n    ) => {\n      // Save messages and update chat session after stream completes\n      if (this.memory?.history?.enabled && context) {\n        const { chatId, userId } = this.extractMemoryIdentifiers(\n          context as TContext,\n        );\n\n        if (!chatId) {\n          logger.warn(\"Cannot save messages: chatId is missing from context\");\n        } else {\n          try {\n            // The AI SDK provides complete messages with all parts in event.messages\n            const userMsg: any = event.messages[event.messages.length - 2]; // second to last is user message\n            const assistantMsg: any = event.messages[event.messages.length - 1]; // last is assistant message\n\n            // Filter out file parts from user message - files should never be stored in history\n            // They're only needed during initial LLM processing\n            let userMsgToSave: any = userMsg;\n            if (userMsg && Array.isArray(userMsg.content)) {\n              const filteredContent = userMsg.content.filter(\n                (part: any) => part.type !== \"file\",\n              );\n              userMsgToSave = {\n                ...userMsg,\n                content: filteredContent.length > 0 ? filteredContent : \"\",\n              };\n            }\n\n            logger.debug(`Saving messages (files excluded from storage)`);\n            await this.saveConversation(\n              chatId,\n              userId,\n              JSON.stringify(userMsgToSave),\n              JSON.stringify(assistantMsg),\n              existingChatForSave,\n            );\n          } catch (err) {\n            logger.error(\"Failed to save conversation\", { error: err });\n          }\n        }\n      }\n\n      // Call user's onFinish\n      await onFinish?.(event);\n    };\n\n    const stream = createUIMessageStream({\n      originalMessages: [message] as never[],\n      onFinish: wrappedOnFinish,\n      onError,\n      generateId,\n      execute: async ({ writer }) => {\n        // Load history and working memory in parallel for better performance\n        const [messages, memoryAddition] = await Promise.all([\n          this.loadMessagesWithHistory(message, context as TContext),\n          context && this.memory?.workingMemory?.enabled\n            ? this.loadWorkingMemory(context as TContext)\n            : Promise.resolve(\"\"),\n        ]);\n\n        // Load chat metadata once for the entire request (stored in closure for wrappedOnFinish)\n        const { chatId } = this.extractMemoryIdentifiers(context as TContext);\n        if (this.memory?.chats?.enabled && chatId) {\n          existingChatForSave = await this.memory.provider?.getChat?.(chatId);\n        }\n\n        // Extract input from last message for routing\n        const lastMessage = messages[messages.length - 1];\n        const input = extractTextFromMessage(lastMessage);\n\n        // Generate chat title if this is the first message (using pre-loaded chat)\n        await this.maybeGenerateChatTitle(\n          context as TContext,\n          input,\n          writer,\n          existingChatForSave,\n        );\n\n        // Create AgentRunContext for the workflow\n        const runContext = new AgentRunContext(context || {});\n        runContext.metadata = {\n          agent: this.name,\n          requestId: `req_${Date.now()}_${Math.random().toString(36).substring(7)}`,\n        };\n\n        // Create execution context with user context and writer\n        const executionContext = createExecutionContext({\n          context: (context || {}) as Record<string, unknown>,\n          writer,\n          metadata: {\n            agent: this.name,\n            requestId: runContext.metadata.requestId as string,\n          },\n        });\n\n        // Add runContext to execution context for shared memory tool\n        (executionContext as any).runContext = runContext;\n\n        // Store memory addition for system prompt injection\n        if (memoryAddition) {\n          const extendedExecContext =\n            executionContext as ExtendedExecutionContext;\n          extendedExecContext._memoryAddition = memoryAddition;\n        }\n\n        try {\n          // Execute beforeStream hook - allows for rate limiting, auth, etc.\n          if (beforeStream) {\n            const shouldContinue = await beforeStream({ writer });\n            if (shouldContinue === false) {\n              // Type assertion needed: custom finish message format\n              writer.write({ type: \"finish\" } as any);\n              return;\n            }\n          }\n\n          // Prepare conversation messages\n          const conversationMessages = [...messages];\n\n          // Get handoff agents (specialists)\n          const specialists = this.getHandoffs();\n\n          // Emit orchestrator start (even if we skip to specialist via programmatic routing)\n          writeAgentStatus(writer, {\n            status: \"routing\",\n            agent: this.name,\n          });\n\n          if (onEvent) {\n            await onEvent({\n              type: \"agent-start\",\n              agent: this.name,\n              round: 0,\n            });\n          }\n\n          // Determine starting agent using programmatic routing\n          let currentAgent: IAgent<any> = this;\n\n          // Check for explicit agent or tool choice (highest priority)\n          if (agentChoice && specialists.length > 0) {\n            const chosenAgent = specialists.find(\n              (agent) => agent.name === agentChoice,\n            );\n            if (chosenAgent) {\n              currentAgent = chosenAgent;\n              logger.debug(`Explicit agent choice: ${currentAgent.name}`, {\n                agent: currentAgent.name,\n              });\n\n              // Mark orchestrator as completing\n              writeAgentStatus(writer, {\n                status: \"completing\",\n                agent: this.name,\n              });\n\n              if (onEvent) {\n                await onEvent({\n                  type: \"agent-finish\",\n                  agent: this.name,\n                  round: 0,\n                });\n              }\n\n              // Emit handoff event for explicit choice\n              writer.write({\n                type: \"data-agent-handoff\",\n                data: {\n                  from: this.name,\n                  to: chosenAgent.name,\n                  reason: \"User selected agent\",\n                  routingStrategy: \"explicit\",\n                },\n                transient: true,\n              } as never);\n\n              if (onEvent) {\n                await onEvent({\n                  type: \"agent-handoff\",\n                  from: this.name,\n                  to: chosenAgent.name,\n                  reason: \"User selected agent\",\n                });\n              }\n            }\n          } else if (toolChoice && specialists.length > 0) {\n            // Find agent that has the requested tool\n            const agentWithTool = specialists.find((agent) => {\n              const agentImpl = agent as Agent<any>;\n              return (\n                agentImpl.configuredTools &&\n                toolChoice in agentImpl.configuredTools\n              );\n            });\n\n            if (agentWithTool) {\n              currentAgent = agentWithTool;\n              logger.debug(\n                `Tool choice routing: ${toolChoice} → ${currentAgent.name}`,\n                { toolChoice, agent: currentAgent.name },\n              );\n\n              // Mark orchestrator as completing\n              writeAgentStatus(writer, {\n                status: \"completing\",\n                agent: this.name,\n              });\n\n              if (onEvent) {\n                await onEvent({\n                  type: \"agent-finish\",\n                  agent: this.name,\n                  round: 0,\n                });\n              }\n\n              // Emit handoff event for tool choice\n              writer.write({\n                type: \"data-agent-handoff\",\n                data: {\n                  from: this.name,\n                  to: agentWithTool.name,\n                  reason: `User requested tool: ${toolChoice}`,\n                  routingStrategy: \"tool-choice\",\n                  preferredTool: toolChoice,\n                },\n                transient: true,\n              } as never);\n\n              if (onEvent) {\n                await onEvent({\n                  type: \"agent-handoff\",\n                  from: this.name,\n                  to: agentWithTool.name,\n                  reason: `User requested tool: ${toolChoice}`,\n                });\n              }\n            }\n          } else if (strategy === \"auto\" && specialists.length > 0) {\n            // Try programmatic classification\n            const matchedAgent = specialists.find((agent) => {\n              if (!agent.matchOn) return false;\n              if (typeof agent.matchOn === \"function\") {\n                return agent.matchOn(input);\n              }\n              if (Array.isArray(agent.matchOn)) {\n                return agent.matchOn.some((pattern) => {\n                  if (typeof pattern === \"string\") {\n                    return input.toLowerCase().includes(pattern.toLowerCase());\n                  }\n                  if (pattern instanceof RegExp) {\n                    return pattern.test(input);\n                  }\n                  return false;\n                });\n              }\n              return false;\n            });\n\n            if (matchedAgent) {\n              currentAgent = matchedAgent;\n              logger.debug(`Programmatic match: ${currentAgent.name}`, {\n                agent: currentAgent.name,\n              });\n\n              // Mark orchestrator as completing\n              writeAgentStatus(writer, {\n                status: \"completing\",\n                agent: this.name,\n              });\n\n              if (onEvent) {\n                await onEvent({\n                  type: \"agent-finish\",\n                  agent: this.name,\n                  round: 0,\n                });\n              }\n\n              // Emit handoff event for programmatic routing\n              writer.write({\n                type: \"data-agent-handoff\",\n                data: {\n                  from: this.name,\n                  to: matchedAgent.name,\n                  reason: \"Programmatic routing match\",\n                  routingStrategy: \"programmatic\",\n                },\n                transient: true,\n              } as never);\n\n              if (onEvent) {\n                await onEvent({\n                  type: \"agent-handoff\",\n                  from: this.name,\n                  to: matchedAgent.name,\n                  reason: \"Programmatic routing match\",\n                });\n              }\n            }\n          }\n\n          let round = 0;\n          const usedSpecialists = new Set<string>();\n\n          // If we used programmatic routing, mark specialist as used\n          if (currentAgent !== this) {\n            usedSpecialists.add(currentAgent.name);\n          }\n\n          while (round++ < maxRounds) {\n            // Send status: agent executing\n            writeAgentStatus(writer, {\n              status: \"executing\",\n              agent: currentAgent.name,\n            });\n\n            // Get context window size from agent config, with sensible defaults\n            // Use lower default for specialists (no handoffs) to reduce token usage\n            const defaultLastMessages =\n              currentAgent.getHandoffs().length > 0 ? 10 : 5;\n            const lastMessages =\n              currentAgent.lastMessages ?? defaultLastMessages;\n\n            // Ensure we have at least the original user message\n            let messagesToSend = conversationMessages.slice(-lastMessages);\n            if (messagesToSend.length === 0 && messages.length > 0) {\n              messagesToSend = messages.slice(-1); // Use the last user message\n            }\n\n            // Emit agent start event\n            if (onEvent) {\n              await onEvent({\n                type: \"agent-start\",\n                agent: currentAgent.name,\n                round,\n              });\n            }\n\n            // Type assertion needed: executionContext and onStepFinish types don't strictly match\n            // Note: toolChoice is NOT passed here - it was only used for routing\n            // Passing it would force the tool to be called on every turn\n            const result = currentAgent.stream({\n              messages: messagesToSend,\n              executionContext: executionContext,\n              maxSteps, // Limit tool calls per round\n              onStepFinish: async (step: unknown) => {\n                if (onEvent) {\n                  await onEvent({\n                    type: \"agent-step\",\n                    agent: currentAgent.name,\n                    step: step as StepResult<Record<string, Tool>>,\n                  });\n                }\n              },\n            } as any);\n\n            // This automatically converts fullStream to proper UI message chunks\n            // Pass toUIMessageStream options from user config\n            const uiStream = result.toUIMessageStream({\n              sendReasoning,\n              sendSources,\n              sendFinish,\n              sendStart,\n              messageMetadata,\n            });\n\n            // Track for orchestration\n            let textAccumulated = \"\";\n            let handoffData: HandoffInstruction | null = null;\n            const toolCallNames = new Map<string, string>(); // toolCallId -> toolName\n            const toolResults = new Map<string, any>(); // toolName -> result\n            let hasStartedContent = false;\n\n            // Optimize handoff detection with Set for O(1) lookups\n            const handoffToolNames = new Set([HANDOFF_TOOL_NAME]);\n\n            // Stream UI chunks - AI SDK handles all the formatting!\n            for await (const chunk of uiStream) {\n              // Skip undefined/null chunks\n              if (!chunk) {\n                logger.warn(\"Received null/undefined chunk from uiStream\");\n                continue;\n              }\n\n              // Track tool names when they start (do this early for handoff detection)\n              if (chunk.type === \"tool-input-start\") {\n                toolCallNames.set(chunk.toolCallId, chunk.toolName);\n                logger.debug(\n                  `Tool call started: ${chunk.toolName} (${chunk.toolCallId})`,\n                  {\n                    toolName: chunk.toolName,\n                    toolCallId: chunk.toolCallId,\n                    agent: currentAgent.name,\n                    round,\n                  },\n                );\n              }\n\n              // Check if this chunk is related to handoff (internal orchestration)\n              let isHandoffChunk = false;\n\n              if (chunk.type === \"tool-input-start\") {\n                isHandoffChunk = handoffToolNames.has((chunk as any).toolName);\n              } else if (\n                chunk.type === \"tool-input-delta\" ||\n                chunk.type === \"tool-input-available\"\n              ) {\n                const toolName = toolCallNames.get((chunk as any).toolCallId);\n                isHandoffChunk = toolName\n                  ? handoffToolNames.has(toolName)\n                  : false;\n              } else if (chunk.type === \"tool-output-available\") {\n                const toolName = toolCallNames.get((chunk as any).toolCallId);\n                isHandoffChunk = toolName\n                  ? handoffToolNames.has(toolName)\n                  : false;\n              }\n\n              // Clear status on first actual content (text or non-handoff tool)\n              if (\n                !hasStartedContent &&\n                (chunk.type === \"text-delta\" ||\n                  (chunk.type === \"tool-input-start\" && !isHandoffChunk))\n              ) {\n                hasStartedContent = true;\n              }\n\n              // Log general errors\n              if (chunk.type === \"error\") {\n                logger.error(\"Stream error\", {\n                  error:\n                    (chunk as any).errorText || (chunk as any).error || chunk,\n                });\n              }\n\n              // Capture tool results and detect handoffs\n              if (chunk.type === \"tool-output-available\") {\n                const toolName = toolCallNames.get(chunk.toolCallId);\n                if (toolName) {\n                  // Store tool result for handoff context\n                  toolResults.set(toolName, chunk.output);\n                  logger.debug(`Captured ${toolName}`, {\n                    toolName,\n                    outputType: typeof chunk.output,\n                  });\n\n                  // Detect handoff\n                  if (handoffToolNames.has(toolName)) {\n                    handoffData = chunk.output as HandoffInstruction;\n                    logger.debug(\"Handoff detected\", handoffData);\n                  }\n                }\n              }\n\n              // Filter out handoff tool chunks from UI (internal orchestration)\n              // But keep agent status events (written separately via writeAgentStatus)\n              if (!isHandoffChunk) {\n                try {\n                  writer.write(chunk as any);\n                } catch (error) {\n                  logger.error(\"Failed to write chunk to stream\", {\n                    chunkType: chunk.type,\n                    error,\n                  });\n                }\n              }\n\n              // Track text for conversation history\n              if (chunk.type === \"text-delta\") {\n                textAccumulated += chunk.delta;\n              }\n            }\n\n            // Update conversation - only add text if it's a complete response\n            // Don't add intermediate text that was generated between tool calls\n            if (textAccumulated && !handoffData) {\n              // Only add to conversation if this is a final response (no handoff occurred)\n              conversationMessages.push({\n                role: \"assistant\",\n                content: textAccumulated,\n              });\n            } else if (textAccumulated && handoffData) {\n              // If there was a handoff, this text was intermediate - don't add to conversation\n              // The handoff agent will provide the final response\n              logger.debug(\"Skipping intermediate text due to handoff\", {\n                textLength: textAccumulated.length,\n                handoffTarget: handoffData.targetAgent,\n              });\n            }\n\n            // Emit agent finish event\n            if (onEvent) {\n              await onEvent({\n                type: \"agent-finish\",\n                agent: currentAgent.name,\n                round,\n              });\n            }\n\n            // Handle orchestration flow\n            if (currentAgent === this) {\n              if (handoffData) {\n                // Check if this specialist has already been used\n                if (usedSpecialists.has(handoffData.targetAgent)) {\n                  // Don't route to the same specialist twice - task is complete\n                  break;\n                }\n\n                // Send routing status\n                writeAgentStatus(writer, {\n                  status: \"routing\",\n                  agent: this.name,\n                });\n\n                // Mark specialist as used and route to it\n                usedSpecialists.add(handoffData.targetAgent);\n                const nextAgent = specialists.find(\n                  (a) => a.name === handoffData.targetAgent,\n                );\n                if (nextAgent) {\n                  // Apply handoff input filter if configured\n                  const configuredHandoffs = this.getConfiguredHandoffs();\n                  const configuredHandoff = configuredHandoffs.find(\n                    (ch) => ch.agent.name === handoffData.targetAgent,\n                  );\n\n                  // Apply handoff input filter if configured\n                  const inputFilter = configuredHandoff?.config?.inputFilter;\n                  if (inputFilter) {\n                    try {\n                      // Build HandoffInputData with captured tool results\n                      const handoffInputData: HandoffInputData = {\n                        inputHistory: conversationMessages,\n                        preHandoffItems: [],\n                        newItems: Array.from(toolResults.entries()).map(\n                          ([name, result]) => ({\n                            toolName: name,\n                            result: result,\n                          }),\n                        ),\n                        runContext,\n                      };\n\n                      // Apply filter to modify conversation history\n                      const filteredData = inputFilter(handoffInputData);\n\n                      // Update conversation messages with filtered data\n                      conversationMessages.length = 0;\n                      conversationMessages.push(...filteredData.inputHistory);\n                    } catch (error) {\n                      logger.error(\"Error applying handoff input filter\", {\n                        error,\n                      });\n                      // Continue with original conversation messages as fallback\n                    }\n                  } else {\n                    // Use default input filter to modify conversation history\n                    logger.debug(\"Applying default input filter for\", {\n                      targetAgent: handoffData.targetAgent,\n                    });\n                    const defaultFilter = createDefaultInputFilter();\n\n                    const handoffInputData: HandoffInputData = {\n                      inputHistory: conversationMessages,\n                      preHandoffItems: [],\n                      newItems: Array.from(toolResults.entries()).map(\n                        ([name, result]) => ({\n                          toolName: name,\n                          result: result,\n                        }),\n                      ),\n                      runContext,\n                    };\n\n                    logger.debug(\"Input history length\", {\n                      length: handoffInputData.inputHistory.length,\n                    });\n                    logger.debug(\"Input history messages\", {\n                      messages: handoffInputData.inputHistory.map((m) => ({\n                        role: m.role,\n                        contentType: typeof m.content,\n                      })),\n                    });\n                    const filteredData = defaultFilter(handoffInputData);\n                    logger.debug(\"Filtered history length\", {\n                      length: filteredData.inputHistory.length,\n                    });\n\n                    // Update conversation messages with filtered data\n                    conversationMessages.length = 0;\n                    conversationMessages.push(...filteredData.inputHistory);\n                    logger.debug(\"Updated conversation messages length\", {\n                      length: conversationMessages.length,\n                    });\n                  }\n\n                  // Call onHandoff callback if configured\n                  if (configuredHandoff?.config?.onHandoff) {\n                    try {\n                      await configuredHandoff.config.onHandoff(runContext);\n                    } catch (error) {\n                      logger.error(\"Error in onHandoff callback\", { error });\n                      // Continue execution - callback errors shouldn't stop handoff\n                    }\n                  }\n\n                  currentAgent = nextAgent;\n\n                  writer.write({\n                    type: \"data-agent-handoff\",\n                    data: {\n                      from: this.name,\n                      to: nextAgent.name,\n                      reason: handoffData.reason,\n                      routingStrategy: \"llm\",\n                    },\n                    transient: true,\n                  } as never);\n\n                  // Emit handoff event\n                  if (onEvent) {\n                    await onEvent({\n                      type: \"agent-handoff\",\n                      from: this.name,\n                      to: nextAgent.name,\n                      reason: handoffData.reason,\n                    });\n                  }\n                }\n              } else {\n                // Orchestrator done, no more handoffs\n                break;\n              }\n            } else {\n              // Specialist done\n              if (handoffData) {\n                // Specialist handed off to another specialist\n                if (usedSpecialists.has(handoffData.targetAgent)) {\n                  // Already used this specialist - complete\n                  break;\n                }\n\n                // Route to next specialist\n                usedSpecialists.add(handoffData.targetAgent);\n                const nextAgent = specialists.find(\n                  (a) => a.name === handoffData.targetAgent,\n                );\n                if (nextAgent) {\n                  // Apply handoff input filter if configured\n                  const configuredHandoffs = this.getConfiguredHandoffs();\n                  const configuredHandoff = configuredHandoffs.find(\n                    (ch) => ch.agent.name === handoffData.targetAgent,\n                  );\n\n                  if (configuredHandoff?.config?.inputFilter) {\n                    try {\n                      // Build HandoffInputData\n                      const handoffInputData: HandoffInputData = {\n                        inputHistory: conversationMessages.slice(0, -1), // All messages except the last assistant message\n                        preHandoffItems: [], // No pre-handoff items for specialist-to-specialist\n                        newItems: conversationMessages.slice(-1), // The last assistant message\n                        runContext,\n                      };\n\n                      // Apply filter\n                      const filteredData =\n                        configuredHandoff.config.inputFilter(handoffInputData);\n\n                      // Update conversation messages with filtered data\n                      conversationMessages.length = 0;\n                      conversationMessages.push(\n                        ...filteredData.inputHistory,\n                        ...filteredData.newItems,\n                      );\n                    } catch (error) {\n                      logger.error(\"Error applying handoff input filter\", {\n                        error,\n                      });\n                      // Continue with original conversation messages as fallback\n                    }\n                  }\n\n                  // Call onHandoff callback if configured\n                  if (configuredHandoff?.config?.onHandoff) {\n                    try {\n                      await configuredHandoff.config.onHandoff(runContext);\n                    } catch (error) {\n                      logger.error(\"Error in onHandoff callback\", { error });\n                      // Continue execution - callback errors shouldn't stop handoff\n                    }\n                  }\n\n                  const previousAgent = currentAgent;\n                  currentAgent = nextAgent;\n\n                  // Write handoff to stream for devtools\n                  writer.write({\n                    type: \"data-agent-handoff\",\n                    data: {\n                      from: previousAgent.name,\n                      to: nextAgent.name,\n                      reason: handoffData.reason,\n                      routingStrategy: \"llm\",\n                    },\n                    transient: true,\n                  } as never);\n\n                  // Emit handoff event\n                  if (onEvent) {\n                    await onEvent({\n                      type: \"agent-handoff\",\n                      from: previousAgent.name,\n                      to: nextAgent.name,\n                      reason: handoffData.reason,\n                    });\n                  }\n                }\n              } else {\n                // No handoff - specialist is done, complete the task\n                break;\n              }\n            }\n          }\n\n          // Emit completion event\n          if (onEvent) {\n            await onEvent({\n              type: \"agent-complete\",\n              totalRounds: round,\n            });\n          }\n\n          // Generate suggestions after orchestration completes\n          const config = this.memory?.chats?.generateSuggestions;\n          const minLength =\n            typeof config === \"object\" && config.minResponseLength\n              ? config.minResponseLength\n              : 100;\n\n          // Get accumulated text length from conversation messages\n          const assistantMessages = conversationMessages.filter(\n            (m) => m.role === \"assistant\",\n          );\n          const totalTextLength = assistantMessages.reduce((sum, m) => {\n            return sum + (typeof m.content === \"string\" ? m.content.length : 0);\n          }, 0);\n\n          // Only generate if response is substantial enough\n          if (totalTextLength >= minLength) {\n            // Use focused context window (recent exchanges) instead of full history\n            const contextWindow =\n              typeof config === \"object\" && config.contextWindow\n                ? config.contextWindow\n                : 1;\n\n            // Get last N exchanges (user + assistant pairs)\n            const recentMessages = conversationMessages.slice(\n              -(contextWindow * 2),\n            );\n\n            const conversationContext = recentMessages\n              .map((msg) => {\n                const role = msg.role === \"user\" ? \"User\" : \"Assistant\";\n                return `${role}: ${typeof msg.content === \"string\" ? msg.content : JSON.stringify(msg.content)}`;\n              })\n              .join(\"\\n\\n\");\n\n            // Generate suggestions based on recent context\n            await this.generateSuggestions(\n              conversationContext,\n              conversationMessages,\n              writer,\n              context as TContext,\n            ).catch((err) =>\n              logger.error(\"Suggestion generation error\", { error: err }),\n            );\n          }\n\n          writer.write({ type: \"finish\" });\n        } catch (error) {\n          logger.error(\"Error in toUIMessageStream\", { error });\n\n          // Emit error event\n          if (onEvent) {\n            await onEvent({\n              type: \"agent-error\",\n              error: error instanceof Error ? error : new Error(String(error)),\n            });\n          }\n\n          // Type assertions needed: custom error and finish message formats\n          writer.write({\n            type: \"error\",\n            error: error instanceof Error ? error.message : String(error),\n          } as any);\n          writer.write({ type: \"finish\" } as any);\n        }\n      },\n    });\n\n    const response = createUIMessageStreamResponse({\n      stream,\n      status,\n      statusText,\n      headers,\n    });\n\n    return response;\n  }\n\n  /**\n   * Extract chatId and userId from context for memory operations\n   */\n  private extractMemoryIdentifiers(context: TContext): {\n    chatId?: string;\n    userId?: string;\n  } {\n    const ctx = context as TContext & MemoryIdentifiers;\n    const chatId = ctx.chatId || ctx.metadata?.chatId;\n    const userId = ctx.userId || ctx.metadata?.userId;\n    return { chatId, userId };\n  }\n\n  /**\n   * Generate a title for the chat based on the first user message\n   */\n  private async generateChatTitle(\n    chatId: string,\n    userMessage: string,\n    writer: UIMessageStreamWriter,\n    _context?: TContext,\n  ): Promise<void> {\n    if (!this.memory?.chats?.generateTitle) return;\n\n    const config = this.memory.chats.generateTitle;\n    const model = typeof config === \"object\" ? config.model : this.model;\n    const instructions =\n      typeof config === \"object\" && config.instructions\n        ? config.instructions\n        : `<task_context>\nYou are a helpful assistant that can generate titles for conversations.\n</task_context>\n\n<rules>\nFind the most concise title that captures what the user is asking for.\nTitles should be at most 30 characters.\nTitles should be formatted in sentence case, with capital letters at the start of each word. Do not provide a period at the end.\n</rules>\n\n<task>\nGenerate a title for the conversation.\n</task>\n\n<output_format>\nReturn only the title.\n</output_format>`;\n\n    try {\n      // Generate title based only on the user's message\n      const { text } = await generateText({\n        model,\n        system: instructions,\n        prompt: userMessage,\n        temperature: 0,\n      });\n\n      await this.memory.provider?.updateChatTitle?.(chatId, text);\n\n      writer.write({\n        type: \"data-chat-title\",\n        data: { chatId, title: text },\n      });\n\n      logger.debug(`Generated title for ${chatId}`, { chatId, title: text });\n    } catch (err) {\n      logger.error(\"Title generation failed\", { error: err });\n    }\n  }\n\n  /**\n   * Build capabilities description from available tools and agents\n   */\n  private buildCapabilitiesDescription(context?: TContext): string {\n    const capabilities: string[] = [];\n\n    // Add tools (exclude internal tools)\n    if (this.configuredTools) {\n      // Resolve tools if they're a function\n      const resolvedTools =\n        typeof this.configuredTools === \"function\" && context\n          ? this.configuredTools(context)\n          : typeof this.configuredTools === \"object\"\n            ? this.configuredTools\n            : {};\n\n      const toolNames = Object.keys(resolvedTools).filter(\n        (name) => name !== \"handoff_to_agent\" && name !== \"updateWorkingMemory\",\n      );\n\n      if (toolNames.length > 0) {\n        capabilities.push(\"Available tools:\");\n        for (const toolName of toolNames) {\n          const tool = resolvedTools[toolName];\n          // @ts-expect-error - accessing internal tool properties\n          const description = tool?.spec?.description || toolName;\n          capabilities.push(`- ${toolName}: ${description}`);\n        }\n      }\n    }\n\n    // Add handoff agents\n    const handoffs = this.getHandoffs();\n    if (handoffs.length > 0) {\n      if (capabilities.length > 0) capabilities.push(\"\");\n      capabilities.push(\"Can route to specialist agents:\");\n      for (const agent of handoffs) {\n        // @ts-expect-error - accessing internal agent properties\n        const description = agent.handoffDescription || `${agent.name} agent`;\n        capabilities.push(`- ${agent.name}: ${description}`);\n      }\n    }\n\n    return capabilities.join(\"\\n\");\n  }\n\n  /**\n   * Generate contextual prompt suggestions after agent response\n   */\n  private async generateSuggestions(\n    conversationContext: string,\n    conversationMessages: ModelMessage[],\n    writer: UIMessageStreamWriter,\n    context?: TContext,\n  ): Promise<void> {\n    const config = this.memory?.chats?.generateSuggestions;\n    if (!config) return;\n\n    // Handle boolean true (use defaults) or object config with enabled check\n    let enabled: boolean;\n    if (typeof config === \"boolean\") {\n      enabled = config;\n    } else if (typeof config.enabled === \"function\") {\n      // Call the function with messages and context\n      enabled = await config.enabled({\n        messages: conversationMessages,\n        context,\n      });\n    } else {\n      enabled = config.enabled;\n    }\n\n    if (!enabled) return;\n\n    const model =\n      typeof config === \"object\" && config.model ? config.model : this.model;\n    const limit = typeof config === \"object\" && config.limit ? config.limit : 5;\n\n    // Build default instructions with actual capabilities\n    const defaultInstructions = `Generate ${limit} contextual follow-up suggestions based on what was JUST discussed.\n\n${this.buildCapabilitiesDescription(context)}\n\nGuidelines:\n1. Analyze what the assistant just showed/discussed (data, analysis, insights)\n2. Suggest logical NEXT STEPS that build on this specific response\n3. Keep suggestions ultra-brief (2-3 words ideal, max 5 words)\n4. Use action verbs (\"Show\", \"Compare\", \"Analyze\", \"Check\", \"List\", \"Explore\")\n5. Make suggestions specific to the context, not generic\n6. Focus on available capabilities that provide value\n\nGood suggestions are:\n- Specific to what was just discussed\n- Actionable using available capabilities\n- Brief and clear (2-3 words)\n- Natural next steps, not repetitive`;\n\n    const instructions =\n      typeof config === \"object\" && config.instructions\n        ? config.instructions\n        : defaultInstructions;\n\n    try {\n      // Define schema for structured output\n      const suggestionsSchema = z.object({\n        prompts: z\n          .array(z.string().max(40))\n          .min(3)\n          .max(limit)\n          .describe(`Array of prompt suggestions (2-5 words each)`),\n      });\n\n      // Generate suggestions using structured output\n      const { object } = await generateObject({\n        model,\n        system: instructions,\n        prompt: conversationContext,\n        schema: suggestionsSchema,\n        mode: \"json\",\n      });\n\n      const { prompts } = object;\n\n      // Stream suggestions as transient data part\n      writeSuggestions(writer, prompts);\n    } catch (err) {\n      logger.error(\"Suggestion generation failed\", { error: err });\n    }\n  }\n\n  /**\n   * Create the updateWorkingMemory tool\n   */\n  private createWorkingMemoryTool() {\n    const scope = this.memory?.workingMemory?.scope || \"chat\";\n    const memory = this.memory;\n    const extractMemoryIdentifiers = this.extractMemoryIdentifiers.bind(this);\n\n    return tool({\n      description: `Save user information to persistent memory for future conversations.`,\n      inputSchema: z.object({\n        content: z\n          .string()\n          .describe(\n            \"Updated working memory content in markdown format. Include user preferences and any important facts to remember.\",\n          ),\n      }),\n      execute: async ({ content }, options) => {\n        logger.debug(\"updateWorkingMemory tool called\", {\n          contentLength: content.length,\n        });\n\n        if (!memory?.provider) {\n          logger.warn(\"Memory provider not configured\");\n          return \"Memory system not configured\";\n        }\n\n        const { getContext } = await import(\"./context.js\");\n        const ctx = getContext(\n          options as { experimental_context?: Record<string, unknown> },\n        );\n        const contextData = ctx as TContext | undefined;\n\n        if (!contextData) {\n          logger.warn(\"Context not available for working memory update\");\n          return \"Context not available\";\n        }\n\n        const { chatId, userId } = extractMemoryIdentifiers(contextData);\n        logger.debug(\"Updating working memory\", { chatId, userId, scope });\n\n        try {\n          await memory.provider.updateWorkingMemory({\n            chatId,\n            userId,\n            scope,\n            content,\n          });\n          logger.debug(\"Working memory updated successfully\");\n          return \"success\";\n        } catch (error) {\n          logger.error(\"Failed to update working memory\", {\n            error: error instanceof Error ? error.message : error,\n          });\n          return \"error\";\n        }\n      },\n    });\n  }\n\n  /**\n   * Load working memory and inject into system prompt\n   */\n  private async loadWorkingMemory(context: TContext): Promise<string> {\n    if (!this.memory?.workingMemory?.enabled || !this.memory?.provider) {\n      return \"\";\n    }\n\n    const { chatId, userId } = this.extractMemoryIdentifiers(context);\n    const scope = this.memory.workingMemory.scope;\n\n    try {\n      const memory = await this.memory.provider.getWorkingMemory({\n        chatId,\n        userId,\n        scope,\n      });\n\n      if (!memory) return \"\";\n\n      return formatWorkingMemory(memory);\n    } catch (error) {\n      logger.error(\"Failed to load working memory\", {\n        error: error instanceof Error ? error.message : error,\n      });\n      return \"\";\n    }\n  }\n\n  /**\n   * Load message history from memory and prepend to the current message.\n   * Falls back to just the current message if history is disabled or unavailable.\n   *\n   * @param message - The current user message\n   * @param context - Execution context containing chatId\n   * @returns Array of ModelMessages including history + current message\n   */\n  private async loadMessagesWithHistory(\n    message: UIMessage,\n    context: TContext | undefined,\n  ): Promise<ModelMessage[]> {\n    // No memory - just convert the message\n    if (!this.memory?.history?.enabled || !context) {\n      logger.debug(\n        \"History disabled or no context - using single message only\",\n      );\n      return convertToModelMessages([message]);\n    }\n\n    const { chatId } = this.extractMemoryIdentifiers(context);\n\n    if (!chatId) {\n      logger.warn(\"Cannot load history: chatId missing from context\");\n      return convertToModelMessages([message]);\n    }\n\n    // Check if provider exists\n    if (!this.memory.provider) {\n      logger.warn(\"No memory provider configured - using single message only\");\n      return convertToModelMessages([message]);\n    }\n\n    try {\n      const previousMessages =\n        (await this.memory.provider.getMessages?.({\n          chatId,\n          limit: this.memory.history.limit,\n        })) || [];\n\n      logger.debug(`Loading history for chatId=${chatId}`, {\n        chatId,\n        count: previousMessages.length,\n      });\n\n      if (previousMessages.length === 0) {\n        logger.debug(\"No previous messages found - starting new conversation\");\n        return convertToModelMessages([message]);\n      }\n\n      const historyMessages = convertToModelMessages(\n        stripMetadata(previousMessages),\n      );\n\n      logger.debug(\n        `Loaded ${historyMessages.length} history messages for context`,\n        {\n          count: historyMessages.length,\n        },\n      );\n      return [...historyMessages, ...convertToModelMessages([message])];\n    } catch (err) {\n      logger.error(`Load history failed for chatId=${chatId}`, {\n        chatId,\n        error: err,\n      });\n      return convertToModelMessages([message]);\n    }\n  }\n\n  /**\n   * Save user and assistant messages, then update chat session.\n   * Messages are saved in parallel for better performance.\n   *\n   * @param chatId - The chat identifier\n   * @param userId - Optional user identifier\n   * @param userMessage - The user's message text\n   * @param assistantMessage - The assistant's response text\n   * @param existingChat - Pre-loaded chat object to avoid duplicate queries\n   */\n  private async saveConversation(\n    chatId: string,\n    userId: string | undefined,\n    userMessage: string,\n    assistantMessage: string,\n    existingChat?: any,\n  ): Promise<void> {\n    if (!this.memory?.provider || !this.memory?.history?.enabled) return;\n\n    logger.debug(`Saving conversation for chatId=${chatId}`, {\n      chatId,\n      userLength: userMessage.length,\n      assistantLength: assistantMessage.length,\n    });\n\n    // Save messages and update chat session in parallel for better performance\n    try {\n      const savePromises = [\n        this.memory.provider.saveMessage?.({\n          chatId,\n          userId,\n          role: \"user\",\n          content: userMessage,\n          timestamp: new Date(),\n        }),\n      ];\n\n      // Only save assistant message if it has content\n      if (assistantMessage && assistantMessage.length > 0) {\n        logger.debug(`Will save assistant message`, {\n          length: assistantMessage.length,\n        });\n        savePromises.push(\n          this.memory.provider.saveMessage?.({\n            chatId,\n            userId,\n            role: \"assistant\",\n            content: assistantMessage,\n            timestamp: new Date(),\n          }),\n        );\n      } else {\n        logger.warn(`Skipping assistant message save - empty or undefined`);\n      }\n\n      // Batch chat session update with message saves (using passed existingChat to avoid duplicate query)\n      if (this.memory?.chats?.enabled) {\n        const messageCount = savePromises.length;\n\n        savePromises.push(\n          this.memory.provider.saveChat?.({\n            ...(existingChat || { chatId, userId, createdAt: new Date() }),\n            messageCount: (existingChat?.messageCount || 0) + messageCount,\n            updatedAt: new Date(),\n          }),\n        );\n      }\n\n      await Promise.all(savePromises);\n\n      logger.debug(`Successfully saved ${savePromises.length} items`, {\n        chatId,\n        count: savePromises.length,\n      });\n    } catch (error) {\n      logger.error(`Failed to save messages for chatId=${chatId}`, {\n        chatId,\n        error,\n      });\n      throw error; // Re-throw to make save failures visible\n    }\n  }\n\n  /**\n   * Generate a chat title if this is the first message.\n   * Runs asynchronously without blocking the response.\n   *\n   * @param context - Execution context containing chatId\n   * @param userMessage - The user's message to generate title from\n   * @param writer - Stream writer for sending title update\n   * @param existingChat - Pre-loaded chat object to avoid duplicate queries\n   */\n  private async maybeGenerateChatTitle(\n    context: TContext | undefined,\n    userMessage: string,\n    writer: UIMessageStreamWriter,\n    existingChat?: any,\n  ): Promise<void> {\n    if (\n      !this.memory?.chats?.enabled ||\n      !this.memory?.chats?.generateTitle ||\n      !context\n    ) {\n      return;\n    }\n\n    const { chatId } = this.extractMemoryIdentifiers(context);\n\n    if (!chatId) {\n      logger.warn(\"Cannot generate title: chatId missing from context\");\n      return;\n    }\n\n    // Only generate for first message (using passed existingChat to avoid duplicate query)\n    const isFirstMessage = !existingChat || existingChat.messageCount === 0;\n    if (isFirstMessage) {\n      this.generateChatTitle(chatId, userMessage, writer, context).catch(\n        (err) => logger.error(\"Title generation error\", { error: err }),\n      );\n    }\n  }\n\n  static create<\n    TContext extends Record<string, unknown> = Record<string, unknown>,\n  >(config: AgentConfig<TContext>): Agent<TContext> {\n    return new Agent<TContext>(config);\n  }\n}\n","import { tool } from \"ai\";\nimport { z } from \"zod\";\nimport type { \n  Agent, \n  HandoffInstruction, \n  HandoffConfig, \n  ConfiguredHandoff,\n} from \"./types.js\";\n\n/**\n * Creates a handoff instruction for transferring to another agent\n */\nexport function createHandoff(\n  targetAgent: Agent | string,\n  context?: string,\n  reason?: string,\n): HandoffInstruction {\n  const targetName =\n    typeof targetAgent === \"string\" ? targetAgent : targetAgent.name;\n\n  return {\n    targetAgent: targetName,\n    context,\n    reason,\n  };\n}\n\n/**\n * Creates a configured handoff from an agent\n */\nexport function handoff<TContext extends Record<string, unknown> = Record<string, unknown>>(\n  agent: Agent<TContext>,\n  config?: HandoffConfig<TContext>\n): ConfiguredHandoff<TContext> {\n  return {\n    agent,\n    config,\n  };\n}\n\n/**\n * Generates the message that will be given as tool output to the model that requested the handoff\n */\nexport function getTransferMessage<TContext extends Record<string, unknown>>(agent: Agent<TContext>): string {\n  return JSON.stringify({ assistant: agent.name });\n}\n\n/**\n * Handoff tool that agents can use to transfer to other agents\n * Updated to work with ConfiguredHandoff\n */\nexport function createHandoffTool(availableHandoffs: Array<Agent | ConfiguredHandoff>) {\n  const agentNames = availableHandoffs.map((h) => \n    'agent' in h ? h.agent.name : h.name\n  );\n\n  return tool({\n    description: `Transfer the conversation to another specialized agent.\n    \nAvailable agents: ${agentNames.join(', ')}`,\n    inputSchema: z.object({\n      targetAgent: z.enum(agentNames as [string, ...string[]]),\n      context: z\n        .string()\n        .optional()\n        .describe(\"Context or summary to pass to the target agent\"),\n      reason: z.string().optional().describe(\"Reason for the handoff\"),\n    }),\n    execute: async ({ targetAgent, context, reason }) => {\n      // This will be handled by the runner\n      return createHandoff(targetAgent, context, reason);\n    },\n  });\n}\n\n/**\n * The standard name for the handoff tool\n */\nexport const HANDOFF_TOOL_NAME = \"handoff_to_agent\";\n\n/**\n * Checks if a tool name is the handoff tool\n */\nexport function isHandoffTool(toolName: string | undefined): boolean {\n  return toolName === HANDOFF_TOOL_NAME;\n}\n\n/**\n * Checks if a result contains a handoff instruction\n */\nexport function isHandoffResult(result: unknown): result is HandoffInstruction {\n  return (\n    typeof result === \"object\" &&\n    result !== null &&\n    \"targetAgent\" in result &&\n    typeof (result as HandoffInstruction).targetAgent === \"string\"\n  );\n}\n","/**\n * A recommended prompt prefix for agents that use handoffs. We recommend including this or\n * similar instructions in any agents that use handoffs.\n */\nexport const RECOMMENDED_PROMPT_PREFIX = `<system_context>\nYou are part of a multi-agent system called AI SDK Agents, designed to make agent coordination and execution easy. This system uses two primary abstractions: **Agents** and **Handoffs**. An agent encompasses instructions and tools and can hand off a conversation to another agent when appropriate. Handoffs are achieved by calling a handoff function, generally named \\`handoff_to_agent\\`. Transfers between agents are handled seamlessly in the background; do not mention or draw attention to these transfers in your conversation with the user.\n</system_context>\n\n<tool_calling_guidelines>\nWhen you need to call multiple tools, call them ALL at once using parallel tool calling.\n</tool_calling_guidelines>`;\n\n/**\n * Add recommended instructions to the prompt for agents that use handoffs.\n *\n * @param prompt - The original prompt string.\n * @returns The prompt prefixed with recommended handoff instructions.\n */\nexport function promptWithHandoffInstructions(prompt: string): string {\n  return `${RECOMMENDED_PROMPT_PREFIX}\\n\\n${prompt}`;\n}\n","/**\n * AgentRunContext\n * \n * Tracks user context and metadata throughout agent workflows.\n */\n\nexport class AgentRunContext<TContext = Record<string, unknown>> {\n  /**\n   * The context object passed to the agent workflow\n   */\n  public context: TContext;\n\n  /**\n   * Additional metadata for the run\n   */\n  public metadata: Record<string, unknown>;\n\n  constructor(context?: TContext) {\n    this.context = (context || {}) as TContext;\n    this.metadata = {};\n  }\n\n  /**\n   * Serialize the run context to JSON\n   */\n  toJSON(): {\n    context: TContext;\n    metadata: Record<string, unknown>;\n  } {\n    return {\n      context: this.context,\n      metadata: this.metadata,\n    };\n  }\n}\n","/**\n * Type-safe streaming utilities for agent orchestration\n *\n * This module provides helper functions for writing custom data parts\n * to the UI message stream following the AI SDK's streaming data pattern.\n */\n\nimport type { UIMessageStreamWriter } from \"ai\";\nimport type { AgentDataParts } from \"./types.js\";\n\n/**\n * Write a typed data part to the stream.\n *\n * This helper provides type-safe access to agent data parts while handling\n * the necessary type assertions for AI SDK's internal types.\n *\n * @template K - Key of the data part type\n * @param writer - The UI message stream writer\n * @param type - The data part type (e.g., 'data-agent-status')\n * @param data - The data payload\n * @param options - Additional options (transient, id for reconciliation)\n *\n * @example\n * ```typescript\n * writeDataPart(writer, 'data-agent-status', {\n *   status: 'executing',\n *   agent: 'analytics'\n * }, { transient: true });\n * ```\n */\nexport function writeDataPart<K extends keyof AgentDataParts>(\n  writer: UIMessageStreamWriter,\n  type: `data-${K}`,\n  data: AgentDataParts[K],\n  options?: { transient?: boolean; id?: string },\n): void {\n  writer.write({\n    type,\n    data,\n    ...options,\n  } as never);\n}\n\n/**\n * Write a transient agent status update.\n *\n * Status updates are ephemeral and won't be added to message history.\n * They're only available via the onData callback in useChat.\n *\n * @param writer - The UI message stream writer\n * @param status - The status update data\n *\n * @example\n * ```typescript\n * writeAgentStatus(writer, {\n *   status: 'routing',\n *   agent: 'orchestrator'\n * });\n * ```\n */\nexport function writeAgentStatus(\n  writer: UIMessageStreamWriter,\n  status: AgentDataParts[\"agent-status\"],\n): void {\n  writeDataPart(writer, \"data-agent-status\", status, { transient: true });\n}\n\n/**\n * Write a transient rate limit update.\n *\n * Rate limit updates are ephemeral and won't be added to message history.\n * They're only available via the onData callback in useChat.\n *\n * @param writer - The UI message stream writer\n * @param rateLimit - The rate limit data\n *\n * @example\n * ```typescript\n * writeRateLimit(writer, {\n *   limit: 100,\n *   remaining: 95,\n *   reset: '2024-01-01T00:00:00Z'\n * });\n * ```\n */\nexport function writeRateLimit(\n  writer: UIMessageStreamWriter,\n  rateLimit: AgentDataParts[\"rate-limit\"],\n): void {\n  writeDataPart(writer, \"data-rate-limit\", rateLimit, { transient: true });\n}\n\n/**\n * Write transient suggested prompts.\n *\n * Suggested prompts are ephemeral and won't be added to message history.\n * They're only available via the onData callback in useChat.\n *\n * @param writer - The UI message stream writer\n * @param prompts - Array of suggested prompt strings\n *\n * @example\n * ```typescript\n * writeSuggestions(writer, [\n *   'Show me the balance sheet',\n *   'What is our burn rate?',\n *   'Analyze revenue trends'\n * ]);\n * ```\n */\nexport function writeSuggestions(\n  writer: UIMessageStreamWriter,\n  prompts: string[],\n): void {\n  writeDataPart(writer, \"data-suggestions\", { prompts }, { transient: true });\n}\n","/**\n * Tool Result Extractor\n * \n * Extracts tool results from conversation messages to pass to handoff agents\n */\n\nimport type { ModelMessage } from \"ai\";\nimport type { HandoffInputData } from \"./types.js\";\nimport { createLogger } from \"@ai-sdk-tools/debug\";\n\nconst logger = createLogger('TOOL_EXTRACTOR');\n\n/**\n * Extract tool results from conversation messages\n */\nexport function extractToolResults(messages: ModelMessage[]): Record<string, any> {\n  const toolResults: Record<string, any> = {};\n  \n  logger.debug(`Analyzing ${messages.length} messages for tool results`, { count: messages.length });\n  \n  for (let i = 0; i < messages.length; i++) {\n    const message = messages[i];\n    logger.debug(`Message ${i}`, { role: message.role, contentType: typeof message.content });\n    \n    if (message.role === \"assistant\" && message.content) {\n      // Look for tool calls in assistant messages\n      if (Array.isArray(message.content)) {\n        logger.debug(`Assistant message has ${message.content.length} content items`, { count: message.content.length });\n        for (const content of message.content) {\n          logger.debug(`Content item type: ${content.type}`, { type: content.type });\n          if (content.type === \"tool-result\") {\n            const toolName = content.toolName;\n            const result = (content as any).result || (content as any).output;\n            logger.debug(`Found tool result: ${toolName}`, { toolName });\n            if (toolName && result) {\n              toolResults[toolName] = result;\n            }\n          }\n        }\n      }\n    }\n    \n    // Also check for tool results in the message itself\n    if (message.role === \"tool\" && message.content) {\n      // Tool messages contain the result directly\n      const toolName = (message as any).toolName;\n      logger.debug(`Tool message: ${toolName}`, { toolName });\n      if (toolName && message.content) {\n        try {\n          const result = typeof message.content === 'string' \n            ? JSON.parse(message.content) \n            : message.content;\n          toolResults[toolName] = result;\n        } catch (e) {\n          // If not JSON, store as string\n          toolResults[toolName] = message.content;\n        }\n      }\n    }\n  }\n  \n  logger.debug(\"Final tool results\", { tools: Object.keys(toolResults) });\n  return toolResults;\n}\n\n/**\n * Create a default input filter that modifies conversation history to include tool results\n * \n * @internal This is automatically applied during handoffs. You typically don't need to use this directly.\n * Simply use `handoff(agent)` without specifying an inputFilter.\n */\nexport function createDefaultInputFilter(): (input: HandoffInputData) => HandoffInputData {\n  return (input: HandoffInputData) => {\n    logger.debug(`Processing input history with ${input.inputHistory.length} messages`, { \n      historyCount: input.inputHistory.length \n    });\n    logger.debug(`Processing newItems with ${input.newItems.length} items`, { \n      newItemsCount: input.newItems.length \n    });\n    \n    // Extract tool results from newItems\n    const toolResults: Record<string, any> = {};\n    \n    // Process newItems to extract tool results\n    for (const item of input.newItems) {\n      logger.debug(`Processing newItem: ${typeof item}`, { itemType: typeof item });\n      \n      // Check if item has tool results\n      if (item && typeof item === 'object') {\n        // Look for tool result properties\n        if ('toolName' in item && 'result' in item) {\n          const toolName = (item as any).toolName;\n          const result = (item as any).result;\n          if (toolName && result) {\n            toolResults[toolName] = result;\n            logger.debug(`Found tool result in newItems: ${toolName}`, { toolName });\n          }\n        }\n        \n        // Also check for nested tool results\n        if ('content' in item && Array.isArray((item as any).content)) {\n          const content = (item as any).content;\n          for (const contentItem of content) {\n            if (contentItem.type === 'tool-result' && contentItem.toolName && contentItem.result) {\n              toolResults[contentItem.toolName] = contentItem.result;\n              logger.debug(`Found nested tool result: ${contentItem.toolName}`, { toolName: contentItem.toolName });\n            }\n          }\n        }\n      }\n    }\n    \n    logger.debug(\"Extracted tool results from newItems\", { tools: Object.keys(toolResults) });\n    \n    // Create a summary message with the available data\n    if (Object.keys(toolResults).length > 0) {\n      const dataSummary = Object.entries(toolResults)\n        .map(([key, value]) => {\n          // Generic data summary based on value type\n          if (Array.isArray(value)) {\n            return `Available ${key} data: ${value.length} items found`;\n          }\n          if (typeof value === 'object' && value !== null) {\n            return `Available ${key} data: ${JSON.stringify(value)}`;\n          }\n          return `Available ${key} data: ${value}`;\n        })\n        .join('\\n');\n      \n      // Add a system message with the available data\n      const dataMessage: ModelMessage = {\n        role: 'system',\n        content: `Available data from previous agent:\\n${dataSummary}\\n\\n**IMPORTANT**: Only use this data if it's DIRECTLY relevant to the current user question. If the user is asking about something different, ignore this data and call the appropriate tools.`\n      };\n      \n      // Ensure we keep the original conversation and add the data message\n      const enhancedHistory = [...input.inputHistory];\n      if (enhancedHistory.length === 0) {\n        // If no history, add a user message to maintain context\n        enhancedHistory.push({\n          role: 'user',\n          content: 'Please help with the request using the available data.'\n        });\n      }\n      enhancedHistory.push(dataMessage);\n      \n      return {\n        ...input,\n        inputHistory: enhancedHistory,\n      };\n    }\n    \n    return input;\n  };\n}\n\n/**\n * Create an input filter that only passes recent tool results\n */\nexport function createRecentDataFilter(maxAge: number = 5): (input: HandoffInputData) => HandoffInputData {\n  return (input: HandoffInputData) => {\n    // Only look at recent messages (last maxAge messages)\n    const recentMessages = input.inputHistory.slice(-maxAge);\n    const toolResults = extractToolResults(recentMessages);\n    \n    return {\n      ...input,\n      availableData: toolResults,\n    };\n  };\n}\n","import { isToolUIPart, type ModelMessage, type UIMessage } from \"ai\";\n\n/**\n * Extract text content from a ModelMessage.\n * Handles both string content and content arrays with text parts.\n *\n * @param message - The message to extract text from\n * @returns The extracted text content, or an empty string if none found\n *\n * @example\n * ```ts\n * const text = extractTextFromMessage(message);\n * // \"Hello world\"\n * ```\n */\nexport function extractTextFromMessage(\n  message: ModelMessage | undefined,\n): string {\n  if (!message?.content) return \"\";\n\n  const { content } = message;\n\n  // String content\n  if (typeof content === \"string\") return content;\n\n  // Array of parts - extract all text parts and join them\n  if (Array.isArray(content)) {\n    return content\n      .filter(\n        (part): part is { type: \"text\"; text: string } =>\n          typeof part === \"object\" && part !== null && part.type === \"text\",\n      )\n      .map((part) => part.text)\n      .join(\"\");\n  }\n\n  return \"\";\n}\n\n/**\n * Strip metadata from UI messages to prevent duplicate ID errors.\n * Provider metadata (like OpenAI item IDs) should not be reused across API calls.\n */\nexport function stripMetadata(messages: UIMessage[]): UIMessage[] {\n  return messages.map((msg) => ({\n    ...msg,\n    parts: msg.parts?.map((part) => {\n      const sanitizedPart: typeof part = { ...part };\n\n      if (\"providerMetadata\" in sanitizedPart) {\n        sanitizedPart.providerMetadata = undefined;\n      }\n\n      if (\n        isToolUIPart(sanitizedPart) &&\n        \"callProviderMetadata\" in sanitizedPart\n      ) {\n        sanitizedPart.callProviderMetadata = undefined;\n      }\n\n      return sanitizedPart;\n    }),\n  }));\n}\n","import type { InputGuardrail, OutputGuardrail } from \"./types.js\";\n\n/**\n * Base error class for all agent errors\n */\nexport class AgentsError extends Error {\n  constructor(\n    message: string,\n    public readonly state?: unknown,\n  ) {\n    super(message);\n    this.name = \"AgentsError\";\n  }\n}\n\n/**\n * Error thrown when input guardrail tripwire is triggered\n */\nexport class InputGuardrailTripwireTriggered extends AgentsError {\n  constructor(\n    public readonly guardrailName: string,\n    public readonly outputInfo?: unknown,\n    state?: unknown,\n  ) {\n    super(`Input guardrail tripwire triggered: ${guardrailName}`, state);\n    this.name = \"InputGuardrailTripwireTriggered\";\n  }\n}\n\n/**\n * Error thrown when output guardrail tripwire is triggered\n */\nexport class OutputGuardrailTripwireTriggered extends AgentsError {\n  constructor(\n    public readonly guardrailName: string,\n    public readonly outputInfo?: unknown,\n    state?: unknown,\n  ) {\n    super(`Output guardrail tripwire triggered: ${guardrailName}`, state);\n    this.name = \"OutputGuardrailTripwireTriggered\";\n  }\n}\n\n/**\n * Error thrown when a guardrail fails to execute\n */\nexport class GuardrailExecutionError extends AgentsError {\n  constructor(\n    public readonly guardrailName: string,\n    public readonly originalError: Error,\n    state?: unknown,\n  ) {\n    super(\n      `Guardrail execution failed: ${guardrailName} - ${originalError.message}`,\n      state,\n    );\n    this.name = \"GuardrailExecutionError\";\n  }\n}\n\n/**\n * Error thrown when maximum turns are exceeded\n */\nexport class MaxTurnsExceededError extends AgentsError {\n  constructor(\n    public readonly currentTurns: number,\n    public readonly maxTurns: number,\n    state?: unknown,\n  ) {\n    super(`Maximum turns exceeded: ${currentTurns}/${maxTurns}`, state);\n    this.name = \"MaxTurnsExceededError\";\n  }\n}\n\n/**\n * Error thrown when a tool call fails\n */\nexport class ToolCallError extends AgentsError {\n  constructor(\n    public readonly toolName: string,\n    public readonly originalError: Error,\n    state?: unknown,\n  ) {\n    super(`Tool call failed: ${toolName} - ${originalError.message}`, state);\n    this.name = \"ToolCallError\";\n  }\n}\n\n/**\n * Error thrown for tool permission denial\n */\nexport class ToolPermissionDeniedError extends AgentsError {\n  constructor(\n    public readonly toolName: string,\n    public readonly reason: string,\n    state?: unknown,\n  ) {\n    super(`Tool permission denied: ${toolName} - ${reason}`, state);\n    this.name = \"ToolPermissionDeniedError\";\n  }\n}\n\n/**\n * Run input guardrails in parallel\n */\nexport async function runInputGuardrails(\n  guardrails: InputGuardrail[],\n  input: string,\n  context?: unknown,\n): Promise<void> {\n  if (!guardrails || guardrails.length === 0) return;\n\n  const results = await Promise.allSettled(\n    guardrails.map(async (guardrail) => {\n      try {\n        const result = await guardrail.execute({ input, context });\n        if (result.tripwireTriggered) {\n          throw new InputGuardrailTripwireTriggered(\n            guardrail.name,\n            result.outputInfo,\n          );\n        }\n        return result;\n      } catch (error) {\n        if (error instanceof InputGuardrailTripwireTriggered) {\n          throw error;\n        }\n        throw new GuardrailExecutionError(\n          guardrail.name,\n          error instanceof Error ? error : new Error(String(error)),\n        );\n      }\n    }),\n  );\n\n  // Check for failures\n  for (const result of results) {\n    if (result.status === \"rejected\") {\n      throw result.reason;\n    }\n  }\n}\n\n/**\n * Run output guardrails in parallel\n */\nexport async function runOutputGuardrails<TOutput = unknown>(\n  guardrails: OutputGuardrail<TOutput>[],\n  agentOutput: TOutput,\n  context?: unknown,\n): Promise<void> {\n  if (!guardrails || guardrails.length === 0) return;\n\n  const results = await Promise.allSettled(\n    guardrails.map(async (guardrail) => {\n      try {\n        const result = await guardrail.execute({ agentOutput, context });\n        if (result.tripwireTriggered) {\n          throw new OutputGuardrailTripwireTriggered(\n            guardrail.name,\n            result.outputInfo,\n          );\n        }\n        return result;\n      } catch (error) {\n        if (error instanceof OutputGuardrailTripwireTriggered) {\n          throw error;\n        }\n        throw new GuardrailExecutionError(\n          guardrail.name,\n          error instanceof Error ? error : new Error(String(error)),\n        );\n      }\n    }),\n  );\n\n  // Check for failures\n  for (const result of results) {\n    if (result.status === \"rejected\") {\n      throw result.reason;\n    }\n  }\n}\n","/**\n * Tool Permissions System\n *\n * Runtime access control for tool execution\n */\n\nimport { ToolPermissionDeniedError } from \"./guardrails.js\";\nimport type { ToolPermissionContext, ToolPermissions } from \"./types.js\";\n\n/**\n * Check if a tool can be executed based on permissions\n */\nexport async function checkToolPermission(\n  permissions: ToolPermissions | undefined,\n  toolName: string,\n  args: unknown,\n  context: ToolPermissionContext,\n): Promise<void> {\n  if (!permissions) return;\n\n  try {\n    const result = await permissions.check({ toolName, args, context });\n\n    if (!result.allowed) {\n      throw new ToolPermissionDeniedError(\n        toolName,\n        result.reason || \"Permission denied\",\n      );\n    }\n  } catch (error) {\n    if (error instanceof ToolPermissionDeniedError) {\n      throw error;\n    }\n    // Re-throw other errors as-is\n    throw error;\n  }\n}\n\n/**\n * Create a tool usage tracker for permission context\n */\nexport function createUsageTracker(): ToolPermissionContext[\"usage\"] {\n  return {\n    toolCalls: {},\n    tokens: 0,\n  };\n}\n\n/**\n * Update usage tracker with tool call\n */\nexport function trackToolCall(\n  usage: ToolPermissionContext[\"usage\"],\n  toolName: string,\n): void {\n  usage.toolCalls[toolName] = (usage.toolCalls[toolName] || 0) + 1;\n}\n","/**\n * Programmatic Routing System\n *\n * Matches user messages to agents based on keywords, patterns, or custom functions\n */\n\nimport type { Agent } from \"./types.js\";\nimport { createLogger } from \"@ai-sdk-tools/debug\";\n\nconst logger = createLogger('ROUTING');\n\n/**\n * Normalize text for better matching\n * - Lowercase\n * - Remove numbers\n * - Remove extra whitespace\n * - Simple plural → singular\n */\nfunction normalizeText(text: string): string {\n  return text\n    .toLowerCase()\n    .trim()\n    .replace(/\\d+/g, \"\") // remove numbers\n    .replace(/\\s+/g, \" \") // normalize whitespace\n    .trim();\n}\n\n/**\n * Match a message against an agent's matchOn patterns\n */\nexport function matchAgent(\n  agent: Agent,\n  message: string,\n  matchOn?: (string | RegExp)[] | ((message: string) => boolean),\n): { matched: boolean; score: number } {\n  if (!matchOn) {\n    return { matched: false, score: 0 };\n  }\n\n  const normalizedMessage = normalizeText(message);\n  let score = 0;\n\n  // Function-based matching\n  if (typeof matchOn === \"function\") {\n    try {\n      const result = matchOn(message);\n      return { matched: result, score: result ? 10 : 0 };\n    } catch (error) {\n      logger.error(`Error in matchOn function for ${agent.name}`, { \n        agent: agent.name, \n        error \n      });\n      return { matched: false, score: 0 };\n    }\n  }\n\n  // Array-based matching (strings and regex)\n  for (const pattern of matchOn) {\n    if (typeof pattern === \"string\") {\n      // String keyword matching\n      const normalizedPattern = normalizeText(pattern);\n      if (normalizedMessage.includes(normalizedPattern)) {\n        // Weight longer keywords higher (more specific)\n        const weight = normalizedPattern.split(\" \").length;\n        score += weight;\n      }\n    } else if (pattern instanceof RegExp) {\n      // Regex pattern matching\n      if (pattern.test(normalizedMessage)) {\n        score += 2; // Regex matches get higher weight\n      }\n    }\n  }\n\n  return { matched: score > 0, score };\n}\n\n/**\n * Find the best matching agent from a list of agents\n */\nexport function findBestMatch(\n  agents: Agent[],\n  message: string,\n  getMatchOn?: (\n    agent: Agent,\n  ) => (string | RegExp)[] | ((message: string) => boolean) | undefined,\n): Agent | null {\n  const scores: Array<{ agent: Agent; score: number }> = [];\n\n  for (const agent of agents) {\n    const matchOn = getMatchOn ? getMatchOn(agent) : undefined;\n    const { matched, score } = matchAgent(agent, message, matchOn);\n\n    if (matched && score > 0) {\n      scores.push({ agent, score });\n    }\n  }\n\n  // No matches found\n  if (scores.length === 0) {\n    return null;\n  }\n\n  // Sort by score (highest first)\n  scores.sort((a, b) => b.score - a.score);\n\n  // Return agent with highest score\n  return scores[0].agent;\n}\n"],"mappings":"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","names":["import_ai","import_zod","import_ai","logger","AISDKAgent","result","tool","getContext","logger"]}