insforge 0.3.3 → 1.2.10
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/.claude-plugin/marketplace.json +20 -0
- package/.cursor/rules/cursor-rules.mdc +94 -0
- package/.dockerignore +3 -0
- package/.env.example +33 -4
- package/.github/ISSUE_TEMPLATE/bug_report.yml +13 -60
- package/.github/ISSUE_TEMPLATE/config.yml +2 -2
- package/.github/ISSUE_TEMPLATE/feature_request.yml +10 -63
- package/.github/PULL_REQUEST_TEMPLATE.md +7 -0
- package/.github/workflows/build-image.yml +2 -1
- package/.github/workflows/e2e.yml +63 -0
- package/CHANGELOG.md +41 -0
- package/CLAUDE_PLUGIN.md +104 -0
- package/CODE_OF_CONDUCT.md +128 -0
- package/CONTRIBUTING.md +1 -1
- package/Dockerfile +4 -1
- package/README.md +66 -18
- package/assets/mcpInstallv2.png +0 -0
- package/assets/sampleResponse.png +0 -0
- package/auth/index.html +13 -0
- package/auth/package.json +28 -0
- package/auth/public/favicon.ico +0 -0
- package/auth/src/App.tsx +33 -0
- package/auth/src/components/ErrorCard.tsx +37 -0
- package/auth/src/components/Layout.tsx +13 -0
- package/auth/src/index.css +19 -0
- package/auth/src/lib/broadcastService.ts +115 -0
- package/auth/src/lib/utils.ts +11 -0
- package/auth/src/main.tsx +22 -0
- package/auth/src/pages/ForgotPasswordPage.tsx +11 -0
- package/auth/src/pages/ResetPasswordPage.tsx +11 -0
- package/auth/src/pages/SignInPage.tsx +57 -0
- package/auth/src/pages/SignUpPage.tsx +57 -0
- package/auth/src/pages/VerifyEmailPage.tsx +20 -0
- package/auth/src/vite-env.d.ts +10 -0
- package/auth/tsconfig.json +32 -0
- package/auth/tsconfig.node.json +11 -0
- package/auth/vite.config.ts +25 -0
- package/backend/package.json +9 -9
- package/backend/src/api/{middleware → middlewares}/auth.ts +8 -9
- package/backend/src/api/middlewares/rate-limiters.ts +127 -0
- package/backend/src/api/routes/{ai.ts → ai/index.routes.ts} +20 -24
- package/backend/src/api/routes/auth/index.routes.ts +570 -0
- package/backend/src/api/routes/auth/oauth.routes.ts +448 -0
- package/backend/src/api/routes/{database.advance.ts → database/advance.routes.ts} +107 -65
- package/backend/src/api/routes/database/index.routes.ts +13 -0
- package/backend/src/api/routes/{database.records.ts → database/records.routes.ts} +22 -8
- package/backend/src/api/routes/{database.tables.ts → database/tables.routes.ts} +20 -23
- package/backend/src/api/routes/docs/index.routes.ts +76 -0
- package/backend/src/api/routes/functions/index.routes.ts +188 -0
- package/backend/src/api/routes/{logs.ts → logs/index.routes.ts} +25 -30
- package/backend/src/api/routes/{metadata.ts → metadata/index.routes.ts} +21 -31
- package/backend/src/api/routes/{secrets.ts → secrets/index.routes.ts} +27 -22
- package/backend/src/api/routes/{storage.ts → storage/index.routes.ts} +34 -53
- package/backend/src/api/routes/usage/index.routes.ts +89 -0
- package/backend/src/infra/config/app.config.ts +51 -0
- package/backend/src/{core/database/manager.ts → infra/database/database.manager.ts} +76 -85
- package/backend/src/infra/database/migrations/013_create-auth-schema-functions.sql +44 -0
- package/backend/src/infra/database/migrations/014_add-updated-at-trigger-user-table.sql +8 -0
- package/backend/src/infra/database/migrations/015_create-auth-config-and-email-otp-tables.sql +60 -0
- package/backend/src/infra/database/migrations/016_update-auth-config-and-email-otp.sql +24 -0
- package/backend/src/{core/secrets/encryption.ts → infra/security/encryption.manager.ts} +3 -2
- package/backend/src/infra/security/token.manager.ts +125 -0
- package/backend/src/{core/socket/socket.ts → infra/socket/socket.manager.ts} +15 -15
- package/backend/src/providers/ai/openrouter.provider.ts +377 -0
- package/backend/src/providers/email/base.provider.ts +41 -0
- package/backend/src/providers/email/cloud.provider.ts +187 -0
- package/backend/src/{core/logs/providers → providers/logs}/base.provider.ts +11 -11
- package/backend/src/{core/logs/providers → providers/logs}/cloudwatch.provider.ts +61 -38
- package/backend/src/providers/logs/local.provider.ts +185 -0
- package/backend/src/providers/oauth/base.provider.ts +29 -0
- package/backend/src/providers/oauth/discord.provider.ts +195 -0
- package/backend/src/providers/oauth/facebook.provider.ts +194 -0
- package/backend/src/providers/oauth/github.provider.ts +208 -0
- package/backend/src/providers/oauth/google.provider.ts +249 -0
- package/backend/src/providers/oauth/index.ts +7 -0
- package/backend/src/providers/oauth/linkedin.provider.ts +240 -0
- package/backend/src/providers/oauth/microsoft.provider.ts +169 -0
- package/backend/src/providers/oauth/x.provider.ts +202 -0
- package/backend/src/providers/storage/base.provider.ts +29 -0
- package/backend/src/providers/storage/local.provider.ts +103 -0
- package/backend/src/providers/storage/s3.provider.ts +313 -0
- package/backend/src/server.ts +70 -74
- package/backend/src/{core/ai/config.ts → services/ai/ai-config.service.ts} +19 -24
- package/backend/src/services/ai/ai-model.service.ts +60 -0
- package/backend/src/{core/ai/usage.ts → services/ai/ai-usage.service.ts} +28 -35
- package/backend/src/{core/ai/chat.ts → services/ai/chat-completion.service.ts} +37 -24
- package/backend/src/services/ai/helpers.ts +64 -0
- package/backend/src/{core/ai/image.ts → services/ai/image-generation.service.ts} +17 -19
- package/backend/src/services/ai/index.ts +13 -0
- package/backend/src/services/auth/auth-config.service.ts +250 -0
- package/backend/src/services/auth/auth-otp.service.ts +424 -0
- package/backend/src/services/auth/auth.service.ts +1136 -0
- package/backend/src/services/auth/index.ts +4 -0
- package/backend/src/{core/auth/oauth.ts → services/auth/oauth-config.service.ts} +106 -52
- package/backend/src/{core/database/advance.ts → services/database/database-advance.service.ts} +97 -131
- package/backend/src/services/database/database-table.service.ts +811 -0
- package/backend/src/services/email/email.service.ts +75 -0
- package/backend/src/{core/functions/functions.ts → services/functions/function.service.ts} +95 -88
- package/backend/src/{core/logs/audit.ts → services/logs/audit.service.ts} +92 -75
- package/backend/src/services/logs/log.service.ts +73 -0
- package/backend/src/{core/secrets/secrets.ts → services/secrets/secret.service.ts} +48 -66
- package/backend/src/services/storage/storage.service.ts +617 -0
- package/backend/src/services/usage/usage.service.ts +149 -0
- package/backend/src/types/auth.ts +66 -2
- package/backend/src/types/email.ts +8 -0
- package/backend/src/types/error-constants.ts +4 -0
- package/backend/src/types/logs.ts +0 -29
- package/backend/src/{core/socket/types.ts → types/socket.ts} +5 -6
- package/backend/src/utils/environment.ts +9 -3
- package/backend/src/utils/logger.ts +20 -2
- package/backend/src/utils/seed.ts +150 -57
- package/backend/src/utils/sql-parser.ts +1 -1
- package/backend/src/utils/utils.ts +114 -0
- package/backend/src/utils/validations.ts +40 -4
- package/backend/tests/local/test-ai-config.sh +129 -0
- package/backend/tests/local/test-ai-usage.sh +80 -0
- package/backend/tests/local/test-auth-router.sh +1 -1
- package/backend/tests/local/test-e2e.sh +1 -1
- package/backend/tests/local/test-functions.sh +123 -0
- package/backend/tests/local/test-logs.sh +132 -0
- package/backend/tests/local/test-public-bucket.sh +3 -3
- package/backend/tests/local/test-secrets.sh +14 -12
- package/backend/tests/local/test-traditional-rest.sh +2 -2
- package/backend/tests/manual/test-rawsql-modes.sh +244 -0
- package/backend/tests/test-config.sh +37 -1
- package/backend/tests/unit/cloud-token.test.ts +48 -0
- package/backend/tests/unit/constant.test.ts +8 -0
- package/backend/tests/unit/email.test.ts +372 -0
- package/backend/tests/unit/environment.test.ts +59 -0
- package/backend/tests/unit/helpers.test.ts +63 -0
- package/backend/tests/unit/logger.test.ts +22 -0
- package/backend/tests/unit/rate-limit.test.ts +154 -0
- package/backend/tests/unit/response.test.ts +58 -0
- package/backend/tests/unit/sql-parser.test.ts +74 -0
- package/backend/tests/unit/uuid.test.ts +21 -0
- package/backend/tests/unit/validations.test.ts +80 -0
- package/backend/tsconfig.json +1 -1
- package/backend/vitest.config.ts +11 -0
- package/claude-plugin/.claude-plugin/plugin.json +24 -0
- package/claude-plugin/README.md +133 -0
- package/claude-plugin/skills/insforge-schema-patterns/SKILL.md +270 -0
- package/docker-compose.prod.yml +60 -4
- package/docker-compose.yml +65 -4
- package/docker-init/db/db-init.sql +6 -34
- package/docker-init/logs/vector.yml +236 -0
- package/docs/README.md +44 -0
- package/docs/changelog.mdx +67 -0
- package/docs/core-concepts/ai/architecture.mdx +373 -0
- package/docs/core-concepts/ai/sdk.mdx +213 -0
- package/docs/core-concepts/authentication/architecture.mdx +278 -0
- package/docs/core-concepts/authentication/sdk.mdx +414 -0
- package/docs/core-concepts/authentication/ui-components/customization.mdx +529 -0
- package/docs/core-concepts/authentication/ui-components/nextjs.mdx +221 -0
- package/docs/core-concepts/authentication/ui-components/react-router.mdx +184 -0
- package/docs/core-concepts/authentication/ui-components/react.mdx +129 -0
- package/docs/core-concepts/database/architecture.mdx +256 -0
- package/docs/core-concepts/database/sdk.mdx +382 -0
- package/docs/core-concepts/functions/architecture.mdx +105 -0
- package/docs/core-concepts/functions/sdk.mdx +184 -0
- package/docs/core-concepts/storage/architecture.mdx +243 -0
- package/docs/core-concepts/storage/sdk.mdx +253 -0
- package/docs/deployment/README.md +94 -0
- package/docs/deployment/deploy-to-aws-ec2.md +565 -0
- package/docs/deployment/deploy-to-azure-virtual-machines.md +313 -0
- package/docs/deployment/deploy-to-google-cloud-compute-engine.md +613 -0
- package/docs/deployment/deploy-to-render.md +441 -0
- package/docs/docs.json +210 -0
- package/docs/examples/framework-guides/nextjs.mdx +131 -0
- package/docs/examples/framework-guides/nuxt.mdx +165 -0
- package/docs/examples/framework-guides/react.mdx +165 -0
- package/docs/examples/framework-guides/svelte.mdx +153 -0
- package/docs/examples/framework-guides/vue.mdx +159 -0
- package/docs/examples/overview.mdx +67 -0
- package/docs/favicon.svg +19 -0
- package/docs/images/changelog/nov-2025/auth-components.webp +0 -0
- package/docs/images/changelog/nov-2025/database-metadata.webp +0 -0
- package/docs/images/changelog/nov-2025/quickstart-prompts.webp +0 -0
- package/docs/images/changelog/nov-2025/sql-editor.webp +0 -0
- package/docs/images/changelog/nov-2025/usage-page.webp +0 -0
- package/docs/images/changelog/october-2025/csv-upload.webp +0 -0
- package/docs/images/changelog/october-2025/logs-feature.webp +0 -0
- package/docs/images/changelog/october-2025/oauth-providers.webp +0 -0
- package/docs/images/checks-passed.png +0 -0
- package/docs/images/dashboard-connect-expanded.png +0 -0
- package/docs/images/dashboard-connect.png +0 -0
- package/docs/images/hero-dark.png +0 -0
- package/docs/images/hero-light.png +0 -0
- package/docs/images/icons/ai.svg +4 -0
- package/docs/images/icons/auth.svg +1 -0
- package/docs/images/icons/database.svg +1 -0
- package/docs/images/icons/function.svg +1 -0
- package/docs/images/icons/storage.svg +1 -0
- package/docs/images/logos/nextjs.svg +4 -0
- package/docs/images/logos/nuxt.svg +4 -0
- package/docs/images/logos/react.svg +5 -0
- package/docs/images/logos/svelte.svg +4 -0
- package/docs/images/logos/vue.svg +5 -0
- package/docs/images/mcp-install.png +0 -0
- package/docs/images/onboarding-mcp.png +0 -0
- package/docs/insforge-instructions-sdk.md +55 -374
- package/docs/introduction.mdx +45 -0
- package/docs/logo/dark.svg +22 -0
- package/docs/logo/light.svg +20 -0
- package/docs/partnership.mdx +647 -0
- package/docs/quickstart.mdx +83 -0
- package/docs/showcase/2048-arena.png +0 -0
- package/docs/showcase/framegen-cloud.png +0 -0
- package/docs/showcase/line-connect-race.png +0 -0
- package/docs/showcase/moment-vibe.png +0 -0
- package/docs/showcase/national-flags.png +0 -0
- package/docs/showcase/pokemon-vibe.png +0 -0
- package/docs/showcase/pure-browse-buy.png +0 -0
- package/docs/showcase.mdx +52 -0
- package/docs/snippets/sdk-installation.mdx +22 -0
- package/docs/snippets/service-icons.mdx +27 -0
- package/eslint.config.js +10 -3
- package/frontend/package.json +10 -4
- package/frontend/src/App.tsx +13 -82
- package/frontend/src/assets/icons/connected.svg +3 -0
- package/frontend/src/assets/icons/loader.svg +9 -0
- package/frontend/src/assets/logos/apple.svg +4 -0
- package/frontend/src/assets/logos/discord.svg +1 -1
- package/frontend/src/assets/logos/facebook.svg +3 -0
- package/frontend/src/assets/logos/instagram.svg +2 -0
- package/frontend/src/assets/logos/linkedin.svg +3 -0
- package/frontend/src/assets/logos/microsoft.svg +1 -0
- package/frontend/src/assets/logos/spotify.svg +17 -0
- package/frontend/src/assets/logos/tiktok.svg +6 -0
- package/frontend/src/assets/logos/x.svg +3 -0
- package/frontend/src/components/Checkbox.tsx +27 -29
- package/frontend/src/components/CodeBlock.tsx +55 -2
- package/frontend/src/components/CodeEditor.tsx +92 -0
- package/frontend/src/components/ConfirmDialog.tsx +1 -1
- package/frontend/src/components/ConnectCTA.tsx +38 -0
- package/frontend/src/components/CopyButton.tsx +52 -15
- package/frontend/src/components/ErrorState.tsx +1 -2
- package/frontend/src/components/FeatureSidebar.tsx +6 -6
- package/frontend/src/components/FeatureSidebarItem.tsx +2 -2
- package/frontend/src/components/JsonHighlight.tsx +21 -9
- package/frontend/src/components/ProjectInfoModal.tsx +128 -0
- package/frontend/src/components/PromptDialog.tsx +1 -4
- package/frontend/src/components/SearchInput.tsx +1 -2
- package/frontend/src/components/Stepper.tsx +53 -0
- package/frontend/src/components/ThemeToggle.tsx +3 -3
- package/frontend/src/components/datagrid/DataGrid.tsx +25 -32
- package/frontend/src/components/datagrid/cell-editors/DateCellEditor.tsx +1 -2
- package/frontend/src/components/datagrid/cell-editors/JsonCellEditor.tsx +2 -4
- package/frontend/src/components/datagrid/index.ts +23 -0
- package/frontend/src/components/index.ts +23 -30
- package/frontend/src/components/layout/AppHeader.tsx +133 -92
- package/frontend/src/components/layout/AppSidebar.tsx +80 -170
- package/frontend/src/components/layout/Layout.tsx +12 -23
- package/frontend/src/components/layout/PrimaryMenu.tsx +187 -0
- package/frontend/src/components/layout/SecondaryMenu.tsx +70 -0
- package/frontend/src/components/layout/index.ts +5 -0
- package/frontend/src/components/radix/Tooltip.tsx +24 -13
- package/frontend/src/components/radix/index.ts +22 -0
- package/frontend/src/features/ai/components/AIConfigCard.tsx +129 -83
- package/frontend/src/features/ai/components/AIEmptyState.tsx +12 -7
- package/frontend/src/features/ai/components/ModalityFilterSidebar.tsx +101 -0
- package/frontend/src/features/ai/components/ModelSelectionDialog.tsx +135 -0
- package/frontend/src/features/ai/components/ModelSelectionGrid.tsx +51 -0
- package/frontend/src/features/ai/components/SystemPromptDialog.tsx +118 -0
- package/frontend/src/features/ai/components/index.ts +6 -0
- package/frontend/src/features/ai/helpers.ts +57 -71
- package/frontend/src/features/ai/hooks/useAIConfigs.ts +39 -113
- package/frontend/src/features/ai/hooks/useAIUsage.ts +0 -2
- package/frontend/src/features/ai/page/AIPage.tsx +67 -79
- package/frontend/src/features/ai/services/ai.service.ts +5 -5
- package/frontend/src/features/auth/components/AuthPreview.tsx +96 -0
- package/frontend/src/features/auth/components/OAuthConfigDialog.tsx +53 -30
- package/frontend/src/features/auth/components/UserFormDialog.tsx +13 -6
- package/frontend/src/features/auth/components/UsersDataGrid.tsx +44 -14
- package/frontend/src/features/auth/components/index.ts +5 -0
- package/frontend/src/features/auth/helpers.tsx +200 -0
- package/frontend/src/features/auth/hooks/useAnonToken.ts +30 -0
- package/frontend/src/features/auth/hooks/useAuthConfig.ts +48 -0
- package/frontend/src/features/auth/hooks/useOAuthConfig.ts +14 -10
- package/frontend/src/features/auth/hooks/useUsers.ts +43 -5
- package/frontend/src/features/auth/index.ts +3 -2
- package/frontend/src/features/auth/page/AuthMethodsPage.tsx +275 -0
- package/frontend/src/features/auth/page/ConfigurationPage.tsx +395 -0
- package/frontend/src/features/auth/page/UsersPage.tsx +285 -0
- package/frontend/src/features/auth/services/anonToken.service.ts +11 -0
- package/frontend/src/features/auth/services/config.service.ts +19 -0
- package/frontend/src/features/auth/services/{oauth.service.ts → oauth-config.service.ts} +4 -4
- package/frontend/src/features/auth/services/{auth.service.ts → user.service.ts} +7 -53
- package/frontend/src/features/dashboard/components/ConnectionSuccessBanner.tsx +35 -0
- package/frontend/src/features/dashboard/components/PromptCard.tsx +21 -0
- package/frontend/src/features/dashboard/components/PromptDialog.tsx +103 -0
- package/frontend/src/features/dashboard/components/StatsCard.tsx +50 -0
- package/frontend/src/features/dashboard/components/index.ts +4 -0
- package/frontend/src/features/dashboard/page/DashboardPage.tsx +187 -169
- package/frontend/src/features/dashboard/prompts/ai-chatbot.ts +13 -0
- package/frontend/src/features/dashboard/prompts/crm-system.ts +13 -0
- package/frontend/src/features/dashboard/prompts/ecommerce-platform.ts +12 -0
- package/frontend/src/features/dashboard/prompts/index.ts +31 -0
- package/frontend/src/features/dashboard/prompts/instagram-clone.ts +11 -0
- package/frontend/src/features/dashboard/prompts/notion-clone.ts +14 -0
- package/frontend/src/features/dashboard/prompts/reddit-clone.ts +12 -0
- package/frontend/src/features/database/components/DatabaseDataGrid.tsx +48 -17
- package/frontend/src/features/database/components/ForeignKeyCell.tsx +15 -34
- package/frontend/src/features/database/components/ForeignKeyPopover.tsx +19 -20
- package/frontend/src/features/database/components/LinkRecordModal.tsx +120 -125
- package/frontend/src/features/database/components/RecordFormDialog.tsx +22 -33
- package/frontend/src/features/database/components/RecordFormField.tsx +45 -47
- package/frontend/src/features/database/components/TableEmptyState.tsx +6 -5
- package/frontend/src/features/database/components/TableForm.tsx +28 -15
- package/frontend/src/features/database/components/TableFormColumn.tsx +2 -3
- package/frontend/src/features/database/components/TableSidebar.tsx +1 -1
- package/frontend/src/features/database/components/TablesEmptyState.tsx +48 -0
- package/frontend/src/features/database/components/TemplateCard.tsx +37 -0
- package/frontend/src/features/database/components/TemplatePreview.tsx +92 -0
- package/frontend/src/features/database/components/index.ts +19 -0
- package/frontend/src/features/database/constants.ts +28 -2
- package/frontend/src/features/database/contexts/SQLEditorContext.tsx +188 -0
- package/frontend/src/features/database/helpers.ts +2 -2
- package/frontend/src/features/database/hooks/useCSVImport.ts +29 -0
- package/frontend/src/features/database/hooks/useFullMetadata.ts +18 -0
- package/frontend/src/features/database/hooks/useRawSQL.ts +55 -0
- package/frontend/src/features/database/hooks/useRecords.ts +139 -0
- package/frontend/src/features/database/hooks/useTables.ts +131 -0
- package/frontend/src/features/database/index.ts +6 -1
- package/frontend/src/features/database/page/FunctionsPage.tsx +211 -0
- package/frontend/src/features/database/page/IndexesPage.tsx +240 -0
- package/frontend/src/features/database/page/PoliciesPage.tsx +248 -0
- package/frontend/src/features/database/page/SQLEditorPage.tsx +382 -0
- package/frontend/src/features/database/page/{DatabasePage.tsx → TablesPage.tsx} +186 -185
- package/frontend/src/features/database/page/TemplatesPage.tsx +39 -0
- package/frontend/src/features/database/page/TriggersPage.tsx +242 -0
- package/frontend/src/features/database/services/advance.service.ts +66 -0
- package/frontend/src/features/database/services/{database.service.ts → record.service.ts} +67 -64
- package/frontend/src/features/database/services/table.service.ts +64 -0
- package/frontend/src/features/database/templates/ai-chatbot.ts +402 -0
- package/frontend/src/features/database/templates/crm-system.ts +528 -0
- package/frontend/src/features/database/templates/ecommerce-platform.ts +553 -0
- package/frontend/src/features/database/templates/index.ts +34 -0
- package/frontend/src/features/database/templates/instagram-clone.ts +222 -0
- package/frontend/src/features/database/templates/notion-clone.ts +483 -0
- package/frontend/src/features/database/templates/reddit-clone.ts +526 -0
- package/frontend/src/features/functions/components/FunctionRow.tsx +2 -1
- package/frontend/src/features/functions/components/FunctionsSidebar.tsx +1 -1
- package/frontend/src/features/functions/components/SecretRow.tsx +1 -1
- package/frontend/src/features/functions/components/index.ts +5 -0
- package/frontend/src/features/functions/hooks/useFunctions.ts +4 -4
- package/frontend/src/features/{secrets → functions}/hooks/useSecrets.ts +5 -5
- package/frontend/src/features/functions/page/FunctionsPage.tsx +160 -17
- package/frontend/src/features/functions/{components/SecretsContent.tsx → page/SecretsPage.tsx} +8 -12
- package/frontend/src/features/functions/services/{functions.service.ts → function.service.ts} +2 -2
- package/frontend/src/features/{secrets/services/secrets.service.ts → functions/services/secret.service.ts} +2 -2
- package/frontend/src/features/login/hooks/usePartnerOrigin.ts +27 -0
- package/frontend/src/features/login/page/CloudLoginPage.tsx +79 -54
- package/frontend/src/features/login/page/LoginPage.tsx +16 -23
- package/frontend/src/features/login/services/partnership.service.ts +65 -0
- package/frontend/src/features/logs/components/LogsDataGrid.tsx +89 -0
- package/frontend/src/features/logs/components/SeverityBadge.tsx +18 -0
- package/frontend/src/features/logs/components/index.ts +2 -0
- package/frontend/src/features/logs/helpers.ts +24 -0
- package/frontend/src/features/logs/hooks/useAuditLogs.ts +4 -4
- package/frontend/src/features/logs/hooks/useLogSources.ts +137 -0
- package/frontend/src/features/logs/hooks/useLogs.ts +163 -0
- package/frontend/src/features/logs/hooks/useMcpUsage.ts +181 -0
- package/frontend/src/features/logs/index.ts +8 -2
- package/frontend/src/features/logs/page/AuditsPage.tsx +91 -38
- package/frontend/src/features/logs/page/LogsPage.tsx +152 -0
- package/frontend/src/features/logs/page/MCPLogsPage.tsx +84 -0
- package/frontend/src/features/logs/services/audit.service.ts +63 -0
- package/frontend/src/features/logs/services/log.service.ts +15 -110
- package/frontend/src/features/logs/services/usage.service.ts +31 -0
- package/frontend/src/features/onboard/components/McpConnectionStatus.tsx +68 -0
- package/frontend/src/features/onboard/components/OnboardingModal.tsx +267 -0
- package/frontend/src/features/onboard/components/VideoDemoModal.tsx +38 -0
- package/frontend/src/features/onboard/components/index.ts +4 -0
- package/frontend/src/features/onboard/components/mcp/CursorDeeplinkGenerator.tsx +2 -2
- package/frontend/src/features/onboard/components/mcp/{mcp-helper.tsx → helpers.tsx} +8 -8
- package/frontend/src/features/onboard/components/mcp/index.ts +2 -3
- package/frontend/src/features/onboard/index.ts +13 -3
- package/frontend/src/features/storage/components/BucketEmptyState.tsx +9 -6
- package/frontend/src/features/storage/components/BucketFormDialog.tsx +25 -41
- package/frontend/src/features/storage/components/FilePreviewDialog.tsx +20 -8
- package/frontend/src/features/storage/components/StorageDataGrid.tsx +4 -3
- package/frontend/src/features/storage/components/StorageManager.tsx +23 -34
- package/frontend/src/features/storage/components/index.ts +12 -0
- package/frontend/src/features/storage/hooks/useStorage.ts +208 -0
- package/frontend/src/features/storage/page/StoragePage.tsx +41 -115
- package/frontend/src/features/storage/services/storage.service.ts +22 -1
- package/frontend/src/features/visualizer/components/AuthNode.tsx +72 -56
- package/frontend/src/features/visualizer/components/BucketNode.tsx +4 -4
- package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +108 -80
- package/frontend/src/features/visualizer/components/TableNode.tsx +34 -41
- package/frontend/src/features/visualizer/components/VisualizerSkeleton.tsx +12 -4
- package/frontend/src/features/visualizer/page/VisualizerPage.tsx +33 -29
- package/frontend/src/index.css +1 -0
- package/frontend/src/lib/analytics/posthog.tsx +27 -0
- package/frontend/src/lib/contexts/AuthContext.tsx +38 -31
- package/frontend/src/lib/contexts/SocketContext.tsx +5 -6
- package/frontend/src/{features/metadata → lib}/hooks/useMetadata.ts +1 -1
- package/frontend/src/lib/hooks/useToast.tsx +6 -2
- package/frontend/src/lib/routing/AppRoutes.tsx +84 -0
- package/frontend/src/lib/routing/RequireAuth.tsx +27 -0
- package/frontend/src/lib/utils/cloudMessaging.ts +20 -0
- package/frontend/src/lib/utils/menuItems.ts +183 -0
- package/frontend/src/lib/utils/{validation-schemas.ts → schemaValidations.ts} +10 -5
- package/frontend/src/lib/utils/utils.ts +19 -1
- package/frontend/src/vite-env.d.ts +1 -0
- package/frontend/vite.config.ts +5 -3
- package/functions/server.ts +28 -3
- package/functions/worker-template.js +15 -4
- package/i18n/README.ar.md +130 -0
- package/i18n/README.de.md +130 -0
- package/i18n/README.es.md +154 -0
- package/i18n/README.fr.md +134 -0
- package/i18n/README.hi.md +129 -0
- package/i18n/README.ja.md +174 -0
- package/i18n/README.ko.md +137 -0
- package/i18n/README.pt-BR.md +131 -0
- package/i18n/README.ru.md +129 -0
- package/i18n/README.zh-CN.md +133 -0
- package/openapi/ai.yaml +31 -4
- package/openapi/auth.yaml +827 -146
- package/package.json +16 -7
- package/shared-schemas/package.json +1 -1
- package/shared-schemas/src/ai-api.schema.ts +34 -58
- package/shared-schemas/src/ai.schema.ts +5 -0
- package/shared-schemas/src/auth-api.schema.ts +154 -8
- package/shared-schemas/src/auth.schema.ts +42 -6
- package/shared-schemas/src/cloud-events.schema.ts +57 -0
- package/shared-schemas/src/database-api.schema.ts +3 -3
- package/shared-schemas/src/database.schema.ts +1 -1
- package/shared-schemas/src/index.ts +1 -0
- package/shared-schemas/src/logs-api.schema.ts +7 -1
- package/shared-schemas/src/logs.schema.ts +26 -0
- package/shared-schemas/src/metadata.schema.ts +9 -4
- package/test-gemini.sh +35 -0
- package/test-usage-admin.sh +57 -0
- package/test-usage.sh +50 -0
- package/zeabur/README.md +13 -0
- package/zeabur/template.yml +1032 -0
- package/.github/workflows/deploy-aws.yml +0 -130
- package/backend/src/api/routes/agent.ts +0 -29
- package/backend/src/api/routes/auth.oauth.ts +0 -482
- package/backend/src/api/routes/auth.ts +0 -386
- package/backend/src/api/routes/docs.ts +0 -66
- package/backend/src/api/routes/functions.ts +0 -183
- package/backend/src/api/routes/openapi.ts +0 -82
- package/backend/src/api/routes/usage.ts +0 -96
- package/backend/src/core/ai/client.ts +0 -242
- package/backend/src/core/ai/model.ts +0 -117
- package/backend/src/core/auth/auth.ts +0 -780
- package/backend/src/core/database/table.ts +0 -772
- package/backend/src/core/documentation/agent.ts +0 -689
- package/backend/src/core/documentation/openapi.ts +0 -856
- package/backend/src/core/logs/analytics.ts +0 -76
- package/backend/src/core/logs/providers/localdb.provider.ts +0 -246
- package/backend/src/core/storage/storage.ts +0 -923
- package/backend/src/utils/cloud-token.ts +0 -39
- package/backend/src/utils/helpers.ts +0 -49
- package/backend/src/utils/uuid.ts +0 -9
- package/backend/tests/manual/test-better-auth.sh +0 -303
- package/docker-init/db/logs.sql +0 -9
- package/frontend/README.md +0 -112
- package/frontend/src/components/datagrid/index.tsx +0 -20
- package/frontend/src/components/layout/CloudLayout.tsx +0 -95
- package/frontend/src/features/ai/components/AIConfigDialog.tsx +0 -76
- package/frontend/src/features/ai/components/AIConfigForm.tsx +0 -222
- package/frontend/src/features/ai/components/fields/ModalityField.tsx +0 -87
- package/frontend/src/features/ai/components/fields/ModelSelectionField.tsx +0 -134
- package/frontend/src/features/ai/components/fields/SystemPromptField.tsx +0 -33
- package/frontend/src/features/auth/components/AddOAuthDialog.tsx +0 -106
- package/frontend/src/features/auth/components/AuthMethodTab.tsx +0 -238
- package/frontend/src/features/auth/components/UsersTab.tsx +0 -114
- package/frontend/src/features/auth/page/AuthenticationPage.tsx +0 -169
- package/frontend/src/features/database/hooks/UseLinkModal.tsx +0 -78
- package/frontend/src/features/functions/components/FunctionViewer.tsx +0 -46
- package/frontend/src/features/functions/components/FunctionsContent.tsx +0 -88
- package/frontend/src/features/login/components/AuthErrorBoundary.tsx +0 -87
- package/frontend/src/features/login/components/PrivateRoute.tsx +0 -24
- package/frontend/src/features/logs/components/AnalyticsLogsTable.tsx +0 -313
- package/frontend/src/features/logs/components/LogsTable.tsx +0 -199
- package/frontend/src/features/logs/page/AnalyticsLogsPage.tsx +0 -530
- package/frontend/src/features/metadata/index.ts +0 -0
- package/frontend/src/features/metadata/page/MetadataPage.tsx +0 -136
- package/frontend/src/features/onboard/components/CompletionCard.tsx +0 -41
- package/frontend/src/features/onboard/components/OnboardButton.tsx +0 -84
- package/frontend/src/features/onboard/components/StepContent.tsx +0 -91
- package/frontend/src/features/onboard/components/TestConnectionStep.tsx +0 -53
- package/frontend/src/features/onboard/components/mcp/McpInstallation.tsx +0 -144
- package/frontend/src/features/onboard/page/OnBoardPage.tsx +0 -104
- package/frontend/src/features/onboard/types.ts +0 -8
- package/frontend/src/lib/contexts/OnboardStepContext.tsx +0 -68
- package/frontend/src/lib/hooks/useOnboardingCompletion.ts +0 -29
- /package/backend/src/api/{middleware → middlewares}/error.ts +0 -0
- /package/backend/src/api/{middleware → middlewares}/upload.ts +0 -0
- /package/backend/{migrations → src/infra/database/migrations}/000_create-base-tables.sql +0 -0
- /package/backend/{migrations → src/infra/database/migrations}/001_create-helper-functions.sql +0 -0
- /package/backend/{migrations → src/infra/database/migrations}/002_rename-auth-tables.sql +0 -0
- /package/backend/{migrations → src/infra/database/migrations}/003_create-users-table.sql +0 -0
- /package/backend/{migrations → src/infra/database/migrations}/004_add-reload-postgrest-func.sql +0 -0
- /package/backend/{migrations → src/infra/database/migrations}/005_enable-project-admin-modify-users.sql +0 -0
- /package/backend/{migrations → src/infra/database/migrations}/006_modify-ai-usage-table.sql +0 -0
- /package/backend/{migrations → src/infra/database/migrations}/007_drop-metadata-table.sql +0 -0
- /package/backend/{migrations → src/infra/database/migrations}/008_add-system-tables.sql +0 -0
- /package/backend/{migrations → src/infra/database/migrations}/009_add-function-secrets.sql +0 -0
- /package/backend/{migrations → src/infra/database/migrations}/010_modify-ai-config-modalities.sql +0 -0
- /package/backend/{migrations → src/infra/database/migrations}/011_refactor-secrets-table.sql +0 -0
- /package/backend/{migrations → src/infra/database/migrations}/012_add-storage-uploaded-by.sql +0 -0
- /package/frontend/src/{features/metadata → lib}/services/metadata.service.ts +0 -0
package/package.json
CHANGED
|
@@ -1,24 +1,27 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "insforge",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "1.2.10",
|
|
4
4
|
"description": "InsForge - Open source backend-as-a-service with PostgreSQL and MCP integration",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"workspaces": [
|
|
7
7
|
"backend",
|
|
8
8
|
"frontend",
|
|
9
|
+
"auth",
|
|
9
10
|
"shared-schemas",
|
|
10
11
|
"mcp"
|
|
11
12
|
],
|
|
12
13
|
"scripts": {
|
|
13
|
-
"dev": "concurrently -n \"backend,frontend\" -c \"cyan,magenta\" \"npm run dev:backend\" \"npm run dev:frontend\"",
|
|
14
|
-
"dev:debug": "concurrently -n \"backend,frontend\" -c \"cyan,magenta\" \"npm run dev:backend:debug\" \"npm run dev:frontend:debug\"",
|
|
14
|
+
"dev": "concurrently -n \"backend,frontend,auth\" -c \"cyan,magenta,green\" \"npm run dev:backend\" \"npm run dev:frontend\" \"npm run dev:auth\"",
|
|
15
|
+
"dev:debug": "concurrently -n \"backend,frontend,auth\" -c \"cyan,magenta,green\" \"npm run dev:backend:debug\" \"npm run dev:frontend:debug\" \"npm run dev:auth\"",
|
|
15
16
|
"dev:backend": "cd backend && npm run dev",
|
|
16
17
|
"dev:backend:debug": "cd backend && cross-env DEBUG_MODE=true npm run dev",
|
|
17
18
|
"dev:frontend": "cd frontend && npm run dev",
|
|
18
19
|
"dev:frontend:debug": "cd frontend && cross-env VITE_DEBUG_MODE=true npm run dev",
|
|
19
|
-
"
|
|
20
|
+
"dev:auth": "cd auth && npm run dev",
|
|
21
|
+
"build": "npm run build:backend && npm run build:frontend && npm run build:auth",
|
|
20
22
|
"build:backend": "cd backend && npm run build",
|
|
21
23
|
"build:frontend": "cd frontend && npm run build",
|
|
24
|
+
"build:auth": "cd auth && npm run build",
|
|
22
25
|
"start": "cd backend && npm run start",
|
|
23
26
|
"start:prod": "npm run build && npm run start",
|
|
24
27
|
"test": "npm run test:backend && npm run test:frontend",
|
|
@@ -28,26 +31,32 @@
|
|
|
28
31
|
"lint": "eslint .",
|
|
29
32
|
"lint:backend": "eslint backend",
|
|
30
33
|
"lint:frontend": "eslint frontend",
|
|
34
|
+
"lint:auth": "eslint auth",
|
|
31
35
|
"lint:mcp": "eslint mcp",
|
|
32
36
|
"lint:fix": "eslint . --fix",
|
|
33
37
|
"lint:fix:backend": "eslint backend --fix",
|
|
34
38
|
"lint:fix:frontend": "eslint frontend --fix",
|
|
39
|
+
"lint:fix:auth": "eslint auth --fix",
|
|
35
40
|
"lint:fix:mcp": "eslint mcp --fix",
|
|
36
41
|
"format": "prettier --write .",
|
|
37
42
|
"format:backend": "prettier --write backend",
|
|
38
43
|
"format:frontend": "prettier --write frontend",
|
|
44
|
+
"format:auth": "prettier --write auth",
|
|
39
45
|
"format:mcp": "prettier --write mcp",
|
|
40
46
|
"format:check": "prettier --check .",
|
|
41
47
|
"format:check:backend": "prettier --check backend",
|
|
42
48
|
"format:check:frontend": "prettier --check frontend",
|
|
49
|
+
"format:check:auth": "prettier --check auth",
|
|
43
50
|
"format:check:mcp": "prettier --check mcp",
|
|
44
|
-
"typecheck": "npm run typecheck:frontend && npm run typecheck:backend",
|
|
51
|
+
"typecheck": "npm run typecheck:frontend && npm run typecheck:backend && npm run typecheck:auth",
|
|
45
52
|
"typecheck:frontend": "cd frontend && npx tsc --noEmit",
|
|
46
53
|
"typecheck:backend": "cd backend && npx tsc --noEmit",
|
|
47
|
-
"
|
|
54
|
+
"typecheck:auth": "cd auth && npx tsc --noEmit",
|
|
55
|
+
"clean": "npm run clean:backend && npm run clean:frontend && npm run clean:auth",
|
|
48
56
|
"clean:backend": "cd backend && npm run clean",
|
|
49
57
|
"clean:frontend": "cd frontend && rimraf dist",
|
|
50
|
-
"
|
|
58
|
+
"clean:auth": "cd auth && rimraf dist",
|
|
59
|
+
"install:all": "npm install && cd backend && npm install && cd ../frontend && npm install && cd ../auth && npm install",
|
|
51
60
|
"release": "release-it",
|
|
52
61
|
"release:patch": "release-it patch",
|
|
53
62
|
"release:minor": "release-it minor",
|
|
@@ -1,18 +1,36 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import { aiConfigurationSchema, aiUsageRecordSchema } from './ai.schema';
|
|
2
|
+
import { aiConfigurationSchema, aiUsageRecordSchema, modalitySchema } from './ai.schema';
|
|
3
3
|
|
|
4
4
|
// ============= Chat Completion Schemas =============
|
|
5
5
|
|
|
6
|
+
// OpenAI-compatible content schemas
|
|
7
|
+
export const textContentSchema = z.object({
|
|
8
|
+
type: z.literal('text'),
|
|
9
|
+
text: z.string(),
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
export const imageContentSchema = z.object({
|
|
13
|
+
type: z.literal('image_url'),
|
|
14
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
15
|
+
image_url: z.object({
|
|
16
|
+
// URL can be either a public URL or base64-encoded data URI
|
|
17
|
+
// Examples:
|
|
18
|
+
// - Public URL: "https://example.com/image.jpg"
|
|
19
|
+
// - Base64: "data:image/jpeg;base64,/9j/4AAQ..."
|
|
20
|
+
url: z.string(),
|
|
21
|
+
detail: z.enum(['auto', 'low', 'high']).optional(),
|
|
22
|
+
}),
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
export const contentSchema = z.union([textContentSchema, imageContentSchema]);
|
|
26
|
+
|
|
27
|
+
// Chat message supports both OpenAI format and legacy format for backward compatibility
|
|
6
28
|
export const chatMessageSchema = z.object({
|
|
7
29
|
role: z.enum(['user', 'assistant', 'system']),
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
url: z.string(),
|
|
13
|
-
})
|
|
14
|
-
)
|
|
15
|
-
.optional(),
|
|
30
|
+
// New format: content can be string or array of content parts (OpenAI-compatible)
|
|
31
|
+
content: z.union([z.string(), z.array(contentSchema)]),
|
|
32
|
+
// Legacy format: separate images field (deprecated but supported for backward compatibility)
|
|
33
|
+
images: z.array(z.object({ url: z.string() })).optional(),
|
|
16
34
|
});
|
|
17
35
|
|
|
18
36
|
export const chatCompletionRequestSchema = z.object({
|
|
@@ -76,54 +94,13 @@ export const imageGenerationResponseSchema = z.object({
|
|
|
76
94
|
.optional(),
|
|
77
95
|
});
|
|
78
96
|
|
|
79
|
-
|
|
80
|
-
export const openRouterModelSchema = z.object({
|
|
97
|
+
export const aiModelSchema = z.object({
|
|
81
98
|
id: z.string(),
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
inputModalities: z.array(z.string()),
|
|
88
|
-
outputModalities: z.array(z.string()),
|
|
89
|
-
tokenizer: z.string(),
|
|
90
|
-
instructType: z.string(),
|
|
91
|
-
})
|
|
92
|
-
.optional(),
|
|
93
|
-
topProvider: z
|
|
94
|
-
.object({
|
|
95
|
-
isModerated: z.boolean(),
|
|
96
|
-
contextLength: z.number(),
|
|
97
|
-
maxCompletionTokens: z.number(),
|
|
98
|
-
})
|
|
99
|
-
.optional(),
|
|
100
|
-
pricing: z.object({
|
|
101
|
-
prompt: z.string(),
|
|
102
|
-
completion: z.string(),
|
|
103
|
-
image: z.string().optional(),
|
|
104
|
-
request: z.string().optional(),
|
|
105
|
-
webSearch: z.string().optional(),
|
|
106
|
-
internalReasoning: z.string().optional(),
|
|
107
|
-
inputCacheRead: z.string().optional(),
|
|
108
|
-
inputCacheWrite: z.string().optional(),
|
|
109
|
-
}),
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
export const listModelsResponseSchema = z.object({
|
|
113
|
-
text: z.array(
|
|
114
|
-
z.object({
|
|
115
|
-
provider: z.string(),
|
|
116
|
-
configured: z.boolean(),
|
|
117
|
-
models: z.array(openRouterModelSchema),
|
|
118
|
-
})
|
|
119
|
-
),
|
|
120
|
-
image: z.array(
|
|
121
|
-
z.object({
|
|
122
|
-
provider: z.string(),
|
|
123
|
-
configured: z.boolean(),
|
|
124
|
-
models: z.array(openRouterModelSchema),
|
|
125
|
-
})
|
|
126
|
-
),
|
|
99
|
+
inputModality: z.array(modalitySchema).min(1),
|
|
100
|
+
outputModality: z.array(modalitySchema).min(1),
|
|
101
|
+
provider: z.string(),
|
|
102
|
+
modelId: z.string(),
|
|
103
|
+
priceLevel: z.number().min(0).max(3).optional(),
|
|
127
104
|
});
|
|
128
105
|
|
|
129
106
|
export const createAIConfigurationRequestSchema = aiConfigurationSchema.omit({
|
|
@@ -158,8 +135,7 @@ export type ChatCompletionRequest = z.infer<typeof chatCompletionRequestSchema>;
|
|
|
158
135
|
export type ChatCompletionResponse = z.infer<typeof chatCompletionResponseSchema>;
|
|
159
136
|
export type ImageGenerationRequest = z.infer<typeof imageGenerationRequestSchema>;
|
|
160
137
|
export type ImageGenerationResponse = z.infer<typeof imageGenerationResponseSchema>;
|
|
161
|
-
export type
|
|
162
|
-
export type ListModelsResponse = z.infer<typeof listModelsResponseSchema>;
|
|
138
|
+
export type AIModelSchema = z.infer<typeof aiModelSchema>;
|
|
163
139
|
export type CreateAIConfigurationRequest = z.infer<typeof createAIConfigurationRequestSchema>;
|
|
164
140
|
export type UpdateAIConfigurationRequest = z.infer<typeof updateAIConfigurationRequestSchema>;
|
|
165
141
|
export type ListAIUsageResponse = z.infer<typeof listAIUsageResponseSchema>;
|
|
@@ -35,6 +35,11 @@ export const aiUsageDataSchema = z.object({
|
|
|
35
35
|
export const aiUsageRecordSchema = aiUsageDataSchema.extend({
|
|
36
36
|
id: z.string().uuid(),
|
|
37
37
|
createdAt: z.date(),
|
|
38
|
+
modelId: z.string().nullable().optional(),
|
|
39
|
+
model: z.string().nullable(),
|
|
40
|
+
provider: z.string().nullable(),
|
|
41
|
+
inputModality: z.array(modalitySchema).nullable(),
|
|
42
|
+
outputModality: z.array(modalitySchema).nullable(),
|
|
38
43
|
});
|
|
39
44
|
|
|
40
45
|
export const aiUsageSummarySchema = z.object({
|
|
@@ -7,6 +7,8 @@ import {
|
|
|
7
7
|
roleSchema,
|
|
8
8
|
userSchema,
|
|
9
9
|
oAuthConfigSchema,
|
|
10
|
+
oAuthProvidersSchema,
|
|
11
|
+
authConfigSchema,
|
|
10
12
|
} from './auth.schema';
|
|
11
13
|
|
|
12
14
|
// ============================================================================
|
|
@@ -63,22 +65,107 @@ export const deleteUsersRequestSchema = z.object({
|
|
|
63
65
|
userIds: z.array(userIdSchema).min(1, 'At least one user ID is required'),
|
|
64
66
|
});
|
|
65
67
|
|
|
68
|
+
/**
|
|
69
|
+
* POST /api/auth/email/send-verification - Send verification email (code or link based on config)
|
|
70
|
+
*/
|
|
71
|
+
export const sendVerificationEmailRequestSchema = z.object({
|
|
72
|
+
email: emailSchema,
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* POST /api/auth/email/verify - Verify email with OTP
|
|
77
|
+
* Uses verifyEmailMethod from auth config to determine verification type:
|
|
78
|
+
* - 'code': expects email + 6-digit numeric code
|
|
79
|
+
* - 'link': expects 64-char hex token only
|
|
80
|
+
*/
|
|
81
|
+
export const verifyEmailRequestSchema = z
|
|
82
|
+
.object({
|
|
83
|
+
email: emailSchema.optional(),
|
|
84
|
+
otp: z.string().min(1),
|
|
85
|
+
})
|
|
86
|
+
.refine((data) => data.email || data.otp, {
|
|
87
|
+
message: 'Either email or otp must be provided',
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* POST /api/auth/email/send-reset-password - Send reset password email (code or link based on config)
|
|
92
|
+
*/
|
|
93
|
+
export const sendResetPasswordEmailRequestSchema = z.object({
|
|
94
|
+
email: emailSchema,
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* POST /api/auth/email/exchange-reset-password-token - Exchange reset password code for reset token
|
|
99
|
+
* Used in two-step password reset flow (code method only): exchange code for token, then reset password with token
|
|
100
|
+
*/
|
|
101
|
+
export const exchangeResetPasswordTokenRequestSchema = z.object({
|
|
102
|
+
email: emailSchema,
|
|
103
|
+
code: z.string().min(1),
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* POST /api/auth/email/reset-password - Reset password with token
|
|
108
|
+
* Token can be:
|
|
109
|
+
* - Magic link token (from send-reset-password endpoint when method is 'link')
|
|
110
|
+
* - Reset token (from exchange-reset-password-token endpoint after code verification)
|
|
111
|
+
* Both use RESET_PASSWORD purpose and are verified the same way
|
|
112
|
+
*/
|
|
113
|
+
export const resetPasswordRequestSchema = z.object({
|
|
114
|
+
newPassword: passwordSchema,
|
|
115
|
+
otp: z.string().min(1, 'OTP/token is required'),
|
|
116
|
+
});
|
|
117
|
+
|
|
66
118
|
// ============================================================================
|
|
67
119
|
// Response schemas
|
|
68
120
|
// ============================================================================
|
|
69
121
|
|
|
70
122
|
/**
|
|
71
123
|
* Response for POST /api/auth/users
|
|
124
|
+
* Includes optional redirectTo URL when user is successfully registered and email verification is not required
|
|
72
125
|
*/
|
|
73
126
|
export const createUserResponseSchema = z.object({
|
|
127
|
+
user: userSchema.optional(),
|
|
128
|
+
accessToken: z.string().nullable(),
|
|
129
|
+
requireEmailVerification: z.boolean().optional(),
|
|
130
|
+
redirectTo: z.string().url().optional(),
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Response for POST /api/auth/sessions
|
|
135
|
+
* Includes user and access token, plus optional redirectTo URL for frontend navigation
|
|
136
|
+
*/
|
|
137
|
+
export const createSessionResponseSchema = z.object({
|
|
74
138
|
user: userSchema,
|
|
75
139
|
accessToken: z.string(),
|
|
140
|
+
redirectTo: z.string().url().optional(),
|
|
76
141
|
});
|
|
77
142
|
|
|
78
143
|
/**
|
|
79
|
-
* Response for POST /api/auth/
|
|
144
|
+
* Response for POST /api/auth/email/verify
|
|
145
|
+
* Includes user and access token, plus optional redirectTo URL for frontend navigation
|
|
80
146
|
*/
|
|
81
|
-
export const
|
|
147
|
+
export const verifyEmailResponseSchema = z.object({
|
|
148
|
+
user: userSchema,
|
|
149
|
+
accessToken: z.string(),
|
|
150
|
+
redirectTo: z.string().url().optional(),
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Response for POST /api/auth/email/exchange-reset-password-token
|
|
155
|
+
* Returns reset token that can be used to reset password
|
|
156
|
+
*/
|
|
157
|
+
export const exchangeResetPasswordTokenResponseSchema = z.object({
|
|
158
|
+
token: z.string(),
|
|
159
|
+
expiresAt: z.string().datetime(),
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Response for POST /api/auth/email/reset-password
|
|
164
|
+
* Includes success message
|
|
165
|
+
*/
|
|
166
|
+
export const resetPasswordResponseSchema = z.object({
|
|
167
|
+
message: z.string(),
|
|
168
|
+
});
|
|
82
169
|
|
|
83
170
|
/**
|
|
84
171
|
* Response for POST /api/auth/admin/sessions
|
|
@@ -130,20 +217,30 @@ export const getOauthUrlResponseSchema = z.object({
|
|
|
130
217
|
/**
|
|
131
218
|
* POST /api/auth/oauth/configs - Create OAuth configuration
|
|
132
219
|
*/
|
|
133
|
-
export const createOAuthConfigRequestSchema = oAuthConfigSchema
|
|
134
|
-
|
|
135
|
-
|
|
220
|
+
export const createOAuthConfigRequestSchema = oAuthConfigSchema
|
|
221
|
+
.omit({
|
|
222
|
+
id: true,
|
|
223
|
+
createdAt: true,
|
|
224
|
+
updatedAt: true,
|
|
225
|
+
})
|
|
226
|
+
.extend({
|
|
227
|
+
clientSecret: z.string().optional(),
|
|
228
|
+
});
|
|
136
229
|
|
|
137
230
|
/**
|
|
138
231
|
* PUT /api/auth/oauth/configs/:provider - Update OAuth configuration
|
|
139
232
|
*/
|
|
140
233
|
export const updateOAuthConfigRequestSchema = oAuthConfigSchema
|
|
234
|
+
.omit({
|
|
235
|
+
id: true,
|
|
236
|
+
provider: true,
|
|
237
|
+
createdAt: true,
|
|
238
|
+
updatedAt: true,
|
|
239
|
+
})
|
|
141
240
|
.extend({
|
|
142
241
|
clientSecret: z.string().optional(),
|
|
143
242
|
})
|
|
144
|
-
.
|
|
145
|
-
provider: true,
|
|
146
|
-
});
|
|
243
|
+
.partial();
|
|
147
244
|
|
|
148
245
|
/**
|
|
149
246
|
* Response for GET /api/auth/oauth/configs
|
|
@@ -153,6 +250,40 @@ export const listOAuthConfigsResponseSchema = z.object({
|
|
|
153
250
|
count: z.number(),
|
|
154
251
|
});
|
|
155
252
|
|
|
253
|
+
// ============================================================================
|
|
254
|
+
// Authentication Configuration schemas
|
|
255
|
+
// ============================================================================
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* PUT /api/auth/config - Update authentication configuration
|
|
259
|
+
*/
|
|
260
|
+
export const updateAuthConfigRequestSchema = authConfigSchema
|
|
261
|
+
.omit({
|
|
262
|
+
id: true,
|
|
263
|
+
createdAt: true,
|
|
264
|
+
updatedAt: true,
|
|
265
|
+
})
|
|
266
|
+
.partial();
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* Response for GET /api/auth/config
|
|
270
|
+
*/
|
|
271
|
+
export const getAuthConfigResponseSchema = authConfigSchema;
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* Response for GET /api/auth/public-config - Unified public auth configuration endpoint
|
|
275
|
+
* Combines OAuth providers and email auth configuration
|
|
276
|
+
*/
|
|
277
|
+
export const getPublicAuthConfigResponseSchema = z.object({
|
|
278
|
+
oAuthProviders: z.array(oAuthProvidersSchema),
|
|
279
|
+
...authConfigSchema.omit({
|
|
280
|
+
id: true,
|
|
281
|
+
updatedAt: true,
|
|
282
|
+
createdAt: true,
|
|
283
|
+
signInRedirectTo: true,
|
|
284
|
+
}).shape,
|
|
285
|
+
});
|
|
286
|
+
|
|
156
287
|
// ============================================================================
|
|
157
288
|
// Error response schema
|
|
158
289
|
// ============================================================================
|
|
@@ -179,15 +310,30 @@ export type ListUsersRequest = z.infer<typeof listUsersRequestSchema>;
|
|
|
179
310
|
export type DeleteUsersRequest = z.infer<typeof deleteUsersRequestSchema>;
|
|
180
311
|
export type CreateOAuthConfigRequest = z.infer<typeof createOAuthConfigRequestSchema>;
|
|
181
312
|
export type UpdateOAuthConfigRequest = z.infer<typeof updateOAuthConfigRequestSchema>;
|
|
313
|
+
export type UpdateAuthConfigRequest = z.infer<typeof updateAuthConfigRequestSchema>;
|
|
314
|
+
export type SendVerificationEmailRequest = z.infer<typeof sendVerificationEmailRequestSchema>;
|
|
315
|
+
export type VerifyEmailRequest = z.infer<typeof verifyEmailRequestSchema>;
|
|
316
|
+
export type SendResetPasswordEmailRequest = z.infer<typeof sendResetPasswordEmailRequestSchema>;
|
|
317
|
+
export type ExchangeResetPasswordTokenRequest = z.infer<
|
|
318
|
+
typeof exchangeResetPasswordTokenRequestSchema
|
|
319
|
+
>;
|
|
320
|
+
export type ResetPasswordRequest = z.infer<typeof resetPasswordRequestSchema>;
|
|
182
321
|
|
|
183
322
|
// Response types for type-safe responses
|
|
184
323
|
export type CreateUserResponse = z.infer<typeof createUserResponseSchema>;
|
|
185
324
|
export type CreateSessionResponse = z.infer<typeof createSessionResponseSchema>;
|
|
325
|
+
export type VerifyEmailResponse = z.infer<typeof verifyEmailResponseSchema>;
|
|
326
|
+
export type ExchangeResetPasswordTokenResponse = z.infer<
|
|
327
|
+
typeof exchangeResetPasswordTokenResponseSchema
|
|
328
|
+
>;
|
|
329
|
+
export type ResetPasswordResponse = z.infer<typeof resetPasswordResponseSchema>;
|
|
186
330
|
export type CreateAdminSessionResponse = z.infer<typeof createAdminSessionResponseSchema>;
|
|
187
331
|
export type GetCurrentSessionResponse = z.infer<typeof getCurrentSessionResponseSchema>;
|
|
188
332
|
export type ListUsersResponse = z.infer<typeof listUsersResponseSchema>;
|
|
189
333
|
export type DeleteUsersResponse = z.infer<typeof deleteUsersResponseSchema>;
|
|
190
334
|
export type GetOauthUrlResponse = z.infer<typeof getOauthUrlResponseSchema>;
|
|
191
335
|
export type ListOAuthConfigsResponse = z.infer<typeof listOAuthConfigsResponseSchema>;
|
|
336
|
+
export type GetAuthConfigResponse = z.infer<typeof getAuthConfigResponseSchema>;
|
|
337
|
+
export type GetPublicAuthConfigResponse = z.infer<typeof getPublicAuthConfigResponseSchema>;
|
|
192
338
|
|
|
193
339
|
export type AuthErrorResponse = z.infer<typeof authErrorResponseSchema>;
|
|
@@ -13,10 +13,7 @@ export const userIdSchema = z.string().uuid('Invalid user ID format');
|
|
|
13
13
|
|
|
14
14
|
export const emailSchema = z.string().email('Invalid email format').toLowerCase().trim();
|
|
15
15
|
|
|
16
|
-
export const passwordSchema = z
|
|
17
|
-
.string()
|
|
18
|
-
.min(6, 'Password must be at least 6 characters')
|
|
19
|
-
.max(32, 'Password must be less than 32 characters');
|
|
16
|
+
export const passwordSchema = z.string();
|
|
20
17
|
|
|
21
18
|
export const nameSchema = z
|
|
22
19
|
.string()
|
|
@@ -26,6 +23,8 @@ export const nameSchema = z
|
|
|
26
23
|
|
|
27
24
|
export const roleSchema = z.enum(['authenticated', 'project_admin']);
|
|
28
25
|
|
|
26
|
+
export const verificationMethodSchema = z.enum(['code', 'link']);
|
|
27
|
+
|
|
29
28
|
// ============================================================================
|
|
30
29
|
// Core entity schemas
|
|
31
30
|
// ============================================================================
|
|
@@ -54,7 +53,19 @@ export const userSchema = z.object({
|
|
|
54
53
|
* OAuth state for redirect handling
|
|
55
54
|
*/
|
|
56
55
|
|
|
57
|
-
export const oAuthProvidersSchema = z.enum([
|
|
56
|
+
export const oAuthProvidersSchema = z.enum([
|
|
57
|
+
'google',
|
|
58
|
+
'github',
|
|
59
|
+
'discord',
|
|
60
|
+
'linkedin',
|
|
61
|
+
'facebook',
|
|
62
|
+
'instagram',
|
|
63
|
+
'tiktok',
|
|
64
|
+
'apple',
|
|
65
|
+
'x',
|
|
66
|
+
'spotify',
|
|
67
|
+
'microsoft',
|
|
68
|
+
]);
|
|
58
69
|
|
|
59
70
|
export const oAuthStateSchema = z.object({
|
|
60
71
|
provider: oAuthProvidersSchema,
|
|
@@ -63,11 +74,33 @@ export const oAuthStateSchema = z.object({
|
|
|
63
74
|
|
|
64
75
|
// OAuth provider configuration schema
|
|
65
76
|
export const oAuthConfigSchema = z.object({
|
|
66
|
-
|
|
77
|
+
id: z.string().uuid(),
|
|
78
|
+
provider: oAuthProvidersSchema,
|
|
67
79
|
clientId: z.string().optional(),
|
|
68
80
|
scopes: z.array(z.string()).optional(),
|
|
69
81
|
redirectUri: z.string().optional(),
|
|
70
82
|
useSharedKey: z.boolean(),
|
|
83
|
+
createdAt: z.string(), // PostgreSQL timestamp
|
|
84
|
+
updatedAt: z.string(), // PostgreSQL timestamp
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
// Email authentication configuration schema
|
|
88
|
+
export const authConfigSchema = z.object({
|
|
89
|
+
id: z.string().uuid(),
|
|
90
|
+
requireEmailVerification: z.boolean(),
|
|
91
|
+
passwordMinLength: z.number().min(4).max(128),
|
|
92
|
+
requireNumber: z.boolean(),
|
|
93
|
+
requireLowercase: z.boolean(),
|
|
94
|
+
requireUppercase: z.boolean(),
|
|
95
|
+
requireSpecialChar: z.boolean(),
|
|
96
|
+
verifyEmailMethod: verificationMethodSchema,
|
|
97
|
+
resetPasswordMethod: verificationMethodSchema,
|
|
98
|
+
signInRedirectTo: z
|
|
99
|
+
.union([z.string().url(), z.literal(''), z.null()])
|
|
100
|
+
.optional()
|
|
101
|
+
.transform((val) => (val === '' ? null : val)),
|
|
102
|
+
createdAt: z.string(), // PostgreSQL timestamp
|
|
103
|
+
updatedAt: z.string(), // PostgreSQL timestamp
|
|
71
104
|
});
|
|
72
105
|
|
|
73
106
|
/**
|
|
@@ -89,6 +122,9 @@ export type UserIdSchema = z.infer<typeof userIdSchema>;
|
|
|
89
122
|
export type EmailSchema = z.infer<typeof emailSchema>;
|
|
90
123
|
export type PasswordSchema = z.infer<typeof passwordSchema>;
|
|
91
124
|
export type RoleSchema = z.infer<typeof roleSchema>;
|
|
125
|
+
export type VerificationMethodSchema = z.infer<typeof verificationMethodSchema>;
|
|
92
126
|
export type UserSchema = z.infer<typeof userSchema>;
|
|
93
127
|
export type TokenPayloadSchema = z.infer<typeof tokenPayloadSchema>;
|
|
94
128
|
export type OAuthConfigSchema = z.infer<typeof oAuthConfigSchema>;
|
|
129
|
+
export type OAuthProvidersSchema = z.infer<typeof oAuthProvidersSchema>;
|
|
130
|
+
export type AuthConfigSchema = z.infer<typeof authConfigSchema>;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
export const appRouteChangeEventSchema = z.object({
|
|
4
|
+
type: z.literal('APP_ROUTE_CHANGE'),
|
|
5
|
+
path: z.string(),
|
|
6
|
+
});
|
|
7
|
+
|
|
8
|
+
export const authSuccessEventSchema = z.object({
|
|
9
|
+
type: z.literal('AUTH_SUCCESS'),
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
export const authErrorEventSchema = z.object({
|
|
13
|
+
type: z.literal('AUTH_ERROR'),
|
|
14
|
+
message: z.string(),
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
export const mcpConnectionStatusEventSchema = z.object({
|
|
18
|
+
type: z.literal('MCP_CONNECTION_STATUS'),
|
|
19
|
+
connected: z.boolean(),
|
|
20
|
+
toolName: z.string(),
|
|
21
|
+
timestamp: z.union([z.number(), z.string()]),
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
export const showOnboardingOverlayEventSchema = z.object({
|
|
25
|
+
type: z.literal('SHOW_ONBOARDING_OVERLAY'),
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
export const showSettingsOverlayEventSchema = z.object({
|
|
29
|
+
type: z.literal('SHOW_SETTINGS_OVERLAY'),
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
export const onboardingSuccessSchema = z.object({
|
|
33
|
+
type: z.literal('ONBOARDING_SUCCESS'),
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
export const navigateToUsageSchema = z.object({
|
|
37
|
+
type: z.literal('NAVIGATE_TO_USAGE'),
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
export const cloudEventSchema = z.discriminatedUnion('type', [
|
|
41
|
+
appRouteChangeEventSchema,
|
|
42
|
+
authSuccessEventSchema,
|
|
43
|
+
authErrorEventSchema,
|
|
44
|
+
mcpConnectionStatusEventSchema,
|
|
45
|
+
showOnboardingOverlayEventSchema,
|
|
46
|
+
showSettingsOverlayEventSchema,
|
|
47
|
+
onboardingSuccessSchema,
|
|
48
|
+
navigateToUsageSchema,
|
|
49
|
+
]);
|
|
50
|
+
|
|
51
|
+
export type AppRouteChangeEvent = z.infer<typeof appRouteChangeEventSchema>;
|
|
52
|
+
export type AuthSuccessEvent = z.infer<typeof authSuccessEventSchema>;
|
|
53
|
+
export type AuthErrorEvent = z.infer<typeof authErrorEventSchema>;
|
|
54
|
+
export type McpConnectionStatusEvent = z.infer<typeof mcpConnectionStatusEventSchema>;
|
|
55
|
+
export type CloudEvent = z.infer<typeof cloudEventSchema>;
|
|
56
|
+
export type ShowOnboardingOverlayEvent = z.infer<typeof showOnboardingOverlayEventSchema>;
|
|
57
|
+
export type ShowSettingsOverlayEvent = z.infer<typeof showSettingsOverlayEventSchema>;
|
|
@@ -79,11 +79,11 @@ export const deleteTableResponse = z.object({
|
|
|
79
79
|
// Raw SQL Schemas
|
|
80
80
|
export const rawSQLRequestSchema = z.object({
|
|
81
81
|
query: z.string().min(1, 'Query is required'),
|
|
82
|
-
params: z.array(z.
|
|
82
|
+
params: z.array(z.unknown()).optional(),
|
|
83
83
|
});
|
|
84
84
|
|
|
85
85
|
export const rawSQLResponseSchema = z.object({
|
|
86
|
-
rows: z.array(z.
|
|
86
|
+
rows: z.array(z.record(z.string(), z.unknown())),
|
|
87
87
|
rowCount: z.number().nullable(),
|
|
88
88
|
fields: z
|
|
89
89
|
.array(
|
|
@@ -160,7 +160,7 @@ export const exportJsonDataSchema = z.object({
|
|
|
160
160
|
oldTable: z.string().nullable(),
|
|
161
161
|
})
|
|
162
162
|
),
|
|
163
|
-
rows: z.array(z.
|
|
163
|
+
rows: z.array(z.record(z.string(), z.unknown())).optional(),
|
|
164
164
|
recordCount: z.number().optional(),
|
|
165
165
|
})
|
|
166
166
|
),
|
|
@@ -57,7 +57,7 @@ export const tableSchema = z.object({
|
|
|
57
57
|
.min(1, 'Table name cannot be empty')
|
|
58
58
|
.max(64, 'Table name must be less than 64 characters'),
|
|
59
59
|
columns: z.array(columnSchema).min(1, 'At least one column is required'),
|
|
60
|
-
recordCount: z.number().
|
|
60
|
+
recordCount: z.number().optional(),
|
|
61
61
|
createdAt: z.string().optional(),
|
|
62
62
|
updatedAt: z.string().optional(),
|
|
63
63
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import { auditLogSchema } from './logs.schema';
|
|
2
|
+
import { auditLogSchema, logSchema } from './logs.schema';
|
|
3
3
|
|
|
4
4
|
export const getAuditLogsRequestSchema = z.object({
|
|
5
5
|
limit: z.number().default(100),
|
|
@@ -41,9 +41,15 @@ export const clearAuditLogsResponseSchema = z.object({
|
|
|
41
41
|
deleted: z.number(),
|
|
42
42
|
});
|
|
43
43
|
|
|
44
|
+
export const getLogsResponseSchema = z.object({
|
|
45
|
+
logs: z.array(logSchema),
|
|
46
|
+
total: z.number(),
|
|
47
|
+
});
|
|
48
|
+
|
|
44
49
|
export type GetAuditLogsRequest = z.infer<typeof getAuditLogsRequestSchema>;
|
|
45
50
|
export type GetAuditLogsResponse = z.infer<typeof getAuditLogsResponseSchema>;
|
|
46
51
|
export type GetAuditLogStatsRequest = z.infer<typeof getAuditLogStatsRequestSchema>;
|
|
47
52
|
export type GetAuditLogStatsResponse = z.infer<typeof getAuditLogStatsResponseSchema>;
|
|
48
53
|
export type ClearAuditLogsRequest = z.infer<typeof clearAuditLogsRequestSchema>;
|
|
49
54
|
export type ClearAuditLogsResponse = z.infer<typeof clearAuditLogsResponseSchema>;
|
|
55
|
+
export type GetLogsResponse = z.infer<typeof getLogsResponseSchema>;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
|
|
3
|
+
// Audit log schemas
|
|
3
4
|
export const auditLogSchema = z.object({
|
|
4
5
|
id: z.string(),
|
|
5
6
|
actor: z.string(),
|
|
@@ -12,3 +13,28 @@ export const auditLogSchema = z.object({
|
|
|
12
13
|
});
|
|
13
14
|
|
|
14
15
|
export type AuditLogSchema = z.infer<typeof auditLogSchema>;
|
|
16
|
+
|
|
17
|
+
// System log schemas
|
|
18
|
+
export const logSourceSchema = z.object({
|
|
19
|
+
id: z.string(),
|
|
20
|
+
name: z.string(),
|
|
21
|
+
token: z.string(),
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
export const logSchema = z.object({
|
|
25
|
+
id: z.string(),
|
|
26
|
+
eventMessage: z.string(),
|
|
27
|
+
timestamp: z.string(),
|
|
28
|
+
body: z.record(z.string(), z.unknown()),
|
|
29
|
+
source: z.string().optional(),
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
export const logStatsSchema = z.object({
|
|
33
|
+
source: z.string(),
|
|
34
|
+
count: z.number(),
|
|
35
|
+
lastActivity: z.string(),
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
export type LogSourceSchema = z.infer<typeof logSourceSchema>;
|
|
39
|
+
export type LogSchema = z.infer<typeof logSchema>;
|
|
40
|
+
export type LogStatsSchema = z.infer<typeof logStatsSchema>;
|