gemi 0.84.1 → 0.86.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 (280) hide show
  1. package/dist/ai/Agent.d.ts +41 -3
  2. package/dist/ai/Agent.d.ts.map +1 -1
  3. package/dist/ai/AgentController.d.ts +238 -0
  4. package/dist/ai/AgentController.d.ts.map +1 -1
  5. package/dist/ai/AgentProvider.d.ts +15 -0
  6. package/dist/ai/AgentProvider.d.ts.map +1 -1
  7. package/dist/ai/client/index.d.ts +2 -2
  8. package/dist/ai/client/index.d.ts.map +1 -1
  9. package/dist/ai/client/index.js +138 -35
  10. package/dist/ai/client/index.js.map +1 -1
  11. package/dist/ai/client/reducer.d.ts +7 -1
  12. package/dist/ai/client/reducer.d.ts.map +1 -1
  13. package/dist/ai/generate.d.ts.map +1 -1
  14. package/dist/ai/index.d.ts +4 -2
  15. package/dist/ai/index.d.ts.map +1 -1
  16. package/dist/ai/index.js +12 -12
  17. package/dist/ai/index.js.map +19 -16
  18. package/dist/ai/providers/call.d.ts +4 -0
  19. package/dist/ai/providers/call.d.ts.map +1 -1
  20. package/dist/ai/providers/fileRejection.d.ts +84 -0
  21. package/dist/ai/providers/fileRejection.d.ts.map +1 -0
  22. package/dist/ai/providers/request.d.ts.map +1 -1
  23. package/dist/ai/redact.d.ts +70 -0
  24. package/dist/ai/redact.d.ts.map +1 -0
  25. package/dist/ai/signing.d.ts +33 -4
  26. package/dist/ai/signing.d.ts.map +1 -1
  27. package/dist/ai/store/Attachments.d.ts +5 -3
  28. package/dist/ai/store/Attachments.d.ts.map +1 -1
  29. package/dist/ai/store/FileOwners.d.ts +59 -0
  30. package/dist/ai/store/FileOwners.d.ts.map +1 -0
  31. package/dist/ai/store/LiveRuns.d.ts +25 -0
  32. package/dist/ai/store/LiveRuns.d.ts.map +1 -1
  33. package/dist/ai/store/MemoryAgentStore.d.ts +1 -0
  34. package/dist/ai/store/MemoryAgentStore.d.ts.map +1 -1
  35. package/dist/ai/store/Nonces.d.ts +109 -0
  36. package/dist/ai/store/Nonces.d.ts.map +1 -0
  37. package/dist/ai/store/index.d.ts +2 -0
  38. package/dist/ai/store/index.d.ts.map +1 -1
  39. package/dist/ai/types.d.ts +30 -1
  40. package/dist/ai/types.d.ts.map +1 -1
  41. package/dist/ai/useChat.d.ts +62 -3
  42. package/dist/ai/useChat.d.ts.map +1 -1
  43. package/dist/app/index.js +1 -1
  44. package/dist/bun/plugin.js +1 -1
  45. package/dist/bun/preload.js +1 -1
  46. package/dist/{chunk-82nn71zs.js → chunk-09sr33ff.js} +2 -2
  47. package/dist/{chunk-82nn71zs.js.map → chunk-09sr33ff.js.map} +1 -1
  48. package/dist/chunk-174jkg6d.js +7 -0
  49. package/dist/{chunk-302mkqeq.js.map → chunk-174jkg6d.js.map} +9 -8
  50. package/dist/{chunk-87x692j7.js → chunk-1b5s4w5f.js} +2 -2
  51. package/dist/{chunk-87x692j7.js.map → chunk-1b5s4w5f.js.map} +1 -1
  52. package/dist/{chunk-rmv1jp9p.js → chunk-1jcp8m8h.js} +2 -2
  53. package/dist/{chunk-rmv1jp9p.js.map → chunk-1jcp8m8h.js.map} +1 -1
  54. package/dist/{chunk-g6qe6wyb.js → chunk-1w5a11cd.js} +2 -2
  55. package/dist/{chunk-g6qe6wyb.js.map → chunk-1w5a11cd.js.map} +1 -1
  56. package/dist/chunk-1wby1sr2.js +5 -0
  57. package/dist/{chunk-e43drft2.js.map → chunk-1wby1sr2.js.map} +3 -3
  58. package/dist/{chunk-vmpzg4z5.js → chunk-1yq1e6sb.js} +3 -3
  59. package/dist/{chunk-vmpzg4z5.js.map → chunk-1yq1e6sb.js.map} +1 -1
  60. package/dist/chunk-1yzdxv2a.js +5 -0
  61. package/dist/{chunk-tmwsvf02.js.map → chunk-1yzdxv2a.js.map} +1 -1
  62. package/dist/chunk-2dzqrf0z.js +55 -0
  63. package/dist/{chunk-rp5j1mgk.js.map → chunk-2dzqrf0z.js.map} +3 -3
  64. package/dist/{chunk-ah9ajys0.js → chunk-2gdhcswa.js} +1 -1
  65. package/dist/{chunk-1evk2pma.js → chunk-2yw23zhn.js} +4 -4
  66. package/dist/{chunk-1evk2pma.js.map → chunk-2yw23zhn.js.map} +1 -1
  67. package/dist/{chunk-3z6wkvwj.js → chunk-4ysar3ev.js} +2 -2
  68. package/dist/{chunk-3z6wkvwj.js.map → chunk-4ysar3ev.js.map} +1 -1
  69. package/dist/{chunk-z409rk5j.js → chunk-4zj05vry.js} +2 -2
  70. package/dist/{chunk-z409rk5j.js.map → chunk-4zj05vry.js.map} +1 -1
  71. package/dist/{chunk-1cebv3h8.js → chunk-55x9kkdt.js} +2 -2
  72. package/dist/{chunk-1cebv3h8.js.map → chunk-55x9kkdt.js.map} +1 -1
  73. package/dist/{chunk-3zb2ycxj.js → chunk-7c33ngqs.js} +2 -2
  74. package/dist/{chunk-3zb2ycxj.js.map → chunk-7c33ngqs.js.map} +1 -1
  75. package/dist/{chunk-en3mtnsg.js → chunk-7n5775qx.js} +2 -2
  76. package/dist/{chunk-en3mtnsg.js.map → chunk-7n5775qx.js.map} +1 -1
  77. package/dist/{chunk-bn9pzgww.js → chunk-7nj2t2gm.js} +2 -2
  78. package/dist/{chunk-bn9pzgww.js.map → chunk-7nj2t2gm.js.map} +1 -1
  79. package/dist/{chunk-kfavcgv2.js → chunk-81k26w39.js} +2 -2
  80. package/dist/{chunk-kfavcgv2.js.map → chunk-81k26w39.js.map} +1 -1
  81. package/dist/{chunk-cg4k40zy.js → chunk-81v4c4b1.js} +2 -2
  82. package/dist/{chunk-cg4k40zy.js.map → chunk-81v4c4b1.js.map} +1 -1
  83. package/dist/{chunk-wh728wd6.js → chunk-8gexb1gt.js} +2 -2
  84. package/dist/{chunk-wh728wd6.js.map → chunk-8gexb1gt.js.map} +1 -1
  85. package/dist/{chunk-zfch4da5.js → chunk-9tsw1bmt.js} +2 -2
  86. package/dist/{chunk-8mmfpqgs.js.map → chunk-9tsw1bmt.js.map} +1 -1
  87. package/dist/{chunk-m0zba09s.js → chunk-9tv5j3b2.js} +3 -3
  88. package/dist/{chunk-m0zba09s.js.map → chunk-9tv5j3b2.js.map} +1 -1
  89. package/dist/{chunk-jg9eqd3r.js → chunk-c3gzpjba.js} +1 -1
  90. package/dist/{chunk-r5e4vpa1.js → chunk-cbycz5z3.js} +2 -2
  91. package/dist/{chunk-r5e4vpa1.js.map → chunk-cbycz5z3.js.map} +1 -1
  92. package/dist/{chunk-cfvq30n4.js → chunk-cfykfnqx.js} +2 -2
  93. package/dist/{chunk-cfvq30n4.js.map → chunk-cfykfnqx.js.map} +1 -1
  94. package/dist/{chunk-eysexnqb.js → chunk-ct7wxm98.js} +2 -2
  95. package/dist/{chunk-eysexnqb.js.map → chunk-ct7wxm98.js.map} +1 -1
  96. package/dist/{chunk-v27a4se1.js → chunk-d3jkypc7.js} +3 -3
  97. package/dist/{chunk-v27a4se1.js.map → chunk-d3jkypc7.js.map} +1 -1
  98. package/dist/{chunk-vfrrzr10.js → chunk-dadygfkf.js} +2 -2
  99. package/dist/{chunk-vfrrzr10.js.map → chunk-dadygfkf.js.map} +1 -1
  100. package/dist/{chunk-m4xw99vm.js → chunk-dwqh79e5.js} +2 -2
  101. package/dist/{chunk-m4xw99vm.js.map → chunk-dwqh79e5.js.map} +1 -1
  102. package/dist/chunk-eptv0nvv.js +24 -0
  103. package/dist/chunk-eptv0nvv.js.map +17 -0
  104. package/dist/{chunk-ng8pp9k2.js → chunk-fbwe0agk.js} +2 -2
  105. package/dist/{chunk-ng8pp9k2.js.map → chunk-fbwe0agk.js.map} +1 -1
  106. package/dist/{chunk-495qwteq.js → chunk-fc2je244.js} +3 -3
  107. package/dist/{chunk-495qwteq.js.map → chunk-fc2je244.js.map} +1 -1
  108. package/dist/{chunk-gr61ymse.js → chunk-gx0x772p.js} +2 -2
  109. package/dist/{chunk-gr61ymse.js.map → chunk-gx0x772p.js.map} +1 -1
  110. package/dist/{chunk-tdnfhe7x.js → chunk-ha705bcz.js} +3 -3
  111. package/dist/{chunk-tdnfhe7x.js.map → chunk-ha705bcz.js.map} +1 -1
  112. package/dist/chunk-jhe0t7yj.js +5 -0
  113. package/dist/chunk-jhe0t7yj.js.map +11 -0
  114. package/dist/{chunk-d0qwdeza.js → chunk-k5j65f2c.js} +2 -2
  115. package/dist/{chunk-d0qwdeza.js.map → chunk-k5j65f2c.js.map} +1 -1
  116. package/dist/{chunk-pt59xjfc.js → chunk-kmsrzbx1.js} +2 -2
  117. package/dist/{chunk-pt59xjfc.js.map → chunk-kmsrzbx1.js.map} +1 -1
  118. package/dist/{chunk-v1nm4tcq.js → chunk-m7y8d3k7.js} +2 -2
  119. package/dist/{chunk-v1nm4tcq.js.map → chunk-m7y8d3k7.js.map} +1 -1
  120. package/dist/{chunk-k2qh3hvd.js → chunk-mk8m3ffx.js} +2 -2
  121. package/dist/{chunk-k2qh3hvd.js.map → chunk-mk8m3ffx.js.map} +1 -1
  122. package/dist/{chunk-z7442w3q.js → chunk-mszy6cfw.js} +2 -2
  123. package/dist/{chunk-z7442w3q.js.map → chunk-mszy6cfw.js.map} +1 -1
  124. package/dist/{chunk-kb3xk9r8.js → chunk-ndat0nf0.js} +2 -2
  125. package/dist/{chunk-kb3xk9r8.js.map → chunk-ndat0nf0.js.map} +1 -1
  126. package/dist/{chunk-j9wqzemf.js → chunk-p0m3qgs5.js} +2 -2
  127. package/dist/{chunk-j9wqzemf.js.map → chunk-p0m3qgs5.js.map} +1 -1
  128. package/dist/{chunk-8mmfpqgs.js → chunk-p7r3ecpk.js} +2 -2
  129. package/dist/{chunk-zfch4da5.js.map → chunk-p7r3ecpk.js.map} +1 -1
  130. package/dist/{chunk-zp971jp2.js → chunk-pmmrhak1.js} +3 -3
  131. package/dist/{chunk-zp971jp2.js.map → chunk-pmmrhak1.js.map} +1 -1
  132. package/dist/{chunk-0agfx93f.js → chunk-ptkt4h2j.js} +2 -2
  133. package/dist/{chunk-0agfx93f.js.map → chunk-ptkt4h2j.js.map} +1 -1
  134. package/dist/{chunk-nvj1z2rs.js → chunk-pzwyg474.js} +2 -2
  135. package/dist/{chunk-nvj1z2rs.js.map → chunk-pzwyg474.js.map} +1 -1
  136. package/dist/{chunk-73dk6k4p.js → chunk-qje4kdff.js} +3 -3
  137. package/dist/{chunk-73dk6k4p.js.map → chunk-qje4kdff.js.map} +1 -1
  138. package/dist/{chunk-yk8s5egf.js → chunk-rdnm6rem.js} +2 -2
  139. package/dist/{chunk-yk8s5egf.js.map → chunk-rdnm6rem.js.map} +1 -1
  140. package/dist/{chunk-enf9mdac.js → chunk-s046a984.js} +2 -2
  141. package/dist/{chunk-enf9mdac.js.map → chunk-s046a984.js.map} +1 -1
  142. package/dist/{chunk-1s914cdj.js → chunk-saqfc6vp.js} +3 -3
  143. package/dist/{chunk-1s914cdj.js.map → chunk-saqfc6vp.js.map} +1 -1
  144. package/dist/{chunk-pgpqsgzx.js → chunk-sejnmn1q.js} +1 -1
  145. package/dist/{chunk-xhha1gb3.js → chunk-sjckrbr2.js} +2 -2
  146. package/dist/{chunk-xhha1gb3.js.map → chunk-sjckrbr2.js.map} +1 -1
  147. package/dist/{chunk-r8nhndzb.js → chunk-swhyp0yw.js} +2 -2
  148. package/dist/{chunk-r8nhndzb.js.map → chunk-swhyp0yw.js.map} +1 -1
  149. package/dist/{chunk-wkdzz0rx.js → chunk-trdwxm5x.js} +3 -3
  150. package/dist/{chunk-wkdzz0rx.js.map → chunk-trdwxm5x.js.map} +1 -1
  151. package/dist/{chunk-aztkrzvf.js → chunk-v2hvnxsf.js} +2 -2
  152. package/dist/{chunk-aztkrzvf.js.map → chunk-v2hvnxsf.js.map} +1 -1
  153. package/dist/{chunk-57ryyhh3.js → chunk-v4ngf77f.js} +2 -2
  154. package/dist/{chunk-57ryyhh3.js.map → chunk-v4ngf77f.js.map} +1 -1
  155. package/dist/{chunk-159hyeng.js → chunk-v8nf45gt.js} +2 -2
  156. package/dist/{chunk-159hyeng.js.map → chunk-v8nf45gt.js.map} +1 -1
  157. package/dist/{chunk-ys4fejmx.js → chunk-vwp1g8wh.js} +2 -2
  158. package/dist/{chunk-ys4fejmx.js.map → chunk-vwp1g8wh.js.map} +1 -1
  159. package/dist/chunk-w312e9nx.js +5 -0
  160. package/dist/{chunk-ash9e6fn.js.map → chunk-w312e9nx.js.map} +4 -3
  161. package/dist/{chunk-wwdaswxh.js → chunk-wwzg4dmy.js} +3 -3
  162. package/dist/{chunk-wwdaswxh.js.map → chunk-wwzg4dmy.js.map} +1 -1
  163. package/dist/{chunk-wsx3j5ws.js → chunk-xckeyg3v.js} +2 -2
  164. package/dist/{chunk-wsx3j5ws.js.map → chunk-xckeyg3v.js.map} +1 -1
  165. package/dist/chunk-xx2zg6sk.js +17 -0
  166. package/dist/{chunk-49akdtfe.js.map → chunk-xx2zg6sk.js.map} +11 -12
  167. package/dist/{chunk-rqh2wdhb.js → chunk-y7qnx8vm.js} +2 -2
  168. package/dist/{chunk-rqh2wdhb.js.map → chunk-y7qnx8vm.js.map} +1 -1
  169. package/dist/{chunk-rv7da58g.js → chunk-z4k18gnp.js} +2 -2
  170. package/dist/{chunk-rv7da58g.js.map → chunk-z4k18gnp.js.map} +1 -1
  171. package/dist/{chunk-w099t7zj.js → chunk-zf4r4kat.js} +2 -2
  172. package/dist/{chunk-w099t7zj.js.map → chunk-zf4r4kat.js.map} +1 -1
  173. package/dist/{chunk-dvpxkzms.js → chunk-zs90w6ke.js} +2 -2
  174. package/dist/{chunk-dvpxkzms.js.map → chunk-zs90w6ke.js.map} +1 -1
  175. package/dist/chunks/{ThemeProvider-Dn3UREDn.js → ThemeProvider-D1kDfCwY.js} +59 -2
  176. package/dist/chunks/ThemeProvider-D1kDfCwY.js.map +1 -0
  177. package/dist/client/Link.d.ts.map +1 -1
  178. package/dist/client/MutationError.d.ts +60 -50
  179. package/dist/client/MutationError.d.ts.map +1 -1
  180. package/dist/client/ProgressManager.d.ts +1 -1
  181. package/dist/client/QueryResource.d.ts +20 -0
  182. package/dist/client/QueryResource.d.ts.map +1 -1
  183. package/dist/client/auth/useForgotPassword.d.ts +2 -1
  184. package/dist/client/auth/useForgotPassword.d.ts.map +1 -1
  185. package/dist/client/auth/useResetPassword.d.ts +2 -1
  186. package/dist/client/auth/useResetPassword.d.ts.map +1 -1
  187. package/dist/client/auth/useSignIn.d.ts +11 -1
  188. package/dist/client/auth/useSignIn.d.ts.map +1 -1
  189. package/dist/client/auth/useSignOut.d.ts +2 -1
  190. package/dist/client/auth/useSignOut.d.ts.map +1 -1
  191. package/dist/client/auth/useSignUp.d.ts +2 -1
  192. package/dist/client/auth/useSignUp.d.ts.map +1 -1
  193. package/dist/client/index.d.ts +3 -1
  194. package/dist/client/index.d.ts.map +1 -1
  195. package/dist/client/index.js +169 -65
  196. package/dist/client/index.js.map +1 -1
  197. package/dist/client/useMutation.d.ts +33 -6
  198. package/dist/client/useMutation.d.ts.map +1 -1
  199. package/dist/client/useQuery.d.ts.map +1 -1
  200. package/dist/config/index.js +1 -1
  201. package/dist/console/run.js +2 -2
  202. package/dist/console/run.js.map +1 -1
  203. package/dist/container/index.js +2 -2
  204. package/dist/container/index.js.map +1 -1
  205. package/dist/database/index.js +2 -2
  206. package/dist/database/index.js.map +1 -1
  207. package/dist/email/Email.d.ts.map +1 -1
  208. package/dist/email/debugEmail.d.ts +40 -0
  209. package/dist/email/debugEmail.d.ts.map +1 -0
  210. package/dist/email/index.js +4 -3
  211. package/dist/email/index.js.map +6 -5
  212. package/dist/facades/index.js +2 -2
  213. package/dist/facades/index.js.map +1 -1
  214. package/dist/foundation/index.js +2 -2
  215. package/dist/foundation/index.js.map +1 -1
  216. package/dist/http/ApiRouter.d.ts +12 -0
  217. package/dist/http/ApiRouter.d.ts.map +1 -1
  218. package/dist/http/CSRFMiddleware.d.ts +1 -1
  219. package/dist/http/CSRFMiddleware.d.ts.map +1 -1
  220. package/dist/http/Error.d.ts +50 -0
  221. package/dist/http/Error.d.ts.map +1 -1
  222. package/dist/http/HttpRequest.d.ts +26 -0
  223. package/dist/http/HttpRequest.d.ts.map +1 -1
  224. package/dist/http/RateLimitMiddleware.d.ts +6 -3
  225. package/dist/http/RateLimitMiddleware.d.ts.map +1 -1
  226. package/dist/http/Router.d.ts.map +1 -1
  227. package/dist/http/errors.d.ts.map +1 -1
  228. package/dist/http/index.d.ts +2 -1
  229. package/dist/http/index.d.ts.map +1 -1
  230. package/dist/http/index.js +2 -2
  231. package/dist/http/index.js.map +1 -1
  232. package/dist/http/mediaType.d.ts +16 -0
  233. package/dist/http/mediaType.d.ts.map +1 -0
  234. package/dist/http/refusal.d.ts +52 -0
  235. package/dist/http/refusal.d.ts.map +1 -0
  236. package/dist/i18n/dictionaryRuntime.js +2 -2
  237. package/dist/i18n/dictionaryRuntime.js.map +1 -1
  238. package/dist/i18n/index.js +2 -2
  239. package/dist/i18n/index.js.map +2 -2
  240. package/dist/kernel/index.js +2 -2
  241. package/dist/kernel/index.js.map +2 -2
  242. package/dist/orm/index.js +2 -2
  243. package/dist/orm/index.js.map +1 -1
  244. package/dist/server/devFetch.d.ts.map +1 -1
  245. package/dist/server/forwardedFor.d.ts +42 -0
  246. package/dist/server/forwardedFor.d.ts.map +1 -0
  247. package/dist/server/httpProd.d.ts.map +1 -1
  248. package/dist/server/index.js +2 -2
  249. package/dist/server/index.js.map +1 -1
  250. package/dist/server/staticFile.d.ts +33 -0
  251. package/dist/server/staticFile.d.ts.map +1 -0
  252. package/dist/server/unhandledError.d.ts.map +1 -1
  253. package/dist/services/index.js +2 -2
  254. package/dist/services/index.js.map +2 -2
  255. package/dist/services/mcp/McpRegistry.d.ts +2 -1
  256. package/dist/services/mcp/McpRegistry.d.ts.map +1 -1
  257. package/dist/services/mcp/toAgentTools.d.ts +1 -1
  258. package/dist/services/mcp/toAgentTools.d.ts.map +1 -1
  259. package/dist/services/queue/work.js +2 -2
  260. package/dist/services/queue/work.js.map +1 -1
  261. package/dist/services/router/notFound.d.ts.map +1 -1
  262. package/dist/services/router/policyDenied.d.ts.map +1 -1
  263. package/dist/services/router/serverQueryFetcher.d.ts.map +1 -1
  264. package/dist/support/index.js +2 -2
  265. package/dist/support/index.js.map +1 -1
  266. package/dist/testing/index.js +1 -1
  267. package/package.json +1 -1
  268. package/skills/gemi-react-best-practices/rules/controller-throw-framework-errors.md +5 -0
  269. package/dist/chunk-302mkqeq.js +0 -7
  270. package/dist/chunk-49akdtfe.js +0 -17
  271. package/dist/chunk-ash9e6fn.js +0 -5
  272. package/dist/chunk-e43drft2.js +0 -5
  273. package/dist/chunk-j5xcfeqx.js +0 -24
  274. package/dist/chunk-j5xcfeqx.js.map +0 -16
  275. package/dist/chunk-rp5j1mgk.js +0 -55
  276. package/dist/chunk-tmwsvf02.js +0 -5
  277. package/dist/chunks/ThemeProvider-Dn3UREDn.js.map +0 -1
  278. /package/dist/{chunk-ah9ajys0.js.map → chunk-2gdhcswa.js.map} +0 -0
  279. /package/dist/{chunk-jg9eqd3r.js.map → chunk-c3gzpjba.js.map} +0 -0
  280. /package/dist/{chunk-pgpqsgzx.js.map → chunk-sejnmn1q.js.map} +0 -0
