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,689 @@
1
+ import { StorageBucketSchema, TableSchema } from '@insforge/shared-schemas';
2
+ import logger from '@/utils/logger.js';
3
+ import { StorageService } from '../storage/storage';
4
+ import { DatabaseTableService } from '../database/table';
5
+ import { DatabaseManager } from '../database/manager';
6
+
7
+ export class AgentAPIDocService {
8
+ private static instance: AgentAPIDocService;
9
+
10
+ private constructor() {}
11
+
12
+ static getInstance(): AgentAPIDocService {
13
+ if (!AgentAPIDocService.instance) {
14
+ AgentAPIDocService.instance = new AgentAPIDocService();
15
+ }
16
+ return AgentAPIDocService.instance;
17
+ }
18
+
19
+ /**
20
+ * Map internal column types to API-friendly type names
21
+ */
22
+ private mapColumnType(type: string): string {
23
+ const typeMap: Record<string, string> = {
24
+ string: 'string',
25
+ datetime: 'date-time string',
26
+ integer: 'integer',
27
+ float: 'number',
28
+ boolean: 'boolean',
29
+ uuid: 'UUID string',
30
+ json: 'object/array',
31
+ };
32
+ return typeMap[type] || type;
33
+ }
34
+
35
+ /**
36
+ * Convert table schema to simplified record schema with foreign key descriptions
37
+ */
38
+ private tableToRecordSchema(
39
+ table: TableSchema
40
+ ): Record<string, { type: string; required: boolean; description?: string }> {
41
+ const schema: Record<string, { type: string; required: boolean; description?: string }> = {};
42
+
43
+ for (const column of table.columns) {
44
+ const field: { type: string; required: boolean; description?: string } = {
45
+ type: this.mapColumnType(column.type),
46
+ required: !column.isNullable,
47
+ };
48
+
49
+ // Add foreign key relationship description
50
+ if (column.foreignKey) {
51
+ const fk = column.foreignKey;
52
+ field.description = `Foreign key reference to ${fk.referenceTable}.${fk.referenceColumn}`;
53
+ }
54
+
55
+ schema[column.columnName] = field;
56
+ }
57
+
58
+ return schema;
59
+ }
60
+
61
+ /**
62
+ * Generate AI-native API documentation
63
+ */
64
+ async generateAgentDocumentation(): Promise<Record<string, unknown>> {
65
+ try {
66
+ // Get fresh metadata from database controller
67
+
68
+ const storageService = StorageService.getInstance();
69
+ const storageMetadata = await storageService.getMetadata();
70
+ const tableService = new DatabaseTableService();
71
+ const dbManager = DatabaseManager.getInstance();
72
+ const allTables = await dbManager.getUserTables();
73
+
74
+ // Generate table schemas with descriptions
75
+ const tableSchemas: Record<
76
+ string,
77
+ Record<string, { type: string; required: boolean; description?: string }>
78
+ > = {};
79
+ const tableList: string[] = [];
80
+
81
+ for (const table of allTables) {
82
+ const tableSchema = await tableService.getTableSchema(table);
83
+ tableSchemas[`${table}RecordSchema`] = this.tableToRecordSchema(tableSchema);
84
+ tableList.push(table);
85
+ }
86
+
87
+ // Get storage buckets
88
+ const buckets = storageMetadata.buckets || [];
89
+ const bucketList = buckets.map((bucket: StorageBucketSchema) => bucket.name);
90
+
91
+ const document = {
92
+ '<critical>': 'Re-read this documentation at the start of each conversation',
93
+ version: process.env.npm_package_version || '1.0.0',
94
+ baseUrl: process.env.API_BASE_URL || 'http://localhost:7130',
95
+ securitySchemes: {
96
+ method: 'bearerToken',
97
+ bearerHeader: 'Authorization',
98
+ bearerFormat: 'Bearer {token}',
99
+ },
100
+ // Authentication API for user management
101
+ authenticationApi: {
102
+ register: {
103
+ method: 'POST',
104
+ path: '/api/auth/users',
105
+ request: {
106
+ requiresAuth: false,
107
+ body: {
108
+ email: 'string - valid email address',
109
+ password: 'string - user password (min 8 characters)',
110
+ name: 'string (optional) - user display name',
111
+ },
112
+ },
113
+ response: {
114
+ success: {
115
+ status: 200,
116
+ body: {
117
+ user: '{id: string, email: string, name: string | null}',
118
+ accessToken: 'string - JWT token for authentication',
119
+ },
120
+ },
121
+ error: {
122
+ status: '400 | 409 | 500',
123
+ body: '{error: string, message: string, statusCode: number}',
124
+ },
125
+ },
126
+ example: {
127
+ request: 'POST /api/auth/users',
128
+ body: '{email: "user@example.com", password: "securePassword123", name: "John Doe"}',
129
+ response:
130
+ '{user: {id: "uuid", email: "user@example.com", name: "John Doe"}, accessToken: "eyJ..."}',
131
+ },
132
+ },
133
+
134
+ login: {
135
+ method: 'POST',
136
+ path: '/api/auth/sessions',
137
+ request: {
138
+ requiresAuth: false,
139
+ body: {
140
+ email: 'string - user email address',
141
+ password: 'string - user password',
142
+ },
143
+ },
144
+ response: {
145
+ success: {
146
+ status: 200,
147
+ body: {
148
+ user: '{id: string, email: string, name: string | null}',
149
+ accessToken: 'string - JWT token for authentication',
150
+ },
151
+ },
152
+ error: {
153
+ status: '401 | 400 | 500',
154
+ body: '{error: string, message: string, statusCode: number}',
155
+ },
156
+ },
157
+ example: {
158
+ request: 'POST /api/auth/sessions',
159
+ body: '{email: "user@example.com", password: "securePassword123"}',
160
+ response:
161
+ '{user: {id: "uuid", email: "user@example.com", name: "John Doe"}, accessToken: "eyJ..."}',
162
+ },
163
+ },
164
+
165
+ getCurrentUser: {
166
+ method: 'GET',
167
+ path: '/api/auth/sessions/current',
168
+ request: {
169
+ requiresAuth: true,
170
+ headers: {
171
+ Authorization: 'Bearer {accessToken}',
172
+ },
173
+ },
174
+ response: {
175
+ success: {
176
+ status: 200,
177
+ body: {
178
+ user: '{id: string, email: string, role: string}',
179
+ },
180
+ },
181
+ error: {
182
+ status: '401 | 500',
183
+ body: '{error: string, message: string, statusCode: number}',
184
+ },
185
+ },
186
+ example: {
187
+ request: 'GET /api/auth/sessions/current',
188
+ headers: 'Authorization: Bearer eyJ...',
189
+ response: '{user: {id: "uuid", email: "user@example.com", role: "user"}}',
190
+ },
191
+ },
192
+
193
+ googleOAuth: {
194
+ method: 'GET',
195
+ path: '/api/auth/oauth/google',
196
+ request: {
197
+ requiresAuth: false,
198
+ queryParams: {
199
+ redirect_uri: 'string (optional) - URL to redirect after OAuth completion',
200
+ },
201
+ },
202
+ response: {
203
+ success: {
204
+ status: 200,
205
+ body: {
206
+ authUrl: 'string - Google OAuth authorization URL',
207
+ },
208
+ },
209
+ error: {
210
+ status: '500',
211
+ body: '{error: string, message: string, statusCode: number}',
212
+ },
213
+ },
214
+ example: {
215
+ request: 'GET /api/auth/oauth/google?redirect_uri=http://localhost:3000/dashboard',
216
+ response: '{authUrl: "https://accounts.google.com/o/oauth2/v2/auth?..."}',
217
+ },
218
+ },
219
+
220
+ githubOAuth: {
221
+ method: 'GET',
222
+ path: '/api/auth/oauth/github',
223
+ request: {
224
+ requiresAuth: false,
225
+ queryParams: {
226
+ redirect_uri: 'string (optional) - URL to redirect after OAuth completion',
227
+ },
228
+ },
229
+ response: {
230
+ success: {
231
+ status: 200,
232
+ body: {
233
+ authUrl: 'string - GitHub OAuth authorization URL',
234
+ },
235
+ },
236
+ error: {
237
+ status: '500',
238
+ body: '{error: string, message: string, statusCode: number}',
239
+ },
240
+ },
241
+ example: {
242
+ request: 'GET /api/auth/oauth/github?redirect_uri=http://localhost:3000/dashboard',
243
+ response: '{authUrl: "https://github.com/login/oauth/authorize?..."}',
244
+ },
245
+ },
246
+ },
247
+
248
+ // Universal patterns for all tables
249
+ '<critical-database>':
250
+ 'Re-read the tableApi section before implementing database operations',
251
+ tableApi: {
252
+ list: {
253
+ method: 'GET',
254
+ path: '/api/database/records/{tableName}',
255
+ request: {
256
+ params: {
257
+ tableName: 'string - name of the table',
258
+ },
259
+ queryParams: {
260
+ // Pagination
261
+ limit: 'number (default: 100)',
262
+ offset: 'number (default: 0)',
263
+ // Sorting
264
+ order: '{columnName}.asc or {columnName}.desc',
265
+ // Selection
266
+ select: 'comma-separated column names (e.g., id,name,email)',
267
+ // Filtering - PostgREST operators
268
+ '{columnName}=eq.{value}': 'equals (exact match)',
269
+ '{columnName}=neq.{value}': 'not equals',
270
+ '{columnName}=gt.{value}': 'greater than',
271
+ '{columnName}=gte.{value}': 'greater than or equal',
272
+ '{columnName}=lt.{value}': 'less than',
273
+ '{columnName}=lte.{value}': 'less than or equal',
274
+ '{columnName}=like.{pattern}': 'LIKE pattern (use * as wildcard)',
275
+ '{columnName}=ilike.{pattern}': 'case-insensitive LIKE (use * as wildcard)',
276
+ '{columnName}=is.null': 'IS NULL',
277
+ '{columnName}=not.is.null': 'IS NOT NULL',
278
+ '{columnName}=in.({value1},{value2},{value3})':
279
+ 'IN - comma-separated values in parentheses',
280
+ },
281
+ },
282
+ response: {
283
+ success: {
284
+ status: 200,
285
+ body: 'Array<{tableName}RecordSchema>',
286
+ },
287
+ error: {
288
+ status: '400 | 401 | 500',
289
+ body: '{error: string, message: string, statusCode: number}',
290
+ },
291
+ },
292
+ example: {
293
+ request:
294
+ 'GET /api/database/records/products?limit=10&offset=0&status=active&order=created_at.desc',
295
+ response: '[{...record1}, {...record2}]',
296
+ },
297
+ },
298
+
299
+ getById: {
300
+ method: 'GET',
301
+ path: '/api/database/records/{tableName}?id=eq.{id}',
302
+ request: {
303
+ params: {
304
+ tableName: 'string - name of the table',
305
+ },
306
+ queryParams: {
307
+ 'id=eq.{value}': 'string - primary key value (using PostgREST eq operator)',
308
+ },
309
+ },
310
+ response: {
311
+ success: {
312
+ status: 200,
313
+ body: 'Array<{tableName}RecordSchema> (single item array)',
314
+ },
315
+ error: {
316
+ status: '404 | 401 | 500',
317
+ body: '{error: string, message: string, statusCode: number}',
318
+ },
319
+ },
320
+ example: {
321
+ request: 'GET /api/database/records/products?id=eq.123',
322
+ response: '[{id: "123", name: "Product Name", price: 29.99, ...}]',
323
+ },
324
+ },
325
+
326
+ create: {
327
+ '<critical-create>':
328
+ 'Re-read this create operation documentation before every POST request',
329
+ method: 'POST',
330
+ path: '/api/database/records/{tableName}',
331
+ request: {
332
+ params: {
333
+ tableName: 'string - name of the table',
334
+ },
335
+ body: '[Omit<{tableName}RecordSchema, "id" | "created_at" | "updated_at">] - MUST be array even for single record (exclude the system fields)',
336
+ headers: {
337
+ Prefer:
338
+ 'return=representation (REQUIRED to get created record back, otherwise returns empty array)',
339
+ },
340
+ },
341
+ response: {
342
+ success: {
343
+ status: 201,
344
+ body: 'Array<{tableName}RecordSchema> with Prefer header | [] empty array without',
345
+ },
346
+ error: {
347
+ status: '400 | 401 | 500',
348
+ body: '{error: string, message: string, statusCode: number}',
349
+ },
350
+ },
351
+ example: {
352
+ request: 'POST /api/database/records/products',
353
+ headers: 'Prefer: return=representation',
354
+ body: '[{name: "New Product", price: 29.99, category: "electronics"}]',
355
+ response:
356
+ '[{id: "123", name: "New Product", price: 29.99, category: "electronics", created_at: "...", updated_at: "..."}]',
357
+ },
358
+ },
359
+
360
+ update: {
361
+ method: 'PATCH',
362
+ path: '/api/database/records/{tableName}?id=eq.{id}',
363
+ request: {
364
+ params: {
365
+ tableName: 'string - name of the table',
366
+ },
367
+ queryParams: {
368
+ 'id=eq.{value}': 'string - primary key value (using PostgREST eq operator)',
369
+ },
370
+ body: 'Partial<{tableName}RecordSchema> (all fields optional, exclude the system fields)',
371
+ headers: {
372
+ Prefer: 'return=representation (optional - to return updated record)',
373
+ },
374
+ },
375
+ response: {
376
+ success: {
377
+ status: 200,
378
+ body: 'Array<{tableName}RecordSchema> (with Prefer: return=representation) | 204 No Content (without)',
379
+ },
380
+ error: {
381
+ status: '404 | 400 | 401 | 500',
382
+ body: '{error: string, message: string, statusCode: number}',
383
+ },
384
+ },
385
+ example: {
386
+ request: 'PATCH /api/database/records/products?id=eq.123',
387
+ headers: 'Prefer: return=representation',
388
+ body: '{price: 39.99}',
389
+ response: '[{id: "123", name: "Product Name", price: 39.99, ...}]',
390
+ },
391
+ },
392
+
393
+ delete: {
394
+ method: 'DELETE',
395
+ path: '/api/database/records/{tableName}?id=eq.{id}',
396
+ request: {
397
+ params: {
398
+ tableName: 'string - name of the table',
399
+ },
400
+ queryParams: {
401
+ 'id=eq.{value}': 'string - primary key value (using PostgREST eq operator)',
402
+ },
403
+ headers: {
404
+ Prefer: 'return=representation (optional - to return deleted record)',
405
+ },
406
+ },
407
+ response: {
408
+ success: {
409
+ status: 204,
410
+ body: 'null (No Content) | Array<{tableName}RecordSchema> with Prefer: return=representation',
411
+ },
412
+ error: {
413
+ status: '404 | 401 | 500',
414
+ body: '{error: string, message: string, statusCode: number}',
415
+ },
416
+ },
417
+ example: {
418
+ request: 'DELETE /api/database/records/products?id=eq.123',
419
+ response: 'Status: 204',
420
+ },
421
+ },
422
+
423
+ bulkUpdate: {
424
+ method: 'PATCH',
425
+ path: '/api/database/records/{tableName}',
426
+ request: {
427
+ params: {
428
+ tableName: 'string - name of the table',
429
+ },
430
+ queryParams: 'Use filters to select records (same as list operation)',
431
+ body: 'Partial<{tableName}RecordSchema>',
432
+ },
433
+ response: {
434
+ success: {
435
+ status: 200,
436
+ body: 'Array<{tableName}RecordSchema>',
437
+ },
438
+ error: {
439
+ status: '400 | 401 | 500',
440
+ body: '{error: string, message: string, statusCode: number}',
441
+ },
442
+ },
443
+ example: {
444
+ request: 'PATCH /api/database/records/products?category=electronics',
445
+ body: '{discount: 10}',
446
+ response: '[{id: "123", name: "Product 1", discount: 10, ...}, ...]',
447
+ },
448
+ },
449
+
450
+ bulkDelete: {
451
+ method: 'DELETE',
452
+ path: '/api/database/records/{tableName}',
453
+ request: {
454
+ params: {
455
+ tableName: 'string - name of the table',
456
+ },
457
+ queryParams: 'Use filters to select records (same as list operation)',
458
+ },
459
+ response: {
460
+ success: {
461
+ status: 204,
462
+ body: 'null (No Content)',
463
+ },
464
+ error: {
465
+ status: '400 | 401 | 500',
466
+ body: '{error: string, message: string, statusCode: number}',
467
+ },
468
+ },
469
+ example: {
470
+ request: 'DELETE /api/database/records/products?discontinued=true',
471
+ response: 'Status: 204',
472
+ },
473
+ },
474
+ },
475
+
476
+ // Storage API for file upload and management
477
+ '<critical-storage>': 'Re-read storageApi section before implementing file operations',
478
+ storageApi: {
479
+ uploadObject: {
480
+ method: 'PUT',
481
+ path: '/api/storage/buckets/{bucketName}/objects/{objectKey}',
482
+ request: {
483
+ requiresAuth: 'user',
484
+ params: {
485
+ bucketName: 'string - name of the bucket',
486
+ objectKey:
487
+ 'string - full object key/path (can include folders like "images/photo.jpg")',
488
+ },
489
+ body: 'multipart/form-data with "file" field containing the file data',
490
+ headers: {
491
+ 'Content-Type': 'multipart/form-data',
492
+ },
493
+ },
494
+ response: {
495
+ success: {
496
+ status: 201,
497
+ body: 'StorageFileSchema',
498
+ },
499
+ error: {
500
+ status: '400 | 409 | 401 | 500',
501
+ body: '{error: string, message: string, statusCode: number}',
502
+ },
503
+ },
504
+ example: {
505
+ request: 'PUT /api/storage/buckets/uploads/objects/images/profile.jpg',
506
+ formData: 'file: <binary data>',
507
+ response:
508
+ '{key: "images/profile.jpg", bucket: "uploads", size: 2048, mimeType: "image/jpeg", url: "/api/storage/buckets/uploads/objects/images/profile.jpg"}',
509
+ },
510
+ },
511
+
512
+ uploadObjectAutoKey: {
513
+ method: 'POST',
514
+ path: '/api/storage/buckets/{bucketName}/objects',
515
+ request: {
516
+ requiresAuth: 'user',
517
+ params: {
518
+ bucketName: 'string - name of the bucket',
519
+ },
520
+ body: 'multipart/form-data with "file" field containing the file data',
521
+ headers: {
522
+ 'Content-Type': 'multipart/form-data',
523
+ },
524
+ },
525
+ response: {
526
+ success: {
527
+ status: 201,
528
+ body: 'StorageFileSchema (with auto-generated key)',
529
+ },
530
+ error: {
531
+ status: '404 | 400 | 401 | 500',
532
+ body: '{error: string, message: string, statusCode: number}',
533
+ },
534
+ },
535
+ example: {
536
+ request: 'POST /api/storage/buckets/uploads/objects',
537
+ formData: 'file: <binary data of photo.jpg>',
538
+ response:
539
+ '{key: "photo-1704000000000-abc123.jpg", bucket: "uploads", size: 2048, url: "/api/storage/buckets/uploads/objects/photo-1704000000000-abc123.jpg"}',
540
+ },
541
+ },
542
+
543
+ downloadObject: {
544
+ method: 'GET',
545
+ path: '/api/storage/buckets/{bucketName}/objects/{objectKey}',
546
+ request: {
547
+ requiresAuth: 'conditional - required only for private buckets',
548
+ params: {
549
+ bucketName: 'string - name of the bucket',
550
+ objectKey: 'string - full object key/path',
551
+ },
552
+ },
553
+ response: {
554
+ success: {
555
+ status: 200,
556
+ headers: {
557
+ 'Content-Type': 'file MIME type',
558
+ 'Content-Length': 'file size in bytes',
559
+ },
560
+ body: 'Binary file data',
561
+ },
562
+ error: {
563
+ status: '404 | 400 | 401 | 500',
564
+ body: '{error: string, message: string, statusCode: number}',
565
+ },
566
+ },
567
+ example: {
568
+ request: 'GET /api/storage/buckets/uploads/objects/images/profile.jpg',
569
+ response: '<binary image data>',
570
+ },
571
+ },
572
+
573
+ deleteObject: {
574
+ method: 'DELETE',
575
+ path: '/api/storage/buckets/{bucketName}/objects/{objectKey}',
576
+ request: {
577
+ requiresAuth: 'user',
578
+ params: {
579
+ bucketName: 'string - name of the bucket',
580
+ objectKey: 'string - full object key/path',
581
+ },
582
+ },
583
+ response: {
584
+ success: {
585
+ status: 200,
586
+ body: '{message: string}',
587
+ },
588
+ error: {
589
+ status: '404 | 400 | 401 | 500',
590
+ body: '{error: string, message: string, statusCode: number}',
591
+ },
592
+ },
593
+ example: {
594
+ request: 'DELETE /api/storage/buckets/uploads/objects/temp/file.tmp',
595
+ response: '{message: "Object deleted successfully"}',
596
+ },
597
+ },
598
+ },
599
+ // Available tables and their schemas
600
+ tables: {
601
+ availableTableNames: tableList,
602
+ schemas: tableSchemas,
603
+ systemFields: {
604
+ '<critical-info>': 'All system fields are auto-managed by InsForge. NEVER change them.',
605
+ id: { type: 'uuid', autoGenerated: true, primary: true },
606
+ created_at: { type: 'datetime', autoGenerated: true },
607
+ updated_at: { type: 'datetime', autoGenerated: true, autoUpdated: true },
608
+ },
609
+ },
610
+ // Storage schemas
611
+ storage: {
612
+ availableBuckets: bucketList,
613
+ schemas: {
614
+ StorageFileSchema: {
615
+ key: { type: 'string', required: true },
616
+ bucket: { type: 'string', required: true },
617
+ size: { type: 'number (bytes)', required: true },
618
+ mimeType: { type: 'string', required: false },
619
+ uploadedAt: { type: 'datetime string', required: true },
620
+ url: {
621
+ type: 'string',
622
+ required: true,
623
+ description: 'Relative path: /api/storage/buckets/{bucket}/objects/{key}',
624
+ },
625
+ },
626
+ },
627
+ },
628
+
629
+ // Quick reference for AI
630
+ '<critical-quickref>': 'Re-read quickReference before starting implementation',
631
+ quickReference: {
632
+ authenticationSteps: [
633
+ '1. Register new users with POST /api/auth/users',
634
+ '2. Login existing users with POST /api/auth/sessions',
635
+ '3. Both endpoints return an accessToken for authentication',
636
+ '4. Include token in Authorization header as "Bearer {token}"',
637
+ '5. OAuth login available via Google and GitHub providers',
638
+ '6. Get current user info with GET /api/auth/sessions/current',
639
+ ],
640
+ databaseSteps: [
641
+ '1. Choose a table from tables.availableTableNames',
642
+ '2. Use the tableApi operations with the chosen table name',
643
+ '3. For request body, use tables.schemas.{tableName}RecordSchema',
644
+ '4. Exclude system fields (id, created_at, updated_at) when creating or updating',
645
+ '5. All update operations accept partial schemas (all fields optional)',
646
+ '6. Use query parameters for filtering, sorting, and pagination in list operations',
647
+ ],
648
+ storageSteps: [
649
+ '1. Upload files using PUT (specific key) or POST (auto-generated key)',
650
+ '2. Files are uploaded as multipart/form-data with "file" field',
651
+ '3. Response url field contains relative path to the file',
652
+ '4. Download files using GET with the url path',
653
+ '5. Public buckets allow downloading without authentication',
654
+ '6. Private buckets require authentication for all operations',
655
+ '7. Organize files using key prefixes like "images/", "documents/"',
656
+ ],
657
+ examples: {
658
+ // Authentication examples
659
+ register:
660
+ 'POST /api/auth/users with body {email: "user@example.com", password: "password123"}',
661
+ login:
662
+ 'POST /api/auth/sessions with body {email: "user@example.com", password: "password123"}',
663
+ getCurrentUser: 'GET /api/auth/sessions/current with Authorization: Bearer {token}',
664
+ googleLogin: 'GET /api/auth/oauth/google?redirect_uri=http://localhost:3000',
665
+ githubLogin: 'GET /api/auth/oauth/github?redirect_uri=http://localhost:3000',
666
+ // Database examples
667
+ listProducts: 'GET /api/database/records/products?limit=10&category=eq.electronics',
668
+ createProduct:
669
+ 'POST /api/database/records/products with Prefer: return=representation header and body [{name: "New Product", price: 29.99}]',
670
+ updateProduct:
671
+ 'PATCH /api/database/records/products?id=eq.123 with Prefer: return=representation header and body {price: 39.99}',
672
+ deleteProduct: 'DELETE /api/database/records/products?id=eq.123',
673
+ // Storage examples
674
+ uploadFile: 'PUT /api/storage/buckets/uploads/objects/avatar.jpg with FormData file',
675
+ downloadFile: 'GET /api/storage/buckets/uploads/objects/avatar.jpg',
676
+ deleteFile: 'DELETE /api/storage/buckets/uploads/objects/temp/old-file.tmp',
677
+ },
678
+ },
679
+ };
680
+
681
+ return document;
682
+ } catch (error) {
683
+ logger.error('Failed to generate agent API documentation', {
684
+ error: error instanceof Error ? error.message : String(error),
685
+ });
686
+ throw error;
687
+ }
688
+ }
689
+ }