insforge 0.3.2 → 1.2.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (507) hide show
  1. package/.claude-plugin/marketplace.json +20 -0
  2. package/.cursor/rules/cursor-rules.mdc +94 -0
  3. package/.dockerignore +3 -0
  4. package/.env.example +33 -4
  5. package/.github/ISSUE_TEMPLATE/bug_report.yml +13 -60
  6. package/.github/ISSUE_TEMPLATE/config.yml +2 -2
  7. package/.github/ISSUE_TEMPLATE/feature_request.yml +10 -63
  8. package/.github/PULL_REQUEST_TEMPLATE.md +7 -0
  9. package/.github/workflows/build-image.yml +2 -1
  10. package/.github/workflows/e2e.yml +63 -0
  11. package/CHANGELOG.md +41 -0
  12. package/CLAUDE_PLUGIN.md +104 -0
  13. package/CODE_OF_CONDUCT.md +128 -0
  14. package/CONTRIBUTING.md +1 -1
  15. package/Dockerfile +4 -1
  16. package/README.md +66 -18
  17. package/assets/mcpInstallv2.png +0 -0
  18. package/assets/sampleResponse.png +0 -0
  19. package/auth/index.html +13 -0
  20. package/auth/package.json +28 -0
  21. package/auth/public/favicon.ico +0 -0
  22. package/auth/src/App.tsx +33 -0
  23. package/auth/src/components/ErrorCard.tsx +37 -0
  24. package/auth/src/components/Layout.tsx +13 -0
  25. package/auth/src/index.css +19 -0
  26. package/auth/src/lib/broadcastService.ts +115 -0
  27. package/auth/src/lib/utils.ts +11 -0
  28. package/auth/src/main.tsx +22 -0
  29. package/auth/src/pages/ForgotPasswordPage.tsx +11 -0
  30. package/auth/src/pages/ResetPasswordPage.tsx +11 -0
  31. package/auth/src/pages/SignInPage.tsx +57 -0
  32. package/auth/src/pages/SignUpPage.tsx +57 -0
  33. package/auth/src/pages/VerifyEmailPage.tsx +20 -0
  34. package/auth/src/vite-env.d.ts +10 -0
  35. package/auth/tsconfig.json +32 -0
  36. package/auth/tsconfig.node.json +11 -0
  37. package/auth/vite.config.ts +25 -0
  38. package/backend/package.json +9 -9
  39. package/backend/src/api/{middleware → middlewares}/auth.ts +8 -9
  40. package/backend/src/api/middlewares/rate-limiters.ts +127 -0
  41. package/backend/src/api/routes/{ai.ts → ai/index.routes.ts} +20 -24
  42. package/backend/src/api/routes/auth/index.routes.ts +570 -0
  43. package/backend/src/api/routes/auth/oauth.routes.ts +448 -0
  44. package/backend/src/api/routes/{database.advance.ts → database/advance.routes.ts} +107 -65
  45. package/backend/src/api/routes/database/index.routes.ts +13 -0
  46. package/backend/src/api/routes/{database.records.ts → database/records.routes.ts} +22 -8
  47. package/backend/src/api/routes/{database.tables.ts → database/tables.routes.ts} +20 -23
  48. package/backend/src/api/routes/docs/index.routes.ts +76 -0
  49. package/backend/src/api/routes/functions/index.routes.ts +188 -0
  50. package/backend/src/api/routes/{logs.ts → logs/index.routes.ts} +25 -30
  51. package/backend/src/api/routes/{metadata.ts → metadata/index.routes.ts} +21 -31
  52. package/backend/src/api/routes/{secrets.ts → secrets/index.routes.ts} +27 -22
  53. package/backend/src/api/routes/{storage.ts → storage/index.routes.ts} +34 -53
  54. package/backend/src/api/routes/usage/index.routes.ts +89 -0
  55. package/backend/src/infra/config/app.config.ts +51 -0
  56. package/backend/src/{core/database/manager.ts → infra/database/database.manager.ts} +76 -85
  57. package/backend/src/infra/database/migrations/013_create-auth-schema-functions.sql +44 -0
  58. package/backend/src/infra/database/migrations/014_add-updated-at-trigger-user-table.sql +8 -0
  59. package/backend/src/infra/database/migrations/015_create-auth-config-and-email-otp-tables.sql +60 -0
  60. package/backend/src/infra/database/migrations/016_update-auth-config-and-email-otp.sql +24 -0
  61. package/backend/src/{core/secrets/encryption.ts → infra/security/encryption.manager.ts} +3 -2
  62. package/backend/src/infra/security/token.manager.ts +125 -0
  63. package/backend/src/{core/socket/socket.ts → infra/socket/socket.manager.ts} +15 -15
  64. package/backend/src/providers/ai/openrouter.provider.ts +377 -0
  65. package/backend/src/providers/email/base.provider.ts +41 -0
  66. package/backend/src/providers/email/cloud.provider.ts +187 -0
  67. package/backend/src/{core/logs/providers → providers/logs}/base.provider.ts +11 -11
  68. package/backend/src/{core/logs/providers → providers/logs}/cloudwatch.provider.ts +61 -38
  69. package/backend/src/providers/logs/local.provider.ts +185 -0
  70. package/backend/src/providers/oauth/base.provider.ts +29 -0
  71. package/backend/src/providers/oauth/discord.provider.ts +195 -0
  72. package/backend/src/providers/oauth/facebook.provider.ts +194 -0
  73. package/backend/src/providers/oauth/github.provider.ts +208 -0
  74. package/backend/src/providers/oauth/google.provider.ts +249 -0
  75. package/backend/src/providers/oauth/index.ts +7 -0
  76. package/backend/src/providers/oauth/linkedin.provider.ts +240 -0
  77. package/backend/src/providers/oauth/microsoft.provider.ts +169 -0
  78. package/backend/src/providers/oauth/x.provider.ts +202 -0
  79. package/backend/src/providers/storage/base.provider.ts +29 -0
  80. package/backend/src/providers/storage/local.provider.ts +103 -0
  81. package/backend/src/providers/storage/s3.provider.ts +313 -0
  82. package/backend/src/server.ts +70 -74
  83. package/backend/src/{core/ai/config.ts → services/ai/ai-config.service.ts} +19 -24
  84. package/backend/src/services/ai/ai-model.service.ts +60 -0
  85. package/backend/src/{core/ai/usage.ts → services/ai/ai-usage.service.ts} +28 -35
  86. package/backend/src/{core/ai/chat.ts → services/ai/chat-completion.service.ts} +37 -24
  87. package/backend/src/services/ai/helpers.ts +64 -0
  88. package/backend/src/{core/ai/image.ts → services/ai/image-generation.service.ts} +17 -19
  89. package/backend/src/services/ai/index.ts +13 -0
  90. package/backend/src/services/auth/auth-config.service.ts +250 -0
  91. package/backend/src/services/auth/auth-otp.service.ts +424 -0
  92. package/backend/src/services/auth/auth.service.ts +1136 -0
  93. package/backend/src/services/auth/index.ts +4 -0
  94. package/backend/src/{core/auth/oauth.ts → services/auth/oauth-config.service.ts} +106 -52
  95. package/backend/src/{core/database/advance.ts → services/database/database-advance.service.ts} +97 -131
  96. package/backend/src/services/database/database-table.service.ts +811 -0
  97. package/backend/src/services/email/email.service.ts +75 -0
  98. package/backend/src/{core/functions/functions.ts → services/functions/function.service.ts} +95 -88
  99. package/backend/src/{core/logs/audit.ts → services/logs/audit.service.ts} +92 -75
  100. package/backend/src/services/logs/log.service.ts +73 -0
  101. package/backend/src/{core/secrets/secrets.ts → services/secrets/secret.service.ts} +48 -66
  102. package/backend/src/services/storage/storage.service.ts +617 -0
  103. package/backend/src/services/usage/usage.service.ts +149 -0
  104. package/backend/src/types/auth.ts +66 -2
  105. package/backend/src/types/email.ts +8 -0
  106. package/backend/src/types/error-constants.ts +4 -0
  107. package/backend/src/types/logs.ts +0 -29
  108. package/backend/src/{core/socket/types.ts → types/socket.ts} +5 -6
  109. package/backend/src/utils/environment.ts +9 -3
  110. package/backend/src/utils/logger.ts +20 -2
  111. package/backend/src/utils/seed.ts +150 -57
  112. package/backend/src/utils/sql-parser.ts +1 -1
  113. package/backend/src/utils/utils.ts +114 -0
  114. package/backend/src/utils/validations.ts +40 -4
  115. package/backend/tests/local/test-ai-config.sh +129 -0
  116. package/backend/tests/local/test-ai-usage.sh +80 -0
  117. package/backend/tests/local/test-auth-router.sh +1 -1
  118. package/backend/tests/local/test-e2e.sh +1 -1
  119. package/backend/tests/local/test-functions.sh +123 -0
  120. package/backend/tests/local/test-logs.sh +132 -0
  121. package/backend/tests/local/test-public-bucket.sh +3 -3
  122. package/backend/tests/local/test-secrets.sh +14 -12
  123. package/backend/tests/local/test-traditional-rest.sh +2 -2
  124. package/backend/tests/manual/test-rawsql-modes.sh +244 -0
  125. package/backend/tests/test-config.sh +37 -1
  126. package/backend/tests/unit/cloud-token.test.ts +48 -0
  127. package/backend/tests/unit/constant.test.ts +8 -0
  128. package/backend/tests/unit/email.test.ts +372 -0
  129. package/backend/tests/unit/environment.test.ts +59 -0
  130. package/backend/tests/unit/helpers.test.ts +63 -0
  131. package/backend/tests/unit/logger.test.ts +22 -0
  132. package/backend/tests/unit/rate-limit.test.ts +154 -0
  133. package/backend/tests/unit/response.test.ts +58 -0
  134. package/backend/tests/unit/sql-parser.test.ts +74 -0
  135. package/backend/tests/unit/uuid.test.ts +21 -0
  136. package/backend/tests/unit/validations.test.ts +80 -0
  137. package/backend/tsconfig.json +1 -1
  138. package/backend/vitest.config.ts +11 -0
  139. package/claude-plugin/.claude-plugin/plugin.json +24 -0
  140. package/claude-plugin/README.md +133 -0
  141. package/claude-plugin/skills/insforge-schema-patterns/SKILL.md +270 -0
  142. package/docker-compose.prod.yml +60 -4
  143. package/docker-compose.yml +65 -4
  144. package/docker-init/db/db-init.sql +6 -34
  145. package/docker-init/logs/vector.yml +236 -0
  146. package/docs/README.md +44 -0
  147. package/docs/changelog.mdx +67 -0
  148. package/docs/core-concepts/ai/architecture.mdx +373 -0
  149. package/docs/core-concepts/ai/sdk.mdx +213 -0
  150. package/docs/core-concepts/authentication/architecture.mdx +278 -0
  151. package/docs/core-concepts/authentication/sdk.mdx +414 -0
  152. package/docs/core-concepts/authentication/ui-components/customization.mdx +529 -0
  153. package/docs/core-concepts/authentication/ui-components/nextjs.mdx +221 -0
  154. package/docs/core-concepts/authentication/ui-components/react-router.mdx +184 -0
  155. package/docs/core-concepts/authentication/ui-components/react.mdx +129 -0
  156. package/docs/core-concepts/database/architecture.mdx +256 -0
  157. package/docs/core-concepts/database/sdk.mdx +382 -0
  158. package/docs/core-concepts/functions/architecture.mdx +105 -0
  159. package/docs/core-concepts/functions/sdk.mdx +184 -0
  160. package/docs/core-concepts/storage/architecture.mdx +243 -0
  161. package/docs/core-concepts/storage/sdk.mdx +253 -0
  162. package/docs/deployment/README.md +94 -0
  163. package/docs/deployment/deploy-to-aws-ec2.md +565 -0
  164. package/docs/deployment/deploy-to-azure-virtual-machines.md +313 -0
  165. package/docs/deployment/deploy-to-google-cloud-compute-engine.md +613 -0
  166. package/docs/deployment/deploy-to-render.md +441 -0
  167. package/docs/docs.json +210 -0
  168. package/docs/examples/framework-guides/nextjs.mdx +131 -0
  169. package/docs/examples/framework-guides/nuxt.mdx +165 -0
  170. package/docs/examples/framework-guides/react.mdx +165 -0
  171. package/docs/examples/framework-guides/svelte.mdx +153 -0
  172. package/docs/examples/framework-guides/vue.mdx +159 -0
  173. package/docs/examples/overview.mdx +67 -0
  174. package/docs/favicon.svg +19 -0
  175. package/docs/images/changelog/nov-2025/auth-components.webp +0 -0
  176. package/docs/images/changelog/nov-2025/database-metadata.webp +0 -0
  177. package/docs/images/changelog/nov-2025/quickstart-prompts.webp +0 -0
  178. package/docs/images/changelog/nov-2025/sql-editor.webp +0 -0
  179. package/docs/images/changelog/nov-2025/usage-page.webp +0 -0
  180. package/docs/images/changelog/october-2025/csv-upload.webp +0 -0
  181. package/docs/images/changelog/october-2025/logs-feature.webp +0 -0
  182. package/docs/images/changelog/october-2025/oauth-providers.webp +0 -0
  183. package/docs/images/checks-passed.png +0 -0
  184. package/docs/images/dashboard-connect-expanded.png +0 -0
  185. package/docs/images/dashboard-connect.png +0 -0
  186. package/docs/images/hero-dark.png +0 -0
  187. package/docs/images/hero-light.png +0 -0
  188. package/docs/images/icons/ai.svg +4 -0
  189. package/docs/images/icons/auth.svg +1 -0
  190. package/docs/images/icons/database.svg +1 -0
  191. package/docs/images/icons/function.svg +1 -0
  192. package/docs/images/icons/storage.svg +1 -0
  193. package/docs/images/logos/nextjs.svg +4 -0
  194. package/docs/images/logos/nuxt.svg +4 -0
  195. package/docs/images/logos/react.svg +5 -0
  196. package/docs/images/logos/svelte.svg +4 -0
  197. package/docs/images/logos/vue.svg +5 -0
  198. package/docs/images/mcp-install.png +0 -0
  199. package/docs/images/onboarding-mcp.png +0 -0
  200. package/docs/insforge-instructions-sdk.md +55 -374
  201. package/docs/introduction.mdx +45 -0
  202. package/docs/logo/dark.svg +22 -0
  203. package/docs/logo/light.svg +20 -0
  204. package/docs/partnership.mdx +647 -0
  205. package/docs/quickstart.mdx +83 -0
  206. package/docs/showcase/2048-arena.png +0 -0
  207. package/docs/showcase/framegen-cloud.png +0 -0
  208. package/docs/showcase/line-connect-race.png +0 -0
  209. package/docs/showcase/moment-vibe.png +0 -0
  210. package/docs/showcase/national-flags.png +0 -0
  211. package/docs/showcase/pokemon-vibe.png +0 -0
  212. package/docs/showcase/pure-browse-buy.png +0 -0
  213. package/docs/showcase.mdx +52 -0
  214. package/docs/snippets/sdk-installation.mdx +22 -0
  215. package/docs/snippets/service-icons.mdx +27 -0
  216. package/eslint.config.js +10 -3
  217. package/frontend/package.json +10 -4
  218. package/frontend/src/App.tsx +13 -82
  219. package/frontend/src/assets/icons/connected.svg +3 -0
  220. package/frontend/src/assets/icons/loader.svg +9 -0
  221. package/frontend/src/assets/logos/apple.svg +4 -0
  222. package/frontend/src/assets/logos/discord.svg +1 -1
  223. package/frontend/src/assets/logos/facebook.svg +3 -0
  224. package/frontend/src/assets/logos/instagram.svg +2 -0
  225. package/frontend/src/assets/logos/linkedin.svg +3 -0
  226. package/frontend/src/assets/logos/microsoft.svg +1 -0
  227. package/frontend/src/assets/logos/spotify.svg +17 -0
  228. package/frontend/src/assets/logos/tiktok.svg +6 -0
  229. package/frontend/src/assets/logos/x.svg +3 -0
  230. package/frontend/src/components/Checkbox.tsx +27 -29
  231. package/frontend/src/components/CodeBlock.tsx +55 -2
  232. package/frontend/src/components/CodeEditor.tsx +92 -0
  233. package/frontend/src/components/ConfirmDialog.tsx +1 -1
  234. package/frontend/src/components/ConnectCTA.tsx +38 -0
  235. package/frontend/src/components/CopyButton.tsx +52 -15
  236. package/frontend/src/components/ErrorState.tsx +1 -2
  237. package/frontend/src/components/FeatureSidebar.tsx +6 -6
  238. package/frontend/src/components/FeatureSidebarItem.tsx +2 -2
  239. package/frontend/src/components/JsonHighlight.tsx +21 -9
  240. package/frontend/src/components/ProjectInfoModal.tsx +128 -0
  241. package/frontend/src/components/PromptDialog.tsx +1 -4
  242. package/frontend/src/components/SearchInput.tsx +1 -2
  243. package/frontend/src/components/Stepper.tsx +53 -0
  244. package/frontend/src/components/ThemeToggle.tsx +3 -3
  245. package/frontend/src/components/datagrid/DataGrid.tsx +25 -32
  246. package/frontend/src/components/datagrid/cell-editors/DateCellEditor.tsx +1 -2
  247. package/frontend/src/components/datagrid/cell-editors/JsonCellEditor.tsx +2 -4
  248. package/frontend/src/components/datagrid/index.ts +23 -0
  249. package/frontend/src/components/index.ts +23 -30
  250. package/frontend/src/components/layout/AppHeader.tsx +133 -92
  251. package/frontend/src/components/layout/AppSidebar.tsx +80 -170
  252. package/frontend/src/components/layout/Layout.tsx +12 -23
  253. package/frontend/src/components/layout/PrimaryMenu.tsx +187 -0
  254. package/frontend/src/components/layout/SecondaryMenu.tsx +70 -0
  255. package/frontend/src/components/layout/index.ts +5 -0
  256. package/frontend/src/components/radix/Tooltip.tsx +24 -13
  257. package/frontend/src/components/radix/index.ts +22 -0
  258. package/frontend/src/features/ai/components/AIConfigCard.tsx +129 -83
  259. package/frontend/src/features/ai/components/AIEmptyState.tsx +12 -7
  260. package/frontend/src/features/ai/components/ModalityFilterSidebar.tsx +101 -0
  261. package/frontend/src/features/ai/components/ModelSelectionDialog.tsx +135 -0
  262. package/frontend/src/features/ai/components/ModelSelectionGrid.tsx +51 -0
  263. package/frontend/src/features/ai/components/SystemPromptDialog.tsx +118 -0
  264. package/frontend/src/features/ai/components/index.ts +6 -0
  265. package/frontend/src/features/ai/helpers.ts +57 -71
  266. package/frontend/src/features/ai/hooks/useAIConfigs.ts +39 -113
  267. package/frontend/src/features/ai/hooks/useAIUsage.ts +0 -2
  268. package/frontend/src/features/ai/page/AIPage.tsx +67 -79
  269. package/frontend/src/features/ai/services/ai.service.ts +5 -5
  270. package/frontend/src/features/auth/components/AuthPreview.tsx +96 -0
  271. package/frontend/src/features/auth/components/OAuthConfigDialog.tsx +53 -30
  272. package/frontend/src/features/auth/components/UserFormDialog.tsx +13 -6
  273. package/frontend/src/features/auth/components/UsersDataGrid.tsx +44 -14
  274. package/frontend/src/features/auth/components/index.ts +5 -0
  275. package/frontend/src/features/auth/helpers.tsx +200 -0
  276. package/frontend/src/features/auth/hooks/useAnonToken.ts +30 -0
  277. package/frontend/src/features/auth/hooks/useAuthConfig.ts +48 -0
  278. package/frontend/src/features/auth/hooks/useOAuthConfig.ts +14 -10
  279. package/frontend/src/features/auth/hooks/useUsers.ts +43 -5
  280. package/frontend/src/features/auth/index.ts +3 -2
  281. package/frontend/src/features/auth/page/AuthMethodsPage.tsx +275 -0
  282. package/frontend/src/features/auth/page/ConfigurationPage.tsx +395 -0
  283. package/frontend/src/features/auth/page/UsersPage.tsx +285 -0
  284. package/frontend/src/features/auth/services/anonToken.service.ts +11 -0
  285. package/frontend/src/features/auth/services/config.service.ts +19 -0
  286. package/frontend/src/features/auth/services/{oauth.service.ts → oauth-config.service.ts} +4 -4
  287. package/frontend/src/features/auth/services/{auth.service.ts → user.service.ts} +7 -53
  288. package/frontend/src/features/dashboard/components/ConnectionSuccessBanner.tsx +35 -0
  289. package/frontend/src/features/dashboard/components/PromptCard.tsx +21 -0
  290. package/frontend/src/features/dashboard/components/PromptDialog.tsx +103 -0
  291. package/frontend/src/features/dashboard/components/StatsCard.tsx +50 -0
  292. package/frontend/src/features/dashboard/components/index.ts +4 -0
  293. package/frontend/src/features/dashboard/page/DashboardPage.tsx +187 -169
  294. package/frontend/src/features/dashboard/prompts/ai-chatbot.ts +13 -0
  295. package/frontend/src/features/dashboard/prompts/crm-system.ts +13 -0
  296. package/frontend/src/features/dashboard/prompts/ecommerce-platform.ts +12 -0
  297. package/frontend/src/features/dashboard/prompts/index.ts +31 -0
  298. package/frontend/src/features/dashboard/prompts/instagram-clone.ts +11 -0
  299. package/frontend/src/features/dashboard/prompts/notion-clone.ts +14 -0
  300. package/frontend/src/features/dashboard/prompts/reddit-clone.ts +12 -0
  301. package/frontend/src/features/database/components/DatabaseDataGrid.tsx +48 -17
  302. package/frontend/src/features/database/components/ForeignKeyCell.tsx +15 -34
  303. package/frontend/src/features/database/components/ForeignKeyPopover.tsx +19 -20
  304. package/frontend/src/features/database/components/LinkRecordModal.tsx +120 -125
  305. package/frontend/src/features/database/components/RecordFormDialog.tsx +22 -33
  306. package/frontend/src/features/database/components/RecordFormField.tsx +45 -47
  307. package/frontend/src/features/database/components/TableEmptyState.tsx +6 -5
  308. package/frontend/src/features/database/components/TableForm.tsx +28 -15
  309. package/frontend/src/features/database/components/TableFormColumn.tsx +2 -3
  310. package/frontend/src/features/database/components/TableSidebar.tsx +1 -1
  311. package/frontend/src/features/database/components/TablesEmptyState.tsx +48 -0
  312. package/frontend/src/features/database/components/TemplateCard.tsx +37 -0
  313. package/frontend/src/features/database/components/TemplatePreview.tsx +92 -0
  314. package/frontend/src/features/database/components/index.ts +19 -0
  315. package/frontend/src/features/database/constants.ts +28 -2
  316. package/frontend/src/features/database/contexts/SQLEditorContext.tsx +188 -0
  317. package/frontend/src/features/database/helpers.ts +2 -2
  318. package/frontend/src/features/database/hooks/useCSVImport.ts +29 -0
  319. package/frontend/src/features/database/hooks/useFullMetadata.ts +18 -0
  320. package/frontend/src/features/database/hooks/useRawSQL.ts +55 -0
  321. package/frontend/src/features/database/hooks/useRecords.ts +139 -0
  322. package/frontend/src/features/database/hooks/useTables.ts +131 -0
  323. package/frontend/src/features/database/index.ts +6 -1
  324. package/frontend/src/features/database/page/FunctionsPage.tsx +211 -0
  325. package/frontend/src/features/database/page/IndexesPage.tsx +240 -0
  326. package/frontend/src/features/database/page/PoliciesPage.tsx +248 -0
  327. package/frontend/src/features/database/page/SQLEditorPage.tsx +382 -0
  328. package/frontend/src/features/database/page/{DatabasePage.tsx → TablesPage.tsx} +186 -185
  329. package/frontend/src/features/database/page/TemplatesPage.tsx +39 -0
  330. package/frontend/src/features/database/page/TriggersPage.tsx +242 -0
  331. package/frontend/src/features/database/services/advance.service.ts +66 -0
  332. package/frontend/src/features/database/services/{database.service.ts → record.service.ts} +67 -64
  333. package/frontend/src/features/database/services/table.service.ts +64 -0
  334. package/frontend/src/features/database/templates/ai-chatbot.ts +402 -0
  335. package/frontend/src/features/database/templates/crm-system.ts +528 -0
  336. package/frontend/src/features/database/templates/ecommerce-platform.ts +553 -0
  337. package/frontend/src/features/database/templates/index.ts +34 -0
  338. package/frontend/src/features/database/templates/instagram-clone.ts +222 -0
  339. package/frontend/src/features/database/templates/notion-clone.ts +483 -0
  340. package/frontend/src/features/database/templates/reddit-clone.ts +526 -0
  341. package/frontend/src/features/functions/components/FunctionRow.tsx +2 -1
  342. package/frontend/src/features/functions/components/FunctionsSidebar.tsx +1 -1
  343. package/frontend/src/features/functions/components/SecretRow.tsx +1 -1
  344. package/frontend/src/features/functions/components/index.ts +5 -0
  345. package/frontend/src/features/functions/hooks/useFunctions.ts +4 -4
  346. package/frontend/src/features/{secrets → functions}/hooks/useSecrets.ts +5 -5
  347. package/frontend/src/features/functions/page/FunctionsPage.tsx +160 -17
  348. package/frontend/src/features/functions/{components/SecretsContent.tsx → page/SecretsPage.tsx} +8 -12
  349. package/frontend/src/features/functions/services/{functions.service.ts → function.service.ts} +2 -2
  350. package/frontend/src/features/{secrets/services/secrets.service.ts → functions/services/secret.service.ts} +2 -2
  351. package/frontend/src/features/login/hooks/usePartnerOrigin.ts +27 -0
  352. package/frontend/src/features/login/page/CloudLoginPage.tsx +79 -54
  353. package/frontend/src/features/login/page/LoginPage.tsx +16 -23
  354. package/frontend/src/features/login/services/partnership.service.ts +65 -0
  355. package/frontend/src/features/logs/components/LogsDataGrid.tsx +89 -0
  356. package/frontend/src/features/logs/components/SeverityBadge.tsx +18 -0
  357. package/frontend/src/features/logs/components/index.ts +2 -0
  358. package/frontend/src/features/logs/helpers.ts +24 -0
  359. package/frontend/src/features/logs/hooks/useAuditLogs.ts +4 -4
  360. package/frontend/src/features/logs/hooks/useLogSources.ts +137 -0
  361. package/frontend/src/features/logs/hooks/useLogs.ts +163 -0
  362. package/frontend/src/features/logs/hooks/useMcpUsage.ts +181 -0
  363. package/frontend/src/features/logs/index.ts +8 -2
  364. package/frontend/src/features/logs/page/AuditsPage.tsx +91 -38
  365. package/frontend/src/features/logs/page/LogsPage.tsx +152 -0
  366. package/frontend/src/features/logs/page/MCPLogsPage.tsx +84 -0
  367. package/frontend/src/features/logs/services/audit.service.ts +63 -0
  368. package/frontend/src/features/logs/services/log.service.ts +15 -110
  369. package/frontend/src/features/logs/services/usage.service.ts +31 -0
  370. package/frontend/src/features/onboard/components/McpConnectionStatus.tsx +68 -0
  371. package/frontend/src/features/onboard/components/OnboardingModal.tsx +267 -0
  372. package/frontend/src/features/onboard/components/VideoDemoModal.tsx +38 -0
  373. package/frontend/src/features/onboard/components/index.ts +4 -0
  374. package/frontend/src/features/onboard/components/mcp/CursorDeeplinkGenerator.tsx +2 -2
  375. package/frontend/src/features/onboard/components/mcp/{mcp-helper.tsx → helpers.tsx} +8 -8
  376. package/frontend/src/features/onboard/components/mcp/index.ts +2 -3
  377. package/frontend/src/features/onboard/index.ts +13 -3
  378. package/frontend/src/features/storage/components/BucketEmptyState.tsx +9 -6
  379. package/frontend/src/features/storage/components/BucketFormDialog.tsx +25 -41
  380. package/frontend/src/features/storage/components/FilePreviewDialog.tsx +20 -8
  381. package/frontend/src/features/storage/components/StorageDataGrid.tsx +4 -3
  382. package/frontend/src/features/storage/components/StorageManager.tsx +23 -34
  383. package/frontend/src/features/storage/components/index.ts +12 -0
  384. package/frontend/src/features/storage/hooks/useStorage.ts +208 -0
  385. package/frontend/src/features/storage/page/StoragePage.tsx +41 -115
  386. package/frontend/src/features/storage/services/storage.service.ts +22 -1
  387. package/frontend/src/features/visualizer/components/AuthNode.tsx +72 -56
  388. package/frontend/src/features/visualizer/components/BucketNode.tsx +4 -4
  389. package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +108 -80
  390. package/frontend/src/features/visualizer/components/TableNode.tsx +34 -41
  391. package/frontend/src/features/visualizer/components/VisualizerSkeleton.tsx +12 -4
  392. package/frontend/src/features/visualizer/page/VisualizerPage.tsx +33 -29
  393. package/frontend/src/index.css +1 -0
  394. package/frontend/src/lib/analytics/posthog.tsx +27 -0
  395. package/frontend/src/lib/contexts/AuthContext.tsx +38 -31
  396. package/frontend/src/lib/contexts/SocketContext.tsx +5 -6
  397. package/frontend/src/{features/metadata → lib}/hooks/useMetadata.ts +1 -1
  398. package/frontend/src/lib/hooks/useToast.tsx +6 -2
  399. package/frontend/src/lib/routing/AppRoutes.tsx +84 -0
  400. package/frontend/src/lib/routing/RequireAuth.tsx +27 -0
  401. package/frontend/src/lib/utils/cloudMessaging.ts +20 -0
  402. package/frontend/src/lib/utils/menuItems.ts +183 -0
  403. package/frontend/src/lib/utils/{validation-schemas.ts → schemaValidations.ts} +10 -5
  404. package/frontend/src/lib/utils/utils.ts +19 -1
  405. package/frontend/src/vite-env.d.ts +1 -0
  406. package/frontend/vite.config.ts +5 -3
  407. package/functions/server.ts +28 -3
  408. package/functions/worker-template.js +15 -4
  409. package/i18n/README.ar.md +130 -0
  410. package/i18n/README.de.md +130 -0
  411. package/i18n/README.es.md +154 -0
  412. package/i18n/README.fr.md +134 -0
  413. package/i18n/README.hi.md +129 -0
  414. package/i18n/README.ja.md +174 -0
  415. package/i18n/README.ko.md +137 -0
  416. package/i18n/README.pt-BR.md +131 -0
  417. package/i18n/README.ru.md +129 -0
  418. package/i18n/README.zh-CN.md +133 -0
  419. package/openapi/ai.yaml +31 -4
  420. package/openapi/auth.yaml +827 -146
  421. package/package.json +16 -7
  422. package/shared-schemas/package.json +1 -1
  423. package/shared-schemas/src/ai-api.schema.ts +34 -58
  424. package/shared-schemas/src/ai.schema.ts +5 -0
  425. package/shared-schemas/src/auth-api.schema.ts +154 -8
  426. package/shared-schemas/src/auth.schema.ts +42 -6
  427. package/shared-schemas/src/cloud-events.schema.ts +57 -0
  428. package/shared-schemas/src/database-api.schema.ts +3 -3
  429. package/shared-schemas/src/database.schema.ts +1 -1
  430. package/shared-schemas/src/index.ts +1 -0
  431. package/shared-schemas/src/logs-api.schema.ts +7 -1
  432. package/shared-schemas/src/logs.schema.ts +26 -0
  433. package/shared-schemas/src/metadata.schema.ts +9 -4
  434. package/test-gemini.sh +35 -0
  435. package/test-usage-admin.sh +57 -0
  436. package/test-usage.sh +50 -0
  437. package/zeabur/README.md +13 -0
  438. package/zeabur/template.yml +1032 -0
  439. package/.github/workflows/deploy-aws.yml +0 -130
  440. package/backend/src/api/routes/agent.ts +0 -29
  441. package/backend/src/api/routes/auth.oauth.ts +0 -482
  442. package/backend/src/api/routes/auth.ts +0 -386
  443. package/backend/src/api/routes/docs.ts +0 -66
  444. package/backend/src/api/routes/functions.ts +0 -183
  445. package/backend/src/api/routes/openapi.ts +0 -82
  446. package/backend/src/api/routes/usage.ts +0 -96
  447. package/backend/src/core/ai/client.ts +0 -242
  448. package/backend/src/core/ai/model.ts +0 -117
  449. package/backend/src/core/auth/auth.ts +0 -781
  450. package/backend/src/core/database/table.ts +0 -772
  451. package/backend/src/core/documentation/agent.ts +0 -689
  452. package/backend/src/core/documentation/openapi.ts +0 -856
  453. package/backend/src/core/logs/analytics.ts +0 -76
  454. package/backend/src/core/logs/providers/localdb.provider.ts +0 -246
  455. package/backend/src/core/storage/storage.ts +0 -923
  456. package/backend/src/utils/cloud-token.ts +0 -39
  457. package/backend/src/utils/helpers.ts +0 -49
  458. package/backend/src/utils/uuid.ts +0 -9
  459. package/backend/tests/manual/test-better-auth.sh +0 -303
  460. package/docker-init/db/logs.sql +0 -9
  461. package/frontend/README.md +0 -112
  462. package/frontend/src/components/datagrid/index.tsx +0 -20
  463. package/frontend/src/components/layout/CloudLayout.tsx +0 -95
  464. package/frontend/src/features/ai/components/AIConfigDialog.tsx +0 -76
  465. package/frontend/src/features/ai/components/AIConfigForm.tsx +0 -222
  466. package/frontend/src/features/ai/components/fields/ModalityField.tsx +0 -87
  467. package/frontend/src/features/ai/components/fields/ModelSelectionField.tsx +0 -134
  468. package/frontend/src/features/ai/components/fields/SystemPromptField.tsx +0 -33
  469. package/frontend/src/features/auth/components/AddOAuthDialog.tsx +0 -106
  470. package/frontend/src/features/auth/components/AuthMethodTab.tsx +0 -238
  471. package/frontend/src/features/auth/components/UsersTab.tsx +0 -114
  472. package/frontend/src/features/auth/page/AuthenticationPage.tsx +0 -169
  473. package/frontend/src/features/database/hooks/UseLinkModal.tsx +0 -78
  474. package/frontend/src/features/functions/components/FunctionViewer.tsx +0 -46
  475. package/frontend/src/features/functions/components/FunctionsContent.tsx +0 -88
  476. package/frontend/src/features/login/components/AuthErrorBoundary.tsx +0 -87
  477. package/frontend/src/features/login/components/PrivateRoute.tsx +0 -24
  478. package/frontend/src/features/logs/components/AnalyticsLogsTable.tsx +0 -313
  479. package/frontend/src/features/logs/components/LogsTable.tsx +0 -199
  480. package/frontend/src/features/logs/page/AnalyticsLogsPage.tsx +0 -530
  481. package/frontend/src/features/metadata/index.ts +0 -0
  482. package/frontend/src/features/metadata/page/MetadataPage.tsx +0 -136
  483. package/frontend/src/features/onboard/components/CompletionCard.tsx +0 -41
  484. package/frontend/src/features/onboard/components/OnboardButton.tsx +0 -84
  485. package/frontend/src/features/onboard/components/StepContent.tsx +0 -91
  486. package/frontend/src/features/onboard/components/TestConnectionStep.tsx +0 -53
  487. package/frontend/src/features/onboard/components/mcp/McpInstallation.tsx +0 -144
  488. package/frontend/src/features/onboard/page/OnBoardPage.tsx +0 -104
  489. package/frontend/src/features/onboard/types.ts +0 -8
  490. package/frontend/src/lib/contexts/OnboardStepContext.tsx +0 -68
  491. package/frontend/src/lib/hooks/useOnboardingCompletion.ts +0 -29
  492. /package/backend/src/api/{middleware → middlewares}/error.ts +0 -0
  493. /package/backend/src/api/{middleware → middlewares}/upload.ts +0 -0
  494. /package/backend/{migrations → src/infra/database/migrations}/000_create-base-tables.sql +0 -0
  495. /package/backend/{migrations → src/infra/database/migrations}/001_create-helper-functions.sql +0 -0
  496. /package/backend/{migrations → src/infra/database/migrations}/002_rename-auth-tables.sql +0 -0
  497. /package/backend/{migrations → src/infra/database/migrations}/003_create-users-table.sql +0 -0
  498. /package/backend/{migrations → src/infra/database/migrations}/004_add-reload-postgrest-func.sql +0 -0
  499. /package/backend/{migrations → src/infra/database/migrations}/005_enable-project-admin-modify-users.sql +0 -0
  500. /package/backend/{migrations → src/infra/database/migrations}/006_modify-ai-usage-table.sql +0 -0
  501. /package/backend/{migrations → src/infra/database/migrations}/007_drop-metadata-table.sql +0 -0
  502. /package/backend/{migrations → src/infra/database/migrations}/008_add-system-tables.sql +0 -0
  503. /package/backend/{migrations → src/infra/database/migrations}/009_add-function-secrets.sql +0 -0
  504. /package/backend/{migrations → src/infra/database/migrations}/010_modify-ai-config-modalities.sql +0 -0
  505. /package/backend/{migrations → src/infra/database/migrations}/011_refactor-secrets-table.sql +0 -0
  506. /package/backend/{migrations → src/infra/database/migrations}/012_add-storage-uploaded-by.sql +0 -0
  507. /package/frontend/src/{features/metadata → lib}/services/metadata.service.ts +0 -0
