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
@@ -0,0 +1,19 @@
1
+ import { Router, Response, NextFunction } from 'express';
2
+ import { verifyAdmin, AuthRequest } from '@/api/middlewares/auth.js';
3
+ import { RealtimeChannelService } from '@/services/realtime/realtime-channel.service.js';
4
+ import { successResponse } from '@/utils/response.js';
5
+
6
+ const router = Router();
7
+ const channelService = RealtimeChannelService.getInstance();
8
+
9
+ // Get realtime RLS permissions (subscribe on channels, publish on messages)
10
+ router.get('/', verifyAdmin, async (_req: AuthRequest, res: Response, next: NextFunction) => {
11
+ try {
12
+ const permissions = await channelService.getPermissions();
13
+ successResponse(res, permissions);
14
+ } catch (error) {
15
+ next(error);
16
+ }
17
+ });
18
+
19
+ export { router as permissionsRouter };
@@ -79,9 +79,12 @@ router.post(
79
79
  });
80
80
 
81
81
  const socket = SocketManager.getInstance();
82
- socket.broadcastToRoom('role:project_admin', ServerEvents.DATA_UPDATE, {
83
- resource: DataUpdateResourceType.BUCKETS,
84
- });
82
+ socket.broadcastToRoom(
83
+ 'role:project_admin',
84
+ ServerEvents.DATA_UPDATE,
85
+ { resource: DataUpdateResourceType.BUCKETS },
86
+ 'system'
87
+ );
85
88
 
86
89
  const accessInfo = isPublic
87
90
  ? 'This is a PUBLIC bucket - objects can be accessed without authentication.'
@@ -150,12 +153,12 @@ router.patch(
150
153
  });
151
154
 
152
155
  const socket = SocketManager.getInstance();
153
- socket.broadcastToRoom('role:project_admin', ServerEvents.DATA_UPDATE, {
154
- resource: DataUpdateResourceType.BUCKETS,
155
- data: {
156
- bucketName,
157
- },
158
- });
156
+ socket.broadcastToRoom(
157
+ 'role:project_admin',
158
+ ServerEvents.DATA_UPDATE,
159
+ { resource: DataUpdateResourceType.BUCKETS, data: { bucketName } },
160
+ 'system'
161
+ );
159
162
 
160
163
  const accessInfo = isPublic
161
164
  ? 'Bucket is now PUBLIC - objects can be accessed without authentication.'
@@ -379,9 +382,12 @@ router.delete(
379
382
  });
380
383
 
381
384
  const socket = SocketManager.getInstance();
382
- socket.broadcastToRoom('role:project_admin', ServerEvents.DATA_UPDATE, {
383
- resource: DataUpdateResourceType.BUCKETS,
384
- });
385
+ socket.broadcastToRoom(
386
+ 'role:project_admin',
387
+ ServerEvents.DATA_UPDATE,
388
+ { resource: DataUpdateResourceType.BUCKETS },
389
+ 'system'
390
+ );
385
391
 
