@fairfox/polly 0.19.0 → 0.20.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/README.md +131 -943
  2. package/dist/cli/polly.js +25 -4
  3. package/dist/cli/polly.js.map +3 -3
  4. package/dist/src/background/index.js +22 -12
  5. package/dist/src/background/index.js.map +3 -3
  6. package/dist/src/background/message-router.js +22 -12
  7. package/dist/src/background/message-router.js.map +3 -3
  8. package/dist/src/client/index.js +187 -154
  9. package/dist/src/client/index.js.map +4 -4
  10. package/dist/src/elysia/index.js +19 -9
  11. package/dist/src/elysia/index.js.map +2 -2
  12. package/dist/src/elysia/plugin.d.ts +3 -3
  13. package/dist/src/index.d.ts +2 -0
  14. package/dist/src/index.js +67 -14
  15. package/dist/src/index.js.map +7 -6
  16. package/dist/src/shared/adapters/index.js +22 -12
  17. package/dist/src/shared/adapters/index.js.map +3 -3
  18. package/dist/src/shared/lib/context-helpers.js +22 -12
  19. package/dist/src/shared/lib/context-helpers.js.map +3 -3
  20. package/dist/src/shared/lib/errors.js +19 -9
  21. package/dist/src/shared/lib/errors.js.map +2 -2
  22. package/dist/src/shared/lib/message-bus.js +22 -12
  23. package/dist/src/shared/lib/message-bus.js.map +3 -3
  24. package/dist/src/shared/lib/resource.d.ts +54 -0
  25. package/dist/src/shared/lib/resource.js +593 -0
  26. package/dist/src/shared/lib/resource.js.map +13 -0
  27. package/dist/src/shared/lib/state.d.ts +1 -0
  28. package/dist/src/shared/lib/state.js +23 -12
  29. package/dist/src/shared/lib/state.js.map +4 -4
  30. package/dist/src/shared/lib/test-helpers.js +19 -9
  31. package/dist/src/shared/lib/test-helpers.js.map +2 -2
  32. package/dist/src/shared/state/app-state.js +22 -12
  33. package/dist/src/shared/state/app-state.js.map +4 -4
  34. package/dist/src/shared/types/messages.js +19 -9
  35. package/dist/src/shared/types/messages.js.map +2 -2
  36. package/dist/tools/init/src/cli.js +6 -2
  37. package/dist/tools/init/src/cli.js.map +2 -2
  38. package/dist/tools/init/templates/pwa/package.json.template +1 -2
  39. package/dist/tools/test/src/adapters/index.d.ts +2 -2
  40. package/dist/tools/test/src/adapters/index.js +19 -9
  41. package/dist/tools/test/src/adapters/index.js.map +3 -3
  42. package/dist/tools/test/src/index.js +19 -9
  43. package/dist/tools/test/src/index.js.map +3 -3
  44. package/dist/tools/test/src/test-utils.js +19 -9
  45. package/dist/tools/test/src/test-utils.js.map +2 -2
  46. package/dist/tools/verify/specs/docker-compose.yml +1 -1
  47. package/dist/tools/verify/src/cli.js +185 -14
  48. package/dist/tools/verify/src/cli.js.map +7 -7
  49. package/dist/tools/verify/src/config.js +19 -9
  50. package/dist/tools/verify/src/config.js.map +2 -2
  51. package/dist/tools/visualize/src/cli.js +144 -5
  52. package/dist/tools/visualize/src/cli.js.map +3 -3
  53. package/package.json +12 -14
  54. package/dist/src/elysia/tla-generator.d.ts +0 -16
  55. package/dist/tools/verify/specs/verification.config.ts +0 -64
@@ -3,12 +3,12 @@
3
3
  "sources": ["../src/shared/lib/storage-adapter.ts", "../src/shared/lib/sync-adapter.ts", "../src/shared/types/messages.ts", "../src/shared/lib/state.ts", "../src/shared/state/app-state.ts"],
