insforge 0.3.2 → 1.2.10

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 (507) hide show
  1. package/.claude-plugin/marketplace.json +20 -0
  2. package/.cursor/rules/cursor-rules.mdc +94 -0
  3. package/.dockerignore +3 -0
  4. package/.env.example +33 -4
  5. package/.github/ISSUE_TEMPLATE/bug_report.yml +13 -60
  6. package/.github/ISSUE_TEMPLATE/config.yml +2 -2
  7. package/.github/ISSUE_TEMPLATE/feature_request.yml +10 -63
  8. package/.github/PULL_REQUEST_TEMPLATE.md +7 -0
  9. package/.github/workflows/build-image.yml +2 -1
  10. package/.github/workflows/e2e.yml +63 -0
  11. package/CHANGELOG.md +41 -0
  12. package/CLAUDE_PLUGIN.md +104 -0
  13. package/CODE_OF_CONDUCT.md +128 -0
  14. package/CONTRIBUTING.md +1 -1
  15. package/Dockerfile +4 -1
  16. package/README.md +66 -18
  17. package/assets/mcpInstallv2.png +0 -0
  18. package/assets/sampleResponse.png +0 -0
  19. package/auth/index.html +13 -0
  20. package/auth/package.json +28 -0
  21. package/auth/public/favicon.ico +0 -0
  22. package/auth/src/App.tsx +33 -0
  23. package/auth/src/components/ErrorCard.tsx +37 -0
  24. package/auth/src/components/Layout.tsx +13 -0
  25. package/auth/src/index.css +19 -0
  26. package/auth/src/lib/broadcastService.ts +115 -0
  27. package/auth/src/lib/utils.ts +11 -0
  28. package/auth/src/main.tsx +22 -0
  29. package/auth/src/pages/ForgotPasswordPage.tsx +11 -0
  30. package/auth/src/pages/ResetPasswordPage.tsx +11 -0
  31. package/auth/src/pages/SignInPage.tsx +57 -0
  32. package/auth/src/pages/SignUpPage.tsx +57 -0
  33. package/auth/src/pages/VerifyEmailPage.tsx +20 -0
  34. package/auth/src/vite-env.d.ts +10 -0
  35. package/auth/tsconfig.json +32 -0
  36. package/auth/tsconfig.node.json +11 -0
  37. package/auth/vite.config.ts +25 -0
  38. package/backend/package.json +9 -9
  39. package/backend/src/api/{middleware → middlewares}/auth.ts +8 -9
  40. package/backend/src/api/middlewares/rate-limiters.ts +127 -0
  41. package/backend/src/api/routes/{ai.ts → ai/index.routes.ts} +20 -24
  42. package/backend/src/api/routes/auth/index.routes.ts +570 -0
  43. package/backend/src/api/routes/auth/oauth.routes.ts +448 -0
  44. package/backend/src/api/routes/{database.advance.ts → database/advance.routes.ts} +107 -65
  45. package/backend/src/api/routes/database/index.routes.ts +13 -0
  46. package/backend/src/api/routes/{database.records.ts → database/records.routes.ts} +22 -8
  47. package/backend/src/api/routes/{database.tables.ts → database/tables.routes.ts} +20 -23
  48. package/backend/src/api/routes/docs/index.routes.ts +76 -0
  49. package/backend/src/api/routes/functions/index.routes.ts +188 -0
  50. package/backend/src/api/routes/{logs.ts → logs/index.routes.ts} +25 -30
  51. package/backend/src/api/routes/{metadata.ts → metadata/index.routes.ts} +21 -31
  52. package/backend/src/api/routes/{secrets.ts → secrets/index.routes.ts} +27 -22
  53. package/backend/src/api/routes/{storage.ts → storage/index.routes.ts} +34 -53
  54. package/backend/src/api/routes/usage/index.routes.ts +89 -0
  55. package/backend/src/infra/config/app.config.ts +51 -0
  56. package/backend/src/{core/database/manager.ts → infra/database/database.manager.ts} +76 -85
  57. package/backend/src/infra/database/migrations/013_create-auth-schema-functions.sql +44 -0
  58. package/backend/src/infra/database/migrations/014_add-updated-at-trigger-user-table.sql +8 -0
  59. package/backend/src/infra/database/migrations/015_create-auth-config-and-email-otp-tables.sql +60 -0
  60. package/backend/src/infra/database/migrations/016_update-auth-config-and-email-otp.sql +24 -0
  61. package/backend/src/{core/secrets/encryption.ts → infra/security/encryption.manager.ts} +3 -2
  62. package/backend/src/infra/security/token.manager.ts +125 -0
  63. package/backend/src/{core/socket/socket.ts → infra/socket/socket.manager.ts} +15 -15
  64. package/backend/src/providers/ai/openrouter.provider.ts +377 -0
  65. package/backend/src/providers/email/base.provider.ts +41 -0
  66. package/backend/src/providers/email/cloud.provider.ts +187 -0
  67. package/backend/src/{core/logs/providers → providers/logs}/base.provider.ts +11 -11
  68. package/backend/src/{core/logs/providers → providers/logs}/cloudwatch.provider.ts +61 -38
  69. package/backend/src/providers/logs/local.provider.ts +185 -0
  70. package/backend/src/providers/oauth/base.provider.ts +29 -0
  71. package/backend/src/providers/oauth/discord.provider.ts +195 -0
  72. package/backend/src/providers/oauth/facebook.provider.ts +194 -0
  73. package/backend/src/providers/oauth/github.provider.ts +208 -0
  74. package/backend/src/providers/oauth/google.provider.ts +249 -0
  75. package/backend/src/providers/oauth/index.ts +7 -0
  76. package/backend/src/providers/oauth/linkedin.provider.ts +240 -0
  77. package/backend/src/providers/oauth/microsoft.provider.ts +169 -0
  78. package/backend/src/providers/oauth/x.provider.ts +202 -0
  79. package/backend/src/providers/storage/base.provider.ts +29 -0
  80. package/backend/src/providers/storage/local.provider.ts +103 -0
  81. package/backend/src/providers/storage/s3.provider.ts +313 -0
  82. package/backend/src/server.ts +70 -74
  83. package/backend/src/{core/ai/config.ts → services/ai/ai-config.service.ts} +19 -24
  84. package/backend/src/services/ai/ai-model.service.ts +60 -0
  85. package/backend/src/{core/ai/usage.ts → services/ai/ai-usage.service.ts} +28 -35
  86. package/backend/src/{core/ai/chat.ts → services/ai/chat-completion.service.ts} +37 -24
  87. package/backend/src/services/ai/helpers.ts +64 -0
  88. package/backend/src/{core/ai/image.ts → services/ai/image-generation.service.ts} +17 -19
  89. package/backend/src/services/ai/index.ts +13 -0
  90. package/backend/src/services/auth/auth-config.service.ts +250 -0
  91. package/backend/src/services/auth/auth-otp.service.ts +424 -0
  92. package/backend/src/services/auth/auth.service.ts +1136 -0
  93. package/backend/src/services/auth/index.ts +4 -0
  94. package/backend/src/{core/auth/oauth.ts → services/auth/oauth-config.service.ts} +106 -52
  95. package/backend/src/{core/database/advance.ts → services/database/database-advance.service.ts} +97 -131
  96. package/backend/src/services/database/database-table.service.ts +811 -0
  97. package/backend/src/services/email/email.service.ts +75 -0
  98. package/backend/src/{core/functions/functions.ts → services/functions/function.service.ts} +95 -88
  99. package/backend/src/{core/logs/audit.ts → services/logs/audit.service.ts} +92 -75
  100. package/backend/src/services/logs/log.service.ts +73 -0
  101. package/backend/src/{core/secrets/secrets.ts → services/secrets/secret.service.ts} +48 -66
  102. package/backend/src/services/storage/storage.service.ts +617 -0
  103. package/backend/src/services/usage/usage.service.ts +149 -0
  104. package/backend/src/types/auth.ts +66 -2
  105. package/backend/src/types/email.ts +8 -0
  106. package/backend/src/types/error-constants.ts +4 -0
  107. package/backend/src/types/logs.ts +0 -29
  108. package/backend/src/{core/socket/types.ts → types/socket.ts} +5 -6
  109. package/backend/src/utils/environment.ts +9 -3
  110. package/backend/src/utils/logger.ts +20 -2
  111. package/backend/src/utils/seed.ts +150 -57
  112. package/backend/src/utils/sql-parser.ts +1 -1
  113. package/backend/src/utils/utils.ts +114 -0
  114. package/backend/src/utils/validations.ts +40 -4
  115. package/backend/tests/local/test-ai-config.sh +129 -0
  116. package/backend/tests/local/test-ai-usage.sh +80 -0
  117. package/backend/tests/local/test-auth-router.sh +1 -1
  118. package/backend/tests/local/test-e2e.sh +1 -1
  119. package/backend/tests/local/test-functions.sh +123 -0
  120. package/backend/tests/local/test-logs.sh +132 -0
  121. package/backend/tests/local/test-public-bucket.sh +3 -3
  122. package/backend/tests/local/test-secrets.sh +14 -12
  123. package/backend/tests/local/test-traditional-rest.sh +2 -2
  124. package/backend/tests/manual/test-rawsql-modes.sh +244 -0
  125. package/backend/tests/test-config.sh +37 -1
  126. package/backend/tests/unit/cloud-token.test.ts +48 -0
  127. package/backend/tests/unit/constant.test.ts +8 -0
  128. package/backend/tests/unit/email.test.ts +372 -0
  129. package/backend/tests/unit/environment.test.ts +59 -0
  130. package/backend/tests/unit/helpers.test.ts +63 -0
  131. package/backend/tests/unit/logger.test.ts +22 -0
  132. package/backend/tests/unit/rate-limit.test.ts +154 -0
  133. package/backend/tests/unit/response.test.ts +58 -0
  134. package/backend/tests/unit/sql-parser.test.ts +74 -0
  135. package/backend/tests/unit/uuid.test.ts +21 -0
  136. package/backend/tests/unit/validations.test.ts +80 -0
  137. package/backend/tsconfig.json +1 -1
  138. package/backend/vitest.config.ts +11 -0
  139. package/claude-plugin/.claude-plugin/plugin.json +24 -0
  140. package/claude-plugin/README.md +133 -0
  141. package/claude-plugin/skills/insforge-schema-patterns/SKILL.md +270 -0
  142. package/docker-compose.prod.yml +60 -4
  143. package/docker-compose.yml +65 -4
  144. package/docker-init/db/db-init.sql +6 -34
  145. package/docker-init/logs/vector.yml +236 -0
  146. package/docs/README.md +44 -0
  147. package/docs/changelog.mdx +67 -0
  148. package/docs/core-concepts/ai/architecture.mdx +373 -0
  149. package/docs/core-concepts/ai/sdk.mdx +213 -0
  150. package/docs/core-concepts/authentication/architecture.mdx +278 -0
  151. package/docs/core-concepts/authentication/sdk.mdx +414 -0
  152. package/docs/core-concepts/authentication/ui-components/customization.mdx +529 -0
  153. package/docs/core-concepts/authentication/ui-components/nextjs.mdx +221 -0
  154. package/docs/core-concepts/authentication/ui-components/react-router.mdx +184 -0
  155. package/docs/core-concepts/authentication/ui-components/react.mdx +129 -0
  156. package/docs/core-concepts/database/architecture.mdx +256 -0
  157. package/docs/core-concepts/database/sdk.mdx +382 -0
  158. package/docs/core-concepts/functions/architecture.mdx +105 -0
  159. package/docs/core-concepts/functions/sdk.mdx +184 -0
  160. package/docs/core-concepts/storage/architecture.mdx +243 -0
  161. package/docs/core-concepts/storage/sdk.mdx +253 -0
  162. package/docs/deployment/README.md +94 -0
  163. package/docs/deployment/deploy-to-aws-ec2.md +565 -0
  164. package/docs/deployment/deploy-to-azure-virtual-machines.md +313 -0
  165. package/docs/deployment/deploy-to-google-cloud-compute-engine.md +613 -0
  166. package/docs/deployment/deploy-to-render.md +441 -0
  167. package/docs/docs.json +210 -0
  168. package/docs/examples/framework-guides/nextjs.mdx +131 -0
  169. package/docs/examples/framework-guides/nuxt.mdx +165 -0
  170. package/docs/examples/framework-guides/react.mdx +165 -0
  171. package/docs/examples/framework-guides/svelte.mdx +153 -0
  172. package/docs/examples/framework-guides/vue.mdx +159 -0
  173. package/docs/examples/overview.mdx +67 -0
  174. package/docs/favicon.svg +19 -0
  175. package/docs/images/changelog/nov-2025/auth-components.webp +0 -0
  176. package/docs/images/changelog/nov-2025/database-metadata.webp +0 -0
  177. package/docs/images/changelog/nov-2025/quickstart-prompts.webp +0 -0
  178. package/docs/images/changelog/nov-2025/sql-editor.webp +0 -0
  179. package/docs/images/changelog/nov-2025/usage-page.webp +0 -0
  180. package/docs/images/changelog/october-2025/csv-upload.webp +0 -0
  181. package/docs/images/changelog/october-2025/logs-feature.webp +0 -0
  182. package/docs/images/changelog/october-2025/oauth-providers.webp +0 -0
  183. package/docs/images/checks-passed.png +0 -0
  184. package/docs/images/dashboard-connect-expanded.png +0 -0
  185. package/docs/images/dashboard-connect.png +0 -0
  186. package/docs/images/hero-dark.png +0 -0
  187. package/docs/images/hero-light.png +0 -0
  188. package/docs/images/icons/ai.svg +4 -0
  189. package/docs/images/icons/auth.svg +1 -0
  190. package/docs/images/icons/database.svg +1 -0
  191. package/docs/images/icons/function.svg +1 -0
  192. package/docs/images/icons/storage.svg +1 -0
  193. package/docs/images/logos/nextjs.svg +4 -0
  194. package/docs/images/logos/nuxt.svg +4 -0
  195. package/docs/images/logos/react.svg +5 -0
  196. package/docs/images/logos/svelte.svg +4 -0
  197. package/docs/images/logos/vue.svg +5 -0
  198. package/docs/images/mcp-install.png +0 -0
  199. package/docs/images/onboarding-mcp.png +0 -0
  200. package/docs/insforge-instructions-sdk.md +55 -374
  201. package/docs/introduction.mdx +45 -0
  202. package/docs/logo/dark.svg +22 -0
  203. package/docs/logo/light.svg +20 -0
  204. package/docs/partnership.mdx +647 -0
  205. package/docs/quickstart.mdx +83 -0
  206. package/docs/showcase/2048-arena.png +0 -0
  207. package/docs/showcase/framegen-cloud.png +0 -0
  208. package/docs/showcase/line-connect-race.png +0 -0
  209. package/docs/showcase/moment-vibe.png +0 -0
  210. package/docs/showcase/national-flags.png +0 -0
  211. package/docs/showcase/pokemon-vibe.png +0 -0
  212. package/docs/showcase/pure-browse-buy.png +0 -0
  213. package/docs/showcase.mdx +52 -0
  214. package/docs/snippets/sdk-installation.mdx +22 -0
  215. package/docs/snippets/service-icons.mdx +27 -0
  216. package/eslint.config.js +10 -3
  217. package/frontend/package.json +10 -4
  218. package/frontend/src/App.tsx +13 -82
  219. package/frontend/src/assets/icons/connected.svg +3 -0
  220. package/frontend/src/assets/icons/loader.svg +9 -0
  221. package/frontend/src/assets/logos/apple.svg +4 -0
  222. package/frontend/src/assets/logos/discord.svg +1 -1
  223. package/frontend/src/assets/logos/facebook.svg +3 -0
  224. package/frontend/src/assets/logos/instagram.svg +2 -0
  225. package/frontend/src/assets/logos/linkedin.svg +3 -0
  226. package/frontend/src/assets/logos/microsoft.svg +1 -0
  227. package/frontend/src/assets/logos/spotify.svg +17 -0
  228. package/frontend/src/assets/logos/tiktok.svg +6 -0
  229. package/frontend/src/assets/logos/x.svg +3 -0
  230. package/frontend/src/components/Checkbox.tsx +27 -29
  231. package/frontend/src/components/CodeBlock.tsx +55 -2
  232. package/frontend/src/components/CodeEditor.tsx +92 -0
  233. package/frontend/src/components/ConfirmDialog.tsx +1 -1
  234. package/frontend/src/components/ConnectCTA.tsx +38 -0
  235. package/frontend/src/components/CopyButton.tsx +52 -15
  236. package/frontend/src/components/ErrorState.tsx +1 -2
  237. package/frontend/src/components/FeatureSidebar.tsx +6 -6
  238. package/frontend/src/components/FeatureSidebarItem.tsx +2 -2
  239. package/frontend/src/components/JsonHighlight.tsx +21 -9
  240. package/frontend/src/components/ProjectInfoModal.tsx +128 -0
  241. package/frontend/src/components/PromptDialog.tsx +1 -4
  242. package/frontend/src/components/SearchInput.tsx +1 -2
  243. package/frontend/src/components/Stepper.tsx +53 -0
  244. package/frontend/src/components/ThemeToggle.tsx +3 -3
  245. package/frontend/src/components/datagrid/DataGrid.tsx +25 -32
  246. package/frontend/src/components/datagrid/cell-editors/DateCellEditor.tsx +1 -2
  247. package/frontend/src/components/datagrid/cell-editors/JsonCellEditor.tsx +2 -4
  248. package/frontend/src/components/datagrid/index.ts +23 -0
  249. package/frontend/src/components/index.ts +23 -30
  250. package/frontend/src/components/layout/AppHeader.tsx +133 -92
  251. package/frontend/src/components/layout/AppSidebar.tsx +80 -170
  252. package/frontend/src/components/layout/Layout.tsx +12 -23
  253. package/frontend/src/components/layout/PrimaryMenu.tsx +187 -0
  254. package/frontend/src/components/layout/SecondaryMenu.tsx +70 -0
  255. package/frontend/src/components/layout/index.ts +5 -0
  256. package/frontend/src/components/radix/Tooltip.tsx +24 -13
  257. package/frontend/src/components/radix/index.ts +22 -0
  258. package/frontend/src/features/ai/components/AIConfigCard.tsx +129 -83
  259. package/frontend/src/features/ai/components/AIEmptyState.tsx +12 -7
  260. package/frontend/src/features/ai/components/ModalityFilterSidebar.tsx +101 -0
  261. package/frontend/src/features/ai/components/ModelSelectionDialog.tsx +135 -0
  262. package/frontend/src/features/ai/components/ModelSelectionGrid.tsx +51 -0
  263. package/frontend/src/features/ai/components/SystemPromptDialog.tsx +118 -0
  264. package/frontend/src/features/ai/components/index.ts +6 -0
  265. package/frontend/src/features/ai/helpers.ts +57 -71
  266. package/frontend/src/features/ai/hooks/useAIConfigs.ts +39 -113
  267. package/frontend/src/features/ai/hooks/useAIUsage.ts +0 -2
  268. package/frontend/src/features/ai/page/AIPage.tsx +67 -79
  269. package/frontend/src/features/ai/services/ai.service.ts +5 -5
  270. package/frontend/src/features/auth/components/AuthPreview.tsx +96 -0
  271. package/frontend/src/features/auth/components/OAuthConfigDialog.tsx +53 -30
  272. package/frontend/src/features/auth/components/UserFormDialog.tsx +13 -6
  273. package/frontend/src/features/auth/components/UsersDataGrid.tsx +44 -14
  274. package/frontend/src/features/auth/components/index.ts +5 -0
  275. package/frontend/src/features/auth/helpers.tsx +200 -0
  276. package/frontend/src/features/auth/hooks/useAnonToken.ts +30 -0
  277. package/frontend/src/features/auth/hooks/useAuthConfig.ts +48 -0
  278. package/frontend/src/features/auth/hooks/useOAuthConfig.ts +14 -10
  279. package/frontend/src/features/auth/hooks/useUsers.ts +43 -5
  280. package/frontend/src/features/auth/index.ts +3 -2
  281. package/frontend/src/features/auth/page/AuthMethodsPage.tsx +275 -0
  282. package/frontend/src/features/auth/page/ConfigurationPage.tsx +395 -0
  283. package/frontend/src/features/auth/page/UsersPage.tsx +285 -0
  284. package/frontend/src/features/auth/services/anonToken.service.ts +11 -0
  285. package/frontend/src/features/auth/services/config.service.ts +19 -0
  286. package/frontend/src/features/auth/services/{oauth.service.ts → oauth-config.service.ts} +4 -4
  287. package/frontend/src/features/auth/services/{auth.service.ts → user.service.ts} +7 -53
  288. package/frontend/src/features/dashboard/components/ConnectionSuccessBanner.tsx +35 -0
  289. package/frontend/src/features/dashboard/components/PromptCard.tsx +21 -0
  290. package/frontend/src/features/dashboard/components/PromptDialog.tsx +103 -0
  291. package/frontend/src/features/dashboard/components/StatsCard.tsx +50 -0
  292. package/frontend/src/features/dashboard/components/index.ts +4 -0
  293. package/frontend/src/features/dashboard/page/DashboardPage.tsx +187 -169
  294. package/frontend/src/features/dashboard/prompts/ai-chatbot.ts +13 -0
  295. package/frontend/src/features/dashboard/prompts/crm-system.ts +13 -0
  296. package/frontend/src/features/dashboard/prompts/ecommerce-platform.ts +12 -0
  297. package/frontend/src/features/dashboard/prompts/index.ts +31 -0
  298. package/frontend/src/features/dashboard/prompts/instagram-clone.ts +11 -0
  299. package/frontend/src/features/dashboard/prompts/notion-clone.ts +14 -0
  300. package/frontend/src/features/dashboard/prompts/reddit-clone.ts +12 -0
  301. package/frontend/src/features/database/components/DatabaseDataGrid.tsx +48 -17
  302. package/frontend/src/features/database/components/ForeignKeyCell.tsx +15 -34
  303. package/frontend/src/features/database/components/ForeignKeyPopover.tsx +19 -20
  304. package/frontend/src/features/database/components/LinkRecordModal.tsx +120 -125
  305. package/frontend/src/features/database/components/RecordFormDialog.tsx +22 -33
  306. package/frontend/src/features/database/components/RecordFormField.tsx +45 -47
  307. package/frontend/src/features/database/components/TableEmptyState.tsx +6 -5
  308. package/frontend/src/features/database/components/TableForm.tsx +28 -15
  309. package/frontend/src/features/database/components/TableFormColumn.tsx +2 -3
  310. package/frontend/src/features/database/components/TableSidebar.tsx +1 -1
  311. package/frontend/src/features/database/components/TablesEmptyState.tsx +48 -0
  312. package/frontend/src/features/database/components/TemplateCard.tsx +37 -0
  313. package/frontend/src/features/database/components/TemplatePreview.tsx +92 -0
  314. package/frontend/src/features/database/components/index.ts +19 -0
  315. package/frontend/src/features/database/constants.ts +28 -2
  316. package/frontend/src/features/database/contexts/SQLEditorContext.tsx +188 -0
  317. package/frontend/src/features/database/helpers.ts +2 -2
  318. package/frontend/src/features/database/hooks/useCSVImport.ts +29 -0
  319. package/frontend/src/features/database/hooks/useFullMetadata.ts +18 -0
  320. package/frontend/src/features/database/hooks/useRawSQL.ts +55 -0
  321. package/frontend/src/features/database/hooks/useRecords.ts +139 -0
  322. package/frontend/src/features/database/hooks/useTables.ts +131 -0
  323. package/frontend/src/features/database/index.ts +6 -1
  324. package/frontend/src/features/database/page/FunctionsPage.tsx +211 -0
  325. package/frontend/src/features/database/page/IndexesPage.tsx +240 -0
  326. package/frontend/src/features/database/page/PoliciesPage.tsx +248 -0
  327. package/frontend/src/features/database/page/SQLEditorPage.tsx +382 -0
  328. package/frontend/src/features/database/page/{DatabasePage.tsx → TablesPage.tsx} +186 -185
  329. package/frontend/src/features/database/page/TemplatesPage.tsx +39 -0
  330. package/frontend/src/features/database/page/TriggersPage.tsx +242 -0
  331. package/frontend/src/features/database/services/advance.service.ts +66 -0
  332. package/frontend/src/features/database/services/{database.service.ts → record.service.ts} +67 -64
  333. package/frontend/src/features/database/services/table.service.ts +64 -0
  334. package/frontend/src/features/database/templates/ai-chatbot.ts +402 -0
  335. package/frontend/src/features/database/templates/crm-system.ts +528 -0
  336. package/frontend/src/features/database/templates/ecommerce-platform.ts +553 -0
  337. package/frontend/src/features/database/templates/index.ts +34 -0
  338. package/frontend/src/features/database/templates/instagram-clone.ts +222 -0
  339. package/frontend/src/features/database/templates/notion-clone.ts +483 -0
  340. package/frontend/src/features/database/templates/reddit-clone.ts +526 -0
  341. package/frontend/src/features/functions/components/FunctionRow.tsx +2 -1
  342. package/frontend/src/features/functions/components/FunctionsSidebar.tsx +1 -1
  343. package/frontend/src/features/functions/components/SecretRow.tsx +1 -1
  344. package/frontend/src/features/functions/components/index.ts +5 -0
  345. package/frontend/src/features/functions/hooks/useFunctions.ts +4 -4
  346. package/frontend/src/features/{secrets → functions}/hooks/useSecrets.ts +5 -5
  347. package/frontend/src/features/functions/page/FunctionsPage.tsx +160 -17
  348. package/frontend/src/features/functions/{components/SecretsContent.tsx → page/SecretsPage.tsx} +8 -12
  349. package/frontend/src/features/functions/services/{functions.service.ts → function.service.ts} +2 -2
  350. package/frontend/src/features/{secrets/services/secrets.service.ts → functions/services/secret.service.ts} +2 -2
  351. package/frontend/src/features/login/hooks/usePartnerOrigin.ts +27 -0
  352. package/frontend/src/features/login/page/CloudLoginPage.tsx +79 -54
  353. package/frontend/src/features/login/page/LoginPage.tsx +16 -23
  354. package/frontend/src/features/login/services/partnership.service.ts +65 -0
  355. package/frontend/src/features/logs/components/LogsDataGrid.tsx +89 -0
  356. package/frontend/src/features/logs/components/SeverityBadge.tsx +18 -0
  357. package/frontend/src/features/logs/components/index.ts +2 -0
  358. package/frontend/src/features/logs/helpers.ts +24 -0
  359. package/frontend/src/features/logs/hooks/useAuditLogs.ts +4 -4
  360. package/frontend/src/features/logs/hooks/useLogSources.ts +137 -0
  361. package/frontend/src/features/logs/hooks/useLogs.ts +163 -0
  362. package/frontend/src/features/logs/hooks/useMcpUsage.ts +181 -0
  363. package/frontend/src/features/logs/index.ts +8 -2
  364. package/frontend/src/features/logs/page/AuditsPage.tsx +91 -38
  365. package/frontend/src/features/logs/page/LogsPage.tsx +152 -0
  366. package/frontend/src/features/logs/page/MCPLogsPage.tsx +84 -0
  367. package/frontend/src/features/logs/services/audit.service.ts +63 -0
  368. package/frontend/src/features/logs/services/log.service.ts +15 -110
  369. package/frontend/src/features/logs/services/usage.service.ts +31 -0
  370. package/frontend/src/features/onboard/components/McpConnectionStatus.tsx +68 -0
  371. package/frontend/src/features/onboard/components/OnboardingModal.tsx +267 -0
  372. package/frontend/src/features/onboard/components/VideoDemoModal.tsx +38 -0
  373. package/frontend/src/features/onboard/components/index.ts +4 -0
  374. package/frontend/src/features/onboard/components/mcp/CursorDeeplinkGenerator.tsx +2 -2
  375. package/frontend/src/features/onboard/components/mcp/{mcp-helper.tsx → helpers.tsx} +8 -8
  376. package/frontend/src/features/onboard/components/mcp/index.ts +2 -3
  377. package/frontend/src/features/onboard/index.ts +13 -3
  378. package/frontend/src/features/storage/components/BucketEmptyState.tsx +9 -6
  379. package/frontend/src/features/storage/components/BucketFormDialog.tsx +25 -41
  380. package/frontend/src/features/storage/components/FilePreviewDialog.tsx +20 -8
  381. package/frontend/src/features/storage/components/StorageDataGrid.tsx +4 -3
  382. package/frontend/src/features/storage/components/StorageManager.tsx +23 -34
  383. package/frontend/src/features/storage/components/index.ts +12 -0
  384. package/frontend/src/features/storage/hooks/useStorage.ts +208 -0
  385. package/frontend/src/features/storage/page/StoragePage.tsx +41 -115
  386. package/frontend/src/features/storage/services/storage.service.ts +22 -1
  387. package/frontend/src/features/visualizer/components/AuthNode.tsx +72 -56
  388. package/frontend/src/features/visualizer/components/BucketNode.tsx +4 -4
  389. package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +108 -80
  390. package/frontend/src/features/visualizer/components/TableNode.tsx +34 -41
  391. package/frontend/src/features/visualizer/components/VisualizerSkeleton.tsx +12 -4
  392. package/frontend/src/features/visualizer/page/VisualizerPage.tsx +33 -29
  393. package/frontend/src/index.css +1 -0
  394. package/frontend/src/lib/analytics/posthog.tsx +27 -0
  395. package/frontend/src/lib/contexts/AuthContext.tsx +38 -31
  396. package/frontend/src/lib/contexts/SocketContext.tsx +5 -6
  397. package/frontend/src/{features/metadata → lib}/hooks/useMetadata.ts +1 -1
  398. package/frontend/src/lib/hooks/useToast.tsx +6 -2
  399. package/frontend/src/lib/routing/AppRoutes.tsx +84 -0
  400. package/frontend/src/lib/routing/RequireAuth.tsx +27 -0
  401. package/frontend/src/lib/utils/cloudMessaging.ts +20 -0
  402. package/frontend/src/lib/utils/menuItems.ts +183 -0
  403. package/frontend/src/lib/utils/{validation-schemas.ts → schemaValidations.ts} +10 -5
  404. package/frontend/src/lib/utils/utils.ts +19 -1
  405. package/frontend/src/vite-env.d.ts +1 -0
  406. package/frontend/vite.config.ts +5 -3
  407. package/functions/server.ts +28 -3
  408. package/functions/worker-template.js +15 -4
  409. package/i18n/README.ar.md +130 -0
  410. package/i18n/README.de.md +130 -0
  411. package/i18n/README.es.md +154 -0
  412. package/i18n/README.fr.md +134 -0
  413. package/i18n/README.hi.md +129 -0
  414. package/i18n/README.ja.md +174 -0
  415. package/i18n/README.ko.md +137 -0
  416. package/i18n/README.pt-BR.md +131 -0
  417. package/i18n/README.ru.md +129 -0
  418. package/i18n/README.zh-CN.md +133 -0
  419. package/openapi/ai.yaml +31 -4
  420. package/openapi/auth.yaml +827 -146
  421. package/package.json +16 -7
  422. package/shared-schemas/package.json +1 -1
  423. package/shared-schemas/src/ai-api.schema.ts +34 -58
  424. package/shared-schemas/src/ai.schema.ts +5 -0
  425. package/shared-schemas/src/auth-api.schema.ts +154 -8
  426. package/shared-schemas/src/auth.schema.ts +42 -6
  427. package/shared-schemas/src/cloud-events.schema.ts +57 -0
  428. package/shared-schemas/src/database-api.schema.ts +3 -3
  429. package/shared-schemas/src/database.schema.ts +1 -1
  430. package/shared-schemas/src/index.ts +1 -0
  431. package/shared-schemas/src/logs-api.schema.ts +7 -1
  432. package/shared-schemas/src/logs.schema.ts +26 -0
  433. package/shared-schemas/src/metadata.schema.ts +9 -4
  434. package/test-gemini.sh +35 -0
  435. package/test-usage-admin.sh +57 -0
  436. package/test-usage.sh +50 -0
  437. package/zeabur/README.md +13 -0
  438. package/zeabur/template.yml +1032 -0
  439. package/.github/workflows/deploy-aws.yml +0 -130
  440. package/backend/src/api/routes/agent.ts +0 -29
  441. package/backend/src/api/routes/auth.oauth.ts +0 -482
  442. package/backend/src/api/routes/auth.ts +0 -386
  443. package/backend/src/api/routes/docs.ts +0 -66
  444. package/backend/src/api/routes/functions.ts +0 -183
  445. package/backend/src/api/routes/openapi.ts +0 -82
  446. package/backend/src/api/routes/usage.ts +0 -96
  447. package/backend/src/core/ai/client.ts +0 -242
  448. package/backend/src/core/ai/model.ts +0 -117
  449. package/backend/src/core/auth/auth.ts +0 -781
  450. package/backend/src/core/database/table.ts +0 -772
  451. package/backend/src/core/documentation/agent.ts +0 -689
  452. package/backend/src/core/documentation/openapi.ts +0 -856
  453. package/backend/src/core/logs/analytics.ts +0 -76
  454. package/backend/src/core/logs/providers/localdb.provider.ts +0 -246
  455. package/backend/src/core/storage/storage.ts +0 -923
  456. package/backend/src/utils/cloud-token.ts +0 -39
  457. package/backend/src/utils/helpers.ts +0 -49
  458. package/backend/src/utils/uuid.ts +0 -9
  459. package/backend/tests/manual/test-better-auth.sh +0 -303
  460. package/docker-init/db/logs.sql +0 -9
  461. package/frontend/README.md +0 -112
  462. package/frontend/src/components/datagrid/index.tsx +0 -20
  463. package/frontend/src/components/layout/CloudLayout.tsx +0 -95
  464. package/frontend/src/features/ai/components/AIConfigDialog.tsx +0 -76
  465. package/frontend/src/features/ai/components/AIConfigForm.tsx +0 -222
  466. package/frontend/src/features/ai/components/fields/ModalityField.tsx +0 -87
  467. package/frontend/src/features/ai/components/fields/ModelSelectionField.tsx +0 -134
  468. package/frontend/src/features/ai/components/fields/SystemPromptField.tsx +0 -33
  469. package/frontend/src/features/auth/components/AddOAuthDialog.tsx +0 -106
  470. package/frontend/src/features/auth/components/AuthMethodTab.tsx +0 -238
  471. package/frontend/src/features/auth/components/UsersTab.tsx +0 -114
  472. package/frontend/src/features/auth/page/AuthenticationPage.tsx +0 -169
  473. package/frontend/src/features/database/hooks/UseLinkModal.tsx +0 -78
  474. package/frontend/src/features/functions/components/FunctionViewer.tsx +0 -46
  475. package/frontend/src/features/functions/components/FunctionsContent.tsx +0 -88
  476. package/frontend/src/features/login/components/AuthErrorBoundary.tsx +0 -87
  477. package/frontend/src/features/login/components/PrivateRoute.tsx +0 -24
  478. package/frontend/src/features/logs/components/AnalyticsLogsTable.tsx +0 -313
  479. package/frontend/src/features/logs/components/LogsTable.tsx +0 -199
  480. package/frontend/src/features/logs/page/AnalyticsLogsPage.tsx +0 -530
  481. package/frontend/src/features/metadata/index.ts +0 -0
  482. package/frontend/src/features/metadata/page/MetadataPage.tsx +0 -136
  483. package/frontend/src/features/onboard/components/CompletionCard.tsx +0 -41
  484. package/frontend/src/features/onboard/components/OnboardButton.tsx +0 -84
  485. package/frontend/src/features/onboard/components/StepContent.tsx +0 -91
  486. package/frontend/src/features/onboard/components/TestConnectionStep.tsx +0 -53
  487. package/frontend/src/features/onboard/components/mcp/McpInstallation.tsx +0 -144
  488. package/frontend/src/features/onboard/page/OnBoardPage.tsx +0 -104
  489. package/frontend/src/features/onboard/types.ts +0 -8
  490. package/frontend/src/lib/contexts/OnboardStepContext.tsx +0 -68
  491. package/frontend/src/lib/hooks/useOnboardingCompletion.ts +0 -29
  492. /package/backend/src/api/{middleware → middlewares}/error.ts +0 -0
  493. /package/backend/src/api/{middleware → middlewares}/upload.ts +0 -0
  494. /package/backend/{migrations → src/infra/database/migrations}/000_create-base-tables.sql +0 -0
  495. /package/backend/{migrations → src/infra/database/migrations}/001_create-helper-functions.sql +0 -0
  496. /package/backend/{migrations → src/infra/database/migrations}/002_rename-auth-tables.sql +0 -0
  497. /package/backend/{migrations → src/infra/database/migrations}/003_create-users-table.sql +0 -0
  498. /package/backend/{migrations → src/infra/database/migrations}/004_add-reload-postgrest-func.sql +0 -0
  499. /package/backend/{migrations → src/infra/database/migrations}/005_enable-project-admin-modify-users.sql +0 -0
  500. /package/backend/{migrations → src/infra/database/migrations}/006_modify-ai-usage-table.sql +0 -0
  501. /package/backend/{migrations → src/infra/database/migrations}/007_drop-metadata-table.sql +0 -0
  502. /package/backend/{migrations → src/infra/database/migrations}/008_add-system-tables.sql +0 -0
  503. /package/backend/{migrations → src/infra/database/migrations}/009_add-function-secrets.sql +0 -0
  504. /package/backend/{migrations → src/infra/database/migrations}/010_modify-ai-config-modalities.sql +0 -0
  505. /package/backend/{migrations → src/infra/database/migrations}/011_refactor-secrets-table.sql +0 -0
  506. /package/backend/{migrations → src/infra/database/migrations}/012_add-storage-uploaded-by.sql +0 -0
  507. /package/frontend/src/{features/metadata → lib}/services/metadata.service.ts +0 -0
