insforge 0.3.3 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (635) hide show
  1. package/.claude-plugin/marketplace.json +20 -0
  2. package/.dockerignore +60 -57
  3. package/.env.example +84 -49
  4. package/.github/ISSUE_TEMPLATE/bug_report.yml +36 -83
  5. package/.github/ISSUE_TEMPLATE/config.yml +11 -11
  6. package/.github/ISSUE_TEMPLATE/feature_request.yml +26 -79
  7. package/.github/PULL_REQUEST_TEMPLATE.md +7 -0
  8. package/.github/copilot-instructions.md +146 -146
  9. package/.github/workflows/build-image.yml +66 -65
  10. package/.github/workflows/ci-premerge-check.yml +23 -23
  11. package/.github/workflows/e2e.yml +63 -0
  12. package/.github/workflows/lint-and-format.yml +32 -32
  13. package/.prettierignore +64 -64
  14. package/CHANGELOG.md +44 -3
  15. package/CLAUDE_PLUGIN.md +104 -0
  16. package/CODE_OF_CONDUCT.md +128 -0
  17. package/CONTRIBUTING.md +125 -125
  18. package/Dockerfile +30 -27
  19. package/GITHUB_OAUTH_SETUP.md +49 -49
  20. package/GOOGLE_OAUTH_SETUP.md +148 -148
  21. package/LICENSE +201 -201
  22. package/README.md +182 -134
  23. package/assets/Dark.svg +23 -23
  24. package/assets/mcpInstallv2.png +0 -0
  25. package/assets/sampleResponse.png +0 -0
  26. package/auth/index.html +13 -0
  27. package/auth/package.json +28 -0
  28. package/auth/public/favicon.ico +0 -0
  29. package/auth/src/App.tsx +33 -0
  30. package/auth/src/components/ErrorCard.tsx +37 -0
  31. package/auth/src/components/Layout.tsx +13 -0
  32. package/auth/src/index.css +19 -0
  33. package/auth/src/lib/broadcastService.ts +117 -0
  34. package/auth/src/lib/utils.ts +11 -0
  35. package/auth/src/main.tsx +22 -0
  36. package/auth/src/pages/ForgotPasswordPage.tsx +11 -0
  37. package/auth/src/pages/ResetPasswordPage.tsx +11 -0
  38. package/auth/src/pages/SignInPage.tsx +60 -0
  39. package/auth/src/pages/SignUpPage.tsx +60 -0
  40. package/auth/src/pages/VerifyEmailPage.tsx +20 -0
  41. package/auth/src/vite-env.d.ts +10 -0
  42. package/auth/tsconfig.json +32 -0
  43. package/auth/tsconfig.node.json +11 -0
  44. package/auth/vite.config.ts +25 -0
  45. package/backend/package.json +78 -75
  46. package/backend/src/api/{middleware → middlewares}/auth.ts +8 -9
  47. package/backend/src/api/middlewares/rate-limiters.ts +127 -0
  48. package/backend/src/api/routes/{ai.ts → ai/index.routes.ts} +22 -26
  49. package/backend/src/api/routes/auth/index.routes.ts +667 -0
  50. package/backend/src/api/routes/auth/oauth.routes.ts +473 -0
  51. package/backend/src/api/routes/{database.advance.ts → database/advance.routes.ts} +128 -65
  52. package/backend/src/api/routes/database/index.routes.ts +90 -0
  53. package/backend/src/api/routes/{database.records.ts → database/records.routes.ts} +26 -12
  54. package/backend/src/api/routes/{database.tables.ts → database/tables.routes.ts} +6 -23
  55. package/backend/src/api/routes/docs/index.routes.ts +75 -0
  56. package/backend/src/api/routes/email/index.routes.ts +35 -0
  57. package/backend/src/api/routes/functions/index.routes.ts +194 -0
  58. package/backend/src/api/routes/{logs.ts → logs/index.routes.ts} +25 -30
  59. package/backend/src/api/routes/{metadata.ts → metadata/index.routes.ts} +33 -31
  60. package/backend/src/api/routes/realtime/channels.routes.ts +81 -0
  61. package/backend/src/api/routes/realtime/index.routes.ts +12 -0
  62. package/backend/src/api/routes/realtime/messages.routes.ts +48 -0
  63. package/backend/src/api/routes/realtime/permissions.routes.ts +19 -0
  64. package/backend/src/api/routes/{secrets.ts → secrets/index.routes.ts} +27 -22
  65. package/backend/src/api/routes/{storage.ts → storage/index.routes.ts} +48 -61
  66. package/backend/src/api/routes/usage/index.routes.ts +91 -0
  67. package/backend/src/infra/config/app.config.ts +51 -0
  68. package/backend/src/infra/database/database.manager.ts +182 -0
  69. package/backend/{migrations → src/infra/database/migrations}/000_create-base-tables.sql +141 -141
  70. package/backend/{migrations → src/infra/database/migrations}/001_create-helper-functions.sql +40 -40
  71. package/backend/{migrations → src/infra/database/migrations}/002_rename-auth-tables.sql +29 -29
  72. package/backend/{migrations → src/infra/database/migrations}/003_create-users-table.sql +55 -55
  73. package/backend/{migrations → src/infra/database/migrations}/004_add-reload-postgrest-func.sql +23 -23
  74. package/backend/{migrations → src/infra/database/migrations}/005_enable-project-admin-modify-users.sql +29 -29
  75. package/backend/{migrations → src/infra/database/migrations}/006_modify-ai-usage-table.sql +24 -24
  76. package/backend/{migrations → src/infra/database/migrations}/007_drop-metadata-table.sql +1 -1
  77. package/backend/{migrations → src/infra/database/migrations}/008_add-system-tables.sql +76 -76
  78. package/backend/{migrations → src/infra/database/migrations}/009_add-function-secrets.sql +23 -23
  79. package/backend/{migrations → src/infra/database/migrations}/010_modify-ai-config-modalities.sql +93 -93
  80. package/backend/{migrations → src/infra/database/migrations}/011_refactor-secrets-table.sql +15 -15
  81. package/backend/{migrations → src/infra/database/migrations}/012_add-storage-uploaded-by.sql +7 -7
  82. package/backend/src/infra/database/migrations/013_create-auth-schema-functions.sql +44 -0
  83. package/backend/src/infra/database/migrations/014_add-updated-at-trigger-user-table.sql +8 -0
  84. package/backend/src/infra/database/migrations/015_create-auth-config-and-email-otp-tables.sql +60 -0
  85. package/backend/src/infra/database/migrations/016_update-auth-config-and-email-otp.sql +24 -0
  86. package/backend/src/infra/database/migrations/017_create-realtime-schema.sql +233 -0
  87. package/backend/src/infra/realtime/realtime.manager.ts +246 -0
  88. package/backend/src/infra/realtime/webhook-sender.ts +82 -0
  89. package/backend/src/{core/secrets/encryption.ts → infra/security/encryption.manager.ts} +3 -2
  90. package/backend/src/infra/security/token.manager.ts +219 -0
  91. package/backend/src/infra/socket/socket.manager.ts +522 -0
  92. package/backend/src/providers/ai/openrouter.provider.ts +380 -0
  93. package/backend/src/providers/email/base.provider.ts +38 -0
  94. package/backend/src/providers/email/cloud.provider.ts +271 -0
  95. package/backend/src/{core/logs/providers → providers/logs}/base.provider.ts +11 -11
  96. package/backend/src/{core/logs/providers → providers/logs}/cloudwatch.provider.ts +61 -38
  97. package/backend/src/providers/logs/local.provider.ts +185 -0
  98. package/backend/src/providers/oauth/apple.provider.ts +266 -0
  99. package/backend/src/providers/oauth/base.provider.ts +29 -0
  100. package/backend/src/providers/oauth/discord.provider.ts +195 -0
  101. package/backend/src/providers/oauth/facebook.provider.ts +194 -0
  102. package/backend/src/providers/oauth/github.provider.ts +208 -0
  103. package/backend/src/providers/oauth/google.provider.ts +249 -0
  104. package/backend/src/providers/oauth/index.ts +8 -0
  105. package/backend/src/providers/oauth/linkedin.provider.ts +240 -0
  106. package/backend/src/providers/oauth/microsoft.provider.ts +169 -0
  107. package/backend/src/providers/oauth/x.provider.ts +202 -0
  108. package/backend/src/providers/storage/base.provider.ts +29 -0
  109. package/backend/src/providers/storage/local.provider.ts +103 -0
  110. package/backend/src/providers/storage/s3.provider.ts +313 -0
  111. package/backend/src/server.ts +317 -288
  112. package/backend/src/{core/ai/config.ts → services/ai/ai-config.service.ts} +19 -24
  113. package/backend/src/services/ai/ai-model.service.ts +60 -0
  114. package/backend/src/{core/ai/usage.ts → services/ai/ai-usage.service.ts} +28 -35
  115. package/backend/src/{core/ai/chat.ts → services/ai/chat-completion.service.ts} +37 -24
  116. package/backend/src/services/ai/helpers.ts +64 -0
  117. package/backend/src/{core/ai/image.ts → services/ai/image-generation.service.ts} +17 -19
  118. package/backend/src/services/ai/index.ts +13 -0
  119. package/backend/src/services/auth/auth-config.service.ts +250 -0
  120. package/backend/src/services/auth/auth-otp.service.ts +424 -0
  121. package/backend/src/services/auth/auth.service.ts +1150 -0
  122. package/backend/src/services/auth/index.ts +4 -0
  123. package/backend/src/{core/auth/oauth.ts → services/auth/oauth-config.service.ts} +106 -52
  124. package/backend/src/{core/database/advance.ts → services/database/database-advance.service.ts} +97 -131
  125. package/backend/src/services/database/database-table.service.ts +802 -0
  126. package/backend/src/services/database/database.service.ts +127 -0
  127. package/backend/src/services/email/email.service.ts +73 -0
  128. package/backend/src/{core/functions/functions.ts → services/functions/function.service.ts} +95 -88
  129. package/backend/src/{core/logs/audit.ts → services/logs/audit.service.ts} +92 -75
  130. package/backend/src/services/logs/log.service.ts +73 -0
  131. package/backend/src/services/realtime/index.ts +3 -0
  132. package/backend/src/services/realtime/realtime-auth.service.ts +104 -0
  133. package/backend/src/services/realtime/realtime-channel.service.ts +237 -0
  134. package/backend/src/services/realtime/realtime-message.service.ts +260 -0
  135. package/backend/src/{core/secrets/secrets.ts → services/secrets/secret.service.ts} +48 -66
  136. package/backend/src/services/storage/storage.service.ts +617 -0
  137. package/backend/src/services/usage/usage.service.ts +149 -0
  138. package/backend/src/types/auth.ts +77 -2
  139. package/backend/src/types/email.ts +8 -0
  140. package/backend/src/types/error-constants.ts +4 -0
  141. package/backend/src/types/logs.ts +0 -29
  142. package/backend/src/types/realtime.ts +18 -0
  143. package/backend/src/{core/socket/types.ts → types/socket.ts} +11 -36
  144. package/backend/src/utils/cookies.ts +35 -0
  145. package/backend/src/utils/environment.ts +9 -3
  146. package/backend/src/utils/logger.ts +20 -2
  147. package/backend/src/utils/s3-config-loader.ts +64 -0
  148. package/backend/src/utils/seed.ts +301 -205
  149. package/backend/src/utils/sql-parser.ts +91 -1
  150. package/backend/src/utils/utils.ts +114 -0
  151. package/backend/src/utils/validations.ts +40 -4
  152. package/backend/tests/README.md +133 -133
  153. package/backend/tests/cleanup-all-test-data.sh +230 -230
  154. package/backend/tests/cloud/test-s3-multitenant.sh +131 -131
  155. package/backend/tests/local/comprehensive-curl-tests.sh +155 -155
  156. package/backend/tests/local/test-ai-config.sh +129 -0
  157. package/backend/tests/local/test-ai-usage.sh +80 -0
  158. package/backend/tests/local/test-auth-router.sh +143 -143
  159. package/backend/tests/local/test-database-router.sh +222 -222
  160. package/backend/tests/local/test-e2e.sh +240 -240
  161. package/backend/tests/local/test-fk-errors.sh +96 -96
  162. package/backend/tests/local/test-functions.sh +123 -0
  163. package/backend/tests/local/test-id-field.sh +200 -200
  164. package/backend/tests/local/test-logs.sh +132 -0
  165. package/backend/tests/local/test-public-bucket.sh +264 -264
  166. package/backend/tests/local/test-secrets.sh +249 -247
  167. package/backend/tests/local/test-serverless-functions.sh.disabled +325 -325
  168. package/backend/tests/local/test-traditional-rest.sh +208 -208
  169. package/backend/tests/manual/README.md +50 -50
  170. package/backend/tests/manual/create-large-table-simple.sql +10 -10
  171. package/backend/tests/manual/seed-large-table.sql +100 -100
  172. package/backend/tests/manual/setup-large-table-extras.sql +33 -33
  173. package/backend/tests/manual/test-bulk-upsert.sh +409 -409
  174. package/backend/tests/manual/test-database-advance.sh +296 -296
  175. package/backend/tests/manual/test-postgrest-stability.sh +191 -191
  176. package/backend/tests/manual/test-rawsql-export-import.sh +411 -411
  177. package/backend/tests/manual/test-rawsql-modes.sh +244 -0
  178. package/backend/tests/manual/test-universal-storage.sh +263 -263
  179. package/backend/tests/manual/test-users.sql +17 -17
  180. package/backend/tests/run-all-tests.sh +139 -139
  181. package/backend/tests/setup.ts +0 -0
  182. package/backend/tests/test-config.sh +338 -302
  183. package/backend/tests/unit/analyze-query.test.ts +697 -0
  184. package/backend/tests/unit/cloud-token.test.ts +48 -0
  185. package/backend/tests/unit/constant.test.ts +8 -0
  186. package/backend/tests/unit/email.test.ts +372 -0
  187. package/backend/tests/unit/environment.test.ts +59 -0
  188. package/backend/tests/unit/helpers.test.ts +63 -0
  189. package/backend/tests/unit/logger.test.ts +22 -0
  190. package/backend/tests/unit/rate-limit.test.ts +154 -0
  191. package/backend/tests/unit/response.test.ts +58 -0
  192. package/backend/tests/unit/sql-parser.test.ts +74 -0
  193. package/backend/tests/unit/uuid.test.ts +21 -0
  194. package/backend/tests/unit/validations.test.ts +80 -0
  195. package/backend/tsconfig.json +22 -22
  196. package/backend/vitest.config.ts +11 -0
  197. package/claude-plugin/.claude-plugin/plugin.json +24 -0
  198. package/claude-plugin/README.md +133 -0
  199. package/claude-plugin/skills/insforge-schema-patterns/SKILL.md +270 -0
  200. package/docker-compose.prod.yml +204 -144
  201. package/docker-compose.yml +232 -167
  202. package/docker-init/db/db-init.sql +97 -125
  203. package/docker-init/db/jwt.sql +5 -5
  204. package/docker-init/db/postgresql.conf +16 -16
  205. package/docker-init/logs/vector.yml +236 -0
  206. package/docs/README.md +44 -0
  207. package/docs/agent-docs/real-time.md +269 -0
  208. package/docs/changelog.mdx +119 -0
  209. package/docs/core-concepts/ai/architecture.mdx +373 -0
  210. package/docs/core-concepts/ai/sdk.mdx +213 -0
  211. package/docs/core-concepts/authentication/architecture.mdx +278 -0
  212. package/docs/core-concepts/authentication/sdk.mdx +414 -0
  213. package/docs/core-concepts/authentication/ui-components/customization.mdx +529 -0
  214. package/docs/core-concepts/authentication/ui-components/nextjs.mdx +221 -0
  215. package/docs/core-concepts/authentication/ui-components/react-router.mdx +184 -0
  216. package/docs/core-concepts/authentication/ui-components/react.mdx +129 -0
  217. package/docs/core-concepts/database/architecture.mdx +256 -0
  218. package/docs/core-concepts/database/sdk.mdx +382 -0
  219. package/docs/core-concepts/email/architecture.mdx +101 -0
  220. package/docs/core-concepts/email/sdk.mdx +53 -0
  221. package/docs/core-concepts/functions/architecture.mdx +105 -0
  222. package/docs/core-concepts/functions/sdk.mdx +184 -0
  223. package/docs/core-concepts/realtime/architecture.mdx +446 -0
  224. package/docs/core-concepts/realtime/sdk.mdx +409 -0
  225. package/docs/core-concepts/storage/architecture.mdx +243 -0
  226. package/docs/core-concepts/storage/sdk.mdx +253 -0
  227. package/docs/deployment/README.md +94 -0
  228. package/docs/deployment/deploy-to-aws-ec2.md +565 -0
  229. package/docs/deployment/deploy-to-azure-virtual-machines.md +313 -0
  230. package/docs/deployment/deploy-to-google-cloud-compute-engine.md +613 -0
  231. package/docs/deployment/deploy-to-render.md +441 -0
  232. package/docs/deprecated/insforge-auth-api.md +214 -214
  233. package/docs/deprecated/insforge-auth-sdk.md +99 -99
  234. package/docs/deprecated/insforge-db-api.md +358 -358
  235. package/docs/deprecated/insforge-db-sdk.md +139 -139
  236. package/docs/deprecated/insforge-debug-sdk.md +156 -156
  237. package/docs/deprecated/insforge-debug.md +64 -64
  238. package/docs/deprecated/insforge-instructions.md +123 -123
  239. package/docs/deprecated/insforge-project.md +117 -117
  240. package/docs/deprecated/insforge-storage-api.md +278 -278
  241. package/docs/deprecated/insforge-storage-sdk.md +158 -158
  242. package/docs/docs.json +232 -0
  243. package/docs/examples/framework-guides/nextjs.mdx +131 -0
  244. package/docs/examples/framework-guides/nuxt.mdx +165 -0
  245. package/docs/examples/framework-guides/react.mdx +165 -0
  246. package/docs/examples/framework-guides/svelte.mdx +153 -0
  247. package/docs/examples/framework-guides/vue.mdx +159 -0
  248. package/docs/examples/overview.mdx +67 -0
  249. package/docs/favicon.svg +19 -0
  250. package/docs/images/changelog/dec-2025/ai-integration.png +0 -0
  251. package/docs/images/changelog/dec-2025/ai-models.webp +0 -0
  252. package/docs/images/changelog/dec-2025/alipay-payment.webp +0 -0
  253. package/docs/images/changelog/dec-2025/apple-login.jpg +0 -0
  254. package/docs/images/changelog/dec-2025/mcp-installer.png +0 -0
  255. package/docs/images/changelog/dec-2025/realtime-module.jpg +0 -0
  256. package/docs/images/changelog/nov-2025/auth-components.webp +0 -0
  257. package/docs/images/changelog/nov-2025/database-metadata.webp +0 -0
  258. package/docs/images/changelog/nov-2025/quickstart-prompts.webp +0 -0
  259. package/docs/images/changelog/nov-2025/sql-editor.webp +0 -0
  260. package/docs/images/changelog/nov-2025/usage-page.webp +0 -0
  261. package/docs/images/changelog/october-2025/csv-upload.webp +0 -0
  262. package/docs/images/changelog/october-2025/logs-feature.webp +0 -0
  263. package/docs/images/changelog/october-2025/oauth-providers.webp +0 -0
  264. package/docs/images/checks-passed.png +0 -0
  265. package/docs/images/dashboard-connect-expanded.png +0 -0
  266. package/docs/images/dashboard-connect.png +0 -0
  267. package/docs/images/hero-dark.png +0 -0
  268. package/docs/images/hero-light.png +0 -0
  269. package/docs/images/icons/ai.svg +4 -0
  270. package/docs/images/icons/auth.svg +1 -0
  271. package/docs/images/icons/database.svg +1 -0
  272. package/docs/images/icons/function.svg +1 -0
  273. package/docs/images/icons/storage.svg +1 -0
  274. package/docs/images/logos/nextjs.svg +4 -0
  275. package/docs/images/logos/nuxt.svg +4 -0
  276. package/docs/images/logos/react.svg +5 -0
  277. package/docs/images/logos/svelte.svg +4 -0
  278. package/docs/images/logos/vue.svg +5 -0
  279. package/docs/images/mcp-install.png +0 -0
  280. package/docs/images/onboarding-mcp.png +0 -0
  281. package/docs/insforge-instructions-sdk.md +89 -407
  282. package/docs/introduction.mdx +45 -0
  283. package/docs/logo/dark.svg +22 -0
  284. package/docs/logo/light.svg +20 -0
  285. package/docs/partnership.mdx +652 -0
  286. package/docs/quickstart.mdx +83 -0
  287. package/docs/showcase/2048-arena.png +0 -0
  288. package/docs/showcase/framegen-cloud.png +0 -0
  289. package/docs/showcase/line-connect-race.png +0 -0
  290. package/docs/showcase/moment-vibe.png +0 -0
  291. package/docs/showcase/national-flags.png +0 -0
  292. package/docs/showcase/pokemon-vibe.png +0 -0
  293. package/docs/showcase/pure-browse-buy.png +0 -0
  294. package/docs/showcase.mdx +52 -0
  295. package/docs/snippets/sdk-installation.mdx +22 -0
  296. package/docs/snippets/service-icons.mdx +27 -0
  297. package/eslint.config.js +10 -3
  298. package/examples/oauth/frontend-oauth-example.html +250 -250
  299. package/examples/response-examples.md +443 -443
  300. package/frontend/components.json +17 -17
  301. package/frontend/package.json +69 -63
  302. package/frontend/src/App.tsx +13 -82
  303. package/frontend/src/assets/icons/checkbox_checked.svg +6 -6
  304. package/frontend/src/assets/icons/checkbox_undetermined.svg +6 -6
  305. package/frontend/src/assets/icons/checked.svg +3 -3
  306. package/frontend/src/assets/icons/connected.svg +3 -0
  307. package/frontend/src/assets/icons/error.svg +3 -3
  308. package/frontend/src/assets/icons/loader.svg +9 -0
  309. package/frontend/src/assets/icons/pencil.svg +4 -4
  310. package/frontend/src/assets/icons/refresh.svg +4 -4
  311. package/frontend/src/assets/icons/step_active.svg +3 -3
  312. package/frontend/src/assets/icons/step_inactive.svg +11 -11
  313. package/frontend/src/assets/icons/warning.svg +3 -3
  314. package/frontend/src/assets/logos/apple.svg +4 -0
  315. package/frontend/src/assets/logos/claude_code.svg +3 -3
  316. package/frontend/src/assets/logos/cline.svg +6 -6
  317. package/frontend/src/assets/logos/cursor.svg +20 -20
  318. package/frontend/src/assets/logos/discord.svg +8 -8
  319. package/frontend/src/assets/logos/facebook.svg +3 -0
  320. package/frontend/src/assets/logos/gemini.svg +19 -19
  321. package/frontend/src/assets/logos/github.svg +5 -5
  322. package/frontend/src/assets/logos/google.svg +13 -13
  323. package/frontend/src/assets/logos/grok.svg +10 -10
  324. package/frontend/src/assets/logos/insforge_dark.svg +15 -15
  325. package/frontend/src/assets/logos/insforge_light.svg +15 -15
  326. package/frontend/src/assets/logos/instagram.svg +2 -0
  327. package/frontend/src/assets/logos/linkedin.svg +3 -0
  328. package/frontend/src/assets/logos/microsoft.svg +1 -0
  329. package/frontend/src/assets/logos/openai.svg +10 -10
  330. package/frontend/src/assets/logos/roo_code.svg +9 -9
  331. package/frontend/src/assets/logos/spotify.svg +17 -0
  332. package/frontend/src/assets/logos/tiktok.svg +6 -0
  333. package/frontend/src/assets/logos/trae.svg +3 -3
  334. package/frontend/src/assets/logos/windsurf.svg +10 -10
  335. package/frontend/src/assets/logos/x.svg +3 -0
  336. package/frontend/src/components/Checkbox.tsx +27 -29
  337. package/frontend/src/components/CodeBlock.tsx +55 -2
  338. package/frontend/src/components/CodeEditor.tsx +92 -0
  339. package/frontend/src/components/ConfirmDialog.tsx +1 -1
  340. package/frontend/src/components/ConnectCTA.tsx +38 -0
  341. package/frontend/src/components/CopyButton.tsx +52 -15
  342. package/frontend/src/components/ErrorState.tsx +1 -2
  343. package/frontend/src/components/FeatureSidebar.tsx +6 -6
  344. package/frontend/src/components/FeatureSidebarItem.tsx +2 -2
  345. package/frontend/src/components/JsonHighlight.tsx +21 -9
  346. package/frontend/src/components/ProjectInfoModal.tsx +128 -0
  347. package/frontend/src/components/PromptDialog.tsx +1 -4
  348. package/frontend/src/components/SearchInput.tsx +1 -2
  349. package/frontend/src/components/Stepper.tsx +53 -0
  350. package/frontend/src/components/ThemeToggle.tsx +3 -3
  351. package/frontend/src/components/datagrid/DataGrid.tsx +25 -32
  352. package/frontend/src/components/datagrid/cell-editors/DateCellEditor.tsx +1 -2
  353. package/frontend/src/components/datagrid/cell-editors/JsonCellEditor.tsx +2 -4
  354. package/frontend/src/components/datagrid/index.ts +23 -0
  355. package/frontend/src/components/index.ts +23 -30
  356. package/frontend/src/components/layout/AppHeader.tsx +131 -91
  357. package/frontend/src/components/layout/AppSidebar.tsx +80 -170
  358. package/frontend/src/components/layout/Layout.tsx +12 -23
  359. package/frontend/src/components/layout/PrimaryMenu.tsx +187 -0
  360. package/frontend/src/components/layout/SecondaryMenu.tsx +70 -0
  361. package/frontend/src/components/layout/index.ts +5 -0
  362. package/frontend/src/components/radix/Tooltip.tsx +24 -13
  363. package/frontend/src/components/radix/index.ts +22 -0
  364. package/frontend/src/features/ai/components/AIConfigCard.tsx +129 -83
  365. package/frontend/src/features/ai/components/AIEmptyState.tsx +12 -7
  366. package/frontend/src/features/ai/components/ModalityFilterSidebar.tsx +101 -0
  367. package/frontend/src/features/ai/components/ModelSelectionDialog.tsx +135 -0
  368. package/frontend/src/features/ai/components/ModelSelectionGrid.tsx +51 -0
  369. package/frontend/src/features/ai/components/SystemPromptDialog.tsx +118 -0
  370. package/frontend/src/features/ai/components/index.ts +6 -0
  371. package/frontend/src/features/ai/helpers.ts +57 -71
  372. package/frontend/src/features/ai/hooks/useAIConfigs.ts +39 -113
  373. package/frontend/src/features/ai/hooks/useAIUsage.ts +0 -2
  374. package/frontend/src/features/ai/pages/AIPage.tsx +166 -0
  375. package/frontend/src/features/ai/services/ai.service.ts +5 -5
  376. package/frontend/src/features/auth/components/AuthPreview.tsx +96 -0
  377. package/frontend/src/features/auth/components/OAuthConfigDialog.tsx +54 -30
  378. package/frontend/src/features/auth/components/UserFormDialog.tsx +13 -6
  379. package/frontend/src/features/auth/components/UsersDataGrid.tsx +50 -14
  380. package/frontend/src/features/auth/components/index.ts +5 -0
  381. package/frontend/src/features/auth/helpers.tsx +208 -0
  382. package/frontend/src/features/auth/hooks/useAnonToken.ts +30 -0
  383. package/frontend/src/features/auth/hooks/useAuthConfig.ts +48 -0
  384. package/frontend/src/features/auth/hooks/useOAuthConfig.ts +14 -10
  385. package/frontend/src/features/auth/hooks/useUsers.ts +43 -5
  386. package/frontend/src/features/auth/index.ts +3 -2
  387. package/frontend/src/features/auth/pages/AuthMethodsPage.tsx +275 -0
  388. package/frontend/src/features/auth/pages/ConfigurationPage.tsx +395 -0
  389. package/frontend/src/features/auth/pages/UsersPage.tsx +257 -0
  390. package/frontend/src/features/auth/services/anonToken.service.ts +11 -0
  391. package/frontend/src/features/auth/services/config.service.ts +19 -0
  392. package/frontend/src/features/auth/services/{oauth.service.ts → oauth-config.service.ts} +4 -4
  393. package/frontend/src/features/auth/services/{auth.service.ts → user.service.ts} +7 -53
  394. package/frontend/src/features/dashboard/components/ConnectionSuccessBanner.tsx +35 -0
  395. package/frontend/src/features/dashboard/components/PromptCard.tsx +21 -0
  396. package/frontend/src/features/dashboard/components/PromptDialog.tsx +103 -0
  397. package/frontend/src/features/dashboard/components/StatsCard.tsx +50 -0
  398. package/frontend/src/features/dashboard/components/index.ts +4 -0
  399. package/frontend/src/features/dashboard/pages/DashboardPage.tsx +212 -0
  400. package/frontend/src/features/dashboard/prompts/ai-chatbot.ts +13 -0
  401. package/frontend/src/features/dashboard/prompts/crm-system.ts +13 -0
  402. package/frontend/src/features/dashboard/prompts/ecommerce-platform.ts +12 -0
  403. package/frontend/src/features/dashboard/prompts/index.ts +31 -0
  404. package/frontend/src/features/dashboard/prompts/instagram-clone.ts +11 -0
  405. package/frontend/src/features/dashboard/prompts/notion-clone.ts +14 -0
  406. package/frontend/src/features/dashboard/prompts/reddit-clone.ts +12 -0
  407. package/frontend/src/features/database/components/DatabaseDataGrid.tsx +48 -17
  408. package/frontend/src/features/database/components/ForeignKeyCell.tsx +15 -34
  409. package/frontend/src/features/database/components/ForeignKeyPopover.tsx +19 -20
  410. package/frontend/src/features/database/components/LinkRecordModal.tsx +120 -125
  411. package/frontend/src/features/database/components/RecordFormDialog.tsx +22 -33
  412. package/frontend/src/features/database/components/RecordFormField.tsx +45 -47
  413. package/frontend/src/features/database/components/SQLModal.tsx +75 -0
  414. package/frontend/src/features/database/components/TableEmptyState.tsx +6 -5
  415. package/frontend/src/features/database/components/TableForm.tsx +28 -19
  416. package/frontend/src/features/database/components/TableFormColumn.tsx +2 -3
  417. package/frontend/src/features/database/components/TableSidebar.tsx +1 -1
  418. package/frontend/src/features/database/components/TablesEmptyState.tsx +48 -0
  419. package/frontend/src/features/database/components/TemplateCard.tsx +37 -0
  420. package/frontend/src/features/database/components/TemplatePreview.tsx +92 -0
  421. package/frontend/src/features/database/components/index.ts +19 -0
  422. package/frontend/src/features/database/constants.ts +28 -2
  423. package/frontend/src/features/database/contexts/SQLEditorContext.tsx +188 -0
  424. package/frontend/src/features/database/helpers.ts +2 -2
  425. package/frontend/src/features/database/hooks/useCSVImport.ts +29 -0
  426. package/frontend/src/features/database/hooks/useDatabase.ts +66 -0
  427. package/frontend/src/features/database/hooks/useRawSQL.ts +55 -0
  428. package/frontend/src/features/database/hooks/useRecords.ts +139 -0
  429. package/frontend/src/features/database/hooks/useTables.ts +135 -0
  430. package/frontend/src/features/database/index.ts +7 -1
  431. package/frontend/src/features/database/pages/FunctionsPage.tsx +203 -0
  432. package/frontend/src/features/database/pages/IndexesPage.tsx +228 -0
  433. package/frontend/src/features/database/pages/PoliciesPage.tsx +237 -0
  434. package/frontend/src/features/database/pages/SQLEditorPage.tsx +382 -0
  435. package/frontend/src/features/database/{page/DatabasePage.tsx → pages/TablesPage.tsx} +168 -209
  436. package/frontend/src/features/database/pages/TemplatesPage.tsx +39 -0
  437. package/frontend/src/features/database/pages/TriggersPage.tsx +230 -0
  438. package/frontend/src/features/database/services/advance.service.ts +40 -0
  439. package/frontend/src/features/database/services/database.service.ts +33 -194
  440. package/frontend/src/features/database/services/record.service.ts +219 -0
  441. package/frontend/src/features/database/services/table.service.ts +58 -0
  442. package/frontend/src/features/database/templates/ai-chatbot.ts +402 -0
  443. package/frontend/src/features/database/templates/crm-system.ts +528 -0
  444. package/frontend/src/features/database/templates/ecommerce-platform.ts +553 -0
  445. package/frontend/src/features/database/templates/index.ts +34 -0
  446. package/frontend/src/features/database/templates/instagram-clone.ts +222 -0
  447. package/frontend/src/features/database/templates/notion-clone.ts +483 -0
  448. package/frontend/src/features/database/templates/reddit-clone.ts +526 -0
  449. package/frontend/src/features/functions/components/FunctionRow.tsx +2 -1
  450. package/frontend/src/features/functions/components/FunctionsSidebar.tsx +1 -1
  451. package/frontend/src/features/functions/components/SecretRow.tsx +1 -1
  452. package/frontend/src/features/functions/components/index.ts +5 -0
  453. package/frontend/src/features/functions/hooks/useFunctions.ts +4 -4
  454. package/frontend/src/features/{secrets → functions}/hooks/useSecrets.ts +5 -5
  455. package/frontend/src/features/functions/pages/FunctionsPage.tsx +148 -0
  456. package/frontend/src/features/functions/{components/SecretsContent.tsx → pages/SecretsPage.tsx} +19 -21
  457. package/frontend/src/features/functions/services/{functions.service.ts → function.service.ts} +2 -2
  458. package/frontend/src/features/{secrets/services/secrets.service.ts → functions/services/secret.service.ts} +2 -2
  459. package/frontend/src/features/login/hooks/usePartnerOrigin.ts +27 -0
  460. package/frontend/src/features/login/pages/CloudLoginPage.tsx +118 -0
  461. package/frontend/src/features/login/{page → pages}/LoginPage.tsx +16 -23
  462. package/frontend/src/features/login/services/partnership.service.ts +65 -0
  463. package/frontend/src/features/logs/components/LogsDataGrid.tsx +89 -0
  464. package/frontend/src/features/logs/components/SeverityBadge.tsx +18 -0
  465. package/frontend/src/features/logs/components/index.ts +2 -0
  466. package/frontend/src/features/logs/helpers.ts +24 -0
  467. package/frontend/src/features/logs/hooks/useAuditLogs.ts +4 -4
  468. package/frontend/src/features/logs/hooks/useLogSources.ts +137 -0
  469. package/frontend/src/features/logs/hooks/useLogs.ts +163 -0
  470. package/frontend/src/features/logs/hooks/useMcpUsage.ts +128 -0
  471. package/frontend/src/features/logs/index.ts +8 -2
  472. package/frontend/src/features/logs/{page → pages}/AuditsPage.tsx +91 -38
  473. package/frontend/src/features/logs/pages/LogsPage.tsx +152 -0
  474. package/frontend/src/features/logs/pages/MCPLogsPage.tsx +84 -0
  475. package/frontend/src/features/logs/services/audit.service.ts +63 -0
  476. package/frontend/src/features/logs/services/log.service.ts +15 -110
  477. package/frontend/src/features/logs/services/usage.service.ts +31 -0
  478. package/frontend/src/features/onboard/components/McpConnectionStatus.tsx +68 -0
  479. package/frontend/src/features/onboard/components/OnboardingModal.tsx +267 -0
  480. package/frontend/src/features/onboard/components/VideoDemoModal.tsx +38 -0
  481. package/frontend/src/features/onboard/components/index.ts +4 -0
  482. package/frontend/src/features/onboard/components/mcp/CursorDeeplinkGenerator.tsx +2 -2
  483. package/frontend/src/features/onboard/components/mcp/{mcp-helper.tsx → helpers.tsx} +8 -8
  484. package/frontend/src/features/onboard/components/mcp/index.ts +2 -3
  485. package/frontend/src/features/onboard/index.ts +13 -3
  486. package/frontend/src/features/realtime/components/ChannelRow.tsx +83 -0
  487. package/frontend/src/features/realtime/components/EditChannelModal.tsx +246 -0
  488. package/frontend/src/features/realtime/components/MessageRow.tsx +85 -0
  489. package/frontend/src/features/realtime/components/RealtimeEmptyState.tsx +30 -0
  490. package/frontend/src/features/realtime/hooks/useRealtime.ts +218 -0
  491. package/frontend/src/features/realtime/index.ts +11 -0
  492. package/frontend/src/features/realtime/pages/RealtimeChannelsPage.tsx +172 -0
  493. package/frontend/src/features/realtime/pages/RealtimeMessagesPage.tsx +211 -0
  494. package/frontend/src/features/realtime/pages/RealtimePermissionsPage.tsx +191 -0
  495. package/frontend/src/features/realtime/services/realtime.service.ts +107 -0
  496. package/frontend/src/features/storage/components/BucketEmptyState.tsx +9 -6
  497. package/frontend/src/features/storage/components/BucketFormDialog.tsx +25 -41
  498. package/frontend/src/features/storage/components/FilePreviewDialog.tsx +20 -8
  499. package/frontend/src/features/storage/components/StorageDataGrid.tsx +4 -3
  500. package/frontend/src/features/storage/components/StorageManager.tsx +23 -34
  501. package/frontend/src/features/storage/components/index.ts +12 -0
  502. package/frontend/src/features/storage/hooks/useStorage.ts +208 -0
  503. package/frontend/src/features/storage/{page → pages}/StoragePage.tsx +41 -143
  504. package/frontend/src/features/storage/services/storage.service.ts +22 -1
  505. package/frontend/src/features/visualizer/components/AuthNode.tsx +72 -56
  506. package/frontend/src/features/visualizer/components/BucketNode.tsx +4 -4
  507. package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +108 -80
  508. package/frontend/src/features/visualizer/components/TableNode.tsx +34 -41
  509. package/frontend/src/features/visualizer/components/VisualizerSkeleton.tsx +12 -4
  510. package/frontend/src/features/visualizer/pages/VisualizerPage.tsx +97 -0
  511. package/frontend/src/index.css +1 -0
  512. package/frontend/src/lib/analytics/posthog.tsx +27 -0
  513. package/frontend/src/lib/contexts/AuthContext.tsx +38 -31
  514. package/frontend/src/lib/contexts/SocketContext.tsx +123 -80
  515. package/frontend/src/{features/metadata → lib}/hooks/useMetadata.ts +1 -1
  516. package/frontend/src/lib/hooks/useToast.tsx +6 -2
  517. package/frontend/src/lib/routing/AppRoutes.tsx +99 -0
  518. package/frontend/src/lib/routing/RequireAuth.tsx +27 -0
  519. package/frontend/src/lib/utils/cloudMessaging.ts +20 -0
  520. package/frontend/src/lib/utils/menuItems.ts +207 -0
  521. package/frontend/src/lib/utils/{validation-schemas.ts → schemaValidations.ts} +10 -5
  522. package/frontend/src/lib/utils/utils.ts +32 -1
  523. package/frontend/src/vite-env.d.ts +1 -0
  524. package/frontend/tsconfig.json +25 -25
  525. package/frontend/tsconfig.node.json +9 -9
  526. package/frontend/vite.config.ts +5 -3
  527. package/functions/deno.json +24 -24
  528. package/functions/server.ts +315 -290
  529. package/functions/worker-template.js +15 -4
  530. package/i18n/README.ar.md +130 -0
  531. package/i18n/README.de.md +130 -0
  532. package/i18n/README.es.md +154 -0
  533. package/i18n/README.fr.md +134 -0
  534. package/i18n/README.hi.md +129 -0
  535. package/i18n/README.ja.md +174 -0
  536. package/i18n/README.ko.md +137 -0
  537. package/i18n/README.pt-BR.md +131 -0
  538. package/i18n/README.ru.md +129 -0
  539. package/i18n/README.zh-CN.md +133 -0
  540. package/openapi/ai.yaml +715 -688
  541. package/openapi/auth.yaml +1244 -563
  542. package/openapi/email.yaml +158 -0
  543. package/openapi/functions.yaml +475 -475
  544. package/openapi/health.yaml +29 -29
  545. package/openapi/logs.yaml +223 -223
  546. package/openapi/metadata.yaml +177 -177
  547. package/openapi/realtime.yaml +699 -0
  548. package/openapi/records.yaml +381 -381
  549. package/openapi/secrets.yaml +370 -370
  550. package/openapi/storage.yaml +875 -875
  551. package/openapi/tables.yaml +463 -463
  552. package/package.json +97 -88
  553. package/shared-schemas/package.json +31 -31
  554. package/shared-schemas/src/ai-api.schema.ts +34 -58
  555. package/shared-schemas/src/ai.schema.ts +63 -54
  556. package/shared-schemas/src/auth-api.schema.ts +352 -193
  557. package/shared-schemas/src/auth.schema.ts +43 -7
  558. package/shared-schemas/src/cloud-events.schema.ts +57 -0
  559. package/shared-schemas/src/database-api.schema.ts +35 -4
  560. package/shared-schemas/src/database.schema.ts +40 -1
  561. package/shared-schemas/src/docs.schema.ts +26 -0
  562. package/shared-schemas/src/email-api.schema.ts +30 -0
  563. package/shared-schemas/src/index.ts +5 -0
  564. package/shared-schemas/src/logs-api.schema.ts +7 -1
  565. package/shared-schemas/src/logs.schema.ts +26 -0
  566. package/shared-schemas/src/metadata.schema.ts +18 -4
  567. package/shared-schemas/src/realtime-api.schema.ts +111 -0
  568. package/shared-schemas/src/realtime.schema.ts +143 -0
  569. package/shared-schemas/tsconfig.json +21 -21
  570. package/tsconfig.json +7 -7
  571. package/zeabur/README.md +13 -0
  572. package/zeabur/template.yml +1032 -0
  573. package/.github/workflows/deploy-aws.yml +0 -130
  574. package/backend/src/api/routes/agent.ts +0 -29
  575. package/backend/src/api/routes/auth.oauth.ts +0 -482
  576. package/backend/src/api/routes/auth.ts +0 -386
  577. package/backend/src/api/routes/docs.ts +0 -66
  578. package/backend/src/api/routes/functions.ts +0 -183
  579. package/backend/src/api/routes/openapi.ts +0 -82
  580. package/backend/src/api/routes/usage.ts +0 -96
  581. package/backend/src/core/ai/client.ts +0 -242
  582. package/backend/src/core/ai/model.ts +0 -117
  583. package/backend/src/core/auth/auth.ts +0 -780
  584. package/backend/src/core/database/manager.ts +0 -178
  585. package/backend/src/core/database/table.ts +0 -772
  586. package/backend/src/core/documentation/agent.ts +0 -689
  587. package/backend/src/core/documentation/openapi.ts +0 -856
  588. package/backend/src/core/logs/analytics.ts +0 -76
  589. package/backend/src/core/logs/providers/localdb.provider.ts +0 -246
  590. package/backend/src/core/socket/socket.ts +0 -388
  591. package/backend/src/core/storage/storage.ts +0 -923
  592. package/backend/src/utils/cloud-token.ts +0 -39
  593. package/backend/src/utils/helpers.ts +0 -49
  594. package/backend/src/utils/uuid.ts +0 -9
  595. package/backend/tests/manual/test-better-auth.sh +0 -303
  596. package/docker-init/db/logs.sql +0 -9
  597. package/frontend/README.md +0 -112
  598. package/frontend/src/components/datagrid/index.tsx +0 -20
  599. package/frontend/src/components/layout/CloudLayout.tsx +0 -95
  600. package/frontend/src/features/ai/components/AIConfigDialog.tsx +0 -76
  601. package/frontend/src/features/ai/components/AIConfigForm.tsx +0 -222
  602. package/frontend/src/features/ai/components/fields/ModalityField.tsx +0 -87
  603. package/frontend/src/features/ai/components/fields/ModelSelectionField.tsx +0 -134
  604. package/frontend/src/features/ai/components/fields/SystemPromptField.tsx +0 -33
  605. package/frontend/src/features/ai/page/AIPage.tsx +0 -178
  606. package/frontend/src/features/auth/components/AddOAuthDialog.tsx +0 -106
  607. package/frontend/src/features/auth/components/AuthMethodTab.tsx +0 -238
  608. package/frontend/src/features/auth/components/UsersTab.tsx +0 -114
  609. package/frontend/src/features/auth/page/AuthenticationPage.tsx +0 -169
  610. package/frontend/src/features/dashboard/page/DashboardPage.tsx +0 -194
  611. package/frontend/src/features/database/hooks/UseLinkModal.tsx +0 -78
  612. package/frontend/src/features/functions/components/FunctionViewer.tsx +0 -46
  613. package/frontend/src/features/functions/components/FunctionsContent.tsx +0 -88
  614. package/frontend/src/features/functions/page/FunctionsPage.tsx +0 -28
  615. package/frontend/src/features/login/components/AuthErrorBoundary.tsx +0 -87
  616. package/frontend/src/features/login/components/PrivateRoute.tsx +0 -24
  617. package/frontend/src/features/login/page/CloudLoginPage.tsx +0 -93
  618. package/frontend/src/features/logs/components/AnalyticsLogsTable.tsx +0 -313
  619. package/frontend/src/features/logs/components/LogsTable.tsx +0 -199
  620. package/frontend/src/features/logs/page/AnalyticsLogsPage.tsx +0 -530
  621. package/frontend/src/features/metadata/index.ts +0 -0
  622. package/frontend/src/features/metadata/page/MetadataPage.tsx +0 -136
  623. package/frontend/src/features/onboard/components/CompletionCard.tsx +0 -41
  624. package/frontend/src/features/onboard/components/OnboardButton.tsx +0 -84
  625. package/frontend/src/features/onboard/components/StepContent.tsx +0 -91
  626. package/frontend/src/features/onboard/components/TestConnectionStep.tsx +0 -53
  627. package/frontend/src/features/onboard/components/mcp/McpInstallation.tsx +0 -144
  628. package/frontend/src/features/onboard/page/OnBoardPage.tsx +0 -104
  629. package/frontend/src/features/onboard/types.ts +0 -8
  630. package/frontend/src/features/visualizer/page/VisualizerPage.tsx +0 -127
  631. package/frontend/src/lib/contexts/OnboardStepContext.tsx +0 -68
  632. package/frontend/src/lib/hooks/useOnboardingCompletion.ts +0 -29
  633. /package/backend/src/api/{middleware → middlewares}/error.ts +0 -0
  634. /package/backend/src/api/{middleware → middlewares}/upload.ts +0 -0
  635. /package/frontend/src/{features/metadata → lib}/services/metadata.service.ts +0 -0
