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
@@ -12,23 +12,32 @@ import {
12
12
  ConnectionMode,
13
13
  } from '@xyflow/react';
14
14
  import '@xyflow/react/dist/style.css';
15
- import { TableNode, VisualizerTableSchema, VisualizerTableColumnSchema } from './TableNode';
15
+ import { TableNode } from './TableNode';
16
16
  import { AuthNode } from './AuthNode';
17
17
  import { BucketNode } from './BucketNode';
18
+ import { useAllTableSchemas } from '@/features/database/hooks/useTables';
19
+ import { useTheme } from '@/lib/contexts/ThemeContext';
18
20
  import {
19
21
  AppMetadataSchema,
20
22
  StorageBucketSchema,
21
23
  AuthMetadataSchema,
24
+ GetTableSchemaResponse,
22
25
  } from '@insforge/shared-schemas';
23
26
 
24
27
  interface SchemaVisualizerProps {
25
28
  metadata: AppMetadataSchema;
26
29
  userCount?: number;
30
+ // Optional external schemas for templates
31
+ externalSchemas?: GetTableSchemaResponse[];
32
+ // Control visibility of components
33
+ showControls?: boolean;
34
+ showMiniMap?: boolean;
27
35
  }
28
36
 
29
37
  type TableNodeData = {
30
- table: VisualizerTableSchema;
38
+ table: GetTableSchemaResponse;
31
39
  referencedColumns: string[];
40
+ showRecordCount?: boolean;
32
41
  };
33
42
 
