insforge 1.2.10 → 1.4.8

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 (506) hide show
  1. package/.claude-plugin/marketplace.json +20 -20
  2. package/.dockerignore +60 -60
  3. package/.env.example +83 -77
  4. package/.github/ISSUE_TEMPLATE/bug_report.yml +36 -36
  5. package/.github/ISSUE_TEMPLATE/config.yml +11 -11
  6. package/.github/ISSUE_TEMPLATE/feature_request.yml +26 -26
  7. package/.github/PULL_REQUEST_TEMPLATE.md +7 -7
  8. package/.github/copilot-instructions.md +146 -146
  9. package/.github/workflows/build-image.yml +65 -65
  10. package/.github/workflows/ci-premerge-check.yml +23 -23
  11. package/.github/workflows/e2e.yml +63 -63
  12. package/.github/workflows/lint-and-format.yml +32 -32
  13. package/.prettierignore +64 -64
  14. package/CHANGELOG.md +46 -44
  15. package/CLAUDE_PLUGIN.md +104 -104
  16. package/CODE_OF_CONDUCT.md +128 -128
  17. package/CONTRIBUTING.md +125 -125
  18. package/Dockerfile +30 -30
  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 -182
  23. package/assets/Dark.svg +23 -23
  24. package/auth/package.json +30 -28
  25. package/auth/src/lib/broadcastService.ts +4 -4
  26. package/auth/src/lib/insforge.ts +8 -0
  27. package/auth/src/main.tsx +2 -4
  28. package/auth/src/pages/SignInPage.tsx +5 -2
  29. package/auth/src/pages/SignUpPage.tsx +5 -2
  30. package/auth/src/pages/VerifyEmailPage.tsx +18 -0
  31. package/auth/tsconfig.json +33 -32
  32. package/auth/tsconfig.node.json +11 -11
  33. package/backend/package.json +82 -75
  34. package/backend/src/api/middlewares/rate-limiters.ts +127 -127
  35. package/backend/src/api/routes/ai/index.routes.ts +475 -468
  36. package/backend/src/api/routes/auth/index.routes.ts +720 -570
  37. package/backend/src/api/routes/auth/oauth.routes.ts +478 -448
  38. package/backend/src/api/routes/database/advance.routes.ts +37 -16
  39. package/backend/src/api/routes/database/index.routes.ts +80 -1
  40. package/backend/src/api/routes/database/records.routes.ts +48 -184
  41. package/backend/src/api/routes/database/rpc.routes.ts +69 -0
  42. package/backend/src/api/routes/database/tables.routes.ts +0 -14
  43. package/backend/src/api/routes/deployments/index.routes.ts +192 -0
  44. package/backend/src/api/routes/docs/index.routes.ts +76 -76
  45. package/backend/src/api/routes/email/index.routes.ts +35 -0
  46. package/backend/src/api/routes/functions/index.routes.ts +21 -15
  47. package/backend/src/api/routes/metadata/index.routes.ts +38 -0
  48. package/backend/src/api/routes/realtime/channels.routes.ts +81 -0
  49. package/backend/src/api/routes/realtime/index.routes.ts +12 -0
  50. package/backend/src/api/routes/realtime/messages.routes.ts +48 -0
  51. package/backend/src/api/routes/realtime/permissions.routes.ts +19 -0
  52. package/backend/src/api/routes/storage/index.routes.ts +18 -12
  53. package/backend/src/api/routes/usage/index.routes.ts +6 -4
  54. package/backend/src/api/routes/webhooks/index.routes.ts +109 -0
  55. package/backend/src/infra/database/database.manager.ts +14 -11
  56. package/backend/src/infra/database/migrations/000_create-base-tables.sql +141 -141
  57. package/backend/src/infra/database/migrations/001_create-helper-functions.sql +40 -40
  58. package/backend/src/infra/database/migrations/002_rename-auth-tables.sql +29 -29
  59. package/backend/src/infra/database/migrations/003_create-users-table.sql +55 -55
  60. package/backend/src/infra/database/migrations/004_add-reload-postgrest-func.sql +23 -23
  61. package/backend/src/infra/database/migrations/005_enable-project-admin-modify-users.sql +29 -29
  62. package/backend/src/infra/database/migrations/006_modify-ai-usage-table.sql +24 -24
  63. package/backend/src/infra/database/migrations/007_drop-metadata-table.sql +1 -1
  64. package/backend/src/infra/database/migrations/008_add-system-tables.sql +76 -76
  65. package/backend/src/infra/database/migrations/009_add-function-secrets.sql +23 -23
  66. package/backend/src/infra/database/migrations/010_modify-ai-config-modalities.sql +93 -93
  67. package/backend/src/infra/database/migrations/011_refactor-secrets-table.sql +15 -15
  68. package/backend/src/infra/database/migrations/012_add-storage-uploaded-by.sql +7 -7
  69. package/backend/src/infra/database/migrations/013_create-auth-schema-functions.sql +44 -44
  70. package/backend/src/infra/database/migrations/014_add-updated-at-trigger-user-table.sql +7 -7
  71. package/backend/src/infra/database/migrations/015_create-auth-config-and-email-otp-tables.sql +59 -59
  72. package/backend/src/infra/database/migrations/016_update-auth-config-and-email-otp.sql +24 -24
  73. package/backend/src/infra/database/migrations/017_create-realtime-schema.sql +233 -0
  74. package/backend/src/infra/database/migrations/018_schema-rework.sql +441 -0
  75. package/backend/src/infra/database/migrations/019_create-deployments-table.sql +36 -0
  76. package/backend/src/infra/database/migrations/020_add-audio-modality.sql +11 -0
  77. package/backend/src/infra/database/migrations/bootstrap/bootstrap-migrations.js +103 -0
  78. package/backend/src/infra/realtime/realtime.manager.ts +246 -0
  79. package/backend/src/infra/realtime/webhook-sender.ts +82 -0
  80. package/backend/src/infra/security/token.manager.ts +216 -125
  81. package/backend/src/infra/socket/socket.manager.ts +198 -64
  82. package/backend/src/providers/ai/openrouter.provider.ts +24 -12
  83. package/backend/src/providers/database/base.provider.ts +39 -0
  84. package/backend/src/providers/database/cloud.provider.ts +159 -0
  85. package/backend/src/providers/deployments/vercel.provider.ts +516 -0
  86. package/backend/src/providers/email/base.provider.ts +4 -7
  87. package/backend/src/providers/email/cloud.provider.ts +84 -0
  88. package/backend/src/providers/oauth/apple.provider.ts +266 -0
  89. package/backend/src/providers/oauth/index.ts +1 -0
  90. package/backend/src/server.ts +329 -284
  91. package/backend/src/services/ai/ai-config.service.ts +6 -6
  92. package/backend/src/services/ai/ai-model.service.ts +60 -60
  93. package/backend/src/services/ai/ai-usage.service.ts +7 -7
  94. package/backend/src/services/ai/chat-completion.service.ts +415 -220
  95. package/backend/src/services/ai/helpers.ts +64 -64
  96. package/backend/src/services/ai/image-generation.service.ts +3 -3
  97. package/backend/src/services/ai/index.ts +13 -13
  98. package/backend/src/services/auth/auth-config.service.ts +4 -4
  99. package/backend/src/services/auth/auth-otp.service.ts +6 -6
  100. package/backend/src/services/auth/auth.service.ts +148 -74
  101. package/backend/src/services/auth/index.ts +4 -4
  102. package/backend/src/services/auth/oauth-config.service.ts +12 -12
  103. package/backend/src/services/database/database-advance.service.ts +19 -55
  104. package/backend/src/services/database/database-table.service.ts +38 -94
  105. package/backend/src/services/database/database.service.ts +127 -0
  106. package/backend/src/services/database/postgrest-proxy.service.ts +165 -0
  107. package/backend/src/services/deployments/deployment.service.ts +693 -0
  108. package/backend/src/services/email/email.service.ts +5 -7
  109. package/backend/src/services/functions/function.service.ts +61 -41
  110. package/backend/src/services/logs/audit.service.ts +10 -10
  111. package/backend/src/services/realtime/index.ts +3 -0
  112. package/backend/src/services/realtime/realtime-auth.service.ts +104 -0
  113. package/backend/src/services/realtime/realtime-channel.service.ts +237 -0
  114. package/backend/src/services/realtime/realtime-message.service.ts +260 -0
  115. package/backend/src/services/secrets/secret.service.ts +101 -27
  116. package/backend/src/services/storage/storage.service.ts +30 -30
  117. package/backend/src/services/usage/usage.service.ts +6 -6
  118. package/backend/src/types/ai.ts +8 -0
  119. package/backend/src/types/auth.ts +16 -1
  120. package/backend/src/types/database.ts +2 -0
  121. package/backend/src/types/deployments.ts +33 -0
  122. package/backend/src/types/realtime.ts +18 -0
  123. package/backend/src/types/socket.ts +7 -31
  124. package/backend/src/types/storage.ts +1 -1
  125. package/backend/src/types/webhooks.ts +45 -0
  126. package/backend/src/utils/cookies.ts +34 -0
  127. package/backend/src/utils/environment.ts +0 -14
  128. package/backend/src/utils/s3-config-loader.ts +64 -0
  129. package/backend/src/utils/seed.ts +79 -43
  130. package/backend/src/utils/sql-parser.ts +216 -0
  131. package/backend/src/utils/utils.ts +114 -114
  132. package/backend/src/utils/validations.ts +10 -10
  133. package/backend/tests/README.md +133 -133
  134. package/backend/tests/cleanup-all-test-data.sh +230 -230
  135. package/backend/tests/cloud/test-s3-multitenant.sh +131 -131
  136. package/backend/tests/local/comprehensive-curl-tests.sh +155 -155
  137. package/backend/tests/local/test-ai-config.sh +129 -129
  138. package/backend/tests/local/test-ai-usage.sh +80 -80
  139. package/backend/tests/local/test-auth-router.sh +143 -143
  140. package/backend/tests/local/test-database-router.sh +222 -222
  141. package/backend/tests/local/test-e2e.sh +240 -240
  142. package/backend/tests/local/test-fk-errors.sh +96 -96
  143. package/backend/tests/local/test-functions.sh +123 -123
  144. package/backend/tests/local/test-id-field.sh +200 -200
  145. package/backend/tests/local/test-logs.sh +132 -132
  146. package/backend/tests/local/test-public-bucket.sh +264 -264
  147. package/backend/tests/local/test-rpc.sh +141 -0
  148. package/backend/tests/local/test-secrets.sh +249 -249
  149. package/backend/tests/local/test-serverless-functions.sh.disabled +325 -325
  150. package/backend/tests/local/test-traditional-rest.sh +208 -208
  151. package/backend/tests/manual/README.md +50 -50
  152. package/backend/tests/manual/create-large-table-simple.sql +10 -10
  153. package/backend/tests/manual/seed-large-table.sql +100 -100
  154. package/backend/tests/manual/setup-large-table-extras.sql +33 -33
  155. package/backend/tests/manual/test-ai-model-plugins.sh +258 -0
  156. package/backend/tests/manual/test-bulk-upsert.sh +409 -409
  157. package/backend/tests/manual/test-database-advance.sh +296 -296
  158. package/backend/tests/manual/test-postgrest-stability.sh +191 -191
  159. package/backend/tests/manual/test-rawsql-export-import.sh +411 -411
  160. package/backend/tests/manual/test-rawsql-modes.sh +244 -244
  161. package/backend/tests/manual/test-universal-storage.sh +263 -263
  162. package/backend/tests/manual/test-users.sql +17 -17
  163. package/backend/tests/run-all-tests.sh +139 -139
  164. package/backend/tests/setup.ts +0 -0
  165. package/backend/tests/test-config.sh +338 -338
  166. package/backend/tests/unit/analyze-query.test.ts +697 -0
  167. package/backend/tests/unit/database-advance.test.ts +326 -0
  168. package/backend/tests/unit/helpers.test.ts +2 -2
  169. package/backend/tsconfig.json +22 -22
  170. package/claude-plugin/.claude-plugin/plugin.json +24 -24
  171. package/claude-plugin/README.md +133 -133
  172. package/claude-plugin/skills/insforge-schema-patterns/SKILL.md +273 -270
  173. package/docker-compose.prod.yml +204 -200
  174. package/docker-compose.yml +232 -228
  175. package/docker-init/db/db-init.sql +97 -97
  176. package/docker-init/db/jwt.sql +5 -5
  177. package/docker-init/db/postgresql.conf +16 -16
  178. package/docker-init/logs/vector.yml +236 -236
  179. package/docs/README.md +44 -44
  180. package/docs/agent-docs/deployment.md +79 -0
  181. package/docs/agent-docs/real-time.md +269 -0
  182. package/docs/changelog.mdx +212 -67
  183. package/docs/core-concepts/ai/architecture.mdx +350 -372
  184. package/docs/core-concepts/ai/sdk.mdx +238 -213
  185. package/docs/core-concepts/authentication/architecture.mdx +276 -278
  186. package/docs/core-concepts/authentication/sdk.mdx +710 -414
  187. package/docs/core-concepts/authentication/ui-components/customization.mdx +733 -529
  188. package/docs/core-concepts/authentication/ui-components/nextjs.mdx +247 -221
  189. package/docs/core-concepts/authentication/ui-components/react-router.mdx +183 -184
  190. package/docs/core-concepts/authentication/ui-components/react.mdx +136 -129
  191. package/docs/core-concepts/database/architecture.mdx +292 -255
  192. package/docs/core-concepts/database/pgvector.mdx +138 -0
  193. package/docs/core-concepts/database/sdk.mdx +382 -382
  194. package/docs/core-concepts/deployments/architecture.mdx +152 -0
  195. package/docs/core-concepts/email/architecture.mdx +103 -0
  196. package/docs/core-concepts/email/sdk.mdx +53 -0
  197. package/docs/core-concepts/functions/architecture.mdx +105 -105
  198. package/docs/core-concepts/functions/sdk.mdx +183 -184
  199. package/docs/core-concepts/realtime/architecture.mdx +446 -0
  200. package/docs/core-concepts/realtime/sdk.mdx +409 -0
  201. package/docs/core-concepts/storage/architecture.mdx +243 -243
  202. package/docs/core-concepts/storage/sdk.mdx +253 -253
  203. package/docs/deployment/README.md +94 -94
  204. package/docs/deployment/deploy-to-aws-ec2.md +564 -564
  205. package/docs/deployment/deploy-to-azure-virtual-machines.md +312 -312
  206. package/docs/deployment/deploy-to-google-cloud-compute-engine.md +613 -613
  207. package/docs/deployment/deploy-to-render.md +441 -441
  208. package/docs/deprecated/insforge-auth-api.md +214 -214
  209. package/docs/deprecated/insforge-auth-sdk.md +99 -99
  210. package/docs/deprecated/insforge-db-api.md +358 -358
  211. package/docs/deprecated/insforge-db-sdk.md +139 -139
  212. package/docs/deprecated/insforge-debug-sdk.md +156 -156
  213. package/docs/deprecated/insforge-debug.md +64 -64
  214. package/docs/deprecated/insforge-instructions.md +123 -123
  215. package/docs/deprecated/insforge-project.md +117 -117
  216. package/docs/deprecated/insforge-storage-api.md +278 -278
  217. package/docs/deprecated/insforge-storage-sdk.md +158 -158
  218. package/docs/docs.json +240 -210
  219. package/docs/examples/framework-guides/nextjs.mdx +131 -131
  220. package/docs/examples/framework-guides/nuxt.mdx +165 -165
  221. package/docs/examples/framework-guides/react.mdx +165 -165
  222. package/docs/examples/framework-guides/svelte.mdx +153 -153
  223. package/docs/examples/framework-guides/vue.mdx +159 -159
  224. package/docs/examples/overview.mdx +67 -67
  225. package/docs/favicon.png +0 -0
  226. package/docs/favicon.svg +4 -19
  227. package/docs/images/changelog/dec-2025/ai-integration.png +0 -0
  228. package/docs/images/changelog/dec-2025/ai-models.webp +0 -0
  229. package/docs/images/changelog/dec-2025/alipay-payment.webp +0 -0
  230. package/docs/images/changelog/dec-2025/apple-login.jpg +0 -0
  231. package/docs/images/changelog/dec-2025/apple-oauth.mp4 +0 -0
  232. package/docs/images/changelog/dec-2025/mcp-installer.png +0 -0
  233. package/docs/images/changelog/dec-2025/moreModels.png +0 -0
  234. package/docs/images/changelog/dec-2025/multi-region.webp +0 -0
  235. package/docs/images/changelog/dec-2025/postgres-connection.webp +0 -0
  236. package/docs/images/changelog/dec-2025/realtime-module.jpg +0 -0
  237. package/docs/images/changelog/dec-2025/realtime2.png +0 -0
  238. package/docs/images/icons/ai.svg +4 -4
  239. package/docs/images/logos/nextjs.svg +4 -4
  240. package/docs/images/logos/nuxt.svg +4 -4
  241. package/docs/images/logos/react.svg +5 -5
  242. package/docs/images/logos/svelte.svg +4 -4
  243. package/docs/images/logos/vue.svg +5 -5
  244. package/docs/images/mcp-setup/CC-MCP-1.mp4 +0 -0
  245. package/docs/images/mcp-setup/CC-MCP-2.mp4 +0 -0
  246. package/docs/images/mcp-setup/Cursor-MCP-1.mp4 +0 -0
  247. package/docs/images/mcp-setup/Cursor-MCP-2.mp4 +0 -0
  248. package/docs/images/mcp-setup/Cursor-MCP-3.mp4 +0 -0
  249. package/docs/images/mcp-setup/claude-code-connect.png +0 -0
  250. package/docs/images/mcp-setup/cline-1.png +0 -0
  251. package/docs/images/mcp-setup/cline-2.png +0 -0
  252. package/docs/images/mcp-setup/cline-3.png +0 -0
  253. package/docs/images/mcp-setup/connect-project.png +0 -0
  254. package/docs/images/mcp-setup/copilot-1.png +0 -0
  255. package/docs/images/mcp-setup/copilot-2.png +0 -0
  256. package/docs/images/mcp-setup/copilot-3.png +0 -0
  257. package/docs/images/mcp-setup/mcp-json-1.png +0 -0
  258. package/docs/images/mcp-setup/mcp-json-2.png +0 -0
  259. package/docs/images/mcp-setup/qoder-1.png +0 -0
  260. package/docs/images/mcp-setup/qoder-2.png +0 -0
  261. package/docs/images/mcp-setup/roocode-1.png +0 -0
  262. package/docs/images/mcp-setup/roocode-2.png +0 -0
  263. package/docs/images/mcp-setup/trae-1.png +0 -0
  264. package/docs/images/mcp-setup/trae-2.png +0 -0
  265. package/docs/images/mcp-setup/trae-3.png +0 -0
  266. package/docs/images/mcp-setup/trae-4.png +0 -0
  267. package/docs/images/mcp-setup/trae-5.png +0 -0
  268. package/docs/images/mcp-setup/windsurf-1.png +0 -0
  269. package/docs/images/mcp-setup/windsurf-2.png +0 -0
  270. package/docs/insforge-instructions-sdk.md +93 -88
  271. package/docs/introduction.mdx +46 -45
  272. package/docs/logo/dark.svg +22 -22
  273. package/docs/logo/light.svg +20 -20
  274. package/docs/mcp-setup.mdx +332 -0
  275. package/docs/oauth-server.mdx +563 -0
  276. package/docs/partnership.mdx +720 -646
  277. package/docs/quickstart.mdx +82 -82
  278. package/docs/showcase.mdx +52 -52
  279. package/docs/snippets/sdk-installation.mdx +21 -21
  280. package/docs/snippets/service-icons.mdx +27 -27
  281. package/docs/vscode-extension.mdx +74 -0
  282. package/eslint.config.js +1 -0
  283. package/examples/oauth/frontend-oauth-example.html +250 -250
  284. package/examples/response-examples.md +443 -443
  285. package/frontend/components.json +17 -17
  286. package/frontend/package.json +69 -69
  287. package/frontend/src/App.tsx +8 -3
  288. package/frontend/src/assets/icons/checkbox_checked.svg +6 -6
  289. package/frontend/src/assets/icons/checkbox_undetermined.svg +6 -6
  290. package/frontend/src/assets/icons/checked.svg +3 -3
  291. package/frontend/src/assets/icons/connected.svg +3 -3
  292. package/frontend/src/assets/icons/error.svg +3 -3
  293. package/frontend/src/assets/icons/loader.svg +9 -9
  294. package/frontend/src/assets/icons/pencil.svg +4 -4
  295. package/frontend/src/assets/icons/refresh.svg +4 -4
  296. package/frontend/src/assets/icons/step_active.svg +3 -3
  297. package/frontend/src/assets/icons/step_inactive.svg +11 -11
  298. package/frontend/src/assets/icons/warning.svg +3 -3
  299. package/frontend/src/assets/logos/antigravity.svg +1 -0
  300. package/frontend/src/assets/logos/apple.svg +3 -3
  301. package/frontend/src/assets/logos/claude_code.svg +3 -3
  302. package/frontend/src/assets/logos/cline.svg +6 -6
  303. package/frontend/src/assets/logos/copilot.svg +10 -0
  304. package/frontend/src/assets/logos/cursor.svg +20 -20
  305. package/frontend/src/assets/logos/deepseek.svg +139 -0
  306. package/frontend/src/assets/logos/discord.svg +8 -8
  307. package/frontend/src/assets/logos/facebook.svg +3 -3
  308. package/frontend/src/assets/logos/gemini.svg +19 -19
  309. package/frontend/src/assets/logos/github.svg +5 -5
  310. package/frontend/src/assets/logos/google.svg +13 -13
  311. package/frontend/src/assets/logos/grok.svg +10 -10
  312. package/frontend/src/assets/logos/insforge_dark.svg +15 -15
  313. package/frontend/src/assets/logos/insforge_light.svg +15 -15
  314. package/frontend/src/assets/logos/instagram.svg +1 -1
  315. package/frontend/src/assets/logos/kiro.svg +9 -0
  316. package/frontend/src/assets/logos/linkedin.svg +3 -3
  317. package/frontend/src/assets/logos/openai.svg +10 -10
  318. package/frontend/src/assets/logos/qoder.svg +4 -0
  319. package/frontend/src/assets/logos/qwen.svg +15 -0
  320. package/frontend/src/assets/logos/roo_code.svg +9 -9
  321. package/frontend/src/assets/logos/spotify.svg +16 -16
  322. package/frontend/src/assets/logos/tiktok.svg +5 -5
  323. package/frontend/src/assets/logos/trae.svg +3 -3
  324. package/frontend/src/assets/logos/windsurf.svg +10 -10
  325. package/frontend/src/assets/logos/x.svg +3 -3
  326. package/frontend/src/components/CodeBlock.tsx +2 -2
  327. package/frontend/src/components/ConnectCTA.tsx +3 -2
  328. package/frontend/src/components/datagrid/DataGrid.tsx +90 -62
  329. package/frontend/src/components/datagrid/datagridTypes.tsx +2 -1
  330. package/frontend/src/components/datagrid/index.ts +1 -1
  331. package/frontend/src/components/index.ts +0 -1
  332. package/frontend/src/components/layout/AppHeader.tsx +13 -37
  333. package/frontend/src/components/layout/AppSidebar.tsx +85 -100
  334. package/frontend/src/components/layout/Layout.tsx +34 -32
  335. package/frontend/src/components/layout/PrimaryMenu.tsx +12 -4
  336. package/frontend/src/components/radix/Select.tsx +151 -151
  337. package/frontend/src/features/ai/components/AIConfigCard.tsx +200 -200
  338. package/frontend/src/features/ai/components/AIEmptyState.tsx +23 -23
  339. package/frontend/src/features/ai/components/ModalityFilterSidebar.tsx +102 -101
  340. package/frontend/src/features/ai/components/ModelSelectionDialog.tsx +135 -135
  341. package/frontend/src/features/ai/components/ModelSelectionGrid.tsx +51 -51
  342. package/frontend/src/features/ai/components/SystemPromptDialog.tsx +118 -118
  343. package/frontend/src/features/ai/components/index.ts +6 -6
  344. package/frontend/src/features/ai/helpers.ts +147 -141
  345. package/frontend/src/features/ai/{page → pages}/AIPage.tsx +166 -166
  346. package/frontend/src/features/auth/components/AuthPreview.tsx +96 -96
  347. package/frontend/src/features/auth/components/OAuthConfigDialog.tsx +1 -0
  348. package/frontend/src/features/auth/components/UsersDataGrid.tsx +61 -31
  349. package/frontend/src/features/auth/components/index.ts +5 -5
  350. package/frontend/src/features/auth/helpers.tsx +8 -0
  351. package/frontend/src/features/auth/{page → pages}/AuthMethodsPage.tsx +275 -275
  352. package/frontend/src/features/auth/{page → pages}/UsersPage.tsx +0 -28
  353. package/frontend/src/features/dashboard/{page → pages}/DashboardPage.tsx +1 -1
  354. package/frontend/src/features/database/components/DatabaseDataGrid.tsx +0 -2
  355. package/frontend/src/features/database/components/ForeignKeyCell.tsx +38 -11
  356. package/frontend/src/features/database/components/ForeignKeyPopover.tsx +18 -8
  357. package/frontend/src/features/database/components/LinkRecordModal.tsx +61 -13
  358. package/frontend/src/features/database/components/RecordFormField.tsx +1 -1
  359. package/frontend/src/features/database/components/SQLModal.tsx +75 -0
  360. package/frontend/src/features/database/components/TableForm.tsx +0 -4
  361. package/frontend/src/features/database/components/TableSidebar.tsx +0 -3
  362. package/frontend/src/features/database/components/TablesEmptyState.tsx +1 -1
  363. package/frontend/src/features/database/components/TemplatePreview.tsx +1 -2
  364. package/frontend/src/features/database/constants.ts +16 -28
  365. package/frontend/src/features/database/hooks/useCSVImport.ts +3 -2
  366. package/frontend/src/features/database/hooks/useDatabase.ts +66 -0
  367. package/frontend/src/features/database/hooks/useRawSQL.ts +3 -2
  368. package/frontend/src/features/database/hooks/useTables.ts +30 -28
  369. package/frontend/src/features/database/index.ts +1 -0
  370. package/frontend/src/features/database/{page → pages}/FunctionsPage.tsx +29 -42
  371. package/frontend/src/features/database/{page → pages}/IndexesPage.tsx +34 -51
  372. package/frontend/src/features/database/{page → pages}/PoliciesPage.tsx +42 -58
  373. package/frontend/src/features/database/{page → pages}/SQLEditorPage.tsx +2 -2
  374. package/frontend/src/features/database/{page → pages}/TablesPage.tsx +0 -42
  375. package/frontend/src/features/database/{page → pages}/TriggersPage.tsx +34 -51
  376. package/frontend/src/features/database/services/advance.service.ts +1 -41
  377. package/frontend/src/features/database/services/database.service.ts +55 -0
  378. package/frontend/src/features/database/services/record.service.ts +4 -20
  379. package/frontend/src/features/database/services/table.service.ts +1 -10
  380. package/frontend/src/features/database/templates/ai-chatbot.ts +6 -6
  381. package/frontend/src/features/database/templates/ecommerce-platform.ts +2 -2
  382. package/frontend/src/features/database/templates/instagram-clone.ts +10 -10
  383. package/frontend/src/features/database/templates/notion-clone.ts +8 -8
  384. package/frontend/src/features/database/templates/reddit-clone.ts +10 -10
  385. package/frontend/src/features/deployments/components/DeploymentRow.tsx +93 -0
  386. package/frontend/src/features/deployments/components/DeploymentsEmptyState.tsx +15 -0
  387. package/frontend/src/features/deployments/hooks/useDeployments.ts +157 -0
  388. package/frontend/src/features/deployments/pages/DeploymentsPage.tsx +318 -0
  389. package/frontend/src/features/deployments/services/deployments.service.ts +63 -0
  390. package/frontend/src/features/functions/components/FunctionRow.tsx +72 -72
  391. package/frontend/src/features/functions/components/FunctionsSidebar.tsx +56 -56
  392. package/frontend/src/features/functions/components/SecretRow.tsx +3 -3
  393. package/frontend/src/features/functions/components/index.ts +5 -5
  394. package/frontend/src/features/functions/hooks/useFunctions.ts +5 -4
  395. package/frontend/src/features/functions/hooks/useSecrets.ts +6 -9
  396. package/frontend/src/features/functions/{page → pages}/FunctionsPage.tsx +21 -44
  397. package/frontend/src/features/functions/{page → pages}/SecretsPage.tsx +118 -116
  398. package/frontend/src/features/functions/services/function.service.ts +8 -25
  399. package/frontend/src/features/functions/services/secret.service.ts +23 -41
  400. package/frontend/src/features/login/{page → pages}/CloudLoginPage.tsx +125 -118
  401. package/frontend/src/features/logs/components/LogDetailPanel.tsx +41 -0
  402. package/frontend/src/features/logs/components/LogsDataGrid.tsx +32 -1
  403. package/frontend/src/features/logs/components/index.ts +1 -0
  404. package/frontend/src/features/logs/hooks/useMcpUsage.ts +13 -66
  405. package/frontend/src/features/logs/{page → pages}/LogsPage.tsx +36 -6
  406. package/frontend/src/features/onboard/components/ApiCredentialsSection.tsx +59 -0
  407. package/frontend/src/features/onboard/components/ConnectionStringSection.tsx +180 -0
  408. package/frontend/src/features/onboard/components/McpConnectionSection.tsx +159 -0
  409. package/frontend/src/features/onboard/components/OnboardingController.tsx +68 -0
  410. package/frontend/src/features/onboard/components/OnboardingModal.tsx +121 -267
  411. package/frontend/src/features/onboard/components/ShowPasswordButton.tsx +21 -0
  412. package/frontend/src/features/onboard/components/index.ts +9 -4
  413. package/frontend/src/features/onboard/components/mcp/CursorDeeplinkGenerator.tsx +1 -1
  414. package/frontend/src/features/onboard/components/mcp/QoderDeeplinkGenerator.tsx +36 -0
  415. package/frontend/src/features/onboard/components/mcp/helpers.tsx +123 -98
  416. package/frontend/src/features/onboard/components/mcp/index.ts +4 -3
  417. package/frontend/src/features/onboard/index.ts +17 -13
  418. package/frontend/src/features/realtime/components/ChannelRow.tsx +83 -0
  419. package/frontend/src/features/realtime/components/EditChannelModal.tsx +246 -0
  420. package/frontend/src/features/realtime/components/MessageRow.tsx +85 -0
  421. package/frontend/src/features/realtime/components/RealtimeEmptyState.tsx +30 -0
  422. package/frontend/src/features/realtime/hooks/useRealtime.ts +218 -0
  423. package/frontend/src/features/realtime/index.ts +11 -0
  424. package/frontend/src/features/realtime/pages/RealtimeChannelsPage.tsx +172 -0
  425. package/frontend/src/features/realtime/pages/RealtimeMessagesPage.tsx +211 -0
  426. package/frontend/src/features/realtime/pages/RealtimePermissionsPage.tsx +191 -0
  427. package/frontend/src/features/realtime/services/realtime.service.ts +107 -0
  428. package/frontend/src/features/settings/pages/SettingsPage.tsx +349 -0
  429. package/frontend/src/features/storage/{page → pages}/StoragePage.tsx +1 -29
  430. package/frontend/src/features/visualizer/components/AuthNode.tsx +4 -4
  431. package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +24 -11
  432. package/frontend/src/features/visualizer/{page → pages}/VisualizerPage.tsx +11 -36
  433. package/frontend/src/index.css +249 -249
  434. package/frontend/src/lib/contexts/ModalContext.tsx +35 -0
  435. package/frontend/src/lib/contexts/SocketContext.tsx +119 -75
  436. package/frontend/src/lib/hooks/useMetadata.ts +45 -1
  437. package/frontend/src/lib/hooks/useModal.tsx +2 -0
  438. package/frontend/src/lib/routing/AppRoutes.tsx +103 -84
  439. package/frontend/src/lib/services/metadata.service.ts +20 -3
  440. package/frontend/src/lib/utils/cloudMessaging.ts +1 -1
  441. package/frontend/src/lib/utils/menuItems.ts +223 -183
  442. package/frontend/src/lib/utils/utils.ts +196 -183
  443. package/frontend/tsconfig.json +25 -25
  444. package/frontend/tsconfig.node.json +9 -9
  445. package/functions/deno.json +24 -24
  446. package/functions/server.ts +6 -6
  447. package/functions/worker-template.js +1 -1
  448. package/i18n/README.ar.md +130 -130
  449. package/i18n/README.de.md +130 -130
  450. package/i18n/README.es.md +154 -154
  451. package/i18n/README.fr.md +134 -134
  452. package/i18n/README.hi.md +129 -129
  453. package/i18n/README.ja.md +174 -174
  454. package/i18n/README.ko.md +136 -136
  455. package/i18n/README.pt-BR.md +131 -131
  456. package/i18n/README.ru.md +129 -129
  457. package/i18n/README.zh-CN.md +133 -133
  458. package/openapi/ai.yaml +825 -715
  459. package/openapi/auth.yaml +1324 -1244
  460. package/openapi/email.yaml +158 -0
  461. package/openapi/functions.yaml +475 -475
  462. package/openapi/health.yaml +29 -29
  463. package/openapi/logs.yaml +221 -223
  464. package/openapi/metadata.yaml +175 -177
  465. package/openapi/realtime.yaml +699 -0
  466. package/openapi/records.yaml +381 -381
  467. package/openapi/secrets.yaml +370 -370
  468. package/openapi/storage.yaml +875 -875
  469. package/openapi/tables.yaml +462 -463
  470. package/package.json +97 -97
  471. package/shared-schemas/package.json +31 -31
  472. package/shared-schemas/src/ai-api.schema.ts +251 -143
  473. package/shared-schemas/src/ai.schema.ts +8 -4
  474. package/shared-schemas/src/auth-api.schema.ts +380 -339
  475. package/shared-schemas/src/auth.schema.ts +18 -11
  476. package/shared-schemas/src/cloud-events.schema.ts +26 -0
  477. package/shared-schemas/src/database-api.schema.ts +32 -1
  478. package/shared-schemas/src/database.schema.ts +39 -0
  479. package/shared-schemas/src/deployments-api.schema.ts +55 -0
  480. package/shared-schemas/src/deployments.schema.ts +30 -0
  481. package/shared-schemas/src/docs.schema.ts +32 -0
  482. package/shared-schemas/src/email-api.schema.ts +30 -0
  483. package/shared-schemas/src/functions-api.schema.ts +13 -4
  484. package/shared-schemas/src/functions.schema.ts +1 -1
  485. package/shared-schemas/src/index.ts +22 -14
  486. package/shared-schemas/src/metadata.schema.ts +39 -4
  487. package/shared-schemas/src/realtime-api.schema.ts +111 -0
  488. package/shared-schemas/src/realtime.schema.ts +143 -0
  489. package/shared-schemas/src/secrets-api.schema.ts +44 -0
  490. package/shared-schemas/src/secrets.schema.ts +15 -0
  491. package/shared-schemas/tsconfig.json +21 -21
  492. package/tsconfig.json +7 -7
  493. package/zeabur/README.md +26 -13
  494. package/zeabur/template.yml +1001 -1032
  495. package/.cursor/rules/cursor-rules.mdc +0 -94
  496. package/backend/src/types/profile.ts +0 -55
  497. package/frontend/src/components/ProjectInfoModal.tsx +0 -128
  498. package/frontend/src/features/database/hooks/useFullMetadata.ts +0 -18
  499. package/test-gemini.sh +0 -35
  500. package/test-usage-admin.sh +0 -57
  501. package/test-usage.sh +0 -50
  502. /package/frontend/src/features/auth/{page → pages}/ConfigurationPage.tsx +0 -0
  503. /package/frontend/src/features/database/{page → pages}/TemplatesPage.tsx +0 -0
  504. /package/frontend/src/features/login/{page → pages}/LoginPage.tsx +0 -0
  505. /package/frontend/src/features/logs/{page → pages}/AuditsPage.tsx +0 -0
  506. /package/frontend/src/features/logs/{page → pages}/MCPLogsPage.tsx +0 -0
