insforge 0.3.1
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/.dockerignore +58 -0
- package/.env.example +49 -0
- package/.github/ISSUE_TEMPLATE/bug_report.yml +83 -0
- package/.github/ISSUE_TEMPLATE/config.yml +11 -0
- package/.github/ISSUE_TEMPLATE/feature_request.yml +79 -0
- package/.github/copilot-instructions.md +147 -0
- package/.github/workflows/build-image.yml +65 -0
- package/.github/workflows/ci-premerge-check.yml +24 -0
- package/.github/workflows/deploy-aws.yml +130 -0
- package/.github/workflows/lint-and-format.yml +33 -0
- package/.prettierignore +65 -0
- package/.prettierrc +9 -0
- package/CHANGELOG.md +3 -0
- package/CONTRIBUTING.md +126 -0
- package/Dockerfile +27 -0
- package/GITHUB_OAUTH_SETUP.md +49 -0
- package/GOOGLE_OAUTH_SETUP.md +148 -0
- package/LICENSE +201 -0
- package/README.md +134 -0
- package/assets/Dark.svg +23 -0
- package/assets/archDiagram.png +0 -0
- package/assets/banner.png +0 -0
- package/assets/mcpInstallv2.png +0 -0
- package/assets/sampleResponse.png +0 -0
- package/assets/signin.png +0 -0
- package/assets/userflow.png +0 -0
- package/backend/migrations/000_create-base-tables.sql +142 -0
- package/backend/migrations/001_create-helper-functions.sql +41 -0
- package/backend/migrations/002_rename-auth-tables.sql +30 -0
- package/backend/migrations/003_create-users-table.sql +56 -0
- package/backend/migrations/004_add-reload-postgrest-func.sql +24 -0
- package/backend/migrations/005_enable-project-admin-modify-users.sql +30 -0
- package/backend/migrations/006_modify-ai-usage-table.sql +25 -0
- package/backend/migrations/007_drop-metadata-table.sql +2 -0
- package/backend/migrations/008_add-system-tables.sql +77 -0
- package/backend/migrations/009_add-function-secrets.sql +24 -0
- package/backend/migrations/010_modify-ai-config-modalities.sql +93 -0
- package/backend/migrations/011_refactor-secrets-table.sql +15 -0
- package/backend/migrations/012_add-storage-uploaded-by.sql +8 -0
- package/backend/package.json +75 -0
- package/backend/src/api/middleware/auth.ts +240 -0
- package/backend/src/api/middleware/error.ts +231 -0
- package/backend/src/api/middleware/upload.ts +59 -0
- package/backend/src/api/routes/agent.ts +29 -0
- package/backend/src/api/routes/ai.ts +472 -0
- package/backend/src/api/routes/auth.oauth.ts +482 -0
- package/backend/src/api/routes/auth.ts +386 -0
- package/backend/src/api/routes/database.advance.ts +275 -0
- package/backend/src/api/routes/database.records.ts +246 -0
- package/backend/src/api/routes/database.tables.ts +161 -0
- package/backend/src/api/routes/docs.ts +66 -0
- package/backend/src/api/routes/functions.ts +183 -0
- package/backend/src/api/routes/logs.ts +150 -0
- package/backend/src/api/routes/metadata.ts +160 -0
- package/backend/src/api/routes/openapi.ts +82 -0
- package/backend/src/api/routes/secrets.ts +199 -0
- package/backend/src/api/routes/storage.ts +547 -0
- package/backend/src/api/routes/usage.ts +96 -0
- package/backend/src/core/ai/chat.ts +207 -0
- package/backend/src/core/ai/client.ts +242 -0
- package/backend/src/core/ai/config.ts +187 -0
- package/backend/src/core/ai/image.ts +156 -0
- package/backend/src/core/ai/model.ts +117 -0
- package/backend/src/core/ai/usage.ts +290 -0
- package/backend/src/core/auth/auth.ts +781 -0
- package/backend/src/core/auth/oauth.ts +398 -0
- package/backend/src/core/database/advance.ts +1074 -0
- package/backend/src/core/database/manager.ts +178 -0
- package/backend/src/core/database/table.ts +772 -0
- package/backend/src/core/documentation/agent.ts +689 -0
- package/backend/src/core/documentation/openapi.ts +856 -0
- package/backend/src/core/functions/functions.ts +310 -0
- package/backend/src/core/logs/analytics.ts +76 -0
- package/backend/src/core/logs/audit.ts +255 -0
- package/backend/src/core/logs/providers/base.provider.ts +83 -0
- package/backend/src/core/logs/providers/cloudwatch.provider.ts +510 -0
- package/backend/src/core/logs/providers/localdb.provider.ts +246 -0
- package/backend/src/core/secrets/encryption.ts +58 -0
- package/backend/src/core/secrets/secrets.ts +410 -0
- package/backend/src/core/socket/socket.ts +388 -0
- package/backend/src/core/socket/types.ts +79 -0
- package/backend/src/core/storage/storage.ts +923 -0
- package/backend/src/server.ts +288 -0
- package/backend/src/types/ai.ts +46 -0
- package/backend/src/types/auth.ts +90 -0
- package/backend/src/types/database.ts +136 -0
- package/backend/src/types/error-constants.ts +86 -0
- package/backend/src/types/logs.ts +47 -0
- package/backend/src/types/profile.ts +55 -0
- package/backend/src/types/storage.ts +23 -0
- package/backend/src/utils/cloud-token.ts +39 -0
- package/backend/src/utils/constants.ts +1 -0
- package/backend/src/utils/environment.ts +35 -0
- package/backend/src/utils/helpers.ts +49 -0
- package/backend/src/utils/logger.ts +13 -0
- package/backend/src/utils/response.ts +62 -0
- package/backend/src/utils/seed.ts +205 -0
- package/backend/src/utils/sql-parser.ts +63 -0
- package/backend/src/utils/uuid.ts +9 -0
- package/backend/src/utils/validations.ts +129 -0
- package/backend/tests/README.md +134 -0
- package/backend/tests/cleanup-all-test-data.sh +231 -0
- package/backend/tests/cloud/test-s3-multitenant.sh +132 -0
- package/backend/tests/local/comprehensive-curl-tests.sh +156 -0
- package/backend/tests/local/test-auth-router.sh +144 -0
- package/backend/tests/local/test-database-router.sh +222 -0
- package/backend/tests/local/test-e2e.sh +241 -0
- package/backend/tests/local/test-fk-errors.sh +97 -0
- package/backend/tests/local/test-id-field.sh +201 -0
- package/backend/tests/local/test-public-bucket.sh +265 -0
- package/backend/tests/local/test-secrets.sh +248 -0
- package/backend/tests/local/test-serverless-functions.sh.disabled +325 -0
- package/backend/tests/local/test-traditional-rest.sh +209 -0
- package/backend/tests/manual/README.md +51 -0
- package/backend/tests/manual/create-large-table-simple.sql +11 -0
- package/backend/tests/manual/seed-large-table.sql +101 -0
- package/backend/tests/manual/setup-large-table-extras.sql +34 -0
- package/backend/tests/manual/test-better-auth.sh +303 -0
- package/backend/tests/manual/test-bulk-upsert.sh +410 -0
- package/backend/tests/manual/test-database-advance.sh +297 -0
- package/backend/tests/manual/test-postgrest-stability.sh +192 -0
- package/backend/tests/manual/test-rawsql-export-import.sh +412 -0
- package/backend/tests/manual/test-universal-storage.sh +264 -0
- package/backend/tests/manual/test-users.sql +18 -0
- package/backend/tests/run-all-tests.sh +140 -0
- package/backend/tests/setup.ts +22 -0
- package/backend/tests/test-config.sh +303 -0
- package/backend/tsconfig.json +23 -0
- package/backend/tsup.config.ts +18 -0
- package/backend/vitest.config.ts +22 -0
- package/docker-compose.prod.yml +145 -0
- package/docker-compose.yml +167 -0
- package/docker-init/db/db-init.sql +125 -0
- package/docker-init/db/jwt.sql +5 -0
- package/docker-init/db/logs.sql +9 -0
- package/docker-init/db/postgresql.conf +17 -0
- package/docs/deprecated/insforge-auth-api.md +215 -0
- package/docs/deprecated/insforge-auth-sdk.md +100 -0
- package/docs/deprecated/insforge-db-api.md +359 -0
- package/docs/deprecated/insforge-db-sdk.md +140 -0
- package/docs/deprecated/insforge-debug-sdk.md +157 -0
- package/docs/deprecated/insforge-debug.md +65 -0
- package/docs/deprecated/insforge-instructions.md +124 -0
- package/docs/deprecated/insforge-project.md +118 -0
- package/docs/deprecated/insforge-storage-api.md +279 -0
- package/docs/deprecated/insforge-storage-sdk.md +159 -0
- package/docs/insforge-instructions-sdk.md +407 -0
- package/eslint.config.js +317 -0
- package/examples/oauth/frontend-oauth-example.html +251 -0
- package/examples/response-examples.md +444 -0
- package/frontend/README.md +112 -0
- package/frontend/components.json +17 -0
- package/frontend/index.html +13 -0
- package/frontend/package.json +63 -0
- package/frontend/public/favicon.ico +0 -0
- package/frontend/src/App.tsx +106 -0
- package/frontend/src/assets/icons/checkbox_checked.svg +6 -0
- package/frontend/src/assets/icons/checkbox_undetermined.svg +6 -0
- package/frontend/src/assets/icons/checked.svg +3 -0
- package/frontend/src/assets/icons/error.svg +3 -0
- package/frontend/src/assets/icons/pencil.svg +4 -0
- package/frontend/src/assets/icons/refresh.svg +4 -0
- package/frontend/src/assets/icons/step_active.svg +3 -0
- package/frontend/src/assets/icons/step_inactive.svg +11 -0
- package/frontend/src/assets/icons/warning.svg +3 -0
- package/frontend/src/assets/logos/amazon.svg +1 -0
- package/frontend/src/assets/logos/claude_code.svg +3 -0
- package/frontend/src/assets/logos/cline.svg +6 -0
- package/frontend/src/assets/logos/cursor.svg +20 -0
- package/frontend/src/assets/logos/discord.svg +9 -0
- package/frontend/src/assets/logos/gemini.svg +19 -0
- package/frontend/src/assets/logos/github.svg +5 -0
- package/frontend/src/assets/logos/google.svg +13 -0
- package/frontend/src/assets/logos/grok.svg +10 -0
- package/frontend/src/assets/logos/insforge_dark.svg +15 -0
- package/frontend/src/assets/logos/insforge_light.svg +15 -0
- package/frontend/src/assets/logos/openai.svg +10 -0
- package/frontend/src/assets/logos/roo_code.svg +9 -0
- package/frontend/src/assets/logos/trae.svg +3 -0
- package/frontend/src/assets/logos/windsurf.svg +10 -0
- package/frontend/src/components/ButtonWithLoading.tsx +27 -0
- package/frontend/src/components/Checkbox.tsx +61 -0
- package/frontend/src/components/CodeBlock.tsx +32 -0
- package/frontend/src/components/ConfirmDialog.tsx +96 -0
- package/frontend/src/components/CopyButton.tsx +69 -0
- package/frontend/src/components/DeleteActionButton.tsx +42 -0
- package/frontend/src/components/EmptyState.tsx +41 -0
- package/frontend/src/components/ErrorState.tsx +35 -0
- package/frontend/src/components/FeatureSidebar.tsx +126 -0
- package/frontend/src/components/FeatureSidebarItem.tsx +101 -0
- package/frontend/src/components/JsonHighlight.tsx +61 -0
- package/frontend/src/components/LoadingState.tsx +16 -0
- package/frontend/src/components/PaginationControls.tsx +54 -0
- package/frontend/src/components/PromptDialog.tsx +68 -0
- package/frontend/src/components/SearchInput.tsx +90 -0
- package/frontend/src/components/SelectionClearButton.tsx +26 -0
- package/frontend/src/components/Stepper.tsx +139 -0
- package/frontend/src/components/ThemeToggle.tsx +58 -0
- package/frontend/src/components/TypeBadge.tsx +20 -0
- package/frontend/src/components/datagrid/DataGrid.tsx +264 -0
- package/frontend/src/components/datagrid/DefaultCellRenderer.tsx +114 -0
- package/frontend/src/components/datagrid/IdCell.tsx +44 -0
- package/frontend/src/components/datagrid/SortableHeader.tsx +74 -0
- package/frontend/src/components/datagrid/cell-editors/BooleanCellEditor.tsx +54 -0
- package/frontend/src/components/datagrid/cell-editors/DateCellEditor.tsx +483 -0
- package/frontend/src/components/datagrid/cell-editors/JsonCellEditor.tsx +362 -0
- package/frontend/src/components/datagrid/cell-editors/TextCellEditor.tsx +38 -0
- package/frontend/src/components/datagrid/cell-editors/index.ts +14 -0
- package/frontend/src/components/datagrid/cell-editors/types.ts +43 -0
- package/frontend/src/components/datagrid/datagridTypes.tsx +72 -0
- package/frontend/src/components/datagrid/index.tsx +20 -0
- package/frontend/src/components/index.ts +39 -0
- package/frontend/src/components/layout/AppHeader.tsx +146 -0
- package/frontend/src/components/layout/AppSidebar.tsx +190 -0
- package/frontend/src/components/layout/CloudLayout.tsx +95 -0
- package/frontend/src/components/layout/Layout.tsx +43 -0
- package/frontend/src/components/radix/Alert.tsx +45 -0
- package/frontend/src/components/radix/AlertDialog.tsx +115 -0
- package/frontend/src/components/radix/Avatar.tsx +45 -0
- package/frontend/src/components/radix/Badge.tsx +33 -0
- package/frontend/src/components/radix/Button.tsx +50 -0
- package/frontend/src/components/radix/Card.tsx +58 -0
- package/frontend/src/components/radix/Dialog.tsx +98 -0
- package/frontend/src/components/radix/DropdownMenu.tsx +185 -0
- package/frontend/src/components/radix/Form.tsx +167 -0
- package/frontend/src/components/radix/Input.tsx +22 -0
- package/frontend/src/components/radix/Label.tsx +19 -0
- package/frontend/src/components/radix/Popover.tsx +29 -0
- package/frontend/src/components/radix/ScrollArea.tsx +44 -0
- package/frontend/src/components/radix/Select.tsx +151 -0
- package/frontend/src/components/radix/Separator.tsx +26 -0
- package/frontend/src/components/radix/Sheet.tsx +119 -0
- package/frontend/src/components/radix/Skeleton.tsx +7 -0
- package/frontend/src/components/radix/Switch.tsx +29 -0
- package/frontend/src/components/radix/Tabs.tsx +50 -0
- package/frontend/src/components/radix/Textarea.tsx +21 -0
- package/frontend/src/components/radix/Tooltip.tsx +28 -0
- package/frontend/src/features/ai/components/AIConfigCard.tsx +154 -0
- package/frontend/src/features/ai/components/AIConfigDialog.tsx +76 -0
- package/frontend/src/features/ai/components/AIConfigForm.tsx +222 -0
- package/frontend/src/features/ai/components/AIEmptyState.tsx +18 -0
- package/frontend/src/features/ai/components/fields/ModalityField.tsx +87 -0
- package/frontend/src/features/ai/components/fields/ModelSelectionField.tsx +134 -0
- package/frontend/src/features/ai/components/fields/SystemPromptField.tsx +33 -0
- package/frontend/src/features/ai/helpers.ts +155 -0
- package/frontend/src/features/ai/hooks/useAIConfigs.ts +221 -0
- package/frontend/src/features/ai/hooks/useAIUsage.ts +77 -0
- package/frontend/src/features/ai/page/AIPage.tsx +178 -0
- package/frontend/src/features/ai/services/ai.service.ts +148 -0
- package/frontend/src/features/auth/components/AddOAuthDialog.tsx +106 -0
- package/frontend/src/features/auth/components/AuthMethodTab.tsx +238 -0
- package/frontend/src/features/auth/components/OAuthConfigDialog.tsx +303 -0
- package/frontend/src/features/auth/components/OAuthEmptyState.tsx +15 -0
- package/frontend/src/features/auth/components/UserFormDialog.tsx +248 -0
- package/frontend/src/features/auth/components/UsersDataGrid.tsx +183 -0
- package/frontend/src/features/auth/components/UsersTab.tsx +114 -0
- package/frontend/src/features/auth/hooks/useOAuthConfig.ts +129 -0
- package/frontend/src/features/auth/hooks/useUsers.ts +57 -0
- package/frontend/src/features/auth/index.ts +9 -0
- package/frontend/src/features/auth/page/AuthenticationPage.tsx +169 -0
- package/frontend/src/features/auth/services/auth.service.ts +112 -0
- package/frontend/src/features/auth/services/oauth.service.ts +49 -0
- package/frontend/src/features/dashboard/page/DashboardPage.tsx +194 -0
- package/frontend/src/features/database/components/ColumnTypeSelect.tsx +64 -0
- package/frontend/src/features/database/components/DatabaseDataGrid.tsx +282 -0
- package/frontend/src/features/database/components/ForeignKeyCell.tsx +187 -0
- package/frontend/src/features/database/components/ForeignKeyPopover.tsx +378 -0
- package/frontend/src/features/database/components/LinkRecordModal.tsx +288 -0
- package/frontend/src/features/database/components/RecordFormDialog.tsx +164 -0
- package/frontend/src/features/database/components/RecordFormField.tsx +568 -0
- package/frontend/src/features/database/components/TableEmptyState.tsx +21 -0
- package/frontend/src/features/database/components/TableForm.tsx +656 -0
- package/frontend/src/features/database/components/TableFormColumn.tsx +137 -0
- package/frontend/src/features/database/components/TableListSkeleton.tsx +9 -0
- package/frontend/src/features/database/components/TableSidebar.tsx +47 -0
- package/frontend/src/features/database/constants.ts +26 -0
- package/frontend/src/features/database/helpers.ts +125 -0
- package/frontend/src/features/database/hooks/UseLinkModal.tsx +78 -0
- package/frontend/src/features/database/index.ts +12 -0
- package/frontend/src/features/database/page/DatabasePage.tsx +626 -0
- package/frontend/src/features/database/schema.ts +25 -0
- package/frontend/src/features/database/services/database.service.ts +216 -0
- package/frontend/src/features/functions/components/FunctionEmptyState.tsx +15 -0
- package/frontend/src/features/functions/components/FunctionRow.tsx +71 -0
- package/frontend/src/features/functions/components/FunctionViewer.tsx +46 -0
- package/frontend/src/features/functions/components/FunctionsContent.tsx +88 -0
- package/frontend/src/features/functions/components/FunctionsSidebar.tsx +56 -0
- package/frontend/src/features/functions/components/SecretEmptyState.tsx +23 -0
- package/frontend/src/features/functions/components/SecretRow.tsx +68 -0
- package/frontend/src/features/functions/components/SecretsContent.tsx +120 -0
- package/frontend/src/features/functions/hooks/useFunctions.ts +106 -0
- package/frontend/src/features/functions/page/FunctionsPage.tsx +28 -0
- package/frontend/src/features/functions/services/functions.service.ts +48 -0
- package/frontend/src/features/login/components/AuthErrorBoundary.tsx +87 -0
- package/frontend/src/features/login/components/PrivateRoute.tsx +24 -0
- package/frontend/src/features/login/page/CloudLoginPage.tsx +93 -0
- package/frontend/src/features/login/page/LoginPage.tsx +174 -0
- package/frontend/src/features/logs/components/AnalyticsLogsTable.tsx +313 -0
- package/frontend/src/features/logs/components/LogsTable.tsx +199 -0
- package/frontend/src/features/logs/hooks/useAuditLogs.ts +39 -0
- package/frontend/src/features/logs/index.ts +5 -0
- package/frontend/src/features/logs/page/AnalyticsLogsPage.tsx +530 -0
- package/frontend/src/features/logs/page/AuditsPage.tsx +192 -0
- package/frontend/src/features/logs/services/log.service.ts +171 -0
- package/frontend/src/features/metadata/hooks/useMetadata.ts +53 -0
- package/frontend/src/features/metadata/index.ts +0 -0
- package/frontend/src/features/metadata/page/MetadataPage.tsx +136 -0
- package/frontend/src/features/metadata/services/metadata.service.ts +17 -0
- package/frontend/src/features/onboard/components/CompletionCard.tsx +41 -0
- package/frontend/src/features/onboard/components/OnboardButton.tsx +84 -0
- package/frontend/src/features/onboard/components/StepContent.tsx +91 -0
- package/frontend/src/features/onboard/components/TestConnectionStep.tsx +53 -0
- package/frontend/src/features/onboard/components/mcp/CursorDeeplinkGenerator.tsx +35 -0
- package/frontend/src/features/onboard/components/mcp/McpInstallation.tsx +144 -0
- package/frontend/src/features/onboard/components/mcp/index.ts +4 -0
- package/frontend/src/features/onboard/components/mcp/mcp-helper.tsx +98 -0
- package/frontend/src/features/onboard/index.ts +3 -0
- package/frontend/src/features/onboard/page/OnBoardPage.tsx +104 -0
- package/frontend/src/features/onboard/types.ts +8 -0
- package/frontend/src/features/secrets/hooks/useSecrets.ts +139 -0
- package/frontend/src/features/secrets/services/secrets.service.ts +57 -0
- package/frontend/src/features/storage/components/BucketEmptyState.tsx +19 -0
- package/frontend/src/features/storage/components/BucketFormDialog.tsx +194 -0
- package/frontend/src/features/storage/components/BucketListSkeleton.tsx +17 -0
- package/frontend/src/features/storage/components/FilePreviewDialog.tsx +287 -0
- package/frontend/src/features/storage/components/StorageDataGrid.tsx +239 -0
- package/frontend/src/features/storage/components/StorageManager.tsx +236 -0
- package/frontend/src/features/storage/components/StorageSidebar.tsx +44 -0
- package/frontend/src/features/storage/components/UploadToast.tsx +46 -0
- package/frontend/src/features/storage/index.ts +3 -0
- package/frontend/src/features/storage/page/StoragePage.tsx +553 -0
- package/frontend/src/features/storage/services/storage.service.ts +144 -0
- package/frontend/src/features/visualizer/components/AuthNode.tsx +107 -0
- package/frontend/src/features/visualizer/components/BucketNode.tsx +34 -0
- package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +359 -0
- package/frontend/src/features/visualizer/components/TableNode.tsx +152 -0
- package/frontend/src/features/visualizer/components/VisualizerSkeleton.tsx +24 -0
- package/frontend/src/features/visualizer/components/index.ts +5 -0
- package/frontend/src/features/visualizer/page/VisualizerPage.tsx +127 -0
- package/frontend/src/index.css +248 -0
- package/frontend/src/lib/api/client.ts +163 -0
- package/frontend/src/lib/contexts/AuthContext.tsx +157 -0
- package/frontend/src/lib/contexts/OnboardStepContext.tsx +68 -0
- package/frontend/src/lib/contexts/SocketContext.tsx +303 -0
- package/frontend/src/lib/contexts/ThemeContext.tsx +125 -0
- package/frontend/src/lib/hooks/useAuth.ts +4 -0
- package/frontend/src/lib/hooks/useConfirm.ts +55 -0
- package/frontend/src/lib/hooks/useInterval.ts +27 -0
- package/frontend/src/lib/hooks/useMediaQuery.ts +59 -0
- package/frontend/src/lib/hooks/useOnboardingCompletion.ts +29 -0
- package/frontend/src/lib/hooks/usePagination.ts +27 -0
- package/frontend/src/lib/hooks/useTimeout.ts +27 -0
- package/frontend/src/lib/hooks/useToast.tsx +229 -0
- package/frontend/src/lib/utils/constants.ts +38 -0
- package/frontend/src/lib/utils/utils.ts +165 -0
- package/frontend/src/lib/utils/validation-schemas.ts +126 -0
- package/frontend/src/main.tsx +16 -0
- package/frontend/src/rdg.css +194 -0
- package/frontend/src/vite-env.d.ts +12 -0
- package/frontend/tailwind.config.js +97 -0
- package/frontend/tsconfig.json +26 -0
- package/frontend/tsconfig.node.json +10 -0
- package/frontend/vite.config.ts +37 -0
- package/frontend/vitest.config.ts +36 -0
- package/functions/deno.json +25 -0
- package/functions/server.ts +290 -0
- package/functions/worker-template.js +126 -0
- package/openapi/ai.yaml +689 -0
- package/openapi/auth.yaml +563 -0
- package/openapi/functions.yaml +476 -0
- package/openapi/health.yaml +30 -0
- package/openapi/logs.yaml +224 -0
- package/openapi/metadata.yaml +178 -0
- package/openapi/records.yaml +382 -0
- package/openapi/secrets.yaml +371 -0
- package/openapi/storage.yaml +876 -0
- package/openapi/tables.yaml +464 -0
- package/package.json +88 -0
- package/shared-schemas/package.json +31 -0
- package/shared-schemas/src/ai-api.schema.ts +167 -0
- package/shared-schemas/src/ai.schema.ts +54 -0
- package/shared-schemas/src/auth-api.schema.ts +193 -0
- package/shared-schemas/src/auth.schema.ts +94 -0
- package/shared-schemas/src/database-api.schema.ts +259 -0
- package/shared-schemas/src/database.schema.ts +69 -0
- package/shared-schemas/src/functions-api.schema.ts +25 -0
- package/shared-schemas/src/functions.schema.ts +16 -0
- package/shared-schemas/src/index.ts +13 -0
- package/shared-schemas/src/logs-api.schema.ts +49 -0
- package/shared-schemas/src/logs.schema.ts +14 -0
- package/shared-schemas/src/metadata.schema.ts +56 -0
- package/shared-schemas/src/storage-api.schema.ts +65 -0
- package/shared-schemas/src/storage.schema.ts +19 -0
- package/shared-schemas/tsconfig.json +21 -0
- package/tsconfig.json +8 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { apiClient } from '@/lib/api/client';
|
|
2
|
+
import { UserSchema } from '@insforge/shared-schemas';
|
|
3
|
+
|
|
4
|
+
export class AuthService {
|
|
5
|
+
async loginWithPassword(email: string, password: string) {
|
|
6
|
+
const data = await apiClient.request('/auth/admin/sessions', {
|
|
7
|
+
method: 'POST',
|
|
8
|
+
body: JSON.stringify({ email, password }),
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
// Set token in apiClient
|
|
12
|
+
if (data.accessToken) {
|
|
13
|
+
apiClient.setToken(data.accessToken);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// Return unified format
|
|
17
|
+
return {
|
|
18
|
+
accessToken: data.accessToken,
|
|
19
|
+
user: data.user,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
async loginWithAuthorizationCode(code: string) {
|
|
24
|
+
const data = await apiClient.request('/auth/admin/sessions/exchange', {
|
|
25
|
+
method: 'POST',
|
|
26
|
+
body: JSON.stringify({ code }),
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
// Set token in apiClient
|
|
30
|
+
if (data.accessToken) {
|
|
31
|
+
apiClient.setToken(data.accessToken);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Return unified format
|
|
35
|
+
return {
|
|
36
|
+
accessToken: data.accessToken,
|
|
37
|
+
user: data.user,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
async getCurrentUser() {
|
|
42
|
+
const response = await apiClient.request('/auth/sessions/current');
|
|
43
|
+
return response.user;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
logout() {
|
|
47
|
+
apiClient.clearToken();
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Get users list
|
|
52
|
+
* @param queryParams - Query parameters for pagination
|
|
53
|
+
* @param searchQuery - Optional search query
|
|
54
|
+
* @returns Users list with total count
|
|
55
|
+
*/
|
|
56
|
+
async getUsers(
|
|
57
|
+
queryParams: string = '',
|
|
58
|
+
searchQuery?: string
|
|
59
|
+
): Promise<{
|
|
60
|
+
users: UserSchema[];
|
|
61
|
+
pagination: { offset: number; limit: number; total: number };
|
|
62
|
+
}> {
|
|
63
|
+
let url = '/auth/users';
|
|
64
|
+
const params = new URLSearchParams(queryParams);
|
|
65
|
+
|
|
66
|
+
if (searchQuery && searchQuery.trim()) {
|
|
67
|
+
params.set('search', searchQuery.trim());
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (params.toString()) {
|
|
71
|
+
url += `?${params.toString()}`;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const response: {
|
|
75
|
+
data: UserSchema[];
|
|
76
|
+
pagination: { offset: number; limit: number; total: number };
|
|
77
|
+
} = await apiClient.request(url);
|
|
78
|
+
|
|
79
|
+
return {
|
|
80
|
+
users: response.data,
|
|
81
|
+
pagination: response.pagination,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
async getUser(id: string) {
|
|
86
|
+
return await apiClient.request(`/auth/users/${id}`);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
async register(email: string, password: string, name?: string) {
|
|
90
|
+
const response = await apiClient.request('/auth/users', {
|
|
91
|
+
method: 'POST',
|
|
92
|
+
body: JSON.stringify({ email, password, name }),
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
return response;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
async deleteUsers(userIds: string[]) {
|
|
99
|
+
return apiClient.request('/auth/users', {
|
|
100
|
+
method: 'DELETE',
|
|
101
|
+
body: JSON.stringify({ userIds }),
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
async generateAnonToken(): Promise<{ accessToken: string; message: string }> {
|
|
106
|
+
return apiClient.request('/auth/tokens/anon', {
|
|
107
|
+
method: 'POST',
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export const authService = new AuthService();
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { apiClient } from '@/lib/api/client';
|
|
2
|
+
import {
|
|
3
|
+
OAuthConfigSchema,
|
|
4
|
+
CreateOAuthConfigRequest,
|
|
5
|
+
UpdateOAuthConfigRequest,
|
|
6
|
+
ListOAuthConfigsResponse,
|
|
7
|
+
} from '@insforge/shared-schemas';
|
|
8
|
+
|
|
9
|
+
export class OAuthConfigService {
|
|
10
|
+
// List all OAuth configurations
|
|
11
|
+
async getAllConfigs(): Promise<ListOAuthConfigsResponse> {
|
|
12
|
+
return apiClient.request('/auth/oauth/configs');
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// Get specific OAuth configuration by provider
|
|
16
|
+
async getConfigByProvider(
|
|
17
|
+
provider: string
|
|
18
|
+
): Promise<OAuthConfigSchema & { clientSecret?: string }> {
|
|
19
|
+
return apiClient.request(`/auth/oauth/configs/${provider}`);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// Create new OAuth configuration
|
|
23
|
+
async createConfig(config: CreateOAuthConfigRequest): Promise<OAuthConfigSchema> {
|
|
24
|
+
return apiClient.request('/auth/oauth/configs', {
|
|
25
|
+
method: 'POST',
|
|
26
|
+
body: JSON.stringify(config),
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Update OAuth configuration
|
|
31
|
+
async updateConfig(
|
|
32
|
+
provider: string,
|
|
33
|
+
config: UpdateOAuthConfigRequest
|
|
34
|
+
): Promise<OAuthConfigSchema> {
|
|
35
|
+
return apiClient.request(`/auth/oauth/configs/${provider}`, {
|
|
36
|
+
method: 'PUT',
|
|
37
|
+
body: JSON.stringify(config),
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Delete OAuth configuration
|
|
42
|
+
async deleteConfig(provider: string): Promise<{ success: boolean; message: string }> {
|
|
43
|
+
return apiClient.request(`/auth/oauth/configs/${provider}`, {
|
|
44
|
+
method: 'DELETE',
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export const oauthConfigService = new OAuthConfigService();
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { useNavigate, useLocation } from 'react-router-dom';
|
|
2
|
+
import { useMetadata } from '@/features/metadata/hooks/useMetadata';
|
|
3
|
+
import { Skeleton } from '@/components/radix/Skeleton';
|
|
4
|
+
import { Card, CardContent } from '@/components/radix/Card';
|
|
5
|
+
import { Users, Database, HardDrive, ArrowLeftRight, Link2 } from 'lucide-react';
|
|
6
|
+
import { useUsers } from '@/features/auth';
|
|
7
|
+
|
|
8
|
+
export default function DashboardPage() {
|
|
9
|
+
const navigate = useNavigate();
|
|
10
|
+
const location = useLocation();
|
|
11
|
+
const { metadata, auth, tables, storage, isLoading } = useMetadata();
|
|
12
|
+
const { totalUsers } = useUsers();
|
|
13
|
+
|
|
14
|
+
const handleNavigateTo = (to: string, state?: { initialTab?: string }) => {
|
|
15
|
+
const basePath = location.pathname.includes('/cloud')
|
|
16
|
+
? location.pathname.replace('/dashboard', '')
|
|
17
|
+
: location.pathname;
|
|
18
|
+
void navigate(`${basePath}/${to}`, { state });
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
const handleConnectInsForge = () => {
|
|
22
|
+
if (window.parent !== window) {
|
|
23
|
+
// Send message to parent window to open onboarding overlay
|
|
24
|
+
window.parent.postMessage(
|
|
25
|
+
{
|
|
26
|
+
type: 'SHOW_CONNECT_OVERLAY',
|
|
27
|
+
},
|
|
28
|
+
'*'
|
|
29
|
+
);
|
|
30
|
+
} else {
|
|
31
|
+
void handleNavigateTo('onboard');
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
return (
|
|
36
|
+
<main className="h-full bg-white dark:bg-neutral-800">
|
|
37
|
+
<div className="flex justify-center py-6 px-0">
|
|
38
|
+
<div className="flex flex-col gap-6 w-full max-w-[1080px] px-6">
|
|
39
|
+
{/* Dashboard Header */}
|
|
40
|
+
<div className="flex items-center justify-between w-full">
|
|
41
|
+
<h1 className="text-xl font-semibold text-gray-900 dark:text-white tracking-[-0.1px]">
|
|
42
|
+
Dashboard
|
|
43
|
+
</h1>
|
|
44
|
+
</div>
|
|
45
|
+
|
|
46
|
+
{/* Connect InsForge Card */}
|
|
47
|
+
<Card className="w-full bg-white dark:bg-[#333333] rounded-lg border border-gray-200 dark:border-neutral-700 shadow-[0px_1px_3px_0px_rgba(0,0,0,0.1)]">
|
|
48
|
+
<CardContent className="px-8 py-6">
|
|
49
|
+
<div className="flex items-center justify-between">
|
|
50
|
+
<div className="flex flex-col gap-2">
|
|
51
|
+
<div className="flex items-center gap-2">
|
|
52
|
+
<Link2 className="w-5 h-5 text-black dark:text-white" />
|
|
53
|
+
<h3 className="text-lg font-semibold text-gray-900 dark:text-white">
|
|
54
|
+
Connect InsForge
|
|
55
|
+
</h3>
|
|
56
|
+
</div>
|
|
57
|
+
<p className="text-sm text-gray-600 dark:text-neutral-400">
|
|
58
|
+
With InsForge connected, your agent takes care of the backend for you
|
|
59
|
+
</p>
|
|
60
|
+
</div>
|
|
61
|
+
<button
|
|
62
|
+
type="button"
|
|
63
|
+
className="flex items-center gap-2 px-4 py-2 bg-emerald-300 hover:bg-emerald-400 text-black rounded font-medium text-sm transition-colors cursor-pointer"
|
|
64
|
+
onClick={handleConnectInsForge}
|
|
65
|
+
>
|
|
66
|
+
<ArrowLeftRight className="w-5 h-5" />
|
|
67
|
+
Connect
|
|
68
|
+
</button>
|
|
69
|
+
</div>
|
|
70
|
+
</CardContent>
|
|
71
|
+
</Card>
|
|
72
|
+
|
|
73
|
+
{/* Stats Cards */}
|
|
74
|
+
<div className="flex gap-6 w-full">
|
|
75
|
+
{/* AUTH Card */}
|
|
76
|
+
<Card className="flex-1 bg-white dark:bg-[#333333] rounded-lg border border-gray-200 dark:border-neutral-700 shadow-[0px_1px_3px_0px_rgba(0,0,0,0.1)] h-[280px]">
|
|
77
|
+
<CardContent className="p-8 h-full flex flex-col justify-between">
|
|
78
|
+
<div className="flex flex-col gap-2">
|
|
79
|
+
<div className="flex items-center gap-2 h-7">
|
|
80
|
+
<Users className="w-5 h-5 text-gray-700 dark:text-white" />
|
|
81
|
+
<span className="text-base font-normal text-gray-900 dark:text-white">
|
|
82
|
+
AUTH
|
|
83
|
+
</span>
|
|
84
|
+
</div>
|
|
85
|
+
</div>
|
|
86
|
+
<div className="flex flex-col gap-4">
|
|
87
|
+
<div className="flex items-baseline gap-2">
|
|
88
|
+
{isLoading ? (
|
|
89
|
+
<Skeleton className="h-8 w-16 bg-gray-200 dark:bg-neutral-700" />
|
|
90
|
+
) : (
|
|
91
|
+
<>
|
|
92
|
+
<span className="text-2xl font-normal text-gray-900 dark:text-white tracking-[-0.144px]">
|
|
93
|
+
{(totalUsers || 0).toLocaleString()}
|
|
94
|
+
</span>
|
|
95
|
+
<span className="text-sm font-normal text-gray-500 dark:text-neutral-400">
|
|
96
|
+
{totalUsers === 1 ? 'user' : 'users'}
|
|
97
|
+
</span>
|
|
98
|
+
</>
|
|
99
|
+
)}
|
|
100
|
+
</div>
|
|
101
|
+
{isLoading ? (
|
|
102
|
+
<Skeleton className="h-5 w-36 bg-gray-200 dark:bg-neutral-700" />
|
|
103
|
+
) : (
|
|
104
|
+
<p className="text-base text-gray-500 dark:text-neutral-400">
|
|
105
|
+
{(() => {
|
|
106
|
+
const authCount = auth?.oauths.length || 0;
|
|
107
|
+
return `${authCount} OAuth ${authCount === 1 ? 'provider' : 'providers'} enabled`;
|
|
108
|
+
})()}
|
|
109
|
+
</p>
|
|
110
|
+
)}
|
|
111
|
+
</div>
|
|
112
|
+
</CardContent>
|
|
113
|
+
</Card>
|
|
114
|
+
|
|
115
|
+
{/* Database Card */}
|
|
116
|
+
<Card className="flex-1 bg-white dark:bg-[#333333] rounded-lg border border-gray-200 dark:border-neutral-700 shadow-[0px_1px_3px_0px_rgba(0,0,0,0.1)] h-[280px]">
|
|
117
|
+
<CardContent className="p-8 h-full flex flex-col justify-between">
|
|
118
|
+
<div className="flex flex-col gap-2">
|
|
119
|
+
<div className="flex items-center gap-2 h-7">
|
|
120
|
+
<Database className="w-5 h-5 text-gray-700 dark:text-white" />
|
|
121
|
+
<span className="text-base font-normal text-gray-900 dark:text-white">
|
|
122
|
+
Database
|
|
123
|
+
</span>
|
|
124
|
+
</div>
|
|
125
|
+
</div>
|
|
126
|
+
<div className="flex flex-col gap-4">
|
|
127
|
+
<div className="flex items-baseline gap-2">
|
|
128
|
+
{isLoading ? (
|
|
129
|
+
<Skeleton className="h-8 w-14 bg-gray-200 dark:bg-neutral-700" />
|
|
130
|
+
) : (
|
|
131
|
+
<>
|
|
132
|
+
<span className="text-2xl font-normal text-gray-900 dark:text-white tracking-[-0.144px]">
|
|
133
|
+
{(metadata?.database?.totalSize || 0).toFixed(2)}
|
|
134
|
+
</span>
|
|
135
|
+
<span className="text-sm font-normal text-gray-500 dark:text-neutral-400">
|
|
136
|
+
GB
|
|
137
|
+
</span>
|
|
138
|
+
</>
|
|
139
|
+
)}
|
|
140
|
+
</div>
|
|
141
|
+
{isLoading ? (
|
|
142
|
+
<Skeleton className="h-5 w-16 bg-gray-200 dark:bg-neutral-700" />
|
|
143
|
+
) : (
|
|
144
|
+
<p className="text-base text-gray-500 dark:text-neutral-400">
|
|
145
|
+
{tables.length || 0} {tables.length === 1 ? 'Table' : 'Tables'}
|
|
146
|
+
</p>
|
|
147
|
+
)}
|
|
148
|
+
</div>
|
|
149
|
+
</CardContent>
|
|
150
|
+
</Card>
|
|
151
|
+
|
|
152
|
+
{/* Storage Card */}
|
|
153
|
+
<Card className="flex-1 bg-white dark:bg-[#333333] rounded-lg border border-gray-200 dark:border-neutral-700 shadow-[0px_1px_3px_0px_rgba(0,0,0,0.1)] h-[280px]">
|
|
154
|
+
<CardContent className="p-8 h-full flex flex-col justify-between">
|
|
155
|
+
<div className="flex flex-col gap-2">
|
|
156
|
+
<div className="flex items-center gap-2 h-7">
|
|
157
|
+
<HardDrive className="w-5 h-5 text-gray-700 dark:text-white" />
|
|
158
|
+
<span className="text-base font-normal text-gray-900 dark:text-white">
|
|
159
|
+
Storage
|
|
160
|
+
</span>
|
|
161
|
+
</div>
|
|
162
|
+
</div>
|
|
163
|
+
<div className="flex flex-col gap-4">
|
|
164
|
+
<div className="flex items-baseline gap-2">
|
|
165
|
+
{isLoading ? (
|
|
166
|
+
<Skeleton className="h-8 w-14 bg-gray-200 dark:bg-neutral-700" />
|
|
167
|
+
) : (
|
|
168
|
+
<>
|
|
169
|
+
<span className="text-2xl font-normal text-gray-900 dark:text-white tracking-[-0.144px]">
|
|
170
|
+
{(storage?.totalSize || 0).toFixed(2)}
|
|
171
|
+
</span>
|
|
172
|
+
<span className="text-sm font-normal text-gray-500 dark:text-neutral-400">
|
|
173
|
+
GB
|
|
174
|
+
</span>
|
|
175
|
+
</>
|
|
176
|
+
)}
|
|
177
|
+
</div>
|
|
178
|
+
{isLoading ? (
|
|
179
|
+
<Skeleton className="h-5 w-20 bg-gray-200 dark:bg-neutral-700" />
|
|
180
|
+
) : (
|
|
181
|
+
<p className="text-base text-gray-500 dark:text-neutral-400">
|
|
182
|
+
{storage?.buckets?.length || 0}{' '}
|
|
183
|
+
{storage?.buckets?.length === 1 ? 'Bucket' : 'Buckets'}
|
|
184
|
+
</p>
|
|
185
|
+
)}
|
|
186
|
+
</div>
|
|
187
|
+
</CardContent>
|
|
188
|
+
</Card>
|
|
189
|
+
</div>
|
|
190
|
+
</div>
|
|
191
|
+
</div>
|
|
192
|
+
</main>
|
|
193
|
+
);
|
|
194
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { memo } from 'react';
|
|
2
|
+
import { Controller, Control } from 'react-hook-form';
|
|
3
|
+
import { Select, SelectContent, SelectItem, SelectTrigger } from '@/components/radix/Select';
|
|
4
|
+
import { columnTypeIcons } from '../constants';
|
|
5
|
+
import { TableFormSchema } from '../schema';
|
|
6
|
+
import { columnTypeSchema } from '@insforge/shared-schemas';
|
|
7
|
+
|
|
8
|
+
const COLUMN_TYPES_ARRAY = columnTypeSchema.options;
|
|
9
|
+
|
|
10
|
+
// Pre-render select options to avoid re-creating them on every render
|
|
11
|
+
const SELECT_OPTIONS = COLUMN_TYPES_ARRAY.map((type) => {
|
|
12
|
+
const TypeIcon = columnTypeIcons[type];
|
|
13
|
+
return (
|
|
14
|
+
<SelectItem key={type} value={type}>
|
|
15
|
+
<div className="flex items-center gap-2">
|
|
16
|
+
<TypeIcon className="h-4 w-4" />
|
|
17
|
+
<span>{type}</span>
|
|
18
|
+
</div>
|
|
19
|
+
</SelectItem>
|
|
20
|
+
);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
interface ColumnTypeSelectProps {
|
|
24
|
+
control: Control<TableFormSchema>;
|
|
25
|
+
name: `columns.${number}.type`;
|
|
26
|
+
disabled?: boolean;
|
|
27
|
+
className: string;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export const ColumnTypeSelect = memo(function TableFormSelect({
|
|
31
|
+
control,
|
|
32
|
+
name,
|
|
33
|
+
disabled,
|
|
34
|
+
className,
|
|
35
|
+
}: ColumnTypeSelectProps) {
|
|
36
|
+
return (
|
|
37
|
+
<Controller
|
|
38
|
+
control={control}
|
|
39
|
+
name={name}
|
|
40
|
+
render={({ field }) => {
|
|
41
|
+
const Icon = columnTypeIcons[field.value as keyof typeof columnTypeIcons];
|
|
42
|
+
return (
|
|
43
|
+
<Select
|
|
44
|
+
disabled={disabled}
|
|
45
|
+
value={field.value}
|
|
46
|
+
onValueChange={(value) => {
|
|
47
|
+
if (value) {
|
|
48
|
+
field.onChange(value);
|
|
49
|
+
}
|
|
50
|
+
}}
|
|
51
|
+
>
|
|
52
|
+
<SelectTrigger className={className}>
|
|
53
|
+
<div className="flex items-center gap-2">
|
|
54
|
+
{Icon && <Icon className="h-4 w-4 text-zinc-500 dark:text-neutral-400" />}
|
|
55
|
+
<span className="text-black dark:text-white">{field.value}</span>
|
|
56
|
+
</div>
|
|
57
|
+
</SelectTrigger>
|
|
58
|
+
<SelectContent>{SELECT_OPTIONS}</SelectContent>
|
|
59
|
+
</Select>
|
|
60
|
+
);
|
|
61
|
+
}}
|
|
62
|
+
/>
|
|
63
|
+
);
|
|
64
|
+
});
|