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,112 @@
1
+ import { apiClient } from '@/lib/api/client';
2
+ import { UserSchema } from '@insforge/shared-schemas';
3
+
4
+ export class AuthService {
5
+ async loginWithPassword(email: string, password: string) {
6
+ const data = await apiClient.request('/auth/admin/sessions', {
7
+ method: 'POST',
8
+ body: JSON.stringify({ email, password }),
9
+ });
10
+
11
+ // Set token in apiClient
12
+ if (data.accessToken) {
13
+ apiClient.setToken(data.accessToken);
14
+ }
15
+
16
+ // Return unified format
17
+ return {
18
+ accessToken: data.accessToken,
19
+ user: data.user,
20
+ };
21
+ }
22
+
23
+ async loginWithAuthorizationCode(code: string) {
24
+ const data = await apiClient.request('/auth/admin/sessions/exchange', {
25
+ method: 'POST',
26
+ body: JSON.stringify({ code }),
27
+ });
28
+
29
+ // Set token in apiClient
30
+ if (data.accessToken) {
31
+ apiClient.setToken(data.accessToken);
32
+ }
33
+
34
+ // Return unified format
35
+ return {
36
+ accessToken: data.accessToken,
37
+ user: data.user,
38
+ };
39
+ }
40
+
41
+ async getCurrentUser() {
42
+ const response = await apiClient.request('/auth/sessions/current');
43
+ return response.user;
44
+ }
45
+
46
+ logout() {
47
+ apiClient.clearToken();
48
+ }
49
+
50
+ /**
51
+ * Get users list
52
+ * @param queryParams - Query parameters for pagination
53
+ * @param searchQuery - Optional search query
54
+ * @returns Users list with total count
55
+ */
56
+ async getUsers(
57
+ queryParams: string = '',
58
+ searchQuery?: string
59
+ ): Promise<{
60
+ users: UserSchema[];
61
+ pagination: { offset: number; limit: number; total: number };
62
+ }> {
63
+ let url = '/auth/users';
64
+ const params = new URLSearchParams(queryParams);
65
+
66
+ if (searchQuery && searchQuery.trim()) {
67
+ params.set('search', searchQuery.trim());
68
+ }
69
+
70
+ if (params.toString()) {
71
+ url += `?${params.toString()}`;
72
+ }
73
+
74
+ const response: {
75
+ data: UserSchema[];
76
+ pagination: { offset: number; limit: number; total: number };
77
+ } = await apiClient.request(url);
78
+
79
+ return {
80
+ users: response.data,
81
+ pagination: response.pagination,
82
+ };
83
+ }
84
+
85
+ async getUser(id: string) {
86
+ return await apiClient.request(`/auth/users/${id}`);
87
+ }
88
+
89
+ async register(email: string, password: string, name?: string) {
90
+ const response = await apiClient.request('/auth/users', {
91
+ method: 'POST',
92
+ body: JSON.stringify({ email, password, name }),
93
+ });
94
+
95
+ return response;
96
+ }
97
+
98
+ async deleteUsers(userIds: string[]) {
99
+ return apiClient.request('/auth/users', {
100
+ method: 'DELETE',
101
+ body: JSON.stringify({ userIds }),
102
+ });
103
+ }
104
+
105
+ async generateAnonToken(): Promise<{ accessToken: string; message: string }> {
106
+ return apiClient.request('/auth/tokens/anon', {
107
+ method: 'POST',
108
+ });
109
+ }
110
+ }
111
+
112
+ export const authService = new AuthService();
@@ -0,0 +1,49 @@
1
+ import { apiClient } from '@/lib/api/client';
2
+ import {
3
+ OAuthConfigSchema,
4
+ CreateOAuthConfigRequest,
5
+ UpdateOAuthConfigRequest,
6
+ ListOAuthConfigsResponse,
7
+ } from '@insforge/shared-schemas';
8
+
9
+ export class OAuthConfigService {
10
+ // List all OAuth configurations
11
+ async getAllConfigs(): Promise<ListOAuthConfigsResponse> {
12
+ return apiClient.request('/auth/oauth/configs');
13
+ }
14
+
15
+ // Get specific OAuth configuration by provider
16
+ async getConfigByProvider(
17
+ provider: string
18
+ ): Promise<OAuthConfigSchema & { clientSecret?: string }> {
19
+ return apiClient.request(`/auth/oauth/configs/${provider}`);
20
+ }
21
+
22
+ // Create new OAuth configuration
23
+ async createConfig(config: CreateOAuthConfigRequest): Promise<OAuthConfigSchema> {
24
+ return apiClient.request('/auth/oauth/configs', {
25
+ method: 'POST',
26
+ body: JSON.stringify(config),
27
+ });
28
+ }
29
+
30
+ // Update OAuth configuration
31
+ async updateConfig(
32
+ provider: string,
33
+ config: UpdateOAuthConfigRequest
34
+ ): Promise<OAuthConfigSchema> {
35
+ return apiClient.request(`/auth/oauth/configs/${provider}`, {
36
+ method: 'PUT',
37
+ body: JSON.stringify(config),
38
+ });
39
+ }
40
+
41
+ // Delete OAuth configuration
42
+ async deleteConfig(provider: string): Promise<{ success: boolean; message: string }> {
43
+ return apiClient.request(`/auth/oauth/configs/${provider}`, {
44
+ method: 'DELETE',
45
+ });
46
+ }
47
+ }
48
+
49
+ export const oauthConfigService = new OAuthConfigService();
@@ -0,0 +1,194 @@
1
+ import { useNavigate, useLocation } from 'react-router-dom';
2
+ import { useMetadata } from '@/features/metadata/hooks/useMetadata';
3
+ import { Skeleton } from '@/components/radix/Skeleton';
4
+ import { Card, CardContent } from '@/components/radix/Card';
5
+ import { Users, Database, HardDrive, ArrowLeftRight, Link2 } from 'lucide-react';
6
+ import { useUsers } from '@/features/auth';
7
+
8
+ export default function DashboardPage() {
9
+ const navigate = useNavigate();
10
+ const location = useLocation();
11
+ const { metadata, auth, tables, storage, isLoading } = useMetadata();
12
+ const { totalUsers } = useUsers();
13
+
14
+ const handleNavigateTo = (to: string, state?: { initialTab?: string }) => {
15
+ const basePath = location.pathname.includes('/cloud')
16
+ ? location.pathname.replace('/dashboard', '')
17
+ : location.pathname;
18
+ void navigate(`${basePath}/${to}`, { state });
19
+ };
20
+
21
+ const handleConnectInsForge = () => {
22
+ if (window.parent !== window) {
23
+ // Send message to parent window to open onboarding overlay
24
+ window.parent.postMessage(
25
+ {
26
+ type: 'SHOW_CONNECT_OVERLAY',
27
+ },
28
+ '*'
29
+ );
30
+ } else {
31
+ void handleNavigateTo('onboard');
32
+ }
33
+ };
34
+
35
+ return (
36
+ <main className="h-full bg-white dark:bg-neutral-800">
37
+ <div className="flex justify-center py-6 px-0">
38
+ <div className="flex flex-col gap-6 w-full max-w-[1080px] px-6">
39
+ {/* Dashboard Header */}
40
+ <div className="flex items-center justify-between w-full">
41
+ <h1 className="text-xl font-semibold text-gray-900 dark:text-white tracking-[-0.1px]">
42
+ Dashboard
43
+ </h1>
44
+ </div>
45
+
46
+ {/* Connect InsForge Card */}
47
+ <Card className="w-full bg-white dark:bg-[#333333] rounded-lg border border-gray-200 dark:border-neutral-700 shadow-[0px_1px_3px_0px_rgba(0,0,0,0.1)]">
48
+ <CardContent className="px-8 py-6">
49
+ <div className="flex items-center justify-between">
50
+ <div className="flex flex-col gap-2">
51
+ <div className="flex items-center gap-2">
52
+ <Link2 className="w-5 h-5 text-black dark:text-white" />
53
+ <h3 className="text-lg font-semibold text-gray-900 dark:text-white">
54
+ Connect InsForge
55
+ </h3>
56
+ </div>
57
+ <p className="text-sm text-gray-600 dark:text-neutral-400">
58
+ With InsForge connected, your agent takes care of the backend for you
59
+ </p>
60
+ </div>
61
+ <button
62
+ type="button"
63
+ className="flex items-center gap-2 px-4 py-2 bg-emerald-300 hover:bg-emerald-400 text-black rounded font-medium text-sm transition-colors cursor-pointer"
64
+ onClick={handleConnectInsForge}
65
+ >
66
+ <ArrowLeftRight className="w-5 h-5" />
67
+ Connect
68
+ </button>
69
+ </div>
70
+ </CardContent>
71
+ </Card>
72
+
73
+ {/* Stats Cards */}
74
+ <div className="flex gap-6 w-full">
75
+ {/* AUTH Card */}
76
+ <Card className="flex-1 bg-white dark:bg-[#333333] rounded-lg border border-gray-200 dark:border-neutral-700 shadow-[0px_1px_3px_0px_rgba(0,0,0,0.1)] h-[280px]">
77
+ <CardContent className="p-8 h-full flex flex-col justify-between">
78
+ <div className="flex flex-col gap-2">
79
+ <div className="flex items-center gap-2 h-7">
80
+ <Users className="w-5 h-5 text-gray-700 dark:text-white" />
81
+ <span className="text-base font-normal text-gray-900 dark:text-white">
82
+ AUTH
83
+ </span>
84
+ </div>
85
+ </div>
86
+ <div className="flex flex-col gap-4">
87
+ <div className="flex items-baseline gap-2">
88
+ {isLoading ? (
89
+ <Skeleton className="h-8 w-16 bg-gray-200 dark:bg-neutral-700" />
90
+ ) : (
91
+ <>
92
+ <span className="text-2xl font-normal text-gray-900 dark:text-white tracking-[-0.144px]">
93
+ {(totalUsers || 0).toLocaleString()}
94
+ </span>
95
+ <span className="text-sm font-normal text-gray-500 dark:text-neutral-400">
96
+ {totalUsers === 1 ? 'user' : 'users'}
97
+ </span>
98
+ </>
99
+ )}
100
+ </div>
101
+ {isLoading ? (
102
+ <Skeleton className="h-5 w-36 bg-gray-200 dark:bg-neutral-700" />
103
+ ) : (
104
+ <p className="text-base text-gray-500 dark:text-neutral-400">
105
+ {(() => {
106
+ const authCount = auth?.oauths.length || 0;
107
+ return `${authCount} OAuth ${authCount === 1 ? 'provider' : 'providers'} enabled`;
108
+ })()}
109
+ </p>
110
+ )}
111
+ </div>
112
+ </CardContent>
113
+ </Card>
114
+
115
+ {/* Database Card */}
116
+ <Card className="flex-1 bg-white dark:bg-[#333333] rounded-lg border border-gray-200 dark:border-neutral-700 shadow-[0px_1px_3px_0px_rgba(0,0,0,0.1)] h-[280px]">
117
+ <CardContent className="p-8 h-full flex flex-col justify-between">
118
+ <div className="flex flex-col gap-2">
119
+ <div className="flex items-center gap-2 h-7">
120
+ <Database className="w-5 h-5 text-gray-700 dark:text-white" />
121
+ <span className="text-base font-normal text-gray-900 dark:text-white">
122
+ Database
123
+ </span>
124
+ </div>
125
+ </div>
126
+ <div className="flex flex-col gap-4">
127
+ <div className="flex items-baseline gap-2">
128
+ {isLoading ? (
129
+ <Skeleton className="h-8 w-14 bg-gray-200 dark:bg-neutral-700" />
130
+ ) : (
131
+ <>
132
+ <span className="text-2xl font-normal text-gray-900 dark:text-white tracking-[-0.144px]">
133
+ {(metadata?.database?.totalSize || 0).toFixed(2)}
134
+ </span>
135
+ <span className="text-sm font-normal text-gray-500 dark:text-neutral-400">
136
+ GB
137
+ </span>
138
+ </>
139
+ )}
140
+ </div>
141
+ {isLoading ? (
142
+ <Skeleton className="h-5 w-16 bg-gray-200 dark:bg-neutral-700" />
143
+ ) : (
144
+ <p className="text-base text-gray-500 dark:text-neutral-400">
145
+ {tables.length || 0} {tables.length === 1 ? 'Table' : 'Tables'}
146
+ </p>
147
+ )}
148
+ </div>
149
+ </CardContent>
150
+ </Card>
151
+
152
+ {/* Storage Card */}
153
+ <Card className="flex-1 bg-white dark:bg-[#333333] rounded-lg border border-gray-200 dark:border-neutral-700 shadow-[0px_1px_3px_0px_rgba(0,0,0,0.1)] h-[280px]">
154
+ <CardContent className="p-8 h-full flex flex-col justify-between">
155
+ <div className="flex flex-col gap-2">
156
+ <div className="flex items-center gap-2 h-7">
157
+ <HardDrive className="w-5 h-5 text-gray-700 dark:text-white" />
158
+ <span className="text-base font-normal text-gray-900 dark:text-white">
159
+ Storage
160
+ </span>
161
+ </div>
162
+ </div>
163
+ <div className="flex flex-col gap-4">
164
+ <div className="flex items-baseline gap-2">
165
+ {isLoading ? (
166
+ <Skeleton className="h-8 w-14 bg-gray-200 dark:bg-neutral-700" />
167
+ ) : (
168
+ <>
169
+ <span className="text-2xl font-normal text-gray-900 dark:text-white tracking-[-0.144px]">
170
+ {(storage?.totalSize || 0).toFixed(2)}
171
+ </span>
172
+ <span className="text-sm font-normal text-gray-500 dark:text-neutral-400">
173
+ GB
174
+ </span>
175
+ </>
176
+ )}
177
+ </div>
178
+ {isLoading ? (
179
+ <Skeleton className="h-5 w-20 bg-gray-200 dark:bg-neutral-700" />
180
+ ) : (
181
+ <p className="text-base text-gray-500 dark:text-neutral-400">
182
+ {storage?.buckets?.length || 0}{' '}
183
+ {storage?.buckets?.length === 1 ? 'Bucket' : 'Buckets'}
184
+ </p>
185
+ )}
186
+ </div>
187
+ </CardContent>
188
+ </Card>
189
+ </div>
190
+ </div>
191
+ </div>
192
+ </main>
193
+ );
194
+ }
@@ -0,0 +1,64 @@
1
+ import { memo } from 'react';
2
+ import { Controller, Control } from 'react-hook-form';
3
+ import { Select, SelectContent, SelectItem, SelectTrigger } from '@/components/radix/Select';
4
+ import { columnTypeIcons } from '../constants';
5
+ import { TableFormSchema } from '../schema';
6
+ import { columnTypeSchema } from '@insforge/shared-schemas';
7
+
8
+ const COLUMN_TYPES_ARRAY = columnTypeSchema.options;
9
+
10
+ // Pre-render select options to avoid re-creating them on every render
11
+ const SELECT_OPTIONS = COLUMN_TYPES_ARRAY.map((type) => {
12
+ const TypeIcon = columnTypeIcons[type];
13
+ return (
14
+ <SelectItem key={type} value={type}>
15
+ <div className="flex items-center gap-2">
16
+ <TypeIcon className="h-4 w-4" />
17
+ <span>{type}</span>
18
+ </div>
19
+ </SelectItem>
20
+ );
21
+ });
22
+
23
+ interface ColumnTypeSelectProps {
24
+ control: Control<TableFormSchema>;
25
+ name: `columns.${number}.type`;
26
+ disabled?: boolean;
27
+ className: string;
28
+ }
29
+
30
+ export const ColumnTypeSelect = memo(function TableFormSelect({
31
+ control,
32
+ name,
33
+ disabled,
34
+ className,
35
+ }: ColumnTypeSelectProps) {
36
+ return (
37
+ <Controller
38
+ control={control}
39
+ name={name}
40
+ render={({ field }) => {
41
+ const Icon = columnTypeIcons[field.value as keyof typeof columnTypeIcons];
42
+ return (
43
+ <Select
44
+ disabled={disabled}
45
+ value={field.value}
46
+ onValueChange={(value) => {
47
+ if (value) {
48
+ field.onChange(value);
49
+ }
50
+ }}
51
+ >
52
+ <SelectTrigger className={className}>
53
+ <div className="flex items-center gap-2">
54
+ {Icon && <Icon className="h-4 w-4 text-zinc-500 dark:text-neutral-400" />}
55
+ <span className="text-black dark:text-white">{field.value}</span>
56
+ </div>
57
+ </SelectTrigger>
58
+ <SelectContent>{SELECT_OPTIONS}</SelectContent>
59
+ </Select>
60
+ );
61
+ }}
62
+ />
63
+ );
64
+ });