386
392
  successResponse(
387
393
  res,
@@ -33,10 +33,12 @@ usageRouter.post(
33
33
  // Broadcast MCP tool usage to frontend via socket
34
34
  const socketService = SocketManager.getInstance();
35
35
 
36
- socketService.broadcastToRoom('role:project_admin', ServerEvents.MCP_CONNECTED, {
37
- tool_name,
38
- created_at: result.created_at,
39
- });
36
+ socketService.broadcastToRoom(
37
+ 'role:project_admin',
38
+ ServerEvents.MCP_CONNECTED,
39
+ { tool_name, created_at: result.created_at },
40
+ 'system'
41
+ );
40
42
 
41
43
  successResponse(res, { success: true });
42
44
  } catch (error) {
@@ -0,0 +1,109 @@
1
+ import crypto from 'crypto';
2
+ import { Router, Request, Response, NextFunction } from 'express';
3
+ import { DeploymentService } from '@/services/deployments/deployment.service.js';
4
+ import { SecretService } from '@/services/secrets/secret.service.js';
5
+ import { AppError } from '@/api/middlewares/error.js';
6
+ import { ERROR_CODES } from '@/types/error-constants.js';
7
+ import {
8
+ VERCEL_EVENT_TO_STATUS,
9
+ type VercelWebhookPayload,
10
+ type VercelDeploymentEventType,
11
+ } from '@/types/webhooks.js';
12
+ import logger from '@/utils/logger.js';
13
+
14
+ const router = Router();
15
+ const deploymentService = DeploymentService.getInstance();
16
+ const secretService = SecretService.getInstance();
17
+
18
+ /**
19
+ * Vercel webhook endpoint
20
+ * POST /api/webhooks/vercel
21
+ *
22
+ * Receives deployment events from Vercel and updates the database accordingly.
23
+ * Verifies the request using HMAC-SHA1 signature in x-vercel-signature header.
24
+ */
25
+ router.post('/vercel', async (req: Request, res: Response, next: NextFunction) => {
26
+ try {
27
+ const signature = req.headers['x-vercel-signature'] as string | undefined;
28
+
29
+ if (!signature) {
30
+ throw new AppError('Missing x-vercel-signature header', 401, ERROR_CODES.AUTH_UNAUTHORIZED);
31
+ }
32
+
33
+ // Get the webhook secret from secrets service
34
+ const webhookSecret = await secretService.getSecretByKey('VERCEL_WEBHOOK_SECRET');
35
+
36
+ if (!webhookSecret) {
37
+ logger.error('VERCEL_WEBHOOK_SECRET not found in secrets');
38
+ throw new AppError('Webhook not configured', 500, ERROR_CODES.INTERNAL_ERROR);
39
+ }
40
+
41
+ // req.body is raw Buffer (express.raw middleware applied in server.ts)
42
+ const rawBody = req.body as Buffer;
43
+
44
+ // Verify the signature using HMAC-SHA1 on original bytes
45
+ const expectedSignature = crypto
46
+ .createHmac('sha1', webhookSecret)
47
+ .update(rawBody)
48
+ .digest('hex');
49
+
50
+ // Use timing-safe comparison to prevent timing attacks
51
+ const signatureBuffer = Buffer.from(signature);
52
+ const expectedBuffer = Buffer.from(expectedSignature);
53
+
54
+ if (
55
+ signatureBuffer.length !== expectedBuffer.length ||
56
+ !crypto.timingSafeEqual(signatureBuffer, expectedBuffer)
57
+ ) {
58
+ logger.warn('Invalid Vercel webhook signature');
59
+ throw new AppError('Invalid signature', 401, ERROR_CODES.AUTH_UNAUTHORIZED);
60
+ }
61
+
62
+ // Parse the webhook payload after signature verification
63
+ const webhookPayload = JSON.parse(rawBody.toString()) as VercelWebhookPayload;
64
+ const eventType = webhookPayload.type;
65
+
66
+ // Check if this is a deployment event we handle
67
+ if (!(eventType in VERCEL_EVENT_TO_STATUS)) {
68
+ logger.info('Ignoring unhandled Vercel webhook event', { eventType });
69
+ return res.status(200).json({ received: true, handled: false });
70
+ }
71
+
72
+ const status = VERCEL_EVENT_TO_STATUS[eventType as VercelDeploymentEventType];
73
+ const deploymentId = webhookPayload.payload.deployment.id;
74
+ const url = webhookPayload.payload.deployment.url
75
+ ? `https://${webhookPayload.payload.deployment.url}`
76
+ : null;
77
+
78
+ // Update the deployment in our database
79
+ const deployment = await deploymentService.updateDeploymentFromWebhook(
80
+ deploymentId,
81
+ status,
82
+ url,
83
+ {
84
+ webhookEventId: webhookPayload.id,
85
+ webhookEventType: eventType,
86
+ target: webhookPayload.payload.target,
87
+ projectId: webhookPayload.payload.project?.id,
88
+ }
89
+ );
90
+
91
+ if (!deployment) {
92
+ // Deployment not found in our database - this is ok, might be from another source
93
+ logger.info('Deployment not found for webhook, ignoring', { deploymentId });
94
+ return res.status(200).json({ received: true, handled: false });
95
+ }
96
+
97
+ logger.info('Vercel webhook processed successfully', {
98
+ eventType,
99
+ deploymentId,
100
+ status,
101
+ });
102
+
103
+ res.status(200).json({ received: true, handled: true });
104
+ } catch (error) {
105
+ next(error);
106
+ }
107
+ });
108
+
109
+ export { router as webhooksRouter };
@@ -1,4 +1,4 @@
1
- import { Pool } from 'pg';
1
+ import { Pool, Client } from 'pg';
2
2
  import path from 'path';
3
3
  import fs from 'fs/promises';
4
4
  import { fileURLToPath } from 'url';
@@ -37,14 +37,6 @@ export class DatabaseManager {
37
37
  idleTimeoutMillis: 30000,
38
38
  connectionTimeoutMillis: 2000,
39
39
  });
40
-
41
- const client = await this.pool.connect();
42
- await client.query('BEGIN');
43
-
44
- // Note: Schema migrations are now handled by node-pg-migrate
45
- // Run: npm run migrate:up
46
-
47
- await client.query('COMMIT');
48
40
  }
