@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
|
@@ -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"]}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkFYSE52VB_js = require('./chunk-FYSE52VB.js');
|
|
4
|
+
var chunkRCQB4FCE_js = require('./chunk-RCQB4FCE.js');
|
|
5
|
+
require('./chunk-VLCRUZX7.js');
|
|
6
|
+
require('./chunk-Q6LRDBK7.js');
|
|
7
|
+
var generativeAi = require('@google/generative-ai');
|
|
8
|
+
|
|
9
|
+
var GeminiProvider = class extends chunkFYSE52VB_js.BaseLLMProvider {
|
|
10
|
+
constructor(config) {
|
|
11
|
+
super(config);
|
|
12
|
+
this.validate();
|
|
13
|
+
this.client = new generativeAi.GoogleGenerativeAI(this.ensureApiKey());
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Stream completion from Gemini
|
|
17
|
+
*/
|
|
18
|
+
async stream(options) {
|
|
19
|
+
return this.streamWithRetry(async () => {
|
|
20
|
+
const model = this.getModel(options);
|
|
21
|
+
const systemInstruction = this.getSystemMessage(options);
|
|
22
|
+
const messages = this.getNonSystemMessages(options);
|
|
23
|
+
const prompt = messages.map((m) => m.content).join("\n\n");
|
|
24
|
+
try {
|
|
25
|
+
const generativeModel = this.client.getGenerativeModel({
|
|
26
|
+
model,
|
|
27
|
+
systemInstruction
|
|
28
|
+
});
|
|
29
|
+
const result = await generativeModel.generateContentStream(prompt);
|
|
30
|
+
return this.createStreamFromResult(result);
|
|
31
|
+
} catch (error) {
|
|
32
|
+
throw this.mapError(error);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Create ReadableStream from Gemini stream result
|
|
38
|
+
*/
|
|
39
|
+
createStreamFromResult(result) {
|
|
40
|
+
return chunkFYSE52VB_js.streamFromAsyncIterable(result.stream, (chunk) => {
|
|
41
|
+
try {
|
|
42
|
+
const text = chunk.text();
|
|
43
|
+
return text ? chunkFYSE52VB_js.encodeText(text) : null;
|
|
44
|
+
} catch (e) {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Map Gemini errors to LLM error types
|
|
51
|
+
*/
|
|
52
|
+
mapError(error) {
|
|
53
|
+
if (!(error instanceof Error)) {
|
|
54
|
+
return new chunkRCQB4FCE_js.LLMStreamError(String(error), "gemini");
|
|
55
|
+
}
|
|
56
|
+
const message = error.message.toLowerCase();
|
|
57
|
+
if (message.includes("api key") || message.includes("invalid key") || message.includes("unauthorized") || message.includes("permission denied")) {
|
|
58
|
+
return new chunkRCQB4FCE_js.LLMAuthError(
|
|
59
|
+
"Invalid API Key. Please check your Gemini API configuration.",
|
|
60
|
+
"gemini"
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
if (message.includes("quota") || message.includes("rate limit") || message.includes("resource exhausted") || message.includes("429")) {
|
|
64
|
+
return new chunkRCQB4FCE_js.LLMRateLimitError(
|
|
65
|
+
"AI usage limit reached. Please try again later or upgrade your plan.",
|
|
66
|
+
"gemini"
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
if (message.includes("safety") || message.includes("blocked") || message.includes("harm")) {
|
|
70
|
+
return new chunkRCQB4FCE_js.LLMSafetyError(
|
|
71
|
+
"The prompt was blocked by safety filters. Please modify your request.",
|
|
72
|
+
"gemini"
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
return new chunkRCQB4FCE_js.LLMStreamError(error.message, "gemini");
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
exports.GeminiProvider = GeminiProvider;
|
|
80
|
+
//# sourceMappingURL=gemini-4ASHNK4H.js.map
|
|
81
|
+
//# sourceMappingURL=gemini-4ASHNK4H.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/llm/providers/gemini.ts"],"names":["BaseLLMProvider","GoogleGenerativeAI","streamFromAsyncIterable","encodeText","LLMStreamError","LLMAuthError","LLMRateLimitError","LLMSafetyError"],"mappings":";;;;;;;;AAqBO,IAAM,cAAA,GAAN,cAA6BA,gCAAA,CAAgB;AAAA,EAGlD,YAAY,MAAA,EAAmB;AAC7B,IAAA,KAAA,CAAM,MAAM,CAAA;AACZ,IAAA,IAAA,CAAK,QAAA,EAAS;AACd,IAAA,IAAA,CAAK,MAAA,GAAS,IAAIC,+BAAA,CAAmB,IAAA,CAAK,cAAc,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,OAAO,OAAA,EAAgE;AAClF,IAAA,OAAO,IAAA,CAAK,gBAAgB,YAAY;AACtC,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA;AACnC,MAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,gBAAA,CAAiB,OAAO,CAAA;AACvD,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,oBAAA,CAAqB,OAAO,CAAA;AAGlD,MAAA,MAAM,MAAA,GAAS,SAAS,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,OAAO,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA;AAEzD,MAAA,IAAI;AACF,QAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,MAAA,CAAO,kBAAA,CAAmB;AAAA,UACrD,KAAA;AAAA,UACA;AAAA,SACD,CAAA;AAED,QAAA,MAAM,MAAA,GAAS,MAAM,eAAA,CAAgB,qBAAA,CAAsB,MAAM,CAAA;AAEjE,QAAA,OAAO,IAAA,CAAK,uBAAuB,MAAM,CAAA;AAAA,MAC3C,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA,MAC3B;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,uBACN,MAAA,EAC4B;AAC5B,IAAA,OAAOC,wCAAA,CAAwB,MAAA,CAAO,MAAA,EAAQ,CAAC,KAAA,KAAU;AACvD,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,IAAA,EAAK;AACxB,QAAA,OAAO,IAAA,GAAOC,2BAAA,CAAW,IAAI,CAAA,GAAI,IAAA;AAAA,MACnC,CAAA,CAAA,OAAQ,CAAA,EAAA;AAEN,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAS,KAAA,EAAuB;AACtC,IAAA,IAAI,EAAE,iBAAiB,KAAA,CAAA,EAAQ;AAC7B,MAAA,OAAO,IAAIC,+BAAA,CAAe,MAAA,CAAO,KAAK,GAAG,QAAQ,CAAA;AAAA,IACnD;AAEA,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,WAAA,EAAY;AAG1C,IAAA,IACE,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA,IAC1B,QAAQ,QAAA,CAAS,aAAa,CAAA,IAC9B,OAAA,CAAQ,SAAS,cAAc,CAAA,IAC/B,OAAA,CAAQ,QAAA,CAAS,mBAAmB,CAAA,EACpC;AACA,MAAA,OAAO,IAAIC,6BAAA;AAAA,QACT,8DAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAGA,IAAA,IACE,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA,IACxB,QAAQ,QAAA,CAAS,YAAY,CAAA,IAC7B,OAAA,CAAQ,SAAS,oBAAoB,CAAA,IACrC,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA,EACtB;AACA,MAAA,OAAO,IAAIC,kCAAA;AAAA,QACT,sEAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAGA,IAAA,IACE,OAAA,CAAQ,QAAA,CAAS,QAAQ,CAAA,IACzB,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA,IAC1B,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,EACvB;AACA,MAAA,OAAO,IAAIC,+BAAA;AAAA,QACT,uEAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAGA,IAAA,OAAO,IAAIH,+BAAA,CAAe,KAAA,CAAM,OAAA,EAAS,QAAQ,CAAA;AAAA,EACnD;AACF","file":"gemini-4ASHNK4H.js","sourcesContent":["/**\n * Gemini LLM Provider\n * Google Gemini AI integration using @google/generative-ai SDK\n */\n\nimport { GoogleGenerativeAI, type GenerateContentStreamResult } from '@google/generative-ai';\nimport { BaseLLMProvider } from '../base-provider';\nimport {\n type LLMConfig,\n type LLMStreamOptions,\n LLMAuthError,\n LLMRateLimitError,\n LLMSafetyError,\n LLMStreamError,\n} from '../types';\nimport { encodeText, streamFromAsyncIterable } from '../utils/streaming';\n\n// ============================================================================\n// Gemini Provider\n// ============================================================================\n\nexport class GeminiProvider extends BaseLLMProvider {\n private client: GoogleGenerativeAI;\n\n constructor(config: LLMConfig) {\n super(config);\n this.validate();\n this.client = new GoogleGenerativeAI(this.ensureApiKey());\n }\n\n /**\n * Stream completion from Gemini\n */\n public async stream(options: LLMStreamOptions): Promise<ReadableStream<Uint8Array>> {\n return this.streamWithRetry(async () => {\n const model = this.getModel(options);\n const systemInstruction = this.getSystemMessage(options);\n const messages = this.getNonSystemMessages(options);\n\n // Build the prompt from messages\n const prompt = messages.map((m) => m.content).join('\\n\\n');\n\n try {\n const generativeModel = this.client.getGenerativeModel({\n model,\n systemInstruction,\n });\n\n const result = await generativeModel.generateContentStream(prompt);\n\n return this.createStreamFromResult(result);\n } catch (error) {\n throw this.mapError(error);\n }\n });\n }\n\n /**\n * Create ReadableStream from Gemini stream result\n */\n private createStreamFromResult(\n result: GenerateContentStreamResult\n ): ReadableStream<Uint8Array> {\n return streamFromAsyncIterable(result.stream, (chunk) => {\n try {\n const text = chunk.text();\n return text ? encodeText(text) : null;\n } catch {\n // Handle safety-blocked chunks\n return null;\n }\n });\n }\n\n /**\n * Map Gemini errors to LLM error types\n */\n private mapError(error: unknown): Error {\n if (!(error instanceof Error)) {\n return new LLMStreamError(String(error), 'gemini');\n }\n\n const message = error.message.toLowerCase();\n\n // Authentication errors\n if (\n message.includes('api key') ||\n message.includes('invalid key') ||\n message.includes('unauthorized') ||\n message.includes('permission denied')\n ) {\n return new LLMAuthError(\n 'Invalid API Key. Please check your Gemini API configuration.',\n 'gemini'\n );\n }\n\n // Rate limit errors\n if (\n message.includes('quota') ||\n message.includes('rate limit') ||\n message.includes('resource exhausted') ||\n message.includes('429')\n ) {\n return new LLMRateLimitError(\n 'AI usage limit reached. Please try again later or upgrade your plan.',\n 'gemini'\n );\n }\n\n // Safety filter errors\n if (\n message.includes('safety') ||\n message.includes('blocked') ||\n message.includes('harm')\n ) {\n return new LLMSafetyError(\n 'The prompt was blocked by safety filters. Please modify your request.',\n 'gemini'\n );\n }\n\n // Generic stream error\n return new LLMStreamError(error.message, 'gemini');\n }\n}\n"]}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { BaseLLMProvider, streamFromAsyncIterable, encodeText } from './chunk-PPODO6HX.mjs';
|
|
2
|
+
import { LLMStreamError, LLMAuthError, LLMRateLimitError, LLMSafetyError } from './chunk-SR5DRGBX.mjs';
|
|
3
|
+
import './chunk-6DRZXXNT.mjs';
|
|
4
|
+
import './chunk-4LVB3K53.mjs';
|
|
5
|
+
import { GoogleGenerativeAI } from '@google/generative-ai';
|
|
6
|
+
|
|
7
|
+
var GeminiProvider = class extends BaseLLMProvider {
|
|
8
|
+
constructor(config) {
|
|
9
|
+
super(config);
|
|
10
|
+
this.validate();
|
|
11
|
+
this.client = new GoogleGenerativeAI(this.ensureApiKey());
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Stream completion from Gemini
|
|
15
|
+
*/
|
|
16
|
+
async stream(options) {
|
|
17
|
+
return this.streamWithRetry(async () => {
|
|
18
|
+
const model = this.getModel(options);
|
|
19
|
+
const systemInstruction = this.getSystemMessage(options);
|
|
20
|
+
const messages = this.getNonSystemMessages(options);
|
|
21
|
+
const prompt = messages.map((m) => m.content).join("\n\n");
|
|
22
|
+
try {
|
|
23
|
+
const generativeModel = this.client.getGenerativeModel({
|
|
24
|
+
model,
|
|
25
|
+
systemInstruction
|
|
26
|
+
});
|
|
27
|
+
const result = await generativeModel.generateContentStream(prompt);
|
|
28
|
+
return this.createStreamFromResult(result);
|
|
29
|
+
} catch (error) {
|
|
30
|
+
throw this.mapError(error);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Create ReadableStream from Gemini stream result
|
|
36
|
+
*/
|
|
37
|
+
createStreamFromResult(result) {
|
|
38
|
+
return streamFromAsyncIterable(result.stream, (chunk) => {
|
|
39
|
+
try {
|
|
40
|
+
const text = chunk.text();
|
|
41
|
+
return text ? encodeText(text) : null;
|
|
42
|
+
} catch (e) {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Map Gemini errors to LLM error types
|
|
49
|
+
*/
|
|
50
|
+
mapError(error) {
|
|
51
|
+
if (!(error instanceof Error)) {
|
|
52
|
+
return new LLMStreamError(String(error), "gemini");
|
|
53
|
+
}
|
|
54
|
+
const message = error.message.toLowerCase();
|
|
55
|
+
if (message.includes("api key") || message.includes("invalid key") || message.includes("unauthorized") || message.includes("permission denied")) {
|
|
56
|
+
return new LLMAuthError(
|
|
57
|
+
"Invalid API Key. Please check your Gemini API configuration.",
|
|
58
|
+
"gemini"
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
if (message.includes("quota") || message.includes("rate limit") || message.includes("resource exhausted") || message.includes("429")) {
|
|
62
|
+
return new LLMRateLimitError(
|
|
63
|
+
"AI usage limit reached. Please try again later or upgrade your plan.",
|
|
64
|
+
"gemini"
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
if (message.includes("safety") || message.includes("blocked") || message.includes("harm")) {
|
|
68
|
+
return new LLMSafetyError(
|
|
69
|
+
"The prompt was blocked by safety filters. Please modify your request.",
|
|
70
|
+
"gemini"
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
return new LLMStreamError(error.message, "gemini");
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
export { GeminiProvider };
|
|
78
|
+
//# sourceMappingURL=gemini-C5RBLQEJ.mjs.map
|
|
79
|
+
//# sourceMappingURL=gemini-C5RBLQEJ.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/llm/providers/gemini.ts"],"names":[],"mappings":"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","file":"gemini-C5RBLQEJ.mjs","sourcesContent":["/**\n * Gemini LLM Provider\n * Google Gemini AI integration using @google/generative-ai SDK\n */\n\nimport { GoogleGenerativeAI, type GenerateContentStreamResult } from '@google/generative-ai';\nimport { BaseLLMProvider } from '../base-provider';\nimport {\n type LLMConfig,\n type LLMStreamOptions,\n LLMAuthError,\n LLMRateLimitError,\n LLMSafetyError,\n LLMStreamError,\n} from '../types';\nimport { encodeText, streamFromAsyncIterable } from '../utils/streaming';\n\n// ============================================================================\n// Gemini Provider\n// ============================================================================\n\nexport class GeminiProvider extends BaseLLMProvider {\n private client: GoogleGenerativeAI;\n\n constructor(config: LLMConfig) {\n super(config);\n this.validate();\n this.client = new GoogleGenerativeAI(this.ensureApiKey());\n }\n\n /**\n * Stream completion from Gemini\n */\n public async stream(options: LLMStreamOptions): Promise<ReadableStream<Uint8Array>> {\n return this.streamWithRetry(async () => {\n const model = this.getModel(options);\n const systemInstruction = this.getSystemMessage(options);\n const messages = this.getNonSystemMessages(options);\n\n // Build the prompt from messages\n const prompt = messages.map((m) => m.content).join('\\n\\n');\n\n try {\n const generativeModel = this.client.getGenerativeModel({\n model,\n systemInstruction,\n });\n\n const result = await generativeModel.generateContentStream(prompt);\n\n return this.createStreamFromResult(result);\n } catch (error) {\n throw this.mapError(error);\n }\n });\n }\n\n /**\n * Create ReadableStream from Gemini stream result\n */\n private createStreamFromResult(\n result: GenerateContentStreamResult\n ): ReadableStream<Uint8Array> {\n return streamFromAsyncIterable(result.stream, (chunk) => {\n try {\n const text = chunk.text();\n return text ? encodeText(text) : null;\n } catch {\n // Handle safety-blocked chunks\n return null;\n }\n });\n }\n\n /**\n * Map Gemini errors to LLM error types\n */\n private mapError(error: unknown): Error {\n if (!(error instanceof Error)) {\n return new LLMStreamError(String(error), 'gemini');\n }\n\n const message = error.message.toLowerCase();\n\n // Authentication errors\n if (\n message.includes('api key') ||\n message.includes('invalid key') ||\n message.includes('unauthorized') ||\n message.includes('permission denied')\n ) {\n return new LLMAuthError(\n 'Invalid API Key. Please check your Gemini API configuration.',\n 'gemini'\n );\n }\n\n // Rate limit errors\n if (\n message.includes('quota') ||\n message.includes('rate limit') ||\n message.includes('resource exhausted') ||\n message.includes('429')\n ) {\n return new LLMRateLimitError(\n 'AI usage limit reached. Please try again later or upgrade your plan.',\n 'gemini'\n );\n }\n\n // Safety filter errors\n if (\n message.includes('safety') ||\n message.includes('blocked') ||\n message.includes('harm')\n ) {\n return new LLMSafetyError(\n 'The prompt was blocked by safety filters. Please modify your request.',\n 'gemini'\n );\n }\n\n // Generic stream error\n return new LLMStreamError(error.message, 'gemini');\n }\n}\n"]}
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { A as AggregationType, C as ColumnSchema, a as ConnectionEnvironment, D as DatabaseConnection, b as DatabaseType, c as DateGrouping, F as ForeignKeySchema, I as IndexSchema, Q as QueryHistoryItem, d as QueryPagination, e as QueryResult, f as QueryTab, S as SSHTunnelConfig, g as SSLConfig, h as SSLMode, i as SavedChartConfig, j as SavedQuery, k as SchemaSnapshot, T as TableSchema } from './types-BJvJfxSY.mjs';
|
|
2
|
+
export { P as ProviderCapabilities } from './types-ClAg_v5k.mjs';
|
|
3
|
+
export { clearProviderCache, createDatabaseProvider, createLLMProvider, getDefaultProvider, getOrCreateProvider, getProviderCacheStats, removeProvider, resetDefaultProvider } from './providers.mjs';
|
|
4
|
+
export { CodeGenerator, ConnectionModal, DataCharts, DataProfiler, NL2SQLPanel, QueryEditor, QueryEditorRef, QuerySafetyDialog, ResultsGrid, SchemaDiagram, SchemaExplorer, TestDataGenerator, VisualExplain } from './components.mjs';
|
|
5
|
+
import 'react';
|
|
6
|
+
import 'react/jsx-runtime';
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { A as AggregationType, C as ColumnSchema, a as ConnectionEnvironment, D as DatabaseConnection, b as DatabaseType, c as DateGrouping, F as ForeignKeySchema, I as IndexSchema, Q as QueryHistoryItem, d as QueryPagination, e as QueryResult, f as QueryTab, S as SSHTunnelConfig, g as SSLConfig, h as SSLMode, i as SavedChartConfig, j as SavedQuery, k as SchemaSnapshot, T as TableSchema } from './types-BJvJfxSY.js';
|
|
2
|
+
export { P as ProviderCapabilities } from './types-Der_X8E8.js';
|
|
3
|
+
export { clearProviderCache, createDatabaseProvider, createLLMProvider, getDefaultProvider, getOrCreateProvider, getProviderCacheStats, removeProvider, resetDefaultProvider } from './providers.js';
|
|
4
|
+
export { CodeGenerator, ConnectionModal, DataCharts, DataProfiler, NL2SQLPanel, QueryEditor, QueryEditorRef, QuerySafetyDialog, ResultsGrid, SchemaDiagram, SchemaExplorer, TestDataGenerator, VisualExplain } from './components.js';
|
|
5
|
+
import 'react';
|
|
6
|
+
import 'react/jsx-runtime';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkD4WVWWWF_js = require('./chunk-D4WVWWWF.js');
|
|
4
|
+
require('./chunk-RCQB4FCE.js');
|
|
5
|
+
require('./chunk-G4WYE6TI.js');
|
|
6
|
+
var chunkHGPD6PWV_js = require('./chunk-HGPD6PWV.js');
|
|
7
|
+
var chunkY52UIFEX_js = require('./chunk-Y52UIFEX.js');
|
|
8
|
+
require('./chunk-VLCRUZX7.js');
|
|
9
|
+
require('./chunk-JZO5KRZN.js');
|
|
10
|
+
require('./chunk-Q6LRDBK7.js');
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
Object.defineProperty(exports, "clearProviderCache", {
|
|
15
|
+
enumerable: true,
|
|
16
|
+
get: function () { return chunkD4WVWWWF_js.clearProviderCache; }
|
|
17
|
+
});
|
|
18
|
+
Object.defineProperty(exports, "createDatabaseProvider", {
|
|
19
|
+
enumerable: true,
|
|
20
|
+
get: function () { return chunkD4WVWWWF_js.createDatabaseProvider; }
|
|
21
|
+
});
|
|
22
|
+
Object.defineProperty(exports, "createLLMProvider", {
|
|
23
|
+
enumerable: true,
|
|
24
|
+
get: function () { return chunkD4WVWWWF_js.createLLMProvider; }
|
|
25
|
+
});
|
|
26
|
+
Object.defineProperty(exports, "getDefaultProvider", {
|
|
27
|
+
enumerable: true,
|
|
28
|
+
get: function () { return chunkD4WVWWWF_js.getDefaultProvider; }
|
|
29
|
+
});
|
|
30
|
+
Object.defineProperty(exports, "getOrCreateProvider", {
|
|
31
|
+
enumerable: true,
|
|
32
|
+
get: function () { return chunkD4WVWWWF_js.getOrCreateProvider; }
|
|
33
|
+
});
|
|
34
|
+
Object.defineProperty(exports, "getProviderCacheStats", {
|
|
35
|
+
enumerable: true,
|
|
36
|
+
get: function () { return chunkD4WVWWWF_js.getProviderCacheStats; }
|
|
37
|
+
});
|
|
38
|
+
Object.defineProperty(exports, "removeProvider", {
|
|
39
|
+
enumerable: true,
|
|
40
|
+
get: function () { return chunkD4WVWWWF_js.removeProvider; }
|
|
41
|
+
});
|
|
42
|
+
Object.defineProperty(exports, "resetDefaultProvider", {
|
|
43
|
+
enumerable: true,
|
|
44
|
+
get: function () { return chunkD4WVWWWF_js.resetDefaultProvider; }
|
|
45
|
+
});
|
|
46
|
+
Object.defineProperty(exports, "ConnectionModal", {
|
|
47
|
+
enumerable: true,
|
|
48
|
+
get: function () { return chunkHGPD6PWV_js.ConnectionModal; }
|
|
49
|
+
});
|
|
50
|
+
Object.defineProperty(exports, "CodeGenerator", {
|
|
51
|
+
enumerable: true,
|
|
52
|
+
get: function () { return chunkY52UIFEX_js.CodeGenerator; }
|
|
53
|
+
});
|
|
54
|
+
Object.defineProperty(exports, "DataCharts", {
|
|
55
|
+
enumerable: true,
|
|
56
|
+
get: function () { return chunkY52UIFEX_js.DataCharts; }
|
|
57
|
+
});
|
|
58
|
+
Object.defineProperty(exports, "DataProfiler", {
|
|
59
|
+
enumerable: true,
|
|
60
|
+
get: function () { return chunkY52UIFEX_js.DataProfiler; }
|
|
61
|
+
});
|
|
62
|
+
Object.defineProperty(exports, "NL2SQLPanel", {
|
|
63
|
+
enumerable: true,
|
|
64
|
+
get: function () { return chunkY52UIFEX_js.NL2SQLPanel; }
|
|
65
|
+
});
|
|
66
|
+
Object.defineProperty(exports, "QueryEditor", {
|
|
67
|
+
enumerable: true,
|
|
68
|
+
get: function () { return chunkY52UIFEX_js.QueryEditor; }
|
|
69
|
+
});
|
|
70
|
+
Object.defineProperty(exports, "QuerySafetyDialog", {
|
|
71
|
+
enumerable: true,
|
|
72
|
+
get: function () { return chunkY52UIFEX_js.QuerySafetyDialog; }
|
|
73
|
+
});
|
|
74
|
+
Object.defineProperty(exports, "ResultsGrid", {
|
|
75
|
+
enumerable: true,
|
|
76
|
+
get: function () { return chunkY52UIFEX_js.ResultsGrid; }
|
|
77
|
+
});
|
|
78
|
+
Object.defineProperty(exports, "SchemaDiagram", {
|
|
79
|
+
enumerable: true,
|
|
80
|
+
get: function () { return chunkY52UIFEX_js.SchemaDiagram; }
|
|
81
|
+
});
|
|
82
|
+
Object.defineProperty(exports, "SchemaExplorer", {
|
|
83
|
+
enumerable: true,
|
|
84
|
+
get: function () { return chunkY52UIFEX_js.SchemaExplorer; }
|
|
85
|
+
});
|
|
86
|
+
Object.defineProperty(exports, "TestDataGenerator", {
|
|
87
|
+
enumerable: true,
|
|
88
|
+
get: function () { return chunkY52UIFEX_js.TestDataGenerator; }
|
|
89
|
+
});
|
|
90
|
+
Object.defineProperty(exports, "VisualExplain", {
|
|
91
|
+
enumerable: true,
|
|
92
|
+
get: function () { return chunkY52UIFEX_js.VisualExplain; }
|
|
93
|
+
});
|
|
94
|
+
//# sourceMappingURL=index.js.map
|
|
95
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { clearProviderCache, createDatabaseProvider, createLLMProvider, getDefaultProvider, getOrCreateProvider, getProviderCacheStats, removeProvider, resetDefaultProvider } from './chunk-34YQUUCM.mjs';
|
|
2
|
+
import './chunk-SR5DRGBX.mjs';
|
|
3
|
+
import './chunk-DY3KXE44.mjs';
|
|
4
|
+
export { ConnectionModal } from './chunk-CPF7XWV5.mjs';
|
|
5
|
+
export { CodeGenerator, DataCharts, DataProfiler, NL2SQLPanel, QueryEditor, QuerySafetyDialog, ResultsGrid, SchemaDiagram, SchemaExplorer, TestDataGenerator, VisualExplain } from './chunk-G3S66G64.mjs';
|
|
6
|
+
import './chunk-6DRZXXNT.mjs';
|
|
7
|
+
import './chunk-CZVV3JJB.mjs';
|
|
8
|
+
import './chunk-4LVB3K53.mjs';
|
|
9
|
+
//# sourceMappingURL=index.mjs.map
|
|
10
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.mjs"}
|