@libredb/studio 0.9.7 → 0.9.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-34YQUUCM.mjs +319 -0
- package/dist/chunk-34YQUUCM.mjs.map +1 -0
- package/dist/chunk-4LVB3K53.mjs +37 -0
- package/dist/chunk-4LVB3K53.mjs.map +1 -0
- package/dist/chunk-6DRZXXNT.mjs +100 -0
- package/dist/chunk-6DRZXXNT.mjs.map +1 -0
- package/dist/chunk-CZVV3JJB.mjs +160 -0
- package/dist/chunk-CZVV3JJB.mjs.map +1 -0
- package/dist/chunk-D4WVWWWF.js +332 -0
- package/dist/chunk-D4WVWWWF.js.map +1 -0
- package/dist/chunk-DY3KXE44.mjs +3 -0
- package/dist/chunk-DY3KXE44.mjs.map +1 -0
- package/dist/chunk-DZ2UB3C6.mjs +6679 -0
- package/dist/chunk-DZ2UB3C6.mjs.map +1 -0
- package/dist/chunk-FYSE52VB.js +242 -0
- package/dist/chunk-FYSE52VB.js.map +1 -0
- package/dist/chunk-G4WYE6TI.js +4 -0
- package/dist/chunk-G4WYE6TI.js.map +1 -0
- package/dist/chunk-JOGLIOFO.js +1310 -0
- package/dist/chunk-JOGLIOFO.js.map +1 -0
- package/dist/chunk-JZO5KRZN.js +165 -0
- package/dist/chunk-JZO5KRZN.js.map +1 -0
- package/dist/chunk-KV356UXJ.js +253 -0
- package/dist/chunk-KV356UXJ.js.map +1 -0
- package/dist/chunk-PPODO6HX.mjs +237 -0
- package/dist/chunk-PPODO6HX.mjs.map +1 -0
- package/dist/chunk-PTIRB2JO.js +258 -0
- package/dist/chunk-PTIRB2JO.js.map +1 -0
- package/dist/chunk-Q6LRDBK7.js +42 -0
- package/dist/chunk-Q6LRDBK7.js.map +1 -0
- package/dist/chunk-QJP5FZRY.mjs +255 -0
- package/dist/chunk-QJP5FZRY.mjs.map +1 -0
- package/dist/chunk-R3POCJK6.mjs +248 -0
- package/dist/chunk-R3POCJK6.mjs.map +1 -0
- package/dist/chunk-RBVDMLFV.js +6747 -0
- package/dist/chunk-RBVDMLFV.js.map +1 -0
- package/dist/chunk-RCQB4FCE.js +186 -0
- package/dist/chunk-RCQB4FCE.js.map +1 -0
- package/dist/chunk-SR5DRGBX.mjs +174 -0
- package/dist/chunk-SR5DRGBX.mjs.map +1 -0
- package/dist/chunk-VLCRUZX7.js +102 -0
- package/dist/chunk-VLCRUZX7.js.map +1 -0
- package/dist/chunk-VWVRUCQO.mjs +1289 -0
- package/dist/chunk-VWVRUCQO.mjs.map +1 -0
- package/dist/components.d.mts +273 -0
- package/dist/components.d.ts +273 -0
- package/dist/components.js +59 -0
- package/dist/components.js.map +1 -0
- package/dist/components.mjs +6 -0
- package/dist/components.mjs.map +1 -0
- package/dist/custom-BNDOYC5P.js +134 -0
- package/dist/custom-BNDOYC5P.js.map +1 -0
- package/dist/custom-S2EKFMP3.mjs +132 -0
- package/dist/custom-S2EKFMP3.mjs.map +1 -0
- package/dist/gemini-4ASHNK4H.js +81 -0
- package/dist/gemini-4ASHNK4H.js.map +1 -0
- package/dist/gemini-C5RBLQEJ.mjs +79 -0
- package/dist/gemini-C5RBLQEJ.mjs.map +1 -0
- package/dist/index.d.mts +6 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +95 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +10 -0
- package/dist/index.mjs.map +1 -0
- package/dist/mongodb-XMZEZA4A.mjs +748 -0
- package/dist/mongodb-XMZEZA4A.mjs.map +1 -0
- package/dist/mongodb-YQJJTLX3.js +750 -0
- package/dist/mongodb-YQJJTLX3.js.map +1 -0
- package/dist/mssql-PMOU4D36.js +916 -0
- package/dist/mssql-PMOU4D36.js.map +1 -0
- package/{src/lib/db/providers/sql/mssql.ts → dist/mssql-ZH5VP2C5.mjs} +268 -423
- package/dist/mssql-ZH5VP2C5.mjs.map +1 -0
- package/{src/lib/db/providers/sql/mysql.ts → dist/mysql-I3WJQXN2.mjs} +277 -428
- package/dist/mysql-I3WJQXN2.mjs.map +1 -0
- package/dist/mysql-Y3MSA5QY.js +833 -0
- package/dist/mysql-Y3MSA5QY.js.map +1 -0
- package/dist/ollama-26BYLVEV.mjs +115 -0
- package/dist/ollama-26BYLVEV.mjs.map +1 -0
- package/dist/ollama-HVWAGKQC.js +117 -0
- package/dist/ollama-HVWAGKQC.js.map +1 -0
- package/dist/openai-4U56KPG7.mjs +111 -0
- package/dist/openai-4U56KPG7.mjs.map +1 -0
- package/dist/openai-AK3R37BS.js +113 -0
- package/dist/openai-AK3R37BS.js.map +1 -0
- package/dist/oracle-L6VEAVXO.js +917 -0
- package/dist/oracle-L6VEAVXO.js.map +1 -0
- package/{src/lib/db/providers/sql/oracle.ts → dist/oracle-P2G7T4P4.mjs} +321 -454
- package/dist/oracle-P2G7T4P4.mjs.map +1 -0
- package/{src/lib/db/providers/sql/postgres.ts → dist/postgres-O5KOQUVP.mjs} +261 -471
- package/dist/postgres-O5KOQUVP.mjs.map +1 -0
- package/dist/postgres-RLCWNFFX.js +971 -0
- package/dist/postgres-RLCWNFFX.js.map +1 -0
- package/dist/providers.d.mts +149 -0
- package/dist/providers.d.ts +149 -0
- package/dist/providers.js +44 -0
- package/dist/providers.js.map +1 -0
- package/dist/providers.mjs +7 -0
- package/dist/providers.mjs.map +1 -0
- package/dist/redis-4WMQOVLX.mjs +435 -0
- package/dist/redis-4WMQOVLX.mjs.map +1 -0
- package/dist/redis-QVQ6YU62.js +441 -0
- package/dist/redis-QVQ6YU62.js.map +1 -0
- package/dist/sqlite-4I2P2OGQ.js +554 -0
- package/dist/sqlite-4I2P2OGQ.js.map +1 -0
- package/dist/sqlite-OA4YJX5S.mjs +531 -0
- package/dist/sqlite-OA4YJX5S.mjs.map +1 -0
- package/dist/types-BJvJfxSY.d.mts +141 -0
- package/dist/types-BJvJfxSY.d.ts +141 -0
- package/dist/types-ClAg_v5k.d.mts +343 -0
- package/dist/types-Der_X8E8.d.ts +343 -0
- package/dist/types.d.mts +2 -0
- package/dist/types.d.ts +2 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/types.mjs +3 -0
- package/dist/types.mjs.map +1 -0
- package/dist/workspace.d.mts +80 -0
- package/dist/workspace.d.ts +80 -0
- package/dist/workspace.js +4182 -0
- package/dist/workspace.js.map +1 -0
- package/dist/workspace.mjs +4155 -0
- package/dist/workspace.mjs.map +1 -0
- package/package.json +60 -5
- package/.claude/settings.local.json +0 -127
- package/.cursorrules +0 -426
- package/.devin/wiki.json +0 -143
- package/.dockerignore +0 -80
- package/.env.example +0 -159
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -49
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -29
- package/.github/PULL_REQUEST_TEMPLATE.md +0 -57
- package/.github/workflows/ci.yml +0 -185
- package/.github/workflows/codeql.yml +0 -57
- package/.github/workflows/docker-build-push.yml +0 -118
- package/.github/workflows/helm-release.yml +0 -113
- package/CLAUDE.md +0 -265
- package/CODE_OF_CONDUCT.md +0 -124
- package/CONTRIBUTING.md +0 -154
- package/Dockerfile +0 -73
- package/SECURITY.md +0 -107
- package/artifacthub-repo.yml +0 -4
- package/bun.lock +0 -1714
- package/bunfig.toml +0 -3
- package/charts/libredb-studio/.helmignore +0 -11
- package/charts/libredb-studio/Chart.lock +0 -6
- package/charts/libredb-studio/Chart.yaml +0 -50
- package/charts/libredb-studio/README.md +0 -206
- package/charts/libredb-studio/templates/NOTES.txt +0 -59
- package/charts/libredb-studio/templates/_helpers.tpl +0 -135
- package/charts/libredb-studio/templates/configmap.yaml +0 -37
- package/charts/libredb-studio/templates/deployment.yaml +0 -184
- package/charts/libredb-studio/templates/hpa.yaml +0 -32
- package/charts/libredb-studio/templates/ingress.yaml +0 -41
- package/charts/libredb-studio/templates/networkpolicy.yaml +0 -50
- package/charts/libredb-studio/templates/pdb.yaml +0 -18
- package/charts/libredb-studio/templates/pvc.yaml +0 -23
- package/charts/libredb-studio/templates/secret.yaml +0 -30
- package/charts/libredb-studio/templates/seed-configmap.yaml +0 -11
- package/charts/libredb-studio/templates/service.yaml +0 -22
- package/charts/libredb-studio/templates/serviceaccount.yaml +0 -13
- package/charts/libredb-studio/values.schema.json +0 -246
- package/charts/libredb-studio/values.yaml +0 -286
- package/components.json +0 -22
- package/conductor/code_styleguides/typescript.md +0 -43
- package/conductor/product-guidelines.md +0 -43
- package/conductor/product.md +0 -3
- package/conductor/setup_state.json +0 -1
- package/conductor/tech-stack.md +0 -39
- package/conductor/tracks/enhance_postgres_monitoring_20251227/metadata.json +0 -8
- package/conductor/tracks/enhance_postgres_monitoring_20251227/plan.md +0 -44
- package/conductor/tracks/enhance_postgres_monitoring_20251227/spec.md +0 -31
- package/conductor/tracks.md +0 -8
- package/conductor/workflow.md +0 -333
- package/database-compose.yml +0 -55
- package/docker/postgres-init/01-extensions.sql +0 -10
- package/docker/postgres-init/02-sample-data.sql +0 -585
- package/docker/postgres.yml +0 -68
- package/docker-compose.yml +0 -38
- package/docs/AI_PLAN.md +0 -74
- package/docs/API_DOCS.md +0 -875
- package/docs/ARCHITECTURE.md +0 -218
- package/docs/DATABASE_PROVIDERS.md +0 -358
- package/docs/FEATURES.md +0 -116
- package/docs/HELM_CHART.md +0 -252
- package/docs/LOGIN_PAGE.md +0 -178
- package/docs/MONACO_EDITOR_PERFORMANCE.md +0 -315
- package/docs/OIDC_ARCH.md +0 -681
- package/docs/OIDC_SETUP.md +0 -322
- package/docs/POSTGRES_METRICS.md +0 -516
- package/docs/QUERY_OPTIMIZATION.md +0 -370
- package/docs/SEED_CONNECTIONS.md +0 -468
- package/docs/SQL_ALIAS_COMPLETION.md +0 -190
- package/docs/STORAGE_ARCHITECTURE.md +0 -565
- package/docs/STORAGE_QUICK_SETUP.md +0 -419
- package/docs/TECHNICAL_PLAN.md +0 -36
- package/docs/THEMING.md +0 -345
- package/docs/adding-a-new-database-provider.md +0 -642
- package/docs/backlogs/000-PLATFORM_DATA_SYNC_DATABASE.md +0 -360
- package/docs/backlogs/001-INLINE_DATA_EDITING.md +0 -118
- package/docs/backlogs/002-DATA_IMPORT.md +0 -215
- package/docs/backlogs/003-QUERY_TIME_MACHINE.md +0 -183
- package/docs/backlogs/004-AI_DATA_STORYTELLER.md +0 -292
- package/docs/backlogs/005-QUERY_PLAYGROUND.md +0 -352
- package/docs/backlogs/006-DATA_MASKING.md +0 -418
- package/docs/enterprise-features.md +0 -718
- package/docs/kubernetes-helm-chart-artifacthub-plan.md +0 -803
- package/docs/medium-koyeb-article-en.md +0 -215
- package/docs/plans/test-plans.md +0 -445
- package/docs/releases/RELEASE.V0.3.0.md +0 -22
- package/docs/releases/RELEASE.V0.4.0.md +0 -154
- package/docs/releases/RELEASE.V0.5.0.md +0 -252
- package/docs/releases/RELEASE_v0.5.6.md +0 -145
- package/docs/releases/RELEASE_v0.6.1.md +0 -303
- package/docs/releases/RELEASE_v0.6.7.md +0 -292
- package/docs/releases/RELEASE_v0.7.0.md +0 -332
- package/docs/releases/RELEASE_v0.8.0.md +0 -521
- package/docs/sampledb/titanic.sql +0 -1379
- package/docs/superpowers/plans/2026-03-25-seed-connections.md +0 -1362
- package/docs/superpowers/specs/2026-03-25-seed-connections-design.md +0 -590
- package/e2e/admin-dashboard.spec.ts +0 -64
- package/e2e/connection-management.spec.ts +0 -58
- package/e2e/export.spec.ts +0 -34
- package/e2e/login.spec.ts +0 -85
- package/e2e/query-execution.spec.ts +0 -35
- package/e2e/tab-management.spec.ts +0 -64
- package/eslint.config.mjs +0 -28
- package/fly.toml +0 -43
- package/next.config.ts +0 -32
- package/playwright.config.ts +0 -34
- package/postcss.config.mjs +0 -7
- package/public/favicon-32x32.png +0 -0
- package/public/favicon.ico +0 -0
- package/public/file.svg +0 -1
- package/public/globe.svg +0 -1
- package/public/logo.svg +0 -32
- package/public/next.svg +0 -1
- package/public/screenshots/code-generator.png +0 -0
- package/public/screenshots/connection-modal.png +0 -0
- package/public/screenshots/data-profiler.png +0 -0
- package/public/screenshots/erd-diagram.png +0 -0
- package/public/screenshots/hero-editor.png +0 -0
- package/public/screenshots/nl2sql.png +0 -0
- package/public/vercel.svg +0 -1
- package/public/window.svg +0 -1
- package/render.yaml +0 -58
- package/scripts/merge-lcov.mjs +0 -239
- package/sonar-project.properties +0 -16
- package/src/app/admin/error.tsx +0 -46
- package/src/app/admin/page.tsx +0 -10
- package/src/app/api/admin/audit/route.ts +0 -52
- package/src/app/api/admin/fleet-health/route.ts +0 -81
- package/src/app/api/ai/autopilot/route.ts +0 -105
- package/src/app/api/ai/chat/route.ts +0 -132
- package/src/app/api/ai/describe-schema/route.ts +0 -52
- package/src/app/api/ai/explain/route.ts +0 -86
- package/src/app/api/ai/impact/route.ts +0 -97
- package/src/app/api/ai/index-advisor/route.ts +0 -98
- package/src/app/api/ai/nl2sql/route.ts +0 -87
- package/src/app/api/ai/query-safety/route.ts +0 -87
- package/src/app/api/auth/login/route.ts +0 -62
- package/src/app/api/auth/logout/route.ts +0 -25
- package/src/app/api/auth/me/route.ts +0 -10
- package/src/app/api/auth/oidc/callback/route.ts +0 -82
- package/src/app/api/auth/oidc/login/route.ts +0 -43
- package/src/app/api/connections/managed/route.ts +0 -35
- package/src/app/api/db/cancel/route.ts +0 -42
- package/src/app/api/db/disconnect/route.ts +0 -28
- package/src/app/api/db/health/route.ts +0 -49
- package/src/app/api/db/maintenance/route.ts +0 -72
- package/src/app/api/db/monitoring/route.ts +0 -62
- package/src/app/api/db/multi-query/route.ts +0 -116
- package/src/app/api/db/pool-stats/route.ts +0 -37
- package/src/app/api/db/profile/route.ts +0 -144
- package/src/app/api/db/provider-meta/route.ts +0 -49
- package/src/app/api/db/query/route.ts +0 -50
- package/src/app/api/db/schema/route.ts +0 -47
- package/src/app/api/db/schema-snapshot/route.ts +0 -42
- package/src/app/api/db/test-connection/route.ts +0 -55
- package/src/app/api/db/transaction/route.ts +0 -111
- package/src/app/api/storage/[collection]/route.ts +0 -67
- package/src/app/api/storage/config/route.ts +0 -17
- package/src/app/api/storage/migrate/route.ts +0 -45
- package/src/app/api/storage/route.ts +0 -32
- package/src/app/error.tsx +0 -49
- package/src/app/global-error.tsx +0 -55
- package/src/app/globals.css +0 -146
- package/src/app/icon.svg +0 -42
- package/src/app/layout.tsx +0 -34
- package/src/app/login/login-form.tsx +0 -301
- package/src/app/login/page.tsx +0 -11
- package/src/app/monitoring/page.tsx +0 -8
- package/src/app/not-found.tsx +0 -29
- package/src/app/page.tsx +0 -5
- package/src/components/AIAutopilotPanel.tsx +0 -238
- package/src/components/CodeGenerator.tsx +0 -271
- package/src/components/CommandPalette.tsx +0 -227
- package/src/components/ConnectionModal.tsx +0 -759
- package/src/components/CreateTableModal.tsx +0 -281
- package/src/components/DataCharts.tsx +0 -962
- package/src/components/DataImportModal.tsx +0 -582
- package/src/components/DataProfiler.tsx +0 -335
- package/src/components/DatabaseDocs.tsx +0 -251
- package/src/components/MaskingSettings.tsx +0 -414
- package/src/components/MobileNav.tsx +0 -50
- package/src/components/NL2SQLPanel.tsx +0 -281
- package/src/components/PivotTable.tsx +0 -257
- package/src/components/QueryEditor.tsx +0 -760
- package/src/components/QueryHistory.tsx +0 -344
- package/src/components/QuerySafetyDialog.tsx +0 -290
- package/src/components/ResultsGrid.tsx +0 -644
- package/src/components/SaveQueryModal.tsx +0 -104
- package/src/components/SavedQueries.tsx +0 -128
- package/src/components/SchemaDiagram.tsx +0 -473
- package/src/components/SchemaDiff.tsx +0 -473
- package/src/components/SnapshotTimeline.tsx +0 -116
- package/src/components/Studio.tsx +0 -639
- package/src/components/TestDataGenerator.tsx +0 -261
- package/src/components/VisualExplain.tsx +0 -820
- package/src/components/admin/AdminDashboard.tsx +0 -163
- package/src/components/admin/tabs/AuditTab.tsx +0 -531
- package/src/components/admin/tabs/MonitoringEmbed.tsx +0 -11
- package/src/components/admin/tabs/OperationsTab.tsx +0 -646
- package/src/components/admin/tabs/OverviewTab.tsx +0 -1328
- package/src/components/admin/tabs/SecurityTab.tsx +0 -284
- package/src/components/community-section.tsx +0 -92
- package/src/components/icons/db-icons.tsx +0 -84
- package/src/components/libredb-logo.tsx +0 -61
- package/src/components/monitoring/MonitoringDashboard.tsx +0 -345
- package/src/components/monitoring/tabs/MetricChart.tsx +0 -82
- package/src/components/monitoring/tabs/OverviewTab.tsx +0 -263
- package/src/components/monitoring/tabs/PerformanceTab.tsx +0 -254
- package/src/components/monitoring/tabs/PoolTab.tsx +0 -174
- package/src/components/monitoring/tabs/QueriesTab.tsx +0 -287
- package/src/components/monitoring/tabs/SessionsTab.tsx +0 -316
- package/src/components/monitoring/tabs/StorageTab.tsx +0 -335
- package/src/components/monitoring/tabs/TablesTab.tsx +0 -300
- package/src/components/results-grid/ResultCard.tsx +0 -111
- package/src/components/results-grid/RowDetailSheet.tsx +0 -178
- package/src/components/results-grid/StatsBar.tsx +0 -201
- package/src/components/results-grid/index.ts +0 -1
- package/src/components/results-grid/utils.ts +0 -23
- package/src/components/schema-explorer/ColumnList.tsx +0 -53
- package/src/components/schema-explorer/SchemaExplorer.tsx +0 -182
- package/src/components/schema-explorer/TableItem.tsx +0 -210
- package/src/components/schema-explorer/index.ts +0 -1
- package/src/components/sidebar/ConnectionItem.tsx +0 -105
- package/src/components/sidebar/ConnectionsList.tsx +0 -62
- package/src/components/sidebar/Sidebar.tsx +0 -130
- package/src/components/sidebar/index.ts +0 -2
- package/src/components/studio/BottomPanel.tsx +0 -286
- package/src/components/studio/QueryToolbar.tsx +0 -180
- package/src/components/studio/StudioDesktopHeader.tsx +0 -114
- package/src/components/studio/StudioMobileHeader.tsx +0 -340
- package/src/components/studio/StudioTabBar.tsx +0 -82
- package/src/components/studio/index.ts +0 -5
- package/src/components/ui/accordion.tsx +0 -66
- package/src/components/ui/alert-dialog.tsx +0 -157
- package/src/components/ui/alert.tsx +0 -66
- package/src/components/ui/aspect-ratio.tsx +0 -11
- package/src/components/ui/avatar.tsx +0 -53
- package/src/components/ui/badge.tsx +0 -46
- package/src/components/ui/breadcrumb.tsx +0 -109
- package/src/components/ui/button-group.tsx +0 -83
- package/src/components/ui/button.tsx +0 -60
- package/src/components/ui/calendar.tsx +0 -216
- package/src/components/ui/card.tsx +0 -92
- package/src/components/ui/carousel.tsx +0 -241
- package/src/components/ui/chart.tsx +0 -357
- package/src/components/ui/checkbox.tsx +0 -32
- package/src/components/ui/collapsible.tsx +0 -33
- package/src/components/ui/command.tsx +0 -184
- package/src/components/ui/context-menu.tsx +0 -252
- package/src/components/ui/dialog.tsx +0 -143
- package/src/components/ui/drawer.tsx +0 -135
- package/src/components/ui/dropdown-menu.tsx +0 -257
- package/src/components/ui/empty.tsx +0 -104
- package/src/components/ui/field.tsx +0 -248
- package/src/components/ui/form.tsx +0 -167
- package/src/components/ui/hover-card.tsx +0 -44
- package/src/components/ui/input-group.tsx +0 -170
- package/src/components/ui/input-otp.tsx +0 -77
- package/src/components/ui/input.tsx +0 -21
- package/src/components/ui/item.tsx +0 -193
- package/src/components/ui/kbd.tsx +0 -28
- package/src/components/ui/label.tsx +0 -24
- package/src/components/ui/menubar.tsx +0 -276
- package/src/components/ui/navigation-menu.tsx +0 -168
- package/src/components/ui/pagination.tsx +0 -127
- package/src/components/ui/popover.tsx +0 -48
- package/src/components/ui/progress.tsx +0 -31
- package/src/components/ui/radio-group.tsx +0 -45
- package/src/components/ui/resizable.tsx +0 -56
- package/src/components/ui/scroll-area.tsx +0 -58
- package/src/components/ui/select.tsx +0 -187
- package/src/components/ui/separator.tsx +0 -28
- package/src/components/ui/sheet.tsx +0 -139
- package/src/components/ui/sidebar.tsx +0 -726
- package/src/components/ui/skeleton.tsx +0 -13
- package/src/components/ui/slider.tsx +0 -63
- package/src/components/ui/sonner.tsx +0 -40
- package/src/components/ui/spinner.tsx +0 -16
- package/src/components/ui/switch.tsx +0 -31
- package/src/components/ui/table.tsx +0 -116
- package/src/components/ui/tabs.tsx +0 -66
- package/src/components/ui/textarea.tsx +0 -18
- package/src/components/ui/toggle-group.tsx +0 -83
- package/src/components/ui/toggle.tsx +0 -47
- package/src/components/ui/tooltip.tsx +0 -61
- package/src/exports/components.ts +0 -15
- package/src/exports/index.ts +0 -4
- package/src/exports/providers.ts +0 -4
- package/src/exports/types.ts +0 -26
- package/src/hooks/use-ai-chat.ts +0 -182
- package/src/hooks/use-all-connections.ts +0 -66
- package/src/hooks/use-api-call.ts +0 -71
- package/src/hooks/use-auth.ts +0 -51
- package/src/hooks/use-connection-form.ts +0 -349
- package/src/hooks/use-connection-manager.ts +0 -169
- package/src/hooks/use-connection-payload.ts +0 -15
- package/src/hooks/use-inline-editing.ts +0 -109
- package/src/hooks/use-mobile.ts +0 -20
- package/src/hooks/use-monitoring-data.ts +0 -270
- package/src/hooks/use-provider-metadata.ts +0 -62
- package/src/hooks/use-query-execution.ts +0 -478
- package/src/hooks/use-storage-sync.ts +0 -259
- package/src/hooks/use-tab-manager.ts +0 -231
- package/src/hooks/use-toast.ts +0 -20
- package/src/hooks/use-transaction-control.ts +0 -64
- package/src/lib/api/error-codes.ts +0 -30
- package/src/lib/api/errors.ts +0 -236
- package/src/lib/api/with-error-handler.ts +0 -41
- package/src/lib/audit.ts +0 -105
- package/src/lib/auth.ts +0 -87
- package/src/lib/connection-string-parser.ts +0 -172
- package/src/lib/data-masking.ts +0 -385
- package/src/lib/db/base-provider.ts +0 -325
- package/src/lib/db/errors.ts +0 -317
- package/src/lib/db/factory.ts +0 -324
- package/src/lib/db/index.ts +0 -123
- package/src/lib/db/providers/document/index.ts +0 -6
- package/src/lib/db/providers/document/mongodb.ts +0 -992
- package/src/lib/db/providers/keyvalue/redis.ts +0 -554
- package/src/lib/db/providers/sql/index.ts +0 -11
- package/src/lib/db/providers/sql/sql-base.ts +0 -174
- package/src/lib/db/providers/sql/sqlite.ts +0 -721
- package/src/lib/db/types.ts +0 -437
- package/src/lib/db/utils/pool-manager.ts +0 -287
- package/src/lib/db/utils/query-limiter.ts +0 -239
- package/src/lib/db-ui-config.ts +0 -86
- package/src/lib/editor/mongodb-completions.ts +0 -172
- package/src/lib/editor/sql-completions.ts +0 -280
- package/src/lib/llm/base-provider.ts +0 -117
- package/src/lib/llm/factory.ts +0 -102
- package/src/lib/llm/index.ts +0 -90
- package/src/lib/llm/providers/custom.ts +0 -181
- package/src/lib/llm/providers/gemini.ts +0 -126
- package/src/lib/llm/providers/ollama.ts +0 -154
- package/src/lib/llm/providers/openai.ts +0 -146
- package/src/lib/llm/types.ts +0 -173
- package/src/lib/llm/utils/config.ts +0 -187
- package/src/lib/llm/utils/retry.ts +0 -119
- package/src/lib/llm/utils/streaming.ts +0 -202
- package/src/lib/logger.ts +0 -127
- package/src/lib/monitoring-thresholds.ts +0 -44
- package/src/lib/oidc.ts +0 -262
- package/src/lib/query-generators.ts +0 -61
- package/src/lib/schema-diff/diff-engine.ts +0 -273
- package/src/lib/schema-diff/migration-generator.ts +0 -208
- package/src/lib/schema-diff/types.ts +0 -55
- package/src/lib/seed/config-loader.ts +0 -79
- package/src/lib/seed/connection-filter.ts +0 -49
- package/src/lib/seed/credential-resolver.ts +0 -62
- package/src/lib/seed/index.ts +0 -40
- package/src/lib/seed/resolve-connection.ts +0 -57
- package/src/lib/seed/types.ts +0 -69
- package/src/lib/sql/alias-extractor.ts +0 -267
- package/src/lib/sql/index.ts +0 -8
- package/src/lib/sql/statement-splitter.ts +0 -167
- package/src/lib/sql/types.ts +0 -40
- package/src/lib/ssh/tunnel.ts +0 -142
- package/src/lib/storage/factory.ts +0 -84
- package/src/lib/storage/index.ts +0 -14
- package/src/lib/storage/local-storage.ts +0 -99
- package/src/lib/storage/providers/postgres.ts +0 -225
- package/src/lib/storage/providers/sqlite.ts +0 -153
- package/src/lib/storage/storage-facade.ts +0 -272
- package/src/lib/storage/types.ts +0 -75
- package/src/lib/time-series-buffer.ts +0 -58
- package/src/lib/types.ts +0 -173
- package/src/lib/utils.ts +0 -6
- package/src/proxy.ts +0 -104
- package/src/types/db-drivers.d.ts +0 -23
- package/src/types/html2canvas.d.ts +0 -9
- package/tests/api/admin/audit.test.ts +0 -178
- package/tests/api/admin/fleet-health.test.ts +0 -183
- package/tests/api/ai/autopilot.test.ts +0 -174
- package/tests/api/ai/chat.test.ts +0 -250
- package/tests/api/ai/describe-schema.test.ts +0 -266
- package/tests/api/ai/explain.test.ts +0 -199
- package/tests/api/ai/impact.test.ts +0 -168
- package/tests/api/ai/index-advisor.test.ts +0 -171
- package/tests/api/ai/nl2sql.test.ts +0 -202
- package/tests/api/ai/query-safety.test.ts +0 -196
- package/tests/api/auth/login.test.ts +0 -170
- package/tests/api/auth/logout.test.ts +0 -140
- package/tests/api/auth/me.test.ts +0 -73
- package/tests/api/auth/oidc-callback.test.ts +0 -215
- package/tests/api/auth/oidc-login.test.ts +0 -127
- package/tests/api/db/cancel.test.ts +0 -198
- package/tests/api/db/disconnect.test.ts +0 -124
- package/tests/api/db/health.test.ts +0 -222
- package/tests/api/db/maintenance.test.ts +0 -263
- package/tests/api/db/monitoring.test.ts +0 -221
- package/tests/api/db/multi-query.test.ts +0 -316
- package/tests/api/db/pool-stats.test.ts +0 -135
- package/tests/api/db/profile.test.ts +0 -330
- package/tests/api/db/provider-meta.test.ts +0 -193
- package/tests/api/db/query.test.ts +0 -314
- package/tests/api/db/schema-snapshot.test.ts +0 -170
- package/tests/api/db/schema.test.ts +0 -191
- package/tests/api/db/test-connection.test.ts +0 -185
- package/tests/api/db/transaction.test.ts +0 -314
- package/tests/api/proxy.test.ts +0 -191
- package/tests/api/seed/managed-route.test.ts +0 -113
- package/tests/api/storage/config.test.ts +0 -42
- package/tests/api/storage/storage-routes.test.ts +0 -309
- package/tests/components/AIAutopilotPanel.test.tsx +0 -756
- package/tests/components/AdminPage.test.tsx +0 -33
- package/tests/components/CodeGenerator.test.tsx +0 -182
- package/tests/components/CommandPalette.test.tsx +0 -428
- package/tests/components/CommunitySection.test.tsx +0 -91
- package/tests/components/ConnectionModal.mobile.test.tsx +0 -284
- package/tests/components/ConnectionModal.test.tsx +0 -570
- package/tests/components/CreateTableModal.test.tsx +0 -383
- package/tests/components/DataCharts.test.tsx +0 -739
- package/tests/components/DataImportModal.test.tsx +0 -751
- package/tests/components/DataProfiler.test.tsx +0 -589
- package/tests/components/DatabaseDocs.test.tsx +0 -353
- package/tests/components/LoginPage.test.tsx +0 -163
- package/tests/components/LoginPageOIDC.test.tsx +0 -92
- package/tests/components/MaskingSettings.test.tsx +0 -498
- package/tests/components/MobileNav.test.tsx +0 -30
- package/tests/components/MonitoringPage.test.tsx +0 -32
- package/tests/components/NL2SQLPanel.test.tsx +0 -621
- package/tests/components/Page.test.tsx +0 -33
- package/tests/components/PivotTable.test.tsx +0 -350
- package/tests/components/QueryEditor.test.tsx +0 -1730
- package/tests/components/QueryHistory.test.tsx +0 -572
- package/tests/components/QuerySafetyDialog.test.tsx +0 -586
- package/tests/components/ResultsGrid.test.tsx +0 -804
- package/tests/components/RootLayout.test.tsx +0 -83
- package/tests/components/SaveQueryModal.test.tsx +0 -25
- package/tests/components/SavedQueries.test.tsx +0 -43
- package/tests/components/SchemaDiagram.test.tsx +0 -1034
- package/tests/components/SchemaDiff.test.tsx +0 -906
- package/tests/components/SnapshotTimeline.test.tsx +0 -174
- package/tests/components/Studio.test.tsx +0 -1030
- package/tests/components/TestDataGenerator.test.tsx +0 -291
- package/tests/components/VisualExplain.test.tsx +0 -704
- package/tests/components/admin/AdminDashboard.test.tsx +0 -205
- package/tests/components/admin/AuditTab.test.tsx +0 -220
- package/tests/components/admin/MonitoringEmbed.test.tsx +0 -58
- package/tests/components/admin/OperationsTab.test.tsx +0 -975
- package/tests/components/admin/OverviewTab.test.tsx +0 -254
- package/tests/components/admin/SecurityTab.test.tsx +0 -467
- package/tests/components/monitoring/MetricChart.test.tsx +0 -111
- package/tests/components/monitoring/MonitoringDashboard.test.tsx +0 -259
- package/tests/components/monitoring/OverviewTab.test.tsx +0 -78
- package/tests/components/monitoring/PerformanceTab.test.tsx +0 -87
- package/tests/components/monitoring/PoolTab.test.tsx +0 -42
- package/tests/components/monitoring/QueriesTab.test.tsx +0 -80
- package/tests/components/monitoring/SessionsTab.test.tsx +0 -154
- package/tests/components/monitoring/StorageTab.test.tsx +0 -127
- package/tests/components/monitoring/TablesTab.test.tsx +0 -153
- package/tests/components/results-grid/ResultCard.test.tsx +0 -105
- package/tests/components/results-grid/RowDetailSheet.test.tsx +0 -308
- package/tests/components/results-grid/StatsBar.test.tsx +0 -162
- package/tests/components/schema-explorer/ColumnList.test.tsx +0 -151
- package/tests/components/schema-explorer/SchemaExplorer.test.tsx +0 -461
- package/tests/components/schema-explorer/TableItem.test.tsx +0 -415
- package/tests/components/sidebar/ConnectionItem.test.tsx +0 -201
- package/tests/components/sidebar/ConnectionsList.test.tsx +0 -176
- package/tests/components/sidebar/Sidebar.test.tsx +0 -187
- package/tests/components/studio/BottomPanel.test.tsx +0 -383
- package/tests/components/studio/QueryToolbar.test.tsx +0 -321
- package/tests/components/studio/StudioDesktopHeader.test.tsx +0 -377
- package/tests/components/studio/StudioMobileHeader.test.tsx +0 -198
- package/tests/components/studio/StudioTabBar.test.tsx +0 -331
- package/tests/fixtures/connections.ts +0 -96
- package/tests/fixtures/masking-configs.ts +0 -86
- package/tests/fixtures/query-results.ts +0 -71
- package/tests/fixtures/schemas.ts +0 -64
- package/tests/fixtures/seed-connections/invalid-config.yaml +0 -7
- package/tests/fixtures/seed-connections/minimal-config.yaml +0 -8
- package/tests/fixtures/seed-connections/mixed-credentials.yaml +0 -23
- package/tests/fixtures/seed-connections/multi-role-config.yaml +0 -30
- package/tests/fixtures/seed-connections/valid-config.json +0 -15
- package/tests/fixtures/seed-connections/valid-config.yaml +0 -51
- package/tests/helpers/mock-fetch.ts +0 -59
- package/tests/helpers/mock-monaco.ts +0 -112
- package/tests/helpers/mock-navigation.ts +0 -28
- package/tests/helpers/mock-next.ts +0 -80
- package/tests/helpers/mock-provider.ts +0 -133
- package/tests/helpers/mock-sonner.ts +0 -29
- package/tests/helpers/render-with-providers.tsx +0 -19
- package/tests/hooks/use-ai-chat.test.ts +0 -600
- package/tests/hooks/use-auth.test.ts +0 -371
- package/tests/hooks/use-connection-form.test.ts +0 -743
- package/tests/hooks/use-connection-manager.test.ts +0 -466
- package/tests/hooks/use-inline-editing.test.ts +0 -321
- package/tests/hooks/use-mobile.test.ts +0 -177
- package/tests/hooks/use-monitoring-data.test.ts +0 -819
- package/tests/hooks/use-provider-metadata.test.ts +0 -228
- package/tests/hooks/use-query-execution.test.ts +0 -1212
- package/tests/hooks/use-tab-manager.test.ts +0 -756
- package/tests/hooks/use-toast.test.ts +0 -74
- package/tests/hooks/use-transaction-control.test.ts +0 -211
- package/tests/integration/db/mongodb-provider.test.ts +0 -698
- package/tests/integration/db/mssql-provider.test.ts +0 -840
- package/tests/integration/db/mysql-provider.test.ts +0 -872
- package/tests/integration/db/oracle-provider.test.ts +0 -843
- package/tests/integration/db/postgres-provider.test.ts +0 -1382
- package/tests/integration/db/redis-provider.test.ts +0 -526
- package/tests/integration/db/sqlite-provider.test.ts +0 -480
- package/tests/integration/seed/seed-pipeline.test.ts +0 -102
- package/tests/isolated/factory-singleton.test.ts +0 -150
- package/tests/isolated/use-storage-sync.test.ts +0 -389
- package/tests/run-components.sh +0 -196
- package/tests/setup-dom.ts +0 -58
- package/tests/setup.ts +0 -40
- package/tests/unit/api-errors.test.ts +0 -210
- package/tests/unit/code-generator-functions.test.ts +0 -271
- package/tests/unit/components/column-list.test.tsx +0 -190
- package/tests/unit/components/data-import-modal.test.tsx +0 -441
- package/tests/unit/components/studio-mobile-header.test.tsx +0 -327
- package/tests/unit/data-charts-functions.test.ts +0 -496
- package/tests/unit/data-import-functions.test.ts +0 -320
- package/tests/unit/data-import-utils.test.ts +0 -125
- package/tests/unit/db/base-provider.test.ts +0 -517
- package/tests/unit/db/errors.test.ts +0 -403
- package/tests/unit/db/factory.test.ts +0 -436
- package/tests/unit/db/pool-manager.test.ts +0 -440
- package/tests/unit/db/query-limiter.test.ts +0 -387
- package/tests/unit/db/sql-base.test.ts +0 -438
- package/tests/unit/lib/api/error-codes.test.ts +0 -39
- package/tests/unit/lib/audit.test.ts +0 -326
- package/tests/unit/lib/auth.test.ts +0 -146
- package/tests/unit/lib/connection-string-parser.test.ts +0 -424
- package/tests/unit/lib/data-masking.test.ts +0 -583
- package/tests/unit/lib/db-icons.test.tsx +0 -41
- package/tests/unit/lib/monitoring-thresholds.test.ts +0 -133
- package/tests/unit/lib/oidc.test.ts +0 -509
- package/tests/unit/lib/query-generators.test.ts +0 -127
- package/tests/unit/lib/storage/factory.test.ts +0 -71
- package/tests/unit/lib/storage/local-storage.test.ts +0 -114
- package/tests/unit/lib/storage/providers/postgres.test.ts +0 -312
- package/tests/unit/lib/storage/providers/sqlite.test.ts +0 -232
- package/tests/unit/lib/storage/storage-facade-extended.test.ts +0 -331
- package/tests/unit/lib/storage/storage-facade.test.ts +0 -184
- package/tests/unit/lib/storage.test.ts +0 -317
- package/tests/unit/lib/time-series-buffer.test.ts +0 -212
- package/tests/unit/lib/utils.test.ts +0 -24
- package/tests/unit/llm/base-provider.test.ts +0 -238
- package/tests/unit/llm/config.test.ts +0 -262
- package/tests/unit/llm/custom-provider.test.ts +0 -281
- package/tests/unit/llm/gemini-provider.test.ts +0 -248
- package/tests/unit/llm/llm-factory.test.ts +0 -155
- package/tests/unit/llm/ollama-provider.test.ts +0 -288
- package/tests/unit/llm/openai-provider.test.ts +0 -324
- package/tests/unit/llm/retry.test.ts +0 -180
- package/tests/unit/llm/streaming.test.ts +0 -355
- package/tests/unit/logger.test.ts +0 -198
- package/tests/unit/mongodb-completions.test.ts +0 -516
- package/tests/unit/pivot-table-functions.test.ts +0 -76
- package/tests/unit/query-cancelled-error.test.ts +0 -81
- package/tests/unit/schema-diff/diff-engine.test.ts +0 -367
- package/tests/unit/schema-diff/migration-generator.test.ts +0 -513
- package/tests/unit/seed/config-loader.test.ts +0 -73
- package/tests/unit/seed/connection-filter.test.ts +0 -91
- package/tests/unit/seed/credential-resolver.test.ts +0 -85
- package/tests/unit/seed/index.test.ts +0 -72
- package/tests/unit/seed/resolve-connection.test.ts +0 -74
- package/tests/unit/seed/types.test.ts +0 -129
- package/tests/unit/sql/alias-extractor.test.ts +0 -444
- package/tests/unit/sql/statement-splitter.test.ts +0 -348
- package/tests/unit/sql-completions.test.ts +0 -463
- package/tests/unit/ssh-tunnel.test.ts +0 -465
- package/tsconfig.json +0 -42
package/scripts/merge-lcov.mjs
DELETED
|
@@ -1,239 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
import fs from "node:fs";
|
|
4
|
-
import path from "node:path";
|
|
5
|
-
|
|
6
|
-
function ensureParentDir(filePath) {
|
|
7
|
-
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
function parseLcov(content) {
|
|
11
|
-
const records = [];
|
|
12
|
-
const rawRecords = content.split("end_of_record");
|
|
13
|
-
|
|
14
|
-
for (const raw of rawRecords) {
|
|
15
|
-
const lines = raw
|
|
16
|
-
.split("\n")
|
|
17
|
-
.map((line) => line.trim())
|
|
18
|
-
.filter(Boolean);
|
|
19
|
-
|
|
20
|
-
if (lines.length === 0) {
|
|
21
|
-
continue;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
const record = {
|
|
25
|
-
sf: "",
|
|
26
|
-
functions: new Map(),
|
|
27
|
-
functionHits: new Map(),
|
|
28
|
-
lines: new Map(),
|
|
29
|
-
branches: new Map(),
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
for (const line of lines) {
|
|
33
|
-
if (line.startsWith("SF:")) {
|
|
34
|
-
record.sf = line.slice(3);
|
|
35
|
-
continue;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
if (line.startsWith("FN:")) {
|
|
39
|
-
const payload = line.slice(3);
|
|
40
|
-
const commaIndex = payload.indexOf(",");
|
|
41
|
-
if (commaIndex >= 0) {
|
|
42
|
-
const lineNumber = Number(payload.slice(0, commaIndex));
|
|
43
|
-
const functionName = payload.slice(commaIndex + 1);
|
|
44
|
-
record.functions.set(functionName, Number.isFinite(lineNumber) ? lineNumber : 0);
|
|
45
|
-
}
|
|
46
|
-
continue;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
if (line.startsWith("FNDA:")) {
|
|
50
|
-
const payload = line.slice(5);
|
|
51
|
-
const commaIndex = payload.indexOf(",");
|
|
52
|
-
if (commaIndex >= 0) {
|
|
53
|
-
const hits = Number(payload.slice(0, commaIndex)) || 0;
|
|
54
|
-
const functionName = payload.slice(commaIndex + 1);
|
|
55
|
-
record.functionHits.set(functionName, hits);
|
|
56
|
-
}
|
|
57
|
-
continue;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
if (line.startsWith("DA:")) {
|
|
61
|
-
const payload = line.slice(3);
|
|
62
|
-
const commaIndex = payload.indexOf(",");
|
|
63
|
-
if (commaIndex >= 0) {
|
|
64
|
-
const lineNumber = Number(payload.slice(0, commaIndex));
|
|
65
|
-
const hits = Number(payload.slice(commaIndex + 1)) || 0;
|
|
66
|
-
if (Number.isFinite(lineNumber)) {
|
|
67
|
-
record.lines.set(lineNumber, hits);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
continue;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
if (line.startsWith("BRDA:")) {
|
|
74
|
-
const payload = line.slice(5);
|
|
75
|
-
const [lineNoRaw, blockNoRaw, branchNoRaw, takenRaw] = payload.split(",");
|
|
76
|
-
const lineNo = Number(lineNoRaw);
|
|
77
|
-
const blockNo = Number(blockNoRaw);
|
|
78
|
-
const branchNo = Number(branchNoRaw);
|
|
79
|
-
const key = `${lineNo},${blockNo},${branchNo}`;
|
|
80
|
-
const taken = takenRaw === "-" ? -1 : Number(takenRaw) || 0;
|
|
81
|
-
if (Number.isFinite(lineNo) && Number.isFinite(blockNo) && Number.isFinite(branchNo)) {
|
|
82
|
-
record.branches.set(key, taken);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
if (record.sf) {
|
|
88
|
-
records.push(record);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
return records;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
function mergeRecords(inputRecords) {
|
|
96
|
-
const byFile = new Map();
|
|
97
|
-
|
|
98
|
-
for (const record of inputRecords) {
|
|
99
|
-
const existing = byFile.get(record.sf) || {
|
|
100
|
-
sf: record.sf,
|
|
101
|
-
functions: new Map(),
|
|
102
|
-
functionHits: new Map(),
|
|
103
|
-
lines: new Map(),
|
|
104
|
-
branches: new Map(),
|
|
105
|
-
};
|
|
106
|
-
|
|
107
|
-
for (const [fnName, fnLine] of record.functions.entries()) {
|
|
108
|
-
if (!existing.functions.has(fnName)) {
|
|
109
|
-
existing.functions.set(fnName, fnLine);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
for (const [fnName, hits] of record.functionHits.entries()) {
|
|
114
|
-
const prevHits = existing.functionHits.get(fnName) || 0;
|
|
115
|
-
existing.functionHits.set(fnName, Math.max(prevHits, hits));
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
for (const [lineNo, hits] of record.lines.entries()) {
|
|
119
|
-
const prevHits = existing.lines.get(lineNo) || 0;
|
|
120
|
-
existing.lines.set(lineNo, Math.max(prevHits, hits));
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
for (const [key, taken] of record.branches.entries()) {
|
|
124
|
-
const prevTaken = existing.branches.has(key) ? existing.branches.get(key) : -1;
|
|
125
|
-
if (prevTaken === -1 && taken !== -1) {
|
|
126
|
-
existing.branches.set(key, taken);
|
|
127
|
-
} else if (prevTaken !== -1 && taken === -1) {
|
|
128
|
-
existing.branches.set(key, prevTaken);
|
|
129
|
-
} else {
|
|
130
|
-
existing.branches.set(key, Math.max(prevTaken, taken));
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
byFile.set(record.sf, existing);
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
return [...byFile.values()].sort((a, b) => a.sf.localeCompare(b.sf));
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
function serializeRecords(records) {
|
|
141
|
-
const chunks = [];
|
|
142
|
-
|
|
143
|
-
for (const record of records) {
|
|
144
|
-
const lines = [];
|
|
145
|
-
lines.push(`SF:${record.sf}`);
|
|
146
|
-
|
|
147
|
-
const sortedFunctions = [...record.functions.entries()].sort((a, b) => a[1] - b[1]);
|
|
148
|
-
for (const [fnName, fnLine] of sortedFunctions) {
|
|
149
|
-
lines.push(`FN:${fnLine},${fnName}`);
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
for (const [fnName] of sortedFunctions) {
|
|
153
|
-
const hits = record.functionHits.get(fnName) || 0;
|
|
154
|
-
lines.push(`FNDA:${hits},${fnName}`);
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
const fnf = sortedFunctions.length;
|
|
158
|
-
const fnh = sortedFunctions.reduce((acc, [fnName]) => acc + ((record.functionHits.get(fnName) || 0) > 0 ? 1 : 0), 0);
|
|
159
|
-
lines.push(`FNF:${fnf}`);
|
|
160
|
-
lines.push(`FNH:${fnh}`);
|
|
161
|
-
|
|
162
|
-
const sortedLineEntries = [...record.lines.entries()].sort((a, b) => a[0] - b[0]);
|
|
163
|
-
for (const [lineNo, hits] of sortedLineEntries) {
|
|
164
|
-
lines.push(`DA:${lineNo},${hits}`);
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
const lf = sortedLineEntries.length;
|
|
168
|
-
const lh = sortedLineEntries.reduce((acc, [, hits]) => acc + (hits > 0 ? 1 : 0), 0);
|
|
169
|
-
lines.push(`LF:${lf}`);
|
|
170
|
-
lines.push(`LH:${lh}`);
|
|
171
|
-
|
|
172
|
-
if (record.branches.size > 0) {
|
|
173
|
-
const sortedBranchEntries = [...record.branches.entries()].sort((a, b) => {
|
|
174
|
-
const [aLine, aBlock, aBranch] = a[0].split(",").map(Number);
|
|
175
|
-
const [bLine, bBlock, bBranch] = b[0].split(",").map(Number);
|
|
176
|
-
if (aLine !== bLine) return aLine - bLine;
|
|
177
|
-
if (aBlock !== bBlock) return aBlock - bBlock;
|
|
178
|
-
return aBranch - bBranch;
|
|
179
|
-
});
|
|
180
|
-
|
|
181
|
-
for (const [key, taken] of sortedBranchEntries) {
|
|
182
|
-
const takenValue = taken < 0 ? "-" : String(taken);
|
|
183
|
-
lines.push(`BRDA:${key},${takenValue}`);
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
const brf = sortedBranchEntries.length;
|
|
187
|
-
const brh = sortedBranchEntries.reduce((acc, [, taken]) => acc + (taken > 0 ? 1 : 0), 0);
|
|
188
|
-
lines.push(`BRF:${brf}`);
|
|
189
|
-
lines.push(`BRH:${brh}`);
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
lines.push("end_of_record");
|
|
193
|
-
chunks.push(lines.join("\n"));
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
return chunks.join("\n");
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
function main() {
|
|
200
|
-
const [, , ...args] = process.argv;
|
|
201
|
-
if (args.length < 3) {
|
|
202
|
-
console.error("Usage: node scripts/merge-lcov.mjs <input1> <input2> [moreInputs...] <output>");
|
|
203
|
-
process.exit(1);
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
const outputPath = args[args.length - 1];
|
|
207
|
-
const inputPaths = args.slice(0, -1);
|
|
208
|
-
const allRecords = [];
|
|
209
|
-
|
|
210
|
-
for (const inputPath of inputPaths) {
|
|
211
|
-
const content = fs.readFileSync(inputPath, "utf8");
|
|
212
|
-
allRecords.push(...parseLcov(content));
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
const merged = mergeRecords(allRecords);
|
|
216
|
-
|
|
217
|
-
// Filter out non-source files that SonarCloud can't resolve:
|
|
218
|
-
// - tests/ and e2e/ directories (test infrastructure, not source)
|
|
219
|
-
// - src/components/ui/ (excluded in sonar.exclusions)
|
|
220
|
-
const filtered = merged.filter((r) => {
|
|
221
|
-
if (!r.sf.startsWith("src/")) return false;
|
|
222
|
-
if (r.sf.startsWith("src/components/ui/")) return false;
|
|
223
|
-
return true;
|
|
224
|
-
});
|
|
225
|
-
|
|
226
|
-
const skipped = merged.length - filtered.length;
|
|
227
|
-
if (skipped > 0) {
|
|
228
|
-
console.log(`Filtered ${skipped} non-source record(s) (tests/, src/components/ui/)`);
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
const serialized = serializeRecords(filtered);
|
|
232
|
-
|
|
233
|
-
ensureParentDir(outputPath);
|
|
234
|
-
fs.writeFileSync(outputPath, serialized ? `${serialized}\n` : "", "utf8");
|
|
235
|
-
console.log(`Merged ${inputPaths.length} LCOV file(s) into ${outputPath}`);
|
|
236
|
-
console.log(`Records: ${merged.length}`);
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
main();
|
package/sonar-project.properties
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
sonar.projectKey=libredb_libredb-studio
|
|
2
|
-
sonar.organization=libredb
|
|
3
|
-
|
|
4
|
-
sonar.projectName=libredb-studio
|
|
5
|
-
sonar.projectVersion=0.6.38
|
|
6
|
-
|
|
7
|
-
sonar.sources=src
|
|
8
|
-
sonar.tests=tests,e2e
|
|
9
|
-
sonar.test.inclusions=tests/**/*.test.ts,tests/**/*.test.tsx,e2e/**/*.spec.ts
|
|
10
|
-
|
|
11
|
-
# Exclude only runtime/generated code, NOT test files
|
|
12
|
-
sonar.exclusions=**/node_modules/**,**/.next/**,**/build/**,**/out/**,src/components/ui/**
|
|
13
|
-
|
|
14
|
-
sonar.javascript.lcov.reportPaths=coverage/lcov.info
|
|
15
|
-
sonar.typescript.tsconfigPath=tsconfig.json
|
|
16
|
-
sonar.sourceEncoding=UTF-8
|
package/src/app/admin/error.tsx
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import { useEffect } from 'react';
|
|
4
|
-
|
|
5
|
-
export default function AdminError({
|
|
6
|
-
error,
|
|
7
|
-
reset,
|
|
8
|
-
}: {
|
|
9
|
-
error: Error & { digest?: string };
|
|
10
|
-
reset: () => void;
|
|
11
|
-
}) {
|
|
12
|
-
useEffect(() => {
|
|
13
|
-
console.error('[AdminErrorBoundary]', error.message, error.digest);
|
|
14
|
-
}, [error]);
|
|
15
|
-
|
|
16
|
-
return (
|
|
17
|
-
<div className="flex min-h-screen items-center justify-center bg-zinc-950 text-white">
|
|
18
|
-
<div className="max-w-md text-center px-6">
|
|
19
|
-
<h1 className="text-xl font-semibold mb-2">Admin Dashboard Error</h1>
|
|
20
|
-
<p className="text-zinc-400 mb-6 text-sm">
|
|
21
|
-
The admin dashboard encountered an error. You can try again or return
|
|
22
|
-
to the main studio.
|
|
23
|
-
</p>
|
|
24
|
-
{error.digest && (
|
|
25
|
-
<p className="text-zinc-600 text-xs mb-4">
|
|
26
|
-
Error ID: {error.digest}
|
|
27
|
-
</p>
|
|
28
|
-
)}
|
|
29
|
-
<div className="flex gap-3 justify-center">
|
|
30
|
-
<button
|
|
31
|
-
onClick={reset}
|
|
32
|
-
className="px-5 py-2.5 bg-blue-600 hover:bg-blue-700 text-white rounded-lg text-sm font-medium transition-colors"
|
|
33
|
-
>
|
|
34
|
-
Try Again
|
|
35
|
-
</button>
|
|
36
|
-
<button
|
|
37
|
-
onClick={() => { window.location.href = '/'; }}
|
|
38
|
-
className="px-5 py-2.5 border border-zinc-700 hover:border-zinc-500 text-zinc-300 rounded-lg text-sm font-medium transition-colors"
|
|
39
|
-
>
|
|
40
|
-
Back to Studio
|
|
41
|
-
</button>
|
|
42
|
-
</div>
|
|
43
|
-
</div>
|
|
44
|
-
</div>
|
|
45
|
-
);
|
|
46
|
-
}
|
package/src/app/admin/page.tsx
DELETED
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import { getSession } from '@/lib/auth';
|
|
2
|
-
import { NextResponse } from 'next/server';
|
|
3
|
-
import { getServerAuditBuffer, type AuditEventType } from '@/lib/audit';
|
|
4
|
-
import { createErrorResponse } from '@/lib/api/errors';
|
|
5
|
-
|
|
6
|
-
export async function GET(request: Request) {
|
|
7
|
-
try {
|
|
8
|
-
const session = await getSession();
|
|
9
|
-
if (!session || session.role !== 'admin') {
|
|
10
|
-
return NextResponse.json(
|
|
11
|
-
{ error: 'Unauthorized. Admin access required.' },
|
|
12
|
-
{ status: 403 }
|
|
13
|
-
);
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
const { searchParams } = new URL(request.url);
|
|
17
|
-
const type = searchParams.get('type') as AuditEventType | null;
|
|
18
|
-
const limit = parseInt(searchParams.get('limit') || '100', 10);
|
|
19
|
-
|
|
20
|
-
const buffer = getServerAuditBuffer();
|
|
21
|
-
const events = type
|
|
22
|
-
? buffer.filter({ type })
|
|
23
|
-
: buffer.getRecent(limit);
|
|
24
|
-
|
|
25
|
-
return NextResponse.json({ events, total: buffer.size });
|
|
26
|
-
} catch (error) {
|
|
27
|
-
return createErrorResponse(error, { route: 'GET /api/admin/audit' });
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export async function POST(request: Request) {
|
|
32
|
-
const session = await getSession();
|
|
33
|
-
if (!session || session.role !== 'admin') {
|
|
34
|
-
return NextResponse.json(
|
|
35
|
-
{ error: 'Unauthorized. Admin access required.' },
|
|
36
|
-
{ status: 403 }
|
|
37
|
-
);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
try {
|
|
41
|
-
const event = await request.json();
|
|
42
|
-
const buffer = getServerAuditBuffer();
|
|
43
|
-
const created = buffer.push({
|
|
44
|
-
...event,
|
|
45
|
-
user: session.username || 'admin',
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
return NextResponse.json({ event: created });
|
|
49
|
-
} catch (error) {
|
|
50
|
-
return createErrorResponse(error, { route: 'POST /api/admin/audit' });
|
|
51
|
-
}
|
|
52
|
-
}
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import { getSession } from '@/lib/auth';
|
|
2
|
-
import { NextResponse } from 'next/server';
|
|
3
|
-
import { getOrCreateProvider } from '@/lib/db';
|
|
4
|
-
import type { DatabaseConnection } from '@/lib/types';
|
|
5
|
-
import { createErrorResponse } from '@/lib/api/errors';
|
|
6
|
-
import { resolveConnection } from '@/lib/seed/resolve-connection';
|
|
7
|
-
|
|
8
|
-
export interface FleetHealthItem {
|
|
9
|
-
connectionId: string;
|
|
10
|
-
connectionName: string;
|
|
11
|
-
type: string;
|
|
12
|
-
environment?: string;
|
|
13
|
-
status: 'healthy' | 'degraded' | 'error';
|
|
14
|
-
latencyMs: number;
|
|
15
|
-
activeConnections?: number;
|
|
16
|
-
databaseSize?: string;
|
|
17
|
-
error?: string;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export async function POST(request: Request) {
|
|
21
|
-
const session = await getSession();
|
|
22
|
-
if (!session || session.role !== 'admin') {
|
|
23
|
-
return NextResponse.json(
|
|
24
|
-
{ error: 'Unauthorized. Admin access required.' },
|
|
25
|
-
{ status: 403 }
|
|
26
|
-
);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
try {
|
|
30
|
-
const { connections } = (await request.json()) as {
|
|
31
|
-
connections: DatabaseConnection[];
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
if (!connections || !Array.isArray(connections)) {
|
|
35
|
-
return NextResponse.json(
|
|
36
|
-
{ error: 'connections array is required' },
|
|
37
|
-
{ status: 400 }
|
|
38
|
-
);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
const results: FleetHealthItem[] = await Promise.all(
|
|
42
|
-
connections.map(async (conn): Promise<FleetHealthItem> => {
|
|
43
|
-
const start = Date.now();
|
|
44
|
-
try {
|
|
45
|
-
// Resolve managed seed connections (server-side credential injection)
|
|
46
|
-
const resolved = conn.managed && conn.seedId
|
|
47
|
-
? await resolveConnection({ connectionId: `seed:${conn.seedId}` }, session!)
|
|
48
|
-
: conn;
|
|
49
|
-
const provider = await getOrCreateProvider(resolved);
|
|
50
|
-
const health = await provider.getHealth();
|
|
51
|
-
const latencyMs = Date.now() - start;
|
|
52
|
-
|
|
53
|
-
return {
|
|
54
|
-
connectionId: conn.id,
|
|
55
|
-
connectionName: conn.name,
|
|
56
|
-
type: conn.type,
|
|
57
|
-
environment: conn.environment,
|
|
58
|
-
status: latencyMs > 5000 ? 'degraded' : 'healthy',
|
|
59
|
-
latencyMs,
|
|
60
|
-
activeConnections: health.activeConnections,
|
|
61
|
-
databaseSize: health.databaseSize,
|
|
62
|
-
};
|
|
63
|
-
} catch (err) {
|
|
64
|
-
return {
|
|
65
|
-
connectionId: conn.id,
|
|
66
|
-
connectionName: conn.name,
|
|
67
|
-
type: conn.type,
|
|
68
|
-
environment: conn.environment,
|
|
69
|
-
status: 'error',
|
|
70
|
-
latencyMs: Date.now() - start,
|
|
71
|
-
error: err instanceof Error ? err.message : 'Connection failed',
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
})
|
|
75
|
-
);
|
|
76
|
-
|
|
77
|
-
return NextResponse.json({ results });
|
|
78
|
-
} catch (error) {
|
|
79
|
-
return createErrorResponse(error, { route: 'POST /api/admin/fleet-health' });
|
|
80
|
-
}
|
|
81
|
-
}
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
import { NextRequest } from 'next/server';
|
|
2
|
-
import { createLLMProvider } from '@/lib/llm';
|
|
3
|
-
import { createErrorResponse } from '@/lib/api/errors';
|
|
4
|
-
|
|
5
|
-
function buildAutopilotPrompt(databaseType: string): string {
|
|
6
|
-
return `You are a Database Performance Autopilot for ${databaseType || 'PostgreSQL'}. You combine slow query analysis, execution plans, table statistics, and index usage into a comprehensive optimization report.
|
|
7
|
-
|
|
8
|
-
OUTPUT FORMAT (markdown):
|
|
9
|
-
|
|
10
|
-
## Performance Score
|
|
11
|
-
Give a score out of 100 based on the overall health metrics. Use emoji: >=80 green, 60-79 yellow, <60 red.
|
|
12
|
-
|
|
13
|
-
## Critical Issues
|
|
14
|
-
Issues that need immediate attention (blocking queries, high bloat, cache miss rates).
|
|
15
|
-
|
|
16
|
-
## Top Slow Queries
|
|
17
|
-
For each slow query (top 5):
|
|
18
|
-
### Query #N
|
|
19
|
-
- **Avg Time:** Xms (Y calls)
|
|
20
|
-
- **Issue:** What's making it slow
|
|
21
|
-
- **Fix:**
|
|
22
|
-
\`\`\`sql
|
|
23
|
-
-- Optimized version or CREATE INDEX suggestion
|
|
24
|
-
\`\`\`
|
|
25
|
-
|
|
26
|
-
## Index Recommendations
|
|
27
|
-
Consolidated index suggestions from the slow query analysis.
|
|
28
|
-
|
|
29
|
-
## Maintenance Tasks
|
|
30
|
-
Recommended VACUUM, ANALYZE, REINDEX operations with priority.
|
|
31
|
-
|
|
32
|
-
## Configuration Suggestions
|
|
33
|
-
Any ${databaseType} configuration parameters that might improve performance based on the metrics.
|
|
34
|
-
|
|
35
|
-
## Action Plan
|
|
36
|
-
Numbered priority list of what to do first, second, third.
|
|
37
|
-
|
|
38
|
-
GUIDELINES:
|
|
39
|
-
- Be actionable: every recommendation should have a concrete SQL command
|
|
40
|
-
- Prioritize by impact: fix the biggest bottleneck first
|
|
41
|
-
- Consider trade-offs: new indexes use space, VACUUM needs downtime
|
|
42
|
-
- For ${databaseType}, use database-specific features and best practices
|
|
43
|
-
`;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
export async function POST(req: NextRequest) {
|
|
47
|
-
try {
|
|
48
|
-
const {
|
|
49
|
-
slowQueries,
|
|
50
|
-
indexStats,
|
|
51
|
-
tableStats,
|
|
52
|
-
performanceMetrics,
|
|
53
|
-
overview,
|
|
54
|
-
schemaContext,
|
|
55
|
-
databaseType
|
|
56
|
-
} = await req.json();
|
|
57
|
-
|
|
58
|
-
const provider = await createLLMProvider();
|
|
59
|
-
const systemPrompt = buildAutopilotPrompt(databaseType);
|
|
60
|
-
|
|
61
|
-
const parts: string[] = [];
|
|
62
|
-
|
|
63
|
-
if (overview) {
|
|
64
|
-
parts.push('## Database Overview\n' + JSON.stringify(overview, null, 2));
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
if (performanceMetrics) {
|
|
68
|
-
parts.push('## Performance Metrics\n' + JSON.stringify(performanceMetrics, null, 2));
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
if (slowQueries?.length) {
|
|
72
|
-
parts.push('## Slow Queries (Top 20)\n' + JSON.stringify(slowQueries.slice(0, 20), null, 2));
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
if (indexStats?.length) {
|
|
76
|
-
parts.push('## Index Statistics\n' + JSON.stringify(indexStats.slice(0, 50), null, 2));
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
if (tableStats?.length) {
|
|
80
|
-
parts.push('## Table Statistics\n' + JSON.stringify(tableStats.slice(0, 30), null, 2));
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
if (schemaContext) {
|
|
84
|
-
parts.push('## Schema\n' + schemaContext.substring(0, 3000));
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
const userMessage = `Analyze the following database metrics and provide a comprehensive performance optimization report:\n\n${parts.join('\n\n')}`;
|
|
88
|
-
|
|
89
|
-
const stream = await provider.stream({
|
|
90
|
-
messages: [
|
|
91
|
-
{ role: 'system', content: systemPrompt },
|
|
92
|
-
{ role: 'user', content: userMessage },
|
|
93
|
-
],
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
return new Response(stream, {
|
|
97
|
-
headers: {
|
|
98
|
-
'Content-Type': 'text/plain; charset=utf-8',
|
|
99
|
-
'Transfer-Encoding': 'chunked',
|
|
100
|
-
},
|
|
101
|
-
});
|
|
102
|
-
} catch (error) {
|
|
103
|
-
return createErrorResponse(error, { route: 'api/ai/autopilot' });
|
|
104
|
-
}
|
|
105
|
-
}
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
import { NextRequest } from 'next/server';
|
|
2
|
-
import { createLLMProvider } from '@/lib/llm';
|
|
3
|
-
import { createErrorResponse } from '@/lib/api/errors';
|
|
4
|
-
|
|
5
|
-
// ============================================================================
|
|
6
|
-
// System Prompt Builder
|
|
7
|
-
// ============================================================================
|
|
8
|
-
|
|
9
|
-
function buildSystemInstruction(databaseType: string, schemaContext: string, queryLanguage?: string): string {
|
|
10
|
-
if (queryLanguage === 'json') {
|
|
11
|
-
return `You are an Expert Generative AI Engineer and Senior MongoDB Database Administrator specializing in MQL queries, aggregation pipelines, and document database design.
|
|
12
|
-
|
|
13
|
-
ROLE:
|
|
14
|
-
- Senior MongoDB Expert & Database Architect.
|
|
15
|
-
- Expert Gen-AI Engineer for LibreDB Studio.
|
|
16
|
-
|
|
17
|
-
CAPABILITIES:
|
|
18
|
-
- Generate highly optimized MongoDB JSON queries.
|
|
19
|
-
- Analyze collection schemas to provide insights and optimizations.
|
|
20
|
-
- Explain complex MongoDB operations clearly if requested.
|
|
21
|
-
- Ensure security best practices.
|
|
22
|
-
|
|
23
|
-
DATABASE CONTEXT:
|
|
24
|
-
Type: MongoDB
|
|
25
|
-
|
|
26
|
-
COLLECTION INFORMATION (TOP 100 COLLECTIONS BY DOCUMENT COUNT):
|
|
27
|
-
${schemaContext || 'No specific schema provided. Ask the user for collection details if needed for precise queries.'}
|
|
28
|
-
|
|
29
|
-
QUERY FORMAT:
|
|
30
|
-
LibreDB Studio uses JSON-based queries with this structure:
|
|
31
|
-
{
|
|
32
|
-
"collection": "collection_name",
|
|
33
|
-
"operation": "find|findOne|aggregate|count|distinct|insertOne|insertMany|updateOne|updateMany|deleteOne|deleteMany",
|
|
34
|
-
"filter": {},
|
|
35
|
-
"pipeline": [],
|
|
36
|
-
"update": {},
|
|
37
|
-
"documents": [],
|
|
38
|
-
"options": { "limit": 50, "sort": {}, "projection": {}, "skip": 0 }
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
SUPPORTED OPERATIONS:
|
|
42
|
-
- find: Query documents with filter, projection, sort, limit, skip
|
|
43
|
-
- findOne: Return single document matching filter
|
|
44
|
-
- aggregate: Run aggregation pipeline (use "pipeline" field)
|
|
45
|
-
- count: Count documents matching filter
|
|
46
|
-
- distinct: Get distinct values (use projection to specify field)
|
|
47
|
-
- insertOne/insertMany: Insert documents (use "documents" field)
|
|
48
|
-
- updateOne/updateMany: Update documents (use "filter" + "update" fields)
|
|
49
|
-
- deleteOne/deleteMany: Delete documents matching filter
|
|
50
|
-
|
|
51
|
-
GUIDELINES:
|
|
52
|
-
1. Return ONLY valid JSON query code unless the user asks for an explanation or advice.
|
|
53
|
-
2. Wrap JSON queries in markdown code blocks: \`\`\`json ... \`\`\`.
|
|
54
|
-
3. Use proper MongoDB query operators ($eq, $gt, $lt, $in, $regex, $exists, etc.).
|
|
55
|
-
4. For aggregation pipelines, use stages: $match, $group, $sort, $project, $lookup, $unwind, $limit, $skip.
|
|
56
|
-
5. If the schema context is provided, use exact collection and field names.
|
|
57
|
-
6. Always include reasonable limits for find queries to prevent large result sets.
|
|
58
|
-
`;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
return `You are an Expert Generative AI Engineer and Senior Database Administrator (DBA) specializing in SQL optimization, schema design, and data engineering.
|
|
62
|
-
|
|
63
|
-
ROLE:
|
|
64
|
-
- Senior SQL Expert & Database Architect.
|
|
65
|
-
- Expert Gen-AI Engineer for LibreDB Studio.
|
|
66
|
-
|
|
67
|
-
CAPABILITIES:
|
|
68
|
-
- Generate highly optimized, production-ready SQL queries.
|
|
69
|
-
- Analyze database schemas to provide insights and optimizations.
|
|
70
|
-
- Explain complex SQL operations clearly if requested.
|
|
71
|
-
- Ensure security best practices (e.g., avoiding dangerous operations unless explicitly confirmed).
|
|
72
|
-
|
|
73
|
-
DATABASE CONTEXT:
|
|
74
|
-
Type: ${databaseType || 'Postgres'}
|
|
75
|
-
|
|
76
|
-
SCHEMA INFORMATION (TOP 100 TABLES BY ROW COUNT):
|
|
77
|
-
${schemaContext || 'No specific schema provided. Ask the user for table details if needed for precise queries.'}
|
|
78
|
-
|
|
79
|
-
GUIDELINES:
|
|
80
|
-
1. Return ONLY pure SQL code unless the user asks for an explanation or advice.
|
|
81
|
-
2. If generating SQL, wrap it in markdown code blocks: \`\`\`sql ... \`\`\`.
|
|
82
|
-
3. Use standard naming conventions and ensure compatibility with ${databaseType || 'Postgres'}.
|
|
83
|
-
4. Always prioritize query performance and readability.
|
|
84
|
-
5. If the schema context is provided, use exact table and column names.
|
|
85
|
-
6. If you notice potential schema improvements (indexes, normalization), mention them briefly if relevant.
|
|
86
|
-
`;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// ============================================================================
|
|
90
|
-
// API Route Handler
|
|
91
|
-
// ============================================================================
|
|
92
|
-
|
|
93
|
-
export async function POST(req: NextRequest) {
|
|
94
|
-
try {
|
|
95
|
-
const { prompt, schemaContext, databaseType, queryLanguage, conversationHistory } = await req.json();
|
|
96
|
-
|
|
97
|
-
// Create provider from environment configuration (async - dynamically loads provider)
|
|
98
|
-
const provider = await createLLMProvider();
|
|
99
|
-
|
|
100
|
-
// Build messages
|
|
101
|
-
const systemInstruction = buildSystemInstruction(databaseType, schemaContext, queryLanguage);
|
|
102
|
-
|
|
103
|
-
// Build message array with optional conversation history for multi-turn
|
|
104
|
-
const messages: { role: 'system' | 'user' | 'assistant'; content: string }[] = [
|
|
105
|
-
{ role: 'system', content: systemInstruction },
|
|
106
|
-
];
|
|
107
|
-
|
|
108
|
-
// Add conversation history if provided (multi-turn support)
|
|
109
|
-
if (conversationHistory?.length) {
|
|
110
|
-
for (const msg of conversationHistory) {
|
|
111
|
-
if (msg.role === 'user' || msg.role === 'assistant') {
|
|
112
|
-
messages.push({ role: msg.role, content: msg.content });
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
// Add the current prompt
|
|
118
|
-
messages.push({ role: 'user', content: prompt });
|
|
119
|
-
|
|
120
|
-
// Stream completion
|
|
121
|
-
const stream = await provider.stream({ messages });
|
|
122
|
-
|
|
123
|
-
return new Response(stream, {
|
|
124
|
-
headers: {
|
|
125
|
-
'Content-Type': 'text/plain; charset=utf-8',
|
|
126
|
-
'Transfer-Encoding': 'chunked',
|
|
127
|
-
},
|
|
128
|
-
});
|
|
129
|
-
} catch (error) {
|
|
130
|
-
return createErrorResponse(error, { route: 'api/ai/chat' });
|
|
131
|
-
}
|
|
132
|
-
}
|