insforge 0.3.3 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (635) hide show
  1. package/.claude-plugin/marketplace.json +20 -0
  2. package/.dockerignore +60 -57
  3. package/.env.example +84 -49
  4. package/.github/ISSUE_TEMPLATE/bug_report.yml +36 -83
  5. package/.github/ISSUE_TEMPLATE/config.yml +11 -11
  6. package/.github/ISSUE_TEMPLATE/feature_request.yml +26 -79
  7. package/.github/PULL_REQUEST_TEMPLATE.md +7 -0
  8. package/.github/copilot-instructions.md +146 -146
  9. package/.github/workflows/build-image.yml +66 -65
  10. package/.github/workflows/ci-premerge-check.yml +23 -23
  11. package/.github/workflows/e2e.yml +63 -0
  12. package/.github/workflows/lint-and-format.yml +32 -32
  13. package/.prettierignore +64 -64
  14. package/CHANGELOG.md +44 -3
  15. package/CLAUDE_PLUGIN.md +104 -0
  16. package/CODE_OF_CONDUCT.md +128 -0
  17. package/CONTRIBUTING.md +125 -125
  18. package/Dockerfile +30 -27
  19. package/GITHUB_OAUTH_SETUP.md +49 -49
  20. package/GOOGLE_OAUTH_SETUP.md +148 -148
  21. package/LICENSE +201 -201
  22. package/README.md +182 -134
  23. package/assets/Dark.svg +23 -23
  24. package/assets/mcpInstallv2.png +0 -0
  25. package/assets/sampleResponse.png +0 -0
  26. package/auth/index.html +13 -0
  27. package/auth/package.json +28 -0
  28. package/auth/public/favicon.ico +0 -0
  29. package/auth/src/App.tsx +33 -0
  30. package/auth/src/components/ErrorCard.tsx +37 -0
  31. package/auth/src/components/Layout.tsx +13 -0
  32. package/auth/src/index.css +19 -0
  33. package/auth/src/lib/broadcastService.ts +117 -0
  34. package/auth/src/lib/utils.ts +11 -0
  35. package/auth/src/main.tsx +22 -0
  36. package/auth/src/pages/ForgotPasswordPage.tsx +11 -0
  37. package/auth/src/pages/ResetPasswordPage.tsx +11 -0
  38. package/auth/src/pages/SignInPage.tsx +60 -0
  39. package/auth/src/pages/SignUpPage.tsx +60 -0
  40. package/auth/src/pages/VerifyEmailPage.tsx +20 -0
  41. package/auth/src/vite-env.d.ts +10 -0
  42. package/auth/tsconfig.json +32 -0
  43. package/auth/tsconfig.node.json +11 -0
  44. package/auth/vite.config.ts +25 -0
  45. package/backend/package.json +78 -75
  46. package/backend/src/api/{middleware → middlewares}/auth.ts +8 -9
  47. package/backend/src/api/middlewares/rate-limiters.ts +127 -0
  48. package/backend/src/api/routes/{ai.ts → ai/index.routes.ts} +22 -26
  49. package/backend/src/api/routes/auth/index.routes.ts +667 -0
  50. package/backend/src/api/routes/auth/oauth.routes.ts +473 -0
  51. package/backend/src/api/routes/{database.advance.ts → database/advance.routes.ts} +128 -65
  52. package/backend/src/api/routes/database/index.routes.ts +90 -0
  53. package/backend/src/api/routes/{database.records.ts → database/records.routes.ts} +26 -12
  54. package/backend/src/api/routes/{database.tables.ts → database/tables.routes.ts} +6 -23
  55. package/backend/src/api/routes/docs/index.routes.ts +75 -0
  56. package/backend/src/api/routes/email/index.routes.ts +35 -0
  57. package/backend/src/api/routes/functions/index.routes.ts +194 -0
  58. package/backend/src/api/routes/{logs.ts → logs/index.routes.ts} +25 -30
  59. package/backend/src/api/routes/{metadata.ts → metadata/index.routes.ts} +33 -31
  60. package/backend/src/api/routes/realtime/channels.routes.ts +81 -0
  61. package/backend/src/api/routes/realtime/index.routes.ts +12 -0
  62. package/backend/src/api/routes/realtime/messages.routes.ts +48 -0
  63. package/backend/src/api/routes/realtime/permissions.routes.ts +19 -0
  64. package/backend/src/api/routes/{secrets.ts → secrets/index.routes.ts} +27 -22
  65. package/backend/src/api/routes/{storage.ts → storage/index.routes.ts} +48 -61
  66. package/backend/src/api/routes/usage/index.routes.ts +91 -0
  67. package/backend/src/infra/config/app.config.ts +51 -0
  68. package/backend/src/infra/database/database.manager.ts +182 -0
  69. package/backend/{migrations → src/infra/database/migrations}/000_create-base-tables.sql +141 -141
  70. package/backend/{migrations → src/infra/database/migrations}/001_create-helper-functions.sql +40 -40
  71. package/backend/{migrations → src/infra/database/migrations}/002_rename-auth-tables.sql +29 -29
  72. package/backend/{migrations → src/infra/database/migrations}/003_create-users-table.sql +55 -55
  73. package/backend/{migrations → src/infra/database/migrations}/004_add-reload-postgrest-func.sql +23 -23
  74. package/backend/{migrations → src/infra/database/migrations}/005_enable-project-admin-modify-users.sql +29 -29
  75. package/backend/{migrations → src/infra/database/migrations}/006_modify-ai-usage-table.sql +24 -24
  76. package/backend/{migrations → src/infra/database/migrations}/007_drop-metadata-table.sql +1 -1
  77. package/backend/{migrations → src/infra/database/migrations}/008_add-system-tables.sql +76 -76
  78. package/backend/{migrations → src/infra/database/migrations}/009_add-function-secrets.sql +23 -23
  79. package/backend/{migrations → src/infra/database/migrations}/010_modify-ai-config-modalities.sql +93 -93
  80. package/backend/{migrations → src/infra/database/migrations}/011_refactor-secrets-table.sql +15 -15
  81. package/backend/{migrations → src/infra/database/migrations}/012_add-storage-uploaded-by.sql +7 -7
  82. package/backend/src/infra/database/migrations/013_create-auth-schema-functions.sql +44 -0
  83. package/backend/src/infra/database/migrations/014_add-updated-at-trigger-user-table.sql +8 -0
  84. package/backend/src/infra/database/migrations/015_create-auth-config-and-email-otp-tables.sql +60 -0
  85. package/backend/src/infra/database/migrations/016_update-auth-config-and-email-otp.sql +24 -0
  86. package/backend/src/infra/database/migrations/017_create-realtime-schema.sql +233 -0
  87. package/backend/src/infra/realtime/realtime.manager.ts +246 -0
  88. package/backend/src/infra/realtime/webhook-sender.ts +82 -0
  89. package/backend/src/{core/secrets/encryption.ts → infra/security/encryption.manager.ts} +3 -2
  90. package/backend/src/infra/security/token.manager.ts +219 -0
  91. package/backend/src/infra/socket/socket.manager.ts +522 -0
  92. package/backend/src/providers/ai/openrouter.provider.ts +380 -0
  93. package/backend/src/providers/email/base.provider.ts +38 -0
  94. package/backend/src/providers/email/cloud.provider.ts +271 -0
  95. package/backend/src/{core/logs/providers → providers/logs}/base.provider.ts +11 -11
  96. package/backend/src/{core/logs/providers → providers/logs}/cloudwatch.provider.ts +61 -38
  97. package/backend/src/providers/logs/local.provider.ts +185 -0
  98. package/backend/src/providers/oauth/apple.provider.ts +266 -0
  99. package/backend/src/providers/oauth/base.provider.ts +29 -0
  100. package/backend/src/providers/oauth/discord.provider.ts +195 -0
  101. package/backend/src/providers/oauth/facebook.provider.ts +194 -0
  102. package/backend/src/providers/oauth/github.provider.ts +208 -0
  103. package/backend/src/providers/oauth/google.provider.ts +249 -0
  104. package/backend/src/providers/oauth/index.ts +8 -0
  105. package/backend/src/providers/oauth/linkedin.provider.ts +240 -0
  106. package/backend/src/providers/oauth/microsoft.provider.ts +169 -0
  107. package/backend/src/providers/oauth/x.provider.ts +202 -0
  108. package/backend/src/providers/storage/base.provider.ts +29 -0
  109. package/backend/src/providers/storage/local.provider.ts +103 -0
  110. package/backend/src/providers/storage/s3.provider.ts +313 -0
  111. package/backend/src/server.ts +317 -288
  112. package/backend/src/{core/ai/config.ts → services/ai/ai-config.service.ts} +19 -24
  113. package/backend/src/services/ai/ai-model.service.ts +60 -0
  114. package/backend/src/{core/ai/usage.ts → services/ai/ai-usage.service.ts} +28 -35
  115. package/backend/src/{core/ai/chat.ts → services/ai/chat-completion.service.ts} +37 -24
  116. package/backend/src/services/ai/helpers.ts +64 -0
  117. package/backend/src/{core/ai/image.ts → services/ai/image-generation.service.ts} +17 -19
  118. package/backend/src/services/ai/index.ts +13 -0
  119. package/backend/src/services/auth/auth-config.service.ts +250 -0
  120. package/backend/src/services/auth/auth-otp.service.ts +424 -0
  121. package/backend/src/services/auth/auth.service.ts +1150 -0
  122. package/backend/src/services/auth/index.ts +4 -0
  123. package/backend/src/{core/auth/oauth.ts → services/auth/oauth-config.service.ts} +106 -52
  124. package/backend/src/{core/database/advance.ts → services/database/database-advance.service.ts} +97 -131
  125. package/backend/src/services/database/database-table.service.ts +802 -0
  126. package/backend/src/services/database/database.service.ts +127 -0
  127. package/backend/src/services/email/email.service.ts +73 -0
  128. package/backend/src/{core/functions/functions.ts → services/functions/function.service.ts} +95 -88
  129. package/backend/src/{core/logs/audit.ts → services/logs/audit.service.ts} +92 -75
  130. package/backend/src/services/logs/log.service.ts +73 -0
  131. package/backend/src/services/realtime/index.ts +3 -0
  132. package/backend/src/services/realtime/realtime-auth.service.ts +104 -0
  133. package/backend/src/services/realtime/realtime-channel.service.ts +237 -0
  134. package/backend/src/services/realtime/realtime-message.service.ts +260 -0
  135. package/backend/src/{core/secrets/secrets.ts → services/secrets/secret.service.ts} +48 -66
  136. package/backend/src/services/storage/storage.service.ts +617 -0
  137. package/backend/src/services/usage/usage.service.ts +149 -0
  138. package/backend/src/types/auth.ts +77 -2
  139. package/backend/src/types/email.ts +8 -0
  140. package/backend/src/types/error-constants.ts +4 -0
  141. package/backend/src/types/logs.ts +0 -29
  142. package/backend/src/types/realtime.ts +18 -0
  143. package/backend/src/{core/socket/types.ts → types/socket.ts} +11 -36
  144. package/backend/src/utils/cookies.ts +35 -0
  145. package/backend/src/utils/environment.ts +9 -3
  146. package/backend/src/utils/logger.ts +20 -2
  147. package/backend/src/utils/s3-config-loader.ts +64 -0
  148. package/backend/src/utils/seed.ts +301 -205
  149. package/backend/src/utils/sql-parser.ts +91 -1
  150. package/backend/src/utils/utils.ts +114 -0
  151. package/backend/src/utils/validations.ts +40 -4
  152. package/backend/tests/README.md +133 -133
  153. package/backend/tests/cleanup-all-test-data.sh +230 -230
  154. package/backend/tests/cloud/test-s3-multitenant.sh +131 -131
  155. package/backend/tests/local/comprehensive-curl-tests.sh +155 -155
  156. package/backend/tests/local/test-ai-config.sh +129 -0
  157. package/backend/tests/local/test-ai-usage.sh +80 -0
  158. package/backend/tests/local/test-auth-router.sh +143 -143
  159. package/backend/tests/local/test-database-router.sh +222 -222
  160. package/backend/tests/local/test-e2e.sh +240 -240
  161. package/backend/tests/local/test-fk-errors.sh +96 -96
  162. package/backend/tests/local/test-functions.sh +123 -0
  163. package/backend/tests/local/test-id-field.sh +200 -200
  164. package/backend/tests/local/test-logs.sh +132 -0
  165. package/backend/tests/local/test-public-bucket.sh +264 -264
  166. package/backend/tests/local/test-secrets.sh +249 -247
  167. package/backend/tests/local/test-serverless-functions.sh.disabled +325 -325
  168. package/backend/tests/local/test-traditional-rest.sh +208 -208
  169. package/backend/tests/manual/README.md +50 -50
  170. package/backend/tests/manual/create-large-table-simple.sql +10 -10
  171. package/backend/tests/manual/seed-large-table.sql +100 -100
  172. package/backend/tests/manual/setup-large-table-extras.sql +33 -33
  173. package/backend/tests/manual/test-bulk-upsert.sh +409 -409
  174. package/backend/tests/manual/test-database-advance.sh +296 -296
  175. package/backend/tests/manual/test-postgrest-stability.sh +191 -191
  176. package/backend/tests/manual/test-rawsql-export-import.sh +411 -411
  177. package/backend/tests/manual/test-rawsql-modes.sh +244 -0
  178. package/backend/tests/manual/test-universal-storage.sh +263 -263
  179. package/backend/tests/manual/test-users.sql +17 -17
  180. package/backend/tests/run-all-tests.sh +139 -139
  181. package/backend/tests/setup.ts +0 -0
  182. package/backend/tests/test-config.sh +338 -302
  183. package/backend/tests/unit/analyze-query.test.ts +697 -0
  184. package/backend/tests/unit/cloud-token.test.ts +48 -0
  185. package/backend/tests/unit/constant.test.ts +8 -0
  186. package/backend/tests/unit/email.test.ts +372 -0
  187. package/backend/tests/unit/environment.test.ts +59 -0
  188. package/backend/tests/unit/helpers.test.ts +63 -0
  189. package/backend/tests/unit/logger.test.ts +22 -0
  190. package/backend/tests/unit/rate-limit.test.ts +154 -0
  191. package/backend/tests/unit/response.test.ts +58 -0
  192. package/backend/tests/unit/sql-parser.test.ts +74 -0
  193. package/backend/tests/unit/uuid.test.ts +21 -0
  194. package/backend/tests/unit/validations.test.ts +80 -0
  195. package/backend/tsconfig.json +22 -22
  196. package/backend/vitest.config.ts +11 -0
  197. package/claude-plugin/.claude-plugin/plugin.json +24 -0
  198. package/claude-plugin/README.md +133 -0
  199. package/claude-plugin/skills/insforge-schema-patterns/SKILL.md +270 -0
  200. package/docker-compose.prod.yml +204 -144
  201. package/docker-compose.yml +232 -167
  202. package/docker-init/db/db-init.sql +97 -125
  203. package/docker-init/db/jwt.sql +5 -5
  204. package/docker-init/db/postgresql.conf +16 -16
  205. package/docker-init/logs/vector.yml +236 -0
  206. package/docs/README.md +44 -0
  207. package/docs/agent-docs/real-time.md +269 -0
  208. package/docs/changelog.mdx +119 -0
  209. package/docs/core-concepts/ai/architecture.mdx +373 -0
  210. package/docs/core-concepts/ai/sdk.mdx +213 -0
  211. package/docs/core-concepts/authentication/architecture.mdx +278 -0
  212. package/docs/core-concepts/authentication/sdk.mdx +414 -0
  213. package/docs/core-concepts/authentication/ui-components/customization.mdx +529 -0
  214. package/docs/core-concepts/authentication/ui-components/nextjs.mdx +221 -0
  215. package/docs/core-concepts/authentication/ui-components/react-router.mdx +184 -0
  216. package/docs/core-concepts/authentication/ui-components/react.mdx +129 -0
  217. package/docs/core-concepts/database/architecture.mdx +256 -0
  218. package/docs/core-concepts/database/sdk.mdx +382 -0
  219. package/docs/core-concepts/email/architecture.mdx +101 -0
  220. package/docs/core-concepts/email/sdk.mdx +53 -0
  221. package/docs/core-concepts/functions/architecture.mdx +105 -0
  222. package/docs/core-concepts/functions/sdk.mdx +184 -0
  223. package/docs/core-concepts/realtime/architecture.mdx +446 -0
  224. package/docs/core-concepts/realtime/sdk.mdx +409 -0
  225. package/docs/core-concepts/storage/architecture.mdx +243 -0
  226. package/docs/core-concepts/storage/sdk.mdx +253 -0
  227. package/docs/deployment/README.md +94 -0
  228. package/docs/deployment/deploy-to-aws-ec2.md +565 -0
  229. package/docs/deployment/deploy-to-azure-virtual-machines.md +313 -0
  230. package/docs/deployment/deploy-to-google-cloud-compute-engine.md +613 -0
  231. package/docs/deployment/deploy-to-render.md +441 -0
  232. package/docs/deprecated/insforge-auth-api.md +214 -214
  233. package/docs/deprecated/insforge-auth-sdk.md +99 -99
  234. package/docs/deprecated/insforge-db-api.md +358 -358
  235. package/docs/deprecated/insforge-db-sdk.md +139 -139
  236. package/docs/deprecated/insforge-debug-sdk.md +156 -156
  237. package/docs/deprecated/insforge-debug.md +64 -64
  238. package/docs/deprecated/insforge-instructions.md +123 -123
  239. package/docs/deprecated/insforge-project.md +117 -117
  240. package/docs/deprecated/insforge-storage-api.md +278 -278
  241. package/docs/deprecated/insforge-storage-sdk.md +158 -158
  242. package/docs/docs.json +232 -0
  243. package/docs/examples/framework-guides/nextjs.mdx +131 -0
  244. package/docs/examples/framework-guides/nuxt.mdx +165 -0
  245. package/docs/examples/framework-guides/react.mdx +165 -0
  246. package/docs/examples/framework-guides/svelte.mdx +153 -0
  247. package/docs/examples/framework-guides/vue.mdx +159 -0
  248. package/docs/examples/overview.mdx +67 -0
  249. package/docs/favicon.svg +19 -0
  250. package/docs/images/changelog/dec-2025/ai-integration.png +0 -0
  251. package/docs/images/changelog/dec-2025/ai-models.webp +0 -0
  252. package/docs/images/changelog/dec-2025/alipay-payment.webp +0 -0
  253. package/docs/images/changelog/dec-2025/apple-login.jpg +0 -0
  254. package/docs/images/changelog/dec-2025/mcp-installer.png +0 -0
  255. package/docs/images/changelog/dec-2025/realtime-module.jpg +0 -0
  256. package/docs/images/changelog/nov-2025/auth-components.webp +0 -0
  257. package/docs/images/changelog/nov-2025/database-metadata.webp +0 -0
  258. package/docs/images/changelog/nov-2025/quickstart-prompts.webp +0 -0
  259. package/docs/images/changelog/nov-2025/sql-editor.webp +0 -0
  260. package/docs/images/changelog/nov-2025/usage-page.webp +0 -0
  261. package/docs/images/changelog/october-2025/csv-upload.webp +0 -0
  262. package/docs/images/changelog/october-2025/logs-feature.webp +0 -0
  263. package/docs/images/changelog/october-2025/oauth-providers.webp +0 -0
  264. package/docs/images/checks-passed.png +0 -0
  265. package/docs/images/dashboard-connect-expanded.png +0 -0
  266. package/docs/images/dashboard-connect.png +0 -0
  267. package/docs/images/hero-dark.png +0 -0
  268. package/docs/images/hero-light.png +0 -0
  269. package/docs/images/icons/ai.svg +4 -0
  270. package/docs/images/icons/auth.svg +1 -0
  271. package/docs/images/icons/database.svg +1 -0
  272. package/docs/images/icons/function.svg +1 -0
  273. package/docs/images/icons/storage.svg +1 -0
  274. package/docs/images/logos/nextjs.svg +4 -0
  275. package/docs/images/logos/nuxt.svg +4 -0
  276. package/docs/images/logos/react.svg +5 -0
  277. package/docs/images/logos/svelte.svg +4 -0
  278. package/docs/images/logos/vue.svg +5 -0
  279. package/docs/images/mcp-install.png +0 -0
  280. package/docs/images/onboarding-mcp.png +0 -0
  281. package/docs/insforge-instructions-sdk.md +89 -407
  282. package/docs/introduction.mdx +45 -0
  283. package/docs/logo/dark.svg +22 -0
  284. package/docs/logo/light.svg +20 -0
  285. package/docs/partnership.mdx +652 -0
  286. package/docs/quickstart.mdx +83 -0
  287. package/docs/showcase/2048-arena.png +0 -0
  288. package/docs/showcase/framegen-cloud.png +0 -0
  289. package/docs/showcase/line-connect-race.png +0 -0
  290. package/docs/showcase/moment-vibe.png +0 -0
  291. package/docs/showcase/national-flags.png +0 -0
  292. package/docs/showcase/pokemon-vibe.png +0 -0
  293. package/docs/showcase/pure-browse-buy.png +0 -0
  294. package/docs/showcase.mdx +52 -0
  295. package/docs/snippets/sdk-installation.mdx +22 -0
  296. package/docs/snippets/service-icons.mdx +27 -0
  297. package/eslint.config.js +10 -3
  298. package/examples/oauth/frontend-oauth-example.html +250 -250
  299. package/examples/response-examples.md +443 -443
  300. package/frontend/components.json +17 -17
  301. package/frontend/package.json +69 -63
  302. package/frontend/src/App.tsx +13 -82
  303. package/frontend/src/assets/icons/checkbox_checked.svg +6 -6
  304. package/frontend/src/assets/icons/checkbox_undetermined.svg +6 -6
  305. package/frontend/src/assets/icons/checked.svg +3 -3
  306. package/frontend/src/assets/icons/connected.svg +3 -0
  307. package/frontend/src/assets/icons/error.svg +3 -3
  308. package/frontend/src/assets/icons/loader.svg +9 -0
  309. package/frontend/src/assets/icons/pencil.svg +4 -4
  310. package/frontend/src/assets/icons/refresh.svg +4 -4
  311. package/frontend/src/assets/icons/step_active.svg +3 -3
  312. package/frontend/src/assets/icons/step_inactive.svg +11 -11
  313. package/frontend/src/assets/icons/warning.svg +3 -3
  314. package/frontend/src/assets/logos/apple.svg +4 -0
  315. package/frontend/src/assets/logos/claude_code.svg +3 -3
  316. package/frontend/src/assets/logos/cline.svg +6 -6
  317. package/frontend/src/assets/logos/cursor.svg +20 -20
  318. package/frontend/src/assets/logos/discord.svg +8 -8
  319. package/frontend/src/assets/logos/facebook.svg +3 -0
  320. package/frontend/src/assets/logos/gemini.svg +19 -19
  321. package/frontend/src/assets/logos/github.svg +5 -5
  322. package/frontend/src/assets/logos/google.svg +13 -13
  323. package/frontend/src/assets/logos/grok.svg +10 -10
  324. package/frontend/src/assets/logos/insforge_dark.svg +15 -15
  325. package/frontend/src/assets/logos/insforge_light.svg +15 -15
  326. package/frontend/src/assets/logos/instagram.svg +2 -0
  327. package/frontend/src/assets/logos/linkedin.svg +3 -0
  328. package/frontend/src/assets/logos/microsoft.svg +1 -0
  329. package/frontend/src/assets/logos/openai.svg +10 -10
  330. package/frontend/src/assets/logos/roo_code.svg +9 -9
  331. package/frontend/src/assets/logos/spotify.svg +17 -0
  332. package/frontend/src/assets/logos/tiktok.svg +6 -0
  333. package/frontend/src/assets/logos/trae.svg +3 -3
  334. package/frontend/src/assets/logos/windsurf.svg +10 -10
  335. package/frontend/src/assets/logos/x.svg +3 -0
  336. package/frontend/src/components/Checkbox.tsx +27 -29
  337. package/frontend/src/components/CodeBlock.tsx +55 -2
  338. package/frontend/src/components/CodeEditor.tsx +92 -0
  339. package/frontend/src/components/ConfirmDialog.tsx +1 -1
  340. package/frontend/src/components/ConnectCTA.tsx +38 -0
  341. package/frontend/src/components/CopyButton.tsx +52 -15
  342. package/frontend/src/components/ErrorState.tsx +1 -2
  343. package/frontend/src/components/FeatureSidebar.tsx +6 -6
  344. package/frontend/src/components/FeatureSidebarItem.tsx +2 -2
  345. package/frontend/src/components/JsonHighlight.tsx +21 -9
  346. package/frontend/src/components/ProjectInfoModal.tsx +128 -0
  347. package/frontend/src/components/PromptDialog.tsx +1 -4
  348. package/frontend/src/components/SearchInput.tsx +1 -2
  349. package/frontend/src/components/Stepper.tsx +53 -0
  350. package/frontend/src/components/ThemeToggle.tsx +3 -3
  351. package/frontend/src/components/datagrid/DataGrid.tsx +25 -32
  352. package/frontend/src/components/datagrid/cell-editors/DateCellEditor.tsx +1 -2
  353. package/frontend/src/components/datagrid/cell-editors/JsonCellEditor.tsx +2 -4
  354. package/frontend/src/components/datagrid/index.ts +23 -0
  355. package/frontend/src/components/index.ts +23 -30
  356. package/frontend/src/components/layout/AppHeader.tsx +131 -91
  357. package/frontend/src/components/layout/AppSidebar.tsx +80 -170
  358. package/frontend/src/components/layout/Layout.tsx +12 -23
  359. package/frontend/src/components/layout/PrimaryMenu.tsx +187 -0
  360. package/frontend/src/components/layout/SecondaryMenu.tsx +70 -0
  361. package/frontend/src/components/layout/index.ts +5 -0
  362. package/frontend/src/components/radix/Tooltip.tsx +24 -13
  363. package/frontend/src/components/radix/index.ts +22 -0
  364. package/frontend/src/features/ai/components/AIConfigCard.tsx +129 -83
  365. package/frontend/src/features/ai/components/AIEmptyState.tsx +12 -7
  366. package/frontend/src/features/ai/components/ModalityFilterSidebar.tsx +101 -0
  367. package/frontend/src/features/ai/components/ModelSelectionDialog.tsx +135 -0
  368. package/frontend/src/features/ai/components/ModelSelectionGrid.tsx +51 -0
  369. package/frontend/src/features/ai/components/SystemPromptDialog.tsx +118 -0
  370. package/frontend/src/features/ai/components/index.ts +6 -0
  371. package/frontend/src/features/ai/helpers.ts +57 -71
  372. package/frontend/src/features/ai/hooks/useAIConfigs.ts +39 -113
  373. package/frontend/src/features/ai/hooks/useAIUsage.ts +0 -2
  374. package/frontend/src/features/ai/pages/AIPage.tsx +166 -0
  375. package/frontend/src/features/ai/services/ai.service.ts +5 -5
  376. package/frontend/src/features/auth/components/AuthPreview.tsx +96 -0
  377. package/frontend/src/features/auth/components/OAuthConfigDialog.tsx +54 -30
  378. package/frontend/src/features/auth/components/UserFormDialog.tsx +13 -6
  379. package/frontend/src/features/auth/components/UsersDataGrid.tsx +50 -14
  380. package/frontend/src/features/auth/components/index.ts +5 -0
  381. package/frontend/src/features/auth/helpers.tsx +208 -0
  382. package/frontend/src/features/auth/hooks/useAnonToken.ts +30 -0
  383. package/frontend/src/features/auth/hooks/useAuthConfig.ts +48 -0
  384. package/frontend/src/features/auth/hooks/useOAuthConfig.ts +14 -10
  385. package/frontend/src/features/auth/hooks/useUsers.ts +43 -5
  386. package/frontend/src/features/auth/index.ts +3 -2
  387. package/frontend/src/features/auth/pages/AuthMethodsPage.tsx +275 -0
  388. package/frontend/src/features/auth/pages/ConfigurationPage.tsx +395 -0
  389. package/frontend/src/features/auth/pages/UsersPage.tsx +257 -0
  390. package/frontend/src/features/auth/services/anonToken.service.ts +11 -0
  391. package/frontend/src/features/auth/services/config.service.ts +19 -0
  392. package/frontend/src/features/auth/services/{oauth.service.ts → oauth-config.service.ts} +4 -4
  393. package/frontend/src/features/auth/services/{auth.service.ts → user.service.ts} +7 -53
  394. package/frontend/src/features/dashboard/components/ConnectionSuccessBanner.tsx +35 -0
  395. package/frontend/src/features/dashboard/components/PromptCard.tsx +21 -0
  396. package/frontend/src/features/dashboard/components/PromptDialog.tsx +103 -0
  397. package/frontend/src/features/dashboard/components/StatsCard.tsx +50 -0
  398. package/frontend/src/features/dashboard/components/index.ts +4 -0
  399. package/frontend/src/features/dashboard/pages/DashboardPage.tsx +212 -0
  400. package/frontend/src/features/dashboard/prompts/ai-chatbot.ts +13 -0
  401. package/frontend/src/features/dashboard/prompts/crm-system.ts +13 -0
  402. package/frontend/src/features/dashboard/prompts/ecommerce-platform.ts +12 -0
  403. package/frontend/src/features/dashboard/prompts/index.ts +31 -0
  404. package/frontend/src/features/dashboard/prompts/instagram-clone.ts +11 -0
  405. package/frontend/src/features/dashboard/prompts/notion-clone.ts +14 -0
  406. package/frontend/src/features/dashboard/prompts/reddit-clone.ts +12 -0
  407. package/frontend/src/features/database/components/DatabaseDataGrid.tsx +48 -17
  408. package/frontend/src/features/database/components/ForeignKeyCell.tsx +15 -34
  409. package/frontend/src/features/database/components/ForeignKeyPopover.tsx +19 -20
  410. package/frontend/src/features/database/components/LinkRecordModal.tsx +120 -125
  411. package/frontend/src/features/database/components/RecordFormDialog.tsx +22 -33
  412. package/frontend/src/features/database/components/RecordFormField.tsx +45 -47
  413. package/frontend/src/features/database/components/SQLModal.tsx +75 -0
  414. package/frontend/src/features/database/components/TableEmptyState.tsx +6 -5
  415. package/frontend/src/features/database/components/TableForm.tsx +28 -19
  416. package/frontend/src/features/database/components/TableFormColumn.tsx +2 -3
  417. package/frontend/src/features/database/components/TableSidebar.tsx +1 -1
  418. package/frontend/src/features/database/components/TablesEmptyState.tsx +48 -0
  419. package/frontend/src/features/database/components/TemplateCard.tsx +37 -0
  420. package/frontend/src/features/database/components/TemplatePreview.tsx +92 -0
  421. package/frontend/src/features/database/components/index.ts +19 -0
  422. package/frontend/src/features/database/constants.ts +28 -2
  423. package/frontend/src/features/database/contexts/SQLEditorContext.tsx +188 -0
  424. package/frontend/src/features/database/helpers.ts +2 -2
  425. package/frontend/src/features/database/hooks/useCSVImport.ts +29 -0
  426. package/frontend/src/features/database/hooks/useDatabase.ts +66 -0
  427. package/frontend/src/features/database/hooks/useRawSQL.ts +55 -0
  428. package/frontend/src/features/database/hooks/useRecords.ts +139 -0
  429. package/frontend/src/features/database/hooks/useTables.ts +135 -0
  430. package/frontend/src/features/database/index.ts +7 -1
  431. package/frontend/src/features/database/pages/FunctionsPage.tsx +203 -0
  432. package/frontend/src/features/database/pages/IndexesPage.tsx +228 -0
  433. package/frontend/src/features/database/pages/PoliciesPage.tsx +237 -0
  434. package/frontend/src/features/database/pages/SQLEditorPage.tsx +382 -0
  435. package/frontend/src/features/database/{page/DatabasePage.tsx → pages/TablesPage.tsx} +168 -209
  436. package/frontend/src/features/database/pages/TemplatesPage.tsx +39 -0
  437. package/frontend/src/features/database/pages/TriggersPage.tsx +230 -0
  438. package/frontend/src/features/database/services/advance.service.ts +40 -0
  439. package/frontend/src/features/database/services/database.service.ts +33 -194
  440. package/frontend/src/features/database/services/record.service.ts +219 -0
  441. package/frontend/src/features/database/services/table.service.ts +58 -0
  442. package/frontend/src/features/database/templates/ai-chatbot.ts +402 -0
  443. package/frontend/src/features/database/templates/crm-system.ts +528 -0
  444. package/frontend/src/features/database/templates/ecommerce-platform.ts +553 -0
  445. package/frontend/src/features/database/templates/index.ts +34 -0
  446. package/frontend/src/features/database/templates/instagram-clone.ts +222 -0
  447. package/frontend/src/features/database/templates/notion-clone.ts +483 -0
  448. package/frontend/src/features/database/templates/reddit-clone.ts +526 -0
  449. package/frontend/src/features/functions/components/FunctionRow.tsx +2 -1
  450. package/frontend/src/features/functions/components/FunctionsSidebar.tsx +1 -1
  451. package/frontend/src/features/functions/components/SecretRow.tsx +1 -1
  452. package/frontend/src/features/functions/components/index.ts +5 -0
  453. package/frontend/src/features/functions/hooks/useFunctions.ts +4 -4
  454. package/frontend/src/features/{secrets → functions}/hooks/useSecrets.ts +5 -5
  455. package/frontend/src/features/functions/pages/FunctionsPage.tsx +148 -0
  456. package/frontend/src/features/functions/{components/SecretsContent.tsx → pages/SecretsPage.tsx} +19 -21
  457. package/frontend/src/features/functions/services/{functions.service.ts → function.service.ts} +2 -2
  458. package/frontend/src/features/{secrets/services/secrets.service.ts → functions/services/secret.service.ts} +2 -2
  459. package/frontend/src/features/login/hooks/usePartnerOrigin.ts +27 -0
  460. package/frontend/src/features/login/pages/CloudLoginPage.tsx +118 -0
  461. package/frontend/src/features/login/{page → pages}/LoginPage.tsx +16 -23
  462. package/frontend/src/features/login/services/partnership.service.ts +65 -0
  463. package/frontend/src/features/logs/components/LogsDataGrid.tsx +89 -0
  464. package/frontend/src/features/logs/components/SeverityBadge.tsx +18 -0
  465. package/frontend/src/features/logs/components/index.ts +2 -0
  466. package/frontend/src/features/logs/helpers.ts +24 -0
  467. package/frontend/src/features/logs/hooks/useAuditLogs.ts +4 -4
  468. package/frontend/src/features/logs/hooks/useLogSources.ts +137 -0
  469. package/frontend/src/features/logs/hooks/useLogs.ts +163 -0
  470. package/frontend/src/features/logs/hooks/useMcpUsage.ts +128 -0
  471. package/frontend/src/features/logs/index.ts +8 -2
  472. package/frontend/src/features/logs/{page → pages}/AuditsPage.tsx +91 -38
  473. package/frontend/src/features/logs/pages/LogsPage.tsx +152 -0
  474. package/frontend/src/features/logs/pages/MCPLogsPage.tsx +84 -0
  475. package/frontend/src/features/logs/services/audit.service.ts +63 -0
  476. package/frontend/src/features/logs/services/log.service.ts +15 -110
  477. package/frontend/src/features/logs/services/usage.service.ts +31 -0
  478. package/frontend/src/features/onboard/components/McpConnectionStatus.tsx +68 -0
  479. package/frontend/src/features/onboard/components/OnboardingModal.tsx +267 -0
  480. package/frontend/src/features/onboard/components/VideoDemoModal.tsx +38 -0
  481. package/frontend/src/features/onboard/components/index.ts +4 -0
  482. package/frontend/src/features/onboard/components/mcp/CursorDeeplinkGenerator.tsx +2 -2
  483. package/frontend/src/features/onboard/components/mcp/{mcp-helper.tsx → helpers.tsx} +8 -8
  484. package/frontend/src/features/onboard/components/mcp/index.ts +2 -3
  485. package/frontend/src/features/onboard/index.ts +13 -3
  486. package/frontend/src/features/realtime/components/ChannelRow.tsx +83 -0
  487. package/frontend/src/features/realtime/components/EditChannelModal.tsx +246 -0
  488. package/frontend/src/features/realtime/components/MessageRow.tsx +85 -0
  489. package/frontend/src/features/realtime/components/RealtimeEmptyState.tsx +30 -0
  490. package/frontend/src/features/realtime/hooks/useRealtime.ts +218 -0
  491. package/frontend/src/features/realtime/index.ts +11 -0
  492. package/frontend/src/features/realtime/pages/RealtimeChannelsPage.tsx +172 -0
  493. package/frontend/src/features/realtime/pages/RealtimeMessagesPage.tsx +211 -0
  494. package/frontend/src/features/realtime/pages/RealtimePermissionsPage.tsx +191 -0
  495. package/frontend/src/features/realtime/services/realtime.service.ts +107 -0
  496. package/frontend/src/features/storage/components/BucketEmptyState.tsx +9 -6
  497. package/frontend/src/features/storage/components/BucketFormDialog.tsx +25 -41
  498. package/frontend/src/features/storage/components/FilePreviewDialog.tsx +20 -8
  499. package/frontend/src/features/storage/components/StorageDataGrid.tsx +4 -3
  500. package/frontend/src/features/storage/components/StorageManager.tsx +23 -34
  501. package/frontend/src/features/storage/components/index.ts +12 -0
  502. package/frontend/src/features/storage/hooks/useStorage.ts +208 -0
  503. package/frontend/src/features/storage/{page → pages}/StoragePage.tsx +41 -143
  504. package/frontend/src/features/storage/services/storage.service.ts +22 -1
  505. package/frontend/src/features/visualizer/components/AuthNode.tsx +72 -56
  506. package/frontend/src/features/visualizer/components/BucketNode.tsx +4 -4
  507. package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +108 -80
  508. package/frontend/src/features/visualizer/components/TableNode.tsx +34 -41
  509. package/frontend/src/features/visualizer/components/VisualizerSkeleton.tsx +12 -4
  510. package/frontend/src/features/visualizer/pages/VisualizerPage.tsx +97 -0
  511. package/frontend/src/index.css +1 -0
  512. package/frontend/src/lib/analytics/posthog.tsx +27 -0
  513. package/frontend/src/lib/contexts/AuthContext.tsx +38 -31
  514. package/frontend/src/lib/contexts/SocketContext.tsx +123 -80
  515. package/frontend/src/{features/metadata → lib}/hooks/useMetadata.ts +1 -1
  516. package/frontend/src/lib/hooks/useToast.tsx +6 -2
  517. package/frontend/src/lib/routing/AppRoutes.tsx +99 -0
  518. package/frontend/src/lib/routing/RequireAuth.tsx +27 -0
  519. package/frontend/src/lib/utils/cloudMessaging.ts +20 -0
  520. package/frontend/src/lib/utils/menuItems.ts +207 -0
  521. package/frontend/src/lib/utils/{validation-schemas.ts → schemaValidations.ts} +10 -5
  522. package/frontend/src/lib/utils/utils.ts +32 -1
  523. package/frontend/src/vite-env.d.ts +1 -0
  524. package/frontend/tsconfig.json +25 -25
  525. package/frontend/tsconfig.node.json +9 -9
  526. package/frontend/vite.config.ts +5 -3
  527. package/functions/deno.json +24 -24
  528. package/functions/server.ts +315 -290
  529. package/functions/worker-template.js +15 -4
  530. package/i18n/README.ar.md +130 -0
  531. package/i18n/README.de.md +130 -0
  532. package/i18n/README.es.md +154 -0
  533. package/i18n/README.fr.md +134 -0
  534. package/i18n/README.hi.md +129 -0
  535. package/i18n/README.ja.md +174 -0
  536. package/i18n/README.ko.md +137 -0
  537. package/i18n/README.pt-BR.md +131 -0
  538. package/i18n/README.ru.md +129 -0
  539. package/i18n/README.zh-CN.md +133 -0
  540. package/openapi/ai.yaml +715 -688
  541. package/openapi/auth.yaml +1244 -563
  542. package/openapi/email.yaml +158 -0
  543. package/openapi/functions.yaml +475 -475
  544. package/openapi/health.yaml +29 -29
  545. package/openapi/logs.yaml +223 -223
  546. package/openapi/metadata.yaml +177 -177
  547. package/openapi/realtime.yaml +699 -0
  548. package/openapi/records.yaml +381 -381
  549. package/openapi/secrets.yaml +370 -370
  550. package/openapi/storage.yaml +875 -875
  551. package/openapi/tables.yaml +463 -463
  552. package/package.json +97 -88
  553. package/shared-schemas/package.json +31 -31
  554. package/shared-schemas/src/ai-api.schema.ts +34 -58
  555. package/shared-schemas/src/ai.schema.ts +63 -54
  556. package/shared-schemas/src/auth-api.schema.ts +352 -193
  557. package/shared-schemas/src/auth.schema.ts +43 -7
  558. package/shared-schemas/src/cloud-events.schema.ts +57 -0
  559. package/shared-schemas/src/database-api.schema.ts +35 -4
  560. package/shared-schemas/src/database.schema.ts +40 -1
  561. package/shared-schemas/src/docs.schema.ts +26 -0
  562. package/shared-schemas/src/email-api.schema.ts +30 -0
  563. package/shared-schemas/src/index.ts +5 -0
  564. package/shared-schemas/src/logs-api.schema.ts +7 -1
  565. package/shared-schemas/src/logs.schema.ts +26 -0
  566. package/shared-schemas/src/metadata.schema.ts +18 -4
  567. package/shared-schemas/src/realtime-api.schema.ts +111 -0
  568. package/shared-schemas/src/realtime.schema.ts +143 -0
  569. package/shared-schemas/tsconfig.json +21 -21
  570. package/tsconfig.json +7 -7
  571. package/zeabur/README.md +13 -0
  572. package/zeabur/template.yml +1032 -0
  573. package/.github/workflows/deploy-aws.yml +0 -130
  574. package/backend/src/api/routes/agent.ts +0 -29
  575. package/backend/src/api/routes/auth.oauth.ts +0 -482
  576. package/backend/src/api/routes/auth.ts +0 -386
  577. package/backend/src/api/routes/docs.ts +0 -66
  578. package/backend/src/api/routes/functions.ts +0 -183
  579. package/backend/src/api/routes/openapi.ts +0 -82
  580. package/backend/src/api/routes/usage.ts +0 -96
  581. package/backend/src/core/ai/client.ts +0 -242
  582. package/backend/src/core/ai/model.ts +0 -117
  583. package/backend/src/core/auth/auth.ts +0 -780
  584. package/backend/src/core/database/manager.ts +0 -178
  585. package/backend/src/core/database/table.ts +0 -772
  586. package/backend/src/core/documentation/agent.ts +0 -689
  587. package/backend/src/core/documentation/openapi.ts +0 -856
  588. package/backend/src/core/logs/analytics.ts +0 -76
  589. package/backend/src/core/logs/providers/localdb.provider.ts +0 -246
  590. package/backend/src/core/socket/socket.ts +0 -388
  591. package/backend/src/core/storage/storage.ts +0 -923
  592. package/backend/src/utils/cloud-token.ts +0 -39
  593. package/backend/src/utils/helpers.ts +0 -49
  594. package/backend/src/utils/uuid.ts +0 -9
  595. package/backend/tests/manual/test-better-auth.sh +0 -303
  596. package/docker-init/db/logs.sql +0 -9
  597. package/frontend/README.md +0 -112
  598. package/frontend/src/components/datagrid/index.tsx +0 -20
  599. package/frontend/src/components/layout/CloudLayout.tsx +0 -95
  600. package/frontend/src/features/ai/components/AIConfigDialog.tsx +0 -76
  601. package/frontend/src/features/ai/components/AIConfigForm.tsx +0 -222
  602. package/frontend/src/features/ai/components/fields/ModalityField.tsx +0 -87
  603. package/frontend/src/features/ai/components/fields/ModelSelectionField.tsx +0 -134
  604. package/frontend/src/features/ai/components/fields/SystemPromptField.tsx +0 -33
  605. package/frontend/src/features/ai/page/AIPage.tsx +0 -178
  606. package/frontend/src/features/auth/components/AddOAuthDialog.tsx +0 -106
  607. package/frontend/src/features/auth/components/AuthMethodTab.tsx +0 -238
  608. package/frontend/src/features/auth/components/UsersTab.tsx +0 -114
  609. package/frontend/src/features/auth/page/AuthenticationPage.tsx +0 -169
  610. package/frontend/src/features/dashboard/page/DashboardPage.tsx +0 -194
  611. package/frontend/src/features/database/hooks/UseLinkModal.tsx +0 -78
  612. package/frontend/src/features/functions/components/FunctionViewer.tsx +0 -46
  613. package/frontend/src/features/functions/components/FunctionsContent.tsx +0 -88
  614. package/frontend/src/features/functions/page/FunctionsPage.tsx +0 -28
  615. package/frontend/src/features/login/components/AuthErrorBoundary.tsx +0 -87
  616. package/frontend/src/features/login/components/PrivateRoute.tsx +0 -24
  617. package/frontend/src/features/login/page/CloudLoginPage.tsx +0 -93
  618. package/frontend/src/features/logs/components/AnalyticsLogsTable.tsx +0 -313
  619. package/frontend/src/features/logs/components/LogsTable.tsx +0 -199
  620. package/frontend/src/features/logs/page/AnalyticsLogsPage.tsx +0 -530
  621. package/frontend/src/features/metadata/index.ts +0 -0
  622. package/frontend/src/features/metadata/page/MetadataPage.tsx +0 -136
  623. package/frontend/src/features/onboard/components/CompletionCard.tsx +0 -41
  624. package/frontend/src/features/onboard/components/OnboardButton.tsx +0 -84
  625. package/frontend/src/features/onboard/components/StepContent.tsx +0 -91
  626. package/frontend/src/features/onboard/components/TestConnectionStep.tsx +0 -53
  627. package/frontend/src/features/onboard/components/mcp/McpInstallation.tsx +0 -144
  628. package/frontend/src/features/onboard/page/OnBoardPage.tsx +0 -104
  629. package/frontend/src/features/onboard/types.ts +0 -8
  630. package/frontend/src/features/visualizer/page/VisualizerPage.tsx +0 -127
  631. package/frontend/src/lib/contexts/OnboardStepContext.tsx +0 -68
  632. package/frontend/src/lib/hooks/useOnboardingCompletion.ts +0 -29
  633. /package/backend/src/api/{middleware → middlewares}/error.ts +0 -0
  634. /package/backend/src/api/{middleware → middlewares}/upload.ts +0 -0
  635. /package/frontend/src/{features/metadata → lib}/services/metadata.service.ts +0 -0
