insforge 0.3.3 → 1.3.0

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 (635) hide show
  1. package/.claude-plugin/marketplace.json +20 -0
  2. package/.dockerignore +60 -57
  3. package/.env.example +84 -49
  4. package/.github/ISSUE_TEMPLATE/bug_report.yml +36 -83
  5. package/.github/ISSUE_TEMPLATE/config.yml +11 -11
  6. package/.github/ISSUE_TEMPLATE/feature_request.yml +26 -79
  7. package/.github/PULL_REQUEST_TEMPLATE.md +7 -0
  8. package/.github/copilot-instructions.md +146 -146
  9. package/.github/workflows/build-image.yml +66 -65
  10. package/.github/workflows/ci-premerge-check.yml +23 -23
  11. package/.github/workflows/e2e.yml +63 -0
  12. package/.github/workflows/lint-and-format.yml +32 -32
  13. package/.prettierignore +64 -64
  14. package/CHANGELOG.md +44 -3
  15. package/CLAUDE_PLUGIN.md +104 -0
  16. package/CODE_OF_CONDUCT.md +128 -0
  17. package/CONTRIBUTING.md +125 -125
  18. package/Dockerfile +30 -27
  19. package/GITHUB_OAUTH_SETUP.md +49 -49
  20. package/GOOGLE_OAUTH_SETUP.md +148 -148
  21. package/LICENSE +201 -201
  22. package/README.md +182 -134
  23. package/assets/Dark.svg +23 -23
  24. package/assets/mcpInstallv2.png +0 -0
  25. package/assets/sampleResponse.png +0 -0
  26. package/auth/index.html +13 -0
  27. package/auth/package.json +28 -0
  28. package/auth/public/favicon.ico +0 -0
  29. package/auth/src/App.tsx +33 -0
  30. package/auth/src/components/ErrorCard.tsx +37 -0
  31. package/auth/src/components/Layout.tsx +13 -0
  32. package/auth/src/index.css +19 -0
  33. package/auth/src/lib/broadcastService.ts +117 -0
  34. package/auth/src/lib/utils.ts +11 -0
  35. package/auth/src/main.tsx +22 -0
  36. package/auth/src/pages/ForgotPasswordPage.tsx +11 -0
  37. package/auth/src/pages/ResetPasswordPage.tsx +11 -0
  38. package/auth/src/pages/SignInPage.tsx +60 -0
  39. package/auth/src/pages/SignUpPage.tsx +60 -0
  40. package/auth/src/pages/VerifyEmailPage.tsx +20 -0
  41. package/auth/src/vite-env.d.ts +10 -0
  42. package/auth/tsconfig.json +32 -0
  43. package/auth/tsconfig.node.json +11 -0
  44. package/auth/vite.config.ts +25 -0
  45. package/backend/package.json +78 -75
  46. package/backend/src/api/{middleware → middlewares}/auth.ts +8 -9
  47. package/backend/src/api/middlewares/rate-limiters.ts +127 -0
  48. package/backend/src/api/routes/{ai.ts → ai/index.routes.ts} +22 -26
  49. package/backend/src/api/routes/auth/index.routes.ts +667 -0
  50. package/backend/src/api/routes/auth/oauth.routes.ts +473 -0
  51. package/backend/src/api/routes/{database.advance.ts → database/advance.routes.ts} +128 -65
  52. package/backend/src/api/routes/database/index.routes.ts +90 -0
  53. package/backend/src/api/routes/{database.records.ts → database/records.routes.ts} +26 -12
  54. package/backend/src/api/routes/{database.tables.ts → database/tables.routes.ts} +6 -23
  55. package/backend/src/api/routes/docs/index.routes.ts +75 -0
  56. package/backend/src/api/routes/email/index.routes.ts +35 -0
  57. package/backend/src/api/routes/functions/index.routes.ts +194 -0
  58. package/backend/src/api/routes/{logs.ts → logs/index.routes.ts} +25 -30
  59. package/backend/src/api/routes/{metadata.ts → metadata/index.routes.ts} +33 -31
  60. package/backend/src/api/routes/realtime/channels.routes.ts +81 -0
  61. package/backend/src/api/routes/realtime/index.routes.ts +12 -0
  62. package/backend/src/api/routes/realtime/messages.routes.ts +48 -0
  63. package/backend/src/api/routes/realtime/permissions.routes.ts +19 -0
  64. package/backend/src/api/routes/{secrets.ts → secrets/index.routes.ts} +27 -22
  65. package/backend/src/api/routes/{storage.ts → storage/index.routes.ts} +48 -61
  66. package/backend/src/api/routes/usage/index.routes.ts +91 -0
  67. package/backend/src/infra/config/app.config.ts +51 -0
  68. package/backend/src/infra/database/database.manager.ts +182 -0
  69. package/backend/{migrations → src/infra/database/migrations}/000_create-base-tables.sql +141 -141
  70. package/backend/{migrations → src/infra/database/migrations}/001_create-helper-functions.sql +40 -40
  71. package/backend/{migrations → src/infra/database/migrations}/002_rename-auth-tables.sql +29 -29
  72. package/backend/{migrations → src/infra/database/migrations}/003_create-users-table.sql +55 -55
  73. package/backend/{migrations → src/infra/database/migrations}/004_add-reload-postgrest-func.sql +23 -23
  74. package/backend/{migrations → src/infra/database/migrations}/005_enable-project-admin-modify-users.sql +29 -29
  75. package/backend/{migrations → src/infra/database/migrations}/006_modify-ai-usage-table.sql +24 -24
  76. package/backend/{migrations → src/infra/database/migrations}/007_drop-metadata-table.sql +1 -1
  77. package/backend/{migrations → src/infra/database/migrations}/008_add-system-tables.sql +76 -76
  78. package/backend/{migrations → src/infra/database/migrations}/009_add-function-secrets.sql +23 -23
  79. package/backend/{migrations → src/infra/database/migrations}/010_modify-ai-config-modalities.sql +93 -93
  80. package/backend/{migrations → src/infra/database/migrations}/011_refactor-secrets-table.sql +15 -15
  81. package/backend/{migrations → src/infra/database/migrations}/012_add-storage-uploaded-by.sql +7 -7
  82. package/backend/src/infra/database/migrations/013_create-auth-schema-functions.sql +44 -0
  83. package/backend/src/infra/database/migrations/014_add-updated-at-trigger-user-table.sql +8 -0
  84. package/backend/src/infra/database/migrations/015_create-auth-config-and-email-otp-tables.sql +60 -0
  85. package/backend/src/infra/database/migrations/016_update-auth-config-and-email-otp.sql +24 -0
  86. package/backend/src/infra/database/migrations/017_create-realtime-schema.sql +233 -0
  87. package/backend/src/infra/realtime/realtime.manager.ts +246 -0
  88. package/backend/src/infra/realtime/webhook-sender.ts +82 -0
  89. package/backend/src/{core/secrets/encryption.ts → infra/security/encryption.manager.ts} +3 -2
  90. package/backend/src/infra/security/token.manager.ts +219 -0
  91. package/backend/src/infra/socket/socket.manager.ts +522 -0
  92. package/backend/src/providers/ai/openrouter.provider.ts +380 -0
  93. package/backend/src/providers/email/base.provider.ts +38 -0
  94. package/backend/src/providers/email/cloud.provider.ts +271 -0
  95. package/backend/src/{core/logs/providers → providers/logs}/base.provider.ts +11 -11
  96. package/backend/src/{core/logs/providers → providers/logs}/cloudwatch.provider.ts +61 -38
  97. package/backend/src/providers/logs/local.provider.ts +185 -0
  98. package/backend/src/providers/oauth/apple.provider.ts +266 -0
  99. package/backend/src/providers/oauth/base.provider.ts +29 -0
  100. package/backend/src/providers/oauth/discord.provider.ts +195 -0
  101. package/backend/src/providers/oauth/facebook.provider.ts +194 -0
  102. package/backend/src/providers/oauth/github.provider.ts +208 -0
  103. package/backend/src/providers/oauth/google.provider.ts +249 -0
  104. package/backend/src/providers/oauth/index.ts +8 -0
  105. package/backend/src/providers/oauth/linkedin.provider.ts +240 -0
  106. package/backend/src/providers/oauth/microsoft.provider.ts +169 -0
  107. package/backend/src/providers/oauth/x.provider.ts +202 -0
  108. package/backend/src/providers/storage/base.provider.ts +29 -0
  109. package/backend/src/providers/storage/local.provider.ts +103 -0
  110. package/backend/src/providers/storage/s3.provider.ts +313 -0
  111. package/backend/src/server.ts +317 -288
  112. package/backend/src/{core/ai/config.ts → services/ai/ai-config.service.ts} +19 -24
  113. package/backend/src/services/ai/ai-model.service.ts +60 -0
  114. package/backend/src/{core/ai/usage.ts → services/ai/ai-usage.service.ts} +28 -35
  115. package/backend/src/{core/ai/chat.ts → services/ai/chat-completion.service.ts} +37 -24
  116. package/backend/src/services/ai/helpers.ts +64 -0
  117. package/backend/src/{core/ai/image.ts → services/ai/image-generation.service.ts} +17 -19
  118. package/backend/src/services/ai/index.ts +13 -0
  119. package/backend/src/services/auth/auth-config.service.ts +250 -0
  120. package/backend/src/services/auth/auth-otp.service.ts +424 -0
  121. package/backend/src/services/auth/auth.service.ts +1150 -0
  122. package/backend/src/services/auth/index.ts +4 -0
  123. package/backend/src/{core/auth/oauth.ts → services/auth/oauth-config.service.ts} +106 -52
  124. package/backend/src/{core/database/advance.ts → services/database/database-advance.service.ts} +97 -131
  125. package/backend/src/services/database/database-table.service.ts +802 -0
  126. package/backend/src/services/database/database.service.ts +127 -0
  127. package/backend/src/services/email/email.service.ts +73 -0
  128. package/backend/src/{core/functions/functions.ts → services/functions/function.service.ts} +95 -88
  129. package/backend/src/{core/logs/audit.ts → services/logs/audit.service.ts} +92 -75
  130. package/backend/src/services/logs/log.service.ts +73 -0
  131. package/backend/src/services/realtime/index.ts +3 -0
  132. package/backend/src/services/realtime/realtime-auth.service.ts +104 -0
  133. package/backend/src/services/realtime/realtime-channel.service.ts +237 -0
  134. package/backend/src/services/realtime/realtime-message.service.ts +260 -0
  135. package/backend/src/{core/secrets/secrets.ts → services/secrets/secret.service.ts} +48 -66
  136. package/backend/src/services/storage/storage.service.ts +617 -0
  137. package/backend/src/services/usage/usage.service.ts +149 -0
  138. package/backend/src/types/auth.ts +77 -2
  139. package/backend/src/types/email.ts +8 -0
  140. package/backend/src/types/error-constants.ts +4 -0
  141. package/backend/src/types/logs.ts +0 -29
  142. package/backend/src/types/realtime.ts +18 -0
  143. package/backend/src/{core/socket/types.ts → types/socket.ts} +11 -36
  144. package/backend/src/utils/cookies.ts +35 -0
  145. package/backend/src/utils/environment.ts +9 -3
  146. package/backend/src/utils/logger.ts +20 -2
  147. package/backend/src/utils/s3-config-loader.ts +64 -0
  148. package/backend/src/utils/seed.ts +301 -205
  149. package/backend/src/utils/sql-parser.ts +91 -1
  150. package/backend/src/utils/utils.ts +114 -0
  151. package/backend/src/utils/validations.ts +40 -4
  152. package/backend/tests/README.md +133 -133
  153. package/backend/tests/cleanup-all-test-data.sh +230 -230
  154. package/backend/tests/cloud/test-s3-multitenant.sh +131 -131
  155. package/backend/tests/local/comprehensive-curl-tests.sh +155 -155
  156. package/backend/tests/local/test-ai-config.sh +129 -0
  157. package/backend/tests/local/test-ai-usage.sh +80 -0
  158. package/backend/tests/local/test-auth-router.sh +143 -143
  159. package/backend/tests/local/test-database-router.sh +222 -222
  160. package/backend/tests/local/test-e2e.sh +240 -240
  161. package/backend/tests/local/test-fk-errors.sh +96 -96
  162. package/backend/tests/local/test-functions.sh +123 -0
  163. package/backend/tests/local/test-id-field.sh +200 -200
  164. package/backend/tests/local/test-logs.sh +132 -0
  165. package/backend/tests/local/test-public-bucket.sh +264 -264
  166. package/backend/tests/local/test-secrets.sh +249 -247
  167. package/backend/tests/local/test-serverless-functions.sh.disabled +325 -325
  168. package/backend/tests/local/test-traditional-rest.sh +208 -208
  169. package/backend/tests/manual/README.md +50 -50
  170. package/backend/tests/manual/create-large-table-simple.sql +10 -10
  171. package/backend/tests/manual/seed-large-table.sql +100 -100
  172. package/backend/tests/manual/setup-large-table-extras.sql +33 -33
  173. package/backend/tests/manual/test-bulk-upsert.sh +409 -409
  174. package/backend/tests/manual/test-database-advance.sh +296 -296
  175. package/backend/tests/manual/test-postgrest-stability.sh +191 -191
  176. package/backend/tests/manual/test-rawsql-export-import.sh +411 -411
  177. package/backend/tests/manual/test-rawsql-modes.sh +244 -0
  178. package/backend/tests/manual/test-universal-storage.sh +263 -263
  179. package/backend/tests/manual/test-users.sql +17 -17
  180. package/backend/tests/run-all-tests.sh +139 -139
  181. package/backend/tests/setup.ts +0 -0
  182. package/backend/tests/test-config.sh +338 -302
  183. package/backend/tests/unit/analyze-query.test.ts +697 -0
  184. package/backend/tests/unit/cloud-token.test.ts +48 -0
  185. package/backend/tests/unit/constant.test.ts +8 -0
  186. package/backend/tests/unit/email.test.ts +372 -0
  187. package/backend/tests/unit/environment.test.ts +59 -0
  188. package/backend/tests/unit/helpers.test.ts +63 -0
  189. package/backend/tests/unit/logger.test.ts +22 -0
  190. package/backend/tests/unit/rate-limit.test.ts +154 -0
  191. package/backend/tests/unit/response.test.ts +58 -0
  192. package/backend/tests/unit/sql-parser.test.ts +74 -0
  193. package/backend/tests/unit/uuid.test.ts +21 -0
  194. package/backend/tests/unit/validations.test.ts +80 -0
  195. package/backend/tsconfig.json +22 -22
  196. package/backend/vitest.config.ts +11 -0
  197. package/claude-plugin/.claude-plugin/plugin.json +24 -0
  198. package/claude-plugin/README.md +133 -0
  199. package/claude-plugin/skills/insforge-schema-patterns/SKILL.md +270 -0
  200. package/docker-compose.prod.yml +204 -144
  201. package/docker-compose.yml +232 -167
  202. package/docker-init/db/db-init.sql +97 -125
  203. package/docker-init/db/jwt.sql +5 -5
  204. package/docker-init/db/postgresql.conf +16 -16
  205. package/docker-init/logs/vector.yml +236 -0
  206. package/docs/README.md +44 -0
  207. package/docs/agent-docs/real-time.md +269 -0
  208. package/docs/changelog.mdx +119 -0
  209. package/docs/core-concepts/ai/architecture.mdx +373 -0
  210. package/docs/core-concepts/ai/sdk.mdx +213 -0
  211. package/docs/core-concepts/authentication/architecture.mdx +278 -0
  212. package/docs/core-concepts/authentication/sdk.mdx +414 -0
  213. package/docs/core-concepts/authentication/ui-components/customization.mdx +529 -0
  214. package/docs/core-concepts/authentication/ui-components/nextjs.mdx +221 -0
  215. package/docs/core-concepts/authentication/ui-components/react-router.mdx +184 -0
  216. package/docs/core-concepts/authentication/ui-components/react.mdx +129 -0
  217. package/docs/core-concepts/database/architecture.mdx +256 -0
  218. package/docs/core-concepts/database/sdk.mdx +382 -0
  219. package/docs/core-concepts/email/architecture.mdx +101 -0
  220. package/docs/core-concepts/email/sdk.mdx +53 -0
  221. package/docs/core-concepts/functions/architecture.mdx +105 -0
  222. package/docs/core-concepts/functions/sdk.mdx +184 -0
  223. package/docs/core-concepts/realtime/architecture.mdx +446 -0
  224. package/docs/core-concepts/realtime/sdk.mdx +409 -0
  225. package/docs/core-concepts/storage/architecture.mdx +243 -0
  226. package/docs/core-concepts/storage/sdk.mdx +253 -0
  227. package/docs/deployment/README.md +94 -0
  228. package/docs/deployment/deploy-to-aws-ec2.md +565 -0
  229. package/docs/deployment/deploy-to-azure-virtual-machines.md +313 -0
  230. package/docs/deployment/deploy-to-google-cloud-compute-engine.md +613 -0
  231. package/docs/deployment/deploy-to-render.md +441 -0
  232. package/docs/deprecated/insforge-auth-api.md +214 -214
  233. package/docs/deprecated/insforge-auth-sdk.md +99 -99
  234. package/docs/deprecated/insforge-db-api.md +358 -358
  235. package/docs/deprecated/insforge-db-sdk.md +139 -139
  236. package/docs/deprecated/insforge-debug-sdk.md +156 -156
  237. package/docs/deprecated/insforge-debug.md +64 -64
  238. package/docs/deprecated/insforge-instructions.md +123 -123
  239. package/docs/deprecated/insforge-project.md +117 -117
  240. package/docs/deprecated/insforge-storage-api.md +278 -278
  241. package/docs/deprecated/insforge-storage-sdk.md +158 -158
  242. package/docs/docs.json +232 -0
  243. package/docs/examples/framework-guides/nextjs.mdx +131 -0
  244. package/docs/examples/framework-guides/nuxt.mdx +165 -0
  245. package/docs/examples/framework-guides/react.mdx +165 -0
  246. package/docs/examples/framework-guides/svelte.mdx +153 -0
  247. package/docs/examples/framework-guides/vue.mdx +159 -0
  248. package/docs/examples/overview.mdx +67 -0
  249. package/docs/favicon.svg +19 -0
  250. package/docs/images/changelog/dec-2025/ai-integration.png +0 -0
  251. package/docs/images/changelog/dec-2025/ai-models.webp +0 -0
  252. package/docs/images/changelog/dec-2025/alipay-payment.webp +0 -0
  253. package/docs/images/changelog/dec-2025/apple-login.jpg +0 -0
  254. package/docs/images/changelog/dec-2025/mcp-installer.png +0 -0
  255. package/docs/images/changelog/dec-2025/realtime-module.jpg +0 -0
  256. package/docs/images/changelog/nov-2025/auth-components.webp +0 -0
  257. package/docs/images/changelog/nov-2025/database-metadata.webp +0 -0
  258. package/docs/images/changelog/nov-2025/quickstart-prompts.webp +0 -0
  259. package/docs/images/changelog/nov-2025/sql-editor.webp +0 -0
  260. package/docs/images/changelog/nov-2025/usage-page.webp +0 -0
  261. package/docs/images/changelog/october-2025/csv-upload.webp +0 -0
  262. package/docs/images/changelog/october-2025/logs-feature.webp +0 -0
  263. package/docs/images/changelog/october-2025/oauth-providers.webp +0 -0
  264. package/docs/images/checks-passed.png +0 -0
  265. package/docs/images/dashboard-connect-expanded.png +0 -0
  266. package/docs/images/dashboard-connect.png +0 -0
  267. package/docs/images/hero-dark.png +0 -0
  268. package/docs/images/hero-light.png +0 -0
  269. package/docs/images/icons/ai.svg +4 -0
  270. package/docs/images/icons/auth.svg +1 -0
  271. package/docs/images/icons/database.svg +1 -0
  272. package/docs/images/icons/function.svg +1 -0
  273. package/docs/images/icons/storage.svg +1 -0
  274. package/docs/images/logos/nextjs.svg +4 -0
  275. package/docs/images/logos/nuxt.svg +4 -0
  276. package/docs/images/logos/react.svg +5 -0
  277. package/docs/images/logos/svelte.svg +4 -0
  278. package/docs/images/logos/vue.svg +5 -0
  279. package/docs/images/mcp-install.png +0 -0
  280. package/docs/images/onboarding-mcp.png +0 -0
  281. package/docs/insforge-instructions-sdk.md +89 -407
  282. package/docs/introduction.mdx +45 -0
  283. package/docs/logo/dark.svg +22 -0
  284. package/docs/logo/light.svg +20 -0
  285. package/docs/partnership.mdx +652 -0
  286. package/docs/quickstart.mdx +83 -0
  287. package/docs/showcase/2048-arena.png +0 -0
  288. package/docs/showcase/framegen-cloud.png +0 -0
  289. package/docs/showcase/line-connect-race.png +0 -0
  290. package/docs/showcase/moment-vibe.png +0 -0
  291. package/docs/showcase/national-flags.png +0 -0
  292. package/docs/showcase/pokemon-vibe.png +0 -0
  293. package/docs/showcase/pure-browse-buy.png +0 -0
  294. package/docs/showcase.mdx +52 -0
  295. package/docs/snippets/sdk-installation.mdx +22 -0
  296. package/docs/snippets/service-icons.mdx +27 -0
  297. package/eslint.config.js +10 -3
  298. package/examples/oauth/frontend-oauth-example.html +250 -250
  299. package/examples/response-examples.md +443 -443
  300. package/frontend/components.json +17 -17
  301. package/frontend/package.json +69 -63
  302. package/frontend/src/App.tsx +13 -82
  303. package/frontend/src/assets/icons/checkbox_checked.svg +6 -6
  304. package/frontend/src/assets/icons/checkbox_undetermined.svg +6 -6
  305. package/frontend/src/assets/icons/checked.svg +3 -3
  306. package/frontend/src/assets/icons/connected.svg +3 -0
  307. package/frontend/src/assets/icons/error.svg +3 -3
  308. package/frontend/src/assets/icons/loader.svg +9 -0
  309. package/frontend/src/assets/icons/pencil.svg +4 -4
  310. package/frontend/src/assets/icons/refresh.svg +4 -4
  311. package/frontend/src/assets/icons/step_active.svg +3 -3
  312. package/frontend/src/assets/icons/step_inactive.svg +11 -11
  313. package/frontend/src/assets/icons/warning.svg +3 -3
  314. package/frontend/src/assets/logos/apple.svg +4 -0
  315. package/frontend/src/assets/logos/claude_code.svg +3 -3
  316. package/frontend/src/assets/logos/cline.svg +6 -6
  317. package/frontend/src/assets/logos/cursor.svg +20 -20
  318. package/frontend/src/assets/logos/discord.svg +8 -8
  319. package/frontend/src/assets/logos/facebook.svg +3 -0
  320. package/frontend/src/assets/logos/gemini.svg +19 -19
  321. package/frontend/src/assets/logos/github.svg +5 -5
  322. package/frontend/src/assets/logos/google.svg +13 -13
  323. package/frontend/src/assets/logos/grok.svg +10 -10
  324. package/frontend/src/assets/logos/insforge_dark.svg +15 -15
  325. package/frontend/src/assets/logos/insforge_light.svg +15 -15
  326. package/frontend/src/assets/logos/instagram.svg +2 -0
  327. package/frontend/src/assets/logos/linkedin.svg +3 -0
  328. package/frontend/src/assets/logos/microsoft.svg +1 -0
  329. package/frontend/src/assets/logos/openai.svg +10 -10
  330. package/frontend/src/assets/logos/roo_code.svg +9 -9
  331. package/frontend/src/assets/logos/spotify.svg +17 -0
  332. package/frontend/src/assets/logos/tiktok.svg +6 -0
  333. package/frontend/src/assets/logos/trae.svg +3 -3
  334. package/frontend/src/assets/logos/windsurf.svg +10 -10
  335. package/frontend/src/assets/logos/x.svg +3 -0
  336. package/frontend/src/components/Checkbox.tsx +27 -29
  337. package/frontend/src/components/CodeBlock.tsx +55 -2
  338. package/frontend/src/components/CodeEditor.tsx +92 -0
  339. package/frontend/src/components/ConfirmDialog.tsx +1 -1
  340. package/frontend/src/components/ConnectCTA.tsx +38 -0
  341. package/frontend/src/components/CopyButton.tsx +52 -15
  342. package/frontend/src/components/ErrorState.tsx +1 -2
  343. package/frontend/src/components/FeatureSidebar.tsx +6 -6
  344. package/frontend/src/components/FeatureSidebarItem.tsx +2 -2
  345. package/frontend/src/components/JsonHighlight.tsx +21 -9
  346. package/frontend/src/components/ProjectInfoModal.tsx +128 -0
  347. package/frontend/src/components/PromptDialog.tsx +1 -4
  348. package/frontend/src/components/SearchInput.tsx +1 -2
  349. package/frontend/src/components/Stepper.tsx +53 -0
  350. package/frontend/src/components/ThemeToggle.tsx +3 -3
  351. package/frontend/src/components/datagrid/DataGrid.tsx +25 -32
  352. package/frontend/src/components/datagrid/cell-editors/DateCellEditor.tsx +1 -2
  353. package/frontend/src/components/datagrid/cell-editors/JsonCellEditor.tsx +2 -4
  354. package/frontend/src/components/datagrid/index.ts +23 -0
  355. package/frontend/src/components/index.ts +23 -30
  356. package/frontend/src/components/layout/AppHeader.tsx +131 -91
  357. package/frontend/src/components/layout/AppSidebar.tsx +80 -170
  358. package/frontend/src/components/layout/Layout.tsx +12 -23
  359. package/frontend/src/components/layout/PrimaryMenu.tsx +187 -0
  360. package/frontend/src/components/layout/SecondaryMenu.tsx +70 -0
  361. package/frontend/src/components/layout/index.ts +5 -0
  362. package/frontend/src/components/radix/Tooltip.tsx +24 -13
  363. package/frontend/src/components/radix/index.ts +22 -0
  364. package/frontend/src/features/ai/components/AIConfigCard.tsx +129 -83
  365. package/frontend/src/features/ai/components/AIEmptyState.tsx +12 -7
  366. package/frontend/src/features/ai/components/ModalityFilterSidebar.tsx +101 -0
  367. package/frontend/src/features/ai/components/ModelSelectionDialog.tsx +135 -0
  368. package/frontend/src/features/ai/components/ModelSelectionGrid.tsx +51 -0
  369. package/frontend/src/features/ai/components/SystemPromptDialog.tsx +118 -0
  370. package/frontend/src/features/ai/components/index.ts +6 -0
  371. package/frontend/src/features/ai/helpers.ts +57 -71
  372. package/frontend/src/features/ai/hooks/useAIConfigs.ts +39 -113
  373. package/frontend/src/features/ai/hooks/useAIUsage.ts +0 -2
  374. package/frontend/src/features/ai/pages/AIPage.tsx +166 -0
  375. package/frontend/src/features/ai/services/ai.service.ts +5 -5
  376. package/frontend/src/features/auth/components/AuthPreview.tsx +96 -0
  377. package/frontend/src/features/auth/components/OAuthConfigDialog.tsx +54 -30
  378. package/frontend/src/features/auth/components/UserFormDialog.tsx +13 -6
  379. package/frontend/src/features/auth/components/UsersDataGrid.tsx +50 -14
  380. package/frontend/src/features/auth/components/index.ts +5 -0
  381. package/frontend/src/features/auth/helpers.tsx +208 -0
  382. package/frontend/src/features/auth/hooks/useAnonToken.ts +30 -0
  383. package/frontend/src/features/auth/hooks/useAuthConfig.ts +48 -0
  384. package/frontend/src/features/auth/hooks/useOAuthConfig.ts +14 -10
  385. package/frontend/src/features/auth/hooks/useUsers.ts +43 -5
  386. package/frontend/src/features/auth/index.ts +3 -2
  387. package/frontend/src/features/auth/pages/AuthMethodsPage.tsx +275 -0
  388. package/frontend/src/features/auth/pages/ConfigurationPage.tsx +395 -0
  389. package/frontend/src/features/auth/pages/UsersPage.tsx +257 -0
  390. package/frontend/src/features/auth/services/anonToken.service.ts +11 -0
  391. package/frontend/src/features/auth/services/config.service.ts +19 -0
  392. package/frontend/src/features/auth/services/{oauth.service.ts → oauth-config.service.ts} +4 -4
  393. package/frontend/src/features/auth/services/{auth.service.ts → user.service.ts} +7 -53
  394. package/frontend/src/features/dashboard/components/ConnectionSuccessBanner.tsx +35 -0
  395. package/frontend/src/features/dashboard/components/PromptCard.tsx +21 -0
  396. package/frontend/src/features/dashboard/components/PromptDialog.tsx +103 -0
  397. package/frontend/src/features/dashboard/components/StatsCard.tsx +50 -0
  398. package/frontend/src/features/dashboard/components/index.ts +4 -0
  399. package/frontend/src/features/dashboard/pages/DashboardPage.tsx +212 -0
  400. package/frontend/src/features/dashboard/prompts/ai-chatbot.ts +13 -0
  401. package/frontend/src/features/dashboard/prompts/crm-system.ts +13 -0
  402. package/frontend/src/features/dashboard/prompts/ecommerce-platform.ts +12 -0
  403. package/frontend/src/features/dashboard/prompts/index.ts +31 -0
  404. package/frontend/src/features/dashboard/prompts/instagram-clone.ts +11 -0
  405. package/frontend/src/features/dashboard/prompts/notion-clone.ts +14 -0
  406. package/frontend/src/features/dashboard/prompts/reddit-clone.ts +12 -0
  407. package/frontend/src/features/database/components/DatabaseDataGrid.tsx +48 -17
  408. package/frontend/src/features/database/components/ForeignKeyCell.tsx +15 -34
  409. package/frontend/src/features/database/components/ForeignKeyPopover.tsx +19 -20
  410. package/frontend/src/features/database/components/LinkRecordModal.tsx +120 -125
  411. package/frontend/src/features/database/components/RecordFormDialog.tsx +22 -33
  412. package/frontend/src/features/database/components/RecordFormField.tsx +45 -47
  413. package/frontend/src/features/database/components/SQLModal.tsx +75 -0
  414. package/frontend/src/features/database/components/TableEmptyState.tsx +6 -5
  415. package/frontend/src/features/database/components/TableForm.tsx +28 -19
  416. package/frontend/src/features/database/components/TableFormColumn.tsx +2 -3
  417. package/frontend/src/features/database/components/TableSidebar.tsx +1 -1
  418. package/frontend/src/features/database/components/TablesEmptyState.tsx +48 -0
  419. package/frontend/src/features/database/components/TemplateCard.tsx +37 -0
  420. package/frontend/src/features/database/components/TemplatePreview.tsx +92 -0
  421. package/frontend/src/features/database/components/index.ts +19 -0
  422. package/frontend/src/features/database/constants.ts +28 -2
  423. package/frontend/src/features/database/contexts/SQLEditorContext.tsx +188 -0
  424. package/frontend/src/features/database/helpers.ts +2 -2
  425. package/frontend/src/features/database/hooks/useCSVImport.ts +29 -0
  426. package/frontend/src/features/database/hooks/useDatabase.ts +66 -0
  427. package/frontend/src/features/database/hooks/useRawSQL.ts +55 -0
  428. package/frontend/src/features/database/hooks/useRecords.ts +139 -0
  429. package/frontend/src/features/database/hooks/useTables.ts +135 -0
  430. package/frontend/src/features/database/index.ts +7 -1
  431. package/frontend/src/features/database/pages/FunctionsPage.tsx +203 -0
  432. package/frontend/src/features/database/pages/IndexesPage.tsx +228 -0
  433. package/frontend/src/features/database/pages/PoliciesPage.tsx +237 -0
  434. package/frontend/src/features/database/pages/SQLEditorPage.tsx +382 -0
  435. package/frontend/src/features/database/{page/DatabasePage.tsx → pages/TablesPage.tsx} +168 -209
  436. package/frontend/src/features/database/pages/TemplatesPage.tsx +39 -0
  437. package/frontend/src/features/database/pages/TriggersPage.tsx +230 -0
  438. package/frontend/src/features/database/services/advance.service.ts +40 -0
  439. package/frontend/src/features/database/services/database.service.ts +33 -194
  440. package/frontend/src/features/database/services/record.service.ts +219 -0
  441. package/frontend/src/features/database/services/table.service.ts +58 -0
  442. package/frontend/src/features/database/templates/ai-chatbot.ts +402 -0
  443. package/frontend/src/features/database/templates/crm-system.ts +528 -0
  444. package/frontend/src/features/database/templates/ecommerce-platform.ts +553 -0
  445. package/frontend/src/features/database/templates/index.ts +34 -0
  446. package/frontend/src/features/database/templates/instagram-clone.ts +222 -0
  447. package/frontend/src/features/database/templates/notion-clone.ts +483 -0
  448. package/frontend/src/features/database/templates/reddit-clone.ts +526 -0
  449. package/frontend/src/features/functions/components/FunctionRow.tsx +2 -1
  450. package/frontend/src/features/functions/components/FunctionsSidebar.tsx +1 -1
  451. package/frontend/src/features/functions/components/SecretRow.tsx +1 -1
  452. package/frontend/src/features/functions/components/index.ts +5 -0
  453. package/frontend/src/features/functions/hooks/useFunctions.ts +4 -4
  454. package/frontend/src/features/{secrets → functions}/hooks/useSecrets.ts +5 -5
  455. package/frontend/src/features/functions/pages/FunctionsPage.tsx +148 -0
  456. package/frontend/src/features/functions/{components/SecretsContent.tsx → pages/SecretsPage.tsx} +19 -21
  457. package/frontend/src/features/functions/services/{functions.service.ts → function.service.ts} +2 -2
  458. package/frontend/src/features/{secrets/services/secrets.service.ts → functions/services/secret.service.ts} +2 -2
  459. package/frontend/src/features/login/hooks/usePartnerOrigin.ts +27 -0
  460. package/frontend/src/features/login/pages/CloudLoginPage.tsx +118 -0
  461. package/frontend/src/features/login/{page → pages}/LoginPage.tsx +16 -23
  462. package/frontend/src/features/login/services/partnership.service.ts +65 -0
  463. package/frontend/src/features/logs/components/LogsDataGrid.tsx +89 -0
  464. package/frontend/src/features/logs/components/SeverityBadge.tsx +18 -0
  465. package/frontend/src/features/logs/components/index.ts +2 -0
  466. package/frontend/src/features/logs/helpers.ts +24 -0
  467. package/frontend/src/features/logs/hooks/useAuditLogs.ts +4 -4
  468. package/frontend/src/features/logs/hooks/useLogSources.ts +137 -0
  469. package/frontend/src/features/logs/hooks/useLogs.ts +163 -0
  470. package/frontend/src/features/logs/hooks/useMcpUsage.ts +128 -0
  471. package/frontend/src/features/logs/index.ts +8 -2
  472. package/frontend/src/features/logs/{page → pages}/AuditsPage.tsx +91 -38
  473. package/frontend/src/features/logs/pages/LogsPage.tsx +152 -0
  474. package/frontend/src/features/logs/pages/MCPLogsPage.tsx +84 -0
  475. package/frontend/src/features/logs/services/audit.service.ts +63 -0
  476. package/frontend/src/features/logs/services/log.service.ts +15 -110
  477. package/frontend/src/features/logs/services/usage.service.ts +31 -0
  478. package/frontend/src/features/onboard/components/McpConnectionStatus.tsx +68 -0
  479. package/frontend/src/features/onboard/components/OnboardingModal.tsx +267 -0
  480. package/frontend/src/features/onboard/components/VideoDemoModal.tsx +38 -0
  481. package/frontend/src/features/onboard/components/index.ts +4 -0
  482. package/frontend/src/features/onboard/components/mcp/CursorDeeplinkGenerator.tsx +2 -2
  483. package/frontend/src/features/onboard/components/mcp/{mcp-helper.tsx → helpers.tsx} +8 -8
  484. package/frontend/src/features/onboard/components/mcp/index.ts +2 -3
  485. package/frontend/src/features/onboard/index.ts +13 -3
  486. package/frontend/src/features/realtime/components/ChannelRow.tsx +83 -0
  487. package/frontend/src/features/realtime/components/EditChannelModal.tsx +246 -0
  488. package/frontend/src/features/realtime/components/MessageRow.tsx +85 -0
  489. package/frontend/src/features/realtime/components/RealtimeEmptyState.tsx +30 -0
  490. package/frontend/src/features/realtime/hooks/useRealtime.ts +218 -0
  491. package/frontend/src/features/realtime/index.ts +11 -0
  492. package/frontend/src/features/realtime/pages/RealtimeChannelsPage.tsx +172 -0
  493. package/frontend/src/features/realtime/pages/RealtimeMessagesPage.tsx +211 -0
  494. package/frontend/src/features/realtime/pages/RealtimePermissionsPage.tsx +191 -0
  495. package/frontend/src/features/realtime/services/realtime.service.ts +107 -0
  496. package/frontend/src/features/storage/components/BucketEmptyState.tsx +9 -6
  497. package/frontend/src/features/storage/components/BucketFormDialog.tsx +25 -41
  498. package/frontend/src/features/storage/components/FilePreviewDialog.tsx +20 -8
  499. package/frontend/src/features/storage/components/StorageDataGrid.tsx +4 -3
  500. package/frontend/src/features/storage/components/StorageManager.tsx +23 -34
  501. package/frontend/src/features/storage/components/index.ts +12 -0
  502. package/frontend/src/features/storage/hooks/useStorage.ts +208 -0
  503. package/frontend/src/features/storage/{page → pages}/StoragePage.tsx +41 -143
  504. package/frontend/src/features/storage/services/storage.service.ts +22 -1
  505. package/frontend/src/features/visualizer/components/AuthNode.tsx +72 -56
  506. package/frontend/src/features/visualizer/components/BucketNode.tsx +4 -4
  507. package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +108 -80
  508. package/frontend/src/features/visualizer/components/TableNode.tsx +34 -41
  509. package/frontend/src/features/visualizer/components/VisualizerSkeleton.tsx +12 -4
  510. package/frontend/src/features/visualizer/pages/VisualizerPage.tsx +97 -0
  511. package/frontend/src/index.css +1 -0
  512. package/frontend/src/lib/analytics/posthog.tsx +27 -0
  513. package/frontend/src/lib/contexts/AuthContext.tsx +38 -31
  514. package/frontend/src/lib/contexts/SocketContext.tsx +123 -80
  515. package/frontend/src/{features/metadata → lib}/hooks/useMetadata.ts +1 -1
  516. package/frontend/src/lib/hooks/useToast.tsx +6 -2
  517. package/frontend/src/lib/routing/AppRoutes.tsx +99 -0
  518. package/frontend/src/lib/routing/RequireAuth.tsx +27 -0
  519. package/frontend/src/lib/utils/cloudMessaging.ts +20 -0
  520. package/frontend/src/lib/utils/menuItems.ts +207 -0
  521. package/frontend/src/lib/utils/{validation-schemas.ts → schemaValidations.ts} +10 -5
  522. package/frontend/src/lib/utils/utils.ts +32 -1
  523. package/frontend/src/vite-env.d.ts +1 -0
  524. package/frontend/tsconfig.json +25 -25
  525. package/frontend/tsconfig.node.json +9 -9
  526. package/frontend/vite.config.ts +5 -3
  527. package/functions/deno.json +24 -24
  528. package/functions/server.ts +315 -290
  529. package/functions/worker-template.js +15 -4
  530. package/i18n/README.ar.md +130 -0
  531. package/i18n/README.de.md +130 -0
  532. package/i18n/README.es.md +154 -0
  533. package/i18n/README.fr.md +134 -0
  534. package/i18n/README.hi.md +129 -0
  535. package/i18n/README.ja.md +174 -0
  536. package/i18n/README.ko.md +137 -0
  537. package/i18n/README.pt-BR.md +131 -0
  538. package/i18n/README.ru.md +129 -0
  539. package/i18n/README.zh-CN.md +133 -0
  540. package/openapi/ai.yaml +715 -688
  541. package/openapi/auth.yaml +1244 -563
  542. package/openapi/email.yaml +158 -0
  543. package/openapi/functions.yaml +475 -475
  544. package/openapi/health.yaml +29 -29
  545. package/openapi/logs.yaml +223 -223
  546. package/openapi/metadata.yaml +177 -177
  547. package/openapi/realtime.yaml +699 -0
  548. package/openapi/records.yaml +381 -381
  549. package/openapi/secrets.yaml +370 -370
  550. package/openapi/storage.yaml +875 -875
  551. package/openapi/tables.yaml +463 -463
  552. package/package.json +97 -88
  553. package/shared-schemas/package.json +31 -31
  554. package/shared-schemas/src/ai-api.schema.ts +34 -58
  555. package/shared-schemas/src/ai.schema.ts +63 -54
  556. package/shared-schemas/src/auth-api.schema.ts +352 -193
  557. package/shared-schemas/src/auth.schema.ts +43 -7
  558. package/shared-schemas/src/cloud-events.schema.ts +57 -0
  559. package/shared-schemas/src/database-api.schema.ts +35 -4
  560. package/shared-schemas/src/database.schema.ts +40 -1
  561. package/shared-schemas/src/docs.schema.ts +26 -0
  562. package/shared-schemas/src/email-api.schema.ts +30 -0
  563. package/shared-schemas/src/index.ts +5 -0
  564. package/shared-schemas/src/logs-api.schema.ts +7 -1
  565. package/shared-schemas/src/logs.schema.ts +26 -0
  566. package/shared-schemas/src/metadata.schema.ts +18 -4
  567. package/shared-schemas/src/realtime-api.schema.ts +111 -0
  568. package/shared-schemas/src/realtime.schema.ts +143 -0
  569. package/shared-schemas/tsconfig.json +21 -21
  570. package/tsconfig.json +7 -7
  571. package/zeabur/README.md +13 -0
  572. package/zeabur/template.yml +1032 -0
  573. package/.github/workflows/deploy-aws.yml +0 -130
  574. package/backend/src/api/routes/agent.ts +0 -29
  575. package/backend/src/api/routes/auth.oauth.ts +0 -482
  576. package/backend/src/api/routes/auth.ts +0 -386
  577. package/backend/src/api/routes/docs.ts +0 -66
  578. package/backend/src/api/routes/functions.ts +0 -183
  579. package/backend/src/api/routes/openapi.ts +0 -82
  580. package/backend/src/api/routes/usage.ts +0 -96
  581. package/backend/src/core/ai/client.ts +0 -242
  582. package/backend/src/core/ai/model.ts +0 -117
  583. package/backend/src/core/auth/auth.ts +0 -780
  584. package/backend/src/core/database/manager.ts +0 -178
  585. package/backend/src/core/database/table.ts +0 -772
  586. package/backend/src/core/documentation/agent.ts +0 -689
  587. package/backend/src/core/documentation/openapi.ts +0 -856
  588. package/backend/src/core/logs/analytics.ts +0 -76
  589. package/backend/src/core/logs/providers/localdb.provider.ts +0 -246
  590. package/backend/src/core/socket/socket.ts +0 -388
  591. package/backend/src/core/storage/storage.ts +0 -923
  592. package/backend/src/utils/cloud-token.ts +0 -39
  593. package/backend/src/utils/helpers.ts +0 -49
  594. package/backend/src/utils/uuid.ts +0 -9
  595. package/backend/tests/manual/test-better-auth.sh +0 -303
  596. package/docker-init/db/logs.sql +0 -9
  597. package/frontend/README.md +0 -112
  598. package/frontend/src/components/datagrid/index.tsx +0 -20
  599. package/frontend/src/components/layout/CloudLayout.tsx +0 -95
  600. package/frontend/src/features/ai/components/AIConfigDialog.tsx +0 -76
  601. package/frontend/src/features/ai/components/AIConfigForm.tsx +0 -222
  602. package/frontend/src/features/ai/components/fields/ModalityField.tsx +0 -87
  603. package/frontend/src/features/ai/components/fields/ModelSelectionField.tsx +0 -134
  604. package/frontend/src/features/ai/components/fields/SystemPromptField.tsx +0 -33
  605. package/frontend/src/features/ai/page/AIPage.tsx +0 -178
  606. package/frontend/src/features/auth/components/AddOAuthDialog.tsx +0 -106
  607. package/frontend/src/features/auth/components/AuthMethodTab.tsx +0 -238
  608. package/frontend/src/features/auth/components/UsersTab.tsx +0 -114
  609. package/frontend/src/features/auth/page/AuthenticationPage.tsx +0 -169
  610. package/frontend/src/features/dashboard/page/DashboardPage.tsx +0 -194
  611. package/frontend/src/features/database/hooks/UseLinkModal.tsx +0 -78
  612. package/frontend/src/features/functions/components/FunctionViewer.tsx +0 -46
  613. package/frontend/src/features/functions/components/FunctionsContent.tsx +0 -88
  614. package/frontend/src/features/functions/page/FunctionsPage.tsx +0 -28
  615. package/frontend/src/features/login/components/AuthErrorBoundary.tsx +0 -87
  616. package/frontend/src/features/login/components/PrivateRoute.tsx +0 -24
  617. package/frontend/src/features/login/page/CloudLoginPage.tsx +0 -93
  618. package/frontend/src/features/logs/components/AnalyticsLogsTable.tsx +0 -313
  619. package/frontend/src/features/logs/components/LogsTable.tsx +0 -199
  620. package/frontend/src/features/logs/page/AnalyticsLogsPage.tsx +0 -530
  621. package/frontend/src/features/metadata/index.ts +0 -0
  622. package/frontend/src/features/metadata/page/MetadataPage.tsx +0 -136
  623. package/frontend/src/features/onboard/components/CompletionCard.tsx +0 -41
  624. package/frontend/src/features/onboard/components/OnboardButton.tsx +0 -84
  625. package/frontend/src/features/onboard/components/StepContent.tsx +0 -91
  626. package/frontend/src/features/onboard/components/TestConnectionStep.tsx +0 -53
  627. package/frontend/src/features/onboard/components/mcp/McpInstallation.tsx +0 -144
  628. package/frontend/src/features/onboard/page/OnBoardPage.tsx +0 -104
  629. package/frontend/src/features/onboard/types.ts +0 -8
  630. package/frontend/src/features/visualizer/page/VisualizerPage.tsx +0 -127
  631. package/frontend/src/lib/contexts/OnboardStepContext.tsx +0 -68
  632. package/frontend/src/lib/hooks/useOnboardingCompletion.ts +0 -29
  633. /package/backend/src/api/{middleware → middlewares}/error.ts +0 -0
  634. /package/backend/src/api/{middleware → middlewares}/upload.ts +0 -0
  635. /package/frontend/src/{features/metadata → lib}/services/metadata.service.ts +0 -0
