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,114 +1,143 @@
1
- import React from 'react';
2
- import { Button } from '@/components/radix/Button';
3
- import {
4
- Tooltip,
5
- TooltipTrigger,
6
- TooltipContent,
7
- TooltipProvider,
8
- } from '@/components/radix/Tooltip';
9
1
  import {
2
+ Button,
10
3
  DropdownMenu,
11
4
  DropdownMenuContent,
12
5
  DropdownMenuItem,
13
6
  DropdownMenuTrigger,
14
- } from '@/components/radix/DropdownMenu';
15
- import { MoreHorizontal, Pencil, Trash2 } from 'lucide-react';
7
+ Tooltip,
8
+ TooltipTrigger,
9
+ TooltipContent,
10
+ TooltipProvider,
11
+ } from '@/components';
12
+
13
+ import { MoreHorizontal, Pencil, Trash2, DollarSign } from 'lucide-react';
16
14
  import {
17
15
  // formatTokenCount,
18
- getProviderDisplayName,
19
- getFriendlyModelName,
20
16
  getModalityIcon,
17
+ ModelOption,
21
18
  } from '../helpers';
22
- import { AIConfigurationWithUsageSchema } from '@insforge/shared-schemas';
23
-
24
- interface AIConfigExtended extends AIConfigurationWithUsageSchema {
25
- logo?: React.FunctionComponent<React.SVGProps<SVGSVGElement>>;
26
- }
19
+ import { cn } from '@/lib/utils/utils';
27
20
 
28
21
  interface AIModelCardProps {
29
- config: AIConfigExtended;
30
- onEdit: (id: string) => void;
31
- onDelete: (id: string) => void;
22
+ config: ModelOption;
23
+ onEdit?: (id: string) => void;
24
+ onDelete?: (id: string) => void;
25
+ mode?: 'configured' | 'selectable';
26
+ isSelected?: boolean;
27
+ onSelect?: () => void;
28
+ isDisabled?: boolean;
32
29
  }
33
30
 
