* feat(step): add shared types for step-through sessions
* feat(step): add statement parser with line-range metadata and DDL detection
* feat(step): add StepSessionRegistry with state machine and lifecycle management
Implements the session registry that holds open DB clients across user-pause gaps,
managing state transitions (paused/running/errored/done) for multi-statement step-through.
Also fixes root test script and excludes pre-broken sqlite native module tests from vitest.
* feat(step): add IPC handlers and wire session registry to app lifecycle
* fix(step): widen state type to avoid stale TS narrowing in continue()
* feat(step): expose step IPC via window.api.step
* feat(step): add Zustand store for step-through session state
* feat(step): add ribbon component with progress, controls, and keyboard shortcuts
* feat(step): add pinned + current results tab strip
* feat(step): wire Step button, ribbon, decorations, and breakpoint gutter
* fix(step): register Monaco commands for keybindings + sync cursor from server
Replace window-level keydown listener for Cmd+Shift+Enter with a Monaco
addAction registration so it takes precedence over Monaco's built-in Shift+Enter
handling. Also adds in-session Shift+Enter (next) and Escape (stop) as Monaco
actions, active only while a step session is running.
Add cursorIndex to all step response types (NextStepResponse, SkipStepResponse,
ContinueStepResponse, RetryStepResponse) and populate it from the server in
step-session.ts. The store now uses the server-provided value instead of
computing cursorIndex + 1 on the client, eliminating the 0/3 counter drift bug.
* fix(notebook): index result rows by column name
Rows from window.api.db.query are Record<string, unknown>[], not unknown[][].
ResultTable was calling row.map, throwing TypeError at runtime.
* feat(notebook): syntax highlighting via Monaco SQLEditor
Replace plain textarea/pre with the existing SQLEditor in compact mode
so notebook SQL cells get syntax highlighting, autocomplete (schemas,
keywords, functions), and the same theme as the main query editor.
Editor height grows with content up to 400px.
Pinned results are stored as unknown[][] but the renderer now indexes
rows by column name, so convert in both directions when pinning and
when rendering pinned snapshots.
* feat(notebook): drag-to-reorder cells with dnd-kit
Wrap the cells map in DndContext + SortableContext (vertical strategy)
and make NotebookCell sortable. Drag listeners attach only to the grip
button so Monaco editor pointer events keep working. Calls existing
reorderCells store action on drop, persisting the new order.
* fix(step): propagate real errors, clean up failed starts, harden cleanup
- Extend IPC response types with SessionSnapshot base + error fields
- start() wraps connect+BEGIN with cleanup on failure (prevents connection leak)
- continue() catch logs + sets errored state (no more silent swallows)
- executeCurrent logs errors and includes them in response
- stop() reports rollbackError so UI can surface ROLLBACK failures
- before-quit preventsDefault + awaits cleanup (3s timeout)
- parse-statements fallback path logs, computes correct endLine, stops silent drift
- Replace 'Query failed' placeholder in store with actual error message
- stoppedAt is now number | null (no more -1 sentinel)
* fix(step): renderer polish — toasts, Escape hijack, monaco bundle size
- Gate Step button and Monaco action to postgresql-only connections
- Toast on all IPC failures in step-store (replaces console.error)
- Surface ROLLBACK errors from stop() via destructive toast
- Roll back optimistic breakpoint state on setBreakpoints IPC failure
- Remove global Escape keydown listener (Monaco already handles it)
- Remove 'monaco-editor' namespace import; use onMount's monaco arg instead
(drops ~1-2MB from renderer bundle)
* test(step): add coverage for critical gaps
- start() cleanup on connect/BEGIN failure
- Empty/whitespace SQL rejection without creating a client
- Concurrent next() race (may reveal known limitation)
- Continue with breakpoint at current cursor (skip-own-breakpoint semantics)
- stop() idempotency
- retry() state guards (paused, done)
- skip on last statement transitions to done
- Parser: dollar-quoted blocks with internal semicolons
- Parser: duplicate statement bodies get distinct lines
- Parser: CRLF line endings
- Parser: no trailing semicolon on last statement
* feat(intel): add Schema Intel one-click diagnostics surface
Introduces a new "Schema Intel" tab that runs a configurable set of
read-only diagnostic queries against the active connection and surfaces
actionable findings (tables without PKs, missing FK indexes, duplicate /
unused / invalid indexes, bloated tables, never-vacuumed tables,
nullable FKs). Each finding includes a human-readable title, detail,
and — where possible — a suggested SQL fix that can be copied or opened
in a new query tab.
The feature ships a DatabaseAdapter.runSchemaIntel method with
implementations for PostgreSQL (full check set), MySQL (core checks
over information_schema), and MSSQL (tables without PK); SQLite is
stubbed and returns skipped entries.
Accessible from the sidebar's Automation & Monitoring group when a
connection is active.
https://claude.ai/code/session_01BitYEUsn3DiiT8LAgQdwUV
* chore: fix pre-existing typecheck and lint errors
- Rename unused filter callback param in sidebar-omnibar to `_value` so
it clears TS6133 under `noUnusedParameters`.
- Teach the desktop ESLint config to ignore underscore-prefixed
arguments / variables / caught errors / destructured array entries,
which is the convention already used throughout the codebase
(e.g. `(theme, _background) => ...` in health-monitor).
After this commit the desktop workspace typechecks and lints with 0
errors.
https://claude.ai/code/session_01BitYEUsn3DiiT8LAgQdwUV
* fix: let query errors propagate to orchestrator skip list
Remove try/catch from safeRun (renamed to runQuery) in all three
schema-intel adapters so that permission failures, missing extensions,
and syntax errors bubble up to the per-check try/catch in the
orchestrator and appear in the skipped array.
Also remove unused SchemaIntelBadge export.
* fix: apply CodeRabbit auto-fixes
Fixed 2 file(s) based on 3 unresolved review comments.
Co-authored-by: CodeRabbit <noreply@coderabbit.ai>
---------
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: pullfrog[bot] <226033991+pullfrog[bot]@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: CodeRabbit <noreply@coderabbit.ai>
* feat(notebooks): add shared types for notebooks and cells
* feat(notebooks): add SQLite storage layer with full CRUD
Implements NotebookStorage class backed by better-sqlite3 with WAL mode,
foreign-key cascading deletes, and full CRUD for notebooks and cells.
* feat(notebooks): add IPC handlers for notebook CRUD
* feat(notebooks): add preload bridge for notebook IPC
* feat(notebooks): add NotebookTab type and createNotebookTab action
Adds 'notebook' to TabType union, NotebookTab interface, notebookId to
PersistedTab, createNotebookTab action with deduplication, persistence
handling, and notebook type guards in tab-query-editor.tsx.
* feat(notebooks): add Zustand store for notebook state management
* feat(notebooks): add NotebookEditor component and wire into TabContainer
* feat(notebooks): add sidebar section for browsing and creating notebooks
* feat(notebooks): add export functions for .dpnb and Markdown formats
* feat(notebooks): add NotebookCell component and dependencies
Add react-markdown and remark-gfm for markdown cell rendering.
NotebookCell handles SQL execution, markdown rendering, result
pinning, and keyboard shortcuts.
* fix: address review feedback for SQL notebooks
- Wrap JSON.parse in try/catch for corrupt pinned_result data
- Fix IPC type mismatches: update/duplicate/updateCell return actual data
- Remove non-functional Run All button from notebook editor
- Replace confirm() dialog with immediate delete + toast notification
- Remove dead notebook placeholder branch in tab-query-editor
- Remove duplicate react-markdown/remark-gfm from root package.json
* chore: lock files
* docs(notebooks): add feature docs, demo runbook, and nav entry
- SQL Notebooks feature documentation page for docs site
- Demo runbook .dpnb file for ACME SaaS health checks
- Add sql-notebooks to features navigation
* content(notebooks): add release notes, social posts, and 3 blog posts
- Release notes for v0.20.0 (SQL Notebooks)
- Social media posts (Twitter, Reddit, Dev.to)
- Blog 11: Feature announcement
- Blog 12: Storage architecture deep dive
- Blog 13: Lazy-loading Monaco in notebook cells
* content(notebooks): add Threads posts and posting strategy
4 Threads posts: launch carousel thread, technical behind-the-scenes,
runbook showcase, and conversation starter. Includes posting cadence
and format tips.
* docs(notebooks): add demo recording script
* feat(video): add release video and demo video for SQL Notebooks
- ReleaseVideo020: 24s release announcement (4 feature scenes)
- NotebookDemo: 45s feature walkthrough with animated notebook mockup
showing cells typing in, queries executing, results sliding in,
keyboard navigation, and export formats
* feat(video): add new background music for notebook videos
Screen Saver by Kevin MacLeod (CC BY 4.0) as primary track,
Equatorial Complex as alternative. Both compositions updated
to use the new track.
* fix: apply CodeRabbit auto-fixes
Fixed 5 file(s) based on 5 unresolved review comments.
Co-authored-by: CodeRabbit <noreply@coderabbit.ai>
---------
Co-authored-by: pullfrog[bot] <226033991+pullfrog[bot]@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: CodeRabbit <noreply@coderabbit.ai>
The panel had no surface for connection health: the main process
silently auto-reconnected but the renderer never learned about it,
isConnected got stuck true, and there was no way to trigger a reconnect.
- Broadcast PgNotificationConnectionStatus over pg-notify:status with
state, retry attempt, next retry time, backoff, and last error
- Add forceReconnect() + IPC handlers (pg-notify:reconnect, get-status,
get-all-statuses) and preload bridge
- Replace boolean isConnected with a per-connection status map in the
renderer store; hydrate on init
- New PgNotificationStatusStrip: terminal-style vitals row with pulsing
state dot, pg_notify@host, channel count, live rx rate, uptime, a
30s canvas sparkline of event rate, retry countdown + progress bar,
and a Retry now button when disconnected or reconnecting
- Flash new events with a 2px emerald left border and row fade
- Drop the now-redundant Stats collapsible (live in the strip)
All motion is motion-safe gated and under 600ms.
Copy 9 remaining components (alert-dialog, chart, checkbox, collapsible,
command, context-menu, progress, sidebar, switch) to packages/ui and
update all 92 desktop files to import from @data-peek/ui instead of
local @/components/ui/* paths.
* feat(postgres): add pg_dump/pg_restore import and export with managed connections
Co-authored-by: Rohith <gillarohith1@gmail.com>
* Address review feedback: fix bugs and improve export/import
- Scope cancel tokens per webContents ID instead of module-level singletons
- Move SQL escape utilities to packages/shared to eliminate duplication
- Stream export SQL directly to file instead of buffering in memory
- Sanitize dataBatchSize to prevent SQL injection via IPC
- Fix statement filter to preserve statements with leading comments
- Use SAVEPOINTs when both useTransaction and onError=skip are active
* fix: resolve export/import bugs and merge conflicts
- Fix merge conflicts in renderer stores index
- Fix array_agg parsing errors in pg-export.ts
- Refactor pg-import.ts to stream huge SQL dumps to prevent OOM errors
- Add stream-based sql statement parser
---------
Co-authored-by: tembo[bot] <208362400+tembo[bot]@users.noreply.github.com>
Co-authored-by: Rohith <gillarohith1@gmail.com>
Co-authored-by: pullfrog[bot] <226033991+pullfrog[bot]@users.noreply.github.com>
- Remove dead code and unsafe casts in handleEnvironmentSelect
- Replace IIFE with derived variable for accent strip
- Use proper import type instead of inline import()
- Fix semicolon consistency in shared types
- Format all changed files
* docs: add design spec for 6 new features
Column Statistics, Data Masking, CSV Import, Data Generator,
DB Notifications, and Connection Health Monitor.
* docs: update spec with review fixes
Resolve all 15 review issues: naming conflicts, preload layer,
batch insert interface, guard clauses, confirmation dialogs, etc.
* docs: add implementation plan for 6 features
Fix critical issues from review: adapter connection pattern,
preload event subscription pattern, tab interface definitions,
ColumnStatsRequest type, and implementation notes.
* feat: add column statistics panel (Tasks 1.1-1.8)
Implement the Column Statistics feature allowing users to right-click a
column header and view min/max/nulls/distinct/histogram in a right sidebar
panel. Supports PostgreSQL (full implementation with median + histogram),
MySQL (CASE WHEN histogram, no median), and MSSQL (NTILE histogram +
PERCENTILE_CONT median). Includes shared types, IPC handler, Zustand
store, stats panel UI, and DataTable integration via onColumnStatsClick.
* feat: add Data Masking feature (renderer-only)
Adds blur-based data masking so users can hide sensitive columns during
demos, screenshots, and pair programming. Entirely renderer-only — no
IPC or main process changes.
- masking-store: Zustand store with manual per-tab masking, auto-mask
rules (email/password/ssn/token etc.), hover-to-peek, and persist
middleware for rules/settings only (runtime maskedColumns not persisted)
- masking-toolbar: dropdown UI for toggling auto-mask, managing rules,
adding custom regex patterns, and unmasking all columns for a tab
- data-table: accepts optional tabId, shows lock icon on masked headers,
adds Mask/Unmask to column dropdown, applies blur(5px) + userSelect:none
to masked cells with alt-hover peek support
- editable-data-table: same masking UX; masked cells block editing
- tab-query-editor: wires tabId into DataTable, renders MaskingToolbar
near Export, intercepts exports when masked columns are present and
shows an AlertDialog to confirm exporting with [MASKED] values
* feat(csv-import): implement CSV import feature (Tasks 3.1-3.5)
- Add shared types: CsvColumnMapping, CsvImportOptions, CsvImportRequest,
CsvImportProgress, CsvImportResult, BatchInsertOptions, BatchInsertResult
- Install papaparse for CSV parsing in renderer
- Create batch-insert.ts: parameterized INSERT with per-dialect placeholder
syntax (pg: $1/$2, mysql: ?, mssql: @p1/@p2), ON CONFLICT handling, and
cancellation support
- Add import-handlers.ts IPC handler for db:import-csv and db:import-cancel;
progress events pushed via event.sender.send('db:import-progress')
- Add import-store.ts Zustand store with 5-step wizard state, type inference
for new tables (integer/numeric/timestamp/boolean/text), and auto-mapping
- Create csv-import-dialog.tsx Sheet dialog: file drop zone, target selection,
column mapping, options (batch size/conflict/truncate/transaction), and
progress/result step
- Add "Import CSV" to schema explorer table context menu (both virtualized
and non-virtualized paths)
* feat: add Data Generator feature (Tasks 4.1-4.5)
Adds schema-aware fake data generation using @faker-js/faker. Users can
open a data-generator tab from the schema explorer context menu on any
table, configure per-column generators (faker, random-int/float/bool/date,
uuid, auto-increment, fk-reference, fixed, null), preview 5 sample rows,
and insert up to 10 000 rows in configurable batches with live progress.
- packages/shared: GeneratorType, ColumnGenerator, DataGenConfig,
DataGenProgress, DataGenResult types
- main: data-generator.ts engine with heuristics + faker dispatch
- main: data-gen-handlers.ts IPC for generate, cancel, preview
- preload + preload d.ts: generateData, cancelGenerate, generatePreview,
onGenerateProgress on window.api.db
- stores: DataGeneratorTab type added to tab-store; data-gen-store for
per-tab generator state and actions
- renderer: data-generator.tsx UI; schema-explorer "Generate Data" menu
item; tab-query-editor dispatch for data-generator tab type
* feat: add PostgreSQL LISTEN/NOTIFY dashboard (Chunk 5)
Implements a full LISTEN/NOTIFY panel for PostgreSQL connections:
- Shared types: PgNotificationEvent, PgNotificationChannel, PgNotificationStats
- Main process: dedicated pg.Client listener per connection with SSH tunnel
support, auto-reconnect with exponential backoff, and SQLite event history
(capped at 10k events per connection)
- IPC handlers under pg-notify: prefix; cleanup on app quit
- Preload: pgNotify namespace exposing subscribe/unsubscribe/send/getChannels/
getHistory/clearHistory/onEvent
- Store: usePgNotificationStore with rolling 60s stats and in-memory event cap
- Tab type: pg-notifications added to TabType union with deduplication
- UI: channel subscription bar, scrollable event log with JSON highlighting,
collapsible send panel and stats; PostgreSQL-only guard
- Sidebar: Notifications entry visible only for PostgreSQL connections
* feat(shared): add health monitor types (Task 6.1)
Add ActiveQuery, TableSizeInfo, CacheStats, LockInfo, and
DatabaseSizeInfo types to the shared package for IPC contract.
* feat(adapters): implement health monitor queries (Task 6.2)
Add getActiveQueries, getTableSizes, getCacheStats, getLocks, and
killQuery to DatabaseAdapter interface with implementations for
PostgreSQL, MySQL, MSSQL, and SQLite stub.
* feat(ipc): add health monitor IPC handlers (Task 6.3)
Register IPC handlers for db:active-queries, db:table-sizes,
db:cache-stats, db:locks, and db:kill-query channels.
* feat(preload): expose health monitor API to renderer (Task 6.4)
Add health namespace to preload bridge with activeQueries, tableSizes,
cacheStats, locks, and killQuery methods plus type declarations.
* feat(store): add health monitor Zustand store (Task 6.5)
Create useHealthStore with polling, fetch actions for all health
metrics, and kill query support.
* feat(ui): add health monitor dashboard tab (Task 6.6)
Add HealthMonitor component with 4-panel dashboard: active queries
with kill support, table sizes with sorting, cache hit ratios with
color coding, and lock/blocking detection. Integrate into tab system
and sidebar navigation.
* chore: apply prettier formatting
* fix: resolve empty block statement lint errors
* fix: add column stats to editable table and fix masking infinite loop
Column statistics dropdown now available in table preview (editable)
mode. Fixed MaskingToolbar infinite re-render caused by creating a new
empty array reference on every store snapshot.
* docs: update README, features, roadmap, and marketing site for 6 new features
Add Column Statistics, Data Masking, CSV Import, Data Generator,
Connection Health Monitor, and PostgreSQL Notifications to all
documentation and the marketing website features grid.
* Apply suggestions from code review
Co-authored-by: tembo[bot] <208362400+tembo[bot]@users.noreply.github.com>
---------
Co-authored-by: tembo[bot] <208362400+tembo[bot]@users.noreply.github.com>
* fix: Add SSL certificate verification options for cloud databases
Support disabling SSL certificate verification for AWS RDS, Azure, and other cloud databases where certificate verification fails through VPN connections.
- Add SSLConnectionOptions interface with rejectUnauthorized and ca options
- Update PostgresAdapter to use configurable SSL options
- Update MySQLAdapter for consistent SSL handling
- Add UI toggle to enable/disable server certificate verification
- Include helpful description about when to disable verification
Fixes#94
* fix: improve SSL configuration error handling and add CA certificate input
- Add proper error handling when CA certificate file cannot be read
(previously failed silently, now throws descriptive error)
- Add CA certificate path input field in connection dialog UI
- Make SSL default behavior explicit with rejectUnauthorized: true
* fix(telemetry): respect connection overhead toggle in benchmark stats
The MIN/MAX/AVG/P90/P95/P99 stats were not updating when the "Conn.
overhead" toggle was changed. Now stats are recalculated to exclude
TCP and DB handshake phases when the toggle is off.
Fixes#100
* fix(telemetry): adjust timeline phase offsets when hiding connection overhead
The timeline visualization was broken when connection overhead was hidden
because phase startOffset values weren't being adjusted. Now subtracts
connection phase durations from start offsets for proper timeline scaling.
* refactor(telemetry): move percentile and stdDev to shared package
Extracted calcPercentile and calcStdDev functions to @data-peek/shared
to avoid code drift between main process (telemetry-collector.ts) and
renderer process (telemetry-panel.tsx). Also fixed getConnectionOverheadMs
to use the phases variable with proper benchmark fallback.
* feat: add connection duplication, materialized view support, and autocomplete keywords
- Add duplicate button to connection dropdown for quick connection cloning
- Add materialized view support to PostgreSQL adapter with column fetching
- Display materialized views in schema explorer with teal styling and mview badge
- Add filter toggle for materialized views in schema explorer
- Add SQL keywords: MATERIALIZED, REFRESH, CONCURRENTLY, DATA for autocomplete
* test: add tests for materialized views and connection duplication
- Add TableInfo type tests for materialized_view support
- Add schema explorer filtering tests for materialized views
- Add SQL keywords tests verifying MATERIALIZED, REFRESH, CONCURRENTLY, DATA
- Add connection duplication logic tests
* fix: correct window title and add dynamic Window menu
- Change HTML title from "Electron" to "Data Peek" so windows show
correct name in taskbar/dock when right-clicking
- Add dynamic Window menu that lists all open windows
- Windows can be focused from the menu by clicking on them
- Menu updates automatically when windows are created, closed, or focused
- Fix test import paths and use correct type values
* feat: add materialized views for enhanced data analytics
- Introduced multiple materialized views to aggregate and summarize key metrics, including monthly revenue, organization metrics, user activity, API key usage, subscription health, event analytics, feature flag rollout, and project activity.
- Each view is designed to optimize data retrieval for dashboards and reporting, improving performance and insights for users.
- Created unique and standard indexes for efficient querying of the materialized views.
* refactor: address code review feedback for materialized views PR
- Use formatted data_type instead of udt_name for materialized view columns
- Simplify isNullable check to boolean comparison only
- Extract SQL_KEYWORDS to shared constants file to eliminate duplication
- Add error handling to connection duplication with try/catch
- Add @/ alias to vitest config for test resolution
---------
Co-authored-by: Claude <noreply@anthropic.com>
* feat: improve user experience based on feedback
Schema Explorer:
- Add schema focus feature for Supabase users with many default schemas
- Users can now focus on a single schema, filtering out all others
Edit Mode:
- Fix enum data type handling by adding enumValues to ColumnInfo
- Add multiline text editor for long text columns (opens automatically for content >100 chars or multiline)
- Add expand button to open multiline editor for any text column
Dashboards:
- Fix widget configuration not showing up (Configure menu item was not wired)
- Add EditWidgetDialog that shows all options in a single view
- Add SQL autocompletion in widget SQL editor using Monaco
- Add quick data preview table in widget configuration
- Consolidate widget creation into single-view instead of step-by-step flow
* feat: redesign add widget dialog with single-page layout and data preview
- Convert multi-step wizard to single-page form for faster configuration
- Add live data preview table showing query results (first 5 rows)
- Fix duplicate LIMIT clause bug when previewing queries
- Fix keyboard shortcuts intercepting input in dialogs
- Improve UI with compact inputs, segmented controls, and better spacing
- Add SQL autocompletion support via schema context
---------
Co-authored-by: Claude <noreply@anthropic.com>
- Add ScheduledQuery and ScheduledQueryRun types to shared package
- Create scheduler service in main process with cron-parser for scheduling
- Add IPC handlers for scheduled queries CRUD operations
- Update preload to expose scheduled queries API
- Create Zustand store for scheduled queries state management
- Add UI components:
- ScheduledQueriesDialog for listing and managing schedules
- ScheduledQueryFormDialog for creating/editing schedules
- ScheduledQueryRunsDialog for viewing run history
- ScheduledQueries sidebar component
- Support schedule presets (every minute, hourly, daily, etc.) and custom cron
- Include desktop notifications on completion/error
- Store run history with configurable retention
* feat: add SQLite database support
Implement SQLite adapter using better-sqlite3 library:
- Create SQLiteAdapter class implementing DatabaseAdapter interface
- Support all database operations: query, queryMultiple, execute, executeTransaction
- Implement schema discovery using SQLite PRAGMAs (table_info, foreign_key_list, index_list)
- Add SQLite type normalization (INTEGER, TEXT, REAL, BLOB affinities)
- Support EXPLAIN QUERY PLAN for query analysis
- Add comprehensive unit tests for SQLite adapter
- Update query-tracker to handle SQLite (synchronous, non-cancellable)
- Enhance AI service with SQLite-specific SQL guidelines
Note: SQLite uses 'main' as the default schema and doesn't support
sequences or custom types - these methods return empty arrays.
* feat: add SQLite to connection dialog UI
- Add SQLiteIcon component to database-icons.tsx
- Add SQLite button to database type selector (now 4-column grid)
- Show SQLite-specific form with only database file path input
- Hide host, port, user, password fields for SQLite
- Disable SSH/SSL options when SQLite is selected
- Update validation to only require database path for SQLite
* feat: add libSQL/Turso adapter for remote SQLite connections
- Add LibSQLAdapter for connecting to Turso and libSQL databases
- Update db-adapter to route libsql mode connections to LibSQLAdapter
- Extend connection dialog UI with libsql mode selection
- Add libsql-client dependency
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat: simplify SQLite to local file-only, remove libSQL/Turso temporarily
Remove @libsql/client dependency due to native module bundling issues
with electron-vite. SQLite now only supports local file-based databases.
Changes:
- Remove @libsql/client from package.json
- Delete libsql-adapter.ts
- Update db-adapter.ts to remove libSQL routing
- Simplify connection dialog to only show file path input for SQLite
- Add "coming soon" note for Turso/libSQL support
- Simplify SQLiteMode type to just "local"
Turso/libSQL support will be re-added once native module bundling
issues are resolved.
---------
Add comprehensive query performance telemetry feature:
- Phase-based timing collection (TCP handshake, DB handshake, planning, execution, download, parse)
- Benchmark mode to run queries N times (10, 50, 100, 500 runs)
- Statistical analysis with min, max, avg, p90, p95, p99, and standard deviation
- Two visualization modes: proportional bars and timeline waterfall
- Timeline view shows actual execution flow with time axis markers
- Toggle for connection overhead phases visibility
- Per-tab telemetry state management via Zustand store
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>