@@ -0,0 +1,395 @@
1
+ import { useEffect } from 'react';
2
+ import { useForm, Controller } from 'react-hook-form';
3
+ import { zodResolver } from '@hookform/resolvers/zod';
4
+ import {
5
+ Button,
6
+ Input,
7
+ Switch,
8
+ Checkbox,
9
+ Select,
10
+ SelectContent,
11
+ SelectItem,
12
+ SelectTrigger,
13
+ } from '@/components';
14
+ import {
15
+ updateAuthConfigRequestSchema,
16
+ type UpdateAuthConfigRequest,
17
+ } from '@insforge/shared-schemas';
18
+ import { useAuthConfig } from '@/features/auth/hooks/useAuthConfig';
19
+ import { isInsForgeCloudProject } from '@/lib/utils/utils';
20
+
21
+ export default function ConfigurationPage() {
22
+ const { config, isLoading, isUpdating, updateConfig } = useAuthConfig();
23
+
24
+ const form = useForm<UpdateAuthConfigRequest>({
25
+ resolver: zodResolver(updateAuthConfigRequestSchema),
26
+ defaultValues: {
27
+ requireEmailVerification: false,
28
+ passwordMinLength: 6,
29
+ requireNumber: false,
30
+ requireLowercase: false,
31
+ requireUppercase: false,
32
+ requireSpecialChar: false,
33
+ verifyEmailMethod: 'code',
34
+ resetPasswordMethod: 'code',
35
+ signInRedirectTo: null,
36
+ },
37
+ });
38
+
39
+ // Load configuration when config changes
40
+ useEffect(() => {
41
+ if (config) {
42
+ form.reset({
43
+ requireEmailVerification: config.requireEmailVerification,
44
+ passwordMinLength: config.passwordMinLength,
45
+ requireNumber: config.requireNumber,
46
+ requireLowercase: config.requireLowercase,
47
+ requireUppercase: config.requireUppercase,
48
+ requireSpecialChar: config.requireSpecialChar,
49
+ verifyEmailMethod: config.verifyEmailMethod,
50
+ resetPasswordMethod: config.resetPasswordMethod,
51
+ signInRedirectTo: config.signInRedirectTo ?? null,
52
+ });
53
+ }
54
+ }, [config, form]);
55
+
56
+ const handleSubmitData = (data: UpdateAuthConfigRequest) => {
57
+ updateConfig(data);
58
+ };
59
+
60
+ const handleSubmit = () => {
61
+ void form.handleSubmit(handleSubmitData)();
62
+ };
63
+
64
+ const handleReset = () => {
65
+ if (config) {
66
+ form.reset({
67
+ requireEmailVerification: config.requireEmailVerification,
68
+ passwordMinLength: config.passwordMinLength,
69
+ requireNumber: config.requireNumber,
70
+ requireLowercase: config.requireLowercase,
71
+ requireUppercase: config.requireUppercase,
72
+ requireSpecialChar: config.requireSpecialChar,
73
+ verifyEmailMethod: config.verifyEmailMethod,
74
+ resetPasswordMethod: config.resetPasswordMethod,
75
+ signInRedirectTo: config.signInRedirectTo ?? null,
76
+ });
77
+ }
78
+ };
79
+
80
+ if (isLoading) {
81
+ return (
82
+ <div className="h-full bg-slate-50 dark:bg-neutral-800 flex flex-col overflow-hidden">
83
+ <div className="flex-1 flex items-center justify-center">
84
+ <div className="text-center">
85
+ <div className="text-sm text-gray-500 dark:text-zinc-400">Loading configuration...</div>
86
+ </div>
87
+ </div>
88
+ </div>
89
+ );
90
+ }
91
+
92
+ return (
93
+ <div className="h-full bg-slate-50 dark:bg-neutral-800 flex flex-col overflow-hidden">
94
+ <div className="flex-1 flex flex-col overflow-y-auto">
95
+ <div className="p-6 w-full max-w-[1080px] mx-auto">
96
+ <div className="flex flex-col gap-8">
97
+ <div>
98
+ <h2 className="text-2xl font-semibold text-gray-900 dark:text-white">
99
+ Configuration
100
+ </h2>
101
+ </div>
102
+
103
+ <form onSubmit={(e) => e.preventDefault()} className="flex flex-col gap-8">
104
+ {/* Sign In Redirect URL */}
105
+ <div className="space-y-6">
106
+ <div className="bg-white dark:bg-[#333333] rounded-lg p-6 flex items-center gap-10">
107
+ <div className="w-100 flex flex-col gap-1">
108
+ <label className="text-sm font-medium text-gray-900 dark:text-white">
109
+ Redirect URL After Sign In
110
+ </label>
111
+ <span className="text-xs text-zinc-500 dark:text-neutral-400">
112
+ Your app url after successful authentication
113
+ </span>
114
+ </div>
115
+ <div className="w-full max-w-[320px]">
116
+ <Input
117
+ type="url"
118
+ placeholder="https://yourapp.com/dashboard"
119
+ {...form.register('signInRedirectTo')}
120
+ className={`bg-white dark:bg-neutral-900 dark:placeholder:text-neutral-400 dark:border-neutral-700 dark:text-white ${
121
+ form.formState.errors.signInRedirectTo
122
+ ? 'border-red-500 dark:border-red-500'
123
+ : ''
124
+ }`}
125
+ />
126
+ {form.formState.errors.signInRedirectTo && (
127
+ <span className="text-xs text-red-500">
128
+ {form.formState.errors.signInRedirectTo.message ||
129
+ 'Please enter a valid URL'}
130
+ </span>
131
+ )}
132
+ </div>
133
+ </div>
134
+ </div>
135
+
136
+ {isInsForgeCloudProject() && (
137
+ <div className="space-y-6">
138
+ <div>
139
+ <h3 className="text-lg font-medium text-gray-900 dark:text-white mb-3">
140
+ Email Verification
141
+ </h3>
142
+ </div>
143
+
144
+ <div className="bg-white dark:bg-[#333333] rounded-lg p-6 space-y-6">
145
+ {/* Email Verification Toggle */}
146
+ <div className="flex items-center gap-10">
147
+ <div className="w-100 flex flex-col gap-1">
148
+ <span className="text-sm font-medium text-gray-900 dark:text-white">
149
+ Require Email Verification
150
+ </span>
151
+ <span className="text-xs text-zinc-500 dark:text-neutral-400">
152
+ Users must verify their email address before they can sign in
153
+ </span>
154
+ </div>
155
+ <Controller
156
+ name="requireEmailVerification"
157
+ control={form.control}
158
+ render={({ field }) => (
159
+ <div className="w-full max-w-[320px]">
160
+ <Switch
161
+ checked={field.value}
162
+ onCheckedChange={(value) => {
163
+ field.onChange(value);
164
+ }}
165
+ />
166
+ </div>
167
+ )}
168
+ />
169
+ </div>
170
+
171
+ {/* Verify Email Method - Only shown when email verification is enabled */}
172
+ {form.watch('requireEmailVerification') && (
173
+ <div className="flex items-center gap-10">
174
+ <div className="w-100 flex flex-col gap-1">
175
+ <label className="text-sm font-medium text-gray-900 dark:text-white">
176
+ Email Verification Method
177
+ </label>
178
+ <span className="text-xs text-zinc-500 dark:text-neutral-400">
179
+ Choose between 6-digit verification code or verification link
180
+ </span>
181
+ </div>
182
+ <Controller
183
+ name="verifyEmailMethod"
184
+ control={form.control}
185
+ render={({ field }) => (
186
+ <Select
187
+ value={field.value}
188
+ onValueChange={(value) => {
189
+ if (value) {
190
+ field.onChange(value);
191
+ }
192
+ }}
193
+ >
194
+ <SelectTrigger className="w-full max-w-[320px] dark:bg-neutral-700 dark:border-neutral-700">
195
+ <span className="text-black dark:text-white">
196
+ {field.value === 'code' ? 'Code' : 'Link'}
197
+ </span>
198
+ </SelectTrigger>
199
+ <SelectContent>
200
+ <SelectItem value="code">Code</SelectItem>
201
+ <SelectItem value="link">Link</SelectItem>
202
+ </SelectContent>
203
+ </Select>
204
+ )}
205
+ />
206
+ </div>
207
+ )}
208
+ </div>
209
+ </div>
210
+ )}
211
+
212
+ {/* Password Requirements Section */}
213
+ <div className="space-y-6">
214
+ <div>
215
+ <h3 className="text-lg font-medium text-gray-900 dark:text-white mb-3">
216
+ Password Requirements
217
+ </h3>
218
+ </div>
219
+
220
+ <div className="bg-white dark:bg-[#333333] rounded-lg p-6 space-y-6">
221
+ {/* Password Length */}
222
+ <div className="flex items-center gap-10">
223
+ <div className="w-100 flex flex-col gap-1">
224
+ <label className="text-sm font-medium text-gray-900 dark:text-white">
225
+ Minimum Password Length
226
+ </label>
227
+ <span className="text-xs text-zinc-500 dark:text-neutral-400">
228
+ Must be between 4 and 128 characters
229
+ </span>
230
+ </div>
231
+ <div className="w-full max-w-[320px]">
232
+ <Input
233
+ type="number"
234
+ min="4"
235
+ max="128"
236
+ {...form.register('passwordMinLength', { valueAsNumber: true })}
237
+ className={`bg-white dark:bg-neutral-900 dark:placeholder:text-neutral-400 dark:border-neutral-700 dark:text-white ${
238
+ form.formState.errors.passwordMinLength
239
+ ? 'border-red-500 dark:border-red-500'
240
+ : ''
241
+ }`}
242
+ />
243
+ {form.formState.errors.passwordMinLength && (
244
+ <span className="text-xs text-red-500">
245
+ {form.formState.errors.passwordMinLength.message ||
246
+ 'Must be between 4 and 128 characters'}
247
+ </span>
248
+ )}
249
+ </div>
250
+ </div>
251
+
252
+ {/* Password Strength Checkboxes */}
253
+ <div className="flex items-start gap-10">
254
+ <div className="w-100 flex flex-col gap-1 justify-center">
255
+ <label className="text-sm font-medium text-gray-900 dark:text-white">
256
+ Password Strength Requirements
257
+ </label>
258
+ </div>
259
+ <div className="w-full max-w-[320px] flex flex-col gap-3 justify-center">
260
+ <Controller
261
+ name="requireNumber"
262
+ control={form.control}
263
+ render={({ field }) => (
264
+ <label className="flex items-center gap-2 cursor-pointer">
265
+ <Checkbox
266
+ checked={field.value ?? false}
267
+ onChange={(checked) => field.onChange(checked)}
268
+ />
269
+ <span className="text-sm text-gray-700 dark:text-white">
270
+ At least 1 number
271
+ </span>
272
+ </label>
273
+ )}
274
+ />
275
+
276
+ <Controller
277
+ name="requireSpecialChar"
278
+ control={form.control}
279
+ render={({ field }) => (
280
+ <label className="flex items-center gap-2 cursor-pointer">
281
+ <Checkbox
282
+ checked={field.value ?? false}
283
+ onChange={(checked) => field.onChange(checked)}
284
+ />
285
+ <span className="text-sm text-gray-700 dark:text-white">
286
+ At least 1 special character
287
+ </span>
288
+ </label>
289
+ )}
290
+ />
291
+
292
+ <Controller
293
+ name="requireLowercase"
294
+ control={form.control}
295
+ render={({ field }) => (
296
+ <label className="flex items-center gap-2 cursor-pointer">
297
+ <Checkbox
298
+ checked={field.value ?? false}
299
+ onChange={(checked) => field.onChange(checked)}
300
+ />
301
+ <span className="text-sm text-gray-700 dark:text-white">
302
+ At least 1 lowercase character
303
+ </span>
304
+ </label>
305
+ )}
306
+ />
307
+
308
+ <Controller
309
+ name="requireUppercase"
310
+ control={form.control}
311
+ render={({ field }) => (
312
+ <label className="flex items-center gap-2 cursor-pointer">
313
+ <Checkbox
314
+ checked={field.value ?? false}
315
+ onChange={(checked) => field.onChange(checked)}
316
+ />
317
+ <span className="text-sm text-gray-700 dark:text-white">
318
+ At least 1 uppercase character
319
+ </span>
320
+ </label>
321
+ )}
322
+ />
323
+ </div>
324
+ </div>
325
+
326
+ {/* Reset Password Method */}
327
+ {isInsForgeCloudProject() && (
328
+ <div className="flex items-center gap-10">
329
+ <div className="w-100 flex flex-col gap-1">
330
+ <label className="text-sm font-medium text-gray-900 dark:text-white">
331
+ Password Reset Method
332
+ </label>
333
+ <span className="text-xs text-zinc-500 dark:text-neutral-400">
334
+ Choose between 6-digit reset code or reset link
335
+ </span>
336
+ </div>
337
+ <Controller
338
+ name="resetPasswordMethod"
339
+ control={form.control}
340
+ render={({ field }) => (
341
+ <Select
342
+ value={field.value}
343
+ onValueChange={(value) => {
344
+ if (value) {
345
+ field.onChange(value);
346
+ }
347
+ }}
348
+ >
349
+ <SelectTrigger className="w-full max-w-[320px] dark:bg-neutral-700 dark:border-neutral-700">
350
+ <span className="text-black dark:text-white">
351
+ {field.value === 'code' ? 'Code' : 'Link'}
352
+ </span>
353
+ </SelectTrigger>
354
+ <SelectContent>
355
+ <SelectItem value="code">Code</SelectItem>
356
+ <SelectItem value="link">Link</SelectItem>
357
+ </SelectContent>
358
+ </Select>
359
+ )}
360
+ />
361
+ </div>
362
+ )}
363
+ </div>
364
+ </div>
365
+
366
+ {/* Action Buttons - Reserve space even when hidden */}
367
+ <div className="flex justify-end gap-3 min-h-10">
368
+ {form.formState.isDirty && (
369
+ <>
370
+ <Button
371
+ type="button"
372
+ onClick={handleReset}
373
+ disabled={isUpdating}
374
+ className="h-10 px-6 bg-white border border-zinc-200 shadow-[0px_1px_2px_0px_rgba(0,0,0,0.1)] text-zinc-950 hover:bg-zinc-50 dark:bg-neutral-600 dark:border-neutral-600 dark:text-white dark:hover:bg-neutral-700"
375
+ >
376
+ Cancel
377
+ </Button>
378
+ <Button
379
+ type="button"
380
+ onClick={handleSubmit}
381
+ disabled={isUpdating}
382
+ className="h-10 px-6 dark:bg-emerald-300 dark:text-black dark:hover:bg-emerald-400"
383
+ >
384
+ {isUpdating ? 'Saving...' : 'Save Changes'}
385
+ </Button>
386
+ </>
387
+ )}
388
+ </div>
389
+ </form>
390
+ </div>
391
+ </div>
392
+ </div>
393
+ </div>
394
+ );
395
+ }
@@ -0,0 +1,257 @@
1
+ import { useState, useEffect, useMemo } from 'react';
2
+ import { UserPlus } from 'lucide-react';
3
+ import RefreshIcon from '@/assets/icons/refresh.svg?react';
4
+ import {
5
+ Button,
6
+ ConnectCTA,
7
+ SearchInput,
8
+ SelectionClearButton,
9
+ DeleteActionButton,
10
+ Tooltip,
11
+ TooltipContent,
12
+ TooltipProvider,
13
+ TooltipTrigger,
14
+ ConfirmDialog,
15
+ } from '@/components';
16
+ import { UsersDataGrid, UserFormDialog } from '@/features/auth/components';
17
+ import { SortColumn } from 'react-data-grid';
18
+ import { UserSchema } from '@insforge/shared-schemas';
19
+ import { useToast } from '@/lib/hooks/useToast';
20
+ import { useUsers } from '@/features/auth/hooks/useUsers';
21
+
22
+ export default function UsersPage() {
23
+ const [searchQuery, setSearchQuery] = useState('');
24
+ const [addDialogOpen, setAddDialogOpen] = useState(false);
25
+ const [confirmDeleteOpen, setConfirmDeleteOpen] = useState(false);
26
+ const [selectedRows, setSelectedRows] = useState<Set<string>>(new Set());
27
+ const [isRefreshing, setIsRefreshing] = useState(false);
28
+ const [sortColumns, setSortColumns] = useState<SortColumn[]>([]);
29
+
30
+ const { showToast } = useToast();
31
+
32
+ // Default page size of 20 records per page
33
+ const pageSize = 20;
34
+ const {
35
+ users,
36
+ totalUsers,
37
+ isLoading,
38
+ currentPage,
39
+ setCurrentPage,
40
+ totalPages,
41
+ refetch,
42
+ deleteUsers,
43
+ } = useUsers({ searchQuery, pageSize });
44
+
45
+ // Listen for refresh events
46
+ useEffect(() => {
47
+ const handleRefreshEvent = () => {
48
+ // Reset sorting columns
49
+ setSortColumns([]);
50
+ // Reset selected rows
51
+ setSelectedRows(new Set());
52
+ // Refetch data
53
+ void refetch();
54
+ };
55
+ window.addEventListener('refreshUsers', handleRefreshEvent);
56
+ return () => window.removeEventListener('refreshUsers', handleRefreshEvent);
57
+ }, [refetch]);
58
+
59
+ // Clear selection when page changes or search changes
60
+ useEffect(() => {
61
+ setSelectedRows(new Set());
62
+ }, [currentPage, searchQuery]);
63
+
64
+ // Apply sorting to users data
65
+ const sortedUsers = useMemo(() => {
66
+ if (!sortColumns.length) {
67
+ return users;
68
+ }
69
+
70
+ return [...users].sort((a, b) => {
71
+ for (const sort of sortColumns) {
72
+ const { columnKey, direction } = sort;
73
+ let aVal = a[columnKey as keyof UserSchema];
74
+ let bVal = b[columnKey as keyof UserSchema];
75
+
76
+ // Handle null/undefined values
77
+ if ((aVal === null || aVal === undefined) && (bVal === null || bVal === undefined)) {
78
+ continue;
79
+ }
80
+ if (aVal === null || aVal === undefined) {
81
+ return direction === 'ASC' ? -1 : 1;
82
+ }
83
+ if (bVal === null || bVal === undefined) {
84
+ return direction === 'ASC' ? 1 : -1;
85
+ }
86
+
87
+ // Convert to comparable values
88
+ if (typeof aVal === 'string') {
89
+ aVal = aVal.toLowerCase();
90
+ }
91
+ if (typeof bVal === 'string') {
92
+ bVal = bVal.toLowerCase();
93
+ }
94
+
95
+ if (aVal < bVal) {
96
+ return direction === 'ASC' ? -1 : 1;
97
+ }
98
+ if (aVal > bVal) {
99
+ return direction === 'ASC' ? 1 : -1;
100
+ }
101
+ }
102
+ return 0;
103
+ });
104
+ }, [users, sortColumns]);
105
+
106
+ const handleBulkDelete = async () => {
107
+ if (selectedRows.size === 0) {
108
+ return;
109
+ }
110
+
111
+ try {
112
+ const userIds = Array.from(selectedRows);
113
+ await deleteUsers(userIds);
114
+ void refetch();
115
+ setSelectedRows(new Set());
116
+ showToast(
117
+ `${userIds.length} user${userIds.length > 1 ? 's' : ''} deleted successfully`,
118
+ 'success'
119
+ );
120
+ } catch (error) {
121
+ showToast(error instanceof Error ? error.message : 'Failed to delete users', 'error');
122
+ }
123
+ };
124
+
125
+ const handleRefresh = async () => {
126
+ setIsRefreshing(true);
127
+ try {
128
+ setSelectedRows(new Set());
129
+ setSearchQuery('');
130
+ await refetch();
131
+ } finally {
132
+ setIsRefreshing(false);
133
+ }
134
+ };
135
+
136
+ const emptyState = (
137
+ <div className="text-sm text-black dark:text-white">
138
+ {searchQuery ? 'No users match your search criteria' : 'No users found'}. <ConnectCTA />
139
+ </div>
140
+ );
141
+
142
+ return (
143
+ <div className="h-full bg-slate-50 dark:bg-neutral-800 flex flex-col overflow-hidden">
144
+ <div className="flex-1 flex flex-col overflow-y-auto">
145
+ {/* Page Header with Title and Actions */}
146
+ <div className="pl-4 pr-1.5 py-1.5 h-12 dark:bg-neutral-800">
147
+ <div className="flex items-center justify-between">
148
+ <div className="flex items-center gap-3">
149
+ <h1 className="text-base font-bold text-black dark:text-white">Users</h1>
150
+
151
+ {/* Separator */}
152
+ <div className="h-6 w-px bg-gray-200 dark:bg-neutral-700" />
153
+
154
+ {/* Refresh button */}
155
+ <TooltipProvider>
156
+ <Tooltip>
157
+ <TooltipTrigger asChild>
158
+ <Button
159
+ variant="ghost"
160
+ size="icon"
161
+ className="p-1 h-9 w-9"
162
+ onClick={() => void handleRefresh()}
163
+ disabled={isRefreshing}
164
+ >
165
+ <RefreshIcon className="h-5 w-5 text-zinc-400 dark:text-neutral-400" />
166
+ </Button>
167
+ </TooltipTrigger>
168
+ <TooltipContent side="bottom" align="center">
169
+ <p>{isRefreshing ? 'Refreshing...' : 'Refresh'}</p>
170
+ </TooltipContent>
171
+ </Tooltip>
172
+ </TooltipProvider>
173
+ </div>
174
+ </div>
175
+ </div>
176
+
177
+ {/* Search Bar and Actions */}
178
+ <div className="pt-2 pb-4 px-3 dark:bg-neutral-800">
179
+ <div className="flex items-center justify-between">
180
+ {selectedRows.size > 0 ? (
181
+ <div className="flex items-center gap-3">
182
+ <SelectionClearButton
183
+ selectedCount={selectedRows.size}
184
+ itemType="user"
185
+ onClear={() => setSelectedRows(new Set())}
186
+ />
187
+ <DeleteActionButton
188
+ selectedCount={selectedRows.size}
189
+ itemType="user"
190
+ onDelete={() => setConfirmDeleteOpen(true)}
191
+ />
192
+ </div>
193
+ ) : (
194
+ <SearchInput
195
+ value={searchQuery}
196
+ onChange={setSearchQuery}
197
+ placeholder="Search user"
198
+ className="flex-1 max-w-80 dark:bg-neutral-800 dark:text-white dark:border-neutral-700"
199
+ debounceTime={300}
200
+ />
201
+ )}
202
+ <div className="flex items-center gap-2 ml-4">
203
+ {selectedRows.size === 0 && (
204
+ <Button
205
+ className="h-10 px-4 font-medium dark:bg-emerald-300 dark:text-black"
206
+ onClick={() => setAddDialogOpen(true)}
207
+ >
208
+ <UserPlus className="h-4 w-4 mr-2" />
209
+ Add User
210
+ </Button>
211
+ )}
212
+ </div>
213
+ </div>
214
+ </div>
215
+
216
+ {/* Main Content */}
217
+ <div className="relative flex-1 flex flex-col overflow-hidden">
218
+ <div className="flex-1 flex flex-col overflow-hidden">
219
+ <UsersDataGrid
220
+ data={sortedUsers}
221
+ loading={isLoading}
222
+ isRefreshing={isRefreshing}
223
+ selectedRows={selectedRows}
224
+ onSelectedRowsChange={setSelectedRows}
225
+ sortColumns={sortColumns}
226
+ onSortColumnsChange={setSortColumns}
227
+ currentPage={currentPage}
228
+ totalPages={totalPages}
229
+ pageSize={pageSize}
230
+ totalRecords={totalUsers}
231
+ onPageChange={setCurrentPage}
232
+ emptyState={emptyState}
233
+ />
234
+ </div>
235
+ </div>
236
+ </div>
237
+
238
+ <UserFormDialog open={addDialogOpen} onOpenChange={setAddDialogOpen} />
239
+
240
+ <ConfirmDialog
241
+ open={confirmDeleteOpen}
242
+ onOpenChange={setConfirmDeleteOpen}
243
+ title={`Delete ${selectedRows.size} ${selectedRows.size === 1 ? 'User' : 'Users'}`}
244
+ description={
245
+ <span>
246
+ Are you sure to <strong>permanently delete {selectedRows.size}</strong>{' '}
247
+ {selectedRows.size === 1 ? 'user' : 'users'}? This action cannot be undone.
248
+ </span>
249
+ }
250
+ confirmText="Delete"
251
+ cancelText="Cancel"
252
+ destructive
253
+ onConfirm={handleBulkDelete}
254
+ />
255
+ </div>
256
+ );
257
+ }
@@ -0,0 +1,11 @@
1
+ import { apiClient } from '@/lib/api/client';
2
+
3
+ export class AnonTokenService {
4
+ async generateAnonToken(): Promise<{ accessToken: string; message: string }> {
5
+ return apiClient.request('/auth/tokens/anon', {
6
+ method: 'POST',
7
+ });
8
+ }
9
+ }
10
+
11
+ export const anonTokenService = new AnonTokenService();
@@ -0,0 +1,19 @@
1
+ import { apiClient } from '@/lib/api/client';
2
+ import { AuthConfigSchema, UpdateAuthConfigRequest } from '@insforge/shared-schemas';
3
+
4
+ export class AuthConfigService {
5
+ // Get authentication configuration (admin only)
6
+ async getConfig(): Promise<AuthConfigSchema> {
7
+ return apiClient.request('/auth/config');
8
+ }
9
+
10
+ // Update authentication configuration
11
+ async updateConfig(config: UpdateAuthConfigRequest): Promise<AuthConfigSchema> {
12
+ return apiClient.request('/auth/config', {
13
+ method: 'PUT',
14
+ body: JSON.stringify(config),
15
+ });
16
+ }
17
+ }
18
+
19
+ export const authConfigService = new AuthConfigService();