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
package/package.json CHANGED
@@ -1,24 +1,27 @@
1
1
  {
2
2
  "name": "insforge",
3
- "version": "0.3.2",
3
+ "version": "1.2.10",
4
4
  "description": "InsForge - Open source backend-as-a-service with PostgreSQL and MCP integration",
5
5
  "type": "module",
6
6
  "workspaces": [
7
7
  "backend",
8
8
  "frontend",
9
+ "auth",
9
10
  "shared-schemas",
10
11
  "mcp"
11
12
  ],
12
13
  "scripts": {
13
- "dev": "concurrently -n \"backend,frontend\" -c \"cyan,magenta\" \"npm run dev:backend\" \"npm run dev:frontend\"",
14
- "dev:debug": "concurrently -n \"backend,frontend\" -c \"cyan,magenta\" \"npm run dev:backend:debug\" \"npm run dev:frontend:debug\"",
14
+ "dev": "concurrently -n \"backend,frontend,auth\" -c \"cyan,magenta,green\" \"npm run dev:backend\" \"npm run dev:frontend\" \"npm run dev:auth\"",
15
+ "dev:debug": "concurrently -n \"backend,frontend,auth\" -c \"cyan,magenta,green\" \"npm run dev:backend:debug\" \"npm run dev:frontend:debug\" \"npm run dev:auth\"",
15
16
  "dev:backend": "cd backend && npm run dev",
16
17
  "dev:backend:debug": "cd backend && cross-env DEBUG_MODE=true npm run dev",
17
18
  "dev:frontend": "cd frontend && npm run dev",
18
19
  "dev:frontend:debug": "cd frontend && cross-env VITE_DEBUG_MODE=true npm run dev",
19
- "build": "npm run build:backend && npm run build:frontend",
20
+ "dev:auth": "cd auth && npm run dev",
21
+ "build": "npm run build:backend && npm run build:frontend && npm run build:auth",
20
22
  "build:backend": "cd backend && npm run build",
21
23
  "build:frontend": "cd frontend && npm run build",
24
+ "build:auth": "cd auth && npm run build",
22
25
  "start": "cd backend && npm run start",
23
26
  "start:prod": "npm run build && npm run start",
24
27
  "test": "npm run test:backend && npm run test:frontend",
@@ -28,26 +31,32 @@
28
31
  "lint": "eslint .",
29
32
  "lint:backend": "eslint backend",
30
33
  "lint:frontend": "eslint frontend",
34
+ "lint:auth": "eslint auth",
31
35
  "lint:mcp": "eslint mcp",
32
36
  "lint:fix": "eslint . --fix",
33
37
  "lint:fix:backend": "eslint backend --fix",
34
38
  "lint:fix:frontend": "eslint frontend --fix",
39
+ "lint:fix:auth": "eslint auth --fix",
35
40
  "lint:fix:mcp": "eslint mcp --fix",
36
41
  "format": "prettier --write .",
37
42
  "format:backend": "prettier --write backend",
38
43
  "format:frontend": "prettier --write frontend",
44
+ "format:auth": "prettier --write auth",
39
45
  "format:mcp": "prettier --write mcp",
40
46
  "format:check": "prettier --check .",
41
47
  "format:check:backend": "prettier --check backend",
42
48
  "format:check:frontend": "prettier --check frontend",
49
+ "format:check:auth": "prettier --check auth",
43
50
  "format:check:mcp": "prettier --check mcp",
44
- "typecheck": "npm run typecheck:frontend && npm run typecheck:backend",
51
+ "typecheck": "npm run typecheck:frontend && npm run typecheck:backend && npm run typecheck:auth",
45
52
  "typecheck:frontend": "cd frontend && npx tsc --noEmit",
46
53
  "typecheck:backend": "cd backend && npx tsc --noEmit",
47
- "clean": "npm run clean:backend && npm run clean:frontend",
54
+ "typecheck:auth": "cd auth && npx tsc --noEmit",
55
+ "clean": "npm run clean:backend && npm run clean:frontend && npm run clean:auth",
48
56
  "clean:backend": "cd backend && npm run clean",
49
57
  "clean:frontend": "cd frontend && rimraf dist",
50
- "install:all": "npm install && cd backend && npm install && cd ../frontend && npm install",
58
+ "clean:auth": "cd auth && rimraf dist",
59
+ "install:all": "npm install && cd backend && npm install && cd ../frontend && npm install && cd ../auth && npm install",
51
60
  "release": "release-it",
52
61
  "release:patch": "release-it patch",
53
62
  "release:minor": "release-it minor",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@insforge/shared-schemas",
3
- "version": "1.1.1",
3
+ "version": "1.1.23",
4
4
  "author": "Insforge",
5
5
  "description": "Shared TypeScript schemas for InsForge frontend and backend",
6
6
  "license": "Apache-2.0",
@@ -1,18 +1,36 @@
1
1
  import { z } from 'zod';
2
- import { aiConfigurationSchema, aiUsageRecordSchema } from './ai.schema';
2
+ import { aiConfigurationSchema, aiUsageRecordSchema, modalitySchema } from './ai.schema';
3
3
 
4
4
  // ============= Chat Completion Schemas =============
5
5
 
6
+ // OpenAI-compatible content schemas
7
+ export const textContentSchema = z.object({
8
+ type: z.literal('text'),
9
+ text: z.string(),
10
+ });
11
+
12
+ export const imageContentSchema = z.object({
13
+ type: z.literal('image_url'),
14
+ // eslint-disable-next-line @typescript-eslint/naming-convention
15
+ image_url: z.object({
16
+ // URL can be either a public URL or base64-encoded data URI
17
+ // Examples:
18
+ // - Public URL: "https://example.com/image.jpg"
19
+ // - Base64: "data:image/jpeg;base64,/9j/4AAQ..."
20
+ url: z.string(),
21
+ detail: z.enum(['auto', 'low', 'high']).optional(),
22
+ }),
23
+ });
24
+
25
+ export const contentSchema = z.union([textContentSchema, imageContentSchema]);
26
+
27
+ // Chat message supports both OpenAI format and legacy format for backward compatibility
6
28
  export const chatMessageSchema = z.object({
7
29
  role: z.enum(['user', 'assistant', 'system']),
8
- content: z.string(),
9
- images: z
10
- .array(
11
- z.object({
12
- url: z.string(),
13
- })
14
- )
15
- .optional(),
30
+ // New format: content can be string or array of content parts (OpenAI-compatible)
31
+ content: z.union([z.string(), z.array(contentSchema)]),
32
+ // Legacy format: separate images field (deprecated but supported for backward compatibility)
33
+ images: z.array(z.object({ url: z.string() })).optional(),
16
34
  });
17
35
 
18
36
  export const chatCompletionRequestSchema = z.object({
@@ -76,54 +94,13 @@ export const imageGenerationResponseSchema = z.object({
76
94
  .optional(),
77
95
  });
78
96
 
79
- // OpenRouter-specific model schema
80
- export const openRouterModelSchema = z.object({
97
+ export const aiModelSchema = z.object({
81
98
  id: z.string(),
82
- name: z.string(),
83
- created: z.number(),
84
- description: z.string().optional(),
85
- architecture: z
86
- .object({
87
- inputModalities: z.array(z.string()),
88
- outputModalities: z.array(z.string()),
89
- tokenizer: z.string(),
90
- instructType: z.string(),
91
- })
92
- .optional(),
93
- topProvider: z
94
- .object({
95
- isModerated: z.boolean(),
96
- contextLength: z.number(),
97
- maxCompletionTokens: z.number(),
98
- })
99
- .optional(),
100
- pricing: z.object({
101
- prompt: z.string(),
102
- completion: z.string(),
103
- image: z.string().optional(),
104
- request: z.string().optional(),
105
- webSearch: z.string().optional(),
106
- internalReasoning: z.string().optional(),
107
- inputCacheRead: z.string().optional(),
108
- inputCacheWrite: z.string().optional(),
109
- }),
110
- });
111
-
112
- export const listModelsResponseSchema = z.object({
113
- text: z.array(
114
- z.object({
115
- provider: z.string(),
116
- configured: z.boolean(),
117
- models: z.array(openRouterModelSchema),
118
- })
119
- ),
120
- image: z.array(
121
- z.object({
122
- provider: z.string(),
123
- configured: z.boolean(),
124
- models: z.array(openRouterModelSchema),
125
- })
126
- ),
99
+ inputModality: z.array(modalitySchema).min(1),
100
+ outputModality: z.array(modalitySchema).min(1),
101
+ provider: z.string(),
102
+ modelId: z.string(),
103
+ priceLevel: z.number().min(0).max(3).optional(),
127
104
  });
128
105
 
129
106
  export const createAIConfigurationRequestSchema = aiConfigurationSchema.omit({
@@ -158,8 +135,7 @@ export type ChatCompletionRequest = z.infer<typeof chatCompletionRequestSchema>;
158
135
  export type ChatCompletionResponse = z.infer<typeof chatCompletionResponseSchema>;
159
136
  export type ImageGenerationRequest = z.infer<typeof imageGenerationRequestSchema>;
160
137
  export type ImageGenerationResponse = z.infer<typeof imageGenerationResponseSchema>;
161
- export type OpenRouterModel = z.infer<typeof openRouterModelSchema>;
162
- export type ListModelsResponse = z.infer<typeof listModelsResponseSchema>;
138
+ export type AIModelSchema = z.infer<typeof aiModelSchema>;
163
139
  export type CreateAIConfigurationRequest = z.infer<typeof createAIConfigurationRequestSchema>;
164
140
  export type UpdateAIConfigurationRequest = z.infer<typeof updateAIConfigurationRequestSchema>;
165
141
  export type ListAIUsageResponse = z.infer<typeof listAIUsageResponseSchema>;
@@ -35,6 +35,11 @@ export const aiUsageDataSchema = z.object({
35
35
  export const aiUsageRecordSchema = aiUsageDataSchema.extend({
36
36
  id: z.string().uuid(),
37
37
  createdAt: z.date(),
38
+ modelId: z.string().nullable().optional(),
39
+ model: z.string().nullable(),
40
+ provider: z.string().nullable(),
41
+ inputModality: z.array(modalitySchema).nullable(),
42
+ outputModality: z.array(modalitySchema).nullable(),
38
43
  });
39
44
 
40
45
  export const aiUsageSummarySchema = z.object({
@@ -7,6 +7,8 @@ import {
7
7
  roleSchema,
8
8
  userSchema,
9
9
  oAuthConfigSchema,
10
+ oAuthProvidersSchema,
11
+ authConfigSchema,
10
12
  } from './auth.schema';
11
13
 
12
14
  // ============================================================================
@@ -63,22 +65,107 @@ export const deleteUsersRequestSchema = z.object({
63
65
  userIds: z.array(userIdSchema).min(1, 'At least one user ID is required'),
64
66
  });
65
67
 
68
+ /**
69
+ * POST /api/auth/email/send-verification - Send verification email (code or link based on config)
70
+ */
71
+ export const sendVerificationEmailRequestSchema = z.object({
72
+ email: emailSchema,
73
+ });
74
+
75
+ /**
76
+ * POST /api/auth/email/verify - Verify email with OTP
77
+ * Uses verifyEmailMethod from auth config to determine verification type:
78
+ * - 'code': expects email + 6-digit numeric code
79
+ * - 'link': expects 64-char hex token only
80
+ */
81
+ export const verifyEmailRequestSchema = z
82
+ .object({
83
+ email: emailSchema.optional(),
84
+ otp: z.string().min(1),
85
+ })
86
+ .refine((data) => data.email || data.otp, {
87
+ message: 'Either email or otp must be provided',
88
+ });
89
+
90
+ /**
91
+ * POST /api/auth/email/send-reset-password - Send reset password email (code or link based on config)
92
+ */
93
+ export const sendResetPasswordEmailRequestSchema = z.object({
94
+ email: emailSchema,
95
+ });
96
+
97
+ /**
98
+ * POST /api/auth/email/exchange-reset-password-token - Exchange reset password code for reset token
99
+ * Used in two-step password reset flow (code method only): exchange code for token, then reset password with token
100
+ */
101
+ export const exchangeResetPasswordTokenRequestSchema = z.object({
102
+ email: emailSchema,
103
+ code: z.string().min(1),
104
+ });
105
+
106
+ /**
107
+ * POST /api/auth/email/reset-password - Reset password with token
108
+ * Token can be:
109
+ * - Magic link token (from send-reset-password endpoint when method is 'link')
110
+ * - Reset token (from exchange-reset-password-token endpoint after code verification)
111
+ * Both use RESET_PASSWORD purpose and are verified the same way
112
+ */
113
+ export const resetPasswordRequestSchema = z.object({
114
+ newPassword: passwordSchema,
115
+ otp: z.string().min(1, 'OTP/token is required'),
116
+ });
117
+
66
118
  // ============================================================================
67
119
  // Response schemas
68
120
  // ============================================================================
69
121
 
70
122
  /**
71
123
  * Response for POST /api/auth/users
124
+ * Includes optional redirectTo URL when user is successfully registered and email verification is not required
72
125
  */
73
126
  export const createUserResponseSchema = z.object({
127
+ user: userSchema.optional(),
128
+ accessToken: z.string().nullable(),
129
+ requireEmailVerification: z.boolean().optional(),
130
+ redirectTo: z.string().url().optional(),
131
+ });
132
+
133
+ /**
134
+ * Response for POST /api/auth/sessions
135
+ * Includes user and access token, plus optional redirectTo URL for frontend navigation
136
+ */
137
+ export const createSessionResponseSchema = z.object({
74
138
  user: userSchema,
75
139
  accessToken: z.string(),
140
+ redirectTo: z.string().url().optional(),
76
141
  });
77
142
 
78
143
  /**
79
- * Response for POST /api/auth/sessions
144
+ * Response for POST /api/auth/email/verify
145
+ * Includes user and access token, plus optional redirectTo URL for frontend navigation
80
146
  */
81
- export const createSessionResponseSchema = createUserResponseSchema;
147
+ export const verifyEmailResponseSchema = z.object({
148
+ user: userSchema,
149
+ accessToken: z.string(),
150
+ redirectTo: z.string().url().optional(),
151
+ });
152
+
153
+ /**
154
+ * Response for POST /api/auth/email/exchange-reset-password-token
155
+ * Returns reset token that can be used to reset password
156
+ */
157
+ export const exchangeResetPasswordTokenResponseSchema = z.object({
158
+ token: z.string(),
159
+ expiresAt: z.string().datetime(),
160
+ });
161
+
162
+ /**
163
+ * Response for POST /api/auth/email/reset-password
164
+ * Includes success message
165
+ */
166
+ export const resetPasswordResponseSchema = z.object({
167
+ message: z.string(),
168
+ });
82
169
 
83
170
  /**
84
171
  * Response for POST /api/auth/admin/sessions
@@ -130,20 +217,30 @@ export const getOauthUrlResponseSchema = z.object({
130
217
  /**
131
218
  * POST /api/auth/oauth/configs - Create OAuth configuration
132
219
  */
133
- export const createOAuthConfigRequestSchema = oAuthConfigSchema.extend({
134
- clientSecret: z.string().optional(),
135
- });
220
+ export const createOAuthConfigRequestSchema = oAuthConfigSchema
221
+ .omit({
222
+ id: true,
223
+ createdAt: true,
224
+ updatedAt: true,
225
+ })
226
+ .extend({
227
+ clientSecret: z.string().optional(),
228
+ });
136
229
 
137
230
  /**
138
231
  * PUT /api/auth/oauth/configs/:provider - Update OAuth configuration
139
232
  */
140
233
  export const updateOAuthConfigRequestSchema = oAuthConfigSchema
234
+ .omit({
235
+ id: true,
236
+ provider: true,
237
+ createdAt: true,
238
+ updatedAt: true,
239
+ })
141
240
  .extend({
142
241
  clientSecret: z.string().optional(),
143
242
  })
144
- .omit({
145
- provider: true,
146
- });
243
+ .partial();
147
244
 
148
245
  /**
149
246
  * Response for GET /api/auth/oauth/configs
@@ -153,6 +250,40 @@ export const listOAuthConfigsResponseSchema = z.object({
153
250
  count: z.number(),
154
251
  });
155
252
 
253
+ // ============================================================================
254
+ // Authentication Configuration schemas
255
+ // ============================================================================
256
+
257
+ /**
258
+ * PUT /api/auth/config - Update authentication configuration
259
+ */
260
+ export const updateAuthConfigRequestSchema = authConfigSchema
261
+ .omit({
262
+ id: true,
263
+ createdAt: true,
264
+ updatedAt: true,
265
+ })
266
+ .partial();
267
+
268
+ /**
269
+ * Response for GET /api/auth/config
270
+ */
271
+ export const getAuthConfigResponseSchema = authConfigSchema;
272
+
273
+ /**
274
+ * Response for GET /api/auth/public-config - Unified public auth configuration endpoint
275
+ * Combines OAuth providers and email auth configuration
276
+ */
277
+ export const getPublicAuthConfigResponseSchema = z.object({
278
+ oAuthProviders: z.array(oAuthProvidersSchema),
279
+ ...authConfigSchema.omit({
280
+ id: true,
281
+ updatedAt: true,
282
+ createdAt: true,
283
+ signInRedirectTo: true,
284
+ }).shape,
285
+ });
286
+
156
287
  // ============================================================================
157
288
  // Error response schema
158
289
  // ============================================================================
@@ -179,15 +310,30 @@ export type ListUsersRequest = z.infer<typeof listUsersRequestSchema>;
179
310
  export type DeleteUsersRequest = z.infer<typeof deleteUsersRequestSchema>;
180
311
  export type CreateOAuthConfigRequest = z.infer<typeof createOAuthConfigRequestSchema>;
181
312
  export type UpdateOAuthConfigRequest = z.infer<typeof updateOAuthConfigRequestSchema>;
313
+ export type UpdateAuthConfigRequest = z.infer<typeof updateAuthConfigRequestSchema>;
314
+ export type SendVerificationEmailRequest = z.infer<typeof sendVerificationEmailRequestSchema>;
315
+ export type VerifyEmailRequest = z.infer<typeof verifyEmailRequestSchema>;
316
+ export type SendResetPasswordEmailRequest = z.infer<typeof sendResetPasswordEmailRequestSchema>;
317
+ export type ExchangeResetPasswordTokenRequest = z.infer<
318
+ typeof exchangeResetPasswordTokenRequestSchema
319
+ >;
320
+ export type ResetPasswordRequest = z.infer<typeof resetPasswordRequestSchema>;
182
321
 
183
322
  // Response types for type-safe responses
184
323
  export type CreateUserResponse = z.infer<typeof createUserResponseSchema>;
185
324
  export type CreateSessionResponse = z.infer<typeof createSessionResponseSchema>;
325
+ export type VerifyEmailResponse = z.infer<typeof verifyEmailResponseSchema>;
326
+ export type ExchangeResetPasswordTokenResponse = z.infer<
327
+ typeof exchangeResetPasswordTokenResponseSchema
328
+ >;
329
+ export type ResetPasswordResponse = z.infer<typeof resetPasswordResponseSchema>;
186
330
  export type CreateAdminSessionResponse = z.infer<typeof createAdminSessionResponseSchema>;
187
331
  export type GetCurrentSessionResponse = z.infer<typeof getCurrentSessionResponseSchema>;
188
332
  export type ListUsersResponse = z.infer<typeof listUsersResponseSchema>;
189
333
  export type DeleteUsersResponse = z.infer<typeof deleteUsersResponseSchema>;
190
334
  export type GetOauthUrlResponse = z.infer<typeof getOauthUrlResponseSchema>;
191
335
  export type ListOAuthConfigsResponse = z.infer<typeof listOAuthConfigsResponseSchema>;
336
+ export type GetAuthConfigResponse = z.infer<typeof getAuthConfigResponseSchema>;
337
+ export type GetPublicAuthConfigResponse = z.infer<typeof getPublicAuthConfigResponseSchema>;
192
338
 
193
339
  export type AuthErrorResponse = z.infer<typeof authErrorResponseSchema>;
@@ -13,10 +13,7 @@ export const userIdSchema = z.string().uuid('Invalid user ID format');
13
13
 
14
14
  export const emailSchema = z.string().email('Invalid email format').toLowerCase().trim();
15
15
 
16
- export const passwordSchema = z
17
- .string()
18
- .min(6, 'Password must be at least 6 characters')
19
- .max(32, 'Password must be less than 32 characters');
16
+ export const passwordSchema = z.string();
20
17
 
21
18
  export const nameSchema = z
22
19
  .string()
@@ -26,6 +23,8 @@ export const nameSchema = z
26
23
 
27
24
  export const roleSchema = z.enum(['authenticated', 'project_admin']);
28
25
 
26
+ export const verificationMethodSchema = z.enum(['code', 'link']);
27
+
29
28
  // ============================================================================
30
29
  // Core entity schemas
31
30
  // ============================================================================
@@ -54,7 +53,19 @@ export const userSchema = z.object({
54
53
  * OAuth state for redirect handling
55
54
  */
56
55
 
57
- export const oAuthProvidersSchema = z.enum(['google', 'github']);
56
+ export const oAuthProvidersSchema = z.enum([
57
+ 'google',
58
+ 'github',
59
+ 'discord',
60
+ 'linkedin',
61
+ 'facebook',
62
+ 'instagram',
63
+ 'tiktok',
64
+ 'apple',
65
+ 'x',
66
+ 'spotify',
67
+ 'microsoft',
68
+ ]);
58
69
 
59
70
  export const oAuthStateSchema = z.object({
60
71
  provider: oAuthProvidersSchema,
@@ -63,11 +74,33 @@ export const oAuthStateSchema = z.object({
63
74
 
64
75
  // OAuth provider configuration schema
65
76
  export const oAuthConfigSchema = z.object({
66
- provider: z.string(),
77
+ id: z.string().uuid(),
78
+ provider: oAuthProvidersSchema,
67
79
  clientId: z.string().optional(),
68
80
  scopes: z.array(z.string()).optional(),
69
81
  redirectUri: z.string().optional(),
70
82
  useSharedKey: z.boolean(),
83
+ createdAt: z.string(), // PostgreSQL timestamp
84
+ updatedAt: z.string(), // PostgreSQL timestamp
85
+ });
86
+
87
+ // Email authentication configuration schema
88
+ export const authConfigSchema = z.object({
89
+ id: z.string().uuid(),
90
+ requireEmailVerification: z.boolean(),
91
+ passwordMinLength: z.number().min(4).max(128),
92
+ requireNumber: z.boolean(),
93
+ requireLowercase: z.boolean(),
94
+ requireUppercase: z.boolean(),
95
+ requireSpecialChar: z.boolean(),
96
+ verifyEmailMethod: verificationMethodSchema,
97
+ resetPasswordMethod: verificationMethodSchema,
98
+ signInRedirectTo: z
99
+ .union([z.string().url(), z.literal(''), z.null()])
100
+ .optional()
101
+ .transform((val) => (val === '' ? null : val)),
102
+ createdAt: z.string(), // PostgreSQL timestamp
103
+ updatedAt: z.string(), // PostgreSQL timestamp
71
104
  });
72
105
 
73
106
  /**
@@ -89,6 +122,9 @@ export type UserIdSchema = z.infer<typeof userIdSchema>;
89
122
  export type EmailSchema = z.infer<typeof emailSchema>;
90
123
  export type PasswordSchema = z.infer<typeof passwordSchema>;
91
124
  export type RoleSchema = z.infer<typeof roleSchema>;
125
+ export type VerificationMethodSchema = z.infer<typeof verificationMethodSchema>;
92
126
  export type UserSchema = z.infer<typeof userSchema>;
93
127
  export type TokenPayloadSchema = z.infer<typeof tokenPayloadSchema>;
94
128
  export type OAuthConfigSchema = z.infer<typeof oAuthConfigSchema>;
129
+ export type OAuthProvidersSchema = z.infer<typeof oAuthProvidersSchema>;
130
+ export type AuthConfigSchema = z.infer<typeof authConfigSchema>;
@@ -0,0 +1,57 @@
1
+ import { z } from 'zod';
2
+
3
+ export const appRouteChangeEventSchema = z.object({
4
+ type: z.literal('APP_ROUTE_CHANGE'),
5
+ path: z.string(),
6
+ });
7
+
8
+ export const authSuccessEventSchema = z.object({
9
+ type: z.literal('AUTH_SUCCESS'),
10
+ });
11
+
12
+ export const authErrorEventSchema = z.object({
13
+ type: z.literal('AUTH_ERROR'),
14
+ message: z.string(),
15
+ });
16
+
17
+ export const mcpConnectionStatusEventSchema = z.object({
18
+ type: z.literal('MCP_CONNECTION_STATUS'),
19
+ connected: z.boolean(),
20
+ toolName: z.string(),
21
+ timestamp: z.union([z.number(), z.string()]),
22
+ });
23
+
24
+ export const showOnboardingOverlayEventSchema = z.object({
25
+ type: z.literal('SHOW_ONBOARDING_OVERLAY'),
26
+ });
27
+
28
+ export const showSettingsOverlayEventSchema = z.object({
29
+ type: z.literal('SHOW_SETTINGS_OVERLAY'),
30
+ });
31
+
32
+ export const onboardingSuccessSchema = z.object({
33
+ type: z.literal('ONBOARDING_SUCCESS'),
34
+ });
35
+
36
+ export const navigateToUsageSchema = z.object({
37
+ type: z.literal('NAVIGATE_TO_USAGE'),
38
+ });
39
+
40
+ export const cloudEventSchema = z.discriminatedUnion('type', [
41
+ appRouteChangeEventSchema,
42
+ authSuccessEventSchema,
43
+ authErrorEventSchema,
44
+ mcpConnectionStatusEventSchema,
45
+ showOnboardingOverlayEventSchema,
46
+ showSettingsOverlayEventSchema,
47
+ onboardingSuccessSchema,
48
+ navigateToUsageSchema,
49
+ ]);
50
+
51
+ export type AppRouteChangeEvent = z.infer<typeof appRouteChangeEventSchema>;
52
+ export type AuthSuccessEvent = z.infer<typeof authSuccessEventSchema>;
53
+ export type AuthErrorEvent = z.infer<typeof authErrorEventSchema>;
54
+ export type McpConnectionStatusEvent = z.infer<typeof mcpConnectionStatusEventSchema>;
55
+ export type CloudEvent = z.infer<typeof cloudEventSchema>;
56
+ export type ShowOnboardingOverlayEvent = z.infer<typeof showOnboardingOverlayEventSchema>;
57
+ export type ShowSettingsOverlayEvent = z.infer<typeof showSettingsOverlayEventSchema>;
@@ -79,11 +79,11 @@ export const deleteTableResponse = z.object({
79
79
  // Raw SQL Schemas
80
80
  export const rawSQLRequestSchema = z.object({
81
81
  query: z.string().min(1, 'Query is required'),
82
- params: z.array(z.any()).optional(),
82
+ params: z.array(z.unknown()).optional(),
83
83
  });
84
84
 
85
85
  export const rawSQLResponseSchema = z.object({
86
- rows: z.array(z.any()),
86
+ rows: z.array(z.record(z.string(), z.unknown())),
87
87
  rowCount: z.number().nullable(),
88
88
  fields: z
89
89
  .array(
@@ -160,7 +160,7 @@ export const exportJsonDataSchema = z.object({
160
160
  oldTable: z.string().nullable(),
161
161
  })
162
162
  ),
163
- rows: z.array(z.any()).optional(),
163
+ rows: z.array(z.record(z.string(), z.unknown())).optional(),
164
164
  recordCount: z.number().optional(),
165
165
  })
166
166
  ),
@@ -57,7 +57,7 @@ export const tableSchema = z.object({
57
57
  .min(1, 'Table name cannot be empty')
58
58
  .max(64, 'Table name must be less than 64 characters'),
59
59
  columns: z.array(columnSchema).min(1, 'At least one column is required'),
60
- recordCount: z.number().default(0),
60
+ recordCount: z.number().optional(),
61
61
  createdAt: z.string().optional(),
62
62
  updatedAt: z.string().optional(),
63
63
  });
@@ -11,3 +11,4 @@ export * from './logs.schema';
11
11
  export * from './logs-api.schema';
12
12
  export * from './functions.schema';
13
13
  export * from './functions-api.schema';
14
+ export * from './cloud-events.schema';
@@ -1,5 +1,5 @@
1
1
  import { z } from 'zod';
2
- import { auditLogSchema } from './logs.schema';
2
+ import { auditLogSchema, logSchema } from './logs.schema';
3
3
 
4
4
  export const getAuditLogsRequestSchema = z.object({
5
5
  limit: z.number().default(100),
@@ -41,9 +41,15 @@ export const clearAuditLogsResponseSchema = z.object({
41
41
  deleted: z.number(),
42
42
  });
43
43
 
44
+ export const getLogsResponseSchema = z.object({
45
+ logs: z.array(logSchema),
46
+ total: z.number(),
47
+ });
48
+
44
49
  export type GetAuditLogsRequest = z.infer<typeof getAuditLogsRequestSchema>;
45
50
  export type GetAuditLogsResponse = z.infer<typeof getAuditLogsResponseSchema>;
46
51
  export type GetAuditLogStatsRequest = z.infer<typeof getAuditLogStatsRequestSchema>;
47
52
  export type GetAuditLogStatsResponse = z.infer<typeof getAuditLogStatsResponseSchema>;
48
53
  export type ClearAuditLogsRequest = z.infer<typeof clearAuditLogsRequestSchema>;
49
54
  export type ClearAuditLogsResponse = z.infer<typeof clearAuditLogsResponseSchema>;
55
+ export type GetLogsResponse = z.infer<typeof getLogsResponseSchema>;
@@ -1,5 +1,6 @@
1
1
  import { z } from 'zod';
2
2
 
3
+ // Audit log schemas
3
4
  export const auditLogSchema = z.object({
4
5
  id: z.string(),
5
6
  actor: z.string(),
@@ -12,3 +13,28 @@ export const auditLogSchema = z.object({
12
13
  });
13
14
 
14
15
  export type AuditLogSchema = z.infer<typeof auditLogSchema>;
16
+
17
+ // System log schemas
18
+ export const logSourceSchema = z.object({
19
+ id: z.string(),
20
+ name: z.string(),
21
+ token: z.string(),
22
+ });
23
+
24
+ export const logSchema = z.object({
25
+ id: z.string(),
26
+ eventMessage: z.string(),
27
+ timestamp: z.string(),
28
+ body: z.record(z.string(), z.unknown()),
29
+ source: z.string().optional(),
30
+ });
31
+
32
+ export const logStatsSchema = z.object({
33
+ source: z.string(),
34
+ count: z.number(),
35
+ lastActivity: z.string(),
36
+ });
37
+
38
+ export type LogSourceSchema = z.infer<typeof logSourceSchema>;
39
+ export type LogSchema = z.infer<typeof logSchema>;
40
+ export type LogStatsSchema = z.infer<typeof logStatsSchema>;