{"version":3,"file":"browser.mjs","sources":["../src/storage/browser.ts","../src/platform/browser.ts","../src/browser.ts"],"sourcesContent":["import { openDB, IDBPDatabase } from 'idb';\nimport { Activity } from '../types.js';\nimport { ActivityStorage } from './types.js';\n\nconst DB_NAME = 'jules-activities';\nconst STORE_NAME = 'activities';\n\n/**\n * Browser implementation of ActivityStorage using IndexedDB.\n * Allows for persistent storage of activities in the browser.\n */\nexport class BrowserStorage implements ActivityStorage {\n  private sessionId: string;\n  private dbPromise: Promise<IDBPDatabase<unknown>> | null = null;\n\n  constructor(sessionId: string) {\n    this.sessionId = sessionId;\n  }\n\n  private getDb(): Promise<IDBPDatabase<unknown>> {\n    if (!this.dbPromise) {\n      // We use version 2 here as well to match BrowserPlatform and avoid conflicts.\n      // We don't necessarily need to know about 'artifacts' store here, but we must use the same version.\n      this.dbPromise = openDB(DB_NAME, 2, {\n        upgrade(db, oldVersion, newVersion, transaction) {\n          if (oldVersion < 1) {\n            if (!db.objectStoreNames.contains(STORE_NAME)) {\n              const store = db.createObjectStore(STORE_NAME, {\n                keyPath: 'id',\n              });\n              // Index to efficiently find the latest activity for a session\n              store.createIndex('sessionTimestamp', [\n                'sessionId',\n                'createTime',\n              ]);\n            }\n          }\n          // Ensure artifacts store exists if we are upgrading to v2 or from scratch\n          // This might duplicate logic in BrowserPlatform, but it's safer if both can upgrade.\n          if (!db.objectStoreNames.contains('artifacts')) {\n            const store = db.createObjectStore('artifacts', {\n              keyPath: 'filepath',\n            });\n            store.createIndex('activityId', 'activityId');\n          }\n        },\n      });\n    }\n    return this.dbPromise;\n  }\n\n  /**\n   * Initializes the storage.\n   *\n   * **Side Effects:**\n   * - Opens an IndexedDB connection.\n   * - Upgrades the database schema to v2 if necessary (creating object stores).\n   */\n  async init(): Promise<void> {\n    // openDB handles initialization, so just call it to ensure DB is ready.\n    await this.getDb();\n  }\n\n  /**\n   * Closes the storage connection.\n   */\n  async close(): Promise<void> {\n    if (this.dbPromise) {\n      const db = await this.dbPromise;\n      db.close();\n      this.dbPromise = null;\n    }\n  }\n\n  /**\n   * Appends an activity to IndexedDB.\n   *\n   * **Side Effects:**\n   * - Adds a `sessionId` field to the activity for indexing.\n   * - Writes the modified activity to the `activities` object store.\n   */\n  async append(activity: Activity): Promise<void> {\n    const db = await this.getDb();\n    const tx = db.transaction(STORE_NAME, 'readwrite');\n    const store = tx.objectStore(STORE_NAME);\n    // Add sessionId to the object for indexing\n    const storableActivity = { ...activity, sessionId: this.sessionId };\n    await store.put(storableActivity);\n    await tx.done;\n  }\n\n  /**\n   * Retrieves an activity by ID.\n   */\n  async get(activityId: string): Promise<Activity | undefined> {\n    const db = await this.getDb();\n    const activity = await db.get(STORE_NAME, activityId);\n    // Strip sessionId before returning\n    if (activity) {\n      delete (activity as any).sessionId;\n    }\n    return activity as Activity | undefined;\n  }\n\n  /**\n   * Retrieves the latest activity for the current session.\n   *\n   * **Logic:**\n   * - Uses the `sessionTimestamp` index to query efficiently.\n   * - Opens a cursor in 'prev' direction to find the last entry first.\n   */\n  async latest(): Promise<Activity | undefined> {\n    const db = await this.getDb();\n    const tx = db.transaction(STORE_NAME, 'readonly');\n    const store = tx.objectStore(STORE_NAME);\n    const index = store.index('sessionTimestamp');\n\n    // Create a key range for just this session\n    const range = IDBKeyRange.bound(\n      [this.sessionId, ''],\n      [this.sessionId, new Date(8640000000000000).toISOString()],\n    );\n\n    const cursor = await index.openCursor(range, 'prev');\n    if (!cursor) {\n      return undefined;\n    }\n    const activity = cursor.value;\n    // Strip sessionId before returning\n    if (activity) {\n      delete (activity as any).sessionId;\n    }\n    return activity as Activity | undefined;\n  }\n\n  /**\n   * Yields all activities for the current session.\n   */\n  async *scan(): AsyncIterable<Activity> {\n    const db = await this.getDb();\n    const tx = db.transaction(STORE_NAME, 'readonly');\n    const store = tx.objectStore(STORE_NAME);\n    const index = store.index('sessionTimestamp');\n\n    const range = IDBKeyRange.bound(\n      [this.sessionId, ''],\n      [this.sessionId, new Date(8640000000000000).toISOString()],\n    );\n\n    let cursor = await index.openCursor(range, 'next');\n\n    while (cursor) {\n      const activity = cursor.value;\n      if (activity) {\n        delete (activity as any).sessionId;\n      }\n      yield activity as Activity;\n      cursor = await cursor.continue();\n    }\n  }\n}\n","import { openDB, IDBPDatabase } from 'idb';\nimport { Platform, PlatformResponse } from './types.js';\n\nconst DB_NAME = 'jules-activities';\nconst ARTIFACTS_STORE_NAME = 'artifacts';\nconst ACTIVITIES_STORE_NAME = 'activities';\n\n/**\n * Browser implementation of the Platform interface.\n * Uses IndexedDB for file storage.\n */\nexport class BrowserPlatform implements Platform {\n  private dbPromise: Promise<IDBPDatabase<unknown>> | null = null;\n\n  private getDb(): Promise<IDBPDatabase<unknown>> {\n    if (!this.dbPromise) {\n      this.dbPromise = openDB(DB_NAME, 2, {\n        upgrade(db, oldVersion, newVersion, transaction) {\n          // Ensure activities store exists (copied from BrowserStorage to avoid race conditions)\n          if (!db.objectStoreNames.contains(ACTIVITIES_STORE_NAME)) {\n            const store = db.createObjectStore(ACTIVITIES_STORE_NAME, {\n              keyPath: 'id',\n            });\n            store.createIndex('sessionTimestamp', ['sessionId', 'createTime']);\n          }\n          // Ensure artifacts store exists\n          if (!db.objectStoreNames.contains(ARTIFACTS_STORE_NAME)) {\n            const store = db.createObjectStore(ARTIFACTS_STORE_NAME, {\n              keyPath: 'filepath',\n            });\n            store.createIndex('activityId', 'activityId');\n          }\n        },\n      });\n    }\n    return this.dbPromise;\n  }\n\n  /**\n   * Saves a file to IndexedDB.\n   *\n   * **Data Transformation:**\n   * - Decodes base64 data into a `Blob`.\n   *\n   * **Side Effects:**\n   * - Stores the blob in the `artifacts` object store.\n   * - Associates the file with the `activityId` (if provided).\n   *\n   * @throws {Error} If the encoding is not 'base64'.\n   */\n  async saveFile(\n    filepath: string,\n    data: string,\n    encoding: 'base64',\n    activityId?: string,\n  ): Promise<void> {\n    if (encoding !== 'base64') {\n      throw new Error(`Unsupported encoding for browser saveFile: ${encoding}`);\n    }\n    const db = await this.getDb();\n    const blob = this.base64ToBlob(data);\n\n    await db.put(ARTIFACTS_STORE_NAME, {\n      filepath,\n      blob,\n      activityId,\n      createdAt: new Date().toISOString(),\n    });\n  }\n\n  async sleep(ms: number): Promise<void> {\n    await new Promise((resolve) => setTimeout(resolve, ms));\n  }\n\n  createDataUrl(data: string, mimeType: string): string {\n    return `data:${mimeType};base64,${data}`;\n  }\n\n  private base64ToBlob(data: string, mimeType?: string): Blob {\n    const byteCharacters = atob(data);\n    const byteNumbers = new Array(byteCharacters.length);\n    for (let i = 0; i < byteCharacters.length; i++) {\n      byteNumbers[i] = byteCharacters.charCodeAt(i);\n    }\n    const byteArray = new Uint8Array(byteNumbers);\n    return new Blob([byteArray], mimeType ? { type: mimeType } : undefined);\n  }\n\n  async fetch(input: string, init?: any): Promise<PlatformResponse> {\n    const res = await window.fetch(input, init);\n    return {\n      ok: res.ok,\n      status: res.status,\n      json: () => res.json(),\n      text: () => res.text(),\n    };\n  }\n\n  crypto = {\n    randomUUID: () => self.crypto.randomUUID(),\n\n    async sign(text: string, secret: string): Promise<string> {\n      const enc = new TextEncoder();\n      const key = await window.crypto.subtle.importKey(\n        'raw',\n        enc.encode(secret),\n        { name: 'HMAC', hash: 'SHA-256' },\n        false,\n        ['sign'],\n      );\n      const signature = await window.crypto.subtle.sign(\n        'HMAC',\n        key,\n        enc.encode(text),\n      );\n      return this.arrayBufferToBase64Url(signature);\n    },\n\n    async verify(\n      text: string,\n      signature: string,\n      secret: string,\n    ): Promise<boolean> {\n      const expected = await this.sign(text, secret);\n      return expected === signature;\n    },\n\n    // Helper for Base64URL encoding in browser\n    arrayBufferToBase64Url(buffer: ArrayBuffer): string {\n      const bytes = new Uint8Array(buffer);\n      let binary = '';\n      for (let i = 0; i < bytes.byteLength; i++) {\n        binary += String.fromCharCode(bytes[i]);\n      }\n      return window\n        .btoa(binary)\n        .replace(/\\+/g, '-')\n        .replace(/\\//g, '_')\n        .replace(/=+$/, '');\n    },\n  };\n\n  encoding = {\n    base64Encode: (text: string): string => {\n      // Use TextEncoder for proper UTF-8 handling before Base64\n      const encoder = new TextEncoder();\n      const bytes = encoder.encode(text);\n      let binary = '';\n      for (let i = 0; i < bytes.length; i++) {\n        binary += String.fromCharCode(bytes[i]);\n      }\n      return window\n        .btoa(binary)\n        .replace(/\\+/g, '-')\n        .replace(/\\//g, '_')\n        .replace(/=+$/, '');\n    },\n\n    base64Decode: (text: string): string => {\n      const base64 = text.replace(/-/g, '+').replace(/_/g, '/');\n      // Standard atob handles the Base64 decode, then we must interpret the bytes as UTF-8\n      const binary = window.atob(base64);\n      const bytes = new Uint8Array(binary.length);\n      for (let i = 0; i < binary.length; i++) {\n        bytes[i] = binary.charCodeAt(i);\n      }\n      const decoder = new TextDecoder();\n      return decoder.decode(bytes);\n    },\n  };\n\n  getEnv(key: string): string | undefined {\n    // 1. Vite / Modern ESM Support\n    if (\n      typeof import.meta !== 'undefined' &&\n      (import.meta as any).env &&\n      (import.meta as any).env[key]\n    ) {\n      return (import.meta as any).env[key];\n    }\n\n    // 2. Safe Global Fallbacks (window, self, globalThis)\n    const globalRef =\n      typeof globalThis !== 'undefined'\n        ? globalThis\n        : typeof window !== 'undefined'\n          ? window\n          : typeof self !== 'undefined'\n            ? self\n            : {};\n    const anyGlobal = globalRef as any;\n\n    // 3. Legacy process.env check (Safe)\n    // We strictly check for existence to avoid ReferenceError if 'process' is missing.\n    try {\n      if (typeof process !== 'undefined' && process.env && process.env[key]) {\n        return process.env[key];\n      }\n    } catch (e) {\n      // Ignore ReferenceError if process is not defined\n    }\n\n    // 4. Manual Injection Fallback\n    if (anyGlobal.__MODJULES__ && anyGlobal.__MODJULES__[key]) {\n      return anyGlobal.__MODJULES__[key];\n    }\n\n    return undefined;\n  }\n}\n","// src/browser.ts\nimport { JulesClientImpl } from './client.js';\nimport { BrowserStorage } from './storage/browser.js';\nimport { MemorySessionStorage } from './storage/memory.js';\nimport { BrowserPlatform } from './platform/browser.js';\nimport { JulesClient, JulesOptions, StorageFactory } from './types.js';\n\nconst defaultPlatform = new BrowserPlatform();\nconst defaultStorageFactory: StorageFactory = {\n  activity: (sessionId: string) => new BrowserStorage(sessionId),\n  session: () => new MemorySessionStorage(), // Use Memory for now, upgrade to IndexedDB later\n};\n\n/**\n * Connects to the Jules service with the provided configuration.\n * Acts as a factory method for creating a new client instance.\n *\n * @param options Configuration options for the client.\n * @returns A new JulesClient instance.\n */\nexport function connect(options: JulesOptions = {}): JulesClient {\n  return new JulesClientImpl(options, defaultStorageFactory, defaultPlatform);\n}\n\n/**\n * The main entry point for the Jules SDK for browser environments.\n * This is a pre-initialized client that can be used immediately with default settings.\n *\n * @example\n * import { jules } from 'modjules/browser';\n * const session = await jules.session({ ... });\n */\nexport const jules: JulesClient = connect();\n\n// Re-export all the types for convenience\nexport * from './errors.js';\nexport type {\n  Activity,\n  ActivityAgentMessaged,\n  ActivityPlanApproved,\n  ActivityPlanGenerated,\n  ActivityProgressUpdated,\n  ActivitySessionCompleted,\n  ActivitySessionFailed,\n  ActivityUserMessaged,\n  Artifact,\n  AutomatedSession,\n  BashArtifact,\n  ChangeSet,\n  GitHubRepo,\n  GitPatch,\n  JulesClient,\n  JulesOptions,\n  MediaArtifact,\n  Outcome,\n  Plan,\n  PlanStep,\n  PullRequest,\n  SessionClient,\n  SessionConfig,\n  SessionOutput,\n  SessionResource,\n  SessionState,\n  Source,\n  SourceContext,\n  SourceInput,\n  SourceManager,\n} from './types.js';\n"],"names":["DB_NAME","i","e"],"mappings":"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"}