@@ -37,7 +37,8 @@ function reduce(state, event, now) {
37
37
  threadId: event.threadId ?? state.threadId,
38
38
  runMessageIds: [],
39
39
  loadedTools: [],
40
- finishReason: void 0
40
+ finishReason: void 0,
41
+ usage: void 0
41
42
  };
42
43
  case "message-start": return withMessage(state, event.messageId, now, (message) => ({
43
44
  ...message,
@@ -143,24 +144,16 @@ function reduce(state, event, now) {
143
144
  ...message,
144
145
  finishReason: event.finishReason,
145
146
  ...event.outputTruncated ? { outputTruncated: true } : {},
147
+ ...event.usage ? { usage: event.usage } : {},
146
148
  content: event.outputTruncated || event.finishReason === "length" ? message.content.filter((part) => !(part.type === "output" && part.partial)) : message.content.map((part) => part.type === "output" && part.partial ? {
147
149
  ...part,
148
150
  partial: false
149
151
  } : part)
150
152
  }));
151
- case "usage": {
152
- const index = lastIndexWhere(state.messages, (message) => message.role === "assistant");
153
- if (index === -1) return state;
154
- const messages = state.messages.slice();
155
- messages[index] = {
156
- ...messages[index],
157
- usage: event.usage
158
- };
159
- return {
160
- ...state,
161
- messages
162
- };
163
- }
153
+ case "usage": return {
154
+ ...state,
155
+ usage: event.usage
156
+ };
164
157
  case "error": return {
165
158
  ...state,
166
159
  error: event.error,
@@ -337,7 +330,7 @@ function applyNested(run, event, now) {
337
330
  ...event.label !== void 0 ? { label: event.label } : {},
338
331
  messages: next.messages,
339
332
  ...next.finishReason !== void 0 ? { finishReason: next.finishReason } : {},
340
- ...event.event.type === "usage" ? { usage: event.event.usage } : {}
333
+ ...next.usage !== void 0 ? { usage: next.usage } : {}
341
334
  };
342
335
  }
343
336
  /**
@@ -361,10 +354,6 @@ function isFinished(state, messageId) {
361
354
  const message = state.messages.find((candidate) => candidate.id === messageId);
362
355
  return message !== void 0 && message.finishReason !== void 0;
363
356
  }
364
- function lastIndexWhere(items, match) {
365
- for (let i = items.length - 1; i >= 0; i--) if (match(items[i])) return i;
366
- return -1;
367
- }
368
357
  function withMessage(state, messageId, now, update) {
369
358
  const index = state.messages.findIndex((message) => message.id === messageId);
370
359
  const runMessageIds = state.runMessageIds.includes(messageId) ? state.runMessageIds : [...state.runMessageIds, messageId];
@@ -564,6 +553,27 @@ async function* decodeSSE(stream) {
564
553
  }
565
554
  //#endregion
566
555
  //#region ai/useChat.tsx
556
+ /**
557
+ * Why `attach()` rejected, for that file alone.
558
+ *
559
+ * `code` is the server's when it sent one — `unsupported_file_type`,
560
+ * `file_too_large`, `file_rejected` and `invalid_request` from
561
+ * `AgentController.upload`, or a framework refusal's `kind` such as
562
+ * `authentication` — and otherwise `upload_failed` (an answer that was
563
+ * not JSON, `status` says which) or `network_error` (no answer at all). A
564
+ * string rather than a union, because an app's own `attachmentDestination`
565
+ * can throw an error with a code of its own and that has to arrive intact.
566
+ */
567
+ var AttachError = class extends Error {
568
+ code;
569
+ status;
570
+ constructor(code, message, status) {
571
+ super(message);
572
+ this.name = "AttachError";
573
+ this.code = code;
574
+ if (status !== void 0) this.status = status;
575
+ }
576
+ };
567
577
  var localIdCounter = 0;
568
578
  /** Ids the client mints: messages it authored, and the correlation id it names a
569
579
  * run by before the server has. Server-assigned ids are what keep a reattached
@@ -596,6 +606,95 @@ async function httpError(response) {
596
606
  retryable: response.status === 429 || response.status >= 500
597
607
  };
598
608
  }
609
+ function abortError() {
610
+ return new DOMException("The upload was aborted.", "AbortError");
611
+ }
612
+ /** No progress wanted: `fetch`, which aborts on the signal by itself. */
613
+ async function fetchUpload(url, form, headers, signal) {
614
+ let response;
615
+ try {
616
+ response = await fetch(url, {
617
+ method: "POST",
618
+ headers,
619
+ body: form,
620
+ signal
621
+ });
622
+ } catch (error) {
623
+ if (isAbort(error) || signal?.aborted) throw abortError();
624
+ throw new AttachError("network_error", error instanceof Error && error.message ? error.message : "The upload could not be sent.");
625
+ }
626
+ try {
627
+ return {
628
+ status: response.status,
629
+ statusText: response.statusText,
630
+ body: await response.text()
631
+ };
632
+ } catch (error) {
633
+ if (isAbort(error) || signal?.aborted) throw abortError();
634
+ throw new AttachError("network_error", "The upload's answer could not be read.");
635
+ }
636
+ }
637
+ /**
638
+ * Progress wanted: `XMLHttpRequest`, the one browser API that reports bytes
639
+ * sent. Settled on `load`/`error`/`timeout`/`abort`, never on `readyState` 4,
640
+ * which an abort reaches too with status 0 (#671 is that bug in `useUpload`).
641
+ */
642
+ function xhrUpload(url, form, headers, signal, onProgress) {
643
+ return new Promise((resolve, reject) => {
644
+ const xhr = new XMLHttpRequest();
645
+ const onAbort = () => xhr.abort();
646
+ const done = () => signal?.removeEventListener("abort", onAbort);
647
+ xhr.addEventListener("load", () => {
648
+ done();
649
+ resolve({
650
+ status: xhr.status,
651
+ statusText: xhr.statusText,
652
+ body: xhr.responseText
653
+ });
654
+ });
655
+ xhr.addEventListener("abort", () => {
656
+ done();
657
+ reject(abortError());
658
+ });
659
+ const failed = () => {
660
+ done();
661
+ reject(new AttachError("network_error", "The upload could not be sent."));
662
+ };
663
+ xhr.addEventListener("error", failed);
664
+ xhr.addEventListener("timeout", failed);
665
+ xhr.upload.addEventListener("progress", (event) => {
666
+ try {
667
+ onProgress({
668
+ loaded: event.loaded,
669
+ total: event.lengthComputable ? event.total : 0
670
+ });
671
+ } catch {}
672
+ });
673
+ xhr.open("POST", url, true);
674
+ for (const [name, value] of Object.entries(headers)) xhr.setRequestHeader(name, value);
675
+ signal?.addEventListener("abort", onAbort, { once: true });
676
+ xhr.send(form);
677
+ });
678
+ }
679
+ /** A non-2xx answer as the file's error: the server's code and sentence when
680
+ * it sent `{ error: { code, message } }`, the status line when it did not. */
681
+ function attachErrorFrom(answer) {
682
+ let code = "upload_failed";
683
+ let message = answer.statusText || `The upload failed with status ${answer.status}.`;
684
+ try {
685
+ const data = JSON.parse(answer.body);
686
+ const error = data?.error;
687
+ if (typeof error === "string") {
688
+ if (error) message = error;
689
+ } else {
690
+ const named = error?.code ?? error?.kind;
691
+ if (typeof named === "string" && named) code = named;
692
+ const text = error?.message ?? data?.message;
693
+ if (typeof text === "string" && text) message = text;
694
+ }
695
+ } catch {}
696
+ return new AttachError(code, message, answer.status);
697
+ }
599
698
  function turnFrom(message) {
600
699
  let text = "";
601
700
  const files = [];
@@ -827,7 +926,7 @@ function useChat(path, params = {}) {
827
926
  else if (event.type === "error") handlers.current.onError?.(event.error);
828
927
  }
829
928
  }, [commit, setPhaseSafe]);
