insforge 0.3.2 → 1.2.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (507) hide show
  1. package/.claude-plugin/marketplace.json +20 -0
  2. package/.cursor/rules/cursor-rules.mdc +94 -0
  3. package/.dockerignore +3 -0
  4. package/.env.example +33 -4
  5. package/.github/ISSUE_TEMPLATE/bug_report.yml +13 -60
  6. package/.github/ISSUE_TEMPLATE/config.yml +2 -2
  7. package/.github/ISSUE_TEMPLATE/feature_request.yml +10 -63
  8. package/.github/PULL_REQUEST_TEMPLATE.md +7 -0
  9. package/.github/workflows/build-image.yml +2 -1
  10. package/.github/workflows/e2e.yml +63 -0
  11. package/CHANGELOG.md +41 -0
  12. package/CLAUDE_PLUGIN.md +104 -0
  13. package/CODE_OF_CONDUCT.md +128 -0
  14. package/CONTRIBUTING.md +1 -1
  15. package/Dockerfile +4 -1
  16. package/README.md +66 -18
  17. package/assets/mcpInstallv2.png +0 -0
  18. package/assets/sampleResponse.png +0 -0
  19. package/auth/index.html +13 -0
  20. package/auth/package.json +28 -0
  21. package/auth/public/favicon.ico +0 -0
  22. package/auth/src/App.tsx +33 -0
  23. package/auth/src/components/ErrorCard.tsx +37 -0
  24. package/auth/src/components/Layout.tsx +13 -0
  25. package/auth/src/index.css +19 -0
  26. package/auth/src/lib/broadcastService.ts +115 -0
  27. package/auth/src/lib/utils.ts +11 -0
  28. package/auth/src/main.tsx +22 -0
  29. package/auth/src/pages/ForgotPasswordPage.tsx +11 -0
  30. package/auth/src/pages/ResetPasswordPage.tsx +11 -0
  31. package/auth/src/pages/SignInPage.tsx +57 -0
  32. package/auth/src/pages/SignUpPage.tsx +57 -0
  33. package/auth/src/pages/VerifyEmailPage.tsx +20 -0
  34. package/auth/src/vite-env.d.ts +10 -0
  35. package/auth/tsconfig.json +32 -0
  36. package/auth/tsconfig.node.json +11 -0
  37. package/auth/vite.config.ts +25 -0
  38. package/backend/package.json +9 -9
  39. package/backend/src/api/{middleware → middlewares}/auth.ts +8 -9
  40. package/backend/src/api/middlewares/rate-limiters.ts +127 -0
  41. package/backend/src/api/routes/{ai.ts → ai/index.routes.ts} +20 -24
  42. package/backend/src/api/routes/auth/index.routes.ts +570 -0
  43. package/backend/src/api/routes/auth/oauth.routes.ts +448 -0
  44. package/backend/src/api/routes/{database.advance.ts → database/advance.routes.ts} +107 -65
  45. package/backend/src/api/routes/database/index.routes.ts +13 -0
  46. package/backend/src/api/routes/{database.records.ts → database/records.routes.ts} +22 -8
  47. package/backend/src/api/routes/{database.tables.ts → database/tables.routes.ts} +20 -23
  48. package/backend/src/api/routes/docs/index.routes.ts +76 -0
  49. package/backend/src/api/routes/functions/index.routes.ts +188 -0
  50. package/backend/src/api/routes/{logs.ts → logs/index.routes.ts} +25 -30
  51. package/backend/src/api/routes/{metadata.ts → metadata/index.routes.ts} +21 -31
  52. package/backend/src/api/routes/{secrets.ts → secrets/index.routes.ts} +27 -22
  53. package/backend/src/api/routes/{storage.ts → storage/index.routes.ts} +34 -53
  54. package/backend/src/api/routes/usage/index.routes.ts +89 -0
  55. package/backend/src/infra/config/app.config.ts +51 -0
  56. package/backend/src/{core/database/manager.ts → infra/database/database.manager.ts} +76 -85
  57. package/backend/src/infra/database/migrations/013_create-auth-schema-functions.sql +44 -0
  58. package/backend/src/infra/database/migrations/014_add-updated-at-trigger-user-table.sql +8 -0
  59. package/backend/src/infra/database/migrations/015_create-auth-config-and-email-otp-tables.sql +60 -0
  60. package/backend/src/infra/database/migrations/016_update-auth-config-and-email-otp.sql +24 -0
  61. package/backend/src/{core/secrets/encryption.ts → infra/security/encryption.manager.ts} +3 -2
  62. package/backend/src/infra/security/token.manager.ts +125 -0
  63. package/backend/src/{core/socket/socket.ts → infra/socket/socket.manager.ts} +15 -15
  64. package/backend/src/providers/ai/openrouter.provider.ts +377 -0
  65. package/backend/src/providers/email/base.provider.ts +41 -0
  66. package/backend/src/providers/email/cloud.provider.ts +187 -0
  67. package/backend/src/{core/logs/providers → providers/logs}/base.provider.ts +11 -11
  68. package/backend/src/{core/logs/providers → providers/logs}/cloudwatch.provider.ts +61 -38
  69. package/backend/src/providers/logs/local.provider.ts +185 -0
  70. package/backend/src/providers/oauth/base.provider.ts +29 -0
  71. package/backend/src/providers/oauth/discord.provider.ts +195 -0
  72. package/backend/src/providers/oauth/facebook.provider.ts +194 -0
  73. package/backend/src/providers/oauth/github.provider.ts +208 -0
  74. package/backend/src/providers/oauth/google.provider.ts +249 -0
  75. package/backend/src/providers/oauth/index.ts +7 -0
  76. package/backend/src/providers/oauth/linkedin.provider.ts +240 -0
  77. package/backend/src/providers/oauth/microsoft.provider.ts +169 -0
  78. package/backend/src/providers/oauth/x.provider.ts +202 -0
  79. package/backend/src/providers/storage/base.provider.ts +29 -0
  80. package/backend/src/providers/storage/local.provider.ts +103 -0
  81. package/backend/src/providers/storage/s3.provider.ts +313 -0
  82. package/backend/src/server.ts +70 -74
  83. package/backend/src/{core/ai/config.ts → services/ai/ai-config.service.ts} +19 -24
  84. package/backend/src/services/ai/ai-model.service.ts +60 -0
  85. package/backend/src/{core/ai/usage.ts → services/ai/ai-usage.service.ts} +28 -35
  86. package/backend/src/{core/ai/chat.ts → services/ai/chat-completion.service.ts} +37 -24
  87. package/backend/src/services/ai/helpers.ts +64 -0
  88. package/backend/src/{core/ai/image.ts → services/ai/image-generation.service.ts} +17 -19
  89. package/backend/src/services/ai/index.ts +13 -0
  90. package/backend/src/services/auth/auth-config.service.ts +250 -0
  91. package/backend/src/services/auth/auth-otp.service.ts +424 -0
  92. package/backend/src/services/auth/auth.service.ts +1136 -0
  93. package/backend/src/services/auth/index.ts +4 -0
  94. package/backend/src/{core/auth/oauth.ts → services/auth/oauth-config.service.ts} +106 -52
  95. package/backend/src/{core/database/advance.ts → services/database/database-advance.service.ts} +97 -131
  96. package/backend/src/services/database/database-table.service.ts +811 -0
  97. package/backend/src/services/email/email.service.ts +75 -0
  98. package/backend/src/{core/functions/functions.ts → services/functions/function.service.ts} +95 -88
  99. package/backend/src/{core/logs/audit.ts → services/logs/audit.service.ts} +92 -75
  100. package/backend/src/services/logs/log.service.ts +73 -0
  101. package/backend/src/{core/secrets/secrets.ts → services/secrets/secret.service.ts} +48 -66
  102. package/backend/src/services/storage/storage.service.ts +617 -0
  103. package/backend/src/services/usage/usage.service.ts +149 -0
  104. package/backend/src/types/auth.ts +66 -2
  105. package/backend/src/types/email.ts +8 -0
  106. package/backend/src/types/error-constants.ts +4 -0
  107. package/backend/src/types/logs.ts +0 -29
  108. package/backend/src/{core/socket/types.ts → types/socket.ts} +5 -6
  109. package/backend/src/utils/environment.ts +9 -3
  110. package/backend/src/utils/logger.ts +20 -2
  111. package/backend/src/utils/seed.ts +150 -57
  112. package/backend/src/utils/sql-parser.ts +1 -1
  113. package/backend/src/utils/utils.ts +114 -0
  114. package/backend/src/utils/validations.ts +40 -4
  115. package/backend/tests/local/test-ai-config.sh +129 -0
  116. package/backend/tests/local/test-ai-usage.sh +80 -0
  117. package/backend/tests/local/test-auth-router.sh +1 -1
  118. package/backend/tests/local/test-e2e.sh +1 -1
  119. package/backend/tests/local/test-functions.sh +123 -0
  120. package/backend/tests/local/test-logs.sh +132 -0
  121. package/backend/tests/local/test-public-bucket.sh +3 -3
  122. package/backend/tests/local/test-secrets.sh +14 -12
  123. package/backend/tests/local/test-traditional-rest.sh +2 -2
  124. package/backend/tests/manual/test-rawsql-modes.sh +244 -0
  125. package/backend/tests/test-config.sh +37 -1
  126. package/backend/tests/unit/cloud-token.test.ts +48 -0
  127. package/backend/tests/unit/constant.test.ts +8 -0
  128. package/backend/tests/unit/email.test.ts +372 -0
  129. package/backend/tests/unit/environment.test.ts +59 -0
  130. package/backend/tests/unit/helpers.test.ts +63 -0
  131. package/backend/tests/unit/logger.test.ts +22 -0
  132. package/backend/tests/unit/rate-limit.test.ts +154 -0
  133. package/backend/tests/unit/response.test.ts +58 -0
  134. package/backend/tests/unit/sql-parser.test.ts +74 -0
  135. package/backend/tests/unit/uuid.test.ts +21 -0
  136. package/backend/tests/unit/validations.test.ts +80 -0
  137. package/backend/tsconfig.json +1 -1
  138. package/backend/vitest.config.ts +11 -0
  139. package/claude-plugin/.claude-plugin/plugin.json +24 -0
  140. package/claude-plugin/README.md +133 -0
  141. package/claude-plugin/skills/insforge-schema-patterns/SKILL.md +270 -0
  142. package/docker-compose.prod.yml +60 -4
  143. package/docker-compose.yml +65 -4
  144. package/docker-init/db/db-init.sql +6 -34
  145. package/docker-init/logs/vector.yml +236 -0
  146. package/docs/README.md +44 -0
  147. package/docs/changelog.mdx +67 -0
  148. package/docs/core-concepts/ai/architecture.mdx +373 -0
  149. package/docs/core-concepts/ai/sdk.mdx +213 -0
  150. package/docs/core-concepts/authentication/architecture.mdx +278 -0
  151. package/docs/core-concepts/authentication/sdk.mdx +414 -0
  152. package/docs/core-concepts/authentication/ui-components/customization.mdx +529 -0
  153. package/docs/core-concepts/authentication/ui-components/nextjs.mdx +221 -0
  154. package/docs/core-concepts/authentication/ui-components/react-router.mdx +184 -0
  155. package/docs/core-concepts/authentication/ui-components/react.mdx +129 -0
  156. package/docs/core-concepts/database/architecture.mdx +256 -0
  157. package/docs/core-concepts/database/sdk.mdx +382 -0
  158. package/docs/core-concepts/functions/architecture.mdx +105 -0
  159. package/docs/core-concepts/functions/sdk.mdx +184 -0
  160. package/docs/core-concepts/storage/architecture.mdx +243 -0
  161. package/docs/core-concepts/storage/sdk.mdx +253 -0
  162. package/docs/deployment/README.md +94 -0
  163. package/docs/deployment/deploy-to-aws-ec2.md +565 -0
  164. package/docs/deployment/deploy-to-azure-virtual-machines.md +313 -0
  165. package/docs/deployment/deploy-to-google-cloud-compute-engine.md +613 -0
  166. package/docs/deployment/deploy-to-render.md +441 -0
  167. package/docs/docs.json +210 -0
  168. package/docs/examples/framework-guides/nextjs.mdx +131 -0
  169. package/docs/examples/framework-guides/nuxt.mdx +165 -0
  170. package/docs/examples/framework-guides/react.mdx +165 -0
  171. package/docs/examples/framework-guides/svelte.mdx +153 -0
  172. package/docs/examples/framework-guides/vue.mdx +159 -0
  173. package/docs/examples/overview.mdx +67 -0
  174. package/docs/favicon.svg +19 -0
  175. package/docs/images/changelog/nov-2025/auth-components.webp +0 -0
  176. package/docs/images/changelog/nov-2025/database-metadata.webp +0 -0
  177. package/docs/images/changelog/nov-2025/quickstart-prompts.webp +0 -0
  178. package/docs/images/changelog/nov-2025/sql-editor.webp +0 -0
  179. package/docs/images/changelog/nov-2025/usage-page.webp +0 -0
  180. package/docs/images/changelog/october-2025/csv-upload.webp +0 -0
  181. package/docs/images/changelog/october-2025/logs-feature.webp +0 -0
  182. package/docs/images/changelog/october-2025/oauth-providers.webp +0 -0
  183. package/docs/images/checks-passed.png +0 -0
  184. package/docs/images/dashboard-connect-expanded.png +0 -0
  185. package/docs/images/dashboard-connect.png +0 -0
  186. package/docs/images/hero-dark.png +0 -0
  187. package/docs/images/hero-light.png +0 -0
  188. package/docs/images/icons/ai.svg +4 -0
  189. package/docs/images/icons/auth.svg +1 -0
  190. package/docs/images/icons/database.svg +1 -0
  191. package/docs/images/icons/function.svg +1 -0
  192. package/docs/images/icons/storage.svg +1 -0
  193. package/docs/images/logos/nextjs.svg +4 -0
  194. package/docs/images/logos/nuxt.svg +4 -0
  195. package/docs/images/logos/react.svg +5 -0
  196. package/docs/images/logos/svelte.svg +4 -0
  197. package/docs/images/logos/vue.svg +5 -0
  198. package/docs/images/mcp-install.png +0 -0
  199. package/docs/images/onboarding-mcp.png +0 -0
  200. package/docs/insforge-instructions-sdk.md +55 -374
  201. package/docs/introduction.mdx +45 -0
  202. package/docs/logo/dark.svg +22 -0
  203. package/docs/logo/light.svg +20 -0
  204. package/docs/partnership.mdx +647 -0
  205. package/docs/quickstart.mdx +83 -0
  206. package/docs/showcase/2048-arena.png +0 -0
  207. package/docs/showcase/framegen-cloud.png +0 -0
  208. package/docs/showcase/line-connect-race.png +0 -0
  209. package/docs/showcase/moment-vibe.png +0 -0
  210. package/docs/showcase/national-flags.png +0 -0
  211. package/docs/showcase/pokemon-vibe.png +0 -0
  212. package/docs/showcase/pure-browse-buy.png +0 -0
  213. package/docs/showcase.mdx +52 -0
  214. package/docs/snippets/sdk-installation.mdx +22 -0
  215. package/docs/snippets/service-icons.mdx +27 -0
  216. package/eslint.config.js +10 -3
  217. package/frontend/package.json +10 -4
  218. package/frontend/src/App.tsx +13 -82
  219. package/frontend/src/assets/icons/connected.svg +3 -0
  220. package/frontend/src/assets/icons/loader.svg +9 -0
  221. package/frontend/src/assets/logos/apple.svg +4 -0
  222. package/frontend/src/assets/logos/discord.svg +1 -1
  223. package/frontend/src/assets/logos/facebook.svg +3 -0
  224. package/frontend/src/assets/logos/instagram.svg +2 -0
  225. package/frontend/src/assets/logos/linkedin.svg +3 -0
  226. package/frontend/src/assets/logos/microsoft.svg +1 -0
  227. package/frontend/src/assets/logos/spotify.svg +17 -0
  228. package/frontend/src/assets/logos/tiktok.svg +6 -0
  229. package/frontend/src/assets/logos/x.svg +3 -0
  230. package/frontend/src/components/Checkbox.tsx +27 -29
  231. package/frontend/src/components/CodeBlock.tsx +55 -2
  232. package/frontend/src/components/CodeEditor.tsx +92 -0
  233. package/frontend/src/components/ConfirmDialog.tsx +1 -1
  234. package/frontend/src/components/ConnectCTA.tsx +38 -0
  235. package/frontend/src/components/CopyButton.tsx +52 -15
  236. package/frontend/src/components/ErrorState.tsx +1 -2
  237. package/frontend/src/components/FeatureSidebar.tsx +6 -6
  238. package/frontend/src/components/FeatureSidebarItem.tsx +2 -2
  239. package/frontend/src/components/JsonHighlight.tsx +21 -9
  240. package/frontend/src/components/ProjectInfoModal.tsx +128 -0
  241. package/frontend/src/components/PromptDialog.tsx +1 -4
  242. package/frontend/src/components/SearchInput.tsx +1 -2
  243. package/frontend/src/components/Stepper.tsx +53 -0
  244. package/frontend/src/components/ThemeToggle.tsx +3 -3
  245. package/frontend/src/components/datagrid/DataGrid.tsx +25 -32
  246. package/frontend/src/components/datagrid/cell-editors/DateCellEditor.tsx +1 -2
  247. package/frontend/src/components/datagrid/cell-editors/JsonCellEditor.tsx +2 -4
  248. package/frontend/src/components/datagrid/index.ts +23 -0
  249. package/frontend/src/components/index.ts +23 -30
  250. package/frontend/src/components/layout/AppHeader.tsx +133 -92
  251. package/frontend/src/components/layout/AppSidebar.tsx +80 -170
  252. package/frontend/src/components/layout/Layout.tsx +12 -23
  253. package/frontend/src/components/layout/PrimaryMenu.tsx +187 -0
  254. package/frontend/src/components/layout/SecondaryMenu.tsx +70 -0
  255. package/frontend/src/components/layout/index.ts +5 -0
  256. package/frontend/src/components/radix/Tooltip.tsx +24 -13
  257. package/frontend/src/components/radix/index.ts +22 -0
  258. package/frontend/src/features/ai/components/AIConfigCard.tsx +129 -83
  259. package/frontend/src/features/ai/components/AIEmptyState.tsx +12 -7
  260. package/frontend/src/features/ai/components/ModalityFilterSidebar.tsx +101 -0
  261. package/frontend/src/features/ai/components/ModelSelectionDialog.tsx +135 -0
  262. package/frontend/src/features/ai/components/ModelSelectionGrid.tsx +51 -0
  263. package/frontend/src/features/ai/components/SystemPromptDialog.tsx +118 -0
  264. package/frontend/src/features/ai/components/index.ts +6 -0
  265. package/frontend/src/features/ai/helpers.ts +57 -71
  266. package/frontend/src/features/ai/hooks/useAIConfigs.ts +39 -113
  267. package/frontend/src/features/ai/hooks/useAIUsage.ts +0 -2
  268. package/frontend/src/features/ai/page/AIPage.tsx +67 -79
  269. package/frontend/src/features/ai/services/ai.service.ts +5 -5
  270. package/frontend/src/features/auth/components/AuthPreview.tsx +96 -0
  271. package/frontend/src/features/auth/components/OAuthConfigDialog.tsx +53 -30
  272. package/frontend/src/features/auth/components/UserFormDialog.tsx +13 -6
  273. package/frontend/src/features/auth/components/UsersDataGrid.tsx +44 -14
  274. package/frontend/src/features/auth/components/index.ts +5 -0
  275. package/frontend/src/features/auth/helpers.tsx +200 -0
  276. package/frontend/src/features/auth/hooks/useAnonToken.ts +30 -0
  277. package/frontend/src/features/auth/hooks/useAuthConfig.ts +48 -0
  278. package/frontend/src/features/auth/hooks/useOAuthConfig.ts +14 -10
  279. package/frontend/src/features/auth/hooks/useUsers.ts +43 -5
  280. package/frontend/src/features/auth/index.ts +3 -2
  281. package/frontend/src/features/auth/page/AuthMethodsPage.tsx +275 -0
  282. package/frontend/src/features/auth/page/ConfigurationPage.tsx +395 -0
  283. package/frontend/src/features/auth/page/UsersPage.tsx +285 -0
  284. package/frontend/src/features/auth/services/anonToken.service.ts +11 -0
  285. package/frontend/src/features/auth/services/config.service.ts +19 -0
  286. package/frontend/src/features/auth/services/{oauth.service.ts → oauth-config.service.ts} +4 -4
  287. package/frontend/src/features/auth/services/{auth.service.ts → user.service.ts} +7 -53
  288. package/frontend/src/features/dashboard/components/ConnectionSuccessBanner.tsx +35 -0
  289. package/frontend/src/features/dashboard/components/PromptCard.tsx +21 -0
  290. package/frontend/src/features/dashboard/components/PromptDialog.tsx +103 -0
  291. package/frontend/src/features/dashboard/components/StatsCard.tsx +50 -0
  292. package/frontend/src/features/dashboard/components/index.ts +4 -0
  293. package/frontend/src/features/dashboard/page/DashboardPage.tsx +187 -169
  294. package/frontend/src/features/dashboard/prompts/ai-chatbot.ts +13 -0
  295. package/frontend/src/features/dashboard/prompts/crm-system.ts +13 -0
  296. package/frontend/src/features/dashboard/prompts/ecommerce-platform.ts +12 -0
  297. package/frontend/src/features/dashboard/prompts/index.ts +31 -0
  298. package/frontend/src/features/dashboard/prompts/instagram-clone.ts +11 -0
  299. package/frontend/src/features/dashboard/prompts/notion-clone.ts +14 -0
  300. package/frontend/src/features/dashboard/prompts/reddit-clone.ts +12 -0
  301. package/frontend/src/features/database/components/DatabaseDataGrid.tsx +48 -17
  302. package/frontend/src/features/database/components/ForeignKeyCell.tsx +15 -34
  303. package/frontend/src/features/database/components/ForeignKeyPopover.tsx +19 -20
  304. package/frontend/src/features/database/components/LinkRecordModal.tsx +120 -125
  305. package/frontend/src/features/database/components/RecordFormDialog.tsx +22 -33
  306. package/frontend/src/features/database/components/RecordFormField.tsx +45 -47
  307. package/frontend/src/features/database/components/TableEmptyState.tsx +6 -5
  308. package/frontend/src/features/database/components/TableForm.tsx +28 -15
  309. package/frontend/src/features/database/components/TableFormColumn.tsx +2 -3
  310. package/frontend/src/features/database/components/TableSidebar.tsx +1 -1
  311. package/frontend/src/features/database/components/TablesEmptyState.tsx +48 -0
  312. package/frontend/src/features/database/components/TemplateCard.tsx +37 -0
  313. package/frontend/src/features/database/components/TemplatePreview.tsx +92 -0
  314. package/frontend/src/features/database/components/index.ts +19 -0
  315. package/frontend/src/features/database/constants.ts +28 -2
  316. package/frontend/src/features/database/contexts/SQLEditorContext.tsx +188 -0
  317. package/frontend/src/features/database/helpers.ts +2 -2
  318. package/frontend/src/features/database/hooks/useCSVImport.ts +29 -0
  319. package/frontend/src/features/database/hooks/useFullMetadata.ts +18 -0
  320. package/frontend/src/features/database/hooks/useRawSQL.ts +55 -0
  321. package/frontend/src/features/database/hooks/useRecords.ts +139 -0
  322. package/frontend/src/features/database/hooks/useTables.ts +131 -0
  323. package/frontend/src/features/database/index.ts +6 -1
  324. package/frontend/src/features/database/page/FunctionsPage.tsx +211 -0
  325. package/frontend/src/features/database/page/IndexesPage.tsx +240 -0
  326. package/frontend/src/features/database/page/PoliciesPage.tsx +248 -0
  327. package/frontend/src/features/database/page/SQLEditorPage.tsx +382 -0
  328. package/frontend/src/features/database/page/{DatabasePage.tsx → TablesPage.tsx} +186 -185
  329. package/frontend/src/features/database/page/TemplatesPage.tsx +39 -0
  330. package/frontend/src/features/database/page/TriggersPage.tsx +242 -0
  331. package/frontend/src/features/database/services/advance.service.ts +66 -0
  332. package/frontend/src/features/database/services/{database.service.ts → record.service.ts} +67 -64
  333. package/frontend/src/features/database/services/table.service.ts +64 -0
  334. package/frontend/src/features/database/templates/ai-chatbot.ts +402 -0
  335. package/frontend/src/features/database/templates/crm-system.ts +528 -0
  336. package/frontend/src/features/database/templates/ecommerce-platform.ts +553 -0
  337. package/frontend/src/features/database/templates/index.ts +34 -0
  338. package/frontend/src/features/database/templates/instagram-clone.ts +222 -0
  339. package/frontend/src/features/database/templates/notion-clone.ts +483 -0
  340. package/frontend/src/features/database/templates/reddit-clone.ts +526 -0
  341. package/frontend/src/features/functions/components/FunctionRow.tsx +2 -1
  342. package/frontend/src/features/functions/components/FunctionsSidebar.tsx +1 -1
  343. package/frontend/src/features/functions/components/SecretRow.tsx +1 -1
  344. package/frontend/src/features/functions/components/index.ts +5 -0
  345. package/frontend/src/features/functions/hooks/useFunctions.ts +4 -4
  346. package/frontend/src/features/{secrets → functions}/hooks/useSecrets.ts +5 -5
  347. package/frontend/src/features/functions/page/FunctionsPage.tsx +160 -17
  348. package/frontend/src/features/functions/{components/SecretsContent.tsx → page/SecretsPage.tsx} +8 -12
  349. package/frontend/src/features/functions/services/{functions.service.ts → function.service.ts} +2 -2
  350. package/frontend/src/features/{secrets/services/secrets.service.ts → functions/services/secret.service.ts} +2 -2
  351. package/frontend/src/features/login/hooks/usePartnerOrigin.ts +27 -0
  352. package/frontend/src/features/login/page/CloudLoginPage.tsx +79 -54
  353. package/frontend/src/features/login/page/LoginPage.tsx +16 -23
  354. package/frontend/src/features/login/services/partnership.service.ts +65 -0
  355. package/frontend/src/features/logs/components/LogsDataGrid.tsx +89 -0
  356. package/frontend/src/features/logs/components/SeverityBadge.tsx +18 -0
  357. package/frontend/src/features/logs/components/index.ts +2 -0
  358. package/frontend/src/features/logs/helpers.ts +24 -0
  359. package/frontend/src/features/logs/hooks/useAuditLogs.ts +4 -4
  360. package/frontend/src/features/logs/hooks/useLogSources.ts +137 -0
  361. package/frontend/src/features/logs/hooks/useLogs.ts +163 -0
  362. package/frontend/src/features/logs/hooks/useMcpUsage.ts +181 -0
  363. package/frontend/src/features/logs/index.ts +8 -2
  364. package/frontend/src/features/logs/page/AuditsPage.tsx +91 -38
  365. package/frontend/src/features/logs/page/LogsPage.tsx +152 -0
  366. package/frontend/src/features/logs/page/MCPLogsPage.tsx +84 -0
  367. package/frontend/src/features/logs/services/audit.service.ts +63 -0
  368. package/frontend/src/features/logs/services/log.service.ts +15 -110
  369. package/frontend/src/features/logs/services/usage.service.ts +31 -0
  370. package/frontend/src/features/onboard/components/McpConnectionStatus.tsx +68 -0
  371. package/frontend/src/features/onboard/components/OnboardingModal.tsx +267 -0
  372. package/frontend/src/features/onboard/components/VideoDemoModal.tsx +38 -0
  373. package/frontend/src/features/onboard/components/index.ts +4 -0
  374. package/frontend/src/features/onboard/components/mcp/CursorDeeplinkGenerator.tsx +2 -2
  375. package/frontend/src/features/onboard/components/mcp/{mcp-helper.tsx → helpers.tsx} +8 -8
  376. package/frontend/src/features/onboard/components/mcp/index.ts +2 -3
  377. package/frontend/src/features/onboard/index.ts +13 -3
  378. package/frontend/src/features/storage/components/BucketEmptyState.tsx +9 -6
  379. package/frontend/src/features/storage/components/BucketFormDialog.tsx +25 -41
  380. package/frontend/src/features/storage/components/FilePreviewDialog.tsx +20 -8
  381. package/frontend/src/features/storage/components/StorageDataGrid.tsx +4 -3
  382. package/frontend/src/features/storage/components/StorageManager.tsx +23 -34
  383. package/frontend/src/features/storage/components/index.ts +12 -0
  384. package/frontend/src/features/storage/hooks/useStorage.ts +208 -0
  385. package/frontend/src/features/storage/page/StoragePage.tsx +41 -115
  386. package/frontend/src/features/storage/services/storage.service.ts +22 -1
  387. package/frontend/src/features/visualizer/components/AuthNode.tsx +72 -56
  388. package/frontend/src/features/visualizer/components/BucketNode.tsx +4 -4
  389. package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +108 -80
  390. package/frontend/src/features/visualizer/components/TableNode.tsx +34 -41
  391. package/frontend/src/features/visualizer/components/VisualizerSkeleton.tsx +12 -4
  392. package/frontend/src/features/visualizer/page/VisualizerPage.tsx +33 -29
  393. package/frontend/src/index.css +1 -0
  394. package/frontend/src/lib/analytics/posthog.tsx +27 -0
  395. package/frontend/src/lib/contexts/AuthContext.tsx +38 -31
  396. package/frontend/src/lib/contexts/SocketContext.tsx +5 -6
  397. package/frontend/src/{features/metadata → lib}/hooks/useMetadata.ts +1 -1
  398. package/frontend/src/lib/hooks/useToast.tsx +6 -2
  399. package/frontend/src/lib/routing/AppRoutes.tsx +84 -0
  400. package/frontend/src/lib/routing/RequireAuth.tsx +27 -0
  401. package/frontend/src/lib/utils/cloudMessaging.ts +20 -0
  402. package/frontend/src/lib/utils/menuItems.ts +183 -0
  403. package/frontend/src/lib/utils/{validation-schemas.ts → schemaValidations.ts} +10 -5
  404. package/frontend/src/lib/utils/utils.ts +19 -1
  405. package/frontend/src/vite-env.d.ts +1 -0
  406. package/frontend/vite.config.ts +5 -3
  407. package/functions/server.ts +28 -3
  408. package/functions/worker-template.js +15 -4
  409. package/i18n/README.ar.md +130 -0
  410. package/i18n/README.de.md +130 -0
  411. package/i18n/README.es.md +154 -0
  412. package/i18n/README.fr.md +134 -0
  413. package/i18n/README.hi.md +129 -0
  414. package/i18n/README.ja.md +174 -0
  415. package/i18n/README.ko.md +137 -0
  416. package/i18n/README.pt-BR.md +131 -0
  417. package/i18n/README.ru.md +129 -0
  418. package/i18n/README.zh-CN.md +133 -0
  419. package/openapi/ai.yaml +31 -4
  420. package/openapi/auth.yaml +827 -146
  421. package/package.json +16 -7
  422. package/shared-schemas/package.json +1 -1
  423. package/shared-schemas/src/ai-api.schema.ts +34 -58
  424. package/shared-schemas/src/ai.schema.ts +5 -0
  425. package/shared-schemas/src/auth-api.schema.ts +154 -8
  426. package/shared-schemas/src/auth.schema.ts +42 -6
  427. package/shared-schemas/src/cloud-events.schema.ts +57 -0
  428. package/shared-schemas/src/database-api.schema.ts +3 -3
  429. package/shared-schemas/src/database.schema.ts +1 -1
  430. package/shared-schemas/src/index.ts +1 -0
  431. package/shared-schemas/src/logs-api.schema.ts +7 -1
  432. package/shared-schemas/src/logs.schema.ts +26 -0
  433. package/shared-schemas/src/metadata.schema.ts +9 -4
  434. package/test-gemini.sh +35 -0
  435. package/test-usage-admin.sh +57 -0
  436. package/test-usage.sh +50 -0
  437. package/zeabur/README.md +13 -0
  438. package/zeabur/template.yml +1032 -0
  439. package/.github/workflows/deploy-aws.yml +0 -130
  440. package/backend/src/api/routes/agent.ts +0 -29
  441. package/backend/src/api/routes/auth.oauth.ts +0 -482
  442. package/backend/src/api/routes/auth.ts +0 -386
  443. package/backend/src/api/routes/docs.ts +0 -66
  444. package/backend/src/api/routes/functions.ts +0 -183
  445. package/backend/src/api/routes/openapi.ts +0 -82
  446. package/backend/src/api/routes/usage.ts +0 -96
  447. package/backend/src/core/ai/client.ts +0 -242
  448. package/backend/src/core/ai/model.ts +0 -117
  449. package/backend/src/core/auth/auth.ts +0 -781
  450. package/backend/src/core/database/table.ts +0 -772
  451. package/backend/src/core/documentation/agent.ts +0 -689
  452. package/backend/src/core/documentation/openapi.ts +0 -856
  453. package/backend/src/core/logs/analytics.ts +0 -76
  454. package/backend/src/core/logs/providers/localdb.provider.ts +0 -246
  455. package/backend/src/core/storage/storage.ts +0 -923
  456. package/backend/src/utils/cloud-token.ts +0 -39
  457. package/backend/src/utils/helpers.ts +0 -49
  458. package/backend/src/utils/uuid.ts +0 -9
  459. package/backend/tests/manual/test-better-auth.sh +0 -303
  460. package/docker-init/db/logs.sql +0 -9
  461. package/frontend/README.md +0 -112
  462. package/frontend/src/components/datagrid/index.tsx +0 -20
  463. package/frontend/src/components/layout/CloudLayout.tsx +0 -95
  464. package/frontend/src/features/ai/components/AIConfigDialog.tsx +0 -76
  465. package/frontend/src/features/ai/components/AIConfigForm.tsx +0 -222
  466. package/frontend/src/features/ai/components/fields/ModalityField.tsx +0 -87
  467. package/frontend/src/features/ai/components/fields/ModelSelectionField.tsx +0 -134
  468. package/frontend/src/features/ai/components/fields/SystemPromptField.tsx +0 -33
  469. package/frontend/src/features/auth/components/AddOAuthDialog.tsx +0 -106
  470. package/frontend/src/features/auth/components/AuthMethodTab.tsx +0 -238
  471. package/frontend/src/features/auth/components/UsersTab.tsx +0 -114
  472. package/frontend/src/features/auth/page/AuthenticationPage.tsx +0 -169
  473. package/frontend/src/features/database/hooks/UseLinkModal.tsx +0 -78
  474. package/frontend/src/features/functions/components/FunctionViewer.tsx +0 -46
  475. package/frontend/src/features/functions/components/FunctionsContent.tsx +0 -88
  476. package/frontend/src/features/login/components/AuthErrorBoundary.tsx +0 -87
  477. package/frontend/src/features/login/components/PrivateRoute.tsx +0 -24
  478. package/frontend/src/features/logs/components/AnalyticsLogsTable.tsx +0 -313
  479. package/frontend/src/features/logs/components/LogsTable.tsx +0 -199
  480. package/frontend/src/features/logs/page/AnalyticsLogsPage.tsx +0 -530
  481. package/frontend/src/features/metadata/index.ts +0 -0
  482. package/frontend/src/features/metadata/page/MetadataPage.tsx +0 -136
  483. package/frontend/src/features/onboard/components/CompletionCard.tsx +0 -41
  484. package/frontend/src/features/onboard/components/OnboardButton.tsx +0 -84
  485. package/frontend/src/features/onboard/components/StepContent.tsx +0 -91
  486. package/frontend/src/features/onboard/components/TestConnectionStep.tsx +0 -53
  487. package/frontend/src/features/onboard/components/mcp/McpInstallation.tsx +0 -144
  488. package/frontend/src/features/onboard/page/OnBoardPage.tsx +0 -104
  489. package/frontend/src/features/onboard/types.ts +0 -8
  490. package/frontend/src/lib/contexts/OnboardStepContext.tsx +0 -68
  491. package/frontend/src/lib/hooks/useOnboardingCompletion.ts +0 -29
  492. /package/backend/src/api/{middleware → middlewares}/error.ts +0 -0
  493. /package/backend/src/api/{middleware → middlewares}/upload.ts +0 -0
  494. /package/backend/{migrations → src/infra/database/migrations}/000_create-base-tables.sql +0 -0
  495. /package/backend/{migrations → src/infra/database/migrations}/001_create-helper-functions.sql +0 -0
  496. /package/backend/{migrations → src/infra/database/migrations}/002_rename-auth-tables.sql +0 -0
  497. /package/backend/{migrations → src/infra/database/migrations}/003_create-users-table.sql +0 -0
  498. /package/backend/{migrations → src/infra/database/migrations}/004_add-reload-postgrest-func.sql +0 -0
  499. /package/backend/{migrations → src/infra/database/migrations}/005_enable-project-admin-modify-users.sql +0 -0
  500. /package/backend/{migrations → src/infra/database/migrations}/006_modify-ai-usage-table.sql +0 -0
  501. /package/backend/{migrations → src/infra/database/migrations}/007_drop-metadata-table.sql +0 -0
  502. /package/backend/{migrations → src/infra/database/migrations}/008_add-system-tables.sql +0 -0
  503. /package/backend/{migrations → src/infra/database/migrations}/009_add-function-secrets.sql +0 -0
  504. /package/backend/{migrations → src/infra/database/migrations}/010_modify-ai-config-modalities.sql +0 -0
  505. /package/backend/{migrations → src/infra/database/migrations}/011_refactor-secrets-table.sql +0 -0
  506. /package/backend/{migrations → src/infra/database/migrations}/012_add-storage-uploaded-by.sql +0 -0
  507. /package/frontend/src/{features/metadata → lib}/services/metadata.service.ts +0 -0
