{"version":3,"sources":["../src/conversation-history.ts","../src/managers/ai-provider-manager.ts","../src/managers/tool-provider-manager.ts","../src/managers/system-message-manager.ts","../src/managers/function-call-manager.ts","../src/managers/analytics-manager.ts","../src/managers/request-limit-manager.ts","../src/utils.ts","../src/analyzers/token-analyzer.ts","../src/services/conversation-service.ts","../src/services/execution-service.ts","../src/managers/robota-config-manager.ts","../src/robota.ts","../src/providers/base-ai-provider.ts"],"names":["logger","encoding_for_model","get_encoding","hasToolCalls"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { FunctionCall, FunctionCallResult } from '@robota-sdk/tools';\n\n/**\n * Universal message role type - Provider-independent neutral role\n * \n * @public\n */\nexport type UniversalMessageRole = 'user' | 'assistant' | 'system' | 'tool';\n\n/**\n * Base message interface with common properties\n * \n * @public\n */\nexport interface BaseMessage {\n    /** Message creation timestamp */\n    timestamp: Date;\n\n    /** Additional metadata */\n    metadata?: Record<string, any>;\n}\n\n/**\n * User message interface - for messages from users/humans\n * \n * @public\n */\nexport interface UserMessage extends BaseMessage {\n    /** Message role - always 'user' */\n    role: 'user';\n\n    /** User message content */\n    content: string;\n\n    /** Optional user identifier */\n    name?: string;\n}\n\n/**\n * Assistant message interface - for AI responses\n * \n * @public\n */\nexport interface AssistantMessage extends BaseMessage {\n    /** Message role - always 'assistant' */\n    role: 'assistant';\n\n    /** Assistant response content (can be null when making tool calls) */\n    content: string | null;\n\n    /** Tool calls made by the assistant (OpenAI tool calling format) */\n    toolCalls?: Array<{\n        id: string;\n        type: 'function';\n        function: {\n            name: string;\n            arguments: string;\n        };\n    }>;\n}\n\n/**\n * System message interface - for system instructions and prompts\n * \n * @public\n */\nexport interface SystemMessage extends BaseMessage {\n    /** Message role - always 'system' */\n    role: 'system';\n\n    /** System instruction content */\n    content: string;\n\n    /** Optional system message identifier */\n    name?: string;\n}\n\n/**\n * Tool message interface - for tool execution results\n * \n * @public\n */\nexport interface ToolMessage extends BaseMessage {\n    /** Message role - always 'tool' */\n    role: 'tool';\n\n    /** Tool execution result summary */\n    content: string;\n\n    /** Tool call ID for OpenAI tool calling format */\n    toolCallId?: string;\n\n    /** Name of the tool that was executed */\n    name?: string;\n}\n\n/**\n * Universal message type covering all possible message variations\n * \n * This union type ensures type safety by requiring specific properties\n * based on the message role, preventing invalid combinations.\n * \n * @see {@link ../../apps/examples/04-sessions | Session and Conversation Examples}\n * \n * @public\n */\nexport type UniversalMessage = UserMessage | AssistantMessage | SystemMessage | ToolMessage;\n\n/**\n * Type guard functions for message type checking\n */\n\n/**\n * Check if a message is a user message\n * \n * @param message - Message to check\n * @returns True if the message is a user message\n */\nexport function isUserMessage(message: UniversalMessage): message is UserMessage {\n    return message.role === 'user';\n}\n\n/**\n * Check if a message is an assistant message\n * \n * @param message - Message to check\n * @returns True if the message is an assistant message\n */\nexport function isAssistantMessage(message: UniversalMessage): message is AssistantMessage {\n    return message.role === 'assistant';\n}\n\n/**\n * Check if a message is a system message\n * \n * @param message - Message to check\n * @returns True if the message is a system message\n */\nexport function isSystemMessage(message: UniversalMessage): message is SystemMessage {\n    return message.role === 'system';\n}\n\n/**\n * Check if a message is a tool message\n * \n * @param message - Message to check\n * @returns True if the message is a tool message\n */\nexport function isToolMessage(message: UniversalMessage): message is ToolMessage {\n    return message.role === 'tool';\n}\n\n/**\n * Message factory functions for creating type-safe messages\n */\n\n/**\n * Create a user message\n * \n * @param content - Message content\n * @param options - Optional message properties\n * @returns Type-safe user message\n */\nexport function createUserMessage(\n    content: string,\n    options?: { name?: string; metadata?: Record<string, any> }\n): UserMessage {\n    return {\n        role: 'user',\n        content,\n        name: options?.name,\n        timestamp: new Date(),\n        metadata: options?.metadata\n    };\n}\n\n/**\n * Create an assistant message\n * \n * @param content - Message content (can be null for tool-only messages)\n * @param options - Optional message properties\n * @returns Type-safe assistant message\n */\nexport function createAssistantMessage(\n    content: string | null,\n    options?: {\n        toolCalls?: Array<{\n            id: string;\n            type: 'function';\n            function: {\n                name: string;\n                arguments: string;\n            };\n        }>;\n        metadata?: Record<string, any>;\n    }\n): AssistantMessage {\n    return {\n        role: 'assistant',\n        content,\n        toolCalls: options?.toolCalls,\n        timestamp: new Date(),\n        metadata: options?.metadata\n    };\n}\n\n/**\n * Create a system message\n * \n * @param content - Message content\n * @param options - Optional message properties\n * @returns Type-safe system message\n */\nexport function createSystemMessage(\n    content: string,\n    options?: { name?: string; metadata?: Record<string, any> }\n): SystemMessage {\n    return {\n        role: 'system',\n        content,\n        name: options?.name,\n        timestamp: new Date(),\n        metadata: options?.metadata\n    };\n}\n\n/**\n * Create a tool message\n * \n * @param content - Message content\n * @param options - Optional message properties\n * @returns Type-safe tool message\n */\nexport function createToolMessage(\n    content: string,\n    options?: {\n        toolCallId?: string;\n        name?: string;\n        metadata?: Record<string, any>;\n    }\n): ToolMessage {\n    return {\n        role: 'tool',\n        content,\n        toolCallId: options?.toolCallId,\n        name: options?.name,\n        timestamp: new Date(),\n        metadata: options?.metadata\n    };\n}\n\n/**\n * Interface for managing conversation history\n * \n * This interface provides methods for adding, retrieving, and managing\n * messages in a conversation thread. Implementations may provide\n * different storage mechanisms, message limits, or special handling\n * for specific message types.\n * \n * @public\n */\nexport interface ConversationHistory {\n    /**\n     * Add a message to conversation history\n     * \n     * @param message - Universal message to add\n     */\n    addMessage(message: UniversalMessage): void;\n\n    /**\n     * Add user message (convenience method)\n     * \n     * @param content - User message content\n     * @param metadata - Optional metadata\n     */\n    addUserMessage(content: string, metadata?: Record<string, any>): void;\n\n    /**\n     * Add assistant message (convenience method)\n     * \n     * @param content - Assistant response content\n     * @param toolCalls - Optional tool calls made by assistant\n     * @param metadata - Optional metadata\n     */\n    addAssistantMessage(\n        content: string,\n        toolCalls?: Array<{\n            id: string;\n            type: 'function';\n            function: {\n                name: string;\n                arguments: string;\n            };\n        }>,\n        metadata?: Record<string, any>\n    ): void;\n\n    /**\n     * Add system message (convenience method)\n     * \n     * @param content - System instruction content\n     * @param metadata - Optional metadata\n     */\n    addSystemMessage(content: string, metadata?: Record<string, any>): void;\n\n    /**\n     * Add tool execution result message with tool call ID (for tool calling format)\n     * \n     * @param content - Tool result content\n     * @param toolCallId - Tool call ID from the assistant's tool call\n     * @param toolName - Name of the tool that was executed\n     * @param metadata - Optional metadata\n     */\n    addToolMessageWithId(content: string, toolCallId: string, toolName: string, metadata?: Record<string, any>): void;\n\n    /**\n     * Get all messages in chronological order\n     * \n     * @returns Array of all messages\n     */\n    getMessages(): UniversalMessage[];\n\n    /**\n     * Get messages filtered by specific role\n     * \n     * @param role - Message role to filter by\n     * @returns Array of messages with the specified role\n     */\n    getMessagesByRole(role: UniversalMessageRole): UniversalMessage[];\n\n    /**\n     * Get the most recent n messages\n     * \n     * @param count - Number of recent messages to return\n     * @returns Array of recent messages\n     */\n    getRecentMessages(count: number): UniversalMessage[];\n\n    /**\n     * Clear all conversation history\n     */\n    clear(): void;\n\n    /**\n     * Get total message count\n     * \n     * @returns Number of messages in history\n     */\n    getMessageCount(): number;\n}\n\n/**\n * Abstract base class for conversation history implementations\n * \n * Provides common functionality and message factory methods\n * that can be shared across different conversation history implementations.\n * \n * @internal\n */\nexport abstract class BaseConversationHistory implements ConversationHistory {\n    /** Maximum number of messages to store (0 = unlimited) */\n    protected readonly maxMessages: number;\n\n    constructor(options?: { maxMessages?: number }) {\n        this.maxMessages = options?.maxMessages || 0;\n    }\n\n    // Abstract methods that must be implemented by subclasses\n    abstract addMessage(message: UniversalMessage): void;\n    abstract getMessages(): UniversalMessage[];\n    abstract clear(): void;\n    abstract getMessageCount(): number;\n\n    // Common convenience methods with shared implementation\n    addUserMessage(content: string, metadata?: Record<string, any>): void {\n        const message = createUserMessage(content, { metadata });\n        this.addMessage(message);\n    }\n\n    addAssistantMessage(\n        content: string,\n        toolCalls?: Array<{\n            id: string;\n            type: 'function';\n            function: {\n                name: string;\n                arguments: string;\n            };\n        }>,\n        metadata?: Record<string, any>\n    ): void {\n        const message = createAssistantMessage(content, { toolCalls, metadata });\n        this.addMessage(message);\n    }\n\n    addSystemMessage(content: string, metadata?: Record<string, any>): void {\n        const message = createSystemMessage(content, { metadata });\n        this.addMessage(message);\n    }\n\n    addToolMessageWithId(content: string, toolCallId: string, toolName: string, metadata?: Record<string, any>): void {\n        const message = createToolMessage(content, {\n            toolCallId,\n            name: toolName,\n            metadata\n        });\n        this.addMessage(message);\n    }\n\n    getMessagesByRole(role: UniversalMessageRole): UniversalMessage[] {\n        return this.getMessages().filter(message => message.role === role);\n    }\n\n    getRecentMessages(count: number): UniversalMessage[] {\n        const messages = this.getMessages();\n        return messages.slice(-count);\n    }\n\n    /**\n * Apply message limit by removing oldest messages while preserving system messages\n * @internal\n */\n    protected applyMessageLimit(messages: UniversalMessage[]): UniversalMessage[] {\n        if (this.maxMessages > 0 && messages.length > this.maxMessages) {\n            // Separate system messages from other messages\n            const systemMessages = messages.filter(isSystemMessage);\n            const nonSystemMessages = messages.filter(msg => !isSystemMessage(msg));\n\n            // Calculate how many non-system messages we can keep\n            // Total limit minus system messages count\n            const availableSlots = Math.max(0, this.maxMessages - systemMessages.length);\n            const limitedNonSystemMessages = nonSystemMessages.slice(-availableSlots);\n\n            // Combine system messages with limited non-system messages\n            // System messages come first to maintain context\n            return [...systemMessages, ...limitedNonSystemMessages];\n        }\n        return messages;\n    }\n}\n\n/**\n * Default conversation history implementation\n * \n * Provides a simple in-memory storage for conversation messages with optional\n * message count limiting. Supports all message types with type safety.\n * \n * @see {@link ../../apps/examples/04-sessions | Session and Conversation Examples}\n * \n * @public\n */\nexport class SimpleConversationHistory extends BaseConversationHistory {\n    /** @internal Array storing all messages */\n    private messages: UniversalMessage[] = [];\n\n    /**\n     * Create a new SimpleConversationHistory instance\n     * \n     * @param options - Configuration options\n     * @param options.maxMessages - Maximum number of messages to keep (0 = unlimited)\n     */\n    constructor(options?: { maxMessages?: number }) {\n        super(options);\n    }\n\n    /**\n     * Add a message to conversation history\n     * \n     * Appends the message to the history and applies message count limits if configured.\n     * System messages are always preserved when applying limits.\n     * \n     * @param message - Universal message to add\n     */\n    addMessage(message: UniversalMessage): void {\n        this.messages.push(message);\n        this._applyMessageLimit();\n    }\n\n    /**\n     * Get all messages in chronological order\n     * \n     * @returns Defensive copy of all messages\n     */\n    getMessages(): UniversalMessage[] {\n        return [...this.messages];\n    }\n\n    /**\n     * Get total message count\n     * \n     * @returns Number of messages currently stored\n     */\n    getMessageCount(): number {\n        return this.messages.length;\n    }\n\n    /**\n     * Clear all conversation history\n     * \n     * Removes all messages from the history.\n     */\n    clear(): void {\n        this.messages = [];\n    }\n\n    /**\n     * Apply message count limits while preserving system messages\n     * \n     * When maxMessages is set and exceeded, this method removes older messages\n     * while always preserving system messages which are important for context.\n     * \n     * @internal\n     */\n    private _applyMessageLimit(): void {\n        this.messages = this.applyMessageLimit(this.messages);\n    }\n}\n\n/**\n * Conversation history implementation that maintains system messages\n * \n * Extends SimpleConversationHistory with automatic system prompt management.\n * The system prompt is automatically maintained and can be updated dynamically.\n * \n * @see {@link ../../apps/examples/04-sessions | Session and Conversation Examples}\n * \n * @public\n */\nexport class PersistentSystemConversationHistory extends BaseConversationHistory {\n    /** @internal Underlying conversation history */\n    private readonly history: SimpleConversationHistory;\n\n    /** @internal Current system prompt */\n    private systemPrompt: string;\n\n    /**\n     * Create a new PersistentSystemConversationHistory instance\n     * \n     * @param systemPrompt - Initial system prompt to set\n     * @param options - Configuration options passed to underlying SimpleConversationHistory\n     */\n    constructor(systemPrompt: string, options?: { maxMessages?: number }) {\n        super(options);\n        this.history = new SimpleConversationHistory(options);\n        this.systemPrompt = systemPrompt;\n\n        // Add initial system message\n        this.history.addSystemMessage(this.systemPrompt);\n    }\n\n    /**\n     * Add a message to conversation history (delegates to underlying history)\n     * \n     * @param message - Universal message to add\n     */\n    addMessage(message: UniversalMessage): void {\n        this.history.addMessage(message);\n    }\n\n    /**\n     * Get all messages (delegates to underlying history)\n     * \n     * @returns Array of all messages including system messages\n     */\n    getMessages(): UniversalMessage[] {\n        return this.history.getMessages();\n    }\n\n    /**\n     * Get total message count (delegates to underlying history)\n     * \n     * @returns Total number of messages including system messages\n     */\n    getMessageCount(): number {\n        return this.history.getMessageCount();\n    }\n\n    /**\n     * Clear conversation history but preserve system prompt\n     * \n     * Clears all messages and re-adds the current system prompt.\n     */\n    clear(): void {\n        this.history.clear();\n        this.history.addSystemMessage(this.systemPrompt);\n    }\n\n    /**\n     * Update the system prompt and refresh system messages\n     * \n     * Removes old system messages, updates the system prompt, and adds\n     * the new system prompt as a system message.\n     * \n     * @param systemPrompt - New system prompt to set\n     */\n    updateSystemPrompt(systemPrompt: string): void {\n        this.systemPrompt = systemPrompt;\n\n        // Remove existing system messages\n        const messages = this.history.getMessages();\n        const nonSystemMessages = messages.filter(msg => !isSystemMessage(msg));\n\n        // Clear history and add new system message\n        this.history.clear();\n        this.history.addSystemMessage(this.systemPrompt);\n\n        // Re-add non-system messages\n        nonSystemMessages.forEach(message => this.history.addMessage(message));\n    }\n\n    /**\n     * Get the current system prompt\n     * \n     * @returns Current system prompt string\n     */\n    getSystemPrompt(): string {\n        return this.systemPrompt;\n    }\n} ","import type { AIProvider } from '../interfaces/ai-provider';\n\n/**\n * AI provider management class\n * Responsible for registering, configuring, and querying AI providers.\n */\nexport class AIProviderManager {\n    private aiProviders: Record<string, AIProvider> = {};\n    private currentProvider?: string;\n    private currentModel?: string;\n\n    /**\n     * Add an AI provider\n     * \n     * @param name - Provider name\n     * @param aiProvider - AI provider instance\n     */\n    addProvider(name: string, aiProvider: AIProvider): void {\n        this.aiProviders[name] = aiProvider;\n    }\n\n    /**\n     * Set current AI provider and model\n     * \n     * @param providerName - Provider name\n     * @param model - Model name\n     */\n    setCurrentAI(providerName: string, model: string): void {\n        if (!this.aiProviders[providerName]) {\n            throw new Error(`AI provider '${providerName}' not found.`);\n        }\n\n        this.currentProvider = providerName;\n        this.currentModel = model;\n    }\n\n    /**\n     * Get currently configured AI provider and model\n     */\n    getCurrentAI(): { provider?: string; model?: string } {\n        return {\n            provider: this.currentProvider,\n            model: this.currentModel\n        };\n    }\n\n    /**\n     * Get current AI provider instance\n     */\n    getCurrentProvider(): AIProvider | null {\n        if (!this.currentProvider) {\n            return null;\n        }\n        return this.aiProviders[this.currentProvider] || null;\n    }\n\n    /**\n     * Get current model name\n     */\n    getCurrentModel(): string | null {\n        return this.currentModel || null;\n    }\n\n    /**\n     * Check if AI provider is configured\n     */\n    isConfigured(): boolean {\n        return !!(this.currentProvider && this.currentModel);\n    }\n\n    /**\n     * Release resources of all AI providers\n     */\n    async close(): Promise<void> {\n        for (const [_name, aiProvider] of Object.entries(this.aiProviders)) {\n            if (aiProvider.close && typeof aiProvider.close === 'function') {\n                await aiProvider.close();\n            }\n        }\n    }\n} ","import type { ToolProvider, FunctionSchema } from '@robota-sdk/tools';\nimport type { Logger } from '../interfaces/logger';\n\n/**\n * Tool provider management class\n * Handles registration, invocation, and retrieval of Tool Providers.\n */\nexport class ToolProviderManager {\n    private toolProviders: ToolProvider[] = [];\n    private allowedFunctions?: string[];\n    private logger: Logger;\n\n    constructor(logger: Logger, allowedFunctions?: string[]) {\n        this.logger = logger;\n        this.allowedFunctions = allowedFunctions;\n    }\n\n    /**\n     * Add a Tool Provider\n     * \n     * @param toolProvider - Tool provider instance\n     */\n    addProvider(toolProvider: ToolProvider): void {\n        this.toolProviders.push(toolProvider);\n    }\n\n    /**\n     * Add multiple Tool Providers\n     * \n     * @param toolProviders - Array of tool providers\n     */\n    addProviders(toolProviders: ToolProvider[]): void {\n        this.toolProviders.push(...toolProviders);\n    }\n\n    /**\n     * Set allowed function list\n     * \n     * @param allowedFunctions - Array of allowed function names\n     */\n    setAllowedFunctions(allowedFunctions?: string[]): void {\n        this.allowedFunctions = allowedFunctions;\n    }\n\n    /**\n     * Call a tool\n     * \n     * @param toolName - Name of the tool to call\n     * @param parameters - Parameters to pass to the tool\n     * @returns Tool call result\n     */\n    async callTool(toolName: string, parameters: Record<string, any>): Promise<any> {\n        if (this.toolProviders.length === 0) {\n            throw new Error('Tool providers are not configured.');\n        }\n\n        // Validate parameters before tool call\n        if (this.allowedFunctions && !this.allowedFunctions.includes(toolName)) {\n            throw new Error(`Tool '${toolName}' is not allowed.`);\n        }\n\n        // Find and call the tool from all toolProviders\n        for (const toolProvider of this.toolProviders) {\n            if (toolProvider.functions?.some(fn => fn.name === toolName)) {\n                try {\n                    const result = await toolProvider.callTool(toolName, parameters);\n                    return result;\n                } catch (error) {\n                    this.logger.error(`Error calling tool '${toolName}':`, error);\n                    throw new Error(`Tool call failed: ${error instanceof Error ? error.message : String(error)}`);\n                }\n            }\n        }\n\n        throw new Error(`Tool '${toolName}' not found.`);\n    }\n\n    /**\n     * Get list of available tools\n     * \n     * @returns List of tool schemas\n     */\n    getAvailableTools(): FunctionSchema[] {\n        return this.toolProviders.reduce((tools: FunctionSchema[], toolProvider) => {\n            if (toolProvider.functions) {\n                tools.push(...toolProvider.functions);\n            }\n            return tools;\n        }, []);\n    }\n\n    /**\n     * Get the number of registered Tool Providers\n     */\n    getProviderCount(): number {\n        return this.toolProviders.length;\n    }\n\n    /**\n     * Check if Tool Providers are registered\n     */\n    hasProviders(): boolean {\n        return this.toolProviders.length > 0;\n    }\n\n    /**\n     * Check if a specific tool is available\n     * \n     * @param toolName - Name of the tool to check\n     */\n    hasTool(toolName: string): boolean {\n        return this.toolProviders.some(toolProvider =>\n            toolProvider.functions?.some(fn => fn.name === toolName)\n        );\n    }\n\n    /**\n     * Clean up resources for all tool providers\n     */\n    async close(): Promise<void> {\n        for (const toolProvider of this.toolProviders) {\n            const provider = toolProvider as any;\n            if (provider.close && typeof provider.close === 'function') {\n                try {\n                    await provider.close();\n                } catch (error) {\n                    this.logger.error('Error closing tool provider:', error);\n                }\n            }\n        }\n    }\n} ","import type { Message } from '../interfaces/ai-provider';\n\n/**\n * System message management class\n * Manages system prompts and system messages.\n */\nexport class SystemMessageManager {\n    private systemPrompt?: string;\n    private systemMessages?: Message[];\n\n    /**\n     * Set a single system prompt\n     * \n     * @param prompt - System prompt content\n     */\n    setSystemPrompt(prompt: string): void {\n        this.systemPrompt = prompt;\n        this.systemMessages = undefined;\n    }\n\n    /**\n     * Set multiple system messages\n     * \n     * @param messages - Array of system messages\n     */\n    setSystemMessages(messages: Message[]): void {\n        this.systemPrompt = undefined;\n        this.systemMessages = messages;\n    }\n\n    /**\n     * Add a new system message to existing system messages\n     * \n     * @param content - Content of the system message to add\n     */\n    addSystemMessage(content: string): void {\n        // If systemPrompt is set and systemMessages is empty or has only one message identical to systemPrompt\n        if (this.systemPrompt) {\n            if (!this.systemMessages ||\n                (this.systemMessages.length === 1 &&\n                    this.systemMessages[0].role === 'system' &&\n                    this.systemMessages[0].content === this.systemPrompt)) {\n                this.systemMessages = [\n                    { role: 'system', content: this.systemPrompt },\n                    { role: 'system', content }\n                ];\n            } else {\n                this.systemMessages.push({ role: 'system', content });\n            }\n            this.systemPrompt = undefined;\n        } else {\n            if (!this.systemMessages) {\n                this.systemMessages = [];\n            }\n            this.systemMessages.push({ role: 'system', content });\n        }\n    }\n\n    /**\n     * Get the current system prompt\n     */\n    getSystemPrompt(): string | undefined {\n        return this.systemPrompt;\n    }\n\n    /**\n     * Get the current system messages\n     */\n    getSystemMessages(): Message[] | undefined {\n        return this.systemMessages;\n    }\n\n    /**\n     * Check if system messages are configured\n     */\n    hasSystemMessages(): boolean {\n        return !!(this.systemPrompt || (this.systemMessages && this.systemMessages.length > 0));\n    }\n\n    /**\n     * Clear system messages\n     */\n    clear(): void {\n        this.systemPrompt = undefined;\n        this.systemMessages = undefined;\n    }\n} ","/**\n * Function call mode\n */\nexport type FunctionCallMode = 'auto' | 'force' | 'disabled';\n\n/**\n * Function call configuration interface\n */\nexport interface FunctionCallConfig {\n    defaultMode?: FunctionCallMode;\n    maxCalls?: number;\n    timeout?: number;\n    allowedFunctions?: string[];\n}\n\n/**\n * Function call management class\n * Manages function call settings and modes.\n */\nexport class FunctionCallManager {\n    private config: {\n        defaultMode: FunctionCallMode;\n        maxCalls: number;\n        timeout: number;\n        allowedFunctions?: string[];\n    };\n\n    constructor(initialConfig?: FunctionCallConfig) {\n        this.config = {\n            defaultMode: initialConfig?.defaultMode || 'auto',\n            maxCalls: initialConfig?.maxCalls || 10,\n            timeout: initialConfig?.timeout || 30000,\n            allowedFunctions: initialConfig?.allowedFunctions\n        };\n    }\n\n    /**\n     * Set function call mode\n     * \n     * @param mode - Function call mode ('auto', 'force', 'disabled')\n     */\n    setFunctionCallMode(mode: FunctionCallMode): void {\n        this.config.defaultMode = mode;\n    }\n\n    /**\n     * Configure function call settings\n     * \n     * @param config - Function call configuration options\n     */\n    configure(config: {\n        mode?: FunctionCallMode;\n        maxCalls?: number;\n        timeout?: number;\n        allowedFunctions?: string[];\n    }): void {\n        if (config.mode) {\n            this.config.defaultMode = config.mode;\n        }\n        if (config.maxCalls !== undefined) {\n            this.config.maxCalls = config.maxCalls;\n        }\n        if (config.timeout !== undefined) {\n            this.config.timeout = config.timeout;\n        }\n        if (config.allowedFunctions) {\n            this.config.allowedFunctions = config.allowedFunctions;\n        }\n    }\n\n    /**\n     * Get current function call mode\n     */\n    getDefaultMode(): FunctionCallMode {\n        return this.config.defaultMode;\n    }\n\n    /**\n     * Get maximum call count\n     */\n    getMaxCalls(): number {\n        return this.config.maxCalls;\n    }\n\n    /**\n     * Get timeout setting\n     */\n    getTimeout(): number {\n        return this.config.timeout;\n    }\n\n    /**\n     * Get allowed functions list\n     */\n    getAllowedFunctions(): string[] | undefined {\n        return this.config.allowedFunctions;\n    }\n\n    /**\n     * Get complete configuration\n     */\n    getConfig(): FunctionCallConfig {\n        return { ...this.config };\n    }\n\n    /**\n     * Check if a specific function is allowed\n     * \n     * @param functionName - Function name to check\n     */\n    isFunctionAllowed(functionName: string): boolean {\n        if (!this.config.allowedFunctions) {\n            return true; // Allow all functions if no restrictions\n        }\n        return this.config.allowedFunctions.includes(functionName);\n    }\n} ","/**\n * Analytics Manager class\n * Manages analytics data collection (requests and token usage history)\n */\nexport class AnalyticsManager {\n    private requestCount: number = 0;\n    private totalTokensUsed: number = 0;\n    private tokenUsageHistory: { timestamp: Date; tokens: number; provider: string; model: string }[] = [];\n\n    /**\n     * Record a new request and token usage\n     * @param tokensUsed - Number of tokens used in this request\n     * @param provider - AI provider name\n     * @param model - Model name\n     */\n    recordRequest(tokensUsed: number, provider: string, model: string): void {\n        this.requestCount++;\n        this.totalTokensUsed += tokensUsed;\n\n        this.tokenUsageHistory.push({\n            timestamp: new Date(),\n            tokens: tokensUsed,\n            provider,\n            model\n        });\n    }\n\n    /**\n     * Get total number of requests made\n     */\n    getRequestCount(): number {\n        return this.requestCount;\n    }\n\n    /**\n     * Get total number of tokens used\n     */\n    getTotalTokensUsed(): number {\n        return this.totalTokensUsed;\n    }\n\n    /**\n     * Get detailed analytics data\n     */\n    getAnalytics(): {\n        requestCount: number;\n        totalTokensUsed: number;\n        averageTokensPerRequest: number;\n        tokenUsageHistory: { timestamp: Date; tokens: number; provider: string; model: string }[];\n    } {\n        const averageTokensPerRequest = this.requestCount > 0 ? this.totalTokensUsed / this.requestCount : 0;\n\n        return {\n            requestCount: this.requestCount,\n            totalTokensUsed: this.totalTokensUsed,\n            averageTokensPerRequest: Math.round(averageTokensPerRequest * 100) / 100,\n            tokenUsageHistory: [...this.tokenUsageHistory]\n        };\n    }\n\n    /**\n     * Reset all analytics data\n     */\n    reset(): void {\n        this.requestCount = 0;\n        this.totalTokensUsed = 0;\n        this.tokenUsageHistory = [];\n    }\n\n    /**\n     * Get token usage for a specific time period\n     * @param startDate - Start date for the period\n     * @param endDate - End date for the period (optional, defaults to now)\n     */\n    getTokenUsageByPeriod(startDate: Date, endDate?: Date): {\n        totalTokens: number;\n        requestCount: number;\n        usageHistory: { timestamp: Date; tokens: number; provider: string; model: string }[];\n    } {\n        const end = endDate || new Date();\n\n        const filteredHistory = this.tokenUsageHistory.filter(\n            entry => entry.timestamp >= startDate && entry.timestamp <= end\n        );\n\n        const totalTokens = filteredHistory.reduce((sum, entry) => sum + entry.tokens, 0);\n\n        return {\n            totalTokens,\n            requestCount: filteredHistory.length,\n            usageHistory: filteredHistory\n        };\n    }\n} ","/**\n * Request Limit Manager class\n * Manages request count and token limits with default values\n */\nexport class RequestLimitManager {\n    private maxTokens: number;\n    private maxRequests: number;\n    private currentTokensUsed: number = 0;\n    private currentRequestCount: number = 0;\n\n    constructor(maxTokens: number = 4096, maxRequests: number = 25) {\n        this.maxTokens = maxTokens;\n        this.maxRequests = maxRequests;\n    }\n\n    /**\n     * Set maximum token limit (0 = unlimited)\n     */\n    setMaxTokens(limit: number): void {\n        if (limit < 0) {\n            throw new Error('Max token limit cannot be negative');\n        }\n        this.maxTokens = limit;\n    }\n\n    /**\n     * Set maximum request limit (0 = unlimited)\n     */\n    setMaxRequests(limit: number): void {\n        if (limit < 0) {\n            throw new Error('Max request limit cannot be negative');\n        }\n        this.maxRequests = limit;\n    }\n\n    /**\n     * Get current maximum token limit\n     */\n    getMaxTokens(): number {\n        return this.maxTokens;\n    }\n\n    /**\n     * Get current maximum request limit\n     */\n    getMaxRequests(): number {\n        return this.maxRequests;\n    }\n\n    /**\n     * Check if adding estimated tokens would exceed the limit\n     * @param estimatedTokens - Estimated number of tokens to add\n     * @throws Error if token limit would be exceeded\n     */\n    checkEstimatedTokenLimit(estimatedTokens: number): void {\n        // Skip check if unlimited (0)\n        if (this.maxTokens === 0) return;\n\n        if ((this.currentTokensUsed + estimatedTokens) > this.maxTokens) {\n            throw new Error(\n                `Estimated token limit would be exceeded. Current usage: ${this.currentTokensUsed}, ` +\n                `estimated additional tokens: ${estimatedTokens}, limit: ${this.maxTokens}. ` +\n                `Request aborted to prevent unnecessary costs.`\n            );\n        }\n    }\n\n    /**\n     * Check if adding new tokens would exceed the limit\n     * @param tokensToAdd - Number of tokens to add\n     * @throws Error if token limit would be exceeded\n     */\n    checkTokenLimit(tokensToAdd: number): void {\n        // Skip check if unlimited (0)\n        if (this.maxTokens === 0) return;\n\n        if ((this.currentTokensUsed + tokensToAdd) > this.maxTokens) {\n            throw new Error(\n                `Token limit exceeded. Current usage: ${this.currentTokensUsed}, ` +\n                `attempting to add: ${tokensToAdd}, limit: ${this.maxTokens}`\n            );\n        }\n    }\n\n    /**\n     * Check if adding a new request would exceed the request limit\n     * @throws Error if request limit would be exceeded\n     */\n    checkRequestLimit(): void {\n        // Skip check if unlimited (0)\n        if (this.maxRequests === 0) return;\n\n        if ((this.currentRequestCount + 1) > this.maxRequests) {\n            throw new Error(\n                `Request limit exceeded. Current requests: ${this.currentRequestCount}, ` +\n                `limit: ${this.maxRequests}`\n            );\n        }\n    }\n\n    /**\n     * Record a successful request with token usage\n     * @param tokensUsed - Number of tokens used in this request\n     */\n    recordRequest(tokensUsed: number): void {\n        // First check if we can add this request and tokens\n        this.checkRequestLimit();\n        this.checkTokenLimit(tokensUsed);\n\n        // If checks pass, record the usage\n        this.currentRequestCount++;\n        this.currentTokensUsed += tokensUsed;\n    }\n\n    /**\n     * Get current token usage\n     */\n    getCurrentTokensUsed(): number {\n        return this.currentTokensUsed;\n    }\n\n    /**\n     * Get current request count\n     */\n    getCurrentRequestCount(): number {\n        return this.currentRequestCount;\n    }\n\n    /**\n     * Get remaining tokens (undefined if unlimited)\n     */\n    getRemainingTokens(): number | undefined {\n        if (this.maxTokens === 0) return undefined;\n        return Math.max(0, this.maxTokens - this.currentTokensUsed);\n    }\n\n    /**\n     * Get remaining requests (undefined if unlimited)\n     */\n    getRemainingRequests(): number | undefined {\n        if (this.maxRequests === 0) return undefined;\n        return Math.max(0, this.maxRequests - this.currentRequestCount);\n    }\n\n    /**\n     * Check if tokens are unlimited\n     */\n    isTokensUnlimited(): boolean {\n        return this.maxTokens === 0;\n    }\n\n    /**\n     * Check if requests are unlimited\n     */\n    isRequestsUnlimited(): boolean {\n        return this.maxRequests === 0;\n    }\n\n    /**\n     * Reset usage counters (but keep limits)\n     */\n    reset(): void {\n        this.currentTokensUsed = 0;\n        this.currentRequestCount = 0;\n    }\n\n    /**\n     * Get comprehensive limit information\n     */\n    getLimitInfo(): {\n        maxTokens: number;\n        maxRequests: number;\n        currentTokensUsed: number;\n        currentRequestCount: number;\n        remainingTokens?: number;\n        remainingRequests?: number;\n        isTokensUnlimited: boolean;\n        isRequestsUnlimited: boolean;\n    } {\n        return {\n            maxTokens: this.maxTokens,\n            maxRequests: this.maxRequests,\n            currentTokensUsed: this.currentTokensUsed,\n            currentRequestCount: this.currentRequestCount,\n            remainingTokens: this.getRemainingTokens(),\n            remainingRequests: this.getRemainingRequests(),\n            isTokensUnlimited: this.isTokensUnlimited(),\n            isRequestsUnlimited: this.isRequestsUnlimited()\n        };\n    }\n} ","import type { UniversalMessage } from './conversation-history';\nimport { isUserMessage, isAssistantMessage, isToolMessage } from './conversation-history';\nimport type { Message, MessageRole } from './interfaces/ai-provider';\n\n/**\n * Utility functions collection\n */\n\n/**\n * Function to split text into chunks\n * \n * @param text Text to split\n * @param chunkSize Maximum size of each chunk\n * @returns Array of text chunks\n */\nexport function splitTextIntoChunks(text: string, chunkSize: number): string[] {\n  const chunks: string[] = [];\n\n  for (let i = 0; i < text.length; i += chunkSize) {\n    chunks.push(text.substring(i, i + chunkSize));\n  }\n\n  return chunks;\n}\n\n/**\n * Function to remove undefined values from object\n * \n * @param obj Object to clean\n * @returns Object with undefined values removed\n */\nexport function removeUndefined<T extends Record<string, unknown>>(obj: T): T {\n  const result = { ...obj };\n\n  for (const key in result) {\n    if (result[key] === undefined) {\n      delete result[key];\n    } else if (typeof result[key] === 'object' && result[key] !== null) {\n      result[key] = removeUndefined(result[key] as Record<string, unknown>) as T[Extract<keyof T, string>];\n    }\n  }\n\n  return result;\n}\n\n/**\n * Function to check if a string is JSON\n * \n * @param str String to check\n * @returns Whether it's JSON\n */\nexport function isJSON(str: string): boolean {\n  try {\n    JSON.parse(str);\n    return true;\n  } catch (e) {\n    return false;\n  }\n}\n\n/**\n * Delay function\n * \n * @param ms Delay time in milliseconds\n * @returns Promise\n */\nexport function delay(ms: number): Promise<void> {\n  return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n/**\n * Function to roughly estimate token count\n * \n * @param text Text to measure\n * @returns Approximate token count\n */\nexport function estimateTokenCount(text: string): number {\n  // For English, tokens are roughly 1.3 times the number of words\n  // For other languages, character-based tokenization is used\n  // Here we use a combination of word count and character count for simple estimation\n\n  // Extract English words\n  const englishWords = text.match(/[a-zA-Z]+/g)?.length || 0;\n\n  // Extract non-ASCII characters (including Korean, Chinese, Japanese, etc.)\n  // eslint-disable-next-line no-control-regex\n  const nonAsciiChars = text.match(/[^\\x01-\\x7F]/g)?.length || 0;\n\n  // Numbers and special characters\n  // eslint-disable-next-line no-control-regex\n  const others = text.length - (text.match(/[a-zA-Z\\x01-\\x7F]/g)?.join('').length || 0);\n\n  return Math.ceil(englishWords * 1.3 + nonAsciiChars + others * 0.5);\n}\n\n/**\n * Function to extract complete JSON objects from a string stream\n * \n * @param text JSON string fragment\n * @returns Complete JSON objects and remaining string\n */\nexport function extractJSONObjects(text: string): { objects: unknown[], remaining: string } {\n  const objects: unknown[] = [];\n  let remaining = text;\n  let match;\n\n  // Regular expression for JSON object exploration\n  // Simple method for accurate JSON extraction, but may fail with nested objects\n  const regex = /{(?:[^{}]|{(?:[^{}]|{[^{}]*})*})*}/g;\n\n  while ((match = regex.exec(remaining)) !== null) {\n    try {\n      const jsonStr = match[0];\n      const jsonObj = JSON.parse(jsonStr);\n      objects.push(jsonObj);\n\n      // Remove matched part\n      remaining = remaining.slice(0, match.index) + remaining.slice(match.index + jsonStr.length);\n\n      // Reset regex index\n      regex.lastIndex = 0;\n    } catch (e) {\n      // Ignore invalid JSON\n      regex.lastIndex = match.index + 1;\n    }\n  }\n\n  return { objects, remaining };\n}\n\n/**\n * Logger utility (console.log replacement)\n */\nexport const logger = {\n  info: (...args: unknown[]) => {\n    if (process.env.NODE_ENV !== 'production') {\n      console.log('[INFO]', ...args);\n    }\n  },\n  warn: (...args: unknown[]) => {\n    if (process.env.NODE_ENV !== 'production') {\n      console.warn('[WARN]', ...args);\n    }\n  },\n  error: (...args: unknown[]) => {\n    if (process.env.NODE_ENV !== 'production') {\n      console.error('[ERROR]', ...args);\n    }\n  }\n};\n\n/**\n * Helper function to convert UniversalMessage to basic Message format\n * Can be used in AI Provider adapters.\n */\nexport function convertUniversalToBaseMessage(universalMessage: UniversalMessage): Message {\n  const baseMessage: Message = {\n    role: universalMessage.role === 'tool' ? 'function' : universalMessage.role as MessageRole,\n    content: universalMessage.content || ''\n  };\n\n  // Use type guards to safely access properties\n  if (isUserMessage(universalMessage) && universalMessage.name) {\n    baseMessage.name = universalMessage.name;\n  }\n\n  if (isAssistantMessage(universalMessage) && (universalMessage as any).toolCalls) {\n    baseMessage.toolCalls = (universalMessage as any).toolCalls;\n  }\n\n  if (isToolMessage(universalMessage) && (universalMessage as any).toolCallId) {\n    baseMessage.toolCallId = (universalMessage as any).toolCallId;\n    baseMessage.name = universalMessage.name;\n  }\n\n  return baseMessage;\n}\n\n/**\n * Helper function to convert UniversalMessage array to basic Message array\n */\nexport function convertUniversalToBaseMessages(universalMessages: UniversalMessage[]): Message[] {\n  return universalMessages.map(convertUniversalToBaseMessage);\n}\n\n/**\n * Message conversion interface that AI Provider adapters should implement\n */\nexport interface MessageAdapter<T = any> {\n  /**\n   * Convert UniversalMessage to specific AI Provider format\n   */\n  convertFromUniversal(universalMessage: UniversalMessage): T;\n\n  /**\n   * Convert UniversalMessage array to specific AI Provider format array\n   */\n  convertFromUniversalMessages(universalMessages: UniversalMessage[]): T[];\n} ","import { get_encoding, encoding_for_model } from '@dqbd/tiktoken';\nimport { logger } from '../utils';\n\n/**\n * Token Analyzer class\n * Handles token calculation using tiktoken library\n */\nexport class TokenAnalyzer {\n    /**\n     * Calculate tokens for a given text using tiktoken\n     * @param text - Text to calculate tokens for\n     * @param model - Model name for encoding selection\n     * @returns Number of tokens\n     */\n    calculateTokens(text: string, model?: string): number {\n        if (!text) return 0;\n\n        try {\n            let encoding;\n\n            // Try to get model-specific encoding first\n            if (model) {\n                // Map common model names to tiktoken model names\n                const modelMapping: Record<string, string> = {\n                    'gpt-4': 'gpt-4',\n                    'gpt-4-0613': 'gpt-4-0613',\n                    'gpt-4-32k': 'gpt-4-32k',\n                    'gpt-4-32k-0613': 'gpt-4-32k-0613',\n                    'gpt-4-1106-preview': 'gpt-4-1106-preview',\n                    'gpt-4-0125-preview': 'gpt-4-0125-preview',\n                    'gpt-4-turbo-preview': 'gpt-4-0125-preview',\n                    'gpt-3.5-turbo': 'gpt-3.5-turbo',\n                    'gpt-3.5-turbo-0613': 'gpt-3.5-turbo-0613',\n                    'gpt-3.5-turbo-16k': 'gpt-3.5-turbo-16k',\n                    'gpt-3.5-turbo-16k-0613': 'gpt-3.5-turbo-16k-0613',\n                    'gpt-3.5-turbo-1106': 'gpt-3.5-turbo-1106',\n                    'gpt-3.5-turbo-0125': 'gpt-3.5-turbo-0125'\n                };\n\n                const mappedModel = modelMapping[model] || model;\n\n                try {\n                    // Type assertion with proper error handling\n                    encoding = encoding_for_model(mappedModel as Parameters<typeof encoding_for_model>[0]);\n                } catch (error) {\n                    // Fall back to cl100k_base encoding for unknown models\n                    encoding = get_encoding('cl100k_base');\n                }\n            } else {\n                // Default to cl100k_base encoding (used by GPT-4 and GPT-3.5-turbo)\n                encoding = get_encoding('cl100k_base');\n            }\n\n            const tokens = encoding.encode(text);\n            const tokenCount = tokens.length;\n\n            // Clean up encoding to prevent memory leaks\n            encoding.free();\n\n            return tokenCount;\n        } catch (error) {\n            logger.warn('Failed to calculate tokens with tiktoken, using estimation:', error);\n            return Math.ceil(text.length / 4);\n        }\n    }\n\n    /**\n     * Calculate tokens for an array of messages\n     * @param messages - Array of messages to calculate tokens for\n     * @param model - Model name for encoding selection\n     * @returns Number of tokens\n     */\n    calculateMessagesTokens(messages: any[], model?: string): number {\n        if (!messages || messages.length === 0) return 0;\n\n        try {\n            let totalTokens = 0;\n\n            // Calculate tokens for each message\n            for (const message of messages) {\n                if (message.content) {\n                    totalTokens += this.calculateTokens(message.content, model);\n                }\n\n                // Add tokens for message structure (role, etc.)\n                // Based on OpenAI's token counting methodology\n                totalTokens += 3; // Every message follows <|start|>{role/name}\\n{content}<|end|>\\n\n\n                if (message.name) {\n                    totalTokens += this.calculateTokens(message.name, model);\n                }\n            }\n\n            // Add 3 tokens for assistant's reply primer\n            totalTokens += 3;\n\n            return totalTokens;\n        } catch (error) {\n            logger.warn('Failed to calculate message tokens, using estimation:', error);\n            // Fall back to simple estimation\n            const totalText = messages\n                .map(m => (m.content || '') + (m.name || ''))\n                .join(' ');\n            return Math.ceil(totalText.length / 4);\n        }\n    }\n} ","import type {\n    RunOptions\n} from '../types';\nimport type { AIProvider, Context, Message, ModelResponse, StreamingResponseChunk } from '../interfaces/ai-provider';\nimport type { Logger } from '../interfaces/logger';\nimport type { ConversationHistory, UniversalMessage, ToolMessage } from '../conversation-history';\nimport { logger } from '../utils';\n\n/**\n * Conversation service class\n * Handles conversation processing with AI.\n */\nexport class ConversationService {\n    private temperature?: number;\n    private maxTokens?: number;\n    private logger: Logger;\n    private debug: boolean;\n\n    constructor(\n        temperature?: number,\n        maxTokens?: number,\n        logger: Logger = console,\n        debug: boolean = false\n    ) {\n        this.temperature = temperature;\n        this.maxTokens = maxTokens;\n        this.logger = logger;\n        this.debug = debug;\n    }\n\n    /**\n     * Prepare context\n     * \n     * @param conversationHistory - ConversationHistory instance\n     * @param systemPrompt - Optional system prompt\n     * @param systemMessages - System messages\n     * @param options - Run options\n     */\n    prepareContext(\n        conversationHistory: ConversationHistory,\n        systemPrompt?: string,\n        systemMessages?: Message[],\n        options: RunOptions = {}\n    ): Context {\n        // Get universal messages from conversation history\n        // AI Provider will convert these to appropriate format\n        const universalMessages = conversationHistory.getMessages();\n\n        const context: Context = {\n            messages: universalMessages\n        };\n\n        // Handle system messages\n        if (options.systemPrompt) {\n            context.systemPrompt = options.systemPrompt;\n        } else if (systemMessages && systemMessages.length > 0) {\n            context.systemMessages = systemMessages;\n        } else if (systemPrompt) {\n            context.systemPrompt = systemPrompt;\n        }\n\n        return context;\n    }\n\n    /**\n     * Generate response\n     * \n     * @param aiProvider - AI provider\n     * @param model - Model name\n     * @param context - Conversation context\n     * @param options - Run options\n     * @param availableTools - Available tools\n     * @param onToolCall - Tool call function\n     * @param conversationHistory - Conversation history to store messages sequentially\n     */\n    async generateResponse(\n        aiProvider: AIProvider,\n        model: string,\n        context: Context,\n        options: RunOptions = {},\n        availableTools: any[] = [],\n        onToolCall?: (toolName: string, params: any) => Promise<any>,\n        conversationHistory?: ConversationHistory\n    ): Promise<ModelResponse> {\n        try {\n            // Generate response through AI provider\n            const response = await aiProvider.chat(model, context, {\n                ...options,\n                temperature: options.temperature ?? this.temperature,\n                maxTokens: options.maxTokens ?? this.maxTokens,\n                tools: availableTools,\n                functionCallMode: options.functionCallMode,\n                forcedFunction: options.forcedFunction,\n                forcedArguments: options.forcedArguments\n            });\n\n            // Automatically execute if there are tool calls\n            if (onToolCall && response.toolCalls && response.toolCalls.length > 0) {\n                return await this.handleToolCalls(\n                    response,\n                    context,\n                    aiProvider,\n                    model,\n                    options,\n                    availableTools,\n                    onToolCall,\n                    conversationHistory\n                );\n            }\n\n            return response;\n        } catch (error) {\n            logger.error('Error occurred during AI client call:', error);\n            throw new Error(`Error during AI client call: ${error instanceof Error ? error.message : String(error)}`);\n        }\n    }\n\n    /**\n     * Handle function call (simplified - only tool_calls format)\n     */\n    private async handleFunctionCall(\n        response: ModelResponse,\n        context: Context,\n        aiProvider: AIProvider,\n        model: string,\n        options: RunOptions,\n        availableTools: any[],\n        onToolCall: (toolName: string, params: any) => Promise<any>,\n        conversationHistory?: ConversationHistory\n    ): Promise<ModelResponse> {\n        // Only handle new tool_calls format\n        if (response.toolCalls && response.toolCalls.length > 0) {\n            return await this.handleToolCalls(\n                response,\n                context,\n                aiProvider,\n                model,\n                options,\n                availableTools,\n                onToolCall,\n                conversationHistory\n            );\n        }\n\n        return response;\n    }\n\n    /**\n     * Handle new tool_calls format (OpenAI tool calling)\n     */\n    private async handleToolCalls(\n        response: ModelResponse,\n        context: Context,\n        aiProvider: AIProvider,\n        model: string,\n        options: RunOptions,\n        availableTools: any[],\n        onToolCall: (toolName: string, params: any) => Promise<any>,\n        conversationHistory?: ConversationHistory\n    ): Promise<ModelResponse> {\n        const toolCalls = response.toolCalls!;\n\n        // Create assistant message with tool calls - MUST include toolCalls property\n        const assistantMessage: UniversalMessage = {\n            role: 'assistant',\n            content: response.content || null,\n            timestamp: new Date(),\n            toolCalls: toolCalls.map(tc => ({\n                id: tc.id,\n                type: tc.type,\n                function: tc.function\n            }))\n        };\n\n        // Debug: Log the assistant message being created\n        if (this.debug) {\n            this.logger.info('🔍 [Debug] Assistant message created:', {\n                role: assistantMessage.role,\n                content: assistantMessage.content,\n                hasToolCalls: !!(assistantMessage as any).toolCalls,\n                toolCallsCount: (assistantMessage as any).toolCalls?.length || 0,\n                toolCallIds: (assistantMessage as any).toolCalls?.map((tc: any) => tc.id) || []\n            });\n        }\n\n        // STEP 1: Store assistant message with tool calls in conversation history immediately\n        if (conversationHistory) {\n            if (this.debug) {\n                this.logger.info('📝 [ConversationService] Storing assistant message with tool calls');\n            }\n            conversationHistory.addAssistantMessage(\n                assistantMessage.content || '',\n                assistantMessage.toolCalls\n            );\n        }\n\n        // Execute all tool calls and collect results\n        const toolResultMessages: UniversalMessage[] = [];\n\n        for (const toolCall of toolCalls) {\n            const { name, arguments: args } = toolCall.function;\n            const parsedArgs = typeof args === 'string' ? JSON.parse(args) : args;\n\n            try {\n                // Tool call logging\n                if (this.debug) {\n                    this.logger.info(`🔧 [Tool Call] ${name} (ID: ${toolCall.id})`, parsedArgs);\n                }\n\n                // Call tool\n                const toolResult = await onToolCall(name, parsedArgs);\n\n                // Tool result logging\n                if (this.debug) {\n                    this.logger.info(`✅ [Tool Result] ${name} (ID: ${toolCall.id})`, toolResult);\n                }\n\n                // Create tool response message with proper tool_call_id\n                const toolResponseMessage: UniversalMessage = {\n                    role: 'tool',\n                    content: typeof toolResult === 'string' ? toolResult : JSON.stringify(toolResult),\n                    timestamp: new Date(),\n                    toolCallId: toolCall.id, // This is crucial for OpenAI\n                    name: name\n                };\n\n                toolResultMessages.push(toolResponseMessage);\n\n                // STEP 2: Store tool result message in conversation history immediately\n                if (conversationHistory) {\n                    if (this.debug) {\n                        this.logger.info(`📝 [ConversationService] Storing tool result message (ID: ${toolCall.id})`);\n                    }\n                    conversationHistory.addToolMessageWithId(\n                        toolResponseMessage.content,\n                        toolCall.id,\n                        name\n                    );\n                }\n            } catch (toolError) {\n                logger.error('Error during tool call:', toolError);\n\n                // Add tool call error as tool response\n                const errorMessage: UniversalMessage = {\n                    role: 'tool',\n                    content: JSON.stringify({ error: toolError instanceof Error ? toolError.message : String(toolError) }),\n                    timestamp: new Date(),\n                    toolCallId: toolCall.id,\n                    name: name\n                };\n\n                toolResultMessages.push(errorMessage);\n\n                // Store error message in conversation history immediately\n                if (conversationHistory) {\n                    if (this.debug) {\n                        this.logger.info(`📝 [ConversationService] Storing tool error message (ID: ${toolCall.id})`);\n                    }\n                    conversationHistory.addToolMessageWithId(\n                        errorMessage.content,\n                        toolCall.id,\n                        name\n                    );\n                }\n            }\n        }\n\n        // Create new context with ALL messages included (for the final AI call)\n        const newContext: Context = {\n            ...context,\n            messages: [\n                ...context.messages,\n                assistantMessage,  // Assistant message with tool_calls\n                ...toolResultMessages  // Tool result messages with toolCallId\n            ]\n        };\n\n        // Debug: Log the messages that will be sent\n        if (this.debug) {\n            this.logger.info('🔍 [Debug] Messages in new context:', newContext.messages.length);\n            newContext.messages.slice(-10).forEach((msg, idx) => {\n                const displayIdx = newContext.messages.length - 10 + idx + 1;\n                if (msg.role === 'tool') {\n                    this.logger.info(`  ${displayIdx}. ${msg.role}: [tool_call_id: ${(msg as any).toolCallId}]`);\n                } else if (msg.role === 'assistant' && (msg as any).toolCalls) {\n                    this.logger.info(`  ${displayIdx}. ${msg.role}: [has ${(msg as any).toolCalls.length} tool calls]`);\n                } else {\n                    this.logger.info(`  ${displayIdx}. ${msg.role}: ${msg.content?.substring(0, 50) || ''}...`);\n                }\n            });\n        }\n\n        // Generate final response including tool results\n        const finalResponse = await aiProvider.chat(model, newContext, {\n            ...options,\n            temperature: options.temperature ?? this.temperature,\n            maxTokens: options.maxTokens ?? this.maxTokens,\n            tools: availableTools,\n            functionCallMode: 'disabled' // Prevent recursive tool calls\n        });\n\n        // STEP 3: Final assistant response will be stored by ExecutionService\n        // We don't store it here to avoid duplication\n\n        // Return final response (no need for intermediateMessages anymore)\n        return finalResponse;\n    }\n\n    /**\n     * Generate streaming response\n     */\n    async generateStream(\n        aiProvider: AIProvider,\n        model: string,\n        context: Context,\n        options: RunOptions = {},\n        availableTools: any[] = []\n    ): Promise<AsyncIterable<StreamingResponseChunk>> {\n        if (!aiProvider.chatStream) {\n            throw new Error(`AI provider does not support streaming.`);\n        }\n\n        try {\n            return aiProvider.chatStream(model, context, {\n                ...options,\n                temperature: options.temperature ?? this.temperature,\n                maxTokens: options.maxTokens ?? this.maxTokens,\n                tools: availableTools\n            });\n        } catch (error) {\n            this.logger.error('Error occurred during streaming API call:', error);\n            throw new Error(`Error during streaming API call: ${error instanceof Error ? error.message : String(error)}`);\n        }\n    }\n} ","import type { RunOptions } from '../types';\nimport type { Logger } from '../interfaces/logger';\nimport type { ModelResponse, StreamingResponseChunk } from '../interfaces/ai-provider';\nimport type { ConversationHistory } from '../conversation-history';\n\nimport { AIProviderManager } from '../managers/ai-provider-manager';\nimport { ToolProviderManager } from '../managers/tool-provider-manager';\nimport { SystemMessageManager } from '../managers/system-message-manager';\nimport { RequestLimitManager } from '../managers/request-limit-manager';\nimport { AnalyticsManager } from '../managers/analytics-manager';\nimport { TokenAnalyzer } from '../analyzers/token-analyzer';\nimport { ConversationService } from './conversation-service';\n\n/**\n * Context for request execution\n */\ninterface ExecutionContext {\n    conversationHistory: ConversationHistory;\n    systemMessageManager: SystemMessageManager;\n    options: RunOptions;\n}\n\n/**\n * Handles the execution logic for Robota requests\n * Follows single responsibility principle by handling only execution flow\n */\nexport class ExecutionService {\n    constructor(\n        private aiProviderManager: AIProviderManager,\n        private toolProviderManager: ToolProviderManager,\n        private requestLimitManager: RequestLimitManager,\n        private analyticsManager: AnalyticsManager,\n        private tokenAnalyzer: TokenAnalyzer,\n        private conversationService: ConversationService,\n        private logger: Logger,\n        private debug: boolean,\n        private onToolCall?: (toolName: string, params: any, result: any) => void\n    ) { }\n\n    /**\n     * Execute a text prompt and return response\n     */\n    async executePrompt(prompt: string, context: ExecutionContext): Promise<string> {\n        // Add user message to conversation history\n        context.conversationHistory.addUserMessage(prompt);\n\n        // Prepare conversation context\n        const conversationContext = this.conversationService.prepareContext(\n            context.conversationHistory,\n            context.systemMessageManager.getSystemPrompt(),\n            context.systemMessageManager.getSystemMessages(),\n            context.options\n        );\n\n        // Execute the request with limits and analytics\n        const response = await this.executeWithLimitsAndAnalytics(conversationContext, context.options, context.conversationHistory);\n\n        // For non-tool calling scenarios, we need to add the assistant response to history\n        // Tool calling scenarios: ConversationService handles tool messages, but ExecutionService handles final response\n        const hasToolCalls = response.toolCalls && response.toolCalls.length > 0;\n\n        // Always store the final assistant response (whether from tool calling or regular conversation)\n        if (response.content) {\n            if (this.debug) {\n                this.logger.info(`📝 [ExecutionService] Adding assistant response to history: ${response.content.substring(0, 100)}...`);\n            }\n            context.conversationHistory.addAssistantMessage(response.content);\n        }\n\n        // Debug logging\n        if (this.debug) {\n            const hasToolCalls = response.toolCalls && response.toolCalls.length > 0;\n            if (hasToolCalls) {\n                this.logger.info(`🔍 [ExecutionService] Tool calling completed. Final response: ${response.content?.substring(0, 100) || 'No content'}...`);\n            } else {\n                this.logger.info(`🔍 [ExecutionService] Regular conversation completed. Response: ${response.content?.substring(0, 100) || 'No content'}...`);\n            }\n            this.logger.info(`📊 [ExecutionService] Total messages in history: ${context.conversationHistory.getMessageCount()}`);\n        }\n\n        return response.content || '';\n    }\n\n    /**\n     * Execute a streaming prompt and return response stream\n     */\n    async executeStream(prompt: string, context: ExecutionContext): Promise<AsyncIterable<StreamingResponseChunk>> {\n        // Add user message to conversation history\n        context.conversationHistory.addUserMessage(prompt);\n\n        // Prepare conversation context\n        const conversationContext = this.conversationService.prepareContext(\n            context.conversationHistory,\n            context.systemMessageManager.getSystemPrompt(),\n            context.systemMessageManager.getSystemMessages(),\n            context.options\n        );\n\n        // Note: For streaming, token counting is more complex as we need to collect all chunks\n        // We'll handle analytics when the stream completes or delegate to the implementation\n        return this.generateStream(conversationContext, context.options);\n    }\n\n    /**\n     * Execute with request limits and analytics tracking\n     */\n    private async executeWithLimitsAndAnalytics(\n        conversationContext: any,\n        options: RunOptions,\n        conversationHistory: ConversationHistory\n    ): Promise<ModelResponse> {\n        // Check request limit first\n        this.requestLimitManager.checkRequestLimit();\n\n        // Pre-calculate tokens to check limits before making the API call\n        const currentAI = this.aiProviderManager.getCurrentAI();\n        const currentModel = currentAI.model || 'unknown';\n\n        await this.checkTokenLimits(conversationContext.messages, currentModel);\n\n        const response = await this.generateResponse(conversationContext, options, conversationHistory);\n\n        // Record analytics and limit data with actual token usage\n        this.recordUsageAnalytics(response, currentAI.provider || 'unknown', currentModel);\n\n        return response;\n    }\n\n    /**\n     * Check token limits before making API call\n     */\n    private async checkTokenLimits(messages: any[], currentModel: string): Promise<void> {\n        if (!this.requestLimitManager.isTokensUnlimited()) {\n            try {\n                // Calculate estimated tokens for the request\n                const estimatedTokens = this.tokenAnalyzer.calculateMessagesTokens(\n                    messages,\n                    currentModel\n                );\n\n                if (this.debug) {\n                    this.logger.info(`🔍 [Token Estimation] Model: ${currentModel}, Estimated tokens: ${estimatedTokens}`);\n                }\n\n                // Check if estimated tokens would exceed the limit\n                this.requestLimitManager.checkEstimatedTokenLimit(estimatedTokens);\n            } catch (error) {\n                this.logger.error('Token limit check failed:', error);\n                throw error;\n            }\n        }\n    }\n\n    /**\n     * Record usage in analytics and limits\n     */\n    private recordUsageAnalytics(response: ModelResponse, provider: string, model: string): void {\n        if (response.usage?.totalTokens) {\n            // Record in limit manager first (this may throw if limits exceeded)\n            this.requestLimitManager.recordRequest(response.usage.totalTokens);\n\n            // Then record in analytics for historical data\n            this.analyticsManager.recordRequest(\n                response.usage.totalTokens,\n                provider,\n                model\n            );\n        }\n    }\n\n    /**\n     * Generate response (internal use)\n     */\n    private async generateResponse(context: any, options: RunOptions = {}, conversationHistory: ConversationHistory): Promise<ModelResponse> {\n        if (!this.aiProviderManager.isConfigured()) {\n            throw new Error('Current AI provider and model are not configured. Use setCurrentAI() method to configure.');\n        }\n\n        const currentAiProvider = this.aiProviderManager.getCurrentProvider()!;\n        const currentModel = this.aiProviderManager.getCurrentModel()!;\n\n        return this.conversationService.generateResponse(\n            currentAiProvider,\n            currentModel,\n            context,\n            options,\n            this.toolProviderManager.getAvailableTools(),\n            async (toolName: string, params: any) => {\n                const result = await this.toolProviderManager.callTool(toolName, params);\n\n                // Execute callback\n                if (this.onToolCall) {\n                    this.onToolCall(toolName, params, result);\n                }\n\n                return result;\n            },\n            conversationHistory\n        );\n    }\n\n    /**\n     * Generate streaming response (internal use)\n     */\n    private async generateStream(context: any, options: RunOptions = {}): Promise<AsyncIterable<StreamingResponseChunk>> {\n        if (!this.aiProviderManager.isConfigured()) {\n            throw new Error('Current AI provider and model are not configured. Use setCurrentAI() method to configure.');\n        }\n\n        const currentAiProvider = this.aiProviderManager.getCurrentProvider()!;\n        const currentModel = this.aiProviderManager.getCurrentModel()!;\n\n        return this.conversationService.generateStream(\n            currentAiProvider,\n            currentModel,\n            context,\n            options,\n            this.toolProviderManager.getAvailableTools()\n        );\n    }\n} ","import type { Logger } from '../interfaces/logger';\nimport type { ConversationHistory } from '../conversation-history';\nimport type { AIProvider, Message } from '../interfaces/ai-provider';\nimport type { ToolProvider } from '@robota-sdk/tools';\nimport type { FunctionCallConfig } from './function-call-manager';\nimport { SimpleConversationHistory } from '../conversation-history';\n\n/**\n * Complete configuration interface for Robota instance\n */\nexport interface RobotaConfiguration {\n    // AI Configuration\n    aiProviders: Record<string, AIProvider>;\n    currentProvider?: string;\n    currentModel?: string;\n    temperature?: number;\n    maxTokens?: number;\n\n    // Tool Configuration\n    toolProviders: ToolProvider[];\n    functionCallConfig?: FunctionCallConfig;\n    onToolCall?: (toolName: string, params: any, result: any) => void;\n\n    // System Configuration\n    systemPrompt?: string;\n    systemMessages?: Message[];\n    conversationHistory: ConversationHistory;\n\n    // Logging and Debug\n    logger: Logger;\n    debug: boolean;\n\n    // Limits\n    maxTokenLimit: number;\n    maxRequestLimit: number;\n}\n\n/**\n * Input configuration for creating RobotaConfiguration\n */\nexport interface RobotaConfigInput {\n    toolProviders?: ToolProvider[];\n    aiProviders?: Record<string, AIProvider>;\n    currentProvider?: string;\n    currentModel?: string;\n    temperature?: number;\n    maxTokens?: number;\n    systemPrompt?: string;\n    systemMessages?: Message[];\n    conversationHistory?: ConversationHistory;\n    functionCallConfig?: FunctionCallConfig;\n    onToolCall?: (toolName: string, params: any, result: any) => void;\n    logger?: Logger;\n    debug?: boolean;\n    maxTokenLimit?: number;\n    maxRequestLimit?: number;\n}\n\n/**\n * Manages Robota configuration with validation and defaults\n * Follows single responsibility principle by handling only configuration logic\n */\nexport class RobotaConfigManager {\n    private config: RobotaConfiguration;\n\n    constructor(input: RobotaConfigInput) {\n        this.config = this.createConfiguration(input);\n        this.validateConfiguration();\n    }\n\n    /**\n     * Create configuration with defaults applied\n     */\n    private createConfiguration(input: RobotaConfigInput): RobotaConfiguration {\n        return {\n            aiProviders: input.aiProviders || {},\n            currentProvider: input.currentProvider,\n            currentModel: input.currentModel,\n            temperature: input.temperature,\n            maxTokens: input.maxTokens,\n            toolProviders: input.toolProviders || [],\n            functionCallConfig: input.functionCallConfig,\n            onToolCall: input.onToolCall,\n            systemPrompt: input.systemPrompt,\n            systemMessages: input.systemMessages,\n            conversationHistory: input.conversationHistory || new SimpleConversationHistory(),\n            logger: input.logger || console,\n            debug: input.debug || false,\n            maxTokenLimit: input.maxTokenLimit ?? 4096,\n            maxRequestLimit: input.maxRequestLimit ?? 25\n        };\n    }\n\n    /**\n     * Validate configuration consistency\n     */\n    private validateConfiguration(): void {\n        // Validate AI provider configuration\n        if (this.config.currentProvider && !this.config.aiProviders[this.config.currentProvider]) {\n            throw new Error(`Current AI provider '${this.config.currentProvider}' is not registered`);\n        }\n\n        // Validate limits\n        if (this.config.maxTokenLimit < 0) {\n            throw new Error('Maximum token limit cannot be negative');\n        }\n\n        if (this.config.maxRequestLimit < 0) {\n            throw new Error('Maximum request limit cannot be negative');\n        }\n    }\n\n    /**\n     * Get the complete configuration\n     */\n    getConfiguration(): RobotaConfiguration {\n        return { ...this.config }; // Return a copy to prevent external modification\n    }\n\n    /**\n     * Update AI provider configuration\n     */\n    updateAIConfig(updates: {\n        currentProvider?: string;\n        currentModel?: string;\n        temperature?: number;\n        maxTokens?: number;\n    }): void {\n        if (updates.currentProvider !== undefined) {\n            if (updates.currentProvider && !this.config.aiProviders[updates.currentProvider]) {\n                throw new Error(`AI provider '${updates.currentProvider}' is not registered`);\n            }\n            this.config.currentProvider = updates.currentProvider;\n        }\n\n        if (updates.currentModel !== undefined) {\n            this.config.currentModel = updates.currentModel;\n        }\n\n        if (updates.temperature !== undefined) {\n            this.config.temperature = updates.temperature;\n        }\n\n        if (updates.maxTokens !== undefined) {\n            this.config.maxTokens = updates.maxTokens;\n        }\n    }\n\n    /**\n     * Update system configuration\n     */\n    updateSystemConfig(updates: {\n        systemPrompt?: string;\n        systemMessages?: Message[];\n        debug?: boolean;\n    }): void {\n        if (updates.systemPrompt !== undefined) {\n            this.config.systemPrompt = updates.systemPrompt;\n        }\n\n        if (updates.systemMessages !== undefined) {\n            this.config.systemMessages = updates.systemMessages;\n        }\n\n        if (updates.debug !== undefined) {\n            this.config.debug = updates.debug;\n        }\n    }\n\n    /**\n     * Update limit configuration\n     */\n    updateLimits(updates: {\n        maxTokenLimit?: number;\n        maxRequestLimit?: number;\n    }): void {\n        if (updates.maxTokenLimit !== undefined) {\n            if (updates.maxTokenLimit < 0) {\n                throw new Error('Maximum token limit cannot be negative');\n            }\n            this.config.maxTokenLimit = updates.maxTokenLimit;\n        }\n\n        if (updates.maxRequestLimit !== undefined) {\n            if (updates.maxRequestLimit < 0) {\n                throw new Error('Maximum request limit cannot be negative');\n            }\n            this.config.maxRequestLimit = updates.maxRequestLimit;\n        }\n    }\n\n    /**\n     * Add AI provider\n     */\n    addAIProvider(name: string, provider: AIProvider): void {\n        this.config.aiProviders[name] = provider;\n    }\n\n    /**\n     * Remove AI provider\n     */\n    removeAIProvider(name: string): void {\n        if (this.config.currentProvider === name) {\n            this.config.currentProvider = undefined;\n            this.config.currentModel = undefined;\n        }\n        delete this.config.aiProviders[name];\n    }\n\n    /**\n     * Add tool provider\n     */\n    addToolProvider(provider: ToolProvider): void {\n        this.config.toolProviders.push(provider);\n    }\n\n    /**\n     * Remove tool provider\n     */\n    removeToolProvider(provider: ToolProvider): void {\n        const index = this.config.toolProviders.indexOf(provider);\n        if (index !== -1) {\n            this.config.toolProviders.splice(index, 1);\n        }\n    }\n\n    /**\n     * Set tool call callback\n     */\n    setToolCallCallback(callback: (toolName: string, params: any, result: any) => void): void {\n        this.config.onToolCall = callback;\n    }\n\n    /**\n     * Check if AI is properly configured\n     */\n    isAIConfigured(): boolean {\n        return !!(this.config.currentProvider && this.config.currentModel &&\n            this.config.aiProviders[this.config.currentProvider]);\n    }\n} ","import type {\n    RunOptions\n} from './types';\nimport type { AIProvider, Message, StreamingResponseChunk } from './interfaces/ai-provider';\nimport type { Logger } from './interfaces/logger';\nimport type { ConversationHistory } from './conversation-history';\nimport type { ToolProvider } from '@robota-sdk/tools';\nimport type { RobotaComplete } from './interfaces/robota-core';\n\nimport { SimpleConversationHistory } from './conversation-history';\nimport { AIProviderManager } from './managers/ai-provider-manager';\nimport { ToolProviderManager } from './managers/tool-provider-manager';\nimport { SystemMessageManager } from './managers/system-message-manager';\nimport { FunctionCallManager, type FunctionCallConfig } from './managers/function-call-manager';\nimport { AnalyticsManager } from './managers/analytics-manager';\nimport { RequestLimitManager } from './managers/request-limit-manager';\nimport { TokenAnalyzer } from './analyzers/token-analyzer';\nimport { ConversationService } from './services/conversation-service';\nimport { ExecutionService } from './services/execution-service';\nimport { RobotaConfigManager } from './managers/robota-config-manager';\n\n/**\n * Configuration options for initializing Robota instance\n * \n * @public\n * @interface RobotaOptions\n */\nexport interface RobotaOptions {\n    /** \n     * Tool providers that supply tools like MCP, OpenAPI, ZodFunction, etc.\n     * \n     * @see {@link ../../../apps/examples/02-functions | Function Examples}\n     */\n    toolProviders?: ToolProvider[];\n\n    /** \n     * AI providers - Register multiple AI providers by name\n     * \n     * @see {@link ../../../apps/examples/03-integrations | Provider Integration Examples}\n     */\n    aiProviders?: Record<string, AIProvider>;\n\n    /** \n     * Current AI provider name to use from registered providers\n     * Must match a key in aiProviders\n     */\n    currentProvider?: string;\n\n    /** \n     * Current model name to use with the selected provider\n     */\n    currentModel?: string;\n\n    /** \n     * Model temperature for response generation (0.0 to 2.0)\n     * Lower values make responses more focused and deterministic\n     * \n     * @defaultValue undefined (uses provider default)\n     */\n    temperature?: number;\n\n    /** \n     * Maximum number of tokens for generated responses\n     * \n     * @defaultValue undefined (uses provider default)\n     */\n    maxTokens?: number;\n\n    /** \n     * System prompt to set context for AI responses\n     * Will be converted to a system message\n     */\n    systemPrompt?: string;\n\n    /** \n     * Array of system messages for more complex system configuration\n     * Use this instead of systemPrompt for multiple system messages\n     */\n    systemMessages?: Message[];\n\n    /** \n     * Custom conversation history implementation\n     * \n     * @defaultValue SimpleConversationHistory instance\n     */\n    conversationHistory?: ConversationHistory;\n\n    /** \n     * Configuration for function/tool calling behavior\n     */\n    functionCallConfig?: FunctionCallConfig;\n\n    /** \n     * Callback function executed when a tool is called\n     * Useful for monitoring, logging, or custom handling\n     * \n     * @param toolName - Name of the called tool\n     * @param params - Parameters passed to the tool\n     * @param result - Result returned by the tool\n     */\n    onToolCall?: (toolName: string, params: any, result: any) => void;\n\n    /** \n     * Custom logger implementation\n     * \n     * @defaultValue console\n     */\n    logger?: Logger;\n\n    /** \n     * Enable debug mode for detailed logging\n     * \n     * @defaultValue false\n     */\n    debug?: boolean;\n\n    /** \n     * Maximum token limit across all requests (0 = unlimited)\n     * Used for budget control and preventing excessive usage\n     * \n     * @defaultValue 4096\n     */\n    maxTokenLimit?: number;\n\n    /** \n     * Maximum request limit (0 = unlimited)\n     * Used for rate limiting and controlling API usage\n     * \n     * @defaultValue 25\n     */\n    maxRequestLimit?: number;\n\n    /** \n     * Legacy option: Single tool provider (use toolProviders array instead)\n     * @deprecated Use toolProviders array instead\n     */\n    provider?: ToolProvider;\n}\n\n/**\n * Main Robota class for AI agent interaction with Facade pattern\n * \n * Provides a high-level interface for AI conversations with support for:\n * - Multiple AI providers (OpenAI, Anthropic, Google, etc.)\n * - Tool/function calling\n * - Conversation history management\n * - Request limiting and analytics\n * - Streaming responses\n * \n * Uses Facade pattern to expose functional managers while keeping core interface simple.\n * Access detailed functionality through the exposed managers:\n * - ai: AI provider management\n * - system: System message management  \n * - functions: Function/tool call management\n * - analytics: Usage analytics and metrics\n * - tools: Tool provider management\n * - conversation: Conversation history management\n * \n * @see {@link ../../../apps/examples/01-basic | Basic Usage Examples}\n * @see {@link ../../../apps/examples/05-advanced | Advanced Configuration Examples}\n * \n * @public\n */\nexport class Robota implements RobotaComplete {\n    /** @internal Configuration manager handling all settings */\n    private readonly configManager: RobotaConfigManager;\n\n    /** @internal Service handling execution logic */\n    private readonly executionService: ExecutionService;\n\n    /** @internal Conversation service for high-level operations */\n    private readonly conversationService: ConversationService;\n\n    /** @internal Token analysis utilities */\n    private readonly tokenAnalyzer: TokenAnalyzer;\n\n    /** @internal Conversation history storage */\n    private readonly conversationHistory: ConversationHistory;\n\n    /** @internal Optional tool call callback */\n    private readonly onToolCall?: (toolName: string, params: any, result: any) => void;\n\n    /** @internal Logger instance */\n    private readonly logger: Logger;\n\n    /** @internal Debug mode flag */\n    private readonly debug: boolean;\n\n    // === FACADE PATTERN: Exposed Managers ===\n\n    /** \n     * AI provider management - register providers, set current provider/model, configure parameters\n     * \n     * @see {@link AIProviderManager} \n     */\n    public readonly ai: AIProviderManager;\n\n    /** \n     * System message management - set prompts, manage system instructions\n     * \n     * @see {@link SystemMessageManager}\n     */\n    public readonly system: SystemMessageManager;\n\n    /** \n     * Function/tool call management - configure modes, timeouts, allowed functions\n     * \n     * @see {@link FunctionCallManager}\n     */\n    public readonly functions: FunctionCallManager;\n\n    /** \n     * Analytics and metrics - track usage, performance, costs\n     * \n     * @see {@link AnalyticsManager}\n     */\n    public readonly analytics: AnalyticsManager;\n\n    /** \n     * Tool provider management - register and manage tool providers\n     * \n     * @see {@link ToolProviderManager}\n     */\n    public readonly tools: ToolProviderManager;\n\n    /** \n     * Request and token limits - control usage and costs\n     * \n     * @see {@link RequestLimitManager}\n     */\n    public readonly limits: RequestLimitManager;\n\n    /** \n     * Conversation history - direct access to conversation management\n     * \n     * @see {@link ConversationHistory}\n     */\n    public readonly conversation: ConversationHistory;\n\n    constructor(options: RobotaOptions = {}) {\n        // Store constructor parameters\n        this.logger = options.logger || console;\n        this.debug = options.debug || false;\n        this.onToolCall = options.onToolCall;\n\n        // Initialize conversation history\n        this.conversationHistory = options.conversationHistory || new SimpleConversationHistory();\n        this.conversation = this.conversationHistory;\n\n        // Initialize managers\n        this.ai = new AIProviderManager();\n        this.system = new SystemMessageManager();\n        this.functions = new FunctionCallManager();\n        this.analytics = new AnalyticsManager();\n        this.tools = new ToolProviderManager(this.logger);\n        this.limits = new RequestLimitManager();\n\n        // Initialize services\n        this.tokenAnalyzer = new TokenAnalyzer();\n        this.conversationService = new ConversationService(\n            options.temperature,\n            options.maxTokens,\n            this.logger,\n            this.debug\n        );\n\n        // Apply initial configuration first\n        this.applyConfiguration(options);\n\n        // Initialize configuration manager with applied configuration\n        this.configManager = new RobotaConfigManager({\n            aiProviders: options.aiProviders || {},\n            currentProvider: options.currentProvider,\n            currentModel: options.currentModel,\n            temperature: options.temperature,\n            maxTokens: options.maxTokens,\n            debug: this.debug,\n            maxTokenLimit: options.maxTokenLimit || 4096,\n            maxRequestLimit: options.maxRequestLimit || 25\n        });\n\n        // Initialize execution service\n        this.executionService = new ExecutionService(\n            this.ai,\n            this.tools,\n            this.limits,\n            this.analytics,\n            this.tokenAnalyzer,\n            this.conversationService,\n            this.logger,\n            this.debug,\n            this.onToolCall\n        );\n    }\n\n    /**\n     * Apply configuration from options\n     * @internal\n     */\n    private applyConfiguration(options: RobotaOptions): void {\n        // Register AI providers\n        if (options.aiProviders) {\n            for (const [name, provider] of Object.entries(options.aiProviders)) {\n                this.ai.addProvider(name, provider);\n            }\n        }\n\n        // Set current AI provider and model if specified\n        if (options.currentProvider && options.currentModel) {\n            this.ai.setCurrentAI(options.currentProvider, options.currentModel);\n        }\n\n        // Register tool providers (new array format)\n        if (options.toolProviders) {\n            for (const provider of options.toolProviders) {\n                this.tools.addProvider(provider);\n            }\n        }\n\n        // Handle legacy single provider option\n        if (options.provider) {\n            this.tools.addProvider(options.provider);\n        }\n\n        // Configure system messages and add to conversation history\n        if (options.systemPrompt) {\n            this.system.setSystemPrompt(options.systemPrompt);\n            // Add system prompt to conversation history immediately\n            this.conversationHistory.addSystemMessage(options.systemPrompt);\n        }\n        if (options.systemMessages) {\n            this.system.setSystemMessages(options.systemMessages);\n            // Add system messages to conversation history immediately\n            for (const msg of options.systemMessages) {\n                if (msg.role === 'system') {\n                    this.conversationHistory.addSystemMessage(msg.content);\n                }\n            }\n        }\n\n        // Configure function calling\n        if (options.functionCallConfig) {\n            this.functions.configure(options.functionCallConfig);\n        }\n\n        // Set limits\n        if (options.maxTokenLimit) {\n            this.limits.setMaxTokens(options.maxTokenLimit);\n        }\n        if (options.maxRequestLimit) {\n            this.limits.setMaxRequests(options.maxRequestLimit);\n        }\n    }\n\n    // ============================================================\n    // Core Execution Methods\n    // ============================================================\n\n    /**\n * Execute a prompt and get a text response\n * \n * Main method for running AI conversations. Handles the full pipeline:\n * - Context preparation with conversation history\n * - AI provider execution with tool support\n * - Response processing and history updates\n * - Analytics and limit tracking\n * \n * @param prompt - The user prompt to process\n * @param options - Optional configuration for this specific request\n * @returns Promise resolving to the AI's text response\n * \n * @throws {Error} When no AI provider is configured\n * @throws {Error} When rate limits are exceeded\n * @throws {Error} When AI provider fails\n * \n * @see {@link ../../../apps/examples/01-basic/01-simple-conversation.ts | Basic Usage}\n */\n    async run(prompt: string, options: RunOptions = {}): Promise<string> {\n        return this.executionService.executePrompt(prompt, {\n            conversationHistory: this.conversationHistory,\n            systemMessageManager: this.system,\n            options\n        });\n    }\n\n    /**\n     * Execute a prompt and get a streaming response\n     * \n     * Similar to run() but returns an async iterator for streaming responses.\n     * Useful for real-time display of AI responses.\n     * \n     * @param prompt - The user prompt to process\n     * @param options - Optional configuration for this specific request\n     * @returns Promise resolving to an async iterator of response chunks\n     * \n     * @throws {Error} When no AI provider is configured\n     * @throws {Error} When rate limits are exceeded\n     * @throws {Error} When AI provider fails\n     * \n     * @see {@link ../../../apps/examples/01-basic/01-simple-conversation.ts | Streaming Example}\n     */\n    async runStream(prompt: string, options: RunOptions = {}): Promise<AsyncIterable<StreamingResponseChunk>> {\n        return this.executionService.executeStream(prompt, {\n            conversationHistory: this.conversationHistory,\n            systemMessageManager: this.system,\n            options\n        });\n    }\n\n    /**\n * Call a specific tool directly by name\n * \n * Bypasses AI provider and calls a tool directly with provided parameters.\n * Useful for testing tools or direct tool execution.\n * \n * @param toolName - Name of the tool to call\n * @param parameters - Parameters to pass to the tool\n * @returns Promise resolving to the tool's result\n * \n * @throws {Error} When tool is not found\n * @throws {Error} When tool execution fails\n */\n    async callTool(toolName: string, parameters: Record<string, any>): Promise<any> {\n        return this.tools.callTool(toolName, parameters);\n    }\n\n    /**\n     * Get list of available tools\n     * \n     * @returns Array of available tool definitions\n     */\n    getAvailableTools(): any[] {\n        return this.tools.getAvailableTools();\n    }\n\n    /**\n     * Clear all conversation history\n     */\n    clearConversationHistory(): void {\n        this.conversationHistory.clear();\n    }\n\n    /**\n     * Clean up resources and close connections\n     * \n     * Should be called when done using the Robota instance to properly\n     * clean up any resources, close connections, etc.\n     */\n    async close(): Promise<void> {\n        // Close AI providers if they support it\n        await this.ai.close();\n\n        // Close tool providers if they support it\n        await this.tools.close();\n\n        // Future: Close other resources as needed\n    }\n} ","import {\n    Context,\n    ModelResponse,\n    StreamingResponseChunk,\n    AIProvider,\n    Message\n} from '../interfaces/ai-provider';\nimport type { FunctionSchema } from '@robota-sdk/tools';\nimport { logger } from '../index';\n\n/**\n * Base abstract class for AI providers\n * \n * Provides common functionality and standardized interfaces for all AI providers.\n * Handles tool calling support, message filtering, and response parsing.\n */\nexport abstract class BaseAIProvider implements AIProvider {\n    /**\n     * Provider identifier name\n     */\n    public abstract readonly name: string;\n\n    /**\n     * Provider configuration options\n     */\n    public abstract readonly options: any;\n\n    /**\n     * Send a chat request and receive a complete response\n     */\n    public abstract chat(model: string, context: Context, options?: any): Promise<ModelResponse>;\n\n    /**\n     * Send a streaming chat request and receive response chunks\n     */\n    public abstract chatStream(model: string, context: Context, options?: any): AsyncGenerator<StreamingResponseChunk, void, unknown>;\n\n    /**\n     * Close the provider and clean up resources\n     */\n    public abstract close(): Promise<void>;\n\n    /**\n * Configure tools for the API request\n * \n * Each provider can override this to implement provider-specific tool configuration.\n * By default, returns undefined (no tools).\n * \n * @param tools - Array of function schemas\n * @returns Provider-specific tool configuration or undefined\n */\n    protected configureTools(tools?: FunctionSchema[]): any {\n        return undefined;\n    }\n\n    /**\n     * Validate context object\n     * \n     * Common validation logic for all providers.\n     * \n     * @param context - Context object to validate\n     * @throws {Error} When context is invalid\n     */\n    protected validateContext(context: Context): void {\n        if (!context || typeof context !== 'object') {\n            logger.error(`[${this.name}Provider] Invalid context:`, context);\n            throw new Error('Valid Context object is required');\n        }\n\n        const { messages } = context;\n\n        if (!Array.isArray(messages)) {\n            logger.error(`[${this.name}Provider] Invalid message array:`, messages);\n            throw new Error('Valid message array is required');\n        }\n    }\n\n    /**\n     * Handle API errors with consistent error formatting\n     * \n     * @param error - Original error from API call\n     * @param operation - Operation that failed (e.g., 'chat', 'chatStream')\n     * @throws {Error} Formatted error with provider context\n     */\n    protected handleApiError(error: any, operation: string): never {\n        const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n        logger.error(`[${this.name}Provider] ${operation} error:`, error);\n        throw new Error(`${this.name} API ${operation} error: ${errorMessage}`);\n    }\n} "]}