4
4
  "sourcesContent": [
5
5
  "// Storage adapters for different execution contexts\n// Automatically chooses the right storage mechanism based on environment\n\n/**\n * Universal storage adapter interface\n */\nexport interface StorageAdapter {\n get<T = unknown>(keys: string[]): Promise<Record<string, T>>;\n set(items: Record<string, unknown>): Promise<void>;\n remove(keys: string[]): Promise<void>;\n}\n\n/**\n * IndexedDB adapter for web apps\n */\nexport class IndexedDBAdapter implements StorageAdapter {\n private dbName: string;\n private storeName = \"state\";\n private dbPromise: Promise<IDBDatabase> | null = null;\n\n constructor(dbName = \"polly-state\") {\n this.dbName = dbName;\n }\n\n private getDB(): Promise<IDBDatabase> {\n if (this.dbPromise) return this.dbPromise;\n\n this.dbPromise = new Promise((resolve, reject) => {\n const request = indexedDB.open(this.dbName, 1);\n\n request.onerror = () => reject(request.error);\n request.onsuccess = () => resolve(request.result);\n\n request.onupgradeneeded = (event) => {\n const db = (event.target as IDBOpenDBRequest).result;\n if (!db.objectStoreNames.contains(this.storeName)) {\n db.createObjectStore(this.storeName);\n }\n };\n });\n\n return this.dbPromise;\n }\n\n async get<T = unknown>(keys: string[]): Promise<Record<string, T>> {\n try {\n const db = await this.getDB();\n const result: Record<string, T> = {};\n\n await Promise.all(\n keys.map(\n (key) =>\n new Promise<void>((resolve, reject) => {\n const transaction = db.transaction([this.storeName], \"readonly\");\n const store = transaction.objectStore(this.storeName);\n const request = store.get(key);\n\n request.onerror = () => reject(request.error);\n request.onsuccess = () => {\n if (request.result !== undefined) {\n result[key] = request.result as T;\n }\n resolve();\n };\n })\n )\n );\n\n return result;\n } catch (error) {\n console.warn(\"[Polly] IndexedDB get failed:\", error);\n return {};\n }\n }\n\n async set(items: Record<string, unknown>): Promise<void> {\n try {\n const db = await this.getDB();\n await Promise.all(\n Object.entries(items).map(\n ([key, value]) =>\n new Promise<void>((resolve, reject) => {\n const transaction = db.transaction([this.storeName], \"readwrite\");\n const store = transaction.objectStore(this.storeName);\n const request = store.put(value, key);\n\n request.onerror = () => reject(request.error);\n request.onsuccess = () => resolve();\n })\n )\n );\n } catch (error) {\n console.warn(\"[Polly] IndexedDB set failed:\", error);\n }\n }\n\n async remove(keys: string[]): Promise<void> {\n try {\n const db = await this.getDB();\n await Promise.all(\n keys.map(\n (key) =>\n new Promise<void>((resolve, reject) => {\n const transaction = db.transaction([this.storeName], \"readwrite\");\n const store = transaction.objectStore(this.storeName);\n const request = store.delete(key);\n\n request.onerror = () => reject(request.error);\n request.onsuccess = () => resolve();\n })\n )\n );\n } catch (error) {\n console.warn(\"[Polly] IndexedDB remove failed:\", error);\n }\n }\n}\n\n/**\n * Chrome storage adapter for extensions\n */\nexport class ChromeStorageAdapter implements StorageAdapter {\n async get<T = unknown>(keys: string[]): Promise<Record<string, T>> {\n if (typeof chrome === \"undefined\" || !chrome.storage) {\n return {};\n }\n\n try {\n return (await chrome.storage.local.get(keys)) as Record<string, T>;\n } catch (error) {\n console.warn(\"[Polly] Chrome storage get failed:\", error);\n return {};\n }\n }\n\n async set(items: Record<string, unknown>): Promise<void> {\n if (typeof chrome === \"undefined\" || !chrome.storage) {\n return;\n }\n\n try {\n await chrome.storage.local.set(items);\n } catch (error) {\n console.warn(\"[Polly] Chrome storage set failed:\", error);\n }\n }\n\n async remove(keys: string[]): Promise<void> {\n if (typeof chrome === \"undefined\" || !chrome.storage) {\n return;\n }\n\n try {\n await chrome.storage.local.remove(keys);\n } catch (error) {\n console.warn(\"[Polly] Chrome storage remove failed:\", error);\n }\n }\n}\n\n/**\n * In-memory adapter (no persistence) for testing or server contexts\n */\nexport class MemoryStorageAdapter implements StorageAdapter {\n private storage = new Map<string, unknown>();\n\n async get<T = unknown>(keys: string[]): Promise<Record<string, T>> {\n const result: Record<string, T> = {};\n for (const key of keys) {\n const value = this.storage.get(key);\n if (value !== undefined) {\n result[key] = value as T;\n }\n }\n return result;\n }\n\n async set(items: Record<string, unknown>): Promise<void> {\n for (const [key, value] of Object.entries(items)) {\n this.storage.set(key, value);\n }\n }\n\n async remove(keys: string[]): Promise<void> {\n for (const key of keys) {\n this.storage.delete(key);\n }\n }\n}\n\n/**\n * Detect execution context and return appropriate storage adapter\n */\nexport function createStorageAdapter(): StorageAdapter {\n // Chrome extension context\n if (typeof chrome !== \"undefined\" && chrome.storage && chrome.runtime) {\n return new ChromeStorageAdapter();\n }\n\n // Web app context (has IndexedDB)\n if (typeof indexedDB !== \"undefined\") {\n return new IndexedDBAdapter();\n }\n\n // Server/test context (no persistent storage available)\n return new MemoryStorageAdapter();\n}\n",
6
- "// Sync adapter interface for cross-context state synchronization\n// Abstracts the transport mechanism (chrome.runtime, BroadcastChannel, etc.)\n//\n// Architecture Decision: BroadcastChannel vs SharedWorker\n// ------------------------------------------------------\n// We currently use BroadcastChannel for web app sync because:\n// - Simpler API with no lifecycle management complexity\n// - Decentralized (aligns with local-first/offline-first architecture)\n// - Better browser support (especially Safari and mobile)\n// - Perfect for message-passing with Lamport clock conflict resolution\n// - No single point of failure\n//\n// Future Consideration: SharedWorker Support\n// ------------------------------------------\n// SharedWorker could be added as an optional adapter for use cases requiring:\n// - Central coordination point for complex multi-tab workflows\n// - Shared WebSocket connections (one connection for all tabs)\n// - Heavy computation done once and shared across tabs\n// - Persistent background work when tabs are closed\n// - Transaction coordination across tabs\n//\n// For most Polly use cases, BroadcastChannel's peer-to-peer model is preferred,\n// but SharedWorker support could be valuable for advanced scenarios.\n\n/**\n * Message format for state synchronization\n */\nexport interface StateSyncMessage<T = unknown> {\n key: string;\n value: T;\n clock: number;\n}\n\n/**\n * Sync adapter interface - abstracts the transport mechanism for state sync\n *\n * Different contexts use different transports:\n * - Chrome extensions: chrome.runtime messaging\n * - Web apps (multi-tab): BroadcastChannel\n * - PWAs: BroadcastChannel + Service Worker messaging\n * - Single-context: NoOp (no sync needed)\n */\nexport interface SyncAdapter {\n /**\n * Broadcast a state update to other contexts\n */\n broadcast<T>(message: StateSyncMessage<T>): void;\n\n /**\n * Register a callback for incoming state updates\n */\n onMessage<T>(callback: (message: StateSyncMessage<T>) => void): () => void;\n\n /**\n * Optional: Connect to the sync mechanism\n * Some transports require explicit connection setup\n */\n connect?(): Promise<void>;\n\n /**\n * Optional: Disconnect from the sync mechanism\n */\n disconnect?(): void;\n\n /**\n * Optional: Check if connected\n */\n isConnected?(): boolean;\n}\n\n/**\n * NoOp sync adapter for single-context scenarios (no sync needed)\n */\nexport class NoOpSyncAdapter implements SyncAdapter {\n broadcast<T>(_message: StateSyncMessage<T>): void {\n // No-op: single context, no need to sync\n }\n\n onMessage<T>(_callback: (message: StateSyncMessage<T>) => void): () => void {\n // No-op: no messages will ever arrive\n return () => {\n // Empty cleanup function - nothing to clean up for null adapter\n };\n }\n}\n\n/**\n * Chrome runtime sync adapter for Chrome extensions\n * Uses chrome.runtime.sendMessage for cross-context messaging\n */\nexport class ChromeRuntimeSyncAdapter implements SyncAdapter {\n private listeners: Array<(message: StateSyncMessage<unknown>) => void> = [];\n private port: chrome.runtime.Port | null = null;\n\n constructor() {\n // Set up listener for incoming messages\n if (typeof chrome !== \"undefined\" && chrome.runtime) {\n chrome.runtime.onMessage.addListener((message, _sender, _sendResponse) => {\n if (message.type === \"STATE_SYNC\") {\n this.listeners.forEach((listener) => {\n listener(message);\n });\n }\n });\n }\n }\n\n broadcast<T>(message: StateSyncMessage<T>): void {\n if (typeof chrome === \"undefined\" || !chrome.runtime) {\n console.warn(\"[SyncAdapter] chrome.runtime not available\");\n return;\n }\n\n try {\n chrome.runtime.sendMessage({\n type: \"STATE_SYNC\",\n key: message.key,\n value: message.value,\n clock: message.clock,\n });\n } catch (error) {\n console.warn(\"[SyncAdapter] Failed to broadcast state update:\", error);\n }\n }\n\n onMessage<T>(callback: (message: StateSyncMessage<T>) => void): () => void {\n this.listeners.push(callback as (message: StateSyncMessage<unknown>) => void);\n\n // Return cleanup function\n return () => {\n const index = this.listeners.indexOf(\n callback as (message: StateSyncMessage<unknown>) => void\n );\n if (index > -1) {\n this.listeners.splice(index, 1);\n }\n };\n }\n\n connect(): Promise<void> {\n // Chrome runtime is always connected\n return Promise.resolve();\n }\n\n disconnect(): void {\n this.listeners = [];\n if (this.port) {\n this.port.disconnect();\n this.port = null;\n }\n }\n\n isConnected(): boolean {\n return typeof chrome !== \"undefined\" && !!chrome.runtime;\n }\n}\n\n/**\n * BroadcastChannel sync adapter for web apps (multi-tab)\n * Uses BroadcastChannel API for cross-tab messaging\n */\nexport class BroadcastChannelSyncAdapter implements SyncAdapter {\n private channel: BroadcastChannel | null = null;\n private listeners: Array<(message: StateSyncMessage<unknown>) => void> = [];\n\n constructor(channelName = \"polly-sync\") {\n if (typeof BroadcastChannel !== \"undefined\") {\n this.channel = new BroadcastChannel(channelName);\n\n this.channel.onmessage = (event) => {\n if (event.data.type === \"STATE_SYNC\") {\n this.listeners.forEach((listener) => {\n listener(event.data);\n });\n }\n };\n } else {\n console.warn(\"[SyncAdapter] BroadcastChannel not available\");\n }\n }\n\n broadcast<T>(message: StateSyncMessage<T>): void {\n if (!this.channel) {\n console.warn(\"[SyncAdapter] BroadcastChannel not initialized\");\n return;\n }\n\n try {\n this.channel.postMessage({\n type: \"STATE_SYNC\",\n key: message.key,\n value: message.value,\n clock: message.clock,\n });\n } catch (error) {\n console.warn(\"[SyncAdapter] Failed to broadcast state update:\", error);\n }\n }\n\n onMessage<T>(callback: (message: StateSyncMessage<T>) => void): () => void {\n this.listeners.push(callback as (message: StateSyncMessage<unknown>) => void);\n\n // Return cleanup function\n return () => {\n const index = this.listeners.indexOf(\n callback as (message: StateSyncMessage<unknown>) => void\n );\n if (index > -1) {\n this.listeners.splice(index, 1);\n }\n };\n }\n\n connect(): Promise<void> {\n // BroadcastChannel connects immediately on construction\n return Promise.resolve();\n }\n\n disconnect(): void {\n this.listeners = [];\n if (this.channel) {\n this.channel.close();\n this.channel = null;\n }\n }\n\n isConnected(): boolean {\n return this.channel !== null;\n }\n}\n\n/**\n * Detect available sync mechanisms and create appropriate adapter\n */\nexport function createSyncAdapter(): SyncAdapter {\n // Chrome extension context - use chrome.runtime\n if (typeof chrome !== \"undefined\" && chrome.runtime) {\n return new ChromeRuntimeSyncAdapter();\n }\n\n // Web app with multi-tab support - use BroadcastChannel\n if (typeof BroadcastChannel !== \"undefined\") {\n return new BroadcastChannelSyncAdapter();\n }\n\n // Single context or no sync available - use NoOp\n return new NoOpSyncAdapter();\n}\n",
6
+ "// Sync adapter interface for cross-context state synchronization\n// Abstracts the transport mechanism (chrome.runtime, BroadcastChannel, etc.)\n//\n// Architecture Decision: BroadcastChannel vs SharedWorker\n// ------------------------------------------------------\n// We currently use BroadcastChannel for web app sync because:\n// - Simpler API with no lifecycle management complexity\n// - Decentralized (aligns with local-first/offline-first architecture)\n// - Better browser support (especially Safari and mobile)\n// - Perfect for message-passing with Lamport clock conflict resolution\n// - No single point of failure\n//\n// Future Consideration: SharedWorker Support\n// ------------------------------------------\n// SharedWorker could be added as an optional adapter for use cases requiring:\n// - Central coordination point for complex multi-tab workflows\n// - Shared WebSocket connections (one connection for all tabs)\n// - Heavy computation done once and shared across tabs\n// - Persistent background work when tabs are closed\n// - Transaction coordination across tabs\n//\n// For most Polly use cases, BroadcastChannel's peer-to-peer model is preferred,\n// but SharedWorker support could be valuable for advanced scenarios.\n\n/**\n * Message format for state synchronization\n */\nexport interface StateSyncMessage<T = unknown> {\n key: string;\n value: T;\n clock: number;\n}\n\n/**\n * Sync adapter interface - abstracts the transport mechanism for state sync\n *\n * Different contexts use different transports:\n * - Chrome extensions: chrome.runtime messaging\n * - Web apps (multi-tab): BroadcastChannel\n * - PWAs: BroadcastChannel + Service Worker messaging\n * - Single-context: NoOp (no sync needed)\n */\nexport interface SyncAdapter {\n /**\n * Broadcast a state update to other contexts\n */\n broadcast<T>(message: StateSyncMessage<T>): void;\n\n /**\n * Register a callback for incoming state updates\n */\n onMessage<T>(callback: (message: StateSyncMessage<T>) => void): () => void;\n\n /**\n * Optional: Connect to the sync mechanism\n * Some transports require explicit connection setup\n */\n connect?(): Promise<void>;\n\n /**\n * Optional: Disconnect from the sync mechanism\n */\n disconnect?(): void;\n\n /**\n * Optional: Check if connected\n */\n isConnected?(): boolean;\n}\n\n/**\n * NoOp sync adapter for single-context scenarios (no sync needed)\n */\nexport class NoOpSyncAdapter implements SyncAdapter {\n broadcast<T>(_message: StateSyncMessage<T>): void {\n // No-op: single context, no need to sync\n }\n\n onMessage<T>(_callback: (message: StateSyncMessage<T>) => void): () => void {\n // No-op: no messages will ever arrive\n return () => {\n // Empty cleanup function - nothing to clean up for null adapter\n };\n }\n}\n\n/**\n * Chrome runtime sync adapter for Chrome extensions\n * Uses chrome.runtime.sendMessage for cross-context messaging\n */\nexport class ChromeRuntimeSyncAdapter implements SyncAdapter {\n private listeners: Array<(message: StateSyncMessage<unknown>) => void> = [];\n private port: chrome.runtime.Port | null = null;\n\n constructor() {\n // Set up listener for incoming messages\n if (typeof chrome !== \"undefined\" && chrome.runtime) {\n chrome.runtime.onMessage.addListener((message, _sender, _sendResponse) => {\n if (message.type === \"STATE_SYNC\") {\n this.listeners.forEach((listener) => {\n listener(message);\n });\n }\n });\n }\n }\n\n broadcast<T>(message: StateSyncMessage<T>): void {\n if (typeof chrome === \"undefined\" || !chrome.runtime) {\n console.warn(\"[SyncAdapter] chrome.runtime not available\");\n return;\n }\n\n try {\n chrome.runtime.sendMessage({\n type: \"STATE_SYNC\",\n key: message.key,\n value: message.value,\n clock: message.clock,\n });\n } catch (error) {\n console.warn(\"[SyncAdapter] Failed to broadcast state update:\", error);\n }\n }\n\n onMessage<T>(callback: (message: StateSyncMessage<T>) => void): () => void {\n this.listeners.push(callback as (message: StateSyncMessage<unknown>) => void);\n\n // Return cleanup function\n return () => {\n const index = this.listeners.indexOf(\n callback as (message: StateSyncMessage<unknown>) => void\n );\n if (index > -1) {\n this.listeners.splice(index, 1);\n }\n };\n }\n\n connect(): Promise<void> {\n // Chrome runtime is always connected\n return Promise.resolve();\n }\n\n disconnect(): void {\n this.listeners = [];\n if (this.port) {\n this.port.disconnect();\n this.port = null;\n }\n }\n\n isConnected(): boolean {\n return typeof chrome !== \"undefined\" && !!chrome.runtime;\n }\n}\n\n/**\n * BroadcastChannel sync adapter for web apps (multi-tab)\n * Uses BroadcastChannel API for cross-tab messaging\n */\nexport class BroadcastChannelSyncAdapter implements SyncAdapter {\n private channel: BroadcastChannel | null = null;\n private listeners: Array<(message: StateSyncMessage<unknown>) => void> = [];\n\n constructor(channelName = \"polly-sync\") {\n if (typeof BroadcastChannel === \"undefined\") {\n console.warn(\"[SyncAdapter] BroadcastChannel not available\");\n } else {\n this.channel = new BroadcastChannel(channelName);\n\n this.channel.onmessage = (event) => {\n if (event.data.type === \"STATE_SYNC\") {\n this.listeners.forEach((listener) => {\n listener(event.data);\n });\n }\n };\n }\n }\n\n broadcast<T>(message: StateSyncMessage<T>): void {\n if (!this.channel) {\n console.warn(\"[SyncAdapter] BroadcastChannel not initialized\");\n return;\n }\n\n try {\n this.channel.postMessage({\n type: \"STATE_SYNC\",\n key: message.key,\n value: message.value,\n clock: message.clock,\n });\n } catch (error) {\n console.warn(\"[SyncAdapter] Failed to broadcast state update:\", error);\n }\n }\n\n onMessage<T>(callback: (message: StateSyncMessage<T>) => void): () => void {\n this.listeners.push(callback as (message: StateSyncMessage<unknown>) => void);\n\n // Return cleanup function\n return () => {\n const index = this.listeners.indexOf(\n callback as (message: StateSyncMessage<unknown>) => void\n );\n if (index > -1) {\n this.listeners.splice(index, 1);\n }\n };\n }\n\n connect(): Promise<void> {\n // BroadcastChannel connects immediately on construction\n return Promise.resolve();\n }\n\n disconnect(): void {\n this.listeners = [];\n if (this.channel) {\n this.channel.close();\n this.channel = null;\n }\n }\n\n isConnected(): boolean {\n return this.channel !== null;\n }\n}\n\n/**\n * Detect available sync mechanisms and create appropriate adapter\n */\nexport function createSyncAdapter(): SyncAdapter {\n // Chrome extension context - use chrome.runtime\n if (typeof chrome !== \"undefined\" && chrome.runtime) {\n return new ChromeRuntimeSyncAdapter();\n }\n\n // Web app with multi-tab support - use BroadcastChannel\n if (typeof BroadcastChannel !== \"undefined\") {\n return new BroadcastChannelSyncAdapter();\n }\n\n // Single context or no sync available - use NoOp\n return new NoOpSyncAdapter();\n}\n",
7
7
  "// Type definitions for all messages in the extension\n\n/**\n * Base message interface that all messages must satisfy.\n * This allows users to define custom messages alongside framework messages.\n */\nexport interface BaseMessage {\n type: string;\n}\n\nexport type Context =\n | \"background\"\n | \"content\"\n | \"page\"\n | \"devtools\"\n | \"popup\"\n | \"options\"\n | \"sidepanel\"\n | \"offscreen\";\n\n// All contexts (useful for broadcast)\nexport const ALL_CONTEXTS: Context[] = [\n \"background\",\n \"content\",\n \"page\",\n \"devtools\",\n \"popup\",\n \"options\",\n \"sidepanel\",\n \"offscreen\",\n] as const;\n\n// Settings schema\nexport type Settings = {\n theme: \"light\" | \"dark\" | \"auto\";\n autoSync: boolean;\n debugMode: boolean;\n notifications: boolean;\n apiEndpoint: string;\n refreshInterval: number;\n};\n\nexport const defaultSettings: Settings = {\n theme: \"auto\",\n autoSync: true,\n debugMode: false,\n notifications: true,\n apiEndpoint: \"https://api.example.com\",\n refreshInterval: 60000,\n};\n\n// Logging types\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport type LogEntry = {\n id: string;\n level: LogLevel;\n message: string;\n context?: Record<string, unknown>;\n error?: string;\n stack?: string;\n source: Context;\n timestamp: number;\n};\n\n// All possible messages (discriminated union)\nexport type ExtensionMessage =\n // DOM Operations (handled by Content Script)\n | { type: \"DOM_QUERY\"; selector: string }\n | { type: \"DOM_UPDATE\"; selector: string; content: string }\n | {\n type: \"DOM_INSERT\";\n position: \"beforebegin\" | \"afterbegin\" | \"beforeend\" | \"afterend\";\n html: string;\n }\n | { type: \"DOM_REMOVE\"; selector: string }\n\n // Page Script Operations (handled by Page Script)\n | { type: \"PAGE_EVAL\"; code: string }\n | { type: \"PAGE_GET_VAR\"; varName: string }\n | { type: \"PAGE_CALL_FN\"; fnName: string; args: unknown[] }\n | { type: \"PAGE_SET_VAR\"; varName: string; value: unknown }\n\n // API Operations (handled by Background)\n | {\n type: \"API_REQUEST\";\n endpoint: string;\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\";\n body?: unknown;\n headers?: Record<string, string>;\n }\n | {\n type: \"API_BATCH\";\n requests: Array<{ endpoint: string; method: string; body?: unknown }>;\n }\n\n // Clipboard Operations (handled by Offscreen)\n | { type: \"CLIPBOARD_WRITE\"; text: string }\n | { type: \"CLIPBOARD_WRITE_HTML\"; html: string }\n | { type: \"CLIPBOARD_WRITE_RICH\"; data: { text: string; html: string } }\n | { type: \"CLIPBOARD_READ\" }\n\n // Context Menu (handled by Background)\n | {\n type: \"CONTEXT_MENU_CLICKED\";\n menuId: string;\n info: chrome.contextMenus.OnClickData;\n tabId: number;\n }\n | {\n type: \"CONTEXT_MENU_CREATE\";\n id: string;\n title: string;\n contexts: chrome.contextMenus.ContextType[];\n }\n | { type: \"CONTEXT_MENU_REMOVE\"; id: string }\n\n // State Sync (broadcast) - Internal only, handled by state primitives\n | {\n type: \"STATE_SYNC\";\n key: string;\n value: unknown;\n clock: number;\n }\n\n // Tab Operations (handled by Background)\n | { type: \"TAB_QUERY\"; queryInfo: chrome.tabs.QueryInfo }\n | { type: \"TAB_GET_CURRENT\" }\n | { type: \"TAB_RELOAD\"; tabId: number }\n\n // DevTools Operations\n | { type: \"DEVTOOLS_INSPECT_ELEMENT\"; selector: string }\n | {\n type: \"DEVTOOLS_LOG\";\n level: \"log\" | \"warn\" | \"error\";\n message: string;\n data?: unknown;\n }\n\n // Logging (handled by Background LogStore)\n | {\n type: \"LOG\";\n level: LogLevel;\n message: string;\n context?: Record<string, unknown>;\n error?: string;\n stack?: string;\n source: Context;\n timestamp: number;\n }\n | {\n type: \"LOGS_GET\";\n filters?: {\n level?: LogLevel;\n source?: Context;\n since?: number;\n limit?: number;\n };\n }\n | { type: \"LOGS_CLEAR\" }\n | { type: \"LOGS_EXPORT\" }\n\n // Test Messages (only used in tests)\n | { type: \"TEST_MESSAGE\"; data?: unknown }\n | { type: \"TEST\"; iteration?: number }\n | { type: \"CUSTOM_MESSAGE\"; data?: unknown }\n | { type: \"SETTINGS_GET\" }\n | {\n type: \"SIGNAL_UPDATE\";\n key?: string;\n value?: unknown;\n signalId?: string;\n source?: Context;\n }\n | {\n type: \"USER_DATA\";\n password?: string;\n apiKey?: string;\n [key: string]: unknown;\n };\n\n// Helper: Look up the full message type from a union based on the 'type' discriminator\ntype LookupMessage<TUnion, TType extends string> = TUnion extends { type: TType } ? TUnion : never;\n\n// Extract response type from message using phantom type\n// If message has __response field (phantom type), use it; otherwise infer from framework messages\nexport type MessageResponse<T extends BaseMessage> =\n // First, try to find the matching message in the union by type discriminator\n T extends { type: infer TType extends string }\n ? LookupMessage<T, TType> extends { readonly __response?: infer R }\n ? R // Found phantom type, use it\n : T extends ExtensionMessage\n ? // Framework message - infer from type\n // DOM Operations\n T extends { type: \"DOM_QUERY\" }\n ? {\n elements: Array<{\n tag: string;\n text: string;\n html: string;\n attrs: Record<string, string>;\n rect?: DOMRect;\n }>;\n }\n : T extends { type: \"DOM_UPDATE\" }\n ? { success: boolean }\n : T extends { type: \"DOM_INSERT\" }\n ? { success: boolean }\n : T extends { type: \"DOM_REMOVE\" }\n ? { success: boolean; count: number }\n : // Page Script Operations\n T extends { type: \"PAGE_EVAL\" }\n ? { result: unknown; error?: string }\n : T extends { type: \"PAGE_GET_VAR\" }\n ? { value: unknown; exists: boolean }\n : T extends { type: \"PAGE_CALL_FN\" }\n ? { result: unknown; error?: string }\n : T extends { type: \"PAGE_SET_VAR\" }\n ? { success: boolean }\n : // API Operations\n T extends { type: \"API_REQUEST\" }\n ? {\n data: unknown;\n status: number;\n statusText: string;\n headers: Record<string, string>;\n error?: string;\n }\n : T extends { type: \"API_BATCH\" }\n ? {\n results: Array<{\n data: unknown;\n status: number;\n error?: string;\n }>;\n }\n : // Clipboard Operations\n T extends { type: \"CLIPBOARD_WRITE\" }\n ? { success: boolean }\n : T extends { type: \"CLIPBOARD_WRITE_HTML\" }\n ? { success: boolean }\n : T extends { type: \"CLIPBOARD_WRITE_RICH\" }\n ? { success: boolean }\n : T extends { type: \"CLIPBOARD_READ\" }\n ? { text: string }\n : // Context Menu\n T extends { type: \"CONTEXT_MENU_CLICKED\" }\n ? undefined\n : T extends { type: \"CONTEXT_MENU_CREATE\" }\n ? { success: boolean }\n : T extends { type: \"CONTEXT_MENU_REMOVE\" }\n ? { success: boolean }\n : // State Sync\n T extends { type: \"STATE_SYNC\" }\n ? undefined\n : // Tab Operations\n T extends { type: \"TAB_QUERY\" }\n ? { tabs: chrome.tabs.Tab[] }\n : T extends {\n type: \"TAB_GET_CURRENT\";\n }\n ? { tab: chrome.tabs.Tab }\n : T extends {\n type: \"TAB_RELOAD\";\n }\n ? { success: boolean }\n : // DevTools Operations\n T extends {\n type: \"DEVTOOLS_INSPECT_ELEMENT\";\n }\n ? {\n success: boolean;\n }\n : T extends {\n type: \"DEVTOOLS_LOG\";\n }\n ? undefined\n : // Logging Operations\n T extends {\n type: \"LOG\";\n }\n ? {\n success: boolean;\n }\n : T extends {\n type: \"LOGS_GET\";\n }\n ? {\n logs: LogEntry[];\n }\n : T extends {\n type: \"LOGS_CLEAR\";\n }\n ? {\n success: boolean;\n count: number;\n }\n : T extends {\n type: \"LOGS_EXPORT\";\n }\n ? {\n json: string;\n count: number;\n }\n : T extends {\n type: \"SETTINGS_GET\";\n }\n ? {\n settings: unknown;\n }\n : undefined\n : unknown // For custom messages outside ExtensionMessage, require phantom type\n : unknown; // Fallback for messages without type field\n\n// Message handler mapping (which context handles which message)\n// Can be a single context or an array for multi-target routing\nexport type MessageHandler = {\n DOM_QUERY: \"content\";\n DOM_UPDATE: \"content\";\n DOM_INSERT: \"content\";\n DOM_REMOVE: \"content\";\n\n PAGE_EVAL: \"page\";\n PAGE_GET_VAR: \"page\";\n PAGE_CALL_FN: \"page\";\n PAGE_SET_VAR: \"page\";\n\n API_REQUEST: \"background\";\n API_BATCH: \"background\";\n\n CLIPBOARD_WRITE: \"offscreen\";\n CLIPBOARD_WRITE_HTML: \"offscreen\";\n CLIPBOARD_WRITE_RICH: \"offscreen\";\n CLIPBOARD_READ: \"offscreen\";\n\n CONTEXT_MENU_CLICKED: \"background\";\n CONTEXT_MENU_CREATE: \"background\";\n CONTEXT_MENU_REMOVE: \"background\";\n\n STATE_SYNC: Context[]; // Broadcast to all contexts\n\n TAB_QUERY: \"background\";\n TAB_GET_CURRENT: \"background\";\n TAB_RELOAD: \"background\";\n\n DEVTOOLS_INSPECT_ELEMENT: \"content\";\n DEVTOOLS_LOG: \"background\";\n\n LOG: \"background\";\n LOGS_GET: \"background\";\n LOGS_CLEAR: \"background\";\n LOGS_EXPORT: \"background\";\n};\n\n// Routed message envelope\nexport type RoutedMessage<T extends BaseMessage = ExtensionMessage> = {\n id: string; // Correlation ID (UUID)\n source: Context; // Which context sent it\n targets: Context[]; // Which contexts should receive this (can be multiple)\n tabId?: number; // Required for per-tab contexts\n timestamp: number; // When it was sent\n payload: T; // The actual message\n};\n\n// Routed response envelope\nexport type RoutedResponse<T extends BaseMessage = ExtensionMessage> = {\n id: string; // Matches request ID\n success: boolean; // Whether operation succeeded\n data?: MessageResponse<T>; // Response data\n error?: string; // Error message if failed\n timestamp: number; // When response was sent\n};\n",
8
- "// State primitives with optional sync and persistence\n\nimport { effect, type Signal, signal } from \"@preact/signals\";\nimport type { MessageBus } from \"./message-bus\";\nimport { createStorageAdapter, type StorageAdapter } from \"./storage-adapter\";\nimport { createSyncAdapter, type SyncAdapter } from \"./sync-adapter\";\n\n/**\n * Signal extended with .loaded promise for hydration control\n */\ntype SignalWithLoaded<T> = Signal<T> & { loaded: Promise<void> };\n\n/**\n * Signal extended with .loaded and .verify properties for verification tracking\n */\ntype SignalWithVerify<T> = Signal<T> & { loaded: Promise<void>; verify: T };\n\ntype StateEntry<T> = {\n signal: Signal<T>;\n clock: number; // Lamport clock for causal ordering\n loaded: Promise<void>;\n updating: boolean;\n};\n\ntype StateOptions<T = unknown> = {\n // Legacy MessageBus support (deprecated, will be removed in v2.0)\n bus?: MessageBus;\n\n // New adapter system (recommended)\n storage?: StorageAdapter; // Custom storage adapter\n sync?: SyncAdapter; // Custom sync adapter\n\n // Behavior options\n debounceMs?: number; // Debounce storage writes\n validator?: (value: unknown) => value is T; // Runtime type validation\n verify?: boolean; // Enable verification tracking (creates plain object mirror)\n};\n\nconst stateRegistry = new Map<string, StateEntry<unknown>>();\n\n/**\n * Shared state: synced across all contexts AND persisted to storage\n *\n * Uses Lamport clock for conflict resolution. State is automatically:\n * - Loaded from chrome.storage on initialization\n * - Synced to other contexts via broadcast messages\n * - Persisted to chrome.storage on every change\n *\n * Available in: background, popup, options, devtools, content scripts\n * ⚠️ NOT available in page scripts (use content script state instead)\n *\n * @param key - Unique identifier for this state (e.g., \"app-settings\")\n * @param initialValue - Default value if nothing is in storage\n * @param options - Optional configuration (bus, debounceMs)\n * @returns Reactive signal that stays in sync across all contexts\n *\n * @example\n * ```typescript\n * // Define once, use everywhere\n * const settings = $sharedState(\"settings\", { theme: \"dark\" })\n *\n * // Changes automatically sync\n * settings.value = { theme: \"light\" }\n * ```\n */\nexport function $sharedState<T>(\n key: string,\n initialValue: T,\n options: StateOptions<T> = {}\n): Signal<T> & { loaded: Promise<void>; verify?: T } {\n const sig = createState(key, initialValue, {\n ...options,\n enableSync: true,\n enablePersist: true,\n });\n\n // Expose loaded promise for awaiting hydration\n const entry = stateRegistry.get(key);\n if (entry) {\n (sig as SignalWithLoaded<T>).loaded = entry.loaded;\n }\n\n return sig as Signal<T> & { loaded: Promise<void> };\n}\n\n/**\n * Synced state: synced across all contexts but NOT persisted\n *\n * State is broadcast to all contexts in real-time but resets on extension reload.\n *\n * Available in: background, popup, options, devtools, content scripts\n * ⚠️ NOT available in page scripts\n *\n * @param key - Unique identifier for this state\n * @param initialValue - Default value\n * @param options - Optional configuration\n * @returns Reactive signal synced across contexts (but not persisted)\n *\n * @example\n * ```typescript\n * // Temporary shared state\n * const activeTabId = $syncedState(\"active-tab\", null)\n * ```\n */\nexport function $syncedState<T>(\n key: string,\n initialValue: T,\n options: StateOptions<T> = {}\n): Signal<T> {\n return createState(key, initialValue, {\n ...options,\n enableSync: true,\n enablePersist: false,\n });\n}\n\n/**\n * Persisted state: persisted to storage but NOT synced across contexts\n *\n * Each context has its own copy of the state, persisted independently.\n *\n * Available in: background, popup, options, devtools, content scripts\n * ⚠️ NOT available in page scripts\n *\n * @param key - Unique identifier (use prefix like \"popup:state\" to avoid collisions)\n * @param initialValue - Default value\n * @param options - Optional configuration\n * @returns Reactive signal persisted to storage (but not synced)\n *\n * @example\n * ```typescript\n * // Each context has its own persisted state\n * const popupState = $persistedState(\"popup:last-panel\", \"home\")\n * const devtoolsState = $persistedState(\"devtools:expanded\", true)\n * ```\n */\nexport function $persistedState<T>(\n key: string,\n initialValue: T,\n options: StateOptions<T> = {}\n): Signal<T> & { loaded: Promise<void> } {\n const sig = createState(key, initialValue, {\n ...options,\n enableSync: false,\n enablePersist: true,\n });\n\n // Expose loaded promise for awaiting hydration\n const entry = stateRegistry.get(key);\n if (entry) {\n (sig as SignalWithLoaded<T>).loaded = entry.loaded;\n }\n\n return sig as Signal<T> & { loaded: Promise<void> };\n}\n\n/**\n * Local state: not synced, not persisted (like regular Preact signal)\n *\n * Simple reactive state that lives only in the current context.\n * Resets on reload or context restart.\n *\n * Available in: all contexts (including page scripts)\n *\n * @param initialValue - Default value\n * @returns Reactive signal (local only)\n *\n * @example\n * ```typescript\n * // Local UI state\n * const isLoading = $state(false)\n * const error = $state<string | null>(null)\n * ```\n */\nexport function $state<T>(initialValue: T): Signal<T> {\n return signal(initialValue);\n}\n\ntype InternalStateOptions<T = unknown> = StateOptions<T> & {\n enableSync: boolean; // Whether to enable sync (avoid collision with sync?: SyncAdapter)\n enablePersist: boolean; // Whether to enable persistence\n};\n\n// Deep equality check to prevent redundant updates\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a == null || b == null) return false;\n if (typeof a !== \"object\" || typeof b !== \"object\") return false;\n\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n if (!keysB.includes(key)) return false;\n if (!deepEqual((a as Record<string, unknown>)[key], (b as Record<string, unknown>)[key]))\n return false;\n }\n\n return true;\n}\n\n/**\n * Resolve storage and sync adapters with three-tier priority:\n * 1. Explicit adapters from options (highest priority)\n * 2. MessageBus adapters (legacy, deprecated)\n * 3. Auto-detected adapters (default behavior)\n */\nfunction resolveAdapters(options: InternalStateOptions): {\n storage: StorageAdapter | null;\n sync: SyncAdapter | null;\n} {\n // Priority 1: Explicit adapters (partial or full)\n if (options.storage || options.sync) {\n return {\n storage: options.storage || (options.enablePersist ? createStorageAdapter() : null),\n sync: options.sync || (options.enableSync ? createSyncAdapter() : null),\n };\n }\n\n // Priority 2: MessageBus (legacy support)\n // Note: MessageBus doesn't provide sync adapter, only Chrome storage\n if (options.bus) {\n return {\n storage: options.bus.adapters.storage,\n sync: options.enableSync ? createSyncAdapter() : null,\n };\n }\n\n // Priority 3: Auto-detect based on enableSync and enablePersist flags\n return {\n storage: options.enablePersist ? createStorageAdapter() : null,\n sync: options.enableSync ? createSyncAdapter() : null,\n };\n}\n\nfunction createState<T>(key: string, initialValue: T, options: InternalStateOptions<T>): Signal<T> {\n // Return existing signal if already registered\n if (stateRegistry.has(key)) {\n return stateRegistry.get(key)?.signal as Signal<T>;\n }\n\n const sig = signal(initialValue);\n\n // Create verification mirror if requested\n if (options.verify) {\n // Create plain object mirror for verification\n const mirror = JSON.parse(JSON.stringify(initialValue)) as T;\n (sig as SignalWithVerify<T>).verify = mirror;\n }\n\n const entry: StateEntry<T> = {\n signal: sig,\n clock: 0,\n loaded: Promise.resolve(),\n updating: false,\n };\n\n // Resolve adapters (explicit, MessageBus, or auto-detect)\n const adapters = resolveAdapters(options);\n\n // Load from storage if persist is enabled\n if (options.enablePersist && adapters.storage) {\n entry.loaded = loadFromStorage(key, sig, entry, adapters.storage, options.validator);\n }\n\n // Watch for changes after initial load\n entry.loaded.then(() => {\n let debounceTimer: NodeJS.Timeout | null = null;\n let previousValue = sig.value;\n let isFirstRun = true;\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Sync effect requires coordination of multiple state change scenarios\n effect(() => {\n // Skip if update in progress (from incoming message)\n if (entry.updating) return;\n\n const value = sig.value;\n\n // Skip first run (effect fires immediately on registration)\n if (isFirstRun) {\n isFirstRun = false;\n return;\n }\n\n // Skip if value hasn't changed (deep equality check)\n if (deepEqual(value, previousValue)) {\n return;\n }\n\n previousValue = value;\n\n // Update verification mirror if enabled\n if (options.verify) {\n const verifySignal = sig as SignalWithVerify<T>;\n if (verifySignal.verify) {\n Object.assign(verifySignal.verify, JSON.parse(JSON.stringify(value)));\n }\n }\n\n // Increment clock monotonically\n entry.clock++;\n\n const doUpdate = () => {\n // Persist to storage\n if (options.enablePersist && adapters.storage) {\n persistToStorage(key, value, entry.clock, adapters.storage);\n }\n\n // Broadcast to other contexts\n if (options.enableSync && adapters.sync) {\n broadcastUpdate(key, value, entry.clock, adapters.sync);\n }\n };\n\n // Debounce if specified\n if (options.debounceMs) {\n if (debounceTimer) clearTimeout(debounceTimer);\n debounceTimer = setTimeout(doUpdate, options.debounceMs);\n } else {\n doUpdate();\n }\n });\n });\n\n // Listen for updates from other contexts (only if sync enabled)\n if (options.enableSync && adapters.sync) {\n // Connect if needed (some adapters require explicit connection)\n if (adapters.sync.connect) {\n adapters.sync.connect();\n }\n\n // Register sync message listener\n adapters.sync.onMessage<T>((message) => {\n if (message.key !== key) return;\n\n const oldClock = entry.clock;\n\n // Lamport clock rule: Always update to max(local, received)\n // This maintains causal ordering even when rejecting updates\n entry.clock = Math.max(entry.clock, message.clock);\n\n // Only accept value updates if received clock is strictly greater than old local clock\n // This ensures we only apply causally newer updates\n if (message.clock > oldClock) {\n // Validate incoming value if validator provided\n if (options.validator && !options.validator(message.value)) {\n console.warn(\n `[Polly] State \"${key}\": Received invalid value from sync (clock: ${message.clock})`,\n message.value\n );\n return;\n }\n\n // Skip redundant updates (deep equality check)\n if (deepEqual(entry.signal.value, message.value)) {\n return;\n }\n\n applyUpdate(entry, message.value as T, message.clock);\n }\n });\n }\n\n stateRegistry.set(key, entry as StateEntry<unknown>);\n return sig;\n}\n\nasync function loadFromStorage<T>(\n key: string,\n sig: Signal<T>,\n entry: StateEntry<T>,\n storage: StorageAdapter,\n validator?: (value: unknown) => value is T\n): Promise<void> {\n try {\n const result = await storage.get([key, `${key}:clock`]);\n\n if (result[key] !== undefined) {\n const storedValue = result[key];\n\n // Validate stored value if validator provided\n if (validator) {\n if (validator(storedValue)) {\n sig.value = storedValue;\n } else {\n console.warn(\n `[Polly] State \"${key}\": Stored value failed validation, using initial value`,\n storedValue\n );\n }\n } else {\n sig.value = storedValue as T;\n }\n }\n\n if (result[`${key}:clock`] !== undefined) {\n entry.clock = result[`${key}:clock`] as number;\n }\n } catch (error) {\n console.warn(`[Polly] Failed to load state from storage: ${key}`, error);\n }\n}\n\nfunction persistToStorage<T>(key: string, value: T, clock: number, storage: StorageAdapter): void {\n try {\n storage.set({\n [key]: value,\n [`${key}:clock`]: clock,\n });\n } catch (error) {\n console.warn(`[Polly] Failed to persist state to storage: ${key}`, error);\n }\n}\n\nfunction broadcastUpdate<T>(key: string, value: T, clock: number, sync: SyncAdapter): void {\n try {\n sync.broadcast({\n key,\n value,\n clock,\n });\n } catch (error) {\n console.warn(`[Polly] Failed to broadcast state update: ${key}`, error);\n }\n}\n\nfunction applyUpdate<T>(entry: StateEntry<T>, value: T, clock: number): void {\n entry.updating = true;\n entry.signal.value = value;\n entry.clock = clock;\n entry.updating = false;\n}\n\n/**\n * Get state by key (useful for retrieving state without re-creating)\n */\nexport function getStateByKey<T>(key: string): Signal<T> | undefined {\n const entry = stateRegistry.get(key);\n return entry?.signal as Signal<T> | undefined;\n}\n\n/**\n * Clear state registry (useful for testing)\n */\nexport function clearStateRegistry(): void {\n stateRegistry.clear();\n}\n",
8
+ "// State primitives with optional sync and persistence\n\nimport { effect, type Signal, signal } from \"@preact/signals\";\nimport type { MessageBus } from \"./message-bus\";\nimport { createStorageAdapter, type StorageAdapter } from \"./storage-adapter\";\nimport { createSyncAdapter, type SyncAdapter } from \"./sync-adapter\";\n\n/**\n * Signal extended with .loaded promise for hydration control\n */\ntype SignalWithLoaded<T> = Signal<T> & { loaded: Promise<void> };\n\n/**\n * Signal extended with .loaded and .verify properties for verification tracking\n */\ntype SignalWithVerify<T> = Signal<T> & { loaded: Promise<void>; verify: T };\n\ntype StateEntry<T> = {\n signal: Signal<T>;\n clock: number; // Lamport clock for causal ordering\n loaded: Promise<void>;\n updating: boolean;\n};\n\ntype StateOptions<T = unknown> = {\n // Legacy MessageBus support (deprecated, will be removed in v2.0)\n bus?: MessageBus;\n\n // New adapter system (recommended)\n storage?: StorageAdapter; // Custom storage adapter\n sync?: SyncAdapter; // Custom sync adapter\n\n // Behavior options\n debounceMs?: number; // Debounce storage writes\n validator?: (value: unknown) => value is T; // Runtime type validation\n verify?: boolean; // Enable verification tracking (creates plain object mirror)\n};\n\nconst stateRegistry = new Map<string, StateEntry<unknown>>();\n\n/**\n * Shared state: synced across all contexts AND persisted to storage\n *\n * Uses Lamport clock for conflict resolution. State is automatically:\n * - Loaded from chrome.storage on initialization\n * - Synced to other contexts via broadcast messages\n * - Persisted to chrome.storage on every change\n *\n * Available in: background, popup, options, devtools, content scripts\n * ⚠️ NOT available in page scripts (use content script state instead)\n *\n * @param key - Unique identifier for this state (e.g., \"app-settings\")\n * @param initialValue - Default value if nothing is in storage\n * @param options - Optional configuration (bus, debounceMs)\n * @returns Reactive signal that stays in sync across all contexts\n *\n * @example\n * ```typescript\n * // Define once, use everywhere\n * const settings = $sharedState(\"settings\", { theme: \"dark\" })\n *\n * // Changes automatically sync\n * settings.value = { theme: \"light\" }\n * ```\n */\nexport function $sharedState<T>(\n key: string,\n initialValue: T,\n options: StateOptions<T> = {}\n): Signal<T> & { loaded: Promise<void>; verify?: T } {\n const sig = createState(key, initialValue, {\n ...options,\n enableSync: true,\n enablePersist: true,\n });\n\n // Expose loaded promise for awaiting hydration\n const entry = stateRegistry.get(key);\n if (entry) {\n (sig as SignalWithLoaded<T>).loaded = entry.loaded;\n }\n\n return sig as Signal<T> & { loaded: Promise<void> };\n}\n\n/**\n * Synced state: synced across all contexts but NOT persisted\n *\n * State is broadcast to all contexts in real-time but resets on extension reload.\n *\n * Available in: background, popup, options, devtools, content scripts\n * ⚠️ NOT available in page scripts\n *\n * @param key - Unique identifier for this state\n * @param initialValue - Default value\n * @param options - Optional configuration\n * @returns Reactive signal synced across contexts (but not persisted)\n *\n * @example\n * ```typescript\n * // Temporary shared state\n * const activeTabId = $syncedState(\"active-tab\", null)\n * ```\n */\nexport function $syncedState<T>(\n key: string,\n initialValue: T,\n options: StateOptions<T> = {}\n): Signal<T> {\n return createState(key, initialValue, {\n ...options,\n enableSync: true,\n enablePersist: false,\n });\n}\n\n/**\n * Persisted state: persisted to storage but NOT synced across contexts\n *\n * Each context has its own copy of the state, persisted independently.\n *\n * Available in: background, popup, options, devtools, content scripts\n * ⚠️ NOT available in page scripts\n *\n * @param key - Unique identifier (use prefix like \"popup:state\" to avoid collisions)\n * @param initialValue - Default value\n * @param options - Optional configuration\n * @returns Reactive signal persisted to storage (but not synced)\n *\n * @example\n * ```typescript\n * // Each context has its own persisted state\n * const popupState = $persistedState(\"popup:last-panel\", \"home\")\n * const devtoolsState = $persistedState(\"devtools:expanded\", true)\n * ```\n */\nexport function $persistedState<T>(\n key: string,\n initialValue: T,\n options: StateOptions<T> = {}\n): Signal<T> & { loaded: Promise<void> } {\n const sig = createState(key, initialValue, {\n ...options,\n enableSync: false,\n enablePersist: true,\n });\n\n // Expose loaded promise for awaiting hydration\n const entry = stateRegistry.get(key);\n if (entry) {\n (sig as SignalWithLoaded<T>).loaded = entry.loaded;\n }\n\n return sig as Signal<T> & { loaded: Promise<void> };\n}\n\n/**\n * Local state: not synced, not persisted (like regular Preact signal)\n *\n * Simple reactive state that lives only in the current context.\n * Resets on reload or context restart.\n *\n * Available in: all contexts (including page scripts)\n *\n * @param initialValue - Default value\n * @returns Reactive signal (local only)\n *\n * @example\n * ```typescript\n * // Local UI state\n * const isLoading = $state(false)\n * const error = $state<string | null>(null)\n * ```\n */\nexport function $state<T>(initialValue: T): Signal<T> {\n return signal(initialValue);\n}\n\ntype InternalStateOptions<T = unknown> = StateOptions<T> & {\n enableSync: boolean; // Whether to enable sync (avoid collision with sync?: SyncAdapter)\n enablePersist: boolean; // Whether to enable persistence\n};\n\n// Deep equality check to prevent redundant updates\nexport function deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a == null || b == null) return false;\n if (typeof a !== \"object\" || typeof b !== \"object\") return false;\n\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n if (!keysB.includes(key)) return false;\n if (!deepEqual((a as Record<string, unknown>)[key], (b as Record<string, unknown>)[key]))\n return false;\n }\n\n return true;\n}\n\n/**\n * Resolve storage and sync adapters with three-tier priority:\n * 1. Explicit adapters from options (highest priority)\n * 2. MessageBus adapters (legacy, deprecated)\n * 3. Auto-detected adapters (default behavior)\n */\nfunction resolveAdapters(options: InternalStateOptions): {\n storage: StorageAdapter | null;\n sync: SyncAdapter | null;\n} {\n // Priority 1: Explicit adapters (partial or full)\n if (options.storage || options.sync) {\n return {\n storage: options.storage || (options.enablePersist ? createStorageAdapter() : null),\n sync: options.sync || (options.enableSync ? createSyncAdapter() : null),\n };\n }\n\n // Priority 2: MessageBus (legacy support)\n // Note: MessageBus doesn't provide sync adapter, only Chrome storage\n if (options.bus) {\n return {\n storage: options.bus.adapters.storage,\n sync: options.enableSync ? createSyncAdapter() : null,\n };\n }\n\n // Priority 3: Auto-detect based on enableSync and enablePersist flags\n return {\n storage: options.enablePersist ? createStorageAdapter() : null,\n sync: options.enableSync ? createSyncAdapter() : null,\n };\n}\n\nfunction createState<T>(key: string, initialValue: T, options: InternalStateOptions<T>): Signal<T> {\n // Return existing signal if already registered\n if (stateRegistry.has(key)) {\n return stateRegistry.get(key)?.signal as Signal<T>;\n }\n\n const sig = signal(initialValue);\n\n // Create verification mirror if requested\n if (options.verify) {\n // Create plain object mirror for verification\n const mirror = JSON.parse(JSON.stringify(initialValue)) as T;\n (sig as SignalWithVerify<T>).verify = mirror;\n }\n\n const entry: StateEntry<T> = {\n signal: sig,\n clock: 0,\n loaded: Promise.resolve(),\n updating: false,\n };\n\n // Resolve adapters (explicit, MessageBus, or auto-detect)\n const adapters = resolveAdapters(options);\n\n // Load from storage if persist is enabled\n if (options.enablePersist && adapters.storage) {\n entry.loaded = loadFromStorage(key, sig, entry, adapters.storage, options.validator);\n }\n\n // Watch for changes after initial load\n entry.loaded.then(() => {\n let debounceTimer: NodeJS.Timeout | null = null;\n let previousValue = sig.value;\n let isFirstRun = true;\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Sync effect requires coordination of multiple state change scenarios\n effect(() => {\n // Skip if update in progress (from incoming message)\n if (entry.updating) return;\n\n const value = sig.value;\n\n // Skip first run (effect fires immediately on registration)\n if (isFirstRun) {\n isFirstRun = false;\n return;\n }\n\n // Skip if value hasn't changed (deep equality check)\n if (deepEqual(value, previousValue)) {\n return;\n }\n\n previousValue = value;\n\n // Update verification mirror if enabled\n if (options.verify) {\n const verifySignal = sig as SignalWithVerify<T>;\n if (verifySignal.verify) {\n Object.assign(verifySignal.verify, JSON.parse(JSON.stringify(value)));\n }\n }\n\n // Increment clock monotonically\n entry.clock++;\n\n const doUpdate = () => {\n // Persist to storage\n if (options.enablePersist && adapters.storage) {\n persistToStorage(key, value, entry.clock, adapters.storage);\n }\n\n // Broadcast to other contexts\n if (options.enableSync && adapters.sync) {\n broadcastUpdate(key, value, entry.clock, adapters.sync);\n }\n };\n\n // Debounce if specified\n if (options.debounceMs) {\n if (debounceTimer) clearTimeout(debounceTimer);\n debounceTimer = setTimeout(doUpdate, options.debounceMs);\n } else {\n doUpdate();\n }\n });\n });\n\n // Listen for updates from other contexts (only if sync enabled)\n if (options.enableSync && adapters.sync) {\n // Connect if needed (some adapters require explicit connection)\n if (adapters.sync.connect) {\n adapters.sync.connect();\n }\n\n // Register sync message listener\n adapters.sync.onMessage<T>((message) => {\n if (message.key !== key) return;\n\n const oldClock = entry.clock;\n\n // Lamport clock rule: Always update to max(local, received)\n // This maintains causal ordering even when rejecting updates\n entry.clock = Math.max(entry.clock, message.clock);\n\n // Only accept value updates if received clock is strictly greater than old local clock\n // This ensures we only apply causally newer updates\n if (message.clock > oldClock) {\n // Validate incoming value if validator provided\n if (options.validator && !options.validator(message.value)) {\n console.warn(\n `[Polly] State \"${key}\": Received invalid value from sync (clock: ${message.clock})`,\n message.value\n );\n return;\n }\n\n // Skip redundant updates (deep equality check)\n if (deepEqual(entry.signal.value, message.value)) {\n return;\n }\n\n applyUpdate(entry, message.value as T, message.clock);\n }\n });\n }\n\n stateRegistry.set(key, entry as StateEntry<unknown>);\n return sig;\n}\n\nasync function loadFromStorage<T>(\n key: string,\n sig: Signal<T>,\n entry: StateEntry<T>,\n storage: StorageAdapter,\n validator?: (value: unknown) => value is T\n): Promise<void> {\n try {\n const result = await storage.get([key, `${key}:clock`]);\n\n if (result[key] !== undefined) {\n const storedValue = result[key];\n\n // Validate stored value if validator provided\n if (validator) {\n if (validator(storedValue)) {\n sig.value = storedValue;\n } else {\n console.warn(\n `[Polly] State \"${key}\": Stored value failed validation, using initial value`,\n storedValue\n );\n }\n } else {\n sig.value = storedValue as T;\n }\n }\n\n if (result[`${key}:clock`] !== undefined) {\n entry.clock = result[`${key}:clock`] as number;\n }\n } catch (error) {\n console.warn(`[Polly] Failed to load state from storage: ${key}`, error);\n }\n}\n\nfunction persistToStorage<T>(key: string, value: T, clock: number, storage: StorageAdapter): void {\n try {\n storage.set({\n [key]: value,\n [`${key}:clock`]: clock,\n });\n } catch (error) {\n console.warn(`[Polly] Failed to persist state to storage: ${key}`, error);\n }\n}\n\nfunction broadcastUpdate<T>(key: string, value: T, clock: number, sync: SyncAdapter): void {\n try {\n sync.broadcast({\n key,\n value,\n clock,\n });\n } catch (error) {\n console.warn(`[Polly] Failed to broadcast state update: ${key}`, error);\n }\n}\n\nfunction applyUpdate<T>(entry: StateEntry<T>, value: T, clock: number): void {\n entry.updating = true;\n entry.signal.value = value;\n entry.clock = clock;\n entry.updating = false;\n}\n\n/**\n * Get state by key (useful for retrieving state without re-creating)\n */\nexport function getStateByKey<T>(key: string): Signal<T> | undefined {\n const entry = stateRegistry.get(key);\n return entry?.signal as Signal<T> | undefined;\n}\n\n/**\n * Clear state registry (useful for testing)\n */\nexport function clearStateRegistry(): void {\n stateRegistry.clear();\n}\n",
9
9
  "// Shared application state\n\nimport { signal } from \"@preact/signals\";\nimport { $sharedState, $syncedState } from \"../lib/state\";\nimport type { Settings } from \"../types/messages\";\nimport { defaultSettings as _defaultSettings } from \"../types/messages\";\n\n// Re-export for convenience\nexport { defaultSettings } from \"../types/messages\";\n\n// Synced across all contexts, persisted to storage\nexport const settings = $sharedState<Settings>(\"app-settings\", _defaultSettings);\n\n// Synced but not persisted\nexport const currentTab = $syncedState<number | null>(\"current-tab\", null);\n\n// Local to each context (not synced) - use regular signal\nexport const uiState = signal({\n sidebarOpen: false,\n selectedPanel: \"main\" as \"main\" | \"settings\" | \"debug\",\n});\n"
10
10
  ],
