insforge 0.3.3 → 1.3.0

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 (635) hide show
  1. package/.claude-plugin/marketplace.json +20 -0
  2. package/.dockerignore +60 -57
  3. package/.env.example +84 -49
  4. package/.github/ISSUE_TEMPLATE/bug_report.yml +36 -83
  5. package/.github/ISSUE_TEMPLATE/config.yml +11 -11
  6. package/.github/ISSUE_TEMPLATE/feature_request.yml +26 -79
  7. package/.github/PULL_REQUEST_TEMPLATE.md +7 -0
  8. package/.github/copilot-instructions.md +146 -146
  9. package/.github/workflows/build-image.yml +66 -65
  10. package/.github/workflows/ci-premerge-check.yml +23 -23
  11. package/.github/workflows/e2e.yml +63 -0
  12. package/.github/workflows/lint-and-format.yml +32 -32
  13. package/.prettierignore +64 -64
  14. package/CHANGELOG.md +44 -3
  15. package/CLAUDE_PLUGIN.md +104 -0
  16. package/CODE_OF_CONDUCT.md +128 -0
  17. package/CONTRIBUTING.md +125 -125
  18. package/Dockerfile +30 -27
  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 -134
  23. package/assets/Dark.svg +23 -23
  24. package/assets/mcpInstallv2.png +0 -0
  25. package/assets/sampleResponse.png +0 -0
  26. package/auth/index.html +13 -0
  27. package/auth/package.json +28 -0
  28. package/auth/public/favicon.ico +0 -0
  29. package/auth/src/App.tsx +33 -0
  30. package/auth/src/components/ErrorCard.tsx +37 -0
  31. package/auth/src/components/Layout.tsx +13 -0
  32. package/auth/src/index.css +19 -0
  33. package/auth/src/lib/broadcastService.ts +117 -0
  34. package/auth/src/lib/utils.ts +11 -0
  35. package/auth/src/main.tsx +22 -0
  36. package/auth/src/pages/ForgotPasswordPage.tsx +11 -0
  37. package/auth/src/pages/ResetPasswordPage.tsx +11 -0
  38. package/auth/src/pages/SignInPage.tsx +60 -0
  39. package/auth/src/pages/SignUpPage.tsx +60 -0
  40. package/auth/src/pages/VerifyEmailPage.tsx +20 -0
  41. package/auth/src/vite-env.d.ts +10 -0
  42. package/auth/tsconfig.json +32 -0
  43. package/auth/tsconfig.node.json +11 -0
  44. package/auth/vite.config.ts +25 -0
  45. package/backend/package.json +78 -75
  46. package/backend/src/api/{middleware → middlewares}/auth.ts +8 -9
  47. package/backend/src/api/middlewares/rate-limiters.ts +127 -0
  48. package/backend/src/api/routes/{ai.ts → ai/index.routes.ts} +22 -26
  49. package/backend/src/api/routes/auth/index.routes.ts +667 -0
  50. package/backend/src/api/routes/auth/oauth.routes.ts +473 -0
  51. package/backend/src/api/routes/{database.advance.ts → database/advance.routes.ts} +128 -65
  52. package/backend/src/api/routes/database/index.routes.ts +90 -0
  53. package/backend/src/api/routes/{database.records.ts → database/records.routes.ts} +26 -12
  54. package/backend/src/api/routes/{database.tables.ts → database/tables.routes.ts} +6 -23
  55. package/backend/src/api/routes/docs/index.routes.ts +75 -0
  56. package/backend/src/api/routes/email/index.routes.ts +35 -0
  57. package/backend/src/api/routes/functions/index.routes.ts +194 -0
  58. package/backend/src/api/routes/{logs.ts → logs/index.routes.ts} +25 -30
  59. package/backend/src/api/routes/{metadata.ts → metadata/index.routes.ts} +33 -31
  60. package/backend/src/api/routes/realtime/channels.routes.ts +81 -0
  61. package/backend/src/api/routes/realtime/index.routes.ts +12 -0
  62. package/backend/src/api/routes/realtime/messages.routes.ts +48 -0
  63. package/backend/src/api/routes/realtime/permissions.routes.ts +19 -0
  64. package/backend/src/api/routes/{secrets.ts → secrets/index.routes.ts} +27 -22
  65. package/backend/src/api/routes/{storage.ts → storage/index.routes.ts} +48 -61
  66. package/backend/src/api/routes/usage/index.routes.ts +91 -0
  67. package/backend/src/infra/config/app.config.ts +51 -0
  68. package/backend/src/infra/database/database.manager.ts +182 -0
  69. package/backend/{migrations → src/infra/database/migrations}/000_create-base-tables.sql +141 -141
  70. package/backend/{migrations → src/infra/database/migrations}/001_create-helper-functions.sql +40 -40
  71. package/backend/{migrations → src/infra/database/migrations}/002_rename-auth-tables.sql +29 -29
  72. package/backend/{migrations → src/infra/database/migrations}/003_create-users-table.sql +55 -55
  73. package/backend/{migrations → src/infra/database/migrations}/004_add-reload-postgrest-func.sql +23 -23
  74. package/backend/{migrations → src/infra/database/migrations}/005_enable-project-admin-modify-users.sql +29 -29
  75. package/backend/{migrations → src/infra/database/migrations}/006_modify-ai-usage-table.sql +24 -24
  76. package/backend/{migrations → src/infra/database/migrations}/007_drop-metadata-table.sql +1 -1
  77. package/backend/{migrations → src/infra/database/migrations}/008_add-system-tables.sql +76 -76
  78. package/backend/{migrations → src/infra/database/migrations}/009_add-function-secrets.sql +23 -23
  79. package/backend/{migrations → src/infra/database/migrations}/010_modify-ai-config-modalities.sql +93 -93
  80. package/backend/{migrations → src/infra/database/migrations}/011_refactor-secrets-table.sql +15 -15
  81. package/backend/{migrations → src/infra/database/migrations}/012_add-storage-uploaded-by.sql +7 -7
  82. package/backend/src/infra/database/migrations/013_create-auth-schema-functions.sql +44 -0
  83. package/backend/src/infra/database/migrations/014_add-updated-at-trigger-user-table.sql +8 -0
  84. package/backend/src/infra/database/migrations/015_create-auth-config-and-email-otp-tables.sql +60 -0
  85. package/backend/src/infra/database/migrations/016_update-auth-config-and-email-otp.sql +24 -0
  86. package/backend/src/infra/database/migrations/017_create-realtime-schema.sql +233 -0
  87. package/backend/src/infra/realtime/realtime.manager.ts +246 -0
  88. package/backend/src/infra/realtime/webhook-sender.ts +82 -0
  89. package/backend/src/{core/secrets/encryption.ts → infra/security/encryption.manager.ts} +3 -2
  90. package/backend/src/infra/security/token.manager.ts +219 -0
  91. package/backend/src/infra/socket/socket.manager.ts +522 -0
  92. package/backend/src/providers/ai/openrouter.provider.ts +380 -0
  93. package/backend/src/providers/email/base.provider.ts +38 -0
  94. package/backend/src/providers/email/cloud.provider.ts +271 -0
  95. package/backend/src/{core/logs/providers → providers/logs}/base.provider.ts +11 -11
  96. package/backend/src/{core/logs/providers → providers/logs}/cloudwatch.provider.ts +61 -38
  97. package/backend/src/providers/logs/local.provider.ts +185 -0
  98. package/backend/src/providers/oauth/apple.provider.ts +266 -0
  99. package/backend/src/providers/oauth/base.provider.ts +29 -0
  100. package/backend/src/providers/oauth/discord.provider.ts +195 -0
  101. package/backend/src/providers/oauth/facebook.provider.ts +194 -0
  102. package/backend/src/providers/oauth/github.provider.ts +208 -0
  103. package/backend/src/providers/oauth/google.provider.ts +249 -0
  104. package/backend/src/providers/oauth/index.ts +8 -0
  105. package/backend/src/providers/oauth/linkedin.provider.ts +240 -0
  106. package/backend/src/providers/oauth/microsoft.provider.ts +169 -0
  107. package/backend/src/providers/oauth/x.provider.ts +202 -0
  108. package/backend/src/providers/storage/base.provider.ts +29 -0
  109. package/backend/src/providers/storage/local.provider.ts +103 -0
  110. package/backend/src/providers/storage/s3.provider.ts +313 -0
  111. package/backend/src/server.ts +317 -288
  112. package/backend/src/{core/ai/config.ts → services/ai/ai-config.service.ts} +19 -24
  113. package/backend/src/services/ai/ai-model.service.ts +60 -0
  114. package/backend/src/{core/ai/usage.ts → services/ai/ai-usage.service.ts} +28 -35
  115. package/backend/src/{core/ai/chat.ts → services/ai/chat-completion.service.ts} +37 -24
  116. package/backend/src/services/ai/helpers.ts +64 -0
  117. package/backend/src/{core/ai/image.ts → services/ai/image-generation.service.ts} +17 -19
  118. package/backend/src/services/ai/index.ts +13 -0
  119. package/backend/src/services/auth/auth-config.service.ts +250 -0
  120. package/backend/src/services/auth/auth-otp.service.ts +424 -0
  121. package/backend/src/services/auth/auth.service.ts +1150 -0
  122. package/backend/src/services/auth/index.ts +4 -0
  123. package/backend/src/{core/auth/oauth.ts → services/auth/oauth-config.service.ts} +106 -52
  124. package/backend/src/{core/database/advance.ts → services/database/database-advance.service.ts} +97 -131
  125. package/backend/src/services/database/database-table.service.ts +802 -0
  126. package/backend/src/services/database/database.service.ts +127 -0
  127. package/backend/src/services/email/email.service.ts +73 -0
  128. package/backend/src/{core/functions/functions.ts → services/functions/function.service.ts} +95 -88
  129. package/backend/src/{core/logs/audit.ts → services/logs/audit.service.ts} +92 -75
  130. package/backend/src/services/logs/log.service.ts +73 -0
  131. package/backend/src/services/realtime/index.ts +3 -0
  132. package/backend/src/services/realtime/realtime-auth.service.ts +104 -0
  133. package/backend/src/services/realtime/realtime-channel.service.ts +237 -0
  134. package/backend/src/services/realtime/realtime-message.service.ts +260 -0
  135. package/backend/src/{core/secrets/secrets.ts → services/secrets/secret.service.ts} +48 -66
  136. package/backend/src/services/storage/storage.service.ts +617 -0
  137. package/backend/src/services/usage/usage.service.ts +149 -0
  138. package/backend/src/types/auth.ts +77 -2
  139. package/backend/src/types/email.ts +8 -0
  140. package/backend/src/types/error-constants.ts +4 -0
  141. package/backend/src/types/logs.ts +0 -29
  142. package/backend/src/types/realtime.ts +18 -0
  143. package/backend/src/{core/socket/types.ts → types/socket.ts} +11 -36
  144. package/backend/src/utils/cookies.ts +35 -0
  145. package/backend/src/utils/environment.ts +9 -3
  146. package/backend/src/utils/logger.ts +20 -2
  147. package/backend/src/utils/s3-config-loader.ts +64 -0
  148. package/backend/src/utils/seed.ts +301 -205
  149. package/backend/src/utils/sql-parser.ts +91 -1
  150. package/backend/src/utils/utils.ts +114 -0
  151. package/backend/src/utils/validations.ts +40 -4
  152. package/backend/tests/README.md +133 -133
  153. package/backend/tests/cleanup-all-test-data.sh +230 -230
  154. package/backend/tests/cloud/test-s3-multitenant.sh +131 -131
  155. package/backend/tests/local/comprehensive-curl-tests.sh +155 -155
  156. package/backend/tests/local/test-ai-config.sh +129 -0
  157. package/backend/tests/local/test-ai-usage.sh +80 -0
  158. package/backend/tests/local/test-auth-router.sh +143 -143
  159. package/backend/tests/local/test-database-router.sh +222 -222
  160. package/backend/tests/local/test-e2e.sh +240 -240
  161. package/backend/tests/local/test-fk-errors.sh +96 -96
  162. package/backend/tests/local/test-functions.sh +123 -0
  163. package/backend/tests/local/test-id-field.sh +200 -200
  164. package/backend/tests/local/test-logs.sh +132 -0
  165. package/backend/tests/local/test-public-bucket.sh +264 -264
  166. package/backend/tests/local/test-secrets.sh +249 -247
  167. package/backend/tests/local/test-serverless-functions.sh.disabled +325 -325
  168. package/backend/tests/local/test-traditional-rest.sh +208 -208
  169. package/backend/tests/manual/README.md +50 -50
  170. package/backend/tests/manual/create-large-table-simple.sql +10 -10
  171. package/backend/tests/manual/seed-large-table.sql +100 -100
  172. package/backend/tests/manual/setup-large-table-extras.sql +33 -33
  173. package/backend/tests/manual/test-bulk-upsert.sh +409 -409
  174. package/backend/tests/manual/test-database-advance.sh +296 -296
  175. package/backend/tests/manual/test-postgrest-stability.sh +191 -191
  176. package/backend/tests/manual/test-rawsql-export-import.sh +411 -411
  177. package/backend/tests/manual/test-rawsql-modes.sh +244 -0
  178. package/backend/tests/manual/test-universal-storage.sh +263 -263
  179. package/backend/tests/manual/test-users.sql +17 -17
  180. package/backend/tests/run-all-tests.sh +139 -139
  181. package/backend/tests/setup.ts +0 -0
  182. package/backend/tests/test-config.sh +338 -302
  183. package/backend/tests/unit/analyze-query.test.ts +697 -0
  184. package/backend/tests/unit/cloud-token.test.ts +48 -0
  185. package/backend/tests/unit/constant.test.ts +8 -0
  186. package/backend/tests/unit/email.test.ts +372 -0
  187. package/backend/tests/unit/environment.test.ts +59 -0
  188. package/backend/tests/unit/helpers.test.ts +63 -0
  189. package/backend/tests/unit/logger.test.ts +22 -0
  190. package/backend/tests/unit/rate-limit.test.ts +154 -0
  191. package/backend/tests/unit/response.test.ts +58 -0
  192. package/backend/tests/unit/sql-parser.test.ts +74 -0
  193. package/backend/tests/unit/uuid.test.ts +21 -0
  194. package/backend/tests/unit/validations.test.ts +80 -0
  195. package/backend/tsconfig.json +22 -22
  196. package/backend/vitest.config.ts +11 -0
  197. package/claude-plugin/.claude-plugin/plugin.json +24 -0
  198. package/claude-plugin/README.md +133 -0
  199. package/claude-plugin/skills/insforge-schema-patterns/SKILL.md +270 -0
  200. package/docker-compose.prod.yml +204 -144
  201. package/docker-compose.yml +232 -167
  202. package/docker-init/db/db-init.sql +97 -125
  203. package/docker-init/db/jwt.sql +5 -5
  204. package/docker-init/db/postgresql.conf +16 -16
  205. package/docker-init/logs/vector.yml +236 -0
  206. package/docs/README.md +44 -0
  207. package/docs/agent-docs/real-time.md +269 -0
  208. package/docs/changelog.mdx +119 -0
  209. package/docs/core-concepts/ai/architecture.mdx +373 -0
  210. package/docs/core-concepts/ai/sdk.mdx +213 -0
  211. package/docs/core-concepts/authentication/architecture.mdx +278 -0
  212. package/docs/core-concepts/authentication/sdk.mdx +414 -0
  213. package/docs/core-concepts/authentication/ui-components/customization.mdx +529 -0
  214. package/docs/core-concepts/authentication/ui-components/nextjs.mdx +221 -0
  215. package/docs/core-concepts/authentication/ui-components/react-router.mdx +184 -0
  216. package/docs/core-concepts/authentication/ui-components/react.mdx +129 -0
  217. package/docs/core-concepts/database/architecture.mdx +256 -0
  218. package/docs/core-concepts/database/sdk.mdx +382 -0
  219. package/docs/core-concepts/email/architecture.mdx +101 -0
  220. package/docs/core-concepts/email/sdk.mdx +53 -0
  221. package/docs/core-concepts/functions/architecture.mdx +105 -0
  222. package/docs/core-concepts/functions/sdk.mdx +184 -0
  223. package/docs/core-concepts/realtime/architecture.mdx +446 -0
  224. package/docs/core-concepts/realtime/sdk.mdx +409 -0
  225. package/docs/core-concepts/storage/architecture.mdx +243 -0
  226. package/docs/core-concepts/storage/sdk.mdx +253 -0
  227. package/docs/deployment/README.md +94 -0
  228. package/docs/deployment/deploy-to-aws-ec2.md +565 -0
  229. package/docs/deployment/deploy-to-azure-virtual-machines.md +313 -0
  230. package/docs/deployment/deploy-to-google-cloud-compute-engine.md +613 -0
  231. package/docs/deployment/deploy-to-render.md +441 -0
  232. package/docs/deprecated/insforge-auth-api.md +214 -214
  233. package/docs/deprecated/insforge-auth-sdk.md +99 -99
  234. package/docs/deprecated/insforge-db-api.md +358 -358
  235. package/docs/deprecated/insforge-db-sdk.md +139 -139
  236. package/docs/deprecated/insforge-debug-sdk.md +156 -156
  237. package/docs/deprecated/insforge-debug.md +64 -64
  238. package/docs/deprecated/insforge-instructions.md +123 -123
  239. package/docs/deprecated/insforge-project.md +117 -117
  240. package/docs/deprecated/insforge-storage-api.md +278 -278
  241. package/docs/deprecated/insforge-storage-sdk.md +158 -158
  242. package/docs/docs.json +232 -0
  243. package/docs/examples/framework-guides/nextjs.mdx +131 -0
  244. package/docs/examples/framework-guides/nuxt.mdx +165 -0
  245. package/docs/examples/framework-guides/react.mdx +165 -0
  246. package/docs/examples/framework-guides/svelte.mdx +153 -0
  247. package/docs/examples/framework-guides/vue.mdx +159 -0
  248. package/docs/examples/overview.mdx +67 -0
  249. package/docs/favicon.svg +19 -0
  250. package/docs/images/changelog/dec-2025/ai-integration.png +0 -0
  251. package/docs/images/changelog/dec-2025/ai-models.webp +0 -0
  252. package/docs/images/changelog/dec-2025/alipay-payment.webp +0 -0
  253. package/docs/images/changelog/dec-2025/apple-login.jpg +0 -0
  254. package/docs/images/changelog/dec-2025/mcp-installer.png +0 -0
  255. package/docs/images/changelog/dec-2025/realtime-module.jpg +0 -0
  256. package/docs/images/changelog/nov-2025/auth-components.webp +0 -0
  257. package/docs/images/changelog/nov-2025/database-metadata.webp +0 -0
  258. package/docs/images/changelog/nov-2025/quickstart-prompts.webp +0 -0
  259. package/docs/images/changelog/nov-2025/sql-editor.webp +0 -0
  260. package/docs/images/changelog/nov-2025/usage-page.webp +0 -0
  261. package/docs/images/changelog/october-2025/csv-upload.webp +0 -0
  262. package/docs/images/changelog/october-2025/logs-feature.webp +0 -0
  263. package/docs/images/changelog/october-2025/oauth-providers.webp +0 -0
  264. package/docs/images/checks-passed.png +0 -0
  265. package/docs/images/dashboard-connect-expanded.png +0 -0
  266. package/docs/images/dashboard-connect.png +0 -0
  267. package/docs/images/hero-dark.png +0 -0
  268. package/docs/images/hero-light.png +0 -0
  269. package/docs/images/icons/ai.svg +4 -0
  270. package/docs/images/icons/auth.svg +1 -0
  271. package/docs/images/icons/database.svg +1 -0
  272. package/docs/images/icons/function.svg +1 -0
  273. package/docs/images/icons/storage.svg +1 -0
  274. package/docs/images/logos/nextjs.svg +4 -0
  275. package/docs/images/logos/nuxt.svg +4 -0
  276. package/docs/images/logos/react.svg +5 -0
  277. package/docs/images/logos/svelte.svg +4 -0
  278. package/docs/images/logos/vue.svg +5 -0
  279. package/docs/images/mcp-install.png +0 -0
  280. package/docs/images/onboarding-mcp.png +0 -0
  281. package/docs/insforge-instructions-sdk.md +89 -407
  282. package/docs/introduction.mdx +45 -0
  283. package/docs/logo/dark.svg +22 -0
  284. package/docs/logo/light.svg +20 -0
  285. package/docs/partnership.mdx +652 -0
  286. package/docs/quickstart.mdx +83 -0
  287. package/docs/showcase/2048-arena.png +0 -0
  288. package/docs/showcase/framegen-cloud.png +0 -0
  289. package/docs/showcase/line-connect-race.png +0 -0
  290. package/docs/showcase/moment-vibe.png +0 -0
  291. package/docs/showcase/national-flags.png +0 -0
  292. package/docs/showcase/pokemon-vibe.png +0 -0
  293. package/docs/showcase/pure-browse-buy.png +0 -0
  294. package/docs/showcase.mdx +52 -0
  295. package/docs/snippets/sdk-installation.mdx +22 -0
  296. package/docs/snippets/service-icons.mdx +27 -0
  297. package/eslint.config.js +10 -3
  298. package/examples/oauth/frontend-oauth-example.html +250 -250
  299. package/examples/response-examples.md +443 -443
  300. package/frontend/components.json +17 -17
  301. package/frontend/package.json +69 -63
  302. package/frontend/src/App.tsx +13 -82
  303. package/frontend/src/assets/icons/checkbox_checked.svg +6 -6
  304. package/frontend/src/assets/icons/checkbox_undetermined.svg +6 -6
  305. package/frontend/src/assets/icons/checked.svg +3 -3
  306. package/frontend/src/assets/icons/connected.svg +3 -0
  307. package/frontend/src/assets/icons/error.svg +3 -3
  308. package/frontend/src/assets/icons/loader.svg +9 -0
  309. package/frontend/src/assets/icons/pencil.svg +4 -4
  310. package/frontend/src/assets/icons/refresh.svg +4 -4
  311. package/frontend/src/assets/icons/step_active.svg +3 -3
  312. package/frontend/src/assets/icons/step_inactive.svg +11 -11
  313. package/frontend/src/assets/icons/warning.svg +3 -3
  314. package/frontend/src/assets/logos/apple.svg +4 -0
  315. package/frontend/src/assets/logos/claude_code.svg +3 -3
  316. package/frontend/src/assets/logos/cline.svg +6 -6
  317. package/frontend/src/assets/logos/cursor.svg +20 -20
  318. package/frontend/src/assets/logos/discord.svg +8 -8
  319. package/frontend/src/assets/logos/facebook.svg +3 -0
  320. package/frontend/src/assets/logos/gemini.svg +19 -19
  321. package/frontend/src/assets/logos/github.svg +5 -5
  322. package/frontend/src/assets/logos/google.svg +13 -13
  323. package/frontend/src/assets/logos/grok.svg +10 -10
  324. package/frontend/src/assets/logos/insforge_dark.svg +15 -15
  325. package/frontend/src/assets/logos/insforge_light.svg +15 -15
  326. package/frontend/src/assets/logos/instagram.svg +2 -0
  327. package/frontend/src/assets/logos/linkedin.svg +3 -0
  328. package/frontend/src/assets/logos/microsoft.svg +1 -0
  329. package/frontend/src/assets/logos/openai.svg +10 -10
  330. package/frontend/src/assets/logos/roo_code.svg +9 -9
  331. package/frontend/src/assets/logos/spotify.svg +17 -0
  332. package/frontend/src/assets/logos/tiktok.svg +6 -0
  333. package/frontend/src/assets/logos/trae.svg +3 -3
  334. package/frontend/src/assets/logos/windsurf.svg +10 -10
  335. package/frontend/src/assets/logos/x.svg +3 -0
  336. package/frontend/src/components/Checkbox.tsx +27 -29
  337. package/frontend/src/components/CodeBlock.tsx +55 -2
  338. package/frontend/src/components/CodeEditor.tsx +92 -0
  339. package/frontend/src/components/ConfirmDialog.tsx +1 -1
  340. package/frontend/src/components/ConnectCTA.tsx +38 -0
  341. package/frontend/src/components/CopyButton.tsx +52 -15
  342. package/frontend/src/components/ErrorState.tsx +1 -2
  343. package/frontend/src/components/FeatureSidebar.tsx +6 -6
  344. package/frontend/src/components/FeatureSidebarItem.tsx +2 -2
  345. package/frontend/src/components/JsonHighlight.tsx +21 -9
  346. package/frontend/src/components/ProjectInfoModal.tsx +128 -0
  347. package/frontend/src/components/PromptDialog.tsx +1 -4
  348. package/frontend/src/components/SearchInput.tsx +1 -2
  349. package/frontend/src/components/Stepper.tsx +53 -0
  350. package/frontend/src/components/ThemeToggle.tsx +3 -3
  351. package/frontend/src/components/datagrid/DataGrid.tsx +25 -32
  352. package/frontend/src/components/datagrid/cell-editors/DateCellEditor.tsx +1 -2
  353. package/frontend/src/components/datagrid/cell-editors/JsonCellEditor.tsx +2 -4
  354. package/frontend/src/components/datagrid/index.ts +23 -0
  355. package/frontend/src/components/index.ts +23 -30
  356. package/frontend/src/components/layout/AppHeader.tsx +131 -91
  357. package/frontend/src/components/layout/AppSidebar.tsx +80 -170
  358. package/frontend/src/components/layout/Layout.tsx +12 -23
  359. package/frontend/src/components/layout/PrimaryMenu.tsx +187 -0
  360. package/frontend/src/components/layout/SecondaryMenu.tsx +70 -0
  361. package/frontend/src/components/layout/index.ts +5 -0
  362. package/frontend/src/components/radix/Tooltip.tsx +24 -13
  363. package/frontend/src/components/radix/index.ts +22 -0
  364. package/frontend/src/features/ai/components/AIConfigCard.tsx +129 -83
  365. package/frontend/src/features/ai/components/AIEmptyState.tsx +12 -7
  366. package/frontend/src/features/ai/components/ModalityFilterSidebar.tsx +101 -0
  367. package/frontend/src/features/ai/components/ModelSelectionDialog.tsx +135 -0
  368. package/frontend/src/features/ai/components/ModelSelectionGrid.tsx +51 -0
  369. package/frontend/src/features/ai/components/SystemPromptDialog.tsx +118 -0
  370. package/frontend/src/features/ai/components/index.ts +6 -0
  371. package/frontend/src/features/ai/helpers.ts +57 -71
  372. package/frontend/src/features/ai/hooks/useAIConfigs.ts +39 -113
  373. package/frontend/src/features/ai/hooks/useAIUsage.ts +0 -2
  374. package/frontend/src/features/ai/pages/AIPage.tsx +166 -0
  375. package/frontend/src/features/ai/services/ai.service.ts +5 -5
  376. package/frontend/src/features/auth/components/AuthPreview.tsx +96 -0
  377. package/frontend/src/features/auth/components/OAuthConfigDialog.tsx +54 -30
  378. package/frontend/src/features/auth/components/UserFormDialog.tsx +13 -6
  379. package/frontend/src/features/auth/components/UsersDataGrid.tsx +50 -14
  380. package/frontend/src/features/auth/components/index.ts +5 -0
  381. package/frontend/src/features/auth/helpers.tsx +208 -0
  382. package/frontend/src/features/auth/hooks/useAnonToken.ts +30 -0
  383. package/frontend/src/features/auth/hooks/useAuthConfig.ts +48 -0
  384. package/frontend/src/features/auth/hooks/useOAuthConfig.ts +14 -10
  385. package/frontend/src/features/auth/hooks/useUsers.ts +43 -5
  386. package/frontend/src/features/auth/index.ts +3 -2
  387. package/frontend/src/features/auth/pages/AuthMethodsPage.tsx +275 -0
  388. package/frontend/src/features/auth/pages/ConfigurationPage.tsx +395 -0
  389. package/frontend/src/features/auth/pages/UsersPage.tsx +257 -0
  390. package/frontend/src/features/auth/services/anonToken.service.ts +11 -0
  391. package/frontend/src/features/auth/services/config.service.ts +19 -0
  392. package/frontend/src/features/auth/services/{oauth.service.ts → oauth-config.service.ts} +4 -4
  393. package/frontend/src/features/auth/services/{auth.service.ts → user.service.ts} +7 -53
  394. package/frontend/src/features/dashboard/components/ConnectionSuccessBanner.tsx +35 -0
  395. package/frontend/src/features/dashboard/components/PromptCard.tsx +21 -0
  396. package/frontend/src/features/dashboard/components/PromptDialog.tsx +103 -0
  397. package/frontend/src/features/dashboard/components/StatsCard.tsx +50 -0
  398. package/frontend/src/features/dashboard/components/index.ts +4 -0
  399. package/frontend/src/features/dashboard/pages/DashboardPage.tsx +212 -0
  400. package/frontend/src/features/dashboard/prompts/ai-chatbot.ts +13 -0
  401. package/frontend/src/features/dashboard/prompts/crm-system.ts +13 -0
  402. package/frontend/src/features/dashboard/prompts/ecommerce-platform.ts +12 -0
  403. package/frontend/src/features/dashboard/prompts/index.ts +31 -0
  404. package/frontend/src/features/dashboard/prompts/instagram-clone.ts +11 -0
  405. package/frontend/src/features/dashboard/prompts/notion-clone.ts +14 -0
  406. package/frontend/src/features/dashboard/prompts/reddit-clone.ts +12 -0
  407. package/frontend/src/features/database/components/DatabaseDataGrid.tsx +48 -17
  408. package/frontend/src/features/database/components/ForeignKeyCell.tsx +15 -34
  409. package/frontend/src/features/database/components/ForeignKeyPopover.tsx +19 -20
  410. package/frontend/src/features/database/components/LinkRecordModal.tsx +120 -125
  411. package/frontend/src/features/database/components/RecordFormDialog.tsx +22 -33
  412. package/frontend/src/features/database/components/RecordFormField.tsx +45 -47
  413. package/frontend/src/features/database/components/SQLModal.tsx +75 -0
  414. package/frontend/src/features/database/components/TableEmptyState.tsx +6 -5
  415. package/frontend/src/features/database/components/TableForm.tsx +28 -19
  416. package/frontend/src/features/database/components/TableFormColumn.tsx +2 -3
  417. package/frontend/src/features/database/components/TableSidebar.tsx +1 -1
  418. package/frontend/src/features/database/components/TablesEmptyState.tsx +48 -0
  419. package/frontend/src/features/database/components/TemplateCard.tsx +37 -0
  420. package/frontend/src/features/database/components/TemplatePreview.tsx +92 -0
  421. package/frontend/src/features/database/components/index.ts +19 -0
  422. package/frontend/src/features/database/constants.ts +28 -2
  423. package/frontend/src/features/database/contexts/SQLEditorContext.tsx +188 -0
  424. package/frontend/src/features/database/helpers.ts +2 -2
  425. package/frontend/src/features/database/hooks/useCSVImport.ts +29 -0
  426. package/frontend/src/features/database/hooks/useDatabase.ts +66 -0
  427. package/frontend/src/features/database/hooks/useRawSQL.ts +55 -0
  428. package/frontend/src/features/database/hooks/useRecords.ts +139 -0
  429. package/frontend/src/features/database/hooks/useTables.ts +135 -0
  430. package/frontend/src/features/database/index.ts +7 -1
  431. package/frontend/src/features/database/pages/FunctionsPage.tsx +203 -0
  432. package/frontend/src/features/database/pages/IndexesPage.tsx +228 -0
  433. package/frontend/src/features/database/pages/PoliciesPage.tsx +237 -0
  434. package/frontend/src/features/database/pages/SQLEditorPage.tsx +382 -0
  435. package/frontend/src/features/database/{page/DatabasePage.tsx → pages/TablesPage.tsx} +168 -209
  436. package/frontend/src/features/database/pages/TemplatesPage.tsx +39 -0
  437. package/frontend/src/features/database/pages/TriggersPage.tsx +230 -0
  438. package/frontend/src/features/database/services/advance.service.ts +40 -0
  439. package/frontend/src/features/database/services/database.service.ts +33 -194
  440. package/frontend/src/features/database/services/record.service.ts +219 -0
  441. package/frontend/src/features/database/services/table.service.ts +58 -0
  442. package/frontend/src/features/database/templates/ai-chatbot.ts +402 -0
  443. package/frontend/src/features/database/templates/crm-system.ts +528 -0
  444. package/frontend/src/features/database/templates/ecommerce-platform.ts +553 -0
  445. package/frontend/src/features/database/templates/index.ts +34 -0
  446. package/frontend/src/features/database/templates/instagram-clone.ts +222 -0
  447. package/frontend/src/features/database/templates/notion-clone.ts +483 -0
  448. package/frontend/src/features/database/templates/reddit-clone.ts +526 -0
  449. package/frontend/src/features/functions/components/FunctionRow.tsx +2 -1
  450. package/frontend/src/features/functions/components/FunctionsSidebar.tsx +1 -1
  451. package/frontend/src/features/functions/components/SecretRow.tsx +1 -1
  452. package/frontend/src/features/functions/components/index.ts +5 -0
  453. package/frontend/src/features/functions/hooks/useFunctions.ts +4 -4
  454. package/frontend/src/features/{secrets → functions}/hooks/useSecrets.ts +5 -5
  455. package/frontend/src/features/functions/pages/FunctionsPage.tsx +148 -0
  456. package/frontend/src/features/functions/{components/SecretsContent.tsx → pages/SecretsPage.tsx} +19 -21
  457. package/frontend/src/features/functions/services/{functions.service.ts → function.service.ts} +2 -2
  458. package/frontend/src/features/{secrets/services/secrets.service.ts → functions/services/secret.service.ts} +2 -2
  459. package/frontend/src/features/login/hooks/usePartnerOrigin.ts +27 -0
  460. package/frontend/src/features/login/pages/CloudLoginPage.tsx +118 -0
  461. package/frontend/src/features/login/{page → pages}/LoginPage.tsx +16 -23
  462. package/frontend/src/features/login/services/partnership.service.ts +65 -0
  463. package/frontend/src/features/logs/components/LogsDataGrid.tsx +89 -0
  464. package/frontend/src/features/logs/components/SeverityBadge.tsx +18 -0
  465. package/frontend/src/features/logs/components/index.ts +2 -0
  466. package/frontend/src/features/logs/helpers.ts +24 -0
  467. package/frontend/src/features/logs/hooks/useAuditLogs.ts +4 -4
  468. package/frontend/src/features/logs/hooks/useLogSources.ts +137 -0
  469. package/frontend/src/features/logs/hooks/useLogs.ts +163 -0
  470. package/frontend/src/features/logs/hooks/useMcpUsage.ts +128 -0
  471. package/frontend/src/features/logs/index.ts +8 -2
  472. package/frontend/src/features/logs/{page → pages}/AuditsPage.tsx +91 -38
  473. package/frontend/src/features/logs/pages/LogsPage.tsx +152 -0
  474. package/frontend/src/features/logs/pages/MCPLogsPage.tsx +84 -0
  475. package/frontend/src/features/logs/services/audit.service.ts +63 -0
  476. package/frontend/src/features/logs/services/log.service.ts +15 -110
  477. package/frontend/src/features/logs/services/usage.service.ts +31 -0
  478. package/frontend/src/features/onboard/components/McpConnectionStatus.tsx +68 -0
  479. package/frontend/src/features/onboard/components/OnboardingModal.tsx +267 -0
  480. package/frontend/src/features/onboard/components/VideoDemoModal.tsx +38 -0
  481. package/frontend/src/features/onboard/components/index.ts +4 -0
  482. package/frontend/src/features/onboard/components/mcp/CursorDeeplinkGenerator.tsx +2 -2
  483. package/frontend/src/features/onboard/components/mcp/{mcp-helper.tsx → helpers.tsx} +8 -8
  484. package/frontend/src/features/onboard/components/mcp/index.ts +2 -3
  485. package/frontend/src/features/onboard/index.ts +13 -3
  486. package/frontend/src/features/realtime/components/ChannelRow.tsx +83 -0
  487. package/frontend/src/features/realtime/components/EditChannelModal.tsx +246 -0
  488. package/frontend/src/features/realtime/components/MessageRow.tsx +85 -0
  489. package/frontend/src/features/realtime/components/RealtimeEmptyState.tsx +30 -0
  490. package/frontend/src/features/realtime/hooks/useRealtime.ts +218 -0
  491. package/frontend/src/features/realtime/index.ts +11 -0
  492. package/frontend/src/features/realtime/pages/RealtimeChannelsPage.tsx +172 -0
  493. package/frontend/src/features/realtime/pages/RealtimeMessagesPage.tsx +211 -0
  494. package/frontend/src/features/realtime/pages/RealtimePermissionsPage.tsx +191 -0
  495. package/frontend/src/features/realtime/services/realtime.service.ts +107 -0
  496. package/frontend/src/features/storage/components/BucketEmptyState.tsx +9 -6
  497. package/frontend/src/features/storage/components/BucketFormDialog.tsx +25 -41
  498. package/frontend/src/features/storage/components/FilePreviewDialog.tsx +20 -8
  499. package/frontend/src/features/storage/components/StorageDataGrid.tsx +4 -3
  500. package/frontend/src/features/storage/components/StorageManager.tsx +23 -34
  501. package/frontend/src/features/storage/components/index.ts +12 -0
  502. package/frontend/src/features/storage/hooks/useStorage.ts +208 -0
  503. package/frontend/src/features/storage/{page → pages}/StoragePage.tsx +41 -143
  504. package/frontend/src/features/storage/services/storage.service.ts +22 -1
  505. package/frontend/src/features/visualizer/components/AuthNode.tsx +72 -56
  506. package/frontend/src/features/visualizer/components/BucketNode.tsx +4 -4
  507. package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +108 -80
  508. package/frontend/src/features/visualizer/components/TableNode.tsx +34 -41
  509. package/frontend/src/features/visualizer/components/VisualizerSkeleton.tsx +12 -4
  510. package/frontend/src/features/visualizer/pages/VisualizerPage.tsx +97 -0
  511. package/frontend/src/index.css +1 -0
  512. package/frontend/src/lib/analytics/posthog.tsx +27 -0
  513. package/frontend/src/lib/contexts/AuthContext.tsx +38 -31
  514. package/frontend/src/lib/contexts/SocketContext.tsx +123 -80
  515. package/frontend/src/{features/metadata → lib}/hooks/useMetadata.ts +1 -1
  516. package/frontend/src/lib/hooks/useToast.tsx +6 -2
  517. package/frontend/src/lib/routing/AppRoutes.tsx +99 -0
  518. package/frontend/src/lib/routing/RequireAuth.tsx +27 -0
  519. package/frontend/src/lib/utils/cloudMessaging.ts +20 -0
  520. package/frontend/src/lib/utils/menuItems.ts +207 -0
  521. package/frontend/src/lib/utils/{validation-schemas.ts → schemaValidations.ts} +10 -5
  522. package/frontend/src/lib/utils/utils.ts +32 -1
  523. package/frontend/src/vite-env.d.ts +1 -0
  524. package/frontend/tsconfig.json +25 -25
  525. package/frontend/tsconfig.node.json +9 -9
  526. package/frontend/vite.config.ts +5 -3
  527. package/functions/deno.json +24 -24
  528. package/functions/server.ts +315 -290
  529. package/functions/worker-template.js +15 -4
  530. package/i18n/README.ar.md +130 -0
  531. package/i18n/README.de.md +130 -0
  532. package/i18n/README.es.md +154 -0
  533. package/i18n/README.fr.md +134 -0
  534. package/i18n/README.hi.md +129 -0
  535. package/i18n/README.ja.md +174 -0
  536. package/i18n/README.ko.md +137 -0
  537. package/i18n/README.pt-BR.md +131 -0
  538. package/i18n/README.ru.md +129 -0
  539. package/i18n/README.zh-CN.md +133 -0
  540. package/openapi/ai.yaml +715 -688
  541. package/openapi/auth.yaml +1244 -563
  542. package/openapi/email.yaml +158 -0
  543. package/openapi/functions.yaml +475 -475
  544. package/openapi/health.yaml +29 -29
  545. package/openapi/logs.yaml +223 -223
  546. package/openapi/metadata.yaml +177 -177
  547. package/openapi/realtime.yaml +699 -0
  548. package/openapi/records.yaml +381 -381
  549. package/openapi/secrets.yaml +370 -370
  550. package/openapi/storage.yaml +875 -875
  551. package/openapi/tables.yaml +463 -463
  552. package/package.json +97 -88
  553. package/shared-schemas/package.json +31 -31
  554. package/shared-schemas/src/ai-api.schema.ts +34 -58
  555. package/shared-schemas/src/ai.schema.ts +63 -54
  556. package/shared-schemas/src/auth-api.schema.ts +352 -193
  557. package/shared-schemas/src/auth.schema.ts +43 -7
  558. package/shared-schemas/src/cloud-events.schema.ts +57 -0
  559. package/shared-schemas/src/database-api.schema.ts +35 -4
  560. package/shared-schemas/src/database.schema.ts +40 -1
  561. package/shared-schemas/src/docs.schema.ts +26 -0
  562. package/shared-schemas/src/email-api.schema.ts +30 -0
  563. package/shared-schemas/src/index.ts +5 -0
  564. package/shared-schemas/src/logs-api.schema.ts +7 -1
  565. package/shared-schemas/src/logs.schema.ts +26 -0
  566. package/shared-schemas/src/metadata.schema.ts +18 -4
  567. package/shared-schemas/src/realtime-api.schema.ts +111 -0
  568. package/shared-schemas/src/realtime.schema.ts +143 -0
  569. package/shared-schemas/tsconfig.json +21 -21
  570. package/tsconfig.json +7 -7
  571. package/zeabur/README.md +13 -0
  572. package/zeabur/template.yml +1032 -0
  573. package/.github/workflows/deploy-aws.yml +0 -130
  574. package/backend/src/api/routes/agent.ts +0 -29
  575. package/backend/src/api/routes/auth.oauth.ts +0 -482
  576. package/backend/src/api/routes/auth.ts +0 -386
  577. package/backend/src/api/routes/docs.ts +0 -66
  578. package/backend/src/api/routes/functions.ts +0 -183
  579. package/backend/src/api/routes/openapi.ts +0 -82
  580. package/backend/src/api/routes/usage.ts +0 -96
  581. package/backend/src/core/ai/client.ts +0 -242
  582. package/backend/src/core/ai/model.ts +0 -117
  583. package/backend/src/core/auth/auth.ts +0 -780
  584. package/backend/src/core/database/manager.ts +0 -178
  585. package/backend/src/core/database/table.ts +0 -772
  586. package/backend/src/core/documentation/agent.ts +0 -689
  587. package/backend/src/core/documentation/openapi.ts +0 -856
  588. package/backend/src/core/logs/analytics.ts +0 -76
  589. package/backend/src/core/logs/providers/localdb.provider.ts +0 -246
  590. package/backend/src/core/socket/socket.ts +0 -388
  591. package/backend/src/core/storage/storage.ts +0 -923
  592. package/backend/src/utils/cloud-token.ts +0 -39
  593. package/backend/src/utils/helpers.ts +0 -49
  594. package/backend/src/utils/uuid.ts +0 -9
  595. package/backend/tests/manual/test-better-auth.sh +0 -303
  596. package/docker-init/db/logs.sql +0 -9
  597. package/frontend/README.md +0 -112
  598. package/frontend/src/components/datagrid/index.tsx +0 -20
  599. package/frontend/src/components/layout/CloudLayout.tsx +0 -95
  600. package/frontend/src/features/ai/components/AIConfigDialog.tsx +0 -76
  601. package/frontend/src/features/ai/components/AIConfigForm.tsx +0 -222
  602. package/frontend/src/features/ai/components/fields/ModalityField.tsx +0 -87
  603. package/frontend/src/features/ai/components/fields/ModelSelectionField.tsx +0 -134
  604. package/frontend/src/features/ai/components/fields/SystemPromptField.tsx +0 -33
  605. package/frontend/src/features/ai/page/AIPage.tsx +0 -178
  606. package/frontend/src/features/auth/components/AddOAuthDialog.tsx +0 -106
  607. package/frontend/src/features/auth/components/AuthMethodTab.tsx +0 -238
  608. package/frontend/src/features/auth/components/UsersTab.tsx +0 -114
  609. package/frontend/src/features/auth/page/AuthenticationPage.tsx +0 -169
  610. package/frontend/src/features/dashboard/page/DashboardPage.tsx +0 -194
  611. package/frontend/src/features/database/hooks/UseLinkModal.tsx +0 -78
  612. package/frontend/src/features/functions/components/FunctionViewer.tsx +0 -46
  613. package/frontend/src/features/functions/components/FunctionsContent.tsx +0 -88
  614. package/frontend/src/features/functions/page/FunctionsPage.tsx +0 -28
  615. package/frontend/src/features/login/components/AuthErrorBoundary.tsx +0 -87
  616. package/frontend/src/features/login/components/PrivateRoute.tsx +0 -24
  617. package/frontend/src/features/login/page/CloudLoginPage.tsx +0 -93
  618. package/frontend/src/features/logs/components/AnalyticsLogsTable.tsx +0 -313
  619. package/frontend/src/features/logs/components/LogsTable.tsx +0 -199
  620. package/frontend/src/features/logs/page/AnalyticsLogsPage.tsx +0 -530
  621. package/frontend/src/features/metadata/index.ts +0 -0
  622. package/frontend/src/features/metadata/page/MetadataPage.tsx +0 -136
  623. package/frontend/src/features/onboard/components/CompletionCard.tsx +0 -41
  624. package/frontend/src/features/onboard/components/OnboardButton.tsx +0 -84
  625. package/frontend/src/features/onboard/components/StepContent.tsx +0 -91
  626. package/frontend/src/features/onboard/components/TestConnectionStep.tsx +0 -53
  627. package/frontend/src/features/onboard/components/mcp/McpInstallation.tsx +0 -144
  628. package/frontend/src/features/onboard/page/OnBoardPage.tsx +0 -104
  629. package/frontend/src/features/onboard/types.ts +0 -8
  630. package/frontend/src/features/visualizer/page/VisualizerPage.tsx +0 -127
  631. package/frontend/src/lib/contexts/OnboardStepContext.tsx +0 -68
  632. package/frontend/src/lib/hooks/useOnboardingCompletion.ts +0 -29
  633. /package/backend/src/api/{middleware → middlewares}/error.ts +0 -0
  634. /package/backend/src/api/{middleware → middlewares}/upload.ts +0 -0
  635. /package/frontend/src/{features/metadata → lib}/services/metadata.service.ts +0 -0
