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.
- package/README.md +299 -41
- package/dist/access-sql-B0dF-SoF.js +181 -0
- package/dist/actor-CQTlc1Hh.d.ts +43 -0
- package/dist/adapter-Bc1o3zyy.js +1106 -0
- package/dist/agents-CVHGd7It.d.ts +94 -0
- package/dist/ai-cache-CBWs1W0k.js +80 -0
- package/dist/ai-cache-DaDu_G5L.d.ts +64 -0
- package/dist/ai-chat-7amvXjmQ.d.ts +590 -0
- package/dist/ai-chat-B24UI962.js +743 -0
- package/dist/ai-files-CSPNswUY.js +319 -0
- package/dist/ai-sdk/agents/index.d.ts +74 -0
- package/dist/ai-sdk/agents/index.js +159 -0
- package/dist/ai-sdk/batches/index.d.ts +74 -0
- package/dist/ai-sdk/batches/index.js +180 -0
- package/dist/ai-sdk/cache/index.d.ts +38 -0
- package/dist/ai-sdk/cache/index.js +127 -0
- package/dist/ai-sdk/chat/index.d.ts +2 -0
- package/dist/ai-sdk/chat/index.js +246 -0
- package/dist/ai-sdk/embeddings/index.d.ts +3 -0
- package/dist/ai-sdk/embeddings/index.js +2 -0
- package/dist/ai-sdk/files/index.d.ts +61 -0
- package/dist/ai-sdk/files/index.js +111 -0
- package/dist/ai-sdk/index.d.ts +145 -0
- package/dist/ai-sdk/index.js +174 -0
- package/dist/ai-sdk/mcp/index.d.ts +102 -0
- package/dist/ai-sdk/mcp/index.js +362 -0
- package/dist/ai-sdk/memory/index.d.ts +67 -0
- package/dist/ai-sdk/memory/index.js +175 -0
- package/dist/ai-sdk/react/index.d.ts +2 -0
- package/dist/ai-sdk/react/index.js +3 -0
- package/dist/ai-sdk/react/server.d.ts +6 -0
- package/dist/ai-sdk/react/server.js +7 -0
- package/dist/ai-sdk/workflow/index.d.ts +249 -0
- package/dist/ai-sdk/workflow/index.js +575 -0
- package/dist/ai-sdk/workflow/react/index.d.ts +20 -0
- package/dist/ai-sdk/workflow/react/index.js +66 -0
- package/dist/ai-sdk/workflow/react/server.d.ts +10 -0
- package/dist/ai-sdk/workflow/react/server.js +12 -0
- package/dist/ai-tasks-Cd1HMFvB.d.ts +131 -0
- package/dist/announcements-CiyOs-xP.js +107 -0
- package/dist/announcements-ZRGnScWI.d.ts +72 -0
- package/dist/api-keys-rCGtKaZA.d.ts +156 -0
- package/dist/assistant-DwdpDH1q.d.ts +147 -0
- package/dist/astro/index.d.ts +86 -0
- package/dist/astro/index.js +93 -0
- package/dist/attributes-5dYul0u0.js +13 -0
- package/dist/auth-link-BjFPqwLz.d.ts +97 -0
- package/dist/auth-link-DrDX9KOT.js +114 -0
- package/dist/authorization-BFCqamMs.d.ts +172 -0
- package/dist/before-route-CnR0C0Jr.js +30 -0
- package/dist/bind-Bu_ZNa3W.d.ts +62 -0
- package/dist/bind-l4kAvYSv.js +97 -0
- package/dist/block-events-CrT8r7Fe.js +76 -0
- package/dist/block-fields-GFkxl4dP.js +49 -0
- package/dist/block-fields-SJ6fEf3o.d.ts +31 -0
- package/dist/block-helpers-CKtbFcRv.d.ts +37 -0
- package/dist/block-helpers-DWHxHsEQ.js +190 -0
- package/dist/block-hooks-BmjMyXTa.js +114 -0
- package/dist/block-hooks-plbZ0AbJ.d.ts +107 -0
- package/dist/{kit-transport-DJlHQUBU.js → block-transport-BLr-ZgLc.js} +11 -7
- package/dist/block-transport-DvaoPuZ9.d.ts +48 -0
- package/dist/blocks/agents/index.d.ts +3 -0
- package/dist/blocks/agents/index.js +123 -0
- package/dist/blocks/ai-cache/index.d.ts +3 -0
- package/dist/blocks/ai-cache/index.js +3 -0
- package/dist/blocks/ai-chat/index.d.ts +31 -0
- package/dist/blocks/ai-chat/index.js +5 -0
- package/dist/blocks/ai-chat/react/index.d.ts +77 -0
- package/dist/blocks/ai-chat/react/index.js +387 -0
- package/dist/blocks/ai-chat/react/server.d.ts +16 -0
- package/dist/blocks/ai-chat/react/server.js +14 -0
- package/dist/blocks/ai-files/index.d.ts +14 -0
- package/dist/blocks/ai-files/index.js +3 -0
- package/dist/blocks/ai-providers/index.d.ts +7 -0
- package/dist/blocks/ai-providers/index.js +211 -0
- package/dist/blocks/ai-tasks/index.d.ts +3 -0
- package/dist/blocks/ai-tasks/index.js +203 -0
- package/dist/blocks/announcements/index.d.ts +3 -0
- package/dist/blocks/announcements/index.js +3 -0
- package/dist/blocks/announcements/react/index.d.ts +31 -0
- package/dist/blocks/announcements/react/index.js +86 -0
- package/dist/blocks/announcements/react/server.d.ts +6 -0
- package/dist/blocks/announcements/react/server.js +7 -0
- package/dist/blocks/api-keys/index.d.ts +35 -0
- package/dist/blocks/api-keys/index.js +334 -0
- package/dist/blocks/attachments/index.d.ts +210 -0
- package/dist/blocks/attachments/index.js +222 -0
- package/dist/blocks/audit/index.d.ts +366 -0
- package/dist/blocks/audit/index.js +714 -0
- package/dist/blocks/billing/index.d.ts +265 -0
- package/dist/blocks/billing/index.js +400 -0
- package/dist/blocks/comments/index.d.ts +200 -0
- package/dist/blocks/comments/index.js +207 -0
- package/dist/blocks/connectors/index.d.ts +3 -0
- package/dist/blocks/connectors/index.js +164 -0
- package/dist/blocks/data-lifecycle/index.d.ts +251 -0
- package/dist/blocks/data-lifecycle/index.js +353 -0
- package/dist/blocks/entitlements/index.d.ts +14 -0
- package/dist/blocks/entitlements/index.js +25 -0
- package/dist/blocks/flags/index.d.ts +226 -0
- package/dist/blocks/flags/index.js +282 -0
- package/dist/blocks/inbox/index.d.ts +6 -0
- package/dist/blocks/inbox/index.js +499 -0
- package/dist/blocks/inbox/react/index.d.ts +2 -0
- package/dist/blocks/inbox/react/index.js +225 -0
- package/dist/blocks/inbox/react/server.d.ts +10 -0
- package/dist/blocks/inbox/react/server.js +12 -0
- package/dist/blocks/index.d.ts +65 -0
- package/dist/blocks/index.js +77 -0
- package/dist/blocks/jobs/index.d.ts +297 -0
- package/dist/blocks/jobs/index.js +1051 -0
- package/dist/blocks/knowledge/index.d.ts +3 -0
- package/dist/blocks/knowledge/index.js +3 -0
- package/dist/blocks/memory/index.d.ts +8 -0
- package/dist/blocks/memory/index.js +289 -0
- package/dist/blocks/notifications/index.d.ts +297 -0
- package/dist/blocks/notifications/index.js +425 -0
- package/dist/blocks/notifications/react/index.d.ts +44 -0
- package/dist/blocks/notifications/react/index.js +67 -0
- package/dist/blocks/notifications/react/server.d.ts +6 -0
- package/dist/blocks/notifications/react/server.js +7 -0
- package/dist/blocks/onboarding/index.d.ts +3 -0
- package/dist/blocks/onboarding/index.js +64 -0
- package/dist/blocks/onboarding/react/index.d.ts +28 -0
- package/dist/blocks/onboarding/react/index.js +78 -0
- package/dist/blocks/onboarding/react/server.d.ts +7 -0
- package/dist/blocks/onboarding/react/server.js +7 -0
- package/dist/blocks/organizations/index.d.ts +241 -0
- package/dist/blocks/organizations/index.js +400 -0
- package/dist/blocks/outbox/index.d.ts +3 -0
- package/dist/blocks/outbox/index.js +266 -0
- package/dist/blocks/profiles/index.d.ts +40 -0
- package/dist/blocks/profiles/index.js +28 -0
- package/dist/blocks/push/index.d.ts +185 -0
- package/dist/blocks/push/index.js +258 -0
- package/dist/blocks/settings/index.d.ts +89 -0
- package/dist/blocks/settings/index.js +104 -0
- package/dist/blocks/sso/index.d.ts +198 -0
- package/dist/blocks/sso/index.js +1297 -0
- package/dist/blocks/usage/index.d.ts +4 -0
- package/dist/blocks/usage/index.js +233 -0
- package/dist/blocks/waitlist/index.d.ts +117 -0
- package/dist/blocks/waitlist/index.js +132 -0
- package/dist/blocks/webhooks/index.d.ts +304 -0
- package/dist/{webhooks → blocks/webhooks}/index.js +468 -148
- package/dist/blocks/workflow-builder/index.d.ts +21 -0
- package/dist/blocks/workflow-builder/index.js +5 -0
- package/dist/blocks/workflow-builder/react/index.d.ts +47 -0
- package/dist/blocks/workflow-builder/react/index.js +119 -0
- package/dist/blocks/workflow-builder/react/server.d.ts +8 -0
- package/dist/blocks/workflow-builder/react/server.js +11 -0
- package/dist/blocks/workflows/index.d.ts +3 -0
- package/dist/blocks/workflows/index.js +3 -0
- package/dist/blocks/workflows/react/index.d.ts +47 -0
- package/dist/blocks/workflows/react/index.js +137 -0
- package/dist/blocks/workflows/react/server.d.ts +8 -0
- package/dist/blocks/workflows/react/server.js +11 -0
- package/dist/{index-SaTsEfGP.d.ts → bucket-Cl46E3jS.d.ts} +134 -91
- package/dist/{simplify-_0oUKqCd.js → build-BXIzE6Xv.js} +222 -124
- package/dist/{channel-FQW-CnGR.d.ts → channel-_2Mx1Oyu.d.ts} +2 -2
- package/dist/channels-CkgQ_X60.js +114 -0
- package/dist/chat-sdk/index.d.ts +303 -0
- package/dist/chat-sdk/index.js +733 -0
- package/dist/chat-sdk/react/index.d.ts +2 -0
- package/dist/chat-sdk/react/index.js +3 -0
- package/dist/chat-sdk/react/server.d.ts +3 -0
- package/dist/chat-sdk/react/server.js +2 -0
- package/dist/claims-DDBQT6BK.js +61 -0
- package/dist/{claims-BAf6c7is.js → claims-PqzCxaTD.js} +39 -2
- package/dist/cli/bin.js +1 -1
- package/dist/cli/{codemod-DqV7612m.js → codemod-Bl_tQpHn.js} +105 -2
- package/dist/cli/config-B9HkL8nF.js +2 -0
- package/dist/cli/config-DU7EJImt.js +49 -0
- package/dist/cli/config-NiPxAmUF.js +1077 -0
- package/dist/cli/{dist-xn4wlboc.js → dist-DRAVaE6w.js} +111 -1
- package/dist/cli/{doctor-L7Z8mYTx.js → doctor-B4JOm_ox.js} +992 -316
- package/dist/cli/{env-DmKv_G4A.js → env-CJLbUVPB.js} +1 -1
- package/dist/cli/{env-jIFUADLY.js → env-qXgyMV6r.js} +2 -2
- package/dist/cli/fresh-import-BeYf9I3x.js +40 -0
- package/dist/cli/gen-BGLb_zou.js +3100 -0
- package/dist/cli/gen-DAH8FM2W.js +2 -0
- package/dist/cli/index.d.ts +44 -5
- package/dist/cli/index.js +7 -7
- package/dist/cli/{init-Saf5-R9T.js → init-BIIwclPg.js} +242 -27
- package/dist/cli/{introspect--H7oGmcd.js → introspect-DNUTuNvb.js} +5 -5
- package/dist/cli/{io-k41_z-jT.js → io-DI1mTdSA.js} +12 -3
- package/dist/cli/{keys-ByKHnvP9.js → keys-BGCnnb-s.js} +8 -6
- package/dist/cli/{ohash-D7bG_EOb.js → ohash-BjQY1cBb.js} +1 -1
- package/dist/cli/{openapi-Cp5Fyta-.js → openapi-BlRJ18s3.js} +2 -2
- package/dist/cli/{project-B_GeXyHh.js → project-DZRaBaY7.js} +11 -6
- package/dist/cli/read-sets-CETOSFx4.js +223 -0
- package/dist/cli/{run-BKR2W_79.js → run-DNWxHynX.js} +33 -23
- package/dist/cli/{seed-CUlqWh-8.js → seed-DQzqT7LP.js} +8 -6
- package/dist/cli/{skills-LJJIhLFR.js → skills-QQs4q68J.js} +3 -2
- package/dist/cli/sql-D0GUtUPp.js +536 -0
- package/dist/cli/{config-CPVpXP5I.js → supabase-toml-B-bIukQF.js} +72 -942
- package/dist/cli/typegen-version-DeFbtzYI.js +8 -0
- package/dist/cli/{version-BDJuO0UR.js → version-hr88OZG0.js} +1 -1
- package/dist/client/index.d.ts +3 -2
- package/dist/client/index.js +11 -71
- package/dist/client/native/index.d.ts +228 -0
- package/dist/client/native/index.js +361 -0
- package/dist/client-CI0Z2zWX.js +277 -0
- package/dist/cloud-event-BnmD5fb9.js +46 -0
- package/dist/cloud-event-C1JCc1bH.d.ts +50 -0
- package/dist/{compiler-BXH_aZ7N.d.ts → compiler-DY_wkj4R.d.ts} +2 -2
- package/dist/compose-BIBNgAnq.js +53 -0
- package/dist/composite-Bt1YK3Ke.d.ts +146 -0
- package/dist/composite-DhE66P5u.js +130 -0
- package/dist/config/index.d.ts +6 -4
- package/dist/config/index.js +5 -5
- package/dist/{config-T_ejwyd3.d.ts → config-D44Y7PAv.d.ts} +406 -205
- package/dist/{config-DreERlKo.js → config-Dn7F5k9A.js} +62 -14
- package/dist/connector-Dv8kK0MO.d.ts +107 -0
- package/dist/connectors-hkLCwyEz.d.ts +120 -0
- package/dist/context-BCrWe7ow.d.ts +237 -0
- package/dist/credentials/index.d.ts +31 -0
- package/dist/credentials/index.js +168 -0
- package/dist/cron-DVPUg5k3.js +145 -0
- package/dist/csv-CPAzEmB6.js +25 -0
- package/dist/db-exception-CnWcYPxL.js +15 -0
- package/dist/{define-cNKzqwL_.js → define-B-TVjC25.js} +784 -227
- package/dist/{define-Bp_BZa5h.d.ts → define-CJJkkr1-.d.ts} +353 -61
- package/dist/edge/index.d.ts +69 -11
- package/dist/edge/index.js +191 -75
- package/dist/elysia/index.d.ts +59 -0
- package/dist/elysia/index.js +62 -0
- package/dist/embeddings-4ZvFzjsU.js +127 -0
- package/dist/embeddings-C9KGQnXt.d.ts +68 -0
- package/dist/{refresh-BTrQ_ZTp.d.ts → ended-jLfvw8h-.d.ts} +20 -2
- package/dist/{entitlements-DUxU4oHe.d.ts → entitlements-DHrY2UDZ.d.ts} +16 -7
- package/dist/entitlements-DRl6ZJUm.js +24 -0
- package/dist/envelope-DqnYGRw7.js +47 -0
- package/dist/{errors-DtwXa6b8.js → errors-B11Duf73.js} +82 -13
- package/dist/errors-DLjJHPLK.js +44 -0
- package/dist/escape-like-DHfx6jRr.js +7 -0
- package/dist/escape-like-ImTK0ps_.d.ts +15 -0
- package/dist/eve/index.d.ts +220 -0
- package/dist/eve/index.js +504 -0
- package/dist/eve-gT2Fpjut.d.ts +151 -0
- package/dist/events/index.d.ts +4 -3
- package/dist/events/index.js +9 -50
- package/dist/events-DWDhx77e.d.ts +549 -0
- package/dist/executor-Bq28caBo.js +718 -0
- package/dist/executor-C-R4pucm.js +83 -0
- package/dist/executor-CaWigTyR.d.ts +148 -0
- package/dist/executor-D14tGopJ.d.ts +36 -0
- package/dist/{executor-Cghdstwu.d.ts → executor-DbvExCFC.d.ts} +7 -1
- package/dist/{sql-Coh6n4cC.js → executor-De1Of3m3.js} +210 -11
- package/dist/executor-DvsBbNBS.d.ts +261 -0
- package/dist/expo/index.d.ts +79 -0
- package/dist/expo/index.js +129 -0
- package/dist/expo-sqlite/index.d.ts +58 -0
- package/dist/expo-sqlite/index.js +104 -0
- package/dist/field-errors-BFOa7WhB.d.ts +99 -0
- package/dist/field-errors-VF1yb8yI.js +13 -0
- package/dist/framework-CONDyPYx.js +51 -0
- package/dist/framework-DuVb4Xa8.d.ts +25 -0
- package/dist/gateway-C1ssRHnf.d.ts +130 -0
- package/dist/graph-BGyLLFLX.js +265 -0
- package/dist/h3/index.d.ts +59 -0
- package/dist/h3/index.js +55 -0
- package/dist/h3/v1/index.d.ts +63 -0
- package/dist/h3/v1/index.js +49 -0
- package/dist/history-BZih6SFP.js +64 -0
- package/dist/hono/index.d.ts +56 -7
- package/dist/hono/index.js +97 -45
- package/dist/{react-C_s7kiNz.js → hooks-1BTCJsiw.js} +104 -133
- package/dist/http-Cv4T29xh.js +40 -0
- package/dist/http-DdYadv-o.js +126 -0
- package/dist/image-url-pIVlO6R1.js +41 -0
- package/dist/impersonation-DcqaTBHx.js +148 -0
- package/dist/inbox-i7E1ppo6.d.ts +384 -0
- package/dist/index-ACiNPN4Z.d.ts +74 -0
- package/dist/{index-DgILJRXj.d.ts → index-Bepi-Hgg.d.ts} +91 -28
- package/dist/index-BkWT_uBO.d.ts +51 -0
- package/dist/index-BpFYMsi0.d.ts +53 -0
- package/dist/{index-C7f8cOBM.d.ts → index-Bxih3l0u.d.ts} +2 -2
- package/dist/index-CaxrMD1A.d.ts +1 -0
- package/dist/index-ClmjK_o-.d.ts +55 -0
- package/dist/index-CtuakVRc.d.ts +267 -0
- package/dist/index-D48jVS-N.d.ts +246 -0
- package/dist/index-DDrYaUcq.d.ts +138 -0
- package/dist/index-DQh4VCc9.d.ts +98 -0
- package/dist/{live-D9W2M5aO.d.ts → index-DunNRdnT.d.ts} +136 -38
- package/dist/index.d.ts +65 -18
- package/dist/index.js +42 -14
- package/dist/invalidate-BBqhpxyB.d.ts +19 -0
- package/dist/json-CEnpTHlZ.js +16 -0
- package/dist/json-schema-CvER4kgT.js +502 -0
- package/dist/keys-4MnkWTTh.js +35 -0
- package/dist/kit-B5tid-q5.d.ts +60 -0
- package/dist/kit-Fm-Fv7q5.js +78 -0
- package/dist/knowledge-BXBbT0Tr.d.ts +176 -0
- package/dist/knowledge-CDmiMLew.js +255 -0
- package/dist/lint/index.d.ts +1 -1
- package/dist/lint/index.js +37 -0
- package/dist/list/index.d.ts +3 -2
- package/dist/list/index.js +1 -444
- package/dist/{index-fag8VJZ2.d.ts → list-query-BRt-zDF7.d.ts} +20 -12
- package/dist/list-query-gl808ac1.js +459 -0
- package/dist/{live-CdJBOc4f.js → live-CTAZQkwl.js} +99 -14
- package/dist/logger-DWVYUmwi.d.ts +18 -0
- package/dist/mcp/index.d.ts +38 -11
- package/dist/mcp/index.js +82 -46
- package/dist/mcp/sdk/index.d.ts +105 -0
- package/dist/mcp/sdk/index.js +126 -0
- package/dist/message-CaKlqdsX.js +219 -0
- package/dist/message-CfDoR0Y6.d.ts +94 -0
- package/dist/messages-B9-5887d.js +715 -0
- package/dist/messages-DYP0sUTe.d.ts +59 -0
- package/dist/{mfa-CusDgPaD.d.ts → mfa-Daak8ukG.d.ts} +8 -2
- package/dist/modules-DpPwzC7E.d.ts +192 -0
- package/dist/modules-dxrVK3ID.js +228 -0
- package/dist/nestjs/index.d.ts +68 -0
- package/dist/nestjs/index.js +164 -0
- package/dist/next/client/index.d.ts +35 -0
- package/dist/next/client/index.js +36 -0
- package/dist/next/image/index.js +3 -24
- package/dist/next/index.d.ts +150 -51
- package/dist/next/index.js +261 -107
- package/dist/node/index.d.ts +4 -0
- package/dist/node/index.js +210 -0
- package/dist/node-headers-AO06VhqH.d.ts +24 -0
- package/dist/node-headers-C71zNQHe.js +55 -0
- package/dist/nuxt/index.d.ts +60 -0
- package/dist/nuxt/index.js +64 -0
- package/dist/onboarding-BZGHYJks.d.ts +62 -0
- package/dist/openapi/index.d.ts +1 -1
- package/dist/openapi/index.js +3 -3
- package/dist/orpc/index.d.ts +70 -11
- package/dist/orpc/index.js +73 -24
- package/dist/otel/index.d.ts +7 -7
- package/dist/otel/index.js +87 -57
- package/dist/outbox-Cq7pPYvl.d.ts +161 -0
- package/dist/{plugin-o144f322.d.ts → plugin-FGY8UhYm.d.ts} +30 -10
- package/dist/plugin-tfXW1-qO.js +45 -0
- package/dist/plugins/actor/index.d.ts +2 -2
- package/dist/plugins/actor/index.js +3 -3
- package/dist/plugins/rules/index.d.ts +11 -4
- package/dist/plugins/rules/index.js +40 -13
- package/dist/plugins/soft-delete/index.d.ts +5 -4
- package/dist/plugins/soft-delete/index.js +10 -5
- package/dist/plugins/tenant/index.d.ts +2 -2
- package/dist/plugins/tenant/index.js +18 -11
- package/dist/plugins/timestamps/index.d.ts +5 -3
- package/dist/plugins/timestamps/index.js +6 -4
- package/dist/plugins/validation/index.d.ts +2 -2
- package/dist/plugins/validation/index.js +10 -6
- package/dist/{pool-C9voM4Kw.d.ts → pool-CAu2nLrL.d.ts} +2 -2
- package/dist/postgres/index.d.ts +4 -4
- package/dist/postgres/index.js +1 -2
- package/dist/{postgrest-CruYKAvV.d.ts → postgrest-BLVdEnfe.d.ts} +13 -3
- package/dist/powersync/index.d.ts +43 -0
- package/dist/powersync/index.js +199 -0
- package/dist/powersync/react/index.d.ts +87 -0
- package/dist/powersync/react/index.js +108 -0
- package/dist/{problem-BW1KhzSG.js → problem-BreOl8b8.js} +14 -3
- package/dist/{problem-Blxe8S31.d.ts → problem-DD8LZFjc.d.ts} +21 -3
- package/dist/provider-BH5UWZJ6.d.ts +113 -0
- package/dist/provider-Di3sRutW.js +57 -0
- package/dist/query/index.d.ts +4 -2
- package/dist/query/index.js +4 -3
- package/dist/{query-CCbo44lG.js → query-BQ-NaZon.js} +141 -24
- package/dist/{queue-BYUCjr59.d.ts → queue-CLJurhdy.d.ts} +258 -83
- package/dist/react/index.d.ts +11 -7
- package/dist/react/index.js +7 -3
- package/dist/react/native/index.d.ts +116 -0
- package/dist/react/native/index.js +130 -0
- package/dist/react/server.d.ts +28 -10
- package/dist/react/server.js +22 -5
- package/dist/react/session.d.ts +2 -2
- package/dist/react-4ZqkP8da.js +79 -0
- package/dist/react-F80mF4-t.js +409 -0
- package/dist/react-router/index.d.ts +83 -0
- package/dist/react-router/index.js +89 -0
- package/dist/react-topic-seAWjL3_.js +38 -0
- package/dist/{read-set-DQFt1N_Y.js → read-set-DuKWC9Mj.js} +67 -25
- package/dist/realtime/index.d.ts +4 -5
- package/dist/realtime/index.js +144 -82
- package/dist/refusal-CeJWxmkH.js +61 -0
- package/dist/refusal-D1rgbzNq.d.ts +15 -0
- package/dist/replicas-CwrYp5Zj.js +94 -0
- package/dist/{view-Bq64ki8-.js → resolve-D_IcnvFd.js} +239 -289
- package/dist/{resolve-C15TJq77.d.ts → resolve-KW8nCeL6.d.ts} +29 -45
- package/dist/{resource-CRxxwkQq.js → resource-BsvzCMlX.js} +4 -4
- package/dist/{resource-D8iqWMr-.d.ts → resource-D6Uc7Sk7.d.ts} +5 -5
- package/dist/respond-BUgsXNgk.js +91 -0
- package/dist/respond-DoBijysA.d.ts +93 -0
- package/dist/result-D7y2fT87.d.ts +282 -0
- package/dist/{result-BKiliPY7.js → result-DzUbqgdW.js} +27 -2
- package/dist/run-state-CPo-1X2B.d.ts +12 -0
- package/dist/run-state-CgBKzYMW.js +13 -0
- package/dist/search-CUWCRYKL.js +9 -0
- package/dist/server/index.d.ts +143 -21
- package/dist/server/index.js +46 -14
- package/dist/{respond-D2OQl62-.d.ts → server-CeVeeXwz.d.ts} +225 -80
- package/dist/session-ChiXDZdZ.d.ts +72 -0
- package/dist/shared-CBxosKK3.js +75 -0
- package/dist/{shared-D1dRUrAg.js → shared-CxWmcyqB.js} +2 -1
- package/dist/shared-DDSjEGDR.d.ts +11 -0
- package/dist/sign-in-BCV5S2WZ.d.ts +49 -0
- package/dist/sign-in-Cb1mwv6X.js +86 -0
- package/dist/{signers-Cc6r98SW.d.ts → signers-4y62_VIi.d.ts} +13 -9
- package/dist/simplify-DDO0j0LI.js +83 -0
- package/dist/solid/index.d.ts +131 -0
- package/dist/solid/index.js +344 -0
- package/dist/solid-start/index.d.ts +75 -0
- package/dist/solid-start/index.js +58 -0
- package/dist/{spec-pins-C3oc-Tdp.js → spec-pins--j6mTok4.js} +8 -1
- package/dist/{spec-pins-CqorWDnO.d.ts → spec-pins-C89s6DyW.d.ts} +7 -0
- package/dist/sql/index.d.ts +330 -194
- package/dist/sql/index.js +34901 -6489
- package/dist/ssr/index.d.ts +6 -5
- package/dist/ssr/index.js +3 -3
- package/dist/{standard-D7r6dMUu.js → standard-BK0cqJ7y.js} +4 -3
- package/dist/{standard-J4YgMOLm.d.ts → standard-CYsm7xpT.d.ts} +1 -1
- package/dist/stats-D_AD9GGu.js +1123 -0
- package/dist/storage/index.d.ts +5 -5
- package/dist/storage/index.js +1027 -368
- package/dist/store-BdH5ruDx.js +66 -0
- package/dist/store-CGjgWu5n.d.ts +68 -0
- package/dist/streams/index.d.ts +76 -0
- package/dist/streams/index.js +77 -0
- package/dist/streams/redis/index.d.ts +52 -0
- package/dist/streams/redis/index.js +185 -0
- package/dist/stripe-BMj5LtsT.js +38 -0
- package/dist/stripe-D04h-QBT.d.ts +136 -0
- package/dist/{support-Dk6vdmEw.js → support-BivNqSpK.js} +35 -12
- package/dist/{support-view-Da5peKFg.d.ts → support-view-33Oi07TT.d.ts} +1 -1
- package/dist/svelte/index.d.ts +114 -0
- package/dist/svelte/index.js +344 -0
- package/dist/sveltekit/index.d.ts +116 -0
- package/dist/sveltekit/index.js +106 -0
- package/dist/tags-B99_U9Pp.js +39 -0
- package/dist/tags-Cx-LnIQP.d.ts +30 -0
- package/dist/tanstack-db/index.d.ts +71 -0
- package/dist/tanstack-db/index.js +72 -0
- package/dist/tanstack-start/index.d.ts +75 -0
- package/dist/tanstack-start/index.js +95 -0
- package/dist/tee-CoEppCER.js +101 -0
- package/dist/{template-TxrGI5jR.js → template--jDkl3UP.js} +34 -13
- package/dist/template-CwO38Do8.d.ts +6 -0
- package/dist/temporal-BJGitm-h.js +79 -0
- package/dist/{temporal-required-CAt4Dc9Z.js → temporal-required-BVvW7SYJ.js} +3 -2
- package/dist/tenant-I1TEZ_BX.js +27 -0
- package/dist/tenant-icPeuUBN.d.ts +17 -0
- package/dist/testing/index.d.ts +343 -37
- package/dist/testing/index.js +1186 -79
- package/dist/timing-CyTQPubY.js +92 -0
- package/dist/ttl-Hr34gRu8.js +12 -0
- package/dist/{types-Dnf_wRDz.d.ts → types-6BdhkmZe.d.ts} +111 -45
- package/dist/types-BI-0Sl2v.d.ts +359 -0
- package/dist/types-C05bxW-W.d.ts +220 -0
- package/dist/types-DGs5L0VN.d.ts +192 -0
- package/dist/types-TaiEeBGA.d.ts +156 -0
- package/dist/usage-CrvrL2vw.d.ts +177 -0
- package/dist/user-change-XzvgafU4.js +130 -0
- package/dist/vault-CSO7ss5C.d.ts +50 -0
- package/dist/vercel-connect/index.d.ts +47 -0
- package/dist/vercel-connect/index.js +119 -0
- package/dist/{verify-Ce49ETPz.js → verify-DL41hbvY.js} +85 -13
- package/dist/verify-DPuWngD4.d.ts +172 -0
- package/dist/{version-DM_Roffb.js → version-Bvv6aLjZ.js} +1 -1
- package/dist/view-BeFcRV6G.js +99 -0
- package/dist/{view-BEf0diC5.d.ts → view-DbxLNu8L.d.ts} +35 -32
- package/dist/vue/index.d.ts +141 -0
- package/dist/vue/index.js +362 -0
- package/dist/watch-DI34G86j.d.ts +60 -0
- package/dist/watch-Xuxrvxq-.js +122 -0
- package/dist/{wire-D2dT86vi.js → wire-DtZQ4sdE.js} +15 -5
- package/dist/workflow-builder-DJ1oHn8g.js +398 -0
- package/dist/workflow-sdk/builder/index.d.ts +85 -0
- package/dist/workflow-sdk/builder/index.js +250 -0
- package/dist/workflow-sdk/index.d.ts +14 -0
- package/dist/workflow-sdk/index.js +3 -0
- package/dist/workflow-sdk/world/index.d.ts +107 -0
- package/dist/workflow-sdk/world/index.js +702 -0
- package/dist/workflow-sdk-B3yLD6Br.d.ts +98 -0
- package/dist/workflow-sdk-C2WJ_G2O.js +173 -0
- package/dist/workflow-sdk-world-D-prir6O.js +1397 -0
- package/dist/workflows-B0j9WKPu.d.ts +185 -0
- package/dist/workflows-wu1WWBn7.js +216 -0
- package/package.json +470 -29
- package/schemas/ai-message-v1.json +258 -0
- package/schemas/config-v1.json +1074 -140
- package/schemas/doctor-report-v1.json +21 -1
- package/schemas/snapshot-v2.json +8 -0
- package/skills/better-supabase/SKILL.md +41 -12
- package/skills/better-supabase/references/frontend.md +96 -0
- package/skills/better-supabase/references/plugins.md +10 -6
- package/skills/better-supabase/references/troubleshooting.md +2 -1
- package/skills/better-supabase-api/SKILL.md +76 -22
- package/skills/better-supabase-api/references/adapters.md +207 -0
- package/skills/better-supabase-api/references/ai.md +125 -0
- package/skills/better-supabase-api/references/expo.md +65 -0
- package/skills/better-supabase-api/references/powersync.md +35 -0
- package/skills/better-supabase-api/references/streams-credentials.md +105 -0
- package/skills/better-supabase-auth/SKILL.md +62 -18
- package/skills/better-supabase-auth/references/authorization-providers.md +51 -0
- package/skills/better-supabase-testing/SKILL.md +3 -1
- package/dist/cli/config-dtoekM0v.js +0 -2
- package/dist/cli/gen-BJc9vdyu.js +0 -2
- package/dist/cli/gen-C2osRcr5.js +0 -2204
- package/dist/cli/read-sets-BfMQcKy8.js +0 -289
- package/dist/cli/sql-DzPbfngx.js +0 -348
- package/dist/entitlements-CTEBm7IB.js +0 -20
- package/dist/events-aIO7vsIk.d.ts +0 -230
- package/dist/executor-BunPOO-k.d.ts +0 -402
- package/dist/executor-XycESQPH.js +0 -94
- package/dist/impersonation-VfaGc4Q_.js +0 -41
- package/dist/index-BGdgBPdf.d.ts +0 -161
- package/dist/index-DOESKG27.d.ts +0 -100
- package/dist/index-DmXSxbLi.d.ts +0 -62
- package/dist/index-Dxn2a5cw.d.ts +0 -50
- package/dist/jobs/index.d.ts +0 -226
- package/dist/jobs/index.js +0 -1007
- package/dist/json-schema-m1fiwKgN.js +0 -208
- package/dist/kit-events-CTFDfSwb.js +0 -60
- package/dist/kit-transport-B82k1djG.d.ts +0 -33
- package/dist/kits-CGLLrNPd.js +0 -157
- package/dist/notifications/index.d.ts +0 -162
- package/dist/notifications/index.js +0 -264
- package/dist/orgs/index.d.ts +0 -132
- package/dist/orgs/index.js +0 -245
- package/dist/permdock-sql-C2Inc6Xc.d.ts +0 -29
- package/dist/permdock-sql-DgOfeixi.js +0 -51
- package/dist/plugin-DwARMuQp.js +0 -59
- package/dist/server-Csx2sRjg.js +0 -655
- package/dist/stats-Bqob3WqT.js +0 -592
- package/dist/support-DT-OhSxD.d.ts +0 -88
- package/dist/template-mbvlysOo.d.ts +0 -6
- package/dist/temporal-CVlIV2DZ.js +0 -40
- package/dist/user-change-CHFEUro1.js +0 -49
- package/dist/webhooks/index.d.ts +0 -285
- package/skills/better-supabase-auth/references/permdock.md +0 -100
|
@@ -0,0 +1,575 @@
|
|
|
1
|
+
import { n as dbError } from "../../errors-B11Duf73.js";
|
|
2
|
+
import { a as problemResponse } from "../../problem-BreOl8b8.js";
|
|
3
|
+
import { d as isRecord } from "../../block-helpers-DWHxHsEQ.js";
|
|
4
|
+
import { h as usageOf, o as toUIMessage, p as runRelease, r as fromModelMessages, t as AI_SDK_UI_FORMAT } from "../../messages-B9-5887d.js";
|
|
5
|
+
import { n as teeToStore, t as resumeFromStore } from "../../tee-CoEppCER.js";
|
|
6
|
+
import { t as WORKFLOW_ATTRIBUTES } from "../../attributes-5dYul0u0.js";
|
|
7
|
+
import { JsonToSseTransformStream, UI_MESSAGE_STREAM_HEADERS } from "ai";
|
|
8
|
+
import { createModelCallToUIChunkTransform, normalizeUIMessageStreamParts } from "@ai-sdk/workflow";
|
|
9
|
+
import { getRun, resumeHook, start } from "workflow/api";
|
|
10
|
+
//#region src/ai-sdk/workflow/turn.ts
|
|
11
|
+
/** The token of the hook that stops a durable turn. */
|
|
12
|
+
function durableStopToken(workflowRunId) {
|
|
13
|
+
return `ai-chat-stop:${workflowRunId}`;
|
|
14
|
+
}
|
|
15
|
+
/** The token of the hook that continues a turn after its approvals. */
|
|
16
|
+
function durableTurnToken(workflowRunId) {
|
|
17
|
+
return `ai-chat-turn:${workflowRunId}`;
|
|
18
|
+
}
|
|
19
|
+
const STOPPED = Symbol("stopped");
|
|
20
|
+
function messageOf(cause) {
|
|
21
|
+
return cause instanceof Error ? cause.message : String(cause);
|
|
22
|
+
}
|
|
23
|
+
/** The approval requests in `messages` that `known` doesn't hold yet. */
|
|
24
|
+
function newRequests(messages, known) {
|
|
25
|
+
const calls = /* @__PURE__ */ new Map();
|
|
26
|
+
const requests = [];
|
|
27
|
+
for (const message of messages) {
|
|
28
|
+
if (message.role !== "assistant" || typeof message.content === "string") continue;
|
|
29
|
+
for (const part of message.content) if (part.type === "tool-call") calls.set(part.toolCallId, {
|
|
30
|
+
toolName: part.toolName,
|
|
31
|
+
input: part.input
|
|
32
|
+
});
|
|
33
|
+
else if (part.type === "tool-approval-request" && !known.has(part.approvalId)) {
|
|
34
|
+
const call = calls.get(part.toolCallId);
|
|
35
|
+
const { signature } = part;
|
|
36
|
+
requests.push({
|
|
37
|
+
approvalId: part.approvalId,
|
|
38
|
+
toolCallId: part.toolCallId,
|
|
39
|
+
toolName: call?.toolName ?? "",
|
|
40
|
+
input: call?.input,
|
|
41
|
+
...signature === void 0 ? {} : { signature }
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return requests;
|
|
46
|
+
}
|
|
47
|
+
function sourcesOf(result) {
|
|
48
|
+
return result.steps.flatMap((step) => step.sources ?? []);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* One durable answer, inside a `"use workflow"` function. Each pass of the
|
|
52
|
+
* agent writes one segment: a World stream namespace, claimed in `ai_runs`.
|
|
53
|
+
* The answer is saved after each pass under `input.messageId`. When the
|
|
54
|
+
* agent asks for approvals, they go to `ai_tool_approvals`, the segment is
|
|
55
|
+
* released and the turn waits on its hook (`durableTurnToken`) for as long
|
|
56
|
+
* as the decisions take; it reads them back from the database rather than
|
|
57
|
+
* from the hook payload. The stop hook (`durableStopToken`) aborts it.
|
|
58
|
+
*/
|
|
59
|
+
async function durableTurn(input, deps) {
|
|
60
|
+
const abort = new AbortController();
|
|
61
|
+
const stopped = Promise.resolve(deps.createHook({ token: durableStopToken(deps.runId) })).then(() => {
|
|
62
|
+
abort.abort();
|
|
63
|
+
return STOPPED;
|
|
64
|
+
});
|
|
65
|
+
const resumes = deps.createHook({ token: durableTurnToken(deps.runId) })[Symbol.asyncIterator]();
|
|
66
|
+
const historyLength = input.messages.length;
|
|
67
|
+
const approvals = /* @__PURE__ */ new Map();
|
|
68
|
+
const sources = [];
|
|
69
|
+
let conversation = input.messages;
|
|
70
|
+
let segment = {
|
|
71
|
+
streamId: input.streamId,
|
|
72
|
+
runId: input.runId
|
|
73
|
+
};
|
|
74
|
+
let segments = 0;
|
|
75
|
+
for (;;) {
|
|
76
|
+
segments += 1;
|
|
77
|
+
let status = "completed";
|
|
78
|
+
let error;
|
|
79
|
+
let usage;
|
|
80
|
+
let requests = [];
|
|
81
|
+
try {
|
|
82
|
+
const result = await deps.agent({
|
|
83
|
+
chatId: input.chatId,
|
|
84
|
+
runId: segment.runId,
|
|
85
|
+
messages: conversation,
|
|
86
|
+
writable: deps.getWritable({ namespace: segment.streamId }),
|
|
87
|
+
abortSignal: abort.signal,
|
|
88
|
+
model: input.model,
|
|
89
|
+
providerOptions: input.providerOptions
|
|
90
|
+
});
|
|
91
|
+
conversation = result.messages;
|
|
92
|
+
sources.push(...sourcesOf(result));
|
|
93
|
+
requests = newRequests(conversation.slice(historyLength), approvals);
|
|
94
|
+
usage = usageOf({
|
|
95
|
+
totalUsage: result.totalUsage,
|
|
96
|
+
providerMetadata: result.steps.at(-1)?.providerMetadata
|
|
97
|
+
});
|
|
98
|
+
} catch (cause) {
|
|
99
|
+
status = "failed";
|
|
100
|
+
error = messageOf(cause);
|
|
101
|
+
}
|
|
102
|
+
if (abort.signal.aborted) status = "cancelled";
|
|
103
|
+
if (status !== "completed") requests = [];
|
|
104
|
+
for (const request of requests) approvals.set(request.approvalId, {
|
|
105
|
+
approvalId: request.approvalId,
|
|
106
|
+
toolCallId: request.toolCallId,
|
|
107
|
+
state: "requested"
|
|
108
|
+
});
|
|
109
|
+
await deps.step("save", {
|
|
110
|
+
chatId: input.chatId,
|
|
111
|
+
message: fromModelMessages(input.messageId, conversation.slice(historyLength), {
|
|
112
|
+
sources,
|
|
113
|
+
approvals: [...approvals.values()]
|
|
114
|
+
}),
|
|
115
|
+
parentId: input.parentId,
|
|
116
|
+
model: input.model,
|
|
117
|
+
runId: segment.runId,
|
|
118
|
+
status: status === "completed" ? "complete" : status === "cancelled" ? "aborted" : "error"
|
|
119
|
+
});
|
|
120
|
+
if (requests.length > 0) await deps.step("approvals", {
|
|
121
|
+
chatId: input.chatId,
|
|
122
|
+
runId: segment.runId,
|
|
123
|
+
messageId: input.messageId,
|
|
124
|
+
requests
|
|
125
|
+
});
|
|
126
|
+
await deps.step("release", {
|
|
127
|
+
chatId: input.chatId,
|
|
128
|
+
streamId: segment.streamId,
|
|
129
|
+
organizationId: input.organizationId,
|
|
130
|
+
status,
|
|
131
|
+
...usage === void 0 ? {} : { usage },
|
|
132
|
+
...error === void 0 ? {} : { error }
|
|
133
|
+
});
|
|
134
|
+
if (requests.length === 0) return {
|
|
135
|
+
status,
|
|
136
|
+
messageId: input.messageId,
|
|
137
|
+
segments
|
|
138
|
+
};
|
|
139
|
+
const waiting = requests.map((request) => request.approvalId);
|
|
140
|
+
let decided = [];
|
|
141
|
+
let next;
|
|
142
|
+
const drop = async (claimed) => {
|
|
143
|
+
if (claimed === void 0) return;
|
|
144
|
+
await deps.step("release", {
|
|
145
|
+
chatId: input.chatId,
|
|
146
|
+
streamId: claimed.streamId,
|
|
147
|
+
organizationId: input.organizationId,
|
|
148
|
+
status: "cancelled"
|
|
149
|
+
});
|
|
150
|
+
};
|
|
151
|
+
while (decided.length < waiting.length) {
|
|
152
|
+
const signal = await Promise.race([resumes.next(), stopped]);
|
|
153
|
+
if (signal === STOPPED || signal.done === true) {
|
|
154
|
+
await drop(next);
|
|
155
|
+
return {
|
|
156
|
+
status: "cancelled",
|
|
157
|
+
messageId: input.messageId,
|
|
158
|
+
segments
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
await drop(next);
|
|
162
|
+
next = signal.value;
|
|
163
|
+
decided = await deps.step("decisions", {
|
|
164
|
+
chatId: input.chatId,
|
|
165
|
+
approvalIds: waiting
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
if (next === void 0) return {
|
|
169
|
+
status: "failed",
|
|
170
|
+
messageId: input.messageId,
|
|
171
|
+
segments
|
|
172
|
+
};
|
|
173
|
+
for (const decision of decided) {
|
|
174
|
+
const known = approvals.get(decision.approvalId);
|
|
175
|
+
if (known !== void 0) approvals.set(decision.approvalId, {
|
|
176
|
+
...known,
|
|
177
|
+
state: decision.approved ? "approved" : "denied",
|
|
178
|
+
...decision.reason === void 0 ? {} : { reason: decision.reason }
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
conversation = [...conversation, {
|
|
182
|
+
role: "tool",
|
|
183
|
+
content: decided.map((decision) => ({
|
|
184
|
+
type: "tool-approval-response",
|
|
185
|
+
approvalId: decision.approvalId,
|
|
186
|
+
approved: decision.approved,
|
|
187
|
+
...decision.reason === void 0 ? {} : { reason: decision.reason }
|
|
188
|
+
}))
|
|
189
|
+
}];
|
|
190
|
+
segment = next;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
//#endregion
|
|
194
|
+
//#region src/ai-sdk/workflow/server.ts
|
|
195
|
+
/** The response header that names the workflow run. */
|
|
196
|
+
const WORKFLOW_RUN_ID_HEADER = "x-workflow-run-id";
|
|
197
|
+
const WORKFLOW_ENGINE = "workflow";
|
|
198
|
+
function badRequest(message) {
|
|
199
|
+
return problemResponse(dbError("invalid_request", message, { code: "AI_CHAT_BAD_REQUEST" }));
|
|
200
|
+
}
|
|
201
|
+
function busy() {
|
|
202
|
+
return problemResponse(dbError("conflict", "An answer is already being written.", { code: "AI_CHAT_BUSY" }));
|
|
203
|
+
}
|
|
204
|
+
function notDurable() {
|
|
205
|
+
return problemResponse(dbError("conflict", "The approvals belong to no durable run.", { code: "AI_CHAT_NOT_DURABLE" }));
|
|
206
|
+
}
|
|
207
|
+
async function readJson(request) {
|
|
208
|
+
try {
|
|
209
|
+
return await request.json();
|
|
210
|
+
} catch {
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
/** The `approvals` of a body, `undefined` when it has none, or a message for a malformed one. */
|
|
215
|
+
function decisionsOf$1(value) {
|
|
216
|
+
if (value === void 0) return void 0;
|
|
217
|
+
if (!Array.isArray(value) || value.length === 0) return "Expected a list of approvals.";
|
|
218
|
+
const decisions = [];
|
|
219
|
+
for (const item of value) {
|
|
220
|
+
if (!isRecord(item) || typeof item["approvalId"] !== "string" || typeof item["approved"] !== "boolean") return "Expected approvals with an approvalId and approved.";
|
|
221
|
+
const { reason } = item;
|
|
222
|
+
decisions.push({
|
|
223
|
+
approvalId: item["approvalId"],
|
|
224
|
+
approved: item["approved"],
|
|
225
|
+
...typeof reason === "string" ? { reason } : {}
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
return decisions;
|
|
229
|
+
}
|
|
230
|
+
function streamOf(iterable) {
|
|
231
|
+
const iterator = iterable[Symbol.asyncIterator]();
|
|
232
|
+
return new ReadableStream({
|
|
233
|
+
async pull(controller) {
|
|
234
|
+
const next = await iterator.next();
|
|
235
|
+
if (next.done === true) controller.close();
|
|
236
|
+
else controller.enqueue(next.value);
|
|
237
|
+
},
|
|
238
|
+
async cancel(reason) {
|
|
239
|
+
await iterator.return?.(reason);
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
async function* chunksOf(stream, signal) {
|
|
244
|
+
const reader = stream.getReader();
|
|
245
|
+
const cancel = () => {
|
|
246
|
+
reader.cancel(signal?.reason).catch(() => void 0);
|
|
247
|
+
};
|
|
248
|
+
if (signal?.aborted === true) cancel();
|
|
249
|
+
else signal?.addEventListener("abort", cancel, { once: true });
|
|
250
|
+
try {
|
|
251
|
+
for (;;) {
|
|
252
|
+
const next = await reader.read();
|
|
253
|
+
if (next.done) return;
|
|
254
|
+
yield next.value;
|
|
255
|
+
}
|
|
256
|
+
} finally {
|
|
257
|
+
signal?.removeEventListener("abort", cancel);
|
|
258
|
+
reader.releaseLock();
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
/** A segment's World stream as UI chunks, with the answer's id on `start`. */
|
|
262
|
+
function segmentChunks(workflowRunId, streamId, messageId, uiStartIndex, signal) {
|
|
263
|
+
const chunks = getRun(workflowRunId).getReadable({ namespace: streamId }).pipeThrough(createModelCallToUIChunkTransform({ uiStartIndex })).pipeThrough(new TransformStream({ transform(chunk, controller) {
|
|
264
|
+
controller.enqueue(chunk.type === "start" && messageId !== void 0 ? {
|
|
265
|
+
...chunk,
|
|
266
|
+
messageId
|
|
267
|
+
} : chunk);
|
|
268
|
+
} }));
|
|
269
|
+
return streamOf(normalizeUIMessageStreamParts(chunksOf(chunks, signal)));
|
|
270
|
+
}
|
|
271
|
+
/** `stream` once its first chunk arrives, or `undefined` when reading it fails. */
|
|
272
|
+
async function opened(stream) {
|
|
273
|
+
const reader = stream.getReader();
|
|
274
|
+
let first;
|
|
275
|
+
try {
|
|
276
|
+
first = await reader.read();
|
|
277
|
+
} catch {
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
let pending = first;
|
|
281
|
+
return new ReadableStream({
|
|
282
|
+
async pull(controller) {
|
|
283
|
+
const next = pending ?? await reader.read();
|
|
284
|
+
pending = void 0;
|
|
285
|
+
if (next.done) controller.close();
|
|
286
|
+
else controller.enqueue(next.value);
|
|
287
|
+
},
|
|
288
|
+
async cancel(reason) {
|
|
289
|
+
await reader.cancel(reason);
|
|
290
|
+
}
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
function sse(stream, workflowRunId) {
|
|
294
|
+
return new Response(stream.pipeThrough(new TextEncoderStream()), { headers: {
|
|
295
|
+
...UI_MESSAGE_STREAM_HEADERS,
|
|
296
|
+
...workflowRunId === void 0 ? {} : { [WORKFLOW_RUN_ID_HEADER]: workflowRunId }
|
|
297
|
+
} });
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Durable chat routes on the Workflow SDK: each turn is a workflow run
|
|
301
|
+
* (`durableTurn`), so an answer outlives the request, a reload replays it
|
|
302
|
+
* and an approval can wait for hours. The chat's runs stay in `ai_runs`
|
|
303
|
+
* with the workflow run id next to them.
|
|
304
|
+
*/
|
|
305
|
+
function durableChat(options) {
|
|
306
|
+
const newId = options.generateId ?? (() => crypto.randomUUID());
|
|
307
|
+
function streamSegment(context, chat, workflowRunId, streamId, messageId) {
|
|
308
|
+
const teed = teeToStore(options.streams, streamId, segmentChunks(workflowRunId, streamId, messageId, 0).pipeThrough(new JsonToSseTransformStream()), {
|
|
309
|
+
owner: chat.ownerId,
|
|
310
|
+
tenant: chat.organizationId,
|
|
311
|
+
kind: "chat",
|
|
312
|
+
...options.streamTtl === void 0 ? {} : { ttl: options.streamTtl }
|
|
313
|
+
});
|
|
314
|
+
context.waitUntil?.((async () => {
|
|
315
|
+
await teed.persisted;
|
|
316
|
+
})());
|
|
317
|
+
return sse(teed.stream, workflowRunId);
|
|
318
|
+
}
|
|
319
|
+
async function startTurn(body, context) {
|
|
320
|
+
const turn = await options.assistant.prepare(body, context);
|
|
321
|
+
if (turn instanceof Response) return turn;
|
|
322
|
+
const { chat, model } = turn;
|
|
323
|
+
const streamId = newId();
|
|
324
|
+
const messageId = newId();
|
|
325
|
+
const claim = await context.chats.runs.claim(chat.id, streamId, {
|
|
326
|
+
model,
|
|
327
|
+
messageId,
|
|
328
|
+
engine: WORKFLOW_ENGINE
|
|
329
|
+
});
|
|
330
|
+
if (!claim.ok) return problemResponse(claim.error);
|
|
331
|
+
const runId = claim.data.runId;
|
|
332
|
+
if (!claim.data.claimed || runId === void 0) return busy();
|
|
333
|
+
const input = {
|
|
334
|
+
chatId: chat.id,
|
|
335
|
+
organizationId: chat.organizationId,
|
|
336
|
+
userId: context.userId,
|
|
337
|
+
model,
|
|
338
|
+
messageId,
|
|
339
|
+
parentId: turn.parentId,
|
|
340
|
+
runId,
|
|
341
|
+
streamId,
|
|
342
|
+
messages: turn.messages,
|
|
343
|
+
providerOptions: turn.providerOptions
|
|
344
|
+
};
|
|
345
|
+
let workflowRunId;
|
|
346
|
+
try {
|
|
347
|
+
workflowRunId = (await start(options.workflow, [input], { attributes: {
|
|
348
|
+
[WORKFLOW_ATTRIBUTES.tenant]: chat.organizationId,
|
|
349
|
+
[WORKFLOW_ATTRIBUTES.actor]: context.userId,
|
|
350
|
+
[WORKFLOW_ATTRIBUTES.key]: `ai-chat:${chat.id}`
|
|
351
|
+
} })).runId;
|
|
352
|
+
} catch (cause) {
|
|
353
|
+
await context.chats.runs.release(chat.id, streamId, {
|
|
354
|
+
status: "failed",
|
|
355
|
+
error: String(cause)
|
|
356
|
+
});
|
|
357
|
+
return problemResponse(dbError("unexpected", "The answer could not be started.", { code: "AI_CHAT_RUN_FAILED" }));
|
|
358
|
+
}
|
|
359
|
+
const attached = await context.chats.runs.attach(runId, workflowRunId);
|
|
360
|
+
if (!attached.ok) {
|
|
361
|
+
await getRun(workflowRunId).cancel().catch(() => void 0);
|
|
362
|
+
await context.chats.runs.release(chat.id, streamId, {
|
|
363
|
+
status: "failed",
|
|
364
|
+
error: attached.error.message
|
|
365
|
+
});
|
|
366
|
+
return problemResponse(attached.error);
|
|
367
|
+
}
|
|
368
|
+
return streamSegment(context, chat, workflowRunId, streamId, messageId);
|
|
369
|
+
}
|
|
370
|
+
/** The durable run the decided approvals belong to, or a problem. */
|
|
371
|
+
async function runOf(context, decided) {
|
|
372
|
+
const runId = decided.find((row) => row.runId !== void 0)?.runId;
|
|
373
|
+
if (runId === void 0) return notDurable();
|
|
374
|
+
const run = await context.chats.runs.get(runId);
|
|
375
|
+
if (!run.ok) return problemResponse(run.error);
|
|
376
|
+
return run.data.engine === WORKFLOW_ENGINE && run.data.externalRunId !== void 0 ? run.data : notDurable();
|
|
377
|
+
}
|
|
378
|
+
/** Decides, then claims a segment and resumes the turn when nothing is pending. */
|
|
379
|
+
async function continueTurn(chatId, decisions, context) {
|
|
380
|
+
const chat = await context.chats.chats.get(chatId);
|
|
381
|
+
if (!chat.ok) return problemResponse(chat.error);
|
|
382
|
+
const decided = [];
|
|
383
|
+
for (const decision of decisions) {
|
|
384
|
+
const row = await context.chats.approvals.decide(decision.approvalId, decision.approved, decision.reason);
|
|
385
|
+
if (!row.ok) return problemResponse(row.error);
|
|
386
|
+
if (row.data.chatId !== chatId) return badRequest("The approvals belong to another chat.");
|
|
387
|
+
decided.push(row.data);
|
|
388
|
+
}
|
|
389
|
+
const run = await runOf(context, decided);
|
|
390
|
+
if (run instanceof Response) return run;
|
|
391
|
+
const all = await context.chats.approvals.list(chatId);
|
|
392
|
+
if (!all.ok) return problemResponse(all.error);
|
|
393
|
+
if (all.data.some((row) => row.runId === run.id && row.decision === "pending")) return { continued: false };
|
|
394
|
+
const workflowRunId = run.externalRunId ?? "";
|
|
395
|
+
const streamId = newId();
|
|
396
|
+
const claim = await context.chats.runs.claim(chatId, streamId, {
|
|
397
|
+
engine: WORKFLOW_ENGINE,
|
|
398
|
+
externalRunId: workflowRunId,
|
|
399
|
+
...run.model === void 0 ? {} : { model: run.model },
|
|
400
|
+
...run.assistantMessageId === void 0 ? {} : { messageId: run.assistantMessageId }
|
|
401
|
+
});
|
|
402
|
+
if (!claim.ok) return problemResponse(claim.error);
|
|
403
|
+
const runId = claim.data.runId;
|
|
404
|
+
if (!claim.data.claimed || runId === void 0) return busy();
|
|
405
|
+
const resume = {
|
|
406
|
+
streamId,
|
|
407
|
+
runId
|
|
408
|
+
};
|
|
409
|
+
try {
|
|
410
|
+
await resumeHook(durableTurnToken(workflowRunId), resume);
|
|
411
|
+
} catch (cause) {
|
|
412
|
+
await context.chats.runs.release(chatId, streamId, {
|
|
413
|
+
status: "failed",
|
|
414
|
+
error: String(cause)
|
|
415
|
+
});
|
|
416
|
+
return problemResponse(dbError("conflict", "The turn is no longer waiting.", { code: "AI_CHAT_NOT_WAITING" }));
|
|
417
|
+
}
|
|
418
|
+
return {
|
|
419
|
+
continued: true,
|
|
420
|
+
chat: chat.data,
|
|
421
|
+
workflowRunId,
|
|
422
|
+
streamId,
|
|
423
|
+
messageId: run.assistantMessageId
|
|
424
|
+
};
|
|
425
|
+
}
|
|
426
|
+
async function respond(request, context) {
|
|
427
|
+
const body = await readJson(request);
|
|
428
|
+
const approvals = decisionsOf$1(isRecord(body) ? body["approvals"] : void 0);
|
|
429
|
+
if (approvals === void 0) return startTurn(body, context);
|
|
430
|
+
if (typeof approvals === "string") return badRequest(approvals);
|
|
431
|
+
const chatId = isRecord(body) ? body["id"] : void 0;
|
|
432
|
+
if (typeof chatId !== "string" || chatId === "") return badRequest("Expected the chat id.");
|
|
433
|
+
const continued = await continueTurn(chatId, approvals, context);
|
|
434
|
+
if (continued instanceof Response) return continued;
|
|
435
|
+
if (!continued.continued) return problemResponse(dbError("conflict", "Other approvals of this answer are pending.", { code: "AI_APPROVALS_PENDING" }));
|
|
436
|
+
return streamSegment(context, continued.chat, continued.workflowRunId, continued.streamId, continued.messageId);
|
|
437
|
+
}
|
|
438
|
+
/** The chat's running durable run, else its latest one. */
|
|
439
|
+
async function latestRun(context, chat) {
|
|
440
|
+
if (chat.activeRunId !== void 0) {
|
|
441
|
+
const run = await context.chats.runs.get(chat.activeRunId);
|
|
442
|
+
if (!run.ok) return problemResponse(run.error);
|
|
443
|
+
return run.data;
|
|
444
|
+
}
|
|
445
|
+
const runs = await context.chats.runs.list({
|
|
446
|
+
chatId: chat.id,
|
|
447
|
+
limit: 1
|
|
448
|
+
});
|
|
449
|
+
if (!runs.ok) return problemResponse(runs.error);
|
|
450
|
+
return runs.data[0];
|
|
451
|
+
}
|
|
452
|
+
async function resume(chatId, context, resumeOptions = {}) {
|
|
453
|
+
const chat = await context.chats.chats.get(chatId);
|
|
454
|
+
if (!chat.ok) return chat.error.kind === "not_found" ? new Response(null, { status: 204 }) : problemResponse(chat.error);
|
|
455
|
+
const run = await latestRun(context, chat.data);
|
|
456
|
+
if (run instanceof Response) return run;
|
|
457
|
+
const streamId = run?.streamId;
|
|
458
|
+
if (run === void 0 || streamId === void 0) return new Response(null, { status: 204 });
|
|
459
|
+
const startIndex = Math.max(0, Math.trunc(resumeOptions.startIndex ?? 0));
|
|
460
|
+
if (run.engine === WORKFLOW_ENGINE && run.externalRunId !== void 0) {
|
|
461
|
+
let live;
|
|
462
|
+
try {
|
|
463
|
+
live = await opened(segmentChunks(run.externalRunId, streamId, run.assistantMessageId, startIndex, resumeOptions.signal).pipeThrough(new JsonToSseTransformStream()));
|
|
464
|
+
} catch {
|
|
465
|
+
live = void 0;
|
|
466
|
+
}
|
|
467
|
+
if (live !== void 0) return sse(live, run.externalRunId);
|
|
468
|
+
}
|
|
469
|
+
const stored = await resumeFromStore(options.streams, streamId, {
|
|
470
|
+
fromIdx: startIndex,
|
|
471
|
+
...resumeOptions.signal === void 0 ? {} : { signal: resumeOptions.signal }
|
|
472
|
+
});
|
|
473
|
+
if (!stored.ok) return problemResponse(stored.error);
|
|
474
|
+
return stored.data === void 0 ? new Response(null, { status: 204 }) : sse(stored.data, run.externalRunId);
|
|
475
|
+
}
|
|
476
|
+
async function stop(chatId, context) {
|
|
477
|
+
const stopped = await context.chats.runs.stop(chatId);
|
|
478
|
+
if (!stopped.ok) return problemResponse(stopped.error);
|
|
479
|
+
if (stopped.data === void 0) return new Response(null, { status: 204 });
|
|
480
|
+
const run = await context.chats.runs.get(stopped.data.runId);
|
|
481
|
+
if (!run.ok) return problemResponse(run.error);
|
|
482
|
+
const workflowRunId = run.data.externalRunId;
|
|
483
|
+
if (workflowRunId === void 0) return new Response(null, { status: 204 });
|
|
484
|
+
try {
|
|
485
|
+
await resumeHook(durableStopToken(workflowRunId), {});
|
|
486
|
+
} catch {
|
|
487
|
+
let cancelled = true;
|
|
488
|
+
try {
|
|
489
|
+
await getRun(workflowRunId).cancel();
|
|
490
|
+
} catch {
|
|
491
|
+
cancelled = false;
|
|
492
|
+
}
|
|
493
|
+
await context.chats.runs.release(chatId, stopped.data.streamId, { status: "cancelled" });
|
|
494
|
+
if (!cancelled) return problemResponse(dbError("unexpected", "The answer could not be stopped.", { code: "AI_CHAT_STOP_FAILED" }));
|
|
495
|
+
}
|
|
496
|
+
return new Response(null, { status: 204 });
|
|
497
|
+
}
|
|
498
|
+
async function decide(chatId, decisions, context) {
|
|
499
|
+
if (decisions.length === 0) return badRequest("Expected approvals.");
|
|
500
|
+
const continued = await continueTurn(chatId, decisions, context);
|
|
501
|
+
if (continued instanceof Response) return continued;
|
|
502
|
+
return Response.json(continued.continued ? {
|
|
503
|
+
continued: true,
|
|
504
|
+
streamId: continued.streamId
|
|
505
|
+
} : { continued: false });
|
|
506
|
+
}
|
|
507
|
+
return {
|
|
508
|
+
respond,
|
|
509
|
+
resume,
|
|
510
|
+
stop,
|
|
511
|
+
decide
|
|
512
|
+
};
|
|
513
|
+
}
|
|
514
|
+
//#endregion
|
|
515
|
+
//#region src/ai-sdk/workflow/steps.ts
|
|
516
|
+
/**
|
|
517
|
+
* Saves a turn's answer (service role) with its AI SDK form next to the
|
|
518
|
+
* canonical one. The message id is the idempotency key: a retried step, or
|
|
519
|
+
* the save after the next agent pass, updates the same message.
|
|
520
|
+
*/
|
|
521
|
+
async function saveMessagesStep(chats, input) {
|
|
522
|
+
await chats.messages.saveAssistant(input.chatId, input.message, {
|
|
523
|
+
parentId: input.parentId,
|
|
524
|
+
status: input.status,
|
|
525
|
+
model: input.model,
|
|
526
|
+
format: AI_SDK_UI_FORMAT,
|
|
527
|
+
native: toUIMessage(input.message),
|
|
528
|
+
runId: input.runId
|
|
529
|
+
}).orThrow();
|
|
530
|
+
}
|
|
531
|
+
async function recordApprovals(chats, input) {
|
|
532
|
+
for (const request of input.requests) await chats.approvals.request(input.chatId, {
|
|
533
|
+
approvalId: request.approvalId,
|
|
534
|
+
tool: request.toolName,
|
|
535
|
+
toolCallId: request.toolCallId,
|
|
536
|
+
input: request.input,
|
|
537
|
+
runId: input.runId,
|
|
538
|
+
messageId: input.messageId,
|
|
539
|
+
...request.signature === void 0 ? {} : { signature: request.signature }
|
|
540
|
+
}).orThrow();
|
|
541
|
+
}
|
|
542
|
+
async function decisionsOf(chats, input) {
|
|
543
|
+
return (await chats.approvals.list(input.chatId, input.approvalIds).orThrow()).flatMap((row) => row.decision === "pending" ? [] : [{
|
|
544
|
+
approvalId: row.approvalId,
|
|
545
|
+
approved: row.decision === "approved",
|
|
546
|
+
...row.reason === void 0 ? {} : { reason: row.reason }
|
|
547
|
+
}]);
|
|
548
|
+
}
|
|
549
|
+
async function release(chats, input, options) {
|
|
550
|
+
await chats.runs.release(input.chatId, input.streamId, runRelease(input.status, input.usage, input.error)).orThrow();
|
|
551
|
+
const { usage } = input;
|
|
552
|
+
if (usage?.costMicroUsd === void 0 && usage?.generationId !== void 0 && options.enqueueCostBackfill) await options.enqueueCostBackfill({
|
|
553
|
+
generationId: usage.generationId,
|
|
554
|
+
organizationId: input.organizationId
|
|
555
|
+
});
|
|
556
|
+
}
|
|
557
|
+
/** A durable turn's database steps on a chat block's service transport. */
|
|
558
|
+
function durableSteps(chats, options = {}) {
|
|
559
|
+
return {
|
|
560
|
+
save: (input) => saveMessagesStep(chats, input),
|
|
561
|
+
approvals: (input) => recordApprovals(chats, input),
|
|
562
|
+
decisions: (input) => decisionsOf(chats, input),
|
|
563
|
+
release: (input) => release(chats, input, options)
|
|
564
|
+
};
|
|
565
|
+
}
|
|
566
|
+
/**
|
|
567
|
+
* Runs one of a durable turn's database steps. Call it from the app's one
|
|
568
|
+
* `"use step"` function, so the Workflow SDK records and retries each call;
|
|
569
|
+
* a database error throws, which retries the step.
|
|
570
|
+
*/
|
|
571
|
+
function runDurableStep(chats, name, input, options = {}) {
|
|
572
|
+
return durableSteps(chats, options)[name](input);
|
|
573
|
+
}
|
|
574
|
+
//#endregion
|
|
575
|
+
export { WORKFLOW_RUN_ID_HEADER, durableChat, durableSteps, durableStopToken, durableTurn, durableTurnToken, runDurableStep, saveMessagesStep };
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { i as AssistantTransportConfig, n as UseAssistantOptions, t as AssistantState } from "../../../index-BpFYMsi0.js";
|
|
2
|
+
import { ChatTransport, UIMessage } from "ai";
|
|
3
|
+
//#region src/ai-sdk/workflow/react/index.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* The transport for `durableChat`: the Workflow SDK's chat transport, which
|
|
6
|
+
* reconnects until the segment's `finish` when a request drops. It sends
|
|
7
|
+
* the user's newest message, or the answered approvals of the last answer
|
|
8
|
+
* so the waiting turn continues. Pass it as `useAssistant({ transport })`.
|
|
9
|
+
*/
|
|
10
|
+
export declare function durableTransport(config: AssistantTransportConfig): ChatTransport<UIMessage>;
|
|
11
|
+
export type UseDurableAssistantOptions = Omit<UseAssistantOptions, "transport">;
|
|
12
|
+
/**
|
|
13
|
+
* `useAssistant` on `durableChat`. It continues the answer once every
|
|
14
|
+
* approval is answered. `resume` defaults to `false`: pass
|
|
15
|
+
* `chat.activeStreamId !== undefined` from the chat row so a reload picks
|
|
16
|
+
* up the running answer.
|
|
17
|
+
*/
|
|
18
|
+
export declare function useDurableAssistant(options: UseDurableAssistantOptions): AssistantState;
|
|
19
|
+
//#endregion
|
|
20
|
+
export type { AssistantState };
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { n as assistantBody, t as useAssistant } from "../../../react-4ZqkP8da.js";
|
|
3
|
+
import { lastAssistantMessageIsCompleteWithApprovalResponses } from "ai";
|
|
4
|
+
import { WorkflowChatTransport } from "@ai-sdk/workflow/client";
|
|
5
|
+
//#region src/ai-sdk/workflow/react/index.ts
|
|
6
|
+
/** The decisions in an assistant message whose approvals the user answered. */
|
|
7
|
+
function approvalsOf(message) {
|
|
8
|
+
if (message?.role !== "assistant") return [];
|
|
9
|
+
return message.parts.flatMap((part) => "state" in part && part.state === "approval-responded" ? [{
|
|
10
|
+
approvalId: part.approval.id,
|
|
11
|
+
approved: part.approval.approved,
|
|
12
|
+
...part.approval.reason === void 0 ? {} : { reason: part.approval.reason }
|
|
13
|
+
}] : []);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* The transport for `durableChat`: the Workflow SDK's chat transport, which
|
|
17
|
+
* reconnects until the segment's `finish` when a request drops. It sends
|
|
18
|
+
* the user's newest message, or the answered approvals of the last answer
|
|
19
|
+
* so the waiting turn continues. Pass it as `useAssistant({ transport })`.
|
|
20
|
+
*/
|
|
21
|
+
function durableTransport(config) {
|
|
22
|
+
const { api, headers } = config;
|
|
23
|
+
const extra = headers === void 0 ? {} : { headers: { ...headers } };
|
|
24
|
+
const transport = new WorkflowChatTransport({
|
|
25
|
+
api,
|
|
26
|
+
prepareSendMessagesRequest: (request) => {
|
|
27
|
+
const approvals = approvalsOf(request.messages.at(-1));
|
|
28
|
+
return {
|
|
29
|
+
...extra,
|
|
30
|
+
body: approvals.length > 0 ? {
|
|
31
|
+
...config.body,
|
|
32
|
+
id: request.id,
|
|
33
|
+
approvals
|
|
34
|
+
} : assistantBody(config, request)
|
|
35
|
+
};
|
|
36
|
+
},
|
|
37
|
+
prepareReconnectToStreamRequest: (request) => ({
|
|
38
|
+
...extra,
|
|
39
|
+
api: `${api}/${encodeURIComponent(request.id)}/stream`
|
|
40
|
+
})
|
|
41
|
+
});
|
|
42
|
+
return {
|
|
43
|
+
sendMessages: ({ messageId, abortSignal, ...rest }) => transport.sendMessages({
|
|
44
|
+
...rest,
|
|
45
|
+
...messageId === void 0 ? {} : { messageId },
|
|
46
|
+
...abortSignal === void 0 ? {} : { abortSignal }
|
|
47
|
+
}),
|
|
48
|
+
reconnectToStream: (options) => transport.reconnectToStream(options)
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* `useAssistant` on `durableChat`. It continues the answer once every
|
|
53
|
+
* approval is answered. `resume` defaults to `false`: pass
|
|
54
|
+
* `chat.activeStreamId !== undefined` from the chat row so a reload picks
|
|
55
|
+
* up the running answer.
|
|
56
|
+
*/
|
|
57
|
+
function useDurableAssistant(options) {
|
|
58
|
+
return useAssistant({
|
|
59
|
+
...options,
|
|
60
|
+
resume: options.resume ?? false,
|
|
61
|
+
sendAutomaticallyWhen: options.sendAutomaticallyWhen ?? lastAssistantMessageIsCompleteWithApprovalResponses,
|
|
62
|
+
transport: durableTransport
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
//#endregion
|
|
66
|
+
export { durableTransport, useDurableAssistant };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { i as AssistantTransportConfig, t as AssistantState } from "../../../index-BpFYMsi0.js";
|
|
2
|
+
import { UseDurableAssistantOptions } from "./index.js";
|
|
3
|
+
import { ChatTransport, UIMessage } from "ai";
|
|
4
|
+
//#region src/ai-sdk/workflow/react/server.d.ts
|
|
5
|
+
/** The `react-server` build of `durableTransport`. */
|
|
6
|
+
export declare const durableTransport: (config: AssistantTransportConfig) => ChatTransport<UIMessage>;
|
|
7
|
+
/** The `react-server` build of `useDurableAssistant`. */
|
|
8
|
+
export declare const useDurableAssistant: (options: UseDurableAssistantOptions) => AssistantState;
|
|
9
|
+
//#endregion
|
|
10
|
+
export type { AssistantState, UseDurableAssistantOptions };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
//#region src/ai-sdk/workflow/react/server.ts
|
|
2
|
+
const CLIENT_ONLY = "better-supabase: the durable chat hooks run in Client Components only. In Server Components read the chat row and pass `resume` and `messages` to the client.";
|
|
3
|
+
/** The `react-server` build of `durableTransport`. */
|
|
4
|
+
const durableTransport = () => {
|
|
5
|
+
throw new Error(CLIENT_ONLY);
|
|
6
|
+
};
|
|
7
|
+
/** The `react-server` build of `useDurableAssistant`. */
|
|
8
|
+
const useDurableAssistant = () => {
|
|
9
|
+
throw new Error(CLIENT_ONLY);
|
|
10
|
+
};
|
|
11
|
+
//#endregion
|
|
12
|
+
export { durableTransport, useDurableAssistant };
|