@@ -0,0 +1,114 @@
1
+ import crypto from 'crypto';
2
+ import { ColumnType, type AuthConfigSchema } from '@insforge/shared-schemas';
3
+
4
+ /**
5
+ * Generates a user-friendly error message listing all password requirements
6
+ * @param config - Authentication configuration with password requirements
7
+ * @returns A formatted message listing all enabled password requirements
8
+ */
9
+ export function getPasswordRequirementsMessage(config: AuthConfigSchema): string {
10
+ const requirements: string[] = [];
11
+
12
+ requirements.push(`at least ${config.passwordMinLength} characters long`);
13
+
14
+ if (config.requireNumber) {
15
+ requirements.push('at least one number');
16
+ }
17
+
18
+ if (config.requireLowercase) {
19
+ requirements.push('at least one lowercase letter');
20
+ }
21
+
22
+ if (config.requireUppercase) {
23
+ requirements.push('at least one uppercase letter');
24
+ }
25
+
26
+ if (config.requireSpecialChar) {
27
+ requirements.push('at least one special character');
28
+ }
29
+
30
+ return `Password must contain ${requirements.join(', ')}`;
31
+ }
32
+
33
+ export const convertSqlTypeToColumnType = (sqlType: string): ColumnType | string => {
34
+ switch (sqlType.toLowerCase()) {
35
+ case 'uuid':
36
+ return ColumnType.UUID;
37
+ case 'timestamptz':
38
+ case 'timestamp with time zone':
39
+ return ColumnType.DATETIME;
40
+ case 'date':
41
+ return ColumnType.DATE;
42
+ case 'integer':
43
+ case 'bigint':
44
+ case 'smallint':
45
+ case 'int':
46
+ case 'int2':
47
+ case 'int4':
48
+ case 'serial':
49
+ case 'serial2':
50
+ case 'serial4':
51
+ case 'serial8':
52
+ case 'smallserial':
53
+ case 'bigserial':
54
+ return ColumnType.INTEGER;
55
+ case 'double precision':
56
+ case 'real':
57
+ case 'numeric':
58
+ case 'float':
59
+ case 'float4':
60
+ case 'float8':
61
+ case 'decimal':
62
+ return ColumnType.FLOAT;
63
+ case 'boolean':
64
+ case 'bool':
65
+ return ColumnType.BOOLEAN;
66
+ case 'json':
67
+ case 'jsonb':
68
+ case 'array':
69
+ return ColumnType.JSON;
70
+ case 'text':
71
+ case 'varchar':
72
+ case 'char':
73
+ case 'character varying':
74
+ case 'character':
75
+ return ColumnType.STRING;
76
+ default:
77
+ return sqlType.slice(0, 5);
78
+ }
79
+ };
80
+
81
+ /**
82
+ * Generate a UUID v4
83
+ * @returns A UUID v4 string
84
+ */
85
+ export function generateUUID(): string {
86
+ return crypto.randomUUID();
87
+ }
88
+
89
+ /**
90
+ * Generate a random numeric string of specified length
91
+ * @param length - The length of the numeric string to generate
92
+ * @returns A random string containing only digits (0-9)
93
+ */
94
+ export function generateNumericCode(length: number): string {
95
+ // Generate each digit independently
96
+ let result = '';
97
+ for (let i = 0; i < length; i++) {
98
+ result += crypto.randomInt(0, 10).toString();
99
+ }
100
+
101
+ return result;
102
+ }
103
+
104
+ /**
105
+ * Generate a cryptographically secure random token
106
+ * @param bytes - Number of random bytes to generate (default: 32)
107
+ * @returns Hex-encoded string (length = bytes * 2 characters)
108
+ * @example
109
+ * generateSecureToken(32) // Returns 64-character hex string (256 bits entropy)
110
+ * generateSecureToken(16) // Returns 32-character hex string (128 bits entropy)
111
+ */
112
+ export function generateSecureToken(bytes: number = 32): string {
113
+ return crypto.randomBytes(bytes).toString('hex');
114
+ }
@@ -1,10 +1,46 @@
1
- import { AppError } from '@/api/middleware/error.js';
1
+ import { AppError } from '@/api/middlewares/error.js';
2
2
  import { ERROR_CODES } from '@/types/error-constants.js';