@@ -0,0 +1,118 @@
1
+ import { useEffect } from 'react';
2
+ import { useForm } from 'react-hook-form';
3
+ import { zodResolver } from '@hookform/resolvers/zod';
4
+ import {
5
+ Button,
6
+ Dialog,
7
+ DialogContent,
8
+ DialogHeader,
9
+ DialogTitle,
10
+ DialogFooter,
11
+ Label,
12
+ Textarea,
13
+ } from '@/components';
14
+ import {
15
+ UpdateAIConfigurationRequest,
16
+ updateAIConfigurationRequestSchema,
17
+ } from '@insforge/shared-schemas';
18
+
19
+ interface SystemPromptDialogProps {
20
+ open: boolean;
21
+ onOpenChange: (open: boolean) => void;
22
+ initialSystemPrompt: string | null | undefined;
23
+ onSuccess: (data: UpdateAIConfigurationRequest) => void;
24
+ }
25
+
26
+ export function SystemPromptDialog({
27
+ open,
28
+ onOpenChange,
29
+ initialSystemPrompt,
30
+ onSuccess,
31
+ }: SystemPromptDialogProps) {
32
+ const form = useForm<UpdateAIConfigurationRequest>({
33
+ resolver: zodResolver(updateAIConfigurationRequestSchema),
34
+ defaultValues: {
35
+ systemPrompt: initialSystemPrompt ?? null,
36
+ },
37
+ });
38
+
39
+ // Reset form when dialog opens with new data
40
+ useEffect(() => {
41
+ if (open) {
42
+ form.reset({
43
+ systemPrompt: initialSystemPrompt ?? null,
44
+ });
45
+ }
46
+ }, [open, initialSystemPrompt, form]);
47
+
48
+ const handleFormSubmit = (e: React.FormEvent) => {
49
+ e.preventDefault();
50
+ void form.handleSubmit((data: UpdateAIConfigurationRequest) => {
51
+ onSuccess(data);
52
+ onOpenChange(false);
53
+ })();
54
+ };
55
+
56
+ const handleCancel = () => {
57
+ onOpenChange(false);
58
+ };
59
+
60
+ return (
61
+ <Dialog open={open} onOpenChange={onOpenChange}>
62
+ <DialogContent
63
+ aria-describedby={undefined}
64
+ className="max-w-[600px] p-0 gap-0 border-zinc-200 shadow-[0px_1px_3px_0px_rgba(0,0,0,0.1)]"
65
+ >
66
+ <DialogHeader className="px-6 py-3 flex flex-col gap-1 justify-start border-b border-zinc-200 dark:border-neutral-700">
67
+ <DialogTitle className="text-lg font-semibold text-zinc-950 dark:text-white">
68
+ Edit System Prompt
69
+ </DialogTitle>
70
+ </DialogHeader>
71
+
72
+ <form id="system-prompt-form" onSubmit={handleFormSubmit} className="flex flex-col">
73
+ <div className="flex flex-col gap-6 p-6">
74
+ <div className="flex flex-row gap-10 items-start">
75
+ <Label
76
+ htmlFor="systemPrompt"
77
+ className="text-sm font-normal text-zinc-950 dark:text-neutral-50 whitespace-nowrap"
78
+ >
79
+ System Prompt
80
+ </Label>
81
+ <div className="flex flex-col gap-1 w-full">
82
+ <Textarea
83
+ id="systemPrompt"
84
+ {...form.register('systemPrompt')}
85
+ placeholder="Enter system prompt..."
86
+ className="w-full min-h-[160px] resize-none bg-transparent dark:bg-neutral-900 dark:text-white dark:placeholder:text-neutral-400 dark:border-neutral-700 focus:outline-none"
87
+ />
88
+ {form.formState.errors.systemPrompt && (
89
+ <p className="text-sm text-red-600 dark:text-red-500">
90
+ {form.formState.errors.systemPrompt.message}
91
+ </p>
92
+ )}
93
+ </div>
94
+ </div>
95
+ </div>
96
+ </form>
97
+
98
+ <DialogFooter className="p-6 gap-3 border-t border-zinc-200 dark:border-neutral-700">
99
+ <Button
100
+ type="button"
101
+ variant="outline"
102
+ onClick={handleCancel}
103
+ className="h-9 px-3 py-2 rounded-sm text-sm font-medium dark:bg-neutral-600 dark:text-zinc-300 dark:border-neutral-600 dark:hover:bg-neutral-700"
104
+ >
105
+ Cancel
106
+ </Button>
107
+ <Button
108
+ type="submit"
109
+ form="system-prompt-form"
110
+ className="h-9 px-3 py-2 rounded-sm text-sm font-medium bg-zinc-950 text-white hover:bg-zinc-800 disabled:opacity-40 dark:bg-emerald-300 dark:text-zinc-950 dark:hover:bg-emerald-400"
111
+ >
112
+ Save
113
+ </Button>
114
+ </DialogFooter>
115
+ </DialogContent>
116
+ </Dialog>
117
+ );
118
+ }
@@ -0,0 +1,6 @@
1
+ export { AIModelCard } from './AIConfigCard';
2
+ export { default as AIEmptyState } from './AIEmptyState';
3
+ export { ModalityFilterSidebar } from './ModalityFilterSidebar';
4
+ export { ModelSelectionDialog } from './ModelSelectionDialog';
5
+ export { ModelSelectionGrid } from './ModelSelectionGrid';
6
+ export { SystemPromptDialog } from './SystemPromptDialog';
@@ -1,26 +1,21 @@
1
- import { OpenRouterModel, ModalitySchema } from '@insforge/shared-schemas';
2
-
3
- // Type for pricing information from OpenRouter model
4
- type ModelPricing = {
5
- prompt: string;
6
- completion: string;
7
- image?: string;
8
- request?: string;
9
- webSearch?: string;
10
- internalReasoning?: string;
11
- inputCacheRead?: string;
12
- inputCacheWrite?: string;
13
- };
14
-
15
- export type ModelPriceLevel = 'FREE' | '$' | '$$' | '$$$';
16
-
1
+ import {
2
+ ModalitySchema,
3
+ AIModelSchema,
4
+ AIConfigurationWithUsageSchema,
5
+ } from '@insforge/shared-schemas';
17
6
  export interface ModelOption {
18
- value: string;
19
- label: string;
20
- company: string;
21
- priceLevel: ModelPriceLevel;
22
- priceColor: string;
7
+ id: string;
8
+ modelId: string;
9
+ modelName: string;
10
+ providerName: string;
23
11
  logo: React.ComponentType<React.SVGProps<SVGSVGElement>> | undefined;
12
+ inputModality: ModalitySchema[];
13
+ outputModality: ModalitySchema[];
14
+ priceLevel?: number;
15
+ usageStats?: {
16
+ totalRequests: number;
17
+ };
18
+ systemPrompt?: string | null;
24
19
  }