11
- "mappings": "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",
12
- "debugId": "A70234750500B96364756E2164756E21",
11
+ "mappings": "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",
12
+ "debugId": "90836AFC087E673864756E2164756E21",
13
13
  "names": []
14
14
  }
@@ -2,27 +2,37 @@ var __defProp = Object.defineProperty;
2
2
  var __getOwnPropNames = Object.getOwnPropertyNames;
3
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
4
  var __hasOwnProp = Object.prototype.hasOwnProperty;
5
- var __moduleCache = /* @__PURE__ */ new WeakMap;
5
+ function __accessProp(key) {
6
+ return this[key];
7
+ }
6
8
  var __toCommonJS = (from) => {
7
- var entry = __moduleCache.get(from), desc;
9
+ var entry = (__moduleCache ??= new WeakMap).get(from), desc;
8
10
  if (entry)
9
11
  return entry;
10
12
  entry = __defProp({}, "__esModule", { value: true });
11
- if (from && typeof from === "object" || typeof from === "function")
12
- __getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
13
- get: () => from[key],
14
- enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
15
- }));
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (var key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(entry, key))
16
+ __defProp(entry, key, {
17
+ get: __accessProp.bind(from, key),
18
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
19
+ });
20
+ }
16
21
  __moduleCache.set(from, entry);
