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,209 @@
1
+ #!/bin/bash
2
+
3
+ # Test Traditional REST Response Format
4
+ # This script tests various API endpoints to ensure they follow traditional REST conventions
5
+
6
+ # Get the directory where this script is located
7
+ SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
8
+
9
+ # Source the test configuration
10
+ source "$SCRIPT_DIR/../test-config.sh"
11
+
12
+ # Check requirements
13
+ check_requirements
14
+
15
+ print_blue "🧪 Testing Traditional REST Response Format..."
16
+
17
+ # API Configuration
18
+ API_BASE="$TEST_API_BASE"
19
+ TEST_USER_EMAIL="testuser_rest_$(date +%s)@example.com"
20
+ TEST_USER_PASSWORD="TestPass123!"
21
+ AUTH_TOKEN=""
22
+
23
+ # Function to test response format
24
+ test_response_format() {
25
+ local test_name="$1"
26
+ local response="$2"
27
+ local expected_pattern="$3"
28
+ local should_not_exist="${4:-false}"
29
+
30
+ if [ "$should_not_exist" == "true" ]; then
31
+ # Check that pattern does NOT exist
32
+ if ! echo "$response" | grep -q "$expected_pattern"; then
33
+ print_success "$test_name"
34
+ return 0
35
+ else
36
+ print_fail "$test_name - found unwanted pattern: $expected_pattern"
37
+ track_test_failure
38
+ return 1
39
+ fi
40
+ else
41
+ # Check that pattern exists
42
+ if echo "$response" | grep -q "$expected_pattern"; then
43
+ print_success "$test_name"
44
+ return 0
45
+ else
46
+ print_fail "$test_name - missing pattern: $expected_pattern"
47
+ echo " Response: $(echo "$response" | head -c 200)..."
48
+ track_test_failure
49
+ return 1
50
+ fi
51
+ fi
52
+ }
53
+
54
+ # 1. Test Health Endpoint
55
+ print_info "1. Testing Health Endpoint (Success Response)"
56
+ response=$(curl -s "$API_BASE/health")
57
+ test_response_format "Direct data response" "$response" '"status":"ok"'
58
+ test_response_format "No success wrapper" "$response" '"success":true' "true"
59
+ test_response_format "No data wrapper" "$response" '"data":{' "true"
60
+
61
+ # 2. Test Authentication Errors
62
+ print_info "2. Testing Authentication Errors"
63
+ response=$(curl -s "$API_BASE/auth/sessions/current")
64
+ test_response_format "Error format" "$response" '"error":"AUTH_INVALID_CREDENTIALS"'
65
+ test_response_format "Message field" "$response" '"message":"Invalid token"'
66
+ # JWT auth includes error and message fields
67
+
68
+ # 3. Test Login Endpoint (Missing Credentials)
69
+ print_info "3. Testing Login Endpoint (Missing Credentials)"
70
+ response=$(curl -s -X POST "$API_BASE/auth/sessions" \
71
+ -H "Content-Type: application/json" \
72
+ -d '{}')
73
+ test_response_format "Error response" "$response" '"error":"INVALID_INPUT"'
74
+ test_response_format "Message field" "$response" '"message":"email: Required, password: Required"'
75
+
76
+ # 4. Test Invalid Endpoint (404)
77
+ print_info "4. Testing Invalid Endpoint (404)"
78
+ response=$(curl -s "$API_BASE/nonexistent")
79
+ test_response_format "404 error" "$response" '"statusCode":404'
80
+ test_response_format "Not found message" "$response" '"error":"NOT_FOUND"'
81
+
82
+ ADMIN_TOKEN=$(get_admin_token)
83
+
84
+ # 5. Test with Authentication
85
+ print_info "5. Creating test user for authenticated tests"
86
+ auth_response=$(curl -s -X POST "$API_BASE/auth/users" \
87
+ -H "Content-Type: application/json" \
88
+ -d "{
89
+ \"email\": \"$TEST_USER_EMAIL\",
90
+ \"password\": \"$TEST_USER_PASSWORD\",
91
+ \"name\": \"Test User\"
92
+ }")
93
+
94
+ # Check if registration was successful
95
+ if echo "$auth_response" | grep -q '"accessToken"'; then
96
+ AUTH_TOKEN=$(echo "$auth_response" | grep -o '"accessToken":"[^"]*' | cut -d'"' -f4)
97
+ print_success "User registered successfully"
98
+ register_test_user "$TEST_USER_EMAIL"
99
+
100
+ # Test authenticated endpoints
101
+ print_info "6. Testing Database Tables List (Authenticated)"
102
+ response=$(curl -s "$API_BASE/database/tables" \
103
+ -H "Authorization: Bearer $AUTH_TOKEN")
104
+ test_response_format "Direct array response" "$response" '^\['
105
+ test_response_format "No wrapper object" "$response" '"data":\[' "true"
106
+
107
+ # Test table creation
108
+ print_info "7. Testing Create Table (Success Response)"
109
+ TABLE_NAME="test_rest_table_$(date +%s)"
110
+ response=$(curl -s -X POST "$API_BASE/database/tables" \
111
+ -H "Authorization: Bearer $ADMIN_TOKEN" \
112
+ -H "Content-Type: application/json" \
113
+ -d "{
114
+ \"tableName\": \"$TABLE_NAME\",
115
+ \"rlsEnabled\": false,
116
+ \"columns\": [
117
+ {\"columnName\": \"id\", \"type\": \"uuid\", \"isNullable\": false, \"isUnique\": false, \"defaultValue\": \"gen_random_uuid()\"},
118
+ {\"columnName\": \"title\", \"type\": \"string\", \"isNullable\": false, \"isUnique\": false}
119
+ ]
120
+ }")
121
+
122
+ if echo "$response" | grep -q '"tableName"'; then
123
+ print_success "Table created"
124
+ register_test_table "$TABLE_NAME"
125
+ test_response_format "Direct object response" "$response" "\"tableName\":\"$TABLE_NAME\""
126
+ test_response_format "No success wrapper" "$response" '"success":true' "true"
127
+ else
128
+ print_fail "Table creation failed"
129
+ echo "Response: $response"
130
+ track_test_failure
131
+ fi
132
+
133
+ # Test pagination headers
134
+ print_info "8. Testing Pagination Headers"
135
+ # Use -I for headers, but we need both headers and body
136
+ full_response=$(curl -s -i "$API_BASE/logs/audits?limit=10" \
137
+ -H "Authorization: Bearer $ADMIN_TOKEN")
138
+
139
+ # Extract headers (everything before empty line)
140
+ headers=$(echo "$full_response" | awk 'BEGIN{RS="\r\n\r\n"} NR==1')
141
+
142
+ # Test for PostgREST-style Content-Range header (format: start-end/total)
143
+ test_response_format "Content-Range header" "$headers" 'Content-Range:'
144
+ test_response_format "Preference-Applied header" "$headers" 'Preference-Applied:'
145
+
146
+ else
147
+ print_fail "Failed to register user"
148
+ echo "Response: $auth_response"
149
+ track_test_failure
150
+ fi
151
+
152
+ # 9. Test Storage API (requires API key)
153
+ print_info "9. Testing Storage API Format"
154
+ # First get admin token if we don't have it
155
+ if [ -z "$AUTH_TOKEN" ]; then
156
+ admin_token=$(get_admin_token)
157
+ else
158
+ admin_token="$AUTH_TOKEN"
159
+ fi
160
+
161
+ # Try to get API key from the API endpoint first
162
+ if [ -n "$admin_token" ]; then
163
+ api_key_response=$(curl -s "$API_BASE/metadata/api-key" \
164
+ -H "Authorization: Bearer $admin_token")
165
+ API_KEY=$(echo "$api_key_response" | grep -o '"apiKey":"[^"]*' | cut -d'"' -f4)
166
+ fi
167
+
168
+ # If that fails, try the helper function
169
+ if [ -z "$API_KEY" ]; then
170
+ API_KEY=$(get_admin_api_key)
171
+ fi
172
+
173
+ # Export for cleanup
174
+ if [ -n "$API_KEY" ]; then
175
+ export ACCESS_API_KEY="$API_KEY"
176
+ # List buckets
177
+ response=$(curl -s "$API_BASE/storage/buckets" \
178
+ -H "Authorization: Bearer $API_KEY")
179
+ test_response_format "Direct array for buckets" "$response" '^\['
180
+
181
+ # Create a test bucket
182
+ BUCKET_NAME="test-rest-bucket-$(date +%s)"
183
+ response=$(curl -s -X POST "$API_BASE/storage/buckets" \
184
+ -H "Content-Type: application/json" \
185
+ -H "Authorization: Bearer $API_KEY" \
186
+ -d "{\"bucketName\": \"$BUCKET_NAME\", \"isPublic\": true}")
187
+
188
+ if echo "$response" | grep -q '"bucketName"'; then
189
+ print_success "Bucket created"
190
+ register_test_bucket "$BUCKET_NAME"
191
+ test_response_format "Success message field" "$response" '"message":"Bucket created successfully"'
192
+ test_response_format "NextAction guidance" "$response" '"nextActions":'
193
+ else
194
+ print_fail "Bucket creation failed"
195
+ echo "Response: $response"
196
+ track_test_failure
197
+ fi
198
+ else
199
+ print_info "Skipping storage tests (no API key available)"
200
+ fi
201
+
202
+ # Summary
203
+ echo ""
204
+ print_blue "=========================================="
205
+ print_blue "Traditional REST Format Test Complete"
206
+ print_blue "=========================================="
207
+
208
+ # Exit with proper status
209
+ exit_with_status
@@ -0,0 +1,51 @@
1
+ # Manual Tests
2
+
3
+ This directory contains tests that need to be run manually and are not included in the automated test suite.
4
+
5
+ ## Better Auth Tests
6
+
7
+ These tests are for the Better Auth v2 implementation.
8
+
9
+ ### Running Better Auth Tests
10
+
11
+ Run the Better Auth test:
12
+ ```bash
13
+ ./tests/manual/test-better-auth.sh
14
+ ```
15
+
16
+ ### Prerequisites
17
+
18
+ - Docker must be running with the InsForge backend on port 7130
19
+ - Admin credentials should be configured in environment variables:
20
+ - `ADMIN_EMAIL` (default: admin@example.com)
21
+ - `ADMIN_PASSWORD` (default: change-this-password)
22
+
23
+ ### Example Commands
24
+
25
+ ```bash
26
+ # Run from the backend directory
27
+ cd backend
28
+
29
+ # Run Better Auth test
30
+ ./tests/manual/test-better-auth.sh
31
+
32
+ # Run with custom admin credentials
33
+ ADMIN_EMAIL=admin@mycompany.com ADMIN_PASSWORD=mysecurepass ./tests/manual/test-better-auth.sh
34
+ ```
35
+
36
+ ### Test Coverage
37
+
38
+ The test covers:
39
+ - Admin authentication (sign-in, wrong password, non-admin email)
40
+ - User registration and sign-in
41
+ - Admin user management (list users with pagination)
42
+ - JWT token verification (admin role and type claims)
43
+ - Authorization checks (admin-only endpoints)
44
+ - Error handling (invalid email format, missing fields)
45
+
46
+ ### Why These Tests Are Manual
47
+
48
+ These tests are kept separate because:
49
+ 1. They use authentication endpoints (`/api/auth/v2/*`) that require specific setup
50
+ 2. They test admin-specific functionality that needs manual verification
51
+ 3. They verify JWT token structure and claims that may vary between environments
@@ -0,0 +1,11 @@
1
+ -- Create large_table with basic structure
2
+ CREATE TABLE IF NOT EXISTS large_table (
3
+ id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
4
+ user_id UUID NOT NULL,
5
+ title TEXT NOT NULL,
6
+ content TEXT,
7
+ status VARCHAR(50) DEFAULT 'active',
8
+ metadata JSONB DEFAULT '{}',
9
+ created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
10
+ updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP
11
+ );
@@ -0,0 +1,101 @@
1
+ -- Insert 1500 test records into large_table
2
+ -- Using generate_series for efficient bulk insertion
3
+
4
+ INSERT INTO large_table (user_id, title, content, status, metadata, created_at, updated_at)
5
+ SELECT
6
+ -- Generate random user_ids from a pool of 10 different users
7
+ (ARRAY[
8
+ '550e8400-e29b-41d4-a716-446655440001'::uuid,
9
+ '550e8400-e29b-41d4-a716-446655440002'::uuid,
10
+ '550e8400-e29b-41d4-a716-446655440003'::uuid,
11
+ '550e8400-e29b-41d4-a716-446655440004'::uuid,
12
+ '550e8400-e29b-41d4-a716-446655440005'::uuid,
13
+ '550e8400-e29b-41d4-a716-446655440006'::uuid,
14
+ '550e8400-e29b-41d4-a716-446655440007'::uuid,
15
+ '550e8400-e29b-41d4-a716-446655440008'::uuid,
16
+ '550e8400-e29b-41d4-a716-446655440009'::uuid,
17
+ '550e8400-e29b-41d4-a716-446655440010'::uuid
18
+ ])[1 + floor(random() * 10)::int] as user_id,
19
+
20
+ -- Generate title
21
+ 'Test Record #' || i || ' - ' || (ARRAY['Important', 'Regular', 'Draft', 'Published', 'Archived'])[1 + floor(random() * 5)::int] as title,
22
+
23
+ -- Generate content with varying lengths
24
+ 'This is the content for record ' || i || '. ' ||
25
+ repeat('Lorem ipsum dolor sit amet, consectetur adipiscing elit. ', 1 + floor(random() * 10)::int) ||
26
+ 'End of content.' as content,
27
+
28
+ -- Random status
29
+ (ARRAY['active', 'inactive', 'pending', 'completed', 'archived'])[1 + floor(random() * 5)::int] as status,
30
+
31
+ -- Generate random metadata
32
+ jsonb_build_object(
33
+ 'record_number', i,
34
+ 'category', (ARRAY['technology', 'business', 'personal', 'research', 'other'])[1 + floor(random() * 5)::int],
35
+ 'priority', floor(random() * 10 + 1)::int,
36
+ 'tags', (ARRAY['["tag1"]', '["tag1", "tag2"]', '["tag1", "tag2", "tag3"]', '["important"]', '[]'])[1 + floor(random() * 5)::int]::jsonb,
37
+ 'is_featured', (random() > 0.5),
38
+ 'view_count', floor(random() * 1000)::int,
39
+ 'test_data', true
40
+ ) as metadata,
41
+
42
+ -- Generate created_at timestamps spread over the last 90 days
43
+ CURRENT_TIMESTAMP - (interval '1 hour' * floor(random() * 2160)) as created_at,
44
+
45
+ -- Updated_at should be equal or after created_at
46
+ CURRENT_TIMESTAMP - (interval '1 hour' * floor(random() * 720)) as updated_at
47
+ FROM generate_series(1, 1500) AS i;
48
+
49
+ -- Add some additional records with specific patterns for testing
50
+ -- Records with null content
51
+ INSERT INTO large_table (user_id, title, content, status, metadata)
52
+ VALUES
53
+ ('550e8400-e29b-41d4-a716-446655440001'::uuid, 'Record with null content #1', NULL, 'active', '{"special": "null_content"}'),
54
+ ('550e8400-e29b-41d4-a716-446655440002'::uuid, 'Record with null content #2', NULL, 'inactive', '{"special": "null_content"}'),
55
+ ('550e8400-e29b-41d4-a716-446655440003'::uuid, 'Record with null content #3', NULL, 'pending', '{"special": "null_content"}');
56
+
57
+ -- Records with very long content
58
+ INSERT INTO large_table (user_id, title, content, status, metadata)
59
+ VALUES
60
+ ('550e8400-e29b-41d4-a716-446655440004'::uuid,
61
+ 'Record with very long content',
62
+ repeat('This is a very long text. ', 500),
63
+ 'active',
64
+ '{"special": "long_content"}');
65
+
66
+ -- Records with special characters
67
+ INSERT INTO large_table (user_id, title, content, status, metadata)
68
+ VALUES
69
+ ('550e8400-e29b-41d4-a716-446655440005'::uuid,
70
+ 'Record with special chars: ñ, é, ü, 中文, 🎉',
71
+ 'Content with special characters: "quoted", ''single quotes'', backslash \, tab character, newline
72
+ character',
73
+ 'active',
74
+ '{"special": "special_chars", "unicode": "测试"}');
75
+
76
+ -- Records with complex JSON metadata
77
+ INSERT INTO large_table (user_id, title, content, status, metadata)
78
+ VALUES
79
+ ('550e8400-e29b-41d4-a716-446655440006'::uuid,
80
+ 'Record with complex metadata',
81
+ 'This record has complex nested JSON metadata',
82
+ 'active',
83
+ '{
84
+ "nested": {
85
+ "level1": {
86
+ "level2": {
87
+ "level3": "deep value"
88
+ }
89
+ }
90
+ },
91
+ "array": [1, 2, 3, 4, 5],
92
+ "mixed": {
93
+ "string": "text",
94
+ "number": 123.45,
95
+ "boolean": true,
96
+ "null_value": null
97
+ }
98
+ }');
99
+
100
+ -- Summary comment
101
+ -- Total records inserted: 1506 (1500 from generate_series + 6 special test cases)
@@ -0,0 +1,34 @@
1
+ -- Add indexes
2
+ CREATE INDEX IF NOT EXISTS idx_large_table_user_id ON large_table(user_id);
3
+ CREATE INDEX IF NOT EXISTS idx_large_table_created_at ON large_table(created_at);
4
+ CREATE INDEX IF NOT EXISTS idx_large_table_status ON large_table(status);
5
+
6
+ -- Create trigger function for updating updated_at timestamp
7
+ CREATE OR REPLACE FUNCTION update_updated_at_column()
8
+ RETURNS TRIGGER AS $$
9
+ BEGIN
10
+ NEW.updated_at = CURRENT_TIMESTAMP;
11
+ RETURN NEW;
12
+ END;
13
+ $$ LANGUAGE plpgsql;
14
+
15
+ -- Create trigger to automatically update updated_at
16
+ DROP TRIGGER IF EXISTS update_large_table_updated_at ON large_table;
17
+ CREATE TRIGGER update_large_table_updated_at
18
+ BEFORE UPDATE ON large_table
19
+ FOR EACH ROW
20
+ EXECUTE FUNCTION update_updated_at_column();
21
+
22
+ -- Enable Row Level Security
23
+ ALTER TABLE large_table ENABLE ROW LEVEL SECURITY;
24
+
25
+ -- Create RLS policies
26
+ DROP POLICY IF EXISTS "Enable read access for all users" ON large_table;
27
+ CREATE POLICY "Enable read access for all users"
28
+ ON large_table
29
+ FOR SELECT
30
+ USING (true);
31
+
32
+ -- Grant permissions
33
+ GRANT ALL ON large_table TO anon;
34
+ GRANT ALL ON large_table TO authenticated;