insforge 1.2.10 → 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.
Files changed (335) hide show
  1. package/.claude-plugin/marketplace.json +20 -20
  2. package/.dockerignore +60 -60
  3. package/.env.example +83 -77
  4. package/.github/ISSUE_TEMPLATE/bug_report.yml +36 -36
  5. package/.github/ISSUE_TEMPLATE/config.yml +11 -11
  6. package/.github/ISSUE_TEMPLATE/feature_request.yml +26 -26
  7. package/.github/PULL_REQUEST_TEMPLATE.md +7 -7
  8. package/.github/copilot-instructions.md +146 -146
  9. package/.github/workflows/build-image.yml +65 -65
  10. package/.github/workflows/ci-premerge-check.yml +23 -23
  11. package/.github/workflows/e2e.yml +63 -63
  12. package/.github/workflows/lint-and-format.yml +32 -32
  13. package/.prettierignore +64 -64
  14. package/CHANGELOG.md +44 -44
  15. package/CLAUDE_PLUGIN.md +104 -104
  16. package/CODE_OF_CONDUCT.md +128 -128
  17. package/CONTRIBUTING.md +125 -125
  18. package/Dockerfile +30 -30
  19. package/GITHUB_OAUTH_SETUP.md +49 -49
  20. package/GOOGLE_OAUTH_SETUP.md +148 -148
  21. package/LICENSE +201 -201
  22. package/README.md +182 -182
  23. package/assets/Dark.svg +23 -23
  24. package/auth/package.json +28 -28
  25. package/auth/src/lib/broadcastService.ts +117 -115
  26. package/auth/src/pages/SignInPage.tsx +60 -57
  27. package/auth/src/pages/SignUpPage.tsx +60 -57
  28. package/auth/tsconfig.json +32 -32
  29. package/auth/tsconfig.node.json +11 -11
  30. package/backend/package.json +78 -75
  31. package/backend/src/api/routes/ai/index.routes.ts +3 -3
  32. package/backend/src/api/routes/auth/index.routes.ts +667 -570
  33. package/backend/src/api/routes/auth/oauth.routes.ts +473 -448
  34. package/backend/src/api/routes/database/advance.routes.ts +37 -16
  35. package/backend/src/api/routes/database/index.routes.ts +78 -1
  36. package/backend/src/api/routes/database/records.routes.ts +10 -10
  37. package/backend/src/api/routes/database/tables.routes.ts +0 -14
  38. package/backend/src/api/routes/docs/index.routes.ts +75 -76
  39. package/backend/src/api/routes/email/index.routes.ts +35 -0
  40. package/backend/src/api/routes/functions/index.routes.ts +18 -12
  41. package/backend/src/api/routes/metadata/index.routes.ts +12 -0
  42. package/backend/src/api/routes/realtime/channels.routes.ts +81 -0
  43. package/backend/src/api/routes/realtime/index.routes.ts +12 -0
  44. package/backend/src/api/routes/realtime/messages.routes.ts +48 -0
  45. package/backend/src/api/routes/realtime/permissions.routes.ts +19 -0
  46. package/backend/src/api/routes/storage/index.routes.ts +18 -12
  47. package/backend/src/api/routes/usage/index.routes.ts +6 -4
  48. package/backend/src/infra/database/database.manager.ts +14 -1
  49. package/backend/src/infra/database/migrations/000_create-base-tables.sql +141 -141
  50. package/backend/src/infra/database/migrations/001_create-helper-functions.sql +40 -40
  51. package/backend/src/infra/database/migrations/002_rename-auth-tables.sql +29 -29
  52. package/backend/src/infra/database/migrations/003_create-users-table.sql +55 -55
  53. package/backend/src/infra/database/migrations/004_add-reload-postgrest-func.sql +23 -23
  54. package/backend/src/infra/database/migrations/005_enable-project-admin-modify-users.sql +29 -29
  55. package/backend/src/infra/database/migrations/006_modify-ai-usage-table.sql +24 -24
  56. package/backend/src/infra/database/migrations/007_drop-metadata-table.sql +1 -1
  57. package/backend/src/infra/database/migrations/008_add-system-tables.sql +76 -76
  58. package/backend/src/infra/database/migrations/009_add-function-secrets.sql +23 -23
  59. package/backend/src/infra/database/migrations/010_modify-ai-config-modalities.sql +93 -93
  60. package/backend/src/infra/database/migrations/011_refactor-secrets-table.sql +15 -15
  61. package/backend/src/infra/database/migrations/012_add-storage-uploaded-by.sql +7 -7
  62. package/backend/src/infra/database/migrations/013_create-auth-schema-functions.sql +44 -44
  63. package/backend/src/infra/database/migrations/014_add-updated-at-trigger-user-table.sql +7 -7
  64. package/backend/src/infra/database/migrations/015_create-auth-config-and-email-otp-tables.sql +59 -59
  65. package/backend/src/infra/database/migrations/016_update-auth-config-and-email-otp.sql +24 -24
  66. package/backend/src/infra/database/migrations/017_create-realtime-schema.sql +233 -0
  67. package/backend/src/infra/realtime/realtime.manager.ts +246 -0
  68. package/backend/src/infra/realtime/webhook-sender.ts +82 -0
  69. package/backend/src/infra/security/token.manager.ts +219 -125
  70. package/backend/src/infra/socket/socket.manager.ts +198 -64
  71. package/backend/src/providers/ai/openrouter.provider.ts +12 -9
  72. package/backend/src/providers/email/base.provider.ts +4 -7
  73. package/backend/src/providers/email/cloud.provider.ts +84 -0
  74. package/backend/src/providers/oauth/apple.provider.ts +266 -0
  75. package/backend/src/providers/oauth/index.ts +1 -0
  76. package/backend/src/server.ts +317 -284
  77. package/backend/src/services/ai/ai-model.service.ts +5 -5
  78. package/backend/src/services/ai/chat-completion.service.ts +4 -4
  79. package/backend/src/services/ai/image-generation.service.ts +3 -3
  80. package/backend/src/services/auth/auth.service.ts +14 -0
  81. package/backend/src/services/database/database-table.service.ts +0 -9
  82. package/backend/src/services/database/database.service.ts +127 -0
  83. package/backend/src/services/email/email.service.ts +5 -7
  84. package/backend/src/services/realtime/index.ts +3 -0
  85. package/backend/src/services/realtime/realtime-auth.service.ts +104 -0
  86. package/backend/src/services/realtime/realtime-channel.service.ts +237 -0
  87. package/backend/src/services/realtime/realtime-message.service.ts +260 -0
  88. package/backend/src/types/auth.ts +11 -0
  89. package/backend/src/types/realtime.ts +18 -0
  90. package/backend/src/types/socket.ts +7 -31
  91. package/backend/src/utils/cookies.ts +35 -0
  92. package/backend/src/utils/s3-config-loader.ts +64 -0
  93. package/backend/src/utils/seed.ts +301 -298
  94. package/backend/src/utils/sql-parser.ts +90 -0
  95. package/backend/tests/README.md +133 -133
  96. package/backend/tests/cleanup-all-test-data.sh +230 -230
  97. package/backend/tests/cloud/test-s3-multitenant.sh +131 -131
  98. package/backend/tests/local/comprehensive-curl-tests.sh +155 -155
  99. package/backend/tests/local/test-ai-config.sh +129 -129
  100. package/backend/tests/local/test-ai-usage.sh +80 -80
  101. package/backend/tests/local/test-auth-router.sh +143 -143
  102. package/backend/tests/local/test-database-router.sh +222 -222
  103. package/backend/tests/local/test-e2e.sh +240 -240
  104. package/backend/tests/local/test-fk-errors.sh +96 -96
  105. package/backend/tests/local/test-functions.sh +123 -123
  106. package/backend/tests/local/test-id-field.sh +200 -200
  107. package/backend/tests/local/test-logs.sh +132 -132
  108. package/backend/tests/local/test-public-bucket.sh +264 -264
  109. package/backend/tests/local/test-secrets.sh +249 -249
  110. package/backend/tests/local/test-serverless-functions.sh.disabled +325 -325
  111. package/backend/tests/local/test-traditional-rest.sh +208 -208
  112. package/backend/tests/manual/README.md +50 -50
  113. package/backend/tests/manual/create-large-table-simple.sql +10 -10
  114. package/backend/tests/manual/seed-large-table.sql +100 -100
  115. package/backend/tests/manual/setup-large-table-extras.sql +33 -33
  116. package/backend/tests/manual/test-bulk-upsert.sh +409 -409
  117. package/backend/tests/manual/test-database-advance.sh +296 -296
  118. package/backend/tests/manual/test-postgrest-stability.sh +191 -191
  119. package/backend/tests/manual/test-rawsql-export-import.sh +411 -411
  120. package/backend/tests/manual/test-rawsql-modes.sh +244 -244
  121. package/backend/tests/manual/test-universal-storage.sh +263 -263
  122. package/backend/tests/manual/test-users.sql +17 -17
  123. package/backend/tests/run-all-tests.sh +139 -139
  124. package/backend/tests/setup.ts +0 -0
  125. package/backend/tests/test-config.sh +338 -338
  126. package/backend/tests/unit/analyze-query.test.ts +697 -0
  127. package/backend/tsconfig.json +22 -22
  128. package/claude-plugin/.claude-plugin/plugin.json +24 -24
  129. package/claude-plugin/README.md +133 -133
  130. package/claude-plugin/skills/insforge-schema-patterns/SKILL.md +270 -270
  131. package/docker-compose.prod.yml +204 -200
  132. package/docker-compose.yml +232 -228
  133. package/docker-init/db/db-init.sql +97 -97
  134. package/docker-init/db/jwt.sql +5 -5
  135. package/docker-init/db/postgresql.conf +16 -16
  136. package/docker-init/logs/vector.yml +236 -236
  137. package/docs/README.md +44 -44
  138. package/docs/agent-docs/real-time.md +269 -0
  139. package/docs/changelog.mdx +119 -67
  140. package/docs/core-concepts/ai/architecture.mdx +372 -372
  141. package/docs/core-concepts/ai/sdk.mdx +213 -213
  142. package/docs/core-concepts/authentication/architecture.mdx +278 -278
  143. package/docs/core-concepts/authentication/sdk.mdx +414 -414
  144. package/docs/core-concepts/authentication/ui-components/customization.mdx +529 -529
  145. package/docs/core-concepts/authentication/ui-components/nextjs.mdx +221 -221
  146. package/docs/core-concepts/authentication/ui-components/react-router.mdx +184 -184
  147. package/docs/core-concepts/authentication/ui-components/react.mdx +129 -129
  148. package/docs/core-concepts/database/architecture.mdx +255 -255
  149. package/docs/core-concepts/database/sdk.mdx +382 -382
  150. package/docs/core-concepts/email/architecture.mdx +101 -0
  151. package/docs/core-concepts/email/sdk.mdx +53 -0
  152. package/docs/core-concepts/functions/architecture.mdx +105 -105
  153. package/docs/core-concepts/functions/sdk.mdx +184 -184
  154. package/docs/core-concepts/realtime/architecture.mdx +446 -0
  155. package/docs/core-concepts/realtime/sdk.mdx +409 -0
  156. package/docs/core-concepts/storage/architecture.mdx +243 -243
  157. package/docs/core-concepts/storage/sdk.mdx +253 -253
  158. package/docs/deployment/README.md +94 -94
  159. package/docs/deployment/deploy-to-aws-ec2.md +564 -564
  160. package/docs/deployment/deploy-to-azure-virtual-machines.md +312 -312
  161. package/docs/deployment/deploy-to-google-cloud-compute-engine.md +613 -613
  162. package/docs/deployment/deploy-to-render.md +441 -441
  163. package/docs/deprecated/insforge-auth-api.md +214 -214
  164. package/docs/deprecated/insforge-auth-sdk.md +99 -99
  165. package/docs/deprecated/insforge-db-api.md +358 -358
  166. package/docs/deprecated/insforge-db-sdk.md +139 -139
  167. package/docs/deprecated/insforge-debug-sdk.md +156 -156
  168. package/docs/deprecated/insforge-debug.md +64 -64
  169. package/docs/deprecated/insforge-instructions.md +123 -123
  170. package/docs/deprecated/insforge-project.md +117 -117
  171. package/docs/deprecated/insforge-storage-api.md +278 -278
  172. package/docs/deprecated/insforge-storage-sdk.md +158 -158
  173. package/docs/docs.json +232 -210
  174. package/docs/examples/framework-guides/nextjs.mdx +131 -131
  175. package/docs/examples/framework-guides/nuxt.mdx +165 -165
  176. package/docs/examples/framework-guides/react.mdx +165 -165
  177. package/docs/examples/framework-guides/svelte.mdx +153 -153
  178. package/docs/examples/framework-guides/vue.mdx +159 -159
  179. package/docs/examples/overview.mdx +67 -67
  180. package/docs/favicon.svg +19 -19
  181. package/docs/images/changelog/dec-2025/ai-integration.png +0 -0
  182. package/docs/images/changelog/dec-2025/ai-models.webp +0 -0
  183. package/docs/images/changelog/dec-2025/alipay-payment.webp +0 -0
  184. package/docs/images/changelog/dec-2025/apple-login.jpg +0 -0
  185. package/docs/images/changelog/dec-2025/mcp-installer.png +0 -0
  186. package/docs/images/changelog/dec-2025/realtime-module.jpg +0 -0
  187. package/docs/images/icons/ai.svg +4 -4
  188. package/docs/images/logos/nextjs.svg +4 -4
  189. package/docs/images/logos/nuxt.svg +4 -4
  190. package/docs/images/logos/react.svg +5 -5
  191. package/docs/images/logos/svelte.svg +4 -4
  192. package/docs/images/logos/vue.svg +5 -5
  193. package/docs/insforge-instructions-sdk.md +89 -88
  194. package/docs/introduction.mdx +45 -45
  195. package/docs/logo/dark.svg +22 -22
  196. package/docs/logo/light.svg +20 -20
  197. package/docs/partnership.mdx +651 -646
  198. package/docs/quickstart.mdx +82 -82
  199. package/docs/showcase.mdx +52 -52
  200. package/docs/snippets/sdk-installation.mdx +21 -21
  201. package/docs/snippets/service-icons.mdx +27 -27
  202. package/examples/oauth/frontend-oauth-example.html +250 -250
  203. package/examples/response-examples.md +443 -443
  204. package/frontend/components.json +17 -17
  205. package/frontend/package.json +69 -69
  206. package/frontend/src/assets/icons/checkbox_checked.svg +6 -6
  207. package/frontend/src/assets/icons/checkbox_undetermined.svg +6 -6
  208. package/frontend/src/assets/icons/checked.svg +3 -3
  209. package/frontend/src/assets/icons/connected.svg +3 -3
  210. package/frontend/src/assets/icons/error.svg +3 -3
  211. package/frontend/src/assets/icons/loader.svg +9 -9
  212. package/frontend/src/assets/icons/pencil.svg +4 -4
  213. package/frontend/src/assets/icons/refresh.svg +4 -4
  214. package/frontend/src/assets/icons/step_active.svg +3 -3
  215. package/frontend/src/assets/icons/step_inactive.svg +11 -11
  216. package/frontend/src/assets/icons/warning.svg +3 -3
  217. package/frontend/src/assets/logos/apple.svg +3 -3
  218. package/frontend/src/assets/logos/claude_code.svg +3 -3
  219. package/frontend/src/assets/logos/cline.svg +6 -6
  220. package/frontend/src/assets/logos/cursor.svg +20 -20
  221. package/frontend/src/assets/logos/discord.svg +8 -8
  222. package/frontend/src/assets/logos/facebook.svg +3 -3
  223. package/frontend/src/assets/logos/gemini.svg +19 -19
  224. package/frontend/src/assets/logos/github.svg +5 -5
  225. package/frontend/src/assets/logos/google.svg +13 -13
  226. package/frontend/src/assets/logos/grok.svg +10 -10
  227. package/frontend/src/assets/logos/insforge_dark.svg +15 -15
  228. package/frontend/src/assets/logos/insforge_light.svg +15 -15
  229. package/frontend/src/assets/logos/instagram.svg +1 -1
  230. package/frontend/src/assets/logos/linkedin.svg +3 -3
  231. package/frontend/src/assets/logos/openai.svg +10 -10
  232. package/frontend/src/assets/logos/roo_code.svg +9 -9
  233. package/frontend/src/assets/logos/spotify.svg +16 -16
  234. package/frontend/src/assets/logos/tiktok.svg +5 -5
  235. package/frontend/src/assets/logos/trae.svg +3 -3
  236. package/frontend/src/assets/logos/windsurf.svg +10 -10
  237. package/frontend/src/assets/logos/x.svg +3 -3
  238. package/frontend/src/components/layout/AppHeader.tsx +9 -10
  239. package/frontend/src/features/auth/components/OAuthConfigDialog.tsx +1 -0
  240. package/frontend/src/features/auth/components/UsersDataGrid.tsx +6 -0
  241. package/frontend/src/features/auth/helpers.tsx +8 -0
  242. package/frontend/src/features/auth/{page → pages}/UsersPage.tsx +0 -28
  243. package/frontend/src/features/database/components/SQLModal.tsx +75 -0
  244. package/frontend/src/features/database/components/TableForm.tsx +0 -4
  245. package/frontend/src/features/database/hooks/useDatabase.ts +66 -0
  246. package/frontend/src/features/database/hooks/useTables.ts +32 -28
  247. package/frontend/src/features/database/index.ts +1 -0
  248. package/frontend/src/features/database/{page → pages}/FunctionsPage.tsx +29 -37
  249. package/frontend/src/features/database/{page → pages}/IndexesPage.tsx +35 -47
  250. package/frontend/src/features/database/{page → pages}/PoliciesPage.tsx +43 -54
  251. package/frontend/src/features/database/{page → pages}/TablesPage.tsx +0 -42
  252. package/frontend/src/features/database/{page → pages}/TriggersPage.tsx +35 -47
  253. package/frontend/src/features/database/services/advance.service.ts +0 -26
  254. package/frontend/src/features/database/services/database.service.ts +55 -0
  255. package/frontend/src/features/database/services/table.service.ts +0 -6
  256. package/frontend/src/features/functions/{page → pages}/FunctionsPage.tsx +21 -44
  257. package/frontend/src/features/functions/{page → pages}/SecretsPage.tsx +11 -9
  258. package/frontend/src/features/logs/hooks/useMcpUsage.ts +13 -66
  259. package/frontend/src/features/realtime/components/ChannelRow.tsx +83 -0
  260. package/frontend/src/features/realtime/components/EditChannelModal.tsx +246 -0
  261. package/frontend/src/features/realtime/components/MessageRow.tsx +85 -0
  262. package/frontend/src/features/realtime/components/RealtimeEmptyState.tsx +30 -0
  263. package/frontend/src/features/realtime/hooks/useRealtime.ts +218 -0
  264. package/frontend/src/features/realtime/index.ts +11 -0
  265. package/frontend/src/features/realtime/pages/RealtimeChannelsPage.tsx +172 -0
  266. package/frontend/src/features/realtime/pages/RealtimeMessagesPage.tsx +211 -0
  267. package/frontend/src/features/realtime/pages/RealtimePermissionsPage.tsx +191 -0
  268. package/frontend/src/features/realtime/services/realtime.service.ts +107 -0
  269. package/frontend/src/features/storage/{page → pages}/StoragePage.tsx +1 -29
  270. package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +3 -3
  271. package/frontend/src/features/visualizer/{page → pages}/VisualizerPage.tsx +1 -35
  272. package/frontend/src/lib/contexts/SocketContext.tsx +119 -75
  273. package/frontend/src/lib/routing/AppRoutes.tsx +35 -20
  274. package/frontend/src/lib/utils/cloudMessaging.ts +1 -1
  275. package/frontend/src/lib/utils/menuItems.ts +24 -0
  276. package/frontend/src/lib/utils/utils.ts +14 -1
  277. package/frontend/tsconfig.json +25 -25
  278. package/frontend/tsconfig.node.json +9 -9
  279. package/functions/deno.json +24 -24
  280. package/functions/server.ts +315 -315
  281. package/i18n/README.ar.md +130 -130
  282. package/i18n/README.de.md +130 -130
  283. package/i18n/README.es.md +154 -154
  284. package/i18n/README.fr.md +134 -134
  285. package/i18n/README.hi.md +129 -129
  286. package/i18n/README.ja.md +174 -174
  287. package/i18n/README.ko.md +136 -136
  288. package/i18n/README.pt-BR.md +131 -131
  289. package/i18n/README.ru.md +129 -129
  290. package/i18n/README.zh-CN.md +133 -133
  291. package/openapi/ai.yaml +715 -715
  292. package/openapi/auth.yaml +1244 -1244
  293. package/openapi/email.yaml +158 -0
  294. package/openapi/functions.yaml +475 -475
  295. package/openapi/health.yaml +29 -29
  296. package/openapi/logs.yaml +223 -223
  297. package/openapi/metadata.yaml +177 -177
  298. package/openapi/realtime.yaml +699 -0
  299. package/openapi/records.yaml +381 -381
  300. package/openapi/secrets.yaml +370 -370
  301. package/openapi/storage.yaml +875 -875
  302. package/openapi/tables.yaml +463 -463
  303. package/package.json +97 -97
  304. package/shared-schemas/package.json +31 -31
  305. package/shared-schemas/src/ai.schema.ts +63 -59
  306. package/shared-schemas/src/auth-api.schema.ts +352 -339
  307. package/shared-schemas/src/auth.schema.ts +1 -1
  308. package/shared-schemas/src/database-api.schema.ts +32 -1
  309. package/shared-schemas/src/database.schema.ts +39 -0
  310. package/shared-schemas/src/docs.schema.ts +26 -0
  311. package/shared-schemas/src/email-api.schema.ts +30 -0
  312. package/shared-schemas/src/index.ts +4 -0
  313. package/shared-schemas/src/metadata.schema.ts +9 -0
  314. package/shared-schemas/src/realtime-api.schema.ts +111 -0
  315. package/shared-schemas/src/realtime.schema.ts +143 -0
  316. package/shared-schemas/tsconfig.json +21 -21
  317. package/tsconfig.json +7 -7
  318. package/zeabur/README.md +13 -13
  319. package/zeabur/template.yml +1032 -1032
  320. package/.cursor/rules/cursor-rules.mdc +0 -94
  321. package/frontend/src/features/database/hooks/useFullMetadata.ts +0 -18
  322. package/test-gemini.sh +0 -35
  323. package/test-usage-admin.sh +0 -57
  324. package/test-usage.sh +0 -50
  325. /package/frontend/src/features/ai/{page → pages}/AIPage.tsx +0 -0
  326. /package/frontend/src/features/auth/{page → pages}/AuthMethodsPage.tsx +0 -0
  327. /package/frontend/src/features/auth/{page → pages}/ConfigurationPage.tsx +0 -0
  328. /package/frontend/src/features/dashboard/{page → pages}/DashboardPage.tsx +0 -0
  329. /package/frontend/src/features/database/{page → pages}/SQLEditorPage.tsx +0 -0
  330. /package/frontend/src/features/database/{page → pages}/TemplatesPage.tsx +0 -0
  331. /package/frontend/src/features/login/{page → pages}/CloudLoginPage.tsx +0 -0
  332. /package/frontend/src/features/login/{page → pages}/LoginPage.tsx +0 -0
  333. /package/frontend/src/features/logs/{page → pages}/AuditsPage.tsx +0 -0
  334. /package/frontend/src/features/logs/{page → pages}/LogsPage.tsx +0 -0
  335. /package/frontend/src/features/logs/{page → pages}/MCPLogsPage.tsx +0 -0
