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,167 @@
1
+ import { z } from 'zod';
2
+ import { aiConfigurationSchema, aiUsageRecordSchema } from './ai.schema';
3
+
4
+ // ============= Chat Completion Schemas =============
5
+
6
+ export const chatMessageSchema = z.object({
7
+ role: z.enum(['user', 'assistant', 'system']),
8
+ content: z.string(),
9
+ images: z
10
+ .array(
11
+ z.object({
12
+ url: z.string(),
13
+ })
14
+ )
15
+ .optional(),
16
+ });
17
+
18
+ export const chatCompletionRequestSchema = z.object({
19
+ model: z.string(),
20
+ messages: z.array(chatMessageSchema),
21
+ temperature: z.number().min(0).max(2).optional(),
22
+ maxTokens: z.number().positive().optional(),
23
+ topP: z.number().min(0).max(1).optional(),
24
+ stream: z.boolean().optional(),
25
+ });
26
+
27
+ export const chatCompletionResponseSchema = z.object({
28
+ text: z.string(),
29
+ metadata: z
30
+ .object({
31
+ model: z.string(),
32
+ usage: z
33
+ .object({
34
+ promptTokens: z.number().optional(),
35
+ completionTokens: z.number().optional(),
36
+ totalTokens: z.number().optional(),
37
+ })
38
+ .optional(),
39
+ })
40
+ .optional(),
41
+ });
42
+
43
+ // ============= Image Generation Schemas =============
44
+
45
+ export const imageGenerationRequestSchema = z.object({
46
+ model: z.string(),
47
+ prompt: z.string(),
48
+ images: z
49
+ .array(
50
+ z.object({
51
+ url: z.string(),
52
+ })
53
+ )
54
+ .optional(),
55
+ });
56
+
57
+ export const imageGenerationResponseSchema = z.object({
58
+ text: z.string().optional(),
59
+ images: z.array(
60
+ z.object({
61
+ type: z.literal('imageUrl'),
62
+ imageUrl: z.string(),
63
+ })
64
+ ),
65
+ metadata: z
66
+ .object({
67
+ model: z.string(),
68
+ usage: z
69
+ .object({
70
+ promptTokens: z.number().optional(),
71
+ completionTokens: z.number().optional(),
72
+ totalTokens: z.number().optional(),
73
+ })
74
+ .optional(),
75
+ })
76
+ .optional(),
77
+ });
78
+
79
+ // OpenRouter-specific model schema
80
+ export const openRouterModelSchema = z.object({
81
+ id: z.string(),
82
+ name: z.string(),
83
+ created: z.number(),
84
+ description: z.string().optional(),
85
+ architecture: z
86
+ .object({
87
+ inputModalities: z.array(z.string()),
88
+ outputModalities: z.array(z.string()),
89
+ tokenizer: z.string(),
90
+ instructType: z.string(),
91
+ })
92
+ .optional(),
93
+ topProvider: z
94
+ .object({
95
+ isModerated: z.boolean(),
96
+ contextLength: z.number(),
97
+ maxCompletionTokens: z.number(),
98
+ })
99
+ .optional(),
100
+ pricing: z.object({
101
+ prompt: z.string(),
102
+ completion: z.string(),
103
+ image: z.string().optional(),
104
+ request: z.string().optional(),
105
+ webSearch: z.string().optional(),
106
+ internalReasoning: z.string().optional(),
107
+ inputCacheRead: z.string().optional(),
108
+ inputCacheWrite: z.string().optional(),
109
+ }),
110
+ });
111
+
112
+ export const listModelsResponseSchema = z.object({
113
+ text: z.array(
114
+ z.object({
115
+ provider: z.string(),
116
+ configured: z.boolean(),
117
+ models: z.array(openRouterModelSchema),
118
+ })
119
+ ),
120
+ image: z.array(
121
+ z.object({
122
+ provider: z.string(),
123
+ configured: z.boolean(),
124
+ models: z.array(openRouterModelSchema),
125
+ })
126
+ ),
127
+ });
128
+
129
+ export const createAIConfigurationRequestSchema = aiConfigurationSchema.omit({
130
+ id: true,
131
+ });
132
+
133
+ export const updateAIConfigurationRequestSchema = z.object({
134
+ systemPrompt: z.string().nullable(),
135
+ });
136
+
137
+ export const listAIUsageResponseSchema = z.object({
138
+ records: z.array(aiUsageRecordSchema),
139
+ total: z.number(),
140
+ });
141
+
142
+ export const getAIUsageRequestSchema = z.object({
143
+ startDate: z.string().datetime().optional(),
144
+ endDate: z.string().datetime().optional(),
145
+ limit: z.string().regex(/^\d+$/).default('50'),
146
+ offset: z.string().regex(/^\d+$/).default('0'),
147
+ });
148
+
149
+ export const getAIUsageSummaryRequestSchema = z.object({
150
+ configId: z.string().uuid().optional(),
151
+ startDate: z.string().datetime().optional(),
152
+ endDate: z.string().datetime().optional(),
153
+ });
154
+
155
+ // Export types
156
+ export type ChatMessageSchema = z.infer<typeof chatMessageSchema>;
157
+ export type ChatCompletionRequest = z.infer<typeof chatCompletionRequestSchema>;
158
+ export type ChatCompletionResponse = z.infer<typeof chatCompletionResponseSchema>;
159
+ export type ImageGenerationRequest = z.infer<typeof imageGenerationRequestSchema>;
160
+ export type ImageGenerationResponse = z.infer<typeof imageGenerationResponseSchema>;
161
+ export type OpenRouterModel = z.infer<typeof openRouterModelSchema>;
162
+ export type ListModelsResponse = z.infer<typeof listModelsResponseSchema>;
163
+ export type CreateAIConfigurationRequest = z.infer<typeof createAIConfigurationRequestSchema>;
164
+ export type UpdateAIConfigurationRequest = z.infer<typeof updateAIConfigurationRequestSchema>;
165
+ export type ListAIUsageResponse = z.infer<typeof listAIUsageResponseSchema>;
166
+ export type GetAIUsageRequest = z.infer<typeof getAIUsageRequestSchema>;
167
+ export type GetAIUsageSummaryRequest = z.infer<typeof getAIUsageSummaryRequestSchema>;
@@ -0,0 +1,54 @@
1
+ import { z } from 'zod';
2
+
3
+ // Core schemas - only text and image supported currently
4
+ export const modalitySchema = z.enum(['text', 'image']);
5
+
6
+ export const aiConfigurationSchema = z.object({
7
+ id: z.string().uuid(),
8
+ inputModality: z.array(modalitySchema).min(1),
9
+ outputModality: z.array(modalitySchema).min(1),
10
+ provider: z.string(),
11
+ modelId: z.string(),
12
+ systemPrompt: z.string().optional(),
13
+ });
14
+
15
+ export const aiConfigurationWithUsageSchema = aiConfigurationSchema.extend({
16
+ usageStats: z
17
+ .object({
18
+ totalInputTokens: z.number(),
19
+ totalOutputTokens: z.number(),
20
+ totalTokens: z.number(),
21
+ totalImageCount: z.number(),
22
+ totalRequests: z.number(),
23
+ })
24
+ .optional(),
25
+ });
26
+
27
+ export const aiUsageDataSchema = z.object({
28
+ configId: z.string().uuid(),
29
+ inputTokens: z.number().int().optional(),
30
+ outputTokens: z.number().int().optional(),
31
+ imageCount: z.number().int().optional(),
32
+ imageResolution: z.string().optional(),
33
+ });
34
+
35
+ export const aiUsageRecordSchema = aiUsageDataSchema.extend({
36
+ id: z.string().uuid(),
37
+ createdAt: z.date(),
38
+ });
39
+
40
+ export const aiUsageSummarySchema = z.object({
41
+ totalInputTokens: z.number(),
42
+ totalOutputTokens: z.number(),
43
+ totalTokens: z.number(),
44
+ totalImageCount: z.number(),
45
+ totalRequests: z.number(),
46
+ });
47
+
48
+ // Export types
49
+ export type ModalitySchema = z.infer<typeof modalitySchema>;
50
+ export type AIConfigurationSchema = z.infer<typeof aiConfigurationSchema>;
51
+ export type AIConfigurationWithUsageSchema = z.infer<typeof aiConfigurationWithUsageSchema>;
52
+ export type AIUsageDataSchema = z.infer<typeof aiUsageDataSchema>;
53
+ export type AIUsageRecordSchema = z.infer<typeof aiUsageRecordSchema>;
54
+ export type AIUsageSummarySchema = z.infer<typeof aiUsageSummarySchema>;
@@ -0,0 +1,193 @@
1
+ import { z } from 'zod';
2
+ import {
3
+ emailSchema,
4
+ passwordSchema,
5
+ nameSchema,
6
+ userIdSchema,
7
+ roleSchema,
8
+ userSchema,
9
+ oAuthConfigSchema,
10
+ } from './auth.schema';
11
+
12
+ // ============================================================================
13
+ // Common schemas
14
+ // ============================================================================
15
+
16
+ /**
17
+ * Pagination parameters shared across list endpoints
18
+ */
19
+ export const paginationSchema = z.object({
20
+ limit: z.string().optional(),
21
+ offset: z.string().optional(),
22
+ });
23
+
24
+ /**
25
+ * POST /api/auth/users - Create user
26
+ */
27
+ export const createUserRequestSchema = z.object({
28
+ email: emailSchema,
29
+ password: passwordSchema,
30
+ name: nameSchema.optional(),
31
+ });
32
+
33
+ /**
34
+ * POST /api/auth/sessions - Create session
35
+ */
36
+ export const createSessionRequestSchema = z.object({
37
+ email: emailSchema,
38
+ password: passwordSchema,
39
+ });
40
+
41
+ /**
42
+ * POST /api/auth/admin/sessions - Create admin session
43
+ */
44
+ export const createAdminSessionRequestSchema = createSessionRequestSchema;
45
+
46
+ export const exchangeAdminSessionRequestSchema = z.object({
47
+ code: z.string(),
48
+ });
49
+
50
+ /**
51
+ * GET /api/auth/users - List users (query parameters)
52
+ */
53
+ export const listUsersRequestSchema = paginationSchema
54
+ .extend({
55
+ search: z.string().optional(),
56
+ })
57
+ .optional();
58
+
59
+ /**
60
+ * DELETE /api/auth/users - Delete users (batch)
61
+ */
62
+ export const deleteUsersRequestSchema = z.object({
63
+ userIds: z.array(userIdSchema).min(1, 'At least one user ID is required'),
64
+ });
65
+
66
+ // ============================================================================
67
+ // Response schemas
68
+ // ============================================================================
69
+
70
+ /**
71
+ * Response for POST /api/auth/users
72
+ */
73
+ export const createUserResponseSchema = z.object({
74
+ user: userSchema,
75
+ accessToken: z.string(),
76
+ });
77
+
78
+ /**
79
+ * Response for POST /api/auth/sessions
80
+ */
81
+ export const createSessionResponseSchema = createUserResponseSchema;
82
+
83
+ /**
84
+ * Response for POST /api/auth/admin/sessions
85
+ */
86
+ export const createAdminSessionResponseSchema = createUserResponseSchema;
87
+
88
+ /**
89
+ * Response for GET /api/auth/sessions/current
90
+ */
91
+ export const getCurrentSessionResponseSchema = z.object({
92
+ user: z.object({
93
+ id: userIdSchema,
94
+ email: emailSchema,
95
+ role: roleSchema,
96
+ }),
97
+ });
98
+
99
+ /**
100
+ * Response for GET /api/auth/users
101
+ */
102
+ export const listUsersResponseSchema = z.object({
103
+ data: z.array(userSchema),
104
+ pagination: z.object({
105
+ offset: z.number(),
106
+ limit: z.number(),
107
+ total: z.number(),
108
+ }),
109
+ });
110
+
111
+ /**
112
+ * Response for DELETE /api/auth/users
113
+ */
114
+ export const deleteUsersResponseSchema = z.object({
115
+ message: z.string(),
116
+ deletedCount: z.number().int().nonnegative(),
117
+ });
118
+
119
+ /**
120
+ * Response for GET /api/auth/v1/google-auth and GET /api/auth/v1/github-auth
121
+ */
122
+ export const getOauthUrlResponseSchema = z.object({
123
+ authUrl: z.string().url(),
124
+ });
125
+
126
+ // ============================================================================
127
+ // OAuth Configuration Management schemas
128
+ // ============================================================================
129
+
130
+ /**
131
+ * POST /api/auth/oauth/configs - Create OAuth configuration
132
+ */
133
+ export const createOAuthConfigRequestSchema = oAuthConfigSchema.extend({
134
+ clientSecret: z.string().optional(),
135
+ });
136
+
137
+ /**
138
+ * PUT /api/auth/oauth/configs/:provider - Update OAuth configuration
139
+ */
140
+ export const updateOAuthConfigRequestSchema = oAuthConfigSchema
141
+ .extend({
142
+ clientSecret: z.string().optional(),
143
+ })
144
+ .omit({
145
+ provider: true,
146
+ });
147
+
148
+ /**
149
+ * Response for GET /api/auth/oauth/configs
150
+ */
151
+ export const listOAuthConfigsResponseSchema = z.object({
152
+ data: z.array(oAuthConfigSchema),
153
+ count: z.number(),
154
+ });
155
+
156
+ // ============================================================================
157
+ // Error response schema
158
+ // ============================================================================
159
+
160
+ /**
161
+ * Standard error response format for auth endpoints
162
+ */
163
+ export const authErrorResponseSchema = z.object({
164
+ error: z.string(),
165
+ message: z.string(),
166
+ statusCode: z.number().int(),
167
+ nextActions: z.string().optional(),
168
+ });
169
+
170
+ // ============================================================================
171
+ // Type exports
172
+ // ============================================================================
173
+
174
+ // Request types for type-safe request handling
175
+ export type CreateUserRequest = z.infer<typeof createUserRequestSchema>;
176
+ export type CreateSessionRequest = z.infer<typeof createSessionRequestSchema>;
177
+ export type CreateAdminSessionRequest = z.infer<typeof createAdminSessionRequestSchema>;
178
+ export type ListUsersRequest = z.infer<typeof listUsersRequestSchema>;
179
+ export type DeleteUsersRequest = z.infer<typeof deleteUsersRequestSchema>;
180
+ export type CreateOAuthConfigRequest = z.infer<typeof createOAuthConfigRequestSchema>;
181
+ export type UpdateOAuthConfigRequest = z.infer<typeof updateOAuthConfigRequestSchema>;
182
+
183
+ // Response types for type-safe responses
184
+ export type CreateUserResponse = z.infer<typeof createUserResponseSchema>;
185
+ export type CreateSessionResponse = z.infer<typeof createSessionResponseSchema>;
186
+ export type CreateAdminSessionResponse = z.infer<typeof createAdminSessionResponseSchema>;
187
+ export type GetCurrentSessionResponse = z.infer<typeof getCurrentSessionResponseSchema>;
188
+ export type ListUsersResponse = z.infer<typeof listUsersResponseSchema>;
189
+ export type DeleteUsersResponse = z.infer<typeof deleteUsersResponseSchema>;
190
+ export type GetOauthUrlResponse = z.infer<typeof getOauthUrlResponseSchema>;
191
+ export type ListOAuthConfigsResponse = z.infer<typeof listOAuthConfigsResponseSchema>;
192
+
193
+ export type AuthErrorResponse = z.infer<typeof authErrorResponseSchema>;
@@ -0,0 +1,94 @@
1
+ import { z } from 'zod';
2
+
3
+ /**
4
+ * Core auth entity schemas (PostgreSQL structure)
5
+ * These define the fundamental auth data models
6
+ */
7
+
8
+ // ============================================================================
9
+ // Base field schemas
10
+ // ============================================================================
11
+
12
+ export const userIdSchema = z.string().uuid('Invalid user ID format');
13
+
14
+ export const emailSchema = z.string().email('Invalid email format').toLowerCase().trim();
15
+
16
+ export const passwordSchema = z
17
+ .string()
18
+ .min(6, 'Password must be at least 6 characters')
19
+ .max(32, 'Password must be less than 32 characters');
20
+
21
+ export const nameSchema = z
22
+ .string()
23
+ .min(1, 'Name is required')
24
+ .max(100, 'Name must be less than 100 characters')
25
+ .trim();
26
+
27
+ export const roleSchema = z.enum(['authenticated', 'project_admin']);
28
+
29
+ // ============================================================================
30
+ // Core entity schemas
31
+ // ============================================================================
32
+
33
+ /**
34
+ * User entity schema - represents the _user table in PostgreSQL
35
+ */
36
+ export const userSchema = z.object({
37
+ id: userIdSchema,
38
+ email: emailSchema,
39
+ name: nameSchema,
40
+ emailVerified: z.boolean(),
41
+ identities: z
42
+ .array(
43
+ z.object({
44
+ provider: z.string(),
45
+ })
46
+ )
47
+ .optional(),
48
+ providerType: z.string().optional(),
49
+ createdAt: z.string(), // PostgreSQL timestamp
50
+ updatedAt: z.string(), // PostgreSQL timestamp
51
+ });
52
+
53
+ /**
54
+ * OAuth state for redirect handling
55
+ */
56
+
57
+ export const oAuthProvidersSchema = z.enum(['google', 'github']);
58
+
59
+ export const oAuthStateSchema = z.object({
60
+ provider: oAuthProvidersSchema,
61
+ redirectUri: z.string().url().optional(),
62
+ });
63
+
64
+ // OAuth provider configuration schema
65
+ export const oAuthConfigSchema = z.object({
66
+ provider: z.string(),
67
+ clientId: z.string().optional(),
68
+ scopes: z.array(z.string()).optional(),
69
+ redirectUri: z.string().optional(),
70
+ useSharedKey: z.boolean(),
71
+ });
72
+
73
+ /**
74
+ * JWT token payload schema
75
+ */
76
+ export const tokenPayloadSchema = z.object({
77
+ sub: userIdSchema, // Subject (user ID)
78
+ email: emailSchema,
79
+ role: roleSchema,
80
+ iat: z.number().optional(), // Issued at
81
+ exp: z.number().optional(), // Expiration
82
+ });
83
+
84
+ // ============================================================================
85
+ // Type exports
86
+ // ============================================================================
87
+
88
+ export type UserIdSchema = z.infer<typeof userIdSchema>;
89
+ export type EmailSchema = z.infer<typeof emailSchema>;
90
+ export type PasswordSchema = z.infer<typeof passwordSchema>;
91
+ export type RoleSchema = z.infer<typeof roleSchema>;
92
+ export type UserSchema = z.infer<typeof userSchema>;
93
+ export type TokenPayloadSchema = z.infer<typeof tokenPayloadSchema>;
94
+ export type OAuthConfigSchema = z.infer<typeof oAuthConfigSchema>;