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,303 @@
1
+ #!/bin/bash
2
+
3
+ # Test configuration file
4
+ # Source this file in test scripts to get consistent configuration
5
+
6
+ # API Configuration
7
+ export TEST_API_BASE="${TEST_API_BASE:-http://localhost:7130/api}"
8
+
9
+ # Admin credentials - can be overridden by environment variables
10
+ export TEST_ADMIN_EMAIL="${TEST_ADMIN_EMAIL:-${ADMIN_EMAIL:-admin@example.com}}"
11
+ export TEST_ADMIN_PASSWORD="${TEST_ADMIN_PASSWORD:-${ADMIN_PASSWORD:-change-this-password}}"
12
+
13
+ # User test credentials
14
+ export TEST_USER_EMAIL_PREFIX="${TEST_USER_EMAIL_PREFIX:-testuser_}"
15
+
16
+ # Colors for output
17
+ export RED='\033[0;31m'
18
+ export GREEN='\033[0;32m'
19
+ export YELLOW='\033[1;33m'
20
+ export BLUE='\033[0;34m'
21
+ export NC='\033[0m' # No Color
22
+
23
+ # Utility functions
24
+ print_success() {
25
+ echo -e "${GREEN}✅ $1${NC}"
26
+ }
27
+
28
+ print_fail() {
29
+ echo -e "${RED}❌ $1${NC}"
30
+ track_test_failure
31
+ }
32
+
33
+ print_info() {
34
+ echo -e "${YELLOW}$1${NC}"
35
+ }
36
+
37
+ print_blue() {
38
+ echo -e "${BLUE}$1${NC}"
39
+ }
40
+
41
+ # Function to login as admin and get token
42
+ get_admin_token() {
43
+ # Use JWT admin endpoint
44
+ local response=$(curl -s -X POST "$TEST_API_BASE/auth/admin/sessions" \
45
+ -H "Content-Type: application/json" \
46
+ -d "{\"email\":\"$TEST_ADMIN_EMAIL\",\"password\":\"$TEST_ADMIN_PASSWORD\"}")
47
+
48
+ if echo "$response" | grep -q '"accessToken"'; then
49
+ echo "$response" | grep -o '"accessToken":"[^"]*"' | cut -d'"' -f4
50
+ else
51
+ echo ""
52
+ fi
53
+ }
54
+
55
+ # Function to get admin API key
56
+ get_admin_api_key() {
57
+ # Only use ACCESS_API_KEY environment variable
58
+ if [ -n "$ACCESS_API_KEY" ]; then
59
+ echo "$ACCESS_API_KEY"
60
+ else
61
+ echo ""
62
+ fi
63
+ }
64
+
65
+ # Check if required tools are installed
66
+ check_requirements() {
67
+ if ! command -v curl &> /dev/null; then
68
+ print_fail "curl is required but not installed"
69
+ exit 1
70
+ fi
71
+
72
+ if ! command -v jq &> /dev/null; then
73
+ print_info "jq is recommended for JSON parsing"
74
+ fi
75
+ }
76
+
77
+ # Array to track test tables created
78
+ declare -a TEST_TABLES_CREATED=()
79
+
80
+ # Array to track test users created
81
+ declare -a TEST_USERS_CREATED=()
82
+
83
+ # Array to track test buckets created
84
+ declare -a TEST_BUCKETS_CREATED=()
85
+
86
+ # Function to register a table for cleanup
87
+ register_test_table() {
88
+ local table_name=$1
89
+ TEST_TABLES_CREATED+=("$table_name")
90
+ }
91
+
92
+ # Function to register a user for cleanup
93
+ register_test_user() {
94
+ local user_email=$1
95
+ TEST_USERS_CREATED+=("$user_email")
96
+ }
97
+
98
+ # Function to register a bucket for cleanup
99
+ register_test_bucket() {
100
+ local bucket_name=$1
101
+ TEST_BUCKETS_CREATED+=("$bucket_name")
102
+ }
103
+
104
+ # Function to register a user with Better Auth
105
+ register_user() {
106
+ local email=$1
107
+ local password=$2
108
+ local name=${3:-"Test User"}
109
+
110
+ # Use JWT registration
111
+ curl -s -X POST "$TEST_API_BASE/auth/users" \
112
+ -H "Content-Type: application/json" \
113
+ -d "{\"email\":\"$email\",\"password\":\"$password\",\"name\":\"$name\"}"
114
+ }
115
+
116
+ # Function to login a user with Better Auth
117
+ login_user() {
118
+ local email=$1
119
+ local password=$2
120
+
121
+ # Use JWT login
122
+ curl -s -X POST "$TEST_API_BASE/auth/sessions" \
123
+ -H "Content-Type: application/json" \
124
+ -d "{\"email\":\"$email\",\"password\":\"$password\"}"
125
+ }
126
+
127
+ # Function to get user profile with auth token
128
+ get_user_profile() {
129
+ local token=$1
130
+
131
+ # Use JWT profile endpoint
132
+ curl -s -X GET "$TEST_API_BASE/auth/sessions/current" \
133
+ -H "Authorization: Bearer $token"
134
+ }
135
+
136
+ # Function to delete a table
137
+ delete_table() {
138
+ local table_name=$1
139
+ local token=$2
140
+
141
+ curl -s -X DELETE "$TEST_API_BASE/database/tables/$table_name" \
142
+ -H "Authorization: Bearer $token" \
143
+ -H "Content-Type: application/json" > /dev/null 2>&1
144
+ }
145
+
146
+ # Function to cleanup all test data
147
+ cleanup_test_data() {
148
+ # Always attempt cleanup, even if some parts fail
149
+ print_info "🧹 Cleaning up test data..."
150
+
151
+ local cleanup_failed=0
152
+
153
+ # Try to get credentials - but continue cleanup even if they fail
154
+ local admin_token=$(get_admin_token 2>/dev/null || echo "")
155
+ local api_key=$(get_admin_api_key 2>/dev/null || echo "")
156
+
157
+ if [ -z "$admin_token" ]; then
158
+ print_info "No admin token available - some cleanup may be limited"
159
+ fi
160
+
161
+ if [ -z "$api_key" ]; then
162
+ print_info "No API key available - bucket cleanup may be limited"
163
+ fi
164
+
165
+ # 1. Delete all registered test tables
166
+ if [ ${#TEST_TABLES_CREATED[@]} -gt 0 ]; then
167
+ if [ -n "$admin_token" ]; then
168
+ print_info "Deleting test tables..."
169
+ for table in "${TEST_TABLES_CREATED[@]}"; do
170
+ print_info " - Deleting table: $table"
171
+ if ! delete_table "$table" "$admin_token"; then
172
+ echo " ✗ Failed to delete"
173
+ cleanup_failed=1
174
+ else
175
+ echo " ✓ Deleted"
176
+ fi
177
+ done
178
+ else
179
+ print_fail "Cannot delete tables without admin token"
180
+ print_info "Tables to delete manually:"
181
+ for table in "${TEST_TABLES_CREATED[@]}"; do
182
+ echo " - $table"
183
+ done
184
+ cleanup_failed=1
185
+ fi
186
+ fi
187
+
188
+ # 2. Delete all test users
189
+ if [ ${#TEST_USERS_CREATED[@]} -gt 0 ] && [ -n "$admin_token" ]; then
190
+ print_info "Deleting test users..."
191
+
192
+ # Get all users to find IDs of test users
193
+ local users_response=$(curl -s -X GET "$TEST_API_BASE/auth/users?limit=100" \
194
+ -H "Authorization: Bearer $admin_token" \
195
+ -H "Content-Type: application/json" 2>/dev/null || echo "")
196
+
197
+ if [ -n "$users_response" ] && echo "$users_response" | grep -q '"data"'; then
198
+ local user_ids=()
199
+
200
+ # Extract data array from response (new format uses "data" instead of "users")
201
+ local users_json=$(echo "$users_response" | grep -o '"data":\[[^]]*\]' | sed 's/"data"://')
202
+
203
+ # Find IDs of test users by email
204
+ for test_email in "${TEST_USERS_CREATED[@]}"; do
205
+ local user_id=$(echo "$users_json" | grep -B2 -A2 "\"email\":\"$test_email\"" | grep -o '"id":"[^"]*"' | head -1 | cut -d'"' -f4)
206
+ if [ -n "$user_id" ]; then
207
+ user_ids+=("$user_id")
208
+ print_info " - Found test user: $test_email (ID: $user_id)"
209
+ fi
210
+ done
211
+
212
+ # Bulk delete test users
213
+ if [ ${#user_ids[@]} -gt 0 ]; then
214
+ local delete_response=$(curl -s -X DELETE "$TEST_API_BASE/auth/users" \
215
+ -H "Authorization: Bearer $admin_token" \
216
+ -H "Content-Type: application/json" \
217
+ -d "{\"userIds\": [$(printf '"%s",' "${user_ids[@]}" | sed 's/,$//' )]}")
218
+
219
+ if ! echo "$delete_response" | grep -q '"error"'; then
220
+ print_success " Deleted ${#user_ids[@]} test users"
221
+ else
222
+ print_fail " Failed to delete test users"
223
+ echo " Response: $delete_response"
224
+ fi
225
+ fi
226
+ else
227
+ print_fail " Could not list users for cleanup"
228
+ fi
229
+ fi
230
+
231
+ # 3. Delete all test buckets
232
+ if [ ${#TEST_BUCKETS_CREATED[@]} -gt 0 ]; then
233
+ if [ -n "$api_key" ]; then
234
+ print_info "Deleting test buckets..."
235
+ for bucket in "${TEST_BUCKETS_CREATED[@]}"; do
236
+ print_info " - Deleting bucket: $bucket"
237
+ delete_response=$(curl -s -w "\n%{http_code}" -X DELETE "$TEST_API_BASE/storage/buckets/$bucket" \
238
+ -H "Authorization: Bearer $api_key" 2>/dev/null || echo "500")
239
+ status=$(echo "$delete_response" | tail -n 1)
240
+ if [ "$status" -ge 200 ] && [ "$status" -lt 300 ]; then
241
+ echo " ✓ Deleted"
242
+ else
243
+ echo " ✗ Failed (status: $status)"
244
+ cleanup_failed=1
245
+ fi
246
+ done
247
+ else
248
+ print_fail "Cannot delete buckets without API key"
249
+ print_info "Buckets to delete manually:"
250
+ for bucket in "${TEST_BUCKETS_CREATED[@]}"; do
251
+ echo " - $bucket"
252
+ done
253
+ cleanup_failed=1
254
+ fi
255
+ fi
256
+
257
+ if [ $cleanup_failed -eq 1 ]; then
258
+ print_fail "Cleanup completed with errors - some resources may need manual cleanup"
259
+ else
260
+ print_success "Cleanup completed successfully"
261
+ fi
262
+ }
263
+
264
+ # Test failure tracking
265
+ TEST_FAILED=0
266
+
267
+ # Function to track test failures
268
+ track_test_failure() {
269
+ TEST_FAILED=1
270
+ }
271
+
272
+ # Function to exit with proper code
273
+ exit_with_status() {
274
+ if [ $TEST_FAILED -eq 1 ]; then
275
+ exit 1
276
+ else
277
+ exit 0
278
+ fi
279
+ }
280
+
281
+ # Set error handling
282
+ set -E # Inherit ERR trap in functions
283
+
284
+ # Function to handle script termination
285
+ handle_exit() {
286
+ local exit_code=$?
287
+
288
+ # Run cleanup
289
+ cleanup_test_data
290
+
291
+ # Exit with the original exit code or our tracked failure status
292
+ if [ $TEST_FAILED -eq 1 ] || [ $exit_code -ne 0 ]; then
293
+ exit 1
294
+ else
295
+ exit 0
296
+ fi
297
+ }
298
+
299
+ # Trap to ensure cleanup runs on any exit condition
300
+ trap handle_exit EXIT
301
+ trap handle_exit ERR
302
+ trap handle_exit INT
303
+ trap handle_exit TERM
@@ -0,0 +1,23 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "ES2022",
5
+ "lib": ["ES2022"],
6
+ "outDir": "../dist",
7
+ "baseUrl": ".",
8
+ "paths": {
9
+ "@/*": ["./src/*"],
10
+ "@insforge/shared-schemas": ["../shared-schemas/src/index.ts"]
11
+ },
12
+ "strict": true,
13
+ "esModuleInterop": true,
14
+ "skipLibCheck": true,
15
+ "forceConsistentCasingInFileNames": true,
16
+ "moduleResolution": "node",
17
+ "resolveJsonModule": true,
18
+ "allowSyntheticDefaultImports": true,
19
+ "types": ["node"]
20
+ },
21
+ "include": ["src/**/*", "../shared-schemas/src/**/*"],
22
+ "exclude": ["node_modules", "dist"]
23
+ }
@@ -0,0 +1,18 @@
1
+ import { defineConfig } from 'tsup';
2
+
3
+ export default defineConfig({
4
+ entry: ['src/server.ts'],
5
+ format: ['esm'],
6
+ target: 'node20',
7
+ platform: 'node',
8
+ outDir: '../dist',
9
+ clean: false, // Don't clean the whole dist folder (frontend is there)
10
+ sourcemap: true,
11
+ // Don't bundle node_modules, only our code and shared-schemas
12
+ noExternal: [/@insforge\/shared-schemas/],
13
+ esbuildOptions(options) {
14
+ options.alias = {
15
+ '@': './src',
16
+ };
17
+ },
18
+ });
@@ -0,0 +1,22 @@
1
+ import { defineConfig } from 'vitest/config';
2
+
3
+ export default defineConfig({
4
+ test: {
5
+ environment: 'node',
6
+ globals: true,
7
+ setupFiles: ['./tests/setup.ts'],
8
+ coverage: {
9
+ provider: 'v8',
10
+ reporter: ['text', 'json', 'html'],
11
+ exclude: ['node_modules/', 'dist/', 'frontend/', 'tests/', '**/*.d.ts', '**/*.config.*'],
12
+ },
13
+ testTimeout: 10000,
14
+ // Run tests sequentially to avoid database conflicts
15
+ pool: 'forks',
16
+ poolOptions: {
17
+ forks: {
18
+ singleFork: true,
19
+ },
20
+ },
21
+ },
22
+ });
@@ -0,0 +1,145 @@
1
+ services:
2
+ postgres:
3
+ image: postgres:15.13
4
+ container_name: insforge-postgres
5
+ command: postgres -c config_file=/etc/postgresql/postgresql.conf
6
+ environment:
7
+ - POSTGRES_USER=${POSTGRES_USER:-postgres}
8
+ - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-postgres}
9
+ - POSTGRES_DB=${POSTGRES_DB:-insforge}
10
+ volumes:
11
+ - postgres-data:/var/lib/postgresql/data
12
+ - ./docker-init/db/db-init.sql:/docker-entrypoint-initdb.d/01-init.sql
13
+ - ./docker-init/db/jwt.sql:/docker-entrypoint-initdb.d/02-jwt.sql
14
+ - ./docker-init/db/logs.sql:/docker-entrypoint-initdb.d/03-logs.sql
15
+ - ./docker-init/db/postgresql.conf:/etc/postgresql/postgresql.conf
16
+ ports:
17
+ - "5432:5432"
18
+ networks:
19
+ - insforge-network
20
+ healthcheck:
21
+ test: ["CMD-SHELL", "pg_isready -U postgres"]
22
+ interval: 5s
23
+ timeout: 5s
24
+ retries: 5
25
+
26
+ postgrest:
27
+ image: postgrest/postgrest:v12.2.12
28
+ container_name: insforge-postgrest
29
+ restart: unless-stopped
30
+ environment:
31
+ #POSTGRES_USER: ${POSTGRES_USER:-postgres}
32
+ #POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres}
33
+ #POSTGRES_DB: ${POSTGRES_DB:-insforge}
34
+ PGRST_DB_URI: postgres://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@postgres:5432/${POSTGRES_DB:-insforge}
35
+ PGRST_OPENAPI_SERVER_PROXY_URI: http://localhost:3000
36
+ PGRST_DB_SCHEMA: public
37
+ PGRST_DB_ANON_ROLE: anon
38
+ PGRST_JWT_SECRET: ${JWT_SECRET}
39
+ ports:
40
+ - "5430:3000"
41
+ depends_on:
42
+ postgres:
43
+ condition: service_healthy
44
+ networks:
45
+ - insforge-network
46
+
47
+ insforge:
48
+ build:
49
+ context: .
50
+ dockerfile: Dockerfile
51
+ args:
52
+ VITE_API_BASE_URL: ${VITE_API_BASE_URL:-http://localhost:7130}
53
+ container_name: insforge
54
+ depends_on:
55
+ postgres:
56
+ condition: service_healthy
57
+ ports:
58
+ - "7130:7130"
59
+ - "7131:7131"
60
+ environment:
61
+ - PORT=7130
62
+ - PROJECT_ROOT=/app
63
+ - API_BASE_URL=${API_BASE_URL:-}
64
+ - JWT_SECRET=${JWT_SECRET:-dev-secret-change-in-production}
65
+ - ENCRYPTION_KEY=${ENCRYPTION_KEY:-}
66
+ - ADMIN_EMAIL=${ADMIN_EMAIL:-admin@example.com}
67
+ - ADMIN_PASSWORD=${ADMIN_PASSWORD:-change-this-password}
68
+ # PostgreSQL connection
69
+ - POSTGRES_HOST=postgres
70
+ - POSTGRES_PORT=5432
71
+ - POSTGRES_DB=${POSTGRES_DB:-insforge}
72
+ - POSTGRES_USER=${POSTGRES_USER:-postgres}
73
+ - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-postgres}
74
+ - DATABASE_URL=postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@postgres:5432/${POSTGRES_DB:-insforge}
75
+ - POSTGREST_BASE_URL=http://postgrest:3000
76
+ # Deno Runtime URL for serverless functions
77
+ - DENO_RUNTIME_URL=http://deno:7133
78
+ # Storage Configuration
79
+ - AWS_S3_BUCKET=${AWS_S3_BUCKET:-}
80
+ - AWS_REGION=${AWS_REGION:-}
81
+ # Multi-tenant Cloud Configuration
82
+ - DEPLOYMENT_ID=${DEPLOYMENT_ID:-}
83
+ - PROJECT_ID=${PROJECT_ID:-}
84
+ - APP_KEY=${APP_KEY:-}
85
+ - ACCESS_API_KEY=${ACCESS_API_KEY:-}
86
+ # LLM Model API keys
87
+ - OPENROUTER_API_KEY=${OPENROUTER_API_KEY:-}
88
+ # OAuth Configuration
89
+ - GOOGLE_CLIENT_ID=${GOOGLE_CLIENT_ID:-}
90
+ - GOOGLE_CLIENT_SECRET=${GOOGLE_CLIENT_SECRET:-}
91
+ - GITHUB_CLIENT_ID=${GITHUB_CLIENT_ID:-}
92
+ - GITHUB_CLIENT_SECRET=${GITHUB_CLIENT_SECRET:-}
93
+ restart: unless-stopped
94
+ networks:
95
+ - insforge-network
96
+
97
+ # Deno serverless runtime for edge functions
98
+ deno:
99
+ image: denoland/deno:alpine-2.0.6
100
+ container_name: insforge-deno
101
+ working_dir: /app
102
+ depends_on:
103
+ - postgres
104
+ - postgrest
105
+ ports:
106
+ - "7133:7133"
107
+ environment:
108
+ - PORT=7133
109
+ - DENO_ENV=${DENO_ENV:-production}
110
+ - DENO_DIR=/deno-dir
111
+ # PostgreSQL connection
112
+ - POSTGRES_HOST=postgres
113
+ - POSTGRES_PORT=5432
114
+ - POSTGRES_DB=${POSTGRES_DB:-insforge}
115
+ - POSTGRES_USER=${POSTGRES_USER:-postgres}
116
+ - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-postgres}
117
+ - POSTGREST_BASE_URL=http://postgrest:3000
118
+ # Worker timeout (30 seconds default)
119
+ - WORKER_TIMEOUT_MS=${WORKER_TIMEOUT_MS:-30000}
120
+ # Encryption keys for decrypting function secrets
121
+ - ENCRYPTION_KEY=${ENCRYPTION_KEY}
122
+ - JWT_SECRET=${JWT_SECRET}
123
+ volumes:
124
+ - ./functions:/app/functions
125
+ - deno_cache:/deno-dir
126
+ command: >
127
+ sh -c "
128
+ echo 'Downloading Deno dependencies...' &&
129
+ deno cache functions/server.ts &&
130
+ echo 'Starting Deno server on port 7133...' &&
131
+ deno run --allow-net --allow-env --allow-read=./functions/worker-template.js functions/server.ts
132
+ "
133
+ restart: unless-stopped
134
+ networks:
135
+ - insforge-network
136
+
137
+ volumes:
138
+ postgres-data:
139
+ driver: local
140
+ deno_cache:
141
+ driver: local
142
+
143
+ networks:
144
+ insforge-network:
145
+ driver: bridge
@@ -0,0 +1,167 @@
1
+ version: '3.8'
2
+
3
+ services:
4
+ postgres:
5
+ image: postgres:15.13
6
+ container_name: insforge-postgres
7
+ command: postgres -c config_file=/etc/postgresql/postgresql.conf
8
+ environment:
9
+ - POSTGRES_USER=${POSTGRES_USER:-postgres}
10
+ - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-postgres}
11
+ - POSTGRES_DB=${POSTGRES_DB:-insforge}
12
+ volumes:
13
+ - postgres-data:/var/lib/postgresql/data
14
+ - ./docker-init/db/db-init.sql:/docker-entrypoint-initdb.d/01-init.sql
15
+ - ./docker-init/db/jwt.sql:/docker-entrypoint-initdb.d/02-jwt.sql
16
+ - ./docker-init/db/logs.sql:/docker-entrypoint-initdb.d/03-logs.sql
17
+ - ./docker-init/db/postgresql.conf:/etc/postgresql/postgresql.conf
18
+ ports:
19
+ - "5432:5432"
20
+ networks:
21
+ - insforge-network
22
+ healthcheck:
23
+ test: ["CMD-SHELL", "pg_isready -U postgres"]
24
+ interval: 5s
25
+ timeout: 5s
26
+ retries: 5
27
+
28
+ postgrest:
29
+ image: postgrest/postgrest:v12.2.12
30
+ container_name: insforge-postgrest
31
+ restart: unless-stopped
32
+ environment:
33
+ # POSTGRES_USER: ${POSTGRES_USER:-postgres}
34
+ # POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres}
35
+ # POSTGRES_DB: ${POSTGRES_DB:-insforge}
36
+ PGRST_DB_URI: postgres://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@postgres:5432/${POSTGRES_DB:-insforge}
37
+ PGRST_OPENAPI_SERVER_PROXY_URI: http://localhost:3000
38
+ PGRST_DB_SCHEMA: public
39
+ PGRST_DB_ANON_ROLE: anon
40
+ PGRST_JWT_SECRET: ${JWT_SECRET}
41
+ # Enable schema reloading via NOTIFY
42
+ PGRST_DB_CHANNEL_ENABLED: true
43
+ PGRST_DB_CHANNEL: pgrst
44
+ ports:
45
+ - "5430:3000"
46
+ depends_on:
47
+ postgres:
48
+ condition: service_healthy
49
+ networks:
50
+ - insforge-network
51
+
52
+ insforge:
53
+ image: node:20-alpine
54
+ container_name: insforge
55
+ working_dir: /app
56
+ depends_on:
57
+ postgres:
58
+ condition: service_healthy
59
+ ports:
60
+ - "7130:7130"
61
+ - "7131:7131"
62
+ environment:
63
+ - PORT=7130
64
+ - PROJECT_ROOT=/app
65
+ - API_BASE_URL=${API_BASE_URL:-}
66
+ - VITE_API_BASE_URL=${VITE_API_BASE_URL:-}
67
+ - JWT_SECRET=${JWT_SECRET:-dev-secret-change-in-production}
68
+ - ENCRYPTION_KEY=${ENCRYPTION_KEY:-}
69
+ - ADMIN_EMAIL=${ADMIN_EMAIL:-admin@example.com}
70
+ - ADMIN_PASSWORD=${ADMIN_PASSWORD:-change-this-password}
71
+ # PostgreSQL connection
72
+ - POSTGRES_HOST=postgres
73
+ - POSTGRES_PORT=5432
74
+ - POSTGRES_DB=${POSTGRES_DB:-insforge}
75
+ - POSTGRES_USER=${POSTGRES_USER:-postgres}
76
+ - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-postgres}
77
+ - DATABASE_URL=postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@postgres:5432/${POSTGRES_DB:-insforge}
78
+ - POSTGREST_BASE_URL=http://postgrest:3000
79
+ # Deno Runtime URL for serverless functions
80
+ - DENO_RUNTIME_URL=http://deno:7133
81
+ # Storage Configuration
82
+ - AWS_S3_BUCKET=${AWS_S3_BUCKET:-}
83
+ - AWS_REGION=${AWS_REGION:-}
84
+ # Multi-tenant Cloud Configuration
85
+ - DEPLOYMENT_ID=${DEPLOYMENT_ID:-}
86
+ - PROJECT_ID=${PROJECT_ID:-}
87
+ - APP_KEY=${APP_KEY:-}
88
+ - ACCESS_API_KEY=${ACCESS_API_KEY:-}
89
+ # LLM Model API keys
90
+ - OPENROUTER_API_KEY=${OPENROUTER_API_KEY:-}
91
+ # OAuth Configuration
92
+ - GOOGLE_CLIENT_ID=${GOOGLE_CLIENT_ID:-}
93
+ - GOOGLE_CLIENT_SECRET=${GOOGLE_CLIENT_SECRET:-}
94
+ - GITHUB_CLIENT_ID=${GITHUB_CLIENT_ID:-}
95
+ - GITHUB_CLIENT_SECRET=${GITHUB_CLIENT_SECRET:-}
96
+ volumes:
97
+ - ./package.json:/app/package.json
98
+ - ./backend:/app/backend
99
+ - ./frontend:/app/frontend
100
+ - ./shared-schemas:/app/shared-schemas
101
+ - ./docs:/app/docs
102
+ - node_modules:/app/node_modules
103
+ - backend_node_modules:/app/backend/node_modules
104
+ - frontend_node_modules:/app/frontend/node_modules
105
+ - shared_schemas_node_modules:/app/shared-schemas/node_modules
106
+ command: sh -c "npm install && cd backend && npm run migrate:up && cd .. && npm run dev"
107
+ restart: unless-stopped
108
+ networks:
109
+ - insforge-network
110
+
111
+ # Deno serverless runtime for edge functions
112
+ deno:
113
+ image: denoland/deno:alpine-2.0.6
114
+ container_name: insforge-deno
115
+ working_dir: /app
116
+ depends_on:
117
+ - postgres
118
+ - postgrest
119
+ ports:
120
+ - "7133:7133"
121
+ environment:
122
+ - PORT=7133
123
+ - DENO_ENV=${DENO_ENV:-development}
124
+ - DENO_DIR=/deno-dir
125
+ # PostgreSQL connection
126
+ - POSTGRES_HOST=postgres
127
+ - POSTGRES_PORT=5432
128
+ - POSTGRES_DB=${POSTGRES_DB:-insforge}
129
+ - POSTGRES_USER=${POSTGRES_USER:-postgres}
130
+ - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-postgres}
131
+ - POSTGREST_BASE_URL=http://postgrest:3000
132
+ # Worker timeout (30 seconds default)
133
+ - WORKER_TIMEOUT_MS=${WORKER_TIMEOUT_MS:-30000}
134
+ # Encryption keys for decrypting function secrets
135
+ - ENCRYPTION_KEY=${ENCRYPTION_KEY}
136
+ - JWT_SECRET=${JWT_SECRET}
137
+ volumes:
138
+ - ./functions:/app/functions
139
+ - deno_cache:/deno-dir
140
+ command: >
141
+ sh -c "
142
+ echo 'Downloading Deno dependencies...' &&
143
+ deno cache functions/server.ts &&
144
+ echo 'Starting Deno server on port 7133...' &&
145
+ deno run --allow-net --allow-env --allow-read=./functions/worker-template.js --watch functions/server.ts
146
+ "
147
+ restart: unless-stopped
148
+ networks:
149
+ - insforge-network
150
+
151
+ volumes:
152
+ postgres-data:
153
+ driver: local
154
+ node_modules:
155
+ driver: local
156
+ backend_node_modules:
157
+ driver: local
158
+ frontend_node_modules:
159
+ driver: local
160
+ shared_schemas_node_modules:
161
+ driver: local
162
+ deno_cache:
163
+ driver: local
164
+
165
+ networks:
166
+ insforge-network:
167
+ driver: bridge