25
20
 
26
21
  import { Type, Image } from 'lucide-react';
@@ -66,7 +61,7 @@ export const getProviderDisplayName = (providerId: string): string => {
66
61
  openrouter: 'OpenRouter',
67
62
  azure: 'Azure',
68
63
  amazon: 'Amazon',
69
- xai: 'xAI',
64
+ 'x-ai': 'xAI',
70
65
  huggingface: 'HuggingFace',
71
66
  };
72
67
 
@@ -83,73 +78,64 @@ export const getProviderLogo = (
83
78
  anthropic: ClaudeIcon,
84
79
  openai: OpenAIIcon,
85
80
  google: GeminiIcon,
86
- xai: GrokIcon,
81
+ 'x-ai': GrokIcon,
87
82
  amazon: AmazonIcon,
88
83
  };
89
84
  return logoMap[providerId];
90
85
  };
91
86
 
92
- // Calculate price level based on pricing data
93
- export const calculatePriceLevel = (
94
- pricing: ModelPricing | undefined | null
95
- ): { level: ModelPriceLevel; color: string } => {
96
- if (!pricing) {
97
- return { level: 'FREE', color: 'text-green-400' };
98
- }
99
-
100
- // Check if it's free
101
- if (pricing.prompt === '0' && pricing.completion === '0') {
102
- return { level: 'FREE', color: 'text-green-400' };
103
- }
104
-
105
- // Calculate average cost per 1M tokens (prompt + completion)
106
- // Convert from per-token to per-1M-tokens
107
- const promptCostPerToken = parseFloat(pricing.prompt) || 0;
108
- const completionCostPerToken = parseFloat(pricing.completion) || 0;
109
- const promptCostPer1M = promptCostPerToken * 1000000;
110
- const completionCostPer1M = completionCostPerToken * 1000000;
111
- const avgCostPer1M = (promptCostPer1M + completionCostPer1M) / 2;
112
-
113
- // Adjusted thresholds based on actual pricing data and user feedback
114
- if (avgCostPer1M <= 3) {
115
- return { level: '$', color: 'text-green-400' };
116
- } // ≤$3/1M tokens (Haiku, Gemini Flash, etc.)
117
- if (avgCostPer1M <= 15) {
118
- return { level: '$$', color: 'text-amber-400' };
119
- } // ≤$15/1M tokens (GPT-4o, Claude Sonnet, etc.)
120
- return { level: '$$$', color: 'text-red-400' }; // >$15/1M tokens (Claude Opus, etc.)
121
- };
122
-
123
87
  // Helper function to filter AI models based on selected modalities