@@ -1,9 +1,17 @@
1
1
  export function VisualizerSkeleton() {
2
2
  return (
3
- <div className="relative min-h-screen bg-neutral-800 overflow-hidden">
4
- {/* Dot Matrix Background */}
3
+ <div className="relative h-full bg-gray-50 dark:bg-neutral-800 overflow-hidden">
4
+ {/* Dot Matrix Background - Light Mode */}
5
5
  <div
6
- className="absolute inset-0 opacity-50"
6
+ className="absolute inset-0 opacity-50 dark:hidden"
7
+ style={{
8
+ backgroundImage: `radial-gradient(circle, #D1D5DB 1px, transparent 1px)`,
9
+ backgroundSize: '12px 12px',
10
+ }}
11
+ />
12
+ {/* Dot Matrix Background - Dark Mode */}
13
+ <div
14
+ className="absolute inset-0 opacity-50 hidden dark:block"
7
15
  style={{
8
16
  backgroundImage: `radial-gradient(circle, #3B3B3B 1px, transparent 1px)`,
9
17
  backgroundSize: '12px 12px',
@@ -13,7 +21,7 @@ export function VisualizerSkeleton() {
13
21
  {/* Loading content */}
14
22
  <div className="relative z-10 flex items-center justify-center min-h-screen">
15
23
  <div className="text-center">
16
- <div className="inline-flex items-center gap-3 text-white">
24
+ <div className="inline-flex items-center gap-3 text-zinc-950 dark:text-white">
17
25
  <div className="w-8 h-8 border-4 border-blue-500 border-t-transparent rounded-full animate-spin" />
18
26
  <span className="text-lg font-medium">Loading schema visualization...</span>
19
27
  </div>
@@ -1,11 +1,10 @@
1
- import { useQuery, useQueryClient } from '@tanstack/react-query';
1
+ import { useQueryClient } from '@tanstack/react-query';
2
2
  import { RefreshCw } from 'lucide-react';
3
3
  import { useCallback, useEffect } from 'react';
4
- import { useMetadata } from '@/features/metadata/hooks/useMetadata';
5
- import { authService } from '@/features/auth/services/auth.service';
4
+ import { useMetadata } from '@/lib/hooks/useMetadata';
5
+ import { useUsers } from '@/features/auth/hooks/useUsers';
6
6
  import { SchemaVisualizer, VisualizerSkeleton } from '../components';
7
- import { Button } from '@/components/radix/Button';
8
- import { Alert, AlertDescription } from '@/components/radix/Alert';
7
+ import { Alert, AlertDescription, Button } from '@/components';
9
8
  import {
10
9
  useSocket,
11
10
  ServerEvents,
@@ -26,18 +25,10 @@ const VisualizerPage = () => {
26
25
  } = useMetadata();
27
26
 
28
27
  const {
29
- data: userStats,
28
+ totalUsers,
30
29
  isLoading: userStatsLoading,
31
30
  refetch: refetchUserStats,
32
- } = useQuery({
33
- queryKey: ['user-stats-visualizer'],
34
- queryFn: async () => {
35
- const response = await authService.getUsers();
36
- return { userCount: response.pagination.total };
37
- },
38
- staleTime: 5 * 60 * 1000,
39
- gcTime: 10 * 60 * 1000,
40
- });
31
+ } = useUsers({ enabled: true });
41
32
 
42
33
  const isLoading = metadataLoading || userStatsLoading;
43
34
  const error = metadataError;
@@ -55,11 +46,8 @@ const VisualizerPage = () => {
55
46
 
56
47
  const handleDataUpdate = (message: SocketMessage<DataUpdatePayload>) => {
57
48
  if (
58
- message.payload?.resource === DataUpdateResourceType.METADATA ||
59
- message.payload?.resource === DataUpdateResourceType.DATABASE_SCHEMA ||
60
- message.payload?.resource === DataUpdateResourceType.TABLE_SCHEMA ||
61
- message.payload?.resource === DataUpdateResourceType.OAUTH_SCHEMA ||
62
- message.payload?.resource === DataUpdateResourceType.STORAGE_SCHEMA
49
+ message.payload?.resource === DataUpdateResourceType.DATABASE ||
50
+ message.payload?.resource === DataUpdateResourceType.BUCKETS
63
51
  ) {
64
52
  // Invalidate all metadata-related queries
65
53
  void queryClient.invalidateQueries({ queryKey: ['metadata'] });
@@ -79,17 +67,25 @@ const VisualizerPage = () => {
79
67
 
80
68
  if (!metadata || error) {
81
69
  return (
82
- <div className="relative min-h-screen bg-neutral-800 overflow-hidden">
83
- {/* Dot Matrix Background */}
70
+ <div className="relative h-full bg-gray-50 dark:bg-neutral-800 overflow-hidden">
71
+ {/* Dot Matrix Background - Light Mode */}
84
72
  <div
85
- className="absolute inset-0 opacity-50"
73
+ className="absolute inset-0 opacity-50 dark:hidden"
74
+ style={{
75
+ backgroundImage: `radial-gradient(circle, #D1D5DB 1px, transparent 1px)`,
76
+ backgroundSize: '12px 12px',
77
+ }}
78
+ />
79
+ {/* Dot Matrix Background - Dark Mode */}
80
+ <div
81
+ className="absolute inset-0 opacity-50 hidden dark:block"
86
82
  style={{
87
83
  backgroundImage: `radial-gradient(circle, #3B3B3B 1px, transparent 1px)`,
88
84
  backgroundSize: '12px 12px',
89
85
  }}
90
86
  />
91
87
 
92
- <div className="relative z-10 flex items-center justify-center min-h-screen p-8">
88
+ <div className="relative z-10 flex items-center justify-center h-full p-8">
93
89
  <Alert variant="destructive" className="max-w-md">
94
90
  <AlertDescription>
95
91
  Failed to load database schema. Please ensure the backend is running and try
@@ -106,10 +102,18 @@ const VisualizerPage = () => {
106
102
  }
107
103
 
108
104
  return (
109
- <div className="relative min-h-screen bg-neutral-800 overflow-hidden">
110
- {/* Dot Matrix Background */}
105
+ <div className="relative h-full bg-gray-50 dark:bg-neutral-800 overflow-hidden">
106
+ {/* Dot Matrix Background - Light Mode */}
107
+ <div
108
+ className="absolute inset-0 opacity-50 dark:hidden"
109
+ style={{
110
+ backgroundImage: `radial-gradient(circle, #D1D5DB 1px, transparent 1px)`,
111
+ backgroundSize: '12px 12px',
112
+ }}
113
+ />
114
+ {/* Dot Matrix Background - Dark Mode */}
111
115
  <div
112
- className="absolute inset-0 opacity-50"
116
+ className="absolute inset-0 opacity-50 hidden dark:block"
113
117
  style={{
114
118
  backgroundImage: `radial-gradient(circle, #3B3B3B 1px, transparent 1px)`,
115
119
  backgroundSize: '12px 12px',
@@ -117,8 +121,8 @@ const VisualizerPage = () => {
117
121
  />
118
122
 
119
123
  {/* Schema Visualizer */}
120
- <div className="relative z-10 w-full h-screen">
121
- <SchemaVisualizer metadata={metadata} userCount={userStats?.userCount} />
124
+ <div className="relative z-10 w-full h-full">
125
+ <SchemaVisualizer metadata={metadata} userCount={totalUsers} />
122
126
  </div>
123
127
  </div>
124
128
  );
@@ -60,6 +60,7 @@
60
60
  --fontFamilyBase:
61
61
  'Inter', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
62
62
  --fontFamilyMono: 'Ubuntu Mono', ui-monospace, monospace;
63
+ --fontFamilyManrope: 'Manrope', sans-serif;
63
64
  }
64
65
 
65
66
  /* Prevent document-level scrolling */
@@ -0,0 +1,27 @@
1
+ import posthog from 'posthog-js';
2
+ import { PostHogProvider } from 'posthog-js/react';
3
+
4
+ const POSTHOG_KEY = import.meta.env.VITE_PUBLIC_POSTHOG_KEY || '';
5
+
6
+ if (POSTHOG_KEY) {
7
+ try {
8
+ posthog.init(POSTHOG_KEY, {
9
+ api_host: 'https://us.i.posthog.com',
10
+ capture_exceptions: true, // This enables capturing exceptions using Error Tracking
11
+ debug: import.meta.env.DEV,
12
+ session_recording: {
13
+ // WARNING: Only enable this if you understand the security implications
14
+ recordCrossOriginIframes: true,
15
+ },
16
+ });
17
+ } catch (error) {
18
+ console.error('Error initializing PostHog', error);
19
+ }
20
+ }
21
+
22
+ export const PostHogAnalyticsProvider = ({ children }: { children: React.ReactNode }) => {
23
+ if (POSTHOG_KEY) {
24
+ return <PostHogProvider client={posthog}>{children}</PostHogProvider>;
25
+ }
26
+ return <>{children}</>;
27
+ };
@@ -1,7 +1,7 @@
1
1
  import React, { createContext, useContext, useState, useEffect, useCallback } from 'react';
2
2
  import { useQueryClient } from '@tanstack/react-query';
3
- import { authService } from '@/features/auth/services/auth.service';
4
3
  import { apiClient } from '@/lib/api/client';
4
+ import { userService } from '@/features/auth/services/user.service';
5
5
 
6
6
  export interface User {
7
7
  id: string;
@@ -60,7 +60,7 @@ export const AuthProvider: React.FC<AuthProviderProps> = ({ children }) => {
60
60
  try {
61
61
  setIsLoading(true);
62
62
  setError(null);
63
- const currentUser = await authService.getCurrentUser();
63
+ const currentUser = await userService.getCurrentUser();
64
64
  setUser(currentUser);
65
65
  setIsAuthenticated(true);
66
66
  return currentUser;
@@ -77,54 +77,64 @@ export const AuthProvider: React.FC<AuthProviderProps> = ({ children }) => {
77
77
  }
78
78
  }, []);
79
79
 
80
+ const invalidateAuthQueries = useCallback(async () => {
81
+ await Promise.all([
82
+ queryClient.invalidateQueries({ queryKey: ['apiKey'] }),
83
+ queryClient.invalidateQueries({ queryKey: ['metadata'] }),
84
+ queryClient.invalidateQueries({ queryKey: ['users'] }),
85
+ queryClient.invalidateQueries({ queryKey: ['tables'] }),
86
+ queryClient.invalidateQueries({ queryKey: ['mcp-usage'] }),
87
+ ]);
88
+ }, [queryClient]);
89
+
80
90
  const loginWithPassword = useCallback(
81
91
  async (email: string, password: string): Promise<boolean> => {
82
92
  try {
83
93
  setError(null);
84
- await authService.loginWithPassword(email, password);
85
- const currentUser = await checkAuthStatus();
86
- if (currentUser) {
87
- // Invalidate queries that depend on authentication
88
- void queryClient.invalidateQueries({ queryKey: ['apiKey'] });
89
- void queryClient.invalidateQueries({ queryKey: ['metadata'] });
90
- void queryClient.invalidateQueries({ queryKey: ['users'] });
91
- void queryClient.invalidateQueries({ queryKey: ['tables'] });
92
- return true;
93
- }
94
- return false;
94
+ const data = await apiClient.request('/auth/admin/sessions', {
95
+ method: 'POST',
96
+ body: JSON.stringify({ email, password }),
97
+ });
98
+
99
+ apiClient.setToken(data.accessToken);
100
+ setUser(data.user);
101
+ setIsAuthenticated(true);
102
+
103
+ await invalidateAuthQueries();
104
+ return true;
95
105
  } catch (err) {
96
106
  setError(err instanceof Error ? err : new Error('Login failed'));
97
107
  return false;
98
108
  }
99
109
  },
100
- [checkAuthStatus, queryClient]
110
+ [invalidateAuthQueries]
101
111
  );
102
112
 
103
113
  const loginWithAuthorizationCode = useCallback(
104
- async (token: string): Promise<boolean> => {
114
+ async (code: string): Promise<boolean> => {
105
115
  try {
106
116
  setError(null);
107
- await authService.loginWithAuthorizationCode(token);
108
- const currentUser = await checkAuthStatus();
109
- if (currentUser) {
110
- // Invalidate queries that depend on authentication
111
- void queryClient.invalidateQueries({ queryKey: ['apiKey'] });
112
- void queryClient.invalidateQueries({ queryKey: ['metadata'] });
113
- void queryClient.invalidateQueries({ queryKey: ['users'] });
114
- void queryClient.invalidateQueries({ queryKey: ['tables'] });
115
- return true;
116
- }
117
- return false;
117
+ const data = await apiClient.request('/auth/admin/sessions/exchange', {
118
+ method: 'POST',
119
+ body: JSON.stringify({ code }),
120
+ });
121
+
122
+ apiClient.setToken(data.accessToken);
123
+ setUser(data.user);
124
+ setIsAuthenticated(true);
125
+
126
+ await invalidateAuthQueries();
127
+ return true;
118
128
  } catch (err) {
119
129
  setError(err instanceof Error ? err : new Error('Authorization code exchange failed'));
120
130
  return false;
121
131
  }
122
132
  },
123
- [checkAuthStatus, queryClient]
133
+ [invalidateAuthQueries]
124
134
  );
125
135
 
126
136
  const logout = useCallback(() => {
127
- void authService.logout();
137
+ apiClient.clearToken();
128
138
  setUser(null);
129
139
  setIsAuthenticated(false);
130
140
  setError(null);
@@ -139,9 +149,6 @@ export const AuthProvider: React.FC<AuthProviderProps> = ({ children }) => {
139
149
  void checkAuthStatus();
140
150
  }, [checkAuthStatus]);
141
151
 
142
- // Removed periodic auth refresh - it was causing unnecessary unmounts
143
- // Auth status is checked naturally when API calls are made
144
-
145
152
  const value: AuthContextType = {
146
153
  user,
147
154
  isAuthenticated,
@@ -54,12 +54,11 @@ export interface NotificationPayload {
54
54
  }
55
55
 
56
56
  export enum DataUpdateResourceType {
57
- METADATA = 'metadata',
58
- DATABASE_SCHEMA = 'database_schema',
59
- TABLE_SCHEMA = 'table_schema',
60
- STORAGE_SCHEMA = 'storage_schema',
61
- BUCKET_SCHEMA = 'bucket_schema',
62
- OAUTH_SCHEMA = 'oauth_schmea',
57
+ DATABASE = 'database',
58
+ USERS = 'users',
59
+ RECORDS = 'records',
60
+ BUCKETS = 'buckets',
61
+ FUNCTIONS = 'functions',
63
62
  }
64
63
 
65
64
  export interface DataUpdatePayload {
@@ -22,7 +22,7 @@ export function useMetadata(options?: UseMetadataOptions) {
22
22
  return {
23
23
  metadata,
24
24
  auth: metadata?.auth,
25
- tables: Object.keys(metadata?.database.tables ?? {}),
25
+ tables: metadata?.database.tables?.filter((table) => table.tableName !== 'users') ?? [],
26
26
  storage: metadata?.storage,
27
27
  version: metadata?.version || 'Unknown',
28
28
  isLoading,
@@ -1,6 +1,6 @@
1
1
  import React, { createContext, useContext, useState, useCallback } from 'react';
2
2
  import { useTimeout } from './useTimeout';
3
- import { generateUUID } from '@/lib/utils/utils';
3
+ import { cn, generateUUID } from '@/lib/utils/utils';
4
4
 
5
5
  interface Toast {
6
6
  id: string;
@@ -191,7 +191,11 @@ export function ToastProvider({ children }: { children: React.ReactNode }) {
191
191
  <ToastContext.Provider value={{ showToast, updateToast, removeToast }}>
192
192
  {children}
193
193
  {/* Regular toasts - top center */}
194
- <div className="fixed top-7.5 dark:top-20 left-1/2 transform -translate-x-1/2 z-[9999] flex flex-col gap-3 w-full max-w-[480px]">
194
+ <div
195
+ className={cn(
196
+ 'fixed top-2 left-1/2 transform -translate-x-1/2 z-[9999] flex flex-col gap-3 w-full max-w-[480px]'
197
+ )}
198
+ >
195
199
  {toasts
196
200
  .filter((t) => t.type !== 'upload')
197
201
  .map((toast) => (
@@ -0,0 +1,84 @@
1
+ import { Routes, Route, Navigate } from 'react-router-dom';
2
+ import { RequireAuth } from '@/lib/routing/RequireAuth';
3
+ import Layout from '@/components/layout/Layout';
4
+ import LoginPage from '@/features/login/page/LoginPage';
5
+ import CloudLoginPage from '@/features/login/page/CloudLoginPage';
6
+ import DashboardPage from '@/features/dashboard/page/DashboardPage';
7
+ import TablesPage from '@/features/database/page/TablesPage';
8
+ import UsersPage from '@/features/auth/page/UsersPage';
9
+ import AuthMethodsPage from '@/features/auth/page/AuthMethodsPage';
10
+ import ConfigurationPage from '@/features/auth/page/ConfigurationPage';
11
+ import LogsPage from '@/features/logs/page/LogsPage';
12
+ import MCPLogsPage from '@/features/logs/page/MCPLogsPage';
13
+ import StoragePage from '@/features/storage/page/StoragePage';
14
+ import VisualizerPage from '@/features/visualizer/page/VisualizerPage';
15
+ import FunctionsPage from '@/features/functions/page/FunctionsPage';
16
+ import SecretsPage from '@/features/functions/page/SecretsPage';
17
+ import AIPage from '@/features/ai/page/AIPage';
18
+ import SQLEditorPage from '@/features/database/page/SQLEditorPage';
19
+ import IndexesPage from '@/features/database/page/IndexesPage';
20
+ import DatabaseFunctionsPage from '@/features/database/page/FunctionsPage';
21
+ import TriggersPage from '@/features/database/page/TriggersPage';
22
+ import PoliciesPage from '@/features/database/page/PoliciesPage';
23
+ import TemplatesPage from '@/features/database/page/TemplatesPage';
24
+
25
+ export function AppRoutes() {
26
+ return (
27
+ <Routes>
28
+ <Route path="/dashboard/login" element={<LoginPage />} />
29
+ <Route path="/cloud/login" element={<CloudLoginPage />} />
30
+ <Route
31
+ path="/*"
32
+ element={
33
+ <RequireAuth>
34
+ <Layout>
35
+ <Routes>
36
+ <Route path="/" element={<Navigate to="/dashboard" replace />} />
37
+ <Route path="/dashboard" element={<DashboardPage />} />
38
+ <Route path="/dashboard/users" element={<UsersPage />} />
39
+ <Route path="/dashboard/tables" element={<TablesPage />} />
40
+ <Route
41
+ path="/dashboard/authentication"
42
+ element={<Navigate to="/dashboard/authentication/auth-methods" replace />}
43
+ />
44
+ <Route path="/dashboard/authentication/users" element={<UsersPage />} />
45
+ <Route
46
+ path="/dashboard/authentication/auth-methods"
47
+ element={<AuthMethodsPage />}
48
+ />
49
+ <Route path="/dashboard/authentication/config" element={<ConfigurationPage />} />
50
+ <Route
51
+ path="/dashboard/database"
52
+ element={<Navigate to="/dashboard/database/indexes" replace />}
53
+ />
54
+ <Route path="/dashboard/database/tables" element={<TablesPage />} />
55
+ <Route path="/dashboard/database/indexes" element={<IndexesPage />} />
56
+ <Route path="/dashboard/database/functions" element={<DatabaseFunctionsPage />} />
57
+ <Route path="/dashboard/database/triggers" element={<TriggersPage />} />
58
+ <Route path="/dashboard/database/policies" element={<PoliciesPage />} />
59
+ <Route path="/dashboard/database/sql-editor" element={<SQLEditorPage />} />
60
+ <Route path="/dashboard/database/templates" element={<TemplatesPage />} />
61
+ <Route path="/dashboard/storage" element={<StoragePage />} />
62
+ <Route
63
+ path="/dashboard/logs"
64
+ element={<Navigate to="/dashboard/logs/MCP" replace />}
65
+ />
66
+ <Route path="/dashboard/logs/MCP" element={<MCPLogsPage />} />
67
+ <Route path="/dashboard/logs/:source" element={<LogsPage />} />
68
+ <Route
69
+ path="/dashboard/functions"
70
+ element={<Navigate to="/dashboard/functions/list" replace />}
71
+ />
72
+ <Route path="/dashboard/functions/list" element={<FunctionsPage />} />
73
+ <Route path="/dashboard/functions/secrets" element={<SecretsPage />} />
74
+ <Route path="/dashboard/visualizer" element={<VisualizerPage />} />
75
+ <Route path="/dashboard/ai" element={<AIPage />} />
76
+ <Route path="*" element={<Navigate to="/dashboard" replace />} />
77
+ </Routes>
78
+ </Layout>
79
+ </RequireAuth>
80
+ }
81
+ />
82
+ </Routes>
83
+ );
84
+ }
@@ -0,0 +1,27 @@
1
+ import { ReactNode } from 'react';
2
+ import { Navigate } from 'react-router-dom';
3
+ import { useAuth } from '@/lib/contexts/AuthContext';
4
+ import { LoadingState } from '@/components/LoadingState';
5
+ import { isIframe } from '../utils/utils';
6
+
7
+ interface RequireAuthProps {
8
+ children: ReactNode;
9
+ }
10
+
11
+ export const RequireAuth = ({ children }: RequireAuthProps) => {
12
+ const { isAuthenticated, isLoading } = useAuth();
13
+
14
+ if (isLoading) {
15
+ return (
16
+ <div className="min-h-screen flex items-center justify-center">
17
+ <LoadingState />
18
+ </div>
19
+ );
20
+ }
21
+
22
+ if (!isAuthenticated) {
23
+ return <Navigate to={isIframe() ? '/cloud/login' : '/dashboard/login'} replace />;
24
+ }
25
+
26
+ return <>{children}</>;
27
+ };
@@ -0,0 +1,20 @@
1
+ import { cloudEventSchema, CloudEvent } from '@insforge/shared-schemas';
2
+
3
+ export function postMessageToParent(evt: CloudEvent, targetOrigin: string = '*') {
4
+ if (typeof window === 'undefined') {
5
+ return;
6
+ }
7
+ if (window.parent !== window) {
8
+ window.parent.postMessage(evt, targetOrigin);
9
+ }
10
+ }
11
+
12
+ /**
13
+ * Parses and validates an unknown value as a CloudEvent.
14
+ * @param value - The value to validate
15
+ * @returns A discriminated union: { ok: true; data: CloudEvent } on success, { ok: false } on failure
16
+ */
17
+ export function parseCloudEvent(value: unknown): { ok: true; data: CloudEvent } | { ok: false } {
18
+ const parsed = cloudEventSchema.safeParse(value);
19
+ return parsed.success ? { ok: true, data: parsed.data } : { ok: false };
20
+ }
@@ -0,0 +1,183 @@
1
+ import {
2
+ type LucideIcon,
3
+ Home,
4
+ Database,
5
+ Lock,
6
+ HardDrive,
7
+ Code2,
8
+ Sparkles,
9
+ ChartLine,
10
+ BookOpen,
11
+ GitFork,
12
+ Users,
13
+ Table,
14
+ ChartBarBig,
15
+ } from 'lucide-react';
16
+ import { postMessageToParent } from './cloudMessaging';
17
+
18
+ export interface SecondaryMenuItem {
19
+ id: string;
20
+ label: string;
21
+ href: string;
22
+ sectionEnd?: boolean; // Add support for separator after the item
23
+ }
24
+
25
+ export interface PrimaryMenuItem {
26
+ id: string;
27
+ label: string;
28
+ href: string;
29
+ icon: LucideIcon;
30
+ secondaryMenu?: SecondaryMenuItem[];
31
+ onClick?: () => void;
32
+ external?: boolean;
33
+ sectionEnd?: boolean;
34
+ }
35
+
36
+ /**
37
+ * Static menu items configuration
38
+ * Primary menu items appear as icons in the left sidebar
39
+ * Secondary menu items appear in a collapsed sidebar when a primary item is selected
40
+ */
41
+ export const staticMenuItems: PrimaryMenuItem[] = [
42
+ {
43
+ id: 'dashboard',
44
+ label: 'Dashboard',
45
+ href: '/dashboard',
46
+ icon: Home,
47
+ },
48
+ {
49
+ id: 'users',
50
+ label: 'Users',
51
+ href: '/dashboard/users',
52
+ icon: Users,
53
+ },
54
+ {
55
+ id: 'tables',
56
+ label: 'Tables',
57
+ href: '/dashboard/tables',
58
+ icon: Table,
59
+ sectionEnd: true,
60
+ },
61
+ {
62
+ id: 'authentication',
63
+ label: 'Authentication',
64
+ href: '/dashboard/authentication',
65
+ icon: Lock,
66
+ secondaryMenu: [
67
+ {
68
+ id: 'auth-methods',
69
+ label: 'Auth Methods',
70
+ href: '/dashboard/authentication/auth-methods',
71
+ },
72
+ {
73
+ id: 'configuration',
74
+ label: 'Configurations',
75
+ href: '/dashboard/authentication/config',
76
+ },
77
+ ],
78
+ },
79
+ {
80
+ id: 'database',
81
+ label: 'Database',
82
+ href: '/dashboard/database',
83
+ icon: Database,
84
+ secondaryMenu: [
85
+ {
86
+ id: 'indexes',
87
+ label: 'Indexes',
88
+ href: '/dashboard/database/indexes',
89
+ },
90
+ {
91
+ id: 'functions',
92
+ label: 'Functions',
93
+ href: '/dashboard/database/functions',
94
+ },
95
+ {
96
+ id: 'triggers',
97
+ label: 'Triggers',
98
+ href: '/dashboard/database/triggers',
99
+ },
100
+ {
101
+ id: 'policies',
102
+ label: 'Policies',
103
+ href: '/dashboard/database/policies',
104
+ },
105
+ {
106
+ id: 'sql-editor',
107
+ label: 'SQL Editor',
108
+ href: '/dashboard/database/sql-editor',
109
+ },
110
+ {
111
+ id: 'templates',
112
+ label: 'Templates',
113
+ href: '/dashboard/database/templates',
114
+ sectionEnd: true,
115
+ },
116
+ ],
117
+ },
118
+ {
119
+ id: 'storage',
120
+ label: 'Storage',
121
+ href: '/dashboard/storage',
122
+ icon: HardDrive,
123
+ },
124
+ {
125
+ id: 'functions',
126
+ label: 'Functions',
127
+ href: '/dashboard/functions',
128
+ icon: Code2,
129
+ secondaryMenu: [
130
+ {
131
+ id: 'functions-list',
132
+ label: 'Functions',
133
+ href: '/dashboard/functions/list',
134
+ },
135
+ {
136
+ id: 'secrets',
137
+ label: 'Secrets',
138
+ href: '/dashboard/functions/secrets',
139
+ },
140
+ ],
141
+ },
142
+ {
143
+ id: 'ai',
144
+ label: 'AI',
145
+ href: '/dashboard/ai',
146
+ icon: Sparkles,
147
+ sectionEnd: true,
148
+ },
149
+ {
150
+ id: 'logs',
151
+ label: 'Logs',
152
+ href: '/dashboard/logs',
153
+ icon: ChartLine,
154
+ // Secondary menu is populated dynamically in AppSidebar using useLogSources
155
+ },
156
+ {
157
+ id: 'visualizer',
158
+ label: 'Visualizer',
159
+ href: '/dashboard/visualizer',
160
+ icon: GitFork,
161
+ },
162
+ ];
163
+
164
+ /**
165
+ * Bottom menu items that may be conditionally shown
166
+ */
167
+ export const documentationMenuItem: PrimaryMenuItem = {
168
+ id: 'documentation',
169
+ label: 'Documentation',
170
+ href: 'https://docs.insforge.dev',
171
+ icon: BookOpen,
172
+ external: true,
173
+ };
174
+
175
+ export const usageMenuItem: PrimaryMenuItem = {
176
+ id: 'usage',
177
+ label: 'Usage',
178
+ href: '',
179
+ icon: ChartBarBig,
180
+ onClick: () => {
181
+ postMessageToParent({ type: 'NAVIGATE_TO_USAGE' }, '*');
182
+ },
183
+ };