830
- const send = useCallback(async (turn) => {
929
+ const send = useCallback(async (turn, options = {}) => {
831
930
  const { base: url, extraBody: body } = requestRef.current;
832
931
  const superseded = abortRef.current;
833
932
  superseded?.controller.abort();
@@ -872,7 +971,8 @@ function useChat(path, params = {}) {
872
971
  turn,
873
972
  clientRunId,
874
973
  threadId: stateRef.current.threadId,
875
- messages: stateRef.current.threadId ? void 0 : forWire(history)
974
+ messages: stateRef.current.threadId ? void 0 : forWire(history),
975
+ ...options.regenerate && stateRef.current.threadId ? { regenerate: true } : {}
876
976
  };
877
977
  const response = await post(url, payload, controller.signal);
878
978
  if (!response.ok) {
@@ -1022,7 +1122,7 @@ function useChat(path, params = {}) {
1022
1122
  pending: [],
1023
1123
  error: null
1024
1124
  });
1025
- await send(turn);
1125
+ await send(turn, { regenerate: true });
1026
1126
  }, [commit, send]);
1027
1127
  const setMessages = useCallback((messages) => {
1028
1128
  commit({
@@ -1030,22 +1130,24 @@ function useChat(path, params = {}) {
1030
1130
  messages
1031
1131
  });
1032
1132
  }, [commit]);
1033
- const uploadFile = useCallback(async (file) => {
1133
+ const uploadFile = useCallback(async (file, options = {}) => {
1034
1134
  const { base: url, headers: extraHeaders, extraBody: body } = requestRef.current;
1135
+ const { signal, onProgress } = options;
1136
+ if (signal?.aborted) throw abortError();
1035
1137
  const form = new FormData();
1036
1138
  form.append("file", file);
1037
1139
  if (body !== void 0) form.append("body", JSON.stringify(body));
1038
- const response = await fetch(`${url}/files`, {
1039
- method: "POST",
1040
- headers: { ...extraHeaders },
1041
- body: form
1042
- });
1043
- if (!response.ok) {
1044
- const error = await httpError(response);
1045
- fail(error);
1046
- throw new Error(error.message);
1140
+ const threadId = stateRef.current.threadId;
1141
+ if (threadId) form.append("threadId", threadId);
1142
+ const answer = onProgress ? await xhrUpload(`${url}/files`, form, { ...extraHeaders }, signal, onProgress) : await fetchUpload(`${url}/files`, form, { ...extraHeaders }, signal);
1143
+ if (answer.status < 200 || answer.status > 299) throw attachErrorFrom(answer);
1144
+ let parsed;
1145
+ try {
1146
+ parsed = JSON.parse(answer.body);
1147
+ } catch {
1148
+ throw new AttachError("upload_failed", "The upload answered with something that is not JSON.", answer.status);
1047
1149
  }
1048
- const data = await response.json();
1150
+ const data = parsed;
1049
1151
  return {
1050
1152
  fileId: data.fileId,
1051
1153
  attachmentId: data.attachmentId,
@@ -1053,7 +1155,7 @@ function useChat(path, params = {}) {
1053
1155
  mimeType: data.mimeType ?? file.type,
1054
1156
  downgraded: data.downgraded
1055
1157
  };
1056
- }, [fail]);
1158
+ }, []);
1057
1159
  useEffect(() => {
1058
1160
  if (attachOnMount === false || !initialThreadId) return;
1059
1161
  const controller = new AbortController();
@@ -1097,12 +1199,13 @@ function useChat(path, params = {}) {
1097
1199
  setMessages,
1098
1200
  pending: state.pending,
1099
1201
  loadedTools: state.loadedTools,
1202
+ usage: state.usage,
1100
1203
  approve,
1101
1204
  answer,
1102
1205
  attach: uploadFile
1103
1206
  };
1104
1207
  }
1105
1208
  //#endregion
1106
- export { useChat };
1209
+ export { AttachError, useChat };
1107
1210
 
1108
1211
  //# sourceMappingURL=index.js.map