@@ -1,169 +0,0 @@
1
- import { useState } from 'react';
2
- import { useLocation } from 'react-router-dom';
3
- import { UserPlus, Users, Key } from 'lucide-react';
4
- import { Button, SearchInput, SelectionClearButton, DeleteActionButton } from '@/components';
5
- import { UsersTab } from '@/features/auth/components/UsersTab';
6
- import { Tooltip, TooltipContent, TooltipProvider } from '@/components/radix/Tooltip';
7
- import { UserFormDialog } from '@/features/auth/components/UserFormDialog';
8
- import { AuthMethodTab } from '@/features/auth/components/AuthMethodTab';
9
- import { ConfirmDialog } from '@/components/ConfirmDialog';
10
- import { authService } from '@/features/auth/services/auth.service';
11
- import { useToast } from '@/lib/hooks/useToast';
12
- import { cn } from '@/lib/utils/utils';
13
- import { useUsers } from '@/features/auth/hooks/useUsers';
14
-
15
- export default function AuthenticationPage() {
16
- const location = useLocation();
17
- const [selectedSection, setSelectedSection] = useState<string>(
18
- location.state?.initialTab || 'users'
19
- );
20
- const [searchQuery, setSearchQuery] = useState('');
21
- const [addDialogOpen, setAddDialogOpen] = useState(false);
22
- const [confirmDeleteOpen, setConfirmDeleteOpen] = useState(false);
23
- const [selectedRows, setSelectedRows] = useState<Set<string>>(new Set());
24
-
25
- const { showToast } = useToast();
26
- const { refetch } = useUsers();
27
-
28
- const handleBulkDelete = async () => {
29
- if (selectedRows.size === 0) {
30
- return;
31
- }
32
-
33
- try {
34
- const userIds = Array.from(selectedRows);
35
- await authService.deleteUsers(userIds);
36
- void refetch();
37
- setSelectedRows(new Set());
38
- showToast(
39
- `${userIds.length} user${userIds.length > 1 ? 's' : ''} deleted successfully`,
40
- 'success'
41
- );
42
- } catch (error) {
43
- showToast(error instanceof Error ? error.message : 'Failed to delete users', 'error');
44
- }
45
- };
46
-
47
- const authSections = [
48
- {
49
- id: 'users',
50
- name: 'Users',
51
- icon: Users,
52
- description: 'Manage user accounts',
53
- },
54
- {
55
- id: 'auth-methods',
56
- name: 'Auth Methods',
57
- icon: Key,
58
- description: 'Configure authentication',
59
- },
60
- ];
61
-
62
- return (
63
- <div className="h-full bg-slate-50 dark:bg-neutral-800 flex flex-col overflow-hidden">
64
- {/* Tab Navigation */}
65
- <div className="h-12 flex items-center gap-6 px-6 border-b border-border-gray dark:border-neutral-700 relative">
66
- {authSections.map((section) => (
67
- <button
68
- key={section.id}
69
- onClick={() => setSelectedSection(section.id)}
70
- className={cn(
71
- 'flex h-full items-center gap-2 px-0 text-base font-semibold transition-colors relative',
72
- selectedSection === section.id
73
- ? 'text-black dark:text-white'
74
- : 'text-zinc-500 hover:text-zinc-700 dark:text-zinc-400 dark:hover:text-zinc-300'
75
- )}
76
- >
77
- {section.name}
78
- {selectedSection === section.id && (
79
- <div className="absolute bottom-0 left-0 right-0 h-0.5 bg-black dark:bg-white" />
80
- )}
81
- </button>
82
- ))}
83
- </div>
84
-
85
- {/* Content Area */}
86
- <div className="flex-1 flex flex-col overflow-hidden">
87
- {/* Users Section Header */}
88
- {selectedSection === 'users' && (
89
- <div className="px-3 py-4 dark:bg-neutral-800">
90
- <div className="flex items-center justify-between">
91
- {selectedRows.size > 0 ? (
92
- <div className="flex items-center gap-3">
93
- <SelectionClearButton
94
- selectedCount={selectedRows.size}
95
- itemType="user"
96
- onClear={() => setSelectedRows(new Set())}
97
- />
98
- <DeleteActionButton
99
- selectedCount={selectedRows.size}
100
- itemType="user"
101
- onDelete={() => setConfirmDeleteOpen(true)}
102
- />
103
- </div>
104
- ) : (
105
- <SearchInput
106
- value={searchQuery}
107
- onChange={setSearchQuery}
108
- placeholder="Search Users by Name or Email"
109
- className="flex-1 max-w-80 dark:bg-neutral-800 dark:text-white dark:border-neutral-700"
110
- debounceTime={300}
111
- />
112
- )}
113
- <div className="flex items-center gap-2">
114
- {selectedRows.size === 0 && (
115
- <>
116
- <TooltipProvider>
117
- <Tooltip>
118
- <TooltipContent>
119
- <p>Refresh</p>
120
- </TooltipContent>
121
- </Tooltip>
122
- </TooltipProvider>
123
- <Button
124
- className="h-10 px-4 font-medium dark:bg-emerald-300 dark:text-black"
125
- onClick={() => setAddDialogOpen(true)}
126
- >
127
- <UserPlus className="h-4 w-4 mr-2" />
128
- New User
129
- </Button>
130
- </>
131
- )}
132
- </div>
133
- </div>
134
- </div>
135
- )}
136
-
137
- {/* Main Content */}
138
-
139
- {selectedSection === 'users' && (
140
- <UsersTab
141
- searchQuery={searchQuery}
142
- selectedRows={selectedRows}
143
- onSelectedRowsChange={setSelectedRows}
144
- />
145
- )}
146
-
147
- {selectedSection === 'auth-methods' && <AuthMethodTab />}
148
- </div>
149
-
150
- <UserFormDialog open={addDialogOpen} onOpenChange={setAddDialogOpen} />
151
-
152
- <ConfirmDialog
153
- open={confirmDeleteOpen}
154
- onOpenChange={setConfirmDeleteOpen}
155
- title={`Delete ${selectedRows.size} ${selectedRows.size === 1 ? 'User' : 'Users'}`}
156
- description={
157
- <span>
158
- Are you sure to <strong>permanently delete {selectedRows.size}</strong>{' '}
159
- {selectedRows.size === 1 ? 'user' : 'users'}? This action cannot be undone.
160
- </span>
161
- }
162
- confirmText="Delete"
163
- cancelText="Cancel"
164
- destructive
165
- onConfirm={handleBulkDelete}
166
- />
167
- </div>
168
- );
169
- }
@@ -1,194 +0,0 @@
1
- import { useNavigate, useLocation } from 'react-router-dom';
2
- import { useMetadata } from '@/features/metadata/hooks/useMetadata';
3
- import { Skeleton } from '@/components/radix/Skeleton';
4
- import { Card, CardContent } from '@/components/radix/Card';
5
- import { Users, Database, HardDrive, ArrowLeftRight, Link2 } from 'lucide-react';
6
- import { useUsers } from '@/features/auth';
7
-
8
- export default function DashboardPage() {
9
- const navigate = useNavigate();
10
- const location = useLocation();
11
- const { metadata, auth, tables, storage, isLoading } = useMetadata();
12
- const { totalUsers } = useUsers();
13
-
14
- const handleNavigateTo = (to: string, state?: { initialTab?: string }) => {
15
- const basePath = location.pathname.includes('/cloud')
16
- ? location.pathname.replace('/dashboard', '')
17
- : location.pathname;
18
- void navigate(`${basePath}/${to}`, { state });
19
- };
20
-
21
- const handleConnectInsForge = () => {
22
- if (window.parent !== window) {
23
- // Send message to parent window to open onboarding overlay
24
- window.parent.postMessage(
25
- {
26
- type: 'SHOW_CONNECT_OVERLAY',
27
- },
28
- '*'
29
- );
30
- } else {
31
- void handleNavigateTo('onboard');
32
- }
33
- };
34
-
35
- return (
36
- <main className="h-full bg-white dark:bg-neutral-800">
37
- <div className="flex justify-center py-6 px-0">
38
- <div className="flex flex-col gap-6 w-full max-w-[1080px] px-6">
39
- {/* Dashboard Header */}
40
- <div className="flex items-center justify-between w-full">
41
- <h1 className="text-xl font-semibold text-gray-900 dark:text-white tracking-[-0.1px]">
42
- Dashboard
43
- </h1>
44
- </div>
45
-
46
- {/* Connect InsForge Card */}
47
- <Card className="w-full bg-white dark:bg-[#333333] rounded-lg border border-gray-200 dark:border-neutral-700 shadow-[0px_1px_3px_0px_rgba(0,0,0,0.1)]">
48
- <CardContent className="px-8 py-6">
49
- <div className="flex items-center justify-between">
50
- <div className="flex flex-col gap-2">
51
- <div className="flex items-center gap-2">
52
- <Link2 className="w-5 h-5 text-black dark:text-white" />
53
- <h3 className="text-lg font-semibold text-gray-900 dark:text-white">
54
- Connect InsForge
55
- </h3>
56
- </div>
57
- <p className="text-sm text-gray-600 dark:text-neutral-400">
58
- With InsForge connected, your agent takes care of the backend for you
59
- </p>
60
- </div>
61
- <button
62
- type="button"
63
- className="flex items-center gap-2 px-4 py-2 bg-emerald-300 hover:bg-emerald-400 text-black rounded font-medium text-sm transition-colors cursor-pointer"
64
- onClick={handleConnectInsForge}
65
- >
66
- <ArrowLeftRight className="w-5 h-5" />
67
- Connect
68
- </button>
69
- </div>
70
- </CardContent>
71
- </Card>
72
-
73
- {/* Stats Cards */}
74
- <div className="flex gap-6 w-full">
75
- {/* AUTH Card */}
76
- <Card className="flex-1 bg-white dark:bg-[#333333] rounded-lg border border-gray-200 dark:border-neutral-700 shadow-[0px_1px_3px_0px_rgba(0,0,0,0.1)] h-[280px]">
77
- <CardContent className="p-8 h-full flex flex-col justify-between">
78
- <div className="flex flex-col gap-2">
79
- <div className="flex items-center gap-2 h-7">
80
- <Users className="w-5 h-5 text-gray-700 dark:text-white" />
81
- <span className="text-base font-normal text-gray-900 dark:text-white">
82
- AUTH
83
- </span>
84
- </div>
85
- </div>
86
- <div className="flex flex-col gap-4">
87
- <div className="flex items-baseline gap-2">
88
- {isLoading ? (
89
- <Skeleton className="h-8 w-16 bg-gray-200 dark:bg-neutral-700" />
90
- ) : (
91
- <>
92
- <span className="text-2xl font-normal text-gray-900 dark:text-white tracking-[-0.144px]">
93
- {(totalUsers || 0).toLocaleString()}
94
- </span>
95
- <span className="text-sm font-normal text-gray-500 dark:text-neutral-400">
96
- {totalUsers === 1 ? 'user' : 'users'}
97
- </span>
98
- </>
99
- )}
100
- </div>
101
- {isLoading ? (
102
- <Skeleton className="h-5 w-36 bg-gray-200 dark:bg-neutral-700" />
103
- ) : (
104
- <p className="text-base text-gray-500 dark:text-neutral-400">
105
- {(() => {
106
- const authCount = auth?.oauths.length || 0;
107
- return `${authCount} OAuth ${authCount === 1 ? 'provider' : 'providers'} enabled`;
108
- })()}
109
- </p>
110
- )}
111
- </div>
112
- </CardContent>
113
- </Card>
114
-
115
- {/* Database Card */}
116
- <Card className="flex-1 bg-white dark:bg-[#333333] rounded-lg border border-gray-200 dark:border-neutral-700 shadow-[0px_1px_3px_0px_rgba(0,0,0,0.1)] h-[280px]">
117
- <CardContent className="p-8 h-full flex flex-col justify-between">
118
- <div className="flex flex-col gap-2">
119
- <div className="flex items-center gap-2 h-7">
120
- <Database className="w-5 h-5 text-gray-700 dark:text-white" />
121
- <span className="text-base font-normal text-gray-900 dark:text-white">
122
- Database
123
- </span>
124
- </div>
125
- </div>
126
- <div className="flex flex-col gap-4">
127
- <div className="flex items-baseline gap-2">
128
- {isLoading ? (
129
- <Skeleton className="h-8 w-14 bg-gray-200 dark:bg-neutral-700" />
130
- ) : (
131
- <>
132
- <span className="text-2xl font-normal text-gray-900 dark:text-white tracking-[-0.144px]">
133
- {(metadata?.database?.totalSize || 0).toFixed(2)}
134
- </span>
135
- <span className="text-sm font-normal text-gray-500 dark:text-neutral-400">
136
- GB
137
- </span>
138
- </>
139
- )}
140
- </div>
141
- {isLoading ? (
142
- <Skeleton className="h-5 w-16 bg-gray-200 dark:bg-neutral-700" />
143
- ) : (
144
- <p className="text-base text-gray-500 dark:text-neutral-400">
145
- {tables.length || 0} {tables.length === 1 ? 'Table' : 'Tables'}
146
- </p>
147
- )}
148
- </div>
149
- </CardContent>
150
- </Card>
151
-
152
- {/* Storage Card */}
153
- <Card className="flex-1 bg-white dark:bg-[#333333] rounded-lg border border-gray-200 dark:border-neutral-700 shadow-[0px_1px_3px_0px_rgba(0,0,0,0.1)] h-[280px]">
154
- <CardContent className="p-8 h-full flex flex-col justify-between">
155
- <div className="flex flex-col gap-2">
156
- <div className="flex items-center gap-2 h-7">
157
- <HardDrive className="w-5 h-5 text-gray-700 dark:text-white" />
158
- <span className="text-base font-normal text-gray-900 dark:text-white">
159
- Storage
160
- </span>
161
- </div>
162
- </div>
163
- <div className="flex flex-col gap-4">
164
- <div className="flex items-baseline gap-2">
165
- {isLoading ? (
166
- <Skeleton className="h-8 w-14 bg-gray-200 dark:bg-neutral-700" />
167
- ) : (
168
- <>
169
- <span className="text-2xl font-normal text-gray-900 dark:text-white tracking-[-0.144px]">
170
- {(storage?.totalSize || 0).toFixed(2)}
171
- </span>
172
- <span className="text-sm font-normal text-gray-500 dark:text-neutral-400">
173
- GB
174
- </span>
175
- </>
176
- )}
177
- </div>
178
- {isLoading ? (
179
- <Skeleton className="h-5 w-20 bg-gray-200 dark:bg-neutral-700" />
180
- ) : (
181
- <p className="text-base text-gray-500 dark:text-neutral-400">
182
- {storage?.buckets?.length || 0}{' '}
183
- {storage?.buckets?.length === 1 ? 'Bucket' : 'Buckets'}
184
- </p>
185
- )}
186
- </div>
187
- </CardContent>
188
- </Card>
189
- </div>
190
- </div>
191
- </div>
192
- </main>
193
- );
194
- }
@@ -1,78 +0,0 @@
1
- import { createContext, useContext, useState, ReactNode } from 'react';
2
- import type { DatabaseRecord } from '@/components/datagrid';
3
-
4
- interface LinkModalState {
5
- isOpen: boolean;
6
- referenceTable: string | null;
7
- referenceColumn: string | null;
8
- currentValue: string | null;
9
- onSelectRecord: ((record: DatabaseRecord) => void) | null;
10
- }
11
-
12
- interface LinkModalContextType {
13
- modalState: LinkModalState;
14
- openModal: (config: {
15
- referenceTable: string;
16
- referenceColumn: string;
17
- currentValue?: string | null;
18
- onSelectRecord: (record: DatabaseRecord) => void;
19
- }) => void;
20
- closeModal: () => void;
21
- }
22
-
23
- const LinkModalContext = createContext<LinkModalContextType | undefined>(undefined);
24
-
25
- const initialState: LinkModalState = {
26
- isOpen: false,
27
- referenceTable: null,
28
- referenceColumn: null,
29
- currentValue: null,
30
- onSelectRecord: null,
31
- };
32
-
33
- interface LinkModalProviderProps {
34
- children: ReactNode;
35
- }
36
-
37
- export function LinkModalProvider({ children }: LinkModalProviderProps) {
38
- const [modalState, setModalState] = useState<LinkModalState>(initialState);
39
-
40
- const openModal = (config: {
41
- referenceTable: string;
42
- referenceColumn: string;
43
- currentValue?: string | null;
44
- onSelectRecord: (record: DatabaseRecord) => void;
45
- }) => {
46
- setModalState({
47
- isOpen: true,
48
- referenceTable: config.referenceTable,
49
- referenceColumn: config.referenceColumn,
50
- currentValue: config.currentValue || null,
51
- onSelectRecord: config.onSelectRecord,
52
- });
53
- };
54
-
55
- const closeModal = () => {
56
- setModalState(initialState);
57
- };
58
-
59
- return (
60
- <LinkModalContext.Provider
61
- value={{
62
- modalState,
63
- openModal,
64
- closeModal,
65
- }}
66
- >
67
- {children}
68
- </LinkModalContext.Provider>
69
- );
70
- }
71
-
72
- export function useLinkModal() {
73
- const context = useContext(LinkModalContext);
74
- if (context === undefined) {
75
- throw new Error('useLinkModal must be used within a LinkModalProvider');
76
- }
77
- return context;
78
- }
@@ -1,46 +0,0 @@
1
- interface CodeEditorProps {
2
- code: string;
3
- }
4
-
5
- export function CodeEditor({ code }: CodeEditorProps) {
6
- // Split code into lines for line numbers
7
- const lines = code.split('\n');
8
-
9
- return (
10
- <div className="h-full bg-white dark:bg-neutral-900 overflow-auto">
11
- <div className="flex min-h-full">
12
- {/* Line Numbers */}
13
- <div className="flex-shrink-0 bg-gray-50 dark:bg-neutral-800 px-3 py-4 font-mono text-sm text-gray-500 dark:text-gray-400 select-none">
14
- {lines.map((_, index) => (
15
- <div key={index} className="leading-6 text-right min-w-[2rem]">
16
- {index + 1}
17
- </div>
18
- ))}
19
- {/* Extra line numbers for blank lines */}
20
- {Array.from({ length: 6 }, (_, i) => (
21
- <div key={`extra-${i}`} className="leading-6 text-right min-w-[2rem]">
22
- {lines.length + 1 + i}
23
- </div>
24
- ))}
25
- </div>
26
-
27
- {/* Code Area */}
28
- <div className="flex-1">
29
- <pre className="font-mono text-sm leading-6 p-4 m-0 bg-transparent text-gray-900 dark:text-white">
30
- {lines.map((line, index) => (
31
- <div key={index} className="min-h-[1.5rem]">
32
- {line || <span>&nbsp;</span>}
33
- </div>
34
- ))}
35
- {/* Some blank lines at the end */}
36
- {Array.from({ length: 6 }, (_, i) => (
37
- <div key={`blank-${i}`} className="min-h-[1.5rem]">
38
- &nbsp;
39
- </div>
40
- ))}
41
- </pre>
42
- </div>
43
- </div>
44
- </div>
45
- );
46
- }
@@ -1,88 +0,0 @@
1
- import { ChevronRight } from 'lucide-react';
2
- import { Skeleton } from '@/components/radix/Skeleton';
3
- import { FunctionRow } from './FunctionRow';
4
- import { CodeEditor } from './FunctionViewer';
5
- import FunctionEmptyState from './FunctionEmptyState';
6
- import { useFunctions } from '../hooks/useFunctions';
7
- import { useToast } from '@/lib/hooks/useToast';
8
- import { useEffect, useRef } from 'react';
9
-
10
- export function FunctionsContent() {
11
- const toastShownRef = useRef(false);
12
- const { showToast } = useToast();
13
- const {
14
- functions,
15
- isRuntimeAvailable,
16
- selectedFunction,
17
- isLoading: loading,
18
- selectFunction,
19
- clearSelection,
20
- } = useFunctions();
21
-
22
- useEffect(() => {
23
- if (!isRuntimeAvailable && !toastShownRef.current) {
24
- toastShownRef.current = true;
25
- showToast('Function container is unhealthy.', 'error');
26
- }
27
- }, [isRuntimeAvailable, showToast]);
28
-
29
- // If a function is selected, show the detail view
30
- if (selectedFunction) {
31
- return (
32
- <div className="flex flex-col h-full">
33
- <div className="flex items-center gap-2.5 p-4 border-b border-border-gray dark:border-neutral-600">
34
- <button
35
- onClick={clearSelection}
36
- className="text-xl text-zinc-500 dark:text-neutral-400 hover:text-zinc-950 dark:hover:text-white transition-colors"
37
- >
38
- Functions
39
- </button>
40
- <ChevronRight className="w-5 h-5 text-muted-foreground dark:text-neutral-400" />
41
- <p className="text-xl text-zinc-950 dark:text-white">{selectedFunction.name}</p>
42
- </div>
43
-
44
- <div className="flex-1 min-h-0">
45
- <CodeEditor code={selectedFunction.code || '// No code available'} />
46
- </div>
47
- </div>
48
- );
49
- }
50
-
51
- // Default list view
52
- return (
53
- <div className="flex flex-col gap-6 p-4">
54
- <p className="h-7 text-xl text-zinc-950 dark:text-white">Functions</p>
55
- <div className="flex flex-col gap-2">
56
- {/* Table Header */}
57
- <div className="grid grid-cols-12 px-3 text-sm text-muted-foreground dark:text-neutral-400">
58
- <div className="col-span-2 py-1 px-3">Name</div>
59
- <div className="col-span-6 py-1 px-3">URL</div>
60
- <div className="col-span-2 py-1 px-3">Created</div>
61
- <div className="col-span-2 py-1 px-3">Last Update</div>
62
- </div>
63
- {loading ? (
64
- <>
65
- {[...Array(4)].map((_, i) => (
66
- <Skeleton key={i} className="h-14 rounded-[8px] cols-span-full" />
67
- ))}
68
- </>
69
- ) : functions.length >= 1 ? (
70
- <>
71
- {functions.map((func) => (
72
- <FunctionRow
73
- key={func.id}
74
- function={func}
75
- onClick={() => void selectFunction(func)}
76
- className="cols-span-full"
77
- />
78
- ))}
79
- </>
80
- ) : (
81
- <div className="cols-span-full">
82
- <FunctionEmptyState />
83
- </div>
84
- )}
85
- </div>
86
- </div>
87
- );
88
- }
@@ -1,28 +0,0 @@
1
- import { useState, useEffect } from 'react';
2
- import { FunctionsSidebar } from '@/features/functions/components/FunctionsSidebar';
3
- import { FunctionsContent } from '@/features/functions/components/FunctionsContent';
4
- import { SecretsContent } from '@/features/functions/components/SecretsContent';
5
-
6
- export default function FunctionsPage() {
7
- // Load selected section from localStorage on mount
8
- const [selectedSection, setSelectedSection] = useState<'functions' | 'secrets'>(() => {
9
- return (
10
- (localStorage.getItem('selectedFunctionSection') as 'functions' | 'secrets') || 'functions'
11
- );
12
- });
13
-
14
- // Save selected section to localStorage when it changes
15
- useEffect(() => {
16
- localStorage.setItem('selectedFunctionSection', selectedSection);
17
- }, [selectedSection]);
18
-
19
- return (
20
- <div className="h-full flex">
21
- <FunctionsSidebar selectedSection={selectedSection} onSectionSelect={setSelectedSection} />
22
-
23
- <div className="flex-1 flex flex-col overflow-hidden">
24
- {selectedSection === 'functions' ? <FunctionsContent /> : <SecretsContent />}
25
- </div>
26
- </div>
27
- );
28
- }