insforge 0.3.3 → 1.3.0
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.
- package/.claude-plugin/marketplace.json +20 -0
- package/.dockerignore +60 -57
- package/.env.example +84 -49
- package/.github/ISSUE_TEMPLATE/bug_report.yml +36 -83
- package/.github/ISSUE_TEMPLATE/config.yml +11 -11
- package/.github/ISSUE_TEMPLATE/feature_request.yml +26 -79
- package/.github/PULL_REQUEST_TEMPLATE.md +7 -0
- package/.github/copilot-instructions.md +146 -146
- package/.github/workflows/build-image.yml +66 -65
- package/.github/workflows/ci-premerge-check.yml +23 -23
- package/.github/workflows/e2e.yml +63 -0
- package/.github/workflows/lint-and-format.yml +32 -32
- package/.prettierignore +64 -64
- package/CHANGELOG.md +44 -3
- package/CLAUDE_PLUGIN.md +104 -0
- package/CODE_OF_CONDUCT.md +128 -0
- package/CONTRIBUTING.md +125 -125
- package/Dockerfile +30 -27
- package/GITHUB_OAUTH_SETUP.md +49 -49
- package/GOOGLE_OAUTH_SETUP.md +148 -148
- package/LICENSE +201 -201
- package/README.md +182 -134
- package/assets/Dark.svg +23 -23
- package/assets/mcpInstallv2.png +0 -0
- package/assets/sampleResponse.png +0 -0
- package/auth/index.html +13 -0
- package/auth/package.json +28 -0
- package/auth/public/favicon.ico +0 -0
- package/auth/src/App.tsx +33 -0
- package/auth/src/components/ErrorCard.tsx +37 -0
- package/auth/src/components/Layout.tsx +13 -0
- package/auth/src/index.css +19 -0
- package/auth/src/lib/broadcastService.ts +117 -0
- package/auth/src/lib/utils.ts +11 -0
- package/auth/src/main.tsx +22 -0
- package/auth/src/pages/ForgotPasswordPage.tsx +11 -0
- package/auth/src/pages/ResetPasswordPage.tsx +11 -0
- package/auth/src/pages/SignInPage.tsx +60 -0
- package/auth/src/pages/SignUpPage.tsx +60 -0
- package/auth/src/pages/VerifyEmailPage.tsx +20 -0
- package/auth/src/vite-env.d.ts +10 -0
- package/auth/tsconfig.json +32 -0
- package/auth/tsconfig.node.json +11 -0
- package/auth/vite.config.ts +25 -0
- package/backend/package.json +78 -75
- package/backend/src/api/{middleware → middlewares}/auth.ts +8 -9
- package/backend/src/api/middlewares/rate-limiters.ts +127 -0
- package/backend/src/api/routes/{ai.ts → ai/index.routes.ts} +22 -26
- package/backend/src/api/routes/auth/index.routes.ts +667 -0
- package/backend/src/api/routes/auth/oauth.routes.ts +473 -0
- package/backend/src/api/routes/{database.advance.ts → database/advance.routes.ts} +128 -65
- package/backend/src/api/routes/database/index.routes.ts +90 -0
- package/backend/src/api/routes/{database.records.ts → database/records.routes.ts} +26 -12
- package/backend/src/api/routes/{database.tables.ts → database/tables.routes.ts} +6 -23
- package/backend/src/api/routes/docs/index.routes.ts +75 -0
- package/backend/src/api/routes/email/index.routes.ts +35 -0
- package/backend/src/api/routes/functions/index.routes.ts +194 -0
- package/backend/src/api/routes/{logs.ts → logs/index.routes.ts} +25 -30
- package/backend/src/api/routes/{metadata.ts → metadata/index.routes.ts} +33 -31
- package/backend/src/api/routes/realtime/channels.routes.ts +81 -0
- package/backend/src/api/routes/realtime/index.routes.ts +12 -0
- package/backend/src/api/routes/realtime/messages.routes.ts +48 -0
- package/backend/src/api/routes/realtime/permissions.routes.ts +19 -0
- package/backend/src/api/routes/{secrets.ts → secrets/index.routes.ts} +27 -22
- package/backend/src/api/routes/{storage.ts → storage/index.routes.ts} +48 -61
- package/backend/src/api/routes/usage/index.routes.ts +91 -0
- package/backend/src/infra/config/app.config.ts +51 -0
- package/backend/src/infra/database/database.manager.ts +182 -0
- package/backend/{migrations → src/infra/database/migrations}/000_create-base-tables.sql +141 -141
- package/backend/{migrations → src/infra/database/migrations}/001_create-helper-functions.sql +40 -40
- package/backend/{migrations → src/infra/database/migrations}/002_rename-auth-tables.sql +29 -29
- package/backend/{migrations → src/infra/database/migrations}/003_create-users-table.sql +55 -55
- package/backend/{migrations → src/infra/database/migrations}/004_add-reload-postgrest-func.sql +23 -23
- package/backend/{migrations → src/infra/database/migrations}/005_enable-project-admin-modify-users.sql +29 -29
- package/backend/{migrations → src/infra/database/migrations}/006_modify-ai-usage-table.sql +24 -24
- package/backend/{migrations → src/infra/database/migrations}/007_drop-metadata-table.sql +1 -1
- package/backend/{migrations → src/infra/database/migrations}/008_add-system-tables.sql +76 -76
- package/backend/{migrations → src/infra/database/migrations}/009_add-function-secrets.sql +23 -23
- package/backend/{migrations → src/infra/database/migrations}/010_modify-ai-config-modalities.sql +93 -93
- package/backend/{migrations → src/infra/database/migrations}/011_refactor-secrets-table.sql +15 -15
- package/backend/{migrations → src/infra/database/migrations}/012_add-storage-uploaded-by.sql +7 -7
- package/backend/src/infra/database/migrations/013_create-auth-schema-functions.sql +44 -0
- package/backend/src/infra/database/migrations/014_add-updated-at-trigger-user-table.sql +8 -0
- package/backend/src/infra/database/migrations/015_create-auth-config-and-email-otp-tables.sql +60 -0
- package/backend/src/infra/database/migrations/016_update-auth-config-and-email-otp.sql +24 -0
- package/backend/src/infra/database/migrations/017_create-realtime-schema.sql +233 -0
- package/backend/src/infra/realtime/realtime.manager.ts +246 -0
- package/backend/src/infra/realtime/webhook-sender.ts +82 -0
- package/backend/src/{core/secrets/encryption.ts → infra/security/encryption.manager.ts} +3 -2
- package/backend/src/infra/security/token.manager.ts +219 -0
- package/backend/src/infra/socket/socket.manager.ts +522 -0
- package/backend/src/providers/ai/openrouter.provider.ts +380 -0
- package/backend/src/providers/email/base.provider.ts +38 -0
- package/backend/src/providers/email/cloud.provider.ts +271 -0
- package/backend/src/{core/logs/providers → providers/logs}/base.provider.ts +11 -11
- package/backend/src/{core/logs/providers → providers/logs}/cloudwatch.provider.ts +61 -38
- package/backend/src/providers/logs/local.provider.ts +185 -0
- package/backend/src/providers/oauth/apple.provider.ts +266 -0
- package/backend/src/providers/oauth/base.provider.ts +29 -0
- package/backend/src/providers/oauth/discord.provider.ts +195 -0
- package/backend/src/providers/oauth/facebook.provider.ts +194 -0
- package/backend/src/providers/oauth/github.provider.ts +208 -0
- package/backend/src/providers/oauth/google.provider.ts +249 -0
- package/backend/src/providers/oauth/index.ts +8 -0
- package/backend/src/providers/oauth/linkedin.provider.ts +240 -0
- package/backend/src/providers/oauth/microsoft.provider.ts +169 -0
- package/backend/src/providers/oauth/x.provider.ts +202 -0
- package/backend/src/providers/storage/base.provider.ts +29 -0
- package/backend/src/providers/storage/local.provider.ts +103 -0
- package/backend/src/providers/storage/s3.provider.ts +313 -0
- package/backend/src/server.ts +317 -288
- package/backend/src/{core/ai/config.ts → services/ai/ai-config.service.ts} +19 -24
- package/backend/src/services/ai/ai-model.service.ts +60 -0
- package/backend/src/{core/ai/usage.ts → services/ai/ai-usage.service.ts} +28 -35
- package/backend/src/{core/ai/chat.ts → services/ai/chat-completion.service.ts} +37 -24
- package/backend/src/services/ai/helpers.ts +64 -0
- package/backend/src/{core/ai/image.ts → services/ai/image-generation.service.ts} +17 -19
- package/backend/src/services/ai/index.ts +13 -0
- package/backend/src/services/auth/auth-config.service.ts +250 -0
- package/backend/src/services/auth/auth-otp.service.ts +424 -0
- package/backend/src/services/auth/auth.service.ts +1150 -0
- package/backend/src/services/auth/index.ts +4 -0
- package/backend/src/{core/auth/oauth.ts → services/auth/oauth-config.service.ts} +106 -52
- package/backend/src/{core/database/advance.ts → services/database/database-advance.service.ts} +97 -131
- package/backend/src/services/database/database-table.service.ts +802 -0
- package/backend/src/services/database/database.service.ts +127 -0
- package/backend/src/services/email/email.service.ts +73 -0
- package/backend/src/{core/functions/functions.ts → services/functions/function.service.ts} +95 -88
- package/backend/src/{core/logs/audit.ts → services/logs/audit.service.ts} +92 -75
- package/backend/src/services/logs/log.service.ts +73 -0
- package/backend/src/services/realtime/index.ts +3 -0
- package/backend/src/services/realtime/realtime-auth.service.ts +104 -0
- package/backend/src/services/realtime/realtime-channel.service.ts +237 -0
- package/backend/src/services/realtime/realtime-message.service.ts +260 -0
- package/backend/src/{core/secrets/secrets.ts → services/secrets/secret.service.ts} +48 -66
- package/backend/src/services/storage/storage.service.ts +617 -0
- package/backend/src/services/usage/usage.service.ts +149 -0
- package/backend/src/types/auth.ts +77 -2
- package/backend/src/types/email.ts +8 -0
- package/backend/src/types/error-constants.ts +4 -0
- package/backend/src/types/logs.ts +0 -29
- package/backend/src/types/realtime.ts +18 -0
- package/backend/src/{core/socket/types.ts → types/socket.ts} +11 -36
- package/backend/src/utils/cookies.ts +35 -0
- package/backend/src/utils/environment.ts +9 -3
- package/backend/src/utils/logger.ts +20 -2
- package/backend/src/utils/s3-config-loader.ts +64 -0
- package/backend/src/utils/seed.ts +301 -205
- package/backend/src/utils/sql-parser.ts +91 -1
- package/backend/src/utils/utils.ts +114 -0
- package/backend/src/utils/validations.ts +40 -4
- package/backend/tests/README.md +133 -133
- package/backend/tests/cleanup-all-test-data.sh +230 -230
- package/backend/tests/cloud/test-s3-multitenant.sh +131 -131
- package/backend/tests/local/comprehensive-curl-tests.sh +155 -155
- package/backend/tests/local/test-ai-config.sh +129 -0
- package/backend/tests/local/test-ai-usage.sh +80 -0
- package/backend/tests/local/test-auth-router.sh +143 -143
- package/backend/tests/local/test-database-router.sh +222 -222
- package/backend/tests/local/test-e2e.sh +240 -240
- package/backend/tests/local/test-fk-errors.sh +96 -96
- package/backend/tests/local/test-functions.sh +123 -0
- package/backend/tests/local/test-id-field.sh +200 -200
- package/backend/tests/local/test-logs.sh +132 -0
- package/backend/tests/local/test-public-bucket.sh +264 -264
- package/backend/tests/local/test-secrets.sh +249 -247
- package/backend/tests/local/test-serverless-functions.sh.disabled +325 -325
- package/backend/tests/local/test-traditional-rest.sh +208 -208
- package/backend/tests/manual/README.md +50 -50
- package/backend/tests/manual/create-large-table-simple.sql +10 -10
- package/backend/tests/manual/seed-large-table.sql +100 -100
- package/backend/tests/manual/setup-large-table-extras.sql +33 -33
- package/backend/tests/manual/test-bulk-upsert.sh +409 -409
- package/backend/tests/manual/test-database-advance.sh +296 -296
- package/backend/tests/manual/test-postgrest-stability.sh +191 -191
- package/backend/tests/manual/test-rawsql-export-import.sh +411 -411
- package/backend/tests/manual/test-rawsql-modes.sh +244 -0
- package/backend/tests/manual/test-universal-storage.sh +263 -263
- package/backend/tests/manual/test-users.sql +17 -17
- package/backend/tests/run-all-tests.sh +139 -139
- package/backend/tests/setup.ts +0 -0
- package/backend/tests/test-config.sh +338 -302
- package/backend/tests/unit/analyze-query.test.ts +697 -0
- package/backend/tests/unit/cloud-token.test.ts +48 -0
- package/backend/tests/unit/constant.test.ts +8 -0
- package/backend/tests/unit/email.test.ts +372 -0
- package/backend/tests/unit/environment.test.ts +59 -0
- package/backend/tests/unit/helpers.test.ts +63 -0
- package/backend/tests/unit/logger.test.ts +22 -0
- package/backend/tests/unit/rate-limit.test.ts +154 -0
- package/backend/tests/unit/response.test.ts +58 -0
- package/backend/tests/unit/sql-parser.test.ts +74 -0
- package/backend/tests/unit/uuid.test.ts +21 -0
- package/backend/tests/unit/validations.test.ts +80 -0
- package/backend/tsconfig.json +22 -22
- package/backend/vitest.config.ts +11 -0
- package/claude-plugin/.claude-plugin/plugin.json +24 -0
- package/claude-plugin/README.md +133 -0
- package/claude-plugin/skills/insforge-schema-patterns/SKILL.md +270 -0
- package/docker-compose.prod.yml +204 -144
- package/docker-compose.yml +232 -167
- package/docker-init/db/db-init.sql +97 -125
- package/docker-init/db/jwt.sql +5 -5
- package/docker-init/db/postgresql.conf +16 -16
- package/docker-init/logs/vector.yml +236 -0
- package/docs/README.md +44 -0
- package/docs/agent-docs/real-time.md +269 -0
- package/docs/changelog.mdx +119 -0
- package/docs/core-concepts/ai/architecture.mdx +373 -0
- package/docs/core-concepts/ai/sdk.mdx +213 -0
- package/docs/core-concepts/authentication/architecture.mdx +278 -0
- package/docs/core-concepts/authentication/sdk.mdx +414 -0
- package/docs/core-concepts/authentication/ui-components/customization.mdx +529 -0
- package/docs/core-concepts/authentication/ui-components/nextjs.mdx +221 -0
- package/docs/core-concepts/authentication/ui-components/react-router.mdx +184 -0
- package/docs/core-concepts/authentication/ui-components/react.mdx +129 -0
- package/docs/core-concepts/database/architecture.mdx +256 -0
- package/docs/core-concepts/database/sdk.mdx +382 -0
- package/docs/core-concepts/email/architecture.mdx +101 -0
- package/docs/core-concepts/email/sdk.mdx +53 -0
- package/docs/core-concepts/functions/architecture.mdx +105 -0
- package/docs/core-concepts/functions/sdk.mdx +184 -0
- package/docs/core-concepts/realtime/architecture.mdx +446 -0
- package/docs/core-concepts/realtime/sdk.mdx +409 -0
- package/docs/core-concepts/storage/architecture.mdx +243 -0
- package/docs/core-concepts/storage/sdk.mdx +253 -0
- package/docs/deployment/README.md +94 -0
- package/docs/deployment/deploy-to-aws-ec2.md +565 -0
- package/docs/deployment/deploy-to-azure-virtual-machines.md +313 -0
- package/docs/deployment/deploy-to-google-cloud-compute-engine.md +613 -0
- package/docs/deployment/deploy-to-render.md +441 -0
- package/docs/deprecated/insforge-auth-api.md +214 -214
- package/docs/deprecated/insforge-auth-sdk.md +99 -99
- package/docs/deprecated/insforge-db-api.md +358 -358
- package/docs/deprecated/insforge-db-sdk.md +139 -139
- package/docs/deprecated/insforge-debug-sdk.md +156 -156
- package/docs/deprecated/insforge-debug.md +64 -64
- package/docs/deprecated/insforge-instructions.md +123 -123
- package/docs/deprecated/insforge-project.md +117 -117
- package/docs/deprecated/insforge-storage-api.md +278 -278
- package/docs/deprecated/insforge-storage-sdk.md +158 -158
- package/docs/docs.json +232 -0
- package/docs/examples/framework-guides/nextjs.mdx +131 -0
- package/docs/examples/framework-guides/nuxt.mdx +165 -0
- package/docs/examples/framework-guides/react.mdx +165 -0
- package/docs/examples/framework-guides/svelte.mdx +153 -0
- package/docs/examples/framework-guides/vue.mdx +159 -0
- package/docs/examples/overview.mdx +67 -0
- package/docs/favicon.svg +19 -0
- package/docs/images/changelog/dec-2025/ai-integration.png +0 -0
- package/docs/images/changelog/dec-2025/ai-models.webp +0 -0
- package/docs/images/changelog/dec-2025/alipay-payment.webp +0 -0
- package/docs/images/changelog/dec-2025/apple-login.jpg +0 -0
- package/docs/images/changelog/dec-2025/mcp-installer.png +0 -0
- package/docs/images/changelog/dec-2025/realtime-module.jpg +0 -0
- package/docs/images/changelog/nov-2025/auth-components.webp +0 -0
- package/docs/images/changelog/nov-2025/database-metadata.webp +0 -0
- package/docs/images/changelog/nov-2025/quickstart-prompts.webp +0 -0
- package/docs/images/changelog/nov-2025/sql-editor.webp +0 -0
- package/docs/images/changelog/nov-2025/usage-page.webp +0 -0
- package/docs/images/changelog/october-2025/csv-upload.webp +0 -0
- package/docs/images/changelog/october-2025/logs-feature.webp +0 -0
- package/docs/images/changelog/october-2025/oauth-providers.webp +0 -0
- package/docs/images/checks-passed.png +0 -0
- package/docs/images/dashboard-connect-expanded.png +0 -0
- package/docs/images/dashboard-connect.png +0 -0
- package/docs/images/hero-dark.png +0 -0
- package/docs/images/hero-light.png +0 -0
- package/docs/images/icons/ai.svg +4 -0
- package/docs/images/icons/auth.svg +1 -0
- package/docs/images/icons/database.svg +1 -0
- package/docs/images/icons/function.svg +1 -0
- package/docs/images/icons/storage.svg +1 -0
- package/docs/images/logos/nextjs.svg +4 -0
- package/docs/images/logos/nuxt.svg +4 -0
- package/docs/images/logos/react.svg +5 -0
- package/docs/images/logos/svelte.svg +4 -0
- package/docs/images/logos/vue.svg +5 -0
- package/docs/images/mcp-install.png +0 -0
- package/docs/images/onboarding-mcp.png +0 -0
- package/docs/insforge-instructions-sdk.md +89 -407
- package/docs/introduction.mdx +45 -0
- package/docs/logo/dark.svg +22 -0
- package/docs/logo/light.svg +20 -0
- package/docs/partnership.mdx +652 -0
- package/docs/quickstart.mdx +83 -0
- package/docs/showcase/2048-arena.png +0 -0
- package/docs/showcase/framegen-cloud.png +0 -0
- package/docs/showcase/line-connect-race.png +0 -0
- package/docs/showcase/moment-vibe.png +0 -0
- package/docs/showcase/national-flags.png +0 -0
- package/docs/showcase/pokemon-vibe.png +0 -0
- package/docs/showcase/pure-browse-buy.png +0 -0
- package/docs/showcase.mdx +52 -0
- package/docs/snippets/sdk-installation.mdx +22 -0
- package/docs/snippets/service-icons.mdx +27 -0
- package/eslint.config.js +10 -3
- package/examples/oauth/frontend-oauth-example.html +250 -250
- package/examples/response-examples.md +443 -443
- package/frontend/components.json +17 -17
- package/frontend/package.json +69 -63
- package/frontend/src/App.tsx +13 -82
- package/frontend/src/assets/icons/checkbox_checked.svg +6 -6
- package/frontend/src/assets/icons/checkbox_undetermined.svg +6 -6
- package/frontend/src/assets/icons/checked.svg +3 -3
- package/frontend/src/assets/icons/connected.svg +3 -0
- package/frontend/src/assets/icons/error.svg +3 -3
- package/frontend/src/assets/icons/loader.svg +9 -0
- package/frontend/src/assets/icons/pencil.svg +4 -4
- package/frontend/src/assets/icons/refresh.svg +4 -4
- package/frontend/src/assets/icons/step_active.svg +3 -3
- package/frontend/src/assets/icons/step_inactive.svg +11 -11
- package/frontend/src/assets/icons/warning.svg +3 -3
- package/frontend/src/assets/logos/apple.svg +4 -0
- package/frontend/src/assets/logos/claude_code.svg +3 -3
- package/frontend/src/assets/logos/cline.svg +6 -6
- package/frontend/src/assets/logos/cursor.svg +20 -20
- package/frontend/src/assets/logos/discord.svg +8 -8
- package/frontend/src/assets/logos/facebook.svg +3 -0
- package/frontend/src/assets/logos/gemini.svg +19 -19
- package/frontend/src/assets/logos/github.svg +5 -5
- package/frontend/src/assets/logos/google.svg +13 -13
- package/frontend/src/assets/logos/grok.svg +10 -10
- package/frontend/src/assets/logos/insforge_dark.svg +15 -15
- package/frontend/src/assets/logos/insforge_light.svg +15 -15
- package/frontend/src/assets/logos/instagram.svg +2 -0
- package/frontend/src/assets/logos/linkedin.svg +3 -0
- package/frontend/src/assets/logos/microsoft.svg +1 -0
- package/frontend/src/assets/logos/openai.svg +10 -10
- package/frontend/src/assets/logos/roo_code.svg +9 -9
- package/frontend/src/assets/logos/spotify.svg +17 -0
- package/frontend/src/assets/logos/tiktok.svg +6 -0
- package/frontend/src/assets/logos/trae.svg +3 -3
- package/frontend/src/assets/logos/windsurf.svg +10 -10
- package/frontend/src/assets/logos/x.svg +3 -0
- package/frontend/src/components/Checkbox.tsx +27 -29
- package/frontend/src/components/CodeBlock.tsx +55 -2
- package/frontend/src/components/CodeEditor.tsx +92 -0
- package/frontend/src/components/ConfirmDialog.tsx +1 -1
- package/frontend/src/components/ConnectCTA.tsx +38 -0
- package/frontend/src/components/CopyButton.tsx +52 -15
- package/frontend/src/components/ErrorState.tsx +1 -2
- package/frontend/src/components/FeatureSidebar.tsx +6 -6
- package/frontend/src/components/FeatureSidebarItem.tsx +2 -2
- package/frontend/src/components/JsonHighlight.tsx +21 -9
- package/frontend/src/components/ProjectInfoModal.tsx +128 -0
- package/frontend/src/components/PromptDialog.tsx +1 -4
- package/frontend/src/components/SearchInput.tsx +1 -2
- package/frontend/src/components/Stepper.tsx +53 -0
- package/frontend/src/components/ThemeToggle.tsx +3 -3
- package/frontend/src/components/datagrid/DataGrid.tsx +25 -32
- package/frontend/src/components/datagrid/cell-editors/DateCellEditor.tsx +1 -2
- package/frontend/src/components/datagrid/cell-editors/JsonCellEditor.tsx +2 -4
- package/frontend/src/components/datagrid/index.ts +23 -0
- package/frontend/src/components/index.ts +23 -30
- package/frontend/src/components/layout/AppHeader.tsx +131 -91
- package/frontend/src/components/layout/AppSidebar.tsx +80 -170
- package/frontend/src/components/layout/Layout.tsx +12 -23
- package/frontend/src/components/layout/PrimaryMenu.tsx +187 -0
- package/frontend/src/components/layout/SecondaryMenu.tsx +70 -0
- package/frontend/src/components/layout/index.ts +5 -0
- package/frontend/src/components/radix/Tooltip.tsx +24 -13
- package/frontend/src/components/radix/index.ts +22 -0
- package/frontend/src/features/ai/components/AIConfigCard.tsx +129 -83
- package/frontend/src/features/ai/components/AIEmptyState.tsx +12 -7
- package/frontend/src/features/ai/components/ModalityFilterSidebar.tsx +101 -0
- package/frontend/src/features/ai/components/ModelSelectionDialog.tsx +135 -0
- package/frontend/src/features/ai/components/ModelSelectionGrid.tsx +51 -0
- package/frontend/src/features/ai/components/SystemPromptDialog.tsx +118 -0
- package/frontend/src/features/ai/components/index.ts +6 -0
- package/frontend/src/features/ai/helpers.ts +57 -71
- package/frontend/src/features/ai/hooks/useAIConfigs.ts +39 -113
- package/frontend/src/features/ai/hooks/useAIUsage.ts +0 -2
- package/frontend/src/features/ai/pages/AIPage.tsx +166 -0
- package/frontend/src/features/ai/services/ai.service.ts +5 -5
- package/frontend/src/features/auth/components/AuthPreview.tsx +96 -0
- package/frontend/src/features/auth/components/OAuthConfigDialog.tsx +54 -30
- package/frontend/src/features/auth/components/UserFormDialog.tsx +13 -6
- package/frontend/src/features/auth/components/UsersDataGrid.tsx +50 -14
- package/frontend/src/features/auth/components/index.ts +5 -0
- package/frontend/src/features/auth/helpers.tsx +208 -0
- package/frontend/src/features/auth/hooks/useAnonToken.ts +30 -0
- package/frontend/src/features/auth/hooks/useAuthConfig.ts +48 -0
- package/frontend/src/features/auth/hooks/useOAuthConfig.ts +14 -10
- package/frontend/src/features/auth/hooks/useUsers.ts +43 -5
- package/frontend/src/features/auth/index.ts +3 -2
- package/frontend/src/features/auth/pages/AuthMethodsPage.tsx +275 -0
- package/frontend/src/features/auth/pages/ConfigurationPage.tsx +395 -0
- package/frontend/src/features/auth/pages/UsersPage.tsx +257 -0
- package/frontend/src/features/auth/services/anonToken.service.ts +11 -0
- package/frontend/src/features/auth/services/config.service.ts +19 -0
- package/frontend/src/features/auth/services/{oauth.service.ts → oauth-config.service.ts} +4 -4
- package/frontend/src/features/auth/services/{auth.service.ts → user.service.ts} +7 -53
- package/frontend/src/features/dashboard/components/ConnectionSuccessBanner.tsx +35 -0
- package/frontend/src/features/dashboard/components/PromptCard.tsx +21 -0
- package/frontend/src/features/dashboard/components/PromptDialog.tsx +103 -0
- package/frontend/src/features/dashboard/components/StatsCard.tsx +50 -0
- package/frontend/src/features/dashboard/components/index.ts +4 -0
- package/frontend/src/features/dashboard/pages/DashboardPage.tsx +212 -0
- package/frontend/src/features/dashboard/prompts/ai-chatbot.ts +13 -0
- package/frontend/src/features/dashboard/prompts/crm-system.ts +13 -0
- package/frontend/src/features/dashboard/prompts/ecommerce-platform.ts +12 -0
- package/frontend/src/features/dashboard/prompts/index.ts +31 -0
- package/frontend/src/features/dashboard/prompts/instagram-clone.ts +11 -0
- package/frontend/src/features/dashboard/prompts/notion-clone.ts +14 -0
- package/frontend/src/features/dashboard/prompts/reddit-clone.ts +12 -0
- package/frontend/src/features/database/components/DatabaseDataGrid.tsx +48 -17
- package/frontend/src/features/database/components/ForeignKeyCell.tsx +15 -34
- package/frontend/src/features/database/components/ForeignKeyPopover.tsx +19 -20
- package/frontend/src/features/database/components/LinkRecordModal.tsx +120 -125
- package/frontend/src/features/database/components/RecordFormDialog.tsx +22 -33
- package/frontend/src/features/database/components/RecordFormField.tsx +45 -47
- package/frontend/src/features/database/components/SQLModal.tsx +75 -0
- package/frontend/src/features/database/components/TableEmptyState.tsx +6 -5
- package/frontend/src/features/database/components/TableForm.tsx +28 -19
- package/frontend/src/features/database/components/TableFormColumn.tsx +2 -3
- package/frontend/src/features/database/components/TableSidebar.tsx +1 -1
- package/frontend/src/features/database/components/TablesEmptyState.tsx +48 -0
- package/frontend/src/features/database/components/TemplateCard.tsx +37 -0
- package/frontend/src/features/database/components/TemplatePreview.tsx +92 -0
- package/frontend/src/features/database/components/index.ts +19 -0
- package/frontend/src/features/database/constants.ts +28 -2
- package/frontend/src/features/database/contexts/SQLEditorContext.tsx +188 -0
- package/frontend/src/features/database/helpers.ts +2 -2
- package/frontend/src/features/database/hooks/useCSVImport.ts +29 -0
- package/frontend/src/features/database/hooks/useDatabase.ts +66 -0
- package/frontend/src/features/database/hooks/useRawSQL.ts +55 -0
- package/frontend/src/features/database/hooks/useRecords.ts +139 -0
- package/frontend/src/features/database/hooks/useTables.ts +135 -0
- package/frontend/src/features/database/index.ts +7 -1
- package/frontend/src/features/database/pages/FunctionsPage.tsx +203 -0
- package/frontend/src/features/database/pages/IndexesPage.tsx +228 -0
- package/frontend/src/features/database/pages/PoliciesPage.tsx +237 -0
- package/frontend/src/features/database/pages/SQLEditorPage.tsx +382 -0
- package/frontend/src/features/database/{page/DatabasePage.tsx → pages/TablesPage.tsx} +168 -209
- package/frontend/src/features/database/pages/TemplatesPage.tsx +39 -0
- package/frontend/src/features/database/pages/TriggersPage.tsx +230 -0
- package/frontend/src/features/database/services/advance.service.ts +40 -0
- package/frontend/src/features/database/services/database.service.ts +33 -194
- package/frontend/src/features/database/services/record.service.ts +219 -0
- package/frontend/src/features/database/services/table.service.ts +58 -0
- package/frontend/src/features/database/templates/ai-chatbot.ts +402 -0
- package/frontend/src/features/database/templates/crm-system.ts +528 -0
- package/frontend/src/features/database/templates/ecommerce-platform.ts +553 -0
- package/frontend/src/features/database/templates/index.ts +34 -0
- package/frontend/src/features/database/templates/instagram-clone.ts +222 -0
- package/frontend/src/features/database/templates/notion-clone.ts +483 -0
- package/frontend/src/features/database/templates/reddit-clone.ts +526 -0
- package/frontend/src/features/functions/components/FunctionRow.tsx +2 -1
- package/frontend/src/features/functions/components/FunctionsSidebar.tsx +1 -1
- package/frontend/src/features/functions/components/SecretRow.tsx +1 -1
- package/frontend/src/features/functions/components/index.ts +5 -0
- package/frontend/src/features/functions/hooks/useFunctions.ts +4 -4
- package/frontend/src/features/{secrets → functions}/hooks/useSecrets.ts +5 -5
- package/frontend/src/features/functions/pages/FunctionsPage.tsx +148 -0
- package/frontend/src/features/functions/{components/SecretsContent.tsx → pages/SecretsPage.tsx} +19 -21
- package/frontend/src/features/functions/services/{functions.service.ts → function.service.ts} +2 -2
- package/frontend/src/features/{secrets/services/secrets.service.ts → functions/services/secret.service.ts} +2 -2
- package/frontend/src/features/login/hooks/usePartnerOrigin.ts +27 -0
- package/frontend/src/features/login/pages/CloudLoginPage.tsx +118 -0
- package/frontend/src/features/login/{page → pages}/LoginPage.tsx +16 -23
- package/frontend/src/features/login/services/partnership.service.ts +65 -0
- package/frontend/src/features/logs/components/LogsDataGrid.tsx +89 -0
- package/frontend/src/features/logs/components/SeverityBadge.tsx +18 -0
- package/frontend/src/features/logs/components/index.ts +2 -0
- package/frontend/src/features/logs/helpers.ts +24 -0
- package/frontend/src/features/logs/hooks/useAuditLogs.ts +4 -4
- package/frontend/src/features/logs/hooks/useLogSources.ts +137 -0
- package/frontend/src/features/logs/hooks/useLogs.ts +163 -0
- package/frontend/src/features/logs/hooks/useMcpUsage.ts +128 -0
- package/frontend/src/features/logs/index.ts +8 -2
- package/frontend/src/features/logs/{page → pages}/AuditsPage.tsx +91 -38
- package/frontend/src/features/logs/pages/LogsPage.tsx +152 -0
- package/frontend/src/features/logs/pages/MCPLogsPage.tsx +84 -0
- package/frontend/src/features/logs/services/audit.service.ts +63 -0
- package/frontend/src/features/logs/services/log.service.ts +15 -110
- package/frontend/src/features/logs/services/usage.service.ts +31 -0
- package/frontend/src/features/onboard/components/McpConnectionStatus.tsx +68 -0
- package/frontend/src/features/onboard/components/OnboardingModal.tsx +267 -0
- package/frontend/src/features/onboard/components/VideoDemoModal.tsx +38 -0
- package/frontend/src/features/onboard/components/index.ts +4 -0
- package/frontend/src/features/onboard/components/mcp/CursorDeeplinkGenerator.tsx +2 -2
- package/frontend/src/features/onboard/components/mcp/{mcp-helper.tsx → helpers.tsx} +8 -8
- package/frontend/src/features/onboard/components/mcp/index.ts +2 -3
- package/frontend/src/features/onboard/index.ts +13 -3
- package/frontend/src/features/realtime/components/ChannelRow.tsx +83 -0
- package/frontend/src/features/realtime/components/EditChannelModal.tsx +246 -0
- package/frontend/src/features/realtime/components/MessageRow.tsx +85 -0
- package/frontend/src/features/realtime/components/RealtimeEmptyState.tsx +30 -0
- package/frontend/src/features/realtime/hooks/useRealtime.ts +218 -0
- package/frontend/src/features/realtime/index.ts +11 -0
- package/frontend/src/features/realtime/pages/RealtimeChannelsPage.tsx +172 -0
- package/frontend/src/features/realtime/pages/RealtimeMessagesPage.tsx +211 -0
- package/frontend/src/features/realtime/pages/RealtimePermissionsPage.tsx +191 -0
- package/frontend/src/features/realtime/services/realtime.service.ts +107 -0
- package/frontend/src/features/storage/components/BucketEmptyState.tsx +9 -6
- package/frontend/src/features/storage/components/BucketFormDialog.tsx +25 -41
- package/frontend/src/features/storage/components/FilePreviewDialog.tsx +20 -8
- package/frontend/src/features/storage/components/StorageDataGrid.tsx +4 -3
- package/frontend/src/features/storage/components/StorageManager.tsx +23 -34
- package/frontend/src/features/storage/components/index.ts +12 -0
- package/frontend/src/features/storage/hooks/useStorage.ts +208 -0
- package/frontend/src/features/storage/{page → pages}/StoragePage.tsx +41 -143
- package/frontend/src/features/storage/services/storage.service.ts +22 -1
- package/frontend/src/features/visualizer/components/AuthNode.tsx +72 -56
- package/frontend/src/features/visualizer/components/BucketNode.tsx +4 -4
- package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +108 -80
- package/frontend/src/features/visualizer/components/TableNode.tsx +34 -41
- package/frontend/src/features/visualizer/components/VisualizerSkeleton.tsx +12 -4
- package/frontend/src/features/visualizer/pages/VisualizerPage.tsx +97 -0
- package/frontend/src/index.css +1 -0
- package/frontend/src/lib/analytics/posthog.tsx +27 -0
- package/frontend/src/lib/contexts/AuthContext.tsx +38 -31
- package/frontend/src/lib/contexts/SocketContext.tsx +123 -80
- package/frontend/src/{features/metadata → lib}/hooks/useMetadata.ts +1 -1
- package/frontend/src/lib/hooks/useToast.tsx +6 -2
- package/frontend/src/lib/routing/AppRoutes.tsx +99 -0
- package/frontend/src/lib/routing/RequireAuth.tsx +27 -0
- package/frontend/src/lib/utils/cloudMessaging.ts +20 -0
- package/frontend/src/lib/utils/menuItems.ts +207 -0
- package/frontend/src/lib/utils/{validation-schemas.ts → schemaValidations.ts} +10 -5
- package/frontend/src/lib/utils/utils.ts +32 -1
- package/frontend/src/vite-env.d.ts +1 -0
- package/frontend/tsconfig.json +25 -25
- package/frontend/tsconfig.node.json +9 -9
- package/frontend/vite.config.ts +5 -3
- package/functions/deno.json +24 -24
- package/functions/server.ts +315 -290
- package/functions/worker-template.js +15 -4
- package/i18n/README.ar.md +130 -0
- package/i18n/README.de.md +130 -0
- package/i18n/README.es.md +154 -0
- package/i18n/README.fr.md +134 -0
- package/i18n/README.hi.md +129 -0
- package/i18n/README.ja.md +174 -0
- package/i18n/README.ko.md +137 -0
- package/i18n/README.pt-BR.md +131 -0
- package/i18n/README.ru.md +129 -0
- package/i18n/README.zh-CN.md +133 -0
- package/openapi/ai.yaml +715 -688
- package/openapi/auth.yaml +1244 -563
- package/openapi/email.yaml +158 -0
- package/openapi/functions.yaml +475 -475
- package/openapi/health.yaml +29 -29
- package/openapi/logs.yaml +223 -223
- package/openapi/metadata.yaml +177 -177
- package/openapi/realtime.yaml +699 -0
- package/openapi/records.yaml +381 -381
- package/openapi/secrets.yaml +370 -370
- package/openapi/storage.yaml +875 -875
- package/openapi/tables.yaml +463 -463
- package/package.json +97 -88
- package/shared-schemas/package.json +31 -31
- package/shared-schemas/src/ai-api.schema.ts +34 -58
- package/shared-schemas/src/ai.schema.ts +63 -54
- package/shared-schemas/src/auth-api.schema.ts +352 -193
- package/shared-schemas/src/auth.schema.ts +43 -7
- package/shared-schemas/src/cloud-events.schema.ts +57 -0
- package/shared-schemas/src/database-api.schema.ts +35 -4
- package/shared-schemas/src/database.schema.ts +40 -1
- package/shared-schemas/src/docs.schema.ts +26 -0
- package/shared-schemas/src/email-api.schema.ts +30 -0
- package/shared-schemas/src/index.ts +5 -0
- package/shared-schemas/src/logs-api.schema.ts +7 -1
- package/shared-schemas/src/logs.schema.ts +26 -0
- package/shared-schemas/src/metadata.schema.ts +18 -4
- package/shared-schemas/src/realtime-api.schema.ts +111 -0
- package/shared-schemas/src/realtime.schema.ts +143 -0
- package/shared-schemas/tsconfig.json +21 -21
- package/tsconfig.json +7 -7
- package/zeabur/README.md +13 -0
- package/zeabur/template.yml +1032 -0
- package/.github/workflows/deploy-aws.yml +0 -130
- package/backend/src/api/routes/agent.ts +0 -29
- package/backend/src/api/routes/auth.oauth.ts +0 -482
- package/backend/src/api/routes/auth.ts +0 -386
- package/backend/src/api/routes/docs.ts +0 -66
- package/backend/src/api/routes/functions.ts +0 -183
- package/backend/src/api/routes/openapi.ts +0 -82
- package/backend/src/api/routes/usage.ts +0 -96
- package/backend/src/core/ai/client.ts +0 -242
- package/backend/src/core/ai/model.ts +0 -117
- package/backend/src/core/auth/auth.ts +0 -780
- package/backend/src/core/database/manager.ts +0 -178
- package/backend/src/core/database/table.ts +0 -772
- package/backend/src/core/documentation/agent.ts +0 -689
- package/backend/src/core/documentation/openapi.ts +0 -856
- package/backend/src/core/logs/analytics.ts +0 -76
- package/backend/src/core/logs/providers/localdb.provider.ts +0 -246
- package/backend/src/core/socket/socket.ts +0 -388
- package/backend/src/core/storage/storage.ts +0 -923
- package/backend/src/utils/cloud-token.ts +0 -39
- package/backend/src/utils/helpers.ts +0 -49
- package/backend/src/utils/uuid.ts +0 -9
- package/backend/tests/manual/test-better-auth.sh +0 -303
- package/docker-init/db/logs.sql +0 -9
- package/frontend/README.md +0 -112
- package/frontend/src/components/datagrid/index.tsx +0 -20
- package/frontend/src/components/layout/CloudLayout.tsx +0 -95
- package/frontend/src/features/ai/components/AIConfigDialog.tsx +0 -76
- package/frontend/src/features/ai/components/AIConfigForm.tsx +0 -222
- package/frontend/src/features/ai/components/fields/ModalityField.tsx +0 -87
- package/frontend/src/features/ai/components/fields/ModelSelectionField.tsx +0 -134
- package/frontend/src/features/ai/components/fields/SystemPromptField.tsx +0 -33
- package/frontend/src/features/ai/page/AIPage.tsx +0 -178
- package/frontend/src/features/auth/components/AddOAuthDialog.tsx +0 -106
- package/frontend/src/features/auth/components/AuthMethodTab.tsx +0 -238
- package/frontend/src/features/auth/components/UsersTab.tsx +0 -114
- package/frontend/src/features/auth/page/AuthenticationPage.tsx +0 -169
- package/frontend/src/features/dashboard/page/DashboardPage.tsx +0 -194
- package/frontend/src/features/database/hooks/UseLinkModal.tsx +0 -78
- package/frontend/src/features/functions/components/FunctionViewer.tsx +0 -46
- package/frontend/src/features/functions/components/FunctionsContent.tsx +0 -88
- package/frontend/src/features/functions/page/FunctionsPage.tsx +0 -28
- package/frontend/src/features/login/components/AuthErrorBoundary.tsx +0 -87
- package/frontend/src/features/login/components/PrivateRoute.tsx +0 -24
- package/frontend/src/features/login/page/CloudLoginPage.tsx +0 -93
- package/frontend/src/features/logs/components/AnalyticsLogsTable.tsx +0 -313
- package/frontend/src/features/logs/components/LogsTable.tsx +0 -199
- package/frontend/src/features/logs/page/AnalyticsLogsPage.tsx +0 -530
- package/frontend/src/features/metadata/index.ts +0 -0
- package/frontend/src/features/metadata/page/MetadataPage.tsx +0 -136
- package/frontend/src/features/onboard/components/CompletionCard.tsx +0 -41
- package/frontend/src/features/onboard/components/OnboardButton.tsx +0 -84
- package/frontend/src/features/onboard/components/StepContent.tsx +0 -91
- package/frontend/src/features/onboard/components/TestConnectionStep.tsx +0 -53
- package/frontend/src/features/onboard/components/mcp/McpInstallation.tsx +0 -144
- package/frontend/src/features/onboard/page/OnBoardPage.tsx +0 -104
- package/frontend/src/features/onboard/types.ts +0 -8
- package/frontend/src/features/visualizer/page/VisualizerPage.tsx +0 -127
- package/frontend/src/lib/contexts/OnboardStepContext.tsx +0 -68
- package/frontend/src/lib/hooks/useOnboardingCompletion.ts +0 -29
- /package/backend/src/api/{middleware → middlewares}/error.ts +0 -0
- /package/backend/src/api/{middleware → middlewares}/upload.ts +0 -0
- /package/frontend/src/{features/metadata → lib}/services/metadata.service.ts +0 -0
|
@@ -1,17 +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)
|
|
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
17
|
# shared_preload_libraries = 'pg_stat_statements'
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
api:
|
|
2
|
+
enabled: true
|
|
3
|
+
address: 0.0.0.0:7135
|
|
4
|
+
|
|
5
|
+
sources:
|
|
6
|
+
docker_host:
|
|
7
|
+
type: docker_logs
|
|
8
|
+
exclude_containers:
|
|
9
|
+
- insforge-vector
|
|
10
|
+
include_containers:
|
|
11
|
+
- insforge
|
|
12
|
+
- insforge-deno
|
|
13
|
+
- insforge-postgrest
|
|
14
|
+
- insforge-postgres
|
|
15
|
+
|
|
16
|
+
transforms:
|
|
17
|
+
project_logs:
|
|
18
|
+
type: remap
|
|
19
|
+
inputs:
|
|
20
|
+
- docker_host
|
|
21
|
+
source: |-
|
|
22
|
+
.project = "default"
|
|
23
|
+
.event_message = del(.message)
|
|
24
|
+
# Remove leading slash from container name if present
|
|
25
|
+
container = to_string!(del(.container_name))
|
|
26
|
+
if starts_with(container, "/") {
|
|
27
|
+
.appname = slice!(container, 1)
|
|
28
|
+
} else {
|
|
29
|
+
.appname = container
|
|
30
|
+
}
|
|
31
|
+
del(.container_created_at)
|
|
32
|
+
del(.container_id)
|
|
33
|
+
del(.source_type)
|
|
34
|
+
del(.stream)
|
|
35
|
+
del(.label)
|
|
36
|
+
del(.image)
|
|
37
|
+
del(.host)
|
|
38
|
+
del(.stream)
|
|
39
|
+
|
|
40
|
+
router:
|
|
41
|
+
type: route
|
|
42
|
+
inputs:
|
|
43
|
+
- project_logs
|
|
44
|
+
route:
|
|
45
|
+
insforge: '.appname == "insforge"'
|
|
46
|
+
deno: '.appname == "insforge-deno"'
|
|
47
|
+
rest: '.appname == "insforge-postgrest"'
|
|
48
|
+
db: '.appname == "insforge-postgres"'
|
|
49
|
+
realtime: '.appname == "insforge-realtime"'
|
|
50
|
+
# PostgREST logs with proper parsing
|
|
51
|
+
rest_logs:
|
|
52
|
+
type: remap
|
|
53
|
+
inputs:
|
|
54
|
+
- router.rest
|
|
55
|
+
source: |-
|
|
56
|
+
# .metadata.host = .project
|
|
57
|
+
# Parse PostgREST log format: DD/Mon/YYYY:HH:MM:SS +ZZZZ: message
|
|
58
|
+
parsed, err = parse_regex(.event_message, r'^(?P<time>\d{2}/\w{3}/\d{4}:\d{2}:\d{2}:\d{2} [+-]\d{4}): (?P<msg>.*)$')
|
|
59
|
+
|
|
60
|
+
if err == null && parsed != null {
|
|
61
|
+
.event_message = parsed.msg
|
|
62
|
+
.metadata.level = "info"
|
|
63
|
+
} else {
|
|
64
|
+
# If parsing fails, keep original message
|
|
65
|
+
.metadata.level = "info"
|
|
66
|
+
}
|
|
67
|
+
# InsForge logs are structured JSON, parse and handle both request logs and application logs
|
|
68
|
+
insforge_logs:
|
|
69
|
+
type: remap
|
|
70
|
+
inputs:
|
|
71
|
+
- router.insforge
|
|
72
|
+
source: |-
|
|
73
|
+
# Remove the [backend] prefix if present
|
|
74
|
+
.event_message = replace!(.event_message, r'^\[backend\] ', "")
|
|
75
|
+
|
|
76
|
+
req, err = parse_json(.event_message)
|
|
77
|
+
if err == null {
|
|
78
|
+
# Set timestamp from log
|
|
79
|
+
if req.timestamp != null {
|
|
80
|
+
.timestamp = to_timestamp!(req.timestamp)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
# Set log level
|
|
84
|
+
.metadata.level = req.level
|
|
85
|
+
|
|
86
|
+
# Check if this is a request log (has duration field)
|
|
87
|
+
if req.duration != null {
|
|
88
|
+
# Flatten request log fields to top level
|
|
89
|
+
.user_agent = req.userAgent
|
|
90
|
+
.ip = req.ip
|
|
91
|
+
.method = req.method
|
|
92
|
+
.path = req.path
|
|
93
|
+
.protocol = "HTTP/1.1"
|
|
94
|
+
.status_code = req.status
|
|
95
|
+
.size = req.size
|
|
96
|
+
.duration = req.duration
|
|
97
|
+
# Format as nginx-style log line
|
|
98
|
+
.event_message = join!([req.method, req.path, to_string!(req.status), to_string!(req.size), req.duration, "-", req.ip, "-", req.userAgent], " ")
|
|
99
|
+
.log_type = "request"
|
|
100
|
+
} else {
|
|
101
|
+
# This is an application log
|
|
102
|
+
.event_message = join!([req.level, req.message], " - ")
|
|
103
|
+
.log_type = "application"
|
|
104
|
+
if req.error != null {
|
|
105
|
+
.error = req.error
|
|
106
|
+
}
|
|
107
|
+
if req.stack != null {
|
|
108
|
+
.stack = req.stack
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
realtime_logs:
|
|
113
|
+
type: remap
|
|
114
|
+
inputs:
|
|
115
|
+
- router.realtime
|
|
116
|
+
source: |-
|
|
117
|
+
parsed, err = parse_regex(.event_message, r'^(?P<time>\d+:\d+:\d+\.\d+) \[(?P<level>\w+)\] (?P<msg>.*)$')
|
|
118
|
+
if err == null {
|
|
119
|
+
.event_message = parsed.msg
|
|
120
|
+
.metadata.level = parsed.level
|
|
121
|
+
}
|
|
122
|
+
deno_logs:
|
|
123
|
+
type: remap
|
|
124
|
+
inputs:
|
|
125
|
+
- router.deno
|
|
126
|
+
source: |-
|
|
127
|
+
parsed, err = parse_regex(.event_message, r'^(?P<time>\d+:\d+:\d+\.\d+) \[(?P<level>\w+)\] (?P<msg>.*)$')
|
|
128
|
+
if err == null {
|
|
129
|
+
.event_message = parsed.msg
|
|
130
|
+
.timestamp = to_timestamp!(parsed.time)
|
|
131
|
+
.metadata.level = upcase!(parsed.level)
|
|
132
|
+
# .metadata.host = .project
|
|
133
|
+
}
|
|
134
|
+
# Postgres logs with proper parsing
|
|
135
|
+
db_logs:
|
|
136
|
+
type: remap
|
|
137
|
+
inputs:
|
|
138
|
+
- router.db
|
|
139
|
+
source: |-
|
|
140
|
+
# .metadata.host = "db-default"
|
|
141
|
+
# Parse PostgreSQL log format: YYYY-MM-DD HH:MM:SS.SSS TZ [PID] LEVEL: message
|
|
142
|
+
parsed, err = parse_regex(.event_message, r'^(?P<time>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3}) (?P<tz>\w+) \[(?P<pid>\d+)\] (?P<level>LOG|ERROR|WARNING|INFO|NOTICE|FATAL|PANIC|STATEMENT|DETAIL): (?P<msg>.*)$')
|
|
143
|
+
|
|
144
|
+
if err == null && parsed != null {
|
|
145
|
+
.metadata.parsed.pid = parsed.pid
|
|
146
|
+
.metadata.level = upcase!(parsed.level)
|
|
147
|
+
.event_message = parsed.msg
|
|
148
|
+
|
|
149
|
+
# Normalize STATEMENT and DETAIL to appropriate log levels
|
|
150
|
+
if .metadata.level == "STATEMENT" {
|
|
151
|
+
.metadata.level = "INFO"
|
|
152
|
+
}
|
|
153
|
+
if .metadata.level == "DETAIL" {
|
|
154
|
+
.metadata.level = "INFO"
|
|
155
|
+
}
|
|
156
|
+
} else {
|
|
157
|
+
# If parsing fails, keep original message and set default severity
|
|
158
|
+
.metadata.level = "LOG"
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
sinks:
|
|
162
|
+
# File sinks - JSONL format for FileProvider (always enabled)
|
|
163
|
+
file_insforge:
|
|
164
|
+
type: 'file'
|
|
165
|
+
inputs:
|
|
166
|
+
- insforge_logs
|
|
167
|
+
path: '/insforge-logs/insforge.logs.jsonl'
|
|
168
|
+
encoding:
|
|
169
|
+
codec: 'json'
|
|
170
|
+
file_deno:
|
|
171
|
+
type: 'file'
|
|
172
|
+
inputs:
|
|
173
|
+
- deno_logs
|
|
174
|
+
path: '/insforge-logs/function.logs.jsonl'
|
|
175
|
+
encoding:
|
|
176
|
+
codec: 'json'
|
|
177
|
+
file_rest:
|
|
178
|
+
type: 'file'
|
|
179
|
+
inputs:
|
|
180
|
+
- rest_logs
|
|
181
|
+
path: '/insforge-logs/postgrest.logs.jsonl'
|
|
182
|
+
encoding:
|
|
183
|
+
codec: 'json'
|
|
184
|
+
file_db:
|
|
185
|
+
type: 'file'
|
|
186
|
+
inputs:
|
|
187
|
+
- db_logs
|
|
188
|
+
path: '/insforge-logs/postgres.logs.jsonl'
|
|
189
|
+
encoding:
|
|
190
|
+
codec: 'json'
|
|
191
|
+
|
|
192
|
+
# CloudWatch sinks (ignored if AWS_REGION not set)
|
|
193
|
+
cw_insforge:
|
|
194
|
+
type: aws_cloudwatch_logs
|
|
195
|
+
inputs:
|
|
196
|
+
- insforge_logs
|
|
197
|
+
region: ${AWS_REGION:-skip}
|
|
198
|
+
group_name: /insforge/local
|
|
199
|
+
stream_name: ${HOSTNAME_OVERRIDE:-local}-insforge-vector
|
|
200
|
+
encoding:
|
|
201
|
+
codec: json
|
|
202
|
+
healthcheck:
|
|
203
|
+
enabled: false
|
|
204
|
+
cw_rest:
|
|
205
|
+
type: aws_cloudwatch_logs
|
|
206
|
+
inputs:
|
|
207
|
+
- rest_logs
|
|
208
|
+
region: ${AWS_REGION:-skip}
|
|
209
|
+
group_name: /insforge/local
|
|
210
|
+
stream_name: ${HOSTNAME_OVERRIDE:-local}-postgrest-vector
|
|
211
|
+
encoding:
|
|
212
|
+
codec: json
|
|
213
|
+
healthcheck:
|
|
214
|
+
enabled: false
|
|
215
|
+
cw_deno:
|
|
216
|
+
type: aws_cloudwatch_logs
|
|
217
|
+
inputs:
|
|
218
|
+
- deno_logs
|
|
219
|
+
region: ${AWS_REGION:-skip}
|
|
220
|
+
group_name: /insforge/local
|
|
221
|
+
stream_name: ${HOSTNAME_OVERRIDE:-local}-function-vector
|
|
222
|
+
encoding:
|
|
223
|
+
codec: json
|
|
224
|
+
healthcheck:
|
|
225
|
+
enabled: false
|
|
226
|
+
cw_db:
|
|
227
|
+
type: aws_cloudwatch_logs
|
|
228
|
+
inputs:
|
|
229
|
+
- db_logs
|
|
230
|
+
region: ${AWS_REGION:-skip}
|
|
231
|
+
group_name: /insforge/local
|
|
232
|
+
stream_name: ${HOSTNAME_OVERRIDE:-local}-postgres-vector
|
|
233
|
+
encoding:
|
|
234
|
+
codec: json
|
|
235
|
+
healthcheck:
|
|
236
|
+
enabled: false
|
package/docs/README.md
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Mintlify Starter Kit
|
|
2
|
+
|
|
3
|
+
Use the starter kit to get your docs deployed and ready to customize.
|
|
4
|
+
|
|
5
|
+
Click the green **Use this template** button at the top of this repo to copy the Mintlify starter kit. The starter kit contains examples with
|
|
6
|
+
|
|
7
|
+
- Guide pages
|
|
8
|
+
- Navigation
|
|
9
|
+
- Customizations
|
|
10
|
+
- API reference pages
|
|
11
|
+
- Use of popular components
|
|
12
|
+
|
|
13
|
+
**[Follow the full quickstart guide](https://starter.mintlify.com/quickstart)**
|
|
14
|
+
|
|
15
|
+
## Development
|
|
16
|
+
|
|
17
|
+
Install the [Mintlify CLI](https://www.npmjs.com/package/mint) to preview your documentation changes locally. To install, use the following command:
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
npm i -g mint
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Run the following command at the root of your documentation, where your `docs.json` is located:
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
mint dev
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
View your local preview at `http://localhost:3000`.
|
|
30
|
+
|
|
31
|
+
## Publishing changes
|
|
32
|
+
|
|
33
|
+
Install our GitHub app from your [dashboard](https://dashboard.mintlify.com/settings/organization/github-app) to propagate changes from your repo to your deployment. Changes are deployed to production automatically after pushing to the default branch.
|
|
34
|
+
|
|
35
|
+
## Need help?
|
|
36
|
+
|
|
37
|
+
### Troubleshooting
|
|
38
|
+
|
|
39
|
+
- If your dev environment isn't running: Run `mint update` to ensure you have the most recent version of the CLI.
|
|
40
|
+
- If a page loads as a 404: Make sure you are running in a folder with a valid `docs.json`.
|
|
41
|
+
|
|
42
|
+
### Resources
|
|
43
|
+
- [Mintlify documentation](https://mintlify.com/docs)
|
|
44
|
+
- [Mintlify community](https://mintlify.com/community)
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
# InsForge Realtime - Agent Documentation
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
InsForge Realtime enables real-time pub/sub messaging via WebSockets:
|
|
6
|
+
- **Database events**: Emit events when data changes using triggers
|
|
7
|
+
- **Client events**: Clients can publish custom events to each other
|
|
8
|
+
|
|
9
|
+
## Backend Setup (Raw SQL)
|
|
10
|
+
|
|
11
|
+
### Step 1: Create Channel Patterns
|
|
12
|
+
|
|
13
|
+
Define which channels are available:
|
|
14
|
+
|
|
15
|
+
```sql
|
|
16
|
+
INSERT INTO realtime.channels (pattern, description, enabled)
|
|
17
|
+
VALUES
|
|
18
|
+
('orders', 'Global order events', true),
|
|
19
|
+
('order:%', 'Order-specific events (order:123, order:456)', true),
|
|
20
|
+
('chat:%', 'Chat room events', true);
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
**Pattern syntax**: Use `:` as separator, `%` as wildcard (SQL LIKE pattern).
|
|
24
|
+
|
|
25
|
+
### Step 2: Create Triggers for Database Events
|
|
26
|
+
|
|
27
|
+
**IMPORTANT**: To emit events when database rows change, create a trigger that calls `realtime.publish()`:
|
|
28
|
+
|
|
29
|
+
```sql
|
|
30
|
+
-- Step 2a: Create the trigger function
|
|
31
|
+
CREATE OR REPLACE FUNCTION notify_order_changes()
|
|
32
|
+
RETURNS TRIGGER AS $$
|
|
33
|
+
BEGIN
|
|
34
|
+
PERFORM realtime.publish(
|
|
35
|
+
'order:' || NEW.id::text, -- channel name
|
|
36
|
+
TG_OP || '_order', -- event name: INSERT_order, UPDATE_order, DELETE_order
|
|
37
|
+
jsonb_build_object( -- payload (what clients receive)
|
|
38
|
+
'id', NEW.id,
|
|
39
|
+
'status', NEW.status,
|
|
40
|
+
'total', NEW.total
|
|
41
|
+
)
|
|
42
|
+
);
|
|
43
|
+
RETURN NEW;
|
|
44
|
+
END;
|
|
45
|
+
$$ LANGUAGE plpgsql SECURITY DEFINER;
|
|
46
|
+
|
|
47
|
+
-- Step 2b: Attach trigger to table
|
|
48
|
+
CREATE TRIGGER order_realtime
|
|
49
|
+
AFTER INSERT OR UPDATE ON orders
|
|
50
|
+
FOR EACH ROW
|
|
51
|
+
EXECUTE FUNCTION notify_order_changes();
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Step 3: Add Access Control (Optional)
|
|
55
|
+
|
|
56
|
+
**RLS is disabled by default** for the best developer experience. All authenticated and anonymous users can subscribe to any channel and publish messages out of the box.
|
|
57
|
+
|
|
58
|
+
To restrict access, first enable RLS, then add policies:
|
|
59
|
+
|
|
60
|
+
#### Step 3a: Enable RLS
|
|
61
|
+
|
|
62
|
+
```sql
|
|
63
|
+
ALTER TABLE realtime.channels ENABLE ROW LEVEL SECURITY;
|
|
64
|
+
ALTER TABLE realtime.messages ENABLE ROW LEVEL SECURITY;
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
#### Step 3b: Restrict who can subscribe (SELECT on realtime.channels)
|
|
68
|
+
|
|
69
|
+
```sql
|
|
70
|
+
-- Only order owner can subscribe to their order channel
|
|
71
|
+
CREATE POLICY "users_subscribe_own_orders"
|
|
72
|
+
ON realtime.channels FOR SELECT
|
|
73
|
+
TO authenticated
|
|
74
|
+
USING (
|
|
75
|
+
pattern = 'order:%'
|
|
76
|
+
AND EXISTS (
|
|
77
|
+
SELECT 1 FROM orders
|
|
78
|
+
WHERE id = NULLIF(split_part(realtime.channel_name(), ':', 2), '')::uuid
|
|
79
|
+
AND user_id = auth.uid()
|
|
80
|
+
)
|
|
81
|
+
);
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
**Note**: Use `realtime.channel_name()` in subscribe policies to get the actual channel (e.g., `order:123`) since the table only stores patterns (e.g., `order:%`).
|
|
85
|
+
|
|
86
|
+
#### Step 3c: Restrict who can publish from client (INSERT on realtime.messages)
|
|
87
|
+
|
|
88
|
+
```sql
|
|
89
|
+
-- Only chat room members can publish messages
|
|
90
|
+
CREATE POLICY "members_publish_chat"
|
|
91
|
+
ON realtime.messages FOR INSERT
|
|
92
|
+
TO authenticated
|
|
93
|
+
WITH CHECK (
|
|
94
|
+
channel_name LIKE 'chat:%'
|
|
95
|
+
AND EXISTS (
|
|
96
|
+
SELECT 1 FROM chat_members
|
|
97
|
+
WHERE room_id = NULLIF(split_part(channel_name, ':', 2), '')::uuid
|
|
98
|
+
AND user_id = auth.uid()
|
|
99
|
+
)
|
|
100
|
+
);
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## Frontend SDK
|
|
104
|
+
|
|
105
|
+
### Setup
|
|
106
|
+
|
|
107
|
+
```typescript
|
|
108
|
+
import { createClient } from '@insforge/sdk'
|
|
109
|
+
|
|
110
|
+
const insforge = createClient({
|
|
111
|
+
baseUrl: 'https://your-project.insforge.app'
|
|
112
|
+
})
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Core Methods
|
|
116
|
+
|
|
117
|
+
#### connect() - Establish WebSocket connection
|
|
118
|
+
|
|
119
|
+
```typescript
|
|
120
|
+
await insforge.realtime.connect()
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
#### subscribe(channel) - Subscribe to a channel
|
|
124
|
+
|
|
125
|
+
```typescript
|
|
126
|
+
const { ok, error } = await insforge.realtime.subscribe('order:123')
|
|
127
|
+
if (!ok) console.error('Failed:', error?.message)
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
#### on(event, callback) - Listen for events
|
|
131
|
+
|
|
132
|
+
```typescript
|
|
133
|
+
// Listen for database-triggered events
|
|
134
|
+
insforge.realtime.on('INSERT_order', (payload) => {
|
|
135
|
+
console.log('New order:', payload.id, payload.status)
|
|
136
|
+
})
|
|
137
|
+
|
|
138
|
+
insforge.realtime.on('UPDATE_order', (payload) => {
|
|
139
|
+
console.log('Order updated:', payload)
|
|
140
|
+
})
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
#### once(event, callback) - Listen for event once
|
|
144
|
+
|
|
145
|
+
```typescript
|
|
146
|
+
// Auto-removes after first invocation
|
|
147
|
+
insforge.realtime.once('order_completed', (payload) => {
|
|
148
|
+
console.log('Order completed:', payload)
|
|
149
|
+
})
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
#### publish(channel, event, payload) - Send client events
|
|
153
|
+
|
|
154
|
+
```typescript
|
|
155
|
+
// Must be subscribed to channel first
|
|
156
|
+
await insforge.realtime.publish('chat:room-1', 'new_message', {
|
|
157
|
+
text: 'Hello!',
|
|
158
|
+
sender: 'Alice'
|
|
159
|
+
})
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
#### unsubscribe(channel)
|
|
163
|
+
|
|
164
|
+
```typescript
|
|
165
|
+
insforge.realtime.unsubscribe('order:123')
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
#### off(event, callback) - Remove listener
|
|
169
|
+
|
|
170
|
+
```typescript
|
|
171
|
+
insforge.realtime.off('UPDATE_order', handler)
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
#### disconnect() - Close connection
|
|
175
|
+
|
|
176
|
+
```typescript
|
|
177
|
+
insforge.realtime.disconnect()
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### Connection Events
|
|
181
|
+
|
|
182
|
+
```typescript
|
|
183
|
+
insforge.realtime.on('connect', () => console.log('Connected'))
|
|
184
|
+
insforge.realtime.on('disconnect', (reason) => console.log('Disconnected:', reason))
|
|
185
|
+
insforge.realtime.on('connect_error', (err) => console.error('Connection failed:', err))
|
|
186
|
+
insforge.realtime.on('error', ({ code, message }) => console.error('Error:', code, message))
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
**Error codes**: `UNAUTHORIZED`, `NOT_SUBSCRIBED`, `INTERNAL_ERROR`
|
|
190
|
+
|
|
191
|
+
### Properties
|
|
192
|
+
|
|
193
|
+
```typescript
|
|
194
|
+
insforge.realtime.isConnected // boolean
|
|
195
|
+
insforge.realtime.connectionState // 'disconnected' | 'connecting' | 'connected'
|
|
196
|
+
insforge.realtime.socketId // string (when connected)
|
|
197
|
+
insforge.realtime.getSubscribedChannels() // string[]
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### Message Metadata
|
|
201
|
+
|
|
202
|
+
All received messages include a `meta` field:
|
|
203
|
+
|
|
204
|
+
```typescript
|
|
205
|
+
insforge.realtime.on('UPDATE_order', (payload) => {
|
|
206
|
+
console.log(payload.meta.messageId) // UUID
|
|
207
|
+
console.log(payload.meta.channel) // 'order:123'
|
|
208
|
+
console.log(payload.meta.senderType) // 'system' (trigger) or 'user' (client)
|
|
209
|
+
console.log(payload.meta.timestamp) // Date
|
|
210
|
+
|
|
211
|
+
// Your payload fields
|
|
212
|
+
console.log(payload.status)
|
|
213
|
+
})
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
## Complete Example
|
|
217
|
+
|
|
218
|
+
**Backend SQL:**
|
|
219
|
+
```sql
|
|
220
|
+
-- 1. Create channel
|
|
221
|
+
INSERT INTO realtime.channels (pattern, description, enabled)
|
|
222
|
+
VALUES ('order:%', 'Order updates', true);
|
|
223
|
+
|
|
224
|
+
-- 2. Create trigger for database events
|
|
225
|
+
CREATE OR REPLACE FUNCTION notify_order_status()
|
|
226
|
+
RETURNS TRIGGER AS $$
|
|
227
|
+
BEGIN
|
|
228
|
+
PERFORM realtime.publish(
|
|
229
|
+
'order:' || NEW.id::text,
|
|
230
|
+
'status_changed',
|
|
231
|
+
jsonb_build_object('id', NEW.id, 'status', NEW.status, 'updated_at', NEW.updated_at)
|
|
232
|
+
);
|
|
233
|
+
RETURN NEW;
|
|
234
|
+
END;
|
|
235
|
+
$$ LANGUAGE plpgsql SECURITY DEFINER;
|
|
236
|
+
|
|
237
|
+
CREATE TRIGGER order_status_trigger
|
|
238
|
+
AFTER UPDATE ON orders
|
|
239
|
+
FOR EACH ROW
|
|
240
|
+
WHEN (OLD.status IS DISTINCT FROM NEW.status)
|
|
241
|
+
EXECUTE FUNCTION notify_order_status();
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
**Frontend:**
|
|
245
|
+
```typescript
|
|
246
|
+
await insforge.realtime.connect()
|
|
247
|
+
await insforge.realtime.subscribe(`order:${orderId}`)
|
|
248
|
+
|
|
249
|
+
// Listen for database-triggered events
|
|
250
|
+
insforge.realtime.on('status_changed', (payload) => {
|
|
251
|
+
updateUI(payload.status)
|
|
252
|
+
})
|
|
253
|
+
|
|
254
|
+
// Client can also publish events to the same channel
|
|
255
|
+
await insforge.realtime.publish(`order:${orderId}`, 'customer_viewed', {
|
|
256
|
+
viewedAt: new Date().toISOString()
|
|
257
|
+
})
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
## Quick Reference
|
|
261
|
+
|
|
262
|
+
| Task | How |
|
|
263
|
+
|------|-----|
|
|
264
|
+
| Emit event on DB change | Create trigger calling `realtime.publish(channel, event, payload)` |
|
|
265
|
+
| Client sends event | `insforge.realtime.publish(channel, event, payload)` |
|
|
266
|
+
| Listen for events | `insforge.realtime.on(eventName, callback)` |
|
|
267
|
+
| Listen once | `insforge.realtime.once(eventName, callback)` |
|
|
268
|
+
| Restrict subscribe access | Enable RLS on `realtime.channels`, then add SELECT policy |
|
|
269
|
+
| Restrict client publish | Enable RLS on `realtime.messages`, then add INSERT policy |
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Changelog"
|
|
3
|
+
description: "Latest updates and improvements to InsForge"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## December 2025
|
|
7
|
+
|
|
8
|
+
<AccordionGroup>
|
|
9
|
+
<Accordion title="Dec 12 - Alipay & New AI Models" icon="rocket">
|
|
10
|
+
### Alipay Payment Support
|
|
11
|
+
Added **Alipay** as an alternative payment method. Users can now pay for InsForge subscriptions without a credit card.
|
|
12
|
+
|
|
13
|
+
<img src="/images/changelog/dec-2025/alipay-payment.webp" alt="Alipay payment method option" style={{maxWidth: '90%'}} />
|
|
14
|
+
|
|
15
|
+
### New AI Models
|
|
16
|
+
Expanded AI model support:
|
|
17
|
+
- **GPT 5.2** - OpenAI's latest flagship model with enhanced reasoning, longer context windows, and improved instruction following
|
|
18
|
+
- **DeepSeek V3** - Open-weight model offering strong performance at lower cost, ideal for high-volume workloads
|
|
19
|
+
|
|
20
|
+
<img src="/images/changelog/dec-2025/ai-models.webp" alt="AI Integration with new models" style={{maxWidth: '90%'}} />
|
|
21
|
+
</Accordion>
|
|
22
|
+
<Accordion title="Dec 11 - Apple Login & Realtime Module" icon="rocket">
|
|
23
|
+
### Apple Login
|
|
24
|
+
**Sign in with Apple** is now available as an OAuth provider. Enable it in your project settings and let users authenticate with their Apple ID. Like other social providers, InsForge Cloud offers shared credentials for quick testing.
|
|
25
|
+
|
|
26
|
+
<img src="/images/changelog/dec-2025/apple-login.jpg" alt="Sign in with Apple authentication" style={{maxWidth: '90%'}} />
|
|
27
|
+
|
|
28
|
+
### Realtime Module
|
|
29
|
+
Build apps with **realtime pub/sub messaging**. Whether you're creating a chat room, multiplayer game, or collaborative document editor, the new Realtime module handles WebSocket connections, channel subscriptions, and message delivery out of the box.
|
|
30
|
+
|
|
31
|
+
Key features include:
|
|
32
|
+
- **Channel patterns** with wildcard support (e.g., `chat:*`, `game:lobby`)
|
|
33
|
+
- **Webhook integrations** for server-side event processing
|
|
34
|
+
- **Message history** and delivery analytics
|
|
35
|
+
- **RLS-based permissions** for secure subscribe and publish operations
|
|
36
|
+
|
|
37
|
+
<img src="/images/changelog/dec-2025/realtime-module.jpg" alt="Realtime multiplayer chess game demo" style={{maxWidth: '90%'}} />
|
|
38
|
+
</Accordion>
|
|
39
|
+
<Accordion title="Dec 7 - AI Models, MCP Installer & Security Updates" icon="rocket">
|
|
40
|
+
### AI Integration
|
|
41
|
+
Expanded model support with smarter defaults for different use cases.
|
|
42
|
+
|
|
43
|
+
- **Gemini 3 Pro** is now the default image generation model.
|
|
44
|
+
- **Grok 4.1 Fast** added to model selection for quicker, lightweight inference.
|
|
45
|
+
|
|
46
|
+
<img src="/images/changelog/dec-2025/ai-integration.png" alt="AI Integration with new models" style={{maxWidth: '90%'}} />
|
|
47
|
+
|
|
48
|
+
### MCP Installer
|
|
49
|
+
Updated installer experience with a new InsForge-branded startup screen and clearer next-step instructions.
|
|
50
|
+
|
|
51
|
+
<img src="/images/changelog/dec-2025/mcp-installer.png" alt="MCP Installer with InsForge branding" style={{maxWidth: '90%'}} />
|
|
52
|
+
|
|
53
|
+
### Security & Framework Updates
|
|
54
|
+
Updated Next.js version in response to a [security incident](https://nextjs.org/blog/CVE-2025-66478).
|
|
55
|
+
</Accordion>
|
|
56
|
+
</AccordionGroup>
|
|
57
|
+
|
|
58
|
+
## November 2025
|
|
59
|
+
|
|
60
|
+
<AccordionGroup>
|
|
61
|
+
<Accordion title="Nov 30 - QuickStart, Auth Components & Dashboard Tools" icon="rocket">
|
|
62
|
+
### QuickStart Prompts & Templates
|
|
63
|
+
Get started faster with our new quickstart prompts and templates for common apps. Builders can now start with one click and get a fullstack app running in **5 minutes**.
|
|
64
|
+
|
|
65
|
+
<img src="/images/changelog/nov-2025/quickstart-prompts.webp" alt="QuickStart Prompts and Templates" />
|
|
66
|
+
|
|
67
|
+
### Auth Components
|
|
68
|
+
Drop-in prebuilt React auth components for your app. Get a working auth flow right away with social sign-on support built in by default.
|
|
69
|
+
|
|
70
|
+
<img src="/images/changelog/nov-2025/auth-components.webp" alt="Auth Components with Social Sign-on" />
|
|
71
|
+
|
|
72
|
+
### Database Metadata Dashboard
|
|
73
|
+
View your RLS policies, triggers, functions, and indexes all in one place. This makes debugging and understanding your project security much easier.
|
|
74
|
+
|
|
75
|
+
<img src="/images/changelog/nov-2025/database-metadata.webp" alt="Database Metadata Dashboard" />
|
|
76
|
+
|
|
77
|
+
### SQL Editor
|
|
78
|
+
Run SQL queries directly in the InsForge dashboard. No external tools required.
|
|
79
|
+
|
|
80
|
+
<img src="/images/changelog/nov-2025/sql-editor.webp" alt="SQL Editor in Dashboard" />
|
|
81
|
+
|
|
82
|
+
### Usage Page
|
|
83
|
+
A new dashboard section that displays a clear breakdown of your resource usage and what your plan includes.
|
|
84
|
+
|
|
85
|
+
<img src="/images/changelog/nov-2025/usage-page.webp" alt="Usage Page Dashboard" />
|
|
86
|
+
</Accordion>
|
|
87
|
+
</AccordionGroup>
|
|
88
|
+
|
|
89
|
+
## October 2025
|
|
90
|
+
|
|
91
|
+
<AccordionGroup>
|
|
92
|
+
<Accordion title="Oct 30 - OAuth Providers, SDK & Logs" icon="rocket">
|
|
93
|
+
### OAuth: 4 New Third-Party Providers
|
|
94
|
+
You can now enable third-party logins with **LinkedIn, Microsoft, Facebook, and Discord**. On InsForge Cloud, we provide shared credentials for developers who want to quickly test these login flows.
|
|
95
|
+
|
|
96
|
+
After enabling, you can implement these logins directly through your agent by sending a simple prompt:
|
|
97
|
+
|
|
98
|
+
```text
|
|
99
|
+
implement Discord login
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
<img src="/images/changelog/october-2025/oauth-providers.webp" alt="OAuth Providers - LinkedIn, Microsoft, Facebook, and Discord" />
|
|
103
|
+
|
|
104
|
+
### Import CSV to Your Table
|
|
105
|
+
You can now upload `.csv` files directly into any table from the dashboard. Perfect for bringing in sample data or migrating from other tools.
|
|
106
|
+
|
|
107
|
+
<img src="/images/changelog/october-2025/csv-upload.webp" alt="CSV Upload to Tables Feature" />
|
|
108
|
+
|
|
109
|
+
### InsForge.js SDK
|
|
110
|
+
We've released our **insforge-js SDK** to make it easier for developers to integrate InsForge into their workflows. Manage auth, query databases, and control your backend programmatically with a few lines of code.
|
|
111
|
+
|
|
112
|
+
**Repository:** [GitHub](https://github.com/InsForge/InsForge-sdk-js)
|
|
113
|
+
|
|
114
|
+
### Logs
|
|
115
|
+
The new logs page lets you monitor container logs in real time. You can watch your backend activity directly in the dashboard, or let AI coding agents query logs through the InsForge MCP to automatically debug and search for errors.
|
|
116
|
+
|
|
117
|
+
<img src="/images/changelog/october-2025/logs-feature.webp" alt="Real-time Logs Monitoring Feature" />
|
|
118
|
+
</Accordion>
|
|
119
|
+
</AccordionGroup>
|