34
43
  type BucketNodeData = {
@@ -38,6 +47,7 @@ type BucketNodeData = {
38
47
  type AuthNodeData = {
39
48
  authMetadata: AuthMetadataSchema;
40
49
  userCount?: number;
50
+ isReferenced?: boolean;
41
51
  };
42
52
 
43
53
  type CustomNodeData = TableNodeData | BucketNodeData | AuthNodeData;
@@ -119,7 +129,7 @@ const getLayoutedElements = (nodes: Node<CustomNodeData>[], edges: BuiltInEdge[]
119
129
 
120
130
  // Position table nodes in a grid in the middle
121
131
  let positionedTableNodes: Node<CustomNodeData>[] = [];
122
- if (tableNodes.length > 0) {
132
+ if (tableNodes.length) {
123
133
  const cols = Math.ceil(Math.sqrt(tableNodes.length));
124
134
 
125
135
  // Group tables by column for better height calculation
@@ -179,53 +189,20 @@ const getNodeColor = (node: Node<CustomNodeData>) => {
179
189
  }
180
190
  };
181
191
 
182
- export function SchemaVisualizer({ metadata, userCount }: SchemaVisualizerProps) {
183
- // Transform the new metadata structure to the visualizer format
184
- const tables = useMemo(() => {
185
- const tablesRecord = metadata.database.tables;
186
- return Object.entries(tablesRecord).map(([tableName, tableData]): VisualizerTableSchema => {
187
- // Check for primary key columns from indexes
188
- const primaryKeyColumns = new Set<string>();
189
-
190
- tableData.indexes.forEach((index) => {
191
- if (index.isPrimary) {
192
- // Extract column names from index definition
193
- const match = index.indexdef.match(/\(([^)]+)\)/);
194
- if (match) {
195
- match[1].split(',').forEach((col) => {
196
- primaryKeyColumns.add(col.trim().replace(/"/g, ''));
197
- });
198
- }
199
- }
200
- });
201
-
202
- // Transform columns from the new schema format
203
- const columns = tableData.schema.map((col) => {
204
- const column: VisualizerTableColumnSchema = {
205
- columnName: col.columnName,
206
- type: col.dataType.toLowerCase().substring(0, 4), // Truncate type to first 4 characters
207
- isPrimaryKey: primaryKeyColumns.has(col.columnName),
208
- };
209
-
210
- // Find foreign key info for this column
211
- const foreignKey = tableData.foreignKeys.find((fk) => fk.columnName === col.columnName);
212
- if (foreignKey) {
213
- column.foreignKey = {
214
- referenceTable: foreignKey.foreignTableName,
215
- referenceColumn: foreignKey.foreignColumnName,
216
- };
217
- }
192
+ export function SchemaVisualizer({
193
+ metadata,
194
+ userCount,
195
+ externalSchemas,
196
+ showControls = true,
197
+ showMiniMap = true,
198
+ }: SchemaVisualizerProps) {
199
+ const { resolvedTheme } = useTheme();
218
200
 
219
- return column;
220
- });
201
+ // Fetch all table schemas (only when external schemas are not provided)
202
+ const { allSchemas, isLoading: isLoadingSchemas } = useAllTableSchemas(!externalSchemas);
221
203
 
222
- return {
223
- tableName,
224
- columns,
225
- recordCount: tableData.recordCount ?? 0, // Use actual record count from metadata
226
- };
227
- });
228
- }, [metadata.database.tables]);
204
+ // Use external schemas if provided, otherwise use fetched schemas
205
+ const tables = externalSchemas || allSchemas;
229
206
 
230
207
  const initialNodes = useMemo(() => {
231
208
  // First, collect all referenced columns for each table
@@ -254,19 +231,32 @@ export function SchemaVisualizer({ metadata, userCount }: SchemaVisualizerProps)
254
231
  data: {
255
232
  table,
256
233
  referencedColumns: referencedColumnsByTable[table.tableName] || [],
234
+ showRecordCount: !externalSchemas, // Hide record count when using external schemas (template preview)
257
235
  },
258
236
  }));
259
237
 
238
+ const nodes: Node<CustomNodeData>[] = [...tableNodes];
239
+
240
+ // Add bucket nodes
260
241
  const bucketNodes: Node<BucketNodeData>[] = metadata.storage.buckets.map((bucket) => ({
261
242
  id: `bucket-${bucket.name}`,
262
243
  type: 'bucketNode',
263
244
  position: { x: 0, y: 0 },
264
245
  data: { bucket },
265
246
  }));
247
+ nodes.push(...bucketNodes);
248
+
249
+ // Check if any tables reference users.id
250
+ const isUsersReferenced = tables.some((table) =>
251
+ table.columns.some(
252
+ (column) =>
253
+ column.foreignKey &&
254
+ column.foreignKey.referenceTable === 'users' &&
255
+ column.foreignKey.referenceColumn === 'id'
256
+ )
257
+ );
266
258
 
267
- const nodes: Node<CustomNodeData>[] = [...tableNodes, ...bucketNodes];
268
-
269
- // Add authentication node if authData is provided
259
+ // Add authentication node
270
260
  nodes.push({
271
261
  id: 'authentication',
272
262
  type: 'authNode',
@@ -274,41 +264,66 @@ export function SchemaVisualizer({ metadata, userCount }: SchemaVisualizerProps)
274
264
  data: {
275
265
  authMetadata: metadata.auth,
276
266
  userCount,
267
+ isReferenced: isUsersReferenced,
277
268
  },
278
269
  });
279
270
 
280
271
  return nodes;
281
- }, [metadata, userCount, tables]);
272
+ }, [tables, metadata, externalSchemas, userCount]);
282
273
 
283
274
  const initialEdges = useMemo(() => {
284
275
  const edges: BuiltInEdge[] = [];
276
+ const edgeColor = resolvedTheme === 'dark' ? 'white' : '#18181b'; // zinc-950 for light mode
285
277
 
286
278
  tables.forEach((table) => {
287
279
  table.columns.forEach((column) => {
288
280
  if (column.foreignKey) {
281
+ // Check if this is a reference to users.id
282
+ const isAuthReference =
283
+ column.foreignKey.referenceTable === 'users' &&
284
+ column.foreignKey.referenceColumn === 'id';
285
+
289
286
  const edgeId = `${table.tableName}-${column.columnName}-${column.foreignKey.referenceTable}`;
290
- edges.push({
291
- id: edgeId,
292
- source: table.tableName,
293
- target: column.foreignKey.referenceTable,
294
- sourceHandle: `${column.columnName}-source`,
295
- targetHandle: `${column.foreignKey.referenceColumn}-target`,
296
- type: 'smoothstep',
297
- animated: true,
298
- style: { stroke: 'white', strokeWidth: 2, zIndex: 1000 },
299
- zIndex: 1000,
300
- pathOptions: {
301
- offset: 40,
302
- },
303
- });
287
+
288
+ if (isAuthReference) {
289
+ // Connect to the authentication node
290
+ edges.push({
291
+ id: edgeId,
292
+ source: table.tableName,
293
+ target: 'authentication',
294
+ sourceHandle: `${column.columnName}-source`,
295
+ targetHandle: 'id-target',
296
+ type: 'smoothstep',
297
+ animated: true,
298
+ style: { stroke: edgeColor, strokeWidth: 2, zIndex: 1000 },
299
+ zIndex: 1000,
300
+ pathOptions: {
301
+ offset: 40,
302
+ },
303
+ });
304
+ } else {
305
+ // Regular table-to-table edge
306
+ edges.push({
307
+ id: edgeId,
308
+ source: table.tableName,
309
+ target: column.foreignKey.referenceTable,
310
+ sourceHandle: `${column.columnName}-source`,
311
+ targetHandle: `${column.foreignKey.referenceColumn}-target`,
312
+ type: 'smoothstep',
313
+ animated: true,
314
+ style: { stroke: edgeColor, strokeWidth: 2, zIndex: 1000 },
315
+ zIndex: 1000,
316
+ pathOptions: {
317
+ offset: 40,
318
+ },
319
+ });
320
+ }
304
321
  }
305
322
  });
306
323
  });
307
324
 
308
- // Add authentication edges if authData exists
309
-
310
325
  return edges;
311
- }, [tables]);
326
+ }, [tables, resolvedTheme]);
312
327
 