@@ -1,17 +1,20 @@
1
- import { useState, useEffect } from 'react';
1
+ import { useState, useEffect, useMemo } from 'react';
2
2
  import { RefreshCw, Search, FileText, Trash2 } from 'lucide-react';
3
- import { Button } from '@/components/radix/Button';
4
- import { Input } from '@/components/radix/Input';
5
- import { Alert, AlertDescription } from '@/components/radix/Alert';
6
- import { LogsTable } from '@/features/logs/components/LogsTable';
7
- import { ConfirmDialog } from '@/components/ConfirmDialog';
3
+ import { LogsDataGrid, type LogsColumnDef } from '@/features/logs/components/LogsDataGrid';
4
+ import { formatTime } from '@/lib/utils/utils';
5
+ import { LOGS_PAGE_SIZE } from '@/features/logs/helpers';
8
6
  import { useConfirm } from '@/lib/hooks/useConfirm';
9
7
  import {
8
+ Alert,
9
+ AlertDescription,
10
+ Button,
11
+ ConfirmDialog,
12
+ Input,
10
13
  Tooltip,
11
14
  TooltipContent,
12
15
  TooltipProvider,
13
16
  TooltipTrigger,
14
- } from '@/components/radix/Tooltip';
17
+ } from '@/components';
15
18
  import { useAuditLogs, useClearAuditLogs } from '@/features/logs/hooks/useAuditLogs';
