Fixed
- Inspector separator no longer bleeds into toolbar area with default connection color (#228)
- Inspector toggle no longer lags due to synchronous UserDefaults writes during animation (#229)
Added
- Direct
.tablepluginbundle installation via file picker, Finder double-click, and drag-and-drop - Plugin capability enforcement — registration now gated on declared capabilities, with validation warnings for mismatches
- Plugin dependency declarations — plugins can declare required dependencies via
TableProPlugin.dependencies, validated at load time - Plugin state change notification (
pluginStateDidChange) posted when plugins are enabled/disabled - Restart recommendation banner in Settings > Plugins after uninstalling a plugin
- Startup commands — run custom SQL after connecting (e.g., SET time_zone) in Connection > Advanced tab
- Plugin system architecture — all 8 database drivers (MySQL, PostgreSQL, SQLite, ClickHouse, MSSQL, MongoDB, Redis, Oracle) extracted into
.tablepluginbundles loaded at runtime - Export format plugins — all 5 export formats (CSV, JSON, SQL, XLSX, MQL) extracted into
.tablepluginbundles with plugin-provided option views and per-table option columns - Settings > Plugins tab for plugin management — list installed plugins, enable/disable, install from file, uninstall user plugins, view plugin details
- Plugin marketplace — browse, search, and install plugins from the GitHub-hosted registry with SHA-256 checksum verification, ETag caching, and offline fallback
- TableProPluginKit framework — shared protocols and types for driver and export plugins
- ClickHouse database support with query progress tracking, EXPLAIN variants, TLS/HTTPS, server-side cancellation, and Parts view
Changed
- Reduce memory: eliminate dedicated ping driver (~30-50 MB per connection), use main driver for health checks
- Reduce memory: evict inactive native window-tab row data after 5s, re-fetch on focus
- Reduce memory: lazy-load plugin bundles on first use instead of at startup (~20-30 MB saved)
- Reduce memory: remove duplicate sourceQuery string from RowBuffer
- Reduce memory: InMemoryRowProvider references RowBuffer directly instead of copying rows (~3-10 MB per tab)
- Reduce memory: eliminate metadata driver entirely, multiplex all queries on main driver (~30-50 MB per connection)
- Reduce memory: lazy AIChatViewModel initialization (deferred until AI panel is first opened)
- Reduce memory: remove duplicate connections array from ContentView (use ConnectionStorage.shared directly)
- Reduce CPU: consolidate per-editor NSEvent monitors into shared EditorEventRouter singleton (O(n) → O(1) per event)
- Fix tab persistence: aggregate tabs from all windows at quit time instead of last-write-wins per-coordinator save
- Split DatabaseManager.sessionVersion into fine-grained connectionListVersion and connectionStatusVersion to reduce cascade re-renders
- Extract AppState property reads into local lets in view bodies for explicit granular observation tracking
- Reorganized project directory structure: Services, Utilities, Models split into domain-specific subdirectories
- Database driver code moved from monolithic app binary into independent plugin bundles under
Plugins/