better-supabase 0.5.0 → 0.6.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 (536) hide show
  1. package/README.md +299 -41
  2. package/dist/access-sql-B0dF-SoF.js +181 -0
  3. package/dist/actor-CQTlc1Hh.d.ts +43 -0
  4. package/dist/adapter-Bc1o3zyy.js +1106 -0
  5. package/dist/agents-CVHGd7It.d.ts +94 -0
  6. package/dist/ai-cache-CBWs1W0k.js +80 -0
  7. package/dist/ai-cache-DaDu_G5L.d.ts +64 -0
  8. package/dist/ai-chat-7amvXjmQ.d.ts +590 -0
  9. package/dist/ai-chat-B24UI962.js +743 -0
  10. package/dist/ai-files-CSPNswUY.js +319 -0
  11. package/dist/ai-sdk/agents/index.d.ts +74 -0
  12. package/dist/ai-sdk/agents/index.js +159 -0
  13. package/dist/ai-sdk/batches/index.d.ts +74 -0
  14. package/dist/ai-sdk/batches/index.js +180 -0
  15. package/dist/ai-sdk/cache/index.d.ts +38 -0
  16. package/dist/ai-sdk/cache/index.js +127 -0
  17. package/dist/ai-sdk/chat/index.d.ts +2 -0
  18. package/dist/ai-sdk/chat/index.js +246 -0
  19. package/dist/ai-sdk/embeddings/index.d.ts +3 -0
  20. package/dist/ai-sdk/embeddings/index.js +2 -0
  21. package/dist/ai-sdk/files/index.d.ts +61 -0
  22. package/dist/ai-sdk/files/index.js +111 -0
  23. package/dist/ai-sdk/index.d.ts +145 -0
  24. package/dist/ai-sdk/index.js +174 -0
  25. package/dist/ai-sdk/mcp/index.d.ts +102 -0
  26. package/dist/ai-sdk/mcp/index.js +362 -0
  27. package/dist/ai-sdk/memory/index.d.ts +67 -0
  28. package/dist/ai-sdk/memory/index.js +175 -0
  29. package/dist/ai-sdk/react/index.d.ts +2 -0
  30. package/dist/ai-sdk/react/index.js +3 -0
  31. package/dist/ai-sdk/react/server.d.ts +6 -0
  32. package/dist/ai-sdk/react/server.js +7 -0
  33. package/dist/ai-sdk/workflow/index.d.ts +249 -0
  34. package/dist/ai-sdk/workflow/index.js +575 -0
  35. package/dist/ai-sdk/workflow/react/index.d.ts +20 -0
  36. package/dist/ai-sdk/workflow/react/index.js +66 -0
  37. package/dist/ai-sdk/workflow/react/server.d.ts +10 -0
  38. package/dist/ai-sdk/workflow/react/server.js +12 -0
  39. package/dist/ai-tasks-Cd1HMFvB.d.ts +131 -0
  40. package/dist/announcements-CiyOs-xP.js +107 -0
  41. package/dist/announcements-ZRGnScWI.d.ts +72 -0
  42. package/dist/api-keys-rCGtKaZA.d.ts +156 -0
  43. package/dist/assistant-DwdpDH1q.d.ts +147 -0
  44. package/dist/astro/index.d.ts +86 -0
  45. package/dist/astro/index.js +93 -0
  46. package/dist/attributes-5dYul0u0.js +13 -0
  47. package/dist/auth-link-BjFPqwLz.d.ts +97 -0
  48. package/dist/auth-link-DrDX9KOT.js +114 -0
  49. package/dist/authorization-BFCqamMs.d.ts +172 -0
  50. package/dist/before-route-CnR0C0Jr.js +30 -0
  51. package/dist/bind-Bu_ZNa3W.d.ts +62 -0
  52. package/dist/bind-l4kAvYSv.js +97 -0
  53. package/dist/block-events-CrT8r7Fe.js +76 -0
  54. package/dist/block-fields-GFkxl4dP.js +49 -0
  55. package/dist/block-fields-SJ6fEf3o.d.ts +31 -0
  56. package/dist/block-helpers-CKtbFcRv.d.ts +37 -0
  57. package/dist/block-helpers-DWHxHsEQ.js +190 -0
  58. package/dist/block-hooks-BmjMyXTa.js +114 -0
  59. package/dist/block-hooks-plbZ0AbJ.d.ts +107 -0
  60. package/dist/{kit-transport-DJlHQUBU.js → block-transport-BLr-ZgLc.js} +11 -7
  61. package/dist/block-transport-DvaoPuZ9.d.ts +48 -0
  62. package/dist/blocks/agents/index.d.ts +3 -0
  63. package/dist/blocks/agents/index.js +123 -0
  64. package/dist/blocks/ai-cache/index.d.ts +3 -0
  65. package/dist/blocks/ai-cache/index.js +3 -0
  66. package/dist/blocks/ai-chat/index.d.ts +31 -0
  67. package/dist/blocks/ai-chat/index.js +5 -0
  68. package/dist/blocks/ai-chat/react/index.d.ts +77 -0
  69. package/dist/blocks/ai-chat/react/index.js +387 -0
  70. package/dist/blocks/ai-chat/react/server.d.ts +16 -0
  71. package/dist/blocks/ai-chat/react/server.js +14 -0
  72. package/dist/blocks/ai-files/index.d.ts +14 -0
  73. package/dist/blocks/ai-files/index.js +3 -0
  74. package/dist/blocks/ai-providers/index.d.ts +7 -0
  75. package/dist/blocks/ai-providers/index.js +211 -0
  76. package/dist/blocks/ai-tasks/index.d.ts +3 -0
  77. package/dist/blocks/ai-tasks/index.js +203 -0
  78. package/dist/blocks/announcements/index.d.ts +3 -0
  79. package/dist/blocks/announcements/index.js +3 -0
  80. package/dist/blocks/announcements/react/index.d.ts +31 -0
  81. package/dist/blocks/announcements/react/index.js +86 -0
  82. package/dist/blocks/announcements/react/server.d.ts +6 -0
  83. package/dist/blocks/announcements/react/server.js +7 -0
  84. package/dist/blocks/api-keys/index.d.ts +35 -0
  85. package/dist/blocks/api-keys/index.js +334 -0
  86. package/dist/blocks/attachments/index.d.ts +210 -0
  87. package/dist/blocks/attachments/index.js +222 -0
  88. package/dist/blocks/audit/index.d.ts +366 -0
  89. package/dist/blocks/audit/index.js +714 -0
  90. package/dist/blocks/billing/index.d.ts +265 -0
  91. package/dist/blocks/billing/index.js +400 -0
  92. package/dist/blocks/comments/index.d.ts +200 -0
  93. package/dist/blocks/comments/index.js +207 -0
  94. package/dist/blocks/connectors/index.d.ts +3 -0
  95. package/dist/blocks/connectors/index.js +164 -0
  96. package/dist/blocks/data-lifecycle/index.d.ts +251 -0
  97. package/dist/blocks/data-lifecycle/index.js +353 -0
  98. package/dist/blocks/entitlements/index.d.ts +14 -0
  99. package/dist/blocks/entitlements/index.js +25 -0
  100. package/dist/blocks/flags/index.d.ts +226 -0
  101. package/dist/blocks/flags/index.js +282 -0
  102. package/dist/blocks/inbox/index.d.ts +6 -0
  103. package/dist/blocks/inbox/index.js +499 -0
  104. package/dist/blocks/inbox/react/index.d.ts +2 -0
  105. package/dist/blocks/inbox/react/index.js +225 -0
  106. package/dist/blocks/inbox/react/server.d.ts +10 -0
  107. package/dist/blocks/inbox/react/server.js +12 -0
  108. package/dist/blocks/index.d.ts +65 -0
  109. package/dist/blocks/index.js +77 -0
  110. package/dist/blocks/jobs/index.d.ts +297 -0
  111. package/dist/blocks/jobs/index.js +1051 -0
  112. package/dist/blocks/knowledge/index.d.ts +3 -0
  113. package/dist/blocks/knowledge/index.js +3 -0
  114. package/dist/blocks/memory/index.d.ts +8 -0
  115. package/dist/blocks/memory/index.js +289 -0
  116. package/dist/blocks/notifications/index.d.ts +297 -0
  117. package/dist/blocks/notifications/index.js +425 -0
  118. package/dist/blocks/notifications/react/index.d.ts +44 -0
  119. package/dist/blocks/notifications/react/index.js +67 -0
  120. package/dist/blocks/notifications/react/server.d.ts +6 -0
  121. package/dist/blocks/notifications/react/server.js +7 -0
  122. package/dist/blocks/onboarding/index.d.ts +3 -0
  123. package/dist/blocks/onboarding/index.js +64 -0
  124. package/dist/blocks/onboarding/react/index.d.ts +28 -0
  125. package/dist/blocks/onboarding/react/index.js +78 -0
  126. package/dist/blocks/onboarding/react/server.d.ts +7 -0
  127. package/dist/blocks/onboarding/react/server.js +7 -0
  128. package/dist/blocks/organizations/index.d.ts +241 -0
  129. package/dist/blocks/organizations/index.js +400 -0
  130. package/dist/blocks/outbox/index.d.ts +3 -0
  131. package/dist/blocks/outbox/index.js +266 -0
  132. package/dist/blocks/profiles/index.d.ts +40 -0
  133. package/dist/blocks/profiles/index.js +28 -0
  134. package/dist/blocks/push/index.d.ts +185 -0
  135. package/dist/blocks/push/index.js +258 -0
  136. package/dist/blocks/settings/index.d.ts +89 -0
  137. package/dist/blocks/settings/index.js +104 -0
  138. package/dist/blocks/sso/index.d.ts +198 -0
  139. package/dist/blocks/sso/index.js +1297 -0
  140. package/dist/blocks/usage/index.d.ts +4 -0
  141. package/dist/blocks/usage/index.js +233 -0
  142. package/dist/blocks/waitlist/index.d.ts +117 -0
  143. package/dist/blocks/waitlist/index.js +132 -0
  144. package/dist/blocks/webhooks/index.d.ts +304 -0
  145. package/dist/{webhooks → blocks/webhooks}/index.js +468 -148
  146. package/dist/blocks/workflow-builder/index.d.ts +21 -0
  147. package/dist/blocks/workflow-builder/index.js +5 -0
  148. package/dist/blocks/workflow-builder/react/index.d.ts +47 -0
  149. package/dist/blocks/workflow-builder/react/index.js +119 -0
  150. package/dist/blocks/workflow-builder/react/server.d.ts +8 -0
  151. package/dist/blocks/workflow-builder/react/server.js +11 -0
  152. package/dist/blocks/workflows/index.d.ts +3 -0
  153. package/dist/blocks/workflows/index.js +3 -0
  154. package/dist/blocks/workflows/react/index.d.ts +47 -0
  155. package/dist/blocks/workflows/react/index.js +137 -0
  156. package/dist/blocks/workflows/react/server.d.ts +8 -0
  157. package/dist/blocks/workflows/react/server.js +11 -0
  158. package/dist/{index-SaTsEfGP.d.ts → bucket-Cl46E3jS.d.ts} +134 -91
  159. package/dist/{simplify-_0oUKqCd.js → build-BXIzE6Xv.js} +222 -124
  160. package/dist/{channel-FQW-CnGR.d.ts → channel-_2Mx1Oyu.d.ts} +2 -2
  161. package/dist/channels-CkgQ_X60.js +114 -0
  162. package/dist/chat-sdk/index.d.ts +303 -0
  163. package/dist/chat-sdk/index.js +733 -0
  164. package/dist/chat-sdk/react/index.d.ts +2 -0
  165. package/dist/chat-sdk/react/index.js +3 -0
  166. package/dist/chat-sdk/react/server.d.ts +3 -0
  167. package/dist/chat-sdk/react/server.js +2 -0
  168. package/dist/claims-DDBQT6BK.js +61 -0
  169. package/dist/{claims-BAf6c7is.js → claims-PqzCxaTD.js} +39 -2
  170. package/dist/cli/bin.js +1 -1
  171. package/dist/cli/{codemod-DqV7612m.js → codemod-Bl_tQpHn.js} +105 -2
  172. package/dist/cli/config-B9HkL8nF.js +2 -0
  173. package/dist/cli/config-DU7EJImt.js +49 -0
  174. package/dist/cli/config-NiPxAmUF.js +1077 -0
  175. package/dist/cli/{dist-xn4wlboc.js → dist-DRAVaE6w.js} +111 -1
  176. package/dist/cli/{doctor-L7Z8mYTx.js → doctor-B4JOm_ox.js} +992 -316
  177. package/dist/cli/{env-DmKv_G4A.js → env-CJLbUVPB.js} +1 -1
  178. package/dist/cli/{env-jIFUADLY.js → env-qXgyMV6r.js} +2 -2
  179. package/dist/cli/fresh-import-BeYf9I3x.js +40 -0
  180. package/dist/cli/gen-BGLb_zou.js +3100 -0
  181. package/dist/cli/gen-DAH8FM2W.js +2 -0
  182. package/dist/cli/index.d.ts +44 -5
  183. package/dist/cli/index.js +7 -7
  184. package/dist/cli/{init-Saf5-R9T.js → init-BIIwclPg.js} +242 -27
  185. package/dist/cli/{introspect--H7oGmcd.js → introspect-DNUTuNvb.js} +5 -5
  186. package/dist/cli/{io-k41_z-jT.js → io-DI1mTdSA.js} +12 -3
  187. package/dist/cli/{keys-ByKHnvP9.js → keys-BGCnnb-s.js} +8 -6
  188. package/dist/cli/{ohash-D7bG_EOb.js → ohash-BjQY1cBb.js} +1 -1
  189. package/dist/cli/{openapi-Cp5Fyta-.js → openapi-BlRJ18s3.js} +2 -2
  190. package/dist/cli/{project-B_GeXyHh.js → project-DZRaBaY7.js} +11 -6
  191. package/dist/cli/read-sets-CETOSFx4.js +223 -0
  192. package/dist/cli/{run-BKR2W_79.js → run-DNWxHynX.js} +33 -23
  193. package/dist/cli/{seed-CUlqWh-8.js → seed-DQzqT7LP.js} +8 -6
  194. package/dist/cli/{skills-LJJIhLFR.js → skills-QQs4q68J.js} +3 -2
  195. package/dist/cli/sql-D0GUtUPp.js +536 -0
  196. package/dist/cli/{config-CPVpXP5I.js → supabase-toml-B-bIukQF.js} +72 -942
  197. package/dist/cli/typegen-version-DeFbtzYI.js +8 -0
  198. package/dist/cli/{version-BDJuO0UR.js → version-hr88OZG0.js} +1 -1
  199. package/dist/client/index.d.ts +3 -2
  200. package/dist/client/index.js +11 -71
  201. package/dist/client/native/index.d.ts +228 -0
  202. package/dist/client/native/index.js +361 -0
  203. package/dist/client-CI0Z2zWX.js +277 -0
  204. package/dist/cloud-event-BnmD5fb9.js +46 -0
  205. package/dist/cloud-event-C1JCc1bH.d.ts +50 -0
  206. package/dist/{compiler-BXH_aZ7N.d.ts → compiler-DY_wkj4R.d.ts} +2 -2
  207. package/dist/compose-BIBNgAnq.js +53 -0
  208. package/dist/composite-Bt1YK3Ke.d.ts +146 -0
  209. package/dist/composite-DhE66P5u.js +130 -0
  210. package/dist/config/index.d.ts +6 -4
  211. package/dist/config/index.js +5 -5
  212. package/dist/{config-T_ejwyd3.d.ts → config-D44Y7PAv.d.ts} +406 -205
  213. package/dist/{config-DreERlKo.js → config-Dn7F5k9A.js} +62 -14
  214. package/dist/connector-Dv8kK0MO.d.ts +107 -0
  215. package/dist/connectors-hkLCwyEz.d.ts +120 -0
  216. package/dist/context-BCrWe7ow.d.ts +237 -0
  217. package/dist/credentials/index.d.ts +31 -0
  218. package/dist/credentials/index.js +168 -0
  219. package/dist/cron-DVPUg5k3.js +145 -0
  220. package/dist/csv-CPAzEmB6.js +25 -0
  221. package/dist/db-exception-CnWcYPxL.js +15 -0
  222. package/dist/{define-cNKzqwL_.js → define-B-TVjC25.js} +784 -227
  223. package/dist/{define-Bp_BZa5h.d.ts → define-CJJkkr1-.d.ts} +353 -61
  224. package/dist/edge/index.d.ts +69 -11
  225. package/dist/edge/index.js +191 -75
  226. package/dist/elysia/index.d.ts +59 -0
  227. package/dist/elysia/index.js +62 -0
  228. package/dist/embeddings-4ZvFzjsU.js +127 -0
  229. package/dist/embeddings-C9KGQnXt.d.ts +68 -0
  230. package/dist/{refresh-BTrQ_ZTp.d.ts → ended-jLfvw8h-.d.ts} +20 -2
  231. package/dist/{entitlements-DUxU4oHe.d.ts → entitlements-DHrY2UDZ.d.ts} +16 -7
  232. package/dist/entitlements-DRl6ZJUm.js +24 -0
  233. package/dist/envelope-DqnYGRw7.js +47 -0
  234. package/dist/{errors-DtwXa6b8.js → errors-B11Duf73.js} +82 -13
  235. package/dist/errors-DLjJHPLK.js +44 -0
  236. package/dist/escape-like-DHfx6jRr.js +7 -0
  237. package/dist/escape-like-ImTK0ps_.d.ts +15 -0
  238. package/dist/eve/index.d.ts +220 -0
  239. package/dist/eve/index.js +504 -0
  240. package/dist/eve-gT2Fpjut.d.ts +151 -0
  241. package/dist/events/index.d.ts +4 -3
  242. package/dist/events/index.js +9 -50
  243. package/dist/events-DWDhx77e.d.ts +549 -0
  244. package/dist/executor-Bq28caBo.js +718 -0
  245. package/dist/executor-C-R4pucm.js +83 -0
  246. package/dist/executor-CaWigTyR.d.ts +148 -0
  247. package/dist/executor-D14tGopJ.d.ts +36 -0
  248. package/dist/{executor-Cghdstwu.d.ts → executor-DbvExCFC.d.ts} +7 -1
  249. package/dist/{sql-Coh6n4cC.js → executor-De1Of3m3.js} +210 -11
  250. package/dist/executor-DvsBbNBS.d.ts +261 -0
  251. package/dist/expo/index.d.ts +79 -0
  252. package/dist/expo/index.js +129 -0
  253. package/dist/expo-sqlite/index.d.ts +58 -0
  254. package/dist/expo-sqlite/index.js +104 -0
  255. package/dist/field-errors-BFOa7WhB.d.ts +99 -0
  256. package/dist/field-errors-VF1yb8yI.js +13 -0
  257. package/dist/framework-CONDyPYx.js +51 -0
  258. package/dist/framework-DuVb4Xa8.d.ts +25 -0
  259. package/dist/gateway-C1ssRHnf.d.ts +130 -0
  260. package/dist/graph-BGyLLFLX.js +265 -0
  261. package/dist/h3/index.d.ts +59 -0
  262. package/dist/h3/index.js +55 -0
  263. package/dist/h3/v1/index.d.ts +63 -0
  264. package/dist/h3/v1/index.js +49 -0
  265. package/dist/history-BZih6SFP.js +64 -0
  266. package/dist/hono/index.d.ts +56 -7
  267. package/dist/hono/index.js +97 -45
  268. package/dist/{react-C_s7kiNz.js → hooks-1BTCJsiw.js} +104 -133
  269. package/dist/http-Cv4T29xh.js +40 -0
  270. package/dist/http-DdYadv-o.js +126 -0
  271. package/dist/image-url-pIVlO6R1.js +41 -0
  272. package/dist/impersonation-DcqaTBHx.js +148 -0
  273. package/dist/inbox-i7E1ppo6.d.ts +384 -0
  274. package/dist/index-ACiNPN4Z.d.ts +74 -0
  275. package/dist/{index-DgILJRXj.d.ts → index-Bepi-Hgg.d.ts} +91 -28
  276. package/dist/index-BkWT_uBO.d.ts +51 -0
  277. package/dist/index-BpFYMsi0.d.ts +53 -0
  278. package/dist/{index-C7f8cOBM.d.ts → index-Bxih3l0u.d.ts} +2 -2
  279. package/dist/index-CaxrMD1A.d.ts +1 -0
  280. package/dist/index-ClmjK_o-.d.ts +55 -0
  281. package/dist/index-CtuakVRc.d.ts +267 -0
  282. package/dist/index-D48jVS-N.d.ts +246 -0
  283. package/dist/index-DDrYaUcq.d.ts +138 -0
  284. package/dist/index-DQh4VCc9.d.ts +98 -0
  285. package/dist/{live-D9W2M5aO.d.ts → index-DunNRdnT.d.ts} +136 -38
  286. package/dist/index.d.ts +65 -18
  287. package/dist/index.js +42 -14
  288. package/dist/invalidate-BBqhpxyB.d.ts +19 -0
  289. package/dist/json-CEnpTHlZ.js +16 -0
  290. package/dist/json-schema-CvER4kgT.js +502 -0
  291. package/dist/keys-4MnkWTTh.js +35 -0
  292. package/dist/kit-B5tid-q5.d.ts +60 -0
  293. package/dist/kit-Fm-Fv7q5.js +78 -0
  294. package/dist/knowledge-BXBbT0Tr.d.ts +176 -0
  295. package/dist/knowledge-CDmiMLew.js +255 -0
  296. package/dist/lint/index.d.ts +1 -1
  297. package/dist/lint/index.js +37 -0
  298. package/dist/list/index.d.ts +3 -2
  299. package/dist/list/index.js +1 -444
  300. package/dist/{index-fag8VJZ2.d.ts → list-query-BRt-zDF7.d.ts} +20 -12
  301. package/dist/list-query-gl808ac1.js +459 -0
  302. package/dist/{live-CdJBOc4f.js → live-CTAZQkwl.js} +99 -14
  303. package/dist/logger-DWVYUmwi.d.ts +18 -0
  304. package/dist/mcp/index.d.ts +38 -11
  305. package/dist/mcp/index.js +82 -46
  306. package/dist/mcp/sdk/index.d.ts +105 -0
  307. package/dist/mcp/sdk/index.js +126 -0
  308. package/dist/message-CaKlqdsX.js +219 -0
  309. package/dist/message-CfDoR0Y6.d.ts +94 -0
  310. package/dist/messages-B9-5887d.js +715 -0
  311. package/dist/messages-DYP0sUTe.d.ts +59 -0
  312. package/dist/{mfa-CusDgPaD.d.ts → mfa-Daak8ukG.d.ts} +8 -2
  313. package/dist/modules-DpPwzC7E.d.ts +192 -0
  314. package/dist/modules-dxrVK3ID.js +228 -0
  315. package/dist/nestjs/index.d.ts +68 -0
  316. package/dist/nestjs/index.js +164 -0
  317. package/dist/next/client/index.d.ts +35 -0
  318. package/dist/next/client/index.js +36 -0
  319. package/dist/next/image/index.js +3 -24
  320. package/dist/next/index.d.ts +150 -51
  321. package/dist/next/index.js +261 -107
  322. package/dist/node/index.d.ts +4 -0
  323. package/dist/node/index.js +210 -0
  324. package/dist/node-headers-AO06VhqH.d.ts +24 -0
  325. package/dist/node-headers-C71zNQHe.js +55 -0
  326. package/dist/nuxt/index.d.ts +60 -0
  327. package/dist/nuxt/index.js +64 -0
  328. package/dist/onboarding-BZGHYJks.d.ts +62 -0
  329. package/dist/openapi/index.d.ts +1 -1
  330. package/dist/openapi/index.js +3 -3
  331. package/dist/orpc/index.d.ts +70 -11
  332. package/dist/orpc/index.js +73 -24
  333. package/dist/otel/index.d.ts +7 -7
  334. package/dist/otel/index.js +87 -57
  335. package/dist/outbox-Cq7pPYvl.d.ts +161 -0
  336. package/dist/{plugin-o144f322.d.ts → plugin-FGY8UhYm.d.ts} +30 -10
  337. package/dist/plugin-tfXW1-qO.js +45 -0
  338. package/dist/plugins/actor/index.d.ts +2 -2
  339. package/dist/plugins/actor/index.js +3 -3
  340. package/dist/plugins/rules/index.d.ts +11 -4
  341. package/dist/plugins/rules/index.js +40 -13
  342. package/dist/plugins/soft-delete/index.d.ts +5 -4
  343. package/dist/plugins/soft-delete/index.js +10 -5
  344. package/dist/plugins/tenant/index.d.ts +2 -2
  345. package/dist/plugins/tenant/index.js +18 -11
  346. package/dist/plugins/timestamps/index.d.ts +5 -3
  347. package/dist/plugins/timestamps/index.js +6 -4
  348. package/dist/plugins/validation/index.d.ts +2 -2
  349. package/dist/plugins/validation/index.js +10 -6
  350. package/dist/{pool-C9voM4Kw.d.ts → pool-CAu2nLrL.d.ts} +2 -2
  351. package/dist/postgres/index.d.ts +4 -4
  352. package/dist/postgres/index.js +1 -2
  353. package/dist/{postgrest-CruYKAvV.d.ts → postgrest-BLVdEnfe.d.ts} +13 -3
  354. package/dist/powersync/index.d.ts +43 -0
  355. package/dist/powersync/index.js +199 -0
  356. package/dist/powersync/react/index.d.ts +87 -0
  357. package/dist/powersync/react/index.js +108 -0
  358. package/dist/{problem-BW1KhzSG.js → problem-BreOl8b8.js} +14 -3
  359. package/dist/{problem-Blxe8S31.d.ts → problem-DD8LZFjc.d.ts} +21 -3
  360. package/dist/provider-BH5UWZJ6.d.ts +113 -0
  361. package/dist/provider-Di3sRutW.js +57 -0
  362. package/dist/query/index.d.ts +4 -2
  363. package/dist/query/index.js +4 -3
  364. package/dist/{query-CCbo44lG.js → query-BQ-NaZon.js} +141 -24
  365. package/dist/{queue-BYUCjr59.d.ts → queue-CLJurhdy.d.ts} +258 -83
  366. package/dist/react/index.d.ts +11 -7
  367. package/dist/react/index.js +7 -3
  368. package/dist/react/native/index.d.ts +116 -0
  369. package/dist/react/native/index.js +130 -0
  370. package/dist/react/server.d.ts +28 -10
  371. package/dist/react/server.js +22 -5
  372. package/dist/react/session.d.ts +2 -2
  373. package/dist/react-4ZqkP8da.js +79 -0
  374. package/dist/react-F80mF4-t.js +409 -0
  375. package/dist/react-router/index.d.ts +83 -0
  376. package/dist/react-router/index.js +89 -0
  377. package/dist/react-topic-seAWjL3_.js +38 -0
  378. package/dist/{read-set-DQFt1N_Y.js → read-set-DuKWC9Mj.js} +67 -25
  379. package/dist/realtime/index.d.ts +4 -5
  380. package/dist/realtime/index.js +144 -82
  381. package/dist/refusal-CeJWxmkH.js +61 -0
  382. package/dist/refusal-D1rgbzNq.d.ts +15 -0
  383. package/dist/replicas-CwrYp5Zj.js +94 -0
  384. package/dist/{view-Bq64ki8-.js → resolve-D_IcnvFd.js} +239 -289
  385. package/dist/{resolve-C15TJq77.d.ts → resolve-KW8nCeL6.d.ts} +29 -45
  386. package/dist/{resource-CRxxwkQq.js → resource-BsvzCMlX.js} +4 -4
  387. package/dist/{resource-D8iqWMr-.d.ts → resource-D6Uc7Sk7.d.ts} +5 -5
  388. package/dist/respond-BUgsXNgk.js +91 -0
  389. package/dist/respond-DoBijysA.d.ts +93 -0
  390. package/dist/result-D7y2fT87.d.ts +282 -0
  391. package/dist/{result-BKiliPY7.js → result-DzUbqgdW.js} +27 -2
  392. package/dist/run-state-CPo-1X2B.d.ts +12 -0
  393. package/dist/run-state-CgBKzYMW.js +13 -0
  394. package/dist/search-CUWCRYKL.js +9 -0
  395. package/dist/server/index.d.ts +143 -21
  396. package/dist/server/index.js +46 -14
  397. package/dist/{respond-D2OQl62-.d.ts → server-CeVeeXwz.d.ts} +225 -80
  398. package/dist/session-ChiXDZdZ.d.ts +72 -0
  399. package/dist/shared-CBxosKK3.js +75 -0
  400. package/dist/{shared-D1dRUrAg.js → shared-CxWmcyqB.js} +2 -1
  401. package/dist/shared-DDSjEGDR.d.ts +11 -0
  402. package/dist/sign-in-BCV5S2WZ.d.ts +49 -0
  403. package/dist/sign-in-Cb1mwv6X.js +86 -0
  404. package/dist/{signers-Cc6r98SW.d.ts → signers-4y62_VIi.d.ts} +13 -9
  405. package/dist/simplify-DDO0j0LI.js +83 -0
  406. package/dist/solid/index.d.ts +131 -0
  407. package/dist/solid/index.js +344 -0
  408. package/dist/solid-start/index.d.ts +75 -0
  409. package/dist/solid-start/index.js +58 -0
  410. package/dist/{spec-pins-C3oc-Tdp.js → spec-pins--j6mTok4.js} +8 -1
  411. package/dist/{spec-pins-CqorWDnO.d.ts → spec-pins-C89s6DyW.d.ts} +7 -0
  412. package/dist/sql/index.d.ts +330 -194
  413. package/dist/sql/index.js +34901 -6489
  414. package/dist/ssr/index.d.ts +6 -5
  415. package/dist/ssr/index.js +3 -3
  416. package/dist/{standard-D7r6dMUu.js → standard-BK0cqJ7y.js} +4 -3
  417. package/dist/{standard-J4YgMOLm.d.ts → standard-CYsm7xpT.d.ts} +1 -1
  418. package/dist/stats-D_AD9GGu.js +1123 -0
  419. package/dist/storage/index.d.ts +5 -5
  420. package/dist/storage/index.js +1027 -368
  421. package/dist/store-BdH5ruDx.js +66 -0
  422. package/dist/store-CGjgWu5n.d.ts +68 -0
  423. package/dist/streams/index.d.ts +76 -0
  424. package/dist/streams/index.js +77 -0
  425. package/dist/streams/redis/index.d.ts +52 -0
  426. package/dist/streams/redis/index.js +185 -0
  427. package/dist/stripe-BMj5LtsT.js +38 -0
  428. package/dist/stripe-D04h-QBT.d.ts +136 -0
  429. package/dist/{support-Dk6vdmEw.js → support-BivNqSpK.js} +35 -12
  430. package/dist/{support-view-Da5peKFg.d.ts → support-view-33Oi07TT.d.ts} +1 -1
  431. package/dist/svelte/index.d.ts +114 -0
  432. package/dist/svelte/index.js +344 -0
  433. package/dist/sveltekit/index.d.ts +116 -0
  434. package/dist/sveltekit/index.js +106 -0
  435. package/dist/tags-B99_U9Pp.js +39 -0
  436. package/dist/tags-Cx-LnIQP.d.ts +30 -0
  437. package/dist/tanstack-db/index.d.ts +71 -0
  438. package/dist/tanstack-db/index.js +72 -0
  439. package/dist/tanstack-start/index.d.ts +75 -0
  440. package/dist/tanstack-start/index.js +95 -0
  441. package/dist/tee-CoEppCER.js +101 -0
  442. package/dist/{template-TxrGI5jR.js → template--jDkl3UP.js} +34 -13
  443. package/dist/template-CwO38Do8.d.ts +6 -0
  444. package/dist/temporal-BJGitm-h.js +79 -0
  445. package/dist/{temporal-required-CAt4Dc9Z.js → temporal-required-BVvW7SYJ.js} +3 -2
  446. package/dist/tenant-I1TEZ_BX.js +27 -0
  447. package/dist/tenant-icPeuUBN.d.ts +17 -0
  448. package/dist/testing/index.d.ts +343 -37
  449. package/dist/testing/index.js +1186 -79
  450. package/dist/timing-CyTQPubY.js +92 -0
  451. package/dist/ttl-Hr34gRu8.js +12 -0
  452. package/dist/{types-Dnf_wRDz.d.ts → types-6BdhkmZe.d.ts} +111 -45
  453. package/dist/types-BI-0Sl2v.d.ts +359 -0
  454. package/dist/types-C05bxW-W.d.ts +220 -0
  455. package/dist/types-DGs5L0VN.d.ts +192 -0
  456. package/dist/types-TaiEeBGA.d.ts +156 -0
  457. package/dist/usage-CrvrL2vw.d.ts +177 -0
  458. package/dist/user-change-XzvgafU4.js +130 -0
  459. package/dist/vault-CSO7ss5C.d.ts +50 -0
  460. package/dist/vercel-connect/index.d.ts +47 -0
  461. package/dist/vercel-connect/index.js +119 -0
  462. package/dist/{verify-Ce49ETPz.js → verify-DL41hbvY.js} +85 -13
  463. package/dist/verify-DPuWngD4.d.ts +172 -0
  464. package/dist/{version-DM_Roffb.js → version-Bvv6aLjZ.js} +1 -1
  465. package/dist/view-BeFcRV6G.js +99 -0
  466. package/dist/{view-BEf0diC5.d.ts → view-DbxLNu8L.d.ts} +35 -32
  467. package/dist/vue/index.d.ts +141 -0
  468. package/dist/vue/index.js +362 -0
  469. package/dist/watch-DI34G86j.d.ts +60 -0
  470. package/dist/watch-Xuxrvxq-.js +122 -0
  471. package/dist/{wire-D2dT86vi.js → wire-DtZQ4sdE.js} +15 -5
  472. package/dist/workflow-builder-DJ1oHn8g.js +398 -0
  473. package/dist/workflow-sdk/builder/index.d.ts +85 -0
  474. package/dist/workflow-sdk/builder/index.js +250 -0
  475. package/dist/workflow-sdk/index.d.ts +14 -0
  476. package/dist/workflow-sdk/index.js +3 -0
  477. package/dist/workflow-sdk/world/index.d.ts +107 -0
  478. package/dist/workflow-sdk/world/index.js +702 -0
  479. package/dist/workflow-sdk-B3yLD6Br.d.ts +98 -0
  480. package/dist/workflow-sdk-C2WJ_G2O.js +173 -0
  481. package/dist/workflow-sdk-world-D-prir6O.js +1397 -0
  482. package/dist/workflows-B0j9WKPu.d.ts +185 -0
  483. package/dist/workflows-wu1WWBn7.js +216 -0
  484. package/package.json +470 -29
  485. package/schemas/ai-message-v1.json +258 -0
  486. package/schemas/config-v1.json +1074 -140
  487. package/schemas/doctor-report-v1.json +21 -1
  488. package/schemas/snapshot-v2.json +8 -0
  489. package/skills/better-supabase/SKILL.md +41 -12
  490. package/skills/better-supabase/references/frontend.md +96 -0
  491. package/skills/better-supabase/references/plugins.md +10 -6
  492. package/skills/better-supabase/references/troubleshooting.md +2 -1
  493. package/skills/better-supabase-api/SKILL.md +76 -22
  494. package/skills/better-supabase-api/references/adapters.md +207 -0
  495. package/skills/better-supabase-api/references/ai.md +125 -0
  496. package/skills/better-supabase-api/references/expo.md +65 -0
  497. package/skills/better-supabase-api/references/powersync.md +35 -0
  498. package/skills/better-supabase-api/references/streams-credentials.md +105 -0
  499. package/skills/better-supabase-auth/SKILL.md +62 -18
  500. package/skills/better-supabase-auth/references/authorization-providers.md +51 -0
  501. package/skills/better-supabase-testing/SKILL.md +3 -1
  502. package/dist/cli/config-dtoekM0v.js +0 -2
  503. package/dist/cli/gen-BJc9vdyu.js +0 -2
  504. package/dist/cli/gen-C2osRcr5.js +0 -2204
  505. package/dist/cli/read-sets-BfMQcKy8.js +0 -289
  506. package/dist/cli/sql-DzPbfngx.js +0 -348
  507. package/dist/entitlements-CTEBm7IB.js +0 -20
  508. package/dist/events-aIO7vsIk.d.ts +0 -230
  509. package/dist/executor-BunPOO-k.d.ts +0 -402
  510. package/dist/executor-XycESQPH.js +0 -94
  511. package/dist/impersonation-VfaGc4Q_.js +0 -41
  512. package/dist/index-BGdgBPdf.d.ts +0 -161
  513. package/dist/index-DOESKG27.d.ts +0 -100
  514. package/dist/index-DmXSxbLi.d.ts +0 -62
  515. package/dist/index-Dxn2a5cw.d.ts +0 -50
  516. package/dist/jobs/index.d.ts +0 -226
  517. package/dist/jobs/index.js +0 -1007
  518. package/dist/json-schema-m1fiwKgN.js +0 -208
  519. package/dist/kit-events-CTFDfSwb.js +0 -60
  520. package/dist/kit-transport-B82k1djG.d.ts +0 -33
  521. package/dist/kits-CGLLrNPd.js +0 -157
  522. package/dist/notifications/index.d.ts +0 -162
  523. package/dist/notifications/index.js +0 -264
  524. package/dist/orgs/index.d.ts +0 -132
  525. package/dist/orgs/index.js +0 -245
  526. package/dist/permdock-sql-C2Inc6Xc.d.ts +0 -29
  527. package/dist/permdock-sql-DgOfeixi.js +0 -51
  528. package/dist/plugin-DwARMuQp.js +0 -59
  529. package/dist/server-Csx2sRjg.js +0 -655
  530. package/dist/stats-Bqob3WqT.js +0 -592
  531. package/dist/support-DT-OhSxD.d.ts +0 -88
  532. package/dist/template-mbvlysOo.d.ts +0 -6
  533. package/dist/temporal-CVlIV2DZ.js +0 -40
  534. package/dist/user-change-CHFEUro1.js +0 -49
  535. package/dist/webhooks/index.d.ts +0 -285
  536. package/skills/better-supabase-auth/references/permdock.md +0 -100
