insforge 0.3.2 → 1.2.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (507) hide show
  1. package/.claude-plugin/marketplace.json +20 -0
  2. package/.cursor/rules/cursor-rules.mdc +94 -0
  3. package/.dockerignore +3 -0
  4. package/.env.example +33 -4
  5. package/.github/ISSUE_TEMPLATE/bug_report.yml +13 -60
  6. package/.github/ISSUE_TEMPLATE/config.yml +2 -2
  7. package/.github/ISSUE_TEMPLATE/feature_request.yml +10 -63
  8. package/.github/PULL_REQUEST_TEMPLATE.md +7 -0
  9. package/.github/workflows/build-image.yml +2 -1
  10. package/.github/workflows/e2e.yml +63 -0
  11. package/CHANGELOG.md +41 -0
  12. package/CLAUDE_PLUGIN.md +104 -0
  13. package/CODE_OF_CONDUCT.md +128 -0
  14. package/CONTRIBUTING.md +1 -1
  15. package/Dockerfile +4 -1
  16. package/README.md +66 -18
  17. package/assets/mcpInstallv2.png +0 -0
  18. package/assets/sampleResponse.png +0 -0
  19. package/auth/index.html +13 -0
  20. package/auth/package.json +28 -0
  21. package/auth/public/favicon.ico +0 -0
  22. package/auth/src/App.tsx +33 -0
  23. package/auth/src/components/ErrorCard.tsx +37 -0
  24. package/auth/src/components/Layout.tsx +13 -0
  25. package/auth/src/index.css +19 -0
  26. package/auth/src/lib/broadcastService.ts +115 -0
  27. package/auth/src/lib/utils.ts +11 -0
  28. package/auth/src/main.tsx +22 -0
  29. package/auth/src/pages/ForgotPasswordPage.tsx +11 -0
  30. package/auth/src/pages/ResetPasswordPage.tsx +11 -0
  31. package/auth/src/pages/SignInPage.tsx +57 -0
  32. package/auth/src/pages/SignUpPage.tsx +57 -0
  33. package/auth/src/pages/VerifyEmailPage.tsx +20 -0
  34. package/auth/src/vite-env.d.ts +10 -0
  35. package/auth/tsconfig.json +32 -0
  36. package/auth/tsconfig.node.json +11 -0
  37. package/auth/vite.config.ts +25 -0
  38. package/backend/package.json +9 -9
  39. package/backend/src/api/{middleware → middlewares}/auth.ts +8 -9
  40. package/backend/src/api/middlewares/rate-limiters.ts +127 -0
  41. package/backend/src/api/routes/{ai.ts → ai/index.routes.ts} +20 -24
  42. package/backend/src/api/routes/auth/index.routes.ts +570 -0
  43. package/backend/src/api/routes/auth/oauth.routes.ts +448 -0
  44. package/backend/src/api/routes/{database.advance.ts → database/advance.routes.ts} +107 -65
  45. package/backend/src/api/routes/database/index.routes.ts +13 -0
  46. package/backend/src/api/routes/{database.records.ts → database/records.routes.ts} +22 -8
  47. package/backend/src/api/routes/{database.tables.ts → database/tables.routes.ts} +20 -23
  48. package/backend/src/api/routes/docs/index.routes.ts +76 -0
  49. package/backend/src/api/routes/functions/index.routes.ts +188 -0
  50. package/backend/src/api/routes/{logs.ts → logs/index.routes.ts} +25 -30
  51. package/backend/src/api/routes/{metadata.ts → metadata/index.routes.ts} +21 -31
  52. package/backend/src/api/routes/{secrets.ts → secrets/index.routes.ts} +27 -22
  53. package/backend/src/api/routes/{storage.ts → storage/index.routes.ts} +34 -53
  54. package/backend/src/api/routes/usage/index.routes.ts +89 -0
  55. package/backend/src/infra/config/app.config.ts +51 -0
  56. package/backend/src/{core/database/manager.ts → infra/database/database.manager.ts} +76 -85
  57. package/backend/src/infra/database/migrations/013_create-auth-schema-functions.sql +44 -0
  58. package/backend/src/infra/database/migrations/014_add-updated-at-trigger-user-table.sql +8 -0
  59. package/backend/src/infra/database/migrations/015_create-auth-config-and-email-otp-tables.sql +60 -0
  60. package/backend/src/infra/database/migrations/016_update-auth-config-and-email-otp.sql +24 -0
  61. package/backend/src/{core/secrets/encryption.ts → infra/security/encryption.manager.ts} +3 -2
  62. package/backend/src/infra/security/token.manager.ts +125 -0
  63. package/backend/src/{core/socket/socket.ts → infra/socket/socket.manager.ts} +15 -15
  64. package/backend/src/providers/ai/openrouter.provider.ts +377 -0
  65. package/backend/src/providers/email/base.provider.ts +41 -0
  66. package/backend/src/providers/email/cloud.provider.ts +187 -0
  67. package/backend/src/{core/logs/providers → providers/logs}/base.provider.ts +11 -11
  68. package/backend/src/{core/logs/providers → providers/logs}/cloudwatch.provider.ts +61 -38
  69. package/backend/src/providers/logs/local.provider.ts +185 -0
  70. package/backend/src/providers/oauth/base.provider.ts +29 -0
  71. package/backend/src/providers/oauth/discord.provider.ts +195 -0
  72. package/backend/src/providers/oauth/facebook.provider.ts +194 -0
  73. package/backend/src/providers/oauth/github.provider.ts +208 -0
  74. package/backend/src/providers/oauth/google.provider.ts +249 -0
  75. package/backend/src/providers/oauth/index.ts +7 -0
  76. package/backend/src/providers/oauth/linkedin.provider.ts +240 -0
  77. package/backend/src/providers/oauth/microsoft.provider.ts +169 -0
  78. package/backend/src/providers/oauth/x.provider.ts +202 -0
  79. package/backend/src/providers/storage/base.provider.ts +29 -0
  80. package/backend/src/providers/storage/local.provider.ts +103 -0
  81. package/backend/src/providers/storage/s3.provider.ts +313 -0
  82. package/backend/src/server.ts +70 -74
  83. package/backend/src/{core/ai/config.ts → services/ai/ai-config.service.ts} +19 -24
  84. package/backend/src/services/ai/ai-model.service.ts +60 -0
  85. package/backend/src/{core/ai/usage.ts → services/ai/ai-usage.service.ts} +28 -35
  86. package/backend/src/{core/ai/chat.ts → services/ai/chat-completion.service.ts} +37 -24
  87. package/backend/src/services/ai/helpers.ts +64 -0
  88. package/backend/src/{core/ai/image.ts → services/ai/image-generation.service.ts} +17 -19
  89. package/backend/src/services/ai/index.ts +13 -0
  90. package/backend/src/services/auth/auth-config.service.ts +250 -0
  91. package/backend/src/services/auth/auth-otp.service.ts +424 -0
  92. package/backend/src/services/auth/auth.service.ts +1136 -0
  93. package/backend/src/services/auth/index.ts +4 -0
  94. package/backend/src/{core/auth/oauth.ts → services/auth/oauth-config.service.ts} +106 -52
  95. package/backend/src/{core/database/advance.ts → services/database/database-advance.service.ts} +97 -131
  96. package/backend/src/services/database/database-table.service.ts +811 -0
  97. package/backend/src/services/email/email.service.ts +75 -0
  98. package/backend/src/{core/functions/functions.ts → services/functions/function.service.ts} +95 -88
  99. package/backend/src/{core/logs/audit.ts → services/logs/audit.service.ts} +92 -75
  100. package/backend/src/services/logs/log.service.ts +73 -0
  101. package/backend/src/{core/secrets/secrets.ts → services/secrets/secret.service.ts} +48 -66
  102. package/backend/src/services/storage/storage.service.ts +617 -0
  103. package/backend/src/services/usage/usage.service.ts +149 -0
  104. package/backend/src/types/auth.ts +66 -2
  105. package/backend/src/types/email.ts +8 -0
  106. package/backend/src/types/error-constants.ts +4 -0
  107. package/backend/src/types/logs.ts +0 -29
  108. package/backend/src/{core/socket/types.ts → types/socket.ts} +5 -6
  109. package/backend/src/utils/environment.ts +9 -3
  110. package/backend/src/utils/logger.ts +20 -2
  111. package/backend/src/utils/seed.ts +150 -57
  112. package/backend/src/utils/sql-parser.ts +1 -1
  113. package/backend/src/utils/utils.ts +114 -0
  114. package/backend/src/utils/validations.ts +40 -4
  115. package/backend/tests/local/test-ai-config.sh +129 -0
  116. package/backend/tests/local/test-ai-usage.sh +80 -0
  117. package/backend/tests/local/test-auth-router.sh +1 -1
  118. package/backend/tests/local/test-e2e.sh +1 -1
  119. package/backend/tests/local/test-functions.sh +123 -0
  120. package/backend/tests/local/test-logs.sh +132 -0
  121. package/backend/tests/local/test-public-bucket.sh +3 -3
  122. package/backend/tests/local/test-secrets.sh +14 -12
  123. package/backend/tests/local/test-traditional-rest.sh +2 -2
  124. package/backend/tests/manual/test-rawsql-modes.sh +244 -0
  125. package/backend/tests/test-config.sh +37 -1
  126. package/backend/tests/unit/cloud-token.test.ts +48 -0
  127. package/backend/tests/unit/constant.test.ts +8 -0
  128. package/backend/tests/unit/email.test.ts +372 -0
  129. package/backend/tests/unit/environment.test.ts +59 -0
  130. package/backend/tests/unit/helpers.test.ts +63 -0
  131. package/backend/tests/unit/logger.test.ts +22 -0
  132. package/backend/tests/unit/rate-limit.test.ts +154 -0
  133. package/backend/tests/unit/response.test.ts +58 -0
  134. package/backend/tests/unit/sql-parser.test.ts +74 -0
  135. package/backend/tests/unit/uuid.test.ts +21 -0
  136. package/backend/tests/unit/validations.test.ts +80 -0
  137. package/backend/tsconfig.json +1 -1
  138. package/backend/vitest.config.ts +11 -0
  139. package/claude-plugin/.claude-plugin/plugin.json +24 -0
  140. package/claude-plugin/README.md +133 -0
  141. package/claude-plugin/skills/insforge-schema-patterns/SKILL.md +270 -0
  142. package/docker-compose.prod.yml +60 -4
  143. package/docker-compose.yml +65 -4
  144. package/docker-init/db/db-init.sql +6 -34
  145. package/docker-init/logs/vector.yml +236 -0
  146. package/docs/README.md +44 -0
  147. package/docs/changelog.mdx +67 -0
  148. package/docs/core-concepts/ai/architecture.mdx +373 -0
  149. package/docs/core-concepts/ai/sdk.mdx +213 -0
  150. package/docs/core-concepts/authentication/architecture.mdx +278 -0
  151. package/docs/core-concepts/authentication/sdk.mdx +414 -0
  152. package/docs/core-concepts/authentication/ui-components/customization.mdx +529 -0
  153. package/docs/core-concepts/authentication/ui-components/nextjs.mdx +221 -0
  154. package/docs/core-concepts/authentication/ui-components/react-router.mdx +184 -0
  155. package/docs/core-concepts/authentication/ui-components/react.mdx +129 -0
  156. package/docs/core-concepts/database/architecture.mdx +256 -0
  157. package/docs/core-concepts/database/sdk.mdx +382 -0
  158. package/docs/core-concepts/functions/architecture.mdx +105 -0
  159. package/docs/core-concepts/functions/sdk.mdx +184 -0
  160. package/docs/core-concepts/storage/architecture.mdx +243 -0
  161. package/docs/core-concepts/storage/sdk.mdx +253 -0
  162. package/docs/deployment/README.md +94 -0
  163. package/docs/deployment/deploy-to-aws-ec2.md +565 -0
  164. package/docs/deployment/deploy-to-azure-virtual-machines.md +313 -0
  165. package/docs/deployment/deploy-to-google-cloud-compute-engine.md +613 -0
  166. package/docs/deployment/deploy-to-render.md +441 -0
  167. package/docs/docs.json +210 -0
  168. package/docs/examples/framework-guides/nextjs.mdx +131 -0
  169. package/docs/examples/framework-guides/nuxt.mdx +165 -0
  170. package/docs/examples/framework-guides/react.mdx +165 -0
  171. package/docs/examples/framework-guides/svelte.mdx +153 -0
  172. package/docs/examples/framework-guides/vue.mdx +159 -0
  173. package/docs/examples/overview.mdx +67 -0
  174. package/docs/favicon.svg +19 -0
  175. package/docs/images/changelog/nov-2025/auth-components.webp +0 -0
  176. package/docs/images/changelog/nov-2025/database-metadata.webp +0 -0
  177. package/docs/images/changelog/nov-2025/quickstart-prompts.webp +0 -0
  178. package/docs/images/changelog/nov-2025/sql-editor.webp +0 -0
  179. package/docs/images/changelog/nov-2025/usage-page.webp +0 -0
  180. package/docs/images/changelog/october-2025/csv-upload.webp +0 -0
  181. package/docs/images/changelog/october-2025/logs-feature.webp +0 -0
  182. package/docs/images/changelog/october-2025/oauth-providers.webp +0 -0
  183. package/docs/images/checks-passed.png +0 -0
  184. package/docs/images/dashboard-connect-expanded.png +0 -0
  185. package/docs/images/dashboard-connect.png +0 -0
  186. package/docs/images/hero-dark.png +0 -0
  187. package/docs/images/hero-light.png +0 -0
  188. package/docs/images/icons/ai.svg +4 -0
  189. package/docs/images/icons/auth.svg +1 -0
  190. package/docs/images/icons/database.svg +1 -0
  191. package/docs/images/icons/function.svg +1 -0
  192. package/docs/images/icons/storage.svg +1 -0
  193. package/docs/images/logos/nextjs.svg +4 -0
  194. package/docs/images/logos/nuxt.svg +4 -0
  195. package/docs/images/logos/react.svg +5 -0
  196. package/docs/images/logos/svelte.svg +4 -0
  197. package/docs/images/logos/vue.svg +5 -0
  198. package/docs/images/mcp-install.png +0 -0
  199. package/docs/images/onboarding-mcp.png +0 -0
  200. package/docs/insforge-instructions-sdk.md +55 -374
  201. package/docs/introduction.mdx +45 -0
  202. package/docs/logo/dark.svg +22 -0
  203. package/docs/logo/light.svg +20 -0
  204. package/docs/partnership.mdx +647 -0
  205. package/docs/quickstart.mdx +83 -0
  206. package/docs/showcase/2048-arena.png +0 -0
  207. package/docs/showcase/framegen-cloud.png +0 -0
  208. package/docs/showcase/line-connect-race.png +0 -0
  209. package/docs/showcase/moment-vibe.png +0 -0
  210. package/docs/showcase/national-flags.png +0 -0
  211. package/docs/showcase/pokemon-vibe.png +0 -0
  212. package/docs/showcase/pure-browse-buy.png +0 -0
  213. package/docs/showcase.mdx +52 -0
  214. package/docs/snippets/sdk-installation.mdx +22 -0
  215. package/docs/snippets/service-icons.mdx +27 -0
  216. package/eslint.config.js +10 -3
  217. package/frontend/package.json +10 -4
  218. package/frontend/src/App.tsx +13 -82
  219. package/frontend/src/assets/icons/connected.svg +3 -0
  220. package/frontend/src/assets/icons/loader.svg +9 -0
  221. package/frontend/src/assets/logos/apple.svg +4 -0
  222. package/frontend/src/assets/logos/discord.svg +1 -1
  223. package/frontend/src/assets/logos/facebook.svg +3 -0
  224. package/frontend/src/assets/logos/instagram.svg +2 -0
  225. package/frontend/src/assets/logos/linkedin.svg +3 -0
  226. package/frontend/src/assets/logos/microsoft.svg +1 -0
  227. package/frontend/src/assets/logos/spotify.svg +17 -0
  228. package/frontend/src/assets/logos/tiktok.svg +6 -0
  229. package/frontend/src/assets/logos/x.svg +3 -0
  230. package/frontend/src/components/Checkbox.tsx +27 -29
  231. package/frontend/src/components/CodeBlock.tsx +55 -2
  232. package/frontend/src/components/CodeEditor.tsx +92 -0
  233. package/frontend/src/components/ConfirmDialog.tsx +1 -1
  234. package/frontend/src/components/ConnectCTA.tsx +38 -0
  235. package/frontend/src/components/CopyButton.tsx +52 -15
  236. package/frontend/src/components/ErrorState.tsx +1 -2
  237. package/frontend/src/components/FeatureSidebar.tsx +6 -6
  238. package/frontend/src/components/FeatureSidebarItem.tsx +2 -2
  239. package/frontend/src/components/JsonHighlight.tsx +21 -9
  240. package/frontend/src/components/ProjectInfoModal.tsx +128 -0
  241. package/frontend/src/components/PromptDialog.tsx +1 -4
  242. package/frontend/src/components/SearchInput.tsx +1 -2
  243. package/frontend/src/components/Stepper.tsx +53 -0
  244. package/frontend/src/components/ThemeToggle.tsx +3 -3
  245. package/frontend/src/components/datagrid/DataGrid.tsx +25 -32
  246. package/frontend/src/components/datagrid/cell-editors/DateCellEditor.tsx +1 -2
  247. package/frontend/src/components/datagrid/cell-editors/JsonCellEditor.tsx +2 -4
  248. package/frontend/src/components/datagrid/index.ts +23 -0
  249. package/frontend/src/components/index.ts +23 -30
  250. package/frontend/src/components/layout/AppHeader.tsx +133 -92
  251. package/frontend/src/components/layout/AppSidebar.tsx +80 -170
  252. package/frontend/src/components/layout/Layout.tsx +12 -23
  253. package/frontend/src/components/layout/PrimaryMenu.tsx +187 -0
  254. package/frontend/src/components/layout/SecondaryMenu.tsx +70 -0
  255. package/frontend/src/components/layout/index.ts +5 -0
  256. package/frontend/src/components/radix/Tooltip.tsx +24 -13
  257. package/frontend/src/components/radix/index.ts +22 -0
  258. package/frontend/src/features/ai/components/AIConfigCard.tsx +129 -83
  259. package/frontend/src/features/ai/components/AIEmptyState.tsx +12 -7
  260. package/frontend/src/features/ai/components/ModalityFilterSidebar.tsx +101 -0
  261. package/frontend/src/features/ai/components/ModelSelectionDialog.tsx +135 -0
  262. package/frontend/src/features/ai/components/ModelSelectionGrid.tsx +51 -0
  263. package/frontend/src/features/ai/components/SystemPromptDialog.tsx +118 -0
  264. package/frontend/src/features/ai/components/index.ts +6 -0
  265. package/frontend/src/features/ai/helpers.ts +57 -71
  266. package/frontend/src/features/ai/hooks/useAIConfigs.ts +39 -113
  267. package/frontend/src/features/ai/hooks/useAIUsage.ts +0 -2
  268. package/frontend/src/features/ai/page/AIPage.tsx +67 -79
  269. package/frontend/src/features/ai/services/ai.service.ts +5 -5
  270. package/frontend/src/features/auth/components/AuthPreview.tsx +96 -0
  271. package/frontend/src/features/auth/components/OAuthConfigDialog.tsx +53 -30
  272. package/frontend/src/features/auth/components/UserFormDialog.tsx +13 -6
  273. package/frontend/src/features/auth/components/UsersDataGrid.tsx +44 -14
  274. package/frontend/src/features/auth/components/index.ts +5 -0
  275. package/frontend/src/features/auth/helpers.tsx +200 -0
  276. package/frontend/src/features/auth/hooks/useAnonToken.ts +30 -0
  277. package/frontend/src/features/auth/hooks/useAuthConfig.ts +48 -0
  278. package/frontend/src/features/auth/hooks/useOAuthConfig.ts +14 -10
  279. package/frontend/src/features/auth/hooks/useUsers.ts +43 -5
  280. package/frontend/src/features/auth/index.ts +3 -2
  281. package/frontend/src/features/auth/page/AuthMethodsPage.tsx +275 -0
  282. package/frontend/src/features/auth/page/ConfigurationPage.tsx +395 -0
  283. package/frontend/src/features/auth/page/UsersPage.tsx +285 -0
  284. package/frontend/src/features/auth/services/anonToken.service.ts +11 -0
  285. package/frontend/src/features/auth/services/config.service.ts +19 -0
  286. package/frontend/src/features/auth/services/{oauth.service.ts → oauth-config.service.ts} +4 -4
  287. package/frontend/src/features/auth/services/{auth.service.ts → user.service.ts} +7 -53
  288. package/frontend/src/features/dashboard/components/ConnectionSuccessBanner.tsx +35 -0
  289. package/frontend/src/features/dashboard/components/PromptCard.tsx +21 -0
  290. package/frontend/src/features/dashboard/components/PromptDialog.tsx +103 -0
  291. package/frontend/src/features/dashboard/components/StatsCard.tsx +50 -0
  292. package/frontend/src/features/dashboard/components/index.ts +4 -0
  293. package/frontend/src/features/dashboard/page/DashboardPage.tsx +187 -169
  294. package/frontend/src/features/dashboard/prompts/ai-chatbot.ts +13 -0
  295. package/frontend/src/features/dashboard/prompts/crm-system.ts +13 -0
  296. package/frontend/src/features/dashboard/prompts/ecommerce-platform.ts +12 -0
  297. package/frontend/src/features/dashboard/prompts/index.ts +31 -0
  298. package/frontend/src/features/dashboard/prompts/instagram-clone.ts +11 -0
  299. package/frontend/src/features/dashboard/prompts/notion-clone.ts +14 -0
  300. package/frontend/src/features/dashboard/prompts/reddit-clone.ts +12 -0
  301. package/frontend/src/features/database/components/DatabaseDataGrid.tsx +48 -17
  302. package/frontend/src/features/database/components/ForeignKeyCell.tsx +15 -34
  303. package/frontend/src/features/database/components/ForeignKeyPopover.tsx +19 -20
  304. package/frontend/src/features/database/components/LinkRecordModal.tsx +120 -125
  305. package/frontend/src/features/database/components/RecordFormDialog.tsx +22 -33
  306. package/frontend/src/features/database/components/RecordFormField.tsx +45 -47
  307. package/frontend/src/features/database/components/TableEmptyState.tsx +6 -5
  308. package/frontend/src/features/database/components/TableForm.tsx +28 -15
  309. package/frontend/src/features/database/components/TableFormColumn.tsx +2 -3
  310. package/frontend/src/features/database/components/TableSidebar.tsx +1 -1
  311. package/frontend/src/features/database/components/TablesEmptyState.tsx +48 -0
  312. package/frontend/src/features/database/components/TemplateCard.tsx +37 -0
  313. package/frontend/src/features/database/components/TemplatePreview.tsx +92 -0
  314. package/frontend/src/features/database/components/index.ts +19 -0
  315. package/frontend/src/features/database/constants.ts +28 -2
  316. package/frontend/src/features/database/contexts/SQLEditorContext.tsx +188 -0
  317. package/frontend/src/features/database/helpers.ts +2 -2
  318. package/frontend/src/features/database/hooks/useCSVImport.ts +29 -0
  319. package/frontend/src/features/database/hooks/useFullMetadata.ts +18 -0
  320. package/frontend/src/features/database/hooks/useRawSQL.ts +55 -0
  321. package/frontend/src/features/database/hooks/useRecords.ts +139 -0
  322. package/frontend/src/features/database/hooks/useTables.ts +131 -0
  323. package/frontend/src/features/database/index.ts +6 -1
  324. package/frontend/src/features/database/page/FunctionsPage.tsx +211 -0
  325. package/frontend/src/features/database/page/IndexesPage.tsx +240 -0
  326. package/frontend/src/features/database/page/PoliciesPage.tsx +248 -0
  327. package/frontend/src/features/database/page/SQLEditorPage.tsx +382 -0
  328. package/frontend/src/features/database/page/{DatabasePage.tsx → TablesPage.tsx} +186 -185
  329. package/frontend/src/features/database/page/TemplatesPage.tsx +39 -0
  330. package/frontend/src/features/database/page/TriggersPage.tsx +242 -0
  331. package/frontend/src/features/database/services/advance.service.ts +66 -0
  332. package/frontend/src/features/database/services/{database.service.ts → record.service.ts} +67 -64
  333. package/frontend/src/features/database/services/table.service.ts +64 -0
  334. package/frontend/src/features/database/templates/ai-chatbot.ts +402 -0
  335. package/frontend/src/features/database/templates/crm-system.ts +528 -0
  336. package/frontend/src/features/database/templates/ecommerce-platform.ts +553 -0
  337. package/frontend/src/features/database/templates/index.ts +34 -0
  338. package/frontend/src/features/database/templates/instagram-clone.ts +222 -0
  339. package/frontend/src/features/database/templates/notion-clone.ts +483 -0
  340. package/frontend/src/features/database/templates/reddit-clone.ts +526 -0
  341. package/frontend/src/features/functions/components/FunctionRow.tsx +2 -1
  342. package/frontend/src/features/functions/components/FunctionsSidebar.tsx +1 -1
  343. package/frontend/src/features/functions/components/SecretRow.tsx +1 -1
  344. package/frontend/src/features/functions/components/index.ts +5 -0
  345. package/frontend/src/features/functions/hooks/useFunctions.ts +4 -4
  346. package/frontend/src/features/{secrets → functions}/hooks/useSecrets.ts +5 -5
  347. package/frontend/src/features/functions/page/FunctionsPage.tsx +160 -17
  348. package/frontend/src/features/functions/{components/SecretsContent.tsx → page/SecretsPage.tsx} +8 -12
  349. package/frontend/src/features/functions/services/{functions.service.ts → function.service.ts} +2 -2
  350. package/frontend/src/features/{secrets/services/secrets.service.ts → functions/services/secret.service.ts} +2 -2
  351. package/frontend/src/features/login/hooks/usePartnerOrigin.ts +27 -0
  352. package/frontend/src/features/login/page/CloudLoginPage.tsx +79 -54
  353. package/frontend/src/features/login/page/LoginPage.tsx +16 -23
  354. package/frontend/src/features/login/services/partnership.service.ts +65 -0
  355. package/frontend/src/features/logs/components/LogsDataGrid.tsx +89 -0
  356. package/frontend/src/features/logs/components/SeverityBadge.tsx +18 -0
  357. package/frontend/src/features/logs/components/index.ts +2 -0
  358. package/frontend/src/features/logs/helpers.ts +24 -0
  359. package/frontend/src/features/logs/hooks/useAuditLogs.ts +4 -4
  360. package/frontend/src/features/logs/hooks/useLogSources.ts +137 -0
  361. package/frontend/src/features/logs/hooks/useLogs.ts +163 -0
  362. package/frontend/src/features/logs/hooks/useMcpUsage.ts +181 -0
  363. package/frontend/src/features/logs/index.ts +8 -2
  364. package/frontend/src/features/logs/page/AuditsPage.tsx +91 -38
  365. package/frontend/src/features/logs/page/LogsPage.tsx +152 -0
  366. package/frontend/src/features/logs/page/MCPLogsPage.tsx +84 -0
  367. package/frontend/src/features/logs/services/audit.service.ts +63 -0
  368. package/frontend/src/features/logs/services/log.service.ts +15 -110
  369. package/frontend/src/features/logs/services/usage.service.ts +31 -0
  370. package/frontend/src/features/onboard/components/McpConnectionStatus.tsx +68 -0
  371. package/frontend/src/features/onboard/components/OnboardingModal.tsx +267 -0
  372. package/frontend/src/features/onboard/components/VideoDemoModal.tsx +38 -0
  373. package/frontend/src/features/onboard/components/index.ts +4 -0
  374. package/frontend/src/features/onboard/components/mcp/CursorDeeplinkGenerator.tsx +2 -2
  375. package/frontend/src/features/onboard/components/mcp/{mcp-helper.tsx → helpers.tsx} +8 -8
  376. package/frontend/src/features/onboard/components/mcp/index.ts +2 -3
  377. package/frontend/src/features/onboard/index.ts +13 -3
  378. package/frontend/src/features/storage/components/BucketEmptyState.tsx +9 -6
  379. package/frontend/src/features/storage/components/BucketFormDialog.tsx +25 -41
  380. package/frontend/src/features/storage/components/FilePreviewDialog.tsx +20 -8
  381. package/frontend/src/features/storage/components/StorageDataGrid.tsx +4 -3
  382. package/frontend/src/features/storage/components/StorageManager.tsx +23 -34
  383. package/frontend/src/features/storage/components/index.ts +12 -0
  384. package/frontend/src/features/storage/hooks/useStorage.ts +208 -0
  385. package/frontend/src/features/storage/page/StoragePage.tsx +41 -115
  386. package/frontend/src/features/storage/services/storage.service.ts +22 -1
  387. package/frontend/src/features/visualizer/components/AuthNode.tsx +72 -56
  388. package/frontend/src/features/visualizer/components/BucketNode.tsx +4 -4
  389. package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +108 -80
  390. package/frontend/src/features/visualizer/components/TableNode.tsx +34 -41
  391. package/frontend/src/features/visualizer/components/VisualizerSkeleton.tsx +12 -4
  392. package/frontend/src/features/visualizer/page/VisualizerPage.tsx +33 -29
  393. package/frontend/src/index.css +1 -0
  394. package/frontend/src/lib/analytics/posthog.tsx +27 -0
  395. package/frontend/src/lib/contexts/AuthContext.tsx +38 -31
  396. package/frontend/src/lib/contexts/SocketContext.tsx +5 -6
  397. package/frontend/src/{features/metadata → lib}/hooks/useMetadata.ts +1 -1
  398. package/frontend/src/lib/hooks/useToast.tsx +6 -2
  399. package/frontend/src/lib/routing/AppRoutes.tsx +84 -0
  400. package/frontend/src/lib/routing/RequireAuth.tsx +27 -0
  401. package/frontend/src/lib/utils/cloudMessaging.ts +20 -0
  402. package/frontend/src/lib/utils/menuItems.ts +183 -0
  403. package/frontend/src/lib/utils/{validation-schemas.ts → schemaValidations.ts} +10 -5
  404. package/frontend/src/lib/utils/utils.ts +19 -1
  405. package/frontend/src/vite-env.d.ts +1 -0
  406. package/frontend/vite.config.ts +5 -3
  407. package/functions/server.ts +28 -3
  408. package/functions/worker-template.js +15 -4
  409. package/i18n/README.ar.md +130 -0
  410. package/i18n/README.de.md +130 -0
  411. package/i18n/README.es.md +154 -0
  412. package/i18n/README.fr.md +134 -0
  413. package/i18n/README.hi.md +129 -0
  414. package/i18n/README.ja.md +174 -0
  415. package/i18n/README.ko.md +137 -0
  416. package/i18n/README.pt-BR.md +131 -0
  417. package/i18n/README.ru.md +129 -0
  418. package/i18n/README.zh-CN.md +133 -0
  419. package/openapi/ai.yaml +31 -4
  420. package/openapi/auth.yaml +827 -146
  421. package/package.json +16 -7
  422. package/shared-schemas/package.json +1 -1
  423. package/shared-schemas/src/ai-api.schema.ts +34 -58
  424. package/shared-schemas/src/ai.schema.ts +5 -0
  425. package/shared-schemas/src/auth-api.schema.ts +154 -8
  426. package/shared-schemas/src/auth.schema.ts +42 -6
  427. package/shared-schemas/src/cloud-events.schema.ts +57 -0
  428. package/shared-schemas/src/database-api.schema.ts +3 -3
  429. package/shared-schemas/src/database.schema.ts +1 -1
  430. package/shared-schemas/src/index.ts +1 -0
  431. package/shared-schemas/src/logs-api.schema.ts +7 -1
  432. package/shared-schemas/src/logs.schema.ts +26 -0
  433. package/shared-schemas/src/metadata.schema.ts +9 -4
  434. package/test-gemini.sh +35 -0
  435. package/test-usage-admin.sh +57 -0
  436. package/test-usage.sh +50 -0
  437. package/zeabur/README.md +13 -0
  438. package/zeabur/template.yml +1032 -0
  439. package/.github/workflows/deploy-aws.yml +0 -130
  440. package/backend/src/api/routes/agent.ts +0 -29
  441. package/backend/src/api/routes/auth.oauth.ts +0 -482
  442. package/backend/src/api/routes/auth.ts +0 -386
  443. package/backend/src/api/routes/docs.ts +0 -66
  444. package/backend/src/api/routes/functions.ts +0 -183
  445. package/backend/src/api/routes/openapi.ts +0 -82
  446. package/backend/src/api/routes/usage.ts +0 -96
  447. package/backend/src/core/ai/client.ts +0 -242
  448. package/backend/src/core/ai/model.ts +0 -117
  449. package/backend/src/core/auth/auth.ts +0 -781
  450. package/backend/src/core/database/table.ts +0 -772
  451. package/backend/src/core/documentation/agent.ts +0 -689
  452. package/backend/src/core/documentation/openapi.ts +0 -856
  453. package/backend/src/core/logs/analytics.ts +0 -76
  454. package/backend/src/core/logs/providers/localdb.provider.ts +0 -246
  455. package/backend/src/core/storage/storage.ts +0 -923
  456. package/backend/src/utils/cloud-token.ts +0 -39
  457. package/backend/src/utils/helpers.ts +0 -49
  458. package/backend/src/utils/uuid.ts +0 -9
  459. package/backend/tests/manual/test-better-auth.sh +0 -303
  460. package/docker-init/db/logs.sql +0 -9
  461. package/frontend/README.md +0 -112
  462. package/frontend/src/components/datagrid/index.tsx +0 -20
  463. package/frontend/src/components/layout/CloudLayout.tsx +0 -95
  464. package/frontend/src/features/ai/components/AIConfigDialog.tsx +0 -76
  465. package/frontend/src/features/ai/components/AIConfigForm.tsx +0 -222
  466. package/frontend/src/features/ai/components/fields/ModalityField.tsx +0 -87
  467. package/frontend/src/features/ai/components/fields/ModelSelectionField.tsx +0 -134
  468. package/frontend/src/features/ai/components/fields/SystemPromptField.tsx +0 -33
  469. package/frontend/src/features/auth/components/AddOAuthDialog.tsx +0 -106
  470. package/frontend/src/features/auth/components/AuthMethodTab.tsx +0 -238
  471. package/frontend/src/features/auth/components/UsersTab.tsx +0 -114
  472. package/frontend/src/features/auth/page/AuthenticationPage.tsx +0 -169
  473. package/frontend/src/features/database/hooks/UseLinkModal.tsx +0 -78
  474. package/frontend/src/features/functions/components/FunctionViewer.tsx +0 -46
  475. package/frontend/src/features/functions/components/FunctionsContent.tsx +0 -88
  476. package/frontend/src/features/login/components/AuthErrorBoundary.tsx +0 -87
  477. package/frontend/src/features/login/components/PrivateRoute.tsx +0 -24
  478. package/frontend/src/features/logs/components/AnalyticsLogsTable.tsx +0 -313
  479. package/frontend/src/features/logs/components/LogsTable.tsx +0 -199
  480. package/frontend/src/features/logs/page/AnalyticsLogsPage.tsx +0 -530
  481. package/frontend/src/features/metadata/index.ts +0 -0
  482. package/frontend/src/features/metadata/page/MetadataPage.tsx +0 -136
  483. package/frontend/src/features/onboard/components/CompletionCard.tsx +0 -41
  484. package/frontend/src/features/onboard/components/OnboardButton.tsx +0 -84
  485. package/frontend/src/features/onboard/components/StepContent.tsx +0 -91
  486. package/frontend/src/features/onboard/components/TestConnectionStep.tsx +0 -53
  487. package/frontend/src/features/onboard/components/mcp/McpInstallation.tsx +0 -144
  488. package/frontend/src/features/onboard/page/OnBoardPage.tsx +0 -104
  489. package/frontend/src/features/onboard/types.ts +0 -8
  490. package/frontend/src/lib/contexts/OnboardStepContext.tsx +0 -68
  491. package/frontend/src/lib/hooks/useOnboardingCompletion.ts +0 -29
  492. /package/backend/src/api/{middleware → middlewares}/error.ts +0 -0
  493. /package/backend/src/api/{middleware → middlewares}/upload.ts +0 -0
  494. /package/backend/{migrations → src/infra/database/migrations}/000_create-base-tables.sql +0 -0
  495. /package/backend/{migrations → src/infra/database/migrations}/001_create-helper-functions.sql +0 -0
  496. /package/backend/{migrations → src/infra/database/migrations}/002_rename-auth-tables.sql +0 -0
  497. /package/backend/{migrations → src/infra/database/migrations}/003_create-users-table.sql +0 -0
  498. /package/backend/{migrations → src/infra/database/migrations}/004_add-reload-postgrest-func.sql +0 -0
  499. /package/backend/{migrations → src/infra/database/migrations}/005_enable-project-admin-modify-users.sql +0 -0
  500. /package/backend/{migrations → src/infra/database/migrations}/006_modify-ai-usage-table.sql +0 -0
  501. /package/backend/{migrations → src/infra/database/migrations}/007_drop-metadata-table.sql +0 -0
  502. /package/backend/{migrations → src/infra/database/migrations}/008_add-system-tables.sql +0 -0
  503. /package/backend/{migrations → src/infra/database/migrations}/009_add-function-secrets.sql +0 -0
  504. /package/backend/{migrations → src/infra/database/migrations}/010_modify-ai-config-modalities.sql +0 -0
  505. /package/backend/{migrations → src/infra/database/migrations}/011_refactor-secrets-table.sql +0 -0
  506. /package/backend/{migrations → src/infra/database/migrations}/012_add-storage-uploaded-by.sql +0 -0
  507. /package/frontend/src/{features/metadata → lib}/services/metadata.service.ts +0 -0