124
88
  export const filterModelsByModalities = (
125
- models: OpenRouterModel[],
89
+ models: AIModelSchema[],
126
90
  selectedInputModalities: ModalitySchema[],
127
91
  selectedOutputModalities: ModalitySchema[]
128
- ): OpenRouterModel[] => {
92
+ ): AIModelSchema[] => {
129
93
  if (!models?.length) {
130
94
  return [];
131
95
  }
132
96
 
133
- return models
134
- .filter((model) => {
135
- const inputModalities = new Set(model.architecture?.inputModalities || []);
136
- const outputModalities = new Set(model.architecture?.outputModalities || []);
137
- return (
138
- selectedInputModalities.every((m) => inputModalities.has(m)) &&
139
- selectedOutputModalities.every((m) => outputModalities.has(m))
140
- );
141
- })
142
- .sort((a, b) => a.name.localeCompare(b.name));
97
+ return models.filter((model) => {
98
+ const inputModalities = new Set(model.inputModality);
99
+ const outputModalities = new Set(model.outputModality);
100
+ return (
101
+ selectedInputModalities.every((m) => inputModalities.has(m)) &&
102
+ selectedOutputModalities.every((m) => outputModalities.has(m))
103
+ );
104
+ });
143
105
  };
144
106
 
145
107
  // Helper function to get friendly model name from model ID
