insforge 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.dockerignore +58 -0
- package/.env.example +49 -0
- package/.github/ISSUE_TEMPLATE/bug_report.yml +83 -0
- package/.github/ISSUE_TEMPLATE/config.yml +11 -0
- package/.github/ISSUE_TEMPLATE/feature_request.yml +79 -0
- package/.github/copilot-instructions.md +147 -0
- package/.github/workflows/build-image.yml +65 -0
- package/.github/workflows/ci-premerge-check.yml +24 -0
- package/.github/workflows/deploy-aws.yml +130 -0
- package/.github/workflows/lint-and-format.yml +33 -0
- package/.prettierignore +65 -0
- package/.prettierrc +9 -0
- package/CHANGELOG.md +3 -0
- package/CONTRIBUTING.md +126 -0
- package/Dockerfile +27 -0
- package/GITHUB_OAUTH_SETUP.md +49 -0
- package/GOOGLE_OAUTH_SETUP.md +148 -0
- package/LICENSE +201 -0
- package/README.md +134 -0
- package/assets/Dark.svg +23 -0
- package/assets/archDiagram.png +0 -0
- package/assets/banner.png +0 -0
- package/assets/mcpInstallv2.png +0 -0
- package/assets/sampleResponse.png +0 -0
- package/assets/signin.png +0 -0
- package/assets/userflow.png +0 -0
- package/backend/migrations/000_create-base-tables.sql +142 -0
- package/backend/migrations/001_create-helper-functions.sql +41 -0
- package/backend/migrations/002_rename-auth-tables.sql +30 -0
- package/backend/migrations/003_create-users-table.sql +56 -0
- package/backend/migrations/004_add-reload-postgrest-func.sql +24 -0
- package/backend/migrations/005_enable-project-admin-modify-users.sql +30 -0
- package/backend/migrations/006_modify-ai-usage-table.sql +25 -0
- package/backend/migrations/007_drop-metadata-table.sql +2 -0
- package/backend/migrations/008_add-system-tables.sql +77 -0
- package/backend/migrations/009_add-function-secrets.sql +24 -0
- package/backend/migrations/010_modify-ai-config-modalities.sql +93 -0
- package/backend/migrations/011_refactor-secrets-table.sql +15 -0
- package/backend/migrations/012_add-storage-uploaded-by.sql +8 -0
- package/backend/package.json +75 -0
- package/backend/src/api/middleware/auth.ts +240 -0
- package/backend/src/api/middleware/error.ts +231 -0
- package/backend/src/api/middleware/upload.ts +59 -0
- package/backend/src/api/routes/agent.ts +29 -0
- package/backend/src/api/routes/ai.ts +472 -0
- package/backend/src/api/routes/auth.oauth.ts +482 -0
- package/backend/src/api/routes/auth.ts +386 -0
- package/backend/src/api/routes/database.advance.ts +275 -0
- package/backend/src/api/routes/database.records.ts +246 -0
- package/backend/src/api/routes/database.tables.ts +161 -0
- package/backend/src/api/routes/docs.ts +66 -0
- package/backend/src/api/routes/functions.ts +183 -0
- package/backend/src/api/routes/logs.ts +150 -0
- package/backend/src/api/routes/metadata.ts +160 -0
- package/backend/src/api/routes/openapi.ts +82 -0
- package/backend/src/api/routes/secrets.ts +199 -0
- package/backend/src/api/routes/storage.ts +547 -0
- package/backend/src/api/routes/usage.ts +96 -0
- package/backend/src/core/ai/chat.ts +207 -0
- package/backend/src/core/ai/client.ts +242 -0
- package/backend/src/core/ai/config.ts +187 -0
- package/backend/src/core/ai/image.ts +156 -0
- package/backend/src/core/ai/model.ts +117 -0
- package/backend/src/core/ai/usage.ts +290 -0
- package/backend/src/core/auth/auth.ts +781 -0
- package/backend/src/core/auth/oauth.ts +398 -0
- package/backend/src/core/database/advance.ts +1074 -0
- package/backend/src/core/database/manager.ts +178 -0
- package/backend/src/core/database/table.ts +772 -0
- package/backend/src/core/documentation/agent.ts +689 -0
- package/backend/src/core/documentation/openapi.ts +856 -0
- package/backend/src/core/functions/functions.ts +310 -0
- package/backend/src/core/logs/analytics.ts +76 -0
- package/backend/src/core/logs/audit.ts +255 -0
- package/backend/src/core/logs/providers/base.provider.ts +83 -0
- package/backend/src/core/logs/providers/cloudwatch.provider.ts +510 -0
- package/backend/src/core/logs/providers/localdb.provider.ts +246 -0
- package/backend/src/core/secrets/encryption.ts +58 -0
- package/backend/src/core/secrets/secrets.ts +410 -0
- package/backend/src/core/socket/socket.ts +388 -0
- package/backend/src/core/socket/types.ts +79 -0
- package/backend/src/core/storage/storage.ts +923 -0
- package/backend/src/server.ts +288 -0
- package/backend/src/types/ai.ts +46 -0
- package/backend/src/types/auth.ts +90 -0
- package/backend/src/types/database.ts +136 -0
- package/backend/src/types/error-constants.ts +86 -0
- package/backend/src/types/logs.ts +47 -0
- package/backend/src/types/profile.ts +55 -0
- package/backend/src/types/storage.ts +23 -0
- package/backend/src/utils/cloud-token.ts +39 -0
- package/backend/src/utils/constants.ts +1 -0
- package/backend/src/utils/environment.ts +35 -0
- package/backend/src/utils/helpers.ts +49 -0
- package/backend/src/utils/logger.ts +13 -0
- package/backend/src/utils/response.ts +62 -0
- package/backend/src/utils/seed.ts +205 -0
- package/backend/src/utils/sql-parser.ts +63 -0
- package/backend/src/utils/uuid.ts +9 -0
- package/backend/src/utils/validations.ts +129 -0
- package/backend/tests/README.md +134 -0
- package/backend/tests/cleanup-all-test-data.sh +231 -0
- package/backend/tests/cloud/test-s3-multitenant.sh +132 -0
- package/backend/tests/local/comprehensive-curl-tests.sh +156 -0
- package/backend/tests/local/test-auth-router.sh +144 -0
- package/backend/tests/local/test-database-router.sh +222 -0
- package/backend/tests/local/test-e2e.sh +241 -0
- package/backend/tests/local/test-fk-errors.sh +97 -0
- package/backend/tests/local/test-id-field.sh +201 -0
- package/backend/tests/local/test-public-bucket.sh +265 -0
- package/backend/tests/local/test-secrets.sh +248 -0
- package/backend/tests/local/test-serverless-functions.sh.disabled +325 -0
- package/backend/tests/local/test-traditional-rest.sh +209 -0
- package/backend/tests/manual/README.md +51 -0
- package/backend/tests/manual/create-large-table-simple.sql +11 -0
- package/backend/tests/manual/seed-large-table.sql +101 -0
- package/backend/tests/manual/setup-large-table-extras.sql +34 -0
- package/backend/tests/manual/test-better-auth.sh +303 -0
- package/backend/tests/manual/test-bulk-upsert.sh +410 -0
- package/backend/tests/manual/test-database-advance.sh +297 -0
- package/backend/tests/manual/test-postgrest-stability.sh +192 -0
- package/backend/tests/manual/test-rawsql-export-import.sh +412 -0
- package/backend/tests/manual/test-universal-storage.sh +264 -0
- package/backend/tests/manual/test-users.sql +18 -0
- package/backend/tests/run-all-tests.sh +140 -0
- package/backend/tests/setup.ts +22 -0
- package/backend/tests/test-config.sh +303 -0
- package/backend/tsconfig.json +23 -0
- package/backend/tsup.config.ts +18 -0
- package/backend/vitest.config.ts +22 -0
- package/docker-compose.prod.yml +145 -0
- package/docker-compose.yml +167 -0
- package/docker-init/db/db-init.sql +125 -0
- package/docker-init/db/jwt.sql +5 -0
- package/docker-init/db/logs.sql +9 -0
- package/docker-init/db/postgresql.conf +17 -0
- package/docs/deprecated/insforge-auth-api.md +215 -0
- package/docs/deprecated/insforge-auth-sdk.md +100 -0
- package/docs/deprecated/insforge-db-api.md +359 -0
- package/docs/deprecated/insforge-db-sdk.md +140 -0
- package/docs/deprecated/insforge-debug-sdk.md +157 -0
- package/docs/deprecated/insforge-debug.md +65 -0
- package/docs/deprecated/insforge-instructions.md +124 -0
- package/docs/deprecated/insforge-project.md +118 -0
- package/docs/deprecated/insforge-storage-api.md +279 -0
- package/docs/deprecated/insforge-storage-sdk.md +159 -0
- package/docs/insforge-instructions-sdk.md +407 -0
- package/eslint.config.js +317 -0
- package/examples/oauth/frontend-oauth-example.html +251 -0
- package/examples/response-examples.md +444 -0
- package/frontend/README.md +112 -0
- package/frontend/components.json +17 -0
- package/frontend/index.html +13 -0
- package/frontend/package.json +63 -0
- package/frontend/public/favicon.ico +0 -0
- package/frontend/src/App.tsx +106 -0
- package/frontend/src/assets/icons/checkbox_checked.svg +6 -0
- package/frontend/src/assets/icons/checkbox_undetermined.svg +6 -0
- package/frontend/src/assets/icons/checked.svg +3 -0
- package/frontend/src/assets/icons/error.svg +3 -0
- package/frontend/src/assets/icons/pencil.svg +4 -0
- package/frontend/src/assets/icons/refresh.svg +4 -0
- package/frontend/src/assets/icons/step_active.svg +3 -0
- package/frontend/src/assets/icons/step_inactive.svg +11 -0
- package/frontend/src/assets/icons/warning.svg +3 -0
- package/frontend/src/assets/logos/amazon.svg +1 -0
- package/frontend/src/assets/logos/claude_code.svg +3 -0
- package/frontend/src/assets/logos/cline.svg +6 -0
- package/frontend/src/assets/logos/cursor.svg +20 -0
- package/frontend/src/assets/logos/discord.svg +9 -0
- package/frontend/src/assets/logos/gemini.svg +19 -0
- package/frontend/src/assets/logos/github.svg +5 -0
- package/frontend/src/assets/logos/google.svg +13 -0
- package/frontend/src/assets/logos/grok.svg +10 -0
- package/frontend/src/assets/logos/insforge_dark.svg +15 -0
- package/frontend/src/assets/logos/insforge_light.svg +15 -0
- package/frontend/src/assets/logos/openai.svg +10 -0
- package/frontend/src/assets/logos/roo_code.svg +9 -0
- package/frontend/src/assets/logos/trae.svg +3 -0
- package/frontend/src/assets/logos/windsurf.svg +10 -0
- package/frontend/src/components/ButtonWithLoading.tsx +27 -0
- package/frontend/src/components/Checkbox.tsx +61 -0
- package/frontend/src/components/CodeBlock.tsx +32 -0
- package/frontend/src/components/ConfirmDialog.tsx +96 -0
- package/frontend/src/components/CopyButton.tsx +69 -0
- package/frontend/src/components/DeleteActionButton.tsx +42 -0
- package/frontend/src/components/EmptyState.tsx +41 -0
- package/frontend/src/components/ErrorState.tsx +35 -0
- package/frontend/src/components/FeatureSidebar.tsx +126 -0
- package/frontend/src/components/FeatureSidebarItem.tsx +101 -0
- package/frontend/src/components/JsonHighlight.tsx +61 -0
- package/frontend/src/components/LoadingState.tsx +16 -0
- package/frontend/src/components/PaginationControls.tsx +54 -0
- package/frontend/src/components/PromptDialog.tsx +68 -0
- package/frontend/src/components/SearchInput.tsx +90 -0
- package/frontend/src/components/SelectionClearButton.tsx +26 -0
- package/frontend/src/components/Stepper.tsx +139 -0
- package/frontend/src/components/ThemeToggle.tsx +58 -0
- package/frontend/src/components/TypeBadge.tsx +20 -0
- package/frontend/src/components/datagrid/DataGrid.tsx +264 -0
- package/frontend/src/components/datagrid/DefaultCellRenderer.tsx +114 -0
- package/frontend/src/components/datagrid/IdCell.tsx +44 -0
- package/frontend/src/components/datagrid/SortableHeader.tsx +74 -0
- package/frontend/src/components/datagrid/cell-editors/BooleanCellEditor.tsx +54 -0
- package/frontend/src/components/datagrid/cell-editors/DateCellEditor.tsx +483 -0
- package/frontend/src/components/datagrid/cell-editors/JsonCellEditor.tsx +362 -0
- package/frontend/src/components/datagrid/cell-editors/TextCellEditor.tsx +38 -0
- package/frontend/src/components/datagrid/cell-editors/index.ts +14 -0
- package/frontend/src/components/datagrid/cell-editors/types.ts +43 -0
- package/frontend/src/components/datagrid/datagridTypes.tsx +72 -0
- package/frontend/src/components/datagrid/index.tsx +20 -0
- package/frontend/src/components/index.ts +39 -0
- package/frontend/src/components/layout/AppHeader.tsx +146 -0
- package/frontend/src/components/layout/AppSidebar.tsx +190 -0
- package/frontend/src/components/layout/CloudLayout.tsx +95 -0
- package/frontend/src/components/layout/Layout.tsx +43 -0
- package/frontend/src/components/radix/Alert.tsx +45 -0
- package/frontend/src/components/radix/AlertDialog.tsx +115 -0
- package/frontend/src/components/radix/Avatar.tsx +45 -0
- package/frontend/src/components/radix/Badge.tsx +33 -0
- package/frontend/src/components/radix/Button.tsx +50 -0
- package/frontend/src/components/radix/Card.tsx +58 -0
- package/frontend/src/components/radix/Dialog.tsx +98 -0
- package/frontend/src/components/radix/DropdownMenu.tsx +185 -0
- package/frontend/src/components/radix/Form.tsx +167 -0
- package/frontend/src/components/radix/Input.tsx +22 -0
- package/frontend/src/components/radix/Label.tsx +19 -0
- package/frontend/src/components/radix/Popover.tsx +29 -0
- package/frontend/src/components/radix/ScrollArea.tsx +44 -0
- package/frontend/src/components/radix/Select.tsx +151 -0
- package/frontend/src/components/radix/Separator.tsx +26 -0
- package/frontend/src/components/radix/Sheet.tsx +119 -0
- package/frontend/src/components/radix/Skeleton.tsx +7 -0
- package/frontend/src/components/radix/Switch.tsx +29 -0
- package/frontend/src/components/radix/Tabs.tsx +50 -0
- package/frontend/src/components/radix/Textarea.tsx +21 -0
- package/frontend/src/components/radix/Tooltip.tsx +28 -0
- package/frontend/src/features/ai/components/AIConfigCard.tsx +154 -0
- package/frontend/src/features/ai/components/AIConfigDialog.tsx +76 -0
- package/frontend/src/features/ai/components/AIConfigForm.tsx +222 -0
- package/frontend/src/features/ai/components/AIEmptyState.tsx +18 -0
- package/frontend/src/features/ai/components/fields/ModalityField.tsx +87 -0
- package/frontend/src/features/ai/components/fields/ModelSelectionField.tsx +134 -0
- package/frontend/src/features/ai/components/fields/SystemPromptField.tsx +33 -0
- package/frontend/src/features/ai/helpers.ts +155 -0
- package/frontend/src/features/ai/hooks/useAIConfigs.ts +221 -0
- package/frontend/src/features/ai/hooks/useAIUsage.ts +77 -0
- package/frontend/src/features/ai/page/AIPage.tsx +178 -0
- package/frontend/src/features/ai/services/ai.service.ts +148 -0
- package/frontend/src/features/auth/components/AddOAuthDialog.tsx +106 -0
- package/frontend/src/features/auth/components/AuthMethodTab.tsx +238 -0
- package/frontend/src/features/auth/components/OAuthConfigDialog.tsx +303 -0
- package/frontend/src/features/auth/components/OAuthEmptyState.tsx +15 -0
- package/frontend/src/features/auth/components/UserFormDialog.tsx +248 -0
- package/frontend/src/features/auth/components/UsersDataGrid.tsx +183 -0
- package/frontend/src/features/auth/components/UsersTab.tsx +114 -0
- package/frontend/src/features/auth/hooks/useOAuthConfig.ts +129 -0
- package/frontend/src/features/auth/hooks/useUsers.ts +57 -0
- package/frontend/src/features/auth/index.ts +9 -0
- package/frontend/src/features/auth/page/AuthenticationPage.tsx +169 -0
- package/frontend/src/features/auth/services/auth.service.ts +112 -0
- package/frontend/src/features/auth/services/oauth.service.ts +49 -0
- package/frontend/src/features/dashboard/page/DashboardPage.tsx +194 -0
- package/frontend/src/features/database/components/ColumnTypeSelect.tsx +64 -0
- package/frontend/src/features/database/components/DatabaseDataGrid.tsx +282 -0
- package/frontend/src/features/database/components/ForeignKeyCell.tsx +187 -0
- package/frontend/src/features/database/components/ForeignKeyPopover.tsx +378 -0
- package/frontend/src/features/database/components/LinkRecordModal.tsx +288 -0
- package/frontend/src/features/database/components/RecordFormDialog.tsx +164 -0
- package/frontend/src/features/database/components/RecordFormField.tsx +568 -0
- package/frontend/src/features/database/components/TableEmptyState.tsx +21 -0
- package/frontend/src/features/database/components/TableForm.tsx +656 -0
- package/frontend/src/features/database/components/TableFormColumn.tsx +137 -0
- package/frontend/src/features/database/components/TableListSkeleton.tsx +9 -0
- package/frontend/src/features/database/components/TableSidebar.tsx +47 -0
- package/frontend/src/features/database/constants.ts +26 -0
- package/frontend/src/features/database/helpers.ts +125 -0
- package/frontend/src/features/database/hooks/UseLinkModal.tsx +78 -0
- package/frontend/src/features/database/index.ts +12 -0
- package/frontend/src/features/database/page/DatabasePage.tsx +626 -0
- package/frontend/src/features/database/schema.ts +25 -0
- package/frontend/src/features/database/services/database.service.ts +216 -0
- package/frontend/src/features/functions/components/FunctionEmptyState.tsx +15 -0
- package/frontend/src/features/functions/components/FunctionRow.tsx +71 -0
- package/frontend/src/features/functions/components/FunctionViewer.tsx +46 -0
- package/frontend/src/features/functions/components/FunctionsContent.tsx +88 -0
- package/frontend/src/features/functions/components/FunctionsSidebar.tsx +56 -0
- package/frontend/src/features/functions/components/SecretEmptyState.tsx +23 -0
- package/frontend/src/features/functions/components/SecretRow.tsx +68 -0
- package/frontend/src/features/functions/components/SecretsContent.tsx +120 -0
- package/frontend/src/features/functions/hooks/useFunctions.ts +106 -0
- package/frontend/src/features/functions/page/FunctionsPage.tsx +28 -0
- package/frontend/src/features/functions/services/functions.service.ts +48 -0
- package/frontend/src/features/login/components/AuthErrorBoundary.tsx +87 -0
- package/frontend/src/features/login/components/PrivateRoute.tsx +24 -0
- package/frontend/src/features/login/page/CloudLoginPage.tsx +93 -0
- package/frontend/src/features/login/page/LoginPage.tsx +174 -0
- package/frontend/src/features/logs/components/AnalyticsLogsTable.tsx +313 -0
- package/frontend/src/features/logs/components/LogsTable.tsx +199 -0
- package/frontend/src/features/logs/hooks/useAuditLogs.ts +39 -0
- package/frontend/src/features/logs/index.ts +5 -0
- package/frontend/src/features/logs/page/AnalyticsLogsPage.tsx +530 -0
- package/frontend/src/features/logs/page/AuditsPage.tsx +192 -0
- package/frontend/src/features/logs/services/log.service.ts +171 -0
- package/frontend/src/features/metadata/hooks/useMetadata.ts +53 -0
- package/frontend/src/features/metadata/index.ts +0 -0
- package/frontend/src/features/metadata/page/MetadataPage.tsx +136 -0
- package/frontend/src/features/metadata/services/metadata.service.ts +17 -0
- package/frontend/src/features/onboard/components/CompletionCard.tsx +41 -0
- package/frontend/src/features/onboard/components/OnboardButton.tsx +84 -0
- package/frontend/src/features/onboard/components/StepContent.tsx +91 -0
- package/frontend/src/features/onboard/components/TestConnectionStep.tsx +53 -0
- package/frontend/src/features/onboard/components/mcp/CursorDeeplinkGenerator.tsx +35 -0
- package/frontend/src/features/onboard/components/mcp/McpInstallation.tsx +144 -0
- package/frontend/src/features/onboard/components/mcp/index.ts +4 -0
- package/frontend/src/features/onboard/components/mcp/mcp-helper.tsx +98 -0
- package/frontend/src/features/onboard/index.ts +3 -0
- package/frontend/src/features/onboard/page/OnBoardPage.tsx +104 -0
- package/frontend/src/features/onboard/types.ts +8 -0
- package/frontend/src/features/secrets/hooks/useSecrets.ts +139 -0
- package/frontend/src/features/secrets/services/secrets.service.ts +57 -0
- package/frontend/src/features/storage/components/BucketEmptyState.tsx +19 -0
- package/frontend/src/features/storage/components/BucketFormDialog.tsx +194 -0
- package/frontend/src/features/storage/components/BucketListSkeleton.tsx +17 -0
- package/frontend/src/features/storage/components/FilePreviewDialog.tsx +287 -0
- package/frontend/src/features/storage/components/StorageDataGrid.tsx +239 -0
- package/frontend/src/features/storage/components/StorageManager.tsx +236 -0
- package/frontend/src/features/storage/components/StorageSidebar.tsx +44 -0
- package/frontend/src/features/storage/components/UploadToast.tsx +46 -0
- package/frontend/src/features/storage/index.ts +3 -0
- package/frontend/src/features/storage/page/StoragePage.tsx +553 -0
- package/frontend/src/features/storage/services/storage.service.ts +144 -0
- package/frontend/src/features/visualizer/components/AuthNode.tsx +107 -0
- package/frontend/src/features/visualizer/components/BucketNode.tsx +34 -0
- package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +359 -0
- package/frontend/src/features/visualizer/components/TableNode.tsx +152 -0
- package/frontend/src/features/visualizer/components/VisualizerSkeleton.tsx +24 -0
- package/frontend/src/features/visualizer/components/index.ts +5 -0
- package/frontend/src/features/visualizer/page/VisualizerPage.tsx +127 -0
- package/frontend/src/index.css +248 -0
- package/frontend/src/lib/api/client.ts +163 -0
- package/frontend/src/lib/contexts/AuthContext.tsx +157 -0
- package/frontend/src/lib/contexts/OnboardStepContext.tsx +68 -0
- package/frontend/src/lib/contexts/SocketContext.tsx +303 -0
- package/frontend/src/lib/contexts/ThemeContext.tsx +125 -0
- package/frontend/src/lib/hooks/useAuth.ts +4 -0
- package/frontend/src/lib/hooks/useConfirm.ts +55 -0
- package/frontend/src/lib/hooks/useInterval.ts +27 -0
- package/frontend/src/lib/hooks/useMediaQuery.ts +59 -0
- package/frontend/src/lib/hooks/useOnboardingCompletion.ts +29 -0
- package/frontend/src/lib/hooks/usePagination.ts +27 -0
- package/frontend/src/lib/hooks/useTimeout.ts +27 -0
- package/frontend/src/lib/hooks/useToast.tsx +229 -0
- package/frontend/src/lib/utils/constants.ts +38 -0
- package/frontend/src/lib/utils/utils.ts +165 -0
- package/frontend/src/lib/utils/validation-schemas.ts +126 -0
- package/frontend/src/main.tsx +16 -0
- package/frontend/src/rdg.css +194 -0
- package/frontend/src/vite-env.d.ts +12 -0
- package/frontend/tailwind.config.js +97 -0
- package/frontend/tsconfig.json +26 -0
- package/frontend/tsconfig.node.json +10 -0
- package/frontend/vite.config.ts +37 -0
- package/frontend/vitest.config.ts +36 -0
- package/functions/deno.json +25 -0
- package/functions/server.ts +290 -0
- package/functions/worker-template.js +126 -0
- package/openapi/ai.yaml +689 -0
- package/openapi/auth.yaml +563 -0
- package/openapi/functions.yaml +476 -0
- package/openapi/health.yaml +30 -0
- package/openapi/logs.yaml +224 -0
- package/openapi/metadata.yaml +178 -0
- package/openapi/records.yaml +382 -0
- package/openapi/secrets.yaml +371 -0
- package/openapi/storage.yaml +876 -0
- package/openapi/tables.yaml +464 -0
- package/package.json +88 -0
- package/shared-schemas/package.json +31 -0
- package/shared-schemas/src/ai-api.schema.ts +167 -0
- package/shared-schemas/src/ai.schema.ts +54 -0
- package/shared-schemas/src/auth-api.schema.ts +193 -0
- package/shared-schemas/src/auth.schema.ts +94 -0
- package/shared-schemas/src/database-api.schema.ts +259 -0
- package/shared-schemas/src/database.schema.ts +69 -0
- package/shared-schemas/src/functions-api.schema.ts +25 -0
- package/shared-schemas/src/functions.schema.ts +16 -0
- package/shared-schemas/src/index.ts +13 -0
- package/shared-schemas/src/logs-api.schema.ts +49 -0
- package/shared-schemas/src/logs.schema.ts +14 -0
- package/shared-schemas/src/metadata.schema.ts +56 -0
- package/shared-schemas/src/storage-api.schema.ts +65 -0
- package/shared-schemas/src/storage.schema.ts +19 -0
- package/shared-schemas/tsconfig.json +21 -0
- package/tsconfig.json +8 -0
|
@@ -0,0 +1,84 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { useMemo } from 'react';
|
|
2
|
+
import { createMCPServerConfig, type PlatformType } from './mcp-helper';
|
|
3
|
+
import CursorLogo from '@/assets/logos/cursor.svg?react';
|
|
4
|
+
import { getBackendUrl } from '@/lib/utils/utils';
|
|
5
|
+
|
|
6
|
+
interface CursorDeeplinkGeneratorProps {
|
|
7
|
+
apiKey?: string;
|
|
8
|
+
os?: PlatformType;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function CursorDeeplinkGenerator({
|
|
12
|
+
apiKey,
|
|
13
|
+
os = 'macos-linux',
|
|
14
|
+
}: CursorDeeplinkGeneratorProps) {
|
|
15
|
+
const deeplink = useMemo(() => {
|
|
16
|
+
const config = createMCPServerConfig(apiKey || '', os, getBackendUrl());
|
|
17
|
+
const configString = JSON.stringify(config);
|
|
18
|
+
const base64Config = btoa(configString);
|
|
19
|
+
return `cursor://anysphere.cursor-deeplink/mcp/install?name=insforge&config=${encodeURIComponent(base64Config)}`;
|
|
20
|
+
}, [apiKey, os]);
|
|
21
|
+
|
|
22
|
+
const handleOpenInCursor = () => {
|
|
23
|
+
window.open(deeplink, '_blank');
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
return (
|
|
27
|
+
<button
|
|
28
|
+
onClick={handleOpenInCursor}
|
|
29
|
+
className="bg-black py-2 px-4 flex items-center justify-center gap-2.5 rounded-md text-white text-sm font-medium"
|
|
30
|
+
>
|
|
31
|
+
<CursorLogo className="h-6 w-6" />
|
|
32
|
+
<span>Add to Cursor</span>
|
|
33
|
+
</button>
|
|
34
|
+
);
|
|
35
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { ReactElement } from 'react';
|
|
2
|
+
export interface MCPAgent {
|
|
3
|
+
id: string;
|
|
4
|
+
displayName: string;
|
|
5
|
+
logo?: ReactElement;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
import TraeLogo from '@/assets/logos/trae.svg?react';
|
|
9
|
+
import CursorLogo from '@/assets/logos/cursor.svg?react';
|
|
10
|
+
import ClaudeLogo from '@/assets/logos/claude_code.svg?react';
|
|
11
|
+
import WindsurfLogo from '@/assets/logos/windsurf.svg?react';
|
|
12
|
+
import ClineLogo from '@/assets/logos/cline.svg?react';
|
|
13
|
+
import RooCodeLogo from '@/assets/logos/roo_code.svg';
|
|
14
|
+
import { getBackendUrl } from '@/lib/utils/utils';
|
|
15
|
+
// import CodexLogo from '@/assets/logos/openai.svg?react';
|
|
16
|
+
|
|
17
|
+
export type PlatformType = 'macos-linux' | 'windows';
|
|
18
|
+
|
|
19
|
+
export const GenerateInstallCommand = (agent: MCPAgent, apiKey: string) => {
|
|
20
|
+
return `npx @insforge/install --client ${agent.id} --env API_KEY=${apiKey} --env API_BASE_URL=${getBackendUrl()}`;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export const MCP_AGENTS: MCPAgent[] = [
|
|
24
|
+
{
|
|
25
|
+
id: 'trae',
|
|
26
|
+
displayName: 'Trae',
|
|
27
|
+
logo: <TraeLogo className="w-6 h-6" />,
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
id: 'cursor',
|
|
31
|
+
displayName: 'Cursor',
|
|
32
|
+
logo: <CursorLogo className="w-6 h-6" />,
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
id: 'claude-code',
|
|
36
|
+
displayName: 'Claude Code',
|
|
37
|
+
logo: <ClaudeLogo className="w-6 h-6" />,
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
id: 'windsurf',
|
|
41
|
+
displayName: 'Windsurf',
|
|
42
|
+
logo: <WindsurfLogo className="w-6 h-6 dark:text-white" />,
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
id: 'cline',
|
|
46
|
+
displayName: 'Cline',
|
|
47
|
+
logo: <ClineLogo className="w-6 h-6 dark:text-white" />,
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
id: 'roocode',
|
|
51
|
+
displayName: 'Roo Code',
|
|
52
|
+
logo: <img src={RooCodeLogo} alt="" className="dark:invert" />,
|
|
53
|
+
},
|
|
54
|
+
// {
|
|
55
|
+
// id: 'codex',
|
|
56
|
+
// displayName: 'Codex',
|
|
57
|
+
// logo: <CodexLogo className="w-5 h-5 dark:text-white" />,
|
|
58
|
+
// },
|
|
59
|
+
{
|
|
60
|
+
id: 'mcp',
|
|
61
|
+
displayName: 'MCP JSON',
|
|
62
|
+
},
|
|
63
|
+
];
|
|
64
|
+
|
|
65
|
+
// Core MCP server configuration builder
|
|
66
|
+
export const createMCPServerConfig = (
|
|
67
|
+
apiKey: string,
|
|
68
|
+
platform: PlatformType,
|
|
69
|
+
apiBaseUrl?: string
|
|
70
|
+
) => {
|
|
71
|
+
const env = {
|
|
72
|
+
API_KEY: apiKey,
|
|
73
|
+
API_BASE_URL: apiBaseUrl || window.location.origin,
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
if (platform === 'windows') {
|
|
77
|
+
return {
|
|
78
|
+
command: 'cmd',
|
|
79
|
+
args: ['/c', 'npx', '-y', '@insforge/mcp@latest'],
|
|
80
|
+
env,
|
|
81
|
+
};
|
|
82
|
+
} else {
|
|
83
|
+
return {
|
|
84
|
+
command: 'npx',
|
|
85
|
+
args: ['-y', '@insforge/mcp@latest'],
|
|
86
|
+
env,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
// Full MCP configuration for AI assistants
|
|
92
|
+
export const createMCPConfig = (apiKey: string, platform: PlatformType, apiBaseUrl?: string) => {
|
|
93
|
+
return {
|
|
94
|
+
mcpServers: {
|
|
95
|
+
insforge: createMCPServerConfig(apiKey, platform, apiBaseUrl),
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
};
|
|
@@ -0,0 +1,104 @@
|
|
|
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
|
+
}
|