@haex-space/vault-sdk 2.3.0 → 2.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -478,7 +478,7 @@ function interceptConsole(level) {
478
478
  "*"
479
479
  );
480
480
  } catch (error) {
481
- originalConsole.error("[HaexHub] Failed to forward console message:", error);
481
+ originalConsole.error("[HaexSpace] Failed to forward console message:", error);
482
482
  }
483
483
  }
484
484
  };
@@ -491,7 +491,7 @@ function installConsoleForwarding(debug = false) {
491
491
  return;
492
492
  }
493
493
  if (!debug) {
494
- console.log("[HaexHub] Console forwarding disabled (not in debug mode)");
494
+ console.log("[HaexSpace] Console forwarding disabled (not in debug mode)");
495
495
  return;
496
496
  }
497
497
  interceptConsole("log");
@@ -499,7 +499,7 @@ function installConsoleForwarding(debug = false) {
499
499
  interceptConsole("warn");
500
500
  interceptConsole("error");
501
501
  interceptConsole("debug");
502
- console.log("[HaexHub] Console forwarding installed");
502
+ console.log("[HaexSpace] Console forwarding installed");
503
503
  }
504
504
  var HaexVaultClient = class {
505
505
  constructor(config = {}) {
@@ -575,13 +575,13 @@ var HaexVaultClient = class {
575
575
  async runSetupAsync() {
576
576
  if (!this.setupHook) return;
577
577
  try {
578
- this.log("[HaexHub] Running setup hook...");
578
+ this.log("[HaexSpace] Running setup hook...");
579
579
  await this.setupHook();
580
580
  this._setupCompleted = true;
581
- this.log("[HaexHub] Setup completed successfully");
581
+ this.log("[HaexSpace] Setup completed successfully");
582
582
  this.notifySubscribers();
583
583
  } catch (error) {
584
- this.log("[HaexHub] Setup failed:", error);
584
+ this.log("[HaexSpace] Setup failed:", error);
585
585
  throw error;
586
586
  }
587
587
  }
@@ -910,26 +910,26 @@ var HaexVaultClient = class {
910
910
  this.log("Application context:", this._context);
911
911
  this.notifySubscribers();
912
912
  const { listen } = window.__TAURI__.event;
913
- console.log("[HaexHub SDK] Setting up Tauri event listener for:", HAEXTENSION_EVENTS.CONTEXT_CHANGED);
913
+ console.log("[HaexSpace SDK] Setting up Tauri event listener for:", HAEXTENSION_EVENTS.CONTEXT_CHANGED);
914
914
  try {
915
915
  await listen(HAEXTENSION_EVENTS.CONTEXT_CHANGED, (event) => {
916
- console.log("[HaexHub SDK] Received Tauri event:", HAEXTENSION_EVENTS.CONTEXT_CHANGED, event);
916
+ console.log("[HaexSpace SDK] Received Tauri event:", HAEXTENSION_EVENTS.CONTEXT_CHANGED, event);
917
917
  this.log("Received context change event:", event);
918
918
  if (event.payload?.context) {
919
919
  this._context = event.payload.context;
920
- console.log("[HaexHub SDK] Updated context to:", this._context);
920
+ console.log("[HaexSpace SDK] Updated context to:", this._context);
921
921
  this.handleEvent({
922
922
  type: HAEXTENSION_EVENTS.CONTEXT_CHANGED,
923
923
  data: { context: this._context },
924
924
  timestamp: Date.now()
925
925
  });
926
926
  } else {
927
- console.warn("[HaexHub SDK] Event received but no context in payload:", event);
927
+ console.warn("[HaexSpace SDK] Event received but no context in payload:", event);
928
928
  }
929
929
  });
930
- console.log("[HaexHub SDK] Context change listener registered successfully");
930
+ console.log("[HaexSpace SDK] Context change listener registered successfully");
931
931
  } catch (error) {
932
- console.error("[HaexHub SDK] Failed to setup context change listener:", error);
932
+ console.error("[HaexSpace SDK] Failed to setup context change listener:", error);
933
933
  this.log("Failed to setup context change listener:", error);
934
934
  }
935
935
  this.resolveReady();
@@ -946,7 +946,7 @@ var HaexVaultClient = class {
946
946
  window.addEventListener("message", this.messageHandler);
947
947
  this.isNativeWindow = false;
948
948
  this.initialized = true;
949
- this.log("HaexHub SDK initialized in iframe mode");
949
+ this.log("HaexSpace SDK initialized in iframe mode");
950
950
  try {
951
951
  if (this.config.manifest) {
952
952
  this._extensionInfo = {
@@ -1114,7 +1114,7 @@ postMessage error: ${e}`);
1114
1114
  }
1115
1115
  log(...args) {
1116
1116
  if (this.config.debug) {
1117
- console.log("[HaexHub SDK]", ...args);
1117
+ console.log("[HaexSpace SDK]", ...args);
1118
1118
  }
1119
1119
  }
1120
1120
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/events.ts","../../src/methods.ts","../../src/messages.ts","../../src/types.ts","../../src/api/storage.ts","../../src/api/database.ts","../../src/api/filesystem.ts","../../src/api/web.ts","../../src/api/permissions.ts","../../src/polyfills/consoleForwarding.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 * Central request method name definitions for HaexHub SDK\n *\n * Request Naming Schema: haextension:{subject}:{action}\n *\n * These are used for client.request() calls between extensions and HaexHub\n */\n\nexport const HAEXTENSION_METHODS = {\n context: {\n get: 'haextension:context:get',\n },\n\n database: {\n query: 'haextension:database:query',\n execute: 'haextension:database:execute',\n transaction: 'haextension:database:transaction',\n registerMigrations: 'haextension:database:register-migrations',\n },\n\n filesystem: {\n saveFile: 'haextension:filesystem:save-file',\n openFile: 'haextension:filesystem:open-file',\n showImage: 'haextension:filesystem:show-image',\n },\n\n storage: {\n getItem: 'haextension:storage:get-item',\n setItem: 'haextension:storage:set-item',\n removeItem: 'haextension:storage:remove-item',\n clear: 'haextension:storage:clear',\n keys: 'haextension:storage:keys',\n },\n\n web: {\n fetch: 'haextension:web:fetch',\n },\n\n application: {\n open: 'haextension:application:open',\n },\n} as const;\n\n// Helper type to extract all string values from nested object\ntype DeepValues<T> = T extends object\n ? T[keyof T] extends string\n ? T[keyof T]\n : T[keyof T] extends object\n ? DeepValues<T[keyof T]>\n : never\n : never;\n\nexport type HaextensionMethod = DeepValues<typeof HAEXTENSION_METHODS>;\n","/**\n * Central message type definitions for HaexSpace SDK\n *\n * Message Naming Schema: haexspace:{subject}\n *\n * These are used for internal communication between extensions and HaexSpace\n */\n\nexport const HAEXSPACE_MESSAGE_TYPES = {\n /** Debug message for development/troubleshooting */\n DEBUG: 'haexspace:debug',\n\n /** Console forwarding from extension iframe */\n CONSOLE_FORWARD: 'console.forward',\n} as const;\n\nexport type HaexspaceMessageType =\n (typeof HAEXSPACE_MESSAGE_TYPES)[keyof typeof HAEXSPACE_MESSAGE_TYPES];\n","import { HAEXTENSION_EVENTS } from './events';\n\n// Constants\nexport const DEFAULT_TIMEOUT = 30000; // 30 seconds in milliseconds\nexport const TABLE_SEPARATOR = \"__\"; // Separator for table name components: {publicKey}__{extensionName}__{tableName}\n\n/**\n * Build a fully qualified table name for extensions.\n * Use this in Drizzle schemas to create table names at build time.\n *\n * @param publicKey - The extension's public key (from manifest.json)\n * @param extensionName - The extension name (from manifest.json or package.json)\n * @param tableName - The table name (e.g., \"users\", \"items\")\n * @returns Fully qualified table name: `{publicKey}__{extensionName}__{tableName}`\n *\n * @example\n * ```typescript\n * import { getTableName } from \"@haex-space/vault-sdk\";\n * import manifest from \"../haextension/manifest.json\";\n * import pkg from \"../package.json\";\n *\n * const tableName = (name: string) =>\n * getTableName(manifest.publicKey, manifest.name || pkg.name, name);\n *\n * export const users = sqliteTable(tableName(\"users\"), { ... });\n * ```\n */\nexport function getTableName(\n publicKey: string,\n extensionName: string,\n tableName: string\n): string {\n return `${publicKey}${TABLE_SEPARATOR}${extensionName}${TABLE_SEPARATOR}${tableName}`;\n}\n\n// Core Protocol Types\nexport interface HaexHubRequest {\n method: string;\n params: Record<string, unknown>;\n timestamp: number;\n}\n\nexport interface HaexHubResponse<T = unknown> {\n id: string;\n result?: T;\n error?: HaexHubError;\n}\n\nexport interface HaexHubError {\n code: ErrorCode;\n message: string;\n details?: Record<string, unknown>;\n}\n\n// Extension Info (loaded from manifest.json at build time)\nexport interface ExtensionInfo {\n publicKey: string;\n name: string;\n version: string;\n displayName?: string;\n namespace?: string;\n}\n\n// Application Context (provided by HaexHub)\nexport interface ApplicationContext {\n theme: \"light\" | \"dark\" | \"system\";\n locale: string;\n platform:\n | \"linux\"\n | \"macos\"\n | \"ios\"\n | \"freebsd\"\n | \"dragonfly\"\n | \"netbsd\"\n | \"openbsd\"\n | \"solaris\"\n | \"android\"\n | \"windows\"\n | undefined;\n}\n\n// Search Types\nexport interface SearchQuery {\n query: string;\n filters?: Record<string, unknown>;\n limit?: number;\n}\n\nexport interface SearchResult {\n id: string;\n title: string;\n description?: string;\n type: string;\n data?: Record<string, unknown>;\n score?: number;\n}\n\n// Permission Types\nexport enum PermissionStatus {\n GRANTED = \"granted\",\n DENIED = \"denied\",\n ASK = \"ask\",\n}\n\nexport interface PermissionResponse {\n status: PermissionStatus;\n permanent: boolean;\n}\n\n// Database Permission (matches Rust DbExtensionPermission)\nexport interface DatabasePermission {\n extensionId: string;\n resource: string;\n operation: \"read\" | \"write\";\n path: string;\n}\n\nexport interface DatabasePermissionRequest {\n resource: string;\n operation: \"read\" | \"write\";\n reason?: string;\n}\n\n// Database Types\nexport interface DatabaseQueryParams {\n query: string;\n params?: unknown[];\n}\n\nexport interface DatabaseQueryResult {\n rows: unknown[]; // Array of arrays (each row is an array of values)\n columns?: string[]; // Column names in order\n rowsAffected: number;\n lastInsertId?: number;\n}\n\nexport interface DatabaseExecuteParams {\n statements: string[];\n}\n\n// Migration Types\nexport interface MigrationResult {\n appliedCount: number;\n alreadyAppliedCount: number;\n appliedMigrations: string[];\n}\n\nexport interface Migration {\n name: string;\n sql: string;\n}\n\nexport interface DatabaseTableInfo {\n name: string;\n columns: DatabaseColumnInfo[];\n}\n\nexport interface DatabaseColumnInfo {\n name: string;\n type: string;\n notNull: boolean;\n defaultValue?: unknown;\n primaryKey: boolean;\n}\n\n// Event Types\nexport interface HaexHubEvent {\n type: string;\n data: unknown;\n timestamp: number;\n}\n\n// Specific Event Types\nexport interface ContextChangedEvent extends HaexHubEvent {\n type: typeof HAEXTENSION_EVENTS.CONTEXT_CHANGED;\n data: {\n context: ApplicationContext;\n };\n}\n\nexport interface SearchRequestEvent extends HaexHubEvent {\n type: typeof HAEXTENSION_EVENTS.SEARCH_REQUEST;\n data: {\n query: SearchQuery;\n requestId: string;\n };\n}\n\nexport type EventCallback = (event: HaexHubEvent) => void;\n\n// Manifest Types\nexport interface ExtensionManifest {\n name: string;\n version: string;\n author?: string | null;\n entry?: string | null;\n icon?: string | null;\n publicKey: string;\n signature: string;\n permissions: {\n database?: any[];\n filesystem?: any[];\n http?: any[];\n shell?: any[];\n };\n homepage?: string | null;\n description?: string | null;\n singleInstance?: boolean | null;\n displayMode?: \"auto\" | \"window\" | \"iframe\" | null;\n /**\n * Path to the migrations directory relative to the extension root.\n * Contains Drizzle-style migrations with meta/_journal.json and *.sql files.\n * These migrations will be applied when the extension is installed.\n * Example: \"database/migrations\"\n */\n migrationsDir?: string | null;\n}\n\n// Config Types\nexport interface HaexHubConfig {\n debug?: boolean;\n timeout?: number;\n /** Extension manifest data (auto-injected by framework integrations) */\n manifest?: ExtensionManifest;\n}\n\n// Web/Fetch Types\nexport interface WebRequestOptions {\n method?: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\" | \"HEAD\" | \"OPTIONS\";\n headers?: Record<string, string>;\n body?: string | ArrayBuffer | Blob;\n timeout?: number;\n}\n\nexport interface WebResponse {\n status: number;\n statusText: string;\n headers: Record<string, string>;\n body: ArrayBuffer;\n url: string;\n}\n\n// Error Codes\nexport enum ErrorCode {\n // Connection Errors\n TIMEOUT = \"TIMEOUT\",\n NOT_IN_IFRAME = \"NOT_IN_IFRAME\",\n UNAUTHORIZED_ORIGIN = \"UNAUTHORIZED_ORIGIN\",\n\n // Permission Errors\n PERMISSION_DENIED = \"PERMISSION_DENIED\",\n\n // Validation Errors\n INVALID_PUBLIC_KEY = \"INVALID_PUBLIC_KEY\",\n INVALID_EXTENSION_NAME = \"INVALID_EXTENSION_NAME\",\n INVALID_TABLE_NAME = \"INVALID_TABLE_NAME\",\n INVALID_PARAMS = \"INVALID_PARAMS\",\n\n // Extension Errors\n EXTENSION_NOT_INITIALIZED = \"EXTENSION_NOT_INITIALIZED\",\n EXTENSION_INFO_UNAVAILABLE = \"EXTENSION_INFO_UNAVAILABLE\",\n\n // API Errors\n METHOD_NOT_FOUND = \"METHOD_NOT_FOUND\",\n INTERNAL_ERROR = \"INTERNAL_ERROR\",\n DATABASE_ERROR = \"DATABASE_ERROR\",\n WEB_ERROR = \"WEB_ERROR\",\n}\n\nexport class HaexHubError extends Error {\n constructor(\n public code: ErrorCode,\n public messageKey: string,\n public details?: Record<string, unknown>\n ) {\n super(messageKey);\n this.name = \"HaexHubError\";\n }\n\n /**\n * Get localized error message\n * @param locale - Locale code (e.g., 'en', 'de')\n * @param translations - Translation object\n */\n getLocalizedMessage(\n locale: string = \"en\",\n translations?: Record<string, Record<string, string>>\n ): string {\n if (!translations || !translations[locale]) {\n return this.messageKey;\n }\n\n let message = translations[locale][this.messageKey] || this.messageKey;\n\n // Replace placeholders with details\n if (this.details) {\n Object.entries(this.details).forEach(([key, value]) => {\n message = message.replace(`{${key}}`, String(value));\n });\n }\n\n return message;\n }\n\n toJSON() {\n return {\n code: this.code,\n message: this.messageKey,\n details: this.details,\n };\n }\n}\n","import type { HaexVaultClient } from \"~/client\";\nimport { HAEXTENSION_METHODS } from \"~/methods\";\n\nexport class StorageAPI {\n constructor(private client: HaexVaultClient) {}\n\n async getItem(key: string): Promise<string | null> {\n return this.client.request<string | null>(HAEXTENSION_METHODS.storage.getItem, { key });\n }\n\n async setItem(key: string, value: string): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.storage.setItem, { key, value });\n }\n\n async removeItem(key: string): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.storage.removeItem, { key });\n }\n\n async clear(): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.storage.clear);\n }\n\n async keys(): Promise<string[]> {\n return this.client.request<string[]>(HAEXTENSION_METHODS.storage.keys);\n }\n}\n","import type { HaexVaultClient } from \"../client\";\nimport type { DatabaseQueryResult, MigrationResult, Migration } from \"../types\";\nimport { HAEXTENSION_METHODS } from \"../methods\";\n\nexport class DatabaseAPI {\n constructor(private client: HaexVaultClient) {}\n\n async query<T>(query: string, params?: unknown[]): Promise<T[]> {\n const result = await this.client.request<DatabaseQueryResult>(\n HAEXTENSION_METHODS.database.query,\n {\n query,\n params: params || [],\n }\n );\n\n return result.rows as T[];\n }\n\n async queryOne<T = unknown>(\n query: string,\n params?: unknown[]\n ): Promise<T | null> {\n const rows = await this.query<T>(query, params);\n return rows.length > 0 ? rows[0] ?? null : null;\n }\n\n async execute(\n query: string,\n params?: unknown[]\n ): Promise<DatabaseQueryResult> {\n return this.client.request<DatabaseQueryResult>(HAEXTENSION_METHODS.database.execute, {\n query,\n params: params || [],\n });\n }\n\n async transaction(statements: string[]): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.database.transaction, {\n statements,\n });\n }\n\n async createTable(tableName: string, columns: string): Promise<void> {\n const query = `CREATE TABLE IF NOT EXISTS ${tableName} (${columns})`;\n await this.execute(query);\n }\n\n async dropTable(tableName: string): Promise<void> {\n const query = `DROP TABLE IF EXISTS ${tableName}`;\n await this.execute(query);\n }\n\n /**\n * Registers and applies extension migrations with HaexVault\n *\n * HaexVault will:\n * 1. Validate all SQL statements (ensure only extension's own tables are accessed)\n * 2. Store migrations with applied_at = NULL\n * 3. Query pending migrations sorted by name\n * 4. Apply pending migrations and set up CRDT triggers\n * 5. Mark successful migrations with applied_at timestamp\n *\n * @param extensionVersion - The version of the extension\n * @param migrations - Array of migration objects with name and SQL content\n * @returns Promise with migration result (applied count, already applied count, applied migration names)\n */\n async registerMigrationsAsync(\n extensionVersion: string,\n migrations: Migration[]\n ): Promise<MigrationResult> {\n return this.client.request<MigrationResult>(\n HAEXTENSION_METHODS.database.registerMigrations,\n {\n extensionVersion,\n migrations,\n }\n );\n }\n\n async insert(\n tableName: string,\n data: Record<string, unknown>\n ): Promise<number> {\n const keys = Object.keys(data);\n const values = Object.values(data);\n const placeholders = keys.map(() => \"?\").join(\", \");\n\n const query = `INSERT INTO ${tableName} (${keys.join(\n \", \"\n )}) VALUES (${placeholders})`;\n const result = await this.execute(query, values);\n\n return result.lastInsertId ?? -1;\n }\n\n async update(\n tableName: string,\n data: Record<string, unknown>,\n where: string,\n whereParams?: unknown[]\n ): Promise<number> {\n const keys = Object.keys(data);\n const values = Object.values(data);\n const setClause = keys.map((key) => `${key} = ?`).join(\", \");\n\n const query = `UPDATE ${tableName} SET ${setClause} WHERE ${where}`;\n const result = await this.execute(query, [\n ...values,\n ...(whereParams || []),\n ]);\n\n return result.rowsAffected;\n }\n\n async delete(\n tableName: string,\n where: string,\n whereParams?: unknown[]\n ): Promise<number> {\n const query = `DELETE FROM ${tableName} WHERE ${where}`;\n const result = await this.execute(query, whereParams);\n return result.rowsAffected;\n }\n\n async count(\n tableName: string,\n where?: string,\n whereParams?: unknown[]\n ): Promise<number> {\n const query = where\n ? `SELECT COUNT(*) as count FROM ${tableName} WHERE ${where}`\n : `SELECT COUNT(*) as count FROM ${tableName}`;\n\n const result = await this.queryOne<{ count: number }>(query, whereParams);\n return result?.count ?? 0;\n }\n\n}\n","import type { HaexVaultClient } from \"../client\";\nimport { HAEXTENSION_METHODS } from \"../methods\";\n\nexport interface SaveFileOptions {\n /**\n * The default filename to suggest\n */\n defaultPath?: string;\n\n /**\n * The title of the save dialog\n */\n title?: string;\n\n /**\n * File filters for the dialog\n */\n filters?: Array<{\n name: string;\n extensions: string[];\n }>;\n}\n\nexport interface SaveFileResult {\n /**\n * The path where the file was saved\n */\n path: string;\n\n /**\n * Whether the operation was successful\n */\n success: boolean;\n}\n\nexport interface OpenFileOptions {\n /**\n * The filename for the temporary file\n */\n fileName: string;\n\n /**\n * Optional MIME type for the file\n */\n mimeType?: string;\n}\n\nexport interface OpenFileResult {\n /**\n * Whether the operation was successful\n */\n success: boolean;\n}\n\nexport interface ShowImageOptions {\n /**\n * The data URL of the image (base64 encoded)\n */\n dataUrl: string;\n}\n\nexport interface ShowImageResult {\n /**\n * Whether the operation was successful\n */\n success: boolean;\n}\n\nexport class FilesystemAPI {\n constructor(private client: HaexVaultClient) {}\n\n /**\n * Opens a save file dialog and saves the provided data to the selected location\n * @param data The file data as Uint8Array\n * @param options Options for the save dialog\n * @returns The path where the file was saved, or null if cancelled\n */\n async saveFileAsync(\n data: Uint8Array,\n options: SaveFileOptions = {}\n ): Promise<SaveFileResult | null> {\n const result = await this.client.request<SaveFileResult | null>(\n HAEXTENSION_METHODS.filesystem.saveFile,\n {\n data: Array.from(data), // Convert Uint8Array to regular array for postMessage\n defaultPath: options.defaultPath,\n title: options.title,\n filters: options.filters,\n }\n );\n\n return result;\n }\n\n /**\n * Opens a file with the system's default viewer\n * @param data The file data as Uint8Array\n * @param options Options for opening the file\n * @returns The result of the operation\n */\n async openFileAsync(\n data: Uint8Array,\n options: OpenFileOptions\n ): Promise<OpenFileResult> {\n const result = await this.client.request<OpenFileResult>(\n HAEXTENSION_METHODS.filesystem.openFile,\n {\n data: Array.from(data), // Convert Uint8Array to regular array for postMessage\n fileName: options.fileName,\n mimeType: options.mimeType,\n }\n );\n\n return result;\n }\n\n /**\n * Shows an image using a data URL (safe, read-only viewing)\n * This is safe to use without special permissions as it only displays images\n * and doesn't execute any code or open files with external applications\n * @param options Options containing the data URL\n * @returns The result of the operation\n */\n async showImageAsync(\n options: ShowImageOptions\n ): Promise<ShowImageResult> {\n const result = await this.client.request<ShowImageResult>(\n HAEXTENSION_METHODS.filesystem.showImage,\n {\n dataUrl: options.dataUrl,\n }\n );\n\n return result;\n }\n}\n","import type { HaexVaultClient } from \"../client\";\nimport type { WebRequestOptions, WebResponse } from \"../types\";\nimport { HAEXTENSION_METHODS } from \"../methods\";\n\nexport class WebAPI {\n constructor(private client: HaexVaultClient) {}\n\n /**\n * Performs a web request through the HaexHub host application\n * @param url The URL to fetch\n * @param options Request options (method, headers, body, timeout)\n * @returns Promise resolving to the web response\n */\n async fetchAsync(url: string, options: WebRequestOptions = {}): Promise<WebResponse> {\n // Convert body to base64 if it's an ArrayBuffer or Blob\n let bodyParam: string | undefined;\n\n if (options.body) {\n if (options.body instanceof ArrayBuffer) {\n bodyParam = this.arrayBufferToBase64(options.body);\n } else if (options.body instanceof Blob) {\n bodyParam = await this.blobToBase64(options.body);\n } else {\n bodyParam = options.body;\n }\n }\n\n const response = await this.client.request<{\n status: number;\n statusText: string;\n headers: Record<string, string>;\n body: string; // Base64 encoded\n url: string;\n }>(HAEXTENSION_METHODS.web.fetch, {\n url,\n method: options.method || \"GET\",\n headers: options.headers,\n body: bodyParam,\n timeout: options.timeout,\n });\n\n // Convert base64 body back to ArrayBuffer\n const bodyBuffer = this.base64ToArrayBuffer(response.body);\n\n return {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n body: bodyBuffer,\n url: response.url,\n };\n }\n\n /**\n * Convenience method for JSON requests\n */\n async fetchJsonAsync<T = unknown>(\n url: string,\n options: WebRequestOptions = {}\n ): Promise<T> {\n const response = await this.fetchAsync(url, options);\n const text = new TextDecoder().decode(response.body);\n return JSON.parse(text) as T;\n }\n\n /**\n * Convenience method for text requests\n */\n async fetchTextAsync(url: string, options: WebRequestOptions = {}): Promise<string> {\n const response = await this.fetchAsync(url, options);\n return new TextDecoder().decode(response.body);\n }\n\n /**\n * Convenience method for blob requests\n */\n async fetchBlobAsync(url: string, options: WebRequestOptions = {}): Promise<Blob> {\n const response = await this.fetchAsync(url, options);\n return new Blob([response.body]);\n }\n\n /**\n * Opens a URL in the user's default browser\n * @param url The URL to open\n */\n async openAsync(url: string): Promise<void> {\n await this.client.request<void>(HAEXTENSION_METHODS.application.open, {\n application: \"browser\",\n url,\n });\n }\n\n private arrayBufferToBase64(buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer);\n let binary = '';\n for (let i = 0; i < bytes.byteLength; i++) {\n const byte = bytes[i];\n if (byte === undefined) {\n throw new Error('Invalid byte at index ' + i);\n }\n binary += String.fromCharCode(byte);\n }\n return btoa(binary);\n }\n\n private async blobToBase64(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => {\n const result = reader.result;\n if (typeof result !== 'string') {\n reject(new Error('Failed to read blob as data URL'));\n return;\n }\n const parts = result.split(',');\n const base64 = parts[1];\n if (!base64) {\n reject(new Error('Failed to extract base64 from data URL'));\n return;\n }\n resolve(base64);\n };\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n });\n }\n\n private base64ToArrayBuffer(base64: string): ArrayBuffer {\n const binaryString = atob(base64);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes.buffer;\n }\n}\n","import type { HaexVaultClient } from \"../client\";\nimport type { PermissionResponse } from \"../types\";\n\nexport class PermissionsAPI {\n constructor(private client: HaexVaultClient) {}\n\n /**\n * Checks if the extension has permission for a database operation\n * @param resource The database resource (table name or \"*\" for all tables)\n * @param operation The operation type (\"read\" or \"write\")\n * @returns Promise<boolean> indicating if permission is granted\n */\n async checkDatabaseAsync(\n resource: string,\n operation: \"read\" | \"write\"\n ): Promise<boolean> {\n const response = await this.client.request<PermissionResponse>(\n \"permissions.database.check\",\n {\n resource,\n operation,\n }\n );\n return response.status === \"granted\";\n }\n\n /**\n * Checks if the extension has permission for a web request\n * @param url The URL to check (e.g., \"https://example.com/path\")\n * @returns Promise<boolean> indicating if permission is granted\n * @note Method/operation is not checked - permissions apply to all HTTP methods\n */\n async checkWebAsync(url: string): Promise<boolean> {\n const response = await this.client.request<PermissionResponse>(\n \"permissions.web.check\",\n {\n url,\n }\n );\n return response.status === \"granted\";\n }\n\n /**\n * Checks if the extension has permission for a filesystem operation\n * @param path The file or directory path\n * @param operation The operation type (\"read\" or \"write\")\n * @returns Promise<boolean> indicating if permission is granted\n */\n async checkFilesystemAsync(\n path: string,\n operation: \"read\" | \"write\"\n ): Promise<boolean> {\n const response = await this.client.request<PermissionResponse>(\n \"permissions.filesystem.check\",\n {\n path,\n operation,\n }\n );\n return response.status === \"granted\";\n }\n}\n","/**\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('[HaexHub] 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('[HaexHub] 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('[HaexHub] Console forwarding installed')\n}\n","import { HAEXTENSION_EVENTS } from './events';\nimport { HAEXTENSION_METHODS } from './methods';\nimport { HAEXSPACE_MESSAGE_TYPES } from './messages';\nimport type {\n HaexHubRequest,\n HaexHubResponse,\n HaexHubConfig,\n HaexHubEvent,\n EventCallback,\n PermissionResponse,\n DatabasePermissionRequest,\n ExtensionInfo,\n ApplicationContext,\n SearchResult,\n ContextChangedEvent,\n DatabaseQueryResult,\n MigrationResult,\n Migration,\n} from \"./types\";\nimport {\n ErrorCode,\n DEFAULT_TIMEOUT,\n TABLE_SEPARATOR,\n HaexHubError,\n getTableName,\n} from \"./types\";\nimport { StorageAPI } from \"./api/storage\";\nimport { DatabaseAPI } from \"./api/database\";\nimport { FilesystemAPI } from \"./api/filesystem\";\nimport { WebAPI } from \"./api/web\";\nimport { PermissionsAPI } from \"./api/permissions\";\nimport { installConsoleForwarding } from \"./polyfills/consoleForwarding\";\nimport { drizzle, type SqliteRemoteDatabase } from \"drizzle-orm/sqlite-proxy\";\n\nexport class HaexVaultClient {\n private config: Required<Omit<HaexHubConfig, \"manifest\">> & {\n manifest?: HaexHubConfig[\"manifest\"];\n };\n private pendingRequests: Map<\n string,\n {\n resolve: (value: any) => void;\n reject: (error: any) => void;\n timeout: NodeJS.Timeout;\n }\n > = new Map();\n private eventListeners: Map<string, Set<EventCallback>> = new Map();\n private messageHandler: ((event: MessageEvent) => void) | null = null;\n private initialized = false;\n private requestCounter = 0;\n private _extensionInfo: ExtensionInfo | null = null;\n private _context: ApplicationContext | null = null;\n private reactiveSubscribers: Set<() => void> = new Set();\n private isNativeWindow = false;\n\n private readyPromise: Promise<void>;\n private resolveReady!: () => void; // Wird im Konstruktor initialisiert\n\n private setupPromise: Promise<void> | null = null;\n private setupHook: (() => Promise<void>) | null = null;\n private _setupCompleted = false;\n\n public orm: SqliteRemoteDatabase<Record<string, unknown>> | null = null;\n public readonly storage: StorageAPI;\n public readonly database: DatabaseAPI;\n public readonly filesystem: FilesystemAPI;\n public readonly web: WebAPI;\n public readonly permissions: PermissionsAPI;\n\n constructor(config: HaexHubConfig = {}) {\n this.config = {\n debug: config.debug ?? false,\n timeout: config.timeout ?? DEFAULT_TIMEOUT,\n manifest: config.manifest,\n };\n\n this.storage = new StorageAPI(this);\n this.database = new DatabaseAPI(this);\n this.filesystem = new FilesystemAPI(this);\n this.web = new WebAPI(this);\n this.permissions = new PermissionsAPI(this);\n\n // Install console forwarding if in debug mode\n installConsoleForwarding(this.config.debug);\n\n this.readyPromise = new Promise((resolve) => {\n this.resolveReady = resolve;\n });\n\n this.init();\n }\n\n /**\n * Gibt ein Promise zurück, das aufgelöst wird, sobald der Client\n * initialisiert ist und Extension-Infos empfangen hat.\n */\n public async ready(): Promise<void> {\n return this.readyPromise;\n }\n\n /**\n * Gibt zurück, ob das Setup bereits abgeschlossen wurde.\n */\n public get setupCompleted(): boolean {\n return this._setupCompleted;\n }\n\n /**\n * Registriert eine Setup-Funktion, die nach der Initialisierung ausgeführt wird.\n * Diese Funktion sollte für Aufgaben wie Tabellenerstellung, Migrationen, etc. verwendet werden.\n * @param setupFn Die Setup-Funktion, die ausgeführt werden soll\n */\n public onSetup(setupFn: () => Promise<void>): void {\n if (this.setupHook) {\n throw new Error('Setup hook already registered');\n }\n this.setupHook = setupFn;\n }\n\n /**\n * Gibt ein Promise zurück, das aufgelöst wird, sobald der Client vollständig eingerichtet ist.\n * Dies umfasst die Initialisierung UND das Setup (z.B. Tabellenerstellung).\n * Falls kein Setup-Hook registriert wurde, entspricht dies ready().\n */\n public async setupComplete(): Promise<void> {\n await this.readyPromise;\n\n if (!this.setupHook || this.setupCompleted) {\n return;\n }\n\n if (!this.setupPromise) {\n this.setupPromise = this.runSetupAsync();\n }\n\n return this.setupPromise;\n }\n\n private async runSetupAsync(): Promise<void> {\n if (!this.setupHook) return;\n\n try {\n this.log('[HaexHub] Running setup hook...');\n await this.setupHook();\n this._setupCompleted = true;\n this.log('[HaexHub] Setup completed successfully');\n\n // Notify subscribers that setup is complete\n this.notifySubscribers();\n } catch (error) {\n this.log('[HaexHub] Setup failed:', error);\n throw error;\n }\n }\n\n /**\n * Initialisiert die Drizzle-Datenbankinstanz.\n * Muss nach der Definition des Schemas aufgerufen werden.\n * @param schema Das Drizzle-Schemaobjekt (mit bereits geprefixten Tabellennamen).\n * @returns Die typsichere Drizzle-Datenbankinstanz.\n */\n public initializeDatabase<T extends Record<string, unknown>>(\n schema: T\n ): SqliteRemoteDatabase<T> {\n if (!this._extensionInfo) {\n throw new HaexHubError(\n ErrorCode.EXTENSION_INFO_UNAVAILABLE,\n \"errors.client_not_ready\"\n );\n }\n\n const dbInstance = drizzle<T>(\n async (\n sql: string,\n params: unknown[],\n method: \"get\" | \"run\" | \"all\" | \"values\"\n ) => {\n try {\n // Drizzle uses different methods:\n // - \"run\": INSERT/UPDATE/DELETE without RETURNING\n // - \"all\": INSERT/UPDATE/DELETE with RETURNING, or SELECT\n // - \"get\": SELECT with LIMIT 1\n // - \"values\": SELECT returning raw values\n //\n // The backend intelligently handles routing:\n // - method=\"run\" and \"all\" go to haextension.db.execute\n // - Backend detects SELECT statements and delegates to haextension.db.query\n // - Backend returns rows when RETURNING clause is present\n\n if (method === \"run\" || method === \"all\") {\n const result = await this.request<DatabaseQueryResult>(\n HAEXTENSION_METHODS.database.execute,\n {\n query: sql,\n params: params as unknown[],\n }\n );\n\n // For method=\"all\", return rows (RETURNING clause or SELECT delegated by backend)\n if (method === \"all\") {\n return { rows: result.rows || [] };\n }\n\n // For method=\"run\", check if we have rows (RETURNING clause)\n if (result.rows && Array.isArray(result.rows) && result.rows.length > 0) {\n return { rows: result.rows };\n }\n\n return result;\n }\n\n // Read operations (SELECT without RETURNING)\n const result = await this.request<DatabaseQueryResult>(HAEXTENSION_METHODS.database.query, {\n query: sql,\n params: params as unknown[],\n });\n\n const rows = result.rows as any[];\n\n if (method === \"get\") {\n return { rows: rows.length > 0 ? rows.at(0) : undefined };\n }\n\n return { rows };\n } catch (error) {\n this.log(\"Database operation failed:\", error);\n throw error;\n }\n },\n {\n schema: schema,\n logger: false,\n }\n );\n\n this.orm = dbInstance;\n return dbInstance;\n }\n\n public get extensionInfo(): ExtensionInfo | null {\n return this._extensionInfo;\n }\n\n public get context(): ApplicationContext | null {\n return this._context;\n }\n\n public subscribe(callback: () => void): () => void {\n this.reactiveSubscribers.add(callback);\n return () => {\n this.reactiveSubscribers.delete(callback);\n };\n }\n\n private notifySubscribers(): void {\n this.reactiveSubscribers.forEach((callback) => callback());\n }\n\n public async getDependencies(): Promise<ExtensionInfo[]> {\n return this.request<ExtensionInfo[]>(\"extensions.getDependencies\");\n }\n\n public getTableName(tableName: string): string {\n if (!this._extensionInfo) {\n throw new HaexHubError(\n ErrorCode.EXTENSION_INFO_UNAVAILABLE,\n \"errors.extension_info_unavailable\"\n );\n }\n\n this.validateTableName(tableName);\n\n const { publicKey, name } = this._extensionInfo;\n\n // Return table name wrapped in double quotes to handle special characters (like hyphens in extension names)\n return `\"${getTableName(publicKey, name, tableName)}\"`;\n }\n\n public getDependencyTableName(\n publicKey: string,\n extensionName: string,\n tableName: string\n ): string {\n this.validatePublicKey(publicKey);\n this.validateExtensionName(extensionName);\n this.validateTableName(tableName);\n\n // Return table name wrapped in double quotes to handle special characters\n return `\"${getTableName(publicKey, extensionName, tableName)}\"`;\n }\n\n public parseTableName(fullTableName: string): {\n publicKey: string;\n extensionName: string;\n tableName: string;\n } | null {\n // Remove surrounding quotes if present\n let cleanTableName = fullTableName;\n if (cleanTableName.startsWith('\"') && cleanTableName.endsWith('\"')) {\n cleanTableName = cleanTableName.slice(1, -1);\n }\n\n const parts = cleanTableName.split(TABLE_SEPARATOR);\n\n if (parts.length !== 3) {\n return null;\n }\n\n const [publicKey, extensionName, tableName] = parts;\n\n if (!publicKey || !extensionName || !tableName) {\n return null;\n }\n\n return {\n publicKey,\n extensionName,\n tableName,\n };\n }\n\n /**\n * Execute a raw SQL query (SELECT)\n * Returns rows as an array of objects\n */\n public async query<T = Record<string, unknown>>(\n sql: string,\n params: unknown[] = []\n ): Promise<T[]> {\n const result = await this.request<DatabaseQueryResult>(\n HAEXTENSION_METHODS.database.query,\n { query: sql, params }\n );\n if (this.config.debug) {\n console.log('[SDK query()] Raw result:', JSON.stringify(result, null, 2));\n }\n return result.rows as T[];\n }\n\n /**\n * Alias for query() - more intuitive for SELECT statements\n */\n public async select<T = Record<string, unknown>>(\n sql: string,\n params: unknown[] = []\n ): Promise<T[]> {\n return this.query<T>(sql, params);\n }\n\n /**\n * Execute a raw SQL statement (INSERT, UPDATE, DELETE, CREATE, etc.)\n * Returns rowsAffected and lastInsertId\n */\n public async execute(\n sql: string,\n params: unknown[] = []\n ): Promise<{ rowsAffected: number; lastInsertId?: number }> {\n const result = await this.request<DatabaseQueryResult>(\n HAEXTENSION_METHODS.database.execute,\n { query: sql, params }\n );\n return {\n rowsAffected: result.rowsAffected,\n lastInsertId: result.lastInsertId,\n };\n }\n\n /**\n * Registers and applies extension migrations with HaexVault\n *\n * HaexVault will:\n * 1. Validate all SQL statements (ensure only extension's own tables are accessed)\n * 2. Store migrations with applied_at = NULL\n * 3. Query pending migrations sorted by name\n * 4. Apply pending migrations and set up CRDT triggers\n * 5. Mark successful migrations with applied_at timestamp\n *\n * @param extensionVersion - The version of the extension\n * @param migrations - Array of migration objects with name and SQL content\n * @returns Promise with migration result (applied count, already applied count, applied migration names)\n */\n public async registerMigrationsAsync(\n extensionVersion: string,\n migrations: Migration[]\n ): Promise<MigrationResult> {\n return this.database.registerMigrationsAsync(extensionVersion, migrations);\n }\n\n public async requestDatabasePermission(\n request: DatabasePermissionRequest\n ): Promise<PermissionResponse> {\n return this.request<PermissionResponse>(\"permissions.database.request\", {\n resource: request.resource,\n operation: request.operation,\n reason: request.reason,\n });\n }\n\n public async checkDatabasePermission(\n resource: string,\n operation: \"read\" | \"write\"\n ): Promise<boolean> {\n const response = await this.request<PermissionResponse>(\n \"permissions.database.check\",\n {\n resource,\n operation,\n }\n );\n return response.status === \"granted\";\n }\n\n public async respondToSearch(\n requestId: string,\n results: SearchResult[]\n ): Promise<void> {\n await this.request(\"search.respond\", {\n requestId,\n results,\n });\n }\n\n public async request<T = unknown>(\n method: string,\n params: Record<string, unknown> = {}\n ): Promise<T> {\n // Native window mode: Use Tauri invoke() for direct backend communication\n if (this.isNativeWindow && typeof (window as any).__TAURI__ !== 'undefined') {\n return this.invoke<T>(method, params);\n }\n\n // iframe mode: Use postMessage for communication through parent window\n return this.postMessage<T>(method, params);\n }\n\n private async postMessage<T>(\n method: string,\n params: Record<string, unknown>\n ): Promise<T> {\n const requestId = this.generateRequestId();\n\n const request: HaexHubRequest = {\n method,\n params,\n timestamp: Date.now(),\n };\n\n return new Promise<T>((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pendingRequests.delete(requestId);\n reject(\n new HaexHubError(ErrorCode.TIMEOUT, \"errors.timeout\", {\n timeout: this.config.timeout,\n })\n );\n }, this.config.timeout);\n\n this.pendingRequests.set(requestId, { resolve, reject, timeout });\n\n // Use wildcard origin since extensions are sandboxed in their own protocol\n const targetOrigin = \"*\";\n\n if (this.config.debug) {\n console.log(\"[SDK Debug] ========== Sending Request ==========\");\n console.log(\"[SDK Debug] Request ID:\", requestId);\n console.log(\"[SDK Debug] Method:\", request.method);\n console.log(\"[SDK Debug] Params:\", request.params);\n console.log(\"[SDK Debug] Target origin:\", targetOrigin);\n console.log(\"[SDK Debug] Extension info:\", this._extensionInfo);\n console.log(\"[SDK Debug] ========================================\");\n }\n\n window.parent.postMessage({ id: requestId, ...request }, targetOrigin);\n });\n }\n\n private async invoke<T>(\n method: string,\n params: Record<string, unknown>\n ): Promise<T> {\n const { invoke } = (window as any).__TAURI__.core as {\n invoke: <R>(cmd: string, args?: Record<string, unknown>) => Promise<R>;\n };\n\n if (this.config.debug) {\n console.log(\"[SDK Debug] ========== Invoke Request ==========\");\n console.log(\"[SDK Debug] Method:\", method);\n console.log(\"[SDK Debug] Params:\", params);\n console.log(\"[SDK Debug] =======================================\");\n }\n\n // Map SDK methods to Tauri commands\n switch (method) {\n case HAEXTENSION_METHODS.database.query:\n return invoke<T>(\"webview_extension_db_query\", {\n query: params.query as string,\n params: (params.params as unknown[]) || [],\n });\n\n case HAEXTENSION_METHODS.database.execute:\n return invoke<T>(\"webview_extension_db_execute\", {\n query: params.query as string,\n params: (params.params as unknown[]) || [],\n });\n\n case \"permissions.web.check\":\n return invoke<T>(\"webview_extension_check_web_permission\", {\n url: params.url as string,\n });\n\n case \"permissions.database.check\":\n return invoke<T>(\"webview_extension_check_database_permission\", {\n resource: params.resource as string,\n operation: params.operation as string,\n });\n\n case \"permissions.filesystem.check\":\n return invoke<T>(\"webview_extension_check_filesystem_permission\", {\n path: params.path as string,\n actionStr: params.action as string,\n });\n\n case HAEXTENSION_METHODS.application.open:\n return invoke<T>(\"webview_extension_web_open\", {\n url: params.url as string,\n });\n\n case HAEXTENSION_METHODS.web.fetch:\n return invoke<T>(\"webview_extension_web_request\", {\n url: params.url as string,\n method: params.method as string | undefined,\n headers: params.headers as Record<string, string> | undefined,\n body: params.body as string | undefined,\n });\n\n case HAEXTENSION_METHODS.filesystem.saveFile:\n return invoke<T>(\"webview_extension_fs_save_file\", {\n data: params.data as number[],\n defaultPath: params.defaultPath as string | undefined,\n title: params.title as string | undefined,\n filters: params.filters as Array<{ name: string; extensions: string[] }> | undefined,\n });\n\n case HAEXTENSION_METHODS.filesystem.openFile:\n return invoke<T>(\"webview_extension_fs_open_file\", {\n data: params.data as number[],\n fileName: params.fileName as string,\n });\n\n case HAEXTENSION_METHODS.database.registerMigrations:\n return invoke<T>(\"webview_extension_db_register_migrations\", {\n extensionVersion: params.extensionVersion as string,\n migrations: params.migrations as Array<{ name: string; sql: string }>,\n });\n\n default:\n throw new HaexHubError(\n ErrorCode.METHOD_NOT_FOUND,\n \"errors.method_not_found\",\n { method }\n );\n }\n }\n\n public on(eventType: string, callback: EventCallback): void {\n if (!this.eventListeners.has(eventType)) {\n this.eventListeners.set(eventType, new Set());\n }\n this.eventListeners.get(eventType)!.add(callback);\n }\n\n public off(eventType: string, callback: EventCallback): void {\n const listeners = this.eventListeners.get(eventType);\n if (listeners) {\n listeners.delete(callback);\n }\n }\n\n public destroy(): void {\n if (this.messageHandler) {\n window.removeEventListener(\"message\", this.messageHandler);\n }\n\n this.pendingRequests.forEach(({ timeout }) => clearTimeout(timeout));\n this.pendingRequests.clear();\n this.eventListeners.clear();\n\n this.initialized = false;\n this.log(\"HaexHub SDK destroyed\");\n }\n\n private async init(): Promise<void> {\n if (this.initialized) return;\n\n // IMPORTANT: Check iframe mode FIRST before attempting Tauri calls\n // This prevents hanging on Android where __TAURI__ exists but sandboxed iframes can't access it\n const isInIframe = window.self !== window.top;\n\n // Try to detect if we're running in a native WebViewWindow (Tauri)\n // Only attempt this if we're NOT in an iframe\n if (!isInIframe) {\n try {\n if (typeof (window as any).__TAURI__ !== 'undefined') {\n const { invoke } = (window as any).__TAURI__.core as {\n invoke: <T>(cmd: string, args?: Record<string, unknown>) => Promise<T>;\n };\n\n // Try to get extension info from Tauri backend\n this._extensionInfo = await invoke<ExtensionInfo>(\"webview_extension_get_info\");\n this._context = await invoke<ApplicationContext>(\"webview_extension_context_get\");\n\n this.isNativeWindow = true;\n this.initialized = true;\n\n this.log(\"HaexHub SDK initialized in native WebViewWindow mode\");\n this.log(\"Extension info:\", this._extensionInfo);\n this.log(\"Application context:\", this._context);\n\n this.notifySubscribers();\n\n // Listen for context changes via Tauri events\n const { listen } = (window as any).__TAURI__.event as {\n listen: (event: string, handler: (event: any) => void) => Promise<() => void>;\n };\n\n console.log(\"[HaexHub SDK] Setting up Tauri event listener for:\", HAEXTENSION_EVENTS.CONTEXT_CHANGED);\n\n try {\n await listen(HAEXTENSION_EVENTS.CONTEXT_CHANGED, (event: any) => {\n console.log(\"[HaexHub SDK] Received Tauri event:\", HAEXTENSION_EVENTS.CONTEXT_CHANGED, event);\n this.log(\"Received context change event:\", event);\n if (event.payload?.context) {\n this._context = event.payload.context;\n console.log(\"[HaexHub SDK] Updated context to:\", this._context);\n this.handleEvent({\n type: HAEXTENSION_EVENTS.CONTEXT_CHANGED,\n data: { context: this._context },\n timestamp: Date.now(),\n });\n } else {\n console.warn(\"[HaexHub SDK] Event received but no context in payload:\", event);\n }\n });\n console.log(\"[HaexHub SDK] Context change listener registered successfully\");\n } catch (error) {\n console.error(\"[HaexHub SDK] Failed to setup context change listener:\", error);\n this.log(\"Failed to setup context change listener:\", error);\n }\n\n this.resolveReady();\n return;\n }\n } catch (error) {\n this.log(\"Tauri commands failed, falling back to iframe mode\", error);\n // Fall through to iframe mode\n }\n }\n\n // iframe mode (mobile/web)\n // At this point we should be in an iframe\n if (window.self === window.top) {\n throw new HaexHubError(ErrorCode.NOT_IN_IFRAME, \"errors.not_in_iframe\");\n }\n\n this.messageHandler = this.handleMessage.bind(this);\n window.addEventListener(\"message\", this.messageHandler);\n\n this.isNativeWindow = false;\n this.initialized = true;\n this.log(\"HaexHub SDK initialized in iframe mode\");\n\n try {\n // Load extension info from manifest (if provided in config)\n if (this.config.manifest) {\n this._extensionInfo = {\n publicKey: this.config.manifest.publicKey,\n name: this.config.manifest.name,\n version: this.config.manifest.version,\n displayName: this.config.manifest.name,\n };\n this.log(\"Extension info loaded from manifest:\", this._extensionInfo);\n this.notifySubscribers();\n }\n\n // Debug: Check window.parent availability\n // Use alert on mobile to bypass console forwarding\n if (typeof window !== 'undefined' && window.parent) {\n const debugInfo = `SDK Debug:\\nwindow.parent exists: ${!!window.parent}\\nwindow.parent === window: ${window.parent === window}\\nwindow.self === window.top: ${window.self === window.top}`;\n try {\n // Try to send debug info via postMessage\n window.parent.postMessage({\n type: HAEXSPACE_MESSAGE_TYPES.DEBUG,\n data: debugInfo\n }, '*');\n } catch (e) {\n // Fallback to alert\n alert(debugInfo + `\\npostMessage error: ${e}`);\n }\n }\n\n // Request context from HaexHub - this also acts as a handshake\n this._context = await this.request<ApplicationContext>(HAEXTENSION_METHODS.context.get);\n this.log(\"Application context received:\", this._context);\n this.notifySubscribers();\n\n this.resolveReady();\n } catch (error) {\n this.log(\"Failed to load extension info or context:\", error);\n throw error;\n }\n }\n\n private handleMessage(event: MessageEvent): void {\n if (this.config.debug) {\n console.log(\"[SDK Debug] ========== Message Received ==========\");\n console.log(\"[SDK Debug] Event origin:\", event.origin);\n console.log(\n \"[SDK Debug] Event source:\",\n event.source === window.parent ? \"parent window\" : \"unknown\"\n );\n console.log(\"[SDK Debug] Event data:\", event.data);\n console.log(\"[SDK Debug] Extension info loaded:\", !!this._extensionInfo);\n console.log(\n \"[SDK Debug] Pending requests count:\",\n this.pendingRequests.size\n );\n }\n\n // Verify message comes from parent window (HaexHub)\n if (event.source !== window.parent) {\n if (this.config.debug) {\n console.error(\"[SDK Debug] ❌ REJECTED: Message not from parent window!\");\n }\n return;\n }\n\n const data = event.data as HaexHubResponse | HaexHubEvent;\n\n if (\"id\" in data && this.pendingRequests.has(data.id)) {\n if (this.config.debug) {\n console.log(\"[SDK Debug] ✅ Found pending request for ID:\", data.id);\n }\n const pending = this.pendingRequests.get(data.id)!;\n clearTimeout(pending.timeout);\n this.pendingRequests.delete(data.id);\n\n if (data.error) {\n if (this.config.debug) {\n console.error(\"[SDK Debug] ❌ Request failed:\", data.error);\n }\n pending.reject(data.error);\n } else {\n if (this.config.debug) {\n console.log(\"[SDK Debug] ✅ Request succeeded:\", data.result);\n }\n pending.resolve(data.result);\n }\n return;\n }\n\n if (\"id\" in data && !this.pendingRequests.has(data.id)) {\n if (this.config.debug) {\n console.warn(\n \"[SDK Debug] ⚠️ Received response for unknown request ID:\",\n data.id\n );\n console.warn(\n \"[SDK Debug] Known IDs:\",\n Array.from(this.pendingRequests.keys())\n );\n }\n }\n\n if (\"type\" in data && data.type) {\n if (this.config.debug) {\n console.log(\"[SDK Debug] Event received:\", data.type);\n }\n this.handleEvent(data as HaexHubEvent);\n }\n\n if (this.config.debug) {\n console.log(\"[SDK Debug] ========== End Message ==========\");\n }\n }\n\n private handleEvent(event: HaexHubEvent): void {\n if (event.type === HAEXTENSION_EVENTS.CONTEXT_CHANGED) {\n const contextEvent = event as ContextChangedEvent;\n this._context = contextEvent.data.context;\n this.log(\"Context updated:\", this._context);\n this.notifySubscribers();\n }\n\n this.emitEvent(event);\n }\n\n private emitEvent(event: HaexHubEvent): void {\n this.log(\"Event received:\", event);\n const listeners = this.eventListeners.get(event.type);\n if (listeners) {\n listeners.forEach((callback) => callback(event));\n }\n }\n\n private generateRequestId(): string {\n return `req_${++this.requestCounter}`;\n }\n\n private validatePublicKey(publicKey: string): void {\n if (\n !publicKey ||\n typeof publicKey !== \"string\" ||\n publicKey.trim() === \"\"\n ) {\n throw new HaexHubError(\n ErrorCode.INVALID_PUBLIC_KEY,\n \"errors.invalid_public_key\",\n { publicKey }\n );\n }\n }\n\n private validateExtensionName(extensionName: string): void {\n if (!extensionName || !/^[a-z][a-z0-9-]*$/i.test(extensionName)) {\n throw new HaexHubError(\n ErrorCode.INVALID_EXTENSION_NAME,\n \"errors.invalid_extension_name\",\n { extensionName }\n );\n }\n\n if (extensionName.includes(TABLE_SEPARATOR)) {\n throw new HaexHubError(\n ErrorCode.INVALID_EXTENSION_NAME,\n \"errors.extension_name_contains_separator\",\n { extensionName, separator: TABLE_SEPARATOR }\n );\n }\n }\n\n private validateTableName(tableName: string): void {\n if (!tableName || typeof tableName !== \"string\") {\n throw new HaexHubError(\n ErrorCode.INVALID_TABLE_NAME,\n \"errors.table_name_empty\"\n );\n }\n\n if (tableName.includes(TABLE_SEPARATOR)) {\n throw new HaexHubError(\n ErrorCode.INVALID_TABLE_NAME,\n \"errors.table_name_contains_separator\",\n { tableName, separator: TABLE_SEPARATOR }\n );\n }\n\n if (!/^[a-z][a-z0-9-_]*$/i.test(tableName)) {\n throw new HaexHubError(\n ErrorCode.INVALID_TABLE_NAME,\n \"errors.table_name_format\",\n { tableName }\n );\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log(\"[HaexHub SDK]\", ...args);\n }\n }\n}\n","import { defineNuxtPlugin } from \"nuxt/app\";\nimport { shallowRef, type ShallowRef } from \"vue\";\nimport { HaexVaultClient } 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 HaexVaultClient({\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: HaexVaultClient;\n state: ShallowRef<{\n isReady: boolean;\n isSetupComplete: boolean;\n context: ApplicationContext | null;\n }>;\n};\n"]}
1
+ {"version":3,"sources":["../../src/events.ts","../../src/methods.ts","../../src/messages.ts","../../src/types.ts","../../src/api/storage.ts","../../src/api/database.ts","../../src/api/filesystem.ts","../../src/api/web.ts","../../src/api/permissions.ts","../../src/polyfills/consoleForwarding.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 * Central request method name definitions for HaexHub SDK\n *\n * Request Naming Schema: haextension:{subject}:{action}\n *\n * These are used for client.request() calls between extensions and HaexHub\n */\n\nexport const HAEXTENSION_METHODS = {\n context: {\n get: 'haextension:context:get',\n },\n\n database: {\n query: 'haextension:database:query',\n execute: 'haextension:database:execute',\n transaction: 'haextension:database:transaction',\n registerMigrations: 'haextension:database:register-migrations',\n },\n\n filesystem: {\n saveFile: 'haextension:filesystem:save-file',\n openFile: 'haextension:filesystem:open-file',\n showImage: 'haextension:filesystem:show-image',\n },\n\n storage: {\n getItem: 'haextension:storage:get-item',\n setItem: 'haextension:storage:set-item',\n removeItem: 'haextension:storage:remove-item',\n clear: 'haextension:storage:clear',\n keys: 'haextension:storage:keys',\n },\n\n web: {\n fetch: 'haextension:web:fetch',\n },\n\n application: {\n open: 'haextension:application:open',\n },\n} as const;\n\n// Helper type to extract all string values from nested object\ntype DeepValues<T> = T extends object\n ? T[keyof T] extends string\n ? T[keyof T]\n : T[keyof T] extends object\n ? DeepValues<T[keyof T]>\n : never\n : never;\n\nexport type HaextensionMethod = DeepValues<typeof HAEXTENSION_METHODS>;\n","/**\n * Central message type definitions for HaexSpace SDK\n *\n * Message Naming Schema: haexspace:{subject}\n *\n * These are used for internal communication between extensions and HaexSpace\n */\n\nexport const HAEXSPACE_MESSAGE_TYPES = {\n /** Debug message for development/troubleshooting */\n DEBUG: 'haexspace:debug',\n\n /** Console forwarding from extension iframe */\n CONSOLE_FORWARD: 'console.forward',\n} as const;\n\nexport type HaexspaceMessageType =\n (typeof HAEXSPACE_MESSAGE_TYPES)[keyof typeof HAEXSPACE_MESSAGE_TYPES];\n","import { HAEXTENSION_EVENTS } from './events';\n\n// Constants\nexport const DEFAULT_TIMEOUT = 30000; // 30 seconds in milliseconds\nexport const TABLE_SEPARATOR = \"__\"; // Separator for table name components: {publicKey}__{extensionName}__{tableName}\n\n/**\n * Build a fully qualified table name for extensions.\n * Use this in Drizzle schemas to create table names at build time.\n *\n * @param publicKey - The extension's public key (from manifest.json)\n * @param extensionName - The extension name (from manifest.json or package.json)\n * @param tableName - The table name (e.g., \"users\", \"items\")\n * @returns Fully qualified table name: `{publicKey}__{extensionName}__{tableName}`\n *\n * @example\n * ```typescript\n * import { getTableName } from \"@haex-space/vault-sdk\";\n * import manifest from \"../haextension/manifest.json\";\n * import pkg from \"../package.json\";\n *\n * const tableName = (name: string) =>\n * getTableName(manifest.publicKey, manifest.name || pkg.name, name);\n *\n * export const users = sqliteTable(tableName(\"users\"), { ... });\n * ```\n */\nexport function getTableName(\n publicKey: string,\n extensionName: string,\n tableName: string\n): string {\n return `${publicKey}${TABLE_SEPARATOR}${extensionName}${TABLE_SEPARATOR}${tableName}`;\n}\n\n// Core Protocol Types\nexport interface HaexHubRequest {\n method: string;\n params: Record<string, unknown>;\n timestamp: number;\n}\n\nexport interface HaexHubResponse<T = unknown> {\n id: string;\n result?: T;\n error?: HaexHubError;\n}\n\nexport interface HaexHubError {\n code: ErrorCode;\n message: string;\n details?: Record<string, unknown>;\n}\n\n// Extension Info (loaded from manifest.json at build time)\nexport interface ExtensionInfo {\n publicKey: string;\n name: string;\n version: string;\n displayName?: string;\n namespace?: string;\n}\n\n// Application Context (provided by HaexHub)\nexport interface ApplicationContext {\n theme: \"light\" | \"dark\" | \"system\";\n locale: string;\n platform:\n | \"linux\"\n | \"macos\"\n | \"ios\"\n | \"freebsd\"\n | \"dragonfly\"\n | \"netbsd\"\n | \"openbsd\"\n | \"solaris\"\n | \"android\"\n | \"windows\"\n | undefined;\n}\n\n// Search Types\nexport interface SearchQuery {\n query: string;\n filters?: Record<string, unknown>;\n limit?: number;\n}\n\nexport interface SearchResult {\n id: string;\n title: string;\n description?: string;\n type: string;\n data?: Record<string, unknown>;\n score?: number;\n}\n\n// Permission Types\nexport enum PermissionStatus {\n GRANTED = \"granted\",\n DENIED = \"denied\",\n ASK = \"ask\",\n}\n\nexport interface PermissionResponse {\n status: PermissionStatus;\n permanent: boolean;\n}\n\n// Database Permission (matches Rust DbExtensionPermission)\nexport interface DatabasePermission {\n extensionId: string;\n resource: string;\n operation: \"read\" | \"write\";\n path: string;\n}\n\nexport interface DatabasePermissionRequest {\n resource: string;\n operation: \"read\" | \"write\";\n reason?: string;\n}\n\n// Database Types\nexport interface DatabaseQueryParams {\n query: string;\n params?: unknown[];\n}\n\nexport interface DatabaseQueryResult {\n rows: unknown[]; // Array of arrays (each row is an array of values)\n columns?: string[]; // Column names in order\n rowsAffected: number;\n lastInsertId?: number;\n}\n\nexport interface DatabaseExecuteParams {\n statements: string[];\n}\n\n// Migration Types\nexport interface MigrationResult {\n appliedCount: number;\n alreadyAppliedCount: number;\n appliedMigrations: string[];\n}\n\nexport interface Migration {\n name: string;\n sql: string;\n}\n\nexport interface DatabaseTableInfo {\n name: string;\n columns: DatabaseColumnInfo[];\n}\n\nexport interface DatabaseColumnInfo {\n name: string;\n type: string;\n notNull: boolean;\n defaultValue?: unknown;\n primaryKey: boolean;\n}\n\n// Event Types\nexport interface HaexHubEvent {\n type: string;\n data: unknown;\n timestamp: number;\n}\n\n// Specific Event Types\nexport interface ContextChangedEvent extends HaexHubEvent {\n type: typeof HAEXTENSION_EVENTS.CONTEXT_CHANGED;\n data: {\n context: ApplicationContext;\n };\n}\n\nexport interface SearchRequestEvent extends HaexHubEvent {\n type: typeof HAEXTENSION_EVENTS.SEARCH_REQUEST;\n data: {\n query: SearchQuery;\n requestId: string;\n };\n}\n\nexport type EventCallback = (event: HaexHubEvent) => void;\n\n// Manifest Types\nexport interface ExtensionManifest {\n name: string;\n version: string;\n author?: string | null;\n entry?: string | null;\n icon?: string | null;\n publicKey: string;\n signature: string;\n permissions: {\n database?: any[];\n filesystem?: any[];\n http?: any[];\n shell?: any[];\n };\n homepage?: string | null;\n description?: string | null;\n singleInstance?: boolean | null;\n displayMode?: \"auto\" | \"window\" | \"iframe\" | null;\n /**\n * Path to the migrations directory relative to the extension root.\n * Contains Drizzle-style migrations with meta/_journal.json and *.sql files.\n * These migrations will be applied when the extension is installed.\n * Example: \"database/migrations\"\n */\n migrationsDir?: string | null;\n}\n\n// Config Types\nexport interface HaexHubConfig {\n debug?: boolean;\n timeout?: number;\n /** Extension manifest data (auto-injected by framework integrations) */\n manifest?: ExtensionManifest;\n}\n\n// Web/Fetch Types\nexport interface WebRequestOptions {\n method?: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\" | \"HEAD\" | \"OPTIONS\";\n headers?: Record<string, string>;\n body?: string | ArrayBuffer | Blob;\n timeout?: number;\n}\n\nexport interface WebResponse {\n status: number;\n statusText: string;\n headers: Record<string, string>;\n body: ArrayBuffer;\n url: string;\n}\n\n// Error Codes\nexport enum ErrorCode {\n // Connection Errors\n TIMEOUT = \"TIMEOUT\",\n NOT_IN_IFRAME = \"NOT_IN_IFRAME\",\n UNAUTHORIZED_ORIGIN = \"UNAUTHORIZED_ORIGIN\",\n\n // Permission Errors\n PERMISSION_DENIED = \"PERMISSION_DENIED\",\n\n // Validation Errors\n INVALID_PUBLIC_KEY = \"INVALID_PUBLIC_KEY\",\n INVALID_EXTENSION_NAME = \"INVALID_EXTENSION_NAME\",\n INVALID_TABLE_NAME = \"INVALID_TABLE_NAME\",\n INVALID_PARAMS = \"INVALID_PARAMS\",\n\n // Extension Errors\n EXTENSION_NOT_INITIALIZED = \"EXTENSION_NOT_INITIALIZED\",\n EXTENSION_INFO_UNAVAILABLE = \"EXTENSION_INFO_UNAVAILABLE\",\n\n // API Errors\n METHOD_NOT_FOUND = \"METHOD_NOT_FOUND\",\n INTERNAL_ERROR = \"INTERNAL_ERROR\",\n DATABASE_ERROR = \"DATABASE_ERROR\",\n WEB_ERROR = \"WEB_ERROR\",\n}\n\nexport class HaexHubError extends Error {\n constructor(\n public code: ErrorCode,\n public messageKey: string,\n public details?: Record<string, unknown>\n ) {\n super(messageKey);\n this.name = \"HaexHubError\";\n }\n\n /**\n * Get localized error message\n * @param locale - Locale code (e.g., 'en', 'de')\n * @param translations - Translation object\n */\n getLocalizedMessage(\n locale: string = \"en\",\n translations?: Record<string, Record<string, string>>\n ): string {\n if (!translations || !translations[locale]) {\n return this.messageKey;\n }\n\n let message = translations[locale][this.messageKey] || this.messageKey;\n\n // Replace placeholders with details\n if (this.details) {\n Object.entries(this.details).forEach(([key, value]) => {\n message = message.replace(`{${key}}`, String(value));\n });\n }\n\n return message;\n }\n\n toJSON() {\n return {\n code: this.code,\n message: this.messageKey,\n details: this.details,\n };\n }\n}\n","import type { HaexVaultClient } from \"~/client\";\nimport { HAEXTENSION_METHODS } from \"~/methods\";\n\nexport class StorageAPI {\n constructor(private client: HaexVaultClient) {}\n\n async getItem(key: string): Promise<string | null> {\n return this.client.request<string | null>(HAEXTENSION_METHODS.storage.getItem, { key });\n }\n\n async setItem(key: string, value: string): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.storage.setItem, { key, value });\n }\n\n async removeItem(key: string): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.storage.removeItem, { key });\n }\n\n async clear(): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.storage.clear);\n }\n\n async keys(): Promise<string[]> {\n return this.client.request<string[]>(HAEXTENSION_METHODS.storage.keys);\n }\n}\n","import type { HaexVaultClient } from \"../client\";\nimport type { DatabaseQueryResult, MigrationResult, Migration } from \"../types\";\nimport { HAEXTENSION_METHODS } from \"../methods\";\n\nexport class DatabaseAPI {\n constructor(private client: HaexVaultClient) {}\n\n async query<T>(query: string, params?: unknown[]): Promise<T[]> {\n const result = await this.client.request<DatabaseQueryResult>(\n HAEXTENSION_METHODS.database.query,\n {\n query,\n params: params || [],\n }\n );\n\n return result.rows as T[];\n }\n\n async queryOne<T = unknown>(\n query: string,\n params?: unknown[]\n ): Promise<T | null> {\n const rows = await this.query<T>(query, params);\n return rows.length > 0 ? rows[0] ?? null : null;\n }\n\n async execute(\n query: string,\n params?: unknown[]\n ): Promise<DatabaseQueryResult> {\n return this.client.request<DatabaseQueryResult>(HAEXTENSION_METHODS.database.execute, {\n query,\n params: params || [],\n });\n }\n\n async transaction(statements: string[]): Promise<void> {\n await this.client.request(HAEXTENSION_METHODS.database.transaction, {\n statements,\n });\n }\n\n async createTable(tableName: string, columns: string): Promise<void> {\n const query = `CREATE TABLE IF NOT EXISTS ${tableName} (${columns})`;\n await this.execute(query);\n }\n\n async dropTable(tableName: string): Promise<void> {\n const query = `DROP TABLE IF EXISTS ${tableName}`;\n await this.execute(query);\n }\n\n /**\n * Registers and applies extension migrations with HaexVault\n *\n * HaexVault will:\n * 1. Validate all SQL statements (ensure only extension's own tables are accessed)\n * 2. Store migrations with applied_at = NULL\n * 3. Query pending migrations sorted by name\n * 4. Apply pending migrations and set up CRDT triggers\n * 5. Mark successful migrations with applied_at timestamp\n *\n * @param extensionVersion - The version of the extension\n * @param migrations - Array of migration objects with name and SQL content\n * @returns Promise with migration result (applied count, already applied count, applied migration names)\n */\n async registerMigrationsAsync(\n extensionVersion: string,\n migrations: Migration[]\n ): Promise<MigrationResult> {\n return this.client.request<MigrationResult>(\n HAEXTENSION_METHODS.database.registerMigrations,\n {\n extensionVersion,\n migrations,\n }\n );\n }\n\n async insert(\n tableName: string,\n data: Record<string, unknown>\n ): Promise<number> {\n const keys = Object.keys(data);\n const values = Object.values(data);\n const placeholders = keys.map(() => \"?\").join(\", \");\n\n const query = `INSERT INTO ${tableName} (${keys.join(\n \", \"\n )}) VALUES (${placeholders})`;\n const result = await this.execute(query, values);\n\n return result.lastInsertId ?? -1;\n }\n\n async update(\n tableName: string,\n data: Record<string, unknown>,\n where: string,\n whereParams?: unknown[]\n ): Promise<number> {\n const keys = Object.keys(data);\n const values = Object.values(data);\n const setClause = keys.map((key) => `${key} = ?`).join(\", \");\n\n const query = `UPDATE ${tableName} SET ${setClause} WHERE ${where}`;\n const result = await this.execute(query, [\n ...values,\n ...(whereParams || []),\n ]);\n\n return result.rowsAffected;\n }\n\n async delete(\n tableName: string,\n where: string,\n whereParams?: unknown[]\n ): Promise<number> {\n const query = `DELETE FROM ${tableName} WHERE ${where}`;\n const result = await this.execute(query, whereParams);\n return result.rowsAffected;\n }\n\n async count(\n tableName: string,\n where?: string,\n whereParams?: unknown[]\n ): Promise<number> {\n const query = where\n ? `SELECT COUNT(*) as count FROM ${tableName} WHERE ${where}`\n : `SELECT COUNT(*) as count FROM ${tableName}`;\n\n const result = await this.queryOne<{ count: number }>(query, whereParams);\n return result?.count ?? 0;\n }\n\n}\n","import type { HaexVaultClient } from \"../client\";\nimport { HAEXTENSION_METHODS } from \"../methods\";\n\nexport interface SaveFileOptions {\n /**\n * The default filename to suggest\n */\n defaultPath?: string;\n\n /**\n * The title of the save dialog\n */\n title?: string;\n\n /**\n * File filters for the dialog\n */\n filters?: Array<{\n name: string;\n extensions: string[];\n }>;\n}\n\nexport interface SaveFileResult {\n /**\n * The path where the file was saved\n */\n path: string;\n\n /**\n * Whether the operation was successful\n */\n success: boolean;\n}\n\nexport interface OpenFileOptions {\n /**\n * The filename for the temporary file\n */\n fileName: string;\n\n /**\n * Optional MIME type for the file\n */\n mimeType?: string;\n}\n\nexport interface OpenFileResult {\n /**\n * Whether the operation was successful\n */\n success: boolean;\n}\n\nexport interface ShowImageOptions {\n /**\n * The data URL of the image (base64 encoded)\n */\n dataUrl: string;\n}\n\nexport interface ShowImageResult {\n /**\n * Whether the operation was successful\n */\n success: boolean;\n}\n\nexport class FilesystemAPI {\n constructor(private client: HaexVaultClient) {}\n\n /**\n * Opens a save file dialog and saves the provided data to the selected location\n * @param data The file data as Uint8Array\n * @param options Options for the save dialog\n * @returns The path where the file was saved, or null if cancelled\n */\n async saveFileAsync(\n data: Uint8Array,\n options: SaveFileOptions = {}\n ): Promise<SaveFileResult | null> {\n const result = await this.client.request<SaveFileResult | null>(\n HAEXTENSION_METHODS.filesystem.saveFile,\n {\n data: Array.from(data), // Convert Uint8Array to regular array for postMessage\n defaultPath: options.defaultPath,\n title: options.title,\n filters: options.filters,\n }\n );\n\n return result;\n }\n\n /**\n * Opens a file with the system's default viewer\n * @param data The file data as Uint8Array\n * @param options Options for opening the file\n * @returns The result of the operation\n */\n async openFileAsync(\n data: Uint8Array,\n options: OpenFileOptions\n ): Promise<OpenFileResult> {\n const result = await this.client.request<OpenFileResult>(\n HAEXTENSION_METHODS.filesystem.openFile,\n {\n data: Array.from(data), // Convert Uint8Array to regular array for postMessage\n fileName: options.fileName,\n mimeType: options.mimeType,\n }\n );\n\n return result;\n }\n\n /**\n * Shows an image using a data URL (safe, read-only viewing)\n * This is safe to use without special permissions as it only displays images\n * and doesn't execute any code or open files with external applications\n * @param options Options containing the data URL\n * @returns The result of the operation\n */\n async showImageAsync(\n options: ShowImageOptions\n ): Promise<ShowImageResult> {\n const result = await this.client.request<ShowImageResult>(\n HAEXTENSION_METHODS.filesystem.showImage,\n {\n dataUrl: options.dataUrl,\n }\n );\n\n return result;\n }\n}\n","import type { HaexVaultClient } from \"../client\";\nimport type { WebRequestOptions, WebResponse } from \"../types\";\nimport { HAEXTENSION_METHODS } from \"../methods\";\n\nexport class WebAPI {\n constructor(private client: HaexVaultClient) {}\n\n /**\n * Performs a web request through the HaexHub host application\n * @param url The URL to fetch\n * @param options Request options (method, headers, body, timeout)\n * @returns Promise resolving to the web response\n */\n async fetchAsync(url: string, options: WebRequestOptions = {}): Promise<WebResponse> {\n // Convert body to base64 if it's an ArrayBuffer or Blob\n let bodyParam: string | undefined;\n\n if (options.body) {\n if (options.body instanceof ArrayBuffer) {\n bodyParam = this.arrayBufferToBase64(options.body);\n } else if (options.body instanceof Blob) {\n bodyParam = await this.blobToBase64(options.body);\n } else {\n bodyParam = options.body;\n }\n }\n\n const response = await this.client.request<{\n status: number;\n statusText: string;\n headers: Record<string, string>;\n body: string; // Base64 encoded\n url: string;\n }>(HAEXTENSION_METHODS.web.fetch, {\n url,\n method: options.method || \"GET\",\n headers: options.headers,\n body: bodyParam,\n timeout: options.timeout,\n });\n\n // Convert base64 body back to ArrayBuffer\n const bodyBuffer = this.base64ToArrayBuffer(response.body);\n\n return {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n body: bodyBuffer,\n url: response.url,\n };\n }\n\n /**\n * Convenience method for JSON requests\n */\n async fetchJsonAsync<T = unknown>(\n url: string,\n options: WebRequestOptions = {}\n ): Promise<T> {\n const response = await this.fetchAsync(url, options);\n const text = new TextDecoder().decode(response.body);\n return JSON.parse(text) as T;\n }\n\n /**\n * Convenience method for text requests\n */\n async fetchTextAsync(url: string, options: WebRequestOptions = {}): Promise<string> {\n const response = await this.fetchAsync(url, options);\n return new TextDecoder().decode(response.body);\n }\n\n /**\n * Convenience method for blob requests\n */\n async fetchBlobAsync(url: string, options: WebRequestOptions = {}): Promise<Blob> {\n const response = await this.fetchAsync(url, options);\n return new Blob([response.body]);\n }\n\n /**\n * Opens a URL in the user's default browser\n * @param url The URL to open\n */\n async openAsync(url: string): Promise<void> {\n await this.client.request<void>(HAEXTENSION_METHODS.application.open, {\n application: \"browser\",\n url,\n });\n }\n\n private arrayBufferToBase64(buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer);\n let binary = '';\n for (let i = 0; i < bytes.byteLength; i++) {\n const byte = bytes[i];\n if (byte === undefined) {\n throw new Error('Invalid byte at index ' + i);\n }\n binary += String.fromCharCode(byte);\n }\n return btoa(binary);\n }\n\n private async blobToBase64(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => {\n const result = reader.result;\n if (typeof result !== 'string') {\n reject(new Error('Failed to read blob as data URL'));\n return;\n }\n const parts = result.split(',');\n const base64 = parts[1];\n if (!base64) {\n reject(new Error('Failed to extract base64 from data URL'));\n return;\n }\n resolve(base64);\n };\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n });\n }\n\n private base64ToArrayBuffer(base64: string): ArrayBuffer {\n const binaryString = atob(base64);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes.buffer;\n }\n}\n","import type { HaexVaultClient } from \"../client\";\nimport type { PermissionResponse } from \"../types\";\n\nexport class PermissionsAPI {\n constructor(private client: HaexVaultClient) {}\n\n /**\n * Checks if the extension has permission for a database operation\n * @param resource The database resource (table name or \"*\" for all tables)\n * @param operation The operation type (\"read\" or \"write\")\n * @returns Promise<boolean> indicating if permission is granted\n */\n async checkDatabaseAsync(\n resource: string,\n operation: \"read\" | \"write\"\n ): Promise<boolean> {\n const response = await this.client.request<PermissionResponse>(\n \"permissions.database.check\",\n {\n resource,\n operation,\n }\n );\n return response.status === \"granted\";\n }\n\n /**\n * Checks if the extension has permission for a web request\n * @param url The URL to check (e.g., \"https://example.com/path\")\n * @returns Promise<boolean> indicating if permission is granted\n * @note Method/operation is not checked - permissions apply to all HTTP methods\n */\n async checkWebAsync(url: string): Promise<boolean> {\n const response = await this.client.request<PermissionResponse>(\n \"permissions.web.check\",\n {\n url,\n }\n );\n return response.status === \"granted\";\n }\n\n /**\n * Checks if the extension has permission for a filesystem operation\n * @param path The file or directory path\n * @param operation The operation type (\"read\" or \"write\")\n * @returns Promise<boolean> indicating if permission is granted\n */\n async checkFilesystemAsync(\n path: string,\n operation: \"read\" | \"write\"\n ): Promise<boolean> {\n const response = await this.client.request<PermissionResponse>(\n \"permissions.filesystem.check\",\n {\n path,\n operation,\n }\n );\n return response.status === \"granted\";\n }\n}\n","/**\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","import { HAEXTENSION_EVENTS } from './events';\nimport { HAEXTENSION_METHODS } from './methods';\nimport { HAEXSPACE_MESSAGE_TYPES } from './messages';\nimport type {\n HaexHubRequest,\n HaexHubResponse,\n HaexHubConfig,\n HaexHubEvent,\n EventCallback,\n PermissionResponse,\n DatabasePermissionRequest,\n ExtensionInfo,\n ApplicationContext,\n SearchResult,\n ContextChangedEvent,\n DatabaseQueryResult,\n MigrationResult,\n Migration,\n} from \"./types\";\nimport {\n ErrorCode,\n DEFAULT_TIMEOUT,\n TABLE_SEPARATOR,\n HaexHubError,\n getTableName,\n} from \"./types\";\nimport { StorageAPI } from \"./api/storage\";\nimport { DatabaseAPI } from \"./api/database\";\nimport { FilesystemAPI } from \"./api/filesystem\";\nimport { WebAPI } from \"./api/web\";\nimport { PermissionsAPI } from \"./api/permissions\";\nimport { installConsoleForwarding } from \"./polyfills/consoleForwarding\";\nimport { drizzle, type SqliteRemoteDatabase } from \"drizzle-orm/sqlite-proxy\";\n\nexport class HaexVaultClient {\n private config: Required<Omit<HaexHubConfig, \"manifest\">> & {\n manifest?: HaexHubConfig[\"manifest\"];\n };\n private pendingRequests: Map<\n string,\n {\n resolve: (value: any) => void;\n reject: (error: any) => void;\n timeout: NodeJS.Timeout;\n }\n > = new Map();\n private eventListeners: Map<string, Set<EventCallback>> = new Map();\n private messageHandler: ((event: MessageEvent) => void) | null = null;\n private initialized = false;\n private requestCounter = 0;\n private _extensionInfo: ExtensionInfo | null = null;\n private _context: ApplicationContext | null = null;\n private reactiveSubscribers: Set<() => void> = new Set();\n private isNativeWindow = false;\n\n private readyPromise: Promise<void>;\n private resolveReady!: () => void; // Wird im Konstruktor initialisiert\n\n private setupPromise: Promise<void> | null = null;\n private setupHook: (() => Promise<void>) | null = null;\n private _setupCompleted = false;\n\n public orm: SqliteRemoteDatabase<Record<string, unknown>> | null = null;\n public readonly storage: StorageAPI;\n public readonly database: DatabaseAPI;\n public readonly filesystem: FilesystemAPI;\n public readonly web: WebAPI;\n public readonly permissions: PermissionsAPI;\n\n constructor(config: HaexHubConfig = {}) {\n this.config = {\n debug: config.debug ?? false,\n timeout: config.timeout ?? DEFAULT_TIMEOUT,\n manifest: config.manifest,\n };\n\n this.storage = new StorageAPI(this);\n this.database = new DatabaseAPI(this);\n this.filesystem = new FilesystemAPI(this);\n this.web = new WebAPI(this);\n this.permissions = new PermissionsAPI(this);\n\n // Install console forwarding if in debug mode\n installConsoleForwarding(this.config.debug);\n\n this.readyPromise = new Promise((resolve) => {\n this.resolveReady = resolve;\n });\n\n this.init();\n }\n\n /**\n * Gibt ein Promise zurück, das aufgelöst wird, sobald der Client\n * initialisiert ist und Extension-Infos empfangen hat.\n */\n public async ready(): Promise<void> {\n return this.readyPromise;\n }\n\n /**\n * Gibt zurück, ob das Setup bereits abgeschlossen wurde.\n */\n public get setupCompleted(): boolean {\n return this._setupCompleted;\n }\n\n /**\n * Registriert eine Setup-Funktion, die nach der Initialisierung ausgeführt wird.\n * Diese Funktion sollte für Aufgaben wie Tabellenerstellung, Migrationen, etc. verwendet werden.\n * @param setupFn Die Setup-Funktion, die ausgeführt werden soll\n */\n public onSetup(setupFn: () => Promise<void>): void {\n if (this.setupHook) {\n throw new Error('Setup hook already registered');\n }\n this.setupHook = setupFn;\n }\n\n /**\n * Gibt ein Promise zurück, das aufgelöst wird, sobald der Client vollständig eingerichtet ist.\n * Dies umfasst die Initialisierung UND das Setup (z.B. Tabellenerstellung).\n * Falls kein Setup-Hook registriert wurde, entspricht dies ready().\n */\n public async setupComplete(): Promise<void> {\n await this.readyPromise;\n\n if (!this.setupHook || this.setupCompleted) {\n return;\n }\n\n if (!this.setupPromise) {\n this.setupPromise = this.runSetupAsync();\n }\n\n return this.setupPromise;\n }\n\n private async runSetupAsync(): Promise<void> {\n if (!this.setupHook) return;\n\n try {\n this.log('[HaexSpace] Running setup hook...');\n await this.setupHook();\n this._setupCompleted = true;\n this.log('[HaexSpace] Setup completed successfully');\n\n // Notify subscribers that setup is complete\n this.notifySubscribers();\n } catch (error) {\n this.log('[HaexSpace] Setup failed:', error);\n throw error;\n }\n }\n\n /**\n * Initialisiert die Drizzle-Datenbankinstanz.\n * Muss nach der Definition des Schemas aufgerufen werden.\n * @param schema Das Drizzle-Schemaobjekt (mit bereits geprefixten Tabellennamen).\n * @returns Die typsichere Drizzle-Datenbankinstanz.\n */\n public initializeDatabase<T extends Record<string, unknown>>(\n schema: T\n ): SqliteRemoteDatabase<T> {\n if (!this._extensionInfo) {\n throw new HaexHubError(\n ErrorCode.EXTENSION_INFO_UNAVAILABLE,\n \"errors.client_not_ready\"\n );\n }\n\n const dbInstance = drizzle<T>(\n async (\n sql: string,\n params: unknown[],\n method: \"get\" | \"run\" | \"all\" | \"values\"\n ) => {\n try {\n // Drizzle uses different methods:\n // - \"run\": INSERT/UPDATE/DELETE without RETURNING\n // - \"all\": INSERT/UPDATE/DELETE with RETURNING, or SELECT\n // - \"get\": SELECT with LIMIT 1\n // - \"values\": SELECT returning raw values\n //\n // The backend intelligently handles routing:\n // - method=\"run\" and \"all\" go to haextension.db.execute\n // - Backend detects SELECT statements and delegates to haextension.db.query\n // - Backend returns rows when RETURNING clause is present\n\n if (method === \"run\" || method === \"all\") {\n const result = await this.request<DatabaseQueryResult>(\n HAEXTENSION_METHODS.database.execute,\n {\n query: sql,\n params: params as unknown[],\n }\n );\n\n // For method=\"all\", return rows (RETURNING clause or SELECT delegated by backend)\n if (method === \"all\") {\n return { rows: result.rows || [] };\n }\n\n // For method=\"run\", check if we have rows (RETURNING clause)\n if (result.rows && Array.isArray(result.rows) && result.rows.length > 0) {\n return { rows: result.rows };\n }\n\n return result;\n }\n\n // Read operations (SELECT without RETURNING)\n const result = await this.request<DatabaseQueryResult>(HAEXTENSION_METHODS.database.query, {\n query: sql,\n params: params as unknown[],\n });\n\n const rows = result.rows as any[];\n\n if (method === \"get\") {\n return { rows: rows.length > 0 ? rows.at(0) : undefined };\n }\n\n return { rows };\n } catch (error) {\n this.log(\"Database operation failed:\", error);\n throw error;\n }\n },\n {\n schema: schema,\n logger: false,\n }\n );\n\n this.orm = dbInstance;\n return dbInstance;\n }\n\n public get extensionInfo(): ExtensionInfo | null {\n return this._extensionInfo;\n }\n\n public get context(): ApplicationContext | null {\n return this._context;\n }\n\n public subscribe(callback: () => void): () => void {\n this.reactiveSubscribers.add(callback);\n return () => {\n this.reactiveSubscribers.delete(callback);\n };\n }\n\n private notifySubscribers(): void {\n this.reactiveSubscribers.forEach((callback) => callback());\n }\n\n public async getDependencies(): Promise<ExtensionInfo[]> {\n return this.request<ExtensionInfo[]>(\"extensions.getDependencies\");\n }\n\n public getTableName(tableName: string): string {\n if (!this._extensionInfo) {\n throw new HaexHubError(\n ErrorCode.EXTENSION_INFO_UNAVAILABLE,\n \"errors.extension_info_unavailable\"\n );\n }\n\n this.validateTableName(tableName);\n\n const { publicKey, name } = this._extensionInfo;\n\n // Return table name wrapped in double quotes to handle special characters (like hyphens in extension names)\n return `\"${getTableName(publicKey, name, tableName)}\"`;\n }\n\n public getDependencyTableName(\n publicKey: string,\n extensionName: string,\n tableName: string\n ): string {\n this.validatePublicKey(publicKey);\n this.validateExtensionName(extensionName);\n this.validateTableName(tableName);\n\n // Return table name wrapped in double quotes to handle special characters\n return `\"${getTableName(publicKey, extensionName, tableName)}\"`;\n }\n\n public parseTableName(fullTableName: string): {\n publicKey: string;\n extensionName: string;\n tableName: string;\n } | null {\n // Remove surrounding quotes if present\n let cleanTableName = fullTableName;\n if (cleanTableName.startsWith('\"') && cleanTableName.endsWith('\"')) {\n cleanTableName = cleanTableName.slice(1, -1);\n }\n\n const parts = cleanTableName.split(TABLE_SEPARATOR);\n\n if (parts.length !== 3) {\n return null;\n }\n\n const [publicKey, extensionName, tableName] = parts;\n\n if (!publicKey || !extensionName || !tableName) {\n return null;\n }\n\n return {\n publicKey,\n extensionName,\n tableName,\n };\n }\n\n /**\n * Execute a raw SQL query (SELECT)\n * Returns rows as an array of objects\n */\n public async query<T = Record<string, unknown>>(\n sql: string,\n params: unknown[] = []\n ): Promise<T[]> {\n const result = await this.request<DatabaseQueryResult>(\n HAEXTENSION_METHODS.database.query,\n { query: sql, params }\n );\n if (this.config.debug) {\n console.log('[SDK query()] Raw result:', JSON.stringify(result, null, 2));\n }\n return result.rows as T[];\n }\n\n /**\n * Alias for query() - more intuitive for SELECT statements\n */\n public async select<T = Record<string, unknown>>(\n sql: string,\n params: unknown[] = []\n ): Promise<T[]> {\n return this.query<T>(sql, params);\n }\n\n /**\n * Execute a raw SQL statement (INSERT, UPDATE, DELETE, CREATE, etc.)\n * Returns rowsAffected and lastInsertId\n */\n public async execute(\n sql: string,\n params: unknown[] = []\n ): Promise<{ rowsAffected: number; lastInsertId?: number }> {\n const result = await this.request<DatabaseQueryResult>(\n HAEXTENSION_METHODS.database.execute,\n { query: sql, params }\n );\n return {\n rowsAffected: result.rowsAffected,\n lastInsertId: result.lastInsertId,\n };\n }\n\n /**\n * Registers and applies extension migrations with HaexVault\n *\n * HaexVault will:\n * 1. Validate all SQL statements (ensure only extension's own tables are accessed)\n * 2. Store migrations with applied_at = NULL\n * 3. Query pending migrations sorted by name\n * 4. Apply pending migrations and set up CRDT triggers\n * 5. Mark successful migrations with applied_at timestamp\n *\n * @param extensionVersion - The version of the extension\n * @param migrations - Array of migration objects with name and SQL content\n * @returns Promise with migration result (applied count, already applied count, applied migration names)\n */\n public async registerMigrationsAsync(\n extensionVersion: string,\n migrations: Migration[]\n ): Promise<MigrationResult> {\n return this.database.registerMigrationsAsync(extensionVersion, migrations);\n }\n\n public async requestDatabasePermission(\n request: DatabasePermissionRequest\n ): Promise<PermissionResponse> {\n return this.request<PermissionResponse>(\"permissions.database.request\", {\n resource: request.resource,\n operation: request.operation,\n reason: request.reason,\n });\n }\n\n public async checkDatabasePermission(\n resource: string,\n operation: \"read\" | \"write\"\n ): Promise<boolean> {\n const response = await this.request<PermissionResponse>(\n \"permissions.database.check\",\n {\n resource,\n operation,\n }\n );\n return response.status === \"granted\";\n }\n\n public async respondToSearch(\n requestId: string,\n results: SearchResult[]\n ): Promise<void> {\n await this.request(\"search.respond\", {\n requestId,\n results,\n });\n }\n\n public async request<T = unknown>(\n method: string,\n params: Record<string, unknown> = {}\n ): Promise<T> {\n // Native window mode: Use Tauri invoke() for direct backend communication\n if (this.isNativeWindow && typeof (window as any).__TAURI__ !== 'undefined') {\n return this.invoke<T>(method, params);\n }\n\n // iframe mode: Use postMessage for communication through parent window\n return this.postMessage<T>(method, params);\n }\n\n private async postMessage<T>(\n method: string,\n params: Record<string, unknown>\n ): Promise<T> {\n const requestId = this.generateRequestId();\n\n const request: HaexHubRequest = {\n method,\n params,\n timestamp: Date.now(),\n };\n\n return new Promise<T>((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pendingRequests.delete(requestId);\n reject(\n new HaexHubError(ErrorCode.TIMEOUT, \"errors.timeout\", {\n timeout: this.config.timeout,\n })\n );\n }, this.config.timeout);\n\n this.pendingRequests.set(requestId, { resolve, reject, timeout });\n\n // Use wildcard origin since extensions are sandboxed in their own protocol\n const targetOrigin = \"*\";\n\n if (this.config.debug) {\n console.log(\"[SDK Debug] ========== Sending Request ==========\");\n console.log(\"[SDK Debug] Request ID:\", requestId);\n console.log(\"[SDK Debug] Method:\", request.method);\n console.log(\"[SDK Debug] Params:\", request.params);\n console.log(\"[SDK Debug] Target origin:\", targetOrigin);\n console.log(\"[SDK Debug] Extension info:\", this._extensionInfo);\n console.log(\"[SDK Debug] ========================================\");\n }\n\n window.parent.postMessage({ id: requestId, ...request }, targetOrigin);\n });\n }\n\n private async invoke<T>(\n method: string,\n params: Record<string, unknown>\n ): Promise<T> {\n const { invoke } = (window as any).__TAURI__.core as {\n invoke: <R>(cmd: string, args?: Record<string, unknown>) => Promise<R>;\n };\n\n if (this.config.debug) {\n console.log(\"[SDK Debug] ========== Invoke Request ==========\");\n console.log(\"[SDK Debug] Method:\", method);\n console.log(\"[SDK Debug] Params:\", params);\n console.log(\"[SDK Debug] =======================================\");\n }\n\n // Map SDK methods to Tauri commands\n switch (method) {\n case HAEXTENSION_METHODS.database.query:\n return invoke<T>(\"webview_extension_db_query\", {\n query: params.query as string,\n params: (params.params as unknown[]) || [],\n });\n\n case HAEXTENSION_METHODS.database.execute:\n return invoke<T>(\"webview_extension_db_execute\", {\n query: params.query as string,\n params: (params.params as unknown[]) || [],\n });\n\n case \"permissions.web.check\":\n return invoke<T>(\"webview_extension_check_web_permission\", {\n url: params.url as string,\n });\n\n case \"permissions.database.check\":\n return invoke<T>(\"webview_extension_check_database_permission\", {\n resource: params.resource as string,\n operation: params.operation as string,\n });\n\n case \"permissions.filesystem.check\":\n return invoke<T>(\"webview_extension_check_filesystem_permission\", {\n path: params.path as string,\n actionStr: params.action as string,\n });\n\n case HAEXTENSION_METHODS.application.open:\n return invoke<T>(\"webview_extension_web_open\", {\n url: params.url as string,\n });\n\n case HAEXTENSION_METHODS.web.fetch:\n return invoke<T>(\"webview_extension_web_request\", {\n url: params.url as string,\n method: params.method as string | undefined,\n headers: params.headers as Record<string, string> | undefined,\n body: params.body as string | undefined,\n });\n\n case HAEXTENSION_METHODS.filesystem.saveFile:\n return invoke<T>(\"webview_extension_fs_save_file\", {\n data: params.data as number[],\n defaultPath: params.defaultPath as string | undefined,\n title: params.title as string | undefined,\n filters: params.filters as Array<{ name: string; extensions: string[] }> | undefined,\n });\n\n case HAEXTENSION_METHODS.filesystem.openFile:\n return invoke<T>(\"webview_extension_fs_open_file\", {\n data: params.data as number[],\n fileName: params.fileName as string,\n });\n\n case HAEXTENSION_METHODS.database.registerMigrations:\n return invoke<T>(\"webview_extension_db_register_migrations\", {\n extensionVersion: params.extensionVersion as string,\n migrations: params.migrations as Array<{ name: string; sql: string }>,\n });\n\n default:\n throw new HaexHubError(\n ErrorCode.METHOD_NOT_FOUND,\n \"errors.method_not_found\",\n { method }\n );\n }\n }\n\n public on(eventType: string, callback: EventCallback): void {\n if (!this.eventListeners.has(eventType)) {\n this.eventListeners.set(eventType, new Set());\n }\n this.eventListeners.get(eventType)!.add(callback);\n }\n\n public off(eventType: string, callback: EventCallback): void {\n const listeners = this.eventListeners.get(eventType);\n if (listeners) {\n listeners.delete(callback);\n }\n }\n\n public destroy(): void {\n if (this.messageHandler) {\n window.removeEventListener(\"message\", this.messageHandler);\n }\n\n this.pendingRequests.forEach(({ timeout }) => clearTimeout(timeout));\n this.pendingRequests.clear();\n this.eventListeners.clear();\n\n this.initialized = false;\n this.log(\"HaexHub SDK destroyed\");\n }\n\n private async init(): Promise<void> {\n if (this.initialized) return;\n\n // IMPORTANT: Check iframe mode FIRST before attempting Tauri calls\n // This prevents hanging on Android where __TAURI__ exists but sandboxed iframes can't access it\n const isInIframe = window.self !== window.top;\n\n // Try to detect if we're running in a native WebViewWindow (Tauri)\n // Only attempt this if we're NOT in an iframe\n if (!isInIframe) {\n try {\n if (typeof (window as any).__TAURI__ !== 'undefined') {\n const { invoke } = (window as any).__TAURI__.core as {\n invoke: <T>(cmd: string, args?: Record<string, unknown>) => Promise<T>;\n };\n\n // Try to get extension info from Tauri backend\n this._extensionInfo = await invoke<ExtensionInfo>(\"webview_extension_get_info\");\n this._context = await invoke<ApplicationContext>(\"webview_extension_context_get\");\n\n this.isNativeWindow = true;\n this.initialized = true;\n\n this.log(\"HaexHub SDK initialized in native WebViewWindow mode\");\n this.log(\"Extension info:\", this._extensionInfo);\n this.log(\"Application context:\", this._context);\n\n this.notifySubscribers();\n\n // Listen for context changes via Tauri events\n const { listen } = (window as any).__TAURI__.event as {\n listen: (event: string, handler: (event: any) => void) => Promise<() => void>;\n };\n\n console.log(\"[HaexSpace SDK] Setting up Tauri event listener for:\", HAEXTENSION_EVENTS.CONTEXT_CHANGED);\n\n try {\n await listen(HAEXTENSION_EVENTS.CONTEXT_CHANGED, (event: any) => {\n console.log(\"[HaexSpace SDK] Received Tauri event:\", HAEXTENSION_EVENTS.CONTEXT_CHANGED, event);\n this.log(\"Received context change event:\", event);\n if (event.payload?.context) {\n this._context = event.payload.context;\n console.log(\"[HaexSpace SDK] Updated context to:\", this._context);\n this.handleEvent({\n type: HAEXTENSION_EVENTS.CONTEXT_CHANGED,\n data: { context: this._context },\n timestamp: Date.now(),\n });\n } else {\n console.warn(\"[HaexSpace SDK] Event received but no context in payload:\", event);\n }\n });\n console.log(\"[HaexSpace SDK] Context change listener registered successfully\");\n } catch (error) {\n console.error(\"[HaexSpace SDK] Failed to setup context change listener:\", error);\n this.log(\"Failed to setup context change listener:\", error);\n }\n\n this.resolveReady();\n return;\n }\n } catch (error) {\n this.log(\"Tauri commands failed, falling back to iframe mode\", error);\n // Fall through to iframe mode\n }\n }\n\n // iframe mode (mobile/web)\n // At this point we should be in an iframe\n if (window.self === window.top) {\n throw new HaexHubError(ErrorCode.NOT_IN_IFRAME, \"errors.not_in_iframe\");\n }\n\n this.messageHandler = this.handleMessage.bind(this);\n window.addEventListener(\"message\", this.messageHandler);\n\n this.isNativeWindow = false;\n this.initialized = true;\n this.log(\"HaexSpace SDK initialized in iframe mode\");\n\n try {\n // Load extension info from manifest (if provided in config)\n if (this.config.manifest) {\n this._extensionInfo = {\n publicKey: this.config.manifest.publicKey,\n name: this.config.manifest.name,\n version: this.config.manifest.version,\n displayName: this.config.manifest.name,\n };\n this.log(\"Extension info loaded from manifest:\", this._extensionInfo);\n this.notifySubscribers();\n }\n\n // Debug: Check window.parent availability\n // Use alert on mobile to bypass console forwarding\n if (typeof window !== 'undefined' && window.parent) {\n const debugInfo = `SDK Debug:\\nwindow.parent exists: ${!!window.parent}\\nwindow.parent === window: ${window.parent === window}\\nwindow.self === window.top: ${window.self === window.top}`;\n try {\n // Try to send debug info via postMessage\n window.parent.postMessage({\n type: HAEXSPACE_MESSAGE_TYPES.DEBUG,\n data: debugInfo\n }, '*');\n } catch (e) {\n // Fallback to alert\n alert(debugInfo + `\\npostMessage error: ${e}`);\n }\n }\n\n // Request context from HaexHub - this also acts as a handshake\n this._context = await this.request<ApplicationContext>(HAEXTENSION_METHODS.context.get);\n this.log(\"Application context received:\", this._context);\n this.notifySubscribers();\n\n this.resolveReady();\n } catch (error) {\n this.log(\"Failed to load extension info or context:\", error);\n throw error;\n }\n }\n\n private handleMessage(event: MessageEvent): void {\n if (this.config.debug) {\n console.log(\"[SDK Debug] ========== Message Received ==========\");\n console.log(\"[SDK Debug] Event origin:\", event.origin);\n console.log(\n \"[SDK Debug] Event source:\",\n event.source === window.parent ? \"parent window\" : \"unknown\"\n );\n console.log(\"[SDK Debug] Event data:\", event.data);\n console.log(\"[SDK Debug] Extension info loaded:\", !!this._extensionInfo);\n console.log(\n \"[SDK Debug] Pending requests count:\",\n this.pendingRequests.size\n );\n }\n\n // Verify message comes from parent window (HaexHub)\n if (event.source !== window.parent) {\n if (this.config.debug) {\n console.error(\"[SDK Debug] ❌ REJECTED: Message not from parent window!\");\n }\n return;\n }\n\n const data = event.data as HaexHubResponse | HaexHubEvent;\n\n if (\"id\" in data && this.pendingRequests.has(data.id)) {\n if (this.config.debug) {\n console.log(\"[SDK Debug] ✅ Found pending request for ID:\", data.id);\n }\n const pending = this.pendingRequests.get(data.id)!;\n clearTimeout(pending.timeout);\n this.pendingRequests.delete(data.id);\n\n if (data.error) {\n if (this.config.debug) {\n console.error(\"[SDK Debug] ❌ Request failed:\", data.error);\n }\n pending.reject(data.error);\n } else {\n if (this.config.debug) {\n console.log(\"[SDK Debug] ✅ Request succeeded:\", data.result);\n }\n pending.resolve(data.result);\n }\n return;\n }\n\n if (\"id\" in data && !this.pendingRequests.has(data.id)) {\n if (this.config.debug) {\n console.warn(\n \"[SDK Debug] ⚠️ Received response for unknown request ID:\",\n data.id\n );\n console.warn(\n \"[SDK Debug] Known IDs:\",\n Array.from(this.pendingRequests.keys())\n );\n }\n }\n\n if (\"type\" in data && data.type) {\n if (this.config.debug) {\n console.log(\"[SDK Debug] Event received:\", data.type);\n }\n this.handleEvent(data as HaexHubEvent);\n }\n\n if (this.config.debug) {\n console.log(\"[SDK Debug] ========== End Message ==========\");\n }\n }\n\n private handleEvent(event: HaexHubEvent): void {\n if (event.type === HAEXTENSION_EVENTS.CONTEXT_CHANGED) {\n const contextEvent = event as ContextChangedEvent;\n this._context = contextEvent.data.context;\n this.log(\"Context updated:\", this._context);\n this.notifySubscribers();\n }\n\n this.emitEvent(event);\n }\n\n private emitEvent(event: HaexHubEvent): void {\n this.log(\"Event received:\", event);\n const listeners = this.eventListeners.get(event.type);\n if (listeners) {\n listeners.forEach((callback) => callback(event));\n }\n }\n\n private generateRequestId(): string {\n return `req_${++this.requestCounter}`;\n }\n\n private validatePublicKey(publicKey: string): void {\n if (\n !publicKey ||\n typeof publicKey !== \"string\" ||\n publicKey.trim() === \"\"\n ) {\n throw new HaexHubError(\n ErrorCode.INVALID_PUBLIC_KEY,\n \"errors.invalid_public_key\",\n { publicKey }\n );\n }\n }\n\n private validateExtensionName(extensionName: string): void {\n if (!extensionName || !/^[a-z][a-z0-9-]*$/i.test(extensionName)) {\n throw new HaexHubError(\n ErrorCode.INVALID_EXTENSION_NAME,\n \"errors.invalid_extension_name\",\n { extensionName }\n );\n }\n\n if (extensionName.includes(TABLE_SEPARATOR)) {\n throw new HaexHubError(\n ErrorCode.INVALID_EXTENSION_NAME,\n \"errors.extension_name_contains_separator\",\n { extensionName, separator: TABLE_SEPARATOR }\n );\n }\n }\n\n private validateTableName(tableName: string): void {\n if (!tableName || typeof tableName !== \"string\") {\n throw new HaexHubError(\n ErrorCode.INVALID_TABLE_NAME,\n \"errors.table_name_empty\"\n );\n }\n\n if (tableName.includes(TABLE_SEPARATOR)) {\n throw new HaexHubError(\n ErrorCode.INVALID_TABLE_NAME,\n \"errors.table_name_contains_separator\",\n { tableName, separator: TABLE_SEPARATOR }\n );\n }\n\n if (!/^[a-z][a-z0-9-_]*$/i.test(tableName)) {\n throw new HaexHubError(\n ErrorCode.INVALID_TABLE_NAME,\n \"errors.table_name_format\",\n { tableName }\n );\n }\n }\n\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log(\"[HaexSpace SDK]\", ...args);\n }\n }\n}\n","import { defineNuxtPlugin } from \"nuxt/app\";\nimport { shallowRef, type ShallowRef } from \"vue\";\nimport { HaexVaultClient } 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 HaexVaultClient({\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: HaexVaultClient;\n state: ShallowRef<{\n isReady: boolean;\n isSetupComplete: boolean;\n context: ApplicationContext | null;\n }>;\n};\n"]}