146
- export const getFriendlyModelName = (modelId: string): string => {
147
- // Extract the model name part (after the last slash)
148
- const modelName = modelId.split('/').pop() || modelId;
149
-
108
+ export const getFriendlyModelName = (rawModelName: string): string => {
150
109
  // Convert kebab-case to Title Case
151
- return modelName
110
+ return rawModelName
152
111
  .split('-')
153
112
  .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
154
113
  .join(' ');
155
114
  };
115
+
116
+ export function toModelOption(model: AIModelSchema | AIConfigurationWithUsageSchema): ModelOption {
117
+ const [rawProviderId, rawModelName] = model.modelId.split('/');
118
+
119
+ return {
120
+ ...model,
121
+ modelName: getFriendlyModelName(rawModelName),
122
+ providerName: getProviderDisplayName(rawProviderId),
123
+ logo: getProviderLogo(rawProviderId),
124
+ };
125
+ }
126
+
127
+ // Sort models with configured ones at the end
128
+ export const sortModelsByConfigurationStatus = (
129
+ models: ModelOption[],
130
+ configuredModelIds: string[]
131
+ ): ModelOption[] => {
132
+ return [...models].sort((a, b) => {
133
+ const aConfigured = configuredModelIds.includes(a.modelId);
134
+ const bConfigured = configuredModelIds.includes(b.modelId);
135
+
136
+ if (aConfigured === bConfigured) {
137
+ return 0;
138
+ }
139
+ return aConfigured ? 1 : -1;
140
+ });
141
+ };
@@ -1,22 +1,19 @@
1
1
  import { useMemo, useCallback } from 'react';
2
2
  import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
3
3
  import { aiService } from '@/features/ai/services/ai.service';
4
- import { authService } from '@/features/auth/services/auth.service';
5
4
  import {
6
- ListModelsResponse,
7
- AIConfigurationWithUsageSchema,
8
5
  CreateAIConfigurationRequest,
9
6
  UpdateAIConfigurationRequest,
10
7
  ModalitySchema,
11
- type OpenRouterModel,
8
+ AIModelSchema,
9
+ AIConfigurationWithUsageSchema,
12
10
  } from '@insforge/shared-schemas';
13
11
  import { useToast } from '@/lib/hooks/useToast';
14
12
  import {
15
- getProviderLogo,
16
- calculatePriceLevel,
17
- getProviderDisplayName,
18
13
  filterModelsByModalities,
14
+ sortModelsByConfigurationStatus,
19
15
  type ModelOption,
16
+ toModelOption,
20
17
  } from '../helpers';
21
18
 
22
19
  interface UseAIConfigsOptions {
@@ -31,10 +28,9 @@ export function useAIConfigs(options: UseAIConfigsOptions = {}) {
31
28
  // Fetch AI models configuration
32
29
  const {
33
30
  data: modelsData,
34
- isLoading,
35
- error,
36
- refetch,
37
- } = useQuery<ListModelsResponse>({
31
+ isLoading: isLoadingModels,
32
+ error: modelsError,
33
+ } = useQuery<AIModelSchema[]>({
38
34
  queryKey: ['ai-models'],
39
35
  queryFn: () => aiService.getModels(),
40
36
  enabled: enabled,
@@ -46,7 +42,6 @@ export function useAIConfigs(options: UseAIConfigsOptions = {}) {
46
42
  data: configurations,
47
43
  isLoading: isLoadingConfigurations,
48
44
  error: configurationsError,
49
- refetch: refetchConfigurations,
50
45
  } = useQuery<AIConfigurationWithUsageSchema[]>({
51
46
  queryKey: ['ai-configurations'],
52
47
  queryFn: () => aiService.listConfigurations(),
@@ -54,14 +49,6 @@ export function useAIConfigs(options: UseAIConfigsOptions = {}) {
54
49
  staleTime: 5 * 60 * 1000, // Cache for 5 minutes
55
50
  });
56
51
 
57
- // Fetch anonymous token (shared across all configs)
58
- const { data: anonTokenData, isLoading: isLoadingAnonToken } = useQuery({
59
- queryKey: ['anon-token'],
60
- queryFn: () => authService.generateAnonToken(),
61
- enabled: enabled,
62
- staleTime: 30 * 60 * 1000, // Cache for 30 minutes since token never expires
63
- });
64
-
65
52
  // Create configuration mutation
66
53
  const createConfigurationMutation = useMutation({
67
54
  mutationFn: (data: CreateAIConfigurationRequest) => aiService.createConfiguration(data),
@@ -99,123 +86,62 @@ export function useAIConfigs(options: UseAIConfigsOptions = {}) {
99
86
  },
100
87
  });
101
88
 
102
- // Extract configured providers (memoized to maintain referential stability)
103
- const configuredTextProviders = useMemo(
104
- () => modelsData?.text?.filter((p) => p.configured) || [],
105
- [modelsData?.text]
106
- );
107
- const configuredImageProviders = useMemo(
108
- () => modelsData?.image?.filter((p) => p.configured) || [],
109
- [modelsData?.image]
89
+ // Convert configurations to ModelOptions
90
+ const configurationOptions = useMemo(
91
+ () => (configurations || []).map(toModelOption),
92
+ [configurations]
110
93
  );
111
94
 
112
- // Extract unconfigured providers
113
- const unconfiguredTextProviders = modelsData?.text?.filter((p) => !p.configured) || [];
114
- const unconfiguredImageProviders = modelsData?.image?.filter((p) => !p.configured) || [];
115
-
116
- // Get all available models (flat list)
117
- const allTextModels = modelsData?.text?.flatMap((p) => p.models) || [];
118
- const allImageModels = modelsData?.image?.flatMap((p) => p.models) || [];
119
-
120
- // All configured models from all providers (flattened with deduplication)
121
- const allConfiguredModels = useMemo(() => {
122
- const uniqueModels = new Map<string, OpenRouterModel>();
123
-
124
- [...configuredTextProviders, ...configuredImageProviders].forEach((provider) => {
125
- provider.models.forEach((model) => {
126
- // Only add if we haven't seen this model.id before
127
- if (!uniqueModels.has(model.id)) {
128
- uniqueModels.set(model.id, model);
129
- }
130
- });
131
- });
95
+ // Get configured model IDs for filtering
96
+ const configuredModelIds = useMemo(
97
+ () => configurations?.map((config) => config.modelId) || [],
98
+ [configurations]
99
+ );
132
100
 
133
- return Array.from(uniqueModels.values());
134
- }, [configuredTextProviders, configuredImageProviders]);
101
+ // All available models from all providers
102
+ const allAvailableModels = useMemo(() => modelsData || [], [modelsData]);
135
103
 
136
104
  // Helper function to get filtered and processed models
137
105
  const getFilteredModels = useCallback(
138
106
  (inputModality: ModalitySchema[], outputModality: ModalitySchema[]): ModelOption[] => {
139
- const filteredRawModels = filterModelsByModalities(
140
- allConfiguredModels,
141
- inputModality,
142
- outputModality
143
- );
144
-
145
- return filteredRawModels.map((model) => {
146
- const companyId = model.id.split('/')[0];
147
- const priceInfo = calculatePriceLevel(model.pricing);
148
-
149
- return {
150
- value: model.id,
151
- label: model.name,
152
- company: getProviderDisplayName(companyId),
153
- priceLevel: priceInfo.level,
154
- priceColor: priceInfo.color,
155
- logo: getProviderLogo(companyId),
156
- };
157
- });
107
+ // If both modality arrays are empty, return all models
108
+ const shouldFilter = inputModality.length || outputModality.length;
109
+
110
+ const filteredRawModels = shouldFilter
111
+ ? filterModelsByModalities(allAvailableModels, inputModality, outputModality)
112
+ : allAvailableModels;
113
+
114
+ // Convert to ModelOption using centralized converter
115
+ const modelOptions = filteredRawModels.map(toModelOption);
116
+
117
+ // Sort with configured models at the end
118
+ return sortModelsByConfigurationStatus(modelOptions, configuredModelIds);
158
119
  },
159
- [allConfiguredModels]
120
+ [allAvailableModels, configuredModelIds]
160
121
  );
161
122
 
162
- // Check if any providers are configured
163
- const hasConfiguredTextProviders = configuredTextProviders.length > 0;
164
- const hasConfiguredImageProviders = configuredImageProviders.length > 0;
165
- const hasAnyConfiguration = hasConfiguredTextProviders || hasConfiguredImageProviders;
166
-
167
123
  return {
168
- // Raw data
169
- modelsData,
170
- isLoading,
171
- error,
172
-
173
- // Providers by type
174
- textProviders: modelsData?.text || [],
175
- imageProviders: modelsData?.image || [],
124
+ // Models data
125
+ isLoadingModels,
126
+ modelsError,
176
127
 
177
128
  // Configured providers
178
- configuredTextProviders,
179
- configuredImageProviders,
180
- allConfiguredModels,
181
-
182
- // Unconfigured providers
183
- unconfiguredTextProviders,
184
- unconfiguredImageProviders,
185
-
186
- // Models lists
187
- allTextModels,
188
- allImageModels,
189
-
190
- // Status checks
191
- hasConfiguredTextProviders,
192
- hasConfiguredImageProviders,
193
- hasAnyConfiguration,
129
+ allAvailableModels,
194
130
 
195
131
  // Configurations data
196
- configurations: configurations || [],
197
132
  isLoadingConfigurations,
198
133
  configurationsError,
199
134
 
200
- // Anonymous token data
201
- anonKey: anonTokenData?.accessToken,
202
- isLoadingAnonToken,
203
-
204
135
  // Configuration mutations
205
136
  createConfiguration: createConfigurationMutation.mutate,
206
137
  updateConfiguration: updateConfigurationMutation.mutate,
207
138
  deleteConfiguration: deleteConfigurationMutation.mutate,
208
139
 
209
- // Mutation states
210
- isCreating: createConfigurationMutation.isPending,
211
- isUpdating: updateConfigurationMutation.isPending,
212
- isDeleting: deleteConfigurationMutation.isPending,
213
-
214
- // Operations
215
- refetch,
216
- refetchConfigurations,
217
-
218
140
  // Helper functions
219
141
  getFilteredModels,
142
+
143
+ // Return converted configurations instead of raw data
144
+ configurationOptions,
145
+ configuredModelIds,
220
146
  };
221
147
  }
@@ -70,8 +70,6 @@ export function useAIRemainingCredits(enabled = true) {
70
70
  queryKey: ['ai-remaining-credits'],
71
71
  queryFn: () => aiService.getRemainingCredits(),
72
72
  enabled: enabled,
73
- staleTime: 30 * 1000, // Cache for 30 seconds
74
- refetchInterval: 60 * 1000, // Refetch every minute
75
73
  retry: false,
76
74
  });
77
75
  }
@@ -0,0 +1,166 @@
1
+ import { useState } from 'react';
2
+ import { Plus, Loader2 } from 'lucide-react';
3
+ import { Button, ConfirmDialog } from '@/components';
4
+ import { useAIConfigs } from '../hooks/useAIConfigs';
5
+ import { useAIRemainingCredits } from '../hooks/useAIUsage';
6
+ import {
7
+ CreateAIConfigurationRequest,
8
+ UpdateAIConfigurationRequest,
9
+ } from '@insforge/shared-schemas';
10
+ import { useConfirm } from '@/lib/hooks/useConfirm';
11
+ import {
12
+ AIEmptyState,
13
+ ModelSelectionDialog,
14
+ SystemPromptDialog,
15
+ AIModelCard,
16
+ } from '@/features/ai/components';
17
+ import { isInsForgeCloudProject } from '@/lib/utils/utils';
18
+
19
+ export default function AIPage() {
20
+ const {
21
+ configurationOptions,
22
+ isLoadingConfigurations,
23
+ createConfiguration,
24
+ updateConfiguration,
25
+ deleteConfiguration,
26
+ } = useAIConfigs();
27
+
28
+ const { data: credits, error: getAICreditsError } =
29
+ useAIRemainingCredits(!isInsForgeCloudProject());
30
+
31
+ const { confirm, confirmDialogProps } = useConfirm();
32
+
33
+ // Format credits display
34
+ const formatCredits = (remaining: number) => {
35
+ if (remaining >= 1000) {
36
+ return `${(remaining / 1000).toFixed(1)}K`;
37
+ }
38
+ return remaining.toFixed(2);
39
+ };
40
+
41
+ const [modelSelectionOpen, setModelSelectionOpen] = useState(false);
42
+ const [systemPromptOpen, setSystemPromptOpen] = useState(false);
43
+ const [editingConfigId, setEditingConfigId] = useState<string | undefined>();
44
+
45
+ const handleEdit = (id: string) => {
46
+ setEditingConfigId(id);
47
+ setSystemPromptOpen(true);
48
+ };
49
+
50
+ const handleDelete = async (id: string) => {
51
+ const shouldDelete = await confirm({
52
+ title: 'Delete AI Configuration',
53
+ description:
54
+ 'Are you certain you wish to remove this AI Integration? This action is irreversible.',
55
+ confirmText: 'Delete',
56
+ destructive: true,
57
+ });
58
+
59
+ if (shouldDelete) {
60
+ deleteConfiguration(id);
61
+ }
62
+ };
63
+
64
+ const handleCreate = () => {
65
+ setModelSelectionOpen(true);
66
+ };
67
+
68
+ const handleModelSelectionSuccess = (configData: CreateAIConfigurationRequest) => {
69
+ createConfiguration({
70
+ inputModality: configData.inputModality,
71
+ outputModality: configData.outputModality,
72
+ provider: configData.provider,
73
+ modelId: configData.modelId,
74
+ });
75
+ };
76
+
77
+ // Derive the editing config from the ID
78
+ const editingConfig = configurationOptions.find((c) => c.id === editingConfigId);
79
+
80
+ const handleSystemPromptSuccess = (configData: UpdateAIConfigurationRequest) => {
81
+ if (editingConfigId) {
82
+ updateConfiguration({
83
+ id: editingConfigId,
84
+ data: {
85
+ systemPrompt: configData.systemPrompt || null,
86
+ },
87
+ });
88
+ }
89
+ };
90
+
91
+ return (
92
+ <div className="flex h-full bg-white dark:bg-neutral-800 pt-8 pb-6">
93
+ <div className="max-w-[1080px] mx-auto flex-1 flex flex-col gap-6 overflow-hidden">
94
+ {/* Header Section */}
95
+ <div className="w-full flex items-start justify-between">
96
+ <div className="flex flex-col items-start gap-2">
97
+ <div className="flex items-center gap-3">
98
+ <h1 className="text-xl font-semibold text-black dark:text-white">AI Integration</h1>
99
+ {credits?.remaining && (
100
+ <span className="text-sm font-normal text-neutral-700 dark:text-emerald-300 mt-[2.5px]">
101
+ {formatCredits(credits.remaining)} credit{credits.remaining !== 1 ? 's' : ''} left
102
+ </span>
103
+ )}
104
+ </div>
105
+ <p className="text-sm text-neutral-500 dark:text-neutral-400">
106
+ Your models are ready — build LLM-powered features or add more integrations.
107
+ </p>
108
+ </div>
109
+ <Button
110
+ className="h-9 py-2 pl-2 pr-3 text-sm font-medium gap-2 dark:text-white dark:bg-neutral-700 dark:hover:bg-neutral-600"
111
+ onClick={handleCreate}
112
+ >
113
+ <Plus className="w-5 h-5" />
114
+ New Integration
115
+ </Button>
116
+ </div>
117
+
118
+ {/* Content Section */}
119
+ <div className="flex-1 overflow-auto">
120
+ {getAICreditsError ? (
121
+ <AIEmptyState title="Configuration Error" description={getAICreditsError.message} />
122
+ ) : isLoadingConfigurations ? (
123
+ <div className="flex-1 flex items-center justify-center h-full">
124
+ <Loader2 className="w-8 h-8 animate-spin text-gray-400" />
125
+ </div>
126
+ ) : configurationOptions.length ? (
127
+ <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6">
128
+ {configurationOptions.map((modelOption) => (
129
+ <AIModelCard
130
+ key={modelOption.id}
131
+ config={modelOption}
132
+ mode="configured"
133
+ onEdit={handleEdit}
134
+ onDelete={() => void handleDelete(modelOption.id)}
135
+ />
136
+ ))}
137
+ </div>
138
+ ) : (
139
+ <AIEmptyState
140
+ title="No AI Integration Yet"
141
+ description="Add your first integration to get started"
142
+ />
143
+ )}
144
+ </div>
145
+ </div>
146
+
147
+ {/* Model Selection Dialog */}
148
+ <ModelSelectionDialog
149
+ open={modelSelectionOpen}
150
+ onOpenChange={setModelSelectionOpen}
151
+ onSuccess={handleModelSelectionSuccess}
152
+ />
153
+
154
+ {/* System Prompt Dialog */}
155
+ <SystemPromptDialog
156
+ open={systemPromptOpen}
157
+ onOpenChange={setSystemPromptOpen}
158
+ initialSystemPrompt={editingConfig?.systemPrompt}
159
+ onSuccess={handleSystemPromptSuccess}
160
+ />
161
+
162
+ {/* Confirm Dialog */}
163
+ <ConfirmDialog {...confirmDialogProps} />
164
+ </div>
165
+ );
166
+ }