3
+ import type { AuthConfigSchema } from '@insforge/shared-schemas';
3
4
 
4
5
  export function validateEmail(email: string) {
5
6
  return /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(email);
6
7
  }
7
8
 
9
+ /**
10
+ * Validates password against authentication configuration requirements
11
+ * @param password - The password to validate
12
+ * @param config - Authentication configuration with password requirements
13
+ * @returns true if password meets all requirements, false otherwise
14
+ */
15
+ export function validatePassword(password: string, config: AuthConfigSchema): boolean {
16
+ // Check minimum length
17
+ if (password.length < config.passwordMinLength) {
18
+ return false;
19
+ }
20
+
21
+ // Check for number requirement
22
+ if (config.requireNumber && !/\d/.test(password)) {
23
+ return false;
24
+ }
25
+
26
+ // Check for lowercase requirement
27
+ if (config.requireLowercase && !/[a-z]/.test(password)) {
28
+ return false;
29
+ }
30
+
31
+ // Check for uppercase requirement
32
+ if (config.requireUppercase && !/[A-Z]/.test(password)) {
33
+ return false;
34
+ }
35
+
36
+ // Check for special character requirement
37
+ if (config.requireSpecialChar && !/[!@#$%^&*()_+\-=[\]{};\\|,.<>/?]/.test(password)) {
38
+ return false;
39
+ }
40
+
41
+ return true;
42
+ }
43
+
8
44
  /**
9
45
  * Validates PostgreSQL identifier names (tables, columns, etc.)
10
46
  * Prevents SQL injection and ensures valid PostgreSQL identifiers
@@ -25,7 +61,7 @@ const IDENTIFIER_REGEX = /^[^"\x00-\x1F\x7F]+$/;
25
61
  * @throws AppError if invalid
26
62
  */
27
63
  export function validateIdentifier(identifier: string, type: string = 'identifier'): boolean {
28
- if (!identifier || identifier.trim().length === 0) {
64
+ if (!identifier || !identifier.trim()) {
29
65
  throw new AppError(
30
66
  `Invalid ${type} name: cannot be empty`,
31
67
  400,
@@ -52,7 +88,7 @@ export function validateIdentifier(identifier: string, type: string = 'identifie
52
88
  * @returns true if valid, false if invalid
53
89
  */
54
90
  export function isValidIdentifier(identifier: string): boolean {
55
- return Boolean(identifier && identifier.trim().length > 0 && IDENTIFIER_REGEX.test(identifier));
91
+ return Boolean(identifier && identifier.trim() && IDENTIFIER_REGEX.test(identifier));
56
92
  }
57
93
 
58
94
  /**
@@ -85,7 +121,7 @@ export function validateTableName(tableName: string): boolean {
85
121
  * @returns Safe error message
86
122
  */
87
123
  export function getIdentifierErrorMessage(identifier: string, type: string = 'identifier'): string {
88
- if (!identifier || identifier.trim().length === 0) {
124
+ if (!identifier || !identifier.trim()) {
89
125
  return `Invalid ${type} name: cannot be empty`;
90
126
  }
91
127
  if (!IDENTIFIER_REGEX.test(identifier)) {
@@ -0,0 +1,129 @@
1
+ #!/bin/bash
2
+
3
+ # AI Configuration test script
4
+
5
+ SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
6
+ source "$SCRIPT_DIR/../test-config.sh"
7
+
8
+ echo "🧪 Testing AI configuration..."
9
+
10
+ API_BASE="$TEST_API_BASE"
11
+ ADMIN_TOKEN=""
12
+ CONFIG_ID=""
13
+ TEST_MODEL_ID="test-gpt-3.5-turbo" # Use consistent test model ID - cleanup will remove it
14
+
15
+ # Get admin token
16
+ echo "🔑 Getting admin token..."
17
+ ADMIN_TOKEN=$(get_admin_token)
18
+
19
+ if [ -z "$ADMIN_TOKEN" ]; then
20
+ print_fail "Failed to get admin token"
21
+ exit 1
22
+ fi
23
+ print_success "Got admin token"
24
+ echo ""
25
+
26
+ # 1. Create AI configuration with unique test model ID
27
+ echo "📝 Creating AI configuration (model: $TEST_MODEL_ID)..."
28
+ create_response=$(curl -s -w "\n%{http_code}" -X POST "$API_BASE/ai/configurations" \
29
+ -H "Authorization: Bearer $ADMIN_TOKEN" \
30
+ -H "Content-Type: application/json" \
31
+ -d "{
32
+ \"inputModality\": [\"text\"],
33
+ \"outputModality\": [\"text\"],
34
+ \"provider\": \"openai\",
35
+ \"modelId\": \"$TEST_MODEL_ID\",
36
+ \"systemPrompt\": \"You are a helpful assistant.\"
37
+ }")
38
+
39
+ status=$(echo "$create_response" | tail -n 1)
40
+ body=$(echo "$create_response" | sed '$d')
41
+
42
+ if [ "$status" -eq 201 ]; then
43
+ print_success "AI configuration created"
44
+ CONFIG_ID=$(echo "$body" | grep -o '"id":"[^"]*"' | cut -d'"' -f4)
45
+ echo "Config ID: $CONFIG_ID"
46
+ # Register for cleanup even if tests fail later
47
+ if [ -n "$CONFIG_ID" ]; then
48
+ register_test_ai_config "$CONFIG_ID"
49
+ fi
50
+ else
51
+ print_fail "Failed to create AI configuration (status: $status)"
52
+ echo "Response: $body"
53
+ track_test_failure
54
+ fi
55
+ echo ""
56
+
57
+ # 2. List all configurations
58
+ echo "📋 Listing all AI configurations..."
59
+ list_response=$(curl -s -w "\n%{http_code}" -X GET "$API_BASE/ai/configurations" \
60
+ -H "Authorization: Bearer $ADMIN_TOKEN")
61
+
62
+ status=$(echo "$list_response" | tail -n 1)
63
+ body=$(echo "$list_response" | sed '$d')
64
+
65
+ if [ "$status" -eq 200 ] && echo "$body" | grep -q "$CONFIG_ID"; then
66
+ print_success "Listed configurations successfully"
67
+ else
68
+ print_fail "Failed to list configurations (status: $status)"
69
+ echo "Response: $body"
70
+ track_test_failure
71
+ fi
72
+ echo ""
73
+
74
+ # 3. Update configuration
75
+ echo "✏️ Updating AI configuration..."
76
+ update_response=$(curl -s -w "\n%{http_code}" -X PATCH "$API_BASE/ai/configurations/$CONFIG_ID" \
77
+ -H "Authorization: Bearer $ADMIN_TOKEN" \
78
+ -H "Content-Type: application/json" \
79
+ -d '{
80
+ "systemPrompt": "You are an expert coding assistant."
81
+ }')
82
+
83
+ status=$(echo "$update_response" | tail -n 1)
84
+ body=$(echo "$update_response" | sed '$d')
85
+
86
+ if [ "$status" -eq 200 ]; then
87
+ print_success "AI configuration updated"
88
+ else
89
+ print_fail "Failed to update configuration (status: $status)"
90
+ echo "Response: $body"
91
+ track_test_failure
92
+ fi
93
+ echo ""
94
+
95
+ # 4. Get models list
96
+ echo "🤖 Getting available models..."
97
+ models_response=$(curl -s -w "\n%{http_code}" -X GET "$API_BASE/ai/models" \
98
+ -H "Authorization: Bearer $ADMIN_TOKEN")
99
+
100
+ status=$(echo "$models_response" | tail -n 1)
101
+ body=$(echo "$models_response" | sed '$d')
102
+
103
+ if [ "$status" -eq 200 ]; then
104
+ print_success "Retrieved models list"
105
+ else
106
+ print_fail "Failed to get models (status: $status)"
107
+ echo "Response: $body"
108
+ track_test_failure
109
+ fi
110
+ echo ""
111
+
112
+ # 5. Delete configuration
113
+ echo "🗑️ Deleting AI configuration..."
114
+ delete_response=$(curl -s -w "\n%{http_code}" -X DELETE "$API_BASE/ai/configurations/$CONFIG_ID" \
115
+ -H "Authorization: Bearer $ADMIN_TOKEN")
116
+
117
+ status=$(echo "$delete_response" | tail -n 1)
118
+ body=$(echo "$delete_response" | sed '$d')
119
+
120
+ if [ "$status" -eq 200 ]; then
121
+ print_success "AI configuration deleted"
122
+ else
123
+ print_fail "Failed to delete configuration (status: $status)"
124
+ echo "Response: $body"
125
+ track_test_failure
126
+ fi
127
+ echo ""
128
+
129
+ print_success "🎉 AI configuration test completed!"
@@ -0,0 +1,80 @@
1
+ #!/bin/bash
2
+
3
+ # AI Usage tracking test script
4
+
5
+ SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
6
+ source "$SCRIPT_DIR/../test-config.sh"
7
+
8
+ echo "🧪 Testing AI usage tracking..."
9
+
10
+ API_BASE="$TEST_API_BASE"
11
+ ADMIN_TOKEN=""
12
+
13
+ # Get admin token
14
+ echo "🔑 Getting admin token..."
15
+ ADMIN_TOKEN=$(get_admin_token)
16
+
17
+ if [ -z "$ADMIN_TOKEN" ]; then
18
+ print_fail "Failed to get admin token"
19
+ exit 1
20
+ fi
21
+ print_success "Got admin token"
22
+ echo ""
23
+
24
+ # 1. Get usage summary
25
+ echo "📊 Getting usage summary..."
26
+ summary_response=$(curl -s -w "\n%{http_code}" -X GET "$API_BASE/ai/usage/summary" \
27
+ -H "Authorization: Bearer $ADMIN_TOKEN")
28
+
29
+ status=$(echo "$summary_response" | tail -n 1)
30
+ body=$(echo "$summary_response" | sed '$d')
31
+
32
+ if [ "$status" -eq 200 ]; then
33
+ print_success "Retrieved usage summary"
34
+ echo "Response: $body" | head -c 200
35
+ echo ""
36
+ else
37
+ print_fail "Failed to get usage summary (status: $status)"
38
+ echo "Response: $body"
39
+ track_test_failure
40
+ fi
41
+ echo ""
42
+
43
+ # 2. Get paginated usage records
44
+ echo "📋 Getting usage records with pagination..."
45
+ usage_response=$(curl -s -w "\n%{http_code}" -X GET "$API_BASE/ai/usage?limit=10&offset=0" \
46
+ -H "Authorization: Bearer $ADMIN_TOKEN")
47
+
48
+ status=$(echo "$usage_response" | tail -n 1)
49
+ body=$(echo "$usage_response" | sed '$d')
50
+
51
+ if [ "$status" -eq 200 ]; then
52
+ print_success "Retrieved usage records"
53
+ else
54
+ print_fail "Failed to get usage records (status: $status)"
55
+ echo "Response: $body"
56
+ track_test_failure
57
+ fi
58
+ echo ""
59
+
60
+ # 3. Get usage with date range
61
+ echo "📅 Getting usage with date range filter..."
62
+ start_date=$(date -u +"%Y-%m-%dT%H:%M:%SZ" -d "7 days ago" 2>/dev/null || date -u -v-7d +"%Y-%m-%dT%H:%M:%SZ" 2>/dev/null || date -u +"%Y-%m-%dT%H:%M:%SZ")
63
+ end_date=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
64
+
65
+ date_response=$(curl -s -w "\n%{http_code}" -X GET "$API_BASE/ai/usage?startDate=$start_date&endDate=$end_date&limit=10&offset=0" \
66
+ -H "Authorization: Bearer $ADMIN_TOKEN")
67
+
68
+ status=$(echo "$date_response" | tail -n 1)
69
+ body=$(echo "$date_response" | sed '$d')
70
+
71
+ if [ "$status" -eq 200 ]; then
72
+ print_success "Retrieved usage with date filter"
73
+ else
74
+ print_fail "Failed to get usage with date filter (status: $status)"
75
+ echo "Response: $body"
76
+ track_test_failure
77
+ fi
78
+ echo ""
79
+
80
+ print_success "🎉 AI usage tracking test completed!"
@@ -37,7 +37,7 @@ test_endpoint() {
37
37
  -d "$data")
38
38
  fi
39
39
 
40
- body=$(echo "$response" | head -n -1)
40
+ body=$(echo "$response" | sed '$d')
41
41
  status=$(echo "$response" | tail -n 1)
42
42
 
43
43
  if [ "$status" -ge 200 ] && [ "$status" -lt 300 ]; then
@@ -196,7 +196,7 @@ test_endpoint "Upload file" "$response" "201"
196
196
 
197
197
  # 12. Test Download File
198
198
  print_info "12. Testing Download File"
199
- response=$(curl -s -w "\n%{http_code}" "$TEST_API_BASE/storage/buckets/$TEST_BUCKET/objects/test-file.txt" \
199
+ response=$(curl -s -L -w "\n%{http_code}" "$TEST_API_BASE/storage/buckets/$TEST_BUCKET/objects/test-file.txt" \
200
200
  -H "Authorization: Bearer $API_KEY" \
201
201
  -o /tmp/test-download.txt)
202
202
  test_endpoint "Download file" "$response" "200"
@@ -0,0 +1,123 @@
1
+ #!/bin/bash
2
+
3
+ # Serverless Functions test script
4
+
5
+ SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
6
+ source "$SCRIPT_DIR/../test-config.sh"
7
+
8
+ echo "🧪 Testing serverless functions..."
9
+
10
+ API_BASE="$TEST_API_BASE"
11
+ ADMIN_TOKEN=""
12
+ FUNCTION_SLUG="test_func_$(date +%s)"
13
+
14
+ # Get admin token
15
+ echo "🔑 Getting admin token..."
16
+ ADMIN_TOKEN=$(get_admin_token)
17
+
18
+ if [ -z "$ADMIN_TOKEN" ]; then
19
+ print_fail "Failed to get admin token"
20
+ exit 1
21
+ fi
22
+ print_success "Got admin token"
23
+ echo ""
24
+
25
+ # 1. Create function
26
+ echo "📝 Creating serverless function..."
27
+ create_response=$(curl -s -w "\n%{http_code}" -X POST "$API_BASE/functions" \
28
+ -H "Authorization: Bearer $ADMIN_TOKEN" \
29
+ -H "Content-Type: application/json" \
30
+ -d '{
31
+ "name": "Test Function",
32
+ "slug": "'$FUNCTION_SLUG'",
33
+ "code": "export default async function handler(req) { return new Response(\"Hello World\"); }",
34
+ "status": "active"
35
+ }')
36
+
37
+ status=$(echo "$create_response" | tail -n 1)
38
+ body=$(echo "$create_response" | sed '$d')
39
+
40
+ if [ "$status" -eq 201 ]; then
41
+ print_success "Function created"
42
+ echo "Slug: $FUNCTION_SLUG"
43
+ else
44
+ print_fail "Failed to create function (status: $status)"
45
+ echo "Response: $body"
46
+ track_test_failure
47
+ fi
48
+ echo ""
49
+
50
+ # 2. List all functions
51
+ echo "📋 Listing all functions..."
52
+ list_response=$(curl -s -w "\n%{http_code}" -X GET "$API_BASE/functions" \
53
+ -H "Authorization: Bearer $ADMIN_TOKEN")
54
+
55
+ status=$(echo "$list_response" | tail -n 1)
56
+ body=$(echo "$list_response" | sed '$d')
57
+
58
+ if [ "$status" -eq 200 ] && echo "$body" | grep -q "$FUNCTION_SLUG"; then
59
+ print_success "Listed functions successfully"
60
+ else
61
+ print_fail "Failed to list functions (status: $status)"
62
+ echo "Response: $body"
63
+ track_test_failure
64
+ fi
65
+ echo ""
66
+
67
+ # 3. Get function details
68
+ echo "🔍 Getting function details..."
69
+ get_response=$(curl -s -w "\n%{http_code}" -X GET "$API_BASE/functions/$FUNCTION_SLUG" \
70
+ -H "Authorization: Bearer $ADMIN_TOKEN")
71
+
72
+ status=$(echo "$get_response" | tail -n 1)
73
+ body=$(echo "$get_response" | sed '$d')
74
+
75
+ if [ "$status" -eq 200 ] && echo "$body" | grep -q '"code"'; then
76
+ print_success "Retrieved function details with code"
77
+ else
78
+ print_fail "Failed to get function details (status: $status)"
79
+ echo "Response: $body"
80
+ track_test_failure
81
+ fi
82
+ echo ""
83
+
84
+ # 4. Update function
85
+ echo "✏️ Updating function..."
86
+ update_response=$(curl -s -w "\n%{http_code}" -X PUT "$API_BASE/functions/$FUNCTION_SLUG" \
87
+ -H "Authorization: Bearer $ADMIN_TOKEN" \
88
+ -H "Content-Type: application/json" \
89
+ -d '{
90
+ "code": "export default async function handler(req) { return new Response(\"Updated\"); }",
91
+ "status": "draft"
92
+ }')
93
+
94
+ status=$(echo "$update_response" | tail -n 1)
95
+ body=$(echo "$update_response" | sed '$d')
96
+
97
+ if [ "$status" -eq 200 ]; then
98
+ print_success "Function updated"
99
+ else
100
+ print_fail "Failed to update function (status: $status)"
101
+ echo "Response: $body"
102
+ track_test_failure
103
+ fi
104
+ echo ""
105
+
106
+ # 5. Delete function
107
+ echo "🗑️ Deleting function..."
108
+ delete_response=$(curl -s -w "\n%{http_code}" -X DELETE "$API_BASE/functions/$FUNCTION_SLUG" \
109
+ -H "Authorization: Bearer $ADMIN_TOKEN")
110
+
111
+ status=$(echo "$delete_response" | tail -n 1)
112
+ body=$(echo "$delete_response" | sed '$d')
113
+
114
+ if [ "$status" -eq 200 ]; then
115
+ print_success "Function deleted"
116
+ else
117
+ print_fail "Failed to delete function (status: $status)"
118
+ echo "Response: $body"
119
+ track_test_failure
120
+ fi
121
+ echo ""
122
+
123
+ print_success "🎉 Serverless functions test completed!"
@@ -0,0 +1,132 @@
1
+ #!/bin/bash
2
+
3
+ # Logs and Audit test script
4
+
5
+ SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
6
+ source "$SCRIPT_DIR/../test-config.sh"
7
+
8
+ echo "🧪 Testing logs and audit..."
9
+
10
+ API_BASE="$TEST_API_BASE"
11
+ ADMIN_TOKEN=""
12
+
13
+ # Get admin token
14
+ echo "🔑 Getting admin token..."
15
+ ADMIN_TOKEN=$(get_admin_token)
16
+
17
+ if [ -z "$ADMIN_TOKEN" ]; then
18
+ print_fail "Failed to get admin token"
19
+ exit 1
20
+ fi
21
+ print_success "Got admin token"
22
+ echo ""
23
+
24
+ # 1. Get audit logs
25
+ echo "📋 Getting audit logs..."
26
+ audit_response=$(curl -s -w "\n%{http_code}" -X GET "$API_BASE/logs/audits?limit=10&offset=0" \
27
+ -H "Authorization: Bearer $ADMIN_TOKEN")
28
+
29
+ status=$(echo "$audit_response" | tail -n 1)
30
+ body=$(echo "$audit_response" | sed '$d')
31
+
32
+ if [ "$status" -eq 200 ] || [ "$status" -eq 206 ]; then
33
+ print_success "Retrieved audit logs"
34
+ echo "Response: $body" | head -c 200
35
+ echo ""
36
+ else
37
+ print_fail "Failed to get audit logs (status: $status)"
38
+ echo "Response: $body"
39
+ track_test_failure
40
+ fi
41
+ echo ""
42
+
43
+ # 2. Get audit logs filtered by module
44
+ echo "🔍 Getting audit logs filtered by module..."
45
+ module_response=$(curl -s -w "\n%{http_code}" -X GET "$API_BASE/logs/audits?module=AUTH&limit=10" \
46
+ -H "Authorization: Bearer $ADMIN_TOKEN")
47
+
48
+ status=$(echo "$module_response" | tail -n 1)
49
+ body=$(echo "$module_response" | sed '$d')
50
+
51
+ if [ "$status" -eq 200 ] || [ "$status" -eq 206 ]; then
52
+ print_success "Retrieved filtered audit logs"
53
+ else
54
+ print_fail "Failed to get filtered audit logs (status: $status)"
55
+ echo "Response: $body"
56
+ track_test_failure
57
+ fi
58
+ echo ""
59
+
60
+ # 3. Get audit statistics
61
+ echo "📊 Getting audit statistics..."
62
+ stats_response=$(curl -s -w "\n%{http_code}" -X GET "$API_BASE/logs/audits/stats?days=7" \
63
+ -H "Authorization: Bearer $ADMIN_TOKEN")
64
+
65
+ status=$(echo "$stats_response" | tail -n 1)
66
+ body=$(echo "$stats_response" | sed '$d')
67
+
68
+ if [ "$status" -eq 200 ] || [ "$status" -eq 500 ]; then
69
+ if [ "$status" -eq 500 ]; then
70
+ print_info "Audit statistics endpoint returned 500 (may not be fully implemented)"
71
+ else
72
+ print_success "Retrieved audit statistics"
73
+ fi
74
+ else
75
+ print_fail "Failed to get audit statistics (status: $status)"
76
+ echo "Response: $body"
77
+ track_test_failure
78
+ fi
79
+ echo ""
80
+
81
+ # 4. Get log sources
82
+ echo "📂 Getting log sources..."
83
+ sources_response=$(curl -s -w "\n%{http_code}" -X GET "$API_BASE/logs/sources" \
84
+ -H "Authorization: Bearer $ADMIN_TOKEN")
85
+
86
+ status=$(echo "$sources_response" | tail -n 1)
87
+ body=$(echo "$sources_response" | sed '$d')
88
+
89
+ if [ "$status" -eq 200 ]; then
90
+ print_success "Retrieved log sources"
91
+ else
92
+ print_fail "Failed to get log sources (status: $status)"
93
+ echo "Response: $body"
94
+ track_test_failure
95
+ fi
96
+ echo ""
97
+
98
+ # 5. Search logs
99
+ echo "🔎 Searching logs..."
100
+ search_response=$(curl -s -w "\n%{http_code}" -X GET "$API_BASE/logs/search?q=test&limit=10" \
101
+ -H "Authorization: Bearer $ADMIN_TOKEN")
102
+
103
+ status=$(echo "$search_response" | tail -n 1)
104
+ body=$(echo "$search_response" | sed '$d')
105
+
106
+ if [ "$status" -eq 200 ] || [ "$status" -eq 206 ]; then
107
+ print_success "Searched logs successfully"
108
+ else
109
+ print_fail "Failed to search logs (status: $status)"
110
+ echo "Response: $body"
111
+ track_test_failure
112
+ fi
113
+ echo ""
114
+
115
+ # 6. Get log stats
116
+ echo "📈 Getting log statistics..."
117
+ log_stats_response=$(curl -s -w "\n%{http_code}" -X GET "$API_BASE/logs/stats" \
118
+ -H "Authorization: Bearer $ADMIN_TOKEN")
119
+
120
+ status=$(echo "$log_stats_response" | tail -n 1)
121
+ body=$(echo "$log_stats_response" | sed '$d')
122
+
123
+ if [ "$status" -eq 200 ]; then
124
+ print_success "Retrieved log statistics"
125
+ else
126
+ print_fail "Failed to get log statistics (status: $status)"
127
+ echo "Response: $body"
128
+ track_test_failure
129
+ fi
130
+ echo ""
131
+
132
+ print_success "🎉 Logs and audit test completed!"