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,43 +1,34 @@
1
- import { useState, useEffect } from 'react';
1
+ import { useState } from 'react';
2
2
  import { Plus, Loader2 } from 'lucide-react';
3
- import { Button } from '@/components/radix/Button';
4
- import { ConfirmDialog } from '@/components/ConfirmDialog';
3
+ import { Button, ConfirmDialog } from '@/components';
5
4
  import { useAIConfigs } from '../hooks/useAIConfigs';
6
5
  import { useAIRemainingCredits } from '../hooks/useAIUsage';
7
6
  import {
8
- AIConfigurationWithUsageSchema,
9
7
  CreateAIConfigurationRequest,
10
8
  UpdateAIConfigurationRequest,
11
9
  } from '@insforge/shared-schemas';
12
10
  import { useConfirm } from '@/lib/hooks/useConfirm';
13
- import { useToast } from '@/lib/hooks/useToast';
14
- import { AIConfigDialog } from '@/features/ai/components/AIConfigDialog';
15
- import { AIModelCard } from '@/features/ai/components/AIConfigCard';
16
- import AIEmptyState from '@/features/ai/components/AIEmptyState';
17
- import { getProviderLogo } from '../helpers';
11
+ import {
12
+ AIEmptyState,
13
+ ModelSelectionDialog,
14
+ SystemPromptDialog,
15
+ AIModelCard,
16
+ } from '@/features/ai/components';
17
+ import { isInsForgeCloudProject } from '@/lib/utils/utils';
18
18
 
