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
@@ -0,0 +1,13 @@
1
+ import { Router } from 'express';
2
+ import { databaseTablesRouter } from './tables.routes.js';
3
+ import { databaseRecordsRouter } from './records.routes.js';
4
+ import databaseAdvanceRouter from './advance.routes.js';
5
+
6
+ const router = Router();
7
+
8
+ // Mount database sub-routes
9
+ router.use('/tables', databaseTablesRouter);
10
+ router.use('/records', databaseRecordsRouter);
11
+ router.use('/advance', databaseAdvanceRouter);
12
+
13
+ export default router;
@@ -2,20 +2,21 @@ import { Router, Response, NextFunction } from 'express';
2
2
  import axios from 'axios';
3
3
  import http from 'http';
4
4
  import https from 'https';
5
- import { AuthRequest, extractApiKey } from '@/api/middleware/auth.js';
6
- import { DatabaseManager } from '@/core/database/manager.js';
7
- import { AppError } from '@/api/middleware/error.js';
5
+ import { AuthRequest, extractApiKey } from '@/api/middlewares/auth.js';
6
+ import { DatabaseManager } from '@/infra/database/database.manager.js';
7
+ import { TokenManager } from '@/infra/security/token.manager.js';
8
+ import { AppError } from '@/api/middlewares/error.js';
8
9
  import { ERROR_CODES } from '@/types/error-constants.js';
9
10
  import { validateTableName } from '@/utils/validations.js';
10
11
  import { DatabaseRecord } from '@/types/database.js';
11
12
  import { successResponse } from '@/utils/response.js';
12
13
  import logger from '@/utils/logger.js';
13
- import { SecretsService } from '@/core/secrets/secrets.js';
14
- import { AuthService } from '@/core/auth/auth.js';
14
+ import { SecretService } from '@/services/secrets/secret.service.js';
15
+ import { SocketManager } from '@/infra/socket/socket.manager.js';
16
+ import { DataUpdateResourceType, ServerEvents } from '@/types/socket.js';
15
17
 
16
18
  const router = Router();
17
- const authService = AuthService.getInstance();
18
- const secretService = new SecretsService();
19
+ const secretService = SecretService.getInstance();
19
20
  const postgrestUrl = process.env.POSTGREST_BASE_URL || 'http://localhost:5430';
20
21
 
21
22
  // Create a dedicated HTTP agent with connection pooling for PostgREST
