insforge 0.3.1

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 (395) hide show
  1. package/.dockerignore +58 -0
  2. package/.env.example +49 -0
  3. package/.github/ISSUE_TEMPLATE/bug_report.yml +83 -0
  4. package/.github/ISSUE_TEMPLATE/config.yml +11 -0
  5. package/.github/ISSUE_TEMPLATE/feature_request.yml +79 -0
  6. package/.github/copilot-instructions.md +147 -0
  7. package/.github/workflows/build-image.yml +65 -0
  8. package/.github/workflows/ci-premerge-check.yml +24 -0
  9. package/.github/workflows/deploy-aws.yml +130 -0
  10. package/.github/workflows/lint-and-format.yml +33 -0
  11. package/.prettierignore +65 -0
  12. package/.prettierrc +9 -0
  13. package/CHANGELOG.md +3 -0
  14. package/CONTRIBUTING.md +126 -0
  15. package/Dockerfile +27 -0
  16. package/GITHUB_OAUTH_SETUP.md +49 -0
  17. package/GOOGLE_OAUTH_SETUP.md +148 -0
  18. package/LICENSE +201 -0
  19. package/README.md +134 -0
  20. package/assets/Dark.svg +23 -0
  21. package/assets/archDiagram.png +0 -0
  22. package/assets/banner.png +0 -0
  23. package/assets/mcpInstallv2.png +0 -0
  24. package/assets/sampleResponse.png +0 -0
  25. package/assets/signin.png +0 -0
  26. package/assets/userflow.png +0 -0
  27. package/backend/migrations/000_create-base-tables.sql +142 -0
  28. package/backend/migrations/001_create-helper-functions.sql +41 -0
  29. package/backend/migrations/002_rename-auth-tables.sql +30 -0
  30. package/backend/migrations/003_create-users-table.sql +56 -0
  31. package/backend/migrations/004_add-reload-postgrest-func.sql +24 -0
  32. package/backend/migrations/005_enable-project-admin-modify-users.sql +30 -0
  33. package/backend/migrations/006_modify-ai-usage-table.sql +25 -0
  34. package/backend/migrations/007_drop-metadata-table.sql +2 -0
  35. package/backend/migrations/008_add-system-tables.sql +77 -0
  36. package/backend/migrations/009_add-function-secrets.sql +24 -0
  37. package/backend/migrations/010_modify-ai-config-modalities.sql +93 -0
  38. package/backend/migrations/011_refactor-secrets-table.sql +15 -0
  39. package/backend/migrations/012_add-storage-uploaded-by.sql +8 -0
  40. package/backend/package.json +75 -0
  41. package/backend/src/api/middleware/auth.ts +240 -0
  42. package/backend/src/api/middleware/error.ts +231 -0
  43. package/backend/src/api/middleware/upload.ts +59 -0
  44. package/backend/src/api/routes/agent.ts +29 -0
  45. package/backend/src/api/routes/ai.ts +472 -0
  46. package/backend/src/api/routes/auth.oauth.ts +482 -0
  47. package/backend/src/api/routes/auth.ts +386 -0
  48. package/backend/src/api/routes/database.advance.ts +275 -0
  49. package/backend/src/api/routes/database.records.ts +246 -0
  50. package/backend/src/api/routes/database.tables.ts +161 -0
  51. package/backend/src/api/routes/docs.ts +66 -0
  52. package/backend/src/api/routes/functions.ts +183 -0
  53. package/backend/src/api/routes/logs.ts +150 -0
  54. package/backend/src/api/routes/metadata.ts +160 -0
  55. package/backend/src/api/routes/openapi.ts +82 -0
  56. package/backend/src/api/routes/secrets.ts +199 -0
  57. package/backend/src/api/routes/storage.ts +547 -0
  58. package/backend/src/api/routes/usage.ts +96 -0
  59. package/backend/src/core/ai/chat.ts +207 -0
  60. package/backend/src/core/ai/client.ts +242 -0
  61. package/backend/src/core/ai/config.ts +187 -0
  62. package/backend/src/core/ai/image.ts +156 -0
  63. package/backend/src/core/ai/model.ts +117 -0
  64. package/backend/src/core/ai/usage.ts +290 -0
  65. package/backend/src/core/auth/auth.ts +781 -0
  66. package/backend/src/core/auth/oauth.ts +398 -0
  67. package/backend/src/core/database/advance.ts +1074 -0
  68. package/backend/src/core/database/manager.ts +178 -0
  69. package/backend/src/core/database/table.ts +772 -0
  70. package/backend/src/core/documentation/agent.ts +689 -0
  71. package/backend/src/core/documentation/openapi.ts +856 -0
  72. package/backend/src/core/functions/functions.ts +310 -0
  73. package/backend/src/core/logs/analytics.ts +76 -0
  74. package/backend/src/core/logs/audit.ts +255 -0
  75. package/backend/src/core/logs/providers/base.provider.ts +83 -0
  76. package/backend/src/core/logs/providers/cloudwatch.provider.ts +510 -0
  77. package/backend/src/core/logs/providers/localdb.provider.ts +246 -0
  78. package/backend/src/core/secrets/encryption.ts +58 -0
  79. package/backend/src/core/secrets/secrets.ts +410 -0
  80. package/backend/src/core/socket/socket.ts +388 -0
  81. package/backend/src/core/socket/types.ts +79 -0
  82. package/backend/src/core/storage/storage.ts +923 -0
  83. package/backend/src/server.ts +288 -0
  84. package/backend/src/types/ai.ts +46 -0
  85. package/backend/src/types/auth.ts +90 -0
  86. package/backend/src/types/database.ts +136 -0
  87. package/backend/src/types/error-constants.ts +86 -0
  88. package/backend/src/types/logs.ts +47 -0
  89. package/backend/src/types/profile.ts +55 -0
  90. package/backend/src/types/storage.ts +23 -0
  91. package/backend/src/utils/cloud-token.ts +39 -0
  92. package/backend/src/utils/constants.ts +1 -0
  93. package/backend/src/utils/environment.ts +35 -0
  94. package/backend/src/utils/helpers.ts +49 -0
  95. package/backend/src/utils/logger.ts +13 -0
  96. package/backend/src/utils/response.ts +62 -0
  97. package/backend/src/utils/seed.ts +205 -0
  98. package/backend/src/utils/sql-parser.ts +63 -0
  99. package/backend/src/utils/uuid.ts +9 -0
  100. package/backend/src/utils/validations.ts +129 -0
  101. package/backend/tests/README.md +134 -0
  102. package/backend/tests/cleanup-all-test-data.sh +231 -0
  103. package/backend/tests/cloud/test-s3-multitenant.sh +132 -0
  104. package/backend/tests/local/comprehensive-curl-tests.sh +156 -0
  105. package/backend/tests/local/test-auth-router.sh +144 -0
  106. package/backend/tests/local/test-database-router.sh +222 -0
  107. package/backend/tests/local/test-e2e.sh +241 -0
  108. package/backend/tests/local/test-fk-errors.sh +97 -0
  109. package/backend/tests/local/test-id-field.sh +201 -0
  110. package/backend/tests/local/test-public-bucket.sh +265 -0
  111. package/backend/tests/local/test-secrets.sh +248 -0
  112. package/backend/tests/local/test-serverless-functions.sh.disabled +325 -0
  113. package/backend/tests/local/test-traditional-rest.sh +209 -0
  114. package/backend/tests/manual/README.md +51 -0
  115. package/backend/tests/manual/create-large-table-simple.sql +11 -0
  116. package/backend/tests/manual/seed-large-table.sql +101 -0
  117. package/backend/tests/manual/setup-large-table-extras.sql +34 -0
  118. package/backend/tests/manual/test-better-auth.sh +303 -0
  119. package/backend/tests/manual/test-bulk-upsert.sh +410 -0
  120. package/backend/tests/manual/test-database-advance.sh +297 -0
  121. package/backend/tests/manual/test-postgrest-stability.sh +192 -0
  122. package/backend/tests/manual/test-rawsql-export-import.sh +412 -0
  123. package/backend/tests/manual/test-universal-storage.sh +264 -0
  124. package/backend/tests/manual/test-users.sql +18 -0
  125. package/backend/tests/run-all-tests.sh +140 -0
  126. package/backend/tests/setup.ts +22 -0
  127. package/backend/tests/test-config.sh +303 -0
  128. package/backend/tsconfig.json +23 -0
  129. package/backend/tsup.config.ts +18 -0
  130. package/backend/vitest.config.ts +22 -0
  131. package/docker-compose.prod.yml +145 -0
  132. package/docker-compose.yml +167 -0
  133. package/docker-init/db/db-init.sql +125 -0
  134. package/docker-init/db/jwt.sql +5 -0
  135. package/docker-init/db/logs.sql +9 -0
  136. package/docker-init/db/postgresql.conf +17 -0
  137. package/docs/deprecated/insforge-auth-api.md +215 -0
  138. package/docs/deprecated/insforge-auth-sdk.md +100 -0
  139. package/docs/deprecated/insforge-db-api.md +359 -0
  140. package/docs/deprecated/insforge-db-sdk.md +140 -0
  141. package/docs/deprecated/insforge-debug-sdk.md +157 -0
  142. package/docs/deprecated/insforge-debug.md +65 -0
  143. package/docs/deprecated/insforge-instructions.md +124 -0
  144. package/docs/deprecated/insforge-project.md +118 -0
  145. package/docs/deprecated/insforge-storage-api.md +279 -0
  146. package/docs/deprecated/insforge-storage-sdk.md +159 -0
  147. package/docs/insforge-instructions-sdk.md +407 -0
  148. package/eslint.config.js +317 -0
  149. package/examples/oauth/frontend-oauth-example.html +251 -0
  150. package/examples/response-examples.md +444 -0
  151. package/frontend/README.md +112 -0
  152. package/frontend/components.json +17 -0
  153. package/frontend/index.html +13 -0
  154. package/frontend/package.json +63 -0
  155. package/frontend/public/favicon.ico +0 -0
  156. package/frontend/src/App.tsx +106 -0
  157. package/frontend/src/assets/icons/checkbox_checked.svg +6 -0
  158. package/frontend/src/assets/icons/checkbox_undetermined.svg +6 -0
  159. package/frontend/src/assets/icons/checked.svg +3 -0
  160. package/frontend/src/assets/icons/error.svg +3 -0
  161. package/frontend/src/assets/icons/pencil.svg +4 -0
  162. package/frontend/src/assets/icons/refresh.svg +4 -0
  163. package/frontend/src/assets/icons/step_active.svg +3 -0
  164. package/frontend/src/assets/icons/step_inactive.svg +11 -0
  165. package/frontend/src/assets/icons/warning.svg +3 -0
  166. package/frontend/src/assets/logos/amazon.svg +1 -0
  167. package/frontend/src/assets/logos/claude_code.svg +3 -0
  168. package/frontend/src/assets/logos/cline.svg +6 -0
  169. package/frontend/src/assets/logos/cursor.svg +20 -0
  170. package/frontend/src/assets/logos/discord.svg +9 -0
  171. package/frontend/src/assets/logos/gemini.svg +19 -0
  172. package/frontend/src/assets/logos/github.svg +5 -0
  173. package/frontend/src/assets/logos/google.svg +13 -0
  174. package/frontend/src/assets/logos/grok.svg +10 -0
  175. package/frontend/src/assets/logos/insforge_dark.svg +15 -0
  176. package/frontend/src/assets/logos/insforge_light.svg +15 -0
  177. package/frontend/src/assets/logos/openai.svg +10 -0
  178. package/frontend/src/assets/logos/roo_code.svg +9 -0
  179. package/frontend/src/assets/logos/trae.svg +3 -0
  180. package/frontend/src/assets/logos/windsurf.svg +10 -0
  181. package/frontend/src/components/ButtonWithLoading.tsx +27 -0
  182. package/frontend/src/components/Checkbox.tsx +61 -0
  183. package/frontend/src/components/CodeBlock.tsx +32 -0
  184. package/frontend/src/components/ConfirmDialog.tsx +96 -0
  185. package/frontend/src/components/CopyButton.tsx +69 -0
  186. package/frontend/src/components/DeleteActionButton.tsx +42 -0
  187. package/frontend/src/components/EmptyState.tsx +41 -0
  188. package/frontend/src/components/ErrorState.tsx +35 -0
  189. package/frontend/src/components/FeatureSidebar.tsx +126 -0
  190. package/frontend/src/components/FeatureSidebarItem.tsx +101 -0
  191. package/frontend/src/components/JsonHighlight.tsx +61 -0
  192. package/frontend/src/components/LoadingState.tsx +16 -0
  193. package/frontend/src/components/PaginationControls.tsx +54 -0
  194. package/frontend/src/components/PromptDialog.tsx +68 -0
  195. package/frontend/src/components/SearchInput.tsx +90 -0
  196. package/frontend/src/components/SelectionClearButton.tsx +26 -0
  197. package/frontend/src/components/Stepper.tsx +139 -0
  198. package/frontend/src/components/ThemeToggle.tsx +58 -0
  199. package/frontend/src/components/TypeBadge.tsx +20 -0
  200. package/frontend/src/components/datagrid/DataGrid.tsx +264 -0
  201. package/frontend/src/components/datagrid/DefaultCellRenderer.tsx +114 -0
  202. package/frontend/src/components/datagrid/IdCell.tsx +44 -0
  203. package/frontend/src/components/datagrid/SortableHeader.tsx +74 -0
  204. package/frontend/src/components/datagrid/cell-editors/BooleanCellEditor.tsx +54 -0
  205. package/frontend/src/components/datagrid/cell-editors/DateCellEditor.tsx +483 -0
  206. package/frontend/src/components/datagrid/cell-editors/JsonCellEditor.tsx +362 -0
  207. package/frontend/src/components/datagrid/cell-editors/TextCellEditor.tsx +38 -0
  208. package/frontend/src/components/datagrid/cell-editors/index.ts +14 -0
  209. package/frontend/src/components/datagrid/cell-editors/types.ts +43 -0
  210. package/frontend/src/components/datagrid/datagridTypes.tsx +72 -0
  211. package/frontend/src/components/datagrid/index.tsx +20 -0
  212. package/frontend/src/components/index.ts +39 -0
  213. package/frontend/src/components/layout/AppHeader.tsx +146 -0
  214. package/frontend/src/components/layout/AppSidebar.tsx +190 -0
  215. package/frontend/src/components/layout/CloudLayout.tsx +95 -0
  216. package/frontend/src/components/layout/Layout.tsx +43 -0
  217. package/frontend/src/components/radix/Alert.tsx +45 -0
  218. package/frontend/src/components/radix/AlertDialog.tsx +115 -0
  219. package/frontend/src/components/radix/Avatar.tsx +45 -0
  220. package/frontend/src/components/radix/Badge.tsx +33 -0
  221. package/frontend/src/components/radix/Button.tsx +50 -0
  222. package/frontend/src/components/radix/Card.tsx +58 -0
  223. package/frontend/src/components/radix/Dialog.tsx +98 -0
  224. package/frontend/src/components/radix/DropdownMenu.tsx +185 -0
  225. package/frontend/src/components/radix/Form.tsx +167 -0
  226. package/frontend/src/components/radix/Input.tsx +22 -0
  227. package/frontend/src/components/radix/Label.tsx +19 -0
  228. package/frontend/src/components/radix/Popover.tsx +29 -0
  229. package/frontend/src/components/radix/ScrollArea.tsx +44 -0
  230. package/frontend/src/components/radix/Select.tsx +151 -0
  231. package/frontend/src/components/radix/Separator.tsx +26 -0
  232. package/frontend/src/components/radix/Sheet.tsx +119 -0
  233. package/frontend/src/components/radix/Skeleton.tsx +7 -0
  234. package/frontend/src/components/radix/Switch.tsx +29 -0
  235. package/frontend/src/components/radix/Tabs.tsx +50 -0
  236. package/frontend/src/components/radix/Textarea.tsx +21 -0
  237. package/frontend/src/components/radix/Tooltip.tsx +28 -0
  238. package/frontend/src/features/ai/components/AIConfigCard.tsx +154 -0
  239. package/frontend/src/features/ai/components/AIConfigDialog.tsx +76 -0
  240. package/frontend/src/features/ai/components/AIConfigForm.tsx +222 -0
  241. package/frontend/src/features/ai/components/AIEmptyState.tsx +18 -0
  242. package/frontend/src/features/ai/components/fields/ModalityField.tsx +87 -0
  243. package/frontend/src/features/ai/components/fields/ModelSelectionField.tsx +134 -0
  244. package/frontend/src/features/ai/components/fields/SystemPromptField.tsx +33 -0
  245. package/frontend/src/features/ai/helpers.ts +155 -0
  246. package/frontend/src/features/ai/hooks/useAIConfigs.ts +221 -0
  247. package/frontend/src/features/ai/hooks/useAIUsage.ts +77 -0
  248. package/frontend/src/features/ai/page/AIPage.tsx +178 -0
  249. package/frontend/src/features/ai/services/ai.service.ts +148 -0
  250. package/frontend/src/features/auth/components/AddOAuthDialog.tsx +106 -0
  251. package/frontend/src/features/auth/components/AuthMethodTab.tsx +238 -0
  252. package/frontend/src/features/auth/components/OAuthConfigDialog.tsx +303 -0
  253. package/frontend/src/features/auth/components/OAuthEmptyState.tsx +15 -0
  254. package/frontend/src/features/auth/components/UserFormDialog.tsx +248 -0
  255. package/frontend/src/features/auth/components/UsersDataGrid.tsx +183 -0
  256. package/frontend/src/features/auth/components/UsersTab.tsx +114 -0
  257. package/frontend/src/features/auth/hooks/useOAuthConfig.ts +129 -0
  258. package/frontend/src/features/auth/hooks/useUsers.ts +57 -0
  259. package/frontend/src/features/auth/index.ts +9 -0
  260. package/frontend/src/features/auth/page/AuthenticationPage.tsx +169 -0
  261. package/frontend/src/features/auth/services/auth.service.ts +112 -0
  262. package/frontend/src/features/auth/services/oauth.service.ts +49 -0
  263. package/frontend/src/features/dashboard/page/DashboardPage.tsx +194 -0
  264. package/frontend/src/features/database/components/ColumnTypeSelect.tsx +64 -0
  265. package/frontend/src/features/database/components/DatabaseDataGrid.tsx +282 -0
  266. package/frontend/src/features/database/components/ForeignKeyCell.tsx +187 -0
  267. package/frontend/src/features/database/components/ForeignKeyPopover.tsx +378 -0
  268. package/frontend/src/features/database/components/LinkRecordModal.tsx +288 -0
  269. package/frontend/src/features/database/components/RecordFormDialog.tsx +164 -0
  270. package/frontend/src/features/database/components/RecordFormField.tsx +568 -0
  271. package/frontend/src/features/database/components/TableEmptyState.tsx +21 -0
  272. package/frontend/src/features/database/components/TableForm.tsx +656 -0
  273. package/frontend/src/features/database/components/TableFormColumn.tsx +137 -0
  274. package/frontend/src/features/database/components/TableListSkeleton.tsx +9 -0
  275. package/frontend/src/features/database/components/TableSidebar.tsx +47 -0
  276. package/frontend/src/features/database/constants.ts +26 -0
  277. package/frontend/src/features/database/helpers.ts +125 -0
  278. package/frontend/src/features/database/hooks/UseLinkModal.tsx +78 -0
  279. package/frontend/src/features/database/index.ts +12 -0
  280. package/frontend/src/features/database/page/DatabasePage.tsx +626 -0
  281. package/frontend/src/features/database/schema.ts +25 -0
  282. package/frontend/src/features/database/services/database.service.ts +216 -0
  283. package/frontend/src/features/functions/components/FunctionEmptyState.tsx +15 -0
  284. package/frontend/src/features/functions/components/FunctionRow.tsx +71 -0
  285. package/frontend/src/features/functions/components/FunctionViewer.tsx +46 -0
  286. package/frontend/src/features/functions/components/FunctionsContent.tsx +88 -0
  287. package/frontend/src/features/functions/components/FunctionsSidebar.tsx +56 -0
  288. package/frontend/src/features/functions/components/SecretEmptyState.tsx +23 -0
  289. package/frontend/src/features/functions/components/SecretRow.tsx +68 -0
  290. package/frontend/src/features/functions/components/SecretsContent.tsx +120 -0
  291. package/frontend/src/features/functions/hooks/useFunctions.ts +106 -0
  292. package/frontend/src/features/functions/page/FunctionsPage.tsx +28 -0
  293. package/frontend/src/features/functions/services/functions.service.ts +48 -0
  294. package/frontend/src/features/login/components/AuthErrorBoundary.tsx +87 -0
  295. package/frontend/src/features/login/components/PrivateRoute.tsx +24 -0
  296. package/frontend/src/features/login/page/CloudLoginPage.tsx +93 -0
  297. package/frontend/src/features/login/page/LoginPage.tsx +174 -0
  298. package/frontend/src/features/logs/components/AnalyticsLogsTable.tsx +313 -0
  299. package/frontend/src/features/logs/components/LogsTable.tsx +199 -0
  300. package/frontend/src/features/logs/hooks/useAuditLogs.ts +39 -0
  301. package/frontend/src/features/logs/index.ts +5 -0
  302. package/frontend/src/features/logs/page/AnalyticsLogsPage.tsx +530 -0
  303. package/frontend/src/features/logs/page/AuditsPage.tsx +192 -0
  304. package/frontend/src/features/logs/services/log.service.ts +171 -0
  305. package/frontend/src/features/metadata/hooks/useMetadata.ts +53 -0
  306. package/frontend/src/features/metadata/index.ts +0 -0
  307. package/frontend/src/features/metadata/page/MetadataPage.tsx +136 -0
  308. package/frontend/src/features/metadata/services/metadata.service.ts +17 -0
  309. package/frontend/src/features/onboard/components/CompletionCard.tsx +41 -0
  310. package/frontend/src/features/onboard/components/OnboardButton.tsx +84 -0
  311. package/frontend/src/features/onboard/components/StepContent.tsx +91 -0
  312. package/frontend/src/features/onboard/components/TestConnectionStep.tsx +53 -0
  313. package/frontend/src/features/onboard/components/mcp/CursorDeeplinkGenerator.tsx +35 -0
  314. package/frontend/src/features/onboard/components/mcp/McpInstallation.tsx +144 -0
  315. package/frontend/src/features/onboard/components/mcp/index.ts +4 -0
  316. package/frontend/src/features/onboard/components/mcp/mcp-helper.tsx +98 -0
  317. package/frontend/src/features/onboard/index.ts +3 -0
  318. package/frontend/src/features/onboard/page/OnBoardPage.tsx +104 -0
  319. package/frontend/src/features/onboard/types.ts +8 -0
  320. package/frontend/src/features/secrets/hooks/useSecrets.ts +139 -0
  321. package/frontend/src/features/secrets/services/secrets.service.ts +57 -0
  322. package/frontend/src/features/storage/components/BucketEmptyState.tsx +19 -0
  323. package/frontend/src/features/storage/components/BucketFormDialog.tsx +194 -0
  324. package/frontend/src/features/storage/components/BucketListSkeleton.tsx +17 -0
  325. package/frontend/src/features/storage/components/FilePreviewDialog.tsx +287 -0
  326. package/frontend/src/features/storage/components/StorageDataGrid.tsx +239 -0
  327. package/frontend/src/features/storage/components/StorageManager.tsx +236 -0
  328. package/frontend/src/features/storage/components/StorageSidebar.tsx +44 -0
  329. package/frontend/src/features/storage/components/UploadToast.tsx +46 -0
  330. package/frontend/src/features/storage/index.ts +3 -0
  331. package/frontend/src/features/storage/page/StoragePage.tsx +553 -0
  332. package/frontend/src/features/storage/services/storage.service.ts +144 -0
  333. package/frontend/src/features/visualizer/components/AuthNode.tsx +107 -0
  334. package/frontend/src/features/visualizer/components/BucketNode.tsx +34 -0
  335. package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +359 -0
  336. package/frontend/src/features/visualizer/components/TableNode.tsx +152 -0
  337. package/frontend/src/features/visualizer/components/VisualizerSkeleton.tsx +24 -0
  338. package/frontend/src/features/visualizer/components/index.ts +5 -0
  339. package/frontend/src/features/visualizer/page/VisualizerPage.tsx +127 -0
  340. package/frontend/src/index.css +248 -0
  341. package/frontend/src/lib/api/client.ts +163 -0
  342. package/frontend/src/lib/contexts/AuthContext.tsx +157 -0
  343. package/frontend/src/lib/contexts/OnboardStepContext.tsx +68 -0
  344. package/frontend/src/lib/contexts/SocketContext.tsx +303 -0
  345. package/frontend/src/lib/contexts/ThemeContext.tsx +125 -0
  346. package/frontend/src/lib/hooks/useAuth.ts +4 -0
  347. package/frontend/src/lib/hooks/useConfirm.ts +55 -0
  348. package/frontend/src/lib/hooks/useInterval.ts +27 -0
  349. package/frontend/src/lib/hooks/useMediaQuery.ts +59 -0
  350. package/frontend/src/lib/hooks/useOnboardingCompletion.ts +29 -0
  351. package/frontend/src/lib/hooks/usePagination.ts +27 -0
  352. package/frontend/src/lib/hooks/useTimeout.ts +27 -0
  353. package/frontend/src/lib/hooks/useToast.tsx +229 -0
  354. package/frontend/src/lib/utils/constants.ts +38 -0
  355. package/frontend/src/lib/utils/utils.ts +165 -0
  356. package/frontend/src/lib/utils/validation-schemas.ts +126 -0
  357. package/frontend/src/main.tsx +16 -0
  358. package/frontend/src/rdg.css +194 -0
  359. package/frontend/src/vite-env.d.ts +12 -0
  360. package/frontend/tailwind.config.js +97 -0
  361. package/frontend/tsconfig.json +26 -0
  362. package/frontend/tsconfig.node.json +10 -0
  363. package/frontend/vite.config.ts +37 -0
  364. package/frontend/vitest.config.ts +36 -0
  365. package/functions/deno.json +25 -0
  366. package/functions/server.ts +290 -0
  367. package/functions/worker-template.js +126 -0
  368. package/openapi/ai.yaml +689 -0
  369. package/openapi/auth.yaml +563 -0
  370. package/openapi/functions.yaml +476 -0
  371. package/openapi/health.yaml +30 -0
  372. package/openapi/logs.yaml +224 -0
  373. package/openapi/metadata.yaml +178 -0
  374. package/openapi/records.yaml +382 -0
  375. package/openapi/secrets.yaml +371 -0
  376. package/openapi/storage.yaml +876 -0
  377. package/openapi/tables.yaml +464 -0
  378. package/package.json +88 -0
  379. package/shared-schemas/package.json +31 -0
  380. package/shared-schemas/src/ai-api.schema.ts +167 -0
  381. package/shared-schemas/src/ai.schema.ts +54 -0
  382. package/shared-schemas/src/auth-api.schema.ts +193 -0
  383. package/shared-schemas/src/auth.schema.ts +94 -0
  384. package/shared-schemas/src/database-api.schema.ts +259 -0
  385. package/shared-schemas/src/database.schema.ts +69 -0
  386. package/shared-schemas/src/functions-api.schema.ts +25 -0
  387. package/shared-schemas/src/functions.schema.ts +16 -0
  388. package/shared-schemas/src/index.ts +13 -0
  389. package/shared-schemas/src/logs-api.schema.ts +49 -0
  390. package/shared-schemas/src/logs.schema.ts +14 -0
  391. package/shared-schemas/src/metadata.schema.ts +56 -0
  392. package/shared-schemas/src/storage-api.schema.ts +65 -0
  393. package/shared-schemas/src/storage.schema.ts +19 -0
  394. package/shared-schemas/tsconfig.json +21 -0
  395. package/tsconfig.json +8 -0