19
19
  export default function AIPage() {
20
20
  const {
21
- configurations,
21
+ configurationOptions,
22
22
  isLoadingConfigurations,
23
23
  createConfiguration,
24
24
  updateConfiguration,
25
25
  deleteConfiguration,
26
26
  } = useAIConfigs();
27
27
 
28
- const { data: credits, error: getAICreditsError } = useAIRemainingCredits();
28
+ const { data: credits, error: getAICreditsError } =
29
+ useAIRemainingCredits(!isInsForgeCloudProject());
29
30
 
30
31
  const { confirm, confirmDialogProps } = useConfirm();
31
- const { showToast } = useToast();
32
-
33
- // Handle AI credits error
34
- useEffect(() => {
35
- if (getAICreditsError) {
36
- console.error('Failed to fetch AI credits:', getAICreditsError);
37
- const errorMessage = getAICreditsError.message || 'Failed to load AI credits';
38
- showToast(errorMessage, 'error');
39
- }
40
- }, [getAICreditsError, showToast]);
41
32
 
42
33
  // Format credits display
43
34
  const formatCredits = (remaining: number) => {
@@ -47,17 +38,13 @@ export default function AIPage() {
47
38
  return remaining.toFixed(2);
48
39
  };
49
40
 
50
- const [dialogOpen, setDialogOpen] = useState(false);
51
- const [dialogMode, setDialogMode] = useState<'create' | 'edit'>('create');
52
- const [editingConfig, setEditingConfig] = useState<AIConfigurationWithUsageSchema | undefined>();
41
+ const [modelSelectionOpen, setModelSelectionOpen] = useState(false);
42
+ const [systemPromptOpen, setSystemPromptOpen] = useState(false);
43
+ const [editingConfigId, setEditingConfigId] = useState<string | undefined>();
53
44
 
54
45
  const handleEdit = (id: string) => {
55
- const config = configurations.find((c) => c.id === id);
56
- if (config) {
57
- setEditingConfig(config);
58
- setDialogMode('edit');
59
- setDialogOpen(true);
60
- }
46
+ setEditingConfigId(id);
47
+ setSystemPromptOpen(true);
61
48
  };
62
49
 
63
50
  const handleDelete = async (id: string) => {
@@ -75,37 +62,34 @@ export default function AIPage() {
75
62
  };
76
63
 
77
64
  const handleCreate = () => {
78
- setEditingConfig(undefined);
79
- setDialogMode('create');
80
- setDialogOpen(true);
65
+ setModelSelectionOpen(true);
81
66
  };
82
67
 
83
- const handleDialogSuccess = (
84
- configData: CreateAIConfigurationRequest | UpdateAIConfigurationRequest
85
- ) => {
86
- if (dialogMode === 'create') {
87
- const createData = configData as CreateAIConfigurationRequest;
88
- createConfiguration({
89
- inputModality: createData.inputModality,
90
- outputModality: createData.outputModality,
91
- provider: createData.provider,
92
- modelId: createData.modelId,
93
- systemPrompt: createData.systemPrompt,
94
- });
95
- } else if (editingConfig) {
96
- const updateData = configData as UpdateAIConfigurationRequest;
68
+ const handleModelSelectionSuccess = (configData: CreateAIConfigurationRequest) => {
69
+ createConfiguration({
70
+ inputModality: configData.inputModality,
71
+ outputModality: configData.outputModality,
72
+ provider: configData.provider,
73
+ modelId: configData.modelId,
74
+ });
75
+ };
76
+
77
+ // Derive the editing config from the ID
78
+ const editingConfig = configurationOptions.find((c) => c.id === editingConfigId);
79
+
80
+ const handleSystemPromptSuccess = (configData: UpdateAIConfigurationRequest) => {
81
+ if (editingConfigId) {
97
82
  updateConfiguration({
98
- id: editingConfig.id,
83
+ id: editingConfigId,
99
84
  data: {
100
- systemPrompt: updateData.systemPrompt || null,
85
+ systemPrompt: configData.systemPrompt || null,
101
86
  },
102
87
  });
103
88
  }
104
- setDialogOpen(false);
105
89
  };
106
90
 
107
91
  return (
108
- <div className="flex h-full bg-bg-gray dark:bg-neutral-800 pt-8 pb-6">
92
+ <div className="flex h-full bg-white dark:bg-neutral-800 pt-8 pb-6">
109
93
  <div className="max-w-[1080px] mx-auto flex-1 flex flex-col gap-6 overflow-hidden">
110
94
  {/* Header Section */}
111
95
  <div className="w-full flex items-start justify-between">
@@ -113,13 +97,13 @@ export default function AIPage() {
113
97
  <div className="flex items-center gap-3">
114
98
  <h1 className="text-xl font-semibold text-black dark:text-white">AI Integration</h1>
115
99
  {credits?.remaining && (
116
- <span className="text-sm font-normal text-emerald-500 dark:text-emerald-400 mt-[2.5px]">
100
+ <span className="text-sm font-normal text-neutral-700 dark:text-emerald-300 mt-[2.5px]">
117
101
  {formatCredits(credits.remaining)} credit{credits.remaining !== 1 ? 's' : ''} left
118
102
  </span>
119
103
  )}
120
104
  </div>
121
105
  <p className="text-sm text-neutral-500 dark:text-neutral-400">
122
- Copy prompt to your agent and the AI Model below will be integrated automatically.
106
+ Your models are ready build LLM-powered features or add more integrations.
123
107
  </p>
124
108
  </div>
125
109
  <Button
@@ -133,42 +117,46 @@ export default function AIPage() {
133
117
 
134
118
  {/* Content Section */}
135
119
  <div className="flex-1 overflow-auto">
136
- {isLoadingConfigurations ? (
120
+ {getAICreditsError ? (
121
+ <AIEmptyState title="Configuration Error" description={getAICreditsError.message} />
122
+ ) : isLoadingConfigurations ? (
137
123
  <div className="flex-1 flex items-center justify-center h-full">
138
124
  <Loader2 className="w-8 h-8 animate-spin text-gray-400" />
139
125
  </div>
140
- ) : configurations.length > 0 ? (
126
+ ) : configurationOptions.length ? (
141
127
  <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6">
142
- {configurations.map((config) => {
143
- const providerLogo = getProviderLogo(config.modelId.split('/')[0]);
144
- const extendedConfig = {
145
- ...config,
146
- logo: providerLogo,
147
- };
148
-
149
- return (
150
- <AIModelCard
151
- key={config.id}
152
- config={extendedConfig}
153
- onEdit={handleEdit}
154
- onDelete={() => void handleDelete(config.id)}
155
- />
156
- );
157
- })}
128
+ {configurationOptions.map((modelOption) => (
129
+ <AIModelCard
130
+ key={modelOption.id}
131
+ config={modelOption}
132
+ mode="configured"
133
+ onEdit={handleEdit}
134
+ onDelete={() => void handleDelete(modelOption.id)}
135
+ />
136
+ ))}
158
137
  </div>
159
138
  ) : (
160
- <AIEmptyState />
139
+ <AIEmptyState
140
+ title="No AI Integration Yet"
141
+ description="Add your first integration to get started"
142
+ />
161
143
  )}
162
144
  </div>
163
145
  </div>
164
146
 
165
- {/* AI Configuration Dialog */}
166
- <AIConfigDialog
167
- open={dialogOpen}
168
- onOpenChange={setDialogOpen}
169
- mode={dialogMode}
170
- editingConfig={editingConfig}
171
- onSuccess={handleDialogSuccess}
147
+ {/* Model Selection Dialog */}
148
+ <ModelSelectionDialog
149
+ open={modelSelectionOpen}
150
+ onOpenChange={setModelSelectionOpen}
151
+ onSuccess={handleModelSelectionSuccess}
152
+ />
153
+
154
+ {/* System Prompt Dialog */}
155
+ <SystemPromptDialog
156
+ open={systemPromptOpen}
157
+ onOpenChange={setSystemPromptOpen}
158
+ initialSystemPrompt={editingConfig?.systemPrompt}
159
+ onSuccess={handleSystemPromptSuccess}
172
160
  />
173
161
 
174
162
  {/* Confirm Dialog */}
@@ -1,17 +1,17 @@
1
1
  import { apiClient } from '@/lib/api/client';
2
2
  import {
3
- ListModelsResponse,
3
+ AIModelSchema,
4
4
  AIConfigurationSchema,
5
- AIConfigurationWithUsageSchema,
6
5
  CreateAIConfigurationRequest,
7
6
  UpdateAIConfigurationRequest,
8
7
  AIUsageSummarySchema,
9
8
  AIUsageRecordSchema,
10
9
  ListAIUsageResponse,
10
+ AIConfigurationWithUsageSchema,
11
11
  } from '@insforge/shared-schemas';
12
12
 
13
- export class AiService {
14
- getModels(): Promise<ListModelsResponse> {
13
+ export class AIService {
14
+ getModels(): Promise<AIModelSchema[]> {
15
15
  return apiClient.request('/ai/models', {
16
16
  headers: apiClient.withAccessToken(),
17
17
  });
@@ -145,4 +145,4 @@ export class AiService {
145
145
  }
146
146
  }
147
147
 
148
- export const aiService = new AiService();
148
+ export const aiService = new AIService();
@@ -0,0 +1,96 @@
1
+ import { useState, useEffect } from 'react';
2
+ import { SignInForm, SignUpForm, ForgotPasswordForm } from '@insforge/react';
3
+ import { useAuthConfig } from '../hooks/useAuthConfig';
4
+ import { useOAuthConfig } from '../hooks/useOAuthConfig';
5
+
6
+ type AuthView = 'sign-in' | 'sign-up' | 'forgot-password';
7
+
8
+ export function AuthPreview() {
9
+ const { config } = useAuthConfig();
10
+ const { configs: oAuthConfigs } = useOAuthConfig();
11
+ const [view, setView] = useState<AuthView>('sign-in');
12
+ const [email, setEmail] = useState('');
13
+ const [password, setPassword] = useState('');
14
+
15
+ // Listen to hash changes
16
+ useEffect(() => {
17
+ const handleHashChange = () => {
18
+ const hash = window.location.hash.slice(1); // Remove the #
19
+ if (
20
+ hash === 'preview=sign-in' ||
21
+ hash === 'preview=sign-up' ||
22
+ hash === 'preview=forgot-password'
23
+ ) {
24
+ setView(hash.replace('preview=', '') as AuthView);
25
+ }
26
+ };
27
+
28
+ // Set initial view from hash
29
+ handleHashChange();
30
+
31
+ // Listen for hash changes
32
+ window.addEventListener('hashchange', handleHashChange);
33
+ return () => window.removeEventListener('hashchange', handleHashChange);
34
+ }, []);
35
+
36
+ const authConfig = {
37
+ oAuthProviders: oAuthConfigs.map((provider) => provider.provider) ?? [],
38
+ passwordMinLength: config?.passwordMinLength ?? 6,
39
+ requireEmailVerification: !!config?.requireEmailVerification,
40
+ requireLowercase: !!config?.requireLowercase,
41
+ requireNumber: !!config?.requireNumber,
42
+ requireSpecialChar: !!config?.requireSpecialChar,
43
+ requireUppercase: !!config?.requireUppercase,
44
+ resetPasswordMethod: config?.resetPasswordMethod ?? ('code' as const),
45
+ verifyEmailMethod: config?.verifyEmailMethod ?? ('code' as const),
46
+ };
47
+
48
+ const handleSubmit = (e: React.FormEvent) => {
49
+ e.preventDefault();
50
+ // Preview mode - do nothing
51
+ };
52
+
53
+ const handleOAuthClick = () => {
54
+ // Preview mode - do nothing
55
+ };
56
+
57
+ return (
58
+ <div className="w-[400px]">
59
+ {view === 'sign-in' && (
60
+ <SignInForm
61
+ email={email}
62
+ password={password}
63
+ onEmailChange={setEmail}
64
+ onPasswordChange={setPassword}
65
+ onSubmit={handleSubmit}
66
+ authConfig={authConfig}
67
+ onOAuthClick={handleOAuthClick}
68
+ forgotPasswordUrl="#preview=forgot-password"
69
+ signUpUrl="#preview=sign-up"
70
+ />
71
+ )}
72
+
73
+ {view === 'sign-up' && (
74
+ <SignUpForm
75
+ email={email}
76
+ password={password}
77
+ onEmailChange={setEmail}
78
+ onPasswordChange={setPassword}
79
+ onSubmit={handleSubmit}
80
+ authConfig={authConfig}
81
+ onOAuthClick={handleOAuthClick}
82
+ signInUrl="#preview=sign-in"
83
+ />
84
+ )}
85
+
86
+ {view === 'forgot-password' && (
87
+ <ForgotPasswordForm
88
+ email={email}
89
+ onEmailChange={setEmail}
90
+ onSubmit={handleSubmit}
91
+ backToSignInUrl="#preview=sign-in"
92
+ />
93
+ )}
94
+ </div>
95
+ );
96
+ }
@@ -3,26 +3,36 @@ import { useForm, Controller, useFormState } from 'react-hook-form';
3
3
  import { zodResolver } from '@hookform/resolvers/zod';
4
4
  import { z } from 'zod';
5
5
  import { ExternalLink } from 'lucide-react';
6
- import { Button } from '@/components/radix/Button';
7
- import { Input } from '@/components/radix/Input';
8
- import { Switch } from '@/components/radix/Switch';
9
6
  import {
7
+ Button,
8
+ Input,
9
+ Switch,
10
+ CopyButton,
10
11
  Dialog,
11
12
  DialogContent,
12
13
  DialogHeader,
13
14
  DialogTitle,
14
15
  DialogFooter,
15
- } from '@/components/radix/Dialog';
16
+ } from '@/components';
16
17
  import WarningIcon from '@/assets/icons/warning.svg';
17
- import { CopyButton } from '@/components/CopyButton';
18
- import { oAuthConfigSchema, OAuthConfigSchema } from '@insforge/shared-schemas';
19
- import { OAuthProviderInfo } from './AuthMethodTab';
18
+ import {
19
+ oAuthConfigSchema,
20
+ OAuthConfigSchema,
21
+ OAuthProvidersSchema,
22
+ } from '@insforge/shared-schemas';
23
+ import { type OAuthProviderInfo } from '../helpers';
20
24
  import { useOAuthConfig } from '@/features/auth/hooks/useOAuthConfig';
21
25
  import { getBackendUrl, isInsForgeCloudProject } from '@/lib/utils/utils';
22
26
 
23
27
  const getCallbackUrl = (provider?: string) => {
24
28
  // Use backend API URL for OAuth callback
25
- return `${getBackendUrl()}/api/auth/oauth/${provider}/callback`;
29
+ let backendUrl = getBackendUrl();
30
+
31
+ // Check if backend URL contains "localhost" and provider is "x"
32
+ if (provider === 'x' && backendUrl.includes('localhost')) {
33
+ backendUrl = backendUrl.replace('://localhost', '://www.localhost');
34
+ }
35
+ return `${backendUrl}/api/auth/oauth/${provider}/callback`;
26
36
  };
27
37
 
28
38
  interface OAuthConfigDialogProps {
@@ -63,6 +73,17 @@ export function OAuthConfigDialog({
63
73
  const clientId = form.watch('clientId');
64
74
  const clientSecret = form.watch('clientSecret');
65
75
 
76
+ // Our Cloud only support shared keys of these OAuth Providers for now
77
+ const sharedKeyProviders: readonly OAuthProvidersSchema[] = [
78
+ 'google',
79
+ 'github',
80
+ 'discord',
81
+ 'linkedin',
82
+ 'facebook',
83
+ ] satisfies readonly OAuthProvidersSchema[];
84
+ const isSharedKeysAvailable =
85
+ isInsForgeCloudProject() && provider?.id && sharedKeyProviders.includes(provider.id);
86
+
66
87
  // Use useFormState hook for better reactivity
67
88
  const { isDirty } = useFormState({
68
89
  control: form.control,
@@ -90,11 +111,11 @@ export function OAuthConfigDialog({
90
111
  provider: provider.id,
91
112
  clientId: '',
92
113
  clientSecret: '',
93
- useSharedKey: isInsForgeCloudProject(),
114
+ useSharedKey: isSharedKeysAvailable,
94
115
  });
95
116
  }
96
117
  }
97
- }, [isOpen, provider, providerConfig, form, isLoadingProvider]);
118
+ }, [form, isLoadingProvider, isOpen, isSharedKeysAvailable, provider, providerConfig]);
98
119
 
99
120
  const handleSubmitData = (data: OAuthConfigSchema & { clientSecret?: string }) => {
100
121
  if (!provider) {
@@ -180,25 +201,27 @@ export function OAuthConfigDialog({
180
201
  <form onSubmit={(e) => e.preventDefault()} className="flex flex-col">
181
202
  <div className="space-y-6 p-6">
182
203
  {/* Shared Keys Toggle */}
183
- <div className="flex items-center justify-start gap-2">
184
- <Controller
185
- name="useSharedKey"
186
- control={form.control}
187
- render={({ field }) => {
188
- return (
189
- <Switch
190
- checked={field.value}
191
- onCheckedChange={(value) => {
192
- field.onChange(value);
193
- }}
194
- />
195
- );
196
- }}
197
- />
198
- <span className="text-sm font-medium text-gray-900 dark:text-white">
199
- Shared Keys
200
- </span>
201
- </div>
204
+ {isSharedKeysAvailable && (
205
+ <div className="flex items-center justify-start gap-2">
206
+ <Controller
207
+ name="useSharedKey"
208
+ control={form.control}
209
+ render={({ field }) => {
210
+ return (
211
+ <Switch
212
+ checked={field.value}
213
+ onCheckedChange={(value) => {
214
+ field.onChange(value);
215
+ }}
216
+ />
217
+ );
218
+ }}
219
+ />
220
+ <span className="text-sm font-medium text-gray-900 dark:text-white">
221
+ Shared Keys
222
+ </span>
223
+ </div>
224
+ )}
202
225
 
203
226
  {useSharedKey ? (
204
227
  /* Shared Keys Enabled */
@@ -292,7 +315,7 @@ export function OAuthConfigDialog({
292
315
  : 'Adding...'
293
316
  : providerConfig
294
317
  ? 'Update'
295
- : 'Add OAuth'}
318
+ : 'Add Provider'}
296
319
  </Button>
297
320
  </DialogFooter>
298
321
  </>
@@ -1,18 +1,21 @@
1
1
  import React, { useState, useEffect } from 'react';
2
2
  import { Mail, Lock, AlertCircle } from 'lucide-react';
3
- import { authService } from '@/features/auth/services/auth.service';
4
- import { Button, Input, Label, Alert, AlertDescription } from '@/components';
5
3
  import {
4
+ Button,
5
+ Input,
6
+ Label,
7
+ Alert,
8
+ AlertDescription,
6
9
  Dialog,
7
10
  DialogContent,
8
11
  DialogHeader,
9
12
  DialogTitle,
10
13
  DialogFooter,
11
- } from '@/components/radix/Dialog';
14
+ } from '@/components';
12
15
  import ErrorIcon from '@/assets/icons/error.svg';
13
16
  import { useToast } from '@/lib/hooks/useToast';
14
17
  import { useUsers } from '@/features/auth/hooks/useUsers';
15
- import { emailSchema } from '@/lib/utils/validation-schemas';
18
+ import { emailSchema } from '@insforge/shared-schemas';
16
19
  import { z } from 'zod';
17
20
 
18
21
  interface User {
@@ -63,7 +66,7 @@ export function UserFormDialog({ open, onOpenChange, user }: UserFormDialogProps
63
66
  const [showValidation, setShowValidation] = useState(false);
64
67
 
65
68
  const { showToast } = useToast();
66
- const { refetch } = useUsers();
69
+ const { refetch, register } = useUsers();
67
70
 
68
71
  const isEditing = !!user;
69
72
 
@@ -126,7 +129,11 @@ export function UserFormDialog({ open, onOpenChange, user }: UserFormDialogProps
126
129
  userData.id = user.id;
127
130
  }
128
131
 
129
- await authService.register(userData.email, userData.password || '', userData.name);
132
+ await register({
133
+ email: userData.email,
134
+ password: userData.password || '',
135
+ name: userData.name,
136
+ });
130
137
  void refetch();
131
138
  onOpenChange(false);
132
139
  showToast('User created successfully', 'success');
@@ -1,13 +1,13 @@
1
1
  import { useMemo } from 'react';
2
2
  import {
3
+ Badge,
3
4
  DataGrid,
4
5
  createDefaultCellRenderer,
5
6
  type DataGridProps,
6
7
  type DataGridColumn,
7
8
  type RenderCellProps,
8
9
  ConvertedValue,
9
- } from '@/components/datagrid';
10
- import { Badge } from '@/components/radix/Badge';
10
+ } from '@/components';
11
11
  import { cn } from '@/lib/utils/utils';
12
12
  import type { UserSchema } from '@insforge/shared-schemas';
13
13
 
@@ -33,12 +33,42 @@ const ProviderIcon = ({ provider }: { provider: string }) => {
33
33
  color:
34
34
  'bg-gray-100 text-gray-700 dark:bg-neutral-800 dark:text-zinc-300 dark:border-gray-500',
35
35
  };
36
+ case 'discord':
37
+ return {
38
+ label: 'Discord',
39
+ color:
40
+ 'bg-gray-100 text-gray-700 dark:bg-neutral-800 dark:text-zinc-300 dark:border-gray-500',
41
+ };
42
+ case 'linkedin':
43
+ return {
44
+ label: 'LinkedIn',
45
+ color:
46
+ 'bg-blue-100 text-blue-700 dark:bg-blue-900/20 dark:text-blue-300 dark:border-blue-500',
47
+ };
48
+ case 'facebook':
49
+ return {
50
+ label: 'Facebook',
51
+ color:
52
+ 'bg-blue-50 text-blue-600 dark:bg-blue-900/20 dark:text-blue-400 dark:border-blue-600',
53
+ };
54
+ case 'microsoft':
55
+ return {
56
+ label: 'Microsoft',
57
+ color:
58
+ 'bg-gray-100 text-gray-700 dark:bg-neutral-800 dark:text-zinc-300 dark:border-gray-500',
59
+ };
36
60
  case 'email':
37
61
  return {
38
62
  label: 'Email',
39
63
  color:
40
64
  'bg-green-100 text-green-700 dark:bg-neutral-800 dark:text-green-300 dark:border-green-500',
41
65
  };
66
+ case 'x':
67
+ return {
68
+ label: 'X',
69
+ color:
70
+ 'bg-gray-100 text-gray-700 dark:bg-neutral-800 dark:text-zinc-300 dark:border-gray-500',
71
+ };
42
72
  default:
43
73
  return {
44
74
  label: provider,
@@ -63,7 +93,7 @@ const ProviderIcon = ({ provider }: { provider: string }) => {
63
93
  const IdentitiesCellRenderer = ({ row }: RenderCellProps<UserDataGridRow>) => {
64
94
  const identities = row.identities;
65
95
 
66
- if (!identities || !Array.isArray(identities) || identities.length === 0) {
96
+ if (!identities || !Array.isArray(identities) || !identities.length) {
67
97
  return <span className="text-sm text-black dark:text-zinc-300">null</span>;
68
98
  }
69
99
 
@@ -83,7 +113,7 @@ const IdentitiesCellRenderer = ({ row }: RenderCellProps<UserDataGridRow>) => {
83
113
  {uniqueProviders.length > 2 && (
84
114
  <Badge
85
115
  variant="secondary"
86
- className="text-xs bg-gray-100 text-gray-600 dark:bg-neutral-800 dark:text-zinc-300 dark:border-neutral-700"
116
+ className="text-xs px-2 py-1 bg-gray-100 text-gray-600 dark:bg-neutral-800 dark:text-zinc-300 dark:border-neutral-700 border border-transparent"
87
117
  >
88
118
  +{uniqueProviders.length - 2}
89
119
  </Badge>
@@ -124,7 +154,7 @@ export function createUsersColumns(): DataGridColumn<UserDataGridRow>[] {
124
154
  {
125
155
  key: 'identities',
126
156
  name: 'Identities',
127
- width: '1fr',
157
+ width: '1.5fr',
128
158
  resizable: true,
129
159
  sortable: true,
130
160
  renderCell: IdentitiesCellRenderer,
@@ -137,6 +167,14 @@ export function createUsersColumns(): DataGridColumn<UserDataGridRow>[] {
137
167
  sortable: true,
138
168
  renderCell: cellRenderers.text,
139
169
  },
170
+ {
171
+ key: 'emailVerified',
172
+ name: 'Email Verified',
173
+ width: '1fr',
174
+ resizable: true,
175
+ sortable: true,
176
+ renderCell: cellRenderers.boolean,
177
+ },
140
178
  {
141
179
  key: 'createdAt',
142
180
  name: 'Created',
@@ -160,21 +198,13 @@ export function createUsersColumns(): DataGridColumn<UserDataGridRow>[] {
160
198
  export type UsersDataGridProps = Omit<DataGridProps<UserDataGridRow>, 'columns'>;
161
199
 
162
200
  // Specialized DataGrid for users
163
- export function UsersDataGrid({
164
- emptyStateTitle = 'No users available',
165
- emptyStateActionText,
166
- onEmptyStateAction,
167
- ...props
168
- }: UsersDataGridProps) {
201
+ export function UsersDataGrid(props: UsersDataGridProps) {
169
202
  const columns = useMemo(() => createUsersColumns(), []);
170
203
 
171
204
  return (
172
205
  <DataGrid<UserDataGridRow>
173
206
  {...props}
174
207
  columns={columns}
175
- emptyStateTitle={emptyStateTitle}
176
- emptyStateActionText={emptyStateActionText}
177
- onEmptyStateAction={onEmptyStateAction}
178
208
  showSelection={true}
179
209
  showPagination={true}
180
210
  showTypeBadge={false}
@@ -0,0 +1,5 @@
1
+ export { AuthPreview } from './AuthPreview';
2
+ export { OAuthConfigDialog } from './OAuthConfigDialog';
3
+ export { OAuthEmptyState } from './OAuthEmptyState';
4
+ export { default as UserFormDialog } from './UserFormDialog';
5
+ export { createUsersColumns, UsersDataGrid, type UsersDataGridProps } from './UsersDataGrid';