insforge 1.3.0 → 1.4.8
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/CHANGELOG.md +2 -0
- package/auth/package.json +5 -3
- package/auth/src/lib/broadcastService.ts +115 -117
- package/auth/src/lib/insforge.ts +8 -0
- package/auth/src/main.tsx +2 -4
- package/auth/src/pages/SignInPage.tsx +60 -60
- package/auth/src/pages/SignUpPage.tsx +60 -60
- package/auth/src/pages/VerifyEmailPage.tsx +18 -0
- package/auth/tsconfig.json +2 -1
- package/backend/package.json +10 -6
- package/backend/src/api/middlewares/rate-limiters.ts +127 -127
- package/backend/src/api/routes/ai/index.routes.ts +475 -468
- package/backend/src/api/routes/auth/index.routes.ts +85 -32
- package/backend/src/api/routes/auth/oauth.routes.ts +11 -6
- package/backend/src/api/routes/database/index.routes.ts +2 -0
- package/backend/src/api/routes/database/records.routes.ts +39 -175
- package/backend/src/api/routes/database/rpc.routes.ts +69 -0
- package/backend/src/api/routes/deployments/index.routes.ts +192 -0
- package/backend/src/api/routes/docs/index.routes.ts +3 -2
- package/backend/src/api/routes/email/index.routes.ts +35 -35
- package/backend/src/api/routes/functions/index.routes.ts +3 -3
- package/backend/src/api/routes/metadata/index.routes.ts +26 -0
- package/backend/src/api/routes/webhooks/index.routes.ts +109 -0
- package/backend/src/infra/database/database.manager.ts +0 -10
- package/backend/src/infra/database/migrations/018_schema-rework.sql +441 -0
- package/backend/src/infra/database/migrations/019_create-deployments-table.sql +36 -0
- package/backend/src/infra/database/migrations/020_add-audio-modality.sql +11 -0
- package/backend/src/infra/database/migrations/bootstrap/bootstrap-migrations.js +103 -0
- package/backend/src/infra/security/token.manager.ts +1 -4
- package/backend/src/providers/ai/openrouter.provider.ts +12 -3
- package/backend/src/providers/database/base.provider.ts +39 -0
- package/backend/src/providers/database/cloud.provider.ts +159 -0
- package/backend/src/providers/deployments/vercel.provider.ts +516 -0
- package/backend/src/server.ts +19 -7
- package/backend/src/services/ai/ai-config.service.ts +6 -6
- package/backend/src/services/ai/ai-model.service.ts +60 -60
- package/backend/src/services/ai/ai-usage.service.ts +7 -7
- package/backend/src/services/ai/chat-completion.service.ts +415 -220
- package/backend/src/services/ai/helpers.ts +64 -64
- package/backend/src/services/ai/index.ts +13 -13
- package/backend/src/services/auth/auth-config.service.ts +4 -4
- package/backend/src/services/auth/auth-otp.service.ts +6 -6
- package/backend/src/services/auth/auth.service.ts +134 -74
- package/backend/src/services/auth/index.ts +4 -4
- package/backend/src/services/auth/oauth-config.service.ts +12 -12
- package/backend/src/services/database/database-advance.service.ts +19 -55
- package/backend/src/services/database/database-table.service.ts +38 -85
- package/backend/src/services/database/postgrest-proxy.service.ts +165 -0
- package/backend/src/services/deployments/deployment.service.ts +693 -0
- package/backend/src/services/functions/function.service.ts +61 -41
- package/backend/src/services/logs/audit.service.ts +10 -10
- package/backend/src/services/secrets/secret.service.ts +101 -27
- package/backend/src/services/storage/storage.service.ts +30 -30
- package/backend/src/services/usage/usage.service.ts +6 -6
- package/backend/src/types/ai.ts +8 -0
- package/backend/src/types/auth.ts +5 -1
- package/backend/src/types/database.ts +2 -0
- package/backend/src/types/deployments.ts +33 -0
- package/backend/src/types/storage.ts +1 -1
- package/backend/src/types/webhooks.ts +45 -0
- package/backend/src/utils/cookies.ts +34 -35
- package/backend/src/utils/environment.ts +0 -14
- package/backend/src/utils/s3-config-loader.ts +64 -64
- package/backend/src/utils/seed.ts +334 -301
- package/backend/src/utils/sql-parser.ts +126 -0
- package/backend/src/utils/utils.ts +114 -114
- package/backend/src/utils/validations.ts +10 -10
- package/backend/tests/local/test-rpc.sh +141 -0
- package/backend/tests/local/test-secrets.sh +1 -1
- package/backend/tests/manual/test-ai-model-plugins.sh +258 -0
- package/backend/tests/manual/test-rawsql-modes.sh +24 -24
- package/backend/tests/unit/database-advance.test.ts +326 -0
- package/backend/tests/unit/helpers.test.ts +2 -2
- package/claude-plugin/skills/insforge-schema-patterns/SKILL.md +13 -10
- package/docker-compose.prod.yml +1 -1
- package/docker-compose.yml +1 -1
- package/docs/agent-docs/deployment.md +79 -0
- package/docs/changelog.mdx +165 -72
- package/docs/core-concepts/ai/architecture.mdx +1 -23
- package/docs/core-concepts/ai/sdk.mdx +26 -1
- package/docs/core-concepts/authentication/architecture.mdx +6 -8
- package/docs/core-concepts/authentication/sdk.mdx +387 -91
- package/docs/core-concepts/authentication/ui-components/customization.mdx +460 -256
- package/docs/core-concepts/authentication/ui-components/nextjs.mdx +50 -24
- package/docs/core-concepts/authentication/ui-components/react-router.mdx +18 -19
- package/docs/core-concepts/authentication/ui-components/react.mdx +26 -19
- package/docs/core-concepts/database/architecture.mdx +58 -21
- package/docs/core-concepts/database/pgvector.mdx +138 -0
- package/docs/core-concepts/database/sdk.mdx +17 -17
- package/docs/core-concepts/deployments/architecture.mdx +152 -0
- package/docs/core-concepts/email/architecture.mdx +4 -2
- package/docs/core-concepts/functions/architecture.mdx +1 -1
- package/docs/core-concepts/functions/sdk.mdx +0 -1
- package/docs/core-concepts/realtime/architecture.mdx +1 -1
- package/docs/core-concepts/storage/architecture.mdx +1 -1
- package/docs/core-concepts/storage/sdk.mdx +25 -25
- package/docs/docs.json +14 -6
- package/docs/favicon.png +0 -0
- package/docs/favicon.svg +3 -18
- package/docs/images/changelog/dec-2025/apple-oauth.mp4 +0 -0
- package/docs/images/changelog/dec-2025/moreModels.png +0 -0
- package/docs/images/changelog/dec-2025/multi-region.webp +0 -0
- package/docs/images/changelog/dec-2025/postgres-connection.webp +0 -0
- package/docs/images/changelog/dec-2025/realtime2.png +0 -0
- package/docs/images/mcp-setup/CC-MCP-1.mp4 +0 -0
- package/docs/images/mcp-setup/CC-MCP-2.mp4 +0 -0
- package/docs/images/mcp-setup/Cursor-MCP-1.mp4 +0 -0
- package/docs/images/mcp-setup/Cursor-MCP-2.mp4 +0 -0
- package/docs/images/mcp-setup/Cursor-MCP-3.mp4 +0 -0
- package/docs/images/mcp-setup/claude-code-connect.png +0 -0
- package/docs/images/mcp-setup/cline-1.png +0 -0
- package/docs/images/mcp-setup/cline-2.png +0 -0
- package/docs/images/mcp-setup/cline-3.png +0 -0
- package/docs/images/mcp-setup/connect-project.png +0 -0
- package/docs/images/mcp-setup/copilot-1.png +0 -0
- package/docs/images/mcp-setup/copilot-2.png +0 -0
- package/docs/images/mcp-setup/copilot-3.png +0 -0
- package/docs/images/mcp-setup/mcp-json-1.png +0 -0
- package/docs/images/mcp-setup/mcp-json-2.png +0 -0
- package/docs/images/mcp-setup/qoder-1.png +0 -0
- package/docs/images/mcp-setup/qoder-2.png +0 -0
- package/docs/images/mcp-setup/roocode-1.png +0 -0
- package/docs/images/mcp-setup/roocode-2.png +0 -0
- package/docs/images/mcp-setup/trae-1.png +0 -0
- package/docs/images/mcp-setup/trae-2.png +0 -0
- package/docs/images/mcp-setup/trae-3.png +0 -0
- package/docs/images/mcp-setup/trae-4.png +0 -0
- package/docs/images/mcp-setup/trae-5.png +0 -0
- package/docs/images/mcp-setup/windsurf-1.png +0 -0
- package/docs/images/mcp-setup/windsurf-2.png +0 -0
- package/docs/insforge-instructions-sdk.md +7 -3
- package/docs/introduction.mdx +9 -8
- package/docs/mcp-setup.mdx +332 -0
- package/docs/oauth-server.mdx +563 -0
- package/docs/partnership.mdx +79 -10
- package/docs/quickstart.mdx +1 -1
- package/docs/vscode-extension.mdx +74 -0
- package/eslint.config.js +1 -0
- package/examples/response-examples.md +1 -1
- package/frontend/package.json +1 -1
- package/frontend/src/App.tsx +8 -3
- package/frontend/src/assets/logos/antigravity.svg +1 -0
- package/frontend/src/assets/logos/copilot.svg +10 -0
- package/frontend/src/assets/logos/deepseek.svg +139 -0
- package/frontend/src/assets/logos/kiro.svg +9 -0
- package/frontend/src/assets/logos/qoder.svg +4 -0
- package/frontend/src/assets/logos/qwen.svg +15 -0
- package/frontend/src/components/CodeBlock.tsx +2 -2
- package/frontend/src/components/ConnectCTA.tsx +3 -2
- package/frontend/src/components/datagrid/DataGrid.tsx +90 -62
- package/frontend/src/components/datagrid/datagridTypes.tsx +2 -1
- package/frontend/src/components/datagrid/index.ts +1 -1
- package/frontend/src/components/index.ts +0 -1
- package/frontend/src/components/layout/AppHeader.tsx +4 -27
- package/frontend/src/components/layout/AppSidebar.tsx +85 -100
- package/frontend/src/components/layout/Layout.tsx +34 -32
- package/frontend/src/components/layout/PrimaryMenu.tsx +12 -4
- package/frontend/src/components/radix/Select.tsx +151 -151
- package/frontend/src/features/ai/components/AIConfigCard.tsx +200 -200
- package/frontend/src/features/ai/components/AIEmptyState.tsx +23 -23
- package/frontend/src/features/ai/components/ModalityFilterSidebar.tsx +102 -101
- package/frontend/src/features/ai/components/ModelSelectionDialog.tsx +135 -135
- package/frontend/src/features/ai/components/ModelSelectionGrid.tsx +51 -51
- package/frontend/src/features/ai/components/SystemPromptDialog.tsx +118 -118
- package/frontend/src/features/ai/components/index.ts +6 -6
- package/frontend/src/features/ai/helpers.ts +147 -141
- package/frontend/src/features/ai/pages/AIPage.tsx +166 -166
- package/frontend/src/features/auth/components/AuthPreview.tsx +96 -96
- package/frontend/src/features/auth/components/UsersDataGrid.tsx +55 -31
- package/frontend/src/features/auth/components/index.ts +5 -5
- package/frontend/src/features/auth/pages/AuthMethodsPage.tsx +275 -275
- package/frontend/src/features/dashboard/pages/DashboardPage.tsx +1 -1
- package/frontend/src/features/database/components/DatabaseDataGrid.tsx +0 -2
- package/frontend/src/features/database/components/ForeignKeyCell.tsx +38 -11
- package/frontend/src/features/database/components/ForeignKeyPopover.tsx +18 -8
- package/frontend/src/features/database/components/LinkRecordModal.tsx +61 -13
- package/frontend/src/features/database/components/RecordFormField.tsx +1 -1
- package/frontend/src/features/database/components/TableSidebar.tsx +0 -3
- package/frontend/src/features/database/components/TablesEmptyState.tsx +1 -1
- package/frontend/src/features/database/components/TemplatePreview.tsx +1 -2
- package/frontend/src/features/database/constants.ts +16 -28
- package/frontend/src/features/database/hooks/useCSVImport.ts +3 -2
- package/frontend/src/features/database/hooks/useRawSQL.ts +3 -2
- package/frontend/src/features/database/hooks/useTables.ts +5 -7
- package/frontend/src/features/database/pages/FunctionsPage.tsx +0 -5
- package/frontend/src/features/database/pages/IndexesPage.tsx +0 -5
- package/frontend/src/features/database/pages/PoliciesPage.tsx +0 -5
- package/frontend/src/features/database/pages/SQLEditorPage.tsx +2 -2
- package/frontend/src/features/database/pages/TriggersPage.tsx +0 -5
- package/frontend/src/features/database/services/advance.service.ts +1 -15
- package/frontend/src/features/database/services/record.service.ts +4 -20
- package/frontend/src/features/database/services/table.service.ts +1 -4
- package/frontend/src/features/database/templates/ai-chatbot.ts +6 -6
- package/frontend/src/features/database/templates/ecommerce-platform.ts +2 -2
- package/frontend/src/features/database/templates/instagram-clone.ts +10 -10
- package/frontend/src/features/database/templates/notion-clone.ts +8 -8
- package/frontend/src/features/database/templates/reddit-clone.ts +10 -10
- package/frontend/src/features/deployments/components/DeploymentRow.tsx +93 -0
- package/frontend/src/features/deployments/components/DeploymentsEmptyState.tsx +15 -0
- package/frontend/src/features/deployments/hooks/useDeployments.ts +157 -0
- package/frontend/src/features/deployments/pages/DeploymentsPage.tsx +318 -0
- package/frontend/src/features/deployments/services/deployments.service.ts +63 -0
- package/frontend/src/features/functions/components/FunctionRow.tsx +72 -72
- package/frontend/src/features/functions/components/FunctionsSidebar.tsx +56 -56
- package/frontend/src/features/functions/components/SecretRow.tsx +3 -3
- package/frontend/src/features/functions/components/index.ts +5 -5
- package/frontend/src/features/functions/hooks/useFunctions.ts +5 -4
- package/frontend/src/features/functions/hooks/useSecrets.ts +6 -9
- package/frontend/src/features/functions/pages/SecretsPage.tsx +118 -118
- package/frontend/src/features/functions/services/function.service.ts +8 -25
- package/frontend/src/features/functions/services/secret.service.ts +23 -41
- package/frontend/src/features/login/pages/CloudLoginPage.tsx +125 -118
- package/frontend/src/features/logs/components/LogDetailPanel.tsx +41 -0
- package/frontend/src/features/logs/components/LogsDataGrid.tsx +32 -1
- package/frontend/src/features/logs/components/index.ts +1 -0
- package/frontend/src/features/logs/pages/LogsPage.tsx +36 -6
- package/frontend/src/features/onboard/components/ApiCredentialsSection.tsx +59 -0
- package/frontend/src/features/onboard/components/ConnectionStringSection.tsx +180 -0
- package/frontend/src/features/onboard/components/McpConnectionSection.tsx +159 -0
- package/frontend/src/features/onboard/components/OnboardingController.tsx +68 -0
- package/frontend/src/features/onboard/components/OnboardingModal.tsx +121 -267
- package/frontend/src/features/onboard/components/ShowPasswordButton.tsx +21 -0
- package/frontend/src/features/onboard/components/index.ts +9 -4
- package/frontend/src/features/onboard/components/mcp/CursorDeeplinkGenerator.tsx +1 -1
- package/frontend/src/features/onboard/components/mcp/QoderDeeplinkGenerator.tsx +36 -0
- package/frontend/src/features/onboard/components/mcp/helpers.tsx +123 -98
- package/frontend/src/features/onboard/components/mcp/index.ts +4 -3
- package/frontend/src/features/onboard/index.ts +17 -13
- package/frontend/src/features/settings/pages/SettingsPage.tsx +349 -0
- package/frontend/src/features/visualizer/components/AuthNode.tsx +4 -4
- package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +21 -8
- package/frontend/src/features/visualizer/pages/VisualizerPage.tsx +10 -1
- package/frontend/src/index.css +249 -249
- package/frontend/src/lib/contexts/ModalContext.tsx +35 -0
- package/frontend/src/lib/hooks/useMetadata.ts +45 -1
- package/frontend/src/lib/hooks/useModal.tsx +2 -0
- package/frontend/src/lib/routing/AppRoutes.tsx +103 -99
- package/frontend/src/lib/services/metadata.service.ts +20 -3
- package/frontend/src/lib/utils/menuItems.ts +223 -207
- package/frontend/src/lib/utils/utils.ts +196 -196
- package/functions/server.ts +315 -315
- package/functions/worker-template.js +1 -1
- package/openapi/ai.yaml +115 -5
- package/openapi/auth.yaml +97 -17
- package/openapi/logs.yaml +0 -2
- package/openapi/metadata.yaml +0 -2
- package/openapi/records.yaml +21 -21
- package/openapi/tables.yaml +1 -2
- package/package.json +1 -1
- package/shared-schemas/package.json +1 -1
- package/shared-schemas/src/ai-api.schema.ts +251 -143
- package/shared-schemas/src/ai.schema.ts +63 -63
- package/shared-schemas/src/auth-api.schema.ts +34 -6
- package/shared-schemas/src/auth.schema.ts +17 -10
- package/shared-schemas/src/cloud-events.schema.ts +26 -0
- package/shared-schemas/src/deployments-api.schema.ts +55 -0
- package/shared-schemas/src/deployments.schema.ts +30 -0
- package/shared-schemas/src/docs.schema.ts +8 -2
- package/shared-schemas/src/email-api.schema.ts +30 -30
- package/shared-schemas/src/functions-api.schema.ts +13 -4
- package/shared-schemas/src/functions.schema.ts +1 -1
- package/shared-schemas/src/index.ts +22 -18
- package/shared-schemas/src/metadata.schema.ts +30 -4
- package/shared-schemas/src/secrets-api.schema.ts +44 -0
- package/shared-schemas/src/secrets.schema.ts +15 -0
- package/zeabur/README.md +13 -0
- package/zeabur/template.yml +20 -51
- package/backend/src/types/profile.ts +0 -55
- package/frontend/src/components/ProjectInfoModal.tsx +0 -128
|
@@ -1,267 +1,121 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
{selectedAgent.logo}
|
|
123
|
-
</div>
|
|
124
|
-
)}
|
|
125
|
-
<span className="text-gray-900 dark:text-white text-sm font-medium">
|
|
126
|
-
{selectedAgent.displayName}
|
|
127
|
-
</span>
|
|
128
|
-
</div>
|
|
129
|
-
<ChevronDown className="w-5 h-5 text-gray-400 dark:text-neutral-400" />
|
|
130
|
-
</button>
|
|
131
|
-
|
|
132
|
-
{/* Dropdown Menu */}
|
|
133
|
-
{isDropdownOpen && (
|
|
134
|
-
<div className="absolute top-full left-0 mt-1 w-40 bg-white dark:bg-neutral-800 border border-gray-200 dark:border-neutral-700 rounded shadow-lg z-50">
|
|
135
|
-
{MCP_AGENTS.map((agent) => (
|
|
136
|
-
<button
|
|
137
|
-
key={agent.id}
|
|
138
|
-
onClick={() => {
|
|
139
|
-
setSelectedAgent(agent);
|
|
140
|
-
setIsDropdownOpen(false);
|
|
141
|
-
}}
|
|
142
|
-
className="w-full flex items-center gap-2 px-2 py-2 text-gray-900 dark:text-white text-sm hover:bg-gray-100 dark:hover:bg-neutral-700 transition-colors"
|
|
143
|
-
>
|
|
144
|
-
{agent.logo && (
|
|
145
|
-
<div className="w-6 h-6 flex items-center justify-center">{agent.logo}</div>
|
|
146
|
-
)}
|
|
147
|
-
<span className="font-medium">{agent.displayName}</span>
|
|
148
|
-
</button>
|
|
149
|
-
))}
|
|
150
|
-
</div>
|
|
151
|
-
)}
|
|
152
|
-
</div>
|
|
153
|
-
|
|
154
|
-
{/* Step 1 - Conditional based on agent */}
|
|
155
|
-
{selectedAgent.id === 'cursor' ? (
|
|
156
|
-
<div className="flex flex-col gap-3">
|
|
157
|
-
<p className="text-gray-900 dark:text-white text-sm">
|
|
158
|
-
<span className="font-semibold leading-5">Step 1</span>
|
|
159
|
-
<span className="leading-6"> - Install in one click</span>
|
|
160
|
-
</p>
|
|
161
|
-
<div className="w-fit">
|
|
162
|
-
<CursorDeeplinkGenerator apiKey={displayApiKey} os="macos-linux" />
|
|
163
|
-
</div>
|
|
164
|
-
</div>
|
|
165
|
-
) : selectedAgent.id === 'mcp' ? (
|
|
166
|
-
<div className="flex flex-col gap-3">
|
|
167
|
-
<p className="text-gray-900 dark:text-white text-sm">
|
|
168
|
-
<span className="font-semibold leading-5">Step 1</span>
|
|
169
|
-
<span className="leading-6">
|
|
170
|
-
{' '}
|
|
171
|
-
- Copy the configuration below and add it to your AI assistant.
|
|
172
|
-
</span>
|
|
173
|
-
</p>
|
|
174
|
-
<div className="bg-gray-100 dark:bg-neutral-900 rounded overflow-hidden flex flex-col h-[320px] w-full">
|
|
175
|
-
{/* Header - fixed at top */}
|
|
176
|
-
<div className="bg-gray-100 dark:bg-neutral-900 flex items-center justify-between p-3">
|
|
177
|
-
<div className="bg-gray-200 dark:bg-neutral-700 rounded px-2">
|
|
178
|
-
<span className="text-gray-700 dark:text-neutral-50 text-xs">
|
|
179
|
-
MCP Configuration
|
|
180
|
-
</span>
|
|
181
|
-
</div>
|
|
182
|
-
<CopyButton
|
|
183
|
-
text={mcpJsonConfig}
|
|
184
|
-
showText={false}
|
|
185
|
-
className="h-6 w-6 p-1 bg-white dark:bg-neutral-700 hover:bg-neutral-100 dark:hover:bg-neutral-600 border-none rounded-md shadow-sm min-w-0 text-black dark:text-white"
|
|
186
|
-
/>
|
|
187
|
-
</div>
|
|
188
|
-
{/* Scrollable content */}
|
|
189
|
-
<div className="flex-1 overflow-auto p-3">
|
|
190
|
-
<pre className="text-gray-700 dark:text-neutral-300 text-sm leading-6 m-0 whitespace-pre-wrap break-all">
|
|
191
|
-
<code>{mcpJsonConfig}</code>
|
|
192
|
-
</pre>
|
|
193
|
-
</div>
|
|
194
|
-
</div>
|
|
195
|
-
</div>
|
|
196
|
-
) : (
|
|
197
|
-
<div className="flex flex-col gap-3">
|
|
198
|
-
<p className="text-gray-900 dark:text-white text-sm">
|
|
199
|
-
<span className="font-semibold leading-5">Step 1</span>
|
|
200
|
-
<span className="leading-6"> - Install in one click</span>
|
|
201
|
-
</p>
|
|
202
|
-
<CodeBlock
|
|
203
|
-
code={installCommand}
|
|
204
|
-
label="Terminal Command"
|
|
205
|
-
className={cn(isLoading && 'animate-pulse')}
|
|
206
|
-
/>
|
|
207
|
-
</div>
|
|
208
|
-
)}
|
|
209
|
-
|
|
210
|
-
{/* Step 2 */}
|
|
211
|
-
<div className="flex flex-col gap-3">
|
|
212
|
-
<p className="text-gray-900 dark:text-white text-sm">
|
|
213
|
-
<span className="font-semibold leading-5">Step 2</span>
|
|
214
|
-
<span className="leading-6">
|
|
215
|
-
{' '}
|
|
216
|
-
- Send the prompt below in your agent's chat
|
|
217
|
-
</span>
|
|
218
|
-
</p>
|
|
219
|
-
<CodeBlock
|
|
220
|
-
code={testPrompt}
|
|
221
|
-
label="prompt"
|
|
222
|
-
className="bg-gray-100 dark:bg-neutral-900"
|
|
223
|
-
/>
|
|
224
|
-
</div>
|
|
225
|
-
</div>
|
|
226
|
-
|
|
227
|
-
{/* Help Section */}
|
|
228
|
-
<div className="flex items-end justify-between">
|
|
229
|
-
<div className="flex flex-col gap-2">
|
|
230
|
-
<div className="flex items-center gap-2">
|
|
231
|
-
<span className="text-gray-500 dark:text-neutral-400 text-sm leading-6">
|
|
232
|
-
Need help?
|
|
233
|
-
</span>
|
|
234
|
-
</div>
|
|
235
|
-
<div className="flex items-center gap-2">
|
|
236
|
-
<span className="text-gray-500 dark:text-neutral-400 text-sm leading-6">
|
|
237
|
-
Join our
|
|
238
|
-
</span>
|
|
239
|
-
<a
|
|
240
|
-
href="https://discord.gg/DvBtaEc9Jz"
|
|
241
|
-
target="_blank"
|
|
242
|
-
rel="noopener noreferrer"
|
|
243
|
-
className="inline-flex items-center gap-1 hover:underline"
|
|
244
|
-
>
|
|
245
|
-
<DiscordIcon className="w-5 h-5 text-indigo-500 dark:text-indigo-400" />
|
|
246
|
-
<span className="text-indigo-500 dark:text-indigo-400 text-sm leading-6 font-medium">
|
|
247
|
-
Discord
|
|
248
|
-
</span>
|
|
249
|
-
</a>
|
|
250
|
-
<span className="text-gray-500 dark:text-neutral-400 text-sm leading-6">
|
|
251
|
-
for live support
|
|
252
|
-
</span>
|
|
253
|
-
</div>
|
|
254
|
-
</div>
|
|
255
|
-
<Button
|
|
256
|
-
variant="outline"
|
|
257
|
-
onClick={handleSkipOnboarding}
|
|
258
|
-
className="px-3 h-8 bg-gray-100 dark:bg-neutral-700 hover:bg-gray-200 dark:hover:bg-neutral-600 text-gray-700 dark:text-white border-gray-300 dark:border-neutral-600 text-sm font-medium"
|
|
259
|
-
>
|
|
260
|
-
I'll connect later
|
|
261
|
-
</Button>
|
|
262
|
-
</div>
|
|
263
|
-
</DialogContent>
|
|
264
|
-
</TooltipProvider>
|
|
265
|
-
</Dialog>
|
|
266
|
-
);
|
|
267
|
-
}
|
|
1
|
+
import { Link } from 'react-router-dom';
|
|
2
|
+
import { Smartphone } from 'lucide-react';
|
|
3
|
+
import { Dialog, DialogContent, DialogTitle, Button, TooltipProvider } from '@/components';
|
|
4
|
+
import { McpConnectionSection } from './McpConnectionSection';
|
|
5
|
+
import { useApiKey } from '@/lib/hooks/useMetadata';
|
|
6
|
+
import { getBackendUrl, isInsForgeCloudProject, isIframe } from '@/lib/utils/utils';
|
|
7
|
+
import { postMessageToParent } from '@/lib/utils/cloudMessaging';
|
|
8
|
+
import DiscordIcon from '@/assets/logos/discord.svg?react';
|
|
9
|
+
import { useModal } from '@/lib/hooks/useModal';
|
|
10
|
+
|
|
11
|
+
const ONBOARDING_SKIPPED_KEY = 'insforge_onboarding_skipped';
|
|
12
|
+
|
|
13
|
+
export function getOnboardingSkipped(): boolean {
|
|
14
|
+
return localStorage.getItem(ONBOARDING_SKIPPED_KEY) === 'true';
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function setOnboardingSkipped(skipped: boolean): void {
|
|
18
|
+
if (skipped) {
|
|
19
|
+
localStorage.setItem(ONBOARDING_SKIPPED_KEY, 'true');
|
|
20
|
+
} else {
|
|
21
|
+
localStorage.removeItem(ONBOARDING_SKIPPED_KEY);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function OnboardingModal() {
|
|
26
|
+
const { isOnboardingModalOpen, setOnboardingModalOpen } = useModal();
|
|
27
|
+
|
|
28
|
+
const { apiKey, isLoading } = useApiKey();
|
|
29
|
+
const appUrl = getBackendUrl();
|
|
30
|
+
|
|
31
|
+
const displayApiKey = isLoading ? 'ik_' + '*'.repeat(32) : apiKey || '';
|
|
32
|
+
const isCloudEnvironment = isInsForgeCloudProject();
|
|
33
|
+
const isInIframe = isIframe();
|
|
34
|
+
|
|
35
|
+
const handleSkipOnboarding = () => {
|
|
36
|
+
setOnboardingSkipped(true);
|
|
37
|
+
setOnboardingModalOpen(false);
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
const handleModalClose = (nextOpen: boolean) => {
|
|
41
|
+
if (!nextOpen) {
|
|
42
|
+
handleSkipOnboarding();
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
return (
|
|
47
|
+
<Dialog open={isOnboardingModalOpen} onOpenChange={handleModalClose}>
|
|
48
|
+
<TooltipProvider>
|
|
49
|
+
<DialogContent className="max-w-[640px] bg-white dark:bg-neutral-800 dark:border-neutral-700 p-0 gap-6">
|
|
50
|
+
<DialogTitle className="sr-only">Connect Project</DialogTitle>
|
|
51
|
+
|
|
52
|
+
{/* Header Section */}
|
|
53
|
+
<div className="flex flex-col gap-6 px-6 pt-6">
|
|
54
|
+
<h3 className="text-gray-900 dark:text-white text-2xl font-semibold leading-8 tracking-[-0.144px]">
|
|
55
|
+
Connect Project
|
|
56
|
+
</h3>
|
|
57
|
+
</div>
|
|
58
|
+
|
|
59
|
+
{/* Tab Content */}
|
|
60
|
+
<div className="flex flex-col gap-10 px-6 overflow-hidden">
|
|
61
|
+
<McpConnectionSection apiKey={displayApiKey} appUrl={appUrl} isLoading={isLoading} />
|
|
62
|
+
<div className="flex flex-col gap-2">
|
|
63
|
+
<div className="flex items-center gap-2">
|
|
64
|
+
<span className="text-gray-500 dark:text-neutral-400 text-sm leading-6">
|
|
65
|
+
Need help?
|
|
66
|
+
</span>
|
|
67
|
+
{isCloudEnvironment && isInIframe && (
|
|
68
|
+
<Button
|
|
69
|
+
variant="ghost"
|
|
70
|
+
onClick={() => postMessageToParent({ type: 'SHOW_CONTACT_MODAL' })}
|
|
71
|
+
className="gap-1.5 px-2 py-1 h-auto text-white group hover:bg-transparent"
|
|
72
|
+
>
|
|
73
|
+
<Smartphone className="w-5 h-5" />
|
|
74
|
+
<span className="text-sm font-medium group-hover:underline">Text Us</span>
|
|
75
|
+
</Button>
|
|
76
|
+
)}
|
|
77
|
+
</div>
|
|
78
|
+
<div className="flex items-center gap-2">
|
|
79
|
+
<span className="text-gray-500 dark:text-neutral-400 text-sm leading-6">
|
|
80
|
+
Join our
|
|
81
|
+
</span>
|
|
82
|
+
<a
|
|
83
|
+
href="https://discord.gg/DvBtaEc9Jz"
|
|
84
|
+
target="_blank"
|
|
85
|
+
rel="noopener noreferrer"
|
|
86
|
+
className="inline-flex items-center gap-1 hover:underline"
|
|
87
|
+
>
|
|
88
|
+
<DiscordIcon className="w-5 h-5 text-indigo-500 dark:text-indigo-400" />
|
|
89
|
+
<span className="text-indigo-500 dark:text-indigo-400 text-sm leading-6 font-medium">
|
|
90
|
+
Discord
|
|
91
|
+
</span>
|
|
92
|
+
</a>
|
|
93
|
+
<span className="text-gray-500 dark:text-neutral-400 text-sm leading-6">
|
|
94
|
+
for live support
|
|
95
|
+
</span>
|
|
96
|
+
</div>
|
|
97
|
+
</div>
|
|
98
|
+
</div>
|
|
99
|
+
|
|
100
|
+
{/* Help Section */}
|
|
101
|
+
<div className="flex items-center justify-between p-6 border-t border-neutral-200 dark:border-neutral-700">
|
|
102
|
+
<Link
|
|
103
|
+
to="/dashboard/settings?tab=connect"
|
|
104
|
+
onClick={() => setOnboardingModalOpen(false)}
|
|
105
|
+
className="text-gray-500 dark:text-neutral-400 text-sm font-medium underline"
|
|
106
|
+
>
|
|
107
|
+
Advanced Connection
|
|
108
|
+
</Link>
|
|
109
|
+
<Button
|
|
110
|
+
variant="outline"
|
|
111
|
+
onClick={handleSkipOnboarding}
|
|
112
|
+
className="px-3 h-8 bg-gray-100 dark:bg-neutral-700 hover:bg-gray-200 dark:hover:bg-neutral-600 text-gray-700 dark:text-white border-gray-300 dark:border-neutral-600 text-sm font-medium"
|
|
113
|
+
>
|
|
114
|
+
I'll connect later
|
|
115
|
+
</Button>
|
|
116
|
+
</div>
|
|
117
|
+
</DialogContent>
|
|
118
|
+
</TooltipProvider>
|
|
119
|
+
</Dialog>
|
|
120
|
+
);
|
|
121
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Eye, EyeOff } from 'lucide-react';
|
|
2
|
+
|
|
3
|
+
interface ShowPasswordButtonProps {
|
|
4
|
+
show: boolean;
|
|
5
|
+
onToggle: () => void;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export function ShowPasswordButton({ show, onToggle }: ShowPasswordButtonProps) {
|
|
9
|
+
return (
|
|
10
|
+
<button
|
|
11
|
+
type="button"
|
|
12
|
+
onClick={onToggle}
|
|
13
|
+
className="flex items-center gap-1 pl-1 pr-1.5 py-0.5 bg-gray-200 dark:bg-neutral-800 text-gray-500 dark:text-neutral-400 hover:bg-gray-300 dark:hover:bg-neutral-700 hover:text-gray-700 dark:hover:text-neutral-200 transition-colors text-xs font-medium rounded-md cursor-pointer"
|
|
14
|
+
aria-pressed={show}
|
|
15
|
+
aria-label={`${show ? 'Hide' : 'Show'} password`}
|
|
16
|
+
>
|
|
17
|
+
{show ? <EyeOff className="w-4 h-4" /> : <Eye className="w-4 h-4" />}
|
|
18
|
+
<span>{show ? 'Hide' : 'Show'} Password</span>
|
|
19
|
+
</button>
|
|
20
|
+
);
|
|
21
|
+
}
|
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
export * from './mcp';
|
|
2
|
-
export { McpConnectionStatus } from './McpConnectionStatus';
|
|
3
|
-
export { OnboardingModal, getOnboardingSkipped, setOnboardingSkipped } from './OnboardingModal';
|
|
4
|
-
export { VideoDemoModal } from './VideoDemoModal';
|
|
1
|
+
export * from './mcp';
|
|
2
|
+
export { McpConnectionStatus } from './McpConnectionStatus';
|
|
3
|
+
export { OnboardingModal, getOnboardingSkipped, setOnboardingSkipped } from './OnboardingModal';
|
|
4
|
+
export { VideoDemoModal } from './VideoDemoModal';
|
|
5
|
+
export { McpConnectionSection } from './McpConnectionSection';
|
|
6
|
+
export { ApiCredentialsSection } from './ApiCredentialsSection';
|
|
7
|
+
export { ConnectionStringSection } from './ConnectionStringSection';
|
|
8
|
+
export { ShowPasswordButton } from './ShowPasswordButton';
|
|
9
|
+
export { OnboardingController } from './OnboardingController';
|
|
@@ -26,7 +26,7 @@ export function CursorDeeplinkGenerator({
|
|
|
26
26
|
return (
|
|
27
27
|
<button
|
|
28
28
|
onClick={handleOpenInCursor}
|
|
29
|
-
className="h-8 bg-black dark:bg-
|
|
29
|
+
className="h-8 bg-black hover:bg-neutral-800 dark:bg-neutral-600 dark:hover:bg-neutral-500 px-4 flex items-center justify-center gap-2.5 rounded text-white text-sm font-medium"
|
|
30
30
|
>
|
|
31
31
|
<CursorLogo className="h-6 w-6" />
|
|
32
32
|
<span>Add to Cursor</span>
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { useMemo } from 'react';
|
|
2
|
+
import { createMCPServerConfig, type PlatformType } from './helpers';
|
|
3
|
+
import QoderLogo from '@/assets/logos/qoder.svg?react';
|
|
4
|
+
import { getBackendUrl } from '@/lib/utils/utils';
|
|
5
|
+
|
|
6
|
+
interface QoderDeeplinkGeneratorProps {
|
|
7
|
+
apiKey?: string;
|
|
8
|
+
os?: PlatformType;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function QoderDeeplinkGenerator({
|
|
12
|
+
apiKey,
|
|
13
|
+
os = 'macos-linux',
|
|
14
|
+
}: QoderDeeplinkGeneratorProps) {
|
|
15
|
+
const deeplink = useMemo(() => {
|
|
16
|
+
const config = createMCPServerConfig(apiKey || '', os, getBackendUrl());
|
|
17
|
+
const configString = JSON.stringify(config);
|
|
18
|
+
// Qoder requires: JSON.stringify -> encodeURIComponent -> btoa -> encodeURIComponent
|
|
19
|
+
const base64Config = btoa(encodeURIComponent(configString));
|
|
20
|
+
return `qoder://aicoding.aicoding-deeplink/mcp/add?name=insforge&config=${encodeURIComponent(base64Config)}`;
|
|
21
|
+
}, [apiKey, os]);
|
|
22
|
+
|
|
23
|
+
const handleOpenInQoder = () => {
|
|
24
|
+
window.open(deeplink, '_blank');
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
return (
|
|
28
|
+
<button
|
|
29
|
+
onClick={handleOpenInQoder}
|
|
30
|
+
className="h-8 bg-black hover:bg-neutral-800 dark:bg-neutral-600 dark:hover:bg-neutral-500 px-4 flex items-center justify-center gap-2.5 rounded text-white text-sm font-medium"
|
|
31
|
+
>
|
|
32
|
+
<QoderLogo className="h-6 w-6" />
|
|
33
|
+
<span>Add to Qoder</span>
|
|
34
|
+
</button>
|
|
35
|
+
);
|
|
36
|
+
}
|