insforge 0.3.2 → 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 -781
- 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
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { Button } from '@/components/radix/Button';
|
|
2
|
-
import CheckedIcon from '@/assets/icons/checked.svg';
|
|
3
|
-
import { useNavigate } from 'react-router-dom';
|
|
4
|
-
import { useOnboardingCompletion } from '@/lib/hooks/useOnboardingCompletion';
|
|
5
|
-
import { useEffect } from 'react';
|
|
6
|
-
|
|
7
|
-
export function CompletionCard() {
|
|
8
|
-
const navigate = useNavigate();
|
|
9
|
-
const { markAsCompleted } = useOnboardingCompletion();
|
|
10
|
-
|
|
11
|
-
// Mark as completed when this component is mounted
|
|
12
|
-
useEffect(() => {
|
|
13
|
-
markAsCompleted();
|
|
14
|
-
}, [markAsCompleted]);
|
|
15
|
-
|
|
16
|
-
const handleNavigate = async () => {
|
|
17
|
-
await navigate('/dashboard');
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
return (
|
|
21
|
-
<div className="border border-transparent dark:border-neutral-700 rounded-xl bg-white dark:bg-neutral-800 py-8 px-6">
|
|
22
|
-
<div className="flex flex-col items-center justify-center gap-8">
|
|
23
|
-
<div className="flex flex-col items-center justify-center gap-4 text-center">
|
|
24
|
-
<img src={CheckedIcon} alt="Checked" className="w-10 h-10" />
|
|
25
|
-
<p className="text-lg font-semibold text-black dark:text-white">You are all set!</p>
|
|
26
|
-
<p className="text-zinc-500 dark:text-zinc-400 text-sm">
|
|
27
|
-
Your AI agent is now full-stack — powered by <b>InsForge</b>.
|
|
28
|
-
<br /> Let's build something <b>real</b>.
|
|
29
|
-
</p>
|
|
30
|
-
</div>
|
|
31
|
-
<Button
|
|
32
|
-
variant="default"
|
|
33
|
-
className="px-4 py-2 h-10 text-sm font-medium dark:bg-emerald-300 dark:text-black dark:hover:bg-emerald-200"
|
|
34
|
-
onClick={() => void handleNavigate()}
|
|
35
|
-
>
|
|
36
|
-
Go to Dashboard
|
|
37
|
-
</Button>
|
|
38
|
-
</div>
|
|
39
|
-
</div>
|
|
40
|
-
);
|
|
41
|
-
}
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
import { Link, useLocation } from 'react-router-dom';
|
|
2
|
-
import { cn } from '@/lib/utils/utils';
|
|
3
|
-
import { Button } from '@/components/radix/Button';
|
|
4
|
-
import {
|
|
5
|
-
Tooltip,
|
|
6
|
-
TooltipContent,
|
|
7
|
-
TooltipProvider,
|
|
8
|
-
TooltipTrigger,
|
|
9
|
-
} from '@/components/radix/Tooltip';
|
|
10
|
-
import { CircularStepper } from '@/components/Stepper';
|
|
11
|
-
import { useOnboardStep, STEP_DESCRIPTIONS } from '@/lib/contexts/OnboardStepContext';
|
|
12
|
-
|
|
13
|
-
interface OnboardButtonProps {
|
|
14
|
-
isCollapsed: boolean;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export function OnboardButton({ isCollapsed }: OnboardButtonProps) {
|
|
18
|
-
const location = useLocation();
|
|
19
|
-
const { currentStep, totalSteps } = useOnboardStep();
|
|
20
|
-
|
|
21
|
-
const isActive = location.pathname === '/dashboard/onboard';
|
|
22
|
-
|
|
23
|
-
// Limit displayed step to totalSteps for the sidebar
|
|
24
|
-
const displayStep = Math.min(currentStep, totalSteps);
|
|
25
|
-
const currentDescription = STEP_DESCRIPTIONS[displayStep - 1];
|
|
26
|
-
|
|
27
|
-
return (
|
|
28
|
-
<TooltipProvider delayDuration={300}>
|
|
29
|
-
<Tooltip>
|
|
30
|
-
<TooltipTrigger asChild>
|
|
31
|
-
<Link to="/dashboard/onboard" className="block">
|
|
32
|
-
<Button
|
|
33
|
-
variant="ghost"
|
|
34
|
-
className={cn(
|
|
35
|
-
'w-full h-16 relative transition-all duration-200 ease-in-out border-2 rounded-lg justify-start',
|
|
36
|
-
isCollapsed ? 'pl-[11px] pr-2.5' : 'px-3.5',
|
|
37
|
-
isActive
|
|
38
|
-
? 'border-zinc-900 dark:bg-emerald-300 dark:hover:bg-emerald-200 bg-zinc-900 hover:bg-zinc-900 '
|
|
39
|
-
: 'border-zinc-200 dark:border-neutral-700 hover:bg-zinc-50 dark:hover:bg-neutral-600 hover:border-zinc-300 dark:text-white'
|
|
40
|
-
)}
|
|
41
|
-
>
|
|
42
|
-
<CircularStepper
|
|
43
|
-
currentStep={displayStep}
|
|
44
|
-
totalSteps={totalSteps}
|
|
45
|
-
size={40}
|
|
46
|
-
isActive={isActive}
|
|
47
|
-
/>
|
|
48
|
-
{!isCollapsed && (
|
|
49
|
-
<div className="absolute left-16.5 flex flex-col items-start">
|
|
50
|
-
<span
|
|
51
|
-
className={cn(
|
|
52
|
-
'font-semibold text-sm transition-colors duration-200',
|
|
53
|
-
isActive ? 'text-zinc-50 dark:text-black' : 'text-zinc-950 dark:text-white'
|
|
54
|
-
)}
|
|
55
|
-
>
|
|
56
|
-
Get Started
|
|
57
|
-
</span>
|
|
58
|
-
<span
|
|
59
|
-
className={cn(
|
|
60
|
-
'text-xs transition-colors duration-200',
|
|
61
|
-
isActive
|
|
62
|
-
? 'text-text-gray dark:text-zinc-800'
|
|
63
|
-
: 'text-zinc-500 dark:text-white'
|
|
64
|
-
)}
|
|
65
|
-
>
|
|
66
|
-
{currentDescription}
|
|
67
|
-
</span>
|
|
68
|
-
</div>
|
|
69
|
-
)}
|
|
70
|
-
</Button>
|
|
71
|
-
</Link>
|
|
72
|
-
</TooltipTrigger>
|
|
73
|
-
{isCollapsed && (
|
|
74
|
-
<TooltipContent side="right">
|
|
75
|
-
<div className="text-center">
|
|
76
|
-
<p className="font-semibold">Get Started</p>
|
|
77
|
-
<p className="text-xs text-text-gray dark:text-neutural-600">{currentDescription}</p>
|
|
78
|
-
</div>
|
|
79
|
-
</TooltipContent>
|
|
80
|
-
)}
|
|
81
|
-
</Tooltip>
|
|
82
|
-
</TooltipProvider>
|
|
83
|
-
);
|
|
84
|
-
}
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
import { OnboardStep } from '../types';
|
|
2
|
-
import { CodeBlock } from '@/components/CodeBlock';
|
|
3
|
-
import { McpInstallation } from '@/features/onboard/components/mcp';
|
|
4
|
-
import { TestConnectionStep } from './TestConnectionStep';
|
|
5
|
-
|
|
6
|
-
interface StepContentProps {
|
|
7
|
-
step: OnboardStep;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export function StepContent({ step }: StepContentProps) {
|
|
11
|
-
switch (step) {
|
|
12
|
-
case OnboardStep.INSTALL_NODEJS:
|
|
13
|
-
return (
|
|
14
|
-
<div className="border border-transparent dark:border-neutral-800 rounded-xl bg-white dark:bg-neutral-800 py-8 px-6 space-y-4">
|
|
15
|
-
<div>
|
|
16
|
-
<p className="text-zinc-950 dark:text-white text-sm mb-4">
|
|
17
|
-
Install{' '}
|
|
18
|
-
<a
|
|
19
|
-
href="https://nodejs.org"
|
|
20
|
-
target="_blank"
|
|
21
|
-
rel="noopener noreferrer"
|
|
22
|
-
className="text-link-blue underline inline-flex items-center gap-1"
|
|
23
|
-
>
|
|
24
|
-
Node.js
|
|
25
|
-
</a>
|
|
26
|
-
. Visit the official Node.js website at{' '}
|
|
27
|
-
<a
|
|
28
|
-
href="https://nodejs.org/"
|
|
29
|
-
target="_blank"
|
|
30
|
-
rel="noopener noreferrer"
|
|
31
|
-
className="text-link-blue underline"
|
|
32
|
-
>
|
|
33
|
-
https://nodejs.org/
|
|
34
|
-
</a>
|
|
35
|
-
</p>
|
|
36
|
-
<p className="text-zinc-950 dark:text-white text-sm">
|
|
37
|
-
Verify installation by opening a terminal and running:
|
|
38
|
-
</p>
|
|
39
|
-
</div>
|
|
40
|
-
|
|
41
|
-
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
|
|
42
|
-
<CodeBlock
|
|
43
|
-
code="node --version"
|
|
44
|
-
className="dark:bg-neutral-700 dark:text-white"
|
|
45
|
-
buttonClassName="dark:bg-neutral-800 dark:hover:bg-neutral-800"
|
|
46
|
-
/>
|
|
47
|
-
<CodeBlock
|
|
48
|
-
code="npm --version"
|
|
49
|
-
className="dark:bg-neutral-700 dark:text-white"
|
|
50
|
-
buttonClassName="dark:bg-neutral-800 dark:hover:bg-neutral-800"
|
|
51
|
-
/>
|
|
52
|
-
</div>
|
|
53
|
-
</div>
|
|
54
|
-
);
|
|
55
|
-
|
|
56
|
-
case OnboardStep.INSTALL_MCP:
|
|
57
|
-
return <McpInstallation TabListClassName="dark:bg-neutral-800" />;
|
|
58
|
-
|
|
59
|
-
case OnboardStep.TEST_CONNECTION:
|
|
60
|
-
return <TestConnectionStep />;
|
|
61
|
-
|
|
62
|
-
case OnboardStep.FINAL_SETUP:
|
|
63
|
-
return (
|
|
64
|
-
<div className="space-y-6 border border-transparent dark:border-neutral-700 rounded-xl bg-white dark:bg-neutral-800 py-8 px-6">
|
|
65
|
-
<div>
|
|
66
|
-
<p className="text-zinc-950 dark:text-white text-sm mb-4">
|
|
67
|
-
Whenever you start a new chat session, init your AI agents with the InsForge init
|
|
68
|
-
prompt:
|
|
69
|
-
</p>
|
|
70
|
-
</div>
|
|
71
|
-
|
|
72
|
-
<CodeBlock
|
|
73
|
-
code="Learn how to use InsForge"
|
|
74
|
-
className="bg-slate-50 dark:bg-neutral-700 dark:text-white"
|
|
75
|
-
buttonClassName="dark:bg-neutral-800 dark:hover:bg-neutral-800"
|
|
76
|
-
/>
|
|
77
|
-
|
|
78
|
-
<div>
|
|
79
|
-
<p className="text-zinc-950 dark:text-white text-sm">Then you can start building!</p>
|
|
80
|
-
</div>
|
|
81
|
-
</div>
|
|
82
|
-
);
|
|
83
|
-
|
|
84
|
-
default:
|
|
85
|
-
return (
|
|
86
|
-
<div className="text-center text-zinc-500">
|
|
87
|
-
<p>Step content not found</p>
|
|
88
|
-
</div>
|
|
89
|
-
);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import { CodeBlock } from '@/components/CodeBlock';
|
|
2
|
-
import { ServerEvents, useSocket } from '@/lib/contexts/SocketContext';
|
|
3
|
-
import { ClockIcon } from 'lucide-react';
|
|
4
|
-
import CheckedIcon from '@/assets/icons/checked.svg';
|
|
5
|
-
import { useEffect, useState } from 'react';
|
|
6
|
-
|
|
7
|
-
export function TestConnectionStep() {
|
|
8
|
-
const [showSuccess, setShowSuccess] = useState(false);
|
|
9
|
-
|
|
10
|
-
// Use the Socket hook - it will auto-connect
|
|
11
|
-
const { socket } = useSocket();
|
|
12
|
-
|
|
13
|
-
// Show success message when mcp connects
|
|
14
|
-
useEffect(() => {
|
|
15
|
-
const handleMcpConnected = () => setShowSuccess(true);
|
|
16
|
-
|
|
17
|
-
socket?.on(ServerEvents.MCP_CONNECTED, handleMcpConnected);
|
|
18
|
-
|
|
19
|
-
return () => {
|
|
20
|
-
socket?.off(ServerEvents.MCP_CONNECTED, handleMcpConnected);
|
|
21
|
-
};
|
|
22
|
-
}, [socket]);
|
|
23
|
-
|
|
24
|
-
return (
|
|
25
|
-
<div className="space-y-6 border border-transparent dark:border-neutral-700 rounded-xl bg-white dark:bg-neutral-800 py-8 px-6">
|
|
26
|
-
<div>
|
|
27
|
-
<p className="text-zinc-950 dark:text-white text-sm mb-4">
|
|
28
|
-
Open your agent's chat interface, copy and send this:
|
|
29
|
-
</p>
|
|
30
|
-
</div>
|
|
31
|
-
|
|
32
|
-
<CodeBlock
|
|
33
|
-
code="I'm using InsForge as my backend platform, what is my current backend structure?"
|
|
34
|
-
className="bg-slate-50 dark:bg-neutral-700 dark:text-white"
|
|
35
|
-
buttonClassName="dark:bg-neutral-800 dark:hover:bg-neutral-800"
|
|
36
|
-
/>
|
|
37
|
-
|
|
38
|
-
{!showSuccess && (
|
|
39
|
-
<div className="flex items-center gap-2 text-zinc-500 dark:text-neutral-400">
|
|
40
|
-
<ClockIcon className="w-5 h-5" />
|
|
41
|
-
<p className="text-sm">Waiting for connection</p>
|
|
42
|
-
</div>
|
|
43
|
-
)}
|
|
44
|
-
|
|
45
|
-
{showSuccess && (
|
|
46
|
-
<div className="flex items-center gap-2 text-green-600 dark:text-green-400">
|
|
47
|
-
<img src={CheckedIcon} alt="Checked" className="w-5 h-5" />
|
|
48
|
-
<p className="text-sm">API Call Detected, Connection Succeeded</p>
|
|
49
|
-
</div>
|
|
50
|
-
)}
|
|
51
|
-
</div>
|
|
52
|
-
);
|
|
53
|
-
}
|
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
import { useState, useMemo } from 'react';
|
|
2
|
-
import { cn, getBackendUrl } from '@/lib/utils/utils';
|
|
3
|
-
import { CodeBlock } from '@/components/CodeBlock';
|
|
4
|
-
import { Tabs, TabsList, TabsTrigger, TabsContent } from '@/components/radix/Tabs';
|
|
5
|
-
import { Alert, AlertDescription } from '@/components/radix/Alert';
|
|
6
|
-
import { JsonHighlight } from '@/components/JsonHighlight';
|
|
7
|
-
import { CursorDeeplinkGenerator } from './CursorDeeplinkGenerator';
|
|
8
|
-
import {
|
|
9
|
-
MCP_AGENTS,
|
|
10
|
-
createMCPConfig,
|
|
11
|
-
GenerateInstallCommand,
|
|
12
|
-
type MCPAgent,
|
|
13
|
-
type PlatformType,
|
|
14
|
-
} from './mcp-helper';
|
|
15
|
-
import { useApiKey } from '@/features/metadata/hooks/useMetadata';
|
|
16
|
-
|
|
17
|
-
interface McpInstallerProps {
|
|
18
|
-
className?: string;
|
|
19
|
-
defaultAgent?: string;
|
|
20
|
-
TabListClassName?: string;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export function McpInstallation({
|
|
24
|
-
className,
|
|
25
|
-
defaultAgent = 'cursor',
|
|
26
|
-
TabListClassName,
|
|
27
|
-
}: McpInstallerProps) {
|
|
28
|
-
const [selectedAgent, setSelectedAgent] = useState<MCPAgent>(() => {
|
|
29
|
-
return MCP_AGENTS.find((agent) => agent.id === defaultAgent) || MCP_AGENTS[0];
|
|
30
|
-
});
|
|
31
|
-
const [activeTab, setActiveTab] = useState<PlatformType>('macos-linux');
|
|
32
|
-
|
|
33
|
-
const { apiKey } = useApiKey();
|
|
34
|
-
|
|
35
|
-
const handleTabChange = (value: string) => {
|
|
36
|
-
setActiveTab(value as PlatformType);
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
const mcpConfig = useMemo(() => {
|
|
40
|
-
return createMCPConfig(apiKey || '', activeTab, getBackendUrl());
|
|
41
|
-
}, [apiKey, activeTab]);
|
|
42
|
-
|
|
43
|
-
return (
|
|
44
|
-
<div className={cn('w-full flex flex-col gap-2 overflow-hidden', className)}>
|
|
45
|
-
{/* Agent Tabs */}
|
|
46
|
-
<Tabs
|
|
47
|
-
value={selectedAgent.id}
|
|
48
|
-
onValueChange={(value) => {
|
|
49
|
-
const agent = MCP_AGENTS.find((a) => a.id === value);
|
|
50
|
-
if (agent) {
|
|
51
|
-
setSelectedAgent(agent);
|
|
52
|
-
}
|
|
53
|
-
}}
|
|
54
|
-
>
|
|
55
|
-
<TabsList
|
|
56
|
-
className={cn(
|
|
57
|
-
'grid w-full grid-cols-7 bg-neutral-200 dark:bg-neutral-900 p-1 rounded-lg h-fit mb-2',
|
|
58
|
-
TabListClassName
|
|
59
|
-
)}
|
|
60
|
-
>
|
|
61
|
-
{MCP_AGENTS.map((agent) => (
|
|
62
|
-
<TabsTrigger
|
|
63
|
-
key={agent.id}
|
|
64
|
-
value={agent.id}
|
|
65
|
-
className="rounded-sm px-4 py-2 text-sm font-normal transition-all duration-200 flex flex-row items-center justify-start gap-1
|
|
66
|
-
data-[state=active]:bg-white dark:data-[state=active]:bg-neutral-700 dark:data-[state=active]:text-white data-[state=active]:text-gray-900 data-[state=active]:shadow-sm
|
|
67
|
-
data-[state=inactive]:text-gray-600 dark:data-[state=inactive]:text-neutral-400 data-[state=inactive]:hover:text-gray-900"
|
|
68
|
-
>
|
|
69
|
-
{agent.logo}
|
|
70
|
-
{agent.displayName}
|
|
71
|
-
</TabsTrigger>
|
|
72
|
-
))}
|
|
73
|
-
</TabsList>
|
|
74
|
-
|
|
75
|
-
{/* Content for each agent */}
|
|
76
|
-
{MCP_AGENTS.map((agent) => (
|
|
77
|
-
<TabsContent key={agent.id} value={agent.id} className="mt-0">
|
|
78
|
-
{agent.id !== 'mcp' ? (
|
|
79
|
-
<div className="bg-white dark:bg-neutral-700 px-6 py-8 flex flex-col items-start justify-start gap-4 rounded-xl border border-border-gray dark:border-neutral-700">
|
|
80
|
-
{agent.id === 'cursor' && (
|
|
81
|
-
<CursorDeeplinkGenerator apiKey={apiKey} os={activeTab} />
|
|
82
|
-
)}
|
|
83
|
-
{/* Alternative Installation */}
|
|
84
|
-
<p className="text-zinc-950 dark:text-neutral-300 text-sm">
|
|
85
|
-
{agent.id === 'cursor' ? 'or copy' : 'Copy'} the command below and paste it to
|
|
86
|
-
terminal
|
|
87
|
-
</p>
|
|
88
|
-
{/* Command Block */}
|
|
89
|
-
<CodeBlock
|
|
90
|
-
code={GenerateInstallCommand(agent, apiKey || '')}
|
|
91
|
-
className="bg-slate-50 dark:bg-neutral-800 w-full font-normal text-blue-800 dark:text-blue-400"
|
|
92
|
-
/>
|
|
93
|
-
</div>
|
|
94
|
-
) : (
|
|
95
|
-
<div className="px-6 py-8 bg-white dark:bg-neutral-800 overflow-hidden rounded-xl border border-border-gray dark:border-neutral-700">
|
|
96
|
-
<p className="text-zinc-950 dark:text-white text-sm mb-3">
|
|
97
|
-
Copy the configuration below and add it to your AI assistant.
|
|
98
|
-
</p>
|
|
99
|
-
|
|
100
|
-
{/* OS Tabs */}
|
|
101
|
-
<div className="flex items-center justify-between">
|
|
102
|
-
<Tabs value={activeTab} onValueChange={handleTabChange} className="w-full">
|
|
103
|
-
<TabsList className="grid w-60 grid-cols-2 bg-gray-100 dark:bg-neutral-900 p-1.5 rounded-lg h-fit">
|
|
104
|
-
<TabsTrigger
|
|
105
|
-
value="macos-linux"
|
|
106
|
-
className="h-7 rounded-sm px-3 py-1 text-sm font-medium transition-all duration-200
|
|
107
|
-
data-[state=active]:bg-white dark:data-[state=active]:bg-neutral-700 dark:data-[state=active]:text-white data-[state=active]:text-gray-900 data-[state=active]:shadow-sm
|
|
108
|
-
data-[state=inactive]:text-gray-600 dark:data-[state=inactive]:text-neutral-400 data-[state=inactive]:hover:text-gray-900"
|
|
109
|
-
>
|
|
110
|
-
MacOS/Linux
|
|
111
|
-
</TabsTrigger>
|
|
112
|
-
<TabsTrigger
|
|
113
|
-
value="windows"
|
|
114
|
-
className="h-7 rounded-sm px-3 py-1 text-sm font-medium transition-all duration-200
|
|
115
|
-
data-[state=active]:bg-white dark:data-[state=active]:bg-neutral-700 dark:data-[state=active]:text-white data-[state=active]:text-gray-900 data-[state=active]:shadow-sm
|
|
116
|
-
data-[state=inactive]:text-gray-600 dark:data-[state=inactive]:text-neutral-400 data-[state=inactive]:hover:text-gray-900"
|
|
117
|
-
>
|
|
118
|
-
Windows
|
|
119
|
-
</TabsTrigger>
|
|
120
|
-
</TabsList>
|
|
121
|
-
</Tabs>
|
|
122
|
-
</div>
|
|
123
|
-
|
|
124
|
-
{/* Configuration content */}
|
|
125
|
-
<div className="mt-1">
|
|
126
|
-
{!apiKey && (
|
|
127
|
-
<Alert className="border-yellow-200 bg-yellow-50 mb-4">
|
|
128
|
-
<AlertDescription className="text-yellow-800">
|
|
129
|
-
No API key found. Please ensure the backend is running and you're
|
|
130
|
-
logged in as an admin.
|
|
131
|
-
</AlertDescription>
|
|
132
|
-
</Alert>
|
|
133
|
-
)}
|
|
134
|
-
|
|
135
|
-
<JsonHighlight json={JSON.stringify(mcpConfig, null, 2)} />
|
|
136
|
-
</div>
|
|
137
|
-
</div>
|
|
138
|
-
)}
|
|
139
|
-
</TabsContent>
|
|
140
|
-
))}
|
|
141
|
-
</Tabs>
|
|
142
|
-
</div>
|
|
143
|
-
);
|
|
144
|
-
}
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
import { useState, useEffect } from 'react';
|
|
2
|
-
import { useNavigate, useSearchParams } from 'react-router-dom';
|
|
3
|
-
import { Button } from '@/components/radix/Button';
|
|
4
|
-
import { useOnboardStep, STEP_DESCRIPTIONS } from '@/lib/contexts/OnboardStepContext';
|
|
5
|
-
import { type OnboardStep } from '../types';
|
|
6
|
-
import { LinearStepper } from '@/components/Stepper';
|
|
7
|
-
import { StepContent } from '../components/StepContent';
|
|
8
|
-
import { CompletionCard } from '../components/CompletionCard';
|
|
9
|
-
|
|
10
|
-
export default function OnBoardPage() {
|
|
11
|
-
const navigate = useNavigate();
|
|
12
|
-
const [searchParams, setSearchParams] = useSearchParams();
|
|
13
|
-
const { currentStep, updateStep, totalSteps } = useOnboardStep();
|
|
14
|
-
const [isCompleted, setIsCompleted] = useState(false);
|
|
15
|
-
|
|
16
|
-
// Handle reinstall with step parameter
|
|
17
|
-
useEffect(() => {
|
|
18
|
-
const stepParam = searchParams.get('step');
|
|
19
|
-
if (stepParam === '1') {
|
|
20
|
-
updateStep(1);
|
|
21
|
-
setIsCompleted(false);
|
|
22
|
-
setSearchParams({});
|
|
23
|
-
}
|
|
24
|
-
}, [searchParams, setSearchParams, updateStep]);
|
|
25
|
-
|
|
26
|
-
const handleDismiss = async () => {
|
|
27
|
-
await navigate('/dashboard');
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
const handleNext = () => {
|
|
31
|
-
if (currentStep < totalSteps) {
|
|
32
|
-
updateStep((currentStep + 1) as OnboardStep);
|
|
33
|
-
} else if (currentStep === totalSteps) {
|
|
34
|
-
setIsCompleted(true);
|
|
35
|
-
}
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
const handleBack = () => {
|
|
39
|
-
if (currentStep > 1) {
|
|
40
|
-
updateStep((currentStep - 1) as OnboardStep);
|
|
41
|
-
}
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
return (
|
|
45
|
-
<div className="min-h-screen bg-bg-gray dark:bg-neutral-900">
|
|
46
|
-
<div className="container max-w-[1080px] mx-auto px-6 py-12">
|
|
47
|
-
{/* Header with Linear Stepper */}
|
|
48
|
-
<div className="mb-12 space-y-3">
|
|
49
|
-
<h1 className="text-2xl font-bold text-black dark:text-white">Get Started</h1>
|
|
50
|
-
<LinearStepper
|
|
51
|
-
currentStep={currentStep}
|
|
52
|
-
totalSteps={totalSteps}
|
|
53
|
-
stepLabels={STEP_DESCRIPTIONS}
|
|
54
|
-
isCompleted={isCompleted}
|
|
55
|
-
/>
|
|
56
|
-
</div>
|
|
57
|
-
|
|
58
|
-
{/* Main Content Card */}
|
|
59
|
-
{isCompleted ? (
|
|
60
|
-
<CompletionCard />
|
|
61
|
-
) : (
|
|
62
|
-
<div className="space-y-3">
|
|
63
|
-
<p className="text-black dark:text-white text-lg font-semibold">
|
|
64
|
-
{STEP_DESCRIPTIONS[currentStep - 1]}
|
|
65
|
-
</p>
|
|
66
|
-
<StepContent step={currentStep} />
|
|
67
|
-
|
|
68
|
-
{/* Action Buttons */}
|
|
69
|
-
<div className="flex justify-between items-center">
|
|
70
|
-
{/* Dismiss Button - Left */}
|
|
71
|
-
<Button
|
|
72
|
-
variant="outline"
|
|
73
|
-
onClick={() => void handleDismiss()}
|
|
74
|
-
className="h-10 w-30 py-2 text-zinc-950 dark:text-white dark:border-neutral-700 dark:bg-neutral-700"
|
|
75
|
-
>
|
|
76
|
-
Dismiss
|
|
77
|
-
</Button>
|
|
78
|
-
|
|
79
|
-
{/* Navigation Buttons - Right */}
|
|
80
|
-
<div className="flex space-x-4">
|
|
81
|
-
{currentStep > 1 && (
|
|
82
|
-
<Button
|
|
83
|
-
variant="outline"
|
|
84
|
-
onClick={() => void handleBack()}
|
|
85
|
-
className="h-10 w-30 text-zinc-950 dark:text-white dark:border-neutral-700 dark:bg-neutral-700"
|
|
86
|
-
>
|
|
87
|
-
Back
|
|
88
|
-
</Button>
|
|
89
|
-
)}
|
|
90
|
-
<Button
|
|
91
|
-
variant="default"
|
|
92
|
-
onClick={() => void handleNext()}
|
|
93
|
-
className="h-10 w-30 dark:bg-emerald-300 dark:text-black dark:hover:bg-emerald-200 disabled:opacity-50 disabled:cursor-not-allowed"
|
|
94
|
-
>
|
|
95
|
-
{currentStep === totalSteps ? 'Complete' : 'Next'}
|
|
96
|
-
</Button>
|
|
97
|
-
</div>
|
|
98
|
-
</div>
|
|
99
|
-
</div>
|
|
100
|
-
)}
|
|
101
|
-
</div>
|
|
102
|
-
</div>
|
|
103
|
-
);
|
|
104
|
-
}
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import React, { createContext, useContext, useState, useEffect } from 'react';
|
|
2
|
-
import { OnboardStep, TOTAL_STEPS } from '@/features/onboard/types';
|
|
3
|
-
|
|
4
|
-
interface OnboardContextValue {
|
|
5
|
-
currentStep: OnboardStep;
|
|
6
|
-
updateStep: (step: OnboardStep) => void;
|
|
7
|
-
getCurrentDescription: () => string;
|
|
8
|
-
totalSteps: number;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
const ONBOARD_STORAGE_KEY = 'insforge_onboard_step';
|
|
12
|
-
export const STEP_DESCRIPTIONS = [
|
|
13
|
-
'Install Node.js',
|
|
14
|
-
'Install InsForge',
|
|
15
|
-
'Test the Connection',
|
|
16
|
-
'Start Using InsForge',
|
|
17
|
-
] as const;
|
|
18
|
-
|
|
19
|
-
const OnboardContext = createContext<OnboardContextValue | null>(null);
|
|
20
|
-
|
|
21
|
-
export function OnboardStepProvider({ children }: { children: React.ReactNode }) {
|
|
22
|
-
const [currentStep, setCurrentStep] = useState<OnboardStep>(() => {
|
|
23
|
-
const saved = localStorage.getItem(ONBOARD_STORAGE_KEY);
|
|
24
|
-
const n = saved ? parseInt(saved, 10) : NaN;
|
|
25
|
-
return n >= OnboardStep.INSTALL_NODEJS && n <= OnboardStep.FINAL_SETUP
|
|
26
|
-
? (n as OnboardStep)
|
|
27
|
-
: OnboardStep.INSTALL_NODEJS;
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
useEffect(() => {
|
|
31
|
-
const onStorage = (e: StorageEvent) => {
|
|
32
|
-
if (e.key === ONBOARD_STORAGE_KEY && e.newValue) {
|
|
33
|
-
const n = parseInt(e.newValue, 10) as OnboardStep;
|
|
34
|
-
if (n >= OnboardStep.INSTALL_NODEJS && n <= OnboardStep.FINAL_SETUP) {
|
|
35
|
-
setCurrentStep(n);
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
};
|
|
39
|
-
window.addEventListener('storage', onStorage);
|
|
40
|
-
return () => window.removeEventListener('storage', onStorage);
|
|
41
|
-
}, []);
|
|
42
|
-
|
|
43
|
-
const updateStep = (step: OnboardStep) => {
|
|
44
|
-
if (step < OnboardStep.INSTALL_NODEJS || step > OnboardStep.FINAL_SETUP) {
|
|
45
|
-
return;
|
|
46
|
-
}
|
|
47
|
-
setCurrentStep(step);
|
|
48
|
-
localStorage.setItem(ONBOARD_STORAGE_KEY, step.toString());
|
|
49
|
-
};
|
|
50
|
-
|
|
51
|
-
const getCurrentDescription = () => STEP_DESCRIPTIONS[currentStep - 1];
|
|
52
|
-
|
|
53
|
-
return (
|
|
54
|
-
<OnboardContext.Provider
|
|
55
|
-
value={{ currentStep, updateStep, getCurrentDescription, totalSteps: TOTAL_STEPS }}
|
|
56
|
-
>
|
|
57
|
-
{children}
|
|
58
|
-
</OnboardContext.Provider>
|
|
59
|
-
);
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
export function useOnboardStep() {
|
|
63
|
-
const ctx = useContext(OnboardContext);
|
|
64
|
-
if (!ctx) {
|
|
65
|
-
throw new Error('useOnboardStep must be used within an OnboardProvider');
|
|
66
|
-
}
|
|
67
|
-
return ctx;
|
|
68
|
-
}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { useMemo } from 'react';
|
|
2
|
-
|
|
3
|
-
const ONBOARDING_COMPLETION_KEY = 'insforge_onboarding_completed';
|
|
4
|
-
|
|
5
|
-
export function useOnboardingCompletion() {
|
|
6
|
-
const isCompleted = useMemo<boolean>(() => {
|
|
7
|
-
const stored = localStorage.getItem(ONBOARDING_COMPLETION_KEY);
|
|
8
|
-
return stored === 'true';
|
|
9
|
-
}, []);
|
|
10
|
-
|
|
11
|
-
const markAsCompleted = () => {
|
|
12
|
-
localStorage.setItem(ONBOARDING_COMPLETION_KEY, 'true');
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
const resetCompletion = () => {
|
|
16
|
-
localStorage.setItem(ONBOARDING_COMPLETION_KEY, 'false');
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
return {
|
|
20
|
-
isCompleted,
|
|
21
|
-
markAsCompleted,
|
|
22
|
-
resetCompletion,
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
// Export utility function for direct usage
|
|
27
|
-
export const markOnboardingAsCompleted = () => {
|
|
28
|
-
localStorage.setItem(ONBOARDING_COMPLETION_KEY, 'true');
|
|
29
|
-
};
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/backend/{migrations → src/infra/database/migrations}/001_create-helper-functions.sql
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/backend/{migrations → src/infra/database/migrations}/004_add-reload-postgrest-func.sql
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/backend/{migrations → src/infra/database/migrations}/010_modify-ai-config-modalities.sql
RENAMED
|
File without changes
|
/package/backend/{migrations → src/infra/database/migrations}/011_refactor-secrets-table.sql
RENAMED
|
File without changes
|
/package/backend/{migrations → src/infra/database/migrations}/012_add-storage-uploaded-by.sql
RENAMED
|
File without changes
|
|
File without changes
|