@haex-space/vault-sdk 2.3.14 → 2.3.16
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/{client-BdeVsDdi.d.mts → client-8eGxojZ1.d.mts} +197 -2
- package/dist/{client-Ctv_qXuk.d.ts → client-ChH7wiuU.d.ts} +197 -2
- package/dist/index.d.mts +37 -3
- package/dist/index.d.ts +37 -3
- package/dist/index.js +274 -4
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +272 -5
- package/dist/index.mjs.map +1 -1
- package/dist/react.d.mts +1 -1
- package/dist/react.d.ts +1 -1
- package/dist/react.js +235 -4
- package/dist/react.js.map +1 -1
- package/dist/react.mjs +235 -4
- package/dist/react.mjs.map +1 -1
- package/dist/runtime/nuxt.plugin.client.d.mts +1 -1
- package/dist/runtime/nuxt.plugin.client.d.ts +1 -1
- package/dist/runtime/nuxt.plugin.client.js +235 -4
- package/dist/runtime/nuxt.plugin.client.js.map +1 -1
- package/dist/runtime/nuxt.plugin.client.mjs +235 -4
- package/dist/runtime/nuxt.plugin.client.mjs.map +1 -1
- package/dist/svelte.d.mts +1 -1
- package/dist/svelte.d.ts +1 -1
- package/dist/svelte.js +235 -4
- package/dist/svelte.js.map +1 -1
- package/dist/svelte.mjs +235 -4
- package/dist/svelte.mjs.map +1 -1
- package/dist/vue.d.mts +1 -1
- package/dist/vue.d.ts +1 -1
- package/dist/vue.js +235 -4
- package/dist/vue.js.map +1 -1
- package/dist/vue.mjs +235 -4
- package/dist/vue.mjs.map +1 -1
- package/package.json +1 -1
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/methods.ts","../src/types.ts","../src/api/storage.ts","../src/api/database.ts","../src/api/filesystem.ts","../src/api/web.ts","../src/api/permissions.ts","../src/client.ts","../src/index.ts","../src/vue.ts"],"names":["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 { createHaexVaultClient } 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 HaexVaultClient 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\n /** External request from authorized client (browser extension, CLI, server, etc.) */\n EXTERNAL_REQUEST: 'haextension:external:request',\n} as const;\n\nexport type HaextensionEvent = typeof HAEXTENSION_EVENTS[keyof typeof HAEXTENSION_EVENTS];\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 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 { HAEXTENSION_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?: HaexHubError;\n}\n\nexport interface HaexHubError {\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}\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 HAEXTENSION_EVENTS.EXTERNAL_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\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 HaexHubError 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 = \"HaexHubError\";\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","import type { HaexVaultClient } from \"~/client\";\nimport { HAEXTENSION_METHODS } from \"~/methods\";\n\nexport class StorageAPI {\n constructor(private client: HaexVaultClient) {}\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 { HaexVaultClient } from \"../client\";\nimport type { DatabaseQueryResult, MigrationResult, Migration } from \"../types\";\nimport { HAEXTENSION_METHODS } from \"../methods\";\n\nexport class DatabaseAPI {\n constructor(private client: HaexVaultClient) {}\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 { HaexVaultClient } from \"../client\";\nimport { HAEXTENSION_METHODS } from \"../methods\";\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 constructor(private client: HaexVaultClient) {}\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 { HaexVaultClient } from \"../client\";\nimport type { WebRequestOptions, WebResponse } from \"../types\";\nimport { HAEXTENSION_METHODS } from \"../methods\";\n\nexport class WebAPI {\n constructor(private client: HaexVaultClient) {}\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 { HaexVaultClient } from \"../client\";\nimport type { PermissionResponse } from \"../types\";\n\nexport class PermissionsAPI {\n constructor(private client: HaexVaultClient) {}\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","import { HAEXTENSION_EVENTS } from './events';\nimport { HAEXTENSION_METHODS } from './methods';\nimport { HAEXSPACE_MESSAGE_TYPES } from './messages';\nimport type {\n HaexHubRequest,\n HaexHubResponse,\n HaexHubConfig,\n HaexHubEvent,\n EventCallback,\n PermissionResponse,\n DatabasePermissionRequest,\n ExtensionInfo,\n ApplicationContext,\n SearchResult,\n ContextChangedEvent,\n DatabaseQueryResult,\n MigrationResult,\n Migration,\n ExternalRequest,\n ExternalResponse,\n ExternalRequestHandler,\n ExternalRequestEvent,\n} from \"./types\";\nimport {\n ErrorCode,\n DEFAULT_TIMEOUT,\n TABLE_SEPARATOR,\n HaexHubError,\n getTableName,\n} 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 { drizzle, type SqliteRemoteDatabase } from \"drizzle-orm/sqlite-proxy\";\n\nexport class HaexVaultClient {\n private config: Required<Omit<HaexHubConfig, \"manifest\">> & {\n manifest?: HaexHubConfig[\"manifest\"];\n };\n private pendingRequests: Map<\n string,\n {\n resolve: (value: any) => void;\n reject: (error: any) => void;\n timeout: NodeJS.Timeout;\n }\n > = new Map();\n private eventListeners: Map<string, Set<EventCallback>> = new Map();\n private externalRequestHandlers: Map<string, ExternalRequestHandler> = new Map();\n private messageHandler: ((event: MessageEvent) => void) | null = null;\n private initialized = false;\n private requestCounter = 0;\n private _extensionInfo: ExtensionInfo | null = null;\n private _context: ApplicationContext | null = null;\n private reactiveSubscribers: Set<() => void> = new Set();\n private isNativeWindow = false;\n\n private readyPromise: Promise<void>;\n private resolveReady!: () => void; // Wird im Konstruktor initialisiert\n\n private setupPromise: Promise<void> | null = null;\n private setupHook: (() => Promise<void>) | null = null;\n private _setupCompleted = false;\n\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 // Install console forwarding if in debug mode\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 * Gibt ein Promise zurück, das aufgelöst wird, sobald der Client\n * initialisiert ist und Extension-Infos empfangen hat.\n */\n public async ready(): Promise<void> {\n return this.readyPromise;\n }\n\n /**\n * Gibt zurück, ob das Setup bereits abgeschlossen wurde.\n */\n public get setupCompleted(): boolean {\n return this._setupCompleted;\n }\n\n /**\n * Registriert eine Setup-Funktion, die nach der Initialisierung ausgeführt wird.\n * Diese Funktion sollte für Aufgaben wie Tabellenerstellung, Migrationen, etc. verwendet werden.\n * @param setupFn Die Setup-Funktion, die ausgeführt werden soll\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 /**\n * Gibt ein Promise zurück, das aufgelöst wird, sobald der Client vollständig eingerichtet ist.\n * Dies umfasst die Initialisierung UND das Setup (z.B. Tabellenerstellung).\n * Falls kein Setup-Hook registriert wurde, entspricht dies ready().\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 private async runSetupAsync(): Promise<void> {\n if (!this.setupHook) return;\n\n try {\n this.log('[HaexSpace] Running setup hook...');\n await this.setupHook();\n this._setupCompleted = true;\n this.log('[HaexSpace] Setup completed successfully');\n\n // Notify subscribers that setup is complete\n this.notifySubscribers();\n } catch (error) {\n this.log('[HaexSpace] Setup failed:', error);\n throw error;\n }\n }\n\n /**\n * Initialisiert die Drizzle-Datenbankinstanz.\n * Muss nach der Definition des Schemas aufgerufen werden.\n * @param schema Das Drizzle-Schemaobjekt (mit bereits geprefixten Tabellennamen).\n * @returns Die typsichere Drizzle-Datenbankinstanz.\n */\n public initializeDatabase<T extends Record<string, unknown>>(\n schema: T\n ): SqliteRemoteDatabase<T> {\n if (!this._extensionInfo) {\n throw new HaexHubError(\n ErrorCode.EXTENSION_INFO_UNAVAILABLE,\n \"errors.client_not_ready\"\n );\n }\n\n const dbInstance = 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 this.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 this.request<DatabaseQueryResult>(HAEXTENSION_METHODS.database.query, {\n query: sql,\n params: params as unknown[],\n });\n\n const rows = result.rows as any[];\n\n if (method === \"get\") {\n return { rows: rows.length > 0 ? rows.at(0) : undefined };\n }\n\n return { rows };\n } catch (error) {\n this.log(\"Database operation failed:\", error);\n throw error;\n }\n },\n {\n schema: schema,\n logger: false,\n }\n );\n\n this.orm = dbInstance;\n return dbInstance;\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 public subscribe(callback: () => void): () => void {\n this.reactiveSubscribers.add(callback);\n return () => {\n this.reactiveSubscribers.delete(callback);\n };\n }\n\n private notifySubscribers(): void {\n this.reactiveSubscribers.forEach((callback) => callback());\n }\n\n public async getDependencies(): Promise<ExtensionInfo[]> {\n return this.request<ExtensionInfo[]>(\"extensions.getDependencies\");\n }\n\n public getTableName(tableName: string): string {\n if (!this._extensionInfo) {\n throw new HaexHubError(\n ErrorCode.EXTENSION_INFO_UNAVAILABLE,\n \"errors.extension_info_unavailable\"\n );\n }\n\n this.validateTableName(tableName);\n\n const { publicKey, name } = this._extensionInfo;\n\n // Return table name wrapped in double quotes to handle special characters (like hyphens in extension names)\n return `\"${getTableName(publicKey, name, tableName)}\"`;\n }\n\n public getDependencyTableName(\n publicKey: string,\n extensionName: string,\n tableName: string\n ): string {\n this.validatePublicKey(publicKey);\n this.validateExtensionName(extensionName);\n this.validateTableName(tableName);\n\n // Return table name wrapped in double quotes to handle special characters\n return `\"${getTableName(publicKey, extensionName, tableName)}\"`;\n }\n\n public parseTableName(fullTableName: string): {\n publicKey: string;\n extensionName: string;\n tableName: string;\n } | 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 /**\n * Execute a raw SQL query (SELECT)\n * Returns rows as an array of objects\n */\n public async query<T = Record<string, unknown>>(\n sql: string,\n params: unknown[] = []\n ): Promise<T[]> {\n const result = await this.request<DatabaseQueryResult>(\n HAEXTENSION_METHODS.database.query,\n { query: sql, params }\n );\n if (this.config.debug) {\n console.log('[SDK query()] Raw result:', JSON.stringify(result, null, 2));\n }\n return result.rows as T[];\n }\n\n /**\n * Alias for query() - more intuitive for SELECT statements\n */\n public async select<T = Record<string, unknown>>(\n sql: string,\n params: unknown[] = []\n ): Promise<T[]> {\n return this.query<T>(sql, params);\n }\n\n /**\n * Execute a raw SQL statement (INSERT, UPDATE, DELETE, CREATE, etc.)\n * Returns rowsAffected and lastInsertId\n */\n public async execute(\n sql: string,\n params: unknown[] = []\n ): Promise<{ rowsAffected: number; lastInsertId?: number }> {\n const result = await this.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 /**\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 public async registerMigrationsAsync(\n extensionVersion: string,\n migrations: Migration[]\n ): Promise<MigrationResult> {\n return this.database.registerMigrationsAsync(extensionVersion, migrations);\n }\n\n public async requestDatabasePermission(\n request: DatabasePermissionRequest\n ): 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(\n resource: string,\n operation: \"read\" | \"write\"\n ): Promise<boolean> {\n const response = await this.request<PermissionResponse>(\n \"permissions.database.check\",\n {\n resource,\n operation,\n }\n );\n return response.status === \"granted\";\n }\n\n public async respondToSearch(\n requestId: string,\n results: SearchResult[]\n ): Promise<void> {\n await this.request(\"search.respond\", {\n requestId,\n results,\n });\n }\n\n /**\n * Register a handler for external requests (from browser extensions, CLI, servers, etc.)\n *\n * @param action - The action/method name to handle (e.g., \"get-logins\", \"get-totp\")\n * @param handler - Function that processes the request and returns a response\n * @returns Unsubscribe function to remove the handler\n *\n * @example\n * ```typescript\n * client.onExternalRequest(\"get-logins\", async (request) => {\n * const entries = await getMatchingEntries(request.payload.url);\n * return {\n * requestId: request.requestId,\n * success: true,\n * data: { entries }\n * };\n * });\n * ```\n */\n public onExternalRequest(\n action: string,\n handler: ExternalRequestHandler\n ): () => void {\n this.externalRequestHandlers.set(action, handler);\n this.log(`[ExternalRequest] Registered handler for action: ${action}`);\n\n return () => {\n this.externalRequestHandlers.delete(action);\n this.log(`[ExternalRequest] Unregistered handler for action: ${action}`);\n };\n }\n\n /**\n * Send a response to an external request back to haex-vault\n * This is called internally after a handler processes a request\n */\n public async respondToExternalRequest(response: ExternalResponse): Promise<void> {\n await this.request(\"external.respond\", response as unknown as Record<string, unknown>);\n }\n\n public async request<T = unknown>(\n method: string,\n params: Record<string, unknown> = {}\n ): Promise<T> {\n // Native window mode: Use Tauri invoke() for direct backend communication\n if (this.isNativeWindow && typeof (window as any).__TAURI__ !== 'undefined') {\n return this.invoke<T>(method, params);\n }\n\n // iframe mode: Use postMessage for communication through parent window\n return this.postMessage<T>(method, params);\n }\n\n private async postMessage<T>(\n method: string,\n params: Record<string, unknown>\n ): Promise<T> {\n const requestId = this.generateRequestId();\n\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 this.pendingRequests.delete(requestId);\n reject(\n new HaexHubError(ErrorCode.TIMEOUT, \"errors.timeout\", {\n timeout: this.config.timeout,\n })\n );\n }, this.config.timeout);\n\n this.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 (this.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:\", this._extensionInfo);\n console.log(\"[SDK Debug] ========================================\");\n }\n\n window.parent.postMessage({ id: requestId, ...request }, targetOrigin);\n });\n }\n\n private async invoke<T>(\n method: string,\n params: Record<string, unknown>\n ): Promise<T> {\n const { invoke } = (window as any).__TAURI__.core as {\n invoke: <R>(cmd: string, args?: Record<string, unknown>) => Promise<R>;\n };\n\n if (this.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 // Map SDK methods to Tauri commands\n switch (method) {\n case HAEXTENSION_METHODS.database.query:\n return invoke<T>(\"webview_extension_db_query\", {\n query: params.query as string,\n params: (params.params as unknown[]) || [],\n });\n\n case HAEXTENSION_METHODS.database.execute:\n return invoke<T>(\"webview_extension_db_execute\", {\n query: params.query as string,\n params: (params.params as unknown[]) || [],\n });\n\n case \"permissions.web.check\":\n return invoke<T>(\"webview_extension_check_web_permission\", {\n url: params.url as string,\n });\n\n case \"permissions.database.check\":\n return invoke<T>(\"webview_extension_check_database_permission\", {\n resource: params.resource as string,\n operation: params.operation as string,\n });\n\n case \"permissions.filesystem.check\":\n return invoke<T>(\"webview_extension_check_filesystem_permission\", {\n path: params.path as string,\n actionStr: params.action as string,\n });\n\n case HAEXTENSION_METHODS.application.open:\n return invoke<T>(\"webview_extension_web_open\", {\n url: params.url as string,\n });\n\n case HAEXTENSION_METHODS.web.fetch:\n return invoke<T>(\"webview_extension_web_request\", {\n url: params.url as string,\n method: params.method as string | undefined,\n headers: params.headers as Record<string, string> | undefined,\n body: params.body as string | undefined,\n });\n\n case HAEXTENSION_METHODS.filesystem.saveFile:\n return invoke<T>(\"webview_extension_fs_save_file\", {\n data: params.data as number[],\n defaultPath: params.defaultPath as string | undefined,\n title: params.title as string | undefined,\n filters: params.filters as Array<{ name: string; extensions: string[] }> | undefined,\n });\n\n case HAEXTENSION_METHODS.filesystem.openFile:\n return invoke<T>(\"webview_extension_fs_open_file\", {\n data: params.data as number[],\n fileName: params.fileName as string,\n });\n\n case HAEXTENSION_METHODS.database.registerMigrations:\n return invoke<T>(\"webview_extension_db_register_migrations\", {\n extensionVersion: params.extensionVersion as string,\n migrations: params.migrations as Array<{ name: string; sql: string }>,\n });\n\n case \"external.respond\":\n return invoke<T>(\"webview_extension_external_respond\", {\n requestId: params.requestId as string,\n success: params.success as boolean,\n data: params.data,\n error: params.error as string | undefined,\n });\n\n default:\n throw new HaexHubError(\n ErrorCode.METHOD_NOT_FOUND,\n \"errors.method_not_found\",\n { method }\n );\n }\n }\n\n public on(eventType: string, callback: EventCallback): void {\n if (!this.eventListeners.has(eventType)) {\n this.eventListeners.set(eventType, new Set());\n }\n this.eventListeners.get(eventType)!.add(callback);\n }\n\n public off(eventType: string, callback: EventCallback): void {\n const listeners = this.eventListeners.get(eventType);\n if (listeners) {\n listeners.delete(callback);\n }\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(\"HaexHub SDK destroyed\");\n }\n\n private async init(): Promise<void> {\n if (this.initialized) return;\n\n // IMPORTANT: 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 const isInIframe = window.self !== window.top;\n\n // Try to detect if we're running in a native WebViewWindow (Tauri)\n // Only attempt this if we're NOT in an iframe\n if (!isInIframe) {\n try {\n if (typeof (window as any).__TAURI__ !== 'undefined') {\n const { invoke } = (window as any).__TAURI__.core as {\n invoke: <T>(cmd: string, args?: Record<string, unknown>) => Promise<T>;\n };\n\n // Try to get extension info from Tauri backend\n this._extensionInfo = await invoke<ExtensionInfo>(\"webview_extension_get_info\");\n this._context = await invoke<ApplicationContext>(\"webview_extension_context_get\");\n\n this.isNativeWindow = true;\n this.initialized = true;\n\n this.log(\"HaexHub SDK initialized in native WebViewWindow mode\");\n this.log(\"Extension info:\", this._extensionInfo);\n this.log(\"Application context:\", this._context);\n\n this.notifySubscribers();\n\n // Listen for context changes via Tauri events\n const { listen } = (window as any).__TAURI__.event as {\n listen: (event: string, handler: (event: any) => void) => Promise<() => void>;\n };\n\n console.log(\"[HaexSpace SDK] Setting up Tauri event listener for:\", HAEXTENSION_EVENTS.CONTEXT_CHANGED);\n\n try {\n await listen(HAEXTENSION_EVENTS.CONTEXT_CHANGED, (event: any) => {\n console.log(\"[HaexSpace SDK] Received Tauri event:\", HAEXTENSION_EVENTS.CONTEXT_CHANGED, event);\n this.log(\"Received context change event:\", event);\n if (event.payload?.context) {\n this._context = event.payload.context;\n console.log(\"[HaexSpace SDK] Updated context to:\", this._context);\n this.handleEvent({\n type: HAEXTENSION_EVENTS.CONTEXT_CHANGED,\n data: { context: this._context },\n timestamp: Date.now(),\n });\n } else {\n console.warn(\"[HaexSpace SDK] Event received but no context in payload:\", event);\n }\n });\n console.log(\"[HaexSpace SDK] Context change listener registered successfully\");\n } catch (error) {\n console.error(\"[HaexSpace SDK] Failed to setup context change listener:\", error);\n this.log(\"Failed to setup context change listener:\", error);\n }\n\n // Listen for external requests via Tauri events\n try {\n await listen(HAEXTENSION_EVENTS.EXTERNAL_REQUEST, (event: any) => {\n this.log(\"Received external request event:\", event);\n if (event.payload) {\n this.handleEvent({\n type: HAEXTENSION_EVENTS.EXTERNAL_REQUEST,\n data: event.payload,\n timestamp: Date.now(),\n });\n }\n });\n console.log(\"[HaexSpace SDK] External request listener registered successfully\");\n } catch (error) {\n console.error(\"[HaexSpace SDK] Failed to setup external request listener:\", error);\n this.log(\"Failed to setup external request listener:\", error);\n }\n\n this.resolveReady();\n return;\n }\n } catch (error) {\n this.log(\"Tauri commands failed, falling back to iframe mode\", error);\n // Fall through to iframe mode\n }\n }\n\n // iframe mode (mobile/web)\n // At this point we should be in an iframe\n if (window.self === window.top) {\n throw new HaexHubError(ErrorCode.NOT_IN_IFRAME, \"errors.not_in_iframe\");\n }\n\n this.messageHandler = this.handleMessage.bind(this);\n window.addEventListener(\"message\", this.messageHandler);\n\n this.isNativeWindow = false;\n this.initialized = true;\n this.log(\"HaexSpace SDK initialized in iframe mode\");\n\n try {\n // Load extension info from manifest (if provided in config)\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.log(\"Extension info loaded from manifest:\", this._extensionInfo);\n this.notifySubscribers();\n }\n\n // Debug: Check window.parent availability\n // Use alert on mobile to bypass console forwarding\n if (typeof window !== 'undefined' && window.parent) {\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 try {\n // Try to send debug info via postMessage\n window.parent.postMessage({\n type: HAEXSPACE_MESSAGE_TYPES.DEBUG,\n data: debugInfo\n }, '*');\n } catch (e) {\n // Fallback to alert\n alert(debugInfo + `\\npostMessage error: ${e}`);\n }\n }\n\n // Request context from HaexHub - this also acts as a handshake\n this._context = await this.request<ApplicationContext>(HAEXTENSION_METHODS.context.get);\n this.log(\"Application context received:\", this._context);\n this.notifySubscribers();\n\n this.resolveReady();\n } catch (error) {\n this.log(\"Failed to load extension info or context:\", error);\n throw error;\n }\n }\n\n private handleMessage(event: MessageEvent): void {\n if (this.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:\", !!this._extensionInfo);\n console.log(\n \"[SDK Debug] Pending requests count:\",\n this.pendingRequests.size\n );\n }\n\n // Verify message comes from parent window (HaexHub)\n if (event.source !== window.parent) {\n if (this.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 if (\"id\" in data && this.pendingRequests.has(data.id)) {\n if (this.config.debug) {\n console.log(\"[SDK Debug] ✅ Found pending request for ID:\", data.id);\n }\n const pending = this.pendingRequests.get(data.id)!;\n clearTimeout(pending.timeout);\n this.pendingRequests.delete(data.id);\n\n if (data.error) {\n if (this.config.debug) {\n console.error(\"[SDK Debug] ❌ Request failed:\", data.error);\n }\n pending.reject(data.error);\n } else {\n if (this.config.debug) {\n console.log(\"[SDK Debug] ✅ Request succeeded:\", data.result);\n }\n pending.resolve(data.result);\n }\n return;\n }\n\n if (\"id\" in data && !this.pendingRequests.has(data.id)) {\n if (this.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(this.pendingRequests.keys())\n );\n }\n }\n\n if (\"type\" in data && data.type) {\n if (this.config.debug) {\n console.log(\"[SDK Debug] Event received:\", data.type);\n }\n this.handleEvent(data as HaexHubEvent);\n }\n\n if (this.config.debug) {\n console.log(\"[SDK Debug] ========== End Message ==========\");\n }\n }\n\n private handleEvent(event: HaexHubEvent): void {\n if (event.type === HAEXTENSION_EVENTS.CONTEXT_CHANGED) {\n const contextEvent = event as ContextChangedEvent;\n this._context = contextEvent.data.context;\n this.log(\"Context updated:\", this._context);\n this.notifySubscribers();\n }\n\n // Handle external requests from authorized clients\n if (event.type === HAEXTENSION_EVENTS.EXTERNAL_REQUEST) {\n const externalEvent = event as ExternalRequestEvent;\n this.handleExternalRequest(externalEvent.data);\n return; // Don't emit to regular event listeners\n }\n\n this.emitEvent(event);\n }\n\n private async handleExternalRequest(request: ExternalRequest): Promise<void> {\n this.log(`[ExternalRequest] Received request: ${request.action} from ${request.publicKey.substring(0, 20)}...`);\n\n const handler = this.externalRequestHandlers.get(request.action);\n\n if (!handler) {\n this.log(`[ExternalRequest] No handler for action: ${request.action}`);\n // Send error response back\n await this.respondToExternalRequest({\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 this.respondToExternalRequest(response);\n this.log(`[ExternalRequest] Response sent for: ${request.action}`);\n } catch (error) {\n this.log(`[ExternalRequest] Handler error:`, error);\n await this.respondToExternalRequest({\n requestId: request.requestId,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n private emitEvent(event: HaexHubEvent): void {\n this.log(\"Event received:\", event);\n const listeners = this.eventListeners.get(event.type);\n if (listeners) {\n listeners.forEach((callback) => callback(event));\n }\n }\n\n private generateRequestId(): string {\n return `req_${++this.requestCounter}`;\n }\n\n private validatePublicKey(publicKey: string): void {\n if (\n !publicKey ||\n typeof publicKey !== \"string\" ||\n publicKey.trim() === \"\"\n ) {\n throw new HaexHubError(\n ErrorCode.INVALID_PUBLIC_KEY,\n \"errors.invalid_public_key\",\n { publicKey }\n );\n }\n }\n\n private validateExtensionName(extensionName: string): void {\n if (!extensionName || !/^[a-z][a-z0-9-]*$/i.test(extensionName)) {\n throw new HaexHubError(\n ErrorCode.INVALID_EXTENSION_NAME,\n \"errors.invalid_extension_name\",\n { extensionName }\n );\n }\n\n if (extensionName.includes(TABLE_SEPARATOR)) {\n throw new HaexHubError(\n ErrorCode.INVALID_EXTENSION_NAME,\n \"errors.extension_name_contains_separator\",\n { extensionName, separator: TABLE_SEPARATOR }\n );\n }\n }\n\n private validateTableName(tableName: string): void {\n if (!tableName || typeof tableName !== \"string\") {\n throw new HaexHubError(\n ErrorCode.INVALID_TABLE_NAME,\n \"errors.table_name_empty\"\n );\n }\n\n if (tableName.includes(TABLE_SEPARATOR)) {\n throw new HaexHubError(\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 HaexHubError(\n ErrorCode.INVALID_TABLE_NAME,\n \"errors.table_name_format\",\n { tableName }\n );\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log(\"[HaexSpace 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 { HaexVaultClient } from \"./client\";\nexport { DatabaseAPI } from \"./api/database\";\nexport { FilesystemAPI } from \"./api/filesystem\";\nexport { WebAPI } from \"./api/web\";\nexport { PermissionsAPI } from \"./api/permissions\";\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 WebRequestOptions,\n WebResponse,\n} from \"./types\";\n\nexport {\n PermissionStatus,\n ErrorCode,\n DEFAULT_TIMEOUT,\n TABLE_SEPARATOR,\n getTableName,\n} from \"./types\";\nexport { HaexHubError } from \"./types\";\n\n// Export event constants\nexport { HAEXTENSION_EVENTS, type HaextensionEvent } 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 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 arrayBufferToBase64,\n base64ToArrayBuffer,\n} from './crypto/vaultKey';\n\nimport { HaexVaultClient } from \"./client\";\nimport type { HaexHubConfig } from \"./types\";\n\nexport function createHaexVaultClient(\n config: HaexHubConfig = {}\n) {\n return new HaexVaultClient(config);\n}\n","/**\n * Vue 3 Integration for HaexHub 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 { useHaexHub } from '@haexhub/sdk/vue';\n *\n * const { extensionInfo, context, db, storage } = useHaexHub();\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 { createHaexVaultClient } from './index';\nimport { HaexVaultClient } from './client';\nimport type { ExtensionInfo, ApplicationContext, HaexHubConfig } from './types';\n\n// Shared reactive SDK instance - initialized once at module level\nlet clientInstance: HaexVaultClient | 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 HaexHub 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 useHaexHub(config: HaexHubConfig = {}) {\n // Initialize SDK only once\n if (!clientInstance) {\n clientInstance = createHaexVaultClient(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 HaexHub client instance (non-reactive)\n * Useful for direct API calls without Vue reactivity overhead\n */\nexport function getHaexVaultClient(): HaexVaultClient | 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/methods.ts","../src/types.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.ts","../src/index.ts","../src/vue.ts"],"names":["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 { createHaexVaultClient } 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 HaexVaultClient 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\n /** External request from authorized client (browser extension, CLI, server, etc.) */\n EXTERNAL_REQUEST: 'haextension:external:request',\n} as const;\n\nexport type HaextensionEvent = typeof HAEXTENSION_EVENTS[keyof typeof HAEXTENSION_EVENTS];\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 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 },\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 { HAEXTENSION_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?: HaexHubError;\n}\n\nexport interface HaexHubError {\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}\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 HAEXTENSION_EVENTS.EXTERNAL_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\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 HaexHubError 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 = \"HaexHubError\";\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","import type { HaexVaultClient } from \"~/client\";\nimport { HAEXTENSION_METHODS } from \"~/methods\";\n\nexport class StorageAPI {\n constructor(private client: HaexVaultClient) {}\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 { HaexVaultClient } from \"../client\";\nimport type { DatabaseQueryResult, MigrationResult, Migration } from \"../types\";\nimport { HAEXTENSION_METHODS } from \"../methods\";\n\nexport class DatabaseAPI {\n constructor(private client: HaexVaultClient) {}\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 { HaexVaultClient } from \"~/client\";\nimport { HAEXTENSION_METHODS } from \"~/methods\";\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\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\nexport interface SyncRule {\n id: string;\n spaceId: string;\n localPath: string;\n backendIds: string[];\n direction: SyncDirection;\n enabled: boolean;\n createdAt: string;\n updatedAt: string;\n}\n\nexport type SyncDirection = \"up\" | \"down\" | \"both\";\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 type: StorageBackendType;\n name: string;\n config: S3BackendConfig;\n}\n\nexport interface AddSyncRuleOptions {\n spaceId: string;\n localPath: string;\n backendIds: string[];\n direction?: SyncDirection;\n}\n\nexport interface ListFilesOptions {\n spaceId: string;\n path?: string;\n recursive?: boolean;\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: HaexVaultClient) {}\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 * 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 * 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 { HaexVaultClient } 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: HaexVaultClient) {\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 { HaexVaultClient } from \"../client\";\nimport type { WebRequestOptions, WebResponse } from \"../types\";\nimport { HAEXTENSION_METHODS } from \"../methods\";\n\nexport class WebAPI {\n constructor(private client: HaexVaultClient) {}\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 { HaexVaultClient } from \"../client\";\nimport type { PermissionResponse } from \"../types\";\n\nexport class PermissionsAPI {\n constructor(private client: HaexVaultClient) {}\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","import { HAEXTENSION_EVENTS } from './events';\nimport { HAEXTENSION_METHODS } from './methods';\nimport { HAEXSPACE_MESSAGE_TYPES } from './messages';\nimport type {\n HaexHubRequest,\n HaexHubResponse,\n HaexHubConfig,\n HaexHubEvent,\n EventCallback,\n PermissionResponse,\n DatabasePermissionRequest,\n ExtensionInfo,\n ApplicationContext,\n SearchResult,\n ContextChangedEvent,\n DatabaseQueryResult,\n MigrationResult,\n Migration,\n ExternalRequest,\n ExternalResponse,\n ExternalRequestHandler,\n ExternalRequestEvent,\n} from \"./types\";\nimport {\n ErrorCode,\n DEFAULT_TIMEOUT,\n TABLE_SEPARATOR,\n HaexHubError,\n getTableName,\n} 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 { drizzle, type SqliteRemoteDatabase } from \"drizzle-orm/sqlite-proxy\";\n\nexport class HaexVaultClient {\n private config: Required<Omit<HaexHubConfig, \"manifest\">> & {\n manifest?: HaexHubConfig[\"manifest\"];\n };\n private pendingRequests: Map<\n string,\n {\n resolve: (value: any) => void;\n reject: (error: any) => void;\n timeout: NodeJS.Timeout;\n }\n > = new Map();\n private eventListeners: Map<string, Set<EventCallback>> = new Map();\n private externalRequestHandlers: Map<string, ExternalRequestHandler> = new Map();\n private messageHandler: ((event: MessageEvent) => void) | null = null;\n private initialized = false;\n private requestCounter = 0;\n private _extensionInfo: ExtensionInfo | null = null;\n private _context: ApplicationContext | null = null;\n private reactiveSubscribers: Set<() => void> = new Set();\n private isNativeWindow = false;\n\n private readyPromise: Promise<void>;\n private resolveReady!: () => void; // Wird im Konstruktor initialisiert\n\n private setupPromise: Promise<void> | null = null;\n private setupHook: (() => Promise<void>) | null = null;\n private _setupCompleted = false;\n\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 // Install console forwarding if in debug mode\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 * Gibt ein Promise zurück, das aufgelöst wird, sobald der Client\n * initialisiert ist und Extension-Infos empfangen hat.\n */\n public async ready(): Promise<void> {\n return this.readyPromise;\n }\n\n /**\n * Gibt zurück, ob das Setup bereits abgeschlossen wurde.\n */\n public get setupCompleted(): boolean {\n return this._setupCompleted;\n }\n\n /**\n * Registriert eine Setup-Funktion, die nach der Initialisierung ausgeführt wird.\n * Diese Funktion sollte für Aufgaben wie Tabellenerstellung, Migrationen, etc. verwendet werden.\n * @param setupFn Die Setup-Funktion, die ausgeführt werden soll\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 /**\n * Gibt ein Promise zurück, das aufgelöst wird, sobald der Client vollständig eingerichtet ist.\n * Dies umfasst die Initialisierung UND das Setup (z.B. Tabellenerstellung).\n * Falls kein Setup-Hook registriert wurde, entspricht dies ready().\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 private async runSetupAsync(): Promise<void> {\n if (!this.setupHook) return;\n\n try {\n this.log('[HaexSpace] Running setup hook...');\n await this.setupHook();\n this._setupCompleted = true;\n this.log('[HaexSpace] Setup completed successfully');\n\n // Notify subscribers that setup is complete\n this.notifySubscribers();\n } catch (error) {\n this.log('[HaexSpace] Setup failed:', error);\n throw error;\n }\n }\n\n /**\n * Initialisiert die Drizzle-Datenbankinstanz.\n * Muss nach der Definition des Schemas aufgerufen werden.\n * @param schema Das Drizzle-Schemaobjekt (mit bereits geprefixten Tabellennamen).\n * @returns Die typsichere Drizzle-Datenbankinstanz.\n */\n public initializeDatabase<T extends Record<string, unknown>>(\n schema: T\n ): SqliteRemoteDatabase<T> {\n if (!this._extensionInfo) {\n throw new HaexHubError(\n ErrorCode.EXTENSION_INFO_UNAVAILABLE,\n \"errors.client_not_ready\"\n );\n }\n\n const dbInstance = 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 this.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 this.request<DatabaseQueryResult>(HAEXTENSION_METHODS.database.query, {\n query: sql,\n params: params as unknown[],\n });\n\n const rows = result.rows as any[];\n\n if (method === \"get\") {\n return { rows: rows.length > 0 ? rows.at(0) : undefined };\n }\n\n return { rows };\n } catch (error) {\n this.log(\"Database operation failed:\", error);\n throw error;\n }\n },\n {\n schema: schema,\n logger: false,\n }\n );\n\n this.orm = dbInstance;\n return dbInstance;\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 public subscribe(callback: () => void): () => void {\n this.reactiveSubscribers.add(callback);\n return () => {\n this.reactiveSubscribers.delete(callback);\n };\n }\n\n private notifySubscribers(): void {\n this.reactiveSubscribers.forEach((callback) => callback());\n }\n\n public async getDependencies(): Promise<ExtensionInfo[]> {\n return this.request<ExtensionInfo[]>(\"extensions.getDependencies\");\n }\n\n public getTableName(tableName: string): string {\n if (!this._extensionInfo) {\n throw new HaexHubError(\n ErrorCode.EXTENSION_INFO_UNAVAILABLE,\n \"errors.extension_info_unavailable\"\n );\n }\n\n this.validateTableName(tableName);\n\n const { publicKey, name } = this._extensionInfo;\n\n // Return table name wrapped in double quotes to handle special characters (like hyphens in extension names)\n return `\"${getTableName(publicKey, name, tableName)}\"`;\n }\n\n public getDependencyTableName(\n publicKey: string,\n extensionName: string,\n tableName: string\n ): string {\n this.validatePublicKey(publicKey);\n this.validateExtensionName(extensionName);\n this.validateTableName(tableName);\n\n // Return table name wrapped in double quotes to handle special characters\n return `\"${getTableName(publicKey, extensionName, tableName)}\"`;\n }\n\n public parseTableName(fullTableName: string): {\n publicKey: string;\n extensionName: string;\n tableName: string;\n } | 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 /**\n * Execute a raw SQL query (SELECT)\n * Returns rows as an array of objects\n */\n public async query<T = Record<string, unknown>>(\n sql: string,\n params: unknown[] = []\n ): Promise<T[]> {\n const result = await this.request<DatabaseQueryResult>(\n HAEXTENSION_METHODS.database.query,\n { query: sql, params }\n );\n if (this.config.debug) {\n console.log('[SDK query()] Raw result:', JSON.stringify(result, null, 2));\n }\n return result.rows as T[];\n }\n\n /**\n * Alias for query() - more intuitive for SELECT statements\n */\n public async select<T = Record<string, unknown>>(\n sql: string,\n params: unknown[] = []\n ): Promise<T[]> {\n return this.query<T>(sql, params);\n }\n\n /**\n * Execute a raw SQL statement (INSERT, UPDATE, DELETE, CREATE, etc.)\n * Returns rowsAffected and lastInsertId\n */\n public async execute(\n sql: string,\n params: unknown[] = []\n ): Promise<{ rowsAffected: number; lastInsertId?: number }> {\n const result = await this.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 /**\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 public async registerMigrationsAsync(\n extensionVersion: string,\n migrations: Migration[]\n ): Promise<MigrationResult> {\n return this.database.registerMigrationsAsync(extensionVersion, migrations);\n }\n\n public async requestDatabasePermission(\n request: DatabasePermissionRequest\n ): 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(\n resource: string,\n operation: \"read\" | \"write\"\n ): Promise<boolean> {\n const response = await this.request<PermissionResponse>(\n \"permissions.database.check\",\n {\n resource,\n operation,\n }\n );\n return response.status === \"granted\";\n }\n\n public async respondToSearch(\n requestId: string,\n results: SearchResult[]\n ): Promise<void> {\n await this.request(\"search.respond\", {\n requestId,\n results,\n });\n }\n\n /**\n * Register a handler for external requests (from browser extensions, CLI, servers, etc.)\n *\n * @param action - The action/method name to handle (e.g., \"get-logins\", \"get-totp\")\n * @param handler - Function that processes the request and returns a response\n * @returns Unsubscribe function to remove the handler\n *\n * @example\n * ```typescript\n * client.onExternalRequest(\"get-logins\", async (request) => {\n * const entries = await getMatchingEntries(request.payload.url);\n * return {\n * requestId: request.requestId,\n * success: true,\n * data: { entries }\n * };\n * });\n * ```\n */\n public onExternalRequest(\n action: string,\n handler: ExternalRequestHandler\n ): () => void {\n this.externalRequestHandlers.set(action, handler);\n this.log(`[ExternalRequest] Registered handler for action: ${action}`);\n\n return () => {\n this.externalRequestHandlers.delete(action);\n this.log(`[ExternalRequest] Unregistered handler for action: ${action}`);\n };\n }\n\n /**\n * Send a response to an external request back to haex-vault\n * This is called internally after a handler processes a request\n */\n public async respondToExternalRequest(response: ExternalResponse): Promise<void> {\n await this.request(\"external.respond\", response as unknown as Record<string, unknown>);\n }\n\n public async request<T = unknown, P = Record<string, unknown>>(\n method: string,\n params?: P\n ): Promise<T> {\n const resolvedParams = (params ?? {}) as Record<string, unknown>;\n\n // Native window mode: Use Tauri invoke() for direct backend communication\n if (this.isNativeWindow && typeof (window as any).__TAURI__ !== 'undefined') {\n return this.invoke<T>(method, resolvedParams);\n }\n\n // iframe mode: Use postMessage for communication through parent window\n return this.postMessage<T>(method, resolvedParams);\n }\n\n private async postMessage<T>(\n method: string,\n params: Record<string, unknown>\n ): Promise<T> {\n const requestId = this.generateRequestId();\n\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 this.pendingRequests.delete(requestId);\n reject(\n new HaexHubError(ErrorCode.TIMEOUT, \"errors.timeout\", {\n timeout: this.config.timeout,\n })\n );\n }, this.config.timeout);\n\n this.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 (this.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:\", this._extensionInfo);\n console.log(\"[SDK Debug] ========================================\");\n }\n\n window.parent.postMessage({ id: requestId, ...request }, targetOrigin);\n });\n }\n\n private async invoke<T>(\n method: string,\n params: Record<string, unknown>\n ): Promise<T> {\n const { invoke } = (window as any).__TAURI__.core as {\n invoke: <R>(cmd: string, args?: Record<string, unknown>) => Promise<R>;\n };\n\n if (this.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 // Map SDK methods to Tauri commands\n switch (method) {\n case HAEXTENSION_METHODS.database.query:\n return invoke<T>(\"webview_extension_db_query\", {\n query: params.query as string,\n params: (params.params as unknown[]) || [],\n });\n\n case HAEXTENSION_METHODS.database.execute:\n return invoke<T>(\"webview_extension_db_execute\", {\n query: params.query as string,\n params: (params.params as unknown[]) || [],\n });\n\n case \"permissions.web.check\":\n return invoke<T>(\"webview_extension_check_web_permission\", {\n url: params.url as string,\n });\n\n case \"permissions.database.check\":\n return invoke<T>(\"webview_extension_check_database_permission\", {\n resource: params.resource as string,\n operation: params.operation as string,\n });\n\n case \"permissions.filesystem.check\":\n return invoke<T>(\"webview_extension_check_filesystem_permission\", {\n path: params.path as string,\n actionStr: params.action as string,\n });\n\n case HAEXTENSION_METHODS.application.open:\n return invoke<T>(\"webview_extension_web_open\", {\n url: params.url as string,\n });\n\n case HAEXTENSION_METHODS.web.fetch:\n return invoke<T>(\"webview_extension_web_request\", {\n url: params.url as string,\n method: params.method as string | undefined,\n headers: params.headers as Record<string, string> | undefined,\n body: params.body as string | undefined,\n });\n\n case HAEXTENSION_METHODS.filesystem.saveFile:\n return invoke<T>(\"webview_extension_fs_save_file\", {\n data: params.data as number[],\n defaultPath: params.defaultPath as string | undefined,\n title: params.title as string | undefined,\n filters: params.filters as Array<{ name: string; extensions: string[] }> | undefined,\n });\n\n case HAEXTENSION_METHODS.filesystem.openFile:\n return invoke<T>(\"webview_extension_fs_open_file\", {\n data: params.data as number[],\n fileName: params.fileName as string,\n });\n\n case HAEXTENSION_METHODS.database.registerMigrations:\n return invoke<T>(\"webview_extension_db_register_migrations\", {\n extensionVersion: params.extensionVersion as string,\n migrations: params.migrations as Array<{ name: string; sql: string }>,\n });\n\n case \"external.respond\":\n return invoke<T>(\"webview_extension_external_respond\", {\n requestId: params.requestId as string,\n success: params.success as boolean,\n data: params.data,\n error: params.error as string | undefined,\n });\n\n default:\n throw new HaexHubError(\n ErrorCode.METHOD_NOT_FOUND,\n \"errors.method_not_found\",\n { method }\n );\n }\n }\n\n public on(eventType: string, callback: EventCallback): void {\n if (!this.eventListeners.has(eventType)) {\n this.eventListeners.set(eventType, new Set());\n }\n this.eventListeners.get(eventType)!.add(callback);\n }\n\n public off(eventType: string, callback: EventCallback): void {\n const listeners = this.eventListeners.get(eventType);\n if (listeners) {\n listeners.delete(callback);\n }\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(\"HaexHub SDK destroyed\");\n }\n\n private async init(): Promise<void> {\n if (this.initialized) return;\n\n // IMPORTANT: 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 const isInIframe = window.self !== window.top;\n\n // Try to detect if we're running in a native WebViewWindow (Tauri)\n // Only attempt this if we're NOT in an iframe\n if (!isInIframe) {\n try {\n if (typeof (window as any).__TAURI__ !== 'undefined') {\n const { invoke } = (window as any).__TAURI__.core as {\n invoke: <T>(cmd: string, args?: Record<string, unknown>) => Promise<T>;\n };\n\n // Try to get extension info from Tauri backend\n this._extensionInfo = await invoke<ExtensionInfo>(\"webview_extension_get_info\");\n this._context = await invoke<ApplicationContext>(\"webview_extension_context_get\");\n\n this.isNativeWindow = true;\n this.initialized = true;\n\n this.log(\"HaexHub SDK initialized in native WebViewWindow mode\");\n this.log(\"Extension info:\", this._extensionInfo);\n this.log(\"Application context:\", this._context);\n\n this.notifySubscribers();\n\n // Listen for context changes via Tauri events\n const { listen } = (window as any).__TAURI__.event as {\n listen: (event: string, handler: (event: any) => void) => Promise<() => void>;\n };\n\n console.log(\"[HaexSpace SDK] Setting up Tauri event listener for:\", HAEXTENSION_EVENTS.CONTEXT_CHANGED);\n\n try {\n await listen(HAEXTENSION_EVENTS.CONTEXT_CHANGED, (event: any) => {\n console.log(\"[HaexSpace SDK] Received Tauri event:\", HAEXTENSION_EVENTS.CONTEXT_CHANGED, event);\n this.log(\"Received context change event:\", event);\n if (event.payload?.context) {\n this._context = event.payload.context;\n console.log(\"[HaexSpace SDK] Updated context to:\", this._context);\n this.handleEvent({\n type: HAEXTENSION_EVENTS.CONTEXT_CHANGED,\n data: { context: this._context },\n timestamp: Date.now(),\n });\n } else {\n console.warn(\"[HaexSpace SDK] Event received but no context in payload:\", event);\n }\n });\n console.log(\"[HaexSpace SDK] Context change listener registered successfully\");\n } catch (error) {\n console.error(\"[HaexSpace SDK] Failed to setup context change listener:\", error);\n this.log(\"Failed to setup context change listener:\", error);\n }\n\n // Listen for external requests via Tauri events\n try {\n await listen(HAEXTENSION_EVENTS.EXTERNAL_REQUEST, (event: any) => {\n this.log(\"Received external request event:\", event);\n if (event.payload) {\n this.handleEvent({\n type: HAEXTENSION_EVENTS.EXTERNAL_REQUEST,\n data: event.payload,\n timestamp: Date.now(),\n });\n }\n });\n console.log(\"[HaexSpace SDK] External request listener registered successfully\");\n } catch (error) {\n console.error(\"[HaexSpace SDK] Failed to setup external request listener:\", error);\n this.log(\"Failed to setup external request listener:\", error);\n }\n\n this.resolveReady();\n return;\n }\n } catch (error) {\n this.log(\"Tauri commands failed, falling back to iframe mode\", error);\n // Fall through to iframe mode\n }\n }\n\n // iframe mode (mobile/web)\n // At this point we should be in an iframe\n if (window.self === window.top) {\n throw new HaexHubError(ErrorCode.NOT_IN_IFRAME, \"errors.not_in_iframe\");\n }\n\n this.messageHandler = this.handleMessage.bind(this);\n window.addEventListener(\"message\", this.messageHandler);\n\n this.isNativeWindow = false;\n this.initialized = true;\n this.log(\"HaexSpace SDK initialized in iframe mode\");\n\n try {\n // Load extension info from manifest (if provided in config)\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.log(\"Extension info loaded from manifest:\", this._extensionInfo);\n this.notifySubscribers();\n }\n\n // Debug: Check window.parent availability\n // Use alert on mobile to bypass console forwarding\n if (typeof window !== 'undefined' && window.parent) {\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 try {\n // Try to send debug info via postMessage\n window.parent.postMessage({\n type: HAEXSPACE_MESSAGE_TYPES.DEBUG,\n data: debugInfo\n }, '*');\n } catch (e) {\n // Fallback to alert\n alert(debugInfo + `\\npostMessage error: ${e}`);\n }\n }\n\n // Request context from HaexHub - this also acts as a handshake\n this._context = await this.request<ApplicationContext>(HAEXTENSION_METHODS.context.get);\n this.log(\"Application context received:\", this._context);\n this.notifySubscribers();\n\n this.resolveReady();\n } catch (error) {\n this.log(\"Failed to load extension info or context:\", error);\n throw error;\n }\n }\n\n private handleMessage(event: MessageEvent): void {\n if (this.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:\", !!this._extensionInfo);\n console.log(\n \"[SDK Debug] Pending requests count:\",\n this.pendingRequests.size\n );\n }\n\n // Verify message comes from parent window (HaexHub)\n if (event.source !== window.parent) {\n if (this.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 if (\"id\" in data && this.pendingRequests.has(data.id)) {\n if (this.config.debug) {\n console.log(\"[SDK Debug] ✅ Found pending request for ID:\", data.id);\n }\n const pending = this.pendingRequests.get(data.id)!;\n clearTimeout(pending.timeout);\n this.pendingRequests.delete(data.id);\n\n if (data.error) {\n if (this.config.debug) {\n console.error(\"[SDK Debug] ❌ Request failed:\", data.error);\n }\n pending.reject(data.error);\n } else {\n if (this.config.debug) {\n console.log(\"[SDK Debug] ✅ Request succeeded:\", data.result);\n }\n pending.resolve(data.result);\n }\n return;\n }\n\n if (\"id\" in data && !this.pendingRequests.has(data.id)) {\n if (this.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(this.pendingRequests.keys())\n );\n }\n }\n\n if (\"type\" in data && data.type) {\n if (this.config.debug) {\n console.log(\"[SDK Debug] Event received:\", data.type);\n }\n this.handleEvent(data as HaexHubEvent);\n }\n\n if (this.config.debug) {\n console.log(\"[SDK Debug] ========== End Message ==========\");\n }\n }\n\n private handleEvent(event: HaexHubEvent): void {\n if (event.type === HAEXTENSION_EVENTS.CONTEXT_CHANGED) {\n const contextEvent = event as ContextChangedEvent;\n this._context = contextEvent.data.context;\n this.log(\"Context updated:\", this._context);\n this.notifySubscribers();\n }\n\n // Handle external requests from authorized clients\n if (event.type === HAEXTENSION_EVENTS.EXTERNAL_REQUEST) {\n const externalEvent = event as ExternalRequestEvent;\n this.handleExternalRequest(externalEvent.data);\n return; // Don't emit to regular event listeners\n }\n\n this.emitEvent(event);\n }\n\n private async handleExternalRequest(request: ExternalRequest): Promise<void> {\n this.log(`[ExternalRequest] Received request: ${request.action} from ${request.publicKey.substring(0, 20)}...`);\n\n const handler = this.externalRequestHandlers.get(request.action);\n\n if (!handler) {\n this.log(`[ExternalRequest] No handler for action: ${request.action}`);\n // Send error response back\n await this.respondToExternalRequest({\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 this.respondToExternalRequest(response);\n this.log(`[ExternalRequest] Response sent for: ${request.action}`);\n } catch (error) {\n this.log(`[ExternalRequest] Handler error:`, error);\n await this.respondToExternalRequest({\n requestId: request.requestId,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n private emitEvent(event: HaexHubEvent): void {\n this.log(\"Event received:\", event);\n const listeners = this.eventListeners.get(event.type);\n if (listeners) {\n listeners.forEach((callback) => callback(event));\n }\n }\n\n private generateRequestId(): string {\n return `req_${++this.requestCounter}`;\n }\n\n private validatePublicKey(publicKey: string): void {\n if (\n !publicKey ||\n typeof publicKey !== \"string\" ||\n publicKey.trim() === \"\"\n ) {\n throw new HaexHubError(\n ErrorCode.INVALID_PUBLIC_KEY,\n \"errors.invalid_public_key\",\n { publicKey }\n );\n }\n }\n\n private validateExtensionName(extensionName: string): void {\n if (!extensionName || !/^[a-z][a-z0-9-]*$/i.test(extensionName)) {\n throw new HaexHubError(\n ErrorCode.INVALID_EXTENSION_NAME,\n \"errors.invalid_extension_name\",\n { extensionName }\n );\n }\n\n if (extensionName.includes(TABLE_SEPARATOR)) {\n throw new HaexHubError(\n ErrorCode.INVALID_EXTENSION_NAME,\n \"errors.extension_name_contains_separator\",\n { extensionName, separator: TABLE_SEPARATOR }\n );\n }\n }\n\n private validateTableName(tableName: string): void {\n if (!tableName || typeof tableName !== \"string\") {\n throw new HaexHubError(\n ErrorCode.INVALID_TABLE_NAME,\n \"errors.table_name_empty\"\n );\n }\n\n if (tableName.includes(TABLE_SEPARATOR)) {\n throw new HaexHubError(\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 HaexHubError(\n ErrorCode.INVALID_TABLE_NAME,\n \"errors.table_name_format\",\n { tableName }\n );\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log(\"[HaexSpace 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 { HaexVaultClient } 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 SyncRule,\n SyncDirection,\n SyncStatus,\n SyncError,\n SyncProgress,\n CreateSpaceOptions,\n AddBackendOptions,\n AddSyncRuleOptions,\n ListFilesOptions,\n UploadFileOptions,\n DownloadFileOptions,\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 WebRequestOptions,\n WebResponse,\n} from \"./types\";\n\nexport {\n PermissionStatus,\n ErrorCode,\n DEFAULT_TIMEOUT,\n TABLE_SEPARATOR,\n getTableName,\n} from \"./types\";\nexport { HaexHubError } from \"./types\";\n\n// Export event constants\nexport { HAEXTENSION_EVENTS, type HaextensionEvent } 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 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 { HaexVaultClient } from \"./client\";\nimport type { HaexHubConfig } from \"./types\";\n\nexport function createHaexVaultClient(\n config: HaexHubConfig = {}\n) {\n return new HaexVaultClient(config);\n}\n","/**\n * Vue 3 Integration for HaexHub 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 { useHaexHub } from '@haexhub/sdk/vue';\n *\n * const { extensionInfo, context, db, storage } = useHaexHub();\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 { createHaexVaultClient } from './index';\nimport { HaexVaultClient } from './client';\nimport type { ExtensionInfo, ApplicationContext, HaexHubConfig } from './types';\n\n// Shared reactive SDK instance - initialized once at module level\nlet clientInstance: HaexVaultClient | 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 HaexHub 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 useHaexHub(config: HaexHubConfig = {}) {\n // Initialize SDK only once\n if (!clientInstance) {\n clientInstance = createHaexVaultClient(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 HaexHub client instance (non-reactive)\n * Useful for direct API calls without Vue reactivity overhead\n */\nexport function getHaexVaultClient(): HaexVaultClient | null {\n return clientInstance;\n}\n"]}
|