313
328
  const { nodes: layoutedNodes, edges: layoutedEdges } = useMemo(
314
329
  () => getLayoutedElements(initialNodes, initialEdges),
@@ -319,15 +334,26 @@ export function SchemaVisualizer({ metadata, userCount }: SchemaVisualizerProps)
319
334
  const [edges, setEdges, onEdgesChange] = useEdgesState(layoutedEdges);
320
335
 
321
336
  useEffect(() => {
322
- setNodes(layoutedNodes);
323
- setEdges(layoutedEdges);
324
- }, [layoutedNodes, layoutedEdges, setNodes, setEdges]);
337
+ if (!isLoadingSchemas) {
338
+ setNodes(layoutedNodes);
339
+ setEdges(layoutedEdges);
340
+ }
341
+ }, [layoutedNodes, layoutedEdges, isLoadingSchemas, setNodes, setEdges]);
325
342
 
326
343
  const onConnect = useCallback(
327
344
  (params: Connection) => setEdges((eds) => addEdge(params, eds)),
328
345
  [setEdges]
329
346
  );
330
347
 
348
+ // Don't render ReactFlow until data is loaded (only if not using external schemas)
349
+ if (!externalSchemas && isLoadingSchemas) {
350
+ return (
351
+ <div className="w-full h-full flex items-center justify-center text-white">
352
+ Loading schemas...
353
+ </div>
354
+ );
355
+ }
356
+
331
357
  return (
332
358
  <div className="w-full h-full">
333
359
  <ReactFlow
@@ -339,20 +365,22 @@ export function SchemaVisualizer({ metadata, userCount }: SchemaVisualizerProps)
339
365
  nodeTypes={nodeTypes}
340
366
  connectionMode={ConnectionMode.Loose}
341
367
  fitView
342
- fitViewOptions={{ padding: 1, maxZoom: 2, minZoom: 1 }}
368
+ fitViewOptions={{ padding: 1, maxZoom: 2, minZoom: 0.8 }}
343
369
  minZoom={0.1}
344
370
  maxZoom={2}
345
371
  proOptions={{ hideAttribution: true }}
346
372
  elevateEdgesOnSelect={true}
347
- colorMode="dark"
373
+ colorMode={resolvedTheme === 'dark' ? 'dark' : 'light'}
348
374
  className="!bg-transparent"
349
375
  >
350
- <Controls
351
- showInteractive={false}
352
- className="!border !border-neutral-700 !shadow-lg"
353
- fitViewOptions={{ padding: 1, duration: 300, maxZoom: 2, minZoom: 1 }}
354
- />
355
- <MiniMap nodeColor={(node: Node<CustomNodeData>) => getNodeColor(node)} />
376
+ {showControls && (
377
+ <Controls
378
+ showInteractive={false}
379
+ className="!border !border-neutral-700 !shadow-lg"
380
+ fitViewOptions={{ padding: 1, duration: 300, maxZoom: 2, minZoom: 1 }}
381
+ />
382
+ )}
383
+ {showMiniMap && <MiniMap nodeColor={(node: Node<CustomNodeData>) => getNodeColor(node)} />}
356
384
  </ReactFlow>
357
385
  </div>
358
386
  );