@@ -0,0 +1,65 @@
1
+ # Insforge Debug Guide
2
+
3
+ ## When Your API Code Fails
4
+
5
+ **Start here** → `get-instructions` and `get-backend-metadata` (understand system state)
6
+ **Read docs** → `get-db-api`, `get-auth-api`, `get-storage-api` (read ALL of them)
7
+ **Check table** → `get-table-schema` with your table name
8
+ **Test endpoint** → Use curl with exact API format from docs
9
+
10
+ ## Critical Rule: Read Documentation First
11
+
12
+ Before debugging, you MUST read all documentation to understand how the API works.
13
+
14
+ ## Common API Issues
15
+
16
+ **Table created but API fails** → Check field names match schema exactly
17
+ **Array required** → PostgREST requires POST requests as arrays `[{...}]`
18
+ **Foreign key error** → Parent record must exist before child
19
+ **Permission denied** → Write operations need `Authorization: Bearer <accessToken>`
20
+ **JWSError** → JWT token expired or invalid - user needs to login again
21
+ **PATCH increment fails** → PostgREST doesn't support SQL expressions like `count + 1`
22
+
23
+ ## Debug Workflow
24
+
25
+ 1. **Always** call `get-backend-metadata` first
26
+ 2. Read the relevant API documentation completely
27
+ 3. Check your table schema matches your API calls
28
+ 4. Test with curl using exact format from docs
29
+ 5. Verify response matches documentation
30
+
31
+ ### Example Debug Tests
32
+
33
+ ```bash
34
+ # Test GET endpoint
35
+ # Windows PowerShell: use curl.exe
36
+ curl -X GET http://localhost:7130/api/database/records/your_table \
37
+ -H "Authorization: Bearer YOUR_TOKEN" | jq .
38
+
39
+ # Test POST with array format
40
+ # Mac/Linux
41
+ curl -X POST http://localhost:7130/api/database/records/your_table \
42
+ -H 'Content-Type: application/json' \
43
+ -H 'Authorization: Bearer YOUR_TOKEN' \
44
+ -H 'Prefer: return=representation' \
45
+ -d '[{"field": "value"}]' | jq .
46
+
47
+ # Windows PowerShell (use curl.exe) - different quotes for nested JSON
48
+ curl.exe -X POST http://localhost:7130/api/database/records/your_table \
49
+ -H "Content-Type: application/json" \
50
+ -H "Authorization: Bearer YOUR_TOKEN" \
51
+ -H "Prefer: return=representation" \
52
+ -d '[{\"field\": \"value\"}]' | jq .
53
+ ```
54
+
55
+ ## Key Rules
56
+
57
+ - Backend runs on port 7130
58
+ - **READ operations**: No authentication required
59
+ - **WRITE operations**: Need `Authorization: Bearer <accessToken>` header
60
+ - POST requests must be arrays `[{...}]`
61
+ - System tables (prefixed with _) need special APIs
62
+ - No escaped characters in JSON
63
+ - Login/register returns JWT tokens directly in `accessToken` field
64
+
65
+ **Remember**: MCP creates the structure, but you must follow API documentation exactly to use it.
@@ -0,0 +1,124 @@
1
+ # Insforge OSS Instructions
2
+
3
+ ## What Insforge OSS Does
4
+
5
+ Backend-as-a-service with database, authentication, and file storage.
6
+
7
+ **Key Concept**: InsForge replaces your traditional backend - implement business logic by calling database operations directly. Instead of building API endpoints, use our database API as your application's backend.
8
+
9
+ ## 🚨 Project Setup
10
+
11
+ **Create your app in a NEW directory, not inside `insforge/`**
12
+
13
+ The `insforge/` directory is the BaaS platform. Your app should live elsewhere:
14
+ ```
15
+ ~/projects/
16
+ ├── insforge/ # ← BaaS platform (don't work here)
17
+ └── my-app/ # ← Your new app (work here)
18
+ ```
19
+
20
+ ## When to Use Tools
21
+
22
+ **MUST DO FIRST** → Download project rules: `download-project-rules`
23
+ **Start here** → `get-backend-metadata` (shows current database state)
24
+ **Need docs** → `get-db-api`, `get-auth-api`, or `get-storage-api`
25
+ **Create table** → `create-table` with explicit schema
26
+ **Work with data** → Use database API endpoints directly
27
+
28
+ ## Critical Rule:
29
+ **MUST DO FIRST** → Call`download-project-rules` to download project ruless
30
+
31
+ ## Critical Rule: Check Metadata First
32
+
33
+ Before ANY database operation, call `get-backend-metadata` to get the current database state.
34
+
35
+ ## Standard Workflow
36
+
37
+ 1. **Always** call `get-backend-metadata` first
38
+ 2. Check `get-instructions` if unfamiliar with the system
39
+ 3. Create tables with `create-table` if needed
40
+ 4. Use database API to insert/query/update/delete records
41
+ 5. Call `get-backend-metadata` again to verify changes
42
+
43
+ ## Key Rules
44
+
45
+ - Frequently check `get-instructions` and `get-backend-metadata`
46
+ - Always define explicit table schemas (no assumptions)
47
+ - Every table gets auto ID, created_at, updated_at fields
48
+ - **Database operations require**: JWT token (Authorization: Bearer header)
49
+ - **API keys are for MCP testing** (use tokens for production)
50
+ - File uploads work automatically with multipart/form-data
51
+
52
+ ## Authentication Requirements
53
+
54
+ ### Database Operations Need Authentication Token:
55
+ 1. **JWT Token**: `Authorization: Bearer your-jwt-token` - Authenticates the user
56
+
57
+ **Important Note about API Keys:**
58
+ - The `x-api-key` header is ONLY used for MCP (Model Context Protocol) testing
59
+ - Production applications should NEVER use API keys
60
+ - Always use JWT tokens from user/admin authentication for real applications
61
+
62
+ Without the Bearer token, you'll get "permission denied" errors when trying to insert, update, or delete records.
63
+
64
+ ### Getting Authentication:
65
+ ```bash
66
+ # Works on both Windows and Unix (Windows PowerShell: use curl.exe)
67
+ # 1. First login to get JWT token
68
+ curl -X POST http://localhost:7130/api/auth/admin/sessions \
69
+ -H "Content-Type: application/json" \
70
+ -d "{\"email\":\"admin@example.com\",\"password\":\"your-password\"}"
71
+
72
+ # Response includes token: {"accessToken": "eyJ...", "user": {...}}
73
+
74
+ # Works on both Windows and Unix (Windows PowerShell: use curl.exe)
75
+ # 2. Use the auth token for database operations
76
+ curl -X POST http://localhost:7130/api/database/records/products \
77
+ -H "Authorization: Bearer eyJ..." \
78
+ -H "Content-Type: application/json" \
79
+ -d "[{\"name\": \"Product\", \"price\": 99.99}]"
80
+ ```
81
+
82
+ ## Example: Comment Upvoting Feature
83
+
84
+ - Check current tables: `get-backend-metadata`
85
+ - Create comment_votes table: `create-table` with user_id, comment_id, vote_type fields
86
+ - Frontend upvote action: `POST /api/database/records/comment_votes` with vote data
87
+ - Frontend display scores: `GET /api/database/records/comment_votes?comment_id=eq.123` to count votes
88
+ - No separate backend needed - frontend calls InsForge database API directly
89
+
90
+
91
+ ## Critical Rule: Test API Endpoints with curl
92
+
93
+ After creating or modifying any API endpoint, always test it with curl to verify it works correctly.
94
+
95
+ **Note:** Avoid special characters (!,$,`,\) in curl command data - they can cause bash interpretation issues. Use simple text for testing:
96
+
97
+ ```bash
98
+ # Works on both Windows and Unix (Windows PowerShell: use curl.exe)
99
+ # Example: Test creating a record (requires JWT token)
100
+ curl -X POST http://localhost:7130/api/database/records/posts \
101
+ -H "x-api-key: your-api-key" \
102
+ -H "Authorization: Bearer your-jwt-token" \
103
+ -H "Content-Type: application/json" \
104
+ -d '[{\"title\": \"Test Post\", \"content\": \"Test content\"}]'
105
+
106
+ # Works on both Windows and Unix (Windows PowerShell: use curl.exe)
107
+ # Example: Test querying records (requires both API key and JWT token)
108
+ curl http://localhost:7130/api/database/records/posts?id=eq.123 \
109
+ -H "x-api-key: your-api-key" \
110
+ -H "Authorization: Bearer your-jwt-token"
111
+
112
+ # Works on both Windows and Unix (Windows PowerShell: use curl.exe)
113
+ # Example: Test authentication
114
+ curl -X POST http://localhost:7130/api/auth/users \
115
+ -H "Content-Type: application/json" \
116
+ -d '{\"email\": \"test@example.com\", \"password\": \"testpass123\"}'
117
+ ```
118
+
119
+ Always include:
120
+ - **Both headers for database operations**: x-api-key AND Authorization: Bearer token
121
+ - Correct HTTP method (GET, POST, PATCH, DELETE)
122
+ - Valid JSON payload for POST/PATCH requests (remember: POST requires array format `[{...}]`)
123
+ - Query parameters for filtering GET requests
124
+ - Prefer: return=representation header if you want to see the created/updated records
@@ -0,0 +1,118 @@
1
+ ---
2
+ description: Insforge AI Development Rules - Essential guidelines for BaaS platform development
3
+ globs:
4
+ alwaysApply: true
5
+ ---
6
+
7
+ # Insforge Development Rules
8
+
9
+ ## Core Identity
10
+ You are an exceptional software developer using Insforge Backend to assist building the product. Make it visually stunning, content-rich, professional-grade UIs.
11
+
12
+ ## 🔴 MANDATORY: cURL Test at EVERY Step
13
+
14
+ **For AI Agents: Test with cURL repeatedly throughout development:**
15
+
16
+ 1. **Before coding** → Test endpoint exists, check response format
17
+ 2. **During coding** → Test when confused about any API behavior
18
+ 3. **After coding** → Test complete user journey end-to-end
19
+ 4. **When debugging** → Test to see actual vs expected responses
20
+
21
+ ```bash
22
+ # Mac/Linux
23
+ curl -X POST http://localhost:7130/api/[endpoint] \
24
+ -H 'Content-Type: application/json' \
25
+ -d '[{"key": "value"}]' | jq .
26
+
27
+ # Windows PowerShell (use curl.exe) - different quotes for nested JSON
28
+ curl.exe -X POST http://localhost:7130/api/[endpoint] \
29
+ -H "Content-Type: application/json" \
30
+ -d '[{\"key\": \"value\"}]' | jq .
31
+ ```
32
+
33
+ **You WILL get it wrong without testing. Test early, test often.**
34
+
35
+ ## Critical Architecture Points
36
+
37
+ When in doubt, read instructions documents again.
38
+
39
+ ## 🚨 CRUD Operations - PostgREST NOT RESTful
40
+ ### PostgREST Database API Behavior
41
+
42
+ **Critical PostgREST Rules:**
43
+
44
+ 1. **POST requires array**: `[{...}]` even for single record
45
+ 2. **Empty responses without `Prefer: return=representation`**:
46
+ - POST → `[]` (empty array)
47
+ - PATCH → 204 No Content
48
+ - DELETE → 204 No Content
49
+ - **DELETE is idempotent** - no error if record doesn't exist
50
+ 3. **With `Prefer: return=representation`**:
51
+ - Returns affected records as array
52
+ - DELETE and PATCH returns `[]` if record didn't exist
53
+ 4. **Pagination**:
54
+ - Request: `Range: 0-9` + `Prefer: count=exact`
55
+ - Response: `Content-Range: 0-9/100` header (shows total)
56
+ - Without `Prefer: count=exact`: `Content-Range: 0-9/*` (no total)
57
+ 5. **Query syntax**: `?field=operator.value`
58
+ - `?id=eq.123` (equals)
59
+ - `?age=gt.30` (greater than)
60
+ - `?name=like.*john*` (pattern match)
61
+
62
+ ## Auth Operations:
63
+
64
+ ### 🚨 IMPORTANT: Correct Auth Endpoints
65
+ - **Register**: `POST /api/auth/users` - Create new user account
66
+ - **Login**: `POST /api/auth/sessions` - Authenticate existing user
67
+ - **Admin Login**: `POST /api/auth/admin/sessions` - Admin authentication
68
+ - **Current User**: `GET /api/auth/sessions/current` - Get authenticated user info
69
+ - `/api/auth/sessions/current` returns `{"user": {...}}` - nested structure
70
+ - Store JWT tokens and include as `Authorization: Bearer {accessToken}` header
71
+ - **Note**: Login/register returns `{accessToken, user}` with JWT token
72
+
73
+ ### Regular API Response Format
74
+
75
+ **⚠️ IMPORTANT: Frontend Error Handling**
76
+ - **PARSE** backend responses and display user-friendly messages
77
+ - **DO NOT** show raw API responses directly to users
78
+ - **TRANSFORM** error details into readable, actionable messages
79
+
80
+ - Success: Data directly (object/array)
81
+ - Error: `{error, message, statusCode}`
82
+ - Empty POST/PATCH/DELETE: Add `Prefer: return=representation`
83
+
84
+ ### 🚨 Storage API Rules
85
+ - **Upload Methods**:
86
+ - **PUT** `/api/storage/buckets/{bucket}/objects/{filename}` - Upload with specific key
87
+ - **POST** `/api/storage/buckets/{bucket}/objects` - Upload with auto-generated key
88
+ - **Authentication**: Upload operations require `Authorization: Bearer {accessToken}`
89
+ - **Generate Unique Filenames**: Use POST for auto-generated keys to prevent overwrites
90
+ - **Multipart Form**: Use FormData for file uploads
91
+ - **URL Format**: Storage returns **ABSOLUTE URLs** (e.g., `http://localhost:7130/api/storage/buckets/{bucket}/objects/{filename}`)
92
+ - **IMPORTANT**: URLs are complete and ready to use - no need to prepend host or path
93
+ - Use the URL directly in `<img src>` or fetch requests
94
+
95
+ ## 🔥 Test EVERY Endpoint
96
+
97
+ **Backend runs on port 7130**
98
+
99
+ Always test with cURL before UI integration:
100
+ - Include `Authorization: Bearer {accessToken}` for auth
101
+ - Add `Prefer: return=representation` to see created data
102
+ - Windows PowerShell: use curl.exe
103
+
104
+ ```bash
105
+ # Mac/Linux
106
+ curl -X POST http://localhost:7130/api/database/records/posts \
107
+ -H 'Authorization: Bearer TOKEN' \
108
+ -H 'Content-Type: application/json' \
109
+ -H 'Prefer: return=representation' \
110
+ -d '[{"user_id": "from-localStorage", "caption": "Test"}]'
111
+
112
+ # Windows PowerShell (use curl.exe) - different quotes for nested JSON
113
+ curl.exe -X POST http://localhost:7130/api/database/records/posts \
114
+ -H "Authorization: Bearer TOKEN" \
115
+ -H "Content-Type: application/json" \
116
+ -H "Prefer: return=representation" \
117
+ -d '[{\"user_id\": \"from-localStorage\", \"caption\": \"Test\"}]'
118
+ ```
@@ -0,0 +1,279 @@
1
+ # Insforge OSS Storage API Documentation
2
+
3
+ ## API Basics
4
+
5
+ **Base URL:** `http://localhost:7130`
6
+ **Authentication:**
7
+ - **Upload operations (PUT/POST/DELETE):** Requires `Authorization: Bearer <token>` header
8
+ - **Download from public buckets:** No authentication required
9
+ - **List/manage buckets:** Requires authentication
10
+ - **API keys are for MCP testing** (use tokens for production)
11
+ **System:** Bucket-based storage with public/private access control
12
+
13
+ ### 🔴 CRITICAL: URL Format
14
+ **Storage returns ABSOLUTE URLs** that are ready to use directly:
15
+ - Response `url` field contains complete URL: `http://localhost:7130/api/storage/buckets/{bucket}/objects/{filename}`
16
+ - **DO NOT prepend host or modify the URL** - use it exactly as returned
17
+ - URLs work directly in `<img src>`, `<video src>`, or fetch requests
18
+ - Example: `"url": "http://localhost:7130/api/storage/buckets/avatars/objects/user123.jpg"`
19
+
20
+
21
+ ## Bucket Operations (Use MCP Tools)
22
+
23
+ ### Available MCP Tools
24
+ 1. **create-bucket** - Create bucket (`bucketName`, `isPublic`: true by default)
25
+ 2. **list-buckets** - List all buckets
26
+ 3. **delete-bucket** - Delete bucket
27
+
28
+ ## Object Operations (Use REST API)
29
+
30
+ ### Base URL
31
+ `/api/storage/buckets/:bucketName/objects/:objectKey`
32
+
33
+ ### Upload Object with Specific Key
34
+ **PUT** `/api/storage/buckets/:bucketName/objects/:objectKey`
35
+
36
+
37
+ Send object as multipart/form-data:
38
+ ```javascript
39
+ const formData = new FormData();
40
+ formData.append('file', fileObject);
41
+ ```
42
+
43
+ Returns:
44
+ ```json
45
+ {
46
+ "bucket": "test-images",
47
+ "key": "test.txt",
48
+ "size": 30,
49
+ "mimeType": "text/plain",
50
+ "uploadedAt": "2025-07-18T04:32:13.801Z",
51
+ "url": "http://localhost:7130/api/storage/buckets/test-images/objects/test.txt"
52
+ }
53
+ ```
54
+
55
+ Example curl:
56
+ ```bash
57
+ # Windows PowerShell: use curl.exe
58
+ curl -X PUT http://localhost:7130/api/storage/buckets/avatars/objects/user123.jpg \
59
+ -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
60
+ -F "file=@/path/to/image.jpg"
61
+ ```
62
+
63
+ ### Upload Object with Auto-Generated Key
64
+ **POST** `/api/storage/buckets/:bucketName/objects`
65
+
66
+ Request:
67
+ ```bash
68
+ # Windows PowerShell: use curl.exe
69
+ curl -X POST http://localhost:7130/api/storage/buckets/posts/objects \
70
+ -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
71
+ -F "file=@/path/to/image.jpg"
72
+ ```
73
+
74
+ Response:
75
+ ```json
76
+ {
77
+ "bucket": "avatars",
78
+ "key": "image-1737546841234-a3f2b1.jpg",
79
+ "size": 15234,
80
+ "mimeType": "image/jpeg",
81
+ "uploadedAt": "2025-07-18T04:32:13.801Z",
82
+ "url": "http://localhost:7130/api/storage/buckets/avatars/objects/image-1737546841234-a3f2b1.jpg"
83
+ }
84
+ ```
85
+
86
+ ### Download Object
87
+ **GET** `/api/storage/buckets/:bucketName/objects/:objectKey`
88
+
89
+ Returns the actual object content with appropriate content-type headers.
90
+ **Note:** Public buckets allow downloads without authentication.
91
+
92
+ Example response: Raw object content (not JSON wrapped)
93
+
94
+ ### List Objects
95
+ **GET** `/api/storage/buckets/:bucketName/objects`
96
+
97
+ Query parameters:
98
+ - `prefix` - Filter by key prefix
99
+ - `limit` - Max results (default: 100)
100
+ - `offset` - Pagination offset
101
+
102
+ Returns:
103
+ ```json
104
+ {
105
+ "bucketName": "test-images",
106
+ "prefix": null,
107
+ "objects": [
108
+ {
109
+ "bucket": "test-images",
110
+ "key": "test.txt",
111
+ "size": 30,
112
+ "mimeType": "text/plain",
113
+ "uploadedAt": "2025-07-18T04:32:13.801Z",
114
+ "url": "http://localhost:7130/api/storage/buckets/test-images/objects/test.txt"
115
+ }
116
+ ],
117
+ "pagination": {
118
+ "limit": 100,
119
+ "offset": 0,
120
+ "total": 1
121
+ },
122
+ "nextActions": "You can use PUT /api/storage/buckets/:bucketName/objects/:objectKey to upload with a specific key, or POST /api/storage/buckets/:bucketName/objects to upload with auto-generated key, and GET /api/storage/buckets/:bucketName/objects/:objectKey to download an object."
123
+ }
124
+ ```
125
+
126
+ Pagination headers:
127
+ - `X-Total-Count`: Total number of objects
128
+ - `X-Page`: Current page number
129
+ - `X-Page-Size`: Number of items per page
130
+
131
+ Example curl:
132
+ ```bash
133
+ # Windows PowerShell: use curl.exe
134
+ curl -X GET "http://localhost:7130/api/storage/buckets/avatars/objects?limit=10&prefix=users/" \
135
+ -H "Authorization: Bearer <token>"
136
+ ```
137
+
138
+ ### Delete Object
139
+ **DELETE** `/api/storage/buckets/:bucketName/objects/:objectKey`
140
+
141
+ Returns:
142
+ ```json
143
+ {
144
+ "message": "Object deleted successfully"
145
+ }
146
+ ```
147
+
148
+ Example curl:
149
+ ```bash
150
+ # Windows PowerShell: use curl.exe
151
+ curl -X DELETE http://localhost:7130/api/storage/buckets/avatars/objects/user123.jpg \
152
+ -H "Authorization: Bearer <token>"
153
+ ```
154
+
155
+ ### Update Bucket
156
+ **PATCH** `/api/storage/buckets/:bucketName`
157
+
158
+ Request body:
159
+ ```json
160
+ { "isPublic": true }
161
+ ```
162
+
163
+ Returns:
164
+ ```json
165
+ {
166
+ "message": "Bucket visibility updated",
167
+ "bucket": "test-images",
168
+ "isPublic": false,
169
+ "nextActions": "Bucket is now PRIVATE - authentication is required to access objects."
170
+ }
171
+ ```
172
+
173
+ Example curl:
174
+ ```bash
175
+ # Mac/Linux
176
+ curl -X PATCH http://localhost:7130/api/storage/buckets/avatars \
177
+ -H 'Authorization: Bearer <token>' \
178
+ -H 'Content-Type: application/json' \
179
+ -d '{"isPublic": true}'
180
+
181
+ # Windows PowerShell (use curl.exe) - different quotes needed for nested JSON
182
+ curl.exe -X PATCH http://localhost:7130/api/storage/buckets/avatars \
183
+ -H "Authorization: Bearer <token>" \
184
+ -H "Content-Type: application/json" \
185
+ -d '{\"isPublic\": true}'
186
+ ```
187
+
188
+ ## Database Integration
189
+
190
+ ### Option 1: Upload with Specific Key (PUT)
191
+ ```javascript
192
+ // Step 1: Upload object with known key
193
+ const formData = new FormData();
194
+ formData.append('file', file);
195
+ const upload = await fetch('/api/storage/buckets/images/objects/avatar.jpg', {
196
+ method: 'PUT',
197
+ headers: { 'Authorization': `Bearer ${token}` },
198
+ body: formData
199
+ });
200
+
201
+ // Step 2: Store metadata
202
+ const records = [{
203
+ userId: 'user123',
204
+ image: await upload.json() // Store object metadata
205
+ }];
206
+ await fetch('/api/database/profiles', {
207
+ method: 'POST',
208
+ headers: {
209
+ 'Authorization': `Bearer ${token}`,
210
+ 'Content-Type': 'application/json'
211
+ },
212
+ body: JSON.stringify(records)
213
+ });
214
+ ```
215
+
216
+ ### Option 2: Upload with Auto-Generated Key (POST)
217
+ ```javascript
218
+ // Step 1: Upload object with auto-generated key
219
+ const formData = new FormData();
220
+ formData.append('file', file);
221
+ const upload = await fetch('/api/storage/buckets/images/objects', {
222
+ method: 'POST',
223
+ headers: { 'Authorization': `Bearer ${token}` },
224
+ body: formData
225
+ });
226
+ const fileData = await upload.json();
227
+
228
+ // Step 2: Store metadata with generated key
229
+ const records = [{
230
+ userId: 'user123',
231
+ image: fileData // Contains auto-generated key
232
+ }];
233
+ await fetch('/api/database/profiles', {
234
+ method: 'POST',
235
+ headers: {
236
+ 'Authorization': `Bearer ${token}`,
237
+ 'Content-Type': 'application/json'
238
+ },
239
+ body: JSON.stringify(records)
240
+ });
241
+ ```
242
+
243
+ ## Error Response Format
244
+
245
+ All error responses follow this format:
246
+ ```json
247
+ {
248
+ "error": "ERROR_CODE",
249
+ "message": "Human-readable error message",
250
+ "statusCode": 400,
251
+ "nextActions": "Suggested action to resolve the error"
252
+ }
253
+ ```
254
+
255
+ Example error:
256
+ ```json
257
+ {
258
+ "error": "BUCKET_NOT_FOUND",
259
+ "message": "Bucket 'nonexistent' does not exist",
260
+ "statusCode": 404,
261
+ "nextActions": "Create the bucket first"
262
+ }
263
+ ```
264
+
265
+ ## Important Rules
266
+
267
+ 1. **Object Operations**
268
+ - Upload uses multipart/form-data
269
+ - Database stores metadata only
270
+ - Use `json` column type for object metadata
271
+
272
+ 2. **Bucket Names**
273
+ - Must be valid identifiers
274
+ - Cannot start with underscore
275
+
276
+ 3. **Remember**
277
+ - Bucket management uses MCP tools
278
+ - Object operations use REST API
279
+ - All operations need API key