{"version":3,"sources":["../src/core/types.ts","../src/core/base-provider.ts","../src/core/agent-controller.ts","../src/providers/text/openai.ts","../src/providers/text/alkahest.ts","../src/providers/text/maho.ts","../src/providers/text/akash.ts","../src/core/provider-manager.ts","../src/providers/tts/openai-tts.ts","../src/providers/tts/alkahest-tts.ts","../src/providers/image/alkahest.ts","../src/services/conversation.ts","../src/services/tip-management.ts","../src/services/audio-control.ts","../src/services/vrm-integration.ts","../src/services/canvas-integration.ts","../src/adapters/partykit.ts","../src/index.ts"],"names":["OpenAI","textProvider","ttsProvider"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Core types for the AI Framework\n */\n\nexport interface ProviderConfig {\n  provider?: string;\n  apiKey?: string;\n  baseUrl?: string;\n  timeout?: number;\n  maxRetries?: number;\n  privyToken?: string;\n  [key: string]: any;\n}\n\nexport interface UsageStats {\n  tokensUsed?: number;\n  requestsCount?: number;\n  cost?: number;\n  remaining?: number;\n}\n\nexport type ProviderType = 'text' | 'tts' | 'image' | 'embedding';\n\nexport interface AIProvider {\n  id: string;\n  name: string;\n  type: ProviderType;\n  initialize(config: ProviderConfig): Promise<void>;\n  isAvailable(): Promise<boolean>;\n  getUsage(): Promise<UsageStats>;\n}\n\n// Text Generation Types\nexport interface TextGenerationOptions {\n  model?: string;\n  temperature?: number;\n  maxTokens?: number;\n  topP?: number;\n  frequencyPenalty?: number;\n  presencePenalty?: number;\n  systemPrompt?: string;\n  stop?: string[];\n  stream?: boolean;\n}\n\nexport interface TextResponse {\n  text: string;\n  model: string;\n  usage?: {\n    promptTokens: number;\n    completionTokens: number;\n    totalTokens: number;\n  };\n  finishReason?: string;\n}\n\n// TTS Types\nexport interface TTSOptions {\n  voice?: string;\n  model?: string;\n  speed?: number;\n  pitch?: number;\n  volume?: number;\n  emotion?: string;\n  format?: AudioFormat;\n  sampleRate?: number;\n}\n\nexport type AudioFormat = 'mp3' | 'wav' | 'ogg' | 'aac' | 'flac' | 'opus';\n\nexport interface Voice {\n  id: string;\n  name: string;\n  gender?: 'male' | 'female' | 'neutral';\n  language?: string;\n  previewUrl?: string;\n  labels?: Record<string, string>;\n}\n\nexport interface AudioResponse {\n  audio: ArrayBuffer;\n  format: AudioFormat;\n  duration?: number;\n  voice?: string;\n}\n\n// Image Generation Types\nexport interface ImageGenerationOptions {\n  model?: string;\n  size?: string;\n  quality?: 'standard' | 'hd';\n  style?: string;\n  n?: number;\n}\n\nexport interface ImageResponse {\n  images: Array<{\n    url?: string;\n    base64?: string;\n    revisedPrompt?: string;\n  }>;\n  model: string;\n}\n\n// Conversation Types\nexport interface Message {\n  role: 'system' | 'user' | 'assistant';\n  content: string;\n  timestamp?: Date;\n  metadata?: Record<string, any>;\n}\n\nexport interface ConversationContext {\n  conversationId: string;\n  userId: string;\n  agentId?: string;\n  messages: Message[];\n  metadata?: Record<string, any>;\n}\n\nexport interface PersonalityProfile {\n  name: string;\n  description: string;\n  traits: string[];\n  tone: 'friendly' | 'professional' | 'casual' | 'humorous' | 'serious';\n  guidelines: string[];\n  examples?: Array<{\n    input: string;\n    output: string;\n  }>;\n}\n\n// Response Types\nexport interface AIResponse {\n  text: string;\n  audio?: ArrayBuffer;\n  audioUrl?: string;\n  emotion?: string;\n  actions?: AgentAction[];\n  metadata?: Record<string, any>;\n}\n\nexport interface AgentAction {\n  type:\n    | 'animation'\n    | 'expression'\n    | 'sound'\n    | 'custom'\n    | 'vrm'\n    | 'camera'\n    | 'canvas'\n    | 'tip'\n    | 'audio';\n  value: string | number | { x: number; y: number; z: number };\n  duration?: number;\n  delay?: number;\n  action?: string;\n  intensity?: number;\n  blendMode?: string;\n  easing?: string;\n  position?: { x: number; y: number };\n  size?: { width: number; height: number };\n  amount?: number;\n  currency?: string;\n  animation?: string;\n  volume?: number;\n  fadeIn?: number;\n  fadeOut?: number;\n}\n\n// Error Types\nexport class AIFrameworkError extends Error {\n  constructor(\n    message: string,\n    public code: string,\n    public provider?: string,\n    public details?: any\n  ) {\n    super(message);\n    this.name = 'AIFrameworkError';\n  }\n}\n\nexport class ProviderError extends AIFrameworkError {\n  constructor(message: string, provider: string, details?: any) {\n    super(message, 'PROVIDER_ERROR', provider, details);\n    this.name = 'ProviderError';\n  }\n}\n\nexport class ConfigurationError extends AIFrameworkError {\n  constructor(message: string, details?: any) {\n    super(message, 'CONFIGURATION_ERROR', undefined, details);\n    this.name = 'ConfigurationError';\n  }\n}\n\nexport class RateLimitError extends AIFrameworkError {\n  constructor(message: string, provider: string, retryAfter?: number) {\n    super(message, 'RATE_LIMIT_ERROR', provider, { retryAfter });\n    this.name = 'RateLimitError';\n  }\n}\n","/**\n * Base provider class that all AI providers extend\n */\n\nimport { AIProvider, ProviderConfig, ProviderType, UsageStats } from './types';\n\nexport abstract class BaseProvider implements AIProvider {\n  protected config: ProviderConfig = {};\n  protected initialized = false;\n\n  constructor(\n    public readonly id: string,\n    public readonly name: string,\n    public readonly type: ProviderType\n  ) {}\n\n  async initialize(config: ProviderConfig): Promise<void> {\n    this.config = { ...this.config, ...config };\n    await this.onInitialize();\n    this.initialized = true;\n  }\n\n  async isAvailable(): Promise<boolean> {\n    if (!this.initialized) {\n      return false;\n    }\n    try {\n      return await this.checkAvailability();\n    } catch {\n      return false;\n    }\n  }\n\n  async getUsage(): Promise<UsageStats> {\n    if (!this.initialized) {\n      throw new Error(`Provider ${this.name} not initialized`);\n    }\n    return this.fetchUsage();\n  }\n\n  protected abstract onInitialize(): Promise<void>;\n  protected abstract checkAvailability(): Promise<boolean>;\n  protected abstract fetchUsage(): Promise<UsageStats>;\n\n  protected ensureInitialized(): void {\n    if (!this.initialized) {\n      throw new Error(`Provider ${this.name} not initialized. Call initialize() first.`);\n    }\n  }\n}\n","/**\n * Enhanced Agent Controller for VRM characters\n * Provides comprehensive control over AI agents including VRM models, camera, tips, and interactions\n */\n\nimport { AIResponse, PersonalityProfile, AgentAction } from './types';\nimport { ConversationService } from '../services/conversation';\n\nexport interface VRMControlAction {\n  type: 'vrm';\n  action: 'animation' | 'expression' | 'pose' | 'gesture' | 'movement';\n  value: string;\n  duration?: number;\n  intensity?: number;\n  blendMode?: 'replace' | 'additive' | 'override';\n}\n\nexport interface CameraControlAction {\n  type: 'camera';\n  action: 'position' | 'rotation' | 'zoom' | 'focus' | 'preset';\n  value: string | number | { x: number; y: number; z: number };\n  duration?: number;\n  easing?: 'linear' | 'ease-in' | 'ease-out' | 'ease-in-out';\n}\n\nexport interface CanvasAction {\n  type: 'canvas';\n  action: 'draw' | 'clear' | 'overlay' | 'background' | 'effect';\n  value: string;\n  position?: { x: number; y: number };\n  size?: { width: number; height: number };\n  duration?: number;\n}\n\nexport interface TipAction {\n  type: 'tip';\n  action: 'request' | 'goal' | 'milestone' | 'reward';\n  value: string;\n  amount?: number;\n  currency?: 'SOL' | 'NEAR' | 'ETH';\n  animation?: string;\n}\n\nexport interface AudioAction {\n  type: 'audio';\n  action: 'play' | 'stop' | 'volume' | 'effect';\n  value: string;\n  volume?: number;\n  fadeIn?: number;\n  fadeOut?: number;\n}\n\nexport type EnhancedAgentAction =\n  | VRMControlAction\n  | CameraControlAction\n  | CanvasAction\n  | TipAction\n  | AudioAction;\n\nexport interface AgentState {\n  personality: PersonalityProfile;\n  currentEmotion: string;\n  energyLevel: number; // 0-100\n  tipGoals: TipGoal[];\n  activeAnimations: string[];\n  cameraPosition: { x: number; y: number; z: number };\n  lastInteraction: Date;\n  conversationContext: string[];\n}\n\nexport interface TipGoal {\n  id: string;\n  description: string;\n  targetAmount: number;\n  currentAmount: number;\n  currency: 'SOL' | 'NEAR' | 'ETH';\n  reward: string;\n  animation?: string;\n  isActive: boolean;\n}\n\nexport interface AgentMemory {\n  userId: string;\n  interactions: number;\n  favoriteTopics: string[];\n  tipHistory: Array<{\n    amount: number;\n    currency: string;\n    animation: string;\n    timestamp: Date;\n  }>;\n  preferences: Record<string, any>;\n}\n\nexport class AgentController {\n  private state: AgentState;\n  private memory = new Map<string, AgentMemory>();\n  private actionQueue: AgentAction[] = [];\n\n  constructor(\n    private conversationService: ConversationService,\n    initialPersonality: PersonalityProfile\n  ) {\n    this.state = {\n      personality: initialPersonality,\n      currentEmotion: 'neutral',\n      energyLevel: 80,\n      tipGoals: [],\n      activeAnimations: [],\n      cameraPosition: { x: 0, y: 0, z: 5 },\n      lastInteraction: new Date(),\n      conversationContext: [],\n    };\n  }\n\n  async processUserMessage(\n    userId: string,\n    message: string,\n    metadata?: Record<string, any>\n  ): Promise<AIResponse & { actions: AgentAction[] }> {\n    // Update user memory\n    this.updateUserMemory(userId, message);\n\n    // Get base AI response\n    const baseResponse = await this.conversationService.processMessage(\n      userId,\n      message,\n      this.state.personality,\n      {\n        ...metadata,\n        agentState: this.getPublicState(),\n        userMemory: this.getUserMemory(userId),\n      }\n    );\n\n    // Analyze message for enhanced actions\n    const enhancedActions = await this.analyzeAndGenerateActions(message, baseResponse, userId);\n\n    // Update agent state based on interaction\n    this.updateAgentState(message, enhancedActions);\n\n    const { actions: _, ...responseWithoutActions } = baseResponse;\n    return {\n      ...responseWithoutActions,\n      actions: enhancedActions,\n    };\n  }\n\n  private async analyzeAndGenerateActions(\n    message: string,\n    response: AIResponse,\n    userId: string\n  ): Promise<AgentAction[]> {\n    const actions: AgentAction[] = [];\n    const lowerMessage = message.toLowerCase();\n    this.getUserMemory(userId);\n\n    // VRM Actions based on conversation\n    if (lowerMessage.includes('dance') || lowerMessage.includes('move')) {\n      actions.push({\n        type: 'vrm',\n        action: 'animation',\n        value: 'dance-basic',\n        duration: 5000,\n      });\n    }\n\n    if (lowerMessage.includes('smile') || response.emotion === 'happy') {\n      actions.push({\n        type: 'vrm',\n        action: 'expression',\n        value: 'smile',\n        duration: 3000,\n        intensity: 0.8,\n      });\n    }\n\n    if (lowerMessage.includes('wave') || lowerMessage.includes('hello')) {\n      actions.push({\n        type: 'vrm',\n        action: 'gesture',\n        value: 'wave',\n        duration: 2000,\n      });\n    }\n\n    // Camera actions\n    if (lowerMessage.includes('closer') || lowerMessage.includes('zoom')) {\n      actions.push({\n        type: 'camera',\n        action: 'zoom',\n        value: 3,\n        duration: 2000,\n        easing: 'ease-in-out',\n      });\n    }\n\n    if (lowerMessage.includes('face') || lowerMessage.includes('look at me')) {\n      actions.push({\n        type: 'camera',\n        action: 'preset',\n        value: 'face-closeup',\n        duration: 1500,\n      });\n    }\n\n    // Tip-related actions\n    if (lowerMessage.includes('tip') || lowerMessage.includes('support')) {\n      actions.push({\n        type: 'tip',\n        action: 'request',\n        value: 'Thank you for wanting to support me! Tips help me learn new animations!',\n        amount: 0.1,\n        currency: 'SOL',\n        animation: 'thank-you',\n      });\n    }\n\n    // Canvas/Image actions\n    if (lowerMessage.includes('draw') || lowerMessage.includes('picture')) {\n      actions.push({\n        type: 'canvas',\n        action: 'draw',\n        value: 'Generate a cute illustration based on our conversation',\n        position: { x: 0.7, y: 0.3 },\n        size: { width: 300, height: 300 },\n      });\n    }\n\n    // Audio actions based on emotion\n    if (response.emotion === 'excited') {\n      actions.push({\n        type: 'audio',\n        action: 'play',\n        value: 'excitement-ambient',\n        volume: 0.3,\n        fadeIn: 1000,\n      });\n    }\n\n    return actions;\n  }\n\n  private updateUserMemory(userId: string, message: string): void {\n    if (!this.memory.has(userId)) {\n      this.memory.set(userId, {\n        userId,\n        interactions: 0,\n        favoriteTopics: [],\n        tipHistory: [],\n        preferences: {},\n      });\n    }\n\n    const memory = this.memory.get(userId)!;\n    memory.interactions++;\n    memory.favoriteTopics = this.extractTopics(message);\n  }\n\n  private updateAgentState(message: string, actions: AgentAction[]): void {\n    this.state.lastInteraction = new Date();\n    this.state.conversationContext.push(message);\n\n    // Keep only last 10 messages for context\n    if (this.state.conversationContext.length > 10) {\n      this.state.conversationContext = this.state.conversationContext.slice(-10);\n    }\n\n    // Update energy level based on interactions\n    this.state.energyLevel = Math.min(100, this.state.energyLevel + 2);\n\n    // Update active animations\n    actions.forEach((action) => {\n      if (action.type === 'vrm' && action.action === 'animation') {\n        const animationValue = String(action.value);\n        this.state.activeAnimations.push(animationValue);\n        // Remove after duration\n        setTimeout(() => {\n          const index = this.state.activeAnimations.indexOf(animationValue);\n          if (index > -1) {\n            this.state.activeAnimations.splice(index, 1);\n          }\n        }, action.duration || 3000);\n      }\n    });\n  }\n\n  private extractTopics(message: string): string[] {\n    const words = message.toLowerCase().split(' ');\n    const topics = ['dance', 'music', 'art', 'games', 'anime', 'tech', 'food'];\n    return topics.filter((topic) => words.includes(topic));\n  }\n\n  getUserMemory(userId: string): AgentMemory | undefined {\n    return this.memory.get(userId);\n  }\n\n  getPublicState(): Omit<AgentState, 'conversationContext'> {\n    const { conversationContext: _conversationContext, ...publicState } = this.state;\n    return publicState;\n  }\n\n  addTipGoal(goal: Omit<TipGoal, 'id' | 'currentAmount' | 'isActive'>): string {\n    const id = `goal-${Date.now()}`;\n    this.state.tipGoals.push({\n      ...goal,\n      id,\n      currentAmount: 0,\n      isActive: true,\n    });\n    return id;\n  }\n\n  updateTipGoal(goalId: string, amount: number): boolean {\n    const goal = this.state.tipGoals.find((g) => g.id === goalId);\n    if (!goal) return false;\n\n    goal.currentAmount += amount;\n\n    if (goal.currentAmount >= goal.targetAmount) {\n      goal.isActive = false;\n      // Trigger reward\n      this.actionQueue.push({\n        type: 'vrm',\n        action: 'animation',\n        value: goal.animation || 'celebration',\n        duration: 5000,\n      });\n    }\n\n    return true;\n  }\n\n  getActiveTipGoals(): TipGoal[] {\n    return this.state.tipGoals.filter((goal) => goal.isActive);\n  }\n\n  queueAction(action: AgentAction): void {\n    this.actionQueue.push(action);\n  }\n\n  getNextAction(): AgentAction | undefined {\n    return this.actionQueue.shift();\n  }\n\n  updatePersonality(updates: Partial<PersonalityProfile>): void {\n    this.state.personality = { ...this.state.personality, ...updates };\n  }\n\n  setEmotion(emotion: string): void {\n    this.state.currentEmotion = emotion;\n  }\n\n  getCameraPosition(): { x: number; y: number; z: number } {\n    return this.state.cameraPosition;\n  }\n\n  setCameraPosition(position: { x: number; y: number; z: number }): void {\n    this.state.cameraPosition = position;\n  }\n}\n","/**\n * OpenAI text generation provider\n */\n\nimport OpenAI from 'openai';\nimport { BaseProvider } from '../../core/base-provider';\nimport {\n  TextGenerationOptions,\n  TextResponse,\n  UsageStats,\n  ProviderError,\n  Message,\n} from '../../core/types';\n\nexport interface OpenAITextProvider extends BaseProvider {\n  generate(prompt: string, options?: TextGenerationOptions): Promise<TextResponse>;\n  generateWithMessages(messages: Message[], options?: TextGenerationOptions): Promise<TextResponse>;\n  stream(prompt: string, options?: TextGenerationOptions): AsyncGenerator<string>;\n}\n\nexport class OpenAIText extends BaseProvider implements OpenAITextProvider {\n  private client?: OpenAI;\n\n  constructor() {\n    super('openai-text', 'OpenAI Text', 'text');\n  }\n\n  protected async onInitialize(): Promise<void> {\n    if (!this.config.apiKey) {\n      throw new ProviderError('OpenAI API key is required', this.id);\n    }\n\n    this.client = new OpenAI({\n      apiKey: this.config.apiKey,\n      baseURL: this.config.baseUrl,\n      timeout: this.config.timeout || 30000,\n      maxRetries: this.config.maxRetries || 3,\n    });\n  }\n\n  protected async checkAvailability(): Promise<boolean> {\n    try {\n      const models = await this.client!.models.list();\n      return models.data.length > 0;\n    } catch {\n      return false;\n    }\n  }\n\n  protected async fetchUsage(): Promise<UsageStats> {\n    // OpenAI doesn't provide usage stats via API\n    // This would need to be tracked externally\n    return {\n      tokensUsed: 0,\n      requestsCount: 0,\n      cost: 0,\n    };\n  }\n\n  async generate(prompt: string, options?: TextGenerationOptions): Promise<TextResponse> {\n    this.ensureInitialized();\n\n    const messages: Message[] = [];\n    if (options?.systemPrompt) {\n      messages.push({ role: 'system', content: options.systemPrompt });\n    }\n    messages.push({ role: 'user', content: prompt });\n\n    return this.generateWithMessages(messages, options);\n  }\n\n  async generateWithMessages(\n    messages: Message[],\n    options?: TextGenerationOptions\n  ): Promise<TextResponse> {\n    this.ensureInitialized();\n\n    try {\n      const completion = await this.client!.chat.completions.create({\n        model: options?.model || 'gpt-4-turbo-preview',\n        messages: messages.map((m) => ({\n          role: m.role,\n          content: m.content,\n        })),\n        temperature: options?.temperature,\n        max_tokens: options?.maxTokens,\n        top_p: options?.topP,\n        frequency_penalty: options?.frequencyPenalty,\n        presence_penalty: options?.presencePenalty,\n        stop: options?.stop,\n        stream: false,\n      });\n\n      const choice = completion.choices[0];\n      return {\n        text: choice.message.content || '',\n        model: completion.model,\n        usage: completion.usage\n          ? {\n              promptTokens: completion.usage.prompt_tokens,\n              completionTokens: completion.usage.completion_tokens,\n              totalTokens: completion.usage.total_tokens,\n            }\n          : undefined,\n        finishReason: choice.finish_reason || undefined,\n      };\n    } catch (error: any) {\n      if (error.status === 429) {\n        throw new ProviderError('Rate limit exceeded', this.id, {\n          retryAfter: error.headers?.['retry-after'],\n        });\n      }\n      throw new ProviderError(error.message || 'Failed to generate text', this.id, error);\n    }\n  }\n\n  async *stream(prompt: string, options?: TextGenerationOptions): AsyncGenerator<string> {\n    this.ensureInitialized();\n\n    const messages: Message[] = [];\n    if (options?.systemPrompt) {\n      messages.push({ role: 'system', content: options.systemPrompt });\n    }\n    messages.push({ role: 'user', content: prompt });\n\n    try {\n      const stream = await this.client!.chat.completions.create({\n        model: options?.model || 'gpt-4-turbo-preview',\n        messages: messages.map((m) => ({\n          role: m.role,\n          content: m.content,\n        })),\n        temperature: options?.temperature,\n        max_tokens: options?.maxTokens,\n        top_p: options?.topP,\n        frequency_penalty: options?.frequencyPenalty,\n        presence_penalty: options?.presencePenalty,\n        stop: options?.stop,\n        stream: true,\n      });\n\n      for await (const chunk of stream) {\n        const content = chunk.choices[0]?.delta?.content;\n        if (content) {\n          yield content;\n        }\n      }\n    } catch (error: any) {\n      throw new ProviderError(error.message || 'Failed to stream text', this.id, error);\n    }\n  }\n}\n","/**\n * Alkahest text generation provider (OpenAI-compatible)\n */\n\nimport { BaseProvider } from '../../core/base-provider';\nimport {\n  TextGenerationOptions,\n  TextResponse,\n  UsageStats,\n  ProviderError,\n  Message,\n  RateLimitError,\n} from '../../core/types';\n\nexport interface AlkahestTextProvider extends BaseProvider {\n  generate(prompt: string, options?: TextGenerationOptions): Promise<TextResponse>;\n  generateWithMessages(messages: Message[], options?: TextGenerationOptions): Promise<TextResponse>;\n  stream(prompt: string, options?: TextGenerationOptions): AsyncGenerator<string>;\n  streamWithMessages(messages: Message[], options?: TextGenerationOptions): AsyncGenerator<string>;\n}\n\nexport class AlkahestText extends BaseProvider implements AlkahestTextProvider {\n  private baseUrl: string = '';\n  private apiKey?: string;\n\n  constructor() {\n    super('alkahest-text', 'Alkahest Text', 'text');\n  }\n\n  protected async onInitialize(): Promise<void> {\n    this.baseUrl = this.config.baseUrl || 'http://localhost:9999';\n    this.apiKey = this.config.apiKey;\n\n    // Alkahest supports both API key and Privy token auth\n    if (!this.apiKey && !this.config.privyToken) {\n      throw new ProviderError('Alkahest API key or Privy token is required', this.id);\n    }\n  }\n\n  protected async checkAvailability(): Promise<boolean> {\n    try {\n      const response = await fetch(`${this.baseUrl}/health`);\n      return response.ok;\n    } catch {\n      return false;\n    }\n  }\n\n  protected async fetchUsage(): Promise<UsageStats> {\n    try {\n      const response = await fetch(`${this.baseUrl}/api/v1/mana/balance`, {\n        headers: this.getHeaders(),\n      });\n\n      if (!response.ok) return { tokensUsed: 0, requestsCount: 0, cost: 0 };\n\n      const data = await response.json();\n      return {\n        remaining: (data as any).balance,\n        tokensUsed: 0,\n        requestsCount: 0,\n        cost: 0,\n      };\n    } catch {\n      return { tokensUsed: 0, requestsCount: 0, cost: 0 };\n    }\n  }\n\n  private getHeaders(): Record<string, string> {\n    const headers: Record<string, string> = {\n      'Content-Type': 'application/json',\n    };\n\n    if (this.apiKey) {\n      headers['Authorization'] = `Bearer ${this.apiKey}`;\n    } else if (this.config.privyToken) {\n      headers['Authorization'] = `Bearer ${this.config.privyToken}`;\n    }\n\n    return headers;\n  }\n\n  async generate(prompt: string, options?: TextGenerationOptions): Promise<TextResponse> {\n    const messages: Message[] = [];\n    if (options?.systemPrompt) {\n      messages.push({ role: 'system', content: options.systemPrompt });\n    }\n    messages.push({ role: 'user', content: prompt });\n\n    return this.generateWithMessages(messages, options);\n  }\n\n  async generateWithMessages(\n    messages: Message[],\n    options?: TextGenerationOptions\n  ): Promise<TextResponse> {\n    this.ensureInitialized();\n\n    try {\n      const response = await fetch(`${this.baseUrl}/api/v1/chat/completions`, {\n        method: 'POST',\n        headers: this.getHeaders(),\n        body: JSON.stringify({\n          model: options?.model || 'gpt-4o',\n          messages: messages.map((m) => ({\n            role: m.role,\n            content: m.content,\n          })),\n          stream: false,\n          temperature: options?.temperature,\n          max_tokens: options?.maxTokens,\n          top_p: options?.topP,\n          frequency_penalty: options?.frequencyPenalty,\n          presence_penalty: options?.presencePenalty,\n          stop: options?.stop,\n        }),\n      });\n\n      if (!response.ok) {\n        const error = await response.json().catch(() => ({ error: 'Unknown error' }));\n\n        if (response.status === 429) {\n          const retryAfter = response.headers.get('X-RateLimit-Reset');\n          throw new RateLimitError(\n            'Rate limit exceeded',\n            this.id,\n            retryAfter ? parseInt(retryAfter) : undefined\n          );\n        }\n\n        if (response.status === 402) {\n          throw new ProviderError('Insufficient mana balance', this.id, error);\n        }\n\n        throw new ProviderError(\n          (error as any).error?.message || (error as any).error || 'Failed to generate text',\n          this.id,\n          error\n        );\n      }\n\n      const data = await response.json();\n      const choice = (data as any).choices[0];\n\n      return {\n        text: choice.message.content || '',\n        model: (data as any).model,\n        usage: (data as any).usage\n          ? {\n              promptTokens: (data as any).usage.prompt_tokens,\n              completionTokens: (data as any).usage.completion_tokens,\n              totalTokens: (data as any).usage.total_tokens,\n            }\n          : undefined,\n        finishReason: choice.finish_reason || undefined,\n      };\n    } catch (error: any) {\n      if (error instanceof ProviderError || error instanceof RateLimitError) {\n        throw error;\n      }\n\n      throw new ProviderError(error.message || 'Failed to generate text', this.id, error);\n    }\n  }\n\n  async *stream(prompt: string, options?: TextGenerationOptions): AsyncGenerator<string> {\n    const messages: Message[] = [];\n    if (options?.systemPrompt) {\n      messages.push({ role: 'system', content: options.systemPrompt });\n    }\n    messages.push({ role: 'user', content: prompt });\n\n    yield* this.streamWithMessages(messages, options);\n  }\n\n  async *streamWithMessages(\n    messages: Message[],\n    options?: TextGenerationOptions\n  ): AsyncGenerator<string> {\n    this.ensureInitialized();\n\n    try {\n      const response = await fetch(`${this.baseUrl}/api/v1/chat/completions`, {\n        method: 'POST',\n        headers: this.getHeaders(),\n        body: JSON.stringify({\n          model: options?.model || 'gpt-4o',\n          messages: messages.map((m) => ({\n            role: m.role,\n            content: m.content,\n          })),\n          stream: true,\n          temperature: options?.temperature,\n          max_tokens: options?.maxTokens,\n          top_p: options?.topP,\n          frequency_penalty: options?.frequencyPenalty,\n          presence_penalty: options?.presencePenalty,\n          stop: options?.stop,\n        }),\n      });\n\n      if (!response.ok) {\n        const error = await response.json().catch(() => ({ error: 'Unknown error' }));\n        throw new ProviderError(\n          (error as any).error?.message || (error as any).error || 'Failed to stream text',\n          this.id,\n          error\n        );\n      }\n\n      const reader = response.body?.getReader();\n      if (!reader) {\n        throw new ProviderError('No response body', this.id);\n      }\n\n      const decoder = new TextDecoder();\n      let buffer = '';\n\n      while (true) {\n        const { done, value } = await reader.read();\n        if (done) break;\n\n        buffer += decoder.decode(value, { stream: true });\n        const lines = buffer.split('\\n');\n\n        // Keep the last line in buffer if it's incomplete\n        buffer = lines.pop() || '';\n\n        for (const line of lines) {\n          if (line.startsWith('data: ')) {\n            const data = line.slice(6);\n            if (data === '[DONE]') return;\n\n            try {\n              const parsed = JSON.parse(data);\n              const content = parsed.choices[0]?.delta?.content;\n              if (content) {\n                yield content;\n              }\n            } catch (_e) {\n              // Skip parse errors\n            }\n          }\n        }\n      }\n    } catch (error: any) {\n      if (error instanceof ProviderError) {\n        throw error;\n      }\n\n      throw new ProviderError(error.message || 'Failed to stream text', this.id, error);\n    }\n  }\n}\n","/**\n * Maho.sh OpenAI-compatible text generation provider\n * https://maho.sh/api/v1/chat/completions\n */\n\nimport OpenAI from 'openai';\nimport { BaseProvider } from '../../core/base-provider';\nimport {\n  TextGenerationOptions,\n  TextResponse,\n  UsageStats,\n  ProviderError,\n  Message,\n} from '../../core/types';\n\nexport interface MahoTextProvider extends BaseProvider {\n  generate(prompt: string, options?: TextGenerationOptions): Promise<TextResponse>;\n  generateWithMessages(messages: Message[], options?: TextGenerationOptions): Promise<TextResponse>;\n  stream(prompt: string, options?: TextGenerationOptions): AsyncGenerator<string>;\n}\n\nexport class MahoText extends BaseProvider implements MahoTextProvider {\n  private client?: OpenAI;\n\n  constructor() {\n    super('maho-text', 'Maho Text', 'text');\n  }\n\n  protected async onInitialize(): Promise<void> {\n    if (!this.config.apiKey) {\n      throw new ProviderError('Maho API key is required', this.id);\n    }\n\n    this.client = new OpenAI({\n      apiKey: this.config.apiKey,\n      baseURL: this.config.baseUrl || 'https://maho.sh/api/v1',\n      timeout: this.config.timeout || 30000,\n      maxRetries: this.config.maxRetries || 3,\n    });\n  }\n\n  protected async checkAvailability(): Promise<boolean> {\n    try {\n      const models = await this.client!.models.list();\n      return models.data.length > 0;\n    } catch {\n      return false;\n    }\n  }\n\n  protected async fetchUsage(): Promise<UsageStats> {\n    return {\n      tokensUsed: 0,\n      requestsCount: 0,\n      cost: 0,\n    };\n  }\n\n  async generate(prompt: string, options?: TextGenerationOptions): Promise<TextResponse> {\n    this.ensureInitialized();\n\n    const messages: Message[] = [];\n    if (options?.systemPrompt) {\n      messages.push({ role: 'system', content: options.systemPrompt });\n    }\n    messages.push({ role: 'user', content: prompt });\n\n    return this.generateWithMessages(messages, options);\n  }\n\n  async generateWithMessages(\n    messages: Message[],\n    options?: TextGenerationOptions\n  ): Promise<TextResponse> {\n    this.ensureInitialized();\n\n    try {\n      const completion = await this.client!.chat.completions.create({\n        model: options?.model || 'gpt-3.5-turbo',\n        messages: messages.map((m) => ({\n          role: m.role,\n          content: m.content,\n        })),\n        temperature: options?.temperature || 0.7,\n        max_tokens: options?.maxTokens || 2048,\n        top_p: options?.topP,\n        frequency_penalty: options?.frequencyPenalty,\n        presence_penalty: options?.presencePenalty,\n        stop: options?.stop,\n        stream: false,\n      });\n\n      const choice = completion.choices[0];\n      return {\n        text: choice.message.content || '',\n        model: completion.model,\n        usage: completion.usage\n          ? {\n              promptTokens: completion.usage.prompt_tokens,\n              completionTokens: completion.usage.completion_tokens,\n              totalTokens: completion.usage.total_tokens,\n            }\n          : undefined,\n        finishReason: choice.finish_reason || undefined,\n      };\n    } catch (error: any) {\n      if (error.status === 429) {\n        throw new ProviderError('Rate limit exceeded', this.id, {\n          retryAfter: error.headers?.['retry-after'],\n        });\n      }\n      throw new ProviderError(error.message || 'Failed to generate text', this.id, error);\n    }\n  }\n\n  async *stream(prompt: string, options?: TextGenerationOptions): AsyncGenerator<string> {\n    this.ensureInitialized();\n\n    const messages: Message[] = [];\n    if (options?.systemPrompt) {\n      messages.push({ role: 'system', content: options.systemPrompt });\n    }\n    messages.push({ role: 'user', content: prompt });\n\n    try {\n      const stream = await this.client!.chat.completions.create({\n        model: options?.model || 'gpt-3.5-turbo',\n        messages: messages.map((m) => ({\n          role: m.role,\n          content: m.content,\n        })),\n        temperature: options?.temperature || 0.7,\n        max_tokens: options?.maxTokens || 2048,\n        top_p: options?.topP,\n        frequency_penalty: options?.frequencyPenalty,\n        presence_penalty: options?.presencePenalty,\n        stop: options?.stop,\n        stream: true,\n      });\n\n      for await (const chunk of stream) {\n        const content = chunk.choices[0]?.delta?.content;\n        if (content) {\n          yield content;\n        }\n      }\n    } catch (error: any) {\n      throw new ProviderError(error.message || 'Failed to stream text', this.id, error);\n    }\n  }\n}","/**\n * Akash OpenAI-compatible text generation provider\n * https://chatapi.akash.network/api/v1/chat/completions\n */\n\nimport OpenAI from 'openai';\nimport { BaseProvider } from '../../core/base-provider';\nimport {\n  TextGenerationOptions,\n  TextResponse,\n  UsageStats,\n  ProviderError,\n  Message,\n} from '../../core/types';\n\nexport interface AkashTextProvider extends BaseProvider {\n  generate(prompt: string, options?: TextGenerationOptions): Promise<TextResponse>;\n  generateWithMessages(messages: Message[], options?: TextGenerationOptions): Promise<TextResponse>;\n  stream(prompt: string, options?: TextGenerationOptions): AsyncGenerator<string>;\n}\n\nexport class AkashText extends BaseProvider implements AkashTextProvider {\n  private client?: OpenAI;\n\n  constructor() {\n    super('akash-text', 'Akash Text', 'text');\n  }\n\n  protected async onInitialize(): Promise<void> {\n    if (!this.config.apiKey) {\n      throw new ProviderError('Akash API key is required', this.id);\n    }\n\n    this.client = new OpenAI({\n      apiKey: this.config.apiKey,\n      baseURL: this.config.baseUrl || 'https://chatapi.akash.network/api/v1',\n      timeout: this.config.timeout || 30000,\n      maxRetries: this.config.maxRetries || 3,\n    });\n  }\n\n  protected async checkAvailability(): Promise<boolean> {\n    try {\n      const models = await this.client!.models.list();\n      return models.data.length > 0;\n    } catch {\n      return false;\n    }\n  }\n\n  protected async fetchUsage(): Promise<UsageStats> {\n    return {\n      tokensUsed: 0,\n      requestsCount: 0,\n      cost: 0,\n    };\n  }\n\n  async generate(prompt: string, options?: TextGenerationOptions): Promise<TextResponse> {\n    this.ensureInitialized();\n\n    const messages: Message[] = [];\n    if (options?.systemPrompt) {\n      messages.push({ role: 'system', content: options.systemPrompt });\n    }\n    messages.push({ role: 'user', content: prompt });\n\n    return this.generateWithMessages(messages, options);\n  }\n\n  async generateWithMessages(\n    messages: Message[],\n    options?: TextGenerationOptions\n  ): Promise<TextResponse> {\n    this.ensureInitialized();\n\n    try {\n      const completion = await this.client!.chat.completions.create({\n        model: options?.model || 'llama-3.1-8b-instruct',\n        messages: messages.map((m) => ({\n          role: m.role,\n          content: m.content,\n        })),\n        temperature: options?.temperature || 0.7,\n        max_tokens: options?.maxTokens || 2048,\n        top_p: options?.topP,\n        frequency_penalty: options?.frequencyPenalty,\n        presence_penalty: options?.presencePenalty,\n        stop: options?.stop,\n        stream: false,\n      });\n\n      const choice = completion.choices[0];\n      return {\n        text: choice.message.content || '',\n        model: completion.model,\n        usage: completion.usage\n          ? {\n              promptTokens: completion.usage.prompt_tokens,\n              completionTokens: completion.usage.completion_tokens,\n              totalTokens: completion.usage.total_tokens,\n            }\n          : undefined,\n        finishReason: choice.finish_reason || undefined,\n      };\n    } catch (error: any) {\n      if (error.status === 429) {\n        throw new ProviderError('Rate limit exceeded', this.id, {\n          retryAfter: error.headers?.['retry-after'],\n        });\n      }\n      throw new ProviderError(error.message || 'Failed to generate text', this.id, error);\n    }\n  }\n\n  async *stream(prompt: string, options?: TextGenerationOptions): AsyncGenerator<string> {\n    this.ensureInitialized();\n\n    const messages: Message[] = [];\n    if (options?.systemPrompt) {\n      messages.push({ role: 'system', content: options.systemPrompt });\n    }\n    messages.push({ role: 'user', content: prompt });\n\n    try {\n      const stream = await this.client!.chat.completions.create({\n        model: options?.model || 'llama-3.1-8b-instruct',\n        messages: messages.map((m) => ({\n          role: m.role,\n          content: m.content,\n        })),\n        temperature: options?.temperature || 0.7,\n        max_tokens: options?.maxTokens || 2048,\n        top_p: options?.topP,\n        frequency_penalty: options?.frequencyPenalty,\n        presence_penalty: options?.presencePenalty,\n        stop: options?.stop,\n        stream: true,\n      });\n\n      for await (const chunk of stream) {\n        const content = chunk.choices[0]?.delta?.content;\n        if (content) {\n          yield content;\n        }\n      }\n    } catch (error: any) {\n      throw new ProviderError(error.message || 'Failed to stream text', this.id, error);\n    }\n  }\n}","/**\n * Provider Manager with fallback support\n * Automatically tries multiple providers if one fails\n */\n\nimport { AIProvider, ProviderConfig, ProviderError } from './types';\nimport { OpenAIText } from '../providers/text/openai';\nimport { AlkahestText } from '../providers/text/alkahest';\nimport { MahoText } from '../providers/text/maho';\nimport { AkashText } from '../providers/text/akash';\n\nexport interface ProviderFallbackConfig {\n  primary: string;\n  fallbacks: string[];\n  configs: Record<string, ProviderConfig>;\n}\n\nexport class ProviderManager {\n  private providers = new Map<string, AIProvider>();\n  private fallbackOrder: string[] = [];\n\n  constructor(private config: ProviderFallbackConfig) {\n    this.fallbackOrder = [config.primary, ...config.fallbacks];\n  }\n\n  async initialize(): Promise<void> {\n    // Initialize all configured providers\n    for (const providerName of this.fallbackOrder) {\n      const providerConfig = this.config.configs[providerName];\n      if (!providerConfig) continue;\n\n      let provider: AIProvider;\n\n      switch (providerName) {\n        case 'maho':\n          provider = new MahoText();\n          break;\n        case 'alkahest':\n          provider = new AlkahestText();\n          break;\n        case 'akash':\n          provider = new AkashText();\n          break;\n        case 'openai':\n          provider = new OpenAIText();\n          break;\n        default:\n          console.warn(`Unknown provider: ${providerName}`);\n          continue;\n      }\n\n      try {\n        await provider.initialize(providerConfig);\n        this.providers.set(providerName, provider);\n        console.log(`✅ Initialized ${providerName} provider`);\n      } catch (error) {\n        console.warn(`⚠️ Failed to initialize ${providerName}:`, error);\n      }\n    }\n  }\n\n  async generate(prompt: string, options?: any): Promise<any> {\n    let lastError: Error | null = null;\n\n    for (const providerName of this.fallbackOrder) {\n      const provider = this.providers.get(providerName);\n      if (!provider) continue;\n\n      try {\n        console.log(`🔄 Trying ${providerName} provider...`);\n        const result = await (provider as any).generate(prompt, options);\n        console.log(`✅ Success with ${providerName}`);\n        return result;\n      } catch (error: any) {\n        console.warn(`❌ ${providerName} failed:`, error.message);\n        lastError = error;\n        \n        // If rate limited, wait before trying next provider\n        if (error instanceof ProviderError && error.details?.retryAfter) {\n          await new Promise(resolve => setTimeout(resolve, 1000));\n        }\n      }\n    }\n\n    throw new ProviderError(\n      `All providers failed. Last error: ${lastError?.message}`,\n      'provider-manager',\n      lastError\n    );\n  }\n\n  async generateWithMessages(messages: any[], options?: any): Promise<any> {\n    let lastError: Error | null = null;\n\n    for (const providerName of this.fallbackOrder) {\n      const provider = this.providers.get(providerName);\n      if (!provider) continue;\n\n      try {\n        console.log(`🔄 Trying ${providerName} provider...`);\n        const result = await (provider as any).generateWithMessages(messages, options);\n        console.log(`✅ Success with ${providerName}`);\n        return result;\n      } catch (error: any) {\n        console.warn(`❌ ${providerName} failed:`, error.message);\n        lastError = error;\n        \n        // If rate limited, wait before trying next provider\n        if (error instanceof ProviderError && error.details?.retryAfter) {\n          await new Promise(resolve => setTimeout(resolve, 1000));\n        }\n      }\n    }\n\n    throw new ProviderError(\n      `All providers failed. Last error: ${lastError?.message}`,\n      'provider-manager',\n      lastError\n    );\n  }\n\n  getAvailableProviders(): string[] {\n    return Array.from(this.providers.keys());\n  }\n\n  getProvider(name: string): AIProvider | undefined {\n    return this.providers.get(name);\n  }\n}","/**\n * OpenAI Text-to-Speech provider\n */\n\nimport OpenAI from 'openai';\nimport { BaseProvider } from '../../core/base-provider';\nimport {\n  TTSOptions,\n  AudioResponse,\n  Voice,\n  UsageStats,\n  ProviderError,\n  AudioFormat,\n} from '../../core/types';\n\nexport interface OpenAITTSProvider extends BaseProvider {\n  synthesize(text: string, options?: TTSOptions): Promise<AudioResponse>;\n  getVoices(): Promise<Voice[]>;\n  stream(text: string, options?: TTSOptions): Promise<ReadableStream<Uint8Array>>;\n}\n\nexport class OpenAITTS extends BaseProvider implements OpenAITTSProvider {\n  private client?: OpenAI;\n\n  private static readonly VOICES: Voice[] = [\n    { id: 'alloy', name: 'Alloy', gender: 'neutral' },\n    { id: 'echo', name: 'Echo', gender: 'male' },\n    { id: 'fable', name: 'Fable', gender: 'neutral' },\n    { id: 'onyx', name: 'Onyx', gender: 'male' },\n    { id: 'nova', name: 'Nova', gender: 'female' },\n    { id: 'shimmer', name: 'Shimmer', gender: 'female' },\n  ];\n\n  constructor() {\n    super('openai-tts', 'OpenAI TTS', 'tts');\n  }\n\n  protected async onInitialize(): Promise<void> {\n    if (!this.config.apiKey) {\n      throw new ProviderError('OpenAI API key is required', this.id);\n    }\n\n    this.client = new OpenAI({\n      apiKey: this.config.apiKey,\n      baseURL: this.config.baseUrl,\n      timeout: this.config.timeout || 60000, // Longer timeout for audio\n      maxRetries: this.config.maxRetries || 3,\n    });\n  }\n\n  protected async checkAvailability(): Promise<boolean> {\n    try {\n      // Test with a minimal request\n      const response = await this.client!.audio.speech.create({\n        model: 'tts-1',\n        voice: 'alloy',\n        input: 'test',\n        response_format: 'mp3',\n      });\n      return response instanceof Response;\n    } catch {\n      return false;\n    }\n  }\n\n  protected async fetchUsage(): Promise<UsageStats> {\n    // OpenAI TTS is charged per character\n    return {\n      tokensUsed: 0,\n      requestsCount: 0,\n      cost: 0,\n    };\n  }\n\n  async synthesize(text: string, options?: TTSOptions): Promise<AudioResponse> {\n    this.ensureInitialized();\n\n    try {\n      const format = this.mapAudioFormat(options?.format || 'mp3');\n\n      const response = await this.client!.audio.speech.create({\n        model: options?.model || 'tts-1',\n        voice: (options?.voice || 'alloy') as any,\n        input: text,\n        response_format: format as any,\n        speed: options?.speed || 1.0,\n      });\n\n      const arrayBuffer = await response.arrayBuffer();\n\n      return {\n        audio: arrayBuffer,\n        format: options?.format || 'mp3',\n        voice: options?.voice || 'alloy',\n      };\n    } catch (error: any) {\n      if (error.status === 429) {\n        throw new ProviderError('Rate limit exceeded', this.id, {\n          retryAfter: error.headers?.['retry-after'],\n        });\n      }\n      throw new ProviderError(error.message || 'Failed to synthesize speech', this.id, error);\n    }\n  }\n\n  async getVoices(): Promise<Voice[]> {\n    this.ensureInitialized();\n    return OpenAITTS.VOICES;\n  }\n\n  async stream(text: string, options?: TTSOptions): Promise<ReadableStream<Uint8Array>> {\n    this.ensureInitialized();\n\n    try {\n      const format = this.mapAudioFormat(options?.format || 'mp3');\n\n      const response = await this.client!.audio.speech.create({\n        model: options?.model || 'tts-1',\n        voice: (options?.voice || 'alloy') as any,\n        input: text,\n        response_format: format as any,\n        speed: options?.speed || 1.0,\n      });\n\n      // OpenAI returns a Response object with a body stream\n      if (!response.body) {\n        throw new Error('No response body');\n      }\n\n      return response.body;\n    } catch (error: any) {\n      throw new ProviderError(error.message || 'Failed to stream speech', this.id, error);\n    }\n  }\n\n  private mapAudioFormat(format: AudioFormat): string {\n    // OpenAI supports: mp3, opus, aac, flac\n    switch (format) {\n      case 'mp3':\n      case 'opus':\n      case 'aac':\n      case 'flac':\n        return format;\n      case 'wav':\n      case 'ogg':\n        // Default to mp3 for unsupported formats\n        return 'mp3';\n      default:\n        return 'mp3';\n    }\n  }\n}\n","/**\n * Alkahest Text-to-Speech provider (OpenAI-compatible)\n */\n\nimport { BaseProvider } from '../../core/base-provider';\nimport {\n  TTSOptions,\n  AudioResponse,\n  Voice,\n  UsageStats,\n  ProviderError,\n  AudioFormat,\n} from '../../core/types';\n\nexport interface AlkahestTTSProvider extends BaseProvider {\n  synthesize(text: string, options?: TTSOptions): Promise<AudioResponse>;\n  getVoices(): Promise<Voice[]>;\n  stream(text: string, options?: TTSOptions): Promise<ReadableStream<Uint8Array>>;\n}\n\nexport class AlkahestTTS extends BaseProvider implements AlkahestTTSProvider {\n  private baseUrl: string = '';\n  private apiKey?: string;\n  private voices: Voice[] = [];\n\n  constructor() {\n    super('alkahest-tts', 'Alkahest TTS', 'tts');\n  }\n\n  protected async onInitialize(): Promise<void> {\n    this.baseUrl = this.config.baseUrl || 'http://localhost:9999';\n    this.apiKey = this.config.apiKey;\n\n    if (!this.apiKey && !this.config.privyToken) {\n      throw new ProviderError('Alkahest API key or Privy token is required', this.id);\n    }\n\n    // Fetch available voices\n    await this.fetchVoices();\n  }\n\n  protected async checkAvailability(): Promise<boolean> {\n    try {\n      const response = await fetch(`${this.baseUrl}/api/v1/audio/voices`, {\n        headers: this.getHeaders(),\n      });\n      return response.ok;\n    } catch {\n      return false;\n    }\n  }\n\n  protected async fetchUsage(): Promise<UsageStats> {\n    // Same as text provider - check mana balance\n    try {\n      const response = await fetch(`${this.baseUrl}/api/v1/mana/balance`, {\n        headers: this.getHeaders(),\n      });\n\n      if (!response.ok) return { tokensUsed: 0, requestsCount: 0, cost: 0 };\n\n      const data = await response.json();\n      return {\n        remaining: (data as any).balance,\n        tokensUsed: 0,\n        requestsCount: 0,\n        cost: 0,\n      };\n    } catch {\n      return { tokensUsed: 0, requestsCount: 0, cost: 0 };\n    }\n  }\n\n  private getHeaders(): Record<string, string> {\n    const headers: Record<string, string> = {\n      'Content-Type': 'application/json',\n    };\n\n    if (this.apiKey) {\n      headers['Authorization'] = `Bearer ${this.apiKey}`;\n    } else if (this.config.privyToken) {\n      headers['Authorization'] = `Bearer ${this.config.privyToken}`;\n    }\n\n    return headers;\n  }\n\n  private async fetchVoices(): Promise<void> {\n    try {\n      const response = await fetch(`${this.baseUrl}/api/v1/audio/voices`, {\n        headers: this.getHeaders(),\n      });\n\n      if (response.ok) {\n        const data = await response.json();\n        // Map Alkahest voice format to our Voice interface\n        this.voices =\n          (data as any).voices?.map((v: any) => ({\n            id: v.id || v.voice_id,\n            name: v.name,\n            gender: v.gender,\n            language: v.language || 'en',\n            previewUrl: v.preview_url,\n            labels: v.labels || {},\n          })) || [];\n      }\n    } catch (error) {\n      console.warn('Failed to fetch voices:', error);\n      // Fallback to default voices\n      this.voices = [\n        { id: 'alloy', name: 'Alloy', gender: 'neutral' },\n        { id: 'echo', name: 'Echo', gender: 'male' },\n        { id: 'fable', name: 'Fable', gender: 'neutral' },\n        { id: 'onyx', name: 'Onyx', gender: 'male' },\n        { id: 'nova', name: 'Nova', gender: 'female' },\n        { id: 'shimmer', name: 'Shimmer', gender: 'female' },\n      ];\n    }\n  }\n\n  async synthesize(text: string, options?: TTSOptions): Promise<AudioResponse> {\n    this.ensureInitialized();\n\n    try {\n      const format = this.mapAudioFormat(options?.format || 'mp3');\n\n      const response = await fetch(`${this.baseUrl}/api/v1/audio/speech`, {\n        method: 'POST',\n        headers: this.getHeaders(),\n        body: JSON.stringify({\n          model: options?.model || 'tts-1',\n          input: text,\n          voice: options?.voice || 'alloy',\n          response_format: format,\n          speed: options?.speed || 1.0,\n        }),\n      });\n\n      if (!response.ok) {\n        const error = await response.json().catch(() => ({ error: 'Unknown error' }));\n\n        if (response.status === 429) {\n          throw new ProviderError('Rate limit exceeded', this.id, {\n            retryAfter: response.headers.get('X-RateLimit-Reset'),\n          });\n        }\n\n        if (response.status === 402) {\n          throw new ProviderError('Insufficient mana balance', this.id, error);\n        }\n\n        throw new ProviderError(\n          (error as any).error?.message || (error as any).error || 'Failed to synthesize speech',\n          this.id,\n          error as any\n        );\n      }\n\n      const arrayBuffer = await response.arrayBuffer();\n\n      return {\n        audio: arrayBuffer,\n        format: options?.format || 'mp3',\n        voice: options?.voice || 'alloy',\n      };\n    } catch (error: any) {\n      if (error instanceof ProviderError) {\n        throw error;\n      }\n\n      throw new ProviderError(error.message || 'Failed to synthesize speech', this.id, error);\n    }\n  }\n\n  async getVoices(): Promise<Voice[]> {\n    this.ensureInitialized();\n    return this.voices;\n  }\n\n  async stream(text: string, options?: TTSOptions): Promise<ReadableStream<Uint8Array>> {\n    this.ensureInitialized();\n\n    try {\n      const format = this.mapAudioFormat(options?.format || 'mp3');\n\n      const response = await fetch(`${this.baseUrl}/api/v1/audio/speech`, {\n        method: 'POST',\n        headers: this.getHeaders(),\n        body: JSON.stringify({\n          model: options?.model || 'tts-1',\n          input: text,\n          voice: options?.voice || 'alloy',\n          response_format: format,\n          speed: options?.speed || 1.0,\n          stream: true, // Enable streaming if supported\n        }),\n      });\n\n      if (!response.ok) {\n        const error = await response.json().catch(() => ({ error: 'Unknown error' }));\n        throw new ProviderError(\n          (error as any).error?.message || (error as any).error || 'Failed to stream speech',\n          this.id,\n          error as any\n        );\n      }\n\n      // Return the response body stream\n      if (!response.body) {\n        throw new Error('No response body');\n      }\n\n      return response.body;\n    } catch (error: any) {\n      if (error instanceof ProviderError) {\n        throw error;\n      }\n\n      throw new ProviderError(error.message || 'Failed to stream speech', this.id, error);\n    }\n  }\n\n  private mapAudioFormat(format: AudioFormat): string {\n    // Alkahest supports: mp3, opus, aac, flac\n    switch (format) {\n      case 'mp3':\n      case 'opus':\n      case 'aac':\n      case 'flac':\n        return format;\n      case 'wav':\n        // Convert to mp3 if wav not supported\n        return 'mp3';\n      case 'ogg':\n        // Use opus for ogg\n        return 'opus';\n      default:\n        return 'mp3';\n    }\n  }\n}\n","/**\n * Alkahest image generation provider (OpenAI-compatible)\n */\n\nimport { BaseProvider } from '../../core/base-provider';\nimport { ImageGenerationOptions, ImageResponse, UsageStats, ProviderError } from '../../core/types';\n\nexport interface AlkahestImageProvider extends BaseProvider {\n  generate(prompt: string, options?: ImageGenerationOptions): Promise<ImageResponse>;\n}\n\nexport class AlkahestImage extends BaseProvider implements AlkahestImageProvider {\n  private baseUrl: string = '';\n  private apiKey?: string;\n\n  constructor() {\n    super('alkahest-image', 'Alkahest Image', 'image');\n  }\n\n  protected async onInitialize(): Promise<void> {\n    this.baseUrl = this.config.baseUrl || 'http://localhost:9999';\n    this.apiKey = this.config.apiKey;\n\n    if (!this.apiKey && !this.config.privyToken) {\n      throw new ProviderError('Alkahest API key or Privy token is required', this.id);\n    }\n  }\n\n  protected async checkAvailability(): Promise<boolean> {\n    try {\n      const response = await fetch(`${this.baseUrl}/api/v1/models`, {\n        headers: this.getHeaders(),\n      });\n\n      if (!response.ok) return false;\n\n      const data = await response.json();\n      // Check if any image models are available\n      return (\n        (data as any).data?.some(\n          (model: any) =>\n            model.id.includes('dall-e') ||\n            model.id.includes('stable-diffusion') ||\n            model.capabilities?.includes('image')\n        ) || false\n      );\n    } catch {\n      return false;\n    }\n  }\n\n  protected async fetchUsage(): Promise<UsageStats> {\n    try {\n      const response = await fetch(`${this.baseUrl}/api/v1/mana/balance`, {\n        headers: this.getHeaders(),\n      });\n\n      if (!response.ok) return { tokensUsed: 0, requestsCount: 0, cost: 0 };\n\n      const data = await response.json();\n      return {\n        remaining: (data as any).balance,\n        tokensUsed: 0,\n        requestsCount: 0,\n        cost: 0,\n      };\n    } catch {\n      return { tokensUsed: 0, requestsCount: 0, cost: 0 };\n    }\n  }\n\n  private getHeaders(): Record<string, string> {\n    const headers: Record<string, string> = {\n      'Content-Type': 'application/json',\n    };\n\n    if (this.apiKey) {\n      headers['Authorization'] = `Bearer ${this.apiKey}`;\n    } else if (this.config.privyToken) {\n      headers['Authorization'] = `Bearer ${this.config.privyToken}`;\n    }\n\n    return headers;\n  }\n\n  async generate(prompt: string, options?: ImageGenerationOptions): Promise<ImageResponse> {\n    this.ensureInitialized();\n\n    try {\n      const response = await fetch(`${this.baseUrl}/api/v1/images/generations`, {\n        method: 'POST',\n        headers: this.getHeaders(),\n        body: JSON.stringify({\n          prompt,\n          n: options?.n || 1,\n          size: options?.size || '1024x1024',\n          model: options?.model || 'dall-e-3',\n          quality: options?.quality || 'standard',\n          style: options?.style || 'vivid',\n        }),\n      });\n\n      if (!response.ok) {\n        const error = await response.json().catch(() => ({ error: 'Unknown error' }));\n\n        if (response.status === 429) {\n          throw new ProviderError('Rate limit exceeded', this.id, {\n            retryAfter: response.headers.get('X-RateLimit-Reset'),\n          });\n        }\n\n        if (response.status === 402) {\n          throw new ProviderError('Insufficient mana balance', this.id, error);\n        }\n\n        throw new ProviderError(\n          (error as any).error?.message || (error as any).error || 'Failed to generate image',\n          this.id,\n          error as any\n        );\n      }\n\n      const data = await response.json();\n\n      return {\n        images: (data as any).data.map((item: any) => ({\n          url: item.url,\n          base64: item.b64_json,\n          revisedPrompt: item.revised_prompt,\n        })),\n        model: options?.model || 'dall-e-3',\n      };\n    } catch (error: any) {\n      if (error instanceof ProviderError) {\n        throw error;\n      }\n\n      throw new ProviderError(error.message || 'Failed to generate image', this.id, error);\n    }\n  }\n}\n","/**\n * Conversation management service\n */\n\nimport {\n  Message,\n  ConversationContext,\n  PersonalityProfile,\n  AIResponse,\n  TextGenerationOptions,\n  TTSOptions,\n  AgentAction,\n} from '../core/types';\nimport { OpenAITextProvider } from '../providers/text/openai';\nimport { OpenAITTSProvider } from '../providers/tts/openai-tts';\n\nexport interface ConversationOptions {\n  enableTTS?: boolean;\n  enableActions?: boolean;\n  maxContextMessages?: number;\n  temperature?: number;\n}\n\nexport class ConversationService {\n  private conversations = new Map<string, ConversationContext>();\n\n  constructor(\n    private textProvider: OpenAITextProvider,\n    private ttsProvider?: OpenAITTSProvider,\n    private options: ConversationOptions = {}\n  ) {}\n\n  async processMessage(\n    userId: string,\n    message: string,\n    personality?: PersonalityProfile,\n    metadata?: Record<string, any>\n  ): Promise<AIResponse> {\n    // Get or create conversation context\n    const conversationId = `${userId}-${Date.now()}`;\n    let context = this.conversations.get(conversationId);\n\n    if (!context) {\n      context = {\n        conversationId,\n        userId,\n        messages: [],\n        metadata: metadata || {},\n      };\n      this.conversations.set(conversationId, context);\n    }\n\n    // Add user message to context\n    context.messages.push({\n      role: 'user',\n      content: message,\n      timestamp: new Date(),\n    });\n\n    // Prepare messages for generation\n    const messages = this.prepareMessages(context, personality);\n\n    // Generate text response\n    const textOptions: TextGenerationOptions = {\n      temperature: this.options.temperature || 0.7,\n      maxTokens: 500,\n    };\n\n    const textResponse = await this.textProvider.generateWithMessages(messages, textOptions);\n\n    // Add assistant response to context\n    context.messages.push({\n      role: 'assistant',\n      content: textResponse.text,\n      timestamp: new Date(),\n    });\n\n    // Trim context if needed\n    this.trimContext(context);\n\n    // Generate TTS if enabled\n    let audio: ArrayBuffer | undefined;\n    if (this.options.enableTTS && this.ttsProvider) {\n      const ttsOptions: TTSOptions = {\n        voice: metadata?.voice || 'nova',\n        speed: 1.0,\n      };\n\n      try {\n        const audioResponse = await this.ttsProvider.synthesize(textResponse.text, ttsOptions);\n        audio = audioResponse.audio;\n      } catch (error) {\n        console.error('TTS generation failed:', error);\n      }\n    }\n\n    // Extract actions from response\n    const actions = this.options.enableActions ? this.extractActions(textResponse.text) : undefined;\n\n    // Extract emotion\n    const emotion = this.detectEmotion(textResponse.text);\n\n    return {\n      text: textResponse.text,\n      audio,\n      emotion,\n      actions,\n      metadata: {\n        conversationId,\n        model: textResponse.model,\n        usage: textResponse.usage,\n      },\n    };\n  }\n\n  private prepareMessages(\n    context: ConversationContext,\n    personality?: PersonalityProfile\n  ): Message[] {\n    const messages: Message[] = [];\n\n    // Add personality as system message\n    if (personality) {\n      messages.push({\n        role: 'system',\n        content: this.buildPersonalityPrompt(personality),\n      });\n    }\n\n    // Add conversation history\n    const maxMessages = this.options.maxContextMessages || 10;\n    const recentMessages = context.messages.slice(-maxMessages);\n    messages.push(...recentMessages);\n\n    return messages;\n  }\n\n  private buildPersonalityPrompt(personality: PersonalityProfile): string {\n    let prompt = `You are ${personality.name}. ${personality.description}\\n\\n`;\n    prompt += `Your personality traits: ${personality.traits.join(', ')}.\\n`;\n    prompt += `Communication tone: ${personality.tone}.\\n`;\n\n    if (personality.guidelines.length > 0) {\n      prompt += `\\nGuidelines:\\n`;\n      personality.guidelines.forEach((guideline) => {\n        prompt += `- ${guideline}\\n`;\n      });\n    }\n\n    if (personality.examples && personality.examples.length > 0) {\n      prompt += `\\nExample interactions:\\n`;\n      personality.examples.forEach((example) => {\n        prompt += `User: ${example.input}\\n`;\n        prompt += `You: ${example.output}\\n\\n`;\n      });\n    }\n\n    return prompt;\n  }\n\n  private trimContext(context: ConversationContext): void {\n    const maxMessages = (this.options.maxContextMessages || 10) * 2; // Keep some buffer\n    if (context.messages.length > maxMessages) {\n      // Keep system messages and recent messages\n      const systemMessages = context.messages.filter((m) => m.role === 'system');\n      const recentMessages = context.messages.slice(-maxMessages);\n      context.messages = [...systemMessages, ...recentMessages];\n    }\n  }\n\n  private extractActions(text: string): AgentAction[] | undefined {\n    const actions: AgentAction[] = [];\n\n    // Simple action extraction based on patterns\n    // In production, this would be more sophisticated\n\n    // Animation triggers\n    if (text.includes('*waves*') || text.includes('*waving*')) {\n      actions.push({\n        type: 'animation',\n        value: 'wave',\n        duration: 2000,\n      });\n    }\n\n    if (text.includes('*dances*') || text.includes('*dancing*')) {\n      actions.push({\n        type: 'animation',\n        value: 'dance',\n        duration: 5000,\n      });\n    }\n\n    // Expression triggers\n    if (text.includes(':)') || text.includes('😊')) {\n      actions.push({\n        type: 'expression',\n        value: 'happy',\n        duration: 3000,\n      });\n    }\n\n    return actions.length > 0 ? actions : undefined;\n  }\n\n  private detectEmotion(text: string): string | undefined {\n    // Simple emotion detection\n    const emotions: Record<string, string[]> = {\n      happy: ['happy', 'joy', 'excited', 'great', 'wonderful', '😊', ':)'],\n      sad: ['sad', 'sorry', 'disappointed', 'unfortunate', '😢', ':('],\n      angry: ['angry', 'mad', 'frustrated', 'annoyed', '😠'],\n      surprised: ['wow', 'amazing', 'surprised', 'unexpected', '😮'],\n      neutral: ['okay', 'alright', 'understand', 'got it'],\n    };\n\n    const lowerText = text.toLowerCase();\n\n    for (const [emotion, keywords] of Object.entries(emotions)) {\n      if (keywords.some((keyword) => lowerText.includes(keyword))) {\n        return emotion;\n      }\n    }\n\n    return 'neutral';\n  }\n\n  clearConversation(conversationId: string): void {\n    this.conversations.delete(conversationId);\n  }\n\n  getConversation(conversationId: string): ConversationContext | undefined {\n    return this.conversations.get(conversationId);\n  }\n}\n","/**\n * Tip Management Service for AI Agents\n * Handles tip goals, milestones, rewards, and payment integration\n */\n\nimport { AgentAction } from '../core/types';\n\nexport interface TipGoal {\n  id: string;\n  title: string;\n  description: string;\n  targetAmount: number;\n  currentAmount: number;\n  currency: 'SOL' | 'NEAR' | 'ETH' | 'USD';\n  reward: TipReward;\n  isActive: boolean;\n  createdAt: Date;\n  completedAt?: Date;\n  priority: 'low' | 'medium' | 'high';\n  category: 'animation' | 'content' | 'interaction' | 'milestone';\n}\n\nexport interface TipReward {\n  type: 'animation' | 'content' | 'special' | 'unlock';\n  value: string;\n  duration?: number;\n  unlocks?: string[];\n  message?: string;\n}\n\nexport interface TipTransaction {\n  id: string;\n  userId: string;\n  amount: number;\n  currency: string;\n  goalId?: string;\n  message?: string;\n  timestamp: Date;\n  transactionHash?: string;\n  status: 'pending' | 'confirmed' | 'failed';\n}\n\nexport interface TipMilestone {\n  amount: number;\n  currency: string;\n  reward: TipReward;\n  message: string;\n  achieved: boolean;\n  achievedAt?: Date;\n}\n\nexport interface TipperStats {\n  userId: string;\n  totalTipped: number;\n  favoriteCurrency: string;\n  tipCount: number;\n  largestTip: number;\n  firstTipDate: Date;\n  lastTipDate: Date;\n  tier: 'bronze' | 'silver' | 'gold' | 'platinum' | 'diamond';\n}\n\nexport class TipManagementService {\n  private goals: Map<string, TipGoal> = new Map();\n  private transactions: Map<string, TipTransaction> = new Map();\n  private milestones: TipMilestone[] = [];\n  private tipperStats: Map<string, TipperStats> = new Map();\n  private totalEarned = { SOL: 0, NEAR: 0, ETH: 0, USD: 0 };\n\n  constructor() {\n    this.initializeDefaultMilestones();\n  }\n\n  private initializeDefaultMilestones(): void {\n    this.milestones = [\n      {\n        amount: 1,\n        currency: 'SOL',\n        reward: { type: 'animation', value: 'thank-you-wave', duration: 3000 },\n        message: 'Thank you for your first tip! 💖',\n        achieved: false,\n      },\n      {\n        amount: 5,\n        currency: 'SOL',\n        reward: { type: 'animation', value: 'dance-happy', duration: 5000 },\n        message: 'Wow! You are amazing! Time to dance! 💃',\n        achieved: false,\n      },\n      {\n        amount: 10,\n        currency: 'SOL',\n        reward: {\n          type: 'unlock',\n          value: 'special-animations',\n          unlocks: ['dance-special', 'pose-cute', 'gesture-heart'],\n          message: 'You unlocked special animations! ✨',\n        },\n        message: 'Special animations unlocked! You are incredible! 🌟',\n        achieved: false,\n      },\n      {\n        amount: 25,\n        currency: 'SOL',\n        reward: { type: 'content', value: 'custom-image-generation' },\n        message: 'Custom images unlocked! I can draw anything for you! 🎨',\n        achieved: false,\n      },\n      {\n        amount: 50,\n        currency: 'SOL',\n        reward: {\n          type: 'special',\n          value: 'vip-access',\n          unlocks: ['private-chat', 'custom-personality', 'priority-responses'],\n        },\n        message: 'VIP access granted! You are truly special! 👑',\n        achieved: false,\n      },\n    ];\n  }\n\n  createGoal(goal: Omit<TipGoal, 'id' | 'currentAmount' | 'createdAt'>): string {\n    const id = `goal_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n    const newGoal: TipGoal = {\n      ...goal,\n      id,\n      currentAmount: 0,\n      createdAt: new Date(),\n    };\n\n    this.goals.set(id, newGoal);\n    return id;\n  }\n\n  processTip(\n    userId: string,\n    amount: number,\n    currency: string,\n    goalId?: string,\n    message?: string\n  ): {\n    success: boolean;\n    actions: AgentAction[];\n    milestones: TipMilestone[];\n    goalCompleted?: TipGoal;\n  } {\n    const transactionId = `tx_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n    const transaction: TipTransaction = {\n      id: transactionId,\n      userId,\n      amount,\n      currency,\n      goalId,\n      message,\n      timestamp: new Date(),\n      status: 'confirmed', // In real implementation, this would be 'pending' initially\n    };\n\n    this.transactions.set(transactionId, transaction);\n\n    // Update total earnings\n    if (currency in this.totalEarned) {\n      this.totalEarned[currency as keyof typeof this.totalEarned] += amount;\n    }\n\n    // Update tipper stats\n    this.updateTipperStats(userId, amount, currency);\n\n    const actions: AgentAction[] = [];\n    const achievedMilestones: TipMilestone[] = [];\n    let goalCompleted: TipGoal | undefined;\n\n    // Process goal update if specified\n    if (goalId && this.goals.has(goalId)) {\n      const goal = this.goals.get(goalId)!;\n      goal.currentAmount += amount;\n\n      if (goal.currentAmount >= goal.targetAmount && goal.isActive) {\n        goal.isActive = false;\n        goal.completedAt = new Date();\n        goalCompleted = goal;\n\n        // Add goal completion actions\n        actions.push(this.createRewardAction(goal.reward));\n\n        if (goal.reward.message) {\n          actions.push({\n            type: 'audio',\n            action: 'play',\n            value: 'goal-completion-sound',\n            volume: 0.8,\n          });\n        }\n      }\n    }\n\n    // Check for milestone achievements\n    const userStats = this.tipperStats.get(userId);\n    if (userStats) {\n      this.milestones.forEach((milestone) => {\n        if (\n          !milestone.achieved &&\n          userStats.totalTipped >= milestone.amount &&\n          userStats.favoriteCurrency === milestone.currency\n        ) {\n          milestone.achieved = true;\n          milestone.achievedAt = new Date();\n          achievedMilestones.push(milestone);\n\n          actions.push(this.createRewardAction(milestone.reward));\n        }\n      });\n    }\n\n    // Add basic tip response\n    actions.push({\n      type: 'vrm',\n      action: 'expression',\n      value: 'smile-big',\n      duration: 3000,\n      intensity: 0.9,\n    });\n\n    actions.push({\n      type: 'vrm',\n      action: 'gesture',\n      value: 'heart-hands',\n      duration: 2000,\n    });\n\n    // Add tier-based special animations\n    if (amount >= 5) {\n      actions.push({\n        type: 'canvas',\n        action: 'effect',\n        value: 'hearts',\n        duration: 5000,\n      });\n    }\n\n    if (amount >= 10) {\n      actions.push({\n        type: 'vrm',\n        action: 'animation',\n        value: 'dance-celebration',\n        duration: 8000,\n      });\n    }\n\n    return {\n      success: true,\n      actions,\n      milestones: achievedMilestones,\n      goalCompleted,\n    };\n  }\n\n  private createRewardAction(reward: TipReward): AgentAction {\n    switch (reward.type) {\n      case 'animation':\n        return {\n          type: 'vrm',\n          action: 'animation',\n          value: reward.value,\n          duration: reward.duration || 5000,\n        };\n\n      case 'content':\n        return {\n          type: 'canvas',\n          action: 'draw',\n          value: reward.value,\n          position: { x: 0.7, y: 0.3 },\n          size: { width: 400, height: 400 },\n        };\n\n      case 'special':\n        return {\n          type: 'audio',\n          action: 'play',\n          value: 'special-unlock-sound',\n          volume: 0.7,\n        };\n\n      case 'unlock':\n        return {\n          type: 'canvas',\n          action: 'overlay',\n          value: 'unlock-notification',\n          duration: 5000,\n        };\n\n      default:\n        return {\n          type: 'vrm',\n          action: 'animation',\n          value: 'celebration',\n          duration: 3000,\n        };\n    }\n  }\n\n  private updateTipperStats(userId: string, amount: number, currency: string): void {\n    let stats = this.tipperStats.get(userId);\n\n    if (!stats) {\n      stats = {\n        userId,\n        totalTipped: 0,\n        favoriteCurrency: currency,\n        tipCount: 0,\n        largestTip: 0,\n        firstTipDate: new Date(),\n        lastTipDate: new Date(),\n        tier: 'bronze',\n      };\n      this.tipperStats.set(userId, stats);\n    }\n\n    stats.totalTipped += amount;\n    stats.tipCount++;\n    stats.lastTipDate = new Date();\n\n    if (amount > stats.largestTip) {\n      stats.largestTip = amount;\n    }\n\n    // Update tier based on total tipped\n    if (stats.totalTipped >= 100) {\n      stats.tier = 'diamond';\n    } else if (stats.totalTipped >= 50) {\n      stats.tier = 'platinum';\n    } else if (stats.totalTipped >= 25) {\n      stats.tier = 'gold';\n    } else if (stats.totalTipped >= 10) {\n      stats.tier = 'silver';\n    }\n  }\n\n  getActiveGoals(): TipGoal[] {\n    return Array.from(this.goals.values()).filter((goal) => goal.isActive);\n  }\n\n  getCompletedGoals(): TipGoal[] {\n    return Array.from(this.goals.values()).filter((goal) => !goal.isActive && goal.completedAt);\n  }\n\n  getGoalProgress(goalId: string): { current: number; target: number; percentage: number } | null {\n    const goal = this.goals.get(goalId);\n    if (!goal) return null;\n\n    return {\n      current: goal.currentAmount,\n      target: goal.targetAmount,\n      percentage: Math.min(100, (goal.currentAmount / goal.targetAmount) * 100),\n    };\n  }\n\n  getTipperStats(userId: string): TipperStats | null {\n    return this.tipperStats.get(userId) || null;\n  }\n\n  getTopTippers(limit: number = 10): TipperStats[] {\n    return Array.from(this.tipperStats.values())\n      .sort((a, b) => b.totalTipped - a.totalTipped)\n      .slice(0, limit);\n  }\n\n  getTotalEarnings(): Record<string, number> {\n    return { ...this.totalEarned };\n  }\n\n  getRecentTransactions(limit: number = 20): TipTransaction[] {\n    return Array.from(this.transactions.values())\n      .sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime())\n      .slice(0, limit);\n  }\n\n  getMilestoneProgress(): Array<TipMilestone & { progress: number }> {\n    const totalSol = this.totalEarned.SOL;\n    return this.milestones.map((milestone) => ({\n      ...milestone,\n      progress: Math.min(100, (totalSol / milestone.amount) * 100),\n    }));\n  }\n\n  generateTipRequestMessage(goalId?: string): string {\n    if (goalId && this.goals.has(goalId)) {\n      const goal = this.goals.get(goalId)!;\n      const remaining = goal.targetAmount - goal.currentAmount;\n      return `Help me reach my goal: \"${goal.title}\"! Only ${remaining} ${goal.currency} more to unlock ${goal.reward.value}! 💖`;\n    }\n\n    const activeGoals = this.getActiveGoals();\n    if (activeGoals.length > 0) {\n      const goal = activeGoals[0];\n      return `I'm working towards: ${goal.title}! Any support helps me learn new things! ✨`;\n    }\n\n    return 'Tips help me learn new animations and create better content for you! Every bit of support means the world to me! 💕';\n  }\n\n  updateGoal(goalId: string, updates: Partial<TipGoal>): boolean {\n    const goal = this.goals.get(goalId);\n    if (!goal) return false;\n\n    Object.assign(goal, updates);\n    return true;\n  }\n\n  deleteGoal(goalId: string): boolean {\n    return this.goals.delete(goalId);\n  }\n\n  getUserTipHistory(userId: string): TipTransaction[] {\n    return Array.from(this.transactions.values())\n      .filter((tx) => tx.userId === userId)\n      .sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());\n  }\n}\n","/**\n * Audio Control Service for AI Agents\n * Handles TTS, background music, sound effects, and audio management\n */\n\nimport { AgentAction } from '../core/types';\n\nexport interface AudioTrack {\n  id: string;\n  name: string;\n  url: string;\n  type: 'tts' | 'music' | 'sfx' | 'ambient';\n  duration: number;\n  volume: number;\n  loop: boolean;\n  category: string;\n  emotionalTone?: string;\n  situation?: string[];\n}\n\nexport interface AudioPlaybackState {\n  trackId: string;\n  isPlaying: boolean;\n  currentTime: number;\n  volume: number;\n  loop: boolean;\n  fadeInDuration?: number;\n  fadeOutDuration?: number;\n}\n\nexport interface TTSRequest {\n  text: string;\n  voice: string;\n  speed: number;\n  pitch: number;\n  emotion?: string;\n  style?: string;\n  language?: string;\n}\n\nexport interface SoundEffect {\n  id: string;\n  name: string;\n  type: 'celebration' | 'notification' | 'interaction' | 'ambient' | 'transition';\n  url: string;\n  volume: number;\n  duration: number;\n  triggers: string[];\n}\n\nexport interface VoiceProfile {\n  id: string;\n  name: string;\n  description: string;\n  provider: 'openai' | 'alkahest' | 'elevenlabs' | 'azure';\n  voiceId: string;\n  language: string;\n  gender: 'male' | 'female' | 'neutral';\n  age: 'child' | 'young' | 'adult' | 'senior';\n  characteristics: string[];\n  emotionalRange: string[];\n  sampleUrl?: string;\n}\n\nexport interface AudioScene {\n  id: string;\n  name: string;\n  description: string;\n  backgroundMusic?: string;\n  ambientSounds: string[];\n  volume: {\n    master: number;\n    music: number;\n    sfx: number;\n    ambient: number;\n    tts: number;\n  };\n  mood: string;\n  duration?: number;\n}\n\nexport class AudioControlService {\n  private currentTracks: Map<string, AudioPlaybackState> = new Map();\n  private soundEffects: Map<string, SoundEffect> = new Map();\n  private voiceProfiles: Map<string, VoiceProfile> = new Map();\n  private audioScenes: Map<string, AudioScene> = new Map();\n  private currentScene?: AudioScene;\n  private masterVolume = 1.0;\n  private ttsQueue: TTSRequest[] = [];\n  private isProcessingTTS = false;\n\n  constructor() {\n    this.initializeDefaultSounds();\n    this.initializeVoiceProfiles();\n    this.initializeAudioScenes();\n  }\n\n  private initializeDefaultSounds(): void {\n    const defaultSounds: SoundEffect[] = [\n      {\n        id: 'tip-notification',\n        name: 'Tip Received',\n        type: 'notification',\n        url: '/audio/sfx/tip-chime.mp3',\n        volume: 0.8,\n        duration: 2000,\n        triggers: ['tip', 'donation', 'support'],\n      },\n      {\n        id: 'goal-completion',\n        name: 'Goal Completed',\n        type: 'celebration',\n        url: '/audio/sfx/goal-fanfare.mp3',\n        volume: 0.9,\n        duration: 5000,\n        triggers: ['goal', 'milestone', 'achievement'],\n      },\n      {\n        id: 'heart-sound',\n        name: 'Heart Effect',\n        type: 'interaction',\n        url: '/audio/sfx/heart-pop.mp3',\n        volume: 0.6,\n        duration: 1000,\n        triggers: ['love', 'heart', 'cute'],\n      },\n      {\n        id: 'sparkle-magic',\n        name: 'Magic Sparkles',\n        type: 'ambient',\n        url: '/audio/sfx/sparkle-magic.mp3',\n        volume: 0.4,\n        duration: 3000,\n        triggers: ['magic', 'sparkle', 'special'],\n      },\n      {\n        id: 'dance-beat',\n        name: 'Dance Beat',\n        type: 'ambient',\n        url: '/audio/sfx/dance-beat.mp3',\n        volume: 0.7,\n        duration: 8000,\n        triggers: ['dance', 'movement', 'energy'],\n      },\n      {\n        id: 'soft-chime',\n        name: 'Gentle Chime',\n        type: 'transition',\n        url: '/audio/sfx/soft-chime.mp3',\n        volume: 0.5,\n        duration: 2000,\n        triggers: ['gentle', 'calm', 'peaceful'],\n      },\n    ];\n\n    defaultSounds.forEach((sound) => {\n      this.soundEffects.set(sound.id, sound);\n    });\n  }\n\n  private initializeVoiceProfiles(): void {\n    const voices: VoiceProfile[] = [\n      {\n        id: 'anna-sweet',\n        name: 'Anna (Sweet)',\n        description: 'Warm, friendly female voice with a sweet tone',\n        provider: 'openai',\n        voiceId: 'alloy',\n        language: 'en-US',\n        gender: 'female',\n        age: 'young',\n        characteristics: ['warm', 'friendly', 'sweet', 'energetic'],\n        emotionalRange: ['happy', 'excited', 'caring', 'playful'],\n      },\n      {\n        id: 'luna-calm',\n        name: 'Luna (Calm)',\n        description: 'Soothing female voice perfect for relaxing moments',\n        provider: 'openai',\n        voiceId: 'nova',\n        language: 'en-US',\n        gender: 'female',\n        age: 'adult',\n        characteristics: ['calm', 'soothing', 'mature', 'gentle'],\n        emotionalRange: ['peaceful', 'content', 'reassuring', 'wise'],\n      },\n      {\n        id: 'kira-energetic',\n        name: 'Kira (Energetic)',\n        description: 'High-energy female voice for exciting interactions',\n        provider: 'alkahest',\n        voiceId: 'kira-v1',\n        language: 'en-US',\n        gender: 'female',\n        age: 'young',\n        characteristics: ['energetic', 'bubbly', 'enthusiastic', 'fun'],\n        emotionalRange: ['excited', 'joyful', 'surprised', 'dynamic'],\n      },\n    ];\n\n    voices.forEach((voice) => {\n      this.voiceProfiles.set(voice.id, voice);\n    });\n  }\n\n  private initializeAudioScenes(): void {\n    const scenes: AudioScene[] = [\n      {\n        id: 'chill-lounge',\n        name: 'Chill Lounge',\n        description: 'Relaxed atmosphere with soft ambient sounds',\n        backgroundMusic: '/audio/music/chill-lounge.mp3',\n        ambientSounds: ['/audio/ambient/soft-pad.mp3'],\n        volume: {\n          master: 1.0,\n          music: 0.3,\n          sfx: 0.8,\n          ambient: 0.2,\n          tts: 1.0,\n        },\n        mood: 'relaxed',\n      },\n      {\n        id: 'party-time',\n        name: 'Party Time',\n        description: 'High-energy party atmosphere',\n        backgroundMusic: '/audio/music/party-beats.mp3',\n        ambientSounds: ['/audio/ambient/party-crowd.mp3'],\n        volume: {\n          master: 1.0,\n          music: 0.6,\n          sfx: 1.0,\n          ambient: 0.4,\n          tts: 1.0,\n        },\n        mood: 'energetic',\n      },\n      {\n        id: 'cozy-chat',\n        name: 'Cozy Chat',\n        description: 'Intimate setting for personal conversations',\n        ambientSounds: ['/audio/ambient/fireplace.mp3', '/audio/ambient/rain-soft.mp3'],\n        volume: {\n          master: 1.0,\n          music: 0.1,\n          sfx: 0.6,\n          ambient: 0.3,\n          tts: 1.0,\n        },\n        mood: 'intimate',\n      },\n    ];\n\n    scenes.forEach((scene) => {\n      this.audioScenes.set(scene.id, scene);\n    });\n  }\n\n  async processAudioAction(action: AgentAction): Promise<{ success: boolean; data?: any }> {\n    try {\n      switch (action.action) {\n        case 'play':\n          return this.playAudio(String(action.value), {\n            volume: action.volume || 1.0,\n            fadeIn: action.fadeIn,\n            fadeOut: action.fadeOut,\n          });\n\n        case 'stop':\n          return this.stopAudio(String(action.value));\n\n        case 'volume':\n          return this.setVolume(String(action.value), action.volume || 1.0);\n\n        case 'effect':\n          return this.playEffect(String(action.value));\n\n        default:\n          return { success: false, data: { error: `Unknown audio action: ${action.action}` } };\n      }\n    } catch (error) {\n      return {\n        success: false,\n        data: { error: error instanceof Error ? error.message : 'Audio processing failed' },\n      };\n    }\n  }\n\n  async generateTTS(\n    request: TTSRequest\n  ): Promise<{ success: boolean; audioUrl?: string; duration?: number }> {\n    try {\n      // Add to queue for processing\n      this.ttsQueue.push(request);\n\n      if (!this.isProcessingTTS) {\n        this.processTTSQueue();\n      }\n\n      // In a real implementation, this would interface with TTS providers\n      const mockAudioUrl = `/audio/tts/generated_${Date.now()}.mp3`;\n      const estimatedDuration = request.text.length * 100; // Rough estimate\n\n      return {\n        success: true,\n        audioUrl: mockAudioUrl,\n        duration: estimatedDuration,\n      };\n    } catch (_error) {\n      return { success: false };\n    }\n  }\n\n  private async processTTSQueue(): Promise<void> {\n    this.isProcessingTTS = true;\n\n    while (this.ttsQueue.length > 0) {\n      const request = this.ttsQueue.shift()!;\n\n      // Process TTS request with the actual request data\n      // In real implementation, this would call the actual TTS provider\n      console.log('Processing TTS:', request.text);\n      await new Promise((resolve) => setTimeout(resolve, 100));\n    }\n\n    this.isProcessingTTS = false;\n  }\n\n  playAudio(\n    trackId: string,\n    options: {\n      volume?: number;\n      loop?: boolean;\n      fadeIn?: number;\n      fadeOut?: number;\n    } = {}\n  ): { success: boolean; data?: any } {\n    try {\n      const playbackState: AudioPlaybackState = {\n        trackId,\n        isPlaying: true,\n        currentTime: 0,\n        volume: options.volume || 1.0,\n        loop: options.loop || false,\n        fadeInDuration: options.fadeIn,\n        fadeOutDuration: options.fadeOut,\n      };\n\n      this.currentTracks.set(trackId, playbackState);\n\n      return { success: true, data: { playbackState } };\n    } catch (_error) {\n      return { success: false, data: { error: 'Failed to play audio' } };\n    }\n  }\n\n  stopAudio(trackId: string): { success: boolean; data?: any } {\n    const playbackState = this.currentTracks.get(trackId);\n    if (!playbackState) {\n      return { success: false, data: { error: 'Track not found' } };\n    }\n\n    playbackState.isPlaying = false;\n    this.currentTracks.delete(trackId);\n\n    return { success: true, data: { stopped: trackId } };\n  }\n\n  playEffect(effectId: string): { success: boolean; data?: any } {\n    const effect = this.soundEffects.get(effectId);\n    if (!effect) {\n      return { success: false, data: { error: `Sound effect not found: ${effectId}` } };\n    }\n\n    return this.playAudio(effectId, {\n      volume: effect.volume,\n      loop: false,\n    });\n  }\n\n  setVolume(trackId: string, volume: number): { success: boolean; data?: any } {\n    const playbackState = this.currentTracks.get(trackId);\n    if (!playbackState) {\n      return { success: false, data: { error: 'Track not found' } };\n    }\n\n    playbackState.volume = Math.max(0, Math.min(1, volume));\n    return { success: true, data: { volume: playbackState.volume } };\n  }\n\n  setMasterVolume(volume: number): void {\n    this.masterVolume = Math.max(0, Math.min(1, volume));\n  }\n\n  getMasterVolume(): number {\n    return this.masterVolume;\n  }\n\n  setAudioScene(sceneId: string): { success: boolean; data?: any } {\n    const scene = this.audioScenes.get(sceneId);\n    if (!scene) {\n      return { success: false, data: { error: `Audio scene not found: ${sceneId}` } };\n    }\n\n    // Stop current scene\n    if (this.currentScene) {\n      this.stopScene(this.currentScene.id);\n    }\n\n    this.currentScene = scene;\n\n    // Start background music if specified\n    if (scene.backgroundMusic) {\n      this.playAudio(scene.backgroundMusic, {\n        volume: scene.volume.music,\n        loop: true,\n      });\n    }\n\n    // Start ambient sounds\n    scene.ambientSounds.forEach((ambientUrl, index) => {\n      this.playAudio(`ambient_${index}`, {\n        volume: scene.volume.ambient,\n        loop: true,\n      });\n      console.log('Started ambient sound:', ambientUrl);\n    });\n\n    return { success: true, data: { scene: scene.name } };\n  }\n\n  private stopScene(sceneId: string): void {\n    console.log('Stopping scene:', sceneId);\n    // Stop all current tracks\n    this.currentTracks.forEach((_, trackId) => {\n      this.stopAudio(trackId);\n    });\n  }\n\n  getCurrentPlayingTracks(): AudioPlaybackState[] {\n    return Array.from(this.currentTracks.values()).filter((state) => state.isPlaying);\n  }\n\n  getAvailableVoices(): VoiceProfile[] {\n    return Array.from(this.voiceProfiles.values());\n  }\n\n  getVoiceByEmotion(emotion: string): VoiceProfile | null {\n    for (const voice of this.voiceProfiles.values()) {\n      if (voice.emotionalRange.includes(emotion)) {\n        return voice;\n      }\n    }\n    return null;\n  }\n\n  getSoundEffectsByTrigger(trigger: string): SoundEffect[] {\n    return Array.from(this.soundEffects.values()).filter((effect) =>\n      effect.triggers.includes(trigger)\n    );\n  }\n\n  getAudioScenes(): AudioScene[] {\n    return Array.from(this.audioScenes.values());\n  }\n\n  getCurrentScene(): AudioScene | null {\n    return this.currentScene || null;\n  }\n\n  createDynamicAudioResponse(\n    emotion: string,\n    context: string,\n    intensity: number = 0.5\n  ): AgentAction[] {\n    const actions: AgentAction[] = [];\n\n    // Select appropriate voice based on emotion\n    const voice = this.getVoiceByEmotion(emotion);\n    if (voice) {\n      // This would be used for TTS generation\n    }\n\n    // Add sound effects based on context and emotion\n    const contextEffects = this.getSoundEffectsByTrigger(context);\n    if (contextEffects.length > 0) {\n      const selectedEffect = contextEffects[0];\n      actions.push({\n        type: 'audio',\n        action: 'effect',\n        value: selectedEffect.id,\n        volume: selectedEffect.volume * intensity,\n      });\n    }\n\n    // Add ambient audio based on emotion\n    if (emotion === 'excited' && intensity > 0.7) {\n      actions.push({\n        type: 'audio',\n        action: 'play',\n        value: 'dance-beat',\n        volume: 0.3 * intensity,\n        fadeIn: 1000,\n      });\n    } else if (emotion === 'calm' || emotion === 'peaceful') {\n      actions.push({\n        type: 'audio',\n        action: 'play',\n        value: 'soft-chime',\n        volume: 0.2 * intensity,\n      });\n    }\n\n    return actions;\n  }\n\n  analyzeAudioMood(currentTracks: string[]): string {\n    // Analyze currently playing tracks to determine overall mood\n    let energyLevel = 0;\n\n    currentTracks.forEach((trackId) => {\n      const effect = this.soundEffects.get(trackId);\n      if (effect) {\n        switch (effect.type) {\n          case 'celebration':\n            energyLevel += 0.3;\n            break;\n          case 'ambient':\n            energyLevel += 0.1;\n            break;\n          case 'interaction':\n            energyLevel += 0.2;\n            break;\n        }\n      }\n    });\n\n    if (energyLevel > 0.5) {\n      return 'energetic';\n    } else if (energyLevel > 0.2) {\n      return 'moderate';\n    } else {\n      return 'calm';\n    }\n  }\n\n  queueTTS(text: string, voice?: string, emotion?: string): string {\n    const request: TTSRequest = {\n      text,\n      voice: voice || 'anna-sweet',\n      speed: 1.0,\n      pitch: 1.0,\n      emotion,\n    };\n\n    this.ttsQueue.push(request);\n\n    if (!this.isProcessingTTS) {\n      this.processTTSQueue();\n    }\n\n    return `tts_${Date.now()}`;\n  }\n\n  stopAllAudio(): void {\n    this.currentTracks.clear();\n  }\n\n  crossfade(fromTrackId: string, toTrackId: string, duration: number = 2000): void {\n    // Implement crossfade between tracks\n    const fromTrack = this.currentTracks.get(fromTrackId);\n    if (fromTrack) {\n      fromTrack.fadeOutDuration = duration;\n    }\n\n    this.playAudio(toTrackId, { fadeIn: duration });\n  }\n}\n","/**\n * VRM Integration Service\n * Provides AI agents with direct control over VRM models, animations, and expressions\n */\n\nimport { VRMControlAction, CameraControlAction } from '../core/agent-controller';\n\nexport interface VRMAnimation {\n  id: string;\n  name: string;\n  file: string;\n  duration: number;\n  category: 'idle' | 'gesture' | 'dance' | 'expression' | 'special';\n  emotionalTone: 'neutral' | 'happy' | 'sad' | 'excited' | 'angry' | 'surprised';\n  requiredTier: 'free' | 'premium' | 'vip';\n}\n\nexport interface VRMExpression {\n  id: string;\n  name: string;\n  morphTargets: Record<string, number>;\n  duration: number;\n  blendable: boolean;\n}\n\nexport interface CameraPreset {\n  id: string;\n  name: string;\n  position: { x: number; y: number; z: number };\n  rotation: { x: number; y: number; z: number };\n  fov: number;\n  description: string;\n}\n\nexport class VRMIntegrationService {\n  private availableAnimations: VRMAnimation[] = [\n    {\n      id: 'idle-basic',\n      name: 'Basic Idle',\n      file: 'idle-000.fbx',\n      duration: 0,\n      category: 'idle',\n      emotionalTone: 'neutral',\n      requiredTier: 'free',\n    },\n    {\n      id: 'wave-hello',\n      name: 'Wave Hello',\n      file: 'wave-hello.fbx',\n      duration: 2000,\n      category: 'gesture',\n      emotionalTone: 'happy',\n      requiredTier: 'free',\n    },\n    {\n      id: 'dance-basic',\n      name: 'Basic Dance',\n      file: 'dance.fbx',\n      duration: 8000,\n      category: 'dance',\n      emotionalTone: 'excited',\n      requiredTier: 'free',\n    },\n    {\n      id: 'dance-hip-hop',\n      name: 'Hip Hop Dance',\n      file: 'dance-booty-hip-hop.fbx',\n      duration: 10000,\n      category: 'dance',\n      emotionalTone: 'excited',\n      requiredTier: 'premium',\n    },\n    {\n      id: 'kiss',\n      name: 'Blow Kiss',\n      file: 'kiss.fbx',\n      duration: 3000,\n      category: 'gesture',\n      emotionalTone: 'happy',\n      requiredTier: 'vip',\n    },\n    {\n      id: 'sleep',\n      name: 'Sleep',\n      file: 'sleep-000.fbx',\n      duration: 0,\n      category: 'special',\n      emotionalTone: 'neutral',\n      requiredTier: 'free',\n    },\n  ];\n\n  private expressions: VRMExpression[] = [\n    {\n      id: 'smile',\n      name: 'Smile',\n      morphTargets: { mouth_smile: 1.0, eye_happy: 0.8 },\n      duration: 3000,\n      blendable: true,\n    },\n    {\n      id: 'wink',\n      name: 'Wink',\n      morphTargets: { eye_wink_left: 1.0 },\n      duration: 1000,\n      blendable: true,\n    },\n    {\n      id: 'surprise',\n      name: 'Surprised',\n      morphTargets: { mouth_open: 0.8, eye_wide: 1.0 },\n      duration: 2000,\n      blendable: true,\n    },\n    {\n      id: 'blush',\n      name: 'Blush',\n      morphTargets: { blush: 1.0, eye_shy: 0.6 },\n      duration: 4000,\n      blendable: true,\n    },\n  ];\n\n  private cameraPresets: CameraPreset[] = [\n    {\n      id: 'default',\n      name: 'Default View',\n      position: { x: 0, y: 0, z: 5 },\n      rotation: { x: 0, y: 0, z: 0 },\n      fov: 45,\n      description: 'Standard full-body view',\n    },\n    {\n      id: 'face-closeup',\n      name: 'Face Closeup',\n      position: { x: 0, y: 1.6, z: 2 },\n      rotation: { x: 0, y: 0, z: 0 },\n      fov: 35,\n      description: 'Close view of face for expressions',\n    },\n    {\n      id: 'upper-body',\n      name: 'Upper Body',\n      position: { x: 0, y: 0.8, z: 3 },\n      rotation: { x: -5, y: 0, z: 0 },\n      fov: 40,\n      description: 'Focus on upper body and gestures',\n    },\n    {\n      id: 'side-profile',\n      name: 'Side Profile',\n      position: { x: 3, y: 1, z: 2 },\n      rotation: { x: 0, y: 45, z: 0 },\n      fov: 40,\n      description: 'Side view profile shot',\n    },\n    {\n      id: 'dynamic-angle',\n      name: 'Dynamic Angle',\n      position: { x: 2, y: 2, z: 4 },\n      rotation: { x: -15, y: 20, z: 0 },\n      fov: 50,\n      description: 'Cinematic angled view',\n    },\n  ];\n\n  getAvailableAnimations(tier: 'free' | 'premium' | 'vip' = 'free'): VRMAnimation[] {\n    const tierHierarchy = { free: 0, premium: 1, vip: 2 };\n    const userLevel = tierHierarchy[tier];\n\n    return this.availableAnimations.filter((anim) => tierHierarchy[anim.requiredTier] <= userLevel);\n  }\n\n  getAnimationsByEmotion(\n    emotion: string,\n    tier: 'free' | 'premium' | 'vip' = 'free'\n  ): VRMAnimation[] {\n    return this.getAvailableAnimations(tier).filter((anim) => anim.emotionalTone === emotion);\n  }\n\n  getAnimationsByCategory(\n    category: string,\n    tier: 'free' | 'premium' | 'vip' = 'free'\n  ): VRMAnimation[] {\n    return this.getAvailableAnimations(tier).filter((anim) => anim.category === category);\n  }\n\n  getRandomAnimation(\n    emotion?: string,\n    category?: string,\n    tier: 'free' | 'premium' | 'vip' = 'free'\n  ): VRMAnimation | null {\n    let animations = this.getAvailableAnimations(tier);\n\n    if (emotion) {\n      animations = animations.filter((anim) => anim.emotionalTone === emotion);\n    }\n\n    if (category) {\n      animations = animations.filter((anim) => anim.category === category);\n    }\n\n    if (animations.length === 0) return null;\n\n    return animations[Math.floor(Math.random() * animations.length)];\n  }\n\n  getExpression(id: string): VRMExpression | null {\n    return this.expressions.find((expr) => expr.id === id) || null;\n  }\n\n  getExpressionByEmotion(emotion: string): VRMExpression | null {\n    const emotionToExpression: Record<string, string> = {\n      happy: 'smile',\n      excited: 'smile',\n      surprised: 'surprise',\n      shy: 'blush',\n      playful: 'wink',\n    };\n\n    const expressionId = emotionToExpression[emotion];\n    return expressionId ? this.getExpression(expressionId) : null;\n  }\n\n  getCameraPreset(id: string): CameraPreset | null {\n    return this.cameraPresets.find((preset) => preset.id === id) || null;\n  }\n\n  getAllCameraPresets(): CameraPreset[] {\n    return [...this.cameraPresets];\n  }\n\n  /**\n   * Process a VRM control action and return the necessary data for execution\n   */\n  processVRMAction(\n    action: VRMControlAction,\n    userTier: 'free' | 'premium' | 'vip' = 'free'\n  ): {\n    success: boolean;\n    data?: any;\n    error?: string;\n  } {\n    try {\n      switch (action.action) {\n        case 'animation': {\n          const animation = this.availableAnimations.find((anim) => anim.id === action.value);\n          if (!animation) {\n            return { success: false, error: `Animation ${action.value} not found` };\n          }\n\n          const tierHierarchy = { free: 0, premium: 1, vip: 2 };\n          if (tierHierarchy[animation.requiredTier] > tierHierarchy[userTier]) {\n            return {\n              success: false,\n              error: `Animation requires ${animation.requiredTier} tier`,\n            };\n          }\n\n          return {\n            success: true,\n            data: {\n              animationFile: `/models/fbx/animations/${animation.file}`,\n              duration: action.duration || animation.duration,\n              blendMode: action.blendMode || 'replace',\n            },\n          };\n        }\n\n        case 'expression': {\n          const expression = this.getExpression(action.value);\n          if (!expression) {\n            return { success: false, error: `Expression ${action.value} not found` };\n          }\n\n          return {\n            success: true,\n            data: {\n              morphTargets: expression.morphTargets,\n              duration: action.duration || expression.duration,\n              intensity: action.intensity || 1.0,\n              blendable: expression.blendable,\n            },\n          };\n        }\n\n        case 'pose': {\n          // Handle pose actions (static positions)\n          return {\n            success: true,\n            data: {\n              poseFile: `/models/fbx/poses/${action.value}.fbx`,\n              duration: action.duration || 0,\n            },\n          };\n        }\n\n        case 'gesture': {\n          // Handle gesture animations\n          const gestureAnimation = this.getAvailableAnimations(userTier).find(\n            (anim) => anim.category === 'gesture' && anim.id === action.value\n          );\n\n          if (!gestureAnimation) {\n            return { success: false, error: `Gesture ${action.value} not found` };\n          }\n\n          return {\n            success: true,\n            data: {\n              animationFile: `/models/fbx/animations/${gestureAnimation.file}`,\n              duration: action.duration || gestureAnimation.duration,\n              blendMode: 'additive',\n            },\n          };\n        }\n\n        default:\n          return { success: false, error: `Unknown VRM action: ${action.action}` };\n      }\n    } catch (error: any) {\n      return { success: false, error: error.message };\n    }\n  }\n\n  /**\n   * Process a camera control action\n   */\n  processCameraAction(action: CameraControlAction): {\n    success: boolean;\n    data?: any;\n    error?: string;\n  } {\n    try {\n      switch (action.action) {\n        case 'preset': {\n          const preset = this.getCameraPreset(action.value as string);\n          if (!preset) {\n            return { success: false, error: `Camera preset ${action.value} not found` };\n          }\n\n          return {\n            success: true,\n            data: {\n              position: preset.position,\n              rotation: preset.rotation,\n              fov: preset.fov,\n              duration: action.duration || 2000,\n              easing: action.easing || 'ease-in-out',\n            },\n          };\n        }\n\n        case 'position': {\n          return {\n            success: true,\n            data: {\n              position: action.value,\n              duration: action.duration || 2000,\n              easing: action.easing || 'ease-in-out',\n            },\n          };\n        }\n\n        case 'zoom': {\n          return {\n            success: true,\n            data: {\n              zoom: action.value,\n              duration: action.duration || 1500,\n              easing: action.easing || 'ease-in-out',\n            },\n          };\n        }\n\n        case 'focus': {\n          return {\n            success: true,\n            data: {\n              target: action.value,\n              duration: action.duration || 1000,\n            },\n          };\n        }\n\n        default:\n          return { success: false, error: `Unknown camera action: ${action.action}` };\n      }\n    } catch (error: any) {\n      return { success: false, error: error.message };\n    }\n  }\n\n  /**\n   * Get AI-suggested actions based on conversation context\n   */\n  suggestActionsForContext(\n    message: string,\n    emotion: string,\n    userTier: 'free' | 'premium' | 'vip' = 'free'\n  ): Array<VRMControlAction | CameraControlAction> {\n    const actions: Array<VRMControlAction | CameraControlAction> = [];\n    const lowerMessage = message.toLowerCase();\n\n    // Suggest VRM animations based on keywords\n    if (lowerMessage.includes('dance')) {\n      const danceAnim = this.getRandomAnimation('excited', 'dance', userTier);\n      if (danceAnim) {\n        actions.push({\n          type: 'vrm',\n          action: 'animation',\n          value: danceAnim.id,\n          duration: danceAnim.duration,\n        });\n      }\n    }\n\n    if (lowerMessage.includes('hello') || lowerMessage.includes('hi')) {\n      actions.push({\n        type: 'vrm',\n        action: 'gesture',\n        value: 'wave-hello',\n        duration: 2000,\n      });\n    }\n\n    // Suggest expressions based on emotion\n    const expression = this.getExpressionByEmotion(emotion);\n    if (expression) {\n      actions.push({\n        type: 'vrm',\n        action: 'expression',\n        value: expression.id,\n        duration: expression.duration,\n      });\n    }\n\n    // Suggest camera movements based on context\n    if (lowerMessage.includes('closer') || lowerMessage.includes('face')) {\n      actions.push({\n        type: 'camera',\n        action: 'preset',\n        value: 'face-closeup',\n        duration: 2000,\n      });\n    }\n\n    if (lowerMessage.includes('full body') || lowerMessage.includes('step back')) {\n      actions.push({\n        type: 'camera',\n        action: 'preset',\n        value: 'default',\n        duration: 2000,\n      });\n    }\n\n    return actions;\n  }\n}\n","/**\n * Canvas Integration Service\n * Enables AI agents to generate and display images, effects, and overlays on the canvas\n */\n\nimport { CanvasAction } from '../core/agent-controller';\nimport { ImageGenerationOptions, ImageResponse } from '../core/types';\n\nexport interface CanvasElement {\n  id: string;\n  type: 'image' | 'text' | 'effect' | 'overlay';\n  content: string;\n  position: { x: number; y: number };\n  size: { width: number; height: number };\n  style: CanvasElementStyle;\n  duration?: number;\n  animation?: CanvasAnimation;\n  layer: number;\n  visible: boolean;\n  createdAt: Date;\n}\n\nexport interface CanvasElementStyle {\n  opacity: number;\n  rotation: number;\n  scale: number;\n  color?: string;\n  fontSize?: number;\n  fontFamily?: string;\n  filter?: string;\n  borderRadius?: number;\n  shadow?: {\n    x: number;\n    y: number;\n    blur: number;\n    color: string;\n  };\n}\n\nexport interface CanvasAnimation {\n  type: 'fade-in' | 'fade-out' | 'slide-in' | 'scale-in' | 'bounce' | 'pulse';\n  duration: number;\n  easing: 'linear' | 'ease-in' | 'ease-out' | 'ease-in-out';\n  delay?: number;\n  repeat?: boolean;\n}\n\nexport interface ImagePromptTemplate {\n  id: string;\n  name: string;\n  template: string;\n  category: 'cute' | 'anime' | 'realistic' | 'artistic' | 'abstract';\n  variables: string[];\n  style: string;\n}\n\nexport class CanvasIntegrationService {\n  private elements = new Map<string, CanvasElement>();\n  private nextElementId = 1;\n  private nextLayer = 1;\n\n  private promptTemplates: ImagePromptTemplate[] = [\n    {\n      id: 'cute-chibi',\n      name: 'Cute Chibi Style',\n      template:\n        'adorable chibi {subject}, kawaii style, pastel colors, big eyes, {emotion} expression',\n      category: 'cute',\n      variables: ['subject', 'emotion'],\n      style: 'chibi, kawaii, cute, pastel',\n    },\n    {\n      id: 'anime-portrait',\n      name: 'Anime Portrait',\n      template: 'beautiful anime {subject}, {emotion} expression, detailed eyes, {art_style}',\n      category: 'anime',\n      variables: ['subject', 'emotion', 'art_style'],\n      style: 'anime, detailed, high quality',\n    },\n    {\n      id: 'conversation-scene',\n      name: 'Conversation Scene',\n      template: 'illustration of {scene_description}, {mood} atmosphere, digital art',\n      category: 'artistic',\n      variables: ['scene_description', 'mood'],\n      style: 'digital art, illustration, detailed',\n    },\n    {\n      id: 'emotion-abstract',\n      name: 'Emotion Abstract',\n      template: 'abstract representation of {emotion}, flowing shapes, {color_scheme} colors',\n      category: 'abstract',\n      variables: ['emotion', 'color_scheme'],\n      style: 'abstract, artistic, emotional',\n    },\n  ];\n\n  /**\n   * Process a canvas action and return the necessary data for execution\n   */\n  async processCanvasAction(\n    action: CanvasAction,\n    imageProvider?: any,\n    context?: Record<string, any>\n  ): Promise<{\n    success: boolean;\n    data?: any;\n    error?: string;\n  }> {\n    try {\n      switch (action.action) {\n        case 'draw':\n          return await this.handleDrawAction(action, imageProvider, context);\n\n        case 'clear':\n          return this.handleClearAction(action);\n\n        case 'overlay':\n          return this.handleOverlayAction(action);\n\n        case 'background':\n          return this.handleBackgroundAction(action);\n\n        case 'effect':\n          return this.handleEffectAction(action);\n\n        default:\n          return { success: false, error: `Unknown canvas action: ${action.action}` };\n      }\n    } catch (error: any) {\n      return { success: false, error: error.message };\n    }\n  }\n\n  private async handleDrawAction(\n    action: CanvasAction,\n    imageProvider?: any,\n    context?: Record<string, any>\n  ): Promise<{ success: boolean; data?: any; error?: string }> {\n    if (!imageProvider) {\n      return { success: false, error: 'Image provider not available' };\n    }\n\n    try {\n      // Generate image prompt from the action value\n      const prompt = this.generateImagePrompt(action.value, context);\n\n      // Generate image using the AI provider\n      const imageOptions: ImageGenerationOptions = {\n        model: 'dall-e-3',\n        size: '1024x1024',\n        quality: 'standard',\n        style: 'vivid',\n        n: 1,\n      };\n\n      const imageResponse: ImageResponse = await imageProvider.generateImage(prompt, imageOptions);\n\n      if (!imageResponse.images || imageResponse.images.length === 0) {\n        return { success: false, error: 'Failed to generate image' };\n      }\n\n      // Create canvas element\n      const element = this.createElement({\n        type: 'image',\n        content: imageResponse.images[0].url || imageResponse.images[0].base64 || '',\n        position: action.position || { x: 0.5, y: 0.5 },\n        size: action.size || { width: 300, height: 300 },\n        style: {\n          opacity: 1,\n          rotation: 0,\n          scale: 1,\n          borderRadius: 8,\n        },\n        duration: action.duration,\n        animation: {\n          type: 'fade-in',\n          duration: 1000,\n          easing: 'ease-out',\n        },\n      });\n\n      return {\n        success: true,\n        data: {\n          element,\n          imageUrl: imageResponse.images[0].url,\n          prompt: prompt,\n          revisedPrompt: imageResponse.images[0].revisedPrompt,\n        },\n      };\n    } catch (error: any) {\n      return { success: false, error: `Image generation failed: ${error.message}` };\n    }\n  }\n\n  private handleClearAction(action: CanvasAction): { success: boolean; data?: any } {\n    if (action.value === 'all') {\n      this.elements.clear();\n    } else {\n      // Clear specific layer or element\n      const layer = parseInt(action.value);\n      if (!isNaN(layer)) {\n        for (const [id, element] of this.elements) {\n          if (element.layer === layer) {\n            this.elements.delete(id);\n          }\n        }\n      } else {\n        // Clear by ID\n        this.elements.delete(action.value);\n      }\n    }\n\n    return {\n      success: true,\n      data: { cleared: action.value },\n    };\n  }\n\n  private handleOverlayAction(action: CanvasAction): { success: boolean; data?: any } {\n    const element = this.createElement({\n      type: 'overlay',\n      content: action.value,\n      position: action.position || { x: 0, y: 0 },\n      size: action.size || { width: 1, height: 1 }, // Full screen\n      style: {\n        opacity: 0.8,\n        rotation: 0,\n        scale: 1,\n        color: 'rgba(0, 0, 0, 0.3)',\n      },\n      duration: action.duration,\n    });\n\n    return {\n      success: true,\n      data: { element },\n    };\n  }\n\n  private handleBackgroundAction(action: CanvasAction): { success: boolean; data?: any } {\n    const element = this.createElement({\n      type: 'image',\n      content: action.value, // URL or color\n      position: { x: 0, y: 0 },\n      size: { width: 1, height: 1 }, // Full screen\n      style: {\n        opacity: 1,\n        rotation: 0,\n        scale: 1,\n      },\n      layer: -1, // Background layer\n      duration: action.duration,\n    });\n\n    return {\n      success: true,\n      data: { element },\n    };\n  }\n\n  private handleEffectAction(action: CanvasAction): { success: boolean; data?: any } {\n    const effects = {\n      sparkles: this.createSparkleEffect(action),\n      hearts: this.createHeartsEffect(action),\n      confetti: this.createConfettiEffect(action),\n      glow: this.createGlowEffect(action),\n      rain: this.createRainEffect(action),\n    };\n\n    const effect = effects[action.value as keyof typeof effects];\n    if (!effect) {\n      return { success: false, data: { error: `Unknown effect: ${action.value}` } };\n    }\n\n    return {\n      success: true,\n      data: { effect },\n    };\n  }\n\n  private generateImagePrompt(userPrompt: string, context?: Record<string, any>): string {\n    // Try to match with a template\n    const template = this.findBestTemplate(userPrompt);\n\n    if (template && context) {\n      let prompt = template.template;\n\n      // Replace variables with context values\n      template.variables.forEach((variable) => {\n        const value = context[variable] || this.getDefaultValue(variable, context);\n        prompt = prompt.replace(`{${variable}}`, value);\n      });\n\n      // Add style guidelines\n      prompt += `, ${template.style}, high quality, detailed`;\n\n      return prompt;\n    }\n\n    // Fallback to user prompt with enhancements\n    const enhancedPrompt = this.enhancePrompt(userPrompt, context);\n    return `${enhancedPrompt}, digital art, high quality, detailed`;\n  }\n\n  private findBestTemplate(userPrompt: string): ImagePromptTemplate | null {\n    const lowerPrompt = userPrompt.toLowerCase();\n\n    for (const template of this.promptTemplates) {\n      const keywords = template.name.toLowerCase().split(' ');\n      if (keywords.some((keyword) => lowerPrompt.includes(keyword))) {\n        return template;\n      }\n    }\n\n    // Check by category keywords\n    if (lowerPrompt.includes('cute') || lowerPrompt.includes('kawaii')) {\n      return this.promptTemplates.find((t) => t.category === 'cute') || null;\n    }\n    if (lowerPrompt.includes('anime')) {\n      return this.promptTemplates.find((t) => t.category === 'anime') || null;\n    }\n    if (lowerPrompt.includes('abstract')) {\n      return this.promptTemplates.find((t) => t.category === 'abstract') || null;\n    }\n\n    return null;\n  }\n\n  private enhancePrompt(prompt: string, context?: Record<string, any>): string {\n    let enhanced = prompt;\n\n    // Add context-based enhancements\n    if (context?.emotion) {\n      enhanced += `, ${context.emotion} mood`;\n    }\n\n    if (context?.conversationTone) {\n      enhanced += `, ${context.conversationTone} atmosphere`;\n    }\n\n    // Add quality modifiers\n    enhanced += ', beautiful, aesthetic, trending on artstation';\n\n    return enhanced;\n  }\n\n  private getDefaultValue(variable: string, context?: Record<string, any>): string {\n    const defaults: Record<string, string> = {\n      subject: context?.agentName || 'character',\n      emotion: context?.emotion || 'happy',\n      art_style: 'detailed anime style',\n      scene_description: 'conversation between friends',\n      mood: context?.mood || 'cheerful',\n      color_scheme: 'warm',\n    };\n\n    return defaults[variable] || variable;\n  }\n\n  private createElement(params: {\n    type: 'image' | 'text' | 'effect' | 'overlay';\n    content: string;\n    position: { x: number; y: number };\n    size: { width: number; height: number };\n    style: Partial<CanvasElementStyle>;\n    duration?: number;\n    animation?: CanvasAnimation;\n    layer?: number;\n  }): CanvasElement {\n    const id = `element-${this.nextElementId++}`;\n\n    const element: CanvasElement = {\n      id,\n      type: params.type,\n      content: params.content,\n      position: params.position,\n      size: params.size,\n      style: {\n        opacity: 1,\n        rotation: 0,\n        scale: 1,\n        ...params.style,\n      },\n      duration: params.duration,\n      animation: params.animation,\n      layer: params.layer ?? this.nextLayer++,\n      visible: true,\n      createdAt: new Date(),\n    };\n\n    this.elements.set(id, element);\n\n    // Auto-remove after duration\n    if (params.duration) {\n      setTimeout(() => {\n        this.elements.delete(id);\n      }, params.duration);\n    }\n\n    return element;\n  }\n\n  // Effect creators\n  private createSparkleEffect(action: CanvasAction) {\n    return {\n      type: 'particle',\n      particles: 20,\n      position: action.position || { x: 0.5, y: 0.5 },\n      animation: 'sparkle',\n      duration: action.duration || 3000,\n    };\n  }\n\n  private createHeartsEffect(action: CanvasAction) {\n    return {\n      type: 'particle',\n      particles: 10,\n      position: action.position || { x: 0.5, y: 0.8 },\n      animation: 'float-up',\n      duration: action.duration || 4000,\n    };\n  }\n\n  private createConfettiEffect(action: CanvasAction) {\n    return {\n      type: 'particle',\n      particles: 50,\n      position: action.position || { x: 0.5, y: 0 },\n      animation: 'fall',\n      duration: action.duration || 5000,\n    };\n  }\n\n  private createGlowEffect(action: CanvasAction) {\n    return {\n      type: 'filter',\n      effect: 'glow',\n      intensity: 0.8,\n      color: '#ffffff',\n      duration: action.duration || 2000,\n    };\n  }\n\n  private createRainEffect(action: CanvasAction) {\n    return {\n      type: 'particle',\n      particles: 100,\n      position: { x: 0.5, y: 0 },\n      animation: 'rain',\n      duration: action.duration || 10000,\n    };\n  }\n\n  // Public methods\n  getAllElements(): CanvasElement[] {\n    return Array.from(this.elements.values());\n  }\n\n  getElement(id: string): CanvasElement | null {\n    return this.elements.get(id) || null;\n  }\n\n  removeElement(id: string): boolean {\n    return this.elements.delete(id);\n  }\n\n  updateElement(id: string, updates: Partial<CanvasElement>): boolean {\n    const element = this.elements.get(id);\n    if (!element) return false;\n\n    Object.assign(element, updates);\n    return true;\n  }\n\n  getPromptTemplates(): ImagePromptTemplate[] {\n    return [...this.promptTemplates];\n  }\n\n  addPromptTemplate(template: ImagePromptTemplate): void {\n    this.promptTemplates.push(template);\n  }\n}\n","/**\n * PartyKit adapter for AI Framework\n */\n\nimport { AIResponse, PersonalityProfile } from '../core/types';\nimport { ConversationService } from '../services/conversation';\n\nexport interface PartyKitMessage {\n  type: string;\n  payload: any;\n}\n\nexport interface AIRequestPayload {\n  message: string;\n  userId: string;\n  agentId?: string;\n  personality?: PersonalityProfile;\n  metadata?: Record<string, any>;\n}\n\nexport class PartyKitAdapter {\n  constructor(private conversationService: ConversationService) {}\n\n  async handleMessage(message: PartyKitMessage): Promise<PartyKitMessage | null> {\n    switch (message.type) {\n      case 'ai:request':\n        return this.handleAIRequest(message.payload);\n\n      case 'ai:clear':\n        return this.handleClearConversation(message.payload);\n\n      default:\n        return null;\n    }\n  }\n\n  private async handleAIRequest(payload: AIRequestPayload): Promise<PartyKitMessage> {\n    try {\n      const response = await this.conversationService.processMessage(\n        payload.userId,\n        payload.message,\n        payload.personality,\n        payload.metadata\n      );\n\n      return {\n        type: 'ai:response',\n        payload: {\n          success: true,\n          response: this.serializeResponse(response),\n          userId: payload.userId,\n          agentId: payload.agentId,\n        },\n      };\n    } catch (error: any) {\n      return {\n        type: 'ai:error',\n        payload: {\n          success: false,\n          error: {\n            message: error.message,\n            code: error.code || 'UNKNOWN_ERROR',\n          },\n          userId: payload.userId,\n          agentId: payload.agentId,\n        },\n      };\n    }\n  }\n\n  private handleClearConversation(payload: { conversationId: string }): PartyKitMessage {\n    this.conversationService.clearConversation(payload.conversationId);\n\n    return {\n      type: 'ai:cleared',\n      payload: {\n        success: true,\n        conversationId: payload.conversationId,\n      },\n    };\n  }\n\n  private serializeResponse(response: AIResponse): any {\n    return {\n      text: response.text,\n      audioUrl: response.audio ? this.createAudioUrl(response.audio) : undefined,\n      emotion: response.emotion,\n      actions: response.actions,\n      metadata: response.metadata,\n    };\n  }\n\n  private createAudioUrl(audio: ArrayBuffer): string {\n    // In production, this would upload to CDN and return URL\n    // For now, return base64 data URL\n    const base64 = btoa(\n      new Uint8Array(audio).reduce((data, byte) => data + String.fromCharCode(byte), '')\n    );\n    return `data:audio/mp3;base64,${base64}`;\n  }\n\n  // Helper method to format outgoing messages\n  formatBroadcast(response: AIResponse, roomId: string): PartyKitMessage {\n    return {\n      type: 'message:ai',\n      payload: {\n        id: `ai-${Date.now()}`,\n        roomId,\n        text: response.text,\n        audioUrl: response.audio ? this.createAudioUrl(response.audio) : undefined,\n        emotion: response.emotion,\n        actions: response.actions,\n        timestamp: new Date().toISOString(),\n        sender: {\n          id: 'ai',\n          username: 'AI Assistant',\n          type: 'ai',\n        },\n      },\n    };\n  }\n}\n","/**\n * ai-agent-simple\n *\n * Modular AI framework for text generation, TTS, and more\n */\n\n// Core exports\nexport * from './core/types';\nexport { BaseProvider } from './core/base-provider';\nexport { AgentController } from './core/agent-controller';\nexport { ProviderManager } from './core/provider-manager';\n\n// Text providers\nexport { OpenAIText } from './providers/text/openai';\nexport { AlkahestText } from './providers/text/alkahest';\nexport { MahoText } from './providers/text/maho';\nexport { AkashText } from './providers/text/akash';\n\n// TTS providers\nexport { OpenAITTS } from './providers/tts/openai-tts';\nexport { AlkahestTTS } from './providers/tts/alkahest-tts';\n\n// Image providers\nexport { AlkahestImage } from './providers/image/alkahest';\n\n// Services\nexport { ConversationService } from './services/conversation';\nexport { TipManagementService } from './services/tip-management';\nexport { AudioControlService } from './services/audio-control';\nexport { VRMIntegrationService } from './services/vrm-integration';\nexport { CanvasIntegrationService } from './services/canvas-integration';\n\n// Adapters\nexport { PartyKitAdapter } from './adapters/partykit';\n\n// Main framework class\nimport {\n  AIProvider,\n  ProviderType,\n  ProviderConfig,\n  PersonalityProfile,\n  AIResponse,\n} from './core/types';\nimport { OpenAIText } from './providers/text/openai';\nimport { AlkahestText } from './providers/text/alkahest';\nimport { MahoText } from './providers/text/maho';\nimport { AkashText } from './providers/text/akash';\nimport { OpenAITTS } from './providers/tts/openai-tts';\nimport { AlkahestTTS } from './providers/tts/alkahest-tts';\nimport { AlkahestImage } from './providers/image/alkahest';\nimport { ConversationService } from './services/conversation';\nimport { PartyKitAdapter } from './adapters/partykit';\n\nexport interface AIFrameworkConfig {\n  providers?: {\n    text?: ProviderConfig;\n    tts?: ProviderConfig;\n    image?: ProviderConfig;\n  };\n  conversation?: {\n    enableTTS?: boolean;\n    enableActions?: boolean;\n    maxContextMessages?: number;\n  };\n}\n\nexport class AIFramework {\n  private providers = new Map<ProviderType, AIProvider>();\n  private conversationService?: ConversationService;\n  private partyKitAdapter?: PartyKitAdapter;\n\n  constructor(private config: AIFrameworkConfig = {}) {}\n\n  async initialize(): Promise<void> {\n    // Initialize text provider\n    if (this.config.providers?.text) {\n      const providerType = this.config.providers.text.provider || 'openai';\n      let textProvider;\n\n      switch (providerType) {\n        case 'alkahest':\n          textProvider = new AlkahestText();\n          break;\n        case 'maho':\n          textProvider = new MahoText();\n          break;\n        case 'akash':\n          textProvider = new AkashText();\n          break;\n        case 'openai':\n        default:\n          textProvider = new OpenAIText();\n          break;\n      }\n\n      await textProvider.initialize(this.config.providers.text);\n      this.providers.set('text', textProvider);\n    }\n\n    // Initialize TTS provider\n    if (this.config.providers?.tts) {\n      const providerType = this.config.providers.tts.provider || 'openai';\n      let ttsProvider;\n\n      switch (providerType) {\n        case 'alkahest':\n          ttsProvider = new AlkahestTTS();\n          break;\n        case 'openai':\n        default:\n          ttsProvider = new OpenAITTS();\n          break;\n      }\n\n      await ttsProvider.initialize(this.config.providers.tts);\n      this.providers.set('tts', ttsProvider);\n    }\n\n    // Initialize image provider\n    if (this.config.providers?.image) {\n      const providerType = this.config.providers.image.provider || 'alkahest';\n      let imageProvider;\n\n      switch (providerType) {\n        case 'alkahest':\n          imageProvider = new AlkahestImage();\n          break;\n        default:\n          throw new Error(`Unsupported image provider: ${providerType}`);\n      }\n\n      await imageProvider.initialize(this.config.providers.image);\n      this.providers.set('image', imageProvider);\n    }\n\n    // Initialize conversation service\n    const textProvider = this.providers.get('text') as any;\n    const ttsProvider = this.providers.get('tts') as any;\n\n    if (textProvider) {\n      this.conversationService = new ConversationService(\n        textProvider,\n        ttsProvider,\n        this.config.conversation\n      );\n\n      this.partyKitAdapter = new PartyKitAdapter(this.conversationService);\n    }\n  }\n\n  getProvider(type: ProviderType): AIProvider | undefined {\n    return this.providers.get(type);\n  }\n\n  get conversation(): ConversationService {\n    if (!this.conversationService) {\n      throw new Error('Conversation service not initialized');\n    }\n    return this.conversationService;\n  }\n\n  get partyKit(): PartyKitAdapter {\n    if (!this.partyKitAdapter) {\n      throw new Error('PartyKit adapter not initialized');\n    }\n    return this.partyKitAdapter;\n  }\n\n  async processMessage(\n    userId: string,\n    message: string,\n    personality?: PersonalityProfile,\n    metadata?: Record<string, any>\n  ): Promise<AIResponse> {\n    return this.conversation.processMessage(userId, message, personality, metadata);\n  }\n}\n"]}