17
22
  return entry;
18
23
  };
24
+ var __moduleCache;
25
+ var __returnValue = (v) => v;
26
+ function __exportSetter(name, newValue) {
27
+ this[name] = __returnValue.bind(null, newValue);
28
+ }
19
29
  var __export = (target, all) => {
20
30
  for (var name in all)
21
31
  __defProp(target, name, {
22
32
  get: all[name],
23
33
  enumerable: true,
24
34
  configurable: true,
25
- set: (newValue) => all[name] = () => newValue
35
+ set: __exportSetter.bind(all, name)
26
36
  });
27
37
  };
28
38
  var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
@@ -58,4 +68,4 @@ export {
58
68
  ALL_CONTEXTS
59
69
  };
60
70
 
61
- //# debugId=5A8122FF834D08B464756E2164756E21
71
+ //# debugId=B4E1C7E77BD7A1B864756E2164756E21
@@ -4,7 +4,7 @@
4
4
  "sourcesContent": [
5
5
  "// Type definitions for all messages in the extension\n\n/**\n * Base message interface that all messages must satisfy.\n * This allows users to define custom messages alongside framework messages.\n */\nexport interface BaseMessage {\n type: string;\n}\n\nexport type Context =\n | \"background\"\n | \"content\"\n | \"page\"\n | \"devtools\"\n | \"popup\"\n | \"options\"\n | \"sidepanel\"\n | \"offscreen\";\n\n// All contexts (useful for broadcast)\nexport const ALL_CONTEXTS: Context[] = [\n \"background\",\n \"content\",\n \"page\",\n \"devtools\",\n \"popup\",\n \"options\",\n \"sidepanel\",\n \"offscreen\",\n] as const;\n\n// Settings schema\nexport type Settings = {\n theme: \"light\" | \"dark\" | \"auto\";\n autoSync: boolean;\n debugMode: boolean;\n notifications: boolean;\n apiEndpoint: string;\n refreshInterval: number;\n};\n\nexport const defaultSettings: Settings = {\n theme: \"auto\",\n autoSync: true,\n debugMode: false,\n notifications: true,\n apiEndpoint: \"https://api.example.com\",\n refreshInterval: 60000,\n};\n\n// Logging types\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport type LogEntry = {\n id: string;\n level: LogLevel;\n message: string;\n context?: Record<string, unknown>;\n error?: string;\n stack?: string;\n source: Context;\n timestamp: number;\n};\n\n// All possible messages (discriminated union)\nexport type ExtensionMessage =\n // DOM Operations (handled by Content Script)\n | { type: \"DOM_QUERY\"; selector: string }\n | { type: \"DOM_UPDATE\"; selector: string; content: string }\n | {\n type: \"DOM_INSERT\";\n position: \"beforebegin\" | \"afterbegin\" | \"beforeend\" | \"afterend\";\n html: string;\n }\n | { type: \"DOM_REMOVE\"; selector: string }\n\n // Page Script Operations (handled by Page Script)\n | { type: \"PAGE_EVAL\"; code: string }\n | { type: \"PAGE_GET_VAR\"; varName: string }\n | { type: \"PAGE_CALL_FN\"; fnName: string; args: unknown[] }\n | { type: \"PAGE_SET_VAR\"; varName: string; value: unknown }\n\n // API Operations (handled by Background)\n | {\n type: \"API_REQUEST\";\n endpoint: string;\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\";\n body?: unknown;\n headers?: Record<string, string>;\n }\n | {\n type: \"API_BATCH\";\n requests: Array<{ endpoint: string; method: string; body?: unknown }>;\n }\n\n // Clipboard Operations (handled by Offscreen)\n | { type: \"CLIPBOARD_WRITE\"; text: string }\n | { type: \"CLIPBOARD_WRITE_HTML\"; html: string }\n | { type: \"CLIPBOARD_WRITE_RICH\"; data: { text: string; html: string } }\n | { type: \"CLIPBOARD_READ\" }\n\n // Context Menu (handled by Background)\n | {\n type: \"CONTEXT_MENU_CLICKED\";\n menuId: string;\n info: chrome.contextMenus.OnClickData;\n tabId: number;\n }\n | {\n type: \"CONTEXT_MENU_CREATE\";\n id: string;\n title: string;\n contexts: chrome.contextMenus.ContextType[];\n }\n | { type: \"CONTEXT_MENU_REMOVE\"; id: string }\n\n // State Sync (broadcast) - Internal only, handled by state primitives\n | {\n type: \"STATE_SYNC\";\n key: string;\n value: unknown;\n clock: number;\n }\n\n // Tab Operations (handled by Background)\n | { type: \"TAB_QUERY\"; queryInfo: chrome.tabs.QueryInfo }\n | { type: \"TAB_GET_CURRENT\" }\n | { type: \"TAB_RELOAD\"; tabId: number }\n\n // DevTools Operations\n | { type: \"DEVTOOLS_INSPECT_ELEMENT\"; selector: string }\n | {\n type: \"DEVTOOLS_LOG\";\n level: \"log\" | \"warn\" | \"error\";\n message: string;\n data?: unknown;\n }\n\n // Logging (handled by Background LogStore)\n | {\n type: \"LOG\";\n level: LogLevel;\n message: string;\n context?: Record<string, unknown>;\n error?: string;\n stack?: string;\n source: Context;\n timestamp: number;\n }\n | {\n type: \"LOGS_GET\";\n filters?: {\n level?: LogLevel;\n source?: Context;\n since?: number;\n limit?: number;\n };\n }\n | { type: \"LOGS_CLEAR\" }\n | { type: \"LOGS_EXPORT\" }\n\n // Test Messages (only used in tests)\n | { type: \"TEST_MESSAGE\"; data?: unknown }\n | { type: \"TEST\"; iteration?: number }\n | { type: \"CUSTOM_MESSAGE\"; data?: unknown }\n | { type: \"SETTINGS_GET\" }\n | {\n type: \"SIGNAL_UPDATE\";\n key?: string;\n value?: unknown;\n signalId?: string;\n source?: Context;\n }\n | {\n type: \"USER_DATA\";\n password?: string;\n apiKey?: string;\n [key: string]: unknown;\n };\n\n// Helper: Look up the full message type from a union based on the 'type' discriminator\ntype LookupMessage<TUnion, TType extends string> = TUnion extends { type: TType } ? TUnion : never;\n\n// Extract response type from message using phantom type\n// If message has __response field (phantom type), use it; otherwise infer from framework messages\nexport type MessageResponse<T extends BaseMessage> =\n // First, try to find the matching message in the union by type discriminator\n T extends { type: infer TType extends string }\n ? LookupMessage<T, TType> extends { readonly __response?: infer R }\n ? R // Found phantom type, use it\n : T extends ExtensionMessage\n ? // Framework message - infer from type\n // DOM Operations\n T extends { type: \"DOM_QUERY\" }\n ? {\n elements: Array<{\n tag: string;\n text: string;\n html: string;\n attrs: Record<string, string>;\n rect?: DOMRect;\n }>;\n }\n : T extends { type: \"DOM_UPDATE\" }\n ? { success: boolean }\n : T extends { type: \"DOM_INSERT\" }\n ? { success: boolean }\n : T extends { type: \"DOM_REMOVE\" }\n ? { success: boolean; count: number }\n : // Page Script Operations\n T extends { type: \"PAGE_EVAL\" }\n ? { result: unknown; error?: string }\n : T extends { type: \"PAGE_GET_VAR\" }\n ? { value: unknown; exists: boolean }\n : T extends { type: \"PAGE_CALL_FN\" }\n ? { result: unknown; error?: string }\n : T extends { type: \"PAGE_SET_VAR\" }\n ? { success: boolean }\n : // API Operations\n T extends { type: \"API_REQUEST\" }\n ? {\n data: unknown;\n status: number;\n statusText: string;\n headers: Record<string, string>;\n error?: string;\n }\n : T extends { type: \"API_BATCH\" }\n ? {\n results: Array<{\n data: unknown;\n status: number;\n error?: string;\n }>;\n }\n : // Clipboard Operations\n T extends { type: \"CLIPBOARD_WRITE\" }\n ? { success: boolean }\n : T extends { type: \"CLIPBOARD_WRITE_HTML\" }\n ? { success: boolean }\n : T extends { type: \"CLIPBOARD_WRITE_RICH\" }\n ? { success: boolean }\n : T extends { type: \"CLIPBOARD_READ\" }\n ? { text: string }\n : // Context Menu\n T extends { type: \"CONTEXT_MENU_CLICKED\" }\n ? undefined\n : T extends { type: \"CONTEXT_MENU_CREATE\" }\n ? { success: boolean }\n : T extends { type: \"CONTEXT_MENU_REMOVE\" }\n ? { success: boolean }\n : // State Sync\n T extends { type: \"STATE_SYNC\" }\n ? undefined\n : // Tab Operations\n T extends { type: \"TAB_QUERY\" }\n ? { tabs: chrome.tabs.Tab[] }\n : T extends {\n type: \"TAB_GET_CURRENT\";\n }\n ? { tab: chrome.tabs.Tab }\n : T extends {\n type: \"TAB_RELOAD\";\n }\n ? { success: boolean }\n : // DevTools Operations\n T extends {\n type: \"DEVTOOLS_INSPECT_ELEMENT\";\n }\n ? {\n success: boolean;\n }\n : T extends {\n type: \"DEVTOOLS_LOG\";\n }\n ? undefined\n : // Logging Operations\n T extends {\n type: \"LOG\";\n }\n ? {\n success: boolean;\n }\n : T extends {\n type: \"LOGS_GET\";\n }\n ? {\n logs: LogEntry[];\n }\n : T extends {\n type: \"LOGS_CLEAR\";\n }\n ? {\n success: boolean;\n count: number;\n }\n : T extends {\n type: \"LOGS_EXPORT\";\n }\n ? {\n json: string;\n count: number;\n }\n : T extends {\n type: \"SETTINGS_GET\";\n }\n ? {\n settings: unknown;\n }\n : undefined\n : unknown // For custom messages outside ExtensionMessage, require phantom type\n : unknown; // Fallback for messages without type field\n\n// Message handler mapping (which context handles which message)\n// Can be a single context or an array for multi-target routing\nexport type MessageHandler = {\n DOM_QUERY: \"content\";\n DOM_UPDATE: \"content\";\n DOM_INSERT: \"content\";\n DOM_REMOVE: \"content\";\n\n PAGE_EVAL: \"page\";\n PAGE_GET_VAR: \"page\";\n PAGE_CALL_FN: \"page\";\n PAGE_SET_VAR: \"page\";\n\n API_REQUEST: \"background\";\n API_BATCH: \"background\";\n\n CLIPBOARD_WRITE: \"offscreen\";\n CLIPBOARD_WRITE_HTML: \"offscreen\";\n CLIPBOARD_WRITE_RICH: \"offscreen\";\n CLIPBOARD_READ: \"offscreen\";\n\n CONTEXT_MENU_CLICKED: \"background\";\n CONTEXT_MENU_CREATE: \"background\";\n CONTEXT_MENU_REMOVE: \"background\";\n\n STATE_SYNC: Context[]; // Broadcast to all contexts\n\n TAB_QUERY: \"background\";\n TAB_GET_CURRENT: \"background\";\n TAB_RELOAD: \"background\";\n\n DEVTOOLS_INSPECT_ELEMENT: \"content\";\n DEVTOOLS_LOG: \"background\";\n\n LOG: \"background\";\n LOGS_GET: \"background\";\n LOGS_CLEAR: \"background\";\n LOGS_EXPORT: \"background\";\n};\n\n// Routed message envelope\nexport type RoutedMessage<T extends BaseMessage = ExtensionMessage> = {\n id: string; // Correlation ID (UUID)\n source: Context; // Which context sent it\n targets: Context[]; // Which contexts should receive this (can be multiple)\n tabId?: number; // Required for per-tab contexts\n timestamp: number; // When it was sent\n payload: T; // The actual message\n};\n\n// Routed response envelope\nexport type RoutedResponse<T extends BaseMessage = ExtensionMessage> = {\n id: string; // Matches request ID\n success: boolean; // Whether operation succeeded\n data?: MessageResponse<T>; // Response data\n error?: string; // Error message if failed\n timestamp: number; // When response was sent\n};\n"
6
6
  ],
