@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
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
import { P as ProviderCapabilities, b as ProviderLabels } from './types-Der_X8E8.js';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
4
|
+
import { e as QueryResult, T as TableSchema, D as DatabaseConnection } from './types-BJvJfxSY.js';
|
|
5
|
+
|
|
6
|
+
interface QueryEditorRef {
|
|
7
|
+
getSelectedText: () => string;
|
|
8
|
+
getEffectiveQuery: () => string;
|
|
9
|
+
getValue: () => string;
|
|
10
|
+
setValue: (value: string) => void;
|
|
11
|
+
focus: () => void;
|
|
12
|
+
format: () => void;
|
|
13
|
+
toggleAi: () => void;
|
|
14
|
+
}
|
|
15
|
+
interface QueryEditorProps {
|
|
16
|
+
/** Initial value for the editor. Changes to this prop will update the editor content. */
|
|
17
|
+
value: string;
|
|
18
|
+
/** Optional callback for value changes. Only called on blur, execute, or explicit sync - NOT on every keystroke. */
|
|
19
|
+
onChange?: (val: string) => void;
|
|
20
|
+
/** Called when content changes in real-time. Use sparingly as it triggers on every keystroke. */
|
|
21
|
+
onContentChange?: (val: string) => void;
|
|
22
|
+
onExplain?: () => void;
|
|
23
|
+
language?: 'sql' | 'json';
|
|
24
|
+
tables?: string[];
|
|
25
|
+
databaseType?: string;
|
|
26
|
+
schemaContext?: string;
|
|
27
|
+
capabilities?: ProviderCapabilities;
|
|
28
|
+
/** Optional API adapter: when provided, bypasses the built-in /api/ai/chat fetch. */
|
|
29
|
+
onAiChat?: (params: {
|
|
30
|
+
prompt: string;
|
|
31
|
+
schemaContext: string;
|
|
32
|
+
history: {
|
|
33
|
+
role: string;
|
|
34
|
+
content: string;
|
|
35
|
+
}[];
|
|
36
|
+
}) => Promise<string>;
|
|
37
|
+
}
|
|
38
|
+
declare const QueryEditor: React.ForwardRefExoticComponent<QueryEditorProps & React.RefAttributes<QueryEditorRef>>;
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Data Masking Utility
|
|
42
|
+
* Auto-detects sensitive columns by name patterns and masks their values.
|
|
43
|
+
* Supports configurable patterns, RBAC, per-cell reveal, and persistence.
|
|
44
|
+
*/
|
|
45
|
+
type MaskType = 'email' | 'phone' | 'card' | 'ssn' | 'full' | 'partial' | 'ip' | 'date' | 'financial' | 'custom';
|
|
46
|
+
interface MaskingPattern {
|
|
47
|
+
id: string;
|
|
48
|
+
name: string;
|
|
49
|
+
columnPatterns: string[];
|
|
50
|
+
maskType: MaskType;
|
|
51
|
+
enabled: boolean;
|
|
52
|
+
isBuiltin: boolean;
|
|
53
|
+
customMask?: string;
|
|
54
|
+
}
|
|
55
|
+
interface MaskingConfig {
|
|
56
|
+
enabled: boolean;
|
|
57
|
+
patterns: MaskingPattern[];
|
|
58
|
+
roleSettings: {
|
|
59
|
+
admin: {
|
|
60
|
+
canToggle: boolean;
|
|
61
|
+
canReveal: boolean;
|
|
62
|
+
};
|
|
63
|
+
user: {
|
|
64
|
+
canToggle: boolean;
|
|
65
|
+
canReveal: boolean;
|
|
66
|
+
};
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
interface CellChange {
|
|
71
|
+
rowIndex: number;
|
|
72
|
+
columnId: string;
|
|
73
|
+
originalValue: unknown;
|
|
74
|
+
newValue: string;
|
|
75
|
+
}
|
|
76
|
+
interface ResultsGridProps {
|
|
77
|
+
result: QueryResult;
|
|
78
|
+
onLoadMore?: () => void;
|
|
79
|
+
isLoadingMore?: boolean;
|
|
80
|
+
maskingEnabled?: boolean;
|
|
81
|
+
onToggleMasking?: () => void;
|
|
82
|
+
userRole?: string;
|
|
83
|
+
maskingConfig?: MaskingConfig;
|
|
84
|
+
editingEnabled?: boolean;
|
|
85
|
+
pendingChanges?: CellChange[];
|
|
86
|
+
onCellChange?: (change: CellChange) => void;
|
|
87
|
+
onDiscardChanges?: () => void;
|
|
88
|
+
onApplyChanges?: () => void;
|
|
89
|
+
}
|
|
90
|
+
declare function ResultsGrid({ result, onLoadMore, isLoadingMore, maskingEnabled, onToggleMasking, userRole, maskingConfig, editingEnabled, pendingChanges, onCellChange, onDiscardChanges, onApplyChanges, }: ResultsGridProps): react_jsx_runtime.JSX.Element;
|
|
91
|
+
|
|
92
|
+
interface SchemaDiagramProps {
|
|
93
|
+
schema: TableSchema[];
|
|
94
|
+
onClose: () => void;
|
|
95
|
+
}
|
|
96
|
+
declare function SchemaDiagram({ schema, onClose }: SchemaDiagramProps): react_jsx_runtime.JSX.Element;
|
|
97
|
+
|
|
98
|
+
interface DataChartsProps {
|
|
99
|
+
result: QueryResult | null;
|
|
100
|
+
}
|
|
101
|
+
declare function DataCharts({ result }: DataChartsProps): react_jsx_runtime.JSX.Element;
|
|
102
|
+
|
|
103
|
+
interface CodeGeneratorProps {
|
|
104
|
+
isOpen: boolean;
|
|
105
|
+
onClose: () => void;
|
|
106
|
+
tableName: string;
|
|
107
|
+
tableSchema: TableSchema | null;
|
|
108
|
+
databaseType?: string;
|
|
109
|
+
}
|
|
110
|
+
declare function CodeGenerator({ isOpen, onClose, tableName, tableSchema, databaseType, }: CodeGeneratorProps): react_jsx_runtime.JSX.Element | null;
|
|
111
|
+
|
|
112
|
+
interface TestDataGeneratorProps {
|
|
113
|
+
isOpen: boolean;
|
|
114
|
+
onClose: () => void;
|
|
115
|
+
tableName: string;
|
|
116
|
+
tableSchema: TableSchema | null;
|
|
117
|
+
databaseType?: string;
|
|
118
|
+
queryLanguage?: string;
|
|
119
|
+
onExecuteQuery: (query: string) => void;
|
|
120
|
+
}
|
|
121
|
+
declare function TestDataGenerator({ isOpen, onClose, tableName, tableSchema, queryLanguage, onExecuteQuery, }: TestDataGeneratorProps): react_jsx_runtime.JSX.Element | null;
|
|
122
|
+
|
|
123
|
+
type ExplainPlanNode = {
|
|
124
|
+
Plan?: ExplainPlanNode;
|
|
125
|
+
'Node Type'?: string;
|
|
126
|
+
'Actual Rows'?: number;
|
|
127
|
+
'Plan Rows'?: number;
|
|
128
|
+
'Actual Total Time'?: number;
|
|
129
|
+
'Total Cost'?: number;
|
|
130
|
+
'Shared Hit Blocks'?: number;
|
|
131
|
+
'Shared Read Blocks'?: number;
|
|
132
|
+
'Relation Name'?: string;
|
|
133
|
+
'Actual Loops'?: number;
|
|
134
|
+
Filter?: string;
|
|
135
|
+
'Index Name'?: string;
|
|
136
|
+
Plans?: ExplainPlanNode[];
|
|
137
|
+
};
|
|
138
|
+
type ExplainPlanResult = {
|
|
139
|
+
Plan?: ExplainPlanNode;
|
|
140
|
+
'Execution Time'?: number;
|
|
141
|
+
'Planning Time'?: number;
|
|
142
|
+
};
|
|
143
|
+
interface VisualExplainProps {
|
|
144
|
+
plan: ExplainPlanResult[] | null | undefined;
|
|
145
|
+
query?: string;
|
|
146
|
+
schemaContext?: string;
|
|
147
|
+
databaseType?: string;
|
|
148
|
+
onLoadQuery?: (query: string) => void;
|
|
149
|
+
}
|
|
150
|
+
declare function VisualExplain({ plan, query, schemaContext, databaseType, onLoadQuery }: VisualExplainProps): react_jsx_runtime.JSX.Element;
|
|
151
|
+
|
|
152
|
+
interface NL2SQLPanelProps {
|
|
153
|
+
isOpen: boolean;
|
|
154
|
+
onClose: () => void;
|
|
155
|
+
onExecuteQuery: (query: string) => void;
|
|
156
|
+
onLoadQuery: (query: string) => void;
|
|
157
|
+
schemaContext: string;
|
|
158
|
+
databaseType?: string;
|
|
159
|
+
queryLanguage?: string;
|
|
160
|
+
/** Optional API adapter: when provided, bypasses the built-in /api/ai/nl2sql fetch. */
|
|
161
|
+
onNL2SQL?: (params: {
|
|
162
|
+
prompt: string;
|
|
163
|
+
schemaContext: string;
|
|
164
|
+
conversationHistory?: {
|
|
165
|
+
role: string;
|
|
166
|
+
content: string;
|
|
167
|
+
}[];
|
|
168
|
+
}) => Promise<string>;
|
|
169
|
+
}
|
|
170
|
+
declare function NL2SQLPanel({ isOpen, onClose, onExecuteQuery, onLoadQuery, schemaContext, databaseType, queryLanguage, onNL2SQL, }: NL2SQLPanelProps): react_jsx_runtime.JSX.Element | null;
|
|
171
|
+
|
|
172
|
+
interface ColumnProfile {
|
|
173
|
+
name: string;
|
|
174
|
+
type?: string;
|
|
175
|
+
totalRows: number;
|
|
176
|
+
nullCount: number;
|
|
177
|
+
nullPercent: number;
|
|
178
|
+
distinctCount: number;
|
|
179
|
+
minValue?: string;
|
|
180
|
+
maxValue?: string;
|
|
181
|
+
sampleValues?: string[];
|
|
182
|
+
error?: string;
|
|
183
|
+
}
|
|
184
|
+
interface ProfileData {
|
|
185
|
+
tableName: string;
|
|
186
|
+
totalRows: number;
|
|
187
|
+
columns: ColumnProfile[];
|
|
188
|
+
}
|
|
189
|
+
interface DataProfilerProps {
|
|
190
|
+
isOpen: boolean;
|
|
191
|
+
onClose: () => void;
|
|
192
|
+
tableName: string;
|
|
193
|
+
tableSchema: TableSchema | null;
|
|
194
|
+
connection: DatabaseConnection | null;
|
|
195
|
+
schemaContext?: string;
|
|
196
|
+
databaseType?: string;
|
|
197
|
+
/** Optional API adapter: when provided, bypasses the built-in /api/db/profile fetch. */
|
|
198
|
+
onProfile?: (params: {
|
|
199
|
+
connectionId: string;
|
|
200
|
+
tableName: string;
|
|
201
|
+
}) => Promise<ProfileData>;
|
|
202
|
+
/** Optional API adapter: when provided, bypasses the built-in /api/ai/describe-schema fetch. */
|
|
203
|
+
onDescribeSchema?: (params: {
|
|
204
|
+
tableName: string;
|
|
205
|
+
schemaContext: string;
|
|
206
|
+
}) => Promise<string>;
|
|
207
|
+
}
|
|
208
|
+
declare function DataProfiler({ isOpen, onClose, tableName, tableSchema, connection, schemaContext, databaseType, onProfile, onDescribeSchema, }: DataProfilerProps): react_jsx_runtime.JSX.Element | null;
|
|
209
|
+
|
|
210
|
+
interface SafetyAnalysis {
|
|
211
|
+
riskLevel: 'safe' | 'low' | 'medium' | 'high' | 'critical';
|
|
212
|
+
summary: string;
|
|
213
|
+
warnings: {
|
|
214
|
+
type: string;
|
|
215
|
+
severity: string;
|
|
216
|
+
message: string;
|
|
217
|
+
detail: string;
|
|
218
|
+
}[];
|
|
219
|
+
affectedRows: string;
|
|
220
|
+
cascadeEffects: string;
|
|
221
|
+
recommendation: string;
|
|
222
|
+
}
|
|
223
|
+
interface QuerySafetyDialogProps {
|
|
224
|
+
isOpen: boolean;
|
|
225
|
+
query: string;
|
|
226
|
+
schemaContext: string;
|
|
227
|
+
databaseType?: string;
|
|
228
|
+
onClose: () => void;
|
|
229
|
+
onProceed: () => void;
|
|
230
|
+
/** Optional API adapter: when provided, bypasses the built-in /api/ai/query-safety fetch. */
|
|
231
|
+
onAnalyzeSafety?: (params: {
|
|
232
|
+
query: string;
|
|
233
|
+
schemaContext: string;
|
|
234
|
+
}) => Promise<SafetyAnalysis>;
|
|
235
|
+
}
|
|
236
|
+
declare function QuerySafetyDialog({ isOpen, query, schemaContext, databaseType, onClose, onProceed, onAnalyzeSafety, }: QuerySafetyDialogProps): react_jsx_runtime.JSX.Element | null;
|
|
237
|
+
|
|
238
|
+
interface ConnectionModalProps {
|
|
239
|
+
isOpen: boolean;
|
|
240
|
+
onClose: () => void;
|
|
241
|
+
onConnect: (conn: DatabaseConnection) => void;
|
|
242
|
+
editConnection?: DatabaseConnection | null;
|
|
243
|
+
/** Optional API adapter: when provided, bypasses the built-in /api/db/test-connection fetch. */
|
|
244
|
+
onTestConnection?: (connection: DatabaseConnection) => Promise<{
|
|
245
|
+
success: boolean;
|
|
246
|
+
latency?: number;
|
|
247
|
+
error?: string;
|
|
248
|
+
}>;
|
|
249
|
+
}
|
|
250
|
+
declare function ConnectionModal({ isOpen, onClose, onConnect, editConnection, onTestConnection }: ConnectionModalProps): react_jsx_runtime.JSX.Element;
|
|
251
|
+
|
|
252
|
+
interface ProviderMetadata {
|
|
253
|
+
capabilities: ProviderCapabilities;
|
|
254
|
+
labels: ProviderLabels;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
interface SchemaExplorerProps {
|
|
258
|
+
schema: TableSchema[];
|
|
259
|
+
isLoadingSchema: boolean;
|
|
260
|
+
onTableClick?: (tableName: string) => void;
|
|
261
|
+
onGenerateSelect?: (tableName: string) => void;
|
|
262
|
+
onCreateTableClick?: () => void;
|
|
263
|
+
isAdmin?: boolean;
|
|
264
|
+
onOpenMaintenance?: (tab?: 'global' | 'tables' | 'sessions', table?: string) => void;
|
|
265
|
+
databaseType?: string;
|
|
266
|
+
metadata?: ProviderMetadata | null;
|
|
267
|
+
onProfileTable?: (tableName: string) => void;
|
|
268
|
+
onGenerateCode?: (tableName: string) => void;
|
|
269
|
+
onGenerateTestData?: (tableName: string) => void;
|
|
270
|
+
}
|
|
271
|
+
declare function SchemaExplorer({ schema, isLoadingSchema, onTableClick, onGenerateSelect, onCreateTableClick, isAdmin, onOpenMaintenance, metadata, onProfileTable, onGenerateCode, onGenerateTestData, }: SchemaExplorerProps): react_jsx_runtime.JSX.Element;
|
|
272
|
+
|
|
273
|
+
export { CodeGenerator, ConnectionModal, DataCharts, DataProfiler, NL2SQLPanel, QueryEditor, type QueryEditorRef, QuerySafetyDialog, ResultsGrid, SchemaDiagram, SchemaExplorer, TestDataGenerator, VisualExplain };
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkJOGLIOFO_js = require('./chunk-JOGLIOFO.js');
|
|
4
|
+
var chunkRBVDMLFV_js = require('./chunk-RBVDMLFV.js');
|
|
5
|
+
require('./chunk-VLCRUZX7.js');
|
|
6
|
+
require('./chunk-Q6LRDBK7.js');
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
Object.defineProperty(exports, "ConnectionModal", {
|
|
11
|
+
enumerable: true,
|
|
12
|
+
get: function () { return chunkJOGLIOFO_js.ConnectionModal; }
|
|
13
|
+
});
|
|
14
|
+
Object.defineProperty(exports, "CodeGenerator", {
|
|
15
|
+
enumerable: true,
|
|
16
|
+
get: function () { return chunkRBVDMLFV_js.CodeGenerator; }
|
|
17
|
+
});
|
|
18
|
+
Object.defineProperty(exports, "DataCharts", {
|
|
19
|
+
enumerable: true,
|
|
20
|
+
get: function () { return chunkRBVDMLFV_js.DataCharts; }
|
|
21
|
+
});
|
|
22
|
+
Object.defineProperty(exports, "DataProfiler", {
|
|
23
|
+
enumerable: true,
|
|
24
|
+
get: function () { return chunkRBVDMLFV_js.DataProfiler; }
|
|
25
|
+
});
|
|
26
|
+
Object.defineProperty(exports, "NL2SQLPanel", {
|
|
27
|
+
enumerable: true,
|
|
28
|
+
get: function () { return chunkRBVDMLFV_js.NL2SQLPanel; }
|
|
29
|
+
});
|
|
30
|
+
Object.defineProperty(exports, "QueryEditor", {
|
|
31
|
+
enumerable: true,
|
|
32
|
+
get: function () { return chunkRBVDMLFV_js.QueryEditor; }
|
|
33
|
+
});
|
|
34
|
+
Object.defineProperty(exports, "QuerySafetyDialog", {
|
|
35
|
+
enumerable: true,
|
|
36
|
+
get: function () { return chunkRBVDMLFV_js.QuerySafetyDialog; }
|
|
37
|
+
});
|
|
38
|
+
Object.defineProperty(exports, "ResultsGrid", {
|
|
39
|
+
enumerable: true,
|
|
40
|
+
get: function () { return chunkRBVDMLFV_js.ResultsGrid; }
|
|
41
|
+
});
|
|
42
|
+
Object.defineProperty(exports, "SchemaDiagram", {
|
|
43
|
+
enumerable: true,
|
|
44
|
+
get: function () { return chunkRBVDMLFV_js.SchemaDiagram; }
|
|
45
|
+
});
|
|
46
|
+
Object.defineProperty(exports, "SchemaExplorer", {
|
|
47
|
+
enumerable: true,
|
|
48
|
+
get: function () { return chunkRBVDMLFV_js.SchemaExplorer; }
|
|
49
|
+
});
|
|
50
|
+
Object.defineProperty(exports, "TestDataGenerator", {
|
|
51
|
+
enumerable: true,
|
|
52
|
+
get: function () { return chunkRBVDMLFV_js.TestDataGenerator; }
|
|
53
|
+
});
|
|
54
|
+
Object.defineProperty(exports, "VisualExplain", {
|
|
55
|
+
enumerable: true,
|
|
56
|
+
get: function () { return chunkRBVDMLFV_js.VisualExplain; }
|
|
57
|
+
});
|
|
58
|
+
//# sourceMappingURL=components.js.map
|
|
59
|
+
//# sourceMappingURL=components.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"components.js"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { ConnectionModal } from './chunk-VWVRUCQO.mjs';
|
|
2
|
+
export { CodeGenerator, DataCharts, DataProfiler, NL2SQLPanel, QueryEditor, QuerySafetyDialog, ResultsGrid, SchemaDiagram, SchemaExplorer, TestDataGenerator, VisualExplain } from './chunk-DZ2UB3C6.mjs';
|
|
3
|
+
import './chunk-6DRZXXNT.mjs';
|
|
4
|
+
import './chunk-4LVB3K53.mjs';
|
|
5
|
+
//# sourceMappingURL=components.mjs.map
|
|
6
|
+
//# sourceMappingURL=components.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"components.mjs"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkFYSE52VB_js = require('./chunk-FYSE52VB.js');
|
|
4
|
+
var chunkRCQB4FCE_js = require('./chunk-RCQB4FCE.js');
|
|
5
|
+
var chunkVLCRUZX7_js = require('./chunk-VLCRUZX7.js');
|
|
6
|
+
var chunkQ6LRDBK7_js = require('./chunk-Q6LRDBK7.js');
|
|
7
|
+
|
|
8
|
+
// src/lib/llm/providers/custom.ts
|
|
9
|
+
var CustomProvider = class extends chunkFYSE52VB_js.BaseLLMProvider {
|
|
10
|
+
constructor(config) {
|
|
11
|
+
super(config);
|
|
12
|
+
this.validate();
|
|
13
|
+
this.baseUrl = this.ensureApiUrl();
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Validate configuration - requires API URL
|
|
17
|
+
*/
|
|
18
|
+
validate() {
|
|
19
|
+
if (!this.config.apiUrl || this.config.apiUrl.trim() === "") {
|
|
20
|
+
throw new chunkRCQB4FCE_js.LLMConfigError(
|
|
21
|
+
"Custom provider requires LLM_API_URL environment variable.",
|
|
22
|
+
"custom"
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
if (!this.config.model || this.config.model.trim() === "") {
|
|
26
|
+
throw new chunkRCQB4FCE_js.LLMConfigError(
|
|
27
|
+
"Model name is required for Custom provider.",
|
|
28
|
+
"custom"
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Stream completion from custom endpoint
|
|
34
|
+
*/
|
|
35
|
+
async stream(options) {
|
|
36
|
+
return this.streamWithRetry(async () => {
|
|
37
|
+
const model = this.getModel(options);
|
|
38
|
+
const messages = this.buildMessages(options);
|
|
39
|
+
try {
|
|
40
|
+
const response = await this.fetchStream(model, messages, options);
|
|
41
|
+
await this.validateResponse(response);
|
|
42
|
+
return chunkFYSE52VB_js.createStreamFromSSEResponse(response, "custom");
|
|
43
|
+
} catch (error) {
|
|
44
|
+
if (error instanceof chunkRCQB4FCE_js.LLMAuthError || error instanceof chunkRCQB4FCE_js.LLMRateLimitError || error instanceof chunkRCQB4FCE_js.LLMConfigError) {
|
|
45
|
+
throw error;
|
|
46
|
+
}
|
|
47
|
+
throw this.mapError(error);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Build messages array in OpenAI format
|
|
53
|
+
*/
|
|
54
|
+
buildMessages(options) {
|
|
55
|
+
return options.messages.map((m) => ({
|
|
56
|
+
role: m.role,
|
|
57
|
+
content: m.content
|
|
58
|
+
}));
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Fetch streaming response from custom endpoint
|
|
62
|
+
*/
|
|
63
|
+
async fetchStream(model, messages, options) {
|
|
64
|
+
const headers = {
|
|
65
|
+
"Content-Type": "application/json"
|
|
66
|
+
};
|
|
67
|
+
if (this.config.apiKey) {
|
|
68
|
+
headers.Authorization = `Bearer ${this.config.apiKey}`;
|
|
69
|
+
}
|
|
70
|
+
const response = await fetch(`${this.baseUrl}/chat/completions`, {
|
|
71
|
+
method: "POST",
|
|
72
|
+
headers,
|
|
73
|
+
body: JSON.stringify(chunkQ6LRDBK7_js.__spreadValues(chunkQ6LRDBK7_js.__spreadValues({
|
|
74
|
+
model,
|
|
75
|
+
messages,
|
|
76
|
+
stream: true
|
|
77
|
+
}, options.temperature !== void 0 && { temperature: options.temperature }), options.maxTokens !== void 0 && { max_tokens: options.maxTokens }))
|
|
78
|
+
});
|
|
79
|
+
return response;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Validate response status
|
|
83
|
+
*/
|
|
84
|
+
async validateResponse(response) {
|
|
85
|
+
var _a, _b;
|
|
86
|
+
if (response.ok) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
let errorMessage = `HTTP ${response.status}`;
|
|
90
|
+
try {
|
|
91
|
+
const errorBody = await response.text();
|
|
92
|
+
const errorJson = JSON.parse(errorBody);
|
|
93
|
+
errorMessage = (_b = (_a = errorJson.error) == null ? void 0 : _a.message) != null ? _b : errorBody;
|
|
94
|
+
} catch (e) {
|
|
95
|
+
chunkVLCRUZX7_js.logger.debug("Could not parse error response body as JSON", { provider: "custom" });
|
|
96
|
+
}
|
|
97
|
+
if (response.status === 401 || response.status === 403) {
|
|
98
|
+
throw new chunkRCQB4FCE_js.LLMAuthError(
|
|
99
|
+
"Authentication failed. Check your API key configuration.",
|
|
100
|
+
"custom"
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
if (response.status === 429) {
|
|
104
|
+
throw new chunkRCQB4FCE_js.LLMRateLimitError(
|
|
105
|
+
"Rate limit exceeded. Please try again later.",
|
|
106
|
+
"custom"
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
throw new chunkRCQB4FCE_js.LLMStreamError(`Custom API error: ${errorMessage}`, "custom");
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Map errors to LLM error types
|
|
113
|
+
*/
|
|
114
|
+
mapError(error) {
|
|
115
|
+
if (error instanceof chunkRCQB4FCE_js.LLMStreamError) {
|
|
116
|
+
return error;
|
|
117
|
+
}
|
|
118
|
+
if (!(error instanceof Error)) {
|
|
119
|
+
return new chunkRCQB4FCE_js.LLMStreamError(String(error), "custom");
|
|
120
|
+
}
|
|
121
|
+
const message = error.message.toLowerCase();
|
|
122
|
+
if (message.includes("econnrefused") || message.includes("fetch failed") || message.includes("network")) {
|
|
123
|
+
return new chunkRCQB4FCE_js.LLMStreamError(
|
|
124
|
+
`Cannot connect to custom endpoint at ${this.baseUrl}. Make sure the service is running.`,
|
|
125
|
+
"custom"
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
return new chunkRCQB4FCE_js.LLMStreamError(error.message, "custom");
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
exports.CustomProvider = CustomProvider;
|
|
133
|
+
//# sourceMappingURL=custom-BNDOYC5P.js.map
|
|
134
|
+
//# sourceMappingURL=custom-BNDOYC5P.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/llm/providers/custom.ts"],"names":["BaseLLMProvider","LLMConfigError","createStreamFromSSEResponse","LLMAuthError","LLMRateLimitError","__spreadValues","logger","LLMStreamError"],"mappings":"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","file":"custom-BNDOYC5P.js","sourcesContent":["/**\n * Custom LLM Provider\n * Generic OpenAI-compatible endpoint for LiteLLM, LMStudio, vLLM, etc.\n */\n\nimport { BaseLLMProvider } from '../base-provider';\nimport {\n type LLMConfig,\n type LLMStreamOptions,\n LLMAuthError,\n LLMRateLimitError,\n LLMStreamError,\n LLMConfigError,\n} from '../types';\nimport { createStreamFromSSEResponse } from '../utils/streaming';\nimport { logger } from '@/lib/logger';\n\n// ============================================================================\n// Custom Provider\n// ============================================================================\n\nexport class CustomProvider extends BaseLLMProvider {\n private baseUrl: string;\n\n constructor(config: LLMConfig) {\n super(config);\n this.validate();\n this.baseUrl = this.ensureApiUrl();\n }\n\n /**\n * Validate configuration - requires API URL\n */\n public validate(): void {\n if (!this.config.apiUrl || this.config.apiUrl.trim() === '') {\n throw new LLMConfigError(\n 'Custom provider requires LLM_API_URL environment variable.',\n 'custom'\n );\n }\n\n if (!this.config.model || this.config.model.trim() === '') {\n throw new LLMConfigError(\n 'Model name is required for Custom provider.',\n 'custom'\n );\n }\n }\n\n /**\n * Stream completion from custom endpoint\n */\n public async stream(options: LLMStreamOptions): Promise<ReadableStream<Uint8Array>> {\n return this.streamWithRetry(async () => {\n const model = this.getModel(options);\n const messages = this.buildMessages(options);\n\n try {\n const response = await this.fetchStream(model, messages, options);\n await this.validateResponse(response);\n\n return createStreamFromSSEResponse(response, 'custom');\n } catch (error) {\n if (\n error instanceof LLMAuthError ||\n error instanceof LLMRateLimitError ||\n error instanceof LLMConfigError\n ) {\n throw error;\n }\n throw this.mapError(error);\n }\n });\n }\n\n /**\n * Build messages array in OpenAI format\n */\n private buildMessages(options: LLMStreamOptions): Array<{ role: string; content: string }> {\n return options.messages.map((m) => ({\n role: m.role,\n content: m.content,\n }));\n }\n\n /**\n * Fetch streaming response from custom endpoint\n */\n private async fetchStream(\n model: string,\n messages: Array<{ role: string; content: string }>,\n options: LLMStreamOptions\n ): Promise<Response> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n // Add API key if provided\n if (this.config.apiKey) {\n headers.Authorization = `Bearer ${this.config.apiKey}`;\n }\n\n const response = await fetch(`${this.baseUrl}/chat/completions`, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n model,\n messages,\n stream: true,\n ...(options.temperature !== undefined && { temperature: options.temperature }),\n ...(options.maxTokens !== undefined && { max_tokens: options.maxTokens }),\n }),\n });\n\n return response;\n }\n\n /**\n * Validate response status\n */\n private async validateResponse(response: Response): Promise<void> {\n if (response.ok) {\n return;\n }\n\n let errorMessage = `HTTP ${response.status}`;\n\n try {\n const errorBody = await response.text();\n const errorJson = JSON.parse(errorBody);\n errorMessage = errorJson.error?.message ?? errorBody;\n } catch {\n logger.debug('Could not parse error response body as JSON', { provider: 'custom' });\n }\n\n if (response.status === 401 || response.status === 403) {\n throw new LLMAuthError(\n 'Authentication failed. Check your API key configuration.',\n 'custom'\n );\n }\n\n if (response.status === 429) {\n throw new LLMRateLimitError(\n 'Rate limit exceeded. Please try again later.',\n 'custom'\n );\n }\n\n throw new LLMStreamError(`Custom API error: ${errorMessage}`, 'custom');\n }\n\n /**\n * Map errors to LLM error types\n */\n private mapError(error: unknown): Error {\n if (error instanceof LLMStreamError) {\n return error;\n }\n\n if (!(error instanceof Error)) {\n return new LLMStreamError(String(error), 'custom');\n }\n\n const message = error.message.toLowerCase();\n\n // Connection errors\n if (\n message.includes('econnrefused') ||\n message.includes('fetch failed') ||\n message.includes('network')\n ) {\n return new LLMStreamError(\n `Cannot connect to custom endpoint at ${this.baseUrl}. Make sure the service is running.`,\n 'custom'\n );\n }\n\n return new LLMStreamError(error.message, 'custom');\n }\n}\n"]}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { BaseLLMProvider, createStreamFromSSEResponse } from './chunk-PPODO6HX.mjs';
|
|
2
|
+
import { LLMConfigError, LLMAuthError, LLMRateLimitError, LLMStreamError } from './chunk-SR5DRGBX.mjs';
|
|
3
|
+
import { logger } from './chunk-6DRZXXNT.mjs';
|
|
4
|
+
import { __spreadValues } from './chunk-4LVB3K53.mjs';
|
|
5
|
+
|
|
6
|
+
// src/lib/llm/providers/custom.ts
|
|
7
|
+
var CustomProvider = class extends BaseLLMProvider {
|
|
8
|
+
constructor(config) {
|
|
9
|
+
super(config);
|
|
10
|
+
this.validate();
|
|
11
|
+
this.baseUrl = this.ensureApiUrl();
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Validate configuration - requires API URL
|
|
15
|
+
*/
|
|
16
|
+
validate() {
|
|
17
|
+
if (!this.config.apiUrl || this.config.apiUrl.trim() === "") {
|
|
18
|
+
throw new LLMConfigError(
|
|
19
|
+
"Custom provider requires LLM_API_URL environment variable.",
|
|
20
|
+
"custom"
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
if (!this.config.model || this.config.model.trim() === "") {
|
|
24
|
+
throw new LLMConfigError(
|
|
25
|
+
"Model name is required for Custom provider.",
|
|
26
|
+
"custom"
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Stream completion from custom endpoint
|
|
32
|
+
*/
|
|
33
|
+
async stream(options) {
|
|
34
|
+
return this.streamWithRetry(async () => {
|
|
35
|
+
const model = this.getModel(options);
|
|
36
|
+
const messages = this.buildMessages(options);
|
|
37
|
+
try {
|
|
38
|
+
const response = await this.fetchStream(model, messages, options);
|
|
39
|
+
await this.validateResponse(response);
|
|
40
|
+
return createStreamFromSSEResponse(response, "custom");
|
|
41
|
+
} catch (error) {
|
|
42
|
+
if (error instanceof LLMAuthError || error instanceof LLMRateLimitError || error instanceof LLMConfigError) {
|
|
43
|
+
throw error;
|
|
44
|
+
}
|
|
45
|
+
throw this.mapError(error);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Build messages array in OpenAI format
|
|
51
|
+
*/
|
|
52
|
+
buildMessages(options) {
|
|
53
|
+
return options.messages.map((m) => ({
|
|
54
|
+
role: m.role,
|
|
55
|
+
content: m.content
|
|
56
|
+
}));
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Fetch streaming response from custom endpoint
|
|
60
|
+
*/
|
|
61
|
+
async fetchStream(model, messages, options) {
|
|
62
|
+
const headers = {
|
|
63
|
+
"Content-Type": "application/json"
|
|
64
|
+
};
|
|
65
|
+
if (this.config.apiKey) {
|
|
66
|
+
headers.Authorization = `Bearer ${this.config.apiKey}`;
|
|
67
|
+
}
|
|
68
|
+
const response = await fetch(`${this.baseUrl}/chat/completions`, {
|
|
69
|
+
method: "POST",
|
|
70
|
+
headers,
|
|
71
|
+
body: JSON.stringify(__spreadValues(__spreadValues({
|
|
72
|
+
model,
|
|
73
|
+
messages,
|
|
74
|
+
stream: true
|
|
75
|
+
}, options.temperature !== void 0 && { temperature: options.temperature }), options.maxTokens !== void 0 && { max_tokens: options.maxTokens }))
|
|
76
|
+
});
|
|
77
|
+
return response;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Validate response status
|
|
81
|
+
*/
|
|
82
|
+
async validateResponse(response) {
|
|
83
|
+
var _a, _b;
|
|
84
|
+
if (response.ok) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
let errorMessage = `HTTP ${response.status}`;
|
|
88
|
+
try {
|
|
89
|
+
const errorBody = await response.text();
|
|
90
|
+
const errorJson = JSON.parse(errorBody);
|
|
91
|
+
errorMessage = (_b = (_a = errorJson.error) == null ? void 0 : _a.message) != null ? _b : errorBody;
|
|
92
|
+
} catch (e) {
|
|
93
|
+
logger.debug("Could not parse error response body as JSON", { provider: "custom" });
|
|
94
|
+
}
|
|
95
|
+
if (response.status === 401 || response.status === 403) {
|
|
96
|
+
throw new LLMAuthError(
|
|
97
|
+
"Authentication failed. Check your API key configuration.",
|
|
98
|
+
"custom"
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
if (response.status === 429) {
|
|
102
|
+
throw new LLMRateLimitError(
|
|
103
|
+
"Rate limit exceeded. Please try again later.",
|
|
104
|
+
"custom"
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
throw new LLMStreamError(`Custom API error: ${errorMessage}`, "custom");
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Map errors to LLM error types
|
|
111
|
+
*/
|
|
112
|
+
mapError(error) {
|
|
113
|
+
if (error instanceof LLMStreamError) {
|
|
114
|
+
return error;
|
|
115
|
+
}
|
|
116
|
+
if (!(error instanceof Error)) {
|
|
117
|
+
return new LLMStreamError(String(error), "custom");
|
|
118
|
+
}
|
|
119
|
+
const message = error.message.toLowerCase();
|
|
120
|
+
if (message.includes("econnrefused") || message.includes("fetch failed") || message.includes("network")) {
|
|
121
|
+
return new LLMStreamError(
|
|
122
|
+
`Cannot connect to custom endpoint at ${this.baseUrl}. Make sure the service is running.`,
|
|
123
|
+
"custom"
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
return new LLMStreamError(error.message, "custom");
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
export { CustomProvider };
|
|
131
|
+
//# sourceMappingURL=custom-S2EKFMP3.mjs.map
|
|
132
|
+
//# sourceMappingURL=custom-S2EKFMP3.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/llm/providers/custom.ts"],"names":[],"mappings":"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","file":"custom-S2EKFMP3.mjs","sourcesContent":["/**\n * Custom LLM Provider\n * Generic OpenAI-compatible endpoint for LiteLLM, LMStudio, vLLM, etc.\n */\n\nimport { BaseLLMProvider } from '../base-provider';\nimport {\n type LLMConfig,\n type LLMStreamOptions,\n LLMAuthError,\n LLMRateLimitError,\n LLMStreamError,\n LLMConfigError,\n} from '../types';\nimport { createStreamFromSSEResponse } from '../utils/streaming';\nimport { logger } from '@/lib/logger';\n\n// ============================================================================\n// Custom Provider\n// ============================================================================\n\nexport class CustomProvider extends BaseLLMProvider {\n private baseUrl: string;\n\n constructor(config: LLMConfig) {\n super(config);\n this.validate();\n this.baseUrl = this.ensureApiUrl();\n }\n\n /**\n * Validate configuration - requires API URL\n */\n public validate(): void {\n if (!this.config.apiUrl || this.config.apiUrl.trim() === '') {\n throw new LLMConfigError(\n 'Custom provider requires LLM_API_URL environment variable.',\n 'custom'\n );\n }\n\n if (!this.config.model || this.config.model.trim() === '') {\n throw new LLMConfigError(\n 'Model name is required for Custom provider.',\n 'custom'\n );\n }\n }\n\n /**\n * Stream completion from custom endpoint\n */\n public async stream(options: LLMStreamOptions): Promise<ReadableStream<Uint8Array>> {\n return this.streamWithRetry(async () => {\n const model = this.getModel(options);\n const messages = this.buildMessages(options);\n\n try {\n const response = await this.fetchStream(model, messages, options);\n await this.validateResponse(response);\n\n return createStreamFromSSEResponse(response, 'custom');\n } catch (error) {\n if (\n error instanceof LLMAuthError ||\n error instanceof LLMRateLimitError ||\n error instanceof LLMConfigError\n ) {\n throw error;\n }\n throw this.mapError(error);\n }\n });\n }\n\n /**\n * Build messages array in OpenAI format\n */\n private buildMessages(options: LLMStreamOptions): Array<{ role: string; content: string }> {\n return options.messages.map((m) => ({\n role: m.role,\n content: m.content,\n }));\n }\n\n /**\n * Fetch streaming response from custom endpoint\n */\n private async fetchStream(\n model: string,\n messages: Array<{ role: string; content: string }>,\n options: LLMStreamOptions\n ): Promise<Response> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n // Add API key if provided\n if (this.config.apiKey) {\n headers.Authorization = `Bearer ${this.config.apiKey}`;\n }\n\n const response = await fetch(`${this.baseUrl}/chat/completions`, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n model,\n messages,\n stream: true,\n ...(options.temperature !== undefined && { temperature: options.temperature }),\n ...(options.maxTokens !== undefined && { max_tokens: options.maxTokens }),\n }),\n });\n\n return response;\n }\n\n /**\n * Validate response status\n */\n private async validateResponse(response: Response): Promise<void> {\n if (response.ok) {\n return;\n }\n\n let errorMessage = `HTTP ${response.status}`;\n\n try {\n const errorBody = await response.text();\n const errorJson = JSON.parse(errorBody);\n errorMessage = errorJson.error?.message ?? errorBody;\n } catch {\n logger.debug('Could not parse error response body as JSON', { provider: 'custom' });\n }\n\n if (response.status === 401 || response.status === 403) {\n throw new LLMAuthError(\n 'Authentication failed. Check your API key configuration.',\n 'custom'\n );\n }\n\n if (response.status === 429) {\n throw new LLMRateLimitError(\n 'Rate limit exceeded. Please try again later.',\n 'custom'\n );\n }\n\n throw new LLMStreamError(`Custom API error: ${errorMessage}`, 'custom');\n }\n\n /**\n * Map errors to LLM error types\n */\n private mapError(error: unknown): Error {\n if (error instanceof LLMStreamError) {\n return error;\n }\n\n if (!(error instanceof Error)) {\n return new LLMStreamError(String(error), 'custom');\n }\n\n const message = error.message.toLowerCase();\n\n // Connection errors\n if (\n message.includes('econnrefused') ||\n message.includes('fetch failed') ||\n message.includes('network')\n ) {\n return new LLMStreamError(\n `Cannot connect to custom endpoint at ${this.baseUrl}. Make sure the service is running.`,\n 'custom'\n );\n }\n\n return new LLMStreamError(error.message, 'custom');\n }\n}\n"]}
|