gemi 0.190.0 → 0.192.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 (221) hide show
  1. package/dist/ai/Agent.d.ts +28 -1
  2. package/dist/ai/Agent.d.ts.map +1 -1
  3. package/dist/ai/AgentController.d.ts +143 -3
  4. package/dist/ai/AgentController.d.ts.map +1 -1
  5. package/dist/ai/client/index.d.ts +1 -1
  6. package/dist/ai/client/index.d.ts.map +1 -1
  7. package/dist/ai/client/index.js +59 -1
  8. package/dist/ai/client/index.js.map +1 -1
  9. package/dist/ai/index.d.ts +3 -3
  10. package/dist/ai/index.d.ts.map +1 -1
  11. package/dist/ai/index.js +91 -68
  12. package/dist/ai/index.js.map +5 -5
  13. package/dist/ai/jobs/AgentJob.d.ts +32 -0
  14. package/dist/ai/jobs/AgentJob.d.ts.map +1 -1
  15. package/dist/ai/jobs/index.d.ts +1 -1
  16. package/dist/ai/jobs/index.d.ts.map +1 -1
  17. package/dist/ai/store/DatabaseAgentStore.d.ts +66 -3
  18. package/dist/ai/store/DatabaseAgentStore.d.ts.map +1 -1
  19. package/dist/ai/store/MemoryAgentStore.d.ts +12 -0
  20. package/dist/ai/store/MemoryAgentStore.d.ts.map +1 -1
  21. package/dist/ai/types.d.ts +18 -0
  22. package/dist/ai/types.d.ts.map +1 -1
  23. package/dist/ai/useChat.d.ts +15 -0
  24. package/dist/ai/useChat.d.ts.map +1 -1
  25. package/dist/app/index.js +1 -1
  26. package/dist/bun/plugin.js +1 -1
  27. package/dist/bun/preload.js +1 -1
  28. package/dist/{chunk-6z3wv71t.js → chunk-0m1a636t.js} +2 -2
  29. package/dist/{chunk-6z3wv71t.js.map → chunk-0m1a636t.js.map} +1 -1
  30. package/dist/{chunk-00g20rfa.js → chunk-0mb77yd2.js} +2 -2
  31. package/dist/{chunk-00g20rfa.js.map → chunk-0mb77yd2.js.map} +1 -1
  32. package/dist/{chunk-qz6grt61.js → chunk-0p76bhy2.js} +2 -2
  33. package/dist/{chunk-qz6grt61.js.map → chunk-0p76bhy2.js.map} +1 -1
  34. package/dist/{chunk-zwj4w4zt.js → chunk-17mdszc3.js} +2 -2
  35. package/dist/{chunk-zwj4w4zt.js.map → chunk-17mdszc3.js.map} +1 -1
  36. package/dist/{chunk-yt5n62nj.js → chunk-199nvtrj.js} +2 -2
  37. package/dist/{chunk-yt5n62nj.js.map → chunk-199nvtrj.js.map} +1 -1
  38. package/dist/{chunk-w2z4jc4v.js → chunk-1mpwzjxa.js} +3 -3
  39. package/dist/{chunk-w2z4jc4v.js.map → chunk-1mpwzjxa.js.map} +1 -1
  40. package/dist/{chunk-dsgjdk94.js → chunk-24jgzc8y.js} +2 -2
  41. package/dist/{chunk-dsgjdk94.js.map → chunk-24jgzc8y.js.map} +1 -1
  42. package/dist/{chunk-fgk1e5xe.js → chunk-4s7st9y4.js} +3 -3
  43. package/dist/{chunk-fgk1e5xe.js.map → chunk-4s7st9y4.js.map} +1 -1
  44. package/dist/{chunk-epb0qfce.js → chunk-5zx4e2wa.js} +3 -3
  45. package/dist/{chunk-epb0qfce.js.map → chunk-5zx4e2wa.js.map} +1 -1
  46. package/dist/{chunk-s5z8qcdv.js → chunk-67ex6nem.js} +3 -3
  47. package/dist/{chunk-s5z8qcdv.js.map → chunk-67ex6nem.js.map} +1 -1
  48. package/dist/{chunk-790dx3s7.js → chunk-67zz58cw.js} +2 -2
  49. package/dist/{chunk-790dx3s7.js.map → chunk-67zz58cw.js.map} +1 -1
  50. package/dist/{chunk-kcg2znz2.js → chunk-6frbegay.js} +2 -2
  51. package/dist/{chunk-kcg2znz2.js.map → chunk-6frbegay.js.map} +1 -1
  52. package/dist/{chunk-0gvw46j0.js → chunk-6n44t4hn.js} +2 -2
  53. package/dist/{chunk-0gvw46j0.js.map → chunk-6n44t4hn.js.map} +1 -1
  54. package/dist/{chunk-baknm4tn.js → chunk-6rmz0mkm.js} +2 -2
  55. package/dist/{chunk-baknm4tn.js.map → chunk-6rmz0mkm.js.map} +1 -1
  56. package/dist/{chunk-k9f7gww2.js → chunk-6wsmdf51.js} +2 -2
  57. package/dist/{chunk-k9f7gww2.js.map → chunk-6wsmdf51.js.map} +1 -1
  58. package/dist/{chunk-2v7a5wv6.js → chunk-7k43y71n.js} +2 -2
  59. package/dist/{chunk-2v7a5wv6.js.map → chunk-7k43y71n.js.map} +1 -1
  60. package/dist/{chunk-er7xemh2.js → chunk-7ynahcy6.js} +2 -2
  61. package/dist/{chunk-er7xemh2.js.map → chunk-7ynahcy6.js.map} +1 -1
  62. package/dist/{chunk-7des5zys.js → chunk-7zpjdwfq.js} +3 -3
  63. package/dist/{chunk-7des5zys.js.map → chunk-7zpjdwfq.js.map} +1 -1
  64. package/dist/{chunk-yn2av14e.js → chunk-8em2ebj1.js} +2 -2
  65. package/dist/{chunk-yn2av14e.js.map → chunk-8em2ebj1.js.map} +1 -1
  66. package/dist/{chunk-nc37phkt.js → chunk-8pfy75y6.js} +3 -3
  67. package/dist/{chunk-nc37phkt.js.map → chunk-8pfy75y6.js.map} +1 -1
  68. package/dist/{chunk-8f8bp75w.js → chunk-8zeky0fj.js} +5 -5
  69. package/dist/{chunk-8f8bp75w.js.map → chunk-8zeky0fj.js.map} +3 -3
  70. package/dist/{chunk-khzss89b.js → chunk-9dfrsj4m.js} +2 -2
  71. package/dist/{chunk-khzss89b.js.map → chunk-9dfrsj4m.js.map} +1 -1
  72. package/dist/{chunk-fcj0e64h.js → chunk-9hmm8acy.js} +1 -1
  73. package/dist/{chunk-rp2h86ph.js → chunk-9m04tdzh.js} +1 -1
  74. package/dist/{chunk-71jcjnwk.js → chunk-bd14zwmj.js} +25 -21
  75. package/dist/{chunk-71jcjnwk.js.map → chunk-bd14zwmj.js.map} +4 -4
  76. package/dist/{chunk-g52hvs5q.js → chunk-bhfwp3gz.js} +2 -2
  77. package/dist/{chunk-g52hvs5q.js.map → chunk-bhfwp3gz.js.map} +1 -1
  78. package/dist/{chunk-2adfcfdw.js → chunk-bm7z4vj9.js} +2 -2
  79. package/dist/{chunk-2adfcfdw.js.map → chunk-bm7z4vj9.js.map} +1 -1
  80. package/dist/{chunk-e9nmsgnd.js → chunk-c36sbvnz.js} +2 -2
  81. package/dist/{chunk-e9nmsgnd.js.map → chunk-c36sbvnz.js.map} +1 -1
  82. package/dist/{chunk-x1ng1dnx.js → chunk-ccx7rt7y.js} +2 -2
  83. package/dist/{chunk-x1ng1dnx.js.map → chunk-ccx7rt7y.js.map} +1 -1
  84. package/dist/{chunk-xqzrd7st.js → chunk-ce73s4kh.js} +2 -2
  85. package/dist/{chunk-xqzrd7st.js.map → chunk-ce73s4kh.js.map} +1 -1
  86. package/dist/{chunk-3z55zyfe.js → chunk-cx3n8qyr.js} +2 -2
  87. package/dist/{chunk-3z55zyfe.js.map → chunk-cx3n8qyr.js.map} +1 -1
  88. package/dist/{chunk-xwa8vtg5.js → chunk-d0khszc9.js} +2 -2
  89. package/dist/{chunk-xwa8vtg5.js.map → chunk-d0khszc9.js.map} +1 -1
  90. package/dist/{chunk-frvca65w.js → chunk-efgemgbe.js} +2 -2
  91. package/dist/{chunk-frvca65w.js.map → chunk-efgemgbe.js.map} +1 -1
  92. package/dist/{chunk-6tsyk2mr.js → chunk-ejc0mbe3.js} +2 -2
  93. package/dist/{chunk-6tsyk2mr.js.map → chunk-ejc0mbe3.js.map} +1 -1
  94. package/dist/{chunk-hv6nbbty.js → chunk-etzd00a8.js} +2 -2
  95. package/dist/{chunk-hv6nbbty.js.map → chunk-etzd00a8.js.map} +1 -1
  96. package/dist/{chunk-6a3t825g.js → chunk-f02anz24.js} +2 -2
  97. package/dist/{chunk-6a3t825g.js.map → chunk-f02anz24.js.map} +1 -1
  98. package/dist/{chunk-qy678j5z.js → chunk-fbxnxze2.js} +1 -1
  99. package/dist/{chunk-j16ekp16.js → chunk-freerpzc.js} +1 -1
  100. package/dist/{chunk-h8knqrc5.js → chunk-fryj3asn.js} +2 -2
  101. package/dist/{chunk-h8knqrc5.js.map → chunk-fryj3asn.js.map} +1 -1
  102. package/dist/{chunk-vzzt4kpk.js → chunk-h688s2ba.js} +2 -2
  103. package/dist/{chunk-vzzt4kpk.js.map → chunk-h688s2ba.js.map} +1 -1
  104. package/dist/{chunk-bc1k2206.js → chunk-hwq0kk1d.js} +1 -1
  105. package/dist/{chunk-mvs6brkk.js → chunk-j34ektzj.js} +2 -2
  106. package/dist/{chunk-mvs6brkk.js.map → chunk-j34ektzj.js.map} +1 -1
  107. package/dist/{chunk-ds684s0w.js → chunk-jbee3n3p.js} +2 -2
  108. package/dist/{chunk-ds684s0w.js.map → chunk-jbee3n3p.js.map} +1 -1
  109. package/dist/{chunk-80kpxp4m.js → chunk-k1c0xd8r.js} +2 -2
  110. package/dist/{chunk-80kpxp4m.js.map → chunk-k1c0xd8r.js.map} +1 -1
  111. package/dist/{chunk-tmz3gf96.js → chunk-k8gn0q91.js} +1 -1
  112. package/dist/{chunk-8p7a2ctj.js → chunk-m3180wkp.js} +2 -2
  113. package/dist/{chunk-8p7a2ctj.js.map → chunk-m3180wkp.js.map} +1 -1
  114. package/dist/{chunk-s1wj0ff8.js → chunk-m37vvh99.js} +2 -2
  115. package/dist/{chunk-s1wj0ff8.js.map → chunk-m37vvh99.js.map} +1 -1
  116. package/dist/{chunk-mmzf9c2e.js → chunk-m4r8btey.js} +2 -2
  117. package/dist/{chunk-mmzf9c2e.js.map → chunk-m4r8btey.js.map} +1 -1
  118. package/dist/{chunk-8mgz2na4.js → chunk-mdrsec0r.js} +2 -2
  119. package/dist/{chunk-8mgz2na4.js.map → chunk-mdrsec0r.js.map} +1 -1
  120. package/dist/{chunk-nbhxm3sz.js → chunk-mx9zcq7w.js} +2 -2
  121. package/dist/{chunk-nbhxm3sz.js.map → chunk-mx9zcq7w.js.map} +1 -1
  122. package/dist/{chunk-t6ng9yxp.js → chunk-p00rd4ja.js} +2 -2
  123. package/dist/{chunk-t6ng9yxp.js.map → chunk-p00rd4ja.js.map} +1 -1
  124. package/dist/{chunk-rf4a3tnm.js → chunk-qfb6r3cq.js} +3 -3
  125. package/dist/{chunk-rf4a3tnm.js.map → chunk-qfb6r3cq.js.map} +1 -1
  126. package/dist/{chunk-352y2y3z.js → chunk-qg60pgve.js} +2 -2
  127. package/dist/{chunk-352y2y3z.js.map → chunk-qg60pgve.js.map} +1 -1
  128. package/dist/{chunk-2qqm3482.js → chunk-qnc840pb.js} +2 -2
  129. package/dist/{chunk-2qqm3482.js.map → chunk-qnc840pb.js.map} +1 -1
  130. package/dist/{chunk-mqvyhqa6.js → chunk-r7vnxqck.js} +2 -2
  131. package/dist/{chunk-mqvyhqa6.js.map → chunk-r7vnxqck.js.map} +1 -1
  132. package/dist/{chunk-bwmyd47e.js → chunk-rf9c6e49.js} +2 -2
  133. package/dist/{chunk-bwmyd47e.js.map → chunk-rf9c6e49.js.map} +1 -1
  134. package/dist/{chunk-1987f978.js → chunk-ryfty6mj.js} +3 -3
  135. package/dist/{chunk-1987f978.js.map → chunk-ryfty6mj.js.map} +1 -1
  136. package/dist/{chunk-6bhscseq.js → chunk-sqev442x.js} +4 -4
  137. package/dist/{chunk-6bhscseq.js.map → chunk-sqev442x.js.map} +1 -1
  138. package/dist/{chunk-npd1501w.js → chunk-t86nc1jd.js} +2 -2
  139. package/dist/{chunk-npd1501w.js.map → chunk-t86nc1jd.js.map} +1 -1
  140. package/dist/{chunk-qp1nzdjc.js → chunk-thq8tc9x.js} +3 -3
  141. package/dist/{chunk-qp1nzdjc.js.map → chunk-thq8tc9x.js.map} +1 -1
  142. package/dist/{chunk-cbw4676x.js → chunk-tngf3h1g.js} +2 -2
  143. package/dist/{chunk-cbw4676x.js.map → chunk-tngf3h1g.js.map} +1 -1
  144. package/dist/{chunk-n415vvxw.js → chunk-tt5qk0xt.js} +2 -2
  145. package/dist/{chunk-n415vvxw.js.map → chunk-tt5qk0xt.js.map} +1 -1
  146. package/dist/{chunk-b35mk5rd.js → chunk-tvsjq0my.js} +2 -2
  147. package/dist/{chunk-b35mk5rd.js.map → chunk-tvsjq0my.js.map} +1 -1
  148. package/dist/{chunk-2k948anx.js → chunk-vr48swd0.js} +2 -2
  149. package/dist/{chunk-2k948anx.js.map → chunk-vr48swd0.js.map} +1 -1
  150. package/dist/{chunk-sz0avnch.js → chunk-wa1xmvgr.js} +2 -2
  151. package/dist/{chunk-sz0avnch.js.map → chunk-wa1xmvgr.js.map} +1 -1
  152. package/dist/chunk-waq4kj7n.js +5 -0
  153. package/dist/{chunk-qv3y19h5.js.map → chunk-waq4kj7n.js.map} +1 -1
  154. package/dist/{chunk-8b897pc1.js → chunk-xsx69765.js} +2 -2
  155. package/dist/{chunk-8b897pc1.js.map → chunk-xsx69765.js.map} +1 -1
  156. package/dist/{chunk-eqnrk0p8.js → chunk-xwz5fmwy.js} +2 -2
  157. package/dist/{chunk-eqnrk0p8.js.map → chunk-xwz5fmwy.js.map} +1 -1
  158. package/dist/{chunk-ct2kqpv5.js → chunk-xzz6ps4z.js} +2 -2
  159. package/dist/{chunk-ct2kqpv5.js.map → chunk-xzz6ps4z.js.map} +1 -1
  160. package/dist/{chunk-s91xa67z.js → chunk-y67rmd3y.js} +2 -2
  161. package/dist/{chunk-s91xa67z.js.map → chunk-y67rmd3y.js.map} +1 -1
  162. package/dist/{chunk-1e7pnsx2.js → chunk-z1aeh05w.js} +3 -3
  163. package/dist/{chunk-1e7pnsx2.js.map → chunk-z1aeh05w.js.map} +1 -1
  164. package/dist/{chunk-070cacy8.js → chunk-z7mbhc68.js} +2 -2
  165. package/dist/{chunk-070cacy8.js.map → chunk-z7mbhc68.js.map} +1 -1
  166. package/dist/{chunk-pjjwbs2f.js → chunk-z8dxdqzm.js} +2 -2
  167. package/dist/{chunk-pjjwbs2f.js.map → chunk-z8dxdqzm.js.map} +1 -1
  168. package/dist/{chunk-9q5g3a9t.js → chunk-z9pq557m.js} +2 -2
  169. package/dist/{chunk-9q5g3a9t.js.map → chunk-z9pq557m.js.map} +1 -1
  170. package/dist/{chunk-dhwxcedm.js → chunk-zcrhagx5.js} +2 -2
  171. package/dist/{chunk-dhwxcedm.js.map → chunk-zcrhagx5.js.map} +1 -1
  172. package/dist/client/Head.d.ts +26 -1
  173. package/dist/client/Head.d.ts.map +1 -1
  174. package/dist/client/index.d.ts +1 -1
  175. package/dist/client/index.d.ts.map +1 -1
  176. package/dist/client/index.js +17 -2
  177. package/dist/client/index.js.map +1 -1
  178. package/dist/config/index.js +1 -1
  179. package/dist/console/run.js +2 -2
  180. package/dist/console/run.js.map +1 -1
  181. package/dist/container/index.js +2 -2
  182. package/dist/container/index.js.map +1 -1
  183. package/dist/database/index.js +2 -2
  184. package/dist/database/index.js.map +1 -1
  185. package/dist/email/index.js +2 -2
  186. package/dist/email/index.js.map +1 -1
  187. package/dist/facades/index.js +1 -1
  188. package/dist/foundation/index.js +2 -2
  189. package/dist/foundation/index.js.map +1 -1
  190. package/dist/http/ApiRouter.d.ts +1 -0
  191. package/dist/http/ApiRouter.d.ts.map +1 -1
  192. package/dist/http/index.js +2 -2
  193. package/dist/http/index.js.map +1 -1
  194. package/dist/i18n/dictionaryRuntime.js +2 -2
  195. package/dist/i18n/dictionaryRuntime.js.map +1 -1
  196. package/dist/i18n/index.js +2 -2
  197. package/dist/i18n/index.js.map +1 -1
  198. package/dist/kernel/index.js +2 -2
  199. package/dist/kernel/index.js.map +1 -1
  200. package/dist/orm/index.js +2 -2
  201. package/dist/orm/index.js.map +1 -1
  202. package/dist/probe/index.js +2 -2
  203. package/dist/probe/index.js.map +1 -1
  204. package/dist/server/index.js +2 -2
  205. package/dist/server/index.js.map +1 -1
  206. package/dist/services/index.js +2 -2
  207. package/dist/services/index.js.map +1 -1
  208. package/dist/services/queue/work.js +2 -2
  209. package/dist/services/queue/work.js.map +1 -1
  210. package/dist/stats/route-table.js +1 -1
  211. package/dist/support/index.js +2 -2
  212. package/dist/support/index.js.map +1 -1
  213. package/dist/vitest/index.js +1 -1
  214. package/package.json +1 -1
  215. package/dist/chunk-qv3y19h5.js +0 -5
  216. /package/dist/{chunk-fcj0e64h.js.map → chunk-9hmm8acy.js.map} +0 -0
  217. /package/dist/{chunk-rp2h86ph.js.map → chunk-9m04tdzh.js.map} +0 -0
  218. /package/dist/{chunk-qy678j5z.js.map → chunk-fbxnxze2.js.map} +0 -0
  219. /package/dist/{chunk-j16ekp16.js.map → chunk-freerpzc.js.map} +0 -0
  220. /package/dist/{chunk-bc1k2206.js.map → chunk-hwq0kk1d.js.map} +0 -0
  221. /package/dist/{chunk-tmz3gf96.js.map → chunk-k8gn0q91.js.map} +0 -0
package/dist/ai/index.js CHANGED
@@ -1,14 +1,14 @@
1
1
  // @bun
2
- import{$b as Z8,$c as Z6,Ac as ZQ,Bc as WQ,Cc as M8,Ec as S8,Fc as j8,Gc as E8,Hc as T8,Ic as k8,Jc as x8,Kc as q8,Lc as I8,Mc as w8,Nc as b8,Oc as f8,Pc as v8,Rc as b,Sc as Z9,Tc as O9,Uc as _9,Vc as M9,Wc as a,Xc as x,Yb as Q8,Yc as K8,Zb as MQ,Zc as $6,_b as SQ,_c as Q6,ad as W6,bd as K6,cc as IJ,cd as X6,dc as E,dd as Y6,ec as k,ed as G6,fd as V6,gc as e8,gd as H6,hc as n8,hd as z6,ic as XJ,id as FJ,jc as J6,jd as D6,kc as m,kd as xQ,lc as W8,ld as F6,mc as AQ,md as qQ,nc as RQ,nd as P6,oc as EQ,od as B6,pc as d,pd as U6,qc as TQ,qd as kJ,rc as aJ,rd as B$,sc as kQ,sd as N6,tc as jQ,td as L6,uc as tJ,ud as IQ,vc as C8,vd as C6,wc as O8,wd as O6,xd as _6,yc as _8,yd as M6,zc as g,zd as F$}from"../chunk-71jcjnwk.js";import{Rd as P8}from"../chunk-495k9h6p.js";import"../chunk-baknm4tn.js";import{Oh as NQ,Rh as CQ,Si as OQ,Vi as d$,Zi as _Q,fi as T9,gi as t0,hi as r0,ii as e0,ji as w}from"../chunk-1987f978.js";import{_i as LQ,aj as oJ,bj as sJ}from"../chunk-8b897pc1.js";import{kj as c}from"../chunk-bwmyd47e.js";import"../chunk-2k948anx.js";import"../chunk-khzss89b.js";import"../chunk-xqzrd7st.js";import{Ck as RJ,nk as o,ok as s}from"../chunk-fgk1e5xe.js";import"../chunk-yn2av14e.js";import"../chunk-x1ng1dnx.js";import{pl as n9}from"../chunk-nc37phkt.js";import"../chunk-6tsyk2mr.js";import"../chunk-6a3t825g.js";import{Il as $$}from"../chunk-h8knqrc5.js";import"../chunk-80kpxp4m.js";import{existsSync as gQ,readdirSync as A6,readFileSync as z8}from"fs";import{isAbsolute as uQ,join as CJ,relative as cQ,sep as mQ}from"path";var D8="prompts.json",pQ=/\{\{>\s*([\w./-]+)\s*\}\}/g,G8=/\{\{(\w+)\}\}/g,lQ=/^[\w-]+(\/[\w-]+)*$/,V8={dir:"app/agents",shared:"prompts"},_J={},eJ=new Map,OJ;function dQ(){if(OJ===void 0){let J=CJ($$(),"dist","server",D8);OJ=gQ(J)?JSON.parse(z8(J,"utf8")):null}return OJ??null}function iQ(J){return J.replace(/\r?\n$/,"")}function H8(){return _J.cache??Bun.env.NODE_ENV==="production"}function nQ(J){if(!lQ.test(J))throw Error(`"${J}" is not a prompt name. Use letters, digits, "-" and "_", with "/" between folders.`);let $=_J.dir??V8.dir,Q=uQ($)?$:CJ(process.cwd(),$),Z=J.includes("/")?`${J}.md`:CJ(_J.shared??V8.shared,`${J}.md`);return CJ(Q,Z)}function oQ(J){let $=nQ(J),Q=H8()?eJ.get($):void 0;if(Q!==void 0)return Q;let Z=Bun.env.NODE_ENV==="production";if(Z){let K=dQ()?.[cQ($$(),$).split(mQ).join("/")];if(K!==void 0)return K}let W;try{W=iQ(z8($,"utf8"))}catch(K){if(K.code==="ENOENT"){let X=Z?` or in dist/server/${D8}`:"";throw Error(`The prompt "${J}" does not exist (looked for ${$}${X}).`)}throw K}if(H8())eJ.set($,W);return W}function J$(J,$){if($.includes(J))throw Error(`The prompt "${J}" includes itself: ${[...$,J].join(" > ")}.`);return oQ(J).replace(pQ,(Q,Z)=>J$(Z,[...$,J]))}class F8{static configure(J){_J={...J},eJ.clear(),OJ=void 0}static render(J,$={}){return J$(J,[]).replace(G8,(Q,Z)=>{if(!Object.hasOwn($,Z))throw Error(`The prompt "${J}" has no value for {{${Z}}}.`);return String($[Z])})}static placeholders(J){let $=[...J$(J,[]).matchAll(G8)].map((Q)=>Q[1]);return[...new Set($)]}}class Q$ extends P8{name="AgentJobDeadlineSweep";cron="* * * * *";async callback(){while(await g.sweep({limit:100})===100);}}var MJ=20;function U8(J,$){if($<=0||J.length===0)return null;let Q=(K,X)=>X.createdAt-K.createdAt||(K.id<X.id?1:-1);return["<jobs>","Background jobs that tools started in this conversation, running ones first. A running job's result replaces its tool result when it finishes. Do not start the same work again while a job for it is running.",...[...J.filter((K)=>K.state==="running").sort(Q),...J.filter((K)=>K.state!=="running").sort(Q)].slice(0,$).map((K)=>{let X=[`- ${K.id} (${K.toolName})`];if(K.state==="running")X.push(`running since ${Z$(K.createdAt)}`);else if(K.state==="ok")X.push(`finished at ${Z$(K.settledAt??K.updatedAt)}`);else{let G=K.error?`${K.error.code}: ${B8(K.error.message,200)}`:"failed";X.push(`failed at ${Z$(K.settledAt??K.updatedAt)} (${G})`)}if(K.summary!==void 0)X.push(`summary: ${B8(JSON.stringify(K.summary),300)}`);if(K.orphaned)X.push("its tool call was lost when the turn that started it was cut short");return X.join("; ")}),"</jobs>"].join(`
3
- `)}function Z$(J){return new Date(J).toISOString().replace(/\.\d{3}Z$/,"Z")}function B8(J,$){return J.length<=$?J:`${J.slice(0,$-1)}\u2026`}class K${table;sql;dialect;connection;constructor(J,$={}){let Q=$.table??"gemi_agent_jobs";if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(Q))throw Error(`The agent jobs table name "${Q}" is not a plain identifier. Use letters, digits and underscores.`);this.table=Q,this.sql=J.sql,this.dialect=J.dialect,this.connection=J.name}async createTable(){for(let J of sQ(this.dialect,this.table))await this.sql.unsafe(J)}async transaction(J){if(this.connection===void 0||this.joinable())return J();return RJ(this.sql,()=>J(),{connection:this.connection})}async create(J){let $=this.q(),Q=this.clock($);await $`
2
+ import{$b as G8,$c as C6,Ac as XQ,Bc as GQ,Cc as E8,Ec as j8,Fc as q8,Gc as x8,Hc as w8,Ic as I8,Jc as b8,Kc as f8,Lc as y8,Mc as v8,Nc as h8,Oc as g8,Pc as u8,Rc as b,Sc as G9,Tc as A9,Uc as R9,Vc as E9,Wc as t,Xc as x,Yb as X8,Yc as V8,Zb as qQ,Zc as B6,_b as bQ,_c as L6,ad as O6,bd as _6,cc as yJ,cd as M6,dc as E,dd as S6,ec as k,ed as A6,fd as R6,gc as Z9,gd as E6,hc as t8,hd as j6,ic as VJ,id as NJ,jc as N6,jd as k6,kc as m,kd as cQ,lc as Y8,ld as T6,mc as fQ,md as mQ,nc as yQ,nd as x6,oc as vQ,od as w6,pc as d,pd as I6,qc as hQ,qd as IJ,rc as aJ,rd as U$,sc as gQ,sd as q6,tc as uQ,td as b6,uc as tJ,ud as pQ,vc as S8,vd as f6,wc as A8,wd as y6,xd as v6,yc as R8,yd as h6,zc as g,zd as F$}from"../chunk-bd14zwmj.js";import{Rd as L8}from"../chunk-495k9h6p.js";import"../chunk-6rmz0mkm.js";import{Oh as RQ,Rh as jQ,Si as kQ,Vi as i$,Wi as TQ,Yi as xQ,Zi as wQ,_i as IQ,fi as w9,gi as F6,hi as P6,ii as U6,ji as q}from"../chunk-ryfty6mj.js";import{$i as EQ,bj as oJ,cj as sJ}from"../chunk-xsx69765.js";import{lj as c}from"../chunk-rf9c6e49.js";import"../chunk-vr48swd0.js";import"../chunk-9dfrsj4m.js";import"../chunk-ce73s4kh.js";import{Dk as TJ,ok as s,pk as a}from"../chunk-4s7st9y4.js";import"../chunk-8em2ebj1.js";import"../chunk-ccx7rt7y.js";import{ql as a9}from"../chunk-8pfy75y6.js";import"../chunk-ejc0mbe3.js";import"../chunk-f02anz24.js";import{Jl as $$}from"../chunk-fryj3asn.js";import"../chunk-k1c0xd8r.js";import{existsSync as tQ,readdirSync as u6,readFileSync as U8}from"fs";import{isAbsolute as rQ,join as SJ,relative as eQ,sep as JZ}from"path";var N8="prompts.json",$Z=/\{\{>\s*([\w./-]+)\s*\}\}/g,D8=/\{\{(\w+)\}\}/g,QZ=/^[\w-]+(\/[\w-]+)*$/,F8={dir:"app/agents",shared:"prompts"},RJ={},eJ=new Map,AJ;function ZZ(){if(AJ===void 0){let J=SJ($$(),"dist","server",N8);AJ=tQ(J)?JSON.parse(U8(J,"utf8")):null}return AJ??null}function WZ(J){return J.replace(/\r?\n$/,"")}function P8(){return RJ.cache??Bun.env.NODE_ENV==="production"}function KZ(J){if(!QZ.test(J))throw Error(`"${J}" is not a prompt name. Use letters, digits, "-" and "_", with "/" between folders.`);let $=RJ.dir??F8.dir,Q=rQ($)?$:SJ(process.cwd(),$),Z=J.includes("/")?`${J}.md`:SJ(RJ.shared??F8.shared,`${J}.md`);return SJ(Q,Z)}function XZ(J){let $=KZ(J),Q=P8()?eJ.get($):void 0;if(Q!==void 0)return Q;let Z=Bun.env.NODE_ENV==="production";if(Z){let K=ZZ()?.[eQ($$(),$).split(JZ).join("/")];if(K!==void 0)return K}let W;try{W=WZ(U8($,"utf8"))}catch(K){if(K.code==="ENOENT"){let X=Z?` or in dist/server/${N8}`:"";throw Error(`The prompt "${J}" does not exist (looked for ${$}${X}).`)}throw K}if(P8())eJ.set($,W);return W}function J$(J,$){if($.includes(J))throw Error(`The prompt "${J}" includes itself: ${[...$,J].join(" > ")}.`);return XZ(J).replace($Z,(Q,Z)=>J$(Z,[...$,J]))}class B8{static configure(J){RJ={...J},eJ.clear(),AJ=void 0}static render(J,$={}){return J$(J,[]).replace(D8,(Q,Z)=>{if(!Object.hasOwn($,Z))throw Error(`The prompt "${J}" has no value for {{${Z}}}.`);return String($[Z])})}static placeholders(J){let $=[...J$(J,[]).matchAll(D8)].map((Q)=>Q[1]);return[...new Set($)]}}class Q$ extends L8{name="AgentJobDeadlineSweep";cron="* * * * *";async callback(){while(await g.sweep({limit:100})===100);}}var EJ=20;function O8(J,$){if($<=0||J.length===0)return null;let Q=(K,X)=>X.createdAt-K.createdAt||(K.id<X.id?1:-1);return["<jobs>","Background jobs that tools started in this conversation, running ones first. A running job's result replaces its tool result when it finishes. Do not start the same work again while a job for it is running.",...[...J.filter((K)=>K.state==="running").sort(Q),...J.filter((K)=>K.state!=="running").sort(Q)].slice(0,$).map((K)=>{let X=[`- ${K.id} (${K.toolName})`];if(K.state==="running")X.push(`running since ${Z$(K.createdAt)}`);else if(K.state==="ok")X.push(`finished at ${Z$(K.settledAt??K.updatedAt)}`);else{let Y=K.error?`${K.error.code}: ${C8(K.error.message,200)}`:"failed";X.push(`failed at ${Z$(K.settledAt??K.updatedAt)} (${Y})`)}if(K.summary!==void 0)X.push(`summary: ${C8(JSON.stringify(K.summary),300)}`);if(K.orphaned)X.push("its tool call was lost when the turn that started it was cut short");return X.join("; ")}),"</jobs>"].join(`
3
+ `)}function Z$(J){return new Date(J).toISOString().replace(/\.\d{3}Z$/,"Z")}function C8(J,$){return J.length<=$?J:`${J.slice(0,$-1)}\u2026`}class K${table;sql;dialect;connection;constructor(J,$={}){let Q=$.table??"gemi_agent_jobs";if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(Q))throw Error(`The agent jobs table name "${Q}" is not a plain identifier. Use letters, digits and underscores.`);this.table=Q,this.sql=J.sql,this.dialect=J.dialect,this.connection=J.name}async createTable(){for(let J of GZ(this.dialect,this.table))await this.sql.unsafe(J)}async transaction(J){if(this.connection===void 0||this.joinable())return J();return TJ(this.sql,()=>J(),{connection:this.connection})}async create(J){let $=this.q(),Q=this.clock($);await $`
4
4
  INSERT INTO ${this.name($)}
5
5
  (id, thread_id, run_id, tool_call_id, tool_name, owner, job, summary, state,
6
6
  orphaned, attachment_scope, created_at, updated_at, deadline_at)
7
7
  VALUES
8
8
  (${J.id}, ${J.threadId}, ${J.runId}, ${J.toolCallId}, ${J.toolName},
9
- ${J.owner}, ${J.job}, ${SJ(J.summary)}, 'running', 0, ${J.attachmentScope},
9
+ ${J.owner}, ${J.job}, ${jJ(J.summary)}, 'running', 0, ${J.attachmentScope},
10
10
  ${Q}, ${Q}, ${Q} + ${this.ms($,J.deadlineMs)})
11
- `;let Z=await this.get(J.id);if(!Z)throw Error(`The background job ${J.id} was not found after it was written.`);return Z}async get(J){let $=this.q(),Q=await $`SELECT * FROM ${this.name($)} WHERE id = ${J}`;return Q[0]?W$(Q[0]):null}async listForThread(J,$={}){let Q=this.q(),Z=$.states===void 0?Q`1 = 1`:$.states.length===0?Q`1 = 0`:Q`state IN (${N8(Q,$.states)})`;return($.limit===void 0?await Q`
11
+ `;let Z=await this.get(J.id);if(!Z)throw Error(`The background job ${J.id} was not found after it was written.`);return Z}async get(J){let $=this.q(),Q=await $`SELECT * FROM ${this.name($)} WHERE id = ${J}`;return Q[0]?W$(Q[0]):null}async listForThread(J,$={}){let Q=this.q(),Z=$.states===void 0?Q`1 = 1`:$.states.length===0?Q`1 = 0`:Q`state IN (${_8(Q,$.states)})`;return($.limit===void 0?await Q`
12
12
  SELECT * FROM ${this.name(Q)}
13
13
  WHERE thread_id = ${J} AND ${Z}
14
14
  ORDER BY created_at DESC, id DESC
@@ -17,10 +17,10 @@ import{$b as Z8,$c as Z6,Ac as ZQ,Bc as WQ,Cc as M8,Ec as S8,Fc as j8,Gc as E8,H
17
17
  WHERE thread_id = ${J} AND ${Z}
18
18
  ORDER BY created_at DESC, id DESC
19
19
  LIMIT ${Math.max(0,Math.floor($.limit))}
20
- `).map(W$)}async transition(J,$,Q){if($.length===0)return!1;let Z=this.q(),W=this.clock(Z),K=[Z`updated_at = ${W}`];if(Q.state!==void 0)K.push(Z`state = ${Q.state}`);if("output"in Q)K.push(Z`output = ${SJ(Q.output)}`);if("error"in Q)K.push(Z`error = ${SJ(Q.error)}`);if("usage"in Q)K.push(Z`${this.column(Z,"usage")} = ${SJ(Q.usage)}`);if("orphaned"in Q)K.push(Z`orphaned = ${Q.orphaned?1:0}`);if(Q.state!==void 0&&Q.state!=="running")K.push(Q.settledAt!==void 0?Z`settled_at = COALESCE(settled_at, ${this.ms(Z,Q.settledAt)})`:Z`settled_at = COALESCE(settled_at, ${W})`);let X=K.reduce((V,Y)=>Z`${V}, ${Y}`),G=await Z`
20
+ `).map(W$)}async transition(J,$,Q){if($.length===0)return!1;let Z=this.q(),W=this.clock(Z),K=[Z`updated_at = ${W}`];if(Q.state!==void 0)K.push(Z`state = ${Q.state}`);if("output"in Q)K.push(Z`output = ${jJ(Q.output)}`);if("error"in Q)K.push(Z`error = ${jJ(Q.error)}`);if("usage"in Q)K.push(Z`${this.column(Z,"usage")} = ${jJ(Q.usage)}`);if("orphaned"in Q)K.push(Z`orphaned = ${Q.orphaned?1:0}`);if(Q.state!==void 0&&Q.state!=="running")K.push(Q.settledAt!==void 0?Z`settled_at = COALESCE(settled_at, ${this.ms(Z,Q.settledAt)})`:Z`settled_at = COALESCE(settled_at, ${W})`);let X=K.reduce((V,G)=>Z`${V}, ${G}`),Y=await Z`
21
21
  UPDATE ${this.name(Z)} SET ${X}
22
- WHERE id = ${J} AND state IN (${N8(Z,$)})
23
- `;return L8(G)>0}async overdue(J,$){let Q=this.q();return(await Q`
22
+ WHERE id = ${J} AND state IN (${_8(Z,$)})
23
+ `;return M8(Y)>0}async overdue(J,$){let Q=this.q();return(await Q`
24
24
  SELECT * FROM ${this.name(Q)}
25
25
  WHERE state = 'running' AND deadline_at <= ${this.ms(Q,J)}
26
26
  ORDER BY deadline_at, id
@@ -28,7 +28,7 @@ import{$b as Z8,$c as Z6,Ac as ZQ,Bc as WQ,Cc as M8,Ec as S8,Fc as j8,Gc as E8,H
28
28
  `).map(W$)}async now(){let J=this.q(),[$]=await J`SELECT ${this.clock(J)} AS now`;return Number($.now)}async prune(J){let $=this.q(),Q=await $`
29
29
  DELETE FROM ${this.name($)}
30
30
  WHERE state <> 'running' AND settled_at <= ${this.clock($)} - ${this.ms($,J)}
31
- `;return L8(Q)}joinable(){if(this.connection===void 0)return;let J=o();if(J===void 0||s()!==this.connection)return;return J}q(){return this.joinable()??this.sql}column(J,$){let Q=this.dialect==="mysql"||this.dialect==="mariadb";return J.unsafe(Q?`\`${$}\``:`"${$}"`)}name(J){let $=this.dialect==="mysql"||this.dialect==="mariadb";return J.unsafe($?`\`${this.table}\``:`"${this.table}"`)}clock(J){switch(this.dialect){case"postgres":return J`floor(extract(epoch from statement_timestamp()) * 1000)::bigint`;case"mysql":case"mariadb":return J`(TIMESTAMPDIFF(MICROSECOND, '1970-01-01 00:00:00', UTC_TIMESTAMP(6)) DIV 1000)`;case"sqlite":return J`CAST((julianday('now') - 2440587.5) * 86400000 AS INTEGER)`}}ms(J,$){let Q=Math.max(0,Math.round($));return this.dialect==="mysql"||this.dialect==="mariadb"?J`CAST(${Q} AS SIGNED)`:J`CAST(${Q} AS BIGINT)`}}function N8(J,$){return $.map((Q)=>J`${Q}`).reduce((Q,Z)=>J`${Q}, ${Z}`)}function SJ(J){return J===void 0?null:JSON.stringify(J)}function AJ(J){if(J===null||J===void 0)return;return JSON.parse(String(J))}function W$(J){let $=AJ(J.summary),Q=AJ(J.output),Z=AJ(J.error),W=AJ(J.usage);return{id:String(J.id),threadId:String(J.thread_id),runId:String(J.run_id),toolCallId:String(J.tool_call_id),toolName:String(J.tool_name),owner:J.owner===null||J.owner===void 0?null:String(J.owner),job:J.job===null||J.job===void 0?null:String(J.job),...$!==void 0?{summary:$}:{},state:String(J.state),...Q!==void 0?{output:Q}:{},...Z!==void 0?{error:Z}:{},...W!==void 0?{usage:W}:{},...Number(J.orphaned)===1?{orphaned:!0}:{},attachmentScope:J.attachment_scope===null||J.attachment_scope===void 0?null:String(J.attachment_scope),createdAt:Number(J.created_at),updatedAt:Number(J.updated_at),deadlineAt:Number(J.deadline_at),...J.settled_at===null||J.settled_at===void 0?{}:{settledAt:Number(J.settled_at)}}}function L8(J){let $=J;return Math.max(Number($.count??0),Number($.affectedRows??0))}function sQ(J,$){if(J==="mysql"||J==="mariadb")return[`CREATE TABLE IF NOT EXISTS \`${$}\` (
31
+ `;return M8(Q)}joinable(){if(this.connection===void 0)return;let J=s();if(J===void 0||a()!==this.connection)return;return J}q(){return this.joinable()??this.sql}column(J,$){let Q=this.dialect==="mysql"||this.dialect==="mariadb";return J.unsafe(Q?`\`${$}\``:`"${$}"`)}name(J){let $=this.dialect==="mysql"||this.dialect==="mariadb";return J.unsafe($?`\`${this.table}\``:`"${this.table}"`)}clock(J){switch(this.dialect){case"postgres":return J`floor(extract(epoch from statement_timestamp()) * 1000)::bigint`;case"mysql":case"mariadb":return J`(TIMESTAMPDIFF(MICROSECOND, '1970-01-01 00:00:00', UTC_TIMESTAMP(6)) DIV 1000)`;case"sqlite":return J`CAST((julianday('now') - 2440587.5) * 86400000 AS INTEGER)`}}ms(J,$){let Q=Math.max(0,Math.round($));return this.dialect==="mysql"||this.dialect==="mariadb"?J`CAST(${Q} AS SIGNED)`:J`CAST(${Q} AS BIGINT)`}}function _8(J,$){return $.map((Q)=>J`${Q}`).reduce((Q,Z)=>J`${Q}, ${Z}`)}function jJ(J){return J===void 0?null:JSON.stringify(J)}function kJ(J){if(J===null||J===void 0)return;return JSON.parse(String(J))}function W$(J){let $=kJ(J.summary),Q=kJ(J.output),Z=kJ(J.error),W=kJ(J.usage);return{id:String(J.id),threadId:String(J.thread_id),runId:String(J.run_id),toolCallId:String(J.tool_call_id),toolName:String(J.tool_name),owner:J.owner===null||J.owner===void 0?null:String(J.owner),job:J.job===null||J.job===void 0?null:String(J.job),...$!==void 0?{summary:$}:{},state:String(J.state),...Q!==void 0?{output:Q}:{},...Z!==void 0?{error:Z}:{},...W!==void 0?{usage:W}:{},...Number(J.orphaned)===1?{orphaned:!0}:{},attachmentScope:J.attachment_scope===null||J.attachment_scope===void 0?null:String(J.attachment_scope),createdAt:Number(J.created_at),updatedAt:Number(J.updated_at),deadlineAt:Number(J.deadline_at),...J.settled_at===null||J.settled_at===void 0?{}:{settledAt:Number(J.settled_at)}}}function M8(J){let $=J;return Math.max(Number($.count??0),Number($.affectedRows??0))}function GZ(J,$){if(J==="mysql"||J==="mariadb")return[`CREATE TABLE IF NOT EXISTS \`${$}\` (
32
32
  \`id\` VARCHAR(191) NOT NULL,
33
33
  \`thread_id\` VARCHAR(191) NOT NULL,
34
34
  \`run_id\` VARCHAR(191) NOT NULL,
@@ -72,26 +72,26 @@ import{$b as Z8,$c as Z6,Ac as ZQ,Bc as WQ,Cc as M8,Ec as S8,Fc as j8,Gc as E8,H
72
72
  "updated_at" BIGINT NOT NULL,
73
73
  "deadline_at" BIGINT NOT NULL,
74
74
  "settled_at" BIGINT${Z}
75
- )`,`CREATE INDEX IF NOT EXISTS "${$}_thread_id_created_at_idx" ON "${$}"("thread_id", "created_at")`,`CREATE INDEX IF NOT EXISTS "${$}_state_deadline_at_idx" ON "${$}"("state", "deadline_at")`]}var A8=4;class Y${table;sql;dialect;connection;constructor(J,$={}){let Q=$.table??"gemi_agent_memories";if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(Q))throw Error(`The agent memories table name "${Q}" is not a plain identifier. Use letters, digits and underscores.`);this.table=Q,this.sql=J.sql,this.dialect=J.dialect,this.connection=J.name}async createTable(){for(let J of aQ(this.dialect,this.table))await this.sql.unsafe(J)}async list(J,$={}){if(J.length===0)return[];if($.kinds!==void 0&&$.kinds.length===0)return[];let Q=this.q(),Z=[Q`scope IN (${ZJ(Q,J)})`];if($.kinds!==void 0)Z.push(Q`kind IN (${ZJ(Q,$.kinds)})`);if(!$.includeExpired)Z.push(Q`(expires_at IS NULL OR expires_at > ${this.clock(Q)})`);if($.after!==void 0){let[V]=await Q`
75
+ )`,`CREATE INDEX IF NOT EXISTS "${$}_thread_id_created_at_idx" ON "${$}"("thread_id", "created_at")`,`CREATE INDEX IF NOT EXISTS "${$}_state_deadline_at_idx" ON "${$}"("state", "deadline_at")`]}var k8=4;class G${table;sql;dialect;connection;constructor(J,$={}){let Q=$.table??"gemi_agent_memories";if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(Q))throw Error(`The agent memories table name "${Q}" is not a plain identifier. Use letters, digits and underscores.`);this.table=Q,this.sql=J.sql,this.dialect=J.dialect,this.connection=J.name}async createTable(){for(let J of YZ(this.dialect,this.table))await this.sql.unsafe(J)}async list(J,$={}){if(J.length===0)return[];if($.kinds!==void 0&&$.kinds.length===0)return[];let Q=this.q(),Z=[Q`scope IN (${XJ(Q,J)})`];if($.kinds!==void 0)Z.push(Q`kind IN (${XJ(Q,$.kinds)})`);if(!$.includeExpired)Z.push(Q`(expires_at IS NULL OR expires_at > ${this.clock(Q)})`);if($.after!==void 0){let[V]=await Q`
76
76
  SELECT created_at, id FROM ${this.name(Q)}
77
- WHERE id = ${$.after} AND scope IN (${ZJ(Q,J)})
78
- `;if(V){let Y=this.ms(Q,Number(V.created_at));Z.push(Q`(created_at > ${Y} OR (created_at = ${Y} AND id > ${String(V.id)}))`)}}let W=Z.reduce((V,Y)=>Q`${V} AND ${Y}`),K=$.limit===void 0||$.tags!==void 0?void 0:Math.max(0,Math.floor($.limit)),G=(K===void 0?await Q`
77
+ WHERE id = ${$.after} AND scope IN (${XJ(Q,J)})
78
+ `;if(V){let G=this.ms(Q,Number(V.created_at));Z.push(Q`(created_at > ${G} OR (created_at = ${G} AND id > ${String(V.id)}))`)}}let W=Z.reduce((V,G)=>Q`${V} AND ${G}`),K=$.limit===void 0||$.tags!==void 0?void 0:Math.max(0,Math.floor($.limit)),Y=(K===void 0?await Q`
79
79
  SELECT * FROM ${this.name(Q)} WHERE ${W}
80
80
  ORDER BY created_at, id
81
81
  `:await Q`
82
82
  SELECT * FROM ${this.name(Q)} WHERE ${W}
83
83
  ORDER BY created_at, id
84
84
  LIMIT ${K}
85
- `).map(X$);if($.tags!==void 0){if(G=G.filter((V)=>T8(V,$.tags)),$.limit!==void 0)G=G.slice(0,Math.max(0,Math.floor($.limit)))}return G}async get(J){let $=this.q(),Q=await $`SELECT * FROM ${this.name($)} WHERE id = ${J}`;return Q[0]?X$(Q[0]):null}async upsert(J){let $=J.key??null;if($===null)return await this.insert(J,null),{record:await this.mustGet(J.id),action:"added"};for(let Q=1;;Q++){let Z=await this.atKey(J.scope,$);if(Z){if(k8(Z,J))return{record:Z,action:"unchanged"};let W=await this.update(Z.id,{kind:J.kind,content:J.content,tags:J.tags??[],pinned:J.pinned??!1,expiresAt:J.expiresAt??null},Z.version);if(W)return{record:W,action:"updated"}}else try{return await this.insert(J,$),{record:await this.mustGet(J.id),action:"added"}}catch(W){if(Q>=A8||!await this.atKey(J.scope,$))throw W}if(Q>=A8)throw Error(`The memory at "${$}" in ${J.scope} kept changing while it was being written.`)}}async update(J,$,Q){let Z=this.q(),W=[Z`version = version + 1`,Z`updated_at = ${this.clock(Z)}`];if($.kind!==void 0)W.push(Z`kind = ${$.kind}`);if($.content!==void 0)W.push(Z`content = ${$.content}`);if($.key!==void 0)W.push(Z`${this.column(Z,"key")} = ${$.key}`);if($.tags!==void 0)W.push(Z`tags = ${JSON.stringify($.tags)}`);if($.pinned!==void 0)W.push(Z`pinned = ${$.pinned?1:0}`);if($.expiresAt!==void 0)W.push($.expiresAt===null?Z`expires_at = NULL`:Z`expires_at = ${this.ms(Z,$.expiresAt)}`);let K=W.reduce((G,V)=>Z`${G}, ${V}`),X=Q===void 0?await Z`UPDATE ${this.name(Z)} SET ${K} WHERE id = ${J}`:await Z`
85
+ `).map(X$);if($.tags!==void 0){if(Y=Y.filter((V)=>w8(V,$.tags)),$.limit!==void 0)Y=Y.slice(0,Math.max(0,Math.floor($.limit)))}return Y}async get(J){let $=this.q(),Q=await $`SELECT * FROM ${this.name($)} WHERE id = ${J}`;return Q[0]?X$(Q[0]):null}async upsert(J){let $=J.key??null;if($===null)return await this.insert(J,null),{record:await this.mustGet(J.id),action:"added"};for(let Q=1;;Q++){let Z=await this.atKey(J.scope,$);if(Z){if(I8(Z,J))return{record:Z,action:"unchanged"};let W=await this.update(Z.id,{kind:J.kind,content:J.content,tags:J.tags??[],pinned:J.pinned??!1,expiresAt:J.expiresAt??null},Z.version);if(W)return{record:W,action:"updated"}}else try{return await this.insert(J,$),{record:await this.mustGet(J.id),action:"added"}}catch(W){if(Q>=k8||!await this.atKey(J.scope,$))throw W}if(Q>=k8)throw Error(`The memory at "${$}" in ${J.scope} kept changing while it was being written.`)}}async update(J,$,Q){let Z=this.q(),W=[Z`version = version + 1`,Z`updated_at = ${this.clock(Z)}`];if($.kind!==void 0)W.push(Z`kind = ${$.kind}`);if($.content!==void 0)W.push(Z`content = ${$.content}`);if($.key!==void 0)W.push(Z`${this.column(Z,"key")} = ${$.key}`);if($.tags!==void 0)W.push(Z`tags = ${JSON.stringify($.tags)}`);if($.pinned!==void 0)W.push(Z`pinned = ${$.pinned?1:0}`);if($.expiresAt!==void 0)W.push($.expiresAt===null?Z`expires_at = NULL`:Z`expires_at = ${this.ms(Z,$.expiresAt)}`);let K=W.reduce((Y,V)=>Z`${Y}, ${V}`),X=Q===void 0?await Z`UPDATE ${this.name(Z)} SET ${K} WHERE id = ${J}`:await Z`
86
86
  UPDATE ${this.name(Z)} SET ${K}
87
87
  WHERE id = ${J} AND version = ${Math.floor(Q)}
88
- `;if(EJ(X)===0)return null;return this.get(J)}async delete(J){if(J.length===0)return 0;let $=this.q(),Q=await $`DELETE FROM ${this.name($)} WHERE id IN (${ZJ($,[...new Set(J)])})`;return EJ(Q)}async deleteScope(J){let $=this.q();return EJ(await $`DELETE FROM ${this.name($)} WHERE scope = ${J}`)}async search(J,$,Q={}){let Z=await this.list(J,{kinds:Q.kinds,tags:Q.tags});return E8(Z,$,Q.limit)}async count(J){let $=this.q(),[Q]=await $`
88
+ `;if(xJ(X)===0)return null;return this.get(J)}async delete(J){if(J.length===0)return 0;let $=this.q(),Q=await $`DELETE FROM ${this.name($)} WHERE id IN (${XJ($,[...new Set(J)])})`;return xJ(Q)}async deleteScope(J){let $=this.q();return xJ(await $`DELETE FROM ${this.name($)} WHERE scope = ${J}`)}async search(J,$,Q={}){let Z=await this.list(J,{kinds:Q.kinds,tags:Q.tags});return x8(Z,$,Q.limit)}async count(J){let $=this.q(),[Q]=await $`
89
89
  SELECT COUNT(*) AS total FROM ${this.name($)}
90
90
  WHERE scope = ${J} AND (expires_at IS NULL OR expires_at > ${this.clock($)})
91
91
  `;return Number(Q?.total??0)}async touch(J,$){if(J.length===0)return;let Q=this.q();await Q`
92
92
  UPDATE ${this.name(Q)} SET last_used_at = ${this.ms(Q,$)}
93
- WHERE id IN (${ZJ(Q,[...new Set(J)])})
94
- `}async prune(J){let $=this.q();return EJ(await $`DELETE FROM ${this.name($)} WHERE expires_at IS NOT NULL AND expires_at <= ${this.ms($,J)}`)}async now(){let J=this.q(),[$]=await J`SELECT ${this.clock(J)} AS now`;return Number($.now)}async insert(J,$){let Q=this.q(),Z=this.clock(Q),W=J.expiresAt===void 0||J.expiresAt===null?null:Math.max(0,Math.round(J.expiresAt));await Q`
93
+ WHERE id IN (${XJ(Q,[...new Set(J)])})
94
+ `}async prune(J){let $=this.q();return xJ(await $`DELETE FROM ${this.name($)} WHERE expires_at IS NOT NULL AND expires_at <= ${this.ms($,J)}`)}async now(){let J=this.q(),[$]=await J`SELECT ${this.clock(J)} AS now`;return Number($.now)}async insert(J,$){let Q=this.q(),Z=this.clock(Q),W=J.expiresAt===void 0||J.expiresAt===null?null:Math.max(0,Math.round(J.expiresAt));await Q`
95
95
  INSERT INTO ${this.name(Q)}
96
96
  (id, scope, kind, ${this.column(Q,"key")}, content, tags, pinned, source, version,
97
97
  created_at, updated_at, expires_at)
@@ -102,7 +102,7 @@ import{$b as Z8,$c as Z6,Ac as ZQ,Bc as WQ,Cc as M8,Ec as S8,Fc as j8,Gc as E8,H
102
102
  ${W===null?null:this.ms(Q,W)})
103
103
  `}async atKey(J,$){let Q=this.q(),Z=await Q`
104
104
  SELECT * FROM ${this.name(Q)} WHERE scope = ${J} AND ${this.column(Q,"key")} = ${$}
105
- `;return Z[0]?X$(Z[0]):null}async mustGet(J){let $=await this.get(J);if(!$)throw Error(`The memory ${J} was not found after it was written.`);return $}joinable(){if(this.connection===void 0)return;let J=o();if(J===void 0||s()!==this.connection)return;return J}q(){return this.joinable()??this.sql}column(J,$){let Q=this.dialect==="mysql"||this.dialect==="mariadb";return J.unsafe(Q?`\`${$}\``:`"${$}"`)}name(J){let $=this.dialect==="mysql"||this.dialect==="mariadb";return J.unsafe($?`\`${this.table}\``:`"${this.table}"`)}clock(J){switch(this.dialect){case"postgres":return J`floor(extract(epoch from statement_timestamp()) * 1000)::bigint`;case"mysql":case"mariadb":return J`(TIMESTAMPDIFF(MICROSECOND, '1970-01-01 00:00:00', UTC_TIMESTAMP(6)) DIV 1000)`;case"sqlite":return J`CAST((julianday('now') - 2440587.5) * 86400000 AS INTEGER)`}}ms(J,$){let Q=Math.max(0,Math.round($));return this.dialect==="mysql"||this.dialect==="mariadb"?J`CAST(${Q} AS SIGNED)`:J`CAST(${Q} AS BIGINT)`}}function ZJ(J,$){return $.map((Q)=>J`${Q}`).reduce((Q,Z)=>J`${Q}, ${Z}`)}function R8(J,$){if(J===null||J===void 0||J==="")return $;try{return JSON.parse(String(J))}catch{return $}}function X$(J){let $=R8(J.tags,[]);return{id:String(J.id),scope:String(J.scope),kind:String(J.kind),content:String(J.content),key:J.key===null||J.key===void 0?null:String(J.key),tags:Array.isArray($)?$.map(String):[],pinned:Number(J.pinned)===1,source:R8(J.source,{by:"app"}),version:Number(J.version),createdAt:Number(J.created_at),updatedAt:Number(J.updated_at),lastUsedAt:J.last_used_at===null||J.last_used_at===void 0?null:Number(J.last_used_at),expiresAt:J.expires_at===null||J.expires_at===void 0?null:Number(J.expires_at)}}function EJ(J){let $=J;return Math.max(Number($.count??0),Number($.affectedRows??0))}function aQ(J,$){if(J==="mysql"||J==="mariadb")return[`CREATE TABLE IF NOT EXISTS \`${$}\` (
105
+ `;return Z[0]?X$(Z[0]):null}async mustGet(J){let $=await this.get(J);if(!$)throw Error(`The memory ${J} was not found after it was written.`);return $}joinable(){if(this.connection===void 0)return;let J=s();if(J===void 0||a()!==this.connection)return;return J}q(){return this.joinable()??this.sql}column(J,$){let Q=this.dialect==="mysql"||this.dialect==="mariadb";return J.unsafe(Q?`\`${$}\``:`"${$}"`)}name(J){let $=this.dialect==="mysql"||this.dialect==="mariadb";return J.unsafe($?`\`${this.table}\``:`"${this.table}"`)}clock(J){switch(this.dialect){case"postgres":return J`floor(extract(epoch from statement_timestamp()) * 1000)::bigint`;case"mysql":case"mariadb":return J`(TIMESTAMPDIFF(MICROSECOND, '1970-01-01 00:00:00', UTC_TIMESTAMP(6)) DIV 1000)`;case"sqlite":return J`CAST((julianday('now') - 2440587.5) * 86400000 AS INTEGER)`}}ms(J,$){let Q=Math.max(0,Math.round($));return this.dialect==="mysql"||this.dialect==="mariadb"?J`CAST(${Q} AS SIGNED)`:J`CAST(${Q} AS BIGINT)`}}function XJ(J,$){return $.map((Q)=>J`${Q}`).reduce((Q,Z)=>J`${Q}, ${Z}`)}function T8(J,$){if(J===null||J===void 0||J==="")return $;try{return JSON.parse(String(J))}catch{return $}}function X$(J){let $=T8(J.tags,[]);return{id:String(J.id),scope:String(J.scope),kind:String(J.kind),content:String(J.content),key:J.key===null||J.key===void 0?null:String(J.key),tags:Array.isArray($)?$.map(String):[],pinned:Number(J.pinned)===1,source:T8(J.source,{by:"app"}),version:Number(J.version),createdAt:Number(J.created_at),updatedAt:Number(J.updated_at),lastUsedAt:J.last_used_at===null||J.last_used_at===void 0?null:Number(J.last_used_at),expiresAt:J.expires_at===null||J.expires_at===void 0?null:Number(J.expires_at)}}function xJ(J){let $=J;return Math.max(Number($.count??0),Number($.affectedRows??0))}function YZ(J,$){if(J==="mysql"||J==="mariadb")return[`CREATE TABLE IF NOT EXISTS \`${$}\` (
106
106
  \`id\` VARCHAR(191) NOT NULL,
107
107
  \`scope\` VARCHAR(191) NOT NULL,
108
108
  \`kind\` VARCHAR(191) NOT NULL,
@@ -139,60 +139,79 @@ import{$b as Z8,$c as Z6,Ac as ZQ,Bc as WQ,Cc as M8,Ec as S8,Fc as j8,Gc as E8,H
139
139
  "updated_at" BIGINT NOT NULL,
140
140
  "last_used_at" BIGINT,
141
141
  "expires_at" BIGINT${Z}
142
- )`,`CREATE INDEX IF NOT EXISTS "${$}_scope_kind_created_at_idx" ON "${$}"("scope", "kind", "created_at")`,`CREATE INDEX IF NOT EXISTS "${$}_expires_at_idx" ON "${$}"("expires_at")`,`CREATE UNIQUE INDEX IF NOT EXISTS "${$}_scope_key_key" ON "${$}"("scope", "key")`]}var h8={n:0,mean:0,stddev:0,low:null,high:null};function u(J){let $=[0.9999999999998099,676.5203681218851,-1259.1392167224028,771.3234287776531,-176.6150291621406,12.507343278686905,-0.13857109526572012,0.000009984369578019572,0.00000015056327351493116];if(J<0.5)return Math.log(Math.PI/Math.sin(Math.PI*J))-u(1-J);J-=1;let Q=$[0],Z=J+7.5;for(let W=1;W<9;W++)Q+=$[W]/(J+W);return 0.5*Math.log(2*Math.PI)+(J+0.5)*Math.log(Z)-Z+Math.log(Q)}function y8(J,$,Q){let W=1,K=1-(J+$)*Q/(J+1);if(Math.abs(K)<0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001)K=0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001;K=1/K;let X=K;for(let G=1;G<=300;G++){let V=2*G,Y=G*($-G)*Q/((J+V-1)*(J+V));if(K=1+Y*K,Math.abs(K)<0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001)K=0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001;if(W=1+Y/W,Math.abs(W)<0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001)W=0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001;if(K=1/K,X*=K*W,Y=-(J+G)*(J+$+G)*Q/((J+V)*(J+V+1)),K=1+Y*K,Math.abs(K)<0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001)K=0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001;if(W=1+Y/W,Math.abs(W)<0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001)W=0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001;K=1/K;let H=K*W;if(X*=H,Math.abs(H-1)<0.00000000000001)break}return X}function tQ(J,$,Q){if(J<=0)return 0;if(J>=1)return 1;let Z=Math.exp(u($+Q)-u($)-u(Q)+$*Math.log(J)+Q*Math.log(1-J));return J<($+1)/($+Q+2)?Z*y8($,Q,J)/$:1-Z*y8(Q,$,1-J)/Q}function G$(J,$){return tQ($/($+J*J),$/2,0.5)}function rQ(J){if(!(J>0))return Number.POSITIVE_INFINITY;let $=1.959964,Q=2;while(G$(Q,J)>0.05)Q*=2;for(let Z=0;Z<100;Z++){let W=($+Q)/2;if(G$(W,J)>0.05)$=W;else Q=W}return($+Q)/2}function eQ(J,$,Q,Z){let W=J+Q,K=$+Z,X=(H,D)=>u(H+1)-u(D+1)-u(H-D+1),G=(H)=>Math.exp(X($,H)+X(Z,W-H)-X(K,W)),V=G(J),Y=0;for(let H=Math.max(0,W-Z);H<=Math.min($,W);H++){let D=G(H);if(D<=V*1.0000001)Y+=D}return Math.min(1,Y)}function g8(J,$){if(J.length<2)return 0;let Q=J.reduce((W,K)=>W+(K-$)**2,0),Z=Math.sqrt(Q/(J.length-1));return Z<0.000000000001*Math.max(1,Math.abs($))?0:Z}function V$(J){let $=J.length;if($===0)return h8;let Q=J.map((G)=>G?1:0),Z=Q.reduce((G,V)=>G+V,0)/$,W=3.841458881296,K=(Z+W/(2*$))/(1+W/$),X=1.959964*Math.sqrt(Z*(1-Z)/$+W/(4*$*$))/(1+W/$);return{n:$,mean:Z,stddev:g8(Q,Z),low:Math.max(0,K-X),high:Math.min(1,K+X)}}function H$(J){let $=J.length;if($===0)return h8;let Q=J.reduce((K,X)=>K+X,0)/$,Z=g8(J,Q);if($<2||Z===0)return{n:$,mean:Q,stddev:Z,low:null,high:null};let W=rQ($-1)*Z/Math.sqrt($);return{n:$,mean:Q,stddev:Z,low:Q-W,high:Q+W}}function WJ(J,$,Q){return{before:J.mean,after:$.mean,delta:$.mean-J.mean,p:Q,pAdjusted:Q,significant:!1}}function u8(J,$){if(J.n===0||$.n===0)return WJ(J,$,null);let Q=(Z)=>Math.round(Z.mean*Z.n);return WJ(J,$,eQ(Q(J),J.n,Q($),$.n))}function c8(J,$){if(J.n<2||$.n<2)return WJ(J,$,null);let Q=J.stddev**2/J.n,Z=$.stddev**2/$.n,W=Math.sqrt(Q+Z);if(W===0)return WJ(J,$,null);let K=(Q+Z)**2/(Q**2/(J.n-1)+Z**2/($.n-1));return WJ(J,$,G$(($.mean-J.mean)/W,K))}function m8(J,$,Q){if(Q==="holm"){let Z=J.filter((K)=>K.p!==null).sort((K,X)=>K.p-X.p),W=0;Z.forEach((K,X)=>{W=Math.max(W,Math.min(1,K.p*(Z.length-X))),K.pAdjusted=W})}else for(let Z of J)Z.pAdjusted=Z.p;for(let Z of J)Z.significant=Z.pAdjusted!==null&&Z.pAdjusted<$&&Z.delta!==0}class TJ{name;cases;runs;concurrency;graders;pricing;task;constructor(J){this.name=J.name,this.cases=J.cases,this.runs=J.runs??1,this.concurrency=J.concurrency??1,this.task=J.task,this.graders=typeof J.graders==="function"?J.graders({judge:($)=>TJ.judge($)}):J.graders,this.pricing=J.pricing}static create(J){let $=`The eval "${J.name}"`;KJ(J.runs,$,"runs"),KJ(J.concurrency,$,"concurrency");let Q=new Set;for(let W of J.cases){if(Q.has(W.id))throw Error(`${$} has two cases with the id "${W.id}".`);Q.add(W.id)}let Z=new TJ(J);for(let[W,K]of Object.entries(Z.graders))if(typeof K!=="function"&&K.kind==="judge")KJ(K.samples,`${$}'s judge "${W}"`,"samples");return Z}static judge(J){return{...J,kind:"judge"}}static compare(J,$,Q={}){return o8(J,$,Q)}static format(J,$={}){return ZZ(J,$)}async run(J={}){let $=`${this.name}.run`;KJ(J.runs,$,"runs"),KJ(J.concurrency,$,"concurrency");let Q=J.only?new Set(J.only):null;if(Q){let U=[...Q].filter((P)=>!this.cases.some((L)=>L.id===P));if(U.length>0)throw Error(`The eval "${this.name}" has no case ${U.map((P)=>`"${P}"`).join(", ")}.`)}let Z=J.runs??this.runs,W=Date.now(),K=new AbortController,X=J.signal?AbortSignal.any([J.signal,K.signal]):K.signal,G=this.cases.filter((U)=>!Q||Q.has(U.id)),V={};for(let[U,P]of Object.entries(this.graders)){if(X.aborted)break;if(typeof P==="function"||P.kind!=="judge"||!P.calibration)continue;V[U]=await this.calibrate(P,X)}let Y=G.flatMap((U)=>Array.from({length:Z},(P,L)=>({test:U,run:L+1}))),H=Array.from({length:Y.length}),D=0,z,F=async()=>{while(D<Y.length&&!X.aborted){let U=D++,P=Y[U],L=await this.sample(P.test,P.run,X,J.keepOutputs??!1);H[U]=L;try{J.onSample?.(L)}catch(C){z??={error:C},K.abort(C)}}},N=Math.min(J.concurrency??this.concurrency,Y.length);if(await Promise.all(Array.from({length:N},F)),z)throw z.error;let B=H.filter((U)=>U!==void 0);return this.report(B,V,Z,new Date(W).toISOString(),Date.now()-W,{aborted:X.aborted||B.length<Y.length,planned:G.map((U)=>U.id)})}async sample(J,$,Q,Z){let W=Date.now(),K,X,G=await XJ(async()=>{try{K=await this.task(J.input,{case:J,run:$,signal:Q})}catch(N){X=a8(N)}}),V={},Y=!1,H=await XJ(async()=>{if(X!==void 0)return;let N={case:J,input:J.input,run:$};for(let[B,U]of Object.entries(this.graders)){if(J.skip?.includes(B))continue;let P=await p8(U,K,N,Q);if(!P)continue;if(V[B]=P,!P.pass&&typeof U!=="function"&&U.gate)Y=!0}}),D=Object.values(V).map((N)=>N.score),z=X===void 0&&D.length===0,F=this.pricing?z$(this.pricing,G.byModel).cost+z$(this.pricing,H.byModel).cost:void 0;return{case:J.id,run:$,pass:X===void 0&&!z&&Object.values(V).every((N)=>N.pass),excluded:Y||z,...z?{ungraded:!0}:{},score:X!==void 0||z?0:s8(D),grades:V,...X!==void 0?{error:X}:{},...Z&&X===void 0?{output:K}:{},usage:G.usage,byModel:$Z(G.byModel,H.byModel),judgeUsage:H.usage,...F!==void 0?{cost:F}:{},durationMs:Date.now()-W}}async calibrate(J,$){let Q=J.calibration,Z=[],W=0,K=await XJ(async()=>{for(let[V,Y]of Q.examples.entries()){if($.aborted)break;let H=Y.id??`example-${V+1}`,D={case:{id:H,input:Y.input},input:Y.input,run:0},z=await p8(J,Y.output,D,$),F=z?.pass??!1;if(F===Y.expected)W++;else Z.push({id:H,expected:Y.expected,got:F,...z?.note?{note:z.note}:{}})}}),X=Q.examples.length,G=X===0?1:W/X;return{n:X,agreement:G,ok:G>=(Q.minAgreement??0.8),disagreements:Z,usage:K.usage}}report(J,$,Q,Z,W,K){let X=new Set(Object.entries(this.graders).filter(([,z])=>typeof z!=="function"&&z.gate).map(([z])=>z)),G={};for(let z of this.cases){let F=J.filter((N)=>N.case===z.id);if(F.length===0)continue;G[z.id]={...l8(F),graders:d8(F,X)}}let V=E(),Y=E(),H={};for(let z of J){V=k(V,z.usage),Y=k(Y,z.judgeUsage);for(let[F,N]of Object.entries(z.byModel))H[F]=k(H[F]??E(),N)}let D=this.pricing?z$(this.pricing,H):void 0;return{name:this.name,startedAt:Z,durationMs:W,runs:Q,aborted:K.aborted,planned:K.planned,samples:J,cases:G,graders:d8(J,X),calibration:$,totals:{...l8(J),usage:V,judgeUsage:Y,byModel:H,...D?{cost:D.cost}:{},unpriced:D?D.unpriced:Object.keys(H)}}}}async function p8(J,$,Q,Z){let W=typeof J==="function"?0.5:J.threshold??0.5;try{if(typeof J==="function")return D$(await J($,Q),W);if(J.kind!=="judge")return D$(await J.check($,Q),W);return await JZ(J,$,Q,W,Z)}catch(K){return{pass:!1,score:0,error:a8(K)}}}async function JZ(J,$,Q,Z,W){let K=await J.prompt($,Q),X=typeof K==="string"?{prompt:K}:K,G=[];for(let D=0;D<(J.samples??1)&&!W.aborted;D++){let z=await F$({signal:W,provider:J.provider,...J.instructions!==void 0?{instructions:J.instructions}:{},...X,output:J.output,...J.reasoning!==void 0?{reasoning:J.reasoning}:{},...J.maxOutputTokens!==void 0?{maxOutputTokens:J.maxOutputTokens}:{},...J.temperature!==void 0?{temperature:J.temperature}:{},logErrors:!1});if(!z.ok){G.push({pass:!1,score:0,error:`The judge failed: ${z.error.message}`});continue}let F=D$(J.verdict(z.output,Q),Z);if(F)G.push(F)}if(G.length===0)return null;if(G.length===1)return G[0];let V=G.filter((D)=>D.pass).length,Y=G.map((D)=>D.note??D.error).filter(Boolean),H=G.map((D)=>D.error).filter(Boolean);return{pass:V*2>G.length,score:s8(G.map((D)=>D.score)),...Y.length>0?{note:Y.join(" | ")}:{},...H.length===G.length?{error:H.join(" | ")}:{}}}function D$(J,$){if(J===null||J===void 0)return null;if(typeof J==="boolean")return{pass:J,score:J?1:0};if(typeof J==="number"){if(!Number.isFinite(J))throw Error(`A grader answered the score ${J}.`);let Q=i8(J);return{pass:Q>=$,score:Q}}return{pass:J.pass,score:J.score===void 0?J.pass?1:0:i8(J.score),...J.note!==void 0?{note:J.note}:{}}}function l8(J){let $=J.filter((Q)=>!Q.excluded);return{samples:J.length,kept:$.length,passed:$.filter((Q)=>Q.pass).length,errors:J.filter((Q)=>Q.error!==void 0).length,passRate:V$($.map((Q)=>Q.pass)),score:H$($.map((Q)=>Q.score))}}function d8(J,$){let Q=J.filter((W)=>!W.excluded),Z=[...new Set(J.flatMap((W)=>Object.keys(W.grades)))];return Object.fromEntries(Z.map((W)=>{let X=($.has(W)?J:Q).flatMap((G)=>G.grades[W]?[G.grades[W]]:[]);return[W,{passRate:V$(X.map((G)=>G.pass)),score:H$(X.map((G)=>G.score))}]}))}function z$(J,$){let Q=0,Z=[];for(let[W,K]of Object.entries($)){let X=n8(J,W,K);if(X===void 0){Z.push(W);continue}Q+=X}return{cost:Q,unpriced:Z}}function $Z(...J){let $={};for(let Q of J)for(let[Z,W]of Object.entries(Q))$[Z]=k($[Z]??E(),W);return $}function o8(J,$,Q){for(let[U,P]of[["baseline",J],["current report",$]])if(P.aborted)throw Error(`Eval.compare: the ${U} for "${P.name}" was aborted (${P.samples.length} samples ran). Its statistics cover only the samples that ran; run it again in full.`);let Z=Q.alpha??0.05,W=Q.adjust??"holm",K=[],X=(U,P,L)=>{let C={label:U,passRate:u8(P.passRate,L.passRate),score:c8(P.score,L.score)};return K.push(C),{passRate:C.passRate,score:C.score}},G=(U,P,L)=>Object.fromEntries(Object.keys(L).filter((C)=>(C in P)).map((C)=>[C,X(`${U} ${C}`,P[C],L[C])])),V=(U,P)=>({fromCurrent:U.filter((L)=>!P.includes(L)),fromBaseline:P.filter((L)=>!U.includes(L))}),Y=X("total",J.totals,$.totals),H=G("case",J.cases,$.cases),D=G("grader",J.graders,$.graders),z=K.flatMap((U)=>[U.passRate,U.score]);m8(z,Z,W);let F={cases:V([...new Set([...J.planned??[],...Object.keys(J.cases)])],[...new Set([...$.planned??[],...Object.keys($.cases)])]),graders:V(Object.keys(J.graders),Object.keys($.graders))},N=[...F.cases.fromCurrent.map((U)=>`case ${U}: in the baseline, missing from this report`),...F.graders.fromCurrent.map((U)=>`grader ${U}: in the baseline, missing from this report`)],B=[];for(let U of K)for(let[P,L]of[["pass rate",U.passRate],["score",U.score]]){if(!L.significant)continue;let C=`${U.label}: ${P} ${L.before.toFixed(2)} \u2192 ${L.after.toFixed(2)} (p = ${QZ(L.pAdjusted)})`;(L.delta<0?N:B).push(C)}return{totals:Y,cases:H,graders:D,missing:F,comparisons:z.filter((U)=>U.p!==null).length,alpha:Z,adjust:W,regressions:N,improvements:B}}function QZ(J){return J<0.001?"<0.001":J.toFixed(3)}function ZZ(J,$){let Q=$.baseline&&!$.baseline.aborted&&!J.aborted?o8($.baseline,J,$):void 0,{totals:Z}=J,W=[];if(W.push(`eval ${J.name}: ${Z.samples} samples, ${Z.kept} kept, ${Z.passed} passed, ${Z.errors} errors (${(J.durationMs/1000).toFixed(1)}s)`),J.aborted)W.push(`ABORTED: only ${Z.samples} of the planned samples ran; not comparable.`);let K=(Y)=>{if(Y.n===0)return"-";let H=Y.mean.toFixed(2);if(Y.low===null||Y.high===null)return`${H} (${Y.n===1?"n=1":"no spread"})`;return`${H} [${Y.low.toFixed(2)}, ${Y.high.toFixed(2)}]`},X=(Y)=>Y?` ${Y.delta>=0?"+":""}${Y.delta.toFixed(2)}${Y.significant?"*":""}`:"",G=(Y,H)=>{let D=[0,1,2,3].map((F)=>Math.max(...[[Y,"n","pass rate","score"],...H].map((N)=>N[F].length))),z=(F)=>F.map((N,B)=>N.padEnd(D[B])).join(" ").trimEnd();W.push("",z([Y,"n","pass rate","score"]),...H.map(z))};G("case",Object.entries(J.cases).map(([Y,H])=>[Y,`${H.kept}/${H.samples}`,K(H.passRate)+X(Q?.cases[Y]?.passRate),K(H.score)+X(Q?.cases[Y]?.score)])),G("grader",Object.entries(J.graders).map(([Y,H])=>[Y,String(H.passRate.n),K(H.passRate)+X(Q?.graders[Y]?.passRate),K(H.score)+X(Q?.graders[Y]?.score)])),W.push("",`total pass rate ${K(Z.passRate)}${X(Q?.totals.passRate)} score ${K(Z.score)}${X(Q?.totals.score)}`);for(let[Y,H]of Object.entries(J.calibration))W.push(`judge ${Y}: agreement ${H.agreement.toFixed(2)} on ${H.n} examples${H.ok?"":" (BELOW minAgreement)"}`);let V=(Y)=>`${Y.inputTokens} in, ${Y.outputTokens} out`;if(W.push(`tokens: task ${V(Z.usage)}; judges ${V(Z.judgeUsage)}${Z.cost!==void 0?`; cost $${Z.cost.toFixed(4)}`:""}${Z.unpriced.length>0&&Z.cost!==void 0?` (unpriced: ${Z.unpriced.join(", ")})`:""}`),Q){W.push("",`* significant at ${Q.alpha} over ${Q.comparisons} tests (${Q.adjust==="holm"?"Holm-adjusted":"unadjusted"}; Fisher's exact for pass rates, Welch's t for scores)`);for(let Y of Q.regressions)W.push(`regression: ${Y}`);for(let Y of Q.improvements)W.push(`improvement: ${Y}`)}return W.join(`
143
- `)}function s8(J){return J.reduce(($,Q)=>$+Q,0)/J.length}function i8(J){return Math.min(1,Math.max(0,J))}function a8(J){return J instanceof Error?J.message:String(J)}function KJ(J,$,Q){if(J===void 0||Number.isInteger(J)&&J>=1)return;throw Error(`${$} sets \`${Q}\` to ${String(J)}, but it has to be a whole number of at least 1.`)}var WZ=/^[A-Za-z0-9_-]{1,64}$/;function KZ(J,$){let Q=XZ($)?$:{filter:$},Z=Q.deferred===!0,W=J.descriptors(Q.filter);if(!Q.namespaces)return W.map((H)=>P$(J,H,Z));let K=Object.entries(Q.namespaces),X=new Set(J.descriptors().flatMap((H)=>H.tags));for(let[H,D]of K){if(!WZ.test(H))throw Error(`toAgentTools: "${H}" is not a valid namespace name. A namespace is named by its tag and sent to the provider as a tool name is \u2014 letters, digits, "_" and "-", at most 64.`);if(typeof D?.description!=="string"||D.description.trim()==="")throw Error(`toAgentTools: the namespace "${H}" needs a description. It is what the model reads to decide whether to look inside.`);if(!X.has(H))throw Error(`toAgentTools: no tool is tagged "${H}", so its namespace would be empty.`)}let G=new Map(K.map(([H])=>[H,[]])),V=[];for(let H of W){let D=K.find(([z])=>H.tags.includes(z))?.[0];if(D===void 0)V.push(P$(J,H,Z));else G.get(D).push(P$(J,H,!1))}let Y=[];for(let[H,D]of K){let z=G.get(H);if(z.length===0)continue;Y.push(B$.create({name:H,description:D.description,tools:z,deferred:D.deferred??Z}))}return[...Y,...V]}function XZ(J){return typeof J==="object"&&J!==null&&(("filter"in J)||("namespaces"in J)||("deferred"in J))}function P$(J,$,Q){if($.kind==="tool")return YZ(J,$,Q);return kJ.create({name:$.name,description:$.description,inputSchema:$.inputSchema,...$.outputSchema?{outputSchema:$.outputSchema}:{},requiresApproval:$.requiresApproval,deferred:Q,execute:(Z,W)=>{let K=c.getStore()?.req;if(!K)throw new m(`"${$.name}" calls an api route as the user who started this run, and this run was not started inside a request. Run it from an AgentController, or give this agent tools that do not go through the MCP registry.`);return J.execute({kind:"local",req:K},$.name,Z,W)}})}function YZ(J,$,Q){let Z=J.nativeTool($.name);return kJ.create({name:$.name,description:$.description,inputSchema:$.inputSchema,...$.outputSchema?{outputSchema:$.outputSchema}:{},requiresApproval:J.nativeApproval($.name),deferred:Q,...Z.timeoutMs!==void 0?{timeoutMs:Z.timeoutMs}:{},...Z.async?{async:Z.async}:{},execute:(W,K)=>{let X=c.getStore()?.req;return J.startNative(X?{kind:"local",req:X}:void 0,$.name,W,K)}})}function GZ(J){if(J==="auto")return;let $=/^(\d+)x(\d+)$/.exec(J);if(!$)throw Error(`An image size is "WIDTHxHEIGHT" or "auto"; got ${JSON.stringify(J)}.`);let Q=Number($[1]),Z=Number($[2]);if(Q%16!==0||Z%16!==0)throw Error(`Image size ${J} is not supported: width and height must both be divisible by 16.`);if(Math.max(Q/Z,Z/Q)>3)throw Error(`Image size ${J} is not supported: the maximum aspect ratio is 3:1, either way up.`)}function t8(J,$){if(J.size!==void 0)try{GZ(J.size)}catch(Q){throw Error(`${$}: ${Q.message}`)}if(J.background==="transparent"&&J.format==="jpeg")throw Error(`${$}: a transparent background needs "png"; JPEG has no alpha channel.`);if(J.compression!==void 0){let Q=J.compression;if(!Number.isInteger(Q)||Q<0||Q>100)throw Error(`${$}: compression is an integer from 0 to 100; got ${Q}.`)}}function r8(J,$){if(J instanceof File)return J;let Q=J.type||"image/png",Z=Q==="image/jpeg"?"jpg":Q.split("/")[1]??"png";return new File([J],`${$}.${Z}`,{type:Q})}class U${name;provider;settings;constructor(J){let{name:$,provider:Q,...Z}=J;t8(Z,`ImageModel "${$}"`),this.name=$,this.provider=Q,this.settings=Z}static create(J){return new U$(J)}async generate(J){let $=this.merge(J);return this.present(await this.provider.generate({prompt:J.prompt,...$,signal:J.signal}))}async edit(J){let $=this.merge(J);return this.present(await this.provider.edit({prompt:J.prompt,...$,images:J.images.map((Q,Z)=>r8(Q,`image-${Z}`)),...J.mask?{mask:r8(J.mask,"mask")}:{},signal:J.signal}))}present(J){return e8(this.provider.model,J.usage),VZ(J)}merge(J){let $={...this.settings,...J.size!==void 0?{size:J.size}:{},...J.quality!==void 0?{quality:J.quality}:{},...J.background!==void 0?{background:J.background}:{},...J.format!==void 0?{format:J.format}:{},...J.compression!==void 0?{compression:J.compression}:{}};return t8($,`ImageModel "${this.name}"`),$}}function VZ(J){return{image:new Blob([J.bytes],{type:J.mimeType}),mimeType:J.mimeType,size:J.size,usage:J.usage}}function p(J){return typeof process>"u"?void 0:process.env?.[J]}var HZ="preview";function J9(J){let $=J.trim().replace(/\/+$/,"");if(!$)return"";return`${$.replace(/\/openai(?:\/v1)?$/i,"")}/openai`}function zZ(J){return/^\d{4}-\d{2}-\d{2}/.test(J)?"":"/v1"}function YJ(J,$={}){return{base:(J.baseURL??p("OPENAI_BASE_URL")??"https://api.openai.com/v1").replace(/\/+$/,""),query:"",headers:async()=>{let Z=J.apiKey??p("OPENAI_API_KEY");return{...Z?{authorization:`Bearer ${Z}`}:{},...J.headers}},timeoutMs:J.timeoutMs??$.timeoutMs??120000,streamIdleTimeoutMs:J.streamIdleTimeoutMs??120000,streamMaxDurationMs:J.streamMaxDurationMs??300000,maxToolArgumentChars:J.maxToolArgumentChars??0,maxRetries:J.maxRetries??2}}function $9(J){let $=J.baseURL??J.endpoint??p("AZURE_OPENAI_ENDPOINT");if($)return J9($);let Q=J.resourceName??p("AZURE_OPENAI_RESOURCE_NAME")??p("AZURE_RESOURCE_NAME");return Q?J9(`https://${Q.trim()}.cognitiveservices.azure.com`):""}function GJ(J,$={}){let Q=J.apiVersion??p("AZURE_OPENAI_API_VERSION")??HZ;return{base:`${$9(J)}${zZ(Q)}`,query:`?api-version=${encodeURIComponent(Q)}`,headers:async()=>{if(J.getToken)return{authorization:`Bearer ${await J.getToken()}`,...J.headers};let Z=J.apiKey??p("AZURE_OPENAI_API_KEY");return{...Z?{"api-key":Z}:{},...J.headers}},timeoutMs:J.timeoutMs??$.timeoutMs??120000,streamIdleTimeoutMs:J.streamIdleTimeoutMs??120000,streamMaxDurationMs:J.streamMaxDurationMs??300000,maxToolArgumentChars:J.maxToolArgumentChars??0,maxRetries:J.maxRetries??2}}function Q9(J,$={}){return{...GJ(J,$),base:`${$9(J)}/v1`,query:""}}var DZ=500,W9=20000;function FZ(J,$){if(!J)return;let Q=J.trim();if(/^\d+(\.\d+)?$/.test(Q))return Math.max(0,Number(Q)*1000);let Z=Date.parse(Q);if(Number.isNaN(Z))return;return Math.max(0,Z-$)}function jJ(J,$){let Q=Math.min(W9,DZ*2**J);return Math.round(Q*(0.5+$()*0.5))}function PZ(J){return J===429||J===408||J===409||J>=500}function BZ(J,$){return PZ(J)&&x($).retryable}function K9(J){return J.reason??new DOMException("The operation was aborted.","AbortError")}function X9(J,$){return new Promise((Q,Z)=>{let W=setTimeout(Q,J);$?.addEventListener("abort",()=>{clearTimeout(W),Z(K9($))},{once:!0})})}async function N$(J,$,Q=X9){if(!$)return await Q(J);$.throwIfAborted();let Z;try{await Promise.race([Q(J,$),new Promise((W,K)=>{Z=()=>K(K9($)),$.addEventListener("abort",Z,{once:!0})})])}finally{if(Z)$.removeEventListener("abort",Z)}}async function l(J,$,Q){let Z=Q.fetchImpl??((H,D)=>fetch(H,D)),W=Q.sleep??X9,K=Q.random??Math.random,X=Q.now??Date.now,G=Math.max(0,Q.maxRetries),V=(H)=>N$(H,Q.signal,W),Y;for(let H=0;H<=G;H++){Q.signal?.throwIfAborted();let D=new AbortController,z=()=>D.abort(Q.signal?.reason);Q.signal?.addEventListener("abort",z,{once:!0});let F=!1,N=Q.timeoutMs>0?setTimeout(()=>{F=!0,D.abort()},Q.timeoutMs):void 0,B;try{B=await Z(J,{...$,signal:D.signal})}catch(C){if(N!==void 0)clearTimeout(N);if(Q.signal?.removeEventListener("abort",z),Q.signal?.aborted)throw C;if(Y=F?new Z9(Q.timeoutMs):C,F&&Q.retryTimeouts===!1)throw Y;if(H===G)throw Y;await V(jJ(H,K));continue}if(N!==void 0)clearTimeout(N);if(B.ok)return B;Q.signal?.removeEventListener("abort",z);let U=await UZ(B),P=new b(B.status,U,B.headers.get("x-request-id")??void 0,FZ(B.headers.get("retry-after"),X()));if(H===G||!BZ(B.status,P))throw P;let L=P.retryAfter??(B.status===429?x(P).retryAfter:void 0);await V(L===void 0?jJ(H,K):Math.min(L,W9)),Y=P}throw Y??Error("Provider request failed with no response.")}async function UZ(J){let $;try{$=await J.text()}catch{return null}try{return JSON.parse($)}catch{return $}}function Y9(J,$,Q){let Z=$.idleMs>0?$.idleMs:0,W=$.maxMs>0?$.maxMs:0;if(!J||!Z&&!W)return J;let K=W?performance.now()+W:1/0,X=J.getReader();return new ReadableStream({async pull(G){let V,Y,H=Math.max(0,K-performance.now()),D=!Z||H<=Z,z=D?H:Z,F=new Promise((N,B)=>{V=setTimeout(()=>{Y=D?Q.max():Q.idle(),B(Y)},z)});try{let N=await Promise.race([X.read(),F]);if(N.done)G.close();else G.enqueue(N.value)}catch(N){let B=Y??N;G.error(B),X.cancel(B).catch(()=>{})}finally{clearTimeout(V)}},cancel(G){return X.cancel(G)}},{highWaterMark:0})}var L$=300000;function C$(J){return{generationsUrl:`${J.base}/images/generations${J.query}`,editsUrl:`${J.base}/images/edits${J.query}`,headers:J.headers,timeoutMs:J.timeoutMs,maxRetries:J.maxRetries}}class xJ extends Error{code;retryable;retryAfter;constructor(J,$={}){super(J.message,$);if(this.name="ImageRequestError",this.code=J.code,this.retryable=J.retryable,J.retryAfter!==void 0)this.retryAfter=J.retryAfter}}var NZ={png:"image/png",jpeg:"image/jpeg"};function LZ(J){let $=Number(J?.input_tokens??0),Q=Number(J?.output_tokens??0),Z={inputTokens:$,outputTokens:Q,totalTokens:Number(J?.total_tokens??$+Q)},W=J?.input_tokens_details?.image_tokens;if(typeof W==="number")Z.imageInputTokens=W;let K=J?.output_tokens_details?.image_tokens;if(typeof K==="number")Z.imageOutputTokens=K;return Z}function CZ(J){let $=atob(J),Q=new Uint8Array($.length);for(let Z=0;Z<$.length;Z++)Q[Z]=$.charCodeAt(Z);return Q}function OZ(J){let Q=J?.data?.[0]?.b64_json;if(typeof Q!=="string"||Q.length===0)throw new xJ({code:"provider_error",message:"The provider answered an image call with no base64 image data.",retryable:!1});let Z=typeof J.output_format==="string"?J.output_format:"png";return{bytes:CZ(Q),mimeType:NZ[Z]??`image/${Z}`,size:typeof J.size==="string"?J.size:"",...typeof J.background==="string"?{background:J.background}:{},usage:LZ(J.usage)}}async function G9(J,$,Q,Z){let W;try{W=await l(J,$,{maxRetries:Q.maxRetries,timeoutMs:Q.timeoutMs,retryTimeouts:!1,signal:Z.signal,fetchImpl:Q.fetchImpl})}catch(K){if(Z.signal?.aborted)throw K;throw new xJ(x(K),{cause:K})}return OZ(await W.json())}async function V9(J,$,Q={}){return await G9(J.generationsUrl,{method:"POST",headers:{...await J.headers(),"content-type":"application/json"},body:JSON.stringify($)},J,Q)}async function H9(J,$,Q={}){return await G9(J.editsUrl,{method:"POST",headers:await J.headers(),body:$},J,Q)}class qJ{static models(){return[]}modelName(){return this.model}async generate(J){return await V9(this.endpoint(),this.body(J),{signal:J.signal})}async edit(J){let $=new FormData;for(let[Q,Z]of Object.entries(this.body(J)))if(Z!==void 0)$.set(Q,String(Z));for(let Q of J.images)$.append("image[]",Q,Q.name);if(J.mask)$.set("mask",J.mask,J.mask.name);return await H9(this.endpoint(),$,{signal:J.signal})}body(J){return{model:this.modelName(),prompt:J.prompt,...J.size?{size:J.size}:{},...J.quality?{quality:J.quality}:{},...J.background?{background:J.background}:{},...J.format?{output_format:J.format}:{},...J.compression!==void 0?{output_compression:J.compression}:{}}}normalizeError(J){return x(J)}}var z9=["gpt-image-2","gpt-image-1.5","gpt-image-1"];class O$ extends qJ{model;config;constructor(J,$={}){super();this.model=J,this.config=$}static model(J,$){return new O$(J,$)}static models(){return z9}endpoint(){return C$(YJ(this.config,{timeoutMs:L$}))}}class _$ extends qJ{model;config;constructor(J,$={}){super();this.model=J,this.config=$}static model(J,$){return new _$(J,$)}static models(){return z9}modelName(){return this.config.deployment??this.model}endpoint(){return C$(GJ(this.config,{timeoutMs:L$}))}}var P9=3;function M$(J){let $=new Map;for(let Q of J)for(let Z of Q.content??[]){if(Z.type!=="file"||!Z.fileId||$.has(Z.fileId))continue;$.set(Z.fileId,{name:Z.name,mimeType:Z.mimeType})}return $}function B9(J,$,Q=new Map){if(!($ instanceof b))return[];if($.status!==400&&$.status!==404)return[];let Z=MZ($.body);if(!Z)return[];let W=_Z(J.input);if(W.length===0)return[];let K=/^input\[(\d+)\]\.content\[(\d+)\]\.file_id$/.exec(Z.param??"");if(K){let Y=J.input[Number(K[1])],H=A$(Y)[Number(K[2])],D=H&&typeof H.file_id==="string"?H.file_id:void 0;if(D)return[D]}let X=Z.message??"",G=F9(W.map((Y)=>Y.fileId).filter((Y)=>SZ(X,Y)));if(G.length>0)return G;let V=/Expected (image type|context stuffing file type) to be a supported format:.*but got \.([a-z0-9]+)\.?\s*$/is.exec(X);if(V){let Y=V[1].toLowerCase()==="image type"?"input_image":"input_file",H=V[2].toLowerCase(),D=F9(W.filter((F)=>F.type===Y).map((F)=>F.fileId)),z=D.filter((F)=>(Q.get(F)?.name??"").trim().toLowerCase().endsWith(`.${H}`));if(z.length===1)return z;if(z.length===0&&D.length===1)return D}return[]}function U9(J,$,Q=new Map){return{...J,input:J.input.map((Z)=>{let W=A$(Z);if(!W.some((K)=>D9(K,$)))return Z;return{...Z,content:W.map((K)=>D9(K,$)?{type:"input_text",text:S$(Q.get(String(K.file_id))?.name)}:K)}})}}function S$(J){return`[${J?`attachment ${JSON.stringify(J)}`:"an attachment"} could not be read by the provider and is not shown to you. Tell the user if it matters to the answer; uploading it again may help.]`}function D9(J,$){return typeof J.file_id==="string"&&$.has(J.file_id)}function A$(J){let $=J?.content;return Array.isArray($)?$:[]}function _Z(J){let $=[];for(let Q of J)for(let Z of A$(Q))if(typeof Z.file_id==="string"&&Z.file_id)$.push({type:String(Z.type),fileId:Z.file_id});return $}function MZ(J){if(!J||typeof J!=="object")return null;let $=J,Q=$.error&&typeof $.error==="object"?$.error:J;return{message:typeof Q.message==="string"?Q.message:void 0,param:typeof Q.param==="string"?Q.param:void 0}}function SZ(J,$){let Q=$.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return new RegExp(`(^|[^A-Za-z0-9_-])${Q}($|[^A-Za-z0-9_-])`).test(J)}function F9(J){return[...new Set(J)]}async function*AZ(J){let $="",Q="",Z=[],W,K=()=>{if(Z.length===0&&!Q)return null;let V={event:Q,data:Z.join(`
144
- `),id:W};return Q="",Z=[],W=void 0,V.data?V:null},X=(V)=>{let Y=V.endsWith("\r")?V.slice(0,-1):V;if(Y==="")return K();if(Y.startsWith(":"))return null;let H=Y.indexOf(":"),D=H===-1?Y:Y.slice(0,H),z=H===-1?"":Y.slice(H+1);if(z.startsWith(" "))z=z.slice(1);if(D==="event")Q=z;else if(D==="data")Z.push(z);else if(D==="id")W=z;return null};for await(let V of J){$+=V;let Y=$.indexOf(`
145
- `);while(Y!==-1){let H=$.slice(0,Y);$=$.slice(Y+1);let D=X(H);if(D)yield D;Y=$.indexOf(`
146
- `)}}if($.length>0){let V=X($);if(V)yield V}let G=K();if(G)yield G}async function*N9(J,$={}){let Q=new Map,Z=new Set,W,K=!1,X,G=(V,Y)=>({type:"finish",reason:V,usage:Y,...X?{model:X}:{}});for await(let V of AZ(J)){if(V.data==="[DONE]")break;let Y;try{Y=JSON.parse(V.data)}catch{continue}let H=typeof Y.type==="string"?Y.type:V.event,D=Y.response?.model;if(typeof D==="string"&&D)X=D;switch(H){case"response.output_text.delta":{let z=String(Y.delta??"");if(!z)break;yield $.structuredOutput?{type:"output-delta",delta:z}:{type:"text-delta",delta:z};break}case"response.reasoning_summary_text.delta":case"response.reasoning_text.delta":{let z=String(Y.delta??"");if(!z)break;yield{type:"reasoning-delta",delta:z,id:Y.item_id};break}case"response.output_item.added":{let z=Y.item;if(!z)break;if(z.type==="function_call"){let F=String(z.id??Y.item_id??z.call_id??"");Q.set(F,{callId:String(z.call_id??F),name:String(z.name??""),namespace:typeof z.namespace==="string"&&z.namespace?z.namespace:void 0,done:!1})}break}case"response.function_call_arguments.delta":{let z=Q.get(String(Y.item_id??""));if(!z)break;let F=String(Y.delta??"");if(!F)break;yield{type:"tool-call-delta",toolCallId:z.callId,name:z.name,argsDelta:F,...z.namespace?{namespace:z.namespace}:{}};break}case"response.function_call_arguments.done":{let z=String(Y.item_id??""),F=Q.get(z);if(!F)break;F.done=!0,yield{type:"tool-call",toolCallId:F.callId,name:F.name,args:String(Y.arguments??""),...F.namespace?{namespace:F.namespace}:{}};break}case"response.output_item.done":{let z=Y.item;if(!z)break;if(z.type==="function_call"){let F=String(z.id??Y.item_id??z.call_id??""),N=Q.get(F);if(N?.done)break;let B=(typeof z.namespace==="string"?z.namespace:"")||N?.namespace;if(yield{type:"tool-call",toolCallId:String(z.call_id??F),name:String(z.name??N?.name??""),args:String(z.arguments??""),...B?{namespace:B}:{}},N)N.done=!0;break}if(z.type==="tool_search_call"||z.type==="tool_search_output"){if(z.type==="tool_search_call"&&z.arguments!==void 0)W=z.arguments;let F=RZ(z);if(F.loaded.length===0&&F.namespaces.length===0)break;let N=String(z.tool_search_call_id??z.id??"");if(Z.has(N))break;Z.add(N);let B=W;W=void 0,yield{type:"tool-search",...F,...B!==void 0&&B!==null?{arguments:B}:{}}}break}case"response.refusal.done":{yield{type:"error",error:{code:"content_filtered",message:String(Y.refusal??"The model refused to answer."),retryable:!1}};break}case"response.completed":{K=!0,yield G("stop",R$(Y.response?.usage));break}case"response.incomplete":{K=!0;let z=R$(Y.response?.usage),F=Y.response?.incomplete_details?.reason;if(F==="content_filter"){yield{type:"error",error:{code:"content_filtered",message:EZ(Y.response?.content_filters),retryable:!1}},yield G("error",z);break}yield G(F==="max_output_tokens"?"length":"stop",z);break}case"response.failed":case"error":{K=!0;let z=Y.response?.error??Y.error??Y;yield{type:"error",error:TZ(z)},yield G("error",R$(Y.response?.usage));break}}if(K)return}if(!K)yield{type:"error",error:{code:"provider_error",message:"The provider stream ended without a terminal event.",retryable:!0}},yield G("error",f())}function RZ(J){let $=[],Q=[];return L9(J.results??J.tools??J.loaded??J.output,$,Q,0),{loaded:E$($),namespaces:E$(Q)}}function L9(J,$,Q,Z){if(!Array.isArray(J)||Z>4)return;for(let W of J){if(typeof W==="string"){$.push(W);continue}if(!W||typeof W!=="object")continue;let K=W,X=typeof K.name==="string"?K.name:typeof K.tool_name==="string"?K.tool_name:"",G=K.tools??K.functions;if(Array.isArray(G)){if(X)Q.push(X);L9(G,$,Q,Z+1);continue}if(X)$.push(X)}}function E$(J){return J.filter(($,Q)=>J.indexOf($)===Q)}function EZ(J){if(!Array.isArray(J))return"The provider's content filter blocked this request.";let Q=[];for(let Z of J){if(!Z||typeof Z!=="object")continue;let W=Z,K=W.content_filter_results;if(!K||typeof K!=="object")continue;for(let[X,G]of Object.entries(K))if(G&&typeof G==="object"&&G.filtered===!0)Q.push(`${X} (${String(W.source_type??"unknown")})`)}return Q.length===0?"The provider's content filter blocked this request.":`The provider's content filter blocked this request. Categories: ${E$(Q).join(", ")}.`}function TZ(J){let $=typeof J?.message==="string"?J.message:"The provider stream failed.",Q=String(J?.code??"").toLowerCase();if(Q==="rate_limit_exceeded")return{code:"rate_limited",message:$,retryable:!0};if(Q==="context_length_exceeded")return{code:"context_length_exceeded",message:$,retryable:!1};if(Q.includes("content_filter"))return{code:"content_filtered",message:$,retryable:!1};return{code:"provider_error",message:$,retryable:!0}}function f(){return{inputTokens:0,outputTokens:0,totalTokens:0}}function R$(J){if(!J)return f();let $=Number(J.input_tokens??0),Q=Number(J.output_tokens??0),Z={inputTokens:$,outputTokens:Q,totalTokens:Number(J.total_tokens??$+Q)},W=J.output_tokens_details?.reasoning_tokens;if(typeof W==="number")Z.reasoningTokens=W;let K=J.input_tokens_details?.cached_tokens;if(typeof K==="number")Z.cachedInputTokens=K;return Z}async function*C9(J){if(!J)return;let $=J.getReader(),Q=new TextDecoder;try{while(!0){let{done:W,value:K}=await $.read();if(W)break;if(K)yield Q.decode(K,{stream:!0})}let Z=Q.decode();if(Z)yield Z}finally{$.releaseLock()}}function T$(J){return{responsesUrl:`${J.base}/responses${J.query}`,filesUrl:`${J.base}/files${J.query}`,headers:J.headers,timeoutMs:J.timeoutMs,streamIdleTimeoutMs:J.streamIdleTimeoutMs,streamMaxDurationMs:J.streamMaxDurationMs,maxToolArgumentChars:J.maxToolArgumentChars,maxRetries:J.maxRetries}}async function*k$(J,$,Q){let Z=$,W=new Set,K=0,X=Math.max(0,J.maxRetries),G=J.random??Math.random,V,Y=(N)=>{if(!V)return N;let B=k(k(f(),V),N.usage);return V=void 0,{...N,usage:B}},H=()=>Y({type:"finish",reason:"aborted",usage:f()}),D=J.streamIdleTimeoutMs??0,z=J.streamMaxDurationMs??0,F=J.maxToolArgumentChars??0;for(let N=0;;N++){let B=new AbortController,U=Q.signal?AbortSignal.any([Q.signal,B.signal]):B.signal,P;while(P===void 0)try{P=await l(J.responsesUrl,{method:"POST",headers:{...await J.headers(),"content-type":"application/json"},body:JSON.stringify(Z)},{maxRetries:J.maxRetries,timeoutMs:J.timeoutMs,signal:U,fetchImpl:J.fetchImpl,sleep:J.sleep,random:J.random})}catch(M){let O=K<P9?B9(Z,M,Q.files).filter((_)=>!W.has(_)):[];if(O.length>0){K++;let _=x(M).message;for(let T of O)W.add(T),yield{type:"file-rejected",fileId:T,message:_,...a(M)};Z=U9(Z,new Set(O),Q.files);continue}let I=x(M);if(I.code==="aborted"){yield H();return}yield{type:"error",error:I,...a(M)},yield Y({type:"finish",reason:"error",usage:f()});return}let L=[],C=!1,q,A=new Map;try{let M=Y9(P.body,{idleMs:D,maxMs:z},{idle:()=>{let O=new O9(D);return B.abort(O),O},max:()=>{let O=new _9(z);return B.abort(O),O}});for await(let O of N9(C9(M),{structuredOutput:Q.structuredOutput})){if(O.type==="tool-call-delta"){let I=(A.get(O.toolCallId)??0)+O.argsDelta.length;if(A.set(O.toolCallId,I),F>0&&I>F){let _=new M9(F,O.name);throw B.abort(_),_}yield O;continue}if(O.type==="tool-call")A.delete(O.toolCallId);if(C){yield O.type==="finish"?Y(O):O;continue}if(IJ(O)){C=!0,yield*L.splice(0),yield O;continue}if(O.type==="error")q=O.error;L.push(O)}}catch(M){let O=x(M);if(O.code==="aborted"||Q.signal?.aborted){yield H();return}if(C){yield{type:"error",error:O},yield Y({type:"finish",reason:"error",usage:f()});return}q=O,L.push({type:"error",error:O},{type:"finish",reason:"error",usage:f()})}if(C)return;if(q?.retryable&&N<X&&!Q.signal?.aborted){for(let M of L)if(M.type==="finish")V=k(V??f(),M.usage);if(A.size>0)yield{type:"tool-call-discard",toolCallIds:[...A.keys()]};try{await N$(jJ(N,G),Q.signal,J.sleep)}catch{yield H();return}continue}for(let M of L)yield M.type==="finish"?Y(M):M;return}}async function j$(J,$,Q="user_data"){let Z=new FormData;Z.set("purpose",Q),Z.set("file",$);let K=await(await l(J.filesUrl,{method:"POST",headers:await J.headers(),body:Z},{maxRetries:J.maxRetries,timeoutMs:J.timeoutMs,fetchImpl:J.fetchImpl})).json();if(!K?.id)throw Error("The provider accepted the upload but returned no file id.");return K.id}function x$(J){let $=kZ(J);if($.startsWith("gpt-3.5")||$.startsWith("text-")||$.startsWith("davinci"))return{reasoning:!1,structuredOutput:!1,fileInput:!1,parallelToolCalls:!0,toolSearch:!1};let Q=jZ($);if(Q?.kind==="o")return{reasoning:!0,structuredOutput:!0,fileInput:!0,parallelToolCalls:Q.major>1,toolSearch:S9(Q)};if(Q?.kind==="gpt")return{reasoning:Q.major>=5,structuredOutput:Q.major>4||$.startsWith("gpt-4o")||$.startsWith("gpt-4.1"),fileInput:Q.major>4||$.startsWith("gpt-4o")||$.startsWith("gpt-4.1"),parallelToolCalls:!0,toolSearch:S9(Q)};return{reasoning:!0,structuredOutput:!0,fileInput:!0,parallelToolCalls:!0,toolSearch:!0}}function S9(J){if(J.kind==="o")return J.major>=5;return J.major>5||J.major===5&&J.minor>=2}function kZ(J){return J.trim().toLowerCase()}function jZ(J){let $=/^gpt-(\d+)(?:\.(\d+))?/.exec(J);if($?.[1])return{kind:"gpt",major:Number($[1]),minor:Number($[2]??0)};let Q=/^o(\d+)(?:[-.]|$)/.exec(J);if(Q?.[1])return{kind:"o",major:Number(Q[1]),minor:0};return null}var xZ={"response.audio_transcript.delta":"response.output_audio_transcript.delta","response.audio_transcript.done":"response.output_audio_transcript.done","response.text.delta":"response.output_text.delta","response.text.done":"response.output_text.done","response.audio.delta":"response.output_audio.delta","response.audio.done":"response.output_audio.done"};function qZ(J){if(typeof J!=="string")return;let $;try{$=JSON.parse(J)}catch{return}if(!$||typeof $!=="object"||typeof $.type!=="string")return;let Q=xZ[$.type];if(Q)$.type=Q;if($.type==="response.done"&&$.response?.usage)$.usage=wJ($.response.usage);if($.type==="conversation.item.input_audio_transcription.completed"&&$.usage)if($.usage.type==="duration"){let Z=Number($.usage.seconds);if(Number.isFinite(Z))$.transcriptionSeconds=Z}else $.transcriptionUsage=wJ($.usage);return $}var A9=1,IZ=500;function wZ(J,$){let Q=globalThis.WebSocket;if(!Q)throw Error("No global WebSocket: the realtime sideband needs Bun or Node 22+.");return new Q(J,{headers:$.headers})}class bJ{callId;ready;closed;init;socket;finalEvent;outbox=[];subscribers=new Set;listeners=new Set;backlog=[];closing=!1;finished=!1;everOpened=!1;failures=0;resolveReady;rejectReady;resolveClosed;constructor(J){this.init=J,this.callId=J.callId,this.ready=new Promise(($,Q)=>{this.resolveReady=$,this.rejectReady=Q}),this.ready.catch(()=>{}),this.closed=new Promise(($)=>this.resolveClosed=$),this.open()}send(J){if(this.finished||this.closing)return;let $=JSON.stringify(J);if(this.socket?.readyState===A9)this.socket.send($);else this.outbox.push($)}updateSession(J){this.send({type:"session.update",session:fJ(J)})}addItem(J){this.send({type:"conversation.item.create",item:J})}addNote(J){this.addItem({type:"message",role:"system",content:[{type:"input_text",text:J}]})}functionOutput(J,$){this.addItem({type:"function_call_output",call_id:J,output:typeof $==="string"?$:JSON.stringify($)})}createResponse(J={}){let $={};if(J.instructions!==void 0)$.instructions=J.instructions;if(J.toolChoice!==void 0)$.tool_choice=typeof J.toolChoice==="string"?J.toolChoice:{type:"function",name:J.toolChoice.name};if(J.outputModalities)$.output_modalities=J.outputModalities;if(J.conversation)$.conversation=J.conversation;if(J.metadata)$.metadata=J.metadata;Object.assign($,J.vendor),this.send(Object.keys($).length?{type:"response.create",response:$}:{type:"response.create"})}cancelResponse(J){this.send(J?{type:"response.cancel",response_id:J}:{type:"response.cancel"})}on(J){return this.listeners.add(J),()=>this.listeners.delete(J)}[Symbol.asyncIterator](){let J={queue:this.backlog??[],done:this.finished};return this.backlog=void 0,this.subscribers.add(J),{next:async()=>{for(;;){let Q=J.queue.shift();if(Q)return{value:Q,done:!1};if(J.done)return this.subscribers.delete(J),{value:void 0,done:!0};await new Promise((Z)=>J.wake=Z),J.wake=void 0}},return:async()=>{return J.done=!0,J.queue.length=0,this.subscribers.delete(J),{value:void 0,done:!0}}}}close(J=1000,$="closed"){if(this.finished||this.closing)return;if(this.closing=!0,this.socket&&this.socket.readyState<=A9)this.socket.close(J,$);else this.finish(J,$,!0)}async hangup(){try{await this.init.hangup()}catch(J){if(this.finalEvent&&!this.finalEvent.byClient&&this.finalEvent.code===1000)return;throw J}this.close(1000,"hangup")}async open(){let J;try{let Q=await this.init.headers();if(this.closing)return this.finish(1000,"closed",!0);J=(this.init.webSocket??wZ)(this.init.url,{headers:Q})}catch(Q){return this.dropped(1006,Q instanceof Error?Q.message:String(Q),!1)}this.socket=J;let $=!1;J.addEventListener("open",()=>{$=!0;let Q=this.everOpened;this.everOpened=!0;let Z=this.failures;this.failures=0;for(let W of this.outbox.splice(0))J.send(W);if(this.resolveReady(),Q)this.emit({type:"sideband.reconnected",attempt:Z})}),J.addEventListener("message",(Q)=>{let Z=qZ(Q.data);if(Z)this.emit(Z)}),J.addEventListener("close",(Q)=>{if(this.socket!==J)return;this.dropped(Q.code??1006,Q.reason??"",$)}),J.addEventListener("error",()=>{})}dropped(J,$,Q){if(this.socket=void 0,this.closing)return this.finish(J,$,!0);let Z=this.init.reconnect?.attempts??3;if(!((J!==1000||!Q)&&this.failures<Z))return this.finish(J,$,!1);this.failures+=1;let K=(this.init.reconnect?.delayMs??500)*2**(this.failures-1);setTimeout(()=>void this.open(),K)}finish(J,$,Q){if(this.finished)return;this.finished=!0,this.outbox.length=0;let Z={type:"sideband.closed",code:J,reason:$,byClient:Q};this.finalEvent=Z,this.emit(Z);for(let W of this.subscribers)W.done=!0,W.wake?.();if(!this.everOpened)this.rejectReady(Error(`Realtime sideband did not open (${J} ${$}).`));this.resolveClosed(Z)}emit(J){if(this.backlog){if(this.backlog.push(J),this.backlog.length>IZ)this.backlog.shift()}for(let $ of this.subscribers){if($.done)continue;$.queue.push(J),$.wake?.()}for(let $ of this.listeners)try{$(J)}catch{}}}var q$=30000,R9=10,E9=7200,bZ=600,k9="gpt-live-transcribe";function fZ(J){return J.type==="transcription"}function vZ(J){if(J.language!==void 0&&J.languages!==void 0)throw TypeError("A transcription session takes `languages` or `language`, not both (gpt-live-transcribe reads `languages`).");for(let W of J.keywords??[])if(/[<>\r\n]/.test(W))throw TypeError(`Transcription keywords must be one line without "<" or ">", got ${JSON.stringify(W)}.`);let $={model:J.model??k9};if(J.prompt!==void 0)$.prompt=J.prompt;if(J.keywords?.length)$.keywords=J.keywords;if(J.languages?.length)$.languages=J.languages;if(J.language!==void 0)$.language=J.language;if(J.delay!==void 0)$.delay=J.delay;let Q={transcription:$,turn_detection:J.turnDetection?j9(J.turnDetection):null};if(J.noiseReduction!==void 0)Q.noise_reduction=J.noiseReduction&&{type:J.noiseReduction};let Z={type:"transcription",audio:{input:Q}};if(J.logprobs)Z.include=["item.input_audio_transcription.logprobs"];return{...Z,...J.vendor}}function yZ(J){if(!J)return{type:"object",properties:{}};return T9(J)?J.toJSONSchema():J}function fJ(J,$){if(fZ(J))return vZ(J);let Q={type:"realtime"},Z=J.model??$;if(Z)Q.model=Z;if(J.instructions!==void 0)Q.instructions=J.instructions;if(J.outputModalities)Q.output_modalities=J.outputModalities;if(J.maxOutputTokens!==void 0)Q.max_output_tokens=J.maxOutputTokens;if(J.truncation!==void 0)Q.truncation=J.truncation;if(J.tools)Q.tools=J.tools.map((X)=>({type:"function",name:X.name,...X.description?{description:X.description}:{},parameters:yZ(X.parameters)}));if(J.toolChoice!==void 0)Q.tool_choice=typeof J.toolChoice==="string"?J.toolChoice:{type:"function",name:J.toolChoice.name};let W={};if(J.turnDetection!==void 0)W.turn_detection=J.turnDetection&&j9(J.turnDetection);if(J.transcription!==void 0)W.transcription=J.transcription;if(J.noiseReduction!==void 0)W.noise_reduction=J.noiseReduction&&{type:J.noiseReduction};let K={};if(J.voice!==void 0)K.voice=J.voice;if(J.speed!==void 0)K.speed=J.speed;if(Object.keys(W).length||Object.keys(K).length)Q.audio={...Object.keys(W).length?{input:W}:{},...Object.keys(K).length?{output:K}:{}};return{...Q,...J.vendor}}function j9(J){let $={type:J.type};if(J.createResponse!==void 0)$.create_response=J.createResponse;if(J.interruptResponse!==void 0)$.interrupt_response=J.interruptResponse;if(J.type==="semantic_vad"){if(J.eagerness!==void 0)$.eagerness=J.eagerness}else{if(J.threshold!==void 0)$.threshold=J.threshold;if(J.prefixPaddingMs!==void 0)$.prefix_padding_ms=J.prefixPaddingMs;if(J.silenceDurationMs!==void 0)$.silence_duration_ms=J.silenceDurationMs;if(J.idleTimeoutMs!==void 0)$.idle_timeout_ms=J.idleTimeoutMs}return $}function wJ(J){let $=Number(J?.input_tokens??0),Q=Number(J?.output_tokens??0),Z={inputTokens:$,outputTokens:Q,totalTokens:Number(J?.total_tokens??$+Q)},W=J?.input_token_details??J?.input_tokens_details,K=J?.output_token_details??J?.output_tokens_details;if(typeof W?.cached_tokens==="number")Z.cachedInputTokens=W.cached_tokens;if(typeof W?.audio_tokens==="number")Z.audioInputTokens=W.audio_tokens;let X=W?.cached_tokens_details?.audio_tokens;if(typeof X==="number")Z.cachedAudioInputTokens=X;if(typeof W?.image_tokens==="number"&&W.image_tokens>0)Z.imageInputTokens=W.image_tokens;if(typeof K?.audio_tokens==="number")Z.audioOutputTokens=K.audio_tokens;return Z}class v extends Error{code;retryable;status;constructor(J,$={}){super(J.message,{cause:$.cause});if(this.name="RealtimeRequestError",this.code=J.code,this.retryable=J.retryable,$.status!==void 0)this.status=$.status}}var hZ=60;class VJ{model;target;options;constructor(J,$){this.target=J,this.options=$,this.model=$.model}url(J){return`${this.target.base}/realtime${J}${this.target.query}`}sidebandUrl(J){let $=this.target.base.replace(/^http(s?):/i,(Z,W)=>`ws${W}:`),Q=this.target.query?`${this.target.query}&`:"?";return`${$}/realtime${Q}call_id=${encodeURIComponent(J)}`}async createCall(J){let $=J.flow??this.options.callFlow??"unified",Q,Z;if($==="ephemeral")Q={authorization:`Bearer ${(await this.clientSecret({session:J.session,ttlSeconds:hZ,signal:J.signal})).value}`,"content-type":"application/sdp"},Z=J.sdp;else{let V=new FormData;V.set("sdp",J.sdp),V.set("session",JSON.stringify(fJ(J.session??{},this.model))),Q=await this.target.headers(),Z=V}if(J.safetyIdentifier)Q["OpenAI-Safety-Identifier"]=J.safetyIdentifier;let W=this.url("/calls"),K=await this.request(J.webrtcFilter?`${W}${W.includes("?")?"&":"?"}webrtcfilter=on`:W,{method:"POST",headers:Q,body:Z},J.signal),X=await K.text(),G=gZ(K);if(!G)throw new v({code:"provider_error",message:"The provider started a realtime call but did not say which one (no Location).",retryable:!1});return{sdpAnswer:X,callId:G}}async clientSecret(J={}){let $=J.ttlSeconds??bZ;if(!Number.isInteger($)||$<R9||$>E9)throw RangeError(`ttlSeconds must be a whole number from ${R9} to ${E9}, got ${$}.`);let Q={...await this.target.headers(),"content-type":"application/json"};if(J.safetyIdentifier)Q["OpenAI-Safety-Identifier"]=J.safetyIdentifier;let W=await(await this.request(this.url("/client_secrets"),{method:"POST",headers:Q,body:JSON.stringify({expires_after:{anchor:"created_at",seconds:$},session:fJ(J.session??{},this.model)})},J.signal)).json();if(typeof W?.value!=="string")throw new v({code:"provider_error",message:"The provider answered a client secret request with no secret.",retryable:!1});return{value:W.value,expiresAt:Number(W.expires_at??0),session:W.session,callsUrl:this.url("/calls")}}async hangup(J,$={}){try{await this.request(this.url(`/calls/${encodeURIComponent(J)}/hangup`),{method:"POST",headers:await this.target.headers()},$.signal)}catch(Q){if(x9(Q,J))return;throw Q}}sideband(J,$={}){return new bJ({...$,callId:J,url:this.sidebandUrl(J),headers:this.target.headers,webSocket:$.webSocket??this.options.webSocket,hangup:()=>this.hangup(J)})}async request(J,$,Q){try{return await l(J,$,{maxRetries:this.target.maxRetries,timeoutMs:this.target.timeoutMs,retryTimeouts:!1,signal:Q,fetchImpl:this.options.fetchImpl})}catch(Z){if(Q?.aborted)throw Z;throw new v(x(Z),{cause:Z,...Z instanceof b?{status:Z.status}:{}})}}}function x9(J,$){if(!(J instanceof v)||J.status!==404)return!1;let Q=J.cause instanceof b?J.cause.body:void 0,Z=Q?.error??Q,W=String(Z?.code??"").toLowerCase(),K=String(Z?.message??"").toLowerCase();if(W.includes("call"))return!0;if(K.includes($.toLowerCase()))return!0;return/\bcall\b/.test(K)&&/not (be )?found|does not exist|no longer|ended/.test(K)}function gZ(J){let $=J.headers.get("location");if(!$)return;let Q=$.split("?")[0].replace(/\/+$/,""),Z=Q.slice(Q.lastIndexOf("/")+1);return Z?decodeURIComponent(Z):void 0}function w$(J,$){let{capabilities:Q}=$,Z={model:$.model,input:uZ(J.messages,Q,J.tools),stream:!0};if(J.systemPrompt)Z.instructions=J.systemPrompt;let W=aZ(J.tools,Q);if(W.length>0){if(Z.tools=W,!Q.parallelToolCalls)Z.parallel_tool_calls=!1}if(J.output)Z.text={format:{type:"json_schema",name:J.output.name,schema:J.output.schema,strict:J.output.strict}};if(J.reasoning&&Q.reasoning)Z.reasoning=J.reasoning==="none"?{effort:"none"}:{effort:J.reasoning,summary:"auto"};if(typeof J.temperature==="number")Z.temperature=J.temperature;if(typeof J.maxOutputTokens==="number")Z.max_output_tokens=J.maxOutputTokens;return Z}function uZ(J,$,Q){let Z=[],W=new Map;if($.toolSearch){for(let K of Q??[])if(vJ(K))W.set(K.name,K)}for(let K of J){let X=K.role,G=[],V=()=>{if(G.length===0)return;Z.push({type:"message",role:X,content:G}),G=[]};for(let Y of K.content??[])switch(Y.type){case"text":{if(!Y.text)break;G.push(t(X,Y.text));break}case"output":{if(Y.partial)break;G.push(t(X,JSON.stringify(Y.value)));break}case"file":{if(X==="assistant")break;let H=pZ(Y);if(!$.fileInput){if(H)G.push(t(X,I$(Y,!1)));break}if(Y.fileId?.startsWith(d))throw Error(`FilePart.fileId holds a gemi attachment id (${Y.fileId}). That field is the *provider's* file id, from \`fileId\` on the upload response; the \`attachmentId\` goes in \`FilePart.attachmentId\`, is shown to the model as text, and is resolved by a tool through \`ctx.attachments\`.`);if(!Y.fileId&&!H)throw Error("FilePart.fileId is empty and there is no `attachmentId` either. `fileId` is the *provider's* file id and `attachmentId` is gemi's (`gemi_att_\u2026`), both from the upload response; an upload always answers at least one, so a part with neither was built from something other than that answer.");if(Y.providerRejected){if(H)G.push(t(X,I$(Y,!1)));G.push(t(X,S$(Y.name)));break}if(H)G.push(t(X,I$(Y,!!Y.fileId)));if(Y.fileId)G.push(lZ(Y));break}case"reasoning":{V();let H=nZ(Y);if(H)Z.push(H);break}case"tool-call":{if(Y.partial)break;if(V(),$.toolSearch&&Array.isArray(Y.toolSearches))for(let D of Y.toolSearches)Z.push(...sZ(D,Q??[]));let H={type:"function_call",call_id:Y.toolCallId,name:String(Y.name),arguments:JSON.stringify(Y.input??{})};if(Y.namespace&&W.has(Y.namespace))H.namespace=Y.namespace;Z.push(H);break}case"tool-result":{V(),Z.push({type:"function_call_output",call_id:Y.toolCallId,output:oZ(Y)});break}}V()}return mZ(Z)}var cZ="No result was recorded for this tool call. Assume it did not complete.";function mZ(J){let $=new Set,Q=new Set,Z=[];for(let K of J){if(K.type==="function_call"){let X=String(K.call_id);if($.has(X))continue;$.add(X)}else if(K.type==="function_call_output"){let X=String(K.call_id);if(!$.has(X)||Q.has(X))continue;Q.add(X)}Z.push(K)}if(Q.size===$.size)return Z;let W=[];for(let K of Z){if(W.push(K),K.type!=="function_call")continue;let X=String(K.call_id);if(Q.has(X))continue;Q.add(X),W.push({type:"function_call_output",call_id:X,output:cZ})}return W}function t(J,$){return{type:J==="assistant"?"output_text":"input_text",text:$}}function pZ(J){let $=J.attachmentId;return typeof $==="string"&&$.startsWith(d)?$:void 0}function I$(J,$){let Q=[`id=${JSON.stringify(J.attachmentId)}`];if(J.name)Q.push(`name=${JSON.stringify(J.name)}`);if(J.mimeType)Q.push(`mimeType=${JSON.stringify(J.mimeType)}`);let Z=`attachment ${Q.join(" ")}`;return $?`[${Z}]`:`[${Z} \u2014 its contents are not shown to you; a tool can read the file by this id]`}function lZ(J){let $=J.mimeType?.trim().toLowerCase()??"";return{type:($?$.startsWith("image/")&&$!=="image/svg+xml":dZ(J.name))?"input_image":"input_file",file_id:J.fileId}}function dZ(J){let $=/\.([a-z0-9]+)$/.exec(J?.trim().toLowerCase()??"");return $?.[1]!==void 0&&iZ.has($[1])}var iZ=new Set(["jpeg","jpg","png","gif","webp"]);function nZ(J){if(!J.id)return null;let $={type:"reasoning",id:J.id};return $.summary=J.text?[{type:"summary_text",text:J.text}]:[],$}function oZ(J){if(J.status==="ok"){let $=J.modelOutput!==void 0?J.modelOutput:J.output;return typeof $==="string"?$:JSON.stringify($??null)}if(J.status==="running"){let $=J.job?.summary===void 0?"":` Started with: ${JSON.stringify(J.job.summary)}.`;return`Started background job ${J.job?.id??"(unknown)"}. It is still running, so there is no result yet: this message will be replaced by the result when it finishes. Do not start it again.${$}`}if(J.status==="denied"){let $=J.reason?` Reason given: ${J.reason}`:"";if(J.cause==="stopped")return`The run was stopped before this tool call could complete, so it did not run.${$}`;if(J.cause==="interrupted")return`The run was interrupted (the server stopped) while this tool call was in progress, so its result was lost. It may have run in part or in full: check its effects before repeating it.${$}`;return`The user declined this tool call, so it did not run.${$}`}return`The tool call failed and produced no result. Error (${J.error?.code??"unknown"}): ${J.error?.message??"no message"}`}function sZ(J,$){let Q=new Set(q9(J?.loaded)),Z=q9(J?.namespaces),W=new Set(Z),K=[];for(let G of $)if(vJ(G)){if(!W.has(G.name))continue;let V=G.tools.filter((Y)=>Q.size===0||Q.has(Y.name));if(V.length===0)continue;K.push({type:"namespace",name:G.name,description:G.description,tools:V.map((Y)=>r(Y,!0))})}else if(G.deferred&&Q.has(G.name))K.push(r(G,!0));if(K.length===0)return[];return[{type:"tool_search_call",call_id:null,execution:"server",status:"completed",arguments:J.arguments&&typeof J.arguments==="object"?J.arguments:{paths:Z.length>0?Z:[...Q]}},{type:"tool_search_output",call_id:null,execution:"server",status:"completed",tools:K}]}function q9(J){return Array.isArray(J)?J.filter(($)=>typeof $==="string"):[]}function vJ(J){return Array.isArray(J.tools)}function aZ(J,$){if(!J||J.length===0)return[];if(!$.toolSearch){let W=[];for(let K of J)if(vJ(K))for(let X of K.tools)W.push(r(X,!1));else W.push(r(K,!1));return W}let Q=[],Z=!1;for(let W of J)if(vJ(W)){let K=W.tools.map((X)=>{if(X.deferred)Z=!0;return r(X,!0)});Q.push({type:"namespace",name:W.name,description:W.description,tools:K})}else{if(W.deferred)Z=!0;Q.push(r(W,!0))}if(Z)Q.push({type:"tool_search"});return Q}function r(J,$){let Q={type:"function",name:J.name,description:J.description,parameters:J.parameters,strict:J.strict};if($&&J.deferred)Q.defer_loading=!0;return Q}class e{static models(){return[]}normalizeError(J){return x(J)}}var I9=["gpt-5.5","gpt-5.4","gpt-5.4-mini","gpt-5.4-nano","gpt-5.2","gpt-5.1","gpt-5","gpt-5-mini","gpt-5-nano","gpt-4.1","gpt-4.1-mini","gpt-4.1-nano","gpt-4o","gpt-4o-mini","o4-mini","o3","o3-mini"];class b$ extends e{model;capabilities;config;constructor(J,$={}){super();this.model=J,this.capabilities=x$(J),this.config=$}static model(J,$){return new b$(J,$)}static models(){return I9}stream(J){let $=w$(J,{model:this.model,capabilities:this.capabilities});return k$(this.endpoint(),$,{signal:J.signal,structuredOutput:Boolean(J.output),files:M$(J.messages)})}upload(J){return j$(this.endpoint(),J)}endpoint(){return T$(YJ(this.config))}get realtime(){return new VJ(YJ(this.config,{timeoutMs:q$}),{model:this.model})}}class f$ extends e{model;capabilities;config;constructor(J,$={}){super();this.model=J,this.capabilities=x$(J),this.config=$}static model(J,$){return new f$(J,$)}static models(){return I9}stream(J){let $=w$(J,{model:this.deployment(),capabilities:this.capabilities});return k$(this.endpoint(),$,{signal:J.signal,structuredOutput:Boolean(J.output),files:M$(J.messages)})}upload(J){return j$(this.endpoint(),J,"assistants")}deployment(){return this.config.deployment??this.model}endpoint(){return T$(GJ(this.config))}get realtime(){return new VJ(Q9(this.config,{timeoutMs:q$}),{model:this.deployment(),callFlow:"ephemeral"})}}class yJ{now;entries=new Map;constructor(J=Date.now){this.now=J}allow(J,$){let Q=this.entries.get(J);if(Q?.openUntil===void 0)return!0;let Z=this.now();if(Z<Q.openUntil)return!1;if(Q.probeUntil!==void 0&&Z<Q.probeUntil)return!1;return Q.probeUntil=Z+$.cooldownMs,!0}record(J,$,Q){let Z=this.entries.get(J)??{failures:0},W=Z.openUntil!==void 0;if($==="success")return this.entries.delete(J),W?"closed":void 0;if($==="none"){delete Z.probeUntil;return}if(Z.failures+=1,this.entries.set(J,Z),W||Z.failures>=Q.failures)return Z.openUntil=this.now()+Q.cooldownMs,delete Z.probeUntil,W?void 0:"open";return}state(J){let $=this.entries.get(J);if($?.openUntil===void 0)return"closed";return this.now()<$.openUntil?"open":"half-open"}}var w9=Symbol("timed-out");class HJ extends e{model;capabilities;entries;options;circuit;constructor(J,$={}){super();if(J.length===0)throw Error("FallbackProvider needs at least one provider.");for(let Z of J)if(Z.timeoutMs!==void 0&&!(Z.timeoutMs>0))throw Error(`FallbackProvider: timeoutMs for ${Z.provider.model} must be a positive number, got ${Z.timeoutMs}.`);this.entries=[...J];let Q=$.circuit;if(Q){let Z=Q.failures??3,W=Q.cooldownMs??30000;if(!Number.isInteger(Z)||Z<1)throw Error(`FallbackProvider: circuit.failures must be a positive integer, got ${Z}.`);if(!(W>0))throw Error(`FallbackProvider: circuit.cooldownMs must be a positive number, got ${W}.`);let K=new Set;for(let G of J){let V=v$(G);if(K.has(V))throw Error(`FallbackProvider: two legs share the circuit key "${V}". Give one of them a \`circuitKey\`.`);K.add(V)}let X=Q.store??new yJ;this.options={...$,circuit:{...Q,store:X}},this.circuit={policy:{failures:Z,cooldownMs:W},store:X,...Q.onStateChange?{onStateChange:Q.onStateChange}:{}}}else this.options=$,this.circuit=void 0;this.model=J[0].provider.model,this.capabilities=tZ(J.map((Z)=>Z.provider.capabilities))}static chain(J,$){return new HJ(J,$)}from(J){if(!Number.isInteger(J)||J<0||J>=this.entries.length)throw RangeError(`FallbackProvider.from(${J}): the chain has ${this.entries.length} entries.`);return new HJ(this.entries.slice(J),this.options)}leg(J){let $=this.from(J).entries[0];return new HJ([$],this.options)}upload(J){return this.entries[0].provider.upload(J)}normalizeError(J){return this.entries[0].provider.normalizeError(J)}stream(J){return this.run(J)}async*run(J){let $,Q=J.signal,Z=0;for(let W=0;W<this.entries.length;W++){let K=this.entries[W],X=W===this.entries.length-1,G=K.provider.model;if(this.circuit&&!X&&!await this.allow(K))continue;Z+=1;let V=!1,Y=async(_)=>{if(V)return;V=!0,await this.record(W,K,_)},H=new AbortController,D=()=>H.abort(Q?.reason);if(Q?.aborted)H.abort(Q.reason);else Q?.addEventListener("abort",D,{once:!0});let z=[],F=!1,N=!1,B,U,P,L=!1,C,q=!1,A=(_)=>{let T=$?k(k(E(),$),_.usage):_.usage;return $=void 0,{..._,usage:T}};try{C=K.provider.stream({...J,...K.reasoning!==void 0?{reasoning:K.reasoning}:{},signal:H.signal})[Symbol.asyncIterator]();let _=!0;for(;;){let T=_&&K.timeoutMs!==void 0?await rZ(C.next(),K.timeoutMs):await C.next();if(T===w9){L=!0,P={error:{code:"provider_error",message:`${G} sent nothing within ${K.timeoutMs}ms.`,retryable:!0}};break}if(_=!1,T.done){q=!0;break}let S=T.value;if(S.type==="finish"&&S.model)U=S.model;if(F){if(S.type==="finish")B=k(B??E(),S.usage),N=!0,yield A(S);else{if(S.type==="error")P={error:S.error};yield S}continue}if(IJ(S)){F=!0,await Y("success"),yield*z.splice(0),yield S;continue}if(S.type==="error")P={error:S.error,...S.status!==void 0?{status:S.status}:{},...S.requestId!==void 0?{requestId:S.requestId}:{}};else if(S.type==="finish"){if(B=k(B??E(),S.usage),S.reason==="error"&&!P)P={error:{code:"provider_error",message:`${G} ended the call with an error and did not say which.`,retryable:!1}}}z.push(S)}}catch(_){let T=K.provider.normalizeError(_);if(F){if(T.code!=="aborted")yield{type:"error",error:T,...a(_)};this.report({index:W,model:G,responseModel:U,attempt:Z,usage:B,outcome:y$(T),error:T}),yield A({type:"finish",reason:T.code==="aborted"?"aborted":"error",usage:E(),...U?{model:U}:{}});return}P={error:T,...a(_)}}finally{if(Q?.removeEventListener("abort",D),!q)H.abort(),C?.return?.()?.catch(()=>{})}if(F){if(!N&&$)yield{type:"finish",reason:P?"error":"stop",usage:$},$=void 0;this.report({index:W,model:G,responseModel:U,attempt:Z,usage:B,outcome:P?y$(P.error):"ok",...P?{error:P.error}:{}});return}if(Q?.aborted){await Y("none"),this.report({index:W,model:G,responseModel:U,attempt:Z,usage:B,outcome:"aborted"}),yield A({type:"finish",reason:"aborted",usage:B??E(),...U?{model:U}:{}});return}if(!P){await Y("success"),this.report({index:W,model:G,responseModel:U,attempt:Z,usage:B,outcome:"ok"});for(let _ of z)yield _.type==="finish"?A(_):_;return}let M=!X&&P.error.code!=="aborted"&&this.shouldFallBack(P.error,{index:W,model:G,timedOut:L,...P.status!==void 0?{status:P.status}:{},...P.requestId!==void 0?{requestId:P.requestId}:{}});if(await Y(M?"failure":"none"),this.report({index:W,model:G,responseModel:U,attempt:Z,usage:B,outcome:M?"fallback":y$(P.error),error:P.error}),M){if(B)$=k($??E(),B);continue}let O=!1,I;for(let _ of z){if(_.type==="finish"){I=_;continue}if(_.type==="error")O=!0;yield _}if(!O&&P.error.code!=="aborted")yield{type:"error",error:P.error,...P.status!==void 0?{status:P.status}:{},...P.requestId!==void 0?{requestId:P.requestId}:{}};yield A({type:"finish",reason:P.error.code==="aborted"?"aborted":I?.reason??"error",usage:B??E(),...U?{model:U}:{}});return}}async allow(J){if(!this.circuit)return!0;try{return await this.circuit.store.allow(v$(J),this.circuit.policy)}catch{return!0}}async record(J,$,Q){if(!this.circuit)return;let Z=v$($),W;try{W=await this.circuit.store.record(Z,Q,this.circuit.policy)}catch{return}if(!W)return;try{this.circuit.onStateChange?.({index:J,model:$.provider.model,key:Z,state:W})}catch{}}shouldFallBack(J,$){let Q=this.options.fallbackOn??((Z)=>Z.retryable);try{return Q(J,$)}catch{return!1}}report(J){if(J.usage===void 0)delete J.usage;if(J.responseModel===void 0)delete J.responseModel;try{this.options.onUsage?.(J)}catch{}}}function v$(J){return J.circuitKey??J.provider.model}function y$(J){return J.code==="aborted"?"aborted":"failed"}function tZ(J){return{reasoning:J.every(($)=>$.reasoning),structuredOutput:J.every(($)=>$.structuredOutput),fileInput:J.every(($)=>$.fileInput),parallelToolCalls:J.every(($)=>$.parallelToolCalls),toolSearch:J.every(($)=>$.toolSearch)}}function rZ(J,$){let Q,Z=new Promise((W)=>{Q=setTimeout(()=>W(w9),$)});return Promise.race([J,Z]).finally(()=>clearTimeout(Q))}async function eZ(J,$,Q={}){let Z=Q.samples??1;if(!Number.isInteger(Z)||Z<1)throw RangeError(`evalChain: samples must be a positive integer, got ${Z}.`);let W=[];for(let K=0;K<J.entries.length;K++){let X=J.leg(K),G={index:K,model:X.model,results:[],errors:[]};for(let V=0;V<Z;V++)try{G.results.push(await $(X,{index:K,sample:V}))}catch(Y){G.errors.push({sample:V,error:Y})}W.push(G)}return W}class gJ extends Error{line;constructor(J){super(J??"Voice session ended by the app.");this.name="VoiceHangup",this.line=J}}var DJ="ask_agent",J0={maxDurationMs:900000,idleTimeoutMs:120000,maxQueued:3,progressIntervalMs:4000,closingLineMs:1e4,tickMs:60000,hangupGraceMs:30000,toolTimeoutMs:60000,maxToolCallsPerMinute:20,toolOutputChars:8000},$0={maxDuration:"We've reached the time limit for this voice session. Tap the microphone to start again.",idle:"It's gone quiet, so I'll hang up. Tap the microphone when you want to talk again.",error:null};function zJ(J={}){return[{name:J.name??DJ,description:J.description??"Hand one self-contained request to the agent that does the work, in the user's own words with references resolved. It can take minutes; the result comes back when it is done, so tell the user you are on it.",parameters:{type:"object",properties:{request:{type:"string",description:"What the user wants done."}},required:["request"],additionalProperties:!1}},{name:"stop_work",description:"Stop the work that is running, and drop any requests waiting behind it.",parameters:{type:"object",properties:{},additionalProperties:!1}},{name:"work_status",description:"What the agent is doing right now, and what is waiting.",parameters:{type:"object",properties:{},additionalProperties:!1}},{name:"answer_question",description:"Answer the question the agent asked (it came back from a request with status needs_input). For an approval, set approve.",parameters:{type:"object",properties:{answer:{type:"string",description:"The user's answer, in their words."},approve:{type:"boolean",description:"For an approval: whether the user approved."}},required:["answer"],additionalProperties:!1}}]}var hJ=new Map;class i{sessionId;threadId;callId;ended;params;sideband;hangupCall;limits;lines;delegateName;startedAt=Date.now();body;usage=E();transcription={usage:E(),seconds:0};hooks=Promise.resolve();pendingCreate;transcript=[];requests=[];toolCalls=[];toolHandlers=new Map;toolsRunning=0;toolCallTimes=[];errors=[];running;queue=[];pending=[];lastProgress;lastNoteAt=0;noteTimer;responseActive=!1;responseWanted=!1;ending;timers=[];idleTimer;tickTimer;resolveEnded;closingWaiter;static start(J){return new i(J)}static get(J){return hJ.get(J)}static async endAll(J){await Promise.all([...hJ.values()].map(($)=>$.end("hangup",J)))}constructor(J){this.params=J,this.sessionId=J.sessionId??crypto.randomUUID(),this.threadId=J.threadId,this.body=J.body??{},this.limits={...J0,...b9(J.limits)},this.lines={...$0,...b9(J.lines)},this.delegateName=J.delegate?.name??DJ;let $=new Set(zJ(J.delegate).map((Q)=>Q.name));for(let Q of J.tools??[]){if($.has(Q.tool.name)||this.toolHandlers.has(Q.tool.name))throw Error(`VoiceBridge: two tools are named "${Q.tool.name}".`);this.toolHandlers.set(Q.tool.name,Q)}if("realtime"in J.call){let{realtime:Q,callId:Z}=J.call;this.callId=Z,this.sideband=Q.sideband(Z),this.hangupCall=()=>this.sideband.hangup()}else this.callId=J.call.callId??J.call.sideband.callId,this.sideband=J.call.sideband,this.hangupCall=()=>this.sideband.hangup();this.ended=new Promise((Q)=>this.resolveEnded=Q),hJ.set(this.sessionId,this),this.timers.push(setTimeout(()=>void this.end("max_duration",this.lines.maxDuration),this.limits.maxDurationMs)),this.tickTimer=setInterval(()=>void this.tick(),this.limits.tickMs),this.touch(),this.listen()}setBody(J){this.body=J;let $=this.params.contextNote?.(J);if($)this.sideband.addNote($)}end(J="hangup",$){return this.ending??=this.finish(J,$??null)}async listen(){for await(let J of this.sideband){try{this.params.onEvent?.(J)}catch{}this.closingWaiter?.(J),await this.handle(J)}}async handle(J){switch(J.type){case"input_audio_buffer.speech_started":this.touch();return;case"response.created":this.responseActive=!0,this.pendingCreate=void 0,this.touch();return;case"response.done":{if(this.responseActive=!1,this.responseWanted&&!this.ending)this.responseWanted=!1,this.createResponse();let $=J.usage;if($){this.usage=k(this.usage,$);let Q=this.info();this.hook(()=>this.params.onUsage?.($,Q))}return}case"conversation.item.input_audio_transcription.completed":{let $=J;if(this.say("user",String($.transcript??"")),$.transcriptionUsage||$.transcriptionSeconds!==void 0){this.transcription={usage:$.transcriptionUsage?k(this.transcription.usage,$.transcriptionUsage):this.transcription.usage,seconds:this.transcription.seconds+($.transcriptionSeconds??0)};let Q=this.info(),Z={...$.transcriptionUsage?{usage:$.transcriptionUsage}:{},...$.transcriptionSeconds!==void 0?{seconds:$.transcriptionSeconds}:{}};this.hook(()=>this.params.onTranscriptionUsage?.(Z,Q))}return}case"response.output_audio_transcript.done":this.say("assistant",String(J.transcript??""));return;case"response.output_text.done":this.say("assistant",String(J.text??""));return;case"response.function_call_arguments.done":{let $=J;if(this.touch(),!this.ending)this.call($.call_id,$.name,$.arguments);return}case"session.updated":if(this.tampered(J.session))this.end("session_tampered",null);return;case"error":{let $=J.error;if(this.errors.push({code:$?.code,message:String($?.message??"")}),this.pendingCreate&&$?.event_id===this.pendingCreate)if(this.pendingCreate=void 0,$.code==="conversation_already_has_active_response")this.responseActive=!0,this.responseWanted=!0;else this.responseActive=!1;return}case"sideband.closed":{let $=J;if(!this.ending&&!$.byClient)this.end($.code===1000?"call_ended":"sideband_lost",null);return}}}say(J,$){if($.trim())this.transcript.push({role:J,text:$,at:Date.now()})}call(J,$,Q){let Z=Q0(Q);if($===this.delegateName){let K=typeof Z.request==="string"?Z.request.trim():"";if(!K)return this.answer(J,{status:"error",message:"The request was empty."});return this.enqueue({record:{request:K,status:"queued"},turn:{text:K},callId:J})}let W=this.toolHandlers.get($);if(W)return void this.runTool(J,W,Z);switch($){case"stop_work":{let K=this.running;if(K)K.stopRequested=!0,K.handle?.stop({reason:"Stopped by voice."});let X=this.dropQueue();return this.answer(J,{stopped:Boolean(K),dropped:X})}case"work_status":return this.answer(J,{running:this.running?{request:this.running.record.request,step:this.lastProgress??"starting"}:null,queued:this.queue.map((K)=>K.record.request),...this.pending.length?{needsInput:this.questions()}:{}});case"answer_question":{if(!this.pending.length)return this.answer(J,{status:"error",message:"There is no open question."});let K=typeof Z.answer==="string"?Z.answer:"",X=typeof Z.approve==="boolean"?Z.approve:void 0,G=this.pending.map((V)=>Z0(V,K,X));return this.pending=[],this.enqueue({record:{request:`(answer) ${K}`,status:"queued"},turn:{toolResults:G},callId:J})}default:return this.answer(J,{status:"error",message:`There is no tool called ${$}.`})}}enqueue(J){if(!this.running){this.requests.push(J.record),this.run(J);return}if(this.queue.length>=this.limits.maxQueued)return this.answer(J.callId,{status:"busy",message:"Too many requests are waiting. Ask the user to wait for the current one."});this.requests.push(J.record),this.queue.push(J),this.answer(J.callId,{status:"queued",position:this.queue.length,message:"It will start when the current request is done."}),J.callId=void 0}async run(J){this.running=J,J.record.status="running",this.lastProgress=void 0,this.pauseIdle();try{let $=new Set;await this.waitForThread($);let Q=await this.latestBody();while(!J.stopRequested&&await this.waitForThread($));if(J.stopRequested||this.ending){J.record.status="dropped",this.complete(J,{status:"stopped"});return}let Z;try{Z=await this.params.controller.startTurn({threadId:this.threadId,user:this.params.user,body:Q,turn:J.turn})}catch(K){J.record.status="refused",this.complete(J,{status:"refused",message:K instanceof Error?K.message:"The request could not be started."});return}J.handle=Z,J.record.runId=Z.runId,this.follow(Z);let W=await Z.result();if(J.record.status="done",J.record.finishReason=W.finishReason,W.finishReason==="awaiting-input"&&W.pending.length)this.pending=W.pending,this.complete(J,{status:"needs_input",text:W.text,questions:this.questions()});else if(W.finishReason==="error")this.complete(J,{status:"failed",message:W.error?.message??"The work failed."});else if(W.finishReason==="aborted")this.complete(J,{status:"stopped",text:W.text});else this.complete(J,{status:"done",text:W.text})}catch($){J.record.status="done",this.complete(J,{status:"failed",message:$ instanceof Error?$.message:"The work failed."})}finally{this.running=void 0,this.flushNote();let $=this.queue.shift();if($&&!this.ending)this.run($);else this.touch()}}async runTool(J,$,Q){let Z=$.tool.name,W=Date.now();if(this.toolCallTimes=this.toolCallTimes.filter((D)=>W-D<60000),this.toolCallTimes.length>=this.limits.maxToolCallsPerMinute){let D={name:Z,status:"busy"};this.toolCalls.push(D),this.answer(J,{status:"busy",message:"Too many tool calls in the last minute. Tell the user to wait a moment."});return}this.toolCallTimes.push(W);let K={name:Z,status:"running"};this.toolCalls.push(K),this.toolsRunning+=1,this.pauseIdle();let X=new AbortController,G=$.timeoutMs??this.limits.toolTimeoutMs,V,Y;try{let D=await Promise.race([$.run(Q,{sessionId:this.sessionId,signal:X.signal}),new Promise((z,F)=>{V=setTimeout(()=>{F(new m(`"${Z}" took longer than ${Math.round(G/1000)} s.`)),X.abort()},G)})]);K.status="done",Y={status:"done",output:this.clip(D)}}catch(D){if(D instanceof gJ){K.status="refused",K.message=D.message,this.end("usage",D.line??null);return}let z=D instanceof m?D.message:"The tool failed.";if(!(D instanceof m))console.error(`[gemi/ai] the voice tool "${Z}" threw.`,D);K.status="failed",K.message=z,Y={status:"failed",message:z}}finally{clearTimeout(V),K.durationMs=Date.now()-W,this.toolsRunning-=1,this.touch()}let H=this.info();if(this.hook(()=>this.params.onToolCall?.({...K},H)),!this.ending)this.answer(J,Y)}clip(J){let $;try{$=JSON.stringify(J)}catch{return String(J)}if($===void 0||$.length<=this.limits.toolOutputChars)return J;return`${$.slice(0,this.limits.toolOutputChars)}\u2026 (cut: ${$.length} characters in all)`}async waitForThread(J=new Set){let $=this.params.liveRuns;if(!$)return!1;let Q=await $.find({threadId:this.threadId}),Z=Q&&!J.has(Q.runId)?$.get(Q.runId):null;if(!Q||!Z)return!1;return J.add(Q.runId),await Z.result().catch(()=>{return}),!0}async latestBody(){let J=this.params.store;if(!J)return this.body;let $=await J.get(this.sessionId).catch(()=>null);if($)this.body=$.body;return this.body}async follow(J){let $=this.params.progress??W0();try{for await(let Q of J.run){let Z=$(Q);if(Z)this.note(Z)}}catch{}}complete(J,$){if(this.ending)return;if(J.callId)this.sideband.functionOutput(J.callId,$),J.callId=void 0;else this.sideband.addNote(`Update on the earlier request "${J.record.request}": ${JSON.stringify($)}`);this.respond()}answer(J,$){this.sideband.functionOutput(J,$),this.respond()}respond(){if(this.ending)return;if(this.responseActive){this.responseWanted=!0;return}this.responseActive=!0,this.createResponse()}createResponse(){let J=`gemi_voice_${crypto.randomUUID()}`;this.pendingCreate=J,this.sideband.send({type:"response.create",event_id:J})}questions(){return this.pending.map((J)=>({kind:J.kind,tool:String(J.name),input:J.input}))}dropQueue(){let J=this.queue.splice(0);for(let $ of J)$.record.status="dropped";return J.length}note(J){if(J===this.lastProgress)return;this.lastProgress=J;let $=this.lastNoteAt+this.limits.progressIntervalMs-Date.now();if($<=0)return this.flushNote();this.noteTimer??=setTimeout(()=>this.flushNote(),$)}flushNote(){if(this.noteTimer)clearTimeout(this.noteTimer);if(this.noteTimer=void 0,!this.lastProgress||this.ending||!this.running)return;this.lastNoteAt=Date.now(),this.sideband.addNote(`Progress on "${this.running.record.request}": ${this.lastProgress}`)}touch(){if(this.idleTimer)clearTimeout(this.idleTimer);if(this.idleTimer=void 0,this.running||this.toolsRunning>0||this.ending)return;this.idleTimer=setTimeout(()=>void this.end("idle",this.lines.idle),this.limits.idleTimeoutMs)}pauseIdle(){if(this.idleTimer)clearTimeout(this.idleTimer);this.idleTimer=void 0}info(){return{sessionId:this.sessionId,total:this.usage,elapsedMs:Date.now()-this.startedAt,transcription:this.transcription}}tick(){if(this.ending)return;let J=this.info();this.hook(()=>this.params.onTick?.(J))}hook(J){this.hooks=this.hooks.then(async()=>{try{await J()}catch($){if($ instanceof gJ)this.end("usage",$.line??null);else console.error("[gemi/ai] a voice hook threw; ending the call.",$),this.end("error",this.lines.error)}})}tampered(J){let $=this.params.session;if(!$||!J)return!1;if($.instructions!==void 0&&J.instructions!==void 0&&J.instructions!==$.instructions)return!0;if(Array.isArray(J.tools)){let Q=new Set([...zJ(this.params.delegate),...$.tools??[]].map((W)=>W.name)),Z=new Set(J.tools.map((W)=>String(W?.name)));if(Q.size!==Z.size||[...Q].some((W)=>!Z.has(W)))return!0}return!1}async finish(J,$){for(let X of this.timers)clearTimeout(X);if(this.idleTimer)clearTimeout(this.idleTimer);if(this.noteTimer)clearTimeout(this.noteTimer);if(this.tickTimer)clearInterval(this.tickTimer);if(this.dropQueue(),$&&(J!=="call_ended"&&J!=="sideband_lost"))await this.closingLine($);if(J!=="call_ended")await this.hangUp();else this.sideband.close();await this.hooks;let Z=Date.now(),W=Z-this.startedAt,K={sessionId:this.sessionId,...this.callId?{callId:this.callId}:{},threadId:this.threadId,reason:J,startedAt:this.startedAt,endedAt:Z,durationMs:W,seconds:Math.ceil(W/1000),usage:this.usage,transcription:this.transcription,transcript:this.transcript,requests:this.requests,toolCalls:this.toolCalls,errors:this.errors};hJ.delete(this.sessionId),await this.params.store?.update(this.sessionId,{endedAt:Z,endReason:J}).catch(()=>{return});try{await this.params.onEnd?.(K)}catch(X){console.error("[gemi/ai] a voice session's onEnd threw.",X)}return this.resolveEnded(K),K}async hangUp(){try{await this.hangupCall()}catch(J){console.error("[gemi/ai] a voice call could not be hung up; waiting for the vendor.",J),this.errors.push({code:"hangup_failed",message:J instanceof Error?J.message:String(J)});let $;await Promise.race([this.sideband.closed,new Promise((Q)=>$=setTimeout(Q,this.limits.hangupGraceMs))]),clearTimeout($),this.sideband.close()}}async closingLine(J){await new Promise(($)=>{let Q=`gemi_voice_closing_${crypto.randomUUID()}`,Z=`gemi_voice_cancel_${crypto.randomUUID()}`,W=this.responseActive?"cancelling":"asked",K,X=setTimeout(G,this.limits.closingLineMs);function G(){clearTimeout(X),$()}let V=()=>{W="asked",this.sideband.send({type:"response.create",event_id:Q,response:{instructions:`Say exactly this to the user, and nothing else: "${J}"`,tool_choice:"none"}})};if(this.closingWaiter=(Y)=>{let H=Y;if(H.type==="sideband.closed")return G();if(W==="cancelling"){if(H.type==="response.done"||H.type==="error"&&H.error?.event_id===Z)V();return}if(H.type==="error"&&H.error?.event_id===Q)return G();if(H.type==="response.created"&&!K){K=H.response?.id;return}let D=(z)=>!K||!z||z===K;if(H.type==="response.done"&&D(H.response?.id))W="playing";else if(H.type==="output_audio_buffer.stopped"&&W==="playing"&&D(H.response_id))G()},W==="cancelling")this.sideband.send({type:"response.cancel",event_id:Z});else V()}),this.closingWaiter=void 0}}function b9(J){if(!J)return{};return Object.fromEntries(Object.entries(J).filter(([,$])=>$!==void 0))}function Q0(J){try{let $=JSON.parse(J);return $&&typeof $==="object"&&!Array.isArray($)?$:{}}catch{return{}}}function Z0(J,$,Q){let Z={toolCallId:J.toolCallId,signature:J.signature,...J.path?{path:J.path}:{}};if(J.kind==="question")return{...Z,output:$};if(J.kind==="approval")return{...Z,approve:Q===!0,...$?{reason:$}:{}};return{...Z,approve:!1,reason:"Not available in a voice call."}}function W0(){let J=new Set;return($)=>{if($.type==="tool-call"){if($.part.partial||$.resent||J.has($.part.toolCallId))return;return J.add($.part.toolCallId),`running ${String($.part.name)}`}if($.type==="tool-progress"){let Q=$.data;if(typeof Q==="string")return Q;if(Q&&typeof Q==="object")for(let Z of["message","label","title"]){let W=Q[Z];if(typeof W==="string"&&W)return W}}return}}var f9="http://gemi.internal/__gemi__/voice/mcp";async function h$(J,$){if(!$.user)throw Error("Voice MCP tools run as the signed-in user, and this voice session has none. Give `mcp` only to a signed-in user's session.");let{registry:Q}=J,Z=J.scopes??Q.scopes().map((X)=>X.name),W=(X)=>({kind:"remote",req:X,principal:{user:$.user,via:"voice",id:`voice:${$.sessionId}`,scopes:Z}});return(await Q.available(W(v9()),J.filter)).filter((X)=>!X.requiresApproval).map((X)=>({tool:{name:X.name,description:X.description,parameters:X.inputSchema},...J.timeoutMs!==void 0?{timeoutMs:J.timeoutMs}:{},run:(G,V)=>{let Y=v9();return c.run(Y,async()=>{return await J.authorize?.({name:X.name,input:G,sessionId:V.sessionId}),Q.execute(W(Y),X.name,G,void 0,{signal:V.signal})},{user:$.user})}}))}function v9(){return new w(new Request(f9,{method:"POST"}),{},"api",new URL(f9).pathname)}class g${records=new Map;retainEndedMs;constructor(J={}){this.retainEndedMs=J.retainEndedMs??600000}async create(J){this.sweep(),this.records.set(J.id,structuredClone(J))}async get(J){let $=this.records.get(J);return $?structuredClone($):null}async update(J,$){let Q=this.records.get(J);if(!Q)return;this.records.set(J,{...Q,...structuredClone($),id:J})}sweep(){let J=Date.now()-this.retainEndedMs;for(let[$,Q]of this.records)if(Q.endedAt!==void 0&&Q.endedAt<J)this.records.delete($)}}var u$=new g$;var y9=new WeakMap,h9=100;class l9{threadsTable;messagesTable;sql;dialect;connection;constructor(J,$={}){this.threadsTable=g9($.threadsTable??"gemi_agent_threads","threads"),this.messagesTable=g9($.messagesTable??"gemi_agent_messages","messages"),this.sql=J.sql,this.dialect=J.dialect,this.connection=J.name}async createTable(){let J=Y0(this.dialect,this.threadsTable,this.messagesTable);for(let $ of J)await this.sql.unsafe($)}async createThread(J){let $=this.q(),Q=crypto.randomUUID(),Z=J.userId===void 0||J.userId===null?null:String(J.userId),W=this.clock($);return await $`
147
- INSERT INTO ${this.threads($)} (id, user_id, created_at, updated_at)
148
- VALUES (${Q}, ${Z}, ${W}, ${W})
149
- `,{threadId:Q}}async loadThread(J){let $=this.q();if((await $`SELECT id FROM ${this.threads($)} WHERE id = ${J}`).length===0)return null;return(await $`
150
- SELECT message FROM ${this.messages($)}
151
- WHERE thread_id = ${J}
152
- ORDER BY position
153
- `).map((W)=>JSON.parse(String(W.message)))}async appendMessages(J,$){if($.length===0){if(await this.getThread(J)===null)throw u9(J);return}await this.atomically(async(Q)=>{await Q`UPDATE ${this.threads(Q)} SET updated_at = ${this.clock(Q)} WHERE id = ${J}`;let Z=await Q`
154
- SELECT title FROM ${this.threads(Q)} WHERE id = ${J}
155
- `;if(Z.length===0)throw u9(J);let W=[...new Set($.map((Y)=>Y.id))],K=await Q`
142
+ )`,`CREATE INDEX IF NOT EXISTS "${$}_scope_kind_created_at_idx" ON "${$}"("scope", "kind", "created_at")`,`CREATE INDEX IF NOT EXISTS "${$}_expires_at_idx" ON "${$}"("expires_at")`,`CREATE UNIQUE INDEX IF NOT EXISTS "${$}_scope_key_key" ON "${$}"("scope", "key")`]}var m8={n:0,mean:0,stddev:0,low:null,high:null};function u(J){let $=[0.9999999999998099,676.5203681218851,-1259.1392167224028,771.3234287776531,-176.6150291621406,12.507343278686905,-0.13857109526572012,0.000009984369578019572,0.00000015056327351493116];if(J<0.5)return Math.log(Math.PI/Math.sin(Math.PI*J))-u(1-J);J-=1;let Q=$[0],Z=J+7.5;for(let W=1;W<9;W++)Q+=$[W]/(J+W);return 0.5*Math.log(2*Math.PI)+(J+0.5)*Math.log(Z)-Z+Math.log(Q)}function c8(J,$,Q){let W=1,K=1-(J+$)*Q/(J+1);if(Math.abs(K)<0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001)K=0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001;K=1/K;let X=K;for(let Y=1;Y<=300;Y++){let V=2*Y,G=Y*($-Y)*Q/((J+V-1)*(J+V));if(K=1+G*K,Math.abs(K)<0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001)K=0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001;if(W=1+G/W,Math.abs(W)<0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001)W=0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001;if(K=1/K,X*=K*W,G=-(J+Y)*(J+$+Y)*Q/((J+V)*(J+V+1)),K=1+G*K,Math.abs(K)<0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001)K=0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001;if(W=1+G/W,Math.abs(W)<0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001)W=0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001;K=1/K;let H=K*W;if(X*=H,Math.abs(H-1)<0.00000000000001)break}return X}function VZ(J,$,Q){if(J<=0)return 0;if(J>=1)return 1;let Z=Math.exp(u($+Q)-u($)-u(Q)+$*Math.log(J)+Q*Math.log(1-J));return J<($+1)/($+Q+2)?Z*c8($,Q,J)/$:1-Z*c8(Q,$,1-J)/Q}function Y$(J,$){return VZ($/($+J*J),$/2,0.5)}function HZ(J){if(!(J>0))return Number.POSITIVE_INFINITY;let $=1.959964,Q=2;while(Y$(Q,J)>0.05)Q*=2;for(let Z=0;Z<100;Z++){let W=($+Q)/2;if(Y$(W,J)>0.05)$=W;else Q=W}return($+Q)/2}function zZ(J,$,Q,Z){let W=J+Q,K=$+Z,X=(H,D)=>u(H+1)-u(D+1)-u(H-D+1),Y=(H)=>Math.exp(X($,H)+X(Z,W-H)-X(K,W)),V=Y(J),G=0;for(let H=Math.max(0,W-Z);H<=Math.min($,W);H++){let D=Y(H);if(D<=V*1.0000001)G+=D}return Math.min(1,G)}function p8(J,$){if(J.length<2)return 0;let Q=J.reduce((W,K)=>W+(K-$)**2,0),Z=Math.sqrt(Q/(J.length-1));return Z<0.000000000001*Math.max(1,Math.abs($))?0:Z}function V$(J){let $=J.length;if($===0)return m8;let Q=J.map((Y)=>Y?1:0),Z=Q.reduce((Y,V)=>Y+V,0)/$,W=3.841458881296,K=(Z+W/(2*$))/(1+W/$),X=1.959964*Math.sqrt(Z*(1-Z)/$+W/(4*$*$))/(1+W/$);return{n:$,mean:Z,stddev:p8(Q,Z),low:Math.max(0,K-X),high:Math.min(1,K+X)}}function H$(J){let $=J.length;if($===0)return m8;let Q=J.reduce((K,X)=>K+X,0)/$,Z=p8(J,Q);if($<2||Z===0)return{n:$,mean:Q,stddev:Z,low:null,high:null};let W=HZ($-1)*Z/Math.sqrt($);return{n:$,mean:Q,stddev:Z,low:Q-W,high:Q+W}}function GJ(J,$,Q){return{before:J.mean,after:$.mean,delta:$.mean-J.mean,p:Q,pAdjusted:Q,significant:!1}}function l8(J,$){if(J.n===0||$.n===0)return GJ(J,$,null);let Q=(Z)=>Math.round(Z.mean*Z.n);return GJ(J,$,zZ(Q(J),J.n,Q($),$.n))}function d8(J,$){if(J.n<2||$.n<2)return GJ(J,$,null);let Q=J.stddev**2/J.n,Z=$.stddev**2/$.n,W=Math.sqrt(Q+Z);if(W===0)return GJ(J,$,null);let K=(Q+Z)**2/(Q**2/(J.n-1)+Z**2/($.n-1));return GJ(J,$,Y$(($.mean-J.mean)/W,K))}function i8(J,$,Q){if(Q==="holm"){let Z=J.filter((K)=>K.p!==null).sort((K,X)=>K.p-X.p),W=0;Z.forEach((K,X)=>{W=Math.max(W,Math.min(1,K.p*(Z.length-X))),K.pAdjusted=W})}else for(let Z of J)Z.pAdjusted=Z.p;for(let Z of J)Z.significant=Z.pAdjusted!==null&&Z.pAdjusted<$&&Z.delta!==0}class wJ{name;cases;runs;concurrency;graders;pricing;task;constructor(J){this.name=J.name,this.cases=J.cases,this.runs=J.runs??1,this.concurrency=J.concurrency??1,this.task=J.task,this.graders=typeof J.graders==="function"?J.graders({judge:($)=>wJ.judge($)}):J.graders,this.pricing=J.pricing}static create(J){let $=`The eval "${J.name}"`;YJ(J.runs,$,"runs"),YJ(J.concurrency,$,"concurrency");let Q=new Set;for(let W of J.cases){if(Q.has(W.id))throw Error(`${$} has two cases with the id "${W.id}".`);Q.add(W.id)}let Z=new wJ(J);for(let[W,K]of Object.entries(Z.graders))if(typeof K!=="function"&&K.kind==="judge")YJ(K.samples,`${$}'s judge "${W}"`,"samples");return Z}static judge(J){return{...J,kind:"judge"}}static compare(J,$,Q={}){return r8(J,$,Q)}static format(J,$={}){return UZ(J,$)}async run(J={}){let $=`${this.name}.run`;YJ(J.runs,$,"runs"),YJ(J.concurrency,$,"concurrency");let Q=J.only?new Set(J.only):null;if(Q){let N=[...Q].filter((U)=>!this.cases.some((L)=>L.id===U));if(N.length>0)throw Error(`The eval "${this.name}" has no case ${N.map((U)=>`"${U}"`).join(", ")}.`)}let Z=J.runs??this.runs,W=Date.now(),K=new AbortController,X=J.signal?AbortSignal.any([J.signal,K.signal]):K.signal,Y=this.cases.filter((N)=>!Q||Q.has(N.id)),V={};for(let[N,U]of Object.entries(this.graders)){if(X.aborted)break;if(typeof U==="function"||U.kind!=="judge"||!U.calibration)continue;V[N]=await this.calibrate(U,X)}let G=Y.flatMap((N)=>Array.from({length:Z},(U,L)=>({test:N,run:L+1}))),H=Array.from({length:G.length}),D=0,z,F=async()=>{while(D<G.length&&!X.aborted){let N=D++,U=G[N],L=await this.sample(U.test,U.run,X,J.keepOutputs??!1);H[N]=L;try{J.onSample?.(L)}catch(C){z??={error:C},K.abort(C)}}},B=Math.min(J.concurrency??this.concurrency,G.length);if(await Promise.all(Array.from({length:B},F)),z)throw z.error;let P=H.filter((N)=>N!==void 0);return this.report(P,V,Z,new Date(W).toISOString(),Date.now()-W,{aborted:X.aborted||P.length<G.length,planned:Y.map((N)=>N.id)})}async sample(J,$,Q,Z){let W=Date.now(),K,X,Y=await VJ(async()=>{try{K=await this.task(J.input,{case:J,run:$,signal:Q})}catch(B){X=J9(B)}}),V={},G=!1,H=await VJ(async()=>{if(X!==void 0)return;let B={case:J,input:J.input,run:$};for(let[P,N]of Object.entries(this.graders)){if(J.skip?.includes(P))continue;let U=await n8(N,K,B,Q);if(!U)continue;if(V[P]=U,!U.pass&&typeof N!=="function"&&N.gate)G=!0}}),D=Object.values(V).map((B)=>B.score),z=X===void 0&&D.length===0,F=this.pricing?z$(this.pricing,Y.byModel).cost+z$(this.pricing,H.byModel).cost:void 0;return{case:J.id,run:$,pass:X===void 0&&!z&&Object.values(V).every((B)=>B.pass),excluded:G||z,...z?{ungraded:!0}:{},score:X!==void 0||z?0:e8(D),grades:V,...X!==void 0?{error:X}:{},...Z&&X===void 0?{output:K}:{},usage:Y.usage,byModel:FZ(Y.byModel,H.byModel),judgeUsage:H.usage,...F!==void 0?{cost:F}:{},durationMs:Date.now()-W}}async calibrate(J,$){let Q=J.calibration,Z=[],W=0,K=await VJ(async()=>{for(let[V,G]of Q.examples.entries()){if($.aborted)break;let H=G.id??`example-${V+1}`,D={case:{id:H,input:G.input},input:G.input,run:0},z=await n8(J,G.output,D,$),F=z?.pass??!1;if(F===G.expected)W++;else Z.push({id:H,expected:G.expected,got:F,...z?.note?{note:z.note}:{}})}}),X=Q.examples.length,Y=X===0?1:W/X;return{n:X,agreement:Y,ok:Y>=(Q.minAgreement??0.8),disagreements:Z,usage:K.usage}}report(J,$,Q,Z,W,K){let X=new Set(Object.entries(this.graders).filter(([,z])=>typeof z!=="function"&&z.gate).map(([z])=>z)),Y={};for(let z of this.cases){let F=J.filter((B)=>B.case===z.id);if(F.length===0)continue;Y[z.id]={...o8(F),graders:s8(F,X)}}let V=E(),G=E(),H={};for(let z of J){V=k(V,z.usage),G=k(G,z.judgeUsage);for(let[F,B]of Object.entries(z.byModel))H[F]=k(H[F]??E(),B)}let D=this.pricing?z$(this.pricing,H):void 0;return{name:this.name,startedAt:Z,durationMs:W,runs:Q,aborted:K.aborted,planned:K.planned,samples:J,cases:Y,graders:s8(J,X),calibration:$,totals:{...o8(J),usage:V,judgeUsage:G,byModel:H,...D?{cost:D.cost}:{},unpriced:D?D.unpriced:Object.keys(H)}}}}async function n8(J,$,Q,Z){let W=typeof J==="function"?0.5:J.threshold??0.5;try{if(typeof J==="function")return D$(await J($,Q),W);if(J.kind!=="judge")return D$(await J.check($,Q),W);return await DZ(J,$,Q,W,Z)}catch(K){return{pass:!1,score:0,error:J9(K)}}}async function DZ(J,$,Q,Z,W){let K=await J.prompt($,Q),X=typeof K==="string"?{prompt:K}:K,Y=[];for(let D=0;D<(J.samples??1)&&!W.aborted;D++){let z=await F$({signal:W,provider:J.provider,...J.instructions!==void 0?{instructions:J.instructions}:{},...X,output:J.output,...J.reasoning!==void 0?{reasoning:J.reasoning}:{},...J.maxOutputTokens!==void 0?{maxOutputTokens:J.maxOutputTokens}:{},...J.temperature!==void 0?{temperature:J.temperature}:{},logErrors:!1});if(!z.ok){Y.push({pass:!1,score:0,error:`The judge failed: ${z.error.message}`});continue}let F=D$(J.verdict(z.output,Q),Z);if(F)Y.push(F)}if(Y.length===0)return null;if(Y.length===1)return Y[0];let V=Y.filter((D)=>D.pass).length,G=Y.map((D)=>D.note??D.error).filter(Boolean),H=Y.map((D)=>D.error).filter(Boolean);return{pass:V*2>Y.length,score:e8(Y.map((D)=>D.score)),...G.length>0?{note:G.join(" | ")}:{},...H.length===Y.length?{error:H.join(" | ")}:{}}}function D$(J,$){if(J===null||J===void 0)return null;if(typeof J==="boolean")return{pass:J,score:J?1:0};if(typeof J==="number"){if(!Number.isFinite(J))throw Error(`A grader answered the score ${J}.`);let Q=a8(J);return{pass:Q>=$,score:Q}}return{pass:J.pass,score:J.score===void 0?J.pass?1:0:a8(J.score),...J.note!==void 0?{note:J.note}:{}}}function o8(J){let $=J.filter((Q)=>!Q.excluded);return{samples:J.length,kept:$.length,passed:$.filter((Q)=>Q.pass).length,errors:J.filter((Q)=>Q.error!==void 0).length,passRate:V$($.map((Q)=>Q.pass)),score:H$($.map((Q)=>Q.score))}}function s8(J,$){let Q=J.filter((W)=>!W.excluded),Z=[...new Set(J.flatMap((W)=>Object.keys(W.grades)))];return Object.fromEntries(Z.map((W)=>{let X=($.has(W)?J:Q).flatMap((Y)=>Y.grades[W]?[Y.grades[W]]:[]);return[W,{passRate:V$(X.map((Y)=>Y.pass)),score:H$(X.map((Y)=>Y.score))}]}))}function z$(J,$){let Q=0,Z=[];for(let[W,K]of Object.entries($)){let X=t8(J,W,K);if(X===void 0){Z.push(W);continue}Q+=X}return{cost:Q,unpriced:Z}}function FZ(...J){let $={};for(let Q of J)for(let[Z,W]of Object.entries(Q))$[Z]=k($[Z]??E(),W);return $}function r8(J,$,Q){for(let[N,U]of[["baseline",J],["current report",$]])if(U.aborted)throw Error(`Eval.compare: the ${N} for "${U.name}" was aborted (${U.samples.length} samples ran). Its statistics cover only the samples that ran; run it again in full.`);let Z=Q.alpha??0.05,W=Q.adjust??"holm",K=[],X=(N,U,L)=>{let C={label:N,passRate:l8(U.passRate,L.passRate),score:d8(U.score,L.score)};return K.push(C),{passRate:C.passRate,score:C.score}},Y=(N,U,L)=>Object.fromEntries(Object.keys(L).filter((C)=>(C in U)).map((C)=>[C,X(`${N} ${C}`,U[C],L[C])])),V=(N,U)=>({fromCurrent:N.filter((L)=>!U.includes(L)),fromBaseline:U.filter((L)=>!N.includes(L))}),G=X("total",J.totals,$.totals),H=Y("case",J.cases,$.cases),D=Y("grader",J.graders,$.graders),z=K.flatMap((N)=>[N.passRate,N.score]);i8(z,Z,W);let F={cases:V([...new Set([...J.planned??[],...Object.keys(J.cases)])],[...new Set([...$.planned??[],...Object.keys($.cases)])]),graders:V(Object.keys(J.graders),Object.keys($.graders))},B=[...F.cases.fromCurrent.map((N)=>`case ${N}: in the baseline, missing from this report`),...F.graders.fromCurrent.map((N)=>`grader ${N}: in the baseline, missing from this report`)],P=[];for(let N of K)for(let[U,L]of[["pass rate",N.passRate],["score",N.score]]){if(!L.significant)continue;let C=`${N.label}: ${U} ${L.before.toFixed(2)} \u2192 ${L.after.toFixed(2)} (p = ${PZ(L.pAdjusted)})`;(L.delta<0?B:P).push(C)}return{totals:G,cases:H,graders:D,missing:F,comparisons:z.filter((N)=>N.p!==null).length,alpha:Z,adjust:W,regressions:B,improvements:P}}function PZ(J){return J<0.001?"<0.001":J.toFixed(3)}function UZ(J,$){let Q=$.baseline&&!$.baseline.aborted&&!J.aborted?r8($.baseline,J,$):void 0,{totals:Z}=J,W=[];if(W.push(`eval ${J.name}: ${Z.samples} samples, ${Z.kept} kept, ${Z.passed} passed, ${Z.errors} errors (${(J.durationMs/1000).toFixed(1)}s)`),J.aborted)W.push(`ABORTED: only ${Z.samples} of the planned samples ran; not comparable.`);let K=(G)=>{if(G.n===0)return"-";let H=G.mean.toFixed(2);if(G.low===null||G.high===null)return`${H} (${G.n===1?"n=1":"no spread"})`;return`${H} [${G.low.toFixed(2)}, ${G.high.toFixed(2)}]`},X=(G)=>G?` ${G.delta>=0?"+":""}${G.delta.toFixed(2)}${G.significant?"*":""}`:"",Y=(G,H)=>{let D=[0,1,2,3].map((F)=>Math.max(...[[G,"n","pass rate","score"],...H].map((B)=>B[F].length))),z=(F)=>F.map((B,P)=>B.padEnd(D[P])).join(" ").trimEnd();W.push("",z([G,"n","pass rate","score"]),...H.map(z))};Y("case",Object.entries(J.cases).map(([G,H])=>[G,`${H.kept}/${H.samples}`,K(H.passRate)+X(Q?.cases[G]?.passRate),K(H.score)+X(Q?.cases[G]?.score)])),Y("grader",Object.entries(J.graders).map(([G,H])=>[G,String(H.passRate.n),K(H.passRate)+X(Q?.graders[G]?.passRate),K(H.score)+X(Q?.graders[G]?.score)])),W.push("",`total pass rate ${K(Z.passRate)}${X(Q?.totals.passRate)} score ${K(Z.score)}${X(Q?.totals.score)}`);for(let[G,H]of Object.entries(J.calibration))W.push(`judge ${G}: agreement ${H.agreement.toFixed(2)} on ${H.n} examples${H.ok?"":" (BELOW minAgreement)"}`);let V=(G)=>`${G.inputTokens} in, ${G.outputTokens} out`;if(W.push(`tokens: task ${V(Z.usage)}; judges ${V(Z.judgeUsage)}${Z.cost!==void 0?`; cost $${Z.cost.toFixed(4)}`:""}${Z.unpriced.length>0&&Z.cost!==void 0?` (unpriced: ${Z.unpriced.join(", ")})`:""}`),Q){W.push("",`* significant at ${Q.alpha} over ${Q.comparisons} tests (${Q.adjust==="holm"?"Holm-adjusted":"unadjusted"}; Fisher's exact for pass rates, Welch's t for scores)`);for(let G of Q.regressions)W.push(`regression: ${G}`);for(let G of Q.improvements)W.push(`improvement: ${G}`)}return W.join(`
143
+ `)}function e8(J){return J.reduce(($,Q)=>$+Q,0)/J.length}function a8(J){return Math.min(1,Math.max(0,J))}function J9(J){return J instanceof Error?J.message:String(J)}function YJ(J,$,Q){if(J===void 0||Number.isInteger(J)&&J>=1)return;throw Error(`${$} sets \`${Q}\` to ${String(J)}, but it has to be a whole number of at least 1.`)}var NZ=/^[A-Za-z0-9_-]{1,64}$/;function BZ(J,$){let Q=LZ($)?$:{filter:$},Z=Q.deferred===!0,W=J.descriptors(Q.filter);if(!Q.namespaces)return W.map((H)=>P$(J,H,Z));let K=Object.entries(Q.namespaces),X=new Set(J.descriptors().flatMap((H)=>H.tags));for(let[H,D]of K){if(!NZ.test(H))throw Error(`toAgentTools: "${H}" is not a valid namespace name. A namespace is named by its tag and sent to the provider as a tool name is \u2014 letters, digits, "_" and "-", at most 64.`);if(typeof D?.description!=="string"||D.description.trim()==="")throw Error(`toAgentTools: the namespace "${H}" needs a description. It is what the model reads to decide whether to look inside.`);if(!X.has(H))throw Error(`toAgentTools: no tool is tagged "${H}", so its namespace would be empty.`)}let Y=new Map(K.map(([H])=>[H,[]])),V=[];for(let H of W){let D=K.find(([z])=>H.tags.includes(z))?.[0];if(D===void 0)V.push(P$(J,H,Z));else Y.get(D).push(P$(J,H,!1))}let G=[];for(let[H,D]of K){let z=Y.get(H);if(z.length===0)continue;G.push(U$.create({name:H,description:D.description,tools:z,deferred:D.deferred??Z}))}return[...G,...V]}function LZ(J){return typeof J==="object"&&J!==null&&(("filter"in J)||("namespaces"in J)||("deferred"in J))}function P$(J,$,Q){if($.kind==="tool")return CZ(J,$,Q);return IJ.create({name:$.name,description:$.description,inputSchema:$.inputSchema,...$.outputSchema?{outputSchema:$.outputSchema}:{},requiresApproval:$.requiresApproval,deferred:Q,execute:(Z,W)=>{let K=c.getStore()?.req;if(!K)throw new m(`"${$.name}" calls an api route as the user who started this run, and this run was not started inside a request. Run it from an AgentController, or give this agent tools that do not go through the MCP registry.`);return J.execute({kind:"local",req:K},$.name,Z,W)}})}function CZ(J,$,Q){let Z=J.nativeTool($.name);return IJ.create({name:$.name,description:$.description,inputSchema:$.inputSchema,...$.outputSchema?{outputSchema:$.outputSchema}:{},requiresApproval:J.nativeApproval($.name),deferred:Q,...Z.timeoutMs!==void 0?{timeoutMs:Z.timeoutMs}:{},...Z.async?{async:Z.async}:{},execute:(W,K)=>{let X=c.getStore()?.req;return J.startNative(X?{kind:"local",req:X}:void 0,$.name,W,K)}})}function OZ(J){if(J==="auto")return;let $=/^(\d+)x(\d+)$/.exec(J);if(!$)throw Error(`An image size is "WIDTHxHEIGHT" or "auto"; got ${JSON.stringify(J)}.`);let Q=Number($[1]),Z=Number($[2]);if(Q%16!==0||Z%16!==0)throw Error(`Image size ${J} is not supported: width and height must both be divisible by 16.`);if(Math.max(Q/Z,Z/Q)>3)throw Error(`Image size ${J} is not supported: the maximum aspect ratio is 3:1, either way up.`)}function $9(J,$){if(J.size!==void 0)try{OZ(J.size)}catch(Q){throw Error(`${$}: ${Q.message}`)}if(J.background==="transparent"&&J.format==="jpeg")throw Error(`${$}: a transparent background needs "png"; JPEG has no alpha channel.`);if(J.compression!==void 0){let Q=J.compression;if(!Number.isInteger(Q)||Q<0||Q>100)throw Error(`${$}: compression is an integer from 0 to 100; got ${Q}.`)}}function Q9(J,$){if(J instanceof File)return J;let Q=J.type||"image/png",Z=Q==="image/jpeg"?"jpg":Q.split("/")[1]??"png";return new File([J],`${$}.${Z}`,{type:Q})}class N${name;provider;settings;constructor(J){let{name:$,provider:Q,...Z}=J;$9(Z,`ImageModel "${$}"`),this.name=$,this.provider=Q,this.settings=Z}static create(J){return new N$(J)}async generate(J){let $=this.merge(J);return this.present(await this.provider.generate({prompt:J.prompt,...$,signal:J.signal}))}async edit(J){let $=this.merge(J);return this.present(await this.provider.edit({prompt:J.prompt,...$,images:J.images.map((Q,Z)=>Q9(Q,`image-${Z}`)),...J.mask?{mask:Q9(J.mask,"mask")}:{},signal:J.signal}))}present(J){return Z9(this.provider.model,J.usage),_Z(J)}merge(J){let $={...this.settings,...J.size!==void 0?{size:J.size}:{},...J.quality!==void 0?{quality:J.quality}:{},...J.background!==void 0?{background:J.background}:{},...J.format!==void 0?{format:J.format}:{},...J.compression!==void 0?{compression:J.compression}:{}};return $9($,`ImageModel "${this.name}"`),$}}function _Z(J){return{image:new Blob([J.bytes],{type:J.mimeType}),mimeType:J.mimeType,size:J.size,usage:J.usage}}function p(J){return typeof process>"u"?void 0:process.env?.[J]}var MZ="preview";function W9(J){let $=J.trim().replace(/\/+$/,"");if(!$)return"";return`${$.replace(/\/openai(?:\/v1)?$/i,"")}/openai`}function SZ(J){return/^\d{4}-\d{2}-\d{2}/.test(J)?"":"/v1"}function HJ(J,$={}){return{base:(J.baseURL??p("OPENAI_BASE_URL")??"https://api.openai.com/v1").replace(/\/+$/,""),query:"",headers:async()=>{let Z=J.apiKey??p("OPENAI_API_KEY");return{...Z?{authorization:`Bearer ${Z}`}:{},...J.headers}},timeoutMs:J.timeoutMs??$.timeoutMs??120000,streamIdleTimeoutMs:J.streamIdleTimeoutMs??120000,streamMaxDurationMs:J.streamMaxDurationMs??300000,maxToolArgumentChars:J.maxToolArgumentChars??0,maxRetries:J.maxRetries??2}}function K9(J){let $=J.baseURL??J.endpoint??p("AZURE_OPENAI_ENDPOINT");if($)return W9($);let Q=J.resourceName??p("AZURE_OPENAI_RESOURCE_NAME")??p("AZURE_RESOURCE_NAME");return Q?W9(`https://${Q.trim()}.cognitiveservices.azure.com`):""}function zJ(J,$={}){let Q=J.apiVersion??p("AZURE_OPENAI_API_VERSION")??MZ;return{base:`${K9(J)}${SZ(Q)}`,query:`?api-version=${encodeURIComponent(Q)}`,headers:async()=>{if(J.getToken)return{authorization:`Bearer ${await J.getToken()}`,...J.headers};let Z=J.apiKey??p("AZURE_OPENAI_API_KEY");return{...Z?{"api-key":Z}:{},...J.headers}},timeoutMs:J.timeoutMs??$.timeoutMs??120000,streamIdleTimeoutMs:J.streamIdleTimeoutMs??120000,streamMaxDurationMs:J.streamMaxDurationMs??300000,maxToolArgumentChars:J.maxToolArgumentChars??0,maxRetries:J.maxRetries??2}}function X9(J,$={}){return{...zJ(J,$),base:`${K9(J)}/v1`,query:""}}var AZ=500,Y9=20000;function RZ(J,$){if(!J)return;let Q=J.trim();if(/^\d+(\.\d+)?$/.test(Q))return Math.max(0,Number(Q)*1000);let Z=Date.parse(Q);if(Number.isNaN(Z))return;return Math.max(0,Z-$)}function qJ(J,$){let Q=Math.min(Y9,AZ*2**J);return Math.round(Q*(0.5+$()*0.5))}function EZ(J){return J===429||J===408||J===409||J>=500}function jZ(J,$){return EZ(J)&&x($).retryable}function V9(J){return J.reason??new DOMException("The operation was aborted.","AbortError")}function H9(J,$){return new Promise((Q,Z)=>{let W=setTimeout(Q,J);$?.addEventListener("abort",()=>{clearTimeout(W),Z(V9($))},{once:!0})})}async function B$(J,$,Q=H9){if(!$)return await Q(J);$.throwIfAborted();let Z;try{await Promise.race([Q(J,$),new Promise((W,K)=>{Z=()=>K(V9($)),$.addEventListener("abort",Z,{once:!0})})])}finally{if(Z)$.removeEventListener("abort",Z)}}async function l(J,$,Q){let Z=Q.fetchImpl??((H,D)=>fetch(H,D)),W=Q.sleep??H9,K=Q.random??Math.random,X=Q.now??Date.now,Y=Math.max(0,Q.maxRetries),V=(H)=>B$(H,Q.signal,W),G;for(let H=0;H<=Y;H++){Q.signal?.throwIfAborted();let D=new AbortController,z=()=>D.abort(Q.signal?.reason);Q.signal?.addEventListener("abort",z,{once:!0});let F=!1,B=Q.timeoutMs>0?setTimeout(()=>{F=!0,D.abort()},Q.timeoutMs):void 0,P;try{P=await Z(J,{...$,signal:D.signal})}catch(C){if(B!==void 0)clearTimeout(B);if(Q.signal?.removeEventListener("abort",z),Q.signal?.aborted)throw C;if(G=F?new G9(Q.timeoutMs):C,F&&Q.retryTimeouts===!1)throw G;if(H===Y)throw G;await V(qJ(H,K));continue}if(B!==void 0)clearTimeout(B);if(P.ok)return P;Q.signal?.removeEventListener("abort",z);let N=await kZ(P),U=new b(P.status,N,P.headers.get("x-request-id")??void 0,RZ(P.headers.get("retry-after"),X()));if(H===Y||!jZ(P.status,U))throw U;let L=U.retryAfter??(P.status===429?x(U).retryAfter:void 0);await V(L===void 0?qJ(H,K):Math.min(L,Y9)),G=U}throw G??Error("Provider request failed with no response.")}async function kZ(J){let $;try{$=await J.text()}catch{return null}try{return JSON.parse($)}catch{return $}}function z9(J,$,Q){let Z=$.idleMs>0?$.idleMs:0,W=$.maxMs>0?$.maxMs:0;if(!J||!Z&&!W)return J;let K=W?performance.now()+W:1/0,X=J.getReader();return new ReadableStream({async pull(Y){let V,G,H=Math.max(0,K-performance.now()),D=!Z||H<=Z,z=D?H:Z,F=new Promise((B,P)=>{V=setTimeout(()=>{G=D?Q.max():Q.idle(),P(G)},z)});try{let B=await Promise.race([X.read(),F]);if(B.done)Y.close();else Y.enqueue(B.value)}catch(B){let P=G??B;Y.error(P),X.cancel(P).catch(()=>{})}finally{clearTimeout(V)}},cancel(Y){return X.cancel(Y)}},{highWaterMark:0})}var L$=300000;function C$(J){return{generationsUrl:`${J.base}/images/generations${J.query}`,editsUrl:`${J.base}/images/edits${J.query}`,headers:J.headers,timeoutMs:J.timeoutMs,maxRetries:J.maxRetries}}class bJ extends Error{code;retryable;retryAfter;constructor(J,$={}){super(J.message,$);if(this.name="ImageRequestError",this.code=J.code,this.retryable=J.retryable,J.retryAfter!==void 0)this.retryAfter=J.retryAfter}}var TZ={png:"image/png",jpeg:"image/jpeg"};function xZ(J){let $=Number(J?.input_tokens??0),Q=Number(J?.output_tokens??0),Z={inputTokens:$,outputTokens:Q,totalTokens:Number(J?.total_tokens??$+Q)},W=J?.input_tokens_details?.image_tokens;if(typeof W==="number")Z.imageInputTokens=W;let K=J?.output_tokens_details?.image_tokens;if(typeof K==="number")Z.imageOutputTokens=K;return Z}function wZ(J){let $=atob(J),Q=new Uint8Array($.length);for(let Z=0;Z<$.length;Z++)Q[Z]=$.charCodeAt(Z);return Q}function IZ(J){let Q=J?.data?.[0]?.b64_json;if(typeof Q!=="string"||Q.length===0)throw new bJ({code:"provider_error",message:"The provider answered an image call with no base64 image data.",retryable:!1});let Z=typeof J.output_format==="string"?J.output_format:"png";return{bytes:wZ(Q),mimeType:TZ[Z]??`image/${Z}`,size:typeof J.size==="string"?J.size:"",...typeof J.background==="string"?{background:J.background}:{},usage:xZ(J.usage)}}async function D9(J,$,Q,Z){let W;try{W=await l(J,$,{maxRetries:Q.maxRetries,timeoutMs:Q.timeoutMs,retryTimeouts:!1,signal:Z.signal,fetchImpl:Q.fetchImpl})}catch(K){if(Z.signal?.aborted)throw K;throw new bJ(x(K),{cause:K})}return IZ(await W.json())}async function F9(J,$,Q={}){return await D9(J.generationsUrl,{method:"POST",headers:{...await J.headers(),"content-type":"application/json"},body:JSON.stringify($)},J,Q)}async function P9(J,$,Q={}){return await D9(J.editsUrl,{method:"POST",headers:await J.headers(),body:$},J,Q)}class fJ{static models(){return[]}modelName(){return this.model}async generate(J){return await F9(this.endpoint(),this.body(J),{signal:J.signal})}async edit(J){let $=new FormData;for(let[Q,Z]of Object.entries(this.body(J)))if(Z!==void 0)$.set(Q,String(Z));for(let Q of J.images)$.append("image[]",Q,Q.name);if(J.mask)$.set("mask",J.mask,J.mask.name);return await P9(this.endpoint(),$,{signal:J.signal})}body(J){return{model:this.modelName(),prompt:J.prompt,...J.size?{size:J.size}:{},...J.quality?{quality:J.quality}:{},...J.background?{background:J.background}:{},...J.format?{output_format:J.format}:{},...J.compression!==void 0?{output_compression:J.compression}:{}}}normalizeError(J){return x(J)}}var U9=["gpt-image-2","gpt-image-1.5","gpt-image-1"];class O$ extends fJ{model;config;constructor(J,$={}){super();this.model=J,this.config=$}static model(J,$){return new O$(J,$)}static models(){return U9}endpoint(){return C$(HJ(this.config,{timeoutMs:L$}))}}class _$ extends fJ{model;config;constructor(J,$={}){super();this.model=J,this.config=$}static model(J,$){return new _$(J,$)}static models(){return U9}modelName(){return this.config.deployment??this.model}endpoint(){return C$(zJ(this.config,{timeoutMs:L$}))}}var L9=3;function M$(J){let $=new Map;for(let Q of J)for(let Z of Q.content??[]){if(Z.type!=="file"||!Z.fileId||$.has(Z.fileId))continue;$.set(Z.fileId,{name:Z.name,mimeType:Z.mimeType})}return $}function C9(J,$,Q=new Map){if(!($ instanceof b))return[];if($.status!==400&&$.status!==404)return[];let Z=bZ($.body);if(!Z)return[];let W=qZ(J.input);if(W.length===0)return[];let K=/^input\[(\d+)\]\.content\[(\d+)\]\.file_id$/.exec(Z.param??"");if(K){let G=J.input[Number(K[1])],H=A$(G)[Number(K[2])],D=H&&typeof H.file_id==="string"?H.file_id:void 0;if(D)return[D]}let X=Z.message??"",Y=B9(W.map((G)=>G.fileId).filter((G)=>fZ(X,G)));if(Y.length>0)return Y;let V=/Expected (image type|context stuffing file type) to be a supported format:.*but got \.([a-z0-9]+)\.?\s*$/is.exec(X);if(V){let G=V[1].toLowerCase()==="image type"?"input_image":"input_file",H=V[2].toLowerCase(),D=B9(W.filter((F)=>F.type===G).map((F)=>F.fileId)),z=D.filter((F)=>(Q.get(F)?.name??"").trim().toLowerCase().endsWith(`.${H}`));if(z.length===1)return z;if(z.length===0&&D.length===1)return D}return[]}function O9(J,$,Q=new Map){return{...J,input:J.input.map((Z)=>{let W=A$(Z);if(!W.some((K)=>N9(K,$)))return Z;return{...Z,content:W.map((K)=>N9(K,$)?{type:"input_text",text:S$(Q.get(String(K.file_id))?.name)}:K)}})}}function S$(J){return`[${J?`attachment ${JSON.stringify(J)}`:"an attachment"} could not be read by the provider and is not shown to you. Tell the user if it matters to the answer; uploading it again may help.]`}function N9(J,$){return typeof J.file_id==="string"&&$.has(J.file_id)}function A$(J){let $=J?.content;return Array.isArray($)?$:[]}function qZ(J){let $=[];for(let Q of J)for(let Z of A$(Q))if(typeof Z.file_id==="string"&&Z.file_id)$.push({type:String(Z.type),fileId:Z.file_id});return $}function bZ(J){if(!J||typeof J!=="object")return null;let $=J,Q=$.error&&typeof $.error==="object"?$.error:J;return{message:typeof Q.message==="string"?Q.message:void 0,param:typeof Q.param==="string"?Q.param:void 0}}function fZ(J,$){let Q=$.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return new RegExp(`(^|[^A-Za-z0-9_-])${Q}($|[^A-Za-z0-9_-])`).test(J)}function B9(J){return[...new Set(J)]}async function*yZ(J){let $="",Q="",Z=[],W,K=()=>{if(Z.length===0&&!Q)return null;let V={event:Q,data:Z.join(`
144
+ `),id:W};return Q="",Z=[],W=void 0,V.data?V:null},X=(V)=>{let G=V.endsWith("\r")?V.slice(0,-1):V;if(G==="")return K();if(G.startsWith(":"))return null;let H=G.indexOf(":"),D=H===-1?G:G.slice(0,H),z=H===-1?"":G.slice(H+1);if(z.startsWith(" "))z=z.slice(1);if(D==="event")Q=z;else if(D==="data")Z.push(z);else if(D==="id")W=z;return null};for await(let V of J){$+=V;let G=$.indexOf(`
145
+ `);while(G!==-1){let H=$.slice(0,G);$=$.slice(G+1);let D=X(H);if(D)yield D;G=$.indexOf(`
146
+ `)}}if($.length>0){let V=X($);if(V)yield V}let Y=K();if(Y)yield Y}async function*_9(J,$={}){let Q=new Map,Z=new Set,W,K=!1,X,Y=(V,G)=>({type:"finish",reason:V,usage:G,...X?{model:X}:{}});for await(let V of yZ(J)){if(V.data==="[DONE]")break;let G;try{G=JSON.parse(V.data)}catch{continue}let H=typeof G.type==="string"?G.type:V.event,D=G.response?.model;if(typeof D==="string"&&D)X=D;switch(H){case"response.output_text.delta":{let z=String(G.delta??"");if(!z)break;yield $.structuredOutput?{type:"output-delta",delta:z}:{type:"text-delta",delta:z};break}case"response.reasoning_summary_text.delta":case"response.reasoning_text.delta":{let z=String(G.delta??"");if(!z)break;yield{type:"reasoning-delta",delta:z,id:G.item_id};break}case"response.output_item.added":{let z=G.item;if(!z)break;if(z.type==="function_call"){let F=String(z.id??G.item_id??z.call_id??"");Q.set(F,{callId:String(z.call_id??F),name:String(z.name??""),namespace:typeof z.namespace==="string"&&z.namespace?z.namespace:void 0,done:!1})}break}case"response.function_call_arguments.delta":{let z=Q.get(String(G.item_id??""));if(!z)break;let F=String(G.delta??"");if(!F)break;yield{type:"tool-call-delta",toolCallId:z.callId,name:z.name,argsDelta:F,...z.namespace?{namespace:z.namespace}:{}};break}case"response.function_call_arguments.done":{let z=String(G.item_id??""),F=Q.get(z);if(!F)break;F.done=!0,yield{type:"tool-call",toolCallId:F.callId,name:F.name,args:String(G.arguments??""),...F.namespace?{namespace:F.namespace}:{}};break}case"response.output_item.done":{let z=G.item;if(!z)break;if(z.type==="function_call"){let F=String(z.id??G.item_id??z.call_id??""),B=Q.get(F);if(B?.done)break;let P=(typeof z.namespace==="string"?z.namespace:"")||B?.namespace;if(yield{type:"tool-call",toolCallId:String(z.call_id??F),name:String(z.name??B?.name??""),args:String(z.arguments??""),...P?{namespace:P}:{}},B)B.done=!0;break}if(z.type==="tool_search_call"||z.type==="tool_search_output"){if(z.type==="tool_search_call"&&z.arguments!==void 0)W=z.arguments;let F=vZ(z);if(F.loaded.length===0&&F.namespaces.length===0)break;let B=String(z.tool_search_call_id??z.id??"");if(Z.has(B))break;Z.add(B);let P=W;W=void 0,yield{type:"tool-search",...F,...P!==void 0&&P!==null?{arguments:P}:{}}}break}case"response.refusal.done":{yield{type:"error",error:{code:"content_filtered",message:String(G.refusal??"The model refused to answer."),retryable:!1}};break}case"response.completed":{K=!0,yield Y("stop",R$(G.response?.usage));break}case"response.incomplete":{K=!0;let z=R$(G.response?.usage),F=G.response?.incomplete_details?.reason;if(F==="content_filter"){yield{type:"error",error:{code:"content_filtered",message:hZ(G.response?.content_filters),retryable:!1}},yield Y("error",z);break}yield Y(F==="max_output_tokens"?"length":"stop",z);break}case"response.failed":case"error":{K=!0;let z=G.response?.error??G.error??G;yield{type:"error",error:gZ(z)},yield Y("error",R$(G.response?.usage));break}}if(K)return}if(!K)yield{type:"error",error:{code:"provider_error",message:"The provider stream ended without a terminal event.",retryable:!0}},yield Y("error",f())}function vZ(J){let $=[],Q=[];return M9(J.results??J.tools??J.loaded??J.output,$,Q,0),{loaded:E$($),namespaces:E$(Q)}}function M9(J,$,Q,Z){if(!Array.isArray(J)||Z>4)return;for(let W of J){if(typeof W==="string"){$.push(W);continue}if(!W||typeof W!=="object")continue;let K=W,X=typeof K.name==="string"?K.name:typeof K.tool_name==="string"?K.tool_name:"",Y=K.tools??K.functions;if(Array.isArray(Y)){if(X)Q.push(X);M9(Y,$,Q,Z+1);continue}if(X)$.push(X)}}function E$(J){return J.filter(($,Q)=>J.indexOf($)===Q)}function hZ(J){if(!Array.isArray(J))return"The provider's content filter blocked this request.";let Q=[];for(let Z of J){if(!Z||typeof Z!=="object")continue;let W=Z,K=W.content_filter_results;if(!K||typeof K!=="object")continue;for(let[X,Y]of Object.entries(K))if(Y&&typeof Y==="object"&&Y.filtered===!0)Q.push(`${X} (${String(W.source_type??"unknown")})`)}return Q.length===0?"The provider's content filter blocked this request.":`The provider's content filter blocked this request. Categories: ${E$(Q).join(", ")}.`}function gZ(J){let $=typeof J?.message==="string"?J.message:"The provider stream failed.",Q=String(J?.code??"").toLowerCase();if(Q==="rate_limit_exceeded")return{code:"rate_limited",message:$,retryable:!0};if(Q==="context_length_exceeded")return{code:"context_length_exceeded",message:$,retryable:!1};if(Q.includes("content_filter"))return{code:"content_filtered",message:$,retryable:!1};return{code:"provider_error",message:$,retryable:!0}}function f(){return{inputTokens:0,outputTokens:0,totalTokens:0}}function R$(J){if(!J)return f();let $=Number(J.input_tokens??0),Q=Number(J.output_tokens??0),Z={inputTokens:$,outputTokens:Q,totalTokens:Number(J.total_tokens??$+Q)},W=J.output_tokens_details?.reasoning_tokens;if(typeof W==="number")Z.reasoningTokens=W;let K=J.input_tokens_details?.cached_tokens;if(typeof K==="number")Z.cachedInputTokens=K;return Z}async function*S9(J){if(!J)return;let $=J.getReader(),Q=new TextDecoder;try{while(!0){let{done:W,value:K}=await $.read();if(W)break;if(K)yield Q.decode(K,{stream:!0})}let Z=Q.decode();if(Z)yield Z}finally{$.releaseLock()}}function j$(J){return{responsesUrl:`${J.base}/responses${J.query}`,filesUrl:`${J.base}/files${J.query}`,headers:J.headers,timeoutMs:J.timeoutMs,streamIdleTimeoutMs:J.streamIdleTimeoutMs,streamMaxDurationMs:J.streamMaxDurationMs,maxToolArgumentChars:J.maxToolArgumentChars,maxRetries:J.maxRetries}}async function*k$(J,$,Q){let Z=$,W=new Set,K=0,X=Math.max(0,J.maxRetries),Y=J.random??Math.random,V,G=(B)=>{if(!V)return B;let P=k(k(f(),V),B.usage);return V=void 0,{...B,usage:P}},H=()=>G({type:"finish",reason:"aborted",usage:f()}),D=J.streamIdleTimeoutMs??0,z=J.streamMaxDurationMs??0,F=J.maxToolArgumentChars??0;for(let B=0;;B++){let P=new AbortController,N=Q.signal?AbortSignal.any([Q.signal,P.signal]):P.signal,U;while(U===void 0)try{U=await l(J.responsesUrl,{method:"POST",headers:{...await J.headers(),"content-type":"application/json"},body:JSON.stringify(Z)},{maxRetries:J.maxRetries,timeoutMs:J.timeoutMs,signal:N,fetchImpl:J.fetchImpl,sleep:J.sleep,random:J.random})}catch(M){let O=K<L9?C9(Z,M,Q.files).filter((_)=>!W.has(_)):[];if(O.length>0){K++;let _=x(M).message;for(let j of O)W.add(j),yield{type:"file-rejected",fileId:j,message:_,...t(M)};Z=O9(Z,new Set(O),Q.files);continue}let I=x(M);if(I.code==="aborted"){yield H();return}yield{type:"error",error:I,...t(M)},yield G({type:"finish",reason:"error",usage:f()});return}let L=[],C=!1,w,R=new Map;try{let M=z9(U.body,{idleMs:D,maxMs:z},{idle:()=>{let O=new A9(D);return P.abort(O),O},max:()=>{let O=new R9(z);return P.abort(O),O}});for await(let O of _9(S9(M),{structuredOutput:Q.structuredOutput})){if(O.type==="tool-call-delta"){let I=(R.get(O.toolCallId)??0)+O.argsDelta.length;if(R.set(O.toolCallId,I),F>0&&I>F){let _=new E9(F,O.name);throw P.abort(_),_}yield O;continue}if(O.type==="tool-call")R.delete(O.toolCallId);if(C){yield O.type==="finish"?G(O):O;continue}if(yJ(O)){C=!0,yield*L.splice(0),yield O;continue}if(O.type==="error")w=O.error;L.push(O)}}catch(M){let O=x(M);if(O.code==="aborted"||Q.signal?.aborted){yield H();return}if(C){yield{type:"error",error:O},yield G({type:"finish",reason:"error",usage:f()});return}w=O,L.push({type:"error",error:O},{type:"finish",reason:"error",usage:f()})}if(C)return;if(w?.retryable&&B<X&&!Q.signal?.aborted){for(let M of L)if(M.type==="finish")V=k(V??f(),M.usage);if(R.size>0)yield{type:"tool-call-discard",toolCallIds:[...R.keys()]};try{await B$(qJ(B,Y),Q.signal,J.sleep)}catch{yield H();return}continue}for(let M of L)yield M.type==="finish"?G(M):M;return}}async function T$(J,$,Q="user_data"){let Z=new FormData;Z.set("purpose",Q),Z.set("file",$);let K=await(await l(J.filesUrl,{method:"POST",headers:await J.headers(),body:Z},{maxRetries:J.maxRetries,timeoutMs:J.timeoutMs,fetchImpl:J.fetchImpl})).json();if(!K?.id)throw Error("The provider accepted the upload but returned no file id.");return K.id}function x$(J){let $=uZ(J);if($.startsWith("gpt-3.5")||$.startsWith("text-")||$.startsWith("davinci"))return{reasoning:!1,structuredOutput:!1,fileInput:!1,parallelToolCalls:!0,toolSearch:!1};let Q=cZ($);if(Q?.kind==="o")return{reasoning:!0,structuredOutput:!0,fileInput:!0,parallelToolCalls:Q.major>1,toolSearch:j9(Q)};if(Q?.kind==="gpt")return{reasoning:Q.major>=5,structuredOutput:Q.major>4||$.startsWith("gpt-4o")||$.startsWith("gpt-4.1"),fileInput:Q.major>4||$.startsWith("gpt-4o")||$.startsWith("gpt-4.1"),parallelToolCalls:!0,toolSearch:j9(Q)};return{reasoning:!0,structuredOutput:!0,fileInput:!0,parallelToolCalls:!0,toolSearch:!0}}function j9(J){if(J.kind==="o")return J.major>=5;return J.major>5||J.major===5&&J.minor>=2}function uZ(J){return J.trim().toLowerCase()}function cZ(J){let $=/^gpt-(\d+)(?:\.(\d+))?/.exec(J);if($?.[1])return{kind:"gpt",major:Number($[1]),minor:Number($[2]??0)};let Q=/^o(\d+)(?:[-.]|$)/.exec(J);if(Q?.[1])return{kind:"o",major:Number(Q[1]),minor:0};return null}var mZ={"response.audio_transcript.delta":"response.output_audio_transcript.delta","response.audio_transcript.done":"response.output_audio_transcript.done","response.text.delta":"response.output_text.delta","response.text.done":"response.output_text.done","response.audio.delta":"response.output_audio.delta","response.audio.done":"response.output_audio.done"};function pZ(J){if(typeof J!=="string")return;let $;try{$=JSON.parse(J)}catch{return}if(!$||typeof $!=="object"||typeof $.type!=="string")return;let Q=mZ[$.type];if(Q)$.type=Q;if($.type==="response.done"&&$.response?.usage)$.usage=vJ($.response.usage);if($.type==="conversation.item.input_audio_transcription.completed"&&$.usage)if($.usage.type==="duration"){let Z=Number($.usage.seconds);if(Number.isFinite(Z))$.transcriptionSeconds=Z}else $.transcriptionUsage=vJ($.usage);return $}var k9=1,lZ=500;function dZ(J,$){let Q=globalThis.WebSocket;if(!Q)throw Error("No global WebSocket: the realtime sideband needs Bun or Node 22+.");return new Q(J,{headers:$.headers})}class hJ{callId;ready;closed;init;socket;finalEvent;outbox=[];subscribers=new Set;listeners=new Set;backlog=[];closing=!1;finished=!1;everOpened=!1;failures=0;resolveReady;rejectReady;resolveClosed;constructor(J){this.init=J,this.callId=J.callId,this.ready=new Promise(($,Q)=>{this.resolveReady=$,this.rejectReady=Q}),this.ready.catch(()=>{}),this.closed=new Promise(($)=>this.resolveClosed=$),this.open()}send(J){if(this.finished||this.closing)return;let $=JSON.stringify(J);if(this.socket?.readyState===k9)this.socket.send($);else this.outbox.push($)}updateSession(J){this.send({type:"session.update",session:gJ(J)})}addItem(J){this.send({type:"conversation.item.create",item:J})}addNote(J){this.addItem({type:"message",role:"system",content:[{type:"input_text",text:J}]})}functionOutput(J,$){this.addItem({type:"function_call_output",call_id:J,output:typeof $==="string"?$:JSON.stringify($)})}createResponse(J={}){let $={};if(J.instructions!==void 0)$.instructions=J.instructions;if(J.toolChoice!==void 0)$.tool_choice=typeof J.toolChoice==="string"?J.toolChoice:{type:"function",name:J.toolChoice.name};if(J.outputModalities)$.output_modalities=J.outputModalities;if(J.conversation)$.conversation=J.conversation;if(J.metadata)$.metadata=J.metadata;Object.assign($,J.vendor),this.send(Object.keys($).length?{type:"response.create",response:$}:{type:"response.create"})}cancelResponse(J){this.send(J?{type:"response.cancel",response_id:J}:{type:"response.cancel"})}on(J){return this.listeners.add(J),()=>this.listeners.delete(J)}[Symbol.asyncIterator](){let J={queue:this.backlog??[],done:this.finished};return this.backlog=void 0,this.subscribers.add(J),{next:async()=>{for(;;){let Q=J.queue.shift();if(Q)return{value:Q,done:!1};if(J.done)return this.subscribers.delete(J),{value:void 0,done:!0};await new Promise((Z)=>J.wake=Z),J.wake=void 0}},return:async()=>{return J.done=!0,J.queue.length=0,this.subscribers.delete(J),{value:void 0,done:!0}}}}close(J=1000,$="closed"){if(this.finished||this.closing)return;if(this.closing=!0,this.socket&&this.socket.readyState<=k9)this.socket.close(J,$);else this.finish(J,$,!0)}async hangup(){try{await this.init.hangup()}catch(J){if(this.finalEvent&&!this.finalEvent.byClient&&this.finalEvent.code===1000)return;throw J}this.close(1000,"hangup")}async open(){let J;try{let Q=await this.init.headers();if(this.closing)return this.finish(1000,"closed",!0);J=(this.init.webSocket??dZ)(this.init.url,{headers:Q})}catch(Q){return this.dropped(1006,Q instanceof Error?Q.message:String(Q),!1)}this.socket=J;let $=!1;J.addEventListener("open",()=>{$=!0;let Q=this.everOpened;this.everOpened=!0;let Z=this.failures;this.failures=0;for(let W of this.outbox.splice(0))J.send(W);if(this.resolveReady(),Q)this.emit({type:"sideband.reconnected",attempt:Z})}),J.addEventListener("message",(Q)=>{let Z=pZ(Q.data);if(Z)this.emit(Z)}),J.addEventListener("close",(Q)=>{if(this.socket!==J)return;this.dropped(Q.code??1006,Q.reason??"",$)}),J.addEventListener("error",()=>{})}dropped(J,$,Q){if(this.socket=void 0,this.closing)return this.finish(J,$,!0);let Z=this.init.reconnect?.attempts??3;if(!((J!==1000||!Q)&&this.failures<Z))return this.finish(J,$,!1);this.failures+=1;let K=(this.init.reconnect?.delayMs??500)*2**(this.failures-1);setTimeout(()=>void this.open(),K)}finish(J,$,Q){if(this.finished)return;this.finished=!0,this.outbox.length=0;let Z={type:"sideband.closed",code:J,reason:$,byClient:Q};this.finalEvent=Z,this.emit(Z);for(let W of this.subscribers)W.done=!0,W.wake?.();if(!this.everOpened)this.rejectReady(Error(`Realtime sideband did not open (${J} ${$}).`));this.resolveClosed(Z)}emit(J){if(this.backlog){if(this.backlog.push(J),this.backlog.length>lZ)this.backlog.shift()}for(let $ of this.subscribers){if($.done)continue;$.queue.push(J),$.wake?.()}for(let $ of this.listeners)try{$(J)}catch{}}}var w$=30000,T9=10,x9=7200,iZ=600,I9="gpt-live-transcribe";function nZ(J){return J.type==="transcription"}function oZ(J){if(J.language!==void 0&&J.languages!==void 0)throw TypeError("A transcription session takes `languages` or `language`, not both (gpt-live-transcribe reads `languages`).");for(let W of J.keywords??[])if(/[<>\r\n]/.test(W))throw TypeError(`Transcription keywords must be one line without "<" or ">", got ${JSON.stringify(W)}.`);let $={model:J.model??I9};if(J.prompt!==void 0)$.prompt=J.prompt;if(J.keywords?.length)$.keywords=J.keywords;if(J.languages?.length)$.languages=J.languages;if(J.language!==void 0)$.language=J.language;if(J.delay!==void 0)$.delay=J.delay;let Q={transcription:$,turn_detection:J.turnDetection?q9(J.turnDetection):null};if(J.noiseReduction!==void 0)Q.noise_reduction=J.noiseReduction&&{type:J.noiseReduction};let Z={type:"transcription",audio:{input:Q}};if(J.logprobs)Z.include=["item.input_audio_transcription.logprobs"];return{...Z,...J.vendor}}function sZ(J){if(!J)return{type:"object",properties:{}};return w9(J)?J.toJSONSchema():J}function gJ(J,$){if(nZ(J))return oZ(J);let Q={type:"realtime"},Z=J.model??$;if(Z)Q.model=Z;if(J.instructions!==void 0)Q.instructions=J.instructions;if(J.outputModalities)Q.output_modalities=J.outputModalities;if(J.maxOutputTokens!==void 0)Q.max_output_tokens=J.maxOutputTokens;if(J.truncation!==void 0)Q.truncation=J.truncation;if(J.tools)Q.tools=J.tools.map((X)=>({type:"function",name:X.name,...X.description?{description:X.description}:{},parameters:sZ(X.parameters)}));if(J.toolChoice!==void 0)Q.tool_choice=typeof J.toolChoice==="string"?J.toolChoice:{type:"function",name:J.toolChoice.name};let W={};if(J.turnDetection!==void 0)W.turn_detection=J.turnDetection&&q9(J.turnDetection);if(J.transcription!==void 0)W.transcription=J.transcription;if(J.noiseReduction!==void 0)W.noise_reduction=J.noiseReduction&&{type:J.noiseReduction};let K={};if(J.voice!==void 0)K.voice=J.voice;if(J.speed!==void 0)K.speed=J.speed;if(Object.keys(W).length||Object.keys(K).length)Q.audio={...Object.keys(W).length?{input:W}:{},...Object.keys(K).length?{output:K}:{}};return{...Q,...J.vendor}}function q9(J){let $={type:J.type};if(J.createResponse!==void 0)$.create_response=J.createResponse;if(J.interruptResponse!==void 0)$.interrupt_response=J.interruptResponse;if(J.type==="semantic_vad"){if(J.eagerness!==void 0)$.eagerness=J.eagerness}else{if(J.threshold!==void 0)$.threshold=J.threshold;if(J.prefixPaddingMs!==void 0)$.prefix_padding_ms=J.prefixPaddingMs;if(J.silenceDurationMs!==void 0)$.silence_duration_ms=J.silenceDurationMs;if(J.idleTimeoutMs!==void 0)$.idle_timeout_ms=J.idleTimeoutMs}return $}function vJ(J){let $=Number(J?.input_tokens??0),Q=Number(J?.output_tokens??0),Z={inputTokens:$,outputTokens:Q,totalTokens:Number(J?.total_tokens??$+Q)},W=J?.input_token_details??J?.input_tokens_details,K=J?.output_token_details??J?.output_tokens_details;if(typeof W?.cached_tokens==="number")Z.cachedInputTokens=W.cached_tokens;if(typeof W?.audio_tokens==="number")Z.audioInputTokens=W.audio_tokens;let X=W?.cached_tokens_details?.audio_tokens;if(typeof X==="number")Z.cachedAudioInputTokens=X;if(typeof W?.image_tokens==="number"&&W.image_tokens>0)Z.imageInputTokens=W.image_tokens;if(typeof K?.audio_tokens==="number")Z.audioOutputTokens=K.audio_tokens;return Z}class v extends Error{code;retryable;status;constructor(J,$={}){super(J.message,{cause:$.cause});if(this.name="RealtimeRequestError",this.code=J.code,this.retryable=J.retryable,$.status!==void 0)this.status=$.status}}var aZ=60;class DJ{model;target;options;constructor(J,$){this.target=J,this.options=$,this.model=$.model}url(J){return`${this.target.base}/realtime${J}${this.target.query}`}sidebandUrl(J){let $=this.target.base.replace(/^http(s?):/i,(Z,W)=>`ws${W}:`),Q=this.target.query?`${this.target.query}&`:"?";return`${$}/realtime${Q}call_id=${encodeURIComponent(J)}`}async createCall(J){let $=J.flow??this.options.callFlow??"unified",Q,Z;if($==="ephemeral")Q={authorization:`Bearer ${(await this.clientSecret({session:J.session,ttlSeconds:aZ,signal:J.signal})).value}`,"content-type":"application/sdp"},Z=J.sdp;else{let V=new FormData;V.set("sdp",J.sdp),V.set("session",JSON.stringify(gJ(J.session??{},this.model))),Q=await this.target.headers(),Z=V}if(J.safetyIdentifier)Q["OpenAI-Safety-Identifier"]=J.safetyIdentifier;let W=this.url("/calls"),K=await this.request(J.webrtcFilter?`${W}${W.includes("?")?"&":"?"}webrtcfilter=on`:W,{method:"POST",headers:Q,body:Z},J.signal),X=await K.text(),Y=tZ(K);if(!Y)throw new v({code:"provider_error",message:"The provider started a realtime call but did not say which one (no Location).",retryable:!1});return{sdpAnswer:X,callId:Y}}async clientSecret(J={}){let $=J.ttlSeconds??iZ;if(!Number.isInteger($)||$<T9||$>x9)throw RangeError(`ttlSeconds must be a whole number from ${T9} to ${x9}, got ${$}.`);let Q={...await this.target.headers(),"content-type":"application/json"};if(J.safetyIdentifier)Q["OpenAI-Safety-Identifier"]=J.safetyIdentifier;let W=await(await this.request(this.url("/client_secrets"),{method:"POST",headers:Q,body:JSON.stringify({expires_after:{anchor:"created_at",seconds:$},session:gJ(J.session??{},this.model)})},J.signal)).json();if(typeof W?.value!=="string")throw new v({code:"provider_error",message:"The provider answered a client secret request with no secret.",retryable:!1});return{value:W.value,expiresAt:Number(W.expires_at??0),session:W.session,callsUrl:this.url("/calls")}}async hangup(J,$={}){try{await this.request(this.url(`/calls/${encodeURIComponent(J)}/hangup`),{method:"POST",headers:await this.target.headers()},$.signal)}catch(Q){if(b9(Q,J))return;throw Q}}sideband(J,$={}){return new hJ({...$,callId:J,url:this.sidebandUrl(J),headers:this.target.headers,webSocket:$.webSocket??this.options.webSocket,hangup:()=>this.hangup(J)})}async request(J,$,Q){try{return await l(J,$,{maxRetries:this.target.maxRetries,timeoutMs:this.target.timeoutMs,retryTimeouts:!1,signal:Q,fetchImpl:this.options.fetchImpl})}catch(Z){if(Q?.aborted)throw Z;throw new v(x(Z),{cause:Z,...Z instanceof b?{status:Z.status}:{}})}}}function b9(J,$){if(!(J instanceof v)||J.status!==404)return!1;let Q=J.cause instanceof b?J.cause.body:void 0,Z=Q?.error??Q,W=String(Z?.code??"").toLowerCase(),K=String(Z?.message??"").toLowerCase();if(W.includes("call"))return!0;if(K.includes($.toLowerCase()))return!0;return/\bcall\b/.test(K)&&/not (be )?found|does not exist|no longer|ended/.test(K)}function tZ(J){let $=J.headers.get("location");if(!$)return;let Q=$.split("?")[0].replace(/\/+$/,""),Z=Q.slice(Q.lastIndexOf("/")+1);return Z?decodeURIComponent(Z):void 0}function q$(J,$){let{capabilities:Q}=$,Z={model:$.model,input:rZ(J.messages,Q,J.tools),stream:!0};if(J.systemPrompt)Z.instructions=J.systemPrompt;let W=Y0(J.tools,Q);if(W.length>0){if(Z.tools=W,!Q.parallelToolCalls)Z.parallel_tool_calls=!1}if(J.output)Z.text={format:{type:"json_schema",name:J.output.name,schema:J.output.schema,strict:J.output.strict}};if(J.reasoning&&Q.reasoning)Z.reasoning=J.reasoning==="none"?{effort:"none"}:{effort:J.reasoning,summary:"auto"};if(typeof J.temperature==="number")Z.temperature=J.temperature;if(typeof J.maxOutputTokens==="number")Z.max_output_tokens=J.maxOutputTokens;return Z}function rZ(J,$,Q){let Z=[],W=new Map;if($.toolSearch){for(let K of Q??[])if(uJ(K))W.set(K.name,K)}for(let K of J){let X=K.role,Y=[],V=()=>{if(Y.length===0)return;Z.push({type:"message",role:X,content:Y}),Y=[]};for(let G of K.content??[])switch(G.type){case"text":{if(!G.text)break;Y.push(r(X,G.text));break}case"output":{if(G.partial)break;Y.push(r(X,JSON.stringify(G.value)));break}case"file":{if(X==="assistant")break;let H=$0(G);if(!$.fileInput){if(H)Y.push(r(X,I$(G,!1)));break}if(G.fileId?.startsWith(d))throw Error(`FilePart.fileId holds a gemi attachment id (${G.fileId}). That field is the *provider's* file id, from \`fileId\` on the upload response; the \`attachmentId\` goes in \`FilePart.attachmentId\`, is shown to the model as text, and is resolved by a tool through \`ctx.attachments\`.`);if(!G.fileId&&!H)throw Error("FilePart.fileId is empty and there is no `attachmentId` either. `fileId` is the *provider's* file id and `attachmentId` is gemi's (`gemi_att_\u2026`), both from the upload response; an upload always answers at least one, so a part with neither was built from something other than that answer.");if(G.providerRejected){if(H)Y.push(r(X,I$(G,!1)));Y.push(r(X,S$(G.name)));break}if(H)Y.push(r(X,I$(G,!!G.fileId)));if(G.fileId)Y.push(Q0(G));break}case"reasoning":{V();let H=K0(G);if(H)Z.push(H);break}case"tool-call":{if(G.partial)break;if(V(),$.toolSearch&&Array.isArray(G.toolSearches))for(let D of G.toolSearches)Z.push(...G0(D,Q??[]));let H={type:"function_call",call_id:G.toolCallId,name:String(G.name),arguments:JSON.stringify(G.input??{})};if(G.namespace&&W.has(G.namespace))H.namespace=G.namespace;Z.push(H);break}case"tool-result":{V(),Z.push({type:"function_call_output",call_id:G.toolCallId,output:X0(G)});break}}V()}return J0(Z)}var eZ="No result was recorded for this tool call. Assume it did not complete.";function J0(J){let $=new Set,Q=new Set,Z=[];for(let K of J){if(K.type==="function_call"){let X=String(K.call_id);if($.has(X))continue;$.add(X)}else if(K.type==="function_call_output"){let X=String(K.call_id);if(!$.has(X)||Q.has(X))continue;Q.add(X)}Z.push(K)}if(Q.size===$.size)return Z;let W=[];for(let K of Z){if(W.push(K),K.type!=="function_call")continue;let X=String(K.call_id);if(Q.has(X))continue;Q.add(X),W.push({type:"function_call_output",call_id:X,output:eZ})}return W}function r(J,$){return{type:J==="assistant"?"output_text":"input_text",text:$}}function $0(J){let $=J.attachmentId;return typeof $==="string"&&$.startsWith(d)?$:void 0}function I$(J,$){let Q=[`id=${JSON.stringify(J.attachmentId)}`];if(J.name)Q.push(`name=${JSON.stringify(J.name)}`);if(J.mimeType)Q.push(`mimeType=${JSON.stringify(J.mimeType)}`);let Z=`attachment ${Q.join(" ")}`;return $?`[${Z}]`:`[${Z} \u2014 its contents are not shown to you; a tool can read the file by this id]`}function Q0(J){let $=J.mimeType?.trim().toLowerCase()??"";return{type:($?$.startsWith("image/")&&$!=="image/svg+xml":Z0(J.name))?"input_image":"input_file",file_id:J.fileId}}function Z0(J){let $=/\.([a-z0-9]+)$/.exec(J?.trim().toLowerCase()??"");return $?.[1]!==void 0&&W0.has($[1])}var W0=new Set(["jpeg","jpg","png","gif","webp"]);function K0(J){if(!J.id)return null;let $={type:"reasoning",id:J.id};return $.summary=J.text?[{type:"summary_text",text:J.text}]:[],$}function X0(J){if(J.status==="ok"){let $=J.modelOutput!==void 0?J.modelOutput:J.output;return typeof $==="string"?$:JSON.stringify($??null)}if(J.status==="running"){let $=J.job?.summary===void 0?"":` Started with: ${JSON.stringify(J.job.summary)}.`;return`Started background job ${J.job?.id??"(unknown)"}. It is still running, so there is no result yet: this message will be replaced by the result when it finishes. Do not start it again.${$}`}if(J.status==="denied"){let $=J.reason?` Reason given: ${J.reason}`:"";if(J.cause==="stopped")return`The run was stopped before this tool call could complete, so it did not run.${$}`;if(J.cause==="interrupted")return`The run was interrupted (the server stopped) while this tool call was in progress, so its result was lost. It may have run in part or in full: check its effects before repeating it.${$}`;return`The user declined this tool call, so it did not run.${$}`}return`The tool call failed and produced no result. Error (${J.error?.code??"unknown"}): ${J.error?.message??"no message"}`}function G0(J,$){let Q=new Set(f9(J?.loaded)),Z=f9(J?.namespaces),W=new Set(Z),K=[];for(let Y of $)if(uJ(Y)){if(!W.has(Y.name))continue;let V=Y.tools.filter((G)=>Q.size===0||Q.has(G.name));if(V.length===0)continue;K.push({type:"namespace",name:Y.name,description:Y.description,tools:V.map((G)=>e(G,!0))})}else if(Y.deferred&&Q.has(Y.name))K.push(e(Y,!0));if(K.length===0)return[];return[{type:"tool_search_call",call_id:null,execution:"server",status:"completed",arguments:J.arguments&&typeof J.arguments==="object"?J.arguments:{paths:Z.length>0?Z:[...Q]}},{type:"tool_search_output",call_id:null,execution:"server",status:"completed",tools:K}]}function f9(J){return Array.isArray(J)?J.filter(($)=>typeof $==="string"):[]}function uJ(J){return Array.isArray(J.tools)}function Y0(J,$){if(!J||J.length===0)return[];if(!$.toolSearch){let W=[];for(let K of J)if(uJ(K))for(let X of K.tools)W.push(e(X,!1));else W.push(e(K,!1));return W}let Q=[],Z=!1;for(let W of J)if(uJ(W)){let K=W.tools.map((X)=>{if(X.deferred)Z=!0;return e(X,!0)});Q.push({type:"namespace",name:W.name,description:W.description,tools:K})}else{if(W.deferred)Z=!0;Q.push(e(W,!0))}if(Z)Q.push({type:"tool_search"});return Q}function e(J,$){let Q={type:"function",name:J.name,description:J.description,parameters:J.parameters,strict:J.strict};if($&&J.deferred)Q.defer_loading=!0;return Q}class JJ{static models(){return[]}normalizeError(J){return x(J)}}var y9=["gpt-5.5","gpt-5.4","gpt-5.4-mini","gpt-5.4-nano","gpt-5.2","gpt-5.1","gpt-5","gpt-5-mini","gpt-5-nano","gpt-4.1","gpt-4.1-mini","gpt-4.1-nano","gpt-4o","gpt-4o-mini","o4-mini","o3","o3-mini"];class b$ extends JJ{model;capabilities;config;constructor(J,$={}){super();this.model=J,this.capabilities=x$(J),this.config=$}static model(J,$){return new b$(J,$)}static models(){return y9}stream(J){let $=q$(J,{model:this.model,capabilities:this.capabilities});return k$(this.endpoint(),$,{signal:J.signal,structuredOutput:Boolean(J.output),files:M$(J.messages)})}upload(J){return T$(this.endpoint(),J)}endpoint(){return j$(HJ(this.config))}get realtime(){return new DJ(HJ(this.config,{timeoutMs:w$}),{model:this.model})}}class f$ extends JJ{model;capabilities;config;constructor(J,$={}){super();this.model=J,this.capabilities=x$(J),this.config=$}static model(J,$){return new f$(J,$)}static models(){return y9}stream(J){let $=q$(J,{model:this.deployment(),capabilities:this.capabilities});return k$(this.endpoint(),$,{signal:J.signal,structuredOutput:Boolean(J.output),files:M$(J.messages)})}upload(J){return T$(this.endpoint(),J,"assistants")}deployment(){return this.config.deployment??this.model}endpoint(){return j$(zJ(this.config))}get realtime(){return new DJ(X9(this.config,{timeoutMs:w$}),{model:this.deployment(),callFlow:"ephemeral"})}}class cJ{now;entries=new Map;constructor(J=Date.now){this.now=J}allow(J,$){let Q=this.entries.get(J);if(Q?.openUntil===void 0)return!0;let Z=this.now();if(Z<Q.openUntil)return!1;if(Q.probeUntil!==void 0&&Z<Q.probeUntil)return!1;return Q.probeUntil=Z+$.cooldownMs,!0}record(J,$,Q){let Z=this.entries.get(J)??{failures:0},W=Z.openUntil!==void 0;if($==="success")return this.entries.delete(J),W?"closed":void 0;if($==="none"){delete Z.probeUntil;return}if(Z.failures+=1,this.entries.set(J,Z),W||Z.failures>=Q.failures)return Z.openUntil=this.now()+Q.cooldownMs,delete Z.probeUntil,W?void 0:"open";return}state(J){let $=this.entries.get(J);if($?.openUntil===void 0)return"closed";return this.now()<$.openUntil?"open":"half-open"}}var v9=Symbol("timed-out");class FJ extends JJ{model;capabilities;entries;options;circuit;constructor(J,$={}){super();if(J.length===0)throw Error("FallbackProvider needs at least one provider.");for(let Z of J)if(Z.timeoutMs!==void 0&&!(Z.timeoutMs>0))throw Error(`FallbackProvider: timeoutMs for ${Z.provider.model} must be a positive number, got ${Z.timeoutMs}.`);this.entries=[...J];let Q=$.circuit;if(Q){let Z=Q.failures??3,W=Q.cooldownMs??30000;if(!Number.isInteger(Z)||Z<1)throw Error(`FallbackProvider: circuit.failures must be a positive integer, got ${Z}.`);if(!(W>0))throw Error(`FallbackProvider: circuit.cooldownMs must be a positive number, got ${W}.`);let K=new Set;for(let Y of J){let V=y$(Y);if(K.has(V))throw Error(`FallbackProvider: two legs share the circuit key "${V}". Give one of them a \`circuitKey\`.`);K.add(V)}let X=Q.store??new cJ;this.options={...$,circuit:{...Q,store:X}},this.circuit={policy:{failures:Z,cooldownMs:W},store:X,...Q.onStateChange?{onStateChange:Q.onStateChange}:{}}}else this.options=$,this.circuit=void 0;this.model=J[0].provider.model,this.capabilities=V0(J.map((Z)=>Z.provider.capabilities))}static chain(J,$){return new FJ(J,$)}from(J){if(!Number.isInteger(J)||J<0||J>=this.entries.length)throw RangeError(`FallbackProvider.from(${J}): the chain has ${this.entries.length} entries.`);return new FJ(this.entries.slice(J),this.options)}leg(J){let $=this.from(J).entries[0];return new FJ([$],this.options)}upload(J){return this.entries[0].provider.upload(J)}normalizeError(J){return this.entries[0].provider.normalizeError(J)}stream(J){return this.run(J)}async*run(J){let $,Q=J.signal,Z=0;for(let W=0;W<this.entries.length;W++){let K=this.entries[W],X=W===this.entries.length-1,Y=K.provider.model;if(this.circuit&&!X&&!await this.allow(K))continue;Z+=1;let V=!1,G=async(_)=>{if(V)return;V=!0,await this.record(W,K,_)},H=new AbortController,D=()=>H.abort(Q?.reason);if(Q?.aborted)H.abort(Q.reason);else Q?.addEventListener("abort",D,{once:!0});let z=[],F=!1,B=!1,P,N,U,L=!1,C,w=!1,R=(_)=>{let j=$?k(k(E(),$),_.usage):_.usage;return $=void 0,{..._,usage:j}};try{C=K.provider.stream({...J,...K.reasoning!==void 0?{reasoning:K.reasoning}:{},signal:H.signal})[Symbol.asyncIterator]();let _=!0;for(;;){let j=_&&K.timeoutMs!==void 0?await H0(C.next(),K.timeoutMs):await C.next();if(j===v9){L=!0,U={error:{code:"provider_error",message:`${Y} sent nothing within ${K.timeoutMs}ms.`,retryable:!0}};break}if(_=!1,j.done){w=!0;break}let S=j.value;if(S.type==="finish"&&S.model)N=S.model;if(F){if(S.type==="finish")P=k(P??E(),S.usage),B=!0,yield R(S);else{if(S.type==="error")U={error:S.error};yield S}continue}if(yJ(S)){F=!0,await G("success"),yield*z.splice(0),yield S;continue}if(S.type==="error")U={error:S.error,...S.status!==void 0?{status:S.status}:{},...S.requestId!==void 0?{requestId:S.requestId}:{}};else if(S.type==="finish"){if(P=k(P??E(),S.usage),S.reason==="error"&&!U)U={error:{code:"provider_error",message:`${Y} ended the call with an error and did not say which.`,retryable:!1}}}z.push(S)}}catch(_){let j=K.provider.normalizeError(_);if(F){if(j.code!=="aborted")yield{type:"error",error:j,...t(_)};this.report({index:W,model:Y,responseModel:N,attempt:Z,usage:P,outcome:v$(j),error:j}),yield R({type:"finish",reason:j.code==="aborted"?"aborted":"error",usage:E(),...N?{model:N}:{}});return}U={error:j,...t(_)}}finally{if(Q?.removeEventListener("abort",D),!w)H.abort(),C?.return?.()?.catch(()=>{})}if(F){if(!B&&$)yield{type:"finish",reason:U?"error":"stop",usage:$},$=void 0;this.report({index:W,model:Y,responseModel:N,attempt:Z,usage:P,outcome:U?v$(U.error):"ok",...U?{error:U.error}:{}});return}if(Q?.aborted){await G("none"),this.report({index:W,model:Y,responseModel:N,attempt:Z,usage:P,outcome:"aborted"}),yield R({type:"finish",reason:"aborted",usage:P??E(),...N?{model:N}:{}});return}if(!U){await G("success"),this.report({index:W,model:Y,responseModel:N,attempt:Z,usage:P,outcome:"ok"});for(let _ of z)yield _.type==="finish"?R(_):_;return}let M=!X&&U.error.code!=="aborted"&&this.shouldFallBack(U.error,{index:W,model:Y,timedOut:L,...U.status!==void 0?{status:U.status}:{},...U.requestId!==void 0?{requestId:U.requestId}:{}});if(await G(M?"failure":"none"),this.report({index:W,model:Y,responseModel:N,attempt:Z,usage:P,outcome:M?"fallback":v$(U.error),error:U.error}),M){if(P)$=k($??E(),P);continue}let O=!1,I;for(let _ of z){if(_.type==="finish"){I=_;continue}if(_.type==="error")O=!0;yield _}if(!O&&U.error.code!=="aborted")yield{type:"error",error:U.error,...U.status!==void 0?{status:U.status}:{},...U.requestId!==void 0?{requestId:U.requestId}:{}};yield R({type:"finish",reason:U.error.code==="aborted"?"aborted":I?.reason??"error",usage:P??E(),...N?{model:N}:{}});return}}async allow(J){if(!this.circuit)return!0;try{return await this.circuit.store.allow(y$(J),this.circuit.policy)}catch{return!0}}async record(J,$,Q){if(!this.circuit)return;let Z=y$($),W;try{W=await this.circuit.store.record(Z,Q,this.circuit.policy)}catch{return}if(!W)return;try{this.circuit.onStateChange?.({index:J,model:$.provider.model,key:Z,state:W})}catch{}}shouldFallBack(J,$){let Q=this.options.fallbackOn??((Z)=>Z.retryable);try{return Q(J,$)}catch{return!1}}report(J){if(J.usage===void 0)delete J.usage;if(J.responseModel===void 0)delete J.responseModel;try{this.options.onUsage?.(J)}catch{}}}function y$(J){return J.circuitKey??J.provider.model}function v$(J){return J.code==="aborted"?"aborted":"failed"}function V0(J){return{reasoning:J.every(($)=>$.reasoning),structuredOutput:J.every(($)=>$.structuredOutput),fileInput:J.every(($)=>$.fileInput),parallelToolCalls:J.every(($)=>$.parallelToolCalls),toolSearch:J.every(($)=>$.toolSearch)}}function H0(J,$){let Q,Z=new Promise((W)=>{Q=setTimeout(()=>W(v9),$)});return Promise.race([J,Z]).finally(()=>clearTimeout(Q))}async function z0(J,$,Q={}){let Z=Q.samples??1;if(!Number.isInteger(Z)||Z<1)throw RangeError(`evalChain: samples must be a positive integer, got ${Z}.`);let W=[];for(let K=0;K<J.entries.length;K++){let X=J.leg(K),Y={index:K,model:X.model,results:[],errors:[]};for(let V=0;V<Z;V++)try{Y.results.push(await $(X,{index:K,sample:V}))}catch(G){Y.errors.push({sample:V,error:G})}W.push(Y)}return W}class pJ extends Error{line;constructor(J){super(J??"Voice session ended by the app.");this.name="VoiceHangup",this.line=J}}var UJ="ask_agent",D0={maxDurationMs:900000,idleTimeoutMs:120000,maxQueued:3,progressIntervalMs:4000,closingLineMs:1e4,tickMs:60000,hangupGraceMs:30000,toolTimeoutMs:60000,maxToolCallsPerMinute:20,toolOutputChars:8000},F0={maxDuration:"We've reached the time limit for this voice session. Tap the microphone to start again.",idle:"It's gone quiet, so I'll hang up. Tap the microphone when you want to talk again.",error:null};function PJ(J={}){return[{name:J.name??UJ,description:J.description??"Hand one self-contained request to the agent that does the work, in the user's own words with references resolved. It can take minutes; the result comes back when it is done, so tell the user you are on it.",parameters:{type:"object",properties:{request:{type:"string",description:"What the user wants done."}},required:["request"],additionalProperties:!1}},{name:"stop_work",description:"Stop the work that is running, and drop any requests waiting behind it.",parameters:{type:"object",properties:{},additionalProperties:!1}},{name:"work_status",description:"What the agent is doing right now, and what is waiting.",parameters:{type:"object",properties:{},additionalProperties:!1}},{name:"answer_question",description:"Answer the question the agent asked (it came back from a request with status needs_input). For an approval, set approve.",parameters:{type:"object",properties:{answer:{type:"string",description:"The user's answer, in their words."},approve:{type:"boolean",description:"For an approval: whether the user approved."}},required:["answer"],additionalProperties:!1}}]}var mJ=new Map;class i{sessionId;threadId;callId;ended;params;sideband;hangupCall;limits;lines;delegateName;startedAt=Date.now();body;usage=E();transcription={usage:E(),seconds:0};hooks=Promise.resolve();pendingCreate;transcript=[];requests=[];toolCalls=[];toolHandlers=new Map;toolsRunning=0;toolCallTimes=[];errors=[];running;queue=[];pending=[];lastProgress;lastNoteAt=0;noteTimer;responseActive=!1;responseWanted=!1;ending;timers=[];idleTimer;tickTimer;resolveEnded;closingWaiter;static start(J){return new i(J)}static get(J){return mJ.get(J)}static async endAll(J){await Promise.all([...mJ.values()].map(($)=>$.end("hangup",J)))}constructor(J){this.params=J,this.sessionId=J.sessionId??crypto.randomUUID(),this.threadId=J.threadId,this.body=J.body??{},this.limits={...D0,...h9(J.limits)},this.lines={...F0,...h9(J.lines)},this.delegateName=J.delegate?.name??UJ;let $=new Set(PJ(J.delegate).map((Q)=>Q.name));for(let Q of J.tools??[]){if($.has(Q.tool.name)||this.toolHandlers.has(Q.tool.name))throw Error(`VoiceBridge: two tools are named "${Q.tool.name}".`);this.toolHandlers.set(Q.tool.name,Q)}if("realtime"in J.call){let{realtime:Q,callId:Z}=J.call;this.callId=Z,this.sideband=Q.sideband(Z),this.hangupCall=()=>this.sideband.hangup()}else this.callId=J.call.callId??J.call.sideband.callId,this.sideband=J.call.sideband,this.hangupCall=()=>this.sideband.hangup();this.ended=new Promise((Q)=>this.resolveEnded=Q),mJ.set(this.sessionId,this),this.timers.push(setTimeout(()=>void this.end("max_duration",this.lines.maxDuration),this.limits.maxDurationMs)),this.tickTimer=setInterval(()=>void this.tick(),this.limits.tickMs),this.touch(),this.listen()}setBody(J){this.body=J;let $=this.params.contextNote?.(J);if($)this.sideband.addNote($)}end(J="hangup",$){return this.ending??=this.finish(J,$??null)}async listen(){for await(let J of this.sideband){try{this.params.onEvent?.(J)}catch{}this.closingWaiter?.(J),await this.handle(J)}}async handle(J){switch(J.type){case"input_audio_buffer.speech_started":this.touch();return;case"response.created":this.responseActive=!0,this.pendingCreate=void 0,this.touch();return;case"response.done":{if(this.responseActive=!1,this.responseWanted&&!this.ending)this.responseWanted=!1,this.createResponse();let $=J.usage;if($){this.usage=k(this.usage,$);let Q=this.info();this.hook(()=>this.params.onUsage?.($,Q))}return}case"conversation.item.input_audio_transcription.completed":{let $=J;if(this.say("user",String($.transcript??"")),$.transcriptionUsage||$.transcriptionSeconds!==void 0){this.transcription={usage:$.transcriptionUsage?k(this.transcription.usage,$.transcriptionUsage):this.transcription.usage,seconds:this.transcription.seconds+($.transcriptionSeconds??0)};let Q=this.info(),Z={...$.transcriptionUsage?{usage:$.transcriptionUsage}:{},...$.transcriptionSeconds!==void 0?{seconds:$.transcriptionSeconds}:{}};this.hook(()=>this.params.onTranscriptionUsage?.(Z,Q))}return}case"response.output_audio_transcript.done":this.say("assistant",String(J.transcript??""));return;case"response.output_text.done":this.say("assistant",String(J.text??""));return;case"response.function_call_arguments.done":{let $=J;if(this.touch(),!this.ending)this.call($.call_id,$.name,$.arguments);return}case"session.updated":if(this.tampered(J.session))this.end("session_tampered",null);return;case"error":{let $=J.error;if(this.errors.push({code:$?.code,message:String($?.message??"")}),this.pendingCreate&&$?.event_id===this.pendingCreate)if(this.pendingCreate=void 0,$.code==="conversation_already_has_active_response")this.responseActive=!0,this.responseWanted=!0;else this.responseActive=!1;return}case"sideband.closed":{let $=J;if(!this.ending&&!$.byClient)this.end($.code===1000?"call_ended":"sideband_lost",null);return}}}say(J,$){if($.trim())this.transcript.push({role:J,text:$,at:Date.now()})}call(J,$,Q){let Z=P0(Q);if($===this.delegateName){let K=typeof Z.request==="string"?Z.request.trim():"";if(!K)return this.answer(J,{status:"error",message:"The request was empty."});return this.enqueue({record:{request:K,status:"queued"},turn:{text:K},callId:J})}let W=this.toolHandlers.get($);if(W)return void this.runTool(J,W,Z);switch($){case"stop_work":{let K=this.running;if(K)K.stopRequested=!0,K.handle?.stop({reason:"Stopped by voice."});let X=this.dropQueue();return this.answer(J,{stopped:Boolean(K),dropped:X})}case"work_status":return this.answer(J,{running:this.running?{request:this.running.record.request,step:this.lastProgress??"starting"}:null,queued:this.queue.map((K)=>K.record.request),...this.pending.length?{needsInput:this.questions()}:{}});case"answer_question":{if(!this.pending.length)return this.answer(J,{status:"error",message:"There is no open question."});let K=typeof Z.answer==="string"?Z.answer:"",X=typeof Z.approve==="boolean"?Z.approve:void 0,Y=this.pending.map((V)=>U0(V,K,X));return this.pending=[],this.enqueue({record:{request:`(answer) ${K}`,status:"queued"},turn:{toolResults:Y},callId:J})}default:return this.answer(J,{status:"error",message:`There is no tool called ${$}.`})}}enqueue(J){if(!this.running){this.requests.push(J.record),this.run(J);return}if(this.queue.length>=this.limits.maxQueued)return this.answer(J.callId,{status:"busy",message:"Too many requests are waiting. Ask the user to wait for the current one."});this.requests.push(J.record),this.queue.push(J),this.answer(J.callId,{status:"queued",position:this.queue.length,message:"It will start when the current request is done."}),J.callId=void 0}async run(J){this.running=J,J.record.status="running",this.lastProgress=void 0,this.pauseIdle();try{let $=new Set;await this.waitForThread($);let Q=await this.latestBody();while(!J.stopRequested&&await this.waitForThread($));if(J.stopRequested||this.ending){J.record.status="dropped",this.complete(J,{status:"stopped"});return}let Z;try{Z=await this.params.controller.startTurn({threadId:this.threadId,user:this.params.user,body:Q,turn:J.turn})}catch(K){J.record.status="refused",this.complete(J,{status:"refused",message:K instanceof Error?K.message:"The request could not be started."});return}J.handle=Z,J.record.runId=Z.runId,this.follow(Z);let W=await Z.result();if(J.record.status="done",J.record.finishReason=W.finishReason,W.finishReason==="awaiting-input"&&W.pending.length)this.pending=W.pending,this.complete(J,{status:"needs_input",text:W.text,questions:this.questions()});else if(W.finishReason==="error")this.complete(J,{status:"failed",message:W.error?.message??"The work failed."});else if(W.finishReason==="aborted")this.complete(J,{status:"stopped",text:W.text});else this.complete(J,{status:"done",text:W.text})}catch($){J.record.status="done",this.complete(J,{status:"failed",message:$ instanceof Error?$.message:"The work failed."})}finally{this.running=void 0,this.flushNote();let $=this.queue.shift();if($&&!this.ending)this.run($);else this.touch()}}async runTool(J,$,Q){let Z=$.tool.name,W=Date.now();if(this.toolCallTimes=this.toolCallTimes.filter((D)=>W-D<60000),this.toolCallTimes.length>=this.limits.maxToolCallsPerMinute){let D={name:Z,status:"busy"};this.toolCalls.push(D),this.answer(J,{status:"busy",message:"Too many tool calls in the last minute. Tell the user to wait a moment."});return}this.toolCallTimes.push(W);let K={name:Z,status:"running"};this.toolCalls.push(K),this.toolsRunning+=1,this.pauseIdle();let X=new AbortController,Y=$.timeoutMs??this.limits.toolTimeoutMs,V,G;try{let D=await Promise.race([$.run(Q,{sessionId:this.sessionId,signal:X.signal}),new Promise((z,F)=>{V=setTimeout(()=>{F(new m(`"${Z}" took longer than ${Math.round(Y/1000)} s.`)),X.abort()},Y)})]);K.status="done",G={status:"done",output:this.clip(D)}}catch(D){if(D instanceof pJ){K.status="refused",K.message=D.message,this.end("usage",D.line??null);return}let z=D instanceof m?D.message:"The tool failed.";if(!(D instanceof m))console.error(`[gemi/ai] the voice tool "${Z}" threw.`,D);K.status="failed",K.message=z,G={status:"failed",message:z}}finally{clearTimeout(V),K.durationMs=Date.now()-W,this.toolsRunning-=1,this.touch()}let H=this.info();if(this.hook(()=>this.params.onToolCall?.({...K},H)),!this.ending)this.answer(J,G)}clip(J){let $;try{$=JSON.stringify(J)}catch{return String(J)}if($===void 0||$.length<=this.limits.toolOutputChars)return J;return`${$.slice(0,this.limits.toolOutputChars)}\u2026 (cut: ${$.length} characters in all)`}async waitForThread(J=new Set){let $=this.params.liveRuns;if(!$)return!1;let Q=await $.find({threadId:this.threadId}),Z=Q&&!J.has(Q.runId)?$.get(Q.runId):null;if(!Q||!Z)return!1;return J.add(Q.runId),await Z.result().catch(()=>{return}),!0}async latestBody(){let J=this.params.store;if(!J)return this.body;let $=await J.get(this.sessionId).catch(()=>null);if($)this.body=$.body;return this.body}async follow(J){let $=this.params.progress??N0();try{for await(let Q of J.run){let Z=$(Q);if(Z)this.note(Z)}}catch{}}complete(J,$){if(this.ending)return;if(J.callId)this.sideband.functionOutput(J.callId,$),J.callId=void 0;else this.sideband.addNote(`Update on the earlier request "${J.record.request}": ${JSON.stringify($)}`);this.respond()}answer(J,$){this.sideband.functionOutput(J,$),this.respond()}respond(){if(this.ending)return;if(this.responseActive){this.responseWanted=!0;return}this.responseActive=!0,this.createResponse()}createResponse(){let J=`gemi_voice_${crypto.randomUUID()}`;this.pendingCreate=J,this.sideband.send({type:"response.create",event_id:J})}questions(){return this.pending.map((J)=>({kind:J.kind,tool:String(J.name),input:J.input}))}dropQueue(){let J=this.queue.splice(0);for(let $ of J)$.record.status="dropped";return J.length}note(J){if(J===this.lastProgress)return;this.lastProgress=J;let $=this.lastNoteAt+this.limits.progressIntervalMs-Date.now();if($<=0)return this.flushNote();this.noteTimer??=setTimeout(()=>this.flushNote(),$)}flushNote(){if(this.noteTimer)clearTimeout(this.noteTimer);if(this.noteTimer=void 0,!this.lastProgress||this.ending||!this.running)return;this.lastNoteAt=Date.now(),this.sideband.addNote(`Progress on "${this.running.record.request}": ${this.lastProgress}`)}touch(){if(this.idleTimer)clearTimeout(this.idleTimer);if(this.idleTimer=void 0,this.running||this.toolsRunning>0||this.ending)return;this.idleTimer=setTimeout(()=>void this.end("idle",this.lines.idle),this.limits.idleTimeoutMs)}pauseIdle(){if(this.idleTimer)clearTimeout(this.idleTimer);this.idleTimer=void 0}info(){return{sessionId:this.sessionId,total:this.usage,elapsedMs:Date.now()-this.startedAt,transcription:this.transcription}}tick(){if(this.ending)return;let J=this.info();this.hook(()=>this.params.onTick?.(J))}hook(J){this.hooks=this.hooks.then(async()=>{try{await J()}catch($){if($ instanceof pJ)this.end("usage",$.line??null);else console.error("[gemi/ai] a voice hook threw; ending the call.",$),this.end("error",this.lines.error)}})}tampered(J){let $=this.params.session;if(!$||!J)return!1;if($.instructions!==void 0&&J.instructions!==void 0&&J.instructions!==$.instructions)return!0;if(Array.isArray(J.tools)){let Q=new Set([...PJ(this.params.delegate),...$.tools??[]].map((W)=>W.name)),Z=new Set(J.tools.map((W)=>String(W?.name)));if(Q.size!==Z.size||[...Q].some((W)=>!Z.has(W)))return!0}return!1}async finish(J,$){for(let X of this.timers)clearTimeout(X);if(this.idleTimer)clearTimeout(this.idleTimer);if(this.noteTimer)clearTimeout(this.noteTimer);if(this.tickTimer)clearInterval(this.tickTimer);if(this.dropQueue(),$&&(J!=="call_ended"&&J!=="sideband_lost"))await this.closingLine($);if(J!=="call_ended")await this.hangUp();else this.sideband.close();await this.hooks;let Z=Date.now(),W=Z-this.startedAt,K={sessionId:this.sessionId,...this.callId?{callId:this.callId}:{},threadId:this.threadId,reason:J,startedAt:this.startedAt,endedAt:Z,durationMs:W,seconds:Math.ceil(W/1000),usage:this.usage,transcription:this.transcription,transcript:this.transcript,requests:this.requests,toolCalls:this.toolCalls,errors:this.errors};mJ.delete(this.sessionId),await this.params.store?.update(this.sessionId,{endedAt:Z,endReason:J}).catch(()=>{return});try{await this.params.onEnd?.(K)}catch(X){console.error("[gemi/ai] a voice session's onEnd threw.",X)}return this.resolveEnded(K),K}async hangUp(){try{await this.hangupCall()}catch(J){console.error("[gemi/ai] a voice call could not be hung up; waiting for the vendor.",J),this.errors.push({code:"hangup_failed",message:J instanceof Error?J.message:String(J)});let $;await Promise.race([this.sideband.closed,new Promise((Q)=>$=setTimeout(Q,this.limits.hangupGraceMs))]),clearTimeout($),this.sideband.close()}}async closingLine(J){await new Promise(($)=>{let Q=`gemi_voice_closing_${crypto.randomUUID()}`,Z=`gemi_voice_cancel_${crypto.randomUUID()}`,W=this.responseActive?"cancelling":"asked",K,X=setTimeout(Y,this.limits.closingLineMs);function Y(){clearTimeout(X),$()}let V=()=>{W="asked",this.sideband.send({type:"response.create",event_id:Q,response:{instructions:`Say exactly this to the user, and nothing else: "${J}"`,tool_choice:"none"}})};if(this.closingWaiter=(G)=>{let H=G;if(H.type==="sideband.closed")return Y();if(W==="cancelling"){if(H.type==="response.done"||H.type==="error"&&H.error?.event_id===Z)V();return}if(H.type==="error"&&H.error?.event_id===Q)return Y();if(H.type==="response.created"&&!K){K=H.response?.id;return}let D=(z)=>!K||!z||z===K;if(H.type==="response.done"&&D(H.response?.id))W="playing";else if(H.type==="output_audio_buffer.stopped"&&W==="playing"&&D(H.response_id))Y()},W==="cancelling")this.sideband.send({type:"response.cancel",event_id:Z});else V()}),this.closingWaiter=void 0}}function h9(J){if(!J)return{};return Object.fromEntries(Object.entries(J).filter(([,$])=>$!==void 0))}function P0(J){try{let $=JSON.parse(J);return $&&typeof $==="object"&&!Array.isArray($)?$:{}}catch{return{}}}function U0(J,$,Q){let Z={toolCallId:J.toolCallId,signature:J.signature,...J.path?{path:J.path}:{}};if(J.kind==="question")return{...Z,output:$};if(J.kind==="approval")return{...Z,approve:Q===!0,...$?{reason:$}:{}};return{...Z,approve:!1,reason:"Not available in a voice call."}}function N0(){let J=new Set;return($)=>{if($.type==="tool-call"){if($.part.partial||$.resent||J.has($.part.toolCallId))return;return J.add($.part.toolCallId),`running ${String($.part.name)}`}if($.type==="tool-progress"){let Q=$.data;if(typeof Q==="string")return Q;if(Q&&typeof Q==="object")for(let Z of["message","label","title"]){let W=Q[Z];if(typeof W==="string"&&W)return W}}return}}var g9="http://gemi.internal/__gemi__/voice/mcp";async function h$(J,$){if(!$.user)throw Error("Voice MCP tools run as the signed-in user, and this voice session has none. Give `mcp` only to a signed-in user's session.");let{registry:Q}=J,Z=J.scopes??Q.scopes().map((X)=>X.name),W=(X)=>({kind:"remote",req:X,principal:{user:$.user,via:"voice",id:`voice:${$.sessionId}`,scopes:Z}});return(await Q.available(W(u9()),J.filter)).filter((X)=>!X.requiresApproval).map((X)=>({tool:{name:X.name,description:X.description,parameters:X.inputSchema},...J.timeoutMs!==void 0?{timeoutMs:J.timeoutMs}:{},run:(Y,V)=>{let G=u9();return c.run(G,async()=>{return await J.authorize?.({name:X.name,input:Y,sessionId:V.sessionId}),Q.execute(W(G),X.name,Y,void 0,{signal:V.signal})},{user:$.user})}}))}function u9(){return new q(new Request(g9,{method:"POST"}),{},"api",new URL(g9).pathname)}class g${records=new Map;retainEndedMs;constructor(J={}){this.retainEndedMs=J.retainEndedMs??600000}async create(J){this.sweep(),this.records.set(J.id,structuredClone(J))}async get(J){let $=this.records.get(J);return $?structuredClone($):null}async update(J,$){let Q=this.records.get(J);if(!Q)return;this.records.set(J,{...Q,...structuredClone($),id:J})}sweep(){let J=Date.now()-this.retainEndedMs;for(let[$,Q]of this.records)if(Q.endedAt!==void 0&&Q.endedAt<J)this.records.delete($)}}var u$=new g$;var c9=new WeakMap,m9=100;class c${threadsTable;messagesTable;scope=null;sql;dialect;connection;options;constructor(J,$={}){this.threadsTable=p9($.threadsTable??"gemi_agent_threads","threads"),this.messagesTable=p9($.messagesTable??"gemi_agent_messages","messages"),this.sql=J.sql,this.dialect=J.dialect,this.connection=J.name,this.options=$}forScope(J){if(typeof J!=="string"||J==="")throw TypeError("A DatabaseAgentStore scope is a non-empty string.");let $=new c$({sql:this.sql,dialect:this.dialect,name:this.connection},this.options);return $.scope=J,$}async createTable(){let J=C0(this.dialect,this.threadsTable,this.messagesTable);for(let $ of J)await this.sql.unsafe($);await this.addScopeColumns()}async addScopeColumns(){let J=O0(this.dialect,this.threadsTable,this.messagesTable);for(let[$,Q]of J){if(await this.hasColumn($,"scope"))continue;for(let Z of Q)await this.sql.unsafe(Z)}}async hasColumn(J,$){try{return await this.sql.unsafe(`SELECT ${$} FROM ${this.quote(J)} WHERE 1 = 0`),!0}catch{return!1}}async createThread(J){let $=crypto.randomUUID(),Q=J.userId===void 0||J.userId===null?null:String(J.userId);return await this.run(async(Z)=>{let W=this.clock(Z);if(this.scope===null)await Z`
147
+ INSERT INTO ${this.threads(Z)} (id, user_id, created_at, updated_at)
148
+ VALUES (${$}, ${Q}, ${W}, ${W})
149
+ `;else await Z`
150
+ INSERT INTO ${this.threads(Z)} (id, scope, user_id, created_at, updated_at)
151
+ VALUES (${$}, ${this.scope}, ${Q}, ${W}, ${W})
152
+ `}),{threadId:$}}async loadThread(J){return this.run(async($)=>{if((await $`
153
+ SELECT id FROM ${this.threads($)} WHERE id = ${J} AND ${this.inScope($)}
154
+ `).length===0)return null;return(await $`
155
+ SELECT message FROM ${this.messages($)}
156
+ WHERE thread_id = ${J} AND ${this.inScope($)}
157
+ ORDER BY position
158
+ `).map((W)=>JSON.parse(String(W.message)))})}async appendMessages(J,$){if($.length===0){if(await this.getThread(J)===null)throw l9(J);return}await this.atomically(async(Q)=>{await Q`
159
+ UPDATE ${this.threads(Q)} SET updated_at = ${this.clock(Q)}
160
+ WHERE id = ${J} AND ${this.inScope(Q)}
161
+ `;let Z=await Q`
162
+ SELECT title FROM ${this.threads(Q)} WHERE id = ${J} AND ${this.inScope(Q)}
163
+ `;if(Z.length===0)throw l9(J);let W=[...new Set($.map((G)=>G.id))],K=await Q`
156
164
  SELECT id FROM ${this.messages(Q)}
157
- WHERE thread_id = ${J} AND id IN (${c9(Q,W)})
158
- `,X=new Set(K.map((Y)=>String(Y.id))),[G]=await Q`
165
+ WHERE thread_id = ${J} AND id IN (${d9(Q,W)})
166
+ `,X=new Set(K.map((G)=>String(G.id))),[Y]=await Q`
159
167
  SELECT MAX(position) AS position FROM ${this.messages(Q)} WHERE thread_id = ${J}
160
- `,V=G?.position===null||G?.position===void 0?0:Number(G.position)+1;for(let Y of $){let H=JSON.stringify(Y);if(X.has(Y.id))await Q`
168
+ `,V=Y?.position===null||Y?.position===void 0?0:Number(Y.position)+1;for(let G of $){let H=JSON.stringify(G);if(X.has(G.id))await Q`
161
169
  UPDATE ${this.messages(Q)} SET message = ${H}
162
- WHERE thread_id = ${J} AND id = ${Y.id}
163
- `;else await Q`
170
+ WHERE thread_id = ${J} AND id = ${G.id}
171
+ `;else if(this.scope===null)await Q`
164
172
  INSERT INTO ${this.messages(Q)} (thread_id, id, position, message, created_at)
165
- VALUES (${J}, ${Y.id}, ${V}, ${H}, ${this.clock(Q)})
166
- `,X.add(Y.id),V+=1}if(Z[0].title===null||Z[0].title===void 0){let Y=K0($);if(Y!==null)await Q`
167
- UPDATE ${this.threads(Q)} SET title = ${Y}
173
+ VALUES (${J}, ${G.id}, ${V}, ${H}, ${this.clock(Q)})
174
+ `,X.add(G.id),V+=1;else await Q`
175
+ INSERT INTO ${this.messages(Q)} (thread_id, scope, id, position, message, created_at)
176
+ VALUES (${J}, ${this.scope}, ${G.id}, ${V}, ${H}, ${this.clock(Q)})
177
+ `,X.add(G.id),V+=1}if(Z[0].title===null||Z[0].title===void 0){let G=B0($);if(G!==null)await Q`
178
+ UPDATE ${this.threads(Q)} SET title = ${G}
168
179
  WHERE id = ${J} AND title IS NULL
169
- `}})}async removeMessages(J,$){if($.length===0)return;let Q=this.q();await Q`
170
- DELETE FROM ${this.messages(Q)}
171
- WHERE thread_id = ${J} AND id IN (${c9(Q,[...new Set($)])})
172
- `}async loadSummaries(J){let $=this.q(),[Q]=await $`
173
- SELECT summaries FROM ${this.threads($)} WHERE id = ${J}
174
- `;return Q?m9(Q.summaries):[]}async saveSummary(J,$){await this.atomically(async(Q)=>{await Q`UPDATE ${this.threads(Q)} SET updated_at = updated_at WHERE id = ${J}`;let[Z]=await Q`
175
- SELECT summaries FROM ${this.threads(Q)} WHERE id = ${J}
176
- `;if(!Z)return;let W=FJ(m9(Z.summaries),$);await Q`
180
+ `}})}async removeMessages(J,$){if($.length===0)return;await this.run(async(Q)=>{await Q`
181
+ DELETE FROM ${this.messages(Q)}
182
+ WHERE thread_id = ${J} AND ${this.inScope(Q)}
183
+ AND id IN (${d9(Q,[...new Set($)])})
184
+ `})}async loadSummaries(J){return this.run(async($)=>{let[Q]=await $`
185
+ SELECT summaries FROM ${this.threads($)} WHERE id = ${J} AND ${this.inScope($)}
186
+ `;return Q?i9(Q.summaries):[]})}async saveSummary(J,$){await this.atomically(async(Q)=>{await Q`
187
+ UPDATE ${this.threads(Q)} SET updated_at = updated_at
188
+ WHERE id = ${J} AND ${this.inScope(Q)}
189
+ `;let[Z]=await Q`
190
+ SELECT summaries FROM ${this.threads(Q)} WHERE id = ${J} AND ${this.inScope(Q)}
191
+ `;if(!Z)return;let W=NJ(i9(Z.summaries),$);await Q`
177
192
  UPDATE ${this.threads(Q)} SET summaries = ${JSON.stringify(W)}
178
193
  WHERE id = ${J}
179
- `})}async lockSummary(J,$,Q){let Z=this.q(),W=`${$}:${crypto.randomUUID()}`,K=this.clock(Z),X=await Z`
180
- UPDATE ${this.threads(Z)}
181
- SET summary_lock = ${W}, summary_lock_until = ${K} + ${this.ms(Z,Q)}
182
- WHERE id = ${J} AND (summary_lock_until IS NULL OR summary_lock_until <= ${K})
183
- `;if(X0(X)===0)return null;return async()=>{let G=this.q();await G`
184
- UPDATE ${this.threads(G)} SET summary_lock = NULL, summary_lock_until = NULL
185
- WHERE id = ${J} AND summary_lock = ${W}
186
- `}}async getThread(J){let $=this.q(),[Q]=await $`
187
- SELECT id, user_id, title, created_at, updated_at FROM ${this.threads($)}
188
- WHERE id = ${J}
189
- `;return Q?p9(Q):null}async listThreads(J={}){let $=this.q(),Q=Math.max(0,Math.floor(J.limit??50)),Z=Math.max(0,Math.floor(J.offset??0)),W=J.userId===void 0?$`1 = 1`:J.userId===null?$`user_id IS NULL`:$`user_id = ${String(J.userId)}`;return(await $`
190
- SELECT id, user_id, title, created_at, updated_at FROM ${this.threads($)}
191
- WHERE ${W}
192
- ORDER BY updated_at DESC, id DESC
193
- LIMIT ${Q} OFFSET ${Z}
194
- `).map(p9)}async deleteThread(J){await this.atomically(async($)=>{await $`DELETE FROM ${this.messages($)} WHERE thread_id = ${J}`,await $`DELETE FROM ${this.threads($)} WHERE id = ${J}`})}atomically(J){if(this.joinable())return RJ(this.sql,(W)=>J(W),{connection:this.connection});let $=()=>this.sql.begin((W)=>J(W));if(this.dialect!=="sqlite")return $();let Z=(y9.get(this.sql)??Promise.resolve()).then($,$);return y9.set(this.sql,Z.then(()=>{},()=>{})),Z}joinable(){if(this.connection===void 0)return;let J=o();if(J===void 0||s()!==this.connection)return;return J}q(){return this.joinable()??this.sql}quote(J){return this.dialect==="mysql"||this.dialect==="mariadb"?`\`${J}\``:`"${J}"`}threads(J){return J.unsafe(this.quote(this.threadsTable))}messages(J){return J.unsafe(this.quote(this.messagesTable))}clock(J){switch(this.dialect){case"postgres":return J`floor(extract(epoch from statement_timestamp()) * 1000)::bigint`;case"mysql":case"mariadb":return J`(TIMESTAMPDIFF(MICROSECOND, '1970-01-01 00:00:00', UTC_TIMESTAMP(6)) DIV 1000)`;case"sqlite":return J`CAST((julianday('now') - 2440587.5) * 86400000 AS INTEGER)`}}ms(J,$){let Q=Math.max(0,Math.round($));return this.dialect==="mysql"||this.dialect==="mariadb"?J`CAST(${Q} AS SIGNED)`:J`CAST(${Q} AS BIGINT)`}}function g9(J,$){if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(J))throw Error(`The agent ${$} table name "${J}" is not a plain identifier. Use letters, digits and underscores.`);return J}function u9(J){return Error(`Thread ${J} does not exist here, or has been deleted.`)}function c9(J,$){return $.map((Q)=>J`${Q}`).reduce((Q,Z)=>J`${Q}, ${Z}`)}function K0(J){for(let $ of J){if($.role!=="user")continue;let Q=$.content.map((Z)=>Z.type==="text"?Z.text:"").join(" ").replace(/\s+/g," ").trim();if(Q)return Q.length>h9?`${Q.slice(0,h9-1)}\u2026`:Q}return null}function m9(J){if(J===null||J===void 0||J==="")return[];let $=JSON.parse(String(J));return Array.isArray($)?$:[]}function p9(J){return{id:String(J.id),userId:J.user_id===null||J.user_id===void 0?null:String(J.user_id),title:J.title===null||J.title===void 0?null:String(J.title),createdAt:Number(J.created_at),updatedAt:Number(J.updated_at)}}function X0(J){let $=J;return Math.max(Number($.count??0),Number($.affectedRows??0))}function Y0(J,$,Q){if(J==="mysql"||J==="mariadb")return[`CREATE TABLE IF NOT EXISTS \`${$}\` (
194
+ `})}async lockSummary(J,$,Q){let Z=`${$}:${crypto.randomUUID()}`;if(!await this.run(async(K)=>{let X=this.clock(K),Y=await K`
195
+ UPDATE ${this.threads(K)}
196
+ SET summary_lock = ${Z}, summary_lock_until = ${X} + ${this.ms(K,Q)}
197
+ WHERE id = ${J} AND ${this.inScope(K)}
198
+ AND (summary_lock_until IS NULL OR summary_lock_until <= ${X})
199
+ `;return L0(Y)>0}))return null;return async()=>{await this.run(async(K)=>{await K`
200
+ UPDATE ${this.threads(K)} SET summary_lock = NULL, summary_lock_until = NULL
201
+ WHERE id = ${J} AND ${this.inScope(K)} AND summary_lock = ${Z}
202
+ `})}}async getThread(J){return this.run(async($)=>{let[Q]=await $`
203
+ SELECT id, user_id, title, created_at, updated_at FROM ${this.threads($)}
204
+ WHERE id = ${J} AND ${this.inScope($)}
205
+ `;return Q?n9(Q):null})}async listThreads(J={}){let $=Math.max(0,Math.floor(J.limit??50)),Q=Math.max(0,Math.floor(J.offset??0));return this.run(async(Z)=>{let W=J.userId===void 0?Z`1 = 1`:J.userId===null?Z`user_id IS NULL`:Z`user_id = ${String(J.userId)}`;return(await Z`
206
+ SELECT id, user_id, title, created_at, updated_at FROM ${this.threads(Z)}
207
+ WHERE ${this.inScope(Z)} AND ${W}
208
+ ORDER BY updated_at DESC, id DESC
209
+ LIMIT ${$} OFFSET ${Q}
210
+ `).map(n9)})}async deleteThread(J){await this.atomically(async($)=>{if((await $`
211
+ SELECT id FROM ${this.threads($)} WHERE id = ${J} AND ${this.inScope($)}
212
+ `).length===0)return;await $`DELETE FROM ${this.messages($)} WHERE thread_id = ${J}`,await $`DELETE FROM ${this.threads($)} WHERE id = ${J}`})}atomically(J){if(this.guard(),this.joinable())return TJ(this.sql,(X)=>J(X),{connection:this.connection});let $=this.scope,Q=this.options.beginScope,Z=()=>this.sql.begin(async(X)=>{if($!==null&&Q)await Q(X,$);return J(X)});if(this.dialect!=="sqlite")return Z();let K=(c9.get(this.sql)??Promise.resolve()).then(Z,Z);return c9.set(this.sql,K.then(()=>{},()=>{})),K}joinable(){if(this.connection===void 0)return;let J=s();if(J===void 0||a()!==this.connection)return;return J}run(J){this.guard();let $=this.joinable();if($)return J($);if(this.scope!==null&&this.options.beginScope)return this.atomically(J);return J(this.sql)}guard(){if(this.scope===null&&this.options.requireScope)throw Error("This DatabaseAgentStore requires a scope: call it through store.forScope(scope).")}inScope(J){return this.scope===null?J`1 = 1`:J`scope = ${this.scope}`}quote(J){return this.dialect==="mysql"||this.dialect==="mariadb"?`\`${J}\``:`"${J}"`}threads(J){return J.unsafe(this.quote(this.threadsTable))}messages(J){return J.unsafe(this.quote(this.messagesTable))}clock(J){switch(this.dialect){case"postgres":return J`floor(extract(epoch from statement_timestamp()) * 1000)::bigint`;case"mysql":case"mariadb":return J`(TIMESTAMPDIFF(MICROSECOND, '1970-01-01 00:00:00', UTC_TIMESTAMP(6)) DIV 1000)`;case"sqlite":return J`CAST((julianday('now') - 2440587.5) * 86400000 AS INTEGER)`}}ms(J,$){let Q=Math.max(0,Math.round($));return this.dialect==="mysql"||this.dialect==="mariadb"?J`CAST(${Q} AS SIGNED)`:J`CAST(${Q} AS BIGINT)`}}function p9(J,$){if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(J))throw Error(`The agent ${$} table name "${J}" is not a plain identifier. Use letters, digits and underscores.`);return J}function l9(J){return Error(`Thread ${J} does not exist here, or has been deleted.`)}function d9(J,$){return $.map((Q)=>J`${Q}`).reduce((Q,Z)=>J`${Q}, ${Z}`)}function B0(J){for(let $ of J){if($.role!=="user"||$.event)continue;let Q=$.content.map((Z)=>Z.type==="text"?Z.text:"").join(" ").replace(/\s+/g," ").trim();if(Q)return Q.length>m9?`${Q.slice(0,m9-1)}\u2026`:Q}return null}function i9(J){if(J===null||J===void 0||J==="")return[];let $=JSON.parse(String(J));return Array.isArray($)?$:[]}function n9(J){return{id:String(J.id),userId:J.user_id===null||J.user_id===void 0?null:String(J.user_id),title:J.title===null||J.title===void 0?null:String(J.title),createdAt:Number(J.created_at),updatedAt:Number(J.updated_at)}}function L0(J){let $=J;return Math.max(Number($.count??0),Number($.affectedRows??0))}function C0(J,$,Q){if(J==="mysql"||J==="mariadb")return[`CREATE TABLE IF NOT EXISTS \`${$}\` (
195
213
  \`id\` VARCHAR(191) NOT NULL,
214
+ \`scope\` VARCHAR(191) NULL,
196
215
  \`user_id\` VARCHAR(191) NULL,
197
216
  \`title\` TEXT NULL,
198
217
  \`summaries\` LONGTEXT NULL,
@@ -202,9 +221,11 @@ import{$b as Z8,$c as Z6,Ac as ZQ,Bc as WQ,Cc as M8,Ec as S8,Fc as j8,Gc as E8,H
202
221
  \`updated_at\` BIGINT NOT NULL,
203
222
 
204
223
  INDEX \`${$}_user_id_updated_at_idx\`(\`user_id\`, \`updated_at\`),
224
+ INDEX \`${$}_scope_user_id_updated_at_idx\`(\`scope\`, \`user_id\`, \`updated_at\`),
205
225
  PRIMARY KEY (\`id\`)
206
226
  ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci`,`CREATE TABLE IF NOT EXISTS \`${Q}\` (
207
227
  \`thread_id\` VARCHAR(191) NOT NULL,
228
+ \`scope\` VARCHAR(191) NULL,
208
229
  \`id\` VARCHAR(191) NOT NULL,
209
230
  \`position\` INTEGER NOT NULL,
210
231
  \`message\` LONGTEXT NOT NULL,
@@ -216,6 +237,7 @@ import{$b as Z8,$c as Z6,Ac as ZQ,Bc as WQ,Cc as M8,Ec as S8,Fc as j8,Gc as E8,H
216
237
 
217
238
  CONSTRAINT "${$}_pkey" PRIMARY KEY ("id")`;return[`CREATE TABLE IF NOT EXISTS "${$}" (
218
239
  ${Z}
240
+ "scope" TEXT,
219
241
  "user_id" TEXT,
220
242
  "title" TEXT,
221
243
  "summaries" TEXT,
@@ -223,22 +245,23 @@ import{$b as Z8,$c as Z6,Ac as ZQ,Bc as WQ,Cc as M8,Ec as S8,Fc as j8,Gc as E8,H
223
245
  "summary_lock_until" BIGINT,
224
246
  "created_at" BIGINT NOT NULL,
225
247
  "updated_at" BIGINT NOT NULL${W}
226
- )`,`CREATE INDEX IF NOT EXISTS "${$}_user_id_updated_at_idx" ON "${$}"("user_id", "updated_at")`,`CREATE TABLE IF NOT EXISTS "${Q}" (
248
+ )`,`CREATE INDEX IF NOT EXISTS "${$}_user_id_updated_at_idx" ON "${$}"("user_id", "updated_at")`,`CREATE INDEX IF NOT EXISTS "${$}_scope_user_id_updated_at_idx" ON "${$}"("scope", "user_id", "updated_at")`,`CREATE TABLE IF NOT EXISTS "${Q}" (
227
249
  "thread_id" TEXT NOT NULL,
250
+ "scope" TEXT,
228
251
  "id" TEXT NOT NULL,
229
252
  "position" INTEGER NOT NULL,
230
253
  "message" TEXT NOT NULL,
231
254
  "created_at" BIGINT NOT NULL,
232
255
 
233
256
  CONSTRAINT "${Q}_pkey" PRIMARY KEY ("thread_id", "id")
234
- )`,`CREATE UNIQUE INDEX IF NOT EXISTS "${Q}_thread_id_position_key" ON "${Q}"("thread_id", "position")`]}class JJ extends Error{runId;requested;oldest;code="frame_cursor_evicted";constructor(J,$,Q){super(`Frame ${$} of run ${J} has been evicted; the oldest frame still buffered is ${Q}. Reload the thread instead of resuming.`);this.runId=J;this.requested=$;this.oldest=Q}}class PJ extends Error{runId;code="live_run_not_found";constructor(J){super(`No live run ${J} in this process.`);this.runId=J}}class uJ{ttlMs;maxFrames;maxAgeMs;runs=new Map;byThread=new Map;byClientRun=new Map;constructor(J={}){this.ttlMs=J.ttlMs??60000,this.maxFrames=J.maxFrames??4096,this.maxAgeMs=J.maxAgeMs===void 0?3600000:J.maxAgeMs}register(J,$={}){let Q={run:J,threadId:$.threadId,owner:$.owner??null,clientRunId:$.clientRunId,frames:[],lastSeq:-1,lostBefore:0,ended:!1,evicted:!1,evictAt:null,expireAt:null,wake:new Set,version:0};if(this.runs.set(J.runId,Q),$.threadId)this.byThread.set($.threadId,J.runId);if($.clientRunId)this.byClientRun.set($.clientRunId,J.runId);return this.scheduleExpiry(Q,$.maxRunDurationMs),this.pump(Q,$)}findByClientRunId(J){let $=this.byClientRun.get(J);return $&&this.runs.has($)?$:null}async find(J){let $=this.byThread.get(J.threadId);if(!$)return null;let Q=this.runs.get($);if(!Q)return null;return{runId:$,seq:Q.lastSeq}}get(J){return this.runs.get(J)?.run??null}ownerOf(J){return this.runs.get(J)?.owner??null}mayAccess(J,$){let Q=this.ownerOf(J);return Q===null||Q===$}isRunning(J){let $=this.runs.get(J);return!!$&&!$.ended&&!$.evicted}replay(J,$){let Q=this.runs.get(J);if(!Q)throw new PJ(J);if($!==void 0&&$<Q.lostBefore)throw new JJ(J,$,Q.lostBefore);let Z=Q.frames[0]?.seq;return this.drain(Q,J,$??Z??Q.lastSeq+1)}clear(){for(let J of this.runs.values()){if(J.evictAt)clearTimeout(J.evictAt);if(J.expireAt)clearTimeout(J.expireAt);J.ended=!0,this.notify(J)}this.runs.clear(),this.byThread.clear(),this.byClientRun.clear()}get size(){return this.runs.size}async pump(J,$){let Q=Promise.resolve();try{for await(let Z of J.run.frames()){if(J.evicted){let K=$.onEvent;if(K)Q=Q.then(()=>K(Z.event)).catch((X)=>c$($,X));continue}if(J.frames.push(Z),J.lastSeq=Z.seq,J.frames.length>this.maxFrames){let K=J.frames.shift();if(K)J.lostBefore=K.seq+1}this.notify(J);let W=$.onEvent;if(W)Q=Q.then(()=>W(Z.event)).catch((K)=>c$($,K))}}catch(Z){c$($,Z)}finally{if(J.ended=!0,J.expireAt)clearTimeout(J.expireAt),J.expireAt=null;this.notify(J),this.scheduleEviction(J),await Q}}async*drain(J,$,Q){let Z=Q;while(!0){let W=J.version;for(;;){if(Z<J.lostBefore)throw new JJ($,Z,J.lostBefore);let K=J.frames,X=K[0]?.seq;if(X===void 0)break;let G=Math.max(0,Z-X);if(G>=K.length)break;let V=K[G];yield V,Z=V.seq+1}if(J.ended&&Z>J.lastSeq||J.evicted)return;await this.wait(J,W)}}wait(J,$){if(J.version!==$)return Promise.resolve();return new Promise((Q)=>J.wake.add(Q))}notify(J){J.version++;let $=Array.from(J.wake);J.wake.clear();for(let Q of $)Q()}scheduleEviction(J){if(J.evictAt)return;let $=setTimeout(()=>{let Q=J.run.runId;if(!J.ended)J.evicted=!0,J.frames=[];if(this.runs.get(Q)===J)this.runs.delete(Q);if(J.threadId&&this.byThread.get(J.threadId)===Q)this.byThread.delete(J.threadId);if(J.clientRunId&&this.byClientRun.get(J.clientRunId)===Q)this.byClientRun.delete(J.clientRunId);this.notify(J)},this.ttlMs);$.unref?.(),J.evictAt=$}scheduleExpiry(J,$){if(this.maxAgeMs===null||$===null)return;let Q=$===void 0?this.maxAgeMs:Math.max(this.maxAgeMs,$+this.ttlMs);if(!Number.isFinite(Q)||Q>2147483647)return;let Z=setTimeout(()=>{if(J.expireAt=null,J.ended)return;try{J.run.stop({reason:`The run was still going ${Math.round(Q/1000)}s after it started, past the live-run registry's age limit.`})}catch{}this.scheduleEviction(J)},Q);Z.unref?.(),J.expireAt=Z}}var m$=new uJ;function c$(J,$){try{J.onInternalError?.($)}catch{}}class cJ{maxEntries;records=new Map;constructor(J=1e5){this.maxEntries=J}async record(J,$){if(this.records.has(J))return;this.records.set(J,{...$});while(this.records.size>this.maxEntries){let Q=this.records.keys().next().value;if(Q===void 0)break;this.records.delete(Q)}}async get(J){let $=this.records.get(J);return $?{...$}:null}}var p$=new cJ;class i${now;receipts=new Map;sweepAt=1024;constructor(J=Date.now){this.now=J}async claim(J,$){let Q=this.now();if(this.receipts.size>=this.sweepAt)this.sweep(Q);let Z=this.receipts.get(J);if(Z&&Z.expiresAt>Q)return Z.result?{status:"replay",result:structuredClone(Z.result)}:{status:"blocked"};return this.receipts.set(J,{expiresAt:$}),{status:"claimed"}}async complete(J,$,Q){this.receipts.set(J,{result:structuredClone($),expiresAt:Q})}async release(J){let $=this.receipts.get(J);if($&&!$.result)this.receipts.delete(J)}get size(){return this.receipts.size}sweep(J){for(let[$,Q]of this.receipts)if(Q.expiresAt<=J)this.receipts.delete($);this.sweepAt=Math.max(1024,this.receipts.size*2)}}var d9="pending",l$="done:",G0=`
257
+ )`,`CREATE UNIQUE INDEX IF NOT EXISTS "${Q}_thread_id_position_key" ON "${Q}"("thread_id", "position")`]}function O0(J,$,Q){if(J==="mysql"||J==="mariadb")return[[$,[`ALTER TABLE \`${$}\` ADD COLUMN \`scope\` VARCHAR(191) NULL, ADD INDEX \`${$}_scope_user_id_updated_at_idx\`(\`scope\`, \`user_id\`, \`updated_at\`)`]],[Q,[`ALTER TABLE \`${Q}\` ADD COLUMN \`scope\` VARCHAR(191) NULL`]]];return[[$,[`ALTER TABLE "${$}" ADD COLUMN "scope" TEXT`,`CREATE INDEX IF NOT EXISTS "${$}_scope_user_id_updated_at_idx" ON "${$}"("scope", "user_id", "updated_at")`]],[Q,[`ALTER TABLE "${Q}" ADD COLUMN "scope" TEXT`]]]}class $J extends Error{runId;requested;oldest;code="frame_cursor_evicted";constructor(J,$,Q){super(`Frame ${$} of run ${J} has been evicted; the oldest frame still buffered is ${Q}. Reload the thread instead of resuming.`);this.runId=J;this.requested=$;this.oldest=Q}}class BJ extends Error{runId;code="live_run_not_found";constructor(J){super(`No live run ${J} in this process.`);this.runId=J}}class lJ{ttlMs;maxFrames;maxAgeMs;runs=new Map;byThread=new Map;byClientRun=new Map;constructor(J={}){this.ttlMs=J.ttlMs??60000,this.maxFrames=J.maxFrames??4096,this.maxAgeMs=J.maxAgeMs===void 0?3600000:J.maxAgeMs}register(J,$={}){let Q={run:J,threadId:$.threadId,owner:$.owner??null,clientRunId:$.clientRunId,frames:[],lastSeq:-1,lostBefore:0,ended:!1,evicted:!1,evictAt:null,expireAt:null,wake:new Set,version:0};if(this.runs.set(J.runId,Q),$.threadId)this.byThread.set($.threadId,J.runId);if($.clientRunId)this.byClientRun.set($.clientRunId,J.runId);return this.scheduleExpiry(Q,$.maxRunDurationMs),this.pump(Q,$)}findByClientRunId(J){let $=this.byClientRun.get(J);return $&&this.runs.has($)?$:null}async find(J){let $=this.byThread.get(J.threadId);if(!$)return null;let Q=this.runs.get($);if(!Q)return null;return{runId:$,seq:Q.lastSeq}}get(J){return this.runs.get(J)?.run??null}ownerOf(J){return this.runs.get(J)?.owner??null}mayAccess(J,$){let Q=this.ownerOf(J);return Q===null||Q===$}isRunning(J){let $=this.runs.get(J);return!!$&&!$.ended&&!$.evicted}replay(J,$){let Q=this.runs.get(J);if(!Q)throw new BJ(J);if($!==void 0&&$<Q.lostBefore)throw new $J(J,$,Q.lostBefore);let Z=Q.frames[0]?.seq;return this.drain(Q,J,$??Z??Q.lastSeq+1)}clear(){for(let J of this.runs.values()){if(J.evictAt)clearTimeout(J.evictAt);if(J.expireAt)clearTimeout(J.expireAt);J.ended=!0,this.notify(J)}this.runs.clear(),this.byThread.clear(),this.byClientRun.clear()}get size(){return this.runs.size}async pump(J,$){let Q=Promise.resolve();try{for await(let Z of J.run.frames()){if(J.evicted){let K=$.onEvent;if(K)Q=Q.then(()=>K(Z.event)).catch((X)=>m$($,X));continue}if(J.frames.push(Z),J.lastSeq=Z.seq,J.frames.length>this.maxFrames){let K=J.frames.shift();if(K)J.lostBefore=K.seq+1}this.notify(J);let W=$.onEvent;if(W)Q=Q.then(()=>W(Z.event)).catch((K)=>m$($,K))}}catch(Z){m$($,Z)}finally{if(J.ended=!0,J.expireAt)clearTimeout(J.expireAt),J.expireAt=null;this.notify(J),this.scheduleEviction(J),await Q}}async*drain(J,$,Q){let Z=Q;while(!0){let W=J.version;for(;;){if(Z<J.lostBefore)throw new $J($,Z,J.lostBefore);let K=J.frames,X=K[0]?.seq;if(X===void 0)break;let Y=Math.max(0,Z-X);if(Y>=K.length)break;let V=K[Y];yield V,Z=V.seq+1}if(J.ended&&Z>J.lastSeq||J.evicted)return;await this.wait(J,W)}}wait(J,$){if(J.version!==$)return Promise.resolve();return new Promise((Q)=>J.wake.add(Q))}notify(J){J.version++;let $=Array.from(J.wake);J.wake.clear();for(let Q of $)Q()}scheduleEviction(J){if(J.evictAt)return;let $=setTimeout(()=>{let Q=J.run.runId;if(!J.ended)J.evicted=!0,J.frames=[];if(this.runs.get(Q)===J)this.runs.delete(Q);if(J.threadId&&this.byThread.get(J.threadId)===Q)this.byThread.delete(J.threadId);if(J.clientRunId&&this.byClientRun.get(J.clientRunId)===Q)this.byClientRun.delete(J.clientRunId);this.notify(J)},this.ttlMs);$.unref?.(),J.evictAt=$}scheduleExpiry(J,$){if(this.maxAgeMs===null||$===null)return;let Q=$===void 0?this.maxAgeMs:Math.max(this.maxAgeMs,$+this.ttlMs);if(!Number.isFinite(Q)||Q>2147483647)return;let Z=setTimeout(()=>{if(J.expireAt=null,J.ended)return;try{J.run.stop({reason:`The run was still going ${Math.round(Q/1000)}s after it started, past the live-run registry's age limit.`})}catch{}this.scheduleEviction(J)},Q);Z.unref?.(),J.expireAt=Z}}var p$=new lJ;function m$(J,$){try{J.onInternalError?.($)}catch{}}class dJ{maxEntries;records=new Map;constructor(J=1e5){this.maxEntries=J}async record(J,$){if(this.records.has(J))return;this.records.set(J,{...$});while(this.records.size>this.maxEntries){let Q=this.records.keys().next().value;if(Q===void 0)break;this.records.delete(Q)}}async get(J){let $=this.records.get(J);return $?{...$}:null}}var l$=new dJ;class n${now;receipts=new Map;sweepAt=1024;constructor(J=Date.now){this.now=J}async claim(J,$){let Q=this.now();if(this.receipts.size>=this.sweepAt)this.sweep(Q);let Z=this.receipts.get(J);if(Z&&Z.expiresAt>Q)return Z.result?{status:"replay",result:structuredClone(Z.result)}:{status:"blocked"};return this.receipts.set(J,{expiresAt:$}),{status:"claimed"}}async complete(J,$,Q){this.receipts.set(J,{result:structuredClone($),expiresAt:Q})}async release(J){let $=this.receipts.get(J);if($&&!$.result)this.receipts.delete(J)}get size(){return this.receipts.size}sweep(J){for(let[$,Q]of this.receipts)if(Q.expiresAt<=J)this.receipts.delete($);this.sweepAt=Math.max(1024,this.receipts.size*2)}}var o9="pending",d$="done:",_0=`
235
258
  if redis.call('SET', KEYS[1], ARGV[1], 'PX', ARGV[2], 'NX') then return 'claimed' end
236
259
  local held = redis.call('GET', KEYS[1])
237
260
  if not held then return ARGV[1] end
238
- return held`,V0=`
261
+ return held`,M0=`
239
262
  if redis.call('GET', KEYS[1]) == ARGV[1] then return redis.call('DEL', KEYS[1]) end
240
- return 0`;class n${injectedClient;prefix;constructor(J={}){this.injectedClient=J.client,this.prefix=J.prefix??"gemi:ai:receipt"}async claim(J,$){let Q=await this.client.send("EVAL",[G0,"1",this.key(J),d9,i9($)]);if(Q==="claimed")return{status:"claimed"};let Z=String(Q??"");if(Z.startsWith(l$))return{status:"replay",result:JSON.parse(Z.slice(l$.length))};return{status:"blocked"}}async complete(J,$,Q){await this.client.send("SET",[this.key(J),l$+JSON.stringify($),"PX",i9(Q)])}async release(J){await this.client.send("EVAL",[V0,"1",this.key(J),d9])}key(J){return`${this.prefix}:${J}`}get client(){if(this.injectedClient)return this.injectedClient;let J=n9(),$=J.bound(d$)?J.make(d$).client:void 0;if(!$)throw Error("RedisReceiptStore could not reach the Redis client. Register RedisServiceProvider on your application, or pass a client: new RedisReceiptStore({ client }).");return $}}function i9(J){return String(Math.max(1,Math.ceil(J-Date.now())))}var H0=86400000,z0=60000;class mJ{ttlMs;clientOwnedIds;threads=new Map;lastSweep=0;constructor(J={}){this.ttlMs=J.ttlMs??H0,this.clientOwnedIds=J.clientOwnedIds??!1}async createThread(J){let $=crypto.randomUUID();return this.threads.set($,{messages:[],touchedAt:Date.now()}),this.sweep(),{threadId:$}}async loadThread(J){this.sweep();let $=this.threads.get(J);if(!$)return this.clientOwnedIds?[]:null;return $.touchedAt=Date.now(),$.messages.slice()}async appendMessages(J,$){this.sweep();let Q=this.threads.get(J);if(!Q){if(!this.clientOwnedIds)throw Error(`Thread ${J} does not exist here, or has expired.`);Q={messages:[],touchedAt:Date.now()},this.threads.set(J,Q)}for(let Z of $){let W=JSON.parse(JSON.stringify(Z)),K=Q.messages.findIndex((X)=>X.id===W.id);if(K===-1)Q.messages.push(W);else Q.messages[K]=W}Q.touchedAt=Date.now()}async removeMessages(J,$){this.sweep();let Q=this.threads.get(J);if(!Q)return;let Z=new Set($);Q.messages=Q.messages.filter((W)=>!Z.has(W.id)),Q.touchedAt=Date.now()}async loadSummaries(J){return this.threads.get(J)?.summaries?.slice()??[]}async saveSummary(J,$){let Q=this.threads.get(J);if(!Q)return;Q.summaries=FJ(Q.summaries??[],$)}delete(J){this.threads.delete(J)}get size(){return this.threads.size}sweep(J=Date.now()){if(J-this.lastSweep<z0)return;this.lastSweep=J;for(let[$,Q]of this.threads)if(J-Q.touchedAt>this.ttlMs)this.threads.delete($)}}var o$=new mJ;function t9(J={}){return{messages:J.messages?[...J.messages]:[],pending:J.pending?[...J.pending]:[],error:null,threadId:J.threadId,seq:J.seq??-1,cursorRunId:J.cursorRunId,runMessageIds:[],loadedTools:[]}}function r9(J,$,Q=new Date().toISOString()){if(!($.event.type==="run-start"&&$.event.runId!==J.cursorRunId)&&$.seq<=J.seq)return J;return{...e9(J,$.event,Q),seq:$.seq}}function e9(J,$,Q){switch($.type){case"run-start":return{...J,messages:D0(J.messages,$.runId),runId:$.runId,cursorRunId:$.runId,threadId:$.threadId??J.threadId,runMessageIds:[],loadedTools:[],finishReason:void 0,usage:void 0};case"message-start":return y(J,$.messageId,Q,(Z)=>({...Z,role:$.role}));case"text-delta":if(s9(J,$.messageId))return J;return y(J,$.messageId,Q,(Z)=>({...Z,content:N0(Z.content,$.delta)}));case"reasoning-delta":if(s9(J,$.messageId))return J;return y(J,$.messageId,Q,(Z)=>({...Z,content:L0(Z.content,$.delta,$.id)}));case"output-delta":return y(J,$.messageId,Q,(Z)=>({...Z,content:a9(Z.content,{type:"output",value:$.snapshot,partial:!0},(W)=>W.type==="output")}));case"tool-call":return y(J,$.messageId,Q,(Z)=>{let W=Z.content.findIndex((D)=>D.type==="tool-call"&&D.toolCallId===$.part.toolCallId),K=W===-1?void 0:Z.content[W],X=$.part.progress??K?.progress,G=$.part.nested??K?.nested,V=$.part.attachments??K?.attachments,Y={...$.part,...X?{progress:X}:{},...G?{nested:G}:{},...V?{attachments:V}:{}},H=Z.content.slice();if(W===-1)H.push(Y);else H[W]=Y;return{...Z,content:H}});case"tool-call-discard":return y(J,$.messageId,Q,(Z)=>{let W=Z.content.filter((K)=>!(K.type==="tool-call"&&K.partial&&$.toolCallIds.includes(K.toolCallId)));return W.length===Z.content.length?Z:{...Z,content:W}});case"tool-search":{let Z=$.loaded.filter((W)=>!J.loadedTools.includes(W));if(Z.length===0)return J;return{...J,loadedTools:[...J.loadedTools,...Z]}}case"tool-progress":return o9(J,$.toolCallId,(Z)=>({...Z,progress:[...Z.progress??[],$.data]}));case"nested-event":{let Z=$;return o9(J,$.toolCallId,(W)=>{let K=W.nested??[],X=K.findIndex((H)=>H.runId===Z.runId),G=K[X]??{runId:Z.runId,agent:Z.agent,messages:[]},V=B0(G,Z,Q),Y=X===-1?[...K,V]:K.map((H,D)=>D===X?V:H);return{...W,nested:Y}})}case"tool-result":{let Z=y(J,$.messageId,Q,(W)=>({...W,content:a9(W.content,$.part,(K)=>K.type==="tool-result"&&K.toolCallId===$.part.toolCallId)}));return{...Z,pending:Z.pending.filter((W)=>W.toolCallId!==$.part.toolCallId)}}case"message":{let Z=J.messages.findIndex((X)=>X.id===$.message.id),W=J.messages.slice();if(Z===-1)W.push($.message);else W[Z]=$.message;let K=J.runMessageIds.includes($.message.id)?J.runMessageIds:[...J.runMessageIds,$.message.id];return{...J,messages:W,runMessageIds:K}}case"message-id":{let Z=J.messages.findIndex((G)=>G.id===$.localId);if(Z===-1){if(!$.message||J.messages.some((G)=>G.id===$.messageId))return J;return{...J,messages:[...J.messages,$.message]}}let W=J.messages[Z],K={localId:W.localId??W.id,...W.metadata?{metadata:W.metadata}:{}},X=J.messages.some((G)=>G.id===$.messageId)?J.messages.filter((G,V)=>V!==Z).map((G)=>G.id===$.messageId?{...G,...K}:G):J.messages.map((G,V)=>V===Z?{...G,...K,id:$.messageId}:G);return{...J,messages:X}}case"awaiting-input":return{...J,runId:$.runId,pending:[...$.pending]};case"message-end":return y(J,$.messageId,Q,(Z)=>({...Z,finishReason:$.finishReason,...$.outputTruncated?{outputTruncated:!0}:{},...$.usage?{usage:$.usage}:{},content:$.outputTruncated||$.finishReason==="length"?Z.content.filter((W)=>!(W.type==="output"&&W.partial)):Z.content.map((W)=>W.type==="output"&&W.partial?{...W,partial:!1}:W)}));case"usage":return{...J,usage:$.usage};case"error":return{...J,error:$.error,pending:[]};case"run-end":return{...J,runId:void 0,finishReason:$.finishReason,messages:JQ(J,$.finishReason)};default:return J}}function D0(J,$){if(!J.some((Q)=>Q.runId===$&&Q.finishReason===void 0))return J;return J.map((Q)=>{if(Q.runId!==$||Q.finishReason!==void 0)return Q;let{runId:Z,...W}=Q;return{...W,content:[]}})}function JQ(J,$){return J.messages.map((Q)=>Q.role==="assistant"&&J.runMessageIds.includes(Q.id)?F0(Q,$):Q)}function F0(J,$){let Q=J.content.map((W)=>W.type==="tool-call"&&W.nested?.some((K)=>K.finishReason===void 0)?{...W,nested:W.nested.map((K)=>K.finishReason===void 0?P0(K,$):K)}:W);if(J.finishReason===void 0)return{...J,finishReason:$,content:Q};return Q.some((W,K)=>W!==J.content[K])?{...J,content:Q}:J}function P0(J,$){let Q={messages:J.messages,pending:[],error:null,seq:-1,runMessageIds:J.messages.map((Z)=>Z.id),loadedTools:[]};return{...J,finishReason:$,messages:JQ(Q,$)}}function o9(J,$,Q){for(let Z=J.messages.length-1;Z>=0;Z--){let W=J.messages[Z],K=W.content.findIndex((Y)=>Y.type==="tool-call"&&Y.toolCallId===$);if(K===-1)continue;if(W.finishReason!==void 0&&!U0(J,W,$))return J;let X=W.content.slice();X[K]=Q(X[K]);let G=J.messages.slice();G[Z]={...W,content:X};let V=J.runMessageIds.includes(W.id)?J.runMessageIds:[...J.runMessageIds,W.id];return{...J,runMessageIds:V,messages:G}}return J}function B0(J,$,Q){let Z={messages:J.messages,pending:[],error:null,seq:-1,runMessageIds:J.messages.map((K)=>K.id),loadedTools:[],finishReason:J.finishReason},W=e9(Z,$.event,Q);return{...J,...$.label!==void 0?{label:$.label}:{},messages:W.messages,...W.finishReason!==void 0?{finishReason:W.finishReason}:{},...W.usage!==void 0?{usage:W.usage}:{}}}function U0(J,$,Q){if($.finishReason!=="awaiting-input")return!1;return!J.messages.some((Z)=>Z.content.some((W)=>W.type==="tool-result"&&W.toolCallId===Q))}function s9(J,$){let Q=J.messages.find((Z)=>Z.id===$);return Q!==void 0&&Q.finishReason!==void 0}function y(J,$,Q,Z){let W=J.messages.findIndex((G)=>G.id===$),K=J.runMessageIds.includes($)?J.runMessageIds:[...J.runMessageIds,$];if(W===-1){let G={id:$,role:"assistant",content:[],createdAt:Q};return{...J,runMessageIds:K,messages:[...J.messages,Z(G)]}}let X=J.messages.slice();return X[W]=Z(X[W]),{...J,runMessageIds:K,messages:X}}function N0(J,$){let Q=J[J.length-1];if(Q&&Q.type==="text")return[...J.slice(0,-1),{type:"text",text:Q.text+$}];return[...J,{type:"text",text:$}]}function L0(J,$,Q){let Z=J[J.length-1];if(Z&&Z.type==="reasoning"&&Z.id===Q)return[...J.slice(0,-1),{...Z,text:(Z.text??"")+$}];return[...J,Q?{type:"reasoning",id:Q,text:$}:{type:"reasoning",text:$}]}function a9(J,$,Q){let Z=J.findIndex(Q);if(Z===-1)return[...J,$];let W=J.slice();return W[Z]=$,W}class a${store;threadId;report;chain=Promise.resolve();done=new Set;closed=!1;state;runId;constructor(J,$,Q,Z){this.store=J;this.threadId=$;this.report=Z;this.state=t9({messages:Q})}finish(J){if(this.closed)return;this.done.add(J.id),this.write(()=>[s$(J)])}frame(J){if(this.closed)return;let $=J.event;if($.type==="run-start")this.runId=$.runId;switch(this.state=r9(this.state,J),$.type){case"message":this.write(()=>[s$($.message)]);return;case"tool-call":if($.part.partial)return;this.checkpoint($.messageId);return;case"message-start":case"tool-result":this.checkpoint($.messageId);return;default:return}}close(J=[]){this.closed=!0;for(let $ of J)this.done.add($.id)}settled(){return this.chain}checkpoint(J){if(this.done.has(J))return;let $=this.state.messages.find((Z)=>Z.id===J);if(!$)return;let Q=this.runId;this.write(()=>{let Z=s$($);if(Z.finishReason===void 0&&Q)Z.runId=Q;return[Z]})}write(J){let $;try{$=J()}catch(Q){this.report(Q);return}this.chain=this.chain.then(()=>this.store.appendMessages(this.threadId,$)).catch((Q)=>this.report(Q))}}function s$(J){return structuredClone(J)}async function $Q(J,$){let Q=[],Z=null,W=J.slice();for(let K=0;K<W.length;K++){let X=W[K];if(X.role!=="assistant"||X.finishReason!==void 0)continue;if(X.runId&&await $(X.runId))continue;Z??=new Set(J.flatMap((Y)=>Y.content.flatMap((H)=>H.type==="tool-result"?[H.toolCallId]:[])));let G=X.content.map((Y)=>Y.type==="tool-call"?QQ(Y):Y);for(let Y of X.content){if(Y.type!=="tool-call"||Z.has(Y.toolCallId))continue;let H={type:"tool-result",toolCallId:Y.toolCallId,name:Y.name,status:"denied",cause:"interrupted"};G.push(H)}let V={...X,content:G,finishReason:"interrupted"};W[K]=V,Q.push(V)}return{messages:W,settled:Q}}function QQ(J){let{partial:$,...Q}=J;if(!Q.nested?.some((Z)=>Z.finishReason===void 0))return Q;return{...Q,nested:Q.nested.map(C0)}}function C0(J){if(J.finishReason!==void 0)return J;return{...J,finishReason:"interrupted",messages:J.messages.map(($)=>$.role==="assistant"&&$.finishReason===void 0?{...$,finishReason:"interrupted",content:$.content.map((Q)=>Q.type==="tool-call"?QQ(Q):Q)}:$)}}var O0=50,_0=["running","ok","error"];async function KQ(J,$){let{store:Q,threadId:Z}=$,W=Math.max(O0,$.scan??0),K=await Q.listForThread(Z,{limit:W}),X,G=async(F)=>{if(F.state!=="running")return F;if(X??=await ZQ(Q),F.deadlineAt>X)return F;return await WQ(Q,F),await Q.get(F.id)??F};for(let F=0;F<K.length;F++)K[F]=await G(K[F]);let V=new Map(K.map((F)=>[F.id,F])),Y=J.slice(),H=[],D=new Set;for(let F=0;F<Y.length;F++){let N=Y[F],B=null;for(let U=0;U<N.content.length;U++){let P=N.content[U];if(P.type==="tool-call")D.add(P.toolCallId);if(P.type!=="tool-result"||P.status!=="running")continue;let L=P.job?.id,C=L?V.get(L):void 0;if(L&&C===void 0){let q=await Q.get(L);if(C=q?await G(q):void 0,C)V.set(L,C)}if(C?.state==="running")continue;B??=N.content.slice(),B[U]=M0(P,C,$.outputSchemaFor,$.modelOutputFor)}if(B){let U={...N,content:B};Y[F]=U,H.push(U)}}let z=[];for(let F of K){if(F.orphaned||D.has(F.toolCallId))continue;if(await $.isRunLive(F.runId))continue;z.push(F)}return{messages:Y,settled:H,orphans:z,jobs:K}}async function XQ(J,$,Q){for(let Z of $)try{await J.transition(Z.id,_0,{orphaned:!0})}catch(W){Q(W)}}function M0(J,$,Q,Z){let W={type:"tool-result",toolCallId:J.toolCallId,name:J.name},K=(V,Y)=>{let H=Z?.(String(J.name),V);return{...W,status:"ok",job:Y,output:V,...H!==void 0?{modelOutput:H}:{}}};if(!$)return{...W,status:"error",job:J.job,error:{code:"tool_error",message:`The background job for "${String(J.name)}" can no longer be found, so its result was lost. It may have run in part or in full: check its effects before repeating it.`,toolCallId:J.toolCallId,retryable:!0}};let X={id:$.id,...$.summary!==void 0?{summary:$.summary}:{},...$.usage?{usage:$.usage}:{}};if($.state==="error")return{...W,status:"error",job:X,error:$.error??{code:"tool_error",message:`The background job for "${String(J.name)}" failed.`,toolCallId:J.toolCallId,retryable:!0}};let G=Q?.(String(J.name));if(G){let V=G.safeParse($.output);if(V.ok===!1)return{...W,status:"error",job:X,error:{code:"invalid_tool_result",message:`The background job for "${String(J.name)}" finished with an output that does not match the tool's output schema: ${V.errors.join(", ")}`,toolCallId:J.toolCallId,retryable:!0}};return K(V.value,X)}return K($.output,X)}class rJ extends Error{status;code;kind;constructor(J,$){super(J);this.name="AgentTurnError",this.status=$.status,this.code=$.code,this.kind=$.kind}static async from(J){let $={};try{let Z=await J.json();if(Z?.error&&typeof Z.error==="object")$=Z.error}catch{}let Q=(Z)=>typeof $[Z]==="string"?$[Z]:void 0;return new rJ(Q("message")??`The agent turn was refused with status ${J.status}.`,{status:J.status,code:Q("code"),kind:Q("kind")})}}function S0(J){for(let $=J.length-1;$>=0;$--){let Q=J[$];if(Q.role!=="assistant")continue;return Q.content.map((Z)=>Z.type==="text"?Z.text:"").join("")}return""}var A0=NQ,pJ=new Map,YQ=new WeakMap,BJ=new WeakMap,GQ="http://gemi.internal/__gemi/agent-turn",lJ=new Map,R0=4194304,E0=1000,T0=5,dJ=65536,iJ=()=>{};class wQ{byKey=new Map;take(J,$,Q){let Z=this.byKey.get(J);if(!Z?.has($)&&(Z?.size??0)>=Q)return null;if(!Z)Z=new Map,this.byKey.set(J,Z);Z.set($,(Z.get($)??0)+1);let W=!1;return()=>{if(W)return;W=!0;let K=this.byKey.get(J),X=(K?.get($)??1)-1;if(!K)return;if(X>0)K.set($,X);else if(K.delete($),K.size===0)this.byKey.delete(J)}}}var VQ=new WeakMap;function k0(J){let $=VQ.get(J);if(!$)$=new wQ,VQ.set(J,$);return $}function j0(J){return J}class X8 extends A0{static kind="agent-controller";hooks;store=o$;liveRuns=m$;voice;voiceStore=u$;attachments=tJ;attachmentStorage=OQ;fileOwners=p$;nonces=Z8;receipts;requireKnownFiles=!1;hookHoldMs=30000;instructions(J,$){return this.hooks?.instructions?.(J,$)}reasoning(J,$){return this.hooks?.reasoning?.(J,$)}skills(J,$){return this.hooks?.skills?.(J,$)}runTools(J,$){return this.hooks?.runTools?.(J,$)}usageLimits(J,$){return this.hooks?.usageLimits?.(J,$)}context(J,$){let Q=this.hooks?.context;if(Q)return Q(J,$);return{}}memoryScopes(J,$){let Q=this.hooks?.memoryScopes;if(Q)return Q(J,$);return{}}memoryMaxTokens=void 0;requireThread=!1;maxBodyBytes=R0;maxHistoryMessages=E0;contextWindow=void 0;prepareStep(J,$){return this.hooks?.prepareStep?.(J,$)}maxConcurrentRuns=T0;runLimitKey(J,$){let Q=this.hooks?.runLimitKey;if(Q)return Q(J,$);return $.owner}authorizeRequest(J,$){let Q=this.hooks?.authorizeRequest;if(Q)return Q(J,$);return this.resource?.authorize(J,$)}resource;runOwner(J){let $=this.hooks?.runOwner;if($)return $(J);let Q=J.ctx?.()?.user,Z=Q?.id??Q?.publicId;if(Z!==void 0&&Z!==null&&String(Z)!=="")return`user:${String(Z)}`;return null}static async startTurn(J){let{threadId:$}=J;if(typeof $!=="string"||$==="")throw TypeError("AgentController.startTurn needs a `threadId`: a server turn is stored on a thread. Create one with the store's `createThread`.");let Q={...J.turn,...J.text!==void 0?{text:J.text}:{}},Z={...J.body,threadId:$,turn:Q},W=new w(new Request(GQ,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(Z)}),{},"api",new URL(GQ).pathname),K=new this;BJ.set(W,null);let X=await c.run(W,()=>K.stream(W),{user:J.user??null}),G=BJ.get(W);if(!G)throw await rJ.from(X);BJ.delete(W),X.body?.cancel().catch(iJ);let{run:V,hooks:Y}=G,H=[],D=(async()=>{for await(let F of V)if(F.type==="awaiting-input")H=F.pending})().catch(iJ),z;return{runId:V.runId,threadId:$,run:V,stop:(F)=>V.stop(F),result:()=>z??=(async()=>{let F=await V.result();await Promise.all([Y,D]);let N=F.messages;return{...F,threadId:$,text:S0(N),pending:F.finishReason==="awaiting-input"?H:[]}})()}}async stream(J=new w){let $=await UJ(J,this.maxBodyBytes);if($.error)return $J($);let Q=$.body,Z=typeof Q.threadId==="string"?Q.threadId:void 0,W=y0(Q);if(W.error)return $J({body:{},error:W.error});let K=W.turn,X=Z!==void 0&&Q.regenerate===!0,G=typeof Q.clientRunId==="string"?Q.clientRunId:void 0,V=nJ(Q);if(this.requireThread&&!Z)return R(400,{code:"thread_required",message:"This agent takes a turn only on a thread: send a threadId."});if(X&&!this.store.removeMessages)return R(501,{code:"regenerate_unsupported",message:"This agent's store cannot remove messages, so a thread's answer cannot be regenerated. Implement `removeMessages` on the AgentStore."});if(!Z&&Array.isArray(Q.messages)&&Q.messages.length>this.maxHistoryMessages)return $8(413,"history_too_long",`The conversation has ${Q.messages.length} messages; this agent takes at most ${this.maxHistoryMessages}.`);let Y=await this.runOwner(J),H=G?{cancelled:!1,owner:Y}:null;if(H)lJ.set(G,H);let D=null,z=[],F=async()=>{try{return await N()}finally{if(Z&&z.length>0&&D===null)await this.store.appendMessages(Z,z).catch((B)=>this.reportHookFailure(B))}},N=async()=>{let B,U=null;if(Z){let j=await this.store.loadThread(Z);if(!j)return R(404,{code:"thread_not_found",message:`Thread ${Z} does not exist here, or has expired.`});let n=await this.settleThread(Z,j,{write:!0});if(B=n.messages,U=this.jobsBlock(n.jobs),X){let QJ=c0(B);if(!QJ)return R(409,{code:"nothing_to_regenerate",message:`Thread ${Z} has no user turn to answer again.`});z=B.slice(QJ.index),await this.store.removeMessages(Z,z.map((hQ)=>hQ.id)),B=B.slice(0,QJ.index),K=K?.localId?{...QJ.turn,localId:K.localId}:QJ.turn}}else B=Array.isArray(Q.messages)?Q.messages:[],s0(this.nonces);let P=[await this.instructions(J,{body:V})||void 0,U??void 0].filter(Boolean).join(`
263
+ return 0`;class o${injectedClient;prefix;constructor(J={}){this.injectedClient=J.client,this.prefix=J.prefix??"gemi:ai:receipt"}async claim(J,$){let Q=await this.client.send("EVAL",[_0,"1",this.key(J),o9,s9($)]);if(Q==="claimed")return{status:"claimed"};let Z=String(Q??"");if(Z.startsWith(d$))return{status:"replay",result:JSON.parse(Z.slice(d$.length))};return{status:"blocked"}}async complete(J,$,Q){await this.client.send("SET",[this.key(J),d$+JSON.stringify($),"PX",s9(Q)])}async release(J){await this.client.send("EVAL",[M0,"1",this.key(J),o9])}key(J){return`${this.prefix}:${J}`}get client(){if(this.injectedClient)return this.injectedClient;let J=a9(),$=J.bound(i$)?J.make(i$).client:void 0;if(!$)throw Error("RedisReceiptStore could not reach the Redis client. Register RedisServiceProvider on your application, or pass a client: new RedisReceiptStore({ client }).");return $}}function s9(J){return String(Math.max(1,Math.ceil(J-Date.now())))}var S0=86400000,A0=60000;class LJ{ttlMs;clientOwnedIds;scope=null;threads=new Map;lastSweep=0;constructor(J={}){this.ttlMs=J.ttlMs??S0,this.clientOwnedIds=J.clientOwnedIds??!1}forScope(J){if(typeof J!=="string"||J==="")throw TypeError("A MemoryAgentStore scope is a non-empty string.");let $=new LJ({ttlMs:this.ttlMs,clientOwnedIds:this.clientOwnedIds});return $.threads=this.threads,$.scope=J,$}visible(J){let $=this.threads.get(J);if(!$||this.scope===null||$.scope===this.scope)return $;return}fresh(){return{messages:[],touchedAt:Date.now(),...this.scope!==null?{scope:this.scope}:{}}}async createThread(J){let $=crypto.randomUUID();return this.threads.set($,this.fresh()),this.sweep(),{threadId:$}}async loadThread(J){this.sweep();let $=this.visible(J);if(!$){if(this.threads.has(J))return null;return this.clientOwnedIds?[]:null}return $.touchedAt=Date.now(),$.messages.slice()}async appendMessages(J,$){this.sweep();let Q=this.visible(J);if(!Q){if(!this.clientOwnedIds||this.threads.has(J))throw Error(`Thread ${J} does not exist here, or has expired.`);Q=this.fresh(),this.threads.set(J,Q)}for(let Z of $){let W=JSON.parse(JSON.stringify(Z)),K=Q.messages.findIndex((X)=>X.id===W.id);if(K===-1)Q.messages.push(W);else Q.messages[K]=W}Q.touchedAt=Date.now()}async removeMessages(J,$){this.sweep();let Q=this.visible(J);if(!Q)return;let Z=new Set($);Q.messages=Q.messages.filter((W)=>!Z.has(W.id)),Q.touchedAt=Date.now()}async loadSummaries(J){return this.visible(J)?.summaries?.slice()??[]}async saveSummary(J,$){let Q=this.visible(J);if(!Q)return;Q.summaries=NJ(Q.summaries??[],$)}delete(J){if(this.visible(J))this.threads.delete(J)}get size(){return this.threads.size}sweep(J=Date.now()){if(J-this.lastSweep<A0)return;this.lastSweep=J;for(let[$,Q]of this.threads)if(J-Q.touchedAt>this.ttlMs)this.threads.delete($)}}var s$=new LJ;function JQ(J={}){return{messages:J.messages?[...J.messages]:[],pending:J.pending?[...J.pending]:[],error:null,threadId:J.threadId,seq:J.seq??-1,cursorRunId:J.cursorRunId,runMessageIds:[],loadedTools:[]}}function $Q(J,$,Q=new Date().toISOString()){if(!($.event.type==="run-start"&&$.event.runId!==J.cursorRunId)&&$.seq<=J.seq)return J;return{...QQ(J,$.event,Q),seq:$.seq}}function QQ(J,$,Q){switch($.type){case"run-start":return{...J,messages:R0(J.messages,$.runId),runId:$.runId,cursorRunId:$.runId,threadId:$.threadId??J.threadId,runMessageIds:[],loadedTools:[],finishReason:void 0,usage:void 0};case"message-start":return h(J,$.messageId,Q,(Z)=>({...Z,role:$.role}));case"text-delta":if(r9(J,$.messageId))return J;return h(J,$.messageId,Q,(Z)=>({...Z,content:x0(Z.content,$.delta)}));case"reasoning-delta":if(r9(J,$.messageId))return J;return h(J,$.messageId,Q,(Z)=>({...Z,content:w0(Z.content,$.delta,$.id)}));case"output-delta":return h(J,$.messageId,Q,(Z)=>({...Z,content:e9(Z.content,{type:"output",value:$.snapshot,partial:!0},(W)=>W.type==="output")}));case"tool-call":return h(J,$.messageId,Q,(Z)=>{let W=Z.content.findIndex((D)=>D.type==="tool-call"&&D.toolCallId===$.part.toolCallId),K=W===-1?void 0:Z.content[W],X=$.part.progress??K?.progress,Y=$.part.nested??K?.nested,V=$.part.attachments??K?.attachments,G={...$.part,...X?{progress:X}:{},...Y?{nested:Y}:{},...V?{attachments:V}:{}},H=Z.content.slice();if(W===-1)H.push(G);else H[W]=G;return{...Z,content:H}});case"tool-call-discard":return h(J,$.messageId,Q,(Z)=>{let W=Z.content.filter((K)=>!(K.type==="tool-call"&&K.partial&&$.toolCallIds.includes(K.toolCallId)));return W.length===Z.content.length?Z:{...Z,content:W}});case"tool-search":{let Z=$.loaded.filter((W)=>!J.loadedTools.includes(W));if(Z.length===0)return J;return{...J,loadedTools:[...J.loadedTools,...Z]}}case"tool-progress":return t9(J,$.toolCallId,(Z)=>({...Z,progress:[...Z.progress??[],$.data]}));case"nested-event":{let Z=$;return t9(J,$.toolCallId,(W)=>{let K=W.nested??[],X=K.findIndex((H)=>H.runId===Z.runId),Y=K[X]??{runId:Z.runId,agent:Z.agent,messages:[]},V=k0(Y,Z,Q),G=X===-1?[...K,V]:K.map((H,D)=>D===X?V:H);return{...W,nested:G}})}case"tool-result":{let Z=h(J,$.messageId,Q,(W)=>({...W,content:e9(W.content,$.part,(K)=>K.type==="tool-result"&&K.toolCallId===$.part.toolCallId)}));return{...Z,pending:Z.pending.filter((W)=>W.toolCallId!==$.part.toolCallId)}}case"message":{let Z=J.messages.findIndex((X)=>X.id===$.message.id),W=J.messages.slice();if(Z===-1)W.push($.message);else W[Z]=$.message;let K=J.runMessageIds.includes($.message.id)?J.runMessageIds:[...J.runMessageIds,$.message.id];return{...J,messages:W,runMessageIds:K}}case"message-id":{let Z=J.messages.findIndex((Y)=>Y.id===$.localId);if(Z===-1){if(!$.message||J.messages.some((Y)=>Y.id===$.messageId))return J;return{...J,messages:[...J.messages,$.message]}}let W=J.messages[Z],K={localId:W.localId??W.id,...W.metadata?{metadata:W.metadata}:{}},X=J.messages.some((Y)=>Y.id===$.messageId)?J.messages.filter((Y,V)=>V!==Z).map((Y)=>Y.id===$.messageId?{...Y,...K}:Y):J.messages.map((Y,V)=>V===Z?{...Y,...K,id:$.messageId}:Y);return{...J,messages:X}}case"awaiting-input":return{...J,runId:$.runId,pending:[...$.pending]};case"message-end":return h(J,$.messageId,Q,(Z)=>({...Z,finishReason:$.finishReason,...$.outputTruncated?{outputTruncated:!0}:{},...$.usage?{usage:$.usage}:{},content:$.outputTruncated||$.finishReason==="length"?Z.content.filter((W)=>!(W.type==="output"&&W.partial)):Z.content.map((W)=>W.type==="output"&&W.partial?{...W,partial:!1}:W)}));case"usage":return{...J,usage:$.usage};case"error":return{...J,error:$.error,pending:[]};case"run-end":return{...J,runId:void 0,finishReason:$.finishReason,messages:ZQ(J,$.finishReason)};default:return J}}function R0(J,$){if(!J.some((Q)=>Q.runId===$&&Q.finishReason===void 0))return J;return J.map((Q)=>{if(Q.runId!==$||Q.finishReason!==void 0)return Q;let{runId:Z,...W}=Q;return{...W,content:[]}})}function ZQ(J,$){return J.messages.map((Q)=>Q.role==="assistant"&&J.runMessageIds.includes(Q.id)?E0(Q,$):Q)}function E0(J,$){let Q=J.content.map((W)=>W.type==="tool-call"&&W.nested?.some((K)=>K.finishReason===void 0)?{...W,nested:W.nested.map((K)=>K.finishReason===void 0?j0(K,$):K)}:W);if(J.finishReason===void 0)return{...J,finishReason:$,content:Q};return Q.some((W,K)=>W!==J.content[K])?{...J,content:Q}:J}function j0(J,$){let Q={messages:J.messages,pending:[],error:null,seq:-1,runMessageIds:J.messages.map((Z)=>Z.id),loadedTools:[]};return{...J,finishReason:$,messages:ZQ(Q,$)}}function t9(J,$,Q){for(let Z=J.messages.length-1;Z>=0;Z--){let W=J.messages[Z],K=W.content.findIndex((G)=>G.type==="tool-call"&&G.toolCallId===$);if(K===-1)continue;if(W.finishReason!==void 0&&!T0(J,W,$))return J;let X=W.content.slice();X[K]=Q(X[K]);let Y=J.messages.slice();Y[Z]={...W,content:X};let V=J.runMessageIds.includes(W.id)?J.runMessageIds:[...J.runMessageIds,W.id];return{...J,runMessageIds:V,messages:Y}}return J}function k0(J,$,Q){let Z={messages:J.messages,pending:[],error:null,seq:-1,runMessageIds:J.messages.map((K)=>K.id),loadedTools:[],finishReason:J.finishReason},W=QQ(Z,$.event,Q);return{...J,...$.label!==void 0?{label:$.label}:{},messages:W.messages,...W.finishReason!==void 0?{finishReason:W.finishReason}:{},...W.usage!==void 0?{usage:W.usage}:{}}}function T0(J,$,Q){if($.finishReason!=="awaiting-input")return!1;return!J.messages.some((Z)=>Z.content.some((W)=>W.type==="tool-result"&&W.toolCallId===Q))}function r9(J,$){let Q=J.messages.find((Z)=>Z.id===$);return Q!==void 0&&Q.finishReason!==void 0}function h(J,$,Q,Z){let W=J.messages.findIndex((Y)=>Y.id===$),K=J.runMessageIds.includes($)?J.runMessageIds:[...J.runMessageIds,$];if(W===-1){let Y={id:$,role:"assistant",content:[],createdAt:Q};return{...J,runMessageIds:K,messages:[...J.messages,Z(Y)]}}let X=J.messages.slice();return X[W]=Z(X[W]),{...J,runMessageIds:K,messages:X}}function x0(J,$){let Q=J[J.length-1];if(Q&&Q.type==="text")return[...J.slice(0,-1),{type:"text",text:Q.text+$}];return[...J,{type:"text",text:$}]}function w0(J,$,Q){let Z=J[J.length-1];if(Z&&Z.type==="reasoning"&&Z.id===Q)return[...J.slice(0,-1),{...Z,text:(Z.text??"")+$}];return[...J,Q?{type:"reasoning",id:Q,text:$}:{type:"reasoning",text:$}]}function e9(J,$,Q){let Z=J.findIndex(Q);if(Z===-1)return[...J,$];let W=J.slice();return W[Z]=$,W}class t${store;threadId;report;chain=Promise.resolve();done=new Set;closed=!1;state;runId;constructor(J,$,Q,Z){this.store=J;this.threadId=$;this.report=Z;this.state=JQ({messages:Q})}finish(J){if(this.closed)return;this.done.add(J.id),this.write(()=>[a$(J)])}frame(J){if(this.closed)return;let $=J.event;if($.type==="run-start")this.runId=$.runId;switch(this.state=$Q(this.state,J),$.type){case"message":this.write(()=>[a$($.message)]);return;case"tool-call":if($.part.partial)return;this.checkpoint($.messageId);return;case"message-start":case"tool-result":this.checkpoint($.messageId);return;default:return}}close(J=[]){this.closed=!0;for(let $ of J)this.done.add($.id)}settled(){return this.chain}checkpoint(J){if(this.done.has(J))return;let $=this.state.messages.find((Z)=>Z.id===J);if(!$)return;let Q=this.runId;this.write(()=>{let Z=a$($);if(Z.finishReason===void 0&&Q)Z.runId=Q;return[Z]})}write(J){let $;try{$=J()}catch(Q){this.report(Q);return}this.chain=this.chain.then(()=>this.store.appendMessages(this.threadId,$)).catch((Q)=>this.report(Q))}}function a$(J){return structuredClone(J)}async function WQ(J,$){let Q=[],Z=null,W=J.slice();for(let K=0;K<W.length;K++){let X=W[K];if(X.role!=="assistant"||X.finishReason!==void 0)continue;if(X.runId&&await $(X.runId))continue;Z??=new Set(J.flatMap((G)=>G.content.flatMap((H)=>H.type==="tool-result"?[H.toolCallId]:[])));let Y=X.content.map((G)=>G.type==="tool-call"?KQ(G):G);for(let G of X.content){if(G.type!=="tool-call"||Z.has(G.toolCallId))continue;let H={type:"tool-result",toolCallId:G.toolCallId,name:G.name,status:"denied",cause:"interrupted"};Y.push(H)}let V={...X,content:Y,finishReason:"interrupted"};W[K]=V,Q.push(V)}return{messages:W,settled:Q}}function KQ(J){let{partial:$,...Q}=J;if(!Q.nested?.some((Z)=>Z.finishReason===void 0))return Q;return{...Q,nested:Q.nested.map(I0)}}function I0(J){if(J.finishReason!==void 0)return J;return{...J,finishReason:"interrupted",messages:J.messages.map(($)=>$.role==="assistant"&&$.finishReason===void 0?{...$,finishReason:"interrupted",content:$.content.map((Q)=>Q.type==="tool-call"?KQ(Q):Q)}:$)}}var q0=50,b0=["running","ok","error"];async function YQ(J,$){let{store:Q,threadId:Z}=$,W=Math.max(q0,$.scan??0),K=await Q.listForThread(Z,{limit:W}),X,Y=async(F)=>{if(F.state!=="running")return F;if(X??=await XQ(Q),F.deadlineAt>X)return F;return await GQ(Q,F),await Q.get(F.id)??F};for(let F=0;F<K.length;F++)K[F]=await Y(K[F]);let V=new Map(K.map((F)=>[F.id,F])),G=J.slice(),H=[],D=new Set;for(let F=0;F<G.length;F++){let B=G[F],P=null;for(let N=0;N<B.content.length;N++){let U=B.content[N];if(U.type==="tool-call")D.add(U.toolCallId);if(U.type!=="tool-result"||U.status!=="running")continue;let L=U.job?.id,C=L?V.get(L):void 0;if(L&&C===void 0){let w=await Q.get(L);if(C=w?await Y(w):void 0,C)V.set(L,C)}if(C?.state==="running")continue;P??=B.content.slice(),P[N]=f0(U,C,$.outputSchemaFor,$.modelOutputFor)}if(P){let N={...B,content:P};G[F]=N,H.push(N)}}let z=[];for(let F of K){if(F.orphaned||D.has(F.toolCallId))continue;if(await $.isRunLive(F.runId))continue;z.push(F)}return{messages:G,settled:H,orphans:z,jobs:K}}async function VQ(J,$,Q){for(let Z of $)try{await J.transition(Z.id,b0,{orphaned:!0})}catch(W){Q(W)}}function f0(J,$,Q,Z){let W={type:"tool-result",toolCallId:J.toolCallId,name:J.name},K=(V,G)=>{let H=Z?.(String(J.name),V);return{...W,status:"ok",job:G,output:V,...H!==void 0?{modelOutput:H}:{}}};if(!$)return{...W,status:"error",job:J.job,error:{code:"tool_error",message:`The background job for "${String(J.name)}" can no longer be found, so its result was lost. It may have run in part or in full: check its effects before repeating it.`,toolCallId:J.toolCallId,retryable:!0}};let X={id:$.id,...$.summary!==void 0?{summary:$.summary}:{},...$.usage?{usage:$.usage}:{}};if($.state==="error")return{...W,status:"error",job:X,error:$.error??{code:"tool_error",message:`The background job for "${String(J.name)}" failed.`,toolCallId:J.toolCallId,retryable:!0}};let Y=Q?.(String(J.name));if(Y){let V=Y.safeParse($.output);if(V.ok===!1)return{...W,status:"error",job:X,error:{code:"invalid_tool_result",message:`The background job for "${String(J.name)}" finished with an output that does not match the tool's output schema: ${V.errors.join(", ")}`,toolCallId:J.toolCallId,retryable:!0}};return K(V.value,X)}return K($.output,X)}var y0=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,63}$/;class rJ extends Error{status;code;kind;constructor(J,$){super(J);this.name="AgentTurnError",this.status=$.status,this.code=$.code,this.kind=$.kind}static async from(J){let $={};try{let Z=await J.json();if(Z?.error&&typeof Z.error==="object")$=Z.error}catch{}let Q=(Z)=>typeof $[Z]==="string"?$[Z]:void 0;return new rJ(Q("message")??`The agent turn was refused with status ${J.status}.`,{status:J.status,code:Q("code"),kind:Q("kind")})}}function v0(J){for(let $=J.length-1;$>=0;$--){let Q=J[$];if(Q.role!=="assistant")continue;return Q.content.map((Z)=>Z.type==="text"?Z.text:"").join("")}return""}var h0=RQ,CJ=new Map,r$=new WeakMap,QJ=new WeakMap,HQ=new WeakMap,zQ=new WeakMap,e$=new WeakMap,lQ="thread_busy",DQ="http://gemi.internal/__gemi/agent-turn",iJ=new Map,g0=4194304,u0=1000,c0=5,OJ=65536,WJ=()=>{};class dQ{byKey=new Map;take(J,$,Q){let Z=this.byKey.get(J);if(!Z?.has($)&&(Z?.size??0)>=Q)return null;if(!Z)Z=new Map,this.byKey.set(J,Z);Z.set($,(Z.get($)??0)+1);let W=!1;return()=>{if(W)return;W=!0;let K=this.byKey.get(J),X=(K?.get($)??1)-1;if(!K)return;if(X>0)K.set($,X);else if(K.delete($),K.size===0)this.byKey.delete(J)}}}var FQ=new WeakMap,$8=new WeakMap;function m0(J){let $=$8.get(J);if(!$)$=new Map,$8.set(J,$);return $}function p0(J,$,Q){let Z=$8.get(J)?.get($);if(!Z)return;for(let W of[...Z])try{W(Q)}catch{}}function l0(J){let $=FQ.get(J);if(!$)$=new dQ,FQ.set(J,$);return $}function d0(J){return J}class H8 extends h0{static kind="agent-controller";hooks;store=s$;storeScope(J,$){return null}boundScope=void 0;async threadInScope(J,$){if(await this.scopeStore(J,{}),this.boundScope===null)return!0;return await this.store.loadThread($)!==null}async scopeStore(J,$){let Z=HQ.get(J)??await this.storeScope(J,{body:$})??null;if(this.boundScope!==void 0){if(this.boundScope!==Z)throw Error("This AgentController instance already served a request in another store scope. Build a controller per request (the router and startTurn do).");return}if(Z!==null)this.store=SQ(this.store,Z);this.boundScope=Z}liveRuns=p$;voice;voiceStore=u$;attachments=tJ;attachmentStorage=kQ;fileOwners=l$;nonces=G8;receipts;requireKnownFiles=!1;hookHoldMs=30000;instructions(J,$){return this.hooks?.instructions?.(J,$)}reasoning(J,$){return this.hooks?.reasoning?.(J,$)}skills(J,$){return this.hooks?.skills?.(J,$)}runTools(J,$){return this.hooks?.runTools?.(J,$)}usageLimits(J,$){return this.hooks?.usageLimits?.(J,$)}context(J,$){let Q=this.hooks?.context;if(Q)return Q(J,$);return{}}memoryScopes(J,$){let Q=this.hooks?.memoryScopes;if(Q)return Q(J,$);return{}}memoryMaxTokens=void 0;requireThread=!1;maxBodyBytes=g0;maxHistoryMessages=u0;contextWindow=void 0;prepareStep(J,$){return this.hooks?.prepareStep?.(J,$)}maxConcurrentRuns=c0;runLimitKey(J,$){let Q=this.hooks?.runLimitKey;if(Q)return Q(J,$);return $.owner}authorizeRequest(J,$){let Q=this.hooks?.authorizeRequest;if(Q)return Q(J,$);return this.resource?.authorize(J,$)}resource;runOwner(J){let $=this.hooks?.runOwner;if($)return $(J);let Q=J.ctx?.()?.user,Z=Q?.id??Q?.publicId;if(Z!==void 0&&Z!==null&&String(Z)!=="")return`user:${String(Z)}`;return null}static async startTurn(J){let{threadId:$}=J;if(typeof $!=="string"||$==="")throw TypeError("AgentController.startTurn needs a `threadId`: a server turn is stored on a thread. Create one with the store's `createThread`.");let Q=J.ifBusy??"supersede";if(Q!=="supersede"&&Q!=="queue"&&Q!=="skip")throw TypeError(`AgentController.startTurn's \`ifBusy\` is "supersede", "queue" or "skip"; got ${JSON.stringify(J.ifBusy)}.`);let Z=J.event===void 0?void 0:Z6(J),W={...J.turn,...J.text!==void 0?{text:J.text}:{}},K={...J.body,threadId:$,turn:W},X=new q(new Request(DQ,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(K)}),{},"api",new URL(DQ).pathname),Y=new this;if(QJ.set(X,null),J.scope!==void 0)HQ.set(X,J.scope);if(zQ.set(X,Q),Z)e$.set(X,Z);let V=await c.run(X,()=>Y.stream(X),{user:J.user??null}),G=QJ.get(X);if(!G){let P=await rJ.from(V);if(Q==="skip"&&P.code===lQ)return{skipped:!0,threadId:$};throw P}QJ.delete(X),V.body?.cancel().catch(WJ);let{run:H,hooks:D}=G,z=[],F=(async()=>{for await(let P of H)if(P.type==="awaiting-input")z=P.pending})().catch(WJ),B;return{runId:H.runId,threadId:$,run:H,stop:(P)=>H.stop(P),result:()=>B??=(async()=>{let P=await H.result();await Promise.all([D,F]);let N=P.messages;return{...P,threadId:$,text:v0(N),pending:P.finishReason==="awaiting-input"?z:[]}})()}}async stream(J=new q){let $=await ZJ(J,this.maxBodyBytes);if($.error)return n($);let Q=$.body,Z=typeof Q.threadId==="string"?Q.threadId:void 0,W=e0(Q);if(W.error)return n({body:{},error:W.error});let K=W.turn,X=Z!==void 0&&Q.regenerate===!0,Y=typeof Q.clientRunId==="string"?Q.clientRunId:void 0,V=nJ(Q);if(this.requireThread&&!Z)return A(400,{code:"thread_required",message:"This agent takes a turn only on a thread: send a threadId."});if(await this.scopeStore(J,V),X&&!this.store.removeMessages)return A(501,{code:"regenerate_unsupported",message:"This agent's store cannot remove messages, so a thread's answer cannot be regenerated. Implement `removeMessages` on the AgentStore."});if(!Z&&Array.isArray(Q.messages)&&Q.messages.length>this.maxHistoryMessages)return K8(413,"history_too_long",`The conversation has ${Q.messages.length} messages; this agent takes at most ${this.maxHistoryMessages}.`);let G=await this.runOwner(J),H=Y?{cancelled:!1,owner:G}:null;if(H)iJ.set(Y,H);let D=null,z=[],F=async()=>{try{return await B()}finally{if(Z&&z.length>0&&D===null)await this.store.appendMessages(Z,z).catch((P)=>this.reportHookFailure(P))}},B=async()=>{let P,N=null;if(Z){let T=await this.store.loadThread(Z);if(!T)return A(404,{code:"thread_not_found",message:`Thread ${Z} does not exist here, or has expired.`});let o=await this.settleThread(Z,T,{write:!0});if(P=o.messages,N=this.jobsBlock(o.jobs),X){let KJ=Q6(P);if(!KJ)return A(409,{code:"nothing_to_regenerate",message:`Thread ${Z} has no user turn to answer again.`});z=P.slice(KJ.index),await this.store.removeMessages(Z,z.map((aQ)=>aQ.id)),P=P.slice(0,KJ.index),K=K?.localId?{...KJ.turn,localId:K.localId}:KJ.turn}}else P=Array.isArray(Q.messages)?Q.messages:[],z6(this.nonces);let U=[await this.instructions(J,{body:V})||void 0,N??void 0].filter(Boolean).join(`
241
264
 
242
- `)||void 0,L=await this.context(J,{body:V}),C=await this.reasoning(J,{body:V})||void 0,q=await this.skills(J,{body:V})||void 0,A=await this.runTools(J,{body:V,context:L})||void 0,M=await this.usageLimits(J,{body:V,context:L})||void 0,O=await this.attachmentsFor(J,Z,{body:V}),I=this.agent.memory?await this.memoryScopes(J,{body:V}):void 0;if(H?.cancelled)return PQ();let _=Z?new a$(this.store,Z,B,(j)=>this.reportHookFailure(j)):null,T=`run_${crypto.randomUUID()}`,S={req:J,runId:T,threadId:Z},LJ={id:null,notified:Promise.resolve()},h=this.agent.stream({runId:T,messages:B,turn:K,threadId:Z,..._?{onMessage:(j)=>_.finish(j)}:{},onTurn:(j)=>{if(LJ.id!==null)return;LJ.id=j.id;let n=_?_.settled():Promise.resolve();LJ.notified=n.then(()=>this.safely(()=>this.onMessage(j,S)))},instructions:P,...C?{reasoning:C}:{},...q&&q.length>0?{skills:q}:{},...A?.tools&&A.tools.length>0?{tools:A.tools}:{},...A?.activeTools?{activeTools:A.activeTools}:{},...M?{usageLimits:M}:{},context:L,attachments:O,body:V,redactError:(j,n)=>this.redactError(j,n,S),nonces:this.nonces,receipts:this.receipts,subject:Y,...I?{memory:{scopes:I,...this.memoryMaxTokens!==void 0?{maxTokens:this.memoryMaxTokens}:{}}}:{},...Z?{jobs:{owner:Y}}:{},...this.contextWindow!==void 0?{contextWindow:this.contextWindow}:{},...Z&&xQ(this.store)?{summaryStore:this.store}:{},...this.prepareStep!==X8.prototype.prepareStep||this.hooks?.prepareStep?{prepareStep:(j)=>this.prepareStep(j,S)}:{}}),vQ=this.liveRuns.register(h,{threadId:Z,owner:Y,clientRunId:G,onEvent:(j)=>this.dispatchEvent(j,S),onInternalError:(j)=>this.reportHookFailure(j),maxRunDurationMs:this.agent.maxRunDurationMs});if(D=h,_)this.follow(h,_);let{stored:yQ,hooks:Y8}=this.persistRun(h,S,vQ,_,LJ);if(YQ.set(h,yQ),BJ.has(J))BJ.set(J,{run:h,hooks:Y8});return J.ctx?.()?.waitUntil(Y8),h.toResponse()};try{await this.authorizeRequest(J,{route:"stream",threadId:Z,body:V});let B=await this.foreignFile([...K?.files??[],...Z?[]:p0(Q.messages)],Y);if(B)return B;if(H?.cancelled)return PQ();let U=await this.runLimitKey(J,{owner:Y,threadId:Z}),P=U===null?iJ:k0(this.liveRuns).take(U,Z?`thread:${Z}`:`run:${crypto.randomUUID()}`,this.maxConcurrentRuns);if(!P)return $8(429,"too_many_runs",`You already have ${this.maxConcurrentRuns} conversations answering. Wait for one to finish, or stop it, and send again.`);try{return Z?await this.withThread(Z,Y,F):await F()}finally{let L=D;if(L)L.result().then(P,P);else P()}}finally{if(H&&lJ.get(G)===H)lJ.delete(G)}}async withThread(J,$,Q){let Z=pJ.get(J)??Promise.resolve(),W,K=new Promise((G)=>{W=G}),X=Z.then(()=>K);pJ.set(J,X),await Z;try{let G=await this.liveRuns.find({threadId:J});if(G&&this.liveRuns.isRunning(G.runId)&&!this.liveRuns.mayAccess(G.runId,$))return NJ();let V=G?this.liveRuns.get(G.runId):null;if(V)V.stop({reason:"superseded by a later turn on this thread"}),await YQ.get(V);return await Q()}finally{if(W(),pJ.get(J)===X)pJ.delete(J)}}async attach(J=new w){let $=await UJ(J,dJ);if($.error)return $J($);let Q=$.body,Z=typeof Q.threadId==="string"?Q.threadId:u0(J,"threadId");if(!Z)return R(400,{code:"invalid_request",message:"attach needs a threadId: it is the handle that survives a refresh."});await this.authorizeRequest(J,{route:"attach",threadId:Z});let W=await this.liveRuns.find({threadId:Z});if(W&&!this.liveRuns.mayAccess(W.runId,await this.runOwner(J)))return NJ();if(!W)return R(404,{code:"no_live_run",message:`No run in progress for thread ${Z} in this process.`});let K=typeof Q.runId==="string"?Q.runId:void 0,X=K&&K!==W.runId?void 0:g0(J,Q);try{return _Q(this.liveRuns.replay(W.runId,X))}catch(G){if(G instanceof JJ)return R(410,{code:G.code,message:G.message,oldestSeq:G.oldest});if(G instanceof PJ)return R(404,{code:G.code,message:G.message});throw G}}async stop(J=new w){let $=await UJ(J,dJ);if($.error)return $J($);let Q=$.body;await this.authorizeRequest(J,{route:"stop",threadId:typeof Q.threadId==="string"?Q.threadId:void 0});let Z=await this.runOwner(J),W=typeof Q.runId==="string"?Q.runId:void 0;if(!W&&typeof Q.clientRunId==="string"){if(W=this.liveRuns.findByClientRunId(Q.clientRunId)??void 0,!W){let X=lJ.get(Q.clientRunId);if(X){if(X.owner!==null&&X.owner!==Z)return NJ();return X.cancelled=!0,{stopped:!0}}}}if(!W&&typeof Q.threadId==="string")W=(await this.liveRuns.find({threadId:Q.threadId}))?.runId;let K=W?this.liveRuns.get(W):null;if(!K)return{stopped:!1};if(!this.liveRuns.mayAccess(K.runId,Z))return NJ();return K.stop({reason:typeof Q.reason==="string"?Q.reason:void 0}),{stopped:!0}}attachmentScope(J,$,Q){let Z=this.hooks?.attachmentScope;if(Z)return Z(J,$,Q);let W=J.ctx()?.user,K=W?.id??W?.publicId;if(K!==void 0&&K!==null&&String(K)!=="")return{key:`user:${String(K)}`};if($)return{key:`thread:${$}`};return null}attachmentLimits(J){let $=this.hooks?.attachmentLimits;if($)return $(J);return null}checkUpload(J,$,Q){return this.hooks?.checkUpload?.(J,$,Q)}attachmentDestination(J,$,Q){let Z=this.hooks?.attachmentDestination;if(Z)return Z(J,$,Q);return"both"}async attachmentsFor(J,$,Q={body:{}}){let Z=await this.attachmentScope(J,$,Q);if(!Z)return null;return new aJ(this.attachments,this.attachmentStorage,Z)}async voiceStart(J=new w){let $=this.voice;if(!$)return t$();let Q=await UJ(J,dJ);if(Q.error)return $J(Q);let{sdp:Z,threadId:W,pushToTalk:K}=Q.body;if(typeof Z!=="string"||!Z.trimStart().startsWith("v="))return R(400,{code:"invalid_request",message:"`sdp` must be the browser's SDP offer."});let X=nJ(Q.body,l0),G=typeof W==="string"&&W!==""?W:void 0;await this.authorizeRequest(J,{route:"stream",threadId:G,body:X});let V=J.ctx?.()?.user??null,Y=await $.start({req:J,body:X,threadId:G,user:V,pushToTalk:K===!0}),H=Date.now(),D,z=async(L)=>{if(L!==void 0)console.error("[gemi/ai] a voice session could not start.",L);if(D)await $.realtime.hangup(D).catch((C)=>{console.error("[gemi/ai] a voice call that failed to start could not be hung up.",C)});try{await Y.onEnd?.({sessionId:"",...D?{callId:D}:{},threadId:Y.threadId??G??"",reason:"start_failed",startedAt:H,endedAt:Date.now(),durationMs:0,seconds:0,usage:E(),transcription:{usage:E(),seconds:0},transcript:[],requests:[],toolCalls:[],errors:[]})}catch(C){console.error("[gemi/ai] a voice session's onEnd threw.",C)}},F=Y.threadId??G;if(!F)return await z(void 0),R(400,{code:"invalid_request",message:"A voice session needs a thread: send `threadId`, or answer one from `voice.start`."});try{if(F!==G)await this.authorizeRequest(J,{route:"stream",threadId:F,body:X})}catch(L){throw await z(void 0),L}let N=crypto.randomUUID(),B=Y.tools??[];try{if(Y.mcp)B=[...B,...await h$(Y.mcp,{user:V,sessionId:N})]}catch(L){return await z(L),R(500,{code:"voice_unavailable",message:"Voice isn't available right now."})}let U={...Y.session,tools:[...zJ($.delegate),...Y.session?.tools??[],...B.map((L)=>L.tool)],...K===!0?{turnDetection:null}:{}},P;try{P=await $.realtime.createCall({sdp:Z,session:U,safetyIdentifier:Y.safetyIdentifier})}catch(L){await z(L);let C=L instanceof v&&L.code==="rate_limited";return R(C?429:502,{code:"voice_unavailable",message:"Voice isn't available right now."})}D=P.callId;try{await this.voiceStore.create({id:N,callId:P.callId,threadId:F,owner:await this.runOwner(J),body:X,startedAt:H});let{threadId:L,session:C,safetyIdentifier:q,mcp:A,tools:M,...O}=Y;return{sessionId:i.start({...O,tools:B,controller:this.constructor,threadId:F,user:V,body:X,call:{realtime:$.realtime,callId:P.callId},sessionId:N,store:this.voiceStore,liveRuns:this.liveRuns,delegate:$.delegate,session:U}).sessionId,sdp:P.sdpAnswer,threadId:F,delegate:$.delegate?.name??DJ,endsAt:H+(Y.limits?.maxDurationMs??900000)}}catch(L){return await z(L),R(500,{code:"voice_unavailable",message:"Voice isn't available right now."})}}async voiceUpdate(J=new w){if(!this.voice)return t$();let $=await this.voiceSession(J);if($ instanceof Response)return $;let Q=await UJ(J,dJ);if(Q.error)return $J(Q);let Z=nJ(Q.body,[]);if(await this.authorizeRequest(J,{route:"stream",threadId:$.threadId,body:Z}),$.endedAt!==void 0)return R(409,{code:"voice_ended",message:"This voice session has ended."});return await this.voiceStore.update($.id,{body:Z}),i.get($.id)?.setBody(Z),{updated:!0}}async voiceEnd(J=new w){let $=this.voice;if(!$)return t$();let Q=await this.voiceSession(J);if(Q instanceof Response)return Q;if(await this.authorizeRequest(J,{route:"stream",threadId:Q.threadId,body:Q.body}),Q.endedAt!==void 0)return{ended:!1};let Z=i.get(Q.id);if(Z)await Z.end("hangup");else await $.realtime.hangup(Q.callId),await this.voiceStore.update(Q.id,{endedAt:Date.now(),endReason:"hangup"});return{ended:!0}}async voiceSession(J){let $=J.params?.sessionId,Q=typeof $==="string"&&$?await this.voiceStore.get($):null;if(!Q)return R(404,{code:"voice_not_found",message:"No such voice session."});if(Q.owner!==null&&Q.owner!==await this.runOwner(J))return NJ();return Q}async upload(J=new w){let $=await J.rawRequest.formData(),Q=$.get("file");if(!(Q instanceof Blob))throw Error("upload expects a multipart body with a `file` field.");let Z=Q instanceof File&&Q.name?Q.name:"upload",W=Q.type||"application/octet-stream",K=q0($.get("body")),X=$.get("threadId");await this.authorizeRequest(J,{route:"upload",threadId:typeof X==="string"&&X.length>0?X:void 0,body:K});let G=w0(await this.attachmentLimits(J),Q,Z,W);if(G)throw new J8(G.code,G.message);let V=typeof X==="string"&&X.length>0&&await this.store.loadThread(X)!==null?X:void 0,Y=await this.runOwner(J),H=(A)=>this.fileOwners.record(A,{owner:Y,name:Z,mimeType:W,size:Q.size,createdAt:new Date().toISOString()}),D={body:K,threadId:V},z=await this.checkUpload({name:Z,size:Q.size,mimeType:W},J,D);if(z)throw new J8(z.code||"upload_refused",z.message);let F=await this.attachmentDestination(Q,J,D),N=d0(F,$.get("destination")),B=await this.attachmentScope(J,V,{body:K}),U=N!=="provider"&&!B;if(U){if(N==="storage")throw Error('This upload was routed to storage, but `attachmentScope()` returned null for the request, so there is no subject to file the attachment under. Guard the route (`this.agent(Chat).middleware({ upload: "auth" })`), send a `threadId` with the upload, or override `attachmentScope()`.');i0()}if(N==="provider"||!B){let A=await HQ(this.agent.provider,Q);await H(A);let M={fileId:A,name:Z,mimeType:W,size:Q.size,destination:"provider"};if(U)M.downgraded="no_scope";return M}let P=TQ(),L=await this.attachmentStorage.put({name:kQ(P,Z),body:Q,contentType:W}),C=N==="both"?await HQ(this.agent.provider,Q):void 0;if(C)await H(C);let q={id:P,scopeKey:B.key,fileId:C,objectName:L,name:Z,mimeType:W,size:Q.size,createdAt:new Date().toISOString(),destination:N};return await this.attachments.put(B,q),{fileId:C,attachmentId:P,name:Z,mimeType:W,size:Q.size,destination:N}}async foreignFile(J,$){let Q=new Set(J.map((Z)=>Z.fileId).filter((Z)=>typeof Z==="string"));for(let Z of Q){let W=await this.fileOwners.get(Z);if(W?W.owner!==null&&W.owner!==$:this.requireKnownFiles)return m0()}return null}onMessage(J,$){return this.hooks?.onMessage?.(J,$)}onToolCall(J,$){return this.hooks?.onToolCall?.(J,$)}onToolResult(J,$,Q){return this.hooks?.onToolResult?.(J,$,Q)}onAwaitingInput(J,$){return this.hooks?.onAwaitingInput?.(J,$)}redactError(J,$,Q){let Z=this.hooks?.redactError;if(Z)return Z(J,$,Q);return W8(J,$)}onError(J,$){return this.hooks?.onError?.(J,$)}onStreamComplete(J,$){return this.hooks?.onStreamComplete?.(J,$)}reportHookFailure(J){let $=this.hooks?.reportHookFailure;if($)try{return $(J)}catch(Q){console.error("[gemi/ai] reportHookFailure hook failed",Q)}console.error("[gemi/ai] agent controller hook failed",J)}async dispatchEvent(J,$){switch(J.type){case"tool-call":if(!J.part.partial&&!J.resent)await this.onToolCall({toolCallId:J.part.toolCallId,name:String(J.part.name),input:J.part.input},$);return;case"tool-result":{let Q=J.part;await this.onToolResult(Q,$,{toolCallId:Q.toolCallId,name:String(Q.name),input:IQ(Q)});return}case"awaiting-input":await this.onAwaitingInput(J.pending,$);return;case"error":await this.onError(AQ(J.error),$);return;default:return}}async readThread(J){let $=await this.store.loadThread(J);if(!$)return null;let{messages:Q}=await this.settleThread(J,$,{write:!1});return Q}isRunLive(J,$){return this.liveRuns.get(J)!==null}async settleThread(J,$,{write:Q}){let Z=(V)=>this.isRunLive(V,J),W=await $Q($,Z),K=W.messages,X=[],G=new Map(W.settled.map((V)=>[V.id,V]));if(a0(K)||Q)try{let V=await KQ(K,{threadId:J,store:g.store,isRunLive:Z,outputSchemaFor:(Y)=>this.toolNamed(Y)?.outputSchema,modelOutputFor:(Y,H)=>qQ(this.toolNamed(Y),H,(D)=>this.reportHookFailure(D)),scan:this.jobsBlockMax()});K=V.messages,X=V.jobs;for(let Y of V.settled)G.set(Y.id,Y);if(Q&&V.orphans.length>0){await XQ(g.store,V.orphans,(H)=>this.reportHookFailure(H));let Y=new Set(V.orphans.map((H)=>H.id));X=X.map((H)=>Y.has(H.id)?{...H,orphaned:!0}:H)}}catch(V){this.reportHookFailure(V)}if(Q&&G.size>0)try{await this.store.appendMessages(J,[...G.values()])}catch(V){this.reportHookFailure(V)}return{messages:K,jobs:X}}jobsBlockMax(){let J=this.agent.jobs?.contextBlock;if(J===!1)return 0;return J?.max??MJ}jobsBlock(J){return U8(J,this.jobsBlockMax())}toolNamed(J){let $=(Q)=>{for(let Z of Q){let W=Z;if(Array.isArray(W.tools)){let K=$(W.tools);if(K)return K}else if(W.name===J)return W}return};return $(this.agent.tools??[])}follow(J,$){(async()=>{try{for await(let Q of J.frames())$.frame(Q)}catch(Q){this.reportHookFailure(Q)}})()}persistRun(J,$,Q,Z=null,W={id:null,notified:Promise.resolve()}){let K=Promise.resolve(),X=(async()=>{let V;try{V=await J.result()}catch(H){Z?.close(),await Z?.settled(),K=W.notified.then(()=>this.safely(()=>this.onError({code:"unknown",message:H instanceof Error?H.message:String(H),retryable:!1},$)));return}let Y=V.messages;if(Z?.close(Y),await Z?.settled(),$.threadId&&Y.length>0)try{await this.store.appendMessages($.threadId,Y)}catch(H){this.reportHookFailure(H)}K=this.notifyRun(V,Y,$,W)})(),G=X.then(()=>o0(Promise.all([K,Q]).then(()=>{}),this.hookHoldMs));return{stored:X,hooks:G}}async notifyRun(J,$,Q,Z){await Z.notified;for(let W of $){if(W.id===Z.id)continue;await this.safely(()=>this.onMessage(W,Q))}await this.safely(()=>this.onStreamComplete(J,Q))}async safely(J){try{await J()}catch($){this.reportHookFailure($)}}}var r$=["turn","clientRunId","threadId","messages","regenerate"],x0=["text","files","toolResults"];function nJ(J,$=fQ(J)?r$:[...r$,...x0]){let Q={};for(let[Z,W]of Object.entries(J)){if($.includes(Z))continue;Object.defineProperty(Q,Z,{value:W,writable:!0,enumerable:!0,configurable:!0})}return Q}function q0(J){if(J===null)return{};let $;if(typeof J==="string")try{$=JSON.parse(J)}catch{throw new e$("The upload's `body` field is not valid JSON.")}if($===null||typeof $!=="object"||Array.isArray($))throw new e$("The upload's `body` field must be a JSON object.");return nJ($,r$)}class e$ extends oJ{constructor(J){super(J);this.name="InvalidUploadError",this.payload={api:{status:400,data:{error:{code:"invalid_request",message:J}}},view:{}}}}async function HQ(J,$){try{return await J.upload($)}catch(Q){if(Q instanceof b&&I0.has(Q.status))throw new bQ(x(Q).message);throw Q}}var I0=new Set([400,413,415,422]);class J8 extends oJ{constructor(J,$){super($);this.name="LimitedUploadError",this.payload={api:{status:422,data:{error:{code:J,message:$}}},view:{}}}}function w0(J,$,Q,Z){if(!J)return null;let{maxBytes:W,accept:K}=J;if(typeof W==="number"&&$.size>W)return{code:"file_too_large",message:`${JSON.stringify(Q)} is ${zQ($.size)}; the limit is ${zQ(W)}.`};if(K&&K.length>0&&!K.some((X)=>b0(X,Q,Z)))return{code:"unsupported_file_type",message:`${JSON.stringify(Q)} is not a type this chat accepts. Accepted: ${K.join(", ")}.`};return null}function b0(J,$,Q){let Z=J.trim().toLowerCase();if(!Z)return!1;if(Z.startsWith("."))return $.toLowerCase().endsWith(Z);let W=Q.toLowerCase().split(";")[0].trim();if(Z.endsWith("/*"))return W.startsWith(Z.slice(0,-1));return W===Z}function zQ(J){if(J<1024)return`${J} B`;let $=["KB","MB","GB"],Q=J/1024,Z=0;while(Q>=1024&&Z<$.length-1)Q/=1024,Z++;return`${Math.round(Q*10)/10} ${$[Z]}`}class bQ extends oJ{constructor(J){super(J);this.name="RejectedUploadError";let $=/(unsupported|invalid) (extension|file type|format|mime)|supported (extensions|formats?)/i.test(J)?"unsupported_file_type":"file_rejected";this.payload={api:{status:422,data:{error:{code:$,message:J}}},view:{}}}}async function UJ(J,$){let Q=J?.rawRequest;if(!Q||Q.method==="GET"||Q.method==="HEAD"||!Q.body)return{body:{}};if(!f0(Q.headers.get("Content-Type")))return{body:{},status:415,code:"unsupported_media_type",error:"The request body must be sent as application/json."};let Z=Number(Q.headers.get("Content-Length"));if(Number.isFinite(Z)&&Z>$)return DQ($);let W;try{let X=await v0(Q,$);if(X===null)return DQ($);W=X}catch{return{body:{},error:"The request body could not be read."}}if(!W.trim())return{body:{}};let K;try{K=JSON.parse(W)}catch{return{body:{},error:"The request body is not valid JSON."}}if(K===null||typeof K!=="object"||Array.isArray(K))return{body:{},error:"The request body must be a JSON object."};return{body:K}}function f0(J){return CQ(J)==="application/json"}async function v0(J,$){if(!Number.isFinite($)||!J.body)return await J.text();let Q=J.body.getReader(),Z=[],W=0;for(;;){let{done:G,value:V}=await Q.read();if(G)break;if(W+=V.byteLength,W>$)return await Q.cancel().catch(iJ),null;Z.push(V)}let K=new Uint8Array(W),X=0;for(let G of Z)K.set(G,X),X+=G.byteLength;return new TextDecoder().decode(K)}function DQ(J){return{body:{},status:413,code:"body_too_large",error:`The request body is larger than this agent accepts (${J} bytes).`}}function $8(J,$,Q){return R(J,{...sJ(LQ(J),Q,J),code:$})}function $J(J){if(J.status===413)return $8(413,J.code??"body_too_large",J.error??"");return R(J.status??400,{code:J.code??"invalid_request",message:J.error})}function fQ(J){return Boolean(J.turn)&&typeof J.turn==="object"}function y0(J){let $=fQ(J)?J.turn:J,Q={};if(typeof $.text==="string")Q.text=$.text;if(Array.isArray($.files)){let Z=h0($.files);if(typeof Z==="string")return{error:Z};Q.files=Z}if(Array.isArray($.toolResults))Q.toolResults=$.toolResults;if(Object.keys(Q).length===0)return{};if($===J.turn&&$.localId!==void 0&&$.localId!==null&&$.localId!==""){let{localId:Z}=$;if(typeof Z!=="string")return{error:"turn.localId must be a string."};if(Z.length>FQ)return{error:`turn.localId is longer than ${FQ} characters.`};Q.localId=Z}return{turn:Q}}var FQ=200;function h0(J){let $=[];for(let[Q,Z]of J.entries()){let W=`turn.files[${Q}]`;if(!Z||typeof Z!=="object"||Array.isArray(Z))return`${W} must be an object.`;let K={};for(let H of["fileId","attachmentId","name","mimeType"]){let D=Z[H];if(D===void 0||D===null||D==="")continue;if(typeof D!=="string")return`${W}.${H} must be a string.`;K[H]=D}let{fileId:X,attachmentId:G,name:V,mimeType:Y}=K;if(X?.startsWith(d))return`${W}.fileId holds a gemi attachment id (${X}). \`fileId\` is the provider's id from the upload response; put this one in \`attachmentId\`.`;if(G!==void 0&&!G.startsWith(d))return`${W}.attachmentId is not a gemi attachment id: it must start with "${d}".`;if(!X&&!G)return`${W} has neither a \`fileId\` nor an \`attachmentId\`. Send the ids the upload response answered.`;$.push({...X?{fileId:X}:{},...G?{attachmentId:G}:{},...V!==void 0?{name:V}:{},...Y!==void 0?{mimeType:Y}:{}})}return $}function g0(J,$){if(typeof $.from==="number"&&Number.isFinite($.from))return Math.max(0,Math.floor($.from));if(typeof $.cursor==="number"&&Number.isFinite($.cursor)){let Z=Math.floor($.cursor);if(Z>=0)return Z+1;return}let Q=J?.rawRequest?.headers?.get("Last-Event-ID");if(Q){let Z=Number.parseInt(Q,10);if(Number.isFinite(Z))return Math.max(0,Z+1)}return}function u0(J,$){let Q=J?.search?.get($);return typeof Q==="string"?Q:void 0}function c0(J){let $=K8(J);for(let Q=J.length-1;Q>=0;Q--){let Z=J[Q];if(Z.role!=="user"||$.has(Z.id))continue;let W="",K=[];for(let X of Z.content){if(X.type==="text")W+=X.text;if(X.type==="file")K.push({...X.fileId?{fileId:X.fileId}:{},...X.attachmentId?{attachmentId:X.attachmentId}:{},...X.name?{name:X.name}:{},...X.mimeType?{mimeType:X.mimeType}:{}})}if(!W&&K.length===0)continue;return{index:Q,turn:{...W?{text:W}:{},...K.length>0?{files:K}:{}}}}return null}function PQ(){return R(409,{code:"stopped",message:"The turn was stopped before it started."})}function NJ(){return R(403,sJ("permission","This run belongs to someone else.",403))}function m0(){return R(403,sJ("permission","A file in this turn was uploaded by someone else.",403))}function p0(J){if(!Array.isArray(J))return[];let $=[];for(let Q of J){let Z=Q?.content;if(!Array.isArray(Z))continue;for(let W of Z)if(W&&typeof W==="object"&&typeof W.fileId==="string")$.push({fileId:W.fileId})}return $}var l0=["sdp","threadId","pushToTalk"];function t$(){return R(404,{code:"voice_not_enabled",message:"This agent has no voice: set `voice` on its controller."})}function R(J,$){return new Response(JSON.stringify({error:$}),{status:J,headers:{"Content-Type":"application/json"}})}function d0(J,$){if(typeof $!=="string"||$.length===0)return J;if($!=="both"&&$!=="provider"&&$!=="storage")throw Error(`Unknown attachment destination "${$}". Expected "both", "provider" or "storage".`);if($===J||J==="both"&&$==="storage")return $;if(J==="both"&&$==="provider")throw Error('This upload asked for the "provider" destination under a "both" policy. A client may ask for "storage", which keeps a file away from the model provider, but it may not ask the server to stop keeping its own copy while the vendor still gets the file \u2014 that is the app\'s retention decision. Change `attachmentDestination()` if this file should not be kept.');throw Error(`This upload asked for the "${$}" destination, but the server's policy for it is "${J}", and a client hint may only ask for "storage" under a "both" policy. Change \`attachmentDestination()\` if the file really should go there.`)}var BQ=!1;function i0(){if(BQ)return;BQ=!0,console.warn("[gemi/ai] An upload had no attachment scope, so its bytes were sent to the model provider only and no attachment id was minted \u2014 a tool cannot forward this file. Guard the route with auth, send a `threadId` with the upload, or override `attachmentScope()`.")}var n0=2147483647;function o0(J,$){let Q=J.then(()=>{},()=>{});if(!($<=n0))return Q;let Z,W=new Promise((K)=>{Z=setTimeout(K,$)});return Promise.race([Q,W]).finally(()=>clearTimeout(Z))}var UQ=!1;function s0(J){if(UQ||Bun.env.NODE_ENV!=="production")return;if(!(J instanceof Q8))return;UQ=!0,console.warn("[gemi/ai] A stateless agent chat is spending approval nonces in process memory. With more than one instance a replayed approval is accepted once per instance. Set `nonces = new RedisNonceStore()` (or your own NonceStore) on the AgentController.")}function a0(J){return J.some(($)=>$.content.some((Q)=>Q.type==="tool-result"&&Q.status==="running"))}export{X6 as windowMessages,zJ as voiceTools,$6 as turnStarts,wJ as toRealtimeUsage,KZ as toAgentTools,e0 as supportsStrict,Q6 as splitTurns,F6 as settleSummaries,r0 as s,W8 as redactError,M6 as parsePartialJson,Z6 as messageSize,XJ as measureUsage,h$ as mcpVoiceTools,m$ as liveRuns,FJ as keepSummary,x9 as isCallNotFound,K8 as injectedMessageIds,F$ as generate,eZ as evalChain,j0 as defineAgentHooks,u$ as defaultVoiceStore,B6 as defaultUsageLimitStore,D6 as defaultSummaryStore,Z8 as defaultNonceStore,p$ as defaultFileOwners,tJ as defaultAttachmentStore,o$ as defaultAgentStore,gJ as VoiceHangup,i as VoiceBridge,J6 as Usage,B$ as ToolNamespace,m as ToolError,N6 as Skill,aJ as ScopedAttachments,L6 as SKILLS_NAMESPACE,n$ as RedisReceiptStore,MQ as RedisNonceStore,bJ as RealtimeSideband,v as RealtimeRequestError,VJ as RealtimeClient,F8 as Prompt,SQ as PrismaNonceStore,U6 as PendingEscalation,b$ as OpenAIProvider,O$ as OpenAIImageProvider,g$ as MemoryVoiceSessionStore,P6 as MemoryUsageLimitStore,z6 as MemorySummaryStore,i$ as MemoryReceiptStore,Q8 as MemoryNonceStore,uJ as MemoryLiveRuns,cJ as MemoryFileOwners,yJ as MemoryCircuitStore,jQ as MemoryAttachmentStore,mJ as MemoryAgentStore,C8 as MemoryAgentJobStore,v8 as MEMORY_NAMESPACE,PJ as LiveRunNotFoundError,_8 as JobsRequireThreadError,O8 as JobHandle,t0 as JSONSchemaError,EQ as InvalidAttachmentScopeError,x8 as InMemoryAgentMemoryStore,xJ as ImageRequestError,qJ as ImageProvider,U$ as ImageModel,JJ as FrameCursorEvictedError,HJ as FallbackProvider,b8 as FakeAgentMemoryStore,TJ as Eval,l9 as DatabaseAgentStore,Y$ as DatabaseAgentMemoryStore,K$ as DatabaseAgentJobStore,k9 as DEFAULT_TRANSCRIPTION_MODEL,j8 as DEFAULT_MEMORY_MAX_TOKENS,f8 as DEFAULT_MEMORY_LIMITS,Y6 as DEFAULT_MAX_SUMMARY_TOKENS,C6 as DEFAULT_MAX_RUN_DURATION_MS,M8 as DEFAULT_JOB_DEADLINE_MS,MJ as DEFAULT_JOBS_CONTEXT_MAX,DJ as DEFAULT_DELEGATE_NAME,W6 as DEFAULT_CONTEXT_WINDOW_STEP,K6 as DEFAULT_CONTEXT_WINDOW_NOTE,G6 as DEFAULT_COMPACT_TRIGGER_TOKENS,V6 as DEFAULT_COMPACT_INSTRUCTIONS,H6 as COMPACT_SUMMARY_HEADER,f$ as AzureOpenAIProvider,_$ as AzureOpenAIImageProvider,RQ as AttachmentNotFoundError,rJ as AgentTurnError,kJ as AgentTool,O6 as AgentRunError,e as AgentProvider,q8 as AgentMemoryRefusedError,I8 as AgentMemoryConflictError,w8 as AgentMemories,g as AgentJobs,Q$ as AgentJobDeadlineSweep,S8 as AgentJob,X8 as AgentController,_6 as Agent};
265
+ `)||void 0,L=await this.context(J,{body:V}),C=await this.reasoning(J,{body:V})||void 0,w=await this.skills(J,{body:V})||void 0,R=await this.runTools(J,{body:V,context:L})||void 0,M=await this.usageLimits(J,{body:V,context:L})||void 0,O=await this.attachmentsFor(J,Z,{body:V}),I=this.agent.memory?await this.memoryScopes(J,{body:V}):void 0;if(H?.cancelled)return CQ();let _=Z?new t$(this.store,Z,P,(T)=>this.reportHookFailure(T)):null,j=`run_${crypto.randomUUID()}`,S={req:J,runId:j,threadId:Z},MJ={id:null,notified:Promise.resolve()},y=this.agent.stream({runId:j,messages:P,turn:K,threadId:Z,..._?{onMessage:(T)=>_.finish(T)}:{},onTurn:(T)=>{if(MJ.id!==null)return;MJ.id=T.id;let o=_?_.settled():Promise.resolve();MJ.notified=o.then(()=>this.safely(()=>this.onMessage(T,S)))},instructions:U,...e$.has(J)?{event:e$.get(J)}:{},...QJ.has(J)?{echoTurn:!0}:{},...C?{reasoning:C}:{},...w&&w.length>0?{skills:w}:{},...R?.tools&&R.tools.length>0?{tools:R.tools}:{},...R?.activeTools?{activeTools:R.activeTools}:{},...M?{usageLimits:M}:{},context:L,attachments:O,body:V,redactError:(T,o)=>this.redactError(T,o,S),nonces:this.nonces,receipts:this.receipts,subject:G,...I?{memory:{scopes:I,...this.memoryMaxTokens!==void 0?{maxTokens:this.memoryMaxTokens}:{}}}:{},...Z?{jobs:{owner:G}}:{},...this.contextWindow!==void 0?{contextWindow:this.contextWindow}:{},...Z&&cQ(this.store)?{summaryStore:this.store}:{},...this.prepareStep!==H8.prototype.prepareStep||this.hooks?.prepareStep?{prepareStep:(T)=>this.prepareStep(T,S)}:{}}),oQ=this.liveRuns.register(y,{threadId:Z,owner:G,clientRunId:Y,onEvent:(T)=>this.dispatchEvent(T,S),onInternalError:(T)=>this.reportHookFailure(T),maxRunDurationMs:this.agent.maxRunDurationMs});if(D=y,_)this.follow(y,_);if(Z)p0(this.liveRuns,Z,y.runId);let{stored:sQ,hooks:z8}=this.persistRun(y,S,oQ,_,MJ);if(r$.set(y,sQ),QJ.has(J))QJ.set(J,{run:y,hooks:z8});return J.ctx?.()?.waitUntil(z8),y.toResponse()};try{await this.authorizeRequest(J,{route:"stream",threadId:Z,body:V});let P=await this.foreignFile([...K?.files??[],...Z?[]:K6(Q.messages)],G);if(P)return P;if(H?.cancelled)return CQ();let N=await this.runLimitKey(J,{owner:G,threadId:Z}),U=N===null?WJ:l0(this.liveRuns).take(N,Z?`thread:${Z}`:`run:${crypto.randomUUID()}`,this.maxConcurrentRuns);if(!U)return K8(429,"too_many_runs",`You already have ${this.maxConcurrentRuns} conversations answering. Wait for one to finish, or stop it, and send again.`);try{return Z?await this.withThread(Z,G,F,zQ.get(J)??"supersede"):await F()}finally{let L=D;if(L)L.result().then(U,U);else U()}}finally{if(H&&iJ.get(Y)===H)iJ.delete(Y)}}async withThread(J,$,Q,Z="supersede"){if(Z==="skip"&&CJ.has(J))return OQ(J);for(;;){let W=await this.underThreadLock(J,$,Q,Z);if(!("waitFor"in W))return W.response;await W.waitFor}}async underThreadLock(J,$,Q,Z){let W=CJ.get(J)??Promise.resolve(),K,X=new Promise((V)=>{K=V}),Y=W.then(()=>X);CJ.set(J,Y),await W;try{let V=await this.liveRuns.find({threadId:J});if(V&&Z!=="supersede"&&this.liveRuns.isRunning(V.runId)){if(Z==="skip")return{response:OQ(J)};let H=this.liveRuns.get(V.runId),D=H?r$.get(H)??H.result():null;if(D)return{waitFor:D.then(WJ,WJ)}}if(V&&this.liveRuns.isRunning(V.runId)&&!this.liveRuns.mayAccess(V.runId,$))return{response:_J()};let G=V?this.liveRuns.get(V.runId):null;if(G)G.stop({reason:"superseded by a later turn on this thread"}),await r$.get(G);return{response:await Q()}}finally{if(K(),CJ.get(J)===Y)CJ.delete(J)}}async attach(J=new q){let $=await ZJ(J,OJ);if($.error)return n($);let Q=$.body,Z=typeof Q.threadId==="string"?Q.threadId:LQ(J,"threadId");if(!Z)return A(400,{code:"invalid_request",message:"attach needs a threadId: it is the handle that survives a refresh."});if(await this.authorizeRequest(J,{route:"attach",threadId:Z}),!await this.threadInScope(J,Z))return AQ(Z);let W=await this.liveRuns.find({threadId:Z});if(W&&!this.liveRuns.mayAccess(W.runId,await this.runOwner(J)))return _J();if(!W)return AQ(Z);let K=typeof Q.runId==="string"?Q.runId:void 0,X=K&&K!==W.runId?void 0:$6(J,Q);try{return IQ(this.liveRuns.replay(W.runId,X))}catch(Y){if(Y instanceof $J)return A(410,{code:Y.code,message:Y.message,oldestSeq:Y.oldest});if(Y instanceof BJ)return A(404,{code:Y.code,message:Y.message});throw Y}}async watch(J=new q){let $=await ZJ(J,OJ);if($.error)return n($);let Q=$.body,Z=typeof Q.threadId==="string"?Q.threadId:LQ(J,"threadId");if(!Z)return A(400,{code:"invalid_request",message:"watch needs a threadId: it is the thread whose runs are announced."});if(await this.authorizeRequest(J,{route:"attach",threadId:Z}),!await this.threadInScope(J,Z))return A(404,{code:"thread_not_found",message:`Thread ${Z} does not exist here, or has expired.`});let W=await this.runOwner(J),K=this.liveRuns,X=m0(K),Y=await K.find({threadId:Z}),V=null,G=null,H=0,D=()=>{if(G?.stop(),!V)return;let F=X.get(Z);if(F?.delete(V),F&&F.size===0)X.delete(Z);V=null},z=new ReadableStream({start(F){G=xQ(F);let B=(N)=>{if(!K.mayAccess(N,W))return;try{F.enqueue(new TextEncoder().encode(TQ({seq:++H,event:{type:"run-start",runId:N,threadId:Z}}))),G?.touch()}catch{D()}};V=B;let P=X.get(Z);if(!P)P=new Set,X.set(Z,P);if(P.add(B),Y&&K.isRunning(Y.runId))B(Y.runId)},cancel(){D()}});return J.rawRequest?.signal?.addEventListener("abort",D,{once:!0}),new Response(z,{status:200,headers:wQ()})}async stop(J=new q){let $=await ZJ(J,OJ);if($.error)return n($);let Q=$.body;await this.authorizeRequest(J,{route:"stop",threadId:typeof Q.threadId==="string"?Q.threadId:void 0});let Z=await this.runOwner(J),W=typeof Q.runId==="string"?Q.runId:void 0;if(!W&&typeof Q.clientRunId==="string"){if(W=this.liveRuns.findByClientRunId(Q.clientRunId)??void 0,!W){let X=iJ.get(Q.clientRunId);if(X){if(X.owner!==null&&X.owner!==Z)return _J();return X.cancelled=!0,{stopped:!0}}}}if(!W&&typeof Q.threadId==="string")W=(await this.liveRuns.find({threadId:Q.threadId}))?.runId;let K=W?this.liveRuns.get(W):null;if(!K)return{stopped:!1};if(!this.liveRuns.mayAccess(K.runId,Z))return _J();return K.stop({reason:typeof Q.reason==="string"?Q.reason:void 0}),{stopped:!0}}attachmentScope(J,$,Q){let Z=this.hooks?.attachmentScope;if(Z)return Z(J,$,Q);let W=J.ctx()?.user,K=W?.id??W?.publicId;if(K!==void 0&&K!==null&&String(K)!=="")return{key:`user:${String(K)}`};if($)return{key:`thread:${$}`};return null}attachmentLimits(J){let $=this.hooks?.attachmentLimits;if($)return $(J);return null}checkUpload(J,$,Q){return this.hooks?.checkUpload?.(J,$,Q)}attachmentDestination(J,$,Q){let Z=this.hooks?.attachmentDestination;if(Z)return Z(J,$,Q);return"both"}async attachmentsFor(J,$,Q={body:{}}){let Z=await this.attachmentScope(J,$,Q);if(!Z)return null;return new aJ(this.attachments,this.attachmentStorage,Z)}async voiceStart(J=new q){let $=this.voice;if(!$)return J8();let Q=await ZJ(J,OJ);if(Q.error)return n(Q);let{sdp:Z,threadId:W,pushToTalk:K}=Q.body;if(typeof Z!=="string"||!Z.trimStart().startsWith("v="))return A(400,{code:"invalid_request",message:"`sdp` must be the browser's SDP offer."});let X=nJ(Q.body,X6),Y=typeof W==="string"&&W!==""?W:void 0;await this.authorizeRequest(J,{route:"stream",threadId:Y,body:X});let V=J.ctx?.()?.user??null,G=await $.start({req:J,body:X,threadId:Y,user:V,pushToTalk:K===!0}),H=Date.now(),D,z=async(L)=>{if(L!==void 0)console.error("[gemi/ai] a voice session could not start.",L);if(D)await $.realtime.hangup(D).catch((C)=>{console.error("[gemi/ai] a voice call that failed to start could not be hung up.",C)});try{await G.onEnd?.({sessionId:"",...D?{callId:D}:{},threadId:G.threadId??Y??"",reason:"start_failed",startedAt:H,endedAt:Date.now(),durationMs:0,seconds:0,usage:E(),transcription:{usage:E(),seconds:0},transcript:[],requests:[],toolCalls:[],errors:[]})}catch(C){console.error("[gemi/ai] a voice session's onEnd threw.",C)}},F=G.threadId??Y;if(!F)return await z(void 0),A(400,{code:"invalid_request",message:"A voice session needs a thread: send `threadId`, or answer one from `voice.start`."});try{if(F!==Y)await this.authorizeRequest(J,{route:"stream",threadId:F,body:X})}catch(L){throw await z(void 0),L}let B=crypto.randomUUID(),P=G.tools??[];try{if(G.mcp)P=[...P,...await h$(G.mcp,{user:V,sessionId:B})]}catch(L){return await z(L),A(500,{code:"voice_unavailable",message:"Voice isn't available right now."})}let N={...G.session,tools:[...PJ($.delegate),...G.session?.tools??[],...P.map((L)=>L.tool)],...K===!0?{turnDetection:null}:{}},U;try{U=await $.realtime.createCall({sdp:Z,session:N,safetyIdentifier:G.safetyIdentifier})}catch(L){await z(L);let C=L instanceof v&&L.code==="rate_limited";return A(C?429:502,{code:"voice_unavailable",message:"Voice isn't available right now."})}D=U.callId;try{await this.voiceStore.create({id:B,callId:U.callId,threadId:F,owner:await this.runOwner(J),body:X,startedAt:H});let{threadId:L,session:C,safetyIdentifier:w,mcp:R,tools:M,...O}=G;return{sessionId:i.start({...O,tools:P,controller:this.constructor,threadId:F,user:V,body:X,call:{realtime:$.realtime,callId:U.callId},sessionId:B,store:this.voiceStore,liveRuns:this.liveRuns,delegate:$.delegate,session:N}).sessionId,sdp:U.sdpAnswer,threadId:F,delegate:$.delegate?.name??UJ,endsAt:H+(G.limits?.maxDurationMs??900000)}}catch(L){return await z(L),A(500,{code:"voice_unavailable",message:"Voice isn't available right now."})}}async voiceUpdate(J=new q){if(!this.voice)return J8();let $=await this.voiceSession(J);if($ instanceof Response)return $;let Q=await ZJ(J,OJ);if(Q.error)return n(Q);let Z=nJ(Q.body,[]);if(await this.authorizeRequest(J,{route:"stream",threadId:$.threadId,body:Z}),$.endedAt!==void 0)return A(409,{code:"voice_ended",message:"This voice session has ended."});return await this.voiceStore.update($.id,{body:Z}),i.get($.id)?.setBody(Z),{updated:!0}}async voiceEnd(J=new q){let $=this.voice;if(!$)return J8();let Q=await this.voiceSession(J);if(Q instanceof Response)return Q;if(await this.authorizeRequest(J,{route:"stream",threadId:Q.threadId,body:Q.body}),Q.endedAt!==void 0)return{ended:!1};let Z=i.get(Q.id);if(Z)await Z.end("hangup");else await $.realtime.hangup(Q.callId),await this.voiceStore.update(Q.id,{endedAt:Date.now(),endReason:"hangup"});return{ended:!0}}async voiceSession(J){let $=J.params?.sessionId,Q=typeof $==="string"&&$?await this.voiceStore.get($):null;if(!Q)return A(404,{code:"voice_not_found",message:"No such voice session."});if(Q.owner!==null&&Q.owner!==await this.runOwner(J))return _J();return Q}async upload(J=new q){let $=await J.rawRequest.formData(),Q=$.get("file");if(!(Q instanceof Blob))throw Error("upload expects a multipart body with a `file` field.");let Z=Q instanceof File&&Q.name?Q.name:"upload",W=Q.type||"application/octet-stream",K=n0($.get("body")),X=$.get("threadId");await this.authorizeRequest(J,{route:"upload",threadId:typeof X==="string"&&X.length>0?X:void 0,body:K});let Y=s0(await this.attachmentLimits(J),Q,Z,W);if(Y)throw new W8(Y.code,Y.message);await this.scopeStore(J,K);let V=typeof X==="string"&&X.length>0&&await this.store.loadThread(X)!==null?X:void 0,G=await this.runOwner(J),H=(R)=>this.fileOwners.record(R,{owner:G,name:Z,mimeType:W,size:Q.size,createdAt:new Date().toISOString()}),D={body:K,threadId:V},z=await this.checkUpload({name:Z,size:Q.size,mimeType:W},J,D);if(z)throw new W8(z.code||"upload_refused",z.message);let F=await this.attachmentDestination(Q,J,D),B=G6(F,$.get("destination")),P=await this.attachmentScope(J,V,{body:K}),N=B!=="provider"&&!P;if(N){if(B==="storage")throw Error('This upload was routed to storage, but `attachmentScope()` returned null for the request, so there is no subject to file the attachment under. Guard the route (`this.agent(Chat).middleware({ upload: "auth" })`), send a `threadId` with the upload, or override `attachmentScope()`.');Y6()}if(B==="provider"||!P){let R=await PQ(this.agent.provider,Q);await H(R);let M={fileId:R,name:Z,mimeType:W,size:Q.size,destination:"provider"};if(N)M.downgraded="no_scope";return M}let U=hQ(),L=await this.attachmentStorage.put({name:gQ(U,Z),body:Q,contentType:W}),C=B==="both"?await PQ(this.agent.provider,Q):void 0;if(C)await H(C);let w={id:U,scopeKey:P.key,fileId:C,objectName:L,name:Z,mimeType:W,size:Q.size,createdAt:new Date().toISOString(),destination:B};return await this.attachments.put(P,w),{fileId:C,attachmentId:U,name:Z,mimeType:W,size:Q.size,destination:B}}async foreignFile(J,$){let Q=new Set(J.map((Z)=>Z.fileId).filter((Z)=>typeof Z==="string"));for(let Z of Q){let W=await this.fileOwners.get(Z);if(W?W.owner!==null&&W.owner!==$:this.requireKnownFiles)return W6()}return null}onMessage(J,$){return this.hooks?.onMessage?.(J,$)}onToolCall(J,$){return this.hooks?.onToolCall?.(J,$)}onToolResult(J,$,Q){return this.hooks?.onToolResult?.(J,$,Q)}onAwaitingInput(J,$){return this.hooks?.onAwaitingInput?.(J,$)}redactError(J,$,Q){let Z=this.hooks?.redactError;if(Z)return Z(J,$,Q);return Y8(J,$)}onError(J,$){return this.hooks?.onError?.(J,$)}onStreamComplete(J,$){return this.hooks?.onStreamComplete?.(J,$)}reportHookFailure(J){let $=this.hooks?.reportHookFailure;if($)try{return $(J)}catch(Q){console.error("[gemi/ai] reportHookFailure hook failed",Q)}console.error("[gemi/ai] agent controller hook failed",J)}async dispatchEvent(J,$){switch(J.type){case"tool-call":if(!J.part.partial&&!J.resent)await this.onToolCall({toolCallId:J.part.toolCallId,name:String(J.part.name),input:J.part.input},$);return;case"tool-result":{let Q=J.part;await this.onToolResult(Q,$,{toolCallId:Q.toolCallId,name:String(Q.name),input:pQ(Q)});return}case"awaiting-input":await this.onAwaitingInput(J.pending,$);return;case"error":await this.onError(fQ(J.error),$);return;default:return}}async readThread(J,$={}){let Z=await($.scope===null||$.scope===void 0?this.store:SQ(this.store,$.scope)).loadThread(J);if(!Z)return null;let{messages:W}=await this.settleThread(J,Z,{write:!1});return W}isRunLive(J,$){return this.liveRuns.get(J)!==null}async settleThread(J,$,{write:Q}){let Z=(V)=>this.isRunLive(V,J),W=await WQ($,Z),K=W.messages,X=[],Y=new Map(W.settled.map((V)=>[V.id,V]));if(D6(K)||Q)try{let V=await YQ(K,{threadId:J,store:g.store,isRunLive:Z,outputSchemaFor:(G)=>this.toolNamed(G)?.outputSchema,modelOutputFor:(G,H)=>mQ(this.toolNamed(G),H,(D)=>this.reportHookFailure(D)),scan:this.jobsBlockMax()});K=V.messages,X=V.jobs;for(let G of V.settled)Y.set(G.id,G);if(Q&&V.orphans.length>0){await VQ(g.store,V.orphans,(H)=>this.reportHookFailure(H));let G=new Set(V.orphans.map((H)=>H.id));X=X.map((H)=>G.has(H.id)?{...H,orphaned:!0}:H)}}catch(V){this.reportHookFailure(V)}if(Q&&Y.size>0)try{await this.store.appendMessages(J,[...Y.values()])}catch(V){this.reportHookFailure(V)}return{messages:K,jobs:X}}jobsBlockMax(){let J=this.agent.jobs?.contextBlock;if(J===!1)return 0;return J?.max??EJ}jobsBlock(J){return O8(J,this.jobsBlockMax())}toolNamed(J){let $=(Q)=>{for(let Z of Q){let W=Z;if(Array.isArray(W.tools)){let K=$(W.tools);if(K)return K}else if(W.name===J)return W}return};return $(this.agent.tools??[])}follow(J,$){(async()=>{try{for await(let Q of J.frames())$.frame(Q)}catch(Q){this.reportHookFailure(Q)}})()}persistRun(J,$,Q,Z=null,W={id:null,notified:Promise.resolve()}){let K=Promise.resolve(),X=(async()=>{let V;try{V=await J.result()}catch(H){Z?.close(),await Z?.settled(),K=W.notified.then(()=>this.safely(()=>this.onError({code:"unknown",message:H instanceof Error?H.message:String(H),retryable:!1},$)));return}let G=V.messages;if(Z?.close(G),await Z?.settled(),$.threadId&&G.length>0)try{await this.store.appendMessages($.threadId,G)}catch(H){this.reportHookFailure(H)}K=this.notifyRun(V,G,$,W)})(),Y=X.then(()=>H6(Promise.all([K,Q]).then(()=>{}),this.hookHoldMs));return{stored:X,hooks:Y}}async notifyRun(J,$,Q,Z){await Z.notified;for(let W of $){if(W.id===Z.id)continue;await this.safely(()=>this.onMessage(W,Q))}await this.safely(()=>this.onStreamComplete(J,Q))}async safely(J){try{await J()}catch($){this.reportHookFailure($)}}}var Q8=["turn","clientRunId","threadId","messages","regenerate"],i0=["text","files","toolResults"];function nJ(J,$=nQ(J)?Q8:[...Q8,...i0]){let Q={};for(let[Z,W]of Object.entries(J)){if($.includes(Z))continue;Object.defineProperty(Q,Z,{value:W,writable:!0,enumerable:!0,configurable:!0})}return Q}function n0(J){if(J===null)return{};let $;if(typeof J==="string")try{$=JSON.parse(J)}catch{throw new Z8("The upload's `body` field is not valid JSON.")}if($===null||typeof $!=="object"||Array.isArray($))throw new Z8("The upload's `body` field must be a JSON object.");return nJ($,Q8)}class Z8 extends oJ{constructor(J){super(J);this.name="InvalidUploadError",this.payload={api:{status:400,data:{error:{code:"invalid_request",message:J}}},view:{}}}}async function PQ(J,$){try{return await J.upload($)}catch(Q){if(Q instanceof b&&o0.has(Q.status))throw new iQ(x(Q).message);throw Q}}var o0=new Set([400,413,415,422]);class W8 extends oJ{constructor(J,$){super($);this.name="LimitedUploadError",this.payload={api:{status:422,data:{error:{code:J,message:$}}},view:{}}}}function s0(J,$,Q,Z){if(!J)return null;let{maxBytes:W,accept:K}=J;if(typeof W==="number"&&$.size>W)return{code:"file_too_large",message:`${JSON.stringify(Q)} is ${UQ($.size)}; the limit is ${UQ(W)}.`};if(K&&K.length>0&&!K.some((X)=>a0(X,Q,Z)))return{code:"unsupported_file_type",message:`${JSON.stringify(Q)} is not a type this chat accepts. Accepted: ${K.join(", ")}.`};return null}function a0(J,$,Q){let Z=J.trim().toLowerCase();if(!Z)return!1;if(Z.startsWith("."))return $.toLowerCase().endsWith(Z);let W=Q.toLowerCase().split(";")[0].trim();if(Z.endsWith("/*"))return W.startsWith(Z.slice(0,-1));return W===Z}function UQ(J){if(J<1024)return`${J} B`;let $=["KB","MB","GB"],Q=J/1024,Z=0;while(Q>=1024&&Z<$.length-1)Q/=1024,Z++;return`${Math.round(Q*10)/10} ${$[Z]}`}class iQ extends oJ{constructor(J){super(J);this.name="RejectedUploadError";let $=/(unsupported|invalid) (extension|file type|format|mime)|supported (extensions|formats?)/i.test(J)?"unsupported_file_type":"file_rejected";this.payload={api:{status:422,data:{error:{code:$,message:J}}},view:{}}}}async function ZJ(J,$){let Q=J?.rawRequest;if(!Q||Q.method==="GET"||Q.method==="HEAD"||!Q.body)return{body:{}};if(!t0(Q.headers.get("Content-Type")))return{body:{},status:415,code:"unsupported_media_type",error:"The request body must be sent as application/json."};let Z=Number(Q.headers.get("Content-Length"));if(Number.isFinite(Z)&&Z>$)return NQ($);let W;try{let X=await r0(Q,$);if(X===null)return NQ($);W=X}catch{return{body:{},error:"The request body could not be read."}}if(!W.trim())return{body:{}};let K;try{K=JSON.parse(W)}catch{return{body:{},error:"The request body is not valid JSON."}}if(K===null||typeof K!=="object"||Array.isArray(K))return{body:{},error:"The request body must be a JSON object."};return{body:K}}function t0(J){return jQ(J)==="application/json"}async function r0(J,$){if(!Number.isFinite($)||!J.body)return await J.text();let Q=J.body.getReader(),Z=[],W=0;for(;;){let{done:Y,value:V}=await Q.read();if(Y)break;if(W+=V.byteLength,W>$)return await Q.cancel().catch(WJ),null;Z.push(V)}let K=new Uint8Array(W),X=0;for(let Y of Z)K.set(Y,X),X+=Y.byteLength;return new TextDecoder().decode(K)}function NQ(J){return{body:{},status:413,code:"body_too_large",error:`The request body is larger than this agent accepts (${J} bytes).`}}function K8(J,$,Q){return A(J,{...sJ(EQ(J),Q,J),code:$})}function n(J){if(J.status===413)return K8(413,J.code??"body_too_large",J.error??"");return A(J.status??400,{code:J.code??"invalid_request",message:J.error})}function nQ(J){return Boolean(J.turn)&&typeof J.turn==="object"}function e0(J){let $=nQ(J)?J.turn:J,Q={};if(typeof $.text==="string")Q.text=$.text;if(Array.isArray($.files)){let Z=J6($.files);if(typeof Z==="string")return{error:Z};Q.files=Z}if(Array.isArray($.toolResults))Q.toolResults=$.toolResults;if(Object.keys(Q).length===0)return{};if($===J.turn&&$.localId!==void 0&&$.localId!==null&&$.localId!==""){let{localId:Z}=$;if(typeof Z!=="string")return{error:"turn.localId must be a string."};if(Z.length>BQ)return{error:`turn.localId is longer than ${BQ} characters.`};Q.localId=Z}return{turn:Q}}var BQ=200;function J6(J){let $=[];for(let[Q,Z]of J.entries()){let W=`turn.files[${Q}]`;if(!Z||typeof Z!=="object"||Array.isArray(Z))return`${W} must be an object.`;let K={};for(let H of["fileId","attachmentId","name","mimeType"]){let D=Z[H];if(D===void 0||D===null||D==="")continue;if(typeof D!=="string")return`${W}.${H} must be a string.`;K[H]=D}let{fileId:X,attachmentId:Y,name:V,mimeType:G}=K;if(X?.startsWith(d))return`${W}.fileId holds a gemi attachment id (${X}). \`fileId\` is the provider's id from the upload response; put this one in \`attachmentId\`.`;if(Y!==void 0&&!Y.startsWith(d))return`${W}.attachmentId is not a gemi attachment id: it must start with "${d}".`;if(!X&&!Y)return`${W} has neither a \`fileId\` nor an \`attachmentId\`. Send the ids the upload response answered.`;$.push({...X?{fileId:X}:{},...Y?{attachmentId:Y}:{},...V!==void 0?{name:V}:{},...G!==void 0?{mimeType:G}:{}})}return $}function $6(J,$){if(typeof $.from==="number"&&Number.isFinite($.from))return Math.max(0,Math.floor($.from));if(typeof $.cursor==="number"&&Number.isFinite($.cursor)){let Z=Math.floor($.cursor);if(Z>=0)return Z+1;return}let Q=J?.rawRequest?.headers?.get("Last-Event-ID");if(Q){let Z=Number.parseInt(Q,10);if(Number.isFinite(Z))return Math.max(0,Z+1)}return}function LQ(J,$){let Q=J?.search?.get($);return typeof Q==="string"?Q:void 0}function Q6(J){let $=V8(J);for(let Q=J.length-1;Q>=0;Q--){let Z=J[Q];if(Z.role!=="user"||$.has(Z.id))continue;let W="",K=[];for(let X of Z.content){if(X.type==="text")W+=X.text;if(X.type==="file")K.push({...X.fileId?{fileId:X.fileId}:{},...X.attachmentId?{attachmentId:X.attachmentId}:{},...X.name?{name:X.name}:{},...X.mimeType?{mimeType:X.mimeType}:{}})}if(!W&&K.length===0)continue;return{index:Q,turn:{...W?{text:W}:{},...K.length>0?{files:K}:{}}}}return null}function CQ(){return A(409,{code:"stopped",message:"The turn was stopped before it started."})}function Z6(J){let $=J.event;if(J.text!==void 0||J.turn!==void 0)throw TypeError("AgentController.startTurn takes an `event` or a `text`/`turn`, not both: an event is not a person's message.");if(typeof $!=="object"||$===null||typeof $.name!=="string"||!y0.test($.name))throw TypeError('AgentController.startTurn\'s `event.name` must be letters, digits and `.`, `_`, `:`, `-` (at most 64), like "job-settled".');if($.text!==void 0&&typeof $.text!=="string")throw TypeError("AgentController.startTurn's `event.text` must be a string.");let Q;if($.data!==void 0)try{Q=JSON.parse(JSON.stringify($.data))}catch(Z){throw TypeError(`AgentController.startTurn's \`event.data\` is not JSON: ${String(Z)}`)}return{name:$.name,...$.text?{text:$.text}:{},...Q!==void 0?{data:Q}:{}}}function OQ(J){return A(409,{code:lQ,message:`Thread ${J} has a run going, and this turn was not to interrupt it.`})}function _J(){return A(403,sJ("permission","This run belongs to someone else.",403))}function W6(){return A(403,sJ("permission","A file in this turn was uploaded by someone else.",403))}function K6(J){if(!Array.isArray(J))return[];let $=[];for(let Q of J){let Z=Q?.content;if(!Array.isArray(Z))continue;for(let W of Z)if(W&&typeof W==="object"&&typeof W.fileId==="string")$.push({fileId:W.fileId})}return $}var X6=["sdp","threadId","pushToTalk"];function J8(){return A(404,{code:"voice_not_enabled",message:"This agent has no voice: set `voice` on its controller."})}function A(J,$){return new Response(JSON.stringify({error:$}),{status:J,headers:{"Content-Type":"application/json"}})}function G6(J,$){if(typeof $!=="string"||$.length===0)return J;if($!=="both"&&$!=="provider"&&$!=="storage")throw Error(`Unknown attachment destination "${$}". Expected "both", "provider" or "storage".`);if($===J||J==="both"&&$==="storage")return $;if(J==="both"&&$==="provider")throw Error('This upload asked for the "provider" destination under a "both" policy. A client may ask for "storage", which keeps a file away from the model provider, but it may not ask the server to stop keeping its own copy while the vendor still gets the file \u2014 that is the app\'s retention decision. Change `attachmentDestination()` if this file should not be kept.');throw Error(`This upload asked for the "${$}" destination, but the server's policy for it is "${J}", and a client hint may only ask for "storage" under a "both" policy. Change \`attachmentDestination()\` if the file really should go there.`)}var _Q=!1;function Y6(){if(_Q)return;_Q=!0,console.warn("[gemi/ai] An upload had no attachment scope, so its bytes were sent to the model provider only and no attachment id was minted \u2014 a tool cannot forward this file. Guard the route with auth, send a `threadId` with the upload, or override `attachmentScope()`.")}var V6=2147483647;function H6(J,$){let Q=J.then(()=>{},()=>{});if(!($<=V6))return Q;let Z,W=new Promise((K)=>{Z=setTimeout(K,$)});return Promise.race([Q,W]).finally(()=>clearTimeout(Z))}var MQ=!1;function z6(J){if(MQ||Bun.env.NODE_ENV!=="production")return;if(!(J instanceof X8))return;MQ=!0,console.warn("[gemi/ai] A stateless agent chat is spending approval nonces in process memory. With more than one instance a replayed approval is accepted once per instance. Set `nonces = new RedisNonceStore()` (or your own NonceStore) on the AgentController.")}function D6(J){return J.some(($)=>$.content.some((Q)=>Q.type==="tool-result"&&Q.status==="running"))}function SQ(J,$){if(typeof $!=="string"||$==="")throw TypeError("A store scope is a non-empty string.");if(!J.forScope)throw Error("This controller's store cannot be scoped: storeScope() or a turn's `scope` needs a store that implements `forScope` (DatabaseAgentStore or MemoryAgentStore).");return J.forScope($)}function AQ(J){return A(404,{code:"no_live_run",message:`No run in progress for thread ${J} in this process.`})}export{M6 as windowMessages,PJ as voiceTools,B6 as turnStarts,vJ as toRealtimeUsage,BZ as toAgentTools,U6 as supportsStrict,L6 as splitTurns,T6 as settleSummaries,P6 as s,Y8 as redactError,h6 as parsePartialJson,C6 as messageSize,VJ as measureUsage,h$ as mcpVoiceTools,p$ as liveRuns,NJ as keepSummary,b9 as isCallNotFound,V8 as injectedMessageIds,F$ as generate,z0 as evalChain,d0 as defineAgentHooks,u$ as defaultVoiceStore,w6 as defaultUsageLimitStore,k6 as defaultSummaryStore,G8 as defaultNonceStore,l$ as defaultFileOwners,tJ as defaultAttachmentStore,s$ as defaultAgentStore,pJ as VoiceHangup,i as VoiceBridge,N6 as Usage,U$ as ToolNamespace,m as ToolError,q6 as Skill,aJ as ScopedAttachments,b6 as SKILLS_NAMESPACE,o$ as RedisReceiptStore,qQ as RedisNonceStore,hJ as RealtimeSideband,v as RealtimeRequestError,DJ as RealtimeClient,B8 as Prompt,bQ as PrismaNonceStore,I6 as PendingEscalation,b$ as OpenAIProvider,O$ as OpenAIImageProvider,g$ as MemoryVoiceSessionStore,x6 as MemoryUsageLimitStore,j6 as MemorySummaryStore,n$ as MemoryReceiptStore,X8 as MemoryNonceStore,lJ as MemoryLiveRuns,dJ as MemoryFileOwners,cJ as MemoryCircuitStore,uQ as MemoryAttachmentStore,LJ as MemoryAgentStore,S8 as MemoryAgentJobStore,u8 as MEMORY_NAMESPACE,BJ as LiveRunNotFoundError,R8 as JobsRequireThreadError,A8 as JobHandle,F6 as JSONSchemaError,vQ as InvalidAttachmentScopeError,b8 as InMemoryAgentMemoryStore,bJ as ImageRequestError,fJ as ImageProvider,N$ as ImageModel,$J as FrameCursorEvictedError,FJ as FallbackProvider,h8 as FakeAgentMemoryStore,wJ as Eval,c$ as DatabaseAgentStore,G$ as DatabaseAgentMemoryStore,K$ as DatabaseAgentJobStore,I9 as DEFAULT_TRANSCRIPTION_MODEL,q8 as DEFAULT_MEMORY_MAX_TOKENS,g8 as DEFAULT_MEMORY_LIMITS,S6 as DEFAULT_MAX_SUMMARY_TOKENS,f6 as DEFAULT_MAX_RUN_DURATION_MS,E8 as DEFAULT_JOB_DEADLINE_MS,EJ as DEFAULT_JOBS_CONTEXT_MAX,UJ as DEFAULT_DELEGATE_NAME,O6 as DEFAULT_CONTEXT_WINDOW_STEP,_6 as DEFAULT_CONTEXT_WINDOW_NOTE,A6 as DEFAULT_COMPACT_TRIGGER_TOKENS,R6 as DEFAULT_COMPACT_INSTRUCTIONS,E6 as COMPACT_SUMMARY_HEADER,f$ as AzureOpenAIProvider,_$ as AzureOpenAIImageProvider,yQ as AttachmentNotFoundError,rJ as AgentTurnError,IJ as AgentTool,y6 as AgentRunError,JJ as AgentProvider,f8 as AgentMemoryRefusedError,y8 as AgentMemoryConflictError,v8 as AgentMemories,g as AgentJobs,Q$ as AgentJobDeadlineSweep,j8 as AgentJob,H8 as AgentController,v6 as Agent};
243
266
 
244
- //# debugId=75183A3740B9F01764756E2164756E21
267
+ //# debugId=01583FE2ABE253A664756E2164756E21