{"version":3,"sources":["../src/storage/db/index.ts"],"names":["DuckDBTimestampValue","DuckDBTimestampTZValue","MastraBase","DuckDBInstance","result","rows","columns"],"mappings":"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","file":"chunk-SMRZJTCI.cjs","sourcesContent":["import { DuckDBInstance, DuckDBTimestampValue, DuckDBTimestampTZValue } from '@duckdb/node-api';\nimport type { DuckDBPreparedStatement } from '@duckdb/node-api';\nimport { MastraBase } from '@mastra/core/base';\n\n/**\n * Bind a single parameter to a prepared statement using explicit typed methods.\n * This avoids the \"Cannot create values of type ANY\" error that occurs when\n * DuckDB cannot infer parameter types from SQL context (e.g. json_extract_string).\n */\nexport function bindParam(stmt: DuckDBPreparedStatement, index: number, value: unknown): void {\n  if (value === null || value === undefined) {\n    stmt.bindNull(index);\n  } else if (typeof value === 'string') {\n    stmt.bindVarchar(index, value);\n  } else if (typeof value === 'number') {\n    if (Number.isInteger(value) && value >= -2147483648 && value <= 2147483647) {\n      stmt.bindInteger(index, value);\n    } else {\n      stmt.bindDouble(index, value);\n    }\n  } else if (typeof value === 'boolean') {\n    stmt.bindBoolean(index, value);\n  } else if (typeof value === 'bigint') {\n    stmt.bindBigInt(index, value);\n  } else if (value instanceof Date) {\n    stmt.bindTimestamp(index, new DuckDBTimestampValue(BigInt(value.getTime()) * 1000n));\n  } else if (value instanceof DuckDBTimestampValue) {\n    stmt.bindTimestamp(index, value);\n  } else if (value instanceof DuckDBTimestampTZValue) {\n    stmt.bindTimestampTZ(index, value);\n  } else {\n    // Fallback: serialize to JSON string\n    stmt.bindVarchar(index, JSON.stringify(value));\n  }\n}\n\n/** Convert DuckDB-specific return types to plain JS types */\nfunction toJsValue(val: unknown): unknown {\n  if (val === null || val === undefined) return val;\n  // DuckDBTimestampValue → Date (micros since epoch)\n  if (val instanceof DuckDBTimestampValue) {\n    return new Date(Number(val.micros / 1000n));\n  }\n  // BigInt → Number (safe for values we care about)\n  if (typeof val === 'bigint') {\n    return Number(val);\n  }\n  return val;\n}\n\n/** Configuration for the DuckDB database connection. */\nexport interface DuckDBStorageConfig {\n  /** Path to the DuckDB file. Defaults to 'mastra.duckdb'. Use ':memory:' for ephemeral. */\n  path?: string;\n}\n\n/**\n * Shared DuckDB connection management for Mastra storage.\n * Defaults to a local file (`mastra.duckdb`) when no path is provided.\n * Pass `path: ':memory:'` for an ephemeral in-memory database.\n */\nexport class DuckDBConnection extends MastraBase {\n  private instance: DuckDBInstance | null = null;\n  private initialized = false;\n  private initPromise: Promise<void> | null = null;\n  private path: string;\n\n  constructor(config: DuckDBStorageConfig = {}) {\n    super({ component: 'STORAGE', name: 'DUCKDB' });\n    this.path = config.path ?? 'mastra.duckdb';\n  }\n\n  private async initialize(): Promise<void> {\n    if (this.initialized && this.instance) return;\n\n    if (this.initPromise) {\n      await this.initPromise;\n      if (this.instance) return;\n      this.initPromise = null;\n      this.initialized = false;\n    }\n\n    this.initPromise = (async () => {\n      try {\n        this.instance = await DuckDBInstance.create(this.path);\n        this.initialized = true;\n      } catch (error) {\n        this.instance = null;\n        this.initialized = false;\n        this.initPromise = null;\n        throw error;\n      }\n    })();\n\n    return this.initPromise;\n  }\n\n  /** Create a new connection to the DuckDB instance, initializing if needed. */\n  async getConnection() {\n    await this.initialize();\n    if (!this.instance) {\n      throw new Error('DuckDB instance not initialized');\n    }\n    return this.instance.connect();\n  }\n\n  private closeConnection(connection: unknown): void {\n    const conn = connection as {\n      closeSync?: () => void;\n      disconnectSync?: () => void;\n      close?: () => void;\n      disconnect?: () => void;\n    };\n    try {\n      if (typeof conn?.closeSync === 'function') {\n        conn.closeSync();\n        return;\n      }\n      if (typeof conn?.disconnectSync === 'function') {\n        conn.disconnectSync();\n        return;\n      }\n      if (typeof conn?.close === 'function') {\n        conn.close();\n        return;\n      }\n      if (typeof conn?.disconnect === 'function') {\n        conn.disconnect();\n      }\n    } catch {\n      // Ignore close failures to avoid masking query/execute errors.\n    }\n  }\n\n  /**\n   * Execute a SQL query and return results as objects.\n   */\n  async query<T = Record<string, unknown>>(sql: string, params: unknown[] = []): Promise<T[]> {\n    const connection = await this.getConnection();\n    try {\n      if (params.length === 0) {\n        const result = await connection.run(sql);\n        const rows = await result.getRows();\n        const columns = result.columnNames();\n        return rows.map(row => {\n          const obj: Record<string, unknown> = {};\n          columns.forEach((col, i) => {\n            obj[col] = toJsValue(row[i]);\n          });\n          return obj as T;\n        });\n      }\n\n      let paramIndex = 0;\n      const preparedSql = sql.replace(/\\?/g, () => `$${++paramIndex}`);\n      const stmt = await connection.prepare(preparedSql);\n      for (let i = 0; i < params.length; i++) {\n        bindParam(stmt, i + 1, params[i]);\n      }\n      const result = await stmt.run();\n      const rows = await result.getRows();\n      const columns = result.columnNames();\n      return rows.map(row => {\n        const obj: Record<string, unknown> = {};\n        columns.forEach((col, i) => {\n          obj[col] = toJsValue(row[i]);\n        });\n        return obj as T;\n      });\n    } finally {\n      this.closeConnection(connection);\n    }\n  }\n\n  /**\n   * Execute a SQL statement without returning results.\n   */\n  async execute(sql: string, params: unknown[] = []): Promise<void> {\n    const connection = await this.getConnection();\n    try {\n      if (params.length === 0) {\n        await connection.run(sql);\n        return;\n      }\n      let paramIndex = 0;\n      const preparedSql = sql.replace(/\\?/g, () => `$${++paramIndex}`);\n      const stmt = await connection.prepare(preparedSql);\n      for (let i = 0; i < params.length; i++) {\n        bindParam(stmt, i + 1, params[i]);\n      }\n      await stmt.run();\n    } finally {\n      this.closeConnection(connection);\n    }\n  }\n\n  /**\n   * Execute multiple SQL statements in order using a single DuckDB connection.\n   *\n   * This is intended for schema setup/migrations where statements have no\n   * parameters and must remain ordered, but opening a connection per statement\n   * would dominate initialization cost. Blank statements are skipped. Like\n   * calling execute() repeatedly, this does not wrap statements in a transaction,\n   * so prior statements can remain applied if a later statement fails.\n   */\n  async executeBatch(sqlStatements: readonly string[]): Promise<void> {\n    const statements = sqlStatements.map(statement => statement.trim()).filter(Boolean);\n    if (statements.length === 0) return;\n\n    const connection = await this.getConnection();\n    try {\n      const sql =\n        statements.map((statement, i) => `-- executeBatch statement ${i + 1}\\n${statement}`).join('\\n;\\n') + '\\n;';\n      await connection.run(sql);\n    } finally {\n      this.closeConnection(connection);\n    }\n  }\n\n  /**\n   * Escape a value for safe inline SQL use.\n   * DuckDB prepared statements can't handle NULL for parameters typed as ANY,\n   * so for complex INSERT/UPDATE operations we inline values safely.\n   */\n  static sqlValue(value: unknown): string {\n    if (value === null || value === undefined) return 'NULL';\n    if (typeof value === 'number') {\n      if (!Number.isFinite(value)) return 'NULL';\n      return String(value);\n    }\n    if (typeof value === 'boolean') return value ? 'TRUE' : 'FALSE';\n    if (value instanceof Date) return `'${value.toISOString()}'::TIMESTAMP`;\n    if (typeof value === 'string') return `'${value.replace(/'/g, \"''\")}'`;\n    // Objects/arrays → JSON string\n    return `'${JSON.stringify(value).replace(/'/g, \"''\")}'`;\n  }\n\n  /** Release the DuckDB instance, allowing garbage collection. */\n  async close(): Promise<void> {\n    if (this.instance) {\n      try {\n        const instance = this.instance as unknown as { closeSync?: () => void; close?: () => void };\n        if (typeof instance.closeSync === 'function') {\n          instance.closeSync();\n        } else if (typeof instance.close === 'function') {\n          instance.close();\n        }\n      } catch {\n        // Ignore close failures to allow cleanup of references.\n      }\n      this.instance = null;\n      this.initialized = false;\n      this.initPromise = null;\n    }\n  }\n}\n"]}