{"version":3,"sources":["../node_modules/tsup/assets/cjs_shims.js","../src/common/config/LogConfig.ts","../src/core/types/DatabaseTypes.ts","../src/common/constants/DatabaseConstants.ts","../src/common/config/DatabaseConfigValidator.ts","../src/common/config/DatabaseConfigMapper.ts","../src/common/config/ConfigManager.ts","../src/infra/MariaDBAdapter.ts","../src/infra/MySQLAdapter.ts","../src/infra/PostgreSQLAdapter.ts","../src/infra/DatabaseFactory.ts","../src/common/ssh/SSHTunnel.ts","../src/infra/DatabaseConnectionHandler.ts","../src/main.ts","../src/api/Application.ts","../src/api/parser/ArgumentParser.ts","../src/api/parser/UrlParser.ts","../src/api/display/ResultDisplay.ts","../src/api/display/HelpDisplay.ts","../src/core/CommandFactory.ts","../src/core/CommandRegistry.ts","../src/core/usecase/InfoCommand.ts","../src/core/BaseCommand.ts","../src/core/usecase/UsersCommand.ts","../src/core/usecase/DatabasesCommand.ts","../src/core/usecase/TablesCommand.ts","../src/core/usecase/TableInfoCommand.ts","../src/core/usecase/IndexCommand.ts","../src/core/usecase/InitCommand.ts","../src/api/FrontController.ts"],"sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () =>\n  typeof document === 'undefined'\n    ? new URL(`file:${__filename}`).href\n    : (document.currentScript && document.currentScript.src) ||\n      new URL('main.js', document.baseURI).href\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","import winston from \"winston\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\n\n/**\n * Load log configuration from config.json\n */\nfunction loadLogConfig(): { enable: boolean; level: string } {\n  const homeDir = os.homedir();\n  const mdbConfigPath = path.join(homeDir, \".mdb\", \"config.json\");\n\n  let configPath: string;\n\n  // Priority: ~/.mdb/config.json > ./config.json\n  if (fs.existsSync(mdbConfigPath)) {\n    configPath = mdbConfigPath;\n  } else {\n    // Default config if no file exists\n    return { enable: true, level: \"info\" };\n  }\n\n  try {\n    const configData = fs.readFileSync(configPath, \"utf8\");\n    const config = JSON.parse(configData);\n\n    // Require new nested format with log section\n    if (!config.log) {\n      throw new Error(\n        'Invalid config.json: missing \"log\" section. Expected nested format.',\n      );\n    }\n\n    return {\n      enable: config.log.enable ?? true,\n      level: config.log.level || \"info\",\n    };\n  } catch (error) {\n    // If config read fails, use default\n    console.error(\n      `Warning: Failed to load log config: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n    );\n    return { enable: true, level: \"info\" };\n  }\n}\n\n// Lazy load config to avoid build-time evaluation\nlet logConfig: { enable: boolean; level: string } | null = null;\n\nfunction getLogConfig(): { enable: boolean; level: string } {\n  if (!logConfig) {\n    logConfig = loadLogConfig();\n  }\n  return logConfig;\n}\n\n// Create logger with dynamic config getter\nconst logger = winston.createLogger({\n  format: winston.format.combine(\n    winston.format.timestamp({ format: \"YYYY-MM-DD HH:mm:ss\" }),\n    winston.format.printf(\n      ({ timestamp, level, message, ...meta }) =>\n        `${timestamp} [${level.toUpperCase()}]: ${message} ${\n          Object.keys(meta).length ? JSON.stringify(meta) : \"\"\n        }`,\n    ),\n  ),\n  transports: [new winston.transports.Console()],\n});\n\n// Update logger settings on first use\nlet initialized = false;\nfunction ensureInitialized() {\n  if (!initialized) {\n    const config = getLogConfig();\n    logger.silent = !config.enable;\n    logger.level = config.level;\n    initialized = true;\n  }\n}\n\n// Wrap logger methods to ensure initialization\nconst wrappedLogger = {\n  error: (...args: any[]) => {\n    ensureInitialized();\n    return logger.error(...args);\n  },\n  warn: (...args: any[]) => {\n    ensureInitialized();\n    return logger.warn(...args);\n  },\n  info: (...args: any[]) => {\n    ensureInitialized();\n    return logger.info(...args);\n  },\n  debug: (...args: any[]) => {\n    ensureInitialized();\n    return logger.debug(...args);\n  },\n};\n\nexport default wrappedLogger;\n","/**\n * Supported database types\n */\nexport enum DatabaseType {\n  MYSQL = \"mysql\",\n  MARIADB = \"mariadb\",\n  POSTGRESQL = \"postgresql\",\n}\n\nexport interface BaseDatabaseConfig {\n  type: DatabaseType;\n  host: string;\n  port?: number;\n  user: string;\n  password: string;\n  database: string;\n  charset?: string;\n  timezone?: string;\n}\n\nexport interface MariaDBConfig extends BaseDatabaseConfig {\n  type: DatabaseType.MARIADB;\n  acquireTimeout?: number;\n  timeout?: number;\n  reconnect?: boolean;\n  connectionLimit?: number;\n  acquireIncrement?: number;\n  idleTimeout?: number;\n  minimumIdle?: number;\n}\n\nexport interface MySQLConfig extends BaseDatabaseConfig {\n  type: DatabaseType.MYSQL;\n  connectionLimit?: number;\n  acquireTimeout?: number;\n  timeout?: number;\n  reconnect?: boolean;\n  queueLimit?: number;\n}\n\nexport interface PostgreSQLConfig extends BaseDatabaseConfig {\n  type: DatabaseType.POSTGRESQL;\n  max?: number;\n  idleTimeoutMillis?: number;\n  connectionTimeoutMillis?: number;\n  ssl?: boolean | object;\n  statement_timeout?: number;\n  query_timeout?: number;\n}\n\nexport interface DatabaseConnection {\n  query(sql: string, params?: any[]): Promise<any>;\n  release?(): Promise<void>;\n  end?(): Promise<void>;\n}\n\nexport interface DatabasePool {\n  getConnection(): Promise<DatabaseConnection>;\n  end(): Promise<void>;\n}\n\nexport type DatabaseConfig = MariaDBConfig | MySQLConfig | PostgreSQLConfig;\n\nexport interface DatabaseAdapter<T extends DatabaseConfig = DatabaseConfig> {\n  connect(config: T): Promise<DatabaseConnection>;\n  createPool(config: T): DatabasePool;\n}\n","/**\n * Database-related constants and enums for type safety and reusability\n */\n\nimport { DatabaseType } from \"../../core/types/DatabaseTypes\";\n\n/**\n * Default port numbers for each database type\n */\nexport const DEFAULT_PORTS: Record<DatabaseType, number> = {\n  [DatabaseType.MARIADB]: 3306,\n  [DatabaseType.MYSQL]: 3306,\n  [DatabaseType.POSTGRESQL]: 5432,\n};\n\n/**\n * Port number validation constants\n */\nexport const PORT_CONSTRAINTS = {\n  MIN: 1,\n  MAX: 65535,\n} as const;\n\n/**\n * Default timeout values (in milliseconds)\n */\nexport const DEFAULT_TIMEOUTS = {\n  ACQUIRE: 60000, // 60 seconds\n  QUERY: 60000, // 60 seconds\n  IDLE: 30000, // 30 seconds\n  CONNECTION: 2000, // 2 seconds\n} as const;\n\n/**\n * Default connection pool settings\n */\nexport const DEFAULT_POOL_SETTINGS = {\n  CONNECTION_LIMIT: 10,\n  MAX_CONNECTIONS: 10,\n  MIN_CONNECTIONS: 1,\n} as const;\n\n/**\n * Configuration file names and paths\n */\nexport const CONFIG_FILES = {\n  DEFAULT_NAME: \"config.json\",\n} as const;\n\n/**\n * Database type validation array (derived from enum)\n */\nexport const SUPPORTED_DATABASE_TYPES = Object.values(\n  DatabaseType,\n) as DatabaseType[];\n","import {\n  DatabaseConfig,\n  DatabaseType,\n  MariaDBConfig,\n  MySQLConfig,\n  PostgreSQLConfig,\n} from \"../../core/types/DatabaseTypes\";\nimport logger from \"./LogConfig\";\nimport { DEFAULT_POOL_SETTINGS } from \"../constants/DatabaseConstants\";\n\nexport interface DatabaseConfigValidator<T extends DatabaseConfig> {\n  supports(type: DatabaseType): boolean;\n  validate(config: T): boolean;\n}\n\nexport class MariaDBConfigValidator\n  implements DatabaseConfigValidator<MariaDBConfig>\n{\n  supports(type: DatabaseType): boolean {\n    return type === DatabaseType.MARIADB;\n  }\n\n  validate(config: MariaDBConfig): boolean {\n    if (config.acquireTimeout && config.acquireTimeout < 0) {\n      logger.error(\"❌ acquireTimeout must be positive\");\n      return false;\n    }\n    if (config.timeout && config.timeout < 0) {\n      logger.error(\"❌ timeout must be positive\");\n      return false;\n    }\n    return true;\n  }\n}\n\nexport class MySQLConfigValidator\n  implements DatabaseConfigValidator<MySQLConfig>\n{\n  supports(type: DatabaseType): boolean {\n    return type === DatabaseType.MYSQL;\n  }\n\n  validate(config: MySQLConfig): boolean {\n    if (\n      config.connectionLimit &&\n      config.connectionLimit < DEFAULT_POOL_SETTINGS.MIN_CONNECTIONS\n    ) {\n      logger.error(`❌ connectionLimit must be at least 1`);\n      return false;\n    }\n    return true;\n  }\n}\n\nexport class PostgreSQLValidator\n  implements DatabaseConfigValidator<PostgreSQLConfig>\n{\n  supports(type: DatabaseType): boolean {\n    return type === DatabaseType.POSTGRESQL;\n  }\n\n  validate(config: PostgreSQLConfig): boolean {\n    // PostgreSQL-specific validation\n    if (config.max && config.max < DEFAULT_POOL_SETTINGS.MIN_CONNECTIONS) {\n      logger.error(`❌ max pool size must be at least 1`);\n      return false;\n    }\n    return true;\n  }\n}\n","import { DatabaseConfig } from \"../../core/types/DatabaseTypes\";\nimport { DatabaseConfigFile } from \"../types/ConfigTypes\";\n\nexport class DatabaseConfigMapper {\n  /**\n   * Transform DatabaseConfigFile to DatabaseConfig\n   * Maps 'name' field to 'database' field and preserves all other properties\n   * @param fileConfig - Configuration from file\n   * @returns DatabaseConfig object\n   */\n  public transformDatabaseConfig(\n    fileConfig: DatabaseConfigFile,\n  ): DatabaseConfig {\n    const databaseConfig: any = {\n      type: fileConfig.type,\n      host: fileConfig.host,\n      user: fileConfig.user,\n      password: fileConfig.password,\n      database: fileConfig.name, // Map 'name' to 'database'\n    };\n\n    // Add optional base fields\n    if (fileConfig.port !== undefined) databaseConfig.port = fileConfig.port;\n    if (fileConfig.charset) databaseConfig.charset = fileConfig.charset;\n    if (fileConfig.timezone) databaseConfig.timezone = fileConfig.timezone;\n\n    // Add database-specific optional fields\n    if (fileConfig.acquireTimeout !== undefined)\n      databaseConfig.acquireTimeout = fileConfig.acquireTimeout;\n    if (fileConfig.timeout !== undefined)\n      databaseConfig.timeout = fileConfig.timeout;\n    if (fileConfig.reconnect !== undefined)\n      databaseConfig.reconnect = fileConfig.reconnect;\n    if (fileConfig.connectionLimit !== undefined)\n      databaseConfig.connectionLimit = fileConfig.connectionLimit;\n    if (fileConfig.acquireIncrement !== undefined)\n      databaseConfig.acquireIncrement = fileConfig.acquireIncrement;\n    if (fileConfig.idleTimeout !== undefined)\n      databaseConfig.idleTimeout = fileConfig.idleTimeout;\n    if (fileConfig.minimumIdle !== undefined)\n      databaseConfig.minimumIdle = fileConfig.minimumIdle;\n    if (fileConfig.queueLimit !== undefined)\n      databaseConfig.queueLimit = fileConfig.queueLimit;\n    if (fileConfig.max !== undefined) databaseConfig.max = fileConfig.max;\n    if (fileConfig.idleTimeoutMillis !== undefined)\n      databaseConfig.idleTimeoutMillis = fileConfig.idleTimeoutMillis;\n    if (fileConfig.connectionTimeoutMillis !== undefined)\n      databaseConfig.connectionTimeoutMillis =\n        fileConfig.connectionTimeoutMillis;\n    if (fileConfig.ssl !== undefined) databaseConfig.ssl = fileConfig.ssl;\n    if (fileConfig.statement_timeout !== undefined)\n      databaseConfig.statement_timeout = fileConfig.statement_timeout;\n    if (fileConfig.query_timeout !== undefined)\n      databaseConfig.query_timeout = fileConfig.query_timeout;\n\n    return databaseConfig as DatabaseConfig;\n  }\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport { DatabaseConfig, DatabaseType } from \"../../core/types/DatabaseTypes\";\nimport {\n  PORT_CONSTRAINTS,\n  CONFIG_FILES,\n  SUPPORTED_DATABASE_TYPES,\n} from \"../constants/DatabaseConstants\";\nimport logger from \"./LogConfig\";\nimport {\n  DatabaseConfigValidator,\n  MariaDBConfigValidator,\n  MySQLConfigValidator,\n  PostgreSQLValidator,\n} from \"./DatabaseConfigValidator\";\nimport { DatabaseConfigMapper } from \"./DatabaseConfigMapper\";\nimport { ApplicationConfig } from \"../types/ConfigTypes\";\n\nexport class ConfigManager {\n  private defaultConfigPath: string;\n  private supportedTypes: DatabaseType[] = SUPPORTED_DATABASE_TYPES;\n\n  private validators: DatabaseConfigValidator<DatabaseConfig>[];\n  private readonly databaseConfigManager: DatabaseConfigMapper =\n    new DatabaseConfigMapper();\n\n  constructor() {\n    // Use ~/.mdb/config.json as the primary config location\n    const homeDir = os.homedir();\n    const mdbConfigPath = path.join(homeDir, \".mdb\", CONFIG_FILES.DEFAULT_NAME);\n\n    // Fallback to current working directory for backward compatibility\n    const cwd = process.cwd();\n    const cwdConfigPath = path.join(cwd, CONFIG_FILES.DEFAULT_NAME);\n\n    // Fallback to package directory for library usage\n    const packageConfigPath = path.join(\n      __dirname,\n      \"..\",\n      \"..\",\n      CONFIG_FILES.DEFAULT_NAME,\n    );\n\n    this.validators = [\n      new MariaDBConfigValidator(),\n      new MySQLConfigValidator(),\n      new PostgreSQLValidator(),\n    ];\n\n    // Priority: ~/.mdb/config.json > ./config.json > package/config.json\n    if (fs.existsSync(mdbConfigPath)) {\n      this.defaultConfigPath = mdbConfigPath;\n    } else if (fs.existsSync(cwdConfigPath)) {\n      this.defaultConfigPath = cwdConfigPath;\n    } else {\n      this.defaultConfigPath = packageConfigPath;\n    }\n  }\n\n  /**\n   * Get database configuration from provided config or fallback to config.json\n   * @param providedConfig - Database configuration object\n   * @returns Database configuration\n   */\n  public getConfig(providedConfig?: DatabaseConfig | null): DatabaseConfig {\n    if (providedConfig && this.validateConfig(providedConfig)) {\n      logger.info(\"📋 Using provided database configuration\");\n      return providedConfig;\n    }\n\n    if (!providedConfig) {\n      logger.info(\"📋 No configuration provided, reading from config.json\");\n    } else {\n      logger.info(\n        \"⚠️  Provided configuration invalid, falling back to config.json\",\n      );\n    }\n\n    return this.loadConfigFromFile();\n  }\n\n  /**\n   * Load configuration from config.json file\n   * @returns Database configuration\n   */\n  private loadConfigFromFile(): DatabaseConfig {\n    try {\n      if (!fs.existsSync(this.defaultConfigPath)) {\n        throw new Error(\n          `Configuration file not found: ${this.defaultConfigPath}`,\n        );\n      }\n\n      const configData = fs.readFileSync(this.defaultConfigPath, \"utf8\");\n      const fileConfig = JSON.parse(configData);\n\n      // Require new nested structure with database section\n      if (!fileConfig.database || typeof fileConfig.database !== \"object\") {\n        throw new Error(\n          'Invalid config.json: missing \"database\" section. Expected nested format with log, ssh, and database sections.',\n        );\n      }\n\n      const appConfig = fileConfig as ApplicationConfig;\n      const databaseConfig = this.databaseConfigManager.transformDatabaseConfig(\n        appConfig.database,\n      );\n\n      if (!this.validateConfig(databaseConfig)) {\n        throw new Error(\"Invalid configuration in config.json\");\n      }\n\n      logger.info(`✅ Configuration loaded from ${this.defaultConfigPath}`);\n\n      return databaseConfig;\n    } catch (error) {\n      logger.error(\n        `❌ Failed to load configuration:`,\n        (error as Error).message,\n      );\n      throw error;\n    }\n  }\n\n  /**\n   * Validate database configuration object\n   * @param config - Configuration to validate\n   * @returns True if valid\n   */\n  public validateConfig(config: any): config is DatabaseConfig {\n    if (!config || typeof config !== \"object\") {\n      logger.error(\"❌ Configuration must be an object\");\n      return false;\n    }\n\n    const requiredFields: (keyof DatabaseConfig)[] = [\n      \"type\",\n      \"host\",\n      \"user\",\n      \"database\",\n    ];\n\n    for (const field of requiredFields) {\n      if (!config[field]) {\n        logger.error(`❌ Missing required field: ${field}`);\n        return false;\n      }\n    }\n\n    if (!this.supportedTypes.includes(config.type)) {\n      logger.error(\n        `❌ Unsupported database type: ${config.type}. Supported types: ${this.supportedTypes.join(\", \")}`,\n      );\n      return false;\n    }\n\n    // Validate port if provided\n    if (\n      config.port &&\n      (isNaN(config.port) ||\n        config.port < PORT_CONSTRAINTS.MIN ||\n        config.port > PORT_CONSTRAINTS.MAX)\n    ) {\n      logger.error(\"❌ Invalid port number\");\n      return false;\n    }\n\n    // Type-specific validation\n    if (!this.validateTypeSpecificConfig(config)) {\n      return false;\n    }\n\n    logger.info(\n      `✅ Configuration validation passed for ${config.type} database`,\n    );\n    return true;\n  }\n\n  /**\n   * Validate type-specific configuration\n   * @param config - Configuration to validate\n   * @returns True if valid\n   */\n  private validateTypeSpecificConfig(config: DatabaseConfig): boolean {\n    const validator = this.validators.find((v) => v.supports(config.type));\n    if (!validator) {\n      logger.error(`❌ No validator found for type ${config.type}`);\n      return false;\n    }\n    return validator.validate(config);\n  }\n}\n","import * as mariadb from \"mariadb\";\nimport {\n  DatabaseAdapter,\n  DatabaseConnection,\n  DatabasePool,\n  MariaDBConfig,\n} from \"../core/types/DatabaseTypes\";\nimport { DatabaseOperations } from \"../core/types/DatabaseOperations\";\nimport {\n  UserInfo,\n  DatabaseList,\n  IndexInfo,\n  DatabaseInfo,\n  TableInfo,\n  TableSchemaInfo,\n  ColumnInfo,\n  ForeignKeyInfo,\n  UniqueConstraintInfo,\n  PrimaryKeyInfo,\n} from \"../core/types/CliTypes\";\nimport logger from \"../common/config/LogConfig\";\n\nexport class MariaDBConnection\n  implements DatabaseConnection, DatabaseOperations\n{\n  constructor(private connection: mariadb.Connection) {}\n\n  // ==================== Basic Query Operations ====================\n\n  async query(sql: string, params?: any[]): Promise<any> {\n    try {\n      return await this.connection.query(sql, params);\n    } catch (error) {\n      logger.error(\"❌ MariaDB query failed:\", (error as Error).message);\n      throw error;\n    }\n  }\n\n  async release(): Promise<void> {\n    try {\n      if (\n        this.connection &&\n        typeof (this.connection as any).release === \"function\"\n      ) {\n        await (this.connection as any).release();\n      }\n    } catch (error) {\n      logger.error(\n        \"❌ Failed to release MariaDB connection:\",\n        (error as Error).message,\n      );\n      throw error;\n    }\n  }\n\n  async end(): Promise<void> {\n    try {\n      await this.connection.end();\n    } catch (error) {\n      logger.error(\n        \"❌ Failed to end MariaDB connection:\",\n        (error as Error).message,\n      );\n      throw error;\n    }\n  }\n\n  // ==================== User Management Operations ====================\n\n  async getUsers(): Promise<UserInfo[]> {\n    // Check available columns first to ensure compatibility\n    const availableColumns = await this.getAvailableUserColumns();\n\n    // Build query based on available columns\n    const columns = [\"User as user\", \"Host as host\"];\n\n    if (availableColumns.includes(\"password_expired\")) {\n      columns.push(\"password_expired\");\n    }\n\n    if (availableColumns.includes(\"account_locked\")) {\n      columns.push(\"account_locked\");\n    }\n\n    const usersQuery = `\n      SELECT ${columns.join(\", \")}\n      FROM mysql.user\n      ORDER BY User, Host\n    `;\n\n    const users = await this.query(usersQuery);\n    const userInfos: UserInfo[] = [];\n\n    for (const user of users) {\n      // Get privileges for each user\n      const privilegesQuery = `SHOW GRANTS FOR '${user.user}'@'${user.host}'`;\n\n      try {\n        const grants = await this.query(privilegesQuery);\n        const privileges = grants\n          .map((grant: any) => {\n            const grantValue = Object.values(grant)[0] as string;\n            return this.parseGrantStatement(grantValue);\n          })\n          .flat();\n\n        userInfos.push({\n          user: user.user,\n          host: user.host,\n          privileges: Array.from(new Set(privileges)),\n          password_expired:\n            user.password_expired !== undefined\n              ? user.password_expired === \"Y\"\n              : false,\n          account_locked:\n            user.account_locked !== undefined\n              ? user.account_locked === \"Y\"\n              : false,\n        });\n      } catch (_error) {\n        userInfos.push({\n          user: user.user,\n          host: user.host,\n          privileges: [\"USAGE\"],\n          password_expired:\n            user.password_expired !== undefined\n              ? user.password_expired === \"Y\"\n              : false,\n          account_locked:\n            user.account_locked !== undefined\n              ? user.account_locked === \"Y\"\n              : false,\n        });\n      }\n    }\n\n    return userInfos;\n  }\n\n  private async getAvailableUserColumns(): Promise<string[]> {\n    try {\n      const columnsQuery = `\n        SELECT COLUMN_NAME\n        FROM INFORMATION_SCHEMA.COLUMNS\n        WHERE TABLE_SCHEMA = 'mysql' AND TABLE_NAME = 'user'\n      `;\n\n      const result = await this.query(columnsQuery);\n      return result.map((row: any) => row.COLUMN_NAME);\n    } catch (_error) {\n      logger.warn(\"⚠️  Could not detect available columns, using basic set\");\n      return [\"User\", \"Host\"];\n    }\n  }\n\n  private parseGrantStatement(grantStatement: string): string[] {\n    const privileges: string[] = [];\n    const match = grantStatement.match(/GRANT\\s+(.+?)\\s+ON/i);\n\n    if (match) {\n      const privPart = match[1];\n      if (privPart.toUpperCase().includes(\"ALL PRIVILEGES\")) {\n        return [\"ALL PRIVILEGES\"];\n      }\n      const privs = privPart.split(\",\").map((p) => p.trim().toUpperCase());\n      privileges.push(...privs);\n    }\n\n    return privileges;\n  }\n\n  // ==================== Database Management Operations ====================\n\n  async getDatabases(): Promise<DatabaseList[]> {\n    const query = `\n      SELECT\n        SCHEMA_NAME as database_name,\n        DEFAULT_CHARACTER_SET_NAME as default_character_set,\n        DEFAULT_COLLATION_NAME as default_collation\n      FROM information_schema.SCHEMATA\n      WHERE SCHEMA_NAME NOT IN ('information_schema', 'performance_schema', 'mysql', 'sys')\n      ORDER BY SCHEMA_NAME\n    `;\n\n    const result = await this.query(query);\n\n    return result.map((row: any) => ({\n      database_name: row.database_name,\n      default_character_set: row.default_character_set,\n      default_collation: row.default_collation,\n    }));\n  }\n\n  async getDatabaseInfo(): Promise<DatabaseInfo> {\n    const queries = {\n      version: \"SELECT VERSION() as version\",\n      serverName: \"SELECT @@hostname as server_name\",\n      charset: \"SELECT @@character_set_server as character_set\",\n      collation: \"SELECT @@collation_server as collation\",\n      timezone: \"SELECT @@time_zone as timezone\",\n      maxConnections: \"SELECT @@max_connections as max_connections\",\n      uptime: \"SHOW GLOBAL STATUS LIKE 'Uptime'\",\n      threads: \"SHOW GLOBAL STATUS LIKE 'Threads_connected'\",\n      defaultEngine: \"SELECT @@default_storage_engine as default_engine\",\n      totalSize: `\n        SELECT ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) as total_size_mb\n        FROM information_schema.TABLES\n      `,\n    };\n\n    const [\n      version,\n      serverName,\n      charset,\n      collation,\n      timezone,\n      maxConnections,\n      uptime,\n      threads,\n      defaultEngine,\n      totalSize,\n    ] = await Promise.all([\n      this.query(queries.version),\n      this.query(queries.serverName),\n      this.query(queries.charset),\n      this.query(queries.collation),\n      this.query(queries.timezone),\n      this.query(queries.maxConnections),\n      this.query(queries.uptime),\n      this.query(queries.threads),\n      this.query(queries.defaultEngine),\n      this.query(queries.totalSize),\n    ]);\n\n    return {\n      version: version[0]?.version || \"Unknown\",\n      server_name: serverName[0]?.server_name || \"Unknown\",\n      character_set: charset[0]?.character_set || \"Unknown\",\n      collation: collation[0]?.collation || \"Unknown\",\n      timezone: timezone[0]?.timezone || \"Unknown\",\n      max_connections: parseInt(maxConnections[0]?.max_connections) || 0,\n      uptime_sec: parseInt(uptime[0]?.Value) || 0,\n      threads_connected: parseInt(threads[0]?.Value) || 0,\n      default_engine: defaultEngine[0]?.default_engine || \"Unknown\",\n      total_db_size_mb: parseFloat(totalSize[0]?.total_size_mb) || 0,\n    };\n  }\n\n  // ==================== Table Operations ====================\n\n  async getTables(databaseName: string): Promise<string[]> {\n    const query = `\n      SELECT TABLE_NAME as table_name\n      FROM information_schema.TABLES\n      WHERE TABLE_SCHEMA = ?\n        AND TABLE_TYPE = 'BASE TABLE'\n      ORDER BY TABLE_NAME\n    `;\n\n    const result = await this.query(query, [databaseName]);\n    return result.map((row: any) => row.table_name);\n  }\n\n  async getTablesWithDetails(databaseName: string): Promise<TableInfo[]> {\n    const query = `\n      SELECT\n        t.TABLE_NAME as table_name,\n        t.TABLE_TYPE as table_type,\n        t.ENGINE as engine,\n        COALESCE(t.TABLE_ROWS, 0) as \\`rows\\`,\n        COALESCE(t.DATA_LENGTH, 0) as data_length,\n        COALESCE(t.INDEX_LENGTH, 0) as index_length,\n        t.AUTO_INCREMENT as auto_increment,\n        t.CREATE_TIME as create_time,\n        t.UPDATE_TIME as update_time,\n        t.TABLE_COMMENT as table_comment,\n        (\n          SELECT GROUP_CONCAT(k.COLUMN_NAME ORDER BY k.ORDINAL_POSITION SEPARATOR ', ')\n          FROM information_schema.KEY_COLUMN_USAGE k\n          WHERE k.TABLE_SCHEMA = t.TABLE_SCHEMA\n            AND k.TABLE_NAME = t.TABLE_NAME\n            AND k.CONSTRAINT_NAME = 'PRIMARY'\n        ) as primary_keys\n      FROM information_schema.TABLES t\n      WHERE t.TABLE_SCHEMA = ?\n        AND t.TABLE_TYPE = 'BASE TABLE'\n      ORDER BY t.TABLE_NAME\n    `;\n\n    const result = await this.query(query, [databaseName]);\n\n    return result.map((row: any) => ({\n      table_name: row.table_name,\n      table_type: row.table_type,\n      engine: row.engine || \"Unknown\",\n      rows: parseInt(row.rows) || 0,\n      data_length: parseInt(row.data_length) || 0,\n      index_length: parseInt(row.index_length) || 0,\n      auto_increment: row.auto_increment\n        ? parseInt(row.auto_increment)\n        : undefined,\n      create_time: row.create_time\n        ? new Date(row.create_time).toISOString()\n        : \"\",\n      update_time: row.update_time\n        ? new Date(row.update_time).toISOString()\n        : undefined,\n      table_comment: row.table_comment || \"\",\n      primary_keys: row.primary_keys || null,\n    }));\n  }\n\n  async getTableInfo(tableName: string): Promise<TableSchemaInfo> {\n    // Get column information\n    const columnsQuery = `\n      SELECT\n        COLUMN_NAME as column_name,\n        DATA_TYPE as data_type,\n        IS_NULLABLE as is_nullable,\n        COLUMN_DEFAULT as column_default,\n        COLUMN_KEY as column_key,\n        EXTRA as extra,\n        COLUMN_COMMENT as column_comment,\n        CHARACTER_MAXIMUM_LENGTH as character_maximum_length,\n        NUMERIC_PRECISION as numeric_precision,\n        NUMERIC_SCALE as numeric_scale\n      FROM information_schema.COLUMNS\n      WHERE TABLE_SCHEMA = DATABASE()\n        AND TABLE_NAME = ?\n      ORDER BY ORDINAL_POSITION\n    `;\n\n    // Get foreign key constraints\n    const fkQuery = `\n      SELECT\n        kcu.CONSTRAINT_NAME as constraint_name,\n        kcu.COLUMN_NAME as column_name,\n        kcu.REFERENCED_TABLE_NAME as referenced_table_name,\n        kcu.REFERENCED_COLUMN_NAME as referenced_column_name,\n        rc.UPDATE_RULE as update_rule,\n        rc.DELETE_RULE as delete_rule\n      FROM information_schema.KEY_COLUMN_USAGE kcu\n      INNER JOIN information_schema.REFERENTIAL_CONSTRAINTS rc\n        ON kcu.CONSTRAINT_NAME = rc.CONSTRAINT_NAME\n        AND kcu.CONSTRAINT_SCHEMA = rc.CONSTRAINT_SCHEMA\n      WHERE kcu.TABLE_SCHEMA = DATABASE()\n        AND kcu.TABLE_NAME = ?\n        AND kcu.REFERENCED_TABLE_NAME IS NOT NULL\n      ORDER BY kcu.ORDINAL_POSITION\n    `;\n\n    // Get unique constraints (excluding primary key)\n    const uniqueQuery = `\n      SELECT\n        tc.CONSTRAINT_NAME as constraint_name,\n        GROUP_CONCAT(kcu.COLUMN_NAME ORDER BY kcu.ORDINAL_POSITION) as column_names\n      FROM information_schema.TABLE_CONSTRAINTS tc\n      INNER JOIN information_schema.KEY_COLUMN_USAGE kcu\n        ON tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME\n        AND tc.TABLE_SCHEMA = kcu.TABLE_SCHEMA\n        AND tc.TABLE_NAME = kcu.TABLE_NAME\n      WHERE tc.TABLE_SCHEMA = DATABASE()\n        AND tc.TABLE_NAME = ?\n        AND tc.CONSTRAINT_TYPE = 'UNIQUE'\n      GROUP BY tc.CONSTRAINT_NAME\n    `;\n\n    // Get primary key information with auto_increment value\n    const pkQuery = `\n      SELECT\n        tc.CONSTRAINT_NAME as constraint_name,\n        GROUP_CONCAT(kcu.COLUMN_NAME ORDER BY kcu.ORDINAL_POSITION) as column_names,\n        t.AUTO_INCREMENT as auto_increment_value\n      FROM information_schema.TABLE_CONSTRAINTS tc\n      INNER JOIN information_schema.KEY_COLUMN_USAGE kcu\n        ON tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME\n        AND tc.TABLE_SCHEMA = kcu.TABLE_SCHEMA\n        AND tc.TABLE_NAME = kcu.TABLE_NAME\n      INNER JOIN information_schema.TABLES t\n        ON t.TABLE_SCHEMA = tc.TABLE_SCHEMA\n        AND t.TABLE_NAME = tc.TABLE_NAME\n      WHERE tc.TABLE_SCHEMA = DATABASE()\n        AND tc.TABLE_NAME = ?\n        AND tc.CONSTRAINT_TYPE = 'PRIMARY KEY'\n      GROUP BY tc.CONSTRAINT_NAME, t.AUTO_INCREMENT\n    `;\n\n    // Get all indexes (including PRIMARY)\n    const [columnsResult, fkResult, uniqueResult, pkResult, indexesResult] =\n      await Promise.all([\n        this.query(columnsQuery, [tableName]),\n        this.query(fkQuery, [tableName]),\n        this.query(uniqueQuery, [tableName]),\n        this.query(pkQuery, [tableName]),\n        this.getIndexes(tableName, true), // includeAll = true to get all indexes\n      ]);\n\n    const columns: ColumnInfo[] = columnsResult.map((row: any) => ({\n      column_name: row.column_name,\n      data_type: row.data_type,\n      is_nullable: row.is_nullable,\n      column_default: row.column_default,\n      column_key: row.column_key,\n      extra: row.extra,\n      column_comment: row.column_comment || undefined,\n      character_maximum_length: row.character_maximum_length\n        ? Number(row.character_maximum_length)\n        : null,\n      numeric_precision: row.numeric_precision\n        ? Number(row.numeric_precision)\n        : null,\n      numeric_scale: row.numeric_scale ? Number(row.numeric_scale) : null,\n    }));\n\n    const foreign_keys: ForeignKeyInfo[] = fkResult.map((row: any) => ({\n      constraint_name: row.constraint_name,\n      column_name: row.column_name,\n      referenced_table_name: row.referenced_table_name,\n      referenced_column_name: row.referenced_column_name,\n      update_rule: row.update_rule,\n      delete_rule: row.delete_rule,\n    }));\n\n    const unique_constraints: UniqueConstraintInfo[] = uniqueResult.map(\n      (row: any) => ({\n        constraint_name: row.constraint_name,\n        column_names: row.column_names.split(\",\"),\n      }),\n    );\n\n    let primary_key: PrimaryKeyInfo | undefined;\n    if (pkResult.length > 0) {\n      const pkRow = pkResult[0];\n      const pkColumns = pkRow.column_names.split(\",\");\n      const hasAutoIncrement = columns.some(\n        (col) =>\n          pkColumns.includes(col.column_name) &&\n          col.extra.toLowerCase().includes(\"auto_increment\"),\n      );\n\n      primary_key = {\n        constraint_name: pkRow.constraint_name,\n        column_names: pkColumns,\n        has_auto_increment: hasAutoIncrement,\n        auto_increment_value: pkRow.auto_increment_value\n          ? Number(pkRow.auto_increment_value)\n          : undefined,\n      };\n    }\n\n    return {\n      table_name: tableName,\n      columns,\n      primary_key,\n      foreign_keys,\n      unique_constraints,\n      indexes: indexesResult,\n    };\n  }\n\n  async getTableMetadata(tableName: string): Promise<TableInfo> {\n    const query = `\n      SELECT\n        TABLE_NAME as table_name,\n        TABLE_TYPE as table_type,\n        ENGINE as engine,\n        TABLE_ROWS as \\`rows\\`,\n        DATA_LENGTH as data_length,\n        INDEX_LENGTH as index_length,\n        AUTO_INCREMENT as auto_increment,\n        CREATE_TIME as create_time,\n        UPDATE_TIME as update_time,\n        TABLE_COMMENT as table_comment\n      FROM information_schema.TABLES\n      WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?\n    `;\n\n    const result = await this.query(query, [tableName]);\n\n    if (!result || result.length === 0) {\n      throw new Error(`Table '${tableName}' not found`);\n    }\n\n    const row = result[0];\n    return {\n      table_name: row.table_name,\n      table_type: row.table_type,\n      engine: row.engine || \"Unknown\",\n      rows: parseInt(row.rows) || 0,\n      data_length: parseInt(row.data_length) || 0,\n      index_length: parseInt(row.index_length) || 0,\n      auto_increment: row.auto_increment\n        ? parseInt(row.auto_increment)\n        : undefined,\n      create_time: row.create_time ? row.create_time.toISOString() : \"Unknown\",\n      update_time: row.update_time ? row.update_time.toISOString() : undefined,\n      table_comment: row.table_comment || \"\",\n    };\n  }\n\n  // ==================== Index Operations ====================\n\n  async getIndexes(\n    tableName?: string,\n    includeAll: boolean = false,\n  ): Promise<IndexInfo[]> {\n    let query = `\n      SELECT\n        TABLE_NAME as table_name,\n        INDEX_NAME as index_name,\n        COLUMN_NAME as column_name,\n        NON_UNIQUE as non_unique,\n        SEQ_IN_INDEX as seq_in_index,\n        INDEX_TYPE as index_type,\n        COMMENT as comment\n      FROM information_schema.STATISTICS\n      WHERE TABLE_SCHEMA = DATABASE()\n    `;\n\n    const params: any[] = [];\n    if (tableName) {\n      query += \" AND TABLE_NAME = ?\";\n      params.push(tableName);\n    }\n\n    // Exclude PRIMARY key index by default\n    if (!includeAll) {\n      query += \" AND INDEX_NAME != 'PRIMARY'\";\n    }\n\n    query += \" ORDER BY TABLE_NAME, INDEX_NAME, SEQ_IN_INDEX\";\n\n    const result = await this.query(query, params);\n\n    return result.map((row: any) => ({\n      table_name: row.table_name,\n      index_name: row.index_name,\n      column_name: row.column_name,\n      index_type: row.index_type,\n      unique: row.non_unique !== 1,\n      nullable: false,\n      cardinality: 0,\n      sequence_in_index: row.seq_in_index,\n    }));\n  }\n}\n\nexport class MariaDBPool implements DatabasePool {\n  constructor(private pool: mariadb.Pool) {}\n\n  async getConnection(): Promise<DatabaseConnection> {\n    try {\n      const connection = await this.pool.getConnection();\n      return new MariaDBConnection(connection);\n    } catch (error) {\n      logger.error(\n        \"❌ Failed to get MariaDB connection from pool:\",\n        (error as Error).message,\n      );\n      throw error;\n    }\n  }\n\n  async end(): Promise<void> {\n    try {\n      await this.pool.end();\n    } catch (error) {\n      console.error(\"❌ Failed to end MariaDB pool:\", (error as Error).message);\n      throw error;\n    }\n  }\n}\n\nexport class MariaDBAdapter implements DatabaseAdapter<MariaDBConfig> {\n  async connect(config: MariaDBConfig): Promise<DatabaseConnection> {\n    logger.info(\"🚀 Connecting to MariaDB...\");\n\n    try {\n      const connectionConfig = this.buildConnectionConfig(config);\n      const connection = await mariadb.createConnection(connectionConfig);\n\n      // Test connection\n      await connection.query(\"SELECT 1 as test\");\n      logger.info(\"✅ MariaDB connection successful!\");\n\n      return new MariaDBConnection(connection);\n    } catch (error) {\n      logger.error(\"❌ MariaDB connection failed:\", (error as Error).message);\n      throw error;\n    }\n  }\n\n  createPool(config: MariaDBConfig): DatabasePool {\n    logger.info(\"🚀 Creating MariaDB connection pool...\");\n\n    try {\n      const poolConfig = this.buildConnectionConfig(config);\n      const pool = mariadb.createPool(poolConfig);\n\n      logger.info(\"✅ MariaDB pool created successfully!\");\n      return new MariaDBPool(pool);\n    } catch (error) {\n      logger.error(\n        \"❌ MariaDB pool creation failed:\",\n        (error as Error).message,\n      );\n      throw error;\n    }\n  }\n\n  private buildConnectionConfig(config: MariaDBConfig): mariadb.PoolConfig {\n    return {\n      host: config.host,\n      port: config.port || 3306,\n      user: config.user,\n      password: config.password,\n      database: config.database,\n      acquireTimeout: config.acquireTimeout || 60000,\n      connectionLimit: config.connectionLimit || 10,\n    };\n  }\n}\n","import * as mysql from \"mysql2/promise\";\nimport {\n  DatabaseAdapter,\n  DatabaseConnection,\n  DatabasePool,\n  MySQLConfig,\n} from \"../core/types/DatabaseTypes\";\nimport { DatabaseOperations } from \"../core/types/DatabaseOperations\";\nimport {\n  UserInfo,\n  DatabaseList,\n  IndexInfo,\n  DatabaseInfo,\n  TableInfo,\n  TableSchemaInfo,\n  ColumnInfo,\n  ForeignKeyInfo,\n  UniqueConstraintInfo,\n  PrimaryKeyInfo,\n} from \"../core/types/CliTypes\";\nimport logger from \"../common/config/LogConfig\";\n\n/**\n * Base class with shared operation logic for MySQL connections\n */\nabstract class MySQLConnectionBase\n  implements DatabaseConnection, DatabaseOperations\n{\n  protected abstract executeQuery(sql: string, params?: any[]): Promise<any>;\n\n  async query(sql: string, params?: any[]): Promise<any> {\n    return this.executeQuery(sql, params);\n  }\n\n  // ==================== User Management Operations ====================\n\n  async getUsers(): Promise<UserInfo[]> {\n    const availableColumns = await this.getAvailableUserColumns();\n    const columns = [\"User as user\", \"Host as host\"];\n\n    if (availableColumns.includes(\"password_expired\"))\n      columns.push(\"password_expired\");\n    if (availableColumns.includes(\"account_locked\"))\n      columns.push(\"account_locked\");\n\n    const usersQuery = `SELECT ${columns.join(\", \")} FROM mysql.user ORDER BY User, Host`;\n    const users = await this.query(usersQuery);\n    const userInfos: UserInfo[] = [];\n\n    for (const user of users) {\n      const privilegesQuery = `SHOW GRANTS FOR '${user.user}'@'${user.host}'`;\n      try {\n        const grants = await this.query(privilegesQuery);\n        const privileges = grants\n          .map((grant: any) => {\n            const grantValue = Object.values(grant)[0] as string;\n            return this.parseGrantStatement(grantValue);\n          })\n          .flat();\n\n        userInfos.push({\n          user: user.user,\n          host: user.host,\n          privileges: Array.from(new Set(privileges)),\n          password_expired:\n            user.password_expired !== undefined\n              ? user.password_expired === \"Y\"\n              : false,\n          account_locked:\n            user.account_locked !== undefined\n              ? user.account_locked === \"Y\"\n              : false,\n        });\n      } catch (_error) {\n        userInfos.push({\n          user: user.user,\n          host: user.host,\n          privileges: [\"USAGE\"],\n          password_expired:\n            user.password_expired !== undefined\n              ? user.password_expired === \"Y\"\n              : false,\n          account_locked:\n            user.account_locked !== undefined\n              ? user.account_locked === \"Y\"\n              : false,\n        });\n      }\n    }\n    return userInfos;\n  }\n\n  private async getAvailableUserColumns(): Promise<string[]> {\n    try {\n      const columnsQuery = `\n        SELECT COLUMN_NAME\n        FROM INFORMATION_SCHEMA.COLUMNS\n        WHERE TABLE_SCHEMA = 'mysql' AND TABLE_NAME = 'user'\n      `;\n      const result = await this.query(columnsQuery);\n      return result.map((row: any) => row.COLUMN_NAME);\n    } catch (_error) {\n      logger.warn(\"⚠️  Could not detect available columns, using basic set\");\n      return [\"User\", \"Host\"];\n    }\n  }\n\n  private parseGrantStatement(grantStatement: string): string[] {\n    const privileges: string[] = [];\n    const match = grantStatement.match(/GRANT\\s+(.+?)\\s+ON/i);\n\n    if (match) {\n      const privPart = match[1];\n      if (privPart.toUpperCase().includes(\"ALL PRIVILEGES\")) {\n        return [\"ALL PRIVILEGES\"];\n      }\n      const privs = privPart.split(\",\").map((p) => p.trim().toUpperCase());\n      privileges.push(...privs);\n    }\n    return privileges;\n  }\n\n  // ==================== Database Management Operations ====================\n\n  async getDatabases(): Promise<DatabaseList[]> {\n    const query = `\n      SELECT\n        SCHEMA_NAME as database_name,\n        DEFAULT_CHARACTER_SET_NAME as default_character_set,\n        DEFAULT_COLLATION_NAME as default_collation\n      FROM information_schema.SCHEMATA\n      WHERE SCHEMA_NAME NOT IN ('information_schema', 'performance_schema', 'mysql', 'sys')\n      ORDER BY SCHEMA_NAME\n    `;\n    const result = await this.query(query);\n    return result.map((row: any) => ({\n      database_name: row.database_name,\n      default_character_set: row.default_character_set,\n      default_collation: row.default_collation,\n    }));\n  }\n\n  async getDatabaseInfo(): Promise<DatabaseInfo> {\n    const queries = {\n      version: \"SELECT VERSION() as version\",\n      serverName: \"SELECT @@hostname as server_name\",\n      charset: \"SELECT @@character_set_server as character_set\",\n      collation: \"SELECT @@collation_server as collation\",\n      timezone: \"SELECT @@time_zone as timezone\",\n      maxConnections: \"SELECT @@max_connections as max_connections\",\n      uptime: \"SHOW GLOBAL STATUS LIKE 'Uptime'\",\n      threads: \"SHOW GLOBAL STATUS LIKE 'Threads_connected'\",\n      defaultEngine: \"SELECT @@default_storage_engine as default_engine\",\n      totalSize: `\n        SELECT ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) as total_size_mb\n        FROM information_schema.TABLES\n      `,\n    };\n\n    const [\n      version,\n      serverName,\n      charset,\n      collation,\n      timezone,\n      maxConnections,\n      uptime,\n      threads,\n      defaultEngine,\n      totalSize,\n    ] = await Promise.all([\n      this.query(queries.version),\n      this.query(queries.serverName),\n      this.query(queries.charset),\n      this.query(queries.collation),\n      this.query(queries.timezone),\n      this.query(queries.maxConnections),\n      this.query(queries.uptime),\n      this.query(queries.threads),\n      this.query(queries.defaultEngine),\n      this.query(queries.totalSize),\n    ]);\n\n    return {\n      version: version[0]?.version || \"Unknown\",\n      server_name: serverName[0]?.server_name || \"Unknown\",\n      character_set: charset[0]?.character_set || \"Unknown\",\n      collation: collation[0]?.collation || \"Unknown\",\n      timezone: timezone[0]?.timezone || \"Unknown\",\n      max_connections: parseInt(maxConnections[0]?.max_connections) || 0,\n      uptime_sec: parseInt(uptime[0]?.Value) || 0,\n      threads_connected: parseInt(threads[0]?.Value) || 0,\n      default_engine: defaultEngine[0]?.default_engine || \"Unknown\",\n      total_db_size_mb: parseFloat(totalSize[0]?.total_size_mb) || 0,\n    };\n  }\n\n  // ==================== Table Operations ====================\n\n  async getTables(databaseName: string): Promise<string[]> {\n    const query = `\n      SELECT TABLE_NAME as table_name\n      FROM information_schema.TABLES\n      WHERE TABLE_SCHEMA = ?\n        AND TABLE_TYPE = 'BASE TABLE'\n      ORDER BY TABLE_NAME\n    `;\n    const result = await this.query(query, [databaseName]);\n    return result.map((row: any) => row.table_name);\n  }\n\n  async getTablesWithDetails(databaseName: string): Promise<TableInfo[]> {\n    const query = `\n      SELECT\n        t.TABLE_NAME as table_name,\n        t.TABLE_TYPE as table_type,\n        t.ENGINE as engine,\n        COALESCE(t.TABLE_ROWS, 0) as \\`rows\\`,\n        COALESCE(t.DATA_LENGTH, 0) as data_length,\n        COALESCE(t.INDEX_LENGTH, 0) as index_length,\n        t.AUTO_INCREMENT as auto_increment,\n        t.CREATE_TIME as create_time,\n        t.UPDATE_TIME as update_time,\n        t.TABLE_COMMENT as table_comment,\n        (\n          SELECT GROUP_CONCAT(k.COLUMN_NAME ORDER BY k.ORDINAL_POSITION SEPARATOR ', ')\n          FROM information_schema.KEY_COLUMN_USAGE k\n          WHERE k.TABLE_SCHEMA = t.TABLE_SCHEMA\n            AND k.TABLE_NAME = t.TABLE_NAME\n            AND k.CONSTRAINT_NAME = 'PRIMARY'\n        ) as primary_keys\n      FROM information_schema.TABLES t\n      WHERE t.TABLE_SCHEMA = ?\n        AND t.TABLE_TYPE = 'BASE TABLE'\n      ORDER BY t.TABLE_NAME\n    `;\n\n    const result = await this.query(query, [databaseName]);\n\n    return result.map((row: any) => ({\n      table_name: row.table_name,\n      table_type: row.table_type,\n      engine: row.engine || \"Unknown\",\n      rows: parseInt(row.rows) || 0,\n      data_length: parseInt(row.data_length) || 0,\n      index_length: parseInt(row.index_length) || 0,\n      auto_increment: row.auto_increment\n        ? parseInt(row.auto_increment)\n        : undefined,\n      create_time: row.create_time\n        ? new Date(row.create_time).toISOString()\n        : \"\",\n      update_time: row.update_time\n        ? new Date(row.update_time).toISOString()\n        : undefined,\n      table_comment: row.table_comment || \"\",\n      primary_keys: row.primary_keys || null,\n    }));\n  }\n\n  async getTableInfo(tableName: string): Promise<TableSchemaInfo> {\n    // Get column information\n    const columnsQuery = `\n      SELECT\n        COLUMN_NAME as column_name,\n        DATA_TYPE as data_type,\n        IS_NULLABLE as is_nullable,\n        COLUMN_DEFAULT as column_default,\n        COLUMN_KEY as column_key,\n        EXTRA as extra,\n        COLUMN_COMMENT as column_comment,\n        CHARACTER_MAXIMUM_LENGTH as character_maximum_length,\n        NUMERIC_PRECISION as numeric_precision,\n        NUMERIC_SCALE as numeric_scale\n      FROM information_schema.COLUMNS\n      WHERE TABLE_SCHEMA = DATABASE()\n        AND TABLE_NAME = ?\n      ORDER BY ORDINAL_POSITION\n    `;\n\n    // Get foreign key constraints\n    const fkQuery = `\n      SELECT\n        kcu.CONSTRAINT_NAME as constraint_name,\n        kcu.COLUMN_NAME as column_name,\n        kcu.REFERENCED_TABLE_NAME as referenced_table_name,\n        kcu.REFERENCED_COLUMN_NAME as referenced_column_name,\n        rc.UPDATE_RULE as update_rule,\n        rc.DELETE_RULE as delete_rule\n      FROM information_schema.KEY_COLUMN_USAGE kcu\n      INNER JOIN information_schema.REFERENTIAL_CONSTRAINTS rc\n        ON kcu.CONSTRAINT_NAME = rc.CONSTRAINT_NAME\n        AND kcu.CONSTRAINT_SCHEMA = rc.CONSTRAINT_SCHEMA\n      WHERE kcu.TABLE_SCHEMA = DATABASE()\n        AND kcu.TABLE_NAME = ?\n        AND kcu.REFERENCED_TABLE_NAME IS NOT NULL\n      ORDER BY kcu.ORDINAL_POSITION\n    `;\n\n    // Get unique constraints (excluding primary key)\n    const uniqueQuery = `\n      SELECT\n        tc.CONSTRAINT_NAME as constraint_name,\n        GROUP_CONCAT(kcu.COLUMN_NAME ORDER BY kcu.ORDINAL_POSITION) as column_names\n      FROM information_schema.TABLE_CONSTRAINTS tc\n      INNER JOIN information_schema.KEY_COLUMN_USAGE kcu\n        ON tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME\n        AND tc.TABLE_SCHEMA = kcu.TABLE_SCHEMA\n        AND tc.TABLE_NAME = kcu.TABLE_NAME\n      WHERE tc.TABLE_SCHEMA = DATABASE()\n        AND tc.TABLE_NAME = ?\n        AND tc.CONSTRAINT_TYPE = 'UNIQUE'\n      GROUP BY tc.CONSTRAINT_NAME\n    `;\n\n    // Get primary key information with auto_increment value\n    const pkQuery = `\n      SELECT\n        tc.CONSTRAINT_NAME as constraint_name,\n        GROUP_CONCAT(kcu.COLUMN_NAME ORDER BY kcu.ORDINAL_POSITION) as column_names,\n        t.AUTO_INCREMENT as auto_increment_value\n      FROM information_schema.TABLE_CONSTRAINTS tc\n      INNER JOIN information_schema.KEY_COLUMN_USAGE kcu\n        ON tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME\n        AND tc.TABLE_SCHEMA = kcu.TABLE_SCHEMA\n        AND tc.TABLE_NAME = kcu.TABLE_NAME\n      INNER JOIN information_schema.TABLES t\n        ON t.TABLE_SCHEMA = tc.TABLE_SCHEMA\n        AND t.TABLE_NAME = tc.TABLE_NAME\n      WHERE tc.TABLE_SCHEMA = DATABASE()\n        AND tc.TABLE_NAME = ?\n        AND tc.CONSTRAINT_TYPE = 'PRIMARY KEY'\n      GROUP BY tc.CONSTRAINT_NAME, t.AUTO_INCREMENT\n    `;\n\n    // Get all indexes (including PRIMARY)\n    const [columnsResult, fkResult, uniqueResult, pkResult, indexesResult] =\n      await Promise.all([\n        this.query(columnsQuery, [tableName]),\n        this.query(fkQuery, [tableName]),\n        this.query(uniqueQuery, [tableName]),\n        this.query(pkQuery, [tableName]),\n        this.getIndexes(tableName, true), // includeAll = true to get all indexes\n      ]);\n\n    const columns: ColumnInfo[] = columnsResult.map((row: any) => ({\n      column_name: row.column_name,\n      data_type: row.data_type,\n      is_nullable: row.is_nullable,\n      column_default: row.column_default,\n      column_key: row.column_key,\n      extra: row.extra,\n      column_comment: row.column_comment || undefined,\n      character_maximum_length: row.character_maximum_length\n        ? Number(row.character_maximum_length)\n        : null,\n      numeric_precision: row.numeric_precision\n        ? Number(row.numeric_precision)\n        : null,\n      numeric_scale: row.numeric_scale ? Number(row.numeric_scale) : null,\n    }));\n\n    const foreign_keys: ForeignKeyInfo[] = fkResult.map((row: any) => ({\n      constraint_name: row.constraint_name,\n      column_name: row.column_name,\n      referenced_table_name: row.referenced_table_name,\n      referenced_column_name: row.referenced_column_name,\n      update_rule: row.update_rule,\n      delete_rule: row.delete_rule,\n    }));\n\n    const unique_constraints: UniqueConstraintInfo[] = uniqueResult.map(\n      (row: any) => ({\n        constraint_name: row.constraint_name,\n        column_names: row.column_names.split(\",\"),\n      }),\n    );\n\n    let primary_key: PrimaryKeyInfo | undefined;\n    if (pkResult.length > 0) {\n      const pkRow = pkResult[0];\n      const pkColumns = pkRow.column_names.split(\",\");\n      const hasAutoIncrement = columns.some(\n        (col) =>\n          pkColumns.includes(col.column_name) &&\n          col.extra.toLowerCase().includes(\"auto_increment\"),\n      );\n\n      primary_key = {\n        constraint_name: pkRow.constraint_name,\n        column_names: pkColumns,\n        has_auto_increment: hasAutoIncrement,\n        auto_increment_value: pkRow.auto_increment_value\n          ? Number(pkRow.auto_increment_value)\n          : undefined,\n      };\n    }\n\n    return {\n      table_name: tableName,\n      columns,\n      primary_key,\n      foreign_keys,\n      unique_constraints,\n      indexes: indexesResult,\n    };\n  }\n\n  async getTableMetadata(tableName: string): Promise<TableInfo> {\n    const query = `\n      SELECT\n        TABLE_NAME as table_name,\n        TABLE_TYPE as table_type,\n        ENGINE as engine,\n        TABLE_ROWS as \\`rows\\`,\n        DATA_LENGTH as data_length,\n        INDEX_LENGTH as index_length,\n        AUTO_INCREMENT as auto_increment,\n        CREATE_TIME as create_time,\n        UPDATE_TIME as update_time,\n        TABLE_COMMENT as table_comment\n      FROM information_schema.TABLES\n      WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?\n    `;\n    const result = await this.query(query, [tableName]);\n\n    if (!result || result.length === 0) {\n      throw new Error(`Table '${tableName}' not found`);\n    }\n\n    const row = result[0];\n    return {\n      table_name: row.table_name,\n      table_type: row.table_type,\n      engine: row.engine || \"Unknown\",\n      rows: parseInt(row.rows) || 0,\n      data_length: parseInt(row.data_length) || 0,\n      index_length: parseInt(row.index_length) || 0,\n      auto_increment: row.auto_increment\n        ? parseInt(row.auto_increment)\n        : undefined,\n      create_time: row.create_time\n        ? new Date(row.create_time).toISOString()\n        : \"Unknown\",\n      update_time: row.update_time\n        ? new Date(row.update_time).toISOString()\n        : undefined,\n      table_comment: row.table_comment || \"\",\n    };\n  }\n\n  // ==================== Index Operations ====================\n\n  async getIndexes(\n    tableName?: string,\n    includeAll: boolean = false,\n  ): Promise<IndexInfo[]> {\n    let query = `\n      SELECT\n        TABLE_NAME as table_name,\n        INDEX_NAME as index_name,\n        COLUMN_NAME as column_name,\n        NON_UNIQUE as non_unique,\n        SEQ_IN_INDEX as seq_in_index,\n        INDEX_TYPE as index_type,\n        COMMENT as comment\n      FROM information_schema.STATISTICS\n      WHERE TABLE_SCHEMA = DATABASE()\n    `;\n\n    const params: any[] = [];\n    if (tableName) {\n      query += \" AND TABLE_NAME = ?\";\n      params.push(tableName);\n    }\n\n    // Exclude PRIMARY key index by default\n    if (!includeAll) {\n      query += \" AND INDEX_NAME != 'PRIMARY'\";\n    }\n\n    query += \" ORDER BY TABLE_NAME, INDEX_NAME, SEQ_IN_INDEX\";\n    const result = await this.query(query, params);\n\n    return result.map((row: any) => ({\n      table_name: row.table_name,\n      index_name: row.index_name,\n      column_name: row.column_name,\n      index_type: row.index_type,\n      unique: row.non_unique !== 1,\n      nullable: false,\n      cardinality: 0,\n      sequence_in_index: row.seq_in_index,\n    }));\n  }\n}\n\nexport class MySQLConnection extends MySQLConnectionBase {\n  constructor(private connection: mysql.Connection) {\n    super();\n  }\n\n  protected async executeQuery(sql: string, params?: any[]): Promise<any> {\n    try {\n      const [rows] = await this.connection.execute(sql, params);\n      return rows;\n    } catch (error) {\n      logger.error(\"❌ MySQL query failed:\", (error as Error).message);\n      throw error;\n    }\n  }\n\n  async end(): Promise<void> {\n    try {\n      await this.connection.end();\n    } catch (error) {\n      logger.error(\n        \"❌ Failed to end MySQL connection:\",\n        (error as Error).message,\n      );\n      throw error;\n    }\n  }\n}\n\nexport class MySQLPoolConnection extends MySQLConnectionBase {\n  constructor(private connection: mysql.PoolConnection) {\n    super();\n  }\n\n  protected async executeQuery(sql: string, params?: any[]): Promise<any> {\n    try {\n      const [rows] = await this.connection.execute(sql, params);\n      return rows;\n    } catch (error) {\n      logger.error(\"❌ MySQL query failed:\", (error as Error).message);\n      throw error;\n    }\n  }\n\n  async release(): Promise<void> {\n    try {\n      this.connection.release();\n    } catch (error) {\n      logger.error(\n        \"❌ Failed to release MySQL connection:\",\n        (error as Error).message,\n      );\n      throw error;\n    }\n  }\n}\n\nexport class MySQLPool implements DatabasePool {\n  constructor(private pool: mysql.Pool) {}\n\n  async getConnection(): Promise<DatabaseConnection> {\n    try {\n      const connection = await this.pool.getConnection();\n      return new MySQLPoolConnection(connection);\n    } catch (error) {\n      logger.error(\n        \"❌ Failed to get MySQL connection from pool:\",\n        (error as Error).message,\n      );\n      throw error;\n    }\n  }\n\n  async end(): Promise<void> {\n    try {\n      await this.pool.end();\n    } catch (error) {\n      logger.error(\"❌ Failed to end MySQL pool:\", (error as Error).message);\n      throw error;\n    }\n  }\n}\n\nexport class MySQLAdapter implements DatabaseAdapter<MySQLConfig> {\n  async connect(config: MySQLConfig): Promise<DatabaseConnection> {\n    logger.info(\"🚀 Connecting to MySQL...\");\n\n    try {\n      const connectionConfig = this.buildConnectionConfig(config);\n      const connection = await mysql.createConnection(connectionConfig);\n\n      // Test connection\n      await connection.execute(\"SELECT 1 as test\");\n      logger.info(\"✅ MySQL connection successful!\");\n\n      return new MySQLConnection(connection);\n    } catch (error) {\n      logger.error(\"❌ MySQL connection failed:\", (error as Error).message);\n      throw error;\n    }\n  }\n\n  createPool(config: MySQLConfig): DatabasePool {\n    logger.info(\"🚀 Creating MySQL connection pool...\");\n\n    try {\n      const poolConfig = this.buildConnectionConfig(config);\n      const pool = mysql.createPool(poolConfig);\n\n      logger.info(\"✅ MySQL pool created successfully!\");\n      return new MySQLPool(pool);\n    } catch (error) {\n      logger.error(\"❌ MySQL pool creation failed:\", (error as Error).message);\n      throw error;\n    }\n  }\n\n  private buildConnectionConfig(config: MySQLConfig): mysql.PoolOptions {\n    return {\n      host: config.host,\n      port: config.port || 3306,\n      user: config.user,\n      password: config.password,\n      database: config.database,\n      connectionLimit: config.connectionLimit || 10,\n    };\n  }\n}\n","import { Pool, Client, PoolClient } from \"pg\";\nimport {\n  DatabaseAdapter,\n  DatabaseConnection,\n  DatabasePool,\n  PostgreSQLConfig,\n} from \"../core/types/DatabaseTypes\";\nimport { DatabaseOperations } from \"../core/types/DatabaseOperations\";\nimport {\n  UserInfo,\n  DatabaseList,\n  IndexInfo,\n  DatabaseInfo,\n  TableInfo,\n  TableSchemaInfo,\n  ColumnInfo,\n  ForeignKeyInfo,\n  UniqueConstraintInfo,\n  PrimaryKeyInfo,\n} from \"../core/types/CliTypes\";\n\n/**\n * PostgreSQL connection base class with DatabaseOperations implementation\n */\nabstract class PostgreSQLConnectionBase\n  implements DatabaseConnection, DatabaseOperations\n{\n  protected abstract executeQuery(sql: string, params?: any[]): Promise<any>;\n\n  async query(sql: string, params?: any[]): Promise<any> {\n    return this.executeQuery(sql, params);\n  }\n\n  /**\n   * Get all database users with their privileges\n   */\n  async getUsers(): Promise<UserInfo[]> {\n    const usersQuery = `\n      SELECT\n        rolname as user,\n        rolsuper,\n        rolcreaterole,\n        rolcreatedb,\n        rolcanlogin,\n        rolreplication,\n        rolbypassrls,\n        rolconnlimit,\n        CASE WHEN rolvaliduntil IS NULL THEN false ELSE rolvaliduntil < NOW() END as password_expired\n      FROM pg_roles\n      WHERE rolname NOT LIKE 'pg_%'\n      ORDER BY rolname\n    `;\n\n    const users = await this.executeQuery(usersQuery);\n    const userInfos: UserInfo[] = [];\n\n    for (const user of users) {\n      const privileges: string[] = [];\n\n      if (user.rolsuper) privileges.push(\"SUPERUSER\");\n      if (user.rolcreaterole) privileges.push(\"CREATEROLE\");\n      if (user.rolcreatedb) privileges.push(\"CREATEDB\");\n      if (user.rolcanlogin) privileges.push(\"LOGIN\");\n      if (user.rolreplication) privileges.push(\"REPLICATION\");\n      if (user.rolbypassrls) privileges.push(\"BYPASSRLS\");\n\n      // Get database-specific privileges\n      const dbPrivilegesQuery = `\n        SELECT\n          datname,\n          array_agg(privilege_type) as privileges\n        FROM information_schema.role_table_grants rtg\n        JOIN pg_database db ON db.datname = rtg.table_catalog\n        WHERE grantee = $1\n        GROUP BY datname\n      `;\n\n      try {\n        const dbPrivileges = await this.executeQuery(dbPrivilegesQuery, [\n          user.user,\n        ]);\n        dbPrivileges.forEach((dbPriv: any) => {\n          if (dbPriv.privileges) {\n            privileges.push(...dbPriv.privileges);\n          }\n        });\n      } catch {\n        // Ignore errors getting database privileges\n      }\n\n      userInfos.push({\n        user: user.user,\n        host: \"localhost\", // PostgreSQL doesn't have MySQL-style host restrictions\n        privileges:\n          privileges.length > 0 ? Array.from(new Set(privileges)) : [\"USAGE\"],\n        password_expired: user.password_expired || false,\n        account_locked: !user.rolcanlogin,\n      });\n    }\n\n    return userInfos;\n  }\n\n  /**\n   * Get list of all databases\n   */\n  async getDatabases(): Promise<DatabaseList[]> {\n    const query = `\n      SELECT\n        datname as database_name,\n        pg_encoding_to_char(encoding) as default_character_set,\n        datcollate as default_collation\n      FROM pg_database\n      WHERE datname NOT IN ('template0', 'template1', 'postgres')\n        AND datistemplate = false\n      ORDER BY datname\n    `;\n\n    const result = await this.executeQuery(query);\n\n    return result.map((row: any) => ({\n      database_name: row.database_name,\n      default_character_set: row.default_character_set,\n      default_collation: row.default_collation,\n    }));\n  }\n\n  /**\n   * Get database server information\n   */\n  async getDatabaseInfo(): Promise<DatabaseInfo> {\n    const queries = {\n      version: \"SELECT version() as version\",\n      serverName: \"SELECT inet_server_addr() as server_name\",\n      charset:\n        \"SELECT pg_encoding_to_char(encoding) as character_set FROM pg_database WHERE datname = current_database()\",\n      collation:\n        \"SELECT datcollate as collation FROM pg_database WHERE datname = current_database()\",\n      timezone: \"SELECT current_setting('timezone') as timezone\",\n      maxConnections:\n        \"SELECT setting as max_connections FROM pg_settings WHERE name = 'max_connections'\",\n      uptime: `\n        SELECT EXTRACT(EPOCH FROM (NOW() - pg_postmaster_start_time()))::INTEGER as uptime_sec\n      `,\n      threads: `\n        SELECT COUNT(*) as threads_connected\n        FROM pg_stat_activity\n        WHERE state IS NOT NULL\n      `,\n      totalSize: `\n        SELECT ROUND(SUM(pg_database_size(datname)) / 1024.0 / 1024.0, 2) as total_size_mb\n        FROM pg_database\n        WHERE datistemplate = false\n      `,\n    };\n\n    const [\n      version,\n      serverName,\n      charset,\n      collation,\n      timezone,\n      maxConnections,\n      uptime,\n      threads,\n      totalSize,\n    ] = await Promise.all([\n      this.executeQuery(queries.version),\n      this.executeQuery(queries.serverName),\n      this.executeQuery(queries.charset),\n      this.executeQuery(queries.collation),\n      this.executeQuery(queries.timezone),\n      this.executeQuery(queries.maxConnections),\n      this.executeQuery(queries.uptime),\n      this.executeQuery(queries.threads),\n      this.executeQuery(queries.totalSize),\n    ]);\n\n    return {\n      version: version[0]?.version || \"Unknown\",\n      server_name: serverName[0]?.server_name || \"localhost\",\n      character_set: charset[0]?.character_set || \"Unknown\",\n      collation: collation[0]?.collation || \"Unknown\",\n      timezone: timezone[0]?.timezone || \"Unknown\",\n      max_connections: parseInt(maxConnections[0]?.max_connections) || 0,\n      uptime_sec: parseInt(uptime[0]?.uptime_sec) || 0,\n      threads_connected: parseInt(threads[0]?.threads_connected) || 0,\n      default_engine: \"PostgreSQL\",\n      total_db_size_mb: parseFloat(totalSize[0]?.total_size_mb) || 0,\n    };\n  }\n\n  /**\n   * Get list of tables in a database\n   */\n  async getTables(databaseName: string): Promise<string[]> {\n    const query = `\n      SELECT table_name\n      FROM information_schema.tables\n      WHERE table_catalog = $1\n        AND table_schema = 'public'\n        AND table_type = 'BASE TABLE'\n      ORDER BY table_name\n    `;\n\n    const result = await this.executeQuery(query, [databaseName]);\n\n    return result.map((row: any) => row.table_name);\n  }\n\n  /**\n   * Get list of tables with detailed information including rows, size, and primary key\n   */\n  async getTablesWithDetails(databaseName: string): Promise<TableInfo[]> {\n    const query = `\n      SELECT\n        t.table_name,\n        'BASE TABLE' as table_type,\n        '' as engine,\n        COALESCE(s.n_live_tup, 0) as rows,\n        COALESCE(pg_total_relation_size(quote_ident(t.table_schema) || '.' || quote_ident(t.table_name)), 0) as data_length,\n        COALESCE(pg_indexes_size(quote_ident(t.table_schema) || '.' || quote_ident(t.table_name)), 0) as index_length,\n        NULL as auto_increment,\n        obj_description((quote_ident(t.table_schema) || '.' || quote_ident(t.table_name))::regclass, 'pg_class') as table_comment,\n        (\n          SELECT string_agg(kcu.column_name, ', ' ORDER BY kcu.ordinal_position)\n          FROM information_schema.key_column_usage kcu\n          JOIN information_schema.table_constraints tc\n            ON tc.constraint_name = kcu.constraint_name\n            AND tc.table_schema = kcu.table_schema\n          WHERE tc.constraint_type = 'PRIMARY KEY'\n            AND kcu.table_name = t.table_name\n            AND kcu.table_schema = t.table_schema\n        ) as primary_keys,\n        NULL as create_time,\n        NULL as update_time\n      FROM information_schema.tables t\n      LEFT JOIN pg_stat_user_tables s\n        ON s.schemaname = t.table_schema\n        AND s.relname = t.table_name\n      WHERE t.table_catalog = $1\n        AND t.table_schema = 'public'\n        AND t.table_type = 'BASE TABLE'\n      ORDER BY t.table_name\n    `;\n\n    const result = await this.executeQuery(query, [databaseName]);\n\n    return result.map((row: any) => ({\n      table_name: row.table_name,\n      table_type: row.table_type,\n      engine: row.engine || \"\",\n      rows: parseInt(row.rows) || 0,\n      data_length: parseInt(row.data_length) || 0,\n      index_length: parseInt(row.index_length) || 0,\n      auto_increment: row.auto_increment,\n      create_time: row.create_time || \"\",\n      update_time: row.update_time,\n      table_comment: row.table_comment || \"\",\n      primary_keys: row.primary_keys || null,\n    }));\n  }\n\n  /**\n   * Get detailed schema information for a table including columns, constraints, and keys\n   */\n  async getTableInfo(tableName: string): Promise<TableSchemaInfo> {\n    // Get column information\n    const columnsQuery = `\n      SELECT\n        column_name,\n        data_type,\n        is_nullable,\n        column_default,\n        CASE\n          WHEN column_name IN (\n            SELECT column_name\n            FROM information_schema.key_column_usage kcu\n            JOIN information_schema.table_constraints tc\n              ON tc.constraint_name = kcu.constraint_name\n              AND tc.table_schema = kcu.table_schema\n            WHERE tc.constraint_type = 'PRIMARY KEY'\n              AND kcu.table_name = $1\n              AND kcu.table_schema = 'public'\n          ) THEN 'PRI'\n          WHEN column_name IN (\n            SELECT column_name\n            FROM information_schema.key_column_usage kcu\n            JOIN information_schema.table_constraints tc\n              ON tc.constraint_name = kcu.constraint_name\n              AND tc.table_schema = kcu.table_schema\n            WHERE tc.constraint_type = 'UNIQUE'\n              AND kcu.table_name = $1\n              AND kcu.table_schema = 'public'\n          ) THEN 'UNI'\n          ELSE ''\n        END as column_key,\n        CASE\n          WHEN column_default LIKE 'nextval%' THEN 'auto_increment'\n          ELSE ''\n        END as extra,\n        '' as column_comment,\n        character_maximum_length,\n        numeric_precision,\n        numeric_scale\n      FROM information_schema.columns\n      WHERE table_schema = 'public'\n        AND table_name = $1\n      ORDER BY ordinal_position\n    `;\n\n    // Get foreign key constraints\n    const fkQuery = `\n      SELECT\n        tc.constraint_name,\n        kcu.column_name,\n        ccu.table_name AS referenced_table_name,\n        ccu.column_name AS referenced_column_name,\n        rc.update_rule,\n        rc.delete_rule\n      FROM information_schema.table_constraints tc\n      JOIN information_schema.key_column_usage kcu\n        ON tc.constraint_name = kcu.constraint_name\n        AND tc.table_schema = kcu.table_schema\n      JOIN information_schema.constraint_column_usage ccu\n        ON ccu.constraint_name = tc.constraint_name\n        AND ccu.table_schema = tc.table_schema\n      JOIN information_schema.referential_constraints rc\n        ON rc.constraint_name = tc.constraint_name\n        AND rc.constraint_schema = tc.table_schema\n      WHERE tc.constraint_type = 'FOREIGN KEY'\n        AND tc.table_name = $1\n        AND tc.table_schema = 'public'\n      ORDER BY kcu.ordinal_position\n    `;\n\n    // Get unique constraints (excluding primary key)\n    const uniqueQuery = `\n      SELECT\n        tc.constraint_name,\n        array_agg(kcu.column_name ORDER BY kcu.ordinal_position) as column_names\n      FROM information_schema.table_constraints tc\n      JOIN information_schema.key_column_usage kcu\n        ON tc.constraint_name = kcu.constraint_name\n        AND tc.table_schema = kcu.table_schema\n      WHERE tc.constraint_type = 'UNIQUE'\n        AND tc.table_name = $1\n        AND tc.table_schema = 'public'\n      GROUP BY tc.constraint_name\n    `;\n\n    // Get primary key information with sequence details\n    const pkQuery = `\n      SELECT\n        tc.constraint_name,\n        array_agg(kcu.column_name ORDER BY kcu.ordinal_position) as column_names,\n        pg_get_serial_sequence($1, kcu.column_name) as sequence_name\n      FROM information_schema.table_constraints tc\n      JOIN information_schema.key_column_usage kcu\n        ON tc.constraint_name = kcu.constraint_name\n        AND tc.table_schema = kcu.table_schema\n      WHERE tc.constraint_type = 'PRIMARY KEY'\n        AND tc.table_name = $1\n        AND tc.table_schema = 'public'\n      GROUP BY tc.constraint_name, kcu.column_name\n    `;\n\n    // Get all indexes (including PRIMARY)\n    const [columnsResult, fkResult, uniqueResult, pkResult, indexesResult] =\n      await Promise.all([\n        this.executeQuery(columnsQuery, [tableName]),\n        this.executeQuery(fkQuery, [tableName]),\n        this.executeQuery(uniqueQuery, [tableName]),\n        this.executeQuery(pkQuery, [tableName]),\n        this.getIndexes(tableName, true), // includeAll = true to get all indexes\n      ]);\n\n    const columns: ColumnInfo[] = columnsResult.map((row: any) => ({\n      column_name: row.column_name,\n      data_type: row.data_type,\n      is_nullable: row.is_nullable,\n      column_default: row.column_default,\n      column_key: row.column_key,\n      extra: row.extra,\n      column_comment: row.column_comment || undefined,\n      character_maximum_length: row.character_maximum_length\n        ? Number(row.character_maximum_length)\n        : null,\n      numeric_precision: row.numeric_precision\n        ? Number(row.numeric_precision)\n        : null,\n      numeric_scale: row.numeric_scale ? Number(row.numeric_scale) : null,\n    }));\n\n    const foreign_keys: ForeignKeyInfo[] = fkResult.map((row: any) => ({\n      constraint_name: row.constraint_name,\n      column_name: row.column_name,\n      referenced_table_name: row.referenced_table_name,\n      referenced_column_name: row.referenced_column_name,\n      update_rule: row.update_rule,\n      delete_rule: row.delete_rule,\n    }));\n\n    const unique_constraints: UniqueConstraintInfo[] = uniqueResult.map(\n      (row: any) => ({\n        constraint_name: row.constraint_name,\n        column_names: row.column_names,\n      }),\n    );\n\n    let primary_key: PrimaryKeyInfo | undefined;\n    if (pkResult.length > 0) {\n      const pkRow = pkResult[0];\n      const hasAutoIncrement = columns.some(\n        (col) =>\n          pkRow.column_names.includes(col.column_name) &&\n          col.extra.toLowerCase().includes(\"auto_increment\"),\n      );\n\n      primary_key = {\n        constraint_name: pkRow.constraint_name,\n        column_names: pkRow.column_names,\n        has_auto_increment: hasAutoIncrement,\n        sequence_name: pkRow.sequence_name || undefined,\n      };\n    }\n\n    return {\n      table_name: tableName,\n      columns,\n      primary_key,\n      foreign_keys,\n      unique_constraints,\n      indexes: indexesResult,\n    };\n  }\n\n  /**\n   * Get table metadata (size, row count, etc.)\n   */\n  async getTableMetadata(tableName: string): Promise<TableInfo> {\n    // Get basic table information\n    const tableQuery = `\n      SELECT\n        table_name,\n        table_type\n      FROM information_schema.tables\n      WHERE table_name = $1 AND table_schema = 'public'\n    `;\n\n    const tableResult = await this.executeQuery(tableQuery, [tableName]);\n\n    if (!tableResult || tableResult.length === 0) {\n      throw new Error(`Table '${tableName}' not found`);\n    }\n\n    // Get table size information\n    const sizeQuery = `\n      SELECT\n        pg_total_relation_size($1) as total_size,\n        pg_relation_size($1) as data_size,\n        pg_total_relation_size($1) - pg_relation_size($1) as index_size\n    `;\n\n    // Get row count estimate\n    const rowCountQuery = `\n      SELECT reltuples::bigint as estimated_rows\n      FROM pg_class\n      WHERE relname = $1\n    `;\n\n    const [sizeResult, rowCountResult] = await Promise.all([\n      this.executeQuery(sizeQuery, [tableName]),\n      this.executeQuery(rowCountQuery, [tableName]),\n    ]);\n\n    return {\n      table_name: tableResult[0].table_name,\n      table_type: tableResult[0].table_type,\n      engine: \"PostgreSQL\",\n      rows: parseInt(rowCountResult[0]?.estimated_rows) || 0,\n      data_length: parseInt(sizeResult[0]?.data_size) || 0,\n      index_length: parseInt(sizeResult[0]?.index_size) || 0,\n      auto_increment: undefined,\n      create_time: \"Unknown\",\n      update_time: undefined,\n      table_comment: \"\",\n    };\n  }\n\n  /**\n   * Get index information for a table\n   */\n  async getIndexes(\n    tableName?: string,\n    includeAll: boolean = false,\n  ): Promise<IndexInfo[]> {\n    let query = `\n      SELECT\n        schemaname || '.' || tablename as table_name,\n        indexname as index_name,\n        indexdef as index_definition,\n        CASE\n          WHEN indexdef ILIKE '%UNIQUE%' THEN false\n          ELSE true\n        END as non_unique,\n        1 as seq_in_index,\n        'BTREE' as index_type,\n        '' as comment\n      FROM pg_indexes\n      WHERE schemaname = 'public'\n    `;\n\n    const params: any[] = [];\n    if (tableName) {\n      query += \" AND tablename = $1\";\n      params.push(tableName);\n    }\n\n    // Exclude PRIMARY key indexes by default\n    // PostgreSQL primary key indexes typically end with '_pkey'\n    if (!includeAll) {\n      query += ` AND indexname NOT LIKE '%_pkey'`;\n    }\n\n    query += \" ORDER BY tablename, indexname\";\n\n    const result = await this.executeQuery(query, params);\n\n    // Parse column names from index definition for PostgreSQL\n    return result.map((row: any) => {\n      // Extract column name from index definition\n      const columnMatch = row.index_definition.match(/\\(([^)]+)\\)/);\n      const columnName = columnMatch\n        ? columnMatch[1].split(\",\")[0].trim()\n        : \"unknown\";\n\n      return {\n        table_name: row.table_name.replace(\"public.\", \"\"),\n        index_name: row.index_name,\n        column_name: columnName,\n        index_type: row.index_type,\n        unique: !row.non_unique,\n        nullable: false, // Default value for PostgreSQL\n        cardinality: 0, // PostgreSQL doesn't provide this easily\n        sequence_in_index: row.seq_in_index,\n      };\n    });\n  }\n}\n\n/**\n * PostgreSQL single connection implementation\n */\nexport class PostgreSQLConnection extends PostgreSQLConnectionBase {\n  constructor(private client: Client) {\n    super();\n  }\n\n  protected async executeQuery(sql: string, params?: any[]): Promise<any> {\n    try {\n      const result = await this.client.query(sql, params);\n      return result.rows;\n    } catch (error) {\n      console.error(\"❌ PostgreSQL query failed:\", (error as Error).message);\n      throw error;\n    }\n  }\n\n  async end(): Promise<void> {\n    try {\n      await this.client.end();\n    } catch (error) {\n      console.error(\n        \"❌ Failed to end PostgreSQL connection:\",\n        (error as Error).message,\n      );\n      throw error;\n    }\n  }\n}\n\n/**\n * PostgreSQL pool connection implementation\n */\nexport class PostgreSQLPoolConnection extends PostgreSQLConnectionBase {\n  constructor(private client: PoolClient) {\n    super();\n  }\n\n  protected async executeQuery(sql: string, params?: any[]): Promise<any> {\n    try {\n      const result = await this.client.query(sql, params);\n      return result.rows;\n    } catch (error) {\n      console.error(\"❌ PostgreSQL query failed:\", (error as Error).message);\n      throw error;\n    }\n  }\n\n  async release(): Promise<void> {\n    try {\n      this.client.release();\n    } catch (error) {\n      console.error(\n        \"❌ Failed to release PostgreSQL connection:\",\n        (error as Error).message,\n      );\n      throw error;\n    }\n  }\n}\n\n/**\n * PostgreSQL connection pool implementation\n */\nexport class PostgreSQLPool implements DatabasePool {\n  constructor(private pool: Pool) {}\n\n  async getConnection(): Promise<DatabaseConnection> {\n    try {\n      const client = await this.pool.connect();\n      return new PostgreSQLPoolConnection(client);\n    } catch (error) {\n      console.error(\n        \"❌ Failed to get PostgreSQL connection from pool:\",\n        (error as Error).message,\n      );\n      throw error;\n    }\n  }\n\n  async end(): Promise<void> {\n    try {\n      await this.pool.end();\n    } catch (error) {\n      console.error(\n        \"❌ Failed to end PostgreSQL pool:\",\n        (error as Error).message,\n      );\n      throw error;\n    }\n  }\n}\n\n/**\n * PostgreSQL database adapter\n */\nexport class PostgreSQLAdapter implements DatabaseAdapter<PostgreSQLConfig> {\n  async connect(config: PostgreSQLConfig): Promise<DatabaseConnection> {\n    console.log(\"🚀 Connecting to PostgreSQL...\");\n\n    try {\n      const connectionConfig = this.buildConnectionConfig(config);\n      const client = new Client(connectionConfig);\n\n      await client.connect();\n\n      // Test connection\n      await client.query(\"SELECT 1 as test\");\n      console.log(\"✅ PostgreSQL connection successful!\");\n\n      return new PostgreSQLConnection(client);\n    } catch (error) {\n      console.error(\n        \"❌ PostgreSQL connection failed:\",\n        (error as Error).message,\n      );\n      throw error;\n    }\n  }\n\n  createPool(config: PostgreSQLConfig): DatabasePool {\n    console.log(\"🚀 Creating PostgreSQL connection pool...\");\n\n    try {\n      const poolConfig = this.buildConnectionConfig(config);\n      const pool = new Pool(poolConfig);\n\n      console.log(\"✅ PostgreSQL pool created successfully!\");\n      return new PostgreSQLPool(pool);\n    } catch (error) {\n      console.error(\n        \"❌ PostgreSQL pool creation failed:\",\n        (error as Error).message,\n      );\n      throw error;\n    }\n  }\n\n  private buildConnectionConfig(config: PostgreSQLConfig): any {\n    const connectionConfig: any = {\n      host: config.host,\n      port: config.port || 5432,\n      user: config.user,\n      password: config.password,\n      database: config.database,\n      max: config.max || 10,\n      idleTimeoutMillis: config.idleTimeoutMillis || 30000,\n      connectionTimeoutMillis: config.connectionTimeoutMillis || 2000,\n    };\n\n    // Add SSL configuration if provided\n    if (config.ssl !== undefined) {\n      connectionConfig.ssl = config.ssl;\n    }\n\n    // Add statement timeout if provided\n    if (config.statement_timeout) {\n      connectionConfig.statement_timeout = config.statement_timeout;\n    }\n\n    // Add query timeout if provided\n    if (config.query_timeout) {\n      connectionConfig.query_timeout = config.query_timeout;\n    }\n\n    return connectionConfig;\n  }\n}\n","import { ConfigManager } from \"../common/config/ConfigManager\";\nimport { MariaDBAdapter } from \"./MariaDBAdapter\";\nimport { MySQLAdapter } from \"./MySQLAdapter\";\nimport { PostgreSQLAdapter } from \"./PostgreSQLAdapter\";\nimport {\n  DatabaseConfig,\n  DatabaseAdapter,\n  DatabaseConnection,\n  DatabasePool,\n  DatabaseType,\n} from \"../core/types/DatabaseTypes\";\nimport { DEFAULT_PORTS } from \"../common/constants/DatabaseConstants\";\nimport logger from \"../common/config/LogConfig\";\n\n/**\n * Purpose: Centralized database object creation using Factory pattern\n * - Manages ConfigManager for configuration loading\n * - Maintains adapter registry for different database types\n * - Creates connections and pools via type-specific adapters\n *\n * Responsibilities:\n * - Adapter lifecycle management (MariaDB, MySQL, PostgreSQL)\n * - Configuration resolution (explicit config or config.json)\n * - Connection/pool creation delegation to adapters\n * - Default port resolution\n *\n * Does NOT handle:\n * - Connection lifecycle (connect/disconnect/release)\n * - CLI-specific config conversion\n * - Query execution or transactions\n */\nexport class DatabaseFactory {\n  private configManager: ConfigManager;\n  private adapters: Map<DatabaseType, DatabaseAdapter>;\n\n  constructor(configManager?: ConfigManager) {\n    this.configManager = configManager || new ConfigManager();\n    this.adapters = new Map();\n    this.adapters.set(DatabaseType.MARIADB, new MariaDBAdapter());\n    this.adapters.set(DatabaseType.MYSQL, new MySQLAdapter());\n    this.adapters.set(DatabaseType.POSTGRESQL, new PostgreSQLAdapter());\n  }\n\n  /**\n   * Create a single database connection\n   * @param config - Optional database configuration (uses config.json if not provided)\n   * @returns Database connection\n   */\n  async createConnection(\n    config?: DatabaseConfig | null,\n  ): Promise<DatabaseConnection> {\n    try {\n      const dbConfig = this.configManager.getConfig(config);\n      const adapter = this.getAdapter(dbConfig.type);\n\n      logger.info(\n        `🔗 Creating ${dbConfig.type} connection to ${dbConfig.host}:${dbConfig.port || this.getDefaultPort(dbConfig.type)}`,\n      );\n\n      const connection = await adapter.connect(dbConfig);\n\n      logger.info(\n        `✅ Successfully connected to ${dbConfig.type} database: ${dbConfig.database}`,\n      );\n\n      return connection;\n    } catch (error) {\n      logger.error(\n        \"❌ Failed to create database connection:\",\n        (error as Error).message,\n      );\n      throw error;\n    }\n  }\n\n  /**\n   * Create a database connection pool\n   * @param config - Optional database configuration (uses config.json if not provided)\n   * @returns Database connection pool\n   */\n  createPool(config?: DatabaseConfig | null): DatabasePool {\n    try {\n      const dbConfig = this.configManager.getConfig(config);\n      const adapter = this.getAdapter(dbConfig.type);\n\n      console.log(\n        `🏊 Creating ${dbConfig.type} connection pool to ${dbConfig.host}:${dbConfig.port || this.getDefaultPort(dbConfig.type)}`,\n      );\n\n      const pool = adapter.createPool(dbConfig);\n\n      console.log(\n        `✅ Successfully created ${dbConfig.type} connection pool for database: ${dbConfig.database}`,\n      );\n\n      return pool;\n    } catch (error) {\n      console.error(\n        \"❌ Failed to create database pool:\",\n        (error as Error).message,\n      );\n      throw error;\n    }\n  }\n\n  /**\n   * Get database adapter for specific type\n   * @param type - Database type\n   * @returns Database adapter\n   */\n  private getAdapter(type: DatabaseType): DatabaseAdapter {\n    const adapter = this.adapters.get(type);\n\n    if (!adapter) {\n      throw new Error(\n        `Unsupported database type: ${type}. Supported types: ${Array.from(this.adapters.keys()).join(\", \")}`,\n      );\n    }\n\n    return adapter;\n  }\n\n  /**\n   * Get default port for database type\n   * @param type - Database type\n   * @returns Default port number\n   */\n  private getDefaultPort(type: DatabaseType): number {\n    return DEFAULT_PORTS[type] || DEFAULT_PORTS[DatabaseType.MYSQL];\n  }\n\n  /**\n   * Get configuration manager instance\n   * @returns Configuration manager\n   */\n  getConfigManager(): ConfigManager {\n    return this.configManager;\n  }\n}\n","import { Client, ClientChannel } from \"ssh2\";\nimport { readFileSync } from \"fs\";\nimport { SSHConfig } from \"../types/ConfigTypes\";\nimport logger from \"../config/LogConfig\";\nimport * as net from \"net\";\n\n/**\n * SSH Tunnel configuration for database connection\n */\nexport interface TunnelConfig {\n  sshConfig: SSHConfig;\n  databaseHost: string;\n  databasePort: number;\n}\n\n/**\n * SSH Tunnel result containing local connection details\n */\nexport interface TunnelResult {\n  localHost: string;\n  localPort: number;\n  close: () => Promise<void>;\n}\n\n/**\n * SSH Tunnel Manager\n * Creates SSH tunnels for secure database connections\n */\nexport class SSHTunnel {\n  private client: Client | null = null;\n  private server: net.Server | null = null;\n  private connections: Set<ClientChannel> = new Set();\n\n  /**\n   * Create SSH tunnel for database connection\n   * @param config Tunnel configuration\n   * @returns Local connection details and cleanup function\n   */\n  public async createTunnel(config: TunnelConfig): Promise<TunnelResult> {\n    const { sshConfig, databaseHost, databasePort } = config;\n\n    logger.info(\n      `Creating SSH tunnel to ${sshConfig.host}:${sshConfig.port} for ${databaseHost}:${databasePort}`,\n    );\n\n    return new Promise((resolve, reject) => {\n      this.client = new Client();\n\n      // Prepare SSH connection options\n      const sshOptions: any = {\n        host: sshConfig.host,\n        port: sshConfig.port,\n        username: sshConfig.username,\n      };\n\n      // Add authentication method\n      if (sshConfig.privateKeyPath) {\n        try {\n          const privateKey = readFileSync(sshConfig.privateKeyPath);\n          if (!privateKey || privateKey.length === 0) {\n            throw new Error(\"Private key file is empty\");\n          }\n          sshOptions.privateKey = privateKey;\n          logger.info(\n            `Using SSH private key authentication from ${sshConfig.privateKeyPath}`,\n          );\n        } catch (error) {\n          const errorMsg =\n            error instanceof Error ? error.message : \"Unknown error\";\n          logger.error(`Failed to read SSH private key: ${errorMsg}`);\n          reject(\n            new Error(\n              `Failed to read SSH private key from ${sshConfig.privateKeyPath}: ${errorMsg}`,\n            ),\n          );\n          return;\n        }\n      } else if (sshConfig.password && sshConfig.password.trim().length > 0) {\n        sshOptions.password = sshConfig.password;\n        logger.info(\"Using SSH password authentication\");\n      } else {\n        const errorMsg =\n          \"SSH authentication method not configured. Provide either a valid password or privateKeyPath.\";\n        logger.error(errorMsg);\n        reject(new Error(errorMsg));\n        return;\n      }\n\n      // Set up SSH connection handlers\n      this.client.on(\"ready\", () => {\n        logger.info(\"SSH connection established\");\n\n        // Create local server for port forwarding\n        this.server = net.createServer((socket) => {\n          logger.debug(\"Local connection accepted, forwarding to database\");\n\n          this.client!.forwardOut(\n            socket.remoteAddress || \"127.0.0.1\",\n            socket.remotePort || 0,\n            databaseHost,\n            databasePort,\n            (err, stream) => {\n              if (err) {\n                logger.error(`SSH forward error: ${err.message}`);\n                socket.end();\n                return;\n              }\n\n              this.connections.add(stream);\n\n              // Pipe data between local socket and SSH stream\n              socket.pipe(stream);\n              stream.pipe(socket);\n\n              // Clean up on close\n              const cleanup = () => {\n                this.connections.delete(stream);\n                socket.unpipe(stream);\n                stream.unpipe(socket);\n              };\n\n              socket.on(\"close\", cleanup);\n              stream.on(\"close\", cleanup);\n            },\n          );\n        });\n\n        // Listen on random available port\n        this.server!.listen(0, \"127.0.0.1\", () => {\n          const address = this.server!.address() as net.AddressInfo;\n          logger.info(\n            `SSH tunnel listening on ${address.address}:${address.port}`,\n          );\n\n          resolve({\n            localHost: address.address,\n            localPort: address.port,\n            close: this.close.bind(this),\n          });\n        });\n\n        this.server!.on(\"error\", (err) => {\n          logger.error(`Tunnel server error: ${err.message}`);\n          reject(err);\n        });\n      });\n\n      this.client.on(\"error\", (err: any) => {\n        const errorDetails = {\n          message: err.message,\n          level: err.level,\n          code: err.code,\n          errno: err.errno,\n        };\n        logger.error(\n          `SSH connection error: ${JSON.stringify(errorDetails, null, 2)}`,\n        );\n\n        // Provide helpful error messages\n        let userMessage = `SSH connection failed: ${err.message}`;\n        if (err.level === \"client-authentication\") {\n          userMessage += \"\\n  → Check SSH key file permissions (should be 400 or 600)\";\n          userMessage += \"\\n  → Verify the key file format (PEM format required)\";\n          userMessage += \"\\n  → Ensure the key matches the SSH server's authorized_keys\";\n        } else if (err.level === \"client-timeout\") {\n          userMessage += \"\\n  → Check network connectivity to SSH server\";\n          userMessage += \"\\n  → Verify SSH host and port are correct\";\n        } else if (err.code === \"ENOTFOUND\") {\n          userMessage += \"\\n  → SSH host address could not be resolved\";\n        } else if (err.code === \"ECONNREFUSED\") {\n          userMessage += \"\\n  → SSH server refused connection (check if SSH service is running)\";\n        }\n\n        reject(new Error(userMessage));\n      });\n\n      this.client.on(\"end\", () => {\n        logger.debug(\"SSH connection ended\");\n      });\n\n      this.client.on(\"close\", () => {\n        logger.debug(\"SSH connection closed\");\n      });\n\n      // Set connection timeout\n      sshOptions.readyTimeout = 20000; // 20 seconds timeout\n      sshOptions.keepaliveInterval = 10000; // Send keepalive every 10s\n      sshOptions.keepaliveCountMax = 3; // Max 3 missed keepalives\n\n      // Connect to SSH server\n      logger.info(\n        `Connecting to SSH server ${sshConfig.host}:${sshConfig.port} as ${sshConfig.username}`,\n      );\n      logger.debug(\n        `SSH connection options: ${JSON.stringify({ ...sshOptions, privateKey: sshOptions.privateKey ? \"[REDACTED]\" : undefined, password: sshOptions.password ? \"[REDACTED]\" : undefined })}`,\n      );\n\n      try {\n        this.client.connect(sshOptions);\n      } catch (error) {\n        const errorMsg =\n          error instanceof Error ? error.message : \"Unknown error\";\n        logger.error(`Failed to initiate SSH connection: ${errorMsg}`);\n        reject(new Error(`SSH connection failed: ${errorMsg}`));\n      }\n    });\n  }\n\n  /**\n   * Close SSH tunnel and all active connections\n   */\n  public async close(): Promise<void> {\n    logger.info(\"Closing SSH tunnel\");\n\n    // Close all active forwarded connections\n    for (const connection of this.connections) {\n      connection.end();\n    }\n    this.connections.clear();\n\n    // Close local server first (before SSH client)\n    if (this.server) {\n      await new Promise<void>((resolve) => {\n        // Force close after timeout if graceful close hangs\n        const timeout = setTimeout(() => {\n          logger.warn(\"Tunnel server close timeout, forcing shutdown\");\n          this.server = null;\n          resolve();\n        }, 2000);\n\n        this.server!.close((err) => {\n          clearTimeout(timeout);\n          if (err) {\n            logger.warn(`Tunnel server close error: ${err.message}`);\n          } else {\n            logger.debug(\"Tunnel server closed\");\n          }\n          this.server = null;\n          resolve();\n        });\n\n        // Destroy all sockets to force close\n        this.server!.unref();\n      });\n    }\n\n    // Then close SSH client\n    if (this.client) {\n      this.client.end();\n      this.client = null;\n      logger.debug(\"SSH client closed\");\n    }\n\n    logger.debug(\"SSH tunnel cleanup complete\");\n  }\n}\n","import { DatabaseFactory } from \"./DatabaseFactory\";\nimport {\n  DatabaseConfig,\n  DatabaseConnection,\n  DatabaseType,\n} from \"../core/types/DatabaseTypes\";\nimport { CliConfig } from \"../core/types/CliTypes\";\nimport {\n  DEFAULT_PORTS,\n  DEFAULT_TIMEOUTS,\n  DEFAULT_POOL_SETTINGS,\n} from \"../common/constants/DatabaseConstants\";\nimport { SSHTunnel, TunnelResult } from \"../common/ssh/SSHTunnel\";\nimport logger from \"../common/config/LogConfig\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\n\n/**\n * Purpose: Adapter between CLI layer and database layer\n * - Converts CLI config format to internal DatabaseConfig format\n * - Manages connection state for CLI commands\n * - Handles connection lifecycle (connect/disconnect)\n * - Resolves config from URL or config.json\n *\n * Responsibilities:\n * - CLI config → DatabaseConfig conversion\n * - Connection state management\n * - Config source resolution (URL vs config.json)\n * - Connection cleanup\n *\n * Does NOT handle:\n * - Database adapter creation (delegated to DatabaseFactory)\n * - Config file loading (delegated to ConfigManager)\n * - Query execution (handled by commands)\n */\nexport class DatabaseConnectionHandler {\n  private factory: DatabaseFactory;\n  private connection: DatabaseConnection | null = null;\n  private actualConfig: CliConfig | null = null;\n  private sshTunnel: SSHTunnel | null = null;\n  private tunnelResult: TunnelResult | null = null;\n\n  constructor(factory?: DatabaseFactory) {\n    this.factory = factory || new DatabaseFactory();\n  }\n\n  /**\n   * Extract database configuration from CliConfig\n   * @param cliConfig CLI configuration\n   * @returns Extracted database configuration values\n   */\n  private extractDatabaseConfig(cliConfig: CliConfig): {\n    type: DatabaseType;\n    host: string;\n    port: number;\n    user: string;\n    password: string;\n    database: string;\n  } {\n    if (!cliConfig.database) {\n      throw new Error(\"Invalid configuration: missing database section\");\n    }\n\n    return {\n      type: cliConfig.database.type,\n      host: cliConfig.database.host,\n      port: cliConfig.database.port || 3306,\n      user: cliConfig.database.user,\n      password: cliConfig.database.password,\n      database: cliConfig.database.name,\n    };\n  }\n\n  /**\n   * Convert CLI config to internal DatabaseConfig format\n   * @param cliConfig CLI configuration\n   * @returns DatabaseConfig for internal use\n   */\n  private convertToInternalConfig(cliConfig: CliConfig): DatabaseConfig {\n    const extracted = this.extractDatabaseConfig(cliConfig);\n    const baseConfig = {\n      type: extracted.type,\n      host: extracted.host,\n      port: extracted.port,\n      user: extracted.user,\n      password: extracted.password,\n      database: extracted.database,\n    };\n\n    // Add type-specific configurations\n    switch (extracted.type) {\n      case DatabaseType.MARIADB:\n        return {\n          ...baseConfig,\n          type: DatabaseType.MARIADB,\n          acquireTimeout:\n            cliConfig.database?.acquireTimeout ?? DEFAULT_TIMEOUTS.ACQUIRE,\n          timeout: cliConfig.database?.timeout ?? DEFAULT_TIMEOUTS.QUERY,\n          reconnect: cliConfig.database?.reconnect ?? true,\n        };\n      case DatabaseType.MYSQL:\n        return {\n          ...baseConfig,\n          type: DatabaseType.MYSQL,\n          connectionLimit: DEFAULT_POOL_SETTINGS.CONNECTION_LIMIT,\n          acquireTimeout:\n            cliConfig.database?.acquireTimeout ?? DEFAULT_TIMEOUTS.ACQUIRE,\n          timeout: cliConfig.database?.timeout ?? DEFAULT_TIMEOUTS.QUERY,\n          reconnect: cliConfig.database?.reconnect ?? true,\n        };\n      case DatabaseType.POSTGRESQL:\n        return {\n          ...baseConfig,\n          type: DatabaseType.POSTGRESQL,\n          max: DEFAULT_POOL_SETTINGS.MAX_CONNECTIONS,\n          connectionTimeoutMillis:\n            cliConfig.database?.acquireTimeout ?? DEFAULT_TIMEOUTS.ACQUIRE,\n        };\n      default:\n        throw new Error(`Unsupported database type: ${extracted.type}`);\n    }\n  }\n\n  /**\n   * Connect to database using CLI configuration or config.json\n   * @param cliConfig CLI configuration (can be empty to use config.json)\n   * @returns Promise that resolves when connected\n   */\n  async connect(cliConfig: CliConfig): Promise<void> {\n    try {\n      let configToUse: CliConfig;\n      let internalConfig: DatabaseConfig;\n\n      // If config is empty (no URL provided), use config.json\n      if (this.isEmptyConfig(cliConfig)) {\n        configToUse = await this.loadConfigFromFile();\n        this.actualConfig = configToUse;\n      } else {\n        configToUse = cliConfig;\n        this.actualConfig = cliConfig;\n      }\n\n      // Check if SSH tunnel is needed\n      if (configToUse.ssh?.enable) {\n        logger.info(\"SSH tunnel enabled, creating tunnel connection\");\n        internalConfig = await this.connectWithSSHTunnel(configToUse);\n      } else {\n        internalConfig = this.convertToInternalConfig(configToUse);\n      }\n\n      // Create database connection (possibly through SSH tunnel)\n      this.connection = await this.factory.createConnection(internalConfig);\n    } catch (error) {\n      // Clean up SSH tunnel if connection failed\n      if (this.tunnelResult) {\n        await this.tunnelResult.close();\n        this.tunnelResult = null;\n        this.sshTunnel = null;\n      }\n      throw new Error(\n        `Failed to connect to database: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n      );\n    }\n  }\n\n  /**\n   * Connect to database through SSH tunnel\n   * @param cliConfig CLI configuration with SSH settings\n   * @returns Database configuration with tunnel endpoints\n   */\n  private async connectWithSSHTunnel(\n    cliConfig: CliConfig,\n  ): Promise<DatabaseConfig> {\n    if (!cliConfig.ssh || !cliConfig.database) {\n      throw new Error(\"SSH and database configuration required for tunneling\");\n    }\n\n    // Create SSH tunnel\n    this.sshTunnel = new SSHTunnel();\n    this.tunnelResult = await this.sshTunnel.createTunnel({\n      sshConfig: cliConfig.ssh,\n      databaseHost: cliConfig.database.host,\n      databasePort:\n        cliConfig.database.port || DEFAULT_PORTS[cliConfig.database.type],\n    });\n\n    logger.info(\n      `SSH tunnel established: localhost:${this.tunnelResult.localPort} -> ${cliConfig.database.host}:${cliConfig.database.port || DEFAULT_PORTS[cliConfig.database.type]}`,\n    );\n\n    // Create modified config pointing to tunnel\n    const modifiedCliConfig: CliConfig = {\n      ...cliConfig,\n      database: {\n        ...cliConfig.database,\n        host: this.tunnelResult.localHost,\n        port: this.tunnelResult.localPort,\n      },\n    };\n\n    return this.convertToInternalConfig(modifiedCliConfig);\n  }\n\n  /**\n   * Load configuration from config.json file\n   * @returns CLI configuration from config.json\n   */\n  private async loadConfigFromFile(): Promise<CliConfig> {\n    try {\n      // Read config.json directly to get all sections (log, ssh, database)\n      const homeDir = os.homedir();\n      const mdbConfigPath = path.join(homeDir, \".mdb\", \"config.json\");\n      const cwdConfigPath = path.join(process.cwd(), \"config.json\");\n\n      let configPath: string;\n      if (fs.existsSync(mdbConfigPath)) {\n        configPath = mdbConfigPath;\n      } else if (fs.existsSync(cwdConfigPath)) {\n        configPath = cwdConfigPath;\n      } else {\n        throw new Error(\n          \"config.json not found in ~/.mdb/ or current directory\",\n        );\n      }\n\n      const configData = fs.readFileSync(configPath, \"utf8\");\n      const fullConfig = JSON.parse(configData);\n\n      // Validate that we have the database section\n      if (!fullConfig.database || typeof fullConfig.database !== \"object\") {\n        throw new Error(\n          'Invalid config.json: missing \"database\" section. Expected nested format.',\n        );\n      }\n\n      // Use ConfigManager only for database config validation\n      const configManager = this.factory.getConfigManager();\n      const dbConfig = configManager.getConfig();\n\n      // Build CliConfig with all sections from file\n      const cliConfig: CliConfig = {\n        database: {\n          type: dbConfig.type,\n          host: dbConfig.host,\n          port: dbConfig.port || DEFAULT_PORTS[dbConfig.type],\n          user: dbConfig.user,\n          password: dbConfig.password,\n          name: dbConfig.database,\n        },\n      };\n\n      // Add database-specific optional fields\n      if (\"acquireTimeout\" in dbConfig)\n        cliConfig.database!.acquireTimeout = dbConfig.acquireTimeout;\n      if (\"timeout\" in dbConfig)\n        cliConfig.database!.timeout = dbConfig.timeout;\n      if (\"reconnect\" in dbConfig)\n        cliConfig.database!.reconnect = dbConfig.reconnect;\n      if (\"connectionLimit\" in dbConfig)\n        cliConfig.database!.connectionLimit = dbConfig.connectionLimit;\n      if (\"max\" in dbConfig) cliConfig.database!.max = dbConfig.max;\n\n      // Add log config from full config file\n      if (fullConfig.log && typeof fullConfig.log === \"object\") {\n        cliConfig.log = fullConfig.log;\n        logger.debug(\"Log configuration loaded from config.json\");\n      }\n\n      // Add SSH config from full config file\n      if (fullConfig.ssh && typeof fullConfig.ssh === \"object\") {\n        cliConfig.ssh = fullConfig.ssh;\n        logger.info(\n          `SSH configuration loaded: ${fullConfig.ssh.enable ? \"enabled\" : \"disabled\"}`,\n        );\n      }\n\n      return cliConfig;\n    } catch (error) {\n      throw new Error(\n        `Failed to load config.json: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n      );\n    }\n  }\n\n  /**\n   * Get the actual configuration being used (from URL or config.json)\n   * @returns Current configuration\n   */\n  getActualConfig(): CliConfig | null {\n    return this.actualConfig;\n  }\n\n  /**\n   * Check if CLI config is empty (indicates to use config.json)\n   * @param cliConfig CLI configuration\n   * @returns true if config is empty\n   */\n  private isEmptyConfig(cliConfig: CliConfig): boolean {\n    if (!cliConfig.database) {\n      return true;\n    }\n\n    return (\n      !cliConfig.database.type ||\n      !cliConfig.database.host ||\n      !cliConfig.database.user\n    );\n  }\n\n  /**\n   * Close the database connection and SSH tunnel\n   * @returns Promise that resolves when connection is closed\n   */\n  async disconnect(): Promise<void> {\n    // Close database connection first\n    if (this.connection) {\n      try {\n        if (this.connection.end) {\n          await this.connection.end();\n        } else if (this.connection.release) {\n          await this.connection.release();\n        }\n      } catch (error) {\n        logger.error(\n          `Error closing database connection: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n        );\n      } finally {\n        this.connection = null;\n      }\n    }\n\n    // Then close SSH tunnel if it exists\n    if (this.tunnelResult) {\n      try {\n        await this.tunnelResult.close();\n      } catch (error) {\n        logger.error(\n          `Error closing SSH tunnel: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n        );\n      } finally {\n        this.tunnelResult = null;\n        this.sshTunnel = null;\n      }\n    }\n  }\n\n  /**\n   * Get the current database connection\n   * @returns DatabaseConnection instance or null if not connected\n   */\n  getConnection(): DatabaseConnection | null {\n    return this.connection;\n  }\n}\n","#!/usr/bin/env node\n\nimport { Application } from \"./api/Application\";\n\n/**\n * CLI entry point for the MDB tool\n * Handles command line arguments and delegates to Application\n */\nasync function main(): Promise<void> {\n  const app = new Application();\n  app.initialize();\n\n  // Get command line arguments (skip 'node' and script name)\n  const args = process.argv.slice(2);\n\n  try {\n    await app.run(args);\n  } catch (error) {\n    console.error(\n      \"Fatal error:\",\n      error instanceof Error ? error.message : \"Unknown error\",\n    );\n    process.exit(1);\n  }\n}\n\n// Handle uncaught exceptions\nprocess.on(\"uncaughtException\", (error) => {\n  console.error(\"Uncaught Exception:\", error.message);\n  process.exit(1);\n});\n\n// Handle unhandled promise rejections\nprocess.on(\"unhandledRejection\", (reason, promise) => {\n  console.error(\"Unhandled Rejection at:\", promise, \"reason:\", reason);\n  process.exit(1);\n});\n\n// Run the application\nif (require.main === module) {\n  main().catch((error) => {\n    console.error(\"Application startup failed:\", error.message);\n    process.exit(1);\n  });\n}\n","import { ArgumentParser, ParsedArguments } from \"./parser/ArgumentParser\";\nimport { CommandResult } from \"../core/types/CliTypes\";\nimport logger from \"../common/config/LogConfig\";\nimport { ResultDisplay } from \"./display/ResultDisplay\";\nimport { FrontController } from \"./FrontController\";\n\n/**\n * Main CLI application class\n * Handles command execution and output formatting\n */\nexport class Application {\n  private readonly controller = new FrontController();\n  private readonly display = new ResultDisplay();\n\n  /**\n   * Run the CLI application with provided arguments\n   * @param args Command line arguments\n   * @returns Promise that resolves when execution is complete\n   */\n  public async run(args: string[]): Promise<void> {\n    try {\n      const parsed = ArgumentParser.parse(args);\n\n      if (parsed.helpRequested) {\n        this.display.help();\n        return;\n      }\n\n      const result = await this.executeCommand(parsed);\n      this.display.result(result);\n    } catch (error) {\n      const errorResult: CommandResult = {\n        success: false,\n        error:\n          error instanceof Error ? error.message : \"Unknown error occurred\",\n        timestamp: new Date().toISOString(),\n      };\n\n      this.display.result(errorResult);\n      process.exit(1);\n    }\n  }\n\n  /**\n   * Execute a command with the parsed arguments\n   * @param parsed Parsed command line arguments\n   * @returns Command execution result\n   */\n  private async executeCommand(\n    parsed: ParsedArguments,\n  ): Promise<CommandResult> {\n    try {\n      // Parse the command to handle different patterns\n      const commandInfo = ArgumentParser.parseCommand(\n        [parsed.command, ...parsed.commandArgs],\n        parsed.hasUrlDatabase,\n      );\n\n      // Use the final command name for registry lookup\n      const actualCommand = commandInfo.finalCommand;\n      const actualArgs = commandInfo.remainingArgs;\n\n      return this.controller.executeCommand(\n        actualCommand,\n        parsed.config,\n        actualArgs,\n      );\n    } catch (error) {\n      return {\n        success: false,\n        error:\n          error instanceof Error ? error.message : \"Command execution failed\",\n        timestamp: new Date().toISOString(),\n      };\n    }\n  }\n\n  /**\n   * Initialize the application\n   */\n  public initialize(): void {\n    process.on(\"SIGINT\", () => {\n      logger.info(\"Received SIGINT. Exiting gracefully...\");\n      process.exit(0);\n    });\n\n    process.on(\"SIGTERM\", () => {\n      logger.info(\"Received SIGTERM. Exiting gracefully...\");\n      process.exit(0);\n    });\n  }\n}\n","import { UrlParser } from \"./UrlParser\";\nimport { CliConfig } from \"../../core/types/CliTypes\";\n\n/**\n * Parsed CLI arguments structure\n */\nexport interface ParsedArguments {\n  config: CliConfig;\n  command: string;\n  commandArgs: string[];\n  helpRequested: boolean;\n  hasUrlDatabase: boolean; // Whether database is specified in URL\n}\n\n/**\n * Parsed command structure with context information\n */\nexport interface ParsedCommand {\n  primaryCommand: string;\n  databaseName?: string;\n  tableName?: string;\n  finalCommand: string;\n  remainingArgs: string[];\n}\n\n/**\n * CLI argument parser for the MDB tool\n * Handles command format: mdb {connection_url} {command} [args...]\n */\nexport class ArgumentParser {\n  // Command names\n  private static readonly COMMAND_INFO = \"info\";\n  private static readonly COMMAND_INDEX = \"index\";\n  private static readonly COMMAND_TABLES = \"tables\";\n  private static readonly COMMAND_TABLE_INFO = \"table-info\";\n\n  // Help flags\n  private static readonly HELP_FLAGS = [\"--help\", \"-h\"];\n\n  // Argument count thresholds\n  private static readonly MIN_URL_MODE_ARGS = 2;\n  private static readonly TABLE_COMMAND_ARGS = 2;\n  private static readonly DATABASE_TABLE_COMMAND_ARGS = 3;\n  /**\n   * Check if command is a table-related command (info or index)\n   */\n  private static isTableCommand(command: string): boolean {\n    return command === this.COMMAND_INFO || command === this.COMMAND_INDEX;\n  }\n\n  /**\n   * Convert 'info' command to internal 'table-info' command name\n   */\n  private static normalizeTableCommand(command: string): string {\n    return command === this.COMMAND_INFO ? this.COMMAND_TABLE_INFO : command;\n  }\n\n  /**\n   * Check if help was requested\n   */\n  private static isHelpRequested(args: string[]): boolean {\n    return (\n      args.length === 0 || this.HELP_FLAGS.some((flag) => args.includes(flag))\n    );\n  }\n\n  /**\n   * Parse command line arguments\n   * @param args Command line arguments (typically process.argv.slice(2))\n   * @returns Parsed arguments object\n   * @throws Error if arguments are invalid\n   */\n  public static parse(args: string[]): ParsedArguments {\n    // Check for help request\n    if (this.isHelpRequested(args)) {\n      return {\n        config: {} as CliConfig,\n        command: \"\",\n        commandArgs: [],\n        helpRequested: true,\n        hasUrlDatabase: false,\n      };\n    }\n\n    // Check if first argument is a connection URL or a command\n    if (args.length >= 1) {\n      const firstArg = args[0];\n\n      // If first argument looks like a URL, use URL mode\n      if (UrlParser.isValidFormat(firstArg)) {\n        return this.parseUrlMode(args);\n      } else {\n        // Otherwise, try config.json mode\n        return this.parseConfigMode(args);\n      }\n    }\n\n    throw new Error(\n      \"No arguments provided. Usage: mdb {connection_url} {command} [args...] or mdb {command} [args...] (with config.json)\",\n    );\n  }\n\n  /**\n   * Parse arguments in URL mode (with connection URL)\n   * @param args Command line arguments\n   * @returns Parsed arguments object\n   */\n  private static parseUrlMode(args: string[]): ParsedArguments {\n    if (args.length < this.MIN_URL_MODE_ARGS) {\n      throw new Error(\n        \"Insufficient arguments. Usage: mdb {connection_url} {command} [args...]\",\n      );\n    }\n\n    const [connectionUrl, command, ...commandArgs] = args;\n\n    // Parse and validate connection URL\n    let config: CliConfig;\n    try {\n      config = UrlParser.parse(connectionUrl);\n    } catch (error) {\n      throw new Error(\n        `Invalid connection URL: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n      );\n    }\n\n    // Validate command\n    if (!command || command.trim().length === 0) {\n      throw new Error(\n        \"Command is required. Usage: mdb {connection_url} {command} [args...]\",\n      );\n    }\n\n    return {\n      config,\n      command: command.trim(),\n      commandArgs,\n      helpRequested: false,\n      hasUrlDatabase: true, // Database is in URL\n    };\n  }\n\n  /**\n   * Parse arguments in config.json mode (without connection URL)\n   * @param args Command line arguments\n   * @returns Parsed arguments object\n   */\n  private static parseConfigMode(args: string[]): ParsedArguments {\n    const [command, ...commandArgs] = args;\n\n    // Validate command\n    if (!command || command.trim().length === 0) {\n      throw new Error(\n        \"Command is required. Usage: mdb {command} [args...] (with config.json)\",\n      );\n    }\n\n    // Load config from config.json - will be handled by DatabaseConnectionHandler\n    return {\n      config: {} as CliConfig, // Empty config signals to use config.json\n      command: command.trim(),\n      commandArgs,\n      helpRequested: false,\n      hasUrlDatabase: false, // Database from config.json or args\n    };\n  }\n\n  /**\n   * Validate if the provided arguments follow the expected format\n   * @param args Command line arguments\n   * @returns true if format is valid\n   */\n  public static isValidFormat(args: string[]): boolean {\n    try {\n      this.parse(args);\n      return true;\n    } catch {\n      return false;\n    }\n  }\n\n  /**\n   * Parse simple command (single argument)\n   */\n  private static parseSimpleCommand(command: string): ParsedCommand {\n    return {\n      primaryCommand: command,\n      finalCommand: command,\n      remainingArgs: [],\n    };\n  }\n\n  /**\n   * Parse table command in URL mode: \"{table_name} {info|index}\"\n   */\n  private static parseUrlModeTableCommand(\n    tableName: string,\n    command: string,\n  ): ParsedCommand {\n    const normalizedCommand = this.normalizeTableCommand(command);\n    return {\n      primaryCommand: normalizedCommand,\n      tableName,\n      finalCommand: normalizedCommand,\n      remainingArgs: [tableName],\n    };\n  }\n\n  /**\n   * Parse database command in config mode: \"{database_name} tables\"\n   */\n  private static parseConfigModeDatabaseCommand(\n    databaseName: string,\n  ): ParsedCommand {\n    return {\n      primaryCommand: this.COMMAND_TABLES,\n      databaseName,\n      finalCommand: this.COMMAND_TABLES,\n      remainingArgs: [databaseName],\n    };\n  }\n\n  /**\n   * Parse table command in config mode: \"{table_name} {info|index}\"\n   */\n  private static parseConfigModeTableCommand(\n    tableName: string,\n    command: string,\n  ): ParsedCommand {\n    const normalizedCommand = this.normalizeTableCommand(command);\n    return {\n      primaryCommand: normalizedCommand,\n      tableName,\n      finalCommand: normalizedCommand,\n      remainingArgs: [tableName],\n    };\n  }\n\n  /**\n   * Parse full table command in config mode: \"{database_name} {table_name} {info|index}\"\n   */\n  private static parseConfigModeFullTableCommand(\n    databaseName: string,\n    tableName: string,\n    command: string,\n  ): ParsedCommand {\n    const normalizedCommand = this.normalizeTableCommand(command);\n    return {\n      primaryCommand: normalizedCommand,\n      databaseName,\n      tableName,\n      finalCommand: normalizedCommand,\n      remainingArgs: [databaseName, tableName],\n    };\n  }\n\n  /**\n   * Check if argument is a flag (starts with - or --)\n   */\n  private static isFlag(arg: string): boolean {\n    return arg.startsWith(\"-\");\n  }\n\n  /**\n   * Separate flags from positional arguments\n   */\n  private static separateFlags(args: string[]): {\n    positional: string[];\n    flags: string[];\n  } {\n    const positional: string[] = [];\n    const flags: string[] = [];\n\n    for (const arg of args) {\n      if (this.isFlag(arg)) {\n        flags.push(arg);\n      } else {\n        positional.push(arg);\n      }\n    }\n\n    return { positional, flags };\n  }\n\n  /**\n   * Parse command in URL mode (database already in URL)\n   */\n  private static parseUrlModeCommand(args: string[]): ParsedCommand {\n    const { positional, flags } = this.separateFlags(args);\n\n    if (positional.length === 1) {\n      return {\n        ...this.parseSimpleCommand(positional[0]),\n        remainingArgs: [...positional.slice(1), ...flags],\n      };\n    }\n\n    if (positional.length === this.TABLE_COMMAND_ARGS) {\n      const [tableName, command] = positional;\n      if (this.isTableCommand(command)) {\n        const parsed = this.parseUrlModeTableCommand(tableName, command);\n        return {\n          ...parsed,\n          remainingArgs: [...parsed.remainingArgs, ...flags],\n        };\n      }\n    }\n\n    throw new Error(\n      \"Invalid command format for URL mode. Expected: {command} or {table_name} {info|index} [--flags]\",\n    );\n  }\n\n  /**\n   * Parse command in config mode (database from config.json or arguments)\n   */\n  private static parseConfigModeCommand(args: string[]): ParsedCommand {\n    const { positional, flags } = this.separateFlags(args);\n\n    if (positional.length === 1) {\n      return {\n        ...this.parseSimpleCommand(positional[0]),\n        remainingArgs: [...positional.slice(1), ...flags],\n      };\n    }\n\n    if (positional.length === this.TABLE_COMMAND_ARGS) {\n      const [firstArg, secondArg] = positional;\n\n      // \"{database_name} tables\"\n      if (secondArg === this.COMMAND_TABLES) {\n        const parsed = this.parseConfigModeDatabaseCommand(firstArg);\n        return {\n          ...parsed,\n          remainingArgs: [...parsed.remainingArgs, ...flags],\n        };\n      }\n\n      // \"{table_name} info/index\" with config.json database\n      if (this.isTableCommand(secondArg)) {\n        const parsed = this.parseConfigModeTableCommand(firstArg, secondArg);\n        return {\n          ...parsed,\n          remainingArgs: [...parsed.remainingArgs, ...flags],\n        };\n      }\n\n      // Generic two-argument pattern\n      return {\n        primaryCommand: firstArg,\n        finalCommand: secondArg,\n        remainingArgs: [firstArg, ...flags],\n      };\n    }\n\n    if (positional.length >= this.DATABASE_TABLE_COMMAND_ARGS) {\n      const [databaseName, tableName, command, ...rest] = positional;\n\n      // \"{database_name} {table_name} {info|index}\"\n      if (this.isTableCommand(command)) {\n        const parsed = this.parseConfigModeFullTableCommand(\n          databaseName,\n          tableName,\n          command,\n        );\n        return {\n          ...parsed,\n          remainingArgs: [...parsed.remainingArgs, ...flags],\n        };\n      }\n\n      // Generic three+ argument pattern\n      return {\n        primaryCommand: databaseName,\n        databaseName: tableName,\n        tableName: command,\n        finalCommand: command,\n        remainingArgs: [databaseName, tableName, ...rest, ...flags],\n      };\n    }\n\n    throw new Error(\"Invalid command format\");\n  }\n\n  /**\n   * Parse command with context-aware argument handling\n   * Some commands need database_name and table_name context\n   * @param args Raw command arguments\n   * @param hasUrlDatabase Whether database is already specified in URL\n   * @returns Structured command information\n   */\n  public static parseCommand(\n    args: string[],\n    hasUrlDatabase: boolean = false,\n  ): ParsedCommand {\n    if (args.length === 0) {\n      throw new Error(\"No command specified\");\n    }\n\n    // URL mode: database in URL -> simpler command patterns\n    // Config mode: database from config.json/args -> more complex patterns\n    return hasUrlDatabase\n      ? this.parseUrlModeCommand(args)\n      : this.parseConfigModeCommand(args);\n  }\n}\n","import { CliConfig } from \"../../core/types/CliTypes\";\nimport { DatabaseType } from \"../../core/types/DatabaseTypes\";\n\n/**\n * Parses database connection URL string into configuration object\n * Format: {db_type}://{username}:{password}@{host_name}:{port}/{db_name}\n * Supported: mariadb, mysql, postgresql\n */\nexport class UrlParser {\n  private static readonly URL_PATTERN =\n    /^(mariadb|mysql|postgresql):\\/\\/([^:]+):([^@]+)@([^:]+):(\\d+)\\/(.+)$/;\n\n  /**\n   * Parse database URL string into CliConfig with database name\n   * @param url Database connection URL\n   * @returns Parsed configuration object with database in nested format\n   * @throws Error if URL format is invalid\n   */\n  static parse(url: string): CliConfig {\n    const match = url.match(this.URL_PATTERN);\n\n    if (!match) {\n      throw new Error(\n        \"Invalid database URL format. Expected: {mariadb|mysql|postgresql}://{username}:{password}@{host_name}:{port}/{db_name}\",\n      );\n    }\n\n    const [, type, user, password, host, portStr, database] = match;\n    const port = parseInt(portStr, 10);\n\n    if (isNaN(port) || port < 1 || port > 65535) {\n      throw new Error(\n        `Invalid port number: ${portStr}. Port must be between 1 and 65535.`,\n      );\n    }\n\n    // Return new nested format to match config.json structure\n    return {\n      database: {\n        type: type as DatabaseType,\n        host: this.decodeUrlComponent(host),\n        port,\n        user: this.decodeUrlComponent(user),\n        password: this.decodeUrlComponent(password),\n        name: this.decodeUrlComponent(database),\n      },\n    };\n  }\n\n  /**\n   * Validate if the URL format is correct\n   * @param url URL string to validate\n   * @returns true if URL format is valid\n   */\n  static isValidFormat(url: string): boolean {\n    return this.URL_PATTERN.test(url);\n  }\n\n  /**\n   * Decode URL component with proper error handling\n   * @param component URL component to decode\n   * @returns Decoded string\n   */\n  private static decodeUrlComponent(component: string): string {\n    try {\n      return decodeURIComponent(component);\n    } catch (_error) {\n      throw new Error(`Invalid URL encoding in component: ${component}`);\n    }\n  }\n}\n","import { HelpDisplay } from \"./HelpDisplay\";\nimport { CommandFactory } from \"../../core/CommandFactory\";\nimport { CommandResult } from \"../../core/types/CliTypes\";\n\nexport class ResultDisplay {\n  /**\n   * Display command execution result in JSON format\n   * @param result Command execution result\n   */\n  public result(result: CommandResult): void {\n    // Always output in JSON format as requested\n    console.log(JSON.stringify(result, null, 2));\n  }\n\n  /**\n   * Display help information\n   */\n  public help(): void {\n    const helpText = HelpDisplay.getUsage();\n\n    // For help, we output plain text instead of JSON\n    console.log(helpText);\n\n    // Also show available commands\n    console.log(\"\\nAVAILABLE COMMANDS:\");\n    const commands = CommandFactory.getAvailableCommands();\n\n    commands.forEach((cmd) => {\n      console.log(`  ${cmd.name.padEnd(10)} - ${cmd.description}`);\n    });\n  }\n}\n","export class HelpDisplay {\n  /**\n   * Generate usage help text\n   * @returns Help text string\n   */\n  public static getUsage(): string {\n    return `\nMDB - Database Management CLI Tool\n\nUSAGE:\n  URL Mode:    mdb {connection_url} {command} [options]\n  Config Mode: mdb {command} [args] [options]\n\nCONNECTION URL:\n  {mariadb|mysql|postgresql}://{user}:{pass}@{host}:{port}/{database}\n\nCOMMANDS:\n  init                              Initialize config.json in ~/.mdb/\n  info                              Show database server information\n  users                             List users and privileges\n  databases                         List all databases\n  tables [database] [--detail|-d]   List tables (--detail for full info)\n  {table} info                      Show table schema and constraints\n  {table} index                     Show table indexes\n\nOPTIONS:\n  --detail, -d    Show detailed information (tables command)\n  --help, -h      Show this help message\n\nEXAMPLES:\n  mdb init\n  mdb mariadb://root:pass@localhost:3306/mydb info\n  mdb tables --detail\n  mdb users_table info\n\nCONFIG (~/.mdb/config.json):\n  {\n    \"log\": { \"enable\": true, \"level\": \"info\" },\n    \"ssh\": { \"enable\": false },\n    \"database\": {\n      \"type\": \"mariadb\",\n      \"host\": \"localhost\",\n      \"port\": 3306,\n      \"user\": \"root\",\n      \"password\": \"password\",\n      \"name\": \"mydb\"\n    }\n  }\n\nOUTPUT:\n  All commands return JSON format (except --help)\n    `.trim();\n  }\n}\n","import { CommandRegistry } from \"./CommandRegistry\";\nimport { InfoCommand } from \"./usecase/InfoCommand\";\nimport { UsersCommand } from \"./usecase/UsersCommand\";\nimport { DatabasesCommand } from \"./usecase/DatabasesCommand\";\nimport { TablesCommand } from \"./usecase/TablesCommand\";\nimport { TableInfoCommand } from \"./usecase/TableInfoCommand\";\nimport { IndexCommand } from \"./usecase/IndexCommand\";\nimport { InitCommand } from \"./usecase/InitCommand\";\n\n/**\n * Factory class for creating and registering CLI commands\n * Follows OCP principle - new commands can be added by extending this factory\n */\nexport class CommandFactory {\n  /**\n   * Create and configure a command registry with all available commands\n   * @returns Configured CommandRegistry\n   */\n  public static createRegistry(): CommandRegistry {\n    return new CommandRegistry([\n      new InfoCommand(),\n      new UsersCommand(),\n      new DatabasesCommand(),\n\n      new TablesCommand(),\n      new TableInfoCommand(),\n      new IndexCommand(),\n      new InitCommand(),\n    ]);\n  }\n\n  /**\n   * Get list of available command names for help display\n   * @returns Array of command names with their descriptions\n   */\n  public static getAvailableCommands(): {\n    name: string;\n    description: string;\n    usage: string;\n  }[] {\n    const registry = this.createRegistry();\n    const helpInfo = registry.getCommandsInfo();\n\n    return Object.entries(helpInfo).map(([name, info]) => ({\n      name,\n      description: info.description,\n      usage: info.usage,\n    }));\n  }\n}\n","import { Command } from \"./types/CliTypes\";\n\n/**\n * Command registry for managing and dispatching CLI commands\n * Follows OCP principle - open for extension, closed for modification\n */\nexport class CommandRegistry {\n  private commands: Map<string, Command> = new Map();\n\n  public constructor(commands: Command[]) {\n    commands.forEach((command) => this.commands.set(command.name, command));\n  }\n\n  public get(commandName: string): Command | undefined {\n    return this.commands.get(commandName);\n  }\n\n  /**\n   * Get list of available command names\n   * @returns Array of command names\n   */\n  public getAvailableCommands(): string[] {\n    return Array.from(this.commands.keys()).sort();\n  }\n\n  /**\n   * Get help information for all commands\n   * @returns Help information object\n   */\n  public getCommandsInfo(): {\n    [commandName: string]: { description: string; usage: string };\n  } {\n    const help: {\n      [commandName: string]: { description: string; usage: string };\n    } = {};\n\n    this.commands.forEach((command, name) => {\n      help[name] = {\n        description: command.description,\n        usage: command.getUsage(),\n      };\n    });\n\n    return help;\n  }\n}\n","import { BaseCommand } from \"../BaseCommand\";\nimport { CliConfig, DatabaseInfo } from \"../types/CliTypes\";\nimport { DatabaseOperations } from \"../types/DatabaseOperations\";\n\n/**\n * Info command - Display database information\n * Usage: mdb {connection_url} info\n */\nexport class InfoCommand extends BaseCommand {\n  public readonly name = \"info\";\n  public readonly description = \"Display database server information\";\n\n  /**\n   * Execute the info command\n   * @param config Database configuration\n   * @param _args Command arguments\n   * @returns Database information\n   */\n  protected async executeCommand(\n    config: CliConfig,\n    _args: string[],\n  ): Promise<DatabaseInfo> {\n    return this.executeWithConnection(config, _args, async (connection) => {\n      this.validateOperation(connection, \"getDatabaseInfo\");\n      return await (connection as DatabaseOperations).getDatabaseInfo();\n    });\n  }\n\n  /**\n   * Validate command arguments\n   * @param _args Command arguments\n   * @returns true if valid\n   */\n  public validateArgs(_args: string[]): boolean {\n    // Info command takes no additional arguments\n    return true;\n  }\n\n  /**\n   * Get usage string\n   * @returns Usage information\n   */\n  public getUsage(): string {\n    return \"mdb {connection_url} info\";\n  }\n}\n","import { Command, CommandResult, CliConfig } from \"./types/CliTypes\";\nimport { DatabaseConnectionHandler } from \"../infra/DatabaseConnectionHandler\";\nimport { DatabaseConnection } from \"./types/DatabaseTypes\";\n\n/**\n * Abstract base class for all CLI commands\n * Implements common functionality and enforces OCP principle\n */\nexport abstract class BaseCommand implements Command {\n  public abstract readonly name: string;\n  public abstract readonly description: string;\n\n  /**\n   * Execute the command with the given configuration and arguments\n   * @param config Database configuration\n   * @param _args Command arguments\n   * @returns Command execution result\n   */\n  public async execute(\n    config: CliConfig,\n    _args: string[],\n  ): Promise<CommandResult> {\n    const timestamp = new Date().toISOString();\n\n    try {\n      if (!this.validateArgs(_args)) {\n        return {\n          success: false,\n          error: `Invalid arguments. Usage: ${this.getUsage()}`,\n          timestamp,\n        };\n      }\n\n      const result = await this.executeCommand(config, _args);\n\n      return {\n        success: true,\n        data: result,\n        timestamp,\n      };\n    } catch (error) {\n      return {\n        success: false,\n        error:\n          error instanceof Error ? error.message : \"Unknown error occurred\",\n        timestamp,\n      };\n    }\n  }\n\n  /**\n   * Execute command with database connection management (Template Method Pattern)\n   * Handles connection lifecycle automatically\n   * @param config Database configuration\n   * @param _args Command arguments\n   * @param operation Database operation to execute\n   * @returns Operation result\n   */\n  protected async executeWithConnection<T>(\n    config: CliConfig,\n    _args: string[],\n    operation: (\n      connection: DatabaseConnection,\n      actualConfig: CliConfig,\n    ) => Promise<T>,\n  ): Promise<T> {\n    const handler = new DatabaseConnectionHandler();\n\n    try {\n      await handler.connect(config);\n\n      const actualConfig = handler.getActualConfig();\n      if (!actualConfig) {\n        throw new Error(\"Failed to determine database configuration\");\n      }\n\n      const connection = handler.getConnection();\n      if (!connection) {\n        throw new Error(\"Failed to establish database connection\");\n      }\n\n      return await operation(connection, actualConfig);\n    } finally {\n      await handler.disconnect();\n    }\n  }\n\n  /**\n   * Validate that connection supports a specific operation\n   * @param connection Database connection\n   * @param operationName Name of the operation method\n   * @throws Error if operation is not supported\n   */\n  protected validateOperation(\n    connection: DatabaseConnection,\n    operationName: string,\n  ): void {\n    if (!(operationName in connection)) {\n      throw new Error(\n        `Connection does not support ${operationName} operations`,\n      );\n    }\n  }\n\n  /**\n   * Abstract method that subclasses must implement\n   * Contains the specific command logic\n   */\n  protected abstract executeCommand(\n    config: CliConfig,\n    _args: string[],\n  ): Promise<any>;\n\n  /**\n   * Validate command arguments\n   * Subclasses should override this method for specific validation\n   * @param _args Command arguments\n   * @returns true if arguments are valid\n   */\n  public validateArgs(_args: string[]): boolean {\n    return true; // Default: no validation\n  }\n\n  /**\n   * Get command usage string\n   * Subclasses should override this method\n   * @returns Usage string\n   */\n  public abstract getUsage(): string;\n}\n","import { BaseCommand } from \"../BaseCommand\";\nimport { CliConfig, UserInfo } from \"../types/CliTypes\";\nimport { DatabaseOperations } from \"../types/DatabaseOperations\";\n\n/**\n * Users command - Display user information including privileges\n * Usage: mdb {connection_url} users\n */\nexport class UsersCommand extends BaseCommand {\n  public readonly name = \"users\";\n  public readonly description = \"Display database users and their privileges\";\n\n  /**\n   * Execute the users command\n   * @param config Database configuration\n   * @param _args Command arguments\n   * @returns Array of user information\n   */\n  protected async executeCommand(\n    config: CliConfig,\n    _args: string[],\n  ): Promise<UserInfo[]> {\n    return this.executeWithConnection(config, _args, async (connection) => {\n      this.validateOperation(connection, \"getUsers\");\n      return await (connection as DatabaseOperations).getUsers();\n    });\n  }\n\n  /**\n   * Validate command arguments\n   * @param _args Command arguments\n   * @returns true if valid\n   */\n  public validateArgs(_args: string[]): boolean {\n    // Users command takes no additional arguments\n    return true;\n  }\n\n  /**\n   * Get usage string\n   * @returns Usage information\n   */\n  public getUsage(): string {\n    return \"mdb {connection_url} users\";\n  }\n}\n","import { BaseCommand } from \"../BaseCommand\";\nimport { CliConfig, DatabaseList } from \"../types/CliTypes\";\nimport { DatabaseOperations } from \"../types/DatabaseOperations\";\n\n/**\n * Database command - Display list of databases\n * Usage: mdb {connection_url} database\n */\nexport class DatabasesCommand extends BaseCommand {\n  public readonly name = \"databases\";\n  public readonly description = \"Display list of databases\";\n\n  /**\n   * Execute the database command\n   * @param config Database configuration\n   * @param args Command arguments\n   * @returns Array of database information\n   */\n  protected async executeCommand(\n    config: CliConfig,\n    args: string[],\n  ): Promise<DatabaseList[]> {\n    return this.executeWithConnection(config, args, async (connection) => {\n      this.validateOperation(connection, \"getDatabases\");\n      return await (connection as DatabaseOperations).getDatabases();\n    });\n  }\n\n  /**\n   * Get usage string\n   * @returns Usage information\n   */\n  public getUsage(): string {\n    return \"mdb {connection_url} database\";\n  }\n}\n","import { BaseCommand } from \"../BaseCommand\";\nimport { CliConfig, TableInfo } from \"../types/CliTypes\";\nimport { DatabaseOperations } from \"../types/DatabaseOperations\";\n\n/**\n * Tables command - Display list of tables in a database\n * Usage:\n *   URL mode: mdb {connection_url} tables [--detail|-d] (database from URL)\n *   Config mode: mdb {database_name} tables [--detail|-d] (database from args)\n */\nexport class TablesCommand extends BaseCommand {\n  public readonly name = \"tables\";\n  public readonly description =\n    \"Display list of tables in a database (use --detail or -d for detailed info)\";\n\n  /**\n   * Execute the tables command\n   * @param config Database configuration\n   * @param _args Command arguments [database_name] [--detail|-d]\n   * @returns Array of table names or table details\n   */\n  protected async executeCommand(\n    config: CliConfig,\n    _args: string[],\n  ): Promise<string[] | TableInfo[]> {\n    return this.executeWithConnection(\n      config,\n      _args,\n      async (connection, actualConfig) => {\n        this.validateOperation(connection, \"getTables\");\n\n        // Parse arguments to separate database name and flags\n        const { databaseName: argDbName, flags } = this.parseArguments(_args);\n\n        // Determine database name:\n        // 1. From _args (config mode with explicit database)\n        // 2. From config (URL or config.json)\n        let databaseName: string | undefined;\n        if (argDbName) {\n          databaseName = argDbName;\n        } else if (actualConfig.database) {\n          databaseName = actualConfig.database.name;\n        }\n\n        if (!databaseName) {\n          throw new Error(\n            \"Database name not specified. Provide in URL, config.json, or as argument.\",\n          );\n        }\n\n        // Check if detail flag is present\n        const showDetails = flags.includes(\"--detail\") || flags.includes(\"-d\");\n\n        if (showDetails) {\n          this.validateOperation(connection, \"getTablesWithDetails\");\n          return await (connection as DatabaseOperations).getTablesWithDetails(\n            databaseName,\n          );\n        } else {\n          return await (connection as DatabaseOperations).getTables(\n            databaseName,\n          );\n        }\n      },\n    );\n  }\n\n  /**\n   * Parse arguments to separate database name and flags\n   * @param _args Command arguments\n   * @returns Object with database name and flags\n   */\n  private parseArguments(_args: string[]): {\n    databaseName?: string;\n    flags: string[];\n  } {\n    const flags: string[] = [];\n    let databaseName: string | undefined;\n\n    for (const arg of _args) {\n      if (arg.startsWith(\"-\")) {\n        flags.push(arg);\n      } else if (!databaseName) {\n        databaseName = arg;\n      }\n    }\n\n    return { databaseName, flags };\n  }\n\n  /**\n   * Validate command arguments\n   * @param _args Command arguments\n   * @returns true if valid\n   */\n  public validateArgs(_args: string[]): boolean {\n    // Tables command can have:\n    // - 0 arguments (database from URL/config)\n    // - 1 argument (database name or --detail/-d flag)\n    // - 2 arguments (database name + --detail/-d flag)\n    if (_args.length === 0) return true;\n\n    // Check for valid flags\n    const validFlags = [\"--detail\", \"-d\"];\n    for (const arg of _args) {\n      if (arg.startsWith(\"-\") && !validFlags.includes(arg)) {\n        return false;\n      }\n    }\n\n    return _args.length <= 2;\n  }\n\n  /**\n   * Get usage string\n   * @returns Usage information\n   */\n  public getUsage(): string {\n    return \"URL mode: mdb {connection_url} tables [--detail|-d] | Config mode: mdb {database_name} tables [--detail|-d]\";\n  }\n}\n","import { BaseCommand } from \"../BaseCommand\";\nimport { CliConfig, TableSchemaInfo } from \"../types/CliTypes\";\nimport { DatabaseOperations } from \"../types/DatabaseOperations\";\n\n/**\n * Table Info command - Display detailed table schema information\n * Usage:\n *   URL mode: mdb {connection_url} {table_name} info (database from URL)\n *   Config mode: mdb {database_name} {table_name} info (database from args)\n */\nexport class TableInfoCommand extends BaseCommand {\n  public readonly name = \"table-info\";\n  public readonly description = \"Display detailed table schema information\";\n\n  /**\n   * Execute the table info command\n   * @param config Database configuration\n   * @param _args Command arguments [table_name] or [database_name, table_name]\n   * @returns Complete table schema information\n   */\n  protected async executeCommand(\n    config: CliConfig,\n    _args: string[],\n  ): Promise<TableSchemaInfo> {\n    return this.executeWithConnection(\n      config,\n      _args,\n      async (connection, actualConfig) => {\n        this.validateOperation(connection, \"getTableInfo\");\n\n        // Determine table name based on _args length:\n        // 1 arg (URL mode): [table_name] - database from URL/config\n        // 2 _args (Config mode): [database_name, table_name]\n        let tableName: string;\n\n        if (_args.length === 1) {\n          // URL mode or config mode with default database\n          tableName = _args[0];\n          if (!actualConfig.database) {\n            throw new Error(\n              \"Database name not specified. Provide in URL, config.json, or as argument.\",\n            );\n          }\n        } else {\n          // Config mode with explicit database - use second arg as table name\n          tableName = _args[1];\n        }\n\n        return await (connection as DatabaseOperations).getTableInfo(tableName);\n      },\n    );\n  }\n\n  /**\n   * Validate command arguments\n   * @param _args Command arguments\n   * @returns true if valid\n   */\n  public validateArgs(_args: string[]): boolean {\n    // Table info command can have:\n    // 1 arg (URL mode): [table_name]\n    // 2 _args (Config mode): [database_name, table_name]\n    if (_args.length === 1) {\n      return _args[0].trim().length > 0;\n    }\n    if (_args.length === 2) {\n      return _args[0].trim().length > 0 && _args[1].trim().length > 0;\n    }\n    return false;\n  }\n\n  /**\n   * Get usage string\n   * @returns Usage information\n   */\n  public getUsage(): string {\n    return \"URL mode: mdb {connection_url} info | Config mode: mdb {table_name} info\";\n  }\n}\n","import { BaseCommand } from \"../BaseCommand\";\nimport { CliConfig, IndexInfo } from \"../types/CliTypes\";\nimport { DatabaseOperations } from \"../types/DatabaseOperations\";\n\n/**\n * Index command - Display index information for a table\n * Usage:\n *   URL mode: mdb {connection_url} {table_name} index [--all]\n *   Config mode: mdb {database_name} {table_name} index [--all]\n *\n * By default, only secondary indexes are shown (PRIMARY key excluded).\n * Use --all flag to include all indexes including PRIMARY key.\n */\nexport class IndexCommand extends BaseCommand {\n  public readonly name = \"index\";\n  public readonly description =\n    \"Display index information for a table (secondary indexes by default)\";\n\n  /**\n   * Execute the index command\n   * @param config Database configuration\n   * @param _args Command arguments [table_name] or [database_name, table_name] with optional --all flag\n   * @returns Array of index information\n   */\n  protected async executeCommand(\n    config: CliConfig,\n    _args: string[],\n  ): Promise<IndexInfo[]> {\n    return this.executeWithConnection(\n      config,\n      _args,\n      async (connection, actualConfig) => {\n        this.validateOperation(connection, \"getIndexes\");\n\n        // Check for --all flag\n        const includeAll = _args.includes(\"--all\");\n        const filteredArgs = _args.filter((arg) => arg !== \"--all\");\n\n        // Determine table name based on filtered _args length:\n        // 1 arg (URL mode): [table_name] - database from URL/config\n        // 2 _args (Config mode): [database_name, table_name]\n        let tableName: string;\n\n        if (filteredArgs.length === 1) {\n          // URL mode or config mode with default database\n          tableName = filteredArgs[0];\n          if (!actualConfig.database) {\n            throw new Error(\n              \"Database name not specified. Provide in URL, config.json, or as argument.\",\n            );\n          }\n        } else {\n          // Config mode with explicit database - use second arg as table name\n          tableName = filteredArgs[1];\n        }\n\n        return await (connection as DatabaseOperations).getIndexes(\n          tableName,\n          includeAll,\n        );\n      },\n    );\n  }\n\n  /**\n   * Validate command arguments\n   * @param _args Command arguments\n   * @returns true if valid\n   */\n  public validateArgs(_args: string[]): boolean {\n    const filteredArgs = _args.filter((arg) => arg !== \"--all\");\n\n    // Index command can have:\n    // 1 arg (URL mode): [table_name]\n    // 2 _args (Config mode): [database_name, table_name]\n    if (filteredArgs.length === 1) {\n      return filteredArgs[0].trim().length > 0;\n    }\n    if (filteredArgs.length === 2) {\n      return (\n        filteredArgs[0].trim().length > 0 && filteredArgs[1].trim().length > 0\n      );\n    }\n    return false;\n  }\n\n  /**\n   * Get usage string\n   * @returns Usage information\n   */\n  public getUsage(): string {\n    return \"mdb {connection_url} {table_name} index [--all] | mdb {database_name} {table_name} index [--all]\";\n  }\n}\n","import { BaseCommand } from \"../BaseCommand\";\nimport { CliConfig, CommandResult } from \"../types/CliTypes\";\nimport { DatabaseType } from \"../types/DatabaseTypes\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport { read } from \"read\";\n\n/**\n * Init command - Initialize MDB configuration\n * Creates ~/.mdb/config.json with user-provided database credentials\n */\nexport class InitCommand extends BaseCommand {\n  public readonly name = \"init\";\n  public readonly description = \"Initialize MDB configuration\";\n\n  /**\n   * Prompt user for input using read package\n   */\n  private async question(prompt: string): Promise<string> {\n    const answer = await read({\n      prompt: prompt,\n      silent: false,\n    });\n    return (answer || \"\").trim();\n  }\n\n  /**\n   * Prompt user for password with masking using read package\n   */\n  private async questionPassword(prompt: string): Promise<string> {\n    const password = await read({\n      prompt: prompt,\n      silent: true,\n      replace: \"*\",\n    });\n    return password || \"\";\n  }\n\n  /**\n   * Execute the init command\n   */\n  protected async executeCommand(\n    _config: CliConfig,\n    _args: string[],\n  ): Promise<any> {\n      console.log(\"\\n🚀 MDB Configuration Initialization\\n\");\n      console.log(\n        \"This will create a configuration file at ~/.mdb/config.json\\n\",\n      );\n\n      // Get home directory and config path\n      const homeDir = os.homedir();\n      const mdbDir = path.join(homeDir, \".mdb\");\n      const configPath = path.join(mdbDir, \"config.json\");\n\n      // Check if config already exists\n      if (fs.existsSync(configPath)) {\n        const overwrite = await this.question(\n          \"⚠️  Configuration file already exists. Overwrite? (y/N): \",\n        );\n        if (\n          overwrite.toLowerCase() !== \"y\" &&\n          overwrite.toLowerCase() !== \"yes\"\n        ) {\n          console.log(\"❌ Initialization cancelled.\");\n          return { message: \"Initialization cancelled\" };\n        }\n      }\n\n      // Prompt for database configuration\n      console.log(\"\\nPlease provide your database connection details:\\n\");\n\n      const dbType = await this.question(\n        \"Database type (mariadb/mysql/postgresql) [mariadb]: \",\n      );\n      const type = dbType || \"mariadb\";\n\n      if (![\"mariadb\", \"mysql\", \"postgresql\"].includes(type)) {\n        throw new Error(\n          `Invalid database type: ${type}. Must be mariadb, mysql, or postgresql`,\n        );\n      }\n\n      const host = (await this.question(\"Host [localhost]: \")) || \"localhost\";\n\n      const portStr = await this.question(\n        `Port [${type === \"postgresql\" ? \"5432\" : \"3306\"}]: `,\n      );\n      const port = portStr\n        ? parseInt(portStr)\n        : type === \"postgresql\"\n          ? 5432\n          : 3306;\n\n      if (isNaN(port) || port < 1 || port > 65535) {\n        throw new Error(\"Invalid port number\");\n      }\n\n      const user = (await this.question(\"Username [root]: \")) || \"root\";\n      const password = await this.questionPassword(\"Password: \");\n      const database = await this.question(\"Database name: \");\n\n      if (!database) {\n        throw new Error(\"Database name is required\");\n      }\n\n      // Create configuration object with enhanced structure\n      const configuration: CliConfig = {\n        log: {\n          enable: true,\n          level: \"info\" as \"info\",\n        },\n        ssh: {\n          enable: false,\n          host: \"\",\n          port: 22,\n          username: \"\",\n          password: \"\",\n          privateKeyPath: \"\",\n        },\n        database: {\n          type: type as DatabaseType,\n          host,\n          port,\n          user,\n          password,\n          name: database,\n          acquireTimeout: 60000,\n          timeout: 60000,\n          reconnect: true,\n        },\n      };\n\n      // Create .mdb directory if it doesn't exist\n      if (!fs.existsSync(mdbDir)) {\n        fs.mkdirSync(mdbDir, { recursive: true });\n        console.log(`\\n✅ Created directory: ${mdbDir}`);\n      }\n\n      // Write configuration file\n      fs.writeFileSync(\n        configPath,\n        JSON.stringify(configuration, null, 2),\n        \"utf8\",\n      );\n      console.log(`✅ Configuration saved to: ${configPath}\\n`);\n\n      // Test connection\n      console.log(\"🔍 Testing database connection...\\n\");\n\n      try {\n        const { DatabaseConnectionHandler } = await import(\n          \"../../infra/DatabaseConnectionHandler\"\n        );\n        const handler = new DatabaseConnectionHandler();\n\n        await handler.connect(configuration);\n        console.log(\"✅ Database connection successful!\\n\");\n        await handler.disconnect();\n\n        console.log(\n          \"🎉 Initialization complete! You can now use MDB commands without specifying connection details.\\n\",\n        );\n        console.log(\"Example commands:\");\n        console.log(\"  mdb info\");\n        console.log(\"  mdb tables\");\n        console.log(\"  mdb users\");\n        console.log();\n      } catch (error) {\n        console.log(\"⚠️  Configuration saved, but connection test failed:\");\n        console.log(\n          `   ${error instanceof Error ? error.message : \"Unknown error\"}\\n`,\n        );\n        console.log(\n          \"Please verify your database credentials and try connecting again.\\n\",\n        );\n      }\n\n      return {\n        config_path: configPath,\n        configuration: {\n          ...configuration,\n          password: \"***hidden***\", // Don't show password in output\n        },\n      };\n  }\n\n  /**\n   * Execute command (override to handle special formatting)\n   */\n  public async execute(\n    config: CliConfig,\n    _args: string[],\n  ): Promise<CommandResult> {\n    const timestamp = new Date().toISOString();\n\n    try {\n      const result = await this.executeCommand(config, _args);\n\n      return {\n        success: true,\n        data: result,\n        timestamp,\n      };\n    } catch (error) {\n      return {\n        success: false,\n        error:\n          error instanceof Error ? error.message : \"Unknown error occurred\",\n        timestamp,\n      };\n    }\n  }\n\n  /**\n   * Validate command arguments (init takes no arguments)\n   */\n  public validateArgs(_args: string[]): boolean {\n    return true; // Init command accepts no arguments\n  }\n\n  /**\n   * Get usage string\n   */\n  public getUsage(): string {\n    return \"mdb init\";\n  }\n}\n","import { CommandFactory } from \"../core/CommandFactory\";\nimport { CliConfig, CommandResult } from \"../core/types/CliTypes\";\n\nexport class FrontController {\n  private registry = CommandFactory.createRegistry();\n\n  /**\n   * Execute a command by name\n   * @param commandName Name of the command to execute\n   * @param config Database configuration\n   * @param args Command arguments\n   * @returns Command execution result\n   */\n  public async executeCommand(\n    commandName: string,\n    config: CliConfig,\n    args: string[],\n  ): Promise<CommandResult> {\n    const command = this.registry.get(commandName);\n\n    if (!command) {\n      return {\n        success: false,\n        error: `Unknown command: ${commandName}. Available commands: ${this.registry.getAvailableCommands().join(\", \")}`,\n        timestamp: new Date().toISOString(),\n      };\n    }\n\n    return await command.execute(config, args);\n  }\n}\n"],"mappings":"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","names":["winston","DatabaseType","fs","path","os","fs","path","os","fs","path","os","DatabaseConnectionHandler"]}