{"version":3,"sources":["../../src/rlhf/types.ts","../../src/rlhf/storage/ZeroDBStorage.ts","../../src/rlhf/storage/LocalStorage.ts","../../src/rlhf/storage/MemoryStorage.ts","../../src/rlhf/RLHFLogger.ts","../../src/rlhf/RLHFInstrumentation.ts"],"names":["FeedbackType","BinaryFeedback","StorageBackend","ExportFormat","fs"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * RLHF (Reinforcement Learning from Human Feedback) Types\n *\n * Type definitions for RLHF logging system\n */\n\n/**\n * Feedback type enumeration\n */\nexport enum FeedbackType {\n  /** Binary thumbs up/down feedback */\n  BINARY = 'binary',\n  /** Rating scale (1-5 stars) */\n  RATING = 'rating',\n  /** Text comment feedback */\n  TEXT = 'text',\n  /** Multi-dimensional ratings */\n  MULTI_DIMENSIONAL = 'multi_dimensional',\n  /** Comparative feedback between multiple responses */\n  COMPARATIVE = 'comparative',\n}\n\n/**\n * Binary feedback values\n */\nexport enum BinaryFeedback {\n  THUMBS_UP = 'thumbs_up',\n  THUMBS_DOWN = 'thumbs_down',\n}\n\n/**\n * Storage backend types\n */\nexport enum StorageBackend {\n  /** ZeroDB cloud storage */\n  ZERODB = 'zerodb',\n  /** Local file storage */\n  LOCAL = 'local',\n  /** Custom storage implementation */\n  CUSTOM = 'custom',\n  /** In-memory storage (testing only) */\n  MEMORY = 'memory',\n}\n\n/**\n * Export format types\n */\nexport enum ExportFormat {\n  JSON = 'json',\n  CSV = 'csv',\n  JSONL = 'jsonl',\n  PARQUET = 'parquet',\n}\n\n/**\n * Binary feedback data\n */\nexport interface BinaryFeedbackData {\n  value: BinaryFeedback;\n  timestamp: Date;\n}\n\n/**\n * Rating feedback data (1-5 scale)\n */\nexport interface RatingFeedbackData {\n  rating: number; // 1-5\n  maxRating?: number; // Default 5\n  comment?: string;\n  timestamp: Date;\n}\n\n/**\n * Text feedback data\n */\nexport interface TextFeedbackData {\n  comment: string;\n  sentiment?: 'positive' | 'negative' | 'neutral';\n  timestamp: Date;\n}\n\n/**\n * Multi-dimensional rating data\n */\nexport interface MultiDimensionalFeedbackData {\n  dimensions: {\n    [dimensionName: string]: number;\n  };\n  weights?: {\n    [dimensionName: string]: number;\n  };\n  overallComment?: string;\n  timestamp: Date;\n}\n\n/**\n * Comparative feedback data\n */\nexport interface ComparativeFeedbackData {\n  preferredResponseId: string;\n  comparedResponseIds: string[];\n  reason?: string;\n  confidenceLevel?: number; // 0-1\n  timestamp: Date;\n}\n\n/**\n * Generic feedback data union\n */\nexport type FeedbackData =\n  | BinaryFeedbackData\n  | RatingFeedbackData\n  | TextFeedbackData\n  | MultiDimensionalFeedbackData\n  | ComparativeFeedbackData;\n\n/**\n * User feedback record\n */\nexport interface Feedback {\n  /** Unique feedback ID */\n  id: string;\n  /** Associated interaction ID */\n  interactionId: string;\n  /** Feedback type */\n  type: FeedbackType;\n  /** Feedback data */\n  data: FeedbackData;\n  /** User ID (optional) */\n  userId?: string;\n  /** Session ID */\n  sessionId?: string;\n  /** Additional metadata */\n  metadata?: Record<string, any>;\n  /** Timestamp */\n  timestamp: Date;\n  /** Feedback source (web, mobile, api, etc.) */\n  source?: string;\n}\n\n/**\n * AI interaction log\n */\nexport interface InteractionLog {\n  /** Unique interaction ID */\n  id: string;\n  /** User prompt/input */\n  prompt: string;\n  /** AI response/output */\n  response: string;\n  /** Model used */\n  model?: string;\n  /** Model parameters */\n  modelParams?: {\n    temperature?: number;\n    maxTokens?: number;\n    topP?: number;\n    [key: string]: any;\n  };\n  /** Latency in milliseconds */\n  latency?: number;\n  /** Token usage */\n  tokenUsage?: {\n    prompt: number;\n    completion: number;\n    total: number;\n  };\n  /** User ID (optional) */\n  userId?: string;\n  /** Session ID */\n  sessionId?: string;\n  /** Context/conversation history */\n  context?: Array<{\n    role: 'user' | 'assistant' | 'system';\n    content: string;\n  }>;\n  /** Additional metadata */\n  metadata?: Record<string, any>;\n  /** Timestamp */\n  timestamp: Date;\n  /** Associated feedback IDs */\n  feedbackIds?: string[];\n}\n\n/**\n * Feedback session\n */\nexport interface FeedbackSession {\n  /** Session ID */\n  id: string;\n  /** User ID (optional) */\n  userId?: string;\n  /** Session start time */\n  startTime: Date;\n  /** Session end time */\n  endTime?: Date;\n  /** Interaction IDs in this session */\n  interactionIds: string[];\n  /** Feedback IDs in this session */\n  feedbackIds: string[];\n  /** Session metadata */\n  metadata?: Record<string, any>;\n}\n\n/**\n * Aggregated feedback statistics\n */\nexport interface FeedbackStats {\n  /** Total interactions logged */\n  totalInteractions: number;\n  /** Total feedback received */\n  totalFeedback: number;\n  /** Feedback rate (feedback/interactions) */\n  feedbackRate: number;\n  /** Binary feedback stats */\n  binary?: {\n    thumbsUp: number;\n    thumbsDown: number;\n    ratio: number; // thumbsUp/(thumbsUp+thumbsDown)\n  };\n  /** Rating stats */\n  rating?: {\n    average: number;\n    median: number;\n    distribution: { [rating: number]: number };\n    count: number;\n  };\n  /** Text feedback stats */\n  text?: {\n    count: number;\n    averageLength: number;\n    sentimentDistribution?: {\n      positive: number;\n      negative: number;\n      neutral: number;\n    };\n  };\n  /** Multi-dimensional stats */\n  multiDimensional?: {\n    count: number;\n    dimensionAverages: { [dimension: string]: number };\n  };\n  /** Comparative stats */\n  comparative?: {\n    count: number;\n    averageConfidence?: number;\n  };\n  /** Time range */\n  timeRange: {\n    start: Date;\n    end: Date;\n  };\n  /** Feedback by type */\n  byType: {\n    [key in FeedbackType]?: number;\n  };\n}\n\n/**\n * Storage backend interface\n */\nexport interface IStorageBackend {\n  /** Initialize storage backend */\n  initialize(): Promise<void>;\n\n  /** Store interaction log */\n  storeInteraction(interaction: InteractionLog): Promise<void>;\n\n  /** Store feedback */\n  storeFeedback(feedback: Feedback): Promise<void>;\n\n  /** Store multiple interactions (batch) */\n  storeInteractionsBatch(interactions: InteractionLog[]): Promise<void>;\n\n  /** Store multiple feedback items (batch) */\n  storeFeedbackBatch(feedback: Feedback[]): Promise<void>;\n\n  /** Get interaction by ID */\n  getInteraction(id: string): Promise<InteractionLog | null>;\n\n  /** Get feedback by ID */\n  getFeedback(id: string): Promise<Feedback | null>;\n\n  /** Get feedback for interaction */\n  getFeedbackForInteraction(interactionId: string): Promise<Feedback[]>;\n\n  /** Get interactions in time range */\n  getInteractions(startTime: Date, endTime: Date, limit?: number): Promise<InteractionLog[]>;\n\n  /** Get feedback in time range */\n  getFeedbackInRange(startTime: Date, endTime: Date, limit?: number): Promise<Feedback[]>;\n\n  /** Calculate feedback statistics */\n  calculateStats(startTime?: Date, endTime?: Date): Promise<FeedbackStats>;\n\n  /** Export feedback data */\n  exportData(format: ExportFormat, startTime?: Date, endTime?: Date): Promise<string | Buffer>;\n\n  /** Close storage backend */\n  close(): Promise<void>;\n}\n\n/**\n * RLHF Logger configuration\n */\nexport interface RLHFConfig {\n  /** Storage backend type */\n  backend: StorageBackend;\n\n  /** Backend-specific configuration */\n  backendConfig?: {\n    /** ZeroDB configuration */\n    zerodb?: {\n      projectId: string;\n      apiKey?: string;\n      tableName?: string;\n      vectorTableName?: string;\n    };\n\n    /** Local file storage configuration */\n    local?: {\n      dataDir: string;\n      compress?: boolean;\n      maxFileSize?: number; // in MB\n      rotateFiles?: boolean;\n    };\n\n    /** Custom backend configuration */\n    custom?: {\n      implementation: IStorageBackend;\n      config?: Record<string, any>;\n    };\n\n    /** Memory storage configuration */\n    memory?: {\n      maxEntries?: number;\n    };\n  };\n\n  /** Enable batch logging */\n  enableBatching?: boolean;\n\n  /** Batch size */\n  batchSize?: number;\n\n  /** Batch flush interval (ms) */\n  batchFlushInterval?: number;\n\n  /** Enable compression */\n  enableCompression?: boolean;\n\n  /** Auto-generate interaction IDs */\n  autoGenerateIds?: boolean;\n\n  /** Enable session tracking */\n  enableSessionTracking?: boolean;\n\n  /** Default session timeout (ms) */\n  sessionTimeout?: number;\n\n  /** Enable anonymous feedback */\n  allowAnonymous?: boolean;\n\n  /** Custom metadata to include in all logs */\n  defaultMetadata?: Record<string, any>;\n\n  /** Enable debug logging */\n  debug?: boolean;\n}\n\n/**\n * Batch operation\n */\nexport interface BatchOperation {\n  type: 'interaction' | 'feedback';\n  data: InteractionLog | Feedback;\n  timestamp: Date;\n}\n\n/**\n * Export options\n */\nexport interface ExportOptions {\n  /** Export format */\n  format: ExportFormat;\n\n  /** Start time filter */\n  startTime?: Date;\n\n  /** End time filter */\n  endTime?: Date;\n\n  /** Include interactions */\n  includeInteractions?: boolean;\n\n  /** Include feedback */\n  includeFeedback?: boolean;\n\n  /** Filter by feedback type */\n  feedbackTypes?: FeedbackType[];\n\n  /** Filter by user ID */\n  userId?: string;\n\n  /** Filter by session ID */\n  sessionId?: string;\n\n  /** Maximum records to export */\n  limit?: number;\n\n  /** Include metadata */\n  includeMetadata?: boolean;\n\n  /** Pretty print (JSON only) */\n  prettyPrint?: boolean;\n}\n\n/**\n * Feedback filter options\n */\nexport interface FeedbackFilter {\n  /** Start time */\n  startTime?: Date;\n\n  /** End time */\n  endTime?: Date;\n\n  /** Feedback types */\n  types?: FeedbackType[];\n\n  /** User ID */\n  userId?: string;\n\n  /** Session ID */\n  sessionId?: string;\n\n  /** Interaction IDs */\n  interactionIds?: string[];\n\n  /** Minimum rating (for rating feedback) */\n  minRating?: number;\n\n  /** Maximum rating (for rating feedback) */\n  maxRating?: number;\n\n  /** Feedback source */\n  source?: string;\n\n  /** Limit */\n  limit?: number;\n\n  /** Offset */\n  offset?: number;\n}\n\n/**\n * Analytics query result\n */\nexport interface AnalyticsResult {\n  /** Query metadata */\n  query: {\n    startTime?: Date;\n    endTime?: Date;\n    filters?: FeedbackFilter;\n  };\n\n  /** Statistics */\n  stats: FeedbackStats;\n\n  /** Trends over time */\n  trends?: {\n    interval: 'hour' | 'day' | 'week' | 'month';\n    data: Array<{\n      timestamp: Date;\n      stats: Partial<FeedbackStats>;\n    }>;\n  };\n\n  /** Top issues/complaints (from text feedback) */\n  topIssues?: Array<{\n    issue: string;\n    count: number;\n    sentiment: 'negative' | 'neutral';\n  }>;\n\n  /** Generated timestamp */\n  generatedAt: Date;\n}\n","/**\n * ZeroDB Storage Backend\n *\n * Storage backend implementation using ZeroDB for RLHF logging\n */\n\nimport {\n  IStorageBackend,\n  InteractionLog,\n  Feedback,\n  FeedbackStats,\n  ExportFormat,\n  FeedbackType,\n  BinaryFeedbackData,\n  RatingFeedbackData,\n  TextFeedbackData,\n  BinaryFeedback,\n} from '../types';\n\nexport interface ZeroDBConfig {\n  projectId: string;\n  apiKey?: string;\n  tableName?: string;\n  vectorTableName?: string;\n}\n\n/**\n * ZeroDB storage backend implementation\n */\nexport class ZeroDBStorage implements IStorageBackend {\n  private config: ZeroDBConfig;\n  private initialized = false;\n\n  constructor(config: ZeroDBConfig) {\n    this.config = {\n      tableName: 'rlhf_feedback',\n      vectorTableName: 'rlhf_vectors',\n      ...config,\n    };\n  }\n\n  async initialize(): Promise<void> {\n    if (this.initialized) {\n      return;\n    }\n\n    // Initialize ZeroDB connection and create tables if needed\n    // In production, this would use the ZeroDB MCP server or SDK\n    // The config will be used to connect: await zerodb.connect(this.config)\n    void this.config; // Suppress unused warning - will be used in production\n    this.initialized = true;\n  }\n\n  async storeInteraction(interaction: InteractionLog): Promise<void> {\n    // Store interaction in ZeroDB table\n    // Use ZeroDB table insert command\n    const record = {\n      id: interaction.id,\n      type: 'interaction',\n      data: JSON.stringify(interaction),\n      timestamp: interaction.timestamp.toISOString(),\n      user_id: interaction.userId,\n      session_id: interaction.sessionId,\n    };\n\n    // In production: await zerodb.table.insert(this.config.tableName, record)\n    void record; // Suppress unused warning - used in production\n    void record; // Suppress unused warning - used in production\n  }\n\n  async storeFeedback(feedback: Feedback): Promise<void> {\n    // Store feedback in ZeroDB table\n    const record = {\n      id: feedback.id,\n      type: 'feedback',\n      interaction_id: feedback.interactionId,\n      feedback_type: feedback.type,\n      data: JSON.stringify(feedback),\n      timestamp: feedback.timestamp.toISOString(),\n      user_id: feedback.userId,\n      session_id: feedback.sessionId,\n    };\n\n    // In production: await zerodb.table.insert(this.config.tableName, record)\n    void record; // Suppress unused warning - used in production\n  }\n\n  async storeInteractionsBatch(interactions: InteractionLog[]): Promise<void> {\n    const records = interactions.map(interaction => ({\n      id: interaction.id,\n      type: 'interaction',\n      data: JSON.stringify(interaction),\n      timestamp: interaction.timestamp.toISOString(),\n      user_id: interaction.userId,\n      session_id: interaction.sessionId,\n    }));\n\n    // In production: await zerodb.table.insertBatch(this.config.tableName, records)\n    void records; // Suppress unused warning - used in production\n  }\n\n  async storeFeedbackBatch(feedback: Feedback[]): Promise<void> {\n    const records = feedback.map(f => ({\n      id: f.id,\n      type: 'feedback',\n      interaction_id: f.interactionId,\n      feedback_type: f.type,\n      data: JSON.stringify(f),\n      timestamp: f.timestamp.toISOString(),\n      user_id: f.userId,\n      session_id: f.sessionId,\n    }));\n\n    // In production: await zerodb.table.insertBatch(this.config.tableName, records)\n    void records; // Suppress unused warning - used in production\n  }\n\n  async getInteraction(_id: string): Promise<InteractionLog | null> {\n    // Query ZeroDB for interaction by ID\n    // In production:\n    // const results = await zerodb.table.query(this.config.tableName, {\n    //   filter: { id, type: 'interaction' }\n    // })\n    // return results.length > 0 ? JSON.parse(results[0].data) : null\n\n    return null;\n  }\n\n  async getFeedback(_id: string): Promise<Feedback | null> {\n    // Query ZeroDB for feedback by ID\n    // In production:\n    // const results = await zerodb.table.query(this.config.tableName, {\n    //   filter: { id, type: 'feedback' }\n    // })\n    // return results.length > 0 ? JSON.parse(results[0].data) : null\n\n    return null;\n  }\n\n  async getFeedbackForInteraction(_interactionId: string): Promise<Feedback[]> {\n    // Query ZeroDB for all feedback for an interaction\n    // In production:\n    // const results = await zerodb.table.query(this.config.tableName, {\n    //   filter: { interaction_id: interactionId, type: 'feedback' }\n    // })\n    // return results.map(r => JSON.parse(r.data))\n\n    return [];\n  }\n\n  async getInteractions(_startTime: Date, _endTime: Date, _limit?: number): Promise<InteractionLog[]> {\n    // Query ZeroDB for interactions in time range\n    // In production:\n    // const results = await zerodb.table.query(this.config.tableName, {\n    //   filter: {\n    //     type: 'interaction',\n    //     timestamp: { gte: startTime.toISOString(), lte: endTime.toISOString() }\n    //   },\n    //   limit\n    // })\n    // return results.map(r => JSON.parse(r.data))\n\n    return [];\n  }\n\n  async getFeedbackInRange(_startTime: Date, _endTime: Date, _limit?: number): Promise<Feedback[]> {\n    // Query ZeroDB for feedback in time range\n    // In production:\n    // const results = await zerodb.table.query(this.config.tableName, {\n    //   filter: {\n    //     type: 'feedback',\n    //     timestamp: { gte: startTime.toISOString(), lte: endTime.toISOString() }\n    //   },\n    //   limit\n    // })\n    // return results.map(r => JSON.parse(r.data))\n\n    return [];\n  }\n\n  async calculateStats(startTime?: Date, endTime?: Date): Promise<FeedbackStats> {\n    const start = startTime || new Date(0);\n    const end = endTime || new Date();\n\n    // Get all feedback and interactions in range\n    const feedback = await this.getFeedbackInRange(start, end);\n    const interactions = await this.getInteractions(start, end);\n\n    return this.computeStats(feedback, interactions, start, end);\n  }\n\n  async exportData(\n    format: ExportFormat,\n    startTime?: Date,\n    endTime?: Date\n  ): Promise<string | Buffer> {\n    const start = startTime || new Date(0);\n    const end = endTime || new Date();\n\n    const interactions = await this.getInteractions(start, end);\n    const feedback = await this.getFeedbackInRange(start, end);\n\n    const data = {\n      interactions,\n      feedback,\n      exportedAt: new Date().toISOString(),\n      timeRange: {\n        start: start.toISOString(),\n        end: end.toISOString(),\n      },\n    };\n\n    switch (format) {\n      case ExportFormat.JSON:\n        return JSON.stringify(data, null, 2);\n\n      case ExportFormat.JSONL:\n        const lines = [\n          ...interactions.map(i => JSON.stringify({ ...i, type: 'interaction' })),\n          ...feedback.map(f => JSON.stringify({ ...f, type: 'feedback' })),\n        ];\n        return lines.join('\\n');\n\n      case ExportFormat.CSV:\n        return this.convertToCSV(feedback);\n\n      default:\n        throw new Error(`Unsupported export format: ${format}`);\n    }\n  }\n\n  async close(): Promise<void> {\n    // Close ZeroDB connection\n    this.initialized = false;\n  }\n\n  /**\n   * Compute statistics from feedback and interactions\n   */\n  private computeStats(\n    feedback: Feedback[],\n    interactions: InteractionLog[],\n    start: Date,\n    end: Date\n  ): FeedbackStats {\n    const stats: FeedbackStats = {\n      totalInteractions: interactions.length,\n      totalFeedback: feedback.length,\n      feedbackRate: interactions.length > 0 ? feedback.length / interactions.length : 0,\n      timeRange: { start, end },\n      byType: {},\n    };\n\n    // Binary feedback stats\n    const binaryFeedback = feedback.filter(f => f.type === FeedbackType.BINARY);\n    if (binaryFeedback.length > 0) {\n      const thumbsUp = binaryFeedback.filter(\n        f => (f.data as BinaryFeedbackData).value === BinaryFeedback.THUMBS_UP\n      ).length;\n      const thumbsDown = binaryFeedback.length - thumbsUp;\n\n      stats.binary = {\n        thumbsUp,\n        thumbsDown,\n        ratio: binaryFeedback.length > 0 ? thumbsUp / binaryFeedback.length : 0,\n      };\n    }\n\n    // Rating feedback stats\n    const ratingFeedback = feedback.filter(f => f.type === FeedbackType.RATING);\n    if (ratingFeedback.length > 0) {\n      const ratings = ratingFeedback.map(f => (f.data as RatingFeedbackData).rating);\n      const sum = ratings.reduce((a, b) => a + b, 0);\n      const sorted = ratings.sort((a, b) => a - b);\n      const median = sorted[Math.floor(sorted.length / 2)] ?? 0;\n\n      const distribution: { [rating: number]: number } = {};\n      ratings.forEach(r => {\n        distribution[r] = (distribution[r] || 0) + 1;\n      });\n\n      stats.rating = {\n        average: sum / ratings.length,\n        median,\n        distribution,\n        count: ratingFeedback.length,\n      };\n    }\n\n    // Text feedback stats\n    const textFeedback = feedback.filter(f => f.type === FeedbackType.TEXT);\n    if (textFeedback.length > 0) {\n      const comments = textFeedback.map(f => (f.data as TextFeedbackData).comment);\n      const totalLength = comments.reduce((sum, c) => sum + c.length, 0);\n\n      const sentimentDistribution = {\n        positive: 0,\n        negative: 0,\n        neutral: 0,\n      };\n\n      textFeedback.forEach(f => {\n        const sentiment = (f.data as TextFeedbackData).sentiment || 'neutral';\n        sentimentDistribution[sentiment]++;\n      });\n\n      stats.text = {\n        count: textFeedback.length,\n        averageLength: totalLength / textFeedback.length,\n        sentimentDistribution,\n      };\n    }\n\n    // Count by type\n    feedback.forEach(f => {\n      stats.byType[f.type] = (stats.byType[f.type] || 0) + 1;\n    });\n\n    return stats;\n  }\n\n  /**\n   * Convert feedback to CSV format\n   */\n  private convertToCSV(feedback: Feedback[]): string {\n    const headers = [\n      'id',\n      'interaction_id',\n      'type',\n      'timestamp',\n      'user_id',\n      'session_id',\n      'data',\n    ];\n\n    const rows = feedback.map(f => [\n      f.id,\n      f.interactionId,\n      f.type,\n      f.timestamp.toISOString(),\n      f.userId || '',\n      f.sessionId || '',\n      JSON.stringify(f.data),\n    ]);\n\n    const csvLines = [\n      headers.join(','),\n      ...rows.map(row => row.map(cell => `\"${cell}\"`).join(',')),\n    ];\n\n    return csvLines.join('\\n');\n  }\n}\n","/**\n * Local File Storage Backend\n *\n * Storage backend implementation using local filesystem for RLHF logging\n */\n\nimport { promises as fs } from 'fs';\nimport * as path from 'path';\nimport { createWriteStream, createReadStream } from 'fs';\nimport { createGzip } from 'zlib';\nimport { pipeline } from 'stream/promises';\nimport {\n  IStorageBackend,\n  InteractionLog,\n  Feedback,\n  FeedbackStats,\n  ExportFormat,\n  FeedbackType,\n  BinaryFeedbackData,\n  RatingFeedbackData,\n  TextFeedbackData,\n  BinaryFeedback,\n} from '../types';\n\nexport interface LocalStorageConfig {\n  dataDir: string;\n  compress?: boolean;\n  maxFileSize?: number; // in MB\n  rotateFiles?: boolean;\n}\n\n/**\n * Local file storage backend implementation\n */\nexport class LocalStorage implements IStorageBackend {\n  private config: LocalStorageConfig;\n  private interactionsFile: string;\n  private feedbackFile: string;\n  private initialized = false;\n  private currentFileSize = 0;\n  private fileRotationIndex = 0;\n\n  constructor(config: LocalStorageConfig) {\n    this.config = {\n      compress: false,\n      maxFileSize: 100, // 100 MB\n      rotateFiles: true,\n      ...config,\n    };\n\n    this.interactionsFile = path.join(this.config.dataDir, 'interactions.jsonl');\n    this.feedbackFile = path.join(this.config.dataDir, 'feedback.jsonl');\n  }\n\n  async initialize(): Promise<void> {\n    if (this.initialized) {\n      return;\n    }\n\n    // Create data directory if it doesn't exist\n    await fs.mkdir(this.config.dataDir, { recursive: true });\n\n    // Check current file sizes\n    try {\n      const stats = await fs.stat(this.interactionsFile);\n      this.currentFileSize = stats.size / (1024 * 1024); // Convert to MB\n    } catch (err) {\n      // File doesn't exist yet\n      this.currentFileSize = 0;\n    }\n\n    this.initialized = true;\n  }\n\n  async storeInteraction(interaction: InteractionLog): Promise<void> {\n    const line = JSON.stringify(interaction) + '\\n';\n    await this.appendToFile(this.interactionsFile, line);\n  }\n\n  async storeFeedback(feedback: Feedback): Promise<void> {\n    const line = JSON.stringify(feedback) + '\\n';\n    await this.appendToFile(this.feedbackFile, line);\n  }\n\n  async storeInteractionsBatch(interactions: InteractionLog[]): Promise<void> {\n    const lines = interactions.map(i => JSON.stringify(i) + '\\n').join('');\n    await this.appendToFile(this.interactionsFile, lines);\n  }\n\n  async storeFeedbackBatch(feedback: Feedback[]): Promise<void> {\n    const lines = feedback.map(f => JSON.stringify(f) + '\\n').join('');\n    await this.appendToFile(this.feedbackFile, lines);\n  }\n\n  async getInteraction(id: string): Promise<InteractionLog | null> {\n    const interactions = await this.readFile<InteractionLog>(this.interactionsFile);\n    return interactions.find(i => i.id === id) || null;\n  }\n\n  async getFeedback(id: string): Promise<Feedback | null> {\n    const feedback = await this.readFile<Feedback>(this.feedbackFile);\n    return feedback.find(f => f.id === id) || null;\n  }\n\n  async getFeedbackForInteraction(interactionId: string): Promise<Feedback[]> {\n    const feedback = await this.readFile<Feedback>(this.feedbackFile);\n    return feedback.filter(f => f.interactionId === interactionId);\n  }\n\n  async getInteractions(startTime: Date, endTime: Date, limit?: number): Promise<InteractionLog[]> {\n    const interactions = await this.readFile<InteractionLog>(this.interactionsFile);\n\n    let filtered = interactions.filter(i => {\n      const timestamp = new Date(i.timestamp);\n      return timestamp >= startTime && timestamp <= endTime;\n    });\n\n    if (limit) {\n      filtered = filtered.slice(0, limit);\n    }\n\n    return filtered;\n  }\n\n  async getFeedbackInRange(startTime: Date, endTime: Date, limit?: number): Promise<Feedback[]> {\n    const feedback = await this.readFile<Feedback>(this.feedbackFile);\n\n    let filtered = feedback.filter(f => {\n      const timestamp = new Date(f.timestamp);\n      return timestamp >= startTime && timestamp <= endTime;\n    });\n\n    if (limit) {\n      filtered = filtered.slice(0, limit);\n    }\n\n    return filtered;\n  }\n\n  async calculateStats(startTime?: Date, endTime?: Date): Promise<FeedbackStats> {\n    const start = startTime || new Date(0);\n    const end = endTime || new Date();\n\n    const feedback = await this.getFeedbackInRange(start, end);\n    const interactions = await this.getInteractions(start, end);\n\n    return this.computeStats(feedback, interactions, start, end);\n  }\n\n  async exportData(\n    format: ExportFormat,\n    startTime?: Date,\n    endTime?: Date\n  ): Promise<string | Buffer> {\n    const start = startTime || new Date(0);\n    const end = endTime || new Date();\n\n    const interactions = await this.getInteractions(start, end);\n    const feedback = await this.getFeedbackInRange(start, end);\n\n    const data = {\n      interactions,\n      feedback,\n      exportedAt: new Date().toISOString(),\n      timeRange: {\n        start: start.toISOString(),\n        end: end.toISOString(),\n      },\n    };\n\n    switch (format) {\n      case ExportFormat.JSON:\n        return JSON.stringify(data, null, 2);\n\n      case ExportFormat.JSONL:\n        const lines = [\n          ...interactions.map(i => JSON.stringify({ ...i, type: 'interaction' })),\n          ...feedback.map(f => JSON.stringify({ ...f, type: 'feedback' })),\n        ];\n        return lines.join('\\n');\n\n      case ExportFormat.CSV:\n        return this.convertToCSV(feedback);\n\n      default:\n        throw new Error(`Unsupported export format: ${format}`);\n    }\n  }\n\n  async close(): Promise<void> {\n    // Compress files if enabled\n    if (this.config.compress) {\n      await this.compressFile(this.interactionsFile);\n      await this.compressFile(this.feedbackFile);\n    }\n\n    this.initialized = false;\n  }\n\n  /**\n   * Append data to file\n   */\n  private async appendToFile(filePath: string, data: string): Promise<void> {\n    // Check if file rotation is needed\n    if (this.config.rotateFiles && this.currentFileSize >= (this.config.maxFileSize || 100)) {\n      await this.rotateFile(filePath);\n    }\n\n    await fs.appendFile(filePath, data, 'utf8');\n    this.currentFileSize += data.length / (1024 * 1024);\n  }\n\n  /**\n   * Read file and parse JSONL\n   */\n  private async readFile<T>(filePath: string): Promise<T[]> {\n    try {\n      const content = await fs.readFile(filePath, 'utf8');\n      const lines = content.trim().split('\\n').filter(line => line.length > 0);\n      return lines.map(line => {\n        const parsed = JSON.parse(line);\n        // Convert timestamp strings back to Date objects\n        if (parsed.timestamp) {\n          parsed.timestamp = new Date(parsed.timestamp);\n        }\n        if (parsed.data && parsed.data.timestamp) {\n          parsed.data.timestamp = new Date(parsed.data.timestamp);\n        }\n        return parsed;\n      });\n    } catch (err: any) {\n      if (err.code === 'ENOENT') {\n        return [];\n      }\n      throw err;\n    }\n  }\n\n  /**\n   * Rotate file when max size reached\n   */\n  private async rotateFile(filePath: string): Promise<void> {\n    this.fileRotationIndex++;\n    const ext = path.extname(filePath);\n    const base = filePath.slice(0, -ext.length);\n    const newPath = `${base}.${this.fileRotationIndex}${ext}`;\n\n    try {\n      await fs.rename(filePath, newPath);\n      this.currentFileSize = 0;\n\n      // Compress rotated file if enabled\n      if (this.config.compress) {\n        await this.compressFile(newPath);\n      }\n    } catch (err: any) {\n      if (err.code !== 'ENOENT') {\n        throw err;\n      }\n    }\n  }\n\n  /**\n   * Compress file using gzip\n   */\n  private async compressFile(filePath: string): Promise<void> {\n    try {\n      const source = createReadStream(filePath);\n      const destination = createWriteStream(`${filePath}.gz`);\n      const gzip = createGzip();\n\n      await pipeline(source, gzip, destination);\n\n      // Delete original file after compression\n      await fs.unlink(filePath);\n    } catch (err: any) {\n      if (err.code !== 'ENOENT') {\n        console.error('Error compressing file:', err);\n      }\n    }\n  }\n\n  /**\n   * Compute statistics from feedback and interactions\n   */\n  private computeStats(\n    feedback: Feedback[],\n    interactions: InteractionLog[],\n    start: Date,\n    end: Date\n  ): FeedbackStats {\n    const stats: FeedbackStats = {\n      totalInteractions: interactions.length,\n      totalFeedback: feedback.length,\n      feedbackRate: interactions.length > 0 ? feedback.length / interactions.length : 0,\n      timeRange: { start, end },\n      byType: {},\n    };\n\n    // Binary feedback stats\n    const binaryFeedback = feedback.filter(f => f.type === FeedbackType.BINARY);\n    if (binaryFeedback.length > 0) {\n      const thumbsUp = binaryFeedback.filter(\n        f => (f.data as BinaryFeedbackData).value === BinaryFeedback.THUMBS_UP\n      ).length;\n      const thumbsDown = binaryFeedback.length - thumbsUp;\n\n      stats.binary = {\n        thumbsUp,\n        thumbsDown,\n        ratio: binaryFeedback.length > 0 ? thumbsUp / binaryFeedback.length : 0,\n      };\n    }\n\n    // Rating feedback stats\n    const ratingFeedback = feedback.filter(f => f.type === FeedbackType.RATING);\n    if (ratingFeedback.length > 0) {\n      const ratings = ratingFeedback.map(f => (f.data as RatingFeedbackData).rating);\n      const sum = ratings.reduce((a, b) => a + b, 0);\n      const sorted = ratings.sort((a, b) => a - b);\n      const median = sorted[Math.floor(sorted.length / 2)] ?? 0;\n\n      const distribution: { [rating: number]: number } = {};\n      ratings.forEach(r => {\n        distribution[r] = (distribution[r] || 0) + 1;\n      });\n\n      stats.rating = {\n        average: sum / ratings.length,\n        median,\n        distribution,\n        count: ratingFeedback.length,\n      };\n    }\n\n    // Text feedback stats\n    const textFeedback = feedback.filter(f => f.type === FeedbackType.TEXT);\n    if (textFeedback.length > 0) {\n      const comments = textFeedback.map(f => (f.data as TextFeedbackData).comment);\n      const totalLength = comments.reduce((sum, c) => sum + c.length, 0);\n\n      const sentimentDistribution = {\n        positive: 0,\n        negative: 0,\n        neutral: 0,\n      };\n\n      textFeedback.forEach(f => {\n        const sentiment = (f.data as TextFeedbackData).sentiment || 'neutral';\n        sentimentDistribution[sentiment]++;\n      });\n\n      stats.text = {\n        count: textFeedback.length,\n        averageLength: totalLength / textFeedback.length,\n        sentimentDistribution,\n      };\n    }\n\n    // Multi-dimensional feedback stats\n    const multiDimFeedback = feedback.filter(f => f.type === FeedbackType.MULTI_DIMENSIONAL);\n    if (multiDimFeedback.length > 0) {\n      const dimensionSums: { [key: string]: number } = {};\n      const dimensionCounts: { [key: string]: number } = {};\n\n      multiDimFeedback.forEach(f => {\n        const data = f.data as any;\n        Object.entries(data.dimensions).forEach(([dim, value]) => {\n          dimensionSums[dim] = (dimensionSums[dim] || 0) + (value as number);\n          dimensionCounts[dim] = (dimensionCounts[dim] || 0) + 1;\n        });\n      });\n\n      const dimensionAverages: { [key: string]: number } = {};\n      Object.keys(dimensionSums).forEach(dim => {\n        const sum = dimensionSums[dim];\n        const count = dimensionCounts[dim];\n        if (sum !== undefined && count !== undefined && count > 0) {\n          dimensionAverages[dim] = sum / count;\n        }\n      });\n\n      stats.multiDimensional = {\n        count: multiDimFeedback.length,\n        dimensionAverages,\n      };\n    }\n\n    // Comparative feedback stats\n    const comparativeFeedback = feedback.filter(f => f.type === FeedbackType.COMPARATIVE);\n    if (comparativeFeedback.length > 0) {\n      const confidenceLevels = comparativeFeedback\n        .map(f => (f.data as any).confidenceLevel)\n        .filter((c): c is number => c !== undefined);\n\n      stats.comparative = {\n        count: comparativeFeedback.length,\n        averageConfidence:\n          confidenceLevels.length > 0\n            ? confidenceLevels.reduce((a, b) => a + b, 0) / confidenceLevels.length\n            : undefined,\n      };\n    }\n\n    // Count by type\n    feedback.forEach(f => {\n      stats.byType[f.type] = (stats.byType[f.type] || 0) + 1;\n    });\n\n    return stats;\n  }\n\n  /**\n   * Convert feedback to CSV format\n   */\n  private convertToCSV(feedback: Feedback[]): string {\n    const headers = [\n      'id',\n      'interaction_id',\n      'type',\n      'timestamp',\n      'user_id',\n      'session_id',\n      'data',\n    ];\n\n    const rows = feedback.map(f => [\n      f.id,\n      f.interactionId,\n      f.type,\n      f.timestamp.toISOString(),\n      f.userId || '',\n      f.sessionId || '',\n      JSON.stringify(f.data),\n    ]);\n\n    const csvLines = [\n      headers.join(','),\n      ...rows.map(row => row.map(cell => `\"${cell}\"`).join(',')),\n    ];\n\n    return csvLines.join('\\n');\n  }\n}\n","/**\n * Memory Storage Backend\n *\n * In-memory storage backend for RLHF logging (primarily for testing)\n */\n\nimport {\n  IStorageBackend,\n  InteractionLog,\n  Feedback,\n  FeedbackStats,\n  ExportFormat,\n  FeedbackType,\n  BinaryFeedbackData,\n  RatingFeedbackData,\n  TextFeedbackData,\n  BinaryFeedback,\n  MultiDimensionalFeedbackData,\n  ComparativeFeedbackData,\n} from '../types';\n\nexport interface MemoryStorageConfig {\n  maxEntries?: number;\n}\n\n/**\n * In-memory storage backend implementation\n */\nexport class MemoryStorage implements IStorageBackend {\n  private config: MemoryStorageConfig;\n  private interactions: Map<string, InteractionLog> = new Map();\n  private feedback: Map<string, Feedback> = new Map();\n  private interactionsByTime: InteractionLog[] = [];\n  private feedbackByTime: Feedback[] = [];\n  private initialized = false;\n\n  constructor(config: MemoryStorageConfig = {}) {\n    this.config = {\n      maxEntries: 10000,\n      ...config,\n    };\n  }\n\n  async initialize(): Promise<void> {\n    if (this.initialized) {\n      return;\n    }\n\n    this.interactions.clear();\n    this.feedback.clear();\n    this.interactionsByTime = [];\n    this.feedbackByTime = [];\n    this.initialized = true;\n  }\n\n  async storeInteraction(interaction: InteractionLog): Promise<void> {\n    this.interactions.set(interaction.id, interaction);\n    this.interactionsByTime.push(interaction);\n\n    // Enforce max entries limit\n    if (this.interactionsByTime.length > (this.config.maxEntries || 10000)) {\n      const removed = this.interactionsByTime.shift();\n      if (removed) {\n        this.interactions.delete(removed.id);\n      }\n    }\n  }\n\n  async storeFeedback(feedback: Feedback): Promise<void> {\n    this.feedback.set(feedback.id, feedback);\n    this.feedbackByTime.push(feedback);\n\n    // Enforce max entries limit\n    if (this.feedbackByTime.length > (this.config.maxEntries || 10000)) {\n      const removed = this.feedbackByTime.shift();\n      if (removed) {\n        this.feedback.delete(removed.id);\n      }\n    }\n  }\n\n  async storeInteractionsBatch(interactions: InteractionLog[]): Promise<void> {\n    for (const interaction of interactions) {\n      await this.storeInteraction(interaction);\n    }\n  }\n\n  async storeFeedbackBatch(feedback: Feedback[]): Promise<void> {\n    for (const f of feedback) {\n      await this.storeFeedback(f);\n    }\n  }\n\n  async getInteraction(id: string): Promise<InteractionLog | null> {\n    return this.interactions.get(id) || null;\n  }\n\n  async getFeedback(id: string): Promise<Feedback | null> {\n    return this.feedback.get(id) || null;\n  }\n\n  async getFeedbackForInteraction(interactionId: string): Promise<Feedback[]> {\n    return this.feedbackByTime.filter(f => f.interactionId === interactionId);\n  }\n\n  async getInteractions(startTime: Date, endTime: Date, limit?: number): Promise<InteractionLog[]> {\n    let filtered = this.interactionsByTime.filter(i => {\n      const timestamp = new Date(i.timestamp);\n      return timestamp >= startTime && timestamp <= endTime;\n    });\n\n    if (limit) {\n      filtered = filtered.slice(0, limit);\n    }\n\n    return filtered;\n  }\n\n  async getFeedbackInRange(startTime: Date, endTime: Date, limit?: number): Promise<Feedback[]> {\n    let filtered = this.feedbackByTime.filter(f => {\n      const timestamp = new Date(f.timestamp);\n      return timestamp >= startTime && timestamp <= endTime;\n    });\n\n    if (limit) {\n      filtered = filtered.slice(0, limit);\n    }\n\n    return filtered;\n  }\n\n  async calculateStats(startTime?: Date, endTime?: Date): Promise<FeedbackStats> {\n    const start = startTime || new Date(0);\n    const end = endTime || new Date();\n\n    const feedback = await this.getFeedbackInRange(start, end);\n    const interactions = await this.getInteractions(start, end);\n\n    return this.computeStats(feedback, interactions, start, end);\n  }\n\n  async exportData(\n    format: ExportFormat,\n    startTime?: Date,\n    endTime?: Date\n  ): Promise<string | Buffer> {\n    const start = startTime || new Date(0);\n    const end = endTime || new Date();\n\n    const interactions = await this.getInteractions(start, end);\n    const feedback = await this.getFeedbackInRange(start, end);\n\n    const data = {\n      interactions,\n      feedback,\n      exportedAt: new Date().toISOString(),\n      timeRange: {\n        start: start.toISOString(),\n        end: end.toISOString(),\n      },\n    };\n\n    switch (format) {\n      case ExportFormat.JSON:\n        return JSON.stringify(data, null, 2);\n\n      case ExportFormat.JSONL:\n        const lines = [\n          ...interactions.map(i => JSON.stringify({ ...i, type: 'interaction' })),\n          ...feedback.map(f => JSON.stringify({ ...f, type: 'feedback' })),\n        ];\n        return lines.join('\\n');\n\n      case ExportFormat.CSV:\n        return this.convertToCSV(feedback);\n\n      default:\n        throw new Error(`Unsupported export format: ${format}`);\n    }\n  }\n\n  async close(): Promise<void> {\n    // Clean up memory\n    this.interactions.clear();\n    this.feedback.clear();\n    this.interactionsByTime = [];\n    this.feedbackByTime = [];\n    this.initialized = false;\n  }\n\n  /**\n   * Get all interactions (for testing)\n   */\n  getAllInteractions(): InteractionLog[] {\n    return [...this.interactionsByTime];\n  }\n\n  /**\n   * Get all feedback (for testing)\n   */\n  getAllFeedback(): Feedback[] {\n    return [...this.feedbackByTime];\n  }\n\n  /**\n   * Clear all data (for testing)\n   */\n  clear(): void {\n    this.interactions.clear();\n    this.feedback.clear();\n    this.interactionsByTime = [];\n    this.feedbackByTime = [];\n  }\n\n  /**\n   * Compute statistics from feedback and interactions\n   */\n  private computeStats(\n    feedback: Feedback[],\n    interactions: InteractionLog[],\n    start: Date,\n    end: Date\n  ): FeedbackStats {\n    const stats: FeedbackStats = {\n      totalInteractions: interactions.length,\n      totalFeedback: feedback.length,\n      feedbackRate: interactions.length > 0 ? feedback.length / interactions.length : 0,\n      timeRange: { start, end },\n      byType: {},\n    };\n\n    // Binary feedback stats\n    const binaryFeedback = feedback.filter(f => f.type === FeedbackType.BINARY);\n    if (binaryFeedback.length > 0) {\n      const thumbsUp = binaryFeedback.filter(\n        f => (f.data as BinaryFeedbackData).value === BinaryFeedback.THUMBS_UP\n      ).length;\n      const thumbsDown = binaryFeedback.length - thumbsUp;\n\n      stats.binary = {\n        thumbsUp,\n        thumbsDown,\n        ratio: binaryFeedback.length > 0 ? thumbsUp / binaryFeedback.length : 0,\n      };\n    }\n\n    // Rating feedback stats\n    const ratingFeedback = feedback.filter(f => f.type === FeedbackType.RATING);\n    if (ratingFeedback.length > 0) {\n      const ratings = ratingFeedback.map(f => (f.data as RatingFeedbackData).rating);\n      const sum = ratings.reduce((a, b) => a + b, 0);\n      const sorted = [...ratings].sort((a, b) => a - b);\n      const median = sorted[Math.floor(sorted.length / 2)] ?? 0;\n\n      const distribution: { [rating: number]: number } = {};\n      ratings.forEach(r => {\n        distribution[r] = (distribution[r] || 0) + 1;\n      });\n\n      stats.rating = {\n        average: sum / ratings.length,\n        median,\n        distribution,\n        count: ratingFeedback.length,\n      };\n    }\n\n    // Text feedback stats\n    const textFeedback = feedback.filter(f => f.type === FeedbackType.TEXT);\n    if (textFeedback.length > 0) {\n      const comments = textFeedback.map(f => (f.data as TextFeedbackData).comment);\n      const totalLength = comments.reduce((sum, c) => sum + c.length, 0);\n\n      const sentimentDistribution = {\n        positive: 0,\n        negative: 0,\n        neutral: 0,\n      };\n\n      textFeedback.forEach(f => {\n        const sentiment = (f.data as TextFeedbackData).sentiment || 'neutral';\n        sentimentDistribution[sentiment]++;\n      });\n\n      stats.text = {\n        count: textFeedback.length,\n        averageLength: totalLength / textFeedback.length,\n        sentimentDistribution,\n      };\n    }\n\n    // Multi-dimensional feedback stats\n    const multiDimFeedback = feedback.filter(f => f.type === FeedbackType.MULTI_DIMENSIONAL);\n    if (multiDimFeedback.length > 0) {\n      const dimensionSums: { [key: string]: number } = {};\n      const dimensionCounts: { [key: string]: number } = {};\n\n      multiDimFeedback.forEach(f => {\n        const data = f.data as MultiDimensionalFeedbackData;\n        Object.entries(data.dimensions).forEach(([dim, value]) => {\n          dimensionSums[dim] = (dimensionSums[dim] || 0) + value;\n          dimensionCounts[dim] = (dimensionCounts[dim] || 0) + 1;\n        });\n      });\n\n      const dimensionAverages: { [key: string]: number } = {};\n      Object.keys(dimensionSums).forEach(dim => {\n        const sum = dimensionSums[dim];\n        const count = dimensionCounts[dim];\n        if (sum !== undefined && count !== undefined && count > 0) {\n          dimensionAverages[dim] = sum / count;\n        }\n      });\n\n      stats.multiDimensional = {\n        count: multiDimFeedback.length,\n        dimensionAverages,\n      };\n    }\n\n    // Comparative feedback stats\n    const comparativeFeedback = feedback.filter(f => f.type === FeedbackType.COMPARATIVE);\n    if (comparativeFeedback.length > 0) {\n      const confidenceLevels = comparativeFeedback\n        .map(f => (f.data as ComparativeFeedbackData).confidenceLevel)\n        .filter((c): c is number => c !== undefined);\n\n      stats.comparative = {\n        count: comparativeFeedback.length,\n        averageConfidence:\n          confidenceLevels.length > 0\n            ? confidenceLevels.reduce((a, b) => a + b, 0) / confidenceLevels.length\n            : undefined,\n      };\n    }\n\n    // Count by type\n    feedback.forEach(f => {\n      stats.byType[f.type] = (stats.byType[f.type] || 0) + 1;\n    });\n\n    return stats;\n  }\n\n  /**\n   * Convert feedback to CSV format\n   */\n  private convertToCSV(feedback: Feedback[]): string {\n    const headers = [\n      'id',\n      'interaction_id',\n      'type',\n      'timestamp',\n      'user_id',\n      'session_id',\n      'data',\n    ];\n\n    const rows = feedback.map(f => [\n      f.id,\n      f.interactionId,\n      f.type,\n      f.timestamp.toISOString(),\n      f.userId || '',\n      f.sessionId || '',\n      JSON.stringify(f.data),\n    ]);\n\n    const csvLines = [\n      headers.join(','),\n      ...rows.map(row => row.map(cell => `\"${cell}\"`).join(',')),\n    ];\n\n    return csvLines.join('\\n');\n  }\n}\n","/**\n * RLHFLogger - Reinforcement Learning from Human Feedback Logger\n *\n * Comprehensive logging system for capturing user feedback and AI interactions\n * to improve model performance through RLHF.\n */\n\nimport { randomUUID } from 'crypto';\nimport {\n  RLHFConfig,\n  InteractionLog,\n  Feedback,\n  FeedbackType,\n  FeedbackData,\n  BinaryFeedback,\n  BinaryFeedbackData,\n  RatingFeedbackData,\n  TextFeedbackData,\n  MultiDimensionalFeedbackData,\n  ComparativeFeedbackData,\n  FeedbackStats,\n  IStorageBackend,\n  StorageBackend,\n  ExportFormat,\n  ExportOptions,\n  FeedbackFilter,\n  BatchOperation,\n  FeedbackSession,\n  AnalyticsResult,\n} from './types';\nimport { ZeroDBStorage } from './storage/ZeroDBStorage';\nimport { LocalStorage } from './storage/LocalStorage';\nimport { MemoryStorage } from './storage/MemoryStorage';\n\n/**\n * Main RLHF Logger class\n */\nexport class RLHFLogger {\n  private config: RLHFConfig;\n  private storage: IStorageBackend;\n  private batchQueue: BatchOperation[] = [];\n  private batchTimer?: NodeJS.Timeout;\n  private currentSession?: FeedbackSession;\n  private sessionTimer?: NodeJS.Timeout;\n  private initialized = false;\n\n  /**\n   * Create a new RLHFLogger instance\n   */\n  constructor(config: RLHFConfig) {\n    this.config = this.normalizeConfig(config);\n    this.storage = this.createStorageBackend();\n  }\n\n  /**\n   * Normalize configuration with defaults\n   */\n  private normalizeConfig(config: RLHFConfig): RLHFConfig {\n    return {\n      backend: config.backend || StorageBackend.MEMORY,\n      backendConfig: config.backendConfig || {},\n      enableBatching: config.enableBatching ?? true,\n      batchSize: config.batchSize || 50,\n      batchFlushInterval: config.batchFlushInterval || 5000,\n      enableCompression: config.enableCompression ?? false,\n      autoGenerateIds: config.autoGenerateIds ?? true,\n      enableSessionTracking: config.enableSessionTracking ?? true,\n      sessionTimeout: config.sessionTimeout || 1800000, // 30 minutes\n      allowAnonymous: config.allowAnonymous ?? true,\n      defaultMetadata: config.defaultMetadata || {},\n      debug: config.debug ?? false,\n    };\n  }\n\n  /**\n   * Create storage backend based on configuration\n   */\n  private createStorageBackend(): IStorageBackend {\n    switch (this.config.backend) {\n      case StorageBackend.ZERODB:\n        if (!this.config.backendConfig?.zerodb) {\n          throw new Error('ZeroDB backend config is required when using ZERODB storage');\n        }\n        return new ZeroDBStorage(this.config.backendConfig.zerodb);\n\n      case StorageBackend.LOCAL:\n        if (!this.config.backendConfig?.local) {\n          throw new Error('Local backend config is required when using LOCAL storage');\n        }\n        return new LocalStorage(this.config.backendConfig.local);\n\n      case StorageBackend.MEMORY:\n        return new MemoryStorage(this.config.backendConfig?.memory || {});\n\n      case StorageBackend.CUSTOM:\n        if (!this.config.backendConfig?.custom?.implementation) {\n          throw new Error('Custom storage backend implementation required');\n        }\n        return this.config.backendConfig.custom.implementation;\n\n      default:\n        throw new Error(`Unsupported storage backend: ${this.config.backend}`);\n    }\n  }\n\n  /**\n   * Initialize the logger\n   */\n  async initialize(): Promise<void> {\n    if (this.initialized) {\n      return;\n    }\n\n    await this.storage.initialize();\n\n    if (this.config.enableBatching) {\n      this.startBatchTimer();\n    }\n\n    if (this.config.enableSessionTracking) {\n      this.startSession();\n    }\n\n    this.initialized = true;\n    this.log('RLHFLogger initialized');\n  }\n\n  /**\n   * Log an AI interaction\n   */\n  async logInteraction(\n    prompt: string,\n    response: string,\n    metadata?: {\n      model?: string;\n      modelParams?: Record<string, any>;\n      latency?: number;\n      tokenUsage?: { prompt: number; completion: number; total: number };\n      userId?: string;\n      sessionId?: string;\n      context?: Array<{ role: 'user' | 'assistant' | 'system'; content: string }>;\n      [key: string]: any;\n    }\n  ): Promise<string> {\n    const interactionId = this.config.autoGenerateIds ? randomUUID() : metadata?.['id'];\n\n    if (!interactionId) {\n      throw new Error('Interaction ID required when autoGenerateIds is disabled');\n    }\n\n    const interaction: InteractionLog = {\n      id: interactionId,\n      prompt,\n      response,\n      model: metadata?.model,\n      modelParams: metadata?.modelParams,\n      latency: metadata?.latency,\n      tokenUsage: metadata?.tokenUsage,\n      userId: metadata?.userId,\n      sessionId: metadata?.sessionId || this.currentSession?.id,\n      context: metadata?.context,\n      metadata: {\n        ...this.config.defaultMetadata,\n        ...metadata,\n      },\n      timestamp: new Date(),\n      feedbackIds: [],\n    };\n\n    if (this.config.enableBatching) {\n      this.addToBatch('interaction', interaction);\n    } else {\n      await this.storage.storeInteraction(interaction);\n    }\n\n    // Add to current session\n    if (this.currentSession) {\n      this.currentSession.interactionIds.push(interactionId);\n      this.resetSessionTimer();\n    }\n\n    this.log('Logged interaction:', interactionId);\n    return interactionId;\n  }\n\n  /**\n   * Log binary feedback (thumbs up/down)\n   */\n  async logBinaryFeedback(\n    interactionId: string,\n    value: BinaryFeedback,\n    metadata?: {\n      userId?: string;\n      sessionId?: string;\n      source?: string;\n      [key: string]: any;\n    }\n  ): Promise<string> {\n    const data: BinaryFeedbackData = {\n      value,\n      timestamp: new Date(),\n    };\n\n    return this.logFeedback(interactionId, FeedbackType.BINARY, data, metadata);\n  }\n\n  /**\n   * Log rating feedback (1-5 stars)\n   */\n  async logRating(\n    interactionId: string,\n    rating: number,\n    comment?: string,\n    metadata?: {\n      maxRating?: number;\n      userId?: string;\n      sessionId?: string;\n      source?: string;\n      [key: string]: any;\n    }\n  ): Promise<string> {\n    const maxRating = metadata?.maxRating || 5;\n\n    if (rating < 1 || rating > maxRating) {\n      throw new Error(`Rating must be between 1 and ${maxRating}`);\n    }\n\n    const data: RatingFeedbackData = {\n      rating,\n      maxRating,\n      comment,\n      timestamp: new Date(),\n    };\n\n    return this.logFeedback(interactionId, FeedbackType.RATING, data, metadata);\n  }\n\n  /**\n   * Log text feedback (comments)\n   */\n  async logTextFeedback(\n    interactionId: string,\n    comment: string,\n    sentiment?: 'positive' | 'negative' | 'neutral',\n    metadata?: {\n      userId?: string;\n      sessionId?: string;\n      source?: string;\n      [key: string]: any;\n    }\n  ): Promise<string> {\n    const data: TextFeedbackData = {\n      comment,\n      sentiment,\n      timestamp: new Date(),\n    };\n\n    return this.logFeedback(interactionId, FeedbackType.TEXT, data, metadata);\n  }\n\n  /**\n   * Log multi-dimensional feedback\n   */\n  async logMultiDimensionalFeedback(\n    interactionId: string,\n    dimensions: { [dimensionName: string]: number },\n    options?: {\n      weights?: { [dimensionName: string]: number };\n      overallComment?: string;\n      userId?: string;\n      sessionId?: string;\n      source?: string;\n      [key: string]: any;\n    }\n  ): Promise<string> {\n    const data: MultiDimensionalFeedbackData = {\n      dimensions,\n      weights: options?.weights,\n      overallComment: options?.overallComment,\n      timestamp: new Date(),\n    };\n\n    return this.logFeedback(interactionId, FeedbackType.MULTI_DIMENSIONAL, data, options);\n  }\n\n  /**\n   * Log comparative feedback\n   */\n  async logComparativeFeedback(\n    preferredResponseId: string,\n    comparedResponseIds: string[],\n    options?: {\n      reason?: string;\n      confidenceLevel?: number;\n      userId?: string;\n      sessionId?: string;\n      source?: string;\n      [key: string]: any;\n    }\n  ): Promise<string> {\n    if (options?.confidenceLevel !== undefined &&\n        (options.confidenceLevel < 0 || options.confidenceLevel > 1)) {\n      throw new Error('Confidence level must be between 0 and 1');\n    }\n\n    const data: ComparativeFeedbackData = {\n      preferredResponseId,\n      comparedResponseIds,\n      reason: options?.reason,\n      confidenceLevel: options?.confidenceLevel,\n      timestamp: new Date(),\n    };\n\n    return this.logFeedback(preferredResponseId, FeedbackType.COMPARATIVE, data, options);\n  }\n\n  /**\n   * Generic feedback logging method\n   */\n  async logFeedback(\n    interactionId: string,\n    type: FeedbackType,\n    data: FeedbackData,\n    metadata?: {\n      userId?: string;\n      sessionId?: string;\n      source?: string;\n      [key: string]: any;\n    }\n  ): Promise<string> {\n    const feedbackId = this.config.autoGenerateIds ? randomUUID() : metadata?.['id'];\n\n    if (!feedbackId) {\n      throw new Error('Feedback ID required when autoGenerateIds is disabled');\n    }\n\n    const feedback: Feedback = {\n      id: feedbackId,\n      interactionId,\n      type,\n      data,\n      userId: metadata?.userId,\n      sessionId: metadata?.sessionId || this.currentSession?.id,\n      source: metadata?.source,\n      metadata: {\n        ...this.config.defaultMetadata,\n        ...metadata,\n      },\n      timestamp: new Date(),\n    };\n\n    if (this.config.enableBatching) {\n      this.addToBatch('feedback', feedback);\n    } else {\n      await this.storage.storeFeedback(feedback);\n    }\n\n    // Add to current session\n    if (this.currentSession) {\n      this.currentSession.feedbackIds.push(feedbackId);\n      this.resetSessionTimer();\n    }\n\n    this.log('Logged feedback:', feedbackId);\n    return feedbackId;\n  }\n\n  /**\n   * Get feedback statistics\n   */\n  async getFeedbackStats(startTime?: Date, endTime?: Date): Promise<FeedbackStats> {\n    return this.storage.calculateStats(startTime, endTime);\n  }\n\n  /**\n   * Get interaction by ID\n   */\n  async getInteraction(interactionId: string): Promise<InteractionLog | null> {\n    return this.storage.getInteraction(interactionId);\n  }\n\n  /**\n   * Get feedback by ID\n   */\n  async getFeedback(feedbackId: string): Promise<Feedback | null> {\n    return this.storage.getFeedback(feedbackId);\n  }\n\n  /**\n   * Get all feedback for an interaction\n   */\n  async getFeedbackForInteraction(interactionId: string): Promise<Feedback[]> {\n    return this.storage.getFeedbackForInteraction(interactionId);\n  }\n\n  /**\n   * Get interactions in time range\n   */\n  async getInteractions(startTime: Date, endTime: Date, limit?: number): Promise<InteractionLog[]> {\n    return this.storage.getInteractions(startTime, endTime, limit);\n  }\n\n  /**\n   * Get feedback in time range\n   */\n  async getFeedbackInRange(startTime: Date, endTime: Date, limit?: number): Promise<Feedback[]> {\n    return this.storage.getFeedbackInRange(startTime, endTime, limit);\n  }\n\n  /**\n   * Export feedback data\n   */\n  async exportFeedback(\n    format: ExportFormat,\n    options?: Omit<ExportOptions, 'format'>\n  ): Promise<string | Buffer> {\n    const exportOptions: ExportOptions = {\n      format,\n      includeInteractions: true,\n      includeFeedback: true,\n      includeMetadata: true,\n      prettyPrint: format === ExportFormat.JSON,\n      ...options,\n    };\n\n    return this.storage.exportData(\n      exportOptions.format,\n      exportOptions.startTime,\n      exportOptions.endTime\n    );\n  }\n\n  /**\n   * Query and analyze feedback\n   */\n  async queryFeedback(filter: FeedbackFilter): Promise<Feedback[]> {\n    // Get all feedback in range without limit (limit is applied after offset)\n    let feedback = await this.storage.getFeedbackInRange(\n      filter.startTime || new Date(0),\n      filter.endTime || new Date()\n    );\n\n    // Apply filters\n    if (filter.types && filter.types.length > 0) {\n      feedback = feedback.filter(f => filter.types!.includes(f.type));\n    }\n\n    if (filter.userId) {\n      feedback = feedback.filter(f => f.userId === filter.userId);\n    }\n\n    if (filter.sessionId) {\n      feedback = feedback.filter(f => f.sessionId === filter.sessionId);\n    }\n\n    if (filter.interactionIds && filter.interactionIds.length > 0) {\n      feedback = feedback.filter(f => filter.interactionIds!.includes(f.interactionId));\n    }\n\n    if (filter.source) {\n      feedback = feedback.filter(f => f.source === filter.source);\n    }\n\n    if (filter.minRating !== undefined || filter.maxRating !== undefined) {\n      feedback = feedback.filter(f => {\n        if (f.type === FeedbackType.RATING) {\n          const data = f.data as RatingFeedbackData;\n          if (filter.minRating !== undefined && data.rating < filter.minRating) {\n            return false;\n          }\n          if (filter.maxRating !== undefined && data.rating > filter.maxRating) {\n            return false;\n          }\n        }\n        return true;\n      });\n    }\n\n    // Apply offset first, then limit\n    if (filter.offset) {\n      feedback = feedback.slice(filter.offset);\n    }\n\n    if (filter.limit) {\n      feedback = feedback.slice(0, filter.limit);\n    }\n\n    return feedback;\n  }\n\n  /**\n   * Get analytics results\n   */\n  async getAnalytics(filter?: FeedbackFilter): Promise<AnalyticsResult> {\n    const stats = await this.storage.calculateStats(\n      filter?.startTime,\n      filter?.endTime\n    );\n\n    const result: AnalyticsResult = {\n      query: {\n        startTime: filter?.startTime,\n        endTime: filter?.endTime,\n        filters: filter,\n      },\n      stats,\n      generatedAt: new Date(),\n    };\n\n    return result;\n  }\n\n  /**\n   * Flush batch queue manually\n   */\n  async flush(): Promise<void> {\n    if (this.batchQueue.length === 0) {\n      return;\n    }\n\n    const interactions = this.batchQueue\n      .filter(op => op.type === 'interaction')\n      .map(op => op.data as InteractionLog);\n\n    const feedback = this.batchQueue\n      .filter(op => op.type === 'feedback')\n      .map(op => op.data as Feedback);\n\n    this.log(`Flushing batch: ${interactions.length} interactions, ${feedback.length} feedback`);\n\n    if (interactions.length > 0) {\n      await this.storage.storeInteractionsBatch(interactions);\n    }\n\n    if (feedback.length > 0) {\n      await this.storage.storeFeedbackBatch(feedback);\n    }\n\n    this.batchQueue = [];\n  }\n\n  /**\n   * Start a new feedback session\n   */\n  startSession(userId?: string, metadata?: Record<string, any>): string {\n    if (this.currentSession) {\n      this.endSession();\n    }\n\n    const sessionId = randomUUID();\n    this.currentSession = {\n      id: sessionId,\n      userId,\n      startTime: new Date(),\n      interactionIds: [],\n      feedbackIds: [],\n      metadata,\n    };\n\n    this.resetSessionTimer();\n    this.log('Started session:', sessionId);\n    return sessionId;\n  }\n\n  /**\n   * End current feedback session\n   */\n  endSession(): FeedbackSession | null {\n    if (!this.currentSession) {\n      return null;\n    }\n\n    this.currentSession.endTime = new Date();\n    const session = { ...this.currentSession };\n\n    if (this.sessionTimer) {\n      clearTimeout(this.sessionTimer);\n      this.sessionTimer = undefined;\n    }\n\n    this.currentSession = undefined;\n    this.log('Ended session:', session.id);\n    return session;\n  }\n\n  /**\n   * Get current session\n   */\n  getCurrentSession(): FeedbackSession | null {\n    return this.currentSession ? { ...this.currentSession } : null;\n  }\n\n  /**\n   * Close the logger and cleanup\n   */\n  async close(): Promise<void> {\n    this.log('Closing RLHFLogger');\n\n    // Flush any pending batches\n    if (this.config.enableBatching) {\n      await this.flush();\n      if (this.batchTimer) {\n        clearTimeout(this.batchTimer);\n        this.batchTimer = undefined;\n      }\n    }\n\n    // End current session\n    if (this.currentSession) {\n      this.endSession();\n    }\n\n    // Close storage\n    await this.storage.close();\n    this.initialized = false;\n  }\n\n  /**\n   * Add operation to batch queue\n   */\n  private addToBatch(type: 'interaction' | 'feedback', data: InteractionLog | Feedback): void {\n    this.batchQueue.push({\n      type,\n      data,\n      timestamp: new Date(),\n    });\n\n    // Flush if batch size reached\n    if (this.batchQueue.length >= (this.config.batchSize || 50)) {\n      this.flush().catch(err => {\n        console.error('Error flushing batch:', err);\n      });\n    }\n  }\n\n  /**\n   * Start batch timer\n   */\n  private startBatchTimer(): void {\n    this.batchTimer = setInterval(() => {\n      this.flush().catch(err => {\n        console.error('Error flushing batch:', err);\n      });\n    }, this.config.batchFlushInterval || 5000);\n  }\n\n  /**\n   * Reset session timeout timer\n   */\n  private resetSessionTimer(): void {\n    if (this.sessionTimer) {\n      clearTimeout(this.sessionTimer);\n    }\n\n    this.sessionTimer = setTimeout(() => {\n      this.log('Session timeout, ending session');\n      this.endSession();\n    }, this.config.sessionTimeout || 1800000);\n  }\n\n  /**\n   * Debug logging\n   */\n  private log(...args: any[]): void {\n    if (this.config.debug) {\n      console.log('[RLHFLogger]', ...args);\n    }\n  }\n}\n\n/**\n * Create a new RLHFLogger instance\n */\nexport function createRLHFLogger(config: RLHFConfig): RLHFLogger {\n  return new RLHFLogger(config);\n}\n","/**\n * RLHF Auto-Instrumentation\n *\n * Automatically captures AI stream interactions, feedback events,\n * and contextual data for Reinforcement Learning from Human Feedback (RLHF).\n */\n\nimport { EventEmitter } from 'events'\nimport type { AIStream } from '../streaming/AIStream'\nimport type { Message, Usage } from '../types'\nimport type {\n  InstrumentationConfig,\n  CapturedInteraction,\n  InstrumentationMetrics,\n  ContextData,\n  PerformanceMetrics,\n  FeedbackEvent,\n  ErrorEvent,\n  CustomInstrumentor,\n  InstrumentationMiddleware,\n  // InstrumentationStorage,\n  InteractionFilter,\n} from './instrumentation-types'\n\n/**\n * Default configuration for instrumentation\n */\nconst DEFAULT_CONFIG: Required<Omit<InstrumentationConfig, 'customContext' | 'onBufferFull' | 'onInteractionCaptured' | 'onFeedbackCaptured' | 'remoteEndpoint'>> = {\n  enabled: true,\n  captureInteractions: true,\n  captureFeedback: true,\n  captureMetrics: true,\n  captureErrors: true,\n  captureUsagePatterns: true,\n  collectContext: true,\n  sampleRate: 1.0,\n  maxBufferSize: 1000,\n  storage: 'memory',\n  batchSize: 10,\n  flushInterval: 60000,\n}\n\n/**\n * RLHFInstrumentation class\n *\n * Provides automatic instrumentation for AI streams to capture\n * interactions, feedback, and metrics for RLHF training.\n */\nexport class RLHFInstrumentation extends EventEmitter {\n  private config: InstrumentationConfig\n  private enabled: boolean = true\n  private sessionId: string\n  private buffer: CapturedInteraction[] = []\n  private metrics: InstrumentationMetrics\n  private customInstrumentors: CustomInstrumentor[] = []\n  private middleware: InstrumentationMiddleware[] = []\n  private flushTimer?: NodeJS.Timeout\n  private activeInteractions: Map<string, {\n    prompt: Message\n    startTime: number\n    firstTokenTime?: number\n  }> = new Map()\n\n  /**\n   * Create a new RLHF instrumentation instance\n   */\n  constructor(config: InstrumentationConfig = {}) {\n    super()\n    this.config = { ...DEFAULT_CONFIG, ...config }\n    this.enabled = this.config.enabled ?? true\n    this.sessionId = this.generateSessionId()\n\n    this.metrics = {\n      totalInteractions: 0,\n      totalFeedback: 0,\n      totalErrors: 0,\n      bufferSize: 0,\n      interactionsPerSession: new Map([[this.sessionId, 0]]),\n      averageResponseTime: 0,\n      averageTokensPerInteraction: 0,\n      feedbackRate: 0,\n      errorRate: 0,\n      positiveFeedbackRate: 0,\n      negativeFeedbackRate: 0,\n      startedAt: Date.now(),\n      remoteUploads: 0,\n      failedUploads: 0,\n    }\n\n    if (this.config.flushInterval && this.config.flushInterval > 0) {\n      this.startFlushTimer()\n    }\n  }\n\n  /**\n   * Instrument an AI stream for automatic capture\n   */\n  instrument(stream: AIStream): AIStream {\n    if (!this.enabled) {\n      return stream\n    }\n\n    // Listen to stream events\n    stream.on('message', (message: Message) => {\n      this.handleMessage(message)\n    })\n\n    stream.on('token', (token: string) => {\n      this.handleToken(token)\n    })\n\n    stream.on('usage', (usage: Usage) => {\n      this.handleUsage(usage)\n    })\n\n    stream.on('error', (error: Error) => {\n      this.handleError(error)\n    })\n\n    stream.on('streaming-start', () => {\n      this.handleStreamingStart()\n    })\n\n    stream.on('streaming-end', () => {\n      this.handleStreamingEnd()\n    })\n\n    stream.on('reset', () => {\n      this.handleReset()\n    })\n\n    return stream\n  }\n\n  /**\n   * Manually capture an interaction\n   */\n  captureInteraction(event: {\n    prompt: Message\n    response: Message\n    usage?: Usage\n    error?: Error\n  }): CapturedInteraction | null {\n    if (!this.enabled || !this.config.captureInteractions) {\n      return null\n    }\n\n    // Apply sampling\n    if (Math.random() > (this.config.sampleRate ?? 1.0)) {\n      return null\n    }\n\n    const context = this.collectContext()\n    const metrics = this.calculateMetrics(event)\n\n    const interaction: CapturedInteraction = {\n      id: this.generateId(),\n      sessionId: this.sessionId,\n      prompt: event.prompt,\n      response: event.response,\n      context,\n      metrics,\n      usage: event.usage,\n      feedback: [],\n      error: event.error ? this.createErrorEvent(event.error) : undefined,\n      timestamp: Date.now(),\n      metadata: {},\n    }\n\n    // Apply custom instrumentors\n    let processedInteraction: CapturedInteraction | null = interaction\n    for (const instrumentor of this.customInstrumentors) {\n      processedInteraction = instrumentor(processedInteraction)\n      if (!processedInteraction) {\n        return null\n      }\n    }\n\n    // Apply middleware\n    let middlewareIndex = 0\n    const runMiddleware = () => {\n      if (middlewareIndex < this.middleware.length) {\n        const current = this.middleware[middlewareIndex++]\n        if (current && processedInteraction) {\n          current(processedInteraction, runMiddleware)\n        }\n      } else {\n        if (processedInteraction) {\n          this.storeInteraction(processedInteraction)\n        }\n      }\n    }\n    runMiddleware()\n\n    return processedInteraction\n  }\n\n  /**\n   * Capture user feedback\n   */\n  captureFeedback(feedback: Omit<FeedbackEvent, 'id' | 'timestamp'>): void {\n    if (!this.enabled || !this.config.captureFeedback) {\n      return\n    }\n\n    const feedbackEvent: FeedbackEvent = {\n      id: this.generateId(),\n      timestamp: Date.now(),\n      ...feedback,\n    }\n\n    // Find the interaction and add feedback\n    const interaction = this.buffer.find(i => i.id === feedback.interactionId)\n    if (interaction) {\n      if (!interaction.feedback) {\n        interaction.feedback = []\n      }\n      interaction.feedback.push(feedbackEvent)\n    }\n\n    this.metrics.totalFeedback++\n    this.updateFeedbackMetrics(feedbackEvent)\n\n    this.emit('feedback-captured', feedbackEvent)\n\n    if (this.config.onFeedbackCaptured) {\n      this.config.onFeedbackCaptured(feedbackEvent)\n    }\n  }\n\n  /**\n   * Collect contextual data\n   */\n  collectContext(): ContextData {\n    if (!this.config.collectContext) {\n      return {}\n    }\n\n    const context: ContextData = {\n      timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n      language: typeof navigator !== 'undefined' ? navigator.language : undefined,\n      custom: this.config.customContext,\n    }\n\n    // Collect browser-specific context if available\n    if (typeof navigator !== 'undefined') {\n      context.userAgent = navigator.userAgent\n      context.platform = navigator.platform\n    }\n\n    if (typeof window !== 'undefined') {\n      context.url = window.location.href\n      context.referrer = document.referrer\n      context.screenResolution = `${window.screen.width}x${window.screen.height}`\n    }\n\n    // Determine device type\n    if (context.userAgent) {\n      context.deviceType = this.detectDeviceType(context.userAgent)\n    }\n\n    return context\n  }\n\n  /**\n   * Enable instrumentation\n   */\n  enable(): void {\n    this.enabled = true\n    this.emit('enabled')\n\n    if (this.config.flushInterval && !this.flushTimer) {\n      this.startFlushTimer()\n    }\n  }\n\n  /**\n   * Disable instrumentation\n   */\n  disable(): void {\n    this.enabled = false\n    this.emit('disabled')\n\n    if (this.flushTimer) {\n      clearInterval(this.flushTimer)\n      this.flushTimer = undefined\n    }\n  }\n\n  /**\n   * Get instrumentation metrics\n   */\n  getMetrics(): InstrumentationMetrics {\n    return { ...this.metrics }\n  }\n\n  /**\n   * Get captured interactions\n   */\n  getInteractions(filter?: InteractionFilter): CapturedInteraction[] {\n    let interactions = [...this.buffer]\n\n    if (!filter) {\n      return interactions\n    }\n\n    // Apply filters\n    if (filter.sessionId) {\n      interactions = interactions.filter(i => i.sessionId === filter.sessionId)\n    }\n\n    if (filter.startDate) {\n      interactions = interactions.filter(i => i.timestamp >= filter.startDate!)\n    }\n\n    if (filter.endDate) {\n      interactions = interactions.filter(i => i.timestamp <= filter.endDate!)\n    }\n\n    if (filter.hasFeedback !== undefined) {\n      interactions = interactions.filter(i =>\n        filter.hasFeedback ? (i.feedback && i.feedback.length > 0) : !i.feedback || i.feedback.length === 0\n      )\n    }\n\n    if (filter.hasError !== undefined) {\n      interactions = interactions.filter(i =>\n        filter.hasError ? !!i.error : !i.error\n      )\n    }\n\n    // Apply limit and offset\n    const offset = filter.offset ?? 0\n    const limit = filter.limit ?? interactions.length\n\n    return interactions.slice(offset, offset + limit)\n  }\n\n  /**\n   * Clear all captured data\n   */\n  clear(): void {\n    this.buffer = []\n    this.metrics.bufferSize = 0\n    this.activeInteractions.clear()\n  }\n\n  /**\n   * Flush buffered interactions\n   */\n  async flush(): Promise<void> {\n    if (this.buffer.length === 0) {\n      return\n    }\n\n    const interactions = [...this.buffer]\n\n    this.emit('flushed', interactions)\n\n    // Upload to remote endpoint if configured\n    if (this.config.storage === 'remote' && this.config.remoteEndpoint) {\n      await this.uploadToRemote(interactions)\n    }\n\n    this.metrics.lastFlushAt = Date.now()\n  }\n\n  /**\n   * Add custom instrumentor\n   */\n  addInstrumentor(instrumentor: CustomInstrumentor): void {\n    this.customInstrumentors.push(instrumentor)\n  }\n\n  /**\n   * Add middleware\n   */\n  addMiddleware(middleware: InstrumentationMiddleware): void {\n    this.middleware.push(middleware)\n  }\n\n  /**\n   * Remove custom instrumentor\n   */\n  removeInstrumentor(instrumentor: CustomInstrumentor): void {\n    const index = this.customInstrumentors.indexOf(instrumentor)\n    if (index > -1) {\n      this.customInstrumentors.splice(index, 1)\n    }\n  }\n\n  /**\n   * Remove middleware\n   */\n  removeMiddleware(middleware: InstrumentationMiddleware): void {\n    const index = this.middleware.indexOf(middleware)\n    if (index > -1) {\n      this.middleware.splice(index, 1)\n    }\n  }\n\n  /**\n   * Handle message event from stream\n   */\n  private handleMessage(message: Message): void {\n    if (message.role === 'user') {\n      // Start tracking this interaction\n      this.activeInteractions.set(message.id, {\n        prompt: message,\n        startTime: Date.now(),\n      })\n    } else if (message.role === 'assistant') {\n      // Complete the interaction\n      const activeInteraction = this.findActiveInteraction()\n      if (activeInteraction) {\n        this.completeInteraction(activeInteraction.prompt, message)\n      }\n    }\n  }\n\n  /**\n   * Handle token event from stream\n   */\n  private handleToken(_token: string): void {\n    if (!this.config.captureMetrics) {\n      return\n    }\n\n    const activeInteraction = this.findActiveInteraction()\n    if (activeInteraction && !activeInteraction.firstTokenTime) {\n      activeInteraction.firstTokenTime = Date.now()\n    }\n  }\n\n  /**\n   * Handle usage event from stream\n   */\n  private handleUsage(_usage: Usage): void {\n    // Usage will be attached to the interaction when completed\n  }\n\n  /**\n   * Handle error event from stream\n   */\n  private handleError(error: Error): void {\n    if (!this.config.captureErrors) {\n      return\n    }\n\n    const activeInteraction = this.findActiveInteraction()\n    if (activeInteraction) {\n      // Error will be attached to the interaction\n    }\n\n    this.metrics.totalErrors++\n    this.updateErrorRate()\n\n    this.emit('error-captured', this.createErrorEvent(error))\n  }\n\n  /**\n   * Handle streaming start event\n   */\n  private handleStreamingStart(): void {\n    // Streaming started\n  }\n\n  /**\n   * Handle streaming end event\n   */\n  private handleStreamingEnd(): void {\n    // Streaming ended\n  }\n\n  /**\n   * Handle reset event\n   */\n  private handleReset(): void {\n    this.activeInteractions.clear()\n  }\n\n  /**\n   * Find the most recent active interaction\n   */\n  private findActiveInteraction(): { prompt: Message; startTime: number; firstTokenTime?: number } | undefined {\n    // Get the most recent interaction\n    const entries = Array.from(this.activeInteractions.entries())\n    if (entries.length === 0) {\n      return undefined\n    }\n    const lastEntry = entries[entries.length - 1]\n    return lastEntry?.[1]\n  }\n\n  /**\n   * Complete an interaction\n   */\n  private completeInteraction(prompt: Message, response: Message): void {\n    this.captureInteraction({\n      prompt,\n      response,\n    })\n\n    // Remove from active interactions\n    this.activeInteractions.delete(prompt.id)\n  }\n\n  /**\n   * Store interaction in buffer\n   */\n  private storeInteraction(interaction: CapturedInteraction): void {\n    this.buffer.push(interaction)\n    this.metrics.bufferSize = this.buffer.length\n    this.metrics.totalInteractions++\n\n    // Update session interactions count\n    const sessionCount = this.metrics.interactionsPerSession.get(this.sessionId) ?? 0\n    this.metrics.interactionsPerSession.set(this.sessionId, sessionCount + 1)\n\n    this.metrics.lastInteractionAt = interaction.timestamp\n    this.updateAverageMetrics(interaction)\n\n    this.emit('interaction-captured', interaction)\n\n    if (this.config.onInteractionCaptured) {\n      this.config.onInteractionCaptured(interaction)\n    }\n\n    // Check buffer size\n    if (this.buffer.length >= (this.config.maxBufferSize ?? DEFAULT_CONFIG.maxBufferSize)) {\n      this.handleBufferFull()\n    }\n  }\n\n  /**\n   * Handle buffer full event\n   */\n  private handleBufferFull(): void {\n    const interactions = [...this.buffer]\n\n    this.emit('buffer-full', interactions)\n\n    if (this.config.onBufferFull) {\n      this.config.onBufferFull(interactions)\n    }\n\n    // Auto-flush if configured\n    if (this.config.storage === 'remote') {\n      this.flush().catch(error => {\n        console.error('Failed to flush buffer:', error)\n      })\n    }\n  }\n\n  /**\n   * Calculate performance metrics\n   */\n  private calculateMetrics(event: {\n    prompt: Message\n    response: Message\n  }): PerformanceMetrics {\n    const activeInteraction = this.activeInteractions.get(event.prompt.id)\n\n    const totalResponseTime = activeInteraction\n      ? Date.now() - activeInteraction.startTime\n      : event.response.timestamp - event.prompt.timestamp\n\n    const timeToFirstToken = activeInteraction?.firstTokenTime\n      ? activeInteraction.firstTokenTime - activeInteraction.startTime\n      : undefined\n\n    const metrics: PerformanceMetrics = {\n      totalResponseTime,\n      timeToFirstToken,\n      retryCount: 0,\n    }\n\n    return metrics\n  }\n\n  /**\n   * Create error event from Error object\n   */\n  private createErrorEvent(error: Error): ErrorEvent {\n    return {\n      message: error.message,\n      stack: error.stack,\n      type: error.name,\n      timestamp: Date.now(),\n      recoverable: false,\n    }\n  }\n\n  /**\n   * Update average metrics\n   */\n  private updateAverageMetrics(interaction: CapturedInteraction): void {\n    const total = this.metrics.totalInteractions\n\n    // Update average response time\n    this.metrics.averageResponseTime =\n      (this.metrics.averageResponseTime * (total - 1) + (interaction.metrics?.totalResponseTime ?? 0)) / total\n\n    // Update average tokens per interaction\n    const totalTokens = (interaction.usage?.totalTokens ?? 0)\n    this.metrics.averageTokensPerInteraction =\n      (this.metrics.averageTokensPerInteraction * (total - 1) + totalTokens) / total\n\n    // Update feedback rate\n    this.metrics.feedbackRate = this.metrics.totalFeedback / total\n\n    // Update error rate\n    this.updateErrorRate()\n  }\n\n  /**\n   * Update error rate\n   */\n  private updateErrorRate(): void {\n    if (this.metrics.totalInteractions > 0) {\n      this.metrics.errorRate = this.metrics.totalErrors / this.metrics.totalInteractions\n    }\n  }\n\n  /**\n   * Update feedback metrics\n   */\n  private updateFeedbackMetrics(feedback: FeedbackEvent): void {\n    const total = this.metrics.totalFeedback\n\n    if (total === 0) {\n      return\n    }\n\n    // Update feedback rate\n    if (this.metrics.totalInteractions > 0) {\n      this.metrics.feedbackRate = total / this.metrics.totalInteractions\n    }\n\n    // Update positive/negative feedback rates\n    let positiveCount = this.metrics.positiveFeedbackRate * (total - 1)\n    let negativeCount = this.metrics.negativeFeedbackRate * (total - 1)\n\n    if (feedback.type === 'thumbs-up' || (feedback.type === 'rating' && typeof feedback.value === 'number' && feedback.value > 3)) {\n      positiveCount++\n    } else if (feedback.type === 'thumbs-down' || (feedback.type === 'rating' && typeof feedback.value === 'number' && feedback.value <= 3)) {\n      negativeCount++\n    }\n\n    this.metrics.positiveFeedbackRate = positiveCount / total\n    this.metrics.negativeFeedbackRate = negativeCount / total\n  }\n\n  /**\n   * Start flush timer\n   */\n  private startFlushTimer(): void {\n    if (this.flushTimer) {\n      clearInterval(this.flushTimer)\n    }\n\n    this.flushTimer = setInterval(() => {\n      this.flush().catch(error => {\n        console.error('Scheduled flush failed:', error)\n      })\n    }, this.config.flushInterval ?? DEFAULT_CONFIG.flushInterval)\n  }\n\n  /**\n   * Upload interactions to remote endpoint\n   */\n  private async uploadToRemote(interactions: CapturedInteraction[]): Promise<void> {\n    if (!this.config.remoteEndpoint) {\n      return\n    }\n\n    const batchSize = this.config.batchSize ?? DEFAULT_CONFIG.batchSize\n    const batches: CapturedInteraction[][] = []\n\n    for (let i = 0; i < interactions.length; i += batchSize) {\n      batches.push(interactions.slice(i, i + batchSize))\n    }\n\n    for (const batch of batches) {\n      try {\n        const response = await fetch(this.config.remoteEndpoint, {\n          method: 'POST',\n          headers: {\n            'Content-Type': 'application/json',\n          },\n          body: JSON.stringify({\n            sessionId: this.sessionId,\n            interactions: batch,\n            timestamp: Date.now(),\n          }),\n        })\n\n        if (!response.ok) {\n          throw new Error(`Upload failed: ${response.status}`)\n        }\n\n        this.metrics.remoteUploads = (this.metrics.remoteUploads ?? 0) + 1\n      } catch (error) {\n        console.error('Failed to upload batch:', error)\n        this.metrics.failedUploads = (this.metrics.failedUploads ?? 0) + 1\n      }\n    }\n  }\n\n  /**\n   * Detect device type from user agent\n   */\n  private detectDeviceType(userAgent: string): 'desktop' | 'mobile' | 'tablet' | 'unknown' {\n    const ua = userAgent.toLowerCase()\n\n    if (/(tablet|ipad|playbook|silk)|(android(?!.*mobi))/i.test(ua)) {\n      return 'tablet'\n    }\n\n    if (/Mobile|iP(hone|od)|Android|BlackBerry|IEMobile|Kindle|Silk-Accelerated|(hpw|web)OS|Opera M(obi|ini)/.test(ua)) {\n      return 'mobile'\n    }\n\n    return 'desktop'\n  }\n\n  /**\n   * Generate unique ID\n   */\n  private generateId(): string {\n    return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n  }\n\n  /**\n   * Generate session ID\n   */\n  private generateSessionId(): string {\n    return `session-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n  }\n\n  /**\n   * Clean up resources\n   */\n  destroy(): void {\n    this.disable()\n    this.clear()\n    this.removeAllListeners()\n    this.customInstrumentors = []\n    this.middleware = []\n  }\n}\n\n/**\n * Create a new instrumentation instance\n */\nexport function createInstrumentation(config?: InstrumentationConfig): RLHFInstrumentation {\n  return new RLHFInstrumentation(config)\n}\n"]}