34
- export function AIModelCard({ config, onEdit, onDelete }: AIModelCardProps) {
35
- // Extract provider info
36
- const companyId = config.modelId.split('/')[0];
37
- const providerName = getProviderDisplayName(companyId);
38
-
39
- // Get friendly model name from modelId
40
- const modelName = getFriendlyModelName(config.modelId);
31
+ export function AIModelCard({
32
+ config,
33
+ onEdit,
34
+ onDelete,
35
+ mode = 'configured',
36
+ isSelected = false,
37
+ onSelect,
38
+ isDisabled = false,
39
+ }: AIModelCardProps) {
40
+ const isSelectableMode = mode === 'selectable';
41
41
 
42
- const inputModality = config.inputModality;
43
- const outputModality = config.outputModality;
42
+ const handleCardClick = () => {
43
+ if (isSelectableMode && !isDisabled && onSelect) {
44
+ onSelect();
45
+ }
46
+ };
44
47
 
45
48
  return (
46
49
  <TooltipProvider>
47
- <div className="relative py-5 px-4 bg-white dark:bg-[#333333] rounded-[8px] border border-neutral-200 dark:border-neutral-700 transition-all duration-200">
48
- {/* More button */}
49
- <DropdownMenu>
50
- <DropdownMenuTrigger asChild>
51
- <Button
52
- variant="ghost"
53
- size="icon"
54
- className="h-7 w-7 p-1 hover:bg-gray-100 dark:hover:bg-neutral-700 absolute top-3 right-3"
55
- >
56
- <MoreHorizontal className="h-4 w-4 text-gray-500 dark:text-neutral-400" />
57
- </Button>
58
- </DropdownMenuTrigger>
59
- <DropdownMenuContent align="end">
60
- <DropdownMenuItem
61
- className="flex flex-row gap-3 px-3 py-2 cursor-pointer"
62
- onClick={() => onEdit(config.id)}
63
- >
64
- <Pencil className="w-4 h-4" /> System Prompt
65
- </DropdownMenuItem>
66
- <DropdownMenuItem
67
- onClick={() => onDelete(config.id)}
68
- className="text-red-600 dark:text-red-400 flex flex-row gap-3 px-3 py-2 cursor-pointer"
69
- >
70
- <Trash2 className="w-4 h-4" /> Delete
71
- </DropdownMenuItem>
72
- </DropdownMenuContent>
73
- </DropdownMenu>
50
+ <div
51
+ className={cn(
52
+ 'relative py-5 px-4 bg-white dark:bg-[#333333] rounded-[8px] transition-all duration-200',
53
+ isSelectableMode && !isDisabled && 'cursor-pointer',
54
+ isSelectableMode && isSelected
55
+ ? 'border-2 border-zinc-700 dark:border-emerald-300'
56
+ : 'border-2 border-neutral-200 dark:border-neutral-700',
57
+ isSelectableMode &&
58
+ !isDisabled &&
59
+ !isSelected &&
60
+ 'hover:shadow-md hover:bg-neutral-100 dark:hover:bg-neutral-700',
61
+ isDisabled && 'opacity-50 cursor-not-allowed'
62
+ )}
63
+ onClick={handleCardClick}
64
+ >
65
+ {/* Configured mode: More button */}
66
+ {mode === 'configured' && onEdit && onDelete && (
67
+ <DropdownMenu>
68
+ <DropdownMenuTrigger asChild>
69
+ <Button
70
+ variant="ghost"
71
+ size="icon"
72
+ className="h-7 w-7 p-1 hover:bg-neutral-200 dark:hover:bg-neutral-700 absolute top-3 right-3"
73
+ >
74
+ <MoreHorizontal className="h-4 w-4 text-neutral-500 dark:text-neutral-400" />
75
+ </Button>
76
+ </DropdownMenuTrigger>
77
+ <DropdownMenuContent align="end">
78
+ <DropdownMenuItem
79
+ className="flex flex-row gap-3 px-3 py-2 cursor-pointer"
80
+ onClick={() => onEdit(config.id)}
81
+ >
82
+ <Pencil className="w-4 h-4" /> System Prompt
83
+ </DropdownMenuItem>
84
+ <DropdownMenuItem
85
+ onClick={() => onDelete(config.id)}
86
+ className="text-red-600 dark:text-red-400 flex flex-row gap-3 px-3 py-2 cursor-pointer"
87
+ >
88
+ <Trash2 className="w-4 h-4" /> Delete
89
+ </DropdownMenuItem>
90
+ </DropdownMenuContent>
91
+ </DropdownMenu>
92
+ )}
93
+
94
+ {/* Selectable mode: Added badge */}
95
+ {isSelectableMode && isDisabled && (
96
+ <div className="absolute top-3 right-3 px-2 py-1 text-xs font-medium text-neutral-500 dark:text-neutral-400 bg-neutral-100 dark:bg-neutral-800 rounded">
97
+ Added
98
+ </div>
99
+ )}
74
100
 
75
101
  {/* Header with logo */}
76
102
  <div className="flex items-start justify-between mb-4">
77
103
  <div className="flex items-center gap-3">
78
104
  {/* Provider Logo */}
79
- <div className="w-10 h-10">
80
- {config.logo ? (
81
- <config.logo className="w-10 h-10 dark:text-white" />
82
- ) : (
83
- <div className="w-10 h-10 bg-gray-500 rounded flex items-center justify-center text-white text-sm font-bold">
84
- {companyId.charAt(0).toUpperCase()}
105
+ <Tooltip key={config.providerName}>
106
+ <TooltipTrigger asChild>
107
+ <div className="w-10 h-10">
108
+ {config.logo ? (
109
+ <config.logo className="w-10 h-10 dark:text-white" />
110
+ ) : (
111
+ <div className="w-10 h-10 bg-gray-500 rounded flex items-center justify-center text-white text-sm font-bold">
112
+ {config.providerName.charAt(0).toUpperCase()}
113
+ </div>
114
+ )}
85
115
  </div>
86
- )}
87
- </div>
116
+ </TooltipTrigger>
117
+ <TooltipContent side="top" sideOffset={8}>
118
+ <p className="capitalize">{config.providerName}</p>
119
+ </TooltipContent>
120
+ </Tooltip>
88
121
 
89
122
  {/* Model Info */}
90
- <div>
91
- <p
92
- className="font-medium text-sm text-zinc-950 dark:text-zinc-50 line-clamp-1 mr-3"
93
- title={modelName}
94
- >
95
- {modelName}
96
- </p>
97
- <p className="text-xs font-medium text-neutral-500 dark:text-neutral-400">
98
- {providerName}
99
- </p>
100
- </div>
123
+ <p
124
+ className="font-medium text-sm text-zinc-950 dark:text-zinc-50 max-h-10 line-clamp-2"
125
+ title={config.modelName ? config.modelName : config.providerName}
126
+ >
127
+ {config.modelName ? config.modelName : config.providerName}
128
+ </p>
129
+ {(!isSelectableMode || (isSelectableMode && isDisabled)) && <div className="w-6" />}
101
130
  </div>
102
131
  </div>
103
132
 
104
- <div className="h-[1px] bg-neutral-200 dark:bg-neutral-700 my-3" />
133
+ <div className="h-px bg-neutral-200 dark:bg-neutral-700 my-3" />
105
134
 
106
- {/* Modality indicators */}
135
+ {/* Modality indicators - use config modalities directly */}
107
136
  <div className="flex flex-col gap-3 items-stretch">
108
137
  <div className="flex items-center justify-between">
109
138
  <span className="text-black dark:text-white">Input</span>
110
139
  <div className="flex items-center gap-2">
111
- {inputModality.map((modality) => {
140
+ {config.inputModality.map((modality) => {
112
141
  const IconComponent = getModalityIcon(modality);
113
142
  return (
114
143
  <Tooltip key={modality}>
@@ -127,7 +156,7 @@ export function AIModelCard({ config, onEdit, onDelete }: AIModelCardProps) {
127
156
  <div className="flex items-center justify-between">
128
157
  <span className="text-black dark:text-white">Output</span>
129
158
  <div className="flex items-center gap-2">
130
- {outputModality.map((modality) => {
159
+ {config.outputModality.map((modality) => {
131
160
  const IconComponent = getModalityIcon(modality);
132
161
  return (
133
162
  <Tooltip key={modality}>
@@ -143,10 +172,27 @@ export function AIModelCard({ config, onEdit, onDelete }: AIModelCardProps) {
143
172
  </div>
144
173
  </div>
145
174
 
146
- <div className="flex items-center justify-between text-sm text-black dark:text-white">
147
- <span>Requests</span>
148
- <span>{config.usageStats?.totalRequests || 0}</span>
149
- </div>
175
+ {isSelectableMode ? (
176
+ <div className="flex items-center justify-between">
177
+ <span className="text-black dark:text-white">Credit Usage</span>
178
+ <div className="flex items-center">
179
+ {typeof config.priceLevel === 'number' && config.priceLevel > 0 ? (
180
+ Array.from({ length: config.priceLevel }).map((_, i) => (
181
+ <div key={i} className="w-5 h-5 flex items-center justify-center">
182
+ <DollarSign className="w-4 h-4 text-neutral-500 dark:text-neutral-400" />
183
+ </div>
184
+ ))
185
+ ) : (
186
+ <span className="text-sm text-neutral-500 dark:text-neutral-400">Free</span>
187
+ )}
188
+ </div>
189
+ </div>
190
+ ) : (
191
+ <div className="flex items-center justify-between text-sm text-black dark:text-white">
192
+ <span>Requests</span>
193
+ <span>{config.usageStats?.totalRequests || 0}</span>
194
+ </div>
195
+ )}
150
196
  </div>
151
197
  </div>
152
198
  </TooltipProvider>
@@ -1,15 +1,20 @@
1
1
  import React from 'react';
2
- import { Box } from 'lucide-react';
2
+ import { Sparkles } from 'lucide-react';
3
3
 
4
- const AIEmptyState: React.FC = () => {
4
+ interface AIEmptyStateProps {
5
+ title: string;
6
+ description?: string;
7
+ }
8
+
9
+ const AIEmptyState: React.FC<AIEmptyStateProps> = ({ title, description }) => {
5
10
  return (
6
11
  <div className="flex flex-col items-center justify-center py-8 text-center gap-3 rounded-[8px] bg-neutral-100 dark:bg-[#333333]">
7
- <Box size={40} className="text-neutral-400 dark:text-neutral-600" />
12
+ <Sparkles size={40} className="text-neutral-400 dark:text-neutral-600" />
8
13
  <div className="flex flex-col items-center justify-center gap-1">
9
- <p className="text-sm font-medium text-zinc-950 dark:text-white">No AI Integration Yet</p>
10
- <p className="text-neutral-500 dark:text-neutral-400 text-xs">
11
- Add your first integration to get started
12
- </p>
14
+ <p className="text-sm font-medium text-zinc-950 dark:text-white">{title}</p>
15
+ {description && (
16
+ <p className="text-neutral-500 dark:text-neutral-400 text-xs max-w-md">{description}</p>
17
+ )}
13
18
  </div>
14
19
  </div>
15
20
  );
@@ -0,0 +1,101 @@
1
+ import { Checkbox, Label } from '@/components';
2
+ import { ModalitySchema } from '@insforge/shared-schemas';
3
+
4
+ interface ModalityFilterSidebarProps {
5
+ inputModalities: ModalitySchema[];
6
+ outputModalities: ModalitySchema[];
7
+ onInputChange: (modalities: ModalitySchema[]) => void;
8
+ onOutputChange: (modalities: ModalitySchema[]) => void;
9
+ }
10
+
11
+ const modalityOptions: Array<{
12
+ value: ModalitySchema;
13
+ label: string;
14
+ }> = [
15
+ { value: 'text', label: 'Text' },
16
+ { value: 'image', label: 'Image' },
17
+ ];
18
+
19
+ export function ModalityFilterSidebar({
20
+ inputModalities,
21
+ outputModalities,
22
+ onInputChange,
23
+ onOutputChange,
24
+ }: ModalityFilterSidebarProps) {
25
+ const handleModalityToggle = (
26
+ type: 'input' | 'output',
27
+ modality: ModalitySchema,
28
+ checked: boolean
29
+ ) => {
30
+ const currentModalities = type === 'input' ? inputModalities : outputModalities;
31
+ const setModalities = type === 'input' ? onInputChange : onOutputChange;
32
+
33
+ if (checked) {
34
+ setModalities([...currentModalities, modality]);
35
+ } else {
36
+ setModalities(currentModalities.filter((m) => m !== modality));
37
+ }
38
+ };
39
+
40
+ return (
41
+ <div className="w-30 flex-shrink-0 flex flex-col gap-6">
42
+ <p className="text-base font-medium text-zinc-950 dark:text-neutral-50">Filters</p>
43
+
44
+ {/* Input Section */}
45
+ <div className="flex flex-col gap-3">
46
+ <Label className="text-sm font-normal text-zinc-950 dark:text-neutral-50 block">
47
+ Input
48
+ </Label>
49
+ <div className="flex flex-col gap-4">
50
+ {modalityOptions.map((option) => {
51
+ const isChecked = inputModalities.includes(option.value);
52
+ return (
53
+ <div key={option.value} className="flex items-center gap-x-2">
54
+ <Checkbox
55
+ checked={isChecked}
56
+ onChange={(checked: boolean) =>
57
+ handleModalityToggle('input', option.value, checked)
58
+ }
59
+ />
60
+ <Label
61
+ className="text-sm font-normal text-zinc-950 dark:text-white cursor-pointer"
62
+ onClick={() => handleModalityToggle('input', option.value, !isChecked)}
63
+ >
64
+ {option.label}
65
+ </Label>
66
+ </div>
67
+ );
68
+ })}
69
+ </div>
70
+ </div>
71
+
72
+ {/* Output Section */}
73
+ <div className="flex flex-col gap-3">
74
+ <Label className="text-sm font-normal text-zinc-950 dark:text-neutral-50 block">
75
+ Output
76
+ </Label>
77
+ <div className="flex flex-col gap-4">
78
+ {modalityOptions.map((option) => {
79
+ const isChecked = outputModalities.includes(option.value);
80
+ return (
81
+ <div key={option.value} className="flex items-center gap-x-2">
82
+ <Checkbox
83
+ checked={isChecked}
84
+ onChange={(checked: boolean) =>
85
+ handleModalityToggle('output', option.value, checked)
86
+ }
87
+ />
88
+ <Label
89
+ className="text-sm font-normal text-zinc-950 dark:text-white cursor-pointer"
90
+ onClick={() => handleModalityToggle('output', option.value, !isChecked)}
91
+ >
92
+ {option.label}
93
+ </Label>
94
+ </div>
95
+ );
96
+ })}
97
+ </div>
98
+ </div>
99
+ </div>
100
+ );
101
+ }
@@ -0,0 +1,135 @@
1
+ import { useState, useEffect, useMemo } from 'react';
2
+ import {
3
+ Button,
4
+ Dialog,
5
+ DialogContent,
6
+ DialogHeader,
7
+ DialogTitle,
8
+ DialogFooter,
9
+ } from '@/components';
10
+ import { CreateAIConfigurationRequest, ModalitySchema } from '@insforge/shared-schemas';
11
+ import { useAIConfigs } from '../hooks/useAIConfigs';
12
+ import { useToast } from '@/lib/hooks/useToast';
13
+ import { ModalityFilterSidebar } from './ModalityFilterSidebar';
14
+ import { ModelSelectionGrid } from './ModelSelectionGrid';
15
+
16
+ interface ModelSelectionDialogProps {
17
+ open: boolean;
18
+ onOpenChange: (open: boolean) => void;
19
+ onSuccess: (data: CreateAIConfigurationRequest) => void;
20
+ }
21
+
22
+ export function ModelSelectionDialog({ open, onOpenChange, onSuccess }: ModelSelectionDialogProps) {
23
+ const { allAvailableModels, configuredModelIds, getFilteredModels } = useAIConfigs();
24
+ const { showToast } = useToast();
25
+
26
+ const [selectedInputModalities, setSelectedInputModalities] = useState<ModalitySchema[]>([]);
27
+ const [selectedOutputModalities, setSelectedOutputModalities] = useState<ModalitySchema[]>([]);
28
+ const [selectedModelId, setSelectedModelId] = useState<string>(''); // This is the modelId of the selected model
29
+
30
+ // Reset state when dialog opens/closes
31
+ useEffect(() => {
32
+ if (!open) {
33
+ setSelectedInputModalities([]);
34
+ setSelectedOutputModalities([]);
35
+ setSelectedModelId('');
36
+ }
37
+ }, [open]);
38
+
39
+ // Use the existing filtered models logic from useAIConfigs
40
+ const filteredModels = useMemo(() => {
41
+ return getFilteredModels(selectedInputModalities, selectedOutputModalities);
42
+ }, [getFilteredModels, selectedInputModalities, selectedOutputModalities]);
43
+
44
+ // Reset model selection when modalities change
45
+ useEffect(() => {
46
+ if (selectedModelId) {
47
+ const stillAvailable = filteredModels.some((model) => model.modelId === selectedModelId);
48
+ if (!stillAvailable) {
49
+ setSelectedModelId('');
50
+ }
51
+ }
52
+ }, [selectedInputModalities, selectedOutputModalities, filteredModels, selectedModelId]);
53
+
54
+ const handleFormSubmit = (e: React.FormEvent) => {
55
+ e.preventDefault();
56
+
57
+ const selectedModel = allAvailableModels.find((model) => model.modelId === selectedModelId);
58
+
59
+ if (!selectedModel) {
60
+ showToast('Selected model not found', 'error');
61
+ return;
62
+ }
63
+
64
+ const createData: CreateAIConfigurationRequest = {
65
+ provider: selectedModel.provider,
66
+ modelId: selectedModel.modelId,
67
+ inputModality: selectedModel.inputModality,
68
+ outputModality: selectedModel.outputModality,
69
+ };
70
+
71
+ onSuccess(createData);
72
+ onOpenChange(false);
73
+ };
74
+
75
+ const handleCancel = () => {
76
+ onOpenChange(false);
77
+ };
78
+
79
+ return (
80
+ <Dialog open={open} onOpenChange={onOpenChange}>
81
+ <DialogContent
82
+ aria-describedby={undefined}
83
+ className="max-w-5xl h-[80vh] p-0 gap-0 border-zinc-200 shadow-[0px_1px_3px_0px_rgba(0,0,0,0.1)] flex flex-col"
84
+ >
85
+ <DialogHeader className="pl-6 pr-4 py-3 flex flex-col gap-1 justify-start border-b border-zinc-200 dark:border-neutral-700 flex-shrink-0">
86
+ <DialogTitle className="text-lg font-semibold text-zinc-950 dark:text-white">
87
+ Select AI Model for Integration
88
+ </DialogTitle>
89
+ </DialogHeader>
90
+
91
+ <form
92
+ id="model-selection-form"
93
+ onSubmit={handleFormSubmit}
94
+ className="flex flex-col flex-1 overflow-hidden"
95
+ >
96
+ <div className="flex gap-5 py-6 pl-6 flex-1 overflow-hidden">
97
+ <ModalityFilterSidebar
98
+ inputModalities={selectedInputModalities}
99
+ outputModalities={selectedOutputModalities}
100
+ onInputChange={setSelectedInputModalities}
101
+ onOutputChange={setSelectedOutputModalities}
102
+ />
103
+ <div className="flex-1 overflow-y-auto">
104
+ <ModelSelectionGrid
105
+ models={filteredModels}
106
+ selectedModelId={selectedModelId}
107
+ onSelectModel={setSelectedModelId}
108
+ configuredModelIds={configuredModelIds}
109
+ />
110
+ </div>
111
+ </div>
112
+ </form>
113
+
114
+ <DialogFooter className="p-6 gap-3 border-t border-zinc-200 dark:border-neutral-700 flex-shrink-0">
115
+ <Button
116
+ type="button"
117
+ variant="outline"
118
+ onClick={handleCancel}
119
+ className="h-9 px-3 py-2 rounded-sm text-sm font-medium dark:bg-neutral-600 dark:text-zinc-300 dark:border-neutral-600 dark:hover:bg-neutral-700"
120
+ >
121
+ Cancel
122
+ </Button>
123
+ <Button
124
+ type="submit"
125
+ form="model-selection-form"
126
+ disabled={!selectedModelId}
127
+ className="h-9 px-3 py-2 rounded-sm text-sm font-medium bg-zinc-950 text-white hover:bg-zinc-800 disabled:opacity-40 dark:bg-emerald-300 dark:text-zinc-950 dark:hover:bg-emerald-400"
128
+ >
129
+ Add Integration
130
+ </Button>
131
+ </DialogFooter>
132
+ </DialogContent>
133
+ </Dialog>
134
+ );
135
+ }
@@ -0,0 +1,51 @@
1
+ import { AIModelCard } from './AIConfigCard';
2
+ import { ModelOption } from '../helpers';
3
+
4
+ interface ModelSelectionGridProps {
5
+ models: ModelOption[];
6
+ selectedModelId: string;
7
+ onSelectModel: (modelId: string) => void;
8
+ configuredModelIds: string[];
9
+ }
10
+
11
+ export function ModelSelectionGrid({
12
+ models,
13
+ selectedModelId,
14
+ onSelectModel,
15
+ configuredModelIds,
16
+ }: ModelSelectionGridProps) {
17
+ if (!models.length) {
18
+ return (
19
+ <div className="flex-1 flex items-center justify-center min-h-[300px] mr-6">
20
+ <div className="text-center">
21
+ <p className="text-neutral-500 dark:text-neutral-400 text-base">
22
+ No models match the selected filters.
23
+ </p>
24
+ <p className="text-neutral-400 dark:text-neutral-500 text-sm mt-2">
25
+ Try adjusting your input/output modality filters.
26
+ </p>
27
+ </div>
28
+ </div>
29
+ );
30
+ }
31
+
32
+ return (
33
+ <div className="flex-1 grid grid-cols-3 gap-5 auto-rows-fr mr-6">
34
+ {models.map((model) => {
35
+ const isConfigured = configuredModelIds.includes(model.modelId);
36
+ const isSelected = selectedModelId === model.modelId;
37
+
38
+ return (
39
+ <AIModelCard
40
+ key={model.id}
41
+ config={model}
42
+ mode="selectable"
43
+ isSelected={isSelected}
44
+ isDisabled={isConfigured}
45
+ onSelect={() => !isConfigured && onSelectModel(model.modelId)}
46
+ />
47
+ );
48
+ })}
49
+ </div>
50
+ );
51
+ }