@@ -21,7 +21,7 @@ export const nameSchema = z
21
21
  .max(100, 'Name must be less than 100 characters')
22
22
  .trim();
23
23
 
24
- export const roleSchema = z.enum(['authenticated', 'project_admin']);
24
+ export const roleSchema = z.enum(['anon', 'authenticated', 'project_admin']);
25
25
 
26
26
  export const verificationMethodSchema = z.enum(['code', 'link']);
27
27
 
@@ -1,5 +1,13 @@
1
1
  import { z } from 'zod';
2
- import { columnSchema, foreignKeySchema, tableSchema } from './database.schema';
2
+ import {
3
+ columnSchema,
4
+ foreignKeySchema,
5
+ tableSchema,
6
+ databaseFunctionSchema,
7
+ databaseIndexSchema,
8
+ databasePolicySchema,
9
+ databaseTriggerSchema,
10
+ } from './database.schema';
3
11
 
4
12
  export const createTableRequestSchema = tableSchema
5
13
  .pick({
@@ -257,3 +265,26 @@ export type ImportDatabaseResponse = z.infer<typeof importResponseSchema>;
257
265
  // Bulk Upsert Types
258
266
  export type BulkUpsertRequest = z.infer<typeof bulkUpsertRequestSchema>;
259
267
  export type BulkUpsertResponse = z.infer<typeof bulkUpsertResponseSchema>;
268
+
269
+ // Database Metadata Response Schemas
270
+ export const databaseFunctionsResponseSchema = z.object({
271
+ functions: z.array(databaseFunctionSchema),
272
+ });
273
+
274
+ export const databaseIndexesResponseSchema = z.object({
275
+ indexes: z.array(databaseIndexSchema),
276
+ });
277
+
278
+ export const databasePoliciesResponseSchema = z.object({
279
+ policies: z.array(databasePolicySchema),
280
+ });
281
+
282
+ export const databaseTriggersResponseSchema = z.object({
283
+ triggers: z.array(databaseTriggerSchema),
284
+ });
285
+
286
+ // Database Metadata Response Types
287
+ export type DatabaseFunctionsResponse = z.infer<typeof databaseFunctionsResponseSchema>;
288
+ export type DatabaseIndexesResponse = z.infer<typeof databaseIndexesResponseSchema>;
289
+ export type DatabasePoliciesResponse = z.infer<typeof databasePoliciesResponseSchema>;
290
+ export type DatabaseTriggersResponse = z.infer<typeof databaseTriggersResponseSchema>;
@@ -67,3 +67,42 @@ export type ColumnSchema = z.infer<typeof columnSchema>;
67
67
  export type ForeignKeySchema = z.infer<typeof foreignKeySchema>;
68
68
  export type OnUpdateActionSchema = z.infer<typeof onUpdateActionSchema>;
69
69
  export type OnDeleteActionSchema = z.infer<typeof onDeleteActionSchema>;
70
+
71
+ // Database Metadata Object Schemas
72
+ export const databaseFunctionSchema = z.object({
73
+ functionName: z.string(),
74
+ functionDef: z.string(),
75
+ kind: z.string(),
76
+ });
77
+
78
+ export const databaseIndexSchema = z.object({
79
+ tableName: z.string(),
80
+ indexName: z.string(),
81
+ indexDef: z.string(),
82
+ isUnique: z.boolean().nullable(),
83
+ isPrimary: z.boolean().nullable(),
84
+ });
85
+
86
+ export const databasePolicySchema = z.object({
87
+ tableName: z.string(),
88
+ policyName: z.string(),
89
+ cmd: z.string(),
90
+ roles: z.array(z.string()),
91
+ qual: z.string().nullable(),
92
+ withCheck: z.string().nullable(),
93
+ });
94
+
95
+ export const databaseTriggerSchema = z.object({
96
+ tableName: z.string(),
97
+ triggerName: z.string(),
98
+ actionTiming: z.string(),
99
+ eventManipulation: z.string(),
100
+ actionOrientation: z.string(),
101
+ actionCondition: z.string().nullable(),
102
+ actionStatement: z.string(),
103
+ });
104
+
105
+ export type DatabaseFunction = z.infer<typeof databaseFunctionSchema>;
106
+ export type DatabaseIndex = z.infer<typeof databaseIndexSchema>;
107
+ export type DatabasePolicy = z.infer<typeof databasePolicySchema>;
108
+ export type DatabaseTrigger = z.infer<typeof databaseTriggerSchema>;
@@ -0,0 +1,26 @@
1
+ import { z } from 'zod';
2
+
3
+ export const docTypeSchema = z
4
+ .enum([
5
+ 'instructions',
6
+ 'db-sdk',
7
+ 'storage-sdk',
8
+ 'functions-sdk',
9
+ 'ai-integration-sdk',
10
+ 'auth-components-react',
11
+ 'real-time',
12
+ ])
13
+ .describe(
14
+ `
15
+ Documentation type:
16
+ "instructions" (essential backend setup - use FIRST),
17
+ "db-sdk" (database operations),
18
+ "storage-sdk" (file storage),
19
+ "functions-sdk" (edge functions),
20
+ "auth-components-react" (authentication components for React+Vite applications),
21
+ "ai-integration-sdk" (AI features),
22
+ "real-time" (real-time pub/sub through WebSockets)
23
+ `
24
+ );
25
+
26
+ export type DocTypeSchema = z.infer<typeof docTypeSchema>;
@@ -0,0 +1,30 @@
1
+ import { z } from 'zod';
2
+ import { emailSchema } from './auth.schema';
3
+
4
+ const emailOrEmails = z.union([
5
+ emailSchema,
6
+ z
7
+ .array(emailSchema)
8
+ .min(1, 'At least one email is required')
9
+ .max(50, 'Maximum 50 recipients allowed'),
10
+ ]);
11
+
12
+ export const sendRawEmailRequestSchema = z.object({
13
+ to: emailOrEmails,
14
+ subject: z.string().trim().min(1, 'Subject is required').max(500, 'Subject too long'),
15
+ html: z.string().trim().min(1, 'HTML content is required'),
16
+ cc: emailOrEmails.optional(),
17
+ bcc: emailOrEmails.optional(),
18
+ from: z.string().trim().max(100, 'From name too long').optional(),
19
+ replyTo: z.string().email('Reply-To must be a valid email').optional(),
20
+ });
21
+
22
+ export type SendRawEmailRequest = z.infer<typeof sendRawEmailRequestSchema>;
23
+
24
+ /**
25
+ * Response for POST /api/email/send-raw
26
+ * Empty on success - extend with optional fields later if needed
27
+ */
28
+ export const sendEmailResponseSchema = z.object({});
29
+
30
+ export type SendEmailResponse = z.infer<typeof sendEmailResponseSchema>;
@@ -12,3 +12,7 @@ export * from './logs-api.schema';
12
12
  export * from './functions.schema';
13
13
  export * from './functions-api.schema';
14
14
  export * from './cloud-events.schema';
15
+ export * from './realtime.schema';
16
+ export * from './realtime-api.schema';
17
+ export * from './docs.schema';
18
+ export * from './email-api.schema';
@@ -1,6 +1,8 @@
1
1
  import { z } from 'zod';
2
2
  import { storageBucketSchema } from './storage.schema';
3
3
  import { oAuthConfigSchema } from './auth.schema';
4
+ import { realtimeChannelSchema } from './realtime.schema';
5
+ import { realtimePermissionsResponseSchema } from './realtime-api.schema';
4
6
 
5
7
  export const authMetadataSchema = z.object({
6
8
  oauths: z.array(oAuthConfigSchema),
@@ -43,12 +45,18 @@ export const aiMetadataSchema = z.object({
43
45
  ),
44
46
  });
45
47
 
48
+ export const realtimeMetadataSchema = z.object({
49
+ channels: z.array(realtimeChannelSchema),
50
+ permissions: realtimePermissionsResponseSchema,
51
+ });
52
+
46
53
  export const appMetaDataSchema = z.object({
47
54
  auth: authMetadataSchema,
48
55
  database: databaseMetadataSchema,
49
56
  storage: storageMetadataSchema,
50
57
  aiIntegration: aiMetadataSchema.optional(),
51
58
  functions: z.array(edgeFunctionMetadataSchema),
59
+ realtime: realtimeMetadataSchema.optional(),
52
60
  version: z.string().optional(),
53
61
  });
54
62
 
@@ -58,4 +66,5 @@ export type BucketMetadataSchema = z.infer<typeof bucketMetadataSchema>;
58
66
  export type StorageMetadataSchema = z.infer<typeof storageMetadataSchema>;
59
67
  export type EdgeFunctionMetadataSchema = z.infer<typeof edgeFunctionMetadataSchema>;
60
68
  export type AIMetadataSchema = z.infer<typeof aiMetadataSchema>;
69
+ export type RealtimeMetadataSchema = z.infer<typeof realtimeMetadataSchema>;
61
70
  export type AppMetadataSchema = z.infer<typeof appMetaDataSchema>;
@@ -0,0 +1,111 @@
1
+ import { z } from 'zod';
2
+ import { realtimeChannelSchema, realtimeMessageSchema } from './realtime.schema';
3
+
4
+ // ============================================================================
5
+ // Channel CRUD Schemas
6
+ // ============================================================================
7
+
8
+ // Create Channel
9
+ export const createChannelRequestSchema = z.object({
10
+ pattern: z.string().min(1, 'Channel pattern is required'),
11
+ description: z.string().optional(),
12
+ webhookUrls: z.array(z.string().url()).optional(),
13
+ enabled: z.boolean().optional().default(true),
14
+ });
15
+
16
+ export const createChannelResponseSchema = realtimeChannelSchema;
17
+
18
+ export type CreateChannelRequest = z.infer<typeof createChannelRequestSchema>;
19
+ export type CreateChannelResponse = z.infer<typeof createChannelResponseSchema>;
20
+
21
+ // Update Channel
22
+ export const updateChannelRequestSchema = z.object({
23
+ pattern: z.string().min(1).optional(),
24
+ description: z.string().optional(),
25
+ webhookUrls: z.array(z.string().url()).optional(),
26
+ enabled: z.boolean().optional(),
27
+ });
28
+
29
+ export const updateChannelResponseSchema = realtimeChannelSchema;
30
+
31
+ export type UpdateChannelRequest = z.infer<typeof updateChannelRequestSchema>;
32
+ export type UpdateChannelResponse = z.infer<typeof updateChannelResponseSchema>;
33
+
34
+ // Get Channel
35
+ export const getChannelResponseSchema = realtimeChannelSchema;
36
+
37
+ export type GetChannelResponse = z.infer<typeof getChannelResponseSchema>;
38
+
39
+ // List Channels
40
+ export const listChannelsResponseSchema = z.array(realtimeChannelSchema);
41
+
42
+ export type ListChannelsResponse = z.infer<typeof listChannelsResponseSchema>;
43
+
44
+ // Delete Channel
45
+ export const deleteChannelResponseSchema = z.object({
46
+ message: z.string(),
47
+ });
48
+
49
+ export type DeleteChannelResponse = z.infer<typeof deleteChannelResponseSchema>;
50
+
51
+ // ============================================================================
52
+ // Message Schemas
53
+ // ============================================================================
54
+
55
+ // List Messages
56
+ export const listMessagesRequestSchema = z.object({
57
+ channelId: z.string().uuid().optional(),
58
+ eventName: z.string().optional(),
59
+ limit: z.coerce.number().int().min(1).max(1000).optional().default(100),
60
+ offset: z.coerce.number().int().min(0).optional().default(0),
61
+ });
62
+
63
+ export const listMessagesResponseSchema = z.array(realtimeMessageSchema);
64
+
65
+ export type ListMessagesRequest = z.infer<typeof listMessagesRequestSchema>;
66
+ export type ListMessagesResponse = z.infer<typeof listMessagesResponseSchema>;
67
+
68
+ // Message Stats
69
+ export const messageStatsRequestSchema = z.object({
70
+ channelId: z.string().uuid().optional(),
71
+ since: z.coerce.date().optional(),
72
+ });
73
+
74
+ export const messageStatsResponseSchema = z.object({
75
+ totalMessages: z.number().int().min(0),
76
+ whDeliveryRate: z.number().min(0).max(1),
77
+ topEvents: z.array(
78
+ z.object({
79
+ eventName: z.string(),
80
+ count: z.number().int().min(0),
81
+ })
82
+ ),
83
+ });
84
+
85
+ export type MessageStatsRequest = z.infer<typeof messageStatsRequestSchema>;
86
+ export type MessageStatsResponse = z.infer<typeof messageStatsResponseSchema>;
87
+
88
+ // ============================================================================
89
+ // Permissions Schemas
90
+ // ============================================================================
91
+
92
+ export const rlsPolicySchema = z.object({
93
+ policyName: z.string(),
94
+ tableName: z.string(),
95
+ command: z.string(),
96
+ roles: z.array(z.string()),
97
+ using: z.string().nullable(),
98
+ withCheck: z.string().nullable(),
99
+ });
100
+
101
+ export const realtimePermissionsResponseSchema = z.object({
102
+ subscribe: z.object({
103
+ policies: z.array(rlsPolicySchema),
104
+ }),
105
+ publish: z.object({
106
+ policies: z.array(rlsPolicySchema),
107
+ }),
108
+ });
109
+
110
+ export type RlsPolicy = z.infer<typeof rlsPolicySchema>;
111
+ export type RealtimePermissionsResponse = z.infer<typeof realtimePermissionsResponseSchema>;
@@ -0,0 +1,143 @@
1
+ import { z } from 'zod';
2
+
3
+ // ============================================================================
4
+ // Sender Type
5
+ // ============================================================================
6
+
7
+ export const senderTypeSchema = z.enum(['system', 'user']);
8
+
9
+ // ============================================================================
10
+ // Channel Schema
11
+ // ============================================================================
12
+
13
+ export const realtimeChannelSchema = z.object({
14
+ id: z.string().uuid(),
15
+ pattern: z.string().min(1),
16
+ description: z.string().nullable(),
17
+ webhookUrls: z.array(z.string().url()).nullable(),
18
+ enabled: z.boolean(),
19
+ createdAt: z.string().datetime(),
20
+ updatedAt: z.string().datetime(),
21
+ });
22
+
23
+ export type RealtimeChannel = z.infer<typeof realtimeChannelSchema>;
24
+
25
+ // ============================================================================
26
+ // Message Schema
27
+ // ============================================================================
28
+
29
+ export const realtimeMessageSchema = z.object({
30
+ id: z.string().uuid(),
31
+ eventName: z.string().min(1),
32
+ channelId: z.string().uuid().nullable(),
33
+ channelName: z.string().min(1),
34
+ payload: z.record(z.string(), z.unknown()),
35
+ senderType: senderTypeSchema,
36
+ senderId: z.string().uuid().nullable(),
37
+ wsAudienceCount: z.number().int().min(0),
38
+ whAudienceCount: z.number().int().min(0),
39
+ whDeliveredCount: z.number().int().min(0),
40
+ createdAt: z.string().datetime(),
41
+ });
42
+
43
+ export type RealtimeMessage = z.infer<typeof realtimeMessageSchema>;
44
+
45
+ // ============================================================================
46
+ // WebSocket Event Payloads (for SDK/frontend)
47
+ // ============================================================================
48
+
49
+ /**
50
+ * Payload for realtime:subscribe client event
51
+ */
52
+ export const subscribeChannelPayloadSchema = z.object({
53
+ channel: z.string().min(1), // The resolved channel instance, e.g., "order:123"
54
+ });
55
+
56
+ export type SubscribeChannelPayload = z.infer<typeof subscribeChannelPayloadSchema>;
57
+
58
+ export const unsubscribeChannelPayloadSchema = z.object({
59
+ channel: z.string().min(1), // The resolved channel instance, e.g., "order:123"
60
+ });
61
+
62
+ export type UnsubscribeChannelPayload = z.infer<typeof unsubscribeChannelPayloadSchema>;
63
+ /**
64
+ * Payload for realtime:publish client event
65
+ */
66
+ export const publishEventPayloadSchema = z.object({
67
+ channel: z.string().min(1),
68
+ event: z.string().min(1),
69
+ payload: z.record(z.string(), z.unknown()),
70
+ });
71
+
72
+ export type PublishEventPayload = z.infer<typeof publishEventPayloadSchema>;
73
+
74
+ /**
75
+ * Response for subscribe operations (used in Socket.IO ack callbacks)
76
+ */
77
+ export const subscribeResponseSchema = z.discriminatedUnion('ok', [
78
+ z.object({
79
+ ok: z.literal(true),
80
+ channel: z.string().min(1),
81
+ }),
82
+ z.object({
83
+ ok: z.literal(false),
84
+ channel: z.string().min(1),
85
+ error: z.object({
86
+ code: z.string().min(1),
87
+ message: z.string().min(1),
88
+ }),
89
+ }),
90
+ ]);
91
+
92
+ export type SubscribeResponse = z.infer<typeof subscribeResponseSchema>;
93
+
94
+ /**
95
+ * Payload for realtime:error server event (for unsolicited errors like publish failures)
96
+ */
97
+ export const realtimeErrorPayloadSchema = z.object({
98
+ channel: z.string().optional(),
99
+ code: z.string().min(1),
100
+ message: z.string().min(1),
101
+ });
102
+
103
+ export type RealtimeErrorPayload = z.infer<typeof realtimeErrorPayloadSchema>;
104
+
105
+ /**
106
+ * Payload sent to webhook endpoints
107
+ */
108
+ export const webhookMessageSchema = z.object({
109
+ messageId: z.string().uuid(),
110
+ channel: z.string().min(1),
111
+ eventName: z.string().min(1),
112
+ payload: z.record(z.string(), z.unknown()),
113
+ });
114
+
115
+ export type WebhookMessage = z.infer<typeof webhookMessageSchema>;
116
+
117
+ // ============================================================================
118
+ // Socket Message Schema
119
+ // ============================================================================
120
+
121
+ /**
122
+ * Meta object included in all socket messages
123
+ */
124
+ export const socketMessageMetaSchema = z.object({
125
+ channel: z.string().optional(), // Present for room broadcasts
126
+ messageId: z.string().uuid(),
127
+ senderType: senderTypeSchema,
128
+ senderId: z.string().uuid().optional(),
129
+ timestamp: z.string().datetime(),
130
+ });
131
+
132
+ export type SocketMessageMeta = z.infer<typeof socketMessageMetaSchema>;
133
+
134
+ /**
135
+ * Base socket message schema (meta + passthrough for payload)
136
+ */
137
+ export const socketMessageSchema = z
138
+ .object({
139
+ meta: socketMessageMetaSchema,
140
+ })
141
+ .passthrough();
142
+
143
+ export type SocketMessage = z.infer<typeof socketMessageSchema>;
@@ -1,21 +1,21 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2020",
4
- "module": "ESNext",
5
- "lib": ["ES2020"],
6
- "moduleResolution": "bundler",
7
- "resolveJsonModule": true,
8
- "declaration": true,
9
- "declarationMap": true,
10
- "sourceMap": true,
11
- "outDir": "./dist",
12
- "rootDir": "./src",
13
- "strict": true,
14
- "esModuleInterop": true,
15
- "skipLibCheck": true,
16
- "forceConsistentCasingInFileNames": true,
17
- "types": []
18
- },
19
- "include": ["src/**/*"],
20
- "exclude": ["node_modules", "dist"]
21
- }
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2020",
4
+ "module": "ESNext",
5
+ "lib": ["ES2020"],
6
+ "moduleResolution": "bundler",
7
+ "resolveJsonModule": true,
8
+ "declaration": true,
9
+ "declarationMap": true,
10
+ "sourceMap": true,
11
+ "outDir": "./dist",
12
+ "rootDir": "./src",
13
+ "strict": true,
14
+ "esModuleInterop": true,
15
+ "skipLibCheck": true,
16
+ "forceConsistentCasingInFileNames": true,
17
+ "types": []
18
+ },
19
+ "include": ["src/**/*"],
20
+ "exclude": ["node_modules", "dist"]
21
+ }
package/tsconfig.json CHANGED
@@ -1,8 +1,8 @@
1
- {
2
- "files": [],
3
- "references": [
4
- { "path": "./frontend" },
5
- { "path": "./backend" },
6
- { "path": "./shared-schemas" }
7
- ]
1
+ {
2
+ "files": [],
3
+ "references": [
4
+ { "path": "./frontend" },
5
+ { "path": "./backend" },
6
+ { "path": "./shared-schemas" }
7
+ ]
8
8
  }
package/zeabur/README.md CHANGED
@@ -1,13 +1,13 @@
1
- # InsForge Zeabur Template
2
-
3
- Internal template for one-click InsForge deployment on Zeabur.
4
-
5
- ## Deploy
6
-
7
- ```bash
8
- npx zeabur@latest template deploy -f template.yml
9
- ```
10
-
11
- ## Documentation
12
-
13
- - Zeabur docs: https://zeabur.com/docs/en-US/template/template-in-code
1
+ # InsForge Zeabur Template
2
+
3
+ Internal template for one-click InsForge deployment on Zeabur.
4
+
5
+ ## Deploy
6
+
7
+ ```bash
8
+ npx zeabur@latest template deploy -f template.yml
9
+ ```
10
+
11
+ ## Documentation
12
+
13
+ - Zeabur docs: https://zeabur.com/docs/en-US/template/template-in-code