gemi 0.139.0 → 0.140.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai/FallbackProvider.d.ts.map +1 -1
- package/dist/ai/index.js +21 -21
- package/dist/ai/index.js.map +5 -5
- package/dist/ai/providers/call.d.ts +21 -1
- package/dist/ai/providers/call.d.ts.map +1 -1
- package/dist/ai/providers/http.d.ts +13 -0
- package/dist/ai/providers/http.d.ts.map +1 -1
- package/dist/ai/runtime.d.ts +10 -1
- package/dist/ai/runtime.d.ts.map +1 -1
- package/dist/app/index.js +1 -1
- package/dist/bun/plugin.js +1 -1
- package/dist/bun/preload.js +1 -1
- package/dist/{chunk-qvx8473q.js → chunk-0c553zfq.js} +3 -3
- package/dist/{chunk-qvx8473q.js.map → chunk-0c553zfq.js.map} +1 -1
- package/dist/{chunk-78zfqt54.js → chunk-18y8n1r3.js} +2 -2
- package/dist/{chunk-78zfqt54.js.map → chunk-18y8n1r3.js.map} +1 -1
- package/dist/{chunk-a2fhbstt.js → chunk-1cdz01em.js} +3 -3
- package/dist/{chunk-a2fhbstt.js.map → chunk-1cdz01em.js.map} +1 -1
- package/dist/{chunk-fwmmy0jn.js → chunk-1fe07ge4.js} +1 -1
- package/dist/{chunk-y6gr3stt.js → chunk-23mcs80p.js} +3 -3
- package/dist/{chunk-y6gr3stt.js.map → chunk-23mcs80p.js.map} +1 -1
- package/dist/{chunk-bg0e39dk.js → chunk-3v4esxbd.js} +2 -2
- package/dist/{chunk-bg0e39dk.js.map → chunk-3v4esxbd.js.map} +1 -1
- package/dist/{chunk-ted0qjps.js → chunk-3wpxqcw7.js} +1 -1
- package/dist/{chunk-5benn2ys.js → chunk-5013raxj.js} +3 -3
- package/dist/{chunk-5benn2ys.js.map → chunk-5013raxj.js.map} +1 -1
- package/dist/{chunk-f9w78tbd.js → chunk-5aj27bgc.js} +2 -2
- package/dist/{chunk-f9w78tbd.js.map → chunk-5aj27bgc.js.map} +1 -1
- package/dist/chunk-5gkzbhts.js +5 -0
- package/dist/{chunk-fs4ntgdr.js.map → chunk-5gkzbhts.js.map} +1 -1
- package/dist/{chunk-qk6vmvr2.js → chunk-6d9f4vw0.js} +4 -4
- package/dist/{chunk-qk6vmvr2.js.map → chunk-6d9f4vw0.js.map} +1 -1
- package/dist/{chunk-skmdmqv7.js → chunk-6hs102jh.js} +2 -2
- package/dist/{chunk-skmdmqv7.js.map → chunk-6hs102jh.js.map} +1 -1
- package/dist/{chunk-zvzvgrrn.js → chunk-6jd0e1dz.js} +2 -2
- package/dist/{chunk-zvzvgrrn.js.map → chunk-6jd0e1dz.js.map} +1 -1
- package/dist/{chunk-kpb8xvrv.js → chunk-6qydm38w.js} +2 -2
- package/dist/{chunk-kpb8xvrv.js.map → chunk-6qydm38w.js.map} +1 -1
- package/dist/{chunk-85k70cme.js → chunk-6zz3kez5.js} +3 -3
- package/dist/{chunk-85k70cme.js.map → chunk-6zz3kez5.js.map} +1 -1
- package/dist/{chunk-y4mnxgdt.js → chunk-7dwgex81.js} +5 -5
- package/dist/{chunk-y4mnxgdt.js.map → chunk-7dwgex81.js.map} +3 -3
- package/dist/{chunk-yhp70t40.js → chunk-7hdfbp2x.js} +2 -2
- package/dist/{chunk-yhp70t40.js.map → chunk-7hdfbp2x.js.map} +1 -1
- package/dist/{chunk-vz5rrcnh.js → chunk-7p64zc6a.js} +2 -2
- package/dist/{chunk-vz5rrcnh.js.map → chunk-7p64zc6a.js.map} +1 -1
- package/dist/{chunk-nbfksexg.js → chunk-8gfgsmxk.js} +2 -2
- package/dist/{chunk-nbfksexg.js.map → chunk-8gfgsmxk.js.map} +1 -1
- package/dist/{chunk-c6c7p43e.js → chunk-8r9kna46.js} +2 -2
- package/dist/{chunk-c6c7p43e.js.map → chunk-8r9kna46.js.map} +1 -1
- package/dist/{chunk-7d26eqv1.js → chunk-98dxtkbt.js} +2 -2
- package/dist/{chunk-7d26eqv1.js.map → chunk-98dxtkbt.js.map} +1 -1
- package/dist/{chunk-n7576zsr.js → chunk-9b4ypfcw.js} +3 -3
- package/dist/{chunk-n7576zsr.js.map → chunk-9b4ypfcw.js.map} +1 -1
- package/dist/{chunk-aj2sr77y.js → chunk-9yfg4nqq.js} +2 -2
- package/dist/{chunk-aj2sr77y.js.map → chunk-9yfg4nqq.js.map} +1 -1
- package/dist/{chunk-c83e4ghx.js → chunk-apfk702c.js} +2 -2
- package/dist/{chunk-c83e4ghx.js.map → chunk-apfk702c.js.map} +1 -1
- package/dist/{chunk-7t7jh8t2.js → chunk-b3tmkge9.js} +2 -2
- package/dist/{chunk-7t7jh8t2.js.map → chunk-b3tmkge9.js.map} +1 -1
- package/dist/{chunk-6qzyq0g5.js → chunk-b4qh3ywd.js} +2 -2
- package/dist/{chunk-6qzyq0g5.js.map → chunk-b4qh3ywd.js.map} +1 -1
- package/dist/{chunk-d368es1y.js → chunk-b9d021hx.js} +2 -2
- package/dist/{chunk-d368es1y.js.map → chunk-b9d021hx.js.map} +1 -1
- package/dist/{chunk-46bwknb5.js → chunk-c7ecv545.js} +3 -3
- package/dist/{chunk-46bwknb5.js.map → chunk-c7ecv545.js.map} +1 -1
- package/dist/{chunk-wbvb1hcx.js → chunk-ct3sgfpj.js} +2 -2
- package/dist/{chunk-wbvb1hcx.js.map → chunk-ct3sgfpj.js.map} +1 -1
- package/dist/{chunk-965gfa41.js → chunk-d0kw04ym.js} +2 -2
- package/dist/{chunk-965gfa41.js.map → chunk-d0kw04ym.js.map} +1 -1
- package/dist/{chunk-vmr4d6hc.js → chunk-d1whcvyn.js} +1 -1
- package/dist/{chunk-zbdgwgfv.js → chunk-d7a092vd.js} +2 -2
- package/dist/{chunk-zbdgwgfv.js.map → chunk-d7a092vd.js.map} +1 -1
- package/dist/{chunk-p1y58p84.js → chunk-dje31gme.js} +2 -2
- package/dist/{chunk-p1y58p84.js.map → chunk-dje31gme.js.map} +1 -1
- package/dist/{chunk-3jkem5gq.js → chunk-dptp6ceg.js} +2 -2
- package/dist/{chunk-3jkem5gq.js.map → chunk-dptp6ceg.js.map} +1 -1
- package/dist/{chunk-an1nja68.js → chunk-dvwdehnp.js} +2 -2
- package/dist/{chunk-an1nja68.js.map → chunk-dvwdehnp.js.map} +1 -1
- package/dist/{chunk-v4dp93qv.js → chunk-dzvp8ynr.js} +3 -3
- package/dist/{chunk-v4dp93qv.js.map → chunk-dzvp8ynr.js.map} +1 -1
- package/dist/{chunk-d492ae5e.js → chunk-e3y72vzw.js} +2 -2
- package/dist/{chunk-d492ae5e.js.map → chunk-e3y72vzw.js.map} +1 -1
- package/dist/{chunk-9s203ks3.js → chunk-e9eh5k8a.js} +2 -2
- package/dist/{chunk-9s203ks3.js.map → chunk-e9eh5k8a.js.map} +1 -1
- package/dist/{chunk-pv2mtg8n.js → chunk-e9xbdgb2.js} +2 -2
- package/dist/{chunk-pv2mtg8n.js.map → chunk-e9xbdgb2.js.map} +1 -1
- package/dist/{chunk-md6wfc1h.js → chunk-eve0hewa.js} +3 -3
- package/dist/{chunk-md6wfc1h.js.map → chunk-eve0hewa.js.map} +1 -1
- package/dist/{chunk-kzdkpz04.js → chunk-eydahc2f.js} +1 -1
- package/dist/{chunk-z969a4nt.js → chunk-eyqsvzej.js} +2 -2
- package/dist/{chunk-z969a4nt.js.map → chunk-eyqsvzej.js.map} +1 -1
- package/dist/{chunk-cedmppcy.js → chunk-gp4s95kn.js} +2 -2
- package/dist/{chunk-cedmppcy.js.map → chunk-gp4s95kn.js.map} +1 -1
- package/dist/{chunk-63m8s40k.js → chunk-gx202f9t.js} +2 -2
- package/dist/{chunk-63m8s40k.js.map → chunk-gx202f9t.js.map} +1 -1
- package/dist/{chunk-ant9ck0r.js → chunk-gy307m19.js} +2 -2
- package/dist/{chunk-ant9ck0r.js.map → chunk-gy307m19.js.map} +1 -1
- package/dist/{chunk-h0ydk8cc.js → chunk-j9hf1jyd.js} +2 -2
- package/dist/{chunk-h0ydk8cc.js.map → chunk-j9hf1jyd.js.map} +1 -1
- package/dist/{chunk-7vxeqxxr.js → chunk-jrvg80jw.js} +2 -2
- package/dist/{chunk-7vxeqxxr.js.map → chunk-jrvg80jw.js.map} +1 -1
- package/dist/{chunk-8dmhbj4m.js → chunk-k732d7x5.js} +2 -2
- package/dist/{chunk-8dmhbj4m.js.map → chunk-k732d7x5.js.map} +1 -1
- package/dist/{chunk-4jc7wbet.js → chunk-kc2z9z3m.js} +2 -2
- package/dist/{chunk-4jc7wbet.js.map → chunk-kc2z9z3m.js.map} +1 -1
- package/dist/{chunk-xwmy6fby.js → chunk-kddgfct7.js} +3 -3
- package/dist/{chunk-xwmy6fby.js.map → chunk-kddgfct7.js.map} +1 -1
- package/dist/{chunk-qfhcec6q.js → chunk-ks7msv3e.js} +2 -2
- package/dist/{chunk-qfhcec6q.js.map → chunk-ks7msv3e.js.map} +1 -1
- package/dist/{chunk-9wc53ywv.js → chunk-me6mmvbq.js} +2 -2
- package/dist/{chunk-9wc53ywv.js.map → chunk-me6mmvbq.js.map} +1 -1
- package/dist/{chunk-c0m8pcbd.js → chunk-mj55jdwp.js} +1 -1
- package/dist/{chunk-z76te7x6.js → chunk-mxqnrn1k.js} +2 -2
- package/dist/{chunk-z76te7x6.js.map → chunk-mxqnrn1k.js.map} +1 -1
- package/dist/{chunk-n1n7qb34.js → chunk-ny01tp0y.js} +4 -4
- package/dist/{chunk-n1n7qb34.js.map → chunk-ny01tp0y.js.map} +1 -1
- package/dist/{chunk-8ef5c93d.js → chunk-p131vmpy.js} +2 -2
- package/dist/{chunk-8ef5c93d.js.map → chunk-p131vmpy.js.map} +1 -1
- package/dist/{chunk-g22q8j2s.js → chunk-pfgbkhmm.js} +2 -2
- package/dist/{chunk-g22q8j2s.js.map → chunk-pfgbkhmm.js.map} +1 -1
- package/dist/{chunk-n2czjpz9.js → chunk-pxavt1j3.js} +2 -2
- package/dist/{chunk-n2czjpz9.js.map → chunk-pxavt1j3.js.map} +1 -1
- package/dist/{chunk-jys3n8xv.js → chunk-qdz4dqbf.js} +3 -3
- package/dist/{chunk-jys3n8xv.js.map → chunk-qdz4dqbf.js.map} +1 -1
- package/dist/{chunk-gqcmnyc8.js → chunk-qvtmn7mn.js} +2 -2
- package/dist/{chunk-gqcmnyc8.js.map → chunk-qvtmn7mn.js.map} +1 -1
- package/dist/{chunk-gq4fr0zn.js → chunk-r1x5ms0y.js} +3 -3
- package/dist/{chunk-gq4fr0zn.js.map → chunk-r1x5ms0y.js.map} +1 -1
- package/dist/{chunk-w17p2k8g.js → chunk-r6thf4ge.js} +3 -3
- package/dist/{chunk-w17p2k8g.js.map → chunk-r6thf4ge.js.map} +1 -1
- package/dist/{chunk-z0jazehw.js → chunk-rw4z3n9b.js} +2 -2
- package/dist/{chunk-z0jazehw.js.map → chunk-rw4z3n9b.js.map} +1 -1
- package/dist/{chunk-e440f645.js → chunk-rwrcsfzv.js} +2 -2
- package/dist/{chunk-e440f645.js.map → chunk-rwrcsfzv.js.map} +1 -1
- package/dist/{chunk-27xv8kty.js → chunk-s58hbczk.js} +2 -2
- package/dist/{chunk-27xv8kty.js.map → chunk-s58hbczk.js.map} +1 -1
- package/dist/{chunk-8p4t8x9c.js → chunk-t6n490ha.js} +2 -2
- package/dist/{chunk-8p4t8x9c.js.map → chunk-t6n490ha.js.map} +1 -1
- package/dist/{chunk-80fjsb26.js → chunk-t7qp951h.js} +3 -3
- package/dist/{chunk-80fjsb26.js.map → chunk-t7qp951h.js.map} +1 -1
- package/dist/{chunk-038xtqpm.js → chunk-tbhtx2t0.js} +2 -2
- package/dist/{chunk-chyt9th4.js.map → chunk-tbhtx2t0.js.map} +1 -1
- package/dist/{chunk-974p7em0.js → chunk-tghh8r2q.js} +2 -2
- package/dist/{chunk-974p7em0.js.map → chunk-tghh8r2q.js.map} +1 -1
- package/dist/{chunk-p2c7z2nr.js → chunk-v2cv3wcw.js} +2 -2
- package/dist/{chunk-p2c7z2nr.js.map → chunk-v2cv3wcw.js.map} +1 -1
- package/dist/{chunk-rqb52m93.js → chunk-vp4x2c0k.js} +2 -2
- package/dist/{chunk-rqb52m93.js.map → chunk-vp4x2c0k.js.map} +1 -1
- package/dist/{chunk-chyt9th4.js → chunk-vtqvq9ca.js} +2 -2
- package/dist/{chunk-038xtqpm.js.map → chunk-vtqvq9ca.js.map} +1 -1
- package/dist/{chunk-eqzxvfvt.js → chunk-x4g0r9d3.js} +2 -2
- package/dist/{chunk-eqzxvfvt.js.map → chunk-x4g0r9d3.js.map} +1 -1
- package/dist/{chunk-zj8y4ak5.js → chunk-y7v30zd8.js} +1 -1
- package/dist/{chunk-6t38r0hf.js → chunk-ygyjtrzb.js} +2 -2
- package/dist/{chunk-6t38r0hf.js.map → chunk-ygyjtrzb.js.map} +1 -1
- package/dist/{chunk-26yghzet.js → chunk-yxhg3wjf.js} +2 -2
- package/dist/{chunk-26yghzet.js.map → chunk-yxhg3wjf.js.map} +1 -1
- package/dist/{chunk-ghbzre7k.js → chunk-yxjfghq3.js} +3 -3
- package/dist/{chunk-ghbzre7k.js.map → chunk-yxjfghq3.js.map} +1 -1
- package/dist/config/index.js +1 -1
- package/dist/console/run.js +2 -2
- package/dist/console/run.js.map +1 -1
- package/dist/container/index.js +2 -2
- package/dist/container/index.js.map +1 -1
- package/dist/database/index.js +2 -2
- package/dist/database/index.js.map +1 -1
- package/dist/email/index.js +2 -2
- package/dist/email/index.js.map +1 -1
- package/dist/facades/index.js +2 -2
- package/dist/facades/index.js.map +1 -1
- package/dist/foundation/index.js +2 -2
- package/dist/foundation/index.js.map +1 -1
- package/dist/http/index.js +2 -2
- package/dist/http/index.js.map +1 -1
- package/dist/i18n/dictionaryRuntime.js +2 -2
- package/dist/i18n/dictionaryRuntime.js.map +1 -1
- package/dist/i18n/index.js +2 -2
- package/dist/i18n/index.js.map +1 -1
- package/dist/kernel/index.js +2 -2
- package/dist/kernel/index.js.map +1 -1
- package/dist/orm/index.js +2 -2
- package/dist/orm/index.js.map +1 -1
- package/dist/server/index.js +2 -2
- package/dist/server/index.js.map +1 -1
- package/dist/services/index.js +2 -2
- package/dist/services/index.js.map +1 -1
- package/dist/services/queue/work.js +2 -2
- package/dist/services/queue/work.js.map +1 -1
- package/dist/stats/route-table.js +1 -1
- package/dist/support/index.js +2 -2
- package/dist/support/index.js.map +1 -1
- package/dist/vitest/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-fs4ntgdr.js +0 -5
- /package/dist/{chunk-fwmmy0jn.js.map → chunk-1fe07ge4.js.map} +0 -0
- /package/dist/{chunk-ted0qjps.js.map → chunk-3wpxqcw7.js.map} +0 -0
- /package/dist/{chunk-vmr4d6hc.js.map → chunk-d1whcvyn.js.map} +0 -0
- /package/dist/{chunk-kzdkpz04.js.map → chunk-eydahc2f.js.map} +0 -0
- /package/dist/{chunk-c0m8pcbd.js.map → chunk-mj55jdwp.js.map} +0 -0
- /package/dist/{chunk-zj8y4ak5.js.map → chunk-y7v30zd8.js.map} +0 -0
package/dist/ai/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{$c as
|
|
3
|
-
`)}function
|
|
2
|
+
import{$c as c9,Ac as $$,Bc as Z$,Cc as K$,Dc as G$,Ec as X$,Fc as Y$,Gc as V$,Hc as H$,Ic as z$,Kc as w,Lc as N$,Mc as i,Nc as k,Oc as gQ,Pc as x9,Qc as q9,Rc as I9,Sc as w9,Tc as b9,Uc as f9,Vc as v9,Wc as h9,Xb as vQ,Xc as y9,Yb as k6,Yc as g9,Zb as hQ,Zc as u9,_c as TQ,ac as MJ,ad as I6,bc as j,bd as m9,cc as E,cd as p9,dc as g,dd as OJ,ec as yQ,ed as oJ,fc as R6,fd as l9,gc as T6,gd as d9,hc as j6,hd as i9,ic as m,id as n9,jc as E6,jd as o9,kc as yJ,kd as a9,lc as x6,mc as q6,nc as gJ,oc as oQ,pc as aQ,rc as sQ,sc as h,tc as G6,uc as X6,vc as tQ,xc as rQ,yc as W$,zc as Q$}from"../chunk-7dwgex81.js";import{Cd as mQ}from"../chunk-6jd0e1dz.js";import"../chunk-6zz3kez5.js";import{Bi as A6,Mh as y$,Nh as T9,Oh as j9,Ph as E9,Qh as x,th as M6,ui as S6,wh as _6,xi as AQ}from"../chunk-eve0hewa.js";import{Ci as C6,Ei as vJ,Fi as hJ}from"../chunk-v2cv3wcw.js";import{Oi as y}from"../chunk-7hdfbp2x.js";import"../chunk-98dxtkbt.js";import"../chunk-ks7msv3e.js";import{Rj as BJ,Sj as FJ,ek as nQ}from"../chunk-yxjfghq3.js";import"../chunk-8r9kna46.js";import{Tk as s$}from"../chunk-kddgfct7.js";import"../chunk-s58hbczk.js";import"../chunk-eyqsvzej.js";import"../chunk-9yfg4nqq.js";import"../chunk-tbhtx2t0.js";class cJ extends mQ{name="AgentJobDeadlineSweep";cron="* * * * *";async callback(){while(await h.sweep({limit:100})===100);}}var HJ=20;function lQ(J,Q){if(Q<=0||J.length===0)return null;let $=(K,G)=>G.createdAt-K.createdAt||(K.id<G.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($),...J.filter((K)=>K.state!=="running").sort($)].slice(0,Q).map((K)=>{let G=[`- ${K.id} (${K.toolName})`];if(K.state==="running")G.push(`running since ${mJ(K.createdAt)}`);else if(K.state==="ok")G.push(`finished at ${mJ(K.settledAt??K.updatedAt)}`);else{let Y=K.error?`${K.error.code}: ${pQ(K.error.message,200)}`:"failed";G.push(`failed at ${mJ(K.settledAt??K.updatedAt)} (${Y})`)}if(K.summary!==void 0)G.push(`summary: ${pQ(JSON.stringify(K.summary),300)}`);if(K.orphaned)G.push("its tool call was lost when the turn that started it was cut short");return G.join("; ")}),"</jobs>"].join(`
|
|
3
|
+
`)}function mJ(J){return new Date(J).toISOString().replace(/\.\d{3}Z$/,"Z")}function pQ(J,Q){return J.length<=Q?J:`${J.slice(0,Q-1)}\u2026`}class lJ{table;sql;dialect;connection;constructor(J,Q={}){let $=Q.table??"gemi_agent_jobs";if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test($))throw Error(`The agent jobs table name "${$}" is not a plain identifier. Use letters, digits and underscores.`);this.table=$,this.sql=J.sql,this.dialect=J.dialect,this.connection=J.name}async createTable(){for(let J of h6(this.dialect,this.table))await this.sql.unsafe(J)}async transaction(J){if(this.connection===void 0||this.joinable())return J();return nQ(this.sql,()=>J(),{connection:this.connection})}async create(J){let Q=this.q(),$=this.clock(Q);await Q`
|
|
4
4
|
INSERT INTO ${this.name(Q)}
|
|
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)
|
|
@@ -8,7 +8,7 @@ import{$c as E6,Ac as J$,Bc as $$,Cc as Z$,Dc as W$,Ec as K$,Fc as G$,Gc as X$,H
|
|
|
8
8
|
(${J.id}, ${J.threadId}, ${J.runId}, ${J.toolCallId}, ${J.toolName},
|
|
9
9
|
${J.owner}, ${J.job}, ${zJ(J.summary)}, 'running', 0, ${J.attachmentScope},
|
|
10
10
|
${$}, ${$}, ${$} + ${this.ms(Q,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 Q=this.q(),$=await Q`SELECT * FROM ${this.name(Q)} WHERE id = ${J}`;return $[0]?
|
|
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 Q=this.q(),$=await Q`SELECT * FROM ${this.name(Q)} WHERE id = ${J}`;return $[0]?pJ($[0]):null}async listForThread(J,Q={}){let $=this.q(),Z=Q.states===void 0?$`1 = 1`:Q.states.length===0?$`1 = 0`:$`state IN (${dQ($,Q.states)})`;return(Q.limit===void 0?await $`
|
|
12
12
|
SELECT * FROM ${this.name($)}
|
|
13
13
|
WHERE thread_id = ${J} AND ${Z}
|
|
14
14
|
ORDER BY created_at DESC, id DESC
|
|
@@ -17,18 +17,18 @@ import{$c as E6,Ac as J$,Bc as $$,Cc as Z$,Dc as W$,Ec as K$,Fc as G$,Gc as X$,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(Q.limit))}
|
|
20
|
-
`).map(
|
|
20
|
+
`).map(pJ)}async transition(J,Q,$){if(Q.length===0)return!1;let Z=this.q(),W=this.clock(Z),K=[Z`updated_at = ${W}`];if($.state!==void 0)K.push(Z`state = ${$.state}`);if("output"in $)K.push(Z`output = ${zJ($.output)}`);if("error"in $)K.push(Z`error = ${zJ($.error)}`);if("usage"in $)K.push(Z`${this.column(Z,"usage")} = ${zJ($.usage)}`);if("orphaned"in $)K.push(Z`orphaned = ${$.orphaned?1:0}`);if($.state!==void 0&&$.state!=="running")K.push($.settledAt!==void 0?Z`settled_at = COALESCE(settled_at, ${this.ms(Z,$.settledAt)})`:Z`settled_at = COALESCE(settled_at, ${W})`);let G=K.reduce((V,X)=>Z`${V}, ${X}`),Y=await Z`
|
|
21
21
|
UPDATE ${this.name(Z)} SET ${G}
|
|
22
|
-
WHERE id = ${J} AND state IN (${
|
|
23
|
-
`;return
|
|
22
|
+
WHERE id = ${J} AND state IN (${dQ(Z,Q)})
|
|
23
|
+
`;return iQ(Y)>0}async overdue(J,Q){let $=this.q();return(await $`
|
|
24
24
|
SELECT * FROM ${this.name($)}
|
|
25
25
|
WHERE state = 'running' AND deadline_at <= ${this.ms($,J)}
|
|
26
26
|
ORDER BY deadline_at, id
|
|
27
27
|
LIMIT ${Math.max(0,Math.floor(Q))}
|
|
28
|
-
`).map(
|
|
28
|
+
`).map(pJ)}async now(){let J=this.q(),[Q]=await J`SELECT ${this.clock(J)} AS now`;return Number(Q.now)}async prune(J){let Q=this.q(),$=await Q`
|
|
29
29
|
DELETE FROM ${this.name(Q)}
|
|
30
30
|
WHERE state <> 'running' AND settled_at <= ${this.clock(Q)} - ${this.ms(Q,J)}
|
|
31
|
-
`;return
|
|
31
|
+
`;return iQ($)}joinable(){if(this.connection===void 0)return;let J=BJ();if(J===void 0||FJ()!==this.connection)return;return J}q(){return this.joinable()??this.sql}column(J,Q){let $=this.dialect==="mysql"||this.dialect==="mariadb";return J.unsafe($?`\`${Q}\``:`"${Q}"`)}name(J){let Q=this.dialect==="mysql"||this.dialect==="mariadb";return J.unsafe(Q?`\`${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,Q){let $=Math.max(0,Math.round(Q));return this.dialect==="mysql"||this.dialect==="mariadb"?J`CAST(${$} AS SIGNED)`:J`CAST(${$} AS BIGINT)`}}function dQ(J,Q){return Q.map(($)=>J`${$}`).reduce(($,Z)=>J`${$}, ${Z}`)}function zJ(J){return J===void 0?null:JSON.stringify(J)}function DJ(J){if(J===null||J===void 0)return;return JSON.parse(String(J))}function pJ(J){let Q=DJ(J.summary),$=DJ(J.output),Z=DJ(J.error),W=DJ(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),...Q!==void 0?{summary:Q}:{},state:String(J.state),...$!==void 0?{output:$}:{},...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 iQ(J){let Q=J;return Math.max(Number(Q.count??0),Number(Q.affectedRows??0))}function h6(J,Q){if(J==="mysql"||J==="mariadb")return[`CREATE TABLE IF NOT EXISTS \`${Q}\` (
|
|
32
32
|
\`id\` VARCHAR(191) NOT NULL,
|
|
33
33
|
\`thread_id\` VARCHAR(191) NOT NULL,
|
|
34
34
|
\`run_id\` VARCHAR(191) NOT NULL,
|
|
@@ -72,20 +72,20 @@ import{$c as E6,Ac as J$,Bc as $$,Cc as Z$,Dc as W$,Ec as K$,Fc as G$,Gc as X$,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 "${Q}_thread_id_created_at_idx" ON "${Q}"("thread_id", "created_at")`,`CREATE INDEX IF NOT EXISTS "${Q}_state_deadline_at_idx" ON "${Q}"("state", "deadline_at")`]}var
|
|
75
|
+
)`,`CREATE INDEX IF NOT EXISTS "${Q}_thread_id_created_at_idx" ON "${Q}"("thread_id", "created_at")`,`CREATE INDEX IF NOT EXISTS "${Q}_state_deadline_at_idx" ON "${Q}"("state", "deadline_at")`]}var eQ=4;class iJ{table;sql;dialect;connection;constructor(J,Q={}){let $=Q.table??"gemi_agent_memories";if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test($))throw Error(`The agent memories table name "${$}" is not a plain identifier. Use letters, digits and underscores.`);this.table=$,this.sql=J.sql,this.dialect=J.dialect,this.connection=J.name}async createTable(){for(let J of y6(this.dialect,this.table))await this.sql.unsafe(J)}async list(J,Q={}){if(J.length===0)return[];if(Q.kinds!==void 0&&Q.kinds.length===0)return[];let $=this.q(),Z=[$`scope IN (${e($,J)})`];if(Q.kinds!==void 0)Z.push($`kind IN (${e($,Q.kinds)})`);if(!Q.includeExpired)Z.push($`(expires_at IS NULL OR expires_at > ${this.clock($)})`);if(Q.after!==void 0){let[V]=await $`
|
|
76
76
|
SELECT created_at, id FROM ${this.name($)}
|
|
77
77
|
WHERE id = ${Q.after} AND scope IN (${e($,J)})
|
|
78
|
-
`;if(V){let
|
|
78
|
+
`;if(V){let X=this.ms($,Number(V.created_at));Z.push($`(created_at > ${X} OR (created_at = ${X} AND id > ${String(V.id)}))`)}}let W=Z.reduce((V,X)=>$`${V} AND ${X}`),K=Q.limit===void 0||Q.tags!==void 0?void 0:Math.max(0,Math.floor(Q.limit)),Y=(K===void 0?await $`
|
|
79
79
|
SELECT * FROM ${this.name($)} WHERE ${W}
|
|
80
80
|
ORDER BY created_at, id
|
|
81
81
|
`:await $`
|
|
82
82
|
SELECT * FROM ${this.name($)} WHERE ${W}
|
|
83
83
|
ORDER BY created_at, id
|
|
84
84
|
LIMIT ${K}
|
|
85
|
-
`).map(
|
|
85
|
+
`).map(dJ);if(Q.tags!==void 0){if(Y=Y.filter((V)=>$$(V,Q.tags)),Q.limit!==void 0)Y=Y.slice(0,Math.max(0,Math.floor(Q.limit)))}return Y}async get(J){let Q=this.q(),$=await Q`SELECT * FROM ${this.name(Q)} WHERE id = ${J}`;return $[0]?dJ($[0]):null}async upsert(J){let Q=J.key??null;if(Q===null)return await this.insert(J,null),{record:await this.mustGet(J.id),action:"added"};for(let $=1;;$++){let Z=await this.atKey(J.scope,Q);if(Z){if(Z$(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,Q),{record:await this.mustGet(J.id),action:"added"}}catch(W){if($>=eQ||!await this.atKey(J.scope,Q))throw W}if($>=eQ)throw Error(`The memory at "${Q}" 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(Q.kind!==void 0)W.push(Z`kind = ${Q.kind}`);if(Q.content!==void 0)W.push(Z`content = ${Q.content}`);if(Q.key!==void 0)W.push(Z`${this.column(Z,"key")} = ${Q.key}`);if(Q.tags!==void 0)W.push(Z`tags = ${JSON.stringify(Q.tags)}`);if(Q.pinned!==void 0)W.push(Z`pinned = ${Q.pinned?1:0}`);if(Q.expiresAt!==void 0)W.push(Q.expiresAt===null?Z`expires_at = NULL`:Z`expires_at = ${this.ms(Z,Q.expiresAt)}`);let K=W.reduce((Y,V)=>Z`${Y}, ${V}`),G=$===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($)}
|
|
88
|
-
`;if(PJ(G)===0)return null;return this.get(J)}async delete(J){if(J.length===0)return 0;let Q=this.q(),$=await Q`DELETE FROM ${this.name(Q)} WHERE id IN (${e(Q,[...new Set(J)])})`;return PJ($)}async deleteScope(J){let Q=this.q();return PJ(await Q`DELETE FROM ${this.name(Q)} WHERE scope = ${J}`)}async search(J,Q,$={}){let Z=await this.list(J,{kinds:$.kinds,tags:$.tags});return
|
|
88
|
+
`;if(PJ(G)===0)return null;return this.get(J)}async delete(J){if(J.length===0)return 0;let Q=this.q(),$=await Q`DELETE FROM ${this.name(Q)} WHERE id IN (${e(Q,[...new Set(J)])})`;return PJ($)}async deleteScope(J){let Q=this.q();return PJ(await Q`DELETE FROM ${this.name(Q)} WHERE scope = ${J}`)}async search(J,Q,$={}){let Z=await this.list(J,{kinds:$.kinds,tags:$.tags});return Q$(Z,Q,$.limit)}async count(J){let Q=this.q(),[$]=await Q`
|
|
89
89
|
SELECT COUNT(*) AS total FROM ${this.name(Q)}
|
|
90
90
|
WHERE scope = ${J} AND (expires_at IS NULL OR expires_at > ${this.clock(Q)})
|
|
91
91
|
`;return Number($?.total??0)}async touch(J,Q){if(J.length===0)return;let $=this.q();await $`
|
|
@@ -102,7 +102,7 @@ import{$c as E6,Ac as J$,Bc as $$,Cc as Z$,Dc as W$,Ec as K$,Fc as G$,Gc as X$,H
|
|
|
102
102
|
${W===null?null:this.ms($,W)})
|
|
103
103
|
`}async atKey(J,Q){let $=this.q(),Z=await $`
|
|
104
104
|
SELECT * FROM ${this.name($)} WHERE scope = ${J} AND ${this.column($,"key")} = ${Q}
|
|
105
|
-
`;return Z[0]?
|
|
105
|
+
`;return Z[0]?dJ(Z[0]):null}async mustGet(J){let Q=await this.get(J);if(!Q)throw Error(`The memory ${J} was not found after it was written.`);return Q}joinable(){if(this.connection===void 0)return;let J=BJ();if(J===void 0||FJ()!==this.connection)return;return J}q(){return this.joinable()??this.sql}column(J,Q){let $=this.dialect==="mysql"||this.dialect==="mariadb";return J.unsafe($?`\`${Q}\``:`"${Q}"`)}name(J){let Q=this.dialect==="mysql"||this.dialect==="mariadb";return J.unsafe(Q?`\`${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,Q){let $=Math.max(0,Math.round(Q));return this.dialect==="mysql"||this.dialect==="mariadb"?J`CAST(${$} AS SIGNED)`:J`CAST(${$} AS BIGINT)`}}function e(J,Q){return Q.map(($)=>J`${$}`).reduce(($,Z)=>J`${$}, ${Z}`)}function J$(J,Q){if(J===null||J===void 0||J==="")return Q;try{return JSON.parse(String(J))}catch{return Q}}function dJ(J){let Q=J$(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(Q)?Q.map(String):[],pinned:Number(J.pinned)===1,source:J$(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 PJ(J){let Q=J;return Math.max(Number(Q.count??0),Number(Q.affectedRows??0))}function y6(J,Q){if(J==="mysql"||J==="mariadb")return[`CREATE TABLE IF NOT EXISTS \`${Q}\` (
|
|
106
106
|
\`id\` VARCHAR(191) NOT NULL,
|
|
107
107
|
\`scope\` VARCHAR(191) NOT NULL,
|
|
108
108
|
\`kind\` VARCHAR(191) NOT NULL,
|
|
@@ -139,17 +139,17 @@ import{$c as E6,Ac as J$,Bc as $$,Cc as Z$,Dc as W$,Ec as K$,Fc as G$,Gc as X$,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 "${Q}_scope_kind_created_at_idx" ON "${Q}"("scope", "kind", "created_at")`,`CREATE INDEX IF NOT EXISTS "${Q}_expires_at_idx" ON "${Q}"("expires_at")`,`CREATE UNIQUE INDEX IF NOT EXISTS "${Q}_scope_key_key" ON "${Q}"("scope", "key")`]}var v6=/^[A-Za-z0-9_-]{1,64}$/;function h6(J,Q){let $=y6(Q)?Q:{filter:Q},Z=$.deferred===!0,W=J.descriptors($.filter);if(!$.namespaces)return W.map((H)=>dJ(J,H,Z));let K=Object.entries($.namespaces),G=new Set(J.descriptors().flatMap((H)=>H.tags));for(let[H,D]of K){if(!v6.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(!G.has(H))throw Error(`toAgentTools: no tool is tagged "${H}", so its namespace would be empty.`)}let X=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(dJ(J,H,Z));else X.get(D).push(dJ(J,H,!1))}let Y=[];for(let[H,D]of K){let z=X.get(H);if(z.length===0)continue;Y.push(iJ.create({name:H,description:D.description,tools:z,deferred:D.deferred??Z}))}return[...Y,...V]}function y6(J){return typeof J==="object"&&J!==null&&(("filter"in J)||("namespaces"in J)||("deferred"in J))}function dJ(J,Q,$){if(Q.kind==="tool")return g6(J,Q,$);return UJ.create({name:Q.name,description:Q.description,inputSchema:Q.inputSchema,...Q.outputSchema?{outputSchema:Q.outputSchema}:{},requiresApproval:Q.requiresApproval,deferred:$,execute:(Z,W)=>{let K=h.getStore()?.req;if(!K)throw new y(`"${Q.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},Q.name,Z,W)}})}function g6(J,Q,$){let Z=J.nativeTool(Q.name);return UJ.create({name:Q.name,description:Q.description,inputSchema:Q.inputSchema,...Q.outputSchema?{outputSchema:Q.outputSchema}:{},requiresApproval:J.nativeApproval(Q.name),deferred:$,...Z.timeoutMs!==void 0?{timeoutMs:Z.timeoutMs}:{},...Z.async?{async:Z.async}:{},execute:(W,K)=>{let G=h.getStore()?.req;return J.startNative(G?{kind:"local",req:G}:void 0,Q.name,W,K)}})}function u6(J){if(J==="auto")return;let Q=/^(\d+)x(\d+)$/.exec(J);if(!Q)throw Error(`An image size is "WIDTHxHEIGHT" or "auto"; got ${JSON.stringify(J)}.`);let $=Number(Q[1]),Z=Number(Q[2]);if($%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($/Z,Z/$)>3)throw Error(`Image size ${J} is not supported: the maximum aspect ratio is 3:1, either way up.`)}function V$(J,Q){if(J.size!==void 0)try{u6(J.size)}catch($){throw Error(`${Q}: ${$.message}`)}if(J.background==="transparent"&&J.format==="jpeg")throw Error(`${Q}: a transparent background needs "png"; JPEG has no alpha channel.`);if(J.compression!==void 0){let $=J.compression;if(!Number.isInteger($)||$<0||$>100)throw Error(`${Q}: compression is an integer from 0 to 100; got ${$}.`)}}function H$(J,Q){if(J instanceof File)return J;let $=J.type||"image/png",Z=$==="image/jpeg"?"jpg":$.split("/")[1]??"png";return new File([J],`${Q}.${Z}`,{type:$})}class nJ{name;provider;settings;constructor(J){let{name:Q,provider:$,...Z}=J;V$(Z,`ImageModel "${Q}"`),this.name=Q,this.provider=$,this.settings=Z}static create(J){return new nJ(J)}async generate(J){let Q=this.merge(J);return z$(await this.provider.generate({prompt:J.prompt,...Q,signal:J.signal}))}async edit(J){let Q=this.merge(J);return z$(await this.provider.edit({prompt:J.prompt,...Q,images:J.images.map(($,Z)=>H$($,`image-${Z}`)),...J.mask?{mask:H$(J.mask,"mask")}:{},signal:J.signal}))}merge(J){let Q={...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 V$(Q,`ImageModel "${this.name}"`),Q}}function z$(J){return{image:new Blob([J.bytes],{type:J.mimeType}),mimeType:J.mimeType,size:J.size,usage:J.usage}}function g(J){return typeof process>"u"?void 0:process.env?.[J]}var c6="preview";function D$(J){let Q=J.trim().replace(/\/+$/,"");if(!Q)return"";return`${Q.replace(/\/openai(?:\/v1)?$/i,"")}/openai`}function m6(J){return/^\d{4}-\d{2}-\d{2}/.test(J)?"":"/v1"}function JJ(J,Q={}){return{base:(J.baseURL??g("OPENAI_BASE_URL")??"https://api.openai.com/v1").replace(/\/+$/,""),query:"",headers:async()=>{let Z=J.apiKey??g("OPENAI_API_KEY");return{...Z?{authorization:`Bearer ${Z}`}:{},...J.headers}},timeoutMs:J.timeoutMs??Q.timeoutMs??120000,maxRetries:J.maxRetries??2}}function B$(J){let Q=J.baseURL??J.endpoint??g("AZURE_OPENAI_ENDPOINT");if(Q)return D$(Q);let $=J.resourceName??g("AZURE_OPENAI_RESOURCE_NAME")??g("AZURE_RESOURCE_NAME");return $?D$(`https://${$.trim()}.cognitiveservices.azure.com`):""}function QJ(J,Q={}){let $=J.apiVersion??g("AZURE_OPENAI_API_VERSION")??c6;return{base:`${B$(J)}${m6($)}`,query:`?api-version=${encodeURIComponent($)}`,headers:async()=>{if(J.getToken)return{authorization:`Bearer ${await J.getToken()}`,...J.headers};let Z=J.apiKey??g("AZURE_OPENAI_API_KEY");return{...Z?{"api-key":Z}:{},...J.headers}},timeoutMs:J.timeoutMs??Q.timeoutMs??120000,maxRetries:J.maxRetries??2}}function F$(J,Q={}){return{...QJ(J,Q),base:`${B$(J)}/v1`,query:""}}var p6=500,O$=20000;function l6(J,Q){if(!J)return;let $=J.trim();if(/^\d+(\.\d+)?$/.test($))return Math.max(0,Number($)*1000);let Z=Date.parse($);if(Number.isNaN(Z))return;return Math.max(0,Z-Q)}function P$(J,Q){let $=Math.min(O$,p6*2**J);return Math.round($*(0.5+Q()*0.5))}function d6(J){return J===429||J===408||J===409||J>=500}function i6(J,Q){return d6(J)&&k(Q).retryable}function N$(J){return J.reason??new DOMException("The operation was aborted.","AbortError")}function n6(J,Q){return new Promise(($,Z)=>{let W=setTimeout($,J);Q?.addEventListener("abort",()=>{clearTimeout(W),Z(N$(Q))},{once:!0})})}async function u(J,Q,$){let Z=$.fetchImpl??((H,D)=>fetch(H,D)),W=$.sleep??n6,K=$.random??Math.random,G=$.now??Date.now,X=Math.max(0,$.maxRetries),V=async(H)=>{let D=$.signal;if(!D)return await W(H);D.throwIfAborted();let z;try{await Promise.race([W(H,D),new Promise((B,U)=>{z=()=>U(N$(D)),D.addEventListener("abort",z,{once:!0})})])}finally{if(z)D.removeEventListener("abort",z)}},Y;for(let H=0;H<=X;H++){$.signal?.throwIfAborted();let D=new AbortController,z=()=>D.abort($.signal?.reason);$.signal?.addEventListener("abort",z,{once:!0});let B=!1,U=$.timeoutMs>0?setTimeout(()=>{B=!0,D.abort()},$.timeoutMs):void 0,F;try{F=await Z(J,{...Q,signal:D.signal})}catch(M){if(U!==void 0)clearTimeout(U);if($.signal?.removeEventListener("abort",z),$.signal?.aborted)throw M;if(Y=B?new U$($.timeoutMs):M,B&&$.retryTimeouts===!1)throw Y;if(H===X)throw Y;await V(P$(H,K));continue}if(U!==void 0)clearTimeout(U);if(F.ok)return F;$.signal?.removeEventListener("abort",z);let O=await o6(F),P=new I(F.status,O,F.headers.get("x-request-id")??void 0,l6(F.headers.get("retry-after"),G()));if(H===X||!i6(F.status,P))throw P;let N=P.retryAfter??(F.status===429?k(P).retryAfter:void 0);await V(N===void 0?P$(H,K):Math.min(N,O$)),Y=P}throw Y??Error("Provider request failed with no response.")}async function o6(J){let Q;try{Q=await J.text()}catch{return null}try{return JSON.parse(Q)}catch{return Q}}var oJ=300000;function aJ(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 OJ extends Error{code;retryable;retryAfter;constructor(J,Q={}){super(J.message,Q);if(this.name="ImageRequestError",this.code=J.code,this.retryable=J.retryable,J.retryAfter!==void 0)this.retryAfter=J.retryAfter}}var a6={png:"image/png",jpeg:"image/jpeg"};function s6(J){let Q=Number(J?.input_tokens??0),$=Number(J?.output_tokens??0),Z={inputTokens:Q,outputTokens:$,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 t6(J){let Q=atob(J),$=new Uint8Array(Q.length);for(let Z=0;Z<Q.length;Z++)$[Z]=Q.charCodeAt(Z);return $}function r6(J){let $=J?.data?.[0]?.b64_json;if(typeof $!=="string"||$.length===0)throw new OJ({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:t6($),mimeType:a6[Z]??`image/${Z}`,size:typeof J.size==="string"?J.size:"",...typeof J.background==="string"?{background:J.background}:{},usage:s6(J.usage)}}async function L$(J,Q,$,Z){let W;try{W=await u(J,Q,{maxRetries:$.maxRetries,timeoutMs:$.timeoutMs,retryTimeouts:!1,signal:Z.signal,fetchImpl:$.fetchImpl})}catch(K){if(Z.signal?.aborted)throw K;throw new OJ(k(K),{cause:K})}return r6(await W.json())}async function M$(J,Q,$={}){return await L$(J.generationsUrl,{method:"POST",headers:{...await J.headers(),"content-type":"application/json"},body:JSON.stringify(Q)},J,$)}async function C$(J,Q,$={}){return await L$(J.editsUrl,{method:"POST",headers:await J.headers(),body:Q},J,$)}class NJ{static models(){return[]}modelName(){return this.model}async generate(J){return await M$(this.endpoint(),this.body(J),{signal:J.signal})}async edit(J){let Q=new FormData;for(let[$,Z]of Object.entries(this.body(J)))if(Z!==void 0)Q.set($,String(Z));for(let $ of J.images)Q.append("image[]",$,$.name);if(J.mask)Q.set("mask",J.mask,J.mask.name);return await C$(this.endpoint(),Q,{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 k(J)}}var _$=["gpt-image-2","gpt-image-1.5","gpt-image-1"];class sJ extends NJ{model;config;constructor(J,Q={}){super();this.model=J,this.config=Q}static model(J,Q){return new sJ(J,Q)}static models(){return _$}endpoint(){return aJ(JJ(this.config,{timeoutMs:oJ}))}}class tJ extends NJ{model;config;constructor(J,Q={}){super();this.model=J,this.config=Q}static model(J,Q){return new tJ(J,Q)}static models(){return _$}modelName(){return this.config.deployment??this.model}endpoint(){return aJ(QJ(this.config,{timeoutMs:oJ}))}}var k$=3;function rJ(J){let Q=new Map;for(let $ of J)for(let Z of $.content??[]){if(Z.type!=="file"||!Z.fileId||Q.has(Z.fileId))continue;Q.set(Z.fileId,{name:Z.name,mimeType:Z.mimeType})}return Q}function R$(J,Q,$=new Map){if(!(Q instanceof I))return[];if(Q.status!==400&&Q.status!==404)return[];let Z=J8(Q.body);if(!Z)return[];let W=e6(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=JQ(Y)[Number(K[2])],D=H&&typeof H.file_id==="string"?H.file_id:void 0;if(D)return[D]}let G=Z.message??"",X=A$(W.map((Y)=>Y.fileId).filter((Y)=>Q8(G,Y)));if(X.length>0)return X;let V=/Expected (image type|context stuffing file type) to be a supported format:.*but got \.([a-z0-9]+)\.?\s*$/is.exec(G);if(V){let Y=V[1].toLowerCase()==="image type"?"input_image":"input_file",H=V[2].toLowerCase(),D=A$(W.filter((B)=>B.type===Y).map((B)=>B.fileId)),z=D.filter((B)=>($.get(B)?.name??"").trim().toLowerCase().endsWith(`.${H}`));if(z.length===1)return z;if(z.length===0&&D.length===1)return D}return[]}function T$(J,Q,$=new Map){return{...J,input:J.input.map((Z)=>{let W=JQ(Z);if(!W.some((K)=>S$(K,Q)))return Z;return{...Z,content:W.map((K)=>S$(K,Q)?{type:"input_text",text:eJ($.get(String(K.file_id))?.name)}:K)}})}}function eJ(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 S$(J,Q){return typeof J.file_id==="string"&&Q.has(J.file_id)}function JQ(J){let Q=J?.content;return Array.isArray(Q)?Q:[]}function e6(J){let Q=[];for(let $ of J)for(let Z of JQ($))if(typeof Z.file_id==="string"&&Z.file_id)Q.push({type:String(Z.type),fileId:Z.file_id});return Q}function J8(J){if(!J||typeof J!=="object")return null;let Q=J,$=Q.error&&typeof Q.error==="object"?Q.error:J;return{message:typeof $.message==="string"?$.message:void 0,param:typeof $.param==="string"?$.param:void 0}}function Q8(J,Q){let $=Q.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return new RegExp(`(^|[^A-Za-z0-9_-])${$}($|[^A-Za-z0-9_-])`).test(J)}function A$(J){return[...new Set(J)]}async function*$8(J){let Q="",$="",Z=[],W,K=()=>{if(Z.length===0&&!$)return null;let V={event:$,data:Z.join(`
|
|
143
|
-
`),id:W};return $="",Z=[],W=void 0,V.data?V:null},G=(V)=>{let
|
|
144
|
-
`);while(
|
|
145
|
-
`)}}if(Q.length>0){let V=G(Q);if(V)yield V}let X=K();if(X)yield X}async function*j$(J,Q={}){let $=new Map,Z=new Set,W,K=!1,G,X=(V,Y)=>({type:"finish",reason:V,usage:Y,...G?{model:G}:{}});for await(let V of $8(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)G=D;switch(H){case"response.output_text.delta":{let z=String(Y.delta??"");if(!z)break;yield Q.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 B=String(z.id??Y.item_id??z.call_id??"");$.set(B,{callId:String(z.call_id??B),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=$.get(String(Y.item_id??""));if(!z)break;let B=String(Y.delta??"");if(!B)break;yield{type:"tool-call-delta",toolCallId:z.callId,name:z.name,argsDelta:B,...z.namespace?{namespace:z.namespace}:{}};break}case"response.function_call_arguments.done":{let z=String(Y.item_id??""),B=$.get(z);if(!B)break;B.done=!0,yield{type:"tool-call",toolCallId:B.callId,name:B.name,args:String(Y.arguments??""),...B.namespace?{namespace:B.namespace}:{}};break}case"response.output_item.done":{let z=Y.item;if(!z)break;if(z.type==="function_call"){let B=String(z.id??Y.item_id??z.call_id??""),U=$.get(B);if(U?.done)break;let F=(typeof z.namespace==="string"?z.namespace:"")||U?.namespace;if(yield{type:"tool-call",toolCallId:String(z.call_id??B),name:String(z.name??U?.name??""),args:String(z.arguments??""),...F?{namespace:F}:{}},U)U.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 B=Z8(z);if(B.loaded.length===0&&B.namespaces.length===0)break;let U=String(z.tool_search_call_id??z.id??"");if(Z.has(U))break;Z.add(U);let F=W;W=void 0,yield{type:"tool-search",...B,...F!==void 0&&F!==null?{arguments:F}:{}}}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 X("stop",QQ(Y.response?.usage));break}case"response.incomplete":{K=!0;let z=QQ(Y.response?.usage),B=Y.response?.incomplete_details?.reason;if(B==="content_filter"){yield{type:"error",error:{code:"content_filtered",message:W8(Y.response?.content_filters),retryable:!1}},yield X("error",z);break}yield X(B==="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:K8(z)},yield X("error",QQ(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 X("error",d())}function Z8(J){let Q=[],$=[];return E$(J.results??J.tools??J.loaded??J.output,Q,$,0),{loaded:$Q(Q),namespaces:$Q($)}}function E$(J,Q,$,Z){if(!Array.isArray(J)||Z>4)return;for(let W of J){if(typeof W==="string"){Q.push(W);continue}if(!W||typeof W!=="object")continue;let K=W,G=typeof K.name==="string"?K.name:typeof K.tool_name==="string"?K.tool_name:"",X=K.tools??K.functions;if(Array.isArray(X)){if(G)$.push(G);E$(X,Q,$,Z+1);continue}if(G)Q.push(G)}}function $Q(J){return J.filter((Q,$)=>J.indexOf(Q)===$)}function W8(J){if(!Array.isArray(J))return"The provider's content filter blocked this request.";let $=[];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[G,X]of Object.entries(K))if(X&&typeof X==="object"&&X.filtered===!0)$.push(`${G} (${String(W.source_type??"unknown")})`)}return $.length===0?"The provider's content filter blocked this request.":`The provider's content filter blocked this request. Categories: ${$Q($).join(", ")}.`}function K8(J){let Q=typeof J?.message==="string"?J.message:"The provider stream failed.",$=String(J?.code??"").toLowerCase();if($==="rate_limit_exceeded")return{code:"rate_limited",message:Q,retryable:!0};if($==="context_length_exceeded")return{code:"context_length_exceeded",message:Q,retryable:!1};if($.includes("content_filter"))return{code:"content_filtered",message:Q,retryable:!1};return{code:"provider_error",message:Q,retryable:!0}}function d(){return{inputTokens:0,outputTokens:0,totalTokens:0}}function QQ(J){if(!J)return d();let Q=Number(J.input_tokens??0),$=Number(J.output_tokens??0),Z={inputTokens:Q,outputTokens:$,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*x$(J){if(!J)return;let Q=J.getReader(),$=new TextDecoder;try{while(!0){let{done:W,value:K}=await Q.read();if(W)break;if(K)yield $.decode(K,{stream:!0})}let Z=$.decode();if(Z)yield Z}finally{Q.releaseLock()}}function ZQ(J){return{responsesUrl:`${J.base}/responses${J.query}`,filesUrl:`${J.base}/files${J.query}`,headers:J.headers,timeoutMs:J.timeoutMs,maxRetries:J.maxRetries}}async function*WQ(J,Q,$){let Z,W=Q,K=new Set;for(let G=0;Z===void 0;G++)try{Z=await u(J.responsesUrl,{method:"POST",headers:{...await J.headers(),"content-type":"application/json"},body:JSON.stringify(W)},{maxRetries:J.maxRetries,timeoutMs:J.timeoutMs,signal:$.signal,fetchImpl:J.fetchImpl})}catch(X){let V=G<k$?R$(W,X,$.files).filter((H)=>!K.has(H)):[];if(V.length>0){let H=k(X).message;for(let D of V)K.add(D),yield{type:"file-rejected",fileId:D,message:H,...i(X)};W=T$(W,new Set(V),$.files);continue}let Y=k(X);if(Y.code!=="aborted")yield{type:"error",error:Y,...i(X)};yield{type:"finish",reason:Y.code==="aborted"?"aborted":"error",usage:d()};return}try{yield*j$(x$(Z.body),{structuredOutput:$.structuredOutput})}catch(G){let X=k(G);if(X.code==="aborted"){yield{type:"finish",reason:"aborted",usage:d()};return}yield{type:"error",error:X},yield{type:"finish",reason:"error",usage:d()}}}async function KQ(J,Q,$="user_data"){let Z=new FormData;Z.set("purpose",$),Z.set("file",Q);let K=await(await u(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 GQ(J){let Q=G8(J);if(Q.startsWith("gpt-3.5")||Q.startsWith("text-")||Q.startsWith("davinci"))return{reasoning:!1,structuredOutput:!1,fileInput:!1,parallelToolCalls:!0,toolSearch:!1};let $=X8(Q);if($?.kind==="o")return{reasoning:!0,structuredOutput:!0,fileInput:!0,parallelToolCalls:$.major>1,toolSearch:q$($)};if($?.kind==="gpt")return{reasoning:$.major>=5,structuredOutput:$.major>4||Q.startsWith("gpt-4o")||Q.startsWith("gpt-4.1"),fileInput:$.major>4||Q.startsWith("gpt-4o")||Q.startsWith("gpt-4.1"),parallelToolCalls:!0,toolSearch:q$($)};return{reasoning:!0,structuredOutput:!0,fileInput:!0,parallelToolCalls:!0,toolSearch:!0}}function q$(J){if(J.kind==="o")return J.major>=5;return J.major>5||J.major===5&&J.minor>=2}function G8(J){return J.trim().toLowerCase()}function X8(J){let Q=/^gpt-(\d+)(?:\.(\d+))?/.exec(J);if(Q?.[1])return{kind:"gpt",major:Number(Q[1]),minor:Number(Q[2]??0)};let $=/^o(\d+)(?:[-.]|$)/.exec(J);if($?.[1])return{kind:"o",major:Number($[1]),minor:0};return null}var Y8={"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 V8(J){if(typeof J!=="string")return;let Q;try{Q=JSON.parse(J)}catch{return}if(!Q||typeof Q!=="object"||typeof Q.type!=="string")return;let $=Y8[Q.type];if($)Q.type=$;if(Q.type==="response.done"&&Q.response?.usage)Q.usage=LJ(Q.response.usage);if(Q.type==="conversation.item.input_audio_transcription.completed"&&Q.usage)if(Q.usage.type==="duration"){let Z=Number(Q.usage.seconds);if(Number.isFinite(Z))Q.transcriptionSeconds=Z}else Q.transcriptionUsage=LJ(Q.usage);return Q}var I$=1,H8=500;function z8(J,Q){let $=globalThis.WebSocket;if(!$)throw Error("No global WebSocket: the realtime sideband needs Bun or Node 22+.");return new $(J,{headers:Q.headers})}class MJ{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=Q,this.rejectReady=$}),this.ready.catch(()=>{}),this.closed=new Promise((Q)=>this.resolveClosed=Q),this.open()}send(J){if(this.finished||this.closing)return;let Q=JSON.stringify(J);if(this.socket?.readyState===I$)this.socket.send(Q);else this.outbox.push(Q)}updateSession(J){this.send({type:"session.update",session:CJ(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,Q){this.addItem({type:"function_call_output",call_id:J,output:typeof Q==="string"?Q:JSON.stringify(Q)})}createResponse(J={}){let Q={};if(J.instructions!==void 0)Q.instructions=J.instructions;if(J.toolChoice!==void 0)Q.tool_choice=typeof J.toolChoice==="string"?J.toolChoice:{type:"function",name:J.toolChoice.name};if(J.outputModalities)Q.output_modalities=J.outputModalities;if(J.conversation)Q.conversation=J.conversation;if(J.metadata)Q.metadata=J.metadata;Object.assign(Q,J.vendor),this.send(Object.keys(Q).length?{type:"response.create",response:Q}:{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 $=J.queue.shift();if($)return{value:$,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,Q="closed"){if(this.finished||this.closing)return;if(this.closing=!0,this.socket&&this.socket.readyState<=I$)this.socket.close(J,Q);else this.finish(J,Q,!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 $=await this.init.headers();if(this.closing)return this.finish(1000,"closed",!0);J=(this.init.webSocket??z8)(this.init.url,{headers:$})}catch($){return this.dropped(1006,$ instanceof Error?$.message:String($),!1)}this.socket=J;let Q=!1;J.addEventListener("open",()=>{Q=!0;let $=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(),$)this.emit({type:"sideband.reconnected",attempt:Z})}),J.addEventListener("message",($)=>{let Z=V8($.data);if(Z)this.emit(Z)}),J.addEventListener("close",($)=>{if(this.socket!==J)return;this.dropped($.code??1006,$.reason??"",Q)}),J.addEventListener("error",()=>{})}dropped(J,Q,$){if(this.socket=void 0,this.closing)return this.finish(J,Q,!0);let Z=this.init.reconnect?.attempts??3;if(!((J!==1000||!$)&&this.failures<Z))return this.finish(J,Q,!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:Q,byClient:$};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} ${Q}).`));this.resolveClosed(Z)}emit(J){if(this.backlog){if(this.backlog.push(J),this.backlog.length>H8)this.backlog.shift()}for(let Q of this.subscribers){if(Q.done)continue;Q.queue.push(J),Q.wake?.()}for(let Q of this.listeners)try{Q(J)}catch{}}}var XQ=30000,w$=10,b$=7200,D8=600,v$="gpt-live-transcribe";function B8(J){return J.type==="transcription"}function F8(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 Q={model:J.model??v$};if(J.prompt!==void 0)Q.prompt=J.prompt;if(J.keywords?.length)Q.keywords=J.keywords;if(J.languages?.length)Q.languages=J.languages;if(J.language!==void 0)Q.language=J.language;if(J.delay!==void 0)Q.delay=J.delay;let $={transcription:Q,turn_detection:J.turnDetection?h$(J.turnDetection):null};if(J.noiseReduction!==void 0)$.noise_reduction=J.noiseReduction&&{type:J.noiseReduction};let Z={type:"transcription",audio:{input:$}};if(J.logprobs)Z.include=["item.input_audio_transcription.logprobs"];return{...Z,...J.vendor}}function P8(J){if(!J)return{type:"object",properties:{}};return f$(J)?J.toJSONSchema():J}function CJ(J,Q){if(B8(J))return F8(J);let $={type:"realtime"},Z=J.model??Q;if(Z)$.model=Z;if(J.instructions!==void 0)$.instructions=J.instructions;if(J.outputModalities)$.output_modalities=J.outputModalities;if(J.maxOutputTokens!==void 0)$.max_output_tokens=J.maxOutputTokens;if(J.truncation!==void 0)$.truncation=J.truncation;if(J.tools)$.tools=J.tools.map((G)=>({type:"function",name:G.name,...G.description?{description:G.description}:{},parameters:P8(G.parameters)}));if(J.toolChoice!==void 0)$.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&&h$(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)$.audio={...Object.keys(W).length?{input:W}:{},...Object.keys(K).length?{output:K}:{}};return{...$,...J.vendor}}function h$(J){let Q={type:J.type};if(J.createResponse!==void 0)Q.create_response=J.createResponse;if(J.interruptResponse!==void 0)Q.interrupt_response=J.interruptResponse;if(J.type==="semantic_vad"){if(J.eagerness!==void 0)Q.eagerness=J.eagerness}else{if(J.threshold!==void 0)Q.threshold=J.threshold;if(J.prefixPaddingMs!==void 0)Q.prefix_padding_ms=J.prefixPaddingMs;if(J.silenceDurationMs!==void 0)Q.silence_duration_ms=J.silenceDurationMs;if(J.idleTimeoutMs!==void 0)Q.idle_timeout_ms=J.idleTimeoutMs}return Q}function LJ(J){let Q=Number(J?.input_tokens??0),$=Number(J?.output_tokens??0),Z={inputTokens:Q,outputTokens:$,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 G=W?.cached_tokens_details?.audio_tokens;if(typeof G==="number")Z.cachedAudioInputTokens=G;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 f extends Error{code;retryable;status;constructor(J,Q={}){super(J.message,{cause:Q.cause});if(this.name="RealtimeRequestError",this.code=J.code,this.retryable=J.retryable,Q.status!==void 0)this.status=Q.status}}var U8=60;class $J{model;target;options;constructor(J,Q){this.target=J,this.options=Q,this.model=Q.model}url(J){return`${this.target.base}/realtime${J}${this.target.query}`}sidebandUrl(J){let Q=this.target.base.replace(/^http(s?):/i,(Z,W)=>`ws${W}:`),$=this.target.query?`${this.target.query}&`:"?";return`${Q}/realtime${$}call_id=${encodeURIComponent(J)}`}async createCall(J){let Q=J.flow??this.options.callFlow??"unified",$,Z;if(Q==="ephemeral")$={authorization:`Bearer ${(await this.clientSecret({session:J.session,ttlSeconds:U8,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(CJ(J.session??{},this.model))),$=await this.target.headers(),Z=V}if(J.safetyIdentifier)$["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:$,body:Z},J.signal),G=await K.text(),X=O8(K);if(!X)throw new f({code:"provider_error",message:"The provider started a realtime call but did not say which one (no Location).",retryable:!1});return{sdpAnswer:G,callId:X}}async clientSecret(J={}){let Q=J.ttlSeconds??D8;if(!Number.isInteger(Q)||Q<w$||Q>b$)throw RangeError(`ttlSeconds must be a whole number from ${w$} to ${b$}, got ${Q}.`);let $={...await this.target.headers(),"content-type":"application/json"};if(J.safetyIdentifier)$["OpenAI-Safety-Identifier"]=J.safetyIdentifier;let W=await(await this.request(this.url("/client_secrets"),{method:"POST",headers:$,body:JSON.stringify({expires_after:{anchor:"created_at",seconds:Q},session:CJ(J.session??{},this.model)})},J.signal)).json();if(typeof W?.value!=="string")throw new f({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,Q={}){try{await this.request(this.url(`/calls/${encodeURIComponent(J)}/hangup`),{method:"POST",headers:await this.target.headers()},Q.signal)}catch($){if(y$($,J))return;throw $}}sideband(J,Q={}){return new MJ({...Q,callId:J,url:this.sidebandUrl(J),headers:this.target.headers,webSocket:Q.webSocket??this.options.webSocket,hangup:()=>this.hangup(J)})}async request(J,Q,$){try{return await u(J,Q,{maxRetries:this.target.maxRetries,timeoutMs:this.target.timeoutMs,retryTimeouts:!1,signal:$,fetchImpl:this.options.fetchImpl})}catch(Z){if($?.aborted)throw Z;throw new f(k(Z),{cause:Z,...Z instanceof I?{status:Z.status}:{}})}}}function y$(J,Q){if(!(J instanceof f)||J.status!==404)return!1;let $=J.cause instanceof I?J.cause.body:void 0,Z=$?.error??$,W=String(Z?.code??"").toLowerCase(),K=String(Z?.message??"").toLowerCase();if(W.includes("call"))return!0;if(K.includes(Q.toLowerCase()))return!0;return/\bcall\b/.test(K)&&/not (be )?found|does not exist|no longer|ended/.test(K)}function O8(J){let Q=J.headers.get("location");if(!Q)return;let $=Q.split("?")[0].replace(/\/+$/,""),Z=$.slice($.lastIndexOf("/")+1);return Z?decodeURIComponent(Z):void 0}function VQ(J,Q){let{capabilities:$}=Q,Z={model:Q.model,input:N8(J.messages,$,J.tools),stream:!0};if(J.systemPrompt)Z.instructions=J.systemPrompt;let W=j8(J.tools,$);if(W.length>0){if(Z.tools=W,!$.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&&$.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 N8(J,Q,$){let Z=[],W=new Map;if(Q.toolSearch){for(let K of $??[])if(_J(K))W.set(K.name,K)}for(let K of J){let G=K.role,X=[],V=()=>{if(X.length===0)return;Z.push({type:"message",role:G,content:X}),X=[]};for(let Y of K.content??[])switch(Y.type){case"text":{if(!Y.text)break;X.push(n(G,Y.text));break}case"output":{if(Y.partial)break;X.push(n(G,JSON.stringify(Y.value)));break}case"file":{if(G==="assistant")break;let H=C8(Y);if(!Q.fileInput){if(H)X.push(n(G,YQ(Y,!1)));break}if(Y.fileId?.startsWith(c))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)X.push(n(G,YQ(Y,!1)));X.push(n(G,eJ(Y.name)));break}if(H)X.push(n(G,YQ(Y,!!Y.fileId)));if(Y.fileId)X.push(_8(Y));break}case"reasoning":{V();let H=k8(Y);if(H)Z.push(H);break}case"tool-call":{if(Y.partial)break;if(V(),Q.toolSearch&&Array.isArray(Y.toolSearches))for(let D of Y.toolSearches)Z.push(...T8(D,$??[]));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:R8(Y)});break}}V()}return M8(Z)}var L8="No result was recorded for this tool call. Assume it did not complete.";function M8(J){let Q=new Set,$=new Set,Z=[];for(let K of J){if(K.type==="function_call"){let G=String(K.call_id);if(Q.has(G))continue;Q.add(G)}else if(K.type==="function_call_output"){let G=String(K.call_id);if(!Q.has(G)||$.has(G))continue;$.add(G)}Z.push(K)}if($.size===Q.size)return Z;let W=[];for(let K of Z){if(W.push(K),K.type!=="function_call")continue;let G=String(K.call_id);if($.has(G))continue;$.add(G),W.push({type:"function_call_output",call_id:G,output:L8})}return W}function n(J,Q){return{type:J==="assistant"?"output_text":"input_text",text:Q}}function C8(J){let Q=J.attachmentId;return typeof Q==="string"&&Q.startsWith(c)?Q:void 0}function YQ(J,Q){let $=[`id=${JSON.stringify(J.attachmentId)}`];if(J.name)$.push(`name=${JSON.stringify(J.name)}`);if(J.mimeType)$.push(`mimeType=${JSON.stringify(J.mimeType)}`);let Z=`attachment ${$.join(" ")}`;return Q?`[${Z}]`:`[${Z} \u2014 its contents are not shown to you; a tool can read the file by this id]`}function _8(J){let Q=J.mimeType?.trim().toLowerCase()??"";return{type:(Q?Q.startsWith("image/")&&Q!=="image/svg+xml":S8(J.name))?"input_image":"input_file",file_id:J.fileId}}function S8(J){let Q=/\.([a-z0-9]+)$/.exec(J?.trim().toLowerCase()??"");return Q?.[1]!==void 0&&A8.has(Q[1])}var A8=new Set(["jpeg","jpg","png","gif","webp"]);function k8(J){if(!J.id)return null;let Q={type:"reasoning",id:J.id};return Q.summary=J.text?[{type:"summary_text",text:J.text}]:[],Q}function R8(J){if(J.status==="ok")return typeof J.output==="string"?J.output:JSON.stringify(J.output??null);if(J.status==="running"){let Q=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.${Q}`}if(J.status==="denied"){let Q=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.${Q}`;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.${Q}`;return`The user declined this tool call, so it did not run.${Q}`}return`The tool call failed and produced no result. Error (${J.error?.code??"unknown"}): ${J.error?.message??"no message"}`}function T8(J,Q){let $=new Set(g$(J?.loaded)),Z=g$(J?.namespaces),W=new Set(Z),K=[];for(let X of Q)if(_J(X)){if(!W.has(X.name))continue;let V=X.tools.filter((Y)=>$.size===0||$.has(Y.name));if(V.length===0)continue;K.push({type:"namespace",name:X.name,description:X.description,tools:V.map((Y)=>o(Y,!0))})}else if(X.deferred&&$.has(X.name))K.push(o(X,!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:[...$]}},{type:"tool_search_output",call_id:null,execution:"server",status:"completed",tools:K}]}function g$(J){return Array.isArray(J)?J.filter((Q)=>typeof Q==="string"):[]}function _J(J){return Array.isArray(J.tools)}function j8(J,Q){if(!J||J.length===0)return[];if(!Q.toolSearch){let W=[];for(let K of J)if(_J(K))for(let G of K.tools)W.push(o(G,!1));else W.push(o(K,!1));return W}let $=[],Z=!1;for(let W of J)if(_J(W)){let K=W.tools.map((G)=>{if(G.deferred)Z=!0;return o(G,!0)});$.push({type:"namespace",name:W.name,description:W.description,tools:K})}else{if(W.deferred)Z=!0;$.push(o(W,!0))}if(Z)$.push({type:"tool_search"});return $}function o(J,Q){let $={type:"function",name:J.name,description:J.description,parameters:J.parameters,strict:J.strict};if(Q&&J.deferred)$.defer_loading=!0;return $}class a{static models(){return[]}normalizeError(J){return k(J)}}var u$=["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 HQ extends a{model;capabilities;config;constructor(J,Q={}){super();this.model=J,this.capabilities=GQ(J),this.config=Q}static model(J,Q){return new HQ(J,Q)}static models(){return u$}stream(J){let Q=VQ(J,{model:this.model,capabilities:this.capabilities});return WQ(this.endpoint(),Q,{signal:J.signal,structuredOutput:Boolean(J.output),files:rJ(J.messages)})}upload(J){return KQ(this.endpoint(),J)}endpoint(){return ZQ(JJ(this.config))}get realtime(){return new $J(JJ(this.config,{timeoutMs:XQ}),{model:this.model})}}class zQ extends a{model;capabilities;config;constructor(J,Q={}){super();this.model=J,this.capabilities=GQ(J),this.config=Q}static model(J,Q){return new zQ(J,Q)}static models(){return u$}stream(J){let Q=VQ(J,{model:this.deployment(),capabilities:this.capabilities});return WQ(this.endpoint(),Q,{signal:J.signal,structuredOutput:Boolean(J.output),files:rJ(J.messages)})}upload(J){return KQ(this.endpoint(),J,"assistants")}deployment(){return this.config.deployment??this.model}endpoint(){return ZQ(QJ(this.config))}get realtime(){return new $J(F$(this.config,{timeoutMs:XQ}),{model:this.deployment(),callFlow:"ephemeral"})}}class SJ{now;entries=new Map;constructor(J=Date.now){this.now=J}allow(J,Q){let $=this.entries.get(J);if($?.openUntil===void 0)return!0;let Z=this.now();if(Z<$.openUntil)return!1;if($.probeUntil!==void 0&&Z<$.probeUntil)return!1;return $.probeUntil=Z+Q.cooldownMs,!0}record(J,Q,$){let Z=this.entries.get(J)??{failures:0},W=Z.openUntil!==void 0;if(Q==="success")return this.entries.delete(J),W?"closed":void 0;if(Q==="none"){delete Z.probeUntil;return}if(Z.failures+=1,this.entries.set(J,Z),W||Z.failures>=$.failures)return Z.openUntil=this.now()+$.cooldownMs,delete Z.probeUntil,W?void 0:"open";return}state(J){let Q=this.entries.get(J);if(Q?.openUntil===void 0)return"closed";return this.now()<Q.openUntil?"open":"half-open"}}function E8(J){switch(J.type){case"text-delta":case"reasoning-delta":case"tool-call-delta":case"tool-call":case"tool-search":case"output-delta":return!0;default:return!1}}var c$=Symbol("timed-out");class ZJ extends a{model;capabilities;entries;options;circuit;constructor(J,Q={}){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($){let Z=$.failures??3,W=$.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 X of J){let V=DQ(X);if(K.has(V))throw Error(`FallbackProvider: two legs share the circuit key "${V}". Give one of them a \`circuitKey\`.`);K.add(V)}let G=$.store??new SJ;this.options={...Q,circuit:{...$,store:G}},this.circuit={policy:{failures:Z,cooldownMs:W},store:G,...$.onStateChange?{onStateChange:$.onStateChange}:{}}}else this.options=Q,this.circuit=void 0;this.model=J[0].provider.model,this.capabilities=x8(J.map((Z)=>Z.provider.capabilities))}static chain(J,Q){return new ZJ(J,Q)}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 ZJ(this.entries.slice(J),this.options)}leg(J){let Q=this.from(J).entries[0];return new ZJ([Q],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],G=W===this.entries.length-1,X=K.provider.model;if(this.circuit&&!G&&!await this.allow(K))continue;Z+=1;let V=!1,Y=async(L)=>{if(V)return;V=!0,await this.record(W,K,L)},H=new AbortController,D=()=>H.abort($?.reason);if($?.aborted)H.abort($.reason);else $?.addEventListener("abort",D,{once:!0});let z=[],B=!1,U=!1,F,O,P,N=!1,M,j=!1,S=(L)=>{let R=Q?w(w(T(),Q),L.usage):L.usage;return Q=void 0,{...L,usage:R}};try{M=K.provider.stream({...J,...K.reasoning!==void 0?{reasoning:K.reasoning}:{},signal:H.signal})[Symbol.asyncIterator]();let L=!0;for(;;){let R=L&&K.timeoutMs!==void 0?await q8(M.next(),K.timeoutMs):await M.next();if(R===c$){N=!0,P={error:{code:"provider_error",message:`${X} sent nothing within ${K.timeoutMs}ms.`,retryable:!0}};break}if(L=!1,R.done){j=!0;break}let C=R.value;if(C.type==="finish"&&C.model)O=C.model;if(B){if(C.type==="finish")F=w(F??T(),C.usage),U=!0,yield S(C);else{if(C.type==="error")P={error:C.error};yield C}continue}if(E8(C)){B=!0,await Y("success"),yield*z.splice(0),yield C;continue}if(C.type==="error")P={error:C.error,...C.status!==void 0?{status:C.status}:{},...C.requestId!==void 0?{requestId:C.requestId}:{}};else if(C.type==="finish"){if(F=w(F??T(),C.usage),C.reason==="error"&&!P)P={error:{code:"provider_error",message:`${X} ended the call with an error and did not say which.`,retryable:!1}}}z.push(C)}}catch(L){let R=K.provider.normalizeError(L);if(B){if(R.code!=="aborted")yield{type:"error",error:R,...i(L)};this.report({index:W,model:X,responseModel:O,attempt:Z,usage:F,outcome:BQ(R),error:R}),yield S({type:"finish",reason:R.code==="aborted"?"aborted":"error",usage:T(),...O?{model:O}:{}});return}P={error:R,...i(L)}}finally{if($?.removeEventListener("abort",D),!j)H.abort(),M?.return?.()?.catch(()=>{})}if(B){if(!U&&Q)yield{type:"finish",reason:P?"error":"stop",usage:Q},Q=void 0;this.report({index:W,model:X,responseModel:O,attempt:Z,usage:F,outcome:P?BQ(P.error):"ok",...P?{error:P.error}:{}});return}if($?.aborted){await Y("none"),this.report({index:W,model:X,responseModel:O,attempt:Z,usage:F,outcome:"aborted"}),yield S({type:"finish",reason:"aborted",usage:F??T(),...O?{model:O}:{}});return}if(!P){await Y("success"),this.report({index:W,model:X,responseModel:O,attempt:Z,usage:F,outcome:"ok"});for(let L of z)yield L.type==="finish"?S(L):L;return}let x=!G&&P.error.code!=="aborted"&&this.shouldFallBack(P.error,{index:W,model:X,timedOut:N,...P.status!==void 0?{status:P.status}:{},...P.requestId!==void 0?{requestId:P.requestId}:{}});if(await Y(x?"failure":"none"),this.report({index:W,model:X,responseModel:O,attempt:Z,usage:F,outcome:x?"fallback":BQ(P.error),error:P.error}),x){if(F)Q=w(Q??T(),F);continue}let q=!1,b;for(let L of z){if(L.type==="finish"){b=L;continue}if(L.type==="error")q=!0;yield L}if(!q&&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 S({type:"finish",reason:P.error.code==="aborted"?"aborted":b?.reason??"error",usage:F??T(),...O?{model:O}:{}});return}}async allow(J){if(!this.circuit)return!0;try{return await this.circuit.store.allow(DQ(J),this.circuit.policy)}catch{return!0}}async record(J,Q,$){if(!this.circuit)return;let Z=DQ(Q),W;try{W=await this.circuit.store.record(Z,$,this.circuit.policy)}catch{return}if(!W)return;try{this.circuit.onStateChange?.({index:J,model:Q.provider.model,key:Z,state:W})}catch{}}shouldFallBack(J,Q){let $=this.options.fallbackOn??((Z)=>Z.retryable);try{return $(J,Q)}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 DQ(J){return J.circuitKey??J.provider.model}function BQ(J){return J.code==="aborted"?"aborted":"failed"}function x8(J){return{reasoning:J.every((Q)=>Q.reasoning),structuredOutput:J.every((Q)=>Q.structuredOutput),fileInput:J.every((Q)=>Q.fileInput),parallelToolCalls:J.every((Q)=>Q.parallelToolCalls),toolSearch:J.every((Q)=>Q.toolSearch)}}function q8(J,Q){let $,Z=new Promise((W)=>{$=setTimeout(()=>W(c$),Q)});return Promise.race([J,Z]).finally(()=>clearTimeout($))}async function I8(J,Q,$={}){let Z=$.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 G=J.leg(K),X={index:K,model:G.model,results:[],errors:[]};for(let V=0;V<Z;V++)try{X.results.push(await Q(G,{index:K,sample:V}))}catch(Y){X.errors.push({sample:V,error:Y})}W.push(X)}return W}class kJ extends Error{line;constructor(J){super(J??"Voice session ended by the app.");this.name="VoiceHangup",this.line=J}}var KJ="ask_agent",w8={maxDurationMs:900000,idleTimeoutMs:120000,maxQueued:3,progressIntervalMs:4000,closingLineMs:1e4,tickMs:60000,hangupGraceMs:30000,toolTimeoutMs:60000,maxToolCallsPerMinute:20,toolOutputChars:8000},b8={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 WJ(J={}){return[{name:J.name??KJ,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 AJ=new Map;class m{sessionId;threadId;callId;ended;params;sideband;hangupCall;limits;lines;delegateName;startedAt=Date.now();body;usage=T();transcription={usage:T(),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 m(J)}static get(J){return AJ.get(J)}static async endAll(J){await Promise.all([...AJ.values()].map((Q)=>Q.end("hangup",J)))}constructor(J){this.params=J,this.sessionId=J.sessionId??crypto.randomUUID(),this.threadId=J.threadId,this.body=J.body??{},this.limits={...w8,...m$(J.limits)},this.lines={...b8,...m$(J.lines)},this.delegateName=J.delegate?.name??KJ;let Q=new Set(WJ(J.delegate).map(($)=>$.name));for(let $ of J.tools??[]){if(Q.has($.tool.name)||this.toolHandlers.has($.tool.name))throw Error(`VoiceBridge: two tools are named "${$.tool.name}".`);this.toolHandlers.set($.tool.name,$)}if("realtime"in J.call){let{realtime:$,callId:Z}=J.call;this.callId=Z,this.sideband=$.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(($)=>this.resolveEnded=$),AJ.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 Q=this.params.contextNote?.(J);if(Q)this.sideband.addNote(Q)}end(J="hangup",Q){return this.ending??=this.finish(J,Q??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 Q=J.usage;if(Q){this.usage=w(this.usage,Q);let $=this.info();this.hook(()=>this.params.onUsage?.(Q,$))}return}case"conversation.item.input_audio_transcription.completed":{let Q=J;if(this.say("user",String(Q.transcript??"")),Q.transcriptionUsage||Q.transcriptionSeconds!==void 0){this.transcription={usage:Q.transcriptionUsage?w(this.transcription.usage,Q.transcriptionUsage):this.transcription.usage,seconds:this.transcription.seconds+(Q.transcriptionSeconds??0)};let $=this.info(),Z={...Q.transcriptionUsage?{usage:Q.transcriptionUsage}:{},...Q.transcriptionSeconds!==void 0?{seconds:Q.transcriptionSeconds}:{}};this.hook(()=>this.params.onTranscriptionUsage?.(Z,$))}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 Q=J;if(this.touch(),!this.ending)this.call(Q.call_id,Q.name,Q.arguments);return}case"session.updated":if(this.tampered(J.session))this.end("session_tampered",null);return;case"error":{let Q=J.error;if(this.errors.push({code:Q?.code,message:String(Q?.message??"")}),this.pendingCreate&&Q?.event_id===this.pendingCreate)if(this.pendingCreate=void 0,Q.code==="conversation_already_has_active_response")this.responseActive=!0,this.responseWanted=!0;else this.responseActive=!1;return}case"sideband.closed":{let Q=J;if(!this.ending&&!Q.byClient)this.end(Q.code===1000?"call_ended":"sideband_lost",null);return}}}say(J,Q){if(Q.trim())this.transcript.push({role:J,text:Q,at:Date.now()})}call(J,Q,$){let Z=f8($);if(Q===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(Q);if(W)return void this.runTool(J,W,Z);switch(Q){case"stop_work":{let K=this.running;if(K)K.stopRequested=!0,K.handle?.stop({reason:"Stopped by voice."});let G=this.dropQueue();return this.answer(J,{stopped:Boolean(K),dropped:G})}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:"",G=typeof Z.approve==="boolean"?Z.approve:void 0,X=this.pending.map((V)=>v8(V,K,G));return this.pending=[],this.enqueue({record:{request:`(answer) ${K}`,status:"queued"},turn:{toolResults:X},callId:J})}default:return this.answer(J,{status:"error",message:`There is no tool called ${Q}.`})}}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 Q=new Set;await this.waitForThread(Q);let $=await this.latestBody();while(!J.stopRequested&&await this.waitForThread(Q));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:$,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(Q){J.record.status="done",this.complete(J,{status:"failed",message:Q instanceof Error?Q.message:"The work failed."})}finally{this.running=void 0,this.flushNote();let Q=this.queue.shift();if(Q&&!this.ending)this.run(Q);else this.touch()}}async runTool(J,Q,$){let Z=Q.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 G=new AbortController,X=Q.timeoutMs??this.limits.toolTimeoutMs,V,Y;try{let D=await Promise.race([Q.run($,{sessionId:this.sessionId,signal:G.signal}),new Promise((z,B)=>{V=setTimeout(()=>{B(new y(`"${Z}" took longer than ${Math.round(X/1000)} s.`)),G.abort()},X)})]);K.status="done",Y={status:"done",output:this.clip(D)}}catch(D){if(D instanceof kJ){K.status="refused",K.message=D.message,this.end("usage",D.line??null);return}let z=D instanceof y?D.message:"The tool failed.";if(!(D instanceof y))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 Q;try{Q=JSON.stringify(J)}catch{return String(J)}if(Q===void 0||Q.length<=this.limits.toolOutputChars)return J;return`${Q.slice(0,this.limits.toolOutputChars)}\u2026 (cut: ${Q.length} characters in all)`}async waitForThread(J=new Set){let Q=this.params.liveRuns;if(!Q)return!1;let $=await Q.find({threadId:this.threadId}),Z=$&&!J.has($.runId)?Q.get($.runId):null;if(!$||!Z)return!1;return J.add($.runId),await Z.result().catch(()=>{return}),!0}async latestBody(){let J=this.params.store;if(!J)return this.body;let Q=await J.get(this.sessionId).catch(()=>null);if(Q)this.body=Q.body;return this.body}async follow(J){let Q=this.params.progress??h8();try{for await(let $ of J.run){let Z=Q($);if(Z)this.note(Z)}}catch{}}complete(J,Q){if(this.ending)return;if(J.callId)this.sideband.functionOutput(J.callId,Q),J.callId=void 0;else this.sideband.addNote(`Update on the earlier request "${J.record.request}": ${JSON.stringify(Q)}`);this.respond()}answer(J,Q){this.sideband.functionOutput(J,Q),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 Q of J)Q.record.status="dropped";return J.length}note(J){if(J===this.lastProgress)return;this.lastProgress=J;let Q=this.lastNoteAt+this.limits.progressIntervalMs-Date.now();if(Q<=0)return this.flushNote();this.noteTimer??=setTimeout(()=>this.flushNote(),Q)}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(Q){if(Q instanceof kJ)this.end("usage",Q.line??null);else console.error("[gemi/ai] a voice hook threw; ending the call.",Q),this.end("error",this.lines.error)}})}tampered(J){let Q=this.params.session;if(!Q||!J)return!1;if(Q.instructions!==void 0&&J.instructions!==void 0&&J.instructions!==Q.instructions)return!0;if(Array.isArray(J.tools)){let $=new Set([...WJ(this.params.delegate),...Q.tools??[]].map((W)=>W.name)),Z=new Set(J.tools.map((W)=>String(W?.name)));if($.size!==Z.size||[...$].some((W)=>!Z.has(W)))return!0}return!1}async finish(J,Q){for(let G of this.timers)clearTimeout(G);if(this.idleTimer)clearTimeout(this.idleTimer);if(this.noteTimer)clearTimeout(this.noteTimer);if(this.tickTimer)clearInterval(this.tickTimer);if(this.dropQueue(),Q&&(J!=="call_ended"&&J!=="sideband_lost"))await this.closingLine(Q);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};AJ.delete(this.sessionId),await this.params.store?.update(this.sessionId,{endedAt:Z,endReason:J}).catch(()=>{return});try{await this.params.onEnd?.(K)}catch(G){console.error("[gemi/ai] a voice session's onEnd threw.",G)}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 Q;await Promise.race([this.sideband.closed,new Promise(($)=>Q=setTimeout($,this.limits.hangupGraceMs))]),clearTimeout(Q),this.sideband.close()}}async closingLine(J){await new Promise((Q)=>{let $=`gemi_voice_closing_${crypto.randomUUID()}`,Z=`gemi_voice_cancel_${crypto.randomUUID()}`,W=this.responseActive?"cancelling":"asked",K,G=setTimeout(X,this.limits.closingLineMs);function X(){clearTimeout(G),Q()}let V=()=>{W="asked",this.sideband.send({type:"response.create",event_id:$,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 X();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===$)return X();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))X()},W==="cancelling")this.sideband.send({type:"response.cancel",event_id:Z});else V()}),this.closingWaiter=void 0}}function m$(J){if(!J)return{};return Object.fromEntries(Object.entries(J).filter(([,Q])=>Q!==void 0))}function f8(J){try{let Q=JSON.parse(J);return Q&&typeof Q==="object"&&!Array.isArray(Q)?Q:{}}catch{return{}}}function v8(J,Q,$){let Z={toolCallId:J.toolCallId,signature:J.signature,...J.path?{path:J.path}:{}};if(J.kind==="question")return{...Z,output:Q};if(J.kind==="approval")return{...Z,approve:$===!0,...Q?{reason:Q}:{}};return{...Z,approve:!1,reason:"Not available in a voice call."}}function h8(){let J=new Set;return(Q)=>{if(Q.type==="tool-call"){if(Q.part.partial||Q.resent||J.has(Q.part.toolCallId))return;return J.add(Q.part.toolCallId),`running ${String(Q.part.name)}`}if(Q.type==="tool-progress"){let $=Q.data;if(typeof $==="string")return $;if($&&typeof $==="object")for(let Z of["message","label","title"]){let W=$[Z];if(typeof W==="string"&&W)return W}}return}}var p$="http://gemi.internal/__gemi__/voice/mcp";async function FQ(J,Q){if(!Q.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:$}=J,Z=J.scopes??$.scopes().map((G)=>G.name),W=(G)=>({kind:"remote",req:G,principal:{user:Q.user,via:"voice",id:`voice:${Q.sessionId}`,scopes:Z}});return(await $.available(W(l$()),J.filter)).filter((G)=>!G.requiresApproval).map((G)=>({tool:{name:G.name,description:G.description,parameters:G.inputSchema},...J.timeoutMs!==void 0?{timeoutMs:J.timeoutMs}:{},run:(X,V)=>{let Y=l$();return h.run(Y,async()=>{return await J.authorize?.({name:G.name,input:X,sessionId:V.sessionId}),$.execute(W(Y),G.name,X,void 0,{signal:V.signal})},{user:Q.user})}}))}function l$(){return new E(new Request(p$,{method:"POST"}),{},"api",new URL(p$).pathname)}class PQ{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 Q=this.records.get(J);return Q?structuredClone(Q):null}async update(J,Q){let $=this.records.get(J);if(!$)return;this.records.set(J,{...$,...structuredClone(Q),id:J})}sweep(){let J=Date.now()-this.retainEndedMs;for(let[Q,$]of this.records)if($.endedAt!==void 0&&$.endedAt<J)this.records.delete(Q)}}var UQ=new PQ;class s extends Error{runId;requested;oldest;code="frame_cursor_evicted";constructor(J,Q,$){super(`Frame ${Q} of run ${J} has been evicted; the oldest frame still buffered is ${$}. Reload the thread instead of resuming.`);this.runId=J;this.requested=Q;this.oldest=$}}class GJ extends Error{runId;code="live_run_not_found";constructor(J){super(`No live run ${J} in this process.`);this.runId=J}}class RJ{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,Q={}){let $={run:J,threadId:Q.threadId,owner:Q.owner??null,clientRunId:Q.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(Q.threadId,J.runId);if(Q.clientRunId)this.byClientRun.set(Q.clientRunId,J.runId);return this.scheduleExpiry($,Q.maxRunDurationMs),this.pump($,Q)}findByClientRunId(J){let Q=this.byClientRun.get(J);return Q&&this.runs.has(Q)?Q:null}async find(J){let Q=this.byThread.get(J.threadId);if(!Q)return null;let $=this.runs.get(Q);if(!$)return null;return{runId:Q,seq:$.lastSeq}}get(J){return this.runs.get(J)?.run??null}ownerOf(J){return this.runs.get(J)?.owner??null}mayAccess(J,Q){let $=this.ownerOf(J);return $===null||$===Q}isRunning(J){let Q=this.runs.get(J);return!!Q&&!Q.ended&&!Q.evicted}replay(J,Q){let $=this.runs.get(J);if(!$)throw new GJ(J);if(Q!==void 0&&Q<$.lostBefore)throw new s(J,Q,$.lostBefore);let Z=$.frames[0]?.seq;return this.drain($,J,Q??Z??$.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,Q){let $=Promise.resolve();try{for await(let Z of J.run.frames()){if(J.evicted){let K=Q.onEvent;if(K)$=$.then(()=>K(Z.event)).catch((G)=>OQ(Q,G));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=Q.onEvent;if(W)$=$.then(()=>W(Z.event)).catch((K)=>OQ(Q,K))}}catch(Z){OQ(Q,Z)}finally{if(J.ended=!0,J.expireAt)clearTimeout(J.expireAt),J.expireAt=null;this.notify(J),this.scheduleEviction(J),await $}}async*drain(J,Q,$){let Z=$;while(!0){let W=J.version;for(;;){if(Z<J.lostBefore)throw new s(Q,Z,J.lostBefore);let K=J.frames,G=K[0]?.seq;if(G===void 0)break;let X=Math.max(0,Z-G);if(X>=K.length)break;let V=K[X];yield V,Z=V.seq+1}if(J.ended&&Z>J.lastSeq||J.evicted)return;await this.wait(J,W)}}wait(J,Q){if(J.version!==Q)return Promise.resolve();return new Promise(($)=>J.wake.add($))}notify(J){J.version++;let Q=Array.from(J.wake);J.wake.clear();for(let $ of Q)$()}scheduleEviction(J){if(J.evictAt)return;let Q=setTimeout(()=>{let $=J.run.runId;if(!J.ended)J.evicted=!0,J.frames=[];if(this.runs.get($)===J)this.runs.delete($);if(J.threadId&&this.byThread.get(J.threadId)===$)this.byThread.delete(J.threadId);if(J.clientRunId&&this.byClientRun.get(J.clientRunId)===$)this.byClientRun.delete(J.clientRunId);this.notify(J)},this.ttlMs);Q.unref?.(),J.evictAt=Q}scheduleExpiry(J,Q){if(this.maxAgeMs===null||Q===null)return;let $=Q===void 0?this.maxAgeMs:Math.max(this.maxAgeMs,Q+this.ttlMs);if(!Number.isFinite($)||$>2147483647)return;let Z=setTimeout(()=>{if(J.expireAt=null,J.ended)return;try{J.run.stop({reason:`The run was still going ${Math.round($/1000)}s after it started, past the live-run registry's age limit.`})}catch{}this.scheduleEviction(J)},$);Z.unref?.(),J.expireAt=Z}}var NQ=new RJ;function OQ(J,Q){try{J.onInternalError?.(Q)}catch{}}class TJ{maxEntries;records=new Map;constructor(J=1e5){this.maxEntries=J}async record(J,Q){if(this.records.has(J))return;this.records.set(J,{...Q});while(this.records.size>this.maxEntries){let $=this.records.keys().next().value;if($===void 0)break;this.records.delete($)}}async get(J){let Q=this.records.get(J);return Q?{...Q}:null}}var LQ=new TJ;class _Q{now;receipts=new Map;sweepAt=1024;constructor(J=Date.now){this.now=J}async claim(J,Q){let $=this.now();if(this.receipts.size>=this.sweepAt)this.sweep($);let Z=this.receipts.get(J);if(Z&&Z.expiresAt>$)return Z.result?{status:"replay",result:structuredClone(Z.result)}:{status:"blocked"};return this.receipts.set(J,{expiresAt:Q}),{status:"claimed"}}async complete(J,Q,$){this.receipts.set(J,{result:structuredClone(Q),expiresAt:$})}async release(J){let Q=this.receipts.get(J);if(Q&&!Q.result)this.receipts.delete(J)}get size(){return this.receipts.size}sweep(J){for(let[Q,$]of this.receipts)if($.expiresAt<=J)this.receipts.delete(Q);this.sweepAt=Math.max(1024,this.receipts.size*2)}}var d$="pending",MQ="done:",y8=`
|
|
142
|
+
)`,`CREATE INDEX IF NOT EXISTS "${Q}_scope_kind_created_at_idx" ON "${Q}"("scope", "kind", "created_at")`,`CREATE INDEX IF NOT EXISTS "${Q}_expires_at_idx" ON "${Q}"("expires_at")`,`CREATE UNIQUE INDEX IF NOT EXISTS "${Q}_scope_key_key" ON "${Q}"("scope", "key")`]}var g6=/^[A-Za-z0-9_-]{1,64}$/;function u6(J,Q){let $=c6(Q)?Q:{filter:Q},Z=$.deferred===!0,W=J.descriptors($.filter);if(!$.namespaces)return W.map((H)=>nJ(J,H,Z));let K=Object.entries($.namespaces),G=new Set(J.descriptors().flatMap((H)=>H.tags));for(let[H,B]of K){if(!g6.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 B?.description!=="string"||B.description.trim()==="")throw Error(`toAgentTools: the namespace "${H}" needs a description. It is what the model reads to decide whether to look inside.`);if(!G.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 B=K.find(([z])=>H.tags.includes(z))?.[0];if(B===void 0)V.push(nJ(J,H,Z));else Y.get(B).push(nJ(J,H,!1))}let X=[];for(let[H,B]of K){let z=Y.get(H);if(z.length===0)continue;X.push(oJ.create({name:H,description:B.description,tools:z,deferred:B.deferred??Z}))}return[...X,...V]}function c6(J){return typeof J==="object"&&J!==null&&(("filter"in J)||("namespaces"in J)||("deferred"in J))}function nJ(J,Q,$){if(Q.kind==="tool")return m6(J,Q,$);return OJ.create({name:Q.name,description:Q.description,inputSchema:Q.inputSchema,...Q.outputSchema?{outputSchema:Q.outputSchema}:{},requiresApproval:Q.requiresApproval,deferred:$,execute:(Z,W)=>{let K=y.getStore()?.req;if(!K)throw new g(`"${Q.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},Q.name,Z,W)}})}function m6(J,Q,$){let Z=J.nativeTool(Q.name);return OJ.create({name:Q.name,description:Q.description,inputSchema:Q.inputSchema,...Q.outputSchema?{outputSchema:Q.outputSchema}:{},requiresApproval:J.nativeApproval(Q.name),deferred:$,...Z.timeoutMs!==void 0?{timeoutMs:Z.timeoutMs}:{},...Z.async?{async:Z.async}:{},execute:(W,K)=>{let G=y.getStore()?.req;return J.startNative(G?{kind:"local",req:G}:void 0,Q.name,W,K)}})}function p6(J){if(J==="auto")return;let Q=/^(\d+)x(\d+)$/.exec(J);if(!Q)throw Error(`An image size is "WIDTHxHEIGHT" or "auto"; got ${JSON.stringify(J)}.`);let $=Number(Q[1]),Z=Number(Q[2]);if($%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($/Z,Z/$)>3)throw Error(`Image size ${J} is not supported: the maximum aspect ratio is 3:1, either way up.`)}function D$(J,Q){if(J.size!==void 0)try{p6(J.size)}catch($){throw Error(`${Q}: ${$.message}`)}if(J.background==="transparent"&&J.format==="jpeg")throw Error(`${Q}: a transparent background needs "png"; JPEG has no alpha channel.`);if(J.compression!==void 0){let $=J.compression;if(!Number.isInteger($)||$<0||$>100)throw Error(`${Q}: compression is an integer from 0 to 100; got ${$}.`)}}function B$(J,Q){if(J instanceof File)return J;let $=J.type||"image/png",Z=$==="image/jpeg"?"jpg":$.split("/")[1]??"png";return new File([J],`${Q}.${Z}`,{type:$})}class aJ{name;provider;settings;constructor(J){let{name:Q,provider:$,...Z}=J;D$(Z,`ImageModel "${Q}"`),this.name=Q,this.provider=$,this.settings=Z}static create(J){return new aJ(J)}async generate(J){let Q=this.merge(J);return F$(await this.provider.generate({prompt:J.prompt,...Q,signal:J.signal}))}async edit(J){let Q=this.merge(J);return F$(await this.provider.edit({prompt:J.prompt,...Q,images:J.images.map(($,Z)=>B$($,`image-${Z}`)),...J.mask?{mask:B$(J.mask,"mask")}:{},signal:J.signal}))}merge(J){let Q={...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 D$(Q,`ImageModel "${this.name}"`),Q}}function F$(J){return{image:new Blob([J.bytes],{type:J.mimeType}),mimeType:J.mimeType,size:J.size,usage:J.usage}}function u(J){return typeof process>"u"?void 0:process.env?.[J]}var l6="preview";function P$(J){let Q=J.trim().replace(/\/+$/,"");if(!Q)return"";return`${Q.replace(/\/openai(?:\/v1)?$/i,"")}/openai`}function d6(J){return/^\d{4}-\d{2}-\d{2}/.test(J)?"":"/v1"}function JJ(J,Q={}){return{base:(J.baseURL??u("OPENAI_BASE_URL")??"https://api.openai.com/v1").replace(/\/+$/,""),query:"",headers:async()=>{let Z=J.apiKey??u("OPENAI_API_KEY");return{...Z?{authorization:`Bearer ${Z}`}:{},...J.headers}},timeoutMs:J.timeoutMs??Q.timeoutMs??120000,maxRetries:J.maxRetries??2}}function O$(J){let Q=J.baseURL??J.endpoint??u("AZURE_OPENAI_ENDPOINT");if(Q)return P$(Q);let $=J.resourceName??u("AZURE_OPENAI_RESOURCE_NAME")??u("AZURE_RESOURCE_NAME");return $?P$(`https://${$.trim()}.cognitiveservices.azure.com`):""}function QJ(J,Q={}){let $=J.apiVersion??u("AZURE_OPENAI_API_VERSION")??l6;return{base:`${O$(J)}${d6($)}`,query:`?api-version=${encodeURIComponent($)}`,headers:async()=>{if(J.getToken)return{authorization:`Bearer ${await J.getToken()}`,...J.headers};let Z=J.apiKey??u("AZURE_OPENAI_API_KEY");return{...Z?{"api-key":Z}:{},...J.headers}},timeoutMs:J.timeoutMs??Q.timeoutMs??120000,maxRetries:J.maxRetries??2}}function U$(J,Q={}){return{...QJ(J,Q),base:`${O$(J)}/v1`,query:""}}var i6=500,L$=20000;function n6(J,Q){if(!J)return;let $=J.trim();if(/^\d+(\.\d+)?$/.test($))return Math.max(0,Number($)*1000);let Z=Date.parse($);if(Number.isNaN(Z))return;return Math.max(0,Z-Q)}function UJ(J,Q){let $=Math.min(L$,i6*2**J);return Math.round($*(0.5+Q()*0.5))}function o6(J){return J===429||J===408||J===409||J>=500}function a6(J,Q){return o6(J)&&k(Q).retryable}function M$(J){return J.reason??new DOMException("The operation was aborted.","AbortError")}function C$(J,Q){return new Promise(($,Z)=>{let W=setTimeout($,J);Q?.addEventListener("abort",()=>{clearTimeout(W),Z(M$(Q))},{once:!0})})}async function sJ(J,Q,$=C$){if(!Q)return await $(J);Q.throwIfAborted();let Z;try{await Promise.race([$(J,Q),new Promise((W,K)=>{Z=()=>K(M$(Q)),Q.addEventListener("abort",Z,{once:!0})})])}finally{if(Z)Q.removeEventListener("abort",Z)}}async function c(J,Q,$){let Z=$.fetchImpl??((H,B)=>fetch(H,B)),W=$.sleep??C$,K=$.random??Math.random,G=$.now??Date.now,Y=Math.max(0,$.maxRetries),V=(H)=>sJ(H,$.signal,W),X;for(let H=0;H<=Y;H++){$.signal?.throwIfAborted();let B=new AbortController,z=()=>B.abort($.signal?.reason);$.signal?.addEventListener("abort",z,{once:!0});let D=!1,U=$.timeoutMs>0?setTimeout(()=>{D=!0,B.abort()},$.timeoutMs):void 0,P;try{P=await Z(J,{...Q,signal:B.signal})}catch(L){if(U!==void 0)clearTimeout(U);if($.signal?.removeEventListener("abort",z),$.signal?.aborted)throw L;if(X=D?new N$($.timeoutMs):L,D&&$.retryTimeouts===!1)throw X;if(H===Y)throw X;await V(UJ(H,K));continue}if(U!==void 0)clearTimeout(U);if(P.ok)return P;$.signal?.removeEventListener("abort",z);let O=await s6(P),F=new w(P.status,O,P.headers.get("x-request-id")??void 0,n6(P.headers.get("retry-after"),G()));if(H===Y||!a6(P.status,F))throw F;let N=F.retryAfter??(P.status===429?k(F).retryAfter:void 0);await V(N===void 0?UJ(H,K):Math.min(N,L$)),X=F}throw X??Error("Provider request failed with no response.")}async function s6(J){let Q;try{Q=await J.text()}catch{return null}try{return JSON.parse(Q)}catch{return Q}}var tJ=300000;function rJ(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 NJ extends Error{code;retryable;retryAfter;constructor(J,Q={}){super(J.message,Q);if(this.name="ImageRequestError",this.code=J.code,this.retryable=J.retryable,J.retryAfter!==void 0)this.retryAfter=J.retryAfter}}var t6={png:"image/png",jpeg:"image/jpeg"};function r6(J){let Q=Number(J?.input_tokens??0),$=Number(J?.output_tokens??0),Z={inputTokens:Q,outputTokens:$,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 e6(J){let Q=atob(J),$=new Uint8Array(Q.length);for(let Z=0;Z<Q.length;Z++)$[Z]=Q.charCodeAt(Z);return $}function J8(J){let $=J?.data?.[0]?.b64_json;if(typeof $!=="string"||$.length===0)throw new NJ({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:e6($),mimeType:t6[Z]??`image/${Z}`,size:typeof J.size==="string"?J.size:"",...typeof J.background==="string"?{background:J.background}:{},usage:r6(J.usage)}}async function _$(J,Q,$,Z){let W;try{W=await c(J,Q,{maxRetries:$.maxRetries,timeoutMs:$.timeoutMs,retryTimeouts:!1,signal:Z.signal,fetchImpl:$.fetchImpl})}catch(K){if(Z.signal?.aborted)throw K;throw new NJ(k(K),{cause:K})}return J8(await W.json())}async function S$(J,Q,$={}){return await _$(J.generationsUrl,{method:"POST",headers:{...await J.headers(),"content-type":"application/json"},body:JSON.stringify(Q)},J,$)}async function A$(J,Q,$={}){return await _$(J.editsUrl,{method:"POST",headers:await J.headers(),body:Q},J,$)}class LJ{static models(){return[]}modelName(){return this.model}async generate(J){return await S$(this.endpoint(),this.body(J),{signal:J.signal})}async edit(J){let Q=new FormData;for(let[$,Z]of Object.entries(this.body(J)))if(Z!==void 0)Q.set($,String(Z));for(let $ of J.images)Q.append("image[]",$,$.name);if(J.mask)Q.set("mask",J.mask,J.mask.name);return await A$(this.endpoint(),Q,{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 k(J)}}var k$=["gpt-image-2","gpt-image-1.5","gpt-image-1"];class eJ extends LJ{model;config;constructor(J,Q={}){super();this.model=J,this.config=Q}static model(J,Q){return new eJ(J,Q)}static models(){return k$}endpoint(){return rJ(JJ(this.config,{timeoutMs:tJ}))}}class JQ extends LJ{model;config;constructor(J,Q={}){super();this.model=J,this.config=Q}static model(J,Q){return new JQ(J,Q)}static models(){return k$}modelName(){return this.config.deployment??this.model}endpoint(){return rJ(QJ(this.config,{timeoutMs:tJ}))}}var j$=3;function QQ(J){let Q=new Map;for(let $ of J)for(let Z of $.content??[]){if(Z.type!=="file"||!Z.fileId||Q.has(Z.fileId))continue;Q.set(Z.fileId,{name:Z.name,mimeType:Z.mimeType})}return Q}function E$(J,Q,$=new Map){if(!(Q instanceof w))return[];if(Q.status!==400&&Q.status!==404)return[];let Z=$8(Q.body);if(!Z)return[];let W=Q8(J.input);if(W.length===0)return[];let K=/^input\[(\d+)\]\.content\[(\d+)\]\.file_id$/.exec(Z.param??"");if(K){let X=J.input[Number(K[1])],H=ZQ(X)[Number(K[2])],B=H&&typeof H.file_id==="string"?H.file_id:void 0;if(B)return[B]}let G=Z.message??"",Y=T$(W.map((X)=>X.fileId).filter((X)=>Z8(G,X)));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(G);if(V){let X=V[1].toLowerCase()==="image type"?"input_image":"input_file",H=V[2].toLowerCase(),B=T$(W.filter((D)=>D.type===X).map((D)=>D.fileId)),z=B.filter((D)=>($.get(D)?.name??"").trim().toLowerCase().endsWith(`.${H}`));if(z.length===1)return z;if(z.length===0&&B.length===1)return B}return[]}function x$(J,Q,$=new Map){return{...J,input:J.input.map((Z)=>{let W=ZQ(Z);if(!W.some((K)=>R$(K,Q)))return Z;return{...Z,content:W.map((K)=>R$(K,Q)?{type:"input_text",text:$Q($.get(String(K.file_id))?.name)}:K)}})}}function $Q(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 R$(J,Q){return typeof J.file_id==="string"&&Q.has(J.file_id)}function ZQ(J){let Q=J?.content;return Array.isArray(Q)?Q:[]}function Q8(J){let Q=[];for(let $ of J)for(let Z of ZQ($))if(typeof Z.file_id==="string"&&Z.file_id)Q.push({type:String(Z.type),fileId:Z.file_id});return Q}function $8(J){if(!J||typeof J!=="object")return null;let Q=J,$=Q.error&&typeof Q.error==="object"?Q.error:J;return{message:typeof $.message==="string"?$.message:void 0,param:typeof $.param==="string"?$.param:void 0}}function Z8(J,Q){let $=Q.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return new RegExp(`(^|[^A-Za-z0-9_-])${$}($|[^A-Za-z0-9_-])`).test(J)}function T$(J){return[...new Set(J)]}async function*W8(J){let Q="",$="",Z=[],W,K=()=>{if(Z.length===0&&!$)return null;let V={event:$,data:Z.join(`
|
|
143
|
+
`),id:W};return $="",Z=[],W=void 0,V.data?V:null},G=(V)=>{let X=V.endsWith("\r")?V.slice(0,-1):V;if(X==="")return K();if(X.startsWith(":"))return null;let H=X.indexOf(":"),B=H===-1?X:X.slice(0,H),z=H===-1?"":X.slice(H+1);if(z.startsWith(" "))z=z.slice(1);if(B==="event")$=z;else if(B==="data")Z.push(z);else if(B==="id")W=z;return null};for await(let V of J){Q+=V;let X=Q.indexOf(`
|
|
144
|
+
`);while(X!==-1){let H=Q.slice(0,X);Q=Q.slice(X+1);let B=G(H);if(B)yield B;X=Q.indexOf(`
|
|
145
|
+
`)}}if(Q.length>0){let V=G(Q);if(V)yield V}let Y=K();if(Y)yield Y}async function*q$(J,Q={}){let $=new Map,Z=new Set,W,K=!1,G,Y=(V,X)=>({type:"finish",reason:V,usage:X,...G?{model:G}:{}});for await(let V of W8(J)){if(V.data==="[DONE]")break;let X;try{X=JSON.parse(V.data)}catch{continue}let H=typeof X.type==="string"?X.type:V.event,B=X.response?.model;if(typeof B==="string"&&B)G=B;switch(H){case"response.output_text.delta":{let z=String(X.delta??"");if(!z)break;yield Q.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(X.delta??"");if(!z)break;yield{type:"reasoning-delta",delta:z,id:X.item_id};break}case"response.output_item.added":{let z=X.item;if(!z)break;if(z.type==="function_call"){let D=String(z.id??X.item_id??z.call_id??"");$.set(D,{callId:String(z.call_id??D),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=$.get(String(X.item_id??""));if(!z)break;let D=String(X.delta??"");if(!D)break;yield{type:"tool-call-delta",toolCallId:z.callId,name:z.name,argsDelta:D,...z.namespace?{namespace:z.namespace}:{}};break}case"response.function_call_arguments.done":{let z=String(X.item_id??""),D=$.get(z);if(!D)break;D.done=!0,yield{type:"tool-call",toolCallId:D.callId,name:D.name,args:String(X.arguments??""),...D.namespace?{namespace:D.namespace}:{}};break}case"response.output_item.done":{let z=X.item;if(!z)break;if(z.type==="function_call"){let D=String(z.id??X.item_id??z.call_id??""),U=$.get(D);if(U?.done)break;let P=(typeof z.namespace==="string"?z.namespace:"")||U?.namespace;if(yield{type:"tool-call",toolCallId:String(z.call_id??D),name:String(z.name??U?.name??""),args:String(z.arguments??""),...P?{namespace:P}:{}},U)U.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 D=K8(z);if(D.loaded.length===0&&D.namespaces.length===0)break;let U=String(z.tool_search_call_id??z.id??"");if(Z.has(U))break;Z.add(U);let P=W;W=void 0,yield{type:"tool-search",...D,...P!==void 0&&P!==null?{arguments:P}:{}}}break}case"response.refusal.done":{yield{type:"error",error:{code:"content_filtered",message:String(X.refusal??"The model refused to answer."),retryable:!1}};break}case"response.completed":{K=!0,yield Y("stop",WQ(X.response?.usage));break}case"response.incomplete":{K=!0;let z=WQ(X.response?.usage),D=X.response?.incomplete_details?.reason;if(D==="content_filter"){yield{type:"error",error:{code:"content_filtered",message:G8(X.response?.content_filters),retryable:!1}},yield Y("error",z);break}yield Y(D==="max_output_tokens"?"length":"stop",z);break}case"response.failed":case"error":{K=!0;let z=X.response?.error??X.error??X;yield{type:"error",error:X8(z)},yield Y("error",WQ(X.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",b())}function K8(J){let Q=[],$=[];return I$(J.results??J.tools??J.loaded??J.output,Q,$,0),{loaded:KQ(Q),namespaces:KQ($)}}function I$(J,Q,$,Z){if(!Array.isArray(J)||Z>4)return;for(let W of J){if(typeof W==="string"){Q.push(W);continue}if(!W||typeof W!=="object")continue;let K=W,G=typeof K.name==="string"?K.name:typeof K.tool_name==="string"?K.tool_name:"",Y=K.tools??K.functions;if(Array.isArray(Y)){if(G)$.push(G);I$(Y,Q,$,Z+1);continue}if(G)Q.push(G)}}function KQ(J){return J.filter((Q,$)=>J.indexOf(Q)===$)}function G8(J){if(!Array.isArray(J))return"The provider's content filter blocked this request.";let $=[];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[G,Y]of Object.entries(K))if(Y&&typeof Y==="object"&&Y.filtered===!0)$.push(`${G} (${String(W.source_type??"unknown")})`)}return $.length===0?"The provider's content filter blocked this request.":`The provider's content filter blocked this request. Categories: ${KQ($).join(", ")}.`}function X8(J){let Q=typeof J?.message==="string"?J.message:"The provider stream failed.",$=String(J?.code??"").toLowerCase();if($==="rate_limit_exceeded")return{code:"rate_limited",message:Q,retryable:!0};if($==="context_length_exceeded")return{code:"context_length_exceeded",message:Q,retryable:!1};if($.includes("content_filter"))return{code:"content_filtered",message:Q,retryable:!1};return{code:"provider_error",message:Q,retryable:!0}}function b(){return{inputTokens:0,outputTokens:0,totalTokens:0}}function WQ(J){if(!J)return b();let Q=Number(J.input_tokens??0),$=Number(J.output_tokens??0),Z={inputTokens:Q,outputTokens:$,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*w$(J){if(!J)return;let Q=J.getReader(),$=new TextDecoder;try{while(!0){let{done:W,value:K}=await Q.read();if(W)break;if(K)yield $.decode(K,{stream:!0})}let Z=$.decode();if(Z)yield Z}finally{Q.releaseLock()}}function GQ(J){return{responsesUrl:`${J.base}/responses${J.query}`,filesUrl:`${J.base}/files${J.query}`,headers:J.headers,timeoutMs:J.timeoutMs,maxRetries:J.maxRetries}}async function*XQ(J,Q,$){let Z=Q,W=new Set,K=0,G=Math.max(0,J.maxRetries),Y=J.random??Math.random,V,X=(B)=>{if(!V)return B;let z=E(E(b(),V),B.usage);return V=void 0,{...B,usage:z}},H=()=>X({type:"finish",reason:"aborted",usage:b()});for(let B=0;;B++){let z;while(z===void 0)try{z=await c(J.responsesUrl,{method:"POST",headers:{...await J.headers(),"content-type":"application/json"},body:JSON.stringify(Z)},{maxRetries:J.maxRetries,timeoutMs:J.timeoutMs,signal:$.signal,fetchImpl:J.fetchImpl,sleep:J.sleep,random:J.random})}catch(O){let F=K<j$?E$(Z,O,$.files).filter((L)=>!W.has(L)):[];if(F.length>0){K++;let L=k(O).message;for(let R of F)W.add(R),yield{type:"file-rejected",fileId:R,message:L,...i(O)};Z=x$(Z,new Set(F),$.files);continue}let N=k(O);if(N.code==="aborted"){yield H();return}yield{type:"error",error:N,...i(O)},yield X({type:"finish",reason:"error",usage:b()});return}let D=[],U=!1,P;try{for await(let O of q$(w$(z.body),{structuredOutput:$.structuredOutput})){if(U){yield O.type==="finish"?X(O):O;continue}if(MJ(O)){U=!0,yield*D.splice(0),yield O;continue}if(O.type==="error")P=O.error;D.push(O)}}catch(O){let F=k(O);if(F.code==="aborted"||$.signal?.aborted){yield H();return}if(U){yield{type:"error",error:F},yield X({type:"finish",reason:"error",usage:b()});return}P=F,D.push({type:"error",error:F},{type:"finish",reason:"error",usage:b()})}if(U)return;if(P?.retryable&&B<G&&!$.signal?.aborted){for(let O of D)if(O.type==="finish")V=E(V??b(),O.usage);try{await sJ(UJ(B,Y),$.signal,J.sleep)}catch{yield H();return}continue}for(let O of D)yield O.type==="finish"?X(O):O;return}}async function YQ(J,Q,$="user_data"){let Z=new FormData;Z.set("purpose",$),Z.set("file",Q);let K=await(await c(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 VQ(J){let Q=Y8(J);if(Q.startsWith("gpt-3.5")||Q.startsWith("text-")||Q.startsWith("davinci"))return{reasoning:!1,structuredOutput:!1,fileInput:!1,parallelToolCalls:!0,toolSearch:!1};let $=V8(Q);if($?.kind==="o")return{reasoning:!0,structuredOutput:!0,fileInput:!0,parallelToolCalls:$.major>1,toolSearch:b$($)};if($?.kind==="gpt")return{reasoning:$.major>=5,structuredOutput:$.major>4||Q.startsWith("gpt-4o")||Q.startsWith("gpt-4.1"),fileInput:$.major>4||Q.startsWith("gpt-4o")||Q.startsWith("gpt-4.1"),parallelToolCalls:!0,toolSearch:b$($)};return{reasoning:!0,structuredOutput:!0,fileInput:!0,parallelToolCalls:!0,toolSearch:!0}}function b$(J){if(J.kind==="o")return J.major>=5;return J.major>5||J.major===5&&J.minor>=2}function Y8(J){return J.trim().toLowerCase()}function V8(J){let Q=/^gpt-(\d+)(?:\.(\d+))?/.exec(J);if(Q?.[1])return{kind:"gpt",major:Number(Q[1]),minor:Number(Q[2]??0)};let $=/^o(\d+)(?:[-.]|$)/.exec(J);if($?.[1])return{kind:"o",major:Number($[1]),minor:0};return null}var H8={"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 z8(J){if(typeof J!=="string")return;let Q;try{Q=JSON.parse(J)}catch{return}if(!Q||typeof Q!=="object"||typeof Q.type!=="string")return;let $=H8[Q.type];if($)Q.type=$;if(Q.type==="response.done"&&Q.response?.usage)Q.usage=CJ(Q.response.usage);if(Q.type==="conversation.item.input_audio_transcription.completed"&&Q.usage)if(Q.usage.type==="duration"){let Z=Number(Q.usage.seconds);if(Number.isFinite(Z))Q.transcriptionSeconds=Z}else Q.transcriptionUsage=CJ(Q.usage);return Q}var f$=1,D8=500;function B8(J,Q){let $=globalThis.WebSocket;if(!$)throw Error("No global WebSocket: the realtime sideband needs Bun or Node 22+.");return new $(J,{headers:Q.headers})}class _J{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=Q,this.rejectReady=$}),this.ready.catch(()=>{}),this.closed=new Promise((Q)=>this.resolveClosed=Q),this.open()}send(J){if(this.finished||this.closing)return;let Q=JSON.stringify(J);if(this.socket?.readyState===f$)this.socket.send(Q);else this.outbox.push(Q)}updateSession(J){this.send({type:"session.update",session:SJ(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,Q){this.addItem({type:"function_call_output",call_id:J,output:typeof Q==="string"?Q:JSON.stringify(Q)})}createResponse(J={}){let Q={};if(J.instructions!==void 0)Q.instructions=J.instructions;if(J.toolChoice!==void 0)Q.tool_choice=typeof J.toolChoice==="string"?J.toolChoice:{type:"function",name:J.toolChoice.name};if(J.outputModalities)Q.output_modalities=J.outputModalities;if(J.conversation)Q.conversation=J.conversation;if(J.metadata)Q.metadata=J.metadata;Object.assign(Q,J.vendor),this.send(Object.keys(Q).length?{type:"response.create",response:Q}:{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 $=J.queue.shift();if($)return{value:$,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,Q="closed"){if(this.finished||this.closing)return;if(this.closing=!0,this.socket&&this.socket.readyState<=f$)this.socket.close(J,Q);else this.finish(J,Q,!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 $=await this.init.headers();if(this.closing)return this.finish(1000,"closed",!0);J=(this.init.webSocket??B8)(this.init.url,{headers:$})}catch($){return this.dropped(1006,$ instanceof Error?$.message:String($),!1)}this.socket=J;let Q=!1;J.addEventListener("open",()=>{Q=!0;let $=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(),$)this.emit({type:"sideband.reconnected",attempt:Z})}),J.addEventListener("message",($)=>{let Z=z8($.data);if(Z)this.emit(Z)}),J.addEventListener("close",($)=>{if(this.socket!==J)return;this.dropped($.code??1006,$.reason??"",Q)}),J.addEventListener("error",()=>{})}dropped(J,Q,$){if(this.socket=void 0,this.closing)return this.finish(J,Q,!0);let Z=this.init.reconnect?.attempts??3;if(!((J!==1000||!$)&&this.failures<Z))return this.finish(J,Q,!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:Q,byClient:$};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} ${Q}).`));this.resolveClosed(Z)}emit(J){if(this.backlog){if(this.backlog.push(J),this.backlog.length>D8)this.backlog.shift()}for(let Q of this.subscribers){if(Q.done)continue;Q.queue.push(J),Q.wake?.()}for(let Q of this.listeners)try{Q(J)}catch{}}}var HQ=30000,v$=10,h$=7200,F8=600,g$="gpt-live-transcribe";function P8(J){return J.type==="transcription"}function O8(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 Q={model:J.model??g$};if(J.prompt!==void 0)Q.prompt=J.prompt;if(J.keywords?.length)Q.keywords=J.keywords;if(J.languages?.length)Q.languages=J.languages;if(J.language!==void 0)Q.language=J.language;if(J.delay!==void 0)Q.delay=J.delay;let $={transcription:Q,turn_detection:J.turnDetection?u$(J.turnDetection):null};if(J.noiseReduction!==void 0)$.noise_reduction=J.noiseReduction&&{type:J.noiseReduction};let Z={type:"transcription",audio:{input:$}};if(J.logprobs)Z.include=["item.input_audio_transcription.logprobs"];return{...Z,...J.vendor}}function U8(J){if(!J)return{type:"object",properties:{}};return y$(J)?J.toJSONSchema():J}function SJ(J,Q){if(P8(J))return O8(J);let $={type:"realtime"},Z=J.model??Q;if(Z)$.model=Z;if(J.instructions!==void 0)$.instructions=J.instructions;if(J.outputModalities)$.output_modalities=J.outputModalities;if(J.maxOutputTokens!==void 0)$.max_output_tokens=J.maxOutputTokens;if(J.truncation!==void 0)$.truncation=J.truncation;if(J.tools)$.tools=J.tools.map((G)=>({type:"function",name:G.name,...G.description?{description:G.description}:{},parameters:U8(G.parameters)}));if(J.toolChoice!==void 0)$.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&&u$(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)$.audio={...Object.keys(W).length?{input:W}:{},...Object.keys(K).length?{output:K}:{}};return{...$,...J.vendor}}function u$(J){let Q={type:J.type};if(J.createResponse!==void 0)Q.create_response=J.createResponse;if(J.interruptResponse!==void 0)Q.interrupt_response=J.interruptResponse;if(J.type==="semantic_vad"){if(J.eagerness!==void 0)Q.eagerness=J.eagerness}else{if(J.threshold!==void 0)Q.threshold=J.threshold;if(J.prefixPaddingMs!==void 0)Q.prefix_padding_ms=J.prefixPaddingMs;if(J.silenceDurationMs!==void 0)Q.silence_duration_ms=J.silenceDurationMs;if(J.idleTimeoutMs!==void 0)Q.idle_timeout_ms=J.idleTimeoutMs}return Q}function CJ(J){let Q=Number(J?.input_tokens??0),$=Number(J?.output_tokens??0),Z={inputTokens:Q,outputTokens:$,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 G=W?.cached_tokens_details?.audio_tokens;if(typeof G==="number")Z.cachedAudioInputTokens=G;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,Q={}){super(J.message,{cause:Q.cause});if(this.name="RealtimeRequestError",this.code=J.code,this.retryable=J.retryable,Q.status!==void 0)this.status=Q.status}}var N8=60;class $J{model;target;options;constructor(J,Q){this.target=J,this.options=Q,this.model=Q.model}url(J){return`${this.target.base}/realtime${J}${this.target.query}`}sidebandUrl(J){let Q=this.target.base.replace(/^http(s?):/i,(Z,W)=>`ws${W}:`),$=this.target.query?`${this.target.query}&`:"?";return`${Q}/realtime${$}call_id=${encodeURIComponent(J)}`}async createCall(J){let Q=J.flow??this.options.callFlow??"unified",$,Z;if(Q==="ephemeral")$={authorization:`Bearer ${(await this.clientSecret({session:J.session,ttlSeconds:N8,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(SJ(J.session??{},this.model))),$=await this.target.headers(),Z=V}if(J.safetyIdentifier)$["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:$,body:Z},J.signal),G=await K.text(),Y=L8(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:G,callId:Y}}async clientSecret(J={}){let Q=J.ttlSeconds??F8;if(!Number.isInteger(Q)||Q<v$||Q>h$)throw RangeError(`ttlSeconds must be a whole number from ${v$} to ${h$}, got ${Q}.`);let $={...await this.target.headers(),"content-type":"application/json"};if(J.safetyIdentifier)$["OpenAI-Safety-Identifier"]=J.safetyIdentifier;let W=await(await this.request(this.url("/client_secrets"),{method:"POST",headers:$,body:JSON.stringify({expires_after:{anchor:"created_at",seconds:Q},session:SJ(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,Q={}){try{await this.request(this.url(`/calls/${encodeURIComponent(J)}/hangup`),{method:"POST",headers:await this.target.headers()},Q.signal)}catch($){if(c$($,J))return;throw $}}sideband(J,Q={}){return new _J({...Q,callId:J,url:this.sidebandUrl(J),headers:this.target.headers,webSocket:Q.webSocket??this.options.webSocket,hangup:()=>this.hangup(J)})}async request(J,Q,$){try{return await c(J,Q,{maxRetries:this.target.maxRetries,timeoutMs:this.target.timeoutMs,retryTimeouts:!1,signal:$,fetchImpl:this.options.fetchImpl})}catch(Z){if($?.aborted)throw Z;throw new v(k(Z),{cause:Z,...Z instanceof w?{status:Z.status}:{}})}}}function c$(J,Q){if(!(J instanceof v)||J.status!==404)return!1;let $=J.cause instanceof w?J.cause.body:void 0,Z=$?.error??$,W=String(Z?.code??"").toLowerCase(),K=String(Z?.message??"").toLowerCase();if(W.includes("call"))return!0;if(K.includes(Q.toLowerCase()))return!0;return/\bcall\b/.test(K)&&/not (be )?found|does not exist|no longer|ended/.test(K)}function L8(J){let Q=J.headers.get("location");if(!Q)return;let $=Q.split("?")[0].replace(/\/+$/,""),Z=$.slice($.lastIndexOf("/")+1);return Z?decodeURIComponent(Z):void 0}function DQ(J,Q){let{capabilities:$}=Q,Z={model:Q.model,input:M8(J.messages,$,J.tools),stream:!0};if(J.systemPrompt)Z.instructions=J.systemPrompt;let W=x8(J.tools,$);if(W.length>0){if(Z.tools=W,!$.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&&$.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 M8(J,Q,$){let Z=[],W=new Map;if(Q.toolSearch){for(let K of $??[])if(AJ(K))W.set(K.name,K)}for(let K of J){let G=K.role,Y=[],V=()=>{if(Y.length===0)return;Z.push({type:"message",role:G,content:Y}),Y=[]};for(let X of K.content??[])switch(X.type){case"text":{if(!X.text)break;Y.push(n(G,X.text));break}case"output":{if(X.partial)break;Y.push(n(G,JSON.stringify(X.value)));break}case"file":{if(G==="assistant")break;let H=S8(X);if(!Q.fileInput){if(H)Y.push(n(G,zQ(X,!1)));break}if(X.fileId?.startsWith(m))throw Error(`FilePart.fileId holds a gemi attachment id (${X.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(!X.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(X.providerRejected){if(H)Y.push(n(G,zQ(X,!1)));Y.push(n(G,$Q(X.name)));break}if(H)Y.push(n(G,zQ(X,!!X.fileId)));if(X.fileId)Y.push(A8(X));break}case"reasoning":{V();let H=T8(X);if(H)Z.push(H);break}case"tool-call":{if(X.partial)break;if(V(),Q.toolSearch&&Array.isArray(X.toolSearches))for(let B of X.toolSearches)Z.push(...E8(B,$??[]));let H={type:"function_call",call_id:X.toolCallId,name:String(X.name),arguments:JSON.stringify(X.input??{})};if(X.namespace&&W.has(X.namespace))H.namespace=X.namespace;Z.push(H);break}case"tool-result":{V(),Z.push({type:"function_call_output",call_id:X.toolCallId,output:j8(X)});break}}V()}return _8(Z)}var C8="No result was recorded for this tool call. Assume it did not complete.";function _8(J){let Q=new Set,$=new Set,Z=[];for(let K of J){if(K.type==="function_call"){let G=String(K.call_id);if(Q.has(G))continue;Q.add(G)}else if(K.type==="function_call_output"){let G=String(K.call_id);if(!Q.has(G)||$.has(G))continue;$.add(G)}Z.push(K)}if($.size===Q.size)return Z;let W=[];for(let K of Z){if(W.push(K),K.type!=="function_call")continue;let G=String(K.call_id);if($.has(G))continue;$.add(G),W.push({type:"function_call_output",call_id:G,output:C8})}return W}function n(J,Q){return{type:J==="assistant"?"output_text":"input_text",text:Q}}function S8(J){let Q=J.attachmentId;return typeof Q==="string"&&Q.startsWith(m)?Q:void 0}function zQ(J,Q){let $=[`id=${JSON.stringify(J.attachmentId)}`];if(J.name)$.push(`name=${JSON.stringify(J.name)}`);if(J.mimeType)$.push(`mimeType=${JSON.stringify(J.mimeType)}`);let Z=`attachment ${$.join(" ")}`;return Q?`[${Z}]`:`[${Z} \u2014 its contents are not shown to you; a tool can read the file by this id]`}function A8(J){let Q=J.mimeType?.trim().toLowerCase()??"";return{type:(Q?Q.startsWith("image/")&&Q!=="image/svg+xml":k8(J.name))?"input_image":"input_file",file_id:J.fileId}}function k8(J){let Q=/\.([a-z0-9]+)$/.exec(J?.trim().toLowerCase()??"");return Q?.[1]!==void 0&&R8.has(Q[1])}var R8=new Set(["jpeg","jpg","png","gif","webp"]);function T8(J){if(!J.id)return null;let Q={type:"reasoning",id:J.id};return Q.summary=J.text?[{type:"summary_text",text:J.text}]:[],Q}function j8(J){if(J.status==="ok")return typeof J.output==="string"?J.output:JSON.stringify(J.output??null);if(J.status==="running"){let Q=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.${Q}`}if(J.status==="denied"){let Q=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.${Q}`;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.${Q}`;return`The user declined this tool call, so it did not run.${Q}`}return`The tool call failed and produced no result. Error (${J.error?.code??"unknown"}): ${J.error?.message??"no message"}`}function E8(J,Q){let $=new Set(m$(J?.loaded)),Z=m$(J?.namespaces),W=new Set(Z),K=[];for(let Y of Q)if(AJ(Y)){if(!W.has(Y.name))continue;let V=Y.tools.filter((X)=>$.size===0||$.has(X.name));if(V.length===0)continue;K.push({type:"namespace",name:Y.name,description:Y.description,tools:V.map((X)=>o(X,!0))})}else if(Y.deferred&&$.has(Y.name))K.push(o(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:[...$]}},{type:"tool_search_output",call_id:null,execution:"server",status:"completed",tools:K}]}function m$(J){return Array.isArray(J)?J.filter((Q)=>typeof Q==="string"):[]}function AJ(J){return Array.isArray(J.tools)}function x8(J,Q){if(!J||J.length===0)return[];if(!Q.toolSearch){let W=[];for(let K of J)if(AJ(K))for(let G of K.tools)W.push(o(G,!1));else W.push(o(K,!1));return W}let $=[],Z=!1;for(let W of J)if(AJ(W)){let K=W.tools.map((G)=>{if(G.deferred)Z=!0;return o(G,!0)});$.push({type:"namespace",name:W.name,description:W.description,tools:K})}else{if(W.deferred)Z=!0;$.push(o(W,!0))}if(Z)$.push({type:"tool_search"});return $}function o(J,Q){let $={type:"function",name:J.name,description:J.description,parameters:J.parameters,strict:J.strict};if(Q&&J.deferred)$.defer_loading=!0;return $}class a{static models(){return[]}normalizeError(J){return k(J)}}var p$=["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 BQ extends a{model;capabilities;config;constructor(J,Q={}){super();this.model=J,this.capabilities=VQ(J),this.config=Q}static model(J,Q){return new BQ(J,Q)}static models(){return p$}stream(J){let Q=DQ(J,{model:this.model,capabilities:this.capabilities});return XQ(this.endpoint(),Q,{signal:J.signal,structuredOutput:Boolean(J.output),files:QQ(J.messages)})}upload(J){return YQ(this.endpoint(),J)}endpoint(){return GQ(JJ(this.config))}get realtime(){return new $J(JJ(this.config,{timeoutMs:HQ}),{model:this.model})}}class FQ extends a{model;capabilities;config;constructor(J,Q={}){super();this.model=J,this.capabilities=VQ(J),this.config=Q}static model(J,Q){return new FQ(J,Q)}static models(){return p$}stream(J){let Q=DQ(J,{model:this.deployment(),capabilities:this.capabilities});return XQ(this.endpoint(),Q,{signal:J.signal,structuredOutput:Boolean(J.output),files:QQ(J.messages)})}upload(J){return YQ(this.endpoint(),J,"assistants")}deployment(){return this.config.deployment??this.model}endpoint(){return GQ(QJ(this.config))}get realtime(){return new $J(U$(this.config,{timeoutMs:HQ}),{model:this.deployment(),callFlow:"ephemeral"})}}class kJ{now;entries=new Map;constructor(J=Date.now){this.now=J}allow(J,Q){let $=this.entries.get(J);if($?.openUntil===void 0)return!0;let Z=this.now();if(Z<$.openUntil)return!1;if($.probeUntil!==void 0&&Z<$.probeUntil)return!1;return $.probeUntil=Z+Q.cooldownMs,!0}record(J,Q,$){let Z=this.entries.get(J)??{failures:0},W=Z.openUntil!==void 0;if(Q==="success")return this.entries.delete(J),W?"closed":void 0;if(Q==="none"){delete Z.probeUntil;return}if(Z.failures+=1,this.entries.set(J,Z),W||Z.failures>=$.failures)return Z.openUntil=this.now()+$.cooldownMs,delete Z.probeUntil,W?void 0:"open";return}state(J){let Q=this.entries.get(J);if(Q?.openUntil===void 0)return"closed";return this.now()<Q.openUntil?"open":"half-open"}}var l$=Symbol("timed-out");class ZJ extends a{model;capabilities;entries;options;circuit;constructor(J,Q={}){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($){let Z=$.failures??3,W=$.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=PQ(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 G=$.store??new kJ;this.options={...Q,circuit:{...$,store:G}},this.circuit={policy:{failures:Z,cooldownMs:W},store:G,...$.onStateChange?{onStateChange:$.onStateChange}:{}}}else this.options=Q,this.circuit=void 0;this.model=J[0].provider.model,this.capabilities=q8(J.map((Z)=>Z.provider.capabilities))}static chain(J,Q){return new ZJ(J,Q)}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 ZJ(this.entries.slice(J),this.options)}leg(J){let Q=this.from(J).entries[0];return new ZJ([Q],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],G=W===this.entries.length-1,Y=K.provider.model;if(this.circuit&&!G&&!await this.allow(K))continue;Z+=1;let V=!1,X=async(M)=>{if(V)return;V=!0,await this.record(W,K,M)},H=new AbortController,B=()=>H.abort($?.reason);if($?.aborted)H.abort($.reason);else $?.addEventListener("abort",B,{once:!0});let z=[],D=!1,U=!1,P,O,F,N=!1,L,R=!1,S=(M)=>{let T=Q?E(E(j(),Q),M.usage):M.usage;return Q=void 0,{...M,usage:T}};try{L=K.provider.stream({...J,...K.reasoning!==void 0?{reasoning:K.reasoning}:{},signal:H.signal})[Symbol.asyncIterator]();let M=!0;for(;;){let T=M&&K.timeoutMs!==void 0?await I8(L.next(),K.timeoutMs):await L.next();if(T===l$){N=!0,F={error:{code:"provider_error",message:`${Y} sent nothing within ${K.timeoutMs}ms.`,retryable:!0}};break}if(M=!1,T.done){R=!0;break}let C=T.value;if(C.type==="finish"&&C.model)O=C.model;if(D){if(C.type==="finish")P=E(P??j(),C.usage),U=!0,yield S(C);else{if(C.type==="error")F={error:C.error};yield C}continue}if(MJ(C)){D=!0,await X("success"),yield*z.splice(0),yield C;continue}if(C.type==="error")F={error:C.error,...C.status!==void 0?{status:C.status}:{},...C.requestId!==void 0?{requestId:C.requestId}:{}};else if(C.type==="finish"){if(P=E(P??j(),C.usage),C.reason==="error"&&!F)F={error:{code:"provider_error",message:`${Y} ended the call with an error and did not say which.`,retryable:!1}}}z.push(C)}}catch(M){let T=K.provider.normalizeError(M);if(D){if(T.code!=="aborted")yield{type:"error",error:T,...i(M)};this.report({index:W,model:Y,responseModel:O,attempt:Z,usage:P,outcome:OQ(T),error:T}),yield S({type:"finish",reason:T.code==="aborted"?"aborted":"error",usage:j(),...O?{model:O}:{}});return}F={error:T,...i(M)}}finally{if($?.removeEventListener("abort",B),!R)H.abort(),L?.return?.()?.catch(()=>{})}if(D){if(!U&&Q)yield{type:"finish",reason:F?"error":"stop",usage:Q},Q=void 0;this.report({index:W,model:Y,responseModel:O,attempt:Z,usage:P,outcome:F?OQ(F.error):"ok",...F?{error:F.error}:{}});return}if($?.aborted){await X("none"),this.report({index:W,model:Y,responseModel:O,attempt:Z,usage:P,outcome:"aborted"}),yield S({type:"finish",reason:"aborted",usage:P??j(),...O?{model:O}:{}});return}if(!F){await X("success"),this.report({index:W,model:Y,responseModel:O,attempt:Z,usage:P,outcome:"ok"});for(let M of z)yield M.type==="finish"?S(M):M;return}let q=!G&&F.error.code!=="aborted"&&this.shouldFallBack(F.error,{index:W,model:Y,timedOut:N,...F.status!==void 0?{status:F.status}:{},...F.requestId!==void 0?{requestId:F.requestId}:{}});if(await X(q?"failure":"none"),this.report({index:W,model:Y,responseModel:O,attempt:Z,usage:P,outcome:q?"fallback":OQ(F.error),error:F.error}),q){if(P)Q=E(Q??j(),P);continue}let I=!1,f;for(let M of z){if(M.type==="finish"){f=M;continue}if(M.type==="error")I=!0;yield M}if(!I&&F.error.code!=="aborted")yield{type:"error",error:F.error,...F.status!==void 0?{status:F.status}:{},...F.requestId!==void 0?{requestId:F.requestId}:{}};yield S({type:"finish",reason:F.error.code==="aborted"?"aborted":f?.reason??"error",usage:P??j(),...O?{model:O}:{}});return}}async allow(J){if(!this.circuit)return!0;try{return await this.circuit.store.allow(PQ(J),this.circuit.policy)}catch{return!0}}async record(J,Q,$){if(!this.circuit)return;let Z=PQ(Q),W;try{W=await this.circuit.store.record(Z,$,this.circuit.policy)}catch{return}if(!W)return;try{this.circuit.onStateChange?.({index:J,model:Q.provider.model,key:Z,state:W})}catch{}}shouldFallBack(J,Q){let $=this.options.fallbackOn??((Z)=>Z.retryable);try{return $(J,Q)}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 PQ(J){return J.circuitKey??J.provider.model}function OQ(J){return J.code==="aborted"?"aborted":"failed"}function q8(J){return{reasoning:J.every((Q)=>Q.reasoning),structuredOutput:J.every((Q)=>Q.structuredOutput),fileInput:J.every((Q)=>Q.fileInput),parallelToolCalls:J.every((Q)=>Q.parallelToolCalls),toolSearch:J.every((Q)=>Q.toolSearch)}}function I8(J,Q){let $,Z=new Promise((W)=>{$=setTimeout(()=>W(l$),Q)});return Promise.race([J,Z]).finally(()=>clearTimeout($))}async function w8(J,Q,$={}){let Z=$.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 G=J.leg(K),Y={index:K,model:G.model,results:[],errors:[]};for(let V=0;V<Z;V++)try{Y.results.push(await Q(G,{index:K,sample:V}))}catch(X){Y.errors.push({sample:V,error:X})}W.push(Y)}return W}class TJ extends Error{line;constructor(J){super(J??"Voice session ended by the app.");this.name="VoiceHangup",this.line=J}}var KJ="ask_agent",b8={maxDurationMs:900000,idleTimeoutMs:120000,maxQueued:3,progressIntervalMs:4000,closingLineMs:1e4,tickMs:60000,hangupGraceMs:30000,toolTimeoutMs:60000,maxToolCallsPerMinute:20,toolOutputChars:8000},f8={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 WJ(J={}){return[{name:J.name??KJ,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 RJ=new Map;class p{sessionId;threadId;callId;ended;params;sideband;hangupCall;limits;lines;delegateName;startedAt=Date.now();body;usage=j();transcription={usage:j(),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 p(J)}static get(J){return RJ.get(J)}static async endAll(J){await Promise.all([...RJ.values()].map((Q)=>Q.end("hangup",J)))}constructor(J){this.params=J,this.sessionId=J.sessionId??crypto.randomUUID(),this.threadId=J.threadId,this.body=J.body??{},this.limits={...b8,...d$(J.limits)},this.lines={...f8,...d$(J.lines)},this.delegateName=J.delegate?.name??KJ;let Q=new Set(WJ(J.delegate).map(($)=>$.name));for(let $ of J.tools??[]){if(Q.has($.tool.name)||this.toolHandlers.has($.tool.name))throw Error(`VoiceBridge: two tools are named "${$.tool.name}".`);this.toolHandlers.set($.tool.name,$)}if("realtime"in J.call){let{realtime:$,callId:Z}=J.call;this.callId=Z,this.sideband=$.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(($)=>this.resolveEnded=$),RJ.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 Q=this.params.contextNote?.(J);if(Q)this.sideband.addNote(Q)}end(J="hangup",Q){return this.ending??=this.finish(J,Q??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 Q=J.usage;if(Q){this.usage=E(this.usage,Q);let $=this.info();this.hook(()=>this.params.onUsage?.(Q,$))}return}case"conversation.item.input_audio_transcription.completed":{let Q=J;if(this.say("user",String(Q.transcript??"")),Q.transcriptionUsage||Q.transcriptionSeconds!==void 0){this.transcription={usage:Q.transcriptionUsage?E(this.transcription.usage,Q.transcriptionUsage):this.transcription.usage,seconds:this.transcription.seconds+(Q.transcriptionSeconds??0)};let $=this.info(),Z={...Q.transcriptionUsage?{usage:Q.transcriptionUsage}:{},...Q.transcriptionSeconds!==void 0?{seconds:Q.transcriptionSeconds}:{}};this.hook(()=>this.params.onTranscriptionUsage?.(Z,$))}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 Q=J;if(this.touch(),!this.ending)this.call(Q.call_id,Q.name,Q.arguments);return}case"session.updated":if(this.tampered(J.session))this.end("session_tampered",null);return;case"error":{let Q=J.error;if(this.errors.push({code:Q?.code,message:String(Q?.message??"")}),this.pendingCreate&&Q?.event_id===this.pendingCreate)if(this.pendingCreate=void 0,Q.code==="conversation_already_has_active_response")this.responseActive=!0,this.responseWanted=!0;else this.responseActive=!1;return}case"sideband.closed":{let Q=J;if(!this.ending&&!Q.byClient)this.end(Q.code===1000?"call_ended":"sideband_lost",null);return}}}say(J,Q){if(Q.trim())this.transcript.push({role:J,text:Q,at:Date.now()})}call(J,Q,$){let Z=v8($);if(Q===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(Q);if(W)return void this.runTool(J,W,Z);switch(Q){case"stop_work":{let K=this.running;if(K)K.stopRequested=!0,K.handle?.stop({reason:"Stopped by voice."});let G=this.dropQueue();return this.answer(J,{stopped:Boolean(K),dropped:G})}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:"",G=typeof Z.approve==="boolean"?Z.approve:void 0,Y=this.pending.map((V)=>h8(V,K,G));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 ${Q}.`})}}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 Q=new Set;await this.waitForThread(Q);let $=await this.latestBody();while(!J.stopRequested&&await this.waitForThread(Q));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:$,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(Q){J.record.status="done",this.complete(J,{status:"failed",message:Q instanceof Error?Q.message:"The work failed."})}finally{this.running=void 0,this.flushNote();let Q=this.queue.shift();if(Q&&!this.ending)this.run(Q);else this.touch()}}async runTool(J,Q,$){let Z=Q.tool.name,W=Date.now();if(this.toolCallTimes=this.toolCallTimes.filter((B)=>W-B<60000),this.toolCallTimes.length>=this.limits.maxToolCallsPerMinute){let B={name:Z,status:"busy"};this.toolCalls.push(B),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 G=new AbortController,Y=Q.timeoutMs??this.limits.toolTimeoutMs,V,X;try{let B=await Promise.race([Q.run($,{sessionId:this.sessionId,signal:G.signal}),new Promise((z,D)=>{V=setTimeout(()=>{D(new g(`"${Z}" took longer than ${Math.round(Y/1000)} s.`)),G.abort()},Y)})]);K.status="done",X={status:"done",output:this.clip(B)}}catch(B){if(B instanceof TJ){K.status="refused",K.message=B.message,this.end("usage",B.line??null);return}let z=B instanceof g?B.message:"The tool failed.";if(!(B instanceof g))console.error(`[gemi/ai] the voice tool "${Z}" threw.`,B);K.status="failed",K.message=z,X={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,X)}clip(J){let Q;try{Q=JSON.stringify(J)}catch{return String(J)}if(Q===void 0||Q.length<=this.limits.toolOutputChars)return J;return`${Q.slice(0,this.limits.toolOutputChars)}\u2026 (cut: ${Q.length} characters in all)`}async waitForThread(J=new Set){let Q=this.params.liveRuns;if(!Q)return!1;let $=await Q.find({threadId:this.threadId}),Z=$&&!J.has($.runId)?Q.get($.runId):null;if(!$||!Z)return!1;return J.add($.runId),await Z.result().catch(()=>{return}),!0}async latestBody(){let J=this.params.store;if(!J)return this.body;let Q=await J.get(this.sessionId).catch(()=>null);if(Q)this.body=Q.body;return this.body}async follow(J){let Q=this.params.progress??y8();try{for await(let $ of J.run){let Z=Q($);if(Z)this.note(Z)}}catch{}}complete(J,Q){if(this.ending)return;if(J.callId)this.sideband.functionOutput(J.callId,Q),J.callId=void 0;else this.sideband.addNote(`Update on the earlier request "${J.record.request}": ${JSON.stringify(Q)}`);this.respond()}answer(J,Q){this.sideband.functionOutput(J,Q),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 Q of J)Q.record.status="dropped";return J.length}note(J){if(J===this.lastProgress)return;this.lastProgress=J;let Q=this.lastNoteAt+this.limits.progressIntervalMs-Date.now();if(Q<=0)return this.flushNote();this.noteTimer??=setTimeout(()=>this.flushNote(),Q)}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(Q){if(Q instanceof TJ)this.end("usage",Q.line??null);else console.error("[gemi/ai] a voice hook threw; ending the call.",Q),this.end("error",this.lines.error)}})}tampered(J){let Q=this.params.session;if(!Q||!J)return!1;if(Q.instructions!==void 0&&J.instructions!==void 0&&J.instructions!==Q.instructions)return!0;if(Array.isArray(J.tools)){let $=new Set([...WJ(this.params.delegate),...Q.tools??[]].map((W)=>W.name)),Z=new Set(J.tools.map((W)=>String(W?.name)));if($.size!==Z.size||[...$].some((W)=>!Z.has(W)))return!0}return!1}async finish(J,Q){for(let G of this.timers)clearTimeout(G);if(this.idleTimer)clearTimeout(this.idleTimer);if(this.noteTimer)clearTimeout(this.noteTimer);if(this.tickTimer)clearInterval(this.tickTimer);if(this.dropQueue(),Q&&(J!=="call_ended"&&J!=="sideband_lost"))await this.closingLine(Q);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};RJ.delete(this.sessionId),await this.params.store?.update(this.sessionId,{endedAt:Z,endReason:J}).catch(()=>{return});try{await this.params.onEnd?.(K)}catch(G){console.error("[gemi/ai] a voice session's onEnd threw.",G)}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 Q;await Promise.race([this.sideband.closed,new Promise(($)=>Q=setTimeout($,this.limits.hangupGraceMs))]),clearTimeout(Q),this.sideband.close()}}async closingLine(J){await new Promise((Q)=>{let $=`gemi_voice_closing_${crypto.randomUUID()}`,Z=`gemi_voice_cancel_${crypto.randomUUID()}`,W=this.responseActive?"cancelling":"asked",K,G=setTimeout(Y,this.limits.closingLineMs);function Y(){clearTimeout(G),Q()}let V=()=>{W="asked",this.sideband.send({type:"response.create",event_id:$,response:{instructions:`Say exactly this to the user, and nothing else: "${J}"`,tool_choice:"none"}})};if(this.closingWaiter=(X)=>{let H=X;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===$)return Y();if(H.type==="response.created"&&!K){K=H.response?.id;return}let B=(z)=>!K||!z||z===K;if(H.type==="response.done"&&B(H.response?.id))W="playing";else if(H.type==="output_audio_buffer.stopped"&&W==="playing"&&B(H.response_id))Y()},W==="cancelling")this.sideband.send({type:"response.cancel",event_id:Z});else V()}),this.closingWaiter=void 0}}function d$(J){if(!J)return{};return Object.fromEntries(Object.entries(J).filter(([,Q])=>Q!==void 0))}function v8(J){try{let Q=JSON.parse(J);return Q&&typeof Q==="object"&&!Array.isArray(Q)?Q:{}}catch{return{}}}function h8(J,Q,$){let Z={toolCallId:J.toolCallId,signature:J.signature,...J.path?{path:J.path}:{}};if(J.kind==="question")return{...Z,output:Q};if(J.kind==="approval")return{...Z,approve:$===!0,...Q?{reason:Q}:{}};return{...Z,approve:!1,reason:"Not available in a voice call."}}function y8(){let J=new Set;return(Q)=>{if(Q.type==="tool-call"){if(Q.part.partial||Q.resent||J.has(Q.part.toolCallId))return;return J.add(Q.part.toolCallId),`running ${String(Q.part.name)}`}if(Q.type==="tool-progress"){let $=Q.data;if(typeof $==="string")return $;if($&&typeof $==="object")for(let Z of["message","label","title"]){let W=$[Z];if(typeof W==="string"&&W)return W}}return}}var i$="http://gemi.internal/__gemi__/voice/mcp";async function UQ(J,Q){if(!Q.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:$}=J,Z=J.scopes??$.scopes().map((G)=>G.name),W=(G)=>({kind:"remote",req:G,principal:{user:Q.user,via:"voice",id:`voice:${Q.sessionId}`,scopes:Z}});return(await $.available(W(n$()),J.filter)).filter((G)=>!G.requiresApproval).map((G)=>({tool:{name:G.name,description:G.description,parameters:G.inputSchema},...J.timeoutMs!==void 0?{timeoutMs:J.timeoutMs}:{},run:(Y,V)=>{let X=n$();return y.run(X,async()=>{return await J.authorize?.({name:G.name,input:Y,sessionId:V.sessionId}),$.execute(W(X),G.name,Y,void 0,{signal:V.signal})},{user:Q.user})}}))}function n$(){return new x(new Request(i$,{method:"POST"}),{},"api",new URL(i$).pathname)}class NQ{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 Q=this.records.get(J);return Q?structuredClone(Q):null}async update(J,Q){let $=this.records.get(J);if(!$)return;this.records.set(J,{...$,...structuredClone(Q),id:J})}sweep(){let J=Date.now()-this.retainEndedMs;for(let[Q,$]of this.records)if($.endedAt!==void 0&&$.endedAt<J)this.records.delete(Q)}}var LQ=new NQ;class s extends Error{runId;requested;oldest;code="frame_cursor_evicted";constructor(J,Q,$){super(`Frame ${Q} of run ${J} has been evicted; the oldest frame still buffered is ${$}. Reload the thread instead of resuming.`);this.runId=J;this.requested=Q;this.oldest=$}}class GJ extends Error{runId;code="live_run_not_found";constructor(J){super(`No live run ${J} in this process.`);this.runId=J}}class jJ{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,Q={}){let $={run:J,threadId:Q.threadId,owner:Q.owner??null,clientRunId:Q.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(Q.threadId,J.runId);if(Q.clientRunId)this.byClientRun.set(Q.clientRunId,J.runId);return this.scheduleExpiry($,Q.maxRunDurationMs),this.pump($,Q)}findByClientRunId(J){let Q=this.byClientRun.get(J);return Q&&this.runs.has(Q)?Q:null}async find(J){let Q=this.byThread.get(J.threadId);if(!Q)return null;let $=this.runs.get(Q);if(!$)return null;return{runId:Q,seq:$.lastSeq}}get(J){return this.runs.get(J)?.run??null}ownerOf(J){return this.runs.get(J)?.owner??null}mayAccess(J,Q){let $=this.ownerOf(J);return $===null||$===Q}isRunning(J){let Q=this.runs.get(J);return!!Q&&!Q.ended&&!Q.evicted}replay(J,Q){let $=this.runs.get(J);if(!$)throw new GJ(J);if(Q!==void 0&&Q<$.lostBefore)throw new s(J,Q,$.lostBefore);let Z=$.frames[0]?.seq;return this.drain($,J,Q??Z??$.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,Q){let $=Promise.resolve();try{for await(let Z of J.run.frames()){if(J.evicted){let K=Q.onEvent;if(K)$=$.then(()=>K(Z.event)).catch((G)=>MQ(Q,G));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=Q.onEvent;if(W)$=$.then(()=>W(Z.event)).catch((K)=>MQ(Q,K))}}catch(Z){MQ(Q,Z)}finally{if(J.ended=!0,J.expireAt)clearTimeout(J.expireAt),J.expireAt=null;this.notify(J),this.scheduleEviction(J),await $}}async*drain(J,Q,$){let Z=$;while(!0){let W=J.version;for(;;){if(Z<J.lostBefore)throw new s(Q,Z,J.lostBefore);let K=J.frames,G=K[0]?.seq;if(G===void 0)break;let Y=Math.max(0,Z-G);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,Q){if(J.version!==Q)return Promise.resolve();return new Promise(($)=>J.wake.add($))}notify(J){J.version++;let Q=Array.from(J.wake);J.wake.clear();for(let $ of Q)$()}scheduleEviction(J){if(J.evictAt)return;let Q=setTimeout(()=>{let $=J.run.runId;if(!J.ended)J.evicted=!0,J.frames=[];if(this.runs.get($)===J)this.runs.delete($);if(J.threadId&&this.byThread.get(J.threadId)===$)this.byThread.delete(J.threadId);if(J.clientRunId&&this.byClientRun.get(J.clientRunId)===$)this.byClientRun.delete(J.clientRunId);this.notify(J)},this.ttlMs);Q.unref?.(),J.evictAt=Q}scheduleExpiry(J,Q){if(this.maxAgeMs===null||Q===null)return;let $=Q===void 0?this.maxAgeMs:Math.max(this.maxAgeMs,Q+this.ttlMs);if(!Number.isFinite($)||$>2147483647)return;let Z=setTimeout(()=>{if(J.expireAt=null,J.ended)return;try{J.run.stop({reason:`The run was still going ${Math.round($/1000)}s after it started, past the live-run registry's age limit.`})}catch{}this.scheduleEviction(J)},$);Z.unref?.(),J.expireAt=Z}}var CQ=new jJ;function MQ(J,Q){try{J.onInternalError?.(Q)}catch{}}class EJ{maxEntries;records=new Map;constructor(J=1e5){this.maxEntries=J}async record(J,Q){if(this.records.has(J))return;this.records.set(J,{...Q});while(this.records.size>this.maxEntries){let $=this.records.keys().next().value;if($===void 0)break;this.records.delete($)}}async get(J){let Q=this.records.get(J);return Q?{...Q}:null}}var _Q=new EJ;class kQ{now;receipts=new Map;sweepAt=1024;constructor(J=Date.now){this.now=J}async claim(J,Q){let $=this.now();if(this.receipts.size>=this.sweepAt)this.sweep($);let Z=this.receipts.get(J);if(Z&&Z.expiresAt>$)return Z.result?{status:"replay",result:structuredClone(Z.result)}:{status:"blocked"};return this.receipts.set(J,{expiresAt:Q}),{status:"claimed"}}async complete(J,Q,$){this.receipts.set(J,{result:structuredClone(Q),expiresAt:$})}async release(J){let Q=this.receipts.get(J);if(Q&&!Q.result)this.receipts.delete(J)}get size(){return this.receipts.size}sweep(J){for(let[Q,$]of this.receipts)if($.expiresAt<=J)this.receipts.delete(Q);this.sweepAt=Math.max(1024,this.receipts.size*2)}}var o$="pending",SQ="done:",g8=`
|
|
146
146
|
if redis.call('SET', KEYS[1], ARGV[1], 'PX', ARGV[2], 'NX') then return 'claimed' end
|
|
147
147
|
local held = redis.call('GET', KEYS[1])
|
|
148
148
|
if not held then return ARGV[1] end
|
|
149
|
-
return held`,
|
|
149
|
+
return held`,u8=`
|
|
150
150
|
if redis.call('GET', KEYS[1]) == ARGV[1] then return redis.call('DEL', KEYS[1]) end
|
|
151
|
-
return 0`;class SQ{injectedClient;prefix;constructor(J={}){this.injectedClient=J.client,this.prefix=J.prefix??"gemi:ai:receipt"}async claim(J,Q){let $=await this.client.send("EVAL",[y8,"1",this.key(J),d$,i$(Q)]);if($==="claimed")return{status:"claimed"};let Z=String($??"");if(Z.startsWith(MQ))return{status:"replay",result:JSON.parse(Z.slice(MQ.length))};return{status:"blocked"}}async complete(J,Q,$){await this.client.send("SET",[this.key(J),MQ+JSON.stringify(Q),"PX",i$($)])}async release(J){await this.client.send("EVAL",[g8,"1",this.key(J),d$])}key(J){return`${this.prefix}:${J}`}get client(){if(this.injectedClient)return this.injectedClient;let J=n$(),Q=J.bound(CQ)?J.make(CQ).client:void 0;if(!Q)throw Error("RedisReceiptStore could not reach the Redis client. Register RedisServiceProvider on your application, or pass a client: new RedisReceiptStore({ client }).");return Q}}function i$(J){return String(Math.max(1,Math.ceil(J-Date.now())))}var u8=86400000,c8=60000;class jJ{ttlMs;clientOwnedIds;threads=new Map;lastSweep=0;constructor(J={}){this.ttlMs=J.ttlMs??u8,this.clientOwnedIds=J.clientOwnedIds??!1}async createThread(J){let Q=crypto.randomUUID();return this.threads.set(Q,{messages:[],touchedAt:Date.now()}),this.sweep(),{threadId:Q}}async loadThread(J){this.sweep();let Q=this.threads.get(J);if(!Q)return this.clientOwnedIds?[]:null;return Q.touchedAt=Date.now(),Q.messages.slice()}async appendMessages(J,Q){this.sweep();let $=this.threads.get(J);if(!$){if(!this.clientOwnedIds)throw Error(`Thread ${J} does not exist here, or has expired.`);$={messages:[],touchedAt:Date.now()},this.threads.set(J,$)}for(let Z of Q){let W=$.messages.findIndex((K)=>K.id===Z.id);if(W===-1)$.messages.push(Z);else $.messages[W]=Z}$.touchedAt=Date.now()}async removeMessages(J,Q){this.sweep();let $=this.threads.get(J);if(!$)return;let Z=new Set(Q);$.messages=$.messages.filter((W)=>!Z.has(W.id)),$.touchedAt=Date.now()}async loadSummaries(J){return this.threads.get(J)?.summaries?.slice()??[]}async saveSummary(J,Q){let $=this.threads.get(J);if(!$)return;$.summaries=AQ($.summaries??[],Q)}delete(J){this.threads.delete(J)}get size(){return this.threads.size}sweep(J=Date.now()){if(J-this.lastSweep<c8)return;this.lastSweep=J;for(let[Q,$]of this.threads)if(J-$.touchedAt>this.ttlMs)this.threads.delete(Q)}}var kQ=new jJ;function t$(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 r$(J,Q,$=new Date().toISOString()){if(!(Q.event.type==="run-start"&&Q.event.runId!==J.cursorRunId)&&Q.seq<=J.seq)return J;return{...e$(J,Q.event,$),seq:Q.seq}}function e$(J,Q,$){switch(Q.type){case"run-start":return{...J,messages:m8(J.messages,Q.runId),runId:Q.runId,cursorRunId:Q.runId,threadId:Q.threadId??J.threadId,runMessageIds:[],loadedTools:[],finishReason:void 0,usage:void 0};case"message-start":return p(J,Q.messageId,$,(Z)=>({...Z,role:Q.role}));case"text-delta":if(a$(J,Q.messageId))return J;return p(J,Q.messageId,$,(Z)=>({...Z,content:n8(Z.content,Q.delta)}));case"reasoning-delta":if(a$(J,Q.messageId))return J;return p(J,Q.messageId,$,(Z)=>({...Z,content:o8(Z.content,Q.delta,Q.id)}));case"output-delta":return p(J,Q.messageId,$,(Z)=>({...Z,content:s$(Z.content,{type:"output",value:Q.snapshot,partial:!0},(W)=>W.type==="output")}));case"tool-call":return p(J,Q.messageId,$,(Z)=>{let W=Z.content.findIndex((D)=>D.type==="tool-call"&&D.toolCallId===Q.part.toolCallId),K=W===-1?void 0:Z.content[W],G=Q.part.progress??K?.progress,X=Q.part.nested??K?.nested,V=Q.part.attachments??K?.attachments,Y={...Q.part,...G?{progress:G}:{},...X?{nested:X}:{},...V?{attachments:V}:{}},H=Z.content.slice();if(W===-1)H.push(Y);else H[W]=Y;return{...Z,content:H}});case"tool-search":{let Z=Q.loaded.filter((W)=>!J.loadedTools.includes(W));if(Z.length===0)return J;return{...J,loadedTools:[...J.loadedTools,...Z]}}case"tool-progress":return o$(J,Q.toolCallId,(Z)=>({...Z,progress:[...Z.progress??[],Q.data]}));case"nested-event":{let Z=Q;return o$(J,Q.toolCallId,(W)=>{let K=W.nested??[],G=K.findIndex((H)=>H.runId===Z.runId),X=K[G]??{runId:Z.runId,agent:Z.agent,messages:[]},V=d8(X,Z,$),Y=G===-1?[...K,V]:K.map((H,D)=>D===G?V:H);return{...W,nested:Y}})}case"tool-result":{let Z=p(J,Q.messageId,$,(W)=>({...W,content:s$(W.content,Q.part,(K)=>K.type==="tool-result"&&K.toolCallId===Q.part.toolCallId)}));return{...Z,pending:Z.pending.filter((W)=>W.toolCallId!==Q.part.toolCallId)}}case"message":{let Z=J.messages.findIndex((G)=>G.id===Q.message.id),W=J.messages.slice();if(Z===-1)W.push(Q.message);else W[Z]=Q.message;let K=J.runMessageIds.includes(Q.message.id)?J.runMessageIds:[...J.runMessageIds,Q.message.id];return{...J,messages:W,runMessageIds:K}}case"message-id":{let Z=J.messages.findIndex((X)=>X.id===Q.localId);if(Z===-1){if(!Q.message||J.messages.some((X)=>X.id===Q.messageId))return J;return{...J,messages:[...J.messages,Q.message]}}let W=J.messages[Z],K={localId:W.localId??W.id,...W.metadata?{metadata:W.metadata}:{}},G=J.messages.some((X)=>X.id===Q.messageId)?J.messages.filter((X,V)=>V!==Z).map((X)=>X.id===Q.messageId?{...X,...K}:X):J.messages.map((X,V)=>V===Z?{...X,...K,id:Q.messageId}:X);return{...J,messages:G}}case"awaiting-input":return{...J,runId:Q.runId,pending:[...Q.pending]};case"message-end":return p(J,Q.messageId,$,(Z)=>({...Z,finishReason:Q.finishReason,...Q.outputTruncated?{outputTruncated:!0}:{},...Q.usage?{usage:Q.usage}:{},content:Q.outputTruncated||Q.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:Q.usage};case"error":return{...J,error:Q.error,pending:[]};case"run-end":return{...J,runId:void 0,finishReason:Q.finishReason,messages:J6(J,Q.finishReason)};default:return J}}function m8(J,Q){if(!J.some(($)=>$.runId===Q&&$.finishReason===void 0))return J;return J.map(($)=>{if($.runId!==Q||$.finishReason!==void 0)return $;let{runId:Z,...W}=$;return{...W,content:[]}})}function J6(J,Q){return J.messages.map(($)=>$.role==="assistant"&&J.runMessageIds.includes($.id)?p8($,Q):$)}function p8(J,Q){let $=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?l8(K,Q):K)}:W);if(J.finishReason===void 0)return{...J,finishReason:Q,content:$};return $.some((W,K)=>W!==J.content[K])?{...J,content:$}:J}function l8(J,Q){let $={messages:J.messages,pending:[],error:null,seq:-1,runMessageIds:J.messages.map((Z)=>Z.id),loadedTools:[]};return{...J,finishReason:Q,messages:J6($,Q)}}function o$(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===Q);if(K===-1)continue;if(W.finishReason!==void 0&&!i8(J,W,Q))return J;let G=W.content.slice();G[K]=$(G[K]);let X=J.messages.slice();X[Z]={...W,content:G};let V=J.runMessageIds.includes(W.id)?J.runMessageIds:[...J.runMessageIds,W.id];return{...J,runMessageIds:V,messages:X}}return J}function d8(J,Q,$){let Z={messages:J.messages,pending:[],error:null,seq:-1,runMessageIds:J.messages.map((K)=>K.id),loadedTools:[],finishReason:J.finishReason},W=e$(Z,Q.event,$);return{...J,...Q.label!==void 0?{label:Q.label}:{},messages:W.messages,...W.finishReason!==void 0?{finishReason:W.finishReason}:{},...W.usage!==void 0?{usage:W.usage}:{}}}function i8(J,Q,$){if(Q.finishReason!=="awaiting-input")return!1;return!J.messages.some((Z)=>Z.content.some((W)=>W.type==="tool-result"&&W.toolCallId===$))}function a$(J,Q){let $=J.messages.find((Z)=>Z.id===Q);return $!==void 0&&$.finishReason!==void 0}function p(J,Q,$,Z){let W=J.messages.findIndex((X)=>X.id===Q),K=J.runMessageIds.includes(Q)?J.runMessageIds:[...J.runMessageIds,Q];if(W===-1){let X={id:Q,role:"assistant",content:[],createdAt:$};return{...J,runMessageIds:K,messages:[...J.messages,Z(X)]}}let G=J.messages.slice();return G[W]=Z(G[W]),{...J,runMessageIds:K,messages:G}}function n8(J,Q){let $=J[J.length-1];if($&&$.type==="text")return[...J.slice(0,-1),{type:"text",text:$.text+Q}];return[...J,{type:"text",text:Q}]}function o8(J,Q,$){let Z=J[J.length-1];if(Z&&Z.type==="reasoning"&&Z.id===$)return[...J.slice(0,-1),{...Z,text:(Z.text??"")+Q}];return[...J,$?{type:"reasoning",id:$,text:Q}:{type:"reasoning",text:Q}]}function s$(J,Q,$){let Z=J.findIndex($);if(Z===-1)return[...J,Q];let W=J.slice();return W[Z]=Q,W}class TQ{store;threadId;report;chain=Promise.resolve();done=new Set;closed=!1;state;runId;constructor(J,Q,$,Z){this.store=J;this.threadId=Q;this.report=Z;this.state=t$({messages:$})}finish(J){if(this.closed)return;this.done.add(J.id),this.write(()=>[RQ(J)])}frame(J){if(this.closed)return;let Q=J.event;if(Q.type==="run-start")this.runId=Q.runId;switch(this.state=r$(this.state,J),Q.type){case"message":this.write(()=>[RQ(Q.message)]);return;case"tool-call":if(Q.part.partial)return;this.checkpoint(Q.messageId);return;case"message-start":case"tool-result":this.checkpoint(Q.messageId);return;default:return}}close(J=[]){this.closed=!0;for(let Q of J)this.done.add(Q.id)}settled(){return this.chain}checkpoint(J){if(this.done.has(J))return;let Q=this.state.messages.find((Z)=>Z.id===J);if(!Q)return;let $=this.runId;this.write(()=>{let Z=RQ(Q);if(Z.finishReason===void 0&&$)Z.runId=$;return[Z]})}write(J){let Q;try{Q=J()}catch($){this.report($);return}this.chain=this.chain.then(()=>this.store.appendMessages(this.threadId,Q)).catch(($)=>this.report($))}}function RQ(J){return structuredClone(J)}async function Q6(J,Q){let $=[],Z=null,W=J.slice();for(let K=0;K<W.length;K++){let G=W[K];if(G.role!=="assistant"||G.finishReason!==void 0)continue;if(G.runId&&await Q(G.runId))continue;Z??=new Set(J.flatMap((Y)=>Y.content.flatMap((H)=>H.type==="tool-result"?[H.toolCallId]:[])));let X=G.content.map((Y)=>Y.type==="tool-call"?$6(Y):Y);for(let Y of G.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"};X.push(H)}let V={...G,content:X,finishReason:"interrupted"};W[K]=V,$.push(V)}return{messages:W,settled:$}}function $6(J){let{partial:Q,...$}=J;if(!$.nested?.some((Z)=>Z.finishReason===void 0))return $;return{...$,nested:$.nested.map(a8)}}function a8(J){if(J.finishReason!==void 0)return J;return{...J,finishReason:"interrupted",messages:J.messages.map((Q)=>Q.role==="assistant"&&Q.finishReason===void 0?{...Q,finishReason:"interrupted",content:Q.content.map(($)=>$.type==="tool-call"?$6($):$)}:Q)}}var s8=50,t8=["running","ok","error"];async function K6(J,Q){let{store:$,threadId:Z}=Q,W=Math.max(s8,Q.scan??0),K=await $.listForThread(Z,{limit:W}),G,X=async(B)=>{if(B.state!=="running")return B;if(G??=await Z6($),B.deadlineAt>G)return B;return await W6($,B),await $.get(B.id)??B};for(let B=0;B<K.length;B++)K[B]=await X(K[B]);let V=new Map(K.map((B)=>[B.id,B])),Y=J.slice(),H=[],D=new Set;for(let B=0;B<Y.length;B++){let U=Y[B],F=null;for(let O=0;O<U.content.length;O++){let P=U.content[O];if(P.type==="tool-call")D.add(P.toolCallId);if(P.type!=="tool-result"||P.status!=="running")continue;let N=P.job?.id,M=N?V.get(N):void 0;if(N&&M===void 0){let j=await $.get(N);if(M=j?await X(j):void 0,M)V.set(N,M)}if(M?.state==="running")continue;F??=U.content.slice(),F[O]=r8(P,M,Q.outputSchemaFor)}if(F){let O={...U,content:F};Y[B]=O,H.push(O)}}let z=[];for(let B of K){if(B.orphaned||D.has(B.toolCallId))continue;if(await Q.isRunLive(B.runId))continue;z.push(B)}return{messages:Y,settled:H,orphans:z,jobs:K}}async function G6(J,Q,$){for(let Z of Q)try{await J.transition(Z.id,t8,{orphaned:!0})}catch(W){$(W)}}function r8(J,Q,$){let Z={type:"tool-result",toolCallId:J.toolCallId,name:J.name};if(!Q)return{...Z,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 W={id:Q.id,...Q.summary!==void 0?{summary:Q.summary}:{},...Q.usage?{usage:Q.usage}:{}};if(Q.state==="error")return{...Z,status:"error",job:W,error:Q.error??{code:"tool_error",message:`The background job for "${String(J.name)}" failed.`,toolCallId:J.toolCallId,retryable:!0}};let K=$?.(String(J.name));if(K){let G=K.safeParse(Q.output);if(G.ok===!1)return{...Z,status:"error",job:W,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: ${G.errors.join(", ")}`,toolCallId:J.toolCallId,retryable:!0}};return{...Z,status:"ok",job:W,output:G.value}}return{...Z,status:"ok",job:W,output:Q.output}}class yJ extends Error{status;code;kind;constructor(J,Q){super(J);this.name="AgentTurnError",this.status=Q.status,this.code=Q.code,this.kind=Q.kind}static async from(J){let Q={};try{let Z=await J.json();if(Z?.error&&typeof Z.error==="object")Q=Z.error}catch{}let $=(Z)=>typeof Q[Z]==="string"?Q[Z]:void 0;return new yJ($("message")??`The agent turn was refused with status ${J.status}.`,{status:J.status,code:$("code"),kind:$("kind")})}}function e8(J){for(let Q=J.length-1;Q>=0;Q--){let $=J[Q];if($.role!=="assistant")continue;return $.content.map((Z)=>Z.type==="text"?Z.text:"").join("")}return""}var J9=O6,EJ=new Map,X6=new WeakMap,XJ=new WeakMap,Y6="http://gemi.internal/__gemi/agent-turn",xJ=new Map,Q9=4194304,$9=1000,Z9=5,qJ=65536,IJ=()=>{};class x6{byKey=new Map;take(J,Q,$){let Z=this.byKey.get(J);if(!Z?.has(Q)&&(Z?.size??0)>=$)return null;if(!Z)Z=new Map,this.byKey.set(J,Z);Z.set(Q,(Z.get(Q)??0)+1);let W=!1;return()=>{if(W)return;W=!0;let K=this.byKey.get(J),G=(K?.get(Q)??1)-1;if(!K)return;if(G>0)K.set(Q,G);else if(K.delete(Q),K.size===0)this.byKey.delete(J)}}}var V6=new WeakMap;function W9(J){let Q=V6.get(J);if(!Q)Q=new x6,V6.set(J,Q);return Q}class hQ extends J9{static kind="agent-controller";store=kQ;liveRuns=NQ;voice;voiceStore=UQ;attachments=hJ;attachmentStorage=M6;fileOwners=LQ;nonces=bQ;receipts;requireKnownFiles=!1;hookHoldMs=30000;instructions(J,Q){}context(J,Q){return{}}memoryScopes(J,Q){return{}}memoryMaxTokens=void 0;requireThread=!1;maxBodyBytes=Q9;maxHistoryMessages=$9;contextWindow=void 0;prepareStep(J,Q){}maxConcurrentRuns=Z9;runLimitKey(J,Q){return Q.owner}authorizeRequest(J,Q){return this.resource?.authorize(J,Q)}resource;runOwner(J){let Q=J.ctx?.()?.user,$=Q?.id??Q?.publicId;if($!==void 0&&$!==null&&String($)!=="")return`user:${String($)}`;return null}static async startTurn(J){let{threadId:Q}=J;if(typeof Q!=="string"||Q==="")throw TypeError("AgentController.startTurn needs a `threadId`: a server turn is stored on a thread. Create one with the store's `createThread`.");let $={...J.turn,...J.text!==void 0?{text:J.text}:{}},Z={...J.body,threadId:Q,turn:$},W=new E(new Request(Y6,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(Z)}),{},"api",new URL(Y6).pathname),K=new this;XJ.set(W,null);let G=await h.run(W,()=>K.stream(W),{user:J.user??null}),X=XJ.get(W);if(!X)throw await yJ.from(G);XJ.delete(W),G.body?.cancel().catch(IJ);let{run:V,hooks:Y}=X,H=[],D=(async()=>{for await(let B of V)if(B.type==="awaiting-input")H=B.pending})().catch(IJ),z;return{runId:V.runId,threadId:Q,run:V,stop:(B)=>V.stop(B),result:()=>z??=(async()=>{let B=await V.result();await Promise.all([Y,D]);let U=B.messages;return{...B,threadId:Q,text:e8(U),pending:B.finishReason==="awaiting-input"?H:[]}})()}}async stream(J=new E){let Q=await YJ(J,this.maxBodyBytes);if(Q.error)return t(Q);let $=Q.body,Z=typeof $.threadId==="string"?$.threadId:void 0,W=D9($);if(W.error)return t({body:{},error:W.error});let K=W.turn,G=Z!==void 0&&$.regenerate===!0,X=typeof $.clientRunId==="string"?$.clientRunId:void 0,V=wJ($);if(this.requireThread&&!Z)return _(400,{code:"thread_required",message:"This agent takes a turn only on a thread: send a threadId."});if(G&&!this.store.removeMessages)return _(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($.messages)&&$.messages.length>this.maxHistoryMessages)return IQ(413,"history_too_long",`The conversation has ${$.messages.length} messages; this agent takes at most ${this.maxHistoryMessages}.`);let Y=await this.runOwner(J),H=X?{cancelled:!1,owner:Y}:null;if(H)xJ.set(X,H);let D=null,z=[],B=async()=>{try{return await U()}finally{if(Z&&z.length>0&&D===null)await this.store.appendMessages(Z,z).catch((F)=>this.reportHookFailure(F))}},U=async()=>{let F,O=null;if(Z){let A=await this.store.loadThread(Z);if(!A)return _(404,{code:"thread_not_found",message:`Thread ${Z} does not exist here, or has expired.`});let l=await this.settleThread(Z,A,{write:!0});if(F=l.messages,O=this.jobsBlock(l.jobs),G){let r=U9(F);if(!r)return _(409,{code:"nothing_to_regenerate",message:`Thread ${Z} has no user turn to answer again.`});z=F.slice(r.index),await this.store.removeMessages(Z,z.map((w6)=>w6.id)),F=F.slice(0,r.index),K=K?.localId?{...r.turn,localId:K.localId}:r.turn}}else F=Array.isArray($.messages)?$.messages:[],A9(this.nonces);let P=[await this.instructions(J,{body:V})||void 0,O??void 0].filter(Boolean).join(`
|
|
151
|
+
return 0`;class RQ{injectedClient;prefix;constructor(J={}){this.injectedClient=J.client,this.prefix=J.prefix??"gemi:ai:receipt"}async claim(J,Q){let $=await this.client.send("EVAL",[g8,"1",this.key(J),o$,a$(Q)]);if($==="claimed")return{status:"claimed"};let Z=String($??"");if(Z.startsWith(SQ))return{status:"replay",result:JSON.parse(Z.slice(SQ.length))};return{status:"blocked"}}async complete(J,Q,$){await this.client.send("SET",[this.key(J),SQ+JSON.stringify(Q),"PX",a$($)])}async release(J){await this.client.send("EVAL",[u8,"1",this.key(J),o$])}key(J){return`${this.prefix}:${J}`}get client(){if(this.injectedClient)return this.injectedClient;let J=s$(),Q=J.bound(AQ)?J.make(AQ).client:void 0;if(!Q)throw Error("RedisReceiptStore could not reach the Redis client. Register RedisServiceProvider on your application, or pass a client: new RedisReceiptStore({ client }).");return Q}}function a$(J){return String(Math.max(1,Math.ceil(J-Date.now())))}var c8=86400000,m8=60000;class xJ{ttlMs;clientOwnedIds;threads=new Map;lastSweep=0;constructor(J={}){this.ttlMs=J.ttlMs??c8,this.clientOwnedIds=J.clientOwnedIds??!1}async createThread(J){let Q=crypto.randomUUID();return this.threads.set(Q,{messages:[],touchedAt:Date.now()}),this.sweep(),{threadId:Q}}async loadThread(J){this.sweep();let Q=this.threads.get(J);if(!Q)return this.clientOwnedIds?[]:null;return Q.touchedAt=Date.now(),Q.messages.slice()}async appendMessages(J,Q){this.sweep();let $=this.threads.get(J);if(!$){if(!this.clientOwnedIds)throw Error(`Thread ${J} does not exist here, or has expired.`);$={messages:[],touchedAt:Date.now()},this.threads.set(J,$)}for(let Z of Q){let W=$.messages.findIndex((K)=>K.id===Z.id);if(W===-1)$.messages.push(Z);else $.messages[W]=Z}$.touchedAt=Date.now()}async removeMessages(J,Q){this.sweep();let $=this.threads.get(J);if(!$)return;let Z=new Set(Q);$.messages=$.messages.filter((W)=>!Z.has(W.id)),$.touchedAt=Date.now()}async loadSummaries(J){return this.threads.get(J)?.summaries?.slice()??[]}async saveSummary(J,Q){let $=this.threads.get(J);if(!$)return;$.summaries=TQ($.summaries??[],Q)}delete(J){this.threads.delete(J)}get size(){return this.threads.size}sweep(J=Date.now()){if(J-this.lastSweep<m8)return;this.lastSweep=J;for(let[Q,$]of this.threads)if(J-$.touchedAt>this.ttlMs)this.threads.delete(Q)}}var jQ=new xJ;function J6(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 Q6(J,Q,$=new Date().toISOString()){if(!(Q.event.type==="run-start"&&Q.event.runId!==J.cursorRunId)&&Q.seq<=J.seq)return J;return{...$6(J,Q.event,$),seq:Q.seq}}function $6(J,Q,$){switch(Q.type){case"run-start":return{...J,messages:p8(J.messages,Q.runId),runId:Q.runId,cursorRunId:Q.runId,threadId:Q.threadId??J.threadId,runMessageIds:[],loadedTools:[],finishReason:void 0,usage:void 0};case"message-start":return l(J,Q.messageId,$,(Z)=>({...Z,role:Q.role}));case"text-delta":if(r$(J,Q.messageId))return J;return l(J,Q.messageId,$,(Z)=>({...Z,content:o8(Z.content,Q.delta)}));case"reasoning-delta":if(r$(J,Q.messageId))return J;return l(J,Q.messageId,$,(Z)=>({...Z,content:a8(Z.content,Q.delta,Q.id)}));case"output-delta":return l(J,Q.messageId,$,(Z)=>({...Z,content:e$(Z.content,{type:"output",value:Q.snapshot,partial:!0},(W)=>W.type==="output")}));case"tool-call":return l(J,Q.messageId,$,(Z)=>{let W=Z.content.findIndex((B)=>B.type==="tool-call"&&B.toolCallId===Q.part.toolCallId),K=W===-1?void 0:Z.content[W],G=Q.part.progress??K?.progress,Y=Q.part.nested??K?.nested,V=Q.part.attachments??K?.attachments,X={...Q.part,...G?{progress:G}:{},...Y?{nested:Y}:{},...V?{attachments:V}:{}},H=Z.content.slice();if(W===-1)H.push(X);else H[W]=X;return{...Z,content:H}});case"tool-search":{let Z=Q.loaded.filter((W)=>!J.loadedTools.includes(W));if(Z.length===0)return J;return{...J,loadedTools:[...J.loadedTools,...Z]}}case"tool-progress":return t$(J,Q.toolCallId,(Z)=>({...Z,progress:[...Z.progress??[],Q.data]}));case"nested-event":{let Z=Q;return t$(J,Q.toolCallId,(W)=>{let K=W.nested??[],G=K.findIndex((H)=>H.runId===Z.runId),Y=K[G]??{runId:Z.runId,agent:Z.agent,messages:[]},V=i8(Y,Z,$),X=G===-1?[...K,V]:K.map((H,B)=>B===G?V:H);return{...W,nested:X}})}case"tool-result":{let Z=l(J,Q.messageId,$,(W)=>({...W,content:e$(W.content,Q.part,(K)=>K.type==="tool-result"&&K.toolCallId===Q.part.toolCallId)}));return{...Z,pending:Z.pending.filter((W)=>W.toolCallId!==Q.part.toolCallId)}}case"message":{let Z=J.messages.findIndex((G)=>G.id===Q.message.id),W=J.messages.slice();if(Z===-1)W.push(Q.message);else W[Z]=Q.message;let K=J.runMessageIds.includes(Q.message.id)?J.runMessageIds:[...J.runMessageIds,Q.message.id];return{...J,messages:W,runMessageIds:K}}case"message-id":{let Z=J.messages.findIndex((Y)=>Y.id===Q.localId);if(Z===-1){if(!Q.message||J.messages.some((Y)=>Y.id===Q.messageId))return J;return{...J,messages:[...J.messages,Q.message]}}let W=J.messages[Z],K={localId:W.localId??W.id,...W.metadata?{metadata:W.metadata}:{}},G=J.messages.some((Y)=>Y.id===Q.messageId)?J.messages.filter((Y,V)=>V!==Z).map((Y)=>Y.id===Q.messageId?{...Y,...K}:Y):J.messages.map((Y,V)=>V===Z?{...Y,...K,id:Q.messageId}:Y);return{...J,messages:G}}case"awaiting-input":return{...J,runId:Q.runId,pending:[...Q.pending]};case"message-end":return l(J,Q.messageId,$,(Z)=>({...Z,finishReason:Q.finishReason,...Q.outputTruncated?{outputTruncated:!0}:{},...Q.usage?{usage:Q.usage}:{},content:Q.outputTruncated||Q.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:Q.usage};case"error":return{...J,error:Q.error,pending:[]};case"run-end":return{...J,runId:void 0,finishReason:Q.finishReason,messages:Z6(J,Q.finishReason)};default:return J}}function p8(J,Q){if(!J.some(($)=>$.runId===Q&&$.finishReason===void 0))return J;return J.map(($)=>{if($.runId!==Q||$.finishReason!==void 0)return $;let{runId:Z,...W}=$;return{...W,content:[]}})}function Z6(J,Q){return J.messages.map(($)=>$.role==="assistant"&&J.runMessageIds.includes($.id)?l8($,Q):$)}function l8(J,Q){let $=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?d8(K,Q):K)}:W);if(J.finishReason===void 0)return{...J,finishReason:Q,content:$};return $.some((W,K)=>W!==J.content[K])?{...J,content:$}:J}function d8(J,Q){let $={messages:J.messages,pending:[],error:null,seq:-1,runMessageIds:J.messages.map((Z)=>Z.id),loadedTools:[]};return{...J,finishReason:Q,messages:Z6($,Q)}}function t$(J,Q,$){for(let Z=J.messages.length-1;Z>=0;Z--){let W=J.messages[Z],K=W.content.findIndex((X)=>X.type==="tool-call"&&X.toolCallId===Q);if(K===-1)continue;if(W.finishReason!==void 0&&!n8(J,W,Q))return J;let G=W.content.slice();G[K]=$(G[K]);let Y=J.messages.slice();Y[Z]={...W,content:G};let V=J.runMessageIds.includes(W.id)?J.runMessageIds:[...J.runMessageIds,W.id];return{...J,runMessageIds:V,messages:Y}}return J}function i8(J,Q,$){let Z={messages:J.messages,pending:[],error:null,seq:-1,runMessageIds:J.messages.map((K)=>K.id),loadedTools:[],finishReason:J.finishReason},W=$6(Z,Q.event,$);return{...J,...Q.label!==void 0?{label:Q.label}:{},messages:W.messages,...W.finishReason!==void 0?{finishReason:W.finishReason}:{},...W.usage!==void 0?{usage:W.usage}:{}}}function n8(J,Q,$){if(Q.finishReason!=="awaiting-input")return!1;return!J.messages.some((Z)=>Z.content.some((W)=>W.type==="tool-result"&&W.toolCallId===$))}function r$(J,Q){let $=J.messages.find((Z)=>Z.id===Q);return $!==void 0&&$.finishReason!==void 0}function l(J,Q,$,Z){let W=J.messages.findIndex((Y)=>Y.id===Q),K=J.runMessageIds.includes(Q)?J.runMessageIds:[...J.runMessageIds,Q];if(W===-1){let Y={id:Q,role:"assistant",content:[],createdAt:$};return{...J,runMessageIds:K,messages:[...J.messages,Z(Y)]}}let G=J.messages.slice();return G[W]=Z(G[W]),{...J,runMessageIds:K,messages:G}}function o8(J,Q){let $=J[J.length-1];if($&&$.type==="text")return[...J.slice(0,-1),{type:"text",text:$.text+Q}];return[...J,{type:"text",text:Q}]}function a8(J,Q,$){let Z=J[J.length-1];if(Z&&Z.type==="reasoning"&&Z.id===$)return[...J.slice(0,-1),{...Z,text:(Z.text??"")+Q}];return[...J,$?{type:"reasoning",id:$,text:Q}:{type:"reasoning",text:Q}]}function e$(J,Q,$){let Z=J.findIndex($);if(Z===-1)return[...J,Q];let W=J.slice();return W[Z]=Q,W}class xQ{store;threadId;report;chain=Promise.resolve();done=new Set;closed=!1;state;runId;constructor(J,Q,$,Z){this.store=J;this.threadId=Q;this.report=Z;this.state=J6({messages:$})}finish(J){if(this.closed)return;this.done.add(J.id),this.write(()=>[EQ(J)])}frame(J){if(this.closed)return;let Q=J.event;if(Q.type==="run-start")this.runId=Q.runId;switch(this.state=Q6(this.state,J),Q.type){case"message":this.write(()=>[EQ(Q.message)]);return;case"tool-call":if(Q.part.partial)return;this.checkpoint(Q.messageId);return;case"message-start":case"tool-result":this.checkpoint(Q.messageId);return;default:return}}close(J=[]){this.closed=!0;for(let Q of J)this.done.add(Q.id)}settled(){return this.chain}checkpoint(J){if(this.done.has(J))return;let Q=this.state.messages.find((Z)=>Z.id===J);if(!Q)return;let $=this.runId;this.write(()=>{let Z=EQ(Q);if(Z.finishReason===void 0&&$)Z.runId=$;return[Z]})}write(J){let Q;try{Q=J()}catch($){this.report($);return}this.chain=this.chain.then(()=>this.store.appendMessages(this.threadId,Q)).catch(($)=>this.report($))}}function EQ(J){return structuredClone(J)}async function W6(J,Q){let $=[],Z=null,W=J.slice();for(let K=0;K<W.length;K++){let G=W[K];if(G.role!=="assistant"||G.finishReason!==void 0)continue;if(G.runId&&await Q(G.runId))continue;Z??=new Set(J.flatMap((X)=>X.content.flatMap((H)=>H.type==="tool-result"?[H.toolCallId]:[])));let Y=G.content.map((X)=>X.type==="tool-call"?K6(X):X);for(let X of G.content){if(X.type!=="tool-call"||Z.has(X.toolCallId))continue;let H={type:"tool-result",toolCallId:X.toolCallId,name:X.name,status:"denied",cause:"interrupted"};Y.push(H)}let V={...G,content:Y,finishReason:"interrupted"};W[K]=V,$.push(V)}return{messages:W,settled:$}}function K6(J){let{partial:Q,...$}=J;if(!$.nested?.some((Z)=>Z.finishReason===void 0))return $;return{...$,nested:$.nested.map(s8)}}function s8(J){if(J.finishReason!==void 0)return J;return{...J,finishReason:"interrupted",messages:J.messages.map((Q)=>Q.role==="assistant"&&Q.finishReason===void 0?{...Q,finishReason:"interrupted",content:Q.content.map(($)=>$.type==="tool-call"?K6($):$)}:Q)}}var t8=50,r8=["running","ok","error"];async function Y6(J,Q){let{store:$,threadId:Z}=Q,W=Math.max(t8,Q.scan??0),K=await $.listForThread(Z,{limit:W}),G,Y=async(D)=>{if(D.state!=="running")return D;if(G??=await G6($),D.deadlineAt>G)return D;return await X6($,D),await $.get(D.id)??D};for(let D=0;D<K.length;D++)K[D]=await Y(K[D]);let V=new Map(K.map((D)=>[D.id,D])),X=J.slice(),H=[],B=new Set;for(let D=0;D<X.length;D++){let U=X[D],P=null;for(let O=0;O<U.content.length;O++){let F=U.content[O];if(F.type==="tool-call")B.add(F.toolCallId);if(F.type!=="tool-result"||F.status!=="running")continue;let N=F.job?.id,L=N?V.get(N):void 0;if(N&&L===void 0){let R=await $.get(N);if(L=R?await Y(R):void 0,L)V.set(N,L)}if(L?.state==="running")continue;P??=U.content.slice(),P[O]=e8(F,L,Q.outputSchemaFor)}if(P){let O={...U,content:P};X[D]=O,H.push(O)}}let z=[];for(let D of K){if(D.orphaned||B.has(D.toolCallId))continue;if(await Q.isRunLive(D.runId))continue;z.push(D)}return{messages:X,settled:H,orphans:z,jobs:K}}async function V6(J,Q,$){for(let Z of Q)try{await J.transition(Z.id,r8,{orphaned:!0})}catch(W){$(W)}}function e8(J,Q,$){let Z={type:"tool-result",toolCallId:J.toolCallId,name:J.name};if(!Q)return{...Z,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 W={id:Q.id,...Q.summary!==void 0?{summary:Q.summary}:{},...Q.usage?{usage:Q.usage}:{}};if(Q.state==="error")return{...Z,status:"error",job:W,error:Q.error??{code:"tool_error",message:`The background job for "${String(J.name)}" failed.`,toolCallId:J.toolCallId,retryable:!0}};let K=$?.(String(J.name));if(K){let G=K.safeParse(Q.output);if(G.ok===!1)return{...Z,status:"error",job:W,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: ${G.errors.join(", ")}`,toolCallId:J.toolCallId,retryable:!0}};return{...Z,status:"ok",job:W,output:G.value}}return{...Z,status:"ok",job:W,output:Q.output}}class uJ extends Error{status;code;kind;constructor(J,Q){super(J);this.name="AgentTurnError",this.status=Q.status,this.code=Q.code,this.kind=Q.kind}static async from(J){let Q={};try{let Z=await J.json();if(Z?.error&&typeof Z.error==="object")Q=Z.error}catch{}let $=(Z)=>typeof Q[Z]==="string"?Q[Z]:void 0;return new uJ($("message")??`The agent turn was refused with status ${J.status}.`,{status:J.status,code:$("code"),kind:$("kind")})}}function J9(J){for(let Q=J.length-1;Q>=0;Q--){let $=J[Q];if($.role!=="assistant")continue;return $.content.map((Z)=>Z.type==="text"?Z.text:"").join("")}return""}var Q9=M6,qJ=new Map,H6=new WeakMap,XJ=new WeakMap,z6="http://gemi.internal/__gemi/agent-turn",IJ=new Map,$9=4194304,Z9=1000,W9=5,wJ=65536,bJ=()=>{};class w6{byKey=new Map;take(J,Q,$){let Z=this.byKey.get(J);if(!Z?.has(Q)&&(Z?.size??0)>=$)return null;if(!Z)Z=new Map,this.byKey.set(J,Z);Z.set(Q,(Z.get(Q)??0)+1);let W=!1;return()=>{if(W)return;W=!0;let K=this.byKey.get(J),G=(K?.get(Q)??1)-1;if(!K)return;if(G>0)K.set(Q,G);else if(K.delete(Q),K.size===0)this.byKey.delete(J)}}}var D6=new WeakMap;function K9(J){let Q=D6.get(J);if(!Q)Q=new w6,D6.set(J,Q);return Q}class uQ extends Q9{static kind="agent-controller";store=jQ;liveRuns=CQ;voice;voiceStore=LQ;attachments=gJ;attachmentStorage=S6;fileOwners=_Q;nonces=hQ;receipts;requireKnownFiles=!1;hookHoldMs=30000;instructions(J,Q){}context(J,Q){return{}}memoryScopes(J,Q){return{}}memoryMaxTokens=void 0;requireThread=!1;maxBodyBytes=$9;maxHistoryMessages=Z9;contextWindow=void 0;prepareStep(J,Q){}maxConcurrentRuns=W9;runLimitKey(J,Q){return Q.owner}authorizeRequest(J,Q){return this.resource?.authorize(J,Q)}resource;runOwner(J){let Q=J.ctx?.()?.user,$=Q?.id??Q?.publicId;if($!==void 0&&$!==null&&String($)!=="")return`user:${String($)}`;return null}static async startTurn(J){let{threadId:Q}=J;if(typeof Q!=="string"||Q==="")throw TypeError("AgentController.startTurn needs a `threadId`: a server turn is stored on a thread. Create one with the store's `createThread`.");let $={...J.turn,...J.text!==void 0?{text:J.text}:{}},Z={...J.body,threadId:Q,turn:$},W=new x(new Request(z6,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(Z)}),{},"api",new URL(z6).pathname),K=new this;XJ.set(W,null);let G=await y.run(W,()=>K.stream(W),{user:J.user??null}),Y=XJ.get(W);if(!Y)throw await uJ.from(G);XJ.delete(W),G.body?.cancel().catch(bJ);let{run:V,hooks:X}=Y,H=[],B=(async()=>{for await(let D of V)if(D.type==="awaiting-input")H=D.pending})().catch(bJ),z;return{runId:V.runId,threadId:Q,run:V,stop:(D)=>V.stop(D),result:()=>z??=(async()=>{let D=await V.result();await Promise.all([X,B]);let U=D.messages;return{...D,threadId:Q,text:J9(U),pending:D.finishReason==="awaiting-input"?H:[]}})()}}async stream(J=new x){let Q=await YJ(J,this.maxBodyBytes);if(Q.error)return t(Q);let $=Q.body,Z=typeof $.threadId==="string"?$.threadId:void 0,W=B9($);if(W.error)return t({body:{},error:W.error});let K=W.turn,G=Z!==void 0&&$.regenerate===!0,Y=typeof $.clientRunId==="string"?$.clientRunId:void 0,V=fJ($);if(this.requireThread&&!Z)return _(400,{code:"thread_required",message:"This agent takes a turn only on a thread: send a threadId."});if(G&&!this.store.removeMessages)return _(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($.messages)&&$.messages.length>this.maxHistoryMessages)return fQ(413,"history_too_long",`The conversation has ${$.messages.length} messages; this agent takes at most ${this.maxHistoryMessages}.`);let X=await this.runOwner(J),H=Y?{cancelled:!1,owner:X}:null;if(H)IJ.set(Y,H);let B=null,z=[],D=async()=>{try{return await U()}finally{if(Z&&z.length>0&&B===null)await this.store.appendMessages(Z,z).catch((P)=>this.reportHookFailure(P))}},U=async()=>{let P,O=null;if(Z){let A=await this.store.loadThread(Z);if(!A)return _(404,{code:"thread_not_found",message:`Thread ${Z} does not exist here, or has expired.`});let d=await this.settleThread(Z,A,{write:!0});if(P=d.messages,O=this.jobsBlock(d.jobs),G){let r=U9(P);if(!r)return _(409,{code:"nothing_to_regenerate",message:`Thread ${Z} has no user turn to answer again.`});z=P.slice(r.index),await this.store.removeMessages(Z,z.map((v6)=>v6.id)),P=P.slice(0,r.index),K=K?.localId?{...r.turn,localId:K.localId}:r.turn}}else P=Array.isArray($.messages)?$.messages:[],k9(this.nonces);let F=[await this.instructions(J,{body:V})||void 0,O??void 0].filter(Boolean).join(`
|
|
152
152
|
|
|
153
|
-
`)||void 0,N=await this.context(J,{body:V}),M=await this.attachmentsFor(J,Z,{body:V}),j=this.agent.memory?await this.memoryScopes(J,{body:V}):void 0;if(H?.cancelled)return F6();let S=Z?new TQ(this.store,Z,F,(A)=>this.reportHookFailure(A)):null,x=`run_${crypto.randomUUID()}`,q={req:J,runId:x,threadId:Z},b={id:null,notified:Promise.resolve()},L=this.agent.stream({runId:x,messages:F,turn:K,threadId:Z,...S?{onMessage:(A)=>S.finish(A)}:{},onTurn:(A)=>{if(b.id!==null)return;b.id=A.id;let l=S?S.settled():Promise.resolve();b.notified=l.then(()=>this.safely(()=>this.onMessage(A,q)))},instructions:P,context:N,attachments:M,body:V,redactError:(A,l)=>this.redactError(A,l,q),nonces:this.nonces,receipts:this.receipts,subject:Y,...j?{memory:{scopes:j,...this.memoryMaxTokens!==void 0?{maxTokens:this.memoryMaxTokens}:{}}}:{},...Z?{jobs:{owner:Y}}:{},...this.contextWindow!==void 0?{contextWindow:this.contextWindow}:{},...Z&&E6(this.store)?{summaryStore:this.store}:{},...this.prepareStep!==hQ.prototype.prepareStep?{prepareStep:(A)=>this.prepareStep(A,q)}:{}}),R=this.liveRuns.register(L,{threadId:Z,owner:Y,clientRunId:X,onEvent:(A)=>this.dispatchEvent(A,q),onInternalError:(A)=>this.reportHookFailure(A),maxRunDurationMs:this.agent.maxRunDurationMs});if(D=L,S)this.follow(L,S);let{stored:C,hooks:yQ}=this.persistRun(L,q,R,S,b);if(X6.set(L,C),XJ.has(J))XJ.set(J,{run:L,hooks:yQ});return J.ctx?.()?.waitUntil(yQ),L.toResponse()};try{await this.authorizeRequest(J,{route:"stream",threadId:Z,body:V});let F=await this.foreignFile([...K?.files??[],...Z?[]:N9($.messages)],Y);if(F)return F;if(H?.cancelled)return F6();let O=await this.runLimitKey(J,{owner:Y,threadId:Z}),P=O===null?IJ:W9(this.liveRuns).take(O,Z?`thread:${Z}`:`run:${crypto.randomUUID()}`,this.maxConcurrentRuns);if(!P)return IQ(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,B):await B()}finally{let N=D;if(N)N.result().then(P,P);else P()}}finally{if(H&&xJ.get(X)===H)xJ.delete(X)}}async withThread(J,Q,$){let Z=EJ.get(J)??Promise.resolve(),W,K=new Promise((X)=>{W=X}),G=Z.then(()=>K);EJ.set(J,G),await Z;try{let X=await this.liveRuns.find({threadId:J});if(X&&this.liveRuns.isRunning(X.runId)&&!this.liveRuns.mayAccess(X.runId,Q))return VJ();let V=X?this.liveRuns.get(X.runId):null;if(V)V.stop({reason:"superseded by a later turn on this thread"}),await X6.get(V);return await $()}finally{if(W(),EJ.get(J)===G)EJ.delete(J)}}async attach(J=new E){let Q=await YJ(J,qJ);if(Q.error)return t(Q);let $=Q.body,Z=typeof $.threadId==="string"?$.threadId:P9(J,"threadId");if(!Z)return _(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 VJ();if(!W)return _(404,{code:"no_live_run",message:`No run in progress for thread ${Z} in this process.`});let K=typeof $.runId==="string"?$.runId:void 0,G=K&&K!==W.runId?void 0:F9(J,$);try{return C6(this.liveRuns.replay(W.runId,G))}catch(X){if(X instanceof s)return _(410,{code:X.code,message:X.message,oldestSeq:X.oldest});if(X instanceof GJ)return _(404,{code:X.code,message:X.message});throw X}}async stop(J=new E){let Q=await YJ(J,qJ);if(Q.error)return t(Q);let $=Q.body;await this.authorizeRequest(J,{route:"stop",threadId:typeof $.threadId==="string"?$.threadId:void 0});let Z=await this.runOwner(J),W=typeof $.runId==="string"?$.runId:void 0;if(!W&&typeof $.clientRunId==="string"){if(W=this.liveRuns.findByClientRunId($.clientRunId)??void 0,!W){let G=xJ.get($.clientRunId);if(G){if(G.owner!==null&&G.owner!==Z)return VJ();return G.cancelled=!0,{stopped:!0}}}}if(!W&&typeof $.threadId==="string")W=(await this.liveRuns.find({threadId:$.threadId}))?.runId;let K=W?this.liveRuns.get(W):null;if(!K)return{stopped:!1};if(!this.liveRuns.mayAccess(K.runId,Z))return VJ();return K.stop({reason:typeof $.reason==="string"?$.reason:void 0}),{stopped:!0}}attachmentScope(J,Q,$){let Z=J.ctx()?.user,W=Z?.id??Z?.publicId;if(W!==void 0&&W!==null&&String(W)!=="")return{key:`user:${String(W)}`};if(Q)return{key:`thread:${Q}`};return null}attachmentLimits(J){return null}checkUpload(J,Q,$){}attachmentDestination(J,Q,$){return"both"}async attachmentsFor(J,Q,$={body:{}}){let Z=await this.attachmentScope(J,Q,$);if(!Z)return null;return new vJ(this.attachments,this.attachmentStorage,Z)}async voiceStart(J=new E){let Q=this.voice;if(!Q)return jQ();let $=await YJ(J,qJ);if($.error)return t($);let{sdp:Z,threadId:W,pushToTalk:K}=$.body;if(typeof Z!=="string"||!Z.trimStart().startsWith("v="))return _(400,{code:"invalid_request",message:"`sdp` must be the browser's SDP offer."});let G=wJ($.body,L9),X=typeof W==="string"&&W!==""?W:void 0;await this.authorizeRequest(J,{route:"stream",threadId:X,body:G});let V=J.ctx?.()?.user??null,Y=await Q.start({req:J,body:G,threadId:X,user:V,pushToTalk:K===!0}),H=Date.now(),D,z=async(N)=>{if(N!==void 0)console.error("[gemi/ai] a voice session could not start.",N);if(D)await Q.realtime.hangup(D).catch((M)=>{console.error("[gemi/ai] a voice call that failed to start could not be hung up.",M)});try{await Y.onEnd?.({sessionId:"",...D?{callId:D}:{},threadId:Y.threadId??X??"",reason:"start_failed",startedAt:H,endedAt:Date.now(),durationMs:0,seconds:0,usage:T(),transcription:{usage:T(),seconds:0},transcript:[],requests:[],toolCalls:[],errors:[]})}catch(M){console.error("[gemi/ai] a voice session's onEnd threw.",M)}},B=Y.threadId??X;if(!B)return await z(void 0),_(400,{code:"invalid_request",message:"A voice session needs a thread: send `threadId`, or answer one from `voice.start`."});try{if(B!==X)await this.authorizeRequest(J,{route:"stream",threadId:B,body:G})}catch(N){throw await z(void 0),N}let U=crypto.randomUUID(),F=Y.tools??[];try{if(Y.mcp)F=[...F,...await FQ(Y.mcp,{user:V,sessionId:U})]}catch(N){return await z(N),_(500,{code:"voice_unavailable",message:"Voice isn't available right now."})}let O={...Y.session,tools:[...WJ(Q.delegate),...Y.session?.tools??[],...F.map((N)=>N.tool)],...K===!0?{turnDetection:null}:{}},P;try{P=await Q.realtime.createCall({sdp:Z,session:O,safetyIdentifier:Y.safetyIdentifier})}catch(N){await z(N);let M=N instanceof f&&N.code==="rate_limited";return _(M?429:502,{code:"voice_unavailable",message:"Voice isn't available right now."})}D=P.callId;try{await this.voiceStore.create({id:U,callId:P.callId,threadId:B,owner:await this.runOwner(J),body:G,startedAt:H});let{threadId:N,session:M,safetyIdentifier:j,mcp:S,tools:x,...q}=Y;return{sessionId:m.start({...q,tools:F,controller:this.constructor,threadId:B,user:V,body:G,call:{realtime:Q.realtime,callId:P.callId},sessionId:U,store:this.voiceStore,liveRuns:this.liveRuns,delegate:Q.delegate,session:O}).sessionId,sdp:P.sdpAnswer,threadId:B,delegate:Q.delegate?.name??KJ,endsAt:H+(Y.limits?.maxDurationMs??900000)}}catch(N){return await z(N),_(500,{code:"voice_unavailable",message:"Voice isn't available right now."})}}async voiceUpdate(J=new E){if(!this.voice)return jQ();let Q=await this.voiceSession(J);if(Q instanceof Response)return Q;let $=await YJ(J,qJ);if($.error)return t($);let Z=wJ($.body,[]);if(await this.authorizeRequest(J,{route:"stream",threadId:Q.threadId,body:Z}),Q.endedAt!==void 0)return _(409,{code:"voice_ended",message:"This voice session has ended."});return await this.voiceStore.update(Q.id,{body:Z}),m.get(Q.id)?.setBody(Z),{updated:!0}}async voiceEnd(J=new E){let Q=this.voice;if(!Q)return jQ();let $=await this.voiceSession(J);if($ instanceof Response)return $;if(await this.authorizeRequest(J,{route:"stream",threadId:$.threadId,body:$.body}),$.endedAt!==void 0)return{ended:!1};let Z=m.get($.id);if(Z)await Z.end("hangup");else await Q.realtime.hangup($.callId),await this.voiceStore.update($.id,{endedAt:Date.now(),endReason:"hangup"});return{ended:!0}}async voiceSession(J){let Q=J.params?.sessionId,$=typeof Q==="string"&&Q?await this.voiceStore.get(Q):null;if(!$)return _(404,{code:"voice_not_found",message:"No such voice session."});if($.owner!==null&&$.owner!==await this.runOwner(J))return VJ();return $}async upload(J=new E){let Q=await J.rawRequest.formData(),$=Q.get("file");if(!($ instanceof Blob))throw Error("upload expects a multipart body with a `file` field.");let Z=$ instanceof File&&$.name?$.name:"upload",W=$.type||"application/octet-stream",K=G9(Q.get("body")),G=Q.get("threadId");await this.authorizeRequest(J,{route:"upload",threadId:typeof G==="string"&&G.length>0?G:void 0,body:K});let X=Y9(await this.attachmentLimits(J),$,Z,W);if(X)throw new qQ(X.code,X.message);let V=typeof G==="string"&&G.length>0&&await this.store.loadThread(G)!==null?G:void 0,Y=await this.runOwner(J),H=(S)=>this.fileOwners.record(S,{owner:Y,name:Z,mimeType:W,size:$.size,createdAt:new Date().toISOString()}),D={body:K,threadId:V},z=await this.checkUpload({name:Z,size:$.size,mimeType:W},J,D);if(z)throw new qQ(z.code||"upload_refused",z.message);let B=await this.attachmentDestination($,J,D),U=M9(B,Q.get("destination")),F=await this.attachmentScope(J,V,{body:K}),O=U!=="provider"&&!F;if(O){if(U==="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()`.');C9()}if(U==="provider"||!F){let S=await H6(this.agent.provider,$);await H(S);let x={fileId:S,name:Z,mimeType:W,size:$.size,destination:"provider"};if(O)x.downgraded="no_scope";return x}let P=R6(),N=await this.attachmentStorage.put({name:T6(P,Z),body:$,contentType:W}),M=U==="both"?await H6(this.agent.provider,$):void 0;if(M)await H(M);let j={id:P,scopeKey:F.key,fileId:M,objectName:N,name:Z,mimeType:W,size:$.size,createdAt:new Date().toISOString(),destination:U};return await this.attachments.put(F,j),{fileId:M,attachmentId:P,name:Z,mimeType:W,size:$.size,destination:U}}async foreignFile(J,Q){let $=new Set(J.map((Z)=>Z.fileId).filter((Z)=>typeof Z==="string"));for(let Z of $){let W=await this.fileOwners.get(Z);if(W?W.owner!==null&&W.owner!==Q:this.requireKnownFiles)return O9()}return null}onMessage(J,Q){}onToolCall(J,Q){}onAwaitingInput(J,Q){}redactError(J,Q,$){return fQ(J,Q)}onError(J,Q){}onStreamComplete(J,Q){}reportHookFailure(J){console.error("[gemi/ai] agent controller hook failed",J)}async dispatchEvent(J,Q){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},Q);return;case"awaiting-input":await this.onAwaitingInput(J.pending,Q);return;case"error":await this.onError(S6(J.error),Q);return;default:return}}async readThread(J){let Q=await this.store.loadThread(J);return Q?(await this.settleThread(J,Q,{write:!1})).messages:null}isRunLive(J,Q){return this.liveRuns.get(J)!==null}async settleThread(J,Q,{write:$}){let Z=(V)=>this.isRunLive(V,J),W=await Q6(Q,Z),K=W.messages,G=[],X=new Map(W.settled.map((V)=>[V.id,V]));if(k9(K)||$)try{let V=await K6(K,{threadId:J,store:v.store,isRunLive:Z,outputSchemaFor:(Y)=>this.toolOutputSchema(Y),scan:this.jobsBlockMax()});K=V.messages,G=V.jobs;for(let Y of V.settled)X.set(Y.id,Y);if($&&V.orphans.length>0){await G6(v.store,V.orphans,(H)=>this.reportHookFailure(H));let Y=new Set(V.orphans.map((H)=>H.id));G=G.map((H)=>Y.has(H.id)?{...H,orphaned:!0}:H)}}catch(V){this.reportHookFailure(V)}if($&&X.size>0)try{await this.store.appendMessages(J,[...X.values()])}catch(V){this.reportHookFailure(V)}return{messages:K,jobs:G}}jobsBlockMax(){let J=this.agent.jobs?.contextBlock;if(J===!1)return 0;return J?.max??HJ}jobsBlock(J){return cQ(J,this.jobsBlockMax())}toolOutputSchema(J){let Q=($)=>{for(let Z of $){let W=Z;if(Array.isArray(W.tools)){let K=Q(W.tools);if(K)return K}else if(W.name===J)return W.outputSchema}return};return Q(this.agent.tools??[])}follow(J,Q){(async()=>{try{for await(let $ of J.frames())Q.frame($)}catch($){this.reportHookFailure($)}})()}persistRun(J,Q,$,Z=null,W={id:null,notified:Promise.resolve()}){let K=Promise.resolve(),G=(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},Q)));return}let Y=V.messages;if(Z?.close(Y),await Z?.settled(),Q.threadId&&Y.length>0)try{await this.store.appendMessages(Q.threadId,Y)}catch(H){this.reportHookFailure(H)}K=this.notifyRun(V,Y,Q,W)})(),X=G.then(()=>S9(Promise.all([K,$]).then(()=>{}),this.hookHoldMs));return{stored:G,hooks:X}}async notifyRun(J,Q,$,Z){await Z.notified;for(let W of Q){if(W.id===Z.id)continue;await this.safely(()=>this.onMessage(W,$))}await this.safely(()=>this.onStreamComplete(J,$))}async safely(J){try{await J()}catch(Q){this.reportHookFailure(Q)}}}var EQ=["turn","clientRunId","threadId","messages","regenerate"],K9=["text","files","toolResults"];function wJ(J,Q=I6(J)?EQ:[...EQ,...K9]){let $={};for(let[Z,W]of Object.entries(J)){if(Q.includes(Z))continue;Object.defineProperty($,Z,{value:W,writable:!0,enumerable:!0,configurable:!0})}return $}function G9(J){if(J===null)return{};let Q;if(typeof J==="string")try{Q=JSON.parse(J)}catch{throw new xQ("The upload's `body` field is not valid JSON.")}if(Q===null||typeof Q!=="object"||Array.isArray(Q))throw new xQ("The upload's `body` field must be a JSON object.");return wJ(Q,EQ)}class xQ extends bJ{constructor(J){super(J);this.name="InvalidUploadError",this.payload={api:{status:400,data:{error:{code:"invalid_request",message:J}}},view:{}}}}async function H6(J,Q){try{return await J.upload(Q)}catch($){if($ instanceof I&&X9.has($.status))throw new q6(k($).message);throw $}}var X9=new Set([400,413,415,422]);class qQ extends bJ{constructor(J,Q){super(Q);this.name="LimitedUploadError",this.payload={api:{status:422,data:{error:{code:J,message:Q}}},view:{}}}}function Y9(J,Q,$,Z){if(!J)return null;let{maxBytes:W,accept:K}=J;if(typeof W==="number"&&Q.size>W)return{code:"file_too_large",message:`${JSON.stringify($)} is ${z6(Q.size)}; the limit is ${z6(W)}.`};if(K&&K.length>0&&!K.some((G)=>V9(G,$,Z)))return{code:"unsupported_file_type",message:`${JSON.stringify($)} is not a type this chat accepts. Accepted: ${K.join(", ")}.`};return null}function V9(J,Q,$){let Z=J.trim().toLowerCase();if(!Z)return!1;if(Z.startsWith("."))return Q.toLowerCase().endsWith(Z);let W=$.toLowerCase().split(";")[0].trim();if(Z.endsWith("/*"))return W.startsWith(Z.slice(0,-1));return W===Z}function z6(J){if(J<1024)return`${J} B`;let Q=["KB","MB","GB"],$=J/1024,Z=0;while($>=1024&&Z<Q.length-1)$/=1024,Z++;return`${Math.round($*10)/10} ${Q[Z]}`}class q6 extends bJ{constructor(J){super(J);this.name="RejectedUploadError";let Q=/(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:Q,message:J}}},view:{}}}}async function YJ(J,Q){let $=J?.rawRequest;if(!$||$.method==="GET"||$.method==="HEAD"||!$.body)return{body:{}};if(!H9($.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($.headers.get("Content-Length"));if(Number.isFinite(Z)&&Z>Q)return D6(Q);let W;try{let G=await z9($,Q);if(G===null)return D6(Q);W=G}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 H9(J){return L6(J)==="application/json"}async function z9(J,Q){if(!Number.isFinite(Q)||!J.body)return await J.text();let $=J.body.getReader(),Z=[],W=0;for(;;){let{done:X,value:V}=await $.read();if(X)break;if(W+=V.byteLength,W>Q)return await $.cancel().catch(IJ),null;Z.push(V)}let K=new Uint8Array(W),G=0;for(let X of Z)K.set(X,G),G+=X.byteLength;return new TextDecoder().decode(K)}function D6(J){return{body:{},status:413,code:"body_too_large",error:`The request body is larger than this agent accepts (${J} bytes).`}}function IQ(J,Q,$){return _(J,{...fJ(N6(J),$,J),code:Q})}function t(J){if(J.status===413)return IQ(413,J.code??"body_too_large",J.error??"");return _(J.status??400,{code:J.code??"invalid_request",message:J.error})}function I6(J){return Boolean(J.turn)&&typeof J.turn==="object"}function D9(J){let Q=I6(J)?J.turn:J,$={};if(typeof Q.text==="string")$.text=Q.text;if(Array.isArray(Q.files)){let Z=B9(Q.files);if(typeof Z==="string")return{error:Z};$.files=Z}if(Array.isArray(Q.toolResults))$.toolResults=Q.toolResults;if(Object.keys($).length===0)return{};if(Q===J.turn&&Q.localId!==void 0&&Q.localId!==null&&Q.localId!==""){let{localId:Z}=Q;if(typeof Z!=="string")return{error:"turn.localId must be a string."};if(Z.length>B6)return{error:`turn.localId is longer than ${B6} characters.`};$.localId=Z}return{turn:$}}var B6=200;function B9(J){let Q=[];for(let[$,Z]of J.entries()){let W=`turn.files[${$}]`;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:G,attachmentId:X,name:V,mimeType:Y}=K;if(G?.startsWith(c))return`${W}.fileId holds a gemi attachment id (${G}). \`fileId\` is the provider's id from the upload response; put this one in \`attachmentId\`.`;if(X!==void 0&&!X.startsWith(c))return`${W}.attachmentId is not a gemi attachment id: it must start with "${c}".`;if(!G&&!X)return`${W} has neither a \`fileId\` nor an \`attachmentId\`. Send the ids the upload response answered.`;Q.push({...G?{fileId:G}:{},...X?{attachmentId:X}:{},...V!==void 0?{name:V}:{},...Y!==void 0?{mimeType:Y}:{}})}return Q}function F9(J,Q){if(typeof Q.from==="number"&&Number.isFinite(Q.from))return Math.max(0,Math.floor(Q.from));if(typeof Q.cursor==="number"&&Number.isFinite(Q.cursor)){let Z=Math.floor(Q.cursor);if(Z>=0)return Z+1;return}let $=J?.rawRequest?.headers?.get("Last-Event-ID");if($){let Z=Number.parseInt($,10);if(Number.isFinite(Z))return Math.max(0,Z+1)}return}function P9(J,Q){let $=J?.search?.get(Q);return typeof $==="string"?$:void 0}function U9(J){let Q=vQ(J);for(let $=J.length-1;$>=0;$--){let Z=J[$];if(Z.role!=="user"||Q.has(Z.id))continue;let W="",K=[];for(let G of Z.content){if(G.type==="text")W+=G.text;if(G.type==="file")K.push({...G.fileId?{fileId:G.fileId}:{},...G.attachmentId?{attachmentId:G.attachmentId}:{},...G.name?{name:G.name}:{},...G.mimeType?{mimeType:G.mimeType}:{}})}if(!W&&K.length===0)continue;return{index:$,turn:{...W?{text:W}:{},...K.length>0?{files:K}:{}}}}return null}function F6(){return _(409,{code:"stopped",message:"The turn was stopped before it started."})}function VJ(){return _(403,fJ("permission","This run belongs to someone else.",403))}function O9(){return _(403,fJ("permission","A file in this turn was uploaded by someone else.",403))}function N9(J){if(!Array.isArray(J))return[];let Q=[];for(let $ of J){let Z=$?.content;if(!Array.isArray(Z))continue;for(let W of Z)if(W&&typeof W==="object"&&typeof W.fileId==="string")Q.push({fileId:W.fileId})}return Q}var L9=["sdp","threadId","pushToTalk"];function jQ(){return _(404,{code:"voice_not_enabled",message:"This agent has no voice: set `voice` on its controller."})}function _(J,Q){return new Response(JSON.stringify({error:Q}),{status:J,headers:{"Content-Type":"application/json"}})}function M9(J,Q){if(typeof Q!=="string"||Q.length===0)return J;if(Q!=="both"&&Q!=="provider"&&Q!=="storage")throw Error(`Unknown attachment destination "${Q}". Expected "both", "provider" or "storage".`);if(Q===J||J==="both"&&Q==="storage")return Q;if(J==="both"&&Q==="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 "${Q}" 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 P6=!1;function C9(){if(P6)return;P6=!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 _9=2147483647;function S9(J,Q){let $=J.then(()=>{},()=>{});if(!(Q<=_9))return $;let Z,W=new Promise((K)=>{Z=setTimeout(K,Q)});return Promise.race([$,W]).finally(()=>clearTimeout(Z))}var U6=!1;function A9(J){if(U6||Bun.env.NODE_ENV!=="production")return;if(!(J instanceof wQ))return;U6=!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 k9(J){return J.some((Q)=>Q.content.some(($)=>$.type==="tool-result"&&$.status==="running"))}export{b9 as windowMessages,WJ as voiceTools,E9 as turnStarts,LJ as toRealtimeUsage,h6 as toAgentTools,j9 as supportsStrict,x9 as splitTurns,c9 as settleSummaries,T9 as s,fQ as redactError,q9 as messageSize,FQ as mcpVoiceTools,NQ as liveRuns,AQ as keepSummary,y$ as isCallNotFound,vQ as injectedMessageIds,o9 as generate,I8 as evalChain,UQ as defaultVoiceStore,u9 as defaultSummaryStore,bQ as defaultNonceStore,LQ as defaultFileOwners,hJ as defaultAttachmentStore,kQ as defaultAgentStore,kJ as VoiceHangup,m as VoiceBridge,iJ as ToolNamespace,y as ToolError,p9 as Skill,vJ as ScopedAttachments,l9 as SKILLS_NAMESPACE,SQ as RedisReceiptStore,_6 as RedisNonceStore,MJ as RealtimeSideband,f as RealtimeRequestError,$J as RealtimeClient,m9 as PendingEscalation,HQ as OpenAIProvider,sJ as OpenAIImageProvider,PQ as MemoryVoiceSessionStore,g9 as MemorySummaryStore,_Q as MemoryReceiptStore,wQ as MemoryNonceStore,RJ as MemoryLiveRuns,TJ as MemoryFileOwners,SJ as MemoryCircuitStore,j6 as MemoryAttachmentStore,jJ as MemoryAgentStore,dQ as MemoryAgentJobStore,Y$ as MEMORY_NAMESPACE,GJ as LiveRunNotFoundError,nQ as JobsRequireThreadError,iQ as JobHandle,R9 as JSONSchemaError,k6 as InvalidAttachmentScopeError,$$ as InMemoryAgentMemoryStore,OJ as ImageRequestError,NJ as ImageProvider,nJ as ImageModel,s as FrameCursorEvictedError,ZJ as FallbackProvider,G$ as FakeAgentMemoryStore,lJ as DatabaseAgentMemoryStore,mJ as DatabaseAgentJobStore,v$ as DEFAULT_TRANSCRIPTION_MODEL,Q$ as DEFAULT_MEMORY_MAX_TOKENS,X$ as DEFAULT_MEMORY_LIMITS,f9 as DEFAULT_MAX_SUMMARY_TOKENS,d9 as DEFAULT_MAX_RUN_DURATION_MS,oQ as DEFAULT_JOB_DEADLINE_MS,HJ as DEFAULT_JOBS_CONTEXT_MAX,KJ as DEFAULT_DELEGATE_NAME,I9 as DEFAULT_CONTEXT_WINDOW_STEP,w9 as DEFAULT_CONTEXT_WINDOW_NOTE,v9 as DEFAULT_COMPACT_TRIGGER_TOKENS,h9 as DEFAULT_COMPACT_INSTRUCTIONS,y9 as COMPACT_SUMMARY_HEADER,zQ as AzureOpenAIProvider,tJ as AzureOpenAIImageProvider,A6 as AttachmentNotFoundError,yJ as AgentTurnError,UJ as AgentTool,i9 as AgentRunError,a as AgentProvider,Z$ as AgentMemoryRefusedError,W$ as AgentMemoryConflictError,K$ as AgentMemories,v as AgentJobs,gJ as AgentJobDeadlineSweep,aQ as AgentJob,hQ as AgentController,n9 as Agent};
|
|
153
|
+
`)||void 0,N=await this.context(J,{body:V}),L=await this.attachmentsFor(J,Z,{body:V}),R=this.agent.memory?await this.memoryScopes(J,{body:V}):void 0;if(H?.cancelled)return U6();let S=Z?new xQ(this.store,Z,P,(A)=>this.reportHookFailure(A)):null,q=`run_${crypto.randomUUID()}`,I={req:J,runId:q,threadId:Z},f={id:null,notified:Promise.resolve()},M=this.agent.stream({runId:q,messages:P,turn:K,threadId:Z,...S?{onMessage:(A)=>S.finish(A)}:{},onTurn:(A)=>{if(f.id!==null)return;f.id=A.id;let d=S?S.settled():Promise.resolve();f.notified=d.then(()=>this.safely(()=>this.onMessage(A,I)))},instructions:F,context:N,attachments:L,body:V,redactError:(A,d)=>this.redactError(A,d,I),nonces:this.nonces,receipts:this.receipts,subject:X,...R?{memory:{scopes:R,...this.memoryMaxTokens!==void 0?{maxTokens:this.memoryMaxTokens}:{}}}:{},...Z?{jobs:{owner:X}}:{},...this.contextWindow!==void 0?{contextWindow:this.contextWindow}:{},...Z&&I6(this.store)?{summaryStore:this.store}:{},...this.prepareStep!==uQ.prototype.prepareStep?{prepareStep:(A)=>this.prepareStep(A,I)}:{}}),T=this.liveRuns.register(M,{threadId:Z,owner:X,clientRunId:Y,onEvent:(A)=>this.dispatchEvent(A,I),onInternalError:(A)=>this.reportHookFailure(A),maxRunDurationMs:this.agent.maxRunDurationMs});if(B=M,S)this.follow(M,S);let{stored:C,hooks:cQ}=this.persistRun(M,I,T,S,f);if(H6.set(M,C),XJ.has(J))XJ.set(J,{run:M,hooks:cQ});return J.ctx?.()?.waitUntil(cQ),M.toResponse()};try{await this.authorizeRequest(J,{route:"stream",threadId:Z,body:V});let P=await this.foreignFile([...K?.files??[],...Z?[]:L9($.messages)],X);if(P)return P;if(H?.cancelled)return U6();let O=await this.runLimitKey(J,{owner:X,threadId:Z}),F=O===null?bJ:K9(this.liveRuns).take(O,Z?`thread:${Z}`:`run:${crypto.randomUUID()}`,this.maxConcurrentRuns);if(!F)return fQ(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,X,D):await D()}finally{let N=B;if(N)N.result().then(F,F);else F()}}finally{if(H&&IJ.get(Y)===H)IJ.delete(Y)}}async withThread(J,Q,$){let Z=qJ.get(J)??Promise.resolve(),W,K=new Promise((Y)=>{W=Y}),G=Z.then(()=>K);qJ.set(J,G),await Z;try{let Y=await this.liveRuns.find({threadId:J});if(Y&&this.liveRuns.isRunning(Y.runId)&&!this.liveRuns.mayAccess(Y.runId,Q))return VJ();let V=Y?this.liveRuns.get(Y.runId):null;if(V)V.stop({reason:"superseded by a later turn on this thread"}),await H6.get(V);return await $()}finally{if(W(),qJ.get(J)===G)qJ.delete(J)}}async attach(J=new x){let Q=await YJ(J,wJ);if(Q.error)return t(Q);let $=Q.body,Z=typeof $.threadId==="string"?$.threadId:O9(J,"threadId");if(!Z)return _(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 VJ();if(!W)return _(404,{code:"no_live_run",message:`No run in progress for thread ${Z} in this process.`});let K=typeof $.runId==="string"?$.runId:void 0,G=K&&K!==W.runId?void 0:P9(J,$);try{return A6(this.liveRuns.replay(W.runId,G))}catch(Y){if(Y instanceof s)return _(410,{code:Y.code,message:Y.message,oldestSeq:Y.oldest});if(Y instanceof GJ)return _(404,{code:Y.code,message:Y.message});throw Y}}async stop(J=new x){let Q=await YJ(J,wJ);if(Q.error)return t(Q);let $=Q.body;await this.authorizeRequest(J,{route:"stop",threadId:typeof $.threadId==="string"?$.threadId:void 0});let Z=await this.runOwner(J),W=typeof $.runId==="string"?$.runId:void 0;if(!W&&typeof $.clientRunId==="string"){if(W=this.liveRuns.findByClientRunId($.clientRunId)??void 0,!W){let G=IJ.get($.clientRunId);if(G){if(G.owner!==null&&G.owner!==Z)return VJ();return G.cancelled=!0,{stopped:!0}}}}if(!W&&typeof $.threadId==="string")W=(await this.liveRuns.find({threadId:$.threadId}))?.runId;let K=W?this.liveRuns.get(W):null;if(!K)return{stopped:!1};if(!this.liveRuns.mayAccess(K.runId,Z))return VJ();return K.stop({reason:typeof $.reason==="string"?$.reason:void 0}),{stopped:!0}}attachmentScope(J,Q,$){let Z=J.ctx()?.user,W=Z?.id??Z?.publicId;if(W!==void 0&&W!==null&&String(W)!=="")return{key:`user:${String(W)}`};if(Q)return{key:`thread:${Q}`};return null}attachmentLimits(J){return null}checkUpload(J,Q,$){}attachmentDestination(J,Q,$){return"both"}async attachmentsFor(J,Q,$={body:{}}){let Z=await this.attachmentScope(J,Q,$);if(!Z)return null;return new yJ(this.attachments,this.attachmentStorage,Z)}async voiceStart(J=new x){let Q=this.voice;if(!Q)return qQ();let $=await YJ(J,wJ);if($.error)return t($);let{sdp:Z,threadId:W,pushToTalk:K}=$.body;if(typeof Z!=="string"||!Z.trimStart().startsWith("v="))return _(400,{code:"invalid_request",message:"`sdp` must be the browser's SDP offer."});let G=fJ($.body,M9),Y=typeof W==="string"&&W!==""?W:void 0;await this.authorizeRequest(J,{route:"stream",threadId:Y,body:G});let V=J.ctx?.()?.user??null,X=await Q.start({req:J,body:G,threadId:Y,user:V,pushToTalk:K===!0}),H=Date.now(),B,z=async(N)=>{if(N!==void 0)console.error("[gemi/ai] a voice session could not start.",N);if(B)await Q.realtime.hangup(B).catch((L)=>{console.error("[gemi/ai] a voice call that failed to start could not be hung up.",L)});try{await X.onEnd?.({sessionId:"",...B?{callId:B}:{},threadId:X.threadId??Y??"",reason:"start_failed",startedAt:H,endedAt:Date.now(),durationMs:0,seconds:0,usage:j(),transcription:{usage:j(),seconds:0},transcript:[],requests:[],toolCalls:[],errors:[]})}catch(L){console.error("[gemi/ai] a voice session's onEnd threw.",L)}},D=X.threadId??Y;if(!D)return await z(void 0),_(400,{code:"invalid_request",message:"A voice session needs a thread: send `threadId`, or answer one from `voice.start`."});try{if(D!==Y)await this.authorizeRequest(J,{route:"stream",threadId:D,body:G})}catch(N){throw await z(void 0),N}let U=crypto.randomUUID(),P=X.tools??[];try{if(X.mcp)P=[...P,...await UQ(X.mcp,{user:V,sessionId:U})]}catch(N){return await z(N),_(500,{code:"voice_unavailable",message:"Voice isn't available right now."})}let O={...X.session,tools:[...WJ(Q.delegate),...X.session?.tools??[],...P.map((N)=>N.tool)],...K===!0?{turnDetection:null}:{}},F;try{F=await Q.realtime.createCall({sdp:Z,session:O,safetyIdentifier:X.safetyIdentifier})}catch(N){await z(N);let L=N instanceof v&&N.code==="rate_limited";return _(L?429:502,{code:"voice_unavailable",message:"Voice isn't available right now."})}B=F.callId;try{await this.voiceStore.create({id:U,callId:F.callId,threadId:D,owner:await this.runOwner(J),body:G,startedAt:H});let{threadId:N,session:L,safetyIdentifier:R,mcp:S,tools:q,...I}=X;return{sessionId:p.start({...I,tools:P,controller:this.constructor,threadId:D,user:V,body:G,call:{realtime:Q.realtime,callId:F.callId},sessionId:U,store:this.voiceStore,liveRuns:this.liveRuns,delegate:Q.delegate,session:O}).sessionId,sdp:F.sdpAnswer,threadId:D,delegate:Q.delegate?.name??KJ,endsAt:H+(X.limits?.maxDurationMs??900000)}}catch(N){return await z(N),_(500,{code:"voice_unavailable",message:"Voice isn't available right now."})}}async voiceUpdate(J=new x){if(!this.voice)return qQ();let Q=await this.voiceSession(J);if(Q instanceof Response)return Q;let $=await YJ(J,wJ);if($.error)return t($);let Z=fJ($.body,[]);if(await this.authorizeRequest(J,{route:"stream",threadId:Q.threadId,body:Z}),Q.endedAt!==void 0)return _(409,{code:"voice_ended",message:"This voice session has ended."});return await this.voiceStore.update(Q.id,{body:Z}),p.get(Q.id)?.setBody(Z),{updated:!0}}async voiceEnd(J=new x){let Q=this.voice;if(!Q)return qQ();let $=await this.voiceSession(J);if($ instanceof Response)return $;if(await this.authorizeRequest(J,{route:"stream",threadId:$.threadId,body:$.body}),$.endedAt!==void 0)return{ended:!1};let Z=p.get($.id);if(Z)await Z.end("hangup");else await Q.realtime.hangup($.callId),await this.voiceStore.update($.id,{endedAt:Date.now(),endReason:"hangup"});return{ended:!0}}async voiceSession(J){let Q=J.params?.sessionId,$=typeof Q==="string"&&Q?await this.voiceStore.get(Q):null;if(!$)return _(404,{code:"voice_not_found",message:"No such voice session."});if($.owner!==null&&$.owner!==await this.runOwner(J))return VJ();return $}async upload(J=new x){let Q=await J.rawRequest.formData(),$=Q.get("file");if(!($ instanceof Blob))throw Error("upload expects a multipart body with a `file` field.");let Z=$ instanceof File&&$.name?$.name:"upload",W=$.type||"application/octet-stream",K=X9(Q.get("body")),G=Q.get("threadId");await this.authorizeRequest(J,{route:"upload",threadId:typeof G==="string"&&G.length>0?G:void 0,body:K});let Y=V9(await this.attachmentLimits(J),$,Z,W);if(Y)throw new bQ(Y.code,Y.message);let V=typeof G==="string"&&G.length>0&&await this.store.loadThread(G)!==null?G:void 0,X=await this.runOwner(J),H=(S)=>this.fileOwners.record(S,{owner:X,name:Z,mimeType:W,size:$.size,createdAt:new Date().toISOString()}),B={body:K,threadId:V},z=await this.checkUpload({name:Z,size:$.size,mimeType:W},J,B);if(z)throw new bQ(z.code||"upload_refused",z.message);let D=await this.attachmentDestination($,J,B),U=C9(D,Q.get("destination")),P=await this.attachmentScope(J,V,{body:K}),O=U!=="provider"&&!P;if(O){if(U==="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()`.');_9()}if(U==="provider"||!P){let S=await B6(this.agent.provider,$);await H(S);let q={fileId:S,name:Z,mimeType:W,size:$.size,destination:"provider"};if(O)q.downgraded="no_scope";return q}let F=E6(),N=await this.attachmentStorage.put({name:x6(F,Z),body:$,contentType:W}),L=U==="both"?await B6(this.agent.provider,$):void 0;if(L)await H(L);let R={id:F,scopeKey:P.key,fileId:L,objectName:N,name:Z,mimeType:W,size:$.size,createdAt:new Date().toISOString(),destination:U};return await this.attachments.put(P,R),{fileId:L,attachmentId:F,name:Z,mimeType:W,size:$.size,destination:U}}async foreignFile(J,Q){let $=new Set(J.map((Z)=>Z.fileId).filter((Z)=>typeof Z==="string"));for(let Z of $){let W=await this.fileOwners.get(Z);if(W?W.owner!==null&&W.owner!==Q:this.requireKnownFiles)return N9()}return null}onMessage(J,Q){}onToolCall(J,Q){}onAwaitingInput(J,Q){}redactError(J,Q,$){return yQ(J,Q)}onError(J,Q){}onStreamComplete(J,Q){}reportHookFailure(J){console.error("[gemi/ai] agent controller hook failed",J)}async dispatchEvent(J,Q){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},Q);return;case"awaiting-input":await this.onAwaitingInput(J.pending,Q);return;case"error":await this.onError(R6(J.error),Q);return;default:return}}async readThread(J){let Q=await this.store.loadThread(J);return Q?(await this.settleThread(J,Q,{write:!1})).messages:null}isRunLive(J,Q){return this.liveRuns.get(J)!==null}async settleThread(J,Q,{write:$}){let Z=(V)=>this.isRunLive(V,J),W=await W6(Q,Z),K=W.messages,G=[],Y=new Map(W.settled.map((V)=>[V.id,V]));if(R9(K)||$)try{let V=await Y6(K,{threadId:J,store:h.store,isRunLive:Z,outputSchemaFor:(X)=>this.toolOutputSchema(X),scan:this.jobsBlockMax()});K=V.messages,G=V.jobs;for(let X of V.settled)Y.set(X.id,X);if($&&V.orphans.length>0){await V6(h.store,V.orphans,(H)=>this.reportHookFailure(H));let X=new Set(V.orphans.map((H)=>H.id));G=G.map((H)=>X.has(H.id)?{...H,orphaned:!0}:H)}}catch(V){this.reportHookFailure(V)}if($&&Y.size>0)try{await this.store.appendMessages(J,[...Y.values()])}catch(V){this.reportHookFailure(V)}return{messages:K,jobs:G}}jobsBlockMax(){let J=this.agent.jobs?.contextBlock;if(J===!1)return 0;return J?.max??HJ}jobsBlock(J){return lQ(J,this.jobsBlockMax())}toolOutputSchema(J){let Q=($)=>{for(let Z of $){let W=Z;if(Array.isArray(W.tools)){let K=Q(W.tools);if(K)return K}else if(W.name===J)return W.outputSchema}return};return Q(this.agent.tools??[])}follow(J,Q){(async()=>{try{for await(let $ of J.frames())Q.frame($)}catch($){this.reportHookFailure($)}})()}persistRun(J,Q,$,Z=null,W={id:null,notified:Promise.resolve()}){let K=Promise.resolve(),G=(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},Q)));return}let X=V.messages;if(Z?.close(X),await Z?.settled(),Q.threadId&&X.length>0)try{await this.store.appendMessages(Q.threadId,X)}catch(H){this.reportHookFailure(H)}K=this.notifyRun(V,X,Q,W)})(),Y=G.then(()=>A9(Promise.all([K,$]).then(()=>{}),this.hookHoldMs));return{stored:G,hooks:Y}}async notifyRun(J,Q,$,Z){await Z.notified;for(let W of Q){if(W.id===Z.id)continue;await this.safely(()=>this.onMessage(W,$))}await this.safely(()=>this.onStreamComplete(J,$))}async safely(J){try{await J()}catch(Q){this.reportHookFailure(Q)}}}var IQ=["turn","clientRunId","threadId","messages","regenerate"],G9=["text","files","toolResults"];function fJ(J,Q=f6(J)?IQ:[...IQ,...G9]){let $={};for(let[Z,W]of Object.entries(J)){if(Q.includes(Z))continue;Object.defineProperty($,Z,{value:W,writable:!0,enumerable:!0,configurable:!0})}return $}function X9(J){if(J===null)return{};let Q;if(typeof J==="string")try{Q=JSON.parse(J)}catch{throw new wQ("The upload's `body` field is not valid JSON.")}if(Q===null||typeof Q!=="object"||Array.isArray(Q))throw new wQ("The upload's `body` field must be a JSON object.");return fJ(Q,IQ)}class wQ extends vJ{constructor(J){super(J);this.name="InvalidUploadError",this.payload={api:{status:400,data:{error:{code:"invalid_request",message:J}}},view:{}}}}async function B6(J,Q){try{return await J.upload(Q)}catch($){if($ instanceof w&&Y9.has($.status))throw new b6(k($).message);throw $}}var Y9=new Set([400,413,415,422]);class bQ extends vJ{constructor(J,Q){super(Q);this.name="LimitedUploadError",this.payload={api:{status:422,data:{error:{code:J,message:Q}}},view:{}}}}function V9(J,Q,$,Z){if(!J)return null;let{maxBytes:W,accept:K}=J;if(typeof W==="number"&&Q.size>W)return{code:"file_too_large",message:`${JSON.stringify($)} is ${F6(Q.size)}; the limit is ${F6(W)}.`};if(K&&K.length>0&&!K.some((G)=>H9(G,$,Z)))return{code:"unsupported_file_type",message:`${JSON.stringify($)} is not a type this chat accepts. Accepted: ${K.join(", ")}.`};return null}function H9(J,Q,$){let Z=J.trim().toLowerCase();if(!Z)return!1;if(Z.startsWith("."))return Q.toLowerCase().endsWith(Z);let W=$.toLowerCase().split(";")[0].trim();if(Z.endsWith("/*"))return W.startsWith(Z.slice(0,-1));return W===Z}function F6(J){if(J<1024)return`${J} B`;let Q=["KB","MB","GB"],$=J/1024,Z=0;while($>=1024&&Z<Q.length-1)$/=1024,Z++;return`${Math.round($*10)/10} ${Q[Z]}`}class b6 extends vJ{constructor(J){super(J);this.name="RejectedUploadError";let Q=/(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:Q,message:J}}},view:{}}}}async function YJ(J,Q){let $=J?.rawRequest;if(!$||$.method==="GET"||$.method==="HEAD"||!$.body)return{body:{}};if(!z9($.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($.headers.get("Content-Length"));if(Number.isFinite(Z)&&Z>Q)return P6(Q);let W;try{let G=await D9($,Q);if(G===null)return P6(Q);W=G}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 z9(J){return _6(J)==="application/json"}async function D9(J,Q){if(!Number.isFinite(Q)||!J.body)return await J.text();let $=J.body.getReader(),Z=[],W=0;for(;;){let{done:Y,value:V}=await $.read();if(Y)break;if(W+=V.byteLength,W>Q)return await $.cancel().catch(bJ),null;Z.push(V)}let K=new Uint8Array(W),G=0;for(let Y of Z)K.set(Y,G),G+=Y.byteLength;return new TextDecoder().decode(K)}function P6(J){return{body:{},status:413,code:"body_too_large",error:`The request body is larger than this agent accepts (${J} bytes).`}}function fQ(J,Q,$){return _(J,{...hJ(C6(J),$,J),code:Q})}function t(J){if(J.status===413)return fQ(413,J.code??"body_too_large",J.error??"");return _(J.status??400,{code:J.code??"invalid_request",message:J.error})}function f6(J){return Boolean(J.turn)&&typeof J.turn==="object"}function B9(J){let Q=f6(J)?J.turn:J,$={};if(typeof Q.text==="string")$.text=Q.text;if(Array.isArray(Q.files)){let Z=F9(Q.files);if(typeof Z==="string")return{error:Z};$.files=Z}if(Array.isArray(Q.toolResults))$.toolResults=Q.toolResults;if(Object.keys($).length===0)return{};if(Q===J.turn&&Q.localId!==void 0&&Q.localId!==null&&Q.localId!==""){let{localId:Z}=Q;if(typeof Z!=="string")return{error:"turn.localId must be a string."};if(Z.length>O6)return{error:`turn.localId is longer than ${O6} characters.`};$.localId=Z}return{turn:$}}var O6=200;function F9(J){let Q=[];for(let[$,Z]of J.entries()){let W=`turn.files[${$}]`;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 B=Z[H];if(B===void 0||B===null||B==="")continue;if(typeof B!=="string")return`${W}.${H} must be a string.`;K[H]=B}let{fileId:G,attachmentId:Y,name:V,mimeType:X}=K;if(G?.startsWith(m))return`${W}.fileId holds a gemi attachment id (${G}). \`fileId\` is the provider's id from the upload response; put this one in \`attachmentId\`.`;if(Y!==void 0&&!Y.startsWith(m))return`${W}.attachmentId is not a gemi attachment id: it must start with "${m}".`;if(!G&&!Y)return`${W} has neither a \`fileId\` nor an \`attachmentId\`. Send the ids the upload response answered.`;Q.push({...G?{fileId:G}:{},...Y?{attachmentId:Y}:{},...V!==void 0?{name:V}:{},...X!==void 0?{mimeType:X}:{}})}return Q}function P9(J,Q){if(typeof Q.from==="number"&&Number.isFinite(Q.from))return Math.max(0,Math.floor(Q.from));if(typeof Q.cursor==="number"&&Number.isFinite(Q.cursor)){let Z=Math.floor(Q.cursor);if(Z>=0)return Z+1;return}let $=J?.rawRequest?.headers?.get("Last-Event-ID");if($){let Z=Number.parseInt($,10);if(Number.isFinite(Z))return Math.max(0,Z+1)}return}function O9(J,Q){let $=J?.search?.get(Q);return typeof $==="string"?$:void 0}function U9(J){let Q=gQ(J);for(let $=J.length-1;$>=0;$--){let Z=J[$];if(Z.role!=="user"||Q.has(Z.id))continue;let W="",K=[];for(let G of Z.content){if(G.type==="text")W+=G.text;if(G.type==="file")K.push({...G.fileId?{fileId:G.fileId}:{},...G.attachmentId?{attachmentId:G.attachmentId}:{},...G.name?{name:G.name}:{},...G.mimeType?{mimeType:G.mimeType}:{}})}if(!W&&K.length===0)continue;return{index:$,turn:{...W?{text:W}:{},...K.length>0?{files:K}:{}}}}return null}function U6(){return _(409,{code:"stopped",message:"The turn was stopped before it started."})}function VJ(){return _(403,hJ("permission","This run belongs to someone else.",403))}function N9(){return _(403,hJ("permission","A file in this turn was uploaded by someone else.",403))}function L9(J){if(!Array.isArray(J))return[];let Q=[];for(let $ of J){let Z=$?.content;if(!Array.isArray(Z))continue;for(let W of Z)if(W&&typeof W==="object"&&typeof W.fileId==="string")Q.push({fileId:W.fileId})}return Q}var M9=["sdp","threadId","pushToTalk"];function qQ(){return _(404,{code:"voice_not_enabled",message:"This agent has no voice: set `voice` on its controller."})}function _(J,Q){return new Response(JSON.stringify({error:Q}),{status:J,headers:{"Content-Type":"application/json"}})}function C9(J,Q){if(typeof Q!=="string"||Q.length===0)return J;if(Q!=="both"&&Q!=="provider"&&Q!=="storage")throw Error(`Unknown attachment destination "${Q}". Expected "both", "provider" or "storage".`);if(Q===J||J==="both"&&Q==="storage")return Q;if(J==="both"&&Q==="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 "${Q}" 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 N6=!1;function _9(){if(N6)return;N6=!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 S9=2147483647;function A9(J,Q){let $=J.then(()=>{},()=>{});if(!(Q<=S9))return $;let Z,W=new Promise((K)=>{Z=setTimeout(K,Q)});return Promise.race([$,W]).finally(()=>clearTimeout(Z))}var L6=!1;function k9(J){if(L6||Bun.env.NODE_ENV!=="production")return;if(!(J instanceof vQ))return;L6=!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 R9(J){return J.some((Q)=>Q.content.some(($)=>$.type==="tool-result"&&$.status==="running"))}export{f9 as windowMessages,WJ as voiceTools,x9 as turnStarts,CJ as toRealtimeUsage,u6 as toAgentTools,E9 as supportsStrict,q9 as splitTurns,m9 as settleSummaries,j9 as s,yQ as redactError,I9 as messageSize,UQ as mcpVoiceTools,CQ as liveRuns,TQ as keepSummary,c$ as isCallNotFound,gQ as injectedMessageIds,a9 as generate,w8 as evalChain,LQ as defaultVoiceStore,c9 as defaultSummaryStore,hQ as defaultNonceStore,_Q as defaultFileOwners,gJ as defaultAttachmentStore,jQ as defaultAgentStore,TJ as VoiceHangup,p as VoiceBridge,oJ as ToolNamespace,g as ToolError,l9 as Skill,yJ as ScopedAttachments,d9 as SKILLS_NAMESPACE,RQ as RedisReceiptStore,k6 as RedisNonceStore,_J as RealtimeSideband,v as RealtimeRequestError,$J as RealtimeClient,p9 as PendingEscalation,BQ as OpenAIProvider,eJ as OpenAIImageProvider,NQ as MemoryVoiceSessionStore,u9 as MemorySummaryStore,kQ as MemoryReceiptStore,vQ as MemoryNonceStore,jJ as MemoryLiveRuns,EJ as MemoryFileOwners,kJ as MemoryCircuitStore,q6 as MemoryAttachmentStore,xJ as MemoryAgentStore,oQ as MemoryAgentJobStore,z$ as MEMORY_NAMESPACE,GJ as LiveRunNotFoundError,sQ as JobsRequireThreadError,aQ as JobHandle,T9 as JSONSchemaError,j6 as InvalidAttachmentScopeError,K$ as InMemoryAgentMemoryStore,NJ as ImageRequestError,LJ as ImageProvider,aJ as ImageModel,s as FrameCursorEvictedError,ZJ as FallbackProvider,V$ as FakeAgentMemoryStore,iJ as DatabaseAgentMemoryStore,lJ as DatabaseAgentJobStore,g$ as DEFAULT_TRANSCRIPTION_MODEL,W$ as DEFAULT_MEMORY_MAX_TOKENS,H$ as DEFAULT_MEMORY_LIMITS,v9 as DEFAULT_MAX_SUMMARY_TOKENS,i9 as DEFAULT_MAX_RUN_DURATION_MS,tQ as DEFAULT_JOB_DEADLINE_MS,HJ as DEFAULT_JOBS_CONTEXT_MAX,KJ as DEFAULT_DELEGATE_NAME,w9 as DEFAULT_CONTEXT_WINDOW_STEP,b9 as DEFAULT_CONTEXT_WINDOW_NOTE,h9 as DEFAULT_COMPACT_TRIGGER_TOKENS,y9 as DEFAULT_COMPACT_INSTRUCTIONS,g9 as COMPACT_SUMMARY_HEADER,FQ as AzureOpenAIProvider,JQ as AzureOpenAIImageProvider,T6 as AttachmentNotFoundError,uJ as AgentTurnError,OJ as AgentTool,n9 as AgentRunError,a as AgentProvider,G$ as AgentMemoryRefusedError,X$ as AgentMemoryConflictError,Y$ as AgentMemories,h as AgentJobs,cJ as AgentJobDeadlineSweep,rQ as AgentJob,uQ as AgentController,o9 as Agent};
|
|
154
154
|
|
|
155
|
-
//# debugId=
|
|
155
|
+
//# debugId=89E3AF8E08C9B4AC64756E2164756E21
|