insforge 1.2.10 → 1.4.8

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 (506) hide show
  1. package/.claude-plugin/marketplace.json +20 -20
  2. package/.dockerignore +60 -60
  3. package/.env.example +83 -77
  4. package/.github/ISSUE_TEMPLATE/bug_report.yml +36 -36
  5. package/.github/ISSUE_TEMPLATE/config.yml +11 -11
  6. package/.github/ISSUE_TEMPLATE/feature_request.yml +26 -26
  7. package/.github/PULL_REQUEST_TEMPLATE.md +7 -7
  8. package/.github/copilot-instructions.md +146 -146
  9. package/.github/workflows/build-image.yml +65 -65
  10. package/.github/workflows/ci-premerge-check.yml +23 -23
  11. package/.github/workflows/e2e.yml +63 -63
  12. package/.github/workflows/lint-and-format.yml +32 -32
  13. package/.prettierignore +64 -64
  14. package/CHANGELOG.md +46 -44
  15. package/CLAUDE_PLUGIN.md +104 -104
  16. package/CODE_OF_CONDUCT.md +128 -128
  17. package/CONTRIBUTING.md +125 -125
  18. package/Dockerfile +30 -30
  19. package/GITHUB_OAUTH_SETUP.md +49 -49
  20. package/GOOGLE_OAUTH_SETUP.md +148 -148
  21. package/LICENSE +201 -201
  22. package/README.md +182 -182
  23. package/assets/Dark.svg +23 -23
  24. package/auth/package.json +30 -28
  25. package/auth/src/lib/broadcastService.ts +4 -4
  26. package/auth/src/lib/insforge.ts +8 -0
  27. package/auth/src/main.tsx +2 -4
  28. package/auth/src/pages/SignInPage.tsx +5 -2
  29. package/auth/src/pages/SignUpPage.tsx +5 -2
  30. package/auth/src/pages/VerifyEmailPage.tsx +18 -0
  31. package/auth/tsconfig.json +33 -32
  32. package/auth/tsconfig.node.json +11 -11
  33. package/backend/package.json +82 -75
  34. package/backend/src/api/middlewares/rate-limiters.ts +127 -127
  35. package/backend/src/api/routes/ai/index.routes.ts +475 -468
  36. package/backend/src/api/routes/auth/index.routes.ts +720 -570
  37. package/backend/src/api/routes/auth/oauth.routes.ts +478 -448
  38. package/backend/src/api/routes/database/advance.routes.ts +37 -16
  39. package/backend/src/api/routes/database/index.routes.ts +80 -1
  40. package/backend/src/api/routes/database/records.routes.ts +48 -184
  41. package/backend/src/api/routes/database/rpc.routes.ts +69 -0
  42. package/backend/src/api/routes/database/tables.routes.ts +0 -14
  43. package/backend/src/api/routes/deployments/index.routes.ts +192 -0
  44. package/backend/src/api/routes/docs/index.routes.ts +76 -76
  45. package/backend/src/api/routes/email/index.routes.ts +35 -0
  46. package/backend/src/api/routes/functions/index.routes.ts +21 -15
  47. package/backend/src/api/routes/metadata/index.routes.ts +38 -0
  48. package/backend/src/api/routes/realtime/channels.routes.ts +81 -0
  49. package/backend/src/api/routes/realtime/index.routes.ts +12 -0
  50. package/backend/src/api/routes/realtime/messages.routes.ts +48 -0
  51. package/backend/src/api/routes/realtime/permissions.routes.ts +19 -0
  52. package/backend/src/api/routes/storage/index.routes.ts +18 -12
  53. package/backend/src/api/routes/usage/index.routes.ts +6 -4
  54. package/backend/src/api/routes/webhooks/index.routes.ts +109 -0
  55. package/backend/src/infra/database/database.manager.ts +14 -11
  56. package/backend/src/infra/database/migrations/000_create-base-tables.sql +141 -141
  57. package/backend/src/infra/database/migrations/001_create-helper-functions.sql +40 -40
  58. package/backend/src/infra/database/migrations/002_rename-auth-tables.sql +29 -29
  59. package/backend/src/infra/database/migrations/003_create-users-table.sql +55 -55
  60. package/backend/src/infra/database/migrations/004_add-reload-postgrest-func.sql +23 -23
  61. package/backend/src/infra/database/migrations/005_enable-project-admin-modify-users.sql +29 -29
  62. package/backend/src/infra/database/migrations/006_modify-ai-usage-table.sql +24 -24
  63. package/backend/src/infra/database/migrations/007_drop-metadata-table.sql +1 -1
  64. package/backend/src/infra/database/migrations/008_add-system-tables.sql +76 -76
  65. package/backend/src/infra/database/migrations/009_add-function-secrets.sql +23 -23
  66. package/backend/src/infra/database/migrations/010_modify-ai-config-modalities.sql +93 -93
  67. package/backend/src/infra/database/migrations/011_refactor-secrets-table.sql +15 -15
  68. package/backend/src/infra/database/migrations/012_add-storage-uploaded-by.sql +7 -7
  69. package/backend/src/infra/database/migrations/013_create-auth-schema-functions.sql +44 -44
  70. package/backend/src/infra/database/migrations/014_add-updated-at-trigger-user-table.sql +7 -7
  71. package/backend/src/infra/database/migrations/015_create-auth-config-and-email-otp-tables.sql +59 -59
  72. package/backend/src/infra/database/migrations/016_update-auth-config-and-email-otp.sql +24 -24
  73. package/backend/src/infra/database/migrations/017_create-realtime-schema.sql +233 -0
  74. package/backend/src/infra/database/migrations/018_schema-rework.sql +441 -0
  75. package/backend/src/infra/database/migrations/019_create-deployments-table.sql +36 -0
  76. package/backend/src/infra/database/migrations/020_add-audio-modality.sql +11 -0
  77. package/backend/src/infra/database/migrations/bootstrap/bootstrap-migrations.js +103 -0
  78. package/backend/src/infra/realtime/realtime.manager.ts +246 -0
  79. package/backend/src/infra/realtime/webhook-sender.ts +82 -0
  80. package/backend/src/infra/security/token.manager.ts +216 -125
  81. package/backend/src/infra/socket/socket.manager.ts +198 -64
  82. package/backend/src/providers/ai/openrouter.provider.ts +24 -12
  83. package/backend/src/providers/database/base.provider.ts +39 -0
  84. package/backend/src/providers/database/cloud.provider.ts +159 -0
  85. package/backend/src/providers/deployments/vercel.provider.ts +516 -0
  86. package/backend/src/providers/email/base.provider.ts +4 -7
  87. package/backend/src/providers/email/cloud.provider.ts +84 -0
  88. package/backend/src/providers/oauth/apple.provider.ts +266 -0
  89. package/backend/src/providers/oauth/index.ts +1 -0
  90. package/backend/src/server.ts +329 -284
  91. package/backend/src/services/ai/ai-config.service.ts +6 -6
  92. package/backend/src/services/ai/ai-model.service.ts +60 -60
  93. package/backend/src/services/ai/ai-usage.service.ts +7 -7
  94. package/backend/src/services/ai/chat-completion.service.ts +415 -220
  95. package/backend/src/services/ai/helpers.ts +64 -64
  96. package/backend/src/services/ai/image-generation.service.ts +3 -3
  97. package/backend/src/services/ai/index.ts +13 -13
  98. package/backend/src/services/auth/auth-config.service.ts +4 -4
  99. package/backend/src/services/auth/auth-otp.service.ts +6 -6
  100. package/backend/src/services/auth/auth.service.ts +148 -74
  101. package/backend/src/services/auth/index.ts +4 -4
  102. package/backend/src/services/auth/oauth-config.service.ts +12 -12
  103. package/backend/src/services/database/database-advance.service.ts +19 -55
  104. package/backend/src/services/database/database-table.service.ts +38 -94
  105. package/backend/src/services/database/database.service.ts +127 -0
  106. package/backend/src/services/database/postgrest-proxy.service.ts +165 -0
  107. package/backend/src/services/deployments/deployment.service.ts +693 -0
  108. package/backend/src/services/email/email.service.ts +5 -7
  109. package/backend/src/services/functions/function.service.ts +61 -41
  110. package/backend/src/services/logs/audit.service.ts +10 -10
  111. package/backend/src/services/realtime/index.ts +3 -0
  112. package/backend/src/services/realtime/realtime-auth.service.ts +104 -0
  113. package/backend/src/services/realtime/realtime-channel.service.ts +237 -0
  114. package/backend/src/services/realtime/realtime-message.service.ts +260 -0
  115. package/backend/src/services/secrets/secret.service.ts +101 -27
  116. package/backend/src/services/storage/storage.service.ts +30 -30
  117. package/backend/src/services/usage/usage.service.ts +6 -6
  118. package/backend/src/types/ai.ts +8 -0
  119. package/backend/src/types/auth.ts +16 -1
  120. package/backend/src/types/database.ts +2 -0
  121. package/backend/src/types/deployments.ts +33 -0
  122. package/backend/src/types/realtime.ts +18 -0
  123. package/backend/src/types/socket.ts +7 -31
  124. package/backend/src/types/storage.ts +1 -1
  125. package/backend/src/types/webhooks.ts +45 -0
  126. package/backend/src/utils/cookies.ts +34 -0
  127. package/backend/src/utils/environment.ts +0 -14
  128. package/backend/src/utils/s3-config-loader.ts +64 -0
  129. package/backend/src/utils/seed.ts +79 -43
  130. package/backend/src/utils/sql-parser.ts +216 -0
  131. package/backend/src/utils/utils.ts +114 -114
  132. package/backend/src/utils/validations.ts +10 -10
  133. package/backend/tests/README.md +133 -133
  134. package/backend/tests/cleanup-all-test-data.sh +230 -230
  135. package/backend/tests/cloud/test-s3-multitenant.sh +131 -131
  136. package/backend/tests/local/comprehensive-curl-tests.sh +155 -155
  137. package/backend/tests/local/test-ai-config.sh +129 -129
  138. package/backend/tests/local/test-ai-usage.sh +80 -80
  139. package/backend/tests/local/test-auth-router.sh +143 -143
  140. package/backend/tests/local/test-database-router.sh +222 -222
  141. package/backend/tests/local/test-e2e.sh +240 -240
  142. package/backend/tests/local/test-fk-errors.sh +96 -96
  143. package/backend/tests/local/test-functions.sh +123 -123
  144. package/backend/tests/local/test-id-field.sh +200 -200
  145. package/backend/tests/local/test-logs.sh +132 -132
  146. package/backend/tests/local/test-public-bucket.sh +264 -264
  147. package/backend/tests/local/test-rpc.sh +141 -0
  148. package/backend/tests/local/test-secrets.sh +249 -249
  149. package/backend/tests/local/test-serverless-functions.sh.disabled +325 -325
  150. package/backend/tests/local/test-traditional-rest.sh +208 -208
  151. package/backend/tests/manual/README.md +50 -50
  152. package/backend/tests/manual/create-large-table-simple.sql +10 -10
  153. package/backend/tests/manual/seed-large-table.sql +100 -100
  154. package/backend/tests/manual/setup-large-table-extras.sql +33 -33
  155. package/backend/tests/manual/test-ai-model-plugins.sh +258 -0
  156. package/backend/tests/manual/test-bulk-upsert.sh +409 -409
  157. package/backend/tests/manual/test-database-advance.sh +296 -296
  158. package/backend/tests/manual/test-postgrest-stability.sh +191 -191
  159. package/backend/tests/manual/test-rawsql-export-import.sh +411 -411
  160. package/backend/tests/manual/test-rawsql-modes.sh +244 -244
  161. package/backend/tests/manual/test-universal-storage.sh +263 -263
  162. package/backend/tests/manual/test-users.sql +17 -17
  163. package/backend/tests/run-all-tests.sh +139 -139
  164. package/backend/tests/setup.ts +0 -0
  165. package/backend/tests/test-config.sh +338 -338
  166. package/backend/tests/unit/analyze-query.test.ts +697 -0
  167. package/backend/tests/unit/database-advance.test.ts +326 -0
  168. package/backend/tests/unit/helpers.test.ts +2 -2
  169. package/backend/tsconfig.json +22 -22
  170. package/claude-plugin/.claude-plugin/plugin.json +24 -24
  171. package/claude-plugin/README.md +133 -133
  172. package/claude-plugin/skills/insforge-schema-patterns/SKILL.md +273 -270
  173. package/docker-compose.prod.yml +204 -200
  174. package/docker-compose.yml +232 -228
  175. package/docker-init/db/db-init.sql +97 -97
  176. package/docker-init/db/jwt.sql +5 -5
  177. package/docker-init/db/postgresql.conf +16 -16
  178. package/docker-init/logs/vector.yml +236 -236
  179. package/docs/README.md +44 -44
  180. package/docs/agent-docs/deployment.md +79 -0
  181. package/docs/agent-docs/real-time.md +269 -0
  182. package/docs/changelog.mdx +212 -67
  183. package/docs/core-concepts/ai/architecture.mdx +350 -372
  184. package/docs/core-concepts/ai/sdk.mdx +238 -213
  185. package/docs/core-concepts/authentication/architecture.mdx +276 -278
  186. package/docs/core-concepts/authentication/sdk.mdx +710 -414
  187. package/docs/core-concepts/authentication/ui-components/customization.mdx +733 -529
  188. package/docs/core-concepts/authentication/ui-components/nextjs.mdx +247 -221
  189. package/docs/core-concepts/authentication/ui-components/react-router.mdx +183 -184
  190. package/docs/core-concepts/authentication/ui-components/react.mdx +136 -129
  191. package/docs/core-concepts/database/architecture.mdx +292 -255
  192. package/docs/core-concepts/database/pgvector.mdx +138 -0
  193. package/docs/core-concepts/database/sdk.mdx +382 -382
  194. package/docs/core-concepts/deployments/architecture.mdx +152 -0
  195. package/docs/core-concepts/email/architecture.mdx +103 -0
  196. package/docs/core-concepts/email/sdk.mdx +53 -0
  197. package/docs/core-concepts/functions/architecture.mdx +105 -105
  198. package/docs/core-concepts/functions/sdk.mdx +183 -184
  199. package/docs/core-concepts/realtime/architecture.mdx +446 -0
  200. package/docs/core-concepts/realtime/sdk.mdx +409 -0
  201. package/docs/core-concepts/storage/architecture.mdx +243 -243
  202. package/docs/core-concepts/storage/sdk.mdx +253 -253
  203. package/docs/deployment/README.md +94 -94
  204. package/docs/deployment/deploy-to-aws-ec2.md +564 -564
  205. package/docs/deployment/deploy-to-azure-virtual-machines.md +312 -312
  206. package/docs/deployment/deploy-to-google-cloud-compute-engine.md +613 -613
  207. package/docs/deployment/deploy-to-render.md +441 -441
  208. package/docs/deprecated/insforge-auth-api.md +214 -214
  209. package/docs/deprecated/insforge-auth-sdk.md +99 -99
  210. package/docs/deprecated/insforge-db-api.md +358 -358
  211. package/docs/deprecated/insforge-db-sdk.md +139 -139
  212. package/docs/deprecated/insforge-debug-sdk.md +156 -156
  213. package/docs/deprecated/insforge-debug.md +64 -64
  214. package/docs/deprecated/insforge-instructions.md +123 -123
  215. package/docs/deprecated/insforge-project.md +117 -117
  216. package/docs/deprecated/insforge-storage-api.md +278 -278
  217. package/docs/deprecated/insforge-storage-sdk.md +158 -158
  218. package/docs/docs.json +240 -210
  219. package/docs/examples/framework-guides/nextjs.mdx +131 -131
  220. package/docs/examples/framework-guides/nuxt.mdx +165 -165
  221. package/docs/examples/framework-guides/react.mdx +165 -165
  222. package/docs/examples/framework-guides/svelte.mdx +153 -153
  223. package/docs/examples/framework-guides/vue.mdx +159 -159
  224. package/docs/examples/overview.mdx +67 -67
  225. package/docs/favicon.png +0 -0
  226. package/docs/favicon.svg +4 -19
  227. package/docs/images/changelog/dec-2025/ai-integration.png +0 -0
  228. package/docs/images/changelog/dec-2025/ai-models.webp +0 -0
  229. package/docs/images/changelog/dec-2025/alipay-payment.webp +0 -0
  230. package/docs/images/changelog/dec-2025/apple-login.jpg +0 -0
  231. package/docs/images/changelog/dec-2025/apple-oauth.mp4 +0 -0
  232. package/docs/images/changelog/dec-2025/mcp-installer.png +0 -0
  233. package/docs/images/changelog/dec-2025/moreModels.png +0 -0
  234. package/docs/images/changelog/dec-2025/multi-region.webp +0 -0
  235. package/docs/images/changelog/dec-2025/postgres-connection.webp +0 -0
  236. package/docs/images/changelog/dec-2025/realtime-module.jpg +0 -0
  237. package/docs/images/changelog/dec-2025/realtime2.png +0 -0
  238. package/docs/images/icons/ai.svg +4 -4
  239. package/docs/images/logos/nextjs.svg +4 -4
  240. package/docs/images/logos/nuxt.svg +4 -4
  241. package/docs/images/logos/react.svg +5 -5
  242. package/docs/images/logos/svelte.svg +4 -4
  243. package/docs/images/logos/vue.svg +5 -5
  244. package/docs/images/mcp-setup/CC-MCP-1.mp4 +0 -0
  245. package/docs/images/mcp-setup/CC-MCP-2.mp4 +0 -0
  246. package/docs/images/mcp-setup/Cursor-MCP-1.mp4 +0 -0
  247. package/docs/images/mcp-setup/Cursor-MCP-2.mp4 +0 -0
  248. package/docs/images/mcp-setup/Cursor-MCP-3.mp4 +0 -0
  249. package/docs/images/mcp-setup/claude-code-connect.png +0 -0
  250. package/docs/images/mcp-setup/cline-1.png +0 -0
  251. package/docs/images/mcp-setup/cline-2.png +0 -0
  252. package/docs/images/mcp-setup/cline-3.png +0 -0
  253. package/docs/images/mcp-setup/connect-project.png +0 -0
  254. package/docs/images/mcp-setup/copilot-1.png +0 -0
  255. package/docs/images/mcp-setup/copilot-2.png +0 -0
  256. package/docs/images/mcp-setup/copilot-3.png +0 -0
  257. package/docs/images/mcp-setup/mcp-json-1.png +0 -0
  258. package/docs/images/mcp-setup/mcp-json-2.png +0 -0
  259. package/docs/images/mcp-setup/qoder-1.png +0 -0
  260. package/docs/images/mcp-setup/qoder-2.png +0 -0
  261. package/docs/images/mcp-setup/roocode-1.png +0 -0
  262. package/docs/images/mcp-setup/roocode-2.png +0 -0
  263. package/docs/images/mcp-setup/trae-1.png +0 -0
  264. package/docs/images/mcp-setup/trae-2.png +0 -0
  265. package/docs/images/mcp-setup/trae-3.png +0 -0
  266. package/docs/images/mcp-setup/trae-4.png +0 -0
  267. package/docs/images/mcp-setup/trae-5.png +0 -0
  268. package/docs/images/mcp-setup/windsurf-1.png +0 -0
  269. package/docs/images/mcp-setup/windsurf-2.png +0 -0
  270. package/docs/insforge-instructions-sdk.md +93 -88
  271. package/docs/introduction.mdx +46 -45
  272. package/docs/logo/dark.svg +22 -22
  273. package/docs/logo/light.svg +20 -20
  274. package/docs/mcp-setup.mdx +332 -0
  275. package/docs/oauth-server.mdx +563 -0
  276. package/docs/partnership.mdx +720 -646
  277. package/docs/quickstart.mdx +82 -82
  278. package/docs/showcase.mdx +52 -52
  279. package/docs/snippets/sdk-installation.mdx +21 -21
  280. package/docs/snippets/service-icons.mdx +27 -27
  281. package/docs/vscode-extension.mdx +74 -0
  282. package/eslint.config.js +1 -0
  283. package/examples/oauth/frontend-oauth-example.html +250 -250
  284. package/examples/response-examples.md +443 -443
  285. package/frontend/components.json +17 -17
  286. package/frontend/package.json +69 -69
  287. package/frontend/src/App.tsx +8 -3
  288. package/frontend/src/assets/icons/checkbox_checked.svg +6 -6
  289. package/frontend/src/assets/icons/checkbox_undetermined.svg +6 -6
  290. package/frontend/src/assets/icons/checked.svg +3 -3
  291. package/frontend/src/assets/icons/connected.svg +3 -3
  292. package/frontend/src/assets/icons/error.svg +3 -3
  293. package/frontend/src/assets/icons/loader.svg +9 -9
  294. package/frontend/src/assets/icons/pencil.svg +4 -4
  295. package/frontend/src/assets/icons/refresh.svg +4 -4
  296. package/frontend/src/assets/icons/step_active.svg +3 -3
  297. package/frontend/src/assets/icons/step_inactive.svg +11 -11
  298. package/frontend/src/assets/icons/warning.svg +3 -3
  299. package/frontend/src/assets/logos/antigravity.svg +1 -0
  300. package/frontend/src/assets/logos/apple.svg +3 -3
  301. package/frontend/src/assets/logos/claude_code.svg +3 -3
  302. package/frontend/src/assets/logos/cline.svg +6 -6
  303. package/frontend/src/assets/logos/copilot.svg +10 -0
  304. package/frontend/src/assets/logos/cursor.svg +20 -20
  305. package/frontend/src/assets/logos/deepseek.svg +139 -0
  306. package/frontend/src/assets/logos/discord.svg +8 -8
  307. package/frontend/src/assets/logos/facebook.svg +3 -3
  308. package/frontend/src/assets/logos/gemini.svg +19 -19
  309. package/frontend/src/assets/logos/github.svg +5 -5
  310. package/frontend/src/assets/logos/google.svg +13 -13
  311. package/frontend/src/assets/logos/grok.svg +10 -10
  312. package/frontend/src/assets/logos/insforge_dark.svg +15 -15
  313. package/frontend/src/assets/logos/insforge_light.svg +15 -15
  314. package/frontend/src/assets/logos/instagram.svg +1 -1
  315. package/frontend/src/assets/logos/kiro.svg +9 -0
  316. package/frontend/src/assets/logos/linkedin.svg +3 -3
  317. package/frontend/src/assets/logos/openai.svg +10 -10
  318. package/frontend/src/assets/logos/qoder.svg +4 -0
  319. package/frontend/src/assets/logos/qwen.svg +15 -0
  320. package/frontend/src/assets/logos/roo_code.svg +9 -9
  321. package/frontend/src/assets/logos/spotify.svg +16 -16
  322. package/frontend/src/assets/logos/tiktok.svg +5 -5
  323. package/frontend/src/assets/logos/trae.svg +3 -3
  324. package/frontend/src/assets/logos/windsurf.svg +10 -10
  325. package/frontend/src/assets/logos/x.svg +3 -3
  326. package/frontend/src/components/CodeBlock.tsx +2 -2
  327. package/frontend/src/components/ConnectCTA.tsx +3 -2
  328. package/frontend/src/components/datagrid/DataGrid.tsx +90 -62
  329. package/frontend/src/components/datagrid/datagridTypes.tsx +2 -1
  330. package/frontend/src/components/datagrid/index.ts +1 -1
  331. package/frontend/src/components/index.ts +0 -1
  332. package/frontend/src/components/layout/AppHeader.tsx +13 -37
  333. package/frontend/src/components/layout/AppSidebar.tsx +85 -100
  334. package/frontend/src/components/layout/Layout.tsx +34 -32
  335. package/frontend/src/components/layout/PrimaryMenu.tsx +12 -4
  336. package/frontend/src/components/radix/Select.tsx +151 -151
  337. package/frontend/src/features/ai/components/AIConfigCard.tsx +200 -200
  338. package/frontend/src/features/ai/components/AIEmptyState.tsx +23 -23
  339. package/frontend/src/features/ai/components/ModalityFilterSidebar.tsx +102 -101
  340. package/frontend/src/features/ai/components/ModelSelectionDialog.tsx +135 -135
  341. package/frontend/src/features/ai/components/ModelSelectionGrid.tsx +51 -51
  342. package/frontend/src/features/ai/components/SystemPromptDialog.tsx +118 -118
  343. package/frontend/src/features/ai/components/index.ts +6 -6
  344. package/frontend/src/features/ai/helpers.ts +147 -141
  345. package/frontend/src/features/ai/{page → pages}/AIPage.tsx +166 -166
  346. package/frontend/src/features/auth/components/AuthPreview.tsx +96 -96
  347. package/frontend/src/features/auth/components/OAuthConfigDialog.tsx +1 -0
  348. package/frontend/src/features/auth/components/UsersDataGrid.tsx +61 -31
  349. package/frontend/src/features/auth/components/index.ts +5 -5
  350. package/frontend/src/features/auth/helpers.tsx +8 -0
  351. package/frontend/src/features/auth/{page → pages}/AuthMethodsPage.tsx +275 -275
  352. package/frontend/src/features/auth/{page → pages}/UsersPage.tsx +0 -28
  353. package/frontend/src/features/dashboard/{page → pages}/DashboardPage.tsx +1 -1
  354. package/frontend/src/features/database/components/DatabaseDataGrid.tsx +0 -2
  355. package/frontend/src/features/database/components/ForeignKeyCell.tsx +38 -11
  356. package/frontend/src/features/database/components/ForeignKeyPopover.tsx +18 -8
  357. package/frontend/src/features/database/components/LinkRecordModal.tsx +61 -13
  358. package/frontend/src/features/database/components/RecordFormField.tsx +1 -1
  359. package/frontend/src/features/database/components/SQLModal.tsx +75 -0
  360. package/frontend/src/features/database/components/TableForm.tsx +0 -4
  361. package/frontend/src/features/database/components/TableSidebar.tsx +0 -3
  362. package/frontend/src/features/database/components/TablesEmptyState.tsx +1 -1
  363. package/frontend/src/features/database/components/TemplatePreview.tsx +1 -2
  364. package/frontend/src/features/database/constants.ts +16 -28
  365. package/frontend/src/features/database/hooks/useCSVImport.ts +3 -2
  366. package/frontend/src/features/database/hooks/useDatabase.ts +66 -0
  367. package/frontend/src/features/database/hooks/useRawSQL.ts +3 -2
  368. package/frontend/src/features/database/hooks/useTables.ts +30 -28
  369. package/frontend/src/features/database/index.ts +1 -0
  370. package/frontend/src/features/database/{page → pages}/FunctionsPage.tsx +29 -42
  371. package/frontend/src/features/database/{page → pages}/IndexesPage.tsx +34 -51
  372. package/frontend/src/features/database/{page → pages}/PoliciesPage.tsx +42 -58
  373. package/frontend/src/features/database/{page → pages}/SQLEditorPage.tsx +2 -2
  374. package/frontend/src/features/database/{page → pages}/TablesPage.tsx +0 -42
  375. package/frontend/src/features/database/{page → pages}/TriggersPage.tsx +34 -51
  376. package/frontend/src/features/database/services/advance.service.ts +1 -41
  377. package/frontend/src/features/database/services/database.service.ts +55 -0
  378. package/frontend/src/features/database/services/record.service.ts +4 -20
  379. package/frontend/src/features/database/services/table.service.ts +1 -10
  380. package/frontend/src/features/database/templates/ai-chatbot.ts +6 -6
  381. package/frontend/src/features/database/templates/ecommerce-platform.ts +2 -2
  382. package/frontend/src/features/database/templates/instagram-clone.ts +10 -10
  383. package/frontend/src/features/database/templates/notion-clone.ts +8 -8
  384. package/frontend/src/features/database/templates/reddit-clone.ts +10 -10
  385. package/frontend/src/features/deployments/components/DeploymentRow.tsx +93 -0
  386. package/frontend/src/features/deployments/components/DeploymentsEmptyState.tsx +15 -0
  387. package/frontend/src/features/deployments/hooks/useDeployments.ts +157 -0
  388. package/frontend/src/features/deployments/pages/DeploymentsPage.tsx +318 -0
  389. package/frontend/src/features/deployments/services/deployments.service.ts +63 -0
  390. package/frontend/src/features/functions/components/FunctionRow.tsx +72 -72
  391. package/frontend/src/features/functions/components/FunctionsSidebar.tsx +56 -56
  392. package/frontend/src/features/functions/components/SecretRow.tsx +3 -3
  393. package/frontend/src/features/functions/components/index.ts +5 -5
  394. package/frontend/src/features/functions/hooks/useFunctions.ts +5 -4
  395. package/frontend/src/features/functions/hooks/useSecrets.ts +6 -9
  396. package/frontend/src/features/functions/{page → pages}/FunctionsPage.tsx +21 -44
  397. package/frontend/src/features/functions/{page → pages}/SecretsPage.tsx +118 -116
  398. package/frontend/src/features/functions/services/function.service.ts +8 -25
  399. package/frontend/src/features/functions/services/secret.service.ts +23 -41
  400. package/frontend/src/features/login/{page → pages}/CloudLoginPage.tsx +125 -118
  401. package/frontend/src/features/logs/components/LogDetailPanel.tsx +41 -0
  402. package/frontend/src/features/logs/components/LogsDataGrid.tsx +32 -1
  403. package/frontend/src/features/logs/components/index.ts +1 -0
  404. package/frontend/src/features/logs/hooks/useMcpUsage.ts +13 -66
  405. package/frontend/src/features/logs/{page → pages}/LogsPage.tsx +36 -6
  406. package/frontend/src/features/onboard/components/ApiCredentialsSection.tsx +59 -0
  407. package/frontend/src/features/onboard/components/ConnectionStringSection.tsx +180 -0
  408. package/frontend/src/features/onboard/components/McpConnectionSection.tsx +159 -0
  409. package/frontend/src/features/onboard/components/OnboardingController.tsx +68 -0
  410. package/frontend/src/features/onboard/components/OnboardingModal.tsx +121 -267
  411. package/frontend/src/features/onboard/components/ShowPasswordButton.tsx +21 -0
  412. package/frontend/src/features/onboard/components/index.ts +9 -4
  413. package/frontend/src/features/onboard/components/mcp/CursorDeeplinkGenerator.tsx +1 -1
  414. package/frontend/src/features/onboard/components/mcp/QoderDeeplinkGenerator.tsx +36 -0
  415. package/frontend/src/features/onboard/components/mcp/helpers.tsx +123 -98
  416. package/frontend/src/features/onboard/components/mcp/index.ts +4 -3
  417. package/frontend/src/features/onboard/index.ts +17 -13
  418. package/frontend/src/features/realtime/components/ChannelRow.tsx +83 -0
  419. package/frontend/src/features/realtime/components/EditChannelModal.tsx +246 -0
  420. package/frontend/src/features/realtime/components/MessageRow.tsx +85 -0
  421. package/frontend/src/features/realtime/components/RealtimeEmptyState.tsx +30 -0
  422. package/frontend/src/features/realtime/hooks/useRealtime.ts +218 -0
  423. package/frontend/src/features/realtime/index.ts +11 -0
  424. package/frontend/src/features/realtime/pages/RealtimeChannelsPage.tsx +172 -0
  425. package/frontend/src/features/realtime/pages/RealtimeMessagesPage.tsx +211 -0
  426. package/frontend/src/features/realtime/pages/RealtimePermissionsPage.tsx +191 -0
  427. package/frontend/src/features/realtime/services/realtime.service.ts +107 -0
  428. package/frontend/src/features/settings/pages/SettingsPage.tsx +349 -0
  429. package/frontend/src/features/storage/{page → pages}/StoragePage.tsx +1 -29
  430. package/frontend/src/features/visualizer/components/AuthNode.tsx +4 -4
  431. package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +24 -11
  432. package/frontend/src/features/visualizer/{page → pages}/VisualizerPage.tsx +11 -36
  433. package/frontend/src/index.css +249 -249
  434. package/frontend/src/lib/contexts/ModalContext.tsx +35 -0
  435. package/frontend/src/lib/contexts/SocketContext.tsx +119 -75
  436. package/frontend/src/lib/hooks/useMetadata.ts +45 -1
  437. package/frontend/src/lib/hooks/useModal.tsx +2 -0
  438. package/frontend/src/lib/routing/AppRoutes.tsx +103 -84
  439. package/frontend/src/lib/services/metadata.service.ts +20 -3
  440. package/frontend/src/lib/utils/cloudMessaging.ts +1 -1
  441. package/frontend/src/lib/utils/menuItems.ts +223 -183
  442. package/frontend/src/lib/utils/utils.ts +196 -183
  443. package/frontend/tsconfig.json +25 -25
  444. package/frontend/tsconfig.node.json +9 -9
  445. package/functions/deno.json +24 -24
  446. package/functions/server.ts +6 -6
  447. package/functions/worker-template.js +1 -1
  448. package/i18n/README.ar.md +130 -130
  449. package/i18n/README.de.md +130 -130
  450. package/i18n/README.es.md +154 -154
  451. package/i18n/README.fr.md +134 -134
  452. package/i18n/README.hi.md +129 -129
  453. package/i18n/README.ja.md +174 -174
  454. package/i18n/README.ko.md +136 -136
  455. package/i18n/README.pt-BR.md +131 -131
  456. package/i18n/README.ru.md +129 -129
  457. package/i18n/README.zh-CN.md +133 -133
  458. package/openapi/ai.yaml +825 -715
  459. package/openapi/auth.yaml +1324 -1244
  460. package/openapi/email.yaml +158 -0
  461. package/openapi/functions.yaml +475 -475
  462. package/openapi/health.yaml +29 -29
  463. package/openapi/logs.yaml +221 -223
  464. package/openapi/metadata.yaml +175 -177
  465. package/openapi/realtime.yaml +699 -0
  466. package/openapi/records.yaml +381 -381
  467. package/openapi/secrets.yaml +370 -370
  468. package/openapi/storage.yaml +875 -875
  469. package/openapi/tables.yaml +462 -463
  470. package/package.json +97 -97
  471. package/shared-schemas/package.json +31 -31
  472. package/shared-schemas/src/ai-api.schema.ts +251 -143
  473. package/shared-schemas/src/ai.schema.ts +8 -4
  474. package/shared-schemas/src/auth-api.schema.ts +380 -339
  475. package/shared-schemas/src/auth.schema.ts +18 -11
  476. package/shared-schemas/src/cloud-events.schema.ts +26 -0
  477. package/shared-schemas/src/database-api.schema.ts +32 -1
  478. package/shared-schemas/src/database.schema.ts +39 -0
  479. package/shared-schemas/src/deployments-api.schema.ts +55 -0
  480. package/shared-schemas/src/deployments.schema.ts +30 -0
  481. package/shared-schemas/src/docs.schema.ts +32 -0
  482. package/shared-schemas/src/email-api.schema.ts +30 -0
  483. package/shared-schemas/src/functions-api.schema.ts +13 -4
  484. package/shared-schemas/src/functions.schema.ts +1 -1
  485. package/shared-schemas/src/index.ts +22 -14
  486. package/shared-schemas/src/metadata.schema.ts +39 -4
  487. package/shared-schemas/src/realtime-api.schema.ts +111 -0
  488. package/shared-schemas/src/realtime.schema.ts +143 -0
  489. package/shared-schemas/src/secrets-api.schema.ts +44 -0
  490. package/shared-schemas/src/secrets.schema.ts +15 -0
  491. package/shared-schemas/tsconfig.json +21 -21
  492. package/tsconfig.json +7 -7
  493. package/zeabur/README.md +26 -13
  494. package/zeabur/template.yml +1001 -1032
  495. package/.cursor/rules/cursor-rules.mdc +0 -94
  496. package/backend/src/types/profile.ts +0 -55
  497. package/frontend/src/components/ProjectInfoModal.tsx +0 -128
  498. package/frontend/src/features/database/hooks/useFullMetadata.ts +0 -18
  499. package/test-gemini.sh +0 -35
  500. package/test-usage-admin.sh +0 -57
  501. package/test-usage.sh +0 -50
  502. /package/frontend/src/features/auth/{page → pages}/ConfigurationPage.tsx +0 -0
  503. /package/frontend/src/features/database/{page → pages}/TemplatesPage.tsx +0 -0
  504. /package/frontend/src/features/login/{page → pages}/LoginPage.tsx +0 -0
  505. /package/frontend/src/features/logs/{page → pages}/AuditsPage.tsx +0 -0
  506. /package/frontend/src/features/logs/{page → pages}/MCPLogsPage.tsx +0 -0
