@haex-space/vault-sdk 2.5.37 → 2.5.40

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.
package/dist/vue.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/polyfills/localStorage.ts","../src/polyfills/cookies.ts","../src/polyfills/history.ts","../src/messages.ts","../src/polyfills/debug.ts","../src/polyfills/consoleForwarding.ts","../src/polyfills/index.ts","../src/events.ts","../src/types.ts","../src/methods.ts","../src/api/storage.ts","../src/api/database.ts","../src/api/filesync.ts","../src/api/filesystem.ts","../src/api/web.ts","../src/api/permissions.ts","../src/client/tableName.ts","../src/client/init.ts","../src/commands.ts","../src/transport/handlers/database.ts","../src/transport/handlers/permissions.ts","../src/transport/handlers/web.ts","../src/transport/handlers/filesystem.ts","../src/transport/handlers/external.ts","../src/transport/handlers/filesync.ts","../src/transport/handlers/index.ts","../src/client/transport.ts","../src/client/events.ts","../src/client/database.ts","../src/client/external.ts","../src/client.ts","../src/index.ts","../src/vue.ts"],"names":["extensionInfo","context","result"],"mappings":"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","file":"vue.mjs","sourcesContent":["/**\n * localStorage Polyfill for HaexSpace Extensions\n *\n * Provides an in-memory fallback when localStorage is blocked\n * due to custom protocol restrictions (haex-extension://)\n */\n\nexport function installLocalStoragePolyfill(): void {\n if (typeof window === 'undefined') {\n return; // Skip in Node.js environment\n }\n\n console.log('[HaexSpace] Storage Polyfill loading immediately');\n\n // Test if localStorage is available\n let localStorageWorks = false;\n try {\n const testKey = '__ls_test__';\n localStorage.setItem(testKey, testKey);\n localStorage.removeItem(testKey);\n localStorageWorks = true;\n } catch (e) {\n console.warn('[HaexSpace] localStorage blocked – using in-memory fallback');\n }\n\n // If blocked: Replace with In-Memory Storage\n if (!localStorageWorks) {\n const lsStorage = new Map<string, string>();\n\n const localStoragePoly: Storage = {\n getItem(key: string): string | null {\n return lsStorage.get(key) || null;\n },\n setItem(key: string, value: string): void {\n lsStorage.set(key, String(value));\n },\n removeItem(key: string): void {\n lsStorage.delete(key);\n },\n clear(): void {\n lsStorage.clear();\n },\n get length(): number {\n return lsStorage.size;\n },\n key(index: number): string | null {\n return Array.from(lsStorage.keys())[index] || null;\n }\n };\n\n try {\n Object.defineProperty(window, 'localStorage', {\n value: localStoragePoly,\n writable: true,\n configurable: true\n });\n } catch (e) {\n // Fallback: Direct assignment\n (window as any).localStorage = localStoragePoly;\n }\n\n console.log('[HaexSpace] localStorage replaced with in-memory polyfill');\n }\n}\n\n/**\n * sessionStorage Polyfill for HaexSpace Extensions\n *\n * Provides a no-op implementation as session state doesn't work\n * reliably in custom protocol contexts\n */\nexport function installSessionStoragePolyfill(): void {\n if (typeof window === 'undefined') {\n return;\n }\n\n try {\n const sessionStoragePoly: Storage = {\n getItem(): null {\n return null;\n },\n setItem(): void {},\n removeItem(): void {},\n clear(): void {},\n get length(): number {\n return 0;\n },\n key(): null {\n return null;\n }\n };\n\n Object.defineProperty(window, 'sessionStorage', {\n value: sessionStoragePoly,\n writable: true,\n configurable: true\n });\n } catch (e) {\n // Fallback: Direct assignment\n (window as any).sessionStorage = {\n getItem: () => null,\n setItem: () => {},\n removeItem: () => {},\n clear: () => {},\n get length() { return 0; },\n key: () => null\n };\n }\n\n console.log('[HaexSpace] sessionStorage polyfill installed');\n}\n","/**\n * Cookie Polyfill for HaexSpace Extensions\n *\n * Provides an in-memory cookie implementation when cookies are blocked\n * due to custom protocol restrictions (haex-extension://)\n */\n\nexport function installCookiePolyfill(): void {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n return; // Skip in Node.js environment\n }\n\n // Test if cookies are available\n let cookiesWork = false;\n try {\n document.cookie = \"__cookie_test__=1\";\n cookiesWork = document.cookie.indexOf(\"__cookie_test__\") !== -1;\n } catch (e) {\n console.warn(\"[HaexSpace] Cookies blocked – using in-memory fallback\");\n }\n\n if (!cookiesWork) {\n const cookieStore = new Map<string, string>();\n\n Object.defineProperty(document, \"cookie\", {\n get(): string {\n const cookies: string[] = [];\n cookieStore.forEach((value, key) => {\n cookies.push(`${key}=${value}`);\n });\n return cookies.join(\"; \");\n },\n set(cookieString: string): void {\n const parts = cookieString.split(\";\").map((p) => p.trim());\n const [keyValue] = parts;\n\n if (!keyValue) return;\n\n const [key, value] = keyValue.split(\"=\");\n if (!key) return;\n\n // Parse options\n const options: Record<string, string | boolean> = {};\n for (let i = 1; i < parts.length; i++) {\n const part = parts[i];\n if (!part) continue;\n const parts_split = part.split(\"=\");\n const optKey = parts_split[0];\n const optValue = parts_split[1];\n if (optKey) {\n options[optKey.toLowerCase()] = optValue || true;\n }\n }\n\n // Check for deletion (expires in past)\n const expiresValue = options.expires;\n if (expiresValue && typeof expiresValue === \"string\") {\n const expiresDate = new Date(expiresValue);\n if (expiresDate < new Date()) {\n cookieStore.delete(key);\n return;\n }\n }\n\n // Check for max-age=0 deletion\n const maxAgeValue = options[\"max-age\"];\n if (typeof maxAgeValue === \"string\" && maxAgeValue === \"0\") {\n cookieStore.delete(key);\n return;\n }\n\n // Store cookie\n cookieStore.set(key, value || \"\");\n },\n configurable: true,\n });\n\n console.log(\"[HaexSpace] Cookie polyfill installed\");\n }\n}\n","/**\n * History API Polyfill for HaexSpace Extensions\n *\n * Works around SecurityError when using pushState/replaceState\n * in custom protocol contexts (haex-extension://)\n *\n * Falls back to hash-based routing when necessary\n */\n\nexport function installHistoryPolyfill(): void {\n if (typeof window === 'undefined' || typeof history === 'undefined') {\n return; // Skip in Node.js environment\n }\n\n // Install after DOM is ready to avoid race conditions\n const install = () => {\n console.log('[HaexSpace] History Patch loading');\n\n const originalPushState = history.pushState;\n const originalReplaceState = history.replaceState;\n let skipNextPush = false;\n let skipNextReplace = false;\n\n // Patch pushState\n history.pushState = function(\n state: any,\n title: string,\n url?: string | URL | null\n ): void {\n console.log('[HaexSpace] pushState called:', url, 'skip:', skipNextPush);\n\n if (skipNextPush) {\n skipNextPush = false;\n console.log('[HaexSpace] pushState skipped');\n return;\n }\n\n try {\n return originalPushState.call(this, state, title, url);\n } catch (e) {\n if ((e as Error).name === 'SecurityError' && url) {\n // Remove duplicate /#/ prefix\n const urlString = url.toString();\n let hashUrl = urlString.replace(/^\\/#/, '');\n hashUrl = hashUrl.startsWith('#') ? hashUrl : '#' + hashUrl;\n console.log('[HaexSpace] SecurityError - setting hash to:', hashUrl);\n skipNextPush = true;\n window.location.hash = hashUrl.replace(/^#/, '');\n return; // Silent fallback\n }\n throw e;\n }\n };\n\n // Patch replaceState\n history.replaceState = function(\n state: any,\n title: string,\n url?: string | URL | null\n ): void {\n console.log('[HaexSpace] replaceState called:', url, 'skip:', skipNextReplace);\n\n if (skipNextReplace) {\n skipNextReplace = false;\n console.log('[HaexSpace] replaceState skipped');\n return;\n }\n\n try {\n return originalReplaceState.call(this, state, title, url);\n } catch (e) {\n if ((e as Error).name === 'SecurityError' && url) {\n // Remove duplicate /#/ prefix\n const urlString = url.toString();\n let hashUrl = urlString.replace(/^\\/#/, '');\n hashUrl = hashUrl.startsWith('#') ? hashUrl : '#' + hashUrl;\n console.log('[HaexSpace] SecurityError - setting hash to:', hashUrl);\n skipNextReplace = true;\n window.location.hash = hashUrl.replace(/^#/, '');\n return; // Silent fallback\n }\n throw e;\n }\n };\n\n console.log('[HaexSpace] History API patched');\n };\n\n // Install after DOM is ready\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', install, { once: true });\n } else {\n // DOM already loaded, install immediately\n install();\n }\n}\n","/**\n * Central message type definitions for HaexSpace SDK\n *\n * Message Naming Schema: haexspace:{subject}\n *\n * These are used for internal communication between extensions and HaexSpace\n */\n\nexport const HAEXSPACE_MESSAGE_TYPES = {\n /** Debug message for development/troubleshooting */\n DEBUG: 'haexspace:debug',\n\n /** Console forwarding from extension iframe */\n CONSOLE_FORWARD: 'console.forward',\n} as const;\n\nexport type HaexspaceMessageType =\n (typeof HAEXSPACE_MESSAGE_TYPES)[keyof typeof HAEXSPACE_MESSAGE_TYPES];\n","import { HAEXSPACE_MESSAGE_TYPES } from '../messages';\n\n/**\n * Debug diagnostics for Android debugging\n * Tests window.parent availability and postMessage functionality\n */\nexport function installDebugDiagnostics(): void {\n if (typeof window === 'undefined') {\n return;\n }\n\n const hasParent = window.parent && window.parent !== window;\n console.log('[HaexSpace] hasParent:', hasParent);\n\n if (hasParent) {\n console.log('[HaexSpace] Attempting to send debug message to parent...');\n window.parent.postMessage({\n type: HAEXSPACE_MESSAGE_TYPES.DEBUG,\n data: `[Polyfills] window.parent test: exists=${!!window.parent}, different=${hasParent}, selfIsTop=${window.self === window.top}`\n }, '*');\n console.log('[HaexSpace] Debug message sent!');\n } else {\n console.log('[HaexSpace] No parent window or parent === window');\n }\n}\n","/**\n * Console Forwarding Polyfill\n *\n * Forwards all console messages from the extension IFrame to the parent window\n * so they can be displayed in the HaexSpace console tab\n */\n\nimport { HAEXSPACE_MESSAGE_TYPES } from '../messages';\n\nexport interface ConsoleMessage {\n timestamp: string\n level: 'log' | 'info' | 'warn' | 'error' | 'debug'\n message: string\n}\n\n// Store original console methods\nconst originalConsole = {\n log: console.log,\n info: console.info,\n warn: console.warn,\n error: console.error,\n debug: console.debug,\n}\n\nfunction serializeArgs(args: unknown[]): string {\n return args\n .map((arg) => {\n if (arg === null) return 'null'\n if (arg === undefined) return 'undefined'\n if (typeof arg === 'object') {\n try {\n return JSON.stringify(arg, null, 2)\n } catch {\n return String(arg)\n }\n }\n return String(arg)\n })\n .join(' ')\n}\n\nfunction interceptConsole(level: 'log' | 'info' | 'warn' | 'error' | 'debug') {\n console[level] = function (...args: unknown[]) {\n // Call original console method\n originalConsole[level].apply(console, args)\n\n // Forward to parent window if we're in an iframe\n if (window.self !== window.top && window.parent) {\n try {\n const message = serializeArgs(args)\n const timestamp = new Date().toLocaleTimeString()\n\n window.parent.postMessage(\n {\n type: HAEXSPACE_MESSAGE_TYPES.CONSOLE_FORWARD,\n data: {\n timestamp,\n level,\n message,\n },\n timestamp: Date.now(),\n },\n '*'\n )\n } catch (error) {\n // If forwarding fails, just log locally\n originalConsole.error('[HaexSpace] Failed to forward console message:', error)\n }\n }\n }\n}\n\nexport function installConsoleForwarding(debug: boolean = false): void {\n if (typeof window === 'undefined') {\n return\n }\n\n // Only install if we're in an iframe (extension context)\n if (window.self === window.top) {\n return\n }\n\n // Only install if debug mode is enabled\n if (!debug) {\n console.log('[HaexSpace] Console forwarding disabled (not in debug mode)')\n return\n }\n\n interceptConsole('log')\n interceptConsole('info')\n interceptConsole('warn')\n interceptConsole('error')\n interceptConsole('debug')\n\n console.log('[HaexSpace] Console forwarding installed')\n}\n","/**\n * HaexSpace Extension Polyfills\n *\n * Auto-initializing polyfills for localStorage, cookies, and history API\n * that work around restrictions in custom protocol contexts (haex-extension://)\n *\n * These polyfills are automatically installed when you import the SDK:\n *\n * ```typescript\n * import { createHaexVaultSdk } from '@haex-space/vault-sdk';\n * // Polyfills are active!\n * ```\n *\n * You can also install them manually:\n *\n * ```typescript\n * import { installPolyfills } from '@haex-space/vault-sdk/polyfills';\n * installPolyfills();\n * ```\n */\n\nimport { installLocalStoragePolyfill, installSessionStoragePolyfill } from './localStorage';\nimport { installCookiePolyfill } from './cookies';\nimport { installHistoryPolyfill } from './history';\nimport { installDebugDiagnostics } from './debug';\n\nexport { installLocalStoragePolyfill, installSessionStoragePolyfill } from './localStorage';\nexport { installCookiePolyfill } from './cookies';\nexport { installHistoryPolyfill } from './history';\nexport { installBaseTag } from './baseTag'; // Export for backwards compatibility, but not used in auto-install\nexport { installConsoleForwarding } from './consoleForwarding';\nexport { installDebugDiagnostics } from './debug';\n\n/**\n * Install all HaexSpace polyfills\n *\n * This function is called automatically when the SDK is imported.\n * You usually don't need to call this manually.\n */\nexport function installPolyfills(): void {\n if (typeof window === 'undefined') {\n return; // Skip in server-side environments\n }\n\n // Install localStorage and sessionStorage polyfills immediately\n // These need to be available before any app code runs\n installLocalStoragePolyfill();\n installSessionStoragePolyfill();\n\n // Install cookie polyfill immediately\n installCookiePolyfill();\n\n // Install history polyfill (waits for DOM ready internally)\n installHistoryPolyfill();\n\n // Note: Base tag is injected at build-time by Vite plugin, no runtime setup needed\n // Runtime base tag setup is disabled to prevent conflicts\n\n // Note: Console forwarding is installed by HaexVaultSdk when debug mode is enabled\n\n console.log('[HaexSpace] All polyfills loaded successfully');\n\n // Run debug diagnostics\n installDebugDiagnostics();\n}\n\n// Auto-install polyfills when this module is imported\n// This ensures extensions work out of the box without manual setup\nif (typeof window !== 'undefined') {\n installPolyfills();\n}\n","/**\n * Central event name definitions for HaexHub extensions\n *\n * Event Naming Schema: haextension:{subject}:{predicate}\n *\n * IMPORTANT: Tauri event names can only contain:\n * - Alphanumeric characters (a-z, A-Z, 0-9)\n * - Hyphens (-)\n * - Slashes (/)\n * - Colons (:)\n * - Underscores (_)\n *\n * NO dots (.) allowed!\n */\n\nexport const HAEXTENSION_EVENTS = {\n /** Context (theme, locale, platform) has changed */\n CONTEXT_CHANGED: 'haextension:context:changed',\n\n /** Search request from HaexHub */\n SEARCH_REQUEST: 'haextension:search:request',\n} as const;\n\nexport type HaextensionEvent = typeof HAEXTENSION_EVENTS[keyof typeof HAEXTENSION_EVENTS];\n\n/**\n * Events for external client communication (browser extensions, CLI tools, servers, etc.)\n */\nexport const EXTERNAL_EVENTS = {\n /** External request from authorized client */\n REQUEST: 'haextension:external:request',\n\n /** New external client requesting authorization */\n AUTHORIZATION_REQUEST: 'external:authorization-request',\n} as const;\n\nexport type ExternalEvent = typeof EXTERNAL_EVENTS[keyof typeof EXTERNAL_EVENTS];\n","import { HAEXTENSION_EVENTS, EXTERNAL_EVENTS } from './events';\n\n// Constants\nexport const DEFAULT_TIMEOUT = 30000; // 30 seconds in milliseconds\nexport const TABLE_SEPARATOR = \"__\"; // Separator for table name components: {publicKey}__{extensionName}__{tableName}\n\n/**\n * Build a fully qualified table name for extensions.\n * Use this in Drizzle schemas to create table names at build time.\n *\n * @param publicKey - The extension's public key (from manifest.json)\n * @param extensionName - The extension name (from manifest.json or package.json)\n * @param tableName - The table name (e.g., \"users\", \"items\")\n * @returns Fully qualified table name: `{publicKey}__{extensionName}__{tableName}`\n *\n * @example\n * ```typescript\n * import { getTableName } from \"@haex-space/vault-sdk\";\n * import manifest from \"../haextension/manifest.json\";\n * import pkg from \"../package.json\";\n *\n * const tableName = (name: string) =>\n * getTableName(manifest.publicKey, manifest.name || pkg.name, name);\n *\n * export const users = sqliteTable(tableName(\"users\"), { ... });\n * ```\n */\nexport function getTableName(\n publicKey: string,\n extensionName: string,\n tableName: string\n): string {\n return `${publicKey}${TABLE_SEPARATOR}${extensionName}${TABLE_SEPARATOR}${tableName}`;\n}\n\n// Core Protocol Types\nexport interface HaexHubRequest {\n method: string;\n params: Record<string, unknown>;\n timestamp: number;\n}\n\nexport interface HaexHubResponse<T = unknown> {\n id: string;\n result?: T;\n error?: HaexVaultSdkErrorData;\n}\n\nexport interface HaexVaultSdkErrorData {\n code: ErrorCode;\n message: string;\n details?: Record<string, unknown>;\n}\n\n// Extension Info (loaded from manifest.json at build time)\nexport interface ExtensionInfo {\n publicKey: string;\n name: string;\n version: string;\n displayName?: string;\n namespace?: string;\n}\n\n// Application Context (provided by HaexHub)\nexport interface ApplicationContext {\n theme: \"light\" | \"dark\" | \"system\";\n locale: string;\n platform:\n | \"linux\"\n | \"macos\"\n | \"ios\"\n | \"freebsd\"\n | \"dragonfly\"\n | \"netbsd\"\n | \"openbsd\"\n | \"solaris\"\n | \"android\"\n | \"windows\"\n | undefined;\n /** Unique device identifier (UUID) for multi-device sync */\n deviceId: string | undefined;\n}\n\n// Search Types\nexport interface SearchQuery {\n query: string;\n filters?: Record<string, unknown>;\n limit?: number;\n}\n\nexport interface SearchResult {\n id: string;\n title: string;\n description?: string;\n type: string;\n data?: Record<string, unknown>;\n score?: number;\n}\n\n// Permission Types\nexport enum PermissionStatus {\n GRANTED = \"granted\",\n DENIED = \"denied\",\n ASK = \"ask\",\n}\n\nexport interface PermissionResponse {\n status: PermissionStatus;\n permanent: boolean;\n}\n\n// Database Permission (matches Rust DbExtensionPermission)\nexport interface DatabasePermission {\n extensionId: string;\n resource: string;\n operation: \"read\" | \"write\";\n path: string;\n}\n\nexport interface DatabasePermissionRequest {\n resource: string;\n operation: \"read\" | \"write\";\n reason?: string;\n}\n\n// Database Types\nexport interface DatabaseQueryParams {\n query: string;\n params?: unknown[];\n}\n\nexport interface DatabaseQueryResult {\n rows: unknown[]; // Array of arrays (each row is an array of values)\n columns?: string[]; // Column names in order\n rowsAffected: number;\n lastInsertId?: number;\n}\n\nexport interface DatabaseExecuteParams {\n statements: string[];\n}\n\n// Migration Types\nexport interface MigrationResult {\n appliedCount: number;\n alreadyAppliedCount: number;\n appliedMigrations: string[];\n}\n\nexport interface Migration {\n name: string;\n sql: string;\n}\n\nexport interface DatabaseTableInfo {\n name: string;\n columns: DatabaseColumnInfo[];\n}\n\nexport interface DatabaseColumnInfo {\n name: string;\n type: string;\n notNull: boolean;\n defaultValue?: unknown;\n primaryKey: boolean;\n}\n\n// Event Types\nexport interface HaexHubEvent {\n type: string;\n data: unknown;\n timestamp: number;\n}\n\n// Specific Event Types\nexport interface ContextChangedEvent extends HaexHubEvent {\n type: typeof HAEXTENSION_EVENTS.CONTEXT_CHANGED;\n data: {\n context: ApplicationContext;\n };\n}\n\nexport interface SearchRequestEvent extends HaexHubEvent {\n type: typeof HAEXTENSION_EVENTS.SEARCH_REQUEST;\n data: {\n query: SearchQuery;\n requestId: string;\n };\n}\n\n/**\n * External request from an authorized client (browser extension, CLI, server, etc.)\n * These requests come through the WebSocket bridge and are routed to the appropriate extension.\n */\nexport interface ExternalRequestEvent extends HaexHubEvent {\n type: typeof EXTERNAL_EVENTS.REQUEST;\n data: ExternalRequest;\n}\n\n/**\n * External request payload\n */\nexport interface ExternalRequest {\n /** Unique request ID for response correlation */\n requestId: string;\n /** Client's public key (Base64 SPKI format, used as identifier) */\n publicKey: string;\n /** Action/method to perform (extension-specific) */\n action: string;\n /** Request payload (extension-specific) */\n payload: Record<string, unknown>;\n}\n\n/**\n * External request response (sent back to the client)\n */\nexport interface ExternalResponse {\n /** Request ID for correlation */\n requestId: string;\n /** Whether the request was successful */\n success: boolean;\n /** Response data (if successful) */\n data?: unknown;\n /** Error message (if failed) */\n error?: string;\n}\n\n/**\n * Handler function type for external requests\n */\nexport type ExternalRequestHandler = (\n request: ExternalRequest\n) => Promise<ExternalResponse> | ExternalResponse;\n\n/**\n * An authorized external client stored in the database\n */\nexport interface AuthorizedClient {\n /** Row ID */\n id: string;\n /** Unique client identifier (public key fingerprint) */\n clientId: string;\n /** Human-readable client name */\n clientName: string;\n /** Client's public key (base64) */\n publicKey: string;\n /** Extension ID this client can access */\n extensionId: string;\n /** When the client was authorized (ISO 8601) */\n authorizedAt: string | null;\n /** Last time the client connected (ISO 8601) */\n lastSeen: string | null;\n}\n\n/**\n * A blocked external client stored in the database\n */\nexport interface BlockedClient {\n /** Row ID */\n id: string;\n /** Unique client identifier (public key fingerprint) */\n clientId: string;\n /** Human-readable client name */\n clientName: string;\n /** Client's public key (base64) */\n publicKey: string;\n /** When the client was blocked (ISO 8601) */\n blockedAt: string | null;\n}\n\n/**\n * Extension requested by an external client\n */\nexport interface RequestedExtension {\n /** Extension name (e.g., \"haex-pass\") */\n name: string;\n /** Extension's public key (hex string from manifest) */\n extensionPublicKey: string;\n}\n\n/**\n * Pending authorization request waiting for user approval\n */\nexport interface PendingAuthorization {\n /** Unique client identifier */\n clientId: string;\n /** Human-readable client name */\n clientName: string;\n /** Client's public key (base64) */\n publicKey: string;\n /** Extensions the client wants to access (pre-selected in authorization dialog) */\n requestedExtensions: RequestedExtension[];\n}\n\n/**\n * Decision type for external authorization prompts\n */\nexport type ExternalAuthDecision = 'allow' | 'deny';\n\n/**\n * Session-based authorization entry (for \"allow once\" authorizations)\n * These are stored in-memory and cleared when haex-vault restarts.\n */\nexport interface SessionAuthorization {\n /** Unique client identifier (public key fingerprint) */\n clientId: string;\n /** Extension ID this client can access */\n extensionId: string;\n}\n\n// ============================================================================\n// External Bridge Connection Types\n// ============================================================================\n\n/**\n * Connection state for external clients connecting to haex-vault via WebSocket.\n * Used by browser extensions, CLI tools, servers, and other external clients.\n */\nexport enum ExternalConnectionState {\n /** Not connected to haex-vault */\n DISCONNECTED = 'disconnected',\n /** Attempting to establish connection */\n CONNECTING = 'connecting',\n /** WebSocket connected but not yet authorized */\n CONNECTED = 'connected',\n /** Connected and waiting for user approval in haex-vault */\n PENDING_APPROVAL = 'pending_approval',\n /** Connected and authorized to communicate */\n PAIRED = 'paired',\n}\n\n/**\n * Error codes for external client connections.\n * Used to identify specific error conditions for i18n in the frontend.\n */\nexport enum ExternalConnectionErrorCode {\n /** No error */\n NONE = 'none',\n /** Client is not authorized (rejected or not yet approved) */\n CLIENT_NOT_AUTHORIZED = 'client_not_authorized',\n /** Client was blocked by the user */\n CLIENT_BLOCKED = 'client_blocked',\n /** Connection to haex-vault failed (not running or network error) */\n CONNECTION_FAILED = 'connection_failed',\n /** Connection timed out */\n CONNECTION_TIMEOUT = 'connection_timeout',\n /** WebSocket connection was closed unexpectedly */\n CONNECTION_CLOSED = 'connection_closed',\n /** Failed to decrypt message (invalid key or corrupted data) */\n DECRYPTION_FAILED = 'decryption_failed',\n /** Invalid message format received */\n INVALID_MESSAGE = 'invalid_message',\n /** Unknown or unspecified error */\n UNKNOWN = 'unknown',\n}\n\n/**\n * Full connection status including state, client ID, and any error\n */\nexport interface ExternalConnection {\n /** Current connection state */\n state: ExternalConnectionState;\n /** Client identifier (derived from public key) */\n clientId: string | null;\n /** Error code for i18n (use this for translations) */\n errorCode: ExternalConnectionErrorCode;\n /** Error message (original message, for logging/debugging) */\n errorMessage: string | null;\n}\n\n/**\n * Check if external client connection state indicates an active connection\n * (connected, pending approval, or paired)\n */\nexport function isExternalClientConnected(state: ExternalConnectionState): boolean {\n return (\n state === ExternalConnectionState.CONNECTED ||\n state === ExternalConnectionState.PENDING_APPROVAL ||\n state === ExternalConnectionState.PAIRED\n );\n}\n\n/**\n * Check if external client can send requests (only when paired/authorized)\n */\nexport function canExternalClientSendRequests(state: ExternalConnectionState): boolean {\n return state === ExternalConnectionState.PAIRED;\n}\n\nexport type EventCallback = (event: HaexHubEvent) => void;\n\n// Manifest Types\nexport interface ExtensionManifest {\n name: string;\n version: string;\n author?: string | null;\n entry?: string | null;\n icon?: string | null;\n publicKey: string;\n signature: string;\n permissions: {\n database?: any[];\n filesystem?: any[];\n http?: any[];\n shell?: any[];\n };\n homepage?: string | null;\n description?: string | null;\n singleInstance?: boolean | null;\n displayMode?: \"auto\" | \"window\" | \"iframe\" | null;\n /**\n * Path to the migrations directory relative to the extension root.\n * Contains Drizzle-style migrations with meta/_journal.json and *.sql files.\n * These migrations will be applied when the extension is installed.\n * Example: \"database/migrations\"\n */\n migrationsDir?: string | null;\n}\n\n// Config Types\nexport interface HaexHubConfig {\n debug?: boolean;\n timeout?: number;\n /** Extension manifest data (auto-injected by framework integrations) */\n manifest?: ExtensionManifest;\n}\n\n// Web/Fetch Types\nexport interface WebRequestOptions {\n method?: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\" | \"HEAD\" | \"OPTIONS\";\n headers?: Record<string, string>;\n body?: string | ArrayBuffer | Blob;\n timeout?: number;\n}\n\nexport interface WebResponse {\n status: number;\n statusText: string;\n headers: Record<string, string>;\n body: ArrayBuffer;\n url: string;\n}\n\n// Error Codes\nexport enum ErrorCode {\n // Connection Errors\n TIMEOUT = \"TIMEOUT\",\n NOT_IN_IFRAME = \"NOT_IN_IFRAME\",\n UNAUTHORIZED_ORIGIN = \"UNAUTHORIZED_ORIGIN\",\n\n // Permission Errors\n PERMISSION_DENIED = \"PERMISSION_DENIED\",\n\n // Validation Errors\n INVALID_PUBLIC_KEY = \"INVALID_PUBLIC_KEY\",\n INVALID_EXTENSION_NAME = \"INVALID_EXTENSION_NAME\",\n INVALID_TABLE_NAME = \"INVALID_TABLE_NAME\",\n INVALID_PARAMS = \"INVALID_PARAMS\",\n\n // Extension Errors\n EXTENSION_NOT_INITIALIZED = \"EXTENSION_NOT_INITIALIZED\",\n EXTENSION_INFO_UNAVAILABLE = \"EXTENSION_INFO_UNAVAILABLE\",\n\n // API Errors\n METHOD_NOT_FOUND = \"METHOD_NOT_FOUND\",\n INTERNAL_ERROR = \"INTERNAL_ERROR\",\n DATABASE_ERROR = \"DATABASE_ERROR\",\n WEB_ERROR = \"WEB_ERROR\",\n}\n\nexport class HaexVaultSdkError extends Error {\n constructor(\n public code: ErrorCode,\n public messageKey: string,\n public details?: Record<string, unknown>\n ) {\n super(messageKey);\n this.name = \"HaexVaultSdkError\";\n }\n\n /**\n * Get localized error message\n * @param locale - Locale code (e.g., 'en', 'de')\n * @param translations - Translation object\n */\n getLocalizedMessage(\n locale: string = \"en\",\n translations?: Record<string, Record<string, string>>\n ): string {\n if (!translations || !translations[locale]) {\n return this.messageKey;\n }\n\n let message = translations[locale][this.messageKey] || this.messageKey;\n\n // Replace placeholders with details\n if (this.details) {\n Object.entries(this.details).forEach(([key, value]) => {\n message = message.replace(`{${key}}`, String(value));\n });\n }\n\n return message;\n }\n\n toJSON() {\n return {\n code: this.code,\n message: this.messageKey,\n details: this.details,\n };\n }\n}\n","/**\n * Central request method name definitions for HaexHub SDK\n *\n * Request Naming Schema: haextension:{subject}:{action}\n *\n * These are used for client.request() calls between extensions and HaexHub\n */\n\nexport const HAEXTENSION_METHODS = {\n context: {\n get: 'haextension:context:get',\n },\n\n database: {\n query: 'haextension:database:query',\n execute: 'haextension:database:execute',\n transaction: 'haextension:database:transaction',\n registerMigrations: 'haextension:database:register-migrations',\n },\n\n filesystem: {\n saveFile: 'haextension:filesystem:save-file',\n openFile: 'haextension:filesystem:open-file',\n showImage: 'haextension:filesystem:show-image',\n\n sync: {\n // Spaces\n listSpaces: 'haextension:filesystem:sync:list-spaces',\n createSpace: 'haextension:filesystem:sync:create-space',\n deleteSpace: 'haextension:filesystem:sync:delete-space',\n\n // Files\n listFiles: 'haextension:filesystem:sync:list-files',\n getFile: 'haextension:filesystem:sync:get-file',\n uploadFile: 'haextension:filesystem:sync:upload-file',\n downloadFile: 'haextension:filesystem:sync:download-file',\n deleteFile: 'haextension:filesystem:sync:delete-file',\n\n // Backends\n listBackends: 'haextension:filesystem:sync:list-backends',\n addBackend: 'haextension:filesystem:sync:add-backend',\n removeBackend: 'haextension:filesystem:sync:remove-backend',\n testBackend: 'haextension:filesystem:sync:test-backend',\n\n // Sync Rules\n listSyncRules: 'haextension:filesystem:sync:list-sync-rules',\n addSyncRule: 'haextension:filesystem:sync:add-sync-rule',\n updateSyncRule: 'haextension:filesystem:sync:update-sync-rule',\n removeSyncRule: 'haextension:filesystem:sync:remove-sync-rule',\n\n // Sync Operations\n getSyncStatus: 'haextension:filesystem:sync:get-sync-status',\n triggerSync: 'haextension:filesystem:sync:trigger-sync',\n pauseSync: 'haextension:filesystem:sync:pause-sync',\n resumeSync: 'haextension:filesystem:sync:resume-sync',\n\n // Conflict Resolution\n resolveConflict: 'haextension:filesystem:sync:resolve-conflict',\n\n // UI Helpers\n selectFolder: 'haextension:filesystem:sync:select-folder',\n scanLocal: 'haextension:filesystem:sync:scan-local',\n },\n },\n\n storage: {\n getItem: 'haextension:storage:get-item',\n setItem: 'haextension:storage:set-item',\n removeItem: 'haextension:storage:remove-item',\n clear: 'haextension:storage:clear',\n keys: 'haextension:storage:keys',\n },\n\n web: {\n fetch: 'haextension:web:fetch',\n },\n\n application: {\n open: 'haextension:application:open',\n },\n} as const;\n\n// Helper type to extract all string values from nested object\ntype DeepValues<T> = T extends object\n ? T[keyof T] extends string\n ? T[keyof T]\n : T[keyof T] extends object\n ? DeepValues<T[keyof T]>\n : never\n : never;\n\nexport type HaextensionMethod = DeepValues<typeof HAEXTENSION_METHODS>;\n","import type { HaexVaultSdk } from \"~/client\";\nimport { HAEXTENSION_METHODS } from \"~/methods\";\n\nexport class StorageAPI {\n constructor(private client: HaexVaultSdk) {}\n\n async getItem(key: string): Promise<string | null> {\n return this.client.request<string | null>(HAEXTENSION_METHODS.storage.getItem, { key });\n }\n\n async setItem(key: string, value: string): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.storage.setItem, { key, value });\n }\n\n async removeItem(key: string): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.storage.removeItem, { key });\n }\n\n async clear(): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.storage.clear);\n }\n\n async keys(): Promise<string[]> {\n return this.client.request<string[]>(HAEXTENSION_METHODS.storage.keys);\n }\n}\n","import type { HaexVaultSdk } from \"../client\";\nimport type { DatabaseQueryResult, MigrationResult, Migration } from \"../types\";\nimport { HAEXTENSION_METHODS } from \"../methods\";\n\nexport class DatabaseAPI {\n constructor(private client: HaexVaultSdk) {}\n\n async query<T>(query: string, params?: unknown[]): Promise<T[]> {\n const result = await this.client.request<DatabaseQueryResult>(\n HAEXTENSION_METHODS.database.query,\n {\n query,\n params: params || [],\n }\n );\n\n return result.rows as T[];\n }\n\n async queryOne<T = unknown>(\n query: string,\n params?: unknown[]\n ): Promise<T | null> {\n const rows = await this.query<T>(query, params);\n return rows.length > 0 ? rows[0] ?? null : null;\n }\n\n async execute(\n query: string,\n params?: unknown[]\n ): Promise<DatabaseQueryResult> {\n return this.client.request<DatabaseQueryResult>(HAEXTENSION_METHODS.database.execute, {\n query,\n params: params || [],\n });\n }\n\n async transaction(statements: string[]): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.database.transaction, {\n statements,\n });\n }\n\n async createTable(tableName: string, columns: string): Promise<void> {\n const query = `CREATE TABLE IF NOT EXISTS ${tableName} (${columns})`;\n await this.execute(query);\n }\n\n async dropTable(tableName: string): Promise<void> {\n const query = `DROP TABLE IF EXISTS ${tableName}`;\n await this.execute(query);\n }\n\n /**\n * Registers and applies extension migrations with HaexVault\n *\n * HaexVault will:\n * 1. Validate all SQL statements (ensure only extension's own tables are accessed)\n * 2. Store migrations with applied_at = NULL\n * 3. Query pending migrations sorted by name\n * 4. Apply pending migrations and set up CRDT triggers\n * 5. Mark successful migrations with applied_at timestamp\n *\n * @param extensionVersion - The version of the extension\n * @param migrations - Array of migration objects with name and SQL content\n * @returns Promise with migration result (applied count, already applied count, applied migration names)\n */\n async registerMigrationsAsync(\n extensionVersion: string,\n migrations: Migration[]\n ): Promise<MigrationResult> {\n return this.client.request<MigrationResult>(\n HAEXTENSION_METHODS.database.registerMigrations,\n {\n extensionVersion,\n migrations,\n }\n );\n }\n\n async insert(\n tableName: string,\n data: Record<string, unknown>\n ): Promise<number> {\n const keys = Object.keys(data);\n const values = Object.values(data);\n const placeholders = keys.map(() => \"?\").join(\", \");\n\n const query = `INSERT INTO ${tableName} (${keys.join(\n \", \"\n )}) VALUES (${placeholders})`;\n const result = await this.execute(query, values);\n\n return result.lastInsertId ?? -1;\n }\n\n async update(\n tableName: string,\n data: Record<string, unknown>,\n where: string,\n whereParams?: unknown[]\n ): Promise<number> {\n const keys = Object.keys(data);\n const values = Object.values(data);\n const setClause = keys.map((key) => `${key} = ?`).join(\", \");\n\n const query = `UPDATE ${tableName} SET ${setClause} WHERE ${where}`;\n const result = await this.execute(query, [\n ...values,\n ...(whereParams || []),\n ]);\n\n return result.rowsAffected;\n }\n\n async delete(\n tableName: string,\n where: string,\n whereParams?: unknown[]\n ): Promise<number> {\n const query = `DELETE FROM ${tableName} WHERE ${where}`;\n const result = await this.execute(query, whereParams);\n return result.rowsAffected;\n }\n\n async count(\n tableName: string,\n where?: string,\n whereParams?: unknown[]\n ): Promise<number> {\n const query = where\n ? `SELECT COUNT(*) as count FROM ${tableName} WHERE ${where}`\n : `SELECT COUNT(*) as count FROM ${tableName}`;\n\n const result = await this.queryOne<{ count: number }>(query, whereParams);\n return result?.count ?? 0;\n }\n\n}\n","import type { HaexVaultSdk } from \"~/client\";\nimport { HAEXTENSION_METHODS } from \"~/methods\";\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** File sync state constants */\nexport const FILE_SYNC_STATE = {\n SYNCED: \"synced\",\n SYNCING: \"syncing\",\n LOCAL_ONLY: \"localOnly\",\n REMOTE_ONLY: \"remoteOnly\",\n CONFLICT: \"conflict\",\n ERROR: \"error\",\n} as const;\n\n/** Sync direction constants */\nexport const SYNC_DIRECTION = {\n UP: \"up\",\n DOWN: \"down\",\n BOTH: \"both\",\n} as const;\n\n/** Storage backend type constants */\nexport const STORAGE_BACKEND_TYPE = {\n S3: \"s3\",\n R2: \"r2\",\n MINIO: \"minio\",\n GDRIVE: \"gdrive\",\n DROPBOX: \"dropbox\",\n} as const;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface FileSpace {\n id: string;\n name: string;\n isPersonal: boolean;\n fileCount: number;\n totalSize: number;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface FileInfo {\n id: string;\n spaceId: string;\n name: string;\n path: string;\n mimeType: string | null;\n size: number;\n contentHash: string;\n isDirectory: boolean;\n syncState: FileSyncState;\n backends: string[];\n createdAt: string;\n updatedAt: string;\n}\n\n/** Local file info (unencrypted, scanned from local filesystem) */\nexport interface LocalFileInfo {\n /** Unique ID (hash of rule_id + relative path) */\n id: string;\n /** File name */\n name: string;\n /** Full local path */\n path: string;\n /** Relative path from sync root */\n relativePath: string;\n /** MIME type (null for directories) */\n mimeType: string | null;\n /** File size in bytes */\n size: number;\n /** Whether this is a directory */\n isDirectory: boolean;\n /** Last modified timestamp (ISO 8601) */\n modifiedAt: string | null;\n}\n\nexport type FileSyncState =\n | \"synced\"\n | \"syncing\"\n | \"localOnly\"\n | \"remoteOnly\"\n | \"conflict\"\n | \"error\";\n\nexport interface StorageBackendInfo {\n id: string;\n type: StorageBackendType;\n name: string;\n enabled: boolean;\n createdAt: string;\n}\n\nexport type StorageBackendType = \"s3\" | \"r2\" | \"minio\" | \"gdrive\" | \"dropbox\";\n\nexport interface S3BackendConfig {\n type: \"s3\" | \"r2\" | \"minio\";\n endpoint?: string;\n region: string;\n bucket: string;\n accessKeyId: string;\n secretAccessKey: string;\n}\n\n/** Backend configuration for S3-compatible storage */\nexport type BackendConfig = S3BackendConfig;\n\nexport interface SyncRule {\n id: string;\n /** Device ID this sync rule belongs to (local paths are device-specific) */\n deviceId: string;\n spaceId: string;\n localPath: string;\n backendIds: string[];\n direction: SyncDirection;\n enabled: boolean;\n /** Gitignore-like patterns for files/folders to exclude from sync */\n ignorePatterns: string[];\n /** Default conflict resolution strategy for this sync rule */\n conflictStrategy: ConflictStrategy;\n createdAt: string;\n updatedAt: string;\n}\n\nexport type SyncDirection = \"up\" | \"down\" | \"both\";\n\n/** Conflict resolution strategy for sync rules */\nexport type ConflictStrategy = \"local\" | \"remote\" | \"newer\" | \"ask\" | \"keepBoth\";\n\n/** Conflict strategy constants */\nexport const CONFLICT_STRATEGY: Record<string, ConflictStrategy> = {\n /** Always prefer local version */\n LOCAL: \"local\",\n /** Always prefer remote version */\n REMOTE: \"remote\",\n /** Prefer newer version (Last-Writer-Wins) */\n NEWER: \"newer\",\n /** Ask user to resolve each conflict manually */\n ASK: \"ask\",\n /** Keep both versions (create conflict copy) */\n KEEP_BOTH: \"keepBoth\",\n};\n\nexport interface SyncStatus {\n isSyncing: boolean;\n pendingUploads: number;\n pendingDownloads: number;\n lastSync: string | null;\n errors: SyncError[];\n}\n\nexport interface SyncError {\n fileId: string;\n fileName: string;\n error: string;\n timestamp: string;\n}\n\nexport interface SyncProgress {\n fileId: string;\n fileName: string;\n bytesTransferred: number;\n totalBytes: number;\n direction: \"upload\" | \"download\";\n}\n\nexport interface CreateSpaceOptions {\n name: string;\n}\n\nexport interface AddBackendOptions {\n name: string;\n config: BackendConfig;\n}\n\nexport interface AddSyncRuleOptions {\n spaceId: string;\n localPath: string;\n backendIds: string[];\n direction?: SyncDirection;\n /** Gitignore-like patterns for files/folders to exclude from sync */\n ignorePatterns?: string[];\n /** Default conflict resolution strategy (defaults to 'ask') */\n conflictStrategy?: ConflictStrategy;\n}\n\nexport interface UpdateSyncRuleOptions {\n ruleId: string;\n backendIds?: string[];\n direction?: SyncDirection;\n enabled?: boolean;\n /** Gitignore-like patterns for files/folders to exclude from sync */\n ignorePatterns?: string[];\n /** Default conflict resolution strategy */\n conflictStrategy?: ConflictStrategy;\n}\n\nexport interface ListFilesOptions {\n spaceId: string;\n path?: string;\n recursive?: boolean;\n}\n\nexport interface ScanLocalOptions {\n /** Sync rule ID to scan */\n ruleId: string;\n /** Optional subpath within the sync root to scan */\n subpath?: string;\n}\n\nexport interface UploadFileOptions {\n spaceId: string;\n localPath: string;\n remotePath?: string;\n backendIds?: string[];\n}\n\nexport interface DownloadFileOptions {\n fileId: string;\n localPath: string;\n}\n\n// ============================================================================\n// FileSyncAPI\n// ============================================================================\n\n/**\n * File Sync API for E2E encrypted file synchronization\n *\n * Access via: client.filesystem.sync.*\n */\nexport class FileSyncAPI {\n constructor(private client: HaexVaultSdk) {}\n\n // --------------------------------------------------------------------------\n // Spaces\n // --------------------------------------------------------------------------\n\n /**\n * List all file spaces\n */\n async listSpacesAsync(): Promise<FileSpace[]> {\n return this.client.request<FileSpace[]>(\n HAEXTENSION_METHODS.filesystem.sync.listSpaces\n );\n }\n\n /**\n * Create a new file space\n */\n async createSpaceAsync(options: CreateSpaceOptions): Promise<FileSpace> {\n return this.client.request<FileSpace, CreateSpaceOptions>(\n HAEXTENSION_METHODS.filesystem.sync.createSpace,\n options\n );\n }\n\n /**\n * Delete a file space\n */\n async deleteSpaceAsync(spaceId: string): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.filesystem.sync.deleteSpace, {\n spaceId,\n });\n }\n\n // --------------------------------------------------------------------------\n // Files\n // --------------------------------------------------------------------------\n\n /**\n * List files in a space\n */\n async listFilesAsync(options: ListFilesOptions): Promise<FileInfo[]> {\n return this.client.request<FileInfo[], ListFilesOptions>(\n HAEXTENSION_METHODS.filesystem.sync.listFiles,\n options\n );\n }\n\n /**\n * Scan local files in a sync rule folder\n * Returns unencrypted local files for display in the UI\n */\n async scanLocalAsync(options: ScanLocalOptions): Promise<LocalFileInfo[]> {\n return this.client.request<LocalFileInfo[], ScanLocalOptions>(\n HAEXTENSION_METHODS.filesystem.sync.scanLocal,\n options\n );\n }\n\n /**\n * Get file info by ID\n */\n async getFileAsync(fileId: string): Promise<FileInfo | null> {\n return this.client.request<FileInfo | null>(\n HAEXTENSION_METHODS.filesystem.sync.getFile,\n { fileId }\n );\n }\n\n /**\n * Upload a file to the sync system\n */\n async uploadFileAsync(options: UploadFileOptions): Promise<FileInfo> {\n return this.client.request<FileInfo, UploadFileOptions>(\n HAEXTENSION_METHODS.filesystem.sync.uploadFile,\n options\n );\n }\n\n /**\n * Download a file to local storage\n */\n async downloadFileAsync(options: DownloadFileOptions): Promise<void> {\n await this.client.request<void, DownloadFileOptions>(\n HAEXTENSION_METHODS.filesystem.sync.downloadFile,\n options\n );\n }\n\n /**\n * Delete a file from the sync system\n */\n async deleteFileAsync(fileId: string): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.filesystem.sync.deleteFile, {\n fileId,\n });\n }\n\n // --------------------------------------------------------------------------\n // Storage Backends\n // --------------------------------------------------------------------------\n\n /**\n * List configured storage backends\n */\n async listBackendsAsync(): Promise<StorageBackendInfo[]> {\n return this.client.request<StorageBackendInfo[]>(\n HAEXTENSION_METHODS.filesystem.sync.listBackends\n );\n }\n\n /**\n * Add a new storage backend\n */\n async addBackendAsync(options: AddBackendOptions): Promise<StorageBackendInfo> {\n return this.client.request<StorageBackendInfo, AddBackendOptions>(\n HAEXTENSION_METHODS.filesystem.sync.addBackend,\n options\n );\n }\n\n /**\n * Remove a storage backend\n */\n async removeBackendAsync(backendId: string): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.filesystem.sync.removeBackend, {\n backendId,\n });\n }\n\n /**\n * Test backend connection\n */\n async testBackendAsync(backendId: string): Promise<boolean> {\n return this.client.request<boolean>(\n HAEXTENSION_METHODS.filesystem.sync.testBackend,\n { backendId }\n );\n }\n\n // --------------------------------------------------------------------------\n // Sync Rules\n // --------------------------------------------------------------------------\n\n /**\n * List sync rules\n */\n async listSyncRulesAsync(): Promise<SyncRule[]> {\n return this.client.request<SyncRule[]>(\n HAEXTENSION_METHODS.filesystem.sync.listSyncRules\n );\n }\n\n /**\n * Add a sync rule\n */\n async addSyncRuleAsync(options: AddSyncRuleOptions): Promise<SyncRule> {\n return this.client.request<SyncRule, AddSyncRuleOptions>(\n HAEXTENSION_METHODS.filesystem.sync.addSyncRule,\n options\n );\n }\n\n /**\n * Update a sync rule\n */\n async updateSyncRuleAsync(options: UpdateSyncRuleOptions): Promise<SyncRule> {\n return this.client.request<SyncRule, UpdateSyncRuleOptions>(\n HAEXTENSION_METHODS.filesystem.sync.updateSyncRule,\n options\n );\n }\n\n /**\n * Remove a sync rule\n */\n async removeSyncRuleAsync(ruleId: string): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.filesystem.sync.removeSyncRule, {\n ruleId,\n });\n }\n\n // --------------------------------------------------------------------------\n // Sync Operations\n // --------------------------------------------------------------------------\n\n /**\n * Get current sync status\n */\n async getSyncStatusAsync(): Promise<SyncStatus> {\n return this.client.request<SyncStatus>(\n HAEXTENSION_METHODS.filesystem.sync.getSyncStatus\n );\n }\n\n /**\n * Trigger a manual sync\n */\n async triggerSyncAsync(): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.filesystem.sync.triggerSync);\n }\n\n /**\n * Pause syncing\n */\n async pauseSyncAsync(): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.filesystem.sync.pauseSync);\n }\n\n /**\n * Resume syncing\n */\n async resumeSyncAsync(): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.filesystem.sync.resumeSync);\n }\n\n // --------------------------------------------------------------------------\n // Conflict Resolution\n // --------------------------------------------------------------------------\n\n /**\n * Resolve a file conflict\n */\n async resolveConflictAsync(\n fileId: string,\n resolution: \"local\" | \"remote\" | \"keepBoth\"\n ): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.filesystem.sync.resolveConflict, {\n fileId,\n resolution,\n });\n }\n\n // --------------------------------------------------------------------------\n // Folder Selection (Native Dialog)\n // --------------------------------------------------------------------------\n\n /**\n * Open a folder selection dialog\n */\n async selectFolderAsync(): Promise<string | null> {\n return this.client.request<string | null>(\n HAEXTENSION_METHODS.filesystem.sync.selectFolder\n );\n }\n}\n","import type { HaexVaultSdk } from \"../client\";\nimport { HAEXTENSION_METHODS } from \"../methods\";\nimport { FileSyncAPI } from \"./filesync\";\n\nexport interface SaveFileOptions {\n /**\n * The default filename to suggest\n */\n defaultPath?: string;\n\n /**\n * The title of the save dialog\n */\n title?: string;\n\n /**\n * File filters for the dialog\n */\n filters?: Array<{\n name: string;\n extensions: string[];\n }>;\n}\n\nexport interface SaveFileResult {\n /**\n * The path where the file was saved\n */\n path: string;\n\n /**\n * Whether the operation was successful\n */\n success: boolean;\n}\n\nexport interface OpenFileOptions {\n /**\n * The filename for the temporary file\n */\n fileName: string;\n\n /**\n * Optional MIME type for the file\n */\n mimeType?: string;\n}\n\nexport interface OpenFileResult {\n /**\n * Whether the operation was successful\n */\n success: boolean;\n}\n\nexport interface ShowImageOptions {\n /**\n * The data URL of the image (base64 encoded)\n */\n dataUrl: string;\n}\n\nexport interface ShowImageResult {\n /**\n * Whether the operation was successful\n */\n success: boolean;\n}\n\nexport class FilesystemAPI {\n public readonly sync: FileSyncAPI;\n\n constructor(private client: HaexVaultSdk) {\n this.sync = new FileSyncAPI(client);\n }\n\n /**\n * Opens a save file dialog and saves the provided data to the selected location\n * @param data The file data as Uint8Array\n * @param options Options for the save dialog\n * @returns The path where the file was saved, or null if cancelled\n */\n async saveFileAsync(\n data: Uint8Array,\n options: SaveFileOptions = {}\n ): Promise<SaveFileResult | null> {\n const result = await this.client.request<SaveFileResult | null>(\n HAEXTENSION_METHODS.filesystem.saveFile,\n {\n data: Array.from(data), // Convert Uint8Array to regular array for postMessage\n defaultPath: options.defaultPath,\n title: options.title,\n filters: options.filters,\n }\n );\n\n return result;\n }\n\n /**\n * Opens a file with the system's default viewer\n * @param data The file data as Uint8Array\n * @param options Options for opening the file\n * @returns The result of the operation\n */\n async openFileAsync(\n data: Uint8Array,\n options: OpenFileOptions\n ): Promise<OpenFileResult> {\n const result = await this.client.request<OpenFileResult>(\n HAEXTENSION_METHODS.filesystem.openFile,\n {\n data: Array.from(data), // Convert Uint8Array to regular array for postMessage\n fileName: options.fileName,\n mimeType: options.mimeType,\n }\n );\n\n return result;\n }\n\n /**\n * Shows an image using a data URL (safe, read-only viewing)\n * This is safe to use without special permissions as it only displays images\n * and doesn't execute any code or open files with external applications\n * @param options Options containing the data URL\n * @returns The result of the operation\n */\n async showImageAsync(\n options: ShowImageOptions\n ): Promise<ShowImageResult> {\n const result = await this.client.request<ShowImageResult>(\n HAEXTENSION_METHODS.filesystem.showImage,\n {\n dataUrl: options.dataUrl,\n }\n );\n\n return result;\n }\n}\n","import type { HaexVaultSdk } from \"../client\";\nimport type { WebRequestOptions, WebResponse } from \"../types\";\nimport { HAEXTENSION_METHODS } from \"../methods\";\n\nexport class WebAPI {\n constructor(private client: HaexVaultSdk) {}\n\n /**\n * Performs a web request through the HaexHub host application\n * @param url The URL to fetch\n * @param options Request options (method, headers, body, timeout)\n * @returns Promise resolving to the web response\n */\n async fetchAsync(url: string, options: WebRequestOptions = {}): Promise<WebResponse> {\n // Convert body to base64 if it's an ArrayBuffer or Blob\n let bodyParam: string | undefined;\n\n if (options.body) {\n if (options.body instanceof ArrayBuffer) {\n bodyParam = this.arrayBufferToBase64(options.body);\n } else if (options.body instanceof Blob) {\n bodyParam = await this.blobToBase64(options.body);\n } else {\n bodyParam = options.body;\n }\n }\n\n const response = await this.client.request<{\n status: number;\n statusText: string;\n headers: Record<string, string>;\n body: string; // Base64 encoded\n url: string;\n }>(HAEXTENSION_METHODS.web.fetch, {\n url,\n method: options.method || \"GET\",\n headers: options.headers,\n body: bodyParam,\n timeout: options.timeout,\n });\n\n // Convert base64 body back to ArrayBuffer\n const bodyBuffer = this.base64ToArrayBuffer(response.body);\n\n return {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n body: bodyBuffer,\n url: response.url,\n };\n }\n\n /**\n * Convenience method for JSON requests\n */\n async fetchJsonAsync<T = unknown>(\n url: string,\n options: WebRequestOptions = {}\n ): Promise<T> {\n const response = await this.fetchAsync(url, options);\n const text = new TextDecoder().decode(response.body);\n return JSON.parse(text) as T;\n }\n\n /**\n * Convenience method for text requests\n */\n async fetchTextAsync(url: string, options: WebRequestOptions = {}): Promise<string> {\n const response = await this.fetchAsync(url, options);\n return new TextDecoder().decode(response.body);\n }\n\n /**\n * Convenience method for blob requests\n */\n async fetchBlobAsync(url: string, options: WebRequestOptions = {}): Promise<Blob> {\n const response = await this.fetchAsync(url, options);\n return new Blob([response.body]);\n }\n\n /**\n * Opens a URL in the user's default browser\n * @param url The URL to open\n */\n async openAsync(url: string): Promise<void> {\n await this.client.request<void>(HAEXTENSION_METHODS.application.open, {\n application: \"browser\",\n url,\n });\n }\n\n private arrayBufferToBase64(buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer);\n let binary = '';\n for (let i = 0; i < bytes.byteLength; i++) {\n const byte = bytes[i];\n if (byte === undefined) {\n throw new Error('Invalid byte at index ' + i);\n }\n binary += String.fromCharCode(byte);\n }\n return btoa(binary);\n }\n\n private async blobToBase64(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => {\n const result = reader.result;\n if (typeof result !== 'string') {\n reject(new Error('Failed to read blob as data URL'));\n return;\n }\n const parts = result.split(',');\n const base64 = parts[1];\n if (!base64) {\n reject(new Error('Failed to extract base64 from data URL'));\n return;\n }\n resolve(base64);\n };\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n });\n }\n\n private base64ToArrayBuffer(base64: string): ArrayBuffer {\n const binaryString = atob(base64);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes.buffer;\n }\n}\n","import type { HaexVaultSdk } from \"../client\";\nimport type { PermissionResponse } from \"../types\";\n\nexport class PermissionsAPI {\n constructor(private client: HaexVaultSdk) {}\n\n /**\n * Checks if the extension has permission for a database operation\n * @param resource The database resource (table name or \"*\" for all tables)\n * @param operation The operation type (\"read\" or \"write\")\n * @returns Promise<boolean> indicating if permission is granted\n */\n async checkDatabaseAsync(\n resource: string,\n operation: \"read\" | \"write\"\n ): Promise<boolean> {\n const response = await this.client.request<PermissionResponse>(\n \"permissions.database.check\",\n {\n resource,\n operation,\n }\n );\n return response.status === \"granted\";\n }\n\n /**\n * Checks if the extension has permission for a web request\n * @param url The URL to check (e.g., \"https://example.com/path\")\n * @returns Promise<boolean> indicating if permission is granted\n * @note Method/operation is not checked - permissions apply to all HTTP methods\n */\n async checkWebAsync(url: string): Promise<boolean> {\n const response = await this.client.request<PermissionResponse>(\n \"permissions.web.check\",\n {\n url,\n }\n );\n return response.status === \"granted\";\n }\n\n /**\n * Checks if the extension has permission for a filesystem operation\n * @param path The file or directory path\n * @param operation The operation type (\"read\" or \"write\")\n * @returns Promise<boolean> indicating if permission is granted\n */\n async checkFilesystemAsync(\n path: string,\n operation: \"read\" | \"write\"\n ): Promise<boolean> {\n const response = await this.client.request<PermissionResponse>(\n \"permissions.filesystem.check\",\n {\n path,\n operation,\n }\n );\n return response.status === \"granted\";\n }\n}\n","/**\n * Table Name Utilities\n *\n * Functions for creating, parsing, and validating table names.\n * Table names follow the format: publicKey__extensionName__tableName\n */\n\nimport {\n ErrorCode,\n TABLE_SEPARATOR,\n HaexVaultSdkError,\n getTableName as buildTableName,\n} from \"../types\";\nimport type { ExtensionInfo } from \"../types\";\n\n/**\n * Table name parse result\n */\nexport interface ParsedTableName {\n publicKey: string;\n extensionName: string;\n tableName: string;\n}\n\n/**\n * Validate a public key\n */\nexport function validatePublicKey(publicKey: string): void {\n if (\n !publicKey ||\n typeof publicKey !== \"string\" ||\n publicKey.trim() === \"\"\n ) {\n throw new HaexVaultSdkError(\n ErrorCode.INVALID_PUBLIC_KEY,\n \"errors.invalid_public_key\",\n { publicKey }\n );\n }\n}\n\n/**\n * Validate an extension name\n */\nexport function validateExtensionName(extensionName: string): void {\n if (!extensionName || !/^[a-z][a-z0-9-]*$/i.test(extensionName)) {\n throw new HaexVaultSdkError(\n ErrorCode.INVALID_EXTENSION_NAME,\n \"errors.invalid_extension_name\",\n { extensionName }\n );\n }\n\n if (extensionName.includes(TABLE_SEPARATOR)) {\n throw new HaexVaultSdkError(\n ErrorCode.INVALID_EXTENSION_NAME,\n \"errors.extension_name_contains_separator\",\n { extensionName, separator: TABLE_SEPARATOR }\n );\n }\n}\n\n/**\n * Validate a table name\n */\nexport function validateTableName(tableName: string): void {\n if (!tableName || typeof tableName !== \"string\") {\n throw new HaexVaultSdkError(\n ErrorCode.INVALID_TABLE_NAME,\n \"errors.table_name_empty\"\n );\n }\n\n if (tableName.includes(TABLE_SEPARATOR)) {\n throw new HaexVaultSdkError(\n ErrorCode.INVALID_TABLE_NAME,\n \"errors.table_name_contains_separator\",\n { tableName, separator: TABLE_SEPARATOR }\n );\n }\n\n if (!/^[a-z][a-z0-9-_]*$/i.test(tableName)) {\n throw new HaexVaultSdkError(\n ErrorCode.INVALID_TABLE_NAME,\n \"errors.table_name_format\",\n { tableName }\n );\n }\n}\n\n/**\n * Get a prefixed table name for the current extension\n * @param extensionInfo The current extension info\n * @param tableName The base table name\n * @returns The fully qualified table name wrapped in quotes\n */\nexport function getExtensionTableName(\n extensionInfo: ExtensionInfo | null,\n tableName: string\n): string {\n if (!extensionInfo) {\n throw new HaexVaultSdkError(\n ErrorCode.EXTENSION_INFO_UNAVAILABLE,\n \"errors.extension_info_unavailable\"\n );\n }\n\n validateTableName(tableName);\n\n const { publicKey, name } = extensionInfo;\n\n // Return table name wrapped in double quotes to handle special characters\n return `\"${buildTableName(publicKey, name, tableName)}\"`;\n}\n\n/**\n * Get a prefixed table name for a dependency extension\n * @param publicKey The dependency's public key\n * @param extensionName The dependency's extension name\n * @param tableName The base table name\n * @returns The fully qualified table name wrapped in quotes\n */\nexport function getDependencyTableName(\n publicKey: string,\n extensionName: string,\n tableName: string\n): string {\n validatePublicKey(publicKey);\n validateExtensionName(extensionName);\n validateTableName(tableName);\n\n // Return table name wrapped in double quotes to handle special characters\n return `\"${buildTableName(publicKey, extensionName, tableName)}\"`;\n}\n\n/**\n * Parse a full table name into its components\n * @param fullTableName The fully qualified table name (optionally quoted)\n * @returns The parsed components or null if invalid\n */\nexport function parseTableName(fullTableName: string): ParsedTableName | null {\n // Remove surrounding quotes if present\n let cleanTableName = fullTableName;\n if (cleanTableName.startsWith('\"') && cleanTableName.endsWith('\"')) {\n cleanTableName = cleanTableName.slice(1, -1);\n }\n\n const parts = cleanTableName.split(TABLE_SEPARATOR);\n\n if (parts.length !== 3) {\n return null;\n }\n\n const [publicKey, extensionName, tableName] = parts;\n\n if (!publicKey || !extensionName || !tableName) {\n return null;\n }\n\n return {\n publicKey,\n extensionName,\n tableName,\n };\n}\n","/**\n * Client Initialization\n *\n * Functions for initializing the client in different modes:\n * - Native WebView mode (Tauri)\n * - IFrame mode (mobile/web)\n */\n\nimport { HAEXTENSION_EVENTS, EXTERNAL_EVENTS } from \"../events\";\nimport { HAEXTENSION_METHODS } from \"../methods\";\nimport { HAEXSPACE_MESSAGE_TYPES } from \"../messages\";\nimport { ErrorCode, HaexVaultSdkError } from \"../types\";\nimport type { ExtensionInfo, ApplicationContext, HaexHubEvent } from \"../types\";\nimport type { ClientContext, ClientConfig, LogFn } from \"./context\";\n\n/**\n * Tauri API types\n */\ninterface TauriInvoke {\n invoke: <T>(cmd: string, args?: Record<string, unknown>) => Promise<T>;\n}\n\ninterface TauriEvent {\n listen: (event: string, handler: (event: { payload: unknown }) => void) => Promise<() => void>;\n}\n\n/**\n * Check if we're running in an iframe\n */\nexport function isInIframe(): boolean {\n return window.self !== window.top;\n}\n\n/**\n * Check if Tauri is available\n */\nexport function hasTauri(): boolean {\n return typeof (window as unknown as { __TAURI__?: unknown }).__TAURI__ !== \"undefined\";\n}\n\n/**\n * Get Tauri core API\n */\nexport function getTauriCore(): TauriInvoke {\n return (window as unknown as { __TAURI__: { core: TauriInvoke } }).__TAURI__.core;\n}\n\n/**\n * Get Tauri event API\n */\nexport function getTauriEvent(): TauriEvent {\n return (window as unknown as { __TAURI__: { event: TauriEvent } }).__TAURI__.event;\n}\n\n/**\n * Initialize in native WebView mode (Tauri)\n */\nexport async function initNativeMode(\n ctx: ClientContext,\n log: LogFn,\n onEvent: (event: HaexHubEvent) => void,\n onContextChange: (context: ApplicationContext) => void\n): Promise<{ extensionInfo: ExtensionInfo; context: ApplicationContext }> {\n const { invoke } = getTauriCore();\n\n // Get extension info from Tauri backend\n const extensionInfo = await invoke<ExtensionInfo>(\"webview_extension_get_info\");\n const context = await invoke<ApplicationContext>(\"webview_extension_context_get\");\n\n ctx.state.isNativeWindow = true;\n ctx.state.initialized = true;\n ctx.state.extensionInfo = extensionInfo;\n ctx.state.context = context;\n\n log(\"HaexVault SDK initialized in native WebViewWindow mode\");\n log(\"Extension info:\", extensionInfo);\n log(\"Application context:\", context);\n\n // Setup Tauri event listeners\n await setupTauriEventListeners(ctx, log, onEvent, onContextChange);\n\n return { extensionInfo, context };\n}\n\n/**\n * Setup Tauri event listeners for context changes and external requests\n */\nasync function setupTauriEventListeners(\n ctx: ClientContext,\n log: LogFn,\n onEvent: (event: HaexHubEvent) => void,\n onContextChange: (context: ApplicationContext) => void\n): Promise<void> {\n const { listen } = getTauriEvent();\n\n console.log(\"[HaexVault SDK] Setting up Tauri event listener for:\", HAEXTENSION_EVENTS.CONTEXT_CHANGED);\n\n // Listen for context changes\n try {\n await listen(HAEXTENSION_EVENTS.CONTEXT_CHANGED, (event) => {\n console.log(\"[HaexVault SDK] Received Tauri event:\", HAEXTENSION_EVENTS.CONTEXT_CHANGED, event);\n log(\"Received context change event:\", event);\n\n const payload = event.payload as { context?: ApplicationContext };\n if (payload?.context) {\n ctx.state.context = payload.context;\n console.log(\"[HaexVault SDK] Updated context to:\", ctx.state.context);\n onContextChange(payload.context);\n onEvent({\n type: HAEXTENSION_EVENTS.CONTEXT_CHANGED,\n data: { context: ctx.state.context },\n timestamp: Date.now(),\n });\n } else {\n console.warn(\"[HaexVault SDK] Event received but no context in payload:\", event);\n }\n });\n console.log(\"[HaexVault SDK] Context change listener registered successfully\");\n } catch (error) {\n console.error(\"[HaexVault SDK] Failed to setup context change listener:\", error);\n log(\"Failed to setup context change listener:\", error);\n }\n\n // Listen for external requests\n try {\n await listen(EXTERNAL_EVENTS.REQUEST, (event) => {\n console.log(\"[HaexVault SDK] ====== EXTERNAL REQUEST RECEIVED ======\");\n console.log(\"[HaexVault SDK] Event payload:\", JSON.stringify(event.payload, null, 2));\n log(\"Received external request event:\", event);\n if (event.payload) {\n onEvent({\n type: EXTERNAL_EVENTS.REQUEST,\n data: event.payload,\n timestamp: Date.now(),\n });\n } else {\n console.warn(\"[HaexVault SDK] External request event has no payload!\");\n }\n });\n console.log(\"[HaexVault SDK] External request listener registered successfully\");\n } catch (error) {\n console.error(\"[HaexVault SDK] Failed to setup external request listener:\", error);\n log(\"Failed to setup external request listener:\", error);\n }\n}\n\n/**\n * Initialize in iframe mode\n */\nexport async function initIframeMode(\n ctx: ClientContext,\n log: LogFn,\n messageHandler: (event: MessageEvent) => void,\n request: <T>(method: string, params?: Record<string, unknown>) => Promise<T>\n): Promise<{ context: ApplicationContext }> {\n // Verify we're in an iframe\n if (!isInIframe()) {\n throw new HaexVaultSdkError(ErrorCode.NOT_IN_IFRAME, \"errors.not_in_iframe\");\n }\n\n // Setup message listener\n ctx.handlers.messageHandler = messageHandler;\n window.addEventListener(\"message\", messageHandler);\n\n ctx.state.isNativeWindow = false;\n ctx.state.initialized = true;\n log(\"HaexVault SDK initialized in iframe mode\");\n\n // Load extension info from manifest if provided\n if (ctx.config.manifest) {\n ctx.state.extensionInfo = {\n publicKey: ctx.config.manifest.publicKey,\n name: ctx.config.manifest.name,\n version: ctx.config.manifest.version,\n displayName: ctx.config.manifest.name,\n };\n log(\"Extension info loaded from manifest:\", ctx.state.extensionInfo);\n }\n\n // Send debug info in debug mode\n sendDebugInfo(ctx.config);\n\n // Request context - this also acts as a handshake\n const context = await request<ApplicationContext>(HAEXTENSION_METHODS.context.get);\n ctx.state.context = context;\n log(\"Application context received:\", context);\n\n return { context };\n}\n\n/**\n * Send debug info to parent window (development only)\n */\nfunction sendDebugInfo(config: ClientConfig): void {\n if (!config.debug) return;\n if (typeof window === \"undefined\" || !window.parent) return;\n\n const debugInfo = `SDK Debug:\\nwindow.parent exists: ${!!window.parent}\\nwindow.parent === window: ${window.parent === window}\\nwindow.self === window.top: ${window.self === window.top}`;\n\n try {\n window.parent.postMessage({\n type: HAEXSPACE_MESSAGE_TYPES.DEBUG,\n data: debugInfo,\n }, \"*\");\n } catch (e) {\n // Fallback to alert only in debug mode\n alert(debugInfo + `\\npostMessage error: ${e}`);\n }\n}\n","/**\n * Tauri Command Names\n *\n * Central definition of all Tauri invoke command names.\n * These must match the #[tauri::command] function names in Rust.\n */\n\nexport const TAURI_COMMANDS = {\n database: {\n query: \"webview_extension_db_query\",\n execute: \"webview_extension_db_execute\",\n registerMigrations: \"webview_extension_db_register_migrations\",\n },\n\n permissions: {\n checkWeb: \"webview_extension_check_web_permission\",\n checkDatabase: \"webview_extension_check_database_permission\",\n checkFilesystem: \"webview_extension_check_filesystem_permission\",\n },\n\n web: {\n open: \"webview_extension_web_open\",\n fetch: \"webview_extension_web_request\",\n },\n\n filesystem: {\n saveFile: \"webview_extension_fs_save_file\",\n openFile: \"webview_extension_fs_open_file\",\n showImage: \"webview_extension_fs_show_image\",\n },\n\n external: {\n // Response handling (called by extensions running in WebView)\n respond: \"webview_extension_external_respond\",\n\n // Bridge server management\n bridgeStart: \"external_bridge_start\",\n bridgeStop: \"external_bridge_stop\",\n bridgeGetStatus: \"external_bridge_get_status\",\n\n // Client authorization (unified API with remember flag)\n clientAllow: \"external_client_allow\",\n clientBlock: \"external_client_block\",\n\n // Authorized clients management (permanent - stored in database)\n getAuthorizedClients: \"external_get_authorized_clients\",\n revokeClient: \"external_revoke_client\",\n\n // Session-based authorizations (temporary - cleared when haex-vault restarts)\n getSessionAuthorizations: \"external_get_session_authorizations\",\n revokeSessionAuthorization: \"external_revoke_session_authorization\",\n\n // Blocked clients management\n getBlockedClients: \"external_get_blocked_clients\",\n unblockClient: \"external_unblock_client\",\n isClientBlocked: \"external_is_client_blocked\",\n\n // Pending authorizations\n getPendingAuthorizations: \"external_get_pending_authorizations\",\n },\n\n extension: {\n getInfo: \"webview_extension_get_info\",\n getContext: \"webview_extension_context_get\",\n },\n\n filesync: {\n // Spaces (webview_* commands extract extension info from WebviewWindow)\n listSpaces: \"webview_filesync_list_spaces\",\n createSpace: \"webview_filesync_create_space\",\n deleteSpace: \"webview_filesync_delete_space\",\n\n // Files\n listFiles: \"webview_filesync_list_files\",\n getFile: \"webview_filesync_get_file\",\n uploadFile: \"webview_filesync_upload_file\",\n downloadFile: \"webview_filesync_download_file\",\n deleteFile: \"webview_filesync_delete_file\",\n\n // Backends\n listBackends: \"webview_filesync_list_backends\",\n addBackend: \"webview_filesync_add_backend\",\n removeBackend: \"webview_filesync_remove_backend\",\n testBackend: \"webview_filesync_test_backend\",\n\n // Sync Rules\n listSyncRules: \"webview_filesync_list_sync_rules\",\n addSyncRule: \"webview_filesync_add_sync_rule\",\n updateSyncRule: \"webview_filesync_update_sync_rule\",\n removeSyncRule: \"webview_filesync_remove_sync_rule\",\n\n // Sync Operations\n getSyncStatus: \"webview_filesync_get_sync_status\",\n triggerSync: \"webview_filesync_trigger_sync\",\n pauseSync: \"webview_filesync_pause_sync\",\n resumeSync: \"webview_filesync_resume_sync\",\n\n // Conflict Resolution\n resolveConflict: \"webview_filesync_resolve_conflict\",\n\n // UI Helpers (selectFolder doesn't need extension info)\n selectFolder: \"filesync_select_folder\",\n scanLocal: \"webview_filesync_scan_local\",\n },\n\n} as const;\n\n// Type helper to extract command string literals\nexport type TauriCommand =\n | (typeof TAURI_COMMANDS.database)[keyof typeof TAURI_COMMANDS.database]\n | (typeof TAURI_COMMANDS.permissions)[keyof typeof TAURI_COMMANDS.permissions]\n | (typeof TAURI_COMMANDS.web)[keyof typeof TAURI_COMMANDS.web]\n | (typeof TAURI_COMMANDS.filesystem)[keyof typeof TAURI_COMMANDS.filesystem]\n | (typeof TAURI_COMMANDS.external)[keyof typeof TAURI_COMMANDS.external]\n | (typeof TAURI_COMMANDS.extension)[keyof typeof TAURI_COMMANDS.extension]\n | (typeof TAURI_COMMANDS.filesync)[keyof typeof TAURI_COMMANDS.filesync];\n","/**\n * Database Handler\n *\n * Maps database SDK methods to Tauri invoke commands\n */\n\nimport { HAEXTENSION_METHODS } from \"../../methods\";\nimport { TAURI_COMMANDS } from \"../../commands\";\nimport type {\n InvokeHandlerMap,\n InvokeMapping,\n DatabaseQueryParams,\n DatabaseMigrationsParams,\n} from \"./types\";\n\nexport const databaseHandlers: InvokeHandlerMap = {\n [HAEXTENSION_METHODS.database.query]: {\n command: TAURI_COMMANDS.database.query,\n args: (p: DatabaseQueryParams) => ({\n query: p.query,\n params: p.params || [],\n }),\n } satisfies InvokeMapping<DatabaseQueryParams>,\n\n [HAEXTENSION_METHODS.database.execute]: {\n command: TAURI_COMMANDS.database.execute,\n args: (p: DatabaseQueryParams) => ({\n query: p.query,\n params: p.params || [],\n }),\n } satisfies InvokeMapping<DatabaseQueryParams>,\n\n [HAEXTENSION_METHODS.database.registerMigrations]: {\n command: TAURI_COMMANDS.database.registerMigrations,\n args: (p: DatabaseMigrationsParams) => ({\n extensionVersion: p.extensionVersion,\n migrations: p.migrations,\n }),\n } satisfies InvokeMapping<DatabaseMigrationsParams>,\n};\n","/**\n * Permissions Handler\n *\n * Maps permission SDK methods to Tauri invoke commands\n */\n\nimport { TAURI_COMMANDS } from \"../../commands\";\nimport type { InvokeHandlerMap, PermissionCheckParams } from \"./types\";\n\nexport const permissionsHandlers: InvokeHandlerMap = {\n \"permissions.web.check\": {\n command: TAURI_COMMANDS.permissions.checkWeb,\n args: (p: PermissionCheckParams) => ({\n url: p.url,\n }),\n },\n\n \"permissions.database.check\": {\n command: TAURI_COMMANDS.permissions.checkDatabase,\n args: (p: PermissionCheckParams) => ({\n resource: p.resource,\n operation: p.operation,\n }),\n },\n\n \"permissions.filesystem.check\": {\n command: TAURI_COMMANDS.permissions.checkFilesystem,\n args: (p: PermissionCheckParams) => ({\n path: p.path,\n actionStr: p.action,\n }),\n },\n};\n","/**\n * Web Handler\n *\n * Maps web/application SDK methods to Tauri invoke commands\n */\n\nimport { HAEXTENSION_METHODS } from \"../../methods\";\nimport { TAURI_COMMANDS } from \"../../commands\";\nimport type { InvokeHandlerMap, WebFetchParams } from \"./types\";\n\ninterface ApplicationOpenParams {\n url: string;\n}\n\nexport const webHandlers: InvokeHandlerMap = {\n [HAEXTENSION_METHODS.application.open]: {\n command: TAURI_COMMANDS.web.open,\n args: (p: ApplicationOpenParams) => ({\n url: p.url,\n }),\n },\n\n [HAEXTENSION_METHODS.web.fetch]: {\n command: TAURI_COMMANDS.web.fetch,\n args: (p: WebFetchParams) => ({\n url: p.url,\n method: p.method,\n headers: p.headers,\n body: p.body,\n }),\n },\n};\n","/**\n * Filesystem Handler\n *\n * Maps filesystem SDK methods to Tauri invoke commands\n */\n\nimport { HAEXTENSION_METHODS } from \"../../methods\";\nimport { TAURI_COMMANDS } from \"../../commands\";\nimport type { InvokeHandlerMap, FilesystemSaveParams, FilesystemOpenParams } from \"./types\";\n\ninterface FilesystemShowImageParams {\n dataUrl: string;\n}\n\nexport const filesystemHandlers: InvokeHandlerMap = {\n [HAEXTENSION_METHODS.filesystem.saveFile]: {\n command: TAURI_COMMANDS.filesystem.saveFile,\n args: (p: FilesystemSaveParams) => ({\n data: p.data,\n defaultPath: p.defaultPath,\n title: p.title,\n filters: p.filters,\n }),\n },\n\n [HAEXTENSION_METHODS.filesystem.openFile]: {\n command: TAURI_COMMANDS.filesystem.openFile,\n args: (p: FilesystemOpenParams) => ({\n data: p.data,\n fileName: p.fileName,\n }),\n },\n\n [HAEXTENSION_METHODS.filesystem.showImage]: {\n command: TAURI_COMMANDS.filesystem.showImage,\n args: (p: FilesystemShowImageParams) => ({\n dataUrl: p.dataUrl,\n }),\n },\n};\n","/**\n * External Handler\n *\n * Maps external request SDK methods to Tauri invoke commands\n */\n\nimport { TAURI_COMMANDS } from \"../../commands\";\nimport type { InvokeHandlerMap, ExternalRespondParams } from \"./types\";\n\nexport const externalHandlers: InvokeHandlerMap = {\n \"external.respond\": {\n command: TAURI_COMMANDS.external.respond,\n args: (p: ExternalRespondParams) => ({\n requestId: p.requestId,\n success: p.success,\n data: p.data,\n error: p.error,\n }),\n },\n};\n","/**\n * FileSync Handler\n *\n * Maps filesync SDK methods to Tauri invoke commands\n */\n\nimport { HAEXTENSION_METHODS } from \"../../methods\";\nimport { TAURI_COMMANDS } from \"../../commands\";\nimport type {\n InvokeHandlerMap,\n FileSyncSpaceParams,\n FileSyncFileParams,\n FileSyncBackendParams,\n FileSyncRuleParams,\n FileSyncConflictParams,\n FileSyncScanLocalParams,\n} from \"./types\";\n\nexport const filesyncHandlers: InvokeHandlerMap = {\n // ==========================================================================\n // Spaces\n // ==========================================================================\n [HAEXTENSION_METHODS.filesystem.sync.listSpaces]: {\n command: TAURI_COMMANDS.filesync.listSpaces,\n args: () => ({}),\n },\n\n [HAEXTENSION_METHODS.filesystem.sync.createSpace]: {\n command: TAURI_COMMANDS.filesync.createSpace,\n args: (p: FileSyncSpaceParams) => ({ request: p }),\n },\n\n [HAEXTENSION_METHODS.filesystem.sync.deleteSpace]: {\n command: TAURI_COMMANDS.filesync.deleteSpace,\n args: (p: FileSyncSpaceParams) => ({ spaceId: p.spaceId }),\n },\n\n // ==========================================================================\n // Files\n // ==========================================================================\n [HAEXTENSION_METHODS.filesystem.sync.listFiles]: {\n command: TAURI_COMMANDS.filesync.listFiles,\n args: (p: FileSyncFileParams) => ({ request: p }),\n },\n\n [HAEXTENSION_METHODS.filesystem.sync.getFile]: {\n command: TAURI_COMMANDS.filesync.getFile,\n args: (p: FileSyncFileParams) => ({ fileId: p.fileId }),\n },\n\n [HAEXTENSION_METHODS.filesystem.sync.uploadFile]: {\n command: TAURI_COMMANDS.filesync.uploadFile,\n args: (p: FileSyncFileParams) => ({ request: p }),\n },\n\n [HAEXTENSION_METHODS.filesystem.sync.downloadFile]: {\n command: TAURI_COMMANDS.filesync.downloadFile,\n args: (p: FileSyncFileParams) => ({ request: p }),\n },\n\n [HAEXTENSION_METHODS.filesystem.sync.deleteFile]: {\n command: TAURI_COMMANDS.filesync.deleteFile,\n args: (p: FileSyncFileParams) => ({ fileId: p.fileId }),\n },\n\n // ==========================================================================\n // Backends\n // ==========================================================================\n [HAEXTENSION_METHODS.filesystem.sync.listBackends]: {\n command: TAURI_COMMANDS.filesync.listBackends,\n args: () => ({}),\n },\n\n [HAEXTENSION_METHODS.filesystem.sync.addBackend]: {\n command: TAURI_COMMANDS.filesync.addBackend,\n args: (p: FileSyncBackendParams) => ({ request: p }),\n },\n\n [HAEXTENSION_METHODS.filesystem.sync.removeBackend]: {\n command: TAURI_COMMANDS.filesync.removeBackend,\n args: (p: FileSyncBackendParams) => ({ backendId: p.backendId }),\n },\n\n [HAEXTENSION_METHODS.filesystem.sync.testBackend]: {\n command: TAURI_COMMANDS.filesync.testBackend,\n args: (p: FileSyncBackendParams) => ({ backendId: p.backendId }),\n },\n\n // ==========================================================================\n // Sync Rules\n // ==========================================================================\n [HAEXTENSION_METHODS.filesystem.sync.listSyncRules]: {\n command: TAURI_COMMANDS.filesync.listSyncRules,\n args: () => ({}),\n },\n\n [HAEXTENSION_METHODS.filesystem.sync.addSyncRule]: {\n command: TAURI_COMMANDS.filesync.addSyncRule,\n args: (p: FileSyncRuleParams) => ({ request: p }),\n },\n\n [HAEXTENSION_METHODS.filesystem.sync.updateSyncRule]: {\n command: TAURI_COMMANDS.filesync.updateSyncRule,\n args: (p: FileSyncRuleParams) => ({ request: p }),\n },\n\n [HAEXTENSION_METHODS.filesystem.sync.removeSyncRule]: {\n command: TAURI_COMMANDS.filesync.removeSyncRule,\n args: (p: FileSyncRuleParams) => ({ ruleId: p.ruleId }),\n },\n\n // ==========================================================================\n // Sync Operations\n // ==========================================================================\n [HAEXTENSION_METHODS.filesystem.sync.getSyncStatus]: {\n command: TAURI_COMMANDS.filesync.getSyncStatus,\n args: () => ({}),\n },\n\n [HAEXTENSION_METHODS.filesystem.sync.triggerSync]: {\n command: TAURI_COMMANDS.filesync.triggerSync,\n args: () => ({}),\n },\n\n [HAEXTENSION_METHODS.filesystem.sync.pauseSync]: {\n command: TAURI_COMMANDS.filesync.pauseSync,\n args: () => ({}),\n },\n\n [HAEXTENSION_METHODS.filesystem.sync.resumeSync]: {\n command: TAURI_COMMANDS.filesync.resumeSync,\n args: () => ({}),\n },\n\n // ==========================================================================\n // Conflict Resolution\n // ==========================================================================\n [HAEXTENSION_METHODS.filesystem.sync.resolveConflict]: {\n command: TAURI_COMMANDS.filesync.resolveConflict,\n args: (p: FileSyncConflictParams) => ({ request: p }),\n },\n\n // ==========================================================================\n // UI Helpers\n // ==========================================================================\n [HAEXTENSION_METHODS.filesystem.sync.selectFolder]: {\n command: TAURI_COMMANDS.filesync.selectFolder,\n args: () => ({}),\n },\n\n [HAEXTENSION_METHODS.filesystem.sync.scanLocal]: {\n command: TAURI_COMMANDS.filesync.scanLocal,\n args: (p: FileSyncScanLocalParams) => ({ request: p }),\n },\n};\n","/**\n * Transport Handlers Index\n *\n * Combines all domain-specific handlers into a single handler map\n */\n\nimport type { InvokeHandlerMap } from \"./types\";\nimport { databaseHandlers } from \"./database\";\nimport { permissionsHandlers } from \"./permissions\";\nimport { webHandlers } from \"./web\";\nimport { filesystemHandlers } from \"./filesystem\";\nimport { externalHandlers } from \"./external\";\nimport { filesyncHandlers } from \"./filesync\";\n\n/**\n * Combined handler map for all SDK methods\n * Used by both invoke and postMessage transports\n */\nexport const allHandlers: InvokeHandlerMap = {\n ...databaseHandlers,\n ...permissionsHandlers,\n ...webHandlers,\n ...filesystemHandlers,\n ...externalHandlers,\n ...filesyncHandlers,\n};\n\n// Re-export types and individual handlers for flexibility\nexport type { InvokeHandlerMap, InvokeMapping } from \"./types\";\nexport { databaseHandlers } from \"./database\";\nexport { permissionsHandlers } from \"./permissions\";\nexport { webHandlers } from \"./web\";\nexport { filesystemHandlers } from \"./filesystem\";\nexport { externalHandlers } from \"./external\";\nexport { filesyncHandlers } from \"./filesync\";\n","/**\n * Transport Module\n *\n * Functions for sending requests via different transport mechanisms:\n * - postMessage (iframe mode)\n * - Tauri invoke (native WebView mode)\n */\n\nimport { ErrorCode, HaexVaultSdkError } from \"../types\";\nimport type { HaexHubRequest, ExtensionInfo } from \"../types\";\nimport { allHandlers } from \"../transport/handlers\";\nimport type { ClientConfig, PendingRequest, LogFn } from \"./context\";\n\n/**\n * Generate a unique request ID\n */\nexport function generateRequestId(counter: number): string {\n return `req_${counter}`;\n}\n\n/**\n * Send a request via postMessage (iframe mode)\n */\nexport function sendPostMessage<T>(\n method: string,\n params: Record<string, unknown>,\n requestId: string,\n config: ClientConfig,\n extensionInfo: ExtensionInfo | null,\n pendingRequests: Map<string, PendingRequest>\n): Promise<T> {\n const request: HaexHubRequest = {\n method,\n params,\n timestamp: Date.now(),\n };\n\n return new Promise<T>((resolve, reject) => {\n const timeout = setTimeout(() => {\n pendingRequests.delete(requestId);\n reject(\n new HaexVaultSdkError(ErrorCode.TIMEOUT, \"errors.timeout\", {\n timeout: config.timeout,\n })\n );\n }, config.timeout);\n\n pendingRequests.set(requestId, { resolve, reject, timeout });\n\n // Use wildcard origin since extensions are sandboxed in their own protocol\n const targetOrigin = \"*\";\n\n if (config.debug) {\n console.log(\"[SDK Debug] ========== Sending Request ==========\");\n console.log(\"[SDK Debug] Request ID:\", requestId);\n console.log(\"[SDK Debug] Method:\", request.method);\n console.log(\"[SDK Debug] Params:\", request.params);\n console.log(\"[SDK Debug] Target origin:\", targetOrigin);\n console.log(\"[SDK Debug] Extension info:\", extensionInfo);\n console.log(\"[SDK Debug] ========================================\");\n }\n\n window.parent.postMessage({ id: requestId, ...request }, targetOrigin);\n });\n}\n\n/**\n * Send a request via Tauri invoke (native WebView mode)\n */\nexport async function sendInvoke<T>(\n method: string,\n params: Record<string, unknown>,\n config: ClientConfig,\n log: LogFn\n): Promise<T> {\n const { invoke } = (window as unknown as { __TAURI__: { core: { invoke: <R>(cmd: string, args?: Record<string, unknown>) => Promise<R> } } }).__TAURI__.core;\n\n if (config.debug) {\n console.log(\"[SDK Debug] ========== Invoke Request ==========\");\n console.log(\"[SDK Debug] Method:\", method);\n console.log(\"[SDK Debug] Params:\", params);\n console.log(\"[SDK Debug] =======================================\");\n }\n\n // Look up handler for this method\n const handler = allHandlers[method];\n\n if (handler) {\n const args = handler.args(params);\n console.log(\"[SDK Debug] Handler found for method:\", method);\n console.log(\"[SDK Debug] Handler command:\", handler.command);\n console.log(\"[SDK Debug] Transformed args:\", JSON.stringify(args, null, 2));\n return invoke<T>(handler.command, args);\n }\n\n // Method not found in handlers\n throw new HaexVaultSdkError(\n ErrorCode.METHOD_NOT_FOUND,\n \"errors.method_not_found\",\n { method }\n );\n}\n\n/**\n * Handle a response for a pending request\n */\nexport function handlePendingResponse(\n requestId: string,\n result: unknown,\n error: unknown,\n pendingRequests: Map<string, PendingRequest>,\n debug: boolean\n): boolean {\n const pending = pendingRequests.get(requestId);\n if (!pending) {\n if (debug) {\n console.warn(\n \"[SDK Debug] ⚠️ Received response for unknown request ID:\",\n requestId\n );\n console.warn(\n \"[SDK Debug] Known IDs:\",\n Array.from(pendingRequests.keys())\n );\n }\n return false;\n }\n\n clearTimeout(pending.timeout);\n pendingRequests.delete(requestId);\n\n if (error) {\n if (debug) {\n console.error(\"[SDK Debug] ❌ Request failed:\", error);\n }\n pending.reject(error);\n } else {\n if (debug) {\n console.log(\"[SDK Debug] ✅ Request succeeded:\", result);\n }\n pending.resolve(result);\n }\n\n return true;\n}\n","/**\n * Event Handling Module\n *\n * Functions for handling messages and events from the parent window (iframe mode)\n * or from Tauri events (native mode).\n */\n\nimport { HAEXTENSION_EVENTS, EXTERNAL_EVENTS } from \"../events\";\nimport type {\n HaexHubResponse,\n HaexHubEvent,\n EventCallback,\n ContextChangedEvent,\n ExternalRequestEvent,\n ApplicationContext,\n} from \"../types\";\nimport type { ClientConfig, PendingRequest, LogFn } from \"./context\";\n\n/**\n * Create a message handler for iframe mode\n */\nexport function createMessageHandler(\n config: ClientConfig,\n pendingRequests: Map<string, PendingRequest>,\n extensionInfo: () => unknown,\n onEvent: (event: HaexHubEvent) => void\n): (event: MessageEvent) => void {\n return (event: MessageEvent) => {\n if (config.debug) {\n console.log(\"[SDK Debug] ========== Message Received ==========\");\n console.log(\"[SDK Debug] Event origin:\", event.origin);\n console.log(\n \"[SDK Debug] Event source:\",\n event.source === window.parent ? \"parent window\" : \"unknown\"\n );\n console.log(\"[SDK Debug] Event data:\", event.data);\n console.log(\"[SDK Debug] Extension info loaded:\", !!extensionInfo());\n console.log(\n \"[SDK Debug] Pending requests count:\",\n pendingRequests.size\n );\n }\n\n // Verify message comes from parent window\n if (event.source !== window.parent) {\n if (config.debug) {\n console.error(\"[SDK Debug] ❌ REJECTED: Message not from parent window!\");\n }\n return;\n }\n\n const data = event.data as HaexHubResponse | HaexHubEvent;\n\n // Handle pending request responses\n if (\"id\" in data && pendingRequests.has(data.id)) {\n if (config.debug) {\n console.log(\"[SDK Debug] ✅ Found pending request for ID:\", data.id);\n }\n const pending = pendingRequests.get(data.id)!;\n clearTimeout(pending.timeout);\n pendingRequests.delete(data.id);\n\n if (data.error) {\n if (config.debug) {\n console.error(\"[SDK Debug] ❌ Request failed:\", data.error);\n }\n pending.reject(data.error);\n } else {\n if (config.debug) {\n console.log(\"[SDK Debug] ✅ Request succeeded:\", data.result);\n }\n pending.resolve(data.result);\n }\n return;\n }\n\n // Warn about unknown request IDs\n if (\"id\" in data && !pendingRequests.has(data.id)) {\n if (config.debug) {\n console.warn(\n \"[SDK Debug] ⚠️ Received response for unknown request ID:\",\n data.id\n );\n console.warn(\n \"[SDK Debug] Known IDs:\",\n Array.from(pendingRequests.keys())\n );\n }\n }\n\n // Handle events\n if (\"type\" in data && data.type) {\n if (config.debug) {\n console.log(\"[SDK Debug] Event received:\", data.type);\n }\n onEvent(data as HaexHubEvent);\n }\n\n if (config.debug) {\n console.log(\"[SDK Debug] ========== End Message ==========\");\n }\n };\n}\n\n/**\n * Process an incoming event\n */\nexport function processEvent(\n event: HaexHubEvent,\n log: LogFn,\n eventListeners: Map<string, Set<EventCallback>>,\n onContextChanged: (context: ApplicationContext) => void,\n onExternalRequest: (event: ExternalRequestEvent) => void\n): void {\n // Handle context changes\n if (event.type === HAEXTENSION_EVENTS.CONTEXT_CHANGED) {\n const contextEvent = event as ContextChangedEvent;\n onContextChanged(contextEvent.data.context);\n log(\"Context updated:\", contextEvent.data.context);\n }\n\n // Handle external requests from authorized clients\n if (event.type === EXTERNAL_EVENTS.REQUEST) {\n const externalEvent = event as ExternalRequestEvent;\n onExternalRequest(externalEvent);\n return; // Don't emit to regular event listeners\n }\n\n // Emit to registered listeners\n emitEvent(event, log, eventListeners);\n}\n\n/**\n * Emit an event to registered listeners\n */\nexport function emitEvent(\n event: HaexHubEvent,\n log: LogFn,\n eventListeners: Map<string, Set<EventCallback>>\n): void {\n log(\"Event received:\", event);\n const listeners = eventListeners.get(event.type);\n if (listeners) {\n listeners.forEach((callback) => callback(event));\n }\n}\n\n/**\n * Register an event listener\n */\nexport function addEventListener(\n eventType: string,\n callback: EventCallback,\n eventListeners: Map<string, Set<EventCallback>>\n): void {\n if (!eventListeners.has(eventType)) {\n eventListeners.set(eventType, new Set());\n }\n eventListeners.get(eventType)!.add(callback);\n}\n\n/**\n * Remove an event listener\n */\nexport function removeEventListener(\n eventType: string,\n callback: EventCallback,\n eventListeners: Map<string, Set<EventCallback>>\n): void {\n const listeners = eventListeners.get(eventType);\n if (listeners) {\n listeners.delete(callback);\n }\n}\n\n/**\n * Notify all reactive subscribers\n */\nexport function notifySubscribers(subscribers: Set<() => void>): void {\n subscribers.forEach((callback) => callback());\n}\n","/**\n * Database Module\n *\n * Functions for database operations including Drizzle ORM initialization\n * and raw SQL query/execute methods.\n */\n\nimport { HAEXTENSION_METHODS } from \"../methods\";\nimport { ErrorCode, HaexVaultSdkError } from \"../types\";\nimport type { ExtensionInfo, DatabaseQueryResult } from \"../types\";\nimport { drizzle, type SqliteRemoteDatabase } from \"drizzle-orm/sqlite-proxy\";\nimport type { LogFn } from \"./context\";\n\n/**\n * Request function type for database operations\n */\ntype RequestFn = <T>(method: string, params?: Record<string, unknown>) => Promise<T>;\n\n/**\n * Create a Drizzle ORM database instance\n *\n * @param schema The Drizzle schema object (with prefixed table names)\n * @param extensionInfo The current extension info (required)\n * @param request The request function for SDK communication\n * @param log Logger function\n * @returns The type-safe Drizzle database instance\n */\nexport function createDrizzleInstance<T extends Record<string, unknown>>(\n schema: T,\n extensionInfo: ExtensionInfo | null,\n request: RequestFn,\n log: LogFn\n): SqliteRemoteDatabase<T> {\n if (!extensionInfo) {\n throw new HaexVaultSdkError(\n ErrorCode.EXTENSION_INFO_UNAVAILABLE,\n \"errors.client_not_ready\"\n );\n }\n\n return drizzle<T>(\n async (\n sql: string,\n params: unknown[],\n method: \"get\" | \"run\" | \"all\" | \"values\"\n ) => {\n try {\n // Drizzle uses different methods:\n // - \"run\": INSERT/UPDATE/DELETE without RETURNING\n // - \"all\": INSERT/UPDATE/DELETE with RETURNING, or SELECT\n // - \"get\": SELECT with LIMIT 1\n // - \"values\": SELECT returning raw values\n //\n // The backend intelligently handles routing:\n // - method=\"run\" and \"all\" go to haextension.db.execute\n // - Backend detects SELECT statements and delegates to haextension.db.query\n // - Backend returns rows when RETURNING clause is present\n\n if (method === \"run\" || method === \"all\") {\n const result = await request<DatabaseQueryResult>(\n HAEXTENSION_METHODS.database.execute,\n {\n query: sql,\n params: params as unknown[],\n }\n );\n\n // For method=\"all\", return rows (RETURNING clause or SELECT delegated by backend)\n if (method === \"all\") {\n return { rows: result.rows || [] };\n }\n\n // For method=\"run\", check if we have rows (RETURNING clause)\n if (result.rows && Array.isArray(result.rows) && result.rows.length > 0) {\n return { rows: result.rows };\n }\n\n return result;\n }\n\n // Read operations (SELECT without RETURNING)\n const result = await request<DatabaseQueryResult>(HAEXTENSION_METHODS.database.query, {\n query: sql,\n params: params as unknown[],\n });\n\n const rows = result.rows as unknown[];\n\n if (method === \"get\") {\n return { rows: rows.length > 0 ? rows.at(0) : undefined };\n }\n\n return { rows };\n } catch (error) {\n log(\"Database operation failed:\", error);\n throw error;\n }\n },\n {\n schema: schema,\n logger: false,\n }\n );\n}\n\n/**\n * Execute a raw SQL query (SELECT)\n *\n * @param sql The SQL query string\n * @param params Query parameters\n * @param request The request function\n * @param debug Whether debug mode is enabled\n * @returns Array of result rows\n */\nexport async function queryRaw<T = Record<string, unknown>>(\n sql: string,\n params: unknown[],\n request: RequestFn,\n debug: boolean\n): Promise<T[]> {\n const result = await request<DatabaseQueryResult>(\n HAEXTENSION_METHODS.database.query,\n { query: sql, params }\n );\n if (debug) {\n console.log(\"[SDK query()] Raw result:\", JSON.stringify(result, null, 2));\n }\n return result.rows as T[];\n}\n\n/**\n * Execute a raw SQL statement (INSERT, UPDATE, DELETE, CREATE, etc.)\n *\n * @param sql The SQL statement\n * @param params Statement parameters\n * @param request The request function\n * @returns Object with rowsAffected and optionally lastInsertId\n */\nexport async function executeRaw(\n sql: string,\n params: unknown[],\n request: RequestFn\n): Promise<{ rowsAffected: number; lastInsertId?: number }> {\n const result = await request<DatabaseQueryResult>(\n HAEXTENSION_METHODS.database.execute,\n { query: sql, params }\n );\n return {\n rowsAffected: result.rowsAffected,\n lastInsertId: result.lastInsertId,\n };\n}\n","/**\n * External Request Handling Module\n *\n * Functions for handling external requests from authorized clients\n * (browser extensions, CLI tools, servers, etc.)\n */\n\nimport type {\n ExternalRequest,\n ExternalResponse,\n ExternalRequestHandler,\n} from \"../types\";\nimport type { LogFn } from \"./context\";\n\n/**\n * Request function type\n */\ntype RequestFn = <T>(method: string, params?: Record<string, unknown>) => Promise<T>;\n\n/**\n * Register an external request handler\n *\n * @param action The action/method name to handle\n * @param handler The handler function\n * @param handlers The handlers map\n * @param log Logger function\n * @returns Unsubscribe function\n */\nexport function registerExternalHandler(\n action: string,\n handler: ExternalRequestHandler,\n handlers: Map<string, ExternalRequestHandler>,\n log: LogFn\n): () => void {\n handlers.set(action, handler);\n log(`[ExternalRequest] Registered handler for action: ${action}`);\n\n return () => {\n handlers.delete(action);\n log(`[ExternalRequest] Unregistered handler for action: ${action}`);\n };\n}\n\n/**\n * Handle an incoming external request\n *\n * @param request The external request\n * @param handlers The handlers map\n * @param respond Function to send response\n * @param log Logger function\n */\nexport async function handleExternalRequest(\n request: ExternalRequest,\n handlers: Map<string, ExternalRequestHandler>,\n respond: (response: ExternalResponse) => Promise<void>,\n log: LogFn\n): Promise<void> {\n console.log(\"[SDK Debug] handleExternalRequest called!\");\n console.log(\"[SDK Debug] Request:\", JSON.stringify(request, null, 2));\n console.log(\"[SDK Debug] Available handlers:\", Array.from(handlers.keys()));\n log(`[ExternalRequest] Received request: ${request.action} from ${request.publicKey.substring(0, 20)}...`);\n\n const handler = handlers.get(request.action);\n\n if (!handler) {\n log(`[ExternalRequest] No handler for action: ${request.action}`);\n await respond({\n requestId: request.requestId,\n success: false,\n error: `No handler registered for action: ${request.action}`,\n });\n return;\n }\n\n try {\n const response = await handler(request);\n await respond(response);\n log(`[ExternalRequest] Response sent for: ${request.action}`);\n } catch (error) {\n log(`[ExternalRequest] Handler error:`, error);\n await respond({\n requestId: request.requestId,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n}\n\n/**\n * Send an external response back to haex-vault\n *\n * @param response The response to send\n * @param request The request function\n */\nexport async function respondToExternalRequest(\n response: ExternalResponse,\n request: RequestFn\n): Promise<void> {\n console.log(\"[SDK Debug] respondToExternalRequest called with:\", JSON.stringify(response, null, 2));\n await request(\"external.respond\", response as unknown as Record<string, unknown>);\n}\n","/**\n * HaexVault Client\n *\n * Main SDK client for extensions running in HaexVault.\n * Supports both native WebView mode (Tauri) and iframe mode (mobile/web).\n */\n\nimport type {\n HaexHubConfig,\n HaexHubEvent,\n EventCallback,\n PermissionResponse,\n DatabasePermissionRequest,\n ExtensionInfo,\n ApplicationContext,\n SearchResult,\n MigrationResult,\n Migration,\n ExternalResponse,\n ExternalRequestHandler,\n} from \"./types\";\nimport { DEFAULT_TIMEOUT } from \"./types\";\nimport { StorageAPI } from \"./api/storage\";\nimport { DatabaseAPI } from \"./api/database\";\nimport { FilesystemAPI } from \"./api/filesystem\";\nimport { WebAPI } from \"./api/web\";\nimport { PermissionsAPI } from \"./api/permissions\";\nimport { installConsoleForwarding } from \"./polyfills/consoleForwarding\";\nimport type { SqliteRemoteDatabase } from \"drizzle-orm/sqlite-proxy\";\n\n// Client modules\nimport type { ClientConfig, PendingRequest } from \"./client/context\";\nimport {\n getExtensionTableName,\n getDependencyTableName as getDependencyTableNameFn,\n parseTableName as parseTableNameFn,\n} from \"./client/tableName\";\nimport { isInIframe, hasTauri, initNativeMode, initIframeMode } from \"./client/init\";\nimport { sendPostMessage, sendInvoke, generateRequestId } from \"./client/transport\";\nimport {\n createMessageHandler,\n processEvent,\n addEventListener,\n removeEventListener,\n notifySubscribers,\n} from \"./client/events\";\nimport { createDrizzleInstance, queryRaw, executeRaw } from \"./client/database\";\nimport { registerExternalHandler, handleExternalRequest, respondToExternalRequest } from \"./client/external\";\n\nexport class HaexVaultSdk {\n // Configuration\n private readonly config: ClientConfig;\n\n // State\n private initialized = false;\n private isNativeWindow = false;\n private requestCounter = 0;\n private _extensionInfo: ExtensionInfo | null = null;\n private _context: ApplicationContext | null = null;\n private _setupCompleted = false;\n\n // Collections\n private readonly pendingRequests: Map<string, PendingRequest> = new Map();\n private readonly eventListeners: Map<string, Set<EventCallback>> = new Map();\n private readonly externalRequestHandlers: Map<string, ExternalRequestHandler> = new Map();\n private readonly reactiveSubscribers: Set<() => void> = new Set();\n\n // Handlers\n private messageHandler: ((event: MessageEvent) => void) | null = null;\n\n // Promises\n private readyPromise: Promise<void>;\n private resolveReady!: () => void;\n private setupPromise: Promise<void> | null = null;\n private setupHook: (() => Promise<void>) | null = null;\n\n // Public APIs\n public orm: SqliteRemoteDatabase<Record<string, unknown>> | null = null;\n public readonly storage: StorageAPI;\n public readonly database: DatabaseAPI;\n public readonly filesystem: FilesystemAPI;\n public readonly web: WebAPI;\n public readonly permissions: PermissionsAPI;\n\n constructor(config: HaexHubConfig = {}) {\n this.config = {\n debug: config.debug ?? false,\n timeout: config.timeout ?? DEFAULT_TIMEOUT,\n manifest: config.manifest,\n };\n\n this.storage = new StorageAPI(this);\n this.database = new DatabaseAPI(this);\n this.filesystem = new FilesystemAPI(this);\n this.web = new WebAPI(this);\n this.permissions = new PermissionsAPI(this);\n\n installConsoleForwarding(this.config.debug);\n\n this.readyPromise = new Promise((resolve) => {\n this.resolveReady = resolve;\n });\n\n this.init();\n }\n\n // ==========================================================================\n // Lifecycle\n // ==========================================================================\n\n public async ready(): Promise<void> {\n return this.readyPromise;\n }\n\n public get setupCompleted(): boolean {\n return this._setupCompleted;\n }\n\n public onSetup(setupFn: () => Promise<void>): void {\n if (this.setupHook) {\n throw new Error(\"Setup hook already registered\");\n }\n this.setupHook = setupFn;\n }\n\n public async setupComplete(): Promise<void> {\n await this.readyPromise;\n\n if (!this.setupHook || this.setupCompleted) {\n return;\n }\n\n if (!this.setupPromise) {\n this.setupPromise = this.runSetupAsync();\n }\n\n return this.setupPromise;\n }\n\n public destroy(): void {\n if (this.messageHandler) {\n window.removeEventListener(\"message\", this.messageHandler);\n }\n\n this.pendingRequests.forEach(({ timeout }) => clearTimeout(timeout));\n this.pendingRequests.clear();\n this.eventListeners.clear();\n\n this.initialized = false;\n this.log(\"HaexVault SDK destroyed\");\n }\n\n // ==========================================================================\n // Properties\n // ==========================================================================\n\n public get extensionInfo(): ExtensionInfo | null {\n return this._extensionInfo;\n }\n\n public get context(): ApplicationContext | null {\n return this._context;\n }\n\n // ==========================================================================\n // Subscriptions\n // ==========================================================================\n\n public subscribe(callback: () => void): () => void {\n this.reactiveSubscribers.add(callback);\n return () => {\n this.reactiveSubscribers.delete(callback);\n };\n }\n\n // ==========================================================================\n // Table Name Utilities\n // ==========================================================================\n\n public getTableName(tableName: string): string {\n return getExtensionTableName(this._extensionInfo, tableName);\n }\n\n public getDependencyTableName(publicKey: string, extensionName: string, tableName: string): string {\n return getDependencyTableNameFn(publicKey, extensionName, tableName);\n }\n\n public parseTableName(fullTableName: string): { publicKey: string; extensionName: string; tableName: string } | null {\n return parseTableNameFn(fullTableName);\n }\n\n // ==========================================================================\n // Database\n // ==========================================================================\n\n public initializeDatabase<T extends Record<string, unknown>>(schema: T): SqliteRemoteDatabase<T> {\n const db = createDrizzleInstance(schema, this._extensionInfo, this.request.bind(this), this.log.bind(this));\n this.orm = db as SqliteRemoteDatabase<Record<string, unknown>>;\n return db;\n }\n\n public async query<T = Record<string, unknown>>(sql: string, params: unknown[] = []): Promise<T[]> {\n return queryRaw<T>(sql, params, this.request.bind(this), this.config.debug);\n }\n\n public async select<T = Record<string, unknown>>(sql: string, params: unknown[] = []): Promise<T[]> {\n return this.query<T>(sql, params);\n }\n\n public async execute(sql: string, params: unknown[] = []): Promise<{ rowsAffected: number; lastInsertId?: number }> {\n return executeRaw(sql, params, this.request.bind(this));\n }\n\n public async registerMigrationsAsync(extensionVersion: string, migrations: Migration[]): Promise<MigrationResult> {\n return this.database.registerMigrationsAsync(extensionVersion, migrations);\n }\n\n // ==========================================================================\n // Dependencies\n // ==========================================================================\n\n public async getDependencies(): Promise<ExtensionInfo[]> {\n return this.request<ExtensionInfo[]>(\"extensions.getDependencies\");\n }\n\n // ==========================================================================\n // Permissions\n // ==========================================================================\n\n public async requestDatabasePermission(request: DatabasePermissionRequest): Promise<PermissionResponse> {\n return this.request<PermissionResponse>(\"permissions.database.request\", {\n resource: request.resource,\n operation: request.operation,\n reason: request.reason,\n });\n }\n\n public async checkDatabasePermission(resource: string, operation: \"read\" | \"write\"): Promise<boolean> {\n const response = await this.request<PermissionResponse>(\"permissions.database.check\", { resource, operation });\n return response.status === \"granted\";\n }\n\n // ==========================================================================\n // Search\n // ==========================================================================\n\n public async respondToSearch(requestId: string, results: SearchResult[]): Promise<void> {\n await this.request(\"search.respond\", { requestId, results });\n }\n\n // ==========================================================================\n // External Requests\n // ==========================================================================\n\n public onExternalRequest(action: string, handler: ExternalRequestHandler): () => void {\n return registerExternalHandler(action, handler, this.externalRequestHandlers, this.log.bind(this));\n }\n\n public async respondToExternalRequest(response: ExternalResponse): Promise<void> {\n await respondToExternalRequest(response, this.request.bind(this));\n }\n\n // ==========================================================================\n // Events\n // ==========================================================================\n\n public on(eventType: string, callback: EventCallback): void {\n addEventListener(eventType, callback, this.eventListeners);\n }\n\n public off(eventType: string, callback: EventCallback): void {\n removeEventListener(eventType, callback, this.eventListeners);\n }\n\n // ==========================================================================\n // Communication\n // ==========================================================================\n\n public async request<T = unknown, P = Record<string, unknown>>(method: string, params?: P): Promise<T> {\n const resolvedParams = (params ?? {}) as Record<string, unknown>;\n\n if (this.isNativeWindow && hasTauri()) {\n return sendInvoke<T>(method, resolvedParams, this.config, this.log.bind(this));\n }\n\n const requestId = generateRequestId(++this.requestCounter);\n return sendPostMessage<T>(method, resolvedParams, requestId, this.config, this._extensionInfo, this.pendingRequests);\n }\n\n // ==========================================================================\n // Private: Initialization\n // ==========================================================================\n\n private async init(): Promise<void> {\n if (this.initialized) return;\n\n // Check iframe mode FIRST before attempting Tauri calls\n // This prevents hanging on Android where __TAURI__ exists but sandboxed iframes can't access it\n if (!isInIframe() && hasTauri()) {\n try {\n await this.initNative();\n return;\n } catch (error) {\n this.log(\"Tauri commands failed, falling back to iframe mode\", error);\n }\n }\n\n await this.initIframe();\n }\n\n private async initNative(): Promise<void> {\n const { extensionInfo, context } = await initNativeMode(\n {\n config: this.config,\n state: {\n initialized: this.initialized,\n isNativeWindow: this.isNativeWindow,\n requestCounter: this.requestCounter,\n setupCompleted: this._setupCompleted,\n extensionInfo: this._extensionInfo,\n context: this._context,\n orm: this.orm,\n },\n collections: {\n pendingRequests: this.pendingRequests,\n eventListeners: this.eventListeners,\n externalRequestHandlers: this.externalRequestHandlers,\n reactiveSubscribers: this.reactiveSubscribers,\n },\n promises: {\n readyPromise: this.readyPromise,\n resolveReady: this.resolveReady,\n setupPromise: this.setupPromise,\n setupHook: this.setupHook,\n },\n handlers: {\n messageHandler: this.messageHandler,\n },\n },\n this.log.bind(this),\n this.handleEvent.bind(this),\n (ctx) => {\n this._context = ctx;\n this.notifySubscribersInternal();\n }\n );\n\n this._extensionInfo = extensionInfo;\n this._context = context;\n this.isNativeWindow = true;\n this.initialized = true;\n\n this.notifySubscribersInternal();\n this.resolveReady();\n }\n\n private async initIframe(): Promise<void> {\n this.messageHandler = createMessageHandler(\n this.config,\n this.pendingRequests,\n () => this._extensionInfo,\n this.handleEvent.bind(this)\n );\n\n const { context } = await initIframeMode(\n {\n config: this.config,\n state: {\n initialized: this.initialized,\n isNativeWindow: this.isNativeWindow,\n requestCounter: this.requestCounter,\n setupCompleted: this._setupCompleted,\n extensionInfo: this._extensionInfo,\n context: this._context,\n orm: this.orm,\n },\n collections: {\n pendingRequests: this.pendingRequests,\n eventListeners: this.eventListeners,\n externalRequestHandlers: this.externalRequestHandlers,\n reactiveSubscribers: this.reactiveSubscribers,\n },\n promises: {\n readyPromise: this.readyPromise,\n resolveReady: this.resolveReady,\n setupPromise: this.setupPromise,\n setupHook: this.setupHook,\n },\n handlers: {\n messageHandler: this.messageHandler,\n },\n },\n this.log.bind(this),\n this.messageHandler,\n this.request.bind(this)\n );\n\n // Load extension info from manifest if provided\n if (this.config.manifest) {\n this._extensionInfo = {\n publicKey: this.config.manifest.publicKey,\n name: this.config.manifest.name,\n version: this.config.manifest.version,\n displayName: this.config.manifest.name,\n };\n this.notifySubscribersInternal();\n }\n\n this._context = context;\n this.isNativeWindow = false;\n this.initialized = true;\n\n this.notifySubscribersInternal();\n this.resolveReady();\n }\n\n // ==========================================================================\n // Private: Event Handling\n // ==========================================================================\n\n private handleEvent(event: HaexHubEvent): void {\n processEvent(\n event,\n this.log.bind(this),\n this.eventListeners,\n (ctx) => {\n this._context = ctx;\n this.notifySubscribersInternal();\n },\n (extEvent) => this.handleExternalRequestInternal(extEvent.data)\n );\n }\n\n private async handleExternalRequestInternal(request: import(\"./types\").ExternalRequest): Promise<void> {\n await handleExternalRequest(request, this.externalRequestHandlers, this.respondToExternalRequest.bind(this), this.log.bind(this));\n }\n\n // ==========================================================================\n // Private: Setup\n // ==========================================================================\n\n private async runSetupAsync(): Promise<void> {\n if (!this.setupHook) return;\n\n try {\n this.log(\"[HaexVault] Running setup hook...\");\n await this.setupHook();\n this._setupCompleted = true;\n this.log(\"[HaexVault] Setup completed successfully\");\n this.notifySubscribersInternal();\n } catch (error) {\n this.log(\"[HaexVault] Setup failed:\", error);\n throw error;\n }\n }\n\n // ==========================================================================\n // Private: Utilities\n // ==========================================================================\n\n private notifySubscribersInternal(): void {\n notifySubscribers(this.reactiveSubscribers);\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log(\"[HaexVault SDK]\", ...args);\n }\n }\n}\n","// Import and auto-install polyfills first\n// This ensures localStorage, cookies, and history work in custom protocols\nimport './polyfills';\n\nexport { HaexVaultSdk } from \"./client\";\nexport { DatabaseAPI } from \"./api/database\";\nexport { FilesystemAPI } from \"./api/filesystem\";\nexport { FileSyncAPI } from \"./api/filesync\";\nexport { WebAPI } from \"./api/web\";\nexport { PermissionsAPI } from \"./api/permissions\";\nexport type {\n FileSpace,\n FileInfo,\n FileSyncState,\n StorageBackendInfo,\n StorageBackendType,\n S3BackendConfig,\n BackendConfig,\n SyncRule,\n SyncDirection,\n ConflictStrategy,\n SyncStatus,\n SyncError,\n SyncProgress,\n CreateSpaceOptions,\n AddBackendOptions,\n AddSyncRuleOptions,\n UpdateSyncRuleOptions,\n ListFilesOptions,\n ScanLocalOptions,\n UploadFileOptions,\n DownloadFileOptions,\n LocalFileInfo,\n} from \"./api/filesync\";\n\nexport {\n FILE_SYNC_STATE,\n SYNC_DIRECTION,\n STORAGE_BACKEND_TYPE,\n CONFLICT_STRATEGY,\n} from \"./api/filesync\";\n\nexport type {\n HaexHubRequest,\n HaexHubResponse,\n HaexHubConfig,\n HaexHubEvent,\n EventCallback,\n PermissionResponse,\n DatabasePermission,\n DatabasePermissionRequest,\n DatabaseQueryParams,\n DatabaseQueryResult,\n DatabaseExecuteParams,\n DatabaseTableInfo,\n DatabaseColumnInfo,\n ExtensionInfo,\n ExtensionManifest,\n ApplicationContext,\n SearchQuery,\n SearchResult,\n ContextChangedEvent,\n SearchRequestEvent,\n ExternalRequestEvent,\n ExternalRequest,\n ExternalResponse,\n ExternalRequestHandler,\n AuthorizedClient,\n BlockedClient,\n RequestedExtension,\n PendingAuthorization,\n ExternalAuthDecision,\n SessionAuthorization,\n ExternalConnection,\n WebRequestOptions,\n WebResponse,\n} from \"./types\";\n\nexport {\n PermissionStatus,\n ErrorCode,\n DEFAULT_TIMEOUT,\n TABLE_SEPARATOR,\n getTableName,\n ExternalConnectionState,\n ExternalConnectionErrorCode,\n isExternalClientConnected,\n canExternalClientSendRequests,\n} from \"./types\";\nexport { HaexVaultSdkError } from \"./types\";\n\n// Export event constants\nexport { HAEXTENSION_EVENTS, type HaextensionEvent, EXTERNAL_EVENTS, type ExternalEvent } from './events';\n\n// Export method constants\nexport { HAEXTENSION_METHODS, type HaextensionMethod } from './methods';\n\n// Export message type constants\nexport { HAEXSPACE_MESSAGE_TYPES, type HaexspaceMessageType } from './messages';\n\n// Export Tauri command constants (for use in other projects like haex-vault)\nexport { TAURI_COMMANDS, type TauriCommand } from './commands';\n\n// Export polyfill utilities for manual control if needed\nexport {\n installPolyfills,\n installLocalStoragePolyfill,\n installSessionStoragePolyfill,\n installCookiePolyfill,\n installHistoryPolyfill,\n installBaseTag,\n} from './polyfills';\n\n// Export config type only (utilities are Node.js-only and exported separately)\nexport type { HaextensionConfig } from './config';\n\n// Export browser-compatible signature verification\nexport {\n verifyExtensionSignature,\n sortObjectKeysRecursively,\n hexToBytes,\n type VerifyResult,\n type ZipFileEntry,\n} from './crypto/verify';\n\n// Export vault key crypto utilities\nexport {\n deriveKeyFromPassword,\n generateVaultKey,\n encryptString,\n decryptString,\n encryptVaultKey,\n decryptVaultKey,\n decryptVaultName,\n encryptCrdtData,\n decryptCrdtData,\n wrapKey,\n unwrapKey,\n arrayBufferToBase64,\n base64ToArrayBuffer,\n} from './crypto/vaultKey';\n\nimport { HaexVaultSdk } from \"./client\";\nimport type { HaexHubConfig } from \"./types\";\n\nexport function createHaexVaultSdk(\n config: HaexHubConfig = {}\n) {\n return new HaexVaultSdk(config);\n}\n","/**\n * Vue 3 Integration for HaexVault SDK\n *\n * Provides a Vue composable that automatically creates reactive refs\n * for extension info and application context.\n *\n * @example\n * ```typescript\n * import { useHaexVaultSdk } from '@haex-space/vault-sdk/vue';\n *\n * const { extensionInfo, context, db, storage } = useHaexVaultSdk();\n *\n * // Use directly in templates - automatically reactive!\n * console.log(extensionInfo.value);\n * console.log(context.value);\n * ```\n */\n\nimport { ref, readonly } from 'vue';\nimport type { Ref } from 'vue';\nimport { createHaexVaultSdk } from './index';\nimport { HaexVaultSdk } from './client';\nimport type { ExtensionInfo, ApplicationContext, HaexHubConfig } from './types';\n\n// Shared reactive SDK instance - initialized once at module level\nlet clientInstance: HaexVaultSdk | null = null;\nlet extensionInfo: Ref<ExtensionInfo | null> | null = null;\nlet context: Ref<ApplicationContext | null> | null = null;\nlet isSetupComplete: Ref<boolean> | null = null;\n\n/**\n * Vue 3 composable for HaexVault SDK\n *\n * Creates a singleton SDK client with reactive properties that automatically\n * update when the SDK receives new data from the parent application.\n *\n * @param config - Optional SDK configuration\n * @returns Reactive SDK instance with extensionInfo, context, db, and storage\n */\nexport function useHaexVaultSdk(config: HaexHubConfig = {}) {\n // Initialize SDK only once\n if (!clientInstance) {\n clientInstance = createHaexVaultSdk(config);\n extensionInfo = ref<ExtensionInfo | null>(clientInstance.extensionInfo);\n context = ref<ApplicationContext | null>(clientInstance.context);\n isSetupComplete = ref<boolean>(false);\n\n // Subscribe to SDK changes and update reactive refs\n clientInstance.subscribe(() => {\n if (extensionInfo) {\n extensionInfo.value = clientInstance!.extensionInfo;\n }\n if (context) {\n context.value = clientInstance!.context;\n }\n if (isSetupComplete) {\n isSetupComplete.value = clientInstance!.setupCompleted;\n }\n });\n\n // Note: We DON'T call setupComplete() automatically anymore!\n // The extension must call it after registering the setup hook.\n // This prevents race conditions where setupComplete() is called before the hook is registered.\n }\n\n return {\n client: clientInstance,\n extensionInfo: readonly(extensionInfo!),\n context: readonly(context!),\n isSetupComplete: readonly(isSetupComplete!),\n db: clientInstance.orm,\n storage: clientInstance.storage,\n getTableName: clientInstance.getTableName.bind(clientInstance),\n };\n}\n\n/**\n * Get the raw HaexVault SDK client instance (non-reactive)\n * Useful for direct API calls without Vue reactivity overhead\n */\nexport function getHaexVaultSdk(): HaexVaultSdk | null {\n return clientInstance;\n}\n"]}
1
+ {"version":3,"sources":["../src/polyfills/localStorage.ts","../src/polyfills/cookies.ts","../src/polyfills/history.ts","../src/messages.ts","../src/polyfills/debug.ts","../src/polyfills/consoleForwarding.ts","../src/polyfills/index.ts","../src/events.ts","../src/types.ts","../src/methods.ts","../src/api/storage.ts","../src/api/database.ts","../src/api/filesync.ts","../src/api/filesystem.ts","../src/api/web.ts","../src/api/permissions.ts","../src/client/tableName.ts","../src/client/init.ts","../src/commands.ts","../src/transport/handlers/database.ts","../src/transport/handlers/permissions.ts","../src/transport/handlers/web.ts","../src/transport/handlers/filesystem.ts","../src/transport/handlers/external.ts","../src/transport/handlers/filesync.ts","../src/transport/handlers/index.ts","../src/client/transport.ts","../src/client/events.ts","../src/client/database.ts","../src/client/external.ts","../src/client.ts","../src/index.ts","../src/vue.ts"],"names":["extensionInfo","context","result"],"mappings":"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","file":"vue.mjs","sourcesContent":["/**\n * localStorage Polyfill for HaexSpace Extensions\n *\n * Provides an in-memory fallback when localStorage is blocked\n * due to custom protocol restrictions (haex-extension://)\n */\n\nexport function installLocalStoragePolyfill(): void {\n if (typeof window === 'undefined') {\n return; // Skip in Node.js environment\n }\n\n console.log('[HaexSpace] Storage Polyfill loading immediately');\n\n // Test if localStorage is available\n let localStorageWorks = false;\n try {\n const testKey = '__ls_test__';\n localStorage.setItem(testKey, testKey);\n localStorage.removeItem(testKey);\n localStorageWorks = true;\n } catch (e) {\n console.warn('[HaexSpace] localStorage blocked – using in-memory fallback');\n }\n\n // If blocked: Replace with In-Memory Storage\n if (!localStorageWorks) {\n const lsStorage = new Map<string, string>();\n\n const localStoragePoly: Storage = {\n getItem(key: string): string | null {\n return lsStorage.get(key) || null;\n },\n setItem(key: string, value: string): void {\n lsStorage.set(key, String(value));\n },\n removeItem(key: string): void {\n lsStorage.delete(key);\n },\n clear(): void {\n lsStorage.clear();\n },\n get length(): number {\n return lsStorage.size;\n },\n key(index: number): string | null {\n return Array.from(lsStorage.keys())[index] || null;\n }\n };\n\n try {\n Object.defineProperty(window, 'localStorage', {\n value: localStoragePoly,\n writable: true,\n configurable: true\n });\n } catch (e) {\n // Fallback: Direct assignment\n (window as any).localStorage = localStoragePoly;\n }\n\n console.log('[HaexSpace] localStorage replaced with in-memory polyfill');\n }\n}\n\n/**\n * sessionStorage Polyfill for HaexSpace Extensions\n *\n * Provides a no-op implementation as session state doesn't work\n * reliably in custom protocol contexts\n */\nexport function installSessionStoragePolyfill(): void {\n if (typeof window === 'undefined') {\n return;\n }\n\n try {\n const sessionStoragePoly: Storage = {\n getItem(): null {\n return null;\n },\n setItem(): void {},\n removeItem(): void {},\n clear(): void {},\n get length(): number {\n return 0;\n },\n key(): null {\n return null;\n }\n };\n\n Object.defineProperty(window, 'sessionStorage', {\n value: sessionStoragePoly,\n writable: true,\n configurable: true\n });\n } catch (e) {\n // Fallback: Direct assignment\n (window as any).sessionStorage = {\n getItem: () => null,\n setItem: () => {},\n removeItem: () => {},\n clear: () => {},\n get length() { return 0; },\n key: () => null\n };\n }\n\n console.log('[HaexSpace] sessionStorage polyfill installed');\n}\n","/**\n * Cookie Polyfill for HaexSpace Extensions\n *\n * Provides an in-memory cookie implementation when cookies are blocked\n * due to custom protocol restrictions (haex-extension://)\n */\n\nexport function installCookiePolyfill(): void {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n return; // Skip in Node.js environment\n }\n\n // Test if cookies are available\n let cookiesWork = false;\n try {\n document.cookie = \"__cookie_test__=1\";\n cookiesWork = document.cookie.indexOf(\"__cookie_test__\") !== -1;\n } catch (e) {\n console.warn(\"[HaexSpace] Cookies blocked – using in-memory fallback\");\n }\n\n if (!cookiesWork) {\n const cookieStore = new Map<string, string>();\n\n Object.defineProperty(document, \"cookie\", {\n get(): string {\n const cookies: string[] = [];\n cookieStore.forEach((value, key) => {\n cookies.push(`${key}=${value}`);\n });\n return cookies.join(\"; \");\n },\n set(cookieString: string): void {\n const parts = cookieString.split(\";\").map((p) => p.trim());\n const [keyValue] = parts;\n\n if (!keyValue) return;\n\n const [key, value] = keyValue.split(\"=\");\n if (!key) return;\n\n // Parse options\n const options: Record<string, string | boolean> = {};\n for (let i = 1; i < parts.length; i++) {\n const part = parts[i];\n if (!part) continue;\n const parts_split = part.split(\"=\");\n const optKey = parts_split[0];\n const optValue = parts_split[1];\n if (optKey) {\n options[optKey.toLowerCase()] = optValue || true;\n }\n }\n\n // Check for deletion (expires in past)\n const expiresValue = options.expires;\n if (expiresValue && typeof expiresValue === \"string\") {\n const expiresDate = new Date(expiresValue);\n if (expiresDate < new Date()) {\n cookieStore.delete(key);\n return;\n }\n }\n\n // Check for max-age=0 deletion\n const maxAgeValue = options[\"max-age\"];\n if (typeof maxAgeValue === \"string\" && maxAgeValue === \"0\") {\n cookieStore.delete(key);\n return;\n }\n\n // Store cookie\n cookieStore.set(key, value || \"\");\n },\n configurable: true,\n });\n\n console.log(\"[HaexSpace] Cookie polyfill installed\");\n }\n}\n","/**\n * History API Polyfill for HaexSpace Extensions\n *\n * Works around SecurityError when using pushState/replaceState\n * in custom protocol contexts (haex-extension://)\n *\n * Falls back to hash-based routing when necessary\n */\n\nexport function installHistoryPolyfill(): void {\n if (typeof window === 'undefined' || typeof history === 'undefined') {\n return; // Skip in Node.js environment\n }\n\n // Install after DOM is ready to avoid race conditions\n const install = () => {\n console.log('[HaexSpace] History Patch loading');\n\n const originalPushState = history.pushState;\n const originalReplaceState = history.replaceState;\n let skipNextPush = false;\n let skipNextReplace = false;\n\n // Patch pushState\n history.pushState = function(\n state: any,\n title: string,\n url?: string | URL | null\n ): void {\n console.log('[HaexSpace] pushState called:', url, 'skip:', skipNextPush);\n\n if (skipNextPush) {\n skipNextPush = false;\n console.log('[HaexSpace] pushState skipped');\n return;\n }\n\n try {\n return originalPushState.call(this, state, title, url);\n } catch (e) {\n if ((e as Error).name === 'SecurityError' && url) {\n // Remove duplicate /#/ prefix\n const urlString = url.toString();\n let hashUrl = urlString.replace(/^\\/#/, '');\n hashUrl = hashUrl.startsWith('#') ? hashUrl : '#' + hashUrl;\n console.log('[HaexSpace] SecurityError - setting hash to:', hashUrl);\n skipNextPush = true;\n window.location.hash = hashUrl.replace(/^#/, '');\n return; // Silent fallback\n }\n throw e;\n }\n };\n\n // Patch replaceState\n history.replaceState = function(\n state: any,\n title: string,\n url?: string | URL | null\n ): void {\n console.log('[HaexSpace] replaceState called:', url, 'skip:', skipNextReplace);\n\n if (skipNextReplace) {\n skipNextReplace = false;\n console.log('[HaexSpace] replaceState skipped');\n return;\n }\n\n try {\n return originalReplaceState.call(this, state, title, url);\n } catch (e) {\n if ((e as Error).name === 'SecurityError' && url) {\n // Remove duplicate /#/ prefix\n const urlString = url.toString();\n let hashUrl = urlString.replace(/^\\/#/, '');\n hashUrl = hashUrl.startsWith('#') ? hashUrl : '#' + hashUrl;\n console.log('[HaexSpace] SecurityError - setting hash to:', hashUrl);\n skipNextReplace = true;\n window.location.hash = hashUrl.replace(/^#/, '');\n return; // Silent fallback\n }\n throw e;\n }\n };\n\n console.log('[HaexSpace] History API patched');\n };\n\n // Install after DOM is ready\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', install, { once: true });\n } else {\n // DOM already loaded, install immediately\n install();\n }\n}\n","/**\n * Central message type definitions for HaexSpace SDK\n *\n * Message Naming Schema: haexspace:{subject}\n *\n * These are used for internal communication between extensions and HaexSpace\n */\n\nexport const HAEXSPACE_MESSAGE_TYPES = {\n /** Debug message for development/troubleshooting */\n DEBUG: 'haexspace:debug',\n\n /** Console forwarding from extension iframe */\n CONSOLE_FORWARD: 'console.forward',\n} as const;\n\nexport type HaexspaceMessageType =\n (typeof HAEXSPACE_MESSAGE_TYPES)[keyof typeof HAEXSPACE_MESSAGE_TYPES];\n","import { HAEXSPACE_MESSAGE_TYPES } from '../messages';\n\n/**\n * Debug diagnostics for Android debugging\n * Tests window.parent availability and postMessage functionality\n */\nexport function installDebugDiagnostics(): void {\n if (typeof window === 'undefined') {\n return;\n }\n\n const hasParent = window.parent && window.parent !== window;\n console.log('[HaexSpace] hasParent:', hasParent);\n\n if (hasParent) {\n console.log('[HaexSpace] Attempting to send debug message to parent...');\n window.parent.postMessage({\n type: HAEXSPACE_MESSAGE_TYPES.DEBUG,\n data: `[Polyfills] window.parent test: exists=${!!window.parent}, different=${hasParent}, selfIsTop=${window.self === window.top}`\n }, '*');\n console.log('[HaexSpace] Debug message sent!');\n } else {\n console.log('[HaexSpace] No parent window or parent === window');\n }\n}\n","/**\n * Console Forwarding Polyfill\n *\n * Forwards all console messages from the extension IFrame to the parent window\n * so they can be displayed in the HaexSpace console tab\n */\n\nimport { HAEXSPACE_MESSAGE_TYPES } from '../messages';\n\nexport interface ConsoleMessage {\n timestamp: string\n level: 'log' | 'info' | 'warn' | 'error' | 'debug'\n message: string\n}\n\n// Store original console methods\nconst originalConsole = {\n log: console.log,\n info: console.info,\n warn: console.warn,\n error: console.error,\n debug: console.debug,\n}\n\nfunction serializeArgs(args: unknown[]): string {\n return args\n .map((arg) => {\n if (arg === null) return 'null'\n if (arg === undefined) return 'undefined'\n if (typeof arg === 'object') {\n try {\n return JSON.stringify(arg, null, 2)\n } catch {\n return String(arg)\n }\n }\n return String(arg)\n })\n .join(' ')\n}\n\nfunction interceptConsole(level: 'log' | 'info' | 'warn' | 'error' | 'debug') {\n console[level] = function (...args: unknown[]) {\n // Call original console method\n originalConsole[level].apply(console, args)\n\n // Forward to parent window if we're in an iframe\n if (window.self !== window.top && window.parent) {\n try {\n const message = serializeArgs(args)\n const timestamp = new Date().toLocaleTimeString()\n\n window.parent.postMessage(\n {\n type: HAEXSPACE_MESSAGE_TYPES.CONSOLE_FORWARD,\n data: {\n timestamp,\n level,\n message,\n },\n timestamp: Date.now(),\n },\n '*'\n )\n } catch (error) {\n // If forwarding fails, just log locally\n originalConsole.error('[HaexSpace] Failed to forward console message:', error)\n }\n }\n }\n}\n\nexport function installConsoleForwarding(debug: boolean = false): void {\n if (typeof window === 'undefined') {\n return\n }\n\n // Only install if we're in an iframe (extension context)\n if (window.self === window.top) {\n return\n }\n\n // Only install if debug mode is enabled\n if (!debug) {\n console.log('[HaexSpace] Console forwarding disabled (not in debug mode)')\n return\n }\n\n interceptConsole('log')\n interceptConsole('info')\n interceptConsole('warn')\n interceptConsole('error')\n interceptConsole('debug')\n\n console.log('[HaexSpace] Console forwarding installed')\n}\n","/**\n * HaexSpace Extension Polyfills\n *\n * Auto-initializing polyfills for localStorage, cookies, and history API\n * that work around restrictions in custom protocol contexts (haex-extension://)\n *\n * These polyfills are automatically installed when you import the SDK:\n *\n * ```typescript\n * import { createHaexVaultSdk } from '@haex-space/vault-sdk';\n * // Polyfills are active!\n * ```\n *\n * You can also install them manually:\n *\n * ```typescript\n * import { installPolyfills } from '@haex-space/vault-sdk/polyfills';\n * installPolyfills();\n * ```\n */\n\nimport { installLocalStoragePolyfill, installSessionStoragePolyfill } from './localStorage';\nimport { installCookiePolyfill } from './cookies';\nimport { installHistoryPolyfill } from './history';\nimport { installDebugDiagnostics } from './debug';\n\nexport { installLocalStoragePolyfill, installSessionStoragePolyfill } from './localStorage';\nexport { installCookiePolyfill } from './cookies';\nexport { installHistoryPolyfill } from './history';\nexport { installBaseTag } from './baseTag'; // Export for backwards compatibility, but not used in auto-install\nexport { installConsoleForwarding } from './consoleForwarding';\nexport { installDebugDiagnostics } from './debug';\n\n/**\n * Install all HaexSpace polyfills\n *\n * This function is called automatically when the SDK is imported.\n * You usually don't need to call this manually.\n */\nexport function installPolyfills(): void {\n if (typeof window === 'undefined') {\n return; // Skip in server-side environments\n }\n\n // Install localStorage and sessionStorage polyfills immediately\n // These need to be available before any app code runs\n installLocalStoragePolyfill();\n installSessionStoragePolyfill();\n\n // Install cookie polyfill immediately\n installCookiePolyfill();\n\n // Install history polyfill (waits for DOM ready internally)\n installHistoryPolyfill();\n\n // Note: Base tag is injected at build-time by Vite plugin, no runtime setup needed\n // Runtime base tag setup is disabled to prevent conflicts\n\n // Note: Console forwarding is installed by HaexVaultSdk when debug mode is enabled\n\n console.log('[HaexSpace] All polyfills loaded successfully');\n\n // Run debug diagnostics\n installDebugDiagnostics();\n}\n\n// Auto-install polyfills when this module is imported\n// This ensures extensions work out of the box without manual setup\nif (typeof window !== 'undefined') {\n installPolyfills();\n}\n","/**\n * Central event name definitions for HaexHub extensions\n *\n * Event Naming Schema: haextension:{subject}:{predicate}\n *\n * IMPORTANT: Tauri event names can only contain:\n * - Alphanumeric characters (a-z, A-Z, 0-9)\n * - Hyphens (-)\n * - Slashes (/)\n * - Colons (:)\n * - Underscores (_)\n *\n * NO dots (.) allowed!\n */\n\nexport const HAEXTENSION_EVENTS = {\n /** Context (theme, locale, platform) has changed */\n CONTEXT_CHANGED: 'haextension:context:changed',\n\n /** Search request from HaexHub */\n SEARCH_REQUEST: 'haextension:search:request',\n} as const;\n\nexport type HaextensionEvent = typeof HAEXTENSION_EVENTS[keyof typeof HAEXTENSION_EVENTS];\n\n/**\n * Events for external client communication (browser extensions, CLI tools, servers, etc.)\n */\nexport const EXTERNAL_EVENTS = {\n /** External request from authorized client */\n REQUEST: 'haextension:external:request',\n\n /** New external client requesting authorization */\n AUTHORIZATION_REQUEST: 'external:authorization-request',\n} as const;\n\nexport type ExternalEvent = typeof EXTERNAL_EVENTS[keyof typeof EXTERNAL_EVENTS];\n","import { HAEXTENSION_EVENTS, EXTERNAL_EVENTS } from './events';\n\n// Constants\nexport const DEFAULT_TIMEOUT = 30000; // 30 seconds in milliseconds\nexport const TABLE_SEPARATOR = \"__\"; // Separator for table name components: {publicKey}__{extensionName}__{tableName}\n\n/**\n * Build a fully qualified table name for extensions.\n * Use this in Drizzle schemas to create table names at build time.\n *\n * @param publicKey - The extension's public key (from manifest.json)\n * @param extensionName - The extension name (from manifest.json or package.json)\n * @param tableName - The table name (e.g., \"users\", \"items\")\n * @returns Fully qualified table name: `{publicKey}__{extensionName}__{tableName}`\n *\n * @example\n * ```typescript\n * import { getTableName } from \"@haex-space/vault-sdk\";\n * import manifest from \"../haextension/manifest.json\";\n * import pkg from \"../package.json\";\n *\n * const tableName = (name: string) =>\n * getTableName(manifest.publicKey, manifest.name || pkg.name, name);\n *\n * export const users = sqliteTable(tableName(\"users\"), { ... });\n * ```\n */\nexport function getTableName(\n publicKey: string,\n extensionName: string,\n tableName: string\n): string {\n return `${publicKey}${TABLE_SEPARATOR}${extensionName}${TABLE_SEPARATOR}${tableName}`;\n}\n\n// Core Protocol Types\nexport interface HaexHubRequest {\n method: string;\n params: Record<string, unknown>;\n timestamp: number;\n}\n\nexport interface HaexHubResponse<T = unknown> {\n id: string;\n result?: T;\n error?: HaexVaultSdkErrorData;\n}\n\nexport interface HaexVaultSdkErrorData {\n code: ErrorCode;\n message: string;\n details?: Record<string, unknown>;\n}\n\n// Extension Info (loaded from manifest.json at build time)\nexport interface ExtensionInfo {\n publicKey: string;\n name: string;\n version: string;\n displayName?: string;\n namespace?: string;\n}\n\n// Application Context (provided by HaexHub)\nexport interface ApplicationContext {\n theme: \"light\" | \"dark\" | \"system\";\n locale: string;\n platform:\n | \"linux\"\n | \"macos\"\n | \"ios\"\n | \"freebsd\"\n | \"dragonfly\"\n | \"netbsd\"\n | \"openbsd\"\n | \"solaris\"\n | \"android\"\n | \"windows\"\n | undefined;\n /** Unique device identifier (UUID) for multi-device sync */\n deviceId: string | undefined;\n}\n\n// Search Types\nexport interface SearchQuery {\n query: string;\n filters?: Record<string, unknown>;\n limit?: number;\n}\n\nexport interface SearchResult {\n id: string;\n title: string;\n description?: string;\n type: string;\n data?: Record<string, unknown>;\n score?: number;\n}\n\n// Permission Types\nexport enum PermissionStatus {\n GRANTED = \"granted\",\n DENIED = \"denied\",\n ASK = \"ask\",\n}\n\nexport interface PermissionResponse {\n status: PermissionStatus;\n permanent: boolean;\n}\n\n// Database Permission (matches Rust DbExtensionPermission)\nexport interface DatabasePermission {\n extensionId: string;\n resource: string;\n operation: \"read\" | \"write\";\n path: string;\n}\n\nexport interface DatabasePermissionRequest {\n resource: string;\n operation: \"read\" | \"write\";\n reason?: string;\n}\n\n// Database Types\nexport interface DatabaseQueryParams {\n query: string;\n params?: unknown[];\n}\n\nexport interface DatabaseQueryResult {\n rows: unknown[]; // Array of arrays (each row is an array of values)\n columns?: string[]; // Column names in order\n rowsAffected: number;\n lastInsertId?: number;\n}\n\nexport interface DatabaseExecuteParams {\n statements: string[];\n}\n\n// Migration Types\nexport interface MigrationResult {\n appliedCount: number;\n alreadyAppliedCount: number;\n appliedMigrations: string[];\n}\n\nexport interface Migration {\n name: string;\n sql: string;\n}\n\nexport interface DatabaseTableInfo {\n name: string;\n columns: DatabaseColumnInfo[];\n}\n\nexport interface DatabaseColumnInfo {\n name: string;\n type: string;\n notNull: boolean;\n defaultValue?: unknown;\n primaryKey: boolean;\n}\n\n// Event Types\nexport interface HaexHubEvent {\n type: string;\n data: unknown;\n timestamp: number;\n}\n\n// Specific Event Types\nexport interface ContextChangedEvent extends HaexHubEvent {\n type: typeof HAEXTENSION_EVENTS.CONTEXT_CHANGED;\n data: {\n context: ApplicationContext;\n };\n}\n\nexport interface SearchRequestEvent extends HaexHubEvent {\n type: typeof HAEXTENSION_EVENTS.SEARCH_REQUEST;\n data: {\n query: SearchQuery;\n requestId: string;\n };\n}\n\n/**\n * External request from an authorized client (browser extension, CLI, server, etc.)\n * These requests come through the WebSocket bridge and are routed to the appropriate extension.\n */\nexport interface ExternalRequestEvent extends HaexHubEvent {\n type: typeof EXTERNAL_EVENTS.REQUEST;\n data: ExternalRequest;\n}\n\n/**\n * External request payload\n */\nexport interface ExternalRequest {\n /** Unique request ID for response correlation */\n requestId: string;\n /** Client's public key (Base64 SPKI format, used as identifier) */\n publicKey: string;\n /** Action/method to perform (extension-specific) */\n action: string;\n /** Request payload (extension-specific) */\n payload: Record<string, unknown>;\n}\n\n/**\n * External request response (sent back to the client)\n */\nexport interface ExternalResponse {\n /** Request ID for correlation */\n requestId: string;\n /** Whether the request was successful */\n success: boolean;\n /** Response data (if successful) */\n data?: unknown;\n /** Error message (if failed) */\n error?: string;\n}\n\n/**\n * Handler function type for external requests\n */\nexport type ExternalRequestHandler = (\n request: ExternalRequest\n) => Promise<ExternalResponse> | ExternalResponse;\n\n/**\n * An authorized external client stored in the database\n */\nexport interface AuthorizedClient {\n /** Row ID */\n id: string;\n /** Unique client identifier (public key fingerprint) */\n clientId: string;\n /** Human-readable client name */\n clientName: string;\n /** Client's public key (base64) */\n publicKey: string;\n /** Extension ID this client can access */\n extensionId: string;\n /** When the client was authorized (ISO 8601) */\n authorizedAt: string | null;\n /** Last time the client connected (ISO 8601) */\n lastSeen: string | null;\n}\n\n/**\n * A blocked external client stored in the database\n */\nexport interface BlockedClient {\n /** Row ID */\n id: string;\n /** Unique client identifier (public key fingerprint) */\n clientId: string;\n /** Human-readable client name */\n clientName: string;\n /** Client's public key (base64) */\n publicKey: string;\n /** When the client was blocked (ISO 8601) */\n blockedAt: string | null;\n}\n\n/**\n * Extension requested by an external client\n */\nexport interface RequestedExtension {\n /** Extension name (e.g., \"haex-pass\") */\n name: string;\n /** Extension's public key (hex string from manifest) */\n extensionPublicKey: string;\n}\n\n/**\n * Pending authorization request waiting for user approval\n */\nexport interface PendingAuthorization {\n /** Unique client identifier */\n clientId: string;\n /** Human-readable client name */\n clientName: string;\n /** Client's public key (base64) */\n publicKey: string;\n /** Extensions the client wants to access (pre-selected in authorization dialog) */\n requestedExtensions: RequestedExtension[];\n}\n\n/**\n * Decision type for external authorization prompts\n */\nexport type ExternalAuthDecision = 'allow' | 'deny';\n\n/**\n * Session-based authorization entry (for \"allow once\" authorizations)\n * These are stored in-memory and cleared when haex-vault restarts.\n */\nexport interface SessionAuthorization {\n /** Unique client identifier (public key fingerprint) */\n clientId: string;\n /** Extension ID this client can access */\n extensionId: string;\n}\n\n// ============================================================================\n// External Bridge Connection Types\n// ============================================================================\n\n/**\n * Connection state for external clients connecting to haex-vault via WebSocket.\n * Used by browser extensions, CLI tools, servers, and other external clients.\n */\nexport enum ExternalConnectionState {\n /** Not connected to haex-vault */\n DISCONNECTED = 'disconnected',\n /** Attempting to establish connection */\n CONNECTING = 'connecting',\n /** WebSocket connected but not yet authorized */\n CONNECTED = 'connected',\n /** Connected and waiting for user approval in haex-vault */\n PENDING_APPROVAL = 'pending_approval',\n /** Connected and authorized to communicate */\n PAIRED = 'paired',\n}\n\n/**\n * Error codes for external client connections.\n * Used to identify specific error conditions for i18n in the frontend.\n */\nexport enum ExternalConnectionErrorCode {\n /** No error */\n NONE = 'none',\n /** Client is not authorized (rejected or not yet approved) */\n CLIENT_NOT_AUTHORIZED = 'client_not_authorized',\n /** Client was blocked by the user */\n CLIENT_BLOCKED = 'client_blocked',\n /** Connection to haex-vault failed (not running or network error) */\n CONNECTION_FAILED = 'connection_failed',\n /** Connection timed out */\n CONNECTION_TIMEOUT = 'connection_timeout',\n /** WebSocket connection was closed unexpectedly */\n CONNECTION_CLOSED = 'connection_closed',\n /** Failed to decrypt message (invalid key or corrupted data) */\n DECRYPTION_FAILED = 'decryption_failed',\n /** Invalid message format received */\n INVALID_MESSAGE = 'invalid_message',\n /** Unknown or unspecified error */\n UNKNOWN = 'unknown',\n}\n\n/**\n * Full connection status including state, client ID, and any error\n */\nexport interface ExternalConnection {\n /** Current connection state */\n state: ExternalConnectionState;\n /** Client identifier (derived from public key) */\n clientId: string | null;\n /** Error code for i18n (use this for translations) */\n errorCode: ExternalConnectionErrorCode;\n /** Error message (original message, for logging/debugging) */\n errorMessage: string | null;\n}\n\n/**\n * Check if external client connection state indicates an active connection\n * (connected, pending approval, or paired)\n */\nexport function isExternalClientConnected(state: ExternalConnectionState): boolean {\n return (\n state === ExternalConnectionState.CONNECTED ||\n state === ExternalConnectionState.PENDING_APPROVAL ||\n state === ExternalConnectionState.PAIRED\n );\n}\n\n/**\n * Check if external client can send requests (only when paired/authorized)\n */\nexport function canExternalClientSendRequests(state: ExternalConnectionState): boolean {\n return state === ExternalConnectionState.PAIRED;\n}\n\nexport type EventCallback = (event: HaexHubEvent) => void;\n\n// Manifest Types\nexport interface ExtensionManifest {\n name: string;\n version: string;\n author?: string | null;\n entry?: string | null;\n icon?: string | null;\n publicKey: string;\n signature: string;\n permissions: {\n database?: any[];\n filesystem?: any[];\n http?: any[];\n shell?: any[];\n };\n homepage?: string | null;\n description?: string | null;\n singleInstance?: boolean | null;\n displayMode?: \"auto\" | \"window\" | \"iframe\" | null;\n /**\n * Path to the migrations directory relative to the extension root.\n * Contains Drizzle-style migrations with meta/_journal.json and *.sql files.\n * These migrations will be applied when the extension is installed.\n * Example: \"database/migrations\"\n */\n migrationsDir?: string | null;\n}\n\n// Config Types\nexport interface HaexHubConfig {\n debug?: boolean;\n timeout?: number;\n /** Extension manifest data (auto-injected by framework integrations) */\n manifest?: ExtensionManifest;\n}\n\n// Web/Fetch Types\nexport interface WebRequestOptions {\n method?: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\" | \"HEAD\" | \"OPTIONS\";\n headers?: Record<string, string>;\n body?: string | ArrayBuffer | Blob;\n timeout?: number;\n}\n\nexport interface WebResponse {\n status: number;\n statusText: string;\n headers: Record<string, string>;\n body: ArrayBuffer;\n url: string;\n}\n\n// Error Codes\nexport enum ErrorCode {\n // Connection Errors\n TIMEOUT = \"TIMEOUT\",\n NOT_IN_IFRAME = \"NOT_IN_IFRAME\",\n UNAUTHORIZED_ORIGIN = \"UNAUTHORIZED_ORIGIN\",\n\n // Permission Errors\n PERMISSION_DENIED = \"PERMISSION_DENIED\",\n\n // Validation Errors\n INVALID_PUBLIC_KEY = \"INVALID_PUBLIC_KEY\",\n INVALID_EXTENSION_NAME = \"INVALID_EXTENSION_NAME\",\n INVALID_TABLE_NAME = \"INVALID_TABLE_NAME\",\n INVALID_PARAMS = \"INVALID_PARAMS\",\n\n // Extension Errors\n EXTENSION_NOT_INITIALIZED = \"EXTENSION_NOT_INITIALIZED\",\n EXTENSION_INFO_UNAVAILABLE = \"EXTENSION_INFO_UNAVAILABLE\",\n\n // API Errors\n METHOD_NOT_FOUND = \"METHOD_NOT_FOUND\",\n INTERNAL_ERROR = \"INTERNAL_ERROR\",\n DATABASE_ERROR = \"DATABASE_ERROR\",\n WEB_ERROR = \"WEB_ERROR\",\n}\n\nexport class HaexVaultSdkError extends Error {\n constructor(\n public code: ErrorCode,\n public messageKey: string,\n public details?: Record<string, unknown>\n ) {\n super(messageKey);\n this.name = \"HaexVaultSdkError\";\n }\n\n /**\n * Get localized error message\n * @param locale - Locale code (e.g., 'en', 'de')\n * @param translations - Translation object\n */\n getLocalizedMessage(\n locale: string = \"en\",\n translations?: Record<string, Record<string, string>>\n ): string {\n if (!translations || !translations[locale]) {\n return this.messageKey;\n }\n\n let message = translations[locale][this.messageKey] || this.messageKey;\n\n // Replace placeholders with details\n if (this.details) {\n Object.entries(this.details).forEach(([key, value]) => {\n message = message.replace(`{${key}}`, String(value));\n });\n }\n\n return message;\n }\n\n toJSON() {\n return {\n code: this.code,\n message: this.messageKey,\n details: this.details,\n };\n }\n}\n","/**\n * Central request method name definitions for HaexHub SDK\n *\n * Request Naming Schema: haextension:{subject}:{action}\n *\n * These are used for client.request() calls between extensions and HaexHub\n */\n\nexport const HAEXTENSION_METHODS = {\n context: {\n get: 'haextension:context:get',\n },\n\n database: {\n query: 'haextension:database:query',\n execute: 'haextension:database:execute',\n transaction: 'haextension:database:transaction',\n registerMigrations: 'haextension:database:register-migrations',\n },\n\n filesystem: {\n saveFile: 'haextension:filesystem:save-file',\n openFile: 'haextension:filesystem:open-file',\n showImage: 'haextension:filesystem:show-image',\n },\n\n filesync: {\n // Spaces\n listSpaces: 'haextension:filesync:list-spaces',\n createSpace: 'haextension:filesync:create-space',\n deleteSpace: 'haextension:filesync:delete-space',\n\n // Files\n listFiles: 'haextension:filesync:list-files',\n getFile: 'haextension:filesync:get-file',\n uploadFile: 'haextension:filesync:upload-file',\n downloadFile: 'haextension:filesync:download-file',\n deleteFile: 'haextension:filesync:delete-file',\n\n // Backends\n listBackends: 'haextension:filesync:list-backends',\n addBackend: 'haextension:filesync:add-backend',\n removeBackend: 'haextension:filesync:remove-backend',\n testBackend: 'haextension:filesync:test-backend',\n\n // Sync Rules\n listSyncRules: 'haextension:filesync:list-sync-rules',\n addSyncRule: 'haextension:filesync:add-sync-rule',\n updateSyncRule: 'haextension:filesync:update-sync-rule',\n removeSyncRule: 'haextension:filesync:remove-sync-rule',\n\n // Sync Operations\n getSyncStatus: 'haextension:filesync:get-sync-status',\n triggerSync: 'haextension:filesync:trigger-sync',\n pauseSync: 'haextension:filesync:pause-sync',\n resumeSync: 'haextension:filesync:resume-sync',\n\n // Conflict Resolution\n resolveConflict: 'haextension:filesync:resolve-conflict',\n\n // UI Helpers\n selectFolder: 'haextension:filesync:select-folder',\n scanLocal: 'haextension:filesync:scan-local',\n\n // Sync Queue (persistent upload/download queue)\n addToQueue: 'haextension:filesync:add-to-queue',\n getQueue: 'haextension:filesync:get-queue',\n getQueueSummary: 'haextension:filesync:get-queue-summary',\n startQueueEntry: 'haextension:filesync:start-queue-entry',\n completeQueueEntry: 'haextension:filesync:complete-queue-entry',\n failQueueEntry: 'haextension:filesync:fail-queue-entry',\n retryFailedQueue: 'haextension:filesync:retry-failed-queue',\n removeQueueEntry: 'haextension:filesync:remove-queue-entry',\n clearQueue: 'haextension:filesync:clear-queue',\n recoverQueue: 'haextension:filesync:recover-queue',\n },\n\n storage: {\n getItem: 'haextension:storage:get-item',\n setItem: 'haextension:storage:set-item',\n removeItem: 'haextension:storage:remove-item',\n clear: 'haextension:storage:clear',\n keys: 'haextension:storage:keys',\n },\n\n web: {\n fetch: 'haextension:web:fetch',\n },\n\n application: {\n open: 'haextension:application:open',\n },\n} as const;\n\n// Helper type to extract all string values from nested object\ntype DeepValues<T> = T extends object\n ? T[keyof T] extends string\n ? T[keyof T]\n : T[keyof T] extends object\n ? DeepValues<T[keyof T]>\n : never\n : never;\n\nexport type HaextensionMethod = DeepValues<typeof HAEXTENSION_METHODS>;\n","import type { HaexVaultSdk } from \"~/client\";\nimport { HAEXTENSION_METHODS } from \"~/methods\";\n\nexport class StorageAPI {\n constructor(private client: HaexVaultSdk) {}\n\n async getItem(key: string): Promise<string | null> {\n return this.client.request<string | null>(HAEXTENSION_METHODS.storage.getItem, { key });\n }\n\n async setItem(key: string, value: string): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.storage.setItem, { key, value });\n }\n\n async removeItem(key: string): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.storage.removeItem, { key });\n }\n\n async clear(): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.storage.clear);\n }\n\n async keys(): Promise<string[]> {\n return this.client.request<string[]>(HAEXTENSION_METHODS.storage.keys);\n }\n}\n","import type { HaexVaultSdk } from \"../client\";\nimport type { DatabaseQueryResult, MigrationResult, Migration } from \"../types\";\nimport { HAEXTENSION_METHODS } from \"../methods\";\n\nexport class DatabaseAPI {\n constructor(private client: HaexVaultSdk) {}\n\n async query<T>(query: string, params?: unknown[]): Promise<T[]> {\n const result = await this.client.request<DatabaseQueryResult>(\n HAEXTENSION_METHODS.database.query,\n {\n query,\n params: params || [],\n }\n );\n\n return result.rows as T[];\n }\n\n async queryOne<T = unknown>(\n query: string,\n params?: unknown[]\n ): Promise<T | null> {\n const rows = await this.query<T>(query, params);\n return rows.length > 0 ? rows[0] ?? null : null;\n }\n\n async execute(\n query: string,\n params?: unknown[]\n ): Promise<DatabaseQueryResult> {\n return this.client.request<DatabaseQueryResult>(HAEXTENSION_METHODS.database.execute, {\n query,\n params: params || [],\n });\n }\n\n async transaction(statements: string[]): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.database.transaction, {\n statements,\n });\n }\n\n async createTable(tableName: string, columns: string): Promise<void> {\n const query = `CREATE TABLE IF NOT EXISTS ${tableName} (${columns})`;\n await this.execute(query);\n }\n\n async dropTable(tableName: string): Promise<void> {\n const query = `DROP TABLE IF EXISTS ${tableName}`;\n await this.execute(query);\n }\n\n /**\n * Registers and applies extension migrations with HaexVault\n *\n * HaexVault will:\n * 1. Validate all SQL statements (ensure only extension's own tables are accessed)\n * 2. Store migrations with applied_at = NULL\n * 3. Query pending migrations sorted by name\n * 4. Apply pending migrations and set up CRDT triggers\n * 5. Mark successful migrations with applied_at timestamp\n *\n * @param extensionVersion - The version of the extension\n * @param migrations - Array of migration objects with name and SQL content\n * @returns Promise with migration result (applied count, already applied count, applied migration names)\n */\n async registerMigrationsAsync(\n extensionVersion: string,\n migrations: Migration[]\n ): Promise<MigrationResult> {\n return this.client.request<MigrationResult>(\n HAEXTENSION_METHODS.database.registerMigrations,\n {\n extensionVersion,\n migrations,\n }\n );\n }\n\n async insert(\n tableName: string,\n data: Record<string, unknown>\n ): Promise<number> {\n const keys = Object.keys(data);\n const values = Object.values(data);\n const placeholders = keys.map(() => \"?\").join(\", \");\n\n const query = `INSERT INTO ${tableName} (${keys.join(\n \", \"\n )}) VALUES (${placeholders})`;\n const result = await this.execute(query, values);\n\n return result.lastInsertId ?? -1;\n }\n\n async update(\n tableName: string,\n data: Record<string, unknown>,\n where: string,\n whereParams?: unknown[]\n ): Promise<number> {\n const keys = Object.keys(data);\n const values = Object.values(data);\n const setClause = keys.map((key) => `${key} = ?`).join(\", \");\n\n const query = `UPDATE ${tableName} SET ${setClause} WHERE ${where}`;\n const result = await this.execute(query, [\n ...values,\n ...(whereParams || []),\n ]);\n\n return result.rowsAffected;\n }\n\n async delete(\n tableName: string,\n where: string,\n whereParams?: unknown[]\n ): Promise<number> {\n const query = `DELETE FROM ${tableName} WHERE ${where}`;\n const result = await this.execute(query, whereParams);\n return result.rowsAffected;\n }\n\n async count(\n tableName: string,\n where?: string,\n whereParams?: unknown[]\n ): Promise<number> {\n const query = where\n ? `SELECT COUNT(*) as count FROM ${tableName} WHERE ${where}`\n : `SELECT COUNT(*) as count FROM ${tableName}`;\n\n const result = await this.queryOne<{ count: number }>(query, whereParams);\n return result?.count ?? 0;\n }\n\n}\n","import type { HaexVaultSdk } from \"~/client\";\nimport { HAEXTENSION_METHODS } from \"~/methods\";\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** File sync state constants */\nexport const FILE_SYNC_STATE = {\n SYNCED: \"synced\",\n SYNCING: \"syncing\",\n LOCAL_ONLY: \"localOnly\",\n REMOTE_ONLY: \"remoteOnly\",\n CONFLICT: \"conflict\",\n ERROR: \"error\",\n} as const;\n\n/** Sync direction constants */\nexport const SYNC_DIRECTION = {\n UP: \"up\",\n DOWN: \"down\",\n BOTH: \"both\",\n} as const;\n\n/** Storage backend type constants */\nexport const STORAGE_BACKEND_TYPE = {\n S3: \"s3\",\n R2: \"r2\",\n MINIO: \"minio\",\n GDRIVE: \"gdrive\",\n DROPBOX: \"dropbox\",\n} as const;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface FileSpace {\n id: string;\n name: string;\n isPersonal: boolean;\n fileCount: number;\n totalSize: number;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface FileInfo {\n id: string;\n spaceId: string;\n name: string;\n path: string;\n mimeType: string | null;\n size: number;\n contentHash: string;\n isDirectory: boolean;\n syncState: FileSyncState;\n backends: string[];\n createdAt: string;\n updatedAt: string;\n}\n\n/** Local file info (unencrypted, scanned from local filesystem) */\nexport interface LocalFileInfo {\n /** Unique ID (hash of rule_id + relative path) */\n id: string;\n /** File name */\n name: string;\n /** Full local path */\n path: string;\n /** Relative path from sync root */\n relativePath: string;\n /** MIME type (null for directories) */\n mimeType: string | null;\n /** File size in bytes */\n size: number;\n /** Whether this is a directory */\n isDirectory: boolean;\n /** Last modified timestamp (ISO 8601) */\n modifiedAt: string | null;\n}\n\nexport type FileSyncState =\n | \"synced\"\n | \"syncing\"\n | \"localOnly\"\n | \"remoteOnly\"\n | \"conflict\"\n | \"error\";\n\nexport interface StorageBackendInfo {\n id: string;\n type: StorageBackendType;\n name: string;\n enabled: boolean;\n createdAt: string;\n}\n\nexport type StorageBackendType = \"s3\" | \"r2\" | \"minio\" | \"gdrive\" | \"dropbox\";\n\nexport interface S3BackendConfig {\n type: \"s3\" | \"r2\" | \"minio\";\n endpoint?: string;\n region: string;\n bucket: string;\n accessKeyId: string;\n secretAccessKey: string;\n}\n\n/** Backend configuration for S3-compatible storage */\nexport type BackendConfig = S3BackendConfig;\n\nexport interface SyncRule {\n id: string;\n /** Device ID this sync rule belongs to (local paths are device-specific) */\n deviceId: string;\n spaceId: string;\n localPath: string;\n backendIds: string[];\n direction: SyncDirection;\n enabled: boolean;\n /** Gitignore-like patterns for files/folders to exclude from sync */\n ignorePatterns: string[];\n /** Default conflict resolution strategy for this sync rule */\n conflictStrategy: ConflictStrategy;\n createdAt: string;\n updatedAt: string;\n}\n\nexport type SyncDirection = \"up\" | \"down\" | \"both\";\n\n/** Conflict resolution strategy for sync rules */\nexport type ConflictStrategy = \"local\" | \"remote\" | \"newer\" | \"ask\" | \"keepBoth\";\n\n/** Conflict strategy constants */\nexport const CONFLICT_STRATEGY: Record<string, ConflictStrategy> = {\n /** Always prefer local version */\n LOCAL: \"local\",\n /** Always prefer remote version */\n REMOTE: \"remote\",\n /** Prefer newer version (Last-Writer-Wins) */\n NEWER: \"newer\",\n /** Ask user to resolve each conflict manually */\n ASK: \"ask\",\n /** Keep both versions (create conflict copy) */\n KEEP_BOTH: \"keepBoth\",\n};\n\nexport interface SyncStatus {\n isSyncing: boolean;\n pendingUploads: number;\n pendingDownloads: number;\n lastSync: string | null;\n errors: SyncError[];\n}\n\nexport interface SyncError {\n fileId: string;\n fileName: string;\n error: string;\n timestamp: string;\n}\n\nexport interface SyncProgress {\n fileId: string;\n fileName: string;\n bytesTransferred: number;\n totalBytes: number;\n direction: \"upload\" | \"download\";\n}\n\nexport interface CreateSpaceOptions {\n name: string;\n}\n\nexport interface AddBackendOptions {\n name: string;\n config: BackendConfig;\n}\n\nexport interface AddSyncRuleOptions {\n spaceId: string;\n localPath: string;\n backendIds: string[];\n direction?: SyncDirection;\n /** Gitignore-like patterns for files/folders to exclude from sync */\n ignorePatterns?: string[];\n /** Default conflict resolution strategy (defaults to 'ask') */\n conflictStrategy?: ConflictStrategy;\n}\n\nexport interface UpdateSyncRuleOptions {\n ruleId: string;\n backendIds?: string[];\n direction?: SyncDirection;\n enabled?: boolean;\n /** Gitignore-like patterns for files/folders to exclude from sync */\n ignorePatterns?: string[];\n /** Default conflict resolution strategy */\n conflictStrategy?: ConflictStrategy;\n}\n\nexport interface ListFilesOptions {\n spaceId: string;\n path?: string;\n recursive?: boolean;\n}\n\nexport interface ScanLocalOptions {\n /** Sync rule ID to scan */\n ruleId: string;\n /** Optional subpath within the sync root to scan */\n subpath?: string;\n}\n\nexport interface UploadFileOptions {\n spaceId: string;\n localPath: string;\n remotePath?: string;\n backendIds?: string[];\n}\n\nexport interface DownloadFileOptions {\n fileId: string;\n localPath: string;\n}\n\n// ============================================================================\n// Queue Types\n// ============================================================================\n\n/** Queue operation type */\nexport type QueueOperation = 'upload' | 'download';\n\n/** Queue entry status */\nexport type QueueStatus = 'pending' | 'inProgress' | 'completed' | 'failed';\n\n/** Queue operation constants */\nexport const QUEUE_OPERATION = {\n UPLOAD: 'upload' as const,\n DOWNLOAD: 'download' as const,\n};\n\n/** Queue status constants */\nexport const QUEUE_STATUS = {\n PENDING: 'pending' as const,\n IN_PROGRESS: 'inProgress' as const,\n COMPLETED: 'completed' as const,\n FAILED: 'failed' as const,\n};\n\n/** A sync queue entry representing a pending or in-progress file operation */\nexport interface SyncQueueEntry {\n id: string;\n /** Device ID this entry belongs to */\n deviceId: string;\n /** Sync rule ID */\n ruleId: string;\n /** Full local path */\n localPath: string;\n /** Relative path from sync root (used as remote path) */\n relativePath: string;\n /** Operation type (upload/download) */\n operation: QueueOperation;\n /** Current status */\n status: QueueStatus;\n /** Priority (lower = higher priority) */\n priority: number;\n /** File size in bytes */\n fileSize: number;\n /** Error message if failed */\n errorMessage: string | null;\n /** Number of retry attempts */\n retryCount: number;\n /** When the entry was created */\n createdAt: string;\n /** When processing started */\n startedAt: string | null;\n /** When processing completed */\n completedAt: string | null;\n}\n\n/** Request to add files to the sync queue */\nexport interface AddToQueueOptions {\n /** Sync rule ID */\n ruleId: string;\n /** Files to add */\n files: QueueFileEntry[];\n /** Operation type */\n operation: QueueOperation;\n /** Priority (optional, default 100) */\n priority?: number;\n}\n\n/** A file entry for adding to the queue */\nexport interface QueueFileEntry {\n /** Full local path */\n localPath: string;\n /** Relative path from sync root */\n relativePath: string;\n /** File size in bytes */\n fileSize: number;\n}\n\n/** Request to get queue entries */\nexport interface GetQueueOptions {\n /** Filter by rule ID (optional) */\n ruleId?: string;\n /** Filter by status (optional) */\n status?: QueueStatus;\n /** Include completed entries (default: false) */\n includeCompleted?: boolean;\n}\n\n/** Aggregated queue status */\nexport interface QueueSummary {\n /** Number of pending items */\n pendingCount: number;\n /** Number of in-progress items */\n inProgressCount: number;\n /** Number of completed items */\n completedCount: number;\n /** Number of failed items */\n failedCount: number;\n /** Total bytes pending (sum of file_size for pending items) */\n pendingBytes: number;\n /** Currently processing entry (if any) */\n currentEntry: SyncQueueEntry | null;\n}\n\n// ============================================================================\n// FileSyncAPI\n// ============================================================================\n\n/**\n * File Sync API for E2E encrypted file synchronization\n *\n * Access via: client.filesystem.sync.*\n */\nexport class FileSyncAPI {\n constructor(private client: HaexVaultSdk) {}\n\n // --------------------------------------------------------------------------\n // Spaces\n // --------------------------------------------------------------------------\n\n /**\n * List all file spaces\n */\n async listSpacesAsync(): Promise<FileSpace[]> {\n return this.client.request<FileSpace[]>(\n HAEXTENSION_METHODS.filesync.listSpaces\n );\n }\n\n /**\n * Create a new file space\n */\n async createSpaceAsync(options: CreateSpaceOptions): Promise<FileSpace> {\n return this.client.request<FileSpace, CreateSpaceOptions>(\n HAEXTENSION_METHODS.filesync.createSpace,\n options\n );\n }\n\n /**\n * Delete a file space\n */\n async deleteSpaceAsync(spaceId: string): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.filesync.deleteSpace, {\n spaceId,\n });\n }\n\n // --------------------------------------------------------------------------\n // Files\n // --------------------------------------------------------------------------\n\n /**\n * List files in a space\n */\n async listFilesAsync(options: ListFilesOptions): Promise<FileInfo[]> {\n return this.client.request<FileInfo[], ListFilesOptions>(\n HAEXTENSION_METHODS.filesync.listFiles,\n options\n );\n }\n\n /**\n * Scan local files in a sync rule folder\n * Returns unencrypted local files for display in the UI\n */\n async scanLocalAsync(options: ScanLocalOptions): Promise<LocalFileInfo[]> {\n return this.client.request<LocalFileInfo[], ScanLocalOptions>(\n HAEXTENSION_METHODS.filesync.scanLocal,\n options\n );\n }\n\n /**\n * Get file info by ID\n */\n async getFileAsync(fileId: string): Promise<FileInfo | null> {\n return this.client.request<FileInfo | null>(\n HAEXTENSION_METHODS.filesync.getFile,\n { fileId }\n );\n }\n\n /**\n * Upload a file to the sync system\n */\n async uploadFileAsync(options: UploadFileOptions): Promise<FileInfo> {\n return this.client.request<FileInfo, UploadFileOptions>(\n HAEXTENSION_METHODS.filesync.uploadFile,\n options\n );\n }\n\n /**\n * Download a file to local storage\n */\n async downloadFileAsync(options: DownloadFileOptions): Promise<void> {\n await this.client.request<void, DownloadFileOptions>(\n HAEXTENSION_METHODS.filesync.downloadFile,\n options\n );\n }\n\n /**\n * Delete a file from the sync system\n */\n async deleteFileAsync(fileId: string): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.filesync.deleteFile, {\n fileId,\n });\n }\n\n // --------------------------------------------------------------------------\n // Storage Backends\n // --------------------------------------------------------------------------\n\n /**\n * List configured storage backends\n */\n async listBackendsAsync(): Promise<StorageBackendInfo[]> {\n return this.client.request<StorageBackendInfo[]>(\n HAEXTENSION_METHODS.filesync.listBackends\n );\n }\n\n /**\n * Add a new storage backend\n */\n async addBackendAsync(options: AddBackendOptions): Promise<StorageBackendInfo> {\n return this.client.request<StorageBackendInfo, AddBackendOptions>(\n HAEXTENSION_METHODS.filesync.addBackend,\n options\n );\n }\n\n /**\n * Remove a storage backend\n */\n async removeBackendAsync(backendId: string): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.filesync.removeBackend, {\n backendId,\n });\n }\n\n /**\n * Test backend connection\n */\n async testBackendAsync(backendId: string): Promise<boolean> {\n return this.client.request<boolean>(\n HAEXTENSION_METHODS.filesync.testBackend,\n { backendId }\n );\n }\n\n // --------------------------------------------------------------------------\n // Sync Rules\n // --------------------------------------------------------------------------\n\n /**\n * List sync rules\n */\n async listSyncRulesAsync(): Promise<SyncRule[]> {\n return this.client.request<SyncRule[]>(\n HAEXTENSION_METHODS.filesync.listSyncRules\n );\n }\n\n /**\n * Add a sync rule\n */\n async addSyncRuleAsync(options: AddSyncRuleOptions): Promise<SyncRule> {\n return this.client.request<SyncRule, AddSyncRuleOptions>(\n HAEXTENSION_METHODS.filesync.addSyncRule,\n options\n );\n }\n\n /**\n * Update a sync rule\n */\n async updateSyncRuleAsync(options: UpdateSyncRuleOptions): Promise<SyncRule> {\n return this.client.request<SyncRule, UpdateSyncRuleOptions>(\n HAEXTENSION_METHODS.filesync.updateSyncRule,\n options\n );\n }\n\n /**\n * Remove a sync rule\n */\n async removeSyncRuleAsync(ruleId: string): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.filesync.removeSyncRule, {\n ruleId,\n });\n }\n\n // --------------------------------------------------------------------------\n // Sync Operations\n // --------------------------------------------------------------------------\n\n /**\n * Get current sync status\n */\n async getSyncStatusAsync(): Promise<SyncStatus> {\n return this.client.request<SyncStatus>(\n HAEXTENSION_METHODS.filesync.getSyncStatus\n );\n }\n\n /**\n * Trigger a manual sync\n */\n async triggerSyncAsync(): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.filesync.triggerSync);\n }\n\n /**\n * Pause syncing\n */\n async pauseSyncAsync(): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.filesync.pauseSync);\n }\n\n /**\n * Resume syncing\n */\n async resumeSyncAsync(): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.filesync.resumeSync);\n }\n\n // --------------------------------------------------------------------------\n // Conflict Resolution\n // --------------------------------------------------------------------------\n\n /**\n * Resolve a file conflict\n */\n async resolveConflictAsync(\n fileId: string,\n resolution: \"local\" | \"remote\" | \"keepBoth\"\n ): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.filesync.resolveConflict, {\n fileId,\n resolution,\n });\n }\n\n // --------------------------------------------------------------------------\n // Folder Selection (Native Dialog)\n // --------------------------------------------------------------------------\n\n /**\n * Open a folder selection dialog\n */\n async selectFolderAsync(): Promise<string | null> {\n return this.client.request<string | null>(\n HAEXTENSION_METHODS.filesync.selectFolder\n );\n }\n\n // --------------------------------------------------------------------------\n // Sync Queue\n // --------------------------------------------------------------------------\n\n /**\n * Add files to the sync queue\n */\n async addToQueueAsync(options: AddToQueueOptions): Promise<SyncQueueEntry[]> {\n return this.client.request<SyncQueueEntry[], AddToQueueOptions>(\n HAEXTENSION_METHODS.filesync.addToQueue,\n options\n );\n }\n\n /**\n * Get queue entries for the current device\n */\n async getQueueAsync(options?: GetQueueOptions): Promise<SyncQueueEntry[]> {\n return this.client.request<SyncQueueEntry[], GetQueueOptions | undefined>(\n HAEXTENSION_METHODS.filesync.getQueue,\n options\n );\n }\n\n /**\n * Get aggregated queue summary for the current device\n */\n async getQueueSummaryAsync(): Promise<QueueSummary> {\n return this.client.request<QueueSummary>(\n HAEXTENSION_METHODS.filesync.getQueueSummary\n );\n }\n\n /**\n * Mark a queue entry as started (in_progress)\n */\n async startQueueEntryAsync(entryId: string): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.filesync.startQueueEntry, {\n entryId,\n });\n }\n\n /**\n * Mark a queue entry as completed\n */\n async completeQueueEntryAsync(entryId: string): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.filesync.completeQueueEntry, {\n entryId,\n });\n }\n\n /**\n * Mark a queue entry as failed\n */\n async failQueueEntryAsync(entryId: string, errorMessage: string): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.filesync.failQueueEntry, {\n entryId,\n errorMessage,\n });\n }\n\n /**\n * Retry all failed queue entries (reset to pending)\n */\n async retryFailedQueueAsync(): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.filesync.retryFailedQueue);\n }\n\n /**\n * Remove a queue entry\n */\n async removeQueueEntryAsync(entryId: string): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.filesync.removeQueueEntry, {\n entryId,\n });\n }\n\n /**\n * Clear all queue entries for a sync rule\n */\n async clearQueueAsync(ruleId: string): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.filesync.clearQueue, {\n ruleId,\n });\n }\n\n /**\n * Reset in_progress entries to pending (for recovery after crash)\n */\n async recoverQueueAsync(): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.filesync.recoverQueue);\n }\n}\n","import type { HaexVaultSdk } from \"../client\";\nimport { HAEXTENSION_METHODS } from \"../methods\";\nimport { FileSyncAPI } from \"./filesync\";\n\nexport interface SaveFileOptions {\n /**\n * The default filename to suggest\n */\n defaultPath?: string;\n\n /**\n * The title of the save dialog\n */\n title?: string;\n\n /**\n * File filters for the dialog\n */\n filters?: Array<{\n name: string;\n extensions: string[];\n }>;\n}\n\nexport interface SaveFileResult {\n /**\n * The path where the file was saved\n */\n path: string;\n\n /**\n * Whether the operation was successful\n */\n success: boolean;\n}\n\nexport interface OpenFileOptions {\n /**\n * The filename for the temporary file\n */\n fileName: string;\n\n /**\n * Optional MIME type for the file\n */\n mimeType?: string;\n}\n\nexport interface OpenFileResult {\n /**\n * Whether the operation was successful\n */\n success: boolean;\n}\n\nexport interface ShowImageOptions {\n /**\n * The data URL of the image (base64 encoded)\n */\n dataUrl: string;\n}\n\nexport interface ShowImageResult {\n /**\n * Whether the operation was successful\n */\n success: boolean;\n}\n\nexport class FilesystemAPI {\n public readonly sync: FileSyncAPI;\n\n constructor(private client: HaexVaultSdk) {\n this.sync = new FileSyncAPI(client);\n }\n\n /**\n * Opens a save file dialog and saves the provided data to the selected location\n * @param data The file data as Uint8Array\n * @param options Options for the save dialog\n * @returns The path where the file was saved, or null if cancelled\n */\n async saveFileAsync(\n data: Uint8Array,\n options: SaveFileOptions = {}\n ): Promise<SaveFileResult | null> {\n const result = await this.client.request<SaveFileResult | null>(\n HAEXTENSION_METHODS.filesystem.saveFile,\n {\n data: Array.from(data), // Convert Uint8Array to regular array for postMessage\n defaultPath: options.defaultPath,\n title: options.title,\n filters: options.filters,\n }\n );\n\n return result;\n }\n\n /**\n * Opens a file with the system's default viewer\n * @param data The file data as Uint8Array\n * @param options Options for opening the file\n * @returns The result of the operation\n */\n async openFileAsync(\n data: Uint8Array,\n options: OpenFileOptions\n ): Promise<OpenFileResult> {\n const result = await this.client.request<OpenFileResult>(\n HAEXTENSION_METHODS.filesystem.openFile,\n {\n data: Array.from(data), // Convert Uint8Array to regular array for postMessage\n fileName: options.fileName,\n mimeType: options.mimeType,\n }\n );\n\n return result;\n }\n\n /**\n * Shows an image using a data URL (safe, read-only viewing)\n * This is safe to use without special permissions as it only displays images\n * and doesn't execute any code or open files with external applications\n * @param options Options containing the data URL\n * @returns The result of the operation\n */\n async showImageAsync(\n options: ShowImageOptions\n ): Promise<ShowImageResult> {\n const result = await this.client.request<ShowImageResult>(\n HAEXTENSION_METHODS.filesystem.showImage,\n {\n dataUrl: options.dataUrl,\n }\n );\n\n return result;\n }\n}\n","import type { HaexVaultSdk } from \"../client\";\nimport type { WebRequestOptions, WebResponse } from \"../types\";\nimport { HAEXTENSION_METHODS } from \"../methods\";\n\nexport class WebAPI {\n constructor(private client: HaexVaultSdk) {}\n\n /**\n * Performs a web request through the HaexHub host application\n * @param url The URL to fetch\n * @param options Request options (method, headers, body, timeout)\n * @returns Promise resolving to the web response\n */\n async fetchAsync(url: string, options: WebRequestOptions = {}): Promise<WebResponse> {\n // Convert body to base64 if it's an ArrayBuffer or Blob\n let bodyParam: string | undefined;\n\n if (options.body) {\n if (options.body instanceof ArrayBuffer) {\n bodyParam = this.arrayBufferToBase64(options.body);\n } else if (options.body instanceof Blob) {\n bodyParam = await this.blobToBase64(options.body);\n } else {\n bodyParam = options.body;\n }\n }\n\n const response = await this.client.request<{\n status: number;\n statusText: string;\n headers: Record<string, string>;\n body: string; // Base64 encoded\n url: string;\n }>(HAEXTENSION_METHODS.web.fetch, {\n url,\n method: options.method || \"GET\",\n headers: options.headers,\n body: bodyParam,\n timeout: options.timeout,\n });\n\n // Convert base64 body back to ArrayBuffer\n const bodyBuffer = this.base64ToArrayBuffer(response.body);\n\n return {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n body: bodyBuffer,\n url: response.url,\n };\n }\n\n /**\n * Convenience method for JSON requests\n */\n async fetchJsonAsync<T = unknown>(\n url: string,\n options: WebRequestOptions = {}\n ): Promise<T> {\n const response = await this.fetchAsync(url, options);\n const text = new TextDecoder().decode(response.body);\n return JSON.parse(text) as T;\n }\n\n /**\n * Convenience method for text requests\n */\n async fetchTextAsync(url: string, options: WebRequestOptions = {}): Promise<string> {\n const response = await this.fetchAsync(url, options);\n return new TextDecoder().decode(response.body);\n }\n\n /**\n * Convenience method for blob requests\n */\n async fetchBlobAsync(url: string, options: WebRequestOptions = {}): Promise<Blob> {\n const response = await this.fetchAsync(url, options);\n return new Blob([response.body]);\n }\n\n /**\n * Opens a URL in the user's default browser\n * @param url The URL to open\n */\n async openAsync(url: string): Promise<void> {\n await this.client.request<void>(HAEXTENSION_METHODS.application.open, {\n application: \"browser\",\n url,\n });\n }\n\n private arrayBufferToBase64(buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer);\n let binary = '';\n for (let i = 0; i < bytes.byteLength; i++) {\n const byte = bytes[i];\n if (byte === undefined) {\n throw new Error('Invalid byte at index ' + i);\n }\n binary += String.fromCharCode(byte);\n }\n return btoa(binary);\n }\n\n private async blobToBase64(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => {\n const result = reader.result;\n if (typeof result !== 'string') {\n reject(new Error('Failed to read blob as data URL'));\n return;\n }\n const parts = result.split(',');\n const base64 = parts[1];\n if (!base64) {\n reject(new Error('Failed to extract base64 from data URL'));\n return;\n }\n resolve(base64);\n };\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n });\n }\n\n private base64ToArrayBuffer(base64: string): ArrayBuffer {\n const binaryString = atob(base64);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes.buffer;\n }\n}\n","import type { HaexVaultSdk } from \"../client\";\nimport type { PermissionResponse } from \"../types\";\n\nexport class PermissionsAPI {\n constructor(private client: HaexVaultSdk) {}\n\n /**\n * Checks if the extension has permission for a database operation\n * @param resource The database resource (table name or \"*\" for all tables)\n * @param operation The operation type (\"read\" or \"write\")\n * @returns Promise<boolean> indicating if permission is granted\n */\n async checkDatabaseAsync(\n resource: string,\n operation: \"read\" | \"write\"\n ): Promise<boolean> {\n const response = await this.client.request<PermissionResponse>(\n \"permissions.database.check\",\n {\n resource,\n operation,\n }\n );\n return response.status === \"granted\";\n }\n\n /**\n * Checks if the extension has permission for a web request\n * @param url The URL to check (e.g., \"https://example.com/path\")\n * @returns Promise<boolean> indicating if permission is granted\n * @note Method/operation is not checked - permissions apply to all HTTP methods\n */\n async checkWebAsync(url: string): Promise<boolean> {\n const response = await this.client.request<PermissionResponse>(\n \"permissions.web.check\",\n {\n url,\n }\n );\n return response.status === \"granted\";\n }\n\n /**\n * Checks if the extension has permission for a filesystem operation\n * @param path The file or directory path\n * @param operation The operation type (\"read\" or \"write\")\n * @returns Promise<boolean> indicating if permission is granted\n */\n async checkFilesystemAsync(\n path: string,\n operation: \"read\" | \"write\"\n ): Promise<boolean> {\n const response = await this.client.request<PermissionResponse>(\n \"permissions.filesystem.check\",\n {\n path,\n operation,\n }\n );\n return response.status === \"granted\";\n }\n}\n","/**\n * Table Name Utilities\n *\n * Functions for creating, parsing, and validating table names.\n * Table names follow the format: publicKey__extensionName__tableName\n */\n\nimport {\n ErrorCode,\n TABLE_SEPARATOR,\n HaexVaultSdkError,\n getTableName as buildTableName,\n} from \"../types\";\nimport type { ExtensionInfo } from \"../types\";\n\n/**\n * Table name parse result\n */\nexport interface ParsedTableName {\n publicKey: string;\n extensionName: string;\n tableName: string;\n}\n\n/**\n * Validate a public key\n */\nexport function validatePublicKey(publicKey: string): void {\n if (\n !publicKey ||\n typeof publicKey !== \"string\" ||\n publicKey.trim() === \"\"\n ) {\n throw new HaexVaultSdkError(\n ErrorCode.INVALID_PUBLIC_KEY,\n \"errors.invalid_public_key\",\n { publicKey }\n );\n }\n}\n\n/**\n * Validate an extension name\n */\nexport function validateExtensionName(extensionName: string): void {\n if (!extensionName || !/^[a-z][a-z0-9-]*$/i.test(extensionName)) {\n throw new HaexVaultSdkError(\n ErrorCode.INVALID_EXTENSION_NAME,\n \"errors.invalid_extension_name\",\n { extensionName }\n );\n }\n\n if (extensionName.includes(TABLE_SEPARATOR)) {\n throw new HaexVaultSdkError(\n ErrorCode.INVALID_EXTENSION_NAME,\n \"errors.extension_name_contains_separator\",\n { extensionName, separator: TABLE_SEPARATOR }\n );\n }\n}\n\n/**\n * Validate a table name\n */\nexport function validateTableName(tableName: string): void {\n if (!tableName || typeof tableName !== \"string\") {\n throw new HaexVaultSdkError(\n ErrorCode.INVALID_TABLE_NAME,\n \"errors.table_name_empty\"\n );\n }\n\n if (tableName.includes(TABLE_SEPARATOR)) {\n throw new HaexVaultSdkError(\n ErrorCode.INVALID_TABLE_NAME,\n \"errors.table_name_contains_separator\",\n { tableName, separator: TABLE_SEPARATOR }\n );\n }\n\n if (!/^[a-z][a-z0-9-_]*$/i.test(tableName)) {\n throw new HaexVaultSdkError(\n ErrorCode.INVALID_TABLE_NAME,\n \"errors.table_name_format\",\n { tableName }\n );\n }\n}\n\n/**\n * Get a prefixed table name for the current extension\n * @param extensionInfo The current extension info\n * @param tableName The base table name\n * @returns The fully qualified table name wrapped in quotes\n */\nexport function getExtensionTableName(\n extensionInfo: ExtensionInfo | null,\n tableName: string\n): string {\n if (!extensionInfo) {\n throw new HaexVaultSdkError(\n ErrorCode.EXTENSION_INFO_UNAVAILABLE,\n \"errors.extension_info_unavailable\"\n );\n }\n\n validateTableName(tableName);\n\n const { publicKey, name } = extensionInfo;\n\n // Return table name wrapped in double quotes to handle special characters\n return `\"${buildTableName(publicKey, name, tableName)}\"`;\n}\n\n/**\n * Get a prefixed table name for a dependency extension\n * @param publicKey The dependency's public key\n * @param extensionName The dependency's extension name\n * @param tableName The base table name\n * @returns The fully qualified table name wrapped in quotes\n */\nexport function getDependencyTableName(\n publicKey: string,\n extensionName: string,\n tableName: string\n): string {\n validatePublicKey(publicKey);\n validateExtensionName(extensionName);\n validateTableName(tableName);\n\n // Return table name wrapped in double quotes to handle special characters\n return `\"${buildTableName(publicKey, extensionName, tableName)}\"`;\n}\n\n/**\n * Parse a full table name into its components\n * @param fullTableName The fully qualified table name (optionally quoted)\n * @returns The parsed components or null if invalid\n */\nexport function parseTableName(fullTableName: string): ParsedTableName | null {\n // Remove surrounding quotes if present\n let cleanTableName = fullTableName;\n if (cleanTableName.startsWith('\"') && cleanTableName.endsWith('\"')) {\n cleanTableName = cleanTableName.slice(1, -1);\n }\n\n const parts = cleanTableName.split(TABLE_SEPARATOR);\n\n if (parts.length !== 3) {\n return null;\n }\n\n const [publicKey, extensionName, tableName] = parts;\n\n if (!publicKey || !extensionName || !tableName) {\n return null;\n }\n\n return {\n publicKey,\n extensionName,\n tableName,\n };\n}\n","/**\n * Client Initialization\n *\n * Functions for initializing the client in different modes:\n * - Native WebView mode (Tauri)\n * - IFrame mode (mobile/web)\n */\n\nimport { HAEXTENSION_EVENTS, EXTERNAL_EVENTS } from \"../events\";\nimport { HAEXTENSION_METHODS } from \"../methods\";\nimport { HAEXSPACE_MESSAGE_TYPES } from \"../messages\";\nimport { ErrorCode, HaexVaultSdkError } from \"../types\";\nimport type { ExtensionInfo, ApplicationContext, HaexHubEvent } from \"../types\";\nimport type { ClientContext, ClientConfig, LogFn } from \"./context\";\n\n/**\n * Tauri API types\n */\ninterface TauriInvoke {\n invoke: <T>(cmd: string, args?: Record<string, unknown>) => Promise<T>;\n}\n\ninterface TauriEvent {\n listen: (event: string, handler: (event: { payload: unknown }) => void) => Promise<() => void>;\n}\n\n/**\n * Check if we're running in an iframe\n */\nexport function isInIframe(): boolean {\n return window.self !== window.top;\n}\n\n/**\n * Check if Tauri is available\n */\nexport function hasTauri(): boolean {\n return typeof (window as unknown as { __TAURI__?: unknown }).__TAURI__ !== \"undefined\";\n}\n\n/**\n * Get Tauri core API\n */\nexport function getTauriCore(): TauriInvoke {\n return (window as unknown as { __TAURI__: { core: TauriInvoke } }).__TAURI__.core;\n}\n\n/**\n * Get Tauri event API\n */\nexport function getTauriEvent(): TauriEvent {\n return (window as unknown as { __TAURI__: { event: TauriEvent } }).__TAURI__.event;\n}\n\n/**\n * Initialize in native WebView mode (Tauri)\n */\nexport async function initNativeMode(\n ctx: ClientContext,\n log: LogFn,\n onEvent: (event: HaexHubEvent) => void,\n onContextChange: (context: ApplicationContext) => void\n): Promise<{ extensionInfo: ExtensionInfo; context: ApplicationContext }> {\n const { invoke } = getTauriCore();\n\n // Get extension info from Tauri backend\n const extensionInfo = await invoke<ExtensionInfo>(\"webview_extension_get_info\");\n const context = await invoke<ApplicationContext>(\"webview_extension_context_get\");\n\n ctx.state.isNativeWindow = true;\n ctx.state.initialized = true;\n ctx.state.extensionInfo = extensionInfo;\n ctx.state.context = context;\n\n log(\"HaexVault SDK initialized in native WebViewWindow mode\");\n log(\"Extension info:\", extensionInfo);\n log(\"Application context:\", context);\n\n // Setup Tauri event listeners\n await setupTauriEventListeners(ctx, log, onEvent, onContextChange);\n\n return { extensionInfo, context };\n}\n\n/**\n * Setup Tauri event listeners for context changes and external requests\n */\nasync function setupTauriEventListeners(\n ctx: ClientContext,\n log: LogFn,\n onEvent: (event: HaexHubEvent) => void,\n onContextChange: (context: ApplicationContext) => void\n): Promise<void> {\n const { listen } = getTauriEvent();\n\n console.log(\"[HaexVault SDK] Setting up Tauri event listener for:\", HAEXTENSION_EVENTS.CONTEXT_CHANGED);\n\n // Listen for context changes\n try {\n await listen(HAEXTENSION_EVENTS.CONTEXT_CHANGED, (event) => {\n console.log(\"[HaexVault SDK] Received Tauri event:\", HAEXTENSION_EVENTS.CONTEXT_CHANGED, event);\n log(\"Received context change event:\", event);\n\n const payload = event.payload as { context?: ApplicationContext };\n if (payload?.context) {\n ctx.state.context = payload.context;\n console.log(\"[HaexVault SDK] Updated context to:\", ctx.state.context);\n onContextChange(payload.context);\n onEvent({\n type: HAEXTENSION_EVENTS.CONTEXT_CHANGED,\n data: { context: ctx.state.context },\n timestamp: Date.now(),\n });\n } else {\n console.warn(\"[HaexVault SDK] Event received but no context in payload:\", event);\n }\n });\n console.log(\"[HaexVault SDK] Context change listener registered successfully\");\n } catch (error) {\n console.error(\"[HaexVault SDK] Failed to setup context change listener:\", error);\n log(\"Failed to setup context change listener:\", error);\n }\n\n // Listen for external requests\n try {\n await listen(EXTERNAL_EVENTS.REQUEST, (event) => {\n console.log(\"[HaexVault SDK] ====== EXTERNAL REQUEST RECEIVED ======\");\n console.log(\"[HaexVault SDK] Event payload:\", JSON.stringify(event.payload, null, 2));\n log(\"Received external request event:\", event);\n if (event.payload) {\n onEvent({\n type: EXTERNAL_EVENTS.REQUEST,\n data: event.payload,\n timestamp: Date.now(),\n });\n } else {\n console.warn(\"[HaexVault SDK] External request event has no payload!\");\n }\n });\n console.log(\"[HaexVault SDK] External request listener registered successfully\");\n } catch (error) {\n console.error(\"[HaexVault SDK] Failed to setup external request listener:\", error);\n log(\"Failed to setup external request listener:\", error);\n }\n}\n\n/**\n * Initialize in iframe mode\n */\nexport async function initIframeMode(\n ctx: ClientContext,\n log: LogFn,\n messageHandler: (event: MessageEvent) => void,\n request: <T>(method: string, params?: Record<string, unknown>) => Promise<T>\n): Promise<{ context: ApplicationContext }> {\n // Verify we're in an iframe\n if (!isInIframe()) {\n throw new HaexVaultSdkError(ErrorCode.NOT_IN_IFRAME, \"errors.not_in_iframe\");\n }\n\n // Setup message listener\n ctx.handlers.messageHandler = messageHandler;\n window.addEventListener(\"message\", messageHandler);\n\n ctx.state.isNativeWindow = false;\n ctx.state.initialized = true;\n log(\"HaexVault SDK initialized in iframe mode\");\n\n // Load extension info from manifest if provided\n if (ctx.config.manifest) {\n ctx.state.extensionInfo = {\n publicKey: ctx.config.manifest.publicKey,\n name: ctx.config.manifest.name,\n version: ctx.config.manifest.version,\n displayName: ctx.config.manifest.name,\n };\n log(\"Extension info loaded from manifest:\", ctx.state.extensionInfo);\n }\n\n // Send debug info in debug mode\n sendDebugInfo(ctx.config);\n\n // Request context - this also acts as a handshake\n const context = await request<ApplicationContext>(HAEXTENSION_METHODS.context.get);\n ctx.state.context = context;\n log(\"Application context received:\", context);\n\n return { context };\n}\n\n/**\n * Send debug info to parent window (development only)\n */\nfunction sendDebugInfo(config: ClientConfig): void {\n if (!config.debug) return;\n if (typeof window === \"undefined\" || !window.parent) return;\n\n const debugInfo = `SDK Debug:\\nwindow.parent exists: ${!!window.parent}\\nwindow.parent === window: ${window.parent === window}\\nwindow.self === window.top: ${window.self === window.top}`;\n\n try {\n window.parent.postMessage({\n type: HAEXSPACE_MESSAGE_TYPES.DEBUG,\n data: debugInfo,\n }, \"*\");\n } catch (e) {\n // Fallback to alert only in debug mode\n alert(debugInfo + `\\npostMessage error: ${e}`);\n }\n}\n","/**\n * Tauri Command Names\n *\n * Central definition of all Tauri invoke command names.\n * These must match the #[tauri::command] function names in Rust.\n */\n\nexport const TAURI_COMMANDS = {\n database: {\n query: \"webview_extension_db_query\",\n execute: \"webview_extension_db_execute\",\n registerMigrations: \"webview_extension_db_register_migrations\",\n },\n\n permissions: {\n checkWeb: \"webview_extension_check_web_permission\",\n checkDatabase: \"webview_extension_check_database_permission\",\n checkFilesystem: \"webview_extension_check_filesystem_permission\",\n },\n\n web: {\n open: \"webview_extension_web_open\",\n fetch: \"webview_extension_web_request\",\n },\n\n filesystem: {\n saveFile: \"webview_extension_fs_save_file\",\n openFile: \"webview_extension_fs_open_file\",\n showImage: \"webview_extension_fs_show_image\",\n },\n\n external: {\n // Response handling (called by extensions running in WebView)\n respond: \"webview_extension_external_respond\",\n\n // Bridge server management\n bridgeStart: \"external_bridge_start\",\n bridgeStop: \"external_bridge_stop\",\n bridgeGetStatus: \"external_bridge_get_status\",\n\n // Client authorization (unified API with remember flag)\n clientAllow: \"external_client_allow\",\n clientBlock: \"external_client_block\",\n\n // Authorized clients management (permanent - stored in database)\n getAuthorizedClients: \"external_get_authorized_clients\",\n revokeClient: \"external_revoke_client\",\n\n // Session-based authorizations (temporary - cleared when haex-vault restarts)\n getSessionAuthorizations: \"external_get_session_authorizations\",\n revokeSessionAuthorization: \"external_revoke_session_authorization\",\n\n // Blocked clients management\n getBlockedClients: \"external_get_blocked_clients\",\n unblockClient: \"external_unblock_client\",\n isClientBlocked: \"external_is_client_blocked\",\n\n // Pending authorizations\n getPendingAuthorizations: \"external_get_pending_authorizations\",\n },\n\n extension: {\n getInfo: \"webview_extension_get_info\",\n getContext: \"webview_extension_context_get\",\n },\n\n filesync: {\n // Spaces (webview_* commands extract extension info from WebviewWindow)\n listSpaces: \"webview_filesync_list_spaces\",\n createSpace: \"webview_filesync_create_space\",\n deleteSpace: \"webview_filesync_delete_space\",\n\n // Files\n listFiles: \"webview_filesync_list_files\",\n getFile: \"webview_filesync_get_file\",\n uploadFile: \"webview_filesync_upload_file\",\n downloadFile: \"webview_filesync_download_file\",\n deleteFile: \"webview_filesync_delete_file\",\n\n // Backends\n listBackends: \"webview_filesync_list_backends\",\n addBackend: \"webview_filesync_add_backend\",\n removeBackend: \"webview_filesync_remove_backend\",\n testBackend: \"webview_filesync_test_backend\",\n\n // Sync Rules\n listSyncRules: \"webview_filesync_list_sync_rules\",\n addSyncRule: \"webview_filesync_add_sync_rule\",\n updateSyncRule: \"webview_filesync_update_sync_rule\",\n removeSyncRule: \"webview_filesync_remove_sync_rule\",\n\n // Sync Operations\n getSyncStatus: \"webview_filesync_get_sync_status\",\n triggerSync: \"webview_filesync_trigger_sync\",\n pauseSync: \"webview_filesync_pause_sync\",\n resumeSync: \"webview_filesync_resume_sync\",\n\n // Conflict Resolution\n resolveConflict: \"webview_filesync_resolve_conflict\",\n\n // UI Helpers (selectFolder doesn't need extension info)\n selectFolder: \"filesync_select_folder\",\n scanLocal: \"webview_filesync_scan_local\",\n\n // Sync Queue\n addToQueue: \"webview_filesync_add_to_queue\",\n getQueue: \"webview_filesync_get_queue\",\n getQueueSummary: \"webview_filesync_get_queue_summary\",\n startQueueEntry: \"webview_filesync_start_queue_entry\",\n completeQueueEntry: \"webview_filesync_complete_queue_entry\",\n failQueueEntry: \"webview_filesync_fail_queue_entry\",\n retryFailedQueue: \"webview_filesync_retry_failed_queue\",\n removeQueueEntry: \"webview_filesync_remove_queue_entry\",\n clearQueue: \"webview_filesync_clear_queue\",\n recoverQueue: \"webview_filesync_recover_queue\",\n },\n\n} as const;\n\n// Type helper to extract command string literals\nexport type TauriCommand =\n | (typeof TAURI_COMMANDS.database)[keyof typeof TAURI_COMMANDS.database]\n | (typeof TAURI_COMMANDS.permissions)[keyof typeof TAURI_COMMANDS.permissions]\n | (typeof TAURI_COMMANDS.web)[keyof typeof TAURI_COMMANDS.web]\n | (typeof TAURI_COMMANDS.filesystem)[keyof typeof TAURI_COMMANDS.filesystem]\n | (typeof TAURI_COMMANDS.external)[keyof typeof TAURI_COMMANDS.external]\n | (typeof TAURI_COMMANDS.extension)[keyof typeof TAURI_COMMANDS.extension]\n | (typeof TAURI_COMMANDS.filesync)[keyof typeof TAURI_COMMANDS.filesync];\n","/**\n * Database Handler\n *\n * Maps database SDK methods to Tauri invoke commands\n */\n\nimport { HAEXTENSION_METHODS } from \"../../methods\";\nimport { TAURI_COMMANDS } from \"../../commands\";\nimport type {\n InvokeHandlerMap,\n InvokeMapping,\n DatabaseQueryParams,\n DatabaseMigrationsParams,\n} from \"./types\";\n\nexport const databaseHandlers: InvokeHandlerMap = {\n [HAEXTENSION_METHODS.database.query]: {\n command: TAURI_COMMANDS.database.query,\n args: (p: DatabaseQueryParams) => ({\n query: p.query,\n params: p.params || [],\n }),\n } satisfies InvokeMapping<DatabaseQueryParams>,\n\n [HAEXTENSION_METHODS.database.execute]: {\n command: TAURI_COMMANDS.database.execute,\n args: (p: DatabaseQueryParams) => ({\n query: p.query,\n params: p.params || [],\n }),\n } satisfies InvokeMapping<DatabaseQueryParams>,\n\n [HAEXTENSION_METHODS.database.registerMigrations]: {\n command: TAURI_COMMANDS.database.registerMigrations,\n args: (p: DatabaseMigrationsParams) => ({\n extensionVersion: p.extensionVersion,\n migrations: p.migrations,\n }),\n } satisfies InvokeMapping<DatabaseMigrationsParams>,\n};\n","/**\n * Permissions Handler\n *\n * Maps permission SDK methods to Tauri invoke commands\n */\n\nimport { TAURI_COMMANDS } from \"../../commands\";\nimport type { InvokeHandlerMap, PermissionCheckParams } from \"./types\";\n\nexport const permissionsHandlers: InvokeHandlerMap = {\n \"permissions.web.check\": {\n command: TAURI_COMMANDS.permissions.checkWeb,\n args: (p: PermissionCheckParams) => ({\n url: p.url,\n }),\n },\n\n \"permissions.database.check\": {\n command: TAURI_COMMANDS.permissions.checkDatabase,\n args: (p: PermissionCheckParams) => ({\n resource: p.resource,\n operation: p.operation,\n }),\n },\n\n \"permissions.filesystem.check\": {\n command: TAURI_COMMANDS.permissions.checkFilesystem,\n args: (p: PermissionCheckParams) => ({\n path: p.path,\n actionStr: p.action,\n }),\n },\n};\n","/**\n * Web Handler\n *\n * Maps web/application SDK methods to Tauri invoke commands\n */\n\nimport { HAEXTENSION_METHODS } from \"../../methods\";\nimport { TAURI_COMMANDS } from \"../../commands\";\nimport type { InvokeHandlerMap, WebFetchParams } from \"./types\";\n\ninterface ApplicationOpenParams {\n url: string;\n}\n\nexport const webHandlers: InvokeHandlerMap = {\n [HAEXTENSION_METHODS.application.open]: {\n command: TAURI_COMMANDS.web.open,\n args: (p: ApplicationOpenParams) => ({\n url: p.url,\n }),\n },\n\n [HAEXTENSION_METHODS.web.fetch]: {\n command: TAURI_COMMANDS.web.fetch,\n args: (p: WebFetchParams) => ({\n url: p.url,\n method: p.method,\n headers: p.headers,\n body: p.body,\n }),\n },\n};\n","/**\n * Filesystem Handler\n *\n * Maps filesystem SDK methods to Tauri invoke commands\n */\n\nimport { HAEXTENSION_METHODS } from \"../../methods\";\nimport { TAURI_COMMANDS } from \"../../commands\";\nimport type { InvokeHandlerMap, FilesystemSaveParams, FilesystemOpenParams } from \"./types\";\n\ninterface FilesystemShowImageParams {\n dataUrl: string;\n}\n\nexport const filesystemHandlers: InvokeHandlerMap = {\n [HAEXTENSION_METHODS.filesystem.saveFile]: {\n command: TAURI_COMMANDS.filesystem.saveFile,\n args: (p: FilesystemSaveParams) => ({\n data: p.data,\n defaultPath: p.defaultPath,\n title: p.title,\n filters: p.filters,\n }),\n },\n\n [HAEXTENSION_METHODS.filesystem.openFile]: {\n command: TAURI_COMMANDS.filesystem.openFile,\n args: (p: FilesystemOpenParams) => ({\n data: p.data,\n fileName: p.fileName,\n }),\n },\n\n [HAEXTENSION_METHODS.filesystem.showImage]: {\n command: TAURI_COMMANDS.filesystem.showImage,\n args: (p: FilesystemShowImageParams) => ({\n dataUrl: p.dataUrl,\n }),\n },\n};\n","/**\n * External Handler\n *\n * Maps external request SDK methods to Tauri invoke commands\n */\n\nimport { TAURI_COMMANDS } from \"../../commands\";\nimport type { InvokeHandlerMap, ExternalRespondParams } from \"./types\";\n\nexport const externalHandlers: InvokeHandlerMap = {\n \"external.respond\": {\n command: TAURI_COMMANDS.external.respond,\n args: (p: ExternalRespondParams) => ({\n requestId: p.requestId,\n success: p.success,\n data: p.data,\n error: p.error,\n }),\n },\n};\n","/**\n * FileSync Handler\n *\n * Maps filesync SDK methods to Tauri invoke commands\n */\n\nimport { HAEXTENSION_METHODS } from \"../../methods\";\nimport { TAURI_COMMANDS } from \"../../commands\";\nimport type {\n InvokeHandlerMap,\n FileSyncSpaceParams,\n FileSyncFileParams,\n FileSyncBackendParams,\n FileSyncRuleParams,\n FileSyncConflictParams,\n FileSyncScanLocalParams,\n FileSyncQueueParams,\n} from \"./types\";\n\nexport const filesyncHandlers: InvokeHandlerMap = {\n // ==========================================================================\n // Spaces\n // ==========================================================================\n [HAEXTENSION_METHODS.filesync.listSpaces]: {\n command: TAURI_COMMANDS.filesync.listSpaces,\n args: () => ({}),\n },\n\n [HAEXTENSION_METHODS.filesync.createSpace]: {\n command: TAURI_COMMANDS.filesync.createSpace,\n args: (p: FileSyncSpaceParams) => ({ request: p }),\n },\n\n [HAEXTENSION_METHODS.filesync.deleteSpace]: {\n command: TAURI_COMMANDS.filesync.deleteSpace,\n args: (p: FileSyncSpaceParams) => ({ spaceId: p.spaceId }),\n },\n\n // ==========================================================================\n // Files\n // ==========================================================================\n [HAEXTENSION_METHODS.filesync.listFiles]: {\n command: TAURI_COMMANDS.filesync.listFiles,\n args: (p: FileSyncFileParams) => ({ request: p }),\n },\n\n [HAEXTENSION_METHODS.filesync.getFile]: {\n command: TAURI_COMMANDS.filesync.getFile,\n args: (p: FileSyncFileParams) => ({ fileId: p.fileId }),\n },\n\n [HAEXTENSION_METHODS.filesync.uploadFile]: {\n command: TAURI_COMMANDS.filesync.uploadFile,\n args: (p: FileSyncFileParams) => ({ request: p }),\n },\n\n [HAEXTENSION_METHODS.filesync.downloadFile]: {\n command: TAURI_COMMANDS.filesync.downloadFile,\n args: (p: FileSyncFileParams) => ({ request: p }),\n },\n\n [HAEXTENSION_METHODS.filesync.deleteFile]: {\n command: TAURI_COMMANDS.filesync.deleteFile,\n args: (p: FileSyncFileParams) => ({ fileId: p.fileId }),\n },\n\n // ==========================================================================\n // Backends\n // ==========================================================================\n [HAEXTENSION_METHODS.filesync.listBackends]: {\n command: TAURI_COMMANDS.filesync.listBackends,\n args: () => ({}),\n },\n\n [HAEXTENSION_METHODS.filesync.addBackend]: {\n command: TAURI_COMMANDS.filesync.addBackend,\n args: (p: FileSyncBackendParams) => ({ request: p }),\n },\n\n [HAEXTENSION_METHODS.filesync.removeBackend]: {\n command: TAURI_COMMANDS.filesync.removeBackend,\n args: (p: FileSyncBackendParams) => ({ backendId: p.backendId }),\n },\n\n [HAEXTENSION_METHODS.filesync.testBackend]: {\n command: TAURI_COMMANDS.filesync.testBackend,\n args: (p: FileSyncBackendParams) => ({ backendId: p.backendId }),\n },\n\n // ==========================================================================\n // Sync Rules\n // ==========================================================================\n [HAEXTENSION_METHODS.filesync.listSyncRules]: {\n command: TAURI_COMMANDS.filesync.listSyncRules,\n args: () => ({}),\n },\n\n [HAEXTENSION_METHODS.filesync.addSyncRule]: {\n command: TAURI_COMMANDS.filesync.addSyncRule,\n args: (p: FileSyncRuleParams) => ({ request: p }),\n },\n\n [HAEXTENSION_METHODS.filesync.updateSyncRule]: {\n command: TAURI_COMMANDS.filesync.updateSyncRule,\n args: (p: FileSyncRuleParams) => ({ request: p }),\n },\n\n [HAEXTENSION_METHODS.filesync.removeSyncRule]: {\n command: TAURI_COMMANDS.filesync.removeSyncRule,\n args: (p: FileSyncRuleParams) => ({ ruleId: p.ruleId }),\n },\n\n // ==========================================================================\n // Sync Operations\n // ==========================================================================\n [HAEXTENSION_METHODS.filesync.getSyncStatus]: {\n command: TAURI_COMMANDS.filesync.getSyncStatus,\n args: () => ({}),\n },\n\n [HAEXTENSION_METHODS.filesync.triggerSync]: {\n command: TAURI_COMMANDS.filesync.triggerSync,\n args: () => ({}),\n },\n\n [HAEXTENSION_METHODS.filesync.pauseSync]: {\n command: TAURI_COMMANDS.filesync.pauseSync,\n args: () => ({}),\n },\n\n [HAEXTENSION_METHODS.filesync.resumeSync]: {\n command: TAURI_COMMANDS.filesync.resumeSync,\n args: () => ({}),\n },\n\n // ==========================================================================\n // Conflict Resolution\n // ==========================================================================\n [HAEXTENSION_METHODS.filesync.resolveConflict]: {\n command: TAURI_COMMANDS.filesync.resolveConflict,\n args: (p: FileSyncConflictParams) => ({ request: p }),\n },\n\n // ==========================================================================\n // UI Helpers\n // ==========================================================================\n [HAEXTENSION_METHODS.filesync.selectFolder]: {\n command: TAURI_COMMANDS.filesync.selectFolder,\n args: () => ({}),\n },\n\n [HAEXTENSION_METHODS.filesync.scanLocal]: {\n command: TAURI_COMMANDS.filesync.scanLocal,\n args: (p: FileSyncScanLocalParams) => ({ request: p }),\n },\n\n // ==========================================================================\n // Sync Queue\n // ==========================================================================\n [HAEXTENSION_METHODS.filesync.addToQueue]: {\n command: TAURI_COMMANDS.filesync.addToQueue,\n args: (p: FileSyncQueueParams) => ({ request: p }),\n },\n\n [HAEXTENSION_METHODS.filesync.getQueue]: {\n command: TAURI_COMMANDS.filesync.getQueue,\n args: (p: FileSyncQueueParams) => ({ request: p ?? {} }),\n },\n\n [HAEXTENSION_METHODS.filesync.getQueueSummary]: {\n command: TAURI_COMMANDS.filesync.getQueueSummary,\n args: () => ({}),\n },\n\n [HAEXTENSION_METHODS.filesync.startQueueEntry]: {\n command: TAURI_COMMANDS.filesync.startQueueEntry,\n args: (p: FileSyncQueueParams) => ({ entryId: p.entryId }),\n },\n\n [HAEXTENSION_METHODS.filesync.completeQueueEntry]: {\n command: TAURI_COMMANDS.filesync.completeQueueEntry,\n args: (p: FileSyncQueueParams) => ({ entryId: p.entryId }),\n },\n\n [HAEXTENSION_METHODS.filesync.failQueueEntry]: {\n command: TAURI_COMMANDS.filesync.failQueueEntry,\n args: (p: FileSyncQueueParams) => ({ entryId: p.entryId, errorMessage: p.errorMessage }),\n },\n\n [HAEXTENSION_METHODS.filesync.retryFailedQueue]: {\n command: TAURI_COMMANDS.filesync.retryFailedQueue,\n args: () => ({}),\n },\n\n [HAEXTENSION_METHODS.filesync.removeQueueEntry]: {\n command: TAURI_COMMANDS.filesync.removeQueueEntry,\n args: (p: FileSyncQueueParams) => ({ entryId: p.entryId }),\n },\n\n [HAEXTENSION_METHODS.filesync.clearQueue]: {\n command: TAURI_COMMANDS.filesync.clearQueue,\n args: (p: FileSyncQueueParams) => ({ ruleId: p.ruleId }),\n },\n\n [HAEXTENSION_METHODS.filesync.recoverQueue]: {\n command: TAURI_COMMANDS.filesync.recoverQueue,\n args: () => ({}),\n },\n};\n","/**\n * Transport Handlers Index\n *\n * Combines all domain-specific handlers into a single handler map\n */\n\nimport type { InvokeHandlerMap } from \"./types\";\nimport { databaseHandlers } from \"./database\";\nimport { permissionsHandlers } from \"./permissions\";\nimport { webHandlers } from \"./web\";\nimport { filesystemHandlers } from \"./filesystem\";\nimport { externalHandlers } from \"./external\";\nimport { filesyncHandlers } from \"./filesync\";\n\n/**\n * Combined handler map for all SDK methods\n * Used by both invoke and postMessage transports\n */\nexport const allHandlers: InvokeHandlerMap = {\n ...databaseHandlers,\n ...permissionsHandlers,\n ...webHandlers,\n ...filesystemHandlers,\n ...externalHandlers,\n ...filesyncHandlers,\n};\n\n// Re-export types and individual handlers for flexibility\nexport type { InvokeHandlerMap, InvokeMapping } from \"./types\";\nexport { databaseHandlers } from \"./database\";\nexport { permissionsHandlers } from \"./permissions\";\nexport { webHandlers } from \"./web\";\nexport { filesystemHandlers } from \"./filesystem\";\nexport { externalHandlers } from \"./external\";\nexport { filesyncHandlers } from \"./filesync\";\n","/**\n * Transport Module\n *\n * Functions for sending requests via different transport mechanisms:\n * - postMessage (iframe mode)\n * - Tauri invoke (native WebView mode)\n */\n\nimport { ErrorCode, HaexVaultSdkError } from \"../types\";\nimport type { HaexHubRequest, ExtensionInfo } from \"../types\";\nimport { allHandlers } from \"../transport/handlers\";\nimport type { ClientConfig, PendingRequest, LogFn } from \"./context\";\n\n/**\n * Generate a unique request ID\n */\nexport function generateRequestId(counter: number): string {\n return `req_${counter}`;\n}\n\n/**\n * Send a request via postMessage (iframe mode)\n */\nexport function sendPostMessage<T>(\n method: string,\n params: Record<string, unknown>,\n requestId: string,\n config: ClientConfig,\n extensionInfo: ExtensionInfo | null,\n pendingRequests: Map<string, PendingRequest>\n): Promise<T> {\n const request: HaexHubRequest = {\n method,\n params,\n timestamp: Date.now(),\n };\n\n return new Promise<T>((resolve, reject) => {\n const timeout = setTimeout(() => {\n pendingRequests.delete(requestId);\n reject(\n new HaexVaultSdkError(ErrorCode.TIMEOUT, \"errors.timeout\", {\n timeout: config.timeout,\n })\n );\n }, config.timeout);\n\n pendingRequests.set(requestId, { resolve, reject, timeout });\n\n // Use wildcard origin since extensions are sandboxed in their own protocol\n const targetOrigin = \"*\";\n\n if (config.debug) {\n console.log(\"[SDK Debug] ========== Sending Request ==========\");\n console.log(\"[SDK Debug] Request ID:\", requestId);\n console.log(\"[SDK Debug] Method:\", request.method);\n console.log(\"[SDK Debug] Params:\", request.params);\n console.log(\"[SDK Debug] Target origin:\", targetOrigin);\n console.log(\"[SDK Debug] Extension info:\", extensionInfo);\n console.log(\"[SDK Debug] ========================================\");\n }\n\n window.parent.postMessage({ id: requestId, ...request }, targetOrigin);\n });\n}\n\n/**\n * Send a request via Tauri invoke (native WebView mode)\n */\nexport async function sendInvoke<T>(\n method: string,\n params: Record<string, unknown>,\n config: ClientConfig,\n log: LogFn\n): Promise<T> {\n const { invoke } = (window as unknown as { __TAURI__: { core: { invoke: <R>(cmd: string, args?: Record<string, unknown>) => Promise<R> } } }).__TAURI__.core;\n\n if (config.debug) {\n console.log(\"[SDK Debug] ========== Invoke Request ==========\");\n console.log(\"[SDK Debug] Method:\", method);\n console.log(\"[SDK Debug] Params:\", params);\n console.log(\"[SDK Debug] =======================================\");\n }\n\n // Look up handler for this method\n const handler = allHandlers[method];\n\n if (handler) {\n const args = handler.args(params);\n console.log(\"[SDK Debug] Handler found for method:\", method);\n console.log(\"[SDK Debug] Handler command:\", handler.command);\n console.log(\"[SDK Debug] Transformed args:\", JSON.stringify(args, null, 2));\n return invoke<T>(handler.command, args);\n }\n\n // Method not found in handlers\n throw new HaexVaultSdkError(\n ErrorCode.METHOD_NOT_FOUND,\n \"errors.method_not_found\",\n { method }\n );\n}\n\n/**\n * Handle a response for a pending request\n */\nexport function handlePendingResponse(\n requestId: string,\n result: unknown,\n error: unknown,\n pendingRequests: Map<string, PendingRequest>,\n debug: boolean\n): boolean {\n const pending = pendingRequests.get(requestId);\n if (!pending) {\n if (debug) {\n console.warn(\n \"[SDK Debug] ⚠️ Received response for unknown request ID:\",\n requestId\n );\n console.warn(\n \"[SDK Debug] Known IDs:\",\n Array.from(pendingRequests.keys())\n );\n }\n return false;\n }\n\n clearTimeout(pending.timeout);\n pendingRequests.delete(requestId);\n\n if (error) {\n if (debug) {\n console.error(\"[SDK Debug] ❌ Request failed:\", error);\n }\n pending.reject(error);\n } else {\n if (debug) {\n console.log(\"[SDK Debug] ✅ Request succeeded:\", result);\n }\n pending.resolve(result);\n }\n\n return true;\n}\n","/**\n * Event Handling Module\n *\n * Functions for handling messages and events from the parent window (iframe mode)\n * or from Tauri events (native mode).\n */\n\nimport { HAEXTENSION_EVENTS, EXTERNAL_EVENTS } from \"../events\";\nimport type {\n HaexHubResponse,\n HaexHubEvent,\n EventCallback,\n ContextChangedEvent,\n ExternalRequestEvent,\n ApplicationContext,\n} from \"../types\";\nimport type { ClientConfig, PendingRequest, LogFn } from \"./context\";\n\n/**\n * Create a message handler for iframe mode\n */\nexport function createMessageHandler(\n config: ClientConfig,\n pendingRequests: Map<string, PendingRequest>,\n extensionInfo: () => unknown,\n onEvent: (event: HaexHubEvent) => void\n): (event: MessageEvent) => void {\n return (event: MessageEvent) => {\n if (config.debug) {\n console.log(\"[SDK Debug] ========== Message Received ==========\");\n console.log(\"[SDK Debug] Event origin:\", event.origin);\n console.log(\n \"[SDK Debug] Event source:\",\n event.source === window.parent ? \"parent window\" : \"unknown\"\n );\n console.log(\"[SDK Debug] Event data:\", event.data);\n console.log(\"[SDK Debug] Extension info loaded:\", !!extensionInfo());\n console.log(\n \"[SDK Debug] Pending requests count:\",\n pendingRequests.size\n );\n }\n\n // Verify message comes from parent window\n if (event.source !== window.parent) {\n if (config.debug) {\n console.error(\"[SDK Debug] ❌ REJECTED: Message not from parent window!\");\n }\n return;\n }\n\n const data = event.data as HaexHubResponse | HaexHubEvent;\n\n // Handle pending request responses\n if (\"id\" in data && pendingRequests.has(data.id)) {\n if (config.debug) {\n console.log(\"[SDK Debug] ✅ Found pending request for ID:\", data.id);\n }\n const pending = pendingRequests.get(data.id)!;\n clearTimeout(pending.timeout);\n pendingRequests.delete(data.id);\n\n if (data.error) {\n if (config.debug) {\n console.error(\"[SDK Debug] ❌ Request failed:\", data.error);\n }\n pending.reject(data.error);\n } else {\n if (config.debug) {\n console.log(\"[SDK Debug] ✅ Request succeeded:\", data.result);\n }\n pending.resolve(data.result);\n }\n return;\n }\n\n // Warn about unknown request IDs\n if (\"id\" in data && !pendingRequests.has(data.id)) {\n if (config.debug) {\n console.warn(\n \"[SDK Debug] ⚠️ Received response for unknown request ID:\",\n data.id\n );\n console.warn(\n \"[SDK Debug] Known IDs:\",\n Array.from(pendingRequests.keys())\n );\n }\n }\n\n // Handle events\n if (\"type\" in data && data.type) {\n if (config.debug) {\n console.log(\"[SDK Debug] Event received:\", data.type);\n }\n onEvent(data as HaexHubEvent);\n }\n\n if (config.debug) {\n console.log(\"[SDK Debug] ========== End Message ==========\");\n }\n };\n}\n\n/**\n * Process an incoming event\n */\nexport function processEvent(\n event: HaexHubEvent,\n log: LogFn,\n eventListeners: Map<string, Set<EventCallback>>,\n onContextChanged: (context: ApplicationContext) => void,\n onExternalRequest: (event: ExternalRequestEvent) => void\n): void {\n // Handle context changes\n if (event.type === HAEXTENSION_EVENTS.CONTEXT_CHANGED) {\n const contextEvent = event as ContextChangedEvent;\n onContextChanged(contextEvent.data.context);\n log(\"Context updated:\", contextEvent.data.context);\n }\n\n // Handle external requests from authorized clients\n if (event.type === EXTERNAL_EVENTS.REQUEST) {\n const externalEvent = event as ExternalRequestEvent;\n onExternalRequest(externalEvent);\n return; // Don't emit to regular event listeners\n }\n\n // Emit to registered listeners\n emitEvent(event, log, eventListeners);\n}\n\n/**\n * Emit an event to registered listeners\n */\nexport function emitEvent(\n event: HaexHubEvent,\n log: LogFn,\n eventListeners: Map<string, Set<EventCallback>>\n): void {\n log(\"Event received:\", event);\n const listeners = eventListeners.get(event.type);\n if (listeners) {\n listeners.forEach((callback) => callback(event));\n }\n}\n\n/**\n * Register an event listener\n */\nexport function addEventListener(\n eventType: string,\n callback: EventCallback,\n eventListeners: Map<string, Set<EventCallback>>\n): void {\n if (!eventListeners.has(eventType)) {\n eventListeners.set(eventType, new Set());\n }\n eventListeners.get(eventType)!.add(callback);\n}\n\n/**\n * Remove an event listener\n */\nexport function removeEventListener(\n eventType: string,\n callback: EventCallback,\n eventListeners: Map<string, Set<EventCallback>>\n): void {\n const listeners = eventListeners.get(eventType);\n if (listeners) {\n listeners.delete(callback);\n }\n}\n\n/**\n * Notify all reactive subscribers\n */\nexport function notifySubscribers(subscribers: Set<() => void>): void {\n subscribers.forEach((callback) => callback());\n}\n","/**\n * Database Module\n *\n * Functions for database operations including Drizzle ORM initialization\n * and raw SQL query/execute methods.\n */\n\nimport { HAEXTENSION_METHODS } from \"../methods\";\nimport { ErrorCode, HaexVaultSdkError } from \"../types\";\nimport type { ExtensionInfo, DatabaseQueryResult } from \"../types\";\nimport { drizzle, type SqliteRemoteDatabase } from \"drizzle-orm/sqlite-proxy\";\nimport type { LogFn } from \"./context\";\n\n/**\n * Request function type for database operations\n */\ntype RequestFn = <T>(method: string, params?: Record<string, unknown>) => Promise<T>;\n\n/**\n * Create a Drizzle ORM database instance\n *\n * @param schema The Drizzle schema object (with prefixed table names)\n * @param extensionInfo The current extension info (required)\n * @param request The request function for SDK communication\n * @param log Logger function\n * @returns The type-safe Drizzle database instance\n */\nexport function createDrizzleInstance<T extends Record<string, unknown>>(\n schema: T,\n extensionInfo: ExtensionInfo | null,\n request: RequestFn,\n log: LogFn\n): SqliteRemoteDatabase<T> {\n if (!extensionInfo) {\n throw new HaexVaultSdkError(\n ErrorCode.EXTENSION_INFO_UNAVAILABLE,\n \"errors.client_not_ready\"\n );\n }\n\n return drizzle<T>(\n async (\n sql: string,\n params: unknown[],\n method: \"get\" | \"run\" | \"all\" | \"values\"\n ) => {\n try {\n // Drizzle uses different methods:\n // - \"run\": INSERT/UPDATE/DELETE without RETURNING\n // - \"all\": INSERT/UPDATE/DELETE with RETURNING, or SELECT\n // - \"get\": SELECT with LIMIT 1\n // - \"values\": SELECT returning raw values\n //\n // The backend intelligently handles routing:\n // - method=\"run\" and \"all\" go to haextension.db.execute\n // - Backend detects SELECT statements and delegates to haextension.db.query\n // - Backend returns rows when RETURNING clause is present\n\n if (method === \"run\" || method === \"all\") {\n const result = await request<DatabaseQueryResult>(\n HAEXTENSION_METHODS.database.execute,\n {\n query: sql,\n params: params as unknown[],\n }\n );\n\n // For method=\"all\", return rows (RETURNING clause or SELECT delegated by backend)\n if (method === \"all\") {\n return { rows: result.rows || [] };\n }\n\n // For method=\"run\", check if we have rows (RETURNING clause)\n if (result.rows && Array.isArray(result.rows) && result.rows.length > 0) {\n return { rows: result.rows };\n }\n\n return result;\n }\n\n // Read operations (SELECT without RETURNING)\n const result = await request<DatabaseQueryResult>(HAEXTENSION_METHODS.database.query, {\n query: sql,\n params: params as unknown[],\n });\n\n const rows = result.rows as unknown[];\n\n if (method === \"get\") {\n return { rows: rows.length > 0 ? rows.at(0) : undefined };\n }\n\n return { rows };\n } catch (error) {\n log(\"Database operation failed:\", error);\n throw error;\n }\n },\n {\n schema: schema,\n logger: false,\n }\n );\n}\n\n/**\n * Execute a raw SQL query (SELECT)\n *\n * @param sql The SQL query string\n * @param params Query parameters\n * @param request The request function\n * @param debug Whether debug mode is enabled\n * @returns Array of result rows\n */\nexport async function queryRaw<T = Record<string, unknown>>(\n sql: string,\n params: unknown[],\n request: RequestFn,\n debug: boolean\n): Promise<T[]> {\n const result = await request<DatabaseQueryResult>(\n HAEXTENSION_METHODS.database.query,\n { query: sql, params }\n );\n if (debug) {\n console.log(\"[SDK query()] Raw result:\", JSON.stringify(result, null, 2));\n }\n return result.rows as T[];\n}\n\n/**\n * Execute a raw SQL statement (INSERT, UPDATE, DELETE, CREATE, etc.)\n *\n * @param sql The SQL statement\n * @param params Statement parameters\n * @param request The request function\n * @returns Object with rowsAffected and optionally lastInsertId\n */\nexport async function executeRaw(\n sql: string,\n params: unknown[],\n request: RequestFn\n): Promise<{ rowsAffected: number; lastInsertId?: number }> {\n const result = await request<DatabaseQueryResult>(\n HAEXTENSION_METHODS.database.execute,\n { query: sql, params }\n );\n return {\n rowsAffected: result.rowsAffected,\n lastInsertId: result.lastInsertId,\n };\n}\n","/**\n * External Request Handling Module\n *\n * Functions for handling external requests from authorized clients\n * (browser extensions, CLI tools, servers, etc.)\n */\n\nimport type {\n ExternalRequest,\n ExternalResponse,\n ExternalRequestHandler,\n} from \"../types\";\nimport type { LogFn } from \"./context\";\n\n/**\n * Request function type\n */\ntype RequestFn = <T>(method: string, params?: Record<string, unknown>) => Promise<T>;\n\n/**\n * Register an external request handler\n *\n * @param action The action/method name to handle\n * @param handler The handler function\n * @param handlers The handlers map\n * @param log Logger function\n * @returns Unsubscribe function\n */\nexport function registerExternalHandler(\n action: string,\n handler: ExternalRequestHandler,\n handlers: Map<string, ExternalRequestHandler>,\n log: LogFn\n): () => void {\n handlers.set(action, handler);\n log(`[ExternalRequest] Registered handler for action: ${action}`);\n\n return () => {\n handlers.delete(action);\n log(`[ExternalRequest] Unregistered handler for action: ${action}`);\n };\n}\n\n/**\n * Handle an incoming external request\n *\n * @param request The external request\n * @param handlers The handlers map\n * @param respond Function to send response\n * @param log Logger function\n */\nexport async function handleExternalRequest(\n request: ExternalRequest,\n handlers: Map<string, ExternalRequestHandler>,\n respond: (response: ExternalResponse) => Promise<void>,\n log: LogFn\n): Promise<void> {\n console.log(\"[SDK Debug] handleExternalRequest called!\");\n console.log(\"[SDK Debug] Request:\", JSON.stringify(request, null, 2));\n console.log(\"[SDK Debug] Available handlers:\", Array.from(handlers.keys()));\n log(`[ExternalRequest] Received request: ${request.action} from ${request.publicKey.substring(0, 20)}...`);\n\n const handler = handlers.get(request.action);\n\n if (!handler) {\n log(`[ExternalRequest] No handler for action: ${request.action}`);\n await respond({\n requestId: request.requestId,\n success: false,\n error: `No handler registered for action: ${request.action}`,\n });\n return;\n }\n\n try {\n const response = await handler(request);\n await respond(response);\n log(`[ExternalRequest] Response sent for: ${request.action}`);\n } catch (error) {\n log(`[ExternalRequest] Handler error:`, error);\n await respond({\n requestId: request.requestId,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n}\n\n/**\n * Send an external response back to haex-vault\n *\n * @param response The response to send\n * @param request The request function\n */\nexport async function respondToExternalRequest(\n response: ExternalResponse,\n request: RequestFn\n): Promise<void> {\n console.log(\"[SDK Debug] respondToExternalRequest called with:\", JSON.stringify(response, null, 2));\n await request(\"external.respond\", response as unknown as Record<string, unknown>);\n}\n","/**\n * HaexVault Client\n *\n * Main SDK client for extensions running in HaexVault.\n * Supports both native WebView mode (Tauri) and iframe mode (mobile/web).\n */\n\nimport type {\n HaexHubConfig,\n HaexHubEvent,\n EventCallback,\n PermissionResponse,\n DatabasePermissionRequest,\n ExtensionInfo,\n ApplicationContext,\n SearchResult,\n MigrationResult,\n Migration,\n ExternalResponse,\n ExternalRequestHandler,\n} from \"./types\";\nimport { DEFAULT_TIMEOUT } from \"./types\";\nimport { StorageAPI } from \"./api/storage\";\nimport { DatabaseAPI } from \"./api/database\";\nimport { FilesystemAPI } from \"./api/filesystem\";\nimport { WebAPI } from \"./api/web\";\nimport { PermissionsAPI } from \"./api/permissions\";\nimport { installConsoleForwarding } from \"./polyfills/consoleForwarding\";\nimport type { SqliteRemoteDatabase } from \"drizzle-orm/sqlite-proxy\";\n\n// Client modules\nimport type { ClientConfig, PendingRequest } from \"./client/context\";\nimport {\n getExtensionTableName,\n getDependencyTableName as getDependencyTableNameFn,\n parseTableName as parseTableNameFn,\n} from \"./client/tableName\";\nimport { isInIframe, hasTauri, initNativeMode, initIframeMode } from \"./client/init\";\nimport { sendPostMessage, sendInvoke, generateRequestId } from \"./client/transport\";\nimport {\n createMessageHandler,\n processEvent,\n addEventListener,\n removeEventListener,\n notifySubscribers,\n} from \"./client/events\";\nimport { createDrizzleInstance, queryRaw, executeRaw } from \"./client/database\";\nimport { registerExternalHandler, handleExternalRequest, respondToExternalRequest } from \"./client/external\";\n\nexport class HaexVaultSdk {\n // Configuration\n private readonly config: ClientConfig;\n\n // State\n private initialized = false;\n private isNativeWindow = false;\n private requestCounter = 0;\n private _extensionInfo: ExtensionInfo | null = null;\n private _context: ApplicationContext | null = null;\n private _setupCompleted = false;\n\n // Collections\n private readonly pendingRequests: Map<string, PendingRequest> = new Map();\n private readonly eventListeners: Map<string, Set<EventCallback>> = new Map();\n private readonly externalRequestHandlers: Map<string, ExternalRequestHandler> = new Map();\n private readonly reactiveSubscribers: Set<() => void> = new Set();\n\n // Handlers\n private messageHandler: ((event: MessageEvent) => void) | null = null;\n\n // Promises\n private readyPromise: Promise<void>;\n private resolveReady!: () => void;\n private setupPromise: Promise<void> | null = null;\n private setupHook: (() => Promise<void>) | null = null;\n\n // Public APIs\n public orm: SqliteRemoteDatabase<Record<string, unknown>> | null = null;\n public readonly storage: StorageAPI;\n public readonly database: DatabaseAPI;\n public readonly filesystem: FilesystemAPI;\n public readonly web: WebAPI;\n public readonly permissions: PermissionsAPI;\n\n constructor(config: HaexHubConfig = {}) {\n this.config = {\n debug: config.debug ?? false,\n timeout: config.timeout ?? DEFAULT_TIMEOUT,\n manifest: config.manifest,\n };\n\n this.storage = new StorageAPI(this);\n this.database = new DatabaseAPI(this);\n this.filesystem = new FilesystemAPI(this);\n this.web = new WebAPI(this);\n this.permissions = new PermissionsAPI(this);\n\n installConsoleForwarding(this.config.debug);\n\n this.readyPromise = new Promise((resolve) => {\n this.resolveReady = resolve;\n });\n\n this.init();\n }\n\n // ==========================================================================\n // Lifecycle\n // ==========================================================================\n\n public async ready(): Promise<void> {\n return this.readyPromise;\n }\n\n public get setupCompleted(): boolean {\n return this._setupCompleted;\n }\n\n public onSetup(setupFn: () => Promise<void>): void {\n if (this.setupHook) {\n throw new Error(\"Setup hook already registered\");\n }\n this.setupHook = setupFn;\n }\n\n public async setupComplete(): Promise<void> {\n await this.readyPromise;\n\n if (!this.setupHook || this.setupCompleted) {\n return;\n }\n\n if (!this.setupPromise) {\n this.setupPromise = this.runSetupAsync();\n }\n\n return this.setupPromise;\n }\n\n public destroy(): void {\n if (this.messageHandler) {\n window.removeEventListener(\"message\", this.messageHandler);\n }\n\n this.pendingRequests.forEach(({ timeout }) => clearTimeout(timeout));\n this.pendingRequests.clear();\n this.eventListeners.clear();\n\n this.initialized = false;\n this.log(\"HaexVault SDK destroyed\");\n }\n\n // ==========================================================================\n // Properties\n // ==========================================================================\n\n public get extensionInfo(): ExtensionInfo | null {\n return this._extensionInfo;\n }\n\n public get context(): ApplicationContext | null {\n return this._context;\n }\n\n // ==========================================================================\n // Subscriptions\n // ==========================================================================\n\n public subscribe(callback: () => void): () => void {\n this.reactiveSubscribers.add(callback);\n return () => {\n this.reactiveSubscribers.delete(callback);\n };\n }\n\n // ==========================================================================\n // Table Name Utilities\n // ==========================================================================\n\n public getTableName(tableName: string): string {\n return getExtensionTableName(this._extensionInfo, tableName);\n }\n\n public getDependencyTableName(publicKey: string, extensionName: string, tableName: string): string {\n return getDependencyTableNameFn(publicKey, extensionName, tableName);\n }\n\n public parseTableName(fullTableName: string): { publicKey: string; extensionName: string; tableName: string } | null {\n return parseTableNameFn(fullTableName);\n }\n\n // ==========================================================================\n // Database\n // ==========================================================================\n\n public initializeDatabase<T extends Record<string, unknown>>(schema: T): SqliteRemoteDatabase<T> {\n const db = createDrizzleInstance(schema, this._extensionInfo, this.request.bind(this), this.log.bind(this));\n this.orm = db as SqliteRemoteDatabase<Record<string, unknown>>;\n return db;\n }\n\n public async query<T = Record<string, unknown>>(sql: string, params: unknown[] = []): Promise<T[]> {\n return queryRaw<T>(sql, params, this.request.bind(this), this.config.debug);\n }\n\n public async select<T = Record<string, unknown>>(sql: string, params: unknown[] = []): Promise<T[]> {\n return this.query<T>(sql, params);\n }\n\n public async execute(sql: string, params: unknown[] = []): Promise<{ rowsAffected: number; lastInsertId?: number }> {\n return executeRaw(sql, params, this.request.bind(this));\n }\n\n public async registerMigrationsAsync(extensionVersion: string, migrations: Migration[]): Promise<MigrationResult> {\n return this.database.registerMigrationsAsync(extensionVersion, migrations);\n }\n\n // ==========================================================================\n // Dependencies\n // ==========================================================================\n\n public async getDependencies(): Promise<ExtensionInfo[]> {\n return this.request<ExtensionInfo[]>(\"extensions.getDependencies\");\n }\n\n // ==========================================================================\n // Permissions\n // ==========================================================================\n\n public async requestDatabasePermission(request: DatabasePermissionRequest): Promise<PermissionResponse> {\n return this.request<PermissionResponse>(\"permissions.database.request\", {\n resource: request.resource,\n operation: request.operation,\n reason: request.reason,\n });\n }\n\n public async checkDatabasePermission(resource: string, operation: \"read\" | \"write\"): Promise<boolean> {\n const response = await this.request<PermissionResponse>(\"permissions.database.check\", { resource, operation });\n return response.status === \"granted\";\n }\n\n // ==========================================================================\n // Search\n // ==========================================================================\n\n public async respondToSearch(requestId: string, results: SearchResult[]): Promise<void> {\n await this.request(\"search.respond\", { requestId, results });\n }\n\n // ==========================================================================\n // External Requests\n // ==========================================================================\n\n public onExternalRequest(action: string, handler: ExternalRequestHandler): () => void {\n return registerExternalHandler(action, handler, this.externalRequestHandlers, this.log.bind(this));\n }\n\n public async respondToExternalRequest(response: ExternalResponse): Promise<void> {\n await respondToExternalRequest(response, this.request.bind(this));\n }\n\n // ==========================================================================\n // Events\n // ==========================================================================\n\n public on(eventType: string, callback: EventCallback): void {\n addEventListener(eventType, callback, this.eventListeners);\n }\n\n public off(eventType: string, callback: EventCallback): void {\n removeEventListener(eventType, callback, this.eventListeners);\n }\n\n // ==========================================================================\n // Communication\n // ==========================================================================\n\n public async request<T = unknown, P = Record<string, unknown>>(method: string, params?: P): Promise<T> {\n const resolvedParams = (params ?? {}) as Record<string, unknown>;\n\n if (this.isNativeWindow && hasTauri()) {\n return sendInvoke<T>(method, resolvedParams, this.config, this.log.bind(this));\n }\n\n const requestId = generateRequestId(++this.requestCounter);\n return sendPostMessage<T>(method, resolvedParams, requestId, this.config, this._extensionInfo, this.pendingRequests);\n }\n\n // ==========================================================================\n // Private: Initialization\n // ==========================================================================\n\n private async init(): Promise<void> {\n if (this.initialized) return;\n\n // Check iframe mode FIRST before attempting Tauri calls\n // This prevents hanging on Android where __TAURI__ exists but sandboxed iframes can't access it\n if (!isInIframe() && hasTauri()) {\n try {\n await this.initNative();\n return;\n } catch (error) {\n this.log(\"Tauri commands failed, falling back to iframe mode\", error);\n }\n }\n\n await this.initIframe();\n }\n\n private async initNative(): Promise<void> {\n const { extensionInfo, context } = await initNativeMode(\n {\n config: this.config,\n state: {\n initialized: this.initialized,\n isNativeWindow: this.isNativeWindow,\n requestCounter: this.requestCounter,\n setupCompleted: this._setupCompleted,\n extensionInfo: this._extensionInfo,\n context: this._context,\n orm: this.orm,\n },\n collections: {\n pendingRequests: this.pendingRequests,\n eventListeners: this.eventListeners,\n externalRequestHandlers: this.externalRequestHandlers,\n reactiveSubscribers: this.reactiveSubscribers,\n },\n promises: {\n readyPromise: this.readyPromise,\n resolveReady: this.resolveReady,\n setupPromise: this.setupPromise,\n setupHook: this.setupHook,\n },\n handlers: {\n messageHandler: this.messageHandler,\n },\n },\n this.log.bind(this),\n this.handleEvent.bind(this),\n (ctx) => {\n this._context = ctx;\n this.notifySubscribersInternal();\n }\n );\n\n this._extensionInfo = extensionInfo;\n this._context = context;\n this.isNativeWindow = true;\n this.initialized = true;\n\n this.notifySubscribersInternal();\n this.resolveReady();\n }\n\n private async initIframe(): Promise<void> {\n this.messageHandler = createMessageHandler(\n this.config,\n this.pendingRequests,\n () => this._extensionInfo,\n this.handleEvent.bind(this)\n );\n\n const { context } = await initIframeMode(\n {\n config: this.config,\n state: {\n initialized: this.initialized,\n isNativeWindow: this.isNativeWindow,\n requestCounter: this.requestCounter,\n setupCompleted: this._setupCompleted,\n extensionInfo: this._extensionInfo,\n context: this._context,\n orm: this.orm,\n },\n collections: {\n pendingRequests: this.pendingRequests,\n eventListeners: this.eventListeners,\n externalRequestHandlers: this.externalRequestHandlers,\n reactiveSubscribers: this.reactiveSubscribers,\n },\n promises: {\n readyPromise: this.readyPromise,\n resolveReady: this.resolveReady,\n setupPromise: this.setupPromise,\n setupHook: this.setupHook,\n },\n handlers: {\n messageHandler: this.messageHandler,\n },\n },\n this.log.bind(this),\n this.messageHandler,\n this.request.bind(this)\n );\n\n // Load extension info from manifest if provided\n if (this.config.manifest) {\n this._extensionInfo = {\n publicKey: this.config.manifest.publicKey,\n name: this.config.manifest.name,\n version: this.config.manifest.version,\n displayName: this.config.manifest.name,\n };\n this.notifySubscribersInternal();\n }\n\n this._context = context;\n this.isNativeWindow = false;\n this.initialized = true;\n\n this.notifySubscribersInternal();\n this.resolveReady();\n }\n\n // ==========================================================================\n // Private: Event Handling\n // ==========================================================================\n\n private handleEvent(event: HaexHubEvent): void {\n processEvent(\n event,\n this.log.bind(this),\n this.eventListeners,\n (ctx) => {\n this._context = ctx;\n this.notifySubscribersInternal();\n },\n (extEvent) => this.handleExternalRequestInternal(extEvent.data)\n );\n }\n\n private async handleExternalRequestInternal(request: import(\"./types\").ExternalRequest): Promise<void> {\n await handleExternalRequest(request, this.externalRequestHandlers, this.respondToExternalRequest.bind(this), this.log.bind(this));\n }\n\n // ==========================================================================\n // Private: Setup\n // ==========================================================================\n\n private async runSetupAsync(): Promise<void> {\n if (!this.setupHook) return;\n\n try {\n this.log(\"[HaexVault] Running setup hook...\");\n await this.setupHook();\n this._setupCompleted = true;\n this.log(\"[HaexVault] Setup completed successfully\");\n this.notifySubscribersInternal();\n } catch (error) {\n this.log(\"[HaexVault] Setup failed:\", error);\n throw error;\n }\n }\n\n // ==========================================================================\n // Private: Utilities\n // ==========================================================================\n\n private notifySubscribersInternal(): void {\n notifySubscribers(this.reactiveSubscribers);\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log(\"[HaexVault SDK]\", ...args);\n }\n }\n}\n","// Import and auto-install polyfills first\n// This ensures localStorage, cookies, and history work in custom protocols\nimport './polyfills';\n\nexport { HaexVaultSdk } from \"./client\";\nexport { DatabaseAPI } from \"./api/database\";\nexport { FilesystemAPI } from \"./api/filesystem\";\nexport { FileSyncAPI } from \"./api/filesync\";\nexport { WebAPI } from \"./api/web\";\nexport { PermissionsAPI } from \"./api/permissions\";\nexport type {\n FileSpace,\n FileInfo,\n FileSyncState,\n StorageBackendInfo,\n StorageBackendType,\n S3BackendConfig,\n BackendConfig,\n SyncRule,\n SyncDirection,\n ConflictStrategy,\n SyncStatus,\n SyncError,\n SyncProgress,\n CreateSpaceOptions,\n AddBackendOptions,\n AddSyncRuleOptions,\n UpdateSyncRuleOptions,\n ListFilesOptions,\n ScanLocalOptions,\n UploadFileOptions,\n DownloadFileOptions,\n LocalFileInfo,\n // Queue types\n QueueOperation,\n QueueStatus,\n SyncQueueEntry,\n AddToQueueOptions,\n QueueFileEntry,\n GetQueueOptions,\n QueueSummary,\n} from \"./api/filesync\";\n\nexport {\n FILE_SYNC_STATE,\n SYNC_DIRECTION,\n STORAGE_BACKEND_TYPE,\n CONFLICT_STRATEGY,\n // Queue constants\n QUEUE_OPERATION,\n QUEUE_STATUS,\n} from \"./api/filesync\";\n\nexport type {\n HaexHubRequest,\n HaexHubResponse,\n HaexHubConfig,\n HaexHubEvent,\n EventCallback,\n PermissionResponse,\n DatabasePermission,\n DatabasePermissionRequest,\n DatabaseQueryParams,\n DatabaseQueryResult,\n DatabaseExecuteParams,\n DatabaseTableInfo,\n DatabaseColumnInfo,\n ExtensionInfo,\n ExtensionManifest,\n ApplicationContext,\n SearchQuery,\n SearchResult,\n ContextChangedEvent,\n SearchRequestEvent,\n ExternalRequestEvent,\n ExternalRequest,\n ExternalResponse,\n ExternalRequestHandler,\n AuthorizedClient,\n BlockedClient,\n RequestedExtension,\n PendingAuthorization,\n ExternalAuthDecision,\n SessionAuthorization,\n ExternalConnection,\n WebRequestOptions,\n WebResponse,\n} from \"./types\";\n\nexport {\n PermissionStatus,\n ErrorCode,\n DEFAULT_TIMEOUT,\n TABLE_SEPARATOR,\n getTableName,\n ExternalConnectionState,\n ExternalConnectionErrorCode,\n isExternalClientConnected,\n canExternalClientSendRequests,\n} from \"./types\";\nexport { HaexVaultSdkError } from \"./types\";\n\n// Export event constants\nexport { HAEXTENSION_EVENTS, type HaextensionEvent, EXTERNAL_EVENTS, type ExternalEvent } from './events';\n\n// Export method constants\nexport { HAEXTENSION_METHODS, type HaextensionMethod } from './methods';\n\n// Export message type constants\nexport { HAEXSPACE_MESSAGE_TYPES, type HaexspaceMessageType } from './messages';\n\n// Export Tauri command constants (for use in other projects like haex-vault)\nexport { TAURI_COMMANDS, type TauriCommand } from './commands';\n\n// Export polyfill utilities for manual control if needed\nexport {\n installPolyfills,\n installLocalStoragePolyfill,\n installSessionStoragePolyfill,\n installCookiePolyfill,\n installHistoryPolyfill,\n installBaseTag,\n} from './polyfills';\n\n// Export config type only (utilities are Node.js-only and exported separately)\nexport type { HaextensionConfig } from './config';\n\n// Export browser-compatible signature verification\nexport {\n verifyExtensionSignature,\n sortObjectKeysRecursively,\n hexToBytes,\n type VerifyResult,\n type ZipFileEntry,\n} from './crypto/verify';\n\n// Export vault key crypto utilities\nexport {\n deriveKeyFromPassword,\n generateVaultKey,\n encryptString,\n decryptString,\n encryptVaultKey,\n decryptVaultKey,\n decryptVaultName,\n encryptCrdtData,\n decryptCrdtData,\n wrapKey,\n unwrapKey,\n arrayBufferToBase64,\n base64ToArrayBuffer,\n} from './crypto/vaultKey';\n\nimport { HaexVaultSdk } from \"./client\";\nimport type { HaexHubConfig } from \"./types\";\n\nexport function createHaexVaultSdk(\n config: HaexHubConfig = {}\n) {\n return new HaexVaultSdk(config);\n}\n","/**\n * Vue 3 Integration for HaexVault SDK\n *\n * Provides a Vue composable that automatically creates reactive refs\n * for extension info and application context.\n *\n * @example\n * ```typescript\n * import { useHaexVaultSdk } from '@haex-space/vault-sdk/vue';\n *\n * const { extensionInfo, context, db, storage } = useHaexVaultSdk();\n *\n * // Use directly in templates - automatically reactive!\n * console.log(extensionInfo.value);\n * console.log(context.value);\n * ```\n */\n\nimport { ref, readonly } from 'vue';\nimport type { Ref } from 'vue';\nimport { createHaexVaultSdk } from './index';\nimport { HaexVaultSdk } from './client';\nimport type { ExtensionInfo, ApplicationContext, HaexHubConfig } from './types';\n\n// Shared reactive SDK instance - initialized once at module level\nlet clientInstance: HaexVaultSdk | null = null;\nlet extensionInfo: Ref<ExtensionInfo | null> | null = null;\nlet context: Ref<ApplicationContext | null> | null = null;\nlet isSetupComplete: Ref<boolean> | null = null;\n\n/**\n * Vue 3 composable for HaexVault SDK\n *\n * Creates a singleton SDK client with reactive properties that automatically\n * update when the SDK receives new data from the parent application.\n *\n * @param config - Optional SDK configuration\n * @returns Reactive SDK instance with extensionInfo, context, db, and storage\n */\nexport function useHaexVaultSdk(config: HaexHubConfig = {}) {\n // Initialize SDK only once\n if (!clientInstance) {\n clientInstance = createHaexVaultSdk(config);\n extensionInfo = ref<ExtensionInfo | null>(clientInstance.extensionInfo);\n context = ref<ApplicationContext | null>(clientInstance.context);\n isSetupComplete = ref<boolean>(false);\n\n // Subscribe to SDK changes and update reactive refs\n clientInstance.subscribe(() => {\n if (extensionInfo) {\n extensionInfo.value = clientInstance!.extensionInfo;\n }\n if (context) {\n context.value = clientInstance!.context;\n }\n if (isSetupComplete) {\n isSetupComplete.value = clientInstance!.setupCompleted;\n }\n });\n\n // Note: We DON'T call setupComplete() automatically anymore!\n // The extension must call it after registering the setup hook.\n // This prevents race conditions where setupComplete() is called before the hook is registered.\n }\n\n return {\n client: clientInstance,\n extensionInfo: readonly(extensionInfo!),\n context: readonly(context!),\n isSetupComplete: readonly(isSetupComplete!),\n db: clientInstance.orm,\n storage: clientInstance.storage,\n getTableName: clientInstance.getTableName.bind(clientInstance),\n };\n}\n\n/**\n * Get the raw HaexVault SDK client instance (non-reactive)\n * Useful for direct API calls without Vue reactivity overhead\n */\nexport function getHaexVaultSdk(): HaexVaultSdk | null {\n return clientInstance;\n}\n"]}