{"version":3,"sources":["../src/index.ts","../src/services/agent-flow.service.ts","../src/factories/agent-config.schemas.ts","../src/types/agent.types.ts","../src/types/agent-flow.types.ts","../src/types/llm.types.ts","../src/types/tool.types.ts","../src/types/progress.types.ts","../src/types/voice.types.ts","../src/services/LangfuseService/langfuse.service.ts","../src/services/base.llm.service.ts","../src/agents/BaseAgent.ts","../src/services/tool-executor.service.ts","../src/services/mcp-client.service.ts","../src/factories/configurable-agent.factory.ts","../src/factories/configurable-agent.factory.types.ts","../src/utils.ts","../src/services/conversation-history.service.ts","../src/services/conversation-context.service.ts","../src/services/conversation-manager.service.ts","../src/services/conversation-loop.service.ts","../src/services/base.voice.service.ts","../src/services/ElevenLabsService/elevenlabs.voice.service.ts","../src/prompts/current-date.ts","../src/services/memory/stm.service.ts","../src/services/memory/mtm.service.ts","../src/beta_tools/memory.tools.ts","../src/tools/calculator.tool.ts","../src/tools/current-time.tool.ts","../src/tools/read-url.tool.ts","../src/tools/random-number.tool.ts","../src/tools/string-utils.tool.ts","../src/tools/json-formatter.tool.ts","../src/tools/system-info.tool.ts","../src/tools/delay.tool.ts","../src/tools/hash.tool.ts","../src/tools/data-converter.tool.ts","../src/tools/create-image.tool.ts","../src/tools/services/openai-image.service.ts","../src/tools/get-tool.ts"],"sourcesContent":["/**\n * @grid/core - Core primitives for LLM orchestration and agentic workflows\n */\n\n// Export agent-flow service and types\nexport { agentFlowService } from \"./services/agent-flow.service.js\";\nexport { createConfigurableAgent } from \"./factories/configurable-agent.factory.js\";\nexport { createAgentConfig } from \"./factories/agent-config.schemas.js\";\nexport type { AgentConfig } from \"./factories/agent-config.schemas.js\";\nexport { createBaseAgent } from \"./agents/BaseAgent.js\";\nexport type { BaseAgent } from \"./agents/BaseAgent.js\";\nexport { transformMessagesForAI, getLastUserMessage } from \"./utils.js\";\nexport * from \"./types/index.js\";\nexport type { Agent } from \"./types/agent.types.js\";\n\n// Export tool types\nexport type { Tool, ToolResult } from \"./types/tool.types.js\";\nexport type { ToolCall } from \"./types/llm.types.js\";\nexport { createNamedTool } from \"./types/tool.types.js\";\nexport { createToolExecutor } from \"./services/tool-executor.service.js\";\nexport type { ToolExecutor } from \"./services/tool-executor.service.js\";\n\n// Export hook types\nexport type { CustomHandlers } from \"./factories/configurable-agent.factory.js\";\n\n// Export conversation primitives - atomic level\nexport { createConversationHistory } from \"./services/conversation-history.service.js\";\nexport type {\n  ConversationHistory,\n  ConversationHistoryOptions,\n  ConversationHistoryHandlers,\n} from \"./services/conversation-history.service.js\";\n\nexport { createConversationContext } from \"./services/conversation-context.service.js\";\nexport type {\n  ConversationContext,\n  ConversationContextOptions,\n  ConversationContextHandlers,\n} from \"./services/conversation-context.service.js\";\n\n// Export conversation primitives - composed level\nexport { createConversationManager } from \"./services/conversation-manager.service.js\";\nexport type {\n  ConversationManager,\n  ConversationManagerOptions,\n  ConversationManagerHandlers,\n  GroupedManagerHandlers,\n} from \"./services/conversation-manager.service.js\";\n\n// Export conversation primitives - organism level\nexport { createConversationLoop } from \"./services/conversation-loop.service.js\";\nexport type {\n  ConversationLoop,\n  ConversationLoopOptions,\n  GroupedHandlers,\n  SendMessageResult,\n  HistoryMode,\n} from \"./services/conversation-loop.service.js\";\n\nexport { baseLLMService } from \"./services/base.llm.service.js\";\nexport type { BaseLLMServiceConfig } from \"./services/base.llm.service.js\";\nexport type { LLMService } from \"./types/llm.types.js\";\n\nexport { baseVoiceService } from \"./services/base.voice.service.js\";\nexport type {\n  BaseVoiceServiceConfig,\n  VoiceServiceUtils,\n} from \"./services/base.voice.service.js\";\n\nexport { elevenlabsVoiceService } from \"./services/ElevenLabsService/elevenlabs.voice.service.js\";\nexport type { ElevenLabsVoiceServiceConfig } from \"./services/ElevenLabsService/elevenlabs.voice.service.js\";\n\nexport {\n  createLangfuseService,\n  langfuseService,\n  type LangfuseService,\n} from \"./services/LangfuseService/langfuse.service.js\";\n\n// Export MCP client service\nexport {\n  createMCPClientService,\n  type MCPServerConfig,\n  type MCPClientService,\n} from \"./services/mcp-client.service.js\";\n\n// Prompts and prompts helpers\nexport { currentDatePrompt } from \"./prompts/current-date.js\";\n\n// Export memory services\nexport { createSimpleSTMService } from \"./services/memory/stm.service.js\";\nexport { createMTMService } from \"./services/memory/mtm.service.js\";\nexport type {\n  STMService,\n  STMConfig,\n  MemoryEvent,\n  MTMService,\n  MTMConfig,\n  MTMSummary,\n} from \"./services/memory/memory.types.js\";\n\n// Export memory tools\nexport {\n  createMemoryTools,\n  getMemoryToolsArray,\n} from \"./beta_tools/memory.tools.js\";\n\nexport {\n  type GridTool,\n  calculatorTool,\n  createImageTool,\n  createReadUrlTool,\n  currentTimeTool,\n  dataConverterTool,\n  delayTool,\n  getTools,\n  hashTool,\n  jsonFormatterTool,\n  randomNumberTool,\n  readUrlTool,\n  stringUtilsTool,\n  systemInfoTool,\n} from \"./tools/index.js\";\n","import type { Agent } from \"../types/agent.types.js\";\nimport type { AgentFlowContext, ChatMessage } from \"../types/index.js\";\nimport type { ProgressMessage } from \"../types/progress.types.js\";\nimport type { ToolExecutor } from \"./tool-executor.service.js\";\nimport type { ToolResult } from \"../types/tool.types.js\";\n\nexport const agentFlowService = () => {\n  const testVariable = \"test\";\n  let sendFunction: ((data: ProgressMessage) => Promise<void>) | null = null;\n\n  const getTestVariable = () => {\n    return testVariable;\n  };\n  /**\n   * Set the global send function for streaming updates\n   */\n  const setSendFunction = (\n    sendFn: (data: ProgressMessage) => Promise<void>\n  ) => {\n    sendFunction = sendFn;\n  };\n\n  /**\n   * Send a progress update using the global send function and save to database\n   */\n  const sendUpdate = async (\n    data: ProgressMessage,\n    context?: AgentFlowContext\n  ): Promise<void> => {\n    if (sendFunction) {\n      await sendFunction(data);\n    }\n  };\n\n  /**\n   * Execute a single agent iteration (LLM call + response handling)\n   */\n  const executeAgentIteration = async ({\n    messages,\n    agent,\n    context,\n  }: {\n    messages: ChatMessage[];\n    agent: Agent;\n    context: AgentFlowContext;\n  }) => {\n    const response = await agent.act({\n      messages,\n      context,\n    });\n\n    await sendUpdate({\n      type: \"llm_response\",\n      content: response.content,\n    });\n\n    return response;\n  };\n\n  const executeAutonomousFlow = async ({\n    agent,\n    context,\n    toolExecutor,\n  }: {\n    agent: Agent;\n    context: AgentFlowContext;\n    toolExecutor?: ToolExecutor;\n  }): Promise<void> => {\n    // Use context max iterations or default\n    const maxIterations = context.maxIterations || 10;\n    let iterations = 0;\n    let shouldContinue = true;\n\n    // Initialize conversation history\n    const conversationHistory: ChatMessage[] = [];\n\n    // Initialize state\n    const flowState = context.state || {};\n\n    // Add initial user message\n    conversationHistory.push({\n      role: \"user\",\n      content: context.userMessage,\n    });\n\n    await sendUpdate({\n      type: \"notification\",\n      content: `Starting autonomous flow with max ${maxIterations} iterations`,\n      metadata: { maxIterations },\n    });\n\n    while (shouldContinue && iterations < maxIterations) {\n      iterations++;\n\n      await sendUpdate({\n        type: \"thinking\",\n        content: `Processing iteration ${iterations}/${maxIterations}`,\n        metadata: { iteration: iterations, state: flowState },\n      });\n\n      // Execute agent iteration with full context including state\n      const response = await executeAgentIteration({\n        messages: conversationHistory,\n        agent,\n        context: {\n          ...context,\n          state: flowState,\n        },\n      });\n\n      // Add assistant response to history\n      conversationHistory.push({\n        role: \"assistant\",\n        content: response.content,\n        toolCalls: response.toolCalls,\n      });\n\n      // Check if response has tool calls\n      if (response.toolCalls && response.toolCalls.length > 0) {\n        await sendUpdate({\n          type: \"notification\",\n          content: `Agent requested ${response.toolCalls.length} tool call(s)`,\n          metadata: { toolCalls: response.toolCalls },\n        });\n\n        // If continueOnToolCalls is false, stop here\n        if (!context.continueOnToolCalls) {\n          shouldContinue = false;\n          await sendUpdate({\n            type: \"finished\",\n            content: \"Stopping flow - tool calls require external handling\",\n            metadata: { toolCalls: response.toolCalls },\n          });\n          break;\n        }\n\n        // Execute tool calls if tool executor is provided\n        if (toolExecutor) {\n          try {\n            // Execute all tool calls (ensure args is always present)\n            const toolCallsWithArgs = response.toolCalls.map((tc) => ({\n              ...tc,\n              args: tc.args ?? {},\n            }));\n            const toolResponses = await toolExecutor.executeToolCalls(\n              toolCallsWithArgs,\n              {\n                agentId: agent.id,\n              }\n            );\n\n            // Add tool responses to conversation history\n            for (const toolResponse of toolResponses) {\n              // Convert ToolResult to ChatMessage format\n              conversationHistory.push({\n                role: \"tool\",\n                content: JSON.stringify(toolResponse.result),\n                tool_call_id: toolResponse.toolCallId,\n              });\n\n              await sendUpdate({\n                type: \"tool_execution\",\n                content: `Tool executed: ${toolResponse.toolName}`,\n                metadata: {\n                  toolCallId: toolResponse.toolCallId,\n                  result: toolResponse.result,\n                },\n              });\n            }\n          } catch (toolError) {\n            await sendUpdate({\n              type: \"error\",\n              content: `Tool execution failed: ${\n                toolError instanceof Error ? toolError.message : \"Unknown error\"\n              }`,\n              metadata: { toolCalls: response.toolCalls },\n            });\n\n            // Continue despite tool errors for now\n            // In future, we might want configurable behavior here\n          }\n        } else {\n          // No tool executor provided, just log the requests\n          for (const toolCall of response.toolCalls) {\n            await sendUpdate({\n              type: \"tool_execution\",\n              content: `Tool requested (not executed): ${toolCall.toolName}`,\n              metadata: { toolCall },\n            });\n          }\n        }\n      }\n\n      // Check response metadata for flow control\n      const responseMetadata = (response as any).metadata;\n      if (responseMetadata) {\n        // Check if task is complete\n        if (responseMetadata.taskComplete) {\n          shouldContinue = false;\n          await sendUpdate({\n            type: \"finished\",\n            content: \"Task completed successfully\",\n            metadata: {\n              iterations,\n              finalResponse: response.content,\n              state: flowState,\n            },\n          });\n        }\n\n        // Check if user input is needed\n        else if (responseMetadata.needsUserInput) {\n          shouldContinue = false;\n          await sendUpdate({\n            type: \"notification\",\n            content: \"Agent requires user input\",\n            metadata: {\n              question: response.content,\n              state: flowState,\n            },\n          });\n        }\n\n        // Update state if provided\n        if (responseMetadata.stateUpdate) {\n          Object.assign(flowState, responseMetadata.stateUpdate);\n          await sendUpdate({\n            type: \"notification\",\n            content: \"State updated\",\n            metadata: { state: flowState },\n          });\n        }\n      }\n\n      // Simple completion check - if no tool calls and no explicit continuation\n      if (!response.toolCalls || response.toolCalls.length === 0) {\n        // If the response doesn't indicate continuation, we might be done\n        if (!responseMetadata?.continueFlow) {\n          // For now, continue unless explicitly told to stop\n          // In future, we could add more sophisticated completion detection\n        }\n      }\n    }\n\n    // Check if we hit max iterations\n    if (iterations >= maxIterations && shouldContinue) {\n      await sendUpdate({\n        type: \"error\",\n        content: `Maximum iterations (${maxIterations}) reached`,\n        metadata: {\n          iterations,\n          state: flowState,\n        },\n      });\n    }\n\n    await sendUpdate({\n      type: \"finished\",\n      content: \"Autonomous flow completed\",\n      metadata: {\n        totalIterations: iterations,\n        maxIterations,\n        finalState: flowState,\n        conversationLength: conversationHistory.length,\n      },\n    });\n  };\n\n  return {\n    getTestVariable,\n    setSendFunction,\n    sendUpdate,\n    executeAutonomousFlow,\n  };\n};\n","import { z } from \"zod\";\nimport {\n  AgentTypeSchema,\n  AgentMetadataSchema,\n  VoiceConfigSchema,\n} from \"../types/agent.types.js\";\nimport type { Tool } from \"../types/tool.types.js\";\n\n// Tool source types\nexport const ToolSourceSchema = z.enum([\"local\", \"mcp\", \"agent\", \"external\"]);\n\n// Agent behavior configuration\nexport const AgentBehaviorSchema = z.object({\n  maxRetries: z.number().default(3),\n  responseFormat: z.enum([\"json\", \"text\", \"structured\"]).default(\"text\"),\n  validateResponse: z.boolean().default(false),\n  emitEvents: z.array(z.string()).optional(),\n  timeout: z.number().optional(), // milliseconds\n  model: z.string().optional(), // AI model to use (e.g., \"gpt-4.1\", \"claude-3-5-sonnet-20241022\")\n  provider: z.string().optional(), // LLM provider preference (e.g., \"openai\", \"anthropic\", \"openrouter\")\n});\n\n// Agent prompts configuration\nexport const AgentPromptsSchema = z.object({\n  system: z.string(),\n  systemCache: z.boolean().optional(), // Enable Anthropic prompt caching for system message\n  errorCorrection: z.string().optional(),\n  fallback: z.string().optional(),\n});\n\n// MCP Server configuration schema\nexport const MCPServerConfigSchema = z.object({\n  name: z.string(),\n  url: z.string(),\n  type: z.enum([\"http\", \"sse\"]).default(\"http\"),\n  authToken: z.string().optional(),\n  headers: z.record(z.string()).optional(),\n});\n\n// Tool configuration\nexport const AgentToolsSchema = z.object({\n  builtin: z.record(z.any()).default({}), // Names of built-in tools\n  custom: z.record(z.any()).default({}), // Custom tool instances\n  mcp: z.record(z.any()).default({}), // MCP server tool instances (populated at runtime)\n  mcpServers: z.array(MCPServerConfigSchema).optional().default([]), // MCP server configurations\n  agents: z.array(AgentTypeSchema).optional(), // Other agents as tools\n});\n\n// Hooks configuration for custom logic injection\nexport const AgentHooksSchema = z\n  .object({\n    beforeAct: z.boolean().default(false),\n    afterResponse: z.boolean().default(false),\n    onError: z.boolean().default(false),\n    validateResponse: z.boolean().default(false),\n    transformInput: z.boolean().default(false),\n    transformOutput: z.boolean().default(false),\n  })\n  .partial(); // Make all fields optional\n\n// Orchestration capabilities\nexport const AgentOrchestrationSchema = z\n  .object({\n    // Can this agent be called by other agents?\n    callable: z.boolean().default(true),\n\n    // Can this agent call other agents?\n    canDelegate: z.boolean().default(false),\n\n    // Which agents can this agent delegate to?\n    allowedDelegates: z.array(AgentTypeSchema).optional(),\n\n    // Resource constraints\n    maxParallelDelegations: z.number().default(3),\n    maxDelegationDepth: z.number().default(3),\n\n    // Delegation strategies\n    delegationStrategy: z\n      .enum([\n        \"best-match\", // Choose best agent based on capabilities\n        \"load-balance\", // Distribute among capable agents\n        \"specialist\", // Always use specialist agents\n        \"fallback\", // Try primary, fallback to secondary\n      ])\n      .optional(),\n\n    // Cost and resource management\n    costTier: z.enum([\"low\", \"medium\", \"high\"]).default(\"medium\"),\n    estimatedDuration: z.number().optional(), // milliseconds\n  })\n  .partial()\n  .refine((data: any) => data, { message: \"Invalid orchestration config\" });\n\n// Main agent configuration schema\nexport const AgentConfigSchema = z.object({\n  // Basic identification\n  id: z.string(),\n  type: z.string(), //\n  version: z.string().default(\"1.0.0\"),\n\n  // Metadata\n  metadata: AgentMetadataSchema,\n\n  // Prompts configuration\n  prompts: AgentPromptsSchema,\n\n  // Behavior configuration\n  behavior: AgentBehaviorSchema.default({}),\n\n  // Tools configuration\n  tools: AgentToolsSchema.default({ builtin: {} }),\n\n  // Hooks for custom logic\n  hooks: AgentHooksSchema.optional(),\n\n  // Orchestration capabilities\n  orchestration: AgentOrchestrationSchema.optional(),\n\n  // Observability configuration\n  // observability: ObservabilityConfigSchema.optional(), // Removed - using simple Langfuse integration\n\n  // Feature flags\n  features: z.record(z.boolean()).optional(),\n\n  // Voice configuration\n  voice: VoiceConfigSchema.optional(),\n\n  // Custom configuration (agent-specific)\n  customConfig: z.record(z.any()).optional(),\n});\n\n// Inferred types\nexport type ToolSource = z.infer<typeof ToolSourceSchema>;\nexport type AgentBehavior = z.infer<typeof AgentBehaviorSchema>;\nexport type AgentPrompts = z.infer<typeof AgentPromptsSchema>;\nexport type AgentTools = z.infer<typeof AgentToolsSchema>;\nexport type AgentHooks = z.infer<typeof AgentHooksSchema>;\nexport type AgentOrchestration = z.infer<typeof AgentOrchestrationSchema>;\nexport type AgentConfig = z.infer<typeof AgentConfigSchema>;\n\n// Validation helpers\nexport const validateAgentConfig = (data: unknown) => {\n  const result = AgentConfigSchema.safeParse(data);\n  if (!result.success) {\n    return { success: false, data: null, error: result.error };\n  }\n  return { success: true, data: result.data, error: null };\n};\n\n// Config builder helper for better DX\nexport const createAgentConfig = (config: AgentConfig): AgentConfig => {\n  const validation = validateAgentConfig(config);\n  if (!validation.success) {\n    throw new Error(\n      `Invalid agent configuration: ${JSON.stringify(validation.error)}`\n    );\n  }\n  return validation.data!;\n};\n","import z from \"zod\";\nimport { AgentFlowContextSchema, type ProgressMessage } from \"./index.js\";\nimport { ChatMessageSchema } from \"./llm.types.js\";\nimport type {\n  VoiceConfig,\n  VoiceService,\n  AudioResult,\n  TranscriptionResult,\n  VoiceOptions,\n  TranscribeOptions,\n} from \"./voice.types.js\";\n\nexport const AgentTypeSchema = z.string();\n\nexport const AgentCapabilitySchema = z.enum([\n  \"general\",\n  \"scribe\",\n  \"rephraser\",\n  \"figma-analyzer\",\n  \"test-openrouter\",\n  \"figma-to-storyblok\",\n  \"irf-architect\",\n  \"storyblok-editor\",\n  \"decision-maker\",\n  \"orchestrator\",\n  \"site-builder\",\n  \"web_search\",\n  \"image_generation\",\n  \"file_analysis\",\n  \"planning\",\n  \"memory_search\",\n  \"writing\",\n  \"summarizing\",\n  \"content_creation\",\n  \"text_refinement\",\n  \"text_rephrasing\",\n  \"clarity_improvement\",\n  \"design_analysis\",\n  \"figma_integration\",\n  \"ui_ux_feedback\",\n  \"storyblok_components\",\n  \"cms_management\",\n  \"content_structure\",\n  \"layout_design\",\n  \"architecture_planning\",\n  \"design_systems\",\n  \"storyblok_editing\",\n  \"irf_transformation\",\n  \"content_validation\",\n  \"openrouter_models\",\n  \"experimental_features\",\n  \"model_testing\",\n  \"design_to_code\",\n  \"component_generation\",\n  \"message_analysis\",\n  \"action_planning\",\n  \"memory_management\",\n  \"workflow_routing\",\n  \"task_analysis\",\n  \"agent_coordination\",\n  \"parallel_execution\",\n  \"pipeline_execution\",\n  \"result_synthesis\",\n]);\n\nexport const AgentMetadataSchema = z.object({\n  id: z.string(),\n  type: z.string(), //\n  name: z.string(),\n  description: z.string(),\n  capabilities: z.array(z.string()),\n  icon: z.string(),\n  version: z.string().optional(),\n  author: z.string().optional(),\n});\n\n// Voice config schema\nexport const VoiceConfigSchema = z.object({\n  enabled: z.boolean(),\n  voiceId: z.string().optional(),\n  defaultOptions: z.any().optional(), // Partial<VoiceOptions>\n  autoSpeak: z.boolean().optional(),\n  autoListen: z.boolean().optional(),\n  allowInterruption: z.boolean().optional(),\n  mixedModality: z\n    .object({\n      enabled: z.boolean(),\n      mergeStrategy: z.enum([\"temporal\", \"contextual\", \"append\"]),\n    })\n    .optional(),\n});\n\n// Base agent config schema\nexport const BaseAgentConfigSchema = z.object({\n  id: z.string(),\n  type: AgentTypeSchema,\n  availableTools: z.record(z.any()).optional(),\n  metadata: AgentMetadataSchema.partial().optional(),\n  voice: VoiceConfigSchema.optional(),\n});\n\nexport type BaseAgentConfig = z.infer<typeof BaseAgentConfigSchema>;\n\nexport type AgentType = z.infer<typeof AgentTypeSchema>;\n// Agent input schema\nexport const AgentInputSchema = z.object({\n  messages: z.array(ChatMessageSchema),\n  tools: z.record(z.any()).optional(), // Tools can be any structure\n  context: AgentFlowContextSchema.optional(), // Full AgentFlowContext with all data\n});\nexport type AgentInput = z.infer<typeof AgentInputSchema>;\nexport type AgentActInput = AgentInput; // Alias for compatibility\n// Agent response schema (this is just ChatMessage)\nexport const AgentResponseSchema = ChatMessageSchema;\nexport type AgentResponse = z.infer<typeof AgentResponseSchema>;\nexport type AgentMetadata = z.infer<typeof AgentMetadataSchema>;\n\n// Core agent interface that all agents must implement\nexport interface Agent {\n  // Required properties\n  readonly id: string;\n  readonly type: AgentType;\n  readonly availableTools: Record<string, any>;\n\n  // Required methods\n  act: (input: AgentInput) => Promise<AgentResponse>;\n\n  setSendUpdate?: (\n    sendUpdate: (data: ProgressMessage) => Promise<void>\n  ) => void;\n\n  // Optional methods for enhanced functionality\n  getMetadata: () => AgentMetadata;\n  initialize?: () => Promise<void>;\n  cleanup?: () => Promise<void>;\n  validateInput?: (input: AgentInput) => boolean;\n\n  // Health check method\n  isHealthy?: () => Promise<boolean>;\n\n  // Voice capabilities (optional)\n  voiceService?: VoiceService;\n  speak?: (text: string, options?: VoiceOptions) => Promise<AudioResult>;\n  listen?: (options?: TranscribeOptions) => Promise<TranscriptionResult>;\n  hasVoice?: () => boolean;\n  canSpeak?: () => boolean;\n  canListen?: () => boolean;\n}\n\n// Error types for better error handling\nexport class AgentError extends Error {\n  constructor(\n    message: string,\n    public agentType: AgentType,\n    public agentId: string,\n    public originalError?: Error\n  ) {\n    super(message);\n    this.name = \"AgentError\";\n  }\n}\n\nexport class AgentInitializationError extends AgentError {\n  constructor(agentType: AgentType, agentId: string, originalError?: Error) {\n    super(\n      `Failed to initialize agent ${agentType}:${agentId}`,\n      agentType,\n      agentId,\n      originalError\n    );\n    this.name = \"AgentInitializationError\";\n  }\n}\n\nexport class AgentExecutionError extends AgentError {\n  constructor(agentType: AgentType, agentId: string, originalError?: Error) {\n    super(\n      `Agent execution failed for ${agentType}:${agentId}`,\n      agentType,\n      agentId,\n      originalError\n    );\n    this.name = \"AgentExecutionError\";\n  }\n}\n","import { z } from \"zod\";\nimport { ChatMessageSchema } from \"./llm.types.js\";\n\n// Legacy progress message types - kept for backward compatibility\n// New code should use types from progress.types.ts instead\nexport const AgentFlowContextSchema = z.object({\n  userMessage: z.string(),\n  state: z.record(z.string(), z.any()).optional(), // Mutable state across iterations\n  maxIterations: z.number().optional(), // Override default max iterations\n  continueOnToolCalls: z.boolean().optional(), // Whether to continue after tool calls\n  sessionId: z.string().optional(), // Session identifier\n  conversationId: z.string().optional(), // Conversation identifie\n  conversationHistory: z.array(ChatMessageSchema).optional(),\n  metadata: z.record(z.string(), z.any()).optional(), // Additional metadata\n  sessionData: z.any().optional(),\n  sessionToken: z.string().optional(), // For Langfuse tracing\n});\nexport type AgentFlowContext = z.infer<typeof AgentFlowContextSchema>;\n","import type { ModelMessage, ToolSet } from \"ai\";\nimport z from \"zod\";\nimport type { ProgressMessage } from \"./progress.types.js\";\n\n// Zod schema for LLM\n\n// Tool call schema - using Vercel AI SDK format\nexport const ToolCallSchema = z.object({\n  toolCallId: z.string(),\n  toolName: z.string(),\n  args: z.unknown(), // Always required in Vercel AI SDK\n});\n\nexport const ChatMessageSchema = z.object({\n  role: z.enum([\"user\", \"assistant\", \"system\", \"tool\"]),\n  content: z.any(), // Can be string, null, or structured content\n  toolCalls: z.array(ToolCallSchema).optional(), // Vercel AI SDK uses camelCase\n  tool_call_id: z.string().optional(), // For tool responses\n  tool_name: z.string().optional(), // Tool name for tool responses\n  metadata: z.record(z.string(), z.any()).optional(), // Optional metadata\n  // Keep providerOptions for internal tracking (backward compatibility)\n  providerOptions: z\n    .object({\n      anthropic: z\n        .object({\n          cacheControl: z.object({ type: z.literal(\"ephemeral\") }).optional(),\n        })\n        .optional(),\n    })\n    .optional(),\n  // Add experimental_providerMetadata for AI SDK v5 compatibility\n  experimental_providerMetadata: z\n    .object({\n      anthropic: z\n        .object({\n          cacheControl: z.object({ type: z.literal(\"ephemeral\") }).optional(),\n        })\n        .optional(),\n    })\n    .optional(),\n});\n\n// Inferred types\nexport type ToolCall = z.infer<typeof ToolCallSchema>;\nexport type ChatMessage = z.infer<typeof ChatMessageSchema>;\n\nexport interface LLMTraceContext {\n  sessionId?: string;\n  userId?: string;\n  conversationId?: number;\n  agentType?: string;\n  metadata?: Record<string, any>;\n  tags?: string[];\n}\n\n// LLM Service Interface for injectable LLM providers\nexport interface LLMServiceOptions {\n  messages: ChatMessage[];\n  tools?: ToolSet;\n  model?: string;\n  provider?: string; // AI provider (e.g., \"openai\", \"anthropic\", \"openrouter\")\n  temperature?: number;\n  maxOutputTokens?: number;\n  // Desired response format; when set to \"structured\" and a schema is provided,\n  // the LLM service should use schema-enforced generation (e.g., generateObject).\n  responseFormat?: \"text\" | \"json\" | \"structured\";\n  // Optional output schema for structured responses. Accept Zod schema or plain JSON schema.\n  schema?: z.ZodTypeAny | Record<string, unknown>;\n  traceContext?: LLMTraceContext;\n  sendUpdate: (data: ProgressMessage) => Promise<void>;\n  [key: string]: any; // Allow additional provider-specific options\n}\n\nexport interface LLMService {\n  // Main method to run LLM with messages and optional tools\n  runLLM(options: LLMServiceOptions): Promise<ChatMessage>;\n\n  // Streaming methods (optional)\n  runStreamedLLM?(options: LLMServiceOptions): Promise<{\n    textStream: AsyncIterable<string>;\n    generation: any;\n  }>;\n  \n  runStreamedLLMWithTools?(\n    options: LLMServiceOptions & { tools?: any[] }\n  ): Promise<{\n    textStream: AsyncIterable<string>;\n    generation: any;\n  }>;\n\n  // Optional method to check if service is available\n  isAvailable?(): Promise<boolean>;\n}\n","import { tool as createTool } from \"ai\";\nimport type { Tool as AiTool } from \"ai\";\nimport { z } from \"zod\";\n\n/**\n * Grid Tool type - Vercel AI SDK's Tool with a name property\n */\nexport type Tool = AiTool & {\n  name: string; // We add name for easier identification\n};\n\n// Structural Tool type to allow compatible tools from outside this package\nexport type ToolLike = {\n  description?: string;\n  inputSchema: any;\n  execute?: (input: any, options?: any) => Promise<any>;\n  name?: string;\n};\n\n/**\n * Create a tool using Vercel AI SDK\n */\nexport { createTool };\n\n/**\n * Helper to create a tool wrapped in an object with the tool name as key\n *\n * @example\n * const tools = {\n *   ...createNamedTool({ name: 'calculator', ... }),\n *   ...createNamedTool({ name: 'timer', ... }),\n * };\n * // Results in: { calculator: tool1, timer: tool2 }\n */\nexport const createNamedTool = <\n  TName extends string,\n  TParameters extends z.ZodTypeAny = z.ZodTypeAny,\n  TResult = any\n>(config: {\n  name: TName;\n  description: string;\n  inputSchema: TParameters;\n  execute: (params: z.infer<TParameters>) => Promise<TResult>;\n}): Record<TName, AiTool<TParameters, TResult>> => {\n  // Cast to bypass TypeScript's strict overload checking\n  // The types are correct, but the AI SDK's overloads are complex\n  const tool = createTool<z.infer<TParameters>, TResult>({\n    description: config.description,\n    inputSchema: config.inputSchema as any, // Cast needed due to AI SDK's type complexity\n    execute: config.execute as any,\n  });\n\n  // Add name property to the tool for identification\n  Object.assign(tool, { name: config.name });\n\n  // Return an object with the tool name as key\n  return { [config.name]: tool } as Record<TName, AiTool<TParameters, TResult>>;\n};\n\n/**\n * Tool result for LLM (Vercel AI SDK format)\n */\nexport interface ToolResult {\n  toolCallId: string;\n  toolName: string;\n  result: unknown;\n}\n\n/**\n * Type guard to check if something is a Tool\n */\nexport const isTool = <T extends z.ZodTypeAny = z.ZodTypeAny>(\n  value: unknown\n): value is AiTool<T> => {\n  return (\n    typeof value === \"object\" &&\n    value !== null &&\n    \"description\" in value &&\n    \"inputSchema\" in value && // AI SDK v5 uses inputSchema\n    \"execute\" in value &&\n    \"name\" in value\n  );\n};\n","import { z } from \"zod\";\n\n/**\n * Progress message types for conversation flow updates\n */\nexport const ProgressMessageTypeEnum = z.enum([\n  \"user_message\",\n  \"agent_thought\",\n  \"finished\",\n  \"connection\",\n  \"tool_execution\",\n  \"llm_response\",\n  \"tool_response\",\n  \"unknown\",\n  \"thinking\",\n  \"notification\",\n  \"memory_saved\",\n  \"evaluation\",\n  \"state_update\",\n  \"iteration\",\n  // Voice-related progress types\n  \"speaking_start\",\n  \"speaking_complete\",\n  \"listening_start\",\n  \"listening_complete\",\n  \"voice_error\",\n  \"warning\",\n  \"error\",\n  \"success\",\n]);\n\n/**\n * Progress message schema for type safety\n */\nexport const ProgressMessageSchema = z.object({\n  type: ProgressMessageTypeEnum,\n  content: z.string(),\n  metadata: z.record(z.string(), z.any()).optional(),\n  timestamp: z.number().optional(),\n});\n\n/**\n * Progress message type for conversation updates\n */\nexport type ProgressMessage = z.infer<typeof ProgressMessageSchema>;\nexport type ProgressMessageType = z.infer<typeof ProgressMessageTypeEnum>;\n\n/**\n * Helper to create progress messages\n */\nexport const createProgressMessage = (\n  type: ProgressMessageType,\n  content: string,\n  metadata?: Record<string, any>\n): ProgressMessage => {\n  return {\n    type,\n    content,\n    metadata,\n    timestamp: Date.now(),\n  };\n};\n","/**\n * Voice-related types for Grid\n * Designed to be interface-agnostic - works with terminal, web, mobile, etc.\n */\n\n/**\n * Supported audio formats across different interfaces\n */\nexport type AudioFormat = 'mp3' | 'wav' | 'pcm' | 'ogg' | 'webm' | 'flac';\n\n/**\n * Audio data that can work in both Node.js and browser environments\n */\nexport interface AudioData {\n  /**\n   * Raw audio data - Buffer in Node.js, ArrayBuffer in browser\n   */\n  data: Buffer | ArrayBuffer | Uint8Array;\n  \n  /**\n   * Audio format\n   */\n  format: AudioFormat;\n  \n  /**\n   * Sample rate in Hz (e.g., 44100, 48000)\n   */\n  sampleRate?: number;\n  \n  /**\n   * Number of audio channels (1 for mono, 2 for stereo)\n   */\n  channels?: number;\n  \n  /**\n   * Bit depth (e.g., 16, 24)\n   */\n  bitDepth?: number;\n}\n\n/**\n * Result from audio synthesis\n */\nexport interface AudioResult extends AudioData {\n  /**\n   * Duration in seconds\n   */\n  duration?: number;\n  \n  /**\n   * Size in bytes\n   */\n  size: number;\n  \n  /**\n   * Optional metadata\n   */\n  metadata?: {\n    voiceId?: string;\n    language?: string;\n    model?: string;\n    [key: string]: any;\n  };\n}\n\n/**\n * Input audio for transcription - flexible to accept various sources\n */\nexport interface AudioInput {\n  /**\n   * Audio data - can be Buffer, ArrayBuffer, base64 string, or file path\n   */\n  data: Buffer | ArrayBuffer | Uint8Array | string;\n  \n  /**\n   * Format of the audio\n   */\n  format: AudioFormat;\n  \n  /**\n   * Type of the data field\n   */\n  dataType: 'buffer' | 'base64' | 'filepath' | 'url';\n  \n  /**\n   * Optional audio properties\n   */\n  sampleRate?: number;\n  channels?: number;\n}\n\n/**\n * Options for voice synthesis\n */\nexport interface VoiceOptions {\n  /**\n   * Voice ID to use (provider-specific)\n   */\n  voiceId?: string;\n  \n  /**\n   * Language code (e.g., 'en-US', 'es-ES')\n   */\n  language?: string;\n  \n  /**\n   * Voice stability (0.0 to 1.0) - ElevenLabs specific\n   */\n  stability?: number;\n  \n  /**\n   * Voice similarity boost (0.0 to 1.0) - ElevenLabs specific\n   */\n  similarityBoost?: number;\n  \n  /**\n   * Speaking style (0.0 to 1.0) - ElevenLabs specific\n   */\n  style?: number;\n  \n  /**\n   * Use speaker boost - ElevenLabs specific\n   */\n  useSpeakerBoost?: boolean;\n  \n  /**\n   * Speaking rate/speed (0.5 to 2.0)\n   */\n  speed?: number;\n  \n  /**\n   * Voice pitch (-20 to 20)\n   */\n  pitch?: number;\n  \n  /**\n   * Output format preference\n   */\n  outputFormat?: AudioFormat;\n  \n  /**\n   * Enable streaming generation\n   */\n  stream?: boolean;\n  \n  /**\n   * Model to use for synthesis\n   */\n  model?: string;\n}\n\n/**\n * Options for speech transcription\n */\nexport interface TranscribeOptions {\n  /**\n   * Language code for transcription\n   */\n  language?: string;\n  \n  /**\n   * Enable automatic language detection\n   */\n  detectLanguage?: boolean;\n  \n  /**\n   * Include word-level timestamps\n   */\n  timestamps?: boolean;\n  \n  /**\n   * Include punctuation\n   */\n  punctuate?: boolean;\n  \n  /**\n   * Model to use (e.g., 'whisper-large', 'whisper-medium')\n   */\n  model?: string;\n  \n  /**\n   * Temperature for sampling (0.0 to 1.0)\n   */\n  temperature?: number;\n}\n\n/**\n * Result from speech transcription\n */\nexport interface TranscriptionResult {\n  /**\n   * Transcribed text\n   */\n  text: string;\n  \n  /**\n   * Confidence score (0.0 to 1.0)\n   */\n  confidence?: number;\n  \n  /**\n   * Detected or specified language\n   */\n  language?: string;\n  \n  /**\n   * Duration of the audio in seconds\n   */\n  duration?: number;\n  \n  /**\n   * Word-level details if requested\n   */\n  words?: Array<{\n    word: string;\n    start: number;\n    end: number;\n    confidence?: number;\n  }>;\n  \n  /**\n   * Alternative transcriptions\n   */\n  alternatives?: Array<{\n    text: string;\n    confidence: number;\n  }>;\n}\n\n/**\n * Available voice information\n */\nexport interface Voice {\n  /**\n   * Unique voice identifier\n   */\n  id: string;\n  \n  /**\n   * Display name\n   */\n  name: string;\n  \n  /**\n   * Voice description\n   */\n  description?: string;\n  \n  /**\n   * Preview URL if available\n   */\n  previewUrl?: string;\n  \n  /**\n   * Supported languages\n   */\n  languages?: string[];\n  \n  /**\n   * Voice characteristics\n   */\n  labels?: {\n    accent?: string;\n    age?: string;\n    gender?: string;\n    useCase?: string[];\n    [key: string]: any;\n  };\n  \n  /**\n   * Whether this is a custom/cloned voice\n   */\n  isCustom?: boolean;\n}\n\n/**\n * Audio chunk for streaming\n */\nexport interface AudioChunk {\n  /**\n   * Chunk data\n   */\n  data: Uint8Array;\n  \n  /**\n   * Chunk index\n   */\n  index: number;\n  \n  /**\n   * Is this the final chunk?\n   */\n  isFinal: boolean;\n  \n  /**\n   * Timestamp of this chunk\n   */\n  timestamp: number;\n}\n\n/**\n * Voice service interface - must work across all environments\n */\nexport interface VoiceService {\n  /**\n   * Synthesize text to speech\n   */\n  synthesize(text: string, options?: VoiceOptions): Promise<AudioResult>;\n  \n  /**\n   * Stream synthesis for real-time playback\n   */\n  streamSynthesize?(text: string, options?: VoiceOptions): AsyncGenerator<AudioChunk>;\n  \n  /**\n   * Transcribe audio to text\n   */\n  transcribe(audio: AudioInput, options?: TranscribeOptions): Promise<TranscriptionResult>;\n  \n  /**\n   * Stream transcription for real-time processing\n   */\n  streamTranscribe?(audio: AsyncGenerator<AudioChunk>, options?: TranscribeOptions): AsyncGenerator<TranscriptionResult>;\n  \n  /**\n   * List available voices\n   */\n  listVoices(): Promise<Voice[]>;\n  \n  /**\n   * Get specific voice details\n   */\n  getVoice?(voiceId: string): Promise<Voice | null>;\n  \n  /**\n   * Clone a voice (if supported)\n   */\n  cloneVoice?(name: string, samples: AudioInput[]): Promise<Voice>;\n  \n  /**\n   * Delete a custom voice\n   */\n  deleteVoice?(voiceId: string): Promise<boolean>;\n  \n  /**\n   * Check if service is available\n   */\n  isAvailable(): Promise<boolean>;\n}\n\n/**\n * Voice configuration for agents\n */\nexport interface VoiceConfig {\n  /**\n   * Enable voice capabilities\n   */\n  enabled: boolean;\n  \n  /**\n   * Default voice ID\n   */\n  voiceId?: string;\n  \n  /**\n   * Default voice options\n   */\n  defaultOptions?: Partial<VoiceOptions>;\n  \n  /**\n   * Automatically speak responses\n   */\n  autoSpeak?: boolean;\n  \n  /**\n   * Automatically listen after speaking\n   */\n  autoListen?: boolean;\n  \n  /**\n   * Allow interruption while speaking\n   */\n  allowInterruption?: boolean;\n  \n  /**\n   * Mixed modality settings\n   */\n  mixedModality?: {\n    enabled: boolean;\n    mergeStrategy: 'temporal' | 'contextual' | 'append';\n  };\n}\n\n/**\n * Voice error types\n */\nexport class VoiceError extends Error {\n  constructor(\n    message: string,\n    public code: 'SYNTHESIS_FAILED' | 'TRANSCRIPTION_FAILED' | 'VOICE_NOT_FOUND' | \n                 'QUOTA_EXCEEDED' | 'INVALID_AUDIO' | 'SERVICE_UNAVAILABLE',\n    public details?: any\n  ) {\n    super(message);\n    this.name = 'VoiceError';\n  }\n}\n\n/**\n * Progress event for voice operations\n */\nexport interface VoiceProgressEvent {\n  type: 'synthesis_start' | 'synthesis_progress' | 'synthesis_complete' |\n        'transcription_start' | 'transcription_progress' | 'transcription_complete' |\n        'listening_start' | 'listening_stop' | 'speaking_start' | 'speaking_stop';\n  \n  /**\n   * Progress percentage (0-100)\n   */\n  progress?: number;\n  \n  /**\n   * Associated data\n   */\n  data?: any;\n  \n  /**\n   * Timestamp\n   */\n  timestamp: number;\n}","import { Langfuse } from \"langfuse\";\n\nexport interface LangfuseTraceOptions {\n  name?: string;\n  sessionId?: string;\n  userId?: string;\n  conversationId?: number;\n  agentType?: string;\n  metadata?: Record<string, any>;\n  tags?: string[];\n}\n\nexport interface LangfuseGenerationOptions {\n  name: string;\n  model: string;\n  input: any;\n  metadata?: Record<string, any>;\n  tags?: string[];\n}\n\nexport interface LangfuseGenerationUpdate {\n  output?: any;\n  usage?: {\n    input?: number;\n    output?: number;\n    total?: number;\n  };\n  cost?: {\n    input?: number;\n    output?: number;\n    total?: number;\n  };\n  error?: Error | string;\n}\n\nexport interface CreateLangfuseServiceConfig {\n  env?: {\n    LANGFUSE_ENABLED: boolean;\n    LANGFUSE_SECRET_KEY: string;\n    LANGFUSE_PUBLIC_KEY: string;\n    LANGFUSE_BASE_URL: string;\n    LANGFUSE_FLUSH_AT: number;\n    LANGFUSE_FLUSH_INTERVAL: number;\n  };\n}\n\nexport const createLangfuseService = (\n  config: CreateLangfuseServiceConfig = {}\n) => {\n  const defaultEnv = {\n    LANGFUSE_ENABLED: process.env.LANGFUSE_ENABLED === \"true\",\n    LANGFUSE_SECRET_KEY: process.env.LANGFUSE_SECRET_KEY || \"\",\n    LANGFUSE_PUBLIC_KEY: process.env.LANGFUSE_PUBLIC_KEY || \"\",\n    LANGFUSE_BASE_URL: process.env.LANGFUSE_BASE_URL || \"\",\n    LANGFUSE_FLUSH_AT: Number(process.env.LANGFUSE_FLUSH_AT) || 1,\n    LANGFUSE_FLUSH_INTERVAL:\n      Number(process.env.LANGFUSE_FLUSH_INTERVAL) || 1000,\n  };\n\n  // Merge with provided config\n  const mergedConfig = {\n    env: { ...defaultEnv, ...config.env },\n  };\n\n  // === SESSION & TRACE MANAGEMENT ===\n  // In-memory storage for session-based tracing\n  const sessionTraces = new Map<string, any>(); // sessionToken -> current trace\n  const traceCounters = new Map<string, number>(); // sessionToken -> execution counter\n  const sessionCurrentGenerations = new Map<string, any>(); // sessionToken -> current generation\n  const sessionOpenSpans = new Map<string, Map<string, any>>(); // sessionToken -> Map<spanName, span>\n  const sessionToolSpans = new Map<string, Map<string, any>>(); // sessionToken -> Map<toolCallId, span>\n\n  // Normalize labels (spans, events, generation names) to kebab-case\n  const normalizeLabel = (label: string): string =>\n    String(label)\n      .trim()\n      .toLowerCase()\n      .replace(/[^a-z0-9]+/g, \"-\") // replace groups of non-alnum chars with '-'\n      .replace(/^-+|-+$/g, \"\"); // trim leading/trailing '-'\n\n  // Initialize Langfuse client with proper configuration\n  const langfuse = (() => {\n    if (!mergedConfig.env.LANGFUSE_ENABLED) {\n      console.info(\"🔍 Langfuse tracing is disabled\");\n      return null;\n    }\n\n    if (\n      !mergedConfig.env.LANGFUSE_SECRET_KEY ||\n      !mergedConfig.env.LANGFUSE_PUBLIC_KEY\n    ) {\n      console.warn(\n        \"⚠️ Langfuse API keys not configured. Tracing will be disabled.\"\n      );\n      return null;\n    }\n\n    try {\n      const client = new Langfuse({\n        secretKey: mergedConfig.env.LANGFUSE_SECRET_KEY!,\n        publicKey: mergedConfig.env.LANGFUSE_PUBLIC_KEY!,\n        baseUrl: mergedConfig.env.LANGFUSE_BASE_URL,\n        flushAt: mergedConfig.env.LANGFUSE_FLUSH_AT,\n        flushInterval: mergedConfig.env.LANGFUSE_FLUSH_INTERVAL,\n      });\n\n      console.info(\"🔍 Langfuse tracing initialized successfully\", {\n        baseUrl: mergedConfig.env.LANGFUSE_BASE_URL,\n        flushAt: mergedConfig.env.LANGFUSE_FLUSH_AT,\n        flushInterval: mergedConfig.env.LANGFUSE_FLUSH_INTERVAL,\n      });\n\n      return client;\n    } catch (error) {\n      console.error(\"❌ Failed to initialize Langfuse:\", error);\n      return null;\n    }\n  })();\n\n  /**\n   * Check if Langfuse is available and enabled\n   */\n  const isEnabled = (): boolean => {\n    return langfuse !== null && mergedConfig.env.LANGFUSE_ENABLED;\n  };\n\n  /**\n   * Create a new trace for tracking LLM operations\n   */\n  const createTrace = (options: LangfuseTraceOptions) => {\n    if (!isEnabled()) {\n      return createNoOpTrace();\n    }\n\n    try {\n      const trace = langfuse!.trace({\n        name: options.name || \"llm-operation\",\n        sessionId: options.sessionId,\n        userId: options.userId,\n        metadata: {\n          ...options.metadata,\n          conversationId: options.conversationId,\n          agentType: options.agentType,\n        },\n        tags: options.tags,\n      });\n\n      return {\n        trace,\n        createGeneration: (genOptions: LangfuseGenerationOptions) => {\n          const generation = trace.generation({\n            name: genOptions.name,\n            model: genOptions.model,\n            input: genOptions.input,\n            metadata: genOptions.metadata,\n          });\n\n          return {\n            generation,\n            end: (update: LangfuseGenerationUpdate) => {\n              try {\n                const endParams: any = {\n                  output: update.output,\n                  usage: update.usage,\n                  metadata: update.cost ? { cost: update.cost } : undefined,\n                };\n\n                if (update.error) {\n                  endParams.level = \"ERROR\";\n                  endParams.statusMessage =\n                    typeof update.error === \"string\"\n                      ? update.error\n                      : update.error.message;\n                }\n\n                generation.end(endParams);\n              } catch (error) {\n                console.error(\"Failed to end Langfuse generation:\", error);\n              }\n            },\n            update: (update: Partial<LangfuseGenerationUpdate>) => {\n              try {\n                const updateParams: any = {\n                  output: update.output,\n                  usage: update.usage,\n                };\n                if (update.cost) {\n                  updateParams.metadata = { cost: update.cost };\n                }\n                generation.update(updateParams);\n              } catch (error) {\n                console.error(\"Failed to update Langfuse generation:\", error);\n              }\n            },\n          };\n        },\n        createSpan: (name: string, metadata?: Record<string, any>) => {\n          const span = trace.span({\n            name,\n            metadata,\n          });\n\n          return {\n            span,\n            end: (output?: any, error?: Error | string) => {\n              try {\n                const endParams: any = {\n                  output,\n                };\n\n                if (error) {\n                  endParams.level = \"ERROR\";\n                  endParams.statusMessage =\n                    typeof error === \"string\" ? error : error.message;\n                }\n\n                span.end(endParams);\n              } catch (err) {\n                console.error(\"Failed to end Langfuse span:\", err);\n              }\n            },\n          };\n        },\n        end: (output?: any) => {\n          try {\n            trace.update({\n              output,\n            });\n          } catch (error) {\n            console.error(\"Failed to end Langfuse trace:\", error);\n          }\n        },\n      };\n    } catch (error) {\n      console.error(\"Failed to create Langfuse trace:\", error);\n      return createNoOpTrace();\n    }\n  };\n\n  /**\n   * Create a no-op trace that doesn't do anything\n   * Used when Langfuse is disabled or fails to initialize\n   */\n  const createNoOpTrace = () => ({\n    trace: null,\n    traceName: null as string | null,\n    executionNumber: 0,\n    createGeneration: () => ({\n      generation: null,\n      end: () => {},\n      update: () => {},\n    }),\n    createSpan: () => ({\n      span: null,\n      end: () => {},\n    }),\n    end: () => {},\n  });\n\n  /**\n   * Calculate token usage cost based on model and usage\n   */\n  const calculateCost = (\n    model: string,\n    usage: { input?: number; output?: number; total?: number }\n  ): { input: number; output: number; total: number } => {\n    // Simplified cost calculation - you can expand this with actual pricing\n    const costs: Record<string, { input: number; output: number }> = {\n      \"gpt-4o\": { input: 0.0025, output: 0.01 }, // per 1K tokens\n      \"gpt-4o-mini\": { input: 0.00015, output: 0.0006 },\n      \"gpt-4-turbo\": { input: 0.01, output: 0.03 },\n      \"claude-3-sonnet\": { input: 0.003, output: 0.015 },\n      \"claude-3-haiku\": { input: 0.00025, output: 0.00125 },\n      \"claude-3-5-sonnet\": { input: 0.003, output: 0.015 },\n    };\n\n    const modelCosts = costs[model] || { input: 0.001, output: 0.003 }; // fallback\n\n    const inputCost = (usage.input || 0) * (modelCosts.input / 1000);\n    const outputCost = (usage.output || 0) * (modelCosts.output / 1000);\n\n    return {\n      input: inputCost,\n      output: outputCost,\n      total: inputCost + outputCost,\n    };\n  };\n\n  /**\n   * Flush all pending events to Langfuse\n   */\n  const flush = async (): Promise<void> => {\n    if (!isEnabled()) return;\n\n    try {\n      await langfuse!.flushAsync();\n    } catch (error) {\n      console.error(\"Failed to flush Langfuse events:\", error);\n    }\n  };\n\n  /**\n   * Shutdown Langfuse client\n   */\n  const shutdown = async (): Promise<void> => {\n    if (!isEnabled()) return;\n\n    try {\n      await langfuse!.shutdownAsync();\n    } catch (error) {\n      console.error(\"Failed to shutdown Langfuse:\", error);\n    }\n  };\n\n  /**\n   * Create a score/feedback for a trace or generation\n   */\n  const createScore = async (options: {\n    traceId?: string;\n    generationId?: string;\n    name: string;\n    value: number;\n    comment?: string;\n    metadata?: Record<string, any>;\n  }) => {\n    if (!isEnabled()) return;\n\n    try {\n      await langfuse!.score({\n        traceId: options.traceId || \"\",\n        observationId: options.generationId,\n        name: options.name,\n        value: options.value,\n        comment: options.comment,\n      });\n    } catch (error) {\n      console.error(\"Failed to create Langfuse score:\", error);\n    }\n  };\n\n  // === SESSION & TRACE MANAGEMENT METHODS ===\n\n  /**\n   * Create a new execution trace for a session\n   */\n  const createExecutionTrace = (\n    sessionToken: string,\n    agentType: string,\n    input: any,\n    conversationId?: number,\n    metadata?: Record<string, any>\n  ) => {\n    if (!isEnabled()) {\n      return createNoOpTrace();\n    }\n\n    try {\n      // Get or initialize counter for this session\n      const currentCount = traceCounters.get(sessionToken) || 0;\n      const newCount = currentCount + 1;\n      traceCounters.set(sessionToken, newCount);\n\n      // Create trace with sequential naming including agent type\n      const traceName = `agent-${agentType}-execution-${newCount}`;\n\n      const trace = langfuse!.trace({\n        name: traceName,\n        input,\n        sessionId: sessionToken,\n        metadata: {\n          agentType,\n          conversationId,\n          executionNumber: newCount,\n          timestamp: new Date().toISOString(),\n          ...metadata,\n        },\n        tags: [\"agent-execution\", agentType],\n      });\n\n      // Store current trace for this session\n      sessionTraces.set(sessionToken, trace);\n\n      console.info(`🔍 Created execution trace: ${traceName}`, {\n        sessionToken,\n        agentType,\n        conversationId,\n        executionNumber: newCount,\n      });\n\n      return {\n        trace,\n        traceName,\n        executionNumber: newCount,\n      };\n    } catch (error) {\n      console.error(\"Failed to create execution trace:\", error);\n      return createNoOpTrace();\n    }\n  };\n\n  /**\n   * Get current trace for a session\n   */\n  const getCurrentTrace = (sessionToken: string) => {\n    return sessionTraces.get(sessionToken) || null;\n  };\n\n  /**\n   * Create a span within the current trace for a session\n   */\n  const createSpanForSession = (\n    sessionToken: string,\n    spanName: string,\n    metadata?: Record<string, any>,\n    input?: any\n  ) => {\n    const trace = getCurrentTrace(sessionToken);\n    if (!trace) {\n      console.warn(`No active trace found for session: ${sessionToken}`);\n      return null;\n    }\n\n    try {\n      const normalizedName = normalizeLabel(spanName);\n\n      // If a span with the same name is already open for this session, reuse it\n      const existingSpans = sessionOpenSpans.get(sessionToken);\n      if (existingSpans && existingSpans.has(normalizedName)) {\n        return existingSpans.get(normalizedName);\n      }\n\n      const span = trace.span({\n        name: normalizedName,\n        metadata: {\n          sessionToken,\n          timestamp: new Date().toISOString(),\n          ...metadata,\n        },\n        input,\n      });\n\n      // Track open span for this session\n      let spansForSession = sessionOpenSpans.get(sessionToken);\n      if (!spansForSession) {\n        spansForSession = new Map<string, any>();\n        sessionOpenSpans.set(sessionToken, spansForSession);\n      }\n      spansForSession.set(normalizedName, span);\n\n      return span;\n    } catch (error) {\n      console.error(\"Failed to create span:\", error);\n      return null;\n    }\n  };\n\n  /**\n   * End a span within the current trace for a session\n   */\n  const endSpanForSession = (\n    sessionToken: string,\n    spanName: string,\n    output?: any,\n    error?: Error | string\n  ) => {\n    const normalizedName = normalizeLabel(spanName);\n    const spansForSession = sessionOpenSpans.get(sessionToken);\n    if (!spansForSession) {\n      console.warn(`No open spans found for session: ${sessionToken}`);\n      return;\n    }\n\n    const span = spansForSession.get(normalizedName);\n    if (!span) {\n      console.warn(\n        `No span named \"${normalizedName}\" found for session: ${sessionToken}`\n      );\n      return;\n    }\n\n    try {\n      const endParams: any = { output };\n      if (error) {\n        endParams.level = \"ERROR\";\n        endParams.statusMessage =\n          typeof error === \"string\" ? error : error.message;\n      }\n      span.end(endParams);\n    } catch (err) {\n      console.error(\"Failed to end Langfuse span:\", err);\n    } finally {\n      spansForSession.delete(normalizedName);\n      if (spansForSession.size === 0) {\n        sessionOpenSpans.delete(sessionToken);\n      }\n    }\n  };\n\n  /**\n   * Create a generation within the current trace for a session\n   */\n  const createGenerationForSession = (\n    sessionToken: string,\n    options: LangfuseGenerationOptions\n  ) => {\n    const trace = getCurrentTrace(sessionToken);\n    if (!trace) {\n      console.warn(`No active trace found for session: ${sessionToken}`);\n      return null;\n    }\n\n    try {\n      const generation = trace.generation({\n        name: normalizeLabel(options.name),\n        model: options.model,\n        input: options.input,\n        metadata: {\n          sessionToken,\n          timestamp: new Date().toISOString(),\n          ...options.metadata,\n        },\n      });\n\n      // Track current generation for this session\n      sessionCurrentGenerations.set(sessionToken, generation);\n\n      return generation;\n    } catch (error) {\n      console.error(\"Failed to create generation:\", error);\n      return null;\n    }\n  };\n\n  /**\n   * Start a tool span keyed by toolCallId for vercel-native tool telemetry\n   */\n  const startToolSpanForSession = (\n    sessionToken: string,\n    toolCallId: string,\n    toolName: string,\n    args?: unknown\n  ) => {\n    const trace = getCurrentTrace(sessionToken);\n    if (!trace || !toolCallId) return null;\n\n    try {\n      const spanName = `tool-${normalizeLabel(toolName || \"unknown\")}`;\n      const span = trace.span({\n        name: spanName,\n        input: args,\n        metadata: {\n          sessionToken,\n          toolCallId,\n          toolName,\n          timestamp: new Date().toISOString(),\n        },\n      });\n\n      let toolSpans = sessionToolSpans.get(sessionToken);\n      if (!toolSpans) {\n        toolSpans = new Map<string, any>();\n        sessionToolSpans.set(sessionToken, toolSpans);\n      }\n      toolSpans.set(toolCallId, span);\n\n      return span;\n    } catch (error) {\n      console.error(\"Failed to start tool span:\", error);\n      return null;\n    }\n  };\n\n  /**\n   * End a tool span previously started via startToolSpanForSession\n   */\n  const endToolSpanForSession = (\n    sessionToken: string,\n    toolCallId: string,\n    output?: unknown,\n    error?: Error | string\n  ) => {\n    const toolSpans = sessionToolSpans.get(sessionToken);\n    if (!toolSpans) return;\n    const span = toolSpans.get(toolCallId);\n    if (!span) return;\n\n    try {\n      const endParams: any = { output };\n      if (error) {\n        endParams.level = \"ERROR\";\n        endParams.statusMessage =\n          typeof error === \"string\" ? error : error.message;\n      }\n      span.end(endParams);\n    } catch (err) {\n      console.error(\"Failed to end tool span:\", err);\n    } finally {\n      toolSpans.delete(toolCallId);\n      if (toolSpans.size === 0) sessionToolSpans.delete(sessionToken);\n    }\n  };\n\n  /**\n   * Get current generation for a session\n   */\n  const getCurrentGeneration = (sessionToken: string) => {\n    return sessionCurrentGenerations.get(sessionToken) || null;\n  };\n\n  /**\n   * Update current generation for a session\n   */\n  const updateCurrentGenerationForSession = (\n    sessionToken: string,\n    update: Partial<LangfuseGenerationUpdate>\n  ) => {\n    const generation = getCurrentGeneration(sessionToken);\n    if (!generation) {\n      console.warn(`No active generation found for session: ${sessionToken}`);\n      return;\n    }\n\n    try {\n      const updateParams: any = {\n        output: update.output,\n        usage: update.usage,\n      };\n      if (update.cost) {\n        updateParams.metadata = { cost: update.cost };\n      }\n      generation.update(updateParams);\n    } catch (error) {\n      console.error(\"Failed to update Langfuse generation:\", error);\n    }\n  };\n\n  /**\n   * End current generation for a session\n   */\n  const endCurrentGenerationForSession = (\n    sessionToken: string,\n    update: LangfuseGenerationUpdate\n  ) => {\n    const generation = getCurrentGeneration(sessionToken);\n    if (!generation) {\n      console.warn(`No active generation found for session: ${sessionToken}`);\n      return;\n    }\n\n    try {\n      const endParams: any = {\n        output: update.output,\n        usage: update.usage,\n      };\n\n      if (update.error) {\n        endParams.level = \"ERROR\";\n        endParams.statusMessage =\n          typeof update.error === \"string\"\n            ? update.error\n            : update.error.message;\n      }\n\n      if (update.cost) {\n        endParams.metadata = { cost: update.cost };\n      }\n\n      generation.end(endParams);\n    } catch (error) {\n      console.error(\"Failed to end Langfuse generation:\", error);\n    } finally {\n      sessionCurrentGenerations.delete(sessionToken);\n    }\n  };\n\n  /**\n   * Add an event to the current trace for a session\n   */\n  const addEventToSession = (\n    sessionToken: string,\n    eventName: string,\n    properties?: Record<string, any>\n  ) => {\n    const trace = getCurrentTrace(sessionToken);\n    if (!trace) {\n      console.warn(`No active trace found for session: ${sessionToken}`);\n      return;\n    }\n\n    try {\n      trace.event({\n        name: normalizeLabel(eventName),\n        metadata: {\n          sessionToken,\n          timestamp: new Date().toISOString(),\n          ...properties,\n        },\n      });\n    } catch (error) {\n      console.error(\"Failed to add event:\", error);\n    }\n  };\n\n  /**\n   * End the current execution trace for a session\n   */\n  const endExecutionTrace = (\n    sessionToken: string,\n    output?: any,\n    error?: Error | string\n  ) => {\n    const trace = getCurrentTrace(sessionToken);\n    if (!trace) {\n      console.warn(`No active trace found for session: ${sessionToken}`);\n      return;\n    }\n\n    try {\n      const endParams: any = {\n        output,\n        metadata: {\n          endTime: new Date().toISOString(),\n        },\n      };\n\n      if (error) {\n        endParams.level = \"ERROR\";\n        endParams.statusMessage =\n          typeof error === \"string\" ? error : error.message;\n      }\n\n      trace.update(endParams);\n    } catch (err) {\n      console.error(\"Failed to end execution trace:\", err);\n    } finally {\n      // Clean up current trace reference\n      sessionTraces.delete(sessionToken);\n      sessionCurrentGenerations.delete(sessionToken);\n      sessionOpenSpans.delete(sessionToken);\n      sessionToolSpans.delete(sessionToken);\n    }\n  };\n\n  /**\n   * Clean up session data (call when session expires)\n   */\n  const cleanupSession = (sessionToken: string) => {\n    const trace = sessionTraces.get(sessionToken);\n    if (trace) {\n      // End trace if it's still active\n      endExecutionTrace(sessionToken, null, \"Session expired\");\n    }\n\n    // Clean up counters\n    traceCounters.delete(sessionToken);\n    sessionCurrentGenerations.delete(sessionToken);\n    sessionOpenSpans.delete(sessionToken);\n    sessionToolSpans.delete(sessionToken);\n\n    console.info(`🔍 Cleaned up session: ${sessionToken}`);\n  };\n\n  /**\n   * Get session statistics (for debugging)\n   */\n  const getSessionStats = () => {\n    return {\n      activeSessions: sessionTraces.size,\n      totalExecutions: Array.from(traceCounters.values()).reduce(\n        (sum, count) => sum + count,\n        0\n      ),\n      sessionTokens: Array.from(sessionTraces.keys()),\n    };\n  };\n\n  return {\n    isEnabled,\n    createTrace,\n    calculateCost,\n    flush,\n    shutdown,\n    createScore,\n    client: langfuse,\n    // New session-based methods\n    createExecutionTrace,\n    getCurrentTrace,\n    createSpanForSession,\n    endSpanForSession,\n    createGenerationForSession,\n    getCurrentGeneration,\n    updateCurrentGenerationForSession,\n    endCurrentGenerationForSession,\n    addEventToSession,\n    startToolSpanForSession,\n    endToolSpanForSession,\n    endExecutionTrace,\n    cleanupSession,\n    getSessionStats,\n  };\n};\n\nexport const langfuseService = createLangfuseService();\nexport type LangfuseService = typeof langfuseService;\n\n// Additional interfaces for session-based tracing\nexport interface ExecutionTraceResult {\n  trace: any;\n  traceName: string;\n  executionNumber: number;\n}\n\nexport interface SessionStats {\n  activeSessions: number;\n  totalExecutions: number;\n  sessionTokens: string[];\n}\n","import type {\n  ChatMessage,\n  LLMService,\n  LLMServiceOptions,\n} from \"../types/index.js\";\nimport {\n  generateText,\n  generateObject,\n  streamText,\n  stepCountIs,\n  type ModelMessage,\n} from \"ai\";\nimport { openai } from \"@ai-sdk/openai\";\nimport { anthropic } from \"@ai-sdk/anthropic\";\nimport { createOpenRouter } from \"@openrouter/ai-sdk-provider\";\nimport {\n  langfuseService,\n  type LangfuseService,\n} from \"./LangfuseService/langfuse.service.js\";\n\nexport interface BaseLLMServiceConfig {\n  toolExecutionMode?: \"vercel-native\" | \"custom\" | \"none\";\n  defaultModel?: string;\n  defaultProvider?: string; // Default provider (openai, anthropic, etc.)\n  langfuse?: LangfuseService;\n}\n\nexport const baseLLMService = (\n  config: BaseLLMServiceConfig = {}\n): LLMService => {\n  const {\n    toolExecutionMode = \"vercel-native\", // Default to vercel-native execution\n    // Default model - can be overridden per-call via options.model\n    defaultModel = \"gpt-5-mini\",\n    defaultProvider = \"openai\", // Default provider - can be overridden per-call via options.provider\n    langfuse = langfuseService,\n  } = config;\n\n  const runLLM = async (options: LLMServiceOptions): Promise<ChatMessage> => {\n    const {\n      model = defaultModel,\n      provider, // AI provider to use (openai, anthropic, etc.)\n      messages,\n      tools = undefined,\n      temperature = 0.1,\n      maxOutputTokens,\n      responseFormat,\n      schema,\n      traceContext,\n      sendUpdate,\n    } = options;\n\n    const generation = langfuse.createGenerationForSession(\n      options.context.sessionToken,\n      {\n        input: options.messages,\n        model,\n        name: \"llm-generation\",\n        metadata: {\n          ...options.context.metadata,\n        },\n      }\n    );\n\n    // Try to link AI SDK telemetry to our existing Langfuse trace\n    const parentTrace = langfuse.getCurrentTrace(options.context.sessionToken);\n    const parentTraceId =\n      // common id locations across SDK versions\n      (parentTrace as any)?.id ||\n      (parentTrace as any)?.traceId ||\n      (parentTrace as any)?.trace?.id;\n\n    // Determine which AI SDK provider to use based on provider parameter\n    // Default to openai if not specified\n    let aiModel;\n    let sdkProvider: string;\n\n    if (provider === \"anthropic\") {\n      aiModel = anthropic(model);\n      sdkProvider = \"anthropic\";\n    } else if (provider === \"openrouter\") {\n      // Use official OpenRouter provider\n      const openrouter = createOpenRouter({\n        apiKey: process.env.OPENROUTER_API_KEY,\n      });\n      aiModel = openrouter.chat(model);\n      sdkProvider = \"openrouter\";\n    } else {\n      // Default to OpenAI\n      aiModel = openai(model);\n      sdkProvider = \"openai\";\n    }\n\n    console.log(\n      `🤖 [base.llm.service] Using AI SDK: ${sdkProvider} for model: ${model}`\n    );\n    console.log(\n      `🔧 [base.llm.service] Max output tokens: ${\n        maxOutputTokens || \"default (varies by model)\"\n      }`\n    );\n    console.log(`🌡️ [base.llm.service] Temperature: ${temperature}`);\n\n    // If structured output requested and schema provided, use generateObject to enforce pure JSON\n    if (responseFormat === \"structured\" && schema) {\n      const { object, response } = await generateObject({\n        model: aiModel,\n        messages: messages as any, // Cast to any to preserve experimental_providerMetadata for cache control\n        schema: schema as any,\n        temperature,\n        maxOutputTokens,\n      });\n\n      // Log cache statistics for Anthropic\n      // Cache stats are in response.body.usage for Anthropic\n      const cacheStats =\n        sdkProvider === \"anthropic\" ? (response as any)?.body?.usage : null;\n\n      if (cacheStats && sdkProvider === \"anthropic\") {\n        console.log(\"💰 [Cache] Input tokens:\", cacheStats.input_tokens || 0);\n        console.log(\n          \"📦 [Cache] Cache creation:\",\n          cacheStats.cache_creation_input_tokens || 0\n        );\n        console.log(\n          \"✨ [Cache] Cache read:\",\n          cacheStats.cache_read_input_tokens || 0\n        );\n\n        if (cacheStats.cache_read_input_tokens > 0) {\n          const savings = Math.round(\n            (cacheStats.cache_read_input_tokens / cacheStats.input_tokens) * 100\n          );\n          console.log(\n            `🎉 [Cache] CACHE HIT! ${cacheStats.cache_read_input_tokens} tokens from cache (${savings}% of input)`\n          );\n        }\n        if (cacheStats.cache_creation_input_tokens > 0) {\n          console.log(\n            `📝 [Cache] Created cache for ${cacheStats.cache_creation_input_tokens} tokens (5 min TTL)`\n          );\n        }\n      }\n\n      // End generation with success if tracing\n      if (generation) {\n        const usage = (response as any)?.usage;\n        const cost = langfuseService.calculateCost(model, {\n          total: usage?.totalTokens,\n          input: usage?.inputTokens,\n          output: usage?.outputTokens,\n        });\n\n        generation.end({\n          output: JSON.stringify(object),\n          usage: {\n            input: usage?.inputTokens,\n            output: usage?.outputTokens,\n            total: usage?.totalTokens,\n          },\n          cost,\n        });\n      }\n\n      return {\n        role: \"assistant\",\n        content: JSON.stringify(object),\n        metadata: {\n          ...(cacheStats\n            ? {\n                anthropicCache: {\n                  inputTokens: cacheStats.input_tokens || 0,\n                  cacheCreationInputTokens:\n                    cacheStats.cache_creation_input_tokens || 0,\n                  cacheReadInputTokens: cacheStats.cache_read_input_tokens || 0,\n                },\n              }\n            : {}),\n        },\n      };\n    }\n\n    const result = await generateText({\n      model: aiModel,\n      messages: messages as any, // Cast to any to preserve experimental_providerMetadata for cache control\n      temperature,\n      maxOutputTokens,\n      tools,\n      stopWhen:\n        toolExecutionMode === \"custom\" ? stepCountIs(1) : stepCountIs(12),\n      onStepFinish: (step) => {\n        step.content.forEach((stepContent) => {\n          if (stepContent.type === \"tool-call\") {\n            try {\n              const sc: any = stepContent as any;\n              const toolCallId =\n                sc.toolCallId ??\n                sc.id ??\n                sc.callId ??\n                `${Date.now()}-${Math.random()}`;\n              const toolName = sc.toolName ?? sc.name ?? \"unknown\";\n              const args = sc.args ?? sc.input ?? sc.parameters;\n              langfuse.startToolSpanForSession(\n                options.context.sessionToken,\n                toolCallId,\n                toolName,\n                args\n              );\n            } catch {}\n            sendUpdate({\n              type: \"tool_execution\",\n              content: JSON.stringify(stepContent),\n            });\n          }\n\n          if (stepContent.type === \"tool-result\") {\n            try {\n              const sc: any = stepContent as any;\n              const toolCallId = sc.toolCallId ?? sc.id ?? sc.callId;\n              const result = sc.result ?? sc.output ?? sc.data;\n              langfuse.endToolSpanForSession(\n                options.context.sessionToken,\n                toolCallId,\n                result\n              );\n            } catch {}\n            sendUpdate({\n              type: \"tool_response\",\n              content: JSON.stringify(stepContent),\n            });\n          }\n        });\n      },\n      experimental_telemetry: {\n        isEnabled: true,\n        functionId: \"llm-generation\",\n        metadata: {\n          langfuseTraceId: parentTraceId,\n          langfuseUpdateParent: false,\n          sessionId: options.context.sessionToken,\n          ...(traceContext?.userId ? { userId: traceContext.userId } : {}),\n          ...(traceContext?.tags ? { tags: traceContext.tags } : {}),\n        },\n      },\n    });\n\n    // Log cache statistics for Anthropic\n    // Cache stats are in result.response.body.usage for Anthropic\n    const cacheStatsText =\n      sdkProvider === \"anthropic\"\n        ? (result as any)?.response?.body?.usage\n        : null;\n\n    if (cacheStatsText && sdkProvider === \"anthropic\") {\n      console.log(\"💰 [Cache] Input tokens:\", cacheStatsText.input_tokens || 0);\n      console.log(\n        \"📦 [Cache] Cache creation:\",\n        cacheStatsText.cache_creation_input_tokens || 0\n      );\n      console.log(\n        \"✨ [Cache] Cache read:\",\n        cacheStatsText.cache_read_input_tokens || 0\n      );\n\n      if (cacheStatsText.cache_read_input_tokens > 0) {\n        const savings = Math.round(\n          (cacheStatsText.cache_read_input_tokens /\n            cacheStatsText.input_tokens) *\n            100\n        );\n        console.log(\n          `🎉 [Cache] CACHE HIT! ${cacheStatsText.cache_read_input_tokens} tokens from cache (${savings}% of input)`\n        );\n      }\n      if (cacheStatsText.cache_creation_input_tokens > 0) {\n        console.log(\n          `📝 [Cache] Created cache for ${cacheStatsText.cache_creation_input_tokens} tokens (5 min TTL)`\n        );\n      }\n    }\n\n    // End generation with success if tracing\n    if (generation) {\n      const usage = result.usage;\n      const cost = langfuseService.calculateCost(model, {\n        total: usage?.totalTokens,\n        input: usage?.inputTokens,\n        output: usage?.outputTokens,\n      });\n\n      generation.end({\n        output: result.text,\n        usage: {\n          input: usage?.inputTokens,\n          output: usage?.outputTokens,\n          total: usage?.totalTokens,\n        },\n        cost,\n      });\n    }\n\n    return {\n      role: \"assistant\",\n      content: result.text,\n      metadata: {\n        ...(cacheStatsText\n          ? {\n              anthropicCache: {\n                inputTokens: cacheStatsText.input_tokens || 0,\n                cacheCreationInputTokens:\n                  cacheStatsText.cache_creation_input_tokens || 0,\n                cacheReadInputTokens:\n                  cacheStatsText.cache_read_input_tokens || 0,\n              },\n            }\n          : {}),\n      },\n    };\n  };\n\n  const runStreamedLLM = async (options: LLMServiceOptions): Promise<{\n    textStream: AsyncIterable<string>;\n    generation: any;\n  }> => {\n    const {\n      model = defaultModel,\n      provider,\n      messages,\n      temperature = 0.7,\n      maxOutputTokens,\n      traceContext,\n    } = options;\n\n    const generation = langfuse.createGenerationForSession(\n      options.context.sessionToken,\n      {\n        input: options.messages,\n        model,\n        name: \"llm-streaming\",\n        metadata: {\n          ...options.context.metadata,\n          streaming: true,\n        },\n      }\n    );\n\n    // Select AI model based on provider\n    let aiModel;\n    if (provider === \"anthropic\") {\n      aiModel = anthropic(model);\n    } else if (provider === \"openrouter\") {\n      const openrouter = createOpenRouter({\n        apiKey: process.env.OPENROUTER_API_KEY,\n      });\n      aiModel = openrouter.chat(model);\n    } else {\n      aiModel = openai(model);\n    }\n\n    const result = await streamText({\n      model: aiModel,\n      messages: messages as any,\n      temperature,\n      maxOutputTokens,\n    });\n\n    return { textStream: result.textStream, generation };\n  };\n\n  const runStreamedLLMWithTools = async (\n    options: LLMServiceOptions & { tools?: any[] }\n  ): Promise<{\n    textStream: AsyncIterable<string>;\n    generation: any;\n  }> => {\n    const {\n      model = defaultModel,\n      provider,\n      messages,\n      tools = [],\n      temperature = 0.1,\n      maxOutputTokens,\n      traceContext,\n      sendUpdate,\n    } = options;\n\n    const generation = langfuse.createGenerationForSession(\n      options.context.sessionToken,\n      {\n        input: options.messages,\n        model,\n        name: \"llm-streaming-tools\",\n        metadata: {\n          ...options.context.metadata,\n          streaming: true,\n          toolCount: tools.length,\n        },\n      }\n    );\n\n    // Select AI model based on provider\n    let aiModel;\n    if (provider === \"anthropic\") {\n      aiModel = anthropic(model);\n    } else if (provider === \"openrouter\") {\n      const openrouter = createOpenRouter({\n        apiKey: process.env.OPENROUTER_API_KEY,\n      });\n      aiModel = openrouter.chat(model);\n    } else {\n      aiModel = openai(model);\n    }\n\n    const result = await streamText({\n      model: aiModel,\n      messages: messages as any,\n      temperature,\n      maxOutputTokens,\n      tools: tools && tools.length > 0 ? (tools as any) : undefined,\n      onStepFinish: (step) => {\n        // Tool telemetry\n        step.content.forEach((content) => {\n          if (content.type === \"tool-call\") {\n            const sc: any = content;\n            const toolCallId =\n              sc.toolCallId ?? sc.id ?? sc.callId ?? `${Date.now()}-${Math.random()}`;\n            const toolName = sc.toolName ?? sc.name ?? \"unknown\";\n            const args = sc.args ?? sc.input ?? sc.parameters;\n            langfuse.startToolSpanForSession(\n              options.context.sessionToken,\n              toolCallId,\n              toolName,\n              args\n            );\n            if (sendUpdate) {\n              sendUpdate({\n                type: \"tool_execution\",\n                content: JSON.stringify(content),\n              });\n            }\n          }\n\n          if (content.type === \"tool-result\") {\n            const sc: any = content;\n            const toolCallId = sc.toolCallId ?? sc.id ?? sc.callId;\n            const result = sc.result ?? sc.output ?? sc.data;\n            langfuse.endToolSpanForSession(\n              options.context.sessionToken,\n              toolCallId,\n              result\n            );\n            if (sendUpdate) {\n              sendUpdate({\n                type: \"tool_response\",\n                content: JSON.stringify(content),\n              });\n            }\n          }\n        });\n      },\n    });\n\n    return { textStream: result.textStream, generation };\n  };\n\n  const isAvailable = async (): Promise<boolean> => {\n    try {\n      // Simple test to check if the API is accessible\n      // Use configured default model and provider\n      let testModel;\n\n      if (defaultProvider === \"anthropic\") {\n        testModel = anthropic(defaultModel);\n      } else if (defaultProvider === \"openrouter\") {\n        const openrouter = createOpenRouter({\n          apiKey: process.env.OPENROUTER_API_KEY,\n        });\n        testModel = openrouter.chat(defaultModel);\n      } else {\n        testModel = openai(defaultModel);\n      }\n\n      await generateText({\n        model: testModel,\n        messages: [\n          {\n            role: \"user\",\n            content: \"test\",\n          },\n        ],\n        maxOutputTokens: 1,\n      });\n      return true;\n    } catch {\n      return false;\n    }\n  };\n\n  return {\n    runLLM,\n    runStreamedLLM,\n    runStreamedLLMWithTools,\n    isAvailable,\n  };\n};\n","import {\n  type Agent,\n  type BaseAgentConfig,\n  type AgentMetadata,\n  type AgentInput,\n} from \"../types/agent.types.js\";\nimport { type LLMService } from \"../types/llm.types.js\";\nimport { baseLLMService } from \"../services/base.llm.service.js\";\n\nexport interface BaseAgent extends Omit<Agent, \"act\" | \"sendUpdate\"> {\n  availableTools: Record<string, any>;\n  llmService: LLMService;\n}\n\n// Extended BaseAgentConfig to include optional llmService\nexport interface BaseAgentConfigWithLLM extends BaseAgentConfig {\n  llmService?: LLMService;\n}\n\n// --- Base Agent ---\nexport const createBaseAgent = ({\n  id,\n  type,\n  availableTools = {},\n  metadata,\n  llmService,\n}: BaseAgentConfigWithLLM): BaseAgent => {\n  // Use provided LLM service or default to baseLLMService\n  const llm = llmService || baseLLMService();\n\n  // Default metadata for the agent\n  const getMetadata = (): AgentMetadata => {\n    return {\n      // id:,\n      // type: type || \"\",\n      // name: metadata?.name || `${type} Agent`,\n      // description: metadata?.description || `A ${type} agent`,\n      // capabilities: metadata?.capabilities || [],\n      // icon: metadata?.icon || \"🤖\",\n      // version: metadata?.version || \"1.0.0\",\n      // author: metadata?.author || \"System\",\n      ...(metadata as AgentMetadata),\n    };\n  };\n\n  // Input validation\n  const validateInput = (input: AgentInput | string): boolean => {\n    if (typeof input === \"string\") {\n      return input.trim().length > 0;\n    }\n\n    if (typeof input === \"object\" && input.messages) {\n      return Array.isArray(input.messages) && input.messages.length > 0;\n    }\n\n    return false;\n  };\n\n  return {\n    llmService: llm,\n    id,\n    type,\n    availableTools,\n    getMetadata,\n    validateInput,\n  };\n};\n","import type { Tool, ToolLike, ToolResult } from \"../types/tool.types.js\";\nimport type { ToolCall } from \"../types/llm.types.js\";\n\n/**\n * Tool executor options\n */\nexport interface ToolExecutorOptions {\n  maxRetries?: number;\n  defaultTimeout?: number;\n  // observability?: ObservabilityService; // Removed - using simple Langfuse integration\n  onToolRegister?: (tool: ToolLike) => void;\n}\n\n/**\n * Create a tool executor service for Vercel AI SDK tools\n */\nexport const createToolExecutor = (options?: ToolExecutorOptions) => {\n  const config = {\n    maxRetries: options?.maxRetries ?? 3,\n    defaultTimeout: options?.defaultTimeout ?? 30000,\n  };\n\n  // Observability tracking can be added to Langfuse if needed\n\n  // Registry of tools by name\n  const toolRegistry = new Map<string, ToolLike>();\n\n  /**\n   * Register a tool\n   */\n  const registerTool = (tool: ToolLike) => {\n    if (!tool.name) {\n      throw new Error(\"Tool must have a name\");\n    }\n    options?.onToolRegister?.(tool);\n    toolRegistry.set(tool.name, tool);\n  };\n\n  /**\n   * Unregister a tool\n   */\n  const unregisterTool = (toolName: string) => {\n    return toolRegistry.delete(toolName);\n  };\n\n  /**\n   * Get all registered tools\n   */\n  const getAvailableTools = (): ToolLike[] => {\n    return Array.from(toolRegistry.values());\n  };\n\n  /**\n   * Get a specific tool\n   */\n  const getTool = (toolName: string): ToolLike | undefined => {\n    return toolRegistry.get(toolName);\n  };\n\n  /**\n   * Execute a single tool call\n   */\n  const executeToolCall = async (\n    toolCall: ToolCall,\n    context?: { agentId?: string }\n  ): Promise<ToolResult> => {\n    const startTime = Date.now();\n    const tool = toolRegistry.get(toolCall.toolName);\n\n    if (!tool) {\n      // Tool execution tracking can be added to Langfuse if needed\n\n      return {\n        toolCallId: toolCall.toolCallId,\n        toolName: toolCall.toolName,\n        result: {\n          error: `Tool '${toolCall.toolName}' not found`,\n        },\n      };\n    }\n\n    try {\n      // Execute the tool with timeout\n      const timeoutPromise = new Promise((_, reject) => {\n        setTimeout(\n          () => reject(new Error(\"Tool execution timed out\")),\n          config.defaultTimeout\n        );\n      });\n\n      const executePromise = tool.execute\n        ? tool.execute(toolCall.args as any, {\n            toolCallId: toolCall.toolCallId,\n            messages: [], // Empty messages for now\n          })\n        : Promise.reject(new Error(\"Tool has no execute function\"));\n\n      const result = await Promise.race([executePromise, timeoutPromise]);\n\n      // Tool execution tracking can be added to Langfuse if needed\n\n      return {\n        toolCallId: toolCall.toolCallId,\n        toolName: toolCall.toolName,\n        result,\n      };\n    } catch (error) {\n      const errorMessage =\n        error instanceof Error ? error.message : \"Unknown error\";\n\n      // Tool execution tracking can be added to Langfuse if needed\n\n      return {\n        toolCallId: toolCall.toolCallId,\n        toolName: toolCall.toolName,\n        result: {\n          error: errorMessage,\n        },\n      };\n    }\n  };\n\n  /**\n   * Execute multiple tool calls\n   */\n  const executeToolCalls = async (\n    toolCalls: ToolCall[],\n    context?: { agentId?: string }\n  ): Promise<ToolResult[]> => {\n    // Batch execution tracking can be added to Langfuse if needed\n\n    const results = await Promise.all(\n      toolCalls.map((toolCall) => executeToolCall(toolCall, context))\n    );\n\n    // Record batch completion\n    // Batch completion tracking can be added to Langfuse if needed\n\n    return results;\n  };\n\n  /**\n   * Clear all tools\n   */\n  const clearTools = () => {\n    toolRegistry.clear();\n  };\n\n  return {\n    // Tool management\n    registerTool,\n    unregisterTool,\n    getAvailableTools,\n    getTool,\n    clearTools,\n\n    // Tool execution\n    executeToolCall,\n    executeToolCalls,\n\n    // Config\n    getConfig: () => ({ ...config }),\n  };\n};\n\n/**\n * Type for the tool executor service\n */\nexport type ToolExecutor = ReturnType<typeof createToolExecutor>;\n","import { experimental_createMCPClient } from \"@ai-sdk/mcp\";\n\nexport interface MCPServerConfig {\n  name: string;\n  url: string;\n  type: \"http\" | \"sse\";\n  authToken?: string;\n  headers?: Record<string, string>;\n}\n\nexport interface MCPClientService {\n  clients: Map<string, any>;\n  getAllTools: () => Promise<Record<string, any>>;\n  closeAll: () => Promise<void>;\n}\n\n/**\n * Create MCP client service that manages multiple MCP server connections\n * and merges their tools for use with AI SDK\n */\nexport const createMCPClientService = async (\n  servers: MCPServerConfig[]\n): Promise<MCPClientService> => {\n  const clients = new Map<string, any>();\n\n  console.log(`[MCP Service] Initializing ${servers.length} MCP server(s)...`);\n\n  // Initialize each MCP server\n  for (const server of servers) {\n    try {\n      console.log(`[MCP Service] Connecting to ${server.name} at ${server.url}...`);\n\n      const client = await experimental_createMCPClient({\n        transport: {\n          type: server.type,\n          url: server.url,\n          headers: {\n            ...(server.authToken\n              ? { Authorization: `Bearer ${server.authToken}` }\n              : {}),\n            ...(server.headers || {}),\n          },\n        },\n      });\n\n      clients.set(server.name, client);\n      console.log(`[MCP Service] ✅ Connected to ${server.name}`);\n    } catch (error) {\n      console.error(\n        `[MCP Service] ❌ Failed to connect to ${server.name}:`,\n        error\n      );\n      // Continue with other servers even if one fails\n    }\n  }\n\n  /**\n   * Get all tools from all connected MCP servers\n   * Merges tools into a single object for AI SDK\n   */\n  const getAllTools = async (): Promise<Record<string, any>> => {\n    const allTools: Record<string, any> = {};\n\n    console.log(`[MCP Service] Fetching tools from ${clients.size} server(s)...`);\n\n    for (const [name, client] of clients.entries()) {\n      try {\n        const tools = await client.tools();\n        Object.assign(allTools, tools);\n        console.log(\n          `[MCP Service] ✅ Loaded ${Object.keys(tools).length} tool(s) from ${name}`\n        );\n      } catch (error) {\n        console.error(`[MCP Service] ❌ Failed to get tools from ${name}:`, error);\n      }\n    }\n\n    console.log(\n      `[MCP Service] Total MCP tools available: ${Object.keys(allTools).length}`\n    );\n    return allTools;\n  };\n\n  /**\n   * Close all MCP client connections\n   * Should be called when agent execution is complete\n   */\n  const closeAll = async (): Promise<void> => {\n    console.log(`[MCP Service] Closing ${clients.size} MCP client(s)...`);\n\n    for (const [name, client] of clients.entries()) {\n      try {\n        await client.close();\n        console.log(`[MCP Service] ✅ Closed ${name}`);\n      } catch (error) {\n        console.error(`[MCP Service] ❌ Error closing ${name}:`, error);\n      }\n    }\n\n    clients.clear();\n  };\n\n  return {\n    clients,\n    getAllTools,\n    closeAll,\n  };\n};\n\n","import { type AgentConfig } from \"./agent-config.schemas.js\";\nimport { langfuseService } from \"../services/LangfuseService/langfuse.service.js\";\nimport { createBaseAgent } from \"../agents/BaseAgent.js\";\nimport {\n  type Agent,\n  type AgentResponse,\n  type AgentActInput,\n} from \"../types/agent.types.js\";\nimport { type LLMService } from \"../types/llm.types.js\";\nimport { type ToolExecutor } from \"../services/tool-executor.service.js\";\nimport type { ProgressMessage } from \"../types/progress.types.js\";\nimport type {\n  VoiceService,\n  AudioResult,\n  TranscriptionResult,\n  VoiceOptions,\n  TranscribeOptions,\n} from \"../types/voice.types.js\";\nimport { createMCPClientService } from \"../services/mcp-client.service.js\";\n\ninterface BaseHandlerOptions {\n  sendUpdate: (data: ProgressMessage) => Promise<void>;\n}\n\ninterface BeforeActOptions extends BaseHandlerOptions {\n  input: AgentActInput;\n  config: AgentConfig;\n}\n\ninterface AfterResponseOptions extends BaseHandlerOptions {\n  response: AgentResponse;\n  input: AgentActInput;\n}\n\ninterface OnErrorOptions extends BaseHandlerOptions {\n  error: Error;\n  attempt: number;\n}\n\ninterface ValidateResponseOptions extends BaseHandlerOptions {\n  response: AgentResponse;\n}\n\ninterface TransformInputOptions extends BaseHandlerOptions {\n  input: AgentActInput;\n}\n\ninterface TransformOutputOptions extends BaseHandlerOptions {\n  output: AgentResponse;\n}\n\n// Custom handler types for hooks\nexport interface CustomHandlers {\n  beforeAct?: (options: BeforeActOptions) => Promise<AgentActInput>;\n  afterResponse?: (options: AfterResponseOptions) => Promise<AgentResponse>;\n  onError?: (\n    options: OnErrorOptions\n  ) => Promise<void | { retry: boolean; modifiedInput?: AgentActInput }>;\n  validateResponse?: (\n    options: ValidateResponseOptions\n  ) => Promise<{ isValid: boolean; errors?: string[] }>;\n  transformInput?: (options: TransformInputOptions) => Promise<AgentActInput>;\n  transformOutput?: (options: TransformOutputOptions) => Promise<AgentResponse>;\n}\n\nexport interface CreateConfigurableAgentOptions {\n  config: AgentConfig;\n  customHandlers?: CustomHandlers;\n  llmService?: LLMService;\n  toolExecutor?: ToolExecutor;\n  voiceService?: VoiceService;\n  // observability?: ObservabilityService; // Removed - using simple Langfuse integration\n}\n\n/**\n * Creates an agent based on configuration with optional custom handlers\n * Now async to support MCP client initialization\n */\nexport const createConfigurableAgent = async ({\n  config,\n  customHandlers = {},\n  llmService,\n  toolExecutor,\n  voiceService,\n}: CreateConfigurableAgentOptions): Promise<Agent> => {\n  // Create base agent with optional LLM service\n  const base = createBaseAgent({\n    id: config.id,\n    type: config.type,\n    llmService,\n  });\n\n  // Initialize MCP clients if configured\n  let mcpClientService: any = null;\n  let mcpTools: Record<string, any> = {};\n\n  if (config.tools?.mcpServers && config.tools.mcpServers.length > 0) {\n    try {\n      console.log(\n        `[${config.id}] Initializing ${config.tools.mcpServers.length} MCP server(s)...`\n      );\n      mcpClientService = await createMCPClientService(config.tools.mcpServers);\n      mcpTools = await mcpClientService.getAllTools();\n      console.log(\n        `[${config.id}] ✅ Loaded ${Object.keys(mcpTools).length} MCP tool(s)`\n      );\n    } catch (error) {\n      console.error(`[${config.id}] ❌ Failed to initialize MCP clients:`, error);\n      // Continue without MCP tools - don't block agent creation\n    }\n  }\n\n  // Prepare available tools from config\n  const availableTools: Record<string, any> = {\n    ...(config.tools?.custom || {}),\n    ...(config.tools?.mcp || {}), // Pre-configured MCP tools (if any)\n    ...mcpTools, // Tools from MCP servers\n    // TODO: Adapt builtin and agent tools\n  };\n\n  let sendUpdate: (data: ProgressMessage) => Promise<void> = async (data) => {\n    console.log(data);\n  };\n  /**\n   * Set the global send function for streaming updates\n   */\n  const setSendUpdate = (sendFn: (data: ProgressMessage) => Promise<void>) => {\n    sendUpdate = sendFn;\n  };\n\n  return {\n    ...base,\n    id: config.id,\n    type: config.type,\n    setSendUpdate,\n    availableTools: Object.keys(availableTools),\n    // Enhanced metadata with config info\n    getMetadata: () => ({\n      ...config.metadata,\n      configVersion: config.version,\n      orchestration: config.orchestration,\n      hooks: Object.keys(customHandlers),\n    }),\n\n    // Main act method with all enhancements\n    act: async (input) => {\n      await sendUpdate({\n        type: \"unknown\",\n        content: \"Agent starting to act.\",\n      });\n\n      let processedInput = input;\n      let attempt = 0;\n      const maxRetries = config.behavior?.maxRetries || 3;\n\n      // === Generic Langfuse tracing for all agents ===\n      if (!processedInput.context) processedInput.context = {} as any;\n      const ctx = processedInput.context as any;\n      const sessionToken = ctx.sessionToken as string;\n\n      // Create execution trace only if not already present for this session\n      const existingTrace = langfuseService.getCurrentTrace(sessionToken);\n      if (!existingTrace) {\n        langfuseService.createExecutionTrace(\n          sessionToken,\n          config.type,\n          processedInput,\n          typeof ctx.conversationId === \"number\"\n            ? (ctx.conversationId as number)\n            : undefined,\n          {\n            agentId: config.id,\n            agentVersion: config.version,\n          }\n        );\n      }\n\n      // Open a top-level span and emit start event\n      langfuseService.createSpanForSession(sessionToken, \"agent-act\", {\n        agentId: config.id,\n        agentType: config.type,\n      });\n      langfuseService.addEventToSession(sessionToken, \"agent-start\", {\n        agentId: config.id,\n        agentType: config.type,\n      });\n\n      // Determine model from priority chain (outside try-catch for fallback access)\n      const modelToUse =\n        (processedInput.context as any)?.model || // 1. Runtime override (highest priority)\n        config.behavior?.model || // 2. Behavior schema\n        config.customConfig?.model || // 3. Custom config\n        undefined; // 4. Let LLM service use its default\n\n      const providerToUse =\n        (processedInput.context as any)?.provider ||\n        config.behavior?.provider ||\n        config.customConfig?.provider ||\n        undefined;\n\n      // Log model selection for transparency\n      if (modelToUse) {\n        console.log(\n          `🤖 [${config.id}] Using model: ${modelToUse}${\n            providerToUse ? ` (provider: ${providerToUse})` : \"\"\n          }`\n        );\n      }\n\n      // Track validation results for error correction on retries\n      let lastValidationResult: { isValid: boolean; errors?: string[] } | null =\n        null;\n\n      // Execute with retry logic\n      while (attempt < maxRetries) {\n        attempt++;\n\n        try {\n          // Hook: transformInput\n          if (customHandlers.transformInput) {\n            processedInput = await customHandlers.transformInput({\n              input: processedInput,\n              sendUpdate,\n            });\n          }\n\n          // Hook: beforeAct\n          if (customHandlers.beforeAct) {\n            processedInput = await customHandlers.beforeAct({\n              input: processedInput,\n              config,\n              sendUpdate,\n            });\n          }\n\n          // Prepare initial messages with system prompt\n          // Add cache control for Anthropic if systemCache is enabled in config\n          const shouldCacheSystemPrompt =\n            config.prompts.systemCache && providerToUse === \"anthropic\";\n\n          let workingMessages = [\n            {\n              role: \"system\" as const,\n              content: config.prompts.system,\n              ...(shouldCacheSystemPrompt\n                ? {\n                    experimental_providerMetadata: {\n                      anthropic: {\n                        cacheControl: { type: \"ephemeral\" as const },\n                      },\n                    },\n                  }\n                : {}),\n            },\n            // Transform all input messages to preserve cache control\n            ...processedInput.messages.map((msg: any) => {\n              // If message has providerOptions.anthropic.cacheControl, transform to AI SDK v5 format\n              if (msg.providerOptions?.anthropic?.cacheControl) {\n                return {\n                  ...msg,\n                  experimental_providerMetadata: {\n                    anthropic: {\n                      cacheControl: msg.providerOptions.anthropic.cacheControl,\n                    },\n                  },\n                };\n              }\n              return msg;\n            }),\n          ];\n\n          // Debug: Log cache control settings for Anthropic\n          if (providerToUse === \"anthropic\") {\n            console.log(\n              `🔧 [${config.id}] System cache: ${\n                shouldCacheSystemPrompt ? \"ENABLED\" : \"DISABLED\"\n              }`\n            );\n            const cachedMessages = workingMessages.filter(\n              (m: any) =>\n                m.experimental_providerMetadata?.anthropic?.cacheControl\n            );\n            console.log(\n              `📦 [${config.id}] Messages with cache control: ${cachedMessages.length}`\n            );\n          }\n\n          // Add error correction message if we have validation errors from previous attempt\n          if (\n            lastValidationResult &&\n            !lastValidationResult.isValid &&\n            config.prompts.errorCorrection\n          ) {\n            console.log(\n              `🔄 [${config.id}] Adding error correction message (attempt ${attempt}/${maxRetries})`\n            );\n            workingMessages.push({\n              role: \"user\" as const,\n              content: config.prompts.errorCorrection.replace(\n                \"{errors}\",\n                JSON.stringify(\n                  lastValidationResult.errors || lastValidationResult\n                )\n              ),\n            });\n          }\n\n          // Internal loop for handling tool calls\n          let response: AgentResponse = { role: \"assistant\", content: null };\n          const maxToolRounds = 3; // Configurable limit for tool rounds\n          let toolRound = 0;\n\n          while (toolRound < maxToolRounds) {\n            toolRound++;\n            sendUpdate({\n              type: \"thinking\",\n              content: \"Thinking\",\n            });\n\n            try {\n              // Merge static + per-call LLM options\n              const mergedLlmOptions = {\n                ...(config.customConfig?.llmOptions || {}),\n                ...((processedInput.context as any)?.llmOptions || {}),\n              } as any;\n\n              // Execute LLM call with tools and optional structured output\n              const llmResponse = await base.llmService.runLLM({\n                messages: workingMessages,\n                tools: availableTools,\n                sendUpdate,\n                context: processedInput.context,\n                model: modelToUse, // Pass model from priority chain\n                provider: providerToUse, // Pass provider to determine which AI SDK to use\n                traceContext: {\n                  sessionId: processedInput.context?.sessionId,\n                  metadata: {\n                    ...processedInput.context?.metadata,\n                    modelUsed: modelToUse,\n                    providerUsed: providerToUse,\n                  },\n                },\n                // Add merged LLM options (responseFormat, schema, maxOutputTokens, etc.)\n                ...mergedLlmOptions,\n                // Ensure behavior.responseFormat is respected if not overridden at runtime\n                responseFormat:\n                  mergedLlmOptions.responseFormat ??\n                  config.behavior?.responseFormat,\n                // Allow schema to be supplied via runtime or config.customConfig\n                schema:\n                  mergedLlmOptions.schema ??\n                  (config as any)?.customConfig?.schema,\n              });\n\n              response = llmResponse;\n            } catch (llmError) {\n              // Hook: onError for LLM errors\n              if (customHandlers.onError) {\n                const errorResult = await customHandlers.onError({\n                  error: llmError as Error,\n                  attempt,\n                  sendUpdate,\n                });\n                if (errorResult && errorResult.retry && attempt < maxRetries) {\n                  if (errorResult.modifiedInput) {\n                    processedInput = errorResult.modifiedInput;\n                  }\n                  continue; // Retry outer loop\n                }\n              }\n              throw llmError;\n            }\n\n            // Hook: afterResponse\n            if (customHandlers.afterResponse) {\n              response = await customHandlers.afterResponse({\n                response,\n                input: processedInput,\n                sendUpdate,\n              });\n            }\n\n            // If no tool calls, we're done\n            if (!response.toolCalls || response.toolCalls.length === 0) {\n              break;\n            }\n\n            // If we have a tool executor, use it (custom mode)\n            // Otherwise, assume the LLM service handled it (vercel-native mode)\n            if (toolExecutor) {\n              // Execute tool calls with our tool executor\n              // Execute tools and get responses (ensure args is always present)\n              const toolCallsWithArgs = response.toolCalls.map((tc) => ({\n                ...tc,\n                args: tc.args ?? {},\n              }));\n              const toolResponses = await toolExecutor.executeToolCalls(\n                toolCallsWithArgs,\n                {\n                  agentId: config.id,\n                }\n              );\n\n              // Add assistant message with tool calls to working messages\n              workingMessages.push({\n                role: \"assistant\" as const,\n                content: response.content,\n                toolCalls: response.toolCalls,\n              });\n\n              // Add tool responses to working messages\n              for (const toolResponse of toolResponses) {\n                workingMessages.push({\n                  role: \"tool\" as const,\n                  content: JSON.stringify(toolResponse.result),\n                  tool_call_id: toolResponse.toolCallId,\n                  tool_name: toolResponse.toolName,\n                });\n              }\n\n              // Add tool responses to the response metadata\n              response = {\n                ...response,\n                metadata: {\n                  ...(response.metadata || {}),\n                  toolResponses,\n                },\n              };\n\n              // Continue loop to get final response from LLM\n            } else {\n              // No tool executor, assume LLM service handled it\n              break;\n            }\n          }\n\n          // Hook: validateResponse (only validate final response)\n          if (\n            customHandlers.validateResponse ||\n            config.behavior?.validateResponse\n          ) {\n            let validationResult;\n\n            if (customHandlers.validateResponse) {\n              validationResult = await customHandlers.validateResponse({\n                response,\n                sendUpdate,\n              });\n            } else {\n              // Default validation: ensure response has content\n              validationResult = {\n                isValid: !!response.content,\n                errors: response.content ? [] : [\"Response has no content\"],\n              };\n            }\n\n            if (!validationResult.isValid) {\n              // Store validation result for error correction on next attempt\n              lastValidationResult = validationResult;\n\n              const validationError = new Error(\n                `Response validation failed: ${validationResult.errors?.join(\n                  \", \"\n                )}`\n              );\n\n              // Hook: onError for validation errors\n              if (customHandlers.onError) {\n                const errorResult = await customHandlers.onError({\n                  error: validationError,\n                  attempt,\n                  sendUpdate,\n                });\n                if (errorResult && errorResult.retry && attempt < maxRetries) {\n                  if (errorResult.modifiedInput) {\n                    processedInput = errorResult.modifiedInput;\n                  }\n                  console.log(\n                    `🔄 [${config.id}] Retrying (attempt ${\n                      attempt + 1\n                    }/${maxRetries}) with error feedback...`\n                  );\n                  continue; // Retry with error correction message\n                }\n              }\n              throw validationError;\n            }\n          }\n\n          // Hook: transformOutput\n          if (customHandlers.transformOutput) {\n            response = await customHandlers.transformOutput({\n              output: response,\n              sendUpdate,\n            });\n          }\n\n          // Close trace on success\n          try {\n            langfuseService.addEventToSession(sessionToken, \"agent-end\", {\n              toolCalls: response.toolCalls?.length || 0,\n            });\n            langfuseService.endSpanForSession(sessionToken, \"agent-act\");\n            langfuseService.endExecutionTrace(sessionToken, {\n              contentPreview:\n                typeof response.content === \"string\"\n                  ? response.content.slice(0, 500)\n                  : undefined,\n            });\n          } catch {}\n\n          // Close MCP clients on successful completion\n          if (mcpClientService) {\n            try {\n              await mcpClientService.closeAll();\n            } catch (closeError) {\n              console.error(`[${config.id}] Error closing MCP clients:`, closeError);\n            }\n          }\n\n          return response;\n        } catch (error) {\n          // Error tracking can be added to Langfuse if needed\n\n          // Final error handling\n          if (attempt >= maxRetries) {\n            // Hook: onError for final failure\n            if (customHandlers.onError) {\n              await customHandlers.onError({\n                error: error as Error,\n                attempt,\n                sendUpdate,\n              });\n            }\n\n            // If we have a fallback prompt, try it\n            if (config.prompts.fallback) {\n              const fallbackMessages = [\n                { role: \"system\" as const, content: config.prompts.fallback },\n                ...input.messages,\n              ];\n\n              try {\n                const fallbackResponse = await base.llmService.runLLM({\n                  sendUpdate,\n                  messages: fallbackMessages,\n                  context: processedInput.context,\n                  model: modelToUse,\n                  provider: providerToUse,\n                  traceContext: {\n                    sessionId: processedInput.context?.sessionId,\n                    metadata: {\n                      ...processedInput.context?.metadata,\n                    },\n                  },\n                });\n\n                // Close trace on fallback success\n                try {\n                  langfuseService.addEventToSession(sessionToken, \"agent-end\", {\n                    fallback: true,\n                  });\n                  langfuseService.endSpanForSession(sessionToken, \"agent-act\");\n                  langfuseService.endExecutionTrace(sessionToken, {\n                    contentPreview:\n                      typeof fallbackResponse.content === \"string\"\n                        ? fallbackResponse.content.slice(0, 500)\n                        : undefined,\n                    fallback: true,\n                  });\n                } catch {}\n\n                return fallbackResponse;\n              } catch (fallbackError) {\n                // Fallback also failed\n                throw new Error(\n                  `Agent execution failed after ${attempt} attempts. Original error: ${error}. Fallback error: ${fallbackError}`\n                );\n              }\n            }\n\n            // End trace on final error\n            try {\n              langfuseService.addEventToSession(sessionToken, \"agent-error\", {\n                attempt,\n                message: (error as Error)?.message,\n              });\n              langfuseService.endSpanForSession(\n                sessionToken,\n                \"agent-act\",\n                undefined,\n                error as Error\n              );\n              langfuseService.endExecutionTrace(\n                sessionToken,\n                undefined,\n                error as Error\n              );\n            } catch {}\n\n            // Close MCP clients on error\n            if (mcpClientService) {\n              try {\n                await mcpClientService.closeAll();\n              } catch (closeError) {\n                console.error(`[${config.id}] Error closing MCP clients on error:`, closeError);\n              }\n            }\n\n            throw error;\n          }\n        }\n      }\n\n      // End trace if we somehow exit the loop\n      try {\n        langfuseService.addEventToSession(sessionToken, \"agent-error\", {\n          message: \"Exited loop unexpectedly\",\n        });\n        langfuseService.endSpanForSession(sessionToken, \"agent-act\");\n        langfuseService.endExecutionTrace(\n          sessionToken,\n          undefined,\n          new Error(\"Unexpected end of retry loop\")\n        );\n      } catch {}\n\n      // Should never reach here\n      throw new Error(\"Unexpected end of retry loop\");\n    },\n\n    // Voice capabilities (if voice service is provided)\n    voiceService,\n\n    // Voice methods\n    speak: voiceService\n      ? async (text: string, options?: VoiceOptions): Promise<AudioResult> => {\n          sendUpdate({ type: \"speaking_start\", content: text });\n\n          try {\n            const audio = await voiceService.synthesize(text, {\n              ...config.voice?.defaultOptions,\n              ...options,\n              voiceId: options?.voiceId || config.voice?.voiceId,\n            });\n\n            sendUpdate({ type: \"speaking_complete\", content: text });\n            return audio;\n          } catch (error) {\n            sendUpdate({\n              type: \"error\",\n              content: `Voice synthesis failed: ${error}`,\n            });\n            throw error;\n          }\n        }\n      : undefined,\n\n    listen: voiceService\n      ? async (options?: TranscribeOptions): Promise<TranscriptionResult> => {\n          sendUpdate({ type: \"listening_start\", content: \"Listening...\" });\n\n          throw new Error(\n            \"Listen method requires audio input - implement in your application layer\"\n          );\n        }\n      : undefined,\n\n    hasVoice: () => !!voiceService,\n    canSpeak: () => !!voiceService?.synthesize,\n    canListen: () => !!voiceService?.transcribe,\n  };\n};\n","import { ChatMessageSchema } from \"../types/index.js\";\n\nexport const validateChatMessage = (data: unknown) => {\n  const result = ChatMessageSchema.safeParse(data);\n  if (!result.success) {\n    return { success: false, data: null, error: result.error };\n  }\n  return { success: true, data: result.data, error: null };\n};\n","import { validateChatMessage } from \"./factories/configurable-agent.factory.types.js\";\nimport type { ChatMessage } from \"./types/llm.types.js\";\n\nexport const transformMessagesForAI = (\n  conversationHistory: any[]\n): ChatMessage[] => {\n  const transformedMessages = conversationHistory.reduce((acc, msg) => {\n    // For regular user messages\n    if (msg.role === \"user\") {\n      const userMessage = {\n        role: \"user\" as const,\n        content: msg.content,\n      };\n\n      const validation = validateChatMessage(userMessage);\n      if (validation.success) {\n        acc.push(validation.data);\n      } else {\n        console.warn(\n          \"⚠️ Invalid user message in conversation history:\",\n          validation.error\n        );\n        acc.push(userMessage); // Add anyway for graceful degradation\n      }\n      return acc;\n    }\n\n    // For assistant messages with tool calls\n    if (msg.role === \"assistant\" && msg.tool_call_id) {\n      try {\n        const functionCall = JSON.parse(msg.content);\n        const assistantMessage = {\n          role: \"assistant\" as const,\n          content: null, // Content should be null when there's a tool call\n          tool_calls: [\n            {\n              id: msg.tool_call_id,\n              type: \"function\" as const,\n              function: {\n                name: functionCall.name,\n                arguments: functionCall.arguments,\n              },\n            },\n          ],\n        };\n\n        const validation = validateChatMessage(assistantMessage);\n        if (validation.success) {\n          acc.push(validation.data);\n        } else {\n          console.warn(\n            \"⚠️ Invalid assistant tool call message:\",\n            validation.error\n          );\n          acc.push(assistantMessage); // Add anyway\n        }\n      } catch (e) {\n        console.error(\"Failed to parse tool call:\", e);\n      }\n      return acc;\n    }\n\n    // For regular assistant messages (without tool calls)\n    if (msg.role === \"assistant\" && !msg.tool_call_id) {\n      const assistantMessage = {\n        role: \"assistant\" as const,\n        content: msg.content,\n      };\n\n      const validation = validateChatMessage(assistantMessage);\n      if (validation.success) {\n        acc.push(validation.data);\n      } else {\n        console.warn(\"⚠️ Invalid assistant message:\", validation.error);\n        acc.push(assistantMessage); // Add anyway\n      }\n      return acc;\n    }\n\n    // For tool messages\n    if (msg.role === \"tool\" && msg.tool_call_id) {\n      const toolMessage = {\n        role: \"tool\" as const,\n        content: msg.content,\n        tool_call_id: msg.tool_call_id,\n      };\n\n      const validation = validateChatMessage(toolMessage);\n      if (validation.success) {\n        acc.push(validation.data);\n      } else {\n        console.warn(\"⚠️ Invalid tool message:\", validation.error);\n        acc.push(toolMessage); // Add anyway\n      }\n      return acc;\n    }\n\n    return acc;\n  }, [] as ChatMessage[]);\n\n  console.info(\n    `✅ Transformed ${conversationHistory.length} messages to ${transformedMessages.length} valid AI messages`\n  );\n  return transformedMessages;\n};\n\nexport const getLastUserMessage = (conversationHistory: ChatMessage[]) => {\n  const userMessages = conversationHistory.filter((msg) => msg.role === \"user\");\n  return userMessages[userMessages.length - 1];\n};\n","import type { ChatMessage } from \"../types/llm.types.js\";\n\n/**\n * Event handlers for conversation history operations\n */\nexport interface ConversationHistoryHandlers {\n  onMessageAdded?: (message: ChatMessage) => Promise<void>;\n  onToolResponseAdded?: (toolResponse: {\n    toolCallId: string;\n    toolName: string;\n    result: any;\n  }) => Promise<void>;\n  onCleared?: () => Promise<void>;\n}\n\n/**\n * Options for creating a conversation history\n */\nexport interface ConversationHistoryOptions {\n  maxMessages?: number; // Optional limit on history size\n  systemPrompt?: string; // Optional initial system prompt\n  handlers?: ConversationHistoryHandlers; // Event handlers\n}\n\n/**\n * Creates a conversation history manager - atomic primitive for managing message history\n *\n * This is the most basic building block for conversation management.\n * It handles the storage and retrieval of messages in a conversation.\n */\nexport const createConversationHistory = (\n  options?: ConversationHistoryOptions\n) => {\n  const config = {\n    maxMessages: options?.maxMessages ?? Infinity,\n    systemPrompt: options?.systemPrompt,\n  };\n\n  // Internal message storage using closure\n  let messages: ChatMessage[] = [];\n\n  // Add system prompt if provided\n  if (config.systemPrompt) {\n    messages.push({\n      role: \"system\",\n      content: config.systemPrompt,\n    });\n  }\n\n  /**\n   * Add a message to the conversation history\n   */\n  const addMessage = async (message: ChatMessage) => {\n    messages.push(message);\n\n    // Trim history if needed (keep system prompt + recent messages)\n    if (messages.length > config.maxMessages) {\n      const systemMessages = messages.filter((m) => m.role === \"system\");\n      const nonSystemMessages = messages.filter((m) => m.role !== \"system\");\n      const trimmedMessages = nonSystemMessages.slice(\n        -config.maxMessages + systemMessages.length\n      );\n      messages.length = 0;\n      messages.push(...systemMessages, ...trimmedMessages);\n    }\n\n    // Call handler if provided\n    if (options?.handlers?.onMessageAdded) {\n      await options.handlers.onMessageAdded(message);\n    }\n  };\n\n  /**\n   * Add multiple messages to the conversation history\n   */\n  const addMessages = async (newMessages: ChatMessage[]) => {\n    for (const message of newMessages) {\n      await addMessage(message);\n    }\n  };\n\n  /**\n   * Set the messages in the conversation history (all in replace)\n   */\n  const setMessages = async (newMessages: ChatMessage[]) => {\n    messages = newMessages;\n  };\n\n  /**\n   * Get all messages in the conversation\n   */\n  const getMessages = (): ChatMessage[] => {\n    // Return a copy to prevent external modifications\n    return [...messages];\n  };\n\n  /**\n   * Get the message history as XML\n   */\n  const getMessageHistoryAsXml = (): string => {\n    return messages\n      .map((m) => `<${m.role}>${m.content}</${m.role}>`)\n      .join(\"\\n\");\n  };\n\n  /**\n   * Get messages without system prompts (useful for display)\n   */\n  const getNonSystemMessages = (): ChatMessage[] => {\n    return messages.filter((m) => m.role !== \"system\");\n  };\n\n  /**\n   * Add a tool response message\n   * This is a convenience method that formats tool responses correctly\n   */\n  const addToolResponse = async (\n    toolCallId: string,\n    toolName: string,\n    result: any\n  ) => {\n    const toolMessage: ChatMessage = {\n      role: \"tool\",\n      content: typeof result === \"string\" ? result : JSON.stringify(result),\n      tool_call_id: toolCallId,\n      tool_name: toolName,\n    };\n\n    messages.push(toolMessage);\n\n    // Call handlers\n    if (options?.handlers?.onMessageAdded) {\n      await options.handlers.onMessageAdded(toolMessage);\n    }\n    if (options?.handlers?.onToolResponseAdded) {\n      await options.handlers.onToolResponseAdded({\n        toolCallId,\n        toolName,\n        result,\n      });\n    }\n  };\n\n  /**\n   * Clear all messages except system prompt\n   */\n  const clear = async () => {\n    const systemMessages = messages.filter((m) => m.role === \"system\");\n    messages.length = 0;\n    messages.push(...systemMessages);\n\n    // Call handler if provided\n    if (options?.handlers?.onCleared) {\n      await options.handlers.onCleared();\n    }\n  };\n\n  /**\n   * Get the last message of a specific role\n   */\n  const getLastMessageByRole = (\n    role: ChatMessage[\"role\"]\n  ): ChatMessage | undefined => {\n    return messages.filter((m) => m.role === role).pop();\n  };\n\n  /**\n   * Get message count by role\n   */\n  const getMessageCountByRole = (role: ChatMessage[\"role\"]): number => {\n    return messages.filter((m) => m.role === role).length;\n  };\n\n  /**\n   * Check if the conversation has any messages (excluding system)\n   */\n  const hasMessages = (): boolean => {\n    return messages.some((m) => m.role !== \"system\");\n  };\n\n  return {\n    // Core methods\n    setMessages,\n    addMessage,\n    addMessages,\n    getMessageHistoryAsXml,\n    getMessages,\n    getNonSystemMessages,\n    addToolResponse,\n    clear,\n\n    // Utility methods\n    getLastMessageByRole,\n    getMessageCountByRole,\n    hasMessages,\n\n    // Config access\n    getConfig: () => ({ ...config }),\n  };\n};\n\n/**\n * Type for the conversation history service\n */\nexport type ConversationHistory = ReturnType<typeof createConversationHistory>;\n","/**\n * Event handlers for conversation context operations\n */\nexport interface ConversationContextHandlers {\n  onStateChanged?: (key: string, newValue: any, oldValue: any) => Promise<void>;\n  onStatesChanged?: (updates: Record<string, any>, oldState: Record<string, any>) => Promise<void>;\n  onMetadataChanged?: (key: string, value: any) => Promise<void>;\n  onReset?: () => Promise<void>;\n}\n\n/**\n * Options for creating a conversation context\n */\nexport interface ConversationContextOptions {\n  initialState?: Record<string, any>;\n  metadata?: Record<string, any>;\n  sessionId?: string;\n  userId?: string;\n  handlers?: ConversationContextHandlers; // Event handlers\n}\n\n/**\n * Creates a conversation context manager - atomic primitive for managing conversation state\n * \n * This primitive manages the contextual information for a conversation,\n * including state that persists across messages, metadata, and session info.\n */\nexport const createConversationContext = (options?: ConversationContextOptions) => {\n  const config = {\n    sessionId: options?.sessionId ?? `session-${Date.now()}`,\n    userId: options?.userId,\n  };\n  \n  // Internal state storage using closure\n  const state: Record<string, any> = { ...(options?.initialState || {}) };\n  const metadata: Record<string, any> = { ...(options?.metadata || {}) };\n  \n  // Track conversation metrics\n  const metrics = {\n    startTime: Date.now(),\n    messageCount: 0,\n    toolCallCount: 0,\n  };\n  \n  /**\n   * Update a state value\n   */\n  const updateState = async (key: string, value: any) => {\n    const oldValue = state[key];\n    state[key] = value;\n\n    // Call handler if provided\n    if (options?.handlers?.onStateChanged) {\n      await options.handlers.onStateChanged(key, value, oldValue);\n    }\n  };\n  \n  /**\n   * Update multiple state values at once\n   */\n  const updateStates = async (updates: Record<string, any>) => {\n    const oldState = { ...state };\n    Object.assign(state, updates);\n\n    // Call handler if provided\n    if (options?.handlers?.onStatesChanged) {\n      await options.handlers.onStatesChanged(updates, oldState);\n    }\n  };\n  \n  /**\n   * Get the current state\n   */\n  const getState = (): Record<string, any> => {\n    // Return a copy to prevent external modifications\n    return { ...state };\n  };\n  \n  /**\n   * Get a specific state value\n   */\n  const getStateValue = <T = any>(key: string): T | undefined => {\n    return state[key] as T;\n  };\n  \n  /**\n   * Clear a state value\n   */\n  const clearStateValue = (key: string) => {\n    delete state[key];\n  };\n  \n  /**\n   * Reset all state\n   */\n  const resetState = async () => {\n    Object.keys(state).forEach(key => delete state[key]);\n\n    // Call handler if provided\n    if (options?.handlers?.onReset) {\n      await options.handlers.onReset();\n    }\n  };\n  \n  /**\n   * Update metadata\n   */\n  const updateMetadata = async (key: string, value: any) => {\n    metadata[key] = value;\n\n    // Call handler if provided\n    if (options?.handlers?.onMetadataChanged) {\n      await options.handlers.onMetadataChanged(key, value);\n    }\n  };\n  \n  /**\n   * Get metadata\n   */\n  const getMetadata = (): Record<string, any> => {\n    return { ...metadata };\n  };\n  \n  /**\n   * Increment message count\n   */\n  const incrementMessageCount = () => {\n    metrics.messageCount++;\n  };\n  \n  /**\n   * Increment tool call count\n   */\n  const incrementToolCallCount = (count: number = 1) => {\n    metrics.toolCallCount += count;\n  };\n  \n  /**\n   * Get conversation metrics\n   */\n  const getMetrics = () => {\n    return {\n      ...metrics,\n      duration: Date.now() - metrics.startTime,\n    };\n  };\n  \n  /**\n   * Get full context snapshot\n   */\n  const getSnapshot = () => {\n    return {\n      sessionId: config.sessionId,\n      userId: config.userId,\n      state: getState(),\n      metadata: getMetadata(),\n      metrics: getMetrics(),\n    };\n  };\n  \n  return {\n    // State management\n    updateState,\n    updateStates,\n    getState,\n    getStateValue,\n    clearStateValue,\n    resetState,\n    \n    // Metadata management\n    updateMetadata,\n    getMetadata,\n    \n    // Metrics\n    incrementMessageCount,\n    incrementToolCallCount,\n    getMetrics,\n    \n    // Utility\n    getSnapshot,\n    getSessionId: () => config.sessionId,\n    getUserId: () => config.userId,\n  };\n};\n\n/**\n * Type for the conversation context service\n */\nexport type ConversationContext = ReturnType<typeof createConversationContext>;","import type { AgentResponse } from \"../types/agent.types.js\";\nimport type { ChatMessage } from \"../types/llm.types.js\";\nimport {\n  createConversationHistory,\n  type ConversationHistoryOptions,\n  type ConversationHistoryHandlers,\n} from \"./conversation-history.service.js\";\nimport {\n  createConversationContext,\n  type ConversationContextOptions,\n  type ConversationContextHandlers,\n} from \"./conversation-context.service.js\";\n\n/**\n * Event handlers for conversation manager operations\n */\nexport interface ConversationManagerHandlers {\n  onUserMessageAdded?: (message: string) => Promise<void>;\n  onAgentResponseProcessed?: (response: AgentResponse) => Promise<void>;\n  onToolExecution?: (toolName: string, args: any, result: any) => Promise<void>;\n  onReset?: () => Promise<void>;\n}\n\n/**\n * Grouped handlers for manager and its atomic services\n */\nexport interface GroupedManagerHandlers {\n  manager?: ConversationManagerHandlers;\n  history?: ConversationHistoryHandlers;\n  context?: ConversationContextHandlers;\n}\n\n/**\n * Options for creating a conversation manager\n */\nexport interface ConversationManagerOptions {\n  handlers?: GroupedManagerHandlers; // Grouped handlers for all levels\n  // Legacy options - will be removed in future\n  historyOptions?: ConversationHistoryOptions;\n  contextOptions?: ConversationContextOptions;\n  onToolExecution?: (toolName: string, args: any, result: any) => void;\n}\n\n/**\n * Creates a conversation manager - composed primitive that combines history and context\n *\n * This is a higher-level primitive that combines conversation history management\n * with context/state management, providing a unified interface for conversation handling.\n */\nexport const createConversationManager = (\n  options?: ConversationManagerOptions\n) => {\n  // Extract handlers from grouped structure\n  const managerHandlers = options?.handlers?.manager;\n\n  // Build options for atomic services\n  const historyOptions: ConversationHistoryOptions | undefined = options\n    ?.handlers?.history\n    ? { handlers: options.handlers.history }\n    : options?.historyOptions;\n\n  const contextOptions: ConversationContextOptions | undefined = options\n    ?.handlers?.context\n    ? { handlers: options.handlers.context }\n    : options?.contextOptions;\n\n  // Create atomic primitives with extracted options\n  const history = createConversationHistory(historyOptions);\n  const context = createConversationContext(contextOptions);\n\n  /**\n   * Process an agent response and update conversation accordingly\n   */\n  const processAgentResponse = async (response: AgentResponse) => {\n    // Increment message count\n    context.incrementMessageCount();\n\n    // Create the assistant message\n    const assistantMessage: ChatMessage = {\n      role: \"assistant\",\n      content: response.content,\n    };\n\n    // Add tool calls if present\n    if (response.toolCalls && response.toolCalls.length > 0) {\n      assistantMessage.toolCalls = response.toolCalls;\n      context.incrementToolCallCount(response.toolCalls.length);\n    }\n\n    // Add assistant message to history\n    await history.addMessage(assistantMessage);\n\n    // Handle tool responses if present\n    if (response.metadata?.toolResponses) {\n      for (const toolResponse of response.metadata.toolResponses) {\n        // Add tool response to history\n        await history.addToolResponse(\n          toolResponse.toolCallId,\n          toolResponse.toolName,\n          toolResponse.result\n        );\n\n        // Call legacy callback if provided\n        if (options?.onToolExecution) {\n          // Find the original tool call to get args\n          const toolCall = response.toolCalls?.find(\n            (tc) => tc.toolCallId === toolResponse.toolCallId\n          );\n          options.onToolExecution(\n            toolResponse.toolName,\n            toolCall?.args || {},\n            toolResponse.result\n          );\n        }\n\n        // Call new handler if provided\n        if (managerHandlers?.onToolExecution) {\n          const toolCall = response.toolCalls?.find(\n            (tc) => tc.toolCallId === toolResponse.toolCallId\n          );\n          await managerHandlers.onToolExecution(\n            toolResponse.toolName,\n            toolCall?.args || {},\n            toolResponse.result\n          );\n        }\n      }\n    }\n\n    // Update context metadata with response info\n    await context.updateMetadata(\"lastResponseTime\", Date.now());\n    if (response.metadata) {\n      await context.updateMetadata(\"lastResponseMetadata\", response.metadata);\n    }\n\n    // Call handler if provided\n    if (managerHandlers?.onAgentResponseProcessed) {\n      await managerHandlers.onAgentResponseProcessed(response);\n    }\n  };\n\n  /**\n   * Add a user message to the conversation\n   */\n  const addUserMessage = async (content: string) => {\n    context.incrementMessageCount();\n    await history.addMessage({\n      role: \"user\",\n      content,\n    });\n    await context.updateMetadata(\"lastUserMessageTime\", Date.now());\n\n    // Call handler if provided\n    if (managerHandlers?.onUserMessageAdded) {\n      await managerHandlers.onUserMessageAdded(content);\n    }\n  };\n\n  /**\n   * Get the full conversation state including history and context\n   */\n  const getConversationState = () => {\n    return {\n      messages: history.getMessages(),\n      context: context.getSnapshot(),\n      hasMessages: history.hasMessages(),\n      messageCount: history.getMessages().length,\n    };\n  };\n\n  /**\n   * Reset the conversation (clears history and state)\n   */\n  const reset = async () => {\n    await history.clear();\n    await context.resetState();\n    // Reset metrics\n    const newContext = createConversationContext(contextOptions);\n    Object.assign(context, newContext);\n\n    // Call handler if provided\n    if (managerHandlers?.onReset) {\n      await managerHandlers.onReset();\n    }\n  };\n\n  /**\n   * Get a summary of the conversation\n   */\n  const getSummary = () => {\n    const messages = history.getMessages();\n    const metrics = context.getMetrics();\n\n    return {\n      sessionId: context.getSessionId(),\n      userId: context.getUserId(),\n      messageCount: messages.length,\n      userMessageCount: history.getMessageCountByRole(\"user\"),\n      assistantMessageCount: history.getMessageCountByRole(\"assistant\"),\n      toolMessageCount: history.getMessageCountByRole(\"tool\"),\n      toolCallCount: metrics.toolCallCount,\n      duration: metrics.duration,\n      hasSystemPrompt: messages.some((m) => m.role === \"system\"),\n    };\n  };\n\n  return {\n    // Message management\n    addUserMessage,\n    processAgentResponse,\n\n    // History methods (delegated)\n    getMessages: history.getMessages,\n    getNonSystemMessages: history.getNonSystemMessages,\n    getLastMessageByRole: history.getLastMessageByRole,\n    hasMessages: history.hasMessages,\n\n    // Context methods (delegated)\n    updateState: context.updateState,\n    updateStates: context.updateStates,\n    getState: context.getState,\n    getStateValue: context.getStateValue,\n    updateMetadata: context.updateMetadata,\n    getMetadata: context.getMetadata,\n\n    // Combined methods\n    getConversationState,\n    getSummary,\n    reset,\n\n    // Direct access to primitives if needed\n    history,\n    context,\n  };\n};\n\n/**\n * Type for the conversation manager service\n */\nexport type ConversationManager = ReturnType<typeof createConversationManager>;\n","import type { Agent, AgentResponse } from \"../types/agent.types.js\";\nimport type { ProgressMessage } from \"../types/progress.types.js\";\nimport type { ChatMessage } from \"../types/llm.types.js\";\nimport { createProgressMessage } from \"../types/progress.types.js\";\nimport {\n  createConversationManager,\n  type ConversationManagerOptions,\n  type ConversationManagerHandlers,\n} from \"./conversation-manager.service.js\";\nimport type { ConversationHistoryHandlers } from \"./conversation-history.service.js\";\nimport type { ConversationContextHandlers } from \"./conversation-context.service.js\";\n\n/**\n * Event handlers for conversation loop operations\n */\nexport interface ConversationLoopHandlers {\n  onConversationStarted?: (context: {\n    sessionId?: string;\n    userId?: string;\n    conversationId?: string;\n  }) => Promise<{ initialMessages?: ChatMessage[] }>;\n  onMessageSent?: (message: string, context: any) => Promise<void>;\n  onResponseReceived?: (response: AgentResponse, context: any) => Promise<void>;\n  onConversationEnded?: (summary: any, context: any) => Promise<void>;\n}\n\n/**\n * Grouped handlers for all conversation services\n */\nexport interface GroupedHandlers {\n  loop?: ConversationLoopHandlers;\n  manager?: ConversationManagerHandlers;\n  history?: ConversationHistoryHandlers;\n  context?: ConversationContextHandlers;\n}\n\n/**\n * History modes for conversation loop\n */\nexport type HistoryMode = \"full\" | \"none\" | \"last-n\";\n\n/**\n * Options for creating a conversation loop\n */\nexport interface ConversationLoopOptions {\n  agent: Agent;\n  handlers?: GroupedHandlers; // Grouped handlers for all services\n  onMessage?: (response: AgentResponse) => Promise<void>;\n  onError?: (error: Error) => Promise<void>;\n  onComplete?: (summary: any) => Promise<void>;\n  onProgress?: (message: ProgressMessage) => Promise<void>;\n  maxTurns?: number; // Optional limit on conversation turns\n  historyMode?: HistoryMode; // How to handle message history (default: 'full')\n  historyLimit?: number; // For 'last-n' mode (default: 5)\n}\n\n/**\n * Result from sending a message\n */\nexport interface SendMessageResult {\n  response: AgentResponse;\n  error?: Error;\n  conversationEnded?: boolean;\n}\n\n/**\n * Creates a conversation loop - organism-level service for managing full conversations\n *\n * This is the highest-level primitive that orchestrates the entire conversation flow,\n * including agent interactions, tool execution, and state management.\n */\nexport const createConversationLoop = (options: ConversationLoopOptions) => {\n  const {\n    agent,\n    onMessage,\n    onError,\n    onComplete,\n    onProgress,\n    handlers,\n    historyMode = \"full\",\n    historyLimit = 5,\n  } = options;\n\n  // Mutable history mode state\n  let currentHistoryMode = historyMode;\n  let currentHistoryLimit = historyLimit;\n\n  // Extract handlers from grouped structure\n  const loopHandlers = handlers?.loop;\n\n  // Build manager options from grouped handlers using the new grouped format\n  const managerOptions: ConversationManagerOptions | undefined = handlers\n    ? {\n        handlers: {\n          manager: handlers.manager,\n          history: handlers.history,\n          context: handlers.context,\n        },\n      }\n    : undefined;\n\n  // Create conversation manager with extracted options\n  const manager = createConversationManager(managerOptions);\n\n  // Track conversation state\n  let turnCount = 0;\n  let isActive = true;\n  let isInitialized = false;\n\n  // Initialize conversation with handler if provided\n  const initializeConversation = async () => {\n    if (!isInitialized && loopHandlers?.onConversationStarted) {\n      const context = {\n        sessionId: manager.context.getSessionId(),\n        userId: manager.context.getUserId(),\n        conversationId: manager.context.getSessionId(), // Use session ID as conversation ID\n      };\n\n      const result = await loopHandlers.onConversationStarted(context);\n\n      // Add initial messages if provided\n      if (result?.initialMessages) {\n        for (const message of result.initialMessages) {\n          await manager.history.addMessage(message);\n        }\n      }\n\n      isInitialized = true;\n    }\n  };\n\n  /**\n   * Send a progress update if handler is provided\n   */\n  const sendProgress = async (\n    type: ProgressMessage[\"type\"],\n    content: string,\n    metadata?: Record<string, any>\n  ) => {\n    if (onProgress) {\n      const message = createProgressMessage(type, content, metadata);\n      await onProgress(message);\n    }\n  };\n\n  /**\n   * Send a message and get response\n   */\n  const sendMessage = async (\n    userMessage: string\n  ): Promise<SendMessageResult> => {\n    // Initialize if needed\n    await initializeConversation();\n\n    if (!isActive) {\n      return {\n        response: { role: \"assistant\", content: null },\n        error: new Error(\"Conversation has ended\"),\n        conversationEnded: true,\n      };\n    }\n\n    try {\n      // Increment turn count\n      turnCount++;\n\n      // Add user message\n      await manager.addUserMessage(userMessage);\n\n      // Call handler if provided\n      if (loopHandlers?.onMessageSent) {\n        const context = {\n          turnCount,\n          sessionId: manager.context.getSessionId(),\n          userId: manager.context.getUserId(),\n        };\n        await loopHandlers.onMessageSent(userMessage, context);\n      }\n\n      // Send thinking progress\n      await sendProgress(\"thinking\", `Processing message (turn ${turnCount})`, {\n        turnCount,\n        userMessage,\n      });\n\n      // Get messages based on history mode\n      const getMessagesForAgent = (): ChatMessage[] => {\n        const allMessages = manager.getMessages();\n\n        switch (currentHistoryMode) {\n          case \"none\":\n            // Only current user message - agent must use memory tools!\n            return [{ role: \"user\" as const, content: userMessage }];\n\n          case \"last-n\":\n            // Last N messages (not including the current one that was just added)\n            const lastN = allMessages.slice(-(currentHistoryLimit + 1));\n            return lastN.length > 0\n              ? lastN\n              : [{ role: \"user\" as const, content: userMessage }];\n\n          case \"full\":\n          default:\n            // Current behavior - all messages\n            return allMessages;\n        }\n      };\n\n      // Get agent response with configured message history\n      const response = await agent.act({\n        messages: getMessagesForAgent(),\n        context: {\n          userMessage,\n          state: {\n            ...manager.getState(),\n            turnCount,\n            historyMode: currentHistoryMode,\n          },\n        },\n      });\n\n      // Send LLM response progress\n      await sendProgress(\"llm_response\", \"Received response from agent\", {\n        hasContent: !!response.content,\n        hasToolCalls: !!(response.toolCalls && response.toolCalls.length > 0),\n      });\n\n      // Process response (updates history and context)\n      await manager.processAgentResponse(response);\n\n      // Send tool execution progress if tools were executed\n      if (response.metadata?.toolResponses) {\n        for (const toolResponse of response.metadata.toolResponses) {\n          await sendProgress(\n            \"tool_execution\",\n            `Tool executed: ${toolResponse.toolName}`,\n            {\n              toolName: toolResponse.toolName,\n              toolCallId: toolResponse.toolCallId,\n            }\n          );\n        }\n      }\n\n      // Call message callback if provided\n      if (onMessage) {\n        await onMessage(response);\n      }\n\n      // Call handler if provided\n      if (loopHandlers?.onResponseReceived) {\n        const context = {\n          turnCount,\n          sessionId: manager.context.getSessionId(),\n          userId: manager.context.getUserId(),\n        };\n        await loopHandlers.onResponseReceived(response, context);\n      }\n\n      // Check if we've hit max turns\n      if (options.maxTurns && turnCount >= options.maxTurns) {\n        isActive = false;\n        if (onComplete) {\n          await onComplete(manager.getSummary());\n        }\n      }\n\n      return {\n        response,\n        conversationEnded: !isActive,\n      };\n    } catch (error) {\n      // Handle errors\n      const err = error instanceof Error ? error : new Error(String(error));\n\n      // Send error progress\n      await sendProgress(\"error\", `Error in conversation: ${err.message}`, {\n        error: err.message,\n        turnCount,\n      });\n\n      if (onError) {\n        await onError(err);\n      }\n\n      return {\n        response: { role: \"assistant\", content: null },\n        error: err,\n      };\n    }\n  };\n\n  /**\n   * End the conversation\n   */\n  const endConversation = async () => {\n    if (!isActive) return;\n\n    isActive = false;\n\n    // Send finished progress\n    const summary = manager.getSummary();\n    await sendProgress(\"finished\", \"Conversation ended\", {\n      totalMessages: summary.messageCount,\n      duration: summary.duration,\n    });\n\n    if (onComplete) {\n      await onComplete(summary);\n    }\n\n    // Call handler if provided\n    if (loopHandlers?.onConversationEnded) {\n      const context = {\n        turnCount,\n        sessionId: manager.context.getSessionId(),\n        userId: manager.context.getUserId(),\n      };\n      await loopHandlers.onConversationEnded(summary, context);\n    }\n  };\n\n  /**\n   * Reset the conversation\n   */\n  const resetConversation = () => {\n    manager.reset();\n    turnCount = 0;\n    isActive = true;\n    isInitialized = false; // Reset initialization flag\n  };\n\n  /**\n   * Get conversation analytics\n   */\n  const getAnalytics = () => {\n    const summary = manager.getSummary();\n    const messages = manager.getMessages();\n\n    // Calculate average message length\n    const userMessages = messages.filter((m) => m.role === \"user\");\n    const avgUserMessageLength =\n      userMessages.length > 0\n        ? userMessages.reduce((sum, m) => sum + (m.content?.length || 0), 0) /\n          userMessages.length\n        : 0;\n\n    return {\n      ...summary,\n      turnCount,\n      isActive,\n      avgUserMessageLength,\n      hasToolCalls: messages.some((m) => m.toolCalls && m.toolCalls.length > 0),\n    };\n  };\n\n  /**\n   * Export conversation as JSON\n   */\n  const exportConversation = () => {\n    return {\n      messages: manager.getMessages(),\n      state: manager.getState(),\n      metadata: manager.getMetadata(),\n      analytics: getAnalytics(),\n      timestamp: new Date().toISOString(),\n    };\n  };\n\n  /**\n   * Import conversation from JSON\n   */\n  const importConversation = (data: any) => {\n    // Reset first\n    resetConversation();\n\n    // Import messages\n    if (data.messages && Array.isArray(data.messages)) {\n      for (const message of data.messages) {\n        if (message.role === \"user\") {\n          manager.addUserMessage(message.content);\n        } else {\n          // For other message types, add directly to history\n          manager.history.addMessage(message);\n        }\n      }\n    }\n\n    // Import state\n    if (data.state) {\n      manager.updateStates(data.state);\n    }\n\n    // Import metadata\n    if (data.metadata) {\n      Object.entries(data.metadata).forEach(([key, value]) => {\n        manager.updateMetadata(key, value);\n      });\n    }\n  };\n\n  /**\n   * Set the history mode for the conversation\n   */\n  const setHistoryMode = (mode: HistoryMode, limit?: number) => {\n    currentHistoryMode = mode;\n    if (limit !== undefined) {\n      currentHistoryLimit = limit;\n    }\n  };\n\n  /**\n   * Get the current history mode configuration\n   */\n  const getHistoryMode = () => ({\n    mode: currentHistoryMode,\n    limit: currentHistoryLimit,\n  });\n\n  return {\n    // Core conversation methods\n    sendMessage,\n    endConversation,\n    resetConversation,\n\n    // Message management methods\n    addUserMessage: manager.addUserMessage,\n    addMessage: manager.history.addMessage,\n    addMessages: manager.history.addMessages,\n    addToolResponse: manager.history.addToolResponse,\n    processAgentResponse: manager.processAgentResponse,\n\n    // State access\n    getMessages: manager.getMessages,\n    updateState: manager.updateState,\n    getConversationState: manager.getConversationState,\n\n    // Analytics and export\n    getAnalytics,\n    getSummary: manager.getSummary,\n    exportConversation,\n    importConversation,\n\n    // Status\n    setIsActive: (isActive: boolean) => {\n      isActive = isActive;\n    },\n    isActive: () => isActive,\n    getTurnCount: () => turnCount,\n\n    // History mode management\n    setHistoryMode,\n    getHistoryMode,\n\n    // Direct access to primitives for advanced use cases\n    manager,\n  };\n};\n\n/**\n * Type for the conversation loop service\n */\nexport type ConversationLoop = ReturnType<typeof createConversationLoop>;\n","import type {\n  VoiceService,\n  VoiceOptions,\n  TranscribeOptions,\n  AudioResult,\n  AudioInput,\n  TranscriptionResult,\n  Voice,\n  AudioChunk,\n  VoiceProgressEvent,\n  AudioFormat,\n} from \"../types/voice.types.js\";\nimport { VoiceError } from \"../types/voice.types.js\";\n\nexport interface BaseVoiceServiceConfig {\n  apiKey?: string;\n  defaultVoiceId?: string;\n  defaultModel?: string;\n  defaultOptions?: Partial<VoiceOptions>;\n  baseUrl?: string;\n  timeout?: number;\n  onProgress?: (event: VoiceProgressEvent) => void;\n}\n\n/**\n * Voice service utilities for providers to use when implementing VoiceService\n */\nexport interface VoiceServiceUtils {\n  mergeOptions: (options?: VoiceOptions) => VoiceOptions;\n  emitProgress: (event: VoiceProgressEvent) => void;\n  convertAudioFormat: (\n    data: Buffer | ArrayBuffer | Uint8Array,\n    fromFormat: AudioFormat,\n    toFormat: AudioFormat\n  ) => Promise<Buffer | ArrayBuffer>;\n  validateAudioInput: (audio: AudioInput) => void;\n  validateText: (text: string) => void;\n  loadAudioFromPath: (filepath: string) => Promise<Buffer>;\n  loadAudioFromUrl: (url: string) => Promise<ArrayBuffer>;\n  decodeBase64: (base64: string) => ArrayBuffer;\n  prepareAudioInput: (audio: AudioInput) => Promise<ArrayBuffer | Buffer>;\n  rateLimit: () => Promise<void>;\n}\n\n/**\n * Base voice service with common utilities\n * This returns utilities that providers can use when implementing VoiceService\n */\nexport const baseVoiceService = (\n  config: BaseVoiceServiceConfig = {}\n): VoiceServiceUtils => {\n  const {\n    defaultVoiceId,\n    defaultModel,\n    defaultOptions = {},\n    onProgress,\n  } = config;\n\n  // Rate limiting state\n  let lastRequestTime = 0;\n  const minRequestInterval = 100; // milliseconds\n\n  // Utility methods\n  const mergeOptions = (options?: VoiceOptions): VoiceOptions => {\n    return {\n      ...defaultOptions,\n      ...options,\n      voiceId: options?.voiceId || defaultVoiceId,\n      model: options?.model || defaultModel,\n    };\n  };\n\n  const emitProgress = (event: VoiceProgressEvent): void => {\n    if (onProgress) {\n      onProgress(event);\n    }\n  };\n\n  const convertAudioFormat = async (\n    data: Buffer | ArrayBuffer | Uint8Array,\n    fromFormat: AudioFormat,\n    toFormat: AudioFormat\n  ): Promise<Buffer | ArrayBuffer> => {\n    // Basic implementation - providers can override with actual conversion\n    if (fromFormat === toFormat) {\n      if (data instanceof Uint8Array) {\n        return Buffer.from(data);\n      }\n      return data;\n    }\n\n    // Providers should implement actual format conversion\n    throw new VoiceError(\n      `Audio format conversion from ${fromFormat} to ${toFormat} not implemented`,\n      \"SERVICE_UNAVAILABLE\"\n    );\n  };\n\n  const validateAudioInput = (audio: AudioInput): void => {\n    if (!audio.data) {\n      throw new VoiceError(\"Audio input data is required\", \"INVALID_AUDIO\");\n    }\n\n    if (!audio.format) {\n      throw new VoiceError(\"Audio format is required\", \"INVALID_AUDIO\");\n    }\n\n    if (!audio.dataType) {\n      throw new VoiceError(\"Audio data type is required\", \"INVALID_AUDIO\");\n    }\n  };\n\n  const validateText = (text: string): void => {\n    if (!text || text.trim().length === 0) {\n      throw new VoiceError(\"Text cannot be empty\", \"SYNTHESIS_FAILED\");\n    }\n\n    // Basic length validation - providers can override\n    if (text.length > 5000) {\n      throw new VoiceError(\n        \"Text exceeds maximum length of 5000 characters\",\n        \"SYNTHESIS_FAILED\"\n      );\n    }\n  };\n\n  const loadAudioFromPath = async (filepath: string): Promise<Buffer> => {\n    const fs = await import(\"fs/promises\");\n    try {\n      return await fs.readFile(filepath);\n    } catch (error) {\n      throw new VoiceError(\n        `Failed to load audio from path: ${filepath}`,\n        \"INVALID_AUDIO\",\n        error\n      );\n    }\n  };\n\n  const loadAudioFromUrl = async (url: string): Promise<ArrayBuffer> => {\n    try {\n      const response = await fetch(url);\n      if (!response.ok) {\n        throw new Error(`HTTP error! status: ${response.status}`);\n      }\n      return await response.arrayBuffer();\n    } catch (error) {\n      throw new VoiceError(\n        `Failed to load audio from URL: ${url}`,\n        \"INVALID_AUDIO\",\n        error\n      );\n    }\n  };\n\n  const decodeBase64 = (base64: string): ArrayBuffer => {\n    try {\n      const binaryString = atob(base64);\n      const bytes = new Uint8Array(binaryString.length);\n      for (let i = 0; i < binaryString.length; i++) {\n        bytes[i] = binaryString.charCodeAt(i);\n      }\n      return bytes.buffer;\n    } catch (error) {\n      throw new VoiceError(\n        \"Failed to decode base64 audio data\",\n        \"INVALID_AUDIO\",\n        error\n      );\n    }\n  };\n\n  const prepareAudioInput = async (\n    audio: AudioInput\n  ): Promise<ArrayBuffer | Buffer> => {\n    validateAudioInput(audio);\n\n    switch (audio.dataType) {\n      case \"buffer\":\n        // Handle Uint8Array by converting to ArrayBuffer\n        if (audio.data instanceof Uint8Array) {\n          return audio.data.buffer as ArrayBuffer;\n        }\n        return audio.data as Buffer | ArrayBuffer;\n\n      case \"base64\":\n        return decodeBase64(audio.data as string);\n\n      case \"filepath\":\n        return await loadAudioFromPath(audio.data as string);\n\n      case \"url\":\n        return await loadAudioFromUrl(audio.data as string);\n\n      default:\n        throw new VoiceError(\n          `Unsupported audio data type: ${audio.dataType}`,\n          \"INVALID_AUDIO\"\n        );\n    }\n  };\n\n  const rateLimit = async (): Promise<void> => {\n    const now = Date.now();\n    const timeSinceLastRequest = now - lastRequestTime;\n\n    if (timeSinceLastRequest < minRequestInterval) {\n      const delay = minRequestInterval - timeSinceLastRequest;\n      await new Promise((resolve) => setTimeout(resolve, delay));\n    }\n\n    lastRequestTime = Date.now();\n  };\n\n  // Return just the utility methods\n  return {\n    mergeOptions,\n    emitProgress,\n    convertAudioFormat,\n    validateAudioInput,\n    validateText,\n    loadAudioFromPath,\n    loadAudioFromUrl,\n    decodeBase64,\n    prepareAudioInput,\n    rateLimit,\n  };\n};\n","import type {\n  VoiceService,\n  VoiceOptions,\n  TranscribeOptions,\n  AudioResult,\n  AudioInput,\n  TranscriptionResult,\n  Voice,\n  AudioChunk,\n  AudioFormat,\n} from \"../../types/voice.types.js\";\nimport { VoiceError } from \"../../types/voice.types.js\";\nimport {\n  baseVoiceService,\n  type BaseVoiceServiceConfig,\n} from \"../base.voice.service.js\";\nimport { ElevenLabsClient } from \"@elevenlabs/elevenlabs-js\";\n\nexport interface ElevenLabsVoiceServiceConfig extends BaseVoiceServiceConfig {\n  apiKey?: string; // Optional since SDK can use env var\n  defaultVoiceId?: string;\n  defaultModel?: string;\n  // ElevenLabs specific options\n  outputFormat?:\n    | \"mp3_44100_128\"\n    | \"mp3_44100_64\"\n    | \"mp3_44100_32\"\n    | \"pcm_16000\"\n    | \"pcm_22050\"\n    | \"pcm_24000\"\n    | \"pcm_44100\"\n    | \"ulaw_8000\";\n  applyTextNormalization?: \"auto\" | \"on\" | \"off\";\n}\n\n/**\n * ElevenLabs implementation of VoiceService\n */\nexport const elevenlabsVoiceService = (\n  config: ElevenLabsVoiceServiceConfig\n): VoiceService => {\n  const {\n    apiKey,\n    defaultVoiceId,\n    // defaultModel = \"eleven_multilingual_v2\",\n    defaultModel = \"eleven_flash_v2_5\", // the fastest and cheapest model\n    outputFormat = \"mp3_44100_128\",\n    applyTextNormalization = \"auto\",\n  } = config;\n\n  // Initialize ElevenLabs client\n  const client = new ElevenLabsClient({ apiKey });\n\n  client.speechToText.convert;\n\n  // Get utilities from base service\n  const utils = baseVoiceService(config);\n\n  /**\n   * Synthesize text to speech using ElevenLabs API\n   */\n  const synthesize = async (\n    text: string,\n    options?: VoiceOptions\n  ): Promise<AudioResult> => {\n    await utils.rateLimit();\n    utils.validateText(text);\n\n    const mergedOptions = utils.mergeOptions(options);\n    const voiceId = mergedOptions.voiceId || defaultVoiceId;\n\n    if (!voiceId) {\n      throw new VoiceError(\n        \"Voice ID is required for synthesis\",\n        \"SYNTHESIS_FAILED\"\n      );\n    }\n\n    utils.emitProgress({\n      type: \"synthesis_start\",\n      timestamp: Date.now(),\n    });\n\n    try {\n      const audio = await client.textToSpeech.convert(voiceId, {\n        text,\n        modelId: mergedOptions.model || defaultModel,\n        outputFormat: outputFormat,\n        applyTextNormalization: applyTextNormalization,\n        voiceSettings: {\n          stability: mergedOptions.stability ?? 0.5,\n          similarityBoost: mergedOptions.similarityBoost ?? 0.5,\n          style: mergedOptions.style ?? 0.0,\n          useSpeakerBoost: mergedOptions.useSpeakerBoost ?? true,\n        },\n      });\n\n      // Convert the response to ArrayBuffer\n      const chunks: Uint8Array[] = [];\n      for await (const chunk of audio) {\n        chunks.push(chunk);\n      }\n\n      const audioData = new Uint8Array(\n        chunks.reduce((acc, chunk) => acc + chunk.length, 0)\n      );\n      let offset = 0;\n      for (const chunk of chunks) {\n        audioData.set(chunk, offset);\n        offset += chunk.length;\n      }\n\n      utils.emitProgress({\n        type: \"synthesis_complete\",\n        timestamp: Date.now(),\n        data: { size: audioData.byteLength },\n      });\n\n      return {\n        data: audioData,\n        format: outputFormat.startsWith(\"mp3\") ? \"mp3\" : (\"pcm\" as AudioFormat),\n        size: audioData.byteLength,\n        metadata: {\n          voiceId,\n          model: mergedOptions.model || defaultModel,\n        },\n      };\n    } catch (error) {\n      if (error instanceof VoiceError) {\n        throw error;\n      }\n      throw new VoiceError(\n        \"Failed to synthesize speech with ElevenLabs\",\n        \"SYNTHESIS_FAILED\",\n        error\n      );\n    }\n  };\n\n  /**\n   * Stream synthesis for real-time playback\n   */\n  const streamSynthesize = async function* (\n    text: string,\n    options?: VoiceOptions\n  ): AsyncGenerator<AudioChunk> {\n    await utils.rateLimit();\n    utils.validateText(text);\n\n    const mergedOptions = utils.mergeOptions(options);\n    const voiceId = mergedOptions.voiceId || defaultVoiceId;\n\n    if (!voiceId) {\n      throw new VoiceError(\n        \"Voice ID is required for synthesis\",\n        \"SYNTHESIS_FAILED\"\n      );\n    }\n\n    utils.emitProgress({\n      type: \"synthesis_start\",\n      timestamp: Date.now(),\n    });\n\n    try {\n      const audioStream = await client.textToSpeech.stream(voiceId, {\n        text,\n        modelId: mergedOptions.model || defaultModel,\n        outputFormat: outputFormat,\n        applyTextNormalization: applyTextNormalization,\n        voiceSettings: {\n          stability: mergedOptions.stability ?? 0.5,\n          similarityBoost: mergedOptions.similarityBoost ?? 0.5,\n          style: mergedOptions.style ?? 0.0,\n          useSpeakerBoost: mergedOptions.useSpeakerBoost ?? true,\n        },\n        optimizeStreamingLatency: 0,\n      });\n\n      let chunkIndex = 0;\n      for await (const chunk of audioStream) {\n        yield {\n          data: chunk,\n          index: chunkIndex++,\n          isFinal: false,\n          timestamp: Date.now(),\n        };\n\n        utils.emitProgress({\n          type: \"synthesis_progress\",\n          progress: undefined,\n          timestamp: Date.now(),\n        });\n      }\n\n      utils.emitProgress({\n        type: \"synthesis_complete\",\n        timestamp: Date.now(),\n      });\n    } catch (error) {\n      if (error instanceof VoiceError) {\n        throw error;\n      }\n      throw new VoiceError(\n        \"Failed to stream synthesis with ElevenLabs\",\n        \"SYNTHESIS_FAILED\",\n        error\n      );\n    }\n  };\n\n  /**\n   * Transcribe audio to text using ElevenLabs Scribe v1 model\n   */\n  const transcribe = async (\n    audio: AudioInput,\n    options?: TranscribeOptions\n  ): Promise<TranscriptionResult> => {\n    await utils.rateLimit();\n\n    utils.emitProgress({\n      type: \"transcription_start\",\n      timestamp: Date.now(),\n    });\n\n    try {\n      // Prepare audio data\n      const audioData = await utils.prepareAudioInput(audio);\n\n      // Convert audio data to Blob for the API\n      const audioBlob = new Blob([audioData], {\n        type: `audio/${audio.format}`,\n      });\n\n      // Call ElevenLabs speech-to-text API\n      const modelId = options?.model || \"scribe_v1\";\n\n      const response = await client.speechToText.convert({\n        file: audioBlob as any, // The API expects 'file' parameter\n        modelId: modelId,\n      });\n\n      utils.emitProgress({\n        type: \"transcription_complete\",\n        timestamp: Date.now(),\n      });\n\n      // Format the response according to our TranscriptionResult interface\n      // ElevenLabs returns { text: \"transcribed text\", ... }\n      const resp: any = response as any;\n      const transcribedText = resp.text || \"\";\n\n      return {\n        text: transcribedText,\n        confidence: resp.confidence,\n        language: resp.language || options?.language,\n        duration: resp.duration,\n        words: resp.words?.map((word: any) => ({\n          word: word.text,\n          start: word.start_time || word.start,\n          end: word.end_time || word.end,\n          confidence: word.confidence,\n        })),\n        alternatives: resp.alternatives?.map((alt: any) => ({\n          text: alt.text,\n          confidence: alt.confidence,\n        })),\n      };\n    } catch (error) {\n      if (error instanceof VoiceError) {\n        throw error;\n      }\n      throw new VoiceError(\n        `Failed to transcribe audio with ElevenLabs: ${\n          error instanceof Error ? error.message : String(error)\n        }`,\n        \"TRANSCRIPTION_FAILED\",\n        error\n      );\n    }\n  };\n\n  /**\n   * List available voices\n   */\n  const listVoices = async (): Promise<Voice[]> => {\n    await utils.rateLimit();\n\n    try {\n      const response = await client.voices.getAll();\n\n      return response.voices.map((voice: any) => ({\n        id: voice.voiceId || voice.voice_id,\n        name: voice.name,\n        description: voice.description || undefined,\n        previewUrl: voice.previewUrl || voice.preview_url,\n        labels: {\n          ...voice.labels,\n          category: voice.category,\n        },\n        isCustom:\n          voice.category === \"cloned\" || voice.category === \"professional\",\n      }));\n    } catch (error) {\n      if (error instanceof VoiceError) {\n        throw error;\n      }\n      throw new VoiceError(\n        \"Failed to list voices from ElevenLabs\",\n        \"SERVICE_UNAVAILABLE\",\n        error\n      );\n    }\n  };\n\n  /**\n   * Get specific voice details\n   */\n  const getVoice = async (voiceId: string): Promise<Voice | null> => {\n    await utils.rateLimit();\n\n    try {\n      const voice = await client.voices.get(voiceId);\n\n      return {\n        id: voice.voiceId || (voice as any).voice_id,\n        name: voice.name || \"\",\n        description: voice.description || undefined,\n        previewUrl: voice.previewUrl || (voice as any).preview_url,\n        labels: {\n          ...voice.labels,\n          category: voice.category,\n        },\n        isCustom:\n          voice.category === \"cloned\" || voice.category === \"professional\",\n      };\n    } catch (error: any) {\n      // Handle 404 as null return\n      if (error?.statusCode === 404 || error?.response?.status === 404) {\n        return null;\n      }\n\n      if (error instanceof VoiceError) {\n        throw error;\n      }\n      throw new VoiceError(\n        \"Failed to get voice from ElevenLabs\",\n        \"SERVICE_UNAVAILABLE\",\n        error\n      );\n    }\n  };\n\n  /**\n   * Clone a voice (requires Pro subscription)\n   */\n  const cloneVoice = async (\n    name: string,\n    samples: AudioInput[]\n  ): Promise<Voice> => {\n    if (samples.length === 0) {\n      throw new VoiceError(\n        \"At least one voice sample is required\",\n        \"INVALID_AUDIO\"\n      );\n    }\n\n    await utils.rateLimit();\n\n    try {\n      // Process audio samples into File-like objects\n      const files: File[] = [];\n\n      for (let i = 0; i < samples.length; i++) {\n        const audioData = await utils.prepareAudioInput(samples[i]);\n        const blob = new Blob([audioData], {\n          type: `audio/${samples[i].format}`,\n        });\n        // Create a File-like object\n        const file = new File([blob], `sample_${i}.${samples[i].format}`, {\n          type: `audio/${samples[i].format}`,\n        });\n        files.push(file);\n      }\n\n      // The SDK might use a different method name for adding voices\n      // Let's use the create method if available, otherwise fallback to add\n      const response =\n        (await (client.voices as any).create?.({\n          name,\n          files,\n        })) ||\n        (await (client.voices as any).add?.({\n          name,\n          files,\n        }));\n\n      // Fetch the created voice details\n      const voiceId = response.voiceId || (response as any).voice_id;\n      if (!voiceId) {\n        throw new VoiceError(\n          \"No voice ID returned from clone operation\",\n          \"SERVICE_UNAVAILABLE\"\n        );\n      }\n\n      const voice = await getVoice(voiceId);\n      if (!voice) {\n        throw new VoiceError(\n          \"Failed to fetch cloned voice details\",\n          \"SERVICE_UNAVAILABLE\"\n        );\n      }\n\n      return voice;\n    } catch (error) {\n      if (error instanceof VoiceError) {\n        throw error;\n      }\n      throw new VoiceError(\n        \"Failed to clone voice with ElevenLabs\",\n        \"SYNTHESIS_FAILED\",\n        error\n      );\n    }\n  };\n\n  /**\n   * Delete a custom voice\n   */\n  const deleteVoice = async (voiceId: string): Promise<boolean> => {\n    await utils.rateLimit();\n\n    try {\n      await client.voices.delete(voiceId);\n      return true;\n    } catch (error: any) {\n      // Handle 404 as false return\n      if (error?.statusCode === 404 || error?.response?.status === 404) {\n        return false;\n      }\n\n      if (error instanceof VoiceError) {\n        throw error;\n      }\n      throw new VoiceError(\n        \"Failed to delete voice from ElevenLabs\",\n        \"SERVICE_UNAVAILABLE\",\n        error\n      );\n    }\n  };\n\n  /**\n   * Check if service is available\n   */\n  const isAvailable = async (): Promise<boolean> => {\n    try {\n      await client.user.get();\n      return true;\n    } catch {\n      return false;\n    }\n  };\n\n  return {\n    synthesize,\n    streamSynthesize,\n    transcribe,\n    listVoices,\n    getVoice,\n    cloneVoice,\n    deleteVoice,\n    isAvailable,\n  };\n};\n","import { formatInTimeZone } from \"date-fns-tz\";\n\nexport const currentDatePrompt = (timeZone = \"Europe/Zurich\") => {\n  const now = new Date();\n\n  // Human-readable local date with time & TZ\n  const localFormatted = formatInTimeZone(\n    now,\n    timeZone,\n    \"EEEE, dd MMMM yyyy 'at' HH:mm:ss XXX\"\n  );\n\n  // ISO 8601 UTC for calculations\n  const iso = now.toISOString();\n\n  return `Today is ${localFormatted} (${iso}).`;\n};\n","import { promises as fs } from \"fs\";\nimport * as path from \"path\";\nimport type { STMService, STMConfig, MemoryEvent } from \"./memory.types.js\";\n\nexport const createSimpleSTMService = (config?: STMConfig): STMService => {\n  const logPath = config?.logPath || \"./memory/stm.jsonl\";\n\n  const ensureDirectory = async () => {\n    const dir = path.dirname(logPath);\n    await fs.mkdir(dir, { recursive: true });\n  };\n\n  const log = async (event: Omit<MemoryEvent, \"timestamp\">) => {\n    await ensureDirectory();\n\n    const memoryEvent: MemoryEvent = {\n      ...event,\n      timestamp: new Date().toISOString(),\n    };\n\n    const line = JSON.stringify(memoryEvent) + \"\\n\";\n    await fs.appendFile(logPath, line);\n  };\n\n  const readAllEvents = async (): Promise<MemoryEvent[]> => {\n    try {\n      const content = await fs.readFile(logPath, \"utf-8\");\n      const events: MemoryEvent[] = [];\n\n      content\n        .split(\"\\n\")\n        .filter((line) => line.trim())\n        .forEach((line) => {\n          try {\n            events.push(JSON.parse(line) as MemoryEvent);\n          } catch (parseError) {\n            // Skip malformed lines\n            console.warn(\n              \"Skipping malformed JSON line:\",\n              line.substring(0, 50) + \"...\"\n            );\n          }\n        });\n\n      return events;\n    } catch (error: any) {\n      // File doesn't exist yet\n      if (error.code === \"ENOENT\") {\n        return [];\n      }\n      throw error;\n    }\n  };\n\n  const getRecent = async (hours = 24): Promise<MemoryEvent[]> => {\n    const events = await readAllEvents();\n    const cutoff = Date.now() - hours * 60 * 60 * 1000;\n\n    return events.filter(\n      (event) => new Date(event.timestamp).getTime() > cutoff\n    );\n  };\n\n  const getByType = async (\n    type: string,\n    limit = 100\n  ): Promise<MemoryEvent[]> => {\n    const events = await readAllEvents();\n    const filtered = events.filter((event) => event.type === type);\n\n    // Return the most recent events up to the limit\n    return filtered.slice(-limit);\n  };\n\n  const clear = async () => {\n    try {\n      await fs.unlink(logPath);\n    } catch (error: any) {\n      // Ignore if file doesn't exist\n      if (error.code !== \"ENOENT\") {\n        throw error;\n      }\n    }\n  };\n\n  return {\n    log,\n    getRecent,\n    getByType,\n    clear,\n    getLogPath: () => logPath,\n  };\n};\n","import { promises as fs } from \"fs\";\nimport * as path from \"path\";\nimport type {\n  MTMService,\n  MTMConfig,\n  MTMSummary,\n  STMService,\n  MemoryEvent,\n} from \"./memory.types.js\";\nimport type { LLMService } from \"../../types/llm.types.js\";\n\n/**\n * Creates a Mid-Term Memory service that summarizes daily events\n */\nexport const createMTMService = (deps: {\n  stm: STMService;\n  llmService?: LLMService;\n  config?: MTMConfig;\n}): MTMService => {\n  const { stm, llmService, config } = deps;\n  const storagePath = config?.storagePath || \"./memory/mtm\";\n\n  const ensureDirectory = async () => {\n    await fs.mkdir(storagePath, { recursive: true });\n  };\n\n  /**\n   * Extract facts from conversation messages using simple patterns\n   */\n  const extractFactsFromEvents = (\n    events: MemoryEvent[]\n  ): MTMSummary[\"extractedFacts\"] => {\n    const facts: MTMSummary[\"extractedFacts\"] = {\n      userPreferences: [],\n      keyTopics: [],\n      importantEvents: [],\n      relationships: {},\n    };\n\n    // Extract user name - prioritize explicit name introductions\n    let nameFound = false;\n    events.forEach((event) => {\n      if (event.type.includes(\"message\") && event.data.message && !nameFound) {\n        const message = event.data.message.toLowerCase();\n\n        // First check for explicit name introductions\n        const explicitNamePatterns = [/my name is (\\w+)/i, /call me (\\w+)/i];\n\n        for (const pattern of explicitNamePatterns) {\n          const match = event.data.message.match(pattern);\n          if (match && match[1]) {\n            facts.userName =\n              match[1].charAt(0).toUpperCase() + match[1].slice(1);\n            nameFound = true;\n            return;\n          }\n        }\n      }\n    });\n\n    // If no explicit name found, check for implicit patterns\n    if (!nameFound) {\n      events.forEach((event) => {\n        if (\n          event.type.includes(\"message\") &&\n          event.data.message &&\n          !nameFound\n        ) {\n          const implicitPatterns = [/i'?m (\\w+)/i, /i am (\\w+)/i];\n\n          for (const pattern of implicitPatterns) {\n            const match = event.data.message.match(pattern);\n            if (match && match[1]) {\n              // Skip common verbs that might follow \"I am\"\n              const commonVerbs = [\n                \"working\",\n                \"doing\",\n                \"going\",\n                \"making\",\n                \"trying\",\n                \"looking\",\n              ];\n              if (!commonVerbs.includes(match[1].toLowerCase())) {\n                facts.userName =\n                  match[1].charAt(0).toUpperCase() + match[1].slice(1);\n                nameFound = true;\n                return;\n              }\n            }\n          }\n        }\n      });\n    }\n\n    // Extract preferences and topics\n    events.forEach((event) => {\n      if (event.type.includes(\"message\") && event.data.message) {\n        const message = event.data.message.toLowerCase();\n\n        // Extract preferences (my favorite X is Y)\n        const prefPattern = /my favorite (\\w+) is ([^.!?]+)/gi;\n        let prefMatch;\n        while ((prefMatch = prefPattern.exec(event.data.message)) !== null) {\n          facts.userPreferences?.push(\n            `favorite ${prefMatch[1]}: ${prefMatch[2].trim()}`\n          );\n        }\n\n        // Extract topics (simple keyword extraction)\n        const topicKeywords = [\n          \"discussing\",\n          \"talking about\",\n          \"working on\",\n          \"interested in\",\n        ];\n        topicKeywords.forEach((keyword) => {\n          if (message.includes(keyword)) {\n            const afterKeyword = message.split(keyword)[1];\n            if (afterKeyword) {\n              const topic = afterKeyword.split(/[.,!?]/)[0].trim();\n              if (topic.length > 3 && topic.length < 50) {\n                facts.keyTopics?.push(topic);\n              }\n            }\n          }\n        });\n      }\n    });\n\n    // Deduplicate arrays\n    facts.userPreferences = [...new Set(facts.userPreferences)];\n    facts.keyTopics = [...new Set(facts.keyTopics)];\n\n    return facts;\n  };\n\n  /**\n   * Use LLM to extract facts if available\n   */\n  const extractFactsWithLLM = async (\n    events: MemoryEvent[]\n  ): Promise<MTMSummary[\"extractedFacts\"]> => {\n    if (!llmService) {\n      return extractFactsFromEvents(events);\n    }\n\n    // Prepare conversation transcript\n    const transcript = events\n      .filter((e) => e.type.includes(\"message\"))\n      .map((e) => {\n        const role = e.type.includes(\"user\") ? \"User\" : \"Assistant\";\n        const content = e.data.message || e.data.content || \"\";\n        return `${role}: ${content}`;\n      })\n      .join(\"\\n\");\n\n    const prompt = `Extract key facts from this conversation transcript. Return JSON with these fields:\n- userName: The user's name if mentioned\n- userPreferences: Array of user preferences mentioned (e.g., \"favorite color: blue\")\n- keyTopics: Main topics discussed\n- importantEvents: Any important events or decisions mentioned\n- relationships: Key relationships mentioned (e.g., job role, project involvement)\n\nTranscript:\n${transcript}\n\nReturn only valid JSON, no explanations.`;\n\n    try {\n      const response = await llmService.runLLM({\n        sendUpdate: async (data) => console.log(data),\n        messages: [\n          {\n            role: \"system\",\n            content:\n              \"You are a fact extraction assistant. Extract facts from conversations and return JSON.\",\n          },\n          { role: \"user\", content: prompt },\n        ],\n      });\n\n      if (response.content) {\n        // Try to parse LLM response as JSON\n        const cleanJson = response.content\n          .replace(/```json\\n?/g, \"\")\n          .replace(/```\\n?/g, \"\");\n        return JSON.parse(cleanJson);\n      }\n    } catch (error) {\n      console.warn(\n        \"LLM fact extraction failed, falling back to patterns:\",\n        error\n      );\n    }\n\n    // Fallback to pattern-based extraction\n    return extractFactsFromEvents(events);\n  };\n\n  /**\n   * Generate markdown representation of the summary\n   */\n  const generateMarkdownSummary = (\n    summary: MTMSummary,\n    dayEvents: MemoryEvent[]\n  ): string => {\n    let markdown = `# Daily Memory Summary - ${summary.date}\\n\\n`;\n    markdown += `*Generated at: ${new Date(\n      summary.createdAt\n    ).toLocaleString()}*\\n\\n`;\n\n    // User Profile Section\n    if (\n      summary.extractedFacts.userName ||\n      summary.extractedFacts.userPreferences?.length\n    ) {\n      markdown += `## User Profile\\n\\n`;\n      if (summary.extractedFacts.userName) {\n        markdown += `- **Name**: ${summary.extractedFacts.userName}\\n`;\n      }\n      if (summary.extractedFacts.userPreferences?.length) {\n        markdown += `\\n### Preferences\\n`;\n        summary.extractedFacts.userPreferences.forEach((pref) => {\n          markdown += `- ${pref}\\n`;\n        });\n      }\n      markdown += \"\\n\";\n    }\n\n    // Conversation Overview\n    markdown += `## Conversation Overview\\n\\n`;\n    markdown += `- **Total Conversations**: ${summary.conversations.count}\\n`;\n    markdown += `- **Messages Exchanged**: ${summary.conversations.totalMessages}\\n`;\n    markdown += `- **Average Message Length**: ${summary.conversations.avgLength} characters\\n\\n`;\n\n    // Key Topics\n    if (summary.conversations.topics.length > 0) {\n      markdown += `### Topics Discussed\\n`;\n      summary.conversations.topics.forEach((topic) => {\n        markdown += `- ${topic}\\n`;\n      });\n      markdown += \"\\n\";\n    }\n\n    // Highlights\n    if (summary.highlights.length > 0) {\n      markdown += `## Key Highlights\\n\\n`;\n      summary.highlights.forEach((highlight) => {\n        markdown += `- ${highlight}\\n`;\n      });\n      markdown += \"\\n\";\n    }\n\n    // Conversation Transcript Samples\n    const conversations = dayEvents.filter(\n      (e) => e.type.includes(\"message\") || e.type.includes(\"response\")\n    );\n    if (conversations.length > 0) {\n      markdown += `## Conversation Samples\\n\\n`;\n\n      // Group by conversation session\n      const sessions: Record<string, MemoryEvent[]> = {};\n      conversations.forEach((event) => {\n        const sessionId = event.metadata?.conversationId || \"unknown\";\n        if (!sessions[sessionId]) sessions[sessionId] = [];\n        sessions[sessionId].push(event);\n      });\n\n      // Show first few exchanges from each session\n      Object.entries(sessions)\n        .slice(0, 3)\n        .forEach(([sessionId, events]) => {\n          const sessionStart = new Date(\n            events[0].timestamp\n          ).toLocaleTimeString();\n          markdown += `### Session at ${sessionStart}\\n\\n`;\n\n          events.slice(0, 6).forEach((event) => {\n            const role = event.type.includes(\"user\")\n              ? \"**User**\"\n              : \"**Assistant**\";\n            const content = event.data.message || event.data.content || \"\";\n            markdown += `${role}: ${content}\\n\\n`;\n          });\n\n          if (events.length > 6) {\n            markdown += `*... ${\n              events.length - 6\n            } more messages in this session*\\n\\n`;\n          }\n        });\n    }\n\n    // Event Statistics\n    markdown += `## Event Statistics\\n\\n`;\n    markdown += `| Event Type | Count |\\n`;\n    markdown += `|------------|-------|\\n`;\n    Object.entries(summary.eventStatistics)\n      .sort(([, a], [, b]) => b - a)\n      .forEach(([type, count]) => {\n        markdown += `| ${type} | ${count} |\\n`;\n      });\n\n    return markdown;\n  };\n\n  /**\n   * Summarize a day's events into MTM\n   */\n  const summarizeDay = async (date = new Date()): Promise<MTMSummary> => {\n    const dateStr = date.toISOString().split(\"T\")[0];\n\n    // Get all events for the day\n    const startOfDay = new Date(date);\n    startOfDay.setHours(0, 0, 0, 0);\n    const endOfDay = new Date(date);\n    endOfDay.setHours(23, 59, 59, 999);\n\n    const allEvents = await stm.getRecent(24 * 7); // Get a week to filter\n    const dayEvents = allEvents.filter((e) => {\n      const eventTime = new Date(e.timestamp);\n      return eventTime >= startOfDay && eventTime <= endOfDay;\n    });\n\n    // Count events by type\n    const eventStatistics: Record<string, number> = {};\n    dayEvents.forEach((event) => {\n      eventStatistics[event.type] = (eventStatistics[event.type] || 0) + 1;\n    });\n\n    // Extract conversation stats\n    const conversationStarts = dayEvents.filter(\n      (e) => e.type === \"conversation.started\"\n    ).length;\n    const userMessages = dayEvents.filter(\n      (e) => e.type === \"conversation.user.message\"\n    );\n    const avgMessageLength =\n      userMessages.length > 0\n        ? userMessages.reduce(\n            (sum, e) => sum + (e.data.message?.length || 0),\n            0\n          ) / userMessages.length\n        : 0;\n\n    // Extract facts\n    const extractedFacts = await extractFactsWithLLM(dayEvents);\n\n    // Generate highlights\n    const highlights: string[] = [];\n    if (extractedFacts.userName) {\n      highlights.push(`Learned user's name: ${extractedFacts.userName}`);\n    }\n    if (conversationStarts > 0) {\n      highlights.push(\n        `Had ${conversationStarts} conversation${\n          conversationStarts > 1 ? \"s\" : \"\"\n        }`\n      );\n    }\n    if (extractedFacts.keyTopics && extractedFacts.keyTopics.length > 0) {\n      highlights.push(\n        `Discussed: ${extractedFacts.keyTopics.slice(0, 3).join(\", \")}`\n      );\n    }\n\n    const summary: MTMSummary = {\n      date: dateStr,\n      extractedFacts,\n      conversations: {\n        count: conversationStarts,\n        totalMessages: userMessages.length,\n        avgLength: Math.round(avgMessageLength),\n        topics: extractedFacts.keyTopics || [],\n      },\n      eventStatistics,\n      highlights,\n      createdAt: new Date().toISOString(),\n    };\n\n    // Save both JSON and Markdown versions\n    await ensureDirectory();\n\n    // Save JSON summary\n    const summaryPath = path.join(storagePath, `${dateStr}.json`);\n    await fs.writeFile(summaryPath, JSON.stringify(summary, null, 2));\n\n    // Generate and save Markdown summary\n    const markdown = generateMarkdownSummary(summary, dayEvents);\n    const markdownPath = path.join(storagePath, `${dateStr}.md`);\n    await fs.writeFile(markdownPath, markdown);\n\n    return summary;\n  };\n\n  /**\n   * Get a summary for a specific date\n   */\n  const getSummary = async (date: Date): Promise<MTMSummary | null> => {\n    const dateStr = date.toISOString().split(\"T\")[0];\n    const summaryPath = path.join(storagePath, `${dateStr}.json`);\n\n    try {\n      const content = await fs.readFile(summaryPath, \"utf-8\");\n      return JSON.parse(content);\n    } catch {\n      return null;\n    }\n  };\n\n  /**\n   * List all available summaries\n   */\n  const listSummaries = async (): Promise<string[]> => {\n    try {\n      await ensureDirectory();\n      const files = await fs.readdir(storagePath);\n      return files\n        .filter((f) => f.endsWith(\".json\"))\n        .map((f) => f.replace(\".json\", \"\"))\n        .sort();\n    } catch {\n      return [];\n    }\n  };\n\n  /**\n   * Get markdown summary for a specific date\n   */\n  const getSummaryMarkdown = async (date: Date): Promise<string | null> => {\n    const dateStr = date.toISOString().split(\"T\")[0];\n    const markdownPath = path.join(storagePath, `${dateStr}.md`);\n\n    try {\n      return await fs.readFile(markdownPath, \"utf-8\");\n    } catch {\n      return null;\n    }\n  };\n\n  /**\n   * Search facts across all summaries\n   */\n  const searchFacts = async (query: string): Promise<MTMSummary[]> => {\n    const summaryDates = await listSummaries();\n    const results: MTMSummary[] = [];\n    const queryLower = query.toLowerCase();\n\n    for (const dateStr of summaryDates) {\n      const summary = await getSummary(new Date(dateStr));\n      if (summary) {\n        // Search in extracted facts\n        const factsStr = JSON.stringify(summary.extractedFacts).toLowerCase();\n        const highlightsStr = summary.highlights.join(\" \").toLowerCase();\n\n        if (\n          factsStr.includes(queryLower) ||\n          highlightsStr.includes(queryLower)\n        ) {\n          results.push(summary);\n        }\n      }\n    }\n\n    return results;\n  };\n\n  return {\n    summarizeDay,\n    getSummary,\n    getSummaryMarkdown,\n    listSummaries,\n    searchFacts,\n    getStoragePath: () => storagePath,\n  };\n};\n","import { z } from \"zod\";\nimport { createNamedTool } from \"../types/tool.types.js\";\nimport type {\n  STMService,\n  MTMService,\n} from \"../services/memory/memory.types.js\";\n\n/**\n * Creates memory tools that agents can use to query their own memory\n */\nexport const createMemoryTools = (deps: {\n  stm: STMService;\n  mtm?: MTMService;\n}) => {\n  const { stm, mtm } = deps;\n  const searchRecentMemory = createNamedTool({\n    name: \"search_recent_memory\",\n    description:\n      \"Search through recent memory events from the last N hours. Useful for recalling recent conversations, events, or activities.\",\n    inputSchema: z.object({\n      hours: z\n        .number()\n        .default(24)\n        .describe(\"How many hours back to search (default: 24)\"),\n      query: z\n        .string()\n        .optional()\n        .describe(\"Optional text to search for in memory events\"),\n      eventType: z\n        .string()\n        .optional()\n        .describe(\n          'Optional event type filter (e.g., \"conversation.user.message\")'\n        ),\n    }),\n    execute: async ({ hours, query, eventType }) => {\n      const events = await stm.getRecent(hours);\n\n      let filtered = events;\n\n      // Filter by event type if specified\n      if (eventType) {\n        filtered = filtered.filter((e) => e.type === eventType);\n      }\n\n      // Filter by query if specified\n      if (query) {\n        const queryLower = query.toLowerCase();\n        filtered = filtered.filter((e) => {\n          const eventStr = JSON.stringify(e.data).toLowerCase();\n          return eventStr.includes(queryLower);\n        });\n      }\n\n      // Format results for the agent\n      const summary = {\n        totalEvents: events.length,\n        filteredEvents: filtered.length,\n        timeRange: `last ${hours} hours`,\n        events: filtered.slice(-10).map((e) => ({\n          time: new Date(e.timestamp).toLocaleString(),\n          type: e.type,\n          preview: JSON.stringify(e.data).substring(0, 100) + \"...\",\n          tags: e.metadata?.tags || [],\n        })),\n      };\n\n      return summary;\n    },\n  });\n\n  const recallConversationHistory = createNamedTool({\n    name: \"recall_conversation_history\",\n    description:\n      'Recall previous messages from this or recent conversations. Useful when user refers to \"earlier\", \"before\", \"what we discussed\".',\n    inputSchema: z.object({\n      limit: z\n        .number()\n        .default(10)\n        .describe(\"Maximum number of messages to recall\"),\n      messageType: z\n        .enum([\"user\", \"agent\", \"both\"])\n        .default(\"both\")\n        .describe(\"Type of messages to recall\"),\n    }),\n    execute: async ({ limit, messageType }) => {\n      const userMessages =\n        messageType !== \"agent\"\n          ? await stm.getByType(\"conversation.user.message\", limit)\n          : [];\n\n      const agentMessages =\n        messageType !== \"user\"\n          ? await stm.getByType(\"conversation.agent.response\", limit)\n          : [];\n\n      // Combine and sort by timestamp\n      const allMessages = [...userMessages, ...agentMessages]\n        .sort(\n          (a, b) =>\n            new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime()\n        )\n        .slice(-limit);\n\n      return {\n        messageCount: allMessages.length,\n        messages: allMessages.map((e) => ({\n          time: new Date(e.timestamp).toLocaleString(),\n          role: e.type.includes(\"user\") ? \"user\" : \"agent\",\n          content: e.data.message || e.data.content || \"[No content]\",\n        })),\n      };\n    },\n  });\n\n  const getMemoryStatistics = createNamedTool({\n    name: \"get_memory_statistics\",\n    description:\n      \"Get statistics about memory usage, event types, and patterns.\",\n    inputSchema: z.object({\n      hours: z.number().default(24).describe(\"Time window for statistics\"),\n    }),\n    execute: async ({ hours }) => {\n      const events = await stm.getRecent(hours);\n\n      // Group by event type\n      const eventsByType: Record<string, number> = {};\n      const eventsBySource: Record<string, number> = {};\n      const eventsByHour: Record<string, number> = {};\n\n      events.forEach((e) => {\n        // Count by type\n        eventsByType[e.type] = (eventsByType[e.type] || 0) + 1;\n\n        // Count by source\n        const source = e.metadata?.source || \"unknown\";\n        eventsBySource[source] = (eventsBySource[source] || 0) + 1;\n\n        // Count by hour\n        const hour = new Date(e.timestamp).getHours();\n        const hourKey = `${hour}:00`;\n        eventsByHour[hourKey] = (eventsByHour[hourKey] || 0) + 1;\n      });\n\n      return {\n        totalEvents: events.length,\n        timeWindow: `${hours} hours`,\n        eventTypes: eventsByType,\n        sources: eventsBySource,\n        activityByHour: eventsByHour,\n        mostActiveHour:\n          Object.entries(eventsByHour).sort(([, a], [, b]) => b - a)[0]?.[0] ||\n          \"none\",\n        mostCommonType:\n          Object.entries(eventsByType).sort(([, a], [, b]) => b - a)[0]?.[0] ||\n          \"none\",\n      };\n    },\n  });\n\n  const searchMemoryByTags = createNamedTool({\n    name: \"search_memory_by_tags\",\n    description:\n      \"Search memory events by their tags. Useful for finding related events across different categories.\",\n    inputSchema: z.object({\n      tags: z\n        .array(z.string())\n        .describe('Tags to search for (e.g., [\"work\", \"meeting\"])'),\n      matchAll: z\n        .boolean()\n        .default(false)\n        .describe(\n          \"If true, event must have ALL tags. If false, ANY tag matches.\"\n        ),\n    }),\n    execute: async ({ tags, matchAll }) => {\n      const events = await stm.getRecent(168); // Search last week\n\n      const filtered = events.filter((e) => {\n        const eventTags = e.metadata?.tags || [];\n        if (matchAll) {\n          // Event must have all requested tags\n          return tags.every((tag) => eventTags.includes(tag));\n        } else {\n          // Event must have at least one requested tag\n          return tags.some((tag) => eventTags.includes(tag));\n        }\n      });\n\n      return {\n        searchTags: tags,\n        matchMode: matchAll ? \"all\" : \"any\",\n        foundEvents: filtered.length,\n        events: filtered.slice(-10).map((e) => ({\n          time: new Date(e.timestamp).toLocaleString(),\n          type: e.type,\n          tags: e.metadata?.tags || [],\n          data: e.data,\n        })),\n      };\n    },\n  });\n\n  const recallFacts = createNamedTool({\n    name: \"recall_facts\",\n    description:\n      \"Recall important facts like user name, preferences, and key information from memory summaries.\",\n    inputSchema: z.object({\n      query: z\n        .string()\n        .describe(\n          'What fact to search for (e.g., \"user name\", \"favorite color\", \"preferences\")'\n        ),\n    }),\n    execute: async ({ query }) => {\n      if (!mtm) {\n        return {\n          error: \"Mid-term memory not available\",\n          suggestion: \"Try using search_recent_memory instead\",\n        };\n      }\n\n      // First check today's summary\n      const today = await mtm.getSummary(new Date());\n\n      // Then search historical summaries if needed\n      const historicalResults = await mtm.searchFacts(query);\n\n      // Compile facts\n      const facts: any = {};\n\n      // Priority: today's facts first\n      if (today?.extractedFacts) {\n        Object.assign(facts, today.extractedFacts);\n      }\n\n      // Then historical facts\n      historicalResults.forEach((summary) => {\n        if (summary.extractedFacts.userName && !facts.userName) {\n          facts.userName = summary.extractedFacts.userName;\n        }\n        if (summary.extractedFacts.userPreferences) {\n          facts.userPreferences = [\n            ...(facts.userPreferences || []),\n            ...summary.extractedFacts.userPreferences,\n          ];\n        }\n      });\n\n      // Deduplicate preferences\n      if (facts.userPreferences) {\n        facts.userPreferences = [...new Set(facts.userPreferences)];\n      }\n\n      return {\n        query,\n        foundFacts: facts,\n        sourceDates: [\n          today?.date,\n          ...historicalResults.map((s) => s.date),\n        ].filter(Boolean),\n      };\n    },\n  });\n\n  // Return Vercel-native tools object: { [name]: AiTool }\n  return {\n    ...searchRecentMemory,\n    ...recallConversationHistory,\n    ...getMemoryStatistics,\n    ...searchMemoryByTags,\n    ...recallFacts,\n  };\n};\n\n/**\n * All memory tools as an array for easy registration\n */\nexport const getMemoryToolsArray = (deps: {\n  stm: STMService;\n  mtm?: MTMService;\n}) => {\n  const tools = createMemoryTools(deps);\n  return Object.values(tools);\n};\n","import { z } from \"zod\";\nimport { tool } from \"ai\";\nimport type { GridTool } from \"./types.js\";\n\n/**\n * Calculator tool for basic math operations\n */\nexport const toolDefinition = {\n  name: \"calculator\",\n  description: \"Perform basic math calculations\",\n  inputSchema: z.object({\n    operation: z\n      .enum([\"add\", \"subtract\", \"multiply\", \"divide\"])\n      .describe(\"The math operation to perform\"),\n    a: z.number().describe(\"First number\"),\n    b: z.number().describe(\"Second number\"),\n  }),\n};\n\nexport const calculatorToolWithoutExecute = tool(toolDefinition);\n\nexport const calculatorToolWithExecute = tool({\n  ...toolDefinition,\n  execute: async ({ operation, a, b }) => {\n    let result: number;\n\n    switch (operation) {\n      case \"add\":\n        result = a + b;\n        break;\n      case \"subtract\":\n        result = a - b;\n        break;\n      case \"multiply\":\n        result = a * b;\n        break;\n      case \"divide\":\n        if (b === 0) {\n          return { error: \"Division by zero is not allowed\", result: null };\n        }\n        result = a / b;\n        break;\n      default:\n        return { error: \"Invalid operation\", result: null };\n    }\n\n    return {\n      result,\n      calculation: `${a} ${operation} ${b} = ${result}`,\n    };\n  },\n});\n\nexport const calculatorTool: GridTool = {\n  withExecute: calculatorToolWithExecute,\n  withoutExecute: calculatorToolWithoutExecute,\n  definition: toolDefinition,\n};\n","import { z } from \"zod\";\nimport { tool } from \"ai\";\nimport type { GridTool } from \"./types.js\";\n\n/**\n * Current time tool\n */\nexport const toolDefinition = {\n  name: \"getCurrentTime\",\n  description: \"Get the current date and time\",\n  inputSchema: z.object({\n    timezone: z\n      .string()\n      .optional()\n      .describe(\"Timezone (e.g., 'UTC', 'America/New_York')\"),\n  }),\n};\n\n// this is used, when we not using vercel ai sdk execution of tools, but when we use our custom ToolExecutor\nexport const currentTimeToolWithoutExecute = tool(toolDefinition);\n\nexport const currentTimeToolWithExecute = tool({\n  ...toolDefinition,\n  execute: async ({ timezone }) => {\n    const now = new Date();\n\n    if (timezone) {\n      try {\n        const formatter = new Intl.DateTimeFormat(\"en-US\", {\n          timeZone: timezone,\n          dateStyle: \"full\",\n          timeStyle: \"long\",\n        });\n        return {\n          time: formatter.format(now),\n          timezone,\n          timestamp: now.toISOString(),\n        };\n      } catch (error) {\n        return {\n          error: `Invalid timezone: ${timezone}`,\n          fallback: now.toISOString(),\n        };\n      }\n    }\n\n    return {\n      time: now.toLocaleString(),\n      timezone: \"local\",\n      timestamp: now.toISOString(),\n    };\n  },\n});\n\nexport const currentTimeTool: GridTool = {\n  withExecute: currentTimeToolWithExecute,\n  withoutExecute: currentTimeToolWithoutExecute,\n  definition: toolDefinition,\n};\n","import { z } from \"zod\";\nimport { tool } from \"ai\";\nimport type { GridTool } from \"./types.js\";\nimport FirecrawlApp from \"@mendable/firecrawl-js\";\n\n/**\n * Read URL tool\n */\nexport const toolDefinition = {\n  name: \"readUrl\",\n  description: \"Read the content of a url\",\n  inputSchema: z.object({\n    reasoningText: z.string().describe(\"why did you pick this tool?\"),\n    url: z\n      .string()\n      .describe(\n        \"The url to read. The LLM will return a response that will be used to answer the user's message.\"\n      ),\n  }),\n};\n\n// Default tool without execute - requires Firecrawl API key to be configured\nexport const readUrlToolWithoutExecute = tool(toolDefinition);\n\n// Default tool with execute - requires FIRECRAWL_API_KEY environment variable\nexport const readUrlToolWithExecute = tool({\n  ...toolDefinition,\n  execute: async ({ reasoningText, url }) => {\n    const apiKey = process.env.FIRECRAWL_API_KEY || \"\";\n    if (!apiKey) {\n      return \"Missing Firecrawl API key. Please set the FIRECRAWL_API_KEY environment variable.\";\n    }\n\n    const firecrawl = new FirecrawlApp({ apiKey });\n\n    try {\n      const result = await firecrawl.scrapeUrl(url);\n\n      if (result.success) {\n        return result.markdown as string;\n      } else {\n        return `Error scraping URL: ${result.error}`;\n      }\n    } catch (error) {\n      return `Failed to scrape URL: ${\n        error instanceof Error ? error.message : \"Unknown error\"\n      }`;\n    }\n  },\n});\n\nexport const readUrlTool: GridTool = {\n  withExecute: readUrlToolWithExecute,\n  withoutExecute: readUrlToolWithoutExecute,\n  definition: toolDefinition,\n};\n\n/**\n * Create a read URL tool with Firecrawl configuration\n * Factory function for custom configurations\n */\nexport const createReadUrlTool = (config?: { firecrawlApiKey?: string }) => {\n  const apiKey = config?.firecrawlApiKey || process.env.FIRECRAWL_API_KEY || \"\";\n  if (!apiKey) {\n    throw new Error(\n      \"Missing Firecrawl API key. Please provide it via config or the FIRECRAWL_API_KEY environment variable.\"\n    );\n  }\n  const firecrawl = new FirecrawlApp({ apiKey });\n\n  return tool({\n    ...toolDefinition,\n    execute: async ({ reasoningText, url }) => {\n      try {\n        const result = await firecrawl.scrapeUrl(url);\n\n        if (result.success) {\n          return result.markdown as string;\n        } else {\n          return `Error scraping URL: ${result.error}`;\n        }\n      } catch (error) {\n        return `Failed to scrape URL: ${\n          error instanceof Error ? error.message : \"Unknown error\"\n        }`;\n      }\n    },\n  });\n};\n","import { z } from \"zod\";\nimport { tool } from \"ai\";\nimport type { GridTool } from \"./types.js\";\n\n/**\n * Random number generator tool\n */\nexport const toolDefinition = {\n  name: \"randomNumber\",\n  description: \"Generate a random number within a specified range\",\n  inputSchema: z.object({\n    min: z.number().describe(\"Minimum value (inclusive)\"),\n    max: z.number().describe(\"Maximum value (inclusive)\"),\n    integer: z\n      .boolean()\n      .optional()\n      .describe(\"Whether to return an integer (default: false)\"),\n  }),\n};\n\nexport const randomNumberToolWithoutExecute = tool(toolDefinition);\n\nexport const randomNumberToolWithExecute = tool({\n  ...toolDefinition,\n  execute: async ({ min, max, integer = false }) => {\n    if (min > max) {\n      return {\n        error: \"Minimum value must be less than or equal to maximum value\",\n        min,\n        max,\n      };\n    }\n\n    const random = Math.random() * (max - min) + min;\n    const result = integer ? Math.floor(random) : random;\n\n    return {\n      value: result,\n      range: `[${min}, ${max}]`,\n      type: integer ? \"integer\" : \"float\",\n    };\n  },\n});\n\nexport const randomNumberTool: GridTool = {\n  withExecute: randomNumberToolWithExecute,\n  withoutExecute: randomNumberToolWithoutExecute,\n  definition: toolDefinition,\n};\n","import { z } from \"zod\";\nimport { tool } from \"ai\";\nimport type { GridTool } from \"./types.js\";\n\n/**\n * String utilities tool for various text operations\n */\nexport const toolDefinition = {\n  name: \"stringUtils\",\n  description:\n    \"Perform various string operations like reverse, count words/chars, or base64 encoding\",\n  inputSchema: z.object({\n    operation: z\n      .enum([\n        \"reverse\",\n        \"count_words\",\n        \"count_chars\",\n        \"to_base64\",\n        \"from_base64\",\n        \"to_uppercase\",\n        \"to_lowercase\",\n        \"trim\",\n      ])\n      .describe(\"The string operation to perform\"),\n    text: z.string().describe(\"The text to process\"),\n  }),\n};\n\nexport const stringUtilsToolWithoutExecute = tool(toolDefinition);\n\nexport const stringUtilsToolWithExecute = tool({\n  ...toolDefinition,\n  execute: async ({ operation, text }) => {\n    switch (operation) {\n      case \"reverse\":\n        return {\n          result: text.split(\"\").reverse().join(\"\"),\n          original_length: text.length,\n        };\n\n      case \"count_words\":\n        const words = text\n          .trim()\n          .split(/\\s+/)\n          .filter((word) => word.length > 0);\n        return {\n          result: words.length,\n          words: words,\n        };\n\n      case \"count_chars\":\n        return {\n          result: text.length,\n          without_spaces: text.replace(/\\s/g, \"\").length,\n        };\n\n      case \"to_base64\":\n        return {\n          result: Buffer.from(text).toString(\"base64\"),\n          original_length: text.length,\n        };\n\n      case \"from_base64\":\n        try {\n          const decoded = Buffer.from(text, \"base64\").toString();\n          return {\n            result: decoded,\n            decoded_length: decoded.length,\n          };\n        } catch (e) {\n          return {\n            error: \"Invalid base64 string\",\n            input: text,\n          };\n        }\n\n      case \"to_uppercase\":\n        return { result: text.toUpperCase() };\n\n      case \"to_lowercase\":\n        return { result: text.toLowerCase() };\n\n      case \"trim\":\n        return {\n          result: text.trim(),\n          removed_chars: text.length - text.trim().length,\n        };\n\n      default:\n        return { error: `Unknown operation: ${operation}` };\n    }\n  },\n});\n\nexport const stringUtilsTool: GridTool = {\n  withExecute: stringUtilsToolWithExecute,\n  withoutExecute: stringUtilsToolWithoutExecute,\n  definition: toolDefinition,\n};\n","import { z } from \"zod\";\nimport { tool } from \"ai\";\nimport type { GridTool } from \"./types.js\";\n\n/**\n * JSON formatter and validator tool\n */\nexport const toolDefinition = {\n  name: \"jsonFormatter\",\n  description: \"Format, validate, or minify JSON strings\",\n  inputSchema: z.object({\n    operation: z\n      .enum([\"format\", \"minify\", \"validate\"])\n      .describe(\"The operation to perform on the JSON\"),\n    json: z.string().describe(\"The JSON string to process\"),\n    indent: z\n      .number()\n      .optional()\n      .default(2)\n      .describe(\"Number of spaces for indentation when formatting\"),\n  }),\n};\n\nexport const jsonFormatterToolWithoutExecute = tool(toolDefinition);\n\nexport const jsonFormatterToolWithExecute = tool({\n  ...toolDefinition,\n  execute: async ({ operation, json, indent = 2 }) => {\n    try {\n      const parsed = JSON.parse(json);\n\n      switch (operation) {\n        case \"format\":\n          return {\n            result: JSON.stringify(parsed, null, indent),\n            valid: true,\n            size: {\n              original: json.length,\n              formatted: JSON.stringify(parsed, null, indent).length,\n            },\n          };\n\n        case \"minify\":\n          const minified = JSON.stringify(parsed);\n          return {\n            result: minified,\n            valid: true,\n            size: {\n              original: json.length,\n              minified: minified.length,\n              saved: json.length - minified.length,\n            },\n          };\n\n        case \"validate\":\n          return {\n            valid: true,\n            message: \"Valid JSON\",\n            type: Array.isArray(parsed) ? \"array\" : typeof parsed,\n            keys:\n              typeof parsed === \"object\" && !Array.isArray(parsed)\n                ? Object.keys(parsed)\n                : undefined,\n          };\n\n        default:\n          return { error: `Unknown operation: ${operation}` };\n      }\n    } catch (error) {\n      const errorMessage =\n        error instanceof Error ? error.message : \"Invalid JSON\";\n\n      // Try to provide helpful error context\n      let position: number | undefined;\n      const match = errorMessage.match(/position (\\d+)/);\n      if (match) {\n        position = parseInt(match[1]);\n      }\n\n      return {\n        valid: false,\n        error: errorMessage,\n        operation,\n        position,\n      };\n    }\n  },\n});\n\nexport const jsonFormatterTool: GridTool = {\n  withExecute: jsonFormatterToolWithExecute,\n  withoutExecute: jsonFormatterToolWithoutExecute,\n  definition: toolDefinition,\n};\n","import { z } from \"zod\";\nimport { tool } from \"ai\";\nimport type { GridTool } from \"./types.js\";\nimport { platform, arch, cpus, totalmem, freemem, homedir } from \"os\";\n\n/**\n * System information tool\n */\nexport const toolDefinition = {\n  name: \"systemInfo\",\n  description: \"Get system and environment information\",\n  inputSchema: z.object({\n    info: z\n      .enum([\"os\", \"memory\", \"cpu\", \"node\", \"env_vars\", \"uptime\"])\n      .describe(\"Type of system information to retrieve\"),\n  }),\n};\n\nexport const systemInfoToolWithoutExecute = tool(toolDefinition);\n\nexport const systemInfoToolWithExecute = tool({\n  ...toolDefinition,\n  execute: async ({ info }) => {\n    switch (info) {\n      case \"os\":\n        return {\n          platform: platform(),\n          arch: arch(),\n          homedir: homedir(),\n          hostname: process.env.HOSTNAME || \"unknown\",\n        };\n\n      case \"memory\":\n        const totalMem = totalmem();\n        const freeMem = freemem();\n        const usedMem = totalMem - freeMem;\n\n        return {\n          total: {\n            bytes: totalMem,\n            gb: `${(totalMem / 1024 / 1024 / 1024).toFixed(2)} GB`,\n          },\n          free: {\n            bytes: freeMem,\n            gb: `${(freeMem / 1024 / 1024 / 1024).toFixed(2)} GB`,\n          },\n          used: {\n            bytes: usedMem,\n            gb: `${(usedMem / 1024 / 1024 / 1024).toFixed(2)} GB`,\n          },\n          percentage: `${((usedMem / totalMem) * 100).toFixed(1)}%`,\n        };\n\n      case \"cpu\":\n        const cpuInfo = cpus();\n        return {\n          cores: cpuInfo.length,\n          model: cpuInfo[0]?.model,\n          speed: cpuInfo[0]?.speed ? `${cpuInfo[0].speed} MHz` : \"unknown\",\n          architecture: arch(),\n        };\n\n      case \"node\":\n        return {\n          version: process.version,\n          versions: {\n            node: process.versions.node,\n            v8: process.versions.v8,\n            npm: process.versions.npm || \"unknown\",\n          },\n          execPath: process.execPath,\n        };\n\n      case \"env_vars\":\n        // Return only safe, non-sensitive env vars\n        return {\n          NODE_ENV: process.env.NODE_ENV || \"development\",\n          PWD: process.env.PWD,\n          USER: process.env.USER,\n          SHELL: process.env.SHELL,\n          LANG: process.env.LANG,\n          TZ: process.env.TZ || \"not set\",\n        };\n\n      case \"uptime\":\n        const uptimeSeconds = process.uptime();\n        const days = Math.floor(uptimeSeconds / 86400);\n        const hours = Math.floor((uptimeSeconds % 86400) / 3600);\n        const minutes = Math.floor((uptimeSeconds % 3600) / 60);\n        const seconds = Math.floor(uptimeSeconds % 60);\n\n        return {\n          seconds: uptimeSeconds,\n          formatted: `${days}d ${hours}h ${minutes}m ${seconds}s`,\n          breakdown: { days, hours, minutes, seconds },\n        };\n\n      default:\n        return { error: `Unknown info type: ${info}` };\n    }\n  },\n});\n\nexport const systemInfoTool: GridTool = {\n  withExecute: systemInfoToolWithExecute,\n  withoutExecute: systemInfoToolWithoutExecute,\n  definition: toolDefinition,\n};\n","import { z } from \"zod\";\nimport { tool } from \"ai\";\nimport type { GridTool } from \"./types.js\";\n\n/**\n * Delay/timer tool for async operations\n */\nexport const toolDefinition = {\n  name: \"delay\",\n  description:\n    \"Wait for a specified amount of time (useful for timing operations or rate limiting)\",\n  inputSchema: z.object({\n    milliseconds: z\n      .number()\n      .min(0)\n      .max(5000)\n      .describe(\"Time to wait in milliseconds (max 5000ms/5 seconds)\"),\n  }),\n};\n\nexport const delayToolWithoutExecute = tool(toolDefinition);\n\nexport const delayToolWithExecute = tool({\n  ...toolDefinition,\n  execute: async ({ milliseconds }) => {\n    const start = Date.now();\n    const startTime = new Date(start).toISOString();\n\n    await new Promise((resolve) => setTimeout(resolve, milliseconds));\n\n    const end = Date.now();\n    const endTime = new Date(end).toISOString();\n    const elapsed = end - start;\n\n    return {\n      requested: milliseconds,\n      actual: elapsed,\n      drift: Math.abs(elapsed - milliseconds),\n      startTime,\n      endTime,\n      message: `Waited for ${elapsed}ms (requested: ${milliseconds}ms)`,\n    };\n  },\n});\n\nexport const delayTool: GridTool = {\n  withExecute: delayToolWithExecute,\n  withoutExecute: delayToolWithoutExecute,\n  definition: toolDefinition,\n};\n","import { z } from \"zod\";\nimport { tool } from \"ai\";\nimport type { GridTool } from \"./types.js\";\nimport { createHash } from \"crypto\";\n\n/**\n * Hash generator tool for various cryptographic hash functions\n */\nexport const toolDefinition = {\n  name: \"hash\",\n  description:\n    \"Generate various hash digests of text (MD5, SHA1, SHA256, SHA512)\",\n  inputSchema: z.object({\n    text: z.string().describe(\"Text to hash\"),\n    algorithm: z\n      .enum([\"md5\", \"sha1\", \"sha256\", \"sha512\"])\n      .describe(\"Hash algorithm to use\"),\n    encoding: z\n      .enum([\"hex\", \"base64\", \"base64url\"])\n      .optional()\n      .default(\"hex\")\n      .describe(\"Output encoding format\"),\n  }),\n};\n\nexport const hashToolWithoutExecute = tool(toolDefinition);\n\nexport const hashToolWithExecute = tool({\n  ...toolDefinition,\n  execute: async ({ text, algorithm, encoding = \"hex\" }) => {\n    try {\n      const hash = createHash(algorithm)\n        .update(text)\n        .digest(encoding as any);\n\n      return {\n        algorithm,\n        hash,\n        encoding,\n        length: hash.length,\n        input: {\n          text: text.length > 50 ? text.substring(0, 50) + \"...\" : text,\n          length: text.length,\n        },\n      };\n    } catch (error) {\n      return {\n        error:\n          error instanceof Error ? error.message : \"Failed to generate hash\",\n        algorithm,\n        encoding,\n      };\n    }\n  },\n});\n\nexport const hashTool: GridTool = {\n  withExecute: hashToolWithExecute,\n  withoutExecute: hashToolWithoutExecute,\n  definition: toolDefinition,\n};\n","import { z } from \"zod\";\nimport { tool } from \"ai\";\nimport type { GridTool } from \"./types.js\";\n\n/**\n * Data format converter tool\n */\nexport const toolDefinition = {\n  name: \"dataConverter\",\n  description: \"Convert between different data formats (JSON, CSV, TSV)\",\n  inputSchema: z.object({\n    from: z.enum([\"json\", \"csv\", \"tsv\"]).describe(\"Source format\"),\n    to: z.enum([\"json\", \"csv\", \"tsv\"]).describe(\"Target format\"),\n    data: z.string().describe(\"Data to convert\"),\n    options: z\n      .object({\n        headers: z\n          .boolean()\n          .optional()\n          .default(true)\n          .describe(\"Include headers in CSV/TSV output\"),\n        delimiter: z\n          .string()\n          .optional()\n          .describe(\"Custom delimiter for CSV (default: comma)\"),\n      })\n      .optional(),\n  }),\n};\n\nexport const dataConverterToolWithoutExecute = tool(toolDefinition);\n\nexport const dataConverterToolWithExecute = tool({\n  ...toolDefinition,\n  execute: async ({ from, to, data, options = {} }) => {\n    try {\n      // Same format - just return the data\n      if (from === to) {\n        return {\n          result: data,\n          message: \"Source and target formats are the same\",\n        };\n      }\n\n      let parsedData: any;\n\n      // Parse input based on format\n      switch (from) {\n        case \"json\":\n          parsedData = JSON.parse(data);\n          if (!Array.isArray(parsedData)) {\n            // Convert single object to array for CSV/TSV conversion\n            parsedData = [parsedData];\n          }\n          break;\n\n        case \"csv\":\n          parsedData = parseDelimited(data, \",\");\n          break;\n\n        case \"tsv\":\n          parsedData = parseDelimited(data, \"\\t\");\n          break;\n      }\n\n      // Convert to target format\n      let result: string;\n\n      switch (to) {\n        case \"json\":\n          result = JSON.stringify(parsedData, null, 2);\n          break;\n\n        case \"csv\":\n          result = toDelimited(\n            parsedData,\n            options.delimiter || \",\",\n            options.headers ?? true\n          );\n          break;\n\n        case \"tsv\":\n          result = toDelimited(parsedData, \"\\t\", options.headers ?? true);\n          break;\n\n        default:\n          return { error: `Unsupported target format: ${to}` };\n      }\n\n      return {\n        result,\n        from,\n        to,\n        records: Array.isArray(parsedData) ? parsedData.length : 1,\n      };\n    } catch (error) {\n      return {\n        error: error instanceof Error ? error.message : \"Conversion failed\",\n        from,\n        to,\n        hint: getErrorHint(from, error),\n      };\n    }\n  },\n});\n\n// Helper function to parse CSV/TSV\nfunction parseDelimited(data: string, delimiter: string): any[] {\n  const lines = data.trim().split(\"\\n\");\n  if (lines.length === 0) return [];\n\n  const headers = lines[0].split(delimiter).map((h) => h.trim());\n  const result = [];\n\n  for (let i = 1; i < lines.length; i++) {\n    const values = lines[i].split(delimiter).map((v) => v.trim());\n    const obj: any = {};\n\n    headers.forEach((header, index) => {\n      const value = values[index] || \"\";\n      // Try to parse numbers\n      const num = Number(value);\n      obj[header] = isNaN(num) || value === \"\" ? value : num;\n    });\n\n    result.push(obj);\n  }\n\n  return result;\n}\n\n// Helper function to convert to CSV/TSV\nfunction toDelimited(\n  data: any[],\n  delimiter: string,\n  includeHeaders: boolean\n): string {\n  if (!Array.isArray(data) || data.length === 0) {\n    return \"\";\n  }\n\n  const headers = Object.keys(data[0]);\n  const lines = [];\n\n  if (includeHeaders) {\n    lines.push(headers.join(delimiter));\n  }\n\n  for (const obj of data) {\n    const values = headers.map((header) => {\n      const value = obj[header];\n      // Quote values containing delimiter, quotes, or newlines\n      if (\n        typeof value === \"string\" &&\n        (value.includes(delimiter) ||\n          value.includes('\"') ||\n          value.includes(\"\\n\"))\n      ) {\n        return `\"${value.replace(/\"/g, '\"\"')}\"`;\n      }\n      return value?.toString() || \"\";\n    });\n    lines.push(values.join(delimiter));\n  }\n\n  return lines.join(\"\\n\");\n}\n\n// Helper function to provide error hints\nfunction getErrorHint(format: string, error: unknown): string {\n  const errorMsg = error instanceof Error ? error.message.toLowerCase() : \"\";\n\n  if (format === \"json\" && errorMsg.includes(\"json\")) {\n    return \"Make sure the JSON is valid. Common issues: missing quotes, trailing commas, or incorrect brackets.\";\n  }\n\n  if ((format === \"csv\" || format === \"tsv\") && errorMsg.includes(\"split\")) {\n    return \"Make sure the CSV/TSV data has consistent columns and proper line breaks.\";\n  }\n\n  return \"Check that the input data matches the specified format.\";\n}\n\nexport const dataConverterTool: GridTool = {\n  withExecute: dataConverterToolWithExecute,\n  withoutExecute: dataConverterToolWithoutExecute,\n  definition: toolDefinition,\n};\n","import { z } from \"zod\";\nimport { tool } from \"ai\";\nimport type { GridTool } from \"./types.js\";\nimport { createOpenAIImageService } from \"./services/openai-image.service.js\";\nimport { writeFileSync } from \"fs\";\nimport { join } from \"path\";\n\n/**\n * Create image tool\n */\nexport const toolDefinition = {\n  name: \"create_image\",\n  description: \"use this to create/generate an image.\",\n  inputSchema: z.object({\n    reasoningText: z\n      .string()\n      .describe(\"Why did you pick this tool to generate the image?\"),\n    prompt: z\n      .string()\n      .describe(\n        \"prompt for the image. Be sure to consider the user's original message when making the prompt. If you are unsure, then as the user to provide more details.\"\n      ),\n    whichModelToUse: z\n      .enum([\"openai\", \"leonardo\"])\n      .describe(\n        \"Which model to use to generate the image. If the user didn't mention which model to use, you must ask which one they want to use: openai, or leonardo. Make sure to look at the whole conversation history before making your choice.\"\n      ),\n    tags: z\n      .array(z.string())\n      .optional()\n      .describe(\"Optional tags to associate with the generated image\"),\n  }),\n};\n\nexport const createImageToolWithoutExecute = tool(toolDefinition);\n\nexport const createImageToolWithExecute = tool({\n  ...toolDefinition,\n  execute: async ({ reasoningText, prompt, whichModelToUse, tags }) => {\n    const timestamp = new Date().toISOString();\n    const imageTags = tags || [\"ai-generated\", whichModelToUse, \"demo\"];\n\n    if (whichModelToUse === \"openai\") {\n      try {\n        const openaiImageService = createOpenAIImageService({});\n        const response = await openaiImageService.createImage(prompt);\n\n        // Save the image to disk\n        const outputDir = join(process.cwd(), \"generated-images\");\n        const outputPath = join(outputDir, response.filename);\n\n        // Create directory if it doesn't exist\n        try {\n          const { mkdirSync } = await import(\"fs\");\n          mkdirSync(outputDir, { recursive: true });\n        } catch (error) {\n          // Directory might already exist\n        }\n\n        // Write the image buffer to file\n        writeFileSync(outputPath, response.image);\n\n        const final = {\n          message: `Image generated successfully using OpenAI`,\n          model: \"gpt-image-1\",\n          filename: response.filename,\n          filepath: outputPath,\n          size: response.image.length,\n          mimeType: response.mimeType,\n          extension: response.extension,\n          success: true,\n        };\n\n        return final;\n      } catch (error) {\n        return {\n          error: `Failed to generate image: ${\n            error instanceof Error ? error.message : String(error)\n          }`,\n          model: \"gpt-image-1\",\n          reasoningText,\n          prompt,\n          tags: imageTags,\n          timestamp,\n          success: false,\n        };\n      }\n    } else if (whichModelToUse === \"leonardo\") {\n      return {\n        message: `Image would be generated using Leonardo AI with prompt: \"${prompt}\"`,\n        model: \"leonardo-diffusion\",\n        reasoningText,\n        prompt,\n        tags: imageTags,\n        timestamp,\n        demoUrl: `https://example.com/demo-image-leonardo-${Date.now()}.png`,\n        note: \"This is a demo response. In production, this would generate an actual image using Leonardo AI's API.\",\n      };\n    } else {\n      return {\n        error: \"No model selected\",\n        availableModels: [\"openai\", \"leonardo\"],\n        timestamp,\n      };\n    }\n  },\n});\n\nexport const createImageTool: GridTool = {\n  withExecute: createImageToolWithExecute,\n  withoutExecute: createImageToolWithoutExecute,\n  definition: toolDefinition,\n};\n","import { experimental_generateImage as generateImage } from \"ai\";\nimport { createOpenAI } from \"@ai-sdk/openai\";\n\nexport const createOpenAIImageService = ({ apiKey }: { apiKey?: string }) => {\n  const openai = createOpenAI({\n    apiKey: apiKey || process.env.OPENAI_API_KEY,\n  });\n\n  return {\n    createImage: async (prompt: string) => {\n      const response = await generateImage({\n        model: openai.image(\"gpt-image-1\"),\n        size: \"1024x1024\",\n        prompt,\n      });\n\n      const image_base64 = response.images[0].base64;\n      if (!image_base64) {\n        const error = \"No image data returned from OpenAI\";\n        throw new Error(error);\n      }\n\n      // Get mimetype from response if available, otherwise default to PNG\n      const mimeType = response.images[0].mimeType || \"image/png\";\n      const extension = mimeType.split(\"/\")[1] || \"png\";\n\n      const buffer = Buffer.from(image_base64, \"base64\");\n      const filename = `ai-image_openai_${Date.now()}.${extension}`;\n\n      return {\n        image: buffer,\n        filename,\n        mimeType,\n        extension,\n      };\n    },\n  };\n};\n","import type { GridTool } from \"./types.js\";\nimport type { ToolSet } from \"ai\";\n\nexport const getTools = ({\n  executionType = \"custom\",\n  tools,\n}: {\n  executionType?: \"vercel-native\" | \"custom\";\n  tools: GridTool[];\n}) => {\n  const availableTools: ToolSet = tools.reduce((acc, tool) => {\n    return {\n      ...acc,\n      [tool.definition.name]:\n        executionType === \"vercel-native\"\n          ? tool.withExecute\n          : tool.withoutExecute,\n    };\n  }, {} as ToolSet);\n\n  return availableTools;\n};\n"],"mappings":"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","names":["createTool","import_zod","import_zod","import_zod","z","import_zod","tool","createTool","import_zod","z","import_ai","result","tool","isActive","fs","fs","import_fs","path","fs","import_zod","import_zod","import_ai","import_zod","import_ai","toolDefinition","import_zod","import_ai","toolDefinition","FirecrawlApp","import_zod","import_ai","toolDefinition","import_zod","import_ai","toolDefinition","import_zod","import_ai","toolDefinition","import_zod","import_ai","toolDefinition","import_zod","import_ai","toolDefinition","import_zod","import_ai","toolDefinition","import_zod","import_ai","toolDefinition","import_zod","import_ai","import_ai","import_openai","openai","generateImage","import_fs","toolDefinition","tool"]}