@urun-sh/openai 0.2.51 → 0.2.52

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.
@@ -1,3 +1,3 @@
1
- "use strict";var se=Object.create;var E=Object.defineProperty;var re=Object.getOwnPropertyDescriptor;var oe=Object.getOwnPropertyNames;var ie=Object.getPrototypeOf,ae=Object.prototype.hasOwnProperty;var pe=(t,e)=>{for(var n in e)E(t,n,{get:e[n],enumerable:!0})},K=(t,e,n,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of oe(e))!ae.call(t,r)&&r!==n&&E(t,r,{get:()=>e[r],enumerable:!(s=re(e,r))||s.enumerable});return t};var le=(t,e,n)=>(n=t!=null?se(ie(t)):{},K(e||!t||!t.__esModule?E(n,"default",{value:t,enumerable:!0}):n,t)),ue=t=>K(E({},"__esModule",{value:!0}),t);var Le={};pe(Le,{SessionPool:()=>U,URUN_API:()=>M,coalesceSameRole:()=>V,createUrunExtension:()=>ee,default:()=>Ie,makeStreamSimple:()=>Z,resolveSessionEnv:()=>z,toResponsesInput:()=>Q});module.exports=ue(Le);var ce=()=>typeof document>"u"?new URL(`file:${__filename}`).href:document.currentScript&&document.currentScript.tagName.toUpperCase()==="SCRIPT"?document.currentScript.src:new URL("main.js",document.baseURI).href,d=ce();var X=require("@earendil-works/pi-ai");function q(t,e,n,s){let r=t.response??{},o={request_id:n,consumer_id:s,stream:!0,kind:"chat",messages:e};return typeof r.instructions=="string"&&(o.instructions=r.instructions),Array.isArray(r.modalities)&&(o.modalities=r.modalities),typeof r.temperature=="number"&&(o.temperature=r.temperature),typeof r.max_output_tokens=="number"&&(o.max_output_tokens=r.max_output_tokens),r.tools!==void 0&&(o.tools=r.tools),o}function W(t,e,n){let s={request_id:e,consumer_id:n,stream:!!t.stream,kind:"responses",input:t.input};return t.model&&(s.model=t.model),t.tools!==void 0&&(s.tools=t.tools),typeof t.temperature=="number"&&(s.temperature=t.temperature),typeof t.max_output_tokens=="number"&&(s.max_output_tokens=t.max_output_tokens),s}function G(t){if(t instanceof Error)return{type:"error",error:{type:"urun_error",code:t.name||null,message:t.message}};if(t&&typeof t=="object"&&t.t==="error"){let e=t,n=e.body??{};return{type:"error",error:{type:"urun_error",code:e.code??null,message:n.message??"unknown error"}}}return{type:"error",error:{type:"urun_error",code:null,message:String(t)}}}var de="llm-resp";async function*L(t,e){let n=`${de}:${e}`,s=`resp_${e}`;yield{type:"response.created",response:{id:s,status:"in_progress"}};for await(let r of t.stream(n).messages()){let o=r;if(o.t==="delta")yield{type:"response.output_text.delta",item_id:s,delta:o.delta};else if(o.t==="response"){yield{type:"response.completed",response:{id:s,status:"completed",...o.body}};return}else if(o.t==="error"){yield G(o);return}}}var me="llm",R=class{constructor(e){this.session=e}session;get consumerId(){return this.session.consumerId}write(e){this.session.doc(me).set({requests:{[e.request_id]:{payload:e,consumer_id:e.consumer_id,stream:e.stream}}})}sendResponses(e,n){let s=W(e,n,this.consumerId);return this.write(s),L(this.session,n)}sendResponseCreate(e,n,s){let r=q(e,n,s,this.consumerId);return this.write(r),L(this.session,s)}};var J=0;function fe(){return J+=1,`req_${Date.now().toString(36)}_${J.toString(36)}`}var x=class{transport;constructor(e){this.transport=new R(e)}responses={create:async e=>{let n=fe(),s=this.transport.sendResponses(e,n);return Object.assign((async function*(){yield*s})(),{requestId:n})}}};var $="https://api.urun.sh/v1";async function B(t){let e=t.fetchImpl??fetch,n=`${t.apiUrl.replace(/\/+$/,"")}/apps`,s=await e(n,{headers:{Authorization:`Bearer ${t.apiKey}`,Accept:"application/json"}});if(!s.ok)throw new Error(`org apps listing failed: GET ${n} \u2192 ${s.status}`);let r=await s.json();if(!Array.isArray(r.apps))throw new Error(`org apps listing returned no "apps" array (GET ${n})`);if(r.truncated===!0)throw new Error(`org apps listing was truncated (GET ${n} returned ${r.apps.length} of more) \u2014 model discovery would silently omit deployed apps`);return r.apps}async function Y(t){let e=await B(t),n=e.filter(s=>s.function_name===t.fnName&&s.deployment_status==="active").map(s=>s.app_slug);if(n.length===0)throw new Error(`urun pi extension: the org has no active deployed app exposing "${t.fnName}" (GET ${t.apiUrl}/apps returned ${e.length} app(s), none servable) \u2014 deploy one with \`urun serve <model>\` first`);return n.sort()}var M="urun-serve",ge="serve",ye=131072,he=16384,H=3,we=42e4,ve=6e4,_e=15e3;function be(t){let e=(t.URUN_API_KEY??"").trim();if(!e)throw new Error("urun pi extension: URUN_API_KEY is required \u2014 model discovery lists the org's deployed serve apps via the org API (URUN_JWT alone cannot list apps)");return{apiKey:e,apiUrl:(t.URUN_API_URL??"").trim()||$,fnName:(t.URUN_FUNCTION??"").trim()||ge}}function z(t){let e=(t.URUN_BASE_URL??"").trim(),n=(t.URUN_ORG_ID??"").trim();if(!e)throw new Error("urun pi extension: URUN_BASE_URL is required to open a session");if(/\/v1\/*$/.test(new URL(e).pathname))throw new Error(`urun pi extension: URUN_BASE_URL must be the session-gateway base (e.g. https://api.urun.sh), got ${e} \u2014 a trailing /v1 is the org API form (URUN_API_URL); session allocation 404s against it. Drop the /v1.`);if(!n)throw new Error("urun pi extension: URUN_ORG_ID is required to open a session");let s=(t.URUN_JWT??"").trim();if(s)return{baseUrl:e,orgId:n,auth:{lane:"jwt",jwt:s}};let r=(t.URUN_API_KEY??"").trim();if(!r)throw new Error("urun pi extension: URUN_JWT or URUN_API_KEY is required to open a session");let o=(t.URUN_GATEWAY_URL??"").trim()||void 0;return{baseUrl:e,orgId:n,auth:{lane:"api-key",apiKey:r,gatewayUrl:o}}}var Ae=async(t,e,n)=>{let{baseUrl:s,orgId:r,auth:o}=z(t),{createRequire:a}=await import("module"),l=a(d);if(typeof globalThis.RTCPeerConnection>"u")try{l.resolve("werift")}catch{throw new Error('urun pi extension: token streams require a WebRTC data channel, and this Node runtime has no RTCPeerConnection and no "werift" backend installed (@urun-sh/core\'s optional Node WebRTC backend \u2014 it was probably stripped by a --no-optional install). Install werift (`npm i werift`) and retry.')}let{App:m,createClientToken:p}=l("@urun-sh/core"),y=(o.lane==="jwt"?m(e,{baseUrl:s,orgId:r,jwt:o.jwt}):m(e,{baseUrl:s,orgId:r,getAccessToken:async()=>(await p(o.apiKey,{baseUrl:o.gatewayUrl,expiresIn:300,allowedFunctions:[`${e}/${n}`]})).token}))[n];if(typeof y!="function")throw new Error(`urun pi extension: app "${e}" has no function "${n}"`);let u=y(),c=u.connect;return typeof c=="function"&&await c.call(u),u};function Ee(t){try{Promise.resolve(t.close?.()).catch(()=>{})}catch{}}var U=class{constructor(e,n,s){this.open=e;this.env=n;this.fnName=s}open;env;fnName;pool=new Map;acquire(e){let n=this.pool.get(e);if(!n){let s=Promise.resolve(this.open(this.env,e,this.fnName)).then(r=>({session:r,responses:new x(r)}));n=s,this.pool.set(e,s),s.catch(()=>{this.pool.get(e)===s&&this.pool.delete(e)})}return n}evict(e){let n=this.pool.get(e);n&&(this.pool.delete(e),n.then(s=>Ee(s.session),()=>{}))}closeAll(){for(let e of[...this.pool.keys()])this.evict(e)}};function Q(t){let e=[];t.systemPrompt&&e.push({role:"system",content:t.systemPrompt});for(let n of t.messages){let s=n.role==="assistant"?"assistant":"user";e.push({role:s,content:Re(n.content)})}return V(e)}function V(t){let e=[];for(let n of t){let s=e[e.length-1];s&&s.role===n.role?s.content=[s.content,n.content].filter(r=>r.length>0).join(`
1
+ "use strict";var re=Object.create;var E=Object.defineProperty;var oe=Object.getOwnPropertyDescriptor;var ie=Object.getOwnPropertyNames;var ae=Object.getPrototypeOf,pe=Object.prototype.hasOwnProperty;var ue=(e,t)=>{for(var n in t)E(e,n,{get:t[n],enumerable:!0})},K=(e,t,n,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of ie(t))!pe.call(e,r)&&r!==n&&E(e,r,{get:()=>t[r],enumerable:!(s=oe(t,r))||s.enumerable});return e};var le=(e,t,n)=>(n=e!=null?re(ae(e)):{},K(t||!e||!e.__esModule?E(n,"default",{value:e,enumerable:!0}):n,e)),ce=e=>K(E({},"__esModule",{value:!0}),e);var Me={};ue(Me,{SessionPool:()=>k,URUN_API:()=>M,coalesceSameRole:()=>Z,createUrunExtension:()=>te,default:()=>Le,makeSessionFactory:()=>Q,makeStreamSimple:()=>ee,resolveSessionEnv:()=>z,toResponsesInput:()=>V});module.exports=ce(Me);var de=()=>typeof document>"u"?new URL(`file:${__filename}`).href:document.currentScript&&document.currentScript.tagName.toUpperCase()==="SCRIPT"?document.currentScript.src:new URL("main.js",document.baseURI).href,l=de();var X=require("@earendil-works/pi-ai");function q(e,t,n,s){let r=e.response??{},o={request_id:n,consumer_id:s,stream:!0,kind:"chat",messages:t};return typeof r.instructions=="string"&&(o.instructions=r.instructions),Array.isArray(r.modalities)&&(o.modalities=r.modalities),typeof r.temperature=="number"&&(o.temperature=r.temperature),typeof r.max_output_tokens=="number"&&(o.max_output_tokens=r.max_output_tokens),r.tools!==void 0&&(o.tools=r.tools),o}function W(e,t,n){let s={request_id:t,consumer_id:n,stream:!!e.stream,kind:"responses",input:e.input};return e.model&&(s.model=e.model),e.tools!==void 0&&(s.tools=e.tools),typeof e.temperature=="number"&&(s.temperature=e.temperature),typeof e.max_output_tokens=="number"&&(s.max_output_tokens=e.max_output_tokens),s}function G(e){if(e instanceof Error)return{type:"error",error:{type:"urun_error",code:e.name||null,message:e.message}};if(e&&typeof e=="object"&&e.t==="error"){let t=e,n=t.body??{};return{type:"error",error:{type:"urun_error",code:t.code??null,message:n.message??"unknown error"}}}return{type:"error",error:{type:"urun_error",code:null,message:String(e)}}}var me="llm-resp";async function*I(e,t){let n=`${me}:${t}`,s=`resp_${t}`;yield{type:"response.created",response:{id:s,status:"in_progress"}};for await(let r of e.stream(n).messages()){let o=r;if(o.t==="delta")yield{type:"response.output_text.delta",item_id:s,delta:o.delta};else if(o.t==="response"){yield{type:"response.completed",response:{id:s,status:"completed",...o.body}};return}else if(o.t==="error"){yield G(o);return}}}var fe="llm",x=class{constructor(t){this.session=t}session;get consumerId(){return this.session.consumerId}write(t){this.session.doc(fe).set({requests:{[t.request_id]:{payload:t,consumer_id:t.consumer_id,stream:t.stream}}})}sendResponses(t,n){let s=W(t,n,this.consumerId);return this.write(s),I(this.session,n)}sendResponseCreate(t,n,s){let r=q(t,n,s,this.consumerId);return this.write(r),I(this.session,s)}};var J=0;function ge(){return J+=1,`req_${Date.now().toString(36)}_${J.toString(36)}`}var R=class{transport;constructor(t){this.transport=new x(t)}responses={create:async t=>{let n=ge(),s=this.transport.sendResponses(t,n);return Object.assign((async function*(){yield*s})(),{requestId:n})}}};var L="https://api.urun.sh/v1";async function B(e){let t=e.fetchImpl??fetch,n=`${e.apiUrl.replace(/\/+$/,"")}/apps`,s=await t(n,{headers:{Authorization:`Bearer ${e.apiKey}`,Accept:"application/json"}});if(!s.ok)throw new Error(`org apps listing failed: GET ${n} \u2192 ${s.status}`);let r=await s.json();if(!Array.isArray(r.apps))throw new Error(`org apps listing returned no "apps" array (GET ${n})`);if(r.truncated===!0)throw new Error(`org apps listing was truncated (GET ${n} returned ${r.apps.length} of more) \u2014 model discovery would silently omit deployed apps`);return r.apps}async function Y(e){let t=await B(e),n=t.filter(s=>s.function_name===e.fnName&&s.deployment_status==="active").map(s=>s.app_slug);if(n.length===0)throw new Error(`urun pi extension: the org has no active deployed app exposing "${e.fnName}" (GET ${e.apiUrl}/apps returned ${t.length} app(s), none servable) \u2014 deploy one with \`urun serve <model>\` first`);return n.sort()}var M="urun-serve",ye="serve",he=131072,we=16384,H=3,ve=42e4,_e=6e4,be=15e3;function Ae(e){let t=(e.URUN_API_KEY??"").trim();if(!t)throw new Error("urun pi extension: URUN_API_KEY is required \u2014 model discovery lists the org's deployed serve apps via the org API (URUN_JWT alone cannot list apps)");return{apiKey:t,apiUrl:(e.URUN_API_URL??"").trim()||L,fnName:(e.URUN_FUNCTION??"").trim()||ye}}function z(e){let t=(e.URUN_BASE_URL??"").trim(),n=(e.URUN_ORG_ID??"").trim();if(!t)throw new Error("urun pi extension: URUN_BASE_URL is required to open a session");if(/\/v1\/*$/.test(new URL(t).pathname))throw new Error(`urun pi extension: URUN_BASE_URL must be the session-gateway base (e.g. https://api.urun.sh), got ${t} \u2014 a trailing /v1 is the org API form (URUN_API_URL); session allocation 404s against it. Drop the /v1.`);if(!n)throw new Error("urun pi extension: URUN_ORG_ID is required to open a session");let s=(e.URUN_JWT??"").trim();if(s)return{baseUrl:t,orgId:n,auth:{lane:"jwt",jwt:s}};let r=(e.URUN_API_KEY??"").trim();if(!r)throw new Error("urun pi extension: URUN_JWT or URUN_API_KEY is required to open a session");let o=(e.URUN_GATEWAY_URL??"").trim()||void 0;return{baseUrl:t,orgId:n,auth:{lane:"api-key",apiKey:r,gatewayUrl:o}}}function Q(e){return async(t,n,s)=>{let{baseUrl:r,orgId:o,auth:a}=z(t),{App:u,createClientToken:d}=await e(),i=(a.lane==="jwt"?u(n,{baseUrl:r,orgId:o,jwt:a.jwt}):u(n,{baseUrl:r,orgId:o,getAccessToken:async()=>(await d(a.apiKey,{baseUrl:a.gatewayUrl,expiresIn:300,allowedFunctions:[`${n}/${s}`]})).token}))[s];if(typeof i!="function")throw new Error(`urun pi extension: app "${n}" has no function "${s}"`);let m=i(),c=m.connect;return typeof c=="function"&&await c.call(m),m}}var Ee=Q(async()=>{let{createRequire:e}=await import("module"),t=e(l);if(typeof globalThis.RTCPeerConnection>"u")try{t.resolve("werift")}catch{throw new Error('urun pi extension: token streams require a WebRTC data channel, and this Node runtime has no RTCPeerConnection and no "werift" backend installed (@urun-sh/core\'s optional Node WebRTC backend \u2014 it was probably stripped by a --no-optional install). Install werift (`npm i werift`) and retry.')}return t("@urun-sh/core")});function xe(e){try{Promise.resolve(e.close?.()).catch(()=>{})}catch{}}var k=class{constructor(t,n,s){this.open=t;this.env=n;this.fnName=s}open;env;fnName;pool=new Map;acquire(t){let n=this.pool.get(t);if(!n){let s=Promise.resolve(this.open(this.env,t,this.fnName)).then(r=>({session:r,responses:new R(r)}));n=s,this.pool.set(t,s),s.catch(()=>{this.pool.get(t)===s&&this.pool.delete(t)})}return n}evict(t){let n=this.pool.get(t);n&&(this.pool.delete(t),n.then(s=>xe(s.session),()=>{}))}closeAll(){for(let t of[...this.pool.keys()])this.evict(t)}};function V(e){let t=[];e.systemPrompt&&t.push({role:"system",content:e.systemPrompt});for(let n of e.messages){let s=n.role==="assistant"?"assistant":"user";t.push({role:s,content:Re(n.content)})}return Z(t)}function Z(e){let t=[];for(let n of e){let s=t[t.length-1];s&&s.role===n.role?s.content=[s.content,n.content].filter(r=>r.length>0).join(`
2
2
 
3
- `):e.push({...n})}return e}function Re(t){return typeof t=="string"?t:Array.isArray(t)?t.map(e=>e&&typeof e=="object"&&"text"in e?String(e.text):"").join(""):""}function xe(t){let e=t instanceof Error?t.message:String(t),n=t?.code;return/\b529\b/.test(e)||/overloaded/i.test(e)||n===529||n==="529"}function Ue(t){return new Promise(e=>setTimeout(e,t))}function Se(t,e,n,s){return new Promise((r,o)=>{let a=!1,l=i=>{a||(a=!0,clearTimeout(m),s?.removeEventListener("abort",p),i())},m=setTimeout(()=>l(()=>o(n())),e),p=()=>l(()=>o(new Error("aborted")));if(s?.aborted){p();return}s?.addEventListener("abort",p,{once:!0}),Promise.resolve(t).then(i=>l(()=>r(i)),i=>l(()=>o(i)))})}async function*ke(t,e){let n=t[Symbol.asyncIterator](),s,r=new Promise((o,a)=>{s=()=>a(new Error("aborted")),e.addEventListener("abort",s,{once:!0})});try{for(;;){if(e.aborted)throw new Error("aborted");let o=await Promise.race([n.next(),r]);if(o.done)return;yield o.value}}finally{s&&e.removeEventListener("abort",s),n.return?.(void 0)}}function Te(t,e){let n=t?.sendMessage;if(typeof n=="function")try{n.call(t,{customType:"urun-status",content:e,display:!0},{triggerTurn:!1})}catch{}}function Z(t,e={},n){let s=e.connectDeadlineMs??we,r=e.stallTimeoutMs??ve,o=e.phaseHeartbeatMs??_e;return(a,l,m)=>{let p=(0,X.createAssistantMessageEventStream)(),i={role:"assistant",content:[{type:"text",text:""}],api:a.api,provider:a.provider,model:a.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"stop",timestamp:Date.now()},y=i.content[0],u=new AbortController,c=m?.signal,S=!1,k=()=>{S=!0,u.abort()};c&&(c.aborted?k():c.addEventListener("abort",k,{once:!0}));let T=!1,h,C=()=>{h&&clearTimeout(h),h=setTimeout(()=>{T=!0,u.abort()},r)},P=()=>{h&&clearTimeout(h),h=void 0};return(async()=>{p.push({type:"start",partial:i}),p.push({type:"text_start",contentIndex:0,partial:i});let N=!1,_,D=()=>{_&&clearInterval(_),_=void 0},te=Date.now();_=setInterval(()=>{let f=Math.round((Date.now()-te)/1e3);Te(n,`uRun: still opening the "${a.id}" session\u2026 (${f}s \u2014 serve apps scale to zero, first turn can cold-start ~6min)`)},o);try{let{responses:f}=await Se(t.acquire(a.id),s,()=>new Error(`uRun session for "${a.id}" did not connect within ${Math.round(s/1e3)}s \u2014 likely cold-starting (scaled to zero) or queued behind capacity. Retry shortly.`),u.signal);D();let I=Q(l),O,b;for(let A=1;A<=H;A++)try{let w=await f.responses.create({model:a.id,input:I,stream:!0,max_output_tokens:a.maxTokens});C();for await(let ne of ke(w,u.signal)){C();let g=ne;if(g.type==="response.output_text.delta"){let v=typeof g.delta=="string"?g.delta:"";v&&(y.text+=v,p.push({type:"text_delta",contentIndex:0,delta:v,partial:i}))}else if(g.type==="response.completed"){O=g.response;break}else if(g.type==="error"){let v=g.error,F=new Error(`uRun serve error: ${v?.message??"unknown error"}`);throw F.code=v?.code??null,F}}b=void 0;break}catch(w){if(b=w,u.signal.aborted)throw w;if(A<H&&xe(w)&&y.text.length===0){await Ue(A*500);continue}throw w}if(b)throw b;P(),p.push({type:"text_end",contentIndex:0,content:y.text,partial:i});let j=O?.status==="incomplete"?"length":"stop";i.stopReason=j,p.push({type:"done",reason:j,message:i}),p.end(i)}catch(f){if(N=!0,P(),S||c?.aborted&&!T)i.stopReason="aborted",i.errorMessage="aborted by user",p.push({type:"error",reason:"aborted",error:i});else{let I=T?`uRun stream stalled \u2014 no output for ${Math.round(r/1e3)}s; the model may be hung. Retry, or Ctrl-C to abort.`:f instanceof Error?f.message:String(f);i.stopReason="error",i.errorMessage=I,p.push({type:"error",reason:"error",error:i})}p.end(i)}finally{P(),D(),c&&c.removeEventListener("abort",k),N&&t.evict(a.id)}})(),p}}function Pe(t){return{id:t,name:`uRun ${t}`,api:M,reasoning:!1,input:["text"],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:ye,maxTokens:he}}function ee(t={}){return async e=>{let n=t.env??process.env,{apiKey:s,apiUrl:r,fnName:o}=be(n),a=await Y({apiUrl:r,apiKey:s,fnName:o,fetchImpl:t.fetchImpl}),l=new U(t.openSession??Ae,n,o);e.on("session_shutdown",()=>l.closeAll());let m={name:"uRun",api:M,baseUrl:"urun://session",apiKey:"$URUN_API_KEY",models:a.map(Pe),streamSimple:Z(l,t.timing??{},e)};e.registerProvider("urun",m)}}var Ie=ee();0&&(module.exports={SessionPool,URUN_API,coalesceSameRole,createUrunExtension,makeStreamSimple,resolveSessionEnv,toResponsesInput});
3
+ `):t.push({...n})}return t}function Re(e){return typeof e=="string"?e:Array.isArray(e)?e.map(t=>t&&typeof t=="object"&&"text"in t?String(t.text):"").join(""):""}function ke(e){let t=e instanceof Error?e.message:String(e),n=e?.code;return/\b529\b/.test(t)||/overloaded/i.test(t)||n===529||n==="529"}function Se(e){return new Promise(t=>setTimeout(t,e))}function Ue(e,t,n,s){return new Promise((r,o)=>{let a=!1,u=i=>{a||(a=!0,clearTimeout(d),s?.removeEventListener("abort",p),i())},d=setTimeout(()=>u(()=>o(n())),t),p=()=>u(()=>o(new Error("aborted")));if(s?.aborted){p();return}s?.addEventListener("abort",p,{once:!0}),Promise.resolve(e).then(i=>u(()=>r(i)),i=>u(()=>o(i)))})}async function*Pe(e,t){let n=e[Symbol.asyncIterator](),s,r=new Promise((o,a)=>{s=()=>a(new Error("aborted")),t.addEventListener("abort",s,{once:!0})});try{for(;;){if(t.aborted)throw new Error("aborted");let o=await Promise.race([n.next(),r]);if(o.done)return;yield o.value}}finally{s&&t.removeEventListener("abort",s),n.return?.(void 0)}}function Te(e,t){let n=e?.sendMessage;if(typeof n=="function")try{n.call(e,{customType:"urun-status",content:t,display:!0},{triggerTurn:!1})}catch{}}function ee(e,t={},n){let s=t.connectDeadlineMs??ve,r=t.stallTimeoutMs??_e,o=t.phaseHeartbeatMs??be;return(a,u,d)=>{let p=(0,X.createAssistantMessageEventStream)(),i={role:"assistant",content:[{type:"text",text:""}],api:a.api,provider:a.provider,model:a.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"stop",timestamp:Date.now()},m=i.content[0],c=new AbortController,f=d?.signal,$=!1,S=()=>{$=!0,c.abort()};f&&(f.aborted?S():f.addEventListener("abort",S,{once:!0}));let U=!1,h,N=()=>{h&&clearTimeout(h),h=setTimeout(()=>{U=!0,c.abort()},r)},P=()=>{h&&clearTimeout(h),h=void 0};return(async()=>{p.push({type:"start",partial:i}),p.push({type:"text_start",contentIndex:0,partial:i});let C=!1,_,D=()=>{_&&clearInterval(_),_=void 0},ne=Date.now();_=setInterval(()=>{let g=Math.round((Date.now()-ne)/1e3);Te(n,`uRun: still opening the "${a.id}" session\u2026 (${g}s \u2014 serve apps scale to zero, first turn can cold-start ~6min)`)},o);try{let{responses:g}=await Ue(e.acquire(a.id),s,()=>new Error(`uRun session for "${a.id}" did not connect within ${Math.round(s/1e3)}s \u2014 likely cold-starting (scaled to zero) or queued behind capacity. Retry shortly.`),c.signal);D();let T=V(u),O,b;for(let A=1;A<=H;A++)try{let w=await g.responses.create({model:a.id,input:T,stream:!0,max_output_tokens:a.maxTokens});N();for await(let se of Pe(w,c.signal)){N();let y=se;if(y.type==="response.output_text.delta"){let v=typeof y.delta=="string"?y.delta:"";v&&(m.text+=v,p.push({type:"text_delta",contentIndex:0,delta:v,partial:i}))}else if(y.type==="response.completed"){O=y.response;break}else if(y.type==="error"){let v=y.error,F=new Error(`uRun serve error: ${v?.message??"unknown error"}`);throw F.code=v?.code??null,F}}b=void 0;break}catch(w){if(b=w,c.signal.aborted)throw w;if(A<H&&ke(w)&&m.text.length===0){await Se(A*500);continue}throw w}if(b)throw b;P(),p.push({type:"text_end",contentIndex:0,content:m.text,partial:i});let j=O?.status==="incomplete"?"length":"stop";i.stopReason=j,p.push({type:"done",reason:j,message:i}),p.end(i)}catch(g){if(C=!0,P(),$||f?.aborted&&!U)i.stopReason="aborted",i.errorMessage="aborted by user",p.push({type:"error",reason:"aborted",error:i});else{let T=U?`uRun stream stalled \u2014 no output for ${Math.round(r/1e3)}s; the model may be hung. Retry, or Ctrl-C to abort.`:g instanceof Error?g.message:String(g);i.stopReason="error",i.errorMessage=T,p.push({type:"error",reason:"error",error:i})}p.end(i)}finally{P(),D(),f&&f.removeEventListener("abort",S),C&&e.evict(a.id)}})(),p}}function Ie(e){return{id:e,name:`uRun ${e}`,api:M,reasoning:!1,input:["text"],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:he,maxTokens:we}}function te(e={}){return async t=>{let n=e.env??process.env,{apiKey:s,apiUrl:r,fnName:o}=Ae(n),a=await Y({apiUrl:r,apiKey:s,fnName:o,fetchImpl:e.fetchImpl}),u=new k(e.openSession??Ee,n,o);t.on("session_shutdown",()=>u.closeAll());let d={name:"uRun",api:M,baseUrl:"urun://session",apiKey:"$URUN_API_KEY",models:a.map(Ie),streamSimple:ee(u,e.timing??{},t)};t.registerProvider("urun",d)}}var Le=te();0&&(module.exports={SessionPool,URUN_API,coalesceSameRole,createUrunExtension,makeSessionFactory,makeStreamSimple,resolveSessionEnv,toResponsesInput});
@@ -117,6 +117,39 @@ declare function resolveSessionEnv(env: NodeJS.ProcessEnv): {
117
117
  interface SessionFactory {
118
118
  (env: NodeJS.ProcessEnv, appSlug: string, fnName: string): Promise<UrunSessionLike> | UrunSessionLike;
119
119
  }
120
+ /**
121
+ * The subset of `@urun-sh/core` a session factory needs — typed locally so
122
+ * core stays OUT of this module's static import graph (the npm lane resolves
123
+ * it at runtime; only the standalone bundle imports it statically).
124
+ */
125
+ interface CoreModuleLike {
126
+ App: (id: string, opts: {
127
+ baseUrl: string;
128
+ orgId: string;
129
+ jwt?: string;
130
+ getAccessToken?: () => Promise<string>;
131
+ }) => Record<string, (args?: Record<string, unknown>) => UrunSessionLike>;
132
+ createClientToken: (apiKey: string, opts: {
133
+ baseUrl?: string;
134
+ expiresIn: number;
135
+ allowedFunctions: string[];
136
+ }) => Promise<{
137
+ token: string;
138
+ }>;
139
+ }
140
+ /**
141
+ * Build a {@link SessionFactory} over one way of loading `@urun-sh/core` —
142
+ * the ONE session-opening implementation (the compat proxy's two auth lanes:
143
+ * URUN_JWT explicit override > URUN_API_KEY vending a scoped client token),
144
+ * shared by both entry lanes:
145
+ *
146
+ * - npm lane ({@link defaultSessionFactory}): runtime createRequire + the
147
+ * werift preflight, resolving core from the consumer's node_modules;
148
+ * - standalone lane (standalone-entry.ts): a STATIC core import, so the
149
+ * self-contained bundle INLINES core (and, through core's own dynamic
150
+ * werift import, the WebRTC backend) — that lane has no node_modules.
151
+ */
152
+ declare function makeSessionFactory(loadCore: () => Promise<CoreModuleLike> | CoreModuleLike): SessionFactory;
120
153
  /** One pooled backhaul: the session plus its Responses client (cli.ts shape). */
121
154
  interface PoolEntry {
122
155
  session: UrunSessionLike;
@@ -186,4 +219,4 @@ declare function createUrunExtension(opts?: UrunExtensionOptions): (pi: Extensio
186
219
  /** The pi extension factory (default export — what pi's loader invokes). */
187
220
  declare const _default: (pi: ExtensionAPI) => Promise<void>;
188
221
 
189
- export { type ResponsesInputItem, type SessionFactory, SessionPool, type StreamTiming, URUN_API, type UrunExtensionOptions, coalesceSameRole, createUrunExtension, _default as default, makeStreamSimple, resolveSessionEnv, toResponsesInput };
222
+ export { type CoreModuleLike, type ResponsesInputItem, type SessionFactory, SessionPool, type StreamTiming, URUN_API, type UrunExtensionOptions, coalesceSameRole, createUrunExtension, _default as default, makeSessionFactory, makeStreamSimple, resolveSessionEnv, toResponsesInput };
@@ -21,6 +21,24 @@ interface SessionFactory {
21
21
  (env: NodeJS.ProcessEnv, appSlug: string, fnName: string): Promise<UrunSessionLike> | UrunSessionLike;
22
22
  }
23
23
 
24
+ interface CoreModuleLike {
25
+ App: (id: string, opts: {
26
+ baseUrl: string;
27
+ orgId: string;
28
+ jwt?: string;
29
+ getAccessToken?: () => Promise<string>;
30
+ }) => Record<string, (args?: Record<string, unknown>) => UrunSessionLike>;
31
+ createClientToken: (apiKey: string, opts: {
32
+ baseUrl?: string;
33
+ expiresIn: number;
34
+ allowedFunctions: string[];
35
+ }) => Promise<{
36
+ token: string;
37
+ }>;
38
+ }
39
+
40
+ declare function makeSessionFactory(loadCore: () => Promise<CoreModuleLike> | CoreModuleLike): SessionFactory;
41
+
24
42
  interface PoolEntry {
25
43
  session: UrunSessionLike;
26
44
  responses: UrunResponses;
@@ -67,4 +85,4 @@ declare function createUrunExtension(opts?: UrunExtensionOptions): (pi: Extensio
67
85
 
68
86
  declare const _default: (pi: ExtensionAPI) => Promise<void>;
69
87
 
70
- export { type ResponsesInputItem, type SessionFactory, SessionPool, type StreamTiming, URUN_API, type UrunExtensionOptions, coalesceSameRole, createUrunExtension, _default as default, makeStreamSimple, resolveSessionEnv, toResponsesInput };
88
+ export { type CoreModuleLike, type ResponsesInputItem, type SessionFactory, SessionPool, type StreamTiming, URUN_API, type UrunExtensionOptions, coalesceSameRole, createUrunExtension, _default as default, makeSessionFactory, makeStreamSimple, resolveSessionEnv, toResponsesInput };
@@ -1,3 +1,3 @@
1
- import{c as L}from"../chunk-FSS2A7IU.js";import{a as x,c as D}from"../chunk-PS4BLX7J.js";import{createAssistantMessageEventStream as J}from"@earendil-works/pi-ai";async function $(t){let e=await D(t),n=e.filter(o=>o.function_name===t.fnName&&o.deployment_status==="active").map(o=>o.app_slug);if(n.length===0)throw new Error(`urun pi extension: the org has no active deployed app exposing "${t.fnName}" (GET ${t.apiUrl}/apps returned ${e.length} app(s), none servable) \u2014 deploy one with \`urun serve <model>\` first`);return n.sort()}var O="urun-serve",G="serve",H=131072,Y=16384,F=3,B=42e4,X=6e4,z=15e3;function Q(t){let e=(t.URUN_API_KEY??"").trim();if(!e)throw new Error("urun pi extension: URUN_API_KEY is required \u2014 model discovery lists the org's deployed serve apps via the org API (URUN_JWT alone cannot list apps)");return{apiKey:e,apiUrl:(t.URUN_API_URL??"").trim()||x,fnName:(t.URUN_FUNCTION??"").trim()||G}}function V(t){let e=(t.URUN_BASE_URL??"").trim(),n=(t.URUN_ORG_ID??"").trim();if(!e)throw new Error("urun pi extension: URUN_BASE_URL is required to open a session");if(/\/v1\/*$/.test(new URL(e).pathname))throw new Error(`urun pi extension: URUN_BASE_URL must be the session-gateway base (e.g. https://api.urun.sh), got ${e} \u2014 a trailing /v1 is the org API form (URUN_API_URL); session allocation 404s against it. Drop the /v1.`);if(!n)throw new Error("urun pi extension: URUN_ORG_ID is required to open a session");let o=(t.URUN_JWT??"").trim();if(o)return{baseUrl:e,orgId:n,auth:{lane:"jwt",jwt:o}};let s=(t.URUN_API_KEY??"").trim();if(!s)throw new Error("urun pi extension: URUN_JWT or URUN_API_KEY is required to open a session");let i=(t.URUN_GATEWAY_URL??"").trim()||void 0;return{baseUrl:e,orgId:n,auth:{lane:"api-key",apiKey:s,gatewayUrl:i}}}var Z=async(t,e,n)=>{let{baseUrl:o,orgId:s,auth:i}=V(t),{createRequire:a}=await import("module"),p=a(import.meta.url);if(typeof globalThis.RTCPeerConnection>"u")try{p.resolve("werift")}catch{throw new Error('urun pi extension: token streams require a WebRTC data channel, and this Node runtime has no RTCPeerConnection and no "werift" backend installed (@urun-sh/core\'s optional Node WebRTC backend \u2014 it was probably stripped by a --no-optional install). Install werift (`npm i werift`) and retry.')}let{App:d,createClientToken:c}=p("@urun-sh/core"),g=(i.lane==="jwt"?d(e,{baseUrl:o,orgId:s,jwt:i.jwt}):d(e,{baseUrl:o,orgId:s,getAccessToken:async()=>(await c(i.apiKey,{baseUrl:i.gatewayUrl,expiresIn:300,allowedFunctions:[`${e}/${n}`]})).token}))[n];if(typeof g!="function")throw new Error(`urun pi extension: app "${e}" has no function "${n}"`);let u=g(),l=u.connect;return typeof l=="function"&&await l.call(u),u};function ee(t){try{Promise.resolve(t.close?.()).catch(()=>{})}catch{}}var P=class{constructor(e,n,o){this.open=e;this.env=n;this.fnName=o}open;env;fnName;pool=new Map;acquire(e){let n=this.pool.get(e);if(!n){let o=Promise.resolve(this.open(this.env,e,this.fnName)).then(s=>({session:s,responses:new L(s)}));n=o,this.pool.set(e,o),o.catch(()=>{this.pool.get(e)===o&&this.pool.delete(e)})}return n}evict(e){let n=this.pool.get(e);n&&(this.pool.delete(e),n.then(o=>ee(o.session),()=>{}))}closeAll(){for(let e of[...this.pool.keys()])this.evict(e)}};function te(t){let e=[];t.systemPrompt&&e.push({role:"system",content:t.systemPrompt});for(let n of t.messages){let o=n.role==="assistant"?"assistant":"user";e.push({role:o,content:oe(n.content)})}return ne(e)}function ne(t){let e=[];for(let n of t){let o=e[e.length-1];o&&o.role===n.role?o.content=[o.content,n.content].filter(s=>s.length>0).join(`
1
+ import{c as C}from"../chunk-FSS2A7IU.js";import{a as A,c as D}from"../chunk-PS4BLX7J.js";import{createAssistantMessageEventStream as J}from"@earendil-works/pi-ai";async function F(t){let e=await D(t),n=e.filter(o=>o.function_name===t.fnName&&o.deployment_status==="active").map(o=>o.app_slug);if(n.length===0)throw new Error(`urun pi extension: the org has no active deployed app exposing "${t.fnName}" (GET ${t.apiUrl}/apps returned ${e.length} app(s), none servable) \u2014 deploy one with \`urun serve <model>\` first`);return n.sort()}var O="urun-serve",G="serve",H=131072,Y=16384,$=3,B=42e4,X=6e4,z=15e3;function Q(t){let e=(t.URUN_API_KEY??"").trim();if(!e)throw new Error("urun pi extension: URUN_API_KEY is required \u2014 model discovery lists the org's deployed serve apps via the org API (URUN_JWT alone cannot list apps)");return{apiKey:e,apiUrl:(t.URUN_API_URL??"").trim()||A,fnName:(t.URUN_FUNCTION??"").trim()||G}}function V(t){let e=(t.URUN_BASE_URL??"").trim(),n=(t.URUN_ORG_ID??"").trim();if(!e)throw new Error("urun pi extension: URUN_BASE_URL is required to open a session");if(/\/v1\/*$/.test(new URL(e).pathname))throw new Error(`urun pi extension: URUN_BASE_URL must be the session-gateway base (e.g. https://api.urun.sh), got ${e} \u2014 a trailing /v1 is the org API form (URUN_API_URL); session allocation 404s against it. Drop the /v1.`);if(!n)throw new Error("urun pi extension: URUN_ORG_ID is required to open a session");let o=(t.URUN_JWT??"").trim();if(o)return{baseUrl:e,orgId:n,auth:{lane:"jwt",jwt:o}};let i=(t.URUN_API_KEY??"").trim();if(!i)throw new Error("urun pi extension: URUN_JWT or URUN_API_KEY is required to open a session");let a=(t.URUN_GATEWAY_URL??"").trim()||void 0;return{baseUrl:e,orgId:n,auth:{lane:"api-key",apiKey:i,gatewayUrl:a}}}function Z(t){return async(e,n,o)=>{let{baseUrl:i,orgId:a,auth:s}=V(e),{App:u,createClientToken:l}=await t(),r=(s.lane==="jwt"?u(n,{baseUrl:i,orgId:a,jwt:s.jwt}):u(n,{baseUrl:i,orgId:a,getAccessToken:async()=>(await l(s.apiKey,{baseUrl:s.gatewayUrl,expiresIn:300,allowedFunctions:[`${n}/${o}`]})).token}))[o];if(typeof r!="function")throw new Error(`urun pi extension: app "${n}" has no function "${o}"`);let d=r(),p=d.connect;return typeof p=="function"&&await p.call(d),d}}var ee=Z(async()=>{let{createRequire:t}=await import("module"),e=t(import.meta.url);if(typeof globalThis.RTCPeerConnection>"u")try{e.resolve("werift")}catch{throw new Error('urun pi extension: token streams require a WebRTC data channel, and this Node runtime has no RTCPeerConnection and no "werift" backend installed (@urun-sh/core\'s optional Node WebRTC backend \u2014 it was probably stripped by a --no-optional install). Install werift (`npm i werift`) and retry.')}return e("@urun-sh/core")});function te(t){try{Promise.resolve(t.close?.()).catch(()=>{})}catch{}}var x=class{constructor(e,n,o){this.open=e;this.env=n;this.fnName=o}open;env;fnName;pool=new Map;acquire(e){let n=this.pool.get(e);if(!n){let o=Promise.resolve(this.open(this.env,e,this.fnName)).then(i=>({session:i,responses:new C(i)}));n=o,this.pool.set(e,o),o.catch(()=>{this.pool.get(e)===o&&this.pool.delete(e)})}return n}evict(e){let n=this.pool.get(e);n&&(this.pool.delete(e),n.then(o=>te(o.session),()=>{}))}closeAll(){for(let e of[...this.pool.keys()])this.evict(e)}};function ne(t){let e=[];t.systemPrompt&&e.push({role:"system",content:t.systemPrompt});for(let n of t.messages){let o=n.role==="assistant"?"assistant":"user";e.push({role:o,content:re(n.content)})}return oe(e)}function oe(t){let e=[];for(let n of t){let o=e[e.length-1];o&&o.role===n.role?o.content=[o.content,n.content].filter(i=>i.length>0).join(`
2
2
 
3
- `):e.push({...n})}return e}function oe(t){return typeof t=="string"?t:Array.isArray(t)?t.map(e=>e&&typeof e=="object"&&"text"in e?String(e.text):"").join(""):""}function re(t){let e=t instanceof Error?t.message:String(t),n=t?.code;return/\b529\b/.test(e)||/overloaded/i.test(e)||n===529||n==="529"}function se(t){return new Promise(e=>setTimeout(e,t))}function ie(t,e,n,o){return new Promise((s,i)=>{let a=!1,p=r=>{a||(a=!0,clearTimeout(d),o?.removeEventListener("abort",c),r())},d=setTimeout(()=>p(()=>i(n())),e),c=()=>p(()=>i(new Error("aborted")));if(o?.aborted){c();return}o?.addEventListener("abort",c,{once:!0}),Promise.resolve(t).then(r=>p(()=>s(r)),r=>p(()=>i(r)))})}async function*ae(t,e){let n=t[Symbol.asyncIterator](),o,s=new Promise((i,a)=>{o=()=>a(new Error("aborted")),e.addEventListener("abort",o,{once:!0})});try{for(;;){if(e.aborted)throw new Error("aborted");let i=await Promise.race([n.next(),s]);if(i.done)return;yield i.value}}finally{o&&e.removeEventListener("abort",o),n.return?.(void 0)}}function ce(t,e){let n=t?.sendMessage;if(typeof n=="function")try{n.call(t,{customType:"urun-status",content:e,display:!0},{triggerTurn:!1})}catch{}}function pe(t,e={},n){let o=e.connectDeadlineMs??B,s=e.stallTimeoutMs??X,i=e.phaseHeartbeatMs??z;return(a,p,d)=>{let c=J(),r={role:"assistant",content:[{type:"text",text:""}],api:a.api,provider:a.provider,model:a.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"stop",timestamp:Date.now()},g=r.content[0],u=new AbortController,l=d?.signal,b=!1,E=()=>{b=!0,u.abort()};l&&(l.aborted?E():l.addEventListener("abort",E,{once:!0}));let T=!1,y,I=()=>{y&&clearTimeout(y),y=setTimeout(()=>{T=!0,u.abort()},s)},A=()=>{y&&clearTimeout(y),y=void 0};return(async()=>{c.push({type:"start",partial:r}),c.push({type:"text_start",contentIndex:0,partial:r});let S=!1,v,k=()=>{v&&clearInterval(v),v=void 0},K=Date.now();v=setInterval(()=>{let m=Math.round((Date.now()-K)/1e3);ce(n,`uRun: still opening the "${a.id}" session\u2026 (${m}s \u2014 serve apps scale to zero, first turn can cold-start ~6min)`)},i);try{let{responses:m}=await ie(t.acquire(a.id),o,()=>new Error(`uRun session for "${a.id}" did not connect within ${Math.round(o/1e3)}s \u2014 likely cold-starting (scaled to zero) or queued behind capacity. Retry shortly.`),u.signal);k();let _=te(p),N,U;for(let R=1;R<=F;R++)try{let h=await m.responses.create({model:a.id,input:_,stream:!0,max_output_tokens:a.maxTokens});I();for await(let W of ae(h,u.signal)){I();let f=W;if(f.type==="response.output_text.delta"){let w=typeof f.delta=="string"?f.delta:"";w&&(g.text+=w,c.push({type:"text_delta",contentIndex:0,delta:w,partial:r}))}else if(f.type==="response.completed"){N=f.response;break}else if(f.type==="error"){let w=f.error,C=new Error(`uRun serve error: ${w?.message??"unknown error"}`);throw C.code=w?.code??null,C}}U=void 0;break}catch(h){if(U=h,u.signal.aborted)throw h;if(R<F&&re(h)&&g.text.length===0){await se(R*500);continue}throw h}if(U)throw U;A(),c.push({type:"text_end",contentIndex:0,content:g.text,partial:r});let M=N?.status==="incomplete"?"length":"stop";r.stopReason=M,c.push({type:"done",reason:M,message:r}),c.end(r)}catch(m){if(S=!0,A(),b||l?.aborted&&!T)r.stopReason="aborted",r.errorMessage="aborted by user",c.push({type:"error",reason:"aborted",error:r});else{let _=T?`uRun stream stalled \u2014 no output for ${Math.round(s/1e3)}s; the model may be hung. Retry, or Ctrl-C to abort.`:m instanceof Error?m.message:String(m);r.stopReason="error",r.errorMessage=_,c.push({type:"error",reason:"error",error:r})}c.end(r)}finally{A(),k(),l&&l.removeEventListener("abort",E),S&&t.evict(a.id)}})(),c}}function ue(t){return{id:t,name:`uRun ${t}`,api:O,reasoning:!1,input:["text"],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:H,maxTokens:Y}}function le(t={}){return async e=>{let n=t.env??process.env,{apiKey:o,apiUrl:s,fnName:i}=Q(n),a=await $({apiUrl:s,apiKey:o,fnName:i,fetchImpl:t.fetchImpl}),p=new P(t.openSession??Z,n,i);e.on("session_shutdown",()=>p.closeAll());let d={name:"uRun",api:O,baseUrl:"urun://session",apiKey:"$URUN_API_KEY",models:a.map(ue),streamSimple:pe(p,t.timing??{},e)};e.registerProvider("urun",d)}}var ve=le();export{P as SessionPool,O as URUN_API,ne as coalesceSameRole,le as createUrunExtension,ve as default,pe as makeStreamSimple,V as resolveSessionEnv,te as toResponsesInput};
3
+ `):e.push({...n})}return e}function re(t){return typeof t=="string"?t:Array.isArray(t)?t.map(e=>e&&typeof e=="object"&&"text"in e?String(e.text):"").join(""):""}function se(t){let e=t instanceof Error?t.message:String(t),n=t?.code;return/\b529\b/.test(e)||/overloaded/i.test(e)||n===529||n==="529"}function ie(t){return new Promise(e=>setTimeout(e,t))}function ae(t,e,n,o){return new Promise((i,a)=>{let s=!1,u=r=>{s||(s=!0,clearTimeout(l),o?.removeEventListener("abort",c),r())},l=setTimeout(()=>u(()=>a(n())),e),c=()=>u(()=>a(new Error("aborted")));if(o?.aborted){c();return}o?.addEventListener("abort",c,{once:!0}),Promise.resolve(t).then(r=>u(()=>i(r)),r=>u(()=>a(r)))})}async function*ce(t,e){let n=t[Symbol.asyncIterator](),o,i=new Promise((a,s)=>{o=()=>s(new Error("aborted")),e.addEventListener("abort",o,{once:!0})});try{for(;;){if(e.aborted)throw new Error("aborted");let a=await Promise.race([n.next(),i]);if(a.done)return;yield a.value}}finally{o&&e.removeEventListener("abort",o),n.return?.(void 0)}}function ue(t,e){let n=t?.sendMessage;if(typeof n=="function")try{n.call(t,{customType:"urun-status",content:e,display:!0},{triggerTurn:!1})}catch{}}function pe(t,e={},n){let o=e.connectDeadlineMs??B,i=e.stallTimeoutMs??X,a=e.phaseHeartbeatMs??z;return(s,u,l)=>{let c=J(),r={role:"assistant",content:[{type:"text",text:""}],api:s.api,provider:s.provider,model:s.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"stop",timestamp:Date.now()},d=r.content[0],p=new AbortController,m=l?.signal,P=!1,b=()=>{P=!0,p.abort()};m&&(m.aborted?b():m.addEventListener("abort",b,{once:!0}));let E=!1,y,I=()=>{y&&clearTimeout(y),y=setTimeout(()=>{E=!0,p.abort()},i)},_=()=>{y&&clearTimeout(y),y=void 0};return(async()=>{c.push({type:"start",partial:r}),c.push({type:"text_start",contentIndex:0,partial:r});let k=!1,v,S=()=>{v&&clearInterval(v),v=void 0},K=Date.now();v=setInterval(()=>{let f=Math.round((Date.now()-K)/1e3);ue(n,`uRun: still opening the "${s.id}" session\u2026 (${f}s \u2014 serve apps scale to zero, first turn can cold-start ~6min)`)},a);try{let{responses:f}=await ae(t.acquire(s.id),o,()=>new Error(`uRun session for "${s.id}" did not connect within ${Math.round(o/1e3)}s \u2014 likely cold-starting (scaled to zero) or queued behind capacity. Retry shortly.`),p.signal);S();let T=ne(u),N,U;for(let R=1;R<=$;R++)try{let h=await f.responses.create({model:s.id,input:T,stream:!0,max_output_tokens:s.maxTokens});I();for await(let W of ce(h,p.signal)){I();let g=W;if(g.type==="response.output_text.delta"){let w=typeof g.delta=="string"?g.delta:"";w&&(d.text+=w,c.push({type:"text_delta",contentIndex:0,delta:w,partial:r}))}else if(g.type==="response.completed"){N=g.response;break}else if(g.type==="error"){let w=g.error,L=new Error(`uRun serve error: ${w?.message??"unknown error"}`);throw L.code=w?.code??null,L}}U=void 0;break}catch(h){if(U=h,p.signal.aborted)throw h;if(R<$&&se(h)&&d.text.length===0){await ie(R*500);continue}throw h}if(U)throw U;_(),c.push({type:"text_end",contentIndex:0,content:d.text,partial:r});let M=N?.status==="incomplete"?"length":"stop";r.stopReason=M,c.push({type:"done",reason:M,message:r}),c.end(r)}catch(f){if(k=!0,_(),P||m?.aborted&&!E)r.stopReason="aborted",r.errorMessage="aborted by user",c.push({type:"error",reason:"aborted",error:r});else{let T=E?`uRun stream stalled \u2014 no output for ${Math.round(i/1e3)}s; the model may be hung. Retry, or Ctrl-C to abort.`:f instanceof Error?f.message:String(f);r.stopReason="error",r.errorMessage=T,c.push({type:"error",reason:"error",error:r})}c.end(r)}finally{_(),S(),m&&m.removeEventListener("abort",b),k&&t.evict(s.id)}})(),c}}function le(t){return{id:t,name:`uRun ${t}`,api:O,reasoning:!1,input:["text"],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:H,maxTokens:Y}}function de(t={}){return async e=>{let n=t.env??process.env,{apiKey:o,apiUrl:i,fnName:a}=Q(n),s=await F({apiUrl:i,apiKey:o,fnName:a,fetchImpl:t.fetchImpl}),u=new x(t.openSession??ee,n,a);e.on("session_shutdown",()=>u.closeAll());let l={name:"uRun",api:O,baseUrl:"urun://session",apiKey:"$URUN_API_KEY",models:s.map(le),streamSimple:pe(u,t.timing??{},e)};e.registerProvider("urun",l)}}var Ue=de();export{x as SessionPool,O as URUN_API,oe as coalesceSameRole,de as createUrunExtension,Ue as default,Z as makeSessionFactory,pe as makeStreamSimple,V as resolveSessionEnv,ne as toResponsesInput};