16
19
  import type { GetAuditLogsRequest } from '@insforge/shared-schemas';
17
20
 
@@ -19,11 +22,10 @@ export default function AuditsPage() {
19
22
  const [searchQuery, setSearchQuery] = useState('');
20
23
  const [currentPage, setCurrentPage] = useState(1);
21
24
  const [filters, setFilters] = useState<Partial<GetAuditLogsRequest>>({});
22
- const pageSize = 50;
23
25
  const { confirm, confirmDialogProps } = useConfirm();
24
26
 
25
27
  // Calculate offset based on current page
26
- const offset = (currentPage - 1) * pageSize;
28
+ const offset = (currentPage - 1) * LOGS_PAGE_SIZE;
27
29
 
28
30
  // Fetch logs with pagination and filters
29
31
  const {
@@ -32,7 +34,7 @@ export default function AuditsPage() {
32
34
  error,
33
35
  refetch,
34
36
  } = useAuditLogs({
35
- limit: pageSize,
37
+ limit: LOGS_PAGE_SIZE,
36
38
  offset,
37
39
  ...filters,
38
40
  });
@@ -73,6 +75,47 @@ export default function AuditsPage() {
73
75
  // Extract data from response
74
76
  const logsData = logsResponse?.data || [];
75
77
  const totalRecords = logsResponse?.pagination?.total || 0;
78
+
79
+ // Define columns for audit logs
80
+ const columns: LogsColumnDef[] = useMemo(
81
+ () => [
82
+ {
83
+ key: 'actor',
84
+ name: 'Actor',
85
+ width: '200px',
86
+ },
87
+ {
88
+ key: 'action',
89
+ name: 'Action',
90
+ width: '200px',
91
+ },
92
+ {
93
+ key: 'module',
94
+ name: 'Module',
95
+ width: '150px',
96
+ },
97
+ {
98
+ key: 'details',
99
+ name: 'Details',
100
+ renderCell: ({ row }) => (
101
+ <p className="text-sm text-gray-900 dark:text-white font-normal leading-6 break-all">
102
+ {row.details ? JSON.stringify(row.details) : '-'}
103
+ </p>
104
+ ),
105
+ },
106
+ {
107
+ key: 'createdAt',
108
+ name: 'Time',
109
+ width: '250px',
110
+ renderCell: ({ row }) => (
111
+ <p className="text-sm text-gray-900 dark:text-white font-normal leading-6">
112
+ {formatTime(String(row.createdAt ?? ''))}
113
+ </p>
114
+ ),
115
+ },
116
+ ],
117
+ []
118
+ );
76
119
  return (
77
120
  <div className="flex h-full bg-bg-gray dark:bg-neutral-800">
78
121
  <div className="flex-1 min-w-0 flex flex-col overflow-hidden">
@@ -120,7 +163,7 @@ export default function AuditsPage() {
120
163
  size="icon"
121
164
  className="h-9 w-9 hover:bg-gray-100 dark:hover:bg-neutral-700"
122
165
  onClick={handleClearLogs}
123
- disabled={clearMutation.isPending || logsData.length === 0}
166
+ disabled={clearMutation.isPending || !logsData.length}
124
167
  >
125
168
  <Trash2 className="h-4 w-4 text-gray-600 dark:text-neutral-400" />
126
169
  </Button>
@@ -141,7 +184,7 @@ export default function AuditsPage() {
141
184
  placeholder="Search logs..."
142
185
  value={searchQuery}
143
186
  onChange={(e) => setSearchQuery(e.target.value)}
144
- className="pl-9 h-11 bg-white dark:bg-neutral-900 border-gray-200 dark:border-neutral-700 rounded-full text-sm"
187
+ className="pl-9 h-11 bg-white dark:bg-neutral-900 border-gray-200 dark:border-neutral-700 rounded-full text-sm dark:text-white"
145
188
  />
146
189
  </div>
147
190
  </div>
@@ -155,33 +198,43 @@ export default function AuditsPage() {
155
198
  </Alert>
156
199
  )}
157
200
 
158
- {logsData.length === 0 && !isLoading ? (
159
- <div className="flex-1 flex items-center justify-center">
160
- <div className="text-center">
161
- <FileText className="mx-auto h-12 w-12 text-gray-400 dark:text-neutral-600 mb-4" />
162
- <h3 className="text-lg font-medium text-gray-900 dark:text-white mb-2">
163
- No Audit Logs Available
164
- </h3>
165
- <p className="text-sm text-gray-500 dark:text-neutral-400">
166
- {searchQuery
167
- ? 'No logs found matching your search criteria'
168
- : 'Audit logs will appear here once operations are performed'}
169
- </p>
201
+ <div className="flex-1 flex flex-col overflow-hidden px-8">
202
+ {!logsData.length && !isLoading ? (
203
+ <div className="flex-1 flex items-center justify-center">
204
+ <div className="text-center">
205
+ <FileText className="mx-auto h-12 w-12 text-gray-400 dark:text-neutral-600 mb-4" />
206
+ <h3 className="text-lg font-medium text-gray-900 dark:text-white mb-2">
207
+ No Audit Logs Available
208
+ </h3>
209
+ <p className="text-sm text-gray-500 dark:text-neutral-400">
210
+ {searchQuery
211
+ ? 'No logs found matching your search criteria'
212
+ : 'Audit logs will appear here once operations are performed'}
213
+ </p>
214
+ </div>
170
215
  </div>
171
- </div>
172
- ) : (
173
- <LogsTable
174
- logs={logsData}
175
- loading={isLoading}
176
- searchQuery={searchQuery}
177
- onRefresh={() => void refetch()}
178
- onConfirm={confirm}
179
- currentPage={currentPage}
180
- totalRecords={totalRecords}
181
- pageSize={pageSize}
182
- onPageChange={setCurrentPage}
183
- />
184
- )}
216
+ ) : (
217
+ <div className="flex-1 overflow-hidden">
218
+ <LogsDataGrid
219
+ columnDefs={columns}
220
+ data={logsData}
221
+ loading={isLoading}
222
+ currentPage={currentPage}
223
+ totalPages={Math.ceil(totalRecords / LOGS_PAGE_SIZE)}
224
+ pageSize={LOGS_PAGE_SIZE}
225
+ totalRecords={totalRecords}
226
+ onPageChange={setCurrentPage}
227
+ emptyState={
228
+ <div className="text-sm text-zinc-500 dark:text-zinc-400">
229
+ {searchQuery
230
+ ? 'No audit logs match your search criteria'
231
+ : 'No audit logs found'}
232
+ </div>
233
+ }
234
+ />
235
+ </div>
236
+ )}
237
+ </div>
185
238
  </div>
186
239
  </div>
187
240
 
@@ -0,0 +1,152 @@
1
+ import { useMemo } from 'react';
2
+ import { useParams } from 'react-router-dom';
3
+ import { ChevronDown } from 'lucide-react';
4
+ import { useLogs } from '../hooks/useLogs';
5
+ import {
6
+ Button,
7
+ Checkbox,
8
+ DropdownMenu,
9
+ DropdownMenuContent,
10
+ DropdownMenuTrigger,
11
+ EmptyState,
12
+ SearchInput,
13
+ } from '@/components';
14
+ import { LogsDataGrid, type LogsColumnDef } from '../components/LogsDataGrid';
15
+ import { SeverityBadge } from '../components/SeverityBadge';
16
+ import { SEVERITY_OPTIONS, LOGS_PAGE_SIZE } from '../helpers';
17
+ import { formatTime } from '@/lib/utils/utils';
18
+ import { LogSchema } from '@insforge/shared-schemas';
19
+
20
+ export default function LogsPage() {
21
+ // Get the source from the URL params
22
+ const { source = 'insforge.logs' } = useParams<{ source?: string }>();
23
+
24
+ const {
25
+ logs: paginatedLogs,
26
+ filteredLogs,
27
+ searchQuery: logsSearchQuery,
28
+ setSearchQuery: setLogsSearchQuery,
29
+ severityFilter,
30
+ setSeverityFilter,
31
+ currentPage,
32
+ setCurrentPage,
33
+ totalPages,
34
+ isLoading: logsLoading,
35
+ error: logsError,
36
+ getSeverity,
37
+ } = useLogs(source);
38
+
39
+ const logsColumns: LogsColumnDef[] = useMemo(
40
+ () => [
41
+ {
42
+ key: 'event_message',
43
+ name: 'Logs',
44
+ width: '10fr',
45
+ renderCell: ({ row }) => (
46
+ <p className="text-sm text-gray-900 dark:text-white font-normal leading-6 truncate">
47
+ {String(row.eventMessage ?? '')}
48
+ </p>
49
+ ),
50
+ },
51
+ {
52
+ key: 'severity',
53
+ name: 'Severity',
54
+ width: '120px',
55
+ renderCell: ({ row }) => (
56
+ <SeverityBadge severity={getSeverity(row as unknown as LogSchema)} />
57
+ ),
58
+ },
59
+ {
60
+ key: 'timestamp',
61
+ name: 'Time',
62
+ width: 'minmax(200px, 1fr)',
63
+ renderCell: ({ row }) => (
64
+ <p className="text-sm text-gray-900 dark:text-white font-normal leading-6 flex-1">
65
+ {formatTime(String(row.timestamp ?? ''))}
66
+ </p>
67
+ ),
68
+ },
69
+ ],
70
+ [getSeverity]
71
+ );
72
+
73
+ return (
74
+ <div className="flex-1 flex flex-col h-full overflow-hidden bg-bg-gray dark:bg-neutral-800">
75
+ {/* Header */}
76
+ <div className="px-3 py-4">
77
+ <p className="text-xl text-zinc-950 dark:text-white pl-1 mb-4">{source}</p>
78
+ <div className="flex items-center gap-4">
79
+ <SearchInput
80
+ value={logsSearchQuery}
81
+ onChange={setLogsSearchQuery}
82
+ placeholder="Search logs"
83
+ className="flex-1 max-w-80 dark:bg-neutral-800 dark:text-zinc-300 dark:border-neutral-700"
84
+ debounceTime={300}
85
+ />
86
+ <DropdownMenu>
87
+ <DropdownMenuTrigger asChild>
88
+ <Button
89
+ variant="outline"
90
+ className="w-32 h-10 justify-between bg-transparent dark:bg-transparent border-gray-300 dark:border-neutral-600 text-zinc-950 dark:text-white"
91
+ >
92
+ Severity
93
+ <ChevronDown className="h-4 w-4 opacity-50" />
94
+ </Button>
95
+ </DropdownMenuTrigger>
96
+ <DropdownMenuContent
97
+ align="start"
98
+ className="w-48"
99
+ onCloseAutoFocus={(e) => e.preventDefault()}
100
+ >
101
+ {SEVERITY_OPTIONS.map(({ value, label, color }) => (
102
+ <div
103
+ key={value}
104
+ className="flex items-center gap-2 px-2 py-2 cursor-pointer hover:bg-zinc-100 dark:hover:bg-neutral-600 rounded-sm"
105
+ onClick={(e) => {
106
+ e.preventDefault();
107
+ setSeverityFilter(
108
+ severityFilter.includes(value)
109
+ ? severityFilter.filter((s) => s !== value)
110
+ : [...severityFilter, value]
111
+ );
112
+ }}
113
+ >
114
+ <Checkbox checked={severityFilter.includes(value)} onChange={() => {}} />
115
+ <span className={color}>●</span>
116
+ <span className="text-zinc-950 dark:text-white text-sm">{label}</span>
117
+ </div>
118
+ ))}
119
+ </DropdownMenuContent>
120
+ </DropdownMenu>
121
+ </div>
122
+ </div>
123
+
124
+ {/* Table with Pagination */}
125
+ <div className="flex-1 overflow-hidden">
126
+ {logsError ? (
127
+ <div className="flex items-center justify-center h-full">
128
+ <EmptyState title="Error loading logs" description={String(logsError)} />
129
+ </div>
130
+ ) : (
131
+ <LogsDataGrid
132
+ columnDefs={logsColumns}
133
+ data={paginatedLogs}
134
+ loading={logsLoading}
135
+ currentPage={currentPage}
136
+ totalPages={totalPages}
137
+ pageSize={LOGS_PAGE_SIZE}
138
+ totalRecords={filteredLogs.length}
139
+ onPageChange={setCurrentPage}
140
+ emptyState={
141
+ <div className="text-sm text-zinc-500 dark:text-zinc-400">
142
+ {logsSearchQuery || severityFilter.length < 3
143
+ ? 'No logs match your search criteria'
144
+ : 'No logs found'}
145
+ </div>
146
+ }
147
+ />
148
+ )}
149
+ </div>
150
+ </div>
151
+ );
152
+ }
@@ -0,0 +1,84 @@
1
+ import { useMemo } from 'react';
2
+ import { EmptyState, SearchInput } from '@/components';
3
+ import { LogsDataGrid, type LogsColumnDef } from '../components/LogsDataGrid';
4
+ import { useMcpUsage } from '../hooks/useMcpUsage';
5
+ import { formatTime } from '@/lib/utils/utils';
6
+ import { LOGS_PAGE_SIZE } from '../helpers';
7
+
8
+ export default function MCPLogsPage() {
9
+ const {
10
+ records: mcpLogs,
11
+ filteredRecords: filteredMcpRecords,
12
+ searchQuery: mcpSearchQuery,
13
+ setSearchQuery: setMcpSearchQuery,
14
+ currentPage: mcpCurrentPage,
15
+ setCurrentPage: setMcpCurrentPage,
16
+ totalPages: mcpTotalPages,
17
+ isLoading: mcpLoading,
18
+ error: mcpError,
19
+ } = useMcpUsage();
20
+
21
+ const mcpColumns: LogsColumnDef[] = useMemo(
22
+ () => [
23
+ {
24
+ key: 'tool_name',
25
+ name: 'MCP Call',
26
+ width: '12fr',
27
+ },
28
+ {
29
+ key: 'created_at',
30
+ name: 'Time',
31
+ width: 'minmax(200px, 1fr)',
32
+ renderCell: ({ row }) => (
33
+ <p className="text-sm text-gray-900 dark:text-white font-normal leading-6">
34
+ {formatTime(String(row.created_at ?? ''))}
35
+ </p>
36
+ ),
37
+ },
38
+ ],
39
+ []
40
+ );
41
+
42
+ return (
43
+ <div className="flex-1 flex flex-col h-full overflow-hidden bg-bg-gray dark:bg-neutral-800">
44
+ {/* Header */}
45
+ <div className="px-3 py-4">
46
+ <p className="text-xl text-zinc-950 dark:text-white pl-1 mb-4">MCP</p>
47
+ <div className="flex items-center gap-4">
48
+ <SearchInput
49
+ value={mcpSearchQuery}
50
+ onChange={setMcpSearchQuery}
51
+ placeholder="Search MCP logs"
52
+ className="flex-1 max-w-80 dark:bg-neutral-800 dark:text-zinc-300 dark:border-neutral-700"
53
+ debounceTime={300}
54
+ />
55
+ </div>
56
+ </div>
57
+
58
+ {/* Table with Pagination */}
59
+ <div className="flex-1 overflow-hidden">
60
+ {mcpError ? (
61
+ <div className="flex items-center justify-center h-full">
62
+ <EmptyState title="Error loading MCP logs" description={String(mcpError)} />
63
+ </div>
64
+ ) : (
65
+ <LogsDataGrid
66
+ columnDefs={mcpColumns}
67
+ data={mcpLogs}
68
+ loading={mcpLoading}
69
+ currentPage={mcpCurrentPage}
70
+ totalPages={mcpTotalPages}
71
+ pageSize={LOGS_PAGE_SIZE}
72
+ totalRecords={filteredMcpRecords.length}
73
+ onPageChange={setMcpCurrentPage}
74
+ emptyState={
75
+ <div className="text-sm text-zinc-500 dark:text-zinc-400">
76
+ {mcpSearchQuery ? 'No MCP logs match your search' : 'No MCP logs found'}
77
+ </div>
78
+ }
79
+ />
80
+ )}
81
+ </div>
82
+ </div>
83
+ );
84
+ }
@@ -0,0 +1,63 @@
1
+ import { apiClient } from '@/lib/api/client';
2
+ import {
3
+ GetAuditLogsResponse,
4
+ ClearAuditLogsResponse,
5
+ GetAuditLogsRequest,
6
+ GetAuditLogStatsResponse,
7
+ } from '@insforge/shared-schemas';
8
+
9
+ export class AuditService {
10
+ async getAuditLogs({
11
+ limit = 100,
12
+ offset = 0,
13
+ ...filters
14
+ }: GetAuditLogsRequest): Promise<GetAuditLogsResponse> {
15
+ const params = new URLSearchParams({
16
+ limit: limit.toString(),
17
+ offset: offset.toString(),
18
+ });
19
+
20
+ if (filters?.actor) {
21
+ params.append('actor', filters.actor);
22
+ }
23
+ if (filters?.action) {
24
+ params.append('action', filters.action);
25
+ }
26
+ if (filters?.module) {
27
+ params.append('module', filters.module);
28
+ }
29
+ if (filters?.startDate) {
30
+ params.append('start_date', filters.startDate);
31
+ }
32
+ if (filters?.endDate) {
33
+ params.append('end_date', filters.endDate);
34
+ }
35
+
36
+ return apiClient.request(`/logs/audits?${params.toString()}`, {
37
+ headers: apiClient.withAccessToken(),
38
+ });
39
+ }
40
+
41
+ async getAuditLogStats(days = 7): Promise<GetAuditLogStatsResponse> {
42
+ const params = new URLSearchParams({
43
+ days: days.toString(),
44
+ });
45
+
46
+ return apiClient.request(`/logs/audits/stats?${params.toString()}`, {
47
+ headers: apiClient.withAccessToken(),
48
+ });
49
+ }
50
+
51
+ async clearAuditLogs(daysToKeep = 90): Promise<ClearAuditLogsResponse> {
52
+ const params = new URLSearchParams({
53
+ days_to_keep: daysToKeep.toString(),
54
+ });
55
+
56
+ return apiClient.request(`/logs/audits?${params.toString()}`, {
57
+ method: 'DELETE',
58
+ headers: apiClient.withAccessToken(),
59
+ });
60
+ }
61
+ }
62
+
63
+ export const auditService = new AuditService();
@@ -1,114 +1,20 @@
1
1
  import { apiClient } from '@/lib/api/client';
2
- import {
3
- GetAuditLogsResponse,
4
- ClearAuditLogsResponse,
5
- GetAuditLogsRequest,
6
- GetAuditLogStatsResponse,
2
+ import type {
3
+ LogSourceSchema,
4
+ LogSchema,
5
+ GetLogsResponse,
6
+ LogStatsSchema,
7
7
  } from '@insforge/shared-schemas';
8
8
 
9
- export class LogsService {
10
- async getAuditLogs({
11
- limit = 100,
12
- offset = 0,
13
- ...filters
14
- }: GetAuditLogsRequest): Promise<GetAuditLogsResponse> {
15
- const params = new URLSearchParams({
16
- limit: limit.toString(),
17
- offset: offset.toString(),
18
- });
19
-
20
- if (filters?.actor) {
21
- params.append('actor', filters.actor);
22
- }
23
- if (filters?.action) {
24
- params.append('action', filters.action);
25
- }
26
- if (filters?.module) {
27
- params.append('module', filters.module);
28
- }
29
- if (filters?.startDate) {
30
- params.append('start_date', filters.startDate);
31
- }
32
- if (filters?.endDate) {
33
- params.append('end_date', filters.endDate);
34
- }
35
-
36
- return apiClient.request(`/logs/audits?${params.toString()}`, {
37
- headers: apiClient.withAccessToken(),
38
- });
39
- }
40
-
41
- async getAuditLogStats(days = 7): Promise<GetAuditLogStatsResponse> {
42
- const params = new URLSearchParams({
43
- days: days.toString(),
44
- });
45
-
46
- return apiClient.request(`/logs/audits/stats?${params.toString()}`, {
47
- headers: apiClient.withAccessToken(),
48
- });
49
- }
50
-
51
- async clearAuditLogs(daysToKeep = 90): Promise<ClearAuditLogsResponse> {
52
- const params = new URLSearchParams({
53
- days_to_keep: daysToKeep.toString(),
54
- });
55
-
56
- return apiClient.request(`/logs/audits?${params.toString()}`, {
57
- method: 'DELETE',
58
- headers: apiClient.withAccessToken(),
59
- });
60
- }
61
- }
62
-
63
- // Analytics types
64
- export interface LogSource {
65
- id: string;
66
- name: string;
67
- token: string;
68
- }
69
-
70
- export interface AnalyticsLogBody {
71
- status_code?: number;
72
- duration?: string;
73
- size?: number;
74
- log_type?: string;
75
- ip?: string;
76
- user_agent?: string;
77
- path?: string;
78
- error?: string;
79
- stack?: string;
80
- [key: string]: unknown;
81
- }
82
-
83
- export interface AnalyticsLogRecord {
84
- id: string;
85
- event_message: string;
86
- timestamp: string;
87
- body: AnalyticsLogBody;
88
- source?: string; // Added for search results
89
- }
90
-
91
- export interface AnalyticsLogResponse {
92
- logs: AnalyticsLogRecord[];
93
- total: number;
94
- tableName: string;
95
- }
96
-
97
- export interface LogSourceStats {
98
- source: string;
99
- count: number;
100
- lastActivity: string;
101
- }
102
-
103
- class AnalyticsService {
9
+ export class LogService {
104
10
  // Get all available log sources
105
- async getLogSources(): Promise<LogSource[]> {
106
- return apiClient.request('/logs/analytics/sources');
11
+ async getLogSources(): Promise<LogSourceSchema[]> {
12
+ return apiClient.request('/logs/sources');
107
13
  }
108
14
 
109
15
  // Get statistics for all log sources
110
- async getLogSourceStats(): Promise<LogSourceStats[]> {
111
- return apiClient.request('/logs/analytics/stats');
16
+ async getLogSourceStats(): Promise<LogStatsSchema[]> {
17
+ return apiClient.request('/logs/stats');
112
18
  }
113
19
 
114
20
  // Get logs from a specific source with timestamp-based pagination
@@ -116,7 +22,7 @@ class AnalyticsService {
116
22
  sourceName: string,
117
23
  limit = 100,
118
24
  beforeTimestamp?: string
119
- ): Promise<AnalyticsLogResponse> {
25
+ ): Promise<GetLogsResponse> {
120
26
  const params = new URLSearchParams({
121
27
  limit: limit.toString(),
122
28
  });
@@ -125,7 +31,7 @@ class AnalyticsService {
125
31
  params.append('before_timestamp', beforeTimestamp);
126
32
  }
127
33
 
128
- return apiClient.request(`/logs/analytics/${sourceName}?${params.toString()}`);
34
+ return apiClient.request(`/logs/${sourceName}?${params.toString()}`);
129
35
  }
130
36
 
131
37
  // Search across all logs or specific source
@@ -135,7 +41,7 @@ class AnalyticsService {
135
41
  limit = 100,
136
42
  offset = 0
137
43
  ): Promise<{
138
- records: AnalyticsLogRecord[];
44
+ records: LogSchema[];
139
45
  total: number;
140
46
  }> {
141
47
  const params = new URLSearchParams({
@@ -148,7 +54,7 @@ class AnalyticsService {
148
54
  params.append('source', sourceName);
149
55
  }
150
56
 
151
- const response = await apiClient.request(`/logs/analytics/search?${params.toString()}`, {
57
+ const response = await apiClient.request(`/logs/search?${params.toString()}`, {
152
58
  returnFullResponse: true,
153
59
  });
154
60
 
@@ -167,5 +73,4 @@ class AnalyticsService {
167
73
  }
168
74
  }
169
75
 
170
- export const logsService = new LogsService();
171
- export const analyticsService = new AnalyticsService();
76
+ export const logService = new LogService();
@@ -0,0 +1,31 @@
1
+ import { apiClient } from '@/lib/api/client';
2
+
3
+ export interface McpUsageRecord {
4
+ tool_name: string;
5
+ success: boolean;
6
+ created_at: string;
7
+ }
8
+
9
+ export interface McpUsageResponse {
10
+ records: McpUsageRecord[];
11
+ }
12
+
13
+ export class UsageService {
14
+ /**
15
+ * Get MCP usage records
16
+ */
17
+ async getMcpUsage(success: boolean = true, limit: number = 200): Promise<McpUsageRecord[]> {
18
+ const params = new URLSearchParams({
19
+ success: success.toString(),
20
+ limit: limit.toString(),
21
+ });
22
+
23
+ const data = (await apiClient.request(`/usage/mcp?${params.toString()}`, {
24
+ headers: apiClient.withAccessToken(),
25
+ })) as McpUsageResponse;
26
+
27
+ return data.records || [];
28
+ }
29
+ }
30
+
31
+ export const usageService = new UsageService();