@@ -1,288 +1,317 @@
1
- import express, { Request, Response, NextFunction } from 'express';
2
- import cors from 'cors';
3
- import rateLimit from 'express-rate-limit';
4
- import dotenv from 'dotenv';
5
- import path from 'path';
6
- import { fileURLToPath } from 'url';
7
- import fs from 'fs';
8
- import authRouter from '@/api/routes/auth.js';
9
- import { databaseTablesRouter } from '@/api/routes/database.tables.js';
10
- import { databaseRecordsRouter } from '@/api/routes/database.records.js';
11
- import databaseAdvanceRouter from '@/api/routes/database.advance.js';
12
- import { storageRouter } from '@/api/routes/storage.js';
13
- import { metadataRouter } from '@/api/routes/metadata.js';
14
- import { logsRouter } from '@/api/routes/logs.js';
15
- import { docsRouter } from '@/api/routes/docs.js';
16
- import functionsRouter from '@/api/routes/functions.js';
17
- import secretsRouter from '@/api/routes/secrets.js';
18
- import { usageRouter } from '@/api/routes/usage.js';
19
- import { openAPIRouter } from '@/api/routes/openapi.js';
20
- import { agentDocsRouter } from '@/api/routes/agent.js';
21
- import { aiRouter } from '@/api/routes/ai.js';
22
- import { errorMiddleware } from '@/api/middleware/error.js';
23
- import fetch, { HeadersInit } from 'node-fetch';
24
- import { DatabaseManager } from '@/core/database/manager.js';
25
- import { AnalyticsManager } from '@/core/logs/analytics.js';
26
- import { StorageService } from '@/core/storage/storage.js';
27
- import { SocketService } from '@/core/socket/socket.js';
28
- import { seedBackend } from '@/utils/seed.js';
29
- import logger from '@/utils/logger.js';
30
- import { isProduction } from './utils/environment';
31
- import packageJson from '../../package.json';
32
-
33
- const __filename = fileURLToPath(import.meta.url);
34
- const __dirname = path.dirname(__filename);
35
-
36
- // Load .env file from the root directory (parent of backend)
37
- const envPath = path.resolve(__dirname, '../../.env');
38
- if (fs.existsSync(envPath)) {
39
- dotenv.config({ path: envPath });
40
- } else {
41
- // Fallback to default behavior (looks in current working directory)
42
- dotenv.config();
43
- }
44
-
45
- export async function createApp() {
46
- // Initialize database first
47
- const dbManager = DatabaseManager.getInstance();
48
- await dbManager.initialize(); // create data/app.db
49
-
50
- // Initialize storage service
51
- const storageService = StorageService.getInstance();
52
- await storageService.initialize(); // create data/storage
53
-
54
- // Metadata is now handled by individual modules on-demand
55
-
56
- // Initialize analytics service
57
- const analyticsManager = AnalyticsManager.getInstance();
58
- await analyticsManager.initialize(); // connect to _insforge database
59
-
60
- const app = express();
61
-
62
- // Enable trust proxy setting for rate limiting behind proxies/load balancers
63
- app.set('trust proxy', true);
64
-
65
- const limiter = rateLimit({
66
- windowMs: 15 * 60 * 1000,
67
- max: 1000,
68
- message: 'Too many requests from this IP',
69
- });
70
-
71
- // Basic middleware
72
- app.use(
73
- cors({
74
- origin: true, // Allow all origins (matches Better Auth's trustedOrigins: ['*'])
75
- credentials: true, // Allow cookies/credentials
76
- })
77
- );
78
- if (isProduction()) {
79
- app.use(limiter);
80
- }
81
- app.use((req: Request, res: Response, next: NextFunction) => {
82
- const startTime = Date.now();
83
- const originalSend = res.send;
84
- const originalJson = res.json;
85
-
86
- // Track response size
87
- let responseSize = 0;
88
-
89
- // Override send method
90
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
91
- res.send = function (data: any) {
92
- if (data) {
93
- responseSize = Buffer.byteLength(typeof data === 'string' ? data : JSON.stringify(data));
94
- }
95
- return originalSend.call(this, data);
96
- };
97
- // Override json method
98
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
99
- res.json = function (data: any) {
100
- if (data) {
101
- responseSize = Buffer.byteLength(JSON.stringify(data));
102
- }
103
- return originalJson.call(this, data);
104
- };
105
- // Log after response is finished
106
- res.on('finish', () => {
107
- // Skip logging for analytics endpoints to avoid infinite loops
108
- if (req.path.includes('/analytics/')) {
109
- return;
110
- }
111
-
112
- const duration = Date.now() - startTime;
113
- logger.info('HTTP Request', {
114
- method: req.method,
115
- path: req.path,
116
- status: res.statusCode,
117
- size: responseSize,
118
- duration: `${duration}ms`,
119
- ip: req.ip || req.socket.remoteAddress,
120
- userAgent: req.headers['user-agent'],
121
- timestamp: new Date().toISOString(),
122
- });
123
- });
124
- next();
125
- });
126
-
127
- // Apply JSON middleware
128
- app.use(express.json({ limit: '100mb' }));
129
- app.use(express.urlencoded({ extended: true, limit: '10mb' }));
130
-
131
- // Create API router and mount all API routes under /api
132
- const apiRouter = express.Router();
133
-
134
- apiRouter.get('/health', (_req: Request, res: Response) => {
135
- // Traditional REST: return data directly
136
- const version = packageJson.version;
137
- res.json({
138
- status: 'ok',
139
- version,
140
- service: 'Insforge OSS Backend',
141
- timestamp: new Date().toISOString(),
142
- });
143
- });
144
-
145
- // Mount auth routes
146
- apiRouter.use('/auth', authRouter);
147
- apiRouter.use('/database/tables', databaseTablesRouter);
148
- apiRouter.use('/database/records', databaseRecordsRouter);
149
- apiRouter.use('/database/advance', databaseAdvanceRouter);
150
- apiRouter.use('/storage', storageRouter);
151
- apiRouter.use('/metadata', metadataRouter);
152
- apiRouter.use('/logs', logsRouter);
153
- apiRouter.use('/docs', docsRouter);
154
- apiRouter.use('/functions', functionsRouter);
155
- apiRouter.use('/secrets', secretsRouter);
156
- apiRouter.use('/usage', usageRouter);
157
- apiRouter.use('/openapi', openAPIRouter);
158
- apiRouter.use('/agent-docs', agentDocsRouter);
159
- apiRouter.use('/ai', aiRouter);
160
-
161
- // Mount all API routes under /api prefix
162
- app.use('/api', apiRouter);
163
-
164
- // Add direct OpenAPI route at /openapi
165
- app.get('/openapi', async (_req: Request, res: Response) => {
166
- try {
167
- const { OpenAPIService } = await import('@/core/documentation/openapi.js');
168
- const openAPIService = OpenAPIService.getInstance();
169
- const openAPIDocument = await openAPIService.generateOpenAPIDocument();
170
- res.json(openAPIDocument);
171
- } catch {
172
- res.status(500).json({ error: 'Failed to generate OpenAPI document' });
173
- }
174
- });
175
-
176
- // Add direct AI agent documentation route at /agent-docs
177
- app.get('/agent-docs', async (_req: Request, res: Response) => {
178
- try {
179
- const { AgentAPIDocService } = await import('@/core/documentation/agent.js');
180
- const agentAPIDocService = AgentAPIDocService.getInstance();
181
- const agentDocs = await agentAPIDocService.generateAgentDocumentation();
182
- res.json(agentDocs);
183
- } catch {
184
- res.status(500).json({ error: 'Failed to generate agent API documentation' });
185
- }
186
- });
187
-
188
- // Proxy function execution to Deno runtime
189
- app.all('/functions/:slug', async (req: Request, res: Response) => {
190
- try {
191
- const { slug } = req.params;
192
- const denoUrl = process.env.DENO_RUNTIME_URL || 'http://localhost:7133';
193
-
194
- // Simple direct proxy - just pass everything through
195
- const response = await fetch(
196
- `${denoUrl}/${slug}${req.url.includes('?') ? req.url.substring(req.url.indexOf('?')) : ''}`,
197
- {
198
- method: req.method,
199
- headers: req.headers as HeadersInit,
200
- body: ['GET', 'HEAD'].includes(req.method) ? undefined : JSON.stringify(req.body),
201
- }
202
- );
203
-
204
- // Get response text
205
- const responseText = await response.text();
206
-
207
- res
208
- .status(response.status)
209
- .set('Content-Type', response.headers.get('content-type') || 'application/json')
210
- .set('Access-Control-Allow-Origin', '*')
211
- .send(responseText);
212
- } catch (error) {
213
- logger.error('Failed to proxy to Deno runtime', {
214
- error: error instanceof Error ? error.message : String(error),
215
- stack: error instanceof Error ? error.stack : undefined,
216
- slug: req.params.slug,
217
- });
218
-
219
- // Return the actual error from Deno or connection error
220
- const errorMessage = error instanceof Error ? error.message : String(error);
221
- res.status(502).json({
222
- error: errorMessage,
223
- });
224
- }
225
- });
226
-
227
- // Always try to serve frontend if it exists
228
- const frontendPath = path.join(__dirname, 'frontend');
229
-
230
- // Check if frontend build exists
231
- if (fs.existsSync(frontendPath)) {
232
- // Catch all handler for SPA routes
233
- app.get('/cloud*', (_req: Request, res: Response) => {
234
- res.sendFile(path.join(frontendPath, 'index.html'));
235
- });
236
- app.get('/dashboard*', (_req: Request, res: Response) => {
237
- res.sendFile(path.join(frontendPath, 'index.html'));
238
- });
239
- app.use(express.static(frontendPath));
240
- } else {
241
- // Catch-all for 404 errors - Traditional REST format
242
- app.use('*', (req: Request, res: Response) => {
243
- res.status(404).json({
244
- error: 'NOT_FOUND',
245
- message: `Endpoint ${req.originalUrl} not found`,
246
- statusCode: 404,
247
- nextActions: 'Please check the API documentation for available endpoints',
248
- });
249
- });
250
- }
251
-
252
- app.use(errorMiddleware);
253
- await seedBackend();
254
-
255
- return app;
256
- }
257
-
258
- // Use PORT from environment variable, fallback to 7130
259
- const PORT = parseInt(process.env.PORT || '7130');
260
-
261
- async function initializeServer() {
262
- try {
263
- const app = await createApp();
264
- const server = app.listen(PORT, () => {
265
- logger.info(`Backend API service listening on port ${PORT}`);
266
- });
267
-
268
- // Initialize Socket.IO service
269
- const socketService = SocketService.getInstance();
270
- socketService.initialize(server);
271
- } catch (error) {
272
- logger.error('Failed to initialize server', {
273
- error: error instanceof Error ? error.message : String(error),
274
- stack: error instanceof Error ? error.stack : undefined,
275
- });
276
- process.exit(1);
277
- }
278
- }
279
-
280
- void initializeServer();
281
-
282
- function cleanup() {
283
- logger.info('Shutting down gracefully...');
284
- process.exit(0);
285
- }
286
-
287
- process.on('SIGINT', cleanup);
288
- process.on('SIGTERM', cleanup);
1
+ import express, { Request, Response, NextFunction } from 'express';
2
+ import cors from 'cors';
3
+ import cookieParser from 'cookie-parser';
4
+ import rateLimit from 'express-rate-limit';
5
+ import dotenv from 'dotenv';
6
+ import path from 'path';
7
+ import { fileURLToPath } from 'url';
8
+ import fs from 'fs';
9
+ import authRouter from '@/api/routes/auth/index.routes.js';
10
+ import databaseRouter from '@/api/routes/database/index.routes.js';
11
+ import { storageRouter } from '@/api/routes/storage/index.routes.js';
12
+ import { metadataRouter } from '@/api/routes/metadata/index.routes.js';
13
+ import { logsRouter } from '@/api/routes/logs/index.routes.js';
14
+ import { docsRouter } from '@/api/routes/docs/index.routes.js';
15
+ import functionsRouter from '@/api/routes/functions/index.routes.js';
16
+ import secretsRouter from '@/api/routes/secrets/index.routes.js';
17
+ import { usageRouter } from '@/api/routes/usage/index.routes.js';
18
+ import { aiRouter } from '@/api/routes/ai/index.routes.js';
19
+ import { realtimeRouter } from '@/api/routes/realtime/index.routes.js';
20
+ import { emailRouter } from '@/api/routes/email/index.routes.js';
21
+ import { errorMiddleware } from '@/api/middlewares/error.js';
22
+ import { RealtimeManager } from '@/infra/realtime/realtime.manager.js';
23
+ import fetch, { HeadersInit } from 'node-fetch';
24
+ import { DatabaseManager } from '@/infra/database/database.manager.js';
25
+ import { LogService } from '@/services/logs/log.service.js';
26
+ import { StorageService } from '@/services/storage/storage.service.js';
27
+ import { SocketManager } from '@/infra/socket/socket.manager.js';
28
+ import { seedBackend } from '@/utils/seed.js';
29
+ import logger from '@/utils/logger.js';
30
+ import { initSqlParser } from '@/utils/sql-parser.js';
31
+ import { isProduction } from './utils/environment.js';
32
+ import packageJson from '../../package.json';
33
+
34
+ const __filename = fileURLToPath(import.meta.url);
35
+ const __dirname = path.dirname(__filename);
36
+
37
+ // Load .env file from the root directory (parent of backend)
38
+ const envPath = path.resolve(__dirname, '../../.env');
39
+ if (fs.existsSync(envPath)) {
40
+ dotenv.config({ path: envPath });
41
+ } else {
42
+ // Fallback to default behavior (looks in current working directory)
43
+ dotenv.config();
44
+ }
45
+
46
+ export async function createApp() {
47
+ // Initialize database first
48
+ const dbManager = DatabaseManager.getInstance();
49
+ await dbManager.initialize(); // create data/app.db
50
+
51
+ // Initialize storage service
52
+ const storageService = StorageService.getInstance();
53
+ await storageService.initialize(); // create data/storage
54
+
55
+ // Initialize logs service
56
+ const logService = LogService.getInstance();
57
+ await logService.initialize(); // connect to CloudWatch
58
+
59
+ // Initialize SQL parser WASM module
60
+ await initSqlParser();
61
+
62
+ const app = express();
63
+
64
+ // Enable trust proxy setting for rate limiting behind proxies/load balancers
65
+ app.set('trust proxy', true);
66
+
67
+ const limiter = rateLimit({
68
+ windowMs: 15 * 60 * 1000,
69
+ max: 1000,
70
+ message: 'Too many requests from this IP',
71
+ });
72
+
73
+ // Basic middleware
74
+ app.use(
75
+ cors({
76
+ origin: true, // Allow all origins (matches Better Auth's trustedOrigins: ['*'])
77
+ credentials: true, // Allow cookies/credentials
78
+ })
79
+ );
80
+ app.use(cookieParser()); // Parse cookies for refresh token handling
81
+ if (isProduction()) {
82
+ app.use(limiter);
83
+ }
84
+ app.use((req: Request, res: Response, next: NextFunction) => {
85
+ const startTime = Date.now();
86
+ const originalSend = res.send;
87
+ const originalJson = res.json;
88
+
89
+ // Track response size
90
+ let responseSize = 0;
91
+
92
+ // Override send method
93
+ res.send = function (
94
+ data: string | Buffer | Record<string, unknown> | unknown[] | number | boolean
95
+ ) {
96
+ if (data !== undefined && data !== null) {
97
+ if (typeof data === 'string') {
98
+ responseSize = Buffer.byteLength(data);
99
+ } else if (Buffer.isBuffer(data)) {
100
+ responseSize = data.length;
101
+ } else if (typeof data === 'number' || typeof data === 'boolean') {
102
+ responseSize = Buffer.byteLength(String(data));
103
+ } else {
104
+ try {
105
+ responseSize = Buffer.byteLength(JSON.stringify(data));
106
+ } catch {
107
+ // Handle circular references or unstringifiable objects
108
+ responseSize = 0;
109
+ }
110
+ }
111
+ }
112
+ return originalSend.call(this, data);
113
+ };
114
+
115
+ // Override json method
116
+ res.json = function (
117
+ data: Record<string, unknown> | unknown[] | string | number | boolean | null
118
+ ) {
119
+ if (data !== undefined) {
120
+ try {
121
+ responseSize = Buffer.byteLength(JSON.stringify(data));
122
+ } catch {
123
+ // Handle circular references or unstringifiable objects
124
+ responseSize = 0;
125
+ }
126
+ }
127
+ return originalJson.call(this, data);
128
+ };
129
+
130
+ // Log after response is finished
131
+ res.on('finish', () => {
132
+ // Skip logging for logs endpoints to avoid infinite loops
133
+ if (req.path.includes('/logs/')) {
134
+ return;
135
+ }
136
+
137
+ const duration = Date.now() - startTime;
138
+ logger.info('HTTP Request', {
139
+ method: req.method,
140
+ path: req.path,
141
+ status: res.statusCode,
142
+ size: responseSize,
143
+ duration: `${duration}ms`,
144
+ ip: req.ip || req.socket.remoteAddress,
145
+ userAgent: req.headers['user-agent'],
146
+ timestamp: new Date().toISOString(),
147
+ });
148
+ });
149
+
150
+ next();
151
+ });
152
+
153
+ // Apply JSON middleware
154
+ app.use(express.json({ limit: '100mb' }));
155
+ app.use(express.urlencoded({ extended: true, limit: '10mb' }));
156
+
157
+ // Create API router and mount all API routes under /api
158
+ const apiRouter = express.Router();
159
+
160
+ apiRouter.get('/health', (_req: Request, res: Response) => {
161
+ const version = packageJson.version;
162
+ res.json({
163
+ status: 'ok',
164
+ version,
165
+ service: 'Insforge OSS Backend',
166
+ timestamp: new Date().toISOString(),
167
+ });
168
+ });
169
+
170
+ // Mount all routes
171
+ apiRouter.use('/auth', authRouter);
172
+ apiRouter.use('/database', databaseRouter);
173
+ apiRouter.use('/storage', storageRouter);
174
+ apiRouter.use('/metadata', metadataRouter);
175
+ apiRouter.use('/logs', logsRouter);
176
+ apiRouter.use('/docs', docsRouter);
177
+ apiRouter.use('/functions', functionsRouter);
178
+ apiRouter.use('/secrets', secretsRouter);
179
+ apiRouter.use('/usage', usageRouter);
180
+ apiRouter.use('/ai', aiRouter);
181
+ apiRouter.use('/realtime', realtimeRouter);
182
+ apiRouter.use('/email', emailRouter);
183
+
184
+ // Mount all API routes under /api prefix
185
+ app.use('/api', apiRouter);
186
+
187
+ // Proxy function execution to Deno runtime
188
+ app.all('/functions/:slug', async (req: Request, res: Response) => {
189
+ try {
190
+ const { slug } = req.params;
191
+ const denoUrl = process.env.DENO_RUNTIME_URL || 'http://localhost:7133';
192
+
193
+ // Simple direct proxy - just pass everything through
194
+ const response = await fetch(
195
+ `${denoUrl}/${slug}${req.url.includes('?') ? req.url.substring(req.url.indexOf('?')) : ''}`,
196
+ {
197
+ method: req.method,
198
+ headers: req.headers as HeadersInit,
199
+ body: ['GET', 'HEAD'].includes(req.method) ? undefined : JSON.stringify(req.body),
200
+ }
201
+ );
202
+
203
+ // Get response text
204
+ const responseText = await response.text();
205
+
206
+ res
207
+ .status(response.status)
208
+ .set('Content-Type', response.headers.get('content-type') || 'application/json')
209
+ .set('Access-Control-Allow-Origin', '*')
210
+ .send(responseText);
211
+ } catch (error) {
212
+ logger.error('Failed to proxy to Deno runtime', {
213
+ error: error instanceof Error ? error.message : String(error),
214
+ stack: error instanceof Error ? error.stack : undefined,
215
+ slug: req.params.slug,
216
+ });
217
+
218
+ // Return the actual error from Deno or connection error
219
+ const errorMessage = error instanceof Error ? error.message : String(error);
220
+ res.status(502).json({
221
+ error: errorMessage,
222
+ });
223
+ }
224
+ });
225
+
226
+ // Serve auth app
227
+ const authAppPath = path.join(__dirname, 'auth');
228
+ if (fs.existsSync(authAppPath)) {
229
+ app.use('/auth', express.static(authAppPath));
230
+ app.get('/auth*', (_req: Request, res: Response) => {
231
+ res.sendFile(path.join(authAppPath, 'index.html'));
232
+ });
233
+ } else if (!isProduction()) {
234
+ const authAppUrl = process.env.AUTH_APP_URL || 'http://localhost:7132';
235
+ logger.info('Auth app not built, proxying to development server', { authAppUrl });
236
+ }
237
+
238
+ // Serve main frontend if it exists
239
+ const frontendPath = path.join(__dirname, 'frontend');
240
+ if (fs.existsSync(frontendPath)) {
241
+ app.use(express.static(frontendPath, { index: false }));
242
+ // Catch all handler for SPA routes
243
+ app.get(['/cloud*', '/dashboard*'], (_req: Request, res: Response) => {
244
+ res.sendFile(path.join(frontendPath, 'index.html'));
245
+ });
246
+ } else {
247
+ // Catch-all for 404 errors - Traditional REST format
248
+ app.use('*', (req: Request, res: Response) => {
249
+ res.status(404).json({
250
+ error: 'NOT_FOUND',
251
+ message: `Endpoint ${req.originalUrl} not found`,
252
+ statusCode: 404,
253
+ nextActions: 'Please check the API documentation for available endpoints',
254
+ });
255
+ });
256
+ }
257
+
258
+ app.use(errorMiddleware);
259
+ await seedBackend();
260
+
261
+ return app;
262
+ }
263
+
264
+ // Use PORT from environment variable, fallback to 7130
265
+ const PORT = parseInt(process.env.PORT || '7130');
266
+
267
+ async function initializeServer() {
268
+ try {
269
+ const app = await createApp();
270
+ const server = app.listen(PORT, () => {
271
+ logger.info(`Backend API service listening on port ${PORT}`);
272
+ });
273
+
274
+ // Initialize Socket.IO service
275
+ const socketService = SocketManager.getInstance();
276
+ socketService.initialize(server);
277
+
278
+ // Initialize RealtimeManager (pg_notify listener)
279
+ const realtimeManager = RealtimeManager.getInstance();
280
+ await realtimeManager.initialize();
281
+ } catch (error) {
282
+ logger.error('Failed to initialize server', {
283
+ error: error instanceof Error ? error.message : String(error),
284
+ stack: error instanceof Error ? error.stack : undefined,
285
+ });
286
+ process.exit(1);
287
+ }
288
+ }
289
+
290
+ void initializeServer();
291
+
292
+ async function cleanup() {
293
+ logger.info('Shutting down gracefully...');
294
+
295
+ try {
296
+ const realtimeManager = RealtimeManager.getInstance();
297
+ await realtimeManager.close();
298
+ } catch (error) {
299
+ logger.error('Error closing RealtimeManager', {
300
+ error: error instanceof Error ? error.message : String(error),
301
+ });
302
+ }
303
+
304
+ try {
305
+ const socketService = SocketManager.getInstance();
306
+ socketService.close();
307
+ } catch (error) {
308
+ logger.error('Error closing SocketManager', {
309
+ error: error instanceof Error ? error.message : String(error),
310
+ });
311
+ }
312
+
313
+ process.exit(0);
314
+ }
315
+
316
+ process.on('SIGINT', () => void cleanup());
317
+ process.on('SIGTERM', () => void cleanup());