@@ -1,32 +1,17 @@
1
1
  import { Database, Circle, Key } from 'lucide-react';
2
2
  import { Handle, Position } from '@xyflow/react';
3
-
4
- // Define the table structure expected by this component
5
- export interface VisualizerTableColumnSchema {
6
- columnName: string;
7
- type: string;
8
- isPrimaryKey?: boolean;
9
- foreignKey?: {
10
- referenceTable: string;
11
- referenceColumn: string;
12
- };
13
- }
14
-
15
- export interface VisualizerTableSchema {
16
- tableName: string;
17
- columns: VisualizerTableColumnSchema[];
18
- recordCount?: number;
19
- }
3
+ import { TableSchema } from '@insforge/shared-schemas';
20
4
 
21
5
  interface TableNodeProps {
22
6
  data: {
23
- table: VisualizerTableSchema;
7
+ table: TableSchema;
24
8
  referencedColumns?: string[]; // List of column names that are referenced by other tables
9
+ showRecordCount?: boolean; // Control whether to show record count
25
10
  };
26
11
  }
27
12
 
28
13
  export function TableNode({ data }: TableNodeProps) {
29
- const { table, referencedColumns = [] } = data;
14
+ const { table, referencedColumns = [], showRecordCount = true } = data;
30
15
 
31
16
  const getColumnIcon = (isReferenced: boolean = false) => {
32
17
  // If column is referenced by another table (has incoming connections)
@@ -35,35 +20,37 @@ export function TableNode({ data }: TableNodeProps) {
35
20
  return (
36
21
  <div className="w-4 h-4 flex items-center justify-center relative">
37
22
  {/* Outer gray diamond */}
38
- <div className="w-4 h-4 bg-neutral-800 border border-white absolute transform rotate-45" />
23
+ <div className="w-4 h-4 bg-gray-200 dark:bg-neutral-800 border border-zinc-950 dark:border-white absolute transform rotate-45" />
39
24
  {/* Inner white diamond */}
40
- <div className="w-2 h-2 bg-white absolute transform rotate-45" />
25
+ <div className="w-2 h-2 bg-zinc-950 dark:bg-white absolute transform rotate-45" />
41
26
  </div>
42
27
  );
43
28
  }
44
29
  return (
45
30
  <div className="w-4 h-4 flex items-center justify-center relative">
46
31
  {/* Outer gray diamond */}
47
- <div className="w-4 h-4 bg-neutral-800 border border-neutral-700 absolute transform rotate-45" />
32
+ <div className="w-4 h-4 bg-gray-200 dark:bg-neutral-800 border border-gray-400 dark:border-neutral-700 absolute transform rotate-45" />
48
33
  </div>
49
34
  );
50
35
  };
51
36
 
52
37
  return (
53
- <div className="bg-neutral-900 rounded-lg border border-[#363636] min-w-[320px]">
38
+ <div className="bg-white dark:bg-neutral-900 rounded-lg border border-gray-300 dark:border-[#363636] min-w-[320px] shadow-sm">
54
39
  {/* Table Header */}
55
- <div className="flex items-center justify-between p-2 border-b border-neutral-800">
40
+ <div className="flex items-center justify-between p-2 border-b border-gray-200 dark:border-neutral-800">
56
41
  <div className="flex items-center gap-2">
57
42
  <div className="flex items-center justify-center w-11 h-11 bg-teal-300 rounded p-1.5">
58
43
  <Database className="w-5 h-5 text-neutral-900" />
59
44
  </div>
60
45
  <div className="flex-1">
61
- <h3 className="text-sm font-medium text-white">{table.tableName}</h3>
62
- <p className="text-xs text-neutral-300">
63
- {table.recordCount !== undefined
64
- ? `${table.recordCount.toLocaleString()} data`
65
- : '0 data'}
66
- </p>
46
+ <h3 className="text-sm font-medium text-zinc-950 dark:text-white">{table.tableName}</h3>
47
+ {showRecordCount && (
48
+ <p className="text-xs text-zinc-600 dark:text-neutral-300">
49
+ {table.recordCount !== undefined
50
+ ? `${table.recordCount.toLocaleString()} data`
51
+ : '0 data'}
52
+ </p>
53
+ )}
67
54
  </div>
68
55
  </div>
69
56
  {/* <div className="p-1.5">
@@ -76,7 +63,7 @@ export function TableNode({ data }: TableNodeProps) {
76
63
  {table.columns.map((column) => (
77
64
  <div
78
65
  key={column.columnName}
79
- className="flex items-center justify-between p-3 border-b border-neutral-800 relative"
66
+ className="flex items-center justify-between p-3 border-b border-gray-200 dark:border-neutral-800 relative"
80
67
  >
81
68
  {/* Source handle for foreign key columns - invisible and non-interactive */}
82
69
  {column.foreignKey && (
@@ -114,35 +101,41 @@ export function TableNode({ data }: TableNodeProps) {
114
101
 
115
102
  <div className="flex items-center gap-2.5 flex-1">
116
103
  {getColumnIcon(referencedColumns.includes(column.columnName))}
117
- <span className="text-sm text-neutral-300">{column.columnName}</span>
118
- {column.isPrimaryKey && <Key className="w-3 h-3 text-neutral-400" />}
104
+ <span className="text-sm text-zinc-700 dark:text-neutral-300">
105
+ {column.columnName}
106
+ </span>
107
+ {column.isPrimaryKey && (
108
+ <Key className="w-3 h-3 text-zinc-500 dark:text-neutral-400" />
109
+ )}
119
110
  </div>
120
111
  <div className="flex items-center gap-2.5">
121
- <div className="px-1.5 py-0.5 bg-neutral-800 rounded flex items-center">
122
- <span className="text-xs font-medium text-neutral-300">{column.type}</span>
112
+ <div className="px-1.5 py-0.5 bg-gray-100 dark:bg-neutral-800 rounded flex items-center">
113
+ <span className="text-xs font-medium text-zinc-700 dark:text-neutral-300">
114
+ {column.type}
115
+ </span>
123
116
  </div>
124
117
  {/* Show white dot with outer circle for foreign key columns, gray circle for others */}
125
118
  {column.foreignKey ? (
126
119
  <div className="w-5 h-5 flex items-center justify-center relative">
127
120
  <Circle
128
- className="w-5 h-5 text-white fill-none stroke-current"
121
+ className="w-5 h-5 text-zinc-950 dark:text-white fill-none stroke-current"
129
122
  strokeWidth={1.5}
130
123
  />
131
- <div className="w-2 h-2 bg-white rounded-full absolute" />
124
+ <div className="w-2 h-2 bg-zinc-950 dark:bg-white rounded-full absolute" />
132
125
  </div>
133
126
  ) : (
134
- <Circle className="w-5 h-5 text-neutral-700 fill-neutral-800 stroke-current" />
127
+ <Circle className="w-5 h-5 text-gray-400 dark:text-neutral-700 fill-gray-100 dark:fill-neutral-800 stroke-current" />
135
128
  )}
136
129
  </div>
137
130
  </div>
138
131
  ))}
139
132
 
140
133
  {/* Empty state */}
141
- {table.columns.length === 0 && (
134
+ {!table.columns.length && (
142
135
  <div className="flex items-center justify-center p-6">
143
136
  <div className="text-center">
144
- <Database className="w-6 h-6 text-neutral-600 mx-auto mb-2" />
145
- <p className="text-xs text-neutral-500">No columns defined</p>
137
+ <Database className="w-6 h-6 text-gray-400 dark:text-neutral-600 mx-auto mb-2" />
138
+ <p className="text-xs text-gray-500 dark:text-neutral-500">No columns defined</p>
146
139
  </div>
147
140
  </div>
148
141
  )}
@@ -1,9 +1,17 @@
1
1
  export function VisualizerSkeleton() {
2
2
  return (
3
- <div className="relative min-h-screen bg-neutral-800 overflow-hidden">
4
- {/* Dot Matrix Background */}
3
+ <div className="relative h-full bg-gray-50 dark:bg-neutral-800 overflow-hidden">
4
+ {/* Dot Matrix Background - Light Mode */}
5
5
  <div
6
- className="absolute inset-0 opacity-50"
6
+ className="absolute inset-0 opacity-50 dark:hidden"
7
+ style={{
8
+ backgroundImage: `radial-gradient(circle, #D1D5DB 1px, transparent 1px)`,
9
+ backgroundSize: '12px 12px',
10
+ }}
11
+ />
12
+ {/* Dot Matrix Background - Dark Mode */}
13
+ <div
14
+ className="absolute inset-0 opacity-50 hidden dark:block"
7
15
  style={{
8
16
  backgroundImage: `radial-gradient(circle, #3B3B3B 1px, transparent 1px)`,
9
17
  backgroundSize: '12px 12px',
@@ -13,7 +21,7 @@ export function VisualizerSkeleton() {
13
21
  {/* Loading content */}
14
22
  <div className="relative z-10 flex items-center justify-center min-h-screen">
15
23
  <div className="text-center">
16
- <div className="inline-flex items-center gap-3 text-white">
24
+ <div className="inline-flex items-center gap-3 text-zinc-950 dark:text-white">
17
25
  <div className="w-8 h-8 border-4 border-blue-500 border-t-transparent rounded-full animate-spin" />
18
26
  <span className="text-lg font-medium">Loading schema visualization...</span>
19
27
  </div>
@@ -0,0 +1,97 @@
1
+ import { RefreshCw } from 'lucide-react';
2
+ import { useCallback } from 'react';
3
+ import { useMetadata } from '@/lib/hooks/useMetadata';
4
+ import { useUsers } from '@/features/auth/hooks/useUsers';
5
+ import { SchemaVisualizer, VisualizerSkeleton } from '../components';
6
+ import { Alert, AlertDescription, Button } from '@/components';
7
+
8
+ const VisualizerPage = () => {
9
+ const {
10
+ metadata,
11
+ isLoading: metadataLoading,
12
+ error: metadataError,
13
+ refetch: refetchMetadata,
14
+ } = useMetadata();
15
+
16
+ const {
17
+ totalUsers,
18
+ isLoading: userStatsLoading,
19
+ refetch: refetchUserStats,
20
+ } = useUsers({ enabled: true });
21
+
22
+ const isLoading = metadataLoading || userStatsLoading;
23
+ const error = metadataError;
24
+
25
+ const handleRefresh = useCallback(() => {
26
+ void refetchMetadata();
27
+ void refetchUserStats();
28
+ }, [refetchMetadata, refetchUserStats]);
29
+
30
+ if (isLoading) {
31
+ return <VisualizerSkeleton />;
32
+ }
33
+
34
+ if (!metadata || error) {
35
+ return (
36
+ <div className="relative h-full bg-gray-50 dark:bg-neutral-800 overflow-hidden">
37
+ {/* Dot Matrix Background - Light Mode */}
38
+ <div
39
+ className="absolute inset-0 opacity-50 dark:hidden"
40
+ style={{
41
+ backgroundImage: `radial-gradient(circle, #D1D5DB 1px, transparent 1px)`,
42
+ backgroundSize: '12px 12px',
43
+ }}
44
+ />
45
+ {/* Dot Matrix Background - Dark Mode */}
46
+ <div
47
+ className="absolute inset-0 opacity-50 hidden dark:block"
48
+ style={{
49
+ backgroundImage: `radial-gradient(circle, #3B3B3B 1px, transparent 1px)`,
50
+ backgroundSize: '12px 12px',
51
+ }}
52
+ />
53
+
54
+ <div className="relative z-10 flex items-center justify-center h-full p-8">
55
+ <Alert variant="destructive" className="max-w-md">
56
+ <AlertDescription>
57
+ Failed to load database schema. Please ensure the backend is running and try
58
+ refreshing.
59
+ </AlertDescription>
60
+ <Button onClick={handleRefresh} className="mt-4 w-full" variant="outline">
61
+ <RefreshCw className="w-4 h-4 mr-2" />
62
+ Retry
63
+ </Button>
64
+ </Alert>
65
+ </div>
66
+ </div>
67
+ );
68
+ }
69
+
70
+ return (
71
+ <div className="relative h-full bg-gray-50 dark:bg-neutral-800 overflow-hidden">
72
+ {/* Dot Matrix Background - Light Mode */}
73
+ <div
74
+ className="absolute inset-0 opacity-50 dark:hidden"
75
+ style={{
76
+ backgroundImage: `radial-gradient(circle, #D1D5DB 1px, transparent 1px)`,
77
+ backgroundSize: '12px 12px',
78
+ }}
79
+ />
80
+ {/* Dot Matrix Background - Dark Mode */}
81
+ <div
82
+ className="absolute inset-0 opacity-50 hidden dark:block"
83
+ style={{
84
+ backgroundImage: `radial-gradient(circle, #3B3B3B 1px, transparent 1px)`,
85
+ backgroundSize: '12px 12px',
86
+ }}
87
+ />
88
+
89
+ {/* Schema Visualizer */}
90
+ <div className="relative z-10 w-full h-full">
91
+ <SchemaVisualizer metadata={metadata} userCount={totalUsers} />
92
+ </div>
93
+ </div>
94
+ );
95
+ };
96
+
97
+ export default VisualizerPage;
@@ -60,6 +60,7 @@
60
60
  --fontFamilyBase:
61
61
  'Inter', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
62
62
  --fontFamilyMono: 'Ubuntu Mono', ui-monospace, monospace;
63
+ --fontFamilyManrope: 'Manrope', sans-serif;
63
64
  }
64
65
 
65
66
  /* Prevent document-level scrolling */
@@ -0,0 +1,27 @@
1
+ import posthog from 'posthog-js';
2
+ import { PostHogProvider } from 'posthog-js/react';
3
+
4
+ const POSTHOG_KEY = import.meta.env.VITE_PUBLIC_POSTHOG_KEY || '';
5
+
6
+ if (POSTHOG_KEY) {
7
+ try {
8
+ posthog.init(POSTHOG_KEY, {
9
+ api_host: 'https://us.i.posthog.com',
10
+ capture_exceptions: true, // This enables capturing exceptions using Error Tracking
11
+ debug: import.meta.env.DEV,
12
+ session_recording: {
13
+ // WARNING: Only enable this if you understand the security implications
14
+ recordCrossOriginIframes: true,
15
+ },
16
+ });
17
+ } catch (error) {
18
+ console.error('Error initializing PostHog', error);
19
+ }
20
+ }
21
+
22
+ export const PostHogAnalyticsProvider = ({ children }: { children: React.ReactNode }) => {
23
+ if (POSTHOG_KEY) {
24
+ return <PostHogProvider client={posthog}>{children}</PostHogProvider>;
25
+ }
26
+ return <>{children}</>;
27
+ };