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.
Files changed (395) hide show
  1. package/.dockerignore +58 -0
  2. package/.env.example +49 -0
  3. package/.github/ISSUE_TEMPLATE/bug_report.yml +83 -0
  4. package/.github/ISSUE_TEMPLATE/config.yml +11 -0
  5. package/.github/ISSUE_TEMPLATE/feature_request.yml +79 -0
  6. package/.github/copilot-instructions.md +147 -0
  7. package/.github/workflows/build-image.yml +65 -0
  8. package/.github/workflows/ci-premerge-check.yml +24 -0
  9. package/.github/workflows/deploy-aws.yml +130 -0
  10. package/.github/workflows/lint-and-format.yml +33 -0
  11. package/.prettierignore +65 -0
  12. package/.prettierrc +9 -0
  13. package/CHANGELOG.md +3 -0
  14. package/CONTRIBUTING.md +126 -0
  15. package/Dockerfile +27 -0
  16. package/GITHUB_OAUTH_SETUP.md +49 -0
  17. package/GOOGLE_OAUTH_SETUP.md +148 -0
  18. package/LICENSE +201 -0
  19. package/README.md +134 -0
  20. package/assets/Dark.svg +23 -0
  21. package/assets/archDiagram.png +0 -0
  22. package/assets/banner.png +0 -0
  23. package/assets/mcpInstallv2.png +0 -0
  24. package/assets/sampleResponse.png +0 -0
  25. package/assets/signin.png +0 -0
  26. package/assets/userflow.png +0 -0
  27. package/backend/migrations/000_create-base-tables.sql +142 -0
  28. package/backend/migrations/001_create-helper-functions.sql +41 -0
  29. package/backend/migrations/002_rename-auth-tables.sql +30 -0
  30. package/backend/migrations/003_create-users-table.sql +56 -0
  31. package/backend/migrations/004_add-reload-postgrest-func.sql +24 -0
  32. package/backend/migrations/005_enable-project-admin-modify-users.sql +30 -0
  33. package/backend/migrations/006_modify-ai-usage-table.sql +25 -0
  34. package/backend/migrations/007_drop-metadata-table.sql +2 -0
  35. package/backend/migrations/008_add-system-tables.sql +77 -0
  36. package/backend/migrations/009_add-function-secrets.sql +24 -0
  37. package/backend/migrations/010_modify-ai-config-modalities.sql +93 -0
  38. package/backend/migrations/011_refactor-secrets-table.sql +15 -0
  39. package/backend/migrations/012_add-storage-uploaded-by.sql +8 -0
  40. package/backend/package.json +75 -0
  41. package/backend/src/api/middleware/auth.ts +240 -0
  42. package/backend/src/api/middleware/error.ts +231 -0
  43. package/backend/src/api/middleware/upload.ts +59 -0
  44. package/backend/src/api/routes/agent.ts +29 -0
  45. package/backend/src/api/routes/ai.ts +472 -0
  46. package/backend/src/api/routes/auth.oauth.ts +482 -0
  47. package/backend/src/api/routes/auth.ts +386 -0
  48. package/backend/src/api/routes/database.advance.ts +275 -0
  49. package/backend/src/api/routes/database.records.ts +246 -0
  50. package/backend/src/api/routes/database.tables.ts +161 -0
  51. package/backend/src/api/routes/docs.ts +66 -0
  52. package/backend/src/api/routes/functions.ts +183 -0
  53. package/backend/src/api/routes/logs.ts +150 -0
  54. package/backend/src/api/routes/metadata.ts +160 -0
  55. package/backend/src/api/routes/openapi.ts +82 -0
  56. package/backend/src/api/routes/secrets.ts +199 -0
  57. package/backend/src/api/routes/storage.ts +547 -0
  58. package/backend/src/api/routes/usage.ts +96 -0
  59. package/backend/src/core/ai/chat.ts +207 -0
  60. package/backend/src/core/ai/client.ts +242 -0
  61. package/backend/src/core/ai/config.ts +187 -0
  62. package/backend/src/core/ai/image.ts +156 -0
  63. package/backend/src/core/ai/model.ts +117 -0
  64. package/backend/src/core/ai/usage.ts +290 -0
  65. package/backend/src/core/auth/auth.ts +781 -0
  66. package/backend/src/core/auth/oauth.ts +398 -0
  67. package/backend/src/core/database/advance.ts +1074 -0
  68. package/backend/src/core/database/manager.ts +178 -0
  69. package/backend/src/core/database/table.ts +772 -0
  70. package/backend/src/core/documentation/agent.ts +689 -0
  71. package/backend/src/core/documentation/openapi.ts +856 -0
  72. package/backend/src/core/functions/functions.ts +310 -0
  73. package/backend/src/core/logs/analytics.ts +76 -0
  74. package/backend/src/core/logs/audit.ts +255 -0
  75. package/backend/src/core/logs/providers/base.provider.ts +83 -0
  76. package/backend/src/core/logs/providers/cloudwatch.provider.ts +510 -0
  77. package/backend/src/core/logs/providers/localdb.provider.ts +246 -0
  78. package/backend/src/core/secrets/encryption.ts +58 -0
  79. package/backend/src/core/secrets/secrets.ts +410 -0
  80. package/backend/src/core/socket/socket.ts +388 -0
  81. package/backend/src/core/socket/types.ts +79 -0
  82. package/backend/src/core/storage/storage.ts +923 -0
  83. package/backend/src/server.ts +288 -0
  84. package/backend/src/types/ai.ts +46 -0
  85. package/backend/src/types/auth.ts +90 -0
  86. package/backend/src/types/database.ts +136 -0
  87. package/backend/src/types/error-constants.ts +86 -0
  88. package/backend/src/types/logs.ts +47 -0
  89. package/backend/src/types/profile.ts +55 -0
  90. package/backend/src/types/storage.ts +23 -0
  91. package/backend/src/utils/cloud-token.ts +39 -0
  92. package/backend/src/utils/constants.ts +1 -0
  93. package/backend/src/utils/environment.ts +35 -0
  94. package/backend/src/utils/helpers.ts +49 -0
  95. package/backend/src/utils/logger.ts +13 -0
  96. package/backend/src/utils/response.ts +62 -0
  97. package/backend/src/utils/seed.ts +205 -0
  98. package/backend/src/utils/sql-parser.ts +63 -0
  99. package/backend/src/utils/uuid.ts +9 -0
  100. package/backend/src/utils/validations.ts +129 -0
  101. package/backend/tests/README.md +134 -0
  102. package/backend/tests/cleanup-all-test-data.sh +231 -0
  103. package/backend/tests/cloud/test-s3-multitenant.sh +132 -0
  104. package/backend/tests/local/comprehensive-curl-tests.sh +156 -0
  105. package/backend/tests/local/test-auth-router.sh +144 -0
  106. package/backend/tests/local/test-database-router.sh +222 -0
  107. package/backend/tests/local/test-e2e.sh +241 -0
  108. package/backend/tests/local/test-fk-errors.sh +97 -0
  109. package/backend/tests/local/test-id-field.sh +201 -0
  110. package/backend/tests/local/test-public-bucket.sh +265 -0
  111. package/backend/tests/local/test-secrets.sh +248 -0
  112. package/backend/tests/local/test-serverless-functions.sh.disabled +325 -0
  113. package/backend/tests/local/test-traditional-rest.sh +209 -0
  114. package/backend/tests/manual/README.md +51 -0
  115. package/backend/tests/manual/create-large-table-simple.sql +11 -0
  116. package/backend/tests/manual/seed-large-table.sql +101 -0
  117. package/backend/tests/manual/setup-large-table-extras.sql +34 -0
  118. package/backend/tests/manual/test-better-auth.sh +303 -0
  119. package/backend/tests/manual/test-bulk-upsert.sh +410 -0
  120. package/backend/tests/manual/test-database-advance.sh +297 -0
  121. package/backend/tests/manual/test-postgrest-stability.sh +192 -0
  122. package/backend/tests/manual/test-rawsql-export-import.sh +412 -0
  123. package/backend/tests/manual/test-universal-storage.sh +264 -0
  124. package/backend/tests/manual/test-users.sql +18 -0
  125. package/backend/tests/run-all-tests.sh +140 -0
  126. package/backend/tests/setup.ts +22 -0
  127. package/backend/tests/test-config.sh +303 -0
  128. package/backend/tsconfig.json +23 -0
  129. package/backend/tsup.config.ts +18 -0
  130. package/backend/vitest.config.ts +22 -0
  131. package/docker-compose.prod.yml +145 -0
  132. package/docker-compose.yml +167 -0
  133. package/docker-init/db/db-init.sql +125 -0
  134. package/docker-init/db/jwt.sql +5 -0
  135. package/docker-init/db/logs.sql +9 -0
  136. package/docker-init/db/postgresql.conf +17 -0
  137. package/docs/deprecated/insforge-auth-api.md +215 -0
  138. package/docs/deprecated/insforge-auth-sdk.md +100 -0
  139. package/docs/deprecated/insforge-db-api.md +359 -0
  140. package/docs/deprecated/insforge-db-sdk.md +140 -0
  141. package/docs/deprecated/insforge-debug-sdk.md +157 -0
  142. package/docs/deprecated/insforge-debug.md +65 -0
  143. package/docs/deprecated/insforge-instructions.md +124 -0
  144. package/docs/deprecated/insforge-project.md +118 -0
  145. package/docs/deprecated/insforge-storage-api.md +279 -0
  146. package/docs/deprecated/insforge-storage-sdk.md +159 -0
  147. package/docs/insforge-instructions-sdk.md +407 -0
  148. package/eslint.config.js +317 -0
  149. package/examples/oauth/frontend-oauth-example.html +251 -0
  150. package/examples/response-examples.md +444 -0
  151. package/frontend/README.md +112 -0
  152. package/frontend/components.json +17 -0
  153. package/frontend/index.html +13 -0
  154. package/frontend/package.json +63 -0
  155. package/frontend/public/favicon.ico +0 -0
  156. package/frontend/src/App.tsx +106 -0
  157. package/frontend/src/assets/icons/checkbox_checked.svg +6 -0
  158. package/frontend/src/assets/icons/checkbox_undetermined.svg +6 -0
  159. package/frontend/src/assets/icons/checked.svg +3 -0
  160. package/frontend/src/assets/icons/error.svg +3 -0
  161. package/frontend/src/assets/icons/pencil.svg +4 -0
  162. package/frontend/src/assets/icons/refresh.svg +4 -0
  163. package/frontend/src/assets/icons/step_active.svg +3 -0
  164. package/frontend/src/assets/icons/step_inactive.svg +11 -0
  165. package/frontend/src/assets/icons/warning.svg +3 -0
  166. package/frontend/src/assets/logos/amazon.svg +1 -0
  167. package/frontend/src/assets/logos/claude_code.svg +3 -0
  168. package/frontend/src/assets/logos/cline.svg +6 -0
  169. package/frontend/src/assets/logos/cursor.svg +20 -0
  170. package/frontend/src/assets/logos/discord.svg +9 -0
  171. package/frontend/src/assets/logos/gemini.svg +19 -0
  172. package/frontend/src/assets/logos/github.svg +5 -0
  173. package/frontend/src/assets/logos/google.svg +13 -0
  174. package/frontend/src/assets/logos/grok.svg +10 -0
  175. package/frontend/src/assets/logos/insforge_dark.svg +15 -0
  176. package/frontend/src/assets/logos/insforge_light.svg +15 -0
  177. package/frontend/src/assets/logos/openai.svg +10 -0
  178. package/frontend/src/assets/logos/roo_code.svg +9 -0
  179. package/frontend/src/assets/logos/trae.svg +3 -0
  180. package/frontend/src/assets/logos/windsurf.svg +10 -0
  181. package/frontend/src/components/ButtonWithLoading.tsx +27 -0
  182. package/frontend/src/components/Checkbox.tsx +61 -0
  183. package/frontend/src/components/CodeBlock.tsx +32 -0
  184. package/frontend/src/components/ConfirmDialog.tsx +96 -0
  185. package/frontend/src/components/CopyButton.tsx +69 -0
  186. package/frontend/src/components/DeleteActionButton.tsx +42 -0
  187. package/frontend/src/components/EmptyState.tsx +41 -0
  188. package/frontend/src/components/ErrorState.tsx +35 -0
  189. package/frontend/src/components/FeatureSidebar.tsx +126 -0
  190. package/frontend/src/components/FeatureSidebarItem.tsx +101 -0
  191. package/frontend/src/components/JsonHighlight.tsx +61 -0
  192. package/frontend/src/components/LoadingState.tsx +16 -0
  193. package/frontend/src/components/PaginationControls.tsx +54 -0
  194. package/frontend/src/components/PromptDialog.tsx +68 -0
  195. package/frontend/src/components/SearchInput.tsx +90 -0
  196. package/frontend/src/components/SelectionClearButton.tsx +26 -0
  197. package/frontend/src/components/Stepper.tsx +139 -0
  198. package/frontend/src/components/ThemeToggle.tsx +58 -0
  199. package/frontend/src/components/TypeBadge.tsx +20 -0
  200. package/frontend/src/components/datagrid/DataGrid.tsx +264 -0
  201. package/frontend/src/components/datagrid/DefaultCellRenderer.tsx +114 -0
  202. package/frontend/src/components/datagrid/IdCell.tsx +44 -0
  203. package/frontend/src/components/datagrid/SortableHeader.tsx +74 -0
  204. package/frontend/src/components/datagrid/cell-editors/BooleanCellEditor.tsx +54 -0
  205. package/frontend/src/components/datagrid/cell-editors/DateCellEditor.tsx +483 -0
  206. package/frontend/src/components/datagrid/cell-editors/JsonCellEditor.tsx +362 -0
  207. package/frontend/src/components/datagrid/cell-editors/TextCellEditor.tsx +38 -0
  208. package/frontend/src/components/datagrid/cell-editors/index.ts +14 -0
  209. package/frontend/src/components/datagrid/cell-editors/types.ts +43 -0
  210. package/frontend/src/components/datagrid/datagridTypes.tsx +72 -0
  211. package/frontend/src/components/datagrid/index.tsx +20 -0
  212. package/frontend/src/components/index.ts +39 -0
  213. package/frontend/src/components/layout/AppHeader.tsx +146 -0
  214. package/frontend/src/components/layout/AppSidebar.tsx +190 -0
  215. package/frontend/src/components/layout/CloudLayout.tsx +95 -0
  216. package/frontend/src/components/layout/Layout.tsx +43 -0
  217. package/frontend/src/components/radix/Alert.tsx +45 -0
  218. package/frontend/src/components/radix/AlertDialog.tsx +115 -0
  219. package/frontend/src/components/radix/Avatar.tsx +45 -0
  220. package/frontend/src/components/radix/Badge.tsx +33 -0
  221. package/frontend/src/components/radix/Button.tsx +50 -0
  222. package/frontend/src/components/radix/Card.tsx +58 -0
  223. package/frontend/src/components/radix/Dialog.tsx +98 -0
  224. package/frontend/src/components/radix/DropdownMenu.tsx +185 -0
  225. package/frontend/src/components/radix/Form.tsx +167 -0
  226. package/frontend/src/components/radix/Input.tsx +22 -0
  227. package/frontend/src/components/radix/Label.tsx +19 -0
  228. package/frontend/src/components/radix/Popover.tsx +29 -0
  229. package/frontend/src/components/radix/ScrollArea.tsx +44 -0
  230. package/frontend/src/components/radix/Select.tsx +151 -0
  231. package/frontend/src/components/radix/Separator.tsx +26 -0
  232. package/frontend/src/components/radix/Sheet.tsx +119 -0
  233. package/frontend/src/components/radix/Skeleton.tsx +7 -0
  234. package/frontend/src/components/radix/Switch.tsx +29 -0
  235. package/frontend/src/components/radix/Tabs.tsx +50 -0
  236. package/frontend/src/components/radix/Textarea.tsx +21 -0
  237. package/frontend/src/components/radix/Tooltip.tsx +28 -0
  238. package/frontend/src/features/ai/components/AIConfigCard.tsx +154 -0
  239. package/frontend/src/features/ai/components/AIConfigDialog.tsx +76 -0
  240. package/frontend/src/features/ai/components/AIConfigForm.tsx +222 -0
  241. package/frontend/src/features/ai/components/AIEmptyState.tsx +18 -0
  242. package/frontend/src/features/ai/components/fields/ModalityField.tsx +87 -0
  243. package/frontend/src/features/ai/components/fields/ModelSelectionField.tsx +134 -0
  244. package/frontend/src/features/ai/components/fields/SystemPromptField.tsx +33 -0
  245. package/frontend/src/features/ai/helpers.ts +155 -0
  246. package/frontend/src/features/ai/hooks/useAIConfigs.ts +221 -0
  247. package/frontend/src/features/ai/hooks/useAIUsage.ts +77 -0
  248. package/frontend/src/features/ai/page/AIPage.tsx +178 -0
  249. package/frontend/src/features/ai/services/ai.service.ts +148 -0
  250. package/frontend/src/features/auth/components/AddOAuthDialog.tsx +106 -0
  251. package/frontend/src/features/auth/components/AuthMethodTab.tsx +238 -0
  252. package/frontend/src/features/auth/components/OAuthConfigDialog.tsx +303 -0
  253. package/frontend/src/features/auth/components/OAuthEmptyState.tsx +15 -0
  254. package/frontend/src/features/auth/components/UserFormDialog.tsx +248 -0
  255. package/frontend/src/features/auth/components/UsersDataGrid.tsx +183 -0
  256. package/frontend/src/features/auth/components/UsersTab.tsx +114 -0
  257. package/frontend/src/features/auth/hooks/useOAuthConfig.ts +129 -0
  258. package/frontend/src/features/auth/hooks/useUsers.ts +57 -0
  259. package/frontend/src/features/auth/index.ts +9 -0
  260. package/frontend/src/features/auth/page/AuthenticationPage.tsx +169 -0
  261. package/frontend/src/features/auth/services/auth.service.ts +112 -0
  262. package/frontend/src/features/auth/services/oauth.service.ts +49 -0
  263. package/frontend/src/features/dashboard/page/DashboardPage.tsx +194 -0
  264. package/frontend/src/features/database/components/ColumnTypeSelect.tsx +64 -0
  265. package/frontend/src/features/database/components/DatabaseDataGrid.tsx +282 -0
  266. package/frontend/src/features/database/components/ForeignKeyCell.tsx +187 -0
  267. package/frontend/src/features/database/components/ForeignKeyPopover.tsx +378 -0
  268. package/frontend/src/features/database/components/LinkRecordModal.tsx +288 -0
  269. package/frontend/src/features/database/components/RecordFormDialog.tsx +164 -0
  270. package/frontend/src/features/database/components/RecordFormField.tsx +568 -0
  271. package/frontend/src/features/database/components/TableEmptyState.tsx +21 -0
  272. package/frontend/src/features/database/components/TableForm.tsx +656 -0
  273. package/frontend/src/features/database/components/TableFormColumn.tsx +137 -0
  274. package/frontend/src/features/database/components/TableListSkeleton.tsx +9 -0
  275. package/frontend/src/features/database/components/TableSidebar.tsx +47 -0
  276. package/frontend/src/features/database/constants.ts +26 -0
  277. package/frontend/src/features/database/helpers.ts +125 -0
  278. package/frontend/src/features/database/hooks/UseLinkModal.tsx +78 -0
  279. package/frontend/src/features/database/index.ts +12 -0
  280. package/frontend/src/features/database/page/DatabasePage.tsx +626 -0
  281. package/frontend/src/features/database/schema.ts +25 -0
  282. package/frontend/src/features/database/services/database.service.ts +216 -0
  283. package/frontend/src/features/functions/components/FunctionEmptyState.tsx +15 -0
  284. package/frontend/src/features/functions/components/FunctionRow.tsx +71 -0
  285. package/frontend/src/features/functions/components/FunctionViewer.tsx +46 -0
  286. package/frontend/src/features/functions/components/FunctionsContent.tsx +88 -0
  287. package/frontend/src/features/functions/components/FunctionsSidebar.tsx +56 -0
  288. package/frontend/src/features/functions/components/SecretEmptyState.tsx +23 -0
  289. package/frontend/src/features/functions/components/SecretRow.tsx +68 -0
  290. package/frontend/src/features/functions/components/SecretsContent.tsx +120 -0
  291. package/frontend/src/features/functions/hooks/useFunctions.ts +106 -0
  292. package/frontend/src/features/functions/page/FunctionsPage.tsx +28 -0
  293. package/frontend/src/features/functions/services/functions.service.ts +48 -0
  294. package/frontend/src/features/login/components/AuthErrorBoundary.tsx +87 -0
  295. package/frontend/src/features/login/components/PrivateRoute.tsx +24 -0
  296. package/frontend/src/features/login/page/CloudLoginPage.tsx +93 -0
  297. package/frontend/src/features/login/page/LoginPage.tsx +174 -0
  298. package/frontend/src/features/logs/components/AnalyticsLogsTable.tsx +313 -0
  299. package/frontend/src/features/logs/components/LogsTable.tsx +199 -0
  300. package/frontend/src/features/logs/hooks/useAuditLogs.ts +39 -0
  301. package/frontend/src/features/logs/index.ts +5 -0
  302. package/frontend/src/features/logs/page/AnalyticsLogsPage.tsx +530 -0
  303. package/frontend/src/features/logs/page/AuditsPage.tsx +192 -0
  304. package/frontend/src/features/logs/services/log.service.ts +171 -0
  305. package/frontend/src/features/metadata/hooks/useMetadata.ts +53 -0
  306. package/frontend/src/features/metadata/index.ts +0 -0
  307. package/frontend/src/features/metadata/page/MetadataPage.tsx +136 -0
  308. package/frontend/src/features/metadata/services/metadata.service.ts +17 -0
  309. package/frontend/src/features/onboard/components/CompletionCard.tsx +41 -0
  310. package/frontend/src/features/onboard/components/OnboardButton.tsx +84 -0
  311. package/frontend/src/features/onboard/components/StepContent.tsx +91 -0
  312. package/frontend/src/features/onboard/components/TestConnectionStep.tsx +53 -0
  313. package/frontend/src/features/onboard/components/mcp/CursorDeeplinkGenerator.tsx +35 -0
  314. package/frontend/src/features/onboard/components/mcp/McpInstallation.tsx +144 -0
  315. package/frontend/src/features/onboard/components/mcp/index.ts +4 -0
  316. package/frontend/src/features/onboard/components/mcp/mcp-helper.tsx +98 -0
  317. package/frontend/src/features/onboard/index.ts +3 -0
  318. package/frontend/src/features/onboard/page/OnBoardPage.tsx +104 -0
  319. package/frontend/src/features/onboard/types.ts +8 -0
  320. package/frontend/src/features/secrets/hooks/useSecrets.ts +139 -0
  321. package/frontend/src/features/secrets/services/secrets.service.ts +57 -0
  322. package/frontend/src/features/storage/components/BucketEmptyState.tsx +19 -0
  323. package/frontend/src/features/storage/components/BucketFormDialog.tsx +194 -0
  324. package/frontend/src/features/storage/components/BucketListSkeleton.tsx +17 -0
  325. package/frontend/src/features/storage/components/FilePreviewDialog.tsx +287 -0
  326. package/frontend/src/features/storage/components/StorageDataGrid.tsx +239 -0
  327. package/frontend/src/features/storage/components/StorageManager.tsx +236 -0
  328. package/frontend/src/features/storage/components/StorageSidebar.tsx +44 -0
  329. package/frontend/src/features/storage/components/UploadToast.tsx +46 -0
  330. package/frontend/src/features/storage/index.ts +3 -0
  331. package/frontend/src/features/storage/page/StoragePage.tsx +553 -0
  332. package/frontend/src/features/storage/services/storage.service.ts +144 -0
  333. package/frontend/src/features/visualizer/components/AuthNode.tsx +107 -0
  334. package/frontend/src/features/visualizer/components/BucketNode.tsx +34 -0
  335. package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +359 -0
  336. package/frontend/src/features/visualizer/components/TableNode.tsx +152 -0
  337. package/frontend/src/features/visualizer/components/VisualizerSkeleton.tsx +24 -0
  338. package/frontend/src/features/visualizer/components/index.ts +5 -0
  339. package/frontend/src/features/visualizer/page/VisualizerPage.tsx +127 -0
  340. package/frontend/src/index.css +248 -0
  341. package/frontend/src/lib/api/client.ts +163 -0
  342. package/frontend/src/lib/contexts/AuthContext.tsx +157 -0
  343. package/frontend/src/lib/contexts/OnboardStepContext.tsx +68 -0
  344. package/frontend/src/lib/contexts/SocketContext.tsx +303 -0
  345. package/frontend/src/lib/contexts/ThemeContext.tsx +125 -0
  346. package/frontend/src/lib/hooks/useAuth.ts +4 -0
  347. package/frontend/src/lib/hooks/useConfirm.ts +55 -0
  348. package/frontend/src/lib/hooks/useInterval.ts +27 -0
  349. package/frontend/src/lib/hooks/useMediaQuery.ts +59 -0
  350. package/frontend/src/lib/hooks/useOnboardingCompletion.ts +29 -0
  351. package/frontend/src/lib/hooks/usePagination.ts +27 -0
  352. package/frontend/src/lib/hooks/useTimeout.ts +27 -0
  353. package/frontend/src/lib/hooks/useToast.tsx +229 -0
  354. package/frontend/src/lib/utils/constants.ts +38 -0
  355. package/frontend/src/lib/utils/utils.ts +165 -0
  356. package/frontend/src/lib/utils/validation-schemas.ts +126 -0
  357. package/frontend/src/main.tsx +16 -0
  358. package/frontend/src/rdg.css +194 -0
  359. package/frontend/src/vite-env.d.ts +12 -0
  360. package/frontend/tailwind.config.js +97 -0
  361. package/frontend/tsconfig.json +26 -0
  362. package/frontend/tsconfig.node.json +10 -0
  363. package/frontend/vite.config.ts +37 -0
  364. package/frontend/vitest.config.ts +36 -0
  365. package/functions/deno.json +25 -0
  366. package/functions/server.ts +290 -0
  367. package/functions/worker-template.js +126 -0
  368. package/openapi/ai.yaml +689 -0
  369. package/openapi/auth.yaml +563 -0
  370. package/openapi/functions.yaml +476 -0
  371. package/openapi/health.yaml +30 -0
  372. package/openapi/logs.yaml +224 -0
  373. package/openapi/metadata.yaml +178 -0
  374. package/openapi/records.yaml +382 -0
  375. package/openapi/secrets.yaml +371 -0
  376. package/openapi/storage.yaml +876 -0
  377. package/openapi/tables.yaml +464 -0
  378. package/package.json +88 -0
  379. package/shared-schemas/package.json +31 -0
  380. package/shared-schemas/src/ai-api.schema.ts +167 -0
  381. package/shared-schemas/src/ai.schema.ts +54 -0
  382. package/shared-schemas/src/auth-api.schema.ts +193 -0
  383. package/shared-schemas/src/auth.schema.ts +94 -0
  384. package/shared-schemas/src/database-api.schema.ts +259 -0
  385. package/shared-schemas/src/database.schema.ts +69 -0
  386. package/shared-schemas/src/functions-api.schema.ts +25 -0
  387. package/shared-schemas/src/functions.schema.ts +16 -0
  388. package/shared-schemas/src/index.ts +13 -0
  389. package/shared-schemas/src/logs-api.schema.ts +49 -0
  390. package/shared-schemas/src/logs.schema.ts +14 -0
  391. package/shared-schemas/src/metadata.schema.ts +56 -0
  392. package/shared-schemas/src/storage-api.schema.ts +65 -0
  393. package/shared-schemas/src/storage.schema.ts +19 -0
  394. package/shared-schemas/tsconfig.json +21 -0
  395. 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&apos;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&apos;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,4 @@
1
+ export { McpInstallation } from './McpInstallation';
2
+ export { CursorDeeplinkGenerator } from './CursorDeeplinkGenerator';
3
+ export type { MCPAgent, PlatformType } from './mcp-helper';
4
+ export { MCP_AGENTS, createMCPConfig, createMCPServerConfig } from './mcp-helper';
@@ -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,3 @@
1
+ export { OnboardStep } from './types';
2
+ export { StepContent } from './components/StepContent';
3
+ export { TestConnectionStep } from './components/TestConnectionStep';
@@ -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
+ }
@@ -0,0 +1,8 @@
1
+ export enum OnboardStep {
2
+ INSTALL_NODEJS = 1,
3
+ INSTALL_MCP = 2,
4
+ TEST_CONNECTION = 3,
5
+ FINAL_SETUP = 4,
6
+ }
7
+
8
+ export const TOTAL_STEPS = Object.keys(OnboardStep).filter((key) => !isNaN(Number(key))).length;