7
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBO,IAAM,eAA0B;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAYO,IAAM,kBAA4B;AAAA,EACvC,OAAO;AAAA,EACP,UAAU;AAAA,EACV,WAAW;AAAA,EACX,eAAe;AAAA,EACf,aAAa;AAAA,EACb,iBAAiB;AACnB;",
8
- "debugId": "5A8122FF834D08B464756E2164756E21",
7
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBO,IAAM,eAA0B;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAYO,IAAM,kBAA4B;AAAA,EACvC,OAAO;AAAA,EACP,UAAU;AAAA,EACV,WAAW;AAAA,EACX,eAAe;AAAA,EACf,aAAa;AAAA,EACb,iBAAiB;AACnB;",
8
+ "debugId": "B4E1C7E77BD7A1B864756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,13 +1,17 @@
1
1
  #!/usr/bin/env bun
2
2
  import { createRequire } from "node:module";
3
3
  var __defProp = Object.defineProperty;
4
+ var __returnValue = (v) => v;
5
+ function __exportSetter(name, newValue) {
6
+ this[name] = __returnValue.bind(null, newValue);
7
+ }
4
8
  var __export = (target, all) => {
5
9
  for (var name in all)
6
10
  __defProp(target, name, {
7
11
  get: all[name],
8
12
  enumerable: true,
9
13
  configurable: true,
10
- set: (newValue) => all[name] = () => newValue
14
+ set: __exportSetter.bind(all, name)
11
15
  });
12
16
  };
