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,82 +0,0 @@
1
- import { Router, Request, Response } from 'express';
2
- import { OpenAPIService } from '@/core/documentation/openapi.js';
3
- import { AppError } from '@/api/middleware/error.js';
4
- import { ERROR_CODES } from '@/types/error-constants.js';
5
- import { successResponse } from '@/utils/response.js';
6
- import logger from '@/utils/logger.js';
7
-
8
- const router = Router();
9
- const openAPIService = OpenAPIService.getInstance();
10
-
11
- /**
12
- * GET /api/openapi
13
- * Get the OpenAPI specification document
14
- */
15
- router.get('/', async (_req: Request, res: Response, next) => {
16
- try {
17
- const openAPIDocument = await openAPIService.generateOpenAPIDocument();
18
- successResponse(res, openAPIDocument);
19
- } catch (error) {
20
- logger.error('Failed to generate OpenAPI document', {
21
- error: error instanceof Error ? error.message : String(error),
22
- });
23
- next(new AppError('Failed to generate OpenAPI document', 500, ERROR_CODES.INTERNAL_ERROR));
24
- }
25
- });
26
-
27
- /**
28
- * GET /api/openapi/swagger
29
- * Serve Swagger UI HTML page
30
- */
31
- router.get('/swagger', (_req: Request, res: Response) => {
32
- const html = `
33
- <!DOCTYPE html>
34
- <html lang="en">
35
- <head>
36
- <meta charset="utf-8" />
37
- <meta name="viewport" content="width=device-width, initial-scale=1" />
38
- <title>InsForge API Documentation</title>
39
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css" />
40
- <style>
41
- body {
42
- margin: 0;
43
- padding: 0;
44
- }
45
- .swagger-ui .topbar {
46
- display: none;
47
- }
48
- </style>
49
- </head>
50
- <body>
51
- <div id="swagger-ui"></div>
52
- <script src="https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js"></script>
53
- <script>
54
- window.onload = () => {
55
- window.ui = SwaggerUIBundle({
56
- url: '/api/openapi',
57
- dom_id: '#swagger-ui',
58
- deepLinking: true,
59
- presets: [
60
- SwaggerUIBundle.presets.apis,
61
- SwaggerUIBundle.SwaggerUIStandalonePreset
62
- ],
63
- layout: 'BaseLayout',
64
- tryItOutEnabled: true,
65
- requestInterceptor: (request) => {
66
- // Add API key from localStorage if available
67
- const apiKey = localStorage.getItem('insforge_api_key');
68
- if (apiKey) {
69
- request.headers['x-api-key'] = apiKey;
70
- }
71
- return request;
72
- }
73
- });
74
- };
75
- </script>
76
- </body>
77
- </html>
78
- `;
79
- res.type('html').send(html);
80
- });
81
-
82
- export { router as openAPIRouter };
@@ -1,96 +0,0 @@
1
- import { Router } from 'express';
2
- import { DatabaseManager } from '@/core/database/manager.js';
3
- import { verifyApiKey, verifyCloudBackend } from '@/api/middleware/auth.js';
4
-
5
- export const usageRouter = Router();
6
-
7
- // Create MCP tool usage record
8
- usageRouter.post('/mcp', verifyApiKey, async (req, res, next) => {
9
- try {
10
- const { tool_name, success = true } = req.body;
11
-
12
- if (!tool_name) {
13
- return res.status(400).json({
14
- error: 'VALIDATION_ERROR',
15
- message: 'tool_name is required',
16
- });
17
- }
18
-
19
- const dbManager = DatabaseManager.getInstance();
20
- const db = dbManager.getDb();
21
-
22
- // Insert MCP usage record directly
23
- await db
24
- .prepare(
25
- `
26
- INSERT INTO _mcp_usage (tool_name, success)
27
- VALUES ($1, $2)
28
- `
29
- )
30
- .run(tool_name, success);
31
-
32
- res.json({ success: true });
33
- } catch (error) {
34
- next(error);
35
- }
36
- });
37
-
38
- // Get usage statistics (called by cloud backend)
39
- usageRouter.get('/stats', verifyCloudBackend, async (req, res, next) => {
40
- try {
41
- const { start_date, end_date } = req.query;
42
-
43
- if (!start_date || !end_date) {
44
- return res.status(400).json({
45
- error: 'VALIDATION_ERROR',
46
- message: 'start_date and end_date are required',
47
- });
48
- }
49
-
50
- const dbManager = DatabaseManager.getInstance();
51
- const db = dbManager.getDb();
52
-
53
- // Get MCP tool usage count within date range
54
- const mcpResult = await db
55
- .prepare(
56
- `
57
- SELECT COUNT(*) as count
58
- FROM _mcp_usage
59
- WHERE success = true
60
- AND created_at >= $1
61
- AND created_at < $2
62
- `
63
- )
64
- .get(new Date(start_date as string), new Date(end_date as string));
65
- const mcpUsageCount = parseInt(mcpResult?.count || '0');
66
-
67
- // Get database size (in bytes)
68
- const dbSizeResult = await db
69
- .prepare(
70
- `
71
- SELECT pg_database_size(current_database()) as size
72
- `
73
- )
74
- .get();
75
- const databaseSize = parseInt(dbSizeResult?.size || '0');
76
-
77
- // Get total storage size from _storage table
78
- const storageResult = await db
79
- .prepare(
80
- `
81
- SELECT COALESCE(SUM(size), 0) as total_size
82
- FROM _storage
83
- `
84
- )
85
- .get();
86
- const storageSize = parseInt(storageResult?.total_size || '0');
87
-
88
- res.json({
89
- mcp_usage_count: mcpUsageCount,
90
- database_size_bytes: databaseSize,
91
- storage_size_bytes: storageSize,
92
- });
93
- } catch (error) {
94
- next(error);
95
- }
96
- });
@@ -1,242 +0,0 @@
1
- import OpenAI from 'openai';
2
- import jwt from 'jsonwebtoken';
3
- import { isCloudEnvironment } from '@/utils/environment';
4
- import { AppError } from '@/api/middleware/error';
5
- import { ERROR_CODES } from '@/types/error-constants';
6
-
7
- interface CloudCredentialsResponse {
8
- openrouter?: {
9
- api_key: string;
10
- limit?: number;
11
- expired_at?: string | null;
12
- usage?: number;
13
- limit_remaining?: number;
14
- };
15
- }
16
-
17
- interface CloudCredentials {
18
- apiKey: string;
19
- limitRemaining?: number;
20
- expiredAt?: Date | null;
21
- }
22
-
23
- interface OpenRouterKeyInfo {
24
- data: {
25
- label: string;
26
- usage: number;
27
- limit: number | null;
28
- is_free_tier: boolean;
29
- };
30
- }
31
-
32
- interface OpenRouterLimitation {
33
- label: string;
34
- limit: number | null;
35
- usage: number;
36
- is_provisioning_key: boolean;
37
- limit_remaining: number | null;
38
- is_free_tier: boolean;
39
- rate_limit: {
40
- requests: number;
41
- interval: string;
42
- note: string;
43
- };
44
- }
45
-
46
- export class AIClientService {
47
- private static instance: AIClientService;
48
- private cloudCredentials: CloudCredentials | undefined;
49
- private openRouterClient: OpenAI | null = null;
50
- private currentApiKey: string | undefined;
51
-
52
- private constructor() {}
53
-
54
- static getInstance(): AIClientService {
55
- if (!AIClientService.instance) {
56
- AIClientService.instance = new AIClientService();
57
- }
58
- return AIClientService.instance;
59
- }
60
-
61
- /**
62
- * Create or recreate the OpenAI client with the given API key
63
- */
64
- private createClient(apiKey: string): OpenAI {
65
- this.currentApiKey = apiKey;
66
- return new OpenAI({
67
- baseURL: 'https://openrouter.ai/api/v1',
68
- apiKey,
69
- defaultHeaders: {
70
- 'HTTP-Referer': 'https://insforge.dev',
71
- 'X-Title': 'InsForge',
72
- },
73
- });
74
- }
75
-
76
- /**
77
- * Get OpenRouter API key based on environment
78
- * In cloud environment: fetches from cloud API with JWT authentication
79
- * In local environment: returns from environment variable
80
- */
81
- async getApiKey(): Promise<string> {
82
- if (isCloudEnvironment()) {
83
- if (
84
- this.cloudCredentials &&
85
- (!this.cloudCredentials.expiredAt || new Date() <= this.cloudCredentials.expiredAt)
86
- ) {
87
- return this.cloudCredentials.apiKey;
88
- } else {
89
- return await this.fetchCloudApiKey();
90
- }
91
- }
92
-
93
- const apiKey = process.env.OPENROUTER_API_KEY;
94
- if (!apiKey) {
95
- throw new AppError(
96
- 'OPENROUTER_API_KEY not found in environment variables',
97
- 500,
98
- ERROR_CODES.AI_INVALID_API_KEY
99
- );
100
- }
101
- return apiKey;
102
- }
103
-
104
- /**
105
- * Get the OpenAI client, creating or updating it as needed
106
- * This is the main method services should use
107
- */
108
- async getClient(): Promise<OpenAI> {
109
- if (!this.openRouterClient) {
110
- this.openRouterClient = this.createClient(await this.getApiKey());
111
- return this.openRouterClient;
112
- }
113
- if (isCloudEnvironment()) {
114
- const apiKey = await this.getApiKey();
115
- if (this.currentApiKey !== apiKey) {
116
- this.openRouterClient = this.createClient(apiKey);
117
- }
118
- }
119
- return this.openRouterClient;
120
- }
121
-
122
- /**
123
- * Check if AI services are properly configured
124
- */
125
- isConfigured(): boolean {
126
- if (isCloudEnvironment()) {
127
- return true;
128
- }
129
- return !!process.env.OPENROUTER_API_KEY;
130
- }
131
-
132
- /**
133
- * Get remaining credits for the current API key from OpenRouter
134
- */
135
- async getRemainingCredits(): Promise<{
136
- usage: number;
137
- limit: number | null;
138
- remaining: number | null;
139
- }> {
140
- try {
141
- const apiKey = await this.getApiKey();
142
-
143
- if (isCloudEnvironment()) {
144
- // Use InsForge API for cloud environment
145
- const response = await fetch(
146
- `https://api.insforge.dev/ai/v1/limitations?credential=${encodeURIComponent(apiKey)}`,
147
- {
148
- method: 'GET',
149
- }
150
- );
151
-
152
- if (!response.ok) {
153
- throw new Error(`Failed to fetch key info: ${response.statusText}`);
154
- }
155
-
156
- const result = (await response.json()) as { data: OpenRouterLimitation };
157
- const keyInfo = result.data;
158
-
159
- return {
160
- usage: keyInfo.usage,
161
- limit: keyInfo.limit,
162
- remaining: keyInfo.limit_remaining,
163
- };
164
- } else {
165
- // Use OpenRouter API for local environment
166
- const response = await fetch('https://openrouter.ai/api/v1/key', {
167
- method: 'GET',
168
- headers: {
169
- Authorization: `Bearer ${apiKey}`,
170
- },
171
- });
172
-
173
- if (!response.ok) {
174
- throw new AppError(
175
- `Invalid OpenRouter API Key`,
176
- 500,
177
- ERROR_CODES.AI_INVALID_API_KEY,
178
- 'Check your OpenRouter key and try again.'
179
- );
180
- }
181
-
182
- const keyInfo = (await response.json()) as OpenRouterKeyInfo;
183
-
184
- return {
185
- usage: keyInfo.data.usage,
186
- limit: keyInfo.data.limit,
187
- remaining: keyInfo.data.limit !== null ? keyInfo.data.limit - keyInfo.data.usage : null,
188
- };
189
- }
190
- } catch (error) {
191
- console.error('Failed to fetch remaining credits:', error);
192
- throw error;
193
- }
194
- }
195
-
196
- /**
197
- * Fetch API key from cloud service
198
- */
199
- private async fetchCloudApiKey(): Promise<string> {
200
- try {
201
- const projectId = process.env.PROJECT_ID;
202
- if (!projectId) {
203
- throw new Error('PROJECT_ID not found in environment variables');
204
- }
205
-
206
- const jwtSecret = process.env.JWT_SECRET;
207
- if (!jwtSecret) {
208
- throw new Error('JWT_SECRET not found in environment variables');
209
- }
210
-
211
- // Sign a token for authentication
212
- const token = jwt.sign({ projectId }, jwtSecret, { expiresIn: '1h' });
213
-
214
- // Fetch API key from cloud service with sign token as query parameter
215
- const response = await fetch(
216
- `https://api.insforge.dev/ai/v1/credentials/${projectId}?sign=${token}`
217
- );
218
-
219
- if (!response.ok) {
220
- throw new Error(`Failed to fetch cloud API key: ${response.statusText}`);
221
- }
222
-
223
- const data = (await response.json()) as CloudCredentialsResponse;
224
-
225
- // Extract API key from the openrouter object in response
226
- if (!data.openrouter?.api_key) {
227
- throw new Error('Invalid response: missing openrouter API Key');
228
- }
229
-
230
- // Store credentials with metadata
231
- this.cloudCredentials = {
232
- apiKey: data.openrouter.api_key,
233
- limitRemaining: data.openrouter.limit_remaining,
234
- expiredAt: data.openrouter.expired_at ? new Date(data.openrouter.expired_at) : null,
235
- };
236
- return data.openrouter.api_key;
237
- } catch (error) {
238
- console.error('Failed to fetch cloud API key:', error);
239
- throw error;
240
- }
241
- }
242
- }
@@ -1,117 +0,0 @@
1
- import { isCloudEnvironment } from '@/utils/environment';
2
- import { AIClientService } from './client';
3
- import type { RawOpenRouterModel } from '@/types/ai';
4
- import type { OpenRouterModel } from '@insforge/shared-schemas';
5
-
6
- export interface ModelProviderInfo {
7
- provider: string;
8
- configured: boolean;
9
- models: OpenRouterModel[];
10
- }
11
-
12
- export interface ListModelsResponse {
13
- text: ModelProviderInfo[];
14
- image: ModelProviderInfo[];
15
- }
16
-
17
- export class AIModelService {
18
- /**
19
- * Get all available AI models
20
- * Fetches from cloud API if in cloud environment, otherwise from OpenRouter directly
21
- */
22
- static async getModels(): Promise<ListModelsResponse> {
23
- const credentialsService = AIClientService.getInstance();
24
- const configured = credentialsService.isConfigured();
25
-
26
- if (!configured) {
27
- return {
28
- text: [
29
- {
30
- provider: 'openrouter',
31
- configured: false,
32
- models: [],
33
- },
34
- ],
35
- image: [
36
- {
37
- provider: 'openrouter',
38
- configured: false,
39
- models: [],
40
- },
41
- ],
42
- };
43
- }
44
-
45
- // Get API key from credentials service
46
- const apiKey = await credentialsService.getApiKey();
47
-
48
- // Determine the API endpoint based on environment
49
- const apiUrl = isCloudEnvironment()
50
- ? 'https://api.insforge.dev/ai/v1/models'
51
- : 'https://openrouter.ai/api/v1/models/user';
52
-
53
- // Fetch models from the appropriate endpoint
54
- const response = await fetch(apiUrl, {
55
- headers: {
56
- Authorization: `Bearer ${apiKey}`,
57
- },
58
- });
59
-
60
- if (!response.ok) {
61
- throw new Error(`Failed to fetch models: ${response.statusText}`);
62
- }
63
-
64
- const data = (await response.json()) as { data: RawOpenRouterModel[] };
65
- const models = data.data || [];
66
-
67
- const textModels: OpenRouterModel[] = [];
68
- const imageModels: OpenRouterModel[] = [];
69
-
70
- for (const model of models) {
71
- // Classify based on output modality
72
- const transformedModel: OpenRouterModel = {
73
- ...model,
74
- architecture: model.architecture
75
- ? {
76
- inputModalities: model.architecture.input_modalities || [],
77
- outputModalities: model.architecture.output_modalities || [],
78
- tokenizer: model.architecture.tokenizer || '',
79
- instructType: model.architecture.instruct_type || '',
80
- }
81
- : undefined,
82
- topProvider: model.topProvider
83
- ? {
84
- isModerated: model.topProvider.is_moderated,
85
- contextLength: model.topProvider.context_length,
86
- maxCompletionTokens: model.topProvider.max_completion_tokens,
87
- }
88
- : undefined,
89
- };
90
-
91
- if (model.architecture?.output_modalities?.includes('image')) {
92
- imageModels.push(transformedModel);
93
- }
94
-
95
- if (model.architecture?.output_modalities?.includes('text')) {
96
- textModels.push(transformedModel);
97
- }
98
- }
99
-
100
- return {
101
- text: [
102
- {
103
- provider: 'openrouter',
104
- configured: true,
105
- models: textModels,
106
- },
107
- ],
108
- image: [
109
- {
110
- provider: 'openrouter',
111
- configured: true,
112
- models: imageModels,
113
- },
114
- ],
115
- };
116
- }
117
- }