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,125 @@
1
+ -- init.sql
2
+ -- Create role for anonymous user
3
+ CREATE ROLE anon NOLOGIN;
4
+
5
+ -- Create role for authenticator
6
+ CREATE ROLE authenticated NOLOGIN;
7
+
8
+ -- Create project admin role for admin users
9
+ CREATE ROLE project_admin NOLOGIN;
10
+
11
+ GRANT USAGE ON SCHEMA public TO anon;
12
+ GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO anon;
13
+ GRANT USAGE ON SCHEMA public TO authenticated;
14
+ GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO authenticated;
15
+ GRANT USAGE ON SCHEMA public TO project_admin;
16
+ GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO project_admin;
17
+
18
+ -- Grant permissions to roles
19
+ -- NOTICE: The anon role is intended for unauthenticated users, so it should only have read access.
20
+ GRANT SELECT ON ALL TABLES IN SCHEMA public TO anon;
21
+ ALTER DEFAULT PRIVILEGES IN SCHEMA public
22
+ GRANT SELECT ON TABLES TO anon;
23
+
24
+ GRANT SELECT ON ALL TABLES IN SCHEMA public TO authenticated;
25
+ ALTER DEFAULT PRIVILEGES IN SCHEMA public
26
+ GRANT SELECT ON TABLES TO authenticated;
27
+
28
+ GRANT INSERT ON ALL TABLES IN SCHEMA public TO authenticated;
29
+ ALTER DEFAULT PRIVILEGES IN SCHEMA public
30
+ GRANT INSERT ON TABLES TO authenticated;
31
+
32
+ GRANT UPDATE ON ALL TABLES IN SCHEMA public TO authenticated;
33
+ ALTER DEFAULT PRIVILEGES IN SCHEMA public
34
+ GRANT UPDATE ON TABLES TO authenticated;
35
+
36
+ GRANT DELETE ON ALL TABLES IN SCHEMA public TO authenticated;
37
+ ALTER DEFAULT PRIVILEGES IN SCHEMA public
38
+ GRANT DELETE ON TABLES TO authenticated;
39
+
40
+ GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO project_admin;
41
+ ALTER DEFAULT PRIVILEGES IN SCHEMA public
42
+ GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO project_admin;
43
+
44
+ -- Create function to automatically create RLS policies for new tables
45
+ CREATE OR REPLACE FUNCTION public.create_default_policies()
46
+ RETURNS event_trigger AS $$
47
+ DECLARE
48
+ obj record;
49
+ table_schema text;
50
+ table_name text;
51
+ has_rls boolean;
52
+ BEGIN
53
+ FOR obj IN SELECT * FROM pg_event_trigger_ddl_commands() WHERE command_tag = 'CREATE TABLE'
54
+ LOOP
55
+ -- Extract schema and table name from object_identity
56
+ -- Handle quoted identifiers by removing quotes
57
+ SELECT INTO table_schema, table_name
58
+ split_part(obj.object_identity, '.', 1),
59
+ trim(both '"' from split_part(obj.object_identity, '.', 2));
60
+ -- Check if RLS is enabled on the table
61
+ SELECT INTO has_rls
62
+ rowsecurity
63
+ FROM pg_tables
64
+ WHERE schemaname = table_schema
65
+ AND tablename = table_name;
66
+ -- Only create policies if RLS is enabled
67
+ IF has_rls THEN
68
+ -- Create policies for each role
69
+ -- anon: read-only access
70
+ EXECUTE format('CREATE POLICY "anon_policy" ON %s FOR SELECT TO anon USING (true)', obj.object_identity);
71
+ -- authenticated: full access
72
+ EXECUTE format('CREATE POLICY "authenticated_policy" ON %s FOR ALL TO authenticated USING (true) WITH CHECK (true)', obj.object_identity);
73
+ -- project_admin: full access
74
+ EXECUTE format('CREATE POLICY "project_admin_policy" ON %s FOR ALL TO project_admin USING (true) WITH CHECK (true)', obj.object_identity);
75
+ END IF;
76
+ END LOOP;
77
+ END;
78
+ $$ LANGUAGE plpgsql;
79
+
80
+ -- Create event trigger to run the function when new tables are created
81
+ CREATE EVENT TRIGGER create_policies_on_table_create
82
+ ON ddl_command_end
83
+ WHEN TAG IN ('CREATE TABLE')
84
+ EXECUTE FUNCTION public.create_default_policies();
85
+
86
+ -- Create function to handle RLS enablement
87
+ CREATE OR REPLACE FUNCTION public.create_policies_after_rls()
88
+ RETURNS event_trigger AS $$
89
+ DECLARE
90
+ obj record;
91
+ table_schema text;
92
+ table_name text;
93
+ BEGIN
94
+ FOR obj IN SELECT * FROM pg_event_trigger_ddl_commands() WHERE command_tag = 'ALTER TABLE'
95
+ LOOP
96
+ -- Extract schema and table name
97
+ -- Handle quoted identifiers by removing quotes
98
+ SELECT INTO table_schema, table_name
99
+ split_part(obj.object_identity, '.', 1),
100
+ trim(both '"' from split_part(obj.object_identity, '.', 2));
101
+ -- Check if table has RLS enabled and no policies yet
102
+ IF EXISTS (
103
+ SELECT 1 FROM pg_tables
104
+ WHERE schemaname = table_schema
105
+ AND tablename = table_name
106
+ AND rowsecurity = true
107
+ ) AND NOT EXISTS (
108
+ SELECT 1 FROM pg_policies
109
+ WHERE schemaname = table_schema
110
+ AND tablename = table_name
111
+ ) THEN
112
+ -- Create default policies
113
+ EXECUTE format('CREATE POLICY "anon_policy" ON %s FOR SELECT TO anon USING (true)', obj.object_identity);
114
+ EXECUTE format('CREATE POLICY "authenticated_policy" ON %s FOR ALL TO authenticated USING (true) WITH CHECK (true)', obj.object_identity);
115
+ EXECUTE format('CREATE POLICY "project_admin_policy" ON %s FOR ALL TO project_admin USING (true) WITH CHECK (true)', obj.object_identity);
116
+ END IF;
117
+ END LOOP;
118
+ END;
119
+ $$ LANGUAGE plpgsql;
120
+
121
+ -- Create event trigger for ALTER TABLE commands
122
+ CREATE EVENT TRIGGER create_policies_on_rls_enable
123
+ ON ddl_command_end
124
+ WHEN TAG IN ('ALTER TABLE')
125
+ EXECUTE FUNCTION public.create_policies_after_rls();
@@ -0,0 +1,5 @@
1
+ \set jwt_secret `echo "$JWT_SECRET"`
2
+ \set jwt_exp `echo "$JWT_EXP"`
3
+
4
+ ALTER DATABASE postgres SET "app.settings.jwt_secret" TO :'jwt_secret';
5
+ ALTER DATABASE postgres SET "app.settings.jwt_exp" TO :'jwt_exp';
@@ -0,0 +1,9 @@
1
+ \set pguser `echo "$POSTGRES_USER"`
2
+
3
+ CREATE DATABASE _insforge WITH OWNER :pguser;
4
+
5
+ \c _insforge
6
+ create schema if not exists _analytics;
7
+ alter schema _analytics owner to :pguser;
8
+
9
+ \c insforge
@@ -0,0 +1,17 @@
1
+ # PostgreSQL configuration for InsForge
2
+ # Enable logical replication for Logflare
3
+
4
+ # Listen on all interfaces to allow container connections
5
+ listen_addresses = '*'
6
+
7
+ # Set WAL level to logical for Logflare replication
8
+ wal_level = logical
9
+
10
+ # Set max replication slots (needed for logical replication)
11
+ max_replication_slots = 10
12
+
13
+ # Set max WAL senders
14
+ max_wal_senders = 10
15
+
16
+ # Shared preload libraries (if needed)
17
+ # shared_preload_libraries = 'pg_stat_statements'
@@ -0,0 +1,215 @@
1
+ # Insforge OSS Authentication API Documentation
2
+
3
+ ## Overview
4
+
5
+ Insforge uses JWT tokens and API keys for authentication. Store tokens in localStorage after login.
6
+ **All requests**: Use `Authorization: Bearer <token>` header (for both JWT tokens and API keys)
7
+
8
+ ## Base URL
9
+ `http://localhost:7130`
10
+
11
+ ## User Authentication
12
+
13
+ ### Register New User
14
+ **POST** `/api/auth/users`
15
+
16
+ Body: `{"email": "user@example.com", "password": "password", "name": "User Name"}`
17
+
18
+ Returns: `{"accessToken": "...", "user": {"id": "...", "email": "...", "name": "...", "emailVerified": false, "createdAt": "...", "updatedAt": "..."}}`
19
+
20
+ **Note:** This creates an entry in the `users` table with the same `id` for profile data
21
+
22
+ ### Login User
23
+ **POST** `/api/auth/sessions`
24
+
25
+ Body: `{"email": "user@example.com", "password": "password"}`
26
+
27
+ Returns: `{"accessToken": "...", "user": {"id": "...", "email": "...", "name": "...", "emailVerified": false, "createdAt": "...", "updatedAt": "..."}}`
28
+
29
+ ### Get Current User
30
+ **GET** `/api/auth/sessions/current`
31
+
32
+ Headers: `Authorization: Bearer <accessToken>`
33
+
34
+ Returns: `{"user": {"id": "...", "email": "...", "role": "authenticated"}}`
35
+
36
+ **Note**: Returns LIMITED fields (id, email, role). For user profile data (nickname, avatar, bio, etc.), query `/api/database/records/users?id=eq.<user_id>`
37
+
38
+ **Common errors:**
39
+ - `401` with `"code": "MISSING_AUTHORIZATION_HEADER"` → No token provided
40
+ - `401` with `"code": "INVALID_TOKEN"` → Token expired or invalid
41
+
42
+ ## Admin Authentication
43
+
44
+ ### Admin Login
45
+ **POST** `/api/auth/admin/sessions`
46
+
47
+ Request:
48
+ ```json
49
+ {
50
+ "email": "admin@example.com",
51
+ "password": "change-this-password"
52
+ }
53
+ ```
54
+
55
+ Response:
56
+ ```json
57
+ {
58
+ "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
59
+ "user": {
60
+ "id": "admin-id",
61
+ "email": "admin@example.com",
62
+ "name": "Administrator",
63
+ "role": "project_admin"
64
+ }
65
+ }
66
+ ```
67
+
68
+ ```bash
69
+ # Mac/Linux
70
+ curl -X POST http://localhost:7130/api/auth/admin/sessions \
71
+ -H 'Content-Type: application/json' \
72
+ -d '{"email":"admin@example.com","password":"change-this-password"}'
73
+
74
+ # Windows PowerShell (use curl.exe)
75
+ curl.exe -X POST http://localhost:7130/api/auth/admin/sessions \
76
+ -H "Content-Type: application/json" \
77
+ -d '{\"email\":\"admin@example.com\",\"password\":\"change-this-password\"}'
78
+ ```
79
+
80
+ ## Error Response Format
81
+
82
+ All error responses follow this format:
83
+ ```json
84
+ {
85
+ "code": "ERROR_CODE",
86
+ "message": "Human-readable error message"
87
+ }
88
+ ```
89
+
90
+ Example error:
91
+ ```json
92
+ {
93
+ "code": "INVALID_EMAIL",
94
+ "message": "Please provide a valid email"
95
+ }
96
+ ```
97
+
98
+ ## OAuth Support
99
+
100
+ Insforge supports Google and GitHub OAuth when configured with environment variables.
101
+
102
+ OAuth workflow:
103
+ 1. End user initiates OAuth login and receives authorization URL from backend
104
+ 2. After successful user authorization, Google/GitHub redirects to backend callback
105
+ 3. Backend generates JWT token and redirects to the application page
106
+
107
+ Prerequisites:
108
+ 1. Create Google or GitHub OAuth Application and obtain Client ID and Client Secret
109
+ 2. Configure each platform's Client ID/Client Secret in InsForge backend (via Environment Variables)
110
+
111
+ ### OAuth Endpoints
112
+
113
+ #### Get OAuth URL (Google/GitHub)
114
+ **GET** `/api/auth/oauth/:provider`
115
+
116
+ Parameters:
117
+ - `provider`: "google" or "github" in the URL path
118
+ - Query params: `?redirect_uri=http://localhost:3000/dashboard`
119
+
120
+ Returns: `{"authUrl": "https://accounts.google.com/..."}` - URL to redirect user to provider's OAuth page.
121
+
122
+ ```bash
123
+ # Mac/Linux
124
+ curl -X GET "http://localhost:7130/api/auth/oauth/google?redirect_uri=http://localhost:3000/dashboard"
125
+
126
+ # Windows PowerShell (use curl.exe)
127
+ curl.exe -X GET "http://localhost:7130/api/auth/oauth/google?redirect_uri=http://localhost:3000/dashboard"
128
+ ```
129
+
130
+ Example response:
131
+ ```json
132
+ {
133
+ "authUrl": "https://accounts.google.com/o/oauth2/v2/auth?client_id=..."
134
+ }
135
+ ```
136
+
137
+ #### OAuth Callback
138
+ The OAuth provider will redirect to:
139
+ - Google: `http://localhost:7130/api/auth/oauth/google/callback`
140
+ - GitHub: `http://localhost:7130/api/auth/oauth/github/callback`
141
+
142
+ After processing, backend redirects to your specified `redirect_uri` with JWT token in URL parameters:
143
+ - `access_token` - JWT authentication token
144
+ - `user_id` - User's unique ID
145
+ - `email` - User's email address
146
+ - `name` - User's display name
147
+
148
+ ## User Profile Table
149
+
150
+ ### Users Table
151
+ The `users` table stores **user profile data**:
152
+ - **✅ READ** via: `GET /api/database/records/users`
153
+ - **✅ WRITE** via: `PATCH /api/database/records/users?id=eq.<user_id>`
154
+ - **✅ Foreign keys allowed** - reference `users.id`
155
+ - **IMPORTANT**: Add columns to this table for profile data instead of creating separate profile tables
156
+
157
+ **Schema:**
158
+ - `id` - User ID (UUID, primary key)
159
+ - `nickname` - Display name (text, nullable)
160
+ - `avatar_url` - Profile picture URL (text, nullable)
161
+ - `bio` - User biography (text, nullable)
162
+ - `birthday` - Birth date (date, nullable)
163
+ - `created_at` - Account creation timestamp
164
+ - `updated_at` - Last update timestamp
165
+
166
+ **Note:** Email and name from auth are returned by Auth API, not stored in users table
167
+
168
+ Example - Create table with user reference:
169
+ ```json
170
+ {
171
+ "table_name": "posts",
172
+ "columns": [
173
+ {
174
+ "name": "title",
175
+ "type": "string",
176
+ "nullable": false,
177
+ "is_unique": false
178
+ },
179
+ {
180
+ "name": "user_id",
181
+ "type": "string",
182
+ "nullable": false,
183
+ "is_unique": false,
184
+ "foreign_key": {
185
+ "reference_table": "users",
186
+ "reference_column": "id",
187
+ "on_delete": "CASCADE",
188
+ "on_update": "CASCADE"
189
+ }
190
+ }
191
+ ]
192
+ }
193
+ ```
194
+
195
+ ### Available Tables
196
+ - **users** - User profile data (read/write access)
197
+ - Use this table for foreign key references
198
+ - Update profiles with PATCH requests
199
+
200
+ ## Headers Summary
201
+
202
+ | API Type | Header Required |
203
+ |----------|----------------|
204
+ | Auth endpoints | None |
205
+ | Database/Storage | `Authorization: Bearer <accessToken>` |
206
+ | MCP testing only | `x-api-key: <key>` |
207
+
208
+ ## Critical Notes
209
+
210
+ 1. `/api/auth/sessions/current` returns `{"user": {...}}` - nested, not root level
211
+ 2. `/api/auth/sessions/current` only has: id, email, role (limited fields)
212
+ 3. Full user profile: `GET /api/database/records/users?id=eq.<id>`
213
+ 4. POST to database requires `[{...}]` array format always
214
+ 5. Auth endpoints (register/login): no headers needed
215
+ 6. Protected endpoints: `Authorization: Bearer <accessToken>`
@@ -0,0 +1,100 @@
1
+ # InsForge Auth SDK
2
+
3
+ ## Setup
4
+ ```javascript
5
+ import { createClient } from '@insforge/sdk';
6
+ const client = createClient({ baseUrl: 'http://localhost:7130' });
7
+ ```
8
+
9
+ ## Methods
10
+
11
+ ### signUp
12
+ ```javascript
13
+ await client.auth.signUp({ email, password, name? })
14
+ // Returns: { data: { accessToken, user }, error }
15
+ // user: { id, email, name, emailVerified, createdAt, updatedAt }
16
+ // Token auto-stored
17
+ ```
18
+
19
+ ### signInWithPassword
20
+ ```javascript
21
+ await client.auth.signInWithPassword({ email, password })
22
+ // Returns: { data: { accessToken, user }, error }
23
+ // Token auto-stored
24
+ ```
25
+
26
+ ### signInWithOAuth
27
+ ```javascript
28
+ const { data, error } = await client.auth.signInWithOAuth({
29
+ provider: 'google'|'github',
30
+ redirectTo: window.location.origin,
31
+ skipBrowserRedirect: true
32
+ })
33
+ // Returns: { data: { url, provider }, error }
34
+
35
+ // Manual redirect required
36
+ if (data?.url) {
37
+ window.location.href = data.url
38
+ }
39
+
40
+ // ⚠️ IMPORTANT: No callback handling needed!
41
+ // After OAuth, user returns to redirectTo URL already authenticated
42
+ // The SDK automatically:
43
+ // - Handles the OAuth callback
44
+ // - Stores the JWT token
45
+ // - Makes user available via getCurrentUser()
46
+
47
+ // ❌ DON'T DO THIS (not needed):
48
+ // const accessToken = urlParams.get('access_token')
49
+ // const userId = urlParams.get('user_id')
50
+
51
+ // ✅ DO THIS INSTEAD (after redirect back):
52
+ const { data: userData } = await client.auth.getCurrentUser()
53
+ ```
54
+
55
+ ### getCurrentUser
56
+ ```javascript
57
+ await client.auth.getCurrentUser()
58
+ // Returns: { data: { user: { id, email, role }, profile: {...} }, error }
59
+ // Makes API call to validate token and fetch profile
60
+ ```
61
+
62
+ ### getCurrentSession
63
+ ```javascript
64
+ await client.auth.getCurrentSession()
65
+ // Returns: { data: { session: { accessToken, user } }, error }
66
+ // From localStorage, no API call
67
+ ```
68
+
69
+ ### getProfile
70
+ ```javascript
71
+ await client.auth.getProfile(userId)
72
+ // Returns: { data: { id, nickname, bio, ... }, error }
73
+ // Returns single object, not array!
74
+ ```
75
+
76
+ ### setProfile
77
+ ```javascript
78
+ await client.auth.setProfile({ nickname, bio, avatar_url })
79
+ // Returns: { data: { id, nickname, bio, ... }, error }
80
+ // Returns single object, not array!
81
+ ```
82
+
83
+ ### signOut
84
+ ```javascript
85
+ await client.auth.signOut()
86
+ // Returns: { error }
87
+ // Clears token from storage
88
+ ```
89
+
90
+ ## Error Codes
91
+ - `INVALID_EMAIL`
92
+ - `WEAK_PASSWORD`
93
+ - `USER_ALREADY_EXISTS`
94
+ - `INVALID_CREDENTIALS`
95
+ - `INVALID_TOKEN`
96
+
97
+ ## Notes
98
+ - Tokens stored in localStorage (browser) or memory (Node.js)
99
+ - All requests after login automatically include token
100
+ - User profile data in `users` table, not auth