13
17
  var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
@@ -101,4 +105,4 @@ async function main() {
101
105
  }
102
106
  main();
103
107
 
104
- //# debugId=8DFD34795203F90064756E2164756E21
108
+ //# debugId=9EEC04EE1CB54E2B64756E2164756E21
@@ -5,7 +5,7 @@
5
5
  "#!/usr/bin/env bun\n// CLI for project initialization\n\nimport { existsSync } from \"node:fs\";\nimport {\n getTemplateDir,\n type ProjectType,\n scaffoldFromTemplate,\n validateProjectName,\n} from \"./template-utils.ts\";\n\nasync function main() {\n const args = process.argv.slice(2);\n const cwd = process.cwd();\n\n // Parse arguments\n const projectName = args[0] || \"my-project\";\n const typeArg = args.find((arg) => arg.startsWith(\"--type=\"))?.split(\"=\")[1] || \"extension\";\n const projectType = typeArg as ProjectType;\n\n // Validate project name\n const validation = validateProjectName(projectName);\n if (!validation.valid) {\n console.log(`\\x1b[31m✗ ${validation.error}\\x1b[0m\\n`);\n process.exit(1);\n }\n\n const projectPath = `${cwd}/${projectName}`;\n\n // Check if directory already exists\n if (existsSync(projectPath)) {\n console.log(`\\x1b[31m✗ Directory '${projectName}' already exists\\x1b[0m\\n`);\n process.exit(1);\n }\n\n // Get template directory\n const templateDir = getTemplateDir(projectType, import.meta.dir);\n\n // Scaffold project\n await scaffoldFromTemplate({\n projectName,\n projectPath,\n projectType,\n templateDir,\n });\n}\n\nmain();\n",
6
6
  "/**\n * Template utilities for project initialization\n */\n\nimport { cpSync, existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nexport type ProjectType = \"extension\" | \"pwa\" | \"websocket\" | \"generic\";\n\nexport interface TemplateOptions {\n projectName: string;\n projectPath: string;\n projectType: ProjectType;\n templateDir: string;\n}\n\n/**\n * Process template file and replace placeholders\n */\nexport function processTemplate(content: string, projectName: string): string {\n return content\n .replace(/\\{\\{PROJECT_NAME\\}\\}/g, projectName)\n .replace(/\\{\\{PROJECT_NAME_UPPER\\}\\}/g, projectName.toUpperCase())\n .replace(/\\{\\{PROJECT_NAME_CAMEL\\}\\}/g, toCamelCase(projectName));\n}\n\n/**\n * Convert string to camelCase\n */\nfunction toCamelCase(str: string): string {\n return str\n .replace(/[-_](.)/g, (_, char) => char.toUpperCase())\n .replace(/^(.)/, (char) => char.toLowerCase());\n}\n\n/**\n * Copy template directory to project\n */\nexport async function scaffoldFromTemplate(options: TemplateOptions): Promise<void> {\n const { projectName, projectPath, templateDir } = options;\n\n // Create project directory\n mkdirSync(projectPath, { recursive: true });\n\n // Copy all template files\n copyTemplateFiles(templateDir, projectPath, projectName);\n}\n\n/**\n * Recursively copy template files and process them\n */\nfunction copyTemplateFiles(\n sourceDir: string,\n targetDir: string,\n projectName: string,\n relativePath = \"\"\n): void {\n if (!existsSync(sourceDir)) {\n throw new Error(`Template directory not found: ${sourceDir}`);\n }\n\n const entries = readdirSync(sourceDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const sourcePath = join(sourceDir, entry.name);\n const targetPath = join(targetDir, relativePath, entry.name.replace(\".template\", \"\"));\n\n if (entry.isDirectory()) {\n // Create directory and recurse\n mkdirSync(targetPath, { recursive: true });\n copyTemplateFiles(sourcePath, targetDir, projectName, join(relativePath, entry.name));\n } else if (entry.name.endsWith(\".template\")) {\n // Process template file\n const content = readFileSync(sourcePath, \"utf-8\");\n const processed = processTemplate(content, projectName);\n writeFileSync(targetPath, processed, \"utf-8\");\n } else {\n // Copy binary files as-is\n cpSync(sourcePath, targetPath);\n }\n }\n}\n\n/**\n * Get available project types\n */\nexport function getAvailableTypes(): ProjectType[] {\n return [\"extension\", \"pwa\", \"websocket\", \"generic\"];\n}\n\n/**\n * Get template directory for project type\n */\nexport function getTemplateDir(projectType: ProjectType, baseDir: string): string {\n return join(baseDir, \"..\", \"templates\", projectType);\n}\n\n/**\n * Validate project name\n */\nexport function validateProjectName(name: string): {\n valid: boolean;\n error?: string;\n} {\n if (!name || name.trim().length === 0) {\n return { valid: false, error: \"Project name cannot be empty\" };\n }\n\n if (!/^[a-z0-9-_]+$/i.test(name)) {\n return {\n valid: false,\n error: \"Project name can only contain letters, numbers, hyphens, and underscores\",\n };\n }\n\n if (name.startsWith(\"-\") || name.startsWith(\"_\")) {\n return {\n valid: false,\n error: \"Project name cannot start with a hyphen or underscore\",\n };\n }\n\n return { valid: true };\n}\n"
7
7
  ],
8
- "mappings": "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",
9
- "debugId": "8DFD34795203F90064756E2164756E21",
8
+ "mappings": "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",
9
+ "debugId": "9EEC04EE1CB54E2B64756E2164756E21",
10
10
  "names": []
11
11
  }
@@ -12,8 +12,7 @@
12
12
  "verify:setup": "polly verify --setup",
13
13
  "visualize": "polly visualize",
14
14
  "visualize:export": "polly visualize --export",
15
- "visualize:serve": "polly visualize --serve",
16
- "teach": "polly teach"
15
+ "visualize:serve": "polly visualize --serve"
17
16
  },
18
17
  "dependencies": {
19
18
  "@fairfox/polly": "^0.7.3"
@@ -40,5 +40,5 @@ export declare function createMockChrome(): MockChrome;
40
40
  * Returns mock adapters with full type information
41
41
  */
42
42
  export declare function createMockAdapters(): MockExtensionAdapters;
43
- export { createMockRuntime, createMockPort, createMockStorageArea, createMockTabs, createMockWindow, createMockOffscreen, createMockContextMenus, createMockFetch, createMockLogger, };
44
- export type { MockRuntime, MockPort, MockStorageArea, MockTabs, MockWindow, MockOffscreen, MockContextMenus, MockFetch, MockLogger, };
43
+ export type { MockContextMenus, MockFetch, MockLogger, MockOffscreen, MockPort, MockRuntime, MockStorageArea, MockTabs, MockWindow, };
44
+ export { createMockContextMenus, createMockFetch, createMockLogger, createMockOffscreen, createMockPort, createMockRuntime, createMockStorageArea, createMockTabs, createMockWindow, };
@@ -2,27 +2,37 @@ var __defProp = Object.defineProperty;
2
2
  var __getOwnPropNames = Object.getOwnPropertyNames;
3
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
4
  var __hasOwnProp = Object.prototype.hasOwnProperty;
5
- var __moduleCache = /* @__PURE__ */ new WeakMap;
5
+ function __accessProp(key) {
6
+ return this[key];
7
+ }
6
8
  var __toCommonJS = (from) => {
7
- var entry = __moduleCache.get(from), desc;
9
+ var entry = (__moduleCache ??= new WeakMap).get(from), desc;
8
10
  if (entry)
9
11
  return entry;
10
12
  entry = __defProp({}, "__esModule", { value: true });
11
- if (from && typeof from === "object" || typeof from === "function")
12
- __getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
13
- get: () => from[key],
14
- enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
15
- }));
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (var key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(entry, key))
16
+ __defProp(entry, key, {
17
+ get: __accessProp.bind(from, key),
18
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
19
+ });
20
+ }
16
21
  __moduleCache.set(from, entry);
17
22
  return entry;
18
23
  };
24
+ var __moduleCache;
25
+ var __returnValue = (v) => v;
26
+ function __exportSetter(name, newValue) {
27
+ this[name] = __returnValue.bind(null, newValue);
28
+ }
19
29
  var __export = (target, all) => {
20
30
  for (var name in all)
21
31
  __defProp(target, name, {
22
32
  get: all[name],
23
33
  enumerable: true,
24
34
  configurable: true,
25
- set: (newValue) => all[name] = () => newValue
35
+ set: __exportSetter.bind(all, name)
26
36
  });
27
37
  };
28
38
  var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
@@ -408,4 +418,4 @@ export {
408
418
  createMockAdapters
409
419
  };
410
420
 
