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,362 @@
1
+ import { useEffect, useState } from 'react';
2
+ import { FileJson, AlertCircle, CheckCircle } from 'lucide-react';
3
+ import { Button } from '@/components/radix/Button';
4
+ import { Popover, PopoverContent, PopoverTrigger } from '@/components/radix/Popover';
5
+ import { ConfirmDialog } from '@/components/ConfirmDialog';
6
+ import { cn } from '@/lib/utils/utils';
7
+ import type { JsonCellEditorProps } from './types';
8
+
9
+ export function JsonCellEditor({
10
+ value,
11
+ nullable,
12
+ onValueChange,
13
+ onCancel,
14
+ className,
15
+ }: JsonCellEditorProps) {
16
+ const [open, setOpen] = useState(true);
17
+ const [showNullConfirm, setShowNullConfirm] = useState(false);
18
+ const [jsonText, setJsonText] = useState(() => {
19
+ // Ensure value is always converted to string
20
+ if (!value || value === 'null') {
21
+ return '';
22
+ }
23
+
24
+ // If value is already a string, try to parse and format it
25
+ if (typeof value === 'string') {
26
+ try {
27
+ const parsed = JSON.parse(value);
28
+ return JSON.stringify(parsed, null, 2);
29
+ } catch {
30
+ return value;
31
+ }
32
+ }
33
+
34
+ // If value is an object/array, stringify it
35
+ if (typeof value === 'object') {
36
+ try {
37
+ return JSON.stringify(value, null, 2);
38
+ } catch {
39
+ return JSON.stringify(value);
40
+ }
41
+ }
42
+
43
+ // For any other type, convert to string
44
+ return String(value || '');
45
+ });
46
+ const [isValid, setIsValid] = useState(true);
47
+ const [error, setError] = useState<string | null>(null);
48
+
49
+ useEffect(() => {
50
+ // Auto-open the popover when component mounts
51
+ setOpen(true);
52
+ }, []);
53
+
54
+ const validateJson = (text: string) => {
55
+ // Ensure text is a string before calling trim
56
+ const textStr = String(text || '');
57
+ if (textStr.trim() === '') {
58
+ setIsValid(true);
59
+ setError(null);
60
+ return true;
61
+ }
62
+
63
+ try {
64
+ JSON.parse(textStr);
65
+ setIsValid(true);
66
+ setError(null);
67
+ return true;
68
+ } catch (e) {
69
+ setIsValid(false);
70
+ setError(e instanceof Error ? e.message : 'Invalid JSON');
71
+ return false;
72
+ }
73
+ };
74
+
75
+ const handleTextChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {
76
+ const newText = e.target.value;
77
+ setJsonText(newText);
78
+ validateJson(newText);
79
+ };
80
+
81
+ const handleFormat = () => {
82
+ // Ensure jsonText is a string before calling trim
83
+ const textStr = String(jsonText || '');
84
+ if (textStr.trim() === '') {
85
+ return;
86
+ }
87
+
88
+ try {
89
+ const parsed = JSON.parse(textStr);
90
+ setJsonText(JSON.stringify(parsed, null, 2));
91
+ setIsValid(true);
92
+ setError(null);
93
+ } catch (error) {
94
+ console.error(error);
95
+ }
96
+ };
97
+
98
+ const handleMinify = () => {
99
+ // Ensure jsonText is a string before calling trim
100
+ const textStr = String(jsonText || '');
101
+ if (textStr.trim() === '') {
102
+ return;
103
+ }
104
+
105
+ try {
106
+ const parsed = JSON.parse(textStr);
107
+ setJsonText(JSON.stringify(parsed));
108
+ setIsValid(true);
109
+ setError(null);
110
+ } catch (error) {
111
+ console.error(error);
112
+ }
113
+ };
114
+
115
+ const handleSave = () => {
116
+ if (!isValid) {
117
+ return;
118
+ }
119
+
120
+ // Ensure jsonText is a string before calling trim
121
+ const textStr = String(jsonText || '');
122
+ if (textStr.trim() === '') {
123
+ onValueChange(nullable ? 'null' : '{}');
124
+ } else {
125
+ try {
126
+ // Validate and normalize the JSON before saving
127
+ const parsed = JSON.parse(textStr);
128
+ onValueChange(JSON.stringify(parsed));
129
+ } catch {
130
+ // This shouldn't happen as we validate before enabling save
131
+ return;
132
+ }
133
+ }
134
+ setOpen(false);
135
+ };
136
+
137
+ const handleSetNull = (e: React.MouseEvent) => {
138
+ e.preventDefault();
139
+ e.stopPropagation();
140
+
141
+ if (!nullable) {
142
+ return;
143
+ }
144
+
145
+ // Check if there's existing data
146
+ const textStr = String(jsonText || '');
147
+ const hasData = textStr.trim() !== '' && textStr !== 'null';
148
+
149
+ if (hasData) {
150
+ // Show confirmation dialog if there's existing data
151
+ setShowNullConfirm(true);
152
+ } else {
153
+ // Directly set to null if no data
154
+ confirmSetNull();
155
+ }
156
+ };
157
+
158
+ const confirmSetNull = () => {
159
+ setShowNullConfirm(false);
160
+ onValueChange('null');
161
+ setOpen(false);
162
+ };
163
+
164
+ const handleOpenChange = (isOpen: boolean) => {
165
+ if (!isOpen && !showNullConfirm) {
166
+ // Only cancel if confirmation dialog is not showing
167
+ onCancel();
168
+ }
169
+ setOpen(isOpen);
170
+ };
171
+
172
+ const formatDisplayValue = () => {
173
+ if (!value || value === 'null') {
174
+ return 'Empty JSON';
175
+ }
176
+
177
+ try {
178
+ const parsed = typeof value === 'string' ? JSON.parse(value) : value;
179
+
180
+ if (typeof parsed !== 'object' || parsed === null) {
181
+ return 'Invalid JSON';
182
+ }
183
+
184
+ const keys = Object.keys(parsed);
185
+ if (keys.length === 0) {
186
+ return '{}';
187
+ }
188
+ if (keys.length === 1) {
189
+ return `{ ${keys[0]}: ... }`;
190
+ }
191
+ return `{ ${keys.length} properties }`;
192
+ } catch {
193
+ return 'Invalid JSON';
194
+ }
195
+ };
196
+
197
+ return (
198
+ <>
199
+ <Popover open={open} onOpenChange={showNullConfirm ? undefined : handleOpenChange}>
200
+ <PopoverTrigger asChild>
201
+ <Button
202
+ variant="ghost"
203
+ className={cn(
204
+ 'w-full justify-start text-sm text-left font-normal h-full border-0 p-0 hover:bg-transparent dark:text-white',
205
+ (!value || value === 'null') && 'text-muted-foreground',
206
+ className
207
+ )}
208
+ >
209
+ <FileJson className="mr-2 h-4 w-4" />
210
+ {formatDisplayValue()}
211
+ </Button>
212
+ </PopoverTrigger>
213
+ <PopoverContent
214
+ className="overflow-hidden w-125 p-0 dark:bg-neutral-800 dark:border-neutral-700"
215
+ align="start"
216
+ side="bottom"
217
+ >
218
+ <div className="p-4">
219
+ <div className="flex items-center justify-between mb-3">
220
+ <div className="flex items-center gap-2">
221
+ <FileJson className="h-4 w-4 text-muted-foreground" />
222
+ <span className="text-sm font-medium">JSON Editor</span>
223
+ </div>
224
+ <div className="flex items-center gap-2">
225
+ <Button
226
+ variant="ghost"
227
+ size="sm"
228
+ onClick={handleFormat}
229
+ disabled={!isValid || String(jsonText || '').trim() === ''}
230
+ className="h-7 px-2"
231
+ >
232
+ Format
233
+ </Button>
234
+ <Button
235
+ variant="ghost"
236
+ size="sm"
237
+ onClick={handleMinify}
238
+ disabled={!isValid || String(jsonText || '').trim() === ''}
239
+ className="h-7 px-2"
240
+ >
241
+ Minify
242
+ </Button>
243
+ </div>
244
+ </div>
245
+
246
+ <div className="relative">
247
+ <textarea
248
+ value={jsonText}
249
+ onChange={handleTextChange}
250
+ onKeyDown={(e) => {
251
+ if (e.key === 'Tab') {
252
+ e.preventDefault();
253
+ const target = e.target as HTMLTextAreaElement;
254
+ const start = target.selectionStart;
255
+ const end = target.selectionEnd;
256
+
257
+ // Insert 2 spaces at cursor position
258
+ const newValue = jsonText.substring(0, start) + ' ' + jsonText.substring(end);
259
+ setJsonText(newValue);
260
+ validateJson(newValue);
261
+
262
+ // Move cursor after the inserted spaces
263
+ setTimeout(() => {
264
+ target.selectionStart = target.selectionEnd = start + 2;
265
+ }, 0);
266
+ } else if (e.key === 'Enter' && e.ctrlKey) {
267
+ e.preventDefault();
268
+ handleSave();
269
+ } else if (e.key === 'Enter') {
270
+ // Allow Enter to create new lines (prevent it from bubbling up to parent components)
271
+ e.stopPropagation();
272
+ } else if (e.key === 'Escape') {
273
+ e.preventDefault();
274
+ onCancel();
275
+ setOpen(false);
276
+ }
277
+ }}
278
+ placeholder="Enter JSON here..."
279
+ className={cn(
280
+ 'w-full h-75 px-3 py-2 text-sm border border-border-gray dark:border-neutral-600 rounded-md font-mono resize-none',
281
+ 'focus:outline-none focus:ring-2 focus:ring-offset-2',
282
+ isValid ? 'focus:ring-primary' : 'focus:ring-red-500 border-red-500'
283
+ )}
284
+ spellCheck={false}
285
+ autoFocus
286
+ />
287
+
288
+ {/* Validation indicator */}
289
+ <div
290
+ className={cn(
291
+ 'absolute bottom-2 right-2 flex items-center gap-1',
292
+ isValid ? 'text-green-600' : 'text-red-600'
293
+ )}
294
+ >
295
+ {isValid ? (
296
+ <>
297
+ <CheckCircle className="h-4 w-4" />
298
+ <span className="text-xs">Valid JSON</span>
299
+ </>
300
+ ) : (
301
+ <>
302
+ <AlertCircle className="h-4 w-4" />
303
+ <span className="text-xs">Invalid JSON</span>
304
+ </>
305
+ )}
306
+ </div>
307
+ </div>
308
+
309
+ {/* Error message */}
310
+ {error && (
311
+ <div className="mt-2 text-xs text-red-600 bg-red-50 p-2 rounded">{error}</div>
312
+ )}
313
+
314
+ {/* Tips */}
315
+ <div className="mt-2 text-xs text-muted-foreground">
316
+ Tip: Use Tab for indentation, Ctrl+Enter to save, Escape to cancel
317
+ </div>
318
+ </div>
319
+
320
+ {/* Action buttons */}
321
+ <div className="flex items-center gap-2 p-3 border-t border-border-gray dark:border-neutral-600 bg-muted/30 dark:bg-neutral-800">
322
+ {nullable && (
323
+ <Button
324
+ variant="outline"
325
+ size="sm"
326
+ onClick={handleSetNull}
327
+ className="flex-1 dark:bg-neutral-600 dark:text-white dark:hover:bg-neutral-700"
328
+ >
329
+ Null
330
+ </Button>
331
+ )}
332
+ <Button
333
+ variant="outline"
334
+ size="sm"
335
+ onClick={() => {
336
+ onCancel();
337
+ setOpen(false);
338
+ }}
339
+ className="flex-1 dark:bg-neutral-600 dark:text-white dark:hover:bg-neutral-700"
340
+ >
341
+ Cancel
342
+ </Button>
343
+ <Button size="sm" onClick={handleSave} disabled={!isValid} className="flex-1">
344
+ Save
345
+ </Button>
346
+ </div>
347
+ </PopoverContent>
348
+ </Popover>
349
+
350
+ <ConfirmDialog
351
+ open={showNullConfirm}
352
+ onOpenChange={setShowNullConfirm}
353
+ title="Clear JSON Data"
354
+ description="This action will permanently remove the current JSON data from this cell and set it to null. Are you sure you want to continue?"
355
+ confirmText="Clear Data"
356
+ cancelText="Cancel"
357
+ onConfirm={confirmSetNull}
358
+ destructive={true}
359
+ />
360
+ </>
361
+ );
362
+ }
@@ -0,0 +1,38 @@
1
+ import React, { useCallback, useState } from 'react';
2
+ import type { TextCellEditorProps } from './types';
3
+ import { cn } from '@/lib/utils/utils';
4
+
5
+ export function TextCellEditor({ value, onValueChange, onCancel, className }: TextCellEditorProps) {
6
+ const [inputValue, setInputValue] = useState(String(value || ''));
7
+
8
+ const handleSave = useCallback(() => {
9
+ onValueChange(inputValue);
10
+ }, [inputValue, onValueChange]);
11
+
12
+ const handleKeyDown = useCallback(
13
+ (e: React.KeyboardEvent) => {
14
+ if (e.key === 'Enter') {
15
+ e.preventDefault();
16
+ handleSave();
17
+ } else if (e.key === 'Escape') {
18
+ e.preventDefault();
19
+ onCancel();
20
+ }
21
+ },
22
+ [handleSave, onCancel]
23
+ );
24
+
25
+ return (
26
+ <input
27
+ value={inputValue}
28
+ onChange={(e) => setInputValue(e.target.value)}
29
+ onKeyDown={handleKeyDown}
30
+ onBlur={handleSave}
31
+ className={cn(
32
+ 'w-full border-none outline-none bg-white dark:bg-neutral-800 focus:border-0! focus:ring-0! focus:ring-offset-0! focus:outline-none!',
33
+ className
34
+ )}
35
+ autoFocus
36
+ />
37
+ );
38
+ }
@@ -0,0 +1,14 @@
1
+ // Export all cell editor types
2
+ export type {
3
+ BaseCellEditorProps,
4
+ BooleanCellEditorProps,
5
+ DateCellEditorProps,
6
+ JsonCellEditorProps,
7
+ TextCellEditorProps,
8
+ } from './types';
9
+
10
+ // Export all cell editor components
11
+ export { BooleanCellEditor } from './BooleanCellEditor';
12
+ export { DateCellEditor } from './DateCellEditor';
13
+ export { JsonCellEditor } from './JsonCellEditor';
14
+ export { TextCellEditor } from './TextCellEditor';
@@ -0,0 +1,43 @@
1
+ import { ColumnType } from '@insforge/shared-schemas';
2
+
3
+ /**
4
+ * Base props for all cell editors
5
+ */
6
+ export interface BaseCellEditorProps {
7
+ nullable: boolean;
8
+ onCancel: () => void;
9
+ className?: string;
10
+ }
11
+
12
+ /**
13
+ * Boolean cell editor specific props
14
+ */
15
+ export interface BooleanCellEditorProps extends BaseCellEditorProps {
16
+ value: boolean | null;
17
+ onValueChange: (newValue: string) => void; // Returns 'true', 'false', or 'null'
18
+ }
19
+
20
+ /**
21
+ * Date cell editor specific props
22
+ */
23
+ export interface DateCellEditorProps extends BaseCellEditorProps {
24
+ value: string | null;
25
+ type: ColumnType.DATE | ColumnType.DATETIME;
26
+ onValueChange: (newValue: string | null) => void;
27
+ }
28
+
29
+ /**
30
+ * JSON cell editor specific props
31
+ */
32
+ export interface JsonCellEditorProps extends BaseCellEditorProps {
33
+ value: string | null;
34
+ onValueChange: (newValue: string) => void;
35
+ }
36
+
37
+ /**
38
+ * Text cell editor specific props
39
+ */
40
+ export interface TextCellEditorProps extends BaseCellEditorProps {
41
+ value: string;
42
+ onValueChange: (newValue: string) => void;
43
+ }
@@ -0,0 +1,72 @@
1
+ import { ColumnType } from '@insforge/shared-schemas';
2
+ import type {
3
+ Column,
4
+ RenderCellProps,
5
+ RenderEditCellProps,
6
+ RenderHeaderCellProps,
7
+ } from 'react-data-grid';
8
+
9
+ /**
10
+ * Raw database values - these are the actual data types stored in the database
11
+ * and received from the backend API.
12
+ */
13
+ export type ConvertedValue =
14
+ | string // STRING, UUID, DATETIME, DATE (as ISO string)
15
+ | number // INTEGER, FLOAT
16
+ | boolean // BOOLEAN
17
+ | null // NULL values for any nullable column
18
+ | JSON; // JSON (as parsed object or string)
19
+
20
+ /**
21
+ * User input values - these are the types of values users enter in forms and cell editors
22
+ * All user inputs need to be converted to ConvertedValue
23
+ */
24
+ export type UserInputValue = string | number | boolean | null;
25
+
26
+ /**
27
+ * Display values - these are always strings formatted for UI display
28
+ * Used by cell renderers and form display components
29
+ */
30
+ export type DisplayValue = string;
31
+
32
+ /**
33
+ * Database record type - represents a row in the database
34
+ */
35
+ export interface DatabaseRecord {
36
+ [columnName: string]: ConvertedValue | { [key: string]: string }[];
37
+ }
38
+
39
+ /**
40
+ * DataGrid row data - extends DatabaseRecord with required id
41
+ */
42
+ export interface DataGridRow extends DatabaseRecord {
43
+ id: string;
44
+ }
45
+
46
+ /**
47
+ * Generic row type that can be either a DatabaseRecord or a specific schema
48
+ * This allows us to support both AI-generated tables and predefined schemas
49
+ * The id field is optional as react-data-grid can generate it automatically
50
+ */
51
+ export type DataGridRowType = DatabaseRecord & { id?: string };
52
+
53
+ /**
54
+ * DataGrid column definition - generic version that extends react-data-grid's Column
55
+ * TRow must extend DataGridRowType to ensure it has both id and index signature
56
+ */
57
+ export interface DataGridColumn<TRow extends DataGridRowType = DataGridRow> extends Column<TRow> {
58
+ type?: ColumnType;
59
+ isPrimaryKey?: boolean;
60
+ isNullable?: boolean;
61
+ // Override render functions to use our custom prop types
62
+ renderCell?: (props: RenderCellProps<TRow>) => React.ReactNode;
63
+ renderEditCell?: (props: RenderEditCellProps<TRow>) => React.ReactNode;
64
+ renderHeaderCell?: (props: RenderHeaderCellProps<TRow>) => React.ReactNode;
65
+ }
66
+
67
+ /**
68
+ * Value conversion result for user input validation
69
+ */
70
+ export type ValueConversionResult =
71
+ | { success: true; value: ConvertedValue }
72
+ | { success: false; error: string };
@@ -0,0 +1,20 @@
1
+ export type {
2
+ Column,
3
+ SortColumn,
4
+ RenderCellProps,
5
+ RenderEditCellProps,
6
+ RenderHeaderCellProps,
7
+ CellClickArgs,
8
+ CellMouseEvent,
9
+ } from 'react-data-grid';
10
+ export * from './datagridTypes';
11
+
12
+ import IdCell from './IdCell';
13
+ import SortableHeaderRenderer from './SortableHeader';
14
+ import { createDefaultCellRenderer } from './DefaultCellRenderer';
15
+ import DataGrid, { type DataGridProps } from './DataGrid';
16
+
17
+ export { IdCell, SortableHeaderRenderer, DataGrid, type DataGridProps, createDefaultCellRenderer };
18
+
19
+ // Export cell editors
20
+ export * from './cell-editors';
@@ -0,0 +1,39 @@
1
+ // Core radix/ui components
2
+ export * from './radix/Button';
3
+ export * from './radix/Card';
4
+ export * from './radix/Input';
5
+ export * from './radix/Form';
6
+ export * from './radix/Tabs';
7
+ export * from './radix/Badge';
8
+ export * from './radix/Skeleton';
9
+ export * from './radix/ScrollArea';
10
+ export * from './radix/Separator';
11
+ export * from './radix/Alert';
12
+ export * from './radix/DropdownMenu';
13
+ export * from './radix/Dialog';
14
+ export * from './radix/Label';
15
+ export * from './radix/Popover';
16
+ export * from './radix/Select';
17
+ export * from './radix/Sheet';
18
+ export * from './radix/Switch';
19
+ export * from './radix/Tooltip';
20
+ export * from './radix/AlertDialog';
21
+ export * from './radix/Avatar';
22
+ export * from './ConfirmDialog';
23
+ export * from './ButtonWithLoading';
24
+
25
+ // Custom UI components
26
+ export { EmptyState } from './EmptyState';
27
+ export { LoadingState } from './LoadingState';
28
+ export { ErrorState } from './ErrorState';
29
+ export { JsonHighlight } from './JsonHighlight';
30
+ export { SearchInput } from './SearchInput';
31
+ export { PaginationControls } from './PaginationControls';
32
+ export { SelectionClearButton } from './SelectionClearButton';
33
+ export { DeleteActionButton } from './DeleteActionButton';
34
+ export { Checkbox } from './Checkbox';
35
+ export { TypeBadge } from './TypeBadge';
36
+
37
+ // Data Grid Components
38
+ export { DataGrid, SortableHeaderRenderer } from './datagrid';
39
+ export type { DataGridProps } from './datagrid';