@@ -1,4 +1,5 @@
1
1
  import { useState, useMemo } from 'react';
2
+ import { useNavigate } from 'react-router-dom';
2
3
  import { Link2, AlertCircle, X } from 'lucide-react';
3
4
  import {
4
5
  Button,
@@ -17,6 +18,9 @@ import { useTables } from '@/features/database/hooks/useTables';
17
18
  import { useRecords } from '@/features/database/hooks/useRecords';
18
19
  import { convertSchemaToColumns } from '@/features/database/components/DatabaseDataGrid';
19
20
  import { formatValueForDisplay } from '@/lib/utils/utils';
21
+ import { useQuery } from '@tanstack/react-query';
22
+ import { useUsers } from '@/features/auth/hooks/useUsers';
23
+ import { AUTH_USERS_TABLE, authUsersSchema } from '../constants';
20
24
 
21
25
  interface ForeignKeyCellProps {
22
26
  value: string;
@@ -29,9 +33,16 @@ interface ForeignKeyCellProps {
29
33
 
30
34
  export function ForeignKeyCell({ value, foreignKey, onJumpToTable }: ForeignKeyCellProps) {
31
35
  const [open, setOpen] = useState(false);
36
+ const navigate = useNavigate();
32
37
  const { useTableSchema } = useTables();
38
+ const isAuthUsers = foreignKey.table === AUTH_USERS_TABLE;
39
+
40
+ // Regular table records hook (disabled for auth.users)
33
41
  const recordsHook = useRecords(foreignKey.table);
34
42
 
43
+ // Auth users hook
44
+ const { getUser } = useUsers({ enabled: false });
45
+
35
46
  // Helper function to safely render any value type (including JSON objects)
36
47
  const renderValue = (val: ConvertedValue): string => {
37
48
  return formatValueForDisplay(val);
@@ -39,16 +50,28 @@ export function ForeignKeyCell({ value, foreignKey, onJumpToTable }: ForeignKeyC
39
50
 
40
51
  // Fetch the referenced record when popover opens
41
52
  const searchValue = value ? renderValue(value) : '';
42
- const {
43
- data: recordData,
44
- isLoading: _isLoading,
45
- error,
46
- } = recordsHook.useRecordByForeignKey(foreignKey.column, searchValue, open && !!value);
47
53
 
48
- const record = recordData;
54
+ // For auth.users, fetch user by ID
55
+ const { data: authUserData, error: authUserError } = useQuery({
56
+ queryKey: ['user', searchValue],
57
+ queryFn: () => getUser(searchValue),
58
+ enabled: isAuthUsers && open && !!value,
59
+ });
60
+
61
+ // For regular tables, fetch by foreign key
62
+ const { data: recordData, error: recordError } = recordsHook.useRecordByForeignKey(
63
+ foreignKey.column,
64
+ searchValue,
65
+ !isAuthUsers && open && !!value
66
+ );
67
+
68
+ // Use appropriate data source based on table type
69
+ const record = isAuthUsers ? authUserData : recordData;
70
+ const error = isAuthUsers ? authUserError : recordError;
49
71
 
50
- // Fetch schema for the referenced table
51
- const { data: schema } = useTableSchema(foreignKey.table, open && !!value);
72
+ // Fetch schema for the referenced table (skip for auth.users)
73
+ const { data: fetchedSchema } = useTableSchema(foreignKey.table, !isAuthUsers && open && !!value);
74
+ const schema = isAuthUsers ? authUsersSchema : fetchedSchema;
52
75
 
53
76
  // Convert schema to columns for the mini DataGrid
54
77
  const columns = useMemo(() => {
@@ -142,18 +165,22 @@ export function ForeignKeyCell({ value, foreignKey, onJumpToTable }: ForeignKeyC
142
165
  </div>
143
166
 
144
167
  {/* Jump to Table Button */}
145
- {onJumpToTable && (
168
+ {(onJumpToTable || isAuthUsers) && (
146
169
  <div className="flex justify-end p-6 border-t border-border-gray dark:border-neutral-700">
147
170
  <Button
148
171
  variant="outline"
149
172
  size="sm"
150
173
  className="h-9 px-3 py-2 text-sm font-medium dark:text-white bg-bg-gray dark:bg-neutral-600"
151
174
  onClick={() => {
152
- onJumpToTable(foreignKey.table);
175
+ if (isAuthUsers) {
176
+ void navigate('/dashboard/users');
177
+ } else if (onJumpToTable) {
178
+ onJumpToTable(foreignKey.table);
179
+ }
153
180
  setOpen(false);
154
181
  }}
155
182
  >
156
- Open Table
183
+ {isAuthUsers ? 'Open Users' : 'Open Table'}
157
184
  </Button>
158
185
  </div>
159
186
  )}
@@ -16,6 +16,7 @@ import { UseFormReturn } from 'react-hook-form';
16
16
  import { TableFormSchema, TableFormForeignKeySchema } from '../schema';
17
17
  import { ColumnSchema, OnDeleteActionSchema, OnUpdateActionSchema } from '@insforge/shared-schemas';
18
18
  import { cn } from '@/lib/utils/utils';
19
+ import { AUTH_USERS_TABLE } from '../constants';
19
20
 
20
21
  interface ForeignKeyPopoverProps {
21
22
  form: UseFormReturn<TableFormSchema>;
@@ -69,17 +70,26 @@ export function ForeignKeyPopover({
69
70
  }
70
71
  }, [open, initialValue]);
71
72
 
72
- // Get available tables
73
- const availableTables = tables.filter(
74
- (tableName) => mode === 'create' || tableName !== editTableName
75
- );
73
+ // Get available tables (include auth.users as a special option)
74
+ const availableTables = [
75
+ AUTH_USERS_TABLE,
76
+ ...tables.filter((tableName) => mode === 'create' || tableName !== editTableName),
77
+ ];
76
78
 
77
- // Get columns for selected reference table
78
- const { data: referenceTableSchema } = useTableSchema(
79
+ // Get columns for selected reference table (skip fetch for auth.users)
80
+ const isAuthUsers = newForeignKey.referenceTable === AUTH_USERS_TABLE;
81
+ const { data: fetchedTableSchema } = useTableSchema(
79
82
  newForeignKey.referenceTable || '',
80
- !!newForeignKey.referenceTable && open
83
+ !!newForeignKey.referenceTable && !isAuthUsers && open
81
84
  );
82
85
 
86
+ // Use hardcoded schema for auth.users, otherwise use fetched schema
87
+ const referenceTableSchema = isAuthUsers
88
+ ? {
89
+ columns: [{ columnName: 'id', type: 'uuid', isUnique: true, isNullable: false }],
90
+ }
91
+ : fetchedTableSchema;
92
+
83
93
  // Get the type of the selected source column
84
94
  const getSourceFieldType = useMemo(() => {
85
95
  if (!newForeignKey.columnName) {
@@ -252,7 +262,7 @@ export function ForeignKeyPopover({
252
262
  if (!col.isUnique) {
253
263
  rightText = 'Not unique';
254
264
  } else if (!typesMatch) {
255
- rightText = 'Columntype not match';
265
+ rightText = 'Column types mismatch';
256
266
  }
257
267
 
258
268
  return (
@@ -20,9 +20,11 @@ import {
20
20
  } from '@/components';
21
21
  import { useTables } from '@/features/database/hooks/useTables';
22
22
  import { useRecords } from '@/features/database/hooks/useRecords';
23
+ import { useUsers } from '@/features/auth/hooks/useUsers';
23
24
  import { convertSchemaToColumns } from '@/features/database/components/DatabaseDataGrid';
24
25
  import { formatValueForDisplay } from '@/lib/utils/utils';
25
26
  import { ColumnType } from '@insforge/shared-schemas';
27
+ import { AUTH_USERS_TABLE, authUsersSchema } from '../constants';
26
28
 
27
29
  const PAGE_SIZE = 50;
28
30
 
@@ -45,29 +47,67 @@ export function LinkRecordModal({
45
47
  const [sortColumns, setSortColumns] = useState<SortColumn[]>([]);
46
48
  const [currentPage, setCurrentPage] = useState(1);
47
49
  const { useTableSchema } = useTables();
48
- const recordsHook = useRecords(referenceTable);
50
+ const isAuthUsers = referenceTable === AUTH_USERS_TABLE;
49
51
 
50
- // Fetch table schema
51
- const { data: schema } = useTableSchema(referenceTable, open);
52
+ // Regular table records hook (disabled for auth.users)
53
+ const recordsHook = useRecords(isAuthUsers ? '' : referenceTable);
52
54
 
53
- // Fetch records from the reference table
55
+ // Auth users hook
56
+ const {
57
+ users,
58
+ totalUsers,
59
+ isLoading: isLoadingUsers,
60
+ setCurrentPage: setUsersCurrentPage,
61
+ } = useUsers({
62
+ pageSize: PAGE_SIZE,
63
+ enabled: isAuthUsers && open,
64
+ searchQuery: isAuthUsers ? searchQuery : '',
65
+ });
66
+
67
+ // Sync current page with users hook
68
+ useEffect(() => {
69
+ if (isAuthUsers) {
70
+ setUsersCurrentPage(currentPage);
71
+ }
72
+ }, [currentPage, isAuthUsers, setUsersCurrentPage]);
73
+
74
+ // Fetch table schema (skip for auth.users)
75
+ const { data: fetchedSchema } = useTableSchema(referenceTable, !isAuthUsers && open);
76
+ const schema = isAuthUsers ? authUsersSchema : fetchedSchema;
77
+
78
+ // Fetch records from the reference table (skip for auth.users)
54
79
  const offset = (currentPage - 1) * PAGE_SIZE;
55
- const { data: recordsResponse, isLoading } = recordsHook.useTableRecords(
80
+ const { data: recordsResponse, isLoading: isLoadingRecords } = recordsHook.useTableRecords(
56
81
  PAGE_SIZE,
57
82
  offset,
58
83
  searchQuery || undefined,
59
84
  sortColumns,
60
- open
85
+ !isAuthUsers && open
61
86
  );
62
87
 
63
- const recordsData =
64
- schema && recordsResponse
88
+ // Combine data from either source
89
+ const recordsData = useMemo(() => {
90
+ if (isAuthUsers) {
91
+ return users.length > 0 || open
92
+ ? {
93
+ schema: authUsersSchema,
94
+ records: users as DatabaseRecord[],
95
+ totalRecords: totalUsers,
96
+ }
97
+ : undefined;
98
+ }
99
+ return schema && recordsResponse
65
100
  ? {
66
101
  schema,
67
102
  records: recordsResponse.records,
68
- totalRecords: recordsResponse.pagination.total || schema.recordCount,
103
+ totalRecords:
104
+ recordsResponse.pagination.total ??
105
+ ('recordCount' in schema ? (schema.recordCount as number) : 0),
69
106
  }
70
107
  : undefined;
108
+ }, [isAuthUsers, users, totalUsers, open, schema, recordsResponse]);
109
+
110
+ const isLoading = isAuthUsers ? isLoadingUsers : isLoadingRecords;
71
111
 
72
112
  // Reset page when search query changes
73
113
  useEffect(() => {
@@ -122,15 +162,23 @@ export function LinkRecordModal({
122
162
  };
123
163
 
124
164
  // Helper function to render cell value properly based on type
125
- const renderCellValue = (value: ConvertedValue, type: ColumnType | undefined) => {
126
- return formatValueForDisplay(value, type);
165
+ // Accepts DatabaseRecord value type and converts to display string
166
+ const renderCellValue = (
167
+ value: ConvertedValue | { [key: string]: string }[],
168
+ type: ColumnType | undefined
169
+ ): string => {
170
+ // For JSON type, if value is already an object/array, stringify it for formatValueForDisplay
171
+ if (type === ColumnType.JSON && value !== null && typeof value === 'object') {
172
+ return formatValueForDisplay(JSON.stringify(value), type);
173
+ }
174
+ return formatValueForDisplay(value as ConvertedValue, type);
127
175
  };
128
176
 
129
177
  if (col.key === referenceColumn) {
130
178
  return {
131
179
  ...baseCol,
132
180
  renderCell: (props: RenderCellProps<DataGridRowType>) => {
133
- const displayValue = renderCellValue(String(props.row[col.key]), col.type);
181
+ const displayValue = renderCellValue(props.row[col.key], col.type);
134
182
  return (
135
183
  <div className="w-full h-full flex items-center cursor-pointer">
136
184
  <span className="truncate font-medium" title={displayValue}>
@@ -155,7 +203,7 @@ export function LinkRecordModal({
155
203
  ...baseCol,
156
204
  cellClass: 'link-modal-disabled-cell',
157
205
  renderCell: (props: RenderCellProps<DataGridRowType>) => {
158
- const displayValue = renderCellValue(String(props.row[col.key]), col.type);
206
+ const displayValue = renderCellValue(props.row[col.key], col.type);
159
207
  return (
160
208
  <div className="w-full h-full flex items-center cursor-not-allowed relative">
161
209
  <div className="absolute inset-0 pointer-events-none opacity-0 hover:opacity-10 bg-gray-200 dark:bg-gray-600 transition-opacity z-5" />
@@ -495,7 +495,7 @@ export function RecordFormField({ field, form, tableName }: RecordFormFieldProps
495
495
  onChange={(newValue) => {
496
496
  const result = convertValueForColumn(ColumnType.JSON, newValue as string);
497
497
  if (result.success) {
498
- formField.onChange(result.value as JSON);
498
+ formField.onChange(result.value);
499
499
  } else {
500
500
  // If parsing fails, keep the string value
501
501
  formField.onChange(newValue);
@@ -0,0 +1,75 @@
1
+ import { ExternalLink } from 'lucide-react';
2
+ import CodeMirror from '@uiw/react-codemirror';
3
+ import { sql } from '@codemirror/lang-sql';
4
+ import { EditorView } from '@codemirror/view';
5
+ import { vscodeDark, vscodeLight } from '@uiw/codemirror-theme-vscode';
6
+ import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components';
7
+ import { useTheme } from '@/lib/contexts/ThemeContext';
8
+
9
+ const customTheme = EditorView.theme({
10
+ '&': { backgroundColor: 'transparent', maxHeight: '400px' },
11
+ '.cm-scroller': { overflow: 'auto' },
12
+ '.cm-gutters': { display: 'none' },
13
+ '.cm-content': { padding: '16px' },
14
+ '.cm-line': { padding: '0' },
15
+ '&.cm-focused': { outline: 'none' },
16
+ '.cm-selectionBackground': { backgroundColor: 'transparent !important' },
17
+ '&.cm-focused .cm-selectionBackground': { backgroundColor: 'transparent !important' },
18
+ '.cm-cursor': { display: 'none' },
19
+ });
20
+
21
+ interface SQLModalProps {
22
+ open: boolean;
23
+ onOpenChange: (open: boolean) => void;
24
+ title: string;
25
+ value: string;
26
+ }
27
+
28
+ export function SQLModal({ open, onOpenChange, title, value }: SQLModalProps) {
29
+ const { resolvedTheme } = useTheme();
30
+
31
+ return (
32
+ <Dialog open={open} onOpenChange={onOpenChange}>
33
+ <DialogContent className="max-w-2xl">
34
+ <DialogHeader>
35
+ <DialogTitle className="text-zinc-950 dark:text-white">{title}</DialogTitle>
36
+ </DialogHeader>
37
+ <div className="mt-2 rounded-lg overflow-hidden bg-neutral-100 dark:bg-neutral-900">
38
+ <CodeMirror
39
+ value={value}
40
+ theme={[resolvedTheme === 'dark' ? vscodeDark : vscodeLight, customTheme]}
41
+ extensions={[sql(), EditorView.lineWrapping, EditorView.editable.of(false)]}
42
+ editable={false}
43
+ basicSetup={false}
44
+ />
45
+ </div>
46
+ </DialogContent>
47
+ </Dialog>
48
+ );
49
+ }
50
+
51
+ interface SQLCellButtonProps {
52
+ value: string | null;
53
+ onClick: () => void;
54
+ }
55
+
56
+ export function SQLCellButton({ value, onClick }: SQLCellButtonProps) {
57
+ if (!value) {
58
+ return <span className="text-sm">-</span>;
59
+ }
60
+
61
+ return (
62
+ <div className="flex items-center justify-between gap-1 min-w-0">
63
+ <span className="text-sm truncate">{value}</span>
64
+ <button
65
+ onClick={(e) => {
66
+ e.stopPropagation();
67
+ onClick();
68
+ }}
69
+ className="shrink-0 p-1 hover:bg-neutral-200 dark:hover:bg-neutral-700 rounded transition-colors"
70
+ >
71
+ <ExternalLink className="size-4 text-zinc-400 dark:text-neutral-400" />
72
+ </button>
73
+ </div>
74
+ );
75
+ }
@@ -360,9 +360,6 @@ export function TableForm({
360
360
  // Invalidate all table data queries for this table (with all parameter combinations)
361
361
  void queryClient.invalidateQueries({ queryKey: ['table', editTable?.tableName] });
362
362
 
363
- // Invalidate the separate table schema query used by AddRecordSheet
364
- void queryClient.invalidateQueries({ queryKey: ['table-schema', editTable?.tableName] });
365
-
366
363
  showToast(`Table "${data.tableName}" updated successfully!`, 'success');
367
364
 
368
365
  form.reset();
@@ -373,7 +370,6 @@ export function TableForm({
373
370
  onError: (err) => {
374
371
  // Invalidate queries to ensure we have fresh data after failed request
375
372
  void queryClient.invalidateQueries({ queryKey: ['table', editTable?.tableName] });
376
- void queryClient.invalidateQueries({ queryKey: ['table-schema', editTable?.tableName] });
377
373
 
378
374
  const errorMessage = err.message || 'Failed to update table';
379
375
  setError(errorMessage);
@@ -37,9 +37,6 @@ export function TableSidebar({
37
37
  editLabel="Edit Table"
38
38
  deleteLabel="Delete Table"
39
39
  icon={Table}
40
- filterItems={(tableNames) =>
41
- tableNames.filter((name) => name !== 'auth' && name !== 'profiles' && name !== 'identifies')
42
- }
43
40
  renderSkeleton={() => <TableListSkeleton />}
44
41
  renderEmptyState={(searchTerm) => <TableEmptyState searchTerm={searchTerm} />}
45
42
  />
@@ -15,7 +15,7 @@ export function TablesEmptyState({
15
15
  onTemplateClick,
16
16
  }: TablesEmptyStateProps) {
17
17
  return (
18
- <div className="flex justify-center w-full h-full bg-bg-gray dark:bg-neutral-800 px-6">
18
+ <div className="flex justify-center w-full h-full bg-bg-gray dark:bg-neutral-800 px-6 overflow-y-auto">
19
19
  <div className="flex flex-col gap-6 max-w-[1024px] w-full pb-9 pt-6">
20
20
  <h2 className="text-xl font-semibold text-zinc-950 dark:text-white leading-7 tracking-[-0.1px]">
21
21
  Create Your First Table
@@ -70,7 +70,7 @@ export function TemplatePreview({ template, onCancel }: TemplatePreviewProps) {
70
70
  externalSchemas={template.visualizerSchema}
71
71
  metadata={{
72
72
  auth: {
73
- oauths: [],
73
+ providers: [],
74
74
  },
75
75
  database: {
76
76
  tables: [],
@@ -80,7 +80,6 @@ export function TemplatePreview({ template, onCancel }: TemplatePreviewProps) {
80
80
  buckets: [],
81
81
  totalSizeInGB: 0,
82
82
  },
83
- functions: [],
84
83
  }}
85
84
  showControls={false}
86
85
  showMiniMap={false}
@@ -1,6 +1,22 @@
1
1
  import { Type, Clock, Calendar, Hash, Percent, ToggleLeft, Fingerprint, Code } from 'lucide-react';
2
2
  import { ColumnType } from '@insforge/shared-schemas';
3
3
 
4
+ // Special handling for auth.users foreign key references
5
+ export const AUTH_USERS_TABLE = 'auth.users';
6
+
7
+ // schema for auth.users - used for displaying user records
8
+ export const authUsersSchema = {
9
+ tableName: 'auth.users',
10
+ columns: [
11
+ { columnName: 'id', type: 'uuid', isUnique: true, isNullable: false },
12
+ { columnName: 'email', type: 'string', isUnique: true, isNullable: false },
13
+ { columnName: 'emailVerified', type: 'boolean', isUnique: false, isNullable: false },
14
+ { columnName: 'providers', type: 'json', isUnique: false, isNullable: true },
15
+ { columnName: 'createdAt', type: 'timestamp', isUnique: false, isNullable: false },
16
+ { columnName: 'updatedAt', type: 'timestamp', isUnique: false, isNullable: false },
17
+ ],
18
+ };
19
+
4
20
  export const columnTypeIcons: Record<ColumnType, React.ComponentType<{ className?: string }>> = {
5
21
  [ColumnType.STRING]: Type,
6
22
  [ColumnType.DATE]: Calendar,
@@ -22,31 +38,3 @@ export const columnTypeDescriptions: Record<ColumnType, string> = {
22
38
  [ColumnType.UUID]: 'Unique identifiers (auto-generated)',
23
39
  [ColumnType.JSON]: 'Complex structured data',
24
40
  };
25
-
26
- /**
27
- * System tables that should be filtered out from user-facing database views
28
- */
29
- export const SYSTEM_TABLES = ['users'];
30
- export const SYSTEM_FUNCTIONS = [
31
- 'create_default_policies',
32
- 'create_policies_after_rls',
33
- 'email',
34
- 'reload_postgrest_schema',
35
- 'role',
36
- 'uid',
37
- 'update_updated_at_column',
38
- ];
39
-
40
- /**
41
- * Check if a table name is a system table
42
- */
43
- export function isSystemTable(tableName: string): boolean {
44
- return tableName.startsWith('_') || SYSTEM_TABLES.includes(tableName);
45
- }
46
-
47
- /**
48
- * Check if a function name is a system function
49
- */
50
- export function isSystemFunction(functionName: string): boolean {
51
- return SYSTEM_FUNCTIONS.includes(functionName);
52
- }
@@ -1,8 +1,9 @@
1
1
  import { useMutation } from '@tanstack/react-query';
2
- import { recordService, CSVImportResponse } from '../services/record.service.js';
2
+ import { recordService } from '../services/record.service.js';
3
+ import { BulkUpsertResponse } from '@insforge/shared-schemas';
3
4
 
4
5
  interface UseCSVImportOptions {
5
- onSuccess?: (data: CSVImportResponse) => void;
6
+ onSuccess?: (data: BulkUpsertResponse) => void;
6
7
  onError?: (error: Error) => void;
7
8
  }
8
9
 
@@ -0,0 +1,66 @@
1
+ import { useQuery } from '@tanstack/react-query';
2
+ import { databaseService } from '../services/database.service';
3
+
4
+ export function useFunctions(enabled = false) {
5
+ const { data, isLoading, error, refetch } = useQuery({
6
+ queryKey: ['database', 'functions'],
7
+ queryFn: () => databaseService.getFunctions(),
8
+ staleTime: 5 * 60 * 1000, // Cache for 5 minutes
9
+ enabled,
10
+ });
11
+
12
+ return {
13
+ data,
14
+ isLoading,
15
+ error,
16
+ refetch,
17
+ };
18
+ }
19
+
20
+ export function useIndexes(enabled = false) {
21
+ const { data, isLoading, error, refetch } = useQuery({
22
+ queryKey: ['database', 'indexes'],
23
+ queryFn: () => databaseService.getIndexes(),
24
+ staleTime: 5 * 60 * 1000, // Cache for 5 minutes
25
+ enabled,
26
+ });
27
+
28
+ return {
29
+ data,
30
+ isLoading,
31
+ error,
32
+ refetch,
33
+ };
34
+ }
35
+
36
+ export function usePolicies(enabled = false) {
37
+ const { data, isLoading, error, refetch } = useQuery({
38
+ queryKey: ['database', 'policies'],
39
+ queryFn: () => databaseService.getPolicies(),
40
+ staleTime: 5 * 60 * 1000, // Cache for 5 minutes
41
+ enabled,
42
+ });
43
+
44
+ return {
45
+ data,
46
+ isLoading,
47
+ error,
48
+ refetch,
49
+ };
50
+ }
51
+
52
+ export function useTriggers(enabled = false) {
53
+ const { data, isLoading, error, refetch } = useQuery({
54
+ queryKey: ['database', 'triggers'],
55
+ queryFn: () => databaseService.getTriggers(),
56
+ staleTime: 5 * 60 * 1000, // Cache for 5 minutes
57
+ enabled,
58
+ });
59
+
60
+ return {
61
+ data,
62
+ isLoading,
63
+ error,
64
+ refetch,
65
+ };
66
+ }
@@ -1,5 +1,6 @@
1
1
  import { useMutation, useQueryClient } from '@tanstack/react-query';
2
- import { advanceService, RawSQLResponse } from '../services/advance.service';
2
+ import { advanceService } from '../services/advance.service';
3
+ import { RawSQLResponse } from '@insforge/shared-schemas';
3
4
  import { useToast } from '@/lib/hooks/useToast';
4
5
 
5
6
  interface UseRawSQLOptions {
@@ -28,7 +29,7 @@ export function useRawSQL(options?: UseRawSQLOptions) {
28
29
  void queryClient.invalidateQueries({ queryKey: ['tables', 'schemas'] });
29
30
 
30
31
  if (options?.showSuccessToast !== false) {
31
- const message = data.message || 'SQL query executed successfully';
32
+ const message = 'SQL query executed successfully';
32
33
  showToast(message, 'success');
33
34
  }
34
35
  options?.onSuccess?.(data);