411
- //# debugId=8DF249191A898FFD64756E2164756E21
421
+ //# debugId=F158E21DAE5357DA64756E2164756E21
@@ -10,9 +10,9 @@
10
10
  "import type { StorageAdapter, StorageChanges } from \"@/shared/adapters/storage.adapter\";\n\nexport interface MockStorageArea extends StorageAdapter {\n _data: Map<string, unknown>;\n}\n\nexport function createMockStorageArea(): MockStorageArea {\n const data = new Map<string, unknown>();\n\n return {\n get: async <T = Record<string, unknown>>(\n keys?: string | string[] | Record<string, unknown> | null\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Mock storage needs to handle multiple key types\n ): Promise<T> => {\n if (!keys) {\n return Object.fromEntries(data) as T;\n }\n if (typeof keys === \"string\") {\n return (data.has(keys) ? { [keys]: data.get(keys) } : {}) as T;\n }\n if (Array.isArray(keys)) {\n const result: Record<string, unknown> = {};\n for (const key of keys) {\n if (data.has(key)) {\n result[key] = data.get(key);\n }\n }\n return result as T;\n }\n // Object with defaults\n const result: Record<string, unknown> = {};\n for (const [key, defaultValue] of Object.entries(keys)) {\n result[key] = data.has(key) ? data.get(key) : defaultValue;\n }\n return result as T;\n },\n set: async (items) => {\n for (const [key, value] of Object.entries(items)) {\n data.set(key, value);\n }\n },\n remove: async (keys) => {\n const keyArray = Array.isArray(keys) ? keys : [keys];\n for (const key of keyArray) {\n data.delete(key);\n }\n },\n clear: async () => {\n data.clear();\n },\n onChanged: (_callback: (changes: StorageChanges, areaName: string) => void) => {\n // Mock implementation - not needed for current tests\n },\n _data: data,\n };\n}\n",
11
11
  "import type { TabsAdapter } from \"@/shared/adapters/tabs.adapter\";\n\nexport interface MockTabs extends TabsAdapter {\n _tabs: Map<number, chrome.tabs.Tab>;\n}\n\nexport function createMockTabs(): MockTabs {\n const tabs = new Map<number, chrome.tabs.Tab>();\n\n return {\n query: async (queryInfo: chrome.tabs.QueryInfo): Promise<chrome.tabs.Tab[]> => {\n const results: chrome.tabs.Tab[] = [];\n for (const tab of tabs.values()) {\n let matches = true;\n if (queryInfo.active !== undefined && tab.active !== queryInfo.active) {\n matches = false;\n }\n if (queryInfo.currentWindow !== undefined) {\n matches = false;\n }\n if (matches) {\n results.push(tab);\n }\n }\n return results;\n },\n get: async (tabId: number): Promise<chrome.tabs.Tab> => {\n const tab = tabs.get(tabId);\n if (!tab) {\n throw new Error(`Tab ${tabId} not found`);\n }\n return tab;\n },\n sendMessage: async (_tabId: number, _message: unknown): Promise<unknown> => {\n return Promise.resolve({ success: true });\n },\n reload: async (\n _tabId: number,\n _reloadProperties?: { bypassCache?: boolean }\n ): Promise<void> => {\n // Mock implementation\n },\n onRemoved: (\n _callback: (tabId: number, removeInfo: chrome.tabs.OnRemovedInfo) => void\n ): void => {\n // Mock implementation - register listener\n },\n onUpdated: (\n _callback: (\n tabId: number,\n changeInfo: chrome.tabs.OnUpdatedInfo,\n tab: chrome.tabs.Tab\n ) => void\n ): void => {\n // Mock implementation - register listener\n },\n onActivated: (_callback: (activeInfo: { tabId: number; windowId: number }) => void): void => {\n // Mock implementation - register listener\n },\n create: async (createProperties: chrome.tabs.CreateProperties): Promise<chrome.tabs.Tab> => {\n const newTab: chrome.tabs.Tab = {\n id: Math.floor(Math.random() * 10000),\n index: tabs.size,\n pinned: false,\n highlighted: false,\n windowId: 1,\n active: true,\n incognito: false,\n selected: true,\n discarded: false,\n autoDiscardable: true,\n groupId: -1,\n url: createProperties.url || \"about:blank\",\n title: createProperties.url || \"New Tab\",\n frozen: false,\n };\n if (newTab.id !== undefined) {\n tabs.set(newTab.id, newTab);\n }\n return newTab;\n },\n _tabs: tabs,\n };\n}\n",
12
12
  "import type { WindowAdapter } from \"@/shared/adapters/window.adapter\";\n\nexport interface MockWindow extends WindowAdapter {\n _messageListeners: Set<(event: MessageEvent) => void>;\n}\n\nexport function createMockWindow(): MockWindow {\n const messageListeners = new Set<(event: MessageEvent) => void>();\n\n return {\n postMessage: (message: unknown, targetOrigin: string) => {\n const event = new MessageEvent(\"message\", {\n data: message,\n origin: targetOrigin,\n source: null,\n });\n for (const listener of messageListeners) {\n listener(event);\n }\n },\n addEventListener: (type: string, listener: (event: MessageEvent) => void) => {\n if (type === \"message\") {\n messageListeners.add(listener);\n }\n },\n removeEventListener: (type: string, listener: (event: MessageEvent) => void) => {\n if (type === \"message\") {\n messageListeners.delete(listener);\n }\n },\n _messageListeners: messageListeners,\n };\n}\n",
13
- "import { createMockContextMenus, type MockContextMenus } from \"./context-menus.mock\";\nimport { createMockFetch, type MockFetch } from \"./fetch.mock\";\nimport { createMockLogger, type MockLogger } from \"./logger.mock\";\nimport { createMockOffscreen, type MockOffscreen } from \"./offscreen.mock\";\nimport { createMockPort, createMockRuntime, type MockPort, type MockRuntime } from \"./runtime.mock\";\nimport { createMockStorageArea, type MockStorageArea } from \"./storage.mock\";\nimport { createMockTabs, type MockTabs } from \"./tabs.mock\";\nimport { createMockWindow, type MockWindow } from \"./window.mock\";\n\n/**\n * Mock adapters with full type information including mock-specific properties\n */\nexport interface MockExtensionAdapters {\n runtime: MockRuntime;\n storage: MockStorageArea;\n tabs: MockTabs;\n window: MockWindow;\n offscreen: MockOffscreen;\n contextMenus: MockContextMenus;\n fetch: MockFetch;\n logger: MockLogger;\n}\n\n/**\n * Convenience interface grouping Chrome-like mock APIs\n * Useful when tests need direct access to internal mock state\n */\nexport interface MockChrome {\n runtime: MockRuntime;\n storage: {\n local: MockStorageArea;\n };\n tabs: MockTabs;\n}\n\n/**\n * Create a mock Chrome object with grouped APIs\n * Use this when you need access to internal mock state (e.g., mockChrome.tabs._tabs)\n */\nexport function createMockChrome(): MockChrome {\n return {\n runtime: createMockRuntime(),\n storage: {\n local: createMockStorageArea(),\n },\n tabs: createMockTabs(),\n };\n}\n\n/**\n * Create a complete set of mock adapters for testing\n * Returns mock adapters with full type information\n */\nexport function createMockAdapters(): MockExtensionAdapters {\n return {\n runtime: createMockRuntime(),\n storage: createMockStorageArea(),\n tabs: createMockTabs(),\n window: createMockWindow(),\n offscreen: createMockOffscreen(),\n contextMenus: createMockContextMenus(),\n fetch: createMockFetch(),\n logger: createMockLogger({ silent: true }),\n };\n}\n\n// Re-export individual mock factories and types for convenience\nexport {\n createMockRuntime,\n createMockPort,\n createMockStorageArea,\n createMockTabs,\n createMockWindow,\n createMockOffscreen,\n createMockContextMenus,\n createMockFetch,\n createMockLogger,\n};\n\nexport type {\n MockRuntime,\n MockPort,\n MockStorageArea,\n MockTabs,\n MockWindow,\n MockOffscreen,\n MockContextMenus,\n MockFetch,\n MockLogger,\n};\n"
13
+ "import { createMockContextMenus, type MockContextMenus } from \"./context-menus.mock\";\nimport { createMockFetch, type MockFetch } from \"./fetch.mock\";\nimport { createMockLogger, type MockLogger } from \"./logger.mock\";\nimport { createMockOffscreen, type MockOffscreen } from \"./offscreen.mock\";\nimport { createMockPort, createMockRuntime, type MockPort, type MockRuntime } from \"./runtime.mock\";\nimport { createMockStorageArea, type MockStorageArea } from \"./storage.mock\";\nimport { createMockTabs, type MockTabs } from \"./tabs.mock\";\nimport { createMockWindow, type MockWindow } from \"./window.mock\";\n\n/**\n * Mock adapters with full type information including mock-specific properties\n */\nexport interface MockExtensionAdapters {\n runtime: MockRuntime;\n storage: MockStorageArea;\n tabs: MockTabs;\n window: MockWindow;\n offscreen: MockOffscreen;\n contextMenus: MockContextMenus;\n fetch: MockFetch;\n logger: MockLogger;\n}\n\n/**\n * Convenience interface grouping Chrome-like mock APIs\n * Useful when tests need direct access to internal mock state\n */\nexport interface MockChrome {\n runtime: MockRuntime;\n storage: {\n local: MockStorageArea;\n };\n tabs: MockTabs;\n}\n\n/**\n * Create a mock Chrome object with grouped APIs\n * Use this when you need access to internal mock state (e.g., mockChrome.tabs._tabs)\n */\nexport function createMockChrome(): MockChrome {\n return {\n runtime: createMockRuntime(),\n storage: {\n local: createMockStorageArea(),\n },\n tabs: createMockTabs(),\n };\n}\n\n/**\n * Create a complete set of mock adapters for testing\n * Returns mock adapters with full type information\n */\nexport function createMockAdapters(): MockExtensionAdapters {\n return {\n runtime: createMockRuntime(),\n storage: createMockStorageArea(),\n tabs: createMockTabs(),\n window: createMockWindow(),\n offscreen: createMockOffscreen(),\n contextMenus: createMockContextMenus(),\n fetch: createMockFetch(),\n logger: createMockLogger({ silent: true }),\n };\n}\n\nexport type {\n MockContextMenus,\n MockFetch,\n MockLogger,\n MockOffscreen,\n MockPort,\n MockRuntime,\n MockStorageArea,\n MockTabs,\n MockWindow,\n};\n// Re-export individual mock factories and types for convenience\nexport {\n createMockContextMenus,\n createMockFetch,\n createMockLogger,\n createMockOffscreen,\n createMockPort,\n createMockRuntime,\n createMockStorageArea,\n createMockTabs,\n createMockWindow,\n};\n"
14
14
  ],