@@ -82,6 +82,25 @@ export const router = {
82
82
  };
83
83
  ```
84
84
 
85
+ For a contract from `@orpc/contract`, use the same middleware on the
86
+ implementer and serve it with `OpenAPIHandler`, so errors keep their HTTP
87
+ status (RLS denials answer 403):
88
+
89
+ ```ts title="src/server.ts"
90
+ const os = implement(contract)
91
+ .$context<OrpcRequestContext>()
92
+ .use(bs.middleware());
93
+ const router = os.router({
94
+ customers: {
95
+ get: os.customers.get.handler(({ context, input }) =>
96
+ bs.unwrap(context.db.customers.findById(input.id)),
97
+ ),
98
+ },
99
+ });
100
+ const handle = bs.fetchHandler(new OpenAPIHandler(router), { prefix: "/api" });
101
+ const app = new Hono().all("/api/*", (c) => handle(c.req.raw));
102
+ ```
103
+
85
104
  ## Edge Functions
86
105
 
87
106
  ```ts title="supabase/functions/api/index.ts"
@@ -96,6 +115,152 @@ Deno.serve(
96
115
  );
97
116
  ```
98
117
 
118
+ ## Middleware entries and bridges
119
+
120
+ `withBetterSupabase(server, { allow })` from `better-supabase/server` is one
121
+ `@supabase/middleware` entry: it resolves the caller, guards, and contributes
122
+ `bs`, `db`, `sql`, `jwtClaims`, `userClaims` and `authMode`. Put
123
+ `withPostgresClient` or `withCors` next to it, then run the array with the
124
+ bridge for the framework:
125
+
126
+ ```ts title="src/hooks.server.ts"
127
+ import { createServer, withBetterSupabase } from "better-supabase/server";
128
+ import { toSvelteKit } from "better-supabase/sveltekit";
129
+
130
+ import { betterSupabase } from "$lib/supabase";
131
+
132
+ export const handle = toSvelteKit([
133
+ withBetterSupabase(createServer(betterSupabase), {
134
+ refresh: true,
135
+ allow: ["user", "anon"],
136
+ }),
137
+ ]);
138
+ ```
139
+
140
+ | Framework | Bridge | Where the keys land |
141
+ | ------------------- | -------------------------------------------------- | --------------------------------------------------- |
142
+ | Hono | `toHono(entries)` from `better-supabase/hono` | `c.var` |
143
+ | Edge, Deno, Workers | `toEdge(entries, handler)` from `/edge` | the handler's `ctx` |
144
+ | oRPC | `toOrpc(entries, rpcHandler)` from `/orpc` | the initial `context` |
145
+ | Expo API routes | `toExpo(entries, handler)` from `/expo` | the handler's `ctx` |
146
+ | TanStack Start | `toTanStackStart(entries)` from `/tanstack-start` | middleware `context` |
147
+ | SvelteKit | `toSvelteKit(entries)` from `/sveltekit` | `event.locals` |
148
+ | React Router | `toReactRouter(entries, key)` from `/react-router` | `context.get(key)` |
149
+ | H3, Nitro, Nuxt | `toH3(entries)` from `/h3` | `event.context` |
150
+ | Elysia | `toElysia(entries)` from `/elysia` | `.derive(({ request }) => bridge.context(request))` |
151
+ | Nitro 2, Nuxt | `toH3V1(entries)` from `/h3/v1` | `event.context` |
152
+ | Node `http` | `toNodeHandler(entries, handler)` from `/node` | the handler's `ctx` |
153
+ | Express | `toExpress(entries)` from `/node` | `res.locals` |
154
+ | Fastify | `toFastify(entries)` from `/node` | `request.locals` |
155
+ | Koa | `toKoa(entries)` from `/node` | `ctx.state` |
156
+ | NestJS | `toNestMiddleware(entries)` from `/nestjs` | `@Ctx("db")` in a controller |
157
+
158
+ Don't use the `@supabase/server/adapters/*` adapters: they are deprecated and
159
+ removed on 2026-12-01. Don't put `withSupabase` and `withBetterSupabase` in
160
+ one array; they write the same keys and the type checker rejects it. Set
161
+ `refresh: true` only on the bridge that runs once per request with a response
162
+ (request middleware, the `handle` hook), never in Server Components.
163
+
164
+ ## Node, Express, Fastify and Koa
165
+
166
+ `better-supabase/node` types each framework structurally, so it adds no
167
+ dependency. Each bridge has a guard and an error handler that answers
168
+ `.orThrow()` failures with Problem Details:
169
+
170
+ ```ts title="app.ts"
171
+ import express from "express";
172
+ import { guard, problemErrorHandler, toExpress } from "better-supabase/node";
173
+ import { withBetterSupabase } from "better-supabase/server";
174
+
175
+ import { bs } from "./lib/server";
176
+
177
+ const app = express();
178
+ app.use(
179
+ toExpress([
180
+ withBetterSupabase(bs, { refresh: true, allow: ["user", "anon"] }),
181
+ ]),
182
+ );
183
+ app.get("/admin/members", guard({ roles: ["admin"] }), async (req, res) => {
184
+ res.json(await res.locals.db.members.findMany().orThrow());
185
+ });
186
+ app.use(problemErrorHandler());
187
+ ```
188
+
189
+ | Framework | Bridge | Guard | Errors |
190
+ | ----------- | ----------------------------------- | --------------------------------------- | ----------------------- |
191
+ | `node:http` | `toNodeHandler(entries, handler)` | `allow` on `withBetterSupabase` | the handler's `Result` |
192
+ | Express | `toExpress(entries)` | `guard(options)` per route | `problemErrorHandler()` |
193
+ | Fastify | `toFastify(entries)` in `onRequest` | `fastifyGuard(options)` as `preHandler` | `problemErrorHandler()` |
194
+ | Koa | `toKoa(entries)` | `koaGuard(options)` | built into `toKoa` |
195
+
196
+ For Fastify, call `app.decorateRequest("locals", null)` first. Type
197
+ Express's `res.locals` by extending `Express.Locals` with
198
+ `BetterSupabaseContributions<Models, Functions, unknown>` from
199
+ `better-supabase/server`.
200
+
201
+ ## NestJS
202
+
203
+ ```ts title="src/app.module.ts"
204
+ consumer
205
+ .apply(toNestMiddleware([withBetterSupabase(bs, { allow: ["user"] })]))
206
+ .forRoutes("*");
207
+ ```
208
+
209
+ ```ts title="src/notes.controller.ts"
210
+ import { Controller, Get, UseFilters, UseGuards } from "@nestjs/common";
211
+ import { Ctx, guard, problemFilter } from "better-supabase/nestjs";
212
+
213
+ @Controller("notes")
214
+ @UseFilters(problemFilter())
215
+ export class NotesController {
216
+ @Get()
217
+ @UseGuards(guard({ roles: ["admin"] }))
218
+ list(@Ctx("db") db: Db) {
219
+ return db.notes.findMany({ select: ["id", "title"] }).orThrow();
220
+ }
221
+ }
222
+ ```
223
+
224
+ ## Astro and SolidStart
225
+
226
+ ```ts title="src/lib/server.ts"
227
+ import { createAstro } from "better-supabase/astro";
228
+
229
+ export const bs = createAstro(betterSupabase, { signIn: "/sign-in" });
230
+ // src/middleware.ts: export const onRequest = bs.onRequest;
231
+ ```
232
+
233
+ In a page, `const refused = await bs.guard(Astro, { roles: ["admin"] })`
234
+ returns the refusal to send, and `bs.locals(Astro).db` is the caller's
235
+ `db`. Wrap an Action's handler with `bs.action({ input, requireTenant }, fn)`.
236
+ `createImageService({ url })` serves Storage images through Astro's image
237
+ service.
238
+
239
+ ```ts title="src/lib/server.ts"
240
+ import { createSolidStart } from "better-supabase/solid-start";
241
+ import { getRequestEvent } from "solid-js/web";
242
+
243
+ export const bs = createSolidStart(betterSupabase, {
244
+ getRequestEvent,
245
+ signIn: "/sign-in",
246
+ });
247
+ // src/middleware.ts: export default createMiddleware(bs.middleware);
248
+ ```
249
+
250
+ In a `"use server"` query, `const { db } = await bs.require()`; for forms,
251
+ `bs.action({ input }, (input, { db }) => ...)`.
252
+
253
+ ## Nuxt and Nitro 2
254
+
255
+ Export the entries from `server/better-supabase.ts`, register the module
256
+ with `modules: ["better-supabase/nuxt"]` and
257
+ `betterSupabase: { server: "~~/server/better-supabase" }` in
258
+ `nuxt.config.ts`, or run them yourself with
259
+ `defineEventHandler(toH3V1(entries))` from `better-supabase/h3/v1`. Guard a
260
+ route with `(await guard({ roles: ["admin"] })(event)) ?? ...`, and turn
261
+ `.orThrow()` failures into Problem Details with `problemOnError()`. On H3 2
262
+ and Nitro 3, use the same helpers from `better-supabase/h3`.
263
+
99
264
  ## MCP
100
265
 
101
266
  ```ts title="supabase/functions/mcp/index.ts"
@@ -132,3 +297,45 @@ Tools run as the calling user, so RLS applies to every tool call.
132
297
  tokens that lack one, and `authorize` refuses a single call. The session comes
133
298
  from the `Authorization` header only, never from a cookie. A
134
299
  `delegation` that is unset means the user's own token, which no scope limits.
300
+
301
+ On Supabase Edge Functions, set `[functions.mcp] verify_jwt = false` in
302
+ `supabase/config.toml`; the gateway's own 401 has no OAuth challenge. The
303
+ server then derives its public URL from `SUPABASE_FUNCTION_SLUG` and the
304
+ gateway's `X-Forwarded-*` headers and serves the metadata at
305
+ `/functions/v1/mcp/oauth-protected-resource`, so leave `resource` unset there.
306
+ CORS preflights are answered by default (`cors: false` turns them off).
307
+ To keep a Supabase library MCP block's pipeline instead, add
308
+ `withBetterDb(betterSupabase)()` from `better-supabase/server` after its
309
+ `withSupabase` entry for `ctx.db`.
310
+
311
+ ### MCP on the official SDK
312
+
313
+ ```ts title="src/mcp.ts"
314
+ import { createMcpHandler, McpServer } from "@modelcontextprotocol/server";
315
+ import { createMcpAuth, withBetterSupabaseMcp } from "better-supabase/mcp/sdk";
316
+
317
+ import { betterSupabase } from "./lib/supabase/schema";
318
+
319
+ const auth = createMcpAuth(betterSupabase, {
320
+ resource: "https://crm.example.com/mcp",
321
+ advertisedScopes: ["crm.read"],
322
+ });
323
+
324
+ const handler = createMcpHandler(() => {
325
+ const server = withBetterSupabaseMcp(
326
+ new McpServer({ name: "crm", version: "0.1.0" }),
327
+ auth,
328
+ );
329
+ server.registerTool("count_customers", {}, async ({ db }) => {
330
+ const count = await db.customers.count().orThrow();
331
+ return { content: [{ type: "text", text: String(count) }] };
332
+ });
333
+ return server;
334
+ });
335
+
336
+ export default { fetch: auth.serve(handler) };
337
+ ```
338
+
339
+ `auth.serve` answers the RFC 9728 metadata and the 401 challenge, then passes
340
+ the verified `authInfo` to the SDK handler. `auth.verifier` plugs into the
341
+ SDK's own `requireBearerAuth` when you keep your own routing.
@@ -0,0 +1,125 @@
1
+ # AI blocks, agents and SDK adapters
2
+
3
+ The AI blocks store data and never import an AI SDK. The SDK code lives in
4
+ the adapter subpaths (`better-supabase/ai-sdk/*`, `/chat-sdk`, `/eve`) or in
5
+ the app. Each block takes `transport` (calls as the user) and, where it
6
+ writes on the user's behalf, `service` (calls as the service role). Use
7
+ `rpcTransport(supabase)` over PostgREST or `sqlTransport(postgres.asUser(claims))`
8
+ over direct Postgres. Its docs page is
9
+ `https://bettersupabase.com/docs/blocks/<name>.md`.
10
+
11
+ ## Knowledge and memory
12
+
13
+ ```bash
14
+ pnpm better-supabase sql add knowledge memory # adds tenant, access and vector-search
15
+ ```
16
+
17
+ ```ts
18
+ import { embedWith } from "better-supabase/ai-sdk/embeddings";
19
+ import {
20
+ createKnowledge,
21
+ rpcTransport,
22
+ } from "better-supabase/blocks/knowledge";
23
+ import { createMemory } from "better-supabase/blocks/memory";
24
+
25
+ const embedder = embedWith("openai/text-embedding-3-small");
26
+ const knowledge = createKnowledge({
27
+ transport: rpcTransport(supabase),
28
+ service: rpcTransport(admin),
29
+ embedder,
30
+ });
31
+ const memory = createMemory({
32
+ transport: rpcTransport(supabase),
33
+ service: rpcTransport(admin),
34
+ embedder,
35
+ });
36
+ ```
37
+
38
+ - Ingest with `knowledge.ingest.text(organizationId, { title, text, source })`
39
+ and search with `knowledge.search(organizationId, query, { scopes, k })`.
40
+ A scope is `organization`, `user`, `agent` or `chat` (with an `id`).
41
+ - Give the model the knowledge with `searchTool(knowledge, organizationId, { scopes, onHits })`
42
+ and cite with `toSourceParts(hits)`; rerank with `rerankWith(model, { topN })`.
43
+ `supabaseEmbed` uses Supabase's built-in model instead of a gateway model.
44
+ - Memory has files (`memory.run(organizationId, { command, path, ... })`),
45
+ archival facts (`memory.archival.save` and `.search`) and versioned
46
+ documents (`memory.documents.read` and `.write` with `expectedVersion`).
47
+ - In a chat route, from `better-supabase/ai-sdk/memory`: `withMemory(instructions, memory, organizationId)`
48
+ adds the core memory, `memoryTool` and `recallTool` are the tools, and
49
+ `anthropicMemory(anthropic.tools, memory, organizationId)` backs
50
+ Anthropic's built-in memory tool. Run `extractMemories({ model, memory })`
51
+ as a job handler with a service-role `memory`.
52
+
53
+ ## Agents, connectors and scheduled tasks
54
+
55
+ ```bash
56
+ pnpm better-supabase sql add agents connectors ai-tasks
57
+ ```
58
+
59
+ - `createAgents({ transport })` stores assistants: `agents.create(organizationId, { slug, name, instructions, tools, knowledgeScopes })`,
60
+ then `agents.publish(id, "organization")`.
61
+ - Run a stored agent with `createAgentRuntime({ agent, model, tools, policies, knowledge, instructions })`
62
+ from `better-supabase/ai-sdk/agents`, then `runtime.stream({ messages })`.
63
+ Wrap the model with `moderationMiddleware({ chats, organizationId, chatId, check })`
64
+ to check input and output; a blocked turn throws `ModerationBlockedError`.
65
+ - `createConnectors({ transport, service, credentials })` stores MCP servers
66
+ per organization. OAuth servers get one grant per user behind a
67
+ `credential_ref`. From `better-supabase/ai-sdk/mcp`: `authorizeConnector`
68
+ starts the OAuth flow, `completeConnector` finishes it on the callback
69
+ route, and `connectAll(servers, { connectors, userId, vault, credentials, chatKey })`
70
+ returns `{ tools, skipped, close }`. Call `close()` in a `finally`.
71
+ Review changed tool lists with `connectors.fingerprints.check`, `.approve`
72
+ and `.reject`.
73
+ - `createAiTasks({ transport, service, run })` stores scheduled prompts with
74
+ a `cron` and a `timezone`. `tick()` queues the due runs (handle them with
75
+ `runJob()` on the `ai_task_run` queue when the `jobs` module is
76
+ installed); without jobs, call `drain()` from a cron route.
77
+
78
+ ## Files, cache and batches
79
+
80
+ - `aiFileDownload(files)` as `experimental_download` in `streamText` reads
81
+ Storage file parts; `saveGeneratedFiles(files, images, { organizationId, ownerId, chatId })`
82
+ stores generated images; `providerFile(files, fileId, provider, upload)`
83
+ caches a provider's file id. All from `better-supabase/ai-sdk/files`.
84
+ - `aiBatches({ providers })` from `better-supabase/ai-sdk/batches` starts a
85
+ batch per tenant with `.start({ organizationId, userId }, { requests })`,
86
+ polls it with the `pollJob()` handler and pages results with `.results(batchId, { after, limit })`.
87
+
88
+ ## eve (Node only)
89
+
90
+ ```bash
91
+ pnpm add eve @workflow/world @workflow/world-postgres pg
92
+ pnpm better-supabase sql add workflow-sdk-world ai-chat memory knowledge credentials inbox
93
+ ```
94
+
95
+ Set `experimental.workflow.world` to `"better-supabase/workflow-sdk/world"`
96
+ in `defineAgent`, then use the helpers from `better-supabase/eve`:
97
+
98
+ | Helper | Where it goes | What it does |
99
+ | ------------------------- | -------------------------------------- | ------------------------------------------------------- |
100
+ | `supabaseAuth({ env })` | `eveChannel({ auth: [...] })` | signs eve routes in with the Supabase session |
101
+ | `credentialAuth(...)` | a connection's `auth` | resolves the connection's token from a `credential_ref` |
102
+ | `supabaseMemory(...)` | `defineMemoryProvider(...)` | backs eve memory with the memory and knowledge blocks |
103
+ | `supabaseDocumentBackend` | `fileMemory({ backend })` | stores file memory in `memory_documents` |
104
+ | `persistSessions(...)` | `defineHook({ events })` | copies sessions into the AI chat tables |
105
+ | `routeInbox(...)` | `chatSdkChannel()` over `inboxAdapter` | hands inbox conversations in bot mode to eve |
106
+
107
+ ## Chat SDK bots
108
+
109
+ ```bash
110
+ pnpm add chat
111
+ pnpm better-supabase sql add chat-sdk-state inbox
112
+ ```
113
+
114
+ From `better-supabase/chat-sdk`: `createSupabaseState(...)` is the Chat SDK
115
+ state adapter on Postgres, `inboxAdapter(...)` answers in the in-app widget,
116
+ `webhook(...)` receives platform webhooks, `inboundHandler(...).drain()`
117
+ replays them, `deliver(...)` sends staff replies and `maintain(...)` runs on
118
+ a cron. Mirror platform messages into the inbox with
119
+ `handler.mirror(thread, message)`. Platform adapters such as
120
+ `@chat-adapter/slack` are the app's own dependencies.
121
+
122
+ Docs: https://bettersupabase.com/docs/ai-sdk.md (and `agents`, `mcp`,
123
+ `embeddings`, `memory`, `files`, `batches` under `/docs/ai-sdk/`),
124
+ https://bettersupabase.com/docs/eve.md and
125
+ https://bettersupabase.com/docs/chat-sdk.md.
@@ -0,0 +1,65 @@
1
+ # Expo and React Native
2
+
3
+ ## Server (web): `better-supabase/expo`
4
+
5
+ Needs `expo-server` 55 or later and, in `app.json`, `web.output: "server"`
6
+ plus the `expo-router` plugin options `unstable_useServerDataLoaders` and
7
+ `unstable_useServerMiddleware`.
8
+
9
+ ```ts title="src/lib/supabase/server.ts"
10
+ import { createExpo } from "better-supabase/expo";
11
+ import { betterSupabase } from "./index";
12
+
13
+ export const bs = createExpo(betterSupabase);
14
+ ```
15
+
16
+ ```tsx title="src/app/customers/index.tsx"
17
+ export const loader = bs.loader(
18
+ ({ db }) => db.customers.findMany({ select: ["id", "name"] }).orThrow(),
19
+ { allow: ["user"] },
20
+ );
21
+ ```
22
+
23
+ ```ts title="src/app/+middleware.ts"
24
+ export default bs.middleware();
25
+ ```
26
+
27
+ - Loaders run as the caller (bearer token first, then the cookie), so RLS applies.
28
+ - A refused caller and a `DbException` from `.orThrow()` become a `StatusError` with the right status.
29
+ - Only `+middleware.ts` refreshes the session; loaders never do.
30
+ - Loader data is JSON: select the columns the screen needs and turn Temporal values into strings.
31
+ - API routes: `export const GET = bs.handler((request, { db }) => db.customers.findMany())` in `+api.ts`.
32
+
33
+ ## Device: `better-supabase/client/native`
34
+
35
+ ```ts title="src/lib/supabase/native.ts"
36
+ import { createClient } from "@supabase/supabase-js";
37
+ import {
38
+ autoRefreshOnForeground,
39
+ createNativeClient,
40
+ secureStorage,
41
+ } from "better-supabase/client/native";
42
+ import * as SecureStore from "expo-secure-store";
43
+ import { AppState } from "react-native";
44
+
45
+ const supabase = createClient(url, key, {
46
+ auth: {
47
+ storage: secureStorage(SecureStore),
48
+ persistSession: true,
49
+ detectSessionInUrl: false,
50
+ },
51
+ });
52
+ autoRefreshOnForeground(supabase, AppState);
53
+ export const bs = createNativeClient(betterSupabase, supabase);
54
+ ```
55
+
56
+ - `autoRefreshOnForeground(supabase, AppState)` refreshes the session only while the app is active; supabase-js can't detect the background on React Native.
57
+ - Never import `better-supabase/client` on the device: it pulls in `@supabase/ssr`.
58
+ - Hermes has no `Temporal`: `defineSupabase(schema, { temporal: Temporal })` with `temporal-polyfill`, no global install.
59
+ - Put device-only code (SecureStore, PowerSync) in `.native.ts` files or modules only they import.
60
+
61
+ Done when the web export has no `expo-secure-store` or PowerSync code, a loader
62
+ answers 401 for a signed-out request, and a native screen reads with `bs.db`.
63
+
64
+ Docs: https://bettersupabase.com/docs/frameworks/expo.md and
65
+ https://bettersupabase.com/docs/frontend/react-native.md.
@@ -0,0 +1,35 @@
1
+ # PowerSync (offline reads and writes)
2
+
3
+ ```ts title="src/lib/powersync/database.ts"
4
+ import { powersyncExecutor } from "better-supabase/powersync";
5
+
6
+ export const local = betterSupabase.connect(powersyncExecutor(powersync));
7
+ ```
8
+
9
+ - `local.customers.findMany(...)` and `list.run(local, query)` run on the device's SQLite database and return the same rows (casing, Temporal values) as PostgREST.
10
+ - Live results: `watch(powersync, () => list.run(local, query), { tables: sqliteTables(betterSupabase, ["customers"]), onResult })`.
11
+ - Includes, related counts, full-text search, `db.rpc` and writes to tables without a primary key return a `DbError` of kind `unsupported`. Assert `checkSqlite(betterSupabase, list)` in a test for every list a native screen runs.
12
+ - `ilike` is SQLite `like` (case-insensitive for ASCII only).
13
+
14
+ ## Uploading local writes
15
+
16
+ In the connector's `uploadData`, replay each `CrudEntry` through the online
17
+ client's repositories (`bs.db` from `better-supabase/client/native`), so RLS
18
+ and validation run:
19
+
20
+ | `entry.op` | Call |
21
+ | ---------- | ------------------------------------------- |
22
+ | `PUT` | `upsert({ ...entry.opData, id: entry.id })` |
23
+ | `PATCH` | `update(entry.id, entry.opData)` |
24
+ | `DELETE` | `delete(entry.id)` |
25
+
26
+ Decide by `error.kind`, with an exhaustive `switch` ending in a `never` check:
27
+
28
+ - Retry (throw, PowerSync calls again): `network`, `timeout`, `aborted`, `rate_limited`, `serialization`, `unauthorized`, `unexpected`.
29
+ - Conflict (complete, then show it on the row): `conflict`, `stale`, `foreign_key`.
30
+ - Discard (complete): every other kind; the server will never accept it.
31
+
32
+ Never throw for a kind that can't succeed: it blocks the upload queue.
33
+
34
+ Docs: https://bettersupabase.com/docs/repository/powersync.md and
35
+ https://bettersupabase.com/docs/guides/offline-first.md.
@@ -0,0 +1,105 @@
1
+ # Streams, credentials and the Workflow World
2
+
3
+ ## Resumable streams
4
+
5
+ Store long output (a chat answer, a workflow's progress) so a client that
6
+ reconnects reads the rest instead of starting over.
7
+
8
+ ```bash
9
+ pnpm better-supabase sql add streams
10
+ ```
11
+
12
+ ```ts
13
+ import {
14
+ postgresStreamStore,
15
+ resumeFromStore,
16
+ sqlTransport,
17
+ teeToStore,
18
+ } from "better-supabase/streams";
19
+
20
+ const streams = postgresStreamStore({
21
+ transport: sqlTransport(postgres.asService()),
22
+ });
23
+
24
+ // POST: send the output and store it at the same time.
25
+ const { stream, persisted } = teeToStore(streams, chatId, output, {
26
+ owner: userId,
27
+ kind: "chat",
28
+ onCancel: () => controller.abort(),
29
+ });
30
+ after(() => persisted);
31
+
32
+ // GET: resume from the last chunk the client has.
33
+ const rest = await resumeFromStore(streams, id, { fromIdx }).orThrow();
34
+ if (rest === undefined) return new Response(null, { status: 204 });
35
+ ```
36
+
37
+ For Redis, `redisStreamStore({ url: process.env.REDIS_URL })` from
38
+ `better-supabase/streams/redis` (add `redis`, or pass your own client). Keep
39
+ `persisted` alive with `after` or `waitUntil`, or the stored copy stops
40
+ when the response ends.
41
+
42
+ ## Credentials
43
+
44
+ Third-party tokens never go in a column. A row holds a `credential_ref`
45
+ (`{ provider, secret, scope }`) and a `CredentialProvider` resolves it.
46
+
47
+ ```bash
48
+ pnpm better-supabase sql add credentials
49
+ ```
50
+
51
+ ```ts
52
+ import {
53
+ sqlTransport,
54
+ subjectFor,
55
+ vaultCredentials,
56
+ } from "better-supabase/credentials";
57
+
58
+ export const bs = createServer(betterSupabase, {
59
+ credentials: vaultCredentials({
60
+ transport: sqlTransport(postgres.asService()),
61
+ }),
62
+ });
63
+
64
+ // In a handler:
65
+ const subject = subjectFor(ctx);
66
+ if (ctx.credentials === undefined || subject === undefined)
67
+ return unauthorized();
68
+ const token = await ctx.credentials
69
+ .getToken(row.credential_ref, { subject })
70
+ .orThrow();
71
+ await fetch(url, { headers: token.headers });
72
+ ```
73
+
74
+ - On Vercel Connect, pass `vercelConnectCredentials()` from
75
+ `better-supabase/vercel-connect` instead (add `@vercel/connect`).
76
+ - Check a custom provider with `testCredentialProvider` from
77
+ `better-supabase/testing`.
78
+
79
+ ## The Workflow World on Supabase (Node only)
80
+
81
+ ```bash
82
+ pnpm better-supabase sql add workflow-sdk-world # adds workflows and jobs
83
+ pnpm add workflow @workflow/world @workflow/world-postgres pg
84
+ ```
85
+
86
+ ```bash title=".env"
87
+ WORKFLOW_TARGET_WORLD=better-supabase/workflow-sdk/world
88
+ SUPABASE_DB_URL=postgresql://postgres:postgres@127.0.0.1:54322/postgres
89
+ ```
90
+
91
+ The entry's default export reads its options from the environment, so
92
+ setting `WORKFLOW_TARGET_WORLD` is enough. To build it in code, call
93
+ `createSupabaseWorld({ connectionString, delivery: "pg_net" })`. The World
94
+ imports `pg` and Node built-ins: never import it from an edge or browser
95
+ entry.
96
+
97
+ From `better-supabase/workflow-sdk`, which runs anywhere: `startFor(ctx, workflow, args)`
98
+ starts a run members see under RLS, `authorizeHook(token, ctx)` checks a
99
+ caller before `resumeHook`, `protectWebHandler(handler, key, { can })` refuses callers before a workflow UI route or a run's stream and
100
+ `workflowStarter({ name: workflow })` hands scheduled starts from the
101
+ `workflows` block to the SDK.
102
+
103
+ Docs: https://bettersupabase.com/docs/blocks/streams.md,
104
+ https://bettersupabase.com/docs/extending/credentials.md and
105
+ https://bettersupabase.com/docs/blocks/workflow-sdk.md.