@@ -1,373 +1,351 @@
1
- ---
2
- title: Architecture
3
- description: OpenRouter integration for chat completions and image generation
4
- ---
5
-
6
- ## Overview
7
-
8
- InsForge provides unified AI capabilities through OpenRouter, giving you access to multiple LLM providers with a single API and consistent pricing model.
9
-
10
- ## Technology Stack
11
-
12
- ```mermaid
13
- graph TB
14
- Client[Client Application] --> SDK[InsForge SDK]
15
- SDK --> AIAPI[AI API]
16
-
17
- AIAPI --> OpenRouter[OpenRouter API]
18
- AIAPI --> DB[(PostgreSQL)]
19
-
20
- OpenRouter --> Anthropic[Anthropic<br/>Claude Models]
21
- OpenRouter --> OpenAI[OpenAI<br/>GPT Models]
22
- OpenRouter --> Google[Google<br/>Gemini]
23
-
24
- DB --> Config[AI Configurations]
25
- DB --> Usage[Usage Tracking]
26
-
27
- AIAPI --> Stream[SSE Streaming]
28
-
29
- style Client fill:#1e293b,stroke:#475569,color:#e2e8f0
30
- style SDK fill:#1e40af,stroke:#3b82f6,color:#dbeafe
31
- style AIAPI fill:#166534,stroke:#22c55e,color:#dcfce7
32
- style OpenRouter fill:#c2410c,stroke:#fb923c,color:#fed7aa
33
- style DB fill:#0e7490,stroke:#06b6d4,color:#cffafe
34
- style Anthropic fill:#6b21a8,stroke:#a855f7,color:#f3e8ff
35
- style OpenAI fill:#be185d,stroke:#ec4899,color:#fce7f3
36
- style Google fill:#a16207,stroke:#facc15,color:#fef3c7
37
- style Config fill:#0e7490,stroke:#22d3ee,color:#cffafe
38
- style Usage fill:#0e7490,stroke:#22d3ee,color:#cffafe
39
- style Stream fill:#166534,stroke:#4ade80,color:#dcfce7
40
- ```
41
-
42
- ## Core Components
43
-
44
- | Component | Technology | Purpose |
45
- |-----------|------------|---------|
46
- | **AI Gateway** | OpenRouter | Unified access to multiple AI providers |
47
- | **Chat Service** | Node.js + SSE | Handle chat completions with streaming |
48
- | **Image Service** | Async processing | Generate images via AI models |
49
- | **Configuration** | PostgreSQL | Store system prompts per project |
50
- | **Usage Tracking** | PostgreSQL | Monitor token usage |
51
- | **Response Format** | JSON/SSE | Standard and streaming responses |
52
-
53
- ## OpenRouter Integration
54
-
55
- ### Why OpenRouter?
56
-
57
- - **Single API**: One integration for multiple providers
58
- - **Unified Billing**: Consistent pricing across models
59
- - **Automatic Failover**: Fallback to alternative models
60
- - **Rate Limiting**: Built-in rate limit handling
61
-
62
- ### Request Flow
63
-
64
- ```mermaid
65
- sequenceDiagram
66
- participant Client
67
- participant InsForge
68
- participant OpenRouter
69
- participant Provider
70
-
71
- Client->>InsForge: Chat/Image Request
72
- InsForge->>InsForge: Add system prompt
73
- InsForge->>OpenRouter: Forward with API key
74
- OpenRouter->>Provider: Route to model
75
- Provider-->>OpenRouter: Model response
76
- OpenRouter-->>InsForge: Unified response
77
- InsForge->>InsForge: Track usage
78
- InsForge-->>Client: Formatted response
79
- ```
80
-
81
- ## Available Models
82
-
83
- ### Chat Models
84
-
85
- | Provider | Model | ID | Best For |
86
- |----------|-------|----|---------|
87
- | **Anthropic** | Claude Sonnet 4 | `anthropic/claude-sonnet-4` | Complex reasoning |
88
- | **Anthropic** | Claude 3.5 Haiku | `anthropic/claude-3.5-haiku` | Fast responses |
89
- | **Anthropic** | Claude Opus 4.1 | `anthropic/claude-opus-4.1` | Highest quality |
90
- | **OpenAI** | GPT-5 | `openai/gpt-5` | Most advanced |
91
- | **OpenAI** | GPT-5 Mini | `openai/gpt-5-mini` | Fast & efficient |
92
- | **OpenAI** | GPT-4o | `openai/gpt-4o` | General purpose |
93
- | **Google** | Gemini 2.5 Pro | `google/gemini-2.5-pro` | Advanced reasoning |
94
- | **xAI** | Grok 4 | `x-ai/grok-4` | Advanced reasoning |
95
-
96
- ### Image Models
97
-
98
- | Provider | Model | ID | Capabilities |
99
- |----------|-------|----|--------------|
100
- | **Google** | Gemini 2.5 Flash Image | `google/gemini-2.5-flash-image-preview` | Text-to-image generation |
101
- | **Google** | Gemini 3 Pro Image | `google/gemini-3-pro-image-preview` | Advanced text-to-image generation |
102
-
103
- ## Chat Completions
104
-
105
- ### Request Processing
106
-
107
- 1. **Authentication**: Verify JWT token
108
- 2. **Configuration**: Load project AI settings
109
- 3. **System Prompt**: Prepend configured prompt
110
- 4. **Model Selection**: Use specified or default model
111
- 5. **OpenRouter Call**: Forward to OpenRouter
112
- 6. **Response Handling**: Stream or batch response
113
- 7. **Usage Tracking**: Record token usage
114
-
115
- ### Streaming Architecture
116
-
117
- ```javascript
118
- // Server-Sent Events (SSE) for streaming
119
- async function* streamChat(messages, options) {
120
- const stream = await openRouter.chat.completions.create({
121
- model: options.model,
122
- messages: messages,
123
- stream: true,
124
- temperature: options.temperature,
125
- max_tokens: options.maxTokens
126
- });
127
-
128
- for await (const chunk of stream) {
129
- if (chunk.choices[0]?.delta?.content) {
130
- yield { chunk: chunk.choices[0].delta.content };
131
- }
132
- }
133
-
134
- yield { done: true, tokenUsage: {...} };
135
- }
136
- ```
137
-
138
- ### Response Formats
139
-
140
- **Non-streaming Response:**
141
- ```json
142
- {
143
- "response": "AI generated response text",
144
- "model": "anthropic/claude-3.5-haiku",
145
- "usage": {
146
- "promptTokens": 150,
147
- "completionTokens": 200,
148
- "totalTokens": 350
149
- }
150
- }
151
- ```
152
-
153
- **Streaming Response (SSE):**
154
- ```
155
- data: {"chunk": "The "}
156
- data: {"chunk": "answer "}
157
- data: {"chunk": "is..."}
158
- data: {"done": true, "tokenUsage": {...}}
159
- ```
160
-
161
- ## Image Generation
162
-
163
- ### Generation Flow
164
-
165
- 1. **Prompt Processing**: Validate and enhance prompt
166
- 2. **Model Selection**: Choose appropriate image model
167
- 3. **Size Configuration**: Set dimensions and quality
168
- 4. **OpenRouter Request**: Send generation request
169
- 5. **URL Generation**: Receive image URLs
170
- 6. **Storage Integration**: Optional save to storage
171
- 7. **Response Delivery**: Return URLs to client
172
-
173
- ### Image Parameters
174
-
175
- | Parameter | Options | Description |
176
- |-----------|---------|-------------|
177
- | `model` | Model IDs | AI model to use |
178
- | `prompt` | String | Text description |
179
- | `size` | `512x512`, `1024x1024`, etc. | Image dimensions |
180
- | `quality` | `standard`, `hd` | Image quality |
181
- | `numImages` | 1-4 | Number of variations |
182
- | `style` | `vivid`, `natural` | Style preference |
183
-
184
- ## Configuration Management
185
-
186
- ### Database Schema
187
-
188
- ```sql
189
- CREATE TABLE _ai_configs (
190
- id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
191
- modality VARCHAR(255) NOT NULL, -- 'text' or 'image'
192
- provider VARCHAR(255) NOT NULL, -- 'openrouter'
193
- model_id VARCHAR(255) UNIQUE NOT NULL,
194
- system_prompt TEXT,
195
- created_at TIMESTAMPTZ DEFAULT NOW(),
196
- updated_at TIMESTAMPTZ DEFAULT NOW()
197
- );
198
- ```
199
-
200
- ### System Prompts
201
-
202
- - Configured per project
203
- - Applied to all chat requests
204
- - Cannot be overridden by client
205
- - Support for multiple configurations
206
-
207
- ## Usage Tracking
208
-
209
- ### Metrics Collected
210
-
211
- ```sql
212
- CREATE TABLE _ai_usage (
213
- id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
214
- config_id UUID NOT NULL,
215
- input_tokens INT,
216
- output_tokens INT,
217
- image_count INT,
218
- image_resolution TEXT,
219
- created_at TIMESTAMPTZ DEFAULT NOW(),
220
- FOREIGN KEY (config_id) REFERENCES _ai_configs(id) ON DELETE NO ACTION
221
- );
222
- ```
223
-
224
- ## Security & Rate Limiting
225
-
226
- <CardGroup cols={2}>
227
- <Card title="API Key Security" icon="key">
228
- OpenRouter key stored server-side only
229
- </Card>
230
-
231
- <Card title="Request Validation" icon="shield-check">
232
- Input sanitization and size limits
233
- </Card>
234
-
235
- <Card title="Rate Limiting" icon="gauge">
236
- Per-user and per-project limits
237
- </Card>
238
-
239
- <Card title="Usage Quotas" icon="chart-pie">
240
- Configurable token limits
241
- </Card>
242
-
243
- <Card title="Content Filtering" icon="filter">
244
- Optional content moderation
245
- </Card>
246
-
247
- <Card title="Audit Logging" icon="file-lines">
248
- Track all AI operations
249
- </Card>
250
- </CardGroup>
251
-
252
- ## Error Handling
253
-
254
- ### Error Types
255
-
256
- | Error | Code | Description |
257
- |-------|------|-------------|
258
- | **Model Not Found** | 400 | Invalid model ID |
259
- | **Rate Limited** | 429 | Too many requests |
260
- | **Token Limit** | 400 | Exceeds max tokens |
261
- | **OpenRouter Error** | 502 | Upstream provider issue |
262
- | **Quota Exceeded** | 402 | Usage limit reached |
263
- | **Invalid Input** | 400 | Malformed request |
264
-
265
- ### Retry Strategy
266
-
267
- ```javascript
268
- async function retryableRequest(fn, maxRetries = 3) {
269
- for (let i = 0; i < maxRetries; i++) {
270
- try {
271
- return await fn();
272
- } catch (error) {
273
- if (error.status === 429) { // Rate limited
274
- await sleep(Math.pow(2, i) * 1000); // Exponential backoff
275
- continue;
276
- }
277
- throw error;
278
- }
279
- }
280
- }
281
- ```
282
-
283
- ## Performance Optimizations
284
-
285
- ### Streaming Optimizations
286
-
287
- - **Server-Sent Events**: Real-time response streaming
288
- - **Chunked Transfer**: Efficient data streaming
289
- - **Keep-Alive**: Persistent connections for SSE
290
- - **Low Latency**: Direct OpenRouter integration
291
-
292
- ### Future Optimizations
293
-
294
- - **Response Caching**: Cache for identical requests (coming soon)
295
- - **Batch Processing**: Multiple requests in parallel (coming soon)
296
- - **Embeddings Cache**: Store computed embeddings (coming soon)
297
-
298
- ## API Endpoints
299
-
300
- ### Chat Endpoints
301
- | Method | Endpoint | Auth | Description |
302
- |--------|----------|------|-------------|
303
- | POST | `/api/ai/chat/completion` | User | Send chat messages, supports streaming |
304
-
305
- ### Image Endpoints
306
- | Method | Endpoint | Auth | Description |
307
- |--------|----------|------|-------------|
308
- | POST | `/api/ai/image/generation` | User | Generate images from text prompts |
309
-
310
- ### Configuration Endpoints
311
- | Method | Endpoint | Auth | Description |
312
- |--------|----------|------|-------------|
313
- | GET | `/api/ai/models` | Admin | List available models |
314
- | GET | `/api/ai/configurations` | Admin | List AI configurations |
315
- | POST | `/api/ai/configurations` | Admin | Create AI configuration |
316
- | PATCH | `/api/ai/configurations/:id` | Admin | Update AI configuration |
317
- | DELETE | `/api/ai/configurations/:id` | Admin | Delete AI configuration |
318
-
319
- ### Usage Tracking Endpoints
320
- | Method | Endpoint | Auth | Description |
321
- |--------|----------|------|-------------|
322
- | GET | `/api/ai/usage` | Admin | Get usage records with pagination |
323
- | GET | `/api/ai/usage/summary` | Admin | Get usage summary statistics |
324
- | GET | `/api/ai/usage/config/:configId` | Admin | Get usage by configuration |
325
-
326
- ## Environment Variables
327
-
328
- | Variable | Description | Required |
329
- |----------|-------------|----------|
330
- | `OPENROUTER_API_KEY` | OpenRouter API key (local dev only) | Yes (local) |
331
-
332
- **Note**:
333
- - In cloud environments, the API key is fetched dynamically from the cloud API
334
- - Model configuration is stored in the database (`_ai_configs` table)
335
- - No other AI-related environment variables are used
336
-
337
- ## Best Practices
338
-
339
- <CardGroup cols={2}>
340
- <Card title="Model Selection" icon="brain">
341
- Choose models based on speed vs quality needs
342
- </Card>
343
-
344
- <Card title="Prompt Engineering" icon="pencil">
345
- Craft clear, specific prompts for better results
346
- </Card>
347
-
348
- <Card title="Token Management" icon="coins">
349
- Monitor token usage
350
- </Card>
351
-
352
- <Card title="Streaming UX" icon="stream">
353
- Use streaming for better perceived performance
354
- </Card>
355
-
356
- <Card title="Error Recovery" icon="rotate">
357
- Implement retry logic for transient failures
358
- </Card>
359
-
360
- <Card title="Context Windows" icon="window">
361
- Manage conversation history within limits
362
- </Card>
363
- </CardGroup>
364
-
365
- ## Comparison with Direct Integration
366
-
367
- | Aspect | InsForge + OpenRouter | Direct Provider APIs |
368
- |--------|----------------------|---------------------|
369
- | **Integration Effort** | Single API | Multiple integrations |
370
- | **Billing** | Unified through OpenRouter | Separate per provider |
371
- | **Model Access** | 100+ models | Limited to one provider |
372
- | **Failover** | Automatic | Manual implementation |
1
+ ---
2
+ title: AI Architecture
3
+ description: OpenRouter integration for chat completions and image generation
4
+ ---
5
+
6
+ ## Overview
7
+
8
+ InsForge provides unified AI capabilities through OpenRouter, giving you access to multiple LLM providers with a single API and consistent pricing model.
9
+
10
+ ## Technology Stack
11
+
12
+ ```mermaid
13
+ graph TB
14
+ Client[Client Application] --> SDK[InsForge SDK]
15
+ SDK --> AIAPI[AI API]
16
+
17
+ AIAPI --> OpenRouter[OpenRouter API]
18
+ AIAPI --> DB[(PostgreSQL)]
19
+
20
+ OpenRouter --> Anthropic[Anthropic<br/>Claude Models]
21
+ OpenRouter --> OpenAI[OpenAI<br/>GPT Models]
22
+ OpenRouter --> Google[Google<br/>Gemini]
23
+
24
+ DB --> Config[AI Configurations]
25
+ DB --> Usage[Usage Tracking]
26
+
27
+ AIAPI --> Stream[SSE Streaming]
28
+
29
+ style Client fill:#1e293b,stroke:#475569,color:#e2e8f0
30
+ style SDK fill:#1e40af,stroke:#3b82f6,color:#dbeafe
31
+ style AIAPI fill:#166534,stroke:#22c55e,color:#dcfce7
32
+ style OpenRouter fill:#c2410c,stroke:#fb923c,color:#fed7aa
33
+ style DB fill:#0e7490,stroke:#06b6d4,color:#cffafe
34
+ style Anthropic fill:#6b21a8,stroke:#a855f7,color:#f3e8ff
35
+ style OpenAI fill:#be185d,stroke:#ec4899,color:#fce7f3
36
+ style Google fill:#a16207,stroke:#facc15,color:#fef3c7
37
+ style Config fill:#0e7490,stroke:#22d3ee,color:#cffafe
38
+ style Usage fill:#0e7490,stroke:#22d3ee,color:#cffafe
39
+ style Stream fill:#166534,stroke:#4ade80,color:#dcfce7
40
+ ```
41
+
42
+ ## Core Components
43
+
44
+ | Component | Technology | Purpose |
45
+ |-----------|------------|---------|
46
+ | **AI Gateway** | OpenRouter | Unified access to multiple AI providers |
47
+ | **Chat Service** | Node.js + SSE | Handle chat completions with streaming |
48
+ | **Image Service** | Async processing | Generate images via AI models |
49
+ | **Configuration** | PostgreSQL | Store system prompts per project |
50
+ | **Usage Tracking** | PostgreSQL | Monitor token usage |
51
+ | **Response Format** | JSON/SSE | Standard and streaming responses |
52
+
53
+ ## OpenRouter Integration
54
+
55
+ ### Why OpenRouter?
56
+
57
+ - **Single API**: One integration for multiple providers
58
+ - **Unified Billing**: Consistent pricing across models
59
+ - **Automatic Failover**: Fallback to alternative models
60
+ - **Rate Limiting**: Built-in rate limit handling
61
+
62
+ ### Request Flow
63
+
64
+ ```mermaid
65
+ sequenceDiagram
66
+ participant Client
67
+ participant InsForge
68
+ participant OpenRouter
69
+ participant Provider
70
+
71
+ Client->>InsForge: Chat/Image Request
72
+ InsForge->>InsForge: Add system prompt
73
+ InsForge->>OpenRouter: Forward with API key
74
+ OpenRouter->>Provider: Route to model
75
+ Provider-->>OpenRouter: Model response
76
+ OpenRouter-->>InsForge: Unified response
77
+ InsForge->>InsForge: Track usage
78
+ InsForge-->>Client: Formatted response
79
+ ```
80
+
81
+ ## Chat Completions
82
+
83
+ ### Request Processing
84
+
85
+ 1. **Authentication**: Verify JWT token
86
+ 2. **Configuration**: Load project AI settings
87
+ 3. **System Prompt**: Prepend configured prompt
88
+ 4. **Model Selection**: Use specified or default model
89
+ 5. **OpenRouter Call**: Forward to OpenRouter
90
+ 6. **Response Handling**: Stream or batch response
91
+ 7. **Usage Tracking**: Record token usage
92
+
93
+ ### Streaming Architecture
94
+
95
+ ```javascript
96
+ // Server-Sent Events (SSE) for streaming
97
+ async function* streamChat(messages, options) {
98
+ const stream = await openRouter.chat.completions.create({
99
+ model: options.model,
100
+ messages: messages,
101
+ stream: true,
102
+ temperature: options.temperature,
103
+ max_tokens: options.maxTokens
104
+ });
105
+
106
+ for await (const chunk of stream) {
107
+ if (chunk.choices[0]?.delta?.content) {
108
+ yield { chunk: chunk.choices[0].delta.content };
109
+ }
110
+ }
111
+
112
+ yield { done: true, tokenUsage: {...} };
113
+ }
114
+ ```
115
+
116
+ ### Response Formats
117
+
118
+ **Non-streaming Response:**
119
+ ```json
120
+ {
121
+ "response": "AI generated response text",
122
+ "model": "anthropic/claude-3.5-haiku",
123
+ "usage": {
124
+ "promptTokens": 150,
125
+ "completionTokens": 200,
126
+ "totalTokens": 350
127
+ }
128
+ }
129
+ ```
130
+
131
+ **Streaming Response (SSE):**
132
+ ```
133
+ data: {"chunk": "The "}
134
+ data: {"chunk": "answer "}
135
+ data: {"chunk": "is..."}
136
+ data: {"done": true, "tokenUsage": {...}}
137
+ ```
138
+
139
+ ## Image Generation
140
+
141
+ ### Generation Flow
142
+
143
+ 1. **Prompt Processing**: Validate and enhance prompt
144
+ 2. **Model Selection**: Choose appropriate image model
145
+ 3. **Size Configuration**: Set dimensions and quality
146
+ 4. **OpenRouter Request**: Send generation request
147
+ 5. **URL Generation**: Receive image URLs
148
+ 6. **Storage Integration**: Optional save to storage
149
+ 7. **Response Delivery**: Return URLs to client
150
+
151
+ ### Image Parameters
152
+
153
+ | Parameter | Options | Description |
154
+ |-----------|---------|-------------|
155
+ | `model` | Model IDs | AI model to use |
156
+ | `prompt` | String | Text description |
157
+ | `size` | `512x512`, `1024x1024`, etc. | Image dimensions |
158
+ | `quality` | `standard`, `hd` | Image quality |
159
+ | `numImages` | 1-4 | Number of variations |
160
+ | `style` | `vivid`, `natural` | Style preference |
161
+
162
+ ## Configuration Management
163
+
164
+ ### Database Schema
165
+
166
+ ```sql
167
+ CREATE TABLE _ai_configs (
168
+ id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
169
+ modality VARCHAR(255) NOT NULL, -- 'text' or 'image'
170
+ provider VARCHAR(255) NOT NULL, -- 'openrouter'
171
+ model_id VARCHAR(255) UNIQUE NOT NULL,
172
+ system_prompt TEXT,
173
+ created_at TIMESTAMPTZ DEFAULT NOW(),
174
+ updated_at TIMESTAMPTZ DEFAULT NOW()
175
+ );
176
+ ```
177
+
178
+ ### System Prompts
179
+
180
+ - Configured per project
181
+ - Applied to all chat requests
182
+ - Cannot be overridden by client
183
+ - Support for multiple configurations
184
+
185
+ ## Usage Tracking
186
+
187
+ ### Metrics Collected
188
+
189
+ ```sql
190
+ CREATE TABLE _ai_usage (
191
+ id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
192
+ config_id UUID NOT NULL,
193
+ input_tokens INT,
194
+ output_tokens INT,
195
+ image_count INT,
196
+ image_resolution TEXT,
197
+ created_at TIMESTAMPTZ DEFAULT NOW(),
198
+ FOREIGN KEY (config_id) REFERENCES _ai_configs(id) ON DELETE NO ACTION
199
+ );
200
+ ```
201
+
202
+ ## Security & Rate Limiting
203
+
204
+ <CardGroup cols={2}>
205
+ <Card title="API Key Security" icon="key">
206
+ OpenRouter key stored server-side only
207
+ </Card>
208
+
209
+ <Card title="Request Validation" icon="shield-check">
210
+ Input sanitization and size limits
211
+ </Card>
212
+
213
+ <Card title="Rate Limiting" icon="gauge">
214
+ Per-user and per-project limits
215
+ </Card>
216
+
217
+ <Card title="Usage Quotas" icon="chart-pie">
218
+ Configurable token limits
219
+ </Card>
220
+
221
+ <Card title="Content Filtering" icon="filter">
222
+ Optional content moderation
223
+ </Card>
224
+
225
+ <Card title="Audit Logging" icon="file-lines">
226
+ Track all AI operations
227
+ </Card>
228
+ </CardGroup>
229
+
230
+ ## Error Handling
231
+
232
+ ### Error Types
233
+
234
+ | Error | Code | Description |
235
+ |-------|------|-------------|
236
+ | **Model Not Found** | 400 | Invalid model ID |
237
+ | **Rate Limited** | 429 | Too many requests |
238
+ | **Token Limit** | 400 | Exceeds max tokens |
239
+ | **OpenRouter Error** | 502 | Upstream provider issue |
240
+ | **Quota Exceeded** | 402 | Usage limit reached |
241
+ | **Invalid Input** | 400 | Malformed request |
242
+
243
+ ### Retry Strategy
244
+
245
+ ```javascript
246
+ async function retryableRequest(fn, maxRetries = 3) {
247
+ for (let i = 0; i < maxRetries; i++) {
248
+ try {
249
+ return await fn();
250
+ } catch (error) {
251
+ if (error.status === 429) { // Rate limited
252
+ await sleep(Math.pow(2, i) * 1000); // Exponential backoff
253
+ continue;
254
+ }
255
+ throw error;
256
+ }
257
+ }
258
+ }
259
+ ```
260
+
261
+ ## Performance Optimizations
262
+
263
+ ### Streaming Optimizations
264
+
265
+ - **Server-Sent Events**: Real-time response streaming
266
+ - **Chunked Transfer**: Efficient data streaming
267
+ - **Keep-Alive**: Persistent connections for SSE
268
+ - **Low Latency**: Direct OpenRouter integration
269
+
270
+ ### Future Optimizations
271
+
272
+ - **Response Caching**: Cache for identical requests (coming soon)
273
+ - **Batch Processing**: Multiple requests in parallel (coming soon)
274
+ - **Embeddings Cache**: Store computed embeddings (coming soon)
275
+
276
+ ## API Endpoints
277
+
278
+ ### Chat Endpoints
279
+ | Method | Endpoint | Auth | Description |
280
+ |--------|----------|------|-------------|
281
+ | POST | `/api/ai/chat/completion` | User | Send chat messages, supports streaming |
282
+
283
+ ### Image Endpoints
284
+ | Method | Endpoint | Auth | Description |
285
+ |--------|----------|------|-------------|
286
+ | POST | `/api/ai/image/generation` | User | Generate images from text prompts |
287
+
288
+ ### Configuration Endpoints
289
+ | Method | Endpoint | Auth | Description |
290
+ |--------|----------|------|-------------|
291
+ | GET | `/api/ai/models` | Admin | List available models |
292
+ | GET | `/api/ai/configurations` | Admin | List AI configurations |
293
+ | POST | `/api/ai/configurations` | Admin | Create AI configuration |
294
+ | PATCH | `/api/ai/configurations/:id` | Admin | Update AI configuration |
295
+ | DELETE | `/api/ai/configurations/:id` | Admin | Delete AI configuration |
296
+
297
+ ### Usage Tracking Endpoints
298
+ | Method | Endpoint | Auth | Description |
299
+ |--------|----------|------|-------------|
300
+ | GET | `/api/ai/usage` | Admin | Get usage records with pagination |
301
+ | GET | `/api/ai/usage/summary` | Admin | Get usage summary statistics |
302
+ | GET | `/api/ai/usage/config/:configId` | Admin | Get usage by configuration |
303
+
304
+ ## Environment Variables
305
+
306
+ | Variable | Description | Required |
307
+ |----------|-------------|----------|
308
+ | `OPENROUTER_API_KEY` | OpenRouter API key (local dev only) | Yes (local) |
309
+
310
+ **Note**:
311
+ - In cloud environments, the API key is fetched dynamically from the cloud API
312
+ - Model configuration is stored in the database (`_ai_configs` table)
313
+ - No other AI-related environment variables are used
314
+
315
+ ## Best Practices
316
+
317
+ <CardGroup cols={2}>
318
+ <Card title="Model Selection" icon="brain">
319
+ Choose models based on speed vs quality needs
320
+ </Card>
321
+
322
+ <Card title="Prompt Engineering" icon="pencil">
323
+ Craft clear, specific prompts for better results
324
+ </Card>
325
+
326
+ <Card title="Token Management" icon="coins">
327
+ Monitor token usage
328
+ </Card>
329
+
330
+ <Card title="Streaming UX" icon="stream">
331
+ Use streaming for better perceived performance
332
+ </Card>
333
+
334
+ <Card title="Error Recovery" icon="rotate">
335
+ Implement retry logic for transient failures
336
+ </Card>
337
+
338
+ <Card title="Context Windows" icon="window">
339
+ Manage conversation history within limits
340
+ </Card>
341
+ </CardGroup>
342
+
343
+ ## Comparison with Direct Integration
344
+
345
+ | Aspect | InsForge + OpenRouter | Direct Provider APIs |
346
+ |--------|----------------------|---------------------|
347
+ | **Integration Effort** | Single API | Multiple integrations |
348
+ | **Billing** | Unified through OpenRouter | Separate per provider |
349
+ | **Model Access** | 100+ models | Limited to one provider |
350
+ | **Failover** | Automatic | Manual implementation |
373
351
  | **Rate Limiting** | Handled by OpenRouter | Per-provider limits |