gemi 0.79.0 → 0.81.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/Agent.d.ts +83 -2
- package/dist/ai/Agent.d.ts.map +1 -1
- package/dist/ai/AgentProvider.d.ts +10 -1
- package/dist/ai/AgentProvider.d.ts.map +1 -1
- package/dist/ai/index.d.ts +2 -2
- package/dist/ai/index.d.ts.map +1 -1
- package/dist/ai/index.js +9 -9
- package/dist/ai/index.js.map +7 -7
- package/dist/ai/providers/call.d.ts.map +1 -1
- package/dist/ai/providers/errors.d.ts +12 -0
- package/dist/ai/providers/errors.d.ts.map +1 -1
- package/dist/ai/store/stubAgentRun.d.ts +2 -2
- package/dist/ai/store/stubAgentRun.d.ts.map +1 -1
- package/dist/app/index.js +1 -1
- package/dist/broadcasting/index.js +1 -1
- package/dist/bun/plugin.js +1 -1
- package/dist/bun/preload.js +1 -1
- package/dist/{chunk-axxbkm30.js → chunk-03xrgp1m.js} +2 -2
- package/dist/{chunk-axxbkm30.js.map → chunk-03xrgp1m.js.map} +1 -1
- package/dist/{chunk-jcq0tbdv.js → chunk-06p4zq4m.js} +2 -2
- package/dist/{chunk-jcq0tbdv.js.map → chunk-06p4zq4m.js.map} +1 -1
- package/dist/{chunk-0472aphj.js → chunk-0zr926cf.js} +2 -2
- package/dist/{chunk-0472aphj.js.map → chunk-0zr926cf.js.map} +1 -1
- package/dist/{chunk-q0nqypca.js → chunk-1dgab0qn.js} +2 -2
- package/dist/{chunk-q0nqypca.js.map → chunk-1dgab0qn.js.map} +1 -1
- package/dist/{chunk-yernnzqs.js → chunk-1k783c44.js} +2 -2
- package/dist/{chunk-yernnzqs.js.map → chunk-1k783c44.js.map} +1 -1
- package/dist/chunk-2c89p8pf.js +6 -0
- package/dist/chunk-2c89p8pf.js.map +10 -0
- package/dist/{chunk-ss7ymqfm.js → chunk-2frgq249.js} +2 -2
- package/dist/{chunk-ss7ymqfm.js.map → chunk-2frgq249.js.map} +1 -1
- package/dist/{chunk-0pqsp84p.js → chunk-2gprnzc3.js} +2 -2
- package/dist/{chunk-0pqsp84p.js.map → chunk-2gprnzc3.js.map} +1 -1
- package/dist/{chunk-34s3tfgk.js → chunk-2y9haf48.js} +3 -3
- package/dist/{chunk-34s3tfgk.js.map → chunk-2y9haf48.js.map} +1 -1
- package/dist/{chunk-qjgfrsw7.js → chunk-3h1pd6ec.js} +2 -2
- package/dist/{chunk-qjgfrsw7.js.map → chunk-3h1pd6ec.js.map} +1 -1
- package/dist/{chunk-qgvg10ad.js → chunk-5krm6p9w.js} +3 -3
- package/dist/{chunk-qgvg10ad.js.map → chunk-5krm6p9w.js.map} +1 -1
- package/dist/{chunk-fmhkn266.js → chunk-6c0s1mb7.js} +2 -2
- package/dist/{chunk-fmhkn266.js.map → chunk-6c0s1mb7.js.map} +1 -1
- package/dist/{chunk-zzh52t0y.js → chunk-6eprvf4s.js} +2 -2
- package/dist/{chunk-zzh52t0y.js.map → chunk-6eprvf4s.js.map} +1 -1
- package/dist/{chunk-27pnn95c.js → chunk-6sd7an1r.js} +2 -2
- package/dist/{chunk-27pnn95c.js.map → chunk-6sd7an1r.js.map} +1 -1
- package/dist/{chunk-n03frt02.js → chunk-7dk4b1fn.js} +2 -2
- package/dist/{chunk-n03frt02.js.map → chunk-7dk4b1fn.js.map} +1 -1
- package/dist/{chunk-443yr2km.js → chunk-7y6gpg08.js} +3 -3
- package/dist/{chunk-443yr2km.js.map → chunk-7y6gpg08.js.map} +1 -1
- package/dist/chunk-817dxq6w.js +7 -0
- package/dist/{chunk-4h7z32zp.js.map → chunk-817dxq6w.js.map} +10 -7
- package/dist/{chunk-yaz93haz.js → chunk-8vnb3hfz.js} +2 -2
- package/dist/{chunk-yaz93haz.js.map → chunk-8vnb3hfz.js.map} +1 -1
- package/dist/{chunk-sqvw7rv2.js → chunk-9146818v.js} +3 -3
- package/dist/{chunk-sqvw7rv2.js.map → chunk-9146818v.js.map} +1 -1
- package/dist/chunk-9hbwvcxn.js.map +2 -2
- package/dist/{chunk-eekg7k6d.js → chunk-9z5g1rf6.js} +1 -1
- package/dist/{chunk-1ap69pez.js → chunk-a3mgkrb2.js} +1 -1
- package/dist/{chunk-tpdsfr2k.js → chunk-actjm3wr.js} +2 -2
- package/dist/{chunk-tpdsfr2k.js.map → chunk-actjm3wr.js.map} +1 -1
- package/dist/{chunk-tnt0ybj9.js → chunk-aecx542w.js} +2 -2
- package/dist/{chunk-tnt0ybj9.js.map → chunk-aecx542w.js.map} +1 -1
- package/dist/{chunk-s7hv9qgp.js → chunk-bwwjkdts.js} +2 -2
- package/dist/{chunk-s7hv9qgp.js.map → chunk-bwwjkdts.js.map} +1 -1
- package/dist/{chunk-dmdmt3gw.js → chunk-d07y2ddw.js} +2 -2
- package/dist/{chunk-dmdmt3gw.js.map → chunk-d07y2ddw.js.map} +1 -1
- package/dist/{chunk-7yhsy039.js → chunk-d2esms7y.js} +2 -2
- package/dist/{chunk-7yhsy039.js.map → chunk-d2esms7y.js.map} +1 -1
- package/dist/{chunk-sbqy6r29.js → chunk-d2tpgkg2.js} +1 -1
- package/dist/{chunk-6h5gvcs8.js → chunk-dk0kdrkm.js} +2 -2
- package/dist/{chunk-6h5gvcs8.js.map → chunk-dk0kdrkm.js.map} +1 -1
- package/dist/{chunk-3vtwbcwm.js → chunk-edhafzvs.js} +2 -2
- package/dist/{chunk-3vtwbcwm.js.map → chunk-edhafzvs.js.map} +1 -1
- package/dist/{chunk-3hfwbp2m.js → chunk-egw90hq5.js} +2 -2
- package/dist/{chunk-3hfwbp2m.js.map → chunk-egw90hq5.js.map} +1 -1
- package/dist/{chunk-sp4wwg7s.js → chunk-f46ntdj3.js} +3 -3
- package/dist/{chunk-sp4wwg7s.js.map → chunk-f46ntdj3.js.map} +1 -1
- package/dist/{chunk-rv9k5bqn.js → chunk-f9mwxne0.js} +2 -2
- package/dist/{chunk-rv9k5bqn.js.map → chunk-f9mwxne0.js.map} +1 -1
- package/dist/{chunk-0da5t7vs.js → chunk-fffph77x.js} +2 -2
- package/dist/{chunk-0da5t7vs.js.map → chunk-fffph77x.js.map} +1 -1
- package/dist/{chunk-e97kq9tn.js → chunk-fpy7m803.js} +2 -2
- package/dist/{chunk-e97kq9tn.js.map → chunk-fpy7m803.js.map} +1 -1
- package/dist/{chunk-mmhf39tr.js → chunk-fya5147b.js} +2 -2
- package/dist/{chunk-mmhf39tr.js.map → chunk-fya5147b.js.map} +1 -1
- package/dist/{chunk-ezae18wm.js → chunk-gppm9gkg.js} +2 -2
- package/dist/{chunk-ezae18wm.js.map → chunk-gppm9gkg.js.map} +1 -1
- package/dist/{chunk-rkx6qhwg.js → chunk-gzx3rskd.js} +4 -4
- package/dist/{chunk-rkx6qhwg.js.map → chunk-gzx3rskd.js.map} +1 -1
- package/dist/{chunk-b941c34r.js → chunk-hfxx52vr.js} +2 -2
- package/dist/{chunk-b941c34r.js.map → chunk-hfxx52vr.js.map} +1 -1
- package/dist/{chunk-j1w19cec.js → chunk-mc1xsz8j.js} +3 -3
- package/dist/{chunk-j1w19cec.js.map → chunk-mc1xsz8j.js.map} +1 -1
- package/dist/{chunk-q623tx9p.js → chunk-mmq47yh3.js} +2 -2
- package/dist/{chunk-q623tx9p.js.map → chunk-mmq47yh3.js.map} +1 -1
- package/dist/{chunk-989rzqd6.js → chunk-mwrh96hx.js} +3 -3
- package/dist/{chunk-989rzqd6.js.map → chunk-mwrh96hx.js.map} +1 -1
- package/dist/chunk-nc82trtm.js +5 -0
- package/dist/{chunk-cr9f0s09.js.map → chunk-nc82trtm.js.map} +1 -1
- package/dist/{chunk-sww4kgk4.js → chunk-nq2hm5xm.js} +2 -2
- package/dist/{chunk-sww4kgk4.js.map → chunk-nq2hm5xm.js.map} +1 -1
- package/dist/{chunk-dgqqv3pb.js → chunk-q7ngq6c5.js} +2 -2
- package/dist/{chunk-dgqqv3pb.js.map → chunk-q7ngq6c5.js.map} +1 -1
- package/dist/chunk-rs0xmd64.js +17 -0
- package/dist/{chunk-e8z3nyd5.js.map → chunk-rs0xmd64.js.map} +4 -6
- package/dist/{chunk-1qwkhbc4.js → chunk-s7rhttvd.js} +2 -2
- package/dist/{chunk-1qwkhbc4.js.map → chunk-s7rhttvd.js.map} +1 -1
- package/dist/{chunk-njh95es7.js → chunk-sexaj89x.js} +2 -2
- package/dist/{chunk-njh95es7.js.map → chunk-sexaj89x.js.map} +1 -1
- package/dist/{chunk-j8nbjpkg.js → chunk-t2htq1v0.js} +2 -2
- package/dist/{chunk-j8nbjpkg.js.map → chunk-t2htq1v0.js.map} +1 -1
- package/dist/{chunk-fms4fcd1.js → chunk-t6yzarvt.js} +2 -2
- package/dist/{chunk-fms4fcd1.js.map → chunk-t6yzarvt.js.map} +1 -1
- package/dist/{chunk-xzp2ptj5.js → chunk-v0j7spj5.js} +2 -2
- package/dist/{chunk-fd0n8sav.js.map → chunk-v0j7spj5.js.map} +1 -1
- package/dist/{chunk-hg1fahzx.js → chunk-v6nhcpsb.js} +2 -2
- package/dist/{chunk-hg1fahzx.js.map → chunk-v6nhcpsb.js.map} +1 -1
- package/dist/{chunk-zjg31baf.js → chunk-v8s1dmc2.js} +2 -2
- package/dist/{chunk-zjg31baf.js.map → chunk-v8s1dmc2.js.map} +1 -1
- package/dist/{chunk-gzs2y282.js → chunk-vax2fp2k.js} +2 -2
- package/dist/{chunk-gzs2y282.js.map → chunk-vax2fp2k.js.map} +1 -1
- package/dist/{chunk-zkty5j42.js → chunk-vngyybzh.js} +2 -2
- package/dist/{chunk-zkty5j42.js.map → chunk-vngyybzh.js.map} +1 -1
- package/dist/{chunk-bdfdjnht.js → chunk-vqexqkfk.js} +3 -3
- package/dist/{chunk-bdfdjnht.js.map → chunk-vqexqkfk.js.map} +1 -1
- package/dist/{chunk-fvn78g6k.js → chunk-vxxk4syx.js} +2 -2
- package/dist/{chunk-fvn78g6k.js.map → chunk-vxxk4syx.js.map} +1 -1
- package/dist/{chunk-1712rv0r.js → chunk-wmbpdjvs.js} +2 -2
- package/dist/{chunk-1712rv0r.js.map → chunk-wmbpdjvs.js.map} +1 -1
- package/dist/{chunk-5ddn8mfj.js → chunk-y7gfg6tj.js} +2 -2
- package/dist/{chunk-5ddn8mfj.js.map → chunk-y7gfg6tj.js.map} +1 -1
- package/dist/chunk-z9x8fx21.js +5 -0
- package/dist/{chunk-9z3y20ms.js.map → chunk-z9x8fx21.js.map} +3 -3
- package/dist/{chunk-m2bmwre5.js → chunk-zbpgt20r.js} +2 -2
- package/dist/{chunk-m2bmwre5.js.map → chunk-zbpgt20r.js.map} +1 -1
- package/dist/{chunk-avhgqsc8.js → chunk-zdg024wf.js} +2 -2
- package/dist/{chunk-avhgqsc8.js.map → chunk-zdg024wf.js.map} +1 -1
- package/dist/{chunk-fd0n8sav.js → chunk-zv7417j0.js} +2 -2
- package/dist/{chunk-xzp2ptj5.js.map → chunk-zv7417j0.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/DatabaseServiceProvider.d.ts +12 -0
- package/dist/database/DatabaseServiceProvider.d.ts.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/Storage.d.ts +8 -2
- package/dist/facades/Storage.d.ts.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/Server.d.ts.map +1 -1
- package/dist/server/devReload.d.ts +68 -0
- package/dist/server/devReload.d.ts.map +1 -0
- package/dist/server/index.js +2 -2
- package/dist/server/index.js.map +5 -4
- package/dist/services/file-storage/drivers/AzureBlobDriver.d.ts +7 -3
- package/dist/services/file-storage/drivers/AzureBlobDriver.d.ts.map +1 -1
- package/dist/services/file-storage/drivers/FileStorageDriver.d.ts +2 -2
- package/dist/services/file-storage/drivers/FileStorageDriver.d.ts.map +1 -1
- package/dist/services/file-storage/drivers/FileSystemDriver.d.ts +2 -2
- package/dist/services/file-storage/drivers/FileSystemDriver.d.ts.map +1 -1
- package/dist/services/file-storage/drivers/S3Driver.d.ts +2 -2
- package/dist/services/file-storage/drivers/S3Driver.d.ts.map +1 -1
- package/dist/services/file-storage/drivers/abortableBody.d.ts +16 -0
- package/dist/services/file-storage/drivers/abortableBody.d.ts.map +1 -0
- package/dist/services/file-storage/drivers/types.d.ts +10 -1
- package/dist/services/file-storage/drivers/types.d.ts.map +1 -1
- package/dist/services/index.d.ts +1 -1
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +8 -8
- package/dist/services/index.js.map +4 -4
- package/dist/services/queue/work.js +2 -2
- package/dist/services/queue/work.js.map +1 -1
- package/dist/services/redis/RedisManager.d.ts +5 -0
- package/dist/services/redis/RedisManager.d.ts.map +1 -1
- package/dist/services/redis/RedisServiceProvider.d.ts +6 -0
- package/dist/services/redis/RedisServiceProvider.d.ts.map +1 -1
- package/dist/support/ServiceProvider.d.ts +6 -0
- package/dist/support/ServiceProvider.d.ts.map +1 -1
- package/dist/support/index.js +2 -2
- package/dist/support/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-3jyz4378.js +0 -6
- package/dist/chunk-3jyz4378.js.map +0 -10
- package/dist/chunk-4h7z32zp.js +0 -5
- package/dist/chunk-9z3y20ms.js +0 -5
- package/dist/chunk-cr9f0s09.js +0 -5
- package/dist/chunk-e8z3nyd5.js +0 -19
- /package/dist/{chunk-eekg7k6d.js.map → chunk-9z5g1rf6.js.map} +0 -0
- /package/dist/{chunk-1ap69pez.js.map → chunk-a3mgkrb2.js.map} +0 -0
- /package/dist/{chunk-sbqy6r29.js.map → chunk-d2tpgkg2.js.map} +0 -0
package/dist/ai/index.js
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{Gb as
|
|
2
|
+
import{Gb as v$,Hb as GQ}from"../chunk-zbhqa2z7.js";import{$e as X9,Ke as Y9,cf as p,qf as V9,sf as q6}from"../chunk-817dxq6w.js";import{vf as ZQ}from"../chunk-vax2fp2k.js";import"../chunk-mwrh96hx.js";import"../chunk-fffph77x.js";import"../chunk-vxxk4syx.js";import"../chunk-8vnb3hfz.js";import"../chunk-v0j7spj5.js";import{createHmac as D9,randomBytes as aQ,timingSafeEqual as eQ}from"crypto";var OQ="agt1",Q6=86400000;function l(Q){let $=Q??process.env.SECRET;if(!$)throw Error("Signing a pending tool call needs an app secret. Set SECRET in the environment.");return $}function R(Q){if(Q===null||typeof Q!=="object")return JSON.stringify(Q)??"null";if(Array.isArray(Q))return`[${Q.map(R).join(",")}]`;let $=Q;return`{${Object.keys($).filter((G)=>$[G]!==void 0).sort().map((G)=>`${JSON.stringify(G)}:${R($[G])}`).join(",")}}`}function U9(Q){return Q.map(($)=>`${$.length}:${$}`).join("")}function d(Q,$){return D9("sha256",Q).update(U9($)).digest()}function $6(Q,$,Z){let G=[OQ,Q.runId,Q.toolCallId,Q.name,Q.kind,$,String(Z),R(Q.input)];if(Q.path&&Q.path.length>0)G.push(R(Q.path));return G}var Z6=(Q)=>Buffer.from(Q,"utf8").toString("base64url"),z9=(Q)=>Buffer.from(Q,"base64url").toString("utf8");function G6(Q,$={}){let Z=l($.secret),J=($.now??Date.now())+($.ttlMs??Q6),W=aQ(12).toString("base64url"),Y=d(Z,$6(Q,W,J)).toString("base64url");return[OQ,Z6(Q.runId),W,J.toString(36),Y].join(".")}function i(Q){return NQ(Q,OQ)}function NQ(Q,$){let Z=Q.split(".");if(Z.length!==5||Z[0]!==$)return null;let G=Number.parseInt(Z[3],36);if(!Number.isFinite(G))return null;try{return{runId:z9(Z[1]),nonce:Z[2],expiresAt:G}}catch{return null}}function J6(Q,$,Z={}){let G=l(Z.secret),J=i(Q);if(!J)return{ok:!1,reason:"malformed"};let W=Buffer.from(Q.split(".")[4],"base64url"),Y=d(G,$6($,J.nonce,J.expiresAt));if(W.length!==Y.length||!eQ(W,Y))return{ok:!1,reason:"forged"};if((Z.now??Date.now())>J.expiresAt)return{ok:!1,reason:"expired"};return{ok:!0,runId:J.runId,nonce:J.nonce,expiresAt:J.expiresAt}}var o="agn1";function W6(Q,$,Z){return[o,Q.runId,R(Q.path),Q.nestedRunId,$,String(Z),R([...Q.open].sort()),R(Q.input)]}function Y6(Q,$={}){let Z=l($.secret),J=($.now??Date.now())+($.ttlMs??Q6),W=aQ(12).toString("base64url"),Y=d(Z,W6(Q,W,J)).toString("base64url");return[o,Z6(Q.runId),W,J.toString(36),Y].join(".")}function X6(Q,$,Z={}){let G=l(Z.secret),J=NQ(Q,o);if(!J)return{ok:!1,reason:"malformed"};let W=Buffer.from(Q.split(".")[4],"base64url"),Y=d(G,W6({...$,runId:J.runId},J.nonce,J.expiresAt));if(W.length!==Y.length||!eQ(W,Y))return{ok:!1,reason:"forged"};if((Z.now??Date.now())>J.expiresAt)return{ok:!1,reason:"expired"};return{ok:!0,runId:J.runId,nonce:J.nonce,expiresAt:J.expiresAt}}var I=new Map,V6=1024;function F9(Q){for(let[$,Z]of I)if(Z<=Q)I.delete($);V6=Math.max(1024,I.size*2)}function K6(Q,$={}){return B6(i(Q),$)}function H6(Q,$={}){return B6(NQ(Q,o),$)}function B6(Q,$){if(!Q)return!1;let Z=$.now??Date.now();if(I.size>=V6)F9(Z);let G=I.get(Q.nonce);if(G!==void 0&&G>Z)return!1;return I.set(Q.nonce,Q.expiresAt),!0}class y extends Error{id;code="attachment_not_found";constructor(Q){super(`No attachment ${Q}.`);this.id=Q;this.name="AttachmentNotFoundError"}}class w extends Error{code="invalid_attachment_scope";constructor(Q){super(Q);this.name="InvalidAttachmentScopeError"}}function _Q(Q){if(!Q||typeof Q.key!=="string"||Q.key.length===0)throw new w("An attachment scope needs a non-empty key. Return `null` from `attachmentScope()` for a request that has no subject \u2014 an empty key is a bucket every caller shares.");return Q}var P="gemi_att_";function CQ(){return`${P}${crypto.randomUUID()}`}class h{store;storage;scope;constructor(Q,$,Z){this.store=Q;this.storage=$;this.scope=Z;_Q(Z)}async get(Q){let $=await this.store.find(this.scope,Q);if(!$||$.scopeKey!==this.scope.key)throw new y(Q);return $}async read(Q){return await this.readRecord(Q,await this.get(Q))}async readRecord(Q,$){if(!$.objectName)throw new y(Q);return await this.storage.read({name:$.objectName})}async file(Q){let $=await this.get(Q),G=(await this.readRecord(Q,$)).body,J=G instanceof Blob?G:G?await new Response(G).blob():new Blob([]);return new File([J],$.name,{type:$.mimeType})}async put(Q,$={}){let Z=CQ(),G=$.mimeType??Q.type??"",J=$.name??(Q instanceof File?Q.name:Z),W=await this.storage.put({name:PQ(Z,J),body:Q,contentType:G||void 0}),Y={id:Z,scopeKey:this.scope.key,objectName:W,name:J,mimeType:G||"application/octet-stream",size:Q.size,createdAt:new Date().toISOString(),destination:$.fileId?"both":"storage",...$.fileId?{fileId:$.fileId}:{}};return await this.store.put(this.scope,Y),Y}}function PQ(Q,$){let Z=/\.([A-Za-z0-9]{1,8})$/.exec($);return`attachments/${Q}${Z?`.${Z[1].toLowerCase()}`:""}`}class n{rows=new Map;async put(Q,$){_Q(Q),this.rows.set($.id,{...$,scopeKey:Q.key})}async find(Q,$){_Q(Q);let Z=this.rows.get($);if(!Z||Z.scopeKey!==Q.key)return null;return Z}get size(){return this.rows.size}}var s=new n;class t extends Error{status;body;requestId;constructor(Q,$,Z){super(`Provider request failed with status ${Q}: ${L9($)}`);this.name="ProviderHttpError",this.status=Q,this.body=$,this.requestId=Z}}class r extends Error{timeoutMs;constructor(Q){super(`Provider request timed out after ${Q}ms`);this.name="ProviderTimeoutError",this.timeoutMs=Q}}function L9(Q){let $=D6(Q);if($?.message)return $.message;if(typeof Q==="string")return Q.slice(0,500);return"no error body"}function D6(Q){if(!Q||typeof Q!=="object")return null;let $=Q,G=$.error&&typeof $.error==="object"?$.error:Q;if(typeof G.message!=="string"&&typeof G.code!=="string"&&typeof G.type!=="string")return null;let J=G.innererror?.code??G.code;return{message:G.message,type:G.type,code:J,param:G.param}}function u(Q){if(!Q||typeof Q!=="object")return{};let{status:$,requestId:Z}=Q;return{...typeof $==="number"&&$>=100&&$<=599?{status:$}:{},...typeof Z==="string"&&Z?{requestId:Z}:{}}}function _(Q){if(Q instanceof r)return{code:"provider_error",message:Q.message,retryable:!0};if(C9(Q))return{code:"aborted",message:"The request was aborted.",retryable:!1};if(Q instanceof t)return O9(Q.status,D6(Q.body),Q.message);if(Q instanceof TypeError)return{code:"provider_error",message:`Could not reach the provider: ${Q.message}`,retryable:!0};if(Q instanceof Error)return{code:"provider_error",message:Q.message,retryable:!1};return{code:"unknown",message:String(Q),retryable:!1}}function O9(Q,$,Z){let G=$?.message??Z,J=($?.code??"").toLowerCase(),W=($?.type??"").toLowerCase(),Y=`${J} ${W} ${G}`.toLowerCase();if(Q===429){let V=J==="insufficient_quota"||Y.includes("quota");return{code:"rate_limited",message:G,retryable:!V}}if(Q>=500||Q===408||Q===409)return{code:"provider_error",message:G,retryable:!0};if(N9(Y))return{code:"context_length_exceeded",message:G,retryable:!1};if(_9(Y))return{code:"content_filtered",message:G,retryable:!1};if($?.param?.startsWith("tools")||Y.includes("invalid schema for function"))return{code:"invalid_tool_input",message:G,retryable:!1};return{code:"provider_error",message:G,retryable:!1}}function N9(Q){return Q.includes("context_length_exceeded")||Q.includes("maximum context length")||Q.includes("context window")||Q.includes("reduce the length")}function _9(Q){return Q.includes("content_filter")||Q.includes("content_policy_violation")||Q.includes("responsibleaipolicyviolation")||Q.includes("content management policy")}function C9(Q){if(!Q||typeof Q!=="object")return!1;let $=Q;return $.name==="AbortError"||$.code==="ABORT_ERR"}var jQ=new TextEncoder;function U6(Q){return`id: ${Q.seq}
|
|
3
3
|
data: ${JSON.stringify(Q.event)}
|
|
4
4
|
|
|
5
|
-
`}var
|
|
5
|
+
`}var P9=5000,j9=`: keepalive
|
|
6
6
|
|
|
7
|
-
`;function
|
|
8
|
-
${await
|
|
7
|
+
`;function MQ(Q,$=P9){let Z=null,G=!1,J=()=>{if(G)return;if(Z!==null)clearTimeout(Z);Z=setTimeout(()=>{if(Z=null,G)return;try{Q.enqueue(jQ.encode(j9))}catch{W();return}J()},$)},W=()=>{if(G=!0,Z!==null)clearTimeout(Z);Z=null};return J(),{touch:J,stop:W}}function M9(){return{"Content-Type":"text/event-stream","Cache-Control":"no-store, no-transform",Connection:"keep-alive","X-Accel-Buffering":"no"}}function z6(Q,$=200){let Z=Q[Symbol.asyncIterator](),G=-1,J,W=new ReadableStream({start(Y){J=MQ(Y)},async pull(Y){try{let V=await Z.next();if(V.done){J.stop(),Y.close();return}G=V.value.seq,Y.enqueue(jQ.encode(U6(V.value))),J.touch()}catch(V){let X={type:"error",error:q9(V)};J.stop(),Y.enqueue(jQ.encode(U6({seq:G+1,event:X}))),Y.close()}},cancel(Y){J.stop(),Z.return?.(Y)}});return new Response(W,{status:$,headers:M9()})}function q9(Q){return{code:"unknown",message:Q instanceof Error?Q.message:String(Q),retryable:!1}}class T extends Error{pending;path;nested;constructor(Q){super(`A nested agent run is waiting on the user for ${Q.pending.length} tool call(s).`);this.name="PendingEscalation",this.pending=Q.pending,this.path=Q.path,this.nested=Q.nested}}class A{name;description;inputSchema;outputSchema;requiresApproval;deferred;answeredBy;execute;constructor(Q){this.name=Q.name,this.description=Q.description,this.inputSchema=Q.inputSchema,this.outputSchema=Q.outputSchema,this.requiresApproval=Q.requiresApproval===!0,this.deferred=Q.deferred===!0,this.answeredBy=Q.answeredBy==="client"?"client":"server",this.execute=Q.execute??void 0}static create(Q){return S6(Q.inputSchema,`The tool "${Q.name}"`,"inputSchema"),new A(Q)}static ask(Q){return A.create({name:Q.name,description:Q.description,inputSchema:RQ,outputSchema:Q.outputSchema,answeredBy:"client"})}}var RQ={toJSONSchema:()=>({type:"object",properties:{question:{type:"string",description:"What to ask the user"}},required:["question"],additionalProperties:!1}),parse(Q){let $=RQ.safeParse(Q);if($.ok===!1)throw Error($.errors.join(", "));return $.value},safeParse(Q){if(typeof Q!=="object"||Q===null||typeof Q.question!=="string")return{ok:!1,errors:["question: expected a string"]};return{ok:!0,value:{question:Q.question}}}};class JQ{name;description;tools;deferred;constructor(Q){this.name=Q.name,this.description=Q.description,this.tools=Q.tools,this.deferred=Q.deferred===!0}static create(Q){return new JQ(Q)}}class TQ{name;description;instructions;files;constructor(Q){this.name=Q.name,this.description=Q.description,this.instructions=Q.instructions,this.files=Q.files}static create(Q){return new TQ(Q)}}var g="skills",S9="Instructions this agent can load on demand. Load the relevant one before acting in the area it covers.";function S6(Q,$,Z){let G=Q?.toJSONSchema?.();if(G?.type==="object")return;let J=!G?"no JSON Schema":G.anyOf?"a union (`anyOf`) \u2014 `s.union(...)`":G.type!==void 0?`a schema of type ${JSON.stringify(G.type)}`:"an unconstrained schema (`s.json()`)";throw Error(`${$} declares an \`${Z}\` whose root is ${J}, but the provider only accepts an object there (OpenAI rejects \`anyOf\` or a non-object at the root of tool parameters and structured output). Wrap it in an object, e.g. \`s.object({ value: s.union([...]) })\`, and read \`.value\` off the result.`)}var R6={type:"object",properties:{},required:[],additionalProperties:!1};class kQ extends Error{code;retryable;status;requestId;toolCallId;runId;result;constructor(Q){super(Q.error.message);this.name="AgentRunError",this.code=Q.error.code,this.retryable=Q.error.retryable,this.status=Q.error.status,this.requestId=Q.error.requestId,this.toolCallId=Q.error.toolCallId,this.runId=Q.runId,this.result=Q}}function R9(Q){return{code:Q.code,message:Q.message,...Q.toolCallId!==void 0?{toolCallId:Q.toolCallId}:{},retryable:Q.retryable}}var T9=8,k9=3;class AQ{name;tools;skills;provider;output;instructions;maxSteps;maxDepth;reasoning;config;constructor(Q){this.name=Q.name,this.instructions=Q.instructions,this.provider=Q.provider,this.tools=Q.tools??[],this.skills=Q.skills??[],this.output=Q.output,this.maxSteps=Q.maxSteps??T9,this.maxDepth=Q.maxDepth??k9,this.reasoning=Q.reasoning;let{registry:$,providerTools:Z}=A9(this.tools,this.skills);this.config={name:this.name,instructions:this.instructions,provider:this.provider,registry:$,providerTools:Z,output:Q.output,maxSteps:this.maxSteps,maxDepth:this.maxDepth,reasoning:this.reasoning,maxOutputTokens:Q.maxOutputTokens,temperature:Q.temperature,logErrors:Q.logErrors??!0}}static create(Q){if(Q.output)S6(Q.output,`The agent "${Q.name}"`,"output");return new AQ(Q)}stream(Q){let $={...this.config,provider:Q.provider??this.config.provider,maxSteps:Q.maxSteps??this.config.maxSteps,reasoning:Q.reasoning??this.config.reasoning,maxOutputTokens:Q.maxOutputTokens??this.config.maxOutputTokens,temperature:Q.temperature??this.config.temperature};return new k6($,Q)}}function F6(Q){return{name:Q.tool.name,description:Q.tool.description,parameters:Q.tool.inputSchema.toJSONSchema(),strict:GQ(Q.tool.inputSchema),deferred:Q.deferred}}function A9(Q,$){let Z=new Map,G=[],J=(W)=>{if(Z.has(W.tool.name))throw Error(`Two tools are named "${W.tool.name}". Tool names are global within an agent \u2014 the client discriminates a tool part by name alone.`);Z.set(W.tool.name,W)};for(let W of Q){if(W instanceof JQ){if(W.name===g)throw Error(`"${g}" is reserved for the namespace skills are lowered into. Rename the namespace \u2014 silently shadowing it would make every skill unreachable with no error to read.`);let V=[];for(let X of W.tools){let K={tool:X,namespace:W.name,deferred:W.deferred||X.deferred};J(K),V.push(F6(K))}G.push({name:W.name,description:W.description,tools:V});continue}let Y={tool:W,deferred:W.deferred};J(Y),G.push(F6(Y))}if($.length>0){let W=[];for(let Y of $){let V=E9(Y);J({tool:V,namespace:g,deferred:!1}),W.push({name:Y.name,description:Y.description,parameters:R6,strict:!0,deferred:!1})}G.push({name:g,description:S9,tools:W})}return{registry:Z,providerTools:G}}function E9(Q){return A.create({name:Q.name,description:Q.description,inputSchema:{toJSONSchema:()=>R6,parse:()=>({}),safeParse:()=>({ok:!0,value:{}})},execute:async()=>{let Z=[typeof Q.instructions==="function"?await Q.instructions():Q.instructions];for(let G of Q.files??[])Z.push(`--- ${G} ---
|
|
8
|
+
${await x9(G)}`);return Z.join(`
|
|
9
9
|
|
|
10
|
-
`)}})}async function
|
|
10
|
+
`)}})}async function x9(Q){try{return await Bun.file(Q).text()}catch($){return`(could not be read: ${$.message})`}}class k extends Error{constructor(){super("The run was stopped");this.name="RunAborted"}}function a(Q,$){if($.aborted)return Promise.reject(new k);return new Promise((Z,G)=>{let J=()=>G(new k);$.addEventListener("abort",J,{once:!0}),Q.then(Z,G).finally(()=>$.removeEventListener("abort",J))})}function e(){return{inputTokens:0,outputTokens:0,totalTokens:0}}function QQ(Q,$){if(!$)return Q;let Z={inputTokens:Q.inputTokens+($.inputTokens??0),outputTokens:Q.outputTokens+($.outputTokens??0),totalTokens:Q.totalTokens+($.totalTokens??0)};if($.reasoningTokens!==void 0||Q.reasoningTokens!==void 0)Z.reasoningTokens=(Q.reasoningTokens??0)+($.reasoningTokens??0);if($.cachedInputTokens!==void 0||Q.cachedInputTokens!==void 0)Z.cachedInputTokens=(Q.cachedInputTokens??0)+($.cachedInputTokens??0);if($.imageInputTokens!==void 0||Q.imageInputTokens!==void 0)Z.imageInputTokens=(Q.imageInputTokens??0)+($.imageInputTokens??0);if($.imageOutputTokens!==void 0||Q.imageOutputTokens!==void 0)Z.imageOutputTokens=(Q.imageOutputTokens??0)+($.imageOutputTokens??0);return Z}function b9(Q){return typeof Q==="object"&&Q!==null&&typeof Q.next==="function"&&Symbol.asyncIterator in Q}function qQ(Q){if(!Q.trim())return{};try{return JSON.parse(Q)}catch{}let $=[],Z=!1,G=!1;for(let Y of Q){if(Z){if(G)G=!1;else if(Y==="\\")G=!0;else if(Y==='"')Z=!1;continue}if(Y==='"')Z=!0;else if(Y==="{")$.push("}");else if(Y==="[")$.push("]");else if(Y==="}"||Y==="]")$.pop()}let J=Q;if(Z)J+='"';J=J.replace(/[,:]\s*$/,"");let W=$.reverse().join("");try{return JSON.parse(J+W)}catch{try{return JSON.parse(J.replace(/,?\s*"[^"]*"\s*$/,"")+W)}catch{return{}}}}function L6(Q,$){let Z=[...Q],G=new Map(Z.map((J,W)=>[J.id,W]));for(let J of $){let W=G.get(J.id);if(W===void 0)G.set(J.id,Z.length),Z.push(J);else Z[W]=J}return Z}function $Q(Q){let $=new Set;for(let G of Q)for(let J of G.content)if(J.type==="tool-result")$.add(J.toolCallId);let Z=new Set;for(let G of Q)for(let J of G.content)if(J.type==="tool-call"&&!$.has(J.toolCallId))Z.add(J.toolCallId);return Z}function O6(Q){for(let $=Q.length-1;$>=0;$--){let Z=Q[$].content;for(let G=Z.length-1;G>=0;G--){let J=Z[G];if(J.type==="output"&&J.partial!==!0)return J.value}}return}function N6(Q,$){return $===void 0?`"${Q}"`:`"${Q}" labelled "${$}"`}function T6(Q){return Q.content.map(($)=>$.type==="text"?$.text:`<${$.type}>`).join("")}function I9(Q){if(Q.prompt!==void 0)return`user:${Q.prompt}`;let $=Q.messages?.[0];return $?`${$.role}:${T6($)}`:null}function _6(Q){let $=new Set;for(let Z of Q)for(let G of Z.content){if(G.type!=="tool-call")continue;for(let J of G.attachments??[])if("shown"in J&&J.shown)$.add(J.shown.messageId)}return $}var C6=1;function w9(Q,$,Z){let G=Z.mimeType||$.type||"";if(G&&Q.attachment.mimeType!==G)return`was ${JSON.stringify(Q.attachment.mimeType)} on the turn that escalated and is ${JSON.stringify(G)} on the replay`;let J=Boolean(Z.showModel);if(J!==Boolean(Q.shown))return J?"was stored without showModel on the turn that escalated and asks for showModel on the replay":"was stored with showModel on the turn that escalated and asks for a plain put on the replay";return null}function f9(Q,$,Z){if(Q.agent!==$.name||Q.label!==Z.label)return`was ${N6(Q.agent,Q.label)} on the turn that escalated and is ${N6($.name,Z.label)} on the replay`;let G=I9(Z),J=Q.messages[0],W=J?`${J.role}:${T6(J)}`:null;if(G!==null&&W!==null&&G!==W)return`was started with ${JSON.stringify(W)} on the turn that escalated and with ${JSON.stringify(G)} on the replay`;return null}function P6(Q,$){let Z=Q??[];if(Z.length<$.length)return null;for(let G=0;G<$.length;G++)if(Z[G]!==$[G])return null;return Z.slice($.length)}class SQ{read;create;fill;index=0;replayable;constructor(Q,$,Z){this.read=Q;this.create=$;this.fill=Z;this.replayable=Q()?.length??0}next(){let Q=this.index++;return{at:Q,recorded:Q<this.replayable?this.read()?.[Q]:void 0,write:($)=>{let Z=this.read()??this.create();if(this.fill)for(let G=Z.length;G<Q;G++)Z[G]=this.fill();Z[Q]=$}}}}class k6{runId;config;params;context;controller=new AbortController;buffer=[];waiters=new Set;seq=0;ended=!1;history=[];produced=[];current=null;outputTruncated=!1;amended=new Map;unreported=new Set;usage=e();finishReason="stop";failure;output;stopReason;settled;depth;maxDepth;chain;signingRunId;pathPrefix;onPending;nestedSettling=new Set;shownQueue=new Map;constructor(Q,$){this.config=Q,this.params=$,this.context=$.context??{},this.runId=$.runId??`run_${crypto.randomUUID()}`,this.history=[...$.messages];let Z=$.nesting;if(this.depth=Z?.depth??0,this.maxDepth=Z?.maxDepth??Q.maxDepth,this.chain=Z?.chain??[Q.name],this.signingRunId=Z?.signingRunId??this.runId,this.pathPrefix=Z?.signingPath??[],this.onPending=Z?.onPending??"escalate",$.signal)if($.signal.aborted)this.controller.abort();else $.signal.addEventListener("abort",()=>this.stop(),{once:!0});this.settled=this.execute(),ZQ.getStore()?.waitUntil(this.settled)}emit(Q){if(this.ended)return;this.buffer.push({seq:++this.seq,event:Q}),this.wake()}wake(){let Q=[...this.waiters];this.waiters.clear();for(let $ of Q)$()}nextFrame(){return new Promise((Q)=>this.waiters.add(Q))}async*frames(Q=0){let $=Q>0?Q-1:0;for(;;){while($<this.buffer.length)yield this.buffer[$++];if(this.ended)return;await this.nextFrame()}}async*[Symbol.asyncIterator](){for await(let Q of this.frames())yield Q.event}toResponse(Q){let $=this.frames(Q?.from),Z=new TextEncoder,G=!1,J,W=new ReadableStream({start:async(Y)=>{J=MQ(Y);try{for await(let V of $){if(G)break;Y.enqueue(Z.encode(`id: ${V.seq}
|
|
11
11
|
data: ${JSON.stringify(V.event)}
|
|
12
12
|
|
|
13
|
-
`)),J.touch()}}catch{}J.stop();try{Y.close()}catch{}},cancel:()=>{G=!0,J.stop()}});return new Response(W,{headers:{"Content-Type":"text/event-stream; charset=utf-8","Cache-Control":"no-cache, no-transform",Connection:"keep-alive","X-Accel-Buffering":"no"}})}result(){return this.settled}stop(Q){if(this.ended||this.controller.signal.aborted)return;this.stopReason=Q?.reason,this.controller.abort()}async execute(){this.emit({type:"run-start",runId:this.runId,threadId:this.params.threadId});try{let
|
|
13
|
+
`)),J.touch()}}catch{}J.stop();try{Y.close()}catch{}},cancel:()=>{G=!0,J.stop()}});return new Response(W,{headers:{"Content-Type":"text/event-stream; charset=utf-8","Cache-Control":"no-cache, no-transform",Connection:"keep-alive","X-Accel-Buffering":"no"}})}result(Q){if(!Q?.throwOnError)return this.settled;return this.settled.then(($)=>{if($.error)throw new kQ({...$,error:$.error});return $})}stop(Q){if(this.ended||this.controller.signal.aborted)return;this.stopReason=Q?.reason,this.controller.abort()}async execute(){this.emit({type:"run-start",runId:this.runId,threadId:this.params.threadId});try{let $=await this.ingestTurn();if($.length>0)this.finishReason="awaiting-input",this.emit({type:"awaiting-input",runId:this.runId,pending:$});else await this.loop()}catch($){if($ instanceof k||this.controller.signal.aborted)await this.finalizeAborted();else this.fail(this.config.provider.normalizeError($),u($)),await this.finalizeMessage("error"),this.finishReason="error"}this.emit({type:"usage",usage:this.usage}),this.emit({type:"run-end",runId:this.runId,finishReason:this.finishReason}),this.ended=!0,this.wake();let Q=this.finishReason==="error"?this.failure:void 0;if(Q&&this.config.logErrors)this.logFailure(Q);return{runId:this.runId,messages:this.produced,finishReason:this.finishReason,usage:this.usage,output:this.output,...Q?{error:Q}:{}}}fail(Q,$={}){let Z={...Q,...$};this.failure=Z,this.emit({type:"error",error:R9(Z)})}logFailure(Q){let $=`[gemi/ai] agent "${this.config.name}" run failed (${Q.code}${Q.status!==void 0?` ${Q.status}`:""}): ${Q.message}`,Z={agent:this.config.name,runId:this.runId,...this.params.threadId?{threadId:this.params.threadId}:{},...this.depth>0?{chain:this.chain}:{},error:Q},G=!1;try{q6.error($,Z),G=!0}catch{}if(!G||Bun.env.NODE_ENV==="development")console.error($,Z)}async loop(){let Q=Math.max(1,this.config.maxSteps);for(let $=1;$<=Q;$++){let Z=this.startMessage(),G=await this.runStep(Z);if(G.error){this.fail(G.error,G.detail),await this.finalizeMessage("error"),this.finishReason="error";return}let J=Z.content.filter((Y)=>Y.type==="tool-call");if(J.length===0){this.finishReason=G.reason,await this.finalizeMessage(G.reason);return}let W=await this.runTools(Z,J,$);if(W.length>0){this.finishReason="awaiting-input",await this.finalizeMessage("awaiting-input"),this.emit({type:"awaiting-input",runId:this.runId,pending:W});return}if($===Q){this.finishReason="max-steps",await this.finalizeMessage("max-steps");return}await this.finalizeMessage(G.reason)}}startMessage(){let Q={id:`msg_${crypto.randomUUID()}`,role:"assistant",content:[],createdAt:new Date().toISOString()};return this.current=Q,this.history.push(Q),this.produced.push(Q),this.emit({type:"message-start",messageId:Q.id,role:"assistant"}),Q}async finalizeMessage(Q){let $=this.current;if(!$)return;this.current=null;let Z=this.outputTruncated;if(this.outputTruncated=!1,$.finishReason=Q,Z)$.outputTruncated=!0;for(let G of $.content)if(G.type==="text"||G.type==="reasoning"){if(typeof G.text==="string")G.text=v9(G.text)}this.emit({type:"message-end",messageId:$.id,finishReason:Q,...Z?{outputTruncated:!0}:{}}),await this.report($),await this.reportDeferred()}async report(Q){if(!this.params.onMessage)return;try{await this.params.onMessage(Q)}catch{}}async runStep(Q){let $=this.controller.signal,Z=this.config.provider,G={reason:"stop"},J=new Map,W="",V=Z.stream({messages:this.historyForProvider(Q),systemPrompt:await this.systemPrompt(),tools:this.config.providerTools.length>0?this.config.providerTools:void 0,output:this.config.output?{name:"output",schema:this.config.output.toJSONSchema(),strict:GQ(this.config.output)}:void 0,reasoning:this.config.reasoning,maxOutputTokens:this.config.maxOutputTokens,temperature:this.config.temperature,signal:$})[Symbol.asyncIterator]();for(;;){let K=await a(Promise.resolve(V.next()),$);if(K.done)break;let H=K.value;switch(H.type){case"text-delta":{y9(Q,"text",H.delta),this.emit({type:"text-delta",messageId:Q.id,delta:H.delta});break}case"reasoning-delta":{h9(Q,H.id,H.delta),this.emit({type:"reasoning-delta",messageId:Q.id,delta:H.delta,id:H.id});break}case"output-delta":{W+=H.delta,this.emit({type:"output-delta",messageId:Q.id,delta:H.delta,snapshot:qQ(W)});break}case"tool-search":{this.emit({type:"tool-search",loaded:H.loaded});break}case"tool-call-delta":{let B=J.get(H.toolCallId)??{name:H.name,args:""};B.args+=H.argsDelta,B.name=H.name||B.name,J.set(H.toolCallId,B),this.emit({type:"tool-call",messageId:Q.id,part:{type:"tool-call",toolCallId:H.toolCallId,name:B.name,input:qQ(B.args),partial:!0}});break}case"tool-call":{J.delete(H.toolCallId);let B={type:"tool-call",toolCallId:H.toolCallId,name:H.name,input:M6(H.args)};Q.content.push(B),this.emit({type:"tool-call",messageId:Q.id,part:B});break}case"finish":{if(this.usage=QQ(this.usage,H.usage),!G.error)G={reason:H.reason};break}case"error":{G={reason:"error",error:H.error,detail:u(H)};break}}}for(let[K,H]of J){let B={type:"tool-call",toolCallId:K,name:H.name,input:M6(H.args)};Q.content.push(B),this.emit({type:"tool-call",messageId:Q.id,part:B})}let X=G.reason==="length";if(X)this.outputTruncated=!0;if(this.config.output&&W&&!G.error&&!X){let K=this.config.output.safeParse(qQ(W));if(K.ok===!0)this.output=K.value,Q.content.push({type:"output",value:K.value});else this.emit({type:"error",error:{code:"unknown",message:`The model's structured answer did not match the output schema: ${K.errors.join(", ")}`,retryable:!0}})}return G}async systemPrompt(){let Q=[this.config.instructions,this.params.instructions].filter(($)=>Boolean($&&$.trim()));return Q.length>0?Q.join(`
|
|
14
14
|
|
|
15
|
-
`):void 0}async runTools(Q,$,Z){let G=[],J=[];for(let W of $){let Y=this.config.registry.get(String(W.name));if(!Y){this.addResult(Q,{type:"tool-result",toolCallId:W.toolCallId,name:W.name,status:"error",error:{code:"tool_error",message:`There is no tool named "${String(W.name)}".`,toolCallId:W.toolCallId,retryable:!0}});continue}let V=Y.tool.inputSchema.safeParse(W.input);if(V.ok===!1){this.addResult(Q,{type:"tool-result",toolCallId:W.toolCallId,name:W.name,status:"error",error:{code:"invalid_tool_input",message:`Invalid arguments for "${String(W.name)}": ${V.errors.join(", ")}`,toolCallId:W.toolCallId,retryable:!0}});continue}W.input=V.value;let X=C6(Y.tool);if(X){if(this.onPending==="deny"){this.addResult(Q,this.deniedByPolicy(W));continue}G.push({toolCallId:W.toolCallId,name:W.name,input:V.value,kind:X,signature:$6(this.claimsFor(W.toolCallId,String(W.name),X,V.value)),...this.pathPrefix.length>0?{path:[...this.pathPrefix]}:{}});continue}J.push(this.executeTool(Y,Q.id,W,V.value,Z).then(async(K)=>{this.addResult(Q,K),await this.settleShown(W.toolCallId)}).catch((K)=>{if(K instanceof T){if(this.onPending==="deny"){this.addResult(Q,this.deniedByPolicy(W));return}G.push(...K.pending);return}}))}return await s(Promise.all(J).then(()=>{return}),this.controller.signal),G}claimsFor(Q,$,Z,G){return{runId:this.signingRunId,toolCallId:Q,name:$,kind:Z,input:G,path:this.pathPrefix.length>0?[...this.pathPrefix]:void 0}}deniedByPolicy(Q){return{type:"tool-result",toolCallId:Q.toolCallId,name:Q.name,status:"denied",cause:"refused",reason:`"${String(Q.name)}" needs the user, and this run was started with onPending: "deny". Answer from what you already have.`}}async executeTool(Q,$,Z,G,J,W){let Y=this.toolFiles(Z),V={context:this.context,body:this.params.body??{},runId:this.runId,threadId:this.params.threadId,toolCallId:Z.toolCallId,signal:this.controller.signal,step:J,depth:this.depth,resumed:W!==void 0,attachments:Y.attachments,generateImage:Y.generateImage,editImage:Y.editImage,turn:this.toolTurn($),runAgent:this.nestedRunner($,Z,W)};try{let X=Q.tool.execute(G,V),K;if(M9(X)){let H=await X.next();while(!H.done)this.emit({type:"tool-progress",toolCallId:Z.toolCallId,data:H.value}),H=await X.next();K=H.value}else K=await X;return{type:"tool-result",toolCallId:Z.toolCallId,name:Z.name,status:"ok",output:K}}catch(X){if(X instanceof k||this.controller.signal.aborted)throw new k;if(X instanceof T)throw X;return{type:"tool-result",toolCallId:Z.toolCallId,name:Z.name,status:"error",error:{code:"tool_error",message:X instanceof Error?X.message:String(X),toolCallId:Z.toolCallId,retryable:!0}}}}nestedRunner(Q,$,Z){let G=new qQ(()=>$.nested,()=>$.nested=[]);return async(J,W={})=>{let{at:Y,recorded:V,write:X}=G.next();if(V){let K=R9(V,J,W);if(K)throw Error(`Nested run ${Y} of "${String($.name)}" ${K}. `+"runAgent is memoized by call index, so a body whose runAgent calls depend on a condition that changed between turns cannot be resumed \u2014 the answer would be paired with a different sub-run. "+"Make the sequence of runAgent calls, and what each one is asked, the same every time this tool runs, or branch on ctx.resumed.");if(V.finishReason!=="awaiting-input")return{runId:V.runId,agent:V.agent,messages:V.messages,finishReason:V.finishReason??"stop",usage:V.usage??t(),output:z6(V.messages),nested:V}}return this.runNested(Q,$,J,W,X,V,Z?.answers??[])}}async runNested(Q,$,Z,G,J,W,Y){let V=[...this.chain,Z.name];if(this.chain.includes(Z.name))throw Error(`"${Z.name}" is already running further up this chain: ${V.join(" -> ")}. An agent cannot run itself, directly or through another agent.`);let X=this.depth+1;if(X>this.maxDepth)throw Error(`Nested agent runs are ${this.maxDepth} deep at most and this one would be ${X}: ${V.join(" -> ")}. Raise maxDepth on the agent at the root of the run if the tree is meant to be this deep.`);let K=G.label,H=[...this.pathPrefix,$.toolCallId],B=this.onPending==="deny"?"deny":G.onPending??"escalate",D=W!==void 0,L=D?a(W.messages):new Set,U=D?Y.filter((N)=>{let b=N6(N.path,H);if(b===null)return!1;return L.has(b.length>0?b[0]:N.toolCallId)}):[],z=Z.stream({messages:D?W.messages:G.messages??[],turn:D?{toolResults:U}:G.prompt?{text:G.prompt}:void 0,context:this.context,attachments:this.params.attachments,body:this.params.body,signal:this.controller.signal,threadId:this.params.threadId,instructions:G.instructions,maxOutputTokens:G.maxOutputTokens,temperature:G.temperature,runId:D?W.runId:void 0,nesting:{depth:X,maxDepth:this.maxDepth,chain:V,signingRunId:this.signingRunId,signingPath:H,onPending:B}}),F=[],_=(async()=>{for await(let N of z){if(N.type==="awaiting-input")F=N.pending;this.emit({type:"nested-event",toolCallId:$.toolCallId,runId:z.runId,agent:Z.name,label:K,event:N})}})(),M=(async()=>{let N=await z.result();await _;let b=D?U6(W.messages,N.messages):U6(G.messages??[],N.messages),sQ={runId:z.runId,agent:Z.name,label:K,messages:b,finishReason:N.finishReason,usage:D?r(W.usage??t(),N.usage):N.usage,...N.finishReason==="awaiting-input"?{signature:J6({runId:this.signingRunId,path:H,nestedRunId:z.runId,open:[...a(b)],input:$.input})}:{}};return J(sQ),this.usage=r(this.usage,N.usage),{result:N,record:sQ}})(),q=M.then(()=>{return},()=>{return});this.nestedSettling.add(q);let O,S;try{({result:O,record:S}=await M)}finally{this.nestedSettling.delete(q)}if(this.controller.signal.aborted)throw new k;if(O.finishReason==="awaiting-input"){if(F.length===0)throw Error(`"${Z.name}" ended awaiting input but asked nothing, so there is no question to escalate.`);throw this.emit({type:"tool-call",messageId:Q,part:$,resent:!0}),new T({pending:F,path:H,nested:S})}return{runId:S.runId,agent:Z.name,messages:S.messages,finishReason:O.finishReason,usage:S.usage??t(),output:O.output??z6(S.messages),nested:S}}addResult(Q,$){Q.content.push($),this.emit({type:"tool-result",messageId:Q.id,part:$})}toolFiles(Q){let $=this.params.attachments??null,Z=new qQ(()=>Q.attachments,()=>Q.attachments=[],()=>({failed:!0})),G=()=>{if(!$)throw new w("This request has no attachment scope, so a tool cannot store or read files on it. `attachmentScope()` returned null \u2014 put the chat route behind authentication, send a `threadId`, or override `attachmentScope()` on the controller.");return $},J=async(X,K,H)=>{let B=G(),D=K.mimeType||X.type||"",L=K.name??(X instanceof File?X.name:"attachment"),U;if(K.showModel){let F=this.config.provider;if(!F.capabilities.fileInput)throw Error(`"${String(Q.name)}" asked to show a file to ${F.model}, which does not accept file input. Drop \`showModel\` for this provider, or run this agent on a model that takes files \u2014 \`capabilities.fileInput\` is what says which do.`);U=await F.upload(new File([X],L,{type:D||void 0}))}return{attachment:await B.put(X,{name:L,mimeType:D,fileId:U}),...H?{generated:H}:{},...U?{shown:{fileId:U,messageId:`msg_${crypto.randomUUID()}`,createdAt:new Date().toISOString()}}:{}}},W=(X,K,H)=>{let B=X.generated?"image":"put";if(B===K)return;throw Error(`Attachment ${H} of "${String(Q.name)}" was ${B==="image"?"a generated image":"a stored file"} on the first attempt and is ${K==="image"?"a generated image":"a stored file"} now. ctx.attachments.put, ctx.generateImage and ctx.editImage share one memo indexed by call order within a tool call, so the sequence has to be the same every time this tool runs. Branch on ctx.resumed if it cannot be.`)},Y=async(X,K,H)=>{let{at:B,recorded:D,write:L}=Z.next();if(D&&"attachment"in D){if(W(D,"image",B),D.shown)this.queueShown(Q.toolCallId,D);return{attachment:D.attachment,size:D.generated.size,mimeType:D.attachment.mimeType,usage:D.generated.usage}}let U=await H();this.usage=r(this.usage,U.usage);let z=U.mimeType==="image/jpeg"?"jpg":"png",F=await J(U.image,{name:K.name??`${X.name}.${z}`,mimeType:U.mimeType,...K.showModel?{showModel:!0}:{}},{size:U.size,usage:U.usage});if(L(F),F.shown)this.queueShown(Q.toolCallId,F);return{attachment:F.attachment,size:U.size,mimeType:U.mimeType,usage:U.usage}},V=async(X)=>typeof X==="string"?await G().file(X):X;return{generateImage:(X,K)=>Y(X,K,()=>X.generate({...K,signal:this.controller.signal})),editImage:(X,K)=>Y(X,K,async()=>{let{images:H,mask:B,...D}=K;return await X.edit({...D,images:await Promise.all(H.map(V)),...B?{mask:await V(B)}:{},signal:this.controller.signal})}),attachments:{get:(X)=>G().get(X),read:(X)=>G().read(X),file:(X)=>G().file(X),put:async(X,K={})=>{let{at:H,recorded:B,write:D}=Z.next();if(B&&"attachment"in B){W(B,"put",H);let U=S9(B,X,K);if(U)throw Error(`Attachment ${H} of "${String(Q.name)}" ${U}. `+"ctx.attachments.put is memoized by call index within a tool call, so a body whose put calls depend on a condition that changed between turns cannot be replayed \u2014 the model would be shown a file under an id that names different bytes. "+"Make the sequence of put calls the same every time this tool runs, or branch on ctx.resumed.");if(B.shown)this.queueShown(Q.toolCallId,B);return B.attachment}let L=await J(X,K);if(D(L),L.shown)this.queueShown(Q.toolCallId,L);return L.attachment}}}}toolTurn(Q){let $=this.history.findIndex((W)=>W.id===Q),Z=L6(this.history),G;for(let W=$-1;W>=0;W--){let Y=this.history[W];if(Y.role!=="user"||Z.has(Y.id))continue;G=Y;break}let J=[];for(let W of G?.content??[]){if(W.type!=="file")continue;let Y=W.attachmentId;if(typeof Y!=="string"||!Y.startsWith(P))continue;if(!J.includes(Y))J.push(Y)}return Object.freeze({attachments:Object.freeze(J)})}queueShown(Q,$){let Z=$.shown;if(!Z)return;let G=this.shownQueue.get(Q)??[];if(G.some((J)=>J.id===Z.messageId))return;G.push({id:Z.messageId,role:"user",content:[{type:"file",fileId:Z.fileId,name:$.attachment.name,mimeType:$.attachment.mimeType,attachmentId:$.attachment.id}],createdAt:Z.createdAt,finishReason:"stop"}),this.shownQueue.set(Q,G)}async settleShown(Q){let $=this.shownQueue.get(Q);if(!$||$.length===0)return;if(this.shownQueue.delete(Q),this.ended||this.controller.signal.aborted)return;for(let Z of $){if(this.history.some((G)=>G.id===Z.id))continue;this.history.push(Z),this.produced.push(Z),this.emit({type:"message",message:Z}),this.unreported.add(Z)}}historyForProvider(Q){let $=this.history.filter((W)=>W!==Q),Z=L6($),G=[];for(let W of $){if(!Z.has(W.id))continue;for(let Y of W.content)if(Y.type==="file")G.push(Y)}if(G.length<=O6)return $;let J=new Set(G.slice(0,G.length-O6));return $.map((W)=>{if(!W.content.some((Y)=>Y.type==="file"&&J.has(Y)))return W;return{...W,content:W.content.map((Y)=>Y.type==="file"&&J.has(Y)?{type:"text",text:`[A ${Y.mimeType||"file"} produced by a tool (attachment ${Y.attachmentId}) was attached here and has been dropped from this request: only the most recent tool-produced file is kept attached, to keep the context bounded. Call the tool again if you need to look at it.]`}:Y)}})}async ingestTurn(){let Q=this.params.turn,$=this.openCalls(),Z=[];if($.length>0){let G=new Set,J=new Set,W=new Map;for(let Y of Q?.toolResults??[]){let V=`${(Y.path??[]).join("/")}#${Y.toolCallId}`;if(J.has(V))continue;J.add(V);let X=(D)=>this.emit({type:"error",error:{code:"invalid_tool_result",message:D,toolCallId:Y.toolCallId,retryable:!1}}),K=N6(Y.path,this.pathPrefix);if(K===null){X(`The answer for "${Y.toolCallId}" is addressed to a tool call this run is not inside.`);continue}if(K.length>0){let D=K[0],L=$.find((F)=>F.call.toolCallId===D);if(!L){X(`No pending tool call with id "${D}" to deliver a nested answer to.`);continue}let U=this.parkedBelow(L.call,K,Y.toolCallId);if(U.ok===!1){let F=`The answer for "${Y.toolCallId}" is addressed under "${D}", which`;X(U.reason==="unparked"?`${F} has no sub-agent run waiting on that question.`:U.reason==="expired"?`${F} parked a sub-agent run that has since expired. Ask again.`:`${F} carries a record of a parked sub-agent run the server did not sign.`);continue}let z=W.get(D);if(!z){if(!V6(U.signature)){X(`The answer for "${Y.toolCallId}" is addressed under "${D}", which has already been re-entered on that record. Ask again.`);continue}z=[],W.set(D,z),G.add(D)}z.push(Y);continue}let H=$.find((D)=>D.call.toolCallId===Y.toolCallId);if(!H){X(`No pending tool call with id "${Y.toolCallId}".`);continue}let B=await this.resolveAnswer(H,Y,Z);if(B===null)continue;if(G.add(Y.toolCallId),B!=="open")this.attachToHistory(H,B),await this.settleShown(Y.toolCallId)}for(let[Y,V]of W){let X=$.find((H)=>H.call.toolCallId===Y),K=await this.reenter(X,V,Z);if(K)this.attachToHistory(X,K),await this.settleShown(Y)}for(let Y of $){if(G.has(Y.call.toolCallId))continue;this.attachToHistory(Y,{type:"tool-result",toolCallId:Y.call.toolCallId,name:Y.call.name,status:"denied",cause:"refused"})}await this.reportDeferred()}if(Q&&(Q.text||Q.files&&Q.files.length>0)){let G={id:`msg_${crypto.randomUUID()}`,role:"user",content:[...Q.text?[{type:"text",text:Q.text}]:[],...(Q.files??[]).map((J)=>({type:"file",...J.fileId?{fileId:J.fileId}:{},name:J.name,mimeType:J.mimeType,...J.attachmentId?{attachmentId:J.attachmentId}:{}}))],createdAt:new Date().toISOString(),finishReason:"stop"};this.history.push(G),this.produced.push(G),await this.report(G)}return Z}parkedBelow(Q,$,Z){let G=$.length>1?$[1]:Z,J=[...this.pathPrefix,Q.toolCallId],W=(Q.nested??[]).find((V)=>V.finishReason==="awaiting-input"&&a(V.messages).has(G));if(!W)return{ok:!1,reason:"unparked"};if(typeof W.signature!=="string")return{ok:!1,reason:"unsigned"};let Y=W6(W.signature,{path:J,nestedRunId:W.runId,open:[...a(W.messages)],input:Q.input});if(Y.ok===!1)return{ok:!1,reason:Y.reason==="expired"?"expired":"unsigned"};return{ok:!0,signature:W.signature}}async reenter(Q,$,Z){let G=String(Q.call.name),J=this.config.registry.get(G);if(!J||!J.tool.execute)return{type:"tool-result",toolCallId:Q.call.toolCallId,name:Q.call.name,status:"error",error:{code:"invalid_tool_result",message:`The tool "${G}" no longer exists, so the sub-agent's question cannot be delivered.`,toolCallId:Q.call.toolCallId,retryable:!1}};let W=J.tool.inputSchema.safeParse(Q.call.input);if(W.ok===!1)return{type:"tool-result",toolCallId:Q.call.toolCallId,name:Q.call.name,status:"error",error:{code:"invalid_tool_input",message:`Invalid arguments for "${G}": ${W.errors.join(", ")}`,toolCallId:Q.call.toolCallId,retryable:!0}};let Y=this.amendCall(Q);Y.input=W.value;try{return await s(this.executeTool(J,Q.message.id,Y,W.value,0,{answers:$}),this.controller.signal)}catch(V){if(V instanceof T)return Z.push(...V.pending),null;throw V}}amendCall(Q){let $=this.amend(Q.message),Z=$.content.indexOf(Q.call),G={...Q.call,nested:(Q.call.nested??[]).map((J)=>({...J})),...Q.call.attachments?{attachments:Q.call.attachments.map((J)=>({...J}))}:{}};if(Z>=0)$.content[Z]=G;return this.unreported.add($),G}openCalls(){let Q=new Set;for(let Z of this.history)for(let G of Z.content)if(G.type==="tool-result")Q.add(G.toolCallId);let $=[];for(let Z of this.history)for(let G of Z.content)if(G.type==="tool-call"&&!Q.has(G.toolCallId))$.push({message:Z,call:G});return $}async resolveAnswer(Q,$,Z){let G=Q.call,J=String(G.name),W=this.config.registry.get(J),Y=(H)=>{return this.emit({type:"error",error:{code:"invalid_tool_result",message:H,toolCallId:G.toolCallId,retryable:!1}}),null};if(!W)return Y(`The tool "${J}" no longer exists, so its answer cannot be checked.`);let V=C6(W.tool);if(!V)return Y(`"${J}" is a server tool with no pending question.`);if(typeof $.signature!=="string"||$.signature.length===0)return Y(`The answer for "${J}" carried no signature.`);let X=i($.signature);if(!X)return Y(`The signature for "${J}" is malformed.`);let K=Z6($.signature,{...this.claimsFor(G.toolCallId,J,V,G.input),runId:X.runId});if(K.ok===!1)return Y(K.reason==="expired"?`The approval for "${J}" has expired. Ask again.`:`The answer for "${J}" does not match the call the server made.`);if(!X6($.signature))return Y(`The answer for "${J}" has already been used. Ask again.`);if("approve"in $){if(V!=="approval")return Y(`"${J}" is answered by the client, not approved.`);if($.approve===!0){let H=this.amendCall(Q);try{return await s(this.executeTool(W,Q.message.id,H,H.input,0),this.controller.signal)}catch(B){if(B instanceof T)return Z.push(...B.pending),"open";throw B}}return{type:"tool-result",toolCallId:G.toolCallId,name:G.name,status:"denied",cause:"refused",reason:$.reason}}if("output"in $){if(V==="approval")return Y(`"${J}" is approved, not answered: the server produces its result.`);let H=W.tool.outputSchema,B=H?H.safeParse($.output):{ok:!0,value:$.output};if(B.ok===!1)return{type:"tool-result",toolCallId:G.toolCallId,name:G.name,status:"error",error:{code:"invalid_tool_result",message:`The answer for "${J}" did not match its output schema: ${B.errors.join(", ")}`,toolCallId:G.toolCallId,retryable:!0}};return{type:"tool-result",toolCallId:G.toolCallId,name:G.name,status:"ok",output:B.value}}return Y(`The answer for "${J}" carried neither an approval nor an output.`)}attachToHistory(Q,$){let Z=this.amend(Q.message);Z.content.push($),this.unreported.add(Z),this.emit({type:"tool-result",messageId:Z.id,part:$})}amend(Q){let $=this.amended.get(Q.id);if($)return $;let Z={...Q,content:[...Q.content]},G=this.history.indexOf(Q);if(G>=0)this.history[G]=Z;return this.produced.push(Z),this.amended.set(Q.id,Z),Z}async reportDeferred(){let Q=[...this.unreported];this.unreported.clear();for(let $ of Q)await this.report($)}async finalizeAborted(){if(this.nestedSettling.size>0)await Promise.all([...this.nestedSettling]);for(let $ of this.openCalls()){if($.message===this.current)continue;this.attachToHistory($,{type:"tool-result",toolCallId:$.call.toolCallId,name:$.call.name,status:"denied",cause:"stopped",reason:this.stopReason})}await this.reportDeferred();let Q=this.current;if(Q){let $=new Set(Q.content.filter((Z)=>Z.type==="tool-result").map((Z)=>Z.toolCallId));for(let Z of[...Q.content]){if(Z.type!=="tool-call"||$.has(Z.toolCallId))continue;delete Z.partial,this.addResult(Q,{type:"tool-result",toolCallId:Z.toolCallId,name:Z.name,status:"denied",cause:"stopped",reason:this.stopReason})}}this.finishReason="aborted",await this.finalizeMessage("aborted")}}function C6(Q){if(Q.answeredBy==="client")return Q.inputSchema===SQ?"question":"client";return Q.requiresApproval?"approval":null}function _6(Q){if(!Q||!Q.trim())return{};try{return JSON.parse(Q)}catch{return Q}}function T9(Q){if(Q.length>0)Q[0];return Q}function k9(Q,$,Z){let G=Q.content[Q.content.length-1];if(G&&G.type===$){G.text=(G.text??"")+Z;return}Q.content.push($==="text"?{type:"text",text:Z}:{type:"reasoning",text:Z})}function E9(Q,$,Z){let G=Q.content[Q.content.length-1];if(G&&G.type==="reasoning"&&G.id===$){G.text=(G.text??"")+Z;return}Q.content.push($?{type:"reasoning",id:$,text:Z}:{type:"reasoning",text:Z})}function A9(Q,$){return Q.descriptors($).map((Z)=>E.create({name:Z.name,description:Z.description,inputSchema:Z.inputSchema,requiresApproval:Z.requiresApproval,execute:(G,J)=>{let W=e.getStore()?.req;if(!W)throw Error(`"${Z.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 Q.execute({kind:"local",req:W},Z.name,G,J)}}))}function x9(Q){if(Q==="auto")return;let $=/^(\d+)x(\d+)$/.exec(Q);if(!$)throw Error(`An image size is "WIDTHxHEIGHT" or "auto"; got ${JSON.stringify(Q)}.`);let Z=Number($[1]),G=Number($[2]);if(Z%16!==0||G%16!==0)throw Error(`Image size ${Q} is not supported: width and height must both be divisible by 16.`);if(Math.max(Z/G,G/Z)>3)throw Error(`Image size ${Q} is not supported: the maximum aspect ratio is 3:1, either way up.`)}function S6(Q,$){if(Q.size!==void 0)try{x9(Q.size)}catch(Z){throw Error(`${$}: ${Z.message}`)}if(Q.background==="transparent"&&Q.format==="jpeg")throw Error(`${$}: a transparent background needs "png"; JPEG has no alpha channel.`);if(Q.compression!==void 0){let Z=Q.compression;if(!Number.isInteger(Z)||Z<0||Z>100)throw Error(`${$}: compression is an integer from 0 to 100; got ${Z}.`)}}function R6(Q,$){if(Q instanceof File)return Q;let Z=Q.type||"image/png",G=Z==="image/jpeg"?"jpg":Z.split("/")[1]??"png";return new File([Q],`${$}.${G}`,{type:Z})}class kQ{name;provider;settings;constructor(Q){let{name:$,provider:Z,...G}=Q;S6(G,`ImageModel "${$}"`),this.name=$,this.provider=Z,this.settings=G}static create(Q){return new kQ(Q)}async generate(Q){let $=this.merge(Q);return T6(await this.provider.generate({prompt:Q.prompt,...$,signal:Q.signal}))}async edit(Q){let $=this.merge(Q);return T6(await this.provider.edit({prompt:Q.prompt,...$,images:Q.images.map((Z,G)=>R6(Z,`image-${G}`)),...Q.mask?{mask:R6(Q.mask,"mask")}:{},signal:Q.signal}))}merge(Q){let $={...this.settings,...Q.size!==void 0?{size:Q.size}:{},...Q.quality!==void 0?{quality:Q.quality}:{},...Q.background!==void 0?{background:Q.background}:{},...Q.format!==void 0?{format:Q.format}:{},...Q.compression!==void 0?{compression:Q.compression}:{}};return S6($,`ImageModel "${this.name}"`),$}}function T6(Q){return{image:new Blob([Q.bytes],{type:Q.mimeType}),mimeType:Q.mimeType,size:Q.size,usage:Q.usage}}function A(Q){return typeof process>"u"?void 0:process.env?.[Q]}var b9="preview";function k6(Q){let $=Q.trim().replace(/\/+$/,"");if(!$)return"";return`${$.replace(/\/openai(?:\/v1)?$/i,"")}/openai`}function I9(Q){return/^\d{4}-\d{2}-\d{2}/.test(Q)?"":"/v1"}function ZQ(Q,$={}){return{base:(Q.baseURL??A("OPENAI_BASE_URL")??"https://api.openai.com/v1").replace(/\/+$/,""),query:"",headers:async()=>{let G=Q.apiKey??A("OPENAI_API_KEY");return{...G?{authorization:`Bearer ${G}`}:{},...Q.headers}},timeoutMs:Q.timeoutMs??$.timeoutMs??120000,maxRetries:Q.maxRetries??2}}function w9(Q){let $=Q.baseURL??Q.endpoint??A("AZURE_OPENAI_ENDPOINT");if($)return k6($);let Z=Q.resourceName??A("AZURE_OPENAI_RESOURCE_NAME")??A("AZURE_RESOURCE_NAME");return Z?k6(`https://${Z.trim()}.cognitiveservices.azure.com`):""}function GQ(Q,$={}){let Z=Q.apiVersion??A("AZURE_OPENAI_API_VERSION")??b9;return{base:`${w9(Q)}${I9(Z)}`,query:`?api-version=${encodeURIComponent(Z)}`,headers:async()=>{if(Q.getToken)return{authorization:`Bearer ${await Q.getToken()}`,...Q.headers};let G=Q.apiKey??A("AZURE_OPENAI_API_KEY");return{...G?{"api-key":G}:{},...Q.headers}},timeoutMs:Q.timeoutMs??$.timeoutMs??120000,maxRetries:Q.maxRetries??2}}class JQ extends Error{status;body;requestId;constructor(Q,$,Z){super(`Provider request failed with status ${Q}: ${f9($)}`);this.name="ProviderHttpError",this.status=Q,this.body=$,this.requestId=Z}}class WQ extends Error{timeoutMs;constructor(Q){super(`Provider request timed out after ${Q}ms`);this.name="ProviderTimeoutError",this.timeoutMs=Q}}function f9(Q){let $=E6(Q);if($?.message)return $.message;if(typeof Q==="string")return Q.slice(0,500);return"no error body"}function E6(Q){if(!Q||typeof Q!=="object")return null;let $=Q,G=$.error&&typeof $.error==="object"?$.error:Q;if(typeof G.message!=="string"&&typeof G.code!=="string"&&typeof G.type!=="string")return null;let J=G.innererror?.code??G.code;return{message:G.message,type:G.type,code:J,param:G.param}}function C(Q){if(Q instanceof WQ)return{code:"provider_error",message:Q.message,retryable:!0};if(u9(Q))return{code:"aborted",message:"The request was aborted.",retryable:!1};if(Q instanceof JQ)return v9(Q.status,E6(Q.body),Q.message);if(Q instanceof TypeError)return{code:"provider_error",message:`Could not reach the provider: ${Q.message}`,retryable:!0};if(Q instanceof Error)return{code:"provider_error",message:Q.message,retryable:!1};return{code:"unknown",message:String(Q),retryable:!1}}function v9(Q,$,Z){let G=$?.message??Z,J=($?.code??"").toLowerCase(),W=($?.type??"").toLowerCase(),Y=`${J} ${W} ${G}`.toLowerCase();if(Q===429){let V=J==="insufficient_quota"||Y.includes("quota");return{code:"rate_limited",message:G,retryable:!V}}if(Q>=500||Q===408||Q===409)return{code:"provider_error",message:G,retryable:!0};if(y9(Y))return{code:"context_length_exceeded",message:G,retryable:!1};if(h9(Y))return{code:"content_filtered",message:G,retryable:!1};if($?.param?.startsWith("tools")||Y.includes("invalid schema for function"))return{code:"invalid_tool_input",message:G,retryable:!1};return{code:"provider_error",message:G,retryable:!1}}function y9(Q){return Q.includes("context_length_exceeded")||Q.includes("maximum context length")||Q.includes("context window")||Q.includes("reduce the length")}function h9(Q){return Q.includes("content_filter")||Q.includes("content_policy_violation")||Q.includes("responsibleaipolicyviolation")||Q.includes("content management policy")}function u9(Q){if(!Q||typeof Q!=="object")return!1;let $=Q;return $.name==="AbortError"||$.code==="ABORT_ERR"}var g9=500,x6=20000;function c9(Q,$){if(!Q)return;let Z=Q.trim();if(/^\d+(\.\d+)?$/.test(Z))return Math.max(0,Number(Z)*1000);let G=Date.parse(Z);if(Number.isNaN(G))return;return Math.max(0,G-$)}function A6(Q,$){let Z=Math.min(x6,g9*2**Q);return Math.round(Z*(0.5+$()*0.5))}function m9(Q){return Q===429||Q===408||Q===409||Q>=500}function p9(Q,$){return m9(Q)&&C($).retryable}function b6(Q){return Q.reason??new DOMException("The operation was aborted.","AbortError")}function l9(Q,$){return new Promise((Z,G)=>{let J=setTimeout(Z,Q);$?.addEventListener("abort",()=>{clearTimeout(J),G(b6($))},{once:!0})})}async function g(Q,$,Z){let G=Z.fetchImpl??((H,B)=>fetch(H,B)),J=Z.sleep??l9,W=Z.random??Math.random,Y=Z.now??Date.now,V=Math.max(0,Z.maxRetries),X=async(H)=>{let B=Z.signal;if(!B)return await J(H);B.throwIfAborted();let D;try{await Promise.race([J(H,B),new Promise((L,U)=>{D=()=>U(b6(B)),B.addEventListener("abort",D,{once:!0})})])}finally{if(D)B.removeEventListener("abort",D)}},K;for(let H=0;H<=V;H++){Z.signal?.throwIfAborted();let B=new AbortController,D=()=>B.abort(Z.signal?.reason);Z.signal?.addEventListener("abort",D,{once:!0});let L=!1,U=Z.timeoutMs>0?setTimeout(()=>{L=!0,B.abort()},Z.timeoutMs):void 0,z;try{z=await G(Q,{...$,signal:B.signal})}catch(q){if(U!==void 0)clearTimeout(U);if(Z.signal?.removeEventListener("abort",D),Z.signal?.aborted)throw q;if(K=L?new WQ(Z.timeoutMs):q,L&&Z.retryTimeouts===!1)throw K;if(H===V)throw K;await X(A6(H,W));continue}if(U!==void 0)clearTimeout(U);if(z.ok)return z;Z.signal?.removeEventListener("abort",D);let F=await i9(z),_=new JQ(z.status,F,z.headers.get("x-request-id")??void 0);if(H===V||!p9(z.status,_))throw _;let M=c9(z.headers.get("retry-after"),Y());await X(M===void 0?A6(H,W):Math.min(M,x6)),K=_}throw K??Error("Provider request failed with no response.")}async function i9(Q){let $;try{$=await Q.text()}catch{return null}try{return JSON.parse($)}catch{return $}}var EQ=300000;function AQ(Q){return{generationsUrl:`${Q.base}/images/generations${Q.query}`,editsUrl:`${Q.base}/images/edits${Q.query}`,headers:Q.headers,timeoutMs:Q.timeoutMs,maxRetries:Q.maxRetries}}class YQ extends Error{code;retryable;constructor(Q,$={}){super(Q.message,$);this.name="ImageRequestError",this.code=Q.code,this.retryable=Q.retryable}}var d9={png:"image/png",jpeg:"image/jpeg"};function o9(Q){let $=Number(Q?.input_tokens??0),Z=Number(Q?.output_tokens??0),G={inputTokens:$,outputTokens:Z,totalTokens:Number(Q?.total_tokens??$+Z)},J=Q?.input_tokens_details?.image_tokens;if(typeof J==="number")G.imageInputTokens=J;let W=Q?.output_tokens_details?.image_tokens;if(typeof W==="number")G.imageOutputTokens=W;return G}function n9(Q){let $=atob(Q),Z=new Uint8Array($.length);for(let G=0;G<$.length;G++)Z[G]=$.charCodeAt(G);return Z}function s9(Q){let Z=Q?.data?.[0]?.b64_json;if(typeof Z!=="string"||Z.length===0)throw new YQ({code:"provider_error",message:"The provider answered an image call with no base64 image data.",retryable:!1});let G=typeof Q.output_format==="string"?Q.output_format:"png";return{bytes:n9(Z),mimeType:d9[G]??`image/${G}`,size:typeof Q.size==="string"?Q.size:"",...typeof Q.background==="string"?{background:Q.background}:{},usage:o9(Q.usage)}}async function I6(Q,$,Z,G){let J;try{J=await g(Q,$,{maxRetries:Z.maxRetries,timeoutMs:Z.timeoutMs,retryTimeouts:!1,signal:G.signal,fetchImpl:Z.fetchImpl})}catch(W){if(G.signal?.aborted)throw W;throw new YQ(C(W),{cause:W})}return s9(await J.json())}async function w6(Q,$,Z={}){return await I6(Q.generationsUrl,{method:"POST",headers:{...await Q.headers(),"content-type":"application/json"},body:JSON.stringify($)},Q,Z)}async function f6(Q,$,Z={}){return await I6(Q.editsUrl,{method:"POST",headers:await Q.headers(),body:$},Q,Z)}class XQ{static models(){return[]}modelName(){return this.model}async generate(Q){return await w6(this.endpoint(),this.body(Q),{signal:Q.signal})}async edit(Q){let $=new FormData;for(let[Z,G]of Object.entries(this.body(Q)))if(G!==void 0)$.set(Z,String(G));for(let Z of Q.images)$.append("image[]",Z,Z.name);if(Q.mask)$.set("mask",Q.mask,Q.mask.name);return await f6(this.endpoint(),$,{signal:Q.signal})}body(Q){return{model:this.modelName(),prompt:Q.prompt,...Q.size?{size:Q.size}:{},...Q.quality?{quality:Q.quality}:{},...Q.background?{background:Q.background}:{},...Q.format?{output_format:Q.format}:{},...Q.compression!==void 0?{output_compression:Q.compression}:{}}}normalizeError(Q){return C(Q)}}var v6=["gpt-image-2","gpt-image-1.5","gpt-image-1"];class xQ extends XQ{model;config;constructor(Q,$={}){super();this.model=Q,this.config=$}static model(Q,$){return new xQ(Q,$)}static models(){return v6}endpoint(){return AQ(ZQ(this.config,{timeoutMs:EQ}))}}class bQ extends XQ{model;config;constructor(Q,$={}){super();this.model=Q,this.config=$}static model(Q,$){return new bQ(Q,$)}static models(){return v6}modelName(){return this.config.deployment??this.model}endpoint(){return AQ(GQ(this.config,{timeoutMs:EQ}))}}async function*t9(Q){let $="",Z="",G=[],J,W=()=>{if(G.length===0&&!Z)return null;let X={event:Z,data:G.join(`
|
|
15
|
+
`):void 0}async runTools(Q,$,Z){let G=[],J=[];for(let W of $){let Y=this.config.registry.get(String(W.name));if(!Y){this.addResult(Q,{type:"tool-result",toolCallId:W.toolCallId,name:W.name,status:"error",error:{code:"tool_error",message:`There is no tool named "${String(W.name)}".`,toolCallId:W.toolCallId,retryable:!0}});continue}let V=Y.tool.inputSchema.safeParse(W.input);if(V.ok===!1){this.addResult(Q,{type:"tool-result",toolCallId:W.toolCallId,name:W.name,status:"error",error:{code:"invalid_tool_input",message:`Invalid arguments for "${String(W.name)}": ${V.errors.join(", ")}`,toolCallId:W.toolCallId,retryable:!0}});continue}W.input=V.value;let X=j6(Y.tool);if(X){if(this.onPending==="deny"){this.addResult(Q,this.deniedByPolicy(W));continue}G.push({toolCallId:W.toolCallId,name:W.name,input:V.value,kind:X,signature:G6(this.claimsFor(W.toolCallId,String(W.name),X,V.value)),...this.pathPrefix.length>0?{path:[...this.pathPrefix]}:{}});continue}J.push(this.executeTool(Y,Q.id,W,V.value,Z).then(async(K)=>{this.addResult(Q,K),await this.settleShown(W.toolCallId)}).catch((K)=>{if(K instanceof T){if(this.onPending==="deny"){this.addResult(Q,this.deniedByPolicy(W));return}G.push(...K.pending);return}}))}return await a(Promise.all(J).then(()=>{return}),this.controller.signal),G}claimsFor(Q,$,Z,G){return{runId:this.signingRunId,toolCallId:Q,name:$,kind:Z,input:G,path:this.pathPrefix.length>0?[...this.pathPrefix]:void 0}}deniedByPolicy(Q){return{type:"tool-result",toolCallId:Q.toolCallId,name:Q.name,status:"denied",cause:"refused",reason:`"${String(Q.name)}" needs the user, and this run was started with onPending: "deny". Answer from what you already have.`}}async executeTool(Q,$,Z,G,J,W){let Y=this.toolFiles(Z),V={context:this.context,body:this.params.body??{},runId:this.runId,threadId:this.params.threadId,toolCallId:Z.toolCallId,signal:this.controller.signal,step:J,depth:this.depth,resumed:W!==void 0,attachments:Y.attachments,generateImage:Y.generateImage,editImage:Y.editImage,turn:this.toolTurn($),runAgent:this.nestedRunner($,Z,W)};try{let X=Q.tool.execute(G,V),K;if(b9(X)){let H=await X.next();while(!H.done)this.emit({type:"tool-progress",toolCallId:Z.toolCallId,data:H.value}),H=await X.next();K=H.value}else K=await X;return{type:"tool-result",toolCallId:Z.toolCallId,name:Z.name,status:"ok",output:K}}catch(X){if(X instanceof k||this.controller.signal.aborted)throw new k;if(X instanceof T)throw X;return{type:"tool-result",toolCallId:Z.toolCallId,name:Z.name,status:"error",error:{code:"tool_error",message:X instanceof Error?X.message:String(X),toolCallId:Z.toolCallId,retryable:!0}}}}nestedRunner(Q,$,Z){let G=new SQ(()=>$.nested,()=>$.nested=[]);return async(J,W={})=>{let{at:Y,recorded:V,write:X}=G.next();if(V){let K=f9(V,J,W);if(K)throw Error(`Nested run ${Y} of "${String($.name)}" ${K}. `+"runAgent is memoized by call index, so a body whose runAgent calls depend on a condition that changed between turns cannot be resumed \u2014 the answer would be paired with a different sub-run. "+"Make the sequence of runAgent calls, and what each one is asked, the same every time this tool runs, or branch on ctx.resumed.");if(V.finishReason!=="awaiting-input")return{runId:V.runId,agent:V.agent,messages:V.messages,finishReason:V.finishReason??"stop",usage:V.usage??e(),output:O6(V.messages),nested:V}}return this.runNested(Q,$,J,W,X,V,Z?.answers??[])}}async runNested(Q,$,Z,G,J,W,Y){let V=[...this.chain,Z.name];if(this.chain.includes(Z.name))throw Error(`"${Z.name}" is already running further up this chain: ${V.join(" -> ")}. An agent cannot run itself, directly or through another agent.`);let X=this.depth+1;if(X>this.maxDepth)throw Error(`Nested agent runs are ${this.maxDepth} deep at most and this one would be ${X}: ${V.join(" -> ")}. Raise maxDepth on the agent at the root of the run if the tree is meant to be this deep.`);let K=G.label,H=[...this.pathPrefix,$.toolCallId],B=this.onPending==="deny"?"deny":G.onPending??"escalate",D=W!==void 0,L=D?$Q(W.messages):new Set,U=D?Y.filter((N)=>{let b=P6(N.path,H);if(b===null)return!1;return L.has(b.length>0?b[0]:N.toolCallId)}):[],z=Z.stream({messages:D?W.messages:G.messages??[],turn:D?{toolResults:U}:G.prompt?{text:G.prompt}:void 0,context:this.context,attachments:this.params.attachments,body:this.params.body,signal:this.controller.signal,threadId:this.params.threadId,instructions:G.instructions,maxOutputTokens:G.maxOutputTokens,temperature:G.temperature,runId:D?W.runId:void 0,nesting:{depth:X,maxDepth:this.maxDepth,chain:V,signingRunId:this.signingRunId,signingPath:H,onPending:B}}),F=[],C=(async()=>{for await(let N of z){if(N.type==="awaiting-input")F=N.pending;this.emit({type:"nested-event",toolCallId:$.toolCallId,runId:z.runId,agent:Z.name,label:K,event:N})}})(),M=(async()=>{let N=await z.result();await C;let b=D?L6(W.messages,N.messages):L6(G.messages??[],N.messages),rQ={runId:z.runId,agent:Z.name,label:K,messages:b,finishReason:N.finishReason,usage:D?QQ(W.usage??e(),N.usage):N.usage,...N.finishReason==="awaiting-input"?{signature:Y6({runId:this.signingRunId,path:H,nestedRunId:z.runId,open:[...$Q(b)],input:$.input})}:{}};return J(rQ),this.usage=QQ(this.usage,N.usage),{result:N,record:rQ}})(),q=M.then(()=>{return},()=>{return});this.nestedSettling.add(q);let O,S;try{({result:O,record:S}=await M)}finally{this.nestedSettling.delete(q)}if(this.controller.signal.aborted)throw new k;if(O.finishReason==="awaiting-input"){if(F.length===0)throw Error(`"${Z.name}" ended awaiting input but asked nothing, so there is no question to escalate.`);throw this.emit({type:"tool-call",messageId:Q,part:$,resent:!0}),new T({pending:F,path:H,nested:S})}return{runId:S.runId,agent:Z.name,messages:S.messages,finishReason:O.finishReason,usage:S.usage??e(),output:O.output??O6(S.messages),...O.error?{error:O.error}:{},nested:S}}addResult(Q,$){Q.content.push($),this.emit({type:"tool-result",messageId:Q.id,part:$})}toolFiles(Q){let $=this.params.attachments??null,Z=new SQ(()=>Q.attachments,()=>Q.attachments=[],()=>({failed:!0})),G=()=>{if(!$)throw new w("This request has no attachment scope, so a tool cannot store or read files on it. `attachmentScope()` returned null \u2014 put the chat route behind authentication, send a `threadId`, or override `attachmentScope()` on the controller.");return $},J=async(X,K,H)=>{let B=G(),D=K.mimeType||X.type||"",L=K.name??(X instanceof File?X.name:"attachment"),U;if(K.showModel){let F=this.config.provider;if(!F.capabilities.fileInput)throw Error(`"${String(Q.name)}" asked to show a file to ${F.model}, which does not accept file input. Drop \`showModel\` for this provider, or run this agent on a model that takes files \u2014 \`capabilities.fileInput\` is what says which do.`);U=await F.upload(new File([X],L,{type:D||void 0}))}return{attachment:await B.put(X,{name:L,mimeType:D,fileId:U}),...H?{generated:H}:{},...U?{shown:{fileId:U,messageId:`msg_${crypto.randomUUID()}`,createdAt:new Date().toISOString()}}:{}}},W=(X,K,H)=>{let B=X.generated?"image":"put";if(B===K)return;throw Error(`Attachment ${H} of "${String(Q.name)}" was ${B==="image"?"a generated image":"a stored file"} on the first attempt and is ${K==="image"?"a generated image":"a stored file"} now. ctx.attachments.put, ctx.generateImage and ctx.editImage share one memo indexed by call order within a tool call, so the sequence has to be the same every time this tool runs. Branch on ctx.resumed if it cannot be.`)},Y=async(X,K,H)=>{let{at:B,recorded:D,write:L}=Z.next();if(D&&"attachment"in D){if(W(D,"image",B),D.shown)this.queueShown(Q.toolCallId,D);return{attachment:D.attachment,size:D.generated.size,mimeType:D.attachment.mimeType,usage:D.generated.usage}}let U=await H();this.usage=QQ(this.usage,U.usage);let z=U.mimeType==="image/jpeg"?"jpg":"png",F=await J(U.image,{name:K.name??`${X.name}.${z}`,mimeType:U.mimeType,...K.showModel?{showModel:!0}:{}},{size:U.size,usage:U.usage});if(L(F),F.shown)this.queueShown(Q.toolCallId,F);return{attachment:F.attachment,size:U.size,mimeType:U.mimeType,usage:U.usage}},V=async(X)=>typeof X==="string"?await G().file(X):X;return{generateImage:(X,K)=>Y(X,K,()=>X.generate({...K,signal:this.controller.signal})),editImage:(X,K)=>Y(X,K,async()=>{let{images:H,mask:B,...D}=K;return await X.edit({...D,images:await Promise.all(H.map(V)),...B?{mask:await V(B)}:{},signal:this.controller.signal})}),attachments:{get:(X)=>G().get(X),read:(X)=>G().read(X),file:(X)=>G().file(X),put:async(X,K={})=>{let{at:H,recorded:B,write:D}=Z.next();if(B&&"attachment"in B){W(B,"put",H);let U=w9(B,X,K);if(U)throw Error(`Attachment ${H} of "${String(Q.name)}" ${U}. `+"ctx.attachments.put is memoized by call index within a tool call, so a body whose put calls depend on a condition that changed between turns cannot be replayed \u2014 the model would be shown a file under an id that names different bytes. "+"Make the sequence of put calls the same every time this tool runs, or branch on ctx.resumed.");if(B.shown)this.queueShown(Q.toolCallId,B);return B.attachment}let L=await J(X,K);if(D(L),L.shown)this.queueShown(Q.toolCallId,L);return L.attachment}}}}toolTurn(Q){let $=this.history.findIndex((W)=>W.id===Q),Z=_6(this.history),G;for(let W=$-1;W>=0;W--){let Y=this.history[W];if(Y.role!=="user"||Z.has(Y.id))continue;G=Y;break}let J=[];for(let W of G?.content??[]){if(W.type!=="file")continue;let Y=W.attachmentId;if(typeof Y!=="string"||!Y.startsWith(P))continue;if(!J.includes(Y))J.push(Y)}return Object.freeze({attachments:Object.freeze(J)})}queueShown(Q,$){let Z=$.shown;if(!Z)return;let G=this.shownQueue.get(Q)??[];if(G.some((J)=>J.id===Z.messageId))return;G.push({id:Z.messageId,role:"user",content:[{type:"file",fileId:Z.fileId,name:$.attachment.name,mimeType:$.attachment.mimeType,attachmentId:$.attachment.id}],createdAt:Z.createdAt,finishReason:"stop"}),this.shownQueue.set(Q,G)}async settleShown(Q){let $=this.shownQueue.get(Q);if(!$||$.length===0)return;if(this.shownQueue.delete(Q),this.ended||this.controller.signal.aborted)return;for(let Z of $){if(this.history.some((G)=>G.id===Z.id))continue;this.history.push(Z),this.produced.push(Z),this.emit({type:"message",message:Z}),this.unreported.add(Z)}}historyForProvider(Q){let $=this.history.filter((W)=>W!==Q),Z=_6($),G=[];for(let W of $){if(!Z.has(W.id))continue;for(let Y of W.content)if(Y.type==="file")G.push(Y)}if(G.length<=C6)return $;let J=new Set(G.slice(0,G.length-C6));return $.map((W)=>{if(!W.content.some((Y)=>Y.type==="file"&&J.has(Y)))return W;return{...W,content:W.content.map((Y)=>Y.type==="file"&&J.has(Y)?{type:"text",text:`[A ${Y.mimeType||"file"} produced by a tool (attachment ${Y.attachmentId}) was attached here and has been dropped from this request: only the most recent tool-produced file is kept attached, to keep the context bounded. Call the tool again if you need to look at it.]`}:Y)}})}async ingestTurn(){let Q=this.params.turn,$=this.openCalls(),Z=[];if($.length>0){let G=new Set,J=new Set,W=new Map;for(let Y of Q?.toolResults??[]){let V=`${(Y.path??[]).join("/")}#${Y.toolCallId}`;if(J.has(V))continue;J.add(V);let X=(D)=>this.emit({type:"error",error:{code:"invalid_tool_result",message:D,toolCallId:Y.toolCallId,retryable:!1}}),K=P6(Y.path,this.pathPrefix);if(K===null){X(`The answer for "${Y.toolCallId}" is addressed to a tool call this run is not inside.`);continue}if(K.length>0){let D=K[0],L=$.find((F)=>F.call.toolCallId===D);if(!L){X(`No pending tool call with id "${D}" to deliver a nested answer to.`);continue}let U=this.parkedBelow(L.call,K,Y.toolCallId);if(U.ok===!1){let F=`The answer for "${Y.toolCallId}" is addressed under "${D}", which`;X(U.reason==="unparked"?`${F} has no sub-agent run waiting on that question.`:U.reason==="expired"?`${F} parked a sub-agent run that has since expired. Ask again.`:`${F} carries a record of a parked sub-agent run the server did not sign.`);continue}let z=W.get(D);if(!z){if(!H6(U.signature)){X(`The answer for "${Y.toolCallId}" is addressed under "${D}", which has already been re-entered on that record. Ask again.`);continue}z=[],W.set(D,z),G.add(D)}z.push(Y);continue}let H=$.find((D)=>D.call.toolCallId===Y.toolCallId);if(!H){X(`No pending tool call with id "${Y.toolCallId}".`);continue}let B=await this.resolveAnswer(H,Y,Z);if(B===null)continue;if(G.add(Y.toolCallId),B!=="open")this.attachToHistory(H,B),await this.settleShown(Y.toolCallId)}for(let[Y,V]of W){let X=$.find((H)=>H.call.toolCallId===Y),K=await this.reenter(X,V,Z);if(K)this.attachToHistory(X,K),await this.settleShown(Y)}for(let Y of $){if(G.has(Y.call.toolCallId))continue;this.attachToHistory(Y,{type:"tool-result",toolCallId:Y.call.toolCallId,name:Y.call.name,status:"denied",cause:"refused"})}await this.reportDeferred()}if(Q&&(Q.text||Q.files&&Q.files.length>0)){let G={id:`msg_${crypto.randomUUID()}`,role:"user",content:[...Q.text?[{type:"text",text:Q.text}]:[],...(Q.files??[]).map((J)=>({type:"file",...J.fileId?{fileId:J.fileId}:{},name:J.name,mimeType:J.mimeType,...J.attachmentId?{attachmentId:J.attachmentId}:{}}))],createdAt:new Date().toISOString(),finishReason:"stop"};this.history.push(G),this.produced.push(G),await this.report(G)}return Z}parkedBelow(Q,$,Z){let G=$.length>1?$[1]:Z,J=[...this.pathPrefix,Q.toolCallId],W=(Q.nested??[]).find((V)=>V.finishReason==="awaiting-input"&&$Q(V.messages).has(G));if(!W)return{ok:!1,reason:"unparked"};if(typeof W.signature!=="string")return{ok:!1,reason:"unsigned"};let Y=X6(W.signature,{path:J,nestedRunId:W.runId,open:[...$Q(W.messages)],input:Q.input});if(Y.ok===!1)return{ok:!1,reason:Y.reason==="expired"?"expired":"unsigned"};return{ok:!0,signature:W.signature}}async reenter(Q,$,Z){let G=String(Q.call.name),J=this.config.registry.get(G);if(!J||!J.tool.execute)return{type:"tool-result",toolCallId:Q.call.toolCallId,name:Q.call.name,status:"error",error:{code:"invalid_tool_result",message:`The tool "${G}" no longer exists, so the sub-agent's question cannot be delivered.`,toolCallId:Q.call.toolCallId,retryable:!1}};let W=J.tool.inputSchema.safeParse(Q.call.input);if(W.ok===!1)return{type:"tool-result",toolCallId:Q.call.toolCallId,name:Q.call.name,status:"error",error:{code:"invalid_tool_input",message:`Invalid arguments for "${G}": ${W.errors.join(", ")}`,toolCallId:Q.call.toolCallId,retryable:!0}};let Y=this.amendCall(Q);Y.input=W.value;try{return await a(this.executeTool(J,Q.message.id,Y,W.value,0,{answers:$}),this.controller.signal)}catch(V){if(V instanceof T)return Z.push(...V.pending),null;throw V}}amendCall(Q){let $=this.amend(Q.message),Z=$.content.indexOf(Q.call),G={...Q.call,nested:(Q.call.nested??[]).map((J)=>({...J})),...Q.call.attachments?{attachments:Q.call.attachments.map((J)=>({...J}))}:{}};if(Z>=0)$.content[Z]=G;return this.unreported.add($),G}openCalls(){let Q=new Set;for(let Z of this.history)for(let G of Z.content)if(G.type==="tool-result")Q.add(G.toolCallId);let $=[];for(let Z of this.history)for(let G of Z.content)if(G.type==="tool-call"&&!Q.has(G.toolCallId))$.push({message:Z,call:G});return $}async resolveAnswer(Q,$,Z){let G=Q.call,J=String(G.name),W=this.config.registry.get(J),Y=(H)=>{return this.emit({type:"error",error:{code:"invalid_tool_result",message:H,toolCallId:G.toolCallId,retryable:!1}}),null};if(!W)return Y(`The tool "${J}" no longer exists, so its answer cannot be checked.`);let V=j6(W.tool);if(!V)return Y(`"${J}" is a server tool with no pending question.`);if(typeof $.signature!=="string"||$.signature.length===0)return Y(`The answer for "${J}" carried no signature.`);let X=i($.signature);if(!X)return Y(`The signature for "${J}" is malformed.`);let K=J6($.signature,{...this.claimsFor(G.toolCallId,J,V,G.input),runId:X.runId});if(K.ok===!1)return Y(K.reason==="expired"?`The approval for "${J}" has expired. Ask again.`:`The answer for "${J}" does not match the call the server made.`);if(!K6($.signature))return Y(`The answer for "${J}" has already been used. Ask again.`);if("approve"in $){if(V!=="approval")return Y(`"${J}" is answered by the client, not approved.`);if($.approve===!0){let H=this.amendCall(Q);try{return await a(this.executeTool(W,Q.message.id,H,H.input,0),this.controller.signal)}catch(B){if(B instanceof T)return Z.push(...B.pending),"open";throw B}}return{type:"tool-result",toolCallId:G.toolCallId,name:G.name,status:"denied",cause:"refused",reason:$.reason}}if("output"in $){if(V==="approval")return Y(`"${J}" is approved, not answered: the server produces its result.`);let H=W.tool.outputSchema,B=H?H.safeParse($.output):{ok:!0,value:$.output};if(B.ok===!1)return{type:"tool-result",toolCallId:G.toolCallId,name:G.name,status:"error",error:{code:"invalid_tool_result",message:`The answer for "${J}" did not match its output schema: ${B.errors.join(", ")}`,toolCallId:G.toolCallId,retryable:!0}};return{type:"tool-result",toolCallId:G.toolCallId,name:G.name,status:"ok",output:B.value}}return Y(`The answer for "${J}" carried neither an approval nor an output.`)}attachToHistory(Q,$){let Z=this.amend(Q.message);Z.content.push($),this.unreported.add(Z),this.emit({type:"tool-result",messageId:Z.id,part:$})}amend(Q){let $=this.amended.get(Q.id);if($)return $;let Z={...Q,content:[...Q.content]},G=this.history.indexOf(Q);if(G>=0)this.history[G]=Z;return this.produced.push(Z),this.amended.set(Q.id,Z),Z}async reportDeferred(){let Q=[...this.unreported];this.unreported.clear();for(let $ of Q)await this.report($)}async finalizeAborted(){if(this.nestedSettling.size>0)await Promise.all([...this.nestedSettling]);for(let $ of this.openCalls()){if($.message===this.current)continue;this.attachToHistory($,{type:"tool-result",toolCallId:$.call.toolCallId,name:$.call.name,status:"denied",cause:"stopped",reason:this.stopReason})}await this.reportDeferred();let Q=this.current;if(Q){let $=new Set(Q.content.filter((Z)=>Z.type==="tool-result").map((Z)=>Z.toolCallId));for(let Z of[...Q.content]){if(Z.type!=="tool-call"||$.has(Z.toolCallId))continue;delete Z.partial,this.addResult(Q,{type:"tool-result",toolCallId:Z.toolCallId,name:Z.name,status:"denied",cause:"stopped",reason:this.stopReason})}}this.finishReason="aborted",await this.finalizeMessage("aborted")}}function j6(Q){if(Q.answeredBy==="client")return Q.inputSchema===RQ?"question":"client";return Q.requiresApproval?"approval":null}function M6(Q){if(!Q||!Q.trim())return{};try{return JSON.parse(Q)}catch{return Q}}function v9(Q){if(Q.length>0)Q[0];return Q}function y9(Q,$,Z){let G=Q.content[Q.content.length-1];if(G&&G.type===$){G.text=(G.text??"")+Z;return}Q.content.push($==="text"?{type:"text",text:Z}:{type:"reasoning",text:Z})}function h9(Q,$,Z){let G=Q.content[Q.content.length-1];if(G&&G.type==="reasoning"&&G.id===$){G.text=(G.text??"")+Z;return}Q.content.push($?{type:"reasoning",id:$,text:Z}:{type:"reasoning",text:Z})}function u9(Q,$){return Q.descriptors($).map((Z)=>A.create({name:Z.name,description:Z.description,inputSchema:Z.inputSchema,requiresApproval:Z.requiresApproval,execute:(G,J)=>{let W=ZQ.getStore()?.req;if(!W)throw Error(`"${Z.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 Q.execute({kind:"local",req:W},Z.name,G,J)}}))}function g9(Q){if(Q==="auto")return;let $=/^(\d+)x(\d+)$/.exec(Q);if(!$)throw Error(`An image size is "WIDTHxHEIGHT" or "auto"; got ${JSON.stringify(Q)}.`);let Z=Number($[1]),G=Number($[2]);if(Z%16!==0||G%16!==0)throw Error(`Image size ${Q} is not supported: width and height must both be divisible by 16.`);if(Math.max(Z/G,G/Z)>3)throw Error(`Image size ${Q} is not supported: the maximum aspect ratio is 3:1, either way up.`)}function A6(Q,$){if(Q.size!==void 0)try{g9(Q.size)}catch(Z){throw Error(`${$}: ${Z.message}`)}if(Q.background==="transparent"&&Q.format==="jpeg")throw Error(`${$}: a transparent background needs "png"; JPEG has no alpha channel.`);if(Q.compression!==void 0){let Z=Q.compression;if(!Number.isInteger(Z)||Z<0||Z>100)throw Error(`${$}: compression is an integer from 0 to 100; got ${Z}.`)}}function E6(Q,$){if(Q instanceof File)return Q;let Z=Q.type||"image/png",G=Z==="image/jpeg"?"jpg":Z.split("/")[1]??"png";return new File([Q],`${$}.${G}`,{type:Z})}class EQ{name;provider;settings;constructor(Q){let{name:$,provider:Z,...G}=Q;A6(G,`ImageModel "${$}"`),this.name=$,this.provider=Z,this.settings=G}static create(Q){return new EQ(Q)}async generate(Q){let $=this.merge(Q);return x6(await this.provider.generate({prompt:Q.prompt,...$,signal:Q.signal}))}async edit(Q){let $=this.merge(Q);return x6(await this.provider.edit({prompt:Q.prompt,...$,images:Q.images.map((Z,G)=>E6(Z,`image-${G}`)),...Q.mask?{mask:E6(Q.mask,"mask")}:{},signal:Q.signal}))}merge(Q){let $={...this.settings,...Q.size!==void 0?{size:Q.size}:{},...Q.quality!==void 0?{quality:Q.quality}:{},...Q.background!==void 0?{background:Q.background}:{},...Q.format!==void 0?{format:Q.format}:{},...Q.compression!==void 0?{compression:Q.compression}:{}};return A6($,`ImageModel "${this.name}"`),$}}function x6(Q){return{image:new Blob([Q.bytes],{type:Q.mimeType}),mimeType:Q.mimeType,size:Q.size,usage:Q.usage}}function E(Q){return typeof process>"u"?void 0:process.env?.[Q]}var c9="preview";function b6(Q){let $=Q.trim().replace(/\/+$/,"");if(!$)return"";return`${$.replace(/\/openai(?:\/v1)?$/i,"")}/openai`}function m9(Q){return/^\d{4}-\d{2}-\d{2}/.test(Q)?"":"/v1"}function WQ(Q,$={}){return{base:(Q.baseURL??E("OPENAI_BASE_URL")??"https://api.openai.com/v1").replace(/\/+$/,""),query:"",headers:async()=>{let G=Q.apiKey??E("OPENAI_API_KEY");return{...G?{authorization:`Bearer ${G}`}:{},...Q.headers}},timeoutMs:Q.timeoutMs??$.timeoutMs??120000,maxRetries:Q.maxRetries??2}}function p9(Q){let $=Q.baseURL??Q.endpoint??E("AZURE_OPENAI_ENDPOINT");if($)return b6($);let Z=Q.resourceName??E("AZURE_OPENAI_RESOURCE_NAME")??E("AZURE_RESOURCE_NAME");return Z?b6(`https://${Z.trim()}.cognitiveservices.azure.com`):""}function YQ(Q,$={}){let Z=Q.apiVersion??E("AZURE_OPENAI_API_VERSION")??c9;return{base:`${p9(Q)}${m9(Z)}`,query:`?api-version=${encodeURIComponent(Z)}`,headers:async()=>{if(Q.getToken)return{authorization:`Bearer ${await Q.getToken()}`,...Q.headers};let G=Q.apiKey??E("AZURE_OPENAI_API_KEY");return{...G?{"api-key":G}:{},...Q.headers}},timeoutMs:Q.timeoutMs??$.timeoutMs??120000,maxRetries:Q.maxRetries??2}}var l9=500,w6=20000;function d9(Q,$){if(!Q)return;let Z=Q.trim();if(/^\d+(\.\d+)?$/.test(Z))return Math.max(0,Number(Z)*1000);let G=Date.parse(Z);if(Number.isNaN(G))return;return Math.max(0,G-$)}function I6(Q,$){let Z=Math.min(w6,l9*2**Q);return Math.round(Z*(0.5+$()*0.5))}function i9(Q){return Q===429||Q===408||Q===409||Q>=500}function o9(Q,$){return i9(Q)&&_($).retryable}function f6(Q){return Q.reason??new DOMException("The operation was aborted.","AbortError")}function n9(Q,$){return new Promise((Z,G)=>{let J=setTimeout(Z,Q);$?.addEventListener("abort",()=>{clearTimeout(J),G(f6($))},{once:!0})})}async function c(Q,$,Z){let G=Z.fetchImpl??((H,B)=>fetch(H,B)),J=Z.sleep??n9,W=Z.random??Math.random,Y=Z.now??Date.now,V=Math.max(0,Z.maxRetries),X=async(H)=>{let B=Z.signal;if(!B)return await J(H);B.throwIfAborted();let D;try{await Promise.race([J(H,B),new Promise((L,U)=>{D=()=>U(f6(B)),B.addEventListener("abort",D,{once:!0})})])}finally{if(D)B.removeEventListener("abort",D)}},K;for(let H=0;H<=V;H++){Z.signal?.throwIfAborted();let B=new AbortController,D=()=>B.abort(Z.signal?.reason);Z.signal?.addEventListener("abort",D,{once:!0});let L=!1,U=Z.timeoutMs>0?setTimeout(()=>{L=!0,B.abort()},Z.timeoutMs):void 0,z;try{z=await G(Q,{...$,signal:B.signal})}catch(q){if(U!==void 0)clearTimeout(U);if(Z.signal?.removeEventListener("abort",D),Z.signal?.aborted)throw q;if(K=L?new r(Z.timeoutMs):q,L&&Z.retryTimeouts===!1)throw K;if(H===V)throw K;await X(I6(H,W));continue}if(U!==void 0)clearTimeout(U);if(z.ok)return z;Z.signal?.removeEventListener("abort",D);let F=await s9(z),C=new t(z.status,F,z.headers.get("x-request-id")??void 0);if(H===V||!o9(z.status,C))throw C;let M=d9(z.headers.get("retry-after"),Y());await X(M===void 0?I6(H,W):Math.min(M,w6)),K=C}throw K??Error("Provider request failed with no response.")}async function s9(Q){let $;try{$=await Q.text()}catch{return null}try{return JSON.parse($)}catch{return $}}var xQ=300000;function bQ(Q){return{generationsUrl:`${Q.base}/images/generations${Q.query}`,editsUrl:`${Q.base}/images/edits${Q.query}`,headers:Q.headers,timeoutMs:Q.timeoutMs,maxRetries:Q.maxRetries}}class XQ extends Error{code;retryable;constructor(Q,$={}){super(Q.message,$);this.name="ImageRequestError",this.code=Q.code,this.retryable=Q.retryable}}var t9={png:"image/png",jpeg:"image/jpeg"};function r9(Q){let $=Number(Q?.input_tokens??0),Z=Number(Q?.output_tokens??0),G={inputTokens:$,outputTokens:Z,totalTokens:Number(Q?.total_tokens??$+Z)},J=Q?.input_tokens_details?.image_tokens;if(typeof J==="number")G.imageInputTokens=J;let W=Q?.output_tokens_details?.image_tokens;if(typeof W==="number")G.imageOutputTokens=W;return G}function a9(Q){let $=atob(Q),Z=new Uint8Array($.length);for(let G=0;G<$.length;G++)Z[G]=$.charCodeAt(G);return Z}function e9(Q){let Z=Q?.data?.[0]?.b64_json;if(typeof Z!=="string"||Z.length===0)throw new XQ({code:"provider_error",message:"The provider answered an image call with no base64 image data.",retryable:!1});let G=typeof Q.output_format==="string"?Q.output_format:"png";return{bytes:a9(Z),mimeType:t9[G]??`image/${G}`,size:typeof Q.size==="string"?Q.size:"",...typeof Q.background==="string"?{background:Q.background}:{},usage:r9(Q.usage)}}async function v6(Q,$,Z,G){let J;try{J=await c(Q,$,{maxRetries:Z.maxRetries,timeoutMs:Z.timeoutMs,retryTimeouts:!1,signal:G.signal,fetchImpl:Z.fetchImpl})}catch(W){if(G.signal?.aborted)throw W;throw new XQ(_(W),{cause:W})}return e9(await J.json())}async function y6(Q,$,Z={}){return await v6(Q.generationsUrl,{method:"POST",headers:{...await Q.headers(),"content-type":"application/json"},body:JSON.stringify($)},Q,Z)}async function h6(Q,$,Z={}){return await v6(Q.editsUrl,{method:"POST",headers:await Q.headers(),body:$},Q,Z)}class VQ{static models(){return[]}modelName(){return this.model}async generate(Q){return await y6(this.endpoint(),this.body(Q),{signal:Q.signal})}async edit(Q){let $=new FormData;for(let[Z,G]of Object.entries(this.body(Q)))if(G!==void 0)$.set(Z,String(G));for(let Z of Q.images)$.append("image[]",Z,Z.name);if(Q.mask)$.set("mask",Q.mask,Q.mask.name);return await h6(this.endpoint(),$,{signal:Q.signal})}body(Q){return{model:this.modelName(),prompt:Q.prompt,...Q.size?{size:Q.size}:{},...Q.quality?{quality:Q.quality}:{},...Q.background?{background:Q.background}:{},...Q.format?{output_format:Q.format}:{},...Q.compression!==void 0?{output_compression:Q.compression}:{}}}normalizeError(Q){return _(Q)}}var u6=["gpt-image-2","gpt-image-1.5","gpt-image-1"];class IQ extends VQ{model;config;constructor(Q,$={}){super();this.model=Q,this.config=$}static model(Q,$){return new IQ(Q,$)}static models(){return u6}endpoint(){return bQ(WQ(this.config,{timeoutMs:xQ}))}}class wQ extends VQ{model;config;constructor(Q,$={}){super();this.model=Q,this.config=$}static model(Q,$){return new wQ(Q,$)}static models(){return u6}modelName(){return this.config.deployment??this.model}endpoint(){return bQ(YQ(this.config,{timeoutMs:xQ}))}}async function*Q$(Q){let $="",Z="",G=[],J,W=()=>{if(G.length===0&&!Z)return null;let X={event:Z,data:G.join(`
|
|
16
16
|
`),id:J};return Z="",G=[],J=void 0,X.data?X:null},Y=(X)=>{let K=X.endsWith("\r")?X.slice(0,-1):X;if(K==="")return W();if(K.startsWith(":"))return null;let H=K.indexOf(":"),B=H===-1?K:K.slice(0,H),D=H===-1?"":K.slice(H+1);if(D.startsWith(" "))D=D.slice(1);if(B==="event")Z=D;else if(B==="data")G.push(D);else if(B==="id")J=D;return null};for await(let X of Q){$+=X;let K=$.indexOf(`
|
|
17
17
|
`);while(K!==-1){let H=$.slice(0,K);$=$.slice(K+1);let B=Y(H);if(B)yield B;K=$.indexOf(`
|
|
18
|
-
`)}}if($.length>0){let X=Y($);if(X)yield X}let V=W();if(V)yield V}async function*y6(Q,$={}){let Z=new Map,G=new Set,J=!1;for await(let W of t9(Q)){if(W.data==="[DONE]")break;let Y;try{Y=JSON.parse(W.data)}catch{continue}switch(typeof Y.type==="string"?Y.type:W.event){case"response.output_text.delta":{let X=String(Y.delta??"");if(!X)break;yield $.structuredOutput?{type:"output-delta",delta:X}:{type:"text-delta",delta:X};break}case"response.reasoning_summary_text.delta":case"response.reasoning_text.delta":{let X=String(Y.delta??"");if(!X)break;yield{type:"reasoning-delta",delta:X,id:Y.item_id};break}case"response.output_item.added":{let X=Y.item;if(!X)break;if(X.type==="function_call"){let K=String(X.id??Y.item_id??X.call_id??"");Z.set(K,{callId:String(X.call_id??K),name:String(X.name??""),namespace:typeof X.namespace==="string"&&X.namespace?X.namespace:void 0,done:!1})}break}case"response.function_call_arguments.delta":{let X=Z.get(String(Y.item_id??""));if(!X)break;let K=String(Y.delta??"");if(!K)break;yield{type:"tool-call-delta",toolCallId:X.callId,name:X.name,argsDelta:K,...X.namespace?{namespace:X.namespace}:{}};break}case"response.function_call_arguments.done":{let X=String(Y.item_id??""),K=Z.get(X);if(!K)break;K.done=!0,yield{type:"tool-call",toolCallId:K.callId,name:K.name,args:String(Y.arguments??""),...K.namespace?{namespace:K.namespace}:{}};break}case"response.output_item.done":{let X=Y.item;if(!X)break;if(X.type==="function_call"){let K=String(X.id??Y.item_id??X.call_id??""),H=Z.get(K);if(H?.done)break;let B=(typeof X.namespace==="string"?X.namespace:"")||H?.namespace;if(yield{type:"tool-call",toolCallId:String(X.call_id??K),name:String(X.name??H?.name??""),args:String(X.arguments??""),...B?{namespace:B}:{}},H)H.done=!0;break}if(X.type==="tool_search_call"||X.type==="tool_search_output"){let K=r9(X);if(K.loaded.length===0&&K.namespaces.length===0)break;let H=String(X.tool_search_call_id??X.id??"");if(G.has(H))break;G.add(H),yield{type:"tool-search",...K}}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":{J=!0,yield{type:"finish",reason:"stop",usage:IQ(Y.response?.usage)};break}case"response.incomplete":{J=!0;let X=IQ(Y.response?.usage),K=Y.response?.incomplete_details?.reason;if(K==="content_filter"){yield{type:"error",error:{code:"content_filtered",message:a9(Y.response?.content_filters),retryable:!1}},yield{type:"finish",reason:"error",usage:X};break}yield{type:"finish",reason:K==="max_output_tokens"?"length":"stop",usage:X};break}case"response.failed":case"error":{J=!0;let X=Y.response?.error??Y.error??Y;yield{type:"error",error:e9(X)},yield{type:"finish",reason:"error",usage:IQ(Y.response?.usage)};break}}if(J)return}if(!J)yield{type:"error",error:{code:"provider_error",message:"The provider stream ended without a terminal event.",retryable:!0}},yield{type:"finish",reason:"error",usage:f()}}function r9(Q){let $=[],Z=[];return h6(Q.results??Q.tools??Q.loaded??Q.output,$,Z,0),{loaded:wQ($),namespaces:wQ(Z)}}function h6(Q,$,Z,G){if(!Array.isArray(Q)||G>4)return;for(let J of Q){if(typeof J==="string"){$.push(J);continue}if(!J||typeof J!=="object")continue;let W=J,Y=typeof W.name==="string"?W.name:typeof W.tool_name==="string"?W.tool_name:"",V=W.tools??W.functions;if(Array.isArray(V)){if(Y)Z.push(Y);h6(V,$,Z,G+1);continue}if(Y)$.push(Y)}}function wQ(Q){return Q.filter(($,Z)=>Q.indexOf($)===Z)}function a9(Q){if(!Array.isArray(Q))return"The provider's content filter blocked this request.";let Z=[];for(let G of Q){if(!G||typeof G!=="object")continue;let J=G,W=J.content_filter_results;if(!W||typeof W!=="object")continue;for(let[Y,V]of Object.entries(W))if(V&&typeof V==="object"&&V.filtered===!0)Z.push(`${Y} (${String(J.source_type??"unknown")})`)}return Z.length===0?"The provider's content filter blocked this request.":`The provider's content filter blocked this request. Categories: ${wQ(Z).join(", ")}.`}function e9(Q){let $=typeof Q?.message==="string"?Q.message:"The provider stream failed.",Z=String(Q?.code??"").toLowerCase();if(Z==="rate_limit_exceeded")return{code:"rate_limited",message:$,retryable:!0};if(Z==="context_length_exceeded")return{code:"context_length_exceeded",message:$,retryable:!1};if(Z.includes("content_filter"))return{code:"content_filtered",message:$,retryable:!1};return{code:"provider_error",message:$,retryable:!0}}function f(){return{inputTokens:0,outputTokens:0,totalTokens:0}}function IQ(Q){if(!Q)return f();let $=Number(Q.input_tokens??0),Z=Number(Q.output_tokens??0),G={inputTokens:$,outputTokens:Z,totalTokens:Number(Q.total_tokens??$+Z)},J=Q.output_tokens_details?.reasoning_tokens;if(typeof J==="number")G.reasoningTokens=J;let W=Q.input_tokens_details?.cached_tokens;if(typeof W==="number")G.cachedInputTokens=W;return G}async function*u6(Q){if(!Q)return;let $=Q.getReader(),Z=new TextDecoder;try{while(!0){let{done:J,value:W}=await $.read();if(J)break;if(W)yield Z.decode(W,{stream:!0})}let G=Z.decode();if(G)yield G}finally{$.releaseLock()}}function fQ(Q){return{responsesUrl:`${Q.base}/responses${Q.query}`,filesUrl:`${Q.base}/files${Q.query}`,headers:Q.headers,timeoutMs:Q.timeoutMs,maxRetries:Q.maxRetries}}async function*vQ(Q,$,Z){let G;try{G=await g(Q.responsesUrl,{method:"POST",headers:{...await Q.headers(),"content-type":"application/json"},body:JSON.stringify($)},{maxRetries:Q.maxRetries,timeoutMs:Q.timeoutMs,signal:Z.signal,fetchImpl:Q.fetchImpl})}catch(J){let W=C(J);if(W.code!=="aborted")yield{type:"error",error:W};yield{type:"finish",reason:W.code==="aborted"?"aborted":"error",usage:f()};return}try{yield*y6(u6(G.body),{structuredOutput:Z.structuredOutput})}catch(J){let W=C(J);if(W.code==="aborted"){yield{type:"finish",reason:"aborted",usage:f()};return}yield{type:"error",error:W},yield{type:"finish",reason:"error",usage:f()}}}async function yQ(Q,$){let Z=new FormData;Z.set("purpose","user_data"),Z.set("file",$);let J=await(await g(Q.filesUrl,{method:"POST",headers:await Q.headers(),body:Z},{maxRetries:Q.maxRetries,timeoutMs:Q.timeoutMs,fetchImpl:Q.fetchImpl})).json();if(!J?.id)throw Error("The provider accepted the upload but returned no file id.");return J.id}function hQ(Q){let $=Q$(Q);if($.startsWith("gpt-3.5")||$.startsWith("text-")||$.startsWith("davinci"))return{reasoning:!1,structuredOutput:!1,fileInput:!1,parallelToolCalls:!0,toolSearch:!1};let Z=$$($);if(Z?.kind==="o")return{reasoning:!0,structuredOutput:!0,fileInput:!0,parallelToolCalls:Z.major>1,toolSearch:g6(Z)};if(Z?.kind==="gpt")return{reasoning:Z.major>=5,structuredOutput:Z.major>4||$.startsWith("gpt-4o")||$.startsWith("gpt-4.1"),fileInput:Z.major>4||$.startsWith("gpt-4o")||$.startsWith("gpt-4.1"),parallelToolCalls:!0,toolSearch:g6(Z)};return{reasoning:!0,structuredOutput:!0,fileInput:!0,parallelToolCalls:!0,toolSearch:!0}}function g6(Q){if(Q.kind==="o")return Q.major>=5;return Q.major>5||Q.major===5&&Q.minor>=2}function Q$(Q){return Q.trim().toLowerCase()}function $$(Q){let $=/^gpt-(\d+)(?:\.(\d+))?/.exec(Q);if($?.[1])return{kind:"gpt",major:Number($[1]),minor:Number($[2]??0)};let Z=/^o(\d+)(?:[-.]|$)/.exec(Q);if(Z?.[1])return{kind:"o",major:Number(Z[1]),minor:0};return null}function uQ(Q,$){let{capabilities:Z}=$,G={model:$.model,input:Z$(Q.messages,Z),stream:!0};if(Q.systemPrompt)G.instructions=Q.systemPrompt;let J=B$(Q.tools,Z);if(J.length>0){if(G.tools=J,!Z.parallelToolCalls)G.parallel_tool_calls=!1}if(Q.output)G.text={format:{type:"json_schema",name:Q.output.name,schema:Q.output.schema,strict:Q.output.strict}};if(Q.reasoning&&Z.reasoning)G.reasoning={effort:Q.reasoning,summary:"auto"};if(typeof Q.temperature==="number")G.temperature=Q.temperature;if(typeof Q.maxOutputTokens==="number")G.max_output_tokens=Q.maxOutputTokens;return G}function Z$(Q,$){let Z=[];for(let G of Q){let J=G.role,W=[],Y=()=>{if(W.length===0)return;Z.push({type:"message",role:J,content:W}),W=[]};for(let V of G.content??[])switch(V.type){case"text":{if(!V.text)break;W.push(VQ(J,V.text));break}case"output":{if(V.partial)break;W.push(VQ(J,JSON.stringify(V.value)));break}case"file":{if(J==="assistant")break;let X=W$(V);if(!$.fileInput){if(X)W.push(VQ(J,c6(V,!1)));break}if(V.fileId?.startsWith(P))throw Error(`FilePart.fileId holds a gemi attachment id (${V.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(!V.fileId&&!X)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)W.push(VQ(J,c6(V,!!V.fileId)));if(V.fileId)W.push(Y$(V));break}case"reasoning":{Y();let X=K$(V);if(X)Z.push(X);break}case"tool-call":{if(V.partial)break;Y(),Z.push({type:"function_call",call_id:V.toolCallId,name:String(V.name),arguments:JSON.stringify(V.input??{})});break}case"tool-result":{Y(),Z.push({type:"function_call_output",call_id:V.toolCallId,output:H$(V)});break}}Y()}return J$(Z)}var G$="No result was recorded for this tool call. Assume it did not complete.";function J$(Q){let $=new Set,Z=new Set,G=[];for(let W of Q){if(W.type==="function_call"){let Y=String(W.call_id);if($.has(Y))continue;$.add(Y)}else if(W.type==="function_call_output"){let Y=String(W.call_id);if(!$.has(Y)||Z.has(Y))continue;Z.add(Y)}G.push(W)}if(Z.size===$.size)return G;let J=[];for(let W of G){if(J.push(W),W.type!=="function_call")continue;let Y=String(W.call_id);if(Z.has(Y))continue;Z.add(Y),J.push({type:"function_call_output",call_id:Y,output:G$})}return J}function VQ(Q,$){return{type:Q==="assistant"?"output_text":"input_text",text:$}}function W$(Q){let $=Q.attachmentId;return typeof $==="string"&&$.startsWith(P)?$:void 0}function c6(Q,$){let Z=[`id=${JSON.stringify(Q.attachmentId)}`];if(Q.name)Z.push(`name=${JSON.stringify(Q.name)}`);if(Q.mimeType)Z.push(`mimeType=${JSON.stringify(Q.mimeType)}`);let G=`attachment ${Z.join(" ")}`;return $?`[${G}]`:`[${G} \u2014 its contents are not shown to you; a tool can read the file by this id]`}function Y$(Q){let $=Q.mimeType?.trim().toLowerCase()??"";return{type:($?$.startsWith("image/")&&$!=="image/svg+xml":X$(Q.name))?"input_image":"input_file",file_id:Q.fileId}}function X$(Q){let $=/\.([a-z0-9]+)$/.exec(Q?.trim().toLowerCase()??"");return $?.[1]!==void 0&&V$.has($[1])}var V$=new Set(["jpeg","jpg","png","gif","webp"]);function K$(Q){if(!Q.id)return null;let $={type:"reasoning",id:Q.id};return $.summary=Q.text?[{type:"summary_text",text:Q.text}]:[],$}function H$(Q){if(Q.status==="ok")return typeof Q.output==="string"?Q.output:JSON.stringify(Q.output??null);if(Q.status==="denied"){let $=Q.reason?` Reason given: ${Q.reason}`:"";if(Q.cause==="stopped")return`The run was stopped before this tool call could complete, so it did not run.${$}`;if(Q.cause==="interrupted")return`The run was interrupted (the server stopped) while this tool call was in progress, so its result was lost. It may have run in part or in full: check its effects before repeating it.${$}`;return`The user declined this tool call, so it did not run.${$}`}return`The tool call failed and produced no result. Error (${Q.error?.code??"unknown"}): ${Q.error?.message??"no message"}`}function m6(Q){return Array.isArray(Q.tools)}function B$(Q,$){if(!Q||Q.length===0)return[];if(!$.toolSearch){let J=[];for(let W of Q)if(m6(W))for(let Y of W.tools)J.push(KQ(Y,!1));else J.push(KQ(W,!1));return J}let Z=[],G=!1;for(let J of Q)if(m6(J)){let W=J.tools.map((Y)=>{if(Y.deferred)G=!0;return KQ(Y,!0)});Z.push({type:"namespace",name:J.name,description:J.description,tools:W})}else{if(J.deferred)G=!0;Z.push(KQ(J,!0))}if(G)Z.push({type:"tool_search"});return Z}function KQ(Q,$){let Z={type:"function",name:Q.name,description:Q.description,parameters:Q.parameters,strict:Q.strict};if($&&Q.deferred)Z.defer_loading=!0;return Z}class HQ{static models(){return[]}normalizeError(Q){return C(Q)}}var p6=["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 gQ extends HQ{model;capabilities;config;constructor(Q,$={}){super();this.model=Q,this.capabilities=hQ(Q),this.config=$}static model(Q,$){return new gQ(Q,$)}static models(){return p6}stream(Q){let $=uQ(Q,{model:this.model,capabilities:this.capabilities});return vQ(this.endpoint(),$,{signal:Q.signal,structuredOutput:Boolean(Q.output)})}upload(Q){return yQ(this.endpoint(),Q)}endpoint(){return fQ(ZQ(this.config))}}class cQ extends HQ{model;capabilities;config;constructor(Q,$={}){super();this.model=Q,this.capabilities=hQ(Q),this.config=$}static model(Q,$){return new cQ(Q,$)}static models(){return p6}stream(Q){let $=uQ(Q,{model:this.deployment(),capabilities:this.capabilities});return vQ(this.endpoint(),$,{signal:Q.signal,structuredOutput:Boolean(Q.output)})}upload(Q){return yQ(this.endpoint(),Q)}deployment(){return this.config.deployment??this.model}endpoint(){return fQ(GQ(this.config))}}class v extends Error{runId;requested;oldest;code="frame_cursor_evicted";constructor(Q,$,Z){super(`Frame ${$} of run ${Q} has been evicted; the oldest frame still buffered is ${Z}. Reload the thread instead of resuming.`);this.runId=Q;this.requested=$;this.oldest=Z}}class c extends Error{runId;code="live_run_not_found";constructor(Q){super(`No live run ${Q} in this process.`);this.runId=Q}}class BQ{ttlMs;maxFrames;runs=new Map;byThread=new Map;byClientRun=new Map;constructor(Q={}){this.ttlMs=Q.ttlMs??60000,this.maxFrames=Q.maxFrames??4096}register(Q,$={}){let Z={run:Q,threadId:$.threadId,clientRunId:$.clientRunId,frames:[],lastSeq:-1,lostBefore:0,ended:!1,evictAt:null,wake:new Set,version:0};if(this.runs.set(Q.runId,Z),$.threadId)this.byThread.set($.threadId,Q.runId);if($.clientRunId)this.byClientRun.set($.clientRunId,Q.runId);return this.pump(Z,$)}findByClientRunId(Q){let $=this.byClientRun.get(Q);return $&&this.runs.has($)?$:null}async find(Q){let $=this.byThread.get(Q.threadId);if(!$)return null;let Z=this.runs.get($);if(!Z)return null;return{runId:$,seq:Z.lastSeq}}get(Q){return this.runs.get(Q)?.run??null}replay(Q,$){let Z=this.runs.get(Q);if(!Z)throw new c(Q);if($!==void 0&&$<Z.lostBefore)throw new v(Q,$,Z.lostBefore);let G=Z.frames[0]?.seq;return this.drain(Z,Q,$??G??Z.lastSeq+1)}clear(){for(let Q of this.runs.values()){if(Q.evictAt)clearTimeout(Q.evictAt);Q.ended=!0,this.notify(Q)}this.runs.clear(),this.byThread.clear(),this.byClientRun.clear()}get size(){return this.runs.size}async pump(Q,$){let Z=Promise.resolve();try{for await(let G of Q.run.frames()){if(Q.frames.push(G),Q.lastSeq=G.seq,Q.frames.length>this.maxFrames){let W=Q.frames.shift();if(W)Q.lostBefore=W.seq+1}this.notify(Q);let J=$.onEvent;if(J)Z=Z.then(()=>J(G.event)).catch((W)=>l6($,W))}}catch(G){l6($,G)}finally{Q.ended=!0,this.notify(Q),this.scheduleEviction(Q),await Z}}async*drain(Q,$,Z){let G=Z;while(!0){let J=Q.version;for(;;){if(G<Q.lostBefore)throw new v($,G,Q.lostBefore);let W=Q.frames,Y=W[0]?.seq;if(Y===void 0)break;let V=Math.max(0,G-Y);if(V>=W.length)break;let X=W[V];yield X,G=X.seq+1}if(Q.ended&&G>Q.lastSeq)return;await this.wait(Q,J)}}wait(Q,$){if(Q.version!==$)return Promise.resolve();return new Promise((Z)=>Q.wake.add(Z))}notify(Q){Q.version++;let $=Array.from(Q.wake);Q.wake.clear();for(let Z of $)Z()}scheduleEviction(Q){if(Q.evictAt)return;let $=setTimeout(()=>{let Z=Q.run.runId;if(this.runs.delete(Z),Q.threadId&&this.byThread.get(Q.threadId)===Z)this.byThread.delete(Q.threadId);if(Q.clientRunId&&this.byClientRun.get(Q.clientRunId)===Z)this.byClientRun.delete(Q.clientRunId);this.notify(Q)},this.ttlMs);$.unref?.(),Q.evictAt=$}}var mQ=new BQ;function l6(Q,$){try{Q.onInternalError?.($)}catch{}}class DQ{ttlMs;clientOwnedIds;threads=new Map;lastSweep=0;constructor(Q={}){this.ttlMs=Q.ttlMs??86400000,this.clientOwnedIds=Q.clientOwnedIds??!1}async createThread(Q){let $=crypto.randomUUID();return this.threads.set($,{messages:[],touchedAt:Date.now()}),this.sweep(),{threadId:$}}async loadThread(Q){this.sweep();let $=this.threads.get(Q);if(!$)return this.clientOwnedIds?[]:null;return $.touchedAt=Date.now(),$.messages.slice()}async appendMessages(Q,$){this.sweep();let Z=this.threads.get(Q);if(!Z){if(!this.clientOwnedIds)throw Error(`Thread ${Q} does not exist here, or has expired.`);Z={messages:[],touchedAt:Date.now()},this.threads.set(Q,Z)}for(let G of $){let J=Z.messages.findIndex((W)=>W.id===G.id);if(J===-1)Z.messages.push(G);else Z.messages[J]=G}Z.touchedAt=Date.now()}delete(Q){this.threads.delete(Q)}get size(){return this.threads.size}sweep(Q=Date.now()){if(Q-this.lastSweep<60000)return;this.lastSweep=Q;for(let[$,Z]of this.threads)if(Q-Z.touchedAt>this.ttlMs)this.threads.delete($)}}var pQ=new DQ;function n6(Q={}){return{messages:Q.messages?[...Q.messages]:[],pending:Q.pending?[...Q.pending]:[],error:null,threadId:Q.threadId,seq:Q.seq??-1,cursorRunId:Q.cursorRunId,runMessageIds:[],loadedTools:[]}}function s6(Q,$,Z=new Date().toISOString()){if(!($.event.type==="run-start"&&$.event.runId!==Q.cursorRunId)&&$.seq<=Q.seq)return Q;return{...t6(Q,$.event,Z),seq:$.seq}}function t6(Q,$,Z){switch($.type){case"run-start":return{...Q,runId:$.runId,cursorRunId:$.runId,threadId:$.threadId??Q.threadId,runMessageIds:[],loadedTools:[],finishReason:void 0};case"message-start":return x(Q,$.messageId,Z,(G)=>({...G,role:$.role}));case"text-delta":if(d6(Q,$.messageId))return Q;return x(Q,$.messageId,Z,(G)=>({...G,content:O$(G.content,$.delta)}));case"reasoning-delta":if(d6(Q,$.messageId))return Q;return x(Q,$.messageId,Z,(G)=>({...G,content:N$(G.content,$.delta,$.id)}));case"output-delta":return x(Q,$.messageId,Z,(G)=>({...G,content:o6(G.content,{type:"output",value:$.snapshot,partial:!0},(J)=>J.type==="output")}));case"tool-call":return x(Q,$.messageId,Z,(G)=>{let J=G.content.findIndex((B)=>B.type==="tool-call"&&B.toolCallId===$.part.toolCallId),W=J===-1?void 0:G.content[J],Y=$.part.progress??W?.progress,V=$.part.nested??W?.nested,X=$.part.attachments??W?.attachments,K={...$.part,...Y?{progress:Y}:{},...V?{nested:V}:{},...X?{attachments:X}:{}},H=G.content.slice();if(J===-1)H.push(K);else H[J]=K;return{...G,content:H}});case"tool-search":{let G=$.loaded.filter((J)=>!Q.loadedTools.includes(J));if(G.length===0)return Q;return{...Q,loadedTools:[...Q.loadedTools,...G]}}case"tool-progress":return i6(Q,$.toolCallId,(G)=>({...G,progress:[...G.progress??[],$.data]}));case"nested-event":{let G=$;return i6(Q,$.toolCallId,(J)=>{let W=J.nested??[],Y=W.findIndex((H)=>H.runId===G.runId),V=W[Y]??{runId:G.runId,agent:G.agent,messages:[]},X=z$(V,G,Z),K=Y===-1?[...W,X]:W.map((H,B)=>B===Y?X:H);return{...J,nested:K}})}case"tool-result":{let G=x(Q,$.messageId,Z,(J)=>({...J,content:o6(J.content,$.part,(W)=>W.type==="tool-result"&&W.toolCallId===$.part.toolCallId)}));return{...G,pending:G.pending.filter((J)=>J.toolCallId!==$.part.toolCallId)}}case"message":{let G=Q.messages.findIndex((Y)=>Y.id===$.message.id),J=Q.messages.slice();if(G===-1)J.push($.message);else J[G]=$.message;let W=Q.runMessageIds.includes($.message.id)?Q.runMessageIds:[...Q.runMessageIds,$.message.id];return{...Q,messages:J,runMessageIds:W}}case"awaiting-input":return{...Q,runId:$.runId,pending:[...$.pending]};case"message-end":return x(Q,$.messageId,Z,(G)=>({...G,finishReason:$.finishReason,...$.outputTruncated?{outputTruncated:!0}:{},content:$.outputTruncated||$.finishReason==="length"?G.content.filter((J)=>!(J.type==="output"&&J.partial)):G.content.map((J)=>J.type==="output"&&J.partial?{...J,partial:!1}:J)}));case"usage":{let G=L$(Q.messages,(W)=>W.role==="assistant");if(G===-1)return Q;let J=Q.messages.slice();return J[G]={...J[G],usage:$.usage},{...Q,messages:J}}case"error":return{...Q,error:$.error,pending:[]};case"run-end":return{...Q,runId:void 0,finishReason:$.finishReason,messages:r6(Q,$.finishReason)};default:return Q}}function r6(Q,$){return Q.messages.map((Z)=>Z.role==="assistant"&&Q.runMessageIds.includes(Z.id)?D$(Z,$):Z)}function D$(Q,$){let Z=Q.content.map((J)=>J.type==="tool-call"&&J.nested?.some((W)=>W.finishReason===void 0)?{...J,nested:J.nested.map((W)=>W.finishReason===void 0?U$(W,$):W)}:J);if(Q.finishReason===void 0)return{...Q,finishReason:$,content:Z};return Z.some((J,W)=>J!==Q.content[W])?{...Q,content:Z}:Q}function U$(Q,$){let Z={messages:Q.messages,pending:[],error:null,seq:-1,runMessageIds:Q.messages.map((G)=>G.id),loadedTools:[]};return{...Q,finishReason:$,messages:r6(Z,$)}}function i6(Q,$,Z){for(let G=Q.messages.length-1;G>=0;G--){let J=Q.messages[G],W=J.content.findIndex((K)=>K.type==="tool-call"&&K.toolCallId===$);if(W===-1)continue;if(J.finishReason!==void 0&&!F$(Q,J,$))return Q;let Y=J.content.slice();Y[W]=Z(Y[W]);let V=Q.messages.slice();V[G]={...J,content:Y};let X=Q.runMessageIds.includes(J.id)?Q.runMessageIds:[...Q.runMessageIds,J.id];return{...Q,runMessageIds:X,messages:V}}return Q}function z$(Q,$,Z){let G={messages:Q.messages,pending:[],error:null,seq:-1,runMessageIds:Q.messages.map((W)=>W.id),loadedTools:[],finishReason:Q.finishReason},J=t6(G,$.event,Z);return{...Q,...$.label!==void 0?{label:$.label}:{},messages:J.messages,...J.finishReason!==void 0?{finishReason:J.finishReason}:{},...$.event.type==="usage"?{usage:$.event.usage}:{}}}function F$(Q,$,Z){if($.finishReason!=="awaiting-input")return!1;return!Q.messages.some((G)=>G.content.some((J)=>J.type==="tool-result"&&J.toolCallId===Z))}function d6(Q,$){let Z=Q.messages.find((G)=>G.id===$);return Z!==void 0&&Z.finishReason!==void 0}function L$(Q,$){for(let Z=Q.length-1;Z>=0;Z--)if($(Q[Z]))return Z;return-1}function x(Q,$,Z,G){let J=Q.messages.findIndex((V)=>V.id===$),W=Q.runMessageIds.includes($)?Q.runMessageIds:[...Q.runMessageIds,$];if(J===-1){let V={id:$,role:"assistant",content:[],createdAt:Z};return{...Q,runMessageIds:W,messages:[...Q.messages,G(V)]}}let Y=Q.messages.slice();return Y[J]=G(Y[J]),{...Q,runMessageIds:W,messages:Y}}function O$(Q,$){let Z=Q[Q.length-1];if(Z&&Z.type==="text")return[...Q.slice(0,-1),{type:"text",text:Z.text+$}];return[...Q,{type:"text",text:$}]}function N$(Q,$,Z){let G=Q[Q.length-1];if(G&&G.type==="reasoning"&&G.id===Z)return[...Q.slice(0,-1),{...G,text:(G.text??"")+$}];return[...Q,Z?{type:"reasoning",id:Z,text:$}:{type:"reasoning",text:$}]}function o6(Q,$,Z){let G=Q.findIndex(Z);if(G===-1)return[...Q,$];let J=Q.slice();return J[G]=$,J}class iQ{store;threadId;report;chain=Promise.resolve();done=new Set;closed=!1;state;runId;constructor(Q,$,Z,G){this.store=Q;this.threadId=$;this.report=G;this.state=n6({messages:Z})}finish(Q){if(this.closed)return;this.done.add(Q.id),this.write(()=>[lQ(Q)])}frame(Q){if(this.closed)return;let $=Q.event;if($.type==="run-start")this.runId=$.runId;switch(this.state=s6(this.state,Q),$.type){case"message":this.write(()=>[lQ($.message)]);return;case"tool-call":if($.part.partial)return;this.checkpoint($.messageId);return;case"message-start":case"tool-result":this.checkpoint($.messageId);return;default:return}}close(Q=[]){this.closed=!0;for(let $ of Q)this.done.add($.id)}settled(){return this.chain}checkpoint(Q){if(this.done.has(Q))return;let $=this.state.messages.find((G)=>G.id===Q);if(!$)return;let Z=this.runId;this.write(()=>{let G=lQ($);if(G.finishReason===void 0&&Z)G.runId=Z;return[G]})}write(Q){let $;try{$=Q()}catch(Z){this.report(Z);return}this.chain=this.chain.then(()=>this.store.appendMessages(this.threadId,$)).catch((Z)=>this.report(Z))}}function lQ(Q){return structuredClone(Q)}async function a6(Q,$){let Z=[],G=null,J=Q.slice();for(let W=0;W<J.length;W++){let Y=J[W];if(Y.role!=="assistant"||Y.finishReason!==void 0)continue;if(Y.runId&&await $(Y.runId))continue;G??=new Set(Q.flatMap((K)=>K.content.flatMap((H)=>H.type==="tool-result"?[H.toolCallId]:[])));let V=Y.content.map((K)=>K.type==="tool-call"?e6(K):K);for(let K of Y.content){if(K.type!=="tool-call"||G.has(K.toolCallId))continue;let H={type:"tool-result",toolCallId:K.toolCallId,name:K.name,status:"denied",cause:"interrupted"};V.push(H)}let X={...Y,content:V,finishReason:"interrupted"};J[W]=X,Z.push(X)}return{messages:J,settled:Z}}function e6(Q){let{partial:$,...Z}=Q;if(!Z.nested?.some((G)=>G.finishReason===void 0))return Z;return{...Z,nested:Z.nested.map(C$)}}function C$(Q){if(Q.finishReason!==void 0)return Q;return{...Q,finishReason:"interrupted",messages:Q.messages.map(($)=>$.role==="assistant"&&$.finishReason===void 0?{...$,finishReason:"interrupted",content:$.content.map((Z)=>Z.type==="tool-call"?e6(Z):Z)}:$)}}var _$=G9,UQ=new Map,Q9=new WeakMap,zQ=new Map;class Y9 extends _${static kind="agent-controller";store=pQ;liveRuns=mQ;attachments=n;attachmentStorage=W9;hookHoldMs=30000;instructions(Q,$){}context(Q,$){return{}}requireThread=!1;authorizeRequest(Q,$){}async stream(Q=new m){let $=await dQ(Q);if($.error)return FQ($);let Z=$.body,G=typeof Z.threadId==="string"?Z.threadId:void 0,J=q$(Z);if(J.error)return FQ({body:{},error:J.error});let W=J.turn,Y=typeof Z.clientRunId==="string"?Z.clientRunId:void 0,V=X9(Z);if(this.requireThread&&!G)return j(400,{code:"thread_required",message:"This agent takes a turn only on a thread: send a threadId."});let X=Y?{cancelled:!1}:null;if(X)zQ.set(Y,X);let K=async()=>{let H;if(G){let O=await this.store.loadThread(G);if(!O)return j(404,{code:"thread_not_found",message:`Thread ${G} does not exist here, or has expired.`});H=await this.settleThread(G,O,{write:!0})}else H=Array.isArray(Z.messages)?Z.messages:[];let B=await this.instructions(Q,{body:V})||void 0,D=await this.context(Q,{body:V}),L=await this.attachmentsFor(Q,G,{body:V});if(X?.cancelled)return $9();let U=G?new iQ(this.store,G,H,(O)=>this.reportHookFailure(O)):null,z=this.agent.stream({messages:H,turn:W,threadId:G,...U?{onMessage:(O)=>U.finish(O)}:{},instructions:B,context:D,attachments:L,body:V}),F={req:Q,runId:z.runId,threadId:G},_=this.liveRuns.register(z,{threadId:G,clientRunId:Y,onEvent:(O)=>this.dispatchEvent(O,F),onInternalError:(O)=>this.reportHookFailure(O)});if(U)this.follow(z,U);let{stored:M,hooks:q}=this.persistRun(z,F,_,U);return Q9.set(z,M),Q.ctx?.()?.waitUntil(q),z.toResponse()};try{if(await this.authorizeRequest(Q,{route:"stream",threadId:G,body:V}),X?.cancelled)return $9();return G?await this.withThread(G,K):await K()}finally{if(X&&zQ.get(Y)===X)zQ.delete(Y)}}async withThread(Q,$){let Z=UQ.get(Q)??Promise.resolve(),G,J=new Promise((Y)=>{G=Y}),W=Z.then(()=>J);UQ.set(Q,W),await Z;try{let Y=await this.liveRuns.find({threadId:Q}),V=Y?this.liveRuns.get(Y.runId):null;if(V)V.stop({reason:"superseded by a later turn on this thread"}),await Q9.get(V);return await $()}finally{if(G(),UQ.get(Q)===W)UQ.delete(Q)}}async attach(Q=new m){let $=await dQ(Q);if($.error)return FQ($);let Z=$.body,G=typeof Z.threadId==="string"?Z.threadId:T$(Q,"threadId");if(!G)return j(400,{code:"invalid_request",message:"attach needs a threadId: it is the handle that survives a refresh."});await this.authorizeRequest(Q,{route:"attach",threadId:G});let J=await this.liveRuns.find({threadId:G});if(!J)return j(404,{code:"no_live_run",message:`No run in progress for thread ${G} in this process.`});let W=typeof Z.runId==="string"?Z.runId:void 0,Y=W&&W!==J.runId?void 0:R$(Q,Z);try{return B6(this.liveRuns.replay(J.runId,Y))}catch(V){if(V instanceof v)return j(410,{code:V.code,message:V.message,oldestSeq:V.oldest});if(V instanceof c)return j(404,{code:V.code,message:V.message});throw V}}async stop(Q=new m){let $=await dQ(Q);if($.error)return FQ($);let Z=$.body;await this.authorizeRequest(Q,{route:"stop",threadId:typeof Z.threadId==="string"?Z.threadId:void 0});let G=typeof Z.runId==="string"?Z.runId:void 0;if(!G&&typeof Z.clientRunId==="string"){if(G=this.liveRuns.findByClientRunId(Z.clientRunId)??void 0,!G){let W=zQ.get(Z.clientRunId);if(W)return W.cancelled=!0,{stopped:!0}}}if(!G&&typeof Z.threadId==="string")G=(await this.liveRuns.find({threadId:Z.threadId}))?.runId;let J=G?this.liveRuns.get(G):null;if(!J)return{stopped:!1};return J.stop({reason:typeof Z.reason==="string"?Z.reason:void 0}),{stopped:!0}}attachmentScope(Q,$,Z){let G=Q.ctx()?.user,J=G?.id??G?.publicId;if(J!==void 0&&J!==null&&String(J)!=="")return{key:`user:${String(J)}`};if($)return{key:`thread:${$}`};return null}attachmentDestination(Q,$){return"both"}async attachmentsFor(Q,$,Z={body:{}}){let G=await this.attachmentScope(Q,$,Z);if(!G)return null;return new h(this.attachments,this.attachmentStorage,G)}async upload(Q=new m){let $=await Q.rawRequest.formData(),Z=$.get("file");if(!(Z instanceof Blob))throw Error("upload expects a multipart body with a `file` field.");let G=Z instanceof File&&Z.name?Z.name:"upload",J=Z.type||"application/octet-stream",W=j$($.get("body")),Y=$.get("threadId");await this.authorizeRequest(Q,{route:"upload",threadId:typeof Y==="string"&&Y.length>0?Y:void 0,body:W});let V=typeof Y==="string"&&Y.length>0&&await this.store.loadThread(Y)!==null?Y:void 0,X=await this.attachmentDestination(Z,Q),K=k$(X,$.get("destination")),H=await this.attachmentScope(Q,V,{body:W}),B=K!=="provider"&&!H;if(B){if(K==="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()`.');E$()}if(K==="provider"||!H){let _={fileId:await this.agent.provider.upload(Z),name:G,mimeType:J,size:Z.size,destination:"provider"};if(B)_.downgraded="no_scope";return _}let D=CQ(),L=await this.attachmentStorage.put({name:_Q(D,G),body:Z,contentType:J}),U=K==="both"?await this.agent.provider.upload(Z):void 0,z={id:D,scopeKey:H.key,fileId:U,objectName:L,name:G,mimeType:J,size:Z.size,createdAt:new Date().toISOString(),destination:K};return await this.attachments.put(H,z),{fileId:U,attachmentId:D,name:G,mimeType:J,size:Z.size,destination:K}}onMessage(Q,$){}onToolCall(Q,$){}onAwaitingInput(Q,$){}onError(Q,$){}onStreamComplete(Q,$){}reportHookFailure(Q){console.error("[gemi/ai] agent controller hook failed",Q)}async dispatchEvent(Q,$){switch(Q.type){case"tool-call":if(!Q.part.partial&&!Q.resent)await this.onToolCall({toolCallId:Q.part.toolCallId,name:String(Q.part.name),input:Q.part.input},$);return;case"awaiting-input":await this.onAwaitingInput(Q.pending,$);return;case"error":await this.onError(Q.error,$);return;default:return}}async readThread(Q){let $=await this.store.loadThread(Q);return $?await this.settleThread(Q,$,{write:!1}):null}isRunLive(Q,$){return this.liveRuns.get(Q)!==null}async settleThread(Q,$,{write:Z}){let{messages:G,settled:J}=await a6($,(W)=>this.isRunLive(W,Q));if(Z&&J.length>0)try{await this.store.appendMessages(Q,J)}catch(W){this.reportHookFailure(W)}return G}follow(Q,$){(async()=>{try{for await(let Z of Q.frames())$.frame(Z)}catch(Z){this.reportHookFailure(Z)}})()}persistRun(Q,$,Z,G=null){let J=Promise.resolve(),W=(async()=>{let V;try{V=await Q.result()}catch(K){G?.close(),await G?.settled(),J=this.safely(()=>this.onError({code:"unknown",message:K instanceof Error?K.message:String(K),retryable:!1},$));return}let X=V.messages;if(G?.close(X),await G?.settled(),$.threadId&&X.length>0)try{await this.store.appendMessages($.threadId,X)}catch(K){this.reportHookFailure(K)}J=this.notifyRun(V,X,$)})(),Y=W.then(()=>x$(Promise.all([J,Z]).then(()=>{}),this.hookHoldMs));return{stored:W,hooks:Y}}async notifyRun(Q,$,Z){for(let G of $)await this.safely(()=>this.onMessage(G,Z));await this.safely(()=>this.onStreamComplete(Q,Z))}async safely(Q){try{await Q()}catch($){this.reportHookFailure($)}}}var oQ=["turn","clientRunId","threadId","messages"],P$=["text","files","toolResults"];function X9(Q,$=V9(Q)?oQ:[...oQ,...P$]){let Z={};for(let[G,J]of Object.entries(Q)){if($.includes(G))continue;Object.defineProperty(Z,G,{value:J,writable:!0,enumerable:!0,configurable:!0})}return Z}function j$(Q){if(Q===null)return{};let $;if(typeof Q==="string")try{$=JSON.parse(Q)}catch{throw new nQ("The upload's `body` field is not valid JSON.")}if($===null||typeof $!=="object"||Array.isArray($))throw new nQ("The upload's `body` field must be a JSON object.");return X9($,oQ)}class nQ extends J9{constructor(Q){super(Q);this.name="InvalidUploadError",this.payload={api:{status:400,data:{error:{code:"invalid_request",message:Q}}},view:{}}}}async function dQ(Q){let $=Q?.rawRequest;if(!$||$.method==="GET"||$.method==="HEAD"||!$.body)return{body:{}};if(!M$($.headers.get("Content-Type")))return{body:{},status:415,code:"unsupported_media_type",error:"The request body must be sent as application/json."};let Z;try{Z=await $.text()}catch{return{body:{},error:"The request body could not be read."}}if(!Z.trim())return{body:{}};let G;try{G=JSON.parse(Z)}catch{return{body:{},error:"The request body is not valid JSON."}}if(G===null||typeof G!=="object"||Array.isArray(G))return{body:{},error:"The request body must be a JSON object."};return{body:G}}function M$(Q){if(typeof Q!=="string")return!1;let[$]=Q.split(";",1);return $.trim().toLowerCase()==="application/json"}function FQ(Q){return j(Q.status??400,{code:Q.code??"invalid_request",message:Q.error})}function V9(Q){return Boolean(Q.turn)&&typeof Q.turn==="object"}function q$(Q){let $=V9(Q)?Q.turn:Q,Z={};if(typeof $.text==="string")Z.text=$.text;if(Array.isArray($.files)){let G=S$($.files);if(typeof G==="string")return{error:G};Z.files=G}if(Array.isArray($.toolResults))Z.toolResults=$.toolResults;return Object.keys(Z).length>0?{turn:Z}:{}}function S$(Q){let $=[];for(let[Z,G]of Q.entries()){let J=`turn.files[${Z}]`;if(!G||typeof G!=="object"||Array.isArray(G))return`${J} must be an object.`;let W={};for(let H of["fileId","attachmentId","name","mimeType"]){let B=G[H];if(B===void 0||B===null||B==="")continue;if(typeof B!=="string")return`${J}.${H} must be a string.`;W[H]=B}let{fileId:Y,attachmentId:V,name:X,mimeType:K}=W;if(Y?.startsWith(P))return`${J}.fileId holds a gemi attachment id (${Y}). \`fileId\` is the provider's id from the upload response; put this one in \`attachmentId\`.`;if(V!==void 0&&!V.startsWith(P))return`${J}.attachmentId is not a gemi attachment id: it must start with "${P}".`;if(!Y&&!V)return`${J} has neither a \`fileId\` nor an \`attachmentId\`. Send the ids the upload response answered.`;$.push({...Y?{fileId:Y}:{},...V?{attachmentId:V}:{},...X!==void 0?{name:X}:{},...K!==void 0?{mimeType:K}:{}})}return $}function R$(Q,$){if(typeof $.from==="number"&&Number.isFinite($.from))return Math.max(0,Math.floor($.from));if(typeof $.cursor==="number"&&Number.isFinite($.cursor)){let G=Math.floor($.cursor);if(G>=0)return G+1;return}let Z=Q?.rawRequest?.headers?.get("Last-Event-ID");if(Z){let G=Number.parseInt(Z,10);if(Number.isFinite(G))return Math.max(0,G+1)}return}function T$(Q,$){let Z=Q?.search?.get($);return typeof Z==="string"?Z:void 0}function $9(){return j(409,{code:"stopped",message:"The turn was stopped before it started."})}function j(Q,$){return new Response(JSON.stringify({error:$}),{status:Q,headers:{"Content-Type":"application/json"}})}function k$(Q,$){if(typeof $!=="string"||$.length===0)return Q;if($!=="both"&&$!=="provider"&&$!=="storage")throw Error(`Unknown attachment destination "${$}". Expected "both", "provider" or "storage".`);if($===Q||Q==="both"&&$==="storage")return $;if(Q==="both"&&$==="provider")throw Error('This upload asked for the "provider" destination under a "both" policy. A client may ask for "storage", which keeps a file away from the model provider, but it may not ask the server to stop keeping its own copy while the vendor still gets the file \u2014 that is the app\'s retention decision. Change `attachmentDestination()` if this file should not be kept.');throw Error(`This upload asked for the "${$}" destination, but the server's policy for it is "${Q}", and a client hint may only ask for "storage" under a "both" policy. Change \`attachmentDestination()\` if the file really should go there.`)}var Z9=!1;function E$(){if(Z9)return;Z9=!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 A$=2147483647;function x$(Q,$){let Z=Q.then(()=>{},()=>{});if(!($<=A$))return Z;let G,J=new Promise((W)=>{G=setTimeout(W,$)});return Promise.race([Z,J]).finally(()=>clearTimeout(G))}export{A9 as toAgentTools,QQ as supportsStrict,b$ as s,mQ as liveRuns,n as defaultAttachmentStore,pQ as defaultAgentStore,$Q as ToolNamespace,RQ as Skill,h as ScopedAttachments,u as SKILLS_NAMESPACE,T as PendingEscalation,gQ as OpenAIProvider,xQ as OpenAIImageProvider,BQ as MemoryLiveRuns,o as MemoryAttachmentStore,DQ as MemoryAgentStore,c as LiveRunNotFoundError,w as InvalidAttachmentScopeError,YQ as ImageRequestError,XQ as ImageProvider,kQ as ImageModel,v as FrameCursorEvictedError,cQ as AzureOpenAIProvider,bQ as AzureOpenAIImageProvider,y as AttachmentNotFoundError,E as AgentTool,HQ as AgentProvider,Y9 as AgentController,TQ as Agent};
|
|
18
|
+
`)}}if($.length>0){let X=Y($);if(X)yield X}let V=W();if(V)yield V}async function*g6(Q,$={}){let Z=new Map,G=new Set,J=!1;for await(let W of Q$(Q)){if(W.data==="[DONE]")break;let Y;try{Y=JSON.parse(W.data)}catch{continue}switch(typeof Y.type==="string"?Y.type:W.event){case"response.output_text.delta":{let X=String(Y.delta??"");if(!X)break;yield $.structuredOutput?{type:"output-delta",delta:X}:{type:"text-delta",delta:X};break}case"response.reasoning_summary_text.delta":case"response.reasoning_text.delta":{let X=String(Y.delta??"");if(!X)break;yield{type:"reasoning-delta",delta:X,id:Y.item_id};break}case"response.output_item.added":{let X=Y.item;if(!X)break;if(X.type==="function_call"){let K=String(X.id??Y.item_id??X.call_id??"");Z.set(K,{callId:String(X.call_id??K),name:String(X.name??""),namespace:typeof X.namespace==="string"&&X.namespace?X.namespace:void 0,done:!1})}break}case"response.function_call_arguments.delta":{let X=Z.get(String(Y.item_id??""));if(!X)break;let K=String(Y.delta??"");if(!K)break;yield{type:"tool-call-delta",toolCallId:X.callId,name:X.name,argsDelta:K,...X.namespace?{namespace:X.namespace}:{}};break}case"response.function_call_arguments.done":{let X=String(Y.item_id??""),K=Z.get(X);if(!K)break;K.done=!0,yield{type:"tool-call",toolCallId:K.callId,name:K.name,args:String(Y.arguments??""),...K.namespace?{namespace:K.namespace}:{}};break}case"response.output_item.done":{let X=Y.item;if(!X)break;if(X.type==="function_call"){let K=String(X.id??Y.item_id??X.call_id??""),H=Z.get(K);if(H?.done)break;let B=(typeof X.namespace==="string"?X.namespace:"")||H?.namespace;if(yield{type:"tool-call",toolCallId:String(X.call_id??K),name:String(X.name??H?.name??""),args:String(X.arguments??""),...B?{namespace:B}:{}},H)H.done=!0;break}if(X.type==="tool_search_call"||X.type==="tool_search_output"){let K=$$(X);if(K.loaded.length===0&&K.namespaces.length===0)break;let H=String(X.tool_search_call_id??X.id??"");if(G.has(H))break;G.add(H),yield{type:"tool-search",...K}}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":{J=!0,yield{type:"finish",reason:"stop",usage:fQ(Y.response?.usage)};break}case"response.incomplete":{J=!0;let X=fQ(Y.response?.usage),K=Y.response?.incomplete_details?.reason;if(K==="content_filter"){yield{type:"error",error:{code:"content_filtered",message:Z$(Y.response?.content_filters),retryable:!1}},yield{type:"finish",reason:"error",usage:X};break}yield{type:"finish",reason:K==="max_output_tokens"?"length":"stop",usage:X};break}case"response.failed":case"error":{J=!0;let X=Y.response?.error??Y.error??Y;yield{type:"error",error:G$(X)},yield{type:"finish",reason:"error",usage:fQ(Y.response?.usage)};break}}if(J)return}if(!J)yield{type:"error",error:{code:"provider_error",message:"The provider stream ended without a terminal event.",retryable:!0}},yield{type:"finish",reason:"error",usage:f()}}function $$(Q){let $=[],Z=[];return c6(Q.results??Q.tools??Q.loaded??Q.output,$,Z,0),{loaded:vQ($),namespaces:vQ(Z)}}function c6(Q,$,Z,G){if(!Array.isArray(Q)||G>4)return;for(let J of Q){if(typeof J==="string"){$.push(J);continue}if(!J||typeof J!=="object")continue;let W=J,Y=typeof W.name==="string"?W.name:typeof W.tool_name==="string"?W.tool_name:"",V=W.tools??W.functions;if(Array.isArray(V)){if(Y)Z.push(Y);c6(V,$,Z,G+1);continue}if(Y)$.push(Y)}}function vQ(Q){return Q.filter(($,Z)=>Q.indexOf($)===Z)}function Z$(Q){if(!Array.isArray(Q))return"The provider's content filter blocked this request.";let Z=[];for(let G of Q){if(!G||typeof G!=="object")continue;let J=G,W=J.content_filter_results;if(!W||typeof W!=="object")continue;for(let[Y,V]of Object.entries(W))if(V&&typeof V==="object"&&V.filtered===!0)Z.push(`${Y} (${String(J.source_type??"unknown")})`)}return Z.length===0?"The provider's content filter blocked this request.":`The provider's content filter blocked this request. Categories: ${vQ(Z).join(", ")}.`}function G$(Q){let $=typeof Q?.message==="string"?Q.message:"The provider stream failed.",Z=String(Q?.code??"").toLowerCase();if(Z==="rate_limit_exceeded")return{code:"rate_limited",message:$,retryable:!0};if(Z==="context_length_exceeded")return{code:"context_length_exceeded",message:$,retryable:!1};if(Z.includes("content_filter"))return{code:"content_filtered",message:$,retryable:!1};return{code:"provider_error",message:$,retryable:!0}}function f(){return{inputTokens:0,outputTokens:0,totalTokens:0}}function fQ(Q){if(!Q)return f();let $=Number(Q.input_tokens??0),Z=Number(Q.output_tokens??0),G={inputTokens:$,outputTokens:Z,totalTokens:Number(Q.total_tokens??$+Z)},J=Q.output_tokens_details?.reasoning_tokens;if(typeof J==="number")G.reasoningTokens=J;let W=Q.input_tokens_details?.cached_tokens;if(typeof W==="number")G.cachedInputTokens=W;return G}async function*m6(Q){if(!Q)return;let $=Q.getReader(),Z=new TextDecoder;try{while(!0){let{done:J,value:W}=await $.read();if(J)break;if(W)yield Z.decode(W,{stream:!0})}let G=Z.decode();if(G)yield G}finally{$.releaseLock()}}function yQ(Q){return{responsesUrl:`${Q.base}/responses${Q.query}`,filesUrl:`${Q.base}/files${Q.query}`,headers:Q.headers,timeoutMs:Q.timeoutMs,maxRetries:Q.maxRetries}}async function*hQ(Q,$,Z){let G;try{G=await c(Q.responsesUrl,{method:"POST",headers:{...await Q.headers(),"content-type":"application/json"},body:JSON.stringify($)},{maxRetries:Q.maxRetries,timeoutMs:Q.timeoutMs,signal:Z.signal,fetchImpl:Q.fetchImpl})}catch(J){let W=_(J);if(W.code!=="aborted")yield{type:"error",error:W,...u(J)};yield{type:"finish",reason:W.code==="aborted"?"aborted":"error",usage:f()};return}try{yield*g6(m6(G.body),{structuredOutput:Z.structuredOutput})}catch(J){let W=_(J);if(W.code==="aborted"){yield{type:"finish",reason:"aborted",usage:f()};return}yield{type:"error",error:W},yield{type:"finish",reason:"error",usage:f()}}}async function uQ(Q,$){let Z=new FormData;Z.set("purpose","user_data"),Z.set("file",$);let J=await(await c(Q.filesUrl,{method:"POST",headers:await Q.headers(),body:Z},{maxRetries:Q.maxRetries,timeoutMs:Q.timeoutMs,fetchImpl:Q.fetchImpl})).json();if(!J?.id)throw Error("The provider accepted the upload but returned no file id.");return J.id}function gQ(Q){let $=J$(Q);if($.startsWith("gpt-3.5")||$.startsWith("text-")||$.startsWith("davinci"))return{reasoning:!1,structuredOutput:!1,fileInput:!1,parallelToolCalls:!0,toolSearch:!1};let Z=W$($);if(Z?.kind==="o")return{reasoning:!0,structuredOutput:!0,fileInput:!0,parallelToolCalls:Z.major>1,toolSearch:p6(Z)};if(Z?.kind==="gpt")return{reasoning:Z.major>=5,structuredOutput:Z.major>4||$.startsWith("gpt-4o")||$.startsWith("gpt-4.1"),fileInput:Z.major>4||$.startsWith("gpt-4o")||$.startsWith("gpt-4.1"),parallelToolCalls:!0,toolSearch:p6(Z)};return{reasoning:!0,structuredOutput:!0,fileInput:!0,parallelToolCalls:!0,toolSearch:!0}}function p6(Q){if(Q.kind==="o")return Q.major>=5;return Q.major>5||Q.major===5&&Q.minor>=2}function J$(Q){return Q.trim().toLowerCase()}function W$(Q){let $=/^gpt-(\d+)(?:\.(\d+))?/.exec(Q);if($?.[1])return{kind:"gpt",major:Number($[1]),minor:Number($[2]??0)};let Z=/^o(\d+)(?:[-.]|$)/.exec(Q);if(Z?.[1])return{kind:"o",major:Number(Z[1]),minor:0};return null}function cQ(Q,$){let{capabilities:Z}=$,G={model:$.model,input:Y$(Q.messages,Z),stream:!0};if(Q.systemPrompt)G.instructions=Q.systemPrompt;let J=F$(Q.tools,Z);if(J.length>0){if(G.tools=J,!Z.parallelToolCalls)G.parallel_tool_calls=!1}if(Q.output)G.text={format:{type:"json_schema",name:Q.output.name,schema:Q.output.schema,strict:Q.output.strict}};if(Q.reasoning&&Z.reasoning)G.reasoning={effort:Q.reasoning,summary:"auto"};if(typeof Q.temperature==="number")G.temperature=Q.temperature;if(typeof Q.maxOutputTokens==="number")G.max_output_tokens=Q.maxOutputTokens;return G}function Y$(Q,$){let Z=[];for(let G of Q){let J=G.role,W=[],Y=()=>{if(W.length===0)return;Z.push({type:"message",role:J,content:W}),W=[]};for(let V of G.content??[])switch(V.type){case"text":{if(!V.text)break;W.push(KQ(J,V.text));break}case"output":{if(V.partial)break;W.push(KQ(J,JSON.stringify(V.value)));break}case"file":{if(J==="assistant")break;let X=K$(V);if(!$.fileInput){if(X)W.push(KQ(J,l6(V,!1)));break}if(V.fileId?.startsWith(P))throw Error(`FilePart.fileId holds a gemi attachment id (${V.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(!V.fileId&&!X)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)W.push(KQ(J,l6(V,!!V.fileId)));if(V.fileId)W.push(H$(V));break}case"reasoning":{Y();let X=U$(V);if(X)Z.push(X);break}case"tool-call":{if(V.partial)break;Y(),Z.push({type:"function_call",call_id:V.toolCallId,name:String(V.name),arguments:JSON.stringify(V.input??{})});break}case"tool-result":{Y(),Z.push({type:"function_call_output",call_id:V.toolCallId,output:z$(V)});break}}Y()}return V$(Z)}var X$="No result was recorded for this tool call. Assume it did not complete.";function V$(Q){let $=new Set,Z=new Set,G=[];for(let W of Q){if(W.type==="function_call"){let Y=String(W.call_id);if($.has(Y))continue;$.add(Y)}else if(W.type==="function_call_output"){let Y=String(W.call_id);if(!$.has(Y)||Z.has(Y))continue;Z.add(Y)}G.push(W)}if(Z.size===$.size)return G;let J=[];for(let W of G){if(J.push(W),W.type!=="function_call")continue;let Y=String(W.call_id);if(Z.has(Y))continue;Z.add(Y),J.push({type:"function_call_output",call_id:Y,output:X$})}return J}function KQ(Q,$){return{type:Q==="assistant"?"output_text":"input_text",text:$}}function K$(Q){let $=Q.attachmentId;return typeof $==="string"&&$.startsWith(P)?$:void 0}function l6(Q,$){let Z=[`id=${JSON.stringify(Q.attachmentId)}`];if(Q.name)Z.push(`name=${JSON.stringify(Q.name)}`);if(Q.mimeType)Z.push(`mimeType=${JSON.stringify(Q.mimeType)}`);let G=`attachment ${Z.join(" ")}`;return $?`[${G}]`:`[${G} \u2014 its contents are not shown to you; a tool can read the file by this id]`}function H$(Q){let $=Q.mimeType?.trim().toLowerCase()??"";return{type:($?$.startsWith("image/")&&$!=="image/svg+xml":B$(Q.name))?"input_image":"input_file",file_id:Q.fileId}}function B$(Q){let $=/\.([a-z0-9]+)$/.exec(Q?.trim().toLowerCase()??"");return $?.[1]!==void 0&&D$.has($[1])}var D$=new Set(["jpeg","jpg","png","gif","webp"]);function U$(Q){if(!Q.id)return null;let $={type:"reasoning",id:Q.id};return $.summary=Q.text?[{type:"summary_text",text:Q.text}]:[],$}function z$(Q){if(Q.status==="ok")return typeof Q.output==="string"?Q.output:JSON.stringify(Q.output??null);if(Q.status==="denied"){let $=Q.reason?` Reason given: ${Q.reason}`:"";if(Q.cause==="stopped")return`The run was stopped before this tool call could complete, so it did not run.${$}`;if(Q.cause==="interrupted")return`The run was interrupted (the server stopped) while this tool call was in progress, so its result was lost. It may have run in part or in full: check its effects before repeating it.${$}`;return`The user declined this tool call, so it did not run.${$}`}return`The tool call failed and produced no result. Error (${Q.error?.code??"unknown"}): ${Q.error?.message??"no message"}`}function d6(Q){return Array.isArray(Q.tools)}function F$(Q,$){if(!Q||Q.length===0)return[];if(!$.toolSearch){let J=[];for(let W of Q)if(d6(W))for(let Y of W.tools)J.push(HQ(Y,!1));else J.push(HQ(W,!1));return J}let Z=[],G=!1;for(let J of Q)if(d6(J)){let W=J.tools.map((Y)=>{if(Y.deferred)G=!0;return HQ(Y,!0)});Z.push({type:"namespace",name:J.name,description:J.description,tools:W})}else{if(J.deferred)G=!0;Z.push(HQ(J,!0))}if(G)Z.push({type:"tool_search"});return Z}function HQ(Q,$){let Z={type:"function",name:Q.name,description:Q.description,parameters:Q.parameters,strict:Q.strict};if($&&Q.deferred)Z.defer_loading=!0;return Z}class BQ{static models(){return[]}normalizeError(Q){return _(Q)}}var i6=["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 mQ extends BQ{model;capabilities;config;constructor(Q,$={}){super();this.model=Q,this.capabilities=gQ(Q),this.config=$}static model(Q,$){return new mQ(Q,$)}static models(){return i6}stream(Q){let $=cQ(Q,{model:this.model,capabilities:this.capabilities});return hQ(this.endpoint(),$,{signal:Q.signal,structuredOutput:Boolean(Q.output)})}upload(Q){return uQ(this.endpoint(),Q)}endpoint(){return yQ(WQ(this.config))}}class pQ extends BQ{model;capabilities;config;constructor(Q,$={}){super();this.model=Q,this.capabilities=gQ(Q),this.config=$}static model(Q,$){return new pQ(Q,$)}static models(){return i6}stream(Q){let $=cQ(Q,{model:this.deployment(),capabilities:this.capabilities});return hQ(this.endpoint(),$,{signal:Q.signal,structuredOutput:Boolean(Q.output)})}upload(Q){return uQ(this.endpoint(),Q)}deployment(){return this.config.deployment??this.model}endpoint(){return yQ(YQ(this.config))}}class v extends Error{runId;requested;oldest;code="frame_cursor_evicted";constructor(Q,$,Z){super(`Frame ${$} of run ${Q} has been evicted; the oldest frame still buffered is ${Z}. Reload the thread instead of resuming.`);this.runId=Q;this.requested=$;this.oldest=Z}}class m extends Error{runId;code="live_run_not_found";constructor(Q){super(`No live run ${Q} in this process.`);this.runId=Q}}class DQ{ttlMs;maxFrames;runs=new Map;byThread=new Map;byClientRun=new Map;constructor(Q={}){this.ttlMs=Q.ttlMs??60000,this.maxFrames=Q.maxFrames??4096}register(Q,$={}){let Z={run:Q,threadId:$.threadId,clientRunId:$.clientRunId,frames:[],lastSeq:-1,lostBefore:0,ended:!1,evictAt:null,wake:new Set,version:0};if(this.runs.set(Q.runId,Z),$.threadId)this.byThread.set($.threadId,Q.runId);if($.clientRunId)this.byClientRun.set($.clientRunId,Q.runId);return this.pump(Z,$)}findByClientRunId(Q){let $=this.byClientRun.get(Q);return $&&this.runs.has($)?$:null}async find(Q){let $=this.byThread.get(Q.threadId);if(!$)return null;let Z=this.runs.get($);if(!Z)return null;return{runId:$,seq:Z.lastSeq}}get(Q){return this.runs.get(Q)?.run??null}replay(Q,$){let Z=this.runs.get(Q);if(!Z)throw new m(Q);if($!==void 0&&$<Z.lostBefore)throw new v(Q,$,Z.lostBefore);let G=Z.frames[0]?.seq;return this.drain(Z,Q,$??G??Z.lastSeq+1)}clear(){for(let Q of this.runs.values()){if(Q.evictAt)clearTimeout(Q.evictAt);Q.ended=!0,this.notify(Q)}this.runs.clear(),this.byThread.clear(),this.byClientRun.clear()}get size(){return this.runs.size}async pump(Q,$){let Z=Promise.resolve();try{for await(let G of Q.run.frames()){if(Q.frames.push(G),Q.lastSeq=G.seq,Q.frames.length>this.maxFrames){let W=Q.frames.shift();if(W)Q.lostBefore=W.seq+1}this.notify(Q);let J=$.onEvent;if(J)Z=Z.then(()=>J(G.event)).catch((W)=>o6($,W))}}catch(G){o6($,G)}finally{Q.ended=!0,this.notify(Q),this.scheduleEviction(Q),await Z}}async*drain(Q,$,Z){let G=Z;while(!0){let J=Q.version;for(;;){if(G<Q.lostBefore)throw new v($,G,Q.lostBefore);let W=Q.frames,Y=W[0]?.seq;if(Y===void 0)break;let V=Math.max(0,G-Y);if(V>=W.length)break;let X=W[V];yield X,G=X.seq+1}if(Q.ended&&G>Q.lastSeq)return;await this.wait(Q,J)}}wait(Q,$){if(Q.version!==$)return Promise.resolve();return new Promise((Z)=>Q.wake.add(Z))}notify(Q){Q.version++;let $=Array.from(Q.wake);Q.wake.clear();for(let Z of $)Z()}scheduleEviction(Q){if(Q.evictAt)return;let $=setTimeout(()=>{let Z=Q.run.runId;if(this.runs.delete(Z),Q.threadId&&this.byThread.get(Q.threadId)===Z)this.byThread.delete(Q.threadId);if(Q.clientRunId&&this.byClientRun.get(Q.clientRunId)===Z)this.byClientRun.delete(Q.clientRunId);this.notify(Q)},this.ttlMs);$.unref?.(),Q.evictAt=$}}var lQ=new DQ;function o6(Q,$){try{Q.onInternalError?.($)}catch{}}class UQ{ttlMs;clientOwnedIds;threads=new Map;lastSweep=0;constructor(Q={}){this.ttlMs=Q.ttlMs??86400000,this.clientOwnedIds=Q.clientOwnedIds??!1}async createThread(Q){let $=crypto.randomUUID();return this.threads.set($,{messages:[],touchedAt:Date.now()}),this.sweep(),{threadId:$}}async loadThread(Q){this.sweep();let $=this.threads.get(Q);if(!$)return this.clientOwnedIds?[]:null;return $.touchedAt=Date.now(),$.messages.slice()}async appendMessages(Q,$){this.sweep();let Z=this.threads.get(Q);if(!Z){if(!this.clientOwnedIds)throw Error(`Thread ${Q} does not exist here, or has expired.`);Z={messages:[],touchedAt:Date.now()},this.threads.set(Q,Z)}for(let G of $){let J=Z.messages.findIndex((W)=>W.id===G.id);if(J===-1)Z.messages.push(G);else Z.messages[J]=G}Z.touchedAt=Date.now()}delete(Q){this.threads.delete(Q)}get size(){return this.threads.size}sweep(Q=Date.now()){if(Q-this.lastSweep<60000)return;this.lastSweep=Q;for(let[$,Z]of this.threads)if(Q-Z.touchedAt>this.ttlMs)this.threads.delete($)}}var dQ=new UQ;function r6(Q={}){return{messages:Q.messages?[...Q.messages]:[],pending:Q.pending?[...Q.pending]:[],error:null,threadId:Q.threadId,seq:Q.seq??-1,cursorRunId:Q.cursorRunId,runMessageIds:[],loadedTools:[]}}function a6(Q,$,Z=new Date().toISOString()){if(!($.event.type==="run-start"&&$.event.runId!==Q.cursorRunId)&&$.seq<=Q.seq)return Q;return{...e6(Q,$.event,Z),seq:$.seq}}function e6(Q,$,Z){switch($.type){case"run-start":return{...Q,runId:$.runId,cursorRunId:$.runId,threadId:$.threadId??Q.threadId,runMessageIds:[],loadedTools:[],finishReason:void 0};case"message-start":return x(Q,$.messageId,Z,(G)=>({...G,role:$.role}));case"text-delta":if(s6(Q,$.messageId))return Q;return x(Q,$.messageId,Z,(G)=>({...G,content:P$(G.content,$.delta)}));case"reasoning-delta":if(s6(Q,$.messageId))return Q;return x(Q,$.messageId,Z,(G)=>({...G,content:j$(G.content,$.delta,$.id)}));case"output-delta":return x(Q,$.messageId,Z,(G)=>({...G,content:t6(G.content,{type:"output",value:$.snapshot,partial:!0},(J)=>J.type==="output")}));case"tool-call":return x(Q,$.messageId,Z,(G)=>{let J=G.content.findIndex((B)=>B.type==="tool-call"&&B.toolCallId===$.part.toolCallId),W=J===-1?void 0:G.content[J],Y=$.part.progress??W?.progress,V=$.part.nested??W?.nested,X=$.part.attachments??W?.attachments,K={...$.part,...Y?{progress:Y}:{},...V?{nested:V}:{},...X?{attachments:X}:{}},H=G.content.slice();if(J===-1)H.push(K);else H[J]=K;return{...G,content:H}});case"tool-search":{let G=$.loaded.filter((J)=>!Q.loadedTools.includes(J));if(G.length===0)return Q;return{...Q,loadedTools:[...Q.loadedTools,...G]}}case"tool-progress":return n6(Q,$.toolCallId,(G)=>({...G,progress:[...G.progress??[],$.data]}));case"nested-event":{let G=$;return n6(Q,$.toolCallId,(J)=>{let W=J.nested??[],Y=W.findIndex((H)=>H.runId===G.runId),V=W[Y]??{runId:G.runId,agent:G.agent,messages:[]},X=N$(V,G,Z),K=Y===-1?[...W,X]:W.map((H,B)=>B===Y?X:H);return{...J,nested:K}})}case"tool-result":{let G=x(Q,$.messageId,Z,(J)=>({...J,content:t6(J.content,$.part,(W)=>W.type==="tool-result"&&W.toolCallId===$.part.toolCallId)}));return{...G,pending:G.pending.filter((J)=>J.toolCallId!==$.part.toolCallId)}}case"message":{let G=Q.messages.findIndex((Y)=>Y.id===$.message.id),J=Q.messages.slice();if(G===-1)J.push($.message);else J[G]=$.message;let W=Q.runMessageIds.includes($.message.id)?Q.runMessageIds:[...Q.runMessageIds,$.message.id];return{...Q,messages:J,runMessageIds:W}}case"awaiting-input":return{...Q,runId:$.runId,pending:[...$.pending]};case"message-end":return x(Q,$.messageId,Z,(G)=>({...G,finishReason:$.finishReason,...$.outputTruncated?{outputTruncated:!0}:{},content:$.outputTruncated||$.finishReason==="length"?G.content.filter((J)=>!(J.type==="output"&&J.partial)):G.content.map((J)=>J.type==="output"&&J.partial?{...J,partial:!1}:J)}));case"usage":{let G=C$(Q.messages,(W)=>W.role==="assistant");if(G===-1)return Q;let J=Q.messages.slice();return J[G]={...J[G],usage:$.usage},{...Q,messages:J}}case"error":return{...Q,error:$.error,pending:[]};case"run-end":return{...Q,runId:void 0,finishReason:$.finishReason,messages:Q9(Q,$.finishReason)};default:return Q}}function Q9(Q,$){return Q.messages.map((Z)=>Z.role==="assistant"&&Q.runMessageIds.includes(Z.id)?L$(Z,$):Z)}function L$(Q,$){let Z=Q.content.map((J)=>J.type==="tool-call"&&J.nested?.some((W)=>W.finishReason===void 0)?{...J,nested:J.nested.map((W)=>W.finishReason===void 0?O$(W,$):W)}:J);if(Q.finishReason===void 0)return{...Q,finishReason:$,content:Z};return Z.some((J,W)=>J!==Q.content[W])?{...Q,content:Z}:Q}function O$(Q,$){let Z={messages:Q.messages,pending:[],error:null,seq:-1,runMessageIds:Q.messages.map((G)=>G.id),loadedTools:[]};return{...Q,finishReason:$,messages:Q9(Z,$)}}function n6(Q,$,Z){for(let G=Q.messages.length-1;G>=0;G--){let J=Q.messages[G],W=J.content.findIndex((K)=>K.type==="tool-call"&&K.toolCallId===$);if(W===-1)continue;if(J.finishReason!==void 0&&!_$(Q,J,$))return Q;let Y=J.content.slice();Y[W]=Z(Y[W]);let V=Q.messages.slice();V[G]={...J,content:Y};let X=Q.runMessageIds.includes(J.id)?Q.runMessageIds:[...Q.runMessageIds,J.id];return{...Q,runMessageIds:X,messages:V}}return Q}function N$(Q,$,Z){let G={messages:Q.messages,pending:[],error:null,seq:-1,runMessageIds:Q.messages.map((W)=>W.id),loadedTools:[],finishReason:Q.finishReason},J=e6(G,$.event,Z);return{...Q,...$.label!==void 0?{label:$.label}:{},messages:J.messages,...J.finishReason!==void 0?{finishReason:J.finishReason}:{},...$.event.type==="usage"?{usage:$.event.usage}:{}}}function _$(Q,$,Z){if($.finishReason!=="awaiting-input")return!1;return!Q.messages.some((G)=>G.content.some((J)=>J.type==="tool-result"&&J.toolCallId===Z))}function s6(Q,$){let Z=Q.messages.find((G)=>G.id===$);return Z!==void 0&&Z.finishReason!==void 0}function C$(Q,$){for(let Z=Q.length-1;Z>=0;Z--)if($(Q[Z]))return Z;return-1}function x(Q,$,Z,G){let J=Q.messages.findIndex((V)=>V.id===$),W=Q.runMessageIds.includes($)?Q.runMessageIds:[...Q.runMessageIds,$];if(J===-1){let V={id:$,role:"assistant",content:[],createdAt:Z};return{...Q,runMessageIds:W,messages:[...Q.messages,G(V)]}}let Y=Q.messages.slice();return Y[J]=G(Y[J]),{...Q,runMessageIds:W,messages:Y}}function P$(Q,$){let Z=Q[Q.length-1];if(Z&&Z.type==="text")return[...Q.slice(0,-1),{type:"text",text:Z.text+$}];return[...Q,{type:"text",text:$}]}function j$(Q,$,Z){let G=Q[Q.length-1];if(G&&G.type==="reasoning"&&G.id===Z)return[...Q.slice(0,-1),{...G,text:(G.text??"")+$}];return[...Q,Z?{type:"reasoning",id:Z,text:$}:{type:"reasoning",text:$}]}function t6(Q,$,Z){let G=Q.findIndex(Z);if(G===-1)return[...Q,$];let J=Q.slice();return J[G]=$,J}class oQ{store;threadId;report;chain=Promise.resolve();done=new Set;closed=!1;state;runId;constructor(Q,$,Z,G){this.store=Q;this.threadId=$;this.report=G;this.state=r6({messages:Z})}finish(Q){if(this.closed)return;this.done.add(Q.id),this.write(()=>[iQ(Q)])}frame(Q){if(this.closed)return;let $=Q.event;if($.type==="run-start")this.runId=$.runId;switch(this.state=a6(this.state,Q),$.type){case"message":this.write(()=>[iQ($.message)]);return;case"tool-call":if($.part.partial)return;this.checkpoint($.messageId);return;case"message-start":case"tool-result":this.checkpoint($.messageId);return;default:return}}close(Q=[]){this.closed=!0;for(let $ of Q)this.done.add($.id)}settled(){return this.chain}checkpoint(Q){if(this.done.has(Q))return;let $=this.state.messages.find((G)=>G.id===Q);if(!$)return;let Z=this.runId;this.write(()=>{let G=iQ($);if(G.finishReason===void 0&&Z)G.runId=Z;return[G]})}write(Q){let $;try{$=Q()}catch(Z){this.report(Z);return}this.chain=this.chain.then(()=>this.store.appendMessages(this.threadId,$)).catch((Z)=>this.report(Z))}}function iQ(Q){return structuredClone(Q)}async function $9(Q,$){let Z=[],G=null,J=Q.slice();for(let W=0;W<J.length;W++){let Y=J[W];if(Y.role!=="assistant"||Y.finishReason!==void 0)continue;if(Y.runId&&await $(Y.runId))continue;G??=new Set(Q.flatMap((K)=>K.content.flatMap((H)=>H.type==="tool-result"?[H.toolCallId]:[])));let V=Y.content.map((K)=>K.type==="tool-call"?Z9(K):K);for(let K of Y.content){if(K.type!=="tool-call"||G.has(K.toolCallId))continue;let H={type:"tool-result",toolCallId:K.toolCallId,name:K.name,status:"denied",cause:"interrupted"};V.push(H)}let X={...Y,content:V,finishReason:"interrupted"};J[W]=X,Z.push(X)}return{messages:J,settled:Z}}function Z9(Q){let{partial:$,...Z}=Q;if(!Z.nested?.some((G)=>G.finishReason===void 0))return Z;return{...Z,nested:Z.nested.map(M$)}}function M$(Q){if(Q.finishReason!==void 0)return Q;return{...Q,finishReason:"interrupted",messages:Q.messages.map(($)=>$.role==="assistant"&&$.finishReason===void 0?{...$,finishReason:"interrupted",content:$.content.map((Z)=>Z.type==="tool-call"?Z9(Z):Z)}:$)}}var q$=Y9,zQ=new Map,G9=new WeakMap,FQ=new Map;class K9 extends q${static kind="agent-controller";store=dQ;liveRuns=lQ;attachments=s;attachmentStorage=V9;hookHoldMs=30000;instructions(Q,$){}context(Q,$){return{}}requireThread=!1;authorizeRequest(Q,$){}async stream(Q=new p){let $=await nQ(Q);if($.error)return LQ($);let Z=$.body,G=typeof Z.threadId==="string"?Z.threadId:void 0,J=k$(Z);if(J.error)return LQ({body:{},error:J.error});let W=J.turn,Y=typeof Z.clientRunId==="string"?Z.clientRunId:void 0,V=H9(Z);if(this.requireThread&&!G)return j(400,{code:"thread_required",message:"This agent takes a turn only on a thread: send a threadId."});let X=Y?{cancelled:!1}:null;if(X)FQ.set(Y,X);let K=async()=>{let H;if(G){let O=await this.store.loadThread(G);if(!O)return j(404,{code:"thread_not_found",message:`Thread ${G} does not exist here, or has expired.`});H=await this.settleThread(G,O,{write:!0})}else H=Array.isArray(Z.messages)?Z.messages:[];let B=await this.instructions(Q,{body:V})||void 0,D=await this.context(Q,{body:V}),L=await this.attachmentsFor(Q,G,{body:V});if(X?.cancelled)return J9();let U=G?new oQ(this.store,G,H,(O)=>this.reportHookFailure(O)):null,z=this.agent.stream({messages:H,turn:W,threadId:G,...U?{onMessage:(O)=>U.finish(O)}:{},instructions:B,context:D,attachments:L,body:V}),F={req:Q,runId:z.runId,threadId:G},C=this.liveRuns.register(z,{threadId:G,clientRunId:Y,onEvent:(O)=>this.dispatchEvent(O,F),onInternalError:(O)=>this.reportHookFailure(O)});if(U)this.follow(z,U);let{stored:M,hooks:q}=this.persistRun(z,F,C,U);return G9.set(z,M),Q.ctx?.()?.waitUntil(q),z.toResponse()};try{if(await this.authorizeRequest(Q,{route:"stream",threadId:G,body:V}),X?.cancelled)return J9();return G?await this.withThread(G,K):await K()}finally{if(X&&FQ.get(Y)===X)FQ.delete(Y)}}async withThread(Q,$){let Z=zQ.get(Q)??Promise.resolve(),G,J=new Promise((Y)=>{G=Y}),W=Z.then(()=>J);zQ.set(Q,W),await Z;try{let Y=await this.liveRuns.find({threadId:Q}),V=Y?this.liveRuns.get(Y.runId):null;if(V)V.stop({reason:"superseded by a later turn on this thread"}),await G9.get(V);return await $()}finally{if(G(),zQ.get(Q)===W)zQ.delete(Q)}}async attach(Q=new p){let $=await nQ(Q);if($.error)return LQ($);let Z=$.body,G=typeof Z.threadId==="string"?Z.threadId:x$(Q,"threadId");if(!G)return j(400,{code:"invalid_request",message:"attach needs a threadId: it is the handle that survives a refresh."});await this.authorizeRequest(Q,{route:"attach",threadId:G});let J=await this.liveRuns.find({threadId:G});if(!J)return j(404,{code:"no_live_run",message:`No run in progress for thread ${G} in this process.`});let W=typeof Z.runId==="string"?Z.runId:void 0,Y=W&&W!==J.runId?void 0:E$(Q,Z);try{return z6(this.liveRuns.replay(J.runId,Y))}catch(V){if(V instanceof v)return j(410,{code:V.code,message:V.message,oldestSeq:V.oldest});if(V instanceof m)return j(404,{code:V.code,message:V.message});throw V}}async stop(Q=new p){let $=await nQ(Q);if($.error)return LQ($);let Z=$.body;await this.authorizeRequest(Q,{route:"stop",threadId:typeof Z.threadId==="string"?Z.threadId:void 0});let G=typeof Z.runId==="string"?Z.runId:void 0;if(!G&&typeof Z.clientRunId==="string"){if(G=this.liveRuns.findByClientRunId(Z.clientRunId)??void 0,!G){let W=FQ.get(Z.clientRunId);if(W)return W.cancelled=!0,{stopped:!0}}}if(!G&&typeof Z.threadId==="string")G=(await this.liveRuns.find({threadId:Z.threadId}))?.runId;let J=G?this.liveRuns.get(G):null;if(!J)return{stopped:!1};return J.stop({reason:typeof Z.reason==="string"?Z.reason:void 0}),{stopped:!0}}attachmentScope(Q,$,Z){let G=Q.ctx()?.user,J=G?.id??G?.publicId;if(J!==void 0&&J!==null&&String(J)!=="")return{key:`user:${String(J)}`};if($)return{key:`thread:${$}`};return null}attachmentDestination(Q,$){return"both"}async attachmentsFor(Q,$,Z={body:{}}){let G=await this.attachmentScope(Q,$,Z);if(!G)return null;return new h(this.attachments,this.attachmentStorage,G)}async upload(Q=new p){let $=await Q.rawRequest.formData(),Z=$.get("file");if(!(Z instanceof Blob))throw Error("upload expects a multipart body with a `file` field.");let G=Z instanceof File&&Z.name?Z.name:"upload",J=Z.type||"application/octet-stream",W=R$($.get("body")),Y=$.get("threadId");await this.authorizeRequest(Q,{route:"upload",threadId:typeof Y==="string"&&Y.length>0?Y:void 0,body:W});let V=typeof Y==="string"&&Y.length>0&&await this.store.loadThread(Y)!==null?Y:void 0,X=await this.attachmentDestination(Z,Q),K=b$(X,$.get("destination")),H=await this.attachmentScope(Q,V,{body:W}),B=K!=="provider"&&!H;if(B){if(K==="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()`.');I$()}if(K==="provider"||!H){let C={fileId:await this.agent.provider.upload(Z),name:G,mimeType:J,size:Z.size,destination:"provider"};if(B)C.downgraded="no_scope";return C}let D=CQ(),L=await this.attachmentStorage.put({name:PQ(D,G),body:Z,contentType:J}),U=K==="both"?await this.agent.provider.upload(Z):void 0,z={id:D,scopeKey:H.key,fileId:U,objectName:L,name:G,mimeType:J,size:Z.size,createdAt:new Date().toISOString(),destination:K};return await this.attachments.put(H,z),{fileId:U,attachmentId:D,name:G,mimeType:J,size:Z.size,destination:K}}onMessage(Q,$){}onToolCall(Q,$){}onAwaitingInput(Q,$){}onError(Q,$){}onStreamComplete(Q,$){}reportHookFailure(Q){console.error("[gemi/ai] agent controller hook failed",Q)}async dispatchEvent(Q,$){switch(Q.type){case"tool-call":if(!Q.part.partial&&!Q.resent)await this.onToolCall({toolCallId:Q.part.toolCallId,name:String(Q.part.name),input:Q.part.input},$);return;case"awaiting-input":await this.onAwaitingInput(Q.pending,$);return;case"error":await this.onError(Q.error,$);return;default:return}}async readThread(Q){let $=await this.store.loadThread(Q);return $?await this.settleThread(Q,$,{write:!1}):null}isRunLive(Q,$){return this.liveRuns.get(Q)!==null}async settleThread(Q,$,{write:Z}){let{messages:G,settled:J}=await $9($,(W)=>this.isRunLive(W,Q));if(Z&&J.length>0)try{await this.store.appendMessages(Q,J)}catch(W){this.reportHookFailure(W)}return G}follow(Q,$){(async()=>{try{for await(let Z of Q.frames())$.frame(Z)}catch(Z){this.reportHookFailure(Z)}})()}persistRun(Q,$,Z,G=null){let J=Promise.resolve(),W=(async()=>{let V;try{V=await Q.result()}catch(K){G?.close(),await G?.settled(),J=this.safely(()=>this.onError({code:"unknown",message:K instanceof Error?K.message:String(K),retryable:!1},$));return}let X=V.messages;if(G?.close(X),await G?.settled(),$.threadId&&X.length>0)try{await this.store.appendMessages($.threadId,X)}catch(K){this.reportHookFailure(K)}J=this.notifyRun(V,X,$)})(),Y=W.then(()=>f$(Promise.all([J,Z]).then(()=>{}),this.hookHoldMs));return{stored:W,hooks:Y}}async notifyRun(Q,$,Z){for(let G of $)await this.safely(()=>this.onMessage(G,Z));await this.safely(()=>this.onStreamComplete(Q,Z))}async safely(Q){try{await Q()}catch($){this.reportHookFailure($)}}}var sQ=["turn","clientRunId","threadId","messages"],S$=["text","files","toolResults"];function H9(Q,$=B9(Q)?sQ:[...sQ,...S$]){let Z={};for(let[G,J]of Object.entries(Q)){if($.includes(G))continue;Object.defineProperty(Z,G,{value:J,writable:!0,enumerable:!0,configurable:!0})}return Z}function R$(Q){if(Q===null)return{};let $;if(typeof Q==="string")try{$=JSON.parse(Q)}catch{throw new tQ("The upload's `body` field is not valid JSON.")}if($===null||typeof $!=="object"||Array.isArray($))throw new tQ("The upload's `body` field must be a JSON object.");return H9($,sQ)}class tQ extends X9{constructor(Q){super(Q);this.name="InvalidUploadError",this.payload={api:{status:400,data:{error:{code:"invalid_request",message:Q}}},view:{}}}}async function nQ(Q){let $=Q?.rawRequest;if(!$||$.method==="GET"||$.method==="HEAD"||!$.body)return{body:{}};if(!T$($.headers.get("Content-Type")))return{body:{},status:415,code:"unsupported_media_type",error:"The request body must be sent as application/json."};let Z;try{Z=await $.text()}catch{return{body:{},error:"The request body could not be read."}}if(!Z.trim())return{body:{}};let G;try{G=JSON.parse(Z)}catch{return{body:{},error:"The request body is not valid JSON."}}if(G===null||typeof G!=="object"||Array.isArray(G))return{body:{},error:"The request body must be a JSON object."};return{body:G}}function T$(Q){if(typeof Q!=="string")return!1;let[$]=Q.split(";",1);return $.trim().toLowerCase()==="application/json"}function LQ(Q){return j(Q.status??400,{code:Q.code??"invalid_request",message:Q.error})}function B9(Q){return Boolean(Q.turn)&&typeof Q.turn==="object"}function k$(Q){let $=B9(Q)?Q.turn:Q,Z={};if(typeof $.text==="string")Z.text=$.text;if(Array.isArray($.files)){let G=A$($.files);if(typeof G==="string")return{error:G};Z.files=G}if(Array.isArray($.toolResults))Z.toolResults=$.toolResults;return Object.keys(Z).length>0?{turn:Z}:{}}function A$(Q){let $=[];for(let[Z,G]of Q.entries()){let J=`turn.files[${Z}]`;if(!G||typeof G!=="object"||Array.isArray(G))return`${J} must be an object.`;let W={};for(let H of["fileId","attachmentId","name","mimeType"]){let B=G[H];if(B===void 0||B===null||B==="")continue;if(typeof B!=="string")return`${J}.${H} must be a string.`;W[H]=B}let{fileId:Y,attachmentId:V,name:X,mimeType:K}=W;if(Y?.startsWith(P))return`${J}.fileId holds a gemi attachment id (${Y}). \`fileId\` is the provider's id from the upload response; put this one in \`attachmentId\`.`;if(V!==void 0&&!V.startsWith(P))return`${J}.attachmentId is not a gemi attachment id: it must start with "${P}".`;if(!Y&&!V)return`${J} has neither a \`fileId\` nor an \`attachmentId\`. Send the ids the upload response answered.`;$.push({...Y?{fileId:Y}:{},...V?{attachmentId:V}:{},...X!==void 0?{name:X}:{},...K!==void 0?{mimeType:K}:{}})}return $}function E$(Q,$){if(typeof $.from==="number"&&Number.isFinite($.from))return Math.max(0,Math.floor($.from));if(typeof $.cursor==="number"&&Number.isFinite($.cursor)){let G=Math.floor($.cursor);if(G>=0)return G+1;return}let Z=Q?.rawRequest?.headers?.get("Last-Event-ID");if(Z){let G=Number.parseInt(Z,10);if(Number.isFinite(G))return Math.max(0,G+1)}return}function x$(Q,$){let Z=Q?.search?.get($);return typeof Z==="string"?Z:void 0}function J9(){return j(409,{code:"stopped",message:"The turn was stopped before it started."})}function j(Q,$){return new Response(JSON.stringify({error:$}),{status:Q,headers:{"Content-Type":"application/json"}})}function b$(Q,$){if(typeof $!=="string"||$.length===0)return Q;if($!=="both"&&$!=="provider"&&$!=="storage")throw Error(`Unknown attachment destination "${$}". Expected "both", "provider" or "storage".`);if($===Q||Q==="both"&&$==="storage")return $;if(Q==="both"&&$==="provider")throw Error('This upload asked for the "provider" destination under a "both" policy. A client may ask for "storage", which keeps a file away from the model provider, but it may not ask the server to stop keeping its own copy while the vendor still gets the file \u2014 that is the app\'s retention decision. Change `attachmentDestination()` if this file should not be kept.');throw Error(`This upload asked for the "${$}" destination, but the server's policy for it is "${Q}", and a client hint may only ask for "storage" under a "both" policy. Change \`attachmentDestination()\` if the file really should go there.`)}var W9=!1;function I$(){if(W9)return;W9=!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 w$=2147483647;function f$(Q,$){let Z=Q.then(()=>{},()=>{});if(!($<=w$))return Z;let G,J=new Promise((W)=>{G=setTimeout(W,$)});return Promise.race([Z,J]).finally(()=>clearTimeout(G))}export{u9 as toAgentTools,GQ as supportsStrict,v$ as s,lQ as liveRuns,s as defaultAttachmentStore,dQ as defaultAgentStore,JQ as ToolNamespace,TQ as Skill,h as ScopedAttachments,g as SKILLS_NAMESPACE,T as PendingEscalation,mQ as OpenAIProvider,IQ as OpenAIImageProvider,DQ as MemoryLiveRuns,n as MemoryAttachmentStore,UQ as MemoryAgentStore,m as LiveRunNotFoundError,w as InvalidAttachmentScopeError,XQ as ImageRequestError,VQ as ImageProvider,EQ as ImageModel,v as FrameCursorEvictedError,pQ as AzureOpenAIProvider,wQ as AzureOpenAIImageProvider,y as AttachmentNotFoundError,A as AgentTool,kQ as AgentRunError,BQ as AgentProvider,K9 as AgentController,AQ as Agent};
|
|
19
19
|
|
|
20
|
-
//# debugId=
|
|
20
|
+
//# debugId=C44956796623378064756E2164756E21
|