@libredb/studio 0.9.7 → 0.9.13
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-CPF7XWV5.mjs +1289 -0
- package/dist/chunk-CPF7XWV5.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-FYSE52VB.js +242 -0
- package/dist/chunk-FYSE52VB.js.map +1 -0
- package/dist/chunk-G3S66G64.mjs +6673 -0
- package/dist/chunk-G3S66G64.mjs.map +1 -0
- package/dist/chunk-G4WYE6TI.js +4 -0
- package/dist/chunk-G4WYE6TI.js.map +1 -0
- package/dist/chunk-HGPD6PWV.js +1310 -0
- package/dist/chunk-HGPD6PWV.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-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-Y52UIFEX.js +6741 -0
- package/dist/chunk-Y52UIFEX.js.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 +4174 -0
- package/dist/workspace.js.map +1 -0
- package/dist/workspace.mjs +4147 -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
|
@@ -1,181 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Custom LLM Provider
|
|
3
|
-
* Generic OpenAI-compatible endpoint for LiteLLM, LMStudio, vLLM, etc.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { BaseLLMProvider } from '../base-provider';
|
|
7
|
-
import {
|
|
8
|
-
type LLMConfig,
|
|
9
|
-
type LLMStreamOptions,
|
|
10
|
-
LLMAuthError,
|
|
11
|
-
LLMRateLimitError,
|
|
12
|
-
LLMStreamError,
|
|
13
|
-
LLMConfigError,
|
|
14
|
-
} from '../types';
|
|
15
|
-
import { createStreamFromSSEResponse } from '../utils/streaming';
|
|
16
|
-
import { logger } from '@/lib/logger';
|
|
17
|
-
|
|
18
|
-
// ============================================================================
|
|
19
|
-
// Custom Provider
|
|
20
|
-
// ============================================================================
|
|
21
|
-
|
|
22
|
-
export class CustomProvider extends BaseLLMProvider {
|
|
23
|
-
private baseUrl: string;
|
|
24
|
-
|
|
25
|
-
constructor(config: LLMConfig) {
|
|
26
|
-
super(config);
|
|
27
|
-
this.validate();
|
|
28
|
-
this.baseUrl = this.ensureApiUrl();
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Validate configuration - requires API URL
|
|
33
|
-
*/
|
|
34
|
-
public validate(): void {
|
|
35
|
-
if (!this.config.apiUrl || this.config.apiUrl.trim() === '') {
|
|
36
|
-
throw new LLMConfigError(
|
|
37
|
-
'Custom provider requires LLM_API_URL environment variable.',
|
|
38
|
-
'custom'
|
|
39
|
-
);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
if (!this.config.model || this.config.model.trim() === '') {
|
|
43
|
-
throw new LLMConfigError(
|
|
44
|
-
'Model name is required for Custom provider.',
|
|
45
|
-
'custom'
|
|
46
|
-
);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Stream completion from custom endpoint
|
|
52
|
-
*/
|
|
53
|
-
public async stream(options: LLMStreamOptions): Promise<ReadableStream<Uint8Array>> {
|
|
54
|
-
return this.streamWithRetry(async () => {
|
|
55
|
-
const model = this.getModel(options);
|
|
56
|
-
const messages = this.buildMessages(options);
|
|
57
|
-
|
|
58
|
-
try {
|
|
59
|
-
const response = await this.fetchStream(model, messages, options);
|
|
60
|
-
await this.validateResponse(response);
|
|
61
|
-
|
|
62
|
-
return createStreamFromSSEResponse(response, 'custom');
|
|
63
|
-
} catch (error) {
|
|
64
|
-
if (
|
|
65
|
-
error instanceof LLMAuthError ||
|
|
66
|
-
error instanceof LLMRateLimitError ||
|
|
67
|
-
error instanceof LLMConfigError
|
|
68
|
-
) {
|
|
69
|
-
throw error;
|
|
70
|
-
}
|
|
71
|
-
throw this.mapError(error);
|
|
72
|
-
}
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* Build messages array in OpenAI format
|
|
78
|
-
*/
|
|
79
|
-
private buildMessages(options: LLMStreamOptions): Array<{ role: string; content: string }> {
|
|
80
|
-
return options.messages.map((m) => ({
|
|
81
|
-
role: m.role,
|
|
82
|
-
content: m.content,
|
|
83
|
-
}));
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* Fetch streaming response from custom endpoint
|
|
88
|
-
*/
|
|
89
|
-
private async fetchStream(
|
|
90
|
-
model: string,
|
|
91
|
-
messages: Array<{ role: string; content: string }>,
|
|
92
|
-
options: LLMStreamOptions
|
|
93
|
-
): Promise<Response> {
|
|
94
|
-
const headers: Record<string, string> = {
|
|
95
|
-
'Content-Type': 'application/json',
|
|
96
|
-
};
|
|
97
|
-
|
|
98
|
-
// Add API key if provided
|
|
99
|
-
if (this.config.apiKey) {
|
|
100
|
-
headers.Authorization = `Bearer ${this.config.apiKey}`;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
const response = await fetch(`${this.baseUrl}/chat/completions`, {
|
|
104
|
-
method: 'POST',
|
|
105
|
-
headers,
|
|
106
|
-
body: JSON.stringify({
|
|
107
|
-
model,
|
|
108
|
-
messages,
|
|
109
|
-
stream: true,
|
|
110
|
-
...(options.temperature !== undefined && { temperature: options.temperature }),
|
|
111
|
-
...(options.maxTokens !== undefined && { max_tokens: options.maxTokens }),
|
|
112
|
-
}),
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
return response;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* Validate response status
|
|
120
|
-
*/
|
|
121
|
-
private async validateResponse(response: Response): Promise<void> {
|
|
122
|
-
if (response.ok) {
|
|
123
|
-
return;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
let errorMessage = `HTTP ${response.status}`;
|
|
127
|
-
|
|
128
|
-
try {
|
|
129
|
-
const errorBody = await response.text();
|
|
130
|
-
const errorJson = JSON.parse(errorBody);
|
|
131
|
-
errorMessage = errorJson.error?.message ?? errorBody;
|
|
132
|
-
} catch {
|
|
133
|
-
logger.debug('Could not parse error response body as JSON', { provider: 'custom' });
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
if (response.status === 401 || response.status === 403) {
|
|
137
|
-
throw new LLMAuthError(
|
|
138
|
-
'Authentication failed. Check your API key configuration.',
|
|
139
|
-
'custom'
|
|
140
|
-
);
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
if (response.status === 429) {
|
|
144
|
-
throw new LLMRateLimitError(
|
|
145
|
-
'Rate limit exceeded. Please try again later.',
|
|
146
|
-
'custom'
|
|
147
|
-
);
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
throw new LLMStreamError(`Custom API error: ${errorMessage}`, 'custom');
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
/**
|
|
154
|
-
* Map errors to LLM error types
|
|
155
|
-
*/
|
|
156
|
-
private mapError(error: unknown): Error {
|
|
157
|
-
if (error instanceof LLMStreamError) {
|
|
158
|
-
return error;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
if (!(error instanceof Error)) {
|
|
162
|
-
return new LLMStreamError(String(error), 'custom');
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
const message = error.message.toLowerCase();
|
|
166
|
-
|
|
167
|
-
// Connection errors
|
|
168
|
-
if (
|
|
169
|
-
message.includes('econnrefused') ||
|
|
170
|
-
message.includes('fetch failed') ||
|
|
171
|
-
message.includes('network')
|
|
172
|
-
) {
|
|
173
|
-
return new LLMStreamError(
|
|
174
|
-
`Cannot connect to custom endpoint at ${this.baseUrl}. Make sure the service is running.`,
|
|
175
|
-
'custom'
|
|
176
|
-
);
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
return new LLMStreamError(error.message, 'custom');
|
|
180
|
-
}
|
|
181
|
-
}
|
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Gemini LLM Provider
|
|
3
|
-
* Google Gemini AI integration using @google/generative-ai SDK
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { GoogleGenerativeAI, type GenerateContentStreamResult } from '@google/generative-ai';
|
|
7
|
-
import { BaseLLMProvider } from '../base-provider';
|
|
8
|
-
import {
|
|
9
|
-
type LLMConfig,
|
|
10
|
-
type LLMStreamOptions,
|
|
11
|
-
LLMAuthError,
|
|
12
|
-
LLMRateLimitError,
|
|
13
|
-
LLMSafetyError,
|
|
14
|
-
LLMStreamError,
|
|
15
|
-
} from '../types';
|
|
16
|
-
import { encodeText, streamFromAsyncIterable } from '../utils/streaming';
|
|
17
|
-
|
|
18
|
-
// ============================================================================
|
|
19
|
-
// Gemini Provider
|
|
20
|
-
// ============================================================================
|
|
21
|
-
|
|
22
|
-
export class GeminiProvider extends BaseLLMProvider {
|
|
23
|
-
private client: GoogleGenerativeAI;
|
|
24
|
-
|
|
25
|
-
constructor(config: LLMConfig) {
|
|
26
|
-
super(config);
|
|
27
|
-
this.validate();
|
|
28
|
-
this.client = new GoogleGenerativeAI(this.ensureApiKey());
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Stream completion from Gemini
|
|
33
|
-
*/
|
|
34
|
-
public async stream(options: LLMStreamOptions): Promise<ReadableStream<Uint8Array>> {
|
|
35
|
-
return this.streamWithRetry(async () => {
|
|
36
|
-
const model = this.getModel(options);
|
|
37
|
-
const systemInstruction = this.getSystemMessage(options);
|
|
38
|
-
const messages = this.getNonSystemMessages(options);
|
|
39
|
-
|
|
40
|
-
// Build the prompt from messages
|
|
41
|
-
const prompt = messages.map((m) => m.content).join('\n\n');
|
|
42
|
-
|
|
43
|
-
try {
|
|
44
|
-
const generativeModel = this.client.getGenerativeModel({
|
|
45
|
-
model,
|
|
46
|
-
systemInstruction,
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
const result = await generativeModel.generateContentStream(prompt);
|
|
50
|
-
|
|
51
|
-
return this.createStreamFromResult(result);
|
|
52
|
-
} catch (error) {
|
|
53
|
-
throw this.mapError(error);
|
|
54
|
-
}
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Create ReadableStream from Gemini stream result
|
|
60
|
-
*/
|
|
61
|
-
private createStreamFromResult(
|
|
62
|
-
result: GenerateContentStreamResult
|
|
63
|
-
): ReadableStream<Uint8Array> {
|
|
64
|
-
return streamFromAsyncIterable(result.stream, (chunk) => {
|
|
65
|
-
try {
|
|
66
|
-
const text = chunk.text();
|
|
67
|
-
return text ? encodeText(text) : null;
|
|
68
|
-
} catch {
|
|
69
|
-
// Handle safety-blocked chunks
|
|
70
|
-
return null;
|
|
71
|
-
}
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* Map Gemini errors to LLM error types
|
|
77
|
-
*/
|
|
78
|
-
private mapError(error: unknown): Error {
|
|
79
|
-
if (!(error instanceof Error)) {
|
|
80
|
-
return new LLMStreamError(String(error), 'gemini');
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
const message = error.message.toLowerCase();
|
|
84
|
-
|
|
85
|
-
// Authentication errors
|
|
86
|
-
if (
|
|
87
|
-
message.includes('api key') ||
|
|
88
|
-
message.includes('invalid key') ||
|
|
89
|
-
message.includes('unauthorized') ||
|
|
90
|
-
message.includes('permission denied')
|
|
91
|
-
) {
|
|
92
|
-
return new LLMAuthError(
|
|
93
|
-
'Invalid API Key. Please check your Gemini API configuration.',
|
|
94
|
-
'gemini'
|
|
95
|
-
);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
// Rate limit errors
|
|
99
|
-
if (
|
|
100
|
-
message.includes('quota') ||
|
|
101
|
-
message.includes('rate limit') ||
|
|
102
|
-
message.includes('resource exhausted') ||
|
|
103
|
-
message.includes('429')
|
|
104
|
-
) {
|
|
105
|
-
return new LLMRateLimitError(
|
|
106
|
-
'AI usage limit reached. Please try again later or upgrade your plan.',
|
|
107
|
-
'gemini'
|
|
108
|
-
);
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// Safety filter errors
|
|
112
|
-
if (
|
|
113
|
-
message.includes('safety') ||
|
|
114
|
-
message.includes('blocked') ||
|
|
115
|
-
message.includes('harm')
|
|
116
|
-
) {
|
|
117
|
-
return new LLMSafetyError(
|
|
118
|
-
'The prompt was blocked by safety filters. Please modify your request.',
|
|
119
|
-
'gemini'
|
|
120
|
-
);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
// Generic stream error
|
|
124
|
-
return new LLMStreamError(error.message, 'gemini');
|
|
125
|
-
}
|
|
126
|
-
}
|
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Ollama LLM Provider
|
|
3
|
-
* Local LLM integration via OpenAI-compatible API
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { BaseLLMProvider } from '../base-provider';
|
|
7
|
-
import {
|
|
8
|
-
type LLMConfig,
|
|
9
|
-
type LLMStreamOptions,
|
|
10
|
-
LLMStreamError,
|
|
11
|
-
LLMConfigError,
|
|
12
|
-
} from '../types';
|
|
13
|
-
import { createStreamFromSSEResponse } from '../utils/streaming';
|
|
14
|
-
import { DEFAULT_API_URLS } from '../utils/config';
|
|
15
|
-
import { logger } from '@/lib/logger';
|
|
16
|
-
|
|
17
|
-
// ============================================================================
|
|
18
|
-
// Ollama Provider
|
|
19
|
-
// ============================================================================
|
|
20
|
-
|
|
21
|
-
export class OllamaProvider extends BaseLLMProvider {
|
|
22
|
-
private baseUrl: string;
|
|
23
|
-
|
|
24
|
-
constructor(config: LLMConfig) {
|
|
25
|
-
super(config);
|
|
26
|
-
this.baseUrl = config.apiUrl ?? DEFAULT_API_URLS.ollama;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Override validation - Ollama doesn't require API key
|
|
31
|
-
*/
|
|
32
|
-
public validate(): void {
|
|
33
|
-
if (!this.config.model || this.config.model.trim() === '') {
|
|
34
|
-
throw new LLMConfigError(
|
|
35
|
-
'Model name is required for Ollama provider.',
|
|
36
|
-
'ollama'
|
|
37
|
-
);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Stream completion from Ollama
|
|
43
|
-
*/
|
|
44
|
-
public async stream(options: LLMStreamOptions): Promise<ReadableStream<Uint8Array>> {
|
|
45
|
-
return this.streamWithRetry(async () => {
|
|
46
|
-
const model = this.getModel(options);
|
|
47
|
-
const messages = this.buildMessages(options);
|
|
48
|
-
|
|
49
|
-
try {
|
|
50
|
-
const response = await this.fetchStream(model, messages, options);
|
|
51
|
-
await this.validateResponse(response);
|
|
52
|
-
|
|
53
|
-
return createStreamFromSSEResponse(response, 'ollama');
|
|
54
|
-
} catch (error) {
|
|
55
|
-
throw this.mapError(error);
|
|
56
|
-
}
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Build messages array in OpenAI format
|
|
62
|
-
*/
|
|
63
|
-
private buildMessages(options: LLMStreamOptions): Array<{ role: string; content: string }> {
|
|
64
|
-
return options.messages.map((m) => ({
|
|
65
|
-
role: m.role,
|
|
66
|
-
content: m.content,
|
|
67
|
-
}));
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Fetch streaming response from Ollama API
|
|
72
|
-
*/
|
|
73
|
-
private async fetchStream(
|
|
74
|
-
model: string,
|
|
75
|
-
messages: Array<{ role: string; content: string }>,
|
|
76
|
-
options: LLMStreamOptions
|
|
77
|
-
): Promise<Response> {
|
|
78
|
-
const response = await fetch(`${this.baseUrl}/chat/completions`, {
|
|
79
|
-
method: 'POST',
|
|
80
|
-
headers: {
|
|
81
|
-
'Content-Type': 'application/json',
|
|
82
|
-
// Ollama accepts 'ollama' or empty string as API key
|
|
83
|
-
Authorization: 'Bearer ollama',
|
|
84
|
-
},
|
|
85
|
-
body: JSON.stringify({
|
|
86
|
-
model,
|
|
87
|
-
messages,
|
|
88
|
-
stream: true,
|
|
89
|
-
...(options.temperature !== undefined && { temperature: options.temperature }),
|
|
90
|
-
...(options.maxTokens !== undefined && { max_tokens: options.maxTokens }),
|
|
91
|
-
}),
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
return response;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
* Validate response status
|
|
99
|
-
*/
|
|
100
|
-
private async validateResponse(response: Response): Promise<void> {
|
|
101
|
-
if (response.ok) {
|
|
102
|
-
return;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
let errorMessage = `HTTP ${response.status}`;
|
|
106
|
-
|
|
107
|
-
try {
|
|
108
|
-
const errorBody = await response.text();
|
|
109
|
-
const errorJson = JSON.parse(errorBody);
|
|
110
|
-
errorMessage = errorJson.error?.message ?? errorBody;
|
|
111
|
-
} catch {
|
|
112
|
-
logger.debug('Could not parse error response body as JSON', { provider: 'ollama' });
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
// Ollama-specific errors
|
|
116
|
-
if (response.status === 404) {
|
|
117
|
-
throw new LLMConfigError(
|
|
118
|
-
`Model not found. Make sure "${this.config.model}" is pulled in Ollama.`,
|
|
119
|
-
'ollama'
|
|
120
|
-
);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
throw new LLMStreamError(`Ollama API error: ${errorMessage}`, 'ollama');
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
/**
|
|
127
|
-
* Map errors to LLM error types
|
|
128
|
-
*/
|
|
129
|
-
private mapError(error: unknown): Error {
|
|
130
|
-
if (error instanceof LLMConfigError || error instanceof LLMStreamError) {
|
|
131
|
-
return error;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
if (!(error instanceof Error)) {
|
|
135
|
-
return new LLMStreamError(String(error), 'ollama');
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
const message = error.message.toLowerCase();
|
|
139
|
-
|
|
140
|
-
// Connection errors - Ollama not running
|
|
141
|
-
if (
|
|
142
|
-
message.includes('econnrefused') ||
|
|
143
|
-
message.includes('fetch failed') ||
|
|
144
|
-
message.includes('network')
|
|
145
|
-
) {
|
|
146
|
-
return new LLMStreamError(
|
|
147
|
-
`Cannot connect to Ollama at ${this.baseUrl}. Make sure Ollama is running.`,
|
|
148
|
-
'ollama'
|
|
149
|
-
);
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
return new LLMStreamError(error.message, 'ollama');
|
|
153
|
-
}
|
|
154
|
-
}
|
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* OpenAI LLM Provider
|
|
3
|
-
* OpenAI Chat Completions API with SSE streaming
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { BaseLLMProvider } from '../base-provider';
|
|
7
|
-
import {
|
|
8
|
-
type LLMConfig,
|
|
9
|
-
type LLMStreamOptions,
|
|
10
|
-
LLMAuthError,
|
|
11
|
-
LLMRateLimitError,
|
|
12
|
-
LLMStreamError,
|
|
13
|
-
} from '../types';
|
|
14
|
-
import { createStreamFromSSEResponse } from '../utils/streaming';
|
|
15
|
-
import { DEFAULT_API_URLS } from '../utils/config';
|
|
16
|
-
import { logger } from '@/lib/logger';
|
|
17
|
-
|
|
18
|
-
// ============================================================================
|
|
19
|
-
// OpenAI Provider
|
|
20
|
-
// ============================================================================
|
|
21
|
-
|
|
22
|
-
export class OpenAIProvider extends BaseLLMProvider {
|
|
23
|
-
protected baseUrl: string;
|
|
24
|
-
|
|
25
|
-
constructor(config: LLMConfig) {
|
|
26
|
-
super(config);
|
|
27
|
-
this.validate();
|
|
28
|
-
this.baseUrl = config.apiUrl ?? DEFAULT_API_URLS.openai;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Stream completion from OpenAI
|
|
33
|
-
*/
|
|
34
|
-
public async stream(options: LLMStreamOptions): Promise<ReadableStream<Uint8Array>> {
|
|
35
|
-
return this.streamWithRetry(async () => {
|
|
36
|
-
const model = this.getModel(options);
|
|
37
|
-
const messages = this.buildMessages(options);
|
|
38
|
-
|
|
39
|
-
try {
|
|
40
|
-
const response = await this.fetchStream(model, messages, options);
|
|
41
|
-
await this.validateResponse(response);
|
|
42
|
-
|
|
43
|
-
return createStreamFromSSEResponse(response, this.name);
|
|
44
|
-
} catch (error) {
|
|
45
|
-
if (error instanceof LLMAuthError || error instanceof LLMRateLimitError) {
|
|
46
|
-
throw error;
|
|
47
|
-
}
|
|
48
|
-
throw this.mapError(error);
|
|
49
|
-
}
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Build messages array in OpenAI format
|
|
55
|
-
*/
|
|
56
|
-
protected buildMessages(options: LLMStreamOptions): Array<{ role: string; content: string }> {
|
|
57
|
-
return options.messages.map((m) => ({
|
|
58
|
-
role: m.role,
|
|
59
|
-
content: m.content,
|
|
60
|
-
}));
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Fetch streaming response from OpenAI API
|
|
65
|
-
*/
|
|
66
|
-
protected async fetchStream(
|
|
67
|
-
model: string,
|
|
68
|
-
messages: Array<{ role: string; content: string }>,
|
|
69
|
-
options: LLMStreamOptions
|
|
70
|
-
): Promise<Response> {
|
|
71
|
-
const apiKey = this.ensureApiKey();
|
|
72
|
-
|
|
73
|
-
const response = await fetch(`${this.baseUrl}/chat/completions`, {
|
|
74
|
-
method: 'POST',
|
|
75
|
-
headers: {
|
|
76
|
-
'Content-Type': 'application/json',
|
|
77
|
-
Authorization: `Bearer ${apiKey}`,
|
|
78
|
-
},
|
|
79
|
-
body: JSON.stringify({
|
|
80
|
-
model,
|
|
81
|
-
messages,
|
|
82
|
-
stream: true,
|
|
83
|
-
...(options.temperature !== undefined && { temperature: options.temperature }),
|
|
84
|
-
...(options.maxTokens !== undefined && { max_tokens: options.maxTokens }),
|
|
85
|
-
}),
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
return response;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* Validate response status and throw appropriate errors
|
|
93
|
-
*/
|
|
94
|
-
protected async validateResponse(response: Response): Promise<void> {
|
|
95
|
-
if (response.ok) {
|
|
96
|
-
return;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
let errorMessage = `HTTP ${response.status}`;
|
|
100
|
-
|
|
101
|
-
try {
|
|
102
|
-
const errorBody = await response.text();
|
|
103
|
-
const errorJson = JSON.parse(errorBody);
|
|
104
|
-
errorMessage = errorJson.error?.message ?? errorBody;
|
|
105
|
-
} catch {
|
|
106
|
-
logger.debug('Could not parse error response body as JSON', { provider: 'openai' });
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
if (response.status === 401 || response.status === 403) {
|
|
110
|
-
throw new LLMAuthError(
|
|
111
|
-
'Invalid API Key. Please check your OpenAI API configuration.',
|
|
112
|
-
'openai'
|
|
113
|
-
);
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
if (response.status === 429) {
|
|
117
|
-
throw new LLMRateLimitError(
|
|
118
|
-
'Rate limit exceeded. Please try again later or upgrade your plan.',
|
|
119
|
-
'openai'
|
|
120
|
-
);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
throw new LLMStreamError(`OpenAI API error: ${errorMessage}`, 'openai');
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
/**
|
|
127
|
-
* Map errors to LLM error types
|
|
128
|
-
*/
|
|
129
|
-
protected mapError(error: unknown): Error {
|
|
130
|
-
if (!(error instanceof Error)) {
|
|
131
|
-
return new LLMStreamError(String(error), 'openai');
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
const message = error.message.toLowerCase();
|
|
135
|
-
|
|
136
|
-
// Network errors
|
|
137
|
-
if (message.includes('fetch') || message.includes('network')) {
|
|
138
|
-
return new LLMStreamError(
|
|
139
|
-
'Network error. Please check your connection.',
|
|
140
|
-
'openai'
|
|
141
|
-
);
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
return new LLMStreamError(error.message, 'openai');
|
|
145
|
-
}
|
|
146
|
-
}
|