15
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMO,SAAS,sBAAsB,GAAqB;AAAA,EACzD,MAAM,QAAQ,IAAI;AAAA,EAElB,OAAO;AAAA,IACL,QAAQ,OAAO,qBAA0E;AAAA,MACvF,IAAI,iBAAiB,IAAI;AAAA,QACvB,MAAM,IAAI,iBAAiB,IAAI,gBAAgB;AAAA,MACjD;AAAA;AAAA,IAEF,QAAQ,OACN,KACA,sBACkB;AAAA,IAGpB,QAAQ,OAAO,QAA+B;AAAA,IAG9C,WAAW,YAA2B;AAAA,IAGtC,WAAW,CACT,cACS;AAAA,IAGX,QAAQ;AAAA,EACV;AAAA;;;AC1BK,SAAS,eAAe,GAAc;AAAA,EAC3C,MAAM,YAAsC,CAAC;AAAA,EAC7C,MAAM,QAA4D,CAAC;AAAA,EAEnE,OAAO;AAAA,IACL,OAAO,OAAO,OAAqB,SAA0C;AAAA,MAC3E,MAAM,KAAK,EAAE,UAAW,QAAQ,EAAE,KAAK,EAAG,CAAC;AAAA,MAE3C,MAAM,eAAe,UAAU,MAAM,KAAK;AAAA,QACxC,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS,IAAI;AAAA,QACb,YAAY;AAAA,QACZ,MAAM,aAAa,CAAC;AAAA,QACpB,MAAM,YAAY;AAAA,QAClB,MAAM,YAAY,IAAI;AAAA,QACtB,aAAa,YAAY,IAAI,YAAY,CAAC;AAAA,QAC1C,UAAU,YAAY,IAAI;AAAA,MAC5B;AAAA,MAEA,OAAO;AAAA;AAAA,IAET,YAAY;AAAA,IACZ,QAAQ;AAAA,EACV;AAAA;;;ACdK,SAAS,gBAAgB,CAAC,SAA4C;AAAA,EAC3E,MAAM,QAAmB,CAAC;AAAA,EAC1B,MAAM,SAAS,SAAS,UAAU;AAAA,EAElC,MAAM,eAAe,CAAC,OAAiB,SAAiB,YAAsC;AAAA,IAC5F,IAAI,CAAC,QAAQ;AAAA,MAEX,MAAM,gBAAgB,UAAU,UAAU,QAAQ,MAAM,QAAQ;AAAA,MAChE,cAAc,SAAS,OAAO;AAAA,IAChC;AAAA;AAAA,EAGF,OAAO;AAAA,IACL,KAAK,CAAC,SAAiB,SAAyC;AAAA,MAC9D,MAAM,KAAK;AAAA,QACT,OAAO;AAAA,QACP;AAAA,WACI,WAAW,EAAE,QAAQ;AAAA,QACzB,WAAW,KAAK,IAAI;AAAA,MACtB,CAAC;AAAA,MACD,aAAa,SAAS,SAAS,OAAO;AAAA;AAAA,IAGxC,IAAI,CAAC,SAAiB,SAAyC;AAAA,MAC7D,MAAM,KAAK;AAAA,QACT,OAAO;AAAA,QACP;AAAA,WACI,WAAW,EAAE,QAAQ;AAAA,QACzB,WAAW,KAAK,IAAI;AAAA,MACtB,CAAC;AAAA,MACD,aAAa,QAAQ,SAAS,OAAO;AAAA;AAAA,IAGvC,IAAI,CAAC,SAAiB,SAAyC;AAAA,MAC7D,MAAM,KAAK;AAAA,QACT,OAAO;AAAA,QACP;AAAA,WACI,WAAW,EAAE,QAAQ;AAAA,QACzB,WAAW,KAAK,IAAI;AAAA,MACtB,CAAC;AAAA,MACD,aAAa,QAAQ,SAAS,OAAO;AAAA;AAAA,IAGvC,KAAK,CAAC,SAAiB,OAAe,SAAyC;AAAA,MAC7E,MAAM,KAAK;AAAA,QACT,OAAO;AAAA,QACP;AAAA,WACI,SAAS,EAAE,MAAM;AAAA,WACjB,WAAW,EAAE,QAAQ;AAAA,QACzB,WAAW,KAAK,IAAI;AAAA,MACtB,CAAC;AAAA,MACD,aAAa,SAAS,SAAS,KAAK,SAAS,MAAM,CAAC;AAAA;AAAA,IAGtD,GAAG,CAAC,OAAiB,SAAiB,SAAyC;AAAA,MAC7E,MAAM,KAAK;AAAA,QACT;AAAA,QACA;AAAA,WACI,WAAW,EAAE,QAAQ;AAAA,QACzB,WAAW,KAAK,IAAI;AAAA,MACtB,CAAC;AAAA,MACD,aAAa,OAAO,SAAS,OAAO;AAAA;AAAA,IAItC,QAAQ;AAAA,IACR,MAAM,GAAG;AAAA,MACP,MAAM,SAAS;AAAA;AAAA,EAEnB;AAAA;;;AC7EK,SAAS,mBAAmB,GAAkB;AAAA,EACnD,IAAI,cAAc;AAAA,EAElB,OAAO;AAAA,IACL,gBAAgB,OAAO,gBAAkE;AAAA,MACvF,cAAc;AAAA;AAAA,IAEhB,eAAe,YAA2B;AAAA,MACxC,cAAc;AAAA;AAAA,IAEhB,aAAa,YAA8B;AAAA,MACzC,OAAO;AAAA;AAAA,IAET,cAAc;AAAA,EAChB;AAAA;;;AChBK,SAAS,cAAc,CAAC,MAAwB;AAAA,EACrD,MAAM,YAAY,IAAI;AAAA,EACtB,MAAM,sBAAsB,IAAI;AAAA,EAEhC,OAAO;AAAA,IACL;AAAA,IACA,WAAW,CAAC,aAAa,UAAU,IAAI,QAAQ;AAAA,IAC/C,cAAc,CAAC,aAAa,oBAAoB,IAAI,QAAQ;AAAA,IAC5D,aAAa,CAAC,YAAY;AAAA,MACxB,WAAW,YAAY,WAAW;AAAA,QAChC,SAAS,OAAO;AAAA,MAClB;AAAA;AAAA,IAEF,YAAY,MAAM;AAAA,MAChB,WAAW,YAAY,qBAAqB;AAAA,QAC1C,SAAS;AAAA,MACX;AAAA;AAAA,IAEF,YAAY;AAAA,IACZ,sBAAsB;AAAA,EACxB;AAAA;AAWK,SAAS,iBAAiB,CAAC,KAAK,qBAAkC;AAAA,EACvE,MAAM,mBAAmB,IAAI;AAAA,EAG7B,MAAM,mBAAmB,IAAI;AAAA,EAE7B,OAAO;AAAA,IACL;AAAA,IACA,aAAa,OAAU,YAAiC;AAAA,MAEtD,IAAI,OAAO,YAAY,YAAY,YAAY,QAAQ,aAAa,SAAS;AAAA,QAE3E,WAAW,YAAY,kBAAkB;AAAA,UACvC,SAAS,SAAS,EAAE,KAAK,GAAG,GAAG,MAAM,EAEpC;AAAA,QACH;AAAA,QACA;AAAA,MACF;AAAA,MAGA,IAAI,iBAAiB,SAAS,GAAG;AAAA,QAC/B;AAAA,MACF;AAAA,MAEA,OAAO,IAAI,QAAQ,CAAC,YAAY;AAAA,QAC9B,IAAI,WAAW;AAAA,QACf,MAAM,qBAAqB,CAAC,QAAiB;AAAA,UAC3C,IAAI,CAAC,UAAU;AAAA,YACb,WAAW;AAAA,YACX,QAAQ,GAAG;AAAA,UACb;AAAA;AAAA,QAIF,WAAW,YAAY,kBAAkB;AAAA,UACvC,MAAM,SAAS,SAAS,SAAS,EAAE,KAAK,GAAG,GAAG,kBAAkB;AAAA,UAGhE,IAAI,OAAO,WAAW,aAAa,WAAW,MAAM,CAEpD;AAAA,QACF;AAAA,QAGA,IAAI,CAAC,UAAU;AAAA,UACb,QAAQ,SAAS;AAAA,QACnB;AAAA,OACD;AAAA;AAAA,IAEH,WAAW,CACT,aAKG;AAAA,MACH,iBAAiB,IAAI,QAAQ;AAAA;AAAA,IAE/B,uBAAuB,CACrB,aAKG;AAAA,MACH,iBAAiB,OAAO,QAAQ;AAAA;AAAA,IAElC,SAAS,CAAC,SAA8B;AAAA,MACtC,MAAM,OAAO,eAAe,IAAI;AAAA,MAChC,WAAW,YAAY,kBAAkB;AAAA,QACvC,SAAS,IAAI;AAAA,MACf;AAAA,MACA,OAAO;AAAA;AAAA,IAET,WAAW,CAAC,aAA0C;AAAA,MACpD,iBAAiB,IAAI,QAAQ;AAAA;AAAA,IAE/B,QAAQ,CAAC,SAAyB;AAAA,MAChC,OAAO,sBAAsB,MAAM;AAAA;AAAA,IAErC,OAAO,MAAc;AAAA,MACnB,OAAO;AAAA;AAAA,IAET,iBAAiB,MAAY;AAAA,IAG7B,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,EACrB;AAAA;;;ACzHK,SAAS,qBAAqB,GAAoB;AAAA,EACvD,MAAM,OAAO,IAAI;AAAA,EAEjB,OAAO;AAAA,IACL,KAAK,OACH,SAEe;AAAA,MACf,IAAI,CAAC,MAAM;AAAA,QACT,OAAO,OAAO,YAAY,IAAI;AAAA,MAChC;AAAA,MACA,IAAI,OAAO,SAAS,UAAU;AAAA,QAC5B,OAAQ,KAAK,IAAI,IAAI,IAAI,GAAG,OAAO,KAAK,IAAI,IAAI,EAAE,IAAI,CAAC;AAAA,MACzD;AAAA,MACA,IAAI,MAAM,QAAQ,IAAI,GAAG;AAAA,QACvB,MAAM,UAAkC,CAAC;AAAA,QACzC,WAAW,OAAO,MAAM;AAAA,UACtB,IAAI,KAAK,IAAI,GAAG,GAAG;AAAA,YACjB,QAAO,OAAO,KAAK,IAAI,GAAG;AAAA,UAC5B;AAAA,QACF;AAAA,QACA,OAAO;AAAA,MACT;AAAA,MAEA,MAAM,SAAkC,CAAC;AAAA,MACzC,YAAY,KAAK,iBAAiB,OAAO,QAAQ,IAAI,GAAG;AAAA,QACtD,OAAO,OAAO,KAAK,IAAI,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI;AAAA,MAChD;AAAA,MACA,OAAO;AAAA;AAAA,IAET,KAAK,OAAO,UAAU;AAAA,MACpB,YAAY,KAAK,UAAU,OAAO,QAAQ,KAAK,GAAG;AAAA,QAChD,KAAK,IAAI,KAAK,KAAK;AAAA,MACrB;AAAA;AAAA,IAEF,QAAQ,OAAO,SAAS;AAAA,MACtB,MAAM,WAAW,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC,IAAI;AAAA,MACnD,WAAW,OAAO,UAAU;AAAA,QAC1B,KAAK,OAAO,GAAG;AAAA,MACjB;AAAA;AAAA,IAEF,OAAO,YAAY;AAAA,MACjB,KAAK,MAAM;AAAA;AAAA,IAEb,WAAW,CAAC,cAAmE;AAAA,IAG/E,OAAO;AAAA,EACT;AAAA;;;AChDK,SAAS,cAAc,GAAa;AAAA,EACzC,MAAM,OAAO,IAAI;AAAA,EAEjB,OAAO;AAAA,IACL,OAAO,OAAO,cAAiE;AAAA,MAC7E,MAAM,UAA6B,CAAC;AAAA,MACpC,WAAW,OAAO,KAAK,OAAO,GAAG;AAAA,QAC/B,IAAI,UAAU;AAAA,QACd,IAAI,UAAU,WAAW,aAAa,IAAI,WAAW,UAAU,QAAQ;AAAA,UACrE,UAAU;AAAA,QACZ;AAAA,QACA,IAAI,UAAU,kBAAkB,WAAW;AAAA,UACzC,UAAU;AAAA,QACZ;AAAA,QACA,IAAI,SAAS;AAAA,UACX,QAAQ,KAAK,GAAG;AAAA,QAClB;AAAA,MACF;AAAA,MACA,OAAO;AAAA;AAAA,IAET,KAAK,OAAO,UAA4C;AAAA,MACtD,MAAM,MAAM,KAAK,IAAI,KAAK;AAAA,MAC1B,IAAI,CAAC,KAAK;AAAA,QACR,MAAM,IAAI,MAAM,OAAO,iBAAiB;AAAA,MAC1C;AAAA,MACA,OAAO;AAAA;AAAA,IAET,aAAa,OAAO,QAAgB,aAAwC;AAAA,MAC1E,OAAO,QAAQ,QAAQ,EAAE,SAAS,KAAK,CAAC;AAAA;AAAA,IAE1C,QAAQ,OACN,QACA,sBACkB;AAAA,IAGpB,WAAW,CACT,cACS;AAAA,IAGX,WAAW,CACT,cAKS;AAAA,IAGX,aAAa,CAAC,cAA+E;AAAA,IAG7F,QAAQ,OAAO,qBAA6E;AAAA,MAC1F,MAAM,SAA0B;AAAA,QAC9B,IAAI,KAAK,MAAM,KAAK,OAAO,IAAI,GAAK;AAAA,QACpC,OAAO,KAAK;AAAA,QACZ,QAAQ;AAAA,QACR,aAAa;AAAA,QACb,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,UAAU;AAAA,QACV,WAAW;AAAA,QACX,iBAAiB;AAAA,QACjB,SAAS;AAAA,QACT,KAAK,iBAAiB,OAAO;AAAA,QAC7B,OAAO,iBAAiB,OAAO;AAAA,QAC/B,QAAQ;AAAA,MACV;AAAA,MACA,IAAI,OAAO,OAAO,WAAW;AAAA,QAC3B,KAAK,IAAI,OAAO,IAAI,MAAM;AAAA,MAC5B;AAAA,MACA,OAAO;AAAA;AAAA,IAET,OAAO;AAAA,EACT;AAAA;;;AC5EK,SAAS,gBAAgB,GAAe;AAAA,EAC7C,MAAM,mBAAmB,IAAI;AAAA,EAE7B,OAAO;AAAA,IACL,aAAa,CAAC,SAAkB,iBAAyB;AAAA,MACvD,MAAM,QAAQ,IAAI,aAAa,WAAW;AAAA,QACxC,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV,CAAC;AAAA,MACD,WAAW,YAAY,kBAAkB;AAAA,QACvC,SAAS,KAAK;AAAA,MAChB;AAAA;AAAA,IAEF,kBAAkB,CAAC,MAAc,aAA4C;AAAA,MAC3E,IAAI,SAAS,WAAW;AAAA,QACtB,iBAAiB,IAAI,QAAQ;AAAA,MAC/B;AAAA;AAAA,IAEF,qBAAqB,CAAC,MAAc,aAA4C;AAAA,MAC9E,IAAI,SAAS,WAAW;AAAA,QACtB,iBAAiB,OAAO,QAAQ;AAAA,MAClC;AAAA;AAAA,IAEF,mBAAmB;AAAA,EACrB;AAAA;;;ACQK,SAAS,gBAAgB,GAAe;AAAA,EAC7C,OAAO;AAAA,IACL,SAAS,kBAAkB;AAAA,IAC3B,SAAS;AAAA,MACP,OAAO,sBAAsB;AAAA,IAC/B;AAAA,IACA,MAAM,eAAe;AAAA,EACvB;AAAA;AAOK,SAAS,kBAAkB,GAA0B;AAAA,EAC1D,OAAO;AAAA,IACL,SAAS,kBAAkB;AAAA,IAC3B,SAAS,sBAAsB;AAAA,IAC/B,MAAM,eAAe;AAAA,IACrB,QAAQ,iBAAiB;AAAA,IACzB,WAAW,oBAAoB;AAAA,IAC/B,cAAc,uBAAuB;AAAA,IACrC,OAAO,gBAAgB;AAAA,IACvB,QAAQ,iBAAiB,EAAE,QAAQ,KAAK,CAAC;AAAA,EAC3C;AAAA;",
16
- "debugId": "8DF249191A898FFD64756E2164756E21",
15
+ "mappings": "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",
16
+ "debugId": "F158E21DAE5357DA64756E2164756E21",
17
17
  "names": []
18
18
  }
@@ -2,27 +2,37 @@ var __defProp = Object.defineProperty;
2
2
  var __getOwnPropNames = Object.getOwnPropertyNames;
3
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
4
  var __hasOwnProp = Object.prototype.hasOwnProperty;
5
- var __moduleCache = /* @__PURE__ */ new WeakMap;
5
+ function __accessProp(key) {
6
+ return this[key];
7
+ }
6
8
  var __toCommonJS = (from) => {
7
- var entry = __moduleCache.get(from), desc;
9
+ var entry = (__moduleCache ??= new WeakMap).get(from), desc;
8
10
  if (entry)
9
11
  return entry;
10
12
  entry = __defProp({}, "__esModule", { value: true });
11
- if (from && typeof from === "object" || typeof from === "function")
12
- __getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
13
- get: () => from[key],
14
- enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
15
- }));
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (var key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(entry, key))
16
+ __defProp(entry, key, {
17
+ get: __accessProp.bind(from, key),
18
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
19
+ });
20
+ }
16
21
  __moduleCache.set(from, entry);
17
22
  return entry;
18
23
  };
24
+ var __moduleCache;
25
+ var __returnValue = (v) => v;
26
+ function __exportSetter(name, newValue) {
27
+ this[name] = __returnValue.bind(null, newValue);
28
+ }
19
29
  var __export = (target, all) => {
20
30
  for (var name in all)
21
31
  __defProp(target, name, {
22
32
  get: all[name],
23
33
  enumerable: true,
24
34
  configurable: true,
25
- set: (newValue) => all[name] = () => newValue
35
+ set: __exportSetter.bind(all, name)
26
36
  });
27
37
  };
28
38
  var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
@@ -440,4 +450,4 @@ export {
440
450
  createMockAdapters
441
451
  };
442
452
 
443
- //# debugId=5D4DC5C15E10102464756E2164756E21
453
+ //# debugId=91CFEC8B98E4A03564756E2164756E21