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
@@ -33,14 +33,13 @@ export interface DataGridProps<TRow extends DataGridRowType = DataGridRow> {
33
33
  pageSize?: number;
34
34
  totalRecords?: number;
35
35
  onPageChange?: (page: number) => void;
36
- emptyStateTitle?: string;
37
- emptyStateActionText?: string;
38
- onEmptyStateAction?: () => void;
36
+ emptyState?: React.ReactNode;
39
37
  rowKeyGetter?: (row: TRow) => string;
40
38
  className?: string;
41
39
  showSelection?: boolean;
42
40
  showPagination?: boolean;
43
41
  showTypeBadge?: boolean;
42
+ noPadding?: boolean;
44
43
  }
45
44
 
46
45
  // Main DataGrid component
@@ -60,16 +59,18 @@ export default function DataGrid<TRow extends DataGridRowType = DataGridRow>({
60
59
  pageSize,
61
60
  totalRecords,
62
61
  onPageChange,
63
- emptyStateTitle = 'No data available',
64
- emptyStateActionText,
65
- onEmptyStateAction,
62
+ emptyState,
66
63
  rowKeyGetter,
67
64
  className,
68
65
  showSelection = false,
69
66
  showPagination = true,
70
67
  showTypeBadge = true,
68
+ noPadding = false,
71
69
  }: DataGridProps<TRow>) {
72
70
  const { resolvedTheme } = useTheme();
71
+
72
+ const defaultRowKeyGetter = useCallback((row: TRow) => row.id || Math.random().toString(), []);
73
+ const keyGetter = rowKeyGetter || defaultRowKeyGetter;
73
74
  // Convert columns to react-data-grid format
74
75
  const gridColumns = useMemo(() => {
75
76
  const cols: Column<TRow>[] = [];
@@ -86,13 +87,13 @@ export default function DataGrid<TRow extends DataGridRowType = DataGridRow>({
86
87
  resizable: false,
87
88
  renderCell: ({ row, tabIndex }) => (
88
89
  <Checkbox
89
- checked={selectedRows.has(String(row.id))}
90
+ checked={selectedRows.has(keyGetter(row))}
90
91
  onChange={(checked) => {
91
92
  const newSelectedRows = new Set(selectedRows);
92
93
  if (checked) {
93
- newSelectedRows.add(String(row.id));
94
+ newSelectedRows.add(String(keyGetter(row)));
94
95
  } else {
95
- newSelectedRows.delete(String(row.id));
96
+ newSelectedRows.delete(String(keyGetter(row)));
96
97
  }
97
98
  onSelectedRowsChange(newSelectedRows);
98
99
  }}
@@ -180,16 +181,13 @@ export default function DataGrid<TRow extends DataGridRowType = DataGridRow>({
180
181
  sortColumns,
181
182
  showSelection,
182
183
  showTypeBadge,
184
+ keyGetter,
183
185
  ]);
184
186
 
185
- // Default row key getter
186
- const defaultRowKeyGetter = useCallback((row: TRow) => row.id || Math.random().toString(), []);
187
- const keyGetter = rowKeyGetter || defaultRowKeyGetter;
188
-
189
187
  // Loading state - only show full loading screen if not sorting
190
188
  if (loading && !isSorting) {
191
189
  return (
192
- <div className="h-full flex items-center justify-center bg-white dark:bg-neutral-800">
190
+ <div className="h-full flex items-center justify-center bg-bg-gray dark:bg-neutral-800">
193
191
  <div className="text-gray-500 dark:text-zinc-400">Loading...</div>
194
192
  </div>
195
193
  );
@@ -198,11 +196,16 @@ export default function DataGrid<TRow extends DataGridRowType = DataGridRow>({
198
196
  return (
199
197
  <div
200
198
  className={cn(
201
- 'h-full flex flex-col bg-bg-gray dark:bg-neutral-800 overflow-hidden',
199
+ 'h-full flex flex-col overflow-hidden bg-bg-gray dark:bg-neutral-800',
202
200
  className
203
201
  )}
204
202
  >
205
- <div className="flex-1 overflow-hidden relative mx-3 border border-border-gray dark:border-0">
203
+ <div
204
+ className={cn(
205
+ 'flex-1 overflow-hidden relative border border-border-gray dark:border-neutral-700 rounded-sm',
206
+ !noPadding && 'mx-3'
207
+ )}
208
+ >
206
209
  <ReactDataGrid
207
210
  columns={gridColumns}
208
211
  rows={isRefreshing ? [] : data}
@@ -218,23 +221,13 @@ export default function DataGrid<TRow extends DataGridRowType = DataGridRow>({
218
221
  rowHeight={36}
219
222
  enableVirtualization={true}
220
223
  renderers={{
221
- noRowsFallback: (
224
+ noRowsFallback: emptyState ? (
225
+ <div className="absolute inset-x-0 top-0 mt-13 py-8 flex items-center justify-center bg-white dark:bg-neutral-800">
226
+ {emptyState}
227
+ </div>
228
+ ) : (
222
229
  <div className="absolute inset-x-0 top-0 mt-13 py-8 flex items-center justify-center bg-white dark:bg-neutral-800">
223
- <div className="flex flex-col gap-1 items-center">
224
- <div className="flex flex-row gap-2.5 items-center">
225
- <div className="text-sm text-zinc-500 dark:text-zinc-400">
226
- {emptyStateTitle}
227
- </div>
228
- {emptyStateActionText && onEmptyStateAction && (
229
- <button
230
- onClick={onEmptyStateAction}
231
- className="inline-flex items-center text-sm font-medium text-chart-blue-dark focus:outline-none focus:ring-0 dark:text-zinc-400"
232
- >
233
- {emptyStateActionText}
234
- </button>
235
- )}
236
- </div>
237
- </div>
230
+ <div className="text-sm text-zinc-500 dark:text-zinc-400">No data to display</div>
238
231
  </div>
239
232
  ),
240
233
  }}
@@ -1,9 +1,8 @@
1
1
  import React, { useEffect, useRef, useState } from 'react';
2
2
  import { Calendar, ChevronLeft, ChevronRight, Clock } from 'lucide-react';
3
- import { Button } from '@/components/radix/Button';
4
3
  import { cn } from '@/lib/utils/utils';
5
4
  import { format, parse } from 'date-fns';
6
- import { Popover, PopoverContent, PopoverTrigger } from '@/components/radix/Popover';
5
+ import { Button, Popover, PopoverContent, PopoverTrigger } from '@/components';
7
6
  import type { DateCellEditorProps } from './types';
8
7
  import { ColumnType } from '@insforge/shared-schemas';
9
8
 
@@ -1,8 +1,6 @@
1
1
  import { useEffect, useState } from 'react';
2
2
  import { FileJson, AlertCircle, CheckCircle } from 'lucide-react';
3
- import { Button } from '@/components/radix/Button';
4
- import { Popover, PopoverContent, PopoverTrigger } from '@/components/radix/Popover';
5
- import { ConfirmDialog } from '@/components/ConfirmDialog';
3
+ import { ConfirmDialog, Button, Popover, PopoverContent, PopoverTrigger } from '@/components';
6
4
  import { cn } from '@/lib/utils/utils';
7
5
  import type { JsonCellEditorProps } from './types';
8
6
 
@@ -182,7 +180,7 @@ export function JsonCellEditor({
182
180
  }
183
181
 
184
182
  const keys = Object.keys(parsed);
185
- if (keys.length === 0) {
183
+ if (!keys.length) {
186
184
  return '{}';
187
185
  }
188
186
  if (keys.length === 1) {
@@ -0,0 +1,23 @@
1
+ // cell editor components
2
+ export * from './cell-editors';
3
+
4
+ // datagrid types
5
+ export type * from './datagridTypes';
6
+ export type { DataGridProps } from './DataGrid';
7
+ export type {
8
+ Column,
9
+ SortColumn,
10
+ RenderCellProps,
11
+ RenderEditCellProps,
12
+ RenderHeaderCellProps,
13
+ // NOTE: react-data-grid@7.0.0-beta.47 still uses CellClickArgs.
14
+ // Future versions rename this to CellMouseArgs, so this can be updated when we bump the dependency.
15
+ CellClickArgs,
16
+ CellMouseEvent,
17
+ } from 'react-data-grid';
18
+
19
+ // datagrid components
20
+ export { default as DataGrid } from './DataGrid';
21
+ export { createDefaultCellRenderer } from './DefaultCellRenderer';
22
+ export { default as IdCell } from './IdCell';
23
+ export { default as SortableHeaderRenderer } from './SortableHeader';
@@ -1,39 +1,32 @@
1
+ // datagrid & cell editor components
2
+ export * from './datagrid';
3
+
4
+ // layout/menu components
5
+ export * from './layout';
6
+
1
7
  // Core radix/ui components
2
- export * from './radix/Button';
3
- export * from './radix/Card';
4
- export * from './radix/Input';
5
- export * from './radix/Form';
6
- export * from './radix/Tabs';
7
- export * from './radix/Badge';
8
- export * from './radix/Skeleton';
9
- export * from './radix/ScrollArea';
10
- export * from './radix/Separator';
11
- export * from './radix/Alert';
12
- export * from './radix/DropdownMenu';
13
- export * from './radix/Dialog';
14
- export * from './radix/Label';
15
- export * from './radix/Popover';
16
- export * from './radix/Select';
17
- export * from './radix/Sheet';
18
- export * from './radix/Switch';
19
- export * from './radix/Tooltip';
20
- export * from './radix/AlertDialog';
21
- export * from './radix/Avatar';
22
- export * from './ConfirmDialog';
23
- export * from './ButtonWithLoading';
8
+ export * from './radix';
24
9
 
25
10
  // Custom UI components
11
+ export { ButtonWithLoading } from './ButtonWithLoading';
12
+ export { Checkbox } from './Checkbox';
13
+ export { CodeBlock } from './CodeBlock';
14
+ export { CodeEditor } from './CodeEditor';
15
+ export { ConfirmDialog } from './ConfirmDialog';
16
+ export { ConnectCTA } from './ConnectCTA';
17
+ export { ProjectInfoModal } from './ProjectInfoModal';
18
+ export { CopyButton } from './CopyButton';
19
+ export { DeleteActionButton } from './DeleteActionButton';
26
20
  export { EmptyState } from './EmptyState';
27
- export { LoadingState } from './LoadingState';
28
21
  export { ErrorState } from './ErrorState';
22
+ export { FeatureSidebar } from './FeatureSidebar';
23
+ export { FeatureSidebarItem } from './FeatureSidebarItem';
29
24
  export { JsonHighlight } from './JsonHighlight';
25
+ export { LoadingState } from './LoadingState';
26
+ export { PaginationControls, type PaginationControlsProps } from './PaginationControls';
27
+ export { PromptDialog } from './PromptDialog';
30
28
  export { SearchInput } from './SearchInput';
31
- export { PaginationControls } from './PaginationControls';
32
29
  export { SelectionClearButton } from './SelectionClearButton';
33
- export { DeleteActionButton } from './DeleteActionButton';
34
- export { Checkbox } from './Checkbox';
30
+ export { CircularStepper, LinearStepper, VerticalStepper } from './Stepper';
31
+ export { ThemeToggle } from './ThemeToggle';
35
32
  export { TypeBadge } from './TypeBadge';
36
-
37
- // Data Grid Components
38
- export { DataGrid, SortableHeaderRenderer } from './datagrid';
39
- export type { DataGridProps } from './datagrid';
@@ -1,41 +1,74 @@
1
1
  import { useState, useEffect } from 'react';
2
2
  import { LogOut, ChevronDown } from 'lucide-react';
3
3
  import {
4
+ Avatar,
5
+ AvatarFallback,
4
6
  DropdownMenu,
5
7
  DropdownMenuContent,
6
8
  DropdownMenuItem,
7
9
  DropdownMenuTrigger,
8
- } from '@/components/radix/DropdownMenu';
9
- import { Avatar, AvatarFallback } from '@/components/radix/Avatar';
10
- import { Separator } from '@/components/radix/Separator';
10
+ Separator,
11
+ ThemeToggle,
12
+ } from '@/components';
13
+ import {
14
+ McpConnectionStatus,
15
+ OnboardingModal,
16
+ getOnboardingSkipped,
17
+ setOnboardingSkipped,
18
+ } from '@/features/onboard';
19
+ import { useMcpUsage } from '@/features/logs/hooks/useMcpUsage';
11
20
  import { cn } from '@/lib/utils/utils';
12
- import { ThemeToggle } from '@/components/ThemeToggle';
13
21
  import { useTheme } from '@/lib/contexts/ThemeContext';
22
+ import { useAuth } from '@/lib/contexts/AuthContext';
14
23
 
15
24
  // Import SVG icons
16
25
  import DiscordIcon from '@/assets/logos/discord.svg?react';
17
26
  import GitHubIcon from '@/assets/logos/github.svg?react';
18
27
  import InsForgeLogoLight from '@/assets/logos/insforge_light.svg';
19
28
  import InsForgeLogoDark from '@/assets/logos/insforge_dark.svg';
20
- import { User } from '@/lib/contexts/AuthContext';
21
-
22
- interface AppHeaderProps {
23
- currentUser: User | null;
24
- onLogout: () => void;
25
- }
26
29
 
27
- export default function AppHeader({ currentUser, onLogout }: AppHeaderProps) {
30
+ export default function AppHeader() {
28
31
  const { resolvedTheme } = useTheme();
29
- const [currentEmojiIndex, setCurrentEmojiIndex] = useState(0);
30
- const emojis = ['🙏', '🥺', '🫵'];
32
+ const { user, logout } = useAuth();
33
+ const { hasCompletedOnboarding, isLoading: isMcpLoading } = useMcpUsage();
34
+ const [githubStars, setGithubStars] = useState<number | null>(null);
35
+ const [isOnboardingModalOpen, setIsOnboardingModalOpen] = useState(false);
36
+
37
+ // Fetch GitHub stars
38
+ useEffect(() => {
39
+ fetch('https://api.github.com/repos/InsForge/InsForge')
40
+ .then((res) => res.json())
41
+ .then((data) => {
42
+ if (data.stargazers_count !== undefined) {
43
+ setGithubStars(data.stargazers_count);
44
+ }
45
+ })
46
+ .catch((err) => {
47
+ console.error('Failed to fetch GitHub stars:', err);
48
+ });
49
+ }, []);
50
+
51
+ // Auto-open onboarding modal if user hasn't connected and hasn't skipped
52
+ useEffect(() => {
53
+ if (!isMcpLoading && !hasCompletedOnboarding && !getOnboardingSkipped()) {
54
+ setIsOnboardingModalOpen(true);
55
+ }
56
+ }, [isMcpLoading, hasCompletedOnboarding]);
31
57
 
58
+ // When MCP connection is established, close onboarding modal and clear skip flag
32
59
  useEffect(() => {
33
- const interval = setInterval(() => {
34
- setCurrentEmojiIndex((prevIndex) => (prevIndex + 1) % emojis.length);
35
- }, 2000);
60
+ if (hasCompletedOnboarding) {
61
+ setIsOnboardingModalOpen(false);
62
+ setOnboardingSkipped(false);
63
+ }
64
+ }, [hasCompletedOnboarding]);
36
65
 
37
- return () => clearInterval(interval);
38
- }, [emojis.length]);
66
+ const formatStars = (count: number): string => {
67
+ if (count >= 1000) {
68
+ return `${(count / 1000).toFixed(1)}k`;
69
+ }
70
+ return count.toString();
71
+ };
39
72
 
40
73
  const getUserInitials = (email: string) => {
41
74
  if (!email) {
@@ -65,82 +98,90 @@ export default function AppHeader({ currentUser, onLogout }: AppHeaderProps) {
65
98
  };
66
99
 
67
100
  return (
68
- <div className="h-16 w-full bg-white dark:bg-neutral-800 border-b border-border-gray dark:border-neutral-700 z-50 flex items-center justify-between px-6">
69
- {/* Logo */}
70
- <div className="px-2 py-3">
71
- <img
72
- src={resolvedTheme === 'light' ? InsForgeLogoLight : InsForgeLogoDark}
73
- alt="Insforge Logo"
74
- className="h-8 w-auto"
75
- />
76
- </div>
101
+ <>
102
+ <div className="h-12 w-full bg-white dark:bg-neutral-800 border-b border-border-gray dark:border-neutral-700 z-50 flex items-center justify-between px-6">
103
+ {/* Logo */}
104
+ <div className="px-2 py-3">
105
+ <a href="https://insforge.dev" target="_blank" rel="noopener noreferrer">
106
+ <img
107
+ src={resolvedTheme === 'light' ? InsForgeLogoLight : InsForgeLogoDark}
108
+ alt="Insforge Logo"
109
+ className="h-8 w-auto"
110
+ />
111
+ </a>
112
+ </div>
77
113
 
78
- {/* Social Links */}
79
- <div className="flex items-center gap-3">
80
- {/* GitHub Badge */}
81
- <a
82
- href="https://github.com/InsForge/InsForge"
83
- target="_blank"
84
- rel="noopener noreferrer"
85
- className="inline-flex items-center gap-3 h-10 px-4 text-zinc-50 text-sm font-medium bg-black hover:bg-[#28282F] rounded-full transition-all duration-200"
86
- >
87
- <GitHubIcon className="h-5 w-5 dark:text-white" />
88
- <p className="text-sm text-white">
89
- We need you
90
- <span className="text-md ml-1">{emojis[currentEmojiIndex]}</span>
91
- </p>
92
- </a>
114
+ {/* Right side controls */}
115
+ <div className="flex items-center gap-1">
116
+ {/* Social Links - Small Icon Buttons */}
117
+ <a
118
+ href="https://discord.gg/DvBtaEc9Jz"
119
+ target="_blank"
120
+ rel="noopener noreferrer"
121
+ className="p-2 text-gray-600 dark:text-zinc-400 hover:text-neutral-900 dark:hover:text-white transition-colors duration-200"
122
+ aria-label="Discord"
123
+ >
124
+ <DiscordIcon className="h-5 w-5" />
125
+ </a>
126
+ <a
127
+ href="https://github.com/InsForge/InsForge"
128
+ target="_blank"
129
+ rel="noopener noreferrer"
130
+ className="flex items-center gap-1.5 p-2 text-gray-600 dark:text-zinc-400 hover:text-neutral-900 dark:hover:text-white transition-colors duration-200"
131
+ aria-label="GitHub"
132
+ >
133
+ <GitHubIcon className="h-5 w-5" />
134
+ {githubStars !== null && (
135
+ <span className="text-sm font-medium">{formatStars(githubStars)}</span>
136
+ )}
137
+ </a>
138
+ <Separator className="h-5 mx-2" orientation="vertical" />
139
+ {/* Theme Toggle */}
140
+ <ThemeToggle />
141
+ <Separator className="h-5 mx-2" orientation="vertical" />
142
+ {/* MCP Connection Status */}
143
+ <McpConnectionStatus onConnectClick={() => setIsOnboardingModalOpen(true)} />
93
144
 
94
- {/* Discord Badge */}
95
- <a
96
- href="https://discord.gg/mqPxArVZ26"
97
- target="_blank"
98
- rel="noopener noreferrer"
99
- className="inline-flex items-center gap-3 h-10 px-4 text-zinc-50 text-sm font-medium bg-[#5765F2] hover:bg-[#3E4CD7] rounded-full transition-all duration-200"
100
- >
101
- <DiscordIcon className="h-5 w-5" />
102
- <p className="text-sm text-white mr-1.5">Ask us anything</p>
103
- </a>
104
- <Separator className="h-6 mx-1" orientation="vertical" />
105
- {/* Theme Toggle */}
106
- <ThemeToggle />
107
- <Separator className="h-6 mx-1" orientation="vertical" />
108
- {/* User Profile */}
109
- <DropdownMenu modal={false}>
110
- <DropdownMenuTrigger asChild>
111
- <button className="w-50 flex items-center gap-3 hover:bg-zinc-100 dark:hover:bg-zinc-800 rounded-[8px] pr-3 transition-all duration-200 group">
112
- <Avatar className="h-10 w-10 ring-2 ring-white dark:ring-gray-700 shadow-sm">
113
- <AvatarFallback
114
- className={cn(
115
- 'text-white font-medium text-sm',
116
- getAvatarColor(currentUser?.email ?? '')
117
- )}
118
- >
119
- {getUserInitials(currentUser?.email ?? '')}
120
- </AvatarFallback>
121
- </Avatar>
122
- <div className="text-left hidden md:block">
123
- <p className="text-sm font-medium text-zinc-950 dark:text-zinc-100 leading-tight">
124
- Admin
125
- </p>
126
- <p className="text-xs text-zinc-500 dark:text-zinc-400">
127
- {currentUser?.email || 'Administrator'}
128
- </p>
129
- </div>
130
- <ChevronDown className="h-5 w-5 text-black dark:text-white hidden md:block ml-auto" />
131
- </button>
132
- </DropdownMenuTrigger>
133
- <DropdownMenuContent align="end" className="w-48" sideOffset={8} collisionPadding={16}>
134
- <DropdownMenuItem
135
- onClick={onLogout}
136
- className="cursor-pointer text-red-600 dark:text-red-400"
137
- >
138
- <LogOut className="mr-2 h-4 w-4" />
139
- <span>Sign Out</span>
140
- </DropdownMenuItem>
141
- </DropdownMenuContent>
142
- </DropdownMenu>
145
+ {/* User Profile*/}
146
+ <Separator className="h-5 mx-2" orientation="vertical" />
147
+ <DropdownMenu modal={false}>
148
+ <DropdownMenuTrigger asChild>
149
+ <button className="w-50 flex items-center gap-3 hover:bg-zinc-100 dark:hover:bg-zinc-800 rounded-[8px] pr-3 transition-all duration-200 group">
150
+ <Avatar className="h-10 w-10 ring-2 ring-white dark:ring-gray-700 shadow-sm">
151
+ <AvatarFallback
152
+ className={cn(
153
+ 'text-white font-medium text-sm',
154
+ getAvatarColor(user?.email ?? '')
155
+ )}
156
+ >
157
+ {getUserInitials(user?.email ?? '')}
158
+ </AvatarFallback>
159
+ </Avatar>
160
+ <div className="text-left hidden md:block">
161
+ <p className="text-sm font-medium text-zinc-950 dark:text-zinc-100 leading-tight">
162
+ Admin
163
+ </p>
164
+ <p className="text-xs text-zinc-500 dark:text-zinc-400">
165
+ {user?.email || 'Administrator'}
166
+ </p>
167
+ </div>
168
+ <ChevronDown className="h-5 w-5 text-black dark:text-white hidden md:block ml-auto" />
169
+ </button>
170
+ </DropdownMenuTrigger>
171
+ <DropdownMenuContent align="end" className="w-48" sideOffset={8} collisionPadding={16}>
172
+ <DropdownMenuItem
173
+ onClick={logout}
174
+ className="cursor-pointer text-red-600 dark:text-red-400"
175
+ >
176
+ <LogOut className="mr-2 h-4 w-4" />
177
+ <span>Sign Out</span>
178
+ </DropdownMenuItem>
179
+ </DropdownMenuContent>
180
+ </DropdownMenu>
181
+ </div>
143
182
  </div>
144
- </div>
183
+ {/* Onboarding Modal */}
184
+ <OnboardingModal open={isOnboardingModalOpen} onOpenChange={setIsOnboardingModalOpen} />
185
+ </>
145
186
  );
146
187
  }