@@ -1,41 +0,0 @@
1
- import { Button } from '@/components/radix/Button';
2
- import CheckedIcon from '@/assets/icons/checked.svg';
3
- import { useNavigate } from 'react-router-dom';
4
- import { useOnboardingCompletion } from '@/lib/hooks/useOnboardingCompletion';
5
- import { useEffect } from 'react';
6
-
7
- export function CompletionCard() {
8
- const navigate = useNavigate();
9
- const { markAsCompleted } = useOnboardingCompletion();
10
-
11
- // Mark as completed when this component is mounted
12
- useEffect(() => {
13
- markAsCompleted();
14
- }, [markAsCompleted]);
15
-
16
- const handleNavigate = async () => {
17
- await navigate('/dashboard');
18
- };
19
-
20
- return (
21
- <div className="border border-transparent dark:border-neutral-700 rounded-xl bg-white dark:bg-neutral-800 py-8 px-6">
22
- <div className="flex flex-col items-center justify-center gap-8">
23
- <div className="flex flex-col items-center justify-center gap-4 text-center">
24
- <img src={CheckedIcon} alt="Checked" className="w-10 h-10" />
25
- <p className="text-lg font-semibold text-black dark:text-white">You are all set!</p>
26
- <p className="text-zinc-500 dark:text-zinc-400 text-sm">
27
- Your AI agent is now full-stack — powered by <b>InsForge</b>.
28
- <br /> Let&apos;s build something <b>real</b>.
29
- </p>
30
- </div>
31
- <Button
32
- variant="default"
33
- className="px-4 py-2 h-10 text-sm font-medium dark:bg-emerald-300 dark:text-black dark:hover:bg-emerald-200"
34
- onClick={() => void handleNavigate()}
35
- >
36
- Go to Dashboard
37
- </Button>
38
- </div>
39
- </div>
40
- );
41
- }
@@ -1,84 +0,0 @@
1
- import { Link, useLocation } from 'react-router-dom';
2
- import { cn } from '@/lib/utils/utils';
3
- import { Button } from '@/components/radix/Button';
4
- import {
5
- Tooltip,
6
- TooltipContent,
7
- TooltipProvider,
8
- TooltipTrigger,
9
- } from '@/components/radix/Tooltip';
10
- import { CircularStepper } from '@/components/Stepper';
11
- import { useOnboardStep, STEP_DESCRIPTIONS } from '@/lib/contexts/OnboardStepContext';
12
-
13
- interface OnboardButtonProps {
14
- isCollapsed: boolean;
15
- }
16
-
17
- export function OnboardButton({ isCollapsed }: OnboardButtonProps) {
18
- const location = useLocation();
19
- const { currentStep, totalSteps } = useOnboardStep();
20
-
21
- const isActive = location.pathname === '/dashboard/onboard';
22
-
23
- // Limit displayed step to totalSteps for the sidebar
24
- const displayStep = Math.min(currentStep, totalSteps);
25
- const currentDescription = STEP_DESCRIPTIONS[displayStep - 1];
26
-
27
- return (
28
- <TooltipProvider delayDuration={300}>
29
- <Tooltip>
30
- <TooltipTrigger asChild>
31
- <Link to="/dashboard/onboard" className="block">
32
- <Button
33
- variant="ghost"
34
- className={cn(
35
- 'w-full h-16 relative transition-all duration-200 ease-in-out border-2 rounded-lg justify-start',
36
- isCollapsed ? 'pl-[11px] pr-2.5' : 'px-3.5',
37
- isActive
38
- ? 'border-zinc-900 dark:bg-emerald-300 dark:hover:bg-emerald-200 bg-zinc-900 hover:bg-zinc-900 '
39
- : 'border-zinc-200 dark:border-neutral-700 hover:bg-zinc-50 dark:hover:bg-neutral-600 hover:border-zinc-300 dark:text-white'
40
- )}
41
- >
42
- <CircularStepper
43
- currentStep={displayStep}
44
- totalSteps={totalSteps}
45
- size={40}
46
- isActive={isActive}
47
- />
48
- {!isCollapsed && (
49
- <div className="absolute left-16.5 flex flex-col items-start">
50
- <span
51
- className={cn(
52
- 'font-semibold text-sm transition-colors duration-200',
53
- isActive ? 'text-zinc-50 dark:text-black' : 'text-zinc-950 dark:text-white'
54
- )}
55
- >
56
- Get Started
57
- </span>
58
- <span
59
- className={cn(
60
- 'text-xs transition-colors duration-200',
61
- isActive
62
- ? 'text-text-gray dark:text-zinc-800'
63
- : 'text-zinc-500 dark:text-white'
64
- )}
65
- >
66
- {currentDescription}
67
- </span>
68
- </div>
69
- )}
70
- </Button>
71
- </Link>
72
- </TooltipTrigger>
73
- {isCollapsed && (
74
- <TooltipContent side="right">
75
- <div className="text-center">
76
- <p className="font-semibold">Get Started</p>
77
- <p className="text-xs text-text-gray dark:text-neutural-600">{currentDescription}</p>
78
- </div>
79
- </TooltipContent>
80
- )}
81
- </Tooltip>
82
- </TooltipProvider>
83
- );
84
- }
@@ -1,91 +0,0 @@
1
- import { OnboardStep } from '../types';
2
- import { CodeBlock } from '@/components/CodeBlock';
3
- import { McpInstallation } from '@/features/onboard/components/mcp';
4
- import { TestConnectionStep } from './TestConnectionStep';
5
-
6
- interface StepContentProps {
7
- step: OnboardStep;
8
- }
9
-
10
- export function StepContent({ step }: StepContentProps) {
11
- switch (step) {
12
- case OnboardStep.INSTALL_NODEJS:
13
- return (
14
- <div className="border border-transparent dark:border-neutral-800 rounded-xl bg-white dark:bg-neutral-800 py-8 px-6 space-y-4">
15
- <div>
16
- <p className="text-zinc-950 dark:text-white text-sm mb-4">
17
- Install{' '}
18
- <a
19
- href="https://nodejs.org"
20
- target="_blank"
21
- rel="noopener noreferrer"
22
- className="text-link-blue underline inline-flex items-center gap-1"
23
- >
24
- Node.js
25
- </a>
26
- . Visit the official Node.js website at{' '}
27
- <a
28
- href="https://nodejs.org/"
29
- target="_blank"
30
- rel="noopener noreferrer"
31
- className="text-link-blue underline"
32
- >
33
- https://nodejs.org/
34
- </a>
35
- </p>
36
- <p className="text-zinc-950 dark:text-white text-sm">
37
- Verify installation by opening a terminal and running:
38
- </p>
39
- </div>
40
-
41
- <div className="grid grid-cols-1 md:grid-cols-2 gap-4">
42
- <CodeBlock
43
- code="node --version"
44
- className="dark:bg-neutral-700 dark:text-white"
45
- buttonClassName="dark:bg-neutral-800 dark:hover:bg-neutral-800"
46
- />
47
- <CodeBlock
48
- code="npm --version"
49
- className="dark:bg-neutral-700 dark:text-white"
50
- buttonClassName="dark:bg-neutral-800 dark:hover:bg-neutral-800"
51
- />
52
- </div>
53
- </div>
54
- );
55
-
56
- case OnboardStep.INSTALL_MCP:
57
- return <McpInstallation TabListClassName="dark:bg-neutral-800" />;
58
-
59
- case OnboardStep.TEST_CONNECTION:
60
- return <TestConnectionStep />;
61
-
62
- case OnboardStep.FINAL_SETUP:
63
- return (
64
- <div className="space-y-6 border border-transparent dark:border-neutral-700 rounded-xl bg-white dark:bg-neutral-800 py-8 px-6">
65
- <div>
66
- <p className="text-zinc-950 dark:text-white text-sm mb-4">
67
- Whenever you start a new chat session, init your AI agents with the InsForge init
68
- prompt:
69
- </p>
70
- </div>
71
-
72
- <CodeBlock
73
- code="Learn how to use InsForge"
74
- className="bg-slate-50 dark:bg-neutral-700 dark:text-white"
75
- buttonClassName="dark:bg-neutral-800 dark:hover:bg-neutral-800"
76
- />
77
-
78
- <div>
79
- <p className="text-zinc-950 dark:text-white text-sm">Then you can start building!</p>
80
- </div>
81
- </div>
82
- );
83
-
84
- default:
85
- return (
86
- <div className="text-center text-zinc-500">
87
- <p>Step content not found</p>
88
- </div>
89
- );
90
- }
91
- }
@@ -1,53 +0,0 @@
1
- import { CodeBlock } from '@/components/CodeBlock';
2
- import { ServerEvents, useSocket } from '@/lib/contexts/SocketContext';
3
- import { ClockIcon } from 'lucide-react';
4
- import CheckedIcon from '@/assets/icons/checked.svg';
5
- import { useEffect, useState } from 'react';
6
-
7
- export function TestConnectionStep() {
8
- const [showSuccess, setShowSuccess] = useState(false);
9
-
10
- // Use the Socket hook - it will auto-connect
11
- const { socket } = useSocket();
12
-
13
- // Show success message when mcp connects
14
- useEffect(() => {
15
- const handleMcpConnected = () => setShowSuccess(true);
16
-
17
- socket?.on(ServerEvents.MCP_CONNECTED, handleMcpConnected);
18
-
19
- return () => {
20
- socket?.off(ServerEvents.MCP_CONNECTED, handleMcpConnected);
21
- };
22
- }, [socket]);
23
-
24
- return (
25
- <div className="space-y-6 border border-transparent dark:border-neutral-700 rounded-xl bg-white dark:bg-neutral-800 py-8 px-6">
26
- <div>
27
- <p className="text-zinc-950 dark:text-white text-sm mb-4">
28
- Open your agent&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
- }
@@ -1,144 +0,0 @@
1
- import { useState, useMemo } from 'react';
2
- import { cn, getBackendUrl } from '@/lib/utils/utils';
3
- import { CodeBlock } from '@/components/CodeBlock';
4
- import { Tabs, TabsList, TabsTrigger, TabsContent } from '@/components/radix/Tabs';
5
- import { Alert, AlertDescription } from '@/components/radix/Alert';
6
- import { JsonHighlight } from '@/components/JsonHighlight';
7
- import { CursorDeeplinkGenerator } from './CursorDeeplinkGenerator';
8
- import {
9
- MCP_AGENTS,
10
- createMCPConfig,
11
- GenerateInstallCommand,
12
- type MCPAgent,
13
- type PlatformType,
14
- } from './mcp-helper';
15
- import { useApiKey } from '@/features/metadata/hooks/useMetadata';
16
-
17
- interface McpInstallerProps {
18
- className?: string;
19
- defaultAgent?: string;
20
- TabListClassName?: string;
21
- }
22
-
23
- export function McpInstallation({
24
- className,
25
- defaultAgent = 'cursor',
26
- TabListClassName,
27
- }: McpInstallerProps) {
28
- const [selectedAgent, setSelectedAgent] = useState<MCPAgent>(() => {
29
- return MCP_AGENTS.find((agent) => agent.id === defaultAgent) || MCP_AGENTS[0];
30
- });
31
- const [activeTab, setActiveTab] = useState<PlatformType>('macos-linux');
32
-
33
- const { apiKey } = useApiKey();
34
-
35
- const handleTabChange = (value: string) => {
36
- setActiveTab(value as PlatformType);
37
- };
38
-
39
- const mcpConfig = useMemo(() => {
40
- return createMCPConfig(apiKey || '', activeTab, getBackendUrl());
41
- }, [apiKey, activeTab]);
42
-
43
- return (
44
- <div className={cn('w-full flex flex-col gap-2 overflow-hidden', className)}>
45
- {/* Agent Tabs */}
46
- <Tabs
47
- value={selectedAgent.id}
48
- onValueChange={(value) => {
49
- const agent = MCP_AGENTS.find((a) => a.id === value);
50
- if (agent) {
51
- setSelectedAgent(agent);
52
- }
53
- }}
54
- >
55
- <TabsList
56
- className={cn(
57
- 'grid w-full grid-cols-7 bg-neutral-200 dark:bg-neutral-900 p-1 rounded-lg h-fit mb-2',
58
- TabListClassName
59
- )}
60
- >
61
- {MCP_AGENTS.map((agent) => (
62
- <TabsTrigger
63
- key={agent.id}
64
- value={agent.id}
65
- className="rounded-sm px-4 py-2 text-sm font-normal transition-all duration-200 flex flex-row items-center justify-start gap-1
66
- data-[state=active]:bg-white dark:data-[state=active]:bg-neutral-700 dark:data-[state=active]:text-white data-[state=active]:text-gray-900 data-[state=active]:shadow-sm
67
- data-[state=inactive]:text-gray-600 dark:data-[state=inactive]:text-neutral-400 data-[state=inactive]:hover:text-gray-900"
68
- >
69
- {agent.logo}
70
- {agent.displayName}
71
- </TabsTrigger>
72
- ))}
73
- </TabsList>
74
-
75
- {/* Content for each agent */}
76
- {MCP_AGENTS.map((agent) => (
77
- <TabsContent key={agent.id} value={agent.id} className="mt-0">
78
- {agent.id !== 'mcp' ? (
79
- <div className="bg-white dark:bg-neutral-700 px-6 py-8 flex flex-col items-start justify-start gap-4 rounded-xl border border-border-gray dark:border-neutral-700">
80
- {agent.id === 'cursor' && (
81
- <CursorDeeplinkGenerator apiKey={apiKey} os={activeTab} />
82
- )}
83
- {/* Alternative Installation */}
84
- <p className="text-zinc-950 dark:text-neutral-300 text-sm">
85
- {agent.id === 'cursor' ? 'or copy' : 'Copy'} the command below and paste it to
86
- terminal
87
- </p>
88
- {/* Command Block */}
89
- <CodeBlock
90
- code={GenerateInstallCommand(agent, apiKey || '')}
91
- className="bg-slate-50 dark:bg-neutral-800 w-full font-normal text-blue-800 dark:text-blue-400"
92
- />
93
- </div>
94
- ) : (
95
- <div className="px-6 py-8 bg-white dark:bg-neutral-800 overflow-hidden rounded-xl border border-border-gray dark:border-neutral-700">
96
- <p className="text-zinc-950 dark:text-white text-sm mb-3">
97
- Copy the configuration below and add it to your AI assistant.
98
- </p>
99
-
100
- {/* OS Tabs */}
101
- <div className="flex items-center justify-between">
102
- <Tabs value={activeTab} onValueChange={handleTabChange} className="w-full">
103
- <TabsList className="grid w-60 grid-cols-2 bg-gray-100 dark:bg-neutral-900 p-1.5 rounded-lg h-fit">
104
- <TabsTrigger
105
- value="macos-linux"
106
- className="h-7 rounded-sm px-3 py-1 text-sm font-medium transition-all duration-200
107
- data-[state=active]:bg-white dark:data-[state=active]:bg-neutral-700 dark:data-[state=active]:text-white data-[state=active]:text-gray-900 data-[state=active]:shadow-sm
108
- data-[state=inactive]:text-gray-600 dark:data-[state=inactive]:text-neutral-400 data-[state=inactive]:hover:text-gray-900"
109
- >
110
- MacOS/Linux
111
- </TabsTrigger>
112
- <TabsTrigger
113
- value="windows"
114
- className="h-7 rounded-sm px-3 py-1 text-sm font-medium transition-all duration-200
115
- data-[state=active]:bg-white dark:data-[state=active]:bg-neutral-700 dark:data-[state=active]:text-white data-[state=active]:text-gray-900 data-[state=active]:shadow-sm
116
- data-[state=inactive]:text-gray-600 dark:data-[state=inactive]:text-neutral-400 data-[state=inactive]:hover:text-gray-900"
117
- >
118
- Windows
119
- </TabsTrigger>
120
- </TabsList>
121
- </Tabs>
122
- </div>
123
-
124
- {/* Configuration content */}
125
- <div className="mt-1">
126
- {!apiKey && (
127
- <Alert className="border-yellow-200 bg-yellow-50 mb-4">
128
- <AlertDescription className="text-yellow-800">
129
- No API key found. Please ensure the backend is running and you&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
- }
@@ -1,104 +0,0 @@
1
- import { useState, useEffect } from 'react';
2
- import { useNavigate, useSearchParams } from 'react-router-dom';
3
- import { Button } from '@/components/radix/Button';
4
- import { useOnboardStep, STEP_DESCRIPTIONS } from '@/lib/contexts/OnboardStepContext';
5
- import { type OnboardStep } from '../types';
6
- import { LinearStepper } from '@/components/Stepper';
7
- import { StepContent } from '../components/StepContent';
8
- import { CompletionCard } from '../components/CompletionCard';
9
-
10
- export default function OnBoardPage() {
11
- const navigate = useNavigate();
12
- const [searchParams, setSearchParams] = useSearchParams();
13
- const { currentStep, updateStep, totalSteps } = useOnboardStep();
14
- const [isCompleted, setIsCompleted] = useState(false);
15
-
16
- // Handle reinstall with step parameter
17
- useEffect(() => {
18
- const stepParam = searchParams.get('step');
19
- if (stepParam === '1') {
20
- updateStep(1);
21
- setIsCompleted(false);
22
- setSearchParams({});
23
- }
24
- }, [searchParams, setSearchParams, updateStep]);
25
-
26
- const handleDismiss = async () => {
27
- await navigate('/dashboard');
28
- };
29
-
30
- const handleNext = () => {
31
- if (currentStep < totalSteps) {
32
- updateStep((currentStep + 1) as OnboardStep);
33
- } else if (currentStep === totalSteps) {
34
- setIsCompleted(true);
35
- }
36
- };
37
-
38
- const handleBack = () => {
39
- if (currentStep > 1) {
40
- updateStep((currentStep - 1) as OnboardStep);
41
- }
42
- };
43
-
44
- return (
45
- <div className="min-h-screen bg-bg-gray dark:bg-neutral-900">
46
- <div className="container max-w-[1080px] mx-auto px-6 py-12">
47
- {/* Header with Linear Stepper */}
48
- <div className="mb-12 space-y-3">
49
- <h1 className="text-2xl font-bold text-black dark:text-white">Get Started</h1>
50
- <LinearStepper
51
- currentStep={currentStep}
52
- totalSteps={totalSteps}
53
- stepLabels={STEP_DESCRIPTIONS}
54
- isCompleted={isCompleted}
55
- />
56
- </div>
57
-
58
- {/* Main Content Card */}
59
- {isCompleted ? (
60
- <CompletionCard />
61
- ) : (
62
- <div className="space-y-3">
63
- <p className="text-black dark:text-white text-lg font-semibold">
64
- {STEP_DESCRIPTIONS[currentStep - 1]}
65
- </p>
66
- <StepContent step={currentStep} />
67
-
68
- {/* Action Buttons */}
69
- <div className="flex justify-between items-center">
70
- {/* Dismiss Button - Left */}
71
- <Button
72
- variant="outline"
73
- onClick={() => void handleDismiss()}
74
- className="h-10 w-30 py-2 text-zinc-950 dark:text-white dark:border-neutral-700 dark:bg-neutral-700"
75
- >
76
- Dismiss
77
- </Button>
78
-
79
- {/* Navigation Buttons - Right */}
80
- <div className="flex space-x-4">
81
- {currentStep > 1 && (
82
- <Button
83
- variant="outline"
84
- onClick={() => void handleBack()}
85
- className="h-10 w-30 text-zinc-950 dark:text-white dark:border-neutral-700 dark:bg-neutral-700"
86
- >
87
- Back
88
- </Button>
89
- )}
90
- <Button
91
- variant="default"
92
- onClick={() => void handleNext()}
93
- className="h-10 w-30 dark:bg-emerald-300 dark:text-black dark:hover:bg-emerald-200 disabled:opacity-50 disabled:cursor-not-allowed"
94
- >
95
- {currentStep === totalSteps ? 'Complete' : 'Next'}
96
- </Button>
97
- </div>
98
- </div>
99
- </div>
100
- )}
101
- </div>
102
- </div>
103
- );
104
- }
@@ -1,8 +0,0 @@
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;
@@ -1,68 +0,0 @@
1
- import React, { createContext, useContext, useState, useEffect } from 'react';
2
- import { OnboardStep, TOTAL_STEPS } from '@/features/onboard/types';
3
-
4
- interface OnboardContextValue {
5
- currentStep: OnboardStep;
6
- updateStep: (step: OnboardStep) => void;
7
- getCurrentDescription: () => string;
8
- totalSteps: number;
9
- }
10
-
11
- const ONBOARD_STORAGE_KEY = 'insforge_onboard_step';
12
- export const STEP_DESCRIPTIONS = [
13
- 'Install Node.js',
14
- 'Install InsForge',
15
- 'Test the Connection',
16
- 'Start Using InsForge',
17
- ] as const;
18
-
19
- const OnboardContext = createContext<OnboardContextValue | null>(null);
20
-
21
- export function OnboardStepProvider({ children }: { children: React.ReactNode }) {
22
- const [currentStep, setCurrentStep] = useState<OnboardStep>(() => {
23
- const saved = localStorage.getItem(ONBOARD_STORAGE_KEY);
24
- const n = saved ? parseInt(saved, 10) : NaN;
25
- return n >= OnboardStep.INSTALL_NODEJS && n <= OnboardStep.FINAL_SETUP
26
- ? (n as OnboardStep)
27
- : OnboardStep.INSTALL_NODEJS;
28
- });
29
-
30
- useEffect(() => {
31
- const onStorage = (e: StorageEvent) => {
32
- if (e.key === ONBOARD_STORAGE_KEY && e.newValue) {
33
- const n = parseInt(e.newValue, 10) as OnboardStep;
34
- if (n >= OnboardStep.INSTALL_NODEJS && n <= OnboardStep.FINAL_SETUP) {
35
- setCurrentStep(n);
36
- }
37
- }
38
- };
39
- window.addEventListener('storage', onStorage);
40
- return () => window.removeEventListener('storage', onStorage);
41
- }, []);
42
-
43
- const updateStep = (step: OnboardStep) => {
44
- if (step < OnboardStep.INSTALL_NODEJS || step > OnboardStep.FINAL_SETUP) {
45
- return;
46
- }
47
- setCurrentStep(step);
48
- localStorage.setItem(ONBOARD_STORAGE_KEY, step.toString());
49
- };
50
-
51
- const getCurrentDescription = () => STEP_DESCRIPTIONS[currentStep - 1];
52
-
53
- return (
54
- <OnboardContext.Provider
55
- value={{ currentStep, updateStep, getCurrentDescription, totalSteps: TOTAL_STEPS }}
56
- >
57
- {children}
58
- </OnboardContext.Provider>
59
- );
60
- }
61
-
62
- export function useOnboardStep() {
63
- const ctx = useContext(OnboardContext);
64
- if (!ctx) {
65
- throw new Error('useOnboardStep must be used within an OnboardProvider');
66
- }
67
- return ctx;
68
- }
@@ -1,29 +0,0 @@
1
- import { useMemo } from 'react';
2
-
3
- const ONBOARDING_COMPLETION_KEY = 'insforge_onboarding_completed';
4
-
5
- export function useOnboardingCompletion() {
6
- const isCompleted = useMemo<boolean>(() => {
7
- const stored = localStorage.getItem(ONBOARDING_COMPLETION_KEY);
8
- return stored === 'true';
9
- }, []);
10
-
11
- const markAsCompleted = () => {
12
- localStorage.setItem(ONBOARDING_COMPLETION_KEY, 'true');
13
- };
14
-
15
- const resetCompletion = () => {
16
- localStorage.setItem(ONBOARDING_COMPLETION_KEY, 'false');
17
- };
18
-
19
- return {
20
- isCompleted,
21
- markAsCompleted,
22
- resetCompletion,
23
- };
24
- }
25
-
26
- // Export utility function for direct usage
27
- export const markOnboardingAsCompleted = () => {
28
- localStorage.setItem(ONBOARDING_COMPLETION_KEY, 'true');
29
- };