{"version":3,"sources":["../src/compute/rlhf/reward-model.ts","../src/compute/rlhf/trainer.ts","../src/compute/rlhf/federated-sync.ts"],"names":[],"mappings":"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","file":"chunk-Q76TV5IJ.mjs","sourcesContent":["/**\n * Reward Model\n *\n * Lightweight neural network that predicts reward from hidden states.\n * Trained on-device using user feedback.\n */\n\nexport interface RewardModelConfig {\n  inputDim: number; // Model hidden dimension\n  hiddenDim?: number; // Reward head hidden dimension\n  learningRate?: number;\n}\n\nexport class RewardModel {\n  private inputDim: number;\n  private hiddenDim: number;\n  private learningRate: number;\n\n  // Weights\n  private w1: Float32Array;\n  private b1: Float32Array;\n  private w2: Float32Array;\n  private b2: number;\n\n  // Gradient accumulators for batch training\n  private dw1: Float32Array;\n  private db1: Float32Array;\n  private dw2: Float32Array;\n  private db2 = 0;\n  private gradCount = 0;\n\n  constructor(config: RewardModelConfig) {\n    this.inputDim = config.inputDim;\n    this.hiddenDim = config.hiddenDim ?? 64;\n    this.learningRate = config.learningRate ?? 0.001;\n\n    // Initialize weights with Xavier/He initialization\n    const scale1 = Math.sqrt(2 / this.inputDim);\n    const scale2 = Math.sqrt(2 / this.hiddenDim);\n\n    this.w1 = new Float32Array(this.inputDim * this.hiddenDim);\n    this.b1 = new Float32Array(this.hiddenDim);\n    this.w2 = new Float32Array(this.hiddenDim);\n    this.b2 = 0;\n\n    for (let i = 0; i < this.w1.length; i++) {\n      this.w1[i] = (Math.random() * 2 - 1) * scale1;\n    }\n    for (let i = 0; i < this.w2.length; i++) {\n      this.w2[i] = (Math.random() * 2 - 1) * scale2;\n    }\n\n    // Initialize gradient accumulators\n    this.dw1 = new Float32Array(this.inputDim * this.hiddenDim);\n    this.db1 = new Float32Array(this.hiddenDim);\n    this.dw2 = new Float32Array(this.hiddenDim);\n  }\n\n  /**\n   * Forward pass: hidden state -> reward prediction\n   */\n  forward(hiddenState: Float32Array): number {\n    // Linear layer 1 + ReLU\n    const h1 = new Float32Array(this.hiddenDim);\n    for (let i = 0; i < this.hiddenDim; i++) {\n      let sum = this.b1[i];\n      for (let j = 0; j < this.inputDim; j++) {\n        sum += hiddenState[j] * this.w1[j * this.hiddenDim + i];\n      }\n      h1[i] = Math.max(0, sum); // ReLU\n    }\n\n    // Linear layer 2 -> scalar\n    let reward = this.b2;\n    for (let i = 0; i < this.hiddenDim; i++) {\n      reward += h1[i] * this.w2[i];\n    }\n\n    // Tanh to bound to [-1, 1]\n    return Math.tanh(reward);\n  }\n\n  /**\n   * Backward pass: compute gradients from feedback\n   */\n  backward(hiddenState: Float32Array, targetReward: number): void {\n    // Forward pass with saved activations\n    const h1 = new Float32Array(this.hiddenDim);\n    const preRelu = new Float32Array(this.hiddenDim);\n\n    for (let i = 0; i < this.hiddenDim; i++) {\n      let sum = this.b1[i];\n      for (let j = 0; j < this.inputDim; j++) {\n        sum += hiddenState[j] * this.w1[j * this.hiddenDim + i];\n      }\n      preRelu[i] = sum;\n      h1[i] = Math.max(0, sum);\n    }\n\n    let preOutput = this.b2;\n    for (let i = 0; i < this.hiddenDim; i++) {\n      preOutput += h1[i] * this.w2[i];\n    }\n    const output = Math.tanh(preOutput);\n\n    // MSE loss gradient\n    const dLoss = 2 * (output - targetReward);\n\n    // Tanh gradient\n    const dTanh = 1 - output * output;\n    const dPreOutput = dLoss * dTanh;\n\n    // Layer 2 gradients\n    this.db2 += dPreOutput;\n    for (let i = 0; i < this.hiddenDim; i++) {\n      this.dw2[i] += dPreOutput * h1[i];\n    }\n\n    // Layer 1 gradients (through ReLU)\n    const dh1 = new Float32Array(this.hiddenDim);\n    for (let i = 0; i < this.hiddenDim; i++) {\n      dh1[i] = dPreOutput * this.w2[i] * (preRelu[i] > 0 ? 1 : 0);\n    }\n\n    for (let i = 0; i < this.hiddenDim; i++) {\n      this.db1[i] += dh1[i];\n      for (let j = 0; j < this.inputDim; j++) {\n        this.dw1[j * this.hiddenDim + i] += dh1[i] * hiddenState[j];\n      }\n    }\n\n    this.gradCount++;\n  }\n\n  /**\n   * Apply accumulated gradients\n   */\n  applyGradients(): void {\n    if (this.gradCount === 0) return;\n\n    const scale = this.learningRate / this.gradCount;\n\n    // Update weights\n    for (let i = 0; i < this.w1.length; i++) {\n      this.w1[i] -= scale * this.dw1[i];\n    }\n    for (let i = 0; i < this.b1.length; i++) {\n      this.b1[i] -= scale * this.db1[i];\n    }\n    for (let i = 0; i < this.w2.length; i++) {\n      this.w2[i] -= scale * this.dw2[i];\n    }\n    this.b2 -= scale * this.db2;\n\n    // Reset accumulators\n    this.dw1.fill(0);\n    this.db1.fill(0);\n    this.dw2.fill(0);\n    this.db2 = 0;\n    this.gradCount = 0;\n  }\n\n  /**\n   * Get gradient update for federated learning\n   */\n  getGradientUpdate(): ArrayBuffer {\n    const data = new Float32Array(\n      this.w1.length + this.b1.length + this.w2.length + 2\n    );\n    let offset = 0;\n\n    // Pack gradients\n    for (let i = 0; i < this.dw1.length; i++) {\n      data[offset++] = this.dw1[i];\n    }\n    for (let i = 0; i < this.db1.length; i++) {\n      data[offset++] = this.db1[i];\n    }\n    for (let i = 0; i < this.dw2.length; i++) {\n      data[offset++] = this.dw2[i];\n    }\n    data[offset++] = this.db2;\n    data[offset++] = this.gradCount;\n\n    return data.buffer;\n  }\n\n  /**\n   * Apply gradient update from federated learning\n   */\n  applyGradientUpdate(update: ArrayBuffer): void {\n    const data = new Float32Array(update);\n    let offset = 0;\n\n    for (let i = 0; i < this.w1.length; i++) {\n      this.w1[i] -= this.learningRate * data[offset++];\n    }\n    for (let i = 0; i < this.b1.length; i++) {\n      this.b1[i] -= this.learningRate * data[offset++];\n    }\n    for (let i = 0; i < this.w2.length; i++) {\n      this.w2[i] -= this.learningRate * data[offset++];\n    }\n    this.b2 -= this.learningRate * data[offset++];\n  }\n\n  /**\n   * Save weights to ArrayBuffer\n   */\n  getWeights(): ArrayBuffer {\n    const data = new Float32Array(\n      this.w1.length + this.b1.length + this.w2.length + 1\n    );\n    let offset = 0;\n\n    for (let i = 0; i < this.w1.length; i++) {\n      data[offset++] = this.w1[i];\n    }\n    for (let i = 0; i < this.b1.length; i++) {\n      data[offset++] = this.b1[i];\n    }\n    for (let i = 0; i < this.w2.length; i++) {\n      data[offset++] = this.w2[i];\n    }\n    data[offset++] = this.b2;\n\n    return data.buffer;\n  }\n\n  /**\n   * Load weights from ArrayBuffer\n   */\n  loadWeights(weights: ArrayBuffer): void {\n    const data = new Float32Array(weights);\n    let offset = 0;\n\n    for (let i = 0; i < this.w1.length; i++) {\n      this.w1[i] = data[offset++];\n    }\n    for (let i = 0; i < this.b1.length; i++) {\n      this.b1[i] = data[offset++];\n    }\n    for (let i = 0; i < this.w2.length; i++) {\n      this.w2[i] = data[offset++];\n    }\n    this.b2 = data[offset++];\n  }\n}\n","/**\n * RLHF Trainer\n *\n * Manages on-device training from user feedback.\n */\n\nimport type { BaseStorage } from '../../data/storage/base-storage';\nimport type {\n  RLHFFeedback,\n  UserAdapter,\n  Modality,\n  GradientEnvelope,\n} from '../../types';\nimport { RewardModel } from './reward-model';\nimport { FederatedSync } from './federated-sync';\n\nexport interface RLHFTrainerConfig {\n  storage: BaseStorage;\n  modelId: string;\n  userId: string;\n  hiddenDim: number;\n  modality?: Modality;\n  learningRate?: number;\n  batchSize?: number;\n  federatedSync?: FederatedSync;\n  communityParticipation?: boolean;\n}\n\nexport class RLHFTrainer {\n  private storage: BaseStorage;\n  private modelId: string;\n  private userId: string;\n  private modality: Modality;\n  private rewardModel: RewardModel;\n  private batchSize: number;\n  private adapterId: string;\n  private pendingFeedback: RLHFFeedback[] = [];\n  private trainingExamples = 0;\n  private lastTrained?: string;\n  private federatedSync: FederatedSync | null;\n  private communityParticipation: boolean;\n\n  constructor(config: RLHFTrainerConfig) {\n    this.storage = config.storage;\n    this.modelId = config.modelId;\n    this.userId = config.userId;\n    this.modality = config.modality ?? 'text';\n    this.batchSize = config.batchSize ?? 8;\n    this.adapterId = `${config.modelId}:${config.userId}:${this.modality}:reward`;\n    this.federatedSync = config.federatedSync ?? null;\n    this.communityParticipation = config.communityParticipation ?? false;\n\n    this.rewardModel = new RewardModel({\n      inputDim: config.hiddenDim,\n      learningRate: config.learningRate ?? 0.001,\n    });\n  }\n\n  /**\n   * Initialize trainer and load existing adapter if available\n   */\n  async initialize(): Promise<void> {\n    const adapter = await this.storage.getUserAdapter(\n      this.modelId,\n      this.userId,\n      this.adapterId\n    );\n    if (adapter) {\n      this.rewardModel.loadWeights(adapter.weights);\n      this.trainingExamples = adapter.trainingExamples;\n      this.lastTrained = adapter.lastUpdated;\n    }\n  }\n\n  /**\n   * Record feedback for a response\n   */\n  async recordFeedback(feedback: RLHFFeedback): Promise<void> {\n    if (!feedback.hiddenState) {\n      throw new Error('Hidden state required for RLHF feedback');\n    }\n\n    // Add to pending feedback\n    this.pendingFeedback.push(feedback);\n\n    // Log the feedback\n    await this.storage.addTrainingLogEntry({\n      adapterId: this.adapterId,\n      messageHash: feedback.messageHash,\n      feedback: feedback.feedback,\n      createdAt: new Date().toISOString(),\n    });\n\n    // Auto-train when batch is full\n    if (this.pendingFeedback.length >= this.batchSize) {\n      await this.train();\n    }\n  }\n\n  /**\n   * Train on accumulated feedback\n   */\n  async train(batchSize?: number): Promise<void> {\n    const batch = this.pendingFeedback.splice(\n      0,\n      batchSize ?? this.pendingFeedback.length\n    );\n    if (batch.length === 0) return;\n\n    // Backward pass for each example\n    for (const feedback of batch) {\n      if (feedback.hiddenState) {\n        this.rewardModel.backward(feedback.hiddenState, feedback.feedback);\n      }\n    }\n\n    // Apply gradients\n    this.rewardModel.applyGradients();\n    this.trainingExamples += batch.length;\n    this.lastTrained = new Date().toISOString();\n\n    // Save updated adapter\n    await this.saveAdapter();\n  }\n\n  /**\n   * Predict reward for a hidden state\n   */\n  predict(hiddenState: Float32Array): number {\n    return this.rewardModel.forward(hiddenState);\n  }\n\n  /**\n   * Get adapter weights for sync\n   */\n  async getAdapterWeights(): Promise<ArrayBuffer> {\n    return this.rewardModel.getWeights();\n  }\n\n  /**\n   * Load adapter weights\n   */\n  async loadAdapterWeights(weights: ArrayBuffer): Promise<void> {\n    this.rewardModel.loadWeights(weights);\n    await this.saveAdapter();\n  }\n\n  /**\n   * Get gradient update for federated learning\n   */\n  getGradientUpdate(): ArrayBuffer {\n    return this.rewardModel.getGradientUpdate();\n  }\n\n  /**\n   * Apply gradient update from federated learning\n   */\n  async applyGradientUpdate(update: ArrayBuffer): Promise<void> {\n    this.rewardModel.applyGradientUpdate(update);\n    await this.saveAdapter();\n  }\n\n  /**\n   * Get training statistics\n   */\n  getStats(): { examples: number; lastTrained?: string } {\n    return {\n      examples: this.trainingExamples,\n      lastTrained: this.lastTrained,\n    };\n  }\n\n  /**\n   * Save adapter to storage\n   */\n  private async saveAdapter(): Promise<void> {\n    const adapter: UserAdapter = {\n      id: this.adapterId,\n      modelId: this.modelId,\n      userId: this.userId,\n      adapterType: 'reward_head',\n      weights: this.rewardModel.getWeights(),\n      trainingExamples: this.trainingExamples,\n      lastUpdated: new Date().toISOString(),\n    };\n    await this.storage.setUserAdapter(adapter);\n  }\n\n  /**\n   * Sync adapter updates with server (federated learning)\n   */\n  async syncUpdates(): Promise<void> {\n    await this.saveAdapter();\n    if (!this.communityParticipation || !this.federatedSync) {\n      return;\n    }\n\n    const aggregated = await this.federatedSync.sync({\n      gradients: this.getGradientUpdate(),\n      feedbackCount: this.trainingExamples,\n      deviceId: this.userId,\n      modelId: this.modelId,\n      modality: this.modality,\n      baseVersion: 'local-v1',\n      adapterBaseVersion: this.lastTrained || 'local',\n    });\n\n    if (aggregated) {\n      await this.applyGradientUpdate(aggregated);\n    }\n  }\n\n  /**\n   * Enable/disable community update sharing.\n   */\n  setCommunityParticipation(enabled: boolean): void {\n    this.communityParticipation = enabled;\n  }\n\n  /**\n   * Build a signed envelope payload for external aggregation services.\n   */\n  toGradientEnvelope(\n    deviceProof: string,\n    dpNoiseSeedId: string\n  ): GradientEnvelope {\n    return {\n      modality: this.modality,\n      modelId: this.modelId,\n      baseVersion: 'local-v1',\n      adapterBaseVersion: this.lastTrained || 'local',\n      clippedDelta: this.getGradientUpdate(),\n      dpNoiseSeedId,\n      deviceProof,\n      createdAt: new Date().toISOString(),\n    };\n  }\n}\n","/**\n * Federated Sync\n *\n * Privacy-preserving synchronization of adapter updates.\n */\n\nimport type { GradientEnvelope, Modality } from '../../types';\n\nexport interface FederatedSyncConfig {\n  hubUrl: string;\n  modelId: string;\n  deviceId: string;\n  epsilon?: number; // Differential privacy epsilon\n  clipNorm?: number; // L2 clipping norm\n  noiseMultiplier?: number; // Laplace noise multiplier\n  minCohort?: number; // Minimum aggregation cohort\n}\n\nexport interface GradientUpdate {\n  gradients: ArrayBuffer;\n  feedbackCount: number;\n  deviceId: string;\n  modelId: string;\n  modality: Modality;\n  baseVersion: string;\n  adapterBaseVersion: string;\n}\n\nexport class FederatedSync {\n  private hubUrl: string;\n  private modelId: string;\n  private deviceId: string;\n  private epsilon: number;\n  private clipNorm: number;\n  private noiseMultiplier: number;\n  private minCohort: number;\n\n  constructor(config: FederatedSyncConfig) {\n    this.hubUrl = config.hubUrl.replace(/\\/$/, '');\n    this.modelId = config.modelId;\n    this.deviceId = config.deviceId;\n    this.epsilon = config.epsilon ?? 1.0;\n    this.clipNorm = config.clipNorm ?? 1.0;\n    this.noiseMultiplier = config.noiseMultiplier ?? 0.6;\n    this.minCohort = config.minCohort ?? 128;\n  }\n\n  /**\n   * Clip gradients to a fixed L2 norm bound.\n   */\n  private clipGradients(gradients: ArrayBuffer): ArrayBuffer {\n    const data = new Float32Array(gradients);\n    let squaredNorm = 0;\n    for (let i = 0; i < data.length; i++) {\n      squaredNorm += data[i] * data[i];\n    }\n    const norm = Math.sqrt(squaredNorm);\n    if (norm === 0 || norm <= this.clipNorm) {\n      return gradients;\n    }\n\n    const scale = this.clipNorm / norm;\n    const clipped = new Float32Array(data.length);\n    for (let i = 0; i < data.length; i++) {\n      clipped[i] = data[i] * scale;\n    }\n    return clipped.buffer;\n  }\n\n  /**\n   * Add differential privacy noise to gradients\n   */\n  private addDifferentialPrivacyNoise(gradients: ArrayBuffer): ArrayBuffer {\n    const data = new Float32Array(gradients);\n    const noisy = new Float32Array(data.length);\n\n    // Laplace noise for differential privacy\n    for (let i = 0; i < data.length; i++) {\n      const u = Math.random() - 0.5;\n      const noise =\n        -(this.noiseMultiplier / Math.max(this.epsilon, 1e-6)) *\n        Math.sign(u) *\n        Math.log(1 - 2 * Math.abs(u));\n      noisy[i] = data[i] + noise;\n    }\n\n    return noisy.buffer;\n  }\n\n  /**\n   * Build a gradient envelope compatible with D1/Dash sync metadata.\n   */\n  buildEnvelope(update: GradientUpdate, deviceProof: string): GradientEnvelope {\n    const clipped = this.clipGradients(update.gradients);\n    const noised = this.addDifferentialPrivacyNoise(clipped);\n    return {\n      modality: update.modality,\n      modelId: update.modelId,\n      baseVersion: update.baseVersion,\n      adapterBaseVersion: update.adapterBaseVersion,\n      clippedDelta: noised,\n      dpNoiseSeedId: crypto.randomUUID(),\n      deviceProof,\n      createdAt: new Date().toISOString(),\n    };\n  }\n\n  /**\n   * Send gradient update to hub\n   */\n  async sendUpdate(update: GradientUpdate): Promise<void> {\n    const envelope = this.buildEnvelope(update, update.deviceId);\n    const cohortHeaders: Record<string, string> = {\n      'Content-Type': 'application/octet-stream',\n      'X-Model-Id': this.modelId,\n      'X-Device-Id': this.deviceId,\n      'X-Feedback-Count': String(update.feedbackCount),\n      'X-Modality': update.modality,\n      'X-Base-Version': update.baseVersion,\n      'X-Adapter-Base-Version': update.adapterBaseVersion,\n      'X-Min-Cohort': String(this.minCohort),\n      'X-DP-Noise-Seed-Id': envelope.dpNoiseSeedId,\n      'X-Device-Proof': envelope.deviceProof,\n    };\n\n    const response = await fetch(`${this.hubUrl}/updates`, {\n      method: 'POST',\n      headers: cohortHeaders,\n      body: envelope.clippedDelta,\n    });\n\n    if (!response.ok) {\n      throw new Error(`Failed to send update: ${response.statusText}`);\n    }\n  }\n\n  /**\n   * Fetch aggregated update from hub\n   */\n  async fetchAggregatedUpdate(): Promise<ArrayBuffer | null> {\n    const response = await fetch(`${this.hubUrl}/aggregated/${this.modelId}`, {\n      headers: {\n        'X-Device-Id': this.deviceId,\n        'X-Min-Cohort': String(this.minCohort),\n      },\n    });\n\n    if (response.status === 304) {\n      // No new updates\n      return null;\n    }\n\n    if (!response.ok) {\n      throw new Error(`Failed to fetch update: ${response.statusText}`);\n    }\n\n    return response.arrayBuffer();\n  }\n\n  /**\n   * Full sync cycle: send local update, receive aggregated\n   */\n  async sync(localUpdate: GradientUpdate): Promise<ArrayBuffer | null> {\n    // Send our update\n    await this.sendUpdate(localUpdate);\n\n    // Fetch aggregated update\n    return this.fetchAggregatedUpdate();\n  }\n}\n\n/**\n * Federated averaging for the hub\n */\nexport function federatedAverage(\n  updates: Array<{ weights: Float32Array; count: number }>\n): Float32Array {\n  if (updates.length === 0) {\n    throw new Error('No updates to average');\n  }\n\n  const totalCount = updates.reduce((sum, u) => sum + u.count, 0);\n  const length = updates[0].weights.length;\n  const result = new Float32Array(length);\n\n  for (const update of updates) {\n    const weight = update.count / totalCount;\n    for (let i = 0; i < length; i++) {\n      result[i] += update.weights[i] * weight;\n    }\n  }\n\n  return result;\n}\n"]}