49
41
 
50
42
  static async getColumnTypeMap(tableName: string): Promise<Record<string, string>> {
@@ -74,7 +66,6 @@ export class DatabaseManager {
74
66
  FROM information_schema.tables
75
67
  WHERE table_schema = 'public'
76
68
  AND table_type = 'BASE TABLE'
77
- AND (table_name NOT LIKE '\\_%')
78
69
  ORDER BY table_name
79
70
  `
80
71
  );
@@ -100,7 +91,6 @@ export class DatabaseManager {
100
91
  FROM information_schema.tables
101
92
  WHERE table_schema = 'public'
102
93
  AND table_type = 'BASE TABLE'
103
- AND (table_name NOT LIKE '\\_%')
104
94
  ORDER BY table_name
105
95
  `
106
96
  );
@@ -163,6 +153,19 @@ export class DatabaseManager {
163
153
  return this.pool;
164
154
  }
165
155
 
156
+ /**
157
+ * Create a dedicated client for operations that can't use pooled connections (e.g., LISTEN/NOTIFY)
158
+ */
159
+ createClient(): Client {
160
+ return new Client({
161
+ host: process.env.POSTGRES_HOST || 'localhost',
162
+ port: parseInt(process.env.POSTGRES_PORT || '5432'),
163
+ database: process.env.POSTGRES_DB || 'insforge',
164
+ user: process.env.POSTGRES_USER || 'postgres',
165
+ password: process.env.POSTGRES_PASSWORD || 'postgres',
166
+ });
167
+ }
168
+
166
169
  async close(): Promise<void> {
167
170
  await this.pool.end();
168
171
  }
@@ -1,142 +1,142 @@
1
- -- Migration: 000 - Create base system tables
2
- -- This migration creates all the initial tables that the application needs
3
-
4
- -- System configuration
5
- CREATE TABLE IF NOT EXISTS _config (
6
- key TEXT PRIMARY KEY,
7
- value TEXT NOT NULL,
8
- created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
9
- updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP
10
- );
11
-
12
- -- App metadata
13
- CREATE TABLE IF NOT EXISTS _metadata (
14
- key TEXT PRIMARY KEY,
15
- value TEXT,
16
- created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
17
- updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP
18
- );
19
-
20
- -- Storage buckets table to track bucket-level settings
21
- CREATE TABLE IF NOT EXISTS _storage_buckets (
22
- name TEXT PRIMARY KEY,
23
- public BOOLEAN DEFAULT TRUE,
24
- created_at TIMESTAMPTZ DEFAULT NOW(),
25
- updated_at TIMESTAMPTZ DEFAULT NOW()
26
- );
27
-
28
- -- Storage files table
29
- CREATE TABLE IF NOT EXISTS _storage (
30
- bucket TEXT NOT NULL,
31
- key TEXT NOT NULL,
32
- size INTEGER NOT NULL,
33
- mime_type TEXT,
34
- uploaded_at TIMESTAMPTZ DEFAULT NOW(),
35
- PRIMARY KEY (bucket, key),
36
- FOREIGN KEY (bucket) REFERENCES _storage_buckets(name) ON DELETE CASCADE
37
- );
38
-
39
- -- MCP usage tracking table
40
- CREATE TABLE IF NOT EXISTS _mcp_usage (
41
- id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
42
- tool_name VARCHAR(255) NOT NULL,
43
- success BOOLEAN DEFAULT true,
44
- created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP
45
- );
46
-
47
- -- AI configurations table
48
- CREATE TABLE IF NOT EXISTS _ai_configs (
49
- id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
50
- modality VARCHAR(255) NOT NULL,
51
- provider VARCHAR(255) NOT NULL,
52
- model_id VARCHAR(255) UNIQUE NOT NULL,
53
- system_prompt TEXT,
54
- created_at TIMESTAMPTZ DEFAULT NOW(),
55
- updated_at TIMESTAMPTZ DEFAULT NOW()
56
- );
57
-
58
- CREATE TABLE IF NOT EXISTS _ai_usage (
59
- id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
60
- config_id UUID NOT NULL,
61
- input_tokens INT,
62
- output_tokens INT,
63
- image_count INT,
64
- image_resolution TEXT,
65
- created_at TIMESTAMPTZ DEFAULT NOW(),
66
- FOREIGN KEY (config_id) REFERENCES _ai_configs(id) ON DELETE NO ACTION
67
- );
68
-
69
- -- Indexes for AI tables
70
- CREATE INDEX IF NOT EXISTS idx_ai_usage_config_id ON _ai_usage(config_id);
71
- CREATE INDEX IF NOT EXISTS idx_ai_usage_created_at ON _ai_usage(created_at DESC);
72
-
73
- -- Index for efficient date range queries
74
- CREATE INDEX IF NOT EXISTS idx_mcp_usage_created_at ON _mcp_usage(created_at DESC);
75
-
76
- -- Edge functions
77
- CREATE TABLE IF NOT EXISTS _edge_functions (
78
- id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
79
- slug VARCHAR(255) UNIQUE NOT NULL,
80
- name VARCHAR(255) NOT NULL,
81
- description TEXT,
82
- code TEXT NOT NULL,
83
- status VARCHAR(50) DEFAULT 'draft',
84
- created_at TIMESTAMPTZ DEFAULT NOW(),
85
- updated_at TIMESTAMPTZ DEFAULT NOW(),
86
- deployed_at TIMESTAMPTZ
87
- );
88
-
89
- -- Auth Tables (2-table structure)
90
- -- User table
91
- CREATE TABLE IF NOT EXISTS _user (
92
- id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
93
- email TEXT UNIQUE NOT NULL,
94
- password TEXT, -- NULL for OAuth-only users
95
- name TEXT,
96
- email_verified BOOLEAN DEFAULT false,
97
- created_at TIMESTAMPTZ DEFAULT NOW(),
98
- updated_at TIMESTAMPTZ DEFAULT NOW()
99
- );
100
-
101
- -- Account table (for OAuth connections)
102
- CREATE TABLE IF NOT EXISTS _account (
103
- id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
104
- user_id UUID NOT NULL REFERENCES _user(id) ON DELETE CASCADE,
105
- provider TEXT NOT NULL, -- OAuth provider name: 'google', 'github', etc.
106
- provider_account_id TEXT NOT NULL, -- User's unique ID on the provider's system
107
- access_token TEXT, -- OAuth access token for making API calls to provider
108
- refresh_token TEXT, -- OAuth refresh token for renewing access
109
- provider_data JSONB, -- OAuth provider's user profile
110
- created_at TIMESTAMPTZ DEFAULT NOW(),
111
- updated_at TIMESTAMPTZ DEFAULT NOW(),
112
- UNIQUE(provider, provider_account_id)
113
- );
114
-
115
- -- Create update timestamp function
116
- CREATE OR REPLACE FUNCTION update_updated_at_column()
117
- RETURNS TRIGGER AS $$
118
- BEGIN
119
- NEW.updated_at = NOW();
120
- RETURN NEW;
121
- END;
122
- $$ language 'plpgsql';
123
-
124
- -- Create triggers for updated_at
125
- DROP TRIGGER IF EXISTS update__config_updated_at ON _config;
126
- CREATE TRIGGER update__config_updated_at BEFORE UPDATE ON _config
127
- FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
128
-
129
- DROP TRIGGER IF EXISTS update__metadata_updated_at ON _metadata;
130
- CREATE TRIGGER update__metadata_updated_at BEFORE UPDATE ON _metadata
131
- FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
132
-
133
- DROP TRIGGER IF EXISTS update__edge_functions_updated_at ON _edge_functions;
134
- CREATE TRIGGER update__edge_functions_updated_at BEFORE UPDATE ON _edge_functions
135
- FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
136
-
137
- -- Insert initial metadata
138
- INSERT INTO _metadata (key, value) VALUES ('version', '1.0.0')
139
- ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value;
140
-
141
- INSERT INTO _metadata (key, value) VALUES ('created_at', NOW()::TEXT)
1
+ -- Migration: 000 - Create base system tables
2
+ -- This migration creates all the initial tables that the application needs
3
+
4
+ -- System configuration
5
+ CREATE TABLE IF NOT EXISTS _config (
6
+ key TEXT PRIMARY KEY,
7
+ value TEXT NOT NULL,
8
+ created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
9
+ updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP
10
+ );
11
+
12
+ -- App metadata
13
+ CREATE TABLE IF NOT EXISTS _metadata (
14
+ key TEXT PRIMARY KEY,
15
+ value TEXT,
16
+ created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
17
+ updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP
18
+ );
19
+
20
+ -- Storage buckets table to track bucket-level settings
21
+ CREATE TABLE IF NOT EXISTS _storage_buckets (
22
+ name TEXT PRIMARY KEY,
23
+ public BOOLEAN DEFAULT TRUE,
24
+ created_at TIMESTAMPTZ DEFAULT NOW(),
25
+ updated_at TIMESTAMPTZ DEFAULT NOW()
26
+ );
27
+
28
+ -- Storage files table
29
+ CREATE TABLE IF NOT EXISTS _storage (
30
+ bucket TEXT NOT NULL,
31
+ key TEXT NOT NULL,
32
+ size INTEGER NOT NULL,
33
+ mime_type TEXT,
34
+ uploaded_at TIMESTAMPTZ DEFAULT NOW(),
35
+ PRIMARY KEY (bucket, key),
36
+ FOREIGN KEY (bucket) REFERENCES _storage_buckets(name) ON DELETE CASCADE
37
+ );
38
+
39
+ -- MCP usage tracking table
40
+ CREATE TABLE IF NOT EXISTS _mcp_usage (
41
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
42
+ tool_name VARCHAR(255) NOT NULL,
43
+ success BOOLEAN DEFAULT true,
44
+ created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP
45
+ );
46
+
47
+ -- AI configurations table
48
+ CREATE TABLE IF NOT EXISTS _ai_configs (
49
+ id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
50
+ modality VARCHAR(255) NOT NULL,
51
+ provider VARCHAR(255) NOT NULL,
52
+ model_id VARCHAR(255) UNIQUE NOT NULL,
53
+ system_prompt TEXT,
54
+ created_at TIMESTAMPTZ DEFAULT NOW(),
55
+ updated_at TIMESTAMPTZ DEFAULT NOW()
56
+ );
57
+
58
+ CREATE TABLE IF NOT EXISTS _ai_usage (
59
+ id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
60
+ config_id UUID NOT NULL,
61
+ input_tokens INT,
62
+ output_tokens INT,
63
+ image_count INT,
64
+ image_resolution TEXT,
65
+ created_at TIMESTAMPTZ DEFAULT NOW(),
66
+ FOREIGN KEY (config_id) REFERENCES _ai_configs(id) ON DELETE NO ACTION
67
+ );
68
+
69
+ -- Indexes for AI tables
70
+ CREATE INDEX IF NOT EXISTS idx_ai_usage_config_id ON _ai_usage(config_id);
71
+ CREATE INDEX IF NOT EXISTS idx_ai_usage_created_at ON _ai_usage(created_at DESC);
72
+
73
+ -- Index for efficient date range queries
74
+ CREATE INDEX IF NOT EXISTS idx_mcp_usage_created_at ON _mcp_usage(created_at DESC);
75
+
76
+ -- Edge functions
77
+ CREATE TABLE IF NOT EXISTS _edge_functions (
78
+ id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
79
+ slug VARCHAR(255) UNIQUE NOT NULL,
80
+ name VARCHAR(255) NOT NULL,
81
+ description TEXT,
82
+ code TEXT NOT NULL,
83
+ status VARCHAR(50) DEFAULT 'draft',
84
+ created_at TIMESTAMPTZ DEFAULT NOW(),
85
+ updated_at TIMESTAMPTZ DEFAULT NOW(),
86
+ deployed_at TIMESTAMPTZ
87
+ );
88
+
89
+ -- Auth Tables (2-table structure)
90
+ -- User table
91
+ CREATE TABLE IF NOT EXISTS _user (
92
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
93
+ email TEXT UNIQUE NOT NULL,
94
+ password TEXT, -- NULL for OAuth-only users
95
+ name TEXT,
96
+ email_verified BOOLEAN DEFAULT false,
97
+ created_at TIMESTAMPTZ DEFAULT NOW(),
98
+ updated_at TIMESTAMPTZ DEFAULT NOW()
99
+ );
100
+
101
+ -- Account table (for OAuth connections)
102
+ CREATE TABLE IF NOT EXISTS _account (
103
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
104
+ user_id UUID NOT NULL REFERENCES _user(id) ON DELETE CASCADE,
105
+ provider TEXT NOT NULL, -- OAuth provider name: 'google', 'github', etc.
106
+ provider_account_id TEXT NOT NULL, -- User's unique ID on the provider's system
107
+ access_token TEXT, -- OAuth access token for making API calls to provider
108
+ refresh_token TEXT, -- OAuth refresh token for renewing access
109
+ provider_data JSONB, -- OAuth provider's user profile
110
+ created_at TIMESTAMPTZ DEFAULT NOW(),
111
+ updated_at TIMESTAMPTZ DEFAULT NOW(),
112
+ UNIQUE(provider, provider_account_id)
113
+ );
114
+
115
+ -- Create update timestamp function
116
+ CREATE OR REPLACE FUNCTION update_updated_at_column()
117
+ RETURNS TRIGGER AS $$
118
+ BEGIN
119
+ NEW.updated_at = NOW();
120
+ RETURN NEW;
121
+ END;
122
+ $$ language 'plpgsql';
123
+
124
+ -- Create triggers for updated_at
125
+ DROP TRIGGER IF EXISTS update__config_updated_at ON _config;
126
+ CREATE TRIGGER update__config_updated_at BEFORE UPDATE ON _config
127
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
128
+
129
+ DROP TRIGGER IF EXISTS update__metadata_updated_at ON _metadata;
130
+ CREATE TRIGGER update__metadata_updated_at BEFORE UPDATE ON _metadata
131
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
132
+
133
+ DROP TRIGGER IF EXISTS update__edge_functions_updated_at ON _edge_functions;
134
+ CREATE TRIGGER update__edge_functions_updated_at BEFORE UPDATE ON _edge_functions
135
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
136
+
137
+ -- Insert initial metadata
138
+ INSERT INTO _metadata (key, value) VALUES ('version', '1.0.0')
139
+ ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value;
140
+
141
+ INSERT INTO _metadata (key, value) VALUES ('created_at', NOW()::TEXT)
142
142
  ON CONFLICT (key) DO NOTHING;
@@ -1,41 +1,41 @@
1
- -- Migration: 001 - Create helper functions for RLS
2
- -- These functions extract user information from JWT claims
3
-
4
- -- Function to get current user ID from JWT
5
- CREATE OR REPLACE FUNCTION public.uid()
6
- RETURNS uuid
7
- LANGUAGE sql STABLE
8
- AS $$
9
- SELECT
10
- nullif(
11
- coalesce(
12
- current_setting('request.jwt.claim.sub', true),
13
- (current_setting('request.jwt.claims', true)::jsonb ->> 'sub')
14
- ),
15
- ''
16
- )::uuid
17
- $$;
18
-
19
- -- Function to get current user role from JWT
20
- CREATE OR REPLACE FUNCTION public.role()
21
- RETURNS text
22
- LANGUAGE sql STABLE
23
- AS $$
24
- SELECT
25
- coalesce(
26
- current_setting('request.jwt.claim.role', true),
27
- (current_setting('request.jwt.claims', true)::jsonb ->> 'role')
28
- )::text
29
- $$;
30
-
31
- -- Function to get current user email from JWT
32
- CREATE OR REPLACE FUNCTION public.email()
33
- RETURNS text
34
- LANGUAGE sql STABLE
35
- AS $$
36
- SELECT
37
- coalesce(
38
- current_setting('request.jwt.claim.email', true),
39
- (current_setting('request.jwt.claims', true)::jsonb ->> 'email')
40
- )::text
1
+ -- Migration: 001 - Create helper functions for RLS
2
+ -- These functions extract user information from JWT claims
3
+
4
+ -- Function to get current user ID from JWT
5
+ CREATE OR REPLACE FUNCTION public.uid()
6
+ RETURNS uuid
7
+ LANGUAGE sql STABLE
8
+ AS $$
9
+ SELECT
10
+ nullif(
11
+ coalesce(
12
+ current_setting('request.jwt.claim.sub', true),
13
+ (current_setting('request.jwt.claims', true)::jsonb ->> 'sub')
14
+ ),
15
+ ''
16
+ )::uuid
17
+ $$;
18
+
19
+ -- Function to get current user role from JWT
20
+ CREATE OR REPLACE FUNCTION public.role()
21
+ RETURNS text
22
+ LANGUAGE sql STABLE
23
+ AS $$
24
+ SELECT
25
+ coalesce(
26
+ current_setting('request.jwt.claim.role', true),
27
+ (current_setting('request.jwt.claims', true)::jsonb ->> 'role')
28
+ )::text
29
+ $$;
30
+
31
+ -- Function to get current user email from JWT
32
+ CREATE OR REPLACE FUNCTION public.email()
33
+ RETURNS text
34
+ LANGUAGE sql STABLE
35
+ AS $$
36
+ SELECT
37
+ coalesce(
38
+ current_setting('request.jwt.claim.email', true),
39
+ (current_setting('request.jwt.claims', true)::jsonb ->> 'email')
40
+ )::text
41
41
  $$;