@haex-space/vault-sdk 2.5.45 → 2.5.48
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/index.d.mts +1 -36
- package/dist/index.d.ts +1 -36
- package/dist/index.js +50 -194
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +50 -194
- package/dist/index.mjs.map +1 -1
- package/dist/react.js +63 -193
- package/dist/react.js.map +1 -1
- package/dist/react.mjs +63 -193
- package/dist/react.mjs.map +1 -1
- package/dist/runtime/nuxt.plugin.client.js +63 -193
- package/dist/runtime/nuxt.plugin.client.js.map +1 -1
- package/dist/runtime/nuxt.plugin.client.mjs +63 -193
- package/dist/runtime/nuxt.plugin.client.mjs.map +1 -1
- package/dist/svelte.js +63 -193
- package/dist/svelte.js.map +1 -1
- package/dist/svelte.mjs +63 -193
- package/dist/svelte.mjs.map +1 -1
- package/dist/vue.js +63 -193
- package/dist/vue.js.map +1 -1
- package/dist/vue.mjs +63 -193
- package/dist/vue.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/events.ts","../../src/types.ts","../../src/methods.ts","../../src/api/storage.ts","../../src/api/database.ts","../../src/api/filesystem.ts","../../src/api/web.ts","../../src/api/permissions.ts","../../src/api/remoteStorage.ts","../../src/messages.ts","../../src/polyfills/consoleForwarding.ts","../../src/client/tableName.ts","../../src/client/init.ts","../../src/commands.ts","../../src/transport/handlers/database.ts","../../src/transport/handlers/permissions.ts","../../src/transport/handlers/web.ts","../../src/transport/handlers/filesystem.ts","../../src/transport/handlers/external.ts","../../src/transport/handlers/filesync.ts","../../src/transport/handlers/index.ts","../../src/client/transport.ts","../../src/client/events.ts","../../src/client/database.ts","../../src/client/external.ts","../../src/client.ts","../../src/runtime/nuxt.plugin.client.ts"],"names":["drizzle","result","defineNuxtPlugin","shallowRef"],"mappings":"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","file":"nuxt.plugin.client.js","sourcesContent":["/**\n * Central event name definitions for HaexHub extensions\n *\n * Event Naming Schema: haextension:{subject}:{predicate}\n *\n * IMPORTANT: Tauri event names can only contain:\n * - Alphanumeric characters (a-z, A-Z, 0-9)\n * - Hyphens (-)\n * - Slashes (/)\n * - Colons (:)\n * - Underscores (_)\n *\n * NO dots (.) allowed!\n */\n\nexport const HAEXTENSION_EVENTS = {\n /** Context (theme, locale, platform) has changed */\n CONTEXT_CHANGED: 'haextension:context:changed',\n\n /** Search request from HaexHub */\n SEARCH_REQUEST: 'haextension:search:request',\n} as const;\n\nexport type HaextensionEvent = typeof HAEXTENSION_EVENTS[keyof typeof HAEXTENSION_EVENTS];\n\n/**\n * Events for external client communication (browser extensions, CLI tools, servers, etc.)\n */\nexport const EXTERNAL_EVENTS = {\n /** External request from authorized client */\n REQUEST: 'haextension:external:request',\n\n /** New external client requesting authorization */\n AUTHORIZATION_REQUEST: 'external:authorization-request',\n} as const;\n\nexport type ExternalEvent = typeof EXTERNAL_EVENTS[keyof typeof EXTERNAL_EVENTS];\n","import { HAEXTENSION_EVENTS, EXTERNAL_EVENTS } from './events';\n\n// Constants\nexport const DEFAULT_TIMEOUT = 30000; // 30 seconds in milliseconds\nexport const TABLE_SEPARATOR = \"__\"; // Separator for table name components: {publicKey}__{extensionName}__{tableName}\n\n/**\n * Build a fully qualified table name for extensions.\n * Use this in Drizzle schemas to create table names at build time.\n *\n * @param publicKey - The extension's public key (from manifest.json)\n * @param extensionName - The extension name (from manifest.json or package.json)\n * @param tableName - The table name (e.g., \"users\", \"items\")\n * @returns Fully qualified table name: `{publicKey}__{extensionName}__{tableName}`\n *\n * @example\n * ```typescript\n * import { getTableName } from \"@haex-space/vault-sdk\";\n * import manifest from \"../haextension/manifest.json\";\n * import pkg from \"../package.json\";\n *\n * const tableName = (name: string) =>\n * getTableName(manifest.publicKey, manifest.name || pkg.name, name);\n *\n * export const users = sqliteTable(tableName(\"users\"), { ... });\n * ```\n */\nexport function getTableName(\n publicKey: string,\n extensionName: string,\n tableName: string\n): string {\n return `${publicKey}${TABLE_SEPARATOR}${extensionName}${TABLE_SEPARATOR}${tableName}`;\n}\n\n// Core Protocol Types\nexport interface HaexHubRequest {\n method: string;\n params: Record<string, unknown>;\n timestamp: number;\n}\n\nexport interface HaexHubResponse<T = unknown> {\n id: string;\n result?: T;\n error?: HaexVaultSdkErrorData;\n}\n\nexport interface HaexVaultSdkErrorData {\n code: ErrorCode;\n message: string;\n details?: Record<string, unknown>;\n}\n\n// Extension Info (loaded from manifest.json at build time)\nexport interface ExtensionInfo {\n publicKey: string;\n name: string;\n version: string;\n displayName?: string;\n namespace?: string;\n}\n\n// Application Context (provided by HaexHub)\nexport interface ApplicationContext {\n theme: \"light\" | \"dark\" | \"system\";\n locale: string;\n platform:\n | \"linux\"\n | \"macos\"\n | \"ios\"\n | \"freebsd\"\n | \"dragonfly\"\n | \"netbsd\"\n | \"openbsd\"\n | \"solaris\"\n | \"android\"\n | \"windows\"\n | undefined;\n /** Unique device identifier (UUID) for multi-device sync */\n deviceId: string | undefined;\n}\n\n// Search Types\nexport interface SearchQuery {\n query: string;\n filters?: Record<string, unknown>;\n limit?: number;\n}\n\nexport interface SearchResult {\n id: string;\n title: string;\n description?: string;\n type: string;\n data?: Record<string, unknown>;\n score?: number;\n}\n\n// Permission Types\nexport enum PermissionStatus {\n GRANTED = \"granted\",\n DENIED = \"denied\",\n ASK = \"ask\",\n}\n\nexport interface PermissionResponse {\n status: PermissionStatus;\n permanent: boolean;\n}\n\n// Database Permission (matches Rust DbExtensionPermission)\nexport interface DatabasePermission {\n extensionId: string;\n resource: string;\n operation: \"read\" | \"write\";\n path: string;\n}\n\nexport interface DatabasePermissionRequest {\n resource: string;\n operation: \"read\" | \"write\";\n reason?: string;\n}\n\n// Database Types\nexport interface DatabaseQueryParams {\n query: string;\n params?: unknown[];\n}\n\nexport interface DatabaseQueryResult {\n rows: unknown[]; // Array of arrays (each row is an array of values)\n columns?: string[]; // Column names in order\n rowsAffected: number;\n lastInsertId?: number;\n}\n\nexport interface DatabaseExecuteParams {\n statements: string[];\n}\n\n// Migration Types\nexport interface MigrationResult {\n appliedCount: number;\n alreadyAppliedCount: number;\n appliedMigrations: string[];\n}\n\nexport interface Migration {\n name: string;\n sql: string;\n}\n\nexport interface DatabaseTableInfo {\n name: string;\n columns: DatabaseColumnInfo[];\n}\n\nexport interface DatabaseColumnInfo {\n name: string;\n type: string;\n notNull: boolean;\n defaultValue?: unknown;\n primaryKey: boolean;\n}\n\n// Event Types\nexport interface HaexHubEvent {\n type: string;\n data: unknown;\n timestamp: number;\n}\n\n// Specific Event Types\nexport interface ContextChangedEvent extends HaexHubEvent {\n type: typeof HAEXTENSION_EVENTS.CONTEXT_CHANGED;\n data: {\n context: ApplicationContext;\n };\n}\n\nexport interface SearchRequestEvent extends HaexHubEvent {\n type: typeof HAEXTENSION_EVENTS.SEARCH_REQUEST;\n data: {\n query: SearchQuery;\n requestId: string;\n };\n}\n\n/**\n * External request from an authorized client (browser extension, CLI, server, etc.)\n * These requests come through the WebSocket bridge and are routed to the appropriate extension.\n */\nexport interface ExternalRequestEvent extends HaexHubEvent {\n type: typeof EXTERNAL_EVENTS.REQUEST;\n data: ExternalRequest;\n}\n\n/**\n * External request payload\n */\nexport interface ExternalRequest {\n /** Unique request ID for response correlation */\n requestId: string;\n /** Client's public key (Base64 SPKI format, used as identifier) */\n publicKey: string;\n /** Action/method to perform (extension-specific) */\n action: string;\n /** Request payload (extension-specific) */\n payload: Record<string, unknown>;\n}\n\n/**\n * External request response (sent back to the client)\n */\nexport interface ExternalResponse {\n /** Request ID for correlation */\n requestId: string;\n /** Whether the request was successful */\n success: boolean;\n /** Response data (if successful) */\n data?: unknown;\n /** Error message (if failed) */\n error?: string;\n}\n\n/**\n * Handler function type for external requests\n */\nexport type ExternalRequestHandler = (\n request: ExternalRequest\n) => Promise<ExternalResponse> | ExternalResponse;\n\n/**\n * An authorized external client stored in the database\n */\nexport interface AuthorizedClient {\n /** Row ID */\n id: string;\n /** Unique client identifier (public key fingerprint) */\n clientId: string;\n /** Human-readable client name */\n clientName: string;\n /** Client's public key (base64) */\n publicKey: string;\n /** Extension ID this client can access */\n extensionId: string;\n /** When the client was authorized (ISO 8601) */\n authorizedAt: string | null;\n /** Last time the client connected (ISO 8601) */\n lastSeen: string | null;\n}\n\n/**\n * A blocked external client stored in the database\n */\nexport interface BlockedClient {\n /** Row ID */\n id: string;\n /** Unique client identifier (public key fingerprint) */\n clientId: string;\n /** Human-readable client name */\n clientName: string;\n /** Client's public key (base64) */\n publicKey: string;\n /** When the client was blocked (ISO 8601) */\n blockedAt: string | null;\n}\n\n/**\n * Extension requested by an external client\n */\nexport interface RequestedExtension {\n /** Extension name (e.g., \"haex-pass\") */\n name: string;\n /** Extension's public key (hex string from manifest) */\n extensionPublicKey: string;\n}\n\n/**\n * Pending authorization request waiting for user approval\n */\nexport interface PendingAuthorization {\n /** Unique client identifier */\n clientId: string;\n /** Human-readable client name */\n clientName: string;\n /** Client's public key (base64) */\n publicKey: string;\n /** Extensions the client wants to access (pre-selected in authorization dialog) */\n requestedExtensions: RequestedExtension[];\n}\n\n/**\n * Decision type for external authorization prompts\n */\nexport type ExternalAuthDecision = 'allow' | 'deny';\n\n/**\n * Session-based authorization entry (for \"allow once\" authorizations)\n * These are stored in-memory and cleared when haex-vault restarts.\n */\nexport interface SessionAuthorization {\n /** Unique client identifier (public key fingerprint) */\n clientId: string;\n /** Extension ID this client can access */\n extensionId: string;\n}\n\n// ============================================================================\n// External Bridge Connection Types\n// ============================================================================\n\n/**\n * Connection state for external clients connecting to haex-vault via WebSocket.\n * Used by browser extensions, CLI tools, servers, and other external clients.\n */\nexport enum ExternalConnectionState {\n /** Not connected to haex-vault */\n DISCONNECTED = 'disconnected',\n /** Attempting to establish connection */\n CONNECTING = 'connecting',\n /** WebSocket connected but not yet authorized */\n CONNECTED = 'connected',\n /** Connected and waiting for user approval in haex-vault */\n PENDING_APPROVAL = 'pending_approval',\n /** Connected and authorized to communicate */\n PAIRED = 'paired',\n}\n\n/**\n * Error codes for external client connections.\n * Used to identify specific error conditions for i18n in the frontend.\n */\nexport enum ExternalConnectionErrorCode {\n /** No error */\n NONE = 'none',\n /** Client is not authorized (rejected or not yet approved) */\n CLIENT_NOT_AUTHORIZED = 'client_not_authorized',\n /** Client was blocked by the user */\n CLIENT_BLOCKED = 'client_blocked',\n /** Connection to haex-vault failed (not running or network error) */\n CONNECTION_FAILED = 'connection_failed',\n /** Connection timed out */\n CONNECTION_TIMEOUT = 'connection_timeout',\n /** WebSocket connection was closed unexpectedly */\n CONNECTION_CLOSED = 'connection_closed',\n /** Failed to decrypt message (invalid key or corrupted data) */\n DECRYPTION_FAILED = 'decryption_failed',\n /** Invalid message format received */\n INVALID_MESSAGE = 'invalid_message',\n /** Unknown or unspecified error */\n UNKNOWN = 'unknown',\n}\n\n/**\n * Full connection status including state, client ID, and any error\n */\nexport interface ExternalConnection {\n /** Current connection state */\n state: ExternalConnectionState;\n /** Client identifier (derived from public key) */\n clientId: string | null;\n /** Error code for i18n (use this for translations) */\n errorCode: ExternalConnectionErrorCode;\n /** Error message (original message, for logging/debugging) */\n errorMessage: string | null;\n}\n\n/**\n * Check if external client connection state indicates an active connection\n * (connected, pending approval, or paired)\n */\nexport function isExternalClientConnected(state: ExternalConnectionState): boolean {\n return (\n state === ExternalConnectionState.CONNECTED ||\n state === ExternalConnectionState.PENDING_APPROVAL ||\n state === ExternalConnectionState.PAIRED\n );\n}\n\n/**\n * Check if external client can send requests (only when paired/authorized)\n */\nexport function canExternalClientSendRequests(state: ExternalConnectionState): boolean {\n return state === ExternalConnectionState.PAIRED;\n}\n\nexport type EventCallback = (event: HaexHubEvent) => void;\n\n// Manifest Types\nexport interface ExtensionManifest {\n name: string;\n version: string;\n author?: string | null;\n entry?: string | null;\n icon?: string | null;\n publicKey: string;\n signature: string;\n permissions: {\n database?: any[];\n filesystem?: any[];\n http?: any[];\n shell?: any[];\n };\n homepage?: string | null;\n description?: string | null;\n singleInstance?: boolean | null;\n displayMode?: \"auto\" | \"window\" | \"iframe\" | null;\n /**\n * Path to the migrations directory relative to the extension root.\n * Contains Drizzle-style migrations with meta/_journal.json and *.sql files.\n * These migrations will be applied when the extension is installed.\n * Example: \"database/migrations\"\n */\n migrationsDir?: string | null;\n}\n\n// Config Types\nexport interface HaexHubConfig {\n debug?: boolean;\n timeout?: number;\n /** Extension manifest data (auto-injected by framework integrations) */\n manifest?: ExtensionManifest;\n}\n\n// Web/Fetch Types\nexport interface WebRequestOptions {\n method?: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\" | \"HEAD\" | \"OPTIONS\";\n headers?: Record<string, string>;\n body?: string | ArrayBuffer | Blob;\n timeout?: number;\n}\n\nexport interface WebResponse {\n status: number;\n statusText: string;\n headers: Record<string, string>;\n body: ArrayBuffer;\n url: string;\n}\n\n// Error Codes\nexport enum ErrorCode {\n // Connection Errors\n TIMEOUT = \"TIMEOUT\",\n NOT_IN_IFRAME = \"NOT_IN_IFRAME\",\n UNAUTHORIZED_ORIGIN = \"UNAUTHORIZED_ORIGIN\",\n\n // Permission Errors\n PERMISSION_DENIED = \"PERMISSION_DENIED\",\n\n // Validation Errors\n INVALID_PUBLIC_KEY = \"INVALID_PUBLIC_KEY\",\n INVALID_EXTENSION_NAME = \"INVALID_EXTENSION_NAME\",\n INVALID_TABLE_NAME = \"INVALID_TABLE_NAME\",\n INVALID_PARAMS = \"INVALID_PARAMS\",\n\n // Extension Errors\n EXTENSION_NOT_INITIALIZED = \"EXTENSION_NOT_INITIALIZED\",\n EXTENSION_INFO_UNAVAILABLE = \"EXTENSION_INFO_UNAVAILABLE\",\n\n // API Errors\n METHOD_NOT_FOUND = \"METHOD_NOT_FOUND\",\n INTERNAL_ERROR = \"INTERNAL_ERROR\",\n DATABASE_ERROR = \"DATABASE_ERROR\",\n WEB_ERROR = \"WEB_ERROR\",\n}\n\nexport class HaexVaultSdkError extends Error {\n constructor(\n public code: ErrorCode,\n public messageKey: string,\n public details?: Record<string, unknown>\n ) {\n super(messageKey);\n this.name = \"HaexVaultSdkError\";\n }\n\n /**\n * Get localized error message\n * @param locale - Locale code (e.g., 'en', 'de')\n * @param translations - Translation object\n */\n getLocalizedMessage(\n locale: string = \"en\",\n translations?: Record<string, Record<string, string>>\n ): string {\n if (!translations || !translations[locale]) {\n return this.messageKey;\n }\n\n let message = translations[locale][this.messageKey] || this.messageKey;\n\n // Replace placeholders with details\n if (this.details) {\n Object.entries(this.details).forEach(([key, value]) => {\n message = message.replace(`{${key}}`, String(value));\n });\n }\n\n return message;\n }\n\n toJSON() {\n return {\n code: this.code,\n message: this.messageKey,\n details: this.details,\n };\n }\n}\n","/**\n * Central request method name definitions for HaexHub SDK\n *\n * Request Naming Schema: haextension:{subject}:{action}\n *\n * These are used for client.request() calls between extensions and HaexHub\n */\n\nexport const HAEXTENSION_METHODS = {\n context: {\n get: 'haextension:context:get',\n },\n\n database: {\n query: 'haextension:database:query',\n execute: 'haextension:database:execute',\n transaction: 'haextension:database:transaction',\n registerMigrations: 'haextension:database:register-migrations',\n },\n\n filesystem: {\n saveFile: 'haextension:filesystem:save-file',\n openFile: 'haextension:filesystem:open-file',\n showImage: 'haextension:filesystem:show-image',\n // Generic FS operations (Phase 2)\n readFile: 'haextension:filesystem:read-file',\n writeFile: 'haextension:filesystem:write-file',\n readDir: 'haextension:filesystem:read-dir',\n mkdir: 'haextension:filesystem:mkdir',\n remove: 'haextension:filesystem:remove',\n exists: 'haextension:filesystem:exists',\n stat: 'haextension:filesystem:stat',\n selectFolder: 'haextension:filesystem:select-folder',\n selectFile: 'haextension:filesystem:select-file',\n rename: 'haextension:filesystem:rename',\n copy: 'haextension:filesystem:copy',\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 // Remote Storage API (S3, WebDAV, FTP, etc.)\n remoteStorage: {\n // Backend Management\n listBackends: 'haextension:remote-storage:list-backends',\n addBackend: 'haextension:remote-storage:add-backend',\n removeBackend: 'haextension:remote-storage:remove-backend',\n testBackend: 'haextension:remote-storage:test-backend',\n // Storage Operations\n upload: 'haextension:remote-storage:upload',\n download: 'haextension:remote-storage:download',\n delete: 'haextension:remote-storage:delete',\n list: 'haextension:remote-storage:list',\n },\n\n web: {\n fetch: 'haextension:web:fetch',\n },\n\n application: {\n open: 'haextension:application:open',\n },\n} as const;\n\n// Helper type to extract all string values from nested object\ntype DeepValues<T> = T extends object\n ? T[keyof T] extends string\n ? T[keyof T]\n : T[keyof T] extends object\n ? DeepValues<T[keyof T]>\n : never\n : never;\n\nexport type HaextensionMethod = DeepValues<typeof HAEXTENSION_METHODS>;\n","import type { HaexVaultSdk } from \"~/client\";\nimport { HAEXTENSION_METHODS } from \"~/methods\";\n\nexport class StorageAPI {\n constructor(private client: HaexVaultSdk) {}\n\n async getItem(key: string): Promise<string | null> {\n return this.client.request<string | null>(HAEXTENSION_METHODS.storage.getItem, { key });\n }\n\n async setItem(key: string, value: string): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.storage.setItem, { key, value });\n }\n\n async removeItem(key: string): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.storage.removeItem, { key });\n }\n\n async clear(): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.storage.clear);\n }\n\n async keys(): Promise<string[]> {\n return this.client.request<string[]>(HAEXTENSION_METHODS.storage.keys);\n }\n}\n","import type { HaexVaultSdk } from \"../client\";\nimport type { DatabaseQueryResult, MigrationResult, Migration } from \"../types\";\nimport { HAEXTENSION_METHODS } from \"../methods\";\n\nexport class DatabaseAPI {\n constructor(private client: HaexVaultSdk) {}\n\n async query<T>(query: string, params?: unknown[]): Promise<T[]> {\n const result = await this.client.request<DatabaseQueryResult>(\n HAEXTENSION_METHODS.database.query,\n {\n query,\n params: params || [],\n }\n );\n\n return result.rows as T[];\n }\n\n async queryOne<T = unknown>(\n query: string,\n params?: unknown[]\n ): Promise<T | null> {\n const rows = await this.query<T>(query, params);\n return rows.length > 0 ? rows[0] ?? null : null;\n }\n\n async execute(\n query: string,\n params?: unknown[]\n ): Promise<DatabaseQueryResult> {\n return this.client.request<DatabaseQueryResult>(HAEXTENSION_METHODS.database.execute, {\n query,\n params: params || [],\n });\n }\n\n async transaction(statements: string[]): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.database.transaction, {\n statements,\n });\n }\n\n async createTable(tableName: string, columns: string): Promise<void> {\n const query = `CREATE TABLE IF NOT EXISTS ${tableName} (${columns})`;\n await this.execute(query);\n }\n\n async dropTable(tableName: string): Promise<void> {\n const query = `DROP TABLE IF EXISTS ${tableName}`;\n await this.execute(query);\n }\n\n /**\n * Registers and applies extension migrations with HaexVault\n *\n * HaexVault will:\n * 1. Validate all SQL statements (ensure only extension's own tables are accessed)\n * 2. Store migrations with applied_at = NULL\n * 3. Query pending migrations sorted by name\n * 4. Apply pending migrations and set up CRDT triggers\n * 5. Mark successful migrations with applied_at timestamp\n *\n * @param extensionVersion - The version of the extension\n * @param migrations - Array of migration objects with name and SQL content\n * @returns Promise with migration result (applied count, already applied count, applied migration names)\n */\n async registerMigrationsAsync(\n extensionVersion: string,\n migrations: Migration[]\n ): Promise<MigrationResult> {\n return this.client.request<MigrationResult>(\n HAEXTENSION_METHODS.database.registerMigrations,\n {\n extensionVersion,\n migrations,\n }\n );\n }\n\n async insert(\n tableName: string,\n data: Record<string, unknown>\n ): Promise<number> {\n const keys = Object.keys(data);\n const values = Object.values(data);\n const placeholders = keys.map(() => \"?\").join(\", \");\n\n const query = `INSERT INTO ${tableName} (${keys.join(\n \", \"\n )}) VALUES (${placeholders})`;\n const result = await this.execute(query, values);\n\n return result.lastInsertId ?? -1;\n }\n\n async update(\n tableName: string,\n data: Record<string, unknown>,\n where: string,\n whereParams?: unknown[]\n ): Promise<number> {\n const keys = Object.keys(data);\n const values = Object.values(data);\n const setClause = keys.map((key) => `${key} = ?`).join(\", \");\n\n const query = `UPDATE ${tableName} SET ${setClause} WHERE ${where}`;\n const result = await this.execute(query, [\n ...values,\n ...(whereParams || []),\n ]);\n\n return result.rowsAffected;\n }\n\n async delete(\n tableName: string,\n where: string,\n whereParams?: unknown[]\n ): Promise<number> {\n const query = `DELETE FROM ${tableName} WHERE ${where}`;\n const result = await this.execute(query, whereParams);\n return result.rowsAffected;\n }\n\n async count(\n tableName: string,\n where?: string,\n whereParams?: unknown[]\n ): Promise<number> {\n const query = where\n ? `SELECT COUNT(*) as count FROM ${tableName} WHERE ${where}`\n : `SELECT COUNT(*) as count FROM ${tableName}`;\n\n const result = await this.queryOne<{ count: number }>(query, whereParams);\n return result?.count ?? 0;\n }\n\n}\n","import type { HaexVaultSdk } from \"../client\";\nimport { HAEXTENSION_METHODS } from \"../methods\";\n\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\n// ============================================================================\n// Generic Filesystem Types (Phase 2)\n// ============================================================================\n\n/**\n * File/directory metadata\n */\nexport interface FileStat {\n /** File size in bytes */\n size: number;\n /** True if this is a file */\n isFile: boolean;\n /** True if this is a directory */\n isDirectory: boolean;\n /** True if this is a symbolic link */\n isSymlink: boolean;\n /** Last modified time (Unix timestamp in milliseconds) */\n modified?: number;\n /** Created time (Unix timestamp in milliseconds) */\n created?: number;\n /** Whether the file is read-only */\n readonly: boolean;\n}\n\n/**\n * Directory entry\n */\nexport interface DirEntry {\n /** Entry name (not full path) */\n name: string;\n /** Full path */\n path: string;\n /** True if this is a file */\n isFile: boolean;\n /** True if this is a directory */\n isDirectory: boolean;\n /** File size in bytes (0 for directories) */\n size: number;\n /** Last modified time (Unix timestamp in milliseconds) */\n modified?: number;\n}\n\n/**\n * Options for selecting a folder\n */\nexport interface SelectFolderOptions {\n /** Dialog title */\n title?: string;\n /** Default path to open */\n defaultPath?: string;\n}\n\n/**\n * Options for selecting files\n */\nexport interface SelectFileOptions {\n /** Dialog title */\n title?: string;\n /** Default path to open */\n defaultPath?: string;\n /** File filters (name -> extensions) */\n filters?: Array<[string, string[]]>;\n /** Allow multiple file selection */\n multiple?: boolean;\n}\n\nexport class FilesystemAPI {\n constructor(private client: HaexVaultSdk) {}\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 // ==========================================================================\n // Generic Filesystem Operations (Phase 2)\n // ==========================================================================\n\n /**\n * Read file contents\n * @param path Absolute path to the file\n * @returns File contents as Uint8Array\n */\n async readFile(path: string): Promise<Uint8Array> {\n const base64 = await this.client.request<string>(\n HAEXTENSION_METHODS.filesystem.readFile,\n { path }\n );\n // Decode base64\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n }\n\n /**\n * Write file contents\n * @param path Absolute path to the file\n * @param data File contents as Uint8Array\n */\n async writeFile(path: string, data: Uint8Array): Promise<void> {\n // Encode to base64\n const base64 = btoa(String.fromCharCode(...data));\n await this.client.request(\n HAEXTENSION_METHODS.filesystem.writeFile,\n { path, data: base64 }\n );\n }\n\n /**\n * Read directory contents\n * @param path Absolute path to the directory\n * @returns Array of directory entries\n */\n async readDir(path: string): Promise<DirEntry[]> {\n return this.client.request<DirEntry[]>(\n HAEXTENSION_METHODS.filesystem.readDir,\n { path }\n );\n }\n\n /**\n * Create a directory (and parent directories if needed)\n * @param path Absolute path to create\n */\n async mkdir(path: string): Promise<void> {\n await this.client.request(\n HAEXTENSION_METHODS.filesystem.mkdir,\n { path }\n );\n }\n\n /**\n * Remove a file or directory\n * @param path Absolute path to remove\n * @param recursive If true, remove directories recursively\n */\n async remove(path: string, recursive = false): Promise<void> {\n await this.client.request(\n HAEXTENSION_METHODS.filesystem.remove,\n { path, recursive }\n );\n }\n\n /**\n * Check if a path exists\n * @param path Absolute path to check\n * @returns True if the path exists\n */\n async exists(path: string): Promise<boolean> {\n return this.client.request<boolean>(\n HAEXTENSION_METHODS.filesystem.exists,\n { path }\n );\n }\n\n /**\n * Get file/directory metadata\n * @param path Absolute path\n * @returns File metadata\n */\n async stat(path: string): Promise<FileStat> {\n return this.client.request<FileStat>(\n HAEXTENSION_METHODS.filesystem.stat,\n { path }\n );\n }\n\n /**\n * Open a folder selection dialog\n * @param options Dialog options\n * @returns Selected folder path, or null if cancelled\n */\n async selectFolder(options: SelectFolderOptions = {}): Promise<string | null> {\n return this.client.request<string | null, SelectFolderOptions>(\n HAEXTENSION_METHODS.filesystem.selectFolder,\n options\n );\n }\n\n /**\n * Open a file selection dialog\n * @param options Dialog options\n * @returns Selected file paths, or null if cancelled\n */\n async selectFile(options: SelectFileOptions = {}): Promise<string[] | null> {\n return this.client.request<string[] | null, SelectFileOptions>(\n HAEXTENSION_METHODS.filesystem.selectFile,\n options\n );\n }\n\n /**\n * Rename/move a file or directory\n * @param from Source path\n * @param to Destination path\n */\n async rename(from: string, to: string): Promise<void> {\n await this.client.request(\n HAEXTENSION_METHODS.filesystem.rename,\n { from, to }\n );\n }\n\n /**\n * Copy a file\n * @param from Source path\n * @param to Destination path\n */\n async copy(from: string, to: string): Promise<void> {\n await this.client.request(\n HAEXTENSION_METHODS.filesystem.copy,\n { from, to }\n );\n }\n}\n","import type { HaexVaultSdk } from \"../client\";\nimport type { WebRequestOptions, WebResponse } from \"../types\";\nimport { HAEXTENSION_METHODS } from \"../methods\";\n\nexport class WebAPI {\n constructor(private client: HaexVaultSdk) {}\n\n /**\n * Performs a web request through the HaexHub host application\n * @param url The URL to fetch\n * @param options Request options (method, headers, body, timeout)\n * @returns Promise resolving to the web response\n */\n async fetchAsync(url: string, options: WebRequestOptions = {}): Promise<WebResponse> {\n // Convert body to base64 if it's an ArrayBuffer or Blob\n let bodyParam: string | undefined;\n\n if (options.body) {\n if (options.body instanceof ArrayBuffer) {\n bodyParam = this.arrayBufferToBase64(options.body);\n } else if (options.body instanceof Blob) {\n bodyParam = await this.blobToBase64(options.body);\n } else {\n bodyParam = options.body;\n }\n }\n\n const response = await this.client.request<{\n status: number;\n statusText: string;\n headers: Record<string, string>;\n body: string; // Base64 encoded\n url: string;\n }>(HAEXTENSION_METHODS.web.fetch, {\n url,\n method: options.method || \"GET\",\n headers: options.headers,\n body: bodyParam,\n timeout: options.timeout,\n });\n\n // Convert base64 body back to ArrayBuffer\n const bodyBuffer = this.base64ToArrayBuffer(response.body);\n\n return {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n body: bodyBuffer,\n url: response.url,\n };\n }\n\n /**\n * Convenience method for JSON requests\n */\n async fetchJsonAsync<T = unknown>(\n url: string,\n options: WebRequestOptions = {}\n ): Promise<T> {\n const response = await this.fetchAsync(url, options);\n const text = new TextDecoder().decode(response.body);\n return JSON.parse(text) as T;\n }\n\n /**\n * Convenience method for text requests\n */\n async fetchTextAsync(url: string, options: WebRequestOptions = {}): Promise<string> {\n const response = await this.fetchAsync(url, options);\n return new TextDecoder().decode(response.body);\n }\n\n /**\n * Convenience method for blob requests\n */\n async fetchBlobAsync(url: string, options: WebRequestOptions = {}): Promise<Blob> {\n const response = await this.fetchAsync(url, options);\n return new Blob([response.body]);\n }\n\n /**\n * Opens a URL in the user's default browser\n * @param url The URL to open\n */\n async openAsync(url: string): Promise<void> {\n await this.client.request<void>(HAEXTENSION_METHODS.application.open, {\n application: \"browser\",\n url,\n });\n }\n\n private arrayBufferToBase64(buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer);\n let binary = '';\n for (let i = 0; i < bytes.byteLength; i++) {\n const byte = bytes[i];\n if (byte === undefined) {\n throw new Error('Invalid byte at index ' + i);\n }\n binary += String.fromCharCode(byte);\n }\n return btoa(binary);\n }\n\n private async blobToBase64(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => {\n const result = reader.result;\n if (typeof result !== 'string') {\n reject(new Error('Failed to read blob as data URL'));\n return;\n }\n const parts = result.split(',');\n const base64 = parts[1];\n if (!base64) {\n reject(new Error('Failed to extract base64 from data URL'));\n return;\n }\n resolve(base64);\n };\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n });\n }\n\n private base64ToArrayBuffer(base64: string): ArrayBuffer {\n const binaryString = atob(base64);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes.buffer;\n }\n}\n","import type { HaexVaultSdk } from \"../client\";\nimport type { PermissionResponse } from \"../types\";\n\nexport class PermissionsAPI {\n constructor(private client: HaexVaultSdk) {}\n\n /**\n * Checks if the extension has permission for a database operation\n * @param resource The database resource (table name or \"*\" for all tables)\n * @param operation The operation type (\"read\" or \"write\")\n * @returns Promise<boolean> indicating if permission is granted\n */\n async checkDatabaseAsync(\n resource: string,\n operation: \"read\" | \"write\"\n ): Promise<boolean> {\n const response = await this.client.request<PermissionResponse>(\n \"permissions.database.check\",\n {\n resource,\n operation,\n }\n );\n return response.status === \"granted\";\n }\n\n /**\n * Checks if the extension has permission for a web request\n * @param url The URL to check (e.g., \"https://example.com/path\")\n * @returns Promise<boolean> indicating if permission is granted\n * @note Method/operation is not checked - permissions apply to all HTTP methods\n */\n async checkWebAsync(url: string): Promise<boolean> {\n const response = await this.client.request<PermissionResponse>(\n \"permissions.web.check\",\n {\n url,\n }\n );\n return response.status === \"granted\";\n }\n\n /**\n * Checks if the extension has permission for a filesystem operation\n * @param path The file or directory path\n * @param operation The operation type (\"read\" or \"write\")\n * @returns Promise<boolean> indicating if permission is granted\n */\n async checkFilesystemAsync(\n path: string,\n operation: \"read\" | \"write\"\n ): Promise<boolean> {\n const response = await this.client.request<PermissionResponse>(\n \"permissions.filesystem.check\",\n {\n path,\n operation,\n }\n );\n return response.status === \"granted\";\n }\n}\n","import type { HaexVaultSdk } from \"~/client\";\nimport { HAEXTENSION_METHODS } from \"~/methods\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Storage backend info (public, without credentials)\n */\nexport interface StorageBackendInfo {\n id: string;\n /** Backend type (e.g., \"s3\") */\n type: string;\n name: string;\n enabled: boolean;\n createdAt: string;\n}\n\n/**\n * S3-compatible backend configuration\n */\nexport interface S3Config {\n /** Custom endpoint URL (for non-AWS S3-compatible services) */\n endpoint?: string;\n /** AWS region or custom region name */\n region: string;\n /** Bucket name */\n bucket: string;\n /** Access key ID */\n accessKeyId: string;\n /** Secret access key */\n secretAccessKey: string;\n /** Use path-style URLs instead of virtual-hosted-style */\n pathStyle?: boolean;\n}\n\n/**\n * Request to add a new storage backend\n */\nexport interface AddBackendRequest {\n /** Display name for the backend */\n name: string;\n /** Backend type (currently only \"s3\") */\n type: \"s3\";\n /** Configuration (structure depends on type) */\n config: S3Config | Record<string, unknown>;\n}\n\n/**\n * Object info from list operation\n */\nexport interface StorageObjectInfo {\n /** Object key */\n key: string;\n /** Size in bytes */\n size: number;\n /** Last modified timestamp (ISO 8601) */\n lastModified?: string;\n}\n\n// ============================================================================\n// Remote Storage API\n// ============================================================================\n\n/**\n * Remote Storage API for S3-compatible (and future WebDAV, FTP) backends.\n *\n * This API provides access to external storage backends configured centrally\n * in haex-vault. Extensions can upload/download files without CORS issues.\n *\n * @example\n * ```typescript\n * // List available backends\n * const backends = await sdk.remoteStorage.backends.list();\n *\n * // Upload data\n * const data = new TextEncoder().encode(\"Hello World\");\n * await sdk.remoteStorage.upload(backendId, \"path/to/file.txt\", data);\n *\n * // Download data\n * const downloaded = await sdk.remoteStorage.download(backendId, \"path/to/file.txt\");\n * ```\n */\nexport class RemoteStorageAPI {\n public readonly backends: BackendManagement;\n\n constructor(private client: HaexVaultSdk) {\n this.backends = new BackendManagement(client);\n }\n\n /**\n * Upload data to a storage backend\n * @param backendId - Backend ID to upload to\n * @param key - Object key (path in the bucket)\n * @param data - Data to upload\n */\n async upload(backendId: string, key: string, data: Uint8Array): Promise<void> {\n const base64 = btoa(String.fromCharCode(...data));\n await this.client.request(HAEXTENSION_METHODS.remoteStorage.upload, {\n backendId,\n key,\n data: base64,\n });\n }\n\n /**\n * Download data from a storage backend\n * @param backendId - Backend ID to download from\n * @param key - Object key (path in the bucket)\n * @returns Downloaded data as Uint8Array\n */\n async download(backendId: string, key: string): Promise<Uint8Array> {\n const base64 = await this.client.request<string>(\n HAEXTENSION_METHODS.remoteStorage.download,\n { backendId, key }\n );\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n }\n\n /**\n * Delete an object from a storage backend\n * @param backendId - Backend ID\n * @param key - Object key to delete\n */\n async delete(backendId: string, key: string): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.remoteStorage.delete, {\n backendId,\n key,\n });\n }\n\n /**\n * List objects in a storage backend\n * @param backendId - Backend ID\n * @param prefix - Optional prefix to filter objects\n * @returns List of objects\n */\n async list(backendId: string, prefix?: string): Promise<StorageObjectInfo[]> {\n return this.client.request<StorageObjectInfo[]>(\n HAEXTENSION_METHODS.remoteStorage.list,\n { backendId, prefix }\n );\n }\n}\n\n/**\n * Backend management operations\n */\nclass BackendManagement {\n constructor(private client: HaexVaultSdk) {}\n\n /**\n * List all available storage backends\n */\n async list(): Promise<StorageBackendInfo[]> {\n return this.client.request<StorageBackendInfo[]>(\n HAEXTENSION_METHODS.remoteStorage.listBackends\n );\n }\n\n /**\n * Add a new storage backend\n * @param request - Backend configuration\n * @returns Created backend info\n */\n async add(request: AddBackendRequest): Promise<StorageBackendInfo> {\n return this.client.request<StorageBackendInfo, AddBackendRequest>(\n HAEXTENSION_METHODS.remoteStorage.addBackend,\n request\n );\n }\n\n /**\n * Remove a storage backend\n * @param backendId - Backend ID to remove\n */\n async remove(backendId: string): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.remoteStorage.removeBackend, {\n backendId,\n });\n }\n\n /**\n * Test connection to a storage backend\n * @param backendId - Backend ID to test\n */\n async test(backendId: string): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.remoteStorage.testBackend, {\n backendId,\n });\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","/**\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 * Table Name Utilities\n *\n * Functions for creating, parsing, and validating table names.\n * Table names follow the format: publicKey__extensionName__tableName\n */\n\nimport {\n ErrorCode,\n TABLE_SEPARATOR,\n HaexVaultSdkError,\n getTableName as buildTableName,\n} from \"../types\";\nimport type { ExtensionInfo } from \"../types\";\n\n/**\n * Table name parse result\n */\nexport interface ParsedTableName {\n publicKey: string;\n extensionName: string;\n tableName: string;\n}\n\n/**\n * Validate a public key\n */\nexport function validatePublicKey(publicKey: string): void {\n if (\n !publicKey ||\n typeof publicKey !== \"string\" ||\n publicKey.trim() === \"\"\n ) {\n throw new HaexVaultSdkError(\n ErrorCode.INVALID_PUBLIC_KEY,\n \"errors.invalid_public_key\",\n { publicKey }\n );\n }\n}\n\n/**\n * Validate an extension name\n */\nexport function validateExtensionName(extensionName: string): void {\n if (!extensionName || !/^[a-z][a-z0-9-]*$/i.test(extensionName)) {\n throw new HaexVaultSdkError(\n ErrorCode.INVALID_EXTENSION_NAME,\n \"errors.invalid_extension_name\",\n { extensionName }\n );\n }\n\n if (extensionName.includes(TABLE_SEPARATOR)) {\n throw new HaexVaultSdkError(\n ErrorCode.INVALID_EXTENSION_NAME,\n \"errors.extension_name_contains_separator\",\n { extensionName, separator: TABLE_SEPARATOR }\n );\n }\n}\n\n/**\n * Validate a table name\n */\nexport function validateTableName(tableName: string): void {\n if (!tableName || typeof tableName !== \"string\") {\n throw new HaexVaultSdkError(\n ErrorCode.INVALID_TABLE_NAME,\n \"errors.table_name_empty\"\n );\n }\n\n if (tableName.includes(TABLE_SEPARATOR)) {\n throw new HaexVaultSdkError(\n ErrorCode.INVALID_TABLE_NAME,\n \"errors.table_name_contains_separator\",\n { tableName, separator: TABLE_SEPARATOR }\n );\n }\n\n if (!/^[a-z][a-z0-9-_]*$/i.test(tableName)) {\n throw new HaexVaultSdkError(\n ErrorCode.INVALID_TABLE_NAME,\n \"errors.table_name_format\",\n { tableName }\n );\n }\n}\n\n/**\n * Get a prefixed table name for the current extension\n * @param extensionInfo The current extension info\n * @param tableName The base table name\n * @returns The fully qualified table name wrapped in quotes\n */\nexport function getExtensionTableName(\n extensionInfo: ExtensionInfo | null,\n tableName: string\n): string {\n if (!extensionInfo) {\n throw new HaexVaultSdkError(\n ErrorCode.EXTENSION_INFO_UNAVAILABLE,\n \"errors.extension_info_unavailable\"\n );\n }\n\n validateTableName(tableName);\n\n const { publicKey, name } = extensionInfo;\n\n // Return table name wrapped in double quotes to handle special characters\n return `\"${buildTableName(publicKey, name, tableName)}\"`;\n}\n\n/**\n * Get a prefixed table name for a dependency extension\n * @param publicKey The dependency's public key\n * @param extensionName The dependency's extension name\n * @param tableName The base table name\n * @returns The fully qualified table name wrapped in quotes\n */\nexport function getDependencyTableName(\n publicKey: string,\n extensionName: string,\n tableName: string\n): string {\n validatePublicKey(publicKey);\n validateExtensionName(extensionName);\n validateTableName(tableName);\n\n // Return table name wrapped in double quotes to handle special characters\n return `\"${buildTableName(publicKey, extensionName, tableName)}\"`;\n}\n\n/**\n * Parse a full table name into its components\n * @param fullTableName The fully qualified table name (optionally quoted)\n * @returns The parsed components or null if invalid\n */\nexport function parseTableName(fullTableName: string): ParsedTableName | null {\n // Remove surrounding quotes if present\n let cleanTableName = fullTableName;\n if (cleanTableName.startsWith('\"') && cleanTableName.endsWith('\"')) {\n cleanTableName = cleanTableName.slice(1, -1);\n }\n\n const parts = cleanTableName.split(TABLE_SEPARATOR);\n\n if (parts.length !== 3) {\n return null;\n }\n\n const [publicKey, extensionName, tableName] = parts;\n\n if (!publicKey || !extensionName || !tableName) {\n return null;\n }\n\n return {\n publicKey,\n extensionName,\n tableName,\n };\n}\n","/**\n * Client Initialization\n *\n * Functions for initializing the client in different modes:\n * - Native WebView mode (Tauri)\n * - IFrame mode (mobile/web)\n */\n\nimport { HAEXTENSION_EVENTS, EXTERNAL_EVENTS } from \"../events\";\nimport { HAEXTENSION_METHODS } from \"../methods\";\nimport { HAEXSPACE_MESSAGE_TYPES } from \"../messages\";\nimport { ErrorCode, HaexVaultSdkError } from \"../types\";\nimport type { ExtensionInfo, ApplicationContext, HaexHubEvent } from \"../types\";\nimport type { ClientContext, ClientConfig, LogFn } from \"./context\";\n\n/**\n * Tauri API types\n */\ninterface TauriInvoke {\n invoke: <T>(cmd: string, args?: Record<string, unknown>) => Promise<T>;\n}\n\ninterface TauriEvent {\n listen: (event: string, handler: (event: { payload: unknown }) => void) => Promise<() => void>;\n}\n\n/**\n * Check if we're running in an iframe\n */\nexport function isInIframe(): boolean {\n return window.self !== window.top;\n}\n\n/**\n * Check if Tauri is available\n */\nexport function hasTauri(): boolean {\n return typeof (window as unknown as { __TAURI__?: unknown }).__TAURI__ !== \"undefined\";\n}\n\n/**\n * Get Tauri core API\n */\nexport function getTauriCore(): TauriInvoke {\n return (window as unknown as { __TAURI__: { core: TauriInvoke } }).__TAURI__.core;\n}\n\n/**\n * Get Tauri event API\n */\nexport function getTauriEvent(): TauriEvent {\n return (window as unknown as { __TAURI__: { event: TauriEvent } }).__TAURI__.event;\n}\n\n/**\n * Initialize in native WebView mode (Tauri)\n */\nexport async function initNativeMode(\n ctx: ClientContext,\n log: LogFn,\n onEvent: (event: HaexHubEvent) => void,\n onContextChange: (context: ApplicationContext) => void\n): Promise<{ extensionInfo: ExtensionInfo; context: ApplicationContext }> {\n const { invoke } = getTauriCore();\n\n // Get extension info from Tauri backend\n const extensionInfo = await invoke<ExtensionInfo>(\"webview_extension_get_info\");\n const context = await invoke<ApplicationContext>(\"webview_extension_context_get\");\n\n ctx.state.isNativeWindow = true;\n ctx.state.initialized = true;\n ctx.state.extensionInfo = extensionInfo;\n ctx.state.context = context;\n\n log(\"HaexVault SDK initialized in native WebViewWindow mode\");\n log(\"Extension info:\", extensionInfo);\n log(\"Application context:\", context);\n\n // Setup Tauri event listeners\n await setupTauriEventListeners(ctx, log, onEvent, onContextChange);\n\n return { extensionInfo, context };\n}\n\n/**\n * Setup Tauri event listeners for context changes and external requests\n */\nasync function setupTauriEventListeners(\n ctx: ClientContext,\n log: LogFn,\n onEvent: (event: HaexHubEvent) => void,\n onContextChange: (context: ApplicationContext) => void\n): Promise<void> {\n const { listen } = getTauriEvent();\n\n console.log(\"[HaexVault SDK] Setting up Tauri event listener for:\", HAEXTENSION_EVENTS.CONTEXT_CHANGED);\n\n // Listen for context changes\n try {\n await listen(HAEXTENSION_EVENTS.CONTEXT_CHANGED, (event) => {\n console.log(\"[HaexVault SDK] Received Tauri event:\", HAEXTENSION_EVENTS.CONTEXT_CHANGED, event);\n log(\"Received context change event:\", event);\n\n const payload = event.payload as { context?: ApplicationContext };\n if (payload?.context) {\n ctx.state.context = payload.context;\n console.log(\"[HaexVault SDK] Updated context to:\", ctx.state.context);\n onContextChange(payload.context);\n onEvent({\n type: HAEXTENSION_EVENTS.CONTEXT_CHANGED,\n data: { context: ctx.state.context },\n timestamp: Date.now(),\n });\n } else {\n console.warn(\"[HaexVault SDK] Event received but no context in payload:\", event);\n }\n });\n console.log(\"[HaexVault SDK] Context change listener registered successfully\");\n } catch (error) {\n console.error(\"[HaexVault SDK] Failed to setup context change listener:\", error);\n log(\"Failed to setup context change listener:\", error);\n }\n\n // Listen for external requests\n try {\n await listen(EXTERNAL_EVENTS.REQUEST, (event) => {\n console.log(\"[HaexVault SDK] ====== EXTERNAL REQUEST RECEIVED ======\");\n console.log(\"[HaexVault SDK] Event payload:\", JSON.stringify(event.payload, null, 2));\n log(\"Received external request event:\", event);\n if (event.payload) {\n onEvent({\n type: EXTERNAL_EVENTS.REQUEST,\n data: event.payload,\n timestamp: Date.now(),\n });\n } else {\n console.warn(\"[HaexVault SDK] External request event has no payload!\");\n }\n });\n console.log(\"[HaexVault SDK] External request listener registered successfully\");\n } catch (error) {\n console.error(\"[HaexVault SDK] Failed to setup external request listener:\", error);\n log(\"Failed to setup external request listener:\", error);\n }\n}\n\n/**\n * Initialize in iframe mode\n */\nexport async function initIframeMode(\n ctx: ClientContext,\n log: LogFn,\n messageHandler: (event: MessageEvent) => void,\n request: <T>(method: string, params?: Record<string, unknown>) => Promise<T>\n): Promise<{ context: ApplicationContext }> {\n // Verify we're in an iframe\n if (!isInIframe()) {\n throw new HaexVaultSdkError(ErrorCode.NOT_IN_IFRAME, \"errors.not_in_iframe\");\n }\n\n // Setup message listener\n ctx.handlers.messageHandler = messageHandler;\n window.addEventListener(\"message\", messageHandler);\n\n ctx.state.isNativeWindow = false;\n ctx.state.initialized = true;\n log(\"HaexVault SDK initialized in iframe mode\");\n\n // Load extension info from manifest if provided\n if (ctx.config.manifest) {\n ctx.state.extensionInfo = {\n publicKey: ctx.config.manifest.publicKey,\n name: ctx.config.manifest.name,\n version: ctx.config.manifest.version,\n displayName: ctx.config.manifest.name,\n };\n log(\"Extension info loaded from manifest:\", ctx.state.extensionInfo);\n }\n\n // Send debug info in debug mode\n sendDebugInfo(ctx.config);\n\n // Request context - this also acts as a handshake\n const context = await request<ApplicationContext>(HAEXTENSION_METHODS.context.get);\n ctx.state.context = context;\n log(\"Application context received:\", context);\n\n return { context };\n}\n\n/**\n * Send debug info to parent window (development only)\n */\nfunction sendDebugInfo(config: ClientConfig): void {\n if (!config.debug) return;\n if (typeof window === \"undefined\" || !window.parent) return;\n\n const debugInfo = `SDK Debug:\\nwindow.parent exists: ${!!window.parent}\\nwindow.parent === window: ${window.parent === window}\\nwindow.self === window.top: ${window.self === window.top}`;\n\n try {\n window.parent.postMessage({\n type: HAEXSPACE_MESSAGE_TYPES.DEBUG,\n data: debugInfo,\n }, \"*\");\n } catch (e) {\n // Fallback to alert only in debug mode\n alert(debugInfo + `\\npostMessage error: ${e}`);\n }\n}\n","/**\n * Tauri Command Names\n *\n * Central definition of all Tauri invoke command names.\n * These must match the #[tauri::command] function names in Rust.\n */\n\nexport const TAURI_COMMANDS = {\n database: {\n query: \"webview_extension_db_query\",\n execute: \"webview_extension_db_execute\",\n registerMigrations: \"webview_extension_db_register_migrations\",\n },\n\n permissions: {\n checkWeb: \"webview_extension_check_web_permission\",\n checkDatabase: \"webview_extension_check_database_permission\",\n checkFilesystem: \"webview_extension_check_filesystem_permission\",\n },\n\n web: {\n open: \"webview_extension_web_open\",\n fetch: \"webview_extension_web_request\",\n },\n\n filesystem: {\n saveFile: \"webview_extension_fs_save_file\",\n openFile: \"webview_extension_fs_open_file\",\n showImage: \"webview_extension_fs_show_image\",\n // Generic filesystem operations (no webview_ prefix because they're global)\n // Permission checks happen in the message handler layer\n readFile: \"filesystem_read_file\",\n writeFile: \"filesystem_write_file\",\n readDir: \"filesystem_read_dir\",\n mkdir: \"filesystem_mkdir\",\n remove: \"filesystem_remove\",\n exists: \"filesystem_exists\",\n stat: \"filesystem_stat\",\n selectFolder: \"filesystem_select_folder\",\n selectFile: \"filesystem_select_file\",\n rename: \"filesystem_rename\",\n copy: \"filesystem_copy\",\n },\n\n external: {\n // Response handling (called by extensions running in WebView)\n respond: \"webview_extension_external_respond\",\n\n // Bridge server management\n bridgeStart: \"external_bridge_start\",\n bridgeStop: \"external_bridge_stop\",\n bridgeGetStatus: \"external_bridge_get_status\",\n\n // Client authorization (unified API with remember flag)\n clientAllow: \"external_client_allow\",\n clientBlock: \"external_client_block\",\n\n // Authorized clients management (permanent - stored in database)\n getAuthorizedClients: \"external_get_authorized_clients\",\n revokeClient: \"external_revoke_client\",\n\n // Session-based authorizations (temporary - cleared when haex-vault restarts)\n getSessionAuthorizations: \"external_get_session_authorizations\",\n revokeSessionAuthorization: \"external_revoke_session_authorization\",\n\n // Blocked clients management\n getBlockedClients: \"external_get_blocked_clients\",\n unblockClient: \"external_unblock_client\",\n isClientBlocked: \"external_is_client_blocked\",\n\n // Pending authorizations\n getPendingAuthorizations: \"external_get_pending_authorizations\",\n },\n\n extension: {\n getInfo: \"webview_extension_get_info\",\n getContext: \"webview_extension_context_get\",\n },\n\n storage: {\n // Backend Management (generic, shared by all extensions)\n // These commands don't use webview_ prefix because storage backends are global,\n // not extension-specific. All extensions share the same storage backends.\n listBackends: \"storage_list_backends\",\n addBackend: \"storage_add_backend\",\n removeBackend: \"storage_remove_backend\",\n testBackend: \"storage_test_backend\",\n // Storage Operations\n upload: \"storage_upload\",\n download: \"storage_download\",\n delete: \"storage_delete\",\n list: \"storage_list\",\n },\n\n filesync: {\n // Spaces (webview_* commands extract extension info from WebviewWindow)\n listSpaces: \"webview_filesync_list_spaces\",\n createSpace: \"webview_filesync_create_space\",\n deleteSpace: \"webview_filesync_delete_space\",\n\n // Files\n listFiles: \"webview_filesync_list_files\",\n getFile: \"webview_filesync_get_file\",\n uploadFile: \"webview_filesync_upload_file\",\n downloadFile: \"webview_filesync_download_file\",\n deleteFile: \"webview_filesync_delete_file\",\n\n // Backends\n listBackends: \"webview_filesync_list_backends\",\n addBackend: \"webview_filesync_add_backend\",\n removeBackend: \"webview_filesync_remove_backend\",\n testBackend: \"webview_filesync_test_backend\",\n\n // Sync Rules\n listSyncRules: \"webview_filesync_list_sync_rules\",\n addSyncRule: \"webview_filesync_add_sync_rule\",\n updateSyncRule: \"webview_filesync_update_sync_rule\",\n removeSyncRule: \"webview_filesync_remove_sync_rule\",\n\n // Sync Operations\n getSyncStatus: \"webview_filesync_get_sync_status\",\n triggerSync: \"webview_filesync_trigger_sync\",\n pauseSync: \"webview_filesync_pause_sync\",\n resumeSync: \"webview_filesync_resume_sync\",\n\n // Conflict Resolution\n resolveConflict: \"webview_filesync_resolve_conflict\",\n\n // UI Helpers (selectFolder doesn't need extension info)\n selectFolder: \"filesync_select_folder\",\n scanLocal: \"webview_filesync_scan_local\",\n\n // Sync Queue\n addToQueue: \"webview_filesync_add_to_queue\",\n getQueue: \"webview_filesync_get_queue\",\n getQueueSummary: \"webview_filesync_get_queue_summary\",\n startQueueEntry: \"webview_filesync_start_queue_entry\",\n completeQueueEntry: \"webview_filesync_complete_queue_entry\",\n failQueueEntry: \"webview_filesync_fail_queue_entry\",\n retryFailedQueue: \"webview_filesync_retry_failed_queue\",\n removeQueueEntry: \"webview_filesync_remove_queue_entry\",\n clearQueue: \"webview_filesync_clear_queue\",\n recoverQueue: \"webview_filesync_recover_queue\",\n },\n\n} as const;\n\n// Type helper to extract command string literals\nexport type TauriCommand =\n | (typeof TAURI_COMMANDS.database)[keyof typeof TAURI_COMMANDS.database]\n | (typeof TAURI_COMMANDS.permissions)[keyof typeof TAURI_COMMANDS.permissions]\n | (typeof TAURI_COMMANDS.web)[keyof typeof TAURI_COMMANDS.web]\n | (typeof TAURI_COMMANDS.filesystem)[keyof typeof TAURI_COMMANDS.filesystem]\n | (typeof TAURI_COMMANDS.external)[keyof typeof TAURI_COMMANDS.external]\n | (typeof TAURI_COMMANDS.extension)[keyof typeof TAURI_COMMANDS.extension]\n | (typeof TAURI_COMMANDS.storage)[keyof typeof TAURI_COMMANDS.storage]\n | (typeof TAURI_COMMANDS.filesync)[keyof typeof TAURI_COMMANDS.filesync];\n","/**\n * Database Handler\n *\n * Maps database SDK methods to Tauri invoke commands\n */\n\nimport { HAEXTENSION_METHODS } from \"../../methods\";\nimport { TAURI_COMMANDS } from \"../../commands\";\nimport type {\n InvokeHandlerMap,\n InvokeMapping,\n DatabaseQueryParams,\n DatabaseMigrationsParams,\n} from \"./types\";\n\nexport const databaseHandlers: InvokeHandlerMap = {\n [HAEXTENSION_METHODS.database.query]: {\n command: TAURI_COMMANDS.database.query,\n args: (p: DatabaseQueryParams) => ({\n query: p.query,\n params: p.params || [],\n }),\n } satisfies InvokeMapping<DatabaseQueryParams>,\n\n [HAEXTENSION_METHODS.database.execute]: {\n command: TAURI_COMMANDS.database.execute,\n args: (p: DatabaseQueryParams) => ({\n query: p.query,\n params: p.params || [],\n }),\n } satisfies InvokeMapping<DatabaseQueryParams>,\n\n [HAEXTENSION_METHODS.database.registerMigrations]: {\n command: TAURI_COMMANDS.database.registerMigrations,\n args: (p: DatabaseMigrationsParams) => ({\n extensionVersion: p.extensionVersion,\n migrations: p.migrations,\n }),\n } satisfies InvokeMapping<DatabaseMigrationsParams>,\n};\n","/**\n * Permissions Handler\n *\n * Maps permission SDK methods to Tauri invoke commands\n */\n\nimport { TAURI_COMMANDS } from \"../../commands\";\nimport type { InvokeHandlerMap, PermissionCheckParams } from \"./types\";\n\nexport const permissionsHandlers: InvokeHandlerMap = {\n \"permissions.web.check\": {\n command: TAURI_COMMANDS.permissions.checkWeb,\n args: (p: PermissionCheckParams) => ({\n url: p.url,\n }),\n },\n\n \"permissions.database.check\": {\n command: TAURI_COMMANDS.permissions.checkDatabase,\n args: (p: PermissionCheckParams) => ({\n resource: p.resource,\n operation: p.operation,\n }),\n },\n\n \"permissions.filesystem.check\": {\n command: TAURI_COMMANDS.permissions.checkFilesystem,\n args: (p: PermissionCheckParams) => ({\n path: p.path,\n actionStr: p.action,\n }),\n },\n};\n","/**\n * Web Handler\n *\n * Maps web/application SDK methods to Tauri invoke commands\n */\n\nimport { HAEXTENSION_METHODS } from \"../../methods\";\nimport { TAURI_COMMANDS } from \"../../commands\";\nimport type { InvokeHandlerMap, WebFetchParams } from \"./types\";\n\ninterface ApplicationOpenParams {\n url: string;\n}\n\nexport const webHandlers: InvokeHandlerMap = {\n [HAEXTENSION_METHODS.application.open]: {\n command: TAURI_COMMANDS.web.open,\n args: (p: ApplicationOpenParams) => ({\n url: p.url,\n }),\n },\n\n [HAEXTENSION_METHODS.web.fetch]: {\n command: TAURI_COMMANDS.web.fetch,\n args: (p: WebFetchParams) => ({\n url: p.url,\n method: p.method,\n headers: p.headers,\n body: p.body,\n }),\n },\n};\n","/**\n * Filesystem Handler\n *\n * Maps filesystem SDK methods to Tauri invoke commands\n */\n\nimport { HAEXTENSION_METHODS } from \"../../methods\";\nimport { TAURI_COMMANDS } from \"../../commands\";\nimport type { InvokeHandlerMap, FilesystemSaveParams, FilesystemOpenParams } from \"./types\";\n\ninterface FilesystemShowImageParams {\n dataUrl: string;\n}\n\nexport const filesystemHandlers: InvokeHandlerMap = {\n [HAEXTENSION_METHODS.filesystem.saveFile]: {\n command: TAURI_COMMANDS.filesystem.saveFile,\n args: (p: FilesystemSaveParams) => ({\n data: p.data,\n defaultPath: p.defaultPath,\n title: p.title,\n filters: p.filters,\n }),\n },\n\n [HAEXTENSION_METHODS.filesystem.openFile]: {\n command: TAURI_COMMANDS.filesystem.openFile,\n args: (p: FilesystemOpenParams) => ({\n data: p.data,\n fileName: p.fileName,\n }),\n },\n\n [HAEXTENSION_METHODS.filesystem.showImage]: {\n command: TAURI_COMMANDS.filesystem.showImage,\n args: (p: FilesystemShowImageParams) => ({\n dataUrl: p.dataUrl,\n }),\n },\n};\n","/**\n * External Handler\n *\n * Maps external request SDK methods to Tauri invoke commands\n */\n\nimport { TAURI_COMMANDS } from \"../../commands\";\nimport type { InvokeHandlerMap, ExternalRespondParams } from \"./types\";\n\nexport const externalHandlers: InvokeHandlerMap = {\n \"external.respond\": {\n command: TAURI_COMMANDS.external.respond,\n args: (p: ExternalRespondParams) => ({\n requestId: p.requestId,\n success: p.success,\n data: p.data,\n error: p.error,\n }),\n },\n};\n","/**\n * FileSync Handler\n *\n * Maps filesync SDK methods to Tauri invoke commands\n */\n\nimport { HAEXTENSION_METHODS } from \"../../methods\";\nimport { TAURI_COMMANDS } from \"../../commands\";\nimport type {\n InvokeHandlerMap,\n FileSyncSpaceParams,\n FileSyncFileParams,\n FileSyncBackendParams,\n FileSyncRuleParams,\n FileSyncConflictParams,\n FileSyncScanLocalParams,\n FileSyncQueueParams,\n} from \"./types\";\n\nexport const filesyncHandlers: InvokeHandlerMap = {\n // ==========================================================================\n // Spaces\n // ==========================================================================\n [HAEXTENSION_METHODS.filesync.listSpaces]: {\n command: TAURI_COMMANDS.filesync.listSpaces,\n args: () => ({}),\n },\n\n [HAEXTENSION_METHODS.filesync.createSpace]: {\n command: TAURI_COMMANDS.filesync.createSpace,\n args: (p: FileSyncSpaceParams) => ({ request: p }),\n },\n\n [HAEXTENSION_METHODS.filesync.deleteSpace]: {\n command: TAURI_COMMANDS.filesync.deleteSpace,\n args: (p: FileSyncSpaceParams) => ({ spaceId: p.spaceId }),\n },\n\n // ==========================================================================\n // Files\n // ==========================================================================\n [HAEXTENSION_METHODS.filesync.listFiles]: {\n command: TAURI_COMMANDS.filesync.listFiles,\n args: (p: FileSyncFileParams) => ({ request: p }),\n },\n\n [HAEXTENSION_METHODS.filesync.getFile]: {\n command: TAURI_COMMANDS.filesync.getFile,\n args: (p: FileSyncFileParams) => ({ fileId: p.fileId }),\n },\n\n [HAEXTENSION_METHODS.filesync.uploadFile]: {\n command: TAURI_COMMANDS.filesync.uploadFile,\n args: (p: FileSyncFileParams) => ({ request: p }),\n },\n\n [HAEXTENSION_METHODS.filesync.downloadFile]: {\n command: TAURI_COMMANDS.filesync.downloadFile,\n args: (p: FileSyncFileParams) => ({ request: p }),\n },\n\n [HAEXTENSION_METHODS.filesync.deleteFile]: {\n command: TAURI_COMMANDS.filesync.deleteFile,\n args: (p: FileSyncFileParams) => ({ fileId: p.fileId }),\n },\n\n // ==========================================================================\n // Backends\n // ==========================================================================\n [HAEXTENSION_METHODS.filesync.listBackends]: {\n command: TAURI_COMMANDS.filesync.listBackends,\n args: () => ({}),\n },\n\n [HAEXTENSION_METHODS.filesync.addBackend]: {\n command: TAURI_COMMANDS.filesync.addBackend,\n args: (p: FileSyncBackendParams) => ({ request: p }),\n },\n\n [HAEXTENSION_METHODS.filesync.removeBackend]: {\n command: TAURI_COMMANDS.filesync.removeBackend,\n args: (p: FileSyncBackendParams) => ({ backendId: p.backendId }),\n },\n\n [HAEXTENSION_METHODS.filesync.testBackend]: {\n command: TAURI_COMMANDS.filesync.testBackend,\n args: (p: FileSyncBackendParams) => ({ backendId: p.backendId }),\n },\n\n // ==========================================================================\n // Sync Rules\n // ==========================================================================\n [HAEXTENSION_METHODS.filesync.listSyncRules]: {\n command: TAURI_COMMANDS.filesync.listSyncRules,\n args: () => ({}),\n },\n\n [HAEXTENSION_METHODS.filesync.addSyncRule]: {\n command: TAURI_COMMANDS.filesync.addSyncRule,\n args: (p: FileSyncRuleParams) => ({ request: p }),\n },\n\n [HAEXTENSION_METHODS.filesync.updateSyncRule]: {\n command: TAURI_COMMANDS.filesync.updateSyncRule,\n args: (p: FileSyncRuleParams) => ({ request: p }),\n },\n\n [HAEXTENSION_METHODS.filesync.removeSyncRule]: {\n command: TAURI_COMMANDS.filesync.removeSyncRule,\n args: (p: FileSyncRuleParams) => ({ ruleId: p.ruleId }),\n },\n\n // ==========================================================================\n // Sync Operations\n // ==========================================================================\n [HAEXTENSION_METHODS.filesync.getSyncStatus]: {\n command: TAURI_COMMANDS.filesync.getSyncStatus,\n args: () => ({}),\n },\n\n [HAEXTENSION_METHODS.filesync.triggerSync]: {\n command: TAURI_COMMANDS.filesync.triggerSync,\n args: () => ({}),\n },\n\n [HAEXTENSION_METHODS.filesync.pauseSync]: {\n command: TAURI_COMMANDS.filesync.pauseSync,\n args: () => ({}),\n },\n\n [HAEXTENSION_METHODS.filesync.resumeSync]: {\n command: TAURI_COMMANDS.filesync.resumeSync,\n args: () => ({}),\n },\n\n // ==========================================================================\n // Conflict Resolution\n // ==========================================================================\n [HAEXTENSION_METHODS.filesync.resolveConflict]: {\n command: TAURI_COMMANDS.filesync.resolveConflict,\n args: (p: FileSyncConflictParams) => ({ request: p }),\n },\n\n // ==========================================================================\n // UI Helpers\n // ==========================================================================\n [HAEXTENSION_METHODS.filesync.selectFolder]: {\n command: TAURI_COMMANDS.filesync.selectFolder,\n args: () => ({}),\n },\n\n [HAEXTENSION_METHODS.filesync.scanLocal]: {\n command: TAURI_COMMANDS.filesync.scanLocal,\n args: (p: FileSyncScanLocalParams) => ({ request: p }),\n },\n\n // ==========================================================================\n // Sync Queue\n // ==========================================================================\n [HAEXTENSION_METHODS.filesync.addToQueue]: {\n command: TAURI_COMMANDS.filesync.addToQueue,\n args: (p: FileSyncQueueParams) => ({ request: p }),\n },\n\n [HAEXTENSION_METHODS.filesync.getQueue]: {\n command: TAURI_COMMANDS.filesync.getQueue,\n args: (p: FileSyncQueueParams) => ({ request: p ?? {} }),\n },\n\n [HAEXTENSION_METHODS.filesync.getQueueSummary]: {\n command: TAURI_COMMANDS.filesync.getQueueSummary,\n args: () => ({}),\n },\n\n [HAEXTENSION_METHODS.filesync.startQueueEntry]: {\n command: TAURI_COMMANDS.filesync.startQueueEntry,\n args: (p: FileSyncQueueParams) => ({ entryId: p.entryId }),\n },\n\n [HAEXTENSION_METHODS.filesync.completeQueueEntry]: {\n command: TAURI_COMMANDS.filesync.completeQueueEntry,\n args: (p: FileSyncQueueParams) => ({ entryId: p.entryId }),\n },\n\n [HAEXTENSION_METHODS.filesync.failQueueEntry]: {\n command: TAURI_COMMANDS.filesync.failQueueEntry,\n args: (p: FileSyncQueueParams) => ({ entryId: p.entryId, errorMessage: p.errorMessage }),\n },\n\n [HAEXTENSION_METHODS.filesync.retryFailedQueue]: {\n command: TAURI_COMMANDS.filesync.retryFailedQueue,\n args: () => ({}),\n },\n\n [HAEXTENSION_METHODS.filesync.removeQueueEntry]: {\n command: TAURI_COMMANDS.filesync.removeQueueEntry,\n args: (p: FileSyncQueueParams) => ({ entryId: p.entryId }),\n },\n\n [HAEXTENSION_METHODS.filesync.clearQueue]: {\n command: TAURI_COMMANDS.filesync.clearQueue,\n args: (p: FileSyncQueueParams) => ({ ruleId: p.ruleId }),\n },\n\n [HAEXTENSION_METHODS.filesync.recoverQueue]: {\n command: TAURI_COMMANDS.filesync.recoverQueue,\n args: () => ({}),\n },\n};\n","/**\n * Transport Handlers Index\n *\n * Combines all domain-specific handlers into a single handler map\n */\n\nimport type { InvokeHandlerMap } from \"./types\";\nimport { databaseHandlers } from \"./database\";\nimport { permissionsHandlers } from \"./permissions\";\nimport { webHandlers } from \"./web\";\nimport { filesystemHandlers } from \"./filesystem\";\nimport { externalHandlers } from \"./external\";\nimport { filesyncHandlers } from \"./filesync\";\n\n/**\n * Combined handler map for all SDK methods\n * Used by both invoke and postMessage transports\n */\nexport const allHandlers: InvokeHandlerMap = {\n ...databaseHandlers,\n ...permissionsHandlers,\n ...webHandlers,\n ...filesystemHandlers,\n ...externalHandlers,\n ...filesyncHandlers,\n};\n\n// Re-export types and individual handlers for flexibility\nexport type { InvokeHandlerMap, InvokeMapping } from \"./types\";\nexport { databaseHandlers } from \"./database\";\nexport { permissionsHandlers } from \"./permissions\";\nexport { webHandlers } from \"./web\";\nexport { filesystemHandlers } from \"./filesystem\";\nexport { externalHandlers } from \"./external\";\nexport { filesyncHandlers } from \"./filesync\";\n","/**\n * Transport Module\n *\n * Functions for sending requests via different transport mechanisms:\n * - postMessage (iframe mode)\n * - Tauri invoke (native WebView mode)\n */\n\nimport { ErrorCode, HaexVaultSdkError } from \"../types\";\nimport type { HaexHubRequest, ExtensionInfo } from \"../types\";\nimport { allHandlers } from \"../transport/handlers\";\nimport type { ClientConfig, PendingRequest, LogFn } from \"./context\";\n\n/**\n * Generate a unique request ID\n */\nexport function generateRequestId(counter: number): string {\n return `req_${counter}`;\n}\n\n/**\n * Send a request via postMessage (iframe mode)\n */\nexport function sendPostMessage<T>(\n method: string,\n params: Record<string, unknown>,\n requestId: string,\n config: ClientConfig,\n extensionInfo: ExtensionInfo | null,\n pendingRequests: Map<string, PendingRequest>\n): Promise<T> {\n const request: HaexHubRequest = {\n method,\n params,\n timestamp: Date.now(),\n };\n\n return new Promise<T>((resolve, reject) => {\n const timeout = setTimeout(() => {\n pendingRequests.delete(requestId);\n reject(\n new HaexVaultSdkError(ErrorCode.TIMEOUT, \"errors.timeout\", {\n timeout: config.timeout,\n })\n );\n }, config.timeout);\n\n pendingRequests.set(requestId, { resolve, reject, timeout });\n\n // Use wildcard origin since extensions are sandboxed in their own protocol\n const targetOrigin = \"*\";\n\n if (config.debug) {\n console.log(\"[SDK Debug] ========== Sending Request ==========\");\n console.log(\"[SDK Debug] Request ID:\", requestId);\n console.log(\"[SDK Debug] Method:\", request.method);\n console.log(\"[SDK Debug] Params:\", request.params);\n console.log(\"[SDK Debug] Target origin:\", targetOrigin);\n console.log(\"[SDK Debug] Extension info:\", extensionInfo);\n console.log(\"[SDK Debug] ========================================\");\n }\n\n window.parent.postMessage({ id: requestId, ...request }, targetOrigin);\n });\n}\n\n/**\n * Send a request via Tauri invoke (native WebView mode)\n */\nexport async function sendInvoke<T>(\n method: string,\n params: Record<string, unknown>,\n config: ClientConfig,\n log: LogFn\n): Promise<T> {\n const { invoke } = (window as unknown as { __TAURI__: { core: { invoke: <R>(cmd: string, args?: Record<string, unknown>) => Promise<R> } } }).__TAURI__.core;\n\n if (config.debug) {\n console.log(\"[SDK Debug] ========== Invoke Request ==========\");\n console.log(\"[SDK Debug] Method:\", method);\n console.log(\"[SDK Debug] Params:\", params);\n console.log(\"[SDK Debug] =======================================\");\n }\n\n // Look up handler for this method\n const handler = allHandlers[method];\n\n if (handler) {\n const args = handler.args(params);\n console.log(\"[SDK Debug] Handler found for method:\", method);\n console.log(\"[SDK Debug] Handler command:\", handler.command);\n console.log(\"[SDK Debug] Transformed args:\", JSON.stringify(args, null, 2));\n return invoke<T>(handler.command, args);\n }\n\n // Method not found in handlers\n throw new HaexVaultSdkError(\n ErrorCode.METHOD_NOT_FOUND,\n \"errors.method_not_found\",\n { method }\n );\n}\n\n/**\n * Handle a response for a pending request\n */\nexport function handlePendingResponse(\n requestId: string,\n result: unknown,\n error: unknown,\n pendingRequests: Map<string, PendingRequest>,\n debug: boolean\n): boolean {\n const pending = pendingRequests.get(requestId);\n if (!pending) {\n if (debug) {\n console.warn(\n \"[SDK Debug] ⚠️ Received response for unknown request ID:\",\n requestId\n );\n console.warn(\n \"[SDK Debug] Known IDs:\",\n Array.from(pendingRequests.keys())\n );\n }\n return false;\n }\n\n clearTimeout(pending.timeout);\n pendingRequests.delete(requestId);\n\n if (error) {\n if (debug) {\n console.error(\"[SDK Debug] ❌ Request failed:\", error);\n }\n pending.reject(error);\n } else {\n if (debug) {\n console.log(\"[SDK Debug] ✅ Request succeeded:\", result);\n }\n pending.resolve(result);\n }\n\n return true;\n}\n","/**\n * Event Handling Module\n *\n * Functions for handling messages and events from the parent window (iframe mode)\n * or from Tauri events (native mode).\n */\n\nimport { HAEXTENSION_EVENTS, EXTERNAL_EVENTS } from \"../events\";\nimport type {\n HaexHubResponse,\n HaexHubEvent,\n EventCallback,\n ContextChangedEvent,\n ExternalRequestEvent,\n ApplicationContext,\n} from \"../types\";\nimport type { ClientConfig, PendingRequest, LogFn } from \"./context\";\n\n/**\n * Create a message handler for iframe mode\n */\nexport function createMessageHandler(\n config: ClientConfig,\n pendingRequests: Map<string, PendingRequest>,\n extensionInfo: () => unknown,\n onEvent: (event: HaexHubEvent) => void\n): (event: MessageEvent) => void {\n return (event: MessageEvent) => {\n if (config.debug) {\n console.log(\"[SDK Debug] ========== Message Received ==========\");\n console.log(\"[SDK Debug] Event origin:\", event.origin);\n console.log(\n \"[SDK Debug] Event source:\",\n event.source === window.parent ? \"parent window\" : \"unknown\"\n );\n console.log(\"[SDK Debug] Event data:\", event.data);\n console.log(\"[SDK Debug] Extension info loaded:\", !!extensionInfo());\n console.log(\n \"[SDK Debug] Pending requests count:\",\n pendingRequests.size\n );\n }\n\n // Verify message comes from parent window\n if (event.source !== window.parent) {\n if (config.debug) {\n console.error(\"[SDK Debug] ❌ REJECTED: Message not from parent window!\");\n }\n return;\n }\n\n const data = event.data as HaexHubResponse | HaexHubEvent;\n\n // Handle pending request responses\n if (\"id\" in data && pendingRequests.has(data.id)) {\n if (config.debug) {\n console.log(\"[SDK Debug] ✅ Found pending request for ID:\", data.id);\n }\n const pending = pendingRequests.get(data.id)!;\n clearTimeout(pending.timeout);\n pendingRequests.delete(data.id);\n\n if (data.error) {\n if (config.debug) {\n console.error(\"[SDK Debug] ❌ Request failed:\", data.error);\n }\n pending.reject(data.error);\n } else {\n if (config.debug) {\n console.log(\"[SDK Debug] ✅ Request succeeded:\", data.result);\n }\n pending.resolve(data.result);\n }\n return;\n }\n\n // Warn about unknown request IDs\n if (\"id\" in data && !pendingRequests.has(data.id)) {\n if (config.debug) {\n console.warn(\n \"[SDK Debug] ⚠️ Received response for unknown request ID:\",\n data.id\n );\n console.warn(\n \"[SDK Debug] Known IDs:\",\n Array.from(pendingRequests.keys())\n );\n }\n }\n\n // Handle events\n if (\"type\" in data && data.type) {\n if (config.debug) {\n console.log(\"[SDK Debug] Event received:\", data.type);\n }\n onEvent(data as HaexHubEvent);\n }\n\n if (config.debug) {\n console.log(\"[SDK Debug] ========== End Message ==========\");\n }\n };\n}\n\n/**\n * Process an incoming event\n */\nexport function processEvent(\n event: HaexHubEvent,\n log: LogFn,\n eventListeners: Map<string, Set<EventCallback>>,\n onContextChanged: (context: ApplicationContext) => void,\n onExternalRequest: (event: ExternalRequestEvent) => void\n): void {\n // Handle context changes\n if (event.type === HAEXTENSION_EVENTS.CONTEXT_CHANGED) {\n const contextEvent = event as ContextChangedEvent;\n onContextChanged(contextEvent.data.context);\n log(\"Context updated:\", contextEvent.data.context);\n }\n\n // Handle external requests from authorized clients\n if (event.type === EXTERNAL_EVENTS.REQUEST) {\n const externalEvent = event as ExternalRequestEvent;\n onExternalRequest(externalEvent);\n return; // Don't emit to regular event listeners\n }\n\n // Emit to registered listeners\n emitEvent(event, log, eventListeners);\n}\n\n/**\n * Emit an event to registered listeners\n */\nexport function emitEvent(\n event: HaexHubEvent,\n log: LogFn,\n eventListeners: Map<string, Set<EventCallback>>\n): void {\n log(\"Event received:\", event);\n const listeners = eventListeners.get(event.type);\n if (listeners) {\n listeners.forEach((callback) => callback(event));\n }\n}\n\n/**\n * Register an event listener\n */\nexport function addEventListener(\n eventType: string,\n callback: EventCallback,\n eventListeners: Map<string, Set<EventCallback>>\n): void {\n if (!eventListeners.has(eventType)) {\n eventListeners.set(eventType, new Set());\n }\n eventListeners.get(eventType)!.add(callback);\n}\n\n/**\n * Remove an event listener\n */\nexport function removeEventListener(\n eventType: string,\n callback: EventCallback,\n eventListeners: Map<string, Set<EventCallback>>\n): void {\n const listeners = eventListeners.get(eventType);\n if (listeners) {\n listeners.delete(callback);\n }\n}\n\n/**\n * Notify all reactive subscribers\n */\nexport function notifySubscribers(subscribers: Set<() => void>): void {\n subscribers.forEach((callback) => callback());\n}\n","/**\n * Database Module\n *\n * Functions for database operations including Drizzle ORM initialization\n * and raw SQL query/execute methods.\n */\n\nimport { HAEXTENSION_METHODS } from \"../methods\";\nimport { ErrorCode, HaexVaultSdkError } from \"../types\";\nimport type { ExtensionInfo, DatabaseQueryResult } from \"../types\";\nimport { drizzle, type SqliteRemoteDatabase } from \"drizzle-orm/sqlite-proxy\";\nimport type { LogFn } from \"./context\";\n\n/**\n * Request function type for database operations\n */\ntype RequestFn = <T>(method: string, params?: Record<string, unknown>) => Promise<T>;\n\n/**\n * Create a Drizzle ORM database instance\n *\n * @param schema The Drizzle schema object (with prefixed table names)\n * @param extensionInfo The current extension info (required)\n * @param request The request function for SDK communication\n * @param log Logger function\n * @returns The type-safe Drizzle database instance\n */\nexport function createDrizzleInstance<T extends Record<string, unknown>>(\n schema: T,\n extensionInfo: ExtensionInfo | null,\n request: RequestFn,\n log: LogFn\n): SqliteRemoteDatabase<T> {\n if (!extensionInfo) {\n throw new HaexVaultSdkError(\n ErrorCode.EXTENSION_INFO_UNAVAILABLE,\n \"errors.client_not_ready\"\n );\n }\n\n return drizzle<T>(\n async (\n sql: string,\n params: unknown[],\n method: \"get\" | \"run\" | \"all\" | \"values\"\n ) => {\n try {\n // Drizzle uses different methods:\n // - \"run\": INSERT/UPDATE/DELETE without RETURNING\n // - \"all\": INSERT/UPDATE/DELETE with RETURNING, or SELECT\n // - \"get\": SELECT with LIMIT 1\n // - \"values\": SELECT returning raw values\n //\n // The backend intelligently handles routing:\n // - method=\"run\" and \"all\" go to haextension.db.execute\n // - Backend detects SELECT statements and delegates to haextension.db.query\n // - Backend returns rows when RETURNING clause is present\n\n if (method === \"run\" || method === \"all\") {\n const result = await request<DatabaseQueryResult>(\n HAEXTENSION_METHODS.database.execute,\n {\n query: sql,\n params: params as unknown[],\n }\n );\n\n // For method=\"all\", return rows (RETURNING clause or SELECT delegated by backend)\n if (method === \"all\") {\n return { rows: result.rows || [] };\n }\n\n // For method=\"run\", check if we have rows (RETURNING clause)\n if (result.rows && Array.isArray(result.rows) && result.rows.length > 0) {\n return { rows: result.rows };\n }\n\n return result;\n }\n\n // Read operations (SELECT without RETURNING)\n const result = await request<DatabaseQueryResult>(HAEXTENSION_METHODS.database.query, {\n query: sql,\n params: params as unknown[],\n });\n\n const rows = result.rows as unknown[];\n\n if (method === \"get\") {\n return { rows: rows.length > 0 ? rows.at(0) : undefined };\n }\n\n return { rows };\n } catch (error) {\n log(\"Database operation failed:\", error);\n throw error;\n }\n },\n {\n schema: schema,\n logger: false,\n }\n );\n}\n\n/**\n * Execute a raw SQL query (SELECT)\n *\n * @param sql The SQL query string\n * @param params Query parameters\n * @param request The request function\n * @param debug Whether debug mode is enabled\n * @returns Array of result rows\n */\nexport async function queryRaw<T = Record<string, unknown>>(\n sql: string,\n params: unknown[],\n request: RequestFn,\n debug: boolean\n): Promise<T[]> {\n const result = await request<DatabaseQueryResult>(\n HAEXTENSION_METHODS.database.query,\n { query: sql, params }\n );\n if (debug) {\n console.log(\"[SDK query()] Raw result:\", JSON.stringify(result, null, 2));\n }\n return result.rows as T[];\n}\n\n/**\n * Execute a raw SQL statement (INSERT, UPDATE, DELETE, CREATE, etc.)\n *\n * @param sql The SQL statement\n * @param params Statement parameters\n * @param request The request function\n * @returns Object with rowsAffected and optionally lastInsertId\n */\nexport async function executeRaw(\n sql: string,\n params: unknown[],\n request: RequestFn\n): Promise<{ rowsAffected: number; lastInsertId?: number }> {\n const result = await request<DatabaseQueryResult>(\n HAEXTENSION_METHODS.database.execute,\n { query: sql, params }\n );\n return {\n rowsAffected: result.rowsAffected,\n lastInsertId: result.lastInsertId,\n };\n}\n","/**\n * External Request Handling Module\n *\n * Functions for handling external requests from authorized clients\n * (browser extensions, CLI tools, servers, etc.)\n */\n\nimport type {\n ExternalRequest,\n ExternalResponse,\n ExternalRequestHandler,\n} from \"../types\";\nimport type { LogFn } from \"./context\";\n\n/**\n * Request function type\n */\ntype RequestFn = <T>(method: string, params?: Record<string, unknown>) => Promise<T>;\n\n/**\n * Register an external request handler\n *\n * @param action The action/method name to handle\n * @param handler The handler function\n * @param handlers The handlers map\n * @param log Logger function\n * @returns Unsubscribe function\n */\nexport function registerExternalHandler(\n action: string,\n handler: ExternalRequestHandler,\n handlers: Map<string, ExternalRequestHandler>,\n log: LogFn\n): () => void {\n handlers.set(action, handler);\n log(`[ExternalRequest] Registered handler for action: ${action}`);\n\n return () => {\n handlers.delete(action);\n log(`[ExternalRequest] Unregistered handler for action: ${action}`);\n };\n}\n\n/**\n * Handle an incoming external request\n *\n * @param request The external request\n * @param handlers The handlers map\n * @param respond Function to send response\n * @param log Logger function\n */\nexport async function handleExternalRequest(\n request: ExternalRequest,\n handlers: Map<string, ExternalRequestHandler>,\n respond: (response: ExternalResponse) => Promise<void>,\n log: LogFn\n): Promise<void> {\n console.log(\"[SDK Debug] handleExternalRequest called!\");\n console.log(\"[SDK Debug] Request:\", JSON.stringify(request, null, 2));\n console.log(\"[SDK Debug] Available handlers:\", Array.from(handlers.keys()));\n log(`[ExternalRequest] Received request: ${request.action} from ${request.publicKey.substring(0, 20)}...`);\n\n const handler = handlers.get(request.action);\n\n if (!handler) {\n log(`[ExternalRequest] No handler for action: ${request.action}`);\n await respond({\n requestId: request.requestId,\n success: false,\n error: `No handler registered for action: ${request.action}`,\n });\n return;\n }\n\n try {\n const response = await handler(request);\n await respond(response);\n log(`[ExternalRequest] Response sent for: ${request.action}`);\n } catch (error) {\n log(`[ExternalRequest] Handler error:`, error);\n await respond({\n requestId: request.requestId,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n}\n\n/**\n * Send an external response back to haex-vault\n *\n * @param response The response to send\n * @param request The request function\n */\nexport async function respondToExternalRequest(\n response: ExternalResponse,\n request: RequestFn\n): Promise<void> {\n console.log(\"[SDK Debug] respondToExternalRequest called with:\", JSON.stringify(response, null, 2));\n await request(\"external.respond\", response as unknown as Record<string, unknown>);\n}\n","/**\n * HaexVault Client\n *\n * Main SDK client for extensions running in HaexVault.\n * Supports both native WebView mode (Tauri) and iframe mode (mobile/web).\n */\n\nimport type {\n HaexHubConfig,\n HaexHubEvent,\n EventCallback,\n PermissionResponse,\n DatabasePermissionRequest,\n ExtensionInfo,\n ApplicationContext,\n SearchResult,\n MigrationResult,\n Migration,\n ExternalResponse,\n ExternalRequestHandler,\n} from \"./types\";\nimport { DEFAULT_TIMEOUT } from \"./types\";\nimport { StorageAPI } from \"./api/storage\";\nimport { DatabaseAPI } from \"./api/database\";\nimport { FilesystemAPI } from \"./api/filesystem\";\nimport { WebAPI } from \"./api/web\";\nimport { PermissionsAPI } from \"./api/permissions\";\nimport { RemoteStorageAPI } from \"./api/remoteStorage\";\nimport { installConsoleForwarding } from \"./polyfills/consoleForwarding\";\nimport type { SqliteRemoteDatabase } from \"drizzle-orm/sqlite-proxy\";\n\n// Client modules\nimport type { ClientConfig, PendingRequest } from \"./client/context\";\nimport {\n getExtensionTableName,\n getDependencyTableName as getDependencyTableNameFn,\n parseTableName as parseTableNameFn,\n} from \"./client/tableName\";\nimport { isInIframe, hasTauri, initNativeMode, initIframeMode } from \"./client/init\";\nimport { sendPostMessage, sendInvoke, generateRequestId } from \"./client/transport\";\nimport {\n createMessageHandler,\n processEvent,\n addEventListener,\n removeEventListener,\n notifySubscribers,\n} from \"./client/events\";\nimport { createDrizzleInstance, queryRaw, executeRaw } from \"./client/database\";\nimport { registerExternalHandler, handleExternalRequest, respondToExternalRequest } from \"./client/external\";\n\nexport class HaexVaultSdk {\n // Configuration\n private readonly config: ClientConfig;\n\n // State\n private initialized = false;\n private isNativeWindow = false;\n private requestCounter = 0;\n private _extensionInfo: ExtensionInfo | null = null;\n private _context: ApplicationContext | null = null;\n private _setupCompleted = false;\n\n // Collections\n private readonly pendingRequests: Map<string, PendingRequest> = new Map();\n private readonly eventListeners: Map<string, Set<EventCallback>> = new Map();\n private readonly externalRequestHandlers: Map<string, ExternalRequestHandler> = new Map();\n private readonly reactiveSubscribers: Set<() => void> = new Set();\n\n // Handlers\n private messageHandler: ((event: MessageEvent) => void) | null = null;\n\n // Promises\n private readyPromise: Promise<void>;\n private resolveReady!: () => void;\n private setupPromise: Promise<void> | null = null;\n private setupHook: (() => Promise<void>) | null = null;\n\n // Public APIs\n public orm: SqliteRemoteDatabase<Record<string, unknown>> | null = null;\n public readonly storage: StorageAPI;\n public readonly database: DatabaseAPI;\n public readonly filesystem: FilesystemAPI;\n public readonly web: WebAPI;\n public readonly permissions: PermissionsAPI;\n public readonly remoteStorage: RemoteStorageAPI;\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 this.remoteStorage = new RemoteStorageAPI(this);\n\n installConsoleForwarding(this.config.debug);\n\n this.readyPromise = new Promise((resolve) => {\n this.resolveReady = resolve;\n });\n\n this.init();\n }\n\n // ==========================================================================\n // Lifecycle\n // ==========================================================================\n\n public async ready(): Promise<void> {\n return this.readyPromise;\n }\n\n public get setupCompleted(): boolean {\n return this._setupCompleted;\n }\n\n public onSetup(setupFn: () => Promise<void>): void {\n if (this.setupHook) {\n throw new Error(\"Setup hook already registered\");\n }\n this.setupHook = setupFn;\n }\n\n public async setupComplete(): Promise<void> {\n await this.readyPromise;\n\n if (!this.setupHook || this.setupCompleted) {\n return;\n }\n\n if (!this.setupPromise) {\n this.setupPromise = this.runSetupAsync();\n }\n\n return this.setupPromise;\n }\n\n public destroy(): void {\n if (this.messageHandler) {\n window.removeEventListener(\"message\", this.messageHandler);\n }\n\n this.pendingRequests.forEach(({ timeout }) => clearTimeout(timeout));\n this.pendingRequests.clear();\n this.eventListeners.clear();\n\n this.initialized = false;\n this.log(\"HaexVault SDK destroyed\");\n }\n\n // ==========================================================================\n // Properties\n // ==========================================================================\n\n public get extensionInfo(): ExtensionInfo | null {\n return this._extensionInfo;\n }\n\n public get context(): ApplicationContext | null {\n return this._context;\n }\n\n // ==========================================================================\n // Subscriptions\n // ==========================================================================\n\n public subscribe(callback: () => void): () => void {\n this.reactiveSubscribers.add(callback);\n return () => {\n this.reactiveSubscribers.delete(callback);\n };\n }\n\n // ==========================================================================\n // Table Name Utilities\n // ==========================================================================\n\n public getTableName(tableName: string): string {\n return getExtensionTableName(this._extensionInfo, tableName);\n }\n\n public getDependencyTableName(publicKey: string, extensionName: string, tableName: string): string {\n return getDependencyTableNameFn(publicKey, extensionName, tableName);\n }\n\n public parseTableName(fullTableName: string): { publicKey: string; extensionName: string; tableName: string } | null {\n return parseTableNameFn(fullTableName);\n }\n\n // ==========================================================================\n // Database\n // ==========================================================================\n\n public initializeDatabase<T extends Record<string, unknown>>(schema: T): SqliteRemoteDatabase<T> {\n const db = createDrizzleInstance(schema, this._extensionInfo, this.request.bind(this), this.log.bind(this));\n this.orm = db as SqliteRemoteDatabase<Record<string, unknown>>;\n return db;\n }\n\n public async query<T = Record<string, unknown>>(sql: string, params: unknown[] = []): Promise<T[]> {\n return queryRaw<T>(sql, params, this.request.bind(this), this.config.debug);\n }\n\n public async select<T = Record<string, unknown>>(sql: string, params: unknown[] = []): Promise<T[]> {\n return this.query<T>(sql, params);\n }\n\n public async execute(sql: string, params: unknown[] = []): Promise<{ rowsAffected: number; lastInsertId?: number }> {\n return executeRaw(sql, params, this.request.bind(this));\n }\n\n public async registerMigrationsAsync(extensionVersion: string, migrations: Migration[]): Promise<MigrationResult> {\n return this.database.registerMigrationsAsync(extensionVersion, migrations);\n }\n\n // ==========================================================================\n // Dependencies\n // ==========================================================================\n\n public async getDependencies(): Promise<ExtensionInfo[]> {\n return this.request<ExtensionInfo[]>(\"extensions.getDependencies\");\n }\n\n // ==========================================================================\n // Permissions\n // ==========================================================================\n\n public async requestDatabasePermission(request: DatabasePermissionRequest): Promise<PermissionResponse> {\n return this.request<PermissionResponse>(\"permissions.database.request\", {\n resource: request.resource,\n operation: request.operation,\n reason: request.reason,\n });\n }\n\n public async checkDatabasePermission(resource: string, operation: \"read\" | \"write\"): Promise<boolean> {\n const response = await this.request<PermissionResponse>(\"permissions.database.check\", { resource, operation });\n return response.status === \"granted\";\n }\n\n // ==========================================================================\n // Search\n // ==========================================================================\n\n public async respondToSearch(requestId: string, results: SearchResult[]): Promise<void> {\n await this.request(\"search.respond\", { requestId, results });\n }\n\n // ==========================================================================\n // External Requests\n // ==========================================================================\n\n public onExternalRequest(action: string, handler: ExternalRequestHandler): () => void {\n return registerExternalHandler(action, handler, this.externalRequestHandlers, this.log.bind(this));\n }\n\n public async respondToExternalRequest(response: ExternalResponse): Promise<void> {\n await respondToExternalRequest(response, this.request.bind(this));\n }\n\n // ==========================================================================\n // Events\n // ==========================================================================\n\n public on(eventType: string, callback: EventCallback): void {\n addEventListener(eventType, callback, this.eventListeners);\n }\n\n public off(eventType: string, callback: EventCallback): void {\n removeEventListener(eventType, callback, this.eventListeners);\n }\n\n // ==========================================================================\n // Communication\n // ==========================================================================\n\n public async request<T = unknown, P = Record<string, unknown>>(method: string, params?: P): Promise<T> {\n const resolvedParams = (params ?? {}) as Record<string, unknown>;\n\n if (this.isNativeWindow && hasTauri()) {\n return sendInvoke<T>(method, resolvedParams, this.config, this.log.bind(this));\n }\n\n const requestId = generateRequestId(++this.requestCounter);\n return sendPostMessage<T>(method, resolvedParams, requestId, this.config, this._extensionInfo, this.pendingRequests);\n }\n\n // ==========================================================================\n // Private: Initialization\n // ==========================================================================\n\n private async init(): Promise<void> {\n if (this.initialized) return;\n\n // Check iframe mode FIRST before attempting Tauri calls\n // This prevents hanging on Android where __TAURI__ exists but sandboxed iframes can't access it\n if (!isInIframe() && hasTauri()) {\n try {\n await this.initNative();\n return;\n } catch (error) {\n this.log(\"Tauri commands failed, falling back to iframe mode\", error);\n }\n }\n\n await this.initIframe();\n }\n\n private async initNative(): Promise<void> {\n const { extensionInfo, context } = await initNativeMode(\n {\n config: this.config,\n state: {\n initialized: this.initialized,\n isNativeWindow: this.isNativeWindow,\n requestCounter: this.requestCounter,\n setupCompleted: this._setupCompleted,\n extensionInfo: this._extensionInfo,\n context: this._context,\n orm: this.orm,\n },\n collections: {\n pendingRequests: this.pendingRequests,\n eventListeners: this.eventListeners,\n externalRequestHandlers: this.externalRequestHandlers,\n reactiveSubscribers: this.reactiveSubscribers,\n },\n promises: {\n readyPromise: this.readyPromise,\n resolveReady: this.resolveReady,\n setupPromise: this.setupPromise,\n setupHook: this.setupHook,\n },\n handlers: {\n messageHandler: this.messageHandler,\n },\n },\n this.log.bind(this),\n this.handleEvent.bind(this),\n (ctx) => {\n this._context = ctx;\n this.notifySubscribersInternal();\n }\n );\n\n this._extensionInfo = extensionInfo;\n this._context = context;\n this.isNativeWindow = true;\n this.initialized = true;\n\n this.notifySubscribersInternal();\n this.resolveReady();\n }\n\n private async initIframe(): Promise<void> {\n this.messageHandler = createMessageHandler(\n this.config,\n this.pendingRequests,\n () => this._extensionInfo,\n this.handleEvent.bind(this)\n );\n\n const { context } = await initIframeMode(\n {\n config: this.config,\n state: {\n initialized: this.initialized,\n isNativeWindow: this.isNativeWindow,\n requestCounter: this.requestCounter,\n setupCompleted: this._setupCompleted,\n extensionInfo: this._extensionInfo,\n context: this._context,\n orm: this.orm,\n },\n collections: {\n pendingRequests: this.pendingRequests,\n eventListeners: this.eventListeners,\n externalRequestHandlers: this.externalRequestHandlers,\n reactiveSubscribers: this.reactiveSubscribers,\n },\n promises: {\n readyPromise: this.readyPromise,\n resolveReady: this.resolveReady,\n setupPromise: this.setupPromise,\n setupHook: this.setupHook,\n },\n handlers: {\n messageHandler: this.messageHandler,\n },\n },\n this.log.bind(this),\n this.messageHandler,\n this.request.bind(this)\n );\n\n // Load extension info from manifest if provided\n if (this.config.manifest) {\n this._extensionInfo = {\n publicKey: this.config.manifest.publicKey,\n name: this.config.manifest.name,\n version: this.config.manifest.version,\n displayName: this.config.manifest.name,\n };\n this.notifySubscribersInternal();\n }\n\n this._context = context;\n this.isNativeWindow = false;\n this.initialized = true;\n\n this.notifySubscribersInternal();\n this.resolveReady();\n }\n\n // ==========================================================================\n // Private: Event Handling\n // ==========================================================================\n\n private handleEvent(event: HaexHubEvent): void {\n processEvent(\n event,\n this.log.bind(this),\n this.eventListeners,\n (ctx) => {\n this._context = ctx;\n this.notifySubscribersInternal();\n },\n (extEvent) => this.handleExternalRequestInternal(extEvent.data)\n );\n }\n\n private async handleExternalRequestInternal(request: import(\"./types\").ExternalRequest): Promise<void> {\n await handleExternalRequest(request, this.externalRequestHandlers, this.respondToExternalRequest.bind(this), this.log.bind(this));\n }\n\n // ==========================================================================\n // Private: Setup\n // ==========================================================================\n\n private async runSetupAsync(): Promise<void> {\n if (!this.setupHook) return;\n\n try {\n this.log(\"[HaexVault] Running setup hook...\");\n await this.setupHook();\n this._setupCompleted = true;\n this.log(\"[HaexVault] Setup completed successfully\");\n this.notifySubscribersInternal();\n } catch (error) {\n this.log(\"[HaexVault] Setup failed:\", error);\n throw error;\n }\n }\n\n // ==========================================================================\n // Private: Utilities\n // ==========================================================================\n\n private notifySubscribersInternal(): void {\n notifySubscribers(this.reactiveSubscribers);\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log(\"[HaexVault SDK]\", ...args);\n }\n }\n}\n","import { defineNuxtPlugin } from \"nuxt/app\";\nimport { shallowRef, type ShallowRef } from \"vue\";\nimport { HaexVaultSdk } from \"~/client\";\nimport type { ExtensionManifest, ApplicationContext } from \"~/types\";\n\nexport default defineNuxtPlugin(async (nuxtApp) => {\n // Get manifest from runtime config (injected by Nuxt module)\n const manifest = nuxtApp.$config.public.haexVaultManifest as ExtensionManifest | null;\n\n // 1. Erstelle die Client-Instanz\n const client = new HaexVaultSdk({\n // @ts-ignore\n debug: nuxtApp.payload.config.public.debug ?? false,\n manifest: manifest || undefined,\n });\n\n // 2. Erstelle einen reaktiven Container (shallowRef ist performant)\n const state = shallowRef({\n isReady: false,\n isSetupComplete: false,\n context: client.context,\n });\n\n // 3. Warte auf die Initialisierung des Clients\n await client.ready();\n\n // 4. Setze den initialen State, sobald der Client bereit ist\n console.log('[Nuxt Plugin] Client ready, context:', client.context);\n state.value = {\n isReady: true,\n isSetupComplete: false,\n context: client.context,\n };\n console.log('[Nuxt Plugin] Initial state set:', state.value);\n\n // 5. Nutze dein Pub/Sub-Pattern, um auf künftige Updates zu lauschen\n client.subscribe(() => {\n console.log('[Nuxt Plugin] Client context updated:', client.context);\n\n // Check if setup was completed (setupCompleted is set by client.setupComplete())\n const isSetupComplete = client.setupCompleted;\n\n // Triggere ein Update für das shallowRef\n state.value = {\n ...state.value,\n context: client.context,\n isSetupComplete,\n };\n console.log('[Nuxt Plugin] State updated:', state.value);\n });\n\n // 6. 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 // 7. Stelle den Client und den reaktiven State bereit\n const haexVaultPlugin = {\n client, // Der rohe Client (für client.orm, client.database, etc.)\n state, // Der reaktive State (für die UI)\n };\n\n return {\n provide: {\n haexVault: haexVaultPlugin,\n },\n };\n});\n\n// Export type for type declarations\nexport type HaexVaultNuxtPlugin = {\n client: HaexVaultSdk;\n state: ShallowRef<{\n isReady: boolean;\n isSetupComplete: boolean;\n context: ApplicationContext | null;\n }>;\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/events.ts","../../src/types.ts","../../src/methods.ts","../../src/api/storage.ts","../../src/api/database.ts","../../src/api/filesystem.ts","../../src/api/web.ts","../../src/api/permissions.ts","../../src/api/remoteStorage.ts","../../src/messages.ts","../../src/polyfills/consoleForwarding.ts","../../src/client/tableName.ts","../../src/client/init.ts","../../src/commands.ts","../../src/transport/handlers/database.ts","../../src/transport/handlers/permissions.ts","../../src/transport/handlers/web.ts","../../src/transport/handlers/filesystem.ts","../../src/transport/handlers/external.ts","../../src/transport/handlers/remoteStorage.ts","../../src/transport/handlers/index.ts","../../src/client/transport.ts","../../src/client/events.ts","../../src/client/database.ts","../../src/client/external.ts","../../src/client.ts","../../src/runtime/nuxt.plugin.client.ts"],"names":["drizzle","result","defineNuxtPlugin","shallowRef"],"mappings":"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","file":"nuxt.plugin.client.js","sourcesContent":["/**\n * Central event name definitions for HaexHub extensions\n *\n * Event Naming Schema: haextension:{subject}:{predicate}\n *\n * IMPORTANT: Tauri event names can only contain:\n * - Alphanumeric characters (a-z, A-Z, 0-9)\n * - Hyphens (-)\n * - Slashes (/)\n * - Colons (:)\n * - Underscores (_)\n *\n * NO dots (.) allowed!\n */\n\nexport const HAEXTENSION_EVENTS = {\n /** Context (theme, locale, platform) has changed */\n CONTEXT_CHANGED: 'haextension:context:changed',\n\n /** Search request from HaexHub */\n SEARCH_REQUEST: 'haextension:search:request',\n} as const;\n\nexport type HaextensionEvent = typeof HAEXTENSION_EVENTS[keyof typeof HAEXTENSION_EVENTS];\n\n/**\n * Events for external client communication (browser extensions, CLI tools, servers, etc.)\n */\nexport const EXTERNAL_EVENTS = {\n /** External request from authorized client */\n REQUEST: 'haextension:external:request',\n\n /** New external client requesting authorization */\n AUTHORIZATION_REQUEST: 'external:authorization-request',\n} as const;\n\nexport type ExternalEvent = typeof EXTERNAL_EVENTS[keyof typeof EXTERNAL_EVENTS];\n","import { HAEXTENSION_EVENTS, EXTERNAL_EVENTS } from './events';\n\n// Constants\nexport const DEFAULT_TIMEOUT = 30000; // 30 seconds in milliseconds\nexport const TABLE_SEPARATOR = \"__\"; // Separator for table name components: {publicKey}__{extensionName}__{tableName}\n\n/**\n * Build a fully qualified table name for extensions.\n * Use this in Drizzle schemas to create table names at build time.\n *\n * @param publicKey - The extension's public key (from manifest.json)\n * @param extensionName - The extension name (from manifest.json or package.json)\n * @param tableName - The table name (e.g., \"users\", \"items\")\n * @returns Fully qualified table name: `{publicKey}__{extensionName}__{tableName}`\n *\n * @example\n * ```typescript\n * import { getTableName } from \"@haex-space/vault-sdk\";\n * import manifest from \"../haextension/manifest.json\";\n * import pkg from \"../package.json\";\n *\n * const tableName = (name: string) =>\n * getTableName(manifest.publicKey, manifest.name || pkg.name, name);\n *\n * export const users = sqliteTable(tableName(\"users\"), { ... });\n * ```\n */\nexport function getTableName(\n publicKey: string,\n extensionName: string,\n tableName: string\n): string {\n return `${publicKey}${TABLE_SEPARATOR}${extensionName}${TABLE_SEPARATOR}${tableName}`;\n}\n\n// Core Protocol Types\nexport interface HaexHubRequest {\n method: string;\n params: Record<string, unknown>;\n timestamp: number;\n}\n\nexport interface HaexHubResponse<T = unknown> {\n id: string;\n result?: T;\n error?: HaexVaultSdkErrorData;\n}\n\nexport interface HaexVaultSdkErrorData {\n code: ErrorCode;\n message: string;\n details?: Record<string, unknown>;\n}\n\n// Extension Info (loaded from manifest.json at build time)\nexport interface ExtensionInfo {\n publicKey: string;\n name: string;\n version: string;\n displayName?: string;\n namespace?: string;\n}\n\n// Application Context (provided by HaexHub)\nexport interface ApplicationContext {\n theme: \"light\" | \"dark\" | \"system\";\n locale: string;\n platform:\n | \"linux\"\n | \"macos\"\n | \"ios\"\n | \"freebsd\"\n | \"dragonfly\"\n | \"netbsd\"\n | \"openbsd\"\n | \"solaris\"\n | \"android\"\n | \"windows\"\n | undefined;\n /** Unique device identifier (UUID) for multi-device sync */\n deviceId: string | undefined;\n}\n\n// Search Types\nexport interface SearchQuery {\n query: string;\n filters?: Record<string, unknown>;\n limit?: number;\n}\n\nexport interface SearchResult {\n id: string;\n title: string;\n description?: string;\n type: string;\n data?: Record<string, unknown>;\n score?: number;\n}\n\n// Permission Types\nexport enum PermissionStatus {\n GRANTED = \"granted\",\n DENIED = \"denied\",\n ASK = \"ask\",\n}\n\nexport interface PermissionResponse {\n status: PermissionStatus;\n permanent: boolean;\n}\n\n// Database Permission (matches Rust DbExtensionPermission)\nexport interface DatabasePermission {\n extensionId: string;\n resource: string;\n operation: \"read\" | \"write\";\n path: string;\n}\n\nexport interface DatabasePermissionRequest {\n resource: string;\n operation: \"read\" | \"write\";\n reason?: string;\n}\n\n// Database Types\nexport interface DatabaseQueryParams {\n query: string;\n params?: unknown[];\n}\n\nexport interface DatabaseQueryResult {\n rows: unknown[]; // Array of arrays (each row is an array of values)\n columns?: string[]; // Column names in order\n rowsAffected: number;\n lastInsertId?: number;\n}\n\nexport interface DatabaseExecuteParams {\n statements: string[];\n}\n\n// Migration Types\nexport interface MigrationResult {\n appliedCount: number;\n alreadyAppliedCount: number;\n appliedMigrations: string[];\n}\n\nexport interface Migration {\n name: string;\n sql: string;\n}\n\nexport interface DatabaseTableInfo {\n name: string;\n columns: DatabaseColumnInfo[];\n}\n\nexport interface DatabaseColumnInfo {\n name: string;\n type: string;\n notNull: boolean;\n defaultValue?: unknown;\n primaryKey: boolean;\n}\n\n// Event Types\nexport interface HaexHubEvent {\n type: string;\n data: unknown;\n timestamp: number;\n}\n\n// Specific Event Types\nexport interface ContextChangedEvent extends HaexHubEvent {\n type: typeof HAEXTENSION_EVENTS.CONTEXT_CHANGED;\n data: {\n context: ApplicationContext;\n };\n}\n\nexport interface SearchRequestEvent extends HaexHubEvent {\n type: typeof HAEXTENSION_EVENTS.SEARCH_REQUEST;\n data: {\n query: SearchQuery;\n requestId: string;\n };\n}\n\n/**\n * External request from an authorized client (browser extension, CLI, server, etc.)\n * These requests come through the WebSocket bridge and are routed to the appropriate extension.\n */\nexport interface ExternalRequestEvent extends HaexHubEvent {\n type: typeof EXTERNAL_EVENTS.REQUEST;\n data: ExternalRequest;\n}\n\n/**\n * External request payload\n */\nexport interface ExternalRequest {\n /** Unique request ID for response correlation */\n requestId: string;\n /** Client's public key (Base64 SPKI format, used as identifier) */\n publicKey: string;\n /** Action/method to perform (extension-specific) */\n action: string;\n /** Request payload (extension-specific) */\n payload: Record<string, unknown>;\n}\n\n/**\n * External request response (sent back to the client)\n */\nexport interface ExternalResponse {\n /** Request ID for correlation */\n requestId: string;\n /** Whether the request was successful */\n success: boolean;\n /** Response data (if successful) */\n data?: unknown;\n /** Error message (if failed) */\n error?: string;\n}\n\n/**\n * Handler function type for external requests\n */\nexport type ExternalRequestHandler = (\n request: ExternalRequest\n) => Promise<ExternalResponse> | ExternalResponse;\n\n/**\n * An authorized external client stored in the database\n */\nexport interface AuthorizedClient {\n /** Row ID */\n id: string;\n /** Unique client identifier (public key fingerprint) */\n clientId: string;\n /** Human-readable client name */\n clientName: string;\n /** Client's public key (base64) */\n publicKey: string;\n /** Extension ID this client can access */\n extensionId: string;\n /** When the client was authorized (ISO 8601) */\n authorizedAt: string | null;\n /** Last time the client connected (ISO 8601) */\n lastSeen: string | null;\n}\n\n/**\n * A blocked external client stored in the database\n */\nexport interface BlockedClient {\n /** Row ID */\n id: string;\n /** Unique client identifier (public key fingerprint) */\n clientId: string;\n /** Human-readable client name */\n clientName: string;\n /** Client's public key (base64) */\n publicKey: string;\n /** When the client was blocked (ISO 8601) */\n blockedAt: string | null;\n}\n\n/**\n * Extension requested by an external client\n */\nexport interface RequestedExtension {\n /** Extension name (e.g., \"haex-pass\") */\n name: string;\n /** Extension's public key (hex string from manifest) */\n extensionPublicKey: string;\n}\n\n/**\n * Pending authorization request waiting for user approval\n */\nexport interface PendingAuthorization {\n /** Unique client identifier */\n clientId: string;\n /** Human-readable client name */\n clientName: string;\n /** Client's public key (base64) */\n publicKey: string;\n /** Extensions the client wants to access (pre-selected in authorization dialog) */\n requestedExtensions: RequestedExtension[];\n}\n\n/**\n * Decision type for external authorization prompts\n */\nexport type ExternalAuthDecision = 'allow' | 'deny';\n\n/**\n * Session-based authorization entry (for \"allow once\" authorizations)\n * These are stored in-memory and cleared when haex-vault restarts.\n */\nexport interface SessionAuthorization {\n /** Unique client identifier (public key fingerprint) */\n clientId: string;\n /** Extension ID this client can access */\n extensionId: string;\n}\n\n// ============================================================================\n// External Bridge Connection Types\n// ============================================================================\n\n/**\n * Connection state for external clients connecting to haex-vault via WebSocket.\n * Used by browser extensions, CLI tools, servers, and other external clients.\n */\nexport enum ExternalConnectionState {\n /** Not connected to haex-vault */\n DISCONNECTED = 'disconnected',\n /** Attempting to establish connection */\n CONNECTING = 'connecting',\n /** WebSocket connected but not yet authorized */\n CONNECTED = 'connected',\n /** Connected and waiting for user approval in haex-vault */\n PENDING_APPROVAL = 'pending_approval',\n /** Connected and authorized to communicate */\n PAIRED = 'paired',\n}\n\n/**\n * Error codes for external client connections.\n * Used to identify specific error conditions for i18n in the frontend.\n */\nexport enum ExternalConnectionErrorCode {\n /** No error */\n NONE = 'none',\n /** Client is not authorized (rejected or not yet approved) */\n CLIENT_NOT_AUTHORIZED = 'client_not_authorized',\n /** Client was blocked by the user */\n CLIENT_BLOCKED = 'client_blocked',\n /** Connection to haex-vault failed (not running or network error) */\n CONNECTION_FAILED = 'connection_failed',\n /** Connection timed out */\n CONNECTION_TIMEOUT = 'connection_timeout',\n /** WebSocket connection was closed unexpectedly */\n CONNECTION_CLOSED = 'connection_closed',\n /** Failed to decrypt message (invalid key or corrupted data) */\n DECRYPTION_FAILED = 'decryption_failed',\n /** Invalid message format received */\n INVALID_MESSAGE = 'invalid_message',\n /** Unknown or unspecified error */\n UNKNOWN = 'unknown',\n}\n\n/**\n * Full connection status including state, client ID, and any error\n */\nexport interface ExternalConnection {\n /** Current connection state */\n state: ExternalConnectionState;\n /** Client identifier (derived from public key) */\n clientId: string | null;\n /** Error code for i18n (use this for translations) */\n errorCode: ExternalConnectionErrorCode;\n /** Error message (original message, for logging/debugging) */\n errorMessage: string | null;\n}\n\n/**\n * Check if external client connection state indicates an active connection\n * (connected, pending approval, or paired)\n */\nexport function isExternalClientConnected(state: ExternalConnectionState): boolean {\n return (\n state === ExternalConnectionState.CONNECTED ||\n state === ExternalConnectionState.PENDING_APPROVAL ||\n state === ExternalConnectionState.PAIRED\n );\n}\n\n/**\n * Check if external client can send requests (only when paired/authorized)\n */\nexport function canExternalClientSendRequests(state: ExternalConnectionState): boolean {\n return state === ExternalConnectionState.PAIRED;\n}\n\nexport type EventCallback = (event: HaexHubEvent) => void;\n\n// Manifest Types\nexport interface ExtensionManifest {\n name: string;\n version: string;\n author?: string | null;\n entry?: string | null;\n icon?: string | null;\n publicKey: string;\n signature: string;\n permissions: {\n database?: any[];\n filesystem?: any[];\n http?: any[];\n shell?: any[];\n };\n homepage?: string | null;\n description?: string | null;\n singleInstance?: boolean | null;\n displayMode?: \"auto\" | \"window\" | \"iframe\" | null;\n /**\n * Path to the migrations directory relative to the extension root.\n * Contains Drizzle-style migrations with meta/_journal.json and *.sql files.\n * These migrations will be applied when the extension is installed.\n * Example: \"database/migrations\"\n */\n migrationsDir?: string | null;\n}\n\n// Config Types\nexport interface HaexHubConfig {\n debug?: boolean;\n timeout?: number;\n /** Extension manifest data (auto-injected by framework integrations) */\n manifest?: ExtensionManifest;\n}\n\n// Web/Fetch Types\nexport interface WebRequestOptions {\n method?: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\" | \"HEAD\" | \"OPTIONS\";\n headers?: Record<string, string>;\n body?: string | ArrayBuffer | Blob;\n timeout?: number;\n}\n\nexport interface WebResponse {\n status: number;\n statusText: string;\n headers: Record<string, string>;\n body: ArrayBuffer;\n url: string;\n}\n\n// Error Codes\nexport enum ErrorCode {\n // Connection Errors\n TIMEOUT = \"TIMEOUT\",\n NOT_IN_IFRAME = \"NOT_IN_IFRAME\",\n UNAUTHORIZED_ORIGIN = \"UNAUTHORIZED_ORIGIN\",\n\n // Permission Errors\n PERMISSION_DENIED = \"PERMISSION_DENIED\",\n\n // Validation Errors\n INVALID_PUBLIC_KEY = \"INVALID_PUBLIC_KEY\",\n INVALID_EXTENSION_NAME = \"INVALID_EXTENSION_NAME\",\n INVALID_TABLE_NAME = \"INVALID_TABLE_NAME\",\n INVALID_PARAMS = \"INVALID_PARAMS\",\n\n // Extension Errors\n EXTENSION_NOT_INITIALIZED = \"EXTENSION_NOT_INITIALIZED\",\n EXTENSION_INFO_UNAVAILABLE = \"EXTENSION_INFO_UNAVAILABLE\",\n\n // API Errors\n METHOD_NOT_FOUND = \"METHOD_NOT_FOUND\",\n INTERNAL_ERROR = \"INTERNAL_ERROR\",\n DATABASE_ERROR = \"DATABASE_ERROR\",\n WEB_ERROR = \"WEB_ERROR\",\n}\n\nexport class HaexVaultSdkError extends Error {\n constructor(\n public code: ErrorCode,\n public messageKey: string,\n public details?: Record<string, unknown>\n ) {\n super(messageKey);\n this.name = \"HaexVaultSdkError\";\n }\n\n /**\n * Get localized error message\n * @param locale - Locale code (e.g., 'en', 'de')\n * @param translations - Translation object\n */\n getLocalizedMessage(\n locale: string = \"en\",\n translations?: Record<string, Record<string, string>>\n ): string {\n if (!translations || !translations[locale]) {\n return this.messageKey;\n }\n\n let message = translations[locale][this.messageKey] || this.messageKey;\n\n // Replace placeholders with details\n if (this.details) {\n Object.entries(this.details).forEach(([key, value]) => {\n message = message.replace(`{${key}}`, String(value));\n });\n }\n\n return message;\n }\n\n toJSON() {\n return {\n code: this.code,\n message: this.messageKey,\n details: this.details,\n };\n }\n}\n","/**\n * Central request method name definitions for HaexHub SDK\n *\n * Request Naming Schema: haextension:{subject}:{action}\n *\n * These are used for client.request() calls between extensions and HaexHub\n */\n\nexport const HAEXTENSION_METHODS = {\n context: {\n get: 'haextension:context:get',\n },\n\n database: {\n query: 'haextension:database:query',\n execute: 'haextension:database:execute',\n transaction: 'haextension:database:transaction',\n registerMigrations: 'haextension:database:register-migrations',\n },\n\n filesystem: {\n saveFile: 'haextension:filesystem:save-file',\n openFile: 'haextension:filesystem:open-file',\n showImage: 'haextension:filesystem:show-image',\n // Generic FS operations (Phase 2)\n readFile: 'haextension:filesystem:read-file',\n writeFile: 'haextension:filesystem:write-file',\n readDir: 'haextension:filesystem:read-dir',\n mkdir: 'haextension:filesystem:mkdir',\n remove: 'haextension:filesystem:remove',\n exists: 'haextension:filesystem:exists',\n stat: 'haextension:filesystem:stat',\n selectFolder: 'haextension:filesystem:select-folder',\n selectFile: 'haextension:filesystem:select-file',\n rename: 'haextension:filesystem:rename',\n copy: 'haextension:filesystem:copy',\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 // Remote Storage API (S3, WebDAV, FTP, etc.)\n remoteStorage: {\n // Backend Management\n listBackends: 'haextension:remote-storage:list-backends',\n addBackend: 'haextension:remote-storage:add-backend',\n removeBackend: 'haextension:remote-storage:remove-backend',\n testBackend: 'haextension:remote-storage:test-backend',\n // Storage Operations\n upload: 'haextension:remote-storage:upload',\n download: 'haextension:remote-storage:download',\n delete: 'haextension:remote-storage:delete',\n list: 'haextension:remote-storage:list',\n },\n\n web: {\n fetch: 'haextension:web:fetch',\n },\n\n application: {\n open: 'haextension:application:open',\n },\n} as const;\n\n// Helper type to extract all string values from nested object\ntype DeepValues<T> = T extends object\n ? T[keyof T] extends string\n ? T[keyof T]\n : T[keyof T] extends object\n ? DeepValues<T[keyof T]>\n : never\n : never;\n\nexport type HaextensionMethod = DeepValues<typeof HAEXTENSION_METHODS>;\n","import type { HaexVaultSdk } from \"~/client\";\nimport { HAEXTENSION_METHODS } from \"~/methods\";\n\nexport class StorageAPI {\n constructor(private client: HaexVaultSdk) {}\n\n async getItem(key: string): Promise<string | null> {\n return this.client.request<string | null>(HAEXTENSION_METHODS.storage.getItem, { key });\n }\n\n async setItem(key: string, value: string): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.storage.setItem, { key, value });\n }\n\n async removeItem(key: string): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.storage.removeItem, { key });\n }\n\n async clear(): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.storage.clear);\n }\n\n async keys(): Promise<string[]> {\n return this.client.request<string[]>(HAEXTENSION_METHODS.storage.keys);\n }\n}\n","import type { HaexVaultSdk } from \"../client\";\nimport type { DatabaseQueryResult, MigrationResult, Migration } from \"../types\";\nimport { HAEXTENSION_METHODS } from \"../methods\";\n\nexport class DatabaseAPI {\n constructor(private client: HaexVaultSdk) {}\n\n async query<T>(query: string, params?: unknown[]): Promise<T[]> {\n const result = await this.client.request<DatabaseQueryResult>(\n HAEXTENSION_METHODS.database.query,\n {\n query,\n params: params || [],\n }\n );\n\n return result.rows as T[];\n }\n\n async queryOne<T = unknown>(\n query: string,\n params?: unknown[]\n ): Promise<T | null> {\n const rows = await this.query<T>(query, params);\n return rows.length > 0 ? rows[0] ?? null : null;\n }\n\n async execute(\n query: string,\n params?: unknown[]\n ): Promise<DatabaseQueryResult> {\n return this.client.request<DatabaseQueryResult>(HAEXTENSION_METHODS.database.execute, {\n query,\n params: params || [],\n });\n }\n\n async transaction(statements: string[]): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.database.transaction, {\n statements,\n });\n }\n\n async createTable(tableName: string, columns: string): Promise<void> {\n const query = `CREATE TABLE IF NOT EXISTS ${tableName} (${columns})`;\n await this.execute(query);\n }\n\n async dropTable(tableName: string): Promise<void> {\n const query = `DROP TABLE IF EXISTS ${tableName}`;\n await this.execute(query);\n }\n\n /**\n * Registers and applies extension migrations with HaexVault\n *\n * HaexVault will:\n * 1. Validate all SQL statements (ensure only extension's own tables are accessed)\n * 2. Store migrations with applied_at = NULL\n * 3. Query pending migrations sorted by name\n * 4. Apply pending migrations and set up CRDT triggers\n * 5. Mark successful migrations with applied_at timestamp\n *\n * @param extensionVersion - The version of the extension\n * @param migrations - Array of migration objects with name and SQL content\n * @returns Promise with migration result (applied count, already applied count, applied migration names)\n */\n async registerMigrationsAsync(\n extensionVersion: string,\n migrations: Migration[]\n ): Promise<MigrationResult> {\n return this.client.request<MigrationResult>(\n HAEXTENSION_METHODS.database.registerMigrations,\n {\n extensionVersion,\n migrations,\n }\n );\n }\n\n async insert(\n tableName: string,\n data: Record<string, unknown>\n ): Promise<number> {\n const keys = Object.keys(data);\n const values = Object.values(data);\n const placeholders = keys.map(() => \"?\").join(\", \");\n\n const query = `INSERT INTO ${tableName} (${keys.join(\n \", \"\n )}) VALUES (${placeholders})`;\n const result = await this.execute(query, values);\n\n return result.lastInsertId ?? -1;\n }\n\n async update(\n tableName: string,\n data: Record<string, unknown>,\n where: string,\n whereParams?: unknown[]\n ): Promise<number> {\n const keys = Object.keys(data);\n const values = Object.values(data);\n const setClause = keys.map((key) => `${key} = ?`).join(\", \");\n\n const query = `UPDATE ${tableName} SET ${setClause} WHERE ${where}`;\n const result = await this.execute(query, [\n ...values,\n ...(whereParams || []),\n ]);\n\n return result.rowsAffected;\n }\n\n async delete(\n tableName: string,\n where: string,\n whereParams?: unknown[]\n ): Promise<number> {\n const query = `DELETE FROM ${tableName} WHERE ${where}`;\n const result = await this.execute(query, whereParams);\n return result.rowsAffected;\n }\n\n async count(\n tableName: string,\n where?: string,\n whereParams?: unknown[]\n ): Promise<number> {\n const query = where\n ? `SELECT COUNT(*) as count FROM ${tableName} WHERE ${where}`\n : `SELECT COUNT(*) as count FROM ${tableName}`;\n\n const result = await this.queryOne<{ count: number }>(query, whereParams);\n return result?.count ?? 0;\n }\n\n}\n","import type { HaexVaultSdk } from \"../client\";\nimport { HAEXTENSION_METHODS } from \"../methods\";\n\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\n// ============================================================================\n// Generic Filesystem Types (Phase 2)\n// ============================================================================\n\n/**\n * File/directory metadata\n */\nexport interface FileStat {\n /** File size in bytes */\n size: number;\n /** True if this is a file */\n isFile: boolean;\n /** True if this is a directory */\n isDirectory: boolean;\n /** True if this is a symbolic link */\n isSymlink: boolean;\n /** Last modified time (Unix timestamp in milliseconds) */\n modified?: number;\n /** Created time (Unix timestamp in milliseconds) */\n created?: number;\n /** Whether the file is read-only */\n readonly: boolean;\n}\n\n/**\n * Directory entry\n */\nexport interface DirEntry {\n /** Entry name (not full path) */\n name: string;\n /** Full path */\n path: string;\n /** True if this is a file */\n isFile: boolean;\n /** True if this is a directory */\n isDirectory: boolean;\n /** File size in bytes (0 for directories) */\n size: number;\n /** Last modified time (Unix timestamp in milliseconds) */\n modified?: number;\n}\n\n/**\n * Options for selecting a folder\n */\nexport interface SelectFolderOptions {\n /** Dialog title */\n title?: string;\n /** Default path to open */\n defaultPath?: string;\n}\n\n/**\n * Options for selecting files\n */\nexport interface SelectFileOptions {\n /** Dialog title */\n title?: string;\n /** Default path to open */\n defaultPath?: string;\n /** File filters (name -> extensions) */\n filters?: Array<[string, string[]]>;\n /** Allow multiple file selection */\n multiple?: boolean;\n}\n\nexport class FilesystemAPI {\n constructor(private client: HaexVaultSdk) {}\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 // ==========================================================================\n // Generic Filesystem Operations (Phase 2)\n // ==========================================================================\n\n /**\n * Read file contents\n * @param path Absolute path to the file\n * @returns File contents as Uint8Array\n */\n async readFile(path: string): Promise<Uint8Array> {\n const base64 = await this.client.request<string>(\n HAEXTENSION_METHODS.filesystem.readFile,\n { path }\n );\n // Decode base64\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n }\n\n /**\n * Write file contents\n * @param path Absolute path to the file\n * @param data File contents as Uint8Array\n */\n async writeFile(path: string, data: Uint8Array): Promise<void> {\n // Encode to base64\n const base64 = btoa(String.fromCharCode(...data));\n await this.client.request(\n HAEXTENSION_METHODS.filesystem.writeFile,\n { path, data: base64 }\n );\n }\n\n /**\n * Read directory contents\n * @param path Absolute path to the directory\n * @returns Array of directory entries\n */\n async readDir(path: string): Promise<DirEntry[]> {\n return this.client.request<DirEntry[]>(\n HAEXTENSION_METHODS.filesystem.readDir,\n { path }\n );\n }\n\n /**\n * Create a directory (and parent directories if needed)\n * @param path Absolute path to create\n */\n async mkdir(path: string): Promise<void> {\n await this.client.request(\n HAEXTENSION_METHODS.filesystem.mkdir,\n { path }\n );\n }\n\n /**\n * Remove a file or directory\n * @param path Absolute path to remove\n * @param recursive If true, remove directories recursively\n */\n async remove(path: string, recursive = false): Promise<void> {\n await this.client.request(\n HAEXTENSION_METHODS.filesystem.remove,\n { path, recursive }\n );\n }\n\n /**\n * Check if a path exists\n * @param path Absolute path to check\n * @returns True if the path exists\n */\n async exists(path: string): Promise<boolean> {\n return this.client.request<boolean>(\n HAEXTENSION_METHODS.filesystem.exists,\n { path }\n );\n }\n\n /**\n * Get file/directory metadata\n * @param path Absolute path\n * @returns File metadata\n */\n async stat(path: string): Promise<FileStat> {\n return this.client.request<FileStat>(\n HAEXTENSION_METHODS.filesystem.stat,\n { path }\n );\n }\n\n /**\n * Open a folder selection dialog\n * @param options Dialog options\n * @returns Selected folder path, or null if cancelled\n */\n async selectFolder(options: SelectFolderOptions = {}): Promise<string | null> {\n return this.client.request<string | null, SelectFolderOptions>(\n HAEXTENSION_METHODS.filesystem.selectFolder,\n options\n );\n }\n\n /**\n * Open a file selection dialog\n * @param options Dialog options\n * @returns Selected file paths, or null if cancelled\n */\n async selectFile(options: SelectFileOptions = {}): Promise<string[] | null> {\n return this.client.request<string[] | null, SelectFileOptions>(\n HAEXTENSION_METHODS.filesystem.selectFile,\n options\n );\n }\n\n /**\n * Rename/move a file or directory\n * @param from Source path\n * @param to Destination path\n */\n async rename(from: string, to: string): Promise<void> {\n await this.client.request(\n HAEXTENSION_METHODS.filesystem.rename,\n { from, to }\n );\n }\n\n /**\n * Copy a file\n * @param from Source path\n * @param to Destination path\n */\n async copy(from: string, to: string): Promise<void> {\n await this.client.request(\n HAEXTENSION_METHODS.filesystem.copy,\n { from, to }\n );\n }\n}\n","import type { HaexVaultSdk } from \"../client\";\nimport type { WebRequestOptions, WebResponse } from \"../types\";\nimport { HAEXTENSION_METHODS } from \"../methods\";\n\nexport class WebAPI {\n constructor(private client: HaexVaultSdk) {}\n\n /**\n * Performs a web request through the HaexHub host application\n * @param url The URL to fetch\n * @param options Request options (method, headers, body, timeout)\n * @returns Promise resolving to the web response\n */\n async fetchAsync(url: string, options: WebRequestOptions = {}): Promise<WebResponse> {\n // Convert body to base64 if it's an ArrayBuffer or Blob\n let bodyParam: string | undefined;\n\n if (options.body) {\n if (options.body instanceof ArrayBuffer) {\n bodyParam = this.arrayBufferToBase64(options.body);\n } else if (options.body instanceof Blob) {\n bodyParam = await this.blobToBase64(options.body);\n } else {\n bodyParam = options.body;\n }\n }\n\n const response = await this.client.request<{\n status: number;\n statusText: string;\n headers: Record<string, string>;\n body: string; // Base64 encoded\n url: string;\n }>(HAEXTENSION_METHODS.web.fetch, {\n url,\n method: options.method || \"GET\",\n headers: options.headers,\n body: bodyParam,\n timeout: options.timeout,\n });\n\n // Convert base64 body back to ArrayBuffer\n const bodyBuffer = this.base64ToArrayBuffer(response.body);\n\n return {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n body: bodyBuffer,\n url: response.url,\n };\n }\n\n /**\n * Convenience method for JSON requests\n */\n async fetchJsonAsync<T = unknown>(\n url: string,\n options: WebRequestOptions = {}\n ): Promise<T> {\n const response = await this.fetchAsync(url, options);\n const text = new TextDecoder().decode(response.body);\n return JSON.parse(text) as T;\n }\n\n /**\n * Convenience method for text requests\n */\n async fetchTextAsync(url: string, options: WebRequestOptions = {}): Promise<string> {\n const response = await this.fetchAsync(url, options);\n return new TextDecoder().decode(response.body);\n }\n\n /**\n * Convenience method for blob requests\n */\n async fetchBlobAsync(url: string, options: WebRequestOptions = {}): Promise<Blob> {\n const response = await this.fetchAsync(url, options);\n return new Blob([response.body]);\n }\n\n /**\n * Opens a URL in the user's default browser\n * @param url The URL to open\n */\n async openAsync(url: string): Promise<void> {\n await this.client.request<void>(HAEXTENSION_METHODS.application.open, {\n application: \"browser\",\n url,\n });\n }\n\n private arrayBufferToBase64(buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer);\n let binary = '';\n for (let i = 0; i < bytes.byteLength; i++) {\n const byte = bytes[i];\n if (byte === undefined) {\n throw new Error('Invalid byte at index ' + i);\n }\n binary += String.fromCharCode(byte);\n }\n return btoa(binary);\n }\n\n private async blobToBase64(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => {\n const result = reader.result;\n if (typeof result !== 'string') {\n reject(new Error('Failed to read blob as data URL'));\n return;\n }\n const parts = result.split(',');\n const base64 = parts[1];\n if (!base64) {\n reject(new Error('Failed to extract base64 from data URL'));\n return;\n }\n resolve(base64);\n };\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n });\n }\n\n private base64ToArrayBuffer(base64: string): ArrayBuffer {\n const binaryString = atob(base64);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes.buffer;\n }\n}\n","import type { HaexVaultSdk } from \"../client\";\nimport type { PermissionResponse } from \"../types\";\n\nexport class PermissionsAPI {\n constructor(private client: HaexVaultSdk) {}\n\n /**\n * Checks if the extension has permission for a database operation\n * @param resource The database resource (table name or \"*\" for all tables)\n * @param operation The operation type (\"read\" or \"write\")\n * @returns Promise<boolean> indicating if permission is granted\n */\n async checkDatabaseAsync(\n resource: string,\n operation: \"read\" | \"write\"\n ): Promise<boolean> {\n const response = await this.client.request<PermissionResponse>(\n \"permissions.database.check\",\n {\n resource,\n operation,\n }\n );\n return response.status === \"granted\";\n }\n\n /**\n * Checks if the extension has permission for a web request\n * @param url The URL to check (e.g., \"https://example.com/path\")\n * @returns Promise<boolean> indicating if permission is granted\n * @note Method/operation is not checked - permissions apply to all HTTP methods\n */\n async checkWebAsync(url: string): Promise<boolean> {\n const response = await this.client.request<PermissionResponse>(\n \"permissions.web.check\",\n {\n url,\n }\n );\n return response.status === \"granted\";\n }\n\n /**\n * Checks if the extension has permission for a filesystem operation\n * @param path The file or directory path\n * @param operation The operation type (\"read\" or \"write\")\n * @returns Promise<boolean> indicating if permission is granted\n */\n async checkFilesystemAsync(\n path: string,\n operation: \"read\" | \"write\"\n ): Promise<boolean> {\n const response = await this.client.request<PermissionResponse>(\n \"permissions.filesystem.check\",\n {\n path,\n operation,\n }\n );\n return response.status === \"granted\";\n }\n}\n","import type { HaexVaultSdk } from \"~/client\";\nimport { HAEXTENSION_METHODS } from \"~/methods\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Storage backend info (public, without credentials)\n */\nexport interface StorageBackendInfo {\n id: string;\n /** Backend type (e.g., \"s3\") */\n type: string;\n name: string;\n enabled: boolean;\n createdAt: string;\n}\n\n/**\n * S3-compatible backend configuration\n */\nexport interface S3Config {\n /** Custom endpoint URL (for non-AWS S3-compatible services) */\n endpoint?: string;\n /** AWS region or custom region name */\n region: string;\n /** Bucket name */\n bucket: string;\n /** Access key ID */\n accessKeyId: string;\n /** Secret access key */\n secretAccessKey: string;\n /** Use path-style URLs instead of virtual-hosted-style */\n pathStyle?: boolean;\n}\n\n/**\n * Request to add a new storage backend\n */\nexport interface AddBackendRequest {\n /** Display name for the backend */\n name: string;\n /** Backend type (currently only \"s3\") */\n type: \"s3\";\n /** Configuration (structure depends on type) */\n config: S3Config | Record<string, unknown>;\n}\n\n/**\n * Object info from list operation\n */\nexport interface StorageObjectInfo {\n /** Object key */\n key: string;\n /** Size in bytes */\n size: number;\n /** Last modified timestamp (ISO 8601) */\n lastModified?: string;\n}\n\n// ============================================================================\n// Remote Storage API\n// ============================================================================\n\n/**\n * Remote Storage API for S3-compatible (and future WebDAV, FTP) backends.\n *\n * This API provides access to external storage backends configured centrally\n * in haex-vault. Extensions can upload/download files without CORS issues.\n *\n * @example\n * ```typescript\n * // List available backends\n * const backends = await sdk.remoteStorage.backends.list();\n *\n * // Upload data\n * const data = new TextEncoder().encode(\"Hello World\");\n * await sdk.remoteStorage.upload(backendId, \"path/to/file.txt\", data);\n *\n * // Download data\n * const downloaded = await sdk.remoteStorage.download(backendId, \"path/to/file.txt\");\n * ```\n */\nexport class RemoteStorageAPI {\n public readonly backends: BackendManagement;\n\n constructor(private client: HaexVaultSdk) {\n this.backends = new BackendManagement(client);\n }\n\n /**\n * Upload data to a storage backend\n * @param backendId - Backend ID to upload to\n * @param key - Object key (path in the bucket)\n * @param data - Data to upload\n */\n async upload(backendId: string, key: string, data: Uint8Array): Promise<void> {\n const base64 = btoa(String.fromCharCode(...data));\n await this.client.request(HAEXTENSION_METHODS.remoteStorage.upload, {\n backendId,\n key,\n data: base64,\n });\n }\n\n /**\n * Download data from a storage backend\n * @param backendId - Backend ID to download from\n * @param key - Object key (path in the bucket)\n * @returns Downloaded data as Uint8Array\n */\n async download(backendId: string, key: string): Promise<Uint8Array> {\n const base64 = await this.client.request<string>(\n HAEXTENSION_METHODS.remoteStorage.download,\n { backendId, key }\n );\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n }\n\n /**\n * Delete an object from a storage backend\n * @param backendId - Backend ID\n * @param key - Object key to delete\n */\n async delete(backendId: string, key: string): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.remoteStorage.delete, {\n backendId,\n key,\n });\n }\n\n /**\n * List objects in a storage backend\n * @param backendId - Backend ID\n * @param prefix - Optional prefix to filter objects\n * @returns List of objects\n */\n async list(backendId: string, prefix?: string): Promise<StorageObjectInfo[]> {\n return this.client.request<StorageObjectInfo[]>(\n HAEXTENSION_METHODS.remoteStorage.list,\n { backendId, prefix }\n );\n }\n}\n\n/**\n * Backend management operations\n */\nclass BackendManagement {\n constructor(private client: HaexVaultSdk) {}\n\n /**\n * List all available storage backends\n */\n async list(): Promise<StorageBackendInfo[]> {\n return this.client.request<StorageBackendInfo[]>(\n HAEXTENSION_METHODS.remoteStorage.listBackends\n );\n }\n\n /**\n * Add a new storage backend\n * @param request - Backend configuration\n * @returns Created backend info\n */\n async add(request: AddBackendRequest): Promise<StorageBackendInfo> {\n return this.client.request<StorageBackendInfo, AddBackendRequest>(\n HAEXTENSION_METHODS.remoteStorage.addBackend,\n request\n );\n }\n\n /**\n * Remove a storage backend\n * @param backendId - Backend ID to remove\n */\n async remove(backendId: string): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.remoteStorage.removeBackend, {\n backendId,\n });\n }\n\n /**\n * Test connection to a storage backend\n * @param backendId - Backend ID to test\n */\n async test(backendId: string): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.remoteStorage.testBackend, {\n backendId,\n });\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","/**\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 * Table Name Utilities\n *\n * Functions for creating, parsing, and validating table names.\n * Table names follow the format: publicKey__extensionName__tableName\n */\n\nimport {\n ErrorCode,\n TABLE_SEPARATOR,\n HaexVaultSdkError,\n getTableName as buildTableName,\n} from \"../types\";\nimport type { ExtensionInfo } from \"../types\";\n\n/**\n * Table name parse result\n */\nexport interface ParsedTableName {\n publicKey: string;\n extensionName: string;\n tableName: string;\n}\n\n/**\n * Validate a public key\n */\nexport function validatePublicKey(publicKey: string): void {\n if (\n !publicKey ||\n typeof publicKey !== \"string\" ||\n publicKey.trim() === \"\"\n ) {\n throw new HaexVaultSdkError(\n ErrorCode.INVALID_PUBLIC_KEY,\n \"errors.invalid_public_key\",\n { publicKey }\n );\n }\n}\n\n/**\n * Validate an extension name\n */\nexport function validateExtensionName(extensionName: string): void {\n if (!extensionName || !/^[a-z][a-z0-9-]*$/i.test(extensionName)) {\n throw new HaexVaultSdkError(\n ErrorCode.INVALID_EXTENSION_NAME,\n \"errors.invalid_extension_name\",\n { extensionName }\n );\n }\n\n if (extensionName.includes(TABLE_SEPARATOR)) {\n throw new HaexVaultSdkError(\n ErrorCode.INVALID_EXTENSION_NAME,\n \"errors.extension_name_contains_separator\",\n { extensionName, separator: TABLE_SEPARATOR }\n );\n }\n}\n\n/**\n * Validate a table name\n */\nexport function validateTableName(tableName: string): void {\n if (!tableName || typeof tableName !== \"string\") {\n throw new HaexVaultSdkError(\n ErrorCode.INVALID_TABLE_NAME,\n \"errors.table_name_empty\"\n );\n }\n\n if (tableName.includes(TABLE_SEPARATOR)) {\n throw new HaexVaultSdkError(\n ErrorCode.INVALID_TABLE_NAME,\n \"errors.table_name_contains_separator\",\n { tableName, separator: TABLE_SEPARATOR }\n );\n }\n\n if (!/^[a-z][a-z0-9-_]*$/i.test(tableName)) {\n throw new HaexVaultSdkError(\n ErrorCode.INVALID_TABLE_NAME,\n \"errors.table_name_format\",\n { tableName }\n );\n }\n}\n\n/**\n * Get a prefixed table name for the current extension\n * @param extensionInfo The current extension info\n * @param tableName The base table name\n * @returns The fully qualified table name wrapped in quotes\n */\nexport function getExtensionTableName(\n extensionInfo: ExtensionInfo | null,\n tableName: string\n): string {\n if (!extensionInfo) {\n throw new HaexVaultSdkError(\n ErrorCode.EXTENSION_INFO_UNAVAILABLE,\n \"errors.extension_info_unavailable\"\n );\n }\n\n validateTableName(tableName);\n\n const { publicKey, name } = extensionInfo;\n\n // Return table name wrapped in double quotes to handle special characters\n return `\"${buildTableName(publicKey, name, tableName)}\"`;\n}\n\n/**\n * Get a prefixed table name for a dependency extension\n * @param publicKey The dependency's public key\n * @param extensionName The dependency's extension name\n * @param tableName The base table name\n * @returns The fully qualified table name wrapped in quotes\n */\nexport function getDependencyTableName(\n publicKey: string,\n extensionName: string,\n tableName: string\n): string {\n validatePublicKey(publicKey);\n validateExtensionName(extensionName);\n validateTableName(tableName);\n\n // Return table name wrapped in double quotes to handle special characters\n return `\"${buildTableName(publicKey, extensionName, tableName)}\"`;\n}\n\n/**\n * Parse a full table name into its components\n * @param fullTableName The fully qualified table name (optionally quoted)\n * @returns The parsed components or null if invalid\n */\nexport function parseTableName(fullTableName: string): ParsedTableName | null {\n // Remove surrounding quotes if present\n let cleanTableName = fullTableName;\n if (cleanTableName.startsWith('\"') && cleanTableName.endsWith('\"')) {\n cleanTableName = cleanTableName.slice(1, -1);\n }\n\n const parts = cleanTableName.split(TABLE_SEPARATOR);\n\n if (parts.length !== 3) {\n return null;\n }\n\n const [publicKey, extensionName, tableName] = parts;\n\n if (!publicKey || !extensionName || !tableName) {\n return null;\n }\n\n return {\n publicKey,\n extensionName,\n tableName,\n };\n}\n","/**\n * Client Initialization\n *\n * Functions for initializing the client in different modes:\n * - Native WebView mode (Tauri)\n * - IFrame mode (mobile/web)\n */\n\nimport { HAEXTENSION_EVENTS, EXTERNAL_EVENTS } from \"../events\";\nimport { HAEXTENSION_METHODS } from \"../methods\";\nimport { HAEXSPACE_MESSAGE_TYPES } from \"../messages\";\nimport { ErrorCode, HaexVaultSdkError } from \"../types\";\nimport type { ExtensionInfo, ApplicationContext, HaexHubEvent } from \"../types\";\nimport type { ClientContext, ClientConfig, LogFn } from \"./context\";\n\n/**\n * Tauri API types\n */\ninterface TauriInvoke {\n invoke: <T>(cmd: string, args?: Record<string, unknown>) => Promise<T>;\n}\n\ninterface TauriEvent {\n listen: (event: string, handler: (event: { payload: unknown }) => void) => Promise<() => void>;\n}\n\n/**\n * Check if we're running in an iframe\n */\nexport function isInIframe(): boolean {\n return window.self !== window.top;\n}\n\n/**\n * Check if Tauri is available\n */\nexport function hasTauri(): boolean {\n return typeof (window as unknown as { __TAURI__?: unknown }).__TAURI__ !== \"undefined\";\n}\n\n/**\n * Get Tauri core API\n */\nexport function getTauriCore(): TauriInvoke {\n return (window as unknown as { __TAURI__: { core: TauriInvoke } }).__TAURI__.core;\n}\n\n/**\n * Get Tauri event API\n */\nexport function getTauriEvent(): TauriEvent {\n return (window as unknown as { __TAURI__: { event: TauriEvent } }).__TAURI__.event;\n}\n\n/**\n * Initialize in native WebView mode (Tauri)\n */\nexport async function initNativeMode(\n ctx: ClientContext,\n log: LogFn,\n onEvent: (event: HaexHubEvent) => void,\n onContextChange: (context: ApplicationContext) => void\n): Promise<{ extensionInfo: ExtensionInfo; context: ApplicationContext }> {\n const { invoke } = getTauriCore();\n\n // Get extension info from Tauri backend\n const extensionInfo = await invoke<ExtensionInfo>(\"webview_extension_get_info\");\n const context = await invoke<ApplicationContext>(\"webview_extension_context_get\");\n\n ctx.state.isNativeWindow = true;\n ctx.state.initialized = true;\n ctx.state.extensionInfo = extensionInfo;\n ctx.state.context = context;\n\n log(\"HaexVault SDK initialized in native WebViewWindow mode\");\n log(\"Extension info:\", extensionInfo);\n log(\"Application context:\", context);\n\n // Setup Tauri event listeners\n await setupTauriEventListeners(ctx, log, onEvent, onContextChange);\n\n return { extensionInfo, context };\n}\n\n/**\n * Setup Tauri event listeners for context changes and external requests\n */\nasync function setupTauriEventListeners(\n ctx: ClientContext,\n log: LogFn,\n onEvent: (event: HaexHubEvent) => void,\n onContextChange: (context: ApplicationContext) => void\n): Promise<void> {\n const { listen } = getTauriEvent();\n\n console.log(\"[HaexVault SDK] Setting up Tauri event listener for:\", HAEXTENSION_EVENTS.CONTEXT_CHANGED);\n\n // Listen for context changes\n try {\n await listen(HAEXTENSION_EVENTS.CONTEXT_CHANGED, (event) => {\n console.log(\"[HaexVault SDK] Received Tauri event:\", HAEXTENSION_EVENTS.CONTEXT_CHANGED, event);\n log(\"Received context change event:\", event);\n\n const payload = event.payload as { context?: ApplicationContext };\n if (payload?.context) {\n ctx.state.context = payload.context;\n console.log(\"[HaexVault SDK] Updated context to:\", ctx.state.context);\n onContextChange(payload.context);\n onEvent({\n type: HAEXTENSION_EVENTS.CONTEXT_CHANGED,\n data: { context: ctx.state.context },\n timestamp: Date.now(),\n });\n } else {\n console.warn(\"[HaexVault SDK] Event received but no context in payload:\", event);\n }\n });\n console.log(\"[HaexVault SDK] Context change listener registered successfully\");\n } catch (error) {\n console.error(\"[HaexVault SDK] Failed to setup context change listener:\", error);\n log(\"Failed to setup context change listener:\", error);\n }\n\n // Listen for external requests\n try {\n await listen(EXTERNAL_EVENTS.REQUEST, (event) => {\n console.log(\"[HaexVault SDK] ====== EXTERNAL REQUEST RECEIVED ======\");\n console.log(\"[HaexVault SDK] Event payload:\", JSON.stringify(event.payload, null, 2));\n log(\"Received external request event:\", event);\n if (event.payload) {\n onEvent({\n type: EXTERNAL_EVENTS.REQUEST,\n data: event.payload,\n timestamp: Date.now(),\n });\n } else {\n console.warn(\"[HaexVault SDK] External request event has no payload!\");\n }\n });\n console.log(\"[HaexVault SDK] External request listener registered successfully\");\n } catch (error) {\n console.error(\"[HaexVault SDK] Failed to setup external request listener:\", error);\n log(\"Failed to setup external request listener:\", error);\n }\n}\n\n/**\n * Initialize in iframe mode\n */\nexport async function initIframeMode(\n ctx: ClientContext,\n log: LogFn,\n messageHandler: (event: MessageEvent) => void,\n request: <T>(method: string, params?: Record<string, unknown>) => Promise<T>\n): Promise<{ context: ApplicationContext }> {\n // Verify we're in an iframe\n if (!isInIframe()) {\n throw new HaexVaultSdkError(ErrorCode.NOT_IN_IFRAME, \"errors.not_in_iframe\");\n }\n\n // Setup message listener\n ctx.handlers.messageHandler = messageHandler;\n window.addEventListener(\"message\", messageHandler);\n\n ctx.state.isNativeWindow = false;\n ctx.state.initialized = true;\n log(\"HaexVault SDK initialized in iframe mode\");\n\n // Load extension info from manifest if provided\n if (ctx.config.manifest) {\n ctx.state.extensionInfo = {\n publicKey: ctx.config.manifest.publicKey,\n name: ctx.config.manifest.name,\n version: ctx.config.manifest.version,\n displayName: ctx.config.manifest.name,\n };\n log(\"Extension info loaded from manifest:\", ctx.state.extensionInfo);\n }\n\n // Send debug info in debug mode\n sendDebugInfo(ctx.config);\n\n // Request context - this also acts as a handshake\n const context = await request<ApplicationContext>(HAEXTENSION_METHODS.context.get);\n ctx.state.context = context;\n log(\"Application context received:\", context);\n\n return { context };\n}\n\n/**\n * Send debug info to parent window (development only)\n */\nfunction sendDebugInfo(config: ClientConfig): void {\n if (!config.debug) return;\n if (typeof window === \"undefined\" || !window.parent) return;\n\n const debugInfo = `SDK Debug:\\nwindow.parent exists: ${!!window.parent}\\nwindow.parent === window: ${window.parent === window}\\nwindow.self === window.top: ${window.self === window.top}`;\n\n try {\n window.parent.postMessage({\n type: HAEXSPACE_MESSAGE_TYPES.DEBUG,\n data: debugInfo,\n }, \"*\");\n } catch (e) {\n // Fallback to alert only in debug mode\n alert(debugInfo + `\\npostMessage error: ${e}`);\n }\n}\n","/**\n * Tauri Command Names\n *\n * Central definition of all Tauri invoke command names.\n * These must match the #[tauri::command] function names in Rust.\n */\n\nexport const TAURI_COMMANDS = {\n database: {\n query: \"webview_extension_db_query\",\n execute: \"webview_extension_db_execute\",\n registerMigrations: \"webview_extension_db_register_migrations\",\n },\n\n permissions: {\n checkWeb: \"webview_extension_check_web_permission\",\n checkDatabase: \"webview_extension_check_database_permission\",\n checkFilesystem: \"webview_extension_check_filesystem_permission\",\n },\n\n web: {\n open: \"webview_extension_web_open\",\n fetch: \"webview_extension_web_request\",\n },\n\n filesystem: {\n saveFile: \"webview_extension_fs_save_file\",\n openFile: \"webview_extension_fs_open_file\",\n showImage: \"webview_extension_fs_show_image\",\n // Generic filesystem operations (no webview_ prefix because they're global)\n // Permission checks happen in the message handler layer\n readFile: \"filesystem_read_file\",\n writeFile: \"filesystem_write_file\",\n readDir: \"filesystem_read_dir\",\n mkdir: \"filesystem_mkdir\",\n remove: \"filesystem_remove\",\n exists: \"filesystem_exists\",\n stat: \"filesystem_stat\",\n selectFolder: \"filesystem_select_folder\",\n selectFile: \"filesystem_select_file\",\n rename: \"filesystem_rename\",\n copy: \"filesystem_copy\",\n },\n\n external: {\n // Response handling (called by extensions running in WebView)\n respond: \"webview_extension_external_respond\",\n\n // Bridge server management\n bridgeStart: \"external_bridge_start\",\n bridgeStop: \"external_bridge_stop\",\n bridgeGetStatus: \"external_bridge_get_status\",\n\n // Client authorization (unified API with remember flag)\n clientAllow: \"external_client_allow\",\n clientBlock: \"external_client_block\",\n\n // Authorized clients management (permanent - stored in database)\n getAuthorizedClients: \"external_get_authorized_clients\",\n revokeClient: \"external_revoke_client\",\n\n // Session-based authorizations (temporary - cleared when haex-vault restarts)\n getSessionAuthorizations: \"external_get_session_authorizations\",\n revokeSessionAuthorization: \"external_revoke_session_authorization\",\n\n // Blocked clients management\n getBlockedClients: \"external_get_blocked_clients\",\n unblockClient: \"external_unblock_client\",\n isClientBlocked: \"external_is_client_blocked\",\n\n // Pending authorizations\n getPendingAuthorizations: \"external_get_pending_authorizations\",\n },\n\n extension: {\n getInfo: \"webview_extension_get_info\",\n getContext: \"webview_extension_context_get\",\n },\n\n storage: {\n // Backend Management (generic, shared by all extensions)\n // These commands don't use webview_ prefix because storage backends are global,\n // not extension-specific. All extensions share the same storage backends.\n listBackends: \"storage_list_backends\",\n addBackend: \"storage_add_backend\",\n removeBackend: \"storage_remove_backend\",\n testBackend: \"storage_test_backend\",\n // Storage Operations\n upload: \"storage_upload\",\n download: \"storage_download\",\n delete: \"storage_delete\",\n list: \"storage_list\",\n },\n\n} as const;\n\n// Type helper to extract command string literals\nexport type TauriCommand =\n | (typeof TAURI_COMMANDS.database)[keyof typeof TAURI_COMMANDS.database]\n | (typeof TAURI_COMMANDS.permissions)[keyof typeof TAURI_COMMANDS.permissions]\n | (typeof TAURI_COMMANDS.web)[keyof typeof TAURI_COMMANDS.web]\n | (typeof TAURI_COMMANDS.filesystem)[keyof typeof TAURI_COMMANDS.filesystem]\n | (typeof TAURI_COMMANDS.external)[keyof typeof TAURI_COMMANDS.external]\n | (typeof TAURI_COMMANDS.extension)[keyof typeof TAURI_COMMANDS.extension]\n | (typeof TAURI_COMMANDS.storage)[keyof typeof TAURI_COMMANDS.storage];\n","/**\n * Database Handler\n *\n * Maps database SDK methods to Tauri invoke commands\n */\n\nimport { HAEXTENSION_METHODS } from \"../../methods\";\nimport { TAURI_COMMANDS } from \"../../commands\";\nimport type {\n InvokeHandlerMap,\n InvokeMapping,\n DatabaseQueryParams,\n DatabaseMigrationsParams,\n} from \"./types\";\n\nexport const databaseHandlers: InvokeHandlerMap = {\n [HAEXTENSION_METHODS.database.query]: {\n command: TAURI_COMMANDS.database.query,\n args: (p: DatabaseQueryParams) => ({\n query: p.query,\n params: p.params || [],\n }),\n } satisfies InvokeMapping<DatabaseQueryParams>,\n\n [HAEXTENSION_METHODS.database.execute]: {\n command: TAURI_COMMANDS.database.execute,\n args: (p: DatabaseQueryParams) => ({\n query: p.query,\n params: p.params || [],\n }),\n } satisfies InvokeMapping<DatabaseQueryParams>,\n\n [HAEXTENSION_METHODS.database.registerMigrations]: {\n command: TAURI_COMMANDS.database.registerMigrations,\n args: (p: DatabaseMigrationsParams) => ({\n extensionVersion: p.extensionVersion,\n migrations: p.migrations,\n }),\n } satisfies InvokeMapping<DatabaseMigrationsParams>,\n};\n","/**\n * Permissions Handler\n *\n * Maps permission SDK methods to Tauri invoke commands\n */\n\nimport { TAURI_COMMANDS } from \"../../commands\";\nimport type { InvokeHandlerMap, PermissionCheckParams } from \"./types\";\n\nexport const permissionsHandlers: InvokeHandlerMap = {\n \"permissions.web.check\": {\n command: TAURI_COMMANDS.permissions.checkWeb,\n args: (p: PermissionCheckParams) => ({\n url: p.url,\n }),\n },\n\n \"permissions.database.check\": {\n command: TAURI_COMMANDS.permissions.checkDatabase,\n args: (p: PermissionCheckParams) => ({\n resource: p.resource,\n operation: p.operation,\n }),\n },\n\n \"permissions.filesystem.check\": {\n command: TAURI_COMMANDS.permissions.checkFilesystem,\n args: (p: PermissionCheckParams) => ({\n path: p.path,\n actionStr: p.action,\n }),\n },\n};\n","/**\n * Web Handler\n *\n * Maps web/application SDK methods to Tauri invoke commands\n */\n\nimport { HAEXTENSION_METHODS } from \"../../methods\";\nimport { TAURI_COMMANDS } from \"../../commands\";\nimport type { InvokeHandlerMap, WebFetchParams } from \"./types\";\n\ninterface ApplicationOpenParams {\n url: string;\n}\n\nexport const webHandlers: InvokeHandlerMap = {\n [HAEXTENSION_METHODS.application.open]: {\n command: TAURI_COMMANDS.web.open,\n args: (p: ApplicationOpenParams) => ({\n url: p.url,\n }),\n },\n\n [HAEXTENSION_METHODS.web.fetch]: {\n command: TAURI_COMMANDS.web.fetch,\n args: (p: WebFetchParams) => ({\n url: p.url,\n method: p.method,\n headers: p.headers,\n body: p.body,\n }),\n },\n};\n","/**\n * Filesystem Handler\n *\n * Maps filesystem SDK methods to Tauri invoke commands\n */\n\nimport { HAEXTENSION_METHODS } from \"../../methods\";\nimport { TAURI_COMMANDS } from \"../../commands\";\nimport type { InvokeHandlerMap, FilesystemSaveParams, FilesystemOpenParams } from \"./types\";\n\ninterface FilesystemShowImageParams {\n dataUrl: string;\n}\n\nexport const filesystemHandlers: InvokeHandlerMap = {\n [HAEXTENSION_METHODS.filesystem.saveFile]: {\n command: TAURI_COMMANDS.filesystem.saveFile,\n args: (p: FilesystemSaveParams) => ({\n data: p.data,\n defaultPath: p.defaultPath,\n title: p.title,\n filters: p.filters,\n }),\n },\n\n [HAEXTENSION_METHODS.filesystem.openFile]: {\n command: TAURI_COMMANDS.filesystem.openFile,\n args: (p: FilesystemOpenParams) => ({\n data: p.data,\n fileName: p.fileName,\n }),\n },\n\n [HAEXTENSION_METHODS.filesystem.showImage]: {\n command: TAURI_COMMANDS.filesystem.showImage,\n args: (p: FilesystemShowImageParams) => ({\n dataUrl: p.dataUrl,\n }),\n },\n};\n","/**\n * External Handler\n *\n * Maps external request SDK methods to Tauri invoke commands\n */\n\nimport { TAURI_COMMANDS } from \"../../commands\";\nimport type { InvokeHandlerMap, ExternalRespondParams } from \"./types\";\n\nexport const externalHandlers: InvokeHandlerMap = {\n \"external.respond\": {\n command: TAURI_COMMANDS.external.respond,\n args: (p: ExternalRespondParams) => ({\n requestId: p.requestId,\n success: p.success,\n data: p.data,\n error: p.error,\n }),\n },\n};\n","/**\n * Remote Storage Handler\n *\n * Maps remote storage SDK methods to Tauri invoke commands\n */\n\nimport { HAEXTENSION_METHODS } from \"../../methods\";\nimport { TAURI_COMMANDS } from \"../../commands\";\nimport type { InvokeHandlerMap, InvokeMapping } from \"./types\";\n\n// ============================================================================\n// Parameter Types\n// ============================================================================\n\ninterface ListBackendsParams {\n // No params needed\n}\n\ninterface AddBackendParams {\n name: string;\n type: string;\n config: Record<string, unknown>;\n}\n\ninterface RemoveBackendParams {\n backendId: string;\n}\n\ninterface TestBackendParams {\n backendId: string;\n}\n\ninterface UploadParams {\n backendId: string;\n key: string;\n data: string; // Base64 encoded\n}\n\ninterface DownloadParams {\n backendId: string;\n key: string;\n}\n\ninterface DeleteParams {\n backendId: string;\n key: string;\n}\n\ninterface ListParams {\n backendId: string;\n prefix?: string;\n}\n\n// ============================================================================\n// Handlers\n// ============================================================================\n\nexport const remoteStorageHandlers: InvokeHandlerMap = {\n // Backend Management\n [HAEXTENSION_METHODS.remoteStorage.listBackends]: {\n command: TAURI_COMMANDS.storage.listBackends,\n args: (_p: ListBackendsParams) => ({}),\n } satisfies InvokeMapping<ListBackendsParams>,\n\n [HAEXTENSION_METHODS.remoteStorage.addBackend]: {\n command: TAURI_COMMANDS.storage.addBackend,\n args: (p: AddBackendParams) => ({\n name: p.name,\n backendType: p.type,\n config: p.config,\n }),\n } satisfies InvokeMapping<AddBackendParams>,\n\n [HAEXTENSION_METHODS.remoteStorage.removeBackend]: {\n command: TAURI_COMMANDS.storage.removeBackend,\n args: (p: RemoveBackendParams) => ({\n backendId: p.backendId,\n }),\n } satisfies InvokeMapping<RemoveBackendParams>,\n\n [HAEXTENSION_METHODS.remoteStorage.testBackend]: {\n command: TAURI_COMMANDS.storage.testBackend,\n args: (p: TestBackendParams) => ({\n backendId: p.backendId,\n }),\n } satisfies InvokeMapping<TestBackendParams>,\n\n // Storage Operations\n [HAEXTENSION_METHODS.remoteStorage.upload]: {\n command: TAURI_COMMANDS.storage.upload,\n args: (p: UploadParams) => ({\n backendId: p.backendId,\n key: p.key,\n data: p.data,\n }),\n } satisfies InvokeMapping<UploadParams>,\n\n [HAEXTENSION_METHODS.remoteStorage.download]: {\n command: TAURI_COMMANDS.storage.download,\n args: (p: DownloadParams) => ({\n backendId: p.backendId,\n key: p.key,\n }),\n } satisfies InvokeMapping<DownloadParams>,\n\n [HAEXTENSION_METHODS.remoteStorage.delete]: {\n command: TAURI_COMMANDS.storage.delete,\n args: (p: DeleteParams) => ({\n backendId: p.backendId,\n key: p.key,\n }),\n } satisfies InvokeMapping<DeleteParams>,\n\n [HAEXTENSION_METHODS.remoteStorage.list]: {\n command: TAURI_COMMANDS.storage.list,\n args: (p: ListParams) => ({\n backendId: p.backendId,\n prefix: p.prefix,\n }),\n } satisfies InvokeMapping<ListParams>,\n};\n","/**\n * Transport Handlers Index\n *\n * Combines all domain-specific handlers into a single handler map\n */\n\nimport type { InvokeHandlerMap } from \"./types\";\nimport { databaseHandlers } from \"./database\";\nimport { permissionsHandlers } from \"./permissions\";\nimport { webHandlers } from \"./web\";\nimport { filesystemHandlers } from \"./filesystem\";\nimport { externalHandlers } from \"./external\";\nimport { remoteStorageHandlers } from \"./remoteStorage\";\n\n/**\n * Combined handler map for all SDK methods\n * Used by both invoke and postMessage transports\n */\nexport const allHandlers: InvokeHandlerMap = {\n ...databaseHandlers,\n ...permissionsHandlers,\n ...webHandlers,\n ...filesystemHandlers,\n ...externalHandlers,\n ...remoteStorageHandlers,\n};\n\n// Re-export types and individual handlers for flexibility\nexport type { InvokeHandlerMap, InvokeMapping } from \"./types\";\nexport { databaseHandlers } from \"./database\";\nexport { permissionsHandlers } from \"./permissions\";\nexport { webHandlers } from \"./web\";\nexport { filesystemHandlers } from \"./filesystem\";\nexport { externalHandlers } from \"./external\";\nexport { remoteStorageHandlers } from \"./remoteStorage\";\n","/**\n * Transport Module\n *\n * Functions for sending requests via different transport mechanisms:\n * - postMessage (iframe mode)\n * - Tauri invoke (native WebView mode)\n */\n\nimport { ErrorCode, HaexVaultSdkError } from \"../types\";\nimport type { HaexHubRequest, ExtensionInfo } from \"../types\";\nimport { allHandlers } from \"../transport/handlers\";\nimport type { ClientConfig, PendingRequest, LogFn } from \"./context\";\n\n/**\n * Generate a unique request ID\n */\nexport function generateRequestId(counter: number): string {\n return `req_${counter}`;\n}\n\n/**\n * Send a request via postMessage (iframe mode)\n */\nexport function sendPostMessage<T>(\n method: string,\n params: Record<string, unknown>,\n requestId: string,\n config: ClientConfig,\n extensionInfo: ExtensionInfo | null,\n pendingRequests: Map<string, PendingRequest>\n): Promise<T> {\n const request: HaexHubRequest = {\n method,\n params,\n timestamp: Date.now(),\n };\n\n return new Promise<T>((resolve, reject) => {\n const timeout = setTimeout(() => {\n pendingRequests.delete(requestId);\n reject(\n new HaexVaultSdkError(ErrorCode.TIMEOUT, \"errors.timeout\", {\n timeout: config.timeout,\n })\n );\n }, config.timeout);\n\n pendingRequests.set(requestId, { resolve, reject, timeout });\n\n // Use wildcard origin since extensions are sandboxed in their own protocol\n const targetOrigin = \"*\";\n\n if (config.debug) {\n console.log(\"[SDK Debug] ========== Sending Request ==========\");\n console.log(\"[SDK Debug] Request ID:\", requestId);\n console.log(\"[SDK Debug] Method:\", request.method);\n console.log(\"[SDK Debug] Params:\", request.params);\n console.log(\"[SDK Debug] Target origin:\", targetOrigin);\n console.log(\"[SDK Debug] Extension info:\", extensionInfo);\n console.log(\"[SDK Debug] ========================================\");\n }\n\n window.parent.postMessage({ id: requestId, ...request }, targetOrigin);\n });\n}\n\n/**\n * Send a request via Tauri invoke (native WebView mode)\n */\nexport async function sendInvoke<T>(\n method: string,\n params: Record<string, unknown>,\n config: ClientConfig,\n log: LogFn\n): Promise<T> {\n const { invoke } = (window as unknown as { __TAURI__: { core: { invoke: <R>(cmd: string, args?: Record<string, unknown>) => Promise<R> } } }).__TAURI__.core;\n\n if (config.debug) {\n console.log(\"[SDK Debug] ========== Invoke Request ==========\");\n console.log(\"[SDK Debug] Method:\", method);\n console.log(\"[SDK Debug] Params:\", params);\n console.log(\"[SDK Debug] =======================================\");\n }\n\n // Look up handler for this method\n const handler = allHandlers[method];\n\n if (handler) {\n const args = handler.args(params);\n console.log(\"[SDK Debug] Handler found for method:\", method);\n console.log(\"[SDK Debug] Handler command:\", handler.command);\n console.log(\"[SDK Debug] Transformed args:\", JSON.stringify(args, null, 2));\n return invoke<T>(handler.command, args);\n }\n\n // Method not found in handlers\n throw new HaexVaultSdkError(\n ErrorCode.METHOD_NOT_FOUND,\n \"errors.method_not_found\",\n { method }\n );\n}\n\n/**\n * Handle a response for a pending request\n */\nexport function handlePendingResponse(\n requestId: string,\n result: unknown,\n error: unknown,\n pendingRequests: Map<string, PendingRequest>,\n debug: boolean\n): boolean {\n const pending = pendingRequests.get(requestId);\n if (!pending) {\n if (debug) {\n console.warn(\n \"[SDK Debug] ⚠️ Received response for unknown request ID:\",\n requestId\n );\n console.warn(\n \"[SDK Debug] Known IDs:\",\n Array.from(pendingRequests.keys())\n );\n }\n return false;\n }\n\n clearTimeout(pending.timeout);\n pendingRequests.delete(requestId);\n\n if (error) {\n if (debug) {\n console.error(\"[SDK Debug] ❌ Request failed:\", error);\n }\n pending.reject(error);\n } else {\n if (debug) {\n console.log(\"[SDK Debug] ✅ Request succeeded:\", result);\n }\n pending.resolve(result);\n }\n\n return true;\n}\n","/**\n * Event Handling Module\n *\n * Functions for handling messages and events from the parent window (iframe mode)\n * or from Tauri events (native mode).\n */\n\nimport { HAEXTENSION_EVENTS, EXTERNAL_EVENTS } from \"../events\";\nimport type {\n HaexHubResponse,\n HaexHubEvent,\n EventCallback,\n ContextChangedEvent,\n ExternalRequestEvent,\n ApplicationContext,\n} from \"../types\";\nimport type { ClientConfig, PendingRequest, LogFn } from \"./context\";\n\n/**\n * Create a message handler for iframe mode\n */\nexport function createMessageHandler(\n config: ClientConfig,\n pendingRequests: Map<string, PendingRequest>,\n extensionInfo: () => unknown,\n onEvent: (event: HaexHubEvent) => void\n): (event: MessageEvent) => void {\n return (event: MessageEvent) => {\n if (config.debug) {\n console.log(\"[SDK Debug] ========== Message Received ==========\");\n console.log(\"[SDK Debug] Event origin:\", event.origin);\n console.log(\n \"[SDK Debug] Event source:\",\n event.source === window.parent ? \"parent window\" : \"unknown\"\n );\n console.log(\"[SDK Debug] Event data:\", event.data);\n console.log(\"[SDK Debug] Extension info loaded:\", !!extensionInfo());\n console.log(\n \"[SDK Debug] Pending requests count:\",\n pendingRequests.size\n );\n }\n\n // Verify message comes from parent window\n if (event.source !== window.parent) {\n if (config.debug) {\n console.error(\"[SDK Debug] ❌ REJECTED: Message not from parent window!\");\n }\n return;\n }\n\n const data = event.data as HaexHubResponse | HaexHubEvent;\n\n // Handle pending request responses\n if (\"id\" in data && pendingRequests.has(data.id)) {\n if (config.debug) {\n console.log(\"[SDK Debug] ✅ Found pending request for ID:\", data.id);\n }\n const pending = pendingRequests.get(data.id)!;\n clearTimeout(pending.timeout);\n pendingRequests.delete(data.id);\n\n if (data.error) {\n if (config.debug) {\n console.error(\"[SDK Debug] ❌ Request failed:\", data.error);\n }\n pending.reject(data.error);\n } else {\n if (config.debug) {\n console.log(\"[SDK Debug] ✅ Request succeeded:\", data.result);\n }\n pending.resolve(data.result);\n }\n return;\n }\n\n // Warn about unknown request IDs\n if (\"id\" in data && !pendingRequests.has(data.id)) {\n if (config.debug) {\n console.warn(\n \"[SDK Debug] ⚠️ Received response for unknown request ID:\",\n data.id\n );\n console.warn(\n \"[SDK Debug] Known IDs:\",\n Array.from(pendingRequests.keys())\n );\n }\n }\n\n // Handle events\n if (\"type\" in data && data.type) {\n if (config.debug) {\n console.log(\"[SDK Debug] Event received:\", data.type);\n }\n onEvent(data as HaexHubEvent);\n }\n\n if (config.debug) {\n console.log(\"[SDK Debug] ========== End Message ==========\");\n }\n };\n}\n\n/**\n * Process an incoming event\n */\nexport function processEvent(\n event: HaexHubEvent,\n log: LogFn,\n eventListeners: Map<string, Set<EventCallback>>,\n onContextChanged: (context: ApplicationContext) => void,\n onExternalRequest: (event: ExternalRequestEvent) => void\n): void {\n // Handle context changes\n if (event.type === HAEXTENSION_EVENTS.CONTEXT_CHANGED) {\n const contextEvent = event as ContextChangedEvent;\n onContextChanged(contextEvent.data.context);\n log(\"Context updated:\", contextEvent.data.context);\n }\n\n // Handle external requests from authorized clients\n if (event.type === EXTERNAL_EVENTS.REQUEST) {\n const externalEvent = event as ExternalRequestEvent;\n onExternalRequest(externalEvent);\n return; // Don't emit to regular event listeners\n }\n\n // Emit to registered listeners\n emitEvent(event, log, eventListeners);\n}\n\n/**\n * Emit an event to registered listeners\n */\nexport function emitEvent(\n event: HaexHubEvent,\n log: LogFn,\n eventListeners: Map<string, Set<EventCallback>>\n): void {\n log(\"Event received:\", event);\n const listeners = eventListeners.get(event.type);\n if (listeners) {\n listeners.forEach((callback) => callback(event));\n }\n}\n\n/**\n * Register an event listener\n */\nexport function addEventListener(\n eventType: string,\n callback: EventCallback,\n eventListeners: Map<string, Set<EventCallback>>\n): void {\n if (!eventListeners.has(eventType)) {\n eventListeners.set(eventType, new Set());\n }\n eventListeners.get(eventType)!.add(callback);\n}\n\n/**\n * Remove an event listener\n */\nexport function removeEventListener(\n eventType: string,\n callback: EventCallback,\n eventListeners: Map<string, Set<EventCallback>>\n): void {\n const listeners = eventListeners.get(eventType);\n if (listeners) {\n listeners.delete(callback);\n }\n}\n\n/**\n * Notify all reactive subscribers\n */\nexport function notifySubscribers(subscribers: Set<() => void>): void {\n subscribers.forEach((callback) => callback());\n}\n","/**\n * Database Module\n *\n * Functions for database operations including Drizzle ORM initialization\n * and raw SQL query/execute methods.\n */\n\nimport { HAEXTENSION_METHODS } from \"../methods\";\nimport { ErrorCode, HaexVaultSdkError } from \"../types\";\nimport type { ExtensionInfo, DatabaseQueryResult } from \"../types\";\nimport { drizzle, type SqliteRemoteDatabase } from \"drizzle-orm/sqlite-proxy\";\nimport type { LogFn } from \"./context\";\n\n/**\n * Request function type for database operations\n */\ntype RequestFn = <T>(method: string, params?: Record<string, unknown>) => Promise<T>;\n\n/**\n * Create a Drizzle ORM database instance\n *\n * @param schema The Drizzle schema object (with prefixed table names)\n * @param extensionInfo The current extension info (required)\n * @param request The request function for SDK communication\n * @param log Logger function\n * @returns The type-safe Drizzle database instance\n */\nexport function createDrizzleInstance<T extends Record<string, unknown>>(\n schema: T,\n extensionInfo: ExtensionInfo | null,\n request: RequestFn,\n log: LogFn\n): SqliteRemoteDatabase<T> {\n if (!extensionInfo) {\n throw new HaexVaultSdkError(\n ErrorCode.EXTENSION_INFO_UNAVAILABLE,\n \"errors.client_not_ready\"\n );\n }\n\n return drizzle<T>(\n async (\n sql: string,\n params: unknown[],\n method: \"get\" | \"run\" | \"all\" | \"values\"\n ) => {\n try {\n // Drizzle uses different methods:\n // - \"run\": INSERT/UPDATE/DELETE without RETURNING\n // - \"all\": INSERT/UPDATE/DELETE with RETURNING, or SELECT\n // - \"get\": SELECT with LIMIT 1\n // - \"values\": SELECT returning raw values\n //\n // The backend intelligently handles routing:\n // - method=\"run\" and \"all\" go to haextension.db.execute\n // - Backend detects SELECT statements and delegates to haextension.db.query\n // - Backend returns rows when RETURNING clause is present\n\n if (method === \"run\" || method === \"all\") {\n const result = await request<DatabaseQueryResult>(\n HAEXTENSION_METHODS.database.execute,\n {\n query: sql,\n params: params as unknown[],\n }\n );\n\n // For method=\"all\", return rows (RETURNING clause or SELECT delegated by backend)\n if (method === \"all\") {\n return { rows: result.rows || [] };\n }\n\n // For method=\"run\", check if we have rows (RETURNING clause)\n if (result.rows && Array.isArray(result.rows) && result.rows.length > 0) {\n return { rows: result.rows };\n }\n\n return result;\n }\n\n // Read operations (SELECT without RETURNING)\n const result = await request<DatabaseQueryResult>(HAEXTENSION_METHODS.database.query, {\n query: sql,\n params: params as unknown[],\n });\n\n const rows = result.rows as unknown[];\n\n if (method === \"get\") {\n return { rows: rows.length > 0 ? rows.at(0) : undefined };\n }\n\n return { rows };\n } catch (error) {\n log(\"Database operation failed:\", error);\n throw error;\n }\n },\n {\n schema: schema,\n logger: false,\n }\n );\n}\n\n/**\n * Execute a raw SQL query (SELECT)\n *\n * @param sql The SQL query string\n * @param params Query parameters\n * @param request The request function\n * @param debug Whether debug mode is enabled\n * @returns Array of result rows\n */\nexport async function queryRaw<T = Record<string, unknown>>(\n sql: string,\n params: unknown[],\n request: RequestFn,\n debug: boolean\n): Promise<T[]> {\n const result = await request<DatabaseQueryResult>(\n HAEXTENSION_METHODS.database.query,\n { query: sql, params }\n );\n if (debug) {\n console.log(\"[SDK query()] Raw result:\", JSON.stringify(result, null, 2));\n }\n return result.rows as T[];\n}\n\n/**\n * Execute a raw SQL statement (INSERT, UPDATE, DELETE, CREATE, etc.)\n *\n * @param sql The SQL statement\n * @param params Statement parameters\n * @param request The request function\n * @returns Object with rowsAffected and optionally lastInsertId\n */\nexport async function executeRaw(\n sql: string,\n params: unknown[],\n request: RequestFn\n): Promise<{ rowsAffected: number; lastInsertId?: number }> {\n const result = await request<DatabaseQueryResult>(\n HAEXTENSION_METHODS.database.execute,\n { query: sql, params }\n );\n return {\n rowsAffected: result.rowsAffected,\n lastInsertId: result.lastInsertId,\n };\n}\n","/**\n * External Request Handling Module\n *\n * Functions for handling external requests from authorized clients\n * (browser extensions, CLI tools, servers, etc.)\n */\n\nimport type {\n ExternalRequest,\n ExternalResponse,\n ExternalRequestHandler,\n} from \"../types\";\nimport type { LogFn } from \"./context\";\n\n/**\n * Request function type\n */\ntype RequestFn = <T>(method: string, params?: Record<string, unknown>) => Promise<T>;\n\n/**\n * Register an external request handler\n *\n * @param action The action/method name to handle\n * @param handler The handler function\n * @param handlers The handlers map\n * @param log Logger function\n * @returns Unsubscribe function\n */\nexport function registerExternalHandler(\n action: string,\n handler: ExternalRequestHandler,\n handlers: Map<string, ExternalRequestHandler>,\n log: LogFn\n): () => void {\n handlers.set(action, handler);\n log(`[ExternalRequest] Registered handler for action: ${action}`);\n\n return () => {\n handlers.delete(action);\n log(`[ExternalRequest] Unregistered handler for action: ${action}`);\n };\n}\n\n/**\n * Handle an incoming external request\n *\n * @param request The external request\n * @param handlers The handlers map\n * @param respond Function to send response\n * @param log Logger function\n */\nexport async function handleExternalRequest(\n request: ExternalRequest,\n handlers: Map<string, ExternalRequestHandler>,\n respond: (response: ExternalResponse) => Promise<void>,\n log: LogFn\n): Promise<void> {\n console.log(\"[SDK Debug] handleExternalRequest called!\");\n console.log(\"[SDK Debug] Request:\", JSON.stringify(request, null, 2));\n console.log(\"[SDK Debug] Available handlers:\", Array.from(handlers.keys()));\n log(`[ExternalRequest] Received request: ${request.action} from ${request.publicKey.substring(0, 20)}...`);\n\n const handler = handlers.get(request.action);\n\n if (!handler) {\n log(`[ExternalRequest] No handler for action: ${request.action}`);\n await respond({\n requestId: request.requestId,\n success: false,\n error: `No handler registered for action: ${request.action}`,\n });\n return;\n }\n\n try {\n const response = await handler(request);\n await respond(response);\n log(`[ExternalRequest] Response sent for: ${request.action}`);\n } catch (error) {\n log(`[ExternalRequest] Handler error:`, error);\n await respond({\n requestId: request.requestId,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n}\n\n/**\n * Send an external response back to haex-vault\n *\n * @param response The response to send\n * @param request The request function\n */\nexport async function respondToExternalRequest(\n response: ExternalResponse,\n request: RequestFn\n): Promise<void> {\n console.log(\"[SDK Debug] respondToExternalRequest called with:\", JSON.stringify(response, null, 2));\n await request(\"external.respond\", response as unknown as Record<string, unknown>);\n}\n","/**\n * HaexVault Client\n *\n * Main SDK client for extensions running in HaexVault.\n * Supports both native WebView mode (Tauri) and iframe mode (mobile/web).\n */\n\nimport type {\n HaexHubConfig,\n HaexHubEvent,\n EventCallback,\n PermissionResponse,\n DatabasePermissionRequest,\n ExtensionInfo,\n ApplicationContext,\n SearchResult,\n MigrationResult,\n Migration,\n ExternalResponse,\n ExternalRequestHandler,\n} from \"./types\";\nimport { DEFAULT_TIMEOUT } from \"./types\";\nimport { StorageAPI } from \"./api/storage\";\nimport { DatabaseAPI } from \"./api/database\";\nimport { FilesystemAPI } from \"./api/filesystem\";\nimport { WebAPI } from \"./api/web\";\nimport { PermissionsAPI } from \"./api/permissions\";\nimport { RemoteStorageAPI } from \"./api/remoteStorage\";\nimport { installConsoleForwarding } from \"./polyfills/consoleForwarding\";\nimport type { SqliteRemoteDatabase } from \"drizzle-orm/sqlite-proxy\";\n\n// Client modules\nimport type { ClientConfig, PendingRequest } from \"./client/context\";\nimport {\n getExtensionTableName,\n getDependencyTableName as getDependencyTableNameFn,\n parseTableName as parseTableNameFn,\n} from \"./client/tableName\";\nimport { isInIframe, hasTauri, initNativeMode, initIframeMode } from \"./client/init\";\nimport { sendPostMessage, sendInvoke, generateRequestId } from \"./client/transport\";\nimport {\n createMessageHandler,\n processEvent,\n addEventListener,\n removeEventListener,\n notifySubscribers,\n} from \"./client/events\";\nimport { createDrizzleInstance, queryRaw, executeRaw } from \"./client/database\";\nimport { registerExternalHandler, handleExternalRequest, respondToExternalRequest } from \"./client/external\";\n\nexport class HaexVaultSdk {\n // Configuration\n private readonly config: ClientConfig;\n\n // State\n private initialized = false;\n private isNativeWindow = false;\n private requestCounter = 0;\n private _extensionInfo: ExtensionInfo | null = null;\n private _context: ApplicationContext | null = null;\n private _setupCompleted = false;\n\n // Collections\n private readonly pendingRequests: Map<string, PendingRequest> = new Map();\n private readonly eventListeners: Map<string, Set<EventCallback>> = new Map();\n private readonly externalRequestHandlers: Map<string, ExternalRequestHandler> = new Map();\n private readonly reactiveSubscribers: Set<() => void> = new Set();\n\n // Handlers\n private messageHandler: ((event: MessageEvent) => void) | null = null;\n\n // Promises\n private readyPromise: Promise<void>;\n private resolveReady!: () => void;\n private setupPromise: Promise<void> | null = null;\n private setupHook: (() => Promise<void>) | null = null;\n\n // Public APIs\n public orm: SqliteRemoteDatabase<Record<string, unknown>> | null = null;\n public readonly storage: StorageAPI;\n public readonly database: DatabaseAPI;\n public readonly filesystem: FilesystemAPI;\n public readonly web: WebAPI;\n public readonly permissions: PermissionsAPI;\n public readonly remoteStorage: RemoteStorageAPI;\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 this.remoteStorage = new RemoteStorageAPI(this);\n\n installConsoleForwarding(this.config.debug);\n\n this.readyPromise = new Promise((resolve) => {\n this.resolveReady = resolve;\n });\n\n this.init();\n }\n\n // ==========================================================================\n // Lifecycle\n // ==========================================================================\n\n public async ready(): Promise<void> {\n return this.readyPromise;\n }\n\n public get setupCompleted(): boolean {\n return this._setupCompleted;\n }\n\n public onSetup(setupFn: () => Promise<void>): void {\n if (this.setupHook) {\n throw new Error(\"Setup hook already registered\");\n }\n this.setupHook = setupFn;\n }\n\n public async setupComplete(): Promise<void> {\n await this.readyPromise;\n\n if (!this.setupHook || this.setupCompleted) {\n return;\n }\n\n if (!this.setupPromise) {\n this.setupPromise = this.runSetupAsync();\n }\n\n return this.setupPromise;\n }\n\n public destroy(): void {\n if (this.messageHandler) {\n window.removeEventListener(\"message\", this.messageHandler);\n }\n\n this.pendingRequests.forEach(({ timeout }) => clearTimeout(timeout));\n this.pendingRequests.clear();\n this.eventListeners.clear();\n\n this.initialized = false;\n this.log(\"HaexVault SDK destroyed\");\n }\n\n // ==========================================================================\n // Properties\n // ==========================================================================\n\n public get extensionInfo(): ExtensionInfo | null {\n return this._extensionInfo;\n }\n\n public get context(): ApplicationContext | null {\n return this._context;\n }\n\n // ==========================================================================\n // Subscriptions\n // ==========================================================================\n\n public subscribe(callback: () => void): () => void {\n this.reactiveSubscribers.add(callback);\n return () => {\n this.reactiveSubscribers.delete(callback);\n };\n }\n\n // ==========================================================================\n // Table Name Utilities\n // ==========================================================================\n\n public getTableName(tableName: string): string {\n return getExtensionTableName(this._extensionInfo, tableName);\n }\n\n public getDependencyTableName(publicKey: string, extensionName: string, tableName: string): string {\n return getDependencyTableNameFn(publicKey, extensionName, tableName);\n }\n\n public parseTableName(fullTableName: string): { publicKey: string; extensionName: string; tableName: string } | null {\n return parseTableNameFn(fullTableName);\n }\n\n // ==========================================================================\n // Database\n // ==========================================================================\n\n public initializeDatabase<T extends Record<string, unknown>>(schema: T): SqliteRemoteDatabase<T> {\n const db = createDrizzleInstance(schema, this._extensionInfo, this.request.bind(this), this.log.bind(this));\n this.orm = db as SqliteRemoteDatabase<Record<string, unknown>>;\n return db;\n }\n\n public async query<T = Record<string, unknown>>(sql: string, params: unknown[] = []): Promise<T[]> {\n return queryRaw<T>(sql, params, this.request.bind(this), this.config.debug);\n }\n\n public async select<T = Record<string, unknown>>(sql: string, params: unknown[] = []): Promise<T[]> {\n return this.query<T>(sql, params);\n }\n\n public async execute(sql: string, params: unknown[] = []): Promise<{ rowsAffected: number; lastInsertId?: number }> {\n return executeRaw(sql, params, this.request.bind(this));\n }\n\n public async registerMigrationsAsync(extensionVersion: string, migrations: Migration[]): Promise<MigrationResult> {\n return this.database.registerMigrationsAsync(extensionVersion, migrations);\n }\n\n // ==========================================================================\n // Dependencies\n // ==========================================================================\n\n public async getDependencies(): Promise<ExtensionInfo[]> {\n return this.request<ExtensionInfo[]>(\"extensions.getDependencies\");\n }\n\n // ==========================================================================\n // Permissions\n // ==========================================================================\n\n public async requestDatabasePermission(request: DatabasePermissionRequest): Promise<PermissionResponse> {\n return this.request<PermissionResponse>(\"permissions.database.request\", {\n resource: request.resource,\n operation: request.operation,\n reason: request.reason,\n });\n }\n\n public async checkDatabasePermission(resource: string, operation: \"read\" | \"write\"): Promise<boolean> {\n const response = await this.request<PermissionResponse>(\"permissions.database.check\", { resource, operation });\n return response.status === \"granted\";\n }\n\n // ==========================================================================\n // Search\n // ==========================================================================\n\n public async respondToSearch(requestId: string, results: SearchResult[]): Promise<void> {\n await this.request(\"search.respond\", { requestId, results });\n }\n\n // ==========================================================================\n // External Requests\n // ==========================================================================\n\n public onExternalRequest(action: string, handler: ExternalRequestHandler): () => void {\n return registerExternalHandler(action, handler, this.externalRequestHandlers, this.log.bind(this));\n }\n\n public async respondToExternalRequest(response: ExternalResponse): Promise<void> {\n await respondToExternalRequest(response, this.request.bind(this));\n }\n\n // ==========================================================================\n // Events\n // ==========================================================================\n\n public on(eventType: string, callback: EventCallback): void {\n addEventListener(eventType, callback, this.eventListeners);\n }\n\n public off(eventType: string, callback: EventCallback): void {\n removeEventListener(eventType, callback, this.eventListeners);\n }\n\n // ==========================================================================\n // Communication\n // ==========================================================================\n\n public async request<T = unknown, P = Record<string, unknown>>(method: string, params?: P): Promise<T> {\n const resolvedParams = (params ?? {}) as Record<string, unknown>;\n\n if (this.isNativeWindow && hasTauri()) {\n return sendInvoke<T>(method, resolvedParams, this.config, this.log.bind(this));\n }\n\n const requestId = generateRequestId(++this.requestCounter);\n return sendPostMessage<T>(method, resolvedParams, requestId, this.config, this._extensionInfo, this.pendingRequests);\n }\n\n // ==========================================================================\n // Private: Initialization\n // ==========================================================================\n\n private async init(): Promise<void> {\n if (this.initialized) return;\n\n // Check iframe mode FIRST before attempting Tauri calls\n // This prevents hanging on Android where __TAURI__ exists but sandboxed iframes can't access it\n if (!isInIframe() && hasTauri()) {\n try {\n await this.initNative();\n return;\n } catch (error) {\n this.log(\"Tauri commands failed, falling back to iframe mode\", error);\n }\n }\n\n await this.initIframe();\n }\n\n private async initNative(): Promise<void> {\n const { extensionInfo, context } = await initNativeMode(\n {\n config: this.config,\n state: {\n initialized: this.initialized,\n isNativeWindow: this.isNativeWindow,\n requestCounter: this.requestCounter,\n setupCompleted: this._setupCompleted,\n extensionInfo: this._extensionInfo,\n context: this._context,\n orm: this.orm,\n },\n collections: {\n pendingRequests: this.pendingRequests,\n eventListeners: this.eventListeners,\n externalRequestHandlers: this.externalRequestHandlers,\n reactiveSubscribers: this.reactiveSubscribers,\n },\n promises: {\n readyPromise: this.readyPromise,\n resolveReady: this.resolveReady,\n setupPromise: this.setupPromise,\n setupHook: this.setupHook,\n },\n handlers: {\n messageHandler: this.messageHandler,\n },\n },\n this.log.bind(this),\n this.handleEvent.bind(this),\n (ctx) => {\n this._context = ctx;\n this.notifySubscribersInternal();\n }\n );\n\n this._extensionInfo = extensionInfo;\n this._context = context;\n this.isNativeWindow = true;\n this.initialized = true;\n\n this.notifySubscribersInternal();\n this.resolveReady();\n }\n\n private async initIframe(): Promise<void> {\n this.messageHandler = createMessageHandler(\n this.config,\n this.pendingRequests,\n () => this._extensionInfo,\n this.handleEvent.bind(this)\n );\n\n const { context } = await initIframeMode(\n {\n config: this.config,\n state: {\n initialized: this.initialized,\n isNativeWindow: this.isNativeWindow,\n requestCounter: this.requestCounter,\n setupCompleted: this._setupCompleted,\n extensionInfo: this._extensionInfo,\n context: this._context,\n orm: this.orm,\n },\n collections: {\n pendingRequests: this.pendingRequests,\n eventListeners: this.eventListeners,\n externalRequestHandlers: this.externalRequestHandlers,\n reactiveSubscribers: this.reactiveSubscribers,\n },\n promises: {\n readyPromise: this.readyPromise,\n resolveReady: this.resolveReady,\n setupPromise: this.setupPromise,\n setupHook: this.setupHook,\n },\n handlers: {\n messageHandler: this.messageHandler,\n },\n },\n this.log.bind(this),\n this.messageHandler,\n this.request.bind(this)\n );\n\n // Load extension info from manifest if provided\n if (this.config.manifest) {\n this._extensionInfo = {\n publicKey: this.config.manifest.publicKey,\n name: this.config.manifest.name,\n version: this.config.manifest.version,\n displayName: this.config.manifest.name,\n };\n this.notifySubscribersInternal();\n }\n\n this._context = context;\n this.isNativeWindow = false;\n this.initialized = true;\n\n this.notifySubscribersInternal();\n this.resolveReady();\n }\n\n // ==========================================================================\n // Private: Event Handling\n // ==========================================================================\n\n private handleEvent(event: HaexHubEvent): void {\n processEvent(\n event,\n this.log.bind(this),\n this.eventListeners,\n (ctx) => {\n this._context = ctx;\n this.notifySubscribersInternal();\n },\n (extEvent) => this.handleExternalRequestInternal(extEvent.data)\n );\n }\n\n private async handleExternalRequestInternal(request: import(\"./types\").ExternalRequest): Promise<void> {\n await handleExternalRequest(request, this.externalRequestHandlers, this.respondToExternalRequest.bind(this), this.log.bind(this));\n }\n\n // ==========================================================================\n // Private: Setup\n // ==========================================================================\n\n private async runSetupAsync(): Promise<void> {\n if (!this.setupHook) return;\n\n try {\n this.log(\"[HaexVault] Running setup hook...\");\n await this.setupHook();\n this._setupCompleted = true;\n this.log(\"[HaexVault] Setup completed successfully\");\n this.notifySubscribersInternal();\n } catch (error) {\n this.log(\"[HaexVault] Setup failed:\", error);\n throw error;\n }\n }\n\n // ==========================================================================\n // Private: Utilities\n // ==========================================================================\n\n private notifySubscribersInternal(): void {\n notifySubscribers(this.reactiveSubscribers);\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log(\"[HaexVault SDK]\", ...args);\n }\n }\n}\n","import { defineNuxtPlugin } from \"nuxt/app\";\nimport { shallowRef, type ShallowRef } from \"vue\";\nimport { HaexVaultSdk } from \"~/client\";\nimport type { ExtensionManifest, ApplicationContext } from \"~/types\";\n\nexport default defineNuxtPlugin(async (nuxtApp) => {\n // Get manifest from runtime config (injected by Nuxt module)\n const manifest = nuxtApp.$config.public.haexVaultManifest as ExtensionManifest | null;\n\n // 1. Erstelle die Client-Instanz\n const client = new HaexVaultSdk({\n // @ts-ignore\n debug: nuxtApp.payload.config.public.debug ?? false,\n manifest: manifest || undefined,\n });\n\n // 2. Erstelle einen reaktiven Container (shallowRef ist performant)\n const state = shallowRef({\n isReady: false,\n isSetupComplete: false,\n context: client.context,\n });\n\n // 3. Warte auf die Initialisierung des Clients\n await client.ready();\n\n // 4. Setze den initialen State, sobald der Client bereit ist\n console.log('[Nuxt Plugin] Client ready, context:', client.context);\n state.value = {\n isReady: true,\n isSetupComplete: false,\n context: client.context,\n };\n console.log('[Nuxt Plugin] Initial state set:', state.value);\n\n // 5. Nutze dein Pub/Sub-Pattern, um auf künftige Updates zu lauschen\n client.subscribe(() => {\n console.log('[Nuxt Plugin] Client context updated:', client.context);\n\n // Check if setup was completed (setupCompleted is set by client.setupComplete())\n const isSetupComplete = client.setupCompleted;\n\n // Triggere ein Update für das shallowRef\n state.value = {\n ...state.value,\n context: client.context,\n isSetupComplete,\n };\n console.log('[Nuxt Plugin] State updated:', state.value);\n });\n\n // 6. 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 // 7. Stelle den Client und den reaktiven State bereit\n const haexVaultPlugin = {\n client, // Der rohe Client (für client.orm, client.database, etc.)\n state, // Der reaktive State (für die UI)\n };\n\n return {\n provide: {\n haexVault: haexVaultPlugin,\n },\n };\n});\n\n// Export type for type declarations\nexport type HaexVaultNuxtPlugin = {\n client: HaexVaultSdk;\n state: ShallowRef<{\n isReady: boolean;\n isSetupComplete: boolean;\n context: ApplicationContext | null;\n }>;\n};\n"]}
|