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
@@ -1,7 +1,7 @@
1
1
  import React, { createContext, useContext, useState, useEffect, useCallback } from 'react';
2
2
  import { useQueryClient } from '@tanstack/react-query';
3
- import { authService } from '@/features/auth/services/auth.service';
4
3
  import { apiClient } from '@/lib/api/client';
4
+ import { userService } from '@/features/auth/services/user.service';
5
5
 
6
6
  export interface User {
7
7
  id: string;
@@ -60,7 +60,7 @@ export const AuthProvider: React.FC<AuthProviderProps> = ({ children }) => {
60
60
  try {
61
61
  setIsLoading(true);
62
62
  setError(null);
63
- const currentUser = await authService.getCurrentUser();
63
+ const currentUser = await userService.getCurrentUser();
64
64
  setUser(currentUser);
65
65
  setIsAuthenticated(true);
66
66
  return currentUser;
@@ -77,54 +77,64 @@ export const AuthProvider: React.FC<AuthProviderProps> = ({ children }) => {
77
77
  }
78
78
  }, []);
79
79
 
80
+ const invalidateAuthQueries = useCallback(async () => {
81
+ await Promise.all([
82
+ queryClient.invalidateQueries({ queryKey: ['apiKey'] }),
83
+ queryClient.invalidateQueries({ queryKey: ['metadata'] }),
84
+ queryClient.invalidateQueries({ queryKey: ['users'] }),
85
+ queryClient.invalidateQueries({ queryKey: ['tables'] }),
86
+ queryClient.invalidateQueries({ queryKey: ['mcp-usage'] }),
87
+ ]);
88
+ }, [queryClient]);
89
+
80
90
  const loginWithPassword = useCallback(
81
91
  async (email: string, password: string): Promise<boolean> => {
82
92
  try {
83
93
  setError(null);
84
- await authService.loginWithPassword(email, password);
85
- const currentUser = await checkAuthStatus();
86
- if (currentUser) {
87
- // Invalidate queries that depend on authentication
88
- void queryClient.invalidateQueries({ queryKey: ['apiKey'] });
89
- void queryClient.invalidateQueries({ queryKey: ['metadata'] });
90
- void queryClient.invalidateQueries({ queryKey: ['users'] });
91
- void queryClient.invalidateQueries({ queryKey: ['tables'] });
92
- return true;
93
- }
94
- return false;
94
+ const data = await apiClient.request('/auth/admin/sessions', {
95
+ method: 'POST',
96
+ body: JSON.stringify({ email, password }),
97
+ });
98
+
99
+ apiClient.setToken(data.accessToken);
100
+ setUser(data.user);
101
+ setIsAuthenticated(true);
102
+
103
+ await invalidateAuthQueries();
104
+ return true;
95
105
  } catch (err) {
96
106
  setError(err instanceof Error ? err : new Error('Login failed'));
97
107
  return false;
98
108
  }
99
109
  },
100
- [checkAuthStatus, queryClient]
110
+ [invalidateAuthQueries]
101
111
  );
102
112
 
103
113
  const loginWithAuthorizationCode = useCallback(
104
- async (token: string): Promise<boolean> => {
114
+ async (code: string): Promise<boolean> => {
105
115
  try {
106
116
  setError(null);
107
- await authService.loginWithAuthorizationCode(token);
108
- const currentUser = await checkAuthStatus();
109
- if (currentUser) {
110
- // Invalidate queries that depend on authentication
111
- void queryClient.invalidateQueries({ queryKey: ['apiKey'] });
112
- void queryClient.invalidateQueries({ queryKey: ['metadata'] });
113
- void queryClient.invalidateQueries({ queryKey: ['users'] });
114
- void queryClient.invalidateQueries({ queryKey: ['tables'] });
115
- return true;
116
- }
117
- return false;
117
+ const data = await apiClient.request('/auth/admin/sessions/exchange', {
118
+ method: 'POST',
119
+ body: JSON.stringify({ code }),
120
+ });
121
+
122
+ apiClient.setToken(data.accessToken);
123
+ setUser(data.user);
124
+ setIsAuthenticated(true);
125
+
126
+ await invalidateAuthQueries();
127
+ return true;
118
128
  } catch (err) {
119
129
  setError(err instanceof Error ? err : new Error('Authorization code exchange failed'));
120
130
  return false;
121
131
  }
122
132
  },
123
- [checkAuthStatus, queryClient]
133
+ [invalidateAuthQueries]
124
134
  );
125
135
 
126
136
  const logout = useCallback(() => {
127
- void authService.logout();
137
+ apiClient.clearToken();
128
138
  setUser(null);
129
139
  setIsAuthenticated(false);
130
140
  setError(null);
@@ -139,9 +149,6 @@ export const AuthProvider: React.FC<AuthProviderProps> = ({ children }) => {
139
149
  void checkAuthStatus();
140
150
  }, [checkAuthStatus]);
141
151
 
142
- // Removed periodic auth refresh - it was causing unnecessary unmounts
143
- // Auth status is checked naturally when API calls are made
144
-
145
152
  const value: AuthContextType = {
146
153
  user,
147
154
  isAuthenticated,
@@ -2,6 +2,7 @@ import {
2
2
  createContext,
3
3
  useContext,
4
4
  useEffect,
5
+ useEffectEvent,
5
6
  useRef,
6
7
  useState,
7
8
  useCallback,
@@ -9,8 +10,12 @@ import {
9
10
  useMemo,
10
11
  } from 'react';
11
12
  import { io, Socket } from 'socket.io-client';
13
+ import { useQueryClient } from '@tanstack/react-query';
12
14
  import { apiClient } from '@/lib/api/client';
13
15
  import { useAuth } from '@/lib/contexts/AuthContext';
16
+ import { postMessageToParent } from '@/lib/utils/cloudMessaging';
17
+ import type { SocketMessage } from '@insforge/shared-schemas';
18
+ import { useMcpUsage } from '@/features/logs/hooks/useMcpUsage';
14
19
 
15
20
  // ============================================================================
16
21
  // Types & Enums
@@ -25,47 +30,21 @@ export enum ServerEvents {
25
30
  MCP_CONNECTED = 'mcp:connected',
26
31
  }
27
32
 
28
- /**
29
- * Client-to-server event types
30
- */
31
- export enum ClientEvents {
32
- SUBSCRIBE = 'subscribe',
33
- UNSUBSCRIBE = 'unsubscribe',
34
- }
35
-
36
- /**
37
- * Base message structure for all socket communications
38
- */
39
- export interface SocketMessage<T = unknown> {
40
- type: string;
41
- payload?: T;
42
- timestamp: number;
43
- id?: string;
44
- }
45
-
46
33
  // ============================================================================
47
34
  // Payload Types
48
35
  // ============================================================================
49
36
 
50
- export interface NotificationPayload {
51
- level: 'info' | 'warning' | 'error' | 'success';
52
- title: string;
53
- message: string;
54
- }
55
-
56
37
  export enum DataUpdateResourceType {
57
- METADATA = 'metadata',
58
- DATABASE_SCHEMA = 'database_schema',
59
- TABLE_SCHEMA = 'table_schema',
60
- STORAGE_SCHEMA = 'storage_schema',
61
- BUCKET_SCHEMA = 'bucket_schema',
62
- OAUTH_SCHEMA = 'oauth_schmea',
38
+ DATABASE = 'database',
39
+ USERS = 'users',
40
+ BUCKETS = 'buckets',
41
+ FUNCTIONS = 'functions',
42
+ REALTIME = 'realtime',
63
43
  }
64
44
 
65
- export interface DataUpdatePayload {
66
- resource: DataUpdateResourceType;
67
- action: 'created' | 'updated' | 'deleted';
68
- data: unknown;
45
+ export interface DatabaseResourceUpdate {
46
+ type: 'tables' | 'table' | 'records' | 'index' | 'trigger' | 'policy' | 'function' | 'extension';
47
+ name?: string;
69
48
  }
70
49
 
71
50
  // ============================================================================
@@ -81,9 +60,6 @@ interface SocketState {
81
60
  interface SocketActions {
82
61
  connect: (token: string | null) => void;
83
62
  disconnect: () => void;
84
- subscribe: (channel: string, filters?: Record<string, unknown>) => void;
85
- unsubscribe: (channel: string) => void;
86
- emit: (event: ClientEvents, data?: unknown) => void;
87
63
  }
88
64
 
89
65
  interface SocketContextValue extends SocketState, SocketActions {
@@ -106,6 +82,9 @@ interface SocketProviderProps {
106
82
  export function SocketProvider({ children }: SocketProviderProps) {
107
83
  // Get authentication state
108
84
  const { isAuthenticated } = useAuth();
85
+ const queryClient = useQueryClient();
86
+ const { recordsCount: mcpUsageCount } = useMcpUsage();
87
+
109
88
  // State
110
89
  const [state, setState] = useState<SocketState>({
111
90
  isConnected: false,
@@ -115,7 +94,6 @@ export function SocketProvider({ children }: SocketProviderProps) {
115
94
 
116
95
  // Refs
117
96
  const socketRef = useRef<Socket | null>(null);
118
- const subscriptionsRef = useRef<Set<string>>(new Set());
119
97
 
120
98
  /**
121
99
  * Update state helper
@@ -168,11 +146,6 @@ export function SocketProvider({ children }: SocketProviderProps) {
168
146
  isConnected: true,
169
147
  connectionError: null,
170
148
  });
171
-
172
- // Re-subscribe to channels after reconnection
173
- subscriptionsRef.current.forEach((channel) => {
174
- socket.emit(ClientEvents.SUBSCRIBE, { channel });
175
- });
176
149
  });
177
150
 
178
151
  return socket;
@@ -220,41 +193,8 @@ export function SocketProvider({ children }: SocketProviderProps) {
220
193
  connectionError: null,
221
194
  socketId: null,
222
195
  });
223
-
224
- subscriptionsRef.current.clear();
225
196
  }, [updateState]);
226
197
 
227
- /**
228
- * Subscribe to a channel
229
- */
230
- const subscribe = useCallback((channel: string, filters?: Record<string, unknown>) => {
231
- if (!socketRef.current?.connected) {
232
- return;
233
- }
234
-
235
- socketRef.current.emit(ClientEvents.SUBSCRIBE, { channel, filters });
236
- subscriptionsRef.current.add(channel);
237
- }, []);
238
-
239
- /**
240
- * Unsubscribe from a channel
241
- */
242
- const unsubscribe = useCallback((channel: string) => {
243
- if (!socketRef.current?.connected) {
244
- return;
245
- }
246
-
247
- socketRef.current.emit(ClientEvents.UNSUBSCRIBE, { channel });
248
- subscriptionsRef.current.delete(channel);
249
- }, []);
250
-
251
- /**
252
- * Emit event to server
253
- */
254
- const emit = useCallback((event: ClientEvents, data?: unknown) => {
255
- socketRef.current?.emit(event, data);
256
- }, []);
257
-
258
198
  // Monitor authentication state and token changes
259
199
  useEffect(() => {
260
200
  const token = apiClient.getToken();
@@ -275,6 +215,112 @@ export function SocketProvider({ children }: SocketProviderProps) {
275
215
  };
276
216
  }, [disconnect]);
277
217
 
218
+ // Send onboarding success only on first MCP connection
219
+ const onMcpConnectedSuccess = useEffectEvent(() => {
220
+ if (mcpUsageCount === 0) {
221
+ postMessageToParent({ type: 'ONBOARDING_SUCCESS' });
222
+ }
223
+ });
224
+
225
+ // Register business event handlers when socket is connected
226
+ useEffect(() => {
227
+ const socket = socketRef.current;
228
+ if (!socket || !state.isConnected) {
229
+ return;
230
+ }
231
+
232
+ // Handle DATA_UPDATE events - invalidate relevant queries
233
+ const handleDataUpdate = (message: SocketMessage) => {
234
+ const resource = message.resource as DataUpdateResourceType;
235
+
236
+ switch (resource) {
237
+ case DataUpdateResourceType.DATABASE: {
238
+ const { changes } = (message.data ?? {}) as { changes?: DatabaseResourceUpdate[] };
239
+
240
+ if (!changes || changes.length === 0) {
241
+ break;
242
+ }
243
+
244
+ // Invalidate specific queries based on resource types changed
245
+ for (const change of changes) {
246
+ switch (change.type) {
247
+ case 'tables':
248
+ // CREATE TABLE / DROP TABLE - affects table list
249
+ void queryClient.invalidateQueries({ queryKey: ['tables'] });
250
+ void queryClient.invalidateQueries({ queryKey: ['metadata', 'full'] });
251
+ break;
252
+ case 'table':
253
+ // ALTER TABLE / RENAME - affects specific table and list
254
+ void queryClient.invalidateQueries({ queryKey: ['tables'] });
255
+ if (change.name) {
256
+ void queryClient.invalidateQueries({ queryKey: ['table', change.name] });
257
+ }
258
+ break;
259
+ case 'records':
260
+ // INSERT / UPDATE / DELETE - affects records for specific table
261
+ if (change.name) {
262
+ void queryClient.invalidateQueries({ queryKey: ['records', change.name] });
263
+ }
264
+ break;
265
+ case 'index':
266
+ void queryClient.invalidateQueries({ queryKey: ['database', 'indexes'] });
267
+ break;
268
+ case 'trigger':
269
+ void queryClient.invalidateQueries({ queryKey: ['database', 'triggers'] });
270
+ break;
271
+ case 'policy':
272
+ void queryClient.invalidateQueries({ queryKey: ['database', 'policies'] });
273
+ break;
274
+ case 'function':
275
+ void queryClient.invalidateQueries({ queryKey: ['database', 'functions'] });
276
+ break;
277
+ case 'extension':
278
+ // Extensions are not supported yet
279
+ break;
280
+ }
281
+ }
282
+ break;
283
+ }
284
+ case DataUpdateResourceType.BUCKETS:
285
+ void queryClient.invalidateQueries({ queryKey: ['storage', 'buckets'] });
286
+ void queryClient.invalidateQueries({ queryKey: ['metadata', 'full'] });
287
+ break;
288
+ case DataUpdateResourceType.USERS:
289
+ void queryClient.invalidateQueries({ queryKey: ['users'] });
290
+ break;
291
+ case DataUpdateResourceType.FUNCTIONS:
292
+ void queryClient.invalidateQueries({ queryKey: ['functions'] });
293
+ break;
294
+ case DataUpdateResourceType.REALTIME:
295
+ void queryClient.invalidateQueries({ queryKey: ['realtime'] });
296
+ break;
297
+ }
298
+ };
299
+
300
+ // Handle MCP_CONNECTED events
301
+ const handleMcpConnected = (message: SocketMessage) => {
302
+ void queryClient.invalidateQueries({ queryKey: ['mcp-usage'] });
303
+
304
+ // Notify parent window (for cloud onboarding)
305
+ postMessageToParent({
306
+ type: 'MCP_CONNECTION_STATUS',
307
+ connected: true,
308
+ tool_name: message.tool_name as string,
309
+ timestamp: message.created_at as string,
310
+ });
311
+
312
+ onMcpConnectedSuccess();
313
+ };
314
+
315
+ socket.on(ServerEvents.DATA_UPDATE, handleDataUpdate);
316
+ socket.on(ServerEvents.MCP_CONNECTED, handleMcpConnected);
317
+
318
+ return () => {
319
+ socket.off(ServerEvents.DATA_UPDATE, handleDataUpdate);
320
+ socket.off(ServerEvents.MCP_CONNECTED, handleMcpConnected);
321
+ };
322
+ }, [state.isConnected, queryClient]);
323
+
278
324
  // Context value
279
325
  const contextValue = useMemo<SocketContextValue>(
280
326
  () => ({
@@ -284,11 +330,8 @@ export function SocketProvider({ children }: SocketProviderProps) {
284
330
  // Actions
285
331
  connect,
286
332
  disconnect,
287
- subscribe,
288
- unsubscribe,
289
- emit,
290
333
  }),
291
- [state, connect, disconnect, subscribe, unsubscribe, emit]
334
+ [state, connect, disconnect]
292
335
  );
293
336
 
294
337
  return <SocketContext.Provider value={contextValue}>{children}</SocketContext.Provider>;
@@ -22,7 +22,7 @@ export function useMetadata(options?: UseMetadataOptions) {
22
22
  return {
23
23
  metadata,
24
24
  auth: metadata?.auth,
25
- tables: Object.keys(metadata?.database.tables ?? {}),
25
+ tables: metadata?.database.tables?.filter((table) => table.tableName !== 'users') ?? [],
26
26
  storage: metadata?.storage,
27
27
  version: metadata?.version || 'Unknown',
28
28
  isLoading,
@@ -1,6 +1,6 @@
1
1
  import React, { createContext, useContext, useState, useCallback } from 'react';
2
2
  import { useTimeout } from './useTimeout';
3
- import { generateUUID } from '@/lib/utils/utils';
3
+ import { cn, generateUUID } from '@/lib/utils/utils';
4
4
 
5
5
  interface Toast {
6
6
  id: string;
@@ -191,7 +191,11 @@ export function ToastProvider({ children }: { children: React.ReactNode }) {
191
191
  <ToastContext.Provider value={{ showToast, updateToast, removeToast }}>
192
192
  {children}
193
193
  {/* Regular toasts - top center */}
194
- <div className="fixed top-7.5 dark:top-20 left-1/2 transform -translate-x-1/2 z-[9999] flex flex-col gap-3 w-full max-w-[480px]">
194
+ <div
195
+ className={cn(
196
+ 'fixed top-2 left-1/2 transform -translate-x-1/2 z-[9999] flex flex-col gap-3 w-full max-w-[480px]'
197
+ )}
198
+ >
195
199
  {toasts
196
200
  .filter((t) => t.type !== 'upload')
197
201
  .map((toast) => (
@@ -0,0 +1,99 @@
1
+ import { Routes, Route, Navigate } from 'react-router-dom';
2
+ import { RequireAuth } from '@/lib/routing/RequireAuth';
3
+ import Layout from '@/components/layout/Layout';
4
+ import LoginPage from '@/features/login/pages/LoginPage';
5
+ import CloudLoginPage from '@/features/login/pages/CloudLoginPage';
6
+ import DashboardPage from '@/features/dashboard/pages/DashboardPage';
7
+ import TablesPage from '@/features/database/pages/TablesPage';
8
+ import UsersPage from '@/features/auth/pages/UsersPage';
9
+ import AuthMethodsPage from '@/features/auth/pages/AuthMethodsPage';
10
+ import ConfigurationPage from '@/features/auth/pages/ConfigurationPage';
11
+ import LogsPage from '@/features/logs/pages/LogsPage';
12
+ import MCPLogsPage from '@/features/logs/pages/MCPLogsPage';
13
+ import StoragePage from '@/features/storage/pages/StoragePage';
14
+ import VisualizerPage from '@/features/visualizer/pages/VisualizerPage';
15
+ import FunctionsPage from '@/features/functions/pages/FunctionsPage';
16
+ import SecretsPage from '@/features/functions/pages/SecretsPage';
17
+ import AIPage from '@/features/ai/pages/AIPage';
18
+ import RealtimeChannelsPage from '@/features/realtime/pages/RealtimeChannelsPage';
19
+ import RealtimeMessagesPage from '@/features/realtime/pages/RealtimeMessagesPage';
20
+ import RealtimePermissionsPage from '@/features/realtime/pages/RealtimePermissionsPage';
21
+ import SQLEditorPage from '@/features/database/pages/SQLEditorPage';
22
+ import IndexesPage from '@/features/database/pages/IndexesPage';
23
+ import DatabaseFunctionsPage from '@/features/database/pages/FunctionsPage';
24
+ import TriggersPage from '@/features/database/pages/TriggersPage';
25
+ import PoliciesPage from '@/features/database/pages/PoliciesPage';
26
+ import TemplatesPage from '@/features/database/pages/TemplatesPage';
27
+ import AuditsPage from '@/features/logs/pages/AuditsPage';
28
+
29
+ export function AppRoutes() {
30
+ return (
31
+ <Routes>
32
+ <Route path="/dashboard/login" element={<LoginPage />} />
33
+ <Route path="/cloud/login" element={<CloudLoginPage />} />
34
+ <Route
35
+ path="/*"
36
+ element={
37
+ <RequireAuth>
38
+ <Layout>
39
+ <Routes>
40
+ <Route path="/" element={<Navigate to="/dashboard" replace />} />
41
+ <Route path="/dashboard" element={<DashboardPage />} />
42
+ <Route path="/dashboard/users" element={<UsersPage />} />
43
+ <Route path="/dashboard/tables" element={<TablesPage />} />
44
+ <Route
45
+ path="/dashboard/authentication"
46
+ element={<Navigate to="/dashboard/authentication/auth-methods" replace />}
47
+ />
48
+ <Route path="/dashboard/authentication/users" element={<UsersPage />} />
49
+ <Route
50
+ path="/dashboard/authentication/auth-methods"
51
+ element={<AuthMethodsPage />}
52
+ />
53
+ <Route path="/dashboard/authentication/config" element={<ConfigurationPage />} />
54
+ <Route
55
+ path="/dashboard/database"
56
+ element={<Navigate to="/dashboard/database/indexes" replace />}
57
+ />
58
+ <Route path="/dashboard/database/tables" element={<TablesPage />} />
59
+ <Route path="/dashboard/database/indexes" element={<IndexesPage />} />
60
+ <Route path="/dashboard/database/functions" element={<DatabaseFunctionsPage />} />
61
+ <Route path="/dashboard/database/triggers" element={<TriggersPage />} />
62
+ <Route path="/dashboard/database/policies" element={<PoliciesPage />} />
63
+ <Route path="/dashboard/database/sql-editor" element={<SQLEditorPage />} />
64
+ <Route path="/dashboard/database/templates" element={<TemplatesPage />} />
65
+ <Route path="/dashboard/storage" element={<StoragePage />} />
66
+ <Route
67
+ path="/dashboard/logs"
68
+ element={<Navigate to="/dashboard/logs/MCP" replace />}
69
+ />
70
+ <Route path="/dashboard/logs/MCP" element={<MCPLogsPage />} />
71
+ <Route path="/dashboard/logs/audits" element={<AuditsPage />} />
72
+ <Route path="/dashboard/logs/:source" element={<LogsPage />} />
73
+ <Route
74
+ path="/dashboard/functions"
75
+ element={<Navigate to="/dashboard/functions/list" replace />}
76
+ />
77
+ <Route path="/dashboard/functions/list" element={<FunctionsPage />} />
78
+ <Route path="/dashboard/functions/secrets" element={<SecretsPage />} />
79
+ <Route path="/dashboard/visualizer" element={<VisualizerPage />} />
80
+ <Route path="/dashboard/ai" element={<AIPage />} />
81
+ <Route
82
+ path="/dashboard/realtime"
83
+ element={<Navigate to="/dashboard/realtime/channels" replace />}
84
+ />
85
+ <Route path="/dashboard/realtime/channels" element={<RealtimeChannelsPage />} />
86
+ <Route path="/dashboard/realtime/messages" element={<RealtimeMessagesPage />} />
87
+ <Route
88
+ path="/dashboard/realtime/permissions"
89
+ element={<RealtimePermissionsPage />}
90
+ />
91
+ <Route path="*" element={<Navigate to="/dashboard" replace />} />
92
+ </Routes>
93
+ </Layout>
94
+ </RequireAuth>
95
+ }
96
+ />
97
+ </Routes>
98
+ );
99
+ }
@@ -0,0 +1,27 @@
1
+ import { ReactNode } from 'react';
2
+ import { Navigate } from 'react-router-dom';
3
+ import { useAuth } from '@/lib/contexts/AuthContext';
4
+ import { LoadingState } from '@/components/LoadingState';
5
+ import { isIframe } from '../utils/utils';
6
+
7
+ interface RequireAuthProps {
8
+ children: ReactNode;
9
+ }
10
+
11
+ export const RequireAuth = ({ children }: RequireAuthProps) => {
12
+ const { isAuthenticated, isLoading } = useAuth();
13
+
14
+ if (isLoading) {
15
+ return (
16
+ <div className="min-h-screen flex items-center justify-center">
17
+ <LoadingState />
18
+ </div>
19
+ );
20
+ }
21
+
22
+ if (!isAuthenticated) {
23
+ return <Navigate to={isIframe() ? '/cloud/login' : '/dashboard/login'} replace />;
24
+ }
25
+
26
+ return <>{children}</>;
27
+ };
@@ -0,0 +1,20 @@
1
+ import { cloudEventSchema, CloudEvent } from '@insforge/shared-schemas';
2
+
3
+ export function postMessageToParent(evt: Record<string, unknown>, targetOrigin: string = '*') {
4
+ if (typeof window === 'undefined') {
5
+ return;
6
+ }
7
+ if (window.parent !== window) {
8
+ window.parent.postMessage(evt, targetOrigin);
9
+ }
10
+ }
11
+
12
+ /**
13
+ * Parses and validates an unknown value as a CloudEvent.
14
+ * @param value - The value to validate
15
+ * @returns A discriminated union: { ok: true; data: CloudEvent } on success, { ok: false } on failure
16
+ */
17
+ export function parseCloudEvent(value: unknown): { ok: true; data: CloudEvent } | { ok: false } {
18
+ const parsed = cloudEventSchema.safeParse(value);
19
+ return parsed.success ? { ok: true, data: parsed.data } : { ok: false };
20
+ }