@@ -51,7 +52,8 @@ const postgrestAxios = axios.create({
51
52
 
52
53
  // Generate admin token once and reuse
53
54
  // If user request with api key, this token should be added automatically.
54
- const adminToken = authService.generateToken({
55
+ const tokenManager = TokenManager.getInstance();
56
+ const adminToken = tokenManager.generateToken({
55
57
  sub: 'project-admin-with-api-key',
56
58
  email: 'project-admin@email.com',
57
59
  role: 'project_admin',
@@ -203,6 +205,18 @@ const forwardToPostgrest = async (req: AuthRequest, res: Response, next: NextFun
203
205
  responseData = [];
204
206
  }
205
207
 
208
+ // Only send socket events for mutations (POST, DELETE)
209
+ const mutationMethods = ['POST', 'DELETE'];
210
+ if (mutationMethods.includes(req.method.toUpperCase())) {
211
+ const socket = SocketManager.getInstance();
212
+ socket.broadcastToRoom('role:project_admin', ServerEvents.DATA_UPDATE, {
213
+ resource: DataUpdateResourceType.RECORDS,
214
+ data: {
215
+ tableName: tableName,
216
+ },
217
+ });
218
+ }
219
+
206
220
  successResponse(res, responseData, response.status);
207
221
  } catch (error) {
208
222
  if (axios.isAxiosError(error)) {
@@ -1,23 +1,21 @@
1
1
  import { Router, Response, NextFunction } from 'express';
2
- import { verifyAdmin, verifyUser, AuthRequest } from '@/api/middleware/auth.js';
3
- import { DatabaseTableService } from '@/core/database/table.js';
2
+ import { verifyAdmin, AuthRequest } from '@/api/middlewares/auth.js';
3
+ import { DatabaseTableService } from '@/services/database/database-table.service.js';
4
4
  import { successResponse } from '@/utils/response.js';
5
- import { AppError } from '@/api/middleware/error.js';
5
+ import { AppError } from '@/api/middlewares/error.js';
6
6
  import { ERROR_CODES } from '@/types/error-constants.js';
7
7
  import { createTableRequestSchema, updateTableSchemaRequestSchema } from '@insforge/shared-schemas';
8
- import { SocketService } from '@/core/socket/socket';
9
- import { DataUpdateResourceType, ServerEvents } from '@/core/socket/types';
10
- import { AuditService } from '@/core/logs/audit';
8
+ import { AuditService } from '@/services/logs/audit.service.js';
11
9
 
12
10
  const router = Router();
13
- const tableService = new DatabaseTableService();
11
+ const tableService = DatabaseTableService.getInstance();
14
12
  const auditService = AuditService.getInstance();
15
13
 
16
14
  // All table routes accept either JWT token or API key authentication
17
15
  // router.use(verifyAdmin);
18
16
 
19
17
  // List all tables
20
- router.get('/', verifyUser, async (_req: AuthRequest, res: Response, next: NextFunction) => {
18
+ router.get('/', verifyAdmin, async (_req: AuthRequest, res: Response, next: NextFunction) => {
21
19
  try {
22
20
  const tables = await tableService.listTables();
23
21
  successResponse(res, tables);
@@ -55,16 +53,26 @@ router.post('/', verifyAdmin, async (req: AuthRequest, res: Response, next: Next
55
53
  ip_address: req.ip,
56
54
  });
57
55
 
58
- const socket = SocketService.getInstance();
59
- socket.broadcastToRoom('role:project_admin', ServerEvents.DATA_UPDATE, {
60
- resource: DataUpdateResourceType.DATABASE_SCHEMA,
61
- });
62
56
  successResponse(res, result, 201);
63
57
  } catch (error) {
64
58
  next(error);
65
59
  }
66
60
  });
67
61
 
62
+ // Get all table schemas
63
+ router.get(
64
+ '/schemas',
65
+ verifyAdmin,
66
+ async (_req: AuthRequest, res: Response, next: NextFunction) => {
67
+ try {
68
+ const schemas = await tableService.getAllTableSchemas();
69
+ successResponse(res, schemas);
70
+ } catch (error) {
71
+ next(error);
72
+ }
73
+ }
74
+ );
75
+
68
76
  // Get table schema
69
77
  router.get(
70
78
  '/:tableName/schema',
@@ -113,13 +121,6 @@ router.patch(
113
121
  ip_address: req.ip,
114
122
  });
115
123
 
116
- const socket = SocketService.getInstance();
117
- socket.broadcastToRoom('role:project_admin', ServerEvents.DATA_UPDATE, {
118
- resource: DataUpdateResourceType.TABLE_SCHEMA,
119
- data: {
120
- name: tableName,
121
- },
122
- });
123
124
  successResponse(res, result);
124
125
  } catch (error) {
125
126
  next(error);
@@ -147,10 +148,6 @@ router.delete(
147
148
  ip_address: req.ip,
148
149
  });
149
150
 
150
- const socket = SocketService.getInstance();
151
- socket.broadcastToRoom('role:project_admin', ServerEvents.DATA_UPDATE, {
152
- resource: DataUpdateResourceType.DATABASE_SCHEMA,
153
- });
154
151
  successResponse(res, result);
155
152
  } catch (error) {
156
153
  next(error);
@@ -0,0 +1,76 @@
1
+ import { Router, Request, Response, NextFunction } from 'express';
2
+ import { readFile } from 'fs/promises';
3
+ import path from 'path';
4
+ import { fileURLToPath } from 'url';
5
+ import { successResponse } from '@/utils/response.js';
6
+ import { ERROR_CODES } from '@/types/error-constants.js';
7
+ import { AppError } from '@/api/middlewares/error.js';
8
+
9
+ const __filename = fileURLToPath(import.meta.url);
10
+ const __dirname = path.dirname(__filename);
11
+
12
+ const router = Router();
13
+
14
+ // Define available documentation files
15
+ const DOCS_MAP: Record<string, string> = {
16
+ instructions: 'insforge-instructions-sdk.md',
17
+ 'db-sdk': 'core-concepts/database/sdk.mdx',
18
+ 'auth-sdk': 'core-concepts/authentication/sdk.mdx',
19
+ // UI Components - Framework-specific
20
+ 'auth-components-react': 'core-concepts/authentication/ui-components/react.mdx',
21
+ 'auth-components-nextjs': 'core-concepts/authentication/ui-components/nextjs.mdx',
22
+ 'auth-components-react-router': 'core-concepts/authentication/ui-components/react-router.mdx',
23
+ 'storage-sdk': 'core-concepts/storage/sdk.mdx',
24
+ 'functions-sdk': 'core-concepts/functions/sdk.mdx',
25
+ 'ai-integration-sdk': 'core-concepts/ai/sdk.mdx',
26
+ };
27
+
28
+ // GET /api/docs/:docType - Get specific documentation
29
+ router.get('/:docType', async (req: Request, res: Response, next: NextFunction) => {
30
+ try {
31
+ const { docType } = req.params;
32
+
33
+ // Validate doc type
34
+ const docFileName = DOCS_MAP[docType];
35
+ if (!docFileName) {
36
+ throw new AppError('Documentation not found', 404, ERROR_CODES.NOT_FOUND);
37
+ }
38
+
39
+ // Read the documentation file
40
+ // PROJECT_ROOT is set in the docker-compose.yml file to point to the InsForge directory
41
+ const projectRoot = process.env.PROJECT_ROOT || path.resolve(__dirname, '../../../..');
42
+ const filePath = path.join(projectRoot, 'docs', docFileName);
43
+ const content = await readFile(filePath, 'utf-8');
44
+
45
+ // Traditional REST: return documentation directly
46
+ return successResponse(res, {
47
+ type: docType,
48
+ content,
49
+ });
50
+ } catch (error) {
51
+ // If file doesn't exist or other error
52
+ if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
53
+ next(new AppError('Documentation file not found', 404, ERROR_CODES.NOT_FOUND));
54
+ } else {
55
+ next(error);
56
+ }
57
+ }
58
+ });
59
+
60
+ // GET /api/docs - List available documentation
61
+ router.get('/', (_req: Request, res: Response, next: NextFunction) => {
62
+ try {
63
+ const available = Object.keys(DOCS_MAP).map((key) => ({
64
+ type: key,
65
+ filename: DOCS_MAP[key],
66
+ endpoint: `/api/docs/${key}`,
67
+ }));
68
+
69
+ // Traditional REST: return list directly
70
+ return successResponse(res, available);
71
+ } catch (error) {
72
+ next(error);
73
+ }
74
+ });
75
+
76
+ export { router as docsRouter };
@@ -0,0 +1,188 @@
1
+ import { Router, Response, NextFunction } from 'express';
2
+ import { AuthRequest, verifyAdmin } from '@/api/middlewares/auth.js';
3
+ import { FunctionService } from '@/services/functions/function.service.js';
4
+ import { AuditService } from '@/services/logs/audit.service.js';
5
+ import { AppError } from '@/api/middlewares/error.js';
6
+ import { ERROR_CODES } from '@/types/error-constants.js';
7
+ import logger from '@/utils/logger.js';
8
+ import { functionUploadRequestSchema, functionUpdateRequestSchema } from '@insforge/shared-schemas';
9
+ import { SocketManager } from '@/infra/socket/socket.manager.js';
10
+ import { DataUpdateResourceType, ServerEvents } from '@/types/socket.js';
11
+ import { successResponse } from '@/utils/response.js';
12
+
13
+ const router = Router();
14
+ const functionService = FunctionService.getInstance();
15
+ const auditService = AuditService.getInstance();
16
+
17
+ /**
18
+ * GET /api/functions
19
+ * List all edge functions
20
+ */
21
+ router.get('/', verifyAdmin, async (req: AuthRequest, res: Response, next: NextFunction) => {
22
+ try {
23
+ const result = await functionService.listFunctions();
24
+ successResponse(res, result);
25
+ } catch (error) {
26
+ logger.error('Failed to list functions', { error });
27
+ next(new AppError('Failed to list functions', 500, ERROR_CODES.INTERNAL_ERROR));
28
+ }
29
+ });
30
+
31
+ /**
32
+ * GET /api/functions/:slug
33
+ * Get specific function details including code
34
+ */
35
+ router.get('/:slug', verifyAdmin, async (req: AuthRequest, res: Response, next: NextFunction) => {
36
+ try {
37
+ const { slug } = req.params;
38
+ const func = await functionService.getFunction(slug);
39
+
40
+ if (!func) {
41
+ throw new AppError('Function not found', 404, ERROR_CODES.NOT_FOUND);
42
+ }
43
+
44
+ successResponse(res, func);
45
+ } catch (error) {
46
+ next(error);
47
+ }
48
+ });
49
+
50
+ /**
51
+ * POST /api/functions
52
+ * Create a new function
53
+ */
54
+ router.post('/', verifyAdmin, async (req: AuthRequest, res: Response, next: NextFunction) => {
55
+ try {
56
+ const validation = functionUploadRequestSchema.safeParse(req.body);
57
+ if (!validation.success) {
58
+ throw new AppError(JSON.stringify(validation.error.issues), 400, ERROR_CODES.INVALID_INPUT);
59
+ }
60
+
61
+ const created = await functionService.createFunction(validation.data);
62
+
63
+ // Log audit event
64
+ logger.info(`Function ${created.name} (${created.slug}) created by ${req.user?.email}`);
65
+ await auditService.log({
66
+ actor: req.user?.email || 'api-key',
67
+ action: 'CREATE_FUNCTION',
68
+ module: 'FUNCTIONS',
69
+ details: {
70
+ functionId: created.id,
71
+ slug: created.slug,
72
+ name: created.name,
73
+ status: created.status,
74
+ },
75
+ ip_address: req.ip,
76
+ });
77
+
78
+ const socket = SocketManager.getInstance();
79
+ socket.broadcastToRoom('role:project_admin', ServerEvents.DATA_UPDATE, {
80
+ resource: DataUpdateResourceType.FUNCTIONS,
81
+ });
82
+
83
+ successResponse(
84
+ res,
85
+ {
86
+ success: true,
87
+ function: created,
88
+ },
89
+ 201
90
+ );
91
+ } catch (error) {
92
+ next(error);
93
+ }
94
+ });
95
+
96
+ /**
97
+ * PUT /api/functions/:slug
98
+ * Update an existing function
99
+ */
100
+ router.put('/:slug', verifyAdmin, async (req: AuthRequest, res: Response, next: NextFunction) => {
101
+ try {
102
+ const { slug } = req.params;
103
+ const validation = functionUpdateRequestSchema.safeParse(req.body);
104
+
105
+ if (!validation.success) {
106
+ throw new AppError(JSON.stringify(validation.error.issues), 400, ERROR_CODES.INVALID_INPUT);
107
+ }
108
+
109
+ const updated = await functionService.updateFunction(slug, validation.data);
110
+
111
+ if (!updated) {
112
+ throw new AppError('Function not found', 404, ERROR_CODES.NOT_FOUND);
113
+ }
114
+
115
+ // Log audit event
116
+ logger.info(`Function ${slug} updated by ${req.user?.email}`);
117
+ await auditService.log({
118
+ actor: req.user?.email || 'api-key',
119
+ action: 'UPDATE_FUNCTION',
120
+ module: 'FUNCTIONS',
121
+ details: {
122
+ slug,
123
+ changes: validation.data,
124
+ },
125
+ ip_address: req.ip,
126
+ });
127
+
128
+ const socket = SocketManager.getInstance();
129
+ socket.broadcastToRoom('role:project_admin', ServerEvents.DATA_UPDATE, {
130
+ resource: DataUpdateResourceType.FUNCTIONS,
131
+ data: {
132
+ slug,
133
+ },
134
+ });
135
+
136
+ successResponse(res, {
137
+ success: true,
138
+ function: updated,
139
+ });
140
+ } catch (error) {
141
+ next(error);
142
+ }
143
+ });
144
+
145
+ /**
146
+ * DELETE /api/functions/:slug
147
+ * Delete a function
148
+ */
149
+ router.delete(
150
+ '/:slug',
151
+ verifyAdmin,
152
+ async (req: AuthRequest, res: Response, next: NextFunction) => {
153
+ try {
154
+ const { slug } = req.params;
155
+ const deleted = await functionService.deleteFunction(slug);
156
+
157
+ if (!deleted) {
158
+ throw new AppError('Function not found', 404, ERROR_CODES.NOT_FOUND);
159
+ }
160
+
161
+ // Log audit event
162
+ logger.info(`Function ${slug} deleted by ${req.user?.email}`);
163
+ await auditService.log({
164
+ actor: req.user?.email || 'api-key',
165
+ action: 'DELETE_FUNCTION',
166
+ module: 'FUNCTIONS',
167
+ details: {
168
+ slug,
169
+ },
170
+ ip_address: req.ip,
171
+ });
172
+
173
+ const socket = SocketManager.getInstance();
174
+ socket.broadcastToRoom('role:project_admin', ServerEvents.DATA_UPDATE, {
175
+ resource: DataUpdateResourceType.FUNCTIONS,
176
+ });
177
+
178
+ successResponse(res, {
179
+ success: true,
180
+ message: `Function ${slug} deleted successfully`,
181
+ });
182
+ } catch (error) {
183
+ next(error);
184
+ }
185
+ }
186
+ );
187
+
188
+ export default router;
@@ -1,9 +1,11 @@
1
1
  import { Router, Response, NextFunction } from 'express';
2
- import { AnalyticsManager } from '@/core/logs/analytics.js';
3
- import { AuditService } from '@/core/logs/audit.js';
4
- import { AuthRequest, verifyAdmin } from '@/api/middleware/auth.js';
2
+ import { LogService } from '@/services/logs/log.service.js';
3
+ import { AuditService } from '@/services/logs/audit.service.js';
4
+ import { AuthRequest, verifyAdmin } from '@/api/middlewares/auth.js';
5
5
  import { successResponse, paginatedResponse } from '@/utils/response.js';
6
- import { AnalyticsLogResponse } from '@/types/logs.js';
6
+ import { GetLogsResponse } from '@insforge/shared-schemas';
7
+ import { AppError } from '@/api/middlewares/error.js';
8
+ import { ERROR_CODES } from '@/types/error-constants.js';
7
9
 
8
10
  const router = Router();
9
11
 
@@ -68,12 +70,12 @@ router.delete('/audits', async (req: AuthRequest, res: Response, next: NextFunct
68
70
  }
69
71
  });
70
72
 
71
- // Analytics logs routes
72
- // GET /logs/analytics/sources - List all log sources
73
- router.get('/analytics/sources', async (_req: AuthRequest, res: Response, next: NextFunction) => {
73
+ // System logs routes
74
+ // GET /logs/sources - List all log sources
75
+ router.get('/sources', async (_req: AuthRequest, res: Response, next: NextFunction) => {
74
76
  try {
75
- const analyticsManager = AnalyticsManager.getInstance();
76
- const sources = await analyticsManager.getLogSources();
77
+ const logService = LogService.getInstance();
78
+ const sources = await logService.getLogSources();
77
79
 
78
80
  successResponse(res, sources);
79
81
  } catch (error) {
@@ -81,11 +83,11 @@ router.get('/analytics/sources', async (_req: AuthRequest, res: Response, next:
81
83
  }
82
84
  });
83
85
 
84
- // GET /logs/analytics/stats - Get statistics for all log sources
85
- router.get('/analytics/stats', async (_req: AuthRequest, res: Response, next: NextFunction) => {
86
+ // GET /logs/stats - Get statistics for all log sources
87
+ router.get('/stats', async (_req: AuthRequest, res: Response, next: NextFunction) => {
86
88
  try {
87
- const analyticsManager = AnalyticsManager.getInstance();
88
- const stats = await analyticsManager.getLogSourceStats();
89
+ const logService = LogService.getInstance();
90
+ const stats = await logService.getLogSourceStats();
89
91
 
90
92
  successResponse(res, stats);
91
93
  } catch (error) {
@@ -93,21 +95,17 @@ router.get('/analytics/stats', async (_req: AuthRequest, res: Response, next: Ne
93
95
  }
94
96
  });
95
97
 
96
- // GET /logs/analytics/search - Search across all logs or specific source
97
- router.get('/analytics/search', async (req: AuthRequest, res: Response, next: NextFunction) => {
98
+ // GET /logs/search - Search across all logs or specific source
99
+ router.get('/search', async (req: AuthRequest, res: Response, next: NextFunction) => {
98
100
  try {
99
101
  const { q, source, limit = 100, offset = 0 } = req.query;
100
102
 
101
103
  if (!q || typeof q !== 'string') {
102
- return res.status(400).json({
103
- error: 'MISSING_QUERY',
104
- message: 'Search query parameter (q) is required',
105
- statusCode: 400,
106
- });
104
+ throw new AppError('Search query parameter (q) is required', 400, ERROR_CODES.INVALID_INPUT);
107
105
  }
108
106
 
109
- const analyticsManager = AnalyticsManager.getInstance();
110
- const result = await analyticsManager.searchLogs(
107
+ const logService = LogService.getInstance();
108
+ const result = await logService.searchLogs(
111
109
  q,
112
110
  source as string | undefined,
113
111
  Number(limit),
@@ -120,25 +118,22 @@ router.get('/analytics/search', async (req: AuthRequest, res: Response, next: Ne
120
118
  }
121
119
  });
122
120
 
123
- // GET /logs/analytics/:source - Get logs from specific source
124
- router.get('/analytics/:source', async (req: AuthRequest, res: Response, next: NextFunction) => {
121
+ // GET /logs/:source - Get logs from specific source
122
+ router.get('/:source', async (req: AuthRequest, res: Response, next: NextFunction) => {
125
123
  try {
126
124
  const { source } = req.params;
127
125
  const { limit = 100, before_timestamp } = req.query;
128
126
 
129
- const analyticsManager = AnalyticsManager.getInstance();
130
- const result = await analyticsManager.getLogsBySource(
127
+ const logService = LogService.getInstance();
128
+ const result = await logService.getLogsBySource(
131
129
  source,
132
130
  Number(limit),
133
131
  before_timestamp as string | undefined
134
132
  );
135
133
 
136
- const response: AnalyticsLogResponse = {
137
- source,
134
+ const response: GetLogsResponse = {
138
135
  logs: result.logs,
139
136
  total: result.total,
140
- page: 1, // Not applicable for timestamp-based pagination
141
- pageSize: Number(limit),
142
137
  };
143
138
 
144
139
  successResponse(res, response);
@@ -1,21 +1,24 @@
1
1
  import { Router, Response, NextFunction } from 'express';
2
- import { DatabaseAdvanceService } from '@/core/database/advance.js';
3
- import { AuthService } from '@/core/auth/auth.js';
4
- import { StorageService } from '@/core/storage/storage.js';
5
- import { AIConfigService } from '@/core/ai/config.js';
6
- import { FunctionsService } from '@/core/functions/functions.js';
7
- import { SocketService } from '@/core/socket/socket.js';
8
- import { verifyAdmin, AuthRequest } from '@/api/middleware/auth.js';
2
+ import { DatabaseAdvanceService } from '@/services/database/database-advance.service.js';
3
+ import { AuthService } from '@/services/auth/auth.service.js';
4
+ import { StorageService } from '@/services/storage/storage.service.js';
5
+ import { AIConfigService } from '@/services/ai/ai-config.service.js';
6
+ import { FunctionService } from '@/services/functions/function.service.js';
7
+ import { verifyAdmin, AuthRequest } from '@/api/middlewares/auth.js';
9
8
  import { successResponse } from '@/utils/response.js';
10
- import { ServerEvents } from '@/core/socket/types';
11
9
  import { ERROR_CODES } from '@/types/error-constants.js';
12
- import { AppError } from '@/api/middleware/error.js';
10
+ import { AppError } from '@/api/middlewares/error.js';
13
11
  import type { AppMetadataSchema } from '@insforge/shared-schemas';
14
- import { SecretsService } from '@/core/secrets/secrets';
12
+ import { SecretService } from '@/services/secrets/secret.service.js';
13
+ import { DatabaseManager } from '@/infra/database/database.manager.js';
15
14
 
16
15
  const router = Router();
17
- const dbAdvanceService = new DatabaseAdvanceService();
18
- const aiConfigService = new AIConfigService();
16
+ const authService = AuthService.getInstance();
17
+ const storageService = StorageService.getInstance();
18
+ const functionService = FunctionService.getInstance();
19
+ const dbManager = DatabaseManager.getInstance();
20
+ const dbAdvanceService = DatabaseAdvanceService.getInstance();
21
+ const aiConfigService = AIConfigService.getInstance();
19
22
 
20
23
  router.use(verifyAdmin);
21
24
 
@@ -23,17 +26,14 @@ router.use(verifyAdmin);
23
26
  router.get('/', async (req: AuthRequest, res: Response, next: NextFunction) => {
24
27
  try {
25
28
  // Gather metadata from all modules
26
- const authService = AuthService.getInstance();
27
- const storageService = StorageService.getInstance();
28
- const functionsService = FunctionsService.getInstance();
29
29
 
30
30
  // Fetch all metadata in parallel for better performance
31
31
  const [auth, database, storage, aiConfig, functions] = await Promise.all([
32
32
  authService.getMetadata(),
33
- dbAdvanceService.getMetadata(),
33
+ dbManager.getMetadata(),
34
34
  storageService.getMetadata(),
35
35
  aiConfigService.getMetadata(),
36
- functionsService.getMetadata(),
36
+ functionService.getMetadata(),
37
37
  ]);
38
38
 
39
39
  // Get version from package.json or default
@@ -48,13 +48,6 @@ router.get('/', async (req: AuthRequest, res: Response, next: NextFunction) => {
48
48
  version,
49
49
  };
50
50
 
51
- // Trigger Socket.IO event to notify frontend that MCP is connected
52
- if (req.query.mcp === 'true') {
53
- const socketService = SocketService.getInstance();
54
- //Lyu note: this is triggered everytime when a mcp calls get-metadata. Do we have a better solution for this?
55
- socketService.broadcastToRoom('role:project_admin', ServerEvents.MCP_CONNECTED);
56
- }
57
-
58
51
  successResponse(res, metadata);
59
52
  } catch (error) {
60
53
  next(error);
@@ -64,7 +57,6 @@ router.get('/', async (req: AuthRequest, res: Response, next: NextFunction) => {
64
57
  // Get auth metadata
65
58
  router.get('/auth', async (_req: AuthRequest, res: Response, next: NextFunction) => {
66
59
  try {
67
- const authService = AuthService.getInstance();
68
60
  const authMetadata = await authService.getMetadata();
69
61
  successResponse(res, authMetadata);
70
62
  } catch (error) {
@@ -75,7 +67,7 @@ router.get('/auth', async (_req: AuthRequest, res: Response, next: NextFunction)
75
67
  // Get database metadata
76
68
  router.get('/database', async (_req: AuthRequest, res: Response, next: NextFunction) => {
77
69
  try {
78
- const databaseMetadata = await dbAdvanceService.getMetadata();
70
+ const databaseMetadata = await dbManager.getMetadata();
79
71
  successResponse(res, databaseMetadata);
80
72
  } catch (error) {
81
73
  next(error);
@@ -85,7 +77,6 @@ router.get('/database', async (_req: AuthRequest, res: Response, next: NextFunct
85
77
  // Get storage metadata
86
78
  router.get('/storage', async (_req: AuthRequest, res: Response, next: NextFunction) => {
87
79
  try {
88
- const storageService = StorageService.getInstance();
89
80
  const storageMetadata = await storageService.getMetadata();
90
81
  successResponse(res, storageMetadata);
91
82
  } catch (error) {
@@ -106,8 +97,7 @@ router.get('/ai', async (_req: AuthRequest, res: Response, next: NextFunction) =
106
97
  // Get functions metadata
107
98
  router.get('/functions', async (_req: AuthRequest, res: Response, next: NextFunction) => {
108
99
  try {
109
- const functionsService = FunctionsService.getInstance();
110
- const functionsMetadata = await functionsService.getMetadata();
100
+ const functionsMetadata = await functionService.getMetadata();
111
101
  successResponse(res, functionsMetadata);
112
102
  } catch (error) {
113
103
  next(error);
@@ -117,8 +107,8 @@ router.get('/functions', async (_req: AuthRequest, res: Response, next: NextFunc
117
107
  // Get API key (admin only)
118
108
  router.get('/api-key', async (req: AuthRequest, res: Response, next: NextFunction) => {
119
109
  try {
120
- const sercretService = new SecretsService();
121
- const apiKey = await sercretService.getSecretByKey('API_KEY');
110
+ const secretService = SecretService.getInstance();
111
+ const apiKey = await secretService.getSecretByKey('API_KEY');
122
112
 
123
113
  successResponse